ZGlmZiAtLWdpdCBhL2J0YS9oZl9jbGllbnQvYnRhX2hmX2NsaWVudF9hY3QuYyBiL2J0YS9oZl9jbGllbnQvYnRhX2hmX2NsaWVudF9hY3QuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xMWZjODVjCi0tLSAvZGV2L251bGwKKysrIGIvYnRhL2hmX2NsaWVudC9idGFfaGZfY2xpZW50X2FjdC5jCkBAIC0wLDAgKzEsODc2IEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgorICogIENvcHlyaWdodCAoQykgMjAwMy0yMDEyIEJyb2FkY29tIENvcnBvcmF0aW9uCisgKgorICogIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQ6CisgKgorICogIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoKKyAqICBUaGlzIGZpbGUgY29udGFpbnMgYWN0aW9uIGZ1bmN0aW9ucyBmb3IgdGhlIGF1ZGlvIGdhdGV3YXkuCisgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworI2luY2x1ZGUgImJ0YV9hcGkuaCIKKyNpbmNsdWRlICJiZC5oIgorI2luY2x1ZGUgImJ0YV9zeXMuaCIKKyNpbmNsdWRlICJidGFfYWdfYXBpLmgiCisjaW5jbHVkZSAiYnRhX2FnX2NvLmgiCisjaW5jbHVkZSAiYnRhX2FnX2ludC5oIgorI2luY2x1ZGUgInBvcnRfYXBpLmgiCisjaW5jbHVkZSAidXRsLmgiCisjaW5jbHVkZSA8c3RyaW5nLmg+CisjaW5jbHVkZSAiYnRhX2RtX2ludC5oIgorI2luY2x1ZGUgImwyY19hcGkuaCIKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisqKiAgQ29uc3RhbnRzCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworLyogbWF4aW11bSBsZW5ndGggb2YgZGF0YSB0byByZWFkIGZyb20gUkZDT01NICovCisjZGVmaW5lIEJUQV9BR19SRkNfUkVBRF9NQVggICAgIDUxMgorCisvKiBtYXhpbXVtIEFUIGNvbW1hbmQgbGVuZ3RoICovCisjZGVmaW5lIEJUQV9BR19DTURfTUFYICAgICAgICAgIDUxMgorCitjb25zdCBVSU5UMTYgYnRhX2FnX3V1aWRbQlRBX0FHX05VTV9JRFhdID0KK3sKKyAgICBVVUlEX1NFUlZDTEFTU19IRUFEU0VUX0FVRElPX0dBVEVXQVksCisgICAgVVVJRF9TRVJWQ0xBU1NfQUdfSEFORFNGUkVFCit9OworCitjb25zdCBVSU5UOCBidGFfYWdfc2VjX2lkW0JUQV9BR19OVU1fSURYXSA9Cit7CisgICAgQlRNX1NFQ19TRVJWSUNFX0hFQURTRVRfQUcsCisgICAgQlRNX1NFQ19TRVJWSUNFX0FHX0hBTkRTRlJFRQorfTsKKworY29uc3QgdEJUQV9TRVJWSUNFX0lEIGJ0YV9hZ19zdmNfaWRbQlRBX0FHX05VTV9JRFhdID0KK3sKKyAgICBCVEFfSFNQX1NFUlZJQ0VfSUQsCisgICAgQlRBX0hGUF9TRVJWSUNFX0lECit9OworCitjb25zdCB0QlRBX1NFUlZJQ0VfTUFTSyBidGFfYWdfc3ZjX21hc2tbQlRBX0FHX05VTV9JRFhdID0KK3sKKyAgICBCVEFfSFNQX1NFUlZJQ0VfTUFTSywKKyAgICBCVEFfSEZQX1NFUlZJQ0VfTUFTSworfTsKKwordHlwZWRlZiB2b2lkICgqdEJUQV9BR19BVENNRF9DQkFDSykodEJUQV9BR19TQ0IgKnBfc2NiLCBVSU5UMTYgY21kLCBVSU5UOCBhcmdfdHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNoYXIgKnBfYXJnLCBJTlQxNiBpbnRfYXJnKTsKKworY29uc3QgdEJUQV9BR19BVENNRF9DQkFDSyBidGFfYWdfYXRfY2JhY2tfdGJsW0JUQV9BR19OVU1fSURYXSA9Cit7CisgICAgYnRhX2FnX2F0X2hzcF9jYmFjaywKKyAgICBidGFfYWdfYXRfaGZwX2NiYWNrCit9OworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorKioKKyoqIEZ1bmN0aW9uICAgICAgICAgYnRhX2FnX2NiYWNrX29wZW4KKyoqCisqKiBEZXNjcmlwdGlvbiAgICAgIFNlbmQgb3BlbiBjYWxsYmFjayBldmVudCB0byBhcHBsaWNhdGlvbi4KKyoqCisqKgorKiogUmV0dXJucyAgICAgICAgICB2b2lkCisqKgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3N0YXRpYyB2b2lkIGJ0YV9hZ19jYmFja19vcGVuKHRCVEFfQUdfU0NCICpwX3NjYiwgdEJUQV9BR19EQVRBICpwX2RhdGEsIHRCVEFfQUdfU1RBVFVTIHN0YXR1cykKK3sKKyAgICB0QlRBX0FHX09QRU4gICAgb3BlbjsKKworICAgIC8qIGNhbGwgYXBwIGNhbGxiYWNrIHdpdGggb3BlbiBldmVudCAqLworICAgIG9wZW4uaGRyLmhhbmRsZSA9IGJ0YV9hZ19zY2JfdG9faWR4KHBfc2NiKTsKKyAgICBvcGVuLmhkci5hcHBfaWQgPSBwX3NjYi0+YXBwX2lkOworICAgIG9wZW4uc3RhdHVzID0gc3RhdHVzOworICAgIG9wZW4uc2VydmljZV9pZCA9IGJ0YV9hZ19zdmNfaWRbcF9zY2ItPmNvbm5fc2VydmljZV07CisgICAgaWYocF9kYXRhKQorICAgIHsKKyAgICAgICAgLyogaWYgcF9kYXRhIGlzIHByb3ZpZGVkIHRoZW4gd2UgbmVlZCB0byBwaWNrIHRoZSBiZCBhZGRyZXNzIGZyb20gdGhlIG9wZW4gYXBpIHN0cnVjdHVyZSAqLworICAgICAgICBiZGNweShvcGVuLmJkX2FkZHIsIHBfZGF0YS0+YXBpX29wZW4uYmRfYWRkcik7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgIGJkY3B5KG9wZW4uYmRfYWRkciwgcF9zY2ItPnBlZXJfYWRkcik7CisgICAgfQorCisgICAgKCpidGFfYWdfY2IucF9jYmFjaykoQlRBX0FHX09QRU5fRVZULCAodEJUQV9BRyAqKSAmb3Blbik7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisqKgorKiogRnVuY3Rpb24gICAgICAgICBidGFfYWdfcmVnaXN0ZXIKKyoqCisqKiBEZXNjcmlwdGlvbiAgICAgIFRoaXMgZnVuY3Rpb24gaW5pdGlhbGl6ZXMgdmFsdWVzIG9mIHRoZSBBRyBjYiBhbmQgc2V0cyB1cAorKiogICAgICAgICAgICAgICAgICB0aGUgU0RQIHJlY29yZCBmb3IgdGhlIHNlcnZpY2VzLgorKioKKyoqCisqKiBSZXR1cm5zICAgICAgICAgIHZvaWQKKyoqCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordm9pZCBidGFfYWdfcmVnaXN0ZXIodEJUQV9BR19TQ0IgKnBfc2NiLCB0QlRBX0FHX0RBVEEgKnBfZGF0YSkKK3sKKyAgICB0QlRBX0FHX1JFR0lTVEVSIHJlZzsKKworICAgIC8qIGluaXRpYWxpemUgY29udHJvbCBibG9jayAqLworICAgIHBfc2NiLT5yZWdfc2VydmljZXMgPSBwX2RhdGEtPmFwaV9yZWdpc3Rlci5zZXJ2aWNlczsKKyAgICBwX3NjYi0+c2Vydl9zZWNfbWFzayA9IHBfZGF0YS0+YXBpX3JlZ2lzdGVyLnNlY19tYXNrOworICAgIHBfc2NiLT5mZWF0dXJlcyA9IHBfZGF0YS0+YXBpX3JlZ2lzdGVyLmZlYXR1cmVzOworICAgIHBfc2NiLT5hcHBfaWQgPSBwX2RhdGEtPmFwaV9yZWdpc3Rlci5hcHBfaWQ7CisKKyAgICAvKiBjcmVhdGUgU0RQIHJlY29yZHMgKi8KKyAgICBidGFfYWdfY3JlYXRlX3JlY29yZHMocF9zY2IsIHBfZGF0YSk7CisKKyAgICAvKiBzdGFydCBSRkNPTU0gc2VydmVycyAqLworICAgIGJ0YV9hZ19zdGFydF9zZXJ2ZXJzKHBfc2NiLCBwX3NjYi0+cmVnX3NlcnZpY2VzKTsKKworICAgIC8qIGNhbGwgYXBwIGNhbGxiYWNrIHdpdGggcmVnaXN0ZXIgZXZlbnQgKi8KKyAgICByZWcuaGRyLmhhbmRsZSA9IGJ0YV9hZ19zY2JfdG9faWR4KHBfc2NiKTsKKyAgICByZWcuaGRyLmFwcF9pZCA9IHBfc2NiLT5hcHBfaWQ7CisgICAgcmVnLnN0YXR1cyA9IEJUQV9BR19TVUNDRVNTOworICAgICgqYnRhX2FnX2NiLnBfY2JhY2spKEJUQV9BR19SRUdJU1RFUl9FVlQsICh0QlRBX0FHICopICZyZWcpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorKioKKyoqIEZ1bmN0aW9uICAgICAgICAgYnRhX2FnX2RlcmVnaXN0ZXIKKyoqCisqKiBEZXNjcmlwdGlvbiAgICAgIFRoaXMgZnVuY3Rpb24gcmVtb3ZlcyB0aGUgc2RwIHJlY29yZHMsIGNsb3NlcyB0aGUgUkZDT01NCisqKiAgICAgICAgICAgICAgICAgIHNlcnZlcnMsIGFuZCBkZWFsbG9jYXRlcyB0aGUgc2VydmljZSBjb250cm9sIGJsb2NrLgorKioKKyoqCisqKiBSZXR1cm5zICAgICAgICAgIHZvaWQKKyoqCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordm9pZCBidGFfYWdfZGVyZWdpc3Rlcih0QlRBX0FHX1NDQiAqcF9zY2IsIHRCVEFfQUdfREFUQSAqcF9kYXRhKQoreworICAgIC8qIHNldCBkZWFsbG9jICovCisgICAgcF9zY2ItPmRlYWxsb2MgPSBUUlVFOworCisgICAgLyogcmVtb3ZlIHNkcCByZWNvcmRzICovCisgICAgYnRhX2FnX2RlbF9yZWNvcmRzKHBfc2NiLCBwX2RhdGEpOworCisgICAgLyogcmVtb3ZlIHJmY29tbSBzZXJ2ZXJzICovCisgICAgYnRhX2FnX2Nsb3NlX3NlcnZlcnMocF9zY2IsIHBfc2NiLT5yZWdfc2VydmljZXMpOworCisgICAgLyogZGVhbGxvYyAqLworICAgIGJ0YV9hZ19zY2JfZGVhbGxvYyhwX3NjYik7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisqKgorKiogRnVuY3Rpb24gICAgICAgICBidGFfYWdfc3RhcnRfZGVyZWcKKyoqCisqKiBEZXNjcmlwdGlvbiAgICAgIFN0YXJ0IGEgZGVyZWdpc3RlciBldmVudC4KKyoqCisqKgorKiogUmV0dXJucyAgICAgICAgICB2b2lkCisqKgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3ZvaWQgYnRhX2FnX3N0YXJ0X2RlcmVnKHRCVEFfQUdfU0NCICpwX3NjYiwgdEJUQV9BR19EQVRBICpwX2RhdGEpCit7CisgICAgLyogc2V0IGRlYWxsb2MgKi8KKyAgICBwX3NjYi0+ZGVhbGxvYyA9IFRSVUU7CisKKyAgICAvKiByZW1vdmUgc2RwIHJlY29yZHMgKi8KKyAgICBidGFfYWdfZGVsX3JlY29yZHMocF9zY2IsIHBfZGF0YSk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisqKgorKiogRnVuY3Rpb24gICAgICAgICBidGFfYWdfc3RhcnRfb3BlbgorKioKKyoqIERlc2NyaXB0aW9uICAgICAgVGhpcyBzdGFydHMgYW4gQUcgb3Blbi4KKyoqCisqKgorKiogUmV0dXJucyAgICAgICAgICB2b2lkCisqKgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3ZvaWQgYnRhX2FnX3N0YXJ0X29wZW4odEJUQV9BR19TQ0IgKnBfc2NiLCB0QlRBX0FHX0RBVEEgKnBfZGF0YSkKK3sKKyAgICBCRF9BRERSIHBlbmRpbmdfYmRfYWRkcjsKKworICAgIC8qIHN0b3JlIHBhcmFtZXRlcnMgKi8KKyAgICBpZiAocF9kYXRhKQorICAgIHsKKyAgICAgICAgYmRjcHkocF9zY2ItPnBlZXJfYWRkciwgcF9kYXRhLT5hcGlfb3Blbi5iZF9hZGRyKTsKKyAgICAgICAgcF9zY2ItPm9wZW5fc2VydmljZXMgPSBwX2RhdGEtPmFwaV9vcGVuLnNlcnZpY2VzOworICAgICAgICBwX3NjYi0+Y2xpX3NlY19tYXNrID0gcF9kYXRhLT5hcGlfb3Blbi5zZWNfbWFzazsKKyAgICB9CisKKyAgICAvKiBDaGVjayBpZiBSRkNPTU0gaGFzIGFueSBpbmNvbWluZyBjb25uZWN0aW9uIHRvIGF2b2lkIGNvbGxpc2lvbi4gKi8KKyAgICBpZiAoUE9SVF9Jc09wZW5pbmcgKHBlbmRpbmdfYmRfYWRkcikpCisgICAgeworICAgICAgICAvKiBMZXQgdGhlIGluY29taW5nIGNvbm5lY3Rpb24gZ29lcyB0aHJvdWdoLiAgICAgICAgICAgICAgICAgICAgICAgICovCisgICAgICAgIC8qIElzc3VlIGNvbGxpc2lvbiBmb3IgdGhpcyBzY2IgZm9yIG5vdy4gICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgICAgICAgLyogV2Ugd2lsbCBkZWNpZGUgd2hhdCB0byBkbyB3aGVuIHdlIGZpbmQgaW5jb21pbmcgY29ubmV0aW9uIGxhdGVyLiAqLworICAgICAgICBidGFfYWdfY29sbGlzaW9uX2NiYWNrICgwLCBCVEFfSURfQUcsIDAsIHBfc2NiLT5wZWVyX2FkZHIpOworICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgLyogY2xvc2Ugc2VydmVycyAqLworICAgIGJ0YV9hZ19jbG9zZV9zZXJ2ZXJzKHBfc2NiLCBwX3NjYi0+cmVnX3NlcnZpY2VzKTsKKworICAgIC8qIHNldCByb2xlICovCisgICAgcF9zY2ItPnJvbGUgPSBCVEFfQUdfSU5UOworCisgICAgLyogZG8gc2VydmljZSBzZWFyY2ggKi8KKyAgICBidGFfYWdfZG9fZGlzYyhwX3NjYiwgcF9zY2ItPm9wZW5fc2VydmljZXMpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorKioKKyoqIEZ1bmN0aW9uICAgICAgICAgYnRhX2FnX2Rpc2NfaW50X3JlcworKioKKyoqIERlc2NyaXB0aW9uICAgICAgVGhpcyBmdW5jdGlvbiBoYW5kbGVzIGEgZGlzY292ZXJ5IHJlc3VsdCB3aGVuIGluaXRpYXRvci4KKyoqCisqKgorKiogUmV0dXJucyAgICAgICAgICB2b2lkCisqKgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3ZvaWQgYnRhX2FnX2Rpc2NfaW50X3Jlcyh0QlRBX0FHX1NDQiAqcF9zY2IsIHRCVEFfQUdfREFUQSAqcF9kYXRhKQoreworICAgIFVJTlQxNiBldmVudCA9IEJUQV9BR19ESVNDX0ZBSUxfRVZUOworCisgICAgQVBQTF9UUkFDRV9ERUJVRzEgKCJidGFfYWdfZGlzY19pbnRfcmVzOiBTdGF0dXM6ICVkIiwgcF9kYXRhLT5kaXNjX3Jlc3VsdC5zdGF0dXMpOworCisgICAgLyogaWYgZm91bmQgc2VydmljZSAqLworICAgIGlmIChwX2RhdGEtPmRpc2NfcmVzdWx0LnN0YXR1cyA9PSBTRFBfU1VDQ0VTUyB8fAorICAgICAgICBwX2RhdGEtPmRpc2NfcmVzdWx0LnN0YXR1cyA9PSBTRFBfREJfRlVMTCkKKyAgICB7CisgICAgICAgIC8qIGdldCBhdHRyaWJ1dGVzICovCisgICAgICAgIGlmIChidGFfYWdfc2RwX2ZpbmRfYXR0cihwX3NjYiwgcF9zY2ItPm9wZW5fc2VydmljZXMpKQorICAgICAgICB7CisgICAgICAgICAgICAvKiBzZXQgY29ubmVjdGVkIHNlcnZpY2UgKi8KKyAgICAgICAgICAgIHBfc2NiLT5jb25uX3NlcnZpY2UgPSBidGFfYWdfc2VydmljZV90b19pZHgocF9zY2ItPm9wZW5fc2VydmljZXMpOworCisgICAgICAgICAgICAvKiBzZW5kIG91cnNlbHZlcyBzZHAgb2sgZXZlbnQgKi8KKyAgICAgICAgICAgIGV2ZW50ID0gQlRBX0FHX0RJU0NfT0tfRVZUOworICAgICAgICB9CisgICAgfQorCisgICAgLyogZnJlZSBkaXNjb3ZlcnkgZGIgKi8KKyAgICBidGFfYWdfZnJlZV9kYihwX3NjYiwgcF9kYXRhKTsKKworICAgIC8qIGlmIHNlcnZpY2Ugbm90IGZvdW5kIGNoZWNrIGlmIHdlIHNob3VsZCBzZWFyY2ggZm9yIG90aGVyIHNlcnZpY2UgKi8KKyAgICBpZiAoKGV2ZW50ID09IEJUQV9BR19ESVNDX0ZBSUxfRVZUKSAmJgorICAgICAgICAocF9kYXRhLT5kaXNjX3Jlc3VsdC5zdGF0dXMgPT0gU0RQX1NVQ0NFU1MgfHwKKyAgICAgICAgIHBfZGF0YS0+ZGlzY19yZXN1bHQuc3RhdHVzID09IFNEUF9EQl9GVUxMIHx8CisgICAgICAgICBwX2RhdGEtPmRpc2NfcmVzdWx0LnN0YXR1cyA9PSBTRFBfTk9fUkVDU19NQVRDSCkpCisgICAgeworICAgICAgICBpZiAoKHBfc2NiLT5vcGVuX3NlcnZpY2VzICYgQlRBX0hGUF9TRVJWSUNFX01BU0spICYmCisgICAgICAgICAgICAocF9zY2ItPm9wZW5fc2VydmljZXMgJiBCVEFfSFNQX1NFUlZJQ0VfTUFTSykpCisgICAgICAgIHsKKyAgICAgICAgICAgIC8qIHNlYXJjaCBmb3IgSFNQICovCisgICAgICAgICAgICBwX3NjYi0+b3Blbl9zZXJ2aWNlcyAmPSB+QlRBX0hGUF9TRVJWSUNFX01BU0s7CisgICAgICAgICAgICBidGFfYWdfZG9fZGlzYyhwX3NjYiwgcF9zY2ItPm9wZW5fc2VydmljZXMpOworICAgICAgICB9CisgICAgICAgIGVsc2UgaWYgKChwX3NjYi0+b3Blbl9zZXJ2aWNlcyAmIEJUQV9IU1BfU0VSVklDRV9NQVNLKSAmJgorICAgICAgICAgICAgICAgICAocF9zY2ItPmhzcF92ZXJzaW9uID09IEhTUF9WRVJTSU9OXzFfMikpCisgICAgICAgIHsKKyAgICAgICAgICAgIC8qIHNlYXJjaCBmb3IgVVVJRF9TRVJWQ0xBU1NfSEVBRFNFVCBmb3IgSFNQIDEuMCBkZXZpY2UgKi8KKyAgICAgICAgICAgIHBfc2NiLT5oc3BfdmVyc2lvbiA9IEhTUF9WRVJTSU9OXzFfMDsKKyAgICAgICAgICAgIGJ0YV9hZ19kb19kaXNjKHBfc2NiLCBwX3NjYi0+b3Blbl9zZXJ2aWNlcyk7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICAvKiBzZW5kIG91cnNlbHZlcyBzZHAgb2svZmFpbCBldmVudCAqLworICAgICAgICAgICAgYnRhX2FnX3NtX2V4ZWN1dGUocF9zY2IsIGV2ZW50LCBwX2RhdGEpOworICAgICAgICB9CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgIC8qIHNlbmQgb3Vyc2VsdmVzIHNkcCBvay9mYWlsIGV2ZW50ICovCisgICAgICAgIGJ0YV9hZ19zbV9leGVjdXRlKHBfc2NiLCBldmVudCwgcF9kYXRhKTsKKyAgICB9CisKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyoqCisqKiBGdW5jdGlvbiAgICAgICAgIGJ0YV9hZ19kaXNjX2FjcF9yZXMKKyoqCisqKiBEZXNjcmlwdGlvbiAgICAgIFRoaXMgZnVuY3Rpb24gaGFuZGxlcyBhIGRpc2NvdmVyeSByZXN1bHQgd2hlbiBhY2NlcHRvci4KKyoqCisqKgorKiogUmV0dXJucyAgICAgICAgICB2b2lkCisqKgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3ZvaWQgYnRhX2FnX2Rpc2NfYWNwX3Jlcyh0QlRBX0FHX1NDQiAqcF9zY2IsIHRCVEFfQUdfREFUQSAqcF9kYXRhKQoreworICAgIC8qIGlmIGZvdW5kIHNlcnZpY2UgKi8KKyAgICBpZiAocF9kYXRhLT5kaXNjX3Jlc3VsdC5zdGF0dXMgPT0gU0RQX1NVQ0NFU1MgfHwKKyAgICAgICAgcF9kYXRhLT5kaXNjX3Jlc3VsdC5zdGF0dXMgPT0gU0RQX0RCX0ZVTEwpCisgICAgeworICAgICAgICAvKiBnZXQgYXR0cmlidXRlcyAqLworICAgICAgICBidGFfYWdfc2RwX2ZpbmRfYXR0cihwX3NjYiwgYnRhX2FnX3N2Y19tYXNrW3Bfc2NiLT5jb25uX3NlcnZpY2VdKTsKKyAgICB9CisKKyAgICAvKiBmcmVlIGRpc2NvdmVyeSBkYiAqLworICAgIGJ0YV9hZ19mcmVlX2RiKHBfc2NiLCBwX2RhdGEpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorKioKKyoqIEZ1bmN0aW9uICAgICAgICAgYnRhX2FnX2Rpc2NfZmFpbAorKioKKyoqIERlc2NyaXB0aW9uICAgICAgVGhpcyBmdW5jdGlvbiBoYW5kbGVzIGEgZGlzY292ZXJ5IGZhaWx1cmUuCisqKgorKioKKyoqIFJldHVybnMgICAgICAgICAgdm9pZAorKioKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit2b2lkIGJ0YV9hZ19kaXNjX2ZhaWwodEJUQV9BR19TQ0IgKnBfc2NiLCB0QlRBX0FHX0RBVEEgKnBfZGF0YSkKK3sKKyAgICBVTlVTRUQocF9kYXRhKTsKKworICAgIC8qIHJlb3BlbiByZWdpc3RlcmVkIHNlcnZlcnMgKi8KKyAgICBidGFfYWdfc3RhcnRfc2VydmVycyhwX3NjYiwgcF9zY2ItPnJlZ19zZXJ2aWNlcyk7CisKKyAgICAvKiByZWluaXRpYWxpemUgc3R1ZmYgKi8KKworICAgIC8qIGNhbGwgb3BlbiBjYmFjayB3LiBmYWlsdXJlICovCisgICAgYnRhX2FnX2NiYWNrX29wZW4ocF9zY2IsIE5VTEwsIEJUQV9BR19GQUlMX1NEUCk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisqKgorKiogRnVuY3Rpb24gICAgICAgICBidGFfYWdfb3Blbl9mYWlsCisqKgorKiogRGVzY3JpcHRpb24gICAgICBvcGVuIGNvbm5lY3Rpb24gZmFpbGVkLgorKioKKyoqCisqKiBSZXR1cm5zICAgICAgICAgIHZvaWQKKyoqCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordm9pZCBidGFfYWdfb3Blbl9mYWlsKHRCVEFfQUdfU0NCICpwX3NjYiwgdEJUQV9BR19EQVRBICpwX2RhdGEpCit7CisgICAgLyogY2FsbCBvcGVuIGNiYWNrIHcuIGZhaWx1cmUgKi8KKyAgICBidGFfYWdfY2JhY2tfb3BlbihwX3NjYiwgcF9kYXRhLCBCVEFfQUdfRkFJTF9SRVNPVVJDRVMpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorKioKKyoqIEZ1bmN0aW9uICAgICAgICAgYnRhX2FnX3JmY19mYWlsCisqKgorKiogRGVzY3JpcHRpb24gICAgICBSRkNPTU0gY29ubmVjdGlvbiBmYWlsZWQuCisqKgorKioKKyoqIFJldHVybnMgICAgICAgICAgdm9pZAorKioKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit2b2lkIGJ0YV9hZ19yZmNfZmFpbCh0QlRBX0FHX1NDQiAqcF9zY2IsIHRCVEFfQUdfREFUQSAqcF9kYXRhKQoreworICAgIFVOVVNFRChwX2RhdGEpOworCisgICAgLyogcmVpbml0aWFsaXplIHN0dWZmICovCisgICAgcF9zY2ItPmNvbm5faGFuZGxlID0gMDsKKyAgICBwX3NjYi0+Y29ubl9zZXJ2aWNlID0gMDsKKyAgICBwX3NjYi0+cGVlcl9mZWF0dXJlcyA9IDA7CisjaWYgKEJUTV9XQlNfSU5DTFVERUQgPT0gVFJVRSApCisgICAgcF9zY2ItPnBlZXJfY29kZWNzID0gQlRBX0FHX0NPREVDX05PTkU7CisgICAgcF9zY2ItPnNjb19jb2RlYyA9IEJUQV9BR19DT0RFQ19OT05FOworI2VuZGlmCisgICAgcF9zY2ItPnJvbGUgPSAwOworICAgIHBfc2NiLT5zdmNfY29ubiA9IEZBTFNFOworICAgIHBfc2NiLT5oc3BfdmVyc2lvbiA9IEhTUF9WRVJTSU9OXzFfMjsKKworICAgIC8qIHJlb3BlbiByZWdpc3RlcmVkIHNlcnZlcnMgKi8KKyAgICBidGFfYWdfc3RhcnRfc2VydmVycyhwX3NjYiwgcF9zY2ItPnJlZ19zZXJ2aWNlcyk7CisKKyAgICAvKiBjYWxsIG9wZW4gY2JhY2sgdy4gZmFpbHVyZSAqLworICAgIGJ0YV9hZ19jYmFja19vcGVuKHBfc2NiLCBOVUxMLCBCVEFfQUdfRkFJTF9SRkNPTU0pOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorKioKKyoqIEZ1bmN0aW9uICAgICAgICAgYnRhX2FnX3JmY19jbG9zZQorKioKKyoqIERlc2NyaXB0aW9uICAgICAgUkZDT01NIGNvbm5lY3Rpb24gY2xvc2VkLgorKioKKyoqCisqKiBSZXR1cm5zICAgICAgICAgIHZvaWQKKyoqCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordm9pZCBidGFfYWdfcmZjX2Nsb3NlKHRCVEFfQUdfU0NCICpwX3NjYiwgdEJUQV9BR19EQVRBICpwX2RhdGEpCit7CisgICAgdEJUQV9BR19IRFIgICAgY2xvc2U7CisgICAgdEJUQV9TRVJWSUNFX01BU0sgc2VydmljZXM7CisgICAgaW50IGksIG51bV9hY3RpdmVfY29ubiA9IDA7CisgICAgVU5VU0VEKHBfZGF0YSk7CisKKyNpZmRlZiAgX1dJTjMyX1dDRQorICAgIC8qIFRoZSBCVEUgUkZDT01NIGF1dG9tYXRpY2FsbHkgcmVtb3ZlcyB0aGUgY29ubmVjdGlvbiB3aGVuIGNsb3NlZCwgYnV0IEJUVyBkb2VzIG5vdCAqLworICAgIGlmIChwX3NjYi0+Y29ubl9oYW5kbGUgIT0gMCkKKyAgICAgICAgUkZDT01NX1JlbW92ZUNvbm5lY3Rpb24gKHBfc2NiLT5jb25uX2hhbmRsZSk7CisjZW5kaWYKKworICAgIC8qIHJlaW5pdGlhbGl6ZSBzdHVmZiAqLworICAgIHBfc2NiLT5jb25uX3NlcnZpY2UgPSAwOworICAgIHBfc2NiLT5wZWVyX2ZlYXR1cmVzID0gMDsKKyNpZiAoQlRNX1dCU19JTkNMVURFRCA9PSBUUlVFICkKKyAgICBwX3NjYi0+cGVlcl9jb2RlY3MgPSBCVEFfQUdfQ09ERUNfTk9ORTsKKyAgICBwX3NjYi0+c2NvX2NvZGVjID0gQlRBX0FHX0NPREVDX05PTkU7CisjZW5kaWYKKyAgICBwX3NjYi0+cm9sZSA9IDA7CisgICAgcF9zY2ItPnBvc3Rfc2NvID0gQlRBX0FHX1BPU1RfU0NPX05PTkU7CisgICAgcF9zY2ItPnN2Y19jb25uID0gRkFMU0U7CisgICAgcF9zY2ItPmhzcF92ZXJzaW9uID0gSFNQX1ZFUlNJT05fMV8yOworICAgIGJ0YV9hZ19hdF9yZWluaXQoJnBfc2NiLT5hdF9jYik7CisKKyAgICAvKiBzdG9wIHRpbWVycyAqLworICAgIGJ0YV9zeXNfc3RvcF90aW1lcigmcF9zY2ItPmFjdF90aW1lcik7CisjaWYgKEJUTV9XQlNfSU5DTFVERUQgPT0gVFJVRSkKKyAgICBidGFfc3lzX3N0b3BfdGltZXIoJnBfc2NiLT5jbl90aW1lcik7CisjZW5kaWYKKworICAgIGNsb3NlLmhhbmRsZSA9IGJ0YV9hZ19zY2JfdG9faWR4KHBfc2NiKTsKKyAgICBjbG9zZS5hcHBfaWQgPSBwX3NjYi0+YXBwX2lkOworCisgICAgYnRhX3N5c19jb25uX2Nsb3NlKEJUQV9JRF9BRywgcF9zY2ItPmFwcF9pZCwgcF9zY2ItPnBlZXJfYWRkcik7CisKKyAgICAvKiBjYWxsIGNsb3NlIGNhbGwtb3V0ICovCisgICAgYnRhX2FnX2NvX2RhdGFfY2xvc2UoY2xvc2UuaGFuZGxlKTsKKworICAgIC8qIGNhbGwgY2xvc2UgY2JhY2sgKi8KKyAgICAoKmJ0YV9hZ19jYi5wX2NiYWNrKShCVEFfQUdfQ0xPU0VfRVZULCAodEJUQV9BRyAqKSAmY2xvc2UpOworCisgICAgLyogaWYgbm90IGRlcmVnaXN0ZXJpbmcgKGRlYWxsb2NhdGluZykgcmVvcGVuIHJlZ2lzdGVyZWQgc2VydmVycyAqLworICAgIGlmIChwX3NjYi0+ZGVhbGxvYyA9PSBGQUxTRSkKKyAgICB7CisgICAgICAgIC8qIENsZWFyIHBlZXIgYmRfYWRkciBzbyBpbnN0YW5jZSBjYW4gYmUgcmV1c2VkICovCisgICAgICAgIGJkY3B5KHBfc2NiLT5wZWVyX2FkZHIsIGJkX2FkZHJfbnVsbCk7CisKKyAgICAgICAgLyogc3RhcnQgb25seSB1bm9wZW5lZCBzZXJ2ZXIgKi8KKyAgICAgICAgc2VydmljZXMgPSBwX3NjYi0+cmVnX3NlcnZpY2VzOworICAgICAgICBmb3IgKGkgPSAwOyBpIDwgQlRBX0FHX05VTV9JRFggJiYgc2VydmljZXMgIT0gMDsgaSsrKQorICAgICAgICB7CisgICAgICAgICAgICBpZihwX3NjYi0+c2Vydl9oYW5kbGVbaV0pCisgICAgICAgICAgICAgICAgc2VydmljZXMgJj0gfigodEJUQV9TRVJWSUNFX01BU0spMSA8PCAoQlRBX0hTUF9TRVJWSUNFX0lEICsgaSkpOworICAgICAgICB9CisgICAgICAgIGJ0YV9hZ19zdGFydF9zZXJ2ZXJzKHBfc2NiLCBzZXJ2aWNlcyk7CisKKyAgICAgICAgcF9zY2ItPmNvbm5faGFuZGxlID0gMDsKKworICAgICAgICAvKiBNYWtlIHN1cmUgU0NPIHN0YXRlIGlzIEJUQV9BR19TQ09fU0hVVERPV05fU1QgKi8KKyAgICAgICAgYnRhX2FnX3Njb19zaHV0ZG93bihwX3NjYiwgTlVMTCk7CisKKyAgICAgICAgLyogQ2hlY2sgaWYgYWxsIHRoZSBTTENzIGFyZSBkb3duICovCisgICAgICAgIGZvciAoaSA9IDA7IGkgPCBCVEFfQUdfTlVNX1NDQjsgaSsrKQorICAgICAgICB7CisgICAgICAgICAgICBpZiAoYnRhX2FnX2NiLnNjYltpXS5pbl91c2UgJiYgYnRhX2FnX2NiLnNjYltpXS5zdmNfY29ubikKKyAgICAgICAgICAgICAgICBudW1fYWN0aXZlX2Nvbm4rKzsKKyAgICAgICAgfQorCisgICAgICAgIGlmKCFudW1fYWN0aXZlX2Nvbm4pCisgICAgICAgIHsKKyAgICAgICAgICAgIGJ0YV9zeXNfc2NvX3VudXNlKEJUQV9JRF9BRywgcF9zY2ItPmFwcF9pZCwgcF9zY2ItPnBlZXJfYWRkcik7CisgICAgICAgIH0KKworICAgIH0KKyAgICAvKiBlbHNlIGNsb3NlIHBvcnQgYW5kIGRlYWxsb2NhdGUgc2NiICovCisgICAgZWxzZQorICAgIHsKKyAgICAgICAgUkZDT01NX1JlbW92ZVNlcnZlcihwX3NjYi0+Y29ubl9oYW5kbGUpOworICAgICAgICBidGFfYWdfc2NiX2RlYWxsb2MocF9zY2IpOworICAgIH0KK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyoqCisqKiBGdW5jdGlvbiAgICAgICAgIGJ0YV9hZ19yZmNfb3BlbgorKioKKyoqIERlc2NyaXB0aW9uICAgICAgSGFuZGxlIFJGQ09NTSBjaGFubmVsIG9wZW4uCisqKgorKioKKyoqIFJldHVybnMgICAgICAgICAgdm9pZAorKioKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit2b2lkIGJ0YV9hZ19yZmNfb3Blbih0QlRBX0FHX1NDQiAqcF9zY2IsIHRCVEFfQUdfREFUQSAqcF9kYXRhKQoreworICAgIC8qIGluaXRpYWxpemUgQVQgZmVhdHVyZSB2YXJpYWJsZXMgKi8KKyAgICBwX3NjYi0+Y2xpcF9lbmFibGVkID0gRkFMU0U7CisgICAgcF9zY2ItPmNjd2FfZW5hYmxlZCA9IEZBTFNFOworICAgIHBfc2NiLT5jbWVyX2VuYWJsZWQgPSBGQUxTRTsKKyAgICBwX3NjYi0+Y21lZV9lbmFibGVkID0gRkFMU0U7CisgICAgcF9zY2ItPmluYmFuZF9lbmFibGVkID0gKChwX3NjYi0+ZmVhdHVyZXMgJiBCVEFfQUdfRkVBVF9JTkJBTkQpID09IEJUQV9BR19GRUFUX0lOQkFORCk7CisKKyAgICAvKiBzZXQgdXAgQVQgY29tbWFuZCBpbnRlcnByZXRlciAqLworICAgIHBfc2NiLT5hdF9jYi5wX2F0X3RibCA9ICh0QlRBX0FHX0FUX0NNRCAqKSBidGFfYWdfYXRfdGJsW3Bfc2NiLT5jb25uX3NlcnZpY2VdOworICAgIHBfc2NiLT5hdF9jYi5wX2NtZF9jYmFjayA9ICh0QlRBX0FHX0FUX0NNRF9DQkFDSyAqKSBidGFfYWdfYXRfY2JhY2tfdGJsW3Bfc2NiLT5jb25uX3NlcnZpY2VdOworICAgIHBfc2NiLT5hdF9jYi5wX2Vycl9jYmFjayA9ICh0QlRBX0FHX0FUX0VSUl9DQkFDSyAqKSBidGFfYWdfYXRfZXJyX2NiYWNrOworICAgIHBfc2NiLT5hdF9jYi5wX3VzZXIgPSBwX3NjYjsKKyAgICBwX3NjYi0+YXRfY2IuY21kX21heF9sZW4gPSBCVEFfQUdfQ01EX01BWDsKKyAgICBidGFfYWdfYXRfaW5pdCgmcF9zY2ItPmF0X2NiKTsKKworICAgIC8qIGNhbGwgYXBwIG9wZW4gY2FsbC1vdXQgKi8KKyAgICBidGFfYWdfY29fZGF0YV9vcGVuKGJ0YV9hZ19zY2JfdG9faWR4KHBfc2NiKSwgYnRhX2FnX3N2Y19pZFtwX3NjYi0+Y29ubl9zZXJ2aWNlXSk7CisKKyAgICBidGFfc3lzX2Nvbm5fb3BlbihCVEFfSURfQUcsIHBfc2NiLT5hcHBfaWQsIHBfc2NiLT5wZWVyX2FkZHIpOworCisgICAgYnRhX2FnX2NiYWNrX29wZW4ocF9zY2IsIE5VTEwsIEJUQV9BR19TVUNDRVNTKTsKKworICAgIGlmIChwX3NjYi0+Y29ubl9zZXJ2aWNlID09IEJUQV9BR19IRlApCisgICAgeworICAgICAgICAvKiBpZiBoZnAgc3RhcnQgdGltZXIgZm9yIHNlcnZpY2UgbGV2ZWwgY29ubiAqLworICAgICAgICBidGFfc3lzX3N0YXJ0X3RpbWVyKCZwX3NjYi0+YWN0X3RpbWVyLCBCVEFfQUdfU1ZDX1RPVVRfRVZULCBwX2J0YV9hZ19jZmctPmNvbm5fdG91dCk7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgIC8qIGVsc2Ugc2VydmljZSBsZXZlbCBjb25uIGlzIG9wZW4gKi8KKyAgICAgICAgYnRhX2FnX3N2Y19jb25uX29wZW4ocF9zY2IsIHBfZGF0YSk7CisgICAgfQorfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorKioKKyoqIEZ1bmN0aW9uICAgICAgICAgYnRhX2FnX3JmY19hY3Bfb3BlbgorKioKKyoqIERlc2NyaXB0aW9uICAgICAgSGFuZGxlIFJGQ09NTSBjaGFubmVsIG9wZW4gd2hlbiBhY2NlcHRpbmcgY29ubmVjdGlvbi4KKyoqCisqKgorKiogUmV0dXJucyAgICAgICAgICB2b2lkCisqKgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3ZvaWQgYnRhX2FnX3JmY19hY3Bfb3Blbih0QlRBX0FHX1NDQiAqcF9zY2IsIHRCVEFfQUdfREFUQSAqcF9kYXRhKQoreworICAgIFVJTlQxNiAgICAgICAgICBsY2lkOworICAgIGludCAgICAgICAgICAgICBpOworICAgIHRCVEFfQUdfU0NCICAgICAqYWdfc2NiLCAqb3RoZXJfc2NiOworICAgIEJEX0FERFIgICAgICAgICBkZXZfYWRkcjsKKyAgICBpbnQgICAgICAgICAgICAgc3RhdHVzOworCisgICAgLyogc2V0IHJvbGUgKi8KKyAgICBwX3NjYi0+cm9sZSA9IEJUQV9BR19BQ1A7CisKKyAgICBBUFBMX1RSQUNFX0RFQlVHMiAoImJ0YV9hZ19yZmNfYWNwX29wZW46IHNlcnZfaGFuZGxlMCA9ICVkIHNlcnZfaGFuZGxlMSA9ICVkIiwKKyAgICAgICAgICAgICAgICAgICAgICAgcF9zY2ItPnNlcnZfaGFuZGxlWzBdLCBwX3NjYi0+c2Vydl9oYW5kbGVbMV0pOworCisgICAgLyogZ2V0IGJkIGFkZHIgb2YgcGVlciAqLworICAgIGlmIChQT1JUX1NVQ0NFU1MgIT0gKHN0YXR1cz1QT1JUX0NoZWNrQ29ubmVjdGlvbihwX2RhdGEtPnJmYy5wb3J0X2hhbmRsZSwgZGV2X2FkZHIsICZsY2lkKSkpCisgICAgeworICAgICAgICBBUFBMX1RSQUNFX0RFQlVHMSAoImJ0YV9hZ19yZmNfYWNwX29wZW4gZXJyb3IgUE9SVF9DaGVja0Nvbm5lY3Rpb24gcmV0dXJuZWQgc3RhdHVzICVkIiwgc3RhdHVzKTsKKyAgICB9CisKKyAgICAvKiBDb2xsaXNpb24gSGFuZGxpbmcgKi8KKyAgICBmb3IgKGkgPSAwLCBhZ19zY2IgPSAmYnRhX2FnX2NiLnNjYlswXTsgaSA8IEJUQV9BR19OVU1fU0NCOyBpKyssIGFnX3NjYisrKQorICAgIHsKKyAgICAgICAgaWYgKChhZ19zY2ItPmluX3VzZSkgJiYgKGFnX3NjYi0+Y29sbGlfdG1yX29uKSkKKyAgICAgICAgeworICAgICAgICAgICAgLyogc3RvcCBjb2xsaXNpb24gdGltZXIgKi8KKyAgICAgICAgICAgIGFnX3NjYi0+Y29sbGlfdG1yX29uID0gRkFMU0U7CisgICAgICAgICAgICBidGFfc3lzX3N0b3BfdGltZXIgKCZhZ19zY2ItPmNvbGxpX3RpbWVyKTsKKworICAgICAgICAgICAgaWYgKGJkY21wIChkZXZfYWRkciwgYWdfc2NiLT5wZWVyX2FkZHIpID09IDApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgLyogSWYgaW5jb21pbmcgYW5kIG91dGdvaW5nIGRldmljZSBhcmUgc2FtZSwgbm90aGluZyBtb3JlIHRvIGRvLiAgICAgICAgICAgICovCisgICAgICAgICAgICAgICAgLyogT3V0Z29pbmcgY29ubiB3aWxsIGJlIGFib3J0ZWQgYmVjYXVzZSB3ZSBoYXZlIHN1Y2Nlc3NmdWwgaW5jb21pbmcgY29ubi4gICovCisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgLyogUmVzdW1lIG91dGdvaW5nIGNvbm5lY3Rpb24uICovCisgICAgICAgICAgICAgICAgb3RoZXJfc2NiID0gYnRhX2FnX2dldF9vdGhlcl9pZGxlX3NjYiAocF9zY2IpOworICAgICAgICAgICAgICAgIGlmIChvdGhlcl9zY2IpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBiZGNweShvdGhlcl9zY2ItPnBlZXJfYWRkciwgYWdfc2NiLT5wZWVyX2FkZHIpOworICAgICAgICAgICAgICAgICAgICBvdGhlcl9zY2ItPm9wZW5fc2VydmljZXMgPSBhZ19zY2ItPm9wZW5fc2VydmljZXM7CisgICAgICAgICAgICAgICAgICAgIG90aGVyX3NjYi0+Y2xpX3NlY19tYXNrID0gYWdfc2NiLT5jbGlfc2VjX21hc2s7CisKKyAgICAgICAgICAgICAgICAgICAgYnRhX2FnX3Jlc3VtZV9vcGVuIChvdGhlcl9zY2IpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBiZGNweSAocF9zY2ItPnBlZXJfYWRkciwgZGV2X2FkZHIpOworCisgICAgLyogZGV0ZXJtaW5lIGNvbm5lY3RlZCBzZXJ2aWNlIGZyb20gcG9ydCBoYW5kbGUgKi8KKyAgICBmb3IgKGkgPSAwOyBpIDwgQlRBX0FHX05VTV9JRFg7IGkrKykKKyAgICB7CisgICAgICAgIEFQUExfVFJBQ0VfREVCVUczICgiYnRhX2FnX3JmY19hY3Bfb3BlbjogaSA9ICVkIHNlcnZfaGFuZGxlID0gJWQgcG9ydF9oYW5kbGUgPSAlZCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBpLCBwX3NjYi0+c2Vydl9oYW5kbGVbaV0sIHBfZGF0YS0+cmZjLnBvcnRfaGFuZGxlKTsKKworICAgICAgICBpZiAocF9zY2ItPnNlcnZfaGFuZGxlW2ldID09IHBfZGF0YS0+cmZjLnBvcnRfaGFuZGxlKQorICAgICAgICB7CisgICAgICAgICAgICBwX3NjYi0+Y29ubl9zZXJ2aWNlID0gaTsKKyAgICAgICAgICAgIHBfc2NiLT5jb25uX2hhbmRsZSA9IHBfZGF0YS0+cmZjLnBvcnRfaGFuZGxlOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBBUFBMX1RSQUNFX0RFQlVHMiAoImJ0YV9hZ19yZmNfYWNwX29wZW46IGNvbm5fc2VydmljZSA9ICVkIGNvbm5faGFuZGxlID0gJWQiLAorICAgICAgICAgICAgICAgICAgICAgICBwX3NjYi0+Y29ubl9zZXJ2aWNlLCBwX3NjYi0+Y29ubl9oYW5kbGUpOworCisgICAgLyogY2xvc2UgYW55IHVub3BlbmVkIHNlcnZlciAqLworICAgIGJ0YV9hZ19jbG9zZV9zZXJ2ZXJzKHBfc2NiLCAocF9zY2ItPnJlZ19zZXJ2aWNlcyAmIH5idGFfYWdfc3ZjX21hc2tbcF9zY2ItPmNvbm5fc2VydmljZV0pKTsKKworICAgIC8qIGRvIHNlcnZpY2UgZGlzY292ZXJ5IHRvIGdldCBmZWF0dXJlcyAqLworICAgIGJ0YV9hZ19kb19kaXNjKHBfc2NiLCBidGFfYWdfc3ZjX21hc2tbcF9zY2ItPmNvbm5fc2VydmljZV0pOworCisgICAgLyogY29udGludWUgd2l0aCBjb21tb24gb3BlbiBwcm9jZXNzaW5nICovCisgICAgYnRhX2FnX3JmY19vcGVuKHBfc2NiLCBwX2RhdGEpOworCisKKworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorKioKKyoqIEZ1bmN0aW9uICAgICAgICAgYnRhX2FnX3JmY19kYXRhCisqKgorKiogRGVzY3JpcHRpb24gICAgICBSZWFkIGFuZCBwcm9jZXNzIGRhdGEgZnJvbSBSRkNPTU0uCisqKgorKioKKyoqIFJldHVybnMgICAgICAgICAgdm9pZAorKioKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit2b2lkIGJ0YV9hZ19yZmNfZGF0YSh0QlRBX0FHX1NDQiAqcF9zY2IsIHRCVEFfQUdfREFUQSAqcF9kYXRhKQoreworICAgIFVJTlQxNiAgbGVuOworICAgIGNoYXIgICAgYnVmW0JUQV9BR19SRkNfUkVBRF9NQVhdOworICAgIFVOVVNFRChwX2RhdGEpOworCisgICAgbWVtc2V0KGJ1ZiwgMCwgQlRBX0FHX1JGQ19SRUFEX01BWCk7CisKKyAgICAvKiBkbyB0aGUgZm9sbG93aW5nICovCisgICAgZm9yKDs7KQorICAgIHsKKyAgICAgICAgLyogcmVhZCBkYXRhIGZyb20gcmZjb21tOyBpZiBiYWQgc3RhdHVzLCB3ZSdyZSBkb25lICovCisgICAgICAgIGlmIChQT1JUX1JlYWREYXRhKHBfc2NiLT5jb25uX2hhbmRsZSwgYnVmLCBCVEFfQUdfUkZDX1JFQURfTUFYLCAmbGVuKSAhPSBQT1JUX1NVQ0NFU1MpCisgICAgICAgIHsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisKKyAgICAgICAgLyogaWYgbm8gZGF0YSwgd2UncmUgZG9uZSAqLworICAgICAgICBpZiAobGVuID09IDApCisgICAgICAgIHsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisKKyAgICAgICAgLyogcnVuIEFUIGNvbW1hbmQgaW50ZXJwcmV0ZXIgb24gZGF0YSAqLworICAgICAgICBidGFfYWdfYXRfcGFyc2UoJnBfc2NiLT5hdF9jYiwgYnVmLCBsZW4pOworCisgICAgICAgIC8qIG5vIG1vcmUgZGF0YSB0byByZWFkLCB3ZSdyZSBkb25lICovCisgICAgICAgIGlmIChsZW4gPCBCVEFfQUdfUkZDX1JFQURfTUFYKQorICAgICAgICB7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgIH0KK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyoqCisqKiBGdW5jdGlvbiAgICAgICAgIGJ0YV9hZ19zdGFydF9jbG9zZQorKioKKyoqIERlc2NyaXB0aW9uICAgICAgU3RhcnQgdGhlIHByb2Nlc3Mgb2YgY2xvc2luZyBTQ08gYW5kIFJGQ09NTSBjb25uZWN0aW9uLgorKioKKyoqCisqKiBSZXR1cm5zICAgICAgICAgIHZvaWQKKyoqCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordm9pZCBidGFfYWdfc3RhcnRfY2xvc2UodEJUQV9BR19TQ0IgKnBfc2NiLCB0QlRBX0FHX0RBVEEgKnBfZGF0YSkKK3sKKyAgICAvKiBUYWtlIHRoZSBsaW5rIG91dCBvZiBzbmlmZiBhbmQgc2V0IEwyQyBpZGxlIHRpbWUgdG8gMCAqLworICAgIGJ0YV9kbV9wbV9hY3RpdmUocF9zY2ItPnBlZXJfYWRkcik7CisgICAgTDJDQV9TZXRJZGxlVGltZW91dEJ5QmRBZGRyKHBfc2NiLT5wZWVyX2FkZHIsIDApOworCisgICAgLyogaWYgU0NPIGlzIG9wZW4gY2xvc2UgU0NPIGFuZCB3YWl0IG9uIFJGQ09NTSBjbG9zZSAqLworICAgIGlmIChidGFfYWdfc2NvX2lzX29wZW4ocF9zY2IpKQorICAgIHsKKyAgICAgICAgcF9zY2ItPnBvc3Rfc2NvID0gQlRBX0FHX1BPU1RfU0NPX0NMT1NFX1JGQzsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgcF9zY2ItPnBvc3Rfc2NvID0gQlRBX0FHX1BPU1RfU0NPX05PTkU7CisgICAgICAgIGJ0YV9hZ19yZmNfZG9fY2xvc2UocF9zY2IsIHBfZGF0YSk7CisgICAgfQorCisgICAgLyogYWx3YXlzIGRvIFNDTyBzaHV0ZG93biB0byBoYW5kbGUgYWxsIFNDTyBjb3JuZXIgY2FzZXMgKi8KKyAgICBidGFfYWdfc2NvX3NodXRkb3duKHBfc2NiLCBwX2RhdGEpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorKioKKyoqIEZ1bmN0aW9uICAgICAgICAgYnRhX2FnX3Bvc3Rfc2NvX29wZW4KKyoqCisqKiBEZXNjcmlwdGlvbiAgICAgIFBlcmZvcm0gcG9zdC1TQ08gb3BlbiBhY3Rpb24sIGlmIGFueQorKioKKyoqCisqKiBSZXR1cm5zICAgICAgICAgIHZvaWQKKyoqCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordm9pZCBidGFfYWdfcG9zdF9zY29fb3Blbih0QlRBX0FHX1NDQiAqcF9zY2IsIHRCVEFfQUdfREFUQSAqcF9kYXRhKQoreworICAgIHN3aXRjaCAocF9zY2ItPnBvc3Rfc2NvKQorICAgIHsKKyAgICAgICAgY2FzZSBCVEFfQUdfUE9TVF9TQ09fUklORzoKKyAgICAgICAgICAgIGJ0YV9hZ19zZW5kX3JpbmcocF9zY2IsIHBfZGF0YSk7CisgICAgICAgICAgICBwX3NjYi0+cG9zdF9zY28gPSBCVEFfQUdfUE9TVF9TQ09fTk9ORTsKKyAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgIGNhc2UgQlRBX0FHX1BPU1RfU0NPX0NBTExfQ09OTjoKKyAgICAgICAgICAgIGJ0YV9hZ19zZW5kX2NhbGxfaW5kcyhwX3NjYiwgQlRBX0FHX0lOX0NBTExfQ09OTl9SRVMpOworICAgICAgICAgICAgcF9zY2ItPnBvc3Rfc2NvID0gQlRBX0FHX1BPU1RfU0NPX05PTkU7CisgICAgICAgICAgICBicmVhazsKKworICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgYnJlYWs7CisgICAgfQorfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorKioKKyoqIEZ1bmN0aW9uICAgICAgICAgYnRhX2FnX3Bvc3Rfc2NvX2Nsb3NlCisqKgorKiogRGVzY3JpcHRpb24gICAgICBQZXJmb3JtIHBvc3QtU0NPIGNsb3NlIGFjdGlvbiwgaWYgYW55CisqKgorKioKKyoqIFJldHVybnMgICAgICAgICAgdm9pZAorKioKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit2b2lkIGJ0YV9hZ19wb3N0X3Njb19jbG9zZSh0QlRBX0FHX1NDQiAqcF9zY2IsIHRCVEFfQUdfREFUQSAqcF9kYXRhKQoreworICAgIHN3aXRjaCAocF9zY2ItPnBvc3Rfc2NvKQorICAgIHsKKyAgICAgICAgY2FzZSBCVEFfQUdfUE9TVF9TQ09fQ0xPU0VfUkZDOgorICAgICAgICAgICAgYnRhX2FnX3JmY19kb19jbG9zZShwX3NjYiwgcF9kYXRhKTsKKyAgICAgICAgICAgIHBfc2NiLT5wb3N0X3NjbyA9IEJUQV9BR19QT1NUX1NDT19OT05FOworICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgY2FzZSBCVEFfQUdfUE9TVF9TQ09fQ0FMTF9DT05OOgorICAgICAgICAgICAgYnRhX2FnX3NlbmRfY2FsbF9pbmRzKHBfc2NiLCBCVEFfQUdfSU5fQ0FMTF9DT05OX1JFUyk7CisgICAgICAgICAgICBwX3NjYi0+cG9zdF9zY28gPSBCVEFfQUdfUE9TVF9TQ09fTk9ORTsKKyAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgIGNhc2UgQlRBX0FHX1BPU1RfU0NPX0NBTExfT1JJRzoKKyAgICAgICAgICAgIGJ0YV9hZ19zZW5kX2NhbGxfaW5kcyhwX3NjYiwgQlRBX0FHX09VVF9DQUxMX09SSUdfUkVTKTsKKyAgICAgICAgICAgIHBfc2NiLT5wb3N0X3NjbyA9IEJUQV9BR19QT1NUX1NDT19OT05FOworICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgY2FzZSBCVEFfQUdfUE9TVF9TQ09fQ0FMTF9FTkQ6CisgICAgICAgICAgICBidGFfYWdfc2VuZF9jYWxsX2luZHMocF9zY2IsIEJUQV9BR19FTkRfQ0FMTF9SRVMpOworICAgICAgICAgICAgcF9zY2ItPnBvc3Rfc2NvID0gQlRBX0FHX1BPU1RfU0NPX05PTkU7CisgICAgICAgICAgICBicmVhazsKKworICAgICAgICBjYXNlIEJUQV9BR19QT1NUX1NDT19DQUxMX0VORF9JTkNBTEw6CisgICAgICAgICAgICBidGFfYWdfc2VuZF9jYWxsX2luZHMocF9zY2IsIEJUQV9BR19FTkRfQ0FMTF9SRVMpOworCisgICAgICAgICAgICAvKiBTZW5kaW5nIGNhbGxzZXR1cCBJTkQgYW5kIFJpbmcgd2VyZSBkZWZlcmVkIHRvIGFmdGVyIFNDTyBjbG9zZS4gKi8KKyAgICAgICAgICAgIGJ0YV9hZ19zZW5kX2NhbGxfaW5kcyhwX3NjYiwgQlRBX0FHX0lOX0NBTExfUkVTKTsKKworICAgICAgICAgICAgaWYgKGJ0YV9hZ19pbmJhbmRfZW5hYmxlZChwX3NjYikgJiYgIShwX3NjYi0+ZmVhdHVyZXMgJiBCVEFfQUdfRkVBVF9OT1NDTykpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgcF9zY2ItPnBvc3Rfc2NvID0gQlRBX0FHX1BPU1RfU0NPX1JJTkc7CisgICAgICAgICAgICAgICAgYnRhX2FnX3Njb19vcGVuKHBfc2NiLCBwX2RhdGEpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHBfc2NiLT5wb3N0X3NjbyA9IEJUQV9BR19QT1NUX1NDT19OT05FOworICAgICAgICAgICAgICAgIGJ0YV9hZ19zZW5kX3JpbmcocF9zY2IsIHBfZGF0YSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKworICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgYnJlYWs7CisgICAgfQorfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorKioKKyoqIEZ1bmN0aW9uICAgICAgICAgYnRhX2FnX3N2Y19jb25uX29wZW4KKyoqCisqKiBEZXNjcmlwdGlvbiAgICAgIFNlcnZpY2UgbGV2ZWwgY29ubmVjdGlvbiBvcGVuZWQKKyoqCisqKgorKiogUmV0dXJucyAgICAgICAgICB2b2lkCisqKgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3ZvaWQgYnRhX2FnX3N2Y19jb25uX29wZW4odEJUQV9BR19TQ0IgKnBfc2NiLCB0QlRBX0FHX0RBVEEgKnBfZGF0YSkKK3sKKyAgICB0QlRBX0FHX0NPTk4gZXZ0OworICAgIFVOVVNFRChwX2RhdGEpOworCisgICAgaWYgKCFwX3NjYi0+c3ZjX2Nvbm4pCisgICAgeworICAgICAgICAvKiBzZXQgc3RhdGUgdmFyaWFibGUgKi8KKyAgICAgICAgcF9zY2ItPnN2Y19jb25uID0gVFJVRTsKKworICAgICAgICAvKiBDbGVhciBBVCtCSUEgbWFzayBmcm9tIHByZXZpb3VzIFNMQyBpZiBhbnkuICovCisgICAgICAgIHBfc2NiLT5iaWFfbWFza2VkX291dCA9IDA7CisKKyAgICAgICAgLyogc3RvcCB0aW1lciAqLworICAgICAgICBidGFfc3lzX3N0b3BfdGltZXIoJnBfc2NiLT5hY3RfdGltZXIpOworCisgICAgICAgIC8qIGNhbGwgY2FsbGJhY2sgKi8KKyAgICAgICAgZXZ0Lmhkci5oYW5kbGUgPSBidGFfYWdfc2NiX3RvX2lkeChwX3NjYik7CisgICAgICAgIGV2dC5oZHIuYXBwX2lkID0gcF9zY2ItPmFwcF9pZDsKKyAgICAgICAgZXZ0LnBlZXJfZmVhdCA9IHBfc2NiLT5wZWVyX2ZlYXR1cmVzOworI2lmIChCVE1fV0JTX0lOQ0xVREVEID09IFRSVUUgKQorICAgICAgICBldnQucGVlcl9jb2RlYyAgPSBwX3NjYi0+cGVlcl9jb2RlY3M7CisjZW5kaWYKKworICAgICAgICBpZiAoKHBfc2NiLT5jYWxsX2luZCAhPSBCVEFfQUdfQ0FMTF9JTkFDVElWRSkgfHwKKyAgICAgICAgICAgIChwX3NjYi0+Y2FsbHNldHVwX2luZCAhPSBCVEFfQUdfQ0FMTFNFVFVQX05PTkUpKQorICAgICAgICB7CisgICAgICAgICAgICBidGFfc3lzX3Njb191c2UoQlRBX0lEX0FHLCBwX3NjYi0+YXBwX2lkLCBwX3NjYi0+cGVlcl9hZGRyKTsKKyAgICAgICAgfQorCisgICAgICAgICgqYnRhX2FnX2NiLnBfY2JhY2spKEJUQV9BR19DT05OX0VWVCwgKHRCVEFfQUcgKikgJmV2dCk7CisgICAgfQorfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorKioKKyoqIEZ1bmN0aW9uICAgICAgICAgYnRhX2FnX2NpX3J4X2RhdGEKKyoqCisqKiBEZXNjcmlwdGlvbiAgICAgIFNlbmQgcmVzdWx0IGNvZGUKKyoqCisqKiBSZXR1cm5zICAgICAgICAgIHZvaWQKKyoqCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordm9pZCBidGFfYWdfY2lfcnhfZGF0YSh0QlRBX0FHX1NDQiAqcF9zY2IsIHRCVEFfQUdfREFUQSAqcF9kYXRhKQoreworICAgIFVJTlQxNiBsZW47CisgICAgdEJUQV9BR19DSV9SWF9XUklURSAqcF9yeF93cml0ZV9tc2cgPSAodEJUQV9BR19DSV9SWF9XUklURSAqKXBfZGF0YTsKKyAgICBjaGFyICpwX2RhdGFfYXJlYSA9IChjaGFyICopKHBfcnhfd3JpdGVfbXNnKzEpOyAgICAgLyogUG9pbnQgdG8gZGF0YSBhcmVhIGFmdGVyIGhlYWRlciAqLworCisgICAgLyogc2VuZCB0byBSRkNPTU0gKi8KKyAgICBQT1JUX1dyaXRlRGF0YShwX3NjYi0+Y29ubl9oYW5kbGUsIHBfZGF0YV9hcmVhLCBzdHJsZW4ocF9kYXRhX2FyZWEpLCAmbGVuKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyoqCisqKiBGdW5jdGlvbiAgICAgICAgIGJ0YV9hZ19yY3ZkX3NsY19yZWFkeQorKioKKyoqIERlc2NyaXB0aW9uICAgICAgSGFuZGxlcyBTTEMgcmVhZHkgY2FsbC1pbiBpbiBjYXNlIG9mIHBhc3MtdGhyb3VnaCBtb2RlLgorKioKKyoqIFJldHVybnMgICAgICAgICAgdm9pZAorKioKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit2b2lkIGJ0YV9hZ19yY3ZkX3NsY19yZWFkeSh0QlRBX0FHX1NDQiAqcF9zY2IsIHRCVEFfQUdfREFUQSAqcF9kYXRhKQoreworICAgIFVOVVNFRChwX2RhdGEpOworCisgICAgQVBQTF9UUkFDRV9ERUJVRzEoImJ0YV9hZ19yY3ZkX3NsY19yZWFkeTogaGFuZGxlID0gJWQiLCBidGFfYWdfc2NiX3RvX2lkeChwX3NjYikpOworCisgICAgaWYgKGJ0YV9hZ19jYi5wYXJzZV9tb2RlID09IEJUQV9BR19QQVNTX1RIUk9VR0gpCisgICAgeworICAgICAgICAvKiBJbiBwYXNzLXRocm91Z2ggbW9kZSwgQlRBIGtub3dzIHRoYXQgU0xDIGlzIHJlYWR5IG9ubHkgdGhyb3VnaCBjYWxsLWluLiAqLworICAgICAgICBidGFfYWdfc3ZjX2Nvbm5fb3BlbihwX3NjYiwgTlVMTCk7CisgICAgfQorfQorCmRpZmYgLS1naXQgYS9idGEvaGZfY2xpZW50L2J0YV9oZl9jbGllbnRfYXBpLmMgYi9idGEvaGZfY2xpZW50L2J0YV9oZl9jbGllbnRfYXBpLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDdkY2ViOQotLS0gL2Rldi9udWxsCisrKyBiL2J0YS9oZl9jbGllbnQvYnRhX2hmX2NsaWVudF9hcGkuYwpAQCAtMCwwICsxLDMyMyBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoKKyAqICBDb3B5cmlnaHQgKEMpIDIwMDMtMjAxMiBCcm9hZGNvbSBDb3Jwb3JhdGlvbgorICoKKyAqICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0OgorICoKKyAqICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCisgKiAgVGhpcyBpcyB0aGUgaW1wbGVtZW50YXRpb24gb2YgdGhlIEFQSSBmb3IgdGhlIGF1ZGlvIGdhdGV3YXkgKEFHKQorICogIHN1YnN5c3RlbSBvZiBCVEEsIEJyb2FkY29tJ3MgQmx1ZXRvb3RoIGFwcGxpY2F0aW9uIGxheWVyIGZvciBtb2JpbGUKKyAqICBwaG9uZXMuCisgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworI2luY2x1ZGUgImJ0YV9hcGkuaCIKKyNpbmNsdWRlICJiZC5oIgorI2luY2x1ZGUgImJ0YV9zeXMuaCIKKyNpbmNsdWRlICJidGFfYWdfYXBpLmgiCisjaW5jbHVkZSAiYnRhX2FnX2ludC5oIgorI2luY2x1ZGUgImdraS5oIgorI2luY2x1ZGUgPHN0cmluZy5oPgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyoqICBDb25zdGFudHMKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCitzdGF0aWMgY29uc3QgdEJUQV9TWVNfUkVHIGJ0YV9hZ19yZWcgPQoreworICAgIGJ0YV9hZ19oZGxfZXZlbnQsCisgICAgQlRBX0FnRGlzYWJsZQorfTsKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyoqCisqKiBGdW5jdGlvbiAgICAgICAgIEJUQV9BZ0VuYWJsZQorKioKKyoqIERlc2NyaXB0aW9uICAgICAgRW5hYmxlIHRoZSBhdWRpbyBnYXRld2F5IHNlcnZpY2UuIFdoZW4gdGhlIGVuYWJsZQorKiogICAgICAgICAgICAgICAgICBvcGVyYXRpb24gaXMgY29tcGxldGUgdGhlIGNhbGxiYWNrIGZ1bmN0aW9uIHdpbGwgYmUKKyoqICAgICAgICAgICAgICAgICAgY2FsbGVkIHdpdGggYSBCVEFfQUdfRU5BQkxFX0VWVC4gVGhpcyBmdW5jdGlvbiBtdXN0CisqKiAgICAgICAgICAgICAgICAgIGJlIGNhbGxlZCBiZWZvcmUgb3RoZXIgZnVuY3Rpb24gaW4gdGhlIEFHIEFQSSBhcmUKKyoqICAgICAgICAgICAgICAgICAgY2FsbGVkLgorKioKKyoqIFJldHVybnMgICAgICAgICAgQlRBX1NVQ0NFU1MgaWYgT0ssIEJUQV9GQUlMVVJFIG90aGVyd2lzZS4KKyoqCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordEJUQV9TVEFUVVMgQlRBX0FnRW5hYmxlKHRCVEFfQUdfUEFSU0VfTU9ERSBwYXJzZV9tb2RlLCB0QlRBX0FHX0NCQUNLICpwX2NiYWNrKQoreworICAgIHRCVEFfQUdfQVBJX0VOQUJMRSAgKnBfYnVmOworICAgIFVJTlQ4ICAgICAgIGlkeDsKKworICAgIC8qIEVycm9yIGlmIEFHIGlzIGFscmVhZHkgZW5hYmxlZCwgb3IgQUcgaXMgaW4gdGhlIG1pZGRsZSBvZiBkaXNhYmxpbmcuICovCisgICAgZm9yIChpZHggPSAwOyBpZHggPCBCVEFfQUdfTlVNX1NDQjsgaWR4KyspCisgICAgeworICAgICAgICBpZiAoYnRhX2FnX2NiLnNjYltpZHhdLmluX3VzZSkKKyAgICAgICAgeworICAgICAgICAgICAgQVBQTF9UUkFDRV9FUlJPUjAgKCJCVEFfQWdFbmFibGU6IEZBSUxFRCwgQUcgYWxyZWFkeSBlbmFibGVkLiIpOworICAgICAgICAgICAgcmV0dXJuIEJUQV9GQUlMVVJFOworICAgICAgICB9CisgICAgfQorCisgICAgLyogcmVnaXN0ZXIgd2l0aCBCVEEgc3lzdGVtIG1hbmFnZXIgKi8KKyAgICBHS0lfc2NoZWRfbG9jaygpOworICAgIGJ0YV9zeXNfcmVnaXN0ZXIoQlRBX0lEX0FHLCAmYnRhX2FnX3JlZyk7CisgICAgR0tJX3NjaGVkX3VubG9jaygpOworCisgICAgaWYgKChwX2J1ZiA9ICh0QlRBX0FHX0FQSV9FTkFCTEUgKikgR0tJX2dldGJ1ZihzaXplb2YodEJUQV9BR19BUElfRU5BQkxFKSkpICE9IE5VTEwpCisgICAgeworICAgICAgICBwX2J1Zi0+aGRyLmV2ZW50ID0gQlRBX0FHX0FQSV9FTkFCTEVfRVZUOworICAgICAgICBwX2J1Zi0+cGFyc2VfbW9kZSA9IHBhcnNlX21vZGU7CisgICAgICAgIHBfYnVmLT5wX2NiYWNrID0gcF9jYmFjazsKKyAgICAgICAgYnRhX3N5c19zZW5kbXNnKHBfYnVmKTsKKyAgICB9CisKKyAgICByZXR1cm4gQlRBX1NVQ0NFU1M7CisKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyoqCisqKiBGdW5jdGlvbiAgICAgICAgIEJUQV9BZ0Rpc2FibGUKKyoqCisqKiBEZXNjcmlwdGlvbiAgICAgIERpc2FibGUgdGhlIGF1ZGlvIGdhdGV3YXkgc2VydmljZQorKioKKyoqCisqKiBSZXR1cm5zICAgICAgICAgIHZvaWQKKyoqCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordm9pZCBCVEFfQWdEaXNhYmxlKHZvaWQpCit7CisgICAgQlRfSERSICAqcF9idWY7CisKKyAgICBpZiAoKHBfYnVmID0gKEJUX0hEUiAqKSBHS0lfZ2V0YnVmKHNpemVvZihCVF9IRFIpKSkgIT0gTlVMTCkKKyAgICB7CisgICAgICAgIHBfYnVmLT5ldmVudCA9IEJUQV9BR19BUElfRElTQUJMRV9FVlQ7CisgICAgICAgIGJ0YV9zeXNfc2VuZG1zZyhwX2J1Zik7CisgICAgfQorfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorKioKKyoqIEZ1bmN0aW9uICAgICAgICAgQlRBX0FnUmVnaXN0ZXIKKyoqCisqKiBEZXNjcmlwdGlvbiAgICAgIFJlZ2lzdGVyIGFuIEF1ZGlvIEdhdGV3YXkgc2VydmljZS4KKyoqCisqKgorKiogUmV0dXJucyAgICAgICAgICB2b2lkCisqKgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3ZvaWQgQlRBX0FnUmVnaXN0ZXIodEJUQV9TRVJWSUNFX01BU0sgc2VydmljZXMsIHRCVEFfU0VDIHNlY19tYXNrLHRCVEFfQUdfRkVBVCBmZWF0dXJlcywKKyAgICAgICAgICAgICAgICAgIGNoYXIgKiBwX3NlcnZpY2VfbmFtZXNbXSwgVUlOVDggYXBwX2lkKQoreworICAgIHRCVEFfQUdfQVBJX1JFR0lTVEVSICAgICpwX2J1ZjsKKyAgICBpbnQgICAgICAgICAgICAgICAgICAgICBpOworCisgICAgaWYgKChwX2J1ZiA9ICh0QlRBX0FHX0FQSV9SRUdJU1RFUiAqKSBHS0lfZ2V0YnVmKHNpemVvZih0QlRBX0FHX0FQSV9SRUdJU1RFUikpKSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgcF9idWYtPmhkci5ldmVudCA9IEJUQV9BR19BUElfUkVHSVNURVJfRVZUOworICAgICAgICBwX2J1Zi0+ZmVhdHVyZXMgPSBmZWF0dXJlczsKKyAgICAgICAgcF9idWYtPnNlY19tYXNrID0gc2VjX21hc2s7CisgICAgICAgIHBfYnVmLT5zZXJ2aWNlcyA9IHNlcnZpY2VzOworICAgICAgICBwX2J1Zi0+YXBwX2lkID0gYXBwX2lkOworICAgICAgICBmb3IgKGkgPSAwOyBpIDwgQlRBX0FHX05VTV9JRFg7IGkrKykKKyAgICAgICAgeworICAgICAgICAgICAgaWYocF9zZXJ2aWNlX25hbWVzW2ldKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIEJDTV9TVFJOQ1BZX1MocF9idWYtPnBfbmFtZVtpXSwgQlRBX1NFUlZJQ0VfTkFNRV9MRU4rMSwgcF9zZXJ2aWNlX25hbWVzW2ldLCBCVEFfU0VSVklDRV9OQU1FX0xFTik7CisgICAgICAgICAgICAgICAgcF9idWYtPnBfbmFtZVtpXVtCVEFfU0VSVklDRV9OQU1FX0xFTl0gPSAwOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHBfYnVmLT5wX25hbWVbaV1bMF0gPSAwOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGJ0YV9zeXNfc2VuZG1zZyhwX2J1Zik7CisgICAgfQorfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorKioKKyoqIEZ1bmN0aW9uICAgICAgICAgQlRBX0FnRGVyZWdpc3RlcgorKioKKyoqIERlc2NyaXB0aW9uICAgICAgRGVyZWdpc3RlciBhbiBhdWRpbyBnYXRld2F5IHNlcnZpY2UuCisqKgorKioKKyoqIFJldHVybnMgICAgICAgICAgdm9pZAorKioKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit2b2lkIEJUQV9BZ0RlcmVnaXN0ZXIoVUlOVDE2IGhhbmRsZSkKK3sKKyAgICBCVF9IRFIgICpwX2J1ZjsKKworICAgIGlmICgocF9idWYgPSAoQlRfSERSICopIEdLSV9nZXRidWYoc2l6ZW9mKEJUX0hEUikpKSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgcF9idWYtPmV2ZW50ID0gQlRBX0FHX0FQSV9ERVJFR0lTVEVSX0VWVDsKKyAgICAgICAgcF9idWYtPmxheWVyX3NwZWNpZmljID0gaGFuZGxlOworICAgICAgICBidGFfc3lzX3NlbmRtc2cocF9idWYpOworICAgIH0KK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyoqCisqKiBGdW5jdGlvbiAgICAgICAgIEJUQV9BZ09wZW4KKyoqCisqKiBEZXNjcmlwdGlvbiAgICAgIE9wZW5zIGEgY29ubmVjdGlvbiB0byBhIGhlYWRzZXQgb3IgaGFuZHMtZnJlZSBkZXZpY2UuCisqKiAgICAgICAgICAgICAgICAgIFdoZW4gY29ubmVjdGlvbiBpcyBvcGVuIGNhbGxiYWNrIGZ1bmN0aW9uIGlzIGNhbGxlZAorKiogICAgICAgICAgICAgICAgICB3aXRoIGEgQlRBX0FHX09QRU5fRVZULiBPbmx5IHRoZSBkYXRhIGNvbm5lY3Rpb24gaXMKKyoqICAgICAgICAgICAgICAgICAgb3BlbmVkLiBUaGUgYXVkaW8gY29ubmVjdGlvbiBpcyBub3Qgb3BlbmVkLgorKioKKyoqCisqKiBSZXR1cm5zICAgICAgICAgIHZvaWQKKyoqCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordm9pZCBCVEFfQWdPcGVuKFVJTlQxNiBoYW5kbGUsIEJEX0FERFIgYmRfYWRkciwgdEJUQV9TRUMgc2VjX21hc2ssIHRCVEFfU0VSVklDRV9NQVNLIHNlcnZpY2VzKQoreworICAgIHRCVEFfQUdfQVBJX09QRU4gICpwX2J1ZjsKKworICAgIGlmICgocF9idWYgPSAodEJUQV9BR19BUElfT1BFTiAqKSBHS0lfZ2V0YnVmKHNpemVvZih0QlRBX0FHX0FQSV9PUEVOKSkpICE9IE5VTEwpCisgICAgeworICAgICAgICBwX2J1Zi0+aGRyLmV2ZW50ID0gQlRBX0FHX0FQSV9PUEVOX0VWVDsKKyAgICAgICAgcF9idWYtPmhkci5sYXllcl9zcGVjaWZpYyA9IGhhbmRsZTsKKyAgICAgICAgYmRjcHkocF9idWYtPmJkX2FkZHIsIGJkX2FkZHIpOworICAgICAgICBwX2J1Zi0+c2VydmljZXMgPSBzZXJ2aWNlczsKKyAgICAgICAgcF9idWYtPnNlY19tYXNrID0gc2VjX21hc2s7CisgICAgICAgIGJ0YV9zeXNfc2VuZG1zZyhwX2J1Zik7CisgICAgfQorfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorKioKKyoqIEZ1bmN0aW9uICAgICAgICAgQlRBX0FnQ2xvc2UKKyoqCisqKiBEZXNjcmlwdGlvbiAgICAgIENsb3NlIHRoZSBjdXJyZW50IGNvbm5lY3Rpb24gdG8gYSBoZWFkc2V0IG9yIGEgaGFuZHNmcmVlCisqKiAgICAgICAgICAgICAgICAgIEFueSBjdXJyZW50IGF1ZGlvIGNvbm5lY3Rpb24gd2lsbCBhbHNvIGJlIGNsb3NlZC4KKyoqCisqKgorKiogUmV0dXJucyAgICAgICAgICB2b2lkCisqKgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3ZvaWQgQlRBX0FnQ2xvc2UoVUlOVDE2IGhhbmRsZSkKK3sKKyAgICBCVF9IRFIgICpwX2J1ZjsKKworICAgIGlmICgocF9idWYgPSAoQlRfSERSICopIEdLSV9nZXRidWYoc2l6ZW9mKEJUX0hEUikpKSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgcF9idWYtPmV2ZW50ID0gQlRBX0FHX0FQSV9DTE9TRV9FVlQ7CisgICAgICAgIHBfYnVmLT5sYXllcl9zcGVjaWZpYyA9IGhhbmRsZTsKKyAgICAgICAgYnRhX3N5c19zZW5kbXNnKHBfYnVmKTsKKyAgICB9Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisqKgorKiogRnVuY3Rpb24gICAgICAgICBCVEFfQWdBdWRpb09wZW4KKyoqCisqKiBEZXNjcmlwdGlvbiAgICAgIE9wZW5zIGFuIGF1ZGlvIGNvbm5lY3Rpb24gdG8gdGhlIGN1cnJlbnRseSBjb25uZWN0ZWQKKyoqICAgICAgICAgICAgICAgICAgaGVhZHNldCBvciBobmFkc2ZyZWUuCisqKgorKioKKyoqIFJldHVybnMgICAgICAgICAgdm9pZAorKioKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit2b2lkIEJUQV9BZ0F1ZGlvT3BlbihVSU5UMTYgaGFuZGxlKQoreworICAgIEJUX0hEUiAgKnBfYnVmOworCisgICAgaWYgKChwX2J1ZiA9IChCVF9IRFIgKikgR0tJX2dldGJ1ZihzaXplb2YoQlRfSERSKSkpICE9IE5VTEwpCisgICAgeworICAgICAgICBwX2J1Zi0+ZXZlbnQgPSBCVEFfQUdfQVBJX0FVRElPX09QRU5fRVZUOworICAgICAgICBwX2J1Zi0+bGF5ZXJfc3BlY2lmaWMgPSBoYW5kbGU7CisgICAgICAgIGJ0YV9zeXNfc2VuZG1zZyhwX2J1Zik7CisgICAgfQorfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorKioKKyoqIEZ1bmN0aW9uICAgICAgICAgQlRBX0FnQXVkaW9DbG9zZQorKioKKyoqIERlc2NyaXB0aW9uICAgICAgQ2xvc2UgdGhlIGN1cnJlbnRseSBhY3RpdmUgYXVkaW8gY29ubmVjdGlvbiB0byBhIGhlYWRzZXQKKyoqICAgICAgICAgICAgICAgICAgb3IgaG5hZHNmcmVlLiBUaGUgZGF0YSBjb25uZWN0aW9uIHJlbWFpbnMgb3BlbgorKioKKyoqCisqKiBSZXR1cm5zICAgICAgICAgIHZvaWQKKyoqCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordm9pZCBCVEFfQWdBdWRpb0Nsb3NlKFVJTlQxNiBoYW5kbGUpCit7CisgICAgQlRfSERSICAqcF9idWY7CisKKyAgICBpZiAoKHBfYnVmID0gKEJUX0hEUiAqKSBHS0lfZ2V0YnVmKHNpemVvZihCVF9IRFIpKSkgIT0gTlVMTCkKKyAgICB7CisgICAgICAgIHBfYnVmLT5ldmVudCA9IEJUQV9BR19BUElfQVVESU9fQ0xPU0VfRVZUOworICAgICAgICBwX2J1Zi0+bGF5ZXJfc3BlY2lmaWMgPSBoYW5kbGU7CisgICAgICAgIGJ0YV9zeXNfc2VuZG1zZyhwX2J1Zik7CisgICAgfQorfQorCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisqKgorKiogRnVuY3Rpb24gICAgICAgICBCVEFfQWdSZXN1bHQKKyoqCisqKiBEZXNjcmlwdGlvbiAgICAgIFNlbmQgYW4gQVQgcmVzdWx0IGNvZGUgdG8gYSBoZWFkc2V0IG9yIGhhbmRzLWZyZWUgZGV2aWNlLgorKiogICAgICAgICAgICAgICAgICBUaGlzIGZ1bmN0aW9uIGlzIG9ubHkgdXNlZCB3aGVuIHRoZSBBRyBwYXJzZSBtb2RlIGlzIHNldAorKiogICAgICAgICAgICAgICAgICB0byBCVEFfQUdfUEFSU0UuCisqKgorKioKKyoqIFJldHVybnMgICAgICAgICAgdm9pZAorKioKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit2b2lkIEJUQV9BZ1Jlc3VsdChVSU5UMTYgaGFuZGxlLCB0QlRBX0FHX1JFUyByZXN1bHQsIHRCVEFfQUdfUkVTX0RBVEEgKnBfZGF0YSkKK3sKKyAgICB0QlRBX0FHX0FQSV9SRVNVTFQgICpwX2J1ZjsKKworICAgIGlmICgocF9idWYgPSAodEJUQV9BR19BUElfUkVTVUxUICopIEdLSV9nZXRidWYoc2l6ZW9mKHRCVEFfQUdfQVBJX1JFU1VMVCkpKSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgcF9idWYtPmhkci5ldmVudCA9IEJUQV9BR19BUElfUkVTVUxUX0VWVDsKKyAgICAgICAgcF9idWYtPmhkci5sYXllcl9zcGVjaWZpYyA9IGhhbmRsZTsKKyAgICAgICAgcF9idWYtPnJlc3VsdCA9IHJlc3VsdDsKKyAgICAgICAgaWYocF9kYXRhKQorICAgICAgICB7CisgICAgICAgICAgICBtZW1jcHkoJnBfYnVmLT5kYXRhLCBwX2RhdGEsIHNpemVvZihwX2J1Zi0+ZGF0YSkpOworICAgICAgICB9CisgICAgICAgIGJ0YV9zeXNfc2VuZG1zZyhwX2J1Zik7CisgICAgfQorfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorKioKKyoqIEZ1bmN0aW9uICAgICAgICAgQlRBX0FnU2V0Q29kZWMKKyoqCisqKiBEZXNjcmlwdGlvbiAgICAgIFNwZWNpZnkgdGhlIGNvZGVjIHR5cGUgdG8gYmUgdXNlZCBmb3IgdGhlIHN1YnNlcXVlbnQKKyoqICAgICAgICAgICAgICAgICAgYXVkaW8gY29ubmVjdGlvbi4KKyoqCisqKgorKioKKyoqIFJldHVybnMgICAgICAgICAgdm9pZAorKioKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit2b2lkIEJUQV9BZ1NldENvZGVjKFVJTlQxNiBoYW5kbGUsIHRCVEFfQUdfUEVFUl9DT0RFQyBjb2RlYykKK3sKKyAgICB0QlRBX0FHX0FQSV9TRVRDT0RFQyAgICAqcF9idWY7CisKKyAgICBpZiAoKHBfYnVmID0gKHRCVEFfQUdfQVBJX1NFVENPREVDICopIEdLSV9nZXRidWYoc2l6ZW9mKHRCVEFfQUdfQVBJX1NFVENPREVDKSkpICE9IE5VTEwpCisgICAgeworICAgICAgICBwX2J1Zi0+aGRyLmV2ZW50ID0gQlRBX0FHX0FQSV9TRVRDT0RFQ19FVlQ7CisgICAgICAgIHBfYnVmLT5oZHIubGF5ZXJfc3BlY2lmaWMgPSBoYW5kbGU7CisgICAgICAgIHBfYnVmLT5jb2RlYyA9IGNvZGVjOworICAgICAgICBidGFfc3lzX3NlbmRtc2cocF9idWYpOworICAgIH0KK30KKwpkaWZmIC0tZ2l0IGEvYnRhL2hmX2NsaWVudC9idGFfaGZfY2xpZW50X2F0LmMgYi9idGEvaGZfY2xpZW50L2J0YV9oZl9jbGllbnRfYXQuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43NGQzOTQ4Ci0tLSAvZGV2L251bGwKKysrIGIvYnRhL2hmX2NsaWVudC9idGFfaGZfY2xpZW50X2F0LmMKQEAgLTAsMCArMSwyNDMgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCisgKiAgQ29weXJpZ2h0IChDKSAyMDA0LTIwMTIgQnJvYWRjb20gQ29ycG9yYXRpb24KKyAqCisgKiAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdDoKKyAqCisgKiAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgorICogIEJUQSBBRyBBVCBjb21tYW5kIGludGVycHJldGVyLgorICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyNpbmNsdWRlIDxzdHJpbmcuaD4KKyNpbmNsdWRlICJna2kuaCIKKyNpbmNsdWRlICJidGFfYWdfYXQuaCIKKyNpbmNsdWRlICJ1dGwuaCIKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisqKiAgQ29uc3RhbnRzCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorKioKKyoqIEZ1bmN0aW9uICAgICAgICAgYnRhX2FnX2F0X2luaXQKKyoqCisqKiBEZXNjcmlwdGlvbiAgICAgIEluaXRpYWxpemUgdGhlIEFUIGNvbW1hbmQgcGFyc2VyIGNvbnRyb2wgYmxvY2suCisqKgorKioKKyoqIFJldHVybnMgICAgICAgICAgdm9pZAorKioKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3ZvaWQgYnRhX2FnX2F0X2luaXQodEJUQV9BR19BVF9DQiAqcF9jYikKK3sKKyAgICBwX2NiLT5wX2NtZF9idWYgPSBOVUxMOworICAgIHBfY2ItPmNtZF9wb3MgPSAwOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisqKgorKiogRnVuY3Rpb24gICAgICAgICBidGFfYWdfYXRfcmVpbml0CisqKgorKiogRGVzY3JpcHRpb24gICAgICBSZS1pbml0aWFsaXplIHRoZSBBVCBjb21tYW5kIHBhcnNlciBjb250cm9sIGJsb2NrLiAgVGhpcworKiogICAgICAgICAgICAgICAgICBmdW5jdGlvbiByZXNldHMgdGhlIEFUIGNvbW1hbmQgcGFyc2VyIHN0YXRlIGFuZCBmcmVlcworKiogICAgICAgICAgICAgICAgICBhbnkgR0tJIGJ1ZmZlci4KKyoqCisqKgorKiogUmV0dXJucyAgICAgICAgICB2b2lkCisqKgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordm9pZCBidGFfYWdfYXRfcmVpbml0KHRCVEFfQUdfQVRfQ0IgKnBfY2IpCit7CisgICAgaWYgKHBfY2ItPnBfY21kX2J1ZiAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgR0tJX2ZyZWVidWYocF9jYi0+cF9jbWRfYnVmKTsKKyAgICAgICAgcF9jYi0+cF9jbWRfYnVmID0gTlVMTDsKKyAgICB9CisgICAgcF9jYi0+Y21kX3BvcyA9IDA7Cit9CisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisqKgorKiogRnVuY3Rpb24gICAgICAgICBidGFfYWdfcHJvY2Vzc19hdAorKioKKyoqIERlc2NyaXB0aW9uICAgICAgUGFyc2UgQVQgY29tbWFuZHMuICBUaGlzIGZ1bmN0aW9uIHdpbGwgdGFrZSB0aGUgaW5wdXQKKyoqICAgICAgICAgICAgICAgICAgY2hhcmFjdGVyIHN0cmluZyBhbmQgcGFyc2UgaXQgZm9yIEFUIGNvbW1hbmRzIGFjY29yZGluZyB0bworKiogICAgICAgICAgICAgICAgICB0aGUgQVQgY29tbWFuZCB0YWJsZSBwYXNzZWQgaW4gdGhlIGNvbnRyb2wgYmxvY2suCisqKgorKioKKyoqIFJldHVybnMgICAgICAgICAgdm9pZAorKioKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3ZvaWQgYnRhX2FnX3Byb2Nlc3NfYXQodEJUQV9BR19BVF9DQiAqcF9jYikKK3sKKyAgICBVSU5UMTYgICAgICBpZHg7CisgICAgVUlOVDggICAgICAgYXJnX3R5cGU7CisgICAgY2hhciAgICAgICAgKnBfYXJnOworICAgIElOVDE2ICAgICAgIGludF9hcmcgPSAwOworICAgIC8qIGxvb3AgdGhyb3VnaCBhdCBjb21tYW5kIHRhYmxlIGxvb2tpbmcgZm9yIG1hdGNoICovCisgICAgZm9yIChpZHggPSAwOyBwX2NiLT5wX2F0X3RibFtpZHhdLnBfY21kWzBdICE9IDA7IGlkeCsrKQorICAgIHsKKyAgICAgICAgaWYgKCF1dGxfc3RydWNtcChwX2NiLT5wX2F0X3RibFtpZHhdLnBfY21kLCBwX2NiLT5wX2NtZF9idWYpKQorICAgICAgICB7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qIGlmIHRoZXJlIGlzIGEgbWF0Y2g7IHZlcmlmeSBhcmd1bWVudCB0eXBlICovCisgICAgaWYgKHBfY2ItPnBfYXRfdGJsW2lkeF0ucF9jbWRbMF0gIT0gMCkKKyAgICB7CisgICAgICAgIC8qIHN0YXJ0IG9mIGFyZ3VtZW50IGlzIHAgKyBzdHJsZW4gbWF0Y2hpbmcgY29tbWFuZCAqLworICAgICAgICBwX2FyZyA9IHBfY2ItPnBfY21kX2J1ZiArIHN0cmxlbihwX2NiLT5wX2F0X3RibFtpZHhdLnBfY21kKTsKKworICAgICAgICAvKiBpZiBubyBhcmd1bWVudCAqLworICAgICAgICBpZiAocF9hcmdbMF0gPT0gMCkKKyAgICAgICAgeworICAgICAgICAgICAgYXJnX3R5cGUgPSBCVEFfQUdfQVRfTk9ORTsKKyAgICAgICAgfQorICAgICAgICAvKiBlbHNlIGlmIGFyZyBpcyAnPycgYW5kIGl0IGlzIGxhc3QgY2hhcmFjdGVyICovCisgICAgICAgIGVsc2UgaWYgKHBfYXJnWzBdID09ICc/JyAmJiBwX2FyZ1sxXSA9PSAwKQorICAgICAgICB7CisgICAgICAgICAgICAvKiB3ZSBoYXZlIGEgcmVhZCAqLworICAgICAgICAgICAgYXJnX3R5cGUgPSBCVEFfQUdfQVRfUkVBRDsKKyAgICAgICAgfQorICAgICAgICAvKiBlbHNlIGlmIGFyZyBpcyAnPScgKi8KKyAgICAgICAgZWxzZSBpZiAocF9hcmdbMF0gPT0gJz0nICYmIHBfYXJnWzFdICE9IDApCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmIChwX2FyZ1sxXSA9PSAnPycgJiYgcF9hcmdbMl0gPT0gMCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAvKiB3ZSBoYXZlIGEgdGVzdCAqLworICAgICAgICAgICAgICAgIGFyZ190eXBlID0gQlRBX0FHX0FUX1RFU1Q7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgLyogd2UgaGF2ZSBhIHNldCAqLworICAgICAgICAgICAgICAgIGFyZ190eXBlID0gQlRBX0FHX0FUX1NFVDsKKworICAgICAgICAgICAgICAgIC8qIHNraXAgcGFzdCAnPScgKi8KKyAgICAgICAgICAgICAgICBwX2FyZysrOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgLyogZWxzZSBpdCBpcyBmcmVlZm9ybSBhcmd1bWVudCAqLworICAgICAgICB7CisgICAgICAgICAgICBhcmdfdHlwZSA9IEJUQV9BR19BVF9GUkVFOworICAgICAgICB9CisKKyAgICAgICAgLyogaWYgYXJndW1lbnRzIG1hdGNoIGNvbW1hbmQgY2FwYWJpbGl0aWVzICovCisgICAgICAgIGlmICgoYXJnX3R5cGUgJiBwX2NiLT5wX2F0X3RibFtpZHhdLmFyZ190eXBlKSAhPSAwKQorICAgICAgICB7CisgICAgICAgICAgICAvKiBpZiBpdCdzIGEgc2V0IGludGVnZXIgY2hlY2sgbWF4LCBtaW4gcmFuZ2UgKi8KKyAgICAgICAgICAgIGlmIChhcmdfdHlwZSA9PSBCVEFfQUdfQVRfU0VUICYmCisgICAgICAgICAgICAgICAgcF9jYi0+cF9hdF90YmxbaWR4XS5mbXQgPT0gQlRBX0FHX0FUX0lOVCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpbnRfYXJnID0gdXRsX3N0cjJpbnQocF9hcmcpOworICAgICAgICAgICAgICAgIGlmIChpbnRfYXJnIDwgKElOVDE2KSBwX2NiLT5wX2F0X3RibFtpZHhdLm1pbiB8fAorICAgICAgICAgICAgICAgICAgICBpbnRfYXJnID4gKElOVDE2KSBwX2NiLT5wX2F0X3RibFtpZHhdLm1heCkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIC8qIGFyZyBvdXQgb2YgcmFuZ2U7IGVycm9yICovCisgICAgICAgICAgICAgICAgICAgICgqcF9jYi0+cF9lcnJfY2JhY2spKHBfY2ItPnBfdXNlciwgRkFMU0UsIE5VTEwpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgeworCisgICAgICAgICAgICAgICAgICAgICgqcF9jYi0+cF9jbWRfY2JhY2spKHBfY2ItPnBfdXNlciwgaWR4LCBhcmdfdHlwZSwgcF9hcmcsIGludF9hcmcpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAoKnBfY2ItPnBfY21kX2NiYWNrKShwX2NiLT5wX3VzZXIsIGlkeCwgYXJnX3R5cGUsIHBfYXJnLCBpbnRfYXJnKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICAvKiBlbHNlIGVycm9yICovCisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgKCpwX2NiLT5wX2Vycl9jYmFjaykocF9jYi0+cF91c2VyLCBGQUxTRSwgTlVMTCk7CisgICAgICAgIH0KKyAgICB9CisgICAgLyogZWxzZSBubyBtYXRjaCBjYWxsIGVycm9yIGNhbGxiYWNrICovCisgICAgZWxzZQorICAgIHsKKyAgICAgICAgKCpwX2NiLT5wX2Vycl9jYmFjaykocF9jYi0+cF91c2VyLCBUUlVFLCBwX2NiLT5wX2NtZF9idWYpOworICAgIH0KK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorKioKKyoqIEZ1bmN0aW9uICAgICAgICAgYnRhX2FnX2F0X3BhcnNlCisqKgorKiogRGVzY3JpcHRpb24gICAgICBQYXJzZSBBVCBjb21tYW5kcy4gIFRoaXMgZnVuY3Rpb24gd2lsbCB0YWtlIHRoZSBpbnB1dAorKiogICAgICAgICAgICAgICAgICBjaGFyYWN0ZXIgc3RyaW5nIGFuZCBwYXJzZSBpdCBmb3IgQVQgY29tbWFuZHMgYWNjb3JkaW5nIHRvCisqKiAgICAgICAgICAgICAgICAgIHRoZSBBVCBjb21tYW5kIHRhYmxlIHBhc3NlZCBpbiB0aGUgY29udHJvbCBibG9jay4KKyoqCisqKgorKiogUmV0dXJucyAgICAgICAgICB2b2lkCisqKgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordm9pZCBidGFfYWdfYXRfcGFyc2UodEJUQV9BR19BVF9DQiAqcF9jYiwgY2hhciAqcF9idWYsIFVJTlQxNiBsZW4pCit7CisgICAgaW50IGkgPSAwOworICAgIGNoYXIqIHBfc2F2ZTsKKworICAgIGlmIChwX2NiLT5wX2NtZF9idWYgPT0gTlVMTCkKKyAgICB7CisgICAgICAgIHBfY2ItPnBfY21kX2J1ZiA9IChjaGFyICopIEdLSV9nZXRidWYocF9jYi0+Y21kX21heF9sZW4pOworICAgICAgICBwX2NiLT5jbWRfcG9zID0gMDsKKyAgICB9CisKKyAgICBmb3IgKGkgPSAwOyBpIDwgbGVuOykKKyAgICB7CisgICAgICAgIHdoaWxlIChwX2NiLT5jbWRfcG9zIDwgcF9jYi0+Y21kX21heF9sZW4tMSAmJiBpIDwgbGVuKQorICAgICAgICB7CisgICAgICAgICAgICAvKiBTa2lwIG51bGwgY2hhcmFjdGVycyBiZXR3ZWVuIEFUIGNvbW1hbmRzLiAqLworICAgICAgICAgICAgaWYgKChwX2NiLT5jbWRfcG9zID09IDApICYmIChwX2J1ZltpXSA9PSAwKSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpKys7CisgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHBfY2ItPnBfY21kX2J1ZltwX2NiLT5jbWRfcG9zXSA9IHBfYnVmW2krK107CisgICAgICAgICAgICBpZiAoIHBfY2ItPnBfY21kX2J1ZltwX2NiLT5jbWRfcG9zXSA9PSAnXHInIHx8IHBfY2ItPnBfY21kX2J1ZltwX2NiLT5jbWRfcG9zXSA9PSAnXG4nKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHBfY2ItPnBfY21kX2J1ZltwX2NiLT5jbWRfcG9zXSA9IDA7CisgICAgICAgICAgICAgICAgaWYgKChwX2NiLT5jbWRfcG9zID4gMikgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICYmCisgICAgICAgICAgICAgICAgICAgIChwX2NiLT5wX2NtZF9idWZbMF0gPT0gJ0EnIHx8IHBfY2ItPnBfY21kX2J1ZlswXSA9PSAnYScpICYmCisgICAgICAgICAgICAgICAgICAgIChwX2NiLT5wX2NtZF9idWZbMV0gPT0gJ1QnIHx8IHBfY2ItPnBfY21kX2J1ZlsxXSA9PSAndCcpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcF9zYXZlID0gcF9jYi0+cF9jbWRfYnVmOworICAgICAgICAgICAgICAgICAgICBwX2NiLT5wX2NtZF9idWYgKz0gMjsKKyAgICAgICAgICAgICAgICAgICAgYnRhX2FnX3Byb2Nlc3NfYXQocF9jYik7CisgICAgICAgICAgICAgICAgICAgIHBfY2ItPnBfY21kX2J1ZiA9IHBfc2F2ZTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBwX2NiLT5jbWRfcG9zID0gMDsKKworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZSBpZiggcF9jYi0+cF9jbWRfYnVmW3BfY2ItPmNtZF9wb3NdID09IDB4MUEgfHwgcF9jYi0+cF9jbWRfYnVmW3BfY2ItPmNtZF9wb3NdID09IDB4MUIgKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHBfY2ItPnBfY21kX2J1ZlsrK3BfY2ItPmNtZF9wb3NdID0gMDsKKyAgICAgICAgICAgICAgICAoKnBfY2ItPnBfZXJyX2NiYWNrKShwX2NiLT5wX3VzZXIsIFRSVUUsIHBfY2ItPnBfY21kX2J1Zik7CisgICAgICAgICAgICAgICAgcF9jYi0+Y21kX3BvcyA9IDA7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgKytwX2NiLT5jbWRfcG9zOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgaWYgKGkgPCBsZW4pCisgICAgICAgICAgICBwX2NiLT5jbWRfcG9zID0gMDsKKyAgICB9Cit9CisKZGlmZiAtLWdpdCBhL2J0YS9oZl9jbGllbnQvYnRhX2hmX2NsaWVudF9hdC5oIGIvYnRhL2hmX2NsaWVudC9idGFfaGZfY2xpZW50X2F0LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTBkN2IwZgotLS0gL2Rldi9udWxsCisrKyBiL2J0YS9oZl9jbGllbnQvYnRhX2hmX2NsaWVudF9hdC5oCkBAIC0wLDAgKzEsMTIxIEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgorICogIENvcHlyaWdodCAoQykgMjAwNC0yMDEyIEJyb2FkY29tIENvcnBvcmF0aW9uCisgKgorICogIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQ6CisgKgorICogIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoKKyAqICBJbnRlcmZhY2UgZmlsZSBmb3IgQlRBIEFHIEFUIGNvbW1hbmQgaW50ZXJwcmV0ZXIuCisgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNpZm5kZWYgQlRBX0FHX0FUX0gKKyNkZWZpbmUgQlRBX0FHX0FUX0gKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisqKiAgQ29uc3RhbnRzCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworLyogQVQgY29tbWFuZCBhcmd1bWVudCBjYXBhYmlsaXRpZXMgKi8KKyNkZWZpbmUgQlRBX0FHX0FUX05PTkUgICAgICAgICAgMHgwMSAgICAgICAgLyogbm8gYXJndW1lbnQgKi8KKyNkZWZpbmUgQlRBX0FHX0FUX1NFVCAgICAgICAgICAgMHgwMiAgICAgICAgLyogc2V0IHZhbHVlICovCisjZGVmaW5lIEJUQV9BR19BVF9SRUFEICAgICAgICAgIDB4MDQgICAgICAgIC8qIHJlYWQgdmFsdWUgKi8KKyNkZWZpbmUgQlRBX0FHX0FUX1RFU1QgICAgICAgICAgMHgwOCAgICAgICAgLyogdGVzdCB2YWx1ZSByYW5nZSAqLworI2RlZmluZSBCVEFfQUdfQVRfRlJFRSAgICAgICAgICAweDEwICAgICAgICAvKiBmcmVlZm9ybSBhcmd1bWVudCAqLworCisvKiBBVCBjb21tYW5kIGFyZ3VtZW50IGZvcm1hdCAqLworI2RlZmluZSBCVEFfQUdfQVRfU1RSICAgICAgICAgICAwICAgICAgICAgICAvKiBzdHJpbmcgKi8KKyNkZWZpbmUgQlRBX0FHX0FUX0lOVCAgICAgICAgICAgMSAgICAgICAgICAgLyogaW50ZWdlciAqLworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyoqICBEYXRhIHR5cGVzCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworLyogQVQgY29tbWFuZCB0YWJsZSBlbGVtZW50ICovCit0eXBlZGVmIHN0cnVjdAoreworICAgIGNvbnN0IGNoYXIgICpwX2NtZDsgICAgICAgICAvKiBBVCBjb21tYW5kIHN0cmluZyAqLworICAgIFVJTlQ4ICAgICAgIGFyZ190eXBlOyAgICAgICAvKiBhbGxvd2FibGUgYXJndW1lbnQgdHlwZSBzeW50YXggKi8KKyAgICBVSU5UOCAgICAgICBmbXQ7ICAgICAgICAgICAgLyogd2hldGhlciBhcmcgaXMgaW50IG9yIHN0cmluZyAqLworICAgIFVJTlQ4ICAgICAgIG1pbjsgICAgICAgICAgICAvKiBtaW5pbXVtIHZhbHVlIGZvciBpbnQgYXJnICovCisgICAgSU5UMTYgICAgICAgbWF4OyAgICAgICAgICAgIC8qIG1heGltdW0gdmFsdWUgZm9yIGludCBhcmcgKi8KK30gdEJUQV9BR19BVF9DTUQ7CisKKy8qIGNhbGxiYWNrIGZ1bmN0aW9uIGV4ZWN1dGVkIHdoZW4gY29tbWFuZCBpcyBwYXJzZWQgKi8KK3R5cGVkZWYgdm9pZCAodEJUQV9BR19BVF9DTURfQ0JBQ0spKHZvaWQgKnBfdXNlciwgVUlOVDE2IGNtZCwgVUlOVDggYXJnX3R5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaGFyICpwX2FyZywgSU5UMTYgaW50X2FyZyk7CisKKy8qIGNhbGxiYWNrIGZ1bmN0aW9uIGV4ZWN1dGVkIHRvIHNlbmQgIkVSUk9SIiByZXN1bHQgY29kZSAqLwordHlwZWRlZiB2b2lkICh0QlRBX0FHX0FUX0VSUl9DQkFDSykodm9pZCAqcF91c2VyLCBCT09MRUFOIHVua25vd24sIGNoYXIgKnBfYXJnKTsKKworLyogQVQgY29tbWFuZCBwYXJzaW5nIGNvbnRyb2wgYmxvY2sgKi8KK3R5cGVkZWYgc3RydWN0Cit7CisgICAgdEJUQV9BR19BVF9DTUQgICAgICAgICAgKnBfYXRfdGJsOyAgICAgIC8qIEFUIGNvbW1hbmQgdGFibGUgKi8KKyAgICB0QlRBX0FHX0FUX0NNRF9DQkFDSyAgICAqcF9jbWRfY2JhY2s7ICAgLyogY29tbWFuZCBjYWxsYmFjayAqLworICAgIHRCVEFfQUdfQVRfRVJSX0NCQUNLICAgICpwX2Vycl9jYmFjazsgICAvKiBlcnJvciBjYWxsYmFjayAqLworICAgIHZvaWQgICAgICAgICAgICAgICAgICAgICpwX3VzZXI7ICAgICAgICAvKiB1c2VyLWRlZmluZWQgZGF0YSAqLworICAgIGNoYXIgICAgICAgICAgICAgICAgICAgICpwX2NtZF9idWY7ICAgICAvKiB0ZW1wIHBhcnNpbmcgYnVmZmVyICovCisgICAgVUlOVDE2ICAgICAgICAgICAgICAgICAgY21kX3BvczsgICAgICAgIC8qIHBvc2l0aW9uIGluIHRlbXAgYnVmZmVyICovCisgICAgVUlOVDE2ICAgICAgICAgICAgICAgICAgY21kX21heF9sZW47ICAgIC8qIGxlbmd0aCBvZiB0ZW1wIGJ1ZmZlciB0byBhbGxvY2F0ZSAqLworICAgIFVJTlQ4ICAgICAgICAgICAgICAgICAgIHN0YXRlOyAgICAgICAgICAvKiBwYXJzaW5nIHN0YXRlICovCit9IHRCVEFfQUdfQVRfQ0I7CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorKiogIEZ1bmN0aW9uIHByb3RvdHlwZXMKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyoqCisqKiBGdW5jdGlvbiAgICAgICAgIGJ0YV9hZ19hdF9pbml0CisqKgorKiogRGVzY3JpcHRpb24gICAgICBJbml0aWFsaXplIHRoZSBBVCBjb21tYW5kIHBhcnNlciBjb250cm9sIGJsb2NrLgorKioKKyoqCisqKiBSZXR1cm5zICAgICAgICAgIHZvaWQKKyoqCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2V4dGVybiB2b2lkIGJ0YV9hZ19hdF9pbml0KHRCVEFfQUdfQVRfQ0IgKnBfY2IpOworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyoqCisqKiBGdW5jdGlvbiAgICAgICAgIGJ0YV9hZ19hdF9yZWluaXQKKyoqCisqKiBEZXNjcmlwdGlvbiAgICAgIFJlLWluaXRpYWxpemUgdGhlIEFUIGNvbW1hbmQgcGFyc2VyIGNvbnRyb2wgYmxvY2suICBUaGlzCisqKiAgICAgICAgICAgICAgICAgIGZ1bmN0aW9uIHJlc2V0cyB0aGUgQVQgY29tbWFuZCBwYXJzZXIgc3RhdGUgYW5kIGZyZWVzCisqKiAgICAgICAgICAgICAgICAgIGFueSBHS0kgYnVmZmVyLgorKioKKyoqCisqKiBSZXR1cm5zICAgICAgICAgIHZvaWQKKyoqCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2V4dGVybiB2b2lkIGJ0YV9hZ19hdF9yZWluaXQodEJUQV9BR19BVF9DQiAqcF9jYik7CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorKioKKyoqIEZ1bmN0aW9uICAgICAgICAgYnRhX2FnX2F0X3BhcnNlCisqKgorKiogRGVzY3JpcHRpb24gICAgICBQYXJzZSBBVCBjb21tYW5kcy4gIFRoaXMgZnVuY3Rpb24gd2lsbCB0YWtlIHRoZSBpbnB1dAorKiogICAgICAgICAgICAgICAgICBjaGFyYWN0ZXIgc3RyaW5nIGFuZCBwYXJzZSBpdCBmb3IgQVQgY29tbWFuZHMgYWNjb3JkaW5nIHRvCisqKiAgICAgICAgICAgICAgICAgIHRoZSBBVCBjb21tYW5kIHRhYmxlIHBhc3NlZCBpbiB0aGUgY29udHJvbCBibG9jay4KKyoqCisqKgorKiogUmV0dXJucyAgICAgICAgICB2b2lkCisqKgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitleHRlcm4gdm9pZCBidGFfYWdfYXRfcGFyc2UodEJUQV9BR19BVF9DQiAqcF9jYiwgY2hhciAqcF9idWYsIFVJTlQxNiBsZW4pOworCisjZW5kaWYgLyogQlRBX0FHX0FUX0ggKi8KKwpkaWZmIC0tZ2l0IGEvYnRhL2hmX2NsaWVudC9idGFfaGZfY2xpZW50X2NtZC5jIGIvYnRhL2hmX2NsaWVudC9idGFfaGZfY2xpZW50X2NtZC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjU0Y2Q0ZDMKLS0tIC9kZXYvbnVsbAorKysgYi9idGEvaGZfY2xpZW50L2J0YV9oZl9jbGllbnRfY21kLmMKQEAgLTAsMCArMSwxODQzIEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgorICogIENvcHlyaWdodCAoQykgMjAwNC0yMDEyIEJyb2FkY29tIENvcnBvcmF0aW9uCisgKgorICogIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQ6CisgKgorICogIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoKKyAqICBUaGlzIGZpbGUgY29udGFpbnMgZnVuY3Rpb25zIGZvciBwcm9jZXNzaW5nIEFUIGNvbW1hbmRzIGFuZCByZXN1bHRzLgorICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyNpbmNsdWRlICJidGFfYXBpLmgiCisjaW5jbHVkZSAiYnRhX3N5cy5oIgorI2luY2x1ZGUgImJ0YV9hZ19hcGkuaCIKKyNpbmNsdWRlICJidGFfYWdfaW50LmgiCisjaW5jbHVkZSAiYnRhX2FnX2F0LmgiCisjaW5jbHVkZSAicG9ydF9hcGkuaCIKKyNpbmNsdWRlICJ1dGwuaCIKKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgPHN0cmluZy5oPgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyoqICBDb25zdGFudHMKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisvKiByaW5nIHRpbWVvdXQgKi8KKyNkZWZpbmUgQlRBX0FHX1JJTkdfVE9VVCAgICAgICAgNTAwMAorCisjZGVmaW5lIEJUQV9BR19DTURfTUFYX1ZBTCAgICAgIDMyNzY3ICAvKiBNYXhpbXVtIHZhbHVlIGlzIHNpZ25lZCAxNi1iaXQgdmFsdWUgKi8KKworCisKKy8qIGNsaXAgdHlwZSBjb25zdGFudHMgKi8KKyNkZWZpbmUgQlRBX0FHX0NMSVBfVFlQRV9NSU4gICAgICAgIDEyOAorI2RlZmluZSBCVEFfQUdfQ0xJUF9UWVBFX01BWCAgICAgICAgMTc1CisjZGVmaW5lIEJUQV9BR19DTElQX1RZUEVfREVGQVVMVCAgICAxMjkKKyNkZWZpbmUgQlRBX0FHX0NMSVBfVFlQRV9WT0lQICAgICAgIDI1NQorCisjaWYgZGVmaW5lZChCVEFfQUdfTVVMVElfUkVTVUxUX0lOQ0xVREVEKSAmJiAoQlRBX0FHX01VTFRJX1JFU1VMVF9JTkNMVURFRCA9PSBUUlVFKQorI2RlZmluZSBCVEFfQUdfQVRfTVVMVElfTEVOICAgICAgICAgICAgMgorI2RlZmluZSBBVF9TRVRfUkVTX0NCKHJlc19jYiwgYywgcCwgaSkge3Jlc19jYi5jb2RlID0gYzsgcmVzX2NiLnBfYXJnID0gcDsgcmVzX2NiLmludF9hcmcgPSBpO30KKworLyogdHlwZSBmb3IgQVQgcmVzdWx0IGNvZGUgYmxvY2sgKi8KK3R5cGVkZWYgc3RydWN0Cit7CisgICAgVUlOVDggY29kZTsKKyAgICBjaGFyICpwX2FyZzsKKyAgICBJTlQxNiBpbnRfYXJnOworfSB0QlRBX0FHX1JFU1VMVF9DQjsKKworLyogdHlwZSBmb3IgbXVsdGlwbGUgQVQgcmVzdWx0IGNvZGVzIGJsb2NrICovCit0eXBlZGVmIHN0cnVjdAoreworICAgIFVJTlQ4IG51bV9yZXN1bHQ7CisgICAgdEJUQV9BR19SRVNVTFRfQ0IgcmVzX2NiW0JUQV9BR19BVF9NVUxUSV9MRU5dOworfSB0QlRBX0FHX01VTFRJX1JFU1VMVF9DQjsKKyNlbmRpZgorCisvKiBlbnVtZXJhdGlvbiBvZiBIU1AgQVQgY29tbWFuZHMgbWF0Y2hlcyBIU1AgY29tbWFuZCBpbnRlcnByZXRlciB0YWJsZSAqLworZW51bQoreworICAgIEJUQV9BR19IU19DTURfQ0tQRCwKKyAgICBCVEFfQUdfSFNfQ01EX1ZHUywKKyAgICBCVEFfQUdfSFNfQ01EX1ZHTQorfTsKKworLyogZW51bWVyYXRpb24gb2YgSEZQIEFUIGNvbW1hbmRzIG1hdGNoZXMgSEZQIGNvbW1hbmQgaW50ZXJwcmV0ZXIgdGFibGUgKi8KK2VudW0KK3sKKyAgICBCVEFfQUdfSEZfQ01EX0EsCisgICAgQlRBX0FHX0hGX0NNRF9ELAorICAgIEJUQV9BR19IRl9DTURfVkdTLAorICAgIEJUQV9BR19IRl9DTURfVkdNLAorICAgIEJUQV9BR19IRl9DTURfQ0NXQSwKKyAgICBCVEFfQUdfSEZfQ01EX0NITEQsCisgICAgQlRBX0FHX0hGX0NNRF9DSFVQLAorICAgIEJUQV9BR19IRl9DTURfQ0lORCwKKyAgICBCVEFfQUdfSEZfQ01EX0NMSVAsCisgICAgQlRBX0FHX0hGX0NNRF9DTUVSLAorICAgIEJUQV9BR19IRl9DTURfVlRTLAorICAgIEJUQV9BR19IRl9DTURfQklOUCwKKyAgICBCVEFfQUdfSEZfQ01EX0JMRE4sCisgICAgQlRBX0FHX0hGX0NNRF9CVlJBLAorICAgIEJUQV9BR19IRl9DTURfQlJTRiwKKyAgICBCVEFfQUdfSEZfQ01EX05SRUMsCisgICAgQlRBX0FHX0hGX0NNRF9DTlVNLAorICAgIEJUQV9BR19IRl9DTURfQlRSSCwKKyAgICBCVEFfQUdfSEZfQ01EX0NMQ0MsCisgICAgQlRBX0FHX0hGX0NNRF9DT1BTLAorICAgIEJUQV9BR19IRl9DTURfQ01FRSwKKyAgICBCVEFfQUdfSEZfQ01EX0JJQSwKKyAgICBCVEFfQUdfSEZfQ01EX0NCQywKKyAgICBCVEFfQUdfSEZfQ01EX0JDQywKKyAgICBCVEFfQUdfSEZfQ01EX0JDUywKKyAgICBCVEFfQUdfSEZfQ01EX0JBQworfTsKKworLyogQVQgY29tbWFuZCBpbnRlcnByZXRlciB0YWJsZSBmb3IgSFNQICovCitjb25zdCB0QlRBX0FHX0FUX0NNRCBidGFfYWdfaHNwX2NtZFtdID0KK3sKKyAgICB7IitDS1BEIiwgICBCVEFfQUdfQVRfU0VULCAgICAgICAgICAgICAgICAgICAgICBCVEFfQUdfQVRfSU5ULCAyMDAsIDIwMH0sCisgICAgeyIrVkdTIiwgICAgQlRBX0FHX0FUX1NFVCwgICAgICAgICAgICAgICAgICAgICAgQlRBX0FHX0FUX0lOVCwgICAwLCAgMTV9LAorICAgIHsiK1ZHTSIsICAgIEJUQV9BR19BVF9TRVQsICAgICAgICAgICAgICAgICAgICAgIEJUQV9BR19BVF9JTlQsICAgMCwgIDE1fSwKKyAgICB7IiIsICAgICAgICBCVEFfQUdfQVRfTk9ORSwgICAgICAgICAgICAgICAgICAgICBCVEFfQUdfQVRfU1RSLCAgIDAsICAgMH0KK307CisKKy8qIEFUIGNvbW1hbmQgaW50ZXJwcmV0ZXIgdGFibGUgZm9yIEhGUCAqLworY29uc3QgdEJUQV9BR19BVF9DTUQgYnRhX2FnX2hmcF9jbWRbXSA9Cit7CisgICAgeyJBIiwgICAgICAgQlRBX0FHX0FUX05PTkUsICAgICAgICAgICAgICAgICAgICAgQlRBX0FHX0FUX1NUUiwgICAwLCAgIDB9LAorICAgIHsiRCIsICAgICAgIChCVEFfQUdfQVRfTk9ORSB8IEJUQV9BR19BVF9GUkVFKSwgIEJUQV9BR19BVF9TVFIsICAgMCwgICAwfSwKKyAgICB7IitWR1MiLCAgICBCVEFfQUdfQVRfU0VULCAgICAgICAgICAgICAgICAgICAgICBCVEFfQUdfQVRfSU5ULCAgIDAsICAxNX0sCisgICAgeyIrVkdNIiwgICAgQlRBX0FHX0FUX1NFVCwgICAgICAgICAgICAgICAgICAgICAgQlRBX0FHX0FUX0lOVCwgICAwLCAgMTV9LAorICAgIHsiK0NDV0EiLCAgIEJUQV9BR19BVF9TRVQsICAgICAgICAgICAgICAgICAgICAgIEJUQV9BR19BVF9JTlQsICAgMCwgICAxfSwKKyAgICAvKiBDb25zaWRlciBDSExEIGFzIHN0ciB0byB0YWtlIGNhcmUgb2YgaW5kZXhlcyBmb3IgRUNDICovCisgICAgeyIrQ0hMRCIsICAgKEJUQV9BR19BVF9TRVQgfCBCVEFfQUdfQVRfVEVTVCksICAgQlRBX0FHX0FUX1NUUiwgICAwLCAgIDR9LAorICAgIHsiK0NIVVAiLCAgIEJUQV9BR19BVF9OT05FLCAgICAgICAgICAgICAgICAgICAgIEJUQV9BR19BVF9TVFIsICAgMCwgICAwfSwKKyAgICB7IitDSU5EIiwgICAoQlRBX0FHX0FUX1JFQUQgfCBCVEFfQUdfQVRfVEVTVCksICBCVEFfQUdfQVRfU1RSLCAgIDAsICAgMH0sCisgICAgeyIrQ0xJUCIsICAgQlRBX0FHX0FUX1NFVCwgICAgICAgICAgICAgICAgICAgICAgQlRBX0FHX0FUX0lOVCwgICAwLCAgIDF9LAorICAgIHsiK0NNRVIiLCAgIEJUQV9BR19BVF9TRVQsICAgICAgICAgICAgICAgICAgICAgIEJUQV9BR19BVF9TVFIsICAgMCwgICAwfSwKKyAgICB7IitWVFMiLCAgICBCVEFfQUdfQVRfU0VULCAgICAgICAgICAgICAgICAgICAgICBCVEFfQUdfQVRfU1RSLCAgIDAsICAgMH0sCisgICAgeyIrQklOUCIsICAgQlRBX0FHX0FUX1NFVCwgICAgICAgICAgICAgICAgICAgICAgQlRBX0FHX0FUX0lOVCwgICAxLCAgIDF9LAorICAgIHsiK0JMRE4iLCAgIEJUQV9BR19BVF9OT05FLCAgICAgICAgICAgICAgICAgICAgIEJUQV9BR19BVF9TVFIsICAgMCwgICAwfSwKKyAgICB7IitCVlJBIiwgICBCVEFfQUdfQVRfU0VULCAgICAgICAgICAgICAgICAgICAgICBCVEFfQUdfQVRfSU5ULCAgIDAsICAgMX0sCisgICAgeyIrQlJTRiIsICAgQlRBX0FHX0FUX1NFVCwgICAgICAgICAgICAgICAgICAgICAgQlRBX0FHX0FUX0lOVCwgICAwLCAgIEJUQV9BR19DTURfTUFYX1ZBTH0sCisgICAgeyIrTlJFQyIsICAgQlRBX0FHX0FUX1NFVCwgICAgICAgICAgICAgICAgICAgICAgQlRBX0FHX0FUX0lOVCwgICAwLCAgIDB9LAorICAgIHsiK0NOVU0iLCAgIEJUQV9BR19BVF9OT05FLCAgICAgICAgICAgICAgICAgICAgIEJUQV9BR19BVF9TVFIsICAgMCwgICAwfSwKKyAgICB7IitCVFJIIiwgICAoQlRBX0FHX0FUX1JFQUQgfCBCVEFfQUdfQVRfU0VUKSwgICBCVEFfQUdfQVRfSU5ULCAgIDAsICAgMn0sCisgICAgeyIrQ0xDQyIsICAgQlRBX0FHX0FUX05PTkUsICAgICAgICAgICAgICAgICAgICAgQlRBX0FHX0FUX1NUUiwgICAwLCAgIDB9LAorICAgIHsiK0NPUFMiLCAgIChCVEFfQUdfQVRfUkVBRCB8IEJUQV9BR19BVF9TRVQpLCAgIEJUQV9BR19BVF9TVFIsICAgMCwgICAwfSwKKyAgICB7IitDTUVFIiwgICBCVEFfQUdfQVRfU0VULCAgICAgICAgICAgICAgICAgICAgICBCVEFfQUdfQVRfSU5ULCAgIDAsICAgMX0sCisgICAgeyIrQklBIiwgICAgQlRBX0FHX0FUX1NFVCwgICAgICAgICAgICAgICAgICAgICAgQlRBX0FHX0FUX1NUUiwgICAwLCAgIDIwfSwKKyAgICB7IitDQkMiLCAgICBCVEFfQUdfQVRfU0VULCAgICAgICAgICAgICAgICAgICAgICBCVEFfQUdfQVRfSU5ULCAgIDAsICAgMTAwfSwKKyAgICB7IitCQ0MiLCAgICBCVEFfQUdfQVRfTk9ORSwgICAgICAgICAgICAgICAgICAgICBCVEFfQUdfQVRfU1RSLCAgIDAsICAgMH0sCisgICAgeyIrQkNTIiwgICAgQlRBX0FHX0FUX1NFVCwgICAgICAgICAgICAgICAgICAgICAgQlRBX0FHX0FUX0lOVCwgICAwLCAgIEJUQV9BR19DTURfTUFYX1ZBTH0sCisgICAgeyIrQkFDIiwgICAgQlRBX0FHX0FUX1NFVCwgICAgICAgICAgICAgICAgICAgICAgQlRBX0FHX0FUX1NUUiwgICAwLCAgIDB9LAorICAgIHsiIiwgICAgICAgIEJUQV9BR19BVF9OT05FLCAgICAgICAgICAgICAgICAgICAgIEJUQV9BR19BVF9TVFIsICAgMCwgICAwfQorfTsKKworLyogQVQgcmVzdWx0IGNvZGUgdGFibGUgZWxlbWVudCAqLwordHlwZWRlZiBzdHJ1Y3QKK3sKKyAgICBjb25zdCBjaGFyICAqcF9yZXM7ICAgICAgICAgLyogQVQgcmVzdWx0IHN0cmluZyAqLworICAgIFVJTlQ4ICAgICAgIGZtdDsgICAgICAgICAgICAvKiB3aGV0aGVyIGFyZ3VtZW50IGlzIGludCBvciBzdHJpbmcgKi8KK30gdEJUQV9BR19SRVNVTFQ7CisKKy8qIEFUIHJlc3VsdCBjb2RlIGFyZ3VtZW50IHR5cGVzICovCitlbnVtCit7CisgICAgQlRBX0FHX1JFU19GTVRfTk9ORSwgICAgICAgLyogbm8gYXJndW1lbnQgKi8KKyAgICBCVEFfQUdfUkVTX0ZNVF9JTlQsICAgICAgICAvKiBpbnRlZ2VyIGFyZ3VtZW50ICovCisgICAgQlRBX0FHX1JFU19GTVRfU1RSICAgICAgICAgLyogc3RyaW5nIGFyZ3VtZW50ICovCit9OworCisvKiBlbnVtZXJhdGlvbiBvZiBBVCByZXN1bHQgY29kZXMsIG1hdGNoZXMgY29uc3RhbnQgdGFibGUgKi8KK2VudW0KK3sKKyAgICBCVEFfQUdfUkVTX09LLAorICAgIEJUQV9BR19SRVNfRVJST1IsCisgICAgQlRBX0FHX1JFU19SSU5HLAorICAgIEJUQV9BR19SRVNfVkdTLAorICAgIEJUQV9BR19SRVNfVkdNLAorICAgIEJUQV9BR19SRVNfQ0NXQSwKKyAgICBCVEFfQUdfUkVTX0NITEQsCisgICAgQlRBX0FHX1JFU19DSU5ELAorICAgIEJUQV9BR19SRVNfQ0xJUCwKKyAgICBCVEFfQUdfUkVTX0NJRVYsCisgICAgQlRBX0FHX1JFU19CSU5QLAorICAgIEJUQV9BR19SRVNfQlZSQSwKKyAgICBCVEFfQUdfUkVTX0JSU0YsCisgICAgQlRBX0FHX1JFU19CU0lSLAorICAgIEJUQV9BR19SRVNfQ05VTSwKKyAgICBCVEFfQUdfUkVTX0JUUkgsCisgICAgQlRBX0FHX1JFU19DTENDLAorICAgIEJUQV9BR19SRVNfQ09QUywKKyAgICBCVEFfQUdfUkVTX0NNRUUsCisgICAgQlRBX0FHX1JFU19CQ1MsCisgICAgQlRBX0FHX1JFU19VTkFUCit9OworCisjaWYgZGVmaW5lZChCVEFfSFNQX1JFU1VMVF9SRVBMQUNFX0NPTE9OKSAmJiAoQlRBX0hTUF9SRVNVTFRfUkVQTEFDRV9DT0xPTiA9PSBUUlVFKQorI2RlZmluZSBDT0xPTl9JRFhfNF9WR1NWR00gICAgNAorI2VuZGlmCisvKiBBVCByZXN1bHQgY29kZSBjb25zdGFudCB0YWJsZSAgKEluZGV4ZWQgYnkgcmVzdWx0IGNvZGUpICovCitjb25zdCB0QlRBX0FHX1JFU1VMVCBidGFfYWdfcmVzdWx0X3RibFtdID0KK3sKKyAgICB7Ik9LIiwgICAgICBCVEFfQUdfUkVTX0ZNVF9OT05FfSwKKyAgICB7IkVSUk9SIiwgICBCVEFfQUdfUkVTX0ZNVF9OT05FfSwKKyAgICB7IlJJTkciLCAgICBCVEFfQUdfUkVTX0ZNVF9OT05FfSwKKyAgICB7IitWR1M6ICIsICBCVEFfQUdfUkVTX0ZNVF9JTlR9LAorICAgIHsiK1ZHTTogIiwgIEJUQV9BR19SRVNfRk1UX0lOVH0sCisgICAgeyIrQ0NXQTogIiwgQlRBX0FHX1JFU19GTVRfU1RSfSwKKyAgICB7IitDSExEOiAiLCBCVEFfQUdfUkVTX0ZNVF9TVFJ9LAorICAgIHsiK0NJTkQ6ICIsIEJUQV9BR19SRVNfRk1UX1NUUn0sCisgICAgeyIrQ0xJUDogIiwgQlRBX0FHX1JFU19GTVRfU1RSfSwKKyAgICB7IitDSUVWOiAiLCBCVEFfQUdfUkVTX0ZNVF9TVFJ9LAorICAgIHsiK0JJTlA6ICIsIEJUQV9BR19SRVNfRk1UX1NUUn0sCisgICAgeyIrQlZSQTogIiwgQlRBX0FHX1JFU19GTVRfSU5UfSwKKyAgICB7IitCUlNGOiAiLCBCVEFfQUdfUkVTX0ZNVF9JTlR9LAorICAgIHsiK0JTSVI6ICIsIEJUQV9BR19SRVNfRk1UX0lOVH0sCisgICAgeyIrQ05VTTogIiwgQlRBX0FHX1JFU19GTVRfU1RSfSwKKyAgICB7IitCVFJIOiAiLCBCVEFfQUdfUkVTX0ZNVF9JTlR9LAorICAgIHsiK0NMQ0M6ICIsIEJUQV9BR19SRVNfRk1UX1NUUn0sCisgICAgeyIrQ09QUzogIiwgQlRBX0FHX1JFU19GTVRfU1RSfSwKKyAgICB7IitDTUUgRVJST1I6ICIsIEJUQV9BR19SRVNfRk1UX0lOVH0sCisgICAgeyIrQkNTOiAiLCAgQlRBX0FHX1JFU19GTVRfSU5UfSwKKyAgICB7IiIsICAgICAgICBCVEFfQUdfUkVTX0ZNVF9TVFJ9Cit9OworCitjb25zdCB0QlRBX0FHX0FUX0NNRCAqYnRhX2FnX2F0X3RibFtCVEFfQUdfTlVNX0lEWF0gPQoreworICAgIGJ0YV9hZ19oc3BfY21kLAorICAgIGJ0YV9hZ19oZnBfY21kCit9OworCisvKiBjYWxsYmFjayBldmVudCBsb29rdXAgdGFibGUgZm9yIEhTUCAqLworY29uc3QgdEJUQV9BR19FVlQgYnRhX2FnX2hzcF9jYl9ldnRbXSA9Cit7CisgICAgQlRBX0FHX0FUX0NLUERfRVZULCAgICAgLyogQlRBX0FHX0hTX0NNRF9DS1BEICovCisgICAgQlRBX0FHX1NQS19FVlQsICAgICAgICAgLyogQlRBX0FHX0hTX0NNRF9WR1MgKi8KKyAgICBCVEFfQUdfTUlDX0VWVCAgICAgICAgICAvKiBCVEFfQUdfSFNfQ01EX1ZHTSAqLworfTsKKworLyogY2FsbGJhY2sgZXZlbnQgbG9va3VwIHRhYmxlIGZvciBIRlAgIChJbmRleGVkIGJ5IGNvbW1hbmQpICovCitjb25zdCB0QlRBX0FHX0VWVCBidGFfYWdfaGZwX2NiX2V2dFtdID0KK3sKKyAgICBCVEFfQUdfQVRfQV9FVlQsICAgICAgICAvKiBCVEFfQUdfSEZfQ01EX0EgKi8KKyAgICBCVEFfQUdfQVRfRF9FVlQsICAgICAgICAvKiBCVEFfQUdfSEZfQ01EX0QgKi8KKyAgICBCVEFfQUdfU1BLX0VWVCwgICAgICAgICAvKiBCVEFfQUdfSEZfQ01EX1ZHUyAqLworICAgIEJUQV9BR19NSUNfRVZULCAgICAgICAgIC8qIEJUQV9BR19IRl9DTURfVkdNICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgLyogQlRBX0FHX0hGX0NNRF9DQ1dBICovCisgICAgQlRBX0FHX0FUX0NITERfRVZULCAgICAgLyogQlRBX0FHX0hGX0NNRF9DSExEICovCisgICAgQlRBX0FHX0FUX0NIVVBfRVZULCAgICAgLyogQlRBX0FHX0hGX0NNRF9DSFVQICovCisgICAgQlRBX0FHX0FUX0NJTkRfRVZULCAgICAgLyogQlRBX0FHX0hGX0NNRF9DSU5EICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgLyogQlRBX0FHX0hGX0NNRF9DTElQICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgLyogQlRBX0FHX0hGX0NNRF9DTUVSICovCisgICAgQlRBX0FHX0FUX1ZUU19FVlQsICAgICAgLyogQlRBX0FHX0hGX0NNRF9WVFMgKi8KKyAgICBCVEFfQUdfQVRfQklOUF9FVlQsICAgICAvKiBCVEFfQUdfSEZfQ01EX0JJTlAgKi8KKyAgICBCVEFfQUdfQVRfQkxETl9FVlQsICAgICAvKiBCVEFfQUdfSEZfQ01EX0JMRE4gKi8KKyAgICBCVEFfQUdfQVRfQlZSQV9FVlQsICAgICAvKiBCVEFfQUdfSEZfQ01EX0JWUkEgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAvKiBCVEFfQUdfSEZfQ01EX0JSU0YgKi8KKyAgICBCVEFfQUdfQVRfTlJFQ19FVlQsICAgICAvKiBCVEFfQUdfSEZfQ01EX05SRUMgKi8KKyAgICBCVEFfQUdfQVRfQ05VTV9FVlQsICAgICAvKiBCVEFfQUdfSEZfQ01EX0NOVU0gKi8KKyAgICBCVEFfQUdfQVRfQlRSSF9FVlQsICAgICAvKiBCVEFfQUdfSEZfQ01EX0JUUkggKi8KKyAgICBCVEFfQUdfQVRfQ0xDQ19FVlQsICAgICAvKiBCVEFfQUdfSEZfQ01EX0NMQ0MgKi8KKyAgICBCVEFfQUdfQVRfQ09QU19FVlQsICAgICAvKiBCVEFfQUdfSEZfQ01EX0NPUFMgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAvKiBCVEFfQUdfSEZfQ01EX0NNRUUgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAvKiBCVEFfQUdfSEZfQ01EX0JJQSAqLworICAgIEJUQV9BR19BVF9DQkNfRVZULCAgICAgIC8qIEJUQV9BR19IRl9DTURfQ0JDICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgLyogQlRBX0FHX0hGX0NNRF9CQ0MgKi8KKyAgICBCVEFfQUdfQVRfQkNTX0VWVCwgICAgICAvKiBCVEFfQUdfSEZfQ01EX0JDUyAqLworICAgIEJUQV9BR19BVF9CQUNfRVZUICAgICAgIC8qIEJUQV9BR19IRl9DTURfQkFDICovCit9OworCisvKiB0cmFuc2xhdGlvbiBvZiBBUEkgcmVzdWx0IGNvZGUgdmFsdWVzIHRvIGludGVybmFsIHZhbHVlcyAqLworY29uc3QgVUlOVDggYnRhX2FnX3RyYW5zX3Jlc3VsdFtdID0KK3sKKyAgICBCVEFfQUdfUkVTX1ZHUywgICAgIC8qIEJUQV9BR19TUEtfUkVTICovCisgICAgQlRBX0FHX1JFU19WR00sICAgICAvKiBCVEFfQUdfTUlDX1JFUyAqLworICAgIEJUQV9BR19SRVNfQlNJUiwgICAgLyogQlRBX0FHX0lOQkFORF9SSU5HX1JFUyAqLworICAgIEJUQV9BR19SRVNfQ0lORCwgICAgLyogQlRBX0FHX0NJTkRfUkVTICovCisgICAgQlRBX0FHX1JFU19CSU5QLCAgICAvKiBCVEFfQUdfQklOUF9SRVMgKi8KKyAgICBCVEFfQUdfUkVTX0NJRVYsICAgIC8qIEJUQV9BR19JTkRfUkVTICovCisgICAgQlRBX0FHX1JFU19CVlJBLCAgICAvKiBCVEFfQUdfQlZSQV9SRVMgKi8KKyAgICBCVEFfQUdfUkVTX0NOVU0sICAgIC8qIEJUQV9BR19DTlVNX1JFUyAqLworICAgIEJUQV9BR19SRVNfQlRSSCwgICAgLyogQlRBX0FHX0JUUkhfUkVTICovCisgICAgQlRBX0FHX1JFU19DTENDLCAgICAvKiBCVEFfQUdfQ0xDQ19SRVMgKi8KKyAgICBCVEFfQUdfUkVTX0NPUFMsICAgIC8qIEJUQV9BR19DT1BTX1JFUyAqLworICAgIDAsICAgICAgICAgICAgICAgICAgLyogQlRBX0FHX0lOX0NBTExfUkVTICovCisgICAgMCwgICAgICAgICAgICAgICAgICAvKiBCVEFfQUdfSU5fQ0FMTF9DT05OX1JFUyAqLworICAgIEJUQV9BR19SRVNfQ0NXQSwgICAgLyogQlRBX0FHX0NBTExfV0FJVF9SRVMgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgIC8qIEJUQV9BR19PVVRfQ0FMTF9PUklHX1JFUyAqLworICAgIDAsICAgICAgICAgICAgICAgICAgLyogQlRBX0FHX09VVF9DQUxMX0FMRVJUX1JFUyAqLworICAgIDAsICAgICAgICAgICAgICAgICAgLyogQlRBX0FHX09VVF9DQUxMX0NPTk5fUkVTICovCisgICAgMCwgICAgICAgICAgICAgICAgICAvKiBCVEFfQUdfQ0FMTF9DQU5DRUxfUkVTICovCisgICAgMCwgICAgICAgICAgICAgICAgICAvKiBCVEFfQUdfRU5EX0NBTExfUkVTICovCisgICAgMCwgICAgICAgICAgICAgICAgICAvKiBCVEFfQUdfSU5fQ0FMTF9IRUxEX1JFUyAqLworICAgIEJUQV9BR19SRVNfVU5BVCAgICAgLyogQlRBX0FHX1VOQVRfUkVTICovCit9OworCisvKiBjYWxsc2V0dXAgaW5kaWNhdG9yIHZhbHVlIGxvb2t1cCB0YWJsZSAqLworY29uc3QgVUlOVDggYnRhX2FnX2NhbGxzZXR1cF9pbmRfdGJsW10gPQoreworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBCVEFfQUdfU1BLX1JFUyAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBCVEFfQUdfTUlDX1JFUyAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBCVEFfQUdfSU5CQU5EX1JJTkdfUkVTICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIEJUQV9BR19DSU5EX1JFUyAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBCVEFfQUdfQklOUF9SRVMgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgLyogQlRBX0FHX0lORF9SRVMgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgLyogQlRBX0FHX0JWUkFfUkVTICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIEJUQV9BR19DTlVNX1JFUyAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBCVEFfQUdfQlRSSF9SRVMgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgLyogQlRBX0FHX0NMQ0NfUkVTICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIEJUQV9BR19DT1BTX1JFUyAqLworICAgIEJUQV9BR19DQUxMU0VUVVBfSU5DT01JTkcsICAvKiBCVEFfQUdfSU5fQ0FMTF9SRVMgKi8KKyAgICBCVEFfQUdfQ0FMTFNFVFVQX05PTkUsICAgICAgLyogQlRBX0FHX0lOX0NBTExfQ09OTl9SRVMgKi8KKyAgICBCVEFfQUdfQ0FMTFNFVFVQX0lOQ09NSU5HLCAgLyogQlRBX0FHX0NBTExfV0FJVF9SRVMgKi8KKyAgICBCVEFfQUdfQ0FMTFNFVFVQX09VVEdPSU5HLCAgLyogQlRBX0FHX09VVF9DQUxMX09SSUdfUkVTICovCisgICAgQlRBX0FHX0NBTExTRVRVUF9BTEVSVElORywgIC8qIEJUQV9BR19PVVRfQ0FMTF9BTEVSVF9SRVMgKi8KKyAgICBCVEFfQUdfQ0FMTFNFVFVQX05PTkUsICAgICAgLyogQlRBX0FHX09VVF9DQUxMX0NPTk5fUkVTICovCisgICAgQlRBX0FHX0NBTExTRVRVUF9OT05FLCAgICAgIC8qIEJUQV9BR19DQUxMX0NBTkNFTF9SRVMgKi8KKyAgICBCVEFfQUdfQ0FMTFNFVFVQX05PTkUsICAgICAgLyogQlRBX0FHX0VORF9DQUxMX1JFUyAqLworICAgIEJUQV9BR19DQUxMU0VUVVBfTk9ORSAgICAgICAvKiBCVEFfQUdfSU5fQ0FMTF9IRUxEX1JFUyAqLworfTsKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyoqCisqKiBGdW5jdGlvbiAgICAgICAgIGJ0YV9hZ19zZW5kX3Jlc3VsdAorKioKKyoqIERlc2NyaXB0aW9uICAgICAgU2VuZCBhbiBBVCByZXN1bHQgY29kZS4KKyoqCisqKgorKiogUmV0dXJucyAgICAgICAgICB2b2lkCisqKgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3N0YXRpYyB2b2lkIGJ0YV9hZ19zZW5kX3Jlc3VsdCh0QlRBX0FHX1NDQiAqcF9zY2IsIFVJTlQ4IGNvZGUsIGNoYXIgKnBfYXJnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElOVDE2IGludF9hcmcpCit7CisgICAgY2hhciAgICBidWZbQlRBX0FHX0FUX01BWF9MRU4gKyAxNl07CisgICAgY2hhciAgICAqcCA9IGJ1ZjsKKyAgICBVSU5UMTYgIGxlbjsKKworI2lmIGRlZmluZWQoQlRBX0FHX1JFU1VMVF9ERUJVRykgJiYgKEJUQV9BR19SRVNVTFRfREVCVUcgPT0gVFJVRSkKKyAgICBtZW1zZXQoYnVmLCBOVUxMLCBzaXplb2YoYnVmKSk7CisjZW5kaWYKKyAgICAvKiBpbml0IHdpdGggXHJcbiAqLworICAgICpwKysgPSAnXHInOworICAgICpwKysgPSAnXG4nOworCisgICAgLyogY29weSByZXN1bHQgY29kZSBzdHJpbmcgKi8KKyAgICBCQ01fU1RSQ1BZX1MocCwgc2l6ZW9mKGJ1ZiksIGJ0YV9hZ19yZXN1bHRfdGJsW2NvZGVdLnBfcmVzKTsKKyNpZiBkZWZpbmVkKEJUQV9IU1BfUkVTVUxUX1JFUExBQ0VfQ09MT04pICYmIChCVEFfSFNQX1JFU1VMVF9SRVBMQUNFX0NPTE9OID09IFRSVUUpCisgICAgaWYocF9zY2ItPmNvbm5fc2VydmljZSA9PSBCVEFfQUdfSFNQKQorICAgIHsKKyAgICAgICAgLyogSWYgSFNQIHRoZW4gIjoic3ltYm9sIHNob3VsZCBiZSBjaGFuZ2VkIGFzICI9IiBmb3IgSFNQIGNvbXBhdGliaWxpdHkgKi8KKyAgICAgICAgc3dpdGNoKGNvZGUpCisgICAgICAgIHsKKyAgICAgICAgY2FzZSBCVEFfQUdfUkVTX1ZHUzoKKyAgICAgICAgY2FzZSBCVEFfQUdfUkVTX1ZHTToKKyAgICAgICAgICAgIGlmKCoocCtDT0xPTl9JRFhfNF9WR1NWR00pID09ICc6JykKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAjaWYgZGVmaW5lZChCVEFfQUdfUkVTVUxUX0RFQlVHKSAmJiAoQlRBX0FHX1JFU1VMVF9ERUJVRyA9PSBUUlVFKQorICAgICAgICAgICAgICAgIEFQUExfVFJBQ0VfREVCVUcwKCJbSFNQXSAnOidzeW1ib2wgaXMgY2hhbmdlZCBhcyAnPScgZm9yIEhTUCBjb21wYXRpYmlsaXR5Iik7CisgICAgICAgICAgICAgICAgI2VuZGlmCisgICAgICAgICAgICAgICAgKihwK0NPTE9OX0lEWF80X1ZHU1ZHTSkgPSAnPSc7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgIH0KKyNlbmRpZgorICAgIHAgKz0gc3RybGVuKGJ0YV9hZ19yZXN1bHRfdGJsW2NvZGVdLnBfcmVzKTsKKworICAgIC8qIGNvcHkgYXJndW1lbnQgaWYgYW55ICovCisgICAgaWYgKGJ0YV9hZ19yZXN1bHRfdGJsW2NvZGVdLmZtdCA9PSBCVEFfQUdfUkVTX0ZNVF9JTlQpCisgICAgeworICAgICAgICBwICs9IHV0bF9pdG9hKChVSU5UMTYpIGludF9hcmcsIHApOworICAgIH0KKyAgICBlbHNlIGlmIChidGFfYWdfcmVzdWx0X3RibFtjb2RlXS5mbXQgPT0gQlRBX0FHX1JFU19GTVRfU1RSKQorICAgIHsKKyAgICAgICAgQkNNX1NUUkNQWV9TKHAsIHNpemVvZihidWYpLCBwX2FyZyk7CisgICAgICAgIHAgKz0gc3RybGVuKHBfYXJnKTsKKyAgICB9CisKKyAgICAvKiBmaW5pc2ggd2l0aCBcclxuICovCisgICAgKnArKyA9ICdccic7CisgICAgKnArKyA9ICdcbic7CisKKyNpZiBkZWZpbmVkKEJUQV9BR19SRVNVTFRfREVCVUcpICYmIChCVEFfQUdfUkVTVUxUX0RFQlVHID09IFRSVUUpCisgICAgQVBQTF9UUkFDRV9ERUJVRzEoImJ0YV9hZ19zZW5kX3Jlc3VsdDogJXMiLCBidWYpOworI2VuZGlmCisKKyAgICAvKiBzZW5kIHRvIFJGQ09NTSAqLworICAgIFBPUlRfV3JpdGVEYXRhKHBfc2NiLT5jb25uX2hhbmRsZSwgYnVmLCAoVUlOVDE2KSAocCAtIGJ1ZiksICZsZW4pOworfQorCisjaWYgZGVmaW5lZChCVEFfQUdfTVVMVElfUkVTVUxUX0lOQ0xVREVEKSAmJiAoQlRBX0FHX01VTFRJX1JFU1VMVF9JTkNMVURFRCA9PSBUUlVFKQorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyoqCisqKiBGdW5jdGlvbiAgICAgICAgIGJ0YV9hZ19zZW5kX211bHRpX3Jlc3VsdAorKioKKyoqIERlc2NyaXB0aW9uICAgICAgU2VuZCBtdWx0aXBsZSBBVCByZXN1bHQgY29kZXMuCisqKgorKioKKyoqIFJldHVybnMgICAgICAgICAgdm9pZAorKioKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitzdGF0aWMgdm9pZCBidGFfYWdfc2VuZF9tdWx0aV9yZXN1bHQodEJUQV9BR19TQ0IgKnBfc2NiLCB0QlRBX0FHX01VTFRJX1JFU1VMVF9DQiAqbV9yZXNfY2IpCit7CisgICAgY2hhciAgICBidWZbQlRBX0FHX0FUX01BWF9MRU4gKiBCVEFfQUdfQVRfTVVMVElfTEVOICsgMTZdOworICAgIGNoYXIgICAgKnAgPSBidWY7CisgICAgVUlOVDE2ICBsZW47CisgICAgVUlOVDggICByZXNfaWR4ID0gMDsKKworICAgIGlmKCghbV9yZXNfY2IpIHx8IChtX3Jlc19jYi0+bnVtX3Jlc3VsdCA9PSAwKSB8fCAobV9yZXNfY2ItPm51bV9yZXN1bHQgPiBCVEFfQUdfQVRfTVVMVElfTEVOKSkKKyAgICB7CisgICAgICAgIEFQUExfVFJBQ0VfREVCVUcwKCJtX3Jlc19jYiBpcyBOVUxMIG9yIG51bV9yZXN1bHQgaXMgb3V0IG9mIHJhbmdlLiIpOworICAgICAgICByZXR1cm47CisgICAgfQorCisjaWYgZGVmaW5lZChCVEFfQUdfUkVTVUxUX0RFQlVHKSAmJiAoQlRBX0FHX1JFU1VMVF9ERUJVRyA9PSBUUlVFKQorICAgIG1lbXNldChidWYsIE5VTEwsIHNpemVvZihidWYpKTsKKyNlbmRpZgorCisgICAgd2hpbGUocmVzX2lkeCA8IG1fcmVzX2NiLT5udW1fcmVzdWx0KQorICAgIHsKKyAgICAgICAgLyogaW5pdCB3aXRoIFxyXG4gKi8KKyAgICAgICAgKnArKyA9ICdccic7CisgICAgICAgICpwKysgPSAnXG4nOworCisgICAgICAgIC8qIGNvcHkgcmVzdWx0IGNvZGUgc3RyaW5nICovCisgICAgICAgIEJDTV9TVFJDUFlfUyhwLCBzaXplb2YoYnVmKSwgYnRhX2FnX3Jlc3VsdF90YmxbbV9yZXNfY2ItPnJlc19jYltyZXNfaWR4XS5jb2RlXS5wX3Jlcyk7CisgICAgICAgIHAgKz0gc3RybGVuKGJ0YV9hZ19yZXN1bHRfdGJsW21fcmVzX2NiLT5yZXNfY2JbcmVzX2lkeF0uY29kZV0ucF9yZXMpOworCisgICAgICAgIC8qIGNvcHkgYXJndW1lbnQgaWYgYW55ICovCisgICAgICAgIGlmIChidGFfYWdfcmVzdWx0X3RibFttX3Jlc19jYi0+cmVzX2NiW3Jlc19pZHhdLmNvZGVdLmZtdCA9PSBCVEFfQUdfUkVTX0ZNVF9JTlQpCisgICAgICAgIHsKKyAgICAgICAgICAgIHAgKz0gdXRsX2l0b2EoKFVJTlQxNikgbV9yZXNfY2ItPnJlc19jYltyZXNfaWR4XS5pbnRfYXJnLCBwKTsKKyAgICAgICAgfQorICAgICAgICBlbHNlIGlmIChidGFfYWdfcmVzdWx0X3RibFttX3Jlc19jYi0+cmVzX2NiW3Jlc19pZHhdLmNvZGVdLmZtdCA9PSBCVEFfQUdfUkVTX0ZNVF9TVFIpCisgICAgICAgIHsKKyAgICAgICAgICAgIEJDTV9TVFJDUFlfUyhwLCBzaXplb2YoYnVmKSwgbV9yZXNfY2ItPnJlc19jYltyZXNfaWR4XS5wX2FyZyk7CisgICAgICAgICAgICBwICs9IHN0cmxlbihtX3Jlc19jYi0+cmVzX2NiW3Jlc19pZHhdLnBfYXJnKTsKKyAgICAgICAgfQorCisgICAgICAgIC8qIGZpbmlzaCB3aXRoIFxyXG4gKi8KKyAgICAgICAgKnArKyA9ICdccic7CisgICAgICAgICpwKysgPSAnXG4nOworCisgICAgICAgIHJlc19pZHgrKzsKKyAgICB9CisKKyNpZiBkZWZpbmVkKEJUQV9BR19SRVNVTFRfREVCVUcpICYmIChCVEFfQUdfUkVTVUxUX0RFQlVHID09IFRSVUUpCisgICAgQVBQTF9UUkFDRV9ERUJVRzEoInNlbmRfcmVzdWx0OiAlcyIsIGJ1Zik7CisjZW5kaWYKKworICAgIC8qIHNlbmQgdG8gUkZDT01NICovCisgICAgUE9SVF9Xcml0ZURhdGEocF9zY2ItPmNvbm5faGFuZGxlLCBidWYsIChVSU5UMTYpIChwIC0gYnVmKSwgJmxlbik7Cit9CisjZW5kaWYKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyoqCisqKiBGdW5jdGlvbiAgICAgICAgIGJ0YV9hZ19zZW5kX29rCisqKgorKiogRGVzY3JpcHRpb24gICAgICBTZW5kIGFuIE9LIHJlc3VsdCBjb2RlLgorKioKKyoqCisqKiBSZXR1cm5zICAgICAgICAgIHZvaWQKKyoqCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworc3RhdGljIHZvaWQgYnRhX2FnX3NlbmRfb2sodEJUQV9BR19TQ0IgKnBfc2NiKQoreworICAgIGJ0YV9hZ19zZW5kX3Jlc3VsdChwX3NjYiwgQlRBX0FHX1JFU19PSywgTlVMTCwgMCk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisqKgorKiogRnVuY3Rpb24gICAgICAgICBidGFfYWdfc2VuZF9lcnJvcgorKioKKyoqIERlc2NyaXB0aW9uICAgICAgU2VuZCBhbiBFUlJPUiByZXN1bHQgY29kZS4KKyoqICAgICAgICAgICAgICAgICAgICAgIGVycmNvZGUgLSB1c2VkIHRvIHNlbmQgdmVyYm9zZSBlcnJvY29kZQorKioKKyoqCisqKiBSZXR1cm5zICAgICAgICAgIHZvaWQKKyoqCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworc3RhdGljIHZvaWQgYnRhX2FnX3NlbmRfZXJyb3IodEJUQV9BR19TQ0IgKnBfc2NiLCBJTlQxNiBlcnJjb2RlKQoreworICAgIC8qIElmIEhGUCBhbmQgZXh0ZW5kZWQgYXVkaW8gZ2F0ZXdheSBlcnJvciBjb2RlcyBhcmUgZW5hYmxlZCAqLworICAgIGlmIChwX3NjYi0+Y29ubl9zZXJ2aWNlID09IEJUQV9BR19IRlAgJiYgcF9zY2ItPmNtZWVfZW5hYmxlZCkKKyAgICAgICAgYnRhX2FnX3NlbmRfcmVzdWx0KHBfc2NiLCBCVEFfQUdfUkVTX0NNRUUsIE5VTEwsIGVycmNvZGUpOworICAgIGVsc2UKKyAgICAgICAgYnRhX2FnX3NlbmRfcmVzdWx0KHBfc2NiLCBCVEFfQUdfUkVTX0VSUk9SLCBOVUxMLCAwKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyoqCisqKiBGdW5jdGlvbiAgICAgICAgIGJ0YV9hZ19zZW5kX2luZAorKioKKyoqIERlc2NyaXB0aW9uICAgICAgU2VuZCBhbiBpbmRpY2F0b3IgQ0lFViByZXN1bHQgY29kZS4KKyoqCisqKgorKiogUmV0dXJucyAgICAgICAgICB2b2lkCisqKgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3N0YXRpYyB2b2lkIGJ0YV9hZ19zZW5kX2luZCh0QlRBX0FHX1NDQiAqcF9zY2IsIFVJTlQxNiBpZCwgVUlOVDE2IHZhbHVlLCBCT09MRUFOIG9uX2RlbWFuZCkKK3sKKyAgICBjaGFyICAgIHN0clsxMl07CisgICAgY2hhciAgICAqcCA9IHN0cjsKKworICAgIC8qIElmIHRoZSBpbmRpY2F0b3IgaXMgbWFza2VkIG91dCwganVzdCByZXR1cm4gKi8KKyAgICAvKiBNYW5kYXRvcnkgaW5kaWNhdG9ycyBjYW4gbm90IGJlIG1hc2tlZCBvdXQuICovCisgICAgaWYgKChwX3NjYi0+YmlhX21hc2tlZF9vdXQgJiAoKFVJTlQzMikxIDw8IGlkKSkgJiYKKyAgICAgICAgKChpZCAhPSBCVEFfQUdfSU5EX0NBTEwpICYmIChpZCAhPSBCVEFfQUdfSU5EX0NBTExTRVRVUCkgJiYgKGlkICE9IEJUQV9BR19JTkRfQ0FMTEhFTEQpKSkKKyAgICAgICAgcmV0dXJuOworCisgICAgLyogRW5zdXJlIHdlIGRvIG5vdCBzZW5kIGR1cGxpY2F0ZSBpbmRpY2F0b3JzIGlmIG5vdCByZXF1ZXN0ZWQgYnkgYXBwICovCisgICAgLyogSWYgaXQgd2FzIHJlcXVlc3RlZCBieSBhcHAsIHRyYW5zbWl0IENJRVYgZXZlbiBpZiBpdCBpcyBkdXBsaWNhdGUuICovCisgICAgaWYgKGlkID09IEJUQV9BR19JTkRfQ0FMTCkKKyAgICB7CisgICAgICAgIGlmICgodmFsdWUgPT0gcF9zY2ItPmNhbGxfaW5kKSAmJiAob25fZGVtYW5kID09IEZBTFNFKSkKKyAgICAgICAgICAgIHJldHVybjsKKworICAgICAgICBwX3NjYi0+Y2FsbF9pbmQgPSAoVUlOVDgpdmFsdWU7CisgICAgfQorCisgICAgaWYgKChpZCA9PSBCVEFfQUdfSU5EX0NBTExTRVRVUCkgJiYgKG9uX2RlbWFuZCA9PSBGQUxTRSkpCisgICAgeworICAgICAgICBpZiAodmFsdWUgPT0gcF9zY2ItPmNhbGxzZXR1cF9pbmQpCisgICAgICAgICAgICByZXR1cm47CisKKyAgICAgICAgcF9zY2ItPmNhbGxzZXR1cF9pbmQgPSAoVUlOVDgpdmFsdWU7CisgICAgfQorCisgICAgaWYgKChpZCA9PSBCVEFfQUdfSU5EX1NFUlZJQ0UpICYmIChvbl9kZW1hbmQgPT0gRkFMU0UpKQorICAgIHsKKyAgICAgICAgaWYgKHZhbHVlID09IHBfc2NiLT5zZXJ2aWNlX2luZCkKKyAgICAgICAgICAgIHJldHVybjsKKworICAgICAgICBwX3NjYi0+c2VydmljZV9pbmQgPSAoVUlOVDgpdmFsdWU7CisgICAgfQorICAgIGlmICgoaWQgPT0gQlRBX0FHX0lORF9TSUdOQUwpICYmIChvbl9kZW1hbmQgPT0gRkFMU0UpKQorICAgIHsKKyAgICAgICAgaWYgKHZhbHVlID09IHBfc2NiLT5zaWduYWxfaW5kKQorICAgICAgICAgICAgcmV0dXJuOworCisgICAgICAgIHBfc2NiLT5zaWduYWxfaW5kID0gKFVJTlQ4KXZhbHVlOworICAgIH0KKyAgICBpZiAoKGlkID09IEJUQV9BR19JTkRfUk9BTSkgJiYgKG9uX2RlbWFuZCA9PSBGQUxTRSkpCisgICAgeworICAgICAgICBpZiAodmFsdWUgPT0gcF9zY2ItPnJvYW1faW5kKQorICAgICAgICAgICAgcmV0dXJuOworCisgICAgICAgIHBfc2NiLT5yb2FtX2luZCA9IChVSU5UOCl2YWx1ZTsKKyAgICB9CisgICAgaWYgKChpZCA9PSBCVEFfQUdfSU5EX0JBVFRDSEcpICYmIChvbl9kZW1hbmQgPT0gRkFMU0UpKQorICAgIHsKKyAgICAgICAgaWYgKHZhbHVlID09IHBfc2NiLT5iYXR0Y2hnX2luZCkKKyAgICAgICAgICAgIHJldHVybjsKKworICAgICAgICBwX3NjYi0+YmF0dGNoZ19pbmQgPSAoVUlOVDgpdmFsdWU7CisgICAgfQorCisgICAgaWYgKChpZCA9PSBCVEFfQUdfSU5EX0NBTExIRUxEKSAmJiAob25fZGVtYW5kID09IEZBTFNFKSkKKyAgICB7CisgICAgICAgIC8qIGNhbGwgc3dhcCBjb3VsZCByZXN1bHQgaW4gc2VuZGluZyBjYWxsaGVsZD0xIG11bHRpcGxlIHRpbWVzICovCisgICAgICAgIGlmICgodmFsdWUgIT0gMSkgJiYgKHZhbHVlID09IHBfc2NiLT5jYWxsaGVsZF9pbmQpKQorICAgICAgICAgICAgcmV0dXJuOworCisgICAgICAgIHBfc2NiLT5jYWxsaGVsZF9pbmQgPSAoVUlOVDgpdmFsdWU7CisgICAgfQorCisgICAgaWYgKHBfc2NiLT5jbWVyX2VuYWJsZWQpCisgICAgeworICAgICAgICBwICs9IHV0bF9pdG9hKGlkLCBwKTsKKyAgICAgICAgKnArKyA9ICcsJzsKKyAgICAgICAgdXRsX2l0b2EodmFsdWUsIHApOworICAgICAgICBidGFfYWdfc2VuZF9yZXN1bHQocF9zY2IsIEJUQV9BR19SRVNfQ0lFViwgc3RyLCAwKTsKKyAgICB9Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisqKgorKiogRnVuY3Rpb24gICAgICAgICBidGFfYWdfcGFyc2VfY21lcgorKioKKyoqIERlc2NyaXB0aW9uICAgICAgUGFyc2UgQVQrQ01FUiBwYXJhbWV0ZXIgc3RyaW5nLgorKioKKyoqCisqKiBSZXR1cm5zICAgICAgICAgIFRSVUUgaWYgcGFyc2VkIG9rLCBGQUxTRSBvdGhlcndpc2UuCisqKgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3N0YXRpYyBCT09MRUFOIGJ0YV9hZ19wYXJzZV9jbWVyKGNoYXIgKnBfcywgQk9PTEVBTiAqcF9lbmFibGVkKQoreworICAgIElOVDE2ICAgbls0XSA9IHstMSwgLTEsIC0xLCAtMX07CisgICAgaW50ICAgICBpOworICAgIGNoYXIgICAgKnA7CisKKyAgICBmb3IgKGkgPSAwOyBpIDwgNDsgaSsrKQorICAgIHsKKyAgICAgICAgLyogc2tpcCB0byBjb21tYSBkZWxpbWl0ZXIgKi8KKyAgICAgICAgZm9yIChwID0gcF9zOyAqcCAhPSAnLCcgJiYgKnAgIT0gMDsgcCsrKTsKKworICAgICAgICAvKiBnZXQgaW50ZWdlciB2YWx1ZSAqLworICAgICAgICAqcCA9IDA7CisgICAgICAgIG5baV0gPSB1dGxfc3RyMmludChwX3MpOworICAgICAgICBwX3MgPSBwICsgMTsKKyAgICAgICAgaWYgKHBfcyA9PSAwKQorICAgICAgICB7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qIHByb2Nlc3MgdmFsdWVzICovCisgICAgaWYgKG5bMF0gPCAwIHx8IG5bM10gPCAwKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEZBTFNFOworICAgIH0KKworICAgIGlmICgoblswXSA9PSAzKSAmJiAoKG5bM10gPT0gMSkgfHwgKG5bM10gPT0gMCkpKQorICAgIHsKKyAgICAgICAgKnBfZW5hYmxlZCA9IChCT09MRUFOKSBuWzNdOworICAgIH0KKworICAgIHJldHVybiBUUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorKioKKyoqIEZ1bmN0aW9uICAgICAgICAgYnRhX2FnX3BhcnNlX2NobGQKKyoqCisqKiBEZXNjcmlwdGlvbiAgICAgIFBhcnNlIEFUK0NITEQgcGFyYW1ldGVyIHN0cmluZy4KKyoqCisqKgorKiogUmV0dXJucyAgICAgICAgICBSZXR1cm5zIGlkeCAoMS03KSwgb3IgMCBpZiBFQ0Mgbm90IGVuYWJsZWQgb3IgaWR4IGRvZXNuJ3QgZXhpc3QKKyoqCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworc3RhdGljIFVJTlQ4IGJ0YV9hZ19wYXJzZV9jaGxkKHRCVEFfQUdfU0NCICpwX3NjYiwgY2hhciAqcF9zKQoreworICAgIFVJTlQ4ICAgcmV0dmFsID0gMDsKKyAgICBJTlQxNiAgIGlkeCA9IC0xOworICAgIFVOVVNFRChwX3NjYik7CisKKyAgICBpZiAocF9zWzFdICE9IDApCisgICAgeworICAgICAgICAvKiBwX2lkeHN0cisrOyAgcG9pbnQgdG8gYmVnaW5uaW5nIG9mIGNhbGwgbnVtYmVyICovCisgICAgICAgIGlkeCA9IHV0bF9zdHIyaW50KCZwX3NbMV0pOworICAgICAgICBpZiAoaWR4ICE9IC0xICYmIGlkeCA8IDI1NSkKKyAgICAgICAgICAgIHJldHZhbCA9IChVSU5UOClpZHg7CisgICAgfQorCisgICAgcmV0dXJuIChyZXR2YWwpOworfQorCisjaWYgKEJUTV9XQlNfSU5DTFVERUQgPT0gVFJVRSApCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorKioKKyoqIEZ1bmN0aW9uICAgICAgICAgYnRhX2FnX3BhcnNlX2JhYworKioKKyoqIERlc2NyaXB0aW9uICAgICAgUGFyc2UgQVQrQkFDIHBhcmFtZXRlciBzdHJpbmcuCisqKgorKiogUmV0dXJucyAgICAgICAgICBSZXR1cm5zIGJpdG1hcCBvZiBzdXBwb3J0ZWQgY29kZWNzLgorKioKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitzdGF0aWMgdEJUQV9BR19QRUVSX0NPREVDIGJ0YV9hZ19wYXJzZV9iYWModEJUQV9BR19TQ0IgKnBfc2NiLCBjaGFyICpwX3MpCit7CisgICAgdEJUQV9BR19QRUVSX0NPREVDICByZXR2YWwgPSBCVEFfQUdfQ09ERUNfTk9ORTsKKyAgICBVSU5UMTYgIHV1aWRfY29kZWM7CisgICAgQk9PTEVBTiBjb250ID0gRkFMU0U7ICAgICAgIC8qIENvbnRpbnVlIHByb2Nlc3NpbmcgKi8KKyAgICBjaGFyICpwOworCisgICAgd2hpbGUocF9zKQorICAgIHsKKyAgICAgICAgLyogc2tpcCB0byBjb21tYSBkZWxpbWl0ZXIgKi8KKyAgICAgICAgZm9yKHAgPSBwX3M7ICpwICE9ICcsJyAmJiAqcCAhPSAwOyBwKyspOworCisgICAgICAgIC8qIGdldCBpbnRlZ3JlIHZhbHVlICovCisgICAgICAgIGlmICgqcCAhPSAwKQorICAgICAgICB7CisgICAgICAgICAgICAqcCA9IDA7CisgICAgICAgICAgICBjb250ID0gVFJVRTsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgICAgICBjb250ID0gRkFMU0U7CisKKyAgICAgICAgdXVpZF9jb2RlYyA9IHV0bF9zdHIyaW50KHBfcyk7CisgICAgICAgIHN3aXRjaCh1dWlkX2NvZGVjKQorICAgICAgICB7CisgICAgICAgICAgICBjYXNlIFVVSURfQ09ERUNfQ1ZTRDogICByZXR2YWwgfD0gQlRBX0FHX0NPREVDX0NWU0Q7ICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgVVVJRF9DT0RFQ19NU0JDOiAgIHJldHZhbCB8PSBCVEFfQUdfQ09ERUNfTVNCQzsgICAgIGJyZWFrOworICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICBBUFBMX1RSQUNFX0VSUk9SMSgiVW5rbm93biBDb2RlYyBVVUlEKCVkKSByZWNlaXZlZCIsIHV1aWRfY29kZWMpOworICAgICAgICAgICAgICAgIHJldHVybiBCVEFfQUdfQ09ERUNfTk9ORTsKKyAgICAgICAgfQorCisgICAgICAgIGlmIChjb250KQorICAgICAgICAgICAgcF9zID0gcCArIDE7CisgICAgICAgIGVsc2UKKyAgICAgICAgICAgIGJyZWFrOworICAgIH0KKworICAgIHJldHVybiAocmV0dmFsKTsKK30KKyNlbmRpZgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorKioKKyoqIEZ1bmN0aW9uICAgICAgICAgYnRhX2FnX3Byb2Nlc3NfdW5hdF9yZXMKKyoqCisqKiBEZXNjcmlwdGlvbiAgICAgIFByb2Nlc3MgdGhlIHVuYXQgcmVzcG9uc2UgZGF0YSBhbmQgcmVtb3ZlIGV4dHJhIGNhcnJpYWdlIHJldHVybgorKiogICAgICAgICAgICAgICAgICBhbmQgbGluZSBmZWVkCisqKgorKioKKyoqIFJldHVybnMgICAgICAgICAgdm9pZAorKioKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK3N0YXRpYyB2b2lkIGJ0YV9hZ19wcm9jZXNzX3VuYXRfcmVzKGNoYXIgKnVuYXRfcmVzdWx0KQoreworICAgIFVJTlQ4ICAgc3RyX2xlbmc7CisgICAgVUlOVDggICBpID0gMDsKKyAgICBVSU5UOCAgIGogPSAwOworICAgIFVJTlQ4ICAgcGFpcnNfb2ZfbmxfY3I7CisgICAgY2hhciAgICB0cmltX2RhdGFbQlRBX0FHX0FUX01BWF9MRU5dOworCisKKworICAgIHN0cl9sZW5nID0gc3RybGVuKHVuYXRfcmVzdWx0KTsKKworICAgIC8qIElmIG5vIGV4dHJhIENSIGFuZCBMRiwganVzdCByZXR1cm4gKi8KKyAgICBpZihzdHJfbGVuZyA8IDQpCisgICAgICAgIHJldHVybjsKKworICAgIC8qIFJlbW92ZSB0aGUgY2FycmlhZ2UgcmV0dXJuIGFuZCBsZWZ0IGZlZWQgKi8KKyAgICB3aGlsZSh1bmF0X3Jlc3VsdFswXSA9PSdccicgJiYgdW5hdF9yZXN1bHRbMV0gPT0nXG4nCisgICAgICAgICYmIHVuYXRfcmVzdWx0W3N0cl9sZW5nLTJdID09J1xyJyAmJiB1bmF0X3Jlc3VsdFtzdHJfbGVuZy0xXSA9PSdcbicpCisgICAgeworICAgICAgICBwYWlyc19vZl9ubF9jciA9IDE7CisgICAgICAgIGZvciAoaT0wO2k8KHN0cl9sZW5nLTQqcGFpcnNfb2ZfbmxfY3IpO2krKykKKyAgICAgICAgeworICAgICAgICAgICAgdHJpbV9kYXRhW2orK10gPSB1bmF0X3Jlc3VsdFtpK3BhaXJzX29mX25sX2NyKjJdOworICAgICAgICB9CisgICAgICAgIC8qIEFkZCBFT0YgKi8KKyAgICAgICAgdHJpbV9kYXRhW2pdID0gJ1wwJzsKKyAgICAgICAgc3RyX2xlbmcgPSBzdHJfbGVuZyAtIDQ7CisgICAgICAgIEJDTV9TVFJOQ1BZX1ModW5hdF9yZXN1bHQsIEJUQV9BR19BVF9NQVhfTEVOKzEsIHRyaW1fZGF0YSxzdHJfbGVuZysxKTsKKyAgICAgICAgaT0wOworICAgICAgICBqPTA7CisKKyAgICAgICAgaWYoc3RyX2xlbmcgPDQpCisgICAgICAgICAgICByZXR1cm47CisKKworICAgIH0KKyAgICByZXR1cm47Cit9CisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyoqCisqKiBGdW5jdGlvbiAgICAgICAgIGJ0YV9hZ19pbmJhbmRfZW5hYmxlZAorKioKKyoqIERlc2NyaXB0aW9uICAgICAgRGV0ZXJtaW5lIHdoZXRoZXIgaW4tYmFuZCByaW5nIGNhbiBiZSB1c2VkLgorKioKKyoqCisqKiBSZXR1cm5zICAgICAgICAgIHZvaWQKKyoqCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworQk9PTEVBTiBidGFfYWdfaW5iYW5kX2VuYWJsZWQodEJUQV9BR19TQ0IgKnBfc2NiKQoreworICAgIC8qIGlmIGZlYXR1cmUgaXMgZW5hYmxlZCBhbmQgbm8gb3RoZXIgc2NicyBjb25uZWN0ZWQgKi8KKyAgICBpZiAocF9zY2ItPmluYmFuZF9lbmFibGVkICYmICFidGFfYWdfb3RoZXJfc2NiX29wZW4ocF9zY2IpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIFRSVUU7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgIHJldHVybiBGQUxTRTsKKyAgICB9Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisqKgorKiogRnVuY3Rpb24gICAgICAgICBidGFfYWdfc2VuZF9jYWxsX2luZHMKKyoqCisqKiBEZXNjcmlwdGlvbiAgICAgIFNlbmQgY2FsbCBhbmQgY2FsbHNldHVwIGluZGljYXRvcnMuCisqKgorKioKKyoqIFJldHVybnMgICAgICAgICAgdm9pZAorKioKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit2b2lkIGJ0YV9hZ19zZW5kX2NhbGxfaW5kcyh0QlRBX0FHX1NDQiAqcF9zY2IsIHRCVEFfQUdfUkVTIHJlc3VsdCkKK3sKKyAgICBVSU5UOCBjYWxsID0gcF9zY2ItPmNhbGxfaW5kOworICAgIFVJTlQ4IGNhbGxzZXR1cDsKKworICAgIC8qIHNldCBuZXcgY2FsbCBhbmQgY2FsbHNldHVwIHZhbHVlcyBiYXNlZCBvbiBCVEFfQWdSZXN1bHQgKi8KKyAgICBjYWxsc2V0dXAgPSBidGFfYWdfY2FsbHNldHVwX2luZF90YmxbcmVzdWx0XTsKKworICAgIGlmIChyZXN1bHQgPT0gQlRBX0FHX0VORF9DQUxMX1JFUykKKyAgICB7CisgICAgICAgIGNhbGwgPSBCVEFfQUdfQ0FMTF9JTkFDVElWRTsKKyAgICB9CisgICAgZWxzZSBpZiAocmVzdWx0ID09IEJUQV9BR19JTl9DQUxMX0NPTk5fUkVTIHx8IHJlc3VsdCA9PSBCVEFfQUdfT1VUX0NBTExfQ09OTl9SRVMKKyAgICAgICAgICAgICB8fCByZXN1bHQgPT0gQlRBX0FHX0lOX0NBTExfSEVMRF9SRVMpCisgICAgeworICAgICAgICBjYWxsID0gQlRBX0FHX0NBTExfQUNUSVZFOworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICBjYWxsID0gcF9zY2ItPmNhbGxfaW5kOworICAgIH0KKworICAgIC8qIFNlbmQgaW5kaWNhdG9yIGZ1bmN0aW9uIHRyYWNrcyBpZiB0aGUgdmFsdWVzIGhhdmUgYWN0dWFsbHkgY2hhbmdlZCAqLworICAgIGJ0YV9hZ19zZW5kX2luZChwX3NjYiwgQlRBX0FHX0lORF9DQUxMLCBjYWxsLCBGQUxTRSk7CisgICAgYnRhX2FnX3NlbmRfaW5kKHBfc2NiLCBCVEFfQUdfSU5EX0NBTExTRVRVUCwgY2FsbHNldHVwLCBGQUxTRSk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisqKgorKiogRnVuY3Rpb24gICAgICAgICBidGFfYWdfYXRfaHNwX2NiYWNrCisqKgorKiogRGVzY3JpcHRpb24gICAgICBBVCBjb21tYW5kIHByb2Nlc3NpbmcgY2FsbGJhY2sgZm9yIEhTUC4KKyoqCisqKgorKiogUmV0dXJucyAgICAgICAgICB2b2lkCisqKgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3ZvaWQgYnRhX2FnX2F0X2hzcF9jYmFjayh0QlRBX0FHX1NDQiAqcF9zY2IsIFVJTlQxNiBjbWQsIFVJTlQ4IGFyZ190eXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaGFyICpwX2FyZywgSU5UMTYgaW50X2FyZykKK3sKKyAgICB0QlRBX0FHX1ZBTCB2YWw7CisKKyAgICBBUFBMX1RSQUNFX0RFQlVHNCgiQVQgY21kOiVkIGFyZ190eXBlOiVkIGFyZzolZCBhcmc6JXMiLCBjbWQsIGFyZ190eXBlLAorICAgICAgICAgICAgICAgICAgICAgIGludF9hcmcsIHBfYXJnKTsKKworICAgIC8qIHNlbmQgT0sgKi8KKyAgICBidGFfYWdfc2VuZF9vayhwX3NjYik7CisKKyAgICB2YWwuaGRyLmhhbmRsZSA9IGJ0YV9hZ19zY2JfdG9faWR4KHBfc2NiKTsKKyAgICB2YWwuaGRyLmFwcF9pZCA9IHBfc2NiLT5hcHBfaWQ7CisgICAgdmFsLm51bSA9IChVSU5UMTYpIGludF9hcmc7CisgICAgQkNNX1NUUk5DUFlfUyh2YWwuc3RyLCBzaXplb2YodmFsLnN0ciksIHBfYXJnLCBCVEFfQUdfQVRfTUFYX0xFTik7CisgICAgdmFsLnN0cltCVEFfQUdfQVRfTUFYX0xFTl0gPSAwOworCisgICAgLyogY2FsbCBjYWxsYmFjayB3aXRoIGV2ZW50ICovCisgICAgKCpidGFfYWdfY2IucF9jYmFjaykoYnRhX2FnX2hzcF9jYl9ldnRbY21kXSwgKHRCVEFfQUcgKikgJnZhbCk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisqKgorKiogRnVuY3Rpb24gICAgICAgICBidGFfYWdfYXRfaGZwX2NiYWNrCisqKgorKiogRGVzY3JpcHRpb24gICAgICBBVCBjb21tYW5kIHByb2Nlc3NpbmcgY2FsbGJhY2sgZm9yIEhGUC4KKyoqCisqKgorKiogUmV0dXJucyAgICAgICAgICB2b2lkCisqKgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3ZvaWQgYnRhX2FnX2F0X2hmcF9jYmFjayh0QlRBX0FHX1NDQiAqcF9zY2IsIFVJTlQxNiBjbWQsIFVJTlQ4IGFyZ190eXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaGFyICpwX2FyZywgSU5UMTYgaW50X2FyZykKK3sKKyAgICB0QlRBX0FHX1ZBTCAgICAgdmFsOworICAgIHRCVEFfQUdfRVZUICAgZXZlbnQ7CisgICAgdEJUQV9BR19TQ0IgICAgICphZ19zY2I7CisgICAgVUlOVDMyICAgICAgICAgIGksIGluZF9pZDsKKyAgICBVSU5UMzIgICAgICAgICAgYmlhX21hc2tlZF9vdXQ7CisjaWYgKEJUTV9XQlNfSU5DTFVERUQgPT0gVFJVRSApCisgICAgdEJUQV9BR19QRUVSX0NPREVDICBjb2RlY190eXBlLCBjb2RlY19zZW50OworI2VuZGlmCisKKyAgICBBUFBMX1RSQUNFX0RFQlVHNCgiSEZQIEFUIGNtZDolZCBhcmdfdHlwZTolZCBhcmc6JWQgYXJnOiVzIiwgY21kLCBhcmdfdHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICBpbnRfYXJnLCBwX2FyZyk7CisKKyAgICB2YWwuaGRyLmhhbmRsZSA9IGJ0YV9hZ19zY2JfdG9faWR4KHBfc2NiKTsKKyAgICB2YWwuaGRyLmFwcF9pZCA9IHBfc2NiLT5hcHBfaWQ7CisgICAgdmFsLm51bSA9IGludF9hcmc7CisgICAgQkNNX1NUUk5DUFlfUyh2YWwuc3RyLCBzaXplb2YodmFsLnN0ciksIHBfYXJnLCBCVEFfQUdfQVRfTUFYX0xFTik7CisgICAgdmFsLnN0cltCVEFfQUdfQVRfTUFYX0xFTl0gPSAwOworCisgICAgZXZlbnQgPSBidGFfYWdfaGZwX2NiX2V2dFtjbWRdOworCisgICAgc3dpdGNoIChjbWQpCisgICAgeworICAgICAgICBjYXNlIEJUQV9BR19IRl9DTURfQToKKyAgICAgICAgY2FzZSBCVEFfQUdfSEZfQ01EX1ZHUzoKKyAgICAgICAgY2FzZSBCVEFfQUdfSEZfQ01EX1ZHTToKKyAgICAgICAgY2FzZSBCVEFfQUdfSEZfQ01EX0NIVVA6CisgICAgICAgIGNhc2UgQlRBX0FHX0hGX0NNRF9DQkM6CisgICAgICAgICAgICAvKiBzZW5kIE9LICovCisgICAgICAgICAgICBidGFfYWdfc2VuZF9vayhwX3NjYik7CisgICAgICAgICAgICBicmVhazsKKworICAgICAgICBjYXNlIEJUQV9BR19IRl9DTURfQkxETjoKKyAgICAgICAgICAgIC8qIERvIG5vdCBzZW5kIE9LLCBBcHAgd2lsbCBzZW5kIGVycm9yIG9yIE9LIGRlcGVuZGluZyBvbgorICAgICAgICAgICAgKiogbGFzdCBkaWFsIG51bWJlciBlbmFibGVkIG9yIG5vdCAqLworICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgY2FzZSBCVEFfQUdfSEZfQ01EX0Q6CisgICAgICAgICAgICAvKiBEbyBub3Qgc2VuZCBPSyBmb3IgRGlhbCBjbWRzCisgICAgICAgICAgICAqKiBMZXQgYXBwbGljYXRpb24gZGVjaWRlIHdoZXRoZXIgdG8gc2VuZCBPSyBvciBFUlJPUiovCisKKyAgICAgICAgICAgIC8qIGlmIG1lbSBkaWFsIGNtZCwgbWFrZSBzdXJlIHN0cmluZyBjb250YWlucyBvbmx5IGRpZ2l0cyAqLworICAgICAgICAgICAgaWYocF9hcmdbMF0gPT0gJz4nKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmKCF1dGxfaXNpbnRzdHIocF9hcmcrMSkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBldmVudCA9IDA7CisgICAgICAgICAgICAgICAgICAgIGJ0YV9hZ19zZW5kX2Vycm9yKHBfc2NiLCBCVEFfQUdfRVJSX0lOVl9DSEFSX0lOX0RTVFIpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UgaWYgKHBfYXJnWzBdID09ICdWJykgICAvKiBBVERWIDogRGlhbCBWb0lQIENhbGwgKi8KKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAvKiBXZSBkbyBub3QgY2hlY2sgc3RyaW5nLiBDb2RlIHdpbGwgYmUgYWRkZWQgbGF0ZXIgaWYgbmVlZGVkLiAqLworICAgICAgICAgICAgICAgIGlmKCEoKHBfc2NiLT5wZWVyX2ZlYXR1cmVzICYgQlRBX0FHX1BFRVJfRkVBVF9WT0lQKSAmJiAocF9zY2ItPmZlYXR1cmVzICYgQlRBX0FHX0ZFQVRfVk9JUCkpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgZXZlbnQgPSAwOworICAgICAgICAgICAgICAgICAgICBidGFfYWdfc2VuZF9lcnJvcihwX3NjYiwgQlRBX0FHX0VSUl9PUF9OT1RfU1VQUE9SVEVEKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICAvKiBJZiBkaWFsIGNtZCwgbWFrZSBzdXJlIHN0cmluZyBjb250YWlucyBvbmx5IGRpYWwgZGlnaXRzCisgICAgICAgICAgICAqKiBEaWFsIGRpZ2l0cyBhcmUgMC05LCBBLUMsICosICMsICsgKi8KKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZighdXRsX2lzZGlhbHN0cihwX2FyZykpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBldmVudCA9IDA7CisgICAgICAgICAgICAgICAgICAgIGJ0YV9hZ19zZW5kX2Vycm9yKHBfc2NiLCBCVEFfQUdfRVJSX0lOVl9DSEFSX0lOX0RTVFIpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgIGNhc2UgQlRBX0FHX0hGX0NNRF9DQ1dBOgorICAgICAgICAgICAgLyogc3RvcmUgc2V0dGluZyAqLworICAgICAgICAgICAgcF9zY2ItPmNjd2FfZW5hYmxlZCA9IChCT09MRUFOKSBpbnRfYXJnOworCisgICAgICAgICAgICAvKiBzZW5kIE9LICovCisgICAgICAgICAgICBidGFfYWdfc2VuZF9vayhwX3NjYik7CisgICAgICAgICAgICBicmVhazsKKworICAgICAgICBjYXNlIEJUQV9BR19IRl9DTURfQ0hMRDoKKyAgICAgICAgICAgIGlmIChhcmdfdHlwZSA9PSBCVEFfQUdfQVRfVEVTVCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAvKiBkb24ndCBjYWxsIGNhbGxiYWNrICovCisgICAgICAgICAgICAgICAgZXZlbnQgPSAwOworCisgICAgICAgICAgICAgICAgLyogc2VuZCBDSExEIHN0cmluZyAqLworICAgICAgICAgICAgICAgIC8qIEZvcm0gc3RyaW5nIGJhc2VkIG9uIHN1cHBvcnRlZCAxLjUgZmVhdHVyZSAqLworICAgICAgICAgICAgICAgIGlmICgocF9zY2ItPnBlZXJfdmVyc2lvbiA+PSBIRlBfVkVSU0lPTl8xXzUpICYmCisgICAgICAgICAgICAgICAgICAgIChwX3NjYi0+ZmVhdHVyZXMgJiBCVEFfQUdfRkVBVF9FQ0MpICYmCisgICAgICAgICAgICAgICAgICAgIChwX3NjYi0+cGVlcl9mZWF0dXJlcyAmIEJUQV9BR19QRUVSX0ZFQVRfRUNDKSkKKyAgICAgICAgICAgICAgICAgICAgYnRhX2FnX3NlbmRfcmVzdWx0KHBfc2NiLCBCVEFfQUdfUkVTX0NITEQsIHBfYnRhX2FnX2NmZy0+Y2hsZF92YWxfZWNjLCAwKTsKKyAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgIGJ0YV9hZ19zZW5kX3Jlc3VsdChwX3NjYiwgQlRBX0FHX1JFU19DSExELCBwX2J0YV9hZ19jZmctPmNobGRfdmFsLCAwKTsKKworICAgICAgICAgICAgICAgIC8qIHNlbmQgT0sgKi8KKyAgICAgICAgICAgICAgICBidGFfYWdfc2VuZF9vayhwX3NjYik7CisKKyAgICAgICAgICAgICAgICAvKiBpZiBzZXJ2aWNlIGxldmVsIGNvbm4uIG5vdCBhbHJlYWR5IG9wZW4sIG5vdyBpdCdzIG9wZW4gKi8KKyAgICAgICAgICAgICAgICBidGFfYWdfc3ZjX2Nvbm5fb3BlbihwX3NjYiwgTlVMTCk7CisKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB2YWwuaWR4ID0gYnRhX2FnX3BhcnNlX2NobGQocF9zY2IsIHZhbC5zdHIpOworCisgICAgICAgICAgICAgICAgaWYodmFsLmlkeCAmJiAhKChwX3NjYi0+ZmVhdHVyZXMgJiBCVEFfQUdfRkVBVF9FQ0MpICYmIChwX3NjYi0+cGVlcl9mZWF0dXJlcyAmIEJUQV9BR19QRUVSX0ZFQVRfRUNDKSkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAvKiB3ZSBkbyBub3Qgc3VwcG9ydCBFQ0MsIGJ1dCBIRiBpcyBzZW5kaW5nIHVzIGEgQ0hMRCB3aXRoIGNhbGwgaW5kZXgqLworICAgICAgICAgICAgICAgICAgICBldmVudCA9IDA7CisgICAgICAgICAgICAgICAgICAgIGJ0YV9hZ19zZW5kX2Vycm9yKHBfc2NiLCBCVEFfQUdfRVJSX09QX05PVF9TVVBQT1JURUQpOworCisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICB7CisKKyAgICAgICAgICAgICAgICAvKiBJZiBpdCBpcyBzd2FwIGJldHdlZW4gY2FsbHMsIHNldCBjYWxsIGhlbGQgaW5kaWNhdG9yIHRvIDMob3V0IG9mIHZhbGlkIDAtMikKKyAgICAgICAgICAgICAgICAqKiBBcHBsaWNhdGlvbiB3aWxsIHNldCBpdCBiYWNrIHRvIDEKKyAgICAgICAgICAgICAgICAqKiBjYWxsaGVsZCBpbmRpY2F0b3Igd2lsbCBiZSBzZW50IGFjcm9zcyB0byB0aGUgcGVlci4gKi8KKyAgICAgICAgICAgICAgICBpZih2YWwuc3RyWzBdID09ICcyJykKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGZvciAoaSA9IDAsIGFnX3NjYiA9ICZidGFfYWdfY2Iuc2NiWzBdOyBpIDwgQlRBX0FHX05VTV9TQ0I7IGkrKywgYWdfc2NiKyspCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChhZ19zY2ItPmluX3VzZSkKKyAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZigoYWdfc2NiLT5jYWxsX2luZCA9PSBCVEFfQUdfQ0FMTF9BQ1RJVkUpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICYmIChhZ19zY2ItPmNhbGxzZXR1cF9pbmQgPT0gQlRBX0FHX0NBTExTRVRVUF9OT05FKSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWdfc2NiLT5jYWxsaGVsZF9pbmQgPSBCVEFfQUdfQ0FMTEhFTERfTk9BQ1RJVkUgKyAxOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIC8qIERvIG5vdCBzZW5kIE9LLiBMZXQgYXBwIGRlY2lkZSBhZnRlciBwYXJzaW5nIHRoZSB2YWwgc3RyICovCisgICAgICAgICAgICAgICAgLyogYnRhX2FnX3NlbmRfb2socF9zY2IpOyAqLworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgY2FzZSBCVEFfQUdfSEZfQ01EX0NJTkQ6CisgICAgICAgICAgICBpZiAoYXJnX3R5cGUgPT0gQlRBX0FHX0FUX1RFU1QpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgLyogZG9uJ3QgY2FsbCBjYWxsYmFjayAqLworICAgICAgICAgICAgICAgIGV2ZW50ID0gMDsKKworICAgICAgICAgICAgICAgIC8qIHNlbmQgQ0lORCBzdHJpbmcsIHNlbmQgT0sgKi8KKyAgICAgICAgICAgICAgICBidGFfYWdfc2VuZF9yZXN1bHQocF9zY2IsIEJUQV9BR19SRVNfQ0lORCwgcF9idGFfYWdfY2ZnLT5jaW5kX2luZm8sIDApOworICAgICAgICAgICAgICAgIGJ0YV9hZ19zZW5kX29rKHBfc2NiKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgIGNhc2UgQlRBX0FHX0hGX0NNRF9DTElQOgorICAgICAgICAgICAgLyogc3RvcmUgc2V0dGluZywgc2VuZCBPSyAqLworICAgICAgICAgICAgcF9zY2ItPmNsaXBfZW5hYmxlZCA9IChCT09MRUFOKSBpbnRfYXJnOworICAgICAgICAgICAgYnRhX2FnX3NlbmRfb2socF9zY2IpOworICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgY2FzZSBCVEFfQUdfSEZfQ01EX0NNRVI6CisgICAgICAgICAgICAvKiBpZiBwYXJzZWQgb2sgc3RvcmUgc2V0dGluZywgc2VuZCBPSyAqLworICAgICAgICAgICAgaWYgKGJ0YV9hZ19wYXJzZV9jbWVyKHBfYXJnLCAmcF9zY2ItPmNtZXJfZW5hYmxlZCkpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgYnRhX2FnX3NlbmRfb2socF9zY2IpOworCisgICAgICAgICAgICAgICAgLyogaWYgc2VydmljZSBsZXZlbCBjb25uLiBub3QgYWxyZWFkeSBvcGVuIGFuZCBvdXIgZmVhdHVyZXMgYW5kCisgICAgICAgICAgICAgICAgKiogcGVlciBmZWF0dXJlcyBkbyBub3QgaGF2ZSAzLXdheSwgc2VydmljZSBsZXZlbCBjb25uLiBub3cgb3BlbgorICAgICAgICAgICAgICAgICovCisgICAgICAgICAgICAgICAgaWYgKCFwX3NjYi0+c3ZjX2Nvbm4gJiYKKyAgICAgICAgICAgICAgICAgICAgISgocF9zY2ItPmZlYXR1cmVzICYgQlRBX0FHX0ZFQVRfM1dBWSkgJiYgKHBfc2NiLT5wZWVyX2ZlYXR1cmVzICYgQlRBX0FHX1BFRVJfRkVBVF8zV0FZKSkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBidGFfYWdfc3ZjX2Nvbm5fb3BlbihwX3NjYiwgTlVMTCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGJ0YV9hZ19zZW5kX2Vycm9yKHBfc2NiLCBCVEFfQUdfRVJSX0lOVl9DSEFSX0lOX1RTVFIpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgY2FzZSBCVEFfQUdfSEZfQ01EX1ZUUzoKKyAgICAgICAgICAgIC8qIGNoZWNrIGFyZ3VtZW50ICovCisgICAgICAgICAgICBpZiAoc3RybGVuKHBfYXJnKSA9PSAxKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGJ0YV9hZ19zZW5kX29rKHBfc2NiKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBldmVudCA9IDA7CisgICAgICAgICAgICAgICAgYnRhX2FnX3NlbmRfZXJyb3IocF9zY2IsIEJUQV9BR19FUlJfSU5WX0NIQVJfSU5fVFNUUik7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKworICAgICAgICBjYXNlIEJUQV9BR19IRl9DTURfQklOUDoKKyAgICAgICAgICAgIC8qIGlmIGZlYXR1cmUgbm90IHNldCBkb24ndCBjYWxsIGNhbGxiYWNrLCBzZW5kIEVSUk9SICovCisgICAgICAgICAgICBpZiAoIShwX3NjYi0+ZmVhdHVyZXMgJiBCVEFfQUdfRkVBVF9WVEFHKSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBldmVudCA9IDA7CisgICAgICAgICAgICAgICAgYnRhX2FnX3NlbmRfZXJyb3IocF9zY2IsIEJUQV9BR19FUlJfT1BfTk9UX1NVUFBPUlRFRCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKworICAgICAgICBjYXNlIEJUQV9BR19IRl9DTURfQlZSQToKKyAgICAgICAgICAgIC8qIGlmIGZlYXR1cmUgbm90IHN1cHBvcnRlZCBkb24ndCBjYWxsIGNhbGxiYWNrLCBzZW5kIEVSUk9SLiBBcHAgd2lsbCBzZW5kIE9LICovCisgICAgICAgICAgICBpZiAoIShwX3NjYi0+ZmVhdHVyZXMgJiBCVEFfQUdfRkVBVF9WUkVDKSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBldmVudCA9IDA7CisgICAgICAgICAgICAgICAgYnRhX2FnX3NlbmRfZXJyb3IocF9zY2IsIEJUQV9BR19FUlJfT1BfTk9UX1NVUFBPUlRFRCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKworICAgICAgICBjYXNlIEJUQV9BR19IRl9DTURfQlJTRjoKKyAgICAgICAgICAgIC8qIHN0b3JlIHBlZXIgZmVhdHVyZXMgKi8KKyAgICAgICAgICAgIHBfc2NiLT5wZWVyX2ZlYXR1cmVzID0gKFVJTlQxNikgaW50X2FyZzsKKworICAgICAgICAgICAgLyogc2VuZCBCUlNGLCBzZW5kIE9LICovCisgICAgICAgICAgICBidGFfYWdfc2VuZF9yZXN1bHQocF9zY2IsIEJUQV9BR19SRVNfQlJTRiwgTlVMTCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoSU5UMTYpIChwX3NjYi0+ZmVhdHVyZXMgJiBCVEFfQUdfQlNSRl9GRUFUX1NQRUMpKTsKKyAgICAgICAgICAgIGJ0YV9hZ19zZW5kX29rKHBfc2NiKTsKKyAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgIGNhc2UgQlRBX0FHX0hGX0NNRF9OUkVDOgorICAgICAgICAgICAgLyogaWYgZmVhdHVyZSBzZW5kIE9LLCBlbHNlIGRvbid0IGNhbGwgY2FsbGJhY2ssIHNlbmQgRVJST1IgKi8KKyAgICAgICAgICAgIGlmIChwX3NjYi0+ZmVhdHVyZXMgJiBCVEFfQUdfRkVBVF9FQ05SKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGJ0YV9hZ19zZW5kX29rKHBfc2NiKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBldmVudCA9IDA7CisgICAgICAgICAgICAgICAgYnRhX2FnX3NlbmRfZXJyb3IocF9zY2IsIEJUQV9BR19FUlJfT1BfTk9UX1NVUFBPUlRFRCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKworICAgICAgICBjYXNlIEJUQV9BR19IRl9DTURfQlRSSDoKKyAgICAgICAgICAgIC8qIGlmIGZlYXR1cmUgc2VuZCBCVFJILCBzZW5kIE9LOiwgZWxzZSBkb24ndCBjYWxsIGNhbGxiYWNrLCBzZW5kIEVSUk9SICovCisgICAgICAgICAgICBpZiAocF9zY2ItPmZlYXR1cmVzICYgQlRBX0FHX0ZFQVRfQlRSSCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAvKiBJZiBzZXQgY29tbWFuZDsgc2VuZCByZXNwb25zZSBhbmQgbm90aWZ5IGFwcCAqLworICAgICAgICAgICAgICAgIGlmIChhcmdfdHlwZSA9PSBCVEFfQUdfQVRfU0VUKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgZm9yIChpID0gMCwgYWdfc2NiID0gJmJ0YV9hZ19jYi5zY2JbMF07IGkgPCBCVEFfQUdfTlVNX1NDQjsgaSsrLCBhZ19zY2IrKykKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGFnX3NjYi0+aW5fdXNlKQorICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJ0YV9hZ19zZW5kX3Jlc3VsdChhZ19zY2IsIEJUQV9BR19SRVNfQlRSSCwgTlVMTCwgaW50X2FyZyk7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgYnRhX2FnX3NlbmRfb2socF9zY2IpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBlbHNlIC8qIFJlYWQgQ29tbWFuZCAqLworICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgdmFsLm51bSA9IEJUQV9BR19CVFJIX1JFQUQ7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGV2ZW50ID0gMDsKKyAgICAgICAgICAgICAgICBidGFfYWdfc2VuZF9lcnJvcihwX3NjYiwgQlRBX0FHX0VSUl9PUF9OT1RfU1VQUE9SVEVEKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgIGNhc2UgQlRBX0FHX0hGX0NNRF9DT1BTOgorICAgICAgICAgICAgaWYgKGFyZ190eXBlID09IEJUQV9BR19BVF9TRVQpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgLyogZG9uJ3QgY2FsbCBjYWxsYmFjayAqLworICAgICAgICAgICAgICAgIGV2ZW50ID0gMDsKKworICAgICAgICAgICAgICAgIC8qIHNlbmQgT0sgKi8KKyAgICAgICAgICAgICAgICBidGFfYWdfc2VuZF9vayhwX3NjYik7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKworICAgICAgICBjYXNlIEJUQV9BR19IRl9DTURfQ01FRToKKyAgICAgICAgICAgIGlmIChwX3NjYi0+ZmVhdHVyZXMgJiBCVEFfQUdfRkVBVF9FWFRFUlIpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgLyogc3RvcmUgc2V0dGluZyAqLworICAgICAgICAgICAgICAgIHBfc2NiLT5jbWVlX2VuYWJsZWQgPSAoQk9PTEVBTikgaW50X2FyZzsKKworICAgICAgICAgICAgICAgIC8qIHNlbmQgT0sgKi8KKyAgICAgICAgICAgICAgICBidGFfYWdfc2VuZF9vayhwX3NjYik7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgYnRhX2FnX3NlbmRfZXJyb3IocF9zY2IsIEJUQV9BR19FUlJfT1BfTk9UX1NVUFBPUlRFRCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICAvKiBkb24ndCBjYWxsIGNhbGxiYWNrICovCisgICAgICAgICAgICBldmVudCA9IDA7CisgICAgICAgICAgICBicmVhazsKKworICAgICAgICBjYXNlIEJUQV9BR19IRl9DTURfQklBOgorICAgICAgICAgICAgLyogZG9uJ3QgY2FsbCBjYWxsYmFjayAqLworICAgICAgICAgICAgZXZlbnQgPSAwOworCisgICAgICAgICAgICBiaWFfbWFza2VkX291dCA9IHBfc2NiLT5iaWFfbWFza2VkX291dDsKKworICAgICAgICAgICAgLyogUGFyc2UgdGhlIGluZGljYXRvciBtYXNrICovCisgICAgICAgICAgICBmb3IgKGkgPSAwLCBpbmRfaWQgPSAxOyAodmFsLnN0cltpXSAhPSAwKSAmJiAoaW5kX2lkIDw9IDIwKTsgaSsrLCBpbmRfaWQrKykKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAodmFsLnN0cltpXSA9PSAnLCcpCisgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOworCisgICAgICAgICAgICAgICAgaWYgKHZhbC5zdHJbaV0gPT0gJzAnKQorICAgICAgICAgICAgICAgICAgICBiaWFfbWFza2VkX291dCB8PSAoKFVJTlQzMikxIDw8IGluZF9pZCk7CisgICAgICAgICAgICAgICAgZWxzZSBpZiAodmFsLnN0cltpXSA9PSAnMScpCisgICAgICAgICAgICAgICAgICAgIGJpYV9tYXNrZWRfb3V0ICY9IH4oKFVJTlQzMikxIDw8IGluZF9pZCk7CisgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgICAgICAgIGkrKzsKKyAgICAgICAgICAgICAgICBpZiAoICh2YWwuc3RyW2ldICE9IDApICYmICh2YWwuc3RyW2ldICE9ICcsJykgKQorICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmICh2YWwuc3RyW2ldID09IDApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgcF9zY2ItPmJpYV9tYXNrZWRfb3V0ID0gYmlhX21hc2tlZF9vdXQ7CisgICAgICAgICAgICAgICAgYnRhX2FnX3NlbmRfb2sgKHBfc2NiKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICBidGFfYWdfc2VuZF9lcnJvciAocF9zY2IsIEJUQV9BR19FUlJfSU5WQUxJRF9JTkRFWCk7CisgICAgICAgICAgICBicmVhazsKKworICAgICAgICBjYXNlIEJUQV9BR19IRl9DTURfQ05VTToKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJUQV9BR19IRl9DTURfQ0xDQzoKKyAgICAgICAgICAgIGlmKCEocF9zY2ItPmZlYXR1cmVzICYgQlRBX0FHX0ZFQVRfRUNTKSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBldmVudCA9IDA7CisgICAgICAgICAgICAgICAgYnRhX2FnX3NlbmRfZXJyb3IocF9zY2IsIEJUQV9BR19FUlJfT1BfTk9UX1NVUFBPUlRFRCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKworI2lmIChCVE1fV0JTX0lOQ0xVREVEID09IFRSVUUgKQorICAgICAgICBjYXNlIEJUQV9BR19IRl9DTURfQkFDOgorICAgICAgICAgICAgYnRhX2FnX3NlbmRfb2socF9zY2IpOworCisgICAgICAgICAgICAvKiBzdG9yZSBhdmFpbGFibGUgY29kZWNzIGZyb20gdGhlIHBlZXIgKi8KKyAgICAgICAgICAgIGlmKChwX3NjYi0+cGVlcl9mZWF0dXJlcyAmIEJUQV9BR19QRUVSX0ZFQVRfQ09ERUMpICYmIChwX3NjYi0+ZmVhdHVyZXMgJiBCVEFfQUdfRkVBVF9DT0RFQykpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgcF9zY2ItPnBlZXJfY29kZWNzID0gYnRhX2FnX3BhcnNlX2JhYyhwX3NjYiwgcF9hcmcpOworICAgICAgICAgICAgICAgIHBfc2NiLT5jb2RlY191cGRhdGVkID0gVFJVRTsKKworICAgICAgICAgICAgICAgIGlmIChwX3NjYi0+cGVlcl9jb2RlY3MgJiBCVEFfQUdfQ09ERUNfTVNCQykKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHBfc2NiLT5zY29fY29kZWMgPSBVVUlEX0NPREVDX01TQkM7CisgICAgICAgICAgICAgICAgICAgIEFQUExfVFJBQ0VfREVCVUcwKCJSZWNlaXZlZCBBVCtCQUMsIHVwZGF0aW5nIHNjbyBjb2RlYyB0byBNU0JDIik7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHBfc2NiLT5zY29fY29kZWMgPSBVVUlEX0NPREVDX0NWU0Q7CisgICAgICAgICAgICAgICAgICAgIEFQUExfVFJBQ0VfREVCVUcwKCJSZWNlaXZlZCBBVCtCQUMsIHVwZGF0aW5nIHNjbyBjb2RlYyB0byBDVlNEIik7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgLyogUmVjZWl2ZWQgQkFDIHdoaWxlIGluIGNvZGVjIG5lZ290aWF0aW9uLiAqLworICAgICAgICAgICAgICAgIGlmICgoYnRhX2FnX2NiLnNjby5zdGF0ZSA9PSBCVEFfQUdfU0NPX0NPREVDX1NUKSAmJiAoYnRhX2FnX2NiLnNjby5wX2N1cnJfc2NiID09IHBfc2NiKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGJ0YV9hZ19jb2RlY19uZWdvdGlhdGUgKHBfc2NiKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgcF9zY2ItPnBlZXJfY29kZWNzID0gQlRBX0FHX0NPREVDX05PTkU7CisgICAgICAgICAgICAgICAgQVBQTF9UUkFDRV9FUlJPUjAoIlVuZXhwZWN0ZWQgQ01EOkFUK0JBQywgQ29kZWMgTmVnb3RpYXRpb24gaXMgbm90IHN1cHBvcnRlZCIpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgY2FzZSBCVEFfQUdfSEZfQ01EX0JDUzoKKyAgICAgICAgICAgIC8qIHN0b3AgY24gdGltZXIgKi8KKyAgICAgICAgICAgIGJ0YV9zeXNfc3RvcF90aW1lcigmcF9zY2ItPmNuX3RpbWVyKTsKKworICAgICAgICAgICAgc3dpdGNoKGludF9hcmcpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgY2FzZSBVVUlEX0NPREVDX0NWU0Q6ICAgY29kZWNfdHlwZSA9IEJUQV9BR19DT0RFQ19DVlNEOyAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgY2FzZSBVVUlEX0NPREVDX01TQkM6ICAgY29kZWNfdHlwZSA9IEJUQV9BR19DT0RFQ19NU0JDOyAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICAgICAgQVBQTF9UUkFDRV9FUlJPUjEoIlVua25vd24gY29kZWNfdXVpZCAlZCIsIGludF9hcmcpOworICAgICAgICAgICAgICAgICAgICBjb2RlY190eXBlID0gMHhGRkZGOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaWYgKHBfc2NiLT5jb2RlY19mYWxsYmFjaykKKyAgICAgICAgICAgICAgICBjb2RlY19zZW50ID0gQlRBX0FHX0NPREVDX0NWU0Q7CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgY29kZWNfc2VudCA9IHBfc2NiLT5zY29fY29kZWM7CisKKyAgICAgICAgICAgIGlmKGNvZGVjX3R5cGUgPT0gY29kZWNfc2VudCkKKyAgICAgICAgICAgICAgICBidGFfYWdfc2NvX2NvZGVjX25lZ28ocF9zY2IsIFRSVUUpOworICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgIGJ0YV9hZ19zY29fY29kZWNfbmVnbyhwX3NjYiwgRkFMU0UpOworCisgICAgICAgICAgICBidGFfYWdfc2VuZF9vayhwX3NjYik7CisgICAgICAgICAgICBicmVhazsKKworICAgICAgICBjYXNlIEJUQV9BR19IRl9DTURfQkNDOgorICAgICAgICAgICAgYnRhX2FnX3NlbmRfb2socF9zY2IpOworICAgICAgICAgICAgYnRhX2FnX3Njb19vcGVuKHBfc2NiLCBOVUxMKTsKKyAgICAgICAgICAgIGJyZWFrOworI2VuZGlmCisKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIGJ0YV9hZ19zZW5kX2Vycm9yKHBfc2NiLCBCVEFfQUdfRVJSX09QX05PVF9TVVBQT1JURUQpOworICAgICAgICAgICAgYnJlYWs7CisgICAgfQorCisgICAgLyogY2FsbCBjYWxsYmFjayAqLworICAgIGlmIChldmVudCAhPSAwKQorICAgIHsKKyAgICAgICAgKCpidGFfYWdfY2IucF9jYmFjaykoZXZlbnQsICh0QlRBX0FHICopICZ2YWwpOworICAgIH0KK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyoqCisqKiBGdW5jdGlvbiAgICAgICAgIGJ0YV9hZ19hdF9lcnJfY2JhY2sKKyoqCisqKiBEZXNjcmlwdGlvbiAgICAgIEFUIGNvbW1hbmQgcGFyc2VyIGVycm9yIGNhbGxiYWNrLgorKioKKyoqCisqKiBSZXR1cm5zICAgICAgICAgIHZvaWQKKyoqCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordm9pZCBidGFfYWdfYXRfZXJyX2NiYWNrKHRCVEFfQUdfU0NCICpwX3NjYiwgQk9PTEVBTiB1bmtub3duLCBjaGFyICpwX2FyZykKK3sKKyAgICB0QlRBX0FHX1ZBTCAgICAgdmFsOworCisgICAgaWYodW5rbm93biAmJiAoIXN0cmxlbihwX2FyZykpKQorICAgIHsKKyAgICAgICAgQVBQTF9UUkFDRV9ERUJVRzAoIkVtcHR5IEFUIGNtZCBzdHJpbmcgcmVjZWl2ZWQiKTsKKyAgICAgICAgYnRhX2FnX3NlbmRfb2socF9zY2IpOworICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgLyogaWYgdW5rbm93biBBVCBjb21tYW5kIGFuZCBjb25maWd1cmVkIHRvIHBhc3MgdGhlc2UgdG8gYXBwICovCisgICAgaWYgKHVua25vd24gJiYgKHBfc2NiLT5mZWF0dXJlcyAmIEJUQV9BR19GRUFUX1VOQVQpKQorICAgIHsKKyAgICAgICAgdmFsLmhkci5oYW5kbGUgPSBidGFfYWdfc2NiX3RvX2lkeChwX3NjYik7CisgICAgICAgIHZhbC5oZHIuYXBwX2lkID0gcF9zY2ItPmFwcF9pZDsKKyAgICAgICAgdmFsLm51bSA9IDA7CisgICAgICAgIEJDTV9TVFJOQ1BZX1ModmFsLnN0ciwgc2l6ZW9mKHZhbC5zdHIpLCBwX2FyZywgQlRBX0FHX0FUX01BWF9MRU4pOworICAgICAgICB2YWwuc3RyW0JUQV9BR19BVF9NQVhfTEVOXSA9IDA7CisgICAgICAgICgqYnRhX2FnX2NiLnBfY2JhY2spKEJUQV9BR19BVF9VTkFUX0VWVCwgKHRCVEFfQUcgKikgJnZhbCk7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgIGJ0YV9hZ19zZW5kX2Vycm9yKHBfc2NiLCBCVEFfQUdfRVJSX09QX05PVF9TVVBQT1JURUQpOworICAgIH0KK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyoqCisqKiBGdW5jdGlvbiAgICAgICAgIGJ0YV9hZ19oc3BfcmVzdWx0CisqKgorKiogRGVzY3JpcHRpb24gICAgICBIYW5kbGUgQVBJIHJlc3VsdCBmb3IgSFNQIGNvbm5lY3Rpb25zLgorKioKKyoqCisqKiBSZXR1cm5zICAgICAgICAgIHZvaWQKKyoqCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordm9pZCBidGFfYWdfaHNwX3Jlc3VsdCh0QlRBX0FHX1NDQiAqcF9zY2IsIHRCVEFfQUdfQVBJX1JFU1VMVCAqcF9yZXN1bHQpCit7CisgICAgVUlOVDggY29kZSA9IGJ0YV9hZ190cmFuc19yZXN1bHRbcF9yZXN1bHQtPnJlc3VsdF07CisKKyAgICBBUFBMX1RSQUNFX0RFQlVHMSgiYnRhX2FnX2hzcF9yZXN1bHQgOiByZXMgPSAlZCIsIHBfcmVzdWx0LT5yZXN1bHQpOworCisgICAgc3dpdGNoKHBfcmVzdWx0LT5yZXN1bHQpCisgICAgeworICAgICAgICBjYXNlIEJUQV9BR19TUEtfUkVTOgorICAgICAgICBjYXNlIEJUQV9BR19NSUNfUkVTOgorICAgICAgICAgICAgYnRhX2FnX3NlbmRfcmVzdWx0KHBfc2NiLCBjb2RlLCBOVUxMLCBwX3Jlc3VsdC0+ZGF0YS5udW0pOworICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgY2FzZSBCVEFfQUdfSU5fQ0FMTF9SRVM6CisgICAgICAgICAgICAvKiB0ZWxsIHN5cyB0byBzdG9wIGF2IGlmIGFueSAqLworICAgICAgICAgICAgYnRhX3N5c19zY29fdXNlKEJUQV9JRF9BRywgcF9zY2ItPmFwcF9pZCwgcF9zY2ItPnBlZXJfYWRkcik7CisKKyAgICAgICAgICAgIC8qIGlmIHNjbyBhbHJlYWR5IG9wZW5lZCBvciBubyBpbmJhbmQgcmluZyBzZW5kIHJpbmcgbm93ICovCisgICAgICAgICAgICBpZiAoYnRhX2FnX3Njb19pc19vcGVuKHBfc2NiKSB8fCAhYnRhX2FnX2luYmFuZF9lbmFibGVkKHBfc2NiKSB8fAorICAgICAgICAgICAgICAgIChwX3NjYi0+ZmVhdHVyZXMgJiBCVEFfQUdfRkVBVF9OT1NDTykpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgYnRhX2FnX3NlbmRfcmluZyhwX3NjYiwgKHRCVEFfQUdfREFUQSAqKSBwX3Jlc3VsdCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICAvKiBlbHNlIG9wZW4gc2NvLCBzZW5kIHJpbmcgYWZ0ZXIgc2NvIG9wZW5lZCAqLworICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIC8qIEhTUHYxLjI6IEFHIHNoYWxsIG5vdCBzZW5kIFJJTkcgaWYgdXNpbmcgaW4tYmFuZCByaW5nIHRvbmUuICovCisgICAgICAgICAgICAgICAgaWYgKHBfc2NiLT5oc3BfdmVyc2lvbiA+PSBIU1BfVkVSU0lPTl8xXzIpCisgICAgICAgICAgICAgICAgICAgIHBfc2NiLT5wb3N0X3NjbyA9IEJUQV9BR19QT1NUX1NDT19OT05FOworICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgcF9zY2ItPnBvc3Rfc2NvID0gQlRBX0FHX1BPU1RfU0NPX1JJTkc7CisKKyAgICAgICAgICAgICAgICBidGFfYWdfc2NvX29wZW4ocF9zY2IsICh0QlRBX0FHX0RBVEEgKikgcF9yZXN1bHQpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgY2FzZSBCVEFfQUdfSU5fQ0FMTF9DT05OX1JFUzoKKyAgICAgICAgY2FzZSBCVEFfQUdfT1VUX0NBTExfT1JJR19SRVM6CisgICAgICAgICAgICAvKiBpZiBpbmNvbWluZyBjYWxsIGNvbm5lY3RlZCBzdG9wIHJpbmcgdGltZXIgKi8KKyAgICAgICAgICAgIGlmIChwX3Jlc3VsdC0+cmVzdWx0ID09IEJUQV9BR19JTl9DQUxMX0NPTk5fUkVTKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGJ0YV9zeXNfc3RvcF90aW1lcigmcF9zY2ItPmFjdF90aW1lcik7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGlmICghKHBfc2NiLT5mZWF0dXJlcyAmIEJUQV9BR19GRUFUX05PU0NPKSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAvKiBpZiBhdWRpbyBjb25uZWN0ZWQgdG8gdGhpcyBzY2Igb3BlbiBzY28gKi8KKyAgICAgICAgICAgICAgICBpZiAocF9yZXN1bHQtPmRhdGEuYXVkaW9faGFuZGxlID09IGJ0YV9hZ19zY2JfdG9faWR4KHBfc2NiKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGJ0YV9hZ19zY29fb3BlbihwX3NjYiwgKHRCVEFfQUdfREFUQSAqKSBwX3Jlc3VsdCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIC8qIGVsc2UgaWYgbm8gYXVkaW8gYXQgY2FsbCBjbG9zZSBzY28gKi8KKyAgICAgICAgICAgICAgICBlbHNlIGlmIChwX3Jlc3VsdC0+ZGF0YS5hdWRpb19oYW5kbGUgPT0gQlRBX0FHX0hBTkRMRV9OT05FKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgYnRhX2FnX3Njb19jbG9zZShwX3NjYiwgKHRCVEFfQUdfREFUQSAqKSBwX3Jlc3VsdCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgY2FzZSBCVEFfQUdfRU5EX0NBTExfUkVTOgorICAgICAgICAgICAgLyogc3RvcCByaW5nIHRpbWVyICovCisgICAgICAgICAgICBidGFfc3lzX3N0b3BfdGltZXIoJnBfc2NiLT5hY3RfdGltZXIpOworCisgICAgICAgICAgICAvKiBjbG9zZSBzY28gKi8KKyAgICAgICAgICAgIGlmICgoYnRhX2FnX3Njb19pc19vcGVuKHBfc2NiKSB8fCBidGFfYWdfc2NvX2lzX29wZW5pbmcocF9zY2IpKSAmJiAhKHBfc2NiLT5mZWF0dXJlcyAmIEJUQV9BR19GRUFUX05PU0NPKSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBidGFfYWdfc2NvX2Nsb3NlKHBfc2NiLCAodEJUQV9BR19EQVRBICopIHBfcmVzdWx0KTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAvKiBpZiBhdiBnb3Qgc3VzcGVuZGVkIGJ5IHRoaXMgY2FsbCwgbGV0IGl0IHJlc3VtZS4gKi8KKyAgICAgICAgICAgICAgICBidGFfc3lzX3Njb191bnVzZShCVEFfSURfQUcsIHBfc2NiLT5hcHBfaWQsIHBfc2NiLT5wZWVyX2FkZHIpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgY2FzZSBCVEFfQUdfSU5CQU5EX1JJTkdfUkVTOgorICAgICAgICAgICAgcF9zY2ItPmluYmFuZF9lbmFibGVkID0gcF9yZXN1bHQtPmRhdGEuc3RhdGU7CisgICAgICAgICAgICBBUFBMX1RSQUNFX0RFQlVHMSgiaW5iYW5kX2VuYWJsZWQgc2V0IHRvICVkIiwgcF9zY2ItPmluYmFuZF9lbmFibGVkKTsKKyAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgIGNhc2UgQlRBX0FHX1VOQVRfUkVTOgorICAgICAgICAgICAgaWYgKHBfcmVzdWx0LT5kYXRhLm9rX2ZsYWcgIT0gQlRBX0FHX09LX0VSUk9SKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmIChwX3Jlc3VsdC0+ZGF0YS5zdHJbMF0gIT0gMCkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGJ0YV9hZ19zZW5kX3Jlc3VsdChwX3NjYiwgY29kZSwgcF9yZXN1bHQtPmRhdGEuc3RyLCAwKTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAocF9yZXN1bHQtPmRhdGEub2tfZmxhZyA9PSBCVEFfQUdfT0tfRE9ORSkKKyAgICAgICAgICAgICAgICAgICAgYnRhX2FnX3NlbmRfb2socF9zY2IpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGJ0YV9hZ19zZW5kX2Vycm9yKHBfc2NiLCBCVEFfQUdfRVJSX0lOVl9DSEFSX0lOX1RTVFIpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIC8qIGlnbm9yZSBhbGwgb3RoZXJzICovCisgICAgICAgICAgICBicmVhazsKKyAgICB9Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisqKgorKiogRnVuY3Rpb24gICAgICAgICBidGFfYWdfaGZwX3Jlc3VsdAorKioKKyoqIERlc2NyaXB0aW9uICAgICAgSGFuZGxlIEFQSSByZXN1bHQgZm9yIEhGUCBjb25uZWN0aW9ucy4KKyoqCisqKgorKiogUmV0dXJucyAgICAgICAgICB2b2lkCisqKgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3ZvaWQgYnRhX2FnX2hmcF9yZXN1bHQodEJUQV9BR19TQ0IgKnBfc2NiLCB0QlRBX0FHX0FQSV9SRVNVTFQgKnBfcmVzdWx0KQoreworICAgIFVJTlQ4IGNvZGUgPSBidGFfYWdfdHJhbnNfcmVzdWx0W3BfcmVzdWx0LT5yZXN1bHRdOworCisgICAgQVBQTF9UUkFDRV9ERUJVRzEoImJ0YV9hZ19oZnBfcmVzdWx0IDogcmVzID0gJWQiLCBwX3Jlc3VsdC0+cmVzdWx0KTsKKworICAgIHN3aXRjaChwX3Jlc3VsdC0+cmVzdWx0KQorICAgIHsKKyAgICAgICAgY2FzZSBCVEFfQUdfU1BLX1JFUzoKKyAgICAgICAgY2FzZSBCVEFfQUdfTUlDX1JFUzoKKyAgICAgICAgICAgIGJ0YV9hZ19zZW5kX3Jlc3VsdChwX3NjYiwgY29kZSwgTlVMTCwgcF9yZXN1bHQtPmRhdGEubnVtKTsKKyAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgIGNhc2UgQlRBX0FHX0lOX0NBTExfUkVTOgorICAgICAgICAgICAgLyogdGVsbCBzeXMgdG8gc3RvcCBhdiBpZiBhbnkgKi8KKyAgICAgICAgICAgIGJ0YV9zeXNfc2NvX3VzZShCVEFfSURfQUcsIHBfc2NiLT5hcHBfaWQsIHBfc2NiLT5wZWVyX2FkZHIpOworCisgICAgICAgICAgICAvKiBzdG9yZSBjYWxsZXIgaWQgc3RyaW5nLgorICAgICAgICAgICAgICogYXBwZW5kIHR5cGUgaW5mbyBhdCB0aGUgZW5kLgorICAgICAgICAgICAgICogbWFrZSBzdXJlIGEgdmFsaWQgdHlwZSBpbmZvIGlzIHBhc3NlZC4KKyAgICAgICAgICAgICAqIG90aGVyd2lzZSBhZGQgMTI5IGFzIGRlZmF1bHQgdHlwZSAqLworICAgICAgICAgICAgaWYgKChwX3Jlc3VsdC0+ZGF0YS5udW0gPCBCVEFfQUdfQ0xJUF9UWVBFX01JTikgfHwgKHBfcmVzdWx0LT5kYXRhLm51bSA+IEJUQV9BR19DTElQX1RZUEVfTUFYKSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAocF9yZXN1bHQtPmRhdGEubnVtICE9IEJUQV9BR19DTElQX1RZUEVfVk9JUCkKKyAgICAgICAgICAgICAgICAgICAgcF9yZXN1bHQtPmRhdGEubnVtID0gQlRBX0FHX0NMSVBfVFlQRV9ERUZBVUxUOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBBUFBMX1RSQUNFX0RFQlVHMSgiQ0xJUCB0eXBlIDolZCIsIHBfcmVzdWx0LT5kYXRhLm51bSk7CisgICAgICAgICAgICBwX3NjYi0+Y2xpcFswXSA9IDA7CisgICAgICAgICAgICBpZiAocF9yZXN1bHQtPmRhdGEuc3RyWzBdICE9IDApCisgICAgICAgICAgICAgICAgc3ByaW50ZihwX3NjYi0+Y2xpcCwiJXMsJWQiLCBwX3Jlc3VsdC0+ZGF0YS5zdHIsIHBfcmVzdWx0LT5kYXRhLm51bSk7CisKKyAgICAgICAgICAgIC8qIHNlbmQgY2FsbHNldHVwIGluZGljYXRvciAqLworICAgICAgICAgICAgaWYgKHBfc2NiLT5wb3N0X3NjbyA9PSBCVEFfQUdfUE9TVF9TQ09fQ0FMTF9FTkQpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgLyogTmVlZCB0byBzZW50IDIgY2FsbHNldHVwIElORCdzKENhbGwgRW5kIGFuZCBJbmNvbWluZyBjYWxsKSBhZnRlciBTQ08gY2xvc2UuICovCisgICAgICAgICAgICAgICAgcF9zY2ItPnBvc3Rfc2NvID0gQlRBX0FHX1BPU1RfU0NPX0NBTExfRU5EX0lOQ0FMTDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBidGFfYWdfc2VuZF9jYWxsX2luZHMocF9zY2IsIHBfcmVzdWx0LT5yZXN1bHQpOworCisgICAgICAgICAgICAgICAgLyogaWYgc2NvIGFscmVhZHkgb3BlbmVkIG9yIG5vIGluYmFuZCByaW5nIHNlbmQgcmluZyBub3cgKi8KKyAgICAgICAgICAgICAgICBpZiAoYnRhX2FnX3Njb19pc19vcGVuKHBfc2NiKSB8fCAhYnRhX2FnX2luYmFuZF9lbmFibGVkKHBfc2NiKSB8fAorICAgICAgICAgICAgICAgICAgICAocF9zY2ItPmZlYXR1cmVzICYgQlRBX0FHX0ZFQVRfTk9TQ08pKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgYnRhX2FnX3NlbmRfcmluZyhwX3NjYiwgKHRCVEFfQUdfREFUQSAqKSBwX3Jlc3VsdCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIC8qIGVsc2Ugb3BlbiBzY28sIHNlbmQgcmluZyBhZnRlciBzY28gb3BlbmVkICovCisgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcF9zY2ItPnBvc3Rfc2NvID0gQlRBX0FHX1BPU1RfU0NPX1JJTkc7CisgICAgICAgICAgICAgICAgICAgIGJ0YV9hZ19zY29fb3BlbihwX3NjYiwgKHRCVEFfQUdfREFUQSAqKSBwX3Jlc3VsdCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgY2FzZSBCVEFfQUdfSU5fQ0FMTF9DT05OX1JFUzoKKyAgICAgICAgICAgIC8qIHN0b3AgcmluZyB0aW1lciAqLworICAgICAgICAgICAgYnRhX3N5c19zdG9wX3RpbWVyKCZwX3NjYi0+YWN0X3RpbWVyKTsKKworICAgICAgICAgICAgLyogaWYgc2NvIG5vdCBvcGVuZWQgYW5kIHdlIG5lZWQgdG8gb3BlbiBpdCwgb3BlbiBzY28gZmlyc3QKKyAgICAgICAgICAgICoqIHRoZW4gc2VuZCBpbmRpY2F0b3JzCisgICAgICAgICAgICAqLworICAgICAgICAgICAgaWYgKHBfcmVzdWx0LT5kYXRhLmF1ZGlvX2hhbmRsZSA9PSBidGFfYWdfc2NiX3RvX2lkeChwX3NjYikgJiYKKyAgICAgICAgICAgICAgICAhYnRhX2FnX3Njb19pc19vcGVuKHBfc2NiKSAmJiAhKHBfc2NiLT5mZWF0dXJlcyAmIEJUQV9BR19GRUFUX05PU0NPKSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBwX3NjYi0+cG9zdF9zY28gPSBCVEFfQUdfUE9TVF9TQ09fQ0FMTF9DT05OOworICAgICAgICAgICAgICAgIGJ0YV9hZ19zY29fb3BlbihwX3NjYiwgKHRCVEFfQUdfREFUQSAqKSBwX3Jlc3VsdCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICAvKiBlbHNlIGlmIHNjbyBvcGVuIGFuZCB3ZSBuZWVkIHRvIGNsb3NlIGl0LCBjbG9zZSBzY28gZmlyc3QKKyAgICAgICAgICAgICoqIHRoZW4gc2VuZCBpbmRpY2F0b3JzCisgICAgICAgICAgICAqLworICAgICAgICAgICAgZWxzZSBpZiAocF9yZXN1bHQtPmRhdGEuYXVkaW9faGFuZGxlID09IEJUQV9BR19IQU5ETEVfTk9ORSAmJgorICAgICAgICAgICAgICAgICAgICAgYnRhX2FnX3Njb19pc19vcGVuKHBfc2NiKSAmJiAhKHBfc2NiLT5mZWF0dXJlcyAmIEJUQV9BR19GRUFUX05PU0NPKSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBwX3NjYi0+cG9zdF9zY28gPSBCVEFfQUdfUE9TVF9TQ09fQ0FMTF9DT05OOworICAgICAgICAgICAgICAgIGJ0YV9hZ19zY29fY2xvc2UocF9zY2IsICh0QlRBX0FHX0RBVEEgKikgcF9yZXN1bHQpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgLyogZWxzZSBzZW5kIGluZGljYXRvcnMgbm93ICovCisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgYnRhX2FnX3NlbmRfY2FsbF9pbmRzKHBfc2NiLCBwX3Jlc3VsdC0+cmVzdWx0KTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgIGNhc2UgQlRBX0FHX0lOX0NBTExfSEVMRF9SRVM6CisgICAgICAgICAgICAvKiBzdG9wIHJpbmcgdGltZXIgKi8KKyAgICAgICAgICAgIGJ0YV9zeXNfc3RvcF90aW1lcigmcF9zY2ItPmFjdF90aW1lcik7CisKKyAgICAgICAgICAgIGJ0YV9hZ19zZW5kX2NhbGxfaW5kcyhwX3NjYiwgcF9yZXN1bHQtPnJlc3VsdCk7CisKKyAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgIGNhc2UgQlRBX0FHX09VVF9DQUxMX09SSUdfUkVTOgorICAgICAgICAgICAgLyogaWYgc2NvIG9wZW4gYW5kIHdlIG5lZWQgdG8gY2xvc2UgaXQsIGNsb3NlIHNjbyBmaXJzdAorICAgICAgICAgICAgKiogdGhlbiBzZW5kIGluZGljYXRvcnM7IGVsc2Ugc2VuZCBpbmRpY2F0b3JzIG5vdworICAgICAgICAgICAgKi8KKyAgICAgICAgICAgIGlmIChwX3Jlc3VsdC0+ZGF0YS5hdWRpb19oYW5kbGUgPT0gQlRBX0FHX0hBTkRMRV9OT05FICYmCisgICAgICAgICAgICAgICAgYnRhX2FnX3Njb19pc19vcGVuKHBfc2NiKSAmJiAhKHBfc2NiLT5mZWF0dXJlcyAmIEJUQV9BR19GRUFUX05PU0NPKSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBwX3NjYi0+cG9zdF9zY28gPSBCVEFfQUdfUE9TVF9TQ09fQ0FMTF9PUklHOworICAgICAgICAgICAgICAgIGJ0YV9hZ19zY29fY2xvc2UocF9zY2IsICh0QlRBX0FHX0RBVEEgKikgcF9yZXN1bHQpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGJ0YV9hZ19zZW5kX2NhbGxfaW5kcyhwX3NjYiwgcF9yZXN1bHQtPnJlc3VsdCk7CisgICAgICAgICAgICAgICAgaWYgKHBfcmVzdWx0LT5kYXRhLmF1ZGlvX2hhbmRsZSA9PSBidGFfYWdfc2NiX3RvX2lkeChwX3NjYikgJiYKKyAgICAgICAgICAgICAgICAgICAgIShwX3NjYi0+ZmVhdHVyZXMgJiBCVEFfQUdfRkVBVF9OT1NDTykpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBidGFfYWdfc2NvX29wZW4ocF9zY2IsICh0QlRBX0FHX0RBVEEgKikgcF9yZXN1bHQpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgIGNhc2UgQlRBX0FHX09VVF9DQUxMX0FMRVJUX1JFUzoKKyAgICAgICAgICAgIC8qIHNlbmQgaW5kaWNhdG9ycyAqLworICAgICAgICAgICAgYnRhX2FnX3NlbmRfY2FsbF9pbmRzKHBfc2NiLCBwX3Jlc3VsdC0+cmVzdWx0KTsKKyAgICAgICAgICAgIGlmIChwX3Jlc3VsdC0+ZGF0YS5hdWRpb19oYW5kbGUgPT0gYnRhX2FnX3NjYl90b19pZHgocF9zY2IpICYmCisgICAgICAgICAgICAgICAgIShwX3NjYi0+ZmVhdHVyZXMgJiBCVEFfQUdfRkVBVF9OT1NDTykpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgYnRhX2FnX3Njb19vcGVuKHBfc2NiLCAodEJUQV9BR19EQVRBICopIHBfcmVzdWx0KTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgIGNhc2UgQlRBX0FHX09VVF9DQUxMX0NPTk5fUkVTOgorICAgICAgICAgICAgLyogc2VuZCBpbmRpY2F0b3JzICovCisgICAgICAgICAgICBidGFfYWdfc2VuZF9jYWxsX2luZHMocF9zY2IsIHBfcmVzdWx0LT5yZXN1bHQpOworCisgICAgICAgICAgICAvKiBvcGVuIG9yIGNsb3NlIHNjbyAqLworICAgICAgICAgICAgaWYgKCEocF9zY2ItPmZlYXR1cmVzICYgQlRBX0FHX0ZFQVRfTk9TQ08pKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmIChwX3Jlc3VsdC0+ZGF0YS5hdWRpb19oYW5kbGUgPT0gYnRhX2FnX3NjYl90b19pZHgocF9zY2IpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgYnRhX2FnX3Njb19vcGVuKHBfc2NiLCAodEJUQV9BR19EQVRBICopIHBfcmVzdWx0KTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZWxzZSBpZiAocF9yZXN1bHQtPmRhdGEuYXVkaW9faGFuZGxlID09IEJUQV9BR19IQU5ETEVfTk9ORSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGJ0YV9hZ19zY29fY2xvc2UocF9zY2IsICh0QlRBX0FHX0RBVEEgKikgcF9yZXN1bHQpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgIGNhc2UgQlRBX0FHX0NBTExfQ0FOQ0VMX1JFUzoKKyAgICAgICAgICAgIC8qIHNlbmQgaW5kaWNhdG9ycyAqLworICAgICAgICAgICAgYnRhX2FnX3NlbmRfY2FsbF9pbmRzKHBfc2NiLCBwX3Jlc3VsdC0+cmVzdWx0KTsKKyAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgIGNhc2UgQlRBX0FHX0VORF9DQUxMX1JFUzoKKyAgICAgICAgICAgIC8qIHN0b3AgcmluZyB0aW1lciAqLworICAgICAgICAgICAgYnRhX3N5c19zdG9wX3RpbWVyKCZwX3NjYi0+YWN0X3RpbWVyKTsKKworICAgICAgICAgICAgLyogaWYgc2NvIG9wZW4sIGNsb3NlIHNjbyB0aGVuIHNlbmQgaW5kaWNhdG9yIHZhbHVlcyAqLworICAgICAgICAgICAgaWYgKChidGFfYWdfc2NvX2lzX29wZW4ocF9zY2IpIHx8IGJ0YV9hZ19zY29faXNfb3BlbmluZyhwX3NjYikpICYmICEocF9zY2ItPmZlYXR1cmVzICYgQlRBX0FHX0ZFQVRfTk9TQ08pKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHBfc2NiLT5wb3N0X3NjbyA9IEJUQV9BR19QT1NUX1NDT19DQUxMX0VORDsKKyAgICAgICAgICAgICAgICBidGFfYWdfc2NvX2Nsb3NlKHBfc2NiLCAodEJUQV9BR19EQVRBICopIHBfcmVzdWx0KTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UgaWYgKHBfc2NiLT5wb3N0X3NjbyA9PSBCVEFfQUdfUE9TVF9TQ09fQ0FMTF9FTkRfSU5DQUxMKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIC8qIHNjbyBjbG9zaW5nIGZvciBvdXRnb2luZyBjYWxsIGJlY2F1c2Ugb2YgaW5jb21pbmcgY2FsbCAqLworICAgICAgICAgICAgICAgIC8qIFNlbmQgb25seSBjYWxsc2V0dXAgZW5kIGluZGljYXRvciBhZnRlciBzY28gY2xvc2UgKi8KKyAgICAgICAgICAgICAgICBwX3NjYi0+cG9zdF9zY28gPSBCVEFfQUdfUE9TVF9TQ09fQ0FMTF9FTkQ7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgYnRhX2FnX3NlbmRfY2FsbF9pbmRzKHBfc2NiLCBwX3Jlc3VsdC0+cmVzdWx0KTsKKworICAgICAgICAgICAgICAgIC8qIGlmIGF2IGdvdCBzdXNwZW5kZWQgYnkgdGhpcyBjYWxsLCBsZXQgaXQgcmVzdW1lLiAqLworICAgICAgICAgICAgICAgIGJ0YV9zeXNfc2NvX3VudXNlKEJUQV9JRF9BRywgcF9zY2ItPmFwcF9pZCwgcF9zY2ItPnBlZXJfYWRkcik7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKworICAgICAgICBjYXNlIEJUQV9BR19JTkJBTkRfUklOR19SRVM6CisgICAgICAgICAgICBwX3NjYi0+aW5iYW5kX2VuYWJsZWQgPSBwX3Jlc3VsdC0+ZGF0YS5zdGF0ZTsKKyAgICAgICAgICAgIEFQUExfVFJBQ0VfREVCVUcxKCJpbmJhbmRfZW5hYmxlZCBzZXQgdG8gJWQiLCBwX3NjYi0+aW5iYW5kX2VuYWJsZWQpOworICAgICAgICAgICAgYnRhX2FnX3NlbmRfcmVzdWx0KHBfc2NiLCBjb2RlLCBOVUxMLCBwX3Jlc3VsdC0+ZGF0YS5zdGF0ZSk7CisgICAgICAgICAgICBicmVhazsKKworICAgICAgICBjYXNlIEJUQV9BR19DSU5EX1JFUzoKKyAgICAgICAgICAgIC8qIHN0b3JlIGxvY2FsIHZhbHVlcyAqLworICAgICAgICAgICAgcF9zY2ItPmNhbGxfaW5kID0gcF9yZXN1bHQtPmRhdGEuc3RyWzBdIC0gJzAnOworICAgICAgICAgICAgcF9zY2ItPmNhbGxzZXR1cF9pbmQgPSBwX3Jlc3VsdC0+ZGF0YS5zdHJbMl0gLSAnMCc7CisgICAgICAgICAgICBwX3NjYi0+c2VydmljZV9pbmQgPSBwX3Jlc3VsdC0+ZGF0YS5zdHJbNF0gLSAnMCc7CisgICAgICAgICAgICBwX3NjYi0+c2lnbmFsX2luZCA9IHBfcmVzdWx0LT5kYXRhLnN0cls2XSAtICcwJzsKKyAgICAgICAgICAgIHBfc2NiLT5yb2FtX2luZCA9IHBfcmVzdWx0LT5kYXRhLnN0cls4XSAtICcwJzsKKyAgICAgICAgICAgIHBfc2NiLT5iYXR0Y2hnX2luZCA9IHBfcmVzdWx0LT5kYXRhLnN0clsxMF0gLSAnMCc7CisgICAgICAgICAgICBBUFBMX1RSQUNFX0RFQlVHMigiY2luZCBjYWxsOiVkIGNhbGxzZXR1cDolZCIsIHBfc2NiLT5jYWxsX2luZCwgcF9zY2ItPmNhbGxzZXR1cF9pbmQpOworCisgICAgICAgICAgICBidGFfYWdfc2VuZF9yZXN1bHQocF9zY2IsIGNvZGUsIHBfcmVzdWx0LT5kYXRhLnN0ciwgMCk7CisgICAgICAgICAgICBidGFfYWdfc2VuZF9vayhwX3NjYik7CisgICAgICAgICAgICBicmVhazsKKworICAgICAgICBjYXNlIEJUQV9BR19CSU5QX1JFUzoKKyAgICAgICAgY2FzZSBCVEFfQUdfQ05VTV9SRVM6CisgICAgICAgIGNhc2UgQlRBX0FHX0NMQ0NfUkVTOgorICAgICAgICBjYXNlIEJUQV9BR19DT1BTX1JFUzoKKyAgICAgICAgICAgIGlmIChwX3Jlc3VsdC0+ZGF0YS5va19mbGFnICE9IEJUQV9BR19PS19FUlJPUikKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAocF9yZXN1bHQtPmRhdGEuc3RyWzBdICE9IDApCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgIGJ0YV9hZ19zZW5kX3Jlc3VsdChwX3NjYiwgY29kZSwgcF9yZXN1bHQtPmRhdGEuc3RyLCAwKTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAocF9yZXN1bHQtPmRhdGEub2tfZmxhZyA9PSBCVEFfQUdfT0tfRE9ORSkKKyAgICAgICAgICAgICAgICAgICAgYnRhX2FnX3NlbmRfb2socF9zY2IpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGJ0YV9hZ19zZW5kX2Vycm9yKHBfc2NiLCBwX3Jlc3VsdC0+ZGF0YS5lcnJjb2RlKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworCisKKyAgICAgICAgY2FzZSBCVEFfQUdfVU5BVF9SRVM6CisgICAgICAgICAgICBpZiAocF9yZXN1bHQtPmRhdGEub2tfZmxhZyAhPSBCVEFfQUdfT0tfRVJST1IpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKHBfcmVzdWx0LT5kYXRhLnN0clswXSAhPSAwKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgYnRhX2FnX3Byb2Nlc3NfdW5hdF9yZXMocF9yZXN1bHQtPmRhdGEuc3RyKTsKKyAgICAgICAgICAgICAgICAgICAgQVBQTF9UUkFDRV9ERUJVRzEoIkJUQV9BR19SRVMgOiVzIixwX3Jlc3VsdC0+ZGF0YS5zdHIpOworICAgICAgICAgICAgICAgICAgICBidGFfYWdfc2VuZF9yZXN1bHQocF9zY2IsIGNvZGUsIHBfcmVzdWx0LT5kYXRhLnN0ciwgMCk7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKHBfcmVzdWx0LT5kYXRhLm9rX2ZsYWcgPT0gQlRBX0FHX09LX0RPTkUpCisgICAgICAgICAgICAgICAgICAgIGJ0YV9hZ19zZW5kX29rKHBfc2NiKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBidGFfYWdfc2VuZF9lcnJvcihwX3NjYiwgcF9yZXN1bHQtPmRhdGEuZXJyY29kZSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKworICAgICAgICBjYXNlIEJUQV9BR19DQUxMX1dBSVRfUkVTOgorICAgICAgICAgICAgaWYgKHBfc2NiLT5jY3dhX2VuYWJsZWQpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgYnRhX2FnX3NlbmRfcmVzdWx0KHBfc2NiLCBjb2RlLCBwX3Jlc3VsdC0+ZGF0YS5zdHIsIDApOworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnRhX2FnX3NlbmRfY2FsbF9pbmRzKHBfc2NiLCBwX3Jlc3VsdC0+cmVzdWx0KTsKKyAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgIGNhc2UgQlRBX0FHX0lORF9SRVM6CisgICAgICAgICAgICBidGFfYWdfc2VuZF9pbmQocF9zY2IsIHBfcmVzdWx0LT5kYXRhLmluZC5pZCwgcF9yZXN1bHQtPmRhdGEuaW5kLnZhbHVlLCBGQUxTRSk7CisgICAgICAgICAgICBicmVhazsKKworICAgICAgICBjYXNlIEJUQV9BR19CVlJBX1JFUzoKKyAgICAgICAgICAgIGJ0YV9hZ19zZW5kX3Jlc3VsdChwX3NjYiwgY29kZSwgTlVMTCwgcF9yZXN1bHQtPmRhdGEuc3RhdGUpOworICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgY2FzZSBCVEFfQUdfQlRSSF9SRVM6CisgICAgICAgICAgICBpZiAocF9yZXN1bHQtPmRhdGEub2tfZmxhZyAhPSBCVEFfQUdfT0tfRVJST1IpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgLyogRG9uJ3QgcmVzcG9uZCB0byByZWFkIGlmIG5vdCBpbiByZXNwb25zZSAmIGhvbGQgc3RhdGUgKi8KKyAgICAgICAgICAgICAgICBpZiAocF9yZXN1bHQtPmRhdGEubnVtICE9IEJUQV9BR19CVFJIX05PX1JFU1ApCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBidGFfYWdfc2VuZF9yZXN1bHQocF9zY2IsIGNvZGUsIE5VTEwsIHBfcmVzdWx0LT5kYXRhLm51bSk7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgLyogSW4gY2FzZSBvZiBhIHJlc3BvbnNlIHRvIGEgcmVhZCByZXF1ZXN0IHdlIG5lZWQgdG8gc2VuZCBPSyAqLworICAgICAgICAgICAgICAgIGlmIChwX3Jlc3VsdC0+ZGF0YS5va19mbGFnID09IEJUQV9BR19PS19ET05FKQorICAgICAgICAgICAgICAgICAgICBidGFfYWdfc2VuZF9vayhwX3NjYik7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgYnRhX2FnX3NlbmRfZXJyb3IocF9zY2IsIHBfcmVzdWx0LT5kYXRhLmVycmNvZGUpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgYnJlYWs7CisgICAgfQorfQorCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisqKgorKiogRnVuY3Rpb24gICAgICAgICBidGFfYWdfcmVzdWx0CisqKgorKiogRGVzY3JpcHRpb24gICAgICBIYW5kbGUgQVBJIHJlc3VsdC4KKyoqCisqKgorKiogUmV0dXJucyAgICAgICAgICB2b2lkCisqKgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3ZvaWQgYnRhX2FnX3Jlc3VsdCh0QlRBX0FHX1NDQiAqcF9zY2IsIHRCVEFfQUdfREFUQSAqcF9kYXRhKQoreworICAgIGlmIChwX3NjYi0+Y29ubl9zZXJ2aWNlID09IEJUQV9BR19IU1ApCisgICAgeworICAgICAgICBidGFfYWdfaHNwX3Jlc3VsdChwX3NjYiwgJnBfZGF0YS0+YXBpX3Jlc3VsdCk7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgIGJ0YV9hZ19oZnBfcmVzdWx0KHBfc2NiLCAmcF9kYXRhLT5hcGlfcmVzdWx0KTsKKyAgICB9Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisqKgorKiogRnVuY3Rpb24gICAgICAgICBidGFfYWdfc2V0Y29kZWMKKyoqCisqKiBEZXNjcmlwdGlvbiAgICAgIEhhbmRsZSBBUEkgU2V0Q29kZWMKKyoqCisqKgorKiogUmV0dXJucyAgICAgICAgICB2b2lkCisqKgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3ZvaWQgYnRhX2FnX3NldGNvZGVjKHRCVEFfQUdfU0NCICpwX3NjYiwgdEJUQV9BR19EQVRBICpwX2RhdGEpCit7CisjaWYgKEJUTV9XQlNfSU5DTFVERUQgPT0gVFJVRSApCisgICAgdEJUQV9BR19QRUVSX0NPREVDIGNvZGVjX3R5cGUgPSBwX2RhdGEtPmFwaV9zZXRjb2RlYy5jb2RlYzsKKworICAgIC8qIENoZWNrIGlmIHRoZSByZXF1ZXN0ZWQgY29kZWMgdHlwZSBpcyB2YWxpZCAqLworICAgIGlmKChjb2RlY190eXBlICE9IEJUQV9BR19DT0RFQ19OT05FKSAmJgorICAgICAgIChjb2RlY190eXBlICE9IEJUQV9BR19DT0RFQ19DVlNEKSAmJgorICAgICAgIChjb2RlY190eXBlICE9IEJUQV9BR19DT0RFQ19NU0JDKSkKKyAgICB7CisgICAgICAgIEFQUExfVFJBQ0VfRVJST1IxKCJidGFfYWdfc2V0Y29kZWMgZXJyb3I6IHVuc3VwcG9ydGVkIGNvZGVjIHR5cGUgJWQiLCBjb2RlY190eXBlKTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIGlmKChwX3NjYi0+cGVlcl9jb2RlY3MgJiBjb2RlY190eXBlKSB8fCAoY29kZWNfdHlwZSA9PSBCVEFfQUdfQ09ERUNfTk9ORSkgfHwgKGNvZGVjX3R5cGUgPT0gQlRBX0FHX0NPREVDX0NWU0QpKQorICAgIHsKKyAgICAgICAgcF9zY2ItPnNjb19jb2RlYyA9IGNvZGVjX3R5cGU7CisgICAgICAgIHBfc2NiLT5jb2RlY191cGRhdGVkID0gVFJVRTsKKyAgICAgICAgQVBQTF9UUkFDRV9ERUJVRzEoImJ0YV9hZ19zZXRjb2RlYzogVXBkYXRlZCBjb2RlYyB0eXBlICVkIiwgY29kZWNfdHlwZSk7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgIEFQUExfVFJBQ0VfRVJST1IxKCJidGFfYWdfc2V0Y29kZWMgZXJyb3I6IHVuc3VwcG9ydGVkIGNvZGVjIHR5cGUgJWQiLCBjb2RlY190eXBlKTsKKyAgICB9CisjZWxzZQorICAgIFVOVVNFRChwX3NjYik7CisgICAgVU5VU0VEKHBfZGF0YSk7CisjZW5kaWYKK30KKworCisjaWYgKEJUTV9XQlNfSU5DTFVERUQgPT0gVFJVRSApCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorKioKKyoqIEZ1bmN0aW9uICAgICAgICAgYnRhX2FnX3NlbmRfYmNzCisqKgorKiogRGVzY3JpcHRpb24gICAgICBTZW5kICtCQ1MgQVQgY29tbWFuZCB0byBwZWVyLgorKioKKyoqIFJldHVybnMgICAgICAgICAgdm9pZAorKioKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit2b2lkIGJ0YV9hZ19zZW5kX2Jjcyh0QlRBX0FHX1NDQiAqcF9zY2IsIHRCVEFfQUdfREFUQSAqcF9kYXRhKQoreworICAgIFVJTlQxNiBjb2RlY191dWlkOworCisgICAgaWYgKHBfc2NiLT5jb2RlY19mYWxsYmFjaykKKyAgICB7CisgICAgICAgIGNvZGVjX3V1aWQgPSBVVUlEX0NPREVDX0NWU0Q7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgIHN3aXRjaChwX3NjYi0+c2NvX2NvZGVjKQorICAgICAgICB7CisgICAgICAgICAgICBjYXNlIEJUQV9BR19DT0RFQ19OT05FOiAgICAgY29kZWNfdXVpZCA9IFVVSURfQ09ERUNfQ1ZTRDsgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgQlRBX0FHX0NPREVDX0NWU0Q6ICAgICBjb2RlY191dWlkID0gVVVJRF9DT0RFQ19DVlNEOyAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBCVEFfQUdfQ09ERUNfTVNCQzogICAgIGNvZGVjX3V1aWQgPSBVVUlEX0NPREVDX01TQkM7ICAgYnJlYWs7CisgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgIEFQUExfVFJBQ0VfRVJST1IxKCJidGFfYWdfc2VuZF9iY3M6IHVua25vd24gY29kZWMgJWQsIHVzZSBDVlNEIiwgcF9zY2ItPnNjb19jb2RlYyk7CisgICAgICAgICAgICAgICAgY29kZWNfdXVpZCA9IFVVSURfQ09ERUNfQ1ZTRDsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qIHNlbmQgK0JDUyAqLworICAgIGJ0YV9hZ19zZW5kX3Jlc3VsdChwX3NjYiwgQlRBX0FHX1JFU19CQ1MsIE5VTEwsIGNvZGVjX3V1aWQpOworCit9CisjZW5kaWYKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyoqCisqKiBGdW5jdGlvbiAgICAgICAgIGJ0YV9hZ19zZW5kX3JpbmcKKyoqCisqKiBEZXNjcmlwdGlvbiAgICAgIFNlbmQgUklORyByZXN1bHQgY29kZSB0byBwZWVyLgorKioKKyoqCisqKiBSZXR1cm5zICAgICAgICAgIHZvaWQKKyoqCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordm9pZCBidGFfYWdfc2VuZF9yaW5nKHRCVEFfQUdfU0NCICpwX3NjYiwgdEJUQV9BR19EQVRBICpwX2RhdGEpCit7CisgICAgVU5VU0VEKHBfZGF0YSk7CisKKyNpZiBkZWZpbmVkKEJUQV9BR19NVUxUSV9SRVNVTFRfSU5DTFVERUQpICYmIChCVEFfQUdfTVVMVElfUkVTVUxUX0lOQ0xVREVEID09IFRSVUUpCisgICAgdEJUQV9BR19NVUxUSV9SRVNVTFRfQ0IgbV9yZXNfY2I7CisKKyAgICBpZiAocF9zY2ItPmNvbm5fc2VydmljZSA9PSBCVEFfQUdfSEZQICYmIHBfc2NiLT5jbGlwX2VuYWJsZWQgJiYgcF9zY2ItPmNsaXBbMF0gIT0gMCkKKyAgICB7CisgICAgICAgIG1lbXNldCgmbV9yZXNfY2IsIE5VTEwsIHNpemVvZih0QlRBX0FHX01VTFRJX1JFU1VMVF9DQikpOworCisgICAgICAgIG1fcmVzX2NiLm51bV9yZXN1bHQgPSAyOworICAgICAgICBBVF9TRVRfUkVTX0NCKG1fcmVzX2NiLnJlc19jYlswXSwgQlRBX0FHX1JFU19SSU5HLCBOVUxMLCAwKQorICAgICAgICBBVF9TRVRfUkVTX0NCKG1fcmVzX2NiLnJlc19jYlsxXSwgQlRBX0FHX1JFU19DTElQLCBwX3NjYi0+Y2xpcCwgMCkKKworICAgICAgICBidGFfYWdfc2VuZF9tdWx0aV9yZXN1bHQocF9zY2IsICZtX3Jlc19jYik7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgIC8qIHNlbmQgUklORyBPTkxZICovCisgICAgICAgIGJ0YV9hZ19zZW5kX3Jlc3VsdChwX3NjYiwgQlRBX0FHX1JFU19SSU5HLCBOVUxMLCAwKTsKKyAgICB9CisjZWxzZQorICAgIC8qIHNlbmQgUklORyAqLworICAgIGJ0YV9hZ19zZW5kX3Jlc3VsdChwX3NjYiwgQlRBX0FHX1JFU19SSU5HLCBOVUxMLCAwKTsKKworICAgIC8qIGlmIEhGUCBhbmQgY2xpcCBlbmFibGVkIGFuZCBjbGlwIGRhdGEgc2VuZCBDTElQICovCisgICAgaWYgKHBfc2NiLT5jb25uX3NlcnZpY2UgPT0gQlRBX0FHX0hGUCAmJiBwX3NjYi0+Y2xpcF9lbmFibGVkICYmIHBfc2NiLT5jbGlwWzBdICE9IDApCisgICAgeworICAgICAgICBidGFfYWdfc2VuZF9yZXN1bHQocF9zY2IsIEJUQV9BR19SRVNfQ0xJUCwgcF9zY2ItPmNsaXAsIDApOworICAgIH0KKyNlbmRpZgorCisgICAgLyogcmVzdGFydCByaW5nIHRpbWVyICovCisgICAgYnRhX3N5c19zdGFydF90aW1lcigmcF9zY2ItPmFjdF90aW1lciwgQlRBX0FHX1JJTkdfVE9VVF9FVlQsIEJUQV9BR19SSU5HX1RPVVQpOworfQorCisKZGlmZiAtLWdpdCBhL2J0YS9oZl9jbGllbnQvYnRhX2hmX2NsaWVudF9pbnQuaCBiL2J0YS9oZl9jbGllbnQvYnRhX2hmX2NsaWVudF9pbnQuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iMGQxYjFkCi0tLSAvZGV2L251bGwKKysrIGIvYnRhL2hmX2NsaWVudC9idGFfaGZfY2xpZW50X2ludC5oCkBAIC0wLDAgKzEsNDIzIEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgorICogIENvcHlyaWdodCAoQykgMjAwMy0yMDEyIEJyb2FkY29tIENvcnBvcmF0aW9uCisgKgorICogIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQ6CisgKgorICogIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoKKyAqICBUaGlzIGlzIHRoZSBwcml2YXRlIGludGVyZmFjZSBmaWxlIGZvciB0aGUgQlRBIGF1ZGlvIGdhdGV3YXkuCisgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNpZm5kZWYgQlRBX0FHX0lOVF9ICisjZGVmaW5lIEJUQV9BR19JTlRfSAorCisjaW5jbHVkZSAiYnRhX3N5cy5oIgorI2luY2x1ZGUgImJ0YV9hcGkuaCIKKyNpbmNsdWRlICJidGFfYWdfYXBpLmgiCisjaW5jbHVkZSAiYnRhX2FnX2F0LmgiCisKKy8qIFNlbmQgUklORyAmIENMSVAgaW4gb25lIEFUIGNtZCAqLworI2lmbmRlZiBCVEFfQUdfTVVMVElfUkVTVUxUX0lOQ0xVREVECisjZGVmaW5lIEJUQV9BR19NVUxUSV9SRVNVTFRfSU5DTFVERUQgICAgICBGQUxTRQorI2VuZGlmCisKKy8qIFJlcGxhY2UgOiBpbiBWR1MgYW5kIFZHTSBmb3IgSFNQICovCisjaWZuZGVmIEJUQV9IU1BfUkVTVUxUX1JFUExBQ0VfQ09MT04KKyNkZWZpbmUgQlRBX0hTUF9SRVNVTFRfUkVQTEFDRV9DT0xPTiAgICAgIFRSVUUKKyNlbmRpZgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyoqICBDb25zdGFudHMKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2RlZmluZSBIRlBfVkVSU0lPTl8xXzEgICAgICAgICAweDAxMDEKKyNkZWZpbmUgSEZQX1ZFUlNJT05fMV81ICAgICAgICAgMHgwMTA1CisjZGVmaW5lIEhGUF9WRVJTSU9OXzFfNiAgICAgICAgIDB4MDEwNgorCisjZGVmaW5lIEhTUF9WRVJTSU9OXzFfMCAgICAgICAgIDB4MDEwMAorI2RlZmluZSBIU1BfVkVSU0lPTl8xXzIgICAgICAgICAweDAxMDIKKworLyogTnVtYmVyIG9mIFNDQnMgKEFHIHNlcnZpY2UgaW5zdGFuY2VzIHRoYXQgY2FuIGJlIHJlZ2lzdGVyZWQpICovCisjaWZuZGVmIEJUQV9BR19OVU1fU0NCCisjZGVmaW5lIEJUQV9BR19OVU1fU0NCICAgICAgICAgIDIKKyNlbmRpZgorCisvKiBUaW1lciB0byB3YWl0IGZvciByZXRyeSBpbiBjYXNlIG9mIGNvbGxpc2lvbiAqLworI2lmbmRlZiBCVEFfQUdfQ09MTElTSU9OX1RJTUVSCisjZGVmaW5lIEJUQV9BR19DT0xMSVNJT05fVElNRVIgIDIwMDAKKyNlbmRpZgorCisvKiBSRkNPTU0gTVRVIFNJWkUgKi8KKyNkZWZpbmUgQlRBX0FHX01UVSAgICAgICAgICAgICAgMjU2CisKKy8qIEludGVybmFsIHByb2ZpbGUgaW5kZXhlcyAqLworI2RlZmluZSBCVEFfQUdfSFNQICAgICAgICAgICAgICAwICAgICAgIC8qIGluZGV4IGZvciBIU1AgKi8KKyNkZWZpbmUgQlRBX0FHX0hGUCAgICAgICAgICAgICAgMSAgICAgICAvKiBpbmRleCBmb3IgSEZQICovCisjZGVmaW5lIEJUQV9BR19OVU1fSURYICAgICAgICAgIDIgICAgICAgLyogbnVtYmVyIG9mIHByb2ZpbGUgaW5kZXhlcyAqLworCisvKiBwcm9maWxlIHJvbGUgZm9yIGNvbm5lY3Rpb24gKi8KKyNkZWZpbmUgQlRBX0FHX0FDUCAgICAgICAgICAgICAgMCAgICAgICAvKiBhY2NlcHRlZCBjb25uZWN0aW9uICovCisjZGVmaW5lIEJUQV9BR19JTlQgICAgICAgICAgICAgIDEgICAgICAgLyogaW5pdGlhdGluZyBjb25uZWN0aW9uICovCisKKy8qIGZlYXR1cmUgbWFzayB0aGF0IG1hdGNoZXMgc3BlYyAqLworI2RlZmluZSBCVEFfQUdfQlNSRl9GRUFUX1NQRUMgICAgICAgIChCVEFfQUdfRkVBVF8zV0FZIHwgQlRBX0FHX0ZFQVRfRUNOUiAgICB8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQlRBX0FHX0ZFQVRfVlJFQyB8IEJUQV9BR19GRUFUX0lOQkFORCAgfCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJUQV9BR19GRUFUX1ZUQUcgfCBCVEFfQUdfRkVBVF9SRUpFQ1QgIHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCVEFfQUdfRkVBVF9FQ1MgIHwgQlRBX0FHX0ZFQVRfRUNDICAgICB8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQlRBX0FHX0ZFQVRfRVhURVJSIHwgQlRBX0FHX0ZFQVRfQ09ERUMgfCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJUQV9BR19GRUFUX1ZPSVApCisKKyNkZWZpbmUgQlRBX0FHX1NEUF9GRUFUX1NQRUMgICAgICAgICAoQlRBX0FHX0ZFQVRfM1dBWSB8IEJUQV9BR19GRUFUX0VDTlIgICAgfCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJUQV9BR19GRUFUX1ZSRUMgfCBCVEFfQUdfRkVBVF9JTkJBTkQgIHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCVEFfQUdfRkVBVF9WVEFHKQorCitlbnVtCit7CisgICAgLyogdGhlc2UgZXZlbnRzIGFyZSBoYW5kbGVkIGJ5IHRoZSBzdGF0ZSBtYWNoaW5lICovCisgICAgQlRBX0FHX0FQSV9SRUdJU1RFUl9FVlQgPSBCVEFfU1lTX0VWVF9TVEFSVChCVEFfSURfQUcpLAorICAgIEJUQV9BR19BUElfREVSRUdJU1RFUl9FVlQsCisgICAgQlRBX0FHX0FQSV9PUEVOX0VWVCwKKyAgICBCVEFfQUdfQVBJX0NMT1NFX0VWVCwKKyAgICBCVEFfQUdfQVBJX0FVRElPX09QRU5fRVZULAorICAgIEJUQV9BR19BUElfQVVESU9fQ0xPU0VfRVZULAorICAgIEJUQV9BR19BUElfUkVTVUxUX0VWVCwKKyAgICBCVEFfQUdfQVBJX1NFVENPREVDX0VWVCwKKyAgICBCVEFfQUdfUkZDX09QRU5fRVZULAorICAgIEJUQV9BR19SRkNfQ0xPU0VfRVZULAorICAgIEJUQV9BR19SRkNfU1JWX0NMT1NFX0VWVCwKKyAgICBCVEFfQUdfUkZDX0RBVEFfRVZULAorICAgIEJUQV9BR19TQ09fT1BFTl9FVlQsCisgICAgQlRBX0FHX1NDT19DTE9TRV9FVlQsCisgICAgQlRBX0FHX0RJU0NfQUNQX1JFU19FVlQsCisgICAgQlRBX0FHX0RJU0NfSU5UX1JFU19FVlQsCisgICAgQlRBX0FHX0RJU0NfT0tfRVZULAorICAgIEJUQV9BR19ESVNDX0ZBSUxfRVZULAorICAgIEJUQV9BR19DSV9SWF9XUklURV9FVlQsCisgICAgQlRBX0FHX1JJTkdfVE9VVF9FVlQsCisgICAgQlRBX0FHX1NWQ19UT1VUX0VWVCwKKyAgICBCVEFfQUdfQ0lfU0NPX0RBVEFfRVZULAorICAgIEJUQV9BR19DSV9TTENfUkVBRFlfRVZULAorICAgIEJUQV9BR19NQVhfRVZULAorCisgICAgLyogdGhlc2UgZXZlbnRzIGFyZSBoYW5kbGVkIG91dHNpZGUgb2YgdGhlIHN0YXRlIG1hY2hpbmUgKi8KKyAgICBCVEFfQUdfQVBJX0VOQUJMRV9FVlQsCisgICAgQlRBX0FHX0FQSV9ESVNBQkxFX0VWVAorfTsKKworLyogQWN0aW9ucyB0byBwZXJmb3JtIGFmdGVyIGEgU0NPIGV2ZW50ICovCitlbnVtCit7CisgICAgQlRBX0FHX1BPU1RfU0NPX05PTkUsICAgICAgIC8qIG5vIGFjdGlvbiAqLworICAgIEJUQV9BR19QT1NUX1NDT19DTE9TRV9SRkMsICAvKiBjbG9zZSBSRkNPTU0gY2hhbm5lbCBhZnRlciBTQ08gY2xvc2VzICovCisgICAgQlRBX0FHX1BPU1RfU0NPX1JJTkcsICAgICAgIC8qIHNlbmQgUklORyByZXN1bHQgY29kZSBhZnRlciBTQ08gb3BlbnMgKi8KKyAgICBCVEFfQUdfUE9TVF9TQ09fQ0FMTF9DT05OLCAgLyogc2VuZCBjYWxsIGluZGljYXRvcnMgYWZ0ZXIgU0NPIG9wZW5zL2Nsb3NlcyAqLworICAgIEJUQV9BR19QT1NUX1NDT19DQUxMX09SSUcsICAvKiBzZW5kIGNhbGwgaW5kaWNhdG9ycyBhZnRlciBTQ08gY2xvc2VzICovCisgICAgQlRBX0FHX1BPU1RfU0NPX0NBTExfRU5ELCAgIC8qIHNlbmQgY2FsbCBpbmRpY2F0b3JzIGFmdGVyIFNDTyBjbG9zZXMgKi8KKyAgICBCVEFfQUdfUE9TVF9TQ09fQ0FMTF9FTkRfSU5DQUxMICAgLyogc2VuZCBjYWxsIGluZGljYXRvcnMgZm9yIGVuZCBjYWxsICYgaW5jb21pbmcgY2FsbCBhZnRlciBTQ08gY2xvc2VzICovCit9OworCisvKiBzY28gc3RhdGVzICovCitlbnVtCit7CisgICAgQlRBX0FHX1NDT19TSFVURE9XTl9TVCwgICAgIC8qIG5vIHNjbyBsaXN0ZW5pbmcsIGFsbCBzY28gY29ubmVjdGlvbnMgY2xvc2VkICovCisgICAgQlRBX0FHX1NDT19MSVNURU5fU1QsICAgICAgIC8qIHNjbyBsaXN0ZW5pbmcgKi8KKyNpZiAoQlRNX1dCU19JTkNMVURFRCA9PSBUUlVFICkKKyAgICBCVEFfQUdfU0NPX0NPREVDX1NULCAgICAgICAgLyogc2NvIGNvZGVjIG5lZ290aWF0aW9uICovCisjZW5kaWYKKyAgICBCVEFfQUdfU0NPX09QRU5JTkdfU1QsICAgICAgLyogc2NvIGNvbm5lY3Rpb24gb3BlbmluZyAqLworICAgIEJUQV9BR19TQ09fT1BFTl9DTF9TVCwgICAgICAvKiBvcGVuaW5nIHNjbyBjb25uZWN0aW9uIGJlaW5nIGNsb3NlZCAqLworICAgIEJUQV9BR19TQ09fT1BFTl9YRkVSX1NULCAgICAvKiBvcGVuaW5nIHNjbyBjb25uZWN0aW9uIGJlaW5nIHRyYW5zZmVycmVkICovCisgICAgQlRBX0FHX1NDT19PUEVOX1NULCAgICAgICAgIC8qIHNjbyBvcGVuICovCisgICAgQlRBX0FHX1NDT19DTE9TSU5HX1NULCAgICAgIC8qIHNjbyBjbG9zaW5nICovCisgICAgQlRBX0FHX1NDT19DTE9TRV9PUF9TVCwgICAgIC8qIGNsb3Npbmcgc2NvIGJlaW5nIG9wZW5lZCAqLworICAgIEJUQV9BR19TQ09fQ0xPU0VfWEZFUl9TVCwgICAvKiBjbG9zaW5nIHNjbyBiZWluZyB0cmFuc2ZlcnJlZCAqLworICAgIEJUQV9BR19TQ09fU0hVVFRJTkdfU1QgICAgICAvKiBzY28gc2h1dHRpbmcgZG93biAqLworfTsKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisqKiAgRGF0YSB0eXBlcworKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKy8qIGRhdGEgdHlwZSBmb3IgQlRBX0FHX0FQSV9FTkFCTEVfRVZUICovCit0eXBlZGVmIHN0cnVjdAoreworICAgIEJUX0hEUiAgICAgICAgICAgICAgaGRyOworICAgIHRCVEFfQUdfUEFSU0VfTU9ERSAgcGFyc2VfbW9kZTsKKyAgICB0QlRBX0FHX0NCQUNLICAgICAgKnBfY2JhY2s7Cit9IHRCVEFfQUdfQVBJX0VOQUJMRTsKKworLyogZGF0YSB0eXBlIGZvciBCVEFfQUdfQVBJX1JFR0lTVEVSX0VWVCAqLwordHlwZWRlZiBzdHJ1Y3QKK3sKKyAgICBCVF9IRFIgICAgICAgICAgICAgIGhkcjsKKyAgICBjaGFyICAgICAgICAgICAgICAgIHBfbmFtZVsyXVtCVEFfU0VSVklDRV9OQU1FX0xFTisxXTsKKyAgICB0QlRBX1NFUlZJQ0VfTUFTSyAgIHNlcnZpY2VzOworICAgIHRCVEFfU0VDICAgICAgICAgICAgc2VjX21hc2s7CisgICAgdEJUQV9BR19GRUFUICAgICAgICBmZWF0dXJlczsKKyAgICBVSU5UOCAgICAgICAgICAgICAgIGFwcF9pZDsKK30gdEJUQV9BR19BUElfUkVHSVNURVI7CisKKy8qIGRhdGEgdHlwZSBmb3IgQlRBX0FHX0FQSV9PUEVOX0VWVCAqLwordHlwZWRlZiBzdHJ1Y3QKK3sKKyAgICBCVF9IRFIgICAgICAgICAgICAgIGhkcjsKKyAgICBCRF9BRERSICAgICAgICAgICAgIGJkX2FkZHI7CisgICAgdEJUQV9TRVJWSUNFX01BU0sgICBzZXJ2aWNlczsKKyAgICB0QlRBX1NFQyAgICAgICAgICAgIHNlY19tYXNrOworfSB0QlRBX0FHX0FQSV9PUEVOOworCisvKiBkYXRhIHR5cGUgZm9yIEJUQV9BR19BUElfUkVTVUxUX0VWVCAqLwordHlwZWRlZiBzdHJ1Y3QKK3sKKyAgICBCVF9IRFIgICAgICAgICAgICBoZHI7CisgICAgdEJUQV9BR19SRVMgICAgICAgcmVzdWx0OworICAgIHRCVEFfQUdfUkVTX0RBVEEgIGRhdGE7Cit9IHRCVEFfQUdfQVBJX1JFU1VMVDsKKworLyogZGF0YSB0eXBlIGZvciBCVEFfQUdfQVBJX1NFVENPREVDX0VWVCAqLwordHlwZWRlZiBzdHJ1Y3QKK3sKKyAgICBCVF9IRFIgICAgICAgICAgICAgIGhkcjsKKyAgICB0QlRBX0FHX1BFRVJfQ09ERUMgIGNvZGVjOworfSB0QlRBX0FHX0FQSV9TRVRDT0RFQzsKKworLyogZGF0YSB0eXBlIGZvciBCVEFfQUdfRElTQ19SRVNVTFRfRVZUICovCit0eXBlZGVmIHN0cnVjdAoreworICAgIEJUX0hEUiAgICAgICAgICBoZHI7CisgICAgVUlOVDE2ICAgICAgICAgIHN0YXR1czsKK30gdEJUQV9BR19ESVNDX1JFU1VMVDsKKworLyogZGF0YSB0eXBlIGZvciBSRkNPTU0gZXZlbnRzICovCit0eXBlZGVmIHN0cnVjdAoreworICAgIEJUX0hEUiAgICAgICAgICBoZHI7CisgICAgVUlOVDE2ICAgICAgICAgIHBvcnRfaGFuZGxlOworfSB0QlRBX0FHX1JGQzsKKworLyogZGF0YSB0eXBlIGZvciBCVEFfQUdfQ0lfUlhfV1JJVEVfRVZUICovCit0eXBlZGVmIHN0cnVjdAoreworICAgIEJUX0hEUiAgICAgICAgICBoZHI7CisvLyAgICBjaGFyICAgICAgICAgICAgcF9kYXRhW0JUQV9BR19NVFUrMV07Cit9IHRCVEFfQUdfQ0lfUlhfV1JJVEU7CisKKy8qIHVuaW9uIG9mIGFsbCBldmVudCBkYXRhdHlwZXMgKi8KK3R5cGVkZWYgdW5pb24KK3sKKyAgICBCVF9IRFIgICAgICAgICAgICAgICAgICBoZHI7CisgICAgdEJUQV9BR19BUElfRU5BQkxFICAgICAgYXBpX2VuYWJsZTsKKyAgICB0QlRBX0FHX0FQSV9SRUdJU1RFUiAgICBhcGlfcmVnaXN0ZXI7CisgICAgdEJUQV9BR19BUElfT1BFTiAgICAgICAgYXBpX29wZW47CisgICAgdEJUQV9BR19BUElfUkVTVUxUICAgICAgYXBpX3Jlc3VsdDsKKyNpZiAoQlRNX1dCU19JTkNMVURFRCA9PSBUUlVFICkKKyAgICB0QlRBX0FHX0FQSV9TRVRDT0RFQyAgICBhcGlfc2V0Y29kZWM7CisjZW5kaWYKKyAgICB0QlRBX0FHX0RJU0NfUkVTVUxUICAgICBkaXNjX3Jlc3VsdDsKKyAgICB0QlRBX0FHX1JGQyAgICAgICAgICAgICByZmM7CisgICAgdEJUQV9BR19DSV9SWF9XUklURSAgICAgY2lfcnhfd3JpdGU7Cit9IHRCVEFfQUdfREFUQTsKKworLyogdHlwZSBmb3IgZWFjaCBwcm9maWxlICovCit0eXBlZGVmIHN0cnVjdAoreworICAgIFVJTlQzMiAgICAgICAgICBzZHBfaGFuZGxlOworICAgIFVJTlQ4ICAgICAgICAgICBzY247Cit9IHRCVEFfQUdfUFJPRklMRTsKKworLyogdHlwZSBmb3IgZWFjaCBzZXJ2aWNlIGNvbnRyb2wgYmxvY2sgKi8KK3R5cGVkZWYgc3RydWN0Cit7CisgICAgY2hhciAgICAgICAgICAgICAgICBjbGlwW0JUQV9BR19BVF9NQVhfTEVOKzFdOyAvKiBudW1iZXIgc3RyaW5nIHVzZWQgZm9yIENMSVAgKi8KKyAgICBVSU5UMTYgICAgICAgICAgICAgIHNlcnZfaGFuZGxlW0JUQV9BR19OVU1fSURYXTsgLyogUkZDT01NIHNlcnZlciBoYW5kbGVzICovCisgICAgdEJUQV9BR19BVF9DQiAgICAgICBhdF9jYjsgICAgICAgICAgLyogQVQgY29tbWFuZCBpbnRlcnByZXRlciAqLworICAgIFRJTUVSX0xJU1RfRU5UICAgICAgYWN0X3RpbWVyOyAgICAgLyogcmluZyB0aW1lciAqLworICAgIEJEX0FERFIgICAgICAgICAgICAgcGVlcl9hZGRyOyAgICAgIC8qIHBlZXIgYmQgYWRkcmVzcyAqLworICAgIHRTRFBfRElTQ09WRVJZX0RCICAgKnBfZGlzY19kYjsgICAgIC8qIHBvaW50ZXIgdG8gZGlzY292ZXJ5IGRhdGFiYXNlICovCisgICAgdEJUQV9TRVJWSUNFX01BU0sgICByZWdfc2VydmljZXM7ICAgLyogc2VydmljZXMgc3BlY2lmaWVkIGluIHJlZ2lzdGVyIEFQSSAqLworICAgIHRCVEFfU0VSVklDRV9NQVNLICAgb3Blbl9zZXJ2aWNlczsgIC8qIHNlcnZpY2VzIHNwZWNpZmllZCBpbiBvcGVuIEFQSSAqLworICAgIFVJTlQxNiAgICAgICAgICAgICAgY29ubl9oYW5kbGU7ICAgIC8qIFJGQ09NTSBoYW5kbGUgb2YgY29ubmVjdGVkIHNlcnZpY2UgKi8KKyAgICB0QlRBX1NFQyAgICAgICAgICAgIHNlcnZfc2VjX21hc2s7ICAvKiBzZXJ2ZXIgc2VjdXJpdHkgbWFzayAqLworICAgIHRCVEFfU0VDICAgICAgICAgICAgY2xpX3NlY19tYXNrOyAgIC8qIGNsaWVudCBzZWN1cml0eSBtYXNrICovCisgICAgdEJUQV9BR19GRUFUICAgICAgICBmZWF0dXJlczsgICAgICAgLyogZmVhdHVyZXMgcmVnaXN0ZXJlZCBieSBhcHBsaWNhdGlvbiAqLworICAgIHRCVEFfQUdfUEVFUl9GRUFUICAgcGVlcl9mZWF0dXJlczsgIC8qIHBlZXIgZGV2aWNlIGZlYXR1cmVzICovCisgICAgVUlOVDE2ICAgICAgICAgICAgICBwZWVyX3ZlcnNpb247ICAgLyogcHJvZmlsZSB2ZXJzaW9uIG9mIHBlZXIgZGV2aWNlICovCisgICAgVUlOVDE2ICAgICAgICAgICAgICBoc3BfdmVyc2lvbjsgICAgLyogSFNQIHByb2ZpbGUgdmVyc2lvbiAqLworI2lmIChCVE1fV0JTX0lOQ0xVREVEID09IFRSVUUgKQorICAgIHRCVEFfQUdfUEVFUl9DT0RFQyAgcGVlcl9jb2RlY3M7ICAgIC8qIGNvZGVjcyBmb3IgZVNDTyBzdXBwb3J0ZWQgYnkgdGhlIHBlZXIgKi8KKyAgICB0QlRBX0FHX1BFRVJfQ09ERUMgIHNjb19jb2RlYzsgICAgICAvKiBjb2RlYyB0byBiZSB1c2VkIGZvciBlU0NPIGNvbm5lY3Rpb24gKi8KKyAgICB0QlRBX0FHX1BFRVJfQ09ERUMgIGludXNlX2NvZGVjOyAgICAvKiBjb2RlYyBiZWluZyB1c2VkIGZvciB0aGUgY3VycmVudCBTQ08gY29ubmVjdGlvbiAqLworICAgIEJPT0xFQU4gICAgICAgICAgICAgY29kZWNfdXBkYXRlZDsgIC8qIHNldCB0byBUUlVFIHdoZW5ldmVyIHRoZSBhcHAgdXBkYXRlcyBjb2RlYyB0eXBlICovCisgICAgQk9PTEVBTiAgICAgICAgICAgICBjb2RlY19mYWxsYmFjazsgLyogSWYgc2NvIG5lZ28gZmFpbHMgZm9yIG1TQkMsIGZhbGxiYWNrIHRvIENWU0QgKi8KKyAgICBUSU1FUl9MSVNUX0VOVCAgICAgIGNuX3RpbWVyOyAgICAgICAvKiBjb2RlYyBuZWdvdGlhdGlvbiB0aW1lciAqLworI2VuZGlmCisgICAgVUlOVDE2ICAgICAgICAgICAgICBzY29faWR4OyAgICAgICAgLyogU0NPIGhhbmRsZSAqLworICAgIEJPT0xFQU4gICAgICAgICAgICAgaW5fdXNlOyAgICAgICAgIC8qIHNjYiBpbiB1c2UgKi8KKyAgICBCT09MRUFOICAgICAgICAgICAgIGRlYWxsb2M7ICAgICAgICAvKiBUUlVFIGlmIHNlcnZpY2Ugc2h1dHRpbmcgZG93biAqLworICAgIEJPT0xFQU4gICAgICAgICAgICAgY2xpcF9lbmFibGVkOyAgIC8qIHNldCB0byBUUlVFIGlmIEhGIGVuYWJsZXMgQ0xJUCByZXBvcnRpbmcgKi8KKyAgICBCT09MRUFOICAgICAgICAgICAgIGNjd2FfZW5hYmxlZDsgICAvKiBzZXQgdG8gVFJVRSBpZiBIRiBlbmFibGVzIENDV0EgcmVwb3J0aW5nICovCisgICAgQk9PTEVBTiAgICAgICAgICAgICBjbWVyX2VuYWJsZWQ7ICAgLyogc2V0IHRvIFRSVUUgaWYgSEYgZW5hYmxlcyBDTUVSIHJlcG9ydGluZyAqLworICAgIEJPT0xFQU4gICAgICAgICAgICAgY21lZV9lbmFibGVkOyAgIC8qIHNldCB0byBUUlVFIGlmIEhGIGVuYWJsZXMgQ01FIEVSUk9SIHJlcG9ydGluZyAqLworICAgIEJPT0xFQU4gICAgICAgICAgICAgaW5iYW5kX2VuYWJsZWQ7IC8qIHNldCB0byBUUlVFIGlmIGluYmFuZCByaW5nIGVuYWJsZWQgKi8KKyAgICBCT09MRUFOICAgICAgICAgICAgIHN2Y19jb25uOyAgICAgICAvKiBzZXQgdG8gVFJVRSB3aGVuIHNlcnZpY2UgbGV2ZWwgY29ubmVjdGlvbiB1cCAqLworICAgIFRJTUVSX0xJU1RfRU5UICAgICAgY29sbGlfdGltZXI7ICAgIC8qIENvbGxpc2lvbiB0aW1lciAqLworICAgIEJPT0xFQU4gICAgICAgICAgICAgY29sbGlfdG1yX29uOyAgIC8qIFRSVUUgaWYgY29sbGlzaW9uIHRpbWVyIGlzIGFjdGl2ZSAqLworICAgIFVJTlQ4ICAgICAgICAgICAgICAgc3RhdGU7ICAgICAgICAgIC8qIHN0YXRlIG1hY2hpbmUgc3RhdGUgKi8KKyAgICBVSU5UOCAgICAgICAgICAgICAgIGNvbm5fc2VydmljZTsgICAvKiBjb25uZWN0ZWQgc2VydmljZSAqLworICAgIFVJTlQ4ICAgICAgICAgICAgICAgcGVlcl9zY247ICAgICAgIC8qIHBlZXIgc2NuICovCisgICAgVUlOVDggICAgICAgICAgICAgICBhcHBfaWQ7ICAgICAgICAgLyogYXBwbGljYXRpb24gaWQgKi8KKyAgICBVSU5UOCAgICAgICAgICAgICAgIHJvbGU7ICAgICAgICAgICAvKiBpbml0aWF0b3IvYWNjZXB0b3Igcm9sZSAqLworICAgIFVJTlQ4ICAgICAgICAgICAgICAgcG9zdF9zY287ICAgICAgIC8qIGFjdGlvbiB0byBwZXJmb3JtIGFmdGVyIHNjbyBldmVudCAqLworICAgIFVJTlQ4ICAgICAgICAgICAgICAgY2FsbF9pbmQ7ICAgICAgIC8qIENJRVYgY2FsbCBpbmRpY2F0b3IgdmFsdWUgKi8KKyAgICBVSU5UOCAgICAgICAgICAgICAgIGNhbGxzZXR1cF9pbmQ7ICAvKiBDSUVWIGNhbGxzZXR1cCBpbmRpY2F0b3IgdmFsdWUgKi8KKyAgICBVSU5UOCAgICAgICAgICAgICAgIHNlcnZpY2VfaW5kOyAgICAvKiBDSUVWIHNlcnZpY2UgaW5kaWNhdG9yIHZhbHVlICovCisgICAgVUlOVDggICAgICAgICAgICAgICBzaWduYWxfaW5kOyAgICAgLyogQ0lFViBzaWduYWwgaW5kaWNhdG9yIHZhbHVlICovCisgICAgVUlOVDggICAgICAgICAgICAgICByb2FtX2luZDsgICAgICAgLyogQ0lFViByb2FtIGluZGljYXRvciB2YWx1ZSAqLworICAgIFVJTlQ4ICAgICAgICAgICAgICAgYmF0dGNoZ19pbmQ7ICAgIC8qIENJRVYgYmF0dGVyeSBjaGFyZ2UgaW5kaWNhdG9yIHZhbHVlICovCisgICAgVUlOVDggICAgICAgICAgICAgICBjYWxsaGVsZF9pbmQ7ICAgLyogQ0lFViBjYWxsIGhlbGQgaW5kaWNhdG9yIHZhbHVlICovCisgICAgQk9PTEVBTiAgICAgICAgICAgICByZXRyeV93aXRoX3Njb19vbmx5OyAvKiBpbmRpY2F0b3IgdG8gdHJ5IHdpdGggU0NPIG9ubHkgd2hlbiBlU0NPIGZhaWxzICovCisgICAgVUlOVDMyICAgICAgICAgICAgICBiaWFfbWFza2VkX291dDsgLyogaW5kaWNhdG9ycyBIRiBkb2VzIG5vdCB3YW50IHVzIHRvIHNlbmQgKi8KK30gdEJUQV9BR19TQ0I7CisKKy8qIHR5cGUgZm9yIHNjbyBkYXRhICovCit0eXBlZGVmIHN0cnVjdAoreworICAgIHRCVE1fRVNDT19DT05OX1JFUV9FVlRfREFUQSAgY29ubl9kYXRhOyAgICAgLyogU0NPIGRhdGEgZm9yIHBlbmRpbmcgY29ubiByZXF1ZXN0ICovCisgICAgdEJUQV9BR19TQ0IgICAgICAgICAgICAgICAgICpwX2N1cnJfc2NiOyAgICAvKiBTQ0IgYXNzb2NpYXRlZCB3aXRoIFNDTyBjb25uZWN0aW9uICovCisgICAgdEJUQV9BR19TQ0IgICAgICAgICAgICAgICAgICpwX3hmZXJfc2NiOyAgICAvKiBTQ0IgYXNzb2NpYXRlZCB3aXRoIFNDTyB0cmFuc2ZlciAqLworICAgIFVJTlQxNiAgICAgICAgICAgICAgICAgICAgICBjdXJfaWR4OyAgICAgICAgLyogU0NPIGhhbmRsZSAqLworICAgIFVJTlQ4ICAgICAgICAgICAgICAgICAgICAgICBzdGF0ZTsgICAgICAgICAgLyogU0NPIHN0YXRlIHZhcmlhYmxlICovCisgICAgQk9PTEVBTiAgICAgICAgICAgICAgICAgICAgIHBhcmFtX3VwZGF0ZWQ7ICAvKiBpZiBwYXJhbXMgd2VyZSB1cGRhdGVkIHRvIG5vbi1kZWZhdWx0ICovCisgICAgdEJUTV9FU0NPX1BBUkFNUyAgICAgICAgICAgIHBhcmFtczsgICAgICAgICAvKiBFU0NPIHBhcmFtZXRlcnMgKi8KK30gdEJUQV9BR19TQ09fQ0I7CisKKworLyogdHlwZSBmb3IgQUcgY29udHJvbCBibG9jayAqLwordHlwZWRlZiBzdHJ1Y3QKK3sKKyAgICB0QlRBX0FHX1NDQiAgICAgICAgIHNjYltCVEFfQUdfTlVNX1NDQl07ICAgICAgICAvKiBzZXJ2aWNlIGNvbnRyb2wgYmxvY2tzICovCisgICAgdEJUQV9BR19QUk9GSUxFICAgICBwcm9maWxlW0JUQV9BR19OVU1fSURYXTsgICAgLyogcHJvZmlsZS1zcGVjaWZpYyBkYXRhICovCisgICAgdEJUQV9BR19TQ09fQ0IgICAgICBzY287ICAgICAgICAgICAgICAgICAgICAgICAgLyogU0NPIGRhdGEgKi8KKyAgICB0QlRBX0FHX0NCQUNLICAgICAgICpwX2NiYWNrOyAgICAgICAgICAgICAgICAgICAvKiBhcHBsaWNhdGlvbiBjYWxsYmFjayAqLworICAgIHRCVEFfQUdfUEFSU0VfTU9ERSAgcGFyc2VfbW9kZTsgICAgICAgICAgICAgICAgIC8qIHBhcnNlL3Bhc3MtdGhyb3VnaCBtb2RlICovCit9IHRCVEFfQUdfQ0I7CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorKiogIEdsb2JhbCBkYXRhCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworLyogY29uc3RhbnQgbG9va3VwIHRhYmxlcyAqLworZXh0ZXJuIGNvbnN0IFVJTlQxNiBidGFfYWdfdXVpZFtCVEFfQUdfTlVNX0lEWF07CitleHRlcm4gY29uc3QgVUlOVDggYnRhX2FnX3NlY19pZFtCVEFfQUdfTlVNX0lEWF07CitleHRlcm4gY29uc3QgdEJUQV9BR19BVF9DTUQgKmJ0YV9hZ19hdF90YmxbQlRBX0FHX05VTV9JRFhdOworCisvKiBjb250cm9sIGJsb2NrIGRlY2xhcmF0aW9uICovCisjaWYgQlRBX0RZTkFNSUNfTUVNT1JZID09IEZBTFNFCitleHRlcm4gdEJUQV9BR19DQiBidGFfYWdfY2I7CisjZWxzZQorZXh0ZXJuIHRCVEFfQUdfQ0IgKmJ0YV9hZ19jYl9wdHI7CisjZGVmaW5lIGJ0YV9hZ19jYiAoKmJ0YV9hZ19jYl9wdHIpCisjZW5kaWYKKworLyogY29uZmlnIHN0cnVjdCAqLworZXh0ZXJuIHRCVEFfQUdfQ0ZHICpwX2J0YV9hZ19jZmc7CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorKiogIEZ1bmN0aW9uIHByb3RvdHlwZXMKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisvKiBtYWluIGZ1bmN0aW9ucyAqLworZXh0ZXJuIHZvaWQgYnRhX2FnX3NjYl9kZWFsbG9jKHRCVEFfQUdfU0NCICpwX3NjYik7CitleHRlcm4gVUlOVDE2IGJ0YV9hZ19zY2JfdG9faWR4KHRCVEFfQUdfU0NCICpwX3NjYik7CitleHRlcm4gdEJUQV9BR19TQ0IgKmJ0YV9hZ19zY2JfYnlfaWR4KFVJTlQxNiBpZHgpOworZXh0ZXJuIFVJTlQ4IGJ0YV9hZ19zZXJ2aWNlX3RvX2lkeCh0QlRBX1NFUlZJQ0VfTUFTSyBzZXJ2aWNlcyk7CitleHRlcm4gVUlOVDE2IGJ0YV9hZ19pZHhfYnlfYmRhZGRyKEJEX0FERFIgcGVlcl9hZGRyKTsKK2V4dGVybiBCT09MRUFOIGJ0YV9hZ19vdGhlcl9zY2Jfb3Blbih0QlRBX0FHX1NDQiAqcF9jdXJyX3NjYik7CitleHRlcm4gdEJUQV9BR19TQ0IgKmJ0YV9hZ19nZXRfb3RoZXJfaWRsZV9zY2IgKHRCVEFfQUdfU0NCICpwX2N1cnJfc2NiKTsKK2V4dGVybiB2b2lkIGJ0YV9hZ19zbV9leGVjdXRlKHRCVEFfQUdfU0NCICpwX3NjYiwgVUlOVDE2IGV2ZW50LCB0QlRBX0FHX0RBVEEgKnBfZGF0YSk7CitleHRlcm4gQk9PTEVBTiBidGFfYWdfaGRsX2V2ZW50KEJUX0hEUiAqcF9tc2cpOworZXh0ZXJuIHZvaWQgYnRhX2FnX2NvbGxpc2lvbl9jYmFjayAodEJUQV9TWVNfQ09OTl9TVEFUVVMgc3RhdHVzLCBVSU5UOCBpZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFVJTlQ4IGFwcF9pZCwgQkRfQUREUiBwZWVyX2FkZHIpOworZXh0ZXJuIHZvaWQgYnRhX2FnX3Jlc3VtZV9vcGVuICh0QlRBX0FHX1NDQiAqcF9zY2IpOworCisvKiBTRFAgZnVuY3Rpb25zICovCitleHRlcm4gQk9PTEVBTiBidGFfYWdfYWRkX3JlY29yZChVSU5UMTYgc2VydmljZV91dWlkLCBjaGFyICpwX3NlcnZpY2VfbmFtZSwgVUlOVDggc2NuLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdEJUQV9BR19GRUFUIGZlYXR1cmVzLCBVSU5UMzIgc2RwX2hhbmRsZSk7CitleHRlcm4gdm9pZCBidGFfYWdfY3JlYXRlX3JlY29yZHModEJUQV9BR19TQ0IgKnBfc2NiLCB0QlRBX0FHX0RBVEEgKnBfZGF0YSk7CitleHRlcm4gdm9pZCBidGFfYWdfZGVsX3JlY29yZHModEJUQV9BR19TQ0IgKnBfc2NiLCB0QlRBX0FHX0RBVEEgKnBfZGF0YSk7CitleHRlcm4gQk9PTEVBTiBidGFfYWdfc2RwX2ZpbmRfYXR0cih0QlRBX0FHX1NDQiAqcF9zY2IsIHRCVEFfU0VSVklDRV9NQVNLIHNlcnZpY2UpOworZXh0ZXJuIHZvaWQgYnRhX2FnX2RvX2Rpc2ModEJUQV9BR19TQ0IgKnBfc2NiLCB0QlRBX1NFUlZJQ0VfTUFTSyBzZXJ2aWNlKTsKK2V4dGVybiB2b2lkIGJ0YV9hZ19mcmVlX2RiKHRCVEFfQUdfU0NCICpwX3NjYiwgdEJUQV9BR19EQVRBICpwX2RhdGEpOworCisvKiBSRkNPTU0gZnVuY3Rpb25zICovCitleHRlcm4gdm9pZCBidGFfYWdfc3RhcnRfc2VydmVycyh0QlRBX0FHX1NDQiAqcF9zY2IsIHRCVEFfU0VSVklDRV9NQVNLIHNlcnZpY2VzKTsKK2V4dGVybiB2b2lkIGJ0YV9hZ19jbG9zZV9zZXJ2ZXJzKHRCVEFfQUdfU0NCICpwX3NjYiwgdEJUQV9TRVJWSUNFX01BU0sgc2VydmljZXMpOworZXh0ZXJuIEJPT0xFQU4gYnRhX2FnX2lzX3NlcnZlcl9jbG9zZWQgKHRCVEFfQUdfU0NCICpwX3NjYik7CitleHRlcm4gdm9pZCBidGFfYWdfcmZjX2RvX2Nsb3NlKHRCVEFfQUdfU0NCICpwX3NjYiwgdEJUQV9BR19EQVRBICpwX2RhdGEpOworZXh0ZXJuIHZvaWQgYnRhX2FnX3JmY19kb19vcGVuKHRCVEFfQUdfU0NCICpwX3NjYiwgdEJUQV9BR19EQVRBICpwX2RhdGEpOworCisvKiBTQ08gZnVuY3Rpb25zICovCitleHRlcm4gQk9PTEVBTiBidGFfYWdfc2NvX2lzX29wZW4odEJUQV9BR19TQ0IgKnBfc2NiKTsKK2V4dGVybiBCT09MRUFOIGJ0YV9hZ19zY29faXNfb3BlbmluZyh0QlRBX0FHX1NDQiAqcF9zY2IpOworZXh0ZXJuIHZvaWQgYnRhX2FnX3Njb19jb25uX3JzcCh0QlRBX0FHX1NDQiAqcF9zY2IsIHRCVE1fRVNDT19DT05OX1JFUV9FVlRfREFUQSAqcF9kYXRhKTsKKworLyogQVQgY29tbWFuZCBmdW5jdGlvbnMgKi8KK2V4dGVybiB2b2lkIGJ0YV9hZ19hdF9oc3BfY2JhY2sodEJUQV9BR19TQ0IgKnBfc2NiLCBVSU5UMTYgY21kLCBVSU5UOCBhcmdfdHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hhciAqcF9hcmcsIElOVDE2IGludF9hcmcpOworZXh0ZXJuIHZvaWQgYnRhX2FnX2F0X2hmcF9jYmFjayh0QlRBX0FHX1NDQiAqcF9zY2IsIFVJTlQxNiBjbWQsIFVJTlQ4IGFyZ190eXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaGFyICpwX2FyZywgSU5UMTYgaW50X2FyZyk7CitleHRlcm4gdm9pZCBidGFfYWdfYXRfZXJyX2NiYWNrKHRCVEFfQUdfU0NCICpwX3NjYiwgQk9PTEVBTiB1bmtub3duLCBjaGFyICpwX2FyZyk7CitleHRlcm4gQk9PTEVBTiBidGFfYWdfaW5iYW5kX2VuYWJsZWQodEJUQV9BR19TQ0IgKnBfc2NiKTsKK2V4dGVybiB2b2lkIGJ0YV9hZ19zZW5kX2NhbGxfaW5kcyh0QlRBX0FHX1NDQiAqcF9zY2IsIHRCVEFfQUdfUkVTIHJlc3VsdCk7CisKKy8qIEFjdGlvbiBmdW5jdGlvbnMgKi8KK2V4dGVybiB2b2lkIGJ0YV9hZ19yZWdpc3Rlcih0QlRBX0FHX1NDQiAqcF9zY2IsIHRCVEFfQUdfREFUQSAqcF9kYXRhKTsKK2V4dGVybiB2b2lkIGJ0YV9hZ19kZXJlZ2lzdGVyKHRCVEFfQUdfU0NCICpwX3NjYiwgdEJUQV9BR19EQVRBICpwX2RhdGEpOworZXh0ZXJuIHZvaWQgYnRhX2FnX3N0YXJ0X2RlcmVnKHRCVEFfQUdfU0NCICpwX3NjYiwgdEJUQV9BR19EQVRBICpwX2RhdGEpOworZXh0ZXJuIHZvaWQgYnRhX2FnX3N0YXJ0X2Nsb3NlKHRCVEFfQUdfU0NCICpwX3NjYiwgdEJUQV9BR19EQVRBICpwX2RhdGEpOworZXh0ZXJuIHZvaWQgYnRhX2FnX3N0YXJ0X29wZW4odEJUQV9BR19TQ0IgKnBfc2NiLCB0QlRBX0FHX0RBVEEgKnBfZGF0YSk7CitleHRlcm4gdm9pZCBidGFfYWdfZGlzY19pbnRfcmVzKHRCVEFfQUdfU0NCICpwX3NjYiwgdEJUQV9BR19EQVRBICpwX2RhdGEpOworZXh0ZXJuIHZvaWQgYnRhX2FnX2Rpc2NfYWNwX3Jlcyh0QlRBX0FHX1NDQiAqcF9zY2IsIHRCVEFfQUdfREFUQSAqcF9kYXRhKTsKK2V4dGVybiB2b2lkIGJ0YV9hZ19kaXNjX2ZhaWwodEJUQV9BR19TQ0IgKnBfc2NiLCB0QlRBX0FHX0RBVEEgKnBfZGF0YSk7CitleHRlcm4gdm9pZCBidGFfYWdfb3Blbl9mYWlsKHRCVEFfQUdfU0NCICpwX3NjYiwgdEJUQV9BR19EQVRBICpwX2RhdGEpOworZXh0ZXJuIHZvaWQgYnRhX2FnX3JmY19mYWlsKHRCVEFfQUdfU0NCICpwX3NjYiwgdEJUQV9BR19EQVRBICpwX2RhdGEpOworZXh0ZXJuIHZvaWQgYnRhX2FnX3JmY19jbG9zZSh0QlRBX0FHX1NDQiAqcF9zY2IsIHRCVEFfQUdfREFUQSAqcF9kYXRhKTsKK2V4dGVybiB2b2lkIGJ0YV9hZ19yZmNfb3Blbih0QlRBX0FHX1NDQiAqcF9zY2IsIHRCVEFfQUdfREFUQSAqcF9kYXRhKTsKK2V4dGVybiB2b2lkIGJ0YV9hZ19yZmNfYWNwX29wZW4odEJUQV9BR19TQ0IgKnBfc2NiLCB0QlRBX0FHX0RBVEEgKnBfZGF0YSk7CitleHRlcm4gdm9pZCBidGFfYWdfcmZjX2RhdGEodEJUQV9BR19TQ0IgKnBfc2NiLCB0QlRBX0FHX0RBVEEgKnBfZGF0YSk7CitleHRlcm4gdm9pZCBidGFfYWdfc2NvX2xpc3Rlbih0QlRBX0FHX1NDQiAqcF9zY2IsIHRCVEFfQUdfREFUQSAqcF9kYXRhKTsKK2V4dGVybiB2b2lkIGJ0YV9hZ19zY29fb3Blbih0QlRBX0FHX1NDQiAqcF9zY2IsIHRCVEFfQUdfREFUQSAqcF9kYXRhKTsKK2V4dGVybiB2b2lkIGJ0YV9hZ19zY29fY2xvc2UodEJUQV9BR19TQ0IgKnBfc2NiLCB0QlRBX0FHX0RBVEEgKnBfZGF0YSk7CisjaWYgKEJUTV9XQlNfSU5DTFVERUQgPT0gVFJVRSApCitleHRlcm4gdm9pZCBidGFfYWdfc2NvX2NvZGVjX25lZ28odEJUQV9BR19TQ0IgKnBfc2NiLCBCT09MRUFOIHJlc3VsdCk7CitleHRlcm4gdm9pZCBidGFfYWdfY29kZWNfbmVnb3RpYXRlICh0QlRBX0FHX1NDQiAqcF9zY2IpOworI2VuZGlmCitleHRlcm4gdm9pZCBidGFfYWdfc2NvX3NodXRkb3duKHRCVEFfQUdfU0NCICpwX3NjYiwgdEJUQV9BR19EQVRBICpwX2RhdGEpOworZXh0ZXJuIHZvaWQgYnRhX2FnX3Njb19jb25uX29wZW4odEJUQV9BR19TQ0IgKnBfc2NiLCB0QlRBX0FHX0RBVEEgKnBfZGF0YSk7CitleHRlcm4gdm9pZCBidGFfYWdfc2NvX2Nvbm5fY2xvc2UodEJUQV9BR19TQ0IgKnBfc2NiLCB0QlRBX0FHX0RBVEEgKnBfZGF0YSk7CitleHRlcm4gdm9pZCBidGFfYWdfcG9zdF9zY29fb3Blbih0QlRBX0FHX1NDQiAqcF9zY2IsIHRCVEFfQUdfREFUQSAqcF9kYXRhKTsKK2V4dGVybiB2b2lkIGJ0YV9hZ19wb3N0X3Njb19jbG9zZSh0QlRBX0FHX1NDQiAqcF9zY2IsIHRCVEFfQUdfREFUQSAqcF9kYXRhKTsKK2V4dGVybiB2b2lkIGJ0YV9hZ19zdmNfY29ubl9vcGVuKHRCVEFfQUdfU0NCICpwX3NjYiwgdEJUQV9BR19EQVRBICpwX2RhdGEpOworZXh0ZXJuIHZvaWQgYnRhX2FnX3Jlc3VsdCh0QlRBX0FHX1NDQiAqcF9zY2IsIHRCVEFfQUdfREFUQSAqcF9kYXRhKTsKK2V4dGVybiB2b2lkIGJ0YV9hZ19zZXRjb2RlYyh0QlRBX0FHX1NDQiAqcF9zY2IsIHRCVEFfQUdfREFUQSAqcF9kYXRhKTsKKyNpZiAoQlRNX1dCU19JTkNMVURFRCA9PSBUUlVFICkKK2V4dGVybiB2b2lkIGJ0YV9hZ19zZW5kX2Jjcyh0QlRBX0FHX1NDQiAqcF9zY2IsIHRCVEFfQUdfREFUQSAqcF9kYXRhKTsKKyNlbmRpZgorZXh0ZXJuIHZvaWQgYnRhX2FnX3NlbmRfcmluZyh0QlRBX0FHX1NDQiAqcF9zY2IsIHRCVEFfQUdfREFUQSAqcF9kYXRhKTsKK2V4dGVybiB2b2lkIGJ0YV9hZ19jaV9zY29fZGF0YSh0QlRBX0FHX1NDQiAqcF9zY2IsIHRCVEFfQUdfREFUQSAqcF9kYXRhKTsKK2V4dGVybiB2b2lkIGJ0YV9hZ19zZXRfZXNjb19wYXJhbShCT09MRUFOIHNldF9yZXNldCwgdEJUTV9FU0NPX1BBUkFNUyAqcGFyYW0pOworZXh0ZXJuIHZvaWQgYnRhX2FnX2NpX3J4X2RhdGEodEJUQV9BR19TQ0IgKnBfc2NiLCB0QlRBX0FHX0RBVEEgKnBfZGF0YSk7CitleHRlcm4gdm9pZCBidGFfYWdfcmN2ZF9zbGNfcmVhZHkodEJUQV9BR19TQ0IgKnBfc2NiLCB0QlRBX0FHX0RBVEEgKnBfZGF0YSk7CisjZW5kaWYgLyogQlRBX0FHX0lOVF9IICovCmRpZmYgLS1naXQgYS9idGEvaGZfY2xpZW50L2J0YV9oZl9jbGllbnRfbWFpbi5jIGIvYnRhL2hmX2NsaWVudC9idGFfaGZfY2xpZW50X21haW4uYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iYWU5OTJiCi0tLSAvZGV2L251bGwKKysrIGIvYnRhL2hmX2NsaWVudC9idGFfaGZfY2xpZW50X21haW4uYwpAQCAtMCwwICsxLDEwMTUgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCisgKiAgQ29weXJpZ2h0IChDKSAyMDAzLTIwMTIgQnJvYWRjb20gQ29ycG9yYXRpb24KKyAqCisgKiAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdDoKKyAqCisgKiAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgorICogIFRoaXMgaXMgdGhlIG1haW4gaW1wbGVtZW50YXRpb24gZmlsZSBmb3IgdGhlIEJUQSBhdWRpbyBnYXRld2F5LgorICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyNpbmNsdWRlIDxzdHJpbmcuaD4KKyNpbmNsdWRlICJidGFfYXBpLmgiCisjaW5jbHVkZSAiYnRhX3N5cy5oIgorI2luY2x1ZGUgImJ0YV9hZ19jby5oIgorI2luY2x1ZGUgImJ0YV9hZ19pbnQuaCIKKyNpbmNsdWRlICJiZC5oIgorI2luY2x1ZGUgInV0bC5oIgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyoqIENvbnN0YW50cyBhbmQgdHlwZXMKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2lmbmRlZiBCVEFfQUdfREVCVUcKKyNkZWZpbmUgQlRBX0FHX0RFQlVHIEZBTFNFCisjZW5kaWYKKworI2lmIEJUQV9BR19ERUJVRyA9PSBUUlVFCitzdGF0aWMgY2hhciAqYnRhX2FnX2V2dF9zdHIoVUlOVDE2IGV2ZW50LCB0QlRBX0FHX1JFUyByZXN1bHQpOworc3RhdGljIGNoYXIgKmJ0YV9hZ19zdGF0ZV9zdHIoVUlOVDggc3RhdGUpOworI2VuZGlmCisKKy8qIHN0YXRlIG1hY2hpbmUgc3RhdGVzICovCitlbnVtCit7CisgICAgQlRBX0FHX0lOSVRfU1QsCisgICAgQlRBX0FHX09QRU5JTkdfU1QsCisgICAgQlRBX0FHX09QRU5fU1QsCisgICAgQlRBX0FHX0NMT1NJTkdfU1QKK307CisKKy8qIHN0YXRlIG1hY2hpbmUgYWN0aW9uIGVudW1lcmF0aW9uIGxpc3QgKi8KK2VudW0KK3sKKyAgICBCVEFfQUdfUkVHSVNURVIsCisgICAgQlRBX0FHX0RFUkVHSVNURVIsCisgICAgQlRBX0FHX1NUQVJUX09QRU4sCisgICAgQlRBX0FHX1JGQ19ET19PUEVOLAorICAgIEJUQV9BR19SRkNfRE9fQ0xPU0UsCisgICAgQlRBX0FHX1NUQVJUX0RFUkVHLAorICAgIEJUQV9BR19TVEFSVF9DTE9TRSwKKyAgICBCVEFfQUdfUkZDX09QRU4sCisgICAgQlRBX0FHX09QRU5fRkFJTCwKKyAgICBCVEFfQUdfUkZDX0FDUF9PUEVOLAorICAgIEJUQV9BR19SRkNfQ0xPU0UsCisgICAgQlRBX0FHX1JGQ19GQUlMLAorICAgIEJUQV9BR19SRkNfREFUQSwKKyAgICBCVEFfQUdfRElTQ19JTlRfUkVTLAorICAgIEJUQV9BR19ESVNDX0ZBSUwsCisgICAgQlRBX0FHX0RJU0NfQUNQX1JFUywKKyAgICBCVEFfQUdfRlJFRV9EQiwKKyAgICBCVEFfQUdfU0NPX0NPTk5fT1BFTiwKKyAgICBCVEFfQUdfU0NPX0NPTk5fQ0xPU0UsCisgICAgQlRBX0FHX1NDT19MSVNURU4sCisgICAgQlRBX0FHX1NDT19PUEVOLAorICAgIEJUQV9BR19TQ09fQ0xPU0UsCisgICAgQlRBX0FHX1NDT19TSFVURE9XTiwKKyAgICBCVEFfQUdfUE9TVF9TQ09fT1BFTiwKKyAgICBCVEFfQUdfUE9TVF9TQ09fQ0xPU0UsCisgICAgQlRBX0FHX1NWQ19DT05OX09QRU4sCisgICAgQlRBX0FHX1JFU1VMVCwKKyAgICBCVEFfQUdfU0VUQ09ERUMsCisgICAgQlRBX0FHX1NFTkRfUklORywKKyAgICBCVEFfQUdfQ0lfU0NPX0RBVEEsCisgICAgQlRBX0FHX0NJX1JYX0RBVEEsCisgICAgQlRBX0FHX1JDVkRfU0xDX1JFQURZLAorICAgIEJUQV9BR19OVU1fQUNUSU9OUworfTsKKworI2RlZmluZSBCVEFfQUdfSUdOT1JFICAgICAgIEJUQV9BR19OVU1fQUNUSU9OUworCisvKiB0eXBlIGZvciBhY3Rpb24gZnVuY3Rpb25zICovCit0eXBlZGVmIHZvaWQgKCp0QlRBX0FHX0FDVElPTikodEJUQV9BR19TQ0IgKnBfc2NiLCB0QlRBX0FHX0RBVEEgKnBfZGF0YSk7CisKKy8qIGFjdGlvbiBmdW5jdGlvbnMgKi8KK2NvbnN0IHRCVEFfQUdfQUNUSU9OIGJ0YV9hZ19hY3Rpb25bXSA9Cit7CisgICAgYnRhX2FnX3JlZ2lzdGVyLAorICAgIGJ0YV9hZ19kZXJlZ2lzdGVyLAorICAgIGJ0YV9hZ19zdGFydF9vcGVuLAorICAgIGJ0YV9hZ19yZmNfZG9fb3BlbiwKKyAgICBidGFfYWdfcmZjX2RvX2Nsb3NlLAorICAgIGJ0YV9hZ19zdGFydF9kZXJlZywKKyAgICBidGFfYWdfc3RhcnRfY2xvc2UsCisgICAgYnRhX2FnX3JmY19vcGVuLAorICAgIGJ0YV9hZ19vcGVuX2ZhaWwsCisgICAgYnRhX2FnX3JmY19hY3Bfb3BlbiwKKyAgICBidGFfYWdfcmZjX2Nsb3NlLAorICAgIGJ0YV9hZ19yZmNfZmFpbCwKKyAgICBidGFfYWdfcmZjX2RhdGEsCisgICAgYnRhX2FnX2Rpc2NfaW50X3JlcywKKyAgICBidGFfYWdfZGlzY19mYWlsLAorICAgIGJ0YV9hZ19kaXNjX2FjcF9yZXMsCisgICAgYnRhX2FnX2ZyZWVfZGIsCisgICAgYnRhX2FnX3Njb19jb25uX29wZW4sCisgICAgYnRhX2FnX3Njb19jb25uX2Nsb3NlLAorICAgIGJ0YV9hZ19zY29fbGlzdGVuLAorICAgIGJ0YV9hZ19zY29fb3BlbiwKKyAgICBidGFfYWdfc2NvX2Nsb3NlLAorICAgIGJ0YV9hZ19zY29fc2h1dGRvd24sCisgICAgYnRhX2FnX3Bvc3Rfc2NvX29wZW4sCisgICAgYnRhX2FnX3Bvc3Rfc2NvX2Nsb3NlLAorICAgIGJ0YV9hZ19zdmNfY29ubl9vcGVuLAorICAgIGJ0YV9hZ19yZXN1bHQsCisgICAgYnRhX2FnX3NldGNvZGVjLAorICAgIGJ0YV9hZ19zZW5kX3JpbmcsCisgICAgYnRhX2FnX2NpX3Njb19kYXRhLAorICAgIGJ0YV9hZ19jaV9yeF9kYXRhLAorICAgIGJ0YV9hZ19yY3ZkX3NsY19yZWFkeQorfTsKKworLyogc3RhdGUgdGFibGUgaW5mb3JtYXRpb24gKi8KKyNkZWZpbmUgQlRBX0FHX0FDVElPTlMgICAgICAgICAgICAgIDIgICAgICAgLyogbnVtYmVyIG9mIGFjdGlvbnMgKi8KKyNkZWZpbmUgQlRBX0FHX05FWFRfU1RBVEUgICAgICAgICAgIDIgICAgICAgLyogcG9zaXRpb24gb2YgbmV4dCBzdGF0ZSAqLworI2RlZmluZSBCVEFfQUdfTlVNX0NPTFMgICAgICAgICAgICAgMyAgICAgICAvKiBudW1iZXIgb2YgY29sdW1ucyBpbiBzdGF0ZSB0YWJsZXMgKi8KKworLyogc3RhdGUgdGFibGUgZm9yIGluaXQgc3RhdGUgKi8KK2NvbnN0IFVJTlQ4IGJ0YV9hZ19zdF9pbml0W11bQlRBX0FHX05VTV9DT0xTXSA9Cit7CisvKiBFdmVudCAgICAgICAgICAgICAgICAgICAgQWN0aW9uIDEgICAgICAgICAgICAgICAgQWN0aW9uIDIgICAgICAgICAgICAgICAgTmV4dCBzdGF0ZSAqLworLyogQVBJX1JFR0lTVEVSX0VWVCAqLyAgICAgIHtCVEFfQUdfUkVHSVNURVIsICAgICAgIEJUQV9BR19JR05PUkUsICAgICAgICAgIEJUQV9BR19JTklUX1NUfSwKKy8qIEFQSV9ERVJFR0lTVEVSX0VWVCAqLyAgICB7QlRBX0FHX0RFUkVHSVNURVIsICAgICBCVEFfQUdfSUdOT1JFLCAgICAgICAgICBCVEFfQUdfSU5JVF9TVH0sCisvKiBBUElfT1BFTl9FVlQgKi8gICAgICAgICAge0JUQV9BR19TVEFSVF9PUEVOLCAgICAgQlRBX0FHX0lHTk9SRSwgICAgICAgICAgQlRBX0FHX09QRU5JTkdfU1R9LAorLyogQVBJX0NMT1NFX0VWVCAqLyAgICAgICAgIHtCVEFfQUdfSUdOT1JFLCAgICAgICAgIEJUQV9BR19JR05PUkUsICAgICAgICAgIEJUQV9BR19JTklUX1NUfSwKKy8qIEFQSV9BVURJT19PUEVOX0VWVCAqLyAgICB7QlRBX0FHX0lHTk9SRSwgICAgICAgICBCVEFfQUdfSUdOT1JFLCAgICAgICAgICBCVEFfQUdfSU5JVF9TVH0sCisvKiBBUElfQVVESU9fQ0xPU0VfRVZUICovICAge0JUQV9BR19JR05PUkUsICAgICAgICAgQlRBX0FHX0lHTk9SRSwgICAgICAgICAgQlRBX0FHX0lOSVRfU1R9LAorLyogQVBJX1JFU1VMVF9FVlQgKi8gICAgICAgIHtCVEFfQUdfSUdOT1JFLCAgICAgICAgIEJUQV9BR19JR05PUkUsICAgICAgICAgIEJUQV9BR19JTklUX1NUfSwKKy8qIEFQSV9TRVRDT0RFQ19FVlQgKi8gICAgICB7QlRBX0FHX0lHTk9SRSwgICAgICAgICBCVEFfQUdfSUdOT1JFLCAgICAgICAgICBCVEFfQUdfSU5JVF9TVH0sCisvKiBSRkNfT1BFTl9FVlQgKi8gICAgICAgICAge0JUQV9BR19SRkNfQUNQX09QRU4sICAgQlRBX0FHX1NDT19MSVNURU4sICAgICAgQlRBX0FHX09QRU5fU1R9LAorLyogUkZDX0NMT1NFX0VWVCAqLyAgICAgICAgIHtCVEFfQUdfSUdOT1JFLCAgICAgICAgIEJUQV9BR19JR05PUkUsICAgICAgICAgIEJUQV9BR19JTklUX1NUfSwKKy8qIFJGQ19TUlZfQ0xPU0VfRVZUICovICAgICB7QlRBX0FHX0lHTk9SRSwgICAgICAgICBCVEFfQUdfSUdOT1JFLCAgICAgICAgICBCVEFfQUdfSU5JVF9TVH0sCisvKiBSRkNfREFUQV9FVlQgKi8gICAgICAgICAge0JUQV9BR19JR05PUkUsICAgICAgICAgQlRBX0FHX0lHTk9SRSwgICAgICAgICAgQlRBX0FHX0lOSVRfU1R9LAorLyogU0NPX09QRU5fRVZUICovICAgICAgICAgIHtCVEFfQUdfU0NPX0NPTk5fT1BFTiwgIEJUQV9BR19JR05PUkUsICAgICAgICAgIEJUQV9BR19JTklUX1NUfSwKKy8qIFNDT19DTE9TRV9FVlQgKi8gICAgICAgICB7QlRBX0FHX1NDT19DT05OX0NMT1NFLCBCVEFfQUdfSUdOT1JFLCAgICAgICAgICBCVEFfQUdfSU5JVF9TVH0sCisvKiBESVNDX0FDUF9SRVNfRVZUICovICAgICAge0JUQV9BR19GUkVFX0RCLCAgICAgICAgQlRBX0FHX0lHTk9SRSwgICAgICAgICAgQlRBX0FHX0lOSVRfU1R9LAorLyogRElTQ19JTlRfUkVTX0VWVCAqLyAgICAgIHtCVEFfQUdfSUdOT1JFLCAgICAgICAgIEJUQV9BR19JR05PUkUsICAgICAgICAgIEJUQV9BR19JTklUX1NUfSwKKy8qIERJU0NfT0tfRVZUICovICAgICAgICAgICB7QlRBX0FHX0lHTk9SRSwgICAgICAgICBCVEFfQUdfSUdOT1JFLCAgICAgICAgICBCVEFfQUdfSU5JVF9TVH0sCisvKiBESVNDX0ZBSUxfRVZUICovICAgICAgICAge0JUQV9BR19JR05PUkUsICAgICAgICAgQlRBX0FHX0lHTk9SRSwgICAgICAgICAgQlRBX0FHX0lOSVRfU1R9LAorLyogQ0lfUlhfV1JJVEVfRVZUICovICAgICAgIHtCVEFfQUdfSUdOT1JFLCAgICAgICAgIEJUQV9BR19JR05PUkUsICAgICAgICAgIEJUQV9BR19JTklUX1NUfSwKKy8qIFJJTkdfVE9VVF9FVlQgKi8gICAgICAgICB7QlRBX0FHX0lHTk9SRSwgICAgICAgICBCVEFfQUdfSUdOT1JFLCAgICAgICAgICBCVEFfQUdfSU5JVF9TVH0sCisvKiBTVkNfVE9VVF9FVlQgKi8gICAgICAgICAge0JUQV9BR19JR05PUkUsICAgICAgICAgQlRBX0FHX0lHTk9SRSwgICAgICAgICAgQlRBX0FHX0lOSVRfU1R9LAorLyogQ0lfU0NPX0RBVEFfRVZUICovICAgICAgIHtCVEFfQUdfSUdOT1JFLCAgICAgICAgIEJUQV9BR19JR05PUkUsICAgICAgICAgIEJUQV9BR19JTklUX1NUfSwKKy8qIENJX1NMQ19SRUFEWV9FVlQgKi8gICAgICB7QlRBX0FHX0lHTk9SRSwgICAgICAgICBCVEFfQUdfSUdOT1JFLCAgICAgICAgICBCVEFfQUdfSU5JVF9TVH0KK307CisKKy8qIHN0YXRlIHRhYmxlIGZvciBvcGVuaW5nIHN0YXRlICovCitjb25zdCBVSU5UOCBidGFfYWdfc3Rfb3BlbmluZ1tdW0JUQV9BR19OVU1fQ09MU10gPQoreworLyogRXZlbnQgICAgICAgICAgICAgICAgICAgIEFjdGlvbiAxICAgICAgICAgICAgICAgIEFjdGlvbiAyICAgICAgICAgICAgICAgIE5leHQgc3RhdGUgKi8KKy8qIEFQSV9SRUdJU1RFUl9FVlQgKi8gICAgICB7QlRBX0FHX0lHTk9SRSwgICAgICAgICBCVEFfQUdfSUdOT1JFLCAgICAgICAgICBCVEFfQUdfT1BFTklOR19TVH0sCisvKiBBUElfREVSRUdJU1RFUl9FVlQgKi8gICAge0JUQV9BR19SRkNfRE9fQ0xPU0UsICAgQlRBX0FHX1NUQVJUX0RFUkVHLCAgICAgQlRBX0FHX0NMT1NJTkdfU1R9LAorLyogQVBJX09QRU5fRVZUICovICAgICAgICAgIHtCVEFfQUdfT1BFTl9GQUlMLCAgICAgIEJUQV9BR19JR05PUkUsICAgICAgICAgIEJUQV9BR19PUEVOSU5HX1NUfSwKKy8qIEFQSV9DTE9TRV9FVlQgKi8gICAgICAgICB7QlRBX0FHX1JGQ19ET19DTE9TRSwgICBCVEFfQUdfSUdOT1JFLCAgICAgICAgICBCVEFfQUdfQ0xPU0lOR19TVH0sCisvKiBBUElfQVVESU9fT1BFTl9FVlQgKi8gICAge0JUQV9BR19JR05PUkUsICAgICAgICAgQlRBX0FHX0lHTk9SRSwgICAgICAgICAgQlRBX0FHX09QRU5JTkdfU1R9LAorLyogQVBJX0FVRElPX0NMT1NFX0VWVCAqLyAgIHtCVEFfQUdfSUdOT1JFLCAgICAgICAgIEJUQV9BR19JR05PUkUsICAgICAgICAgIEJUQV9BR19PUEVOSU5HX1NUfSwKKy8qIEFQSV9SRVNVTFRfRVZUICovICAgICAgICB7QlRBX0FHX0lHTk9SRSwgICAgICAgICBCVEFfQUdfSUdOT1JFLCAgICAgICAgICBCVEFfQUdfT1BFTklOR19TVH0sCisvKiBBUElfU0VUQ09ERUNfRVZUICovICAgICAge0JUQV9BR19JR05PUkUsICAgICAgICAgQlRBX0FHX0lHTk9SRSwgICAgICAgICAgQlRBX0FHX09QRU5JTkdfU1R9LAorLyogUkZDX09QRU5fRVZUICovICAgICAgICAgIHtCVEFfQUdfUkZDX09QRU4sICAgICAgIEJUQV9BR19TQ09fTElTVEVOLCAgICAgIEJUQV9BR19PUEVOX1NUfSwKKy8qIFJGQ19DTE9TRV9FVlQgKi8gICAgICAgICB7QlRBX0FHX1JGQ19GQUlMLCAgICAgICBCVEFfQUdfSUdOT1JFLCAgICAgICAgICBCVEFfQUdfSU5JVF9TVH0sCisvKiBSRkNfU1JWX0NMT1NFX0VWVCAqLyAgICAge0JUQV9BR19JR05PUkUsICAgICAgICAgQlRBX0FHX0lHTk9SRSwgICAgICAgICAgQlRBX0FHX09QRU5JTkdfU1R9LAorLyogUkZDX0RBVEFfRVZUICovICAgICAgICAgIHtCVEFfQUdfSUdOT1JFLCAgICAgICAgIEJUQV9BR19JR05PUkUsICAgICAgICAgIEJUQV9BR19PUEVOSU5HX1NUfSwKKy8qIFNDT19PUEVOX0VWVCAqLyAgICAgICAgICB7QlRBX0FHX1NDT19DT05OX09QRU4sICBCVEFfQUdfSUdOT1JFLCAgICAgICAgICBCVEFfQUdfT1BFTklOR19TVH0sCisvKiBTQ09fQ0xPU0VfRVZUICovICAgICAgICAge0JUQV9BR19TQ09fQ09OTl9DTE9TRSwgQlRBX0FHX0lHTk9SRSwgICAgICAgICAgQlRBX0FHX09QRU5JTkdfU1R9LAorLyogRElTQ19BQ1BfUkVTX0VWVCAqLyAgICAgIHtCVEFfQUdfSUdOT1JFLCAgICAgICAgIEJUQV9BR19JR05PUkUsICAgICAgICAgIEJUQV9BR19PUEVOSU5HX1NUfSwKKy8qIERJU0NfSU5UX1JFU19FVlQgKi8gICAgICB7QlRBX0FHX0RJU0NfSU5UX1JFUywgICBCVEFfQUdfSUdOT1JFLCAgICAgICAgICBCVEFfQUdfT1BFTklOR19TVH0sCisvKiBESVNDX09LX0VWVCAqLyAgICAgICAgICAge0JUQV9BR19SRkNfRE9fT1BFTiwgICAgQlRBX0FHX0lHTk9SRSwgICAgICAgICAgQlRBX0FHX09QRU5JTkdfU1R9LAorLyogRElTQ19GQUlMX0VWVCAqLyAgICAgICAgIHtCVEFfQUdfRElTQ19GQUlMLCAgICAgIEJUQV9BR19JR05PUkUsICAgICAgICAgIEJUQV9BR19JTklUX1NUfSwKKy8qIENJX1JYX1dSSVRFX0VWVCAqLyAgICAgICB7QlRBX0FHX0lHTk9SRSwgICAgICAgICBCVEFfQUdfSUdOT1JFLCAgICAgICAgICBCVEFfQUdfT1BFTklOR19TVH0sCisvKiBSSU5HX1RPVVRfRVZUICovICAgICAgICAge0JUQV9BR19JR05PUkUsICAgICAgICAgQlRBX0FHX0lHTk9SRSwgICAgICAgICAgQlRBX0FHX09QRU5JTkdfU1R9LAorLyogU1ZDX1RPVVRfRVZUICovICAgICAgICAgIHtCVEFfQUdfSUdOT1JFLCAgICAgICAgIEJUQV9BR19JR05PUkUsICAgICAgICAgIEJUQV9BR19PUEVOSU5HX1NUfSwKKy8qIENJX1NDT19EQVRBX0VWVCAqLyAgICAgICB7QlRBX0FHX0lHTk9SRSwgICAgICAgICBCVEFfQUdfSUdOT1JFLCAgICAgICAgICBCVEFfQUdfT1BFTklOR19TVH0sCisvKiBDSV9TTENfUkVBRFlfRVZUICovICAgICAge0JUQV9BR19JR05PUkUsICAgICAgICAgQlRBX0FHX0lHTk9SRSwgICAgICAgICAgQlRBX0FHX09QRU5JTkdfU1R9Cit9OworCisvKiBzdGF0ZSB0YWJsZSBmb3Igb3BlbiBzdGF0ZSAqLworY29uc3QgVUlOVDggYnRhX2FnX3N0X29wZW5bXVtCVEFfQUdfTlVNX0NPTFNdID0KK3sKKy8qIEV2ZW50ICAgICAgICAgICAgICAgICAgICBBY3Rpb24gMSAgICAgICAgICAgICAgICBBY3Rpb24gMiAgICAgICAgICAgICAgICBOZXh0IHN0YXRlICovCisvKiBBUElfUkVHSVNURVJfRVZUICovICAgICAge0JUQV9BR19JR05PUkUsICAgICAgICAgQlRBX0FHX0lHTk9SRSwgICAgICAgICAgQlRBX0FHX09QRU5fU1R9LAorLyogQVBJX0RFUkVHSVNURVJfRVZUICovICAgIHtCVEFfQUdfU1RBUlRfQ0xPU0UsICAgIEJUQV9BR19TVEFSVF9ERVJFRywgICAgIEJUQV9BR19DTE9TSU5HX1NUfSwKKy8qIEFQSV9PUEVOX0VWVCAqLyAgICAgICAgICB7QlRBX0FHX09QRU5fRkFJTCwgICAgICBCVEFfQUdfSUdOT1JFLCAgICAgICAgICBCVEFfQUdfT1BFTl9TVH0sCisvKiBBUElfQ0xPU0VfRVZUICovICAgICAgICAge0JUQV9BR19TVEFSVF9DTE9TRSwgICAgQlRBX0FHX0lHTk9SRSwgICAgICAgICAgQlRBX0FHX0NMT1NJTkdfU1R9LAorLyogQVBJX0FVRElPX09QRU5fRVZUICovICAgIHtCVEFfQUdfU0NPX09QRU4sICAgICAgIEJUQV9BR19JR05PUkUsICAgICAgICAgIEJUQV9BR19PUEVOX1NUfSwKKy8qIEFQSV9BVURJT19DTE9TRV9FVlQgKi8gICB7QlRBX0FHX1NDT19DTE9TRSwgICAgICBCVEFfQUdfSUdOT1JFLCAgICAgICAgICBCVEFfQUdfT1BFTl9TVH0sCisvKiBBUElfUkVTVUxUX0VWVCAqLyAgICAgICAge0JUQV9BR19SRVNVTFQsICAgICAgICAgQlRBX0FHX0lHTk9SRSwgICAgICAgICAgQlRBX0FHX09QRU5fU1R9LAorLyogQVBJX1NFVENPREVDX0VWVCAqLyAgICAgIHtCVEFfQUdfU0VUQ09ERUMsICAgICAgIEJUQV9BR19JR05PUkUsICAgICAgICAgIEJUQV9BR19PUEVOX1NUfSwKKy8qIFJGQ19PUEVOX0VWVCAqLyAgICAgICAgICB7QlRBX0FHX0lHTk9SRSwgICAgICAgICBCVEFfQUdfSUdOT1JFLCAgICAgICAgICBCVEFfQUdfT1BFTl9TVH0sCisvKiBSRkNfQ0xPU0VfRVZUICovICAgICAgICAge0JUQV9BR19SRkNfQ0xPU0UsICAgICAgQlRBX0FHX0lHTk9SRSwgICAgICAgICAgQlRBX0FHX0lOSVRfU1R9LAorLyogUkZDX1NSVl9DTE9TRV9FVlQgKi8gICAgIHtCVEFfQUdfSUdOT1JFLCAgICAgICAgIEJUQV9BR19JR05PUkUsICAgICAgICAgIEJUQV9BR19PUEVOX1NUfSwKKy8qIFJGQ19EQVRBX0VWVCAqLyAgICAgICAgICB7QlRBX0FHX1JGQ19EQVRBLCAgICAgICBCVEFfQUdfSUdOT1JFLCAgICAgICAgICBCVEFfQUdfT1BFTl9TVH0sCisvKiBTQ09fT1BFTl9FVlQgKi8gICAgICAgICAge0JUQV9BR19TQ09fQ09OTl9PUEVOLCAgQlRBX0FHX1BPU1RfU0NPX09QRU4sICAgQlRBX0FHX09QRU5fU1R9LAorLyogU0NPX0NMT1NFX0VWVCAqLyAgICAgICAgIHtCVEFfQUdfU0NPX0NPTk5fQ0xPU0UsIEJUQV9BR19QT1NUX1NDT19DTE9TRSwgIEJUQV9BR19PUEVOX1NUfSwKKy8qIERJU0NfQUNQX1JFU19FVlQgKi8gICAgICB7QlRBX0FHX0RJU0NfQUNQX1JFUywgICBCVEFfQUdfSUdOT1JFLCAgICAgICAgICBCVEFfQUdfT1BFTl9TVH0sCisvKiBESVNDX0lOVF9SRVNfRVZUICovICAgICAge0JUQV9BR19JR05PUkUsICAgICAgICAgQlRBX0FHX0lHTk9SRSwgICAgICAgICAgQlRBX0FHX09QRU5fU1R9LAorLyogRElTQ19PS19FVlQgKi8gICAgICAgICAgIHtCVEFfQUdfSUdOT1JFLCAgICAgICAgIEJUQV9BR19JR05PUkUsICAgICAgICAgIEJUQV9BR19PUEVOX1NUfSwKKy8qIERJU0NfRkFJTF9FVlQgKi8gICAgICAgICB7QlRBX0FHX0lHTk9SRSwgICAgICAgICBCVEFfQUdfSUdOT1JFLCAgICAgICAgICBCVEFfQUdfT1BFTl9TVH0sCisvKiBDSV9SWF9XUklURV9FVlQgKi8gICAgICAge0JUQV9BR19DSV9SWF9EQVRBLCAgICAgQlRBX0FHX0lHTk9SRSwgICAgICAgICAgQlRBX0FHX09QRU5fU1R9LAorLyogUklOR19UT1VUX0VWVCAqLyAgICAgICAgIHtCVEFfQUdfU0VORF9SSU5HLCAgICAgIEJUQV9BR19JR05PUkUsICAgICAgICAgIEJUQV9BR19PUEVOX1NUfSwKKy8qIFNWQ19UT1VUX0VWVCAqLyAgICAgICAgICB7QlRBX0FHX1NUQVJUX0NMT1NFLCAgICBCVEFfQUdfSUdOT1JFLCAgICAgICAgICBCVEFfQUdfQ0xPU0lOR19TVH0sCisvKiBDSV9TQ09fREFUQV9FVlQgKi8gICAgICAge0JUQV9BR19DSV9TQ09fREFUQSwgICAgQlRBX0FHX0lHTk9SRSwgICAgICAgICAgQlRBX0FHX09QRU5fU1R9LAorLyogQ0lfU0xDX1JFQURZX0VWVCAqLyAgICAgIHtCVEFfQUdfUkNWRF9TTENfUkVBRFksIEJUQV9BR19JR05PUkUsICAgICAgICAgIEJUQV9BR19PUEVOX1NUfQorfTsKKworLyogc3RhdGUgdGFibGUgZm9yIGNsb3Npbmcgc3RhdGUgKi8KK2NvbnN0IFVJTlQ4IGJ0YV9hZ19zdF9jbG9zaW5nW11bQlRBX0FHX05VTV9DT0xTXSA9Cit7CisvKiBFdmVudCAgICAgICAgICAgICAgICAgICAgQWN0aW9uIDEgICAgICAgICAgICAgICAgQWN0aW9uIDIgICAgICAgICAgICAgICAgTmV4dCBzdGF0ZSAqLworLyogQVBJX1JFR0lTVEVSX0VWVCAqLyAgICAgIHtCVEFfQUdfSUdOT1JFLCAgICAgICAgIEJUQV9BR19JR05PUkUsICAgICAgICAgIEJUQV9BR19DTE9TSU5HX1NUfSwKKy8qIEFQSV9ERVJFR0lTVEVSX0VWVCAqLyAgICB7QlRBX0FHX1NUQVJUX0RFUkVHLCAgICBCVEFfQUdfSUdOT1JFLCAgICAgICAgICBCVEFfQUdfQ0xPU0lOR19TVH0sCisvKiBBUElfT1BFTl9FVlQgKi8gICAgICAgICAge0JUQV9BR19PUEVOX0ZBSUwsICAgICAgQlRBX0FHX0lHTk9SRSwgICAgICAgICAgQlRBX0FHX0NMT1NJTkdfU1R9LAorLyogQVBJX0NMT1NFX0VWVCAqLyAgICAgICAgIHtCVEFfQUdfSUdOT1JFLCAgICAgICAgIEJUQV9BR19JR05PUkUsICAgICAgICAgIEJUQV9BR19DTE9TSU5HX1NUfSwKKy8qIEFQSV9BVURJT19PUEVOX0VWVCAqLyAgICB7QlRBX0FHX0lHTk9SRSwgICAgICAgICBCVEFfQUdfSUdOT1JFLCAgICAgICAgICBCVEFfQUdfQ0xPU0lOR19TVH0sCisvKiBBUElfQVVESU9fQ0xPU0VfRVZUICovICAge0JUQV9BR19JR05PUkUsICAgICAgICAgQlRBX0FHX0lHTk9SRSwgICAgICAgICAgQlRBX0FHX0NMT1NJTkdfU1R9LAorLyogQVBJX1JFU1VMVF9FVlQgKi8gICAgICAgIHtCVEFfQUdfSUdOT1JFLCAgICAgICAgIEJUQV9BR19JR05PUkUsICAgICAgICAgIEJUQV9BR19DTE9TSU5HX1NUfSwKKy8qIEFQSV9TRVRDT0RFQ19FVlQgKi8gICAgICB7QlRBX0FHX0lHTk9SRSwgICAgICAgICBCVEFfQUdfSUdOT1JFLCAgICAgICAgICBCVEFfQUdfQ0xPU0lOR19TVH0sCisvKiBSRkNfT1BFTl9FVlQgKi8gICAgICAgICAge0JUQV9BR19JR05PUkUsICAgICAgICAgQlRBX0FHX0lHTk9SRSwgICAgICAgICAgQlRBX0FHX0NMT1NJTkdfU1R9LAorLyogUkZDX0NMT1NFX0VWVCAqLyAgICAgICAgIHtCVEFfQUdfUkZDX0NMT1NFLCAgICAgIEJUQV9BR19JR05PUkUsICAgICAgICAgIEJUQV9BR19JTklUX1NUfSwKKy8qIFJGQ19TUlZfQ0xPU0VfRVZUICovICAgICB7QlRBX0FHX0lHTk9SRSwgICAgICAgICBCVEFfQUdfSUdOT1JFLCAgICAgICAgICBCVEFfQUdfQ0xPU0lOR19TVH0sCisvKiBSRkNfREFUQV9FVlQgKi8gICAgICAgICAge0JUQV9BR19JR05PUkUsICAgICAgICAgQlRBX0FHX0lHTk9SRSwgICAgICAgICAgQlRBX0FHX0NMT1NJTkdfU1R9LAorLyogU0NPX09QRU5fRVZUICovICAgICAgICAgIHtCVEFfQUdfU0NPX0NPTk5fT1BFTiwgIEJUQV9BR19JR05PUkUsICAgICAgICAgIEJUQV9BR19DTE9TSU5HX1NUfSwKKy8qIFNDT19DTE9TRV9FVlQgKi8gICAgICAgICB7QlRBX0FHX1NDT19DT05OX0NMT1NFLCBCVEFfQUdfUE9TVF9TQ09fQ0xPU0UsICBCVEFfQUdfQ0xPU0lOR19TVH0sCisvKiBESVNDX0FDUF9SRVNfRVZUICovICAgICAge0JUQV9BR19GUkVFX0RCLCAgICAgICAgQlRBX0FHX0lHTk9SRSwgICAgICAgICAgQlRBX0FHX0NMT1NJTkdfU1R9LAorLyogRElTQ19JTlRfUkVTX0VWVCAqLyAgICAgIHtCVEFfQUdfRlJFRV9EQiwgICAgICAgIEJUQV9BR19JR05PUkUsICAgICAgICAgIEJUQV9BR19JTklUX1NUfSwKKy8qIERJU0NfT0tfRVZUICovICAgICAgICAgICB7QlRBX0FHX0lHTk9SRSwgICAgICAgICBCVEFfQUdfSUdOT1JFLCAgICAgICAgICBCVEFfQUdfQ0xPU0lOR19TVH0sCisvKiBESVNDX0ZBSUxfRVZUICovICAgICAgICAge0JUQV9BR19JR05PUkUsICAgICAgICAgQlRBX0FHX0lHTk9SRSwgICAgICAgICAgQlRBX0FHX0NMT1NJTkdfU1R9LAorLyogQ0lfUlhfV1JJVEVfRVZUICovICAgICAgIHtCVEFfQUdfSUdOT1JFLCAgICAgICAgIEJUQV9BR19JR05PUkUsICAgICAgICAgIEJUQV9BR19DTE9TSU5HX1NUfSwKKy8qIFJJTkdfVE9VVF9FVlQgKi8gICAgICAgICB7QlRBX0FHX0lHTk9SRSwgICAgICAgICBCVEFfQUdfSUdOT1JFLCAgICAgICAgICBCVEFfQUdfQ0xPU0lOR19TVH0sCisvKiBTVkNfVE9VVF9FVlQgKi8gICAgICAgICAge0JUQV9BR19JR05PUkUsICAgICAgICAgQlRBX0FHX0lHTk9SRSwgICAgICAgICAgQlRBX0FHX0NMT1NJTkdfU1R9LAorLyogQ0lfU0NPX0RBVEFfRVZUICovICAgICAgIHtCVEFfQUdfSUdOT1JFLCAgICAgICAgIEJUQV9BR19JR05PUkUsICAgICAgICAgIEJUQV9BR19DTE9TSU5HX1NUfSwKKy8qIENJX1NMQ19SRUFEWV9FVlQgKi8gICAgICB7QlRBX0FHX0lHTk9SRSwgICAgICAgICBCVEFfQUdfSUdOT1JFLCAgICAgICAgICBCVEFfQUdfQ0xPU0lOR19TVH0KK307CisKKy8qIHR5cGUgZm9yIHN0YXRlIHRhYmxlICovCit0eXBlZGVmIGNvbnN0IFVJTlQ4ICgqdEJUQV9BR19TVF9UQkwpW0JUQV9BR19OVU1fQ09MU107CisKKy8qIHN0YXRlIHRhYmxlICovCitjb25zdCB0QlRBX0FHX1NUX1RCTCBidGFfYWdfc3RfdGJsW10gPQoreworICAgIGJ0YV9hZ19zdF9pbml0LAorICAgIGJ0YV9hZ19zdF9vcGVuaW5nLAorICAgIGJ0YV9hZ19zdF9vcGVuLAorICAgIGJ0YV9hZ19zdF9jbG9zaW5nCit9OworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyoqIEdsb2JhbCBkYXRhCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworLyogQUcgY29udHJvbCBibG9jayAqLworI2lmIEJUQV9EWU5BTUlDX01FTU9SWSA9PSBGQUxTRQordEJUQV9BR19DQiAgYnRhX2FnX2NiOworI2VuZGlmCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisqKgorKiogRnVuY3Rpb24gICAgICAgICBidGFfYWdfdGltZXJfY2JhY2sKKyoqCisqKiBEZXNjcmlwdGlvbiAgICAgIEFHIHRpbWVyIGNhbGxiYWNrLgorKioKKyoqCisqKiBSZXR1cm5zICAgICAgICAgIHZvaWQKKyoqCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworc3RhdGljIHZvaWQgYnRhX2FnX3RpbWVyX2NiYWNrKHZvaWQgKnApCit7CisgICAgQlRfSERSICAgICAgICAgICpwX2J1ZjsKKyAgICBUSU1FUl9MSVNUX0VOVCAgKnBfdGxlID0gKFRJTUVSX0xJU1RfRU5UICopIHA7CisKKyAgICBpZiAoKHBfYnVmID0gKEJUX0hEUiAqKSBHS0lfZ2V0YnVmKHNpemVvZihCVF9IRFIpKSkgIT0gTlVMTCkKKyAgICB7CisgICAgICAgIHBfYnVmLT5ldmVudCA9IHBfdGxlLT5ldmVudDsKKyAgICAgICAgcF9idWYtPmxheWVyX3NwZWNpZmljID0gYnRhX2FnX3NjYl90b19pZHgoKHRCVEFfQUdfU0NCICopIHBfdGxlLT5wYXJhbSk7CisgICAgICAgIGJ0YV9zeXNfc2VuZG1zZyhwX2J1Zik7CisgICAgfQorfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorKioKKyoqIEZ1bmN0aW9uICAgICAgICAgYnRhX2FnX3NjYl9hbGxvYworKioKKyoqIERlc2NyaXB0aW9uICAgICAgQWxsb2NhdGUgYW4gQUcgc2VydmljZSBjb250cm9sIGJsb2NrLgorKioKKyoqCisqKiBSZXR1cm5zICAgICAgICAgIHBvaW50ZXIgdG8gdGhlIHNjYiwgb3IgTlVMTCBpZiBub25lIGNvdWxkIGJlIGFsbG9jYXRlZC4KKyoqCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworc3RhdGljIHRCVEFfQUdfU0NCICpidGFfYWdfc2NiX2FsbG9jKHZvaWQpCit7CisgICAgdEJUQV9BR19TQ0IgICAgICpwX3NjYiA9ICZidGFfYWdfY2Iuc2NiWzBdOworICAgIGludCAgICAgICAgICAgICBpOworCisgICAgZm9yIChpID0gMDsgaSA8IEJUQV9BR19OVU1fU0NCOyBpKyssIHBfc2NiKyspCisgICAgeworICAgICAgICBpZiAoIXBfc2NiLT5pbl91c2UpCisgICAgICAgIHsKKyAgICAgICAgICAgIC8qIGluaXRpYWxpemUgdmFyaWFibGVzICovCisgICAgICAgICAgICBwX3NjYi0+aW5fdXNlID0gVFJVRTsKKyAgICAgICAgICAgIHBfc2NiLT5zY29faWR4ID0gQlRNX0lOVkFMSURfU0NPX0lOREVYOworCisgICAgICAgICAgICAvKiBzZXQgdXAgdGltZXJzICovCisgICAgICAgICAgICBwX3NjYi0+YWN0X3RpbWVyLnBhcmFtID0gKFVJTlQzMikgcF9zY2I7CisgICAgICAgICAgICBwX3NjYi0+YWN0X3RpbWVyLnBfY2JhY2sgPSBidGFfYWdfdGltZXJfY2JhY2s7CisKKyAgICAgICAgICAgIEFQUExfVFJBQ0VfREVCVUcxKCJidGFfYWdfc2NiX2FsbG9jICVkIiwgYnRhX2FnX3NjYl90b19pZHgocF9zY2IpKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKGkgPT0gQlRBX0FHX05VTV9TQ0IpCisgICAgeworICAgICAgICAvKiBvdXQgb2Ygc2NicyAqLworICAgICAgICBwX3NjYiA9IE5VTEw7CisgICAgICAgIEFQUExfVFJBQ0VfV0FSTklORzAoIk91dCBvZiBhZyBzY2JzIik7CisgICAgfQorICAgIHJldHVybiBwX3NjYjsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyoqCisqKiBGdW5jdGlvbiAgICAgICAgIGJ0YV9hZ19zY2JfZGVhbGxvYworKioKKyoqIERlc2NyaXB0aW9uICAgICAgRGVhbGxvY2F0ZSBhIHNlcnZpY2UgY29udHJvbCBibG9jay4KKyoqCisqKgorKiogUmV0dXJucyAgICAgICAgICB2b2lkCisqKgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3ZvaWQgYnRhX2FnX3NjYl9kZWFsbG9jKHRCVEFfQUdfU0NCICpwX3NjYikKK3sKKyAgICBVSU5UOCAgIGlkeDsKKyAgICBCT09MRUFOIGFsbG9jYXRlZCA9IEZBTFNFOworCisgICAgQVBQTF9UUkFDRV9ERUJVRzEoImJ0YV9hZ19zY2JfZGVhbGxvYyAlZCIsIGJ0YV9hZ19zY2JfdG9faWR4KHBfc2NiKSk7CisKKyAgICAvKiBzdG9wIHRpbWVycyAqLworICAgIGJ0YV9zeXNfc3RvcF90aW1lcigmcF9zY2ItPmFjdF90aW1lcik7CisjaWYgKEJUTV9XQlNfSU5DTFVERUQgPT0gVFJVRSkKKyAgICBidGFfc3lzX3N0b3BfdGltZXIoJnBfc2NiLT5jbl90aW1lcik7CisjZW5kaWYKKworICAgIC8qIGluaXRpYWxpemUgY29udHJvbCBibG9jayAqLworICAgIG1lbXNldChwX3NjYiwgMCwgc2l6ZW9mKHRCVEFfQUdfU0NCKSk7CisgICAgcF9zY2ItPnNjb19pZHggPSBCVE1fSU5WQUxJRF9TQ09fSU5ERVg7CisKKyAgICAvKiBJZiBhbGwgc2NicyBhcmUgZGVhbGxvY2F0ZWQsIGNhbGxiYWNrIHdpdGggZGlzYWJsZSBldmVudCAqLworICAgIGlmICghYnRhX3N5c19pc19yZWdpc3RlciAoQlRBX0lEX0FHKSkKKyAgICB7CisgICAgICAgIGZvciAoaWR4ID0gMDsgaWR4IDwgQlRBX0FHX05VTV9TQ0I7IGlkeCsrKQorICAgICAgICB7CisgICAgICAgICAgICBpZiAoYnRhX2FnX2NiLnNjYltpZHhdLmluX3VzZSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBhbGxvY2F0ZWQgPSBUUlVFOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgaWYgKCFhbGxvY2F0ZWQpCisgICAgICAgIHsKKyAgICAgICAgICAgICgqYnRhX2FnX2NiLnBfY2JhY2spKEJUQV9BR19ESVNBQkxFX0VWVCwgTlVMTCk7CisgICAgICAgIH0KKyAgICB9CisKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyoqCisqKiBGdW5jdGlvbiAgICAgICAgIGJ0YV9hZ19zY2JfdG9faWR4CisqKgorKiogRGVzY3JpcHRpb24gICAgICBHaXZlbiBhIHBvaW50ZXIgdG8gYW4gc2NiLCByZXR1cm4gaXRzIGluZGV4LgorKioKKyoqCisqKiBSZXR1cm5zICAgICAgICAgIEluZGV4IG9mIHNjYi4KKyoqCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworVUlOVDE2IGJ0YV9hZ19zY2JfdG9faWR4KHRCVEFfQUdfU0NCICpwX3NjYikKK3sKKyAgICAvKiB1c2UgYXJyYXkgYXJpdGhtZXRpYyB0byBkZXRlcm1pbmUgaW5kZXggKi8KKyAgICByZXR1cm4gKChVSU5UMTYpIChwX3NjYiAtIGJ0YV9hZ19jYi5zY2IpKSArIDE7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisqKgorKiogRnVuY3Rpb24gICAgICAgICBidGFfYWdfc2NiX2J5X2lkeAorKioKKyoqIERlc2NyaXB0aW9uICAgICAgR2l2ZW4gYW4gc2NiIGluZGV4IHJldHVybiBwb2ludGVyIHRvIHNjYi4KKyoqCisqKgorKiogUmV0dXJucyAgICAgICAgICBQb2ludGVyIHRvIHNjYiBvciBOVUxMIGlmIG5vdCBhbGxvY2F0ZWQuCisqKgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3RCVEFfQUdfU0NCICpidGFfYWdfc2NiX2J5X2lkeChVSU5UMTYgaWR4KQoreworICAgIHRCVEFfQUdfU0NCICAgICAqcF9zY2I7CisKKyAgICAvKiB2ZXJpZnkgaW5kZXggKi8KKyAgICBpZiAoaWR4ID4gMCAmJiBpZHggPD0gQlRBX0FHX05VTV9TQ0IpCisgICAgeworICAgICAgICBwX3NjYiA9ICZidGFfYWdfY2Iuc2NiW2lkeCAtIDFdOworICAgICAgICBpZiAoIXBfc2NiLT5pbl91c2UpCisgICAgICAgIHsKKyAgICAgICAgICAgIHBfc2NiID0gTlVMTDsKKyAgICAgICAgICAgIEFQUExfVFJBQ0VfV0FSTklORzEoImFnIHNjYiBpZHggJWQgbm90IGFsbG9jYXRlZCIsIGlkeCk7CisgICAgICAgIH0KKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgcF9zY2IgPSBOVUxMOworICAgICAgICBBUFBMX1RSQUNFX0RFQlVHMSgiYWcgc2NiIGlkeCAlZCBvdXQgb2YgcmFuZ2UiLCBpZHgpOworICAgIH0KKyAgICByZXR1cm4gcF9zY2I7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisqKgorKiogRnVuY3Rpb24gICAgICAgICBidGFfYWdfc2VydmljZV90b19pZHgKKyoqCisqKiBEZXNjcmlwdGlvbiAgICAgIEdpdmVuIGEgQlRBIHNlcnZpY2UgbWFzayBjb252ZXJ0IHRvIHByb2ZpbGUgaW5kZXguCisqKgorKioKKyoqIFJldHVybnMgICAgICAgICAgUHJvZmlsZSBuZGV4IG9mIHNjYi4KKyoqCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworVUlOVDggYnRhX2FnX3NlcnZpY2VfdG9faWR4KHRCVEFfU0VSVklDRV9NQVNLIHNlcnZpY2VzKQoreworICAgIGlmIChzZXJ2aWNlcyAmIEJUQV9IRlBfU0VSVklDRV9NQVNLKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJUQV9BR19IRlA7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgIHJldHVybiBCVEFfQUdfSFNQOworICAgIH0KK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyoqCisqKiBGdW5jdGlvbiAgICAgICAgIGJ0YV9hZ19pZHhfYnlfYmRhZGRyCisqKgorKiogRGVzY3JpcHRpb24gICAgICBGaW5kIFNDQiBhc3NvY2lhdGVkIHdpdGggcGVlciBCRCBhZGRyZXNzLgorKioKKyoqCisqKiBSZXR1cm5zICAgICAgICAgIEluZGV4IG9mIFNDQiBvciB6ZXJvIGlmIG5vbmUgZm91bmQuCisqKgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK1VJTlQxNiBidGFfYWdfaWR4X2J5X2JkYWRkcihCRF9BRERSIHBlZXJfYWRkcikKK3sKKyAgICB0QlRBX0FHX1NDQiAgICAgKnBfc2NiID0gJmJ0YV9hZ19jYi5zY2JbMF07CisgICAgVUlOVDE2ICAgICAgICAgIGk7CisKKyAgICBpZiAocGVlcl9hZGRyICE9IE5VTEwpCisgICAgeworICAgICAgICBmb3IgKGkgPSAwOyBpIDwgQlRBX0FHX05VTV9TQ0I7IGkrKywgcF9zY2IrKykKKyAgICAgICAgeworICAgICAgICAgICAgaWYgKHBfc2NiLT5pbl91c2UgJiYgIWJkY21wKHBlZXJfYWRkciwgcF9zY2ItPnBlZXJfYWRkcikpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgcmV0dXJuIChpICsgMSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKiBubyBzY2IgZm91bmQgKi8KKyAgICBBUFBMX1RSQUNFX1dBUk5JTkcwKCJObyBhZyBzY2IgZm9yIHBlZXIgYWRkciIpOworICAgIHJldHVybiAwOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorKioKKyoqIEZ1bmN0aW9uICAgICAgICAgYnRhX2FnX290aGVyX3NjYl9vcGVuCisqKgorKiogRGVzY3JpcHRpb24gICAgICBDaGVjayB3aGV0aGVyIGFueSBvdGhlciBzY2IgaXMgaW4gb3BlbiBzdGF0ZS4KKyoqCisqKgorKiogUmV0dXJucyAgICAgICAgICBUUlVFIGlmIGFub3RoZXIgc2NiIGlzIGluIG9wZW4gc3RhdGUsIEZBTFNFIG90aGVyd2lzZS4KKyoqCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworQk9PTEVBTiBidGFfYWdfb3RoZXJfc2NiX29wZW4odEJUQV9BR19TQ0IgKnBfY3Vycl9zY2IpCit7CisgICAgdEJUQV9BR19TQ0IgICAgICpwX3NjYiA9ICZidGFfYWdfY2Iuc2NiWzBdOworICAgIGludCAgICAgICAgICAgICBpOworCisgICAgZm9yIChpID0gMDsgaSA8IEJUQV9BR19OVU1fU0NCOyBpKyssIHBfc2NiKyspCisgICAgeworICAgICAgICBpZiAocF9zY2ItPmluX3VzZSAmJiBwX3NjYiAhPSBwX2N1cnJfc2NiICYmIHBfc2NiLT5zdGF0ZSA9PSBCVEFfQUdfT1BFTl9TVCkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIFRSVUU7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKiBubyBvdGhlciBzY2IgZm91bmQgKi8KKyAgICBBUFBMX1RSQUNFX0RFQlVHMCgiTm8gb3RoZXIgYWcgc2NiIG9wZW4iKTsKKyAgICByZXR1cm4gRkFMU0U7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisqKgorKiogRnVuY3Rpb24gICAgICAgICBidGFfYWdfZ2V0X290aGVyX2lkbGVfc2NiCisqKgorKiogRGVzY3JpcHRpb24gICAgICBSZXR1cm4gb3RoZXIgc2NiIGlmIGl0IGlzIGluIElOSVQgc3QuCisqKgorKioKKyoqIFJldHVybnMgICAgICAgICAgUG9pbnRlciB0byBvdGhlciBzY2IgaWYgSU5JVCBzdCwgTlVMTCBvdGhlcndpc2UuCisqKgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3RCVEFfQUdfU0NCICpidGFfYWdfZ2V0X290aGVyX2lkbGVfc2NiICh0QlRBX0FHX1NDQiAqcF9jdXJyX3NjYikKK3sKKyAgICB0QlRBX0FHX1NDQiAgICAgKnBfc2NiID0gJmJ0YV9hZ19jYi5zY2JbMF07CisgICAgVUlOVDggICB4eDsKKworICAgIGZvciAoeHggPSAwOyB4eCA8IEJUQV9BR19OVU1fU0NCOyB4eCsrLCBwX3NjYisrKQorICAgIHsKKyAgICAgICAgaWYgKHBfc2NiLT5pbl91c2UgJiYgKHBfc2NiICE9IHBfY3Vycl9zY2IpICYmIChwX3NjYi0+c3RhdGUgPT0gQlRBX0FHX0lOSVRfU1QpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gcF9zY2I7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKiBubyBvdGhlciBzY2IgZm91bmQgKi8KKyAgICBBUFBMX1RSQUNFX0RFQlVHMCgiYnRhX2FnX2dldF9vdGhlcl9pZGxlX3NjYjogTm8gaWRsZSBBRyBzY2IiKTsKKyAgICByZXR1cm4gTlVMTDsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyoqCisqKiBGdW5jdGlvbiAgICAgICAgIGJ0YV9hZ19jb2xsaV90aW1lcl9jYmFjaworKioKKyoqIERlc2NyaXB0aW9uICAgICAgQUcgY29ubmVjdGlvbiBjb2xsaXNpb24gdGltZXIgY2FsbGJhY2sKKyoqCisqKgorKiogUmV0dXJucyAgICAgICAgICB2b2lkCisqKgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3N0YXRpYyB2b2lkIGJ0YV9hZ19jb2xsaV90aW1lcl9jYmFjayAoVElNRVJfTElTVF9FTlQgKnBfdGxlKQoreworICAgIHRCVEFfQUdfU0NCICpwX3NjYjsKKworICAgIEFQUExfVFJBQ0VfREVCVUcwICgiYnRhX2FnX2NvbGxpX3RpbWVyX2NiYWNrIik7CisKKyAgICBpZiAocF90bGUpCisgICAgeworICAgICAgICBwX3NjYiA9ICh0QlRBX0FHX1NDQiAqKXBfdGxlLT5wYXJhbTsKKworICAgICAgICBpZiAocF9zY2IpCisgICAgICAgIHsKKyAgICAgICAgICAgIHBfc2NiLT5jb2xsaV90bXJfb24gPSBGQUxTRTsKKworICAgICAgICAgICAgLyogSWYgdGhlIHBlZXIgaGF2ZW4ndCBvcGVuZWQgQUcgY29ubmVjdGlvbiAgICAgKi8KKyAgICAgICAgICAgIC8qIHdlIHdpbGwgcmVzdGFydCBvcGVuaW5nIHByb2Nlc3MuICAgICAgICAgICAgICovCisgICAgICAgICAgICBidGFfYWdfcmVzdW1lX29wZW4gKHBfc2NiKTsKKyAgICAgICAgfQorICAgIH0KK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyoqCisqKiBGdW5jdGlvbiAgICAgICAgIGJ0YV9hZ19jb2xsaXNpb25fY2JhY2sKKyoqCisqKiBEZXNjcmlwdGlvbiAgICAgIEdldCBub3RpZmllZCBhYm91dCBjb2xsaXNpb24uCisqKgorKioKKyoqIFJldHVybnMgICAgICAgICAgdm9pZAorKioKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit2b2lkIGJ0YV9hZ19jb2xsaXNpb25fY2JhY2sgKHRCVEFfU1lTX0NPTk5fU1RBVFVTIHN0YXR1cywgVUlOVDggaWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVSU5UOCBhcHBfaWQsIEJEX0FERFIgcGVlcl9hZGRyKQoreworICAgIFVJTlQxNiAgaGFuZGxlOworICAgIHRCVEFfQUdfU0NCICpwX3NjYjsKKyAgICBVTlVTRUQoc3RhdHVzKTsKKyAgICBVTlVTRUQoYXBwX2lkKTsKKworICAgIC8qIENoZWNrIGlmIHdlIGhhdmUgb3BlbmluZyBzY2IgZm9yIHRoZSBwZWVyIGRldmljZS4gKi8KKyAgICBoYW5kbGUgPSBidGFfYWdfaWR4X2J5X2JkYWRkciAocGVlcl9hZGRyKTsKKyAgICBwX3NjYiA9IGJ0YV9hZ19zY2JfYnlfaWR4IChoYW5kbGUpOworCisgICAgaWYgKHBfc2NiICYmIChwX3NjYi0+c3RhdGUgPT0gQlRBX0FHX09QRU5JTkdfU1QpKQorICAgIHsKKyAgICAgICAgaWYgKGlkID09IEJUQV9JRF9TWVMpICAgLyogQUNMIGNvbGxpc2lvbiAqLworICAgICAgICB7CisgICAgICAgICAgICBBUFBMX1RSQUNFX1dBUk5JTkcwICgiQUcgZm91bmQgY29sbGlzaW9uIChBQ0wpIC4uLiIpOworICAgICAgICB9CisgICAgICAgIGVsc2UgaWYgKGlkID09IEJUQV9JRF9BRykgICAvKiBSRkNPTU0gY29sbGlzaW9uICovCisgICAgICAgIHsKKyAgICAgICAgICAgIEFQUExfVFJBQ0VfV0FSTklORzAgKCJBRyBmb3VuZCBjb2xsaXNpb24gKFJGQ09NTSkgLi4uIik7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBBUFBMX1RSQUNFX1dBUk5JTkcwICgiQUcgZm91bmQgY29sbGlzaW9uIChcP1w/XD8pIC4uLiIpOworICAgICAgICB9CisKKyAgICAgICAgcF9zY2ItPnN0YXRlID0gQlRBX0FHX0lOSVRfU1Q7CisKKyAgICAgICAgLyogQ2FuY2VsIFNEUCBpZiBpdCBoYWQgYmVlbiBzdGFydGVkLiAqLworICAgICAgICBpZihwX3NjYi0+cF9kaXNjX2RiKQorICAgICAgICB7CisgICAgICAgICAgICAodm9pZClTRFBfQ2FuY2VsU2VydmljZVNlYXJjaCAocF9zY2ItPnBfZGlzY19kYik7CisgICAgICAgICAgICBidGFfYWdfZnJlZV9kYihwX3NjYiwgTlVMTCk7CisgICAgICAgIH0KKworICAgICAgICAvKiByZW9wZW4gcmVnaXN0ZXJlZCBzZXJ2ZXJzICovCisgICAgICAgIC8qIENvbGxpc2lvbiBtYXkgYmUgZGV0ZWN0ZWQgYmVmb3JlIG9yIGFmdGVyIHdlIGNsb3NlIHNlcnZlcnMuICovCisgICAgICAgIGlmIChidGFfYWdfaXNfc2VydmVyX2Nsb3NlZCAocF9zY2IpKQorICAgICAgICAgICAgYnRhX2FnX3N0YXJ0X3NlcnZlcnMocF9zY2IsIHBfc2NiLT5yZWdfc2VydmljZXMpOworCisgICAgICAgIC8qIFN0YXJ0IHRpbWVyIHRvIGhhbiAqLworICAgICAgICBwX3NjYi0+Y29sbGlfdGltZXIucF9jYmFjayA9IChUSU1FUl9DQkFDSyopJmJ0YV9hZ19jb2xsaV90aW1lcl9jYmFjazsKKyAgICAgICAgcF9zY2ItPmNvbGxpX3RpbWVyLnBhcmFtID0gKElOVDMyKXBfc2NiOworICAgICAgICBidGFfc3lzX3N0YXJ0X3RpbWVyKCZwX3NjYi0+Y29sbGlfdGltZXIsIDAsIEJUQV9BR19DT0xMSVNJT05fVElNRVIpOworICAgICAgICBwX3NjYi0+Y29sbGlfdG1yX29uID0gVFJVRTsKKyAgICB9CisKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyoqCisqKiBGdW5jdGlvbiAgICAgICAgIGJ0YV9hZ19yZXN1bWVfb3BlbgorKioKKyoqIERlc2NyaXB0aW9uICAgICAgUmVzdW1lIG9wZW5pbmcgcHJvY2Vzcy4KKyoqCisqKgorKiogUmV0dXJucyAgICAgICAgICB2b2lkCisqKgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3ZvaWQgYnRhX2FnX3Jlc3VtZV9vcGVuICh0QlRBX0FHX1NDQiAqcF9zY2IpCit7CisgICAgaWYgKHBfc2NiKQorICAgIHsKKyAgICAgICAgQVBQTF9UUkFDRV9ERUJVRzEgKCJidGFfYWdfcmVzdW1lX29wZW4sIEhhbmRsZSglZCkiLCBidGFfYWdfc2NiX3RvX2lkeChwX3NjYikpOworCisgICAgICAgIC8qIHJlc3VtZSBvcGVuaW5nIHByb2Nlc3MuICAqLworICAgICAgICBpZiAocF9zY2ItPnN0YXRlID09IEJUQV9BR19JTklUX1NUKQorICAgICAgICB7CisgICAgICAgICAgICBwX3NjYi0+c3RhdGUgPSBCVEFfQUdfT1BFTklOR19TVDsKKyAgICAgICAgICAgIGJ0YV9hZ19zdGFydF9vcGVuIChwX3NjYiwgTlVMTCk7CisgICAgICAgIH0KKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgQVBQTF9UUkFDRV9FUlJPUjAgKCJidGFfYWdfcmVzdW1lX29wZW4sIE51bGwgcF9zY2IiKTsKKyAgICB9Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisqKgorKiogRnVuY3Rpb24gICAgICAgICBidGFfYWdfYXBpX2VuYWJsZQorKioKKyoqIERlc2NyaXB0aW9uICAgICAgSGFuZGxlIGFuIEFQSSBlbmFibGUgZXZlbnQuCisqKgorKioKKyoqIFJldHVybnMgICAgICAgICAgdm9pZAorKioKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitzdGF0aWMgdm9pZCBidGFfYWdfYXBpX2VuYWJsZSh0QlRBX0FHX0RBVEEgKnBfZGF0YSkKK3sKKyAgICAvKiBpbml0aWFsaXplIGNvbnRyb2wgYmxvY2sgKi8KKyAgICBtZW1zZXQoJmJ0YV9hZ19jYiwgMCwgc2l6ZW9mKHRCVEFfQUdfQ0IpKTsKKworICAgIC8qIHN0b3JlIGNhbGxiYWNrIGZ1bmN0aW9uICovCisgICAgYnRhX2FnX2NiLnBfY2JhY2sgPSBwX2RhdGEtPmFwaV9lbmFibGUucF9jYmFjazsKKyAgICBidGFfYWdfY2IucGFyc2VfbW9kZSA9IHBfZGF0YS0+YXBpX2VuYWJsZS5wYXJzZV9tb2RlOworCisgICAgLyogY2FsbCBpbml0IGNhbGwtb3V0ICovCisgICAgYnRhX2FnX2NvX2luaXQoKTsKKworICAgIGJ0YV9zeXNfY29sbGlzaW9uX3JlZ2lzdGVyIChCVEFfSURfQUcsIGJ0YV9hZ19jb2xsaXNpb25fY2JhY2spOworCisgICAgLyogY2FsbCBjYWxsYmFjayB3aXRoIGVuYWJsZSBldmVudCAqLworICAgICgqYnRhX2FnX2NiLnBfY2JhY2spKEJUQV9BR19FTkFCTEVfRVZULCBOVUxMKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyoqCisqKiBGdW5jdGlvbiAgICAgICAgIGJ0YV9hZ19hcGlfZGlzYWJsZQorKioKKyoqIERlc2NyaXB0aW9uICAgICAgSGFuZGxlIGFuIEFQSSBkaXNhYmxlIGV2ZW50LgorKioKKyoqCisqKiBSZXR1cm5zICAgICAgICAgIHZvaWQKKyoqCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworc3RhdGljIHZvaWQgYnRhX2FnX2FwaV9kaXNhYmxlKHRCVEFfQUdfREFUQSAqcF9kYXRhKQoreworICAgIC8qIGRlcmVnaXN0ZXIgYWxsIHNjYnMgaW4gdXNlICovCisgICAgdEJUQV9BR19TQ0IgICAgICpwX3NjYiA9ICZidGFfYWdfY2Iuc2NiWzBdOworICAgIEJPT0xFQU4gICAgICAgICBkb19kZXJlZyA9IEZBTFNFOworICAgIGludCAgICAgICAgICAgICBpOworCisgICAgaWYgKCFidGFfc3lzX2lzX3JlZ2lzdGVyIChCVEFfSURfQUcpKQorICAgIHsKKyAgICAgICAgQVBQTF9UUkFDRV9FUlJPUjAoIkJUQSBBRyBpcyBhbHJlYWR5IGRpc2FibGVkLCBpZ25vcmluZyAuLi4iKTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIC8qIERlLXJlZ2lzdGVyIHdpdGggQlRBIHN5c3RlbSBtYW5hZ2VyICovCisgICAgR0tJX3NjaGVkX2xvY2soKTsKKyAgICBidGFfc3lzX2RlcmVnaXN0ZXIoQlRBX0lEX0FHKTsKKyAgICBHS0lfc2NoZWRfdW5sb2NrKCk7CisKKyAgICBmb3IgKGkgPSAwOyBpIDwgQlRBX0FHX05VTV9TQ0I7IGkrKywgcF9zY2IrKykKKyAgICB7CisgICAgICAgIGlmIChwX3NjYi0+aW5fdXNlKQorICAgICAgICB7CisgICAgICAgICAgICBidGFfYWdfc21fZXhlY3V0ZShwX3NjYiwgQlRBX0FHX0FQSV9ERVJFR0lTVEVSX0VWVCwgcF9kYXRhKTsKKyAgICAgICAgICAgIGRvX2RlcmVnID0gVFJVRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICghZG9fZGVyZWcpCisgICAgeworICAgICAgICAvKiBEb25lLCBzZW5kIGNhbGxiYWNrIGV2dCB0byBhcHAgKi8KKyAgICAgICAgKCpidGFfYWdfY2IucF9jYmFjaykoQlRBX0FHX0RJU0FCTEVfRVZULCBOVUxMKTsKKyAgICB9CisKKyAgICBidGFfc3lzX2NvbGxpc2lvbl9yZWdpc3RlciAoQlRBX0lEX0FHLCBOVUxMKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyoqCisqKiBGdW5jdGlvbiAgICAgICAgIGJ0YV9hZ19hcGlfcmVnaXN0ZXIKKyoqCisqKiBEZXNjcmlwdGlvbiAgICAgIEhhbmRsZSBhbiBBUEkgZXZlbnQgcmVnaXN0ZXJzIGEgbmV3IHNlcnZpY2UuCisqKgorKioKKyoqIFJldHVybnMgICAgICAgICAgdm9pZAorKioKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitzdGF0aWMgdm9pZCBidGFfYWdfYXBpX3JlZ2lzdGVyKHRCVEFfQUdfREFUQSAqcF9kYXRhKQoreworICAgIHRCVEFfQUdfU0NCICAgICAqcF9zY2I7CisgICAgdEJUQV9BR19SRUdJU1RFUiByZWc7CisKKyAgICAvKiBhbGxvY2F0ZSBhbiBzY2IgKi8KKyAgICBpZiAoKHBfc2NiID0gYnRhX2FnX3NjYl9hbGxvYygpKSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgYnRhX2FnX3NtX2V4ZWN1dGUocF9zY2IsIHBfZGF0YS0+aGRyLmV2ZW50LCBwX2RhdGEpOworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICByZWcuc3RhdHVzID0gQlRBX0FHX0ZBSUxfUkVTT1VSQ0VTOworICAgICAgICAoKmJ0YV9hZ19jYi5wX2NiYWNrKShCVEFfQUdfUkVHSVNURVJfRVZULCAodEJUQV9BRyAqKSAmcmVnKTsKKyAgICB9Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisqKgorKiogRnVuY3Rpb24gICAgICAgICBidGFfYWdfYXBpX3Jlc3VsdAorKioKKyoqIERlc2NyaXB0aW9uICAgICAgSGFuZGxlIGFuIEFQSSByZXN1bHQgZXZlbnQuCisqKgorKioKKyoqIFJldHVybnMgICAgICAgICAgdm9pZAorKioKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitzdGF0aWMgdm9pZCBidGFfYWdfYXBpX3Jlc3VsdCh0QlRBX0FHX0RBVEEgKnBfZGF0YSkKK3sKKyAgICB0QlRBX0FHX1NDQiAgICAgKnBfc2NiOworICAgIGludCAgICAgICAgICAgICBpOworCisgICAgaWYgKHBfZGF0YS0+aGRyLmxheWVyX3NwZWNpZmljICE9IEJUQV9BR19IQU5ETEVfQUxMKQorICAgIHsKKyAgICAgICAgaWYgKChwX3NjYiA9IGJ0YV9hZ19zY2JfYnlfaWR4KHBfZGF0YS0+aGRyLmxheWVyX3NwZWNpZmljKSkgIT0gTlVMTCkKKyAgICAgICAgeworICAgICAgICAgICAgYnRhX2FnX3NtX2V4ZWN1dGUocF9zY2IsIEJUQV9BR19BUElfUkVTVUxUX0VWVCwgcF9kYXRhKTsKKyAgICAgICAgfQorICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICBmb3IgKGkgPSAwLCBwX3NjYiA9ICZidGFfYWdfY2Iuc2NiWzBdOyBpIDwgQlRBX0FHX05VTV9TQ0I7IGkrKywgcF9zY2IrKykKKyAgICAgICAgeworICAgICAgICAgICAgaWYgKHBfc2NiLT5pbl91c2UpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgYnRhX2FnX3NtX2V4ZWN1dGUocF9zY2IsIEJUQV9BR19BUElfUkVTVUxUX0VWVCwgcF9kYXRhKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyoqCisqKiBGdW5jdGlvbiAgICAgICAgIGJ0YV9hZ19zbV9leGVjdXRlCisqKgorKiogRGVzY3JpcHRpb24gICAgICBTdGF0ZSBtYWNoaW5lIGV2ZW50IGhhbmRsaW5nIGZ1bmN0aW9uIGZvciBBRworKioKKyoqCisqKiBSZXR1cm5zICAgICAgICAgIHZvaWQKKyoqCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordm9pZCBidGFfYWdfc21fZXhlY3V0ZSh0QlRBX0FHX1NDQiAqcF9zY2IsIFVJTlQxNiBldmVudCwgdEJUQV9BR19EQVRBICpwX2RhdGEpCit7CisgICAgdEJUQV9BR19TVF9UQkwgICAgICBzdGF0ZV90YWJsZTsKKyAgICBVSU5UOCAgICAgICAgICAgICAgIGFjdGlvbjsKKyAgICBpbnQgICAgICAgICAgICAgICAgIGk7CisKKyNpZiBCVEFfQUdfREVCVUcgPT0gVFJVRQorICAgIFVJTlQxNiAgaW5fZXZlbnQgPSBldmVudDsKKyAgICBVSU5UOCAgIGluX3N0YXRlID0gcF9zY2ItPnN0YXRlOworCisgICAgLyogSWdub3JlIGRpc3BsYXlpbmcgb2YgQVQgcmVzdWx0cyB3aGVuIG5vdCBjb25uZWN0ZWQgKElnbm9yZWQgaW4gc3RhdGUgbWFjaGluZSkgKi8KKyAgICBpZiAoaW5fZXZlbnQgIT0gQlRBX0FHX0FQSV9SRVNVTFRfRVZUIHx8IHBfc2NiLT5zdGF0ZSA9PSBCVEFfQUdfT1BFTl9TVCkKKyAgICB7CisgICAgICAgIEFQUExfVFJBQ0VfRVZFTlQ1KCJBRyBldnQgKGhkbCAweCUwNHgpOiBTdGF0ZSAlZCAoJXMpLCBFdmVudCAweCUwNHggKCVzKSIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBidGFfYWdfc2NiX3RvX2lkeChwX3NjYiksCisgICAgICAgICAgICAgICAgICAgICAgICAgICBwX3NjYi0+c3RhdGUsIGJ0YV9hZ19zdGF0ZV9zdHIocF9zY2ItPnN0YXRlKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGV2ZW50LCBidGFfYWdfZXZ0X3N0cihldmVudCwgcF9kYXRhLT5hcGlfcmVzdWx0LnJlc3VsdCkpOworICAgIH0KKyNlbHNlCisgICAgQVBQTF9UUkFDRV9FVkVOVDMoIkFHIGV2dCAoaGRsIDB4JTA0eCk6IFN0YXRlICVkLCBFdmVudCAweCUwNHgiLAorICAgICAgICAgICAgICAgICAgICAgIGJ0YV9hZ19zY2JfdG9faWR4KHBfc2NiKSwgcF9zY2ItPnN0YXRlLCBldmVudCk7CisjZW5kaWYKKworICAgIGV2ZW50ICY9IDB4MDBGRjsKKyAgICBpZiAoZXZlbnQgPj0gKEJUQV9BR19NQVhfRVZUICYgMHgwMEZGKSkKKyAgICB7CisgICAgICAgIEFQUExfVFJBQ0VfRVJST1IwKCJBRyBldnQgb3V0IG9mIHJhbmdlLCBpZ25vcmluZy4uLiIpOworICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgLyogbG9vayB1cCB0aGUgc3RhdGUgdGFibGUgZm9yIHRoZSBjdXJyZW50IHN0YXRlICovCisgICAgc3RhdGVfdGFibGUgPSBidGFfYWdfc3RfdGJsW3Bfc2NiLT5zdGF0ZV07CisKKyAgICAvKiBzZXQgbmV4dCBzdGF0ZSAqLworICAgIHBfc2NiLT5zdGF0ZSA9IHN0YXRlX3RhYmxlW2V2ZW50XVtCVEFfQUdfTkVYVF9TVEFURV07CisKKyAgICAvKiBleGVjdXRlIGFjdGlvbiBmdW5jdGlvbnMgKi8KKyAgICBmb3IgKGkgPSAwOyBpIDwgQlRBX0FHX0FDVElPTlM7IGkrKykKKyAgICB7CisgICAgICAgIGlmICgoYWN0aW9uID0gc3RhdGVfdGFibGVbZXZlbnRdW2ldKSAhPSBCVEFfQUdfSUdOT1JFKQorICAgICAgICB7CisgICAgICAgICAgICAoKmJ0YV9hZ19hY3Rpb25bYWN0aW9uXSkocF9zY2IsIHBfZGF0YSk7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgIH0KKyNpZiBCVEFfQUdfREVCVUcgPT0gVFJVRQorICAgIGlmIChwX3NjYi0+c3RhdGUgIT0gaW5fc3RhdGUpCisgICAgeworICAgICAgICBBUFBMX1RSQUNFX0VWRU5UMygiQlRBIEFHIFN0YXRlIENoYW5nZTogWyVzXSAtPiBbJXNdIGFmdGVyIEV2ZW50IFslc10iLAorICAgICAgICAgICAgICAgICAgICAgIGJ0YV9hZ19zdGF0ZV9zdHIoaW5fc3RhdGUpLAorICAgICAgICAgICAgICAgICAgICAgIGJ0YV9hZ19zdGF0ZV9zdHIocF9zY2ItPnN0YXRlKSwKKyAgICAgICAgICAgICAgICAgICAgICBidGFfYWdfZXZ0X3N0cihpbl9ldmVudCwgcF9kYXRhLT5hcGlfcmVzdWx0LnJlc3VsdCkpOworICAgIH0KKyNlbmRpZgorfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorKioKKyoqIEZ1bmN0aW9uICAgICAgICAgYnRhX2FnX2hkbF9ldmVudAorKioKKyoqIERlc2NyaXB0aW9uICAgICAgRGF0YSBnYXRld2F5IG1haW4gZXZlbnQgaGFuZGxpbmcgZnVuY3Rpb24uCisqKgorKioKKyoqIFJldHVybnMgICAgICAgICAgQk9PTEVBTgorKioKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitCT09MRUFOIGJ0YV9hZ19oZGxfZXZlbnQoQlRfSERSICpwX21zZykKK3sKKyAgICB0QlRBX0FHX1NDQiAqcF9zY2I7CisKKyAgICBzd2l0Y2ggKHBfbXNnLT5ldmVudCkKKyAgICB7CisgICAgICAgIC8qIGhhbmRsZSBlbmFibGUgZXZlbnQgKi8KKyAgICAgICAgY2FzZSBCVEFfQUdfQVBJX0VOQUJMRV9FVlQ6CisgICAgICAgICAgICBidGFfYWdfYXBpX2VuYWJsZSgodEJUQV9BR19EQVRBICopIHBfbXNnKTsKKyAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgIC8qIGhhbmRsZSBkaXNhYmxlIGV2ZW50ICovCisgICAgICAgIGNhc2UgQlRBX0FHX0FQSV9ESVNBQkxFX0VWVDoKKyAgICAgICAgICAgIGJ0YV9hZ19hcGlfZGlzYWJsZSgodEJUQV9BR19EQVRBICopIHBfbXNnKTsKKyAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgIC8qIGhhbmRsZSByZWdpc3RlciBldmVudCAqLworICAgICAgICBjYXNlIEJUQV9BR19BUElfUkVHSVNURVJfRVZUOgorICAgICAgICAgICAgYnRhX2FnX2FwaV9yZWdpc3RlcigodEJUQV9BR19EQVRBICopIHBfbXNnKTsKKyAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgIC8qIGhhbmRsZSByZXN1bHQgZXZlbnQgKi8KKyAgICAgICAgY2FzZSBCVEFfQUdfQVBJX1JFU1VMVF9FVlQ6CisgICAgICAgICAgICBidGFfYWdfYXBpX3Jlc3VsdCgodEJUQV9BR19EQVRBICopIHBfbXNnKTsKKyAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgIC8qIGFsbCBvdGhlcnMgcmVmZXJlbmNlIHNjYiBieSBoYW5kbGUgKi8KKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIGlmICgocF9zY2IgPSBidGFfYWdfc2NiX2J5X2lkeChwX21zZy0+bGF5ZXJfc3BlY2lmaWMpKSAhPSBOVUxMKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGJ0YV9hZ19zbV9leGVjdXRlKHBfc2NiLCBwX21zZy0+ZXZlbnQsICh0QlRBX0FHX0RBVEEgKikgcF9tc2cpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgfQorICAgIHJldHVybiBUUlVFOworfQorCisjaWYgQlRBX0FHX0RFQlVHID09IFRSVUUKK3N0YXRpYyBjaGFyICpidGFfYWdfZXZ0X3N0cihVSU5UMTYgZXZlbnQsIHRCVEFfQUdfUkVTIHJlc3VsdCkKK3sKKyAgICBzd2l0Y2ggKGV2ZW50KQorICAgIHsKKyAgICBjYXNlIEJUQV9BR19BUElfUkVHSVNURVJfRVZUOgorICAgICAgICByZXR1cm4gIlJlZ2lzdGVyIFJlcXVlc3QiOworICAgIGNhc2UgQlRBX0FHX0FQSV9ERVJFR0lTVEVSX0VWVDoKKyAgICAgICAgcmV0dXJuICJEZXJlZ2lzdGVyIFJlcXVlc3QiOworICAgIGNhc2UgQlRBX0FHX0FQSV9PUEVOX0VWVDoKKyAgICAgICAgcmV0dXJuICJPcGVuIFNMQyBSZXF1ZXN0IjsKKyAgICBjYXNlIEJUQV9BR19BUElfQ0xPU0VfRVZUOgorICAgICAgICByZXR1cm4gIkNsb3NlIFNMQyBSZXF1ZXN0IjsKKyAgICBjYXNlIEJUQV9BR19BUElfQVVESU9fT1BFTl9FVlQ6CisgICAgICAgIHJldHVybiAiT3BlbiBBdWRpbyBSZXF1ZXN0IjsKKyAgICBjYXNlIEJUQV9BR19BUElfQVVESU9fQ0xPU0VfRVZUOgorICAgICAgICByZXR1cm4gIkNsb3NlIEF1ZGlvIFJlcXVlc3QiOworICAgIGNhc2UgQlRBX0FHX0FQSV9SRVNVTFRfRVZUOgorICAgICAgICBzd2l0Y2ggKHJlc3VsdCkKKyAgICAgICAgeworICAgICAgICBjYXNlIEJUQV9BR19TUEtfUkVTOiAgICAgICAgICAgIHJldHVybiAoIkFUIFJlc3VsdCAgQlRBX0FHX1NQS19SRVMiKTsKKyAgICAgICAgY2FzZSBCVEFfQUdfTUlDX1JFUzogICAgICAgICAgICByZXR1cm4gKCJBVCBSZXN1bHQgIEJUQV9BR19NSUNfUkVTIik7CisgICAgICAgIGNhc2UgQlRBX0FHX0lOQkFORF9SSU5HX1JFUzogICAgcmV0dXJuICgiQVQgUmVzdWx0ICBCVEFfQUdfSU5CQU5EX1JJTkdfUkVTIik7CisgICAgICAgIGNhc2UgQlRBX0FHX0NJTkRfUkVTOiAgICAgICAgICAgcmV0dXJuICgiQVQgUmVzdWx0ICBCVEFfQUdfQ0lORF9SRVMiKTsKKyAgICAgICAgY2FzZSBCVEFfQUdfQklOUF9SRVM6ICAgICAgICAgICByZXR1cm4gKCJBVCBSZXN1bHQgIEJUQV9BR19CSU5QX1JFUyIpOworICAgICAgICBjYXNlIEJUQV9BR19JTkRfUkVTOiAgICAgICAgICAgIHJldHVybiAoIkFUIFJlc3VsdCAgQlRBX0FHX0lORF9SRVMiKTsKKyAgICAgICAgY2FzZSBCVEFfQUdfQlZSQV9SRVM6ICAgICAgICAgICByZXR1cm4gKCJBVCBSZXN1bHQgIEJUQV9BR19CVlJBX1JFUyIpOworICAgICAgICBjYXNlIEJUQV9BR19DTlVNX1JFUzogICAgICAgICAgIHJldHVybiAoIkFUIFJlc3VsdCAgQlRBX0FHX0NOVU1fUkVTIik7CisgICAgICAgIGNhc2UgQlRBX0FHX0JUUkhfUkVTOiAgICAgICAgICAgcmV0dXJuICgiQVQgUmVzdWx0ICBCVEFfQUdfQlRSSF9SRVMiKTsKKyAgICAgICAgY2FzZSBCVEFfQUdfQ0xDQ19SRVM6ICAgICAgICAgICByZXR1cm4gKCJBVCBSZXN1bHQgIEJUQV9BR19DTENDX1JFUyIpOworICAgICAgICBjYXNlIEJUQV9BR19DT1BTX1JFUzogICAgICAgICAgIHJldHVybiAoIkFUIFJlc3VsdCAgQlRBX0FHX0NPUFNfUkVTIik7CisgICAgICAgIGNhc2UgQlRBX0FHX0lOX0NBTExfUkVTOiAgICAgICAgcmV0dXJuICgiQVQgUmVzdWx0ICBCVEFfQUdfSU5fQ0FMTF9SRVMiKTsKKyAgICAgICAgY2FzZSBCVEFfQUdfSU5fQ0FMTF9DT05OX1JFUzogICByZXR1cm4gKCJBVCBSZXN1bHQgIEJUQV9BR19JTl9DQUxMX0NPTk5fUkVTIik7CisgICAgICAgIGNhc2UgQlRBX0FHX0NBTExfV0FJVF9SRVM6ICAgICAgcmV0dXJuICgiQVQgUmVzdWx0ICBCVEFfQUdfQ0FMTF9XQUlUX1JFUyIpOworICAgICAgICBjYXNlIEJUQV9BR19PVVRfQ0FMTF9PUklHX1JFUzogIHJldHVybiAoIkFUIFJlc3VsdCAgQlRBX0FHX09VVF9DQUxMX09SSUdfUkVTIik7CisgICAgICAgIGNhc2UgQlRBX0FHX09VVF9DQUxMX0FMRVJUX1JFUzogcmV0dXJuICgiQVQgUmVzdWx0ICBCVEFfQUdfT1VUX0NBTExfQUxFUlRfUkVTIik7CisgICAgICAgIGNhc2UgQlRBX0FHX09VVF9DQUxMX0NPTk5fUkVTOiAgcmV0dXJuICgiQVQgUmVzdWx0ICBCVEFfQUdfT1VUX0NBTExfQ09OTl9SRVMiKTsKKyAgICAgICAgY2FzZSBCVEFfQUdfQ0FMTF9DQU5DRUxfUkVTOiAgICByZXR1cm4gKCJBVCBSZXN1bHQgIEJUQV9BR19DQUxMX0NBTkNFTF9SRVMiKTsKKyAgICAgICAgY2FzZSBCVEFfQUdfRU5EX0NBTExfUkVTOiAgICAgICByZXR1cm4gKCJBVCBSZXN1bHQgIEJUQV9BR19FTkRfQ0FMTF9SRVMiKTsKKyAgICAgICAgY2FzZSBCVEFfQUdfVU5BVF9SRVM6ICAgICAgICAgICByZXR1cm4gKCJBVCBSZXN1bHQgIEJUQV9BR19VTkFUX1JFUyIpOworICAgICAgICBkZWZhdWx0OiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAoIlVua25vd24gQUcgUmVzdWx0Iik7CisgICAgICAgIH0KKyAgICBjYXNlIEJUQV9BR19BUElfU0VUQ09ERUNfRVZUOgorICAgICAgICByZXR1cm4gIlNldCBDb2RlYyBSZXF1ZXN0IjsKKyAgICBjYXNlIEJUQV9BR19SRkNfT1BFTl9FVlQ6CisgICAgICAgIHJldHVybiAiUkZDIE9wZW5lZCI7CisgICAgY2FzZSBCVEFfQUdfUkZDX0NMT1NFX0VWVDoKKyAgICAgICAgcmV0dXJuICJSRkMgQ2xvc2VkIjsKKyAgICBjYXNlIEJUQV9BR19SRkNfU1JWX0NMT1NFX0VWVDoKKyAgICAgICAgcmV0dXJuICJSRkMgU1JWIENsb3NlZCI7CisgICAgY2FzZSBCVEFfQUdfUkZDX0RBVEFfRVZUOgorICAgICAgICByZXR1cm4gIlJGQyBEYXRhIjsKKyAgICBjYXNlIEJUQV9BR19TQ09fT1BFTl9FVlQ6CisgICAgICAgIHJldHVybiAiQXVkaW8gT3BlbmVkIjsKKyAgICBjYXNlIEJUQV9BR19TQ09fQ0xPU0VfRVZUOgorICAgICAgICByZXR1cm4gIkF1ZGlvIENsb3NlZCI7CisgICAgY2FzZSBCVEFfQUdfRElTQ19BQ1BfUkVTX0VWVDoKKyAgICAgICAgcmV0dXJuICJEaXNjb3ZlcnkgQUNQIFJlc3VsdCI7CisgICAgY2FzZSBCVEFfQUdfRElTQ19JTlRfUkVTX0VWVDoKKyAgICAgICAgcmV0dXJuICJEaXNjb3ZlcnkgSU5UIFJlc3VsdCI7CisgICAgY2FzZSBCVEFfQUdfRElTQ19PS19FVlQ6CisgICAgICAgIHJldHVybiAiRGlzY292ZXJ5IE9LIjsKKyAgICBjYXNlIEJUQV9BR19ESVNDX0ZBSUxfRVZUOgorICAgICAgICByZXR1cm4gIkRpc2NvdmVyeSBGYWlsZWQiOworICAgIGNhc2UgQlRBX0FHX0NJX1JYX1dSSVRFX0VWVDoKKyAgICAgICAgcmV0dXJuICJDSSBSWCBXcml0ZSI7CisgICAgY2FzZSBCVEFfQUdfUklOR19UT1VUX0VWVDoKKyAgICAgICAgcmV0dXJuICJSaW5nIFRpbWVvdXQiOworICAgIGNhc2UgQlRBX0FHX1NWQ19UT1VUX0VWVDoKKyAgICAgICAgcmV0dXJuICJTZXJ2aWNlIFRpbWVvdXQiOworICAgIGNhc2UgQlRBX0FHX0FQSV9FTkFCTEVfRVZUOgorICAgICAgICByZXR1cm4gIkVuYWJsZSBBRyI7CisgICAgY2FzZSBCVEFfQUdfQVBJX0RJU0FCTEVfRVZUOgorICAgICAgICByZXR1cm4gIkRpc2FibGUgQUciOworICAgIGNhc2UgQlRBX0FHX0NJX1NDT19EQVRBX0VWVDoKKyAgICAgICAgcmV0dXJuICJTQ08gZGF0YSBDYWxsaW4iOworICAgIGNhc2UgQlRBX0FHX0NJX1NMQ19SRUFEWV9FVlQ6CisgICAgICAgIHJldHVybiAiU0xDIFJlYWR5IENhbGxpbiI7CisgICAgZGVmYXVsdDoKKyAgICAgICAgcmV0dXJuICJVbmtub3duIEFHIEV2ZW50IjsKKyAgICB9Cit9CisKK3N0YXRpYyBjaGFyICpidGFfYWdfc3RhdGVfc3RyKFVJTlQ4IHN0YXRlKQoreworICAgIHN3aXRjaCAoc3RhdGUpCisgICAgeworICAgIGNhc2UgQlRBX0FHX0lOSVRfU1Q6CisgICAgICAgIHJldHVybiAiSW5pdGlhbCI7CisgICAgY2FzZSBCVEFfQUdfT1BFTklOR19TVDoKKyAgICAgICAgcmV0dXJuICJPcGVuaW5nIjsKKyAgICBjYXNlIEJUQV9BR19PUEVOX1NUOgorICAgICAgICByZXR1cm4gIk9wZW4iOworICAgIGNhc2UgQlRBX0FHX0NMT1NJTkdfU1Q6CisgICAgICAgIHJldHVybiAiQ2xvc2luZyI7CisgICAgZGVmYXVsdDoKKyAgICAgICAgcmV0dXJuICJVbmtub3duIEFHIFN0YXRlIjsKKyAgICB9Cit9CisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvYnRhL2hmX2NsaWVudC9idGFfaGZfY2xpZW50X3JmYy5jIGIvYnRhL2hmX2NsaWVudC9idGFfaGZfY2xpZW50X3JmYy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQ2YjUzMjkKLS0tIC9kZXYvbnVsbAorKysgYi9idGEvaGZfY2xpZW50L2J0YV9oZl9jbGllbnRfcmZjLmMKQEAgLTAsMCArMSw0NDYgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCisgKiAgQ29weXJpZ2h0IChDKSAyMDA0LTIwMTIgQnJvYWRjb20gQ29ycG9yYXRpb24KKyAqCisgKiAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdDoKKyAqCisgKiAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgorICogIFRoaXMgZmlsZSBjb250YWlucyB0aGUgYXVkaW8gZ2F0ZXdheSBmdW5jdGlvbnMgY29udHJvbGxpbmcgdGhlIFJGQ09NTQorICogIGNvbm5lY3Rpb25zLgorICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyNpbmNsdWRlIDxzdHJpbmcuaD4KKyNpbmNsdWRlICJidGFfYXBpLmgiCisjaW5jbHVkZSAiYnRhX3N5cy5oIgorI2luY2x1ZGUgImJ0YV9hZ19hcGkuaCIKKyNpbmNsdWRlICJidGFfYWdfaW50LmgiCisjaW5jbHVkZSAiYnRhX2FnX2NvLmgiCisjaW5jbHVkZSAiYnRtX2FwaS5oIgorI2luY2x1ZGUgInBvcnRfYXBpLmgiCisjaW5jbHVkZSAicmZjZGVmcy5oIgorI2luY2x1ZGUgImdraS5oIgorI2luY2x1ZGUgImJkLmgiCisjaW5jbHVkZSAidXRsLmgiCisKKy8qIEV2ZW50IG1hc2sgZm9yIFJmQ09NTSBwb3J0IGNhbGxiYWNrICovCisjZGVmaW5lIEJUQV9BR19QT1JUX0VWX01BU0sgICAgICAgICBQT1JUX0VWX1JYQ0hBUgorCisvKiBlYWNoIHNjYiBoYXMgaXRzIG93biByZmNvbW0gY2FsbGJhY2tzICovCit2b2lkIGJ0YV9hZ19wb3J0X2NiYWNrXzEoVUlOVDMyIGNvZGUsIFVJTlQxNiBwb3J0X2hhbmRsZSk7Cit2b2lkIGJ0YV9hZ19wb3J0X2NiYWNrXzIoVUlOVDMyIGNvZGUsIFVJTlQxNiBwb3J0X2hhbmRsZSk7Cit2b2lkIGJ0YV9hZ19wb3J0X2NiYWNrXzMoVUlOVDMyIGNvZGUsIFVJTlQxNiBwb3J0X2hhbmRsZSk7CisKK3ZvaWQgYnRhX2FnX21nbXRfY2JhY2tfMShVSU5UMzIgY29kZSwgVUlOVDE2IHBvcnRfaGFuZGxlKTsKK3ZvaWQgYnRhX2FnX21nbXRfY2JhY2tfMihVSU5UMzIgY29kZSwgVUlOVDE2IHBvcnRfaGFuZGxlKTsKK3ZvaWQgYnRhX2FnX21nbXRfY2JhY2tfMyhVSU5UMzIgY29kZSwgVUlOVDE2IHBvcnRfaGFuZGxlKTsKKworaW50IGJ0YV9hZ19kYXRhX2NiYWNrXzEoVUlOVDE2IHBvcnRfaGFuZGxlLCB2b2lkICpwX2RhdGEsIFVJTlQxNiBsZW4pOworaW50IGJ0YV9hZ19kYXRhX2NiYWNrXzIoVUlOVDE2IHBvcnRfaGFuZGxlLCB2b2lkICpwX2RhdGEsIFVJTlQxNiBsZW4pOworaW50IGJ0YV9hZ19kYXRhX2NiYWNrXzMoVUlOVDE2IHBvcnRfaGFuZGxlLCB2b2lkICpwX2RhdGEsIFVJTlQxNiBsZW4pOworCisvKiByZmNvbW0gY2FsbGJhY2sgZnVuY3Rpb24gdGFibGVzICovCit0eXBlZGVmIHRQT1JUX0NBTExCQUNLICp0QlRBX0FHX1BPUlRfQ0JBQ0s7Citjb25zdCB0QlRBX0FHX1BPUlRfQ0JBQ0sgYnRhX2FnX3BvcnRfY2JhY2tfdGJsW10gPQoreworICAgIGJ0YV9hZ19wb3J0X2NiYWNrXzEsCisgICAgYnRhX2FnX3BvcnRfY2JhY2tfMiwKKyAgICBidGFfYWdfcG9ydF9jYmFja18zCit9OworCitjb25zdCB0QlRBX0FHX1BPUlRfQ0JBQ0sgYnRhX2FnX21nbXRfY2JhY2tfdGJsW10gPQoreworICAgIGJ0YV9hZ19tZ210X2NiYWNrXzEsCisgICAgYnRhX2FnX21nbXRfY2JhY2tfMiwKKyAgICBidGFfYWdfbWdtdF9jYmFja18zCit9OworCit0eXBlZGVmIHRQT1JUX0RBVEFfQ0FMTEJBQ0sgKnRCVEFfQUdfREFUQV9DQkFDSzsKK2NvbnN0IHRCVEFfQUdfREFUQV9DQkFDSyBidGFfYWdfZGF0YV9jYmFja190YmxbXSA9Cit7CisgICAgYnRhX2FnX2RhdGFfY2JhY2tfMSwKKyAgICBidGFfYWdfZGF0YV9jYmFja18yLAorICAgIGJ0YV9hZ19kYXRhX2NiYWNrXzMKK307CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisqKgorKiogRnVuY3Rpb24gICAgICAgICBidGFfYWdfcG9ydF9jYmFjaworKioKKyoqIERlc2NyaXB0aW9uICAgICAgUkZDT01NIFBvcnQgY2FsbGJhY2sKKyoqCisqKgorKiogUmV0dXJucyAgICAgICAgICB2b2lkCisqKgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3N0YXRpYyB2b2lkIGJ0YV9hZ19wb3J0X2NiYWNrKFVJTlQzMiBjb2RlLCBVSU5UMTYgcG9ydF9oYW5kbGUsIFVJTlQxNiBoYW5kbGUpCit7CisgICAgQlRfSERSICAgICAgKnBfYnVmOworICAgIHRCVEFfQUdfU0NCICpwX3NjYjsKKyAgICBVTlVTRUQoY29kZSk7CisKKyAgICBpZiAoKHBfc2NiID0gYnRhX2FnX3NjYl9ieV9pZHgoaGFuZGxlKSkgIT0gTlVMTCkKKyAgICB7CisgICAgICAgIC8qIGlnbm9yZSBwb3J0IGV2ZW50cyBmb3IgcG9ydCBoYW5kbGVzIG90aGVyIHRoYW4gY29ubmVjdGVkIGhhbmRsZSAqLworICAgICAgICBpZiAocG9ydF9oYW5kbGUgIT0gcF9zY2ItPmNvbm5faGFuZGxlKQorICAgICAgICB7CisgICAgICAgICAgICBBUFBMX1RSQUNFX0RFQlVHMygiYWdfcG9ydF9jYmFjayBpZ25vcmluZyBoYW5kbGU6JWQgY29ubl9oYW5kbGUgPSAlZCBvdGhlciBoYW5kbGUgPSAlZCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwb3J0X2hhbmRsZSwgcF9zY2ItPmNvbm5faGFuZGxlLCBoYW5kbGUpOworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisKKyAgICAgICAgaWYgKChwX2J1ZiA9IChCVF9IRFIgKikgR0tJX2dldGJ1ZihzaXplb2YoQlRfSERSKSkpICE9IE5VTEwpCisgICAgICAgIHsKKyAgICAgICAgICAgIHBfYnVmLT5ldmVudCA9IEJUQV9BR19SRkNfREFUQV9FVlQ7CisgICAgICAgICAgICBwX2J1Zi0+bGF5ZXJfc3BlY2lmaWMgPSBoYW5kbGU7CisgICAgICAgICAgICBidGFfc3lzX3NlbmRtc2cocF9idWYpOworICAgICAgICB9CisgICAgfQorfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorKioKKyoqIEZ1bmN0aW9uICAgICAgICAgYnRhX2FnX21nbXRfY2JhY2sKKyoqCisqKiBEZXNjcmlwdGlvbiAgICAgIFJGQ09NTSBtYW5hZ2VtZW50IGNhbGxiYWNrCisqKgorKioKKyoqIFJldHVybnMgICAgICAgICAgdm9pZAorKioKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitzdGF0aWMgdm9pZCBidGFfYWdfbWdtdF9jYmFjayhVSU5UMzIgY29kZSwgVUlOVDE2IHBvcnRfaGFuZGxlLCBVSU5UMTYgaGFuZGxlKQoreworICAgIHRCVEFfQUdfUkZDICAgICAqcF9idWY7CisgICAgdEJUQV9BR19TQ0IgICAgICpwX3NjYjsKKyAgICBVSU5UMTYgICAgICAgICAgZXZlbnQ7CisgICAgVUlOVDggICAgICAgICAgIGk7CisgICAgQk9PTEVBTiAgICAgICAgIGZvdW5kX2hhbmRsZSA9IEZBTFNFOworCisgICAgQVBQTF9UUkFDRV9ERUJVRzMoImFnX21nbXRfY2JhY2sgOiBjb2RlID0gJWQsIHBvcnRfaGFuZGxlID0gJWQsIGhhbmRsZSA9ICVkIiwKKyAgICAgICAgICAgICAgICAgICAgICAgIGNvZGUsIHBvcnRfaGFuZGxlLCBoYW5kbGUpOworCisgICAgaWYgKChwX3NjYiA9IGJ0YV9hZ19zY2JfYnlfaWR4KGhhbmRsZSkpICE9IE5VTEwpCisgICAgeworICAgICAgICAvKiBpZ25vcmUgY2xvc2UgZXZlbnQgZm9yIHBvcnQgaGFuZGxlcyBvdGhlciB0aGFuIGNvbm5lY3RlZCBoYW5kbGUgKi8KKyAgICAgICAgaWYgKChjb2RlICE9IFBPUlRfU1VDQ0VTUykgJiYgKHBvcnRfaGFuZGxlICE9IHBfc2NiLT5jb25uX2hhbmRsZSkpCisgICAgICAgIHsKKyAgICAgICAgICAgIEFQUExfVFJBQ0VfREVCVUcxKCJhZ19tZ210X2NiYWNrIGlnbm9yaW5nIGhhbmRsZTolZCIsIHBvcnRfaGFuZGxlKTsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorCisgICAgICAgIGlmIChjb2RlID09IFBPUlRfU1VDQ0VTUykKKyAgICAgICAgeworICAgICAgICAgICAgaWYgKHBfc2NiLT5jb25uX2hhbmRsZSkgICAgIC8qIE91dGdvaW5nIGNvbm5lY3Rpb24gKi8KKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAocG9ydF9oYW5kbGUgPT0gcF9zY2ItPmNvbm5faGFuZGxlKQorICAgICAgICAgICAgICAgICAgICBmb3VuZF9oYW5kbGUgPSBUUlVFOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZSAgICAgICAgICAgICAgICAgICAgICAgIC8qIEluY29taW5nIGNvbm5lY3Rpb24gKi8KKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBmb3IgKGkgPSAwOyBpIDwgQlRBX0FHX05VTV9JRFg7IGkrKykKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGlmIChwb3J0X2hhbmRsZSA9PSBwX3NjYi0+c2Vydl9oYW5kbGVbaV0pCisgICAgICAgICAgICAgICAgICAgICAgICBmb3VuZF9oYW5kbGUgPSBUUlVFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaWYgKCFmb3VuZF9oYW5kbGUpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgQVBQTF9UUkFDRV9FUlJPUjEgKCJidGFfYWdfbWdtdF9jYmFjazogUE9SVF9TVUNDRVNTLCBpZ25vcmluZyBoYW5kbGUgPSAlZCIsIHBvcnRfaGFuZGxlKTsKKyAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGV2ZW50ID0gQlRBX0FHX1JGQ19PUEVOX0VWVDsKKyAgICAgICAgfQorICAgICAgICAvKiBkaXN0aW5ndWlzaCBzZXJ2ZXIgY2xvc2UgZXZlbnRzICovCisgICAgICAgIGVsc2UgaWYgKHBvcnRfaGFuZGxlID09IHBfc2NiLT5jb25uX2hhbmRsZSkKKyAgICAgICAgeworICAgICAgICAgICAgZXZlbnQgPSBCVEFfQUdfUkZDX0NMT1NFX0VWVDsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIGV2ZW50ID0gQlRBX0FHX1JGQ19TUlZfQ0xPU0VfRVZUOworICAgICAgICB9CisKKyAgICAgICAgaWYgKChwX2J1ZiA9ICh0QlRBX0FHX1JGQyAqKSBHS0lfZ2V0YnVmKHNpemVvZih0QlRBX0FHX1JGQykpKSAhPSBOVUxMKQorICAgICAgICB7CisgICAgICAgICAgICBwX2J1Zi0+aGRyLmV2ZW50ID0gZXZlbnQ7CisgICAgICAgICAgICBwX2J1Zi0+aGRyLmxheWVyX3NwZWNpZmljID0gaGFuZGxlOworICAgICAgICAgICAgcF9idWYtPnBvcnRfaGFuZGxlID0gcG9ydF9oYW5kbGU7CisgICAgICAgICAgICBidGFfc3lzX3NlbmRtc2cocF9idWYpOworICAgICAgICB9CisgICAgfQorfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorKioKKyoqIEZ1bmN0aW9uICAgICAgICAgYnRhX2FnX2RhdGFfY2JhY2sKKyoqCisqKiBEZXNjcmlwdGlvbiAgICAgIFJGQ09NTSBkYXRhIGNhbGxiYWNrCisqKgorKioKKyoqIFJldHVybnMgICAgICAgICAgdm9pZAorKioKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitzdGF0aWMgaW50IGJ0YV9hZ19kYXRhX2NiYWNrKFVJTlQxNiBwb3J0X2hhbmRsZSwgdm9pZCAqcF9kYXRhLCBVSU5UMTYgbGVuLCBVSU5UMTYgaGFuZGxlKQoreworICAgIFVOVVNFRChwb3J0X2hhbmRsZSk7CisKKyAgICAvKiBjYWxsIGRhdGEgY2FsbC1vdXQgZGlyZWN0bHkgKi8KKyAgICBidGFfYWdfY29fdHhfd3JpdGUoaGFuZGxlLCAoVUlOVDggKikgcF9kYXRhLCBsZW4pOworICAgIHJldHVybiAwOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorKioKKyoqIEZ1bmN0aW9uICAgICAgICAgYnRhX2FnX3BvcnRfY2JhY2tfMSB0byAzCisqKiAgICAgICAgICAgICAgICAgIGJ0YV9hZ19tZ210X2NiYWNrXzEgdG8gMworKioKKyoqIERlc2NyaXB0aW9uICAgICAgUkZDT01NIGNhbGxiYWNrIGZ1bmN0aW9ucy4gIFRoaXMgaXMgYW4gZWFzeSB3YXkgdG8KKyoqICAgICAgICAgICAgICAgICAgZGlzdGluZ3Vpc2ggc2NiIGZyb20gdGhlIGNhbGxiYWNrLgorKioKKyoqCisqKiBSZXR1cm5zICAgICAgICAgIHZvaWQKKyoqCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordm9pZCBidGFfYWdfbWdtdF9jYmFja18xKFVJTlQzMiBjb2RlLCBVSU5UMTYgaGFuZGxlKSB7YnRhX2FnX21nbXRfY2JhY2soY29kZSwgaGFuZGxlLCAxKTt9Cit2b2lkIGJ0YV9hZ19tZ210X2NiYWNrXzIoVUlOVDMyIGNvZGUsIFVJTlQxNiBoYW5kbGUpIHtidGFfYWdfbWdtdF9jYmFjayhjb2RlLCBoYW5kbGUsIDIpO30KK3ZvaWQgYnRhX2FnX21nbXRfY2JhY2tfMyhVSU5UMzIgY29kZSwgVUlOVDE2IGhhbmRsZSkge2J0YV9hZ19tZ210X2NiYWNrKGNvZGUsIGhhbmRsZSwgMyk7fQordm9pZCBidGFfYWdfcG9ydF9jYmFja18xKFVJTlQzMiBjb2RlLCBVSU5UMTYgaGFuZGxlKSB7YnRhX2FnX3BvcnRfY2JhY2soY29kZSwgaGFuZGxlLCAxKTt9Cit2b2lkIGJ0YV9hZ19wb3J0X2NiYWNrXzIoVUlOVDMyIGNvZGUsIFVJTlQxNiBoYW5kbGUpIHtidGFfYWdfcG9ydF9jYmFjayhjb2RlLCBoYW5kbGUsIDIpO30KK3ZvaWQgYnRhX2FnX3BvcnRfY2JhY2tfMyhVSU5UMzIgY29kZSwgVUlOVDE2IGhhbmRsZSkge2J0YV9hZ19wb3J0X2NiYWNrKGNvZGUsIGhhbmRsZSwgMyk7fQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorKioKKyoqIEZ1bmN0aW9uICAgICAgICAgYnRhX2FnX2RhdGFfY2JhY2tfMSB0byAzCisqKgorKiogRGVzY3JpcHRpb24gICAgICBSRkNPTU0gZGF0YSBjYWxsYmFjayBmdW5jdGlvbnMuICBUaGlzIGlzIGFuIGVhc3kgd2F5IHRvCisqKiAgICAgICAgICAgICAgICAgIGRpc3Rpbmd1aXNoIHNjYiBmcm9tIHRoZSBjYWxsYmFjay4KKyoqCisqKgorKiogUmV0dXJucyAgICAgICAgICB2b2lkCisqKgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2ludCBidGFfYWdfZGF0YV9jYmFja18xKFVJTlQxNiBwb3J0X2hhbmRsZSwgdm9pZCAqcF9kYXRhLCBVSU5UMTYgbGVuKQoreworICAgIHJldHVybiBidGFfYWdfZGF0YV9jYmFjayhwb3J0X2hhbmRsZSwgcF9kYXRhLCBsZW4sIDEpOworfQoraW50IGJ0YV9hZ19kYXRhX2NiYWNrXzIoVUlOVDE2IHBvcnRfaGFuZGxlLCB2b2lkICpwX2RhdGEsIFVJTlQxNiBsZW4pCit7CisgICAgcmV0dXJuIGJ0YV9hZ19kYXRhX2NiYWNrKHBvcnRfaGFuZGxlLCBwX2RhdGEsIGxlbiwgMik7Cit9CitpbnQgYnRhX2FnX2RhdGFfY2JhY2tfMyhVSU5UMTYgcG9ydF9oYW5kbGUsIHZvaWQgKnBfZGF0YSwgVUlOVDE2IGxlbikKK3sKKyAgICByZXR1cm4gYnRhX2FnX2RhdGFfY2JhY2socG9ydF9oYW5kbGUsIHBfZGF0YSwgbGVuLCAzKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyoqCisqKiBGdW5jdGlvbiAgICAgICAgIGJ0YV9hZ19zZXR1cF9wb3J0CisqKgorKiogRGVzY3JpcHRpb24gICAgICBTZXR1cCBSRkNPTU0gcG9ydCBmb3IgdXNlIGJ5IEFHLgorKioKKyoqCisqKiBSZXR1cm5zICAgICAgICAgIHZvaWQKKyoqCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordm9pZCBidGFfYWdfc2V0dXBfcG9ydCh0QlRBX0FHX1NDQiAqcF9zY2IsIFVJTlQxNiBoYW5kbGUpCit7CisgICAgVUlOVDE2IGkgPSBidGFfYWdfc2NiX3RvX2lkeChwX3NjYikgLSAxOworCisgICAgLyogc2V0IHVwIGRhdGEgY2FsbGJhY2sgaWYgdXNpbmcgcGFzcyB0aHJvdWdoIG1vZGUgKi8KKyAgICBpZiAoYnRhX2FnX2NiLnBhcnNlX21vZGUgPT0gQlRBX0FHX1BBU1NfVEhST1VHSCkKKyAgICB7CisgICAgICAgIFBPUlRfU2V0RGF0YUNhbGxiYWNrKGhhbmRsZSwgYnRhX2FnX2RhdGFfY2JhY2tfdGJsW2ldKTsKKyAgICB9CisKKyAgICBQT1JUX1NldEV2ZW50TWFzayhoYW5kbGUsIEJUQV9BR19QT1JUX0VWX01BU0spOworICAgIFBPUlRfU2V0RXZlbnRDYWxsYmFjayhoYW5kbGUsIGJ0YV9hZ19wb3J0X2NiYWNrX3RibFtpXSk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisqKgorKiogRnVuY3Rpb24gICAgICAgICBidGFfYWdfc3RhcnRfc2VydmVycworKioKKyoqIERlc2NyaXB0aW9uICAgICAgU2V0dXAgUkZDT01NIHNlcnZlcnMgZm9yIHVzZSBieSBBRy4KKyoqCisqKgorKiogUmV0dXJucyAgICAgICAgICB2b2lkCisqKgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3ZvaWQgYnRhX2FnX3N0YXJ0X3NlcnZlcnModEJUQV9BR19TQ0IgKnBfc2NiLCB0QlRBX1NFUlZJQ0VfTUFTSyBzZXJ2aWNlcykKK3sKKyAgICBpbnQgaTsKKyAgICBpbnQgYnRhX2FnX3BvcnRfc3RhdHVzOworCisgICAgc2VydmljZXMgPj49IEJUQV9IU1BfU0VSVklDRV9JRDsKKyAgICBmb3IgKGkgPSAwOyBpIDwgQlRBX0FHX05VTV9JRFggJiYgc2VydmljZXMgIT0gMDsgaSsrLCBzZXJ2aWNlcyA+Pj0gMSkKKyAgICB7CisgICAgICAgIC8qIGlmIHNlcnZpY2UgaXMgc2V0IGluIG1hc2sgKi8KKyAgICAgICAgaWYgKHNlcnZpY2VzICYgMSkKKyAgICAgICAgeworICAgICAgICAgICAgQlRNX1NldFNlY3VyaXR5TGV2ZWwoRkFMU0UsICIiLCBidGFfYWdfc2VjX2lkW2ldLCBwX3NjYi0+c2Vydl9zZWNfbWFzaywKKyAgICAgICAgICAgICAgICBCVF9QU01fUkZDT01NLCBCVE1fU0VDX1BST1RPX1JGQ09NTSwgYnRhX2FnX2NiLnByb2ZpbGVbaV0uc2NuKTsKKworICAgICAgICAgICAgYnRhX2FnX3BvcnRfc3RhdHVzID0gIFJGQ09NTV9DcmVhdGVDb25uZWN0aW9uKGJ0YV9hZ191dWlkW2ldLCBidGFfYWdfY2IucHJvZmlsZVtpXS5zY24sCisgICAgICAgICAgICAgICAgVFJVRSwgQlRBX0FHX01UVSwgKFVJTlQ4ICopIGJkX2FkZHJfYW55LCAmKHBfc2NiLT5zZXJ2X2hhbmRsZVtpXSksCisgICAgICAgICAgICAgICAgYnRhX2FnX21nbXRfY2JhY2tfdGJsW2J0YV9hZ19zY2JfdG9faWR4KHBfc2NiKSAtIDFdKTsKKworICAgICAgICAgICAgaWYoIGJ0YV9hZ19wb3J0X3N0YXR1cyAgPT0gUE9SVF9TVUNDRVNTICkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBidGFfYWdfc2V0dXBfcG9ydChwX3NjYiwgcF9zY2ItPnNlcnZfaGFuZGxlW2ldKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAvKiBUT0RPOiBDUiMxMzcxMjUgdG8gaGFuZGxlIHRvIGVycm9yIHByb3Blcmx5ICovCisgICAgICAgICAgICAgICAgQVBQTF9UUkFDRV9ERUJVRzEoImJ0YV9hZ19zdGFydF9zZXJ2ZXJzOiBSRkNPTU1fQ3JlYXRlQ29ubmVjdGlvbiByZXR1cm5lZCBlcnJvcjolZCIsIGJ0YV9hZ19wb3J0X3N0YXR1cyk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisqKgorKiogRnVuY3Rpb24gICAgICAgICBidGFfYWdfY2xvc2Vfc2VydmVycworKioKKyoqIERlc2NyaXB0aW9uICAgICAgQ2xvc2UgUkZDT01NIHNlcnZlcnMgcG9ydCBmb3IgdXNlIGJ5IEFHLgorKioKKyoqCisqKiBSZXR1cm5zICAgICAgICAgIHZvaWQKKyoqCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordm9pZCBidGFfYWdfY2xvc2Vfc2VydmVycyh0QlRBX0FHX1NDQiAqcF9zY2IsIHRCVEFfU0VSVklDRV9NQVNLIHNlcnZpY2VzKQoreworICAgIGludCBpOworCisgICAgc2VydmljZXMgPj49IEJUQV9IU1BfU0VSVklDRV9JRDsKKyAgICBmb3IgKGkgPSAwOyBpIDwgQlRBX0FHX05VTV9JRFggJiYgc2VydmljZXMgIT0gMDsgaSsrLCBzZXJ2aWNlcyA+Pj0gMSkKKyAgICB7CisgICAgICAgIC8qIGlmIHNlcnZpY2UgaXMgc2V0IGluIG1hc2sgKi8KKyAgICAgICAgaWYgKHNlcnZpY2VzICYgMSkKKyAgICAgICAgeworICAgICAgICAgICAgUkZDT01NX1JlbW92ZVNlcnZlcihwX3NjYi0+c2Vydl9oYW5kbGVbaV0pOworICAgICAgICAgICAgcF9zY2ItPnNlcnZfaGFuZGxlW2ldID0gMDsKKyAgICAgICAgfQorICAgIH0KK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyoqCisqKiBGdW5jdGlvbiAgICAgICAgIGJ0YV9hZ19pc19zZXJ2ZXJfY2xvc2VkCisqKgorKiogRGVzY3JpcHRpb24gICAgICBSZXR1cm5zIFRSVUUgaWYgYWxsIHNlcnZlcnMgYXJlIGNsb3NlZC4KKyoqCisqKgorKiogUmV0dXJucyAgICAgICAgICBUUlVFIGlmIGFsbCBzZXJ2ZXJzIGFyZSBjbG9zZWQsIEZBTFNFIG90aGVyd2lzZQorKioKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitCT09MRUFOIGJ0YV9hZ19pc19zZXJ2ZXJfY2xvc2VkICh0QlRBX0FHX1NDQiAqcF9zY2IpCit7CisgICAgVUlOVDggeHg7CisgICAgQk9PTEVBTiBpc19jbG9zZWQgPSBUUlVFOworCisgICAgZm9yICh4eCA9IDA7IHh4IDwgQlRBX0FHX05VTV9JRFg7IHh4KyspCisgICAgeworICAgICAgICBpZiAocF9zY2ItPnNlcnZfaGFuZGxlW3h4XSAhPSAwKQorICAgICAgICAgICAgaXNfY2xvc2VkID0gRkFMU0U7CisgICAgfQorCisgICAgcmV0dXJuIGlzX2Nsb3NlZDsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyoqCisqKiBGdW5jdGlvbiAgICAgICAgIGJ0YV9hZ19yZmNfZG9fb3BlbgorKioKKyoqIERlc2NyaXB0aW9uICAgICAgT3BlbiBhbiBSRkNPTU0gY29ubmVjdGlvbiB0byB0aGUgcGVlciBkZXZpY2UuCisqKgorKioKKyoqIFJldHVybnMgICAgICAgICAgdm9pZAorKioKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit2b2lkIGJ0YV9hZ19yZmNfZG9fb3Blbih0QlRBX0FHX1NDQiAqcF9zY2IsIHRCVEFfQUdfREFUQSAqcF9kYXRhKQoreworICAgIEJUTV9TZXRTZWN1cml0eUxldmVsKFRSVUUsICIiLCBidGFfYWdfc2VjX2lkW3Bfc2NiLT5jb25uX3NlcnZpY2VdLAorICAgICAgICBwX3NjYi0+Y2xpX3NlY19tYXNrLCBCVF9QU01fUkZDT01NLCBCVE1fU0VDX1BST1RPX1JGQ09NTSwgcF9zY2ItPnBlZXJfc2NuKTsKKworICAgIGlmIChSRkNPTU1fQ3JlYXRlQ29ubmVjdGlvbihidGFfYWdfdXVpZFtwX3NjYi0+Y29ubl9zZXJ2aWNlXSwgcF9zY2ItPnBlZXJfc2NuLAorICAgICAgICAgICAgRkFMU0UsIEJUQV9BR19NVFUsIHBfc2NiLT5wZWVyX2FkZHIsICYocF9zY2ItPmNvbm5faGFuZGxlKSwKKyAgICAgICAgICAgIGJ0YV9hZ19tZ210X2NiYWNrX3RibFtidGFfYWdfc2NiX3RvX2lkeChwX3NjYikgLSAxXSkgPT0gUE9SVF9TVUNDRVNTKQorICAgIHsKKyAgICAgICAgYnRhX2FnX3NldHVwX3BvcnQocF9zY2IsIHBfc2NiLT5jb25uX2hhbmRsZSk7CisgICAgICAgIEFQUExfVFJBQ0VfREVCVUcxKCJidGFfYWdfcmZjX2RvX29wZW4gOiBjb25uX2hhbmRsZSA9ICVkIiwgcF9zY2ItPmNvbm5faGFuZGxlKTsKKyAgICB9CisgICAgLyogUkZDT01NIGNyZWF0ZSBjb25uZWN0aW9uIGZhaWxlZDsgc2VuZCBvdXJzZWx2ZXMgUkZDT01NIGNsb3NlIGV2ZW50ICovCisgICAgZWxzZQorICAgIHsKKyAgICAgICAgYnRhX2FnX3NtX2V4ZWN1dGUocF9zY2IsIEJUQV9BR19SRkNfQ0xPU0VfRVZULCBwX2RhdGEpOworICAgIH0KK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyoqCisqKiBGdW5jdGlvbiAgICAgICAgIGJ0YV9hZ19yZmNfZG9fY2xvc2UKKyoqCisqKiBEZXNjcmlwdGlvbiAgICAgIENsb3NlIFJGQ09NTSBjb25uZWN0aW9uLgorKioKKyoqCisqKiBSZXR1cm5zICAgICAgICAgIHZvaWQKKyoqCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordm9pZCBidGFfYWdfcmZjX2RvX2Nsb3NlKHRCVEFfQUdfU0NCICpwX3NjYiwgdEJUQV9BR19EQVRBICpwX2RhdGEpCit7CisgICAgdEJUQV9BR19SRkMgICAgICpwX2J1ZjsKKyAgICBVTlVTRUQocF9kYXRhKTsKKworICAgIGlmIChwX3NjYi0+Y29ubl9oYW5kbGUpCisgICAgeworICAgICAgICBSRkNPTU1fUmVtb3ZlQ29ubmVjdGlvbihwX3NjYi0+Y29ubl9oYW5kbGUpOworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICAvKiBDbG9zZSBBUEkgd2FzIGNhbGxlZCB3aGlsZSBBRyBpcyBpbiBPcGVuaW5nIHN0YXRlLiAgICAgICAgICAgICAgICovCisgICAgICAgIC8qIE5lZWQgdG8gdHJpZ2dlciB0aGUgc3RhdGUgbWFjaGluZSB0byBzZW5kIGNhbGxiYWNrIHRvIHRoZSBhcHAgICAgKi8KKyAgICAgICAgLyogYW5kIG1vdmUgYmFjayB0byBJTklUIHN0YXRlLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAgICAgICBpZiAoKHBfYnVmID0gKHRCVEFfQUdfUkZDICopIEdLSV9nZXRidWYoc2l6ZW9mKHRCVEFfQUdfUkZDKSkpICE9IE5VTEwpCisgICAgICAgIHsKKyAgICAgICAgICAgIHBfYnVmLT5oZHIuZXZlbnQgPSBCVEFfQUdfUkZDX0NMT1NFX0VWVDsKKyAgICAgICAgICAgIHBfYnVmLT5oZHIubGF5ZXJfc3BlY2lmaWMgPSBidGFfYWdfc2NiX3RvX2lkeChwX3NjYik7CisgICAgICAgICAgICBidGFfc3lzX3NlbmRtc2cocF9idWYpOworICAgICAgICB9CisKKyAgICAgICAgLyogQ2FuY2VsIFNEUCBpZiBpdCBoYWQgYmVlbiBzdGFydGVkLiAqLworICAgICAgICAvKgorICAgICAgICBpZihwX3NjYi0+cF9kaXNjX2RiKQorICAgICAgICB7CisgICAgICAgICAgICAodm9pZClTRFBfQ2FuY2VsU2VydmljZVNlYXJjaCAocF9zY2ItPnBfZGlzY19kYik7CisgICAgICAgIH0KKyAgICAgICAgKi8KKyAgICB9CisKKyNpZmRlZiBfV0lOMzJfV0NFCisgICAgeworICAgICAgICAvKiBXaW5kb3dzIHZlcnNpb25zIG9mIFJGQ09NTSBkb2VzIE5PVCBnZW5lcmF0ZSBhIGNsb3NlZCBjYWxsYmFjayB3aGVuIHdlIGNsb3NlICovCisgICAgICAgIHRQT1JUX0NBTExCQUNLICpyZmNfbWdtdF9jYmFjayA9IGJ0YV9hZ19tZ210X2NiYWNrX3RibFtidGFfYWdfc2NiX3RvX2lkeChwX3NjYikgLSAxXTsKKworICAgICAgICBpZiAocmZjX21nbXRfY2JhY2spCisgICAgICAgIHsKKyAgICAgICAgICAgIChyZmNfbWdtdF9jYmFjaykoUE9SVF9DTE9TRUQsIHBfc2NiLT5jb25uX2hhbmRsZSk7CisgICAgICAgIH0KKyAgICB9CisjZW5kaWYKK30KKwpkaWZmIC0tZ2l0IGEvYnRhL2hmX2NsaWVudC9idGFfaGZfY2xpZW50X3Njby5jIGIvYnRhL2hmX2NsaWVudC9idGFfaGZfY2xpZW50X3Njby5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjg3ZDkxODgKLS0tIC9kZXYvbnVsbAorKysgYi9idGEvaGZfY2xpZW50L2J0YV9oZl9jbGllbnRfc2NvLmMKQEAgLTAsMCArMSwxNjc1IEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgorICogIENvcHlyaWdodCAoQykgMjAwNC0yMDEyIEJyb2FkY29tIENvcnBvcmF0aW9uCisgKgorICogIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQ6CisgKgorICogIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoKKyAqICBUaGlzIGZpbGUgY29udGFpbnMgZnVuY3Rpb25zIGZvciBtYW5hZ2luZyB0aGUgU0NPIGNvbm5lY3Rpb24gdXNlZCBpbiBBRy4KKyAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisjaW5jbHVkZSAiYnRhX2FwaS5oIgorI2luY2x1ZGUgImJ0YV9hZ19hcGkuaCIKKyNpbmNsdWRlICJidGFfYWdfY28uaCIKKyNpZiAoQlRNX1NDT19IQ0lfSU5DTFVERUQgPT0gVFJVRSApCisjaW5jbHVkZSAiYnRhX2RtX2NvLmgiCisjZW5kaWYKKyNpbmNsdWRlICJidGFfYWdfaW50LmgiCisjaW5jbHVkZSAiYnRtX2FwaS5oIgorI2luY2x1ZGUgImdraS5oIgorI2luY2x1ZGUgInV0bC5oIgorCisjaWZuZGVmIEJUQV9BR19TQ09fREVCVUcKKyNkZWZpbmUgQlRBX0FHX1NDT19ERUJVRyBGQUxTRQorI2VuZGlmCisKKyNpZm5kZWYgQlRBX0FHX0NPREVDX05FR09fVElNRU9VVAorI2RlZmluZSBCVEFfQUdfQ09ERUNfTkVHT19USU1FT1VUICAgMzAwMAorI2VuZGlmCisKKyNpZiBCVEFfQUdfU0NPX0RFQlVHID09IFRSVUUKK3N0YXRpYyBjaGFyICpidGFfYWdfc2NvX2V2dF9zdHIoVUlOVDggZXZlbnQpOworc3RhdGljIGNoYXIgKmJ0YV9hZ19zY29fc3RhdGVfc3RyKFVJTlQ4IHN0YXRlKTsKKyNlbmRpZgorCisjZGVmaW5lIEJUQV9BR19OT19FRFJfRVNDTyAgKEJUTV9TQ09fUEtUX1RZUEVTX01BU0tfTk9fMl9FVjMgfCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJUTV9TQ09fUEtUX1RZUEVTX01BU0tfTk9fM19FVjMgfCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJUTV9TQ09fUEtUX1RZUEVTX01BU0tfTk9fMl9FVjUgfCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJUTV9TQ09fUEtUX1RZUEVTX01BU0tfTk9fM19FVjUpCisKKy8qIHNjbyBldmVudHMgKi8KK2VudW0KK3sKKyAgICBCVEFfQUdfU0NPX0xJU1RFTl9FLCAgICAgICAgLyogbGlzdGVuIHJlcXVlc3QgKi8KKyAgICBCVEFfQUdfU0NPX09QRU5fRSwgICAgICAgICAgLyogb3BlbiByZXF1ZXN0ICovCisgICAgQlRBX0FHX1NDT19YRkVSX0UsICAgICAgICAgIC8qIHRyYW5zZmVyIHJlcXVlc3QgKi8KKyNpZiAoQlRNX1dCU19JTkNMVURFRCA9PSBUUlVFICkKKyAgICBCVEFfQUdfU0NPX0NOX0RPTkVfRSwgICAgICAgLyogY29kZWMgbmVnb3RpYXRpb24gZG9uZSAqLworICAgIEJUQV9BR19TQ09fUkVPUEVOX0UsICAgICAgICAvKiBSZXRyeSB3aXRoIG90aGVyIGNvZGVjIHdoZW4gZmFpbGVkICovCisjZW5kaWYKKyAgICBCVEFfQUdfU0NPX0NMT1NFX0UsICAgICAgICAgLyogY2xvc2UgcmVxdWVzdCAqLworICAgIEJUQV9BR19TQ09fU0hVVERPV05fRSwgICAgICAvKiBzaHV0ZG93biByZXF1ZXN0ICovCisgICAgQlRBX0FHX1NDT19DT05OX09QRU5fRSwgICAgIC8qIHNjbyBvcGVuICovCisgICAgQlRBX0FHX1NDT19DT05OX0NMT1NFX0UsICAgIC8qIHNjbyBjbG9zZWQgKi8KKyAgICBCVEFfQUdfU0NPX0NJX0RBVEFfRSAgICAgICAgLyogU0NPIGRhdGEgcmVhZHkgKi8KK307CisKKyNpZiAoQlRNX1dCU19JTkNMVURFRCA9PSBUUlVFICkKKyNkZWZpbmUgQlRBX0FHX05VTV9DT0RFQ1MgICAyCitzdGF0aWMgY29uc3QgdEJUTV9FU0NPX1BBUkFNUyBidGFfYWdfZXNjb19wYXJhbXNbQlRBX0FHX05VTV9DT0RFQ1NdID0KK3sKKyAgICAvKiBDVlNEICovCisgICAgeworICAgICAgICBCVE1fNjRLQklUU19SQVRFLCAgICAgICAgICAgICAgICAgICAvKiBUWCBCYW5kd2lkdGggKDY0IGtiaXRzL3NlYykgICAgICAgICAgICAgICovCisgICAgICAgIEJUTV82NEtCSVRTX1JBVEUsICAgICAgICAgICAgICAgICAgIC8qIFJYIEJhbmR3aWR0aCAoNjQga2JpdHMvc2VjKSAgICAgICAgICAgICAgKi8KKyAgICAgICAgMHgwMDBhLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogMTAgbXMgKEhTL0hGIGNhbiB1c2UgRVYzLCAyLUVWMywgMy1FVjMpICAqLworICAgICAgICBCVE1fVk9JQ0VfU0VUVElOR19DVlNELCAgICAgICAgICAgICAvKiBJbnAgTGluZWFyLCBBaXIgQ1ZTRCwgMnMgQ29tcCwgMTZiaXQgICAgICovCisgICAgICAgKEJUTV9TQ09fUEtUX1RZUEVTX01BU0tfSFYxICAgICAgKyAgLyogUGFja2V0IFR5cGVzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAgICAgICBCVE1fU0NPX1BLVF9UWVBFU19NQVNLX0hWMiAgICAgICsKKyAgICAgICAgQlRNX1NDT19QS1RfVFlQRVNfTUFTS19IVjMgICAgICArCisgICAgICAgIEJUTV9TQ09fUEtUX1RZUEVTX01BU0tfRVYzICAgICAgKworICAgICAgICBCVE1fU0NPX1BLVF9UWVBFU19NQVNLX0VWNCAgICAgICsKKyAgICAgICAgQlRNX1NDT19QS1RfVFlQRVNfTUFTS19FVjUgICAgICArCisgICAgICAgIEJUTV9TQ09fUEtUX1RZUEVTX01BU0tfTk9fMl9FVjUgKworICAgICAgICBCVE1fU0NPX1BLVF9UWVBFU19NQVNLX05PXzNfRVY1KSwKKyAgICAgICAgQlRNX0VTQ09fUkVUUkFOU19QT1dFUiAgICAgICAvKiBSZXRyYW5zbWlzc2lvbiBlZmZvcnQgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgICB9LAorICAgIC8qIG1TQkMgKi8KKyAgICB7CisgICAgICAgIEJUTV82NEtCSVRTX1JBVEUsICAgICAgICAgICAgICAgICAgIC8qIFRYIEJhbmR3aWR0aCAoNjQga2JpdHMvc2VjKSwgODAwMCAgICAgICAgKi8KKyAgICAgICAgQlRNXzY0S0JJVFNfUkFURSwgICAgICAgICAgICAgICAgICAgLyogUlggQmFuZHdpZHRoICg2NCBrYml0cy9zZWMpLCA4MDAwICAgICAgICAqLworICAgICAgICAxMywgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiAxMyBtcyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgICAgICAgIEJUTV9WT0lDRV9TRVRUSU5HX1RSQU5TLCAgICAgICAgICAgIC8qIElucCBMaW5lYXIsIFRyYW5zcGFyZW50LCAycyBDb21wLCAxNmJpdCAgKi8KKyAgICAgICAoQlRNX1NDT19QS1RfVFlQRVNfTUFTS19FVjMgICAgICB8ICAgLyogUGFja2V0IFR5cGVzIDogRVYzICsgMi1FVjMgICAgICAgICAgICAgICAqLworICAgICAgICBCVE1fU0NPX1BLVF9UWVBFU19NQVNLX05PXzNfRVYzIHwKKyAgICAgICAgQlRNX1NDT19QS1RfVFlQRVNfTUFTS19OT18yX0VWNSB8CisgICAgICAgIEJUTV9TQ09fUEtUX1RZUEVTX01BU0tfTk9fM19FVjUpLAorICAgICAgICBCVE1fRVNDT19SRVRSQU5TX1FVQUxJVFkgICAgICAgLyogUmV0cmFuc21pc3Npb24gZWZmb3J0ICAgICAgICAgICAgICAgICAgICAgICovCisgICAgfQorfTsKKyNlbHNlCitzdGF0aWMgY29uc3QgdEJUTV9FU0NPX1BBUkFNUyBidGFfYWdfZXNjb19wYXJhbXMgPQoreworICAgIEJUTV82NEtCSVRTX1JBVEUsICAgICAgICAgICAgICAgICAgIC8qIFRYIEJhbmR3aWR0aCAoNjQga2JpdHMvc2VjKSAgICAgICAgICAgICAgKi8KKyAgICBCVE1fNjRLQklUU19SQVRFLCAgICAgICAgICAgICAgICAgICAvKiBSWCBCYW5kd2lkdGggKDY0IGtiaXRzL3NlYykgICAgICAgICAgICAgICovCisgICAgMHgwMDBhLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogMTAgbXMgKEhTL0hGIGNhbiB1c2UgRVYzLCAyLUVWMywgMy1FVjMpICAqLworICAgIDB4MDA2MCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIElucCBMaW5lYXIsIEFpciBDVlNELCAycyBDb21wLCAxNmJpdCAgICAgKi8KKyAgICAoQlRNX1NDT19QS1RfVFlQRVNfTUFTS19IVjEgICAgICArICAvKiBQYWNrZXQgVHlwZXMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgICAgIEJUTV9TQ09fUEtUX1RZUEVTX01BU0tfSFYyICAgICAgKworICAgICBCVE1fU0NPX1BLVF9UWVBFU19NQVNLX0hWMyAgICAgICsKKyAgICAgQlRNX1NDT19QS1RfVFlQRVNfTUFTS19FVjMgICAgICArCisgICAgIEJUTV9TQ09fUEtUX1RZUEVTX01BU0tfRVY0ICAgICAgKworICAgICBCVE1fU0NPX1BLVF9UWVBFU19NQVNLX0VWNSAgICAgICsKKyAgICAgQlRNX1NDT19QS1RfVFlQRVNfTUFTS19OT18yX0VWNSArCisgICAgIEJUTV9TQ09fUEtUX1RZUEVTX01BU0tfTk9fM19FVjUpLAorICAgICBCVE1fRVNDT19SRVRSQU5TX1BPV0VSICAgICAgIC8qIFJldHJhbnNtaXNzaW9uIGVmZm9ydCAgICAgICAgICAgICAgICAgICAgICAqLworfTsKKyNlbmRpZgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorKioKKyoqIEZ1bmN0aW9uICAgICAgICAgYnRhX2FnX3Njb19jb25uX2NiYWNrCisqKgorKiogRGVzY3JpcHRpb24gICAgICBCVE0gU0NPIGNvbm5lY3Rpb24gY2FsbGJhY2suCisqKgorKioKKyoqIFJldHVybnMgICAgICAgICAgdm9pZAorKioKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitzdGF0aWMgdm9pZCBidGFfYWdfc2NvX2Nvbm5fY2JhY2soVUlOVDE2IHNjb19pZHgpCit7CisgICAgVUlOVDE2ICBoYW5kbGU7CisgICAgQlRfSERSICAqcF9idWY7CisgICAgdEJUQV9BR19TQ0IgKnBfc2NiOworCisgICAgLyogbWF0Y2ggY2FsbGJhY2sgdG8gc2NiOyBmaXJzdCBjaGVjayBjdXJyZW50IHNjbyBzY2IgKi8KKyAgICBpZiAoYnRhX2FnX2NiLnNjby5wX2N1cnJfc2NiICE9IE5VTEwgJiYgYnRhX2FnX2NiLnNjby5wX2N1cnJfc2NiLT5pbl91c2UpCisgICAgeworICAgICAgICBoYW5kbGUgPSBidGFfYWdfc2NiX3RvX2lkeChidGFfYWdfY2Iuc2NvLnBfY3Vycl9zY2IpOworICAgIH0KKyAgICAvKiB0aGVuIGNoZWNrIGZvciBzY2IgY29ubmVjdGVkIHRvIHRoaXMgcGVlciAqLworICAgIGVsc2UKKyAgICB7CisgICAgICAgIC8qIENoZWNrIGlmIFNMQyBpcyB1cCAqLworICAgICAgICBoYW5kbGUgPSBidGFfYWdfaWR4X2J5X2JkYWRkcihCVE1fUmVhZFNjb0JkQWRkcihzY29faWR4KSk7CisgICAgICAgIHBfc2NiID0gYnRhX2FnX3NjYl9ieV9pZHgoaGFuZGxlKTsKKyAgICAgICAgaWYocF9zY2IgJiYgIXBfc2NiLT5zdmNfY29ubikKKyAgICAgICAgICAgIGhhbmRsZSA9IDA7CisgICAgfQorCisgICAgaWYgKGhhbmRsZSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKChwX2J1ZiA9IChCVF9IRFIgKikgR0tJX2dldGJ1ZihzaXplb2YoQlRfSERSKSkpICE9IE5VTEwpCisgICAgICAgIHsKKyAgICAgICAgICAgIHBfYnVmLT5ldmVudCA9IEJUQV9BR19TQ09fT1BFTl9FVlQ7CisgICAgICAgICAgICBwX2J1Zi0+bGF5ZXJfc3BlY2lmaWMgPSBoYW5kbGU7CisgICAgICAgICAgICBidGFfc3lzX3NlbmRtc2cocF9idWYpOworICAgICAgICB9CisgICAgfQorICAgIC8qIG5vIG1hdGNoIGZvdW5kOyBkaXNjb25uZWN0IHNjbywgaW5pdCBzY28gdmFyaWFibGVzICovCisgICAgZWxzZQorICAgIHsKKyAgICAgICAgYnRhX2FnX2NiLnNjby5wX2N1cnJfc2NiID0gTlVMTDsKKyAgICAgICAgYnRhX2FnX2NiLnNjby5zdGF0ZSA9IEJUQV9BR19TQ09fU0hVVERPV05fU1Q7CisgICAgICAgIEJUTV9SZW1vdmVTY28oc2NvX2lkeCk7CisgICAgfQorfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorKioKKyoqIEZ1bmN0aW9uICAgICAgICAgYnRhX2FnX3Njb19kaXNjX2NiYWNrCisqKgorKiogRGVzY3JpcHRpb24gICAgICBCVE0gU0NPIGRpc2Nvbm5lY3Rpb24gY2FsbGJhY2suCisqKgorKioKKyoqIFJldHVybnMgICAgICAgICAgdm9pZAorKioKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitzdGF0aWMgdm9pZCBidGFfYWdfc2NvX2Rpc2NfY2JhY2soVUlOVDE2IHNjb19pZHgpCit7CisgICAgQlRfSERSICAqcF9idWY7CisgICAgVUlOVDE2ICBoYW5kbGUgPSAwOworCisgICAgQVBQTF9UUkFDRV9ERUJVRzMgKCJidGFfYWdfc2NvX2Rpc2NfY2JhY2soKTogc2NvX2lkeDogMHgleCAgcF9jdXJfc2NiOiAweCUwOHggIHNjby5zdGF0ZTogJWQiLCBzY29faWR4LCBidGFfYWdfY2Iuc2NvLnBfY3Vycl9zY2IsIGJ0YV9hZ19jYi5zY28uc3RhdGUpOworCisgICAgQVBQTF9UUkFDRV9ERUJVRzQgKCJidGFfYWdfc2NvX2Rpc2NfY2JhY2soKTogc2NiWzBdIGFkZHI6IDB4JTA4eCAgaW5fdXNlOiAldSAgc2NvX2lkeDogMHgleCAgc2NvIHN0YXRlOiAldSIsCisgICAgICAgICAgICAgICAgICAgICAgICZidGFfYWdfY2Iuc2NiWzBdLCBidGFfYWdfY2Iuc2NiWzBdLmluX3VzZSwgYnRhX2FnX2NiLnNjYlswXS5zY29faWR4LCBidGFfYWdfY2Iuc2NiWzBdLnN0YXRlKTsKKyAgICBBUFBMX1RSQUNFX0RFQlVHNCAoImJ0YV9hZ19zY29fZGlzY19jYmFjaygpOiBzY2JbMV0gYWRkcjogMHglMDh4ICBpbl91c2U6ICV1ICBzY29faWR4OiAweCV4ICBzY28gc3RhdGU6ICV1IiwKKyAgICAgICAgICAgICAgICAgICAgICAgJmJ0YV9hZ19jYi5zY2JbMV0sIGJ0YV9hZ19jYi5zY2JbMV0uaW5fdXNlLCBidGFfYWdfY2Iuc2NiWzFdLnNjb19pZHgsIGJ0YV9hZ19jYi5zY2JbMV0uc3RhdGUpOworCisgICAgLyogbWF0Y2ggY2FsbGJhY2sgdG8gc2NiICovCisgICAgaWYgKGJ0YV9hZ19jYi5zY28ucF9jdXJyX3NjYiAhPSBOVUxMICYmIGJ0YV9hZ19jYi5zY28ucF9jdXJyX3NjYi0+aW5fdXNlKQorICAgIHsKKyAgICAgICAgLyogV2Ugb25seSBjYXJlIGFib3V0IGNhbGxiYWNrcyBmb3IgdGhlIGFjdGl2ZSBTQ08gKi8KKyAgICAgICAgaWYgKGJ0YV9hZ19jYi5zY28ucF9jdXJyX3NjYi0+c2NvX2lkeCAhPSBzY29faWR4KQorICAgICAgICB7CisgICAgICAgICAgICBpZiAoYnRhX2FnX2NiLnNjby5wX2N1cnJfc2NiLT5zY29faWR4ICE9IDB4RkZGRikKKyAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKyAgICAgICAgaGFuZGxlICA9IGJ0YV9hZ19zY2JfdG9faWR4KGJ0YV9hZ19jYi5zY28ucF9jdXJyX3NjYik7CisgICAgfQorCisgICAgaWYgKGhhbmRsZSAhPSAwKQorICAgIHsKKyNpZiAoQlRNX1NDT19IQ0lfSU5DTFVERUQgPT0gVFJVRSApCisgICAgICAgIHRCVE1fU1RBVFVTIHN0YXR1cyA9IEJUTV9Db25maWdTY29QYXRoKEJUTV9TQ09fUk9VVEVfUENNLCBOVUxMLCBOVUxMLCBUUlVFKTsKKyAgICAgICAgQVBQTF9UUkFDRV9ERUJVRzEoImJ0YV9hZ19zY29fZGlzY19jYmFjayBzY28gY2xvc2UgY29uZmlnIHN0YXR1cyA9ICVkIiwgc3RhdHVzKTsKKwkgICAgLyogU0NPIGNsZWFuIHVwIGhlcmUgKi8KKyAgICAgICAgYnRhX2RtX3Njb19jb19jbG9zZSgpOworI2VuZGlmCisKKyNpZiAoQlRNX1dCU19JTkNMVURFRCA9PSBUUlVFICkKKyAgICAgICAgLyogUmVzdG9yZSBzZXR0aW5ncyAqLworICAgICAgICBpZihidGFfYWdfY2Iuc2NvLnBfY3Vycl9zY2ItPmludXNlX2NvZGVjID09IEJUQV9BR19DT0RFQ19NU0JDKQorICAgICAgICB7CisgICAgICAgICAgICBCVE1fU2V0V0JTQ29kZWMgKEJUTV9TQ09fQ09ERUNfTk9ORSk7CisgICAgICAgICAgICBCVE1fV3JpdGVWb2ljZVNldHRpbmdzIChCVE1fVk9JQ0VfU0VUVElOR19DVlNEKTsKKworICAgICAgICAgICAgLyogSWYgU0NPIG9wZW4gd2FzIGluaXRpYXRlZCBieSBBRyBhbmQgZmFpbGVkIGZvciBtU0JDLCB0cnkgQ1ZTRCBhZ2Fpbi4gKi8KKyAgICAgICAgICAgIGlmIChidGFfYWdfc2NvX2lzX29wZW5pbmcgKGJ0YV9hZ19jYi5zY28ucF9jdXJyX3NjYikpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgYnRhX2FnX2NiLnNjby5wX2N1cnJfc2NiLT5jb2RlY19mYWxsYmFjayA9IFRSVUU7CisgICAgICAgICAgICAgICAgQVBQTF9UUkFDRV9ERUJVRzAoIkZhbGxiYWNrIHRvIENWU0QiKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIGJ0YV9hZ19jYi5zY28ucF9jdXJyX3NjYi0+aW51c2VfY29kZWMgPSBCVEFfQUdfQ09ERUNfTk9ORTsKKyNlbmRpZgorCisgICAgICAgIGlmICgocF9idWYgPSAoQlRfSERSICopIEdLSV9nZXRidWYoc2l6ZW9mKEJUX0hEUikpKSAhPSBOVUxMKQorICAgICAgICB7CisgICAgICAgICAgICBwX2J1Zi0+ZXZlbnQgPSBCVEFfQUdfU0NPX0NMT1NFX0VWVDsKKyAgICAgICAgICAgIHBfYnVmLT5sYXllcl9zcGVjaWZpYyA9IGhhbmRsZTsKKyAgICAgICAgICAgIGJ0YV9zeXNfc2VuZG1zZyhwX2J1Zik7CisgICAgICAgIH0KKyAgICB9CisgICAgLyogbm8gbWF0Y2ggZm91bmQgKi8KKyAgICBlbHNlCisgICAgeworICAgICAgICBBUFBMX1RSQUNFX0RFQlVHMCgibm8gc2NiIGZvciBhZ19zY29fZGlzY19jYmFjayIpOworCisgICAgICAgIC8qIHNjbyBjb3VsZCBiZSBjbG9zZWQgYWZ0ZXIgc2NiIGRlYWxsb2MnZWQgKi8KKyAgICAgICAgaWYgKGJ0YV9hZ19jYi5zY28ucF9jdXJyX3NjYiAhPSBOVUxMKQorICAgICAgICB7CisgICAgICAgICAgICBidGFfYWdfY2Iuc2NvLnBfY3Vycl9zY2ItPnNjb19pZHggPSBCVE1fSU5WQUxJRF9TQ09fSU5ERVg7CisgICAgICAgICAgICBidGFfYWdfY2Iuc2NvLnBfY3Vycl9zY2IgPSBOVUxMOworICAgICAgICAgICAgYnRhX2FnX2NiLnNjby5zdGF0ZSA9IEJUQV9BR19TQ09fU0hVVERPV05fU1Q7CisgICAgICAgIH0KKyAgICB9Cit9CisjaWYgKEJUTV9TQ09fSENJX0lOQ0xVREVEID09IFRSVUUgKQorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyoqCisqKiBGdW5jdGlvbiAgICAgICAgIGJ0YV9hZ19zY29fcmVhZF9jYmFjaworKioKKyoqIERlc2NyaXB0aW9uICAgICAgQ2FsbGJhY2sgZnVuY3Rpb24gaXMgdGhlIGNhbGxiYWNrIGZ1bmN0aW9uIGZvciBpbmNvbWluZworKiogICAgICAgICAgICAgICAgICBTQ08gZGF0YSBvdmVyIEhDSS4KKyoqCisqKiBSZXR1cm5zICAgICAgICAgIHZvaWQKKyoqCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworc3RhdGljIHZvaWQgYnRhX2FnX3Njb19yZWFkX2NiYWNrIChVSU5UMTYgc2NvX2lueCwgQlRfSERSICpwX2RhdGEsIHRCVE1fU0NPX0RBVEFfRkxBRyBzdGF0dXMpCit7CisgICAgaWYgKHN0YXR1cyAhPSBCVE1fU0NPX0RBVEFfQ09SUkVDVCkKKyAgICB7CisgICAgICAgIEFQUExfVFJBQ0VfREVCVUcxKCJidGFfYWdfc2NvX3JlYWRfY2JhY2s6IHN0YXR1cyglZCkiLCBzdGF0dXMpOworICAgIH0KKworICAgIC8qIENhbGxvdXQgZnVuY3Rpb24gbXVzdCBmcmVlIHRoZSBkYXRhLiAqLworICAgIGJ0YV9kbV9zY29fY29faW5fZGF0YSAocF9kYXRhLCBzdGF0dXMpOworfQorI2VuZGlmCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorKioKKyoqIEZ1bmN0aW9uICAgICAgICAgYnRhX2FnX3JlbW92ZV9zY28KKyoqCisqKiBEZXNjcmlwdGlvbiAgICAgIFJlbW92ZXMgdGhlIHNwZWNpZmllZCBTQ08gZnJvbSB0aGUgc3lzdGVtLgorKiogICAgICAgICAgICAgICAgICBJZiBvbmx5X2FjdGl2ZSBpcyBUUlVFLCB0aGVuIFNDTyBpcyBvbmx5IHJlbW92ZWQgaWYgY29ubmVjdGVkCisqKgorKiogUmV0dXJucyAgICAgICAgICBCT09MRUFOICAgLSBUUlVFIGlmIFNjbyByZW1vdmFsIHdhcyBzdGFydGVkCisqKgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3N0YXRpYyBCT09MRUFOIGJ0YV9hZ19yZW1vdmVfc2NvKHRCVEFfQUdfU0NCICpwX3NjYiwgQk9PTEVBTiBvbmx5X2FjdGl2ZSkKK3sKKyAgICBCT09MRUFOICAgICByZW1vdmVkX3N0YXJ0ZWQgPSBGQUxTRTsKKyAgICB0QlRNX1NUQVRVUwlzdGF0dXM7CisKKyAgICBpZiAocF9zY2ItPnNjb19pZHggIT0gQlRNX0lOVkFMSURfU0NPX0lOREVYKQorICAgIHsKKyAgICAgICAgaWYgKCFvbmx5X2FjdGl2ZSB8fCBwX3NjYi0+c2NvX2lkeCA9PSBidGFfYWdfY2Iuc2NvLmN1cl9pZHgpCisgICAgICAgIHsKKyAgICAgICAgICAgIHN0YXR1cyA9IEJUTV9SZW1vdmVTY28ocF9zY2ItPnNjb19pZHgpOworCisgICAgICAgICAgICBBUFBMX1RSQUNFX0RFQlVHMigiYWcgcmVtb3ZlIHNjbzogaW54IDB4JTA0eCwgc3RhdHVzOjB4JXgiLCBwX3NjYi0+c2NvX2lkeCwgc3RhdHVzKTsKKworICAgICAgICAgICAgaWYgKHN0YXR1cyA9PSBCVE1fQ01EX1NUQVJURUQpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgLyogU2NvIGlzIGNvbm5lY3RlZDsgc2V0IGN1cnJlbnQgY29udHJvbCBibG9jayAqLworICAgICAgICAgICAgICAgIGJ0YV9hZ19jYi5zY28ucF9jdXJyX3NjYiA9IHBfc2NiOworCisgICAgICAgICAgICAgICAgcmVtb3ZlZF9zdGFydGVkID0gVFJVRTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIC8qIElmIG5vIGNvbm5lY3Rpb24gcmVzZXQgdGhlIHNjbyBoYW5kbGUgKi8KKyAgICAgICAgICAgIGVsc2UgaWYgKCAoc3RhdHVzID09IEJUTV9TVUNDRVNTKSB8fCAoc3RhdHVzID09IEJUTV9VTktOT1dOX0FERFIpICkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBwX3NjYi0+c2NvX2lkeCA9IEJUTV9JTlZBTElEX1NDT19JTkRFWDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gcmVtb3ZlZF9zdGFydGVkOworfQorCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisqKgorKiogRnVuY3Rpb24gICAgICAgICBidGFfYWdfZXNjb19jb25ucmVxX2NiYWNrCisqKgorKiogRGVzY3JpcHRpb24gICAgICBCVE0gZVNDTyBjb25uZWN0aW9uIHJlcXVlc3RzIGFuZCBlU0NPIGNoYW5nZSByZXF1ZXN0cworKiogICAgICAgICAgICAgICAgICBPbmx5IHRoZSBjb25uZWN0aW9uIHJlcXVlc3RzIGFyZSBwcm9jZXNzZWQgYnkgQlRBLgorKioKKyoqIFJldHVybnMgICAgICAgICAgdm9pZAorKioKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitzdGF0aWMgdm9pZCBidGFfYWdfZXNjb19jb25ucmVxX2NiYWNrKHRCVE1fRVNDT19FVlQgZXZlbnQsIHRCVE1fRVNDT19FVlRfREFUQSAqcF9kYXRhKQoreworICAgIHRCVEFfQUdfU0NCICAgICAgICAgKnBfc2NiOworICAgIFVJTlQxNiAgICAgICAgICAgICAgIGhhbmRsZTsKKyAgICBVSU5UMTYgICAgICAgICAgICAgICBzY29faW54ID0gcF9kYXRhLT5jb25uX2V2dC5zY29faW54OworCisgICAgLyogT25seSBwcm9jZXNzIGNvbm5lY3Rpb24gcmVxdWVzdHMgKi8KKyAgICBpZiAoZXZlbnQgPT0gQlRNX0VTQ09fQ09OTl9SRVFfRVZUKQorICAgIHsKKyAgICAgICAgaWYgKChoYW5kbGUgPSBidGFfYWdfaWR4X2J5X2JkYWRkcihCVE1fUmVhZFNjb0JkQWRkcihzY29faW54KSkpICE9IDAgJiYKKyAgICAgICAgICAgICgocF9zY2IgPSBidGFfYWdfc2NiX2J5X2lkeChoYW5kbGUpKSAhPSBOVUxMKSAmJiBwX3NjYi0+c3ZjX2Nvbm4pCisgICAgICAgIHsKKyAgICAgICAgICAgIHBfc2NiLT5zY29faWR4ID0gc2NvX2lueDsKKworICAgICAgICAgICAgLyogSWYgbm8gb3RoZXIgU0NPIGFjdGl2ZSwgYWxsb3cgdGhpcyBvbmUgKi8KKyAgICAgICAgICAgIGlmICghYnRhX2FnX2NiLnNjby5wX2N1cnJfc2NiKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIEFQUExfVFJBQ0VfRVZFTlQxKCJidGFfYWdfZXNjb19jb25ucmVxX2NiYWNrOiBBY2NlcHQgQ29ubiBSZXF1ZXN0IChzY29faW54IDB4JTA0eCkiLCBzY29faW54KTsKKyAgICAgICAgICAgICAgICBidGFfYWdfc2NvX2Nvbm5fcnNwKHBfc2NiLCAmcF9kYXRhLT5jb25uX2V2dCk7CisKKyAgICAgICAgICAgICAgICBidGFfYWdfY2Iuc2NvLnN0YXRlID0gQlRBX0FHX1NDT19PUEVOSU5HX1NUOworICAgICAgICAgICAgICAgIGJ0YV9hZ19jYi5zY28ucF9jdXJyX3NjYiA9IHBfc2NiOworICAgICAgICAgICAgICAgIGJ0YV9hZ19jYi5zY28uY3VyX2lkeCA9IHBfc2NiLT5zY29faWR4OworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZSAgICAvKiBCZWdpbiBhIHRyYW5zZmVyOiBDbG9zZSBjdXJyZW50IFNDTyBiZWZvcmUgcmVzcG9uZGluZyAqLworICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIEFQUExfVFJBQ0VfREVCVUcwKCJidGFfYWdfZXNjb19jb25ucmVxX2NiYWNrOiBCZWdpbiBYRkVSIik7CisgICAgICAgICAgICAgICAgYnRhX2FnX2NiLnNjby5wX3hmZXJfc2NiID0gcF9zY2I7CisgICAgICAgICAgICAgICAgYnRhX2FnX2NiLnNjby5jb25uX2RhdGEgPSBwX2RhdGEtPmNvbm5fZXZ0OworICAgICAgICAgICAgICAgIGJ0YV9hZ19jYi5zY28uc3RhdGUgPSBCVEFfQUdfU0NPX09QRU5fWEZFUl9TVDsKKworICAgICAgICAgICAgICAgIGlmICghYnRhX2FnX3JlbW92ZV9zY28oYnRhX2FnX2NiLnNjby5wX2N1cnJfc2NiLCBUUlVFKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIEFQUExfVFJBQ0VfRVJST1IxKCJidGFfYWdfZXNjb19jb25ucmVxX2NiYWNrOiBOb3RoaW5nIHRvIHJlbW92ZSBzbyBhY2NlcHQgQ29ubiBSZXF1ZXN0IChzY29faW54IDB4JTA0eCkiLCBzY29faW54KTsKKyAgICAgICAgICAgICAgICAgICAgYnRhX2FnX2NiLnNjby5wX3hmZXJfc2NiID0gTlVMTDsKKyAgICAgICAgICAgICAgICAgICAgYnRhX2FnX2NiLnNjby5zdGF0ZSA9IEJUQV9BR19TQ09fTElTVEVOX1NUOworCisgICAgICAgICAgICAgICAgICAgIGJ0YV9hZ19zY29fY29ubl9yc3AocF9zY2IsICZwX2RhdGEtPmNvbm5fZXZ0KTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgLyogSWYgZXJyb3Igb2NjdXJyZWQgc2VuZCByZWplY3QgcmVzcG9uc2UgaW1tZWRpYXRlbHkgKi8KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBBUFBMX1RSQUNFX1dBUk5JTkcwKCJubyBzY2IgZm9yIGJ0YV9hZ19lc2NvX2Nvbm5yZXFfY2JhY2sgb3Igbm8gcmVzb3VyY2VzIik7CisgICAgICAgICAgICBCVE1fRVNjb0Nvbm5Sc3AocF9kYXRhLT5jb25uX2V2dC5zY29faW54LCBIQ0lfRVJSX0hPU1RfUkVKRUNUX1JFU09VUkNFUywgTlVMTCk7CisgICAgICAgIH0KKyAgICB9CisgICAgLyogUmVjZWl2ZWQgYSBjaGFuZ2UgaW4gdGhlIGVzY28gbGluayAqLworICAgIGVsc2UgaWYgKGV2ZW50ID09IEJUTV9FU0NPX0NIR19FVlQpCisgICAgeworICAgICAgICBBUFBMX1RSQUNFX0VWRU5UNSgiZVNDTyBjaGFuZ2UgZXZlbnQgKGlueCAlZCk6IHJ0cmFucyAlZCwgcnhsZW4gJWQsIHR4bGVuICVkLCB0eGludCAlZCIsCisgICAgICAgICAgICBwX2RhdGEtPmNoZ19ldnQuc2NvX2lueCwKKyAgICAgICAgICAgIHBfZGF0YS0+Y2hnX2V2dC5yZXRyYW5zX3dpbmRvdywgcF9kYXRhLT5jaGdfZXZ0LnJ4X3BrdF9sZW4sCisgICAgICAgICAgICBwX2RhdGEtPmNoZ19ldnQudHhfcGt0X2xlbiwgcF9kYXRhLT5jaGdfZXZ0LnR4X2ludGVydmFsKTsKKyAgICB9Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisqKgorKiogRnVuY3Rpb24gICAgICAgICBidGFfYWdfY2JhY2tfc2NvCisqKgorKiogRGVzY3JpcHRpb24gICAgICBDYWxsIGFwcGxpY2F0aW9uIGNhbGxiYWNrIGZ1bmN0aW9uIHdpdGggU0NPIGV2ZW50LgorKioKKyoqCisqKiBSZXR1cm5zICAgICAgICAgIHZvaWQKKyoqCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworc3RhdGljIHZvaWQgYnRhX2FnX2NiYWNrX3Njbyh0QlRBX0FHX1NDQiAqcF9zY2IsIFVJTlQ4IGV2ZW50KQoreworICAgIHRCVEFfQUdfSERSICAgIHNjbzsKKworICAgIHNjby5oYW5kbGUgPSBidGFfYWdfc2NiX3RvX2lkeChwX3NjYik7CisgICAgc2NvLmFwcF9pZCA9IHBfc2NiLT5hcHBfaWQ7CisKKyAgICAvKiBjYWxsIGNsb3NlIGNiYWNrICovCisgICAgKCpidGFfYWdfY2IucF9jYmFjaykoZXZlbnQsICh0QlRBX0FHICopICZzY28pOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorKioKKyoqIEZ1bmN0aW9uICAgICAgICAgYnRhX2FnX2NyZWF0ZV9zY28KKyoqCisqKiBEZXNjcmlwdGlvbgorKioKKyoqCisqKiBSZXR1cm5zICAgICAgICAgIHZvaWQKKyoqCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworc3RhdGljIHZvaWQgYnRhX2FnX2NyZWF0ZV9zY28odEJUQV9BR19TQ0IgKnBfc2NiLCBCT09MRUFOIGlzX29yaWcpCit7CisgICAgdEJUTV9TVEFUVVMgICAgICAgc3RhdHVzOworICAgIFVJTlQ4ICAgICAgICAgICAgKnBfYmRfYWRkciA9IE5VTEw7CisgICAgdEJUTV9FU0NPX1BBUkFNUyBwYXJhbXM7CisjaWYgKEJUTV9XQlNfSU5DTFVERUQgPT0gVFJVRSApCisgICAgdEJUQV9BR19QRUVSX0NPREVDICBlc2NvX2NvZGVjID0gQlRNX1NDT19DT0RFQ19DVlNEOworICAgIGludCBjb2RlY19pbmRleCA9IDA7CisjZW5kaWYKKyNpZiAoQlRNX1NDT19IQ0lfSU5DTFVERUQgPT0gVFJVRSApCisgICAgdEJUTV9TQ09fUk9VVEVfVFlQRSBzY29fcm91dGU7CisgICAgdEJUQV9DT0RFQ19JTkZPICAgICBjb2RlY19pbmZvID0ge0JUQV9TQ09fQ09ERUNfUENNfTsKKyAgICBVSU5UMzIgICAgICAgICAgICAgIHBjbV9zYW1wbGVfcmF0ZTsKKyNlbmRpZgorCisgICAgLyogTWFrZSBzdXJlIHRoaXMgc2NvIGhhbmRsZSBpcyBub3QgYWxyZWFkeSBpbiB1c2UgKi8KKyAgICBpZiAocF9zY2ItPnNjb19pZHggIT0gQlRNX0lOVkFMSURfU0NPX0lOREVYKQorICAgIHsKKyAgICAgICAgQVBQTF9UUkFDRV9XQVJOSU5HMSgiYnRhX2FnX2NyZWF0ZV9zY286IEluZGV4IDB4JTA0eCBBbHJlYWR5IEluIFVzZSEiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwX3NjYi0+c2NvX2lkeCk7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyNpZiAoQlRNX1dCU19JTkNMVURFRCA9PSBUUlVFICkKKyAgICBpZiAoKHBfc2NiLT5zY29fY29kZWMgPT0gQlRNX1NDT19DT0RFQ19NU0JDKSAmJgorICAgICAgICAhcF9zY2ItPmNvZGVjX2ZhbGxiYWNrICYmCisgICAgICAgICFwX3NjYi0+cmV0cnlfd2l0aF9zY29fb25seSkKKyAgICAgICAgZXNjb19jb2RlYyA9IEJUTV9TQ09fQ09ERUNfTVNCQzsKKworICAgIGlmIChwX3NjYi0+Y29kZWNfZmFsbGJhY2spCisgICAgeworICAgICAgICBwX3NjYi0+Y29kZWNfZmFsbGJhY2sgPSBGQUxTRTsKKworICAgICAgICAvKiBGb3JjZSBBRyB0byBzZW5kICtCQ1MgZm9yIHRoZSBuZXh0IGF1ZGlvIGNvbm5lY3Rpb24uICovCisgICAgICAgIHBfc2NiLT5jb2RlY191cGRhdGVkID0gVFJVRTsKKyAgICB9CisKKyAgICBpZiAoZXNjb19jb2RlYyA9PSBCVE1fU0NPX0NPREVDX01TQkMpCisgICAgICAgIGNvZGVjX2luZGV4ID0gZXNjb19jb2RlYyAtIDE7CisKKyAgICBwYXJhbXMgPSBidGFfYWdfZXNjb19wYXJhbXNbY29kZWNfaW5kZXhdOworI2Vsc2UKKyAgICBwYXJhbXMgPSBidGFfYWdfZXNjb19wYXJhbXM7CisjZW5kaWYKKworICAgIGlmKGJ0YV9hZ19jYi5zY28ucGFyYW1fdXBkYXRlZCkgLyogSWYgd2UgZG8gbm90IHVzZSB0aGUgZGVmYXVsdCBwYXJhbWV0ZXJzICovCisgICAgICAgIHBhcmFtcyA9IGJ0YV9hZ19jYi5zY28ucGFyYW1zOworCisgICAgaWYoIWJ0YV9hZ19jYi5zY28ucGFyYW1fdXBkYXRlZCkKKyAgICB7CisjaWYgKEJUTV9XQlNfSU5DTFVERUQgPT0gVFJVRSkKKyAgICAgICAgaWYgKCFjb2RlY19pbmRleCkgICAvKiBGb3Igbm9uLVdCUyAqLworI2VuZGlmCisgICAgICAgIHsKKyAgICAgICAgICAgIC8qIFVzZSB0aGUgYXBwbGljYXRpb24gcGFja2V0IHR5cGVzICg1IHNsb3QgRVYgcGFja2V0cyBub3QgYWxsb3dlZCkgKi8KKyAgICAgICAgICAgIHBhcmFtcy5wYWNrZXRfdHlwZXMgPSBwX2J0YV9hZ19jZmctPnNjb19wa3RfdHlwZXMgICAgIHwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCVE1fU0NPX1BLVF9UWVBFU19NQVNLX05PXzJfRVY1IHwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCVE1fU0NPX1BLVF9UWVBFU19NQVNLX05PXzNfRVY1OworICAgICAgICB9CisgICAgfQorCisgICAgLyogaWYgaW5pdGlhdGluZyBzZXQgY3VycmVudCBzY2IgYW5kIHBlZXIgYmQgYWRkciAqLworICAgIGlmIChpc19vcmlnKQorICAgIHsKKyAgICAgICAgLyogQXR0ZW1wdCB0byB1c2UgZVNDTyBpZiByZW1vdGUgaG9zdCBzdXBwb3J0cyBIRlAgPj0gMS41ICovCisgICAgICAgIC8qIE5lZWQgdG8gZmluZCBvdXQgZnJvbSBTSUcgaWYgSFNQIGNhbiB1c2UgZVNDTzsgZm9yIG5vdyB1c2UgU0NPICovCisgICAgICAgIGlmIChwX3NjYi0+Y29ubl9zZXJ2aWNlID09IEJUQV9BR19IRlAgJiYgcF9zY2ItPnBlZXJfdmVyc2lvbiA+PSBIRlBfVkVSU0lPTl8xXzUgJiYgIXBfc2NiLT5yZXRyeV93aXRoX3Njb19vbmx5KQorICAgICAgICB7CisKKyAgICAgICAgICAgIEJUTV9TZXRFU2NvTW9kZShCVE1fTElOS19UWVBFX0VTQ08sICZwYXJhbXMpOworICAgICAgICAgICAgLyogSWYgRVNDTyBvciBFRFIgRVNDTywgcmV0cnkgd2l0aCBTQ08gb25seSBpbiBjYXNlIG9mIGZhaWx1cmUgKi8KKyAgICAgICAgICAgIGlmKChwYXJhbXMucGFja2V0X3R5cGVzICYgQlRNX0VTQ09fTElOS19PTkxZX01BU0spCisgICAgICAgICAgICAgICB8fCEoKHBhcmFtcy5wYWNrZXRfdHlwZXMgJiB+KEJUTV9FU0NPX0xJTktfT05MWV9NQVNLIHwgQlRNX1NDT19MSU5LX09OTFlfTUFTSykpIF4gQlRBX0FHX05PX0VEUl9FU0NPKSkKKyAgICAgICAgICAgIHsKKyNpZiAoQlRNX1dCU19JTkNMVURFRCA9PSBUUlVFICkKKyAgICAgICAgICAgICAgICBpZiAoZXNjb19jb2RlYyAhPSBCVEFfQUdfQ09ERUNfTVNCQykKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHBfc2NiLT5yZXRyeV93aXRoX3Njb19vbmx5ID0gVFJVRTsKKyAgICAgICAgICAgICAgICAgICAgQVBQTF9UUkFDRV9BUEkwKCJTZXR0aW5nIHJldHJ5X3dpdGhfc2NvX29ubHkgdG8gVFJVRSIpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBlbHNlICAgIC8qIERvIG5vdCB1c2UgU0NPIHdoZW4gdXNpbmcgbVNCQyAqLworICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcF9zY2ItPnJldHJ5X3dpdGhfc2NvX29ubHkgPSBGQUxTRTsKKyAgICAgICAgICAgICAgICAgICAgQVBQTF9UUkFDRV9BUEkwKCJTZXR0aW5nIHJldHJ5X3dpdGhfc2NvX29ubHkgdG8gRkFMU0UiKTsKKyAgICAgICAgICAgICAgICB9CisjZWxzZQorICAgICAgICAgICAgICAgIHBfc2NiLT5yZXRyeV93aXRoX3Njb19vbmx5ID0gVFJVRTsKKyAgICAgICAgICAgICAgICBBUFBMX1RSQUNFX0FQSTAoIlNldHRpbmcgcmV0cnlfd2l0aF9zY29fb25seSB0byBUUlVFIik7CisjZW5kaWYKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmKHBfc2NiLT5yZXRyeV93aXRoX3Njb19vbmx5KQorICAgICAgICAgICAgICAgIEFQUExfVFJBQ0VfQVBJMCgicmV0cnlpbmcgd2l0aCBTQ08gb25seSIpOworICAgICAgICAgICAgcF9zY2ItPnJldHJ5X3dpdGhfc2NvX29ubHkgPSBGQUxTRTsKKworICAgICAgICAgICAgQlRNX1NldEVTY29Nb2RlKEJUTV9MSU5LX1RZUEVfU0NPLCAmcGFyYW1zKTsKKyAgICAgICAgfQorCisgICAgICAgIGJ0YV9hZ19jYi5zY28ucF9jdXJyX3NjYiA9IHBfc2NiOworCisgICAgICAgIC8qIHRlbGwgc3lzIHRvIHN0b3AgYXYgaWYgYW55ICovCisgICAgICAgIGJ0YV9zeXNfc2NvX3VzZShCVEFfSURfQUcsIHBfc2NiLT5hcHBfaWQsIHBfc2NiLT5wZWVyX2FkZHIpOworCisgICAgICAgIC8qIEFsbG93IGFueSBwbGF0Zm9ybSBzcGVjaWZpYyBwcmUtU0NPIHNldCB1cCB0byB0YWtlIHBsYWNlICovCisgICAgICAgIGJ0YV9hZ19jb19hdWRpb19zdGF0ZShidGFfYWdfc2NiX3RvX2lkeChwX3NjYiksIHBfc2NiLT5hcHBfaWQsIEJUQV9BR19DT19BVURfU1RBVEVfU0VUVVApOworCisjaWYgKEJUTV9TQ09fSENJX0lOQ0xVREVEID09IFRSVUUgKQorI2lmIChCVE1fV0JTX0lOQ0xVREVEID09IFRSVUUpCisgICAgICAgIGlmIChlc2NvX2NvZGVjID09IEJUQV9BR19DT0RFQ19NU0JDKQorICAgICAgICAgICAgcGNtX3NhbXBsZV9yYXRlID0gQlRBX0RNX1NDT19TQU1QX1JBVEVfMTZLOworICAgICAgICBlbHNlCisjZW5kaWYKKyAgICAgICAgICAgIHBjbV9zYW1wbGVfcmF0ZSA9IEJUQV9ETV9TQ09fU0FNUF9SQVRFXzhLOworCisgICAgICAgIHNjb19yb3V0ZSA9IGJ0YV9kbV9zY29fY29faW5pdChwY21fc2FtcGxlX3JhdGUsIHBjbV9zYW1wbGVfcmF0ZSwgJmNvZGVjX2luZm8sIHBfc2NiLT5hcHBfaWQpOworI2VuZGlmCisKKyNpZiAoQlRNX1dCU19JTkNMVURFRCA9PSBUUlVFICkKKyAgICAgICAgaWYgKGVzY29fY29kZWMgPT0gQlRBX0FHX0NPREVDX01TQkMpCisgICAgICAgIHsKKyAgICAgICAgICAgIC8qIEVuYWJsZSBtU0JDIGNvZGVjIGluIGZ3ICovCisgICAgICAgICAgICBCVE1fU2V0V0JTQ29kZWMgKGVzY29fY29kZWMpOworICAgICAgICB9CisKKyAgICAgICAgLyogU3BlY2lmeSBQQ00gaW5wdXQgZm9yIFNCQyBjb2RlYyBpbiBmdyAqLworICAgICAgICBCVE1fQ29uZmlnSTJTUENNIChlc2NvX2NvZGVjLCAoVUlOVDgpSENJX0JSQ01fSTJTUENNX0lTX0RFRkFVTFRfUk9MRSwgKFVJTlQ4KUhDSV9CUkNNX0kyU1BDTV9TQU1QTEVfREVGQVVMVCwgKFVJTlQ4KUhDSV9CUkNNX0kyU1BDTV9DTE9DS19ERUZBVUxUKTsKKworICAgICAgICAvKiBUaGlzIHNldHRpbmcgbWF5IG5vdCBiZSBuZWNlc3NhcnkgKi8KKyAgICAgICAgLyogVG8gYmUgdmVyaWZpZWQgd2l0aCBzdGFibGUgMjA0OSBib2FyZHMgKi8KKyAgICAgICAgaWYgKGVzY29fY29kZWMgPT0gQlRBX0FHX0NPREVDX01TQkMpCisgICAgICAgICAgICBCVE1fV3JpdGVWb2ljZVNldHRpbmdzIChCVE1fVk9JQ0VfU0VUVElOR19UUkFOUyk7CisgICAgICAgIGVsc2UKKyAgICAgICAgICAgIEJUTV9Xcml0ZVZvaWNlU2V0dGluZ3MgKEJUTV9WT0lDRV9TRVRUSU5HX0NWU0QpOworCisgICAgICAgIC8qIHNhdmUgdGhlIGN1cnJlbnQgY29kZWMgYmVjYXVzZSBzY29fY29kZWMgY2FuIGJlIHVwZGF0ZWQgd2hpbGUgU0NPIGlzIG9wZW4uICovCisgICAgICAgIHBfc2NiLT5pbnVzZV9jb2RlYyA9IGVzY29fY29kZWM7CisjZW5kaWYKKworI2lmIChCVE1fU0NPX0hDSV9JTkNMVURFRCA9PSBUUlVFICkKKyAgICAgICAgLyogaW5pdGlhbGl6ZSBTQ08gc2V0dXAsIG5vIHZvaWNlIHNldHRpbmcgZm9yIEFHLCBkYXRhIHJhdGUgPD09PiBzYW1wbGUgcmF0ZSAqLworICAgICAgICBCVE1fQ29uZmlnU2NvUGF0aChzY29fcm91dGUsIGJ0YV9hZ19zY29fcmVhZF9jYmFjaywgTlVMTCwgVFJVRSk7CisjZW5kaWYKKyAgICAgICAgYnRhX2FnX2NiLnNjby5jdXJfaWR4ID0gcF9zY2ItPnNjb19pZHg7CisgICAgfQorICAgIGVsc2UKKyAgICAgICAgcF9zY2ItPnJldHJ5X3dpdGhfc2NvX29ubHkgPSBGQUxTRTsKKworICAgIHBfYmRfYWRkciA9IHBfc2NiLT5wZWVyX2FkZHI7CisKKyAgICBzdGF0dXMgPSBCVE1fQ3JlYXRlU2NvKHBfYmRfYWRkciwgaXNfb3JpZywgcGFyYW1zLnBhY2tldF90eXBlcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICZwX3NjYi0+c2NvX2lkeCwgYnRhX2FnX3Njb19jb25uX2NiYWNrLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgYnRhX2FnX3Njb19kaXNjX2NiYWNrKTsKKyAgICBpZiAoc3RhdHVzID09IEJUTV9DTURfU1RBUlRFRCkKKyAgICB7CisgICAgICAgIGlmICghaXNfb3JpZykKKyAgICAgICAgeworICAgICAgICAgICAgQlRNX1JlZ0ZvckVTY29FdnRzKHBfc2NiLT5zY29faWR4LCBidGFfYWdfZXNjb19jb25ucmVxX2NiYWNrKTsKKyAgICAgICAgfQorICAgICAgICBlbHNlICAgIC8qIEluaXRpYXRpbmcgdGhlIGNvbm5lY3Rpb24sIHNldCB0aGUgY3VycmVudCBzY28gaGFuZGxlICovCisgICAgICAgIHsKKyAgICAgICAgICAgIGJ0YV9hZ19jYi5zY28uY3VyX2lkeCA9IHBfc2NiLT5zY29faWR4OworICAgICAgICB9CisgICAgfQorCisgICAgQVBQTF9UUkFDRV9BUEk0KCJhZyBjcmVhdGUgc2NvOiBvcmlnICVkLCBpbnggMHglMDR4LCBzdGF0dXMgMHgleCwgcGt0IHR5cGVzIDB4JTA0eCIsCisgICAgICAgICAgICAgICAgICAgICAgaXNfb3JpZywgcF9zY2ItPnNjb19pZHgsIHN0YXR1cywgcGFyYW1zLnBhY2tldF90eXBlcyk7Cit9CisKKyNpZiAoQlRNX1dCU19JTkNMVURFRCA9PSBUUlVFICkKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisqKgorKiogRnVuY3Rpb24gICAgICAgICBidGFfYWdfY25fdGltZXJfY2JhY2sKKyoqCisqKiBEZXNjcmlwdGlvbgorKioKKyoqCisqKiBSZXR1cm5zICAgICAgICAgIHZvaWQKKyoqCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworc3RhdGljIHZvaWQgYnRhX2FnX2NuX3RpbWVyX2NiYWNrIChUSU1FUl9MSVNUX0VOVCAqcF90bGUpCit7CisgICAgdEJUQV9BR19TQ0IgKnBfc2NiOworCisgICAgaWYgKHBfdGxlKQorICAgIHsKKyAgICAgICAgcF9zY2IgPSAodEJUQV9BR19TQ0IgKilwX3RsZS0+cGFyYW07CisKKyAgICAgICAgaWYgKHBfc2NiKQorICAgICAgICB7CisgICAgICAgICAgICAvKiBBbm5vdW5jZSB0aGF0IGNvZGVjIG5lZ290aWF0aW9uIGZhaWxlZC4gKi8KKyAgICAgICAgICAgIGJ0YV9hZ19zY29fY29kZWNfbmVnbyhwX3NjYiwgRkFMU0UpOworCisgICAgICAgICAgICAvKiBjYWxsIGFwcCBjYWxsYmFjayAqLworICAgICAgICAgICAgYnRhX2FnX2NiYWNrX3NjbyhwX3NjYiwgQlRBX0FHX0FVRElPX0NMT1NFX0VWVCk7CisgICAgICAgIH0KKyAgICB9Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisqKgorKiogRnVuY3Rpb24gICAgICAgICBidGFfYWdfY29kZWNfbmVnb3RpYXRlCisqKgorKiogRGVzY3JpcHRpb24gICAgICBJbml0aWF0ZSBjb2RlYyBuZWdvdGlhdGlvbiBieSBzZW5kaW5nIEFUIGNvbW1hbmQuCisqKiAgICAgICAgICAgICAgICAgIElmIG5vdCBuZWNlc3NhcnksIHNraXAgbmVnb3RpYXRpb24uCisqKgorKiogUmV0dXJucyAgICAgICAgICB2b2lkCisqKgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3ZvaWQgYnRhX2FnX2NvZGVjX25lZ290aWF0ZSh0QlRBX0FHX1NDQiAqcF9zY2IpCit7CisgICAgYnRhX2FnX2NiLnNjby5wX2N1cnJfc2NiID0gcF9zY2I7CisKKyAgICBpZiAocF9zY2ItPmNvZGVjX3VwZGF0ZWQgfHwgcF9zY2ItPmNvZGVjX2ZhbGxiYWNrKQorICAgIHsKKyAgICAgICAgLyogQ2hhbmdlIHRoZSBwb3dlciBtb2RlIHRvIEFjdGl2ZSB1bnRpbCBzY28gb3BlbiBpcyBjb21wbGV0ZWQuICovCisgICAgICAgIGJ0YV9zeXNfYnVzeShCVEFfSURfQUcsIHBfc2NiLT5hcHBfaWQsIHBfc2NiLT5wZWVyX2FkZHIpOworCisgICAgICAgIC8qIFNlbmQgK0JDUyB0byB0aGUgcGVlciAqLworICAgICAgICBidGFfYWdfc2VuZF9iY3MocF9zY2IsIE5VTEwpOworCisgICAgICAgIC8qIFN0YXJ0IHRpbWVyIHRvIGhhbmRsZSB0aW1lb3V0ICovCisgICAgICAgIHBfc2NiLT5jbl90aW1lci5wX2NiYWNrID0gKFRJTUVSX0NCQUNLKikmYnRhX2FnX2NuX3RpbWVyX2NiYWNrOworICAgICAgICBwX3NjYi0+Y25fdGltZXIucGFyYW0gPSAoSU5UMzIpcF9zY2I7CisgICAgICAgIGJ0YV9zeXNfc3RhcnRfdGltZXIoJnBfc2NiLT5jbl90aW1lciwgMCwgQlRBX0FHX0NPREVDX05FR09fVElNRU9VVCk7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgIC8qIHVzZSBzYW1lIGNvZGVjIHR5cGUgYXMgcHJldmlvdXMgU0NPIGNvbm5lY3Rpb24sIHNraXAgY29kZWMgbmVnb3RpYXRpb24gKi8KKyAgICAgICAgYnRhX2FnX3Njb19jb2RlY19uZWdvKHBfc2NiLCBUUlVFKTsKKyAgICB9Cit9CisjZW5kaWYKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyoqCisqKiBGdW5jdGlvbiAgICAgICAgIGJ0YV9hZ19zY29fZXZlbnQKKyoqCisqKiBEZXNjcmlwdGlvbgorKioKKyoqCisqKiBSZXR1cm5zICAgICAgICAgIHZvaWQKKyoqCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworc3RhdGljIHZvaWQgYnRhX2FnX3Njb19ldmVudCh0QlRBX0FHX1NDQiAqcF9zY2IsIFVJTlQ4IGV2ZW50KQoreworICAgIHRCVEFfQUdfU0NPX0NCICpwX3NjbyA9ICZidGFfYWdfY2Iuc2NvOworI2lmIChCVE1fV0JTX0lOQ0xVREVEID09IFRSVUUgKQorICAgIHRCVEFfQUdfU0NCICpwX2NuX3NjYiA9IE5VTEw7ICAgLyogRm9yIGNvZGVjIG5lZ290aWF0aW9uICovCisjZW5kaWYKKyNpZiAoQlRNX1NDT19IQ0lfSU5DTFVERUQgPT0gVFJVRSApCisgICAgQlRfSERSICAqcF9idWY7CisjZW5kaWYKKyNpZiBCVEFfQUdfU0NPX0RFQlVHID09IFRSVUUKKyAgICBVSU5UOCAgIGluX3N0YXRlID0gcF9zY28tPnN0YXRlOworCisgICAgQVBQTF9UUkFDRV9FVkVOVDUoIkJUQSBhZyBzY28gZXZ0IChoZGwgMHglMDR4KTogU3RhdGUgJWQgKCVzKSwgRXZlbnQgJWQgKCVzKSIsCisgICAgICAgICAgICAgICAgICAgICAgICBwX3NjYi0+c2NvX2lkeCwKKyAgICAgICAgICAgICAgICAgICAgICAgIHBfc2NvLT5zdGF0ZSwgYnRhX2FnX3Njb19zdGF0ZV9zdHIocF9zY28tPnN0YXRlKSwKKyAgICAgICAgICAgICAgICAgICAgICAgIGV2ZW50LCBidGFfYWdfc2NvX2V2dF9zdHIoZXZlbnQpKTsKKyNlbHNlCisgICAgQVBQTF9UUkFDRV9FVkVOVDMoIkJUQSBhZyBzY28gZXZ0IChoZGwgMHglMDR4KTogU3RhdGUgJWQsIEV2ZW50ICVkIiwKKyAgICAgICAgICAgICAgICAgICAgICBwX3NjYi0+c2NvX2lkeCwgcF9zY28tPnN0YXRlLCBldmVudCk7CisjZW5kaWYKKworI2lmIChCVE1fU0NPX0hDSV9JTkNMVURFRCA9PSBUUlVFICkKKyAgICBpZiAoZXZlbnQgPT0gQlRBX0FHX1NDT19DSV9EQVRBX0UpCisgICAgeworICAgICAgICB3aGlsZSAoVFJVRSkKKyAgICAgICAgeworICAgICAgICAgICAgYnRhX2RtX3Njb19jb19vdXRfZGF0YSgmcF9idWYpOworICAgICAgICAgICAgaWYgKHBfYnVmKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmIChwX3Njby0+c3RhdGUgPT0gQlRBX0FHX1NDT19PUEVOX1NUKQorICAgICAgICAgICAgICAgICAgICBCVE1fV3JpdGVTY29EYXRhKHBfc2NvLT5wX2N1cnJfc2NiLT5zY29faWR4LCBwX2J1Zik7CisgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICBHS0lfZnJlZWJ1ZihwX2J1Zik7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKworICAgICAgICByZXR1cm47CisgICAgfQorI2VuZGlmCisKKyAgICBzd2l0Y2ggKHBfc2NvLT5zdGF0ZSkKKyAgICB7CisgICAgICAgIGNhc2UgQlRBX0FHX1NDT19TSFVURE9XTl9TVDoKKyAgICAgICAgICAgIHN3aXRjaCAoZXZlbnQpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgY2FzZSBCVEFfQUdfU0NPX0xJU1RFTl9FOgorICAgICAgICAgICAgICAgICAgICAvKiBjcmVhdGUgc2NvIGxpc3RlbiBjb25uZWN0aW9uICovCisgICAgICAgICAgICAgICAgICAgIGJ0YV9hZ19jcmVhdGVfc2NvKHBfc2NiLCBGQUxTRSk7CisgICAgICAgICAgICAgICAgICAgIHBfc2NvLT5zdGF0ZSA9IEJUQV9BR19TQ09fTElTVEVOX1NUOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgICAgIEFQUExfVFJBQ0VfV0FSTklORzEoIkJUQV9BR19TQ09fU0hVVERPV05fU1Q6IElnbm9yaW5nIGV2ZW50ICVkIiwgZXZlbnQpOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgIGNhc2UgQlRBX0FHX1NDT19MSVNURU5fU1Q6CisgICAgICAgICAgICBzd2l0Y2ggKGV2ZW50KQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGNhc2UgQlRBX0FHX1NDT19MSVNURU5fRToKKyAgICAgICAgICAgICAgICAgICAgLyogY3JlYXRlIHNjbyBsaXN0ZW4gY29ubmVjdGlvbiAoQWRkaXRpb25hbCBjaGFubmVsKSAqLworICAgICAgICAgICAgICAgICAgICBidGFfYWdfY3JlYXRlX3NjbyhwX3NjYiwgRkFMU0UpOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgICAgICAgIGNhc2UgQlRBX0FHX1NDT19PUEVOX0U6CisgICAgICAgICAgICAgICAgICAgIC8qIHJlbW92ZSBsaXN0ZW5pbmcgY29ubmVjdGlvbiAqLworICAgICAgICAgICAgICAgICAgICBidGFfYWdfcmVtb3ZlX3NjbyhwX3NjYiwgRkFMU0UpOworCisjaWYgKEJUTV9XQlNfSU5DTFVERUQgPT0gVFJVRSApCisgICAgICAgICAgICAgICAgICAgIC8qIHN0YXJ0IGNvZGVjIG5lZ290aWF0aW9uICovCisgICAgICAgICAgICAgICAgICAgIHBfc2NvLT5zdGF0ZSA9IEJUQV9BR19TQ09fQ09ERUNfU1Q7CisgICAgICAgICAgICAgICAgICAgIHBfY25fc2NiID0gcF9zY2I7CisjZWxzZQorICAgICAgICAgICAgICAgICAgICAvKiBjcmVhdGUgc2NvIGNvbm5lY3Rpb24gdG8gcGVlciAqLworICAgICAgICAgICAgICAgICAgICBidGFfYWdfY3JlYXRlX3NjbyhwX3NjYiwgVFJVRSk7CisgICAgICAgICAgICAgICAgICAgIHBfc2NvLT5zdGF0ZSA9IEJUQV9BR19TQ09fT1BFTklOR19TVDsKKyNlbmRpZgorICAgICAgICAgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgICAgICAgIGNhc2UgQlRBX0FHX1NDT19TSFVURE9XTl9FOgorICAgICAgICAgICAgICAgICAgICAvKiByZW1vdmUgbGlzdGVuaW5nIGNvbm5lY3Rpb24gKi8KKyAgICAgICAgICAgICAgICAgICAgYnRhX2FnX3JlbW92ZV9zY28ocF9zY2IsIEZBTFNFKTsKKworICAgICAgICAgICAgICAgICAgICBpZiAocF9zY2IgPT0gcF9zY28tPnBfY3Vycl9zY2IpCisgICAgICAgICAgICAgICAgICAgICAgICBwX3Njby0+cF9jdXJyX3NjYiA9IE5VTEw7CisKKyAgICAgICAgICAgICAgICAgICAgLyogSWYgbGFzdCBTQ08gaW5zdGFuY2UgdGhlbiBmaW5pc2ggc2h1dHRpbmcgZG93biAqLworICAgICAgICAgICAgICAgICAgICBpZiAoIWJ0YV9hZ19vdGhlcl9zY2Jfb3BlbihwX3NjYikpCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHBfc2NvLT5zdGF0ZSA9IEJUQV9BR19TQ09fU0hVVERPV05fU1Q7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICAgICAgICBjYXNlIEJUQV9BR19TQ09fQ0xPU0VfRToKKyAgICAgICAgICAgICAgICAgICAgLyogcmVtb3ZlIGxpc3RlbmluZyBjb25uZWN0aW9uICovCisgICAgICAgICAgICAgICAgICAgIC8qIElnbm9yZSB0aGUgZXZlbnQuIFdlIG5lZWQgdG8ga2VlcCBsaXN0ZW5pbmcgU0NPIGZvciB0aGUgYWN0aXZlIFNMQyAqLworICAgICAgICAgICAgICAgICAgICBBUFBMX1RSQUNFX1dBUk5JTkcxKCJCVEFfQUdfU0NPX0xJU1RFTl9TVDogSWdub3JpbmcgZXZlbnQgJWQiLCBldmVudCk7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgICAgICAgY2FzZSBCVEFfQUdfU0NPX0NPTk5fQ0xPU0VfRToKKyAgICAgICAgICAgICAgICAgICAgLyogc2NvIGZhaWxlZDsgY3JlYXRlIHNjbyBsaXN0ZW4gY29ubmVjdGlvbiAqLworICAgICAgICAgICAgICAgICAgICBidGFfYWdfY3JlYXRlX3NjbyhwX3NjYiwgRkFMU0UpOworICAgICAgICAgICAgICAgICAgICBwX3Njby0+c3RhdGUgPSBCVEFfQUdfU0NPX0xJU1RFTl9TVDsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgICAgICBBUFBMX1RSQUNFX1dBUk5JTkcxKCJCVEFfQUdfU0NPX0xJU1RFTl9TVDogSWdub3JpbmcgZXZlbnQgJWQiLCBldmVudCk7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisKKyNpZiAoQlRNX1dCU19JTkNMVURFRCA9PSBUUlVFICkKKyAgICAgICAgY2FzZSBCVEFfQUdfU0NPX0NPREVDX1NUOgorICAgICAgICAgICAgc3dpdGNoIChldmVudCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBjYXNlIEJUQV9BR19TQ09fTElTVEVOX0U6CisgICAgICAgICAgICAgICAgICAgIC8qIGNyZWF0ZSBzY28gbGlzdGVuIGNvbm5lY3Rpb24gKEFkZGl0aW9uYWwgY2hhbm5lbCkgKi8KKyAgICAgICAgICAgICAgICAgICAgYnRhX2FnX2NyZWF0ZV9zY28ocF9zY2IsIEZBTFNFKTsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICAgICAgICBjYXNlIEJUQV9BR19TQ09fQ05fRE9ORV9FOgorICAgICAgICAgICAgICAgICAgICAvKiBjcmVhdGUgc2NvIGNvbm5lY3Rpb24gdG8gcGVlciAqLworICAgICAgICAgICAgICAgICAgICBidGFfYWdfY3JlYXRlX3NjbyhwX3NjYiwgVFJVRSk7CisgICAgICAgICAgICAgICAgICAgIHBfc2NvLT5zdGF0ZSA9IEJUQV9BR19TQ09fT1BFTklOR19TVDsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICAgICAgICBjYXNlIEJUQV9BR19TQ09fWEZFUl9FOgorICAgICAgICAgICAgICAgICAgICAvKiBzYXZlIHhmZXIgc2NiICovCisgICAgICAgICAgICAgICAgICAgIHBfc2NvLT5wX3hmZXJfc2NiID0gcF9zY2I7CisgICAgICAgICAgICAgICAgICAgIHBfc2NvLT5zdGF0ZSA9IEJUQV9BR19TQ09fQ0xPU0VfWEZFUl9TVDsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICAgICAgICBjYXNlIEJUQV9BR19TQ09fU0hVVERPV05fRToKKyAgICAgICAgICAgICAgICAgICAgLyogcmVtb3ZlIGxpc3RlbmluZyBjb25uZWN0aW9uICovCisgICAgICAgICAgICAgICAgICAgIGJ0YV9hZ19yZW1vdmVfc2NvKHBfc2NiLCBGQUxTRSk7CisKKyAgICAgICAgICAgICAgICAgICAgaWYgKHBfc2NiID09IHBfc2NvLT5wX2N1cnJfc2NiKQorICAgICAgICAgICAgICAgICAgICAgICAgcF9zY28tPnBfY3Vycl9zY2IgPSBOVUxMOworCisgICAgICAgICAgICAgICAgICAgIC8qIElmIGxhc3QgU0NPIGluc3RhbmNlIHRoZW4gZmluaXNoIHNodXR0aW5nIGRvd24gKi8KKyAgICAgICAgICAgICAgICAgICAgaWYgKCFidGFfYWdfb3RoZXJfc2NiX29wZW4ocF9zY2IpKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBwX3Njby0+c3RhdGUgPSBCVEFfQUdfU0NPX1NIVVRET1dOX1NUOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgICAgICAgY2FzZSBCVEFfQUdfU0NPX0NMT1NFX0U6CisgICAgICAgICAgICAgICAgICAgIC8qIHNjbyBvcGVuIGlzIG5vdCBzdGFydGVkIHlldC4ganVzdCBnbyBiYWNrIHRvIGxpc3RlbmluZyAqLworICAgICAgICAgICAgICAgICAgICBwX3Njby0+c3RhdGUgPSBCVEFfQUdfU0NPX0xJU1RFTl9TVDsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICAgICAgICBjYXNlIEJUQV9BR19TQ09fQ09OTl9DTE9TRV9FOgorICAgICAgICAgICAgICAgICAgICAvKiBzY28gZmFpbGVkOyBjcmVhdGUgc2NvIGxpc3RlbiBjb25uZWN0aW9uICovCisgICAgICAgICAgICAgICAgICAgIGJ0YV9hZ19jcmVhdGVfc2NvKHBfc2NiLCBGQUxTRSk7CisgICAgICAgICAgICAgICAgICAgIHBfc2NvLT5zdGF0ZSA9IEJUQV9BR19TQ09fTElTVEVOX1NUOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgICAgIEFQUExfVFJBQ0VfV0FSTklORzEoIkJUQV9BR19TQ09fQ09ERUNfU1Q6IElnbm9yaW5nIGV2ZW50ICVkIiwgZXZlbnQpOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworI2VuZGlmCisKKyAgICAgICAgY2FzZSBCVEFfQUdfU0NPX09QRU5JTkdfU1Q6CisgICAgICAgICAgICBzd2l0Y2ggKGV2ZW50KQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGNhc2UgQlRBX0FHX1NDT19MSVNURU5fRToKKyAgICAgICAgICAgICAgICAgICAgLyogc2Vjb25kIGhlYWRzZXQgaGFzIG5vdyBqb2luZWQgKi8KKyAgICAgICAgICAgICAgICAgICAgLyogY3JlYXRlIHNjbyBsaXN0ZW4gY29ubmVjdGlvbiAoQWRkaXRpb25hbCBjaGFubmVsKSAqLworICAgICAgICAgICAgICAgICAgICBpZiAocF9zY2IgIT0gcF9zY28tPnBfY3Vycl9zY2IpCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJ0YV9hZ19jcmVhdGVfc2NvKHBfc2NiLCBGQUxTRSk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisKKyNpZiAoQlRNX1dCU19JTkNMVURFRCA9PSBUUlVFKQorICAgICAgICAgICAgICAgIGNhc2UgQlRBX0FHX1NDT19SRU9QRU5fRToKKyAgICAgICAgICAgICAgICAgICAgLyogc3RhcnQgY29kZWMgbmVnb3RpYXRpb24gKi8KKyAgICAgICAgICAgICAgICAgICAgcF9zY28tPnN0YXRlID0gQlRBX0FHX1NDT19DT0RFQ19TVDsKKyAgICAgICAgICAgICAgICAgICAgcF9jbl9zY2IgPSBwX3NjYjsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisjZW5kaWYKKworICAgICAgICAgICAgICAgIGNhc2UgQlRBX0FHX1NDT19YRkVSX0U6CisgICAgICAgICAgICAgICAgICAgIC8qIHNhdmUgeGZlciBzY2IgKi8KKyAgICAgICAgICAgICAgICAgICAgcF9zY28tPnBfeGZlcl9zY2IgPSBwX3NjYjsKKyAgICAgICAgICAgICAgICAgICAgcF9zY28tPnN0YXRlID0gQlRBX0FHX1NDT19DTE9TRV9YRkVSX1NUOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgICAgICAgIGNhc2UgQlRBX0FHX1NDT19DTE9TRV9FOgorICAgICAgICAgICAgICAgICAgICBwX3Njby0+c3RhdGUgPSBCVEFfQUdfU0NPX09QRU5fQ0xfU1Q7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgICAgICAgY2FzZSBCVEFfQUdfU0NPX1NIVVRET1dOX0U6CisgICAgICAgICAgICAgICAgICAgIC8qIElmIG5vdCBvcGVuaW5nIHNjYiwganVzdCBjbG9zZSBpdCAqLworICAgICAgICAgICAgICAgICAgICBpZiAocF9zY2IgIT0gcF9zY28tPnBfY3Vycl9zY2IpCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIC8qIHJlbW92ZSBsaXN0ZW5pbmcgY29ubmVjdGlvbiAqLworICAgICAgICAgICAgICAgICAgICAgICAgYnRhX2FnX3JlbW92ZV9zY28ocF9zY2IsIEZBTFNFKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgICAgICBwX3Njby0+c3RhdGUgPSBCVEFfQUdfU0NPX1NIVVRUSU5HX1NUOworCisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgICAgICAgY2FzZSBCVEFfQUdfU0NPX0NPTk5fT1BFTl9FOgorICAgICAgICAgICAgICAgICAgICBwX3Njby0+c3RhdGUgPSBCVEFfQUdfU0NPX09QRU5fU1Q7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgICAgICAgY2FzZSBCVEFfQUdfU0NPX0NPTk5fQ0xPU0VfRToKKyAgICAgICAgICAgICAgICAgICAgLyogc2NvIGZhaWxlZDsgY3JlYXRlIHNjbyBsaXN0ZW4gY29ubmVjdGlvbiAqLworICAgICAgICAgICAgICAgICAgICBidGFfYWdfY3JlYXRlX3NjbyhwX3NjYiwgRkFMU0UpOworICAgICAgICAgICAgICAgICAgICBwX3Njby0+c3RhdGUgPSBCVEFfQUdfU0NPX0xJU1RFTl9TVDsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgICAgICBBUFBMX1RSQUNFX1dBUk5JTkcxKCJCVEFfQUdfU0NPX09QRU5JTkdfU1Q6IElnbm9yaW5nIGV2ZW50ICVkIiwgZXZlbnQpOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgIGNhc2UgQlRBX0FHX1NDT19PUEVOX0NMX1NUOgorICAgICAgICAgICAgc3dpdGNoIChldmVudCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBjYXNlIEJUQV9BR19TQ09fWEZFUl9FOgorICAgICAgICAgICAgICAgICAgICAvKiBzYXZlIHhmZXIgc2NiICovCisgICAgICAgICAgICAgICAgICAgIHBfc2NvLT5wX3hmZXJfc2NiID0gcF9zY2I7CisKKyAgICAgICAgICAgICAgICAgICAgcF9zY28tPnN0YXRlID0gQlRBX0FHX1NDT19DTE9TRV9YRkVSX1NUOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgICAgICAgIGNhc2UgQlRBX0FHX1NDT19PUEVOX0U6CisgICAgICAgICAgICAgICAgICAgIHBfc2NvLT5zdGF0ZSA9IEJUQV9BR19TQ09fT1BFTklOR19TVDsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICAgICAgICBjYXNlIEJUQV9BR19TQ09fU0hVVERPV05fRToKKyAgICAgICAgICAgICAgICAgICAgLyogSWYgbm90IG9wZW5pbmcgc2NiLCBqdXN0IGNsb3NlIGl0ICovCisgICAgICAgICAgICAgICAgICAgIGlmIChwX3NjYiAhPSBwX3Njby0+cF9jdXJyX3NjYikKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgLyogcmVtb3ZlIGxpc3RlbmluZyBjb25uZWN0aW9uICovCisgICAgICAgICAgICAgICAgICAgICAgICBidGFfYWdfcmVtb3ZlX3NjbyhwX3NjYiwgRkFMU0UpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgICAgIHBfc2NvLT5zdGF0ZSA9IEJUQV9BR19TQ09fU0hVVFRJTkdfU1Q7CisKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICAgICAgICBjYXNlIEJUQV9BR19TQ09fQ09OTl9PUEVOX0U6CisgICAgICAgICAgICAgICAgICAgIC8qIGNsb3NlIHNjbyBjb25uZWN0aW9uICovCisgICAgICAgICAgICAgICAgICAgIGJ0YV9hZ19yZW1vdmVfc2NvKHBfc2NiLCBUUlVFKTsKKworICAgICAgICAgICAgICAgICAgICBwX3Njby0+c3RhdGUgPSBCVEFfQUdfU0NPX0NMT1NJTkdfU1Q7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgICAgICAgY2FzZSBCVEFfQUdfU0NPX0NPTk5fQ0xPU0VfRToKKyAgICAgICAgICAgICAgICAgICAgLyogc2NvIGZhaWxlZDsgY3JlYXRlIHNjbyBsaXN0ZW4gY29ubmVjdGlvbiAqLworCisgICAgICAgICAgICAgICAgICAgIHBfc2NvLT5zdGF0ZSA9IEJUQV9BR19TQ09fTElTVEVOX1NUOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgICAgIEFQUExfVFJBQ0VfV0FSTklORzEoIkJUQV9BR19TQ09fT1BFTl9DTF9TVDogSWdub3JpbmcgZXZlbnQgJWQiLCBldmVudCk7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgY2FzZSBCVEFfQUdfU0NPX09QRU5fWEZFUl9TVDoKKyAgICAgICAgICAgIHN3aXRjaCAoZXZlbnQpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgY2FzZSBCVEFfQUdfU0NPX0NMT1NFX0U6CisgICAgICAgICAgICAgICAgICAgIC8qIGNsb3NlIHNjbyBjb25uZWN0aW9uICovCisgICAgICAgICAgICAgICAgICAgIGJ0YV9hZ19yZW1vdmVfc2NvKHBfc2NiLCBUUlVFKTsKKworICAgICAgICAgICAgICAgICAgICBwX3Njby0+c3RhdGUgPSBCVEFfQUdfU0NPX0NMT1NJTkdfU1Q7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgICAgICAgY2FzZSBCVEFfQUdfU0NPX1NIVVRET1dOX0U6CisgICAgICAgICAgICAgICAgICAgIC8qIHJlbW92ZSBhbGwgY29ubmVjdGlvbiAqLworICAgICAgICAgICAgICAgICAgICBidGFfYWdfcmVtb3ZlX3NjbyhwX3NjYiwgRkFMU0UpOworICAgICAgICAgICAgICAgICAgICBwX3Njby0+c3RhdGUgPSBCVEFfQUdfU0NPX1NIVVRUSU5HX1NUOworCisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgICAgICAgY2FzZSBCVEFfQUdfU0NPX0NPTk5fQ0xPU0VfRToKKyAgICAgICAgICAgICAgICAgICAgLyogY2xvc2VkIHNjbzsgcGxhY2UgaW4gbGlzdGVuIG1vZGUgYW5kCisgICAgICAgICAgICAgICAgICAgICAgIGFjY2VwdCB0aGUgdHJhbnNmZXJyZWQgY29ubmVjdGlvbiAqLworICAgICAgICAgICAgICAgICAgICBidGFfYWdfY3JlYXRlX3NjbyhwX3NjYiwgRkFMU0UpOyAgICAvKiBCYWNrIGludG8gbGlzdGVuIG1vZGUgKi8KKworICAgICAgICAgICAgICAgICAgICAvKiBBY2NlcHQgc2NvIGNvbm5lY3Rpb24gd2l0aCB4ZmVyIHNjYiAqLworICAgICAgICAgICAgICAgICAgICBidGFfYWdfc2NvX2Nvbm5fcnNwKHBfc2NvLT5wX3hmZXJfc2NiLCAmcF9zY28tPmNvbm5fZGF0YSk7CisgICAgICAgICAgICAgICAgICAgIHBfc2NvLT5zdGF0ZSA9IEJUQV9BR19TQ09fT1BFTklOR19TVDsKKyAgICAgICAgICAgICAgICAgICAgcF9zY28tPnBfY3Vycl9zY2IgPSBwX3Njby0+cF94ZmVyX3NjYjsKKyAgICAgICAgICAgICAgICAgICAgcF9zY28tPmN1cl9pZHggPSBwX3Njby0+cF94ZmVyX3NjYi0+c2NvX2lkeDsKKyAgICAgICAgICAgICAgICAgICAgcF9zY28tPnBfeGZlcl9zY2IgPSBOVUxMOworICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgICAgICBBUFBMX1RSQUNFX1dBUk5JTkcxKCJCVEFfQUdfU0NPX09QRU5fWEZFUl9TVDogSWdub3JpbmcgZXZlbnQgJWQiLCBldmVudCk7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgY2FzZSBCVEFfQUdfU0NPX09QRU5fU1Q6CisgICAgICAgICAgICBzd2l0Y2ggKGV2ZW50KQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGNhc2UgQlRBX0FHX1NDT19MSVNURU5fRToKKyAgICAgICAgICAgICAgICAgICAgLyogc2Vjb25kIGhlYWRzZXQgaGFzIG5vdyBqb2luZWQgKi8KKyAgICAgICAgICAgICAgICAgICAgLyogY3JlYXRlIHNjbyBsaXN0ZW4gY29ubmVjdGlvbiAoQWRkaXRpb25hbCBjaGFubmVsKSAqLworICAgICAgICAgICAgICAgICAgICBpZiAocF9zY2IgIT0gcF9zY28tPnBfY3Vycl9zY2IpCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJ0YV9hZ19jcmVhdGVfc2NvKHBfc2NiLCBGQUxTRSk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICAgICAgICBjYXNlIEJUQV9BR19TQ09fWEZFUl9FOgorICAgICAgICAgICAgICAgICAgICAvKiBjbG9zZSBjdXJyZW50IHNjbyBjb25uZWN0aW9uICovCisgICAgICAgICAgICAgICAgICAgIGJ0YV9hZ19yZW1vdmVfc2NvKHBfc2NvLT5wX2N1cnJfc2NiLCBUUlVFKTsKKworICAgICAgICAgICAgICAgICAgICAvKiBzYXZlIHhmZXIgc2NiICovCisgICAgICAgICAgICAgICAgICAgIHBfc2NvLT5wX3hmZXJfc2NiID0gcF9zY2I7CisKKyAgICAgICAgICAgICAgICAgICAgcF9zY28tPnN0YXRlID0gQlRBX0FHX1NDT19DTE9TRV9YRkVSX1NUOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgICAgICAgIGNhc2UgQlRBX0FHX1NDT19DTE9TRV9FOgorICAgICAgICAgICAgICAgICAgICAvKiBjbG9zZSBzY28gY29ubmVjdGlvbiBpZiBhY3RpdmUgKi8KKyAgICAgICAgICAgICAgICAgICAgaWYgKGJ0YV9hZ19yZW1vdmVfc2NvKHBfc2NiLCBUUlVFKSkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgcF9zY28tPnN0YXRlID0gQlRBX0FHX1NDT19DTE9TSU5HX1NUOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgICAgICAgY2FzZSBCVEFfQUdfU0NPX1NIVVRET1dOX0U6CisgICAgICAgICAgICAgICAgICAgIC8qIHJlbW92ZSBhbGwgbGlzdGVuaW5nIGNvbm5lY3Rpb25zICovCisgICAgICAgICAgICAgICAgICAgIGJ0YV9hZ19yZW1vdmVfc2NvKHBfc2NiLCBGQUxTRSk7CisKKyAgICAgICAgICAgICAgICAgICAgLyogSWYgU0NPIHdhcyBhY3RpdmUgb24gdGhpcyBzY2IsIGNsb3NlIGl0ICovCisgICAgICAgICAgICAgICAgICAgIGlmIChwX3NjYiA9PSBwX3Njby0+cF9jdXJyX3NjYikKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgcF9zY28tPnN0YXRlID0gQlRBX0FHX1NDT19TSFVUVElOR19TVDsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgICAgICAgIGNhc2UgQlRBX0FHX1NDT19DT05OX0NMT1NFX0U6CisgICAgICAgICAgICAgICAgICAgIC8qIHBlZXIgY2xvc2VkIHNjbzsgY3JlYXRlIHNjbyBsaXN0ZW4gY29ubmVjdGlvbiAqLworICAgICAgICAgICAgICAgICAgICBidGFfYWdfY3JlYXRlX3NjbyhwX3NjYiwgRkFMU0UpOworICAgICAgICAgICAgICAgICAgICBwX3Njby0+c3RhdGUgPSBCVEFfQUdfU0NPX0xJU1RFTl9TVDsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgICAgICBBUFBMX1RSQUNFX1dBUk5JTkcxKCJCVEFfQUdfU0NPX09QRU5fU1Q6IElnbm9yaW5nIGV2ZW50ICVkIiwgZXZlbnQpOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgIGNhc2UgQlRBX0FHX1NDT19DTE9TSU5HX1NUOgorICAgICAgICAgICAgc3dpdGNoIChldmVudCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBjYXNlIEJUQV9BR19TQ09fTElTVEVOX0U6CisgICAgICAgICAgICAgICAgICAgIC8qIGNyZWF0ZSBzY28gbGlzdGVuIGNvbm5lY3Rpb24gKEFkZGl0aW9uYWwgY2hhbm5lbCkgKi8KKyAgICAgICAgICAgICAgICAgICAgaWYgKHBfc2NiICE9IHBfc2NvLT5wX2N1cnJfc2NiKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBidGFfYWdfY3JlYXRlX3NjbyhwX3NjYiwgRkFMU0UpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgICAgICAgY2FzZSBCVEFfQUdfU0NPX09QRU5fRToKKyAgICAgICAgICAgICAgICAgICAgcF9zY28tPnN0YXRlID0gQlRBX0FHX1NDT19DTE9TRV9PUF9TVDsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICAgICAgICBjYXNlIEJUQV9BR19TQ09fWEZFUl9FOgorICAgICAgICAgICAgICAgICAgICAvKiBzYXZlIHhmZXIgc2NiICovCisgICAgICAgICAgICAgICAgICAgIHBfc2NvLT5wX3hmZXJfc2NiID0gcF9zY2I7CisKKyAgICAgICAgICAgICAgICAgICAgcF9zY28tPnN0YXRlID0gQlRBX0FHX1NDT19DTE9TRV9YRkVSX1NUOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgICAgICAgIGNhc2UgQlRBX0FHX1NDT19TSFVURE9XTl9FOgorICAgICAgICAgICAgICAgICAgICAvKiBJZiBub3QgY2xvc2luZyBzY2IsIGp1c3QgY2xvc2UgaXQgKi8KKyAgICAgICAgICAgICAgICAgICAgaWYgKHBfc2NiICE9IHBfc2NvLT5wX2N1cnJfc2NiKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAvKiByZW1vdmUgbGlzdGVuaW5nIGNvbm5lY3Rpb24gKi8KKyAgICAgICAgICAgICAgICAgICAgICAgIGJ0YV9hZ19yZW1vdmVfc2NvKHBfc2NiLCBGQUxTRSk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICAgICAgcF9zY28tPnN0YXRlID0gQlRBX0FHX1NDT19TSFVUVElOR19TVDsKKworICAgICAgICAgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgICAgICAgIGNhc2UgQlRBX0FHX1NDT19DT05OX0NMT1NFX0U6CisgICAgICAgICAgICAgICAgICAgIC8qIHBlZXIgY2xvc2VkIHNjbzsgY3JlYXRlIHNjbyBsaXN0ZW4gY29ubmVjdGlvbiAqLworICAgICAgICAgICAgICAgICAgICBidGFfYWdfY3JlYXRlX3NjbyhwX3NjYiwgRkFMU0UpOworCisgICAgICAgICAgICAgICAgICAgIHBfc2NvLT5zdGF0ZSA9IEJUQV9BR19TQ09fTElTVEVOX1NUOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgICAgIEFQUExfVFJBQ0VfV0FSTklORzEoIkJUQV9BR19TQ09fQ0xPU0lOR19TVDogSWdub3JpbmcgZXZlbnQgJWQiLCBldmVudCk7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgY2FzZSBCVEFfQUdfU0NPX0NMT1NFX09QX1NUOgorICAgICAgICAgICAgc3dpdGNoIChldmVudCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBjYXNlIEJUQV9BR19TQ09fQ0xPU0VfRToKKyAgICAgICAgICAgICAgICAgICAgcF9zY28tPnN0YXRlID0gQlRBX0FHX1NDT19DTE9TSU5HX1NUOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgICAgICAgIGNhc2UgQlRBX0FHX1NDT19TSFVURE9XTl9FOgorICAgICAgICAgICAgICAgICAgICBwX3Njby0+c3RhdGUgPSBCVEFfQUdfU0NPX1NIVVRUSU5HX1NUOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgICAgICAgIGNhc2UgQlRBX0FHX1NDT19DT05OX0NMT1NFX0U6CisjaWYgKEJUTV9XQlNfSU5DTFVERUQgPT0gVFJVRSApCisgICAgICAgICAgICAgICAgICAgIC8qIHN0YXJ0IGNvZGVjIG5lZ290aWF0aW9uICovCisgICAgICAgICAgICAgICAgICAgIHBfc2NvLT5zdGF0ZSA9IEJUQV9BR19TQ09fQ09ERUNfU1Q7CisgICAgICAgICAgICAgICAgICAgIHBfY25fc2NiID0gcF9zY2I7CisjZWxzZQorICAgICAgICAgICAgICAgICAgICAvKiBvcGVuIHNjbyBjb25uZWN0aW9uICovCisgICAgICAgICAgICAgICAgICAgIGJ0YV9hZ19jcmVhdGVfc2NvKHBfc2NiLCBUUlVFKTsKKyAgICAgICAgICAgICAgICAgICAgcF9zY28tPnN0YXRlID0gQlRBX0FHX1NDT19PUEVOSU5HX1NUOworI2VuZGlmCisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgICAgICAgY2FzZSBCVEFfQUdfU0NPX0xJU1RFTl9FOgorICAgICAgICAgICAgICAgICAgICAvKiBjcmVhdGUgc2NvIGxpc3RlbiBjb25uZWN0aW9uIChBZGRpdGlvbmFsIGNoYW5uZWwpICovCisgICAgICAgICAgICAgICAgICAgIGlmIChwX3NjYiAhPSBwX3Njby0+cF9jdXJyX3NjYikKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgYnRhX2FnX2NyZWF0ZV9zY28ocF9zY2IsIEZBTFNFKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgICAgIEFQUExfVFJBQ0VfV0FSTklORzEoIkJUQV9BR19TQ09fQ0xPU0VfT1BfU1Q6IElnbm9yaW5nIGV2ZW50ICVkIiwgZXZlbnQpOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgIGNhc2UgQlRBX0FHX1NDT19DTE9TRV9YRkVSX1NUOgorICAgICAgICAgICAgc3dpdGNoIChldmVudCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBjYXNlIEJUQV9BR19TQ09fQ09OTl9PUEVOX0U6CisgICAgICAgICAgICAgICAgICAgIC8qIGNsb3NlIHNjbyBjb25uZWN0aW9uIHNvIGhlYWRzZXQgY2FuIGJlIHRyYW5zZmVycmVkCisgICAgICAgICAgICAgICAgICAgICAgIFByb2JhYmx5IGVudGVyZWQgdGhpcyBzdGF0ZSBmcm9tICJvcGVuaW5nIHN0YXRlIiAqLworICAgICAgICAgICAgICAgICAgICBidGFfYWdfcmVtb3ZlX3NjbyhwX3NjYiwgVFJVRSk7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgICAgICAgY2FzZSBCVEFfQUdfU0NPX0NMT1NFX0U6CisgICAgICAgICAgICAgICAgICAgIC8qIGNsZWFyIHhmZXIgc2NiICovCisgICAgICAgICAgICAgICAgICAgIHBfc2NvLT5wX3hmZXJfc2NiID0gTlVMTDsKKworICAgICAgICAgICAgICAgICAgICBwX3Njby0+c3RhdGUgPSBCVEFfQUdfU0NPX0NMT1NJTkdfU1Q7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgICAgICAgY2FzZSBCVEFfQUdfU0NPX1NIVVRET1dOX0U6CisgICAgICAgICAgICAgICAgICAgIC8qIGNsZWFyIHhmZXIgc2NiICovCisgICAgICAgICAgICAgICAgICAgIHBfc2NvLT5wX3hmZXJfc2NiID0gTlVMTDsKKworICAgICAgICAgICAgICAgICAgICBwX3Njby0+c3RhdGUgPSBCVEFfQUdfU0NPX1NIVVRUSU5HX1NUOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgICAgICAgIGNhc2UgQlRBX0FHX1NDT19DT05OX0NMT1NFX0U6CisgICAgICAgICAgICAgICAgICAgIC8qIGNsb3NlZCBzY287IHBsYWNlIG9sZCBzY28gaW4gbGlzdGVuIG1vZGUsCisgICAgICAgICAgICAgICAgICAgICAgIHRha2UgY3VycmVudCBzY28gb3V0IG9mIGxpc3RlbiwgYW5kCisgICAgICAgICAgICAgICAgICAgICAgIGNyZWF0ZSBvcmlnaW5hdGluZyBzY28gZm9yIGN1cnJlbnQgKi8KKyAgICAgICAgICAgICAgICAgICAgYnRhX2FnX2NyZWF0ZV9zY28ocF9zY2IsIEZBTFNFKTsKKyAgICAgICAgICAgICAgICAgICAgYnRhX2FnX3JlbW92ZV9zY28ocF9zY28tPnBfeGZlcl9zY2IsIEZBTFNFKTsKKworI2lmIChCVE1fV0JTX0lOQ0xVREVEID09IFRSVUUgKQorICAgICAgICAgICAgICAgICAgICAvKiBzdGFydCBjb2RlYyBuZWdvdGlhdGlvbiAqLworICAgICAgICAgICAgICAgICAgICBwX3Njby0+c3RhdGUgPSBCVEFfQUdfU0NPX0NPREVDX1NUOworICAgICAgICAgICAgICAgICAgICBwX2NuX3NjYiA9IHBfc2NvLT5wX3hmZXJfc2NiOworICAgICAgICAgICAgICAgICAgICBwX3Njby0+cF94ZmVyX3NjYiA9IE5VTEw7CisjZWxzZQorICAgICAgICAgICAgICAgICAgICAvKiBjcmVhdGUgc2NvIGNvbm5lY3Rpb24gdG8gcGVlciAqLworICAgICAgICAgICAgICAgICAgICBidGFfYWdfY3JlYXRlX3NjbyhwX3Njby0+cF94ZmVyX3NjYiwgVFJVRSk7CisgICAgICAgICAgICAgICAgICAgIHBfc2NvLT5wX3hmZXJfc2NiID0gTlVMTDsKKyAgICAgICAgICAgICAgICAgICAgcF9zY28tPnN0YXRlID0gQlRBX0FHX1NDT19PUEVOSU5HX1NUOworI2VuZGlmCisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICAgICAgQVBQTF9UUkFDRV9XQVJOSU5HMSgiQlRBX0FHX1NDT19DTE9TRV9YRkVSX1NUOiBJZ25vcmluZyBldmVudCAlZCIsIGV2ZW50KTsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKworICAgICAgICBjYXNlIEJUQV9BR19TQ09fU0hVVFRJTkdfU1Q6CisgICAgICAgICAgICBzd2l0Y2ggKGV2ZW50KQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGNhc2UgQlRBX0FHX1NDT19DT05OX09QRU5fRToKKyAgICAgICAgICAgICAgICAgICAgLyogY2xvc2Ugc2NvIGNvbm5lY3Rpb247IHdhaXQgZm9yIGNvbm4gY2xvc2UgZXZlbnQgKi8KKyAgICAgICAgICAgICAgICAgICAgYnRhX2FnX3JlbW92ZV9zY28ocF9zY2IsIFRSVUUpOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgICAgICAgIGNhc2UgQlRBX0FHX1NDT19DT05OX0NMT1NFX0U6CisgICAgICAgICAgICAgICAgICAgIC8qIElmIGxhc3QgU0NPIGluc3RhbmNlIHRoZW4gZmluaXNoIHNodXR0aW5nIGRvd24gKi8KKyAgICAgICAgICAgICAgICAgICAgaWYgKCFidGFfYWdfb3RoZXJfc2NiX29wZW4ocF9zY2IpKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBwX3Njby0+c3RhdGUgPSBCVEFfQUdfU0NPX1NIVVRET1dOX1NUOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGVsc2UgICAgLyogT3RoZXIgaW5zdGFuY2UgaXMgc3RpbGwgbGlzdGVuaW5nICovCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHBfc2NvLT5zdGF0ZSA9IEJUQV9BR19TQ09fTElTVEVOX1NUOworICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgaWYgKHBfc2NiID09IHBfc2NvLT5wX2N1cnJfc2NiKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBwX3Njby0+cF9jdXJyX3NjYi0+c2NvX2lkeCA9IEJUTV9JTlZBTElEX1NDT19JTkRFWDsKKyAgICAgICAgICAgICAgICAgICAgICAgIHBfc2NvLT5wX2N1cnJfc2NiID0gTlVMTDsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgICAgICAgIGNhc2UgQlRBX0FHX1NDT19MSVNURU5fRToKKyAgICAgICAgICAgICAgICAgICAgLyogY3JlYXRlIHNjbyBsaXN0ZW4gY29ubmVjdGlvbiAoQWRkaXRpb25hbCBjaGFubmVsKSAqLworICAgICAgICAgICAgICAgICAgICBpZiAocF9zY2IgIT0gcF9zY28tPnBfY3Vycl9zY2IpCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJ0YV9hZ19jcmVhdGVfc2NvKHBfc2NiLCBGQUxTRSk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICAgICAgICBjYXNlIEJUQV9BR19TQ09fU0hVVERPV05fRToKKyAgICAgICAgICAgICAgICAgICAgaWYgKCFidGFfYWdfb3RoZXJfc2NiX29wZW4ocF9zY2IpKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBwX3Njby0+c3RhdGUgPSBCVEFfQUdfU0NPX1NIVVRET1dOX1NUOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGVsc2UgICAgLyogT3RoZXIgaW5zdGFuY2UgaXMgc3RpbGwgbGlzdGVuaW5nICovCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHBfc2NvLT5zdGF0ZSA9IEJUQV9BR19TQ09fTElTVEVOX1NUOworICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgaWYgKHBfc2NiID09IHBfc2NvLT5wX2N1cnJfc2NiKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBwX3Njby0+cF9jdXJyX3NjYi0+c2NvX2lkeCA9IEJUTV9JTlZBTElEX1NDT19JTkRFWDsKKyAgICAgICAgICAgICAgICAgICAgICAgIHBfc2NvLT5wX2N1cnJfc2NiID0gTlVMTDsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgICAgIEFQUExfVFJBQ0VfV0FSTklORzEoIkJUQV9BR19TQ09fU0hVVFRJTkdfU1Q6IElnbm9yaW5nIGV2ZW50ICVkIiwgZXZlbnQpOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICBicmVhazsKKyAgICB9CisjaWYgQlRBX0FHX1NDT19ERUJVRyA9PSBUUlVFCisgICAgaWYgKHBfc2NvLT5zdGF0ZSAhPSBpbl9zdGF0ZSkKKyAgICB7CisgICAgICAgIEFQUExfVFJBQ0VfRVZFTlQzKCJCVEEgQUcgU0NPIFN0YXRlIENoYW5nZTogWyVzXSAtPiBbJXNdIGFmdGVyIEV2ZW50IFslc10iLAorICAgICAgICAgICAgICAgICAgICAgIGJ0YV9hZ19zY29fc3RhdGVfc3RyKGluX3N0YXRlKSwKKyAgICAgICAgICAgICAgICAgICAgICBidGFfYWdfc2NvX3N0YXRlX3N0cihwX3Njby0+c3RhdGUpLAorICAgICAgICAgICAgICAgICAgICAgIGJ0YV9hZ19zY29fZXZ0X3N0cihldmVudCkpOworICAgIH0KKyNlbmRpZgorCisjaWYgKEJUTV9XQlNfSU5DTFVERUQgPT0gVFJVRSApCisgICAgaWYgKHBfY25fc2NiKQorICAgIHsKKyAgICAgICAgYnRhX2FnX2NvZGVjX25lZ290aWF0ZShwX2NuX3NjYik7CisgICAgfQorI2VuZGlmCit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisqKgorKiogRnVuY3Rpb24gICAgICAgICBidGFfYWdfc2NvX2lzX29wZW4KKyoqCisqKiBEZXNjcmlwdGlvbiAgICAgIENoZWNrIGlmIHNjbyBpcyBvcGVuIGZvciB0aGlzIHNjYi4KKyoqCisqKgorKiogUmV0dXJucyAgICAgICAgICBUUlVFIGlmIHNjbyBvcGVuIGZvciB0aGlzIHNjYiwgRkFMU0Ugb3RoZXJ3aXNlLgorKioKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitCT09MRUFOIGJ0YV9hZ19zY29faXNfb3Blbih0QlRBX0FHX1NDQiAqcF9zY2IpCit7CisgICAgcmV0dXJuICgoYnRhX2FnX2NiLnNjby5zdGF0ZSA9PSBCVEFfQUdfU0NPX09QRU5fU1QpICYmCisgICAgICAgICAgICAoYnRhX2FnX2NiLnNjby5wX2N1cnJfc2NiID09IHBfc2NiKSk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisqKgorKiogRnVuY3Rpb24gICAgICAgICBidGFfYWdfc2NvX2lzX29wZW5pbmcKKyoqCisqKiBEZXNjcmlwdGlvbiAgICAgIENoZWNrIGlmIHNjbyBpcyBpbiBPcGVuaW5nIHN0YXRlLgorKioKKyoqCisqKiBSZXR1cm5zICAgICAgICAgIFRSVUUgaWYgc2NvIGlzIGluIE9wZW5pbmcgc3RhdGUgZm9yIHRoaXMgc2NiLCBGQUxTRSBvdGhlcndpc2UuCisqKgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK0JPT0xFQU4gYnRhX2FnX3Njb19pc19vcGVuaW5nKHRCVEFfQUdfU0NCICpwX3NjYikKK3sKKyNpZiAoQlRNX1dCU19JTkNMVURFRCA9PSBUUlVFICkKKyAgICByZXR1cm4gKCgoYnRhX2FnX2NiLnNjby5zdGF0ZSA9PSBCVEFfQUdfU0NPX09QRU5JTkdfU1QpIHx8CisgICAgICAgICAgICAoYnRhX2FnX2NiLnNjby5zdGF0ZSA9PSBCVEFfQUdfU0NPX09QRU5JTkdfU1QpKSAmJgorICAgICAgICAgICAgKGJ0YV9hZ19jYi5zY28ucF9jdXJyX3NjYiA9PSBwX3NjYikpOworI2Vsc2UKKyAgICByZXR1cm4gKChidGFfYWdfY2Iuc2NvLnN0YXRlID09IEJUQV9BR19TQ09fT1BFTklOR19TVCkgJiYKKyAgICAgICAgICAgIChidGFfYWdfY2Iuc2NvLnBfY3Vycl9zY2IgPT0gcF9zY2IpKTsKKyNlbmRpZgorfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorKioKKyoqIEZ1bmN0aW9uICAgICAgICAgYnRhX2FnX3Njb19saXN0ZW4KKyoqCisqKiBEZXNjcmlwdGlvbgorKioKKyoqCisqKiBSZXR1cm5zICAgICAgICAgIHZvaWQKKyoqCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordm9pZCBidGFfYWdfc2NvX2xpc3Rlbih0QlRBX0FHX1NDQiAqcF9zY2IsIHRCVEFfQUdfREFUQSAqcF9kYXRhKQoreworICAgIFVOVVNFRChwX2RhdGEpOworICAgIGJ0YV9hZ19zY29fZXZlbnQocF9zY2IsIEJUQV9BR19TQ09fTElTVEVOX0UpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorKioKKyoqIEZ1bmN0aW9uICAgICAgICAgYnRhX2FnX3Njb19vcGVuCisqKgorKiogRGVzY3JpcHRpb24KKyoqCisqKgorKiogUmV0dXJucyAgICAgICAgICB2b2lkCisqKgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3ZvaWQgYnRhX2FnX3Njb19vcGVuKHRCVEFfQUdfU0NCICpwX3NjYiwgdEJUQV9BR19EQVRBICpwX2RhdGEpCit7CisgICAgVUlOVDggZXZlbnQ7CisgICAgVU5VU0VEKHBfZGF0YSk7CisKKyAgICAvKiBpZiBhbm90aGVyIHNjYiB1c2luZyBzY28sIHRoaXMgaXMgYSB0cmFuc2ZlciAqLworICAgIGlmIChidGFfYWdfY2Iuc2NvLnBfY3Vycl9zY2IgIT0gTlVMTCAmJiBidGFfYWdfY2Iuc2NvLnBfY3Vycl9zY2IgIT0gcF9zY2IpCisgICAgeworICAgICAgICBldmVudCA9IEJUQV9BR19TQ09fWEZFUl9FOworICAgIH0KKyAgICAvKiBlbHNlIGl0IGlzIGFuIG9wZW4gKi8KKyAgICBlbHNlCisgICAgeworICAgICAgICBldmVudCA9IEJUQV9BR19TQ09fT1BFTl9FOworICAgIH0KKworICAgIGJ0YV9hZ19zY29fZXZlbnQocF9zY2IsIGV2ZW50KTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyoqCisqKiBGdW5jdGlvbiAgICAgICAgIGJ0YV9hZ19zY29fY2xvc2UKKyoqCisqKiBEZXNjcmlwdGlvbgorKioKKyoqCisqKiBSZXR1cm5zICAgICAgICAgIHZvaWQKKyoqCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordm9pZCBidGFfYWdfc2NvX2Nsb3NlKHRCVEFfQUdfU0NCICpwX3NjYiwgdEJUQV9BR19EQVRBICpwX2RhdGEpCit7CisgICAgVU5VU0VEKHBfZGF0YSk7CisKKyAgICAvKiBpZiBzY2IgaXMgaW4gdXNlICovCisjaWYgKEJUTV9XQlNfSU5DTFVERUQgPT0gVFJVRSApCisgICAgLyogc2NvX2lkeCBpcyBub3QgYWxsb2NhdGVkIGluIFNDT19DT0RFQ19TVCwgd2Ugc3RpbGwgbmVlZCB0byBtb3ZlIHRvIGxpc3RlbmluZyBzdGF0ZS4gKi8KKyAgICBpZiAoKHBfc2NiLT5zY29faWR4ICE9IEJUTV9JTlZBTElEX1NDT19JTkRFWCkgfHwgKGJ0YV9hZ19jYi5zY28uc3RhdGUgPT0gQlRBX0FHX1NDT19DT0RFQ19TVCkpCisjZWxzZQorICAgIGlmIChwX3NjYi0+c2NvX2lkeCAhPSBCVE1fSU5WQUxJRF9TQ09fSU5ERVgpCisjZW5kaWYKKyAgICB7CisgICAgICAgIEFQUExfVFJBQ0VfREVCVUcxKCJidGFfYWdfc2NvX2Nsb3NlOiBzY29faW54ID0gJWQiLCBwX3NjYi0+c2NvX2lkeCk7CisgICAgICAgIGJ0YV9hZ19zY29fZXZlbnQocF9zY2IsIEJUQV9BR19TQ09fQ0xPU0VfRSk7CisgICAgfQorfQorCisjaWYgKEJUTV9XQlNfSU5DTFVERUQgPT0gVFJVRSApCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisqKgorKiogRnVuY3Rpb24gICAgICAgICBidGFfYWdfc2NvX2NvZGVjX25lZ28KKyoqCisqKiBEZXNjcmlwdGlvbgorKioKKyoqCisqKiBSZXR1cm5zICAgICAgICAgIHZvaWQKKyoqCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordm9pZCBidGFfYWdfc2NvX2NvZGVjX25lZ28odEJUQV9BR19TQ0IgKnBfc2NiLCBCT09MRUFOIHJlc3VsdCkKK3sKKyAgICBpZihyZXN1bHQgPT0gVFJVRSkKKyAgICB7CisgICAgICAgIC8qIFN1YnNlcXVlbnQgc2NvIGNvbm5lY3Rpb24gd2lsbCBza2lwIGNvZGVjIG5lZ290aWF0aW9uICovCisgICAgICAgIHBfc2NiLT5jb2RlY191cGRhdGVkID0gRkFMU0U7CisKKyAgICAgICAgYnRhX2FnX3Njb19ldmVudChwX3NjYiwgQlRBX0FHX1NDT19DTl9ET05FX0UpOworICAgIH0KKyAgICBlbHNlICAgIC8qIGNvZGVjIG5lZ290aWF0aW9uIGZhaWxlZCAqLworICAgICAgICBidGFfYWdfc2NvX2V2ZW50KHBfc2NiLCBCVEFfQUdfU0NPX0NMT1NFX0UpOworfQorI2VuZGlmCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisqKgorKiogRnVuY3Rpb24gICAgICAgICBidGFfYWdfc2NvX3NodXRkb3duCisqKgorKiogRGVzY3JpcHRpb24KKyoqCisqKgorKiogUmV0dXJucyAgICAgICAgICB2b2lkCisqKgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3ZvaWQgYnRhX2FnX3Njb19zaHV0ZG93bih0QlRBX0FHX1NDQiAqcF9zY2IsIHRCVEFfQUdfREFUQSAqcF9kYXRhKQoreworICAgIFVOVVNFRChwX2RhdGEpOworCisgICAgYnRhX2FnX3Njb19ldmVudChwX3NjYiwgQlRBX0FHX1NDT19TSFVURE9XTl9FKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyoqCisqKiBGdW5jdGlvbiAgICAgICAgIGJ0YV9hZ19zY29fY29ubl9vcGVuCisqKgorKiogRGVzY3JpcHRpb24KKyoqCisqKgorKiogUmV0dXJucyAgICAgICAgICB2b2lkCisqKgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3ZvaWQgYnRhX2FnX3Njb19jb25uX29wZW4odEJUQV9BR19TQ0IgKnBfc2NiLCB0QlRBX0FHX0RBVEEgKnBfZGF0YSkKK3sKKyAgICBVTlVTRUQocF9kYXRhKTsKKworICAgIGJ0YV9hZ19zY29fZXZlbnQocF9zY2IsIEJUQV9BR19TQ09fQ09OTl9PUEVOX0UpOworCisgICAgYnRhX3N5c19zY29fb3BlbihCVEFfSURfQUcsIHBfc2NiLT5hcHBfaWQsIHBfc2NiLT5wZWVyX2FkZHIpOworCisgICAgYnRhX2FnX2NvX2F1ZGlvX3N0YXRlKGJ0YV9hZ19zY2JfdG9faWR4KHBfc2NiKSwgcF9zY2ItPmFwcF9pZCwgQlRBX0FHX0NPX0FVRF9TVEFURV9PTik7CisKKyNpZiAoQlRNX1NDT19IQ0lfSU5DTFVERUQgPT0gVFJVRSApCisgICAgLyogb3BlbiBTQ08gY29kZWMgaWYgU0NPIGlzIHJvdXRlZCB0aHJvdWdoIHRyYW5zcG9ydCAqLworICAgIGJ0YV9kbV9zY29fY29fb3BlbihidGFfYWdfc2NiX3RvX2lkeChwX3NjYiksIEJUQV9TQ09fT1VUX1BLVF9TSVpFLCBCVEFfQUdfQ0lfU0NPX0RBVEFfRVZUKTsKKyNlbmRpZgorCisgICAgLyogY2FsbCBhcHAgY2FsbGJhY2sgKi8KKyAgICBidGFfYWdfY2JhY2tfc2NvKHBfc2NiLCBCVEFfQUdfQVVESU9fT1BFTl9FVlQpOworCisgICAgcF9zY2ItPnJldHJ5X3dpdGhfc2NvX29ubHkgPSBGQUxTRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyoqCisqKiBGdW5jdGlvbiAgICAgICAgIGJ0YV9hZ19zY29fY29ubl9jbG9zZQorKioKKyoqIERlc2NyaXB0aW9uCisqKgorKioKKyoqIFJldHVybnMgICAgICAgICAgdm9pZAorKioKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit2b2lkIGJ0YV9hZ19zY29fY29ubl9jbG9zZSh0QlRBX0FHX1NDQiAqcF9zY2IsIHRCVEFfQUdfREFUQSAqcF9kYXRhKQoreworICAgIFVJTlQxNiBoYW5kbGUgPSBidGFfYWdfc2NiX3RvX2lkeChwX3NjYik7CisgICAgVU5VU0VEKHBfZGF0YSk7CisKKyAgICAvKiBjbGVhciBjdXJyZW50IHNjYiAqLworICAgIGJ0YV9hZ19jYi5zY28ucF9jdXJyX3NjYiA9IE5VTEw7CisgICAgcF9zY2ItPnNjb19pZHggPSBCVE1fSU5WQUxJRF9TQ09fSU5ERVg7CisKKyNpZiAoQlRNX1dCU19JTkNMVURFRCA9PSBUUlVFKQorICAgIC8qIGNvZGVjX2ZhbGxiYWNrIGlzIHNldCB3aGVuIEFHIGlzIGluaXRpYXRvciBhbmQgY29ubmVjdGlvbiBmYWlsZWQgZm9yIG1TQkMuICovCisgICAgaWYgKHBfc2NiLT5jb2RlY19mYWxsYmFjayAmJiBwX3NjYi0+c3ZjX2Nvbm4pCisgICAgeworICAgICAgICBidGFfYWdfc2NvX2V2ZW50KHBfc2NiLCBCVEFfQUdfU0NPX1JFT1BFTl9FKTsKKyAgICB9CisgICAgZWxzZSBpZiAocF9zY2ItPnJldHJ5X3dpdGhfc2NvX29ubHkgJiYgcF9zY2ItPnN2Y19jb25uKQorICAgIHsKKyAgICAgICAgLyogcmV0cnlfd2l0aF9zY29fb25seSBpcyBzZXQgd2hlbiBBRyBpcyBpbml0aWF0b3IgYW5kIGNvbm5lY3Rpb24gZmFpbGVkIGZvciBlU0NPICovCisgICAgICAgIGJ0YV9hZ19jcmVhdGVfc2NvKHBfc2NiLCBUUlVFKTsKKyAgICB9CisjZWxzZQorICAgIC8qIHJldHJ5X3dpdGhfc2NvX29ubHksIHdpbGwgYmUgc2V0IG9ubHkgd2hlbiBBRyBpcyBpbml0aWF0b3IKKyAgICAqKiBhbmQgQUcgaXMgZmlyc3QgdHJ5aW5nIHRvIGVzdGFibGlzaCBhbiBlU0NPIGNvbm5lY3Rpb24gKi8KKyAgICBpZiAocF9zY2ItPnJldHJ5X3dpdGhfc2NvX29ubHkgJiYgcF9zY2ItPnN2Y19jb25uKQorICAgIHsKKyAgICAgICAgYnRhX2FnX2NyZWF0ZV9zY28ocF9zY2IsIFRSVUUpOworICAgIH0KKyNlbmRpZgorICAgIGVsc2UKKyAgICB7CisgICAgICAgIC8qIEluZGljYXRlIGlmIHRoZSBjbG9zaW5nIG9mIGF1ZGlvIGlzIGJlY2F1c2Ugb2YgdHJhbnNmZXIgKi8KKyAgICAgICAgaWYgKGJ0YV9hZ19jYi5zY28ucF94ZmVyX3NjYikKKyAgICAgICAgICAgIGJ0YV9hZ19jb19hdWRpb19zdGF0ZShoYW5kbGUsIHBfc2NiLT5hcHBfaWQsIEJUQV9BR19DT19BVURfU1RBVEVfT0ZGX1hGRVIpOworICAgICAgICBlbHNlCisgICAgICAgICAgICBidGFfYWdfY29fYXVkaW9fc3RhdGUoaGFuZGxlLCBwX3NjYi0+YXBwX2lkLCBCVEFfQUdfQ09fQVVEX1NUQVRFX09GRik7CisKKyAgICAgICAgYnRhX2FnX3Njb19ldmVudChwX3NjYiwgQlRBX0FHX1NDT19DT05OX0NMT1NFX0UpOworCisgICAgICAgIGJ0YV9zeXNfc2NvX2Nsb3NlKEJUQV9JRF9BRywgcF9zY2ItPmFwcF9pZCwgcF9zY2ItPnBlZXJfYWRkcik7CisKKyAgICAgICAgLyogaWYgYXYgZ290IHN1c3BlbmRlZCBieSB0aGlzIGNhbGwsIGxldCBpdCByZXN1bWUuICovCisgICAgICAgIC8qIEluIGNhc2UgY2FsbCBzdGF5cyBhbGl2ZSByZWdhcmRsZXNzIG9mIHNjbywgYXYgc2hvdWxkIG5vdCBiZSBhZmZlY3RlZC4gKi8KKyAgICAgICAgaWYoKChwX3NjYi0+Y2FsbF9pbmQgPT0gQlRBX0FHX0NBTExfSU5BQ1RJVkUpICYmIChwX3NjYi0+Y2FsbHNldHVwX2luZCA9PSBCVEFfQUdfQ0FMTFNFVFVQX05PTkUpKQorICAgICAgICAgICAgfHwgKHBfc2NiLT5wb3N0X3NjbyA9PSBCVEFfQUdfUE9TVF9TQ09fQ0FMTF9FTkQpKQorICAgICAgICB7CisgICAgICAgICAgICBidGFfc3lzX3Njb191bnVzZShCVEFfSURfQUcsIHBfc2NiLT5hcHBfaWQsIHBfc2NiLT5wZWVyX2FkZHIpOworICAgICAgICB9CisKKyAgICAgICAgLyogY2FsbCBhcHAgY2FsbGJhY2sgKi8KKyAgICAgICAgYnRhX2FnX2NiYWNrX3NjbyhwX3NjYiwgQlRBX0FHX0FVRElPX0NMT1NFX0VWVCk7CisgICAgfQorICAgIHBfc2NiLT5yZXRyeV93aXRoX3Njb19vbmx5ID0gRkFMU0U7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisqKgorKiogRnVuY3Rpb24gICAgICAgICBidGFfYWdfc2NvX2Nvbm5fcnNwCisqKgorKiogRGVzY3JpcHRpb24gICAgICBQcm9jZXNzIHRoZSBTQ08gY29ubmVjdGlvbiByZXF1ZXN0CisqKgorKioKKyoqIFJldHVybnMgICAgICAgICAgdm9pZAorKioKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit2b2lkIGJ0YV9hZ19zY29fY29ubl9yc3AodEJUQV9BR19TQ0IgKnBfc2NiLCB0QlRNX0VTQ09fQ09OTl9SRVFfRVZUX0RBVEEgKnBfZGF0YSkKK3sKKyAgICB0QlRNX0VTQ09fUEFSQU1TICAgIHJlc3A7CisgICAgVUlOVDggICAgICAgICAgICAgICBoY2lfc3RhdHVzID0gSENJX1NVQ0NFU1M7CisjaWYgKEJUTV9TQ09fSENJX0lOQ0xVREVEID09IFRSVUUgKQorICAgIHRCVEFfQ09ERUNfSU5GTyAgICAgY29kZWNfaW5mbyA9IHtCVEFfU0NPX0NPREVDX1BDTX07CisgICAgVUlOVDMyICAgICAgICAgICAgICBwY21fc2FtcGxlX3JhdGU7CisjZW5kaWYKKworICAgIGlmIChidGFfYWdfY2Iuc2NvLnN0YXRlID09IEJUQV9BR19TQ09fTElTVEVOX1NUICAgICB8fAorICAgICAgICBidGFfYWdfY2Iuc2NvLnN0YXRlID09IEJUQV9BR19TQ09fQ0xPU0VfWEZFUl9TVCB8fAorICAgICAgICBidGFfYWdfY2Iuc2NvLnN0YXRlID09IEJUQV9BR19TQ09fT1BFTl9YRkVSX1NUKQorICAgIHsKKyAgICAgICAgLyogSWYgc2NyaXB0IG92ZXJyaWRlZCBzY28gcGFyYW1ldGVyIGJ5IEJUQV9DTURfU0VUX0VTQ09fUEFSQU0gKi8KKyAgICAgICAgaWYgKGJ0YV9hZ19jYi5zY28ucGFyYW1fdXBkYXRlZCkKKyAgICAgICAgeworICAgICAgICAgICAgcmVzcCA9IGJ0YV9hZ19jYi5zY28ucGFyYW1zOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgcmVzcC5yeF9idyA9IEJUTV82NEtCSVRTX1JBVEU7CisgICAgICAgICAgICByZXNwLnR4X2J3ID0gQlRNXzY0S0JJVFNfUkFURTsKKyAgICAgICAgICAgIHJlc3AubWF4X2xhdGVuY3kgPSAxMDsKKyAgICAgICAgICAgIHJlc3Audm9pY2VfY29udGZtdCA9IDB4NjA7CisgICAgICAgICAgICByZXNwLnJldHJhbnNfZWZmb3J0ID0gQlRNX0VTQ09fUkVUUkFOU19QT1dFUjsKKworICAgICAgICAgICAgaWYgKHBfZGF0YS0+bGlua190eXBlID09IEJUTV9MSU5LX1RZUEVfU0NPKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHJlc3AucGFja2V0X3R5cGVzID0gKEJUTV9TQ09fTElOS19PTkxZX01BU0sgICAgICAgICAgfAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJUTV9TQ09fUEtUX1RZUEVTX01BU0tfTk9fMl9FVjMgfAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJUTV9TQ09fUEtUX1RZUEVTX01BU0tfTk9fM19FVjMgfAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJUTV9TQ09fUEtUX1RZUEVTX01BU0tfTk9fMl9FVjUgfAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJUTV9TQ09fUEtUX1RZUEVTX01BU0tfTk9fM19FVjUpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZSAgICAvKiBBbGxvdyBjb250cm9sbGVyIHRvIHVzZSBhbGwgdHlwZXMgYXZhaWxhYmxlIGV4Y2VwdCA1LXNsb3QgRURSICovCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgcmVzcC5wYWNrZXRfdHlwZXMgPSAoQlRNX1NDT19MSU5LX0FMTF9QS1RfTUFTSyB8CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQlRNX1NDT19QS1RfVFlQRVNfTUFTS19OT18yX0VWNSB8CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQlRNX1NDT19QS1RfVFlQRVNfTUFTS19OT18zX0VWNSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICAvKiB0ZWxsIHN5cyB0byBzdG9wIGF2IGlmIGFueSAqLworICAgICAgICBidGFfc3lzX3Njb191c2UoQlRBX0lEX0FHLCBwX3NjYi0+YXBwX2lkLCBwX3NjYi0+cGVlcl9hZGRyKTsKKworICAgICAgICAvKiBBbGxvdyBhbnkgcGxhdGZvcm0gc3BlY2lmaWMgcHJlLVNDTyBzZXQgdXAgdG8gdGFrZSBwbGFjZSAqLworICAgICAgICBidGFfYWdfY29fYXVkaW9fc3RhdGUoYnRhX2FnX3NjYl90b19pZHgocF9zY2IpLCBwX3NjYi0+YXBwX2lkLCBCVEFfQUdfQ09fQVVEX1NUQVRFX1NFVFVQKTsKKworI2lmIChCVE1fV0JTX0lOQ0xVREVEID09IFRSVUUgKQorICAgICAgICAvKiBXaGVuIEhTIGluaXRpYXRlZCBTQ08sIGl0IGNhbm5vdCBiZSBXQlMuICovCisgICAgICAgIEJUTV9Db25maWdJMlNQQ00gKEJUTV9TQ09fQ09ERUNfQ1ZTRCwgKFVJTlQ4KUhDSV9CUkNNX0kyU1BDTV9JU19ERUZBVUxUX1JPTEUsIChVSU5UOClIQ0lfQlJDTV9JMlNQQ01fU0FNUExFX0RFRkFVTFQsIChVSU5UOClIQ0lfQlJDTV9JMlNQQ01fQ0xPQ0tfREVGQVVMVCk7CisjZW5kaWYKKworI2lmIChCVE1fU0NPX0hDSV9JTkNMVURFRCA9PSBUUlVFICkKKyAgICAgICAgcGNtX3NhbXBsZV9yYXRlID0gQlRBX0RNX1NDT19TQU1QX1JBVEVfOEs7CisKKyAgICAgICAgLyogaW5pdGlhbGl6ZSBTQ08gc2V0dXAsIG5vIHZvaWNlIHNldHRpbmcgZm9yIEFHLCBkYXRhIHJhdGUgPD09PiBzYW1wbGUgcmF0ZSAqLworICAgICAgICBCVE1fQ29uZmlnU2NvUGF0aChidGFfZG1fc2NvX2NvX2luaXQocGNtX3NhbXBsZV9yYXRlLCBwY21fc2FtcGxlX3JhdGUsICZjb2RlY19pbmZvLCBwX3NjYi0+YXBwX2lkKSwKKyAgICAgICAgICAgIGJ0YV9hZ19zY29fcmVhZF9jYmFjaywgTlVMTCwgVFJVRSk7CisjZW5kaWYKKyAgICB9CisgICAgZWxzZQorICAgICAgICBoY2lfc3RhdHVzID0gSENJX0VSUl9IT1NUX1JFSkVDVF9ERVZJQ0U7CisKKyNpZiAoQlRNX1dCU19JTkNMVURFRCA9PSBUUlVFICkKKyAgICAvKiBJZiBTQ08gb3BlbiB3YXMgaW5pdGlhdGVkIGZyb20gSFMsIGl0IG11c3QgYmUgQ1ZTRCAqLworICAgIHBfc2NiLT5pbnVzZV9jb2RlYyA9IEJUQV9BR19DT0RFQ19OT05FOworI2VuZGlmCisKKyAgICBCVE1fRVNjb0Nvbm5Sc3AocF9kYXRhLT5zY29faW54LCBoY2lfc3RhdHVzLCAmcmVzcCk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisqKgorKiogRnVuY3Rpb24gICAgICAgICBidGFfYWdfY2lfc2NvX2RhdGEKKyoqCisqKiBEZXNjcmlwdGlvbiAgICAgIFByb2Nlc3MgdGhlIFNDTyBkYXRhIHJlYWR5IGNhbGxpbiBldmVudAorKioKKyoqCisqKiBSZXR1cm5zICAgICAgICAgIHZvaWQKKyoqCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordm9pZCBidGFfYWdfY2lfc2NvX2RhdGEodEJUQV9BR19TQ0IgKnBfc2NiLCB0QlRBX0FHX0RBVEEgKnBfZGF0YSkKK3sKKyAgICBVTlVTRUQocF9zY2IpOworICAgIFVOVVNFRChwX2RhdGEpOworCisjaWYgKEJUTV9TQ09fSENJX0lOQ0xVREVEID09IFRSVUUgKQorICAgIGJ0YV9hZ19zY29fZXZlbnQocF9zY2IsIEJUQV9BR19TQ09fQ0lfREFUQV9FKTsKKyNlbmRpZgorfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorKioKKyoqIEZ1bmN0aW9uICAgICAgICAgYnRhX2FnX3NldF9lc2NvX3BhcmFtCisqKgorKiogRGVzY3JpcHRpb24gICAgICBVcGRhdGUgZXNjbyBwYXJhbWV0ZXJzIGZyb20gc2NyaXB0IHdyYXBwZXIuCisqKgorKioKKyoqIFJldHVybnMgICAgICAgICAgdm9pZAorKioKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit2b2lkIGJ0YV9hZ19zZXRfZXNjb19wYXJhbShCT09MRUFOIHNldF9yZXNldCwgdEJUTV9FU0NPX1BBUkFNUyAqcGFyYW0pCit7CisgICAgaWYoc2V0X3Jlc2V0ID09IEZBTFNFKSAgICAvKiByZXNldCB0aGUgcGFyYW1ldGVycyB0byBkZWZhdWx0ICovCisgICAgeworICAgICAgICBidGFfYWdfY2Iuc2NvLnBhcmFtX3VwZGF0ZWQgPSBGQUxTRTsKKyAgICAgICAgQVBQTF9UUkFDRV9ERUJVRzAoImJ0YV9hZ19zZXRfZXNjb19wYXJhbSA6IFJlc2V0dGluZyBFU0NPIHBhcmFtZXRlcnMgdG8gZGVmYXVsdCIpOworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICBidGFfYWdfY2Iuc2NvLnBhcmFtX3VwZGF0ZWQgPSBUUlVFOworICAgICAgICBidGFfYWdfY2Iuc2NvLnBhcmFtcyA9ICpwYXJhbTsKKyAgICAgICAgQVBQTF9UUkFDRV9ERUJVRzAoImJ0YV9hZ19zZXRfZXNjb19wYXJhbSA6IFNldHRpbmcgRVNDTyBwYXJhbWV0ZXJzIik7CisgICAgfQorfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorKiogIERlYnVnZ2luZyBmdW5jdGlvbnMKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyNpZiBCVEFfQUdfU0NPX0RFQlVHID09IFRSVUUKK3N0YXRpYyBjaGFyICpidGFfYWdfc2NvX2V2dF9zdHIoVUlOVDggZXZlbnQpCit7CisgICAgc3dpdGNoIChldmVudCkKKyAgICB7CisgICAgY2FzZSBCVEFfQUdfU0NPX0xJU1RFTl9FOgorICAgICAgICByZXR1cm4gIkxpc3RlbiBSZXF1ZXN0IjsKKyAgICBjYXNlIEJUQV9BR19TQ09fT1BFTl9FOgorICAgICAgICByZXR1cm4gIk9wZW4gUmVxdWVzdCI7CisgICAgY2FzZSBCVEFfQUdfU0NPX1hGRVJfRToKKyAgICAgICAgcmV0dXJuICJUcmFuc2ZlciBSZXF1ZXN0IjsKKyNpZiAoQlRNX1dCU19JTkNMVURFRCA9PSBUUlVFICkKKyAgICBjYXNlIEJUQV9BR19TQ09fQ05fRE9ORV9FOgorICAgICAgICByZXR1cm4gIkNvZGVjIE5lZ290aWF0aW9uIERvbmUiOworICAgIGNhc2UgQlRBX0FHX1NDT19SRU9QRU5fRToKKyAgICAgICAgcmV0dXJuICJSZW9wZW4gUmVxdWVzdCI7CisjZW5kaWYKKyAgICBjYXNlIEJUQV9BR19TQ09fQ0xPU0VfRToKKyAgICAgICAgcmV0dXJuICJDbG9zZSBSZXF1ZXN0IjsKKyAgICBjYXNlIEJUQV9BR19TQ09fU0hVVERPV05fRToKKyAgICAgICAgcmV0dXJuICJTaHV0ZG93biBSZXF1ZXN0IjsKKyAgICBjYXNlIEJUQV9BR19TQ09fQ09OTl9PUEVOX0U6CisgICAgICAgIHJldHVybiAiT3BlbmVkIjsKKyAgICBjYXNlIEJUQV9BR19TQ09fQ09OTl9DTE9TRV9FOgorICAgICAgICByZXR1cm4gIkNsb3NlZCI7CisgICAgY2FzZSBCVEFfQUdfU0NPX0NJX0RBVEFfRSAgOgorICAgICAgICByZXR1cm4gIlNjbyBEYXRhIjsKKyAgICBkZWZhdWx0OgorICAgICAgICByZXR1cm4gIlVua25vd24gU0NPIEV2ZW50IjsKKyAgICB9Cit9CisKK3N0YXRpYyBjaGFyICpidGFfYWdfc2NvX3N0YXRlX3N0cihVSU5UOCBzdGF0ZSkKK3sKKyAgICBzd2l0Y2ggKHN0YXRlKQorICAgIHsKKyAgICBjYXNlIEJUQV9BR19TQ09fU0hVVERPV05fU1Q6CisgICAgICAgIHJldHVybiAiU2h1dGRvd24iOworICAgIGNhc2UgQlRBX0FHX1NDT19MSVNURU5fU1Q6CisgICAgICAgIHJldHVybiAiTGlzdGVuaW5nIjsKKyNpZiAoQlRNX1dCU19JTkNMVURFRCA9PSBUUlVFICkKKyAgICBjYXNlIEJUQV9BR19TQ09fQ09ERUNfU1Q6CisgICAgICAgIHJldHVybiAiQ29kZWMgTmVnb3RpYXRpb24iOworI2VuZGlmCisgICAgY2FzZSBCVEFfQUdfU0NPX09QRU5JTkdfU1Q6CisgICAgICAgIHJldHVybiAiT3BlbmluZyI7CisgICAgY2FzZSBCVEFfQUdfU0NPX09QRU5fQ0xfU1Q6CisgICAgICAgIHJldHVybiAiT3BlbiB3aGlsZSBjbG9zaW5nIjsKKyAgICBjYXNlIEJUQV9BR19TQ09fT1BFTl9YRkVSX1NUOgorICAgICAgICByZXR1cm4gIk9wZW5pbmcgd2hpbGUgVHJhbnNmZXJyaW5nIjsKKyAgICBjYXNlIEJUQV9BR19TQ09fT1BFTl9TVDoKKyAgICAgICAgcmV0dXJuICJPcGVuIjsKKyAgICBjYXNlIEJUQV9BR19TQ09fQ0xPU0lOR19TVDoKKyAgICAgICAgcmV0dXJuICJDbG9zaW5nIjsKKyAgICBjYXNlIEJUQV9BR19TQ09fQ0xPU0VfT1BfU1Q6CisgICAgICAgIHJldHVybiAiQ2xvc2Ugd2hpbGUgT3BlbmluZyI7CisgICAgY2FzZSBCVEFfQUdfU0NPX0NMT1NFX1hGRVJfU1Q6CisgICAgICAgIHJldHVybiAiQ2xvc2Ugd2hpbGUgVHJhbnNmZXJyaW5nIjsKKyAgICBjYXNlIEJUQV9BR19TQ09fU0hVVFRJTkdfU1Q6CisgICAgICAgIHJldHVybiAiU2h1dHRpbmcgRG93biI7CisgICAgZGVmYXVsdDoKKyAgICAgICAgcmV0dXJuICJVbmtub3duIFNDTyBTdGF0ZSI7CisgICAgfQorfQorCisjZW5kaWYKZGlmZiAtLWdpdCBhL2J0YS9oZl9jbGllbnQvYnRhX2hmX2NsaWVudF9zZHAuYyBiL2J0YS9oZl9jbGllbnQvYnRhX2hmX2NsaWVudF9zZHAuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zMzNjYjFiCi0tLSAvZGV2L251bGwKKysrIGIvYnRhL2hmX2NsaWVudC9idGFfaGZfY2xpZW50X3NkcC5jCkBAIC0wLDAgKzEsNTA0IEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgorICogIENvcHlyaWdodCAoQykgMjAwMy0yMDEyIEJyb2FkY29tIENvcnBvcmF0aW9uCisgKgorICogIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQ6CisgKgorICogIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoKKyAqICBUaGlzIGZpbGUgY29udGFpbnMgdGhlIGF1ZGlvIGdhdGV3YXkgZnVuY3Rpb25zIHBlcmZvcm1pbmcgU0RQCisgKiAgb3BlcmF0aW9ucy4KKyAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisjaW5jbHVkZSA8c3RyaW5nLmg+CisjaW5jbHVkZSAiYnRhX2FwaS5oIgorI2luY2x1ZGUgImJ0YV9zeXMuaCIKKyNpbmNsdWRlICJidGFfYWdfYXBpLmgiCisjaW5jbHVkZSAiYnRhX2FnX2ludC5oIgorI2luY2x1ZGUgInNkcF9hcGkuaCIKKyNpbmNsdWRlICJidG1fYXBpLmgiCisjaW5jbHVkZSAiZ2tpLmgiCisjaW5jbHVkZSAidXRsLmgiCisKKy8qIE51bWJlciBvZiBwcm90b2NvbCBlbGVtZW50cyBpbiBwcm90b2NvbCBlbGVtZW50IGxpc3QuICovCisjZGVmaW5lIEJUQV9BR19OVU1fUFJPVE9fRUxFTVMgICAgICAyCisKKy8qIE51bWJlciBvZiBlbGVtZW50cyBpbiBzZXJ2aWNlIGNsYXNzIGlkIGxpc3QuICovCisjZGVmaW5lIEJUQV9BR19OVU1fU1ZDX0VMRU1TICAgICAgICAyCisKKy8qIHNpemUgb2YgZGF0YWJhc2UgZm9yIHNlcnZpY2UgZGlzY292ZXJ5ICovCisjaWZuZGVmIEJUQV9BR19ESVNDX0JVRl9TSVpFCisjZGVmaW5lIEJUQV9BR19ESVNDX0JVRl9TSVpFICAgICAgICBHS0lfTUFYX0JVRl9TSVpFCisjZW5kaWYKKworLyogZGVjbGFyZSBzZHAgY2FsbGJhY2sgZnVuY3Rpb25zICovCit2b2lkIGJ0YV9hZ19zZHBfY2JhY2tfMShVSU5UMTYgc3RhdHVzKTsKK3ZvaWQgYnRhX2FnX3NkcF9jYmFja18yKFVJTlQxNiBzdGF0dXMpOwordm9pZCBidGFfYWdfc2RwX2NiYWNrXzMoVUlOVDE2IHN0YXR1cyk7CisKKy8qIFNEUCBjYWxsYmFjayBmdW5jdGlvbiB0YWJsZSAqLwordHlwZWRlZiB0U0RQX0RJU0NfQ01QTF9DQiAqdEJUQV9BR19TRFBfQ0JBQ0s7Citjb25zdCB0QlRBX0FHX1NEUF9DQkFDSyBidGFfYWdfc2RwX2NiYWNrX3RibFtdID0KK3sKKyAgICBidGFfYWdfc2RwX2NiYWNrXzEsCisgICAgYnRhX2FnX3NkcF9jYmFja18yLAorICAgIGJ0YV9hZ19zZHBfY2JhY2tfMworfTsKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyoqCisqKiBGdW5jdGlvbiAgICAgICAgIGJ0YV9hZ19zZHBfY2JhY2sKKyoqCisqKiBEZXNjcmlwdGlvbiAgICAgIFNEUCBjYWxsYmFjayBmdW5jdGlvbi4KKyoqCisqKgorKiogUmV0dXJucyAgICAgICAgICB2b2lkCisqKgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3N0YXRpYyB2b2lkIGJ0YV9hZ19zZHBfY2JhY2soVUlOVDE2IHN0YXR1cywgVUlOVDggaWR4KQoreworICAgIHRCVEFfQUdfRElTQ19SRVNVTFQgKnBfYnVmOworICAgIFVJTlQxNiAgICAgICAgICAgICAgZXZlbnQ7CisgICAgdEJUQV9BR19TQ0IgICAgICAgICAqcF9zY2I7CisKKyAgICBBUFBMX1RSQUNFX0RFQlVHMSgiYnRhX2FnX3NkcF9jYmFjayBzdGF0dXM6MHgleCIsIHN0YXR1cyk7CisKKyAgICBpZiAoKHBfc2NiID0gYnRhX2FnX3NjYl9ieV9pZHgoaWR4KSkgIT0gTlVMTCkKKyAgICB7CisgICAgICAgIC8qIHNldCBldmVudCBhY2NvcmRpbmcgdG8gaW50L2FjcCAqLworICAgICAgICBpZiAocF9zY2ItPnJvbGUgPT0gQlRBX0FHX0FDUCkKKyAgICAgICAgeworICAgICAgICAgICAgZXZlbnQgPSBCVEFfQUdfRElTQ19BQ1BfUkVTX0VWVDsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIGV2ZW50ID0gQlRBX0FHX0RJU0NfSU5UX1JFU19FVlQ7CisgICAgICAgIH0KKworICAgICAgICBpZiAoKHBfYnVmID0gKHRCVEFfQUdfRElTQ19SRVNVTFQgKikgR0tJX2dldGJ1ZihzaXplb2YodEJUQV9BR19ESVNDX1JFU1VMVCkpKSAhPSBOVUxMKQorICAgICAgICB7CisgICAgICAgICAgICBwX2J1Zi0+aGRyLmV2ZW50ID0gZXZlbnQ7CisgICAgICAgICAgICBwX2J1Zi0+aGRyLmxheWVyX3NwZWNpZmljID0gaWR4OworICAgICAgICAgICAgcF9idWYtPnN0YXR1cyA9IHN0YXR1czsKKyAgICAgICAgICAgIGJ0YV9zeXNfc2VuZG1zZyhwX2J1Zik7CisgICAgICAgIH0KKyAgICB9Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisqKgorKiogRnVuY3Rpb24gICAgICAgICBidGFfYWdfc2RwX2NiYWNrXzEgdG8gMworKioKKyoqIERlc2NyaXB0aW9uICAgICAgU0RQIGNhbGxiYWNrIGZ1bmN0aW9ucy4gIFNpbmNlIHRoZXJlIGlzIG5vIHdheSB0bworKiogICAgICAgICAgICAgICAgICBkaXN0aW5ndWlzaCBzY2IgZnJvbSB0aGUgY2FsbGJhY2sgd2UgbmVlZCBzZXBhcmF0ZQorKiogICAgICAgICAgICAgICAgICBjYWxsYmFja3MgZm9yIGVhY2ggc2NiLgorKioKKyoqCisqKiBSZXR1cm5zICAgICAgICAgIHZvaWQKKyoqCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordm9pZCBidGFfYWdfc2RwX2NiYWNrXzEoVUlOVDE2IHN0YXR1cykge2J0YV9hZ19zZHBfY2JhY2soc3RhdHVzLCAxKTt9Cit2b2lkIGJ0YV9hZ19zZHBfY2JhY2tfMihVSU5UMTYgc3RhdHVzKSB7YnRhX2FnX3NkcF9jYmFjayhzdGF0dXMsIDIpO30KK3ZvaWQgYnRhX2FnX3NkcF9jYmFja18zKFVJTlQxNiBzdGF0dXMpIHtidGFfYWdfc2RwX2NiYWNrKHN0YXR1cywgMyk7fQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisqKgorKiogRnVuY3Rpb24gICAgICAgICBidGFfYWdfYWRkX3JlY29yZAorKioKKyoqIERlc2NyaXB0aW9uICAgICAgVGhpcyBmdW5jdGlvbiBpcyBjYWxsZWQgYnkgYSBzZXJ2ZXIgYXBwbGljYXRpb24gdG8gYWRkCisqKiAgICAgICAgICAgICAgICAgIEhTUCBvciBIRlAgaW5mb3JtYXRpb24gdG8gYW4gU0RQIHJlY29yZC4gIFByaW9yIHRvCisqKiAgICAgICAgICAgICAgICAgIGNhbGxpbmcgdGhpcyBmdW5jdGlvbiB0aGUgYXBwbGljYXRpb24gbXVzdCBjYWxsCisqKiAgICAgICAgICAgICAgICAgIFNEUF9DcmVhdGVSZWNvcmQoKSB0byBjcmVhdGUgYW4gU0RQIHJlY29yZC4KKyoqCisqKiBSZXR1cm5zICAgICAgICAgIFRSVUUgaWYgZnVuY3Rpb24gZXhlY3V0aW9uIHN1Y2NlZWRlZCwKKyoqICAgICAgICAgICAgICAgICAgRkFMU0UgaWYgZnVuY3Rpb24gZXhlY3V0aW9uIGZhaWxlZC4KKyoqCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitCT09MRUFOIGJ0YV9hZ19hZGRfcmVjb3JkKFVJTlQxNiBzZXJ2aWNlX3V1aWQsIGNoYXIgKnBfc2VydmljZV9uYW1lLCBVSU5UOCBzY24sCisgICAgICAgICAgICAgICAgICAgICAgICAgIHRCVEFfQUdfRkVBVCBmZWF0dXJlcywgVUlOVDMyIHNkcF9oYW5kbGUpCit7CisgICAgdFNEUF9QUk9UT0NPTF9FTEVNICBwcm90b19lbGVtX2xpc3RbQlRBX0FHX05VTV9QUk9UT19FTEVNU107CisgICAgVUlOVDE2ICAgICAgICAgICAgICBzdmNfY2xhc3NfaWRfbGlzdFtCVEFfQUdfTlVNX1NWQ19FTEVNU107CisgICAgVUlOVDE2ICAgICAgICAgICAgICBicm93c2VfbGlzdFtdID0ge1VVSURfU0VSVkNMQVNTX1BVQkxJQ19CUk9XU0VfR1JPVVB9OworICAgIFVJTlQxNiAgICAgICAgICAgICAgdmVyc2lvbjsKKyAgICBVSU5UMTYgICAgICAgICAgICAgIHByb2ZpbGVfdXVpZDsKKyAgICBVSU5UOCAgICAgICAgICAgICAgIG5ldHdvcms7CisgICAgQk9PTEVBTiAgICAgICAgICAgICByZXN1bHQgPSBUUlVFOworICAgIEJPT0xFQU4gICAgICAgICAgICAgY29kZWNfc3VwcG9ydGVkID0gRkFMU0U7CisgICAgVUlOVDggICAgICAgICAgICAgICBidWZbMl07CisKKyAgICBBUFBMX1RSQUNFX0RFQlVHMSgiYnRhX2FnX2FkZF9yZWNvcmQgdXVpZDogJXgiLCBzZXJ2aWNlX3V1aWQpOworCisgICAgbWVtc2V0KCBwcm90b19lbGVtX2xpc3QsIDAgLCBCVEFfQUdfTlVNX1BST1RPX0VMRU1TKnNpemVvZih0U0RQX1BST1RPQ09MX0VMRU0pKTsKKworICAgIC8qIGFkZCB0aGUgcHJvdG9jb2wgZWxlbWVudCBzZXF1ZW5jZSAqLworICAgIHByb3RvX2VsZW1fbGlzdFswXS5wcm90b2NvbF91dWlkID0gVVVJRF9QUk9UT0NPTF9MMkNBUDsKKyAgICBwcm90b19lbGVtX2xpc3RbMF0ubnVtX3BhcmFtcyA9IDA7CisgICAgcHJvdG9fZWxlbV9saXN0WzFdLnByb3RvY29sX3V1aWQgPSBVVUlEX1BST1RPQ09MX1JGQ09NTTsKKyAgICBwcm90b19lbGVtX2xpc3RbMV0ubnVtX3BhcmFtcyA9IDE7CisgICAgcHJvdG9fZWxlbV9saXN0WzFdLnBhcmFtc1swXSA9IHNjbjsKKyAgICByZXN1bHQgJj0gU0RQX0FkZFByb3RvY29sTGlzdChzZHBfaGFuZGxlLCBCVEFfQUdfTlVNX1BST1RPX0VMRU1TLCBwcm90b19lbGVtX2xpc3QpOworCisgICAgLyogYWRkIHNlcnZpY2UgY2xhc3MgaWQgbGlzdCAqLworICAgIHN2Y19jbGFzc19pZF9saXN0WzBdID0gc2VydmljZV91dWlkOworICAgIHN2Y19jbGFzc19pZF9saXN0WzFdID0gVVVJRF9TRVJWQ0xBU1NfR0VORVJJQ19BVURJTzsKKyAgICByZXN1bHQgJj0gU0RQX0FkZFNlcnZpY2VDbGFzc0lkTGlzdChzZHBfaGFuZGxlLCBCVEFfQUdfTlVNX1NWQ19FTEVNUywgc3ZjX2NsYXNzX2lkX2xpc3QpOworCisgICAgLyogYWRkIHByb2ZpbGUgZGVzY3JpcHRvciBsaXN0ICovCisgICAgaWYgKHNlcnZpY2VfdXVpZCA9PSBVVUlEX1NFUlZDTEFTU19BR19IQU5EU0ZSRUUpCisgICAgeworICAgICAgICBwcm9maWxlX3V1aWQgPSBVVUlEX1NFUlZDTEFTU19IRl9IQU5EU0ZSRUU7CisgICAgICAgIHZlcnNpb24gPSBIRlBfVkVSU0lPTl8xXzY7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgIHByb2ZpbGVfdXVpZCA9IFVVSURfU0VSVkNMQVNTX0hFQURTRVQ7CisgICAgICAgIHZlcnNpb24gPSBIU1BfVkVSU0lPTl8xXzI7CisgICAgfQorICAgIHJlc3VsdCAmPSBTRFBfQWRkUHJvZmlsZURlc2NyaXB0b3JMaXN0KHNkcF9oYW5kbGUsIHByb2ZpbGVfdXVpZCwgdmVyc2lvbik7CisKKyAgICAvKiBhZGQgc2VydmljZSBuYW1lICovCisgICAgaWYgKHBfc2VydmljZV9uYW1lICE9IE5VTEwgJiYgcF9zZXJ2aWNlX25hbWVbMF0gIT0gMCkKKyAgICB7CisgICAgICAgIHJlc3VsdCAmPSBTRFBfQWRkQXR0cmlidXRlKHNkcF9oYW5kbGUsIEFUVFJfSURfU0VSVklDRV9OQU1FLCBURVhUX1NUUl9ERVNDX1RZUEUsCisgICAgICAgICAgICAgICAgICAgIChVSU5UMzIpKHN0cmxlbihwX3NlcnZpY2VfbmFtZSkrMSksIChVSU5UOCAqKSBwX3NlcnZpY2VfbmFtZSk7CisgICAgfQorCisgICAgLyogYWRkIGZlYXR1cmVzIGFuZCBuZXR3b3JrICovCisgICAgaWYgKHNlcnZpY2VfdXVpZCA9PSBVVUlEX1NFUlZDTEFTU19BR19IQU5EU0ZSRUUpCisgICAgeworICAgICAgICBuZXR3b3JrID0gKGZlYXR1cmVzICYgQlRBX0FHX0ZFQVRfUkVKRUNUKSA/IDEgOiAwOworICAgICAgICByZXN1bHQgJj0gU0RQX0FkZEF0dHJpYnV0ZShzZHBfaGFuZGxlLCBBVFRSX0lEX0RBVEFfU1RPUkVTX09SX05FVFdPUkssCisgICAgICAgICAgICAgICAgICAgIFVJTlRfREVTQ19UWVBFLCAxLCAmbmV0d29yayk7CisKKyAgICAgICAgaWYgKGZlYXR1cmVzICYgQlRBX0FHX0ZFQVRfQ09ERUMpCisgICAgICAgICAgICBjb2RlY19zdXBwb3J0ZWQgPSBUUlVFOworCisgICAgICAgIGZlYXR1cmVzICY9IEJUQV9BR19TRFBfRkVBVF9TUEVDOworCisgICAgICAgIC8qIENvZGVjIGJpdCBwb3NpdGlvbiBpcyBkaWZmZXJlbnQgaW4gU0RQIGFuZCBpbiBCUlNGICovCisgICAgICAgIGlmIChjb2RlY19zdXBwb3J0ZWQpCisgICAgICAgICAgICBmZWF0dXJlcyB8PSAweDAwMjA7CisKKyAgICAgICAgVUlOVDE2X1RPX0JFX0ZJRUxEKGJ1ZiwgZmVhdHVyZXMpOworICAgICAgICByZXN1bHQgJj0gU0RQX0FkZEF0dHJpYnV0ZShzZHBfaGFuZGxlLCBBVFRSX0lEX1NVUFBPUlRFRF9GRUFUVVJFUywgVUlOVF9ERVNDX1RZUEUsIDIsIGJ1Zik7CisgICAgfQorCisgICAgLyogYWRkIGJyb3dzZSBncm91cCBsaXN0ICovCisgICAgcmVzdWx0ICY9IFNEUF9BZGRVdWlkU2VxdWVuY2Uoc2RwX2hhbmRsZSwgQVRUUl9JRF9CUk9XU0VfR1JPVVBfTElTVCwgMSwgYnJvd3NlX2xpc3QpOworCisgICAgcmV0dXJuIHJlc3VsdDsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyoqCisqKiBGdW5jdGlvbiAgICAgICAgIGJ0YV9hZ19jcmVhdGVfcmVjb3JkcworKioKKyoqIERlc2NyaXB0aW9uICAgICAgQ3JlYXRlIFNEUCByZWNvcmRzIGZvciByZWdpc3RlcmVkIHNlcnZpY2VzLgorKioKKyoqCisqKiBSZXR1cm5zICAgICAgICAgIHZvaWQKKyoqCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordm9pZCBidGFfYWdfY3JlYXRlX3JlY29yZHModEJUQV9BR19TQ0IgKnBfc2NiLCB0QlRBX0FHX0RBVEEgKnBfZGF0YSkKK3sKKyAgICBpbnQgICAgICAgICAgICAgICAgIGk7CisgICAgdEJUQV9TRVJWSUNFX01BU0sgICBzZXJ2aWNlczsKKworICAgIHNlcnZpY2VzID0gcF9zY2ItPnJlZ19zZXJ2aWNlcyA+PiBCVEFfSFNQX1NFUlZJQ0VfSUQ7CisgICAgZm9yIChpID0gMDsgaSA8IEJUQV9BR19OVU1fSURYICYmIHNlcnZpY2VzICE9IDA7IGkrKywgc2VydmljZXMgPj49IDEpCisgICAgeworICAgICAgICAvKiBpZiBzZXJ2aWNlIGlzIHNldCBpbiBtYXNrICovCisgICAgICAgIGlmIChzZXJ2aWNlcyAmIDEpCisgICAgICAgIHsKKyAgICAgICAgICAgIC8qIGFkZCBzZHAgcmVjb3JkIGlmIG5vdCBhbHJlYWR5IHJlZ2lzdGVyZWQgKi8KKyAgICAgICAgICAgIGlmIChidGFfYWdfY2IucHJvZmlsZVtpXS5zZHBfaGFuZGxlID09IDApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgYnRhX2FnX2NiLnByb2ZpbGVbaV0uc2RwX2hhbmRsZSA9IFNEUF9DcmVhdGVSZWNvcmQoKTsKKyAgICAgICAgICAgICAgICBidGFfYWdfY2IucHJvZmlsZVtpXS5zY24gPSBCVE1fQWxsb2NhdGVTQ04oKTsKKyAgICAgICAgICAgICAgICBidGFfYWdfYWRkX3JlY29yZChidGFfYWdfdXVpZFtpXSwgcF9kYXRhLT5hcGlfcmVnaXN0ZXIucF9uYW1lW2ldLAorICAgICAgICAgICAgICAgICAgICBidGFfYWdfY2IucHJvZmlsZVtpXS5zY24sIHBfZGF0YS0+YXBpX3JlZ2lzdGVyLmZlYXR1cmVzLAorICAgICAgICAgICAgICAgICAgICBidGFfYWdfY2IucHJvZmlsZVtpXS5zZHBfaGFuZGxlKTsKKyAgICAgICAgICAgICAgICBidGFfc3lzX2FkZF91dWlkKGJ0YV9hZ191dWlkW2ldKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIHBfc2NiLT5oc3BfdmVyc2lvbiA9IEhTUF9WRVJTSU9OXzFfMjsKKworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorKioKKyoqIEZ1bmN0aW9uICAgICAgICAgYnRhX2FnX2RlbF9yZWNvcmRzCisqKgorKiogRGVzY3JpcHRpb24gICAgICBEZWxldGUgU0RQIHJlY29yZHMgZm9yIGFueSByZWdpc3RlcmVkIHNlcnZpY2VzLgorKioKKyoqCisqKiBSZXR1cm5zICAgICAgICAgIHZvaWQKKyoqCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordm9pZCBidGFfYWdfZGVsX3JlY29yZHModEJUQV9BR19TQ0IgKnBfc2NiLCB0QlRBX0FHX0RBVEEgKnBfZGF0YSkKK3sKKyAgICB0QlRBX0FHX1NDQiAgICAgICAgICpwID0gJmJ0YV9hZ19jYi5zY2JbMF07CisgICAgdEJUQV9TRVJWSUNFX01BU0sgICBzZXJ2aWNlczsKKyAgICB0QlRBX1NFUlZJQ0VfTUFTSyAgIG90aGVycyA9IDA7CisgICAgaW50ICAgICAgICAgICAgICAgICBpOworICAgIFVOVVNFRChwX2RhdGEpOworCisgICAgLyogZ2V0IHNlcnZpY2VzIG9mIGFsbCBvdGhlciByZWdpc3RlcmVkIHNlcnZlcnMgKi8KKyAgICBmb3IgKGkgPSAwOyBpIDwgQlRBX0FHX05VTV9JRFg7IGkrKywgcCsrKQorICAgIHsKKyAgICAgICAgaWYgKHBfc2NiID09IHApCisgICAgICAgIHsKKyAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICB9CisKKyAgICAgICAgaWYgKHAtPmluX3VzZSAmJiBwLT5kZWFsbG9jID09IEZBTFNFKQorICAgICAgICB7CisgICAgICAgICAgICBvdGhlcnMgfD0gcC0+cmVnX3NlcnZpY2VzOworICAgICAgICB9CisgICAgfQorCisgICAgb3RoZXJzID4+PSBCVEFfSFNQX1NFUlZJQ0VfSUQ7CisgICAgc2VydmljZXMgPSBwX3NjYi0+cmVnX3NlcnZpY2VzID4+IEJUQV9IU1BfU0VSVklDRV9JRDsKKyAgICBmb3IgKGkgPSAwOyBpIDwgQlRBX0FHX05VTV9JRFggJiYgc2VydmljZXMgIT0gMDsgaSsrLCBzZXJ2aWNlcyA+Pj0gMSwgb3RoZXJzID4+PSAxKQorICAgIHsKKyAgICAgICAgLyogaWYgc2VydmljZSByZWdpc3RlcmVkIGZvciB0aGlzIHNjYiBhbmQgbm90IHJlZ2lzdGVyZWQgZm9yIGFueSBvdGhlciBzY2IgKi8KKyAgICAgICAgaWYgKCgoc2VydmljZXMgJiAxKSA9PSAxKSAmJiAoKG90aGVycyAmIDEpID09IDApKQorICAgICAgICB7CisgICAgICAgICAgICBBUFBMX1RSQUNFX0RFQlVHMSgiYnRhX2FnX2RlbF9yZWNvcmRzICVkIiwgaSk7CisgICAgICAgICAgICBpZiAoYnRhX2FnX2NiLnByb2ZpbGVbaV0uc2RwX2hhbmRsZSAhPSAwKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIFNEUF9EZWxldGVSZWNvcmQoYnRhX2FnX2NiLnByb2ZpbGVbaV0uc2RwX2hhbmRsZSk7CisgICAgICAgICAgICAgICAgYnRhX2FnX2NiLnByb2ZpbGVbaV0uc2RwX2hhbmRsZSA9IDA7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBCVE1fRnJlZVNDTihidGFfYWdfY2IucHJvZmlsZVtpXS5zY24pOworICAgICAgICAgICAgQlRNX1NlY0NsclNlcnZpY2UoYnRhX2FnX3NlY19pZFtpXSk7CisgICAgICAgICAgICBidGFfc3lzX3JlbW92ZV91dWlkKGJ0YV9hZ191dWlkW2ldKTsKKyAgICAgICAgfQorICAgIH0KK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyoqCisqKiBGdW5jdGlvbiAgICAgICAgIGJ0YV9hZ19zZHBfZmluZF9hdHRyCisqKgorKiogRGVzY3JpcHRpb24gICAgICBQcm9jZXNzIFNEUCBkaXNjb3ZlcnkgcmVzdWx0cyB0byBmaW5kIHJlcXVlc3RlZCBhdHRyaWJ1dGVzCisqKiAgICAgICAgICAgICAgICAgIGZvciByZXF1ZXN0ZWQgc2VydmljZS4KKyoqCisqKgorKiogUmV0dXJucyAgICAgICAgICBUUlVFIGlmIHJlc3VsdHMgZm91bmQsIEZBTFNFIG90aGVyd2lzZS4KKyoqCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworQk9PTEVBTiBidGFfYWdfc2RwX2ZpbmRfYXR0cih0QlRBX0FHX1NDQiAqcF9zY2IsIHRCVEFfU0VSVklDRV9NQVNLIHNlcnZpY2UpCit7CisgICAgdFNEUF9ESVNDX1JFQyAgICAgICAqcF9yZWMgPSBOVUxMOworICAgIHRTRFBfRElTQ19BVFRSICAgICAgKnBfYXR0cjsKKyAgICB0U0RQX1BST1RPQ09MX0VMRU0gIHBlOworICAgIFVJTlQxNiAgICAgICAgICAgICAgdXVpZDsKKyAgICBCT09MRUFOICAgICAgICAgICAgIHJlc3VsdCA9IEZBTFNFOworCisgICAgaWYgKHNlcnZpY2UgJiBCVEFfSEZQX1NFUlZJQ0VfTUFTSykKKyAgICB7CisgICAgICAgIHV1aWQgPSBVVUlEX1NFUlZDTEFTU19IRl9IQU5EU0ZSRUU7CisgICAgICAgIHBfc2NiLT5wZWVyX3ZlcnNpb24gPSBIRlBfVkVSU0lPTl8xXzE7ICAgLyogRGVmYXVsdCB2ZXJzaW9uICovCisgICAgfQorICAgIGVsc2UgaWYgKHNlcnZpY2UgJiBCVEFfSFNQX1NFUlZJQ0VfTUFTSyAmJiBwX3NjYi0+cm9sZSA9PSBCVEFfQUdfSU5UKQorICAgIHsKKyAgICAgICAgdXVpZCA9IFVVSURfU0VSVkNMQVNTX0hFQURTRVRfSFM7CisgICAgICAgIHBfc2NiLT5wZWVyX3ZlcnNpb24gPSAweDAxMDA7ICAgLyogRGVmYXVsdCB2ZXJzaW9uICovCisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgIHJldHVybiByZXN1bHQ7CisgICAgfQorCisgICAgLyogbG9vcCB0aHJvdWdoIGFsbCByZWNvcmRzIHdlIGZvdW5kICovCisgICAgd2hpbGUgKFRSVUUpCisgICAgeworICAgICAgICAvKiBnZXQgbmV4dCByZWNvcmQ7IGlmIG5vbmUgZm91bmQsIHdlJ3JlIGRvbmUgKi8KKyAgICAgICAgaWYgKChwX3JlYyA9IFNEUF9GaW5kU2VydmljZUluRGIocF9zY2ItPnBfZGlzY19kYiwgdXVpZCwgcF9yZWMpKSA9PSBOVUxMKQorICAgICAgICB7CisgICAgICAgICAgICBpZiAodXVpZCA9PSBVVUlEX1NFUlZDTEFTU19IRUFEU0VUX0hTKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIC8qIFNlYXJjaCBhZ2FpbiBpbiBjYXNlIHRoZSBwZWVyIGRldmljZSBpcyBIU1AgdjEuMCAqLworICAgICAgICAgICAgICAgIHV1aWQgPSBVVUlEX1NFUlZDTEFTU19IRUFEU0VUOworICAgICAgICAgICAgICAgIGlmICgocF9yZWMgPSBTRFBfRmluZFNlcnZpY2VJbkRiKHBfc2NiLT5wX2Rpc2NfZGIsIHV1aWQsIHBfcmVjKSkgPT0gTlVMTCkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorCisgICAgICAgIC8qIGdldCBzY24gZnJvbSBwcm90byBkZXNjIGxpc3QgaWYgaW5pdGlhdG9yICovCisgICAgICAgIGlmIChwX3NjYi0+cm9sZSA9PSBCVEFfQUdfSU5UKQorICAgICAgICB7CisgICAgICAgICAgICBpZiAoU0RQX0ZpbmRQcm90b2NvbExpc3RFbGVtSW5SZWMocF9yZWMsIFVVSURfUFJPVE9DT0xfUkZDT01NLCAmcGUpKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHBfc2NiLT5wZWVyX3NjbiA9IChVSU5UOCkgcGUucGFyYW1zWzBdOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgLyogZ2V0IHByb2ZpbGUgdmVyc2lvbiAoaWYgZmFpbHVyZSwgdmVyc2lvbiBwYXJhbWV0ZXIgaXMgbm90IHVwZGF0ZWQpICovCisgICAgICAgIFNEUF9GaW5kUHJvZmlsZVZlcnNpb25JblJlYyhwX3JlYywgdXVpZCwgJnBfc2NiLT5wZWVyX3ZlcnNpb24pOworCisgICAgICAgIC8qIGdldCBmZWF0dXJlcyBpZiBIRlAgKi8KKyAgICAgICAgaWYgKHNlcnZpY2UgJiBCVEFfSEZQX1NFUlZJQ0VfTUFTSykKKyAgICAgICAgeworICAgICAgICAgICAgaWYgKChwX2F0dHIgPSBTRFBfRmluZEF0dHJpYnV0ZUluUmVjKHBfcmVjLCBBVFRSX0lEX1NVUFBPUlRFRF9GRUFUVVJFUykpICE9IE5VTEwpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgLyogRm91bmQgYXR0cmlidXRlLiBHZXQgdmFsdWUuICovCisgICAgICAgICAgICAgICAgLyogVGhlcmUgbWlnaHQgYmUgcmFjZSBjb25kaXRpb24gYmV0d2VlbiBTRFAgYW5kIEJSU0YuICAqLworICAgICAgICAgICAgICAgIC8qIERvIG5vdCB1cGRhdGUgaWYgd2UgYWxyZWFkeSByZWNlaXZlZCBCUlNGLiAgICAgICAgICAgKi8KKyAgICAgICAgICAgICAgICBpZiAocF9zY2ItPnBlZXJfZmVhdHVyZXMgPT0gMCkKKyAgICAgICAgICAgICAgICAgICAgcF9zY2ItPnBlZXJfZmVhdHVyZXMgPSBwX2F0dHItPmF0dHJfdmFsdWUudi51MTY7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgZWxzZSAgICAvKiBIU1AgKi8KKyAgICAgICAgeworICAgICAgICAgICAgaWYgKChwX2F0dHIgPSBTRFBfRmluZEF0dHJpYnV0ZUluUmVjKHBfcmVjLCBBVFRSX0lEX1JFTU9URV9BVURJT19WT0xVTUVfQ09OVFJPTCkpICE9IE5VTEwpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgLyogUmVtb3RlIHZvbHVtZSBjb250cm9sIG9mIEhTUCAqLworICAgICAgICAgICAgICAgIGlmIChwX2F0dHItPmF0dHJfdmFsdWUudi51OCkKKyAgICAgICAgICAgICAgICAgICAgcF9zY2ItPnBlZXJfZmVhdHVyZXMgfD0gQlRBX0FHX1BFRVJfRkVBVF9WT0w7CisgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICBwX3NjYi0+cGVlcl9mZWF0dXJlcyAmPSB+QlRBX0FHX1BFRVJfRkVBVF9WT0w7CisgICAgICAgICAgICB9CisKKyAgICAgICAgfQorCisgICAgICAgIC8qIGZvdW5kIHdoYXQgd2UgbmVlZGVkICovCisgICAgICAgIHJlc3VsdCA9IFRSVUU7CisgICAgICAgIGJyZWFrOworICAgIH0KKyAgICByZXR1cm4gcmVzdWx0OworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorKioKKyoqIEZ1bmN0aW9uICAgICAgICAgYnRhX2FnX2RvX2Rpc2MKKyoqCisqKiBEZXNjcmlwdGlvbiAgICAgIERvIHNlcnZpY2UgZGlzY292ZXJ5LgorKioKKyoqCisqKiBSZXR1cm5zICAgICAgICAgIHZvaWQKKyoqCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordm9pZCBidGFfYWdfZG9fZGlzYyh0QlRBX0FHX1NDQiAqcF9zY2IsIHRCVEFfU0VSVklDRV9NQVNLIHNlcnZpY2UpCit7CisgICAgdFNEUF9VVUlEICAgICAgIHV1aWRfbGlzdFsyXTsKKyAgICBVSU5UMTYgICAgICAgICAgbnVtX3V1aWQgPSAxOworICAgIFVJTlQxNiAgICAgICAgICBhdHRyX2xpc3RbNF07CisgICAgVUlOVDggICAgICAgICAgIG51bV9hdHRyOworICAgIEJPT0xFQU4gICAgICAgICBkYl9pbml0ZWQgPSBGQUxTRTsKKworICAgIC8qIEhGUCBpbml0aWF0b3I7IGdldCBwcm90byBsaXN0IGFuZCBmZWF0dXJlcyAqLworICAgIGlmIChzZXJ2aWNlICYgQlRBX0hGUF9TRVJWSUNFX01BU0sgJiYgcF9zY2ItPnJvbGUgPT0gQlRBX0FHX0lOVCkKKyAgICB7CisgICAgICAgIGF0dHJfbGlzdFswXSA9IEFUVFJfSURfU0VSVklDRV9DTEFTU19JRF9MSVNUOworICAgICAgICBhdHRyX2xpc3RbMV0gPSBBVFRSX0lEX1BST1RPQ09MX0RFU0NfTElTVDsKKyAgICAgICAgYXR0cl9saXN0WzJdID0gQVRUUl9JRF9CVF9QUk9GSUxFX0RFU0NfTElTVDsKKyAgICAgICAgYXR0cl9saXN0WzNdID0gQVRUUl9JRF9TVVBQT1JURURfRkVBVFVSRVM7CisgICAgICAgIG51bV9hdHRyID0gNDsKKyAgICAgICAgdXVpZF9saXN0WzBdLnV1LnV1aWQxNiA9IFVVSURfU0VSVkNMQVNTX0hGX0hBTkRTRlJFRTsKKyAgICB9CisgICAgLyogSEZQIGFjY2VwdG9yOyBnZXQgZmVhdHVyZXMgKi8KKyAgICBlbHNlIGlmIChzZXJ2aWNlICYgQlRBX0hGUF9TRVJWSUNFX01BU0sgJiYgcF9zY2ItPnJvbGUgPT0gQlRBX0FHX0FDUCkKKyAgICB7CisgICAgICAgIGF0dHJfbGlzdFswXSA9IEFUVFJfSURfU0VSVklDRV9DTEFTU19JRF9MSVNUOworICAgICAgICBhdHRyX2xpc3RbMV0gPSBBVFRSX0lEX0JUX1BST0ZJTEVfREVTQ19MSVNUOworICAgICAgICBhdHRyX2xpc3RbMl0gPSBBVFRSX0lEX1NVUFBPUlRFRF9GRUFUVVJFUzsKKyAgICAgICAgbnVtX2F0dHIgPSAzOworICAgICAgICB1dWlkX2xpc3RbMF0udXUudXVpZDE2ID0gVVVJRF9TRVJWQ0xBU1NfSEZfSEFORFNGUkVFOworICAgIH0KKyAgICAvKiBIU1AgaW5pdGlhdG9yOyBnZXQgcHJvdG8gbGlzdCAqLworICAgIGVsc2UgaWYgKHNlcnZpY2UgJiBCVEFfSFNQX1NFUlZJQ0VfTUFTSyAmJiBwX3NjYi0+cm9sZSA9PSBCVEFfQUdfSU5UKQorICAgIHsKKyAgICAgICAgYXR0cl9saXN0WzBdID0gQVRUUl9JRF9TRVJWSUNFX0NMQVNTX0lEX0xJU1Q7CisgICAgICAgIGF0dHJfbGlzdFsxXSA9IEFUVFJfSURfUFJPVE9DT0xfREVTQ19MSVNUOworICAgICAgICBhdHRyX2xpc3RbMl0gPSBBVFRSX0lEX0JUX1BST0ZJTEVfREVTQ19MSVNUOworICAgICAgICBhdHRyX2xpc3RbM10gPSBBVFRSX0lEX1JFTU9URV9BVURJT19WT0xVTUVfQ09OVFJPTDsKKyAgICAgICAgbnVtX2F0dHIgPSA0OworCisgICAgICAgIHV1aWRfbGlzdFswXS51dS51dWlkMTYgPSBVVUlEX1NFUlZDTEFTU19IRUFEU0VUOyAgICAgICAgLyogTGVnYWN5IGZyb20gSFNQIHYxLjAgKi8KKyAgICAgICAgaWYgKHBfc2NiLT5oc3BfdmVyc2lvbiA+PSBIU1BfVkVSU0lPTl8xXzIpCisgICAgICAgIHsKKyAgICAgICAgICAgIHV1aWRfbGlzdFsxXS51dS51dWlkMTYgPSBVVUlEX1NFUlZDTEFTU19IRUFEU0VUX0hTOworICAgICAgICAgICAgbnVtX3V1aWQgPSAyOworICAgICAgICB9CisgICAgfQorICAgIC8qIEhTUCBhY2NlcHRvcjsgbm8gZGlzY292ZXJ5ICovCisgICAgZWxzZQorICAgIHsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIC8qIGFsbG9jYXRlIGJ1ZmZlciBmb3Igc2RwIGRhdGFiYXNlICovCisgICAgcF9zY2ItPnBfZGlzY19kYiA9ICh0U0RQX0RJU0NPVkVSWV9EQiAqKSBHS0lfZ2V0YnVmKEJUQV9BR19ESVNDX0JVRl9TSVpFKTsKKworICAgIGlmKHBfc2NiLT5wX2Rpc2NfZGIpCisgICAgeworICAgICAgICAvKiBzZXQgdXAgc2VydmljZSBkaXNjb3ZlcnkgZGF0YWJhc2U7IGF0dHIgaGFwcGVucyB0byBiZSBhdHRyX2xpc3QgbGVuICovCisgICAgICAgIHV1aWRfbGlzdFswXS5sZW4gPSBMRU5fVVVJRF8xNjsKKyAgICAgICAgdXVpZF9saXN0WzFdLmxlbiA9IExFTl9VVUlEXzE2OworICAgICAgICBkYl9pbml0ZWQgPSBTRFBfSW5pdERpc2NvdmVyeURiKHBfc2NiLT5wX2Rpc2NfZGIsIEJUQV9BR19ESVNDX0JVRl9TSVpFLCBudW1fdXVpZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB1dWlkX2xpc3QsIG51bV9hdHRyLCBhdHRyX2xpc3QpOworICAgIH0KKworICAgIGlmKGRiX2luaXRlZCkKKyAgICB7CisgICAgICAgIC8qU2VydmljZSBkaXNjb3Zlcnkgbm90IGluaXRpYXRlZCAqLworICAgICAgICBkYl9pbml0ZWQgPSBTRFBfU2VydmljZVNlYXJjaEF0dHJpYnV0ZVJlcXVlc3QocF9zY2ItPnBlZXJfYWRkciwgcF9zY2ItPnBfZGlzY19kYiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnRhX2FnX3NkcF9jYmFja190YmxbYnRhX2FnX3NjYl90b19pZHgocF9zY2IpIC0gMV0pOworICAgIH0KKworICAgIGlmKCFkYl9pbml0ZWQpCisgICAgeworICAgICAgICAvKmZyZWUgZGlzY292ZXIgZGIgKi8KKyAgICAgICAgYnRhX2FnX2ZyZWVfZGIocF9zY2IsIE5VTEwpOworICAgICAgICAvKiBzZW50IGZhaWxlZCBldmVudCAqLworICAgICAgICBidGFfYWdfc21fZXhlY3V0ZShwX3NjYiwgQlRBX0FHX0RJU0NfRkFJTF9FVlQsIE5VTEwpOworICAgIH0KKworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorKioKKyoqIEZ1bmN0aW9uICAgICAgICAgYnRhX2FnX2ZyZWVfZGIKKyoqCisqKiBEZXNjcmlwdGlvbiAgICAgIEZyZWUgZGlzY292ZXJ5IGRhdGFiYXNlLgorKioKKyoqCisqKiBSZXR1cm5zICAgICAgICAgIHZvaWQKKyoqCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordm9pZCBidGFfYWdfZnJlZV9kYih0QlRBX0FHX1NDQiAqcF9zY2IsIHRCVEFfQUdfREFUQSAqcF9kYXRhKQoreworICAgIFVOVVNFRChwX2RhdGEpOworCisgICAgaWYgKHBfc2NiLT5wX2Rpc2NfZGIgIT0gTlVMTCkKKyAgICB7CisgICAgICAgIEdLSV9mcmVlYnVmKHBfc2NiLT5wX2Rpc2NfZGIpOworICAgICAgICBwX3NjYi0+cF9kaXNjX2RiID0gTlVMTDsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9idGEvaW5jbHVkZS9idGFfaGZfY2xpZW50X2FwaS5oIGIvYnRhL2luY2x1ZGUvYnRhX2hmX2NsaWVudF9hcGkuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mMTY2ODdjCi0tLSAvZGV2L251bGwKKysrIGIvYnRhL2luY2x1ZGUvYnRhX2hmX2NsaWVudF9hcGkuaApAQCAtMCwwICsxLDUxNCBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoKKyAqICBDb3B5cmlnaHQgKEMpIDIwMDMtMjAxMiBCcm9hZGNvbSBDb3Jwb3JhdGlvbgorICoKKyAqICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0OgorICoKKyAqICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCisgKiAgVGhpcyBpcyB0aGUgcHVibGljIGludGVyZmFjZSBmaWxlIGZvciB0aGUgYXVkaW8gZ2F0ZXdheSAoQUcpIHN1YnN5c3RlbQorICogIG9mIEJUQSwgQnJvYWRjb20ncyBCbHVldG9vdGggYXBwbGljYXRpb24gbGF5ZXIgZm9yIG1vYmlsZSBwaG9uZXMuCisgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNpZm5kZWYgQlRBX0FHX0FQSV9ICisjZGVmaW5lIEJUQV9BR19BUElfSAorCisjaW5jbHVkZSAiYnRhX2FwaS5oIgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyoqICBDb25zdGFudHMgYW5kIGRhdGEgdHlwZXMKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisvKiBBRyBmZWF0dXJlIG1hc2tzICovCisjZGVmaW5lIEJUQV9BR19GRUFUXzNXQVkgICAgMHgwMDAwMDAwMSAgIC8qIFRocmVlLXdheSBjYWxsaW5nICovCisjZGVmaW5lIEJUQV9BR19GRUFUX0VDTlIgICAgMHgwMDAwMDAwMiAgIC8qIEVjaG8gY2FuY2VsbGF0aW9uIGFuZC9vciBub2lzZSByZWR1Y3Rpb24gKi8KKyNkZWZpbmUgQlRBX0FHX0ZFQVRfVlJFQyAgICAweDAwMDAwMDA0ICAgLyogVm9pY2UgcmVjb2duaXRpb24gKi8KKyNkZWZpbmUgQlRBX0FHX0ZFQVRfSU5CQU5EICAweDAwMDAwMDA4ICAgLyogSW4tYmFuZCByaW5nIHRvbmUgKi8KKyNkZWZpbmUgQlRBX0FHX0ZFQVRfVlRBRyAgICAweDAwMDAwMDEwICAgLyogQXR0YWNoIGEgcGhvbmUgbnVtYmVyIHRvIGEgdm9pY2UgdGFnICovCisjZGVmaW5lIEJUQV9BR19GRUFUX1JFSkVDVCAgMHgwMDAwMDAyMCAgIC8qIEFiaWxpdHkgdG8gcmVqZWN0IGluY29taW5nIGNhbGwgKi8KKyNkZWZpbmUgQlRBX0FHX0ZFQVRfRUNTICAgICAweDAwMDAwMDQwICAgLyogRW5oYW5jZWQgQ2FsbCBTdGF0dXMgKi8KKyNkZWZpbmUgQlRBX0FHX0ZFQVRfRUNDICAgICAweDAwMDAwMDgwICAgLyogRW5oYW5jZWQgQ2FsbCBDb250cm9sICovCisjZGVmaW5lIEJUQV9BR19GRUFUX0VYVEVSUiAgMHgwMDAwMDEwMCAgIC8qIEV4dGVuZGVkIGVycm9yIGNvZGVzICovCisjZGVmaW5lIEJUQV9BR19GRUFUX0NPREVDICAgMHgwMDAwMDIwMCAgIC8qIENvZGVjIE5lZ290aWF0aW9uICovCisjZGVmaW5lIEJUQV9BR19GRUFUX1ZPSVAgICAgMHgwMDAwMDQwMCAgIC8qIFZvSVAgY2FsbCAqLworLyogUHJvcHJpZXRhcnkgZmVhdHVyZXM6IHVzaW5nIDMxIH4gMTYgYml0cyAqLworI2RlZmluZSBCVEFfQUdfRkVBVF9CVFJIICAgIDB4MDAwMTAwMDAgICAvKiBDQ0FQIGluY29taW5nIGNhbGwgaG9sZCAqLworI2RlZmluZSBCVEFfQUdfRkVBVF9VTkFUICAgIDB4MDAwMjAwMDAgICAvKiBQYXNzIHVua25vd24gQVQgY29tbWFuZHMgdG8gYXBwbGljYXRpb24gKi8KKyNkZWZpbmUgQlRBX0FHX0ZFQVRfTk9TQ08gICAweDAwMDQwMDAwICAgLyogTm8gU0NPIGNvbnRyb2wgcGVyZm9ybWVkIGJ5IEJUQSBBRyAqLworI2RlZmluZSBCVEFfQUdfRkVBVF9OT19FU0NPIDB4MDAwODAwMDAgICAvKiBEbyBub3QgYWxsb3cgb3IgdXNlIGVTQ08gKi8KKwordHlwZWRlZiBVSU5UMzIgdEJUQV9BR19GRUFUOworCisvKiBBRyBwYXJzZSBtb2RlICovCisjZGVmaW5lIEJUQV9BR19QQVJTRSAgICAgICAgICAgIDAgLyogUGVyZm9ybSBBVCBjb21tYW5kIHBhcnNpbmcgaW4gQUcgKi8KKyNkZWZpbmUgQlRBX0FHX1BBU1NfVEhST1VHSCAgICAgMSAvKiBQYXNzIGRhdGEgZGlyZWN0bHkgdG8gcGhvbmWScyBBVCBjb21tYW5kIGludGVycHJldGVyICovCisKK3R5cGVkZWYgVUlOVDggdEJUQV9BR19QQVJTRV9NT0RFOworCisvKiBBRyBvcGVuIHN0YXR1cyAqLworI2RlZmluZSBCVEFfQUdfU1VDQ0VTUyAgICAgICAgICAwIC8qIENvbm5lY3Rpb24gc3VjY2Vzc2Z1bGx5IG9wZW5lZCAqLworI2RlZmluZSBCVEFfQUdfRkFJTF9TRFAgICAgICAgICAxIC8qIE9wZW4gZmFpbGVkIGR1ZSB0byBTRFAgKi8KKyNkZWZpbmUgQlRBX0FHX0ZBSUxfUkZDT01NICAgICAgMiAvKiBPcGVuIGZhaWxlZCBkdWUgdG8gUkZDT01NICovCisjZGVmaW5lIEJUQV9BR19GQUlMX1JFU09VUkNFUyAgIDMgLyogb3V0IG9mIHJlc291cmNlcyBmYWlsdXJlICAqLworCit0eXBlZGVmIFVJTlQ4IHRCVEFfQUdfU1RBVFVTOworCisvKiBoYW5kbGUgdmFsdWVzIHVzZWQgd2l0aCBCVEFfQWdSZXN1bHQgKi8KKyNkZWZpbmUgQlRBX0FHX0hBTkRMRV9OT05FICAgICAgMAorI2RlZmluZSBCVEFfQUdfSEFORExFX0FMTCAgICAgICAweEZGRkYKKy8qIEl0IGlzIHNhZmUgdG8gdXNlIHRoZSBzYW1lIHZhbHVlIGFzIEJUQV9BR19IQU5ETEVfQUxMCisgKiBIQU5ETEVfQUxMIGlzIHVzZWQgZm9yIGRlbGl2ZXJpbmcgaW5kaWNhdGlvbgorICogU0NPX05PX0NIQU5HRSBpcyB1c2VkIGZvciBjaGFuZ2luZyBzY28gYmVoYXZpb3IKKyAqIFRoZXkgZG9ub3QgaW50ZXJmZXJlIHdpdGggZWFjaCBvdGhlcgorICovCisjZGVmaW5lIEJUQV9BR19IQU5ETEVfU0NPX05PX0NIQU5HRSAweEZGRkYKKworLyogQUcgcmVzdWx0IGNvZGVzIHVzZWQgd2l0aCBCVEFfQWdSZXN1bHQgKi8KKyNkZWZpbmUgQlRBX0FHX1NQS19SRVMgICAgICAgICAgICAgIDAgICAvKiBVcGRhdGUgc3BlYWtlciB2b2x1bWUgKi8KKyNkZWZpbmUgQlRBX0FHX01JQ19SRVMgICAgICAgICAgICAgIDEgICAvKiBVcGRhdGUgbWljcm9waG9uZSB2b2x1bWUgKi8KKyNkZWZpbmUgQlRBX0FHX0lOQkFORF9SSU5HX1JFUyAgICAgIDIgICAvKiBVcGRhdGUgaW5iYW5kIHJpbmcgc3RhdGUgKi8KKyNkZWZpbmUgQlRBX0FHX0NJTkRfUkVTICAgICAgICAgICAgIDMgICAvKiBTZW5kIGluZGljYXRvciByZXNwb25zZSBmb3IgQVQrQ0lORCAqLworI2RlZmluZSBCVEFfQUdfQklOUF9SRVMgICAgICAgICAgICAgNCAgIC8qIFNlbmQgcGhvbmUgbnVtYmVyIGZvciB2b2ljZSB0YWcgZm9yIEFUK0JJTlAgKi8KKyNkZWZpbmUgQlRBX0FHX0lORF9SRVMgICAgICAgICAgICAgIDUgICAvKiBVcGRhdGUgYW4gaW5kaWNhdG9yIHZhbHVlICovCisjZGVmaW5lIEJUQV9BR19CVlJBX1JFUyAgICAgICAgICAgICA2ICAgLyogVXBkYXRlIHZvaWNlIHJlY29nbml0aW9uIHN0YXRlICovCisjZGVmaW5lIEJUQV9BR19DTlVNX1JFUyAgICAgICAgICAgICA3ICAgLyogU2VuZCBzdWJzY3JpYmVyIG51bWJlciByZXNwb25zZSBmb3IgQVQrQ05VTSAqLworI2RlZmluZSBCVEFfQUdfQlRSSF9SRVMgICAgICAgICAgICAgOCAgIC8qIFNlbmQgQ0NBUCBpbmNvbWluZyBjYWxsIGhvbGQgKi8KKyNkZWZpbmUgQlRBX0FHX0NMQ0NfUkVTICAgICAgICAgICAgIDkgICAvKiBRdWVyeSBsaXN0IG9mIGNhbGxzICovCisjZGVmaW5lIEJUQV9BR19DT1BTX1JFUyAgICAgICAgICAgICAxMCAgLyogUmVhZCBuZXR3b3JrIG9wZXJhdG9yICovCisjZGVmaW5lIEJUQV9BR19JTl9DQUxMX1JFUyAgICAgICAgICAxMSAgLyogSW5kaWNhdGUgaW5jb21pbmcgcGhvbmUgY2FsbCAqLworI2RlZmluZSBCVEFfQUdfSU5fQ0FMTF9DT05OX1JFUyAgICAgMTIgIC8qIEluY29taW5nIHBob25lIGNhbGwgY29ubmVjdGVkICovCisjZGVmaW5lIEJUQV9BR19DQUxMX1dBSVRfUkVTICAgICAgICAxMyAgLyogQ2FsbCB3YWl0aW5nIG5vdGlmaWNhdGlvbiAqLworI2RlZmluZSBCVEFfQUdfT1VUX0NBTExfT1JJR19SRVMgICAgMTQgIC8qIE91dGdvaW5nIHBob25lIGNhbGwgb3JpZ2luYXRpb24gKi8KKyNkZWZpbmUgQlRBX0FHX09VVF9DQUxMX0FMRVJUX1JFUyAgIDE1ICAvKiBPdXRnb2luZyBwaG9uZSBjYWxsIGFsZXJ0aW5nIHJlbW90ZSBwYXJ0eSAqLworI2RlZmluZSBCVEFfQUdfT1VUX0NBTExfQ09OTl9SRVMgICAgMTYgIC8qIE91dGdvaW5nIHBob25lIGNhbGwgY29ubmVjdGVkICovCisjZGVmaW5lIEJUQV9BR19DQUxMX0NBTkNFTF9SRVMgICAgICAxNyAgLyogSW5jb21pbmcvb3V0Z29pbmcgMy13YXkgY2FuY2VsZWQgYmVmb3JlIGNvbm5lY3RlZCAqLworI2RlZmluZSBCVEFfQUdfRU5EX0NBTExfUkVTICAgICAgICAgMTggIC8qIEVuZCBjYWxsICovCisjZGVmaW5lIEJUQV9BR19JTl9DQUxMX0hFTERfUkVTICAgICAxOSAgLyogSW5jb21pbmcgY2FsbCBoZWxkICovCisjZGVmaW5lIEJUQV9BR19VTkFUX1JFUyAgICAgICAgICAgICAyMCAgLyogUmVzcG9uc2UgdG8gdW5rbm93biBBVCBjb21tYW5kIGV2ZW50ICovCisKK3R5cGVkZWYgVUlOVDggdEJUQV9BR19SRVM7CisKKy8qIEhGUCBwZWVyIGZlYXR1cmVzICovCisjZGVmaW5lIEJUQV9BR19QRUVSX0ZFQVRfRUNOUiAgICAgICAweDAwMDEgIC8qIEVjaG8gY2FuY2VsbGF0aW9uIGFuZC9vciBub2lzZSByZWR1Y3Rpb24gKi8KKyNkZWZpbmUgQlRBX0FHX1BFRVJfRkVBVF8zV0FZICAgICAgIDB4MDAwMiAgLyogQ2FsbCB3YWl0aW5nIGFuZCB0aHJlZS13YXkgY2FsbGluZyAqLworI2RlZmluZSBCVEFfQUdfUEVFUl9GRUFUX0NMSSAgICAgICAgMHgwMDA0ICAvKiBDYWxsZXIgSUQgcHJlc2VudGF0aW9uIGNhcGFiaWxpdHkgKi8KKyNkZWZpbmUgQlRBX0FHX1BFRVJfRkVBVF9WUkVDICAgICAgIDB4MDAwOCAgLyogVm9pY2UgcmVjb2duaXRpb24gYWN0aXZhdGlvbiAqLworI2RlZmluZSBCVEFfQUdfUEVFUl9GRUFUX1ZPTCAgICAgICAgMHgwMDEwICAvKiBSZW1vdGUgdm9sdW1lIGNvbnRyb2wgKi8KKyNkZWZpbmUgQlRBX0FHX1BFRVJfRkVBVF9FQ1MgICAgICAgIDB4MDAyMCAgLyogRW5oYW5jZWQgQ2FsbCBTdGF0dXMgKi8KKyNkZWZpbmUgQlRBX0FHX1BFRVJfRkVBVF9FQ0MgICAgICAgIDB4MDA0MCAgLyogRW5oYW5jZWQgQ2FsbCBDb250cm9sICovCisjZGVmaW5lIEJUQV9BR19QRUVSX0ZFQVRfQ09ERUMgICAgICAweDAwODAgIC8qIENvZGVjIE5lZ290aWF0aW9uICovCisjZGVmaW5lIEJUQV9BR19QRUVSX0ZFQVRfVk9JUCAgICAgICAweDAxMDAgIC8qIFZvSVAgY2FsbCAqLworCit0eXBlZGVmIFVJTlQxNiB0QlRBX0FHX1BFRVJfRkVBVDsKKworLyogSEZQIHBlZXIgc3VwcG9ydGVkIGNvZGVjIG1hc2tzICovCisjZGVmaW5lIEJUQV9BR19DT0RFQ19OT05FICAgICAgICAgICBCVE1fU0NPX0NPREVDX05PTkUKKyNkZWZpbmUgQlRBX0FHX0NPREVDX0NWU0QgICAgICAgICAgIEJUTV9TQ09fQ09ERUNfQ1ZTRCAgICAgIC8qIENWU0QgKi8KKyNkZWZpbmUgQlRBX0FHX0NPREVDX01TQkMgICAgICAgICAgIEJUTV9TQ09fQ09ERUNfTVNCQyAgICAgIC8qIG1TQkMgKi8KK3R5cGVkZWYgVUlOVDE2IHRCVEFfQUdfUEVFUl9DT0RFQzsKKworLyogSEZQIGVycmNvZGUgLSBTZXQgd2hlbiBCVEFfQUdfT0tfRVJST1IgaXMgcmV0dXJuZWQgaW4gJ29rX2ZsYWcnICovCisjZGVmaW5lIEJUQV9BR19FUlJfUEhPTkVfRkFJTFVSRSAgICAwICAgICAgIC8qIFBob25lIEZhaWx1cmUgKi8KKyNkZWZpbmUgQlRBX0FHX0VSUl9OT19DT05OX1BIT05FICAgIDEgICAgICAgLyogTm8gY29ubmVjdGlvbiB0byBwaG9uZSAqLworI2RlZmluZSBCVEFfQUdfRVJSX09QX05PVF9BTExPV0VEICAgMyAgICAgICAvKiBPcGVyYXRpb24gbm90IGFsbG93ZWQgKi8KKyNkZWZpbmUgQlRBX0FHX0VSUl9PUF9OT1RfU1VQUE9SVEVEIDQgICAgICAgLyogT3BlcmF0aW9uIG5vdCBzdXBwb3J0ZWQgKi8KKyNkZWZpbmUgQlRBX0FHX0VSUl9QSFNJTV9QSU5fUkVRICAgIDUgICAgICAgLyogUEgtU0lNIFBJTiByZXF1aXJlZCAqLworI2RlZmluZSBCVEFfQUdfRVJSX1NJTV9OT1RfSU5TRVJURUQgMTAgICAgICAvKiBTSU0gbm90IGluc2VydGVkICovCisjZGVmaW5lIEJUQV9BR19FUlJfU0lNX1BJTl9SRVEgICAgICAxMSAgICAgIC8qIFNJTSBQSU4gcmVxdWlyZWQgKi8KKyNkZWZpbmUgQlRBX0FHX0VSUl9TSU1fUFVLX1JFUSAgICAgIDEyICAgICAgLyogU0lNIFBVSyByZXF1aXJlZCAqLworI2RlZmluZSBCVEFfQUdfRVJSX1NJTV9GQUlMVVJFICAgICAgMTMgICAgICAvKiBTSU0gZmFpbHVyZSAqLworI2RlZmluZSBCVEFfQUdfRVJSX1NJTV9CVVNZICAgICAgICAgMTQgICAgICAvKiBTSU0gYnVzeSAqLworI2RlZmluZSBCVEFfQUdfRVJSX0lOQ09SUkVDVF9QV0QgICAgMTYgICAgICAvKiBJbmNvcnJlY3QgcGFzc3dvcmQgKi8KKyNkZWZpbmUgQlRBX0FHX0VSUl9TSU1fUElOMl9SRVEgICAgIDE3ICAgICAgLyogU0lNIFBJTjIgcmVxdWlyZWQgKi8KKyNkZWZpbmUgQlRBX0FHX0VSUl9TSU1fUFVLMl9SRVEgICAgIDE4ICAgICAgLyogU0lNIFBVSzIgcmVxdWlyZWQgKi8KKyNkZWZpbmUgQlRBX0FHX0VSUl9NRU1PUllfRlVMTCAgICAgIDIwICAgICAgLyogTWVtb3J5IGZ1bGwgKi8KKyNkZWZpbmUgQlRBX0FHX0VSUl9JTlZBTElEX0lOREVYICAgIDIxICAgICAgLyogSW52YWxpZCBpbmRleCAqLworI2RlZmluZSBCVEFfQUdfRVJSX01FTU9SWV9GQUlMVVJFICAgMjMgICAgICAvKiBNZW1vcnkgZmFpbHVyZSAqLworI2RlZmluZSBCVEFfQUdfRVJSX1RFWFRfVE9PX0xPTkcgICAgMjQgICAgICAvKiBUZXh0IHN0cmluZyB0b28gbG9uZyAqLworI2RlZmluZSBCVEFfQUdfRVJSX0lOVl9DSEFSX0lOX1RTVFIgMjUgICAgICAvKiBJbnZhbGlkIGNoYXJhY3RlcnMgaW4gdGV4dCBzdHJpbmcgKi8KKyNkZWZpbmUgQlRBX0FHX0VSUl9EU1RSX1RPT19MT05HICAgIDI2ICAgICAgLyogRGlhbCBzdHJpbmcgdG9vIGxvbmcgKi8KKyNkZWZpbmUgQlRBX0FHX0VSUl9JTlZfQ0hBUl9JTl9EU1RSIDI3ICAgICAgLyogSW52YWxpZCBjaGFyYWN0ZXJzIGluIGRpYWwgc3RyaW5nICovCisjZGVmaW5lIEJUQV9BR19FUlJfTk9fTkVUV09SS19TRVJWICAzMCAgICAgIC8qIE5vIG5ldHdvcmsgc2VydmljZSAqLworI2RlZmluZSBCVEFfQUdfRVJSX05FVFdPUktfVElNRV9PVVQgMzEgICAgICAvKiBOZXR3b3JrIHRpbWVvdXQgKi8KKyNkZWZpbmUgQlRBX0FHX0VSUl9OT19ORVRfRU1HX09OTFkgIDMyICAgICAgLyogTmV0d29yayBub3QgYWxsb3dlZCAtIGVtZXJnZW5jeSBzZXJ2aWNlIG9ubHkgKi8KKyNkZWZpbmUgQlRBX0FHX0VSUl9WT0lQX0NTX0NBTExTICAgIDMzICAgICAgLyogQUcgY2Fubm90IGNyZWF0ZSBzaW11bHRhbmVvdXMgVm9JUCBhbmQgQ1MgY2FsbHMgKi8KKyNkZWZpbmUgQlRBX0FHX0VSUl9OT1RfRk9SX1ZPSVAgICAgIDM0ICAgICAgLyogTm90IHN1cHBvcnRlZCBvbiB0aGlzIGNhbGwgdHlwZShWb0lQKSAqLworI2RlZmluZSBCVEFfQUdfRVJSX1NJUF9SRVNQX0NPREUgICAgMzUgICAgICAvKiBTSVAgMyBkaWdpdCByZXNwb25zZSBjb2RlICovCisKKyNpZiAwICAgLyogTm90IFVzZWQgaW4gQmx1ZXRvb3RoIEhGUCAxLjUgU3BlY2lmaWNhdGlvbiAqLworI2RlZmluZSBCVEFfQUdfRVJSX1BIQURBUF9MTktfUkVTICAgMiAgICAgICAvKiBQaG9uZS1hZGFwdGVyIGxpbmsgcmVzZXJ2ZWQgKi8KKyNkZWZpbmUgQlRBX0FHX0VSUl9QSEZTSU1fUElOX1JFUSAgIDYgICAgICAgLyogUEgtRlNJTSBQSU4gcmVxdWlyZWQgKi8KKyNkZWZpbmUgQlRBX0FHX0VSUl9QSEZTSU1fUFVLX1JFUSAgIDcgICAgICAgLyogUEgtRlNJTSBQVUsgcmVxdWlyZWQgKi8KKyNkZWZpbmUgQlRBX0FHX0VSUl9TSU1fV1JPTkcgICAgICAgIDE1ICAgICAgLyogU0lNIHdyb25nICovCisjZGVmaW5lIEJUQV9BR19FUlJfTk9UX0ZPVU5EICAgICAgICAyMiAgICAgIC8qIE5vdCBmb3VuZCAqLworI2RlZmluZSBCVEFfQUdfRVJSX05FVFdPUktfVElNRU9VVCAgMzEgICAgICAvKiBOZXR3b3JrIHRpbWVvdXQgKi8KKyNkZWZpbmUgQlRBX0FHX0VSUl9ORVRfUElOX1JFUSAgICAgIDQwICAgICAgLyogTmV0d29yayBwZXJzb25hbGl6YXRpb24gUElOIHJlcXVpcmVkICovCisjZGVmaW5lIEJUQV9BR19FUlJfTkVUX1BVS19SRVEgICAgICA0MSAgICAgIC8qIE5ldHdvcmsgcGVyc29uYWxpemF0aW9uIFBVSyByZXF1aXJlZCAqLworI2RlZmluZSBCVEFfQUdfRVJSX1NVQlNFVF9QSU5fUkVRICAgNDIgICAgICAvKiBOZXR3b3JrIHN1YnNldCBwZXJzb25hbGl6YXRpb24gUElOIHJlcXVpcmVkICovCisjZGVmaW5lIEJUQV9BR19FUlJfU1VCU0VUX1BVS19SRVEgICA0MyAgICAgIC8qIE5ldHdvcmsgc3Vic2V0IHBlcnNvbmFsaXphdGlvbiBQVUsgcmVxdWlyZWQgKi8KKyNkZWZpbmUgQlRBX0FHX0VSUl9TRVJWUFJPX1BJTl9SRVEgIDQ0ICAgICAgLyogU2VydmljZSBwcm92aWRlciBwZXJzb25hbGl6YXRpb24gUElOIHJlcXVpcmVkICovCisjZGVmaW5lIEJUQV9BR19FUlJfU0VSVlBST19QVUtfUkVRICA0NSAgICAgIC8qIFNlcnZpY2UgcHJvdmlkZXIgcGVyc29uYWxpemF0aW9uIFBVSyByZXF1aXJlZCAqLworI2RlZmluZSBCVEFfQUdfRVJSX0NPUlBfUElOX1JFUSAgICAgNDYgICAgICAvKiBDb3Jwb3JhdGUgcGVyc29uYWxpemF0aW9uIFBJTiByZXF1aXJlZCAqLworI2RlZmluZSBCVEFfQUdfRVJSX0NPUlBfUFVLX1JFUSAgICAgNDcgICAgICAvKiBDb3Jwb3JhdGUgcGVyc29uYWxpemF0aW9uIFBVSyByZXF1aXJlZCAqLworI2RlZmluZSBCVEFfQUdfRVJSX1VOS05PV04gICAgICAgICAgMTAwICAgIC8qIFVua25vd24gZXJyb3IgKi8KKy8qIEdQUlMtcmVsYXRlZCBlcnJvcnMgKi8KKyNkZWZpbmUgQlRBX0FHX0VSUl9JTExfTVMgICAgICAgICAgIDEwMyAgICAvKiBJbGxlZ2FsIE1TICgjMykgKi8KKyNkZWZpbmUgQlRBX0FHX0VSUl9JTExfTUUgICAgICAgICAgIDEwNiAgICAvKiBJbGxlZ2FsIE1FICgjNikgKi8KKyNkZWZpbmUgQlRBX0FHX0VSUl9HUFJTX05PVF9BTExPV0VEIDEwNyAgICAvKiBHUFJTIHNlcnZpY2VzIG5vdCBhbGxvd2VkICgjNykgKi8KKyNkZWZpbmUgQlRBX0FHX0VSUl9QTE1OX05PVF9BTExPV0VEIDExMSAgICAvKiBQTE1OIHNlcnZpY2VzIG5vdCBhbGxvd2VkICgjMTEpICovCisjZGVmaW5lIEJUQV9BR19FUlJfTE9DX05PVF9BTExPV0VEICAxMTIgICAgLyogTG9jYXRpb24gYXJlYSBub3QgYWxsb3dlZCAoIzEyKSAqLworI2RlZmluZSBCVEFfQUdfRVJSX1JPQU1fTk9UX0FMTE9XRUQgMTEzICAgIC8qIFJvYW1pbmcgbm90IGFsbG93ZWQgaW4gdGhpcyBsb2NhdGlvbiBhcmVhICgjMTMpICovCisvKiBFcnJvcnMgcmVsYXRlZCB0byBhIGZhaWx1cmUgdG8gQWN0aXZhdGUgYSBDb250ZXh0ICovCisjZGVmaW5lIEJUQV9BR19FUlJfT1BUX05PVF9TVVBQICAgICAxMzIgICAgLyogU2VydmljZSBvcHRpb24gbm90IHN1cHBvcnRlZCAoIzMyKSAqLworI2RlZmluZSBCVEFfQUdfRVJSX09QVF9OT1RfU1VCU0NSICAgMTMzICAgIC8qIFJlcXVlc3RlZCBzZXJ2aWNlIG9wdGlvbiBub3Qgc3Vic2NyaWJlZCAoIzMzKSAqLworI2RlZmluZSBCVEFfQUdfRVJSX09QVF9PVVRfT0ZfT1JERVIgMTM0ICAgIC8qIFNlcnZpY2Ugb3B0aW9uIHRlbXBvcmFyaWx5IG91dCBvZiBvcmRlciAoIzM0KSAqLworI2RlZmluZSBCVEFfQUdfRVJSX1BEUF9BVVRIX0ZBSUxVUkUgMTQ5ICAgIC8qIFBEUCBhdXRoZW50aWNhdGlvbiBmYWlsdXJlICovCisvKiBPdGhlciBHUFJTIGVycm9ycyAqLworI2RlZmluZSBCVEFfQUdfRVJSX0lOVl9NT0JJTEVfQ0xBU1MgMTUwICAgIC8qIEludmFsaWQgbW9iaWxlIGNsYXNzICovCisjZGVmaW5lIEJUQV9BR19FUlJfVU5TUEVDX0dQUlNfRVJSICAxNDggICAgLyogVW5zcGVjaWZpZWQgR1BSUyBlcnJvciAqLworI2VuZGlmICAvKiBVbnVzZWQgZXJyb3IgY29kZXMgKi8KKworCisvKiBIRlAgcmVzdWx0IGRhdGEgJ29rX2ZsYWcnICovCisjZGVmaW5lIEJUQV9BR19PS19DT05USU5VRSAgICAgICAgICAwICAgICAgIC8qIFNlbmQgb3V0IHJlc3BvbnNlIChtb3JlIHJlc3BvbnNlcyBjb21pbmcpICovCisjZGVmaW5lIEJUQV9BR19PS19ET05FICAgICAgICAgICAgICAxICAgICAgIC8qIFNlbmQgb3V0IHJlc3BvbnNlIGZvbGxvd2VkIGJ5IE9LIChmaW5pc2hlZCkgKi8KKyNkZWZpbmUgQlRBX0FHX09LX0VSUk9SICAgICAgICAgICAgIDIgICAgICAgLyogRXJyb3IgcmVzcG9uc2UgKi8KKworLyogQlRSSCB2YWx1ZXMgKi8KKyNkZWZpbmUgQlRBX0FHX0JUUkhfU0VUX0hPTEQgICAgICAgIDAgICAgICAgLyogUHV0IGluY29taW5nIGNhbGwgb24gaG9sZCAqLworI2RlZmluZSBCVEFfQUdfQlRSSF9TRVRfQUNDICAgICAgICAgMSAgICAgICAvKiBBY2NlcHQgaW5jb21pbmcgY2FsbCBvbiBob2xkICovCisjZGVmaW5lIEJUQV9BR19CVFJIX1NFVF9SRUogICAgICAgICAyICAgICAgIC8qIFJlamVjdCBpbmNvbWluZyBjYWxsIG9uIGhvbGQgKi8KKyNkZWZpbmUgQlRBX0FHX0JUUkhfUkVBRCAgICAgICAgICAgIDMgICAgICAgLyogUmVhZCB0aGUgY3VycmVudCB2YWx1ZSAqLworI2RlZmluZSBCVEFfQUdfQlRSSF9OT19SRVNQICAgICAgICAgNCAgICAgICAvKiBOb3QgaW4gUkggU3RhdGVzIChyZXBseSB0byByZWFkKSAqLworCisvKiBBU0NJSSBjaGFyYWN0ZXIgc3RyaW5nIG9mIGFyZ3VtZW50cyB0byB0aGUgQVQgY29tbWFuZCBvciByZXN1bHQgKi8KKyNpZm5kZWYgQlRBX0FHX0FUX01BWF9MRU4KKyNkZWZpbmUgQlRBX0FHX0FUX01BWF9MRU4gICAgICAgICAgIDI1NgorI2VuZGlmCisKKy8qIGRhdGEgYXNzb2NpYXRlZCB3aXRoIEJUQV9BR19JTkRfUkVTICovCit0eXBlZGVmIHN0cnVjdAoreworICAgIFVJTlQxNiAgICAgICAgICBpZDsKKyAgICBVSU5UMTYgICAgICAgICAgdmFsdWU7Cit9IHRCVEFfQUdfSU5EOworCisvKiBkYXRhIHR5cGUgZm9yIEJUQV9BZ1Jlc3VsdCgpICovCit0eXBlZGVmIHN0cnVjdAoreworICAgIGNoYXIgICAgICAgICAgICBzdHJbQlRBX0FHX0FUX01BWF9MRU4rMV07CisgICAgdEJUQV9BR19JTkQgICAgIGluZDsKKyAgICBVSU5UMTYgICAgICAgICAgbnVtOworICAgIFVJTlQxNiAgICAgICAgICBhdWRpb19oYW5kbGU7CisgICAgVUlOVDE2ICAgICAgICAgIGVycmNvZGU7ICAgICAgICAvKiBWYWxpZCBvbmx5IGlmICdva19mbGFnJyBpcyBzZXQgdG8gQlRBX0FHX09LX0VSUk9SICovCisgICAgVUlOVDggICAgICAgICAgIG9rX2ZsYWc7ICAgICAgICAvKiBJbmRpY2F0ZXMgaWYgcmVzcG9uc2UgaXMgZmluaXNoZWQsIGFuZCBpZiBlcnJvciBvY2N1cnJlZCAqLworICAgIEJPT0xFQU4gICAgICAgICBzdGF0ZTsKK30gdEJUQV9BR19SRVNfREFUQTsKKworLyogQUcgY2FsbGJhY2sgZXZlbnRzICovCisjZGVmaW5lIEJUQV9BR19FTkFCTEVfRVZUICAgICAgIDAgIC8qIEFHIGVuYWJsZWQgKi8KKyNkZWZpbmUgQlRBX0FHX1JFR0lTVEVSX0VWVCAgICAgMSAgLyogQUcgcmVnaXN0ZXJlZCAqLworI2RlZmluZSBCVEFfQUdfT1BFTl9FVlQgICAgICAgICAyICAvKiBBRyBjb25uZWN0aW9uIG9wZW4gKi8KKyNkZWZpbmUgQlRBX0FHX0NMT1NFX0VWVCAgICAgICAgMyAgLyogQUcgY29ubmVjdGlvbiBjbG9zZWQgKi8KKyNkZWZpbmUgQlRBX0FHX0NPTk5fRVZUICAgICAgICAgNCAgLyogU2VydmljZSBsZXZlbCBjb25uZWN0aW9uIG9wZW5lZCAqLworI2RlZmluZSBCVEFfQUdfQVVESU9fT1BFTl9FVlQgICA1ICAvKiBBdWRpbyBjb25uZWN0aW9uIG9wZW4gKi8KKyNkZWZpbmUgQlRBX0FHX0FVRElPX0NMT1NFX0VWVCAgNiAgLyogQXVkaW8gY29ubmVjdGlvbiBjbG9zZWQgKi8KKyNkZWZpbmUgQlRBX0FHX1NQS19FVlQgICAgICAgICAgNyAgLyogU3BlYWtlciB2b2x1bWUgY2hhbmdlZCAqLworI2RlZmluZSBCVEFfQUdfTUlDX0VWVCAgICAgICAgICA4ICAvKiBNaWNyb3Bob25lIHZvbHVtZSBjaGFuZ2VkICovCisjZGVmaW5lIEJUQV9BR19BVF9DS1BEX0VWVCAgICAgIDkgIC8qIENLUEQgZnJvbSB0aGUgSFMgKi8KKyNkZWZpbmUgQlRBX0FHX0RJU0FCTEVfRVZUICAgICAgMzAgLyogQUcgZGlzYWJsZWQgICAgICAgKi8KKworLyogVmFsdWVzIGJlbG93IGFyZSBmb3IgSEZQIG9ubHkgKi8KKyNkZWZpbmUgQlRBX0FHX0FUX0FfRVZUICAgICAgICAgMTAgLyogQW5zd2VyIGEgY2FsbCAqLworI2RlZmluZSBCVEFfQUdfQVRfRF9FVlQgICAgICAgICAxMSAvKiBQbGFjZSBhIGNhbGwgdXNpbmcgbnVtYmVyIG9yIG1lbW9yeSBkaWFsICovCisjZGVmaW5lIEJUQV9BR19BVF9DSExEX0VWVCAgICAgIDEyIC8qIENhbGwgaG9sZCAqLworI2RlZmluZSBCVEFfQUdfQVRfQ0hVUF9FVlQgICAgICAxMyAvKiBIYW5nIHVwIGEgY2FsbCAqLworI2RlZmluZSBCVEFfQUdfQVRfQ0lORF9FVlQgICAgICAxNCAvKiBSZWFkIGluZGljYXRvciBzZXR0aW5ncyAqLworI2RlZmluZSBCVEFfQUdfQVRfVlRTX0VWVCAgICAgICAxNSAvKiBUcmFuc21pdCBEVE1GIHRvbmUgKi8KKyNkZWZpbmUgQlRBX0FHX0FUX0JJTlBfRVZUICAgICAgMTYgLyogUmV0cmlldmUgbnVtYmVyIGZyb20gdm9pY2UgdGFnICovCisjZGVmaW5lIEJUQV9BR19BVF9CTEROX0VWVCAgICAgIDE3IC8qIFBsYWNlIGNhbGwgdG8gbGFzdCBkaWFsZWQgbnVtYmVyICovCisjZGVmaW5lIEJUQV9BR19BVF9CVlJBX0VWVCAgICAgIDE4IC8qIEVuYWJsZS9kaXNhYmxlIHZvaWNlIHJlY29nbml0aW9uICovCisjZGVmaW5lIEJUQV9BR19BVF9OUkVDX0VWVCAgICAgIDE5IC8qIERpc2FibGUgZWNobyBjYW5jZWxpbmcgKi8KKyNkZWZpbmUgQlRBX0FHX0FUX0NOVU1fRVZUICAgICAgMjAgLyogUmV0cmlldmUgc3Vic2NyaWJlciBudW1iZXIgKi8KKyNkZWZpbmUgQlRBX0FHX0FUX0JUUkhfRVZUICAgICAgMjEgLyogQ0NBUC1zdHlsZSBpbmNvbWluZyBjYWxsIGhvbGQgKi8KKyNkZWZpbmUgQlRBX0FHX0FUX0NMQ0NfRVZUICAgICAgMjIgLyogUXVlcnkgbGlzdCBvZiBjdXJyZW50IGNhbGxzICovCisjZGVmaW5lIEJUQV9BR19BVF9DT1BTX0VWVCAgICAgIDIzIC8qIFF1ZXJ5IGxpc3Qgb2YgY3VycmVudCBjYWxscyAqLworI2RlZmluZSBCVEFfQUdfQVRfVU5BVF9FVlQgICAgICAyNCAvKiBVbmtub3duIEFUIGNvbW1hbmQgKi8KKyNkZWZpbmUgQlRBX0FHX0FUX0NCQ19FVlQgICAgICAgMjUgLyogQmF0dGVyeSBMZXZlbCByZXBvcnQgZnJvbSBIRiAqLworI2RlZmluZSBCVEFfQUdfQVRfQkFDX0VWVCAgICAgICAyNiAvKiBDb2RlYyBzZWxlY3QgKi8KKyNkZWZpbmUgQlRBX0FHX0FUX0JDU19FVlQgICAgICAgMjcgLyogQ29kZWMgc2VsZWN0ICovCisKK3R5cGVkZWYgVUlOVDggdEJUQV9BR19FVlQ7CisKKy8qIGRhdGEgYXNzb2NpYXRlZCB3aXRoIG1vc3Qgbm9uLUFUIGV2ZW50cyAqLwordHlwZWRlZiBzdHJ1Y3QKK3sKKyAgICBVSU5UMTYgICAgICAgICAgICAgIGhhbmRsZTsKKyAgICBVSU5UOCAgICAgICAgICAgICAgIGFwcF9pZDsKK30gdEJUQV9BR19IRFI7CisKKy8qIGRhdGEgYXNzb2NpYXRlZCB3aXRoIEJUQV9BR19SRUdJU1RFUl9FVlQgKi8KK3R5cGVkZWYgc3RydWN0Cit7CisgICAgdEJUQV9BR19IRFIgICAgICAgICBoZHI7CisgICAgdEJUQV9BR19TVEFUVVMgICAgICBzdGF0dXM7Cit9IHRCVEFfQUdfUkVHSVNURVI7CisKKy8qIGRhdGEgYXNzb2NpYXRlZCB3aXRoIEJUQV9BR19PUEVOX0VWVCAqLwordHlwZWRlZiBzdHJ1Y3QKK3sKKyAgICB0QlRBX0FHX0hEUiAgICAgICAgIGhkcjsKKyAgICBCRF9BRERSICAgICAgICAgICAgIGJkX2FkZHI7CisgICAgdEJUQV9TRVJWSUNFX0lEICAgICBzZXJ2aWNlX2lkOworICAgIHRCVEFfQUdfU1RBVFVTICAgICAgc3RhdHVzOworfSB0QlRBX0FHX09QRU47CisKKy8qIGRhdGEgYXNzb2NpYXRlZCB3aXRoIEJUQV9BR19DT05OX0VWVCAqLwordHlwZWRlZiBzdHJ1Y3QKK3sKKyAgICB0QlRBX0FHX0hEUiAgICAgICAgIGhkcjsKKyAgICB0QlRBX0FHX1BFRVJfRkVBVCAgIHBlZXJfZmVhdDsKKyAgICB0QlRBX0FHX1BFRVJfQ09ERUMgIHBlZXJfY29kZWM7Cit9IHRCVEFfQUdfQ09OTjsKKworLyogZGF0YSBhc3NvY2lhdGVkIHdpdGggQVQgY29tbWFuZCBldmVudCAqLwordHlwZWRlZiBzdHJ1Y3QKK3sKKyAgICB0QlRBX0FHX0hEUiAgICAgICAgIGhkcjsKKyAgICBjaGFyICAgICAgICAgICAgICAgIHN0cltCVEFfQUdfQVRfTUFYX0xFTisxXTsKKyAgICBVSU5UMTYgICAgICAgICAgICAgIG51bTsKKyAgICBVSU5UOCAgICAgICAgICAgICAgIGlkeDsgICAgLyogY2FsbCBudW1iZXIgdXNlZCBieSBDTENDIGFuZCBDSExEICovCit9IHRCVEFfQUdfVkFMOworCisvKiB1bmlvbiBvZiBkYXRhIGFzc29jaWF0ZWQgd2l0aCBBRyBjYWxsYmFjayAqLwordHlwZWRlZiB1bmlvbgoreworICAgIHRCVEFfQUdfSERSICAgICAgICAgaGRyOworICAgIHRCVEFfQUdfUkVHSVNURVIgICAgcmVnOworICAgIHRCVEFfQUdfT1BFTiAgICAgICAgb3BlbjsKKyAgICB0QlRBX0FHX0NPTk4gICAgICAgIGNvbm47CisgICAgdEJUQV9BR19WQUwgICAgICAgICB2YWw7Cit9IHRCVEFfQUc7CisKKy8qIEFHIGNhbGxiYWNrICovCit0eXBlZGVmIHZvaWQgKHRCVEFfQUdfQ0JBQ0spKHRCVEFfQUdfRVZUIGV2ZW50LCB0QlRBX0FHICpwX2RhdGEpOworCisvKiBpbmRpY2F0b3IgY29uc3RhbnRzIEhGUCAxLjEgYW5kIGxhdGVyICovCisjZGVmaW5lIEJUQV9BR19JTkRfQ0FMTCAgICAgICAgICAgICAxICAgLyogcG9zaXRpb24gb2YgY2FsbCBpbmRpY2F0b3IgKi8KKyNkZWZpbmUgQlRBX0FHX0lORF9DQUxMU0VUVVAgICAgICAgIDIgICAvKiBwb3NpdGlvbiBvZiBjYWxsc2V0dXAgaW5kaWNhdG9yICovCisjZGVmaW5lIEJUQV9BR19JTkRfU0VSVklDRSAgICAgICAgICAzICAgLyogcG9zaXRpb24gb2Ygc2VydmljZSBpbmRpY2F0b3IgKi8KKworLyogaW5kaWNhdG9yIGNvbnN0YW50cyBIRlAgMS41IGFuZCBsYXRlciAqLworI2RlZmluZSBCVEFfQUdfSU5EX1NJR05BTCAgICAgICAgICAgNCAgIC8qIHBvc2l0aW9uIG9mIHNpZ25hbCBzdHJlbmd0aCBpbmRpY2F0b3IgKi8KKyNkZWZpbmUgQlRBX0FHX0lORF9ST0FNICAgICAgICAgICAgIDUgICAvKiBwb3NpdGlvbiBvZiByb2FtaW5nIGluZGljYXRvciAqLworI2RlZmluZSBCVEFfQUdfSU5EX0JBVFRDSEcgICAgICAgICAgNiAgIC8qIHBvc2l0aW9uIG9mIGJhdHRlcnkgY2hhcmdlIGluZGljYXRvciAqLworI2RlZmluZSBCVEFfQUdfSU5EX0NBTExIRUxEICAgICAgICAgNyAgIC8qIHBvc2l0aW9uIG9mIGNhbGxoZWxkIGluZGljYXRvciAqLworI2RlZmluZSBCVEFfQUdfSU5EX0JFQVJFUiAgICAgICAgICAgOCAgIC8qIHBvc2l0aW9uIG9mIGJlYXJlciBpbmRpY2F0b3IgKi8KKworLyogY2FsbCBpbmRpY2F0b3IgdmFsdWVzICovCisjZGVmaW5lIEJUQV9BR19DQUxMX0lOQUNUSVZFICAgICAgICAwICAgLyogUGhvbmUgY2FsbCBpbmFjdGl2ZSAqLworI2RlZmluZSBCVEFfQUdfQ0FMTF9BQ1RJVkUgICAgICAgICAgMSAgIC8qIFBob25lIGNhbGwgYWN0aXZlICovCisKKy8qIGNhbGxzZXR1cCBpbmRpY2F0b3IgdmFsdWVzICovCisjZGVmaW5lIEJUQV9BR19DQUxMU0VUVVBfTk9ORSAgICAgICAwICAgLyogTm90IGN1cnJlbnRseSBpbiBjYWxsIHNldCB1cCAqLworI2RlZmluZSBCVEFfQUdfQ0FMTFNFVFVQX0lOQ09NSU5HICAgMSAgIC8qIEluY29taW5nIGNhbGwgcHJvY2VzcyBvbmdvaW5nICovCisjZGVmaW5lIEJUQV9BR19DQUxMU0VUVVBfT1VUR09JTkcgICAyICAgLyogT3V0Z29pbmcgY2FsbCBzZXQgdXAgaXMgb25nb2luZyAqLworI2RlZmluZSBCVEFfQUdfQ0FMTFNFVFVQX0FMRVJUSU5HICAgMyAgIC8qIFJlbW90ZSBwYXJ0eSBiZWluZyBhbGVydGVkIGluIGFuIG91dGdvaW5nIGNhbGwgKi8KKworLyogc2VydmljZSBpbmRpY2F0b3IgdmFsdWVzICovCisjZGVmaW5lIEJUQV9BR19TRVJWSUNFX05PTkUgICAgICAgICAwICAgLyogTmVpdGhlciBDUyBub3IgVm9JUCBzZXJ2aWNlIGlzIGF2YWlsYWJsZSAgICAgKi8KKyNkZWZpbmUgQlRBX0FHX1NFUlZJQ0VfQ1MgICAgICAgICAgIDEgICAvKiBPbmx5IENTIHNlcnZpY2UgaXMgYXZhaWxhYmxlICAgICAgICAgICAgICAgICAqLworI2RlZmluZSBCVEFfQUdfU0VSVklDRV9WT0lQICAgICAgICAgMiAgIC8qIE9ubHkgVm9JUCBzZXJ2aWNlIGlzIGF2YWlsYWJsZSAgICAgICAgICAgICAgICovCisjZGVmaW5lIEJUQV9BR19TRVJWSUNFX0NTX1ZPSVAgICAgICAzICAgLyogQm90aCBDUyBhbmQgVm9JUCBzZXJ2aWNlcyBhdmFpbGFibGUgICAgICAgICAgKi8KKworLyogY2FsbGhlbGQgaW5kaWNhdG9yIHZhbHVlcyAqLworI2RlZmluZSBCVEFfQUdfQ0FMTEhFTERfSU5BQ1RJVkUgICAgMCAgIC8qIE5vIGhlbGQgY2FsbHMgKi8KKyNkZWZpbmUgQlRBX0FHX0NBTExIRUxEX0FDVElWRSAgICAgIDEgICAvKiBDYWxsIGhlbGQgYW5kIGNhbGwgYWN0aXZlICovCisjZGVmaW5lIEJUQV9BR19DQUxMSEVMRF9OT0FDVElWRSAgICAyICAgLyogQ2FsbCBoZWxkIGFuZCBubyBjYWxsIGFjdGl2ZSAqLworCisvKiBzaWduYWwgc3RyZW5ndGggaW5kaWNhdG9yIHZhbHVlcyAqLworI2RlZmluZSBCVEFfQUdfUk9BTUlOR19JTkFDVElWRSAgICAgMCAgIC8qIFBob25lIGNhbGwgaW5hY3RpdmUgKi8KKyNkZWZpbmUgQlRBX0FHX1JPQU1JTkdfQUNUSVZFICAgICAgIDEgICAvKiBQaG9uZSBjYWxsIGFjdGl2ZSAqLworCisvKiBiZWFyZXIgaW5kaWNhdG9yIHZhbHVlcyAqLworI2RlZmluZSBCVEFfQUdfQkVBUkVSX1dMQU4gICAgICAgICAgMCAgIC8qIFdMQU4gICAgICAgICAqLworI2RlZmluZSBCVEFfQUdfQkVBUkVSX0JMVUVUT09USCAgICAgMSAgIC8qIEJsdWV0b290aCAgICAqLworI2RlZmluZSBCVEFfQUdfQkVBUkVSX1dJUkVEICAgICAgICAgMiAgIC8qIFdpcmVkICAgICAgICAqLworI2RlZmluZSBCVEFfQUdfQkVBUkVSXzJHM0cgICAgICAgICAgMyAgIC8qIDJHIDNHICAgICAgICAqLworI2RlZmluZSBCVEFfQUdfQkVBUkVSX1dJTUFYICAgICAgICAgNCAgIC8qIFdJTUFYICAgICAgICAqLworI2RlZmluZSBCVEFfQUdfQkVBUkVSX1JFUzEgICAgICAgICAgNSAgIC8qIFJlc2VydmVkICAgICAqLworI2RlZmluZSBCVEFfQUdfQkVBUkVSX1JFUzIgICAgICAgICAgNiAgIC8qIFJlc2VydmVkICAgICAqLworI2RlZmluZSBCVEFfQUdfQkVBUkVSX1JFUzMgICAgICAgICAgNyAgIC8qIFJlc2VydmVkICAgICAqLworCisvKiBBRyBjb25maWd1cmF0aW9uIHN0cnVjdHVyZSAqLwordHlwZWRlZiBzdHJ1Y3QKK3sKKyAgICBjaGFyICAgICAgICAgKmNpbmRfaW5mbzsKKyAgICBJTlQzMiAgICAgICAgY29ubl90b3V0OworICAgIFVJTlQxNiAgICAgICBzY29fcGt0X3R5cGVzOworICAgIGNoYXIgICAgICAgICAqY2hsZF92YWxfZWNjOworICAgIGNoYXIgICAgICAgICAqY2hsZF92YWw7Cit9IHRCVEFfQUdfQ0ZHOworCisjaWZkZWYgX19jcGx1c3BsdXMKK2V4dGVybiAiQyIKK3sKKyNlbmRpZgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyoqICBFeHRlcm5hbCBGdW5jdGlvbiBEZWNsYXJhdGlvbnMKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorKioKKyoqIEZ1bmN0aW9uICAgICAgICAgQlRBX0FnRW5hYmxlCisqKgorKiogRGVzY3JpcHRpb24gICAgICBFbmFibGUgdGhlIGF1ZGlvIGdhdGV3YXkgc2VydmljZS4gV2hlbiB0aGUgZW5hYmxlCisqKiAgICAgICAgICAgICAgICAgIG9wZXJhdGlvbiBpcyBjb21wbGV0ZSB0aGUgY2FsbGJhY2sgZnVuY3Rpb24gd2lsbCBiZQorKiogICAgICAgICAgICAgICAgICBjYWxsZWQgd2l0aCBhIEJUQV9BR19FTkFCTEVfRVZULiBUaGlzIGZ1bmN0aW9uIG11c3QKKyoqICAgICAgICAgICAgICAgICAgYmUgY2FsbGVkIGJlZm9yZSBvdGhlciBmdW5jdGlvbiBpbiB0aGUgQUcgQVBJIGFyZQorKiogICAgICAgICAgICAgICAgICBjYWxsZWQuCisqKgorKiogUmV0dXJucyAgICAgICAgICBCVEFfU1VDQ0VTUyBpZiBPSywgQlRBX0ZBSUxVUkUgb3RoZXJ3aXNlLgorKioKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitCVEFfQVBJIHRCVEFfU1RBVFVTIEJUQV9BZ0VuYWJsZSh0QlRBX0FHX1BBUlNFX01PREUgcGFyc2VfbW9kZSwgdEJUQV9BR19DQkFDSyAqcF9jYmFjayk7CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisqKgorKiogRnVuY3Rpb24gICAgICAgICBCVEFfQWdEaXNhYmxlCisqKgorKiogRGVzY3JpcHRpb24gICAgICBEaXNhYmxlIHRoZSBhdWRpbyBnYXRld2F5IHNlcnZpY2UKKyoqCisqKgorKiogUmV0dXJucyAgICAgICAgICB2b2lkCisqKgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK0JUQV9BUEkgdm9pZCBCVEFfQWdEaXNhYmxlKHZvaWQpOworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorKioKKyoqIEZ1bmN0aW9uICAgICAgICAgQlRBX0FnUmVnaXN0ZXIKKyoqCisqKiBEZXNjcmlwdGlvbiAgICAgIFJlZ2lzdGVyIGFuIEF1ZGlvIEdhdGV3YXkgc2VydmljZS4KKyoqCisqKgorKiogUmV0dXJucyAgICAgICAgICB2b2lkCisqKgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK0JUQV9BUEkgdm9pZCBCVEFfQWdSZWdpc3Rlcih0QlRBX1NFUlZJQ0VfTUFTSyBzZXJ2aWNlcywgdEJUQV9TRUMgc2VjX21hc2ssCisgICAgICAgICAgICAgICAgdEJUQV9BR19GRUFUIGZlYXR1cmVzLCBjaGFyICpwX3NlcnZpY2VfbmFtZXNbXSwgVUlOVDggYXBwX2lkKTsKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyoqCisqKiBGdW5jdGlvbiAgICAgICAgIEJUQV9BZ0RlcmVnaXN0ZXIKKyoqCisqKiBEZXNjcmlwdGlvbiAgICAgIERlcmVnaXN0ZXIgYW4gYXVkaW8gZ2F0ZXdheSBzZXJ2aWNlLgorKioKKyoqCisqKiBSZXR1cm5zICAgICAgICAgIHZvaWQKKyoqCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworQlRBX0FQSSB2b2lkIEJUQV9BZ0RlcmVnaXN0ZXIoVUlOVDE2IGhhbmRsZSk7CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisqKgorKiogRnVuY3Rpb24gICAgICAgICBCVEFfQWdPcGVuCisqKgorKiogRGVzY3JpcHRpb24gICAgICBPcGVucyBhIGNvbm5lY3Rpb24gdG8gYSBoZWFkc2V0IG9yIGhhbmRzLWZyZWUgZGV2aWNlLgorKiogICAgICAgICAgICAgICAgICBXaGVuIGNvbm5lY3Rpb24gaXMgb3BlbiBjYWxsYmFjayBmdW5jdGlvbiBpcyBjYWxsZWQKKyoqICAgICAgICAgICAgICAgICAgd2l0aCBhIEJUQV9BR19PUEVOX0VWVC4gT25seSB0aGUgZGF0YSBjb25uZWN0aW9uIGlzCisqKiAgICAgICAgICAgICAgICAgIG9wZW5lZC4gVGhlIGF1ZGlvIGNvbm5lY3Rpb24gaXMgbm90IG9wZW5lZC4KKyoqCisqKgorKiogUmV0dXJucyAgICAgICAgICB2b2lkCisqKgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK0JUQV9BUEkgdm9pZCBCVEFfQWdPcGVuKFVJTlQxNiBoYW5kbGUsIEJEX0FERFIgYmRfYWRkciwgdEJUQV9TRUMgc2VjX21hc2ssIHRCVEFfU0VSVklDRV9NQVNLIHNlcnZpY2VzKTsKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyoqCisqKiBGdW5jdGlvbiAgICAgICAgIEJUQV9BZ0Nsb3NlCisqKgorKiogRGVzY3JpcHRpb24gICAgICBDbG9zZSB0aGUgY3VycmVudCBjb25uZWN0aW9uIHRvIGEgaGVhZHNldCBvciBhIGhhbmRzZnJlZQorKiogICAgICAgICAgICAgICAgICBBbnkgY3VycmVudCBhdWRpbyBjb25uZWN0aW9uIHdpbGwgYWxzbyBiZSBjbG9zZWQKKyoqCisqKgorKiogUmV0dXJucyAgICAgICAgICB2b2lkCisqKgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK0JUQV9BUEkgdm9pZCBCVEFfQWdDbG9zZShVSU5UMTYgaGFuZGxlKTsKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyoqCisqKiBGdW5jdGlvbiAgICAgICAgIEJUQV9BZ0F1ZGlvT3BlbgorKioKKyoqIERlc2NyaXB0aW9uICAgICAgT3BlbnMgYW4gYXVkaW8gY29ubmVjdGlvbiB0byB0aGUgY3VycmVudGx5IGNvbm5lY3RlZAorKiogICAgICAgICAgICAgICAgICBoZWFkc2V0IG9yIGhuYWRzZnJlZQorKioKKyoqCisqKiBSZXR1cm5zICAgICAgICAgIHZvaWQKKyoqCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworQlRBX0FQSSB2b2lkIEJUQV9BZ0F1ZGlvT3BlbihVSU5UMTYgaGFuZGxlKTsKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyoqCisqKiBGdW5jdGlvbiAgICAgICAgIEJUQV9BZ0F1ZGlvQ2xvc2UKKyoqCisqKiBEZXNjcmlwdGlvbiAgICAgIENsb3NlIHRoZSBjdXJyZW50bHkgYWN0aXZlIGF1ZGlvIGNvbm5lY3Rpb24gdG8gYSBoZWFkc2V0CisqKiAgICAgICAgICAgICAgICAgIG9yIGhuYWRzZnJlZS4gVGhlIGRhdGEgY29ubmVjdGlvbiByZW1haW5zIG9wZW4KKyoqCisqKgorKiogUmV0dXJucyAgICAgICAgICB2b2lkCisqKgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK0JUQV9BUEkgdm9pZCBCVEFfQWdBdWRpb0Nsb3NlKFVJTlQxNiBoYW5kbGUpOworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorKioKKyoqIEZ1bmN0aW9uICAgICAgICAgQlRBX0FnUmVzdWx0CisqKgorKiogRGVzY3JpcHRpb24gICAgICBTZW5kIGFuIEFUIHJlc3VsdCBjb2RlIHRvIGEgaGVhZHNldCBvciBoYW5kcy1mcmVlIGRldmljZS4KKyoqICAgICAgICAgICAgICAgICAgVGhpcyBmdW5jdGlvbiBpcyBvbmx5IHVzZWQgd2hlbiB0aGUgQUcgcGFyc2UgbW9kZSBpcyBzZXQKKyoqICAgICAgICAgICAgICAgICAgdG8gQlRBX0FHX1BBUlNFLgorKioKKyoqCisqKiBSZXR1cm5zICAgICAgICAgIHZvaWQKKyoqCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworQlRBX0FQSSB2b2lkIEJUQV9BZ1Jlc3VsdChVSU5UMTYgaGFuZGxlLCB0QlRBX0FHX1JFUyByZXN1bHQsIHRCVEFfQUdfUkVTX0RBVEEgKnBfZGF0YSk7CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisqKgorKiogRnVuY3Rpb24gICAgICAgICBCVEFfQWdTZXRDb2RlYworKioKKyoqIERlc2NyaXB0aW9uICAgICAgU3BlY2lmeSB0aGUgY29kZWMgdHlwZSB0byBiZSB1c2VkIGZvciB0aGUgc3Vic2VxdWVudAorKiogICAgICAgICAgICAgICAgICBhdWRpbyBjb25uZWN0aW9uLgorKioKKyoqCisqKgorKiogUmV0dXJucyAgICAgICAgICB2b2lkCisqKgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK0JUQV9BUEkgdm9pZCBCVEFfQWdTZXRDb2RlYyhVSU5UMTYgaGFuZGxlLCB0QlRBX0FHX1BFRVJfQ09ERUMgY29kZWMpOworCisjaWZkZWYgX19jcGx1c3BsdXMKK30KKyNlbmRpZgorCisjZW5kaWYgLyogQlRBX0FHX0FQSV9IICovCisKKwpkaWZmIC0tZ2l0IGEvYnRpZi9zcmMvYnRpZl9oZl9jbGllbnQuYyBiL2J0aWYvc3JjL2J0aWZfaGZfY2xpZW50LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjRhZGUwZAotLS0gL2Rldi9udWxsCisrKyBiL2J0aWYvc3JjL2J0aWZfaGZfY2xpZW50LmMKQEAgLTAsMCArMSwxMjAyIEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgorICogIENvcHlyaWdodCAoQykgMjAwOS0yMDEyIEJyb2FkY29tIENvcnBvcmF0aW9uCisgKgorICogIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQ6CisgKgorICogIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoKKyAqICBGaWxlbmFtZTogICAgICBidGlmX2hmLmMKKyAqCisgKiAgRGVzY3JpcHRpb246ICAgSGFuZHNmcmVlIFByb2ZpbGUgQmx1ZXRvb3RoIEludGVyZmFjZQorICoKKyAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyNpbmNsdWRlIDxoYXJkd2FyZS9ibHVldG9vdGguaD4KKyNpbmNsdWRlIDxoYXJkd2FyZS9idF9oZi5oPgorI2luY2x1ZGUgPHN0ZGxpYi5oPgorCisjZGVmaW5lIExPR19UQUcgIkJUSUZfSEYiCisjaW5jbHVkZSAiYnRpZl9jb21tb24uaCIKKyNpbmNsdWRlICJidGlmX3V0aWwuaCIKKyNpbmNsdWRlICJidGlmX3Byb2ZpbGVfcXVldWUuaCIKKworI2luY2x1ZGUgImJkLmgiCisjaW5jbHVkZSAiYnRhX2FnX2FwaS5oIgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisqKiAgQ29uc3RhbnRzICYgTWFjcm9zCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjaWZuZGVmIEJUSUZfSFNBR19TRVJWSUNFX05BTUUKKyNkZWZpbmUgQlRJRl9IU0FHX1NFUlZJQ0VfTkFNRSAoIkhlYWRzZXQgR2F0ZXdheSIpCisjZW5kaWYKKworI2lmbmRlZiBCVElGX0hGQUdfU0VSVklDRV9OQU1FCisjZGVmaW5lIEJUSUZfSEZBR19TRVJWSUNFX05BTUUgKCJIYW5kc2ZyZWUgR2F0ZXdheSIpCisjZW5kaWYKKworI2lmbmRlZiBCVElGX0hGX1NFUlZJQ0VTCisjZGVmaW5lIEJUSUZfSEZfU0VSVklDRVMgICAgKEJUQV9IU1BfU0VSVklDRV9NQVNLIHwgQlRBX0hGUF9TRVJWSUNFX01BU0sgKQorI2VuZGlmCisKKyNpZm5kZWYgQlRJRl9IRl9TRVJWSUNFX05BTUVTCisjZGVmaW5lIEJUSUZfSEZfU0VSVklDRV9OQU1FUyB7QlRJRl9IU0FHX1NFUlZJQ0VfTkFNRSAsIEJUSUZfSEZBR19TRVJWSUNFX05BTUV9CisjZW5kaWYKKworI2lmbmRlZiBCVElGX0hGX1NFQ1VSSVRZCisjZGVmaW5lIEJUSUZfSEZfU0VDVVJJVFkgICAgKEJUQV9TRUNfQVVUSEVOVElDQVRFIHwgQlRBX1NFQ19FTkNSWVBUKQorI2VuZGlmCisKKyNpZm5kZWYgQlRJRl9IRl9GRUFUVVJFUworI2RlZmluZSBCVElGX0hGX0ZFQVRVUkVTICAgKCBCVEFfQUdfRkVBVF8zV0FZIHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCVEFfQUdfRkVBVF9FQ05SICAgfCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJUQV9BR19GRUFUX1JFSkVDVCB8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQlRBX0FHX0ZFQVRfRUNTICAgIHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCVEFfQUdfRkVBVF9FWFRFUlIgfCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJUQV9BR19GRUFUX0JUUkggICB8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQlRBX0FHX0ZFQVRfVlJFQyAgIHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCVEFfQUdfRkVBVF9VTkFUKQorI2VuZGlmCisKKyNkZWZpbmUgQlRJRl9IRl9JRF8xICAgICAgICAwCisKKyNkZWZpbmUgQlRJRl9IRl9DQUxMX0VORF9USU1FT1VUICAgICAgIDYKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorKiogIExvY2FsIHR5cGUgZGVmaW5pdGlvbnMKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorKiogIFN0YXRpYyB2YXJpYWJsZXMKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3N0YXRpYyBidGhmX2NhbGxiYWNrc190ICpidF9oZl9jYWxsYmFja3MgPSBOVUxMOworCisjZGVmaW5lIENIRUNLX0JUSEZfSU5JVCgpIGlmIChidF9oZl9jYWxsYmFja3MgPT0gTlVMTClcCisgICAge1wKKyAgICAgICAgQlRJRl9UUkFDRV9XQVJOSU5HMSgiQlRIRjogJXM6IEJUSEYgbm90IGluaXRpYWxpemVkIiwgX19GVU5DVElPTl9fKTtcCisgICAgICAgIHJldHVybiBCVF9TVEFUVVNfTk9UX1JFQURZO1wKKyAgICB9XAorICAgIGVsc2VcCisgICAge1wKKyAgICAgICAgQlRJRl9UUkFDRV9FVkVOVDEoIkJUSEY6ICVzIiwgX19GVU5DVElPTl9fKTtcCisgICAgfQorCisjZGVmaW5lIENIRUNLX0JUSEZfU0xDX0NPTk5FQ1RFRCgpIGlmIChidF9oZl9jYWxsYmFja3MgPT0gTlVMTClcCisgICAge1wKKyAgICAgICAgQlRJRl9UUkFDRV9XQVJOSU5HMSgiQlRIRjogJXM6IEJUSEYgbm90IGluaXRpYWxpemVkIiwgX19GVU5DVElPTl9fKTtcCisgICAgICAgIHJldHVybiBCVF9TVEFUVVNfTk9UX1JFQURZO1wKKyAgICB9XAorICAgIGVsc2UgaWYgKGJ0aWZfaGZfY2Iuc3RhdGUgIT0gQlRIRl9DT05ORUNUSU9OX1NUQVRFX1NMQ19DT05ORUNURUQpXAorICAgIHtcCisgICAgICAgIEJUSUZfVFJBQ0VfV0FSTklORzIoIkJUSEY6ICVzOiBTTEMgY29ubmVjdGlvbiBub3QgdXAuIHN0YXRlPSVzIiwgX19GVU5DVElPTl9fLCBkdW1wX2hmX2Nvbm5fc3RhdGUoYnRpZl9oZl9jYi5zdGF0ZSkpO1wKKyAgICAgICAgcmV0dXJuIEJUX1NUQVRVU19OT1RfUkVBRFk7XAorICAgIH1cCisgICAgZWxzZVwKKyAgICB7XAorICAgICAgICBCVElGX1RSQUNFX0VWRU5UMSgiQlRIRjogJXMiLCBfX0ZVTkNUSU9OX18pO1wKKyAgICB9CisKKy8qIEJUSUYtSEYgY29udHJvbCBibG9jayB0byBtYXAgYmRhZGRyIHRvIEJUQSBoYW5kbGUgKi8KK3R5cGVkZWYgc3RydWN0IF9idGlmX2hmX2NiCit7CisgICAgVUlOVDE2ICAgICAgICAgICAgICAgICAgaGFuZGxlOworICAgIGJ0X2JkYWRkcl90ICAgICAgICAgICAgIGNvbm5lY3RlZF9iZGE7CisgICAgYnRoZl9jb25uZWN0aW9uX3N0YXRlX3Qgc3RhdGU7CisgICAgYnRoZl92cl9zdGF0ZV90ICAgICAgICAgdnJfc3RhdGU7CisgICAgdEJUQV9BR19QRUVSX0ZFQVQgICAgICAgcGVlcl9mZWF0OworICAgIGludCAgICAgICAgICAgICAgICAgICAgIG51bV9hY3RpdmU7CisgICAgaW50ICAgICAgICAgICAgICAgICAgICAgbnVtX2hlbGQ7CisgICAgc3RydWN0IHRpbWVzcGVjICAgICAgICAgY2FsbF9lbmRfdGltZXN0YW1wOworICAgIGJ0aGZfY2FsbF9zdGF0ZV90ICAgICAgIGNhbGxfc2V0dXBfc3RhdGU7Cit9IGJ0aWZfaGZfY2JfdDsKKworc3RhdGljIGJ0aWZfaGZfY2JfdCBidGlmX2hmX2NiOworCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyoqICBTdGF0aWMgZnVuY3Rpb25zCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyoqICBFeHRlcm5zCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyoqICBGdW5jdGlvbnMKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyoqCisqKiBGdW5jdGlvbiAgICAgICAgIGlzX2Nvbm5lY3RlZAorKioKKyoqIERlc2NyaXB0aW9uICAgICAgSW50ZXJuYWwgZnVuY3Rpb24gdG8gY2hlY2sgaWYgSEYgaXMgY29ubmVjdGVkCisqKgorKiogUmV0dXJucyAgICAgICAgICBUUlVFIGlmIGNvbm5lY3RlZAorKioKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitzdGF0aWMgQk9PTEVBTiBpc19jb25uZWN0ZWQoYnRfYmRhZGRyX3QgKmJkX2FkZHIpCit7CisgICAgaWYgKCgoYnRpZl9oZl9jYi5zdGF0ZSA9PSBCVEhGX0NPTk5FQ1RJT05fU1RBVEVfQ09OTkVDVEVEKSB8fCAoYnRpZl9oZl9jYi5zdGF0ZSA9PSBCVEhGX0NPTk5FQ1RJT05fU1RBVEVfU0xDX0NPTk5FQ1RFRCkpJiYKKyAgICAgICAgKChiZF9hZGRyID09IE5VTEwpIHx8IChiZGNtcChiZF9hZGRyLT5hZGRyZXNzLCBidGlmX2hmX2NiLmNvbm5lY3RlZF9iZGEuYWRkcmVzcykgPT0gMCkpKQorICAgICAgICByZXR1cm4gVFJVRTsKKyAgICBlbHNlCisgICAgICAgIHJldHVybiBGQUxTRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyoqCisqKiBGdW5jdGlvbiAgICAgICAgIGNhbGxzdGF0ZV90b19jYWxsc2V0dXAKKyoqCisqKiBEZXNjcmlwdGlvbiAgICAgIENvbnZlcnRzIEhBTCBjYWxsIHN0YXRlIHRvIEJUQSBjYWxsIHNldHVwIGluZGljYXRvciB2YWx1ZQorKioKKyoqIFJldHVybnMgICAgICAgICAgQlRBIGNhbGwgaW5kaWNhdG9yIHZhbHVlCisqKgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3N0YXRpYyBVSU5UOCBjYWxsc3RhdGVfdG9fY2FsbHNldHVwKGJ0aGZfY2FsbF9zdGF0ZV90IGNhbGxfc3RhdGUpCit7CisgICAgVUlOVDggY2FsbF9zZXR1cCA9IDA7CisgICAgaWYgKGNhbGxfc3RhdGUgPT0gQlRIRl9DQUxMX1NUQVRFX0lOQ09NSU5HKQorICAgICAgICBjYWxsX3NldHVwID0gMTsKKyAgICBpZiAoY2FsbF9zdGF0ZSA9PSBCVEhGX0NBTExfU1RBVEVfRElBTElORykKKyAgICAgICAgY2FsbF9zZXR1cCA9IDI7CisgICAgaWYgKGNhbGxfc3RhdGUgPT0gQlRIRl9DQUxMX1NUQVRFX0FMRVJUSU5HKQorICAgICAgICBjYWxsX3NldHVwID0gMzsKKworICAgIHJldHVybiBjYWxsX3NldHVwOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorKioKKyoqIEZ1bmN0aW9uICAgICAgICAgc2VuZF9hdF9yZXN1bHQKKyoqCisqKiBEZXNjcmlwdGlvbiAgICAgIFNlbmQgQVQgcmVzdWx0IGNvZGUgKE9LL0VSUk9SKQorKioKKyoqIFJldHVybnMgICAgICAgICAgdm9pZAorKioKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitzdGF0aWMgdm9pZCBzZW5kX2F0X3Jlc3VsdChVSU5UOCBva19mbGFnLCBVSU5UMTYgZXJyY29kZSkKK3sKKyAgICB0QlRBX0FHX1JFU19EQVRBICAgIGFnX3JlczsKKyAgICBtZW1zZXQgKCZhZ19yZXMsIDAsIHNpemVvZiAoYWdfcmVzKSk7CisKKyAgICBhZ19yZXMub2tfZmxhZyA9IG9rX2ZsYWc7CisgICAgaWYgKG9rX2ZsYWcgPT0gQlRBX0FHX09LX0VSUk9SKQorICAgIHsKKyAgICAgICAgYWdfcmVzLmVycmNvZGUgPSBlcnJjb2RlOworICAgIH0KKworICAgIEJUQV9BZ1Jlc3VsdCAoYnRpZl9oZl9jYi5oYW5kbGUsIEJUQV9BR19VTkFUX1JFUywgJmFnX3Jlcyk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisqKgorKiogRnVuY3Rpb24gICAgICAgICBzZW5kX2luZGljYXRvcl91cGRhdGUKKyoqCisqKiBEZXNjcmlwdGlvbiAgICAgIFNlbmQgaW5kaWNhdG9yIHVwZGF0ZSAoQ0lFVikKKyoqCisqKiBSZXR1cm5zICAgICAgICAgIHZvaWQKKyoqCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworc3RhdGljIHZvaWQgc2VuZF9pbmRpY2F0b3JfdXBkYXRlIChVSU5UMTYgaW5kaWNhdG9yLCBVSU5UMTYgdmFsdWUpCit7CisgICAgdEJUQV9BR19SRVNfREFUQSBhZ19yZXM7CisKKyAgICBtZW1zZXQoJmFnX3JlcywgMCwgc2l6ZW9mKHRCVEFfQUdfUkVTX0RBVEEpKTsKKyAgICBhZ19yZXMuaW5kLmlkID0gaW5kaWNhdG9yOworICAgIGFnX3Jlcy5pbmQudmFsdWUgPSB2YWx1ZTsKKworICAgIEJUQV9BZ1Jlc3VsdChCVEFfQUdfSEFORExFX0FMTCwgQlRBX0FHX0lORF9SRVMsICZhZ19yZXMpOworfQorCit2b2lkIGNsZWFyX3Bob25lX3N0YXRlKCkKK3sKKyAgICBidGlmX2hmX2NiLmNhbGxfc2V0dXBfc3RhdGUgPSBCVEhGX0NBTExfU1RBVEVfSURMRTsKKyAgICBidGlmX2hmX2NiLm51bV9hY3RpdmUgPSBidGlmX2hmX2NiLm51bV9oZWxkID0gMDsKK30KKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyoqICAgU2VjdGlvbiBuYW1lIChHcm91cCBvZiBmdW5jdGlvbnMpCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisqKgorKiogICBidGlmIGhmIGFwaSBmdW5jdGlvbnMgKG5vIGNvbnRleHQgc3dpdGNoKQorKioKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisqKgorKiogRnVuY3Rpb24gICAgICAgICBidGlmX2hmX3Vwc3RyZWFtc19ldnQKKyoqCisqKiBEZXNjcmlwdGlvbiAgICAgIEV4ZWN1dGVzIEhGIFVQU1RSRUFNUyBldmVudHMgaW4gYnRpZiBjb250ZXh0CisqKgorKiogUmV0dXJucyAgICAgICAgICB2b2lkCisqKgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3N0YXRpYyB2b2lkIGJ0aWZfaGZfdXBzdHJlYW1zX2V2dChVSU5UMTYgZXZlbnQsIGNoYXIqIHBfcGFyYW0pCit7CisgICAgdEJUQV9BRyAqcF9kYXRhID0gKHRCVEFfQUcgKilwX3BhcmFtOworICAgIGJkc3RyX3QgYmRzdHI7CisKKyAgICBCVElGX1RSQUNFX0RFQlVHMigiJXM6IGV2ZW50PSVzIiwgX19GVU5DVElPTl9fLCBkdW1wX2hmX2V2ZW50KGV2ZW50KSk7CisKKyAgICBzd2l0Y2ggKGV2ZW50KQorICAgIHsKKyAgICAgICAgY2FzZSBCVEFfQUdfRU5BQkxFX0VWVDoKKyAgICAgICAgY2FzZSBCVEFfQUdfRElTQUJMRV9FVlQ6CisgICAgICAgICAgICBicmVhazsKKworICAgICAgICBjYXNlIEJUQV9BR19SRUdJU1RFUl9FVlQ6CisgICAgICAgICAgICBidGlmX2hmX2NiLmhhbmRsZSA9IHBfZGF0YS0+cmVnLmhkci5oYW5kbGU7CisgICAgICAgICAgICBicmVhazsKKworICAgICAgICBjYXNlIEJUQV9BR19PUEVOX0VWVDoKKyAgICAgICAgICAgIGlmIChwX2RhdGEtPm9wZW4uc3RhdHVzID09IEJUQV9BR19TVUNDRVNTKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGJkY3B5KGJ0aWZfaGZfY2IuY29ubmVjdGVkX2JkYS5hZGRyZXNzLCBwX2RhdGEtPm9wZW4uYmRfYWRkcik7CisgICAgICAgICAgICAgICAgYnRpZl9oZl9jYi5zdGF0ZSA9IEJUSEZfQ09OTkVDVElPTl9TVEFURV9DT05ORUNURUQ7CisgICAgICAgICAgICAgICAgYnRpZl9oZl9jYi5wZWVyX2ZlYXQgPSAwOworICAgICAgICAgICAgICAgIGNsZWFyX3Bob25lX3N0YXRlKCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlIGlmIChidGlmX2hmX2NiLnN0YXRlID09IEJUSEZfQ09OTkVDVElPTl9TVEFURV9DT05ORUNUSU5HKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGJ0aWZfaGZfY2Iuc3RhdGUgPSBCVEhGX0NPTk5FQ1RJT05fU1RBVEVfRElTQ09OTkVDVEVEOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIEJUSUZfVFJBQ0VfV0FSTklORzQoIiVzOiBBRyBvcGVuIGZhaWxlZCwgYnV0IGFub3RoZXIgZGV2aWNlIGNvbm5lY3RlZC4gc3RhdHVzPSVkIHN0YXRlPSVkIGNvbm5lY3RlZCBkZXZpY2U9JXMiLAorICAgICAgICAgICAgICAgICAgICAgICAgX19GVU5DVElPTl9fLCBwX2RhdGEtPm9wZW4uc3RhdHVzLCBidGlmX2hmX2NiLnN0YXRlLCBiZDJzdHIoJmJ0aWZfaGZfY2IuY29ubmVjdGVkX2JkYSwgJmJkc3RyKSk7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIEhBTF9DQkFDSyhidF9oZl9jYWxsYmFja3MsIGNvbm5lY3Rpb25fc3RhdGVfY2IsIGJ0aWZfaGZfY2Iuc3RhdGUsICZidGlmX2hmX2NiLmNvbm5lY3RlZF9iZGEpOworCisgICAgICAgICAgICBpZiAoYnRpZl9oZl9jYi5zdGF0ZSA9PSBCVEhGX0NPTk5FQ1RJT05fU1RBVEVfRElTQ09OTkVDVEVEKQorICAgICAgICAgICAgICAgIGJkc2V0YW55KGJ0aWZfaGZfY2IuY29ubmVjdGVkX2JkYS5hZGRyZXNzKTsKKworICAgICAgICAgICAgaWYgKHBfZGF0YS0+b3Blbi5zdGF0dXMgIT0gQlRBX0FHX1NVQ0NFU1MpCisgICAgICAgICAgICAgICAgYnRpZl9xdWV1ZV9hZHZhbmNlKCk7CisgICAgICAgICAgICBicmVhazsKKworICAgICAgICBjYXNlIEJUQV9BR19DTE9TRV9FVlQ6CisgICAgICAgICAgICBidGlmX2hmX2NiLnN0YXRlID0gQlRIRl9DT05ORUNUSU9OX1NUQVRFX0RJU0NPTk5FQ1RFRDsKKyAgICAgICAgICAgIEhBTF9DQkFDSyhidF9oZl9jYWxsYmFja3MsIGNvbm5lY3Rpb25fc3RhdGVfY2IsIGJ0aWZfaGZfY2Iuc3RhdGUsICZidGlmX2hmX2NiLmNvbm5lY3RlZF9iZGEpOworICAgICAgICAgICAgYmRzZXRhbnkoYnRpZl9oZl9jYi5jb25uZWN0ZWRfYmRhLmFkZHJlc3MpOworICAgICAgICAgICAgYnRpZl9oZl9jYi5wZWVyX2ZlYXQgPSAwOworICAgICAgICAgICAgY2xlYXJfcGhvbmVfc3RhdGUoKTsKKyAgICAgICAgICAgIC8qIElmIEFHX09QRU4gd2FzIHJlY2VpdmVkIGJ1dCBTTEMgd2FzIG5vdCBzZXR1cCBpbiBhIHNwZWNpZmllZCB0aW1lICgxMCBzZWNvbmRzKSwKKyAgICAgICAgICAgICoqIHRoZW4gQUdfQ0xPU0UgbWF5IGJlIHJlY2VpdmVkLiBXZSBuZWVkIHRvIGFkdmFuY2UgdGhlIHF1ZXVlIGhlcmUKKyAgICAgICAgICAgICovCisgICAgICAgICAgICBidGlmX3F1ZXVlX2FkdmFuY2UoKTsKKyAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgIGNhc2UgQlRBX0FHX0NPTk5fRVZUOgorICAgICAgICAgICAgYnRpZl9oZl9jYi5wZWVyX2ZlYXQgPSBwX2RhdGEtPmNvbm4ucGVlcl9mZWF0OworICAgICAgICAgICAgYnRpZl9oZl9jYi5zdGF0ZSA9IEJUSEZfQ09OTkVDVElPTl9TVEFURV9TTENfQ09OTkVDVEVEOworCisgICAgICAgICAgICBIQUxfQ0JBQ0soYnRfaGZfY2FsbGJhY2tzLCBjb25uZWN0aW9uX3N0YXRlX2NiLCBidGlmX2hmX2NiLnN0YXRlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmYnRpZl9oZl9jYi5jb25uZWN0ZWRfYmRhKTsKKyAgICAgICAgICAgIGJ0aWZfcXVldWVfYWR2YW5jZSgpOworICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgY2FzZSBCVEFfQUdfQVVESU9fT1BFTl9FVlQ6CisgICAgICAgICAgICBIQUxfQ0JBQ0soYnRfaGZfY2FsbGJhY2tzLCBhdWRpb19zdGF0ZV9jYiwgQlRIRl9BVURJT19TVEFURV9DT05ORUNURUQsICZidGlmX2hmX2NiLmNvbm5lY3RlZF9iZGEpOworICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgY2FzZSBCVEFfQUdfQVVESU9fQ0xPU0VfRVZUOgorICAgICAgICAgICAgSEFMX0NCQUNLKGJ0X2hmX2NhbGxiYWNrcywgYXVkaW9fc3RhdGVfY2IsIEJUSEZfQVVESU9fU1RBVEVfRElTQ09OTkVDVEVELCAmYnRpZl9oZl9jYi5jb25uZWN0ZWRfYmRhKTsKKyAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgIC8qIEJUQSBhdXRvLXJlc3BvbmRzLCBzaWxlbnRseSBkaXNjYXJkICovCisgICAgICAgIGNhc2UgQlRBX0FHX1NQS19FVlQ6CisgICAgICAgIGNhc2UgQlRBX0FHX01JQ19FVlQ6CisgICAgICAgICAgICBIQUxfQ0JBQ0soYnRfaGZfY2FsbGJhY2tzLCB2b2x1bWVfY21kX2NiLAorICAgICAgICAgICAgICAgIChldmVudCA9PSBCVEFfQUdfU1BLX0VWVCkgPyBCVEhGX1ZPTFVNRV9UWVBFX1NQSyA6IEJUSEZfVk9MVU1FX1RZUEVfTUlDLCBwX2RhdGEtPnZhbC5udW0pOworICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgY2FzZSBCVEFfQUdfQVRfQV9FVlQ6CisgICAgICAgICAgICBIQUxfQ0JBQ0soYnRfaGZfY2FsbGJhY2tzLCBhbnN3ZXJfY2FsbF9jbWRfY2IpOworICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgLyogSmF2YSBuZWVkcyB0byBzZW5kIE9LL0VSUk9SIGZvciB0aGVzZSBjb21tYW5kcyAqLworICAgICAgICBjYXNlIEJUQV9BR19BVF9CTEROX0VWVDoKKyAgICAgICAgY2FzZSBCVEFfQUdfQVRfRF9FVlQ6CisgICAgICAgICAgICBIQUxfQ0JBQ0soYnRfaGZfY2FsbGJhY2tzLCBkaWFsX2NhbGxfY21kX2NiLAorICAgICAgICAgICAgICAgIChldmVudCA9PSBCVEFfQUdfQVRfRF9FVlQpID8gcF9kYXRhLT52YWwuc3RyIDogTlVMTCk7CisgICAgICAgICAgICBicmVhazsKKworICAgICAgICBjYXNlIEJUQV9BR19BVF9DSFVQX0VWVDoKKyAgICAgICAgICAgIEhBTF9DQkFDSyhidF9oZl9jYWxsYmFja3MsIGhhbmd1cF9jYWxsX2NtZF9jYik7CisgICAgICAgICAgICBicmVhazsKKworICAgICAgICBjYXNlIEJUQV9BR19BVF9DSU5EX0VWVDoKKyAgICAgICAgICAgIEhBTF9DQkFDSyhidF9oZl9jYWxsYmFja3MsIGNpbmRfY21kX2NiKTsKKyAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgIGNhc2UgQlRBX0FHX0FUX1ZUU19FVlQ6CisgICAgICAgICAgICBIQUxfQ0JBQ0soYnRfaGZfY2FsbGJhY2tzLCBkdG1mX2NtZF9jYiwgcF9kYXRhLT52YWwuc3RyWzBdKTsKKyAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgIGNhc2UgQlRBX0FHX0FUX0JWUkFfRVZUOgorICAgICAgICAgICAgSEFMX0NCQUNLKGJ0X2hmX2NhbGxiYWNrcywgdnJfY21kX2NiLAorICAgICAgICAgICAgICAgIChwX2RhdGEtPnZhbC5udW0gPT0gMSkgPyBCVEhGX1ZSX1NUQVRFX1NUQVJURUQgOiBCVEhGX1ZSX1NUQVRFX1NUT1BQRUQpOworICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgY2FzZSBCVEFfQUdfQVRfTlJFQ19FVlQ6CisgICAgICAgICAgICBIQUxfQ0JBQ0soYnRfaGZfY2FsbGJhY2tzLCBucmVjX2NtZF9jYiwKKyAgICAgICAgICAgICAgICAocF9kYXRhLT52YWwubnVtID09IDEpID8gQlRIRl9OUkVDX1NUQVJUIDogQlRIRl9OUkVDX1NUT1ApOworICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgLyogVE9ETzogQWRkIGEgY2FsbGJhY2sgZm9yIENCQyAqLworICAgICAgICBjYXNlIEJUQV9BR19BVF9DQkNfRVZUOgorICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgY2FzZSBCVEFfQUdfQVRfQ0tQRF9FVlQ6CisgICAgICAgICAgICBIQUxfQ0JBQ0soYnRfaGZfY2FsbGJhY2tzLCBrZXlfcHJlc3NlZF9jbWRfY2IpOworICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgLyogSmF2YSBuZWVkcyB0byBzZW5kIE9LL0VSUk9SIGZvciB0aGVzZSBjb21tYW5kcyAqLworICAgICAgICBjYXNlIEJUQV9BR19BVF9DSExEX0VWVDoKKyAgICAgICAgICAgIEhBTF9DQkFDSyhidF9oZl9jYWxsYmFja3MsIGNobGRfY21kX2NiLCBhdG9pKHBfZGF0YS0+dmFsLnN0cikpOworICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgY2FzZSBCVEFfQUdfQVRfQ0xDQ19FVlQ6CisgICAgICAgICAgICBIQUxfQ0JBQ0soYnRfaGZfY2FsbGJhY2tzLCBjbGNjX2NtZF9jYiwgcF9kYXRhLT52YWwubnVtKTsKKyAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgIGNhc2UgQlRBX0FHX0FUX0NPUFNfRVZUOgorICAgICAgICAgICAgSEFMX0NCQUNLKGJ0X2hmX2NhbGxiYWNrcywgY29wc19jbWRfY2IpOworICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgY2FzZSBCVEFfQUdfQVRfVU5BVF9FVlQ6CisgICAgICAgICAgICBIQUxfQ0JBQ0soYnRfaGZfY2FsbGJhY2tzLCB1bmtub3duX2F0X2NtZF9jYiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcF9kYXRhLT52YWwuc3RyKTsKKyAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgIGNhc2UgQlRBX0FHX0FUX0NOVU1fRVZUOgorICAgICAgICAgICAgSEFMX0NCQUNLKGJ0X2hmX2NhbGxiYWNrcywgY251bV9jbWRfY2IpOworICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgLyogVE9ETzogU29tZSBvZiB0aGVzZSBjb21tYW5kcyBtYXkgbmVlZCB0byBiZSBzZW50IHRvIGFwcC4gRm9yIG5vdyByZXNwb25kIHdpdGggZXJyb3IgKi8KKyAgICAgICAgY2FzZSBCVEFfQUdfQVRfQklOUF9FVlQ6CisgICAgICAgIGNhc2UgQlRBX0FHX0FUX0JUUkhfRVZUOgorICAgICAgICAgICAgc2VuZF9hdF9yZXN1bHQoQlRBX0FHX09LX0VSUk9SLCBCVEFfQUdfRVJSX09QX05PVF9TVVBQT1JURUQpOworICAgICAgICAgICAgYnJlYWs7CisKKworICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgQlRJRl9UUkFDRV9XQVJOSU5HMigiJXM6IFVuaGFuZGxlZCBldmVudDogJWQiLCBfX0ZVTkNUSU9OX18sIGV2ZW50KTsKKyAgICAgICAgICAgIGJyZWFrOworICAgIH0KK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyoqCisqKiBGdW5jdGlvbiAgICAgICAgIGJ0ZV9oZl9ldnQKKyoqCisqKiBEZXNjcmlwdGlvbiAgICAgIFN3aXRjaGVzIGNvbnRleHQgZnJvbSBCVEUgdG8gQlRJRiBmb3IgYWxsIEhGIGV2ZW50cworKioKKyoqIFJldHVybnMgICAgICAgICAgdm9pZAorKioKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK3N0YXRpYyB2b2lkIGJ0ZV9oZl9ldnQodEJUQV9BR19FVlQgZXZlbnQsIHRCVEFfQUcgKnBfZGF0YSkKK3sKKyAgICBidF9zdGF0dXNfdCBzdGF0dXM7CisgICAgaW50IHBhcmFtX2xlbiA9IDA7CisKKyAgICAvKiBUT0RPOiBCVEEgc2VuZHMgdGhlIHVuaW9uIG1lbWJlcnMgYW5kIG5vdCB0QlRBX0FHLiBJZiB1c2luZyBwYXJhbV9sZW49c2l6ZW9mKHRCVEFfQUcpLCB3ZSBnZXQgYSBjcmFzaCBvbiBtZW1jcHkgKi8KKyAgICBpZiAoQlRBX0FHX1JFR0lTVEVSX0VWVCA9PSBldmVudCkKKyAgICAgICAgcGFyYW1fbGVuID0gc2l6ZW9mKHRCVEFfQUdfUkVHSVNURVIpOworICAgIGVsc2UgaWYgKEJUQV9BR19PUEVOX0VWVCA9PSBldmVudCkKKyAgICAgICAgcGFyYW1fbGVuID0gc2l6ZW9mKHRCVEFfQUdfT1BFTik7CisgICAgZWxzZSBpZiAoQlRBX0FHX0NPTk5fRVZUID09IGV2ZW50KQorICAgICAgICBwYXJhbV9sZW4gPSBzaXplb2YodEJUQV9BR19DT05OKTsKKyAgICBlbHNlIGlmICggKEJUQV9BR19DTE9TRV9FVlQgPT0gZXZlbnQpIHx8IChCVEFfQUdfQVVESU9fT1BFTl9FVlQgPT0gZXZlbnQpIHx8IChCVEFfQUdfQVVESU9fQ0xPU0VfRVZUID09IGV2ZW50KSkKKyAgICAgICAgcGFyYW1fbGVuID0gc2l6ZW9mKHRCVEFfQUdfSERSKTsKKyAgICBlbHNlIGlmIChwX2RhdGEpCisgICAgICAgIHBhcmFtX2xlbiA9IHNpemVvZih0QlRBX0FHX1ZBTCk7CisKKyAgICAvKiBzd2l0Y2ggY29udGV4dCB0byBidGlmIHRhc2sgY29udGV4dCAoY29weSBmdWxsIHVuaW9uIHNpemUgZm9yIGNvbnZlbmllbmNlKSAqLworICAgIHN0YXR1cyA9IGJ0aWZfdHJhbnNmZXJfY29udGV4dChidGlmX2hmX3Vwc3RyZWFtc19ldnQsICh1aW50MTZfdClldmVudCwgKHZvaWQqKXBfZGF0YSwgcGFyYW1fbGVuLCBOVUxMKTsKKworICAgIC8qIGNhdGNoIGFueSBmYWlsZWQgY29udGV4dCB0cmFuc2ZlcnMgKi8KKyAgICBBU1NFUlRDKHN0YXR1cyA9PSBCVF9TVEFUVVNfU1VDQ0VTUywgImNvbnRleHQgdHJhbnNmZXIgZmFpbGVkIiwgc3RhdHVzKTsKK30KKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorKioKKyoqIEZ1bmN0aW9uICAgICAgICAgYnRpZl9pbl9oZl9nZW5lcmljX2V2dAorKioKKyoqIERlc2NyaXB0aW9uICAgICBQcm9jZXNzZXMgZ2VuZXJpYyBldmVudHMgdG8gYmUgc2VudCB0byBKTkkgdGhhdCBhcmUgbm90IHRyaWdnZXJlZCBmcm9tIHRoZSBCVEEuCisqKiAgICAgICAgICAgICAgICAgICAgICBBbHdheXMgcnVucyBpbiBCVElGIGNvbnRleHQKKyoqCisqKiBSZXR1cm5zICAgICAgICAgIHZvaWQKKyoqCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworc3RhdGljIHZvaWQgYnRpZl9pbl9oZl9nZW5lcmljX2V2dChVSU5UMTYgZXZlbnQsIGNoYXIgKnBfcGFyYW0pCit7CisgICAgVU5VU0VEKHBfcGFyYW0pOworCisgICAgQlRJRl9UUkFDRV9FVkVOVDIoIiVzOiBldmVudD0lZCIsIF9fRlVOQ1RJT05fXywgZXZlbnQpOworICAgIHN3aXRjaCAoZXZlbnQpIHsKKyAgICAgICAgY2FzZSBCVElGX0hGUF9DQl9BVURJT19DT05ORUNUSU5HOgorICAgICAgICB7CisgICAgICAgICAgICBIQUxfQ0JBQ0soYnRfaGZfY2FsbGJhY2tzLCBhdWRpb19zdGF0ZV9jYiwgQlRIRl9BVURJT19TVEFURV9DT05ORUNUSU5HLAorICAgICAgICAgICAgICAgICAgICAgICZidGlmX2hmX2NiLmNvbm5lY3RlZF9iZGEpOworICAgICAgICB9IGJyZWFrOworICAgICAgICBkZWZhdWx0OgorICAgICAgICB7CisgICAgICAgICAgICBCVElGX1RSQUNFX1dBUk5JTkcyKCIlcyA6IFVua25vd24gZXZlbnQgMHgleCIsIF9fRlVOQ1RJT05fXywgZXZlbnQpOworICAgICAgICB9CisgICAgICAgIGJyZWFrOworICAgIH0KK30KKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorKioKKyoqIEZ1bmN0aW9uICAgICAgICAgYnRpZl9oZl9pbml0CisqKgorKiogRGVzY3JpcHRpb24gICAgIGluaXRpYWxpemVzIHRoZSBoZiBpbnRlcmZhY2UKKyoqCisqKiBSZXR1cm5zICAgICAgICAgYnRfc3RhdHVzX3QKKyoqCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworc3RhdGljIGJ0X3N0YXR1c190IGluaXQoIGJ0aGZfY2FsbGJhY2tzX3QqIGNhbGxiYWNrcyApCit7CisgICAgQlRJRl9UUkFDRV9FVkVOVDEoIiVzIiwgX19GVU5DVElPTl9fKTsKKworICAgIGJ0X2hmX2NhbGxiYWNrcyA9IGNhbGxiYWNrczsKKworICAgIC8qIEludm9rZSB0aGUgZW5hYmxlIHNlcnZpY2UgQVBJIHRvIHRoZSBjb3JlIHRvIHNldCB0aGUgYXBwcm9wcmlhdGUgc2VydmljZV9pZAorICAgICAqIEludGVybmFsbHksIHRoZSBIU1BfU0VSVklDRV9JRCBzaGFsbCBhbHNvIGJlIGVuYWJsZWQgaWYgSEZQIGlzIGVuYWJsZWQgKHBob25lKQorICAgICAqIG90aHdlcndpc2Ugb25seSBIU1AgaXMgZW5hYmxlZCAodGFibGV0KQorICAgICovCisjaWYgKGRlZmluZWQoQlRJRl9IRl9TRVJWSUNFUykgJiYgKEJUSUZfSEZfU0VSVklDRVMgJiBCVEFfSEZQX1NFUlZJQ0VfTUFTSykpCisgICAgYnRpZl9lbmFibGVfc2VydmljZShCVEFfSEZQX1NFUlZJQ0VfSUQpOworI2Vsc2UKKyAgICBidGlmX2VuYWJsZV9zZXJ2aWNlKEJUQV9IU1BfU0VSVklDRV9JRCk7CisjZW5kaWYKKworICAgIG1lbXNldCgmYnRpZl9oZl9jYiwgMCwgc2l6ZW9mKGJ0aWZfaGZfY2JfdCkpOworICAgIGNsZWFyX3Bob25lX3N0YXRlKCk7CisKKyAgICByZXR1cm4gQlRfU1RBVFVTX1NVQ0NFU1M7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisqKgorKiogRnVuY3Rpb24gICAgICAgICBjb25uZWN0CisqKgorKiogRGVzY3JpcHRpb24gICAgIGNvbm5lY3QgdG8gaGVhZHNldAorKioKKyoqIFJldHVybnMgICAgICAgICBidF9zdGF0dXNfdAorKioKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitzdGF0aWMgYnRfc3RhdHVzX3QgY29ubmVjdF9pbnQoIGJ0X2JkYWRkcl90ICpiZF9hZGRyICkKK3sKKyAgICBpZiAoIWlzX2Nvbm5lY3RlZChiZF9hZGRyKSkKKyAgICB7CisgICAgICAgIGJ0aWZfaGZfY2Iuc3RhdGUgPSBCVEhGX0NPTk5FQ1RJT05fU1RBVEVfQ09OTkVDVElORzsKKyAgICAgICAgYmRjcHkoYnRpZl9oZl9jYi5jb25uZWN0ZWRfYmRhLmFkZHJlc3MsIGJkX2FkZHItPmFkZHJlc3MpOworCisgICAgICAgIEJUQV9BZ09wZW4oYnRpZl9oZl9jYi5oYW5kbGUsIGJ0aWZfaGZfY2IuY29ubmVjdGVkX2JkYS5hZGRyZXNzLAorICAgICAgICAgICAgICAgICAgIEJUSUZfSEZfU0VDVVJJVFksIEJUSUZfSEZfU0VSVklDRVMpOworICAgICAgICByZXR1cm4gQlRfU1RBVFVTX1NVQ0NFU1M7CisgICAgfQorCisgICAgcmV0dXJuIEJUX1NUQVRVU19CVVNZOworfQorCitzdGF0aWMgYnRfc3RhdHVzX3QgY29ubmVjdCggYnRfYmRhZGRyX3QgKmJkX2FkZHIgKQoreworICAgIENIRUNLX0JUSEZfSU5JVCgpOworICAgIHJldHVybiBidGlmX3F1ZXVlX2Nvbm5lY3QoVVVJRF9TRVJWQ0xBU1NfQUdfSEFORFNGUkVFLCBiZF9hZGRyLCBjb25uZWN0X2ludCk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisqKgorKiogRnVuY3Rpb24gICAgICAgICBkaXNjb25uZWN0CisqKgorKiogRGVzY3JpcHRpb24gICAgICBkaXNjb25uZWN0IGZyb20gaGVhZHNldAorKioKKyoqIFJldHVybnMgICAgICAgICBidF9zdGF0dXNfdAorKioKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitzdGF0aWMgYnRfc3RhdHVzX3QgZGlzY29ubmVjdCggYnRfYmRhZGRyX3QgKmJkX2FkZHIgKQoreworICAgIENIRUNLX0JUSEZfSU5JVCgpOworCisgICAgaWYgKGlzX2Nvbm5lY3RlZChiZF9hZGRyKSkKKyAgICB7CisgICAgICAgIEJUQV9BZ0Nsb3NlKGJ0aWZfaGZfY2IuaGFuZGxlKTsKKyAgICAgICAgcmV0dXJuIEJUX1NUQVRVU19TVUNDRVNTOworICAgIH0KKworICAgIHJldHVybiBCVF9TVEFUVVNfRkFJTDsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyoqCisqKiBGdW5jdGlvbiAgICAgICAgIGNvbm5lY3RfYXVkaW8KKyoqCisqKiBEZXNjcmlwdGlvbiAgICAgY3JlYXRlIGFuIGF1ZGlvIGNvbm5lY3Rpb24KKyoqCisqKiBSZXR1cm5zICAgICAgICAgYnRfc3RhdHVzX3QKKyoqCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworc3RhdGljIGJ0X3N0YXR1c190IGNvbm5lY3RfYXVkaW8oIGJ0X2JkYWRkcl90ICpiZF9hZGRyICkKK3sKKyAgICBDSEVDS19CVEhGX0lOSVQoKTsKKworICAgIGlmIChpc19jb25uZWN0ZWQoYmRfYWRkcikpCisgICAgeworICAgICAgICBCVEFfQWdBdWRpb09wZW4oYnRpZl9oZl9jYi5oYW5kbGUpOworCisgICAgICAgIC8qIEluZm9ybSB0aGUgYXBwbGljYXRpb24gdGhhdCB0aGUgYXVkaW8gY29ubmVjdGlvbiBoYXMgYmVlbiBpbml0aWF0ZWQgc3VjY2Vzc2Z1bGx5ICovCisgICAgICAgIGJ0aWZfdHJhbnNmZXJfY29udGV4dChidGlmX2luX2hmX2dlbmVyaWNfZXZ0LCBCVElGX0hGUF9DQl9BVURJT19DT05ORUNUSU5HLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGNoYXIgKiliZF9hZGRyLCBzaXplb2YoYnRfYmRhZGRyX3QpLCBOVUxMKTsKKyAgICAgICAgcmV0dXJuIEJUX1NUQVRVU19TVUNDRVNTOworICAgIH0KKworICAgIHJldHVybiBCVF9TVEFUVVNfRkFJTDsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyoqCisqKiBGdW5jdGlvbiAgICAgICAgIGRpc2Nvbm5lY3RfYXVkaW8KKyoqCisqKiBEZXNjcmlwdGlvbiAgICAgIGNsb3NlIHRoZSBhdWRpbyBjb25uZWN0aW9uCisqKgorKiogUmV0dXJucyAgICAgICAgIGJ0X3N0YXR1c190CisqKgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3N0YXRpYyBidF9zdGF0dXNfdCBkaXNjb25uZWN0X2F1ZGlvKCBidF9iZGFkZHJfdCAqYmRfYWRkciApCit7CisgICAgQ0hFQ0tfQlRIRl9JTklUKCk7CisKKyAgICBpZiAoaXNfY29ubmVjdGVkKGJkX2FkZHIpKQorICAgIHsKKyAgICAgICAgQlRBX0FnQXVkaW9DbG9zZShidGlmX2hmX2NiLmhhbmRsZSk7CisgICAgICAgIHJldHVybiBCVF9TVEFUVVNfU1VDQ0VTUzsKKyAgICB9CisKKyAgICByZXR1cm4gQlRfU1RBVFVTX0ZBSUw7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisqKgorKiogRnVuY3Rpb24gICAgICAgICBzdGFydF92b2ljZV9yZWNvZ25pdGlvbgorKioKKyoqIERlc2NyaXB0aW9uICAgICAgc3RhcnQgdm9pY2UgcmVjb2duaXRpb24KKyoqCisqKiBSZXR1cm5zICAgICAgICAgIGJ0X3N0YXR1c190CisqKgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3N0YXRpYyBidF9zdGF0dXNfdCBzdGFydF92b2ljZV9yZWNvZ25pdGlvbigpCit7CisgICAgQ0hFQ0tfQlRIRl9JTklUKCk7CisgICAgaWYgKGlzX2Nvbm5lY3RlZChOVUxMKSkKKyAgICB7CisgICAgICAgIGlmIChidGlmX2hmX2NiLnBlZXJfZmVhdCAmIEJUQV9BR19QRUVSX0ZFQVRfVlJFQykKKyAgICAgICAgeworICAgICAgICAgICAgdEJUQV9BR19SRVNfREFUQSBhZ19yZXM7CisgICAgICAgICAgICBtZW1zZXQoJmFnX3JlcywgMCwgc2l6ZW9mKGFnX3JlcykpOworICAgICAgICAgICAgYWdfcmVzLnN0YXRlID0gMTsKKyAgICAgICAgICAgIEJUQV9BZ1Jlc3VsdCAoYnRpZl9oZl9jYi5oYW5kbGUsIEJUQV9BR19CVlJBX1JFUywgJmFnX3Jlcyk7CisKKyAgICAgICAgICAgIHJldHVybiBCVF9TVEFUVVNfU1VDQ0VTUzsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCVF9TVEFUVVNfVU5TVVBQT1JURUQ7CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gQlRfU1RBVFVTX05PVF9SRUFEWTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyoqCisqKiBGdW5jdGlvbiAgICAgICAgIHN0b3Bfdm9pY2VfcmVjb2duaXRpb24KKyoqCisqKiBEZXNjcmlwdGlvbiAgICAgIHN0b3Agdm9pY2UgcmVjb2duaXRpb24KKyoqCisqKiBSZXR1cm5zICAgICAgICAgIGJ0X3N0YXR1c190CisqKgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3N0YXRpYyBidF9zdGF0dXNfdCBzdG9wX3ZvaWNlX3JlY29nbml0aW9uKCkKK3sKKyAgICBDSEVDS19CVEhGX0lOSVQoKTsKKworICAgIGlmIChpc19jb25uZWN0ZWQoTlVMTCkpCisgICAgeworICAgICAgICBpZiAoYnRpZl9oZl9jYi5wZWVyX2ZlYXQgJiBCVEFfQUdfUEVFUl9GRUFUX1ZSRUMpCisgICAgICAgIHsKKyAgICAgICAgICAgIHRCVEFfQUdfUkVTX0RBVEEgYWdfcmVzOworICAgICAgICAgICAgbWVtc2V0KCZhZ19yZXMsIDAsIHNpemVvZihhZ19yZXMpKTsKKyAgICAgICAgICAgIGFnX3Jlcy5zdGF0ZSA9IDA7CisgICAgICAgICAgICBCVEFfQWdSZXN1bHQgKGJ0aWZfaGZfY2IuaGFuZGxlLCBCVEFfQUdfQlZSQV9SRVMsICZhZ19yZXMpOworCisgICAgICAgICAgICByZXR1cm4gQlRfU1RBVFVTX1NVQ0NFU1M7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQlRfU1RBVFVTX1VOU1VQUE9SVEVEOworICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIEJUX1NUQVRVU19OT1RfUkVBRFk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisqKgorKiogRnVuY3Rpb24gICAgICAgICB2b2x1bWVfY29udHJvbAorKioKKyoqIERlc2NyaXB0aW9uICAgICAgdm9sdW1lIGNvbnRyb2wKKyoqCisqKiBSZXR1cm5zICAgICAgICAgIGJ0X3N0YXR1c190CisqKgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3N0YXRpYyBidF9zdGF0dXNfdCB2b2x1bWVfY29udHJvbChidGhmX3ZvbHVtZV90eXBlX3QgdHlwZSwgaW50IHZvbHVtZSkKK3sKKyAgICBDSEVDS19CVEhGX0lOSVQoKTsKKworICAgIHRCVEFfQUdfUkVTX0RBVEEgYWdfcmVzOworICAgIG1lbXNldCgmYWdfcmVzLCAwLCBzaXplb2YodEJUQV9BR19SRVNfREFUQSkpOworICAgIGlmIChpc19jb25uZWN0ZWQoTlVMTCkpCisgICAgeworICAgICAgICBhZ19yZXMubnVtID0gdm9sdW1lOworICAgICAgICBCVEFfQWdSZXN1bHQoYnRpZl9oZl9jYi5oYW5kbGUsCisgICAgICAgICAgICAgICAgICAgICAodHlwZSA9PSBCVEhGX1ZPTFVNRV9UWVBFX1NQSykgPyBCVEFfQUdfU1BLX1JFUyA6IEJUQV9BR19NSUNfUkVTLAorICAgICAgICAgICAgICAgICAgICAgJmFnX3Jlcyk7CisgICAgICAgIHJldHVybiBCVF9TVEFUVVNfU1VDQ0VTUzsKKyAgICB9CisKKyAgICByZXR1cm4gQlRfU1RBVFVTX0ZBSUw7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisqKgorKiogRnVuY3Rpb24gICAgICAgICBkZXZpY2Vfc3RhdHVzX25vdGlmaWNhdGlvbgorKioKKyoqIERlc2NyaXB0aW9uICAgICAgQ29tYmluZWQgZGV2aWNlIHN0YXR1cyBjaGFuZ2Ugbm90aWZpY2F0aW9uCisqKgorKiogUmV0dXJucyAgICAgICAgICBidF9zdGF0dXNfdAorKioKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitzdGF0aWMgYnRfc3RhdHVzX3QgZGV2aWNlX3N0YXR1c19ub3RpZmljYXRpb24oYnRoZl9uZXR3b3JrX3N0YXRlX3QgbnRrX3N0YXRlLAorICAgICAgICAgICAgICAgICAgICAgICAgICBidGhmX3NlcnZpY2VfdHlwZV90IHN2Y190eXBlLCBpbnQgc2lnbmFsLCBpbnQgYmF0dF9jaGcpCit7CisgICAgQ0hFQ0tfQlRIRl9JTklUKCk7CisKKyAgICBpZiAoaXNfY29ubmVjdGVkKE5VTEwpKQorICAgIHsKKyAgICAgICAgLyogc2VuZCBhbGwgaW5kaWNhdG9ycyB0byBCVEEuCisgICAgICAgICoqIEJUQSB3aWxsIG1ha2Ugc3VyZSBubyBkdXBsaWNhdGVzIGFyZSBzZW50IG91dAorICAgICAgICAqLworICAgICAgICBzZW5kX2luZGljYXRvcl91cGRhdGUoQlRBX0FHX0lORF9TRVJWSUNFLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKG50a19zdGF0ZSA9PSBCVEhGX05FVFdPUktfU1RBVEVfQVZBSUxBQkxFKSA/IDEgOiAwKTsKKyAgICAgICAgc2VuZF9pbmRpY2F0b3JfdXBkYXRlKEJUQV9BR19JTkRfUk9BTSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHN2Y190eXBlID09IEJUSEZfU0VSVklDRV9UWVBFX0hPTUUpID8gMCA6IDEpOworICAgICAgICBzZW5kX2luZGljYXRvcl91cGRhdGUoQlRBX0FHX0lORF9TSUdOQUwsIHNpZ25hbCk7CisgICAgICAgIHNlbmRfaW5kaWNhdG9yX3VwZGF0ZShCVEFfQUdfSU5EX0JBVFRDSEcsIGJhdHRfY2hnKTsKKyAgICAgICAgcmV0dXJuIEJUX1NUQVRVU19TVUNDRVNTOworICAgIH0KKworICAgIHJldHVybiBCVF9TVEFUVVNfU1VDQ0VTUzsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyoqCisqKiBGdW5jdGlvbiAgICAgICAgIGNvcHNfcmVzcG9uc2UKKyoqCisqKiBEZXNjcmlwdGlvbiAgICAgIFJlc3BvbnNlIGZvciBDT1BTIGNvbW1hbmQKKyoqCisqKiBSZXR1cm5zICAgICAgICAgIGJ0X3N0YXR1c190CisqKgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3N0YXRpYyBidF9zdGF0dXNfdCBjb3BzX3Jlc3BvbnNlKGNvbnN0IGNoYXIgKmNvcHMpCit7CisgICAgQ0hFQ0tfQlRIRl9JTklUKCk7CisKKyAgICBpZiAoaXNfY29ubmVjdGVkKE5VTEwpKQorICAgIHsKKyAgICAgICAgdEJUQV9BR19SRVNfREFUQSAgICBhZ19yZXM7CisKKyAgICAgICAgLyogRm9ybWF0IHRoZSByZXNwb25zZSAqLworICAgICAgICBzcHJpbnRmIChhZ19yZXMuc3RyLCAiMCwwLFwiJXNcIiIsIGNvcHMpOworICAgICAgICBhZ19yZXMub2tfZmxhZyA9IEJUQV9BR19PS19ET05FOworCisgICAgICAgIEJUQV9BZ1Jlc3VsdCAoYnRpZl9oZl9jYi5oYW5kbGUsIEJUQV9BR19DT1BTX1JFUywgJmFnX3Jlcyk7CisgICAgICAgIHJldHVybiBCVF9TVEFUVVNfU1VDQ0VTUzsKKyAgICB9CisgICAgcmV0dXJuIEJUX1NUQVRVU19GQUlMOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorKioKKyoqIEZ1bmN0aW9uICAgICAgICAgY2luZF9yZXNwb25zZQorKioKKyoqIERlc2NyaXB0aW9uICAgICAgUmVzcG9uc2UgZm9yIENJTkQgY29tbWFuZAorKioKKyoqIFJldHVybnMgICAgICAgICAgYnRfc3RhdHVzX3QKKyoqCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworc3RhdGljIGJ0X3N0YXR1c190IGNpbmRfcmVzcG9uc2UoaW50IHN2YywgaW50IG51bV9hY3RpdmUsIGludCBudW1faGVsZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBidGhmX2NhbGxfc3RhdGVfdCBjYWxsX3NldHVwX3N0YXRlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBzaWduYWwsIGludCByb2FtLCBpbnQgYmF0dF9jaGcpCit7CisgICAgQ0hFQ0tfQlRIRl9JTklUKCk7CisKKyAgICBpZiAoaXNfY29ubmVjdGVkKE5VTEwpKQorICAgIHsKKyAgICAgICAgdEJUQV9BR19SRVNfREFUQSAgICBhZ19yZXM7CisKKyAgICAgICAgbWVtc2V0ICgmYWdfcmVzLCAwLCBzaXplb2YgKGFnX3JlcykpOworICAgICAgICAvKiBwZXIgdGhlIGVycmF0YSAyMDQzLCBjYWxsPTEgaW1wbGllcyBhdGxlYXN0IG9uZSBjYWxsIGlzIGluIHByb2dyZXNzIChhY3RpdmUvaGVsZCkKKyAgICAgICAgKiogaHR0cHM6Ly93d3cuYmx1ZXRvb3RoLm9yZy9lcnJhdGEvZXJyYXRhX3ZpZXcuY2ZtP2VycmF0YV9pZD0yMDQzCisgICAgICAgICoqLworICAgICAgICBzcHJpbnRmIChhZ19yZXMuc3RyLCAiJWQsJWQsJWQsJWQsJWQsJWQsJWQiLAorICAgICAgICAgICAgICAgIChudW1fYWN0aXZlICsgbnVtX2hlbGQpID8gMSA6IDAsICAgICAgICAgICAgICAgICAgICAgICAvKiBDYWxsIHN0YXRlICovCisgICAgICAgICAgICAgICAgY2FsbHN0YXRlX3RvX2NhbGxzZXR1cChjYWxsX3NldHVwX3N0YXRlKSwgICAgICAgICAgICAgIC8qIENhbGxzZXR1cCBzdGF0ZSAqLworICAgICAgICAgICAgICAgIHN2YywgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBuZXR3b3JrIHNlcnZpY2UgKi8KKyAgICAgICAgICAgICAgICBzaWduYWwsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogU2lnbmFsIHN0cmVuZ3RoICovCisgICAgICAgICAgICAgICAgcm9hbSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIFJvYW1pbmcgaW5kaWNhdG9yICovCisgICAgICAgICAgICAgICAgYmF0dF9jaGcsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIEJhdHRlcnkgbGV2ZWwgKi8KKyAgICAgICAgICAgICAgICAoKG51bV9oZWxkID09IDApID8gMCA6ICgobnVtX2FjdGl2ZSA9PSAwKSA/IDIgOiAxKSkpOyAvKiBDYWxsIGhlbGQgKi8KKworICAgICAgICBCVEFfQWdSZXN1bHQgKGJ0aWZfaGZfY2IuaGFuZGxlLCBCVEFfQUdfQ0lORF9SRVMsICZhZ19yZXMpOworCisgICAgICAgIHJldHVybiBCVF9TVEFUVVNfU1VDQ0VTUzsKKyAgICB9CisKKyAgICByZXR1cm4gQlRfU1RBVFVTX0ZBSUw7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisqKgorKiogRnVuY3Rpb24gICAgICAgICBmb3JtYXR0ZWRfYXRfcmVzcG9uc2UKKyoqCisqKiBEZXNjcmlwdGlvbiAgICAgIFByZS1mb3JtYXR0ZWQgQVQgcmVzcG9uc2UsIHR5cGljYWxseSBpbiByZXNwb25zZSB0byB1bmtub3duIEFUIGNtZAorKioKKyoqIFJldHVybnMgICAgICAgICAgYnRfc3RhdHVzX3QKKyoqCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworc3RhdGljIGJ0X3N0YXR1c190IGZvcm1hdHRlZF9hdF9yZXNwb25zZShjb25zdCBjaGFyICpyc3ApCit7CisgICAgQ0hFQ0tfQlRIRl9JTklUKCk7CisgICAgdEJUQV9BR19SRVNfREFUQSAgICBhZ19yZXM7CisKKyAgICBpZiAoaXNfY29ubmVjdGVkKE5VTEwpKQorICAgIHsKKyAgICAgICAgLyogRm9ybWF0IHRoZSByZXNwb25zZSBhbmQgc2VuZCAqLworICAgICAgICBtZW1zZXQgKCZhZ19yZXMsIDAsIHNpemVvZiAoYWdfcmVzKSk7CisgICAgICAgIHN0cm5jcHkoYWdfcmVzLnN0ciwgcnNwLCBCVEFfQUdfQVRfTUFYX0xFTik7CisgICAgICAgIEJUQV9BZ1Jlc3VsdCAoYnRpZl9oZl9jYi5oYW5kbGUsIEJUQV9BR19VTkFUX1JFUywgJmFnX3Jlcyk7CisKKyAgICAgICAgcmV0dXJuIEJUX1NUQVRVU19TVUNDRVNTOworICAgIH0KKworICAgIHJldHVybiBCVF9TVEFUVVNfRkFJTDsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyoqCisqKiBGdW5jdGlvbiAgICAgICAgIGF0X3Jlc3BvbnNlCisqKgorKiogRGVzY3JpcHRpb24gICAgICBvay9lcnJvciByZXNwb25zZQorKioKKyoqIFJldHVybnMgICAgICAgICAgYnRfc3RhdHVzX3QKKyoqCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworc3RhdGljIGJ0X3N0YXR1c190IGF0X3Jlc3BvbnNlKGJ0aGZfYXRfcmVzcG9uc2VfdCByZXNwb25zZV9jb2RlLCBpbnQgZXJyb3JfY29kZSkKK3sKKyAgICBDSEVDS19CVEhGX0lOSVQoKTsKKworICAgIGlmIChpc19jb25uZWN0ZWQoTlVMTCkpCisgICAgeworICAgICAgICBzZW5kX2F0X3Jlc3VsdCgocmVzcG9uc2VfY29kZSA9PSBCVEhGX0FUX1JFU1BPTlNFX09LKSA/IEJUQV9BR19PS19ET05FCisgICAgICAgICAgICAgICAgICAgICAgICA6IEJUQV9BR19PS19FUlJPUiwgZXJyb3JfY29kZSk7CisgICAgICAgIHJldHVybiBCVF9TVEFUVVNfU1VDQ0VTUzsKKyAgICB9CisKKworICAgIHJldHVybiBCVF9TVEFUVVNfRkFJTDsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyoqCisqKiBGdW5jdGlvbiAgICAgICAgIGNsY2NfcmVzcG9uc2UKKyoqCisqKiBEZXNjcmlwdGlvbiAgICAgIHJlc3BvbnNlIGZvciBDTENDIGNvbW1hbmQKKyoqICAgICAgICAgICAgICAgICAgQ2FuIGJlIGl0ZXJhdGl2ZWx5IGNhbGxlZCBmb3IgZWFjaCBjYWxsIGluZGV4LiBDYWxsIGluZGV4CisqKiAgICAgICAgICAgICAgICAgIG9mIDAgd2lsbCBiZSB0cmVhdGVkIGFzIE5VTEwgdGVybWluYXRpb24gKENvbXBsZXRlcyByZXNwb25zZSkKKyoqCisqKiBSZXR1cm5zICAgICAgICAgIGJ0X3N0YXR1c190CisqKgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3N0YXRpYyBidF9zdGF0dXNfdCBjbGNjX3Jlc3BvbnNlKGludCBpbmRleCwgYnRoZl9jYWxsX2RpcmVjdGlvbl90IGRpciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnRoZl9jYWxsX3N0YXRlX3Qgc3RhdGUsIGJ0aGZfY2FsbF9tb2RlX3QgbW9kZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnRoZl9jYWxsX21wdHlfdHlwZV90IG1wdHksIGNvbnN0IGNoYXIgKm51bWJlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnRoZl9jYWxsX2FkZHJ0eXBlX3QgdHlwZSkKK3sKKyAgICBDSEVDS19CVEhGX0lOSVQoKTsKKworICAgIGlmIChpc19jb25uZWN0ZWQoTlVMTCkpCisgICAgeworICAgICAgICB0QlRBX0FHX1JFU19EQVRBICAgIGFnX3JlczsKKyAgICAgICAgaW50ICAgICAgICAgICAgICAgICB4eDsKKworICAgICAgICBtZW1zZXQgKCZhZ19yZXMsIDAsIHNpemVvZiAoYWdfcmVzKSk7CisKKyAgICAgICAgLyogRm9ybWF0IHRoZSByZXNwb25zZSAqLworICAgICAgICBpZiAoaW5kZXggPT0gMCkKKyAgICAgICAgeworICAgICAgICAgICAgYWdfcmVzLm9rX2ZsYWcgPSBCVEFfQUdfT0tfRE9ORTsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIEJUSUZfVFJBQ0VfRVZFTlQ2KCJjbGNjX3Jlc3BvbnNlOiBbJWRdIGRpciAlZCBzdGF0ZSAlZCBtb2RlICVkIG51bWJlciA9ICVzIHR5cGUgPSAlZCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIGluZGV4LCBkaXIsIHN0YXRlLCBtb2RlLCBudW1iZXIsIHR5cGUpOworICAgICAgICAgICAgeHggPSBzcHJpbnRmIChhZ19yZXMuc3RyLCAiJWQsJWQsJWQsJWQsJWQiLAorICAgICAgICAgICAgICAgICAgICAgICAgIGluZGV4LCBkaXIsIHN0YXRlLCBtb2RlLCBtcHR5KTsKKworICAgICAgICAgICAgaWYgKG51bWJlcikKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoKHR5cGUgPT0gQlRIRl9DQUxMX0FERFJUWVBFX0lOVEVSTkFUSU9OQUwpICYmICgqbnVtYmVyICE9ICcrJykpCisgICAgICAgICAgICAgICAgICAgIHNwcmludGYgKCZhZ19yZXMuc3RyW3h4XSwgIixcIislc1wiLCVkIiwgbnVtYmVyLCB0eXBlKTsKKyAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgIHNwcmludGYgKCZhZ19yZXMuc3RyW3h4XSwgIixcIiVzXCIsJWQiLCBudW1iZXIsIHR5cGUpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIEJUQV9BZ1Jlc3VsdCAoYnRpZl9oZl9jYi5oYW5kbGUsIEJUQV9BR19DTENDX1JFUywgJmFnX3Jlcyk7CisKKyAgICAgICAgcmV0dXJuIEJUX1NUQVRVU19TVUNDRVNTOworICAgIH0KKworICAgIHJldHVybiBCVF9TVEFUVVNfRkFJTDsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyoqCisqKiBGdW5jdGlvbiAgICAgICAgIHBob25lX3N0YXRlX2NoYW5nZQorKioKKyoqIERlc2NyaXB0aW9uICAgICAgbm90aWZ5IG9mIGEgY2FsbCBzdGF0ZSBjaGFuZ2UKKyoqICAgICAgICAgICAgICAgICAgbnVtYmVyICYgdHlwZTogdmFsaWQgb25seSBmb3IgaW5jb21pbmcgJiB3YWl0aW5nIGNhbGwKKyoqCisqKiBSZXR1cm5zICAgICAgICAgIGJ0X3N0YXR1c190CisqKgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworc3RhdGljIGJ0X3N0YXR1c190IHBob25lX3N0YXRlX2NoYW5nZShpbnQgbnVtX2FjdGl2ZSwgaW50IG51bV9oZWxkLCBidGhmX2NhbGxfc3RhdGVfdCBjYWxsX3NldHVwX3N0YXRlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICpudW1iZXIsIGJ0aGZfY2FsbF9hZGRydHlwZV90IHR5cGUpCit7CisgICAgdEJUQV9BR19SRVMgcmVzID0gMHhmZjsKKyAgICB0QlRBX0FHX1JFU19EQVRBIGFnX3JlczsKKyAgICBidF9zdGF0dXNfdCBzdGF0dXMgPSBCVF9TVEFUVVNfU1VDQ0VTUzsKKyAgICBCT09MRUFOIGFjdGl2ZUNhbGxVcGRhdGVkID0gRkFMU0U7CisKKyAgICBDSEVDS19CVEhGX1NMQ19DT05ORUNURUQoKTsKKworICAgIEJUSUZfVFJBQ0VfREVCVUc2KCJwaG9uZV9zdGF0ZV9jaGFuZ2U6IG51bV9hY3RpdmU9JWQgW3ByZXY6ICVkXSAgbnVtX2hlbGQ9JWRbcHJldjogJWRdIlwKKyAgICAgICAgICAgICAgICAgICAgICAiIGNhbGxfc2V0dXA9JXMgW3ByZXY6ICVzXSIsIG51bV9hY3RpdmUsIGJ0aWZfaGZfY2IubnVtX2FjdGl2ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgbnVtX2hlbGQsIGJ0aWZfaGZfY2IubnVtX2hlbGQsCisgICAgICAgICAgICAgICAgICAgICAgIGR1bXBfaGZfY2FsbF9zdGF0ZShjYWxsX3NldHVwX3N0YXRlKSwgZHVtcF9oZl9jYWxsX3N0YXRlKGJ0aWZfaGZfY2IuY2FsbF9zZXR1cF9zdGF0ZSkpOworCisgICAgLyogaWYgYWxsIGluZGljYXRvcnMgYXJlIDAsIHNlbmQgZW5kIGNhbGwgYW5kIHJldHVybiAqLworICAgIGlmIChudW1fYWN0aXZlID09IDAgJiYgbnVtX2hlbGQgPT0gMCAmJiBjYWxsX3NldHVwX3N0YXRlID09IEJUSEZfQ0FMTF9TVEFURV9JRExFKQorICAgIHsKKyAgICAgICAgQlRJRl9UUkFDRV9ERUJVRzEoIiVzOiBQaG9uZSBvbiBob29rIiwgX19GVU5DVElPTl9fKTsKKworICAgICAgICAvKiByZWNvcmQgY2FsbCB0ZXJtaW5hdGlvbiB0aW1lc3RhbXAgIGlmICB0aGVyZSB3YXMgYW4gYWN0aXZlL2hlbGQgY2FsbCAgb3IgY2FsbHNldHVwIHN0YXRlID4gQlRIRl9DQUxMX1NUQVRFX0lETEUgKi8KKyAgICAgICAgaWYgKChidGlmX2hmX2NiLmNhbGxfc2V0dXBfc3RhdGUgIT0gQlRIRl9DQUxMX1NUQVRFX0lETEUgKSB8fCAoYnRpZl9oZl9jYi5udW1fYWN0aXZlKSB8fChidGlmX2hmX2NiLm51bV9oZWxkKSkKKyAgICAgICAgeworICAgICAgICAgICAgQlRJRl9UUkFDRV9ERUJVRzEoIiVzOiBSZWNvcmQgY2FsbCB0ZXJtaW5hdGlvbiB0aW1lc3RhbXAiLCBfX0ZVTkNUSU9OX18pOworICAgICAgICAgICAgY2xvY2tfZ2V0dGltZShDTE9DS19NT05PVE9OSUMsICZidGlmX2hmX2NiLmNhbGxfZW5kX3RpbWVzdGFtcCk7CisgICAgICAgIH0KKyAgICAgICAgQlRBX0FnUmVzdWx0IChCVEFfQUdfSEFORExFX0FMTCwgQlRBX0FHX0VORF9DQUxMX1JFUywgTlVMTCk7CisKKyAgICAgICAgLyogaWYgaGVsZCBjYWxsIHdhcyBwcmVzZW50LCByZXNldCB0aGF0IGFzIHdlbGwgKi8KKyAgICAgICAgaWYgKGJ0aWZfaGZfY2IubnVtX2hlbGQpCisgICAgICAgICAgICBzZW5kX2luZGljYXRvcl91cGRhdGUoQlRBX0FHX0lORF9DQUxMSEVMRCwgMCk7CisKKyAgICAgICAgZ290byB1cGRhdGVfY2FsbF9zdGF0ZXM7CisgICAgfQorCisgICAgLyogYWN0aXZlIHN0YXRlIGNhbiBjaGFuZ2Ugd2hlbjoKKyAgICAqKiAxLiBhbiBvdXRnb2luZy9pbmNvbWluZyBjYWxsIHdhcyBhbnN3ZXJlZAorICAgICoqIDIuIGFuIGhlbGQgd2FzIHJlc3VtZWQKKyAgICAqKiAzLiB3aXRob3V0IGNhbGxzZXR1cCBub3RpZmljYXRpb25zLCBjYWxsIGJlY2FtZSBhY3RpdmUKKyAgICAqKiAoMykgY2FuIGhhcHBlbiBpZiBjYWxsIGlzIGFjdGl2ZSBhbmQgYSBoZWFkc2V0IGNvbm5lY3RzIHRvIHVzCisgICAgKioKKyAgICAqKiBJbiB0aGUgY2FzZSBvZiAoMyksIHdlIHdpbGwgaGF2ZSB0byBub3RpZnkgdGhlIHN0YWNrIG9mIGFuIGFjdGl2ZQorICAgICoqIGNhbGwsIGluc3RlYWQgb2Ygc2VuZGluZyBhbiBpbmRpY2F0b3IgdXBkYXRlLiBUaGlzIHdpbGwgYWxzbworICAgICoqIGZvcmNlIHRoZSBTQ08gdG8gYmUgc2V0dXAuIEhhbmRsZSB0aGlzIHNwZWNpYWwgY2FzZSBoZXJlIHByaW9yIHRvCisgICAgKiogY2FsbCBzZXR1cCBoYW5kbGluZworICAgICovCisgICAgaWYgKCAobnVtX2FjdGl2ZSA9PSAxKSAmJiAoYnRpZl9oZl9jYi5udW1fYWN0aXZlID09IDApICYmIChidGlmX2hmX2NiLm51bV9oZWxkID09IDApICYmCisgICAgICAgICAoYnRpZl9oZl9jYi5jYWxsX3NldHVwX3N0YXRlID09IEJUSEZfQ0FMTF9TVEFURV9JRExFKSApCisgICAgeworICAgICAgICBCVElGX1RSQUNFX0RFQlVHMSgiJXM6IEFjdGl2ZSBjYWxsIG5vdGlmaWNhdGlvbiByZWNlaXZlZCB3aXRob3V0IGNhbGwgc2V0dXAgdXBkYXRlIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgX19GVU5DVElPTl9fKTsKKworICAgICAgICBtZW1zZXQoJmFnX3JlcywgMCwgc2l6ZW9mKHRCVEFfQUdfUkVTX0RBVEEpKTsKKyAgICAgICAgYWdfcmVzLmF1ZGlvX2hhbmRsZSA9IGJ0aWZfaGZfY2IuaGFuZGxlOworICAgICAgICByZXMgPSBCVEFfQUdfT1VUX0NBTExfQ09OTl9SRVM7CisgICAgICAgIEJUQV9BZ1Jlc3VsdChCVEFfQUdfSEFORExFX0FMTCwgcmVzLCAmYWdfcmVzKTsKKyAgICAgICAgYWN0aXZlQ2FsbFVwZGF0ZWQgPSBUUlVFOworICAgIH0KKworICAgIC8qIFJpbmdpbmcgY2FsbCBjaGFuZ2VkPyAqLworICAgIGlmIChjYWxsX3NldHVwX3N0YXRlICE9IGJ0aWZfaGZfY2IuY2FsbF9zZXR1cF9zdGF0ZSkKKyAgICB7CisgICAgICAgIEJUSUZfVFJBQ0VfREVCVUczKCIlczogQ2FsbCBzZXR1cCBzdGF0ZXMgY2hhbmdlZC4gb2xkOiAlcyBuZXc6ICVzIiwKKyAgICAgICAgICAgIF9fRlVOQ1RJT05fXywgZHVtcF9oZl9jYWxsX3N0YXRlKGJ0aWZfaGZfY2IuY2FsbF9zZXR1cF9zdGF0ZSksCisgICAgICAgICAgICBkdW1wX2hmX2NhbGxfc3RhdGUoY2FsbF9zZXR1cF9zdGF0ZSkpOworICAgICAgICBtZW1zZXQoJmFnX3JlcywgMCwgc2l6ZW9mKHRCVEFfQUdfUkVTX0RBVEEpKTsKKworICAgICAgICBzd2l0Y2ggKGNhbGxfc2V0dXBfc3RhdGUpCisgICAgICAgIHsKKyAgICAgICAgICAgIGNhc2UgQlRIRl9DQUxMX1NUQVRFX0lETEU6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgc3dpdGNoIChidGlmX2hmX2NiLmNhbGxfc2V0dXBfc3RhdGUpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBjYXNlIEJUSEZfQ0FMTF9TVEFURV9JTkNPTUlORzoKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChudW1fYWN0aXZlID4gYnRpZl9oZl9jYi5udW1fYWN0aXZlKQorICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlcyA9IEJUQV9BR19JTl9DQUxMX0NPTk5fUkVTOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFnX3Jlcy5hdWRpb19oYW5kbGUgPSBidGlmX2hmX2NiLmhhbmRsZTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKG51bV9oZWxkID4gYnRpZl9oZl9jYi5udW1faGVsZCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXMgPSBCVEFfQUdfSU5fQ0FMTF9IRUxEX1JFUzsKKyAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXMgPSBCVEFfQUdfQ0FMTF9DQU5DRUxfUkVTOworICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIGNhc2UgQlRIRl9DQUxMX1NUQVRFX0RJQUxJTkc6CisgICAgICAgICAgICAgICAgICAgIGNhc2UgQlRIRl9DQUxMX1NUQVRFX0FMRVJUSU5HOgorICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG51bV9hY3RpdmUgPiBidGlmX2hmX2NiLm51bV9hY3RpdmUpCisgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWdfcmVzLmF1ZGlvX2hhbmRsZSA9IEJUQV9BR19IQU5ETEVfU0NPX05PX0NIQU5HRTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXMgPSBCVEFfQUdfT1VUX0NBTExfQ09OTl9SRVM7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzID0gQlRBX0FHX0NBTExfQ0FOQ0VMX1JFUzsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgICAgICAgICAgQlRJRl9UUkFDRV9FUlJPUjEoIiVzOiBJbmNvcnJlY3QgQ2FsbCBzZXR1cCBzdGF0ZSB0cmFuc2l0aW9uIiwgX19GVU5DVElPTl9fKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHN0YXR1cyA9IEJUX1NUQVRVU19QQVJNX0lOVkFMSUQ7CisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9IGJyZWFrOworCisgICAgICAgICAgICBjYXNlIEJUSEZfQ0FMTF9TVEFURV9JTkNPTUlORzoKKyAgICAgICAgICAgICAgICBpZiAobnVtX2FjdGl2ZSB8fCBudW1faGVsZCkKKyAgICAgICAgICAgICAgICAgICAgcmVzID0gQlRBX0FHX0NBTExfV0FJVF9SRVM7CisgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICByZXMgPSBCVEFfQUdfSU5fQ0FMTF9SRVM7CisgICAgICAgICAgICAgICAgaWYgKG51bWJlcikKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGludCB4eCA9IDA7CisgICAgICAgICAgICAgICAgICAgIGlmICgodHlwZSA9PSBCVEhGX0NBTExfQUREUlRZUEVfSU5URVJOQVRJT05BTCkgJiYgKCpudW1iZXIgIT0gJysnKSkKKyAgICAgICAgICAgICAgICAgICAgICAgIHh4ID0gc3ByaW50ZiAoYWdfcmVzLnN0ciwgIlwiKyVzXCIiLCBudW1iZXIpOworICAgICAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgICAgICB4eCA9IHNwcmludGYgKGFnX3Jlcy5zdHIsICJcIiVzXCIiLCBudW1iZXIpOworICAgICAgICAgICAgICAgICAgICBhZ19yZXMubnVtID0gdHlwZTsKKworICAgICAgICAgICAgICAgICAgICBpZiAocmVzID09IEJUQV9BR19DQUxMX1dBSVRfUkVTKQorICAgICAgICAgICAgICAgICAgICAgICAgc3ByaW50ZigmYWdfcmVzLnN0clt4eF0sICIsJWQiLCB0eXBlKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEJUSEZfQ0FMTF9TVEFURV9ESUFMSU5HOgorICAgICAgICAgICAgICAgIGFnX3Jlcy5hdWRpb19oYW5kbGUgPSBidGlmX2hmX2NiLmhhbmRsZTsKKyAgICAgICAgICAgICAgICByZXMgPSBCVEFfQUdfT1VUX0NBTExfT1JJR19SRVM7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEJUSEZfQ0FMTF9TVEFURV9BTEVSVElORzoKKyAgICAgICAgICAgICAgICAvKiBpZiB3ZSB3ZW50IGZyb20gaWRsZS0+YWxlcnQsIGZvcmNlIFNDTyBzZXR1cCBoZXJlLiBkaWFsaW5nIHVzdWFsbHkgdHJpZ2dlcnMgaXQgKi8KKyAgICAgICAgICAgICAgICBpZiAoYnRpZl9oZl9jYi5jYWxsX3NldHVwX3N0YXRlID09IEJUSEZfQ0FMTF9TVEFURV9JRExFKQorICAgICAgICAgICAgICAgIGFnX3Jlcy5hdWRpb19oYW5kbGUgPSBidGlmX2hmX2NiLmhhbmRsZTsKKyAgICAgICAgICAgICAgICByZXMgPSBCVEFfQUdfT1VUX0NBTExfQUxFUlRfUkVTOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICBCVElGX1RSQUNFX0VSUk9SMSgiJXM6IEluY29ycmVjdCBuZXcgcmluZ2luZyBjYWxsIHN0YXRlIiwgX19GVU5DVElPTl9fKTsKKyAgICAgICAgICAgICAgICBzdGF0dXMgPSBCVF9TVEFUVVNfUEFSTV9JTlZBTElEOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgICAgIEJUSUZfVFJBQ0VfREVCVUczKCIlczogQ2FsbCBzZXR1cCBzdGF0ZSBjaGFuZ2VkLiByZXM9JWQsIGF1ZGlvX2hhbmRsZT0lZCIsIF9fRlVOQ1RJT05fXywgcmVzLCBhZ19yZXMuYXVkaW9faGFuZGxlKTsKKworICAgICAgICBpZiAocmVzKQorICAgICAgICAgICAgQlRBX0FnUmVzdWx0KEJUQV9BR19IQU5ETEVfQUxMLCByZXMsICZhZ19yZXMpOworCisgICAgICAgIC8qIGlmIGNhbGwgc2V0dXAgaXMgaWRsZSwgd2UgaGF2ZSBhbHJlYWR5IHVwZGF0ZWQgY2FsbCBpbmRpY2F0b3IsIGp1bXAgb3V0ICovCisgICAgICAgIGlmIChjYWxsX3NldHVwX3N0YXRlID09IEJUSEZfQ0FMTF9TVEFURV9JRExFKQorICAgICAgICB7CisgICAgICAgICAgICAvKiBjaGVjayAmIHVwZGF0ZSBjYWxsaGVsZCAqLworICAgICAgICAgICAgaWYgKChudW1faGVsZCA+IDApICYmIChudW1fYWN0aXZlID4gMCkpCisgICAgICAgICAgICAgICAgc2VuZF9pbmRpY2F0b3JfdXBkYXRlKEJUQV9BR19JTkRfQ0FMTEhFTEQsIDEpOworICAgICAgICAgICAgZ290byB1cGRhdGVfY2FsbF9zdGF0ZXM7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBtZW1zZXQoJmFnX3JlcywgMCwgc2l6ZW9mKHRCVEFfQUdfUkVTX0RBVEEpKTsKKworICAgIC8qIHBlciB0aGUgZXJyYXRhIDIwNDMsIGNhbGw9MSBpbXBsaWVzIGF0bGVhc3Qgb25lIGNhbGwgaXMgaW4gcHJvZ3Jlc3MgKGFjdGl2ZS9oZWxkKQorICAgICoqIGh0dHBzOi8vd3d3LmJsdWV0b290aC5vcmcvZXJyYXRhL2VycmF0YV92aWV3LmNmbT9lcnJhdGFfaWQ9MjA0MworICAgICoqIEhhbmRsZSBjYWxsIGluZGljYXRvciBjaGFuZ2UKKyAgICAqKi8KKyAgICBpZiAoIWFjdGl2ZUNhbGxVcGRhdGVkICYmICgobnVtX2FjdGl2ZSArIG51bV9oZWxkKSAhPSAoYnRpZl9oZl9jYi5udW1fYWN0aXZlICsgYnRpZl9oZl9jYi5udW1faGVsZCkpICkKKyAgICB7CisgICAgICAgIEJUSUZfVFJBQ0VfREVCVUczKCIlczogQWN0aXZlIGNhbGwgc3RhdGVzIGNoYW5nZWQuIG9sZDogJWQgbmV3OiAlZCIsIF9fRlVOQ1RJT05fXywgYnRpZl9oZl9jYi5udW1fYWN0aXZlLCBudW1fYWN0aXZlKTsKKyAgICAgICAgc2VuZF9pbmRpY2F0b3JfdXBkYXRlKEJUQV9BR19JTkRfQ0FMTCwgKChudW1fYWN0aXZlICsgbnVtX2hlbGQpID4gMCkgPyAxIDogMCk7CisgICAgfQorCisgICAgLyogSGVsZCBDaGFuZ2VkPyAqLworICAgIGlmIChudW1faGVsZCAhPSBidGlmX2hmX2NiLm51bV9oZWxkKQorICAgIHsKKyAgICAgICAgQlRJRl9UUkFDRV9ERUJVRzMoIiVzOiBIZWxkIGNhbGwgc3RhdGVzIGNoYW5nZWQuIG9sZDogJWQgbmV3OiAlZCIsIF9fRlVOQ1RJT05fXywgYnRpZl9oZl9jYi5udW1faGVsZCwgbnVtX2hlbGQpOworICAgICAgICBzZW5kX2luZGljYXRvcl91cGRhdGUoQlRBX0FHX0lORF9DQUxMSEVMRCwgKChudW1faGVsZCA9PSAwKSA/IDAgOiAoKG51bV9hY3RpdmUgPT0gMCkgPyAyIDogMSkpKTsKKyAgICB9CisKKyAgICAvKiBDYWxscyBTd2FwcGVkPyAqLworICAgIGlmICggKGNhbGxfc2V0dXBfc3RhdGUgPT0gYnRpZl9oZl9jYi5jYWxsX3NldHVwX3N0YXRlKSAmJgorICAgICAgICAgKG51bV9hY3RpdmUgJiYgbnVtX2hlbGQpICYmCisgICAgICAgICAobnVtX2FjdGl2ZSA9PSBidGlmX2hmX2NiLm51bV9hY3RpdmUpICYmCisgICAgICAgICAobnVtX2hlbGQgPT0gYnRpZl9oZl9jYi5udW1faGVsZCkgKQorICAgIHsKKyAgICAgICAgQlRJRl9UUkFDRV9ERUJVRzEoIiVzOiBDYWxscyBzd2FwcGVkIiwgX19GVU5DVElPTl9fKTsKKyAgICAgICAgc2VuZF9pbmRpY2F0b3JfdXBkYXRlKEJUQV9BR19JTkRfQ0FMTEhFTEQsIDEpOworICAgIH0KKwordXBkYXRlX2NhbGxfc3RhdGVzOgorICAgIGJ0aWZfaGZfY2IubnVtX2FjdGl2ZSA9IG51bV9hY3RpdmU7CisgICAgYnRpZl9oZl9jYi5udW1faGVsZCA9IG51bV9oZWxkOworICAgIGJ0aWZfaGZfY2IuY2FsbF9zZXR1cF9zdGF0ZSA9IGNhbGxfc2V0dXBfc3RhdGU7CisKKyAgICByZXR1cm4gc3RhdHVzOworfQorCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisqKgorKiogRnVuY3Rpb24gICAgICAgICBidGlmX2hmX2NhbGxfdGVybWluYXRlZF9yZWNlbnRseQorKioKKyoqIERlc2NyaXB0aW9uICAgICAgQ2hlY2tzIGlmIGEgY2FsbCBoYXMgYmVlbiB0ZXJtaW5hdGVkCisqKgorKiogUmV0dXJucyAgICAgICAgICBidF9zdGF0dXNfdAorKioKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitCT09MRUFOIGJ0aWZfaGZfY2FsbF90ZXJtaW5hdGVkX3JlY2VudGx5KCkKK3sKKyAgICAgIHN0cnVjdCB0aW1lc3BlYyAgICAgICAgIG5vdzsKKworICAgICAgY2xvY2tfZ2V0dGltZShDTE9DS19NT05PVE9OSUMsICZub3cpOworICAgICAgaWYgKG5vdy50dl9zZWMgPCBidGlmX2hmX2NiLmNhbGxfZW5kX3RpbWVzdGFtcC50dl9zZWMgKyBCVElGX0hGX0NBTExfRU5EX1RJTUVPVVQpCisgICAgICB7CisgICAgICAgICAgcmV0dXJuIFRSVUU7CisgICAgICB9CisgICAgICBlbHNlCisgICAgICB7CisgICAgICAgICAgYnRpZl9oZl9jYi5jYWxsX2VuZF90aW1lc3RhbXAudHZfc2VjID0gMDsKKyAgICAgICAgICByZXR1cm4gRkFMU0U7CisgICAgICB9Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisqKgorKiogRnVuY3Rpb24gICAgICAgICBjbGVhbnVwCisqKgorKiogRGVzY3JpcHRpb24gICAgICBDbG9zZXMgdGhlIEhGIGludGVyZmFjZQorKioKKyoqIFJldHVybnMgICAgICAgICAgYnRfc3RhdHVzX3QKKyoqCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworc3RhdGljIHZvaWQgIGNsZWFudXAoIHZvaWQgKQoreworICAgIEJUSUZfVFJBQ0VfRVZFTlQxKCIlcyIsIF9fRlVOQ1RJT05fXyk7CisKKyAgICBpZiAoYnRfaGZfY2FsbGJhY2tzKQorICAgIHsKKyAgICAgICAgYnRpZl9kaXNhYmxlX3NlcnZpY2UoQlRBX0hGUF9TRVJWSUNFX0lEKTsKKyAgICAgICAgYnRfaGZfY2FsbGJhY2tzID0gTlVMTDsKKyAgICB9Cit9CisKK3N0YXRpYyBjb25zdCBidGhmX2ludGVyZmFjZV90IGJ0aGZJbnRlcmZhY2UgPSB7CisgICAgc2l6ZW9mKGJ0aGZJbnRlcmZhY2UpLAorICAgIGluaXQsCisgICAgY29ubmVjdCwKKyAgICBkaXNjb25uZWN0LAorICAgIGNvbm5lY3RfYXVkaW8sCisgICAgZGlzY29ubmVjdF9hdWRpbywKKyAgICBzdGFydF92b2ljZV9yZWNvZ25pdGlvbiwKKyAgICBzdG9wX3ZvaWNlX3JlY29nbml0aW9uLAorICAgIHZvbHVtZV9jb250cm9sLAorICAgIGRldmljZV9zdGF0dXNfbm90aWZpY2F0aW9uLAorICAgIGNvcHNfcmVzcG9uc2UsCisgICAgY2luZF9yZXNwb25zZSwKKyAgICBmb3JtYXR0ZWRfYXRfcmVzcG9uc2UsCisgICAgYXRfcmVzcG9uc2UsCisgICAgY2xjY19yZXNwb25zZSwKKyAgICBwaG9uZV9zdGF0ZV9jaGFuZ2UsCisgICAgY2xlYW51cCwKK307CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisqKgorKiogRnVuY3Rpb24gICAgICAgICBidGlmX2hmX2V4ZWN1dGVfc2VydmljZQorKioKKyoqIERlc2NyaXB0aW9uICAgICAgSW5pdGlhbGl6ZXMvU2h1dHMgZG93biB0aGUgc2VydmljZQorKioKKyoqIFJldHVybnMgICAgICAgICAgQlRfU1RBVFVTX1NVQ0NFU1Mgb24gc3VjY2VzcywgQlRfU1RBVFVTX0ZBSUwgb3RoZXJ3aXNlCisqKgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2J0X3N0YXR1c190IGJ0aWZfaGZfZXhlY3V0ZV9zZXJ2aWNlKEJPT0xFQU4gYl9lbmFibGUpCit7CisgICAgIGNoYXIgKiBwX3NlcnZpY2VfbmFtZXNbXSA9IEJUSUZfSEZfU0VSVklDRV9OQU1FUzsKKyAgICAgaWYgKGJfZW5hYmxlKQorICAgICB7CisgICAgICAgICAgLyogRW5hYmxlIGFuZCByZWdpc3RlciB3aXRoIEJUQS1BRyAqLworICAgICAgICAgIEJUQV9BZ0VuYWJsZSAoQlRBX0FHX1BBUlNFLCBidGVfaGZfZXZ0KTsKKyAgICAgICAgICBCVEFfQWdSZWdpc3RlcihCVElGX0hGX1NFUlZJQ0VTLCBCVElGX0hGX1NFQ1VSSVRZLCBCVElGX0hGX0ZFQVRVUkVTLAorICAgICAgICAgICAgICAgICAgICAgICAgIHBfc2VydmljZV9uYW1lcywgQlRJRl9IRl9JRF8xKTsKKyAgICAgfQorICAgICBlbHNlIHsKKyAgICAgICAgIC8qIERlLXJlZ2lzdGVyIEFHICovCisgICAgICAgICBCVEFfQWdEZXJlZ2lzdGVyKGJ0aWZfaGZfY2IuaGFuZGxlKTsKKyAgICAgICAgIC8qIERpc2FibGUgQUcgKi8KKyAgICAgICAgIEJUQV9BZ0Rpc2FibGUoKTsKKyAgICAgfQorICAgICByZXR1cm4gQlRfU1RBVFVTX1NVQ0NFU1M7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisqKgorKiogRnVuY3Rpb24gICAgICAgICBidGlmX2hmX2dldF9pbnRlcmZhY2UKKyoqCisqKiBEZXNjcmlwdGlvbiAgICAgIEdldCB0aGUgaGYgY2FsbGJhY2sgaW50ZXJmYWNlCisqKgorKiogUmV0dXJucyAgICAgICAgICBidGhmX2ludGVyZmFjZV90CisqKgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2NvbnN0IGJ0aGZfaW50ZXJmYWNlX3QgKmJ0aWZfaGZfZ2V0X2ludGVyZmFjZSgpCit7CisgICAgQlRJRl9UUkFDRV9FVkVOVDEoIiVzIiwgX19GVU5DVElPTl9fKTsKKyAgICByZXR1cm4gJmJ0aGZJbnRlcmZhY2U7Cit9Cg==