LyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8NCi8vDQovL7LOvPsgTFBBvdO/2s7EtbVWMC4xIFNHUC4yMiwgt7W72EpTT04NCi8vICAgDQovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLw0KDQojaW5jbHVkZSA8c3RkaW8uaD4NCiNpbmNsdWRlIDxzdGRsaWIuaD4NCiNpbmNsdWRlIDxzdHJpbmcuaD4NCiNpbmNsdWRlIDxjdHlwZS5oPg0KI2luY2x1ZGUgPHN5cy90aW1lLmg+DQojaW5jbHVkZSA8dGVybWlvcy5oPg0KDQojaW5jbHVkZSAibHBhX2lubmVyLmgiDQoNCg0KI2RlZmluZSBMUEFfQVVUSF9EQVRBX0xFTiA1MTINCg0KLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8NCi8vDQovL2V1aWNjQ2hhbGxlbmdlOr+ot7W72LXEQVBEVSyyu7qsOTAwMA0KLy9ldWljY0luZm8xOiC/qLe1u9i1xEFQRFUssru6rDkwMDANCi8vc21kcEFkZHJlc3M6vKS77sLr1tBzZG1wtdjWtw0KLy+3tbvYanNvbg0KLy8NCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovDQpjaGFyICpJbml0aWF0ZUF1dGhlbnRpY2F0aW9uKGNoYXIgKmV1aWNjQ2hhbGxlbmdlLCBjaGFyICpldWljY0luZm8xLCBjaGFyICpzbWRwQWRkcmVzcykNCnsNCgljaGFyICpqc19kYXRhID0gTlVMTDsNCgl1bnNpZ25lZCBjaGFyIGNsZ19ieXRlW0FQRFVfQllURV9MRU5dID0gezB9Ow0KCXVuc2lnbmVkIGNoYXIgaW5mbzFfYnl0ZVtBUERVX0JZVEVfTEVOXSA9IHswfTsNCglpbnQgY2xnX2xlbiA9IDA7DQoJaW50IGluZm8xX2xlbiA9IDA7DQoJY2hhciAqY2xnX2I2NCA9IE5VTEw7DQoJY2hhciAqaW5mbzFfYjY0ID0gTlVMTDsNCg0KCWNsZ19sZW4gPSBzdHJpbmcyYnl0ZXMoZXVpY2NDaGFsbGVuZ2UsIGNsZ19ieXRlLCBzdHJsZW4oZXVpY2NDaGFsbGVuZ2UpKTsNCgljbGdfYjY0ID0gbHBhX2Jhc2U2NF9lbmNvZGUoY2xnX2J5dGUsIGNsZ19sZW4pOw0KCWlmIChjbGdfYjY0ID09IE5VTEwpDQoJCXJldHVybiBOVUxMOw0KDQoJaW5mbzFfbGVuID0gc3RyaW5nMmJ5dGVzKGV1aWNjSW5mbzEsIGluZm8xX2J5dGUsIHN0cmxlbihldWljY0luZm8xKSk7DQoJaW5mbzFfYjY0ID0gbHBhX2Jhc2U2NF9lbmNvZGUoaW5mbzFfYnl0ZSwgaW5mbzFfbGVuKTsNCglpZiAoaW5mbzFfYjY0ID09IE5VTEwpIHsNCgkJZnJlZShjbGdfYjY0KTsNCgkJcmV0dXJuIE5VTEw7DQoJfQ0KCQ0KCWpzX2RhdGEgPSBtYWxsb2MoTFBBX0FVVEhfREFUQV9MRU4pOw0KCWlmIChqc19kYXRhICE9IE5VTEwpIHsNCgkJbWVtc2V0KGpzX2RhdGEsIDAsIExQQV9BVVRIX0RBVEFfTEVOKTsNCgkJc25wcmludGYoanNfZGF0YSwgTFBBX0FVVEhfREFUQV9MRU4sICJ7XCJldWljY0NoYWxsZW5nZVwiOlwiJXNcIixcImV1aWNjSW5mbzFcIjpcIiVzXCIsXCJzbWRwQWRkcmVzc1wiOlwiJXNcIn0iLCANCiAgICAJCWNsZ19iNjQsIGluZm8xX2I2NCwgc21kcEFkZHJlc3MpOw0KCQkvL3ByaW50ZigianNfZGF0YTotJXMtXG4iLCBqc19kYXRhKTsNCgl9DQoNCglmcmVlKGNsZ19iNjQpOw0KCWZyZWUoaW5mbzFfYjY0KTsNCglyZXR1cm4ganNfZGF0YTsNCn0NCg0KLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8NCi8vDQovL3RyYW5zYWN0aW9uSWQ6IHNtZHAgSW5pdGlhdGVBdXRoZW50aWNhdGlvbr3Tv9q3tbvYDQovL2F1dGhTZXJSZXNwSGV4Or+ot7W72LXEQVBEVSyyu7qsOTAwMA0KLy8NCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovDQpjaGFyICpBdXRoZW50aWNhdGVDbGllbnQoDQpjaGFyICp0cmFuc2FjdGlvbklkLA0KY2hhciAqYXV0aFNlclJlc3BIZXgpDQp7DQoJY2hhciAqYWNfanMgPSBOVUxMOw0KCXVuc2lnbmVkIGNoYXIgKmFzX2J5dGUgPSBOVUxMOw0KCWludCBhc19ieXRlX2xlbiA9IDA7DQoJaW50IGFzaGV4X2xlbiA9IHN0cmxlbihhdXRoU2VyUmVzcEhleCk7DQoJY2hhciAqYXNfYjY0ID0gTlVMTDsNCglpbnQgYXNfYjY0X2xlbiA9IDA7DQoNCglhc19ieXRlID0gbWFsbG9jKGFzaGV4X2xlbi8yICsgMSk7DQoJaWYgKGFzX2J5dGUgPT0gTlVMTCkgew0KCQlyZXR1cm4gTlVMTDsNCgl9DQoJbWVtc2V0KGFzX2J5dGUsIDAsIGFzaGV4X2xlbi8yICsgMSk7DQoNCglhc19ieXRlX2xlbiA9IHN0cmluZzJieXRlcyhhdXRoU2VyUmVzcEhleCwgYXNfYnl0ZSwgYXNoZXhfbGVuKTsNCglhc19iNjQgPSBscGFfYmFzZTY0X2VuY29kZShhc19ieXRlLCBhc19ieXRlX2xlbik7DQoJaWYgKGFzX2I2NCA9PSBOVUxMKSB7DQoJCWZyZWUoYXNfYnl0ZSk7DQoJCXJldHVybiBOVUxMOwkNCgl9DQoJYXNfYjY0X2xlbiA9IHN0cmxlbihhc19iNjQpOw0KCQ0KCWFjX2pzID0gbWFsbG9jKGFzX2I2NF9sZW4gKyAxMDApOw0KCWlmIChhY19qcyAhPSBOVUxMKSB7DQoJCW1lbXNldChhY19qcywgMCwgYXNfYjY0X2xlbiArIDEwMCk7DQoJCXNucHJpbnRmKGFjX2pzLCBhc19iNjRfbGVuICsgMTAwLCAie1widHJhbnNhY3Rpb25JZFwiOlwiJXNcIixcImF1dGhlbnRpY2F0ZVNlcnZlclJlc3BvbnNlXCI6XCIlc1wifSIsIA0KCQkJdHJhbnNhY3Rpb25JZCwgYXNfYjY0KTsNCgkJLy9wcmludGYoImpzX2RhdGE6LSVzLVxuIiwgYWNfanMpOw0KCX0NCg0KCWZyZWUoYXNfYnl0ZSk7DQoJZnJlZShhc19iNjQpOw0KCXJldHVybiBhY19qczsNCn0NCg0KDQovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLw0KLy8NCi8vdHJhbnNhY3Rpb25JZDogc21kcCBBdXRoZW50aWNhdGVDbGllbnS907/at7W72A0KLy9wcmVkbFJlc3BIZXg6IHByZXBhcmVEb3dubG9hZFJlc3BvbnNlSGV4IL+ot7W72LXEQVBEVSyyu7qsOTAwMA0KLy8NCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovDQpjaGFyICpHZXRCb3VuZFByb2ZpbGVQYWNrYWdlICgNCmNoYXIgKnRyYW5zYWN0aW9uSWQsDQpjaGFyICpwcmVkbFJlc3BIZXgpDQp7DQoJY2hhciAqYnBwX2pzID0gTlVMTDsNCgl1bnNpZ25lZCBjaGFyICpwZGxfYnl0ZSA9IE5VTEw7DQoJaW50IHBkbF9ieXRlX2xlbiA9IDA7DQoJaW50IHBkbGhleF9sZW4gPSBzdHJsZW4ocHJlZGxSZXNwSGV4KTsNCgljaGFyICpwZGxfYjY0ID0gTlVMTDsNCglpbnQgcGRsX2I2NF9sZW4gPSAwOw0KDQoJcGRsX2J5dGUgPSBtYWxsb2MocGRsaGV4X2xlbi8yICsgMSk7DQoJaWYgKHBkbF9ieXRlID09IE5VTEwpIHsNCgkJcmV0dXJuIE5VTEw7DQoJfQ0KCW1lbXNldChwZGxfYnl0ZSwgMCwgcGRsaGV4X2xlbi8yICsgMSk7DQoNCglwZGxfYnl0ZV9sZW4gPSBzdHJpbmcyYnl0ZXMocHJlZGxSZXNwSGV4LCBwZGxfYnl0ZSwgcGRsaGV4X2xlbik7DQoJcGRsX2I2NCA9IGxwYV9iYXNlNjRfZW5jb2RlKHBkbF9ieXRlLCBwZGxfYnl0ZV9sZW4pOw0KCWlmIChwZGxfYjY0ID09IE5VTEwpIHsNCgkJZnJlZShwZGxfYnl0ZSk7DQoJCXJldHVybiBOVUxMOwkNCgl9DQoJcGRsX2I2NF9sZW4gPSBzdHJsZW4ocGRsX2I2NCk7DQoJDQoJYnBwX2pzID0gbWFsbG9jKHBkbF9iNjRfbGVuICsgMTAwKTsNCglpZiAoYnBwX2pzICE9IE5VTEwpIHsNCgkJbWVtc2V0KGJwcF9qcywgMCwgcGRsX2I2NF9sZW4gKyAxMDApOw0KCQlzbnByaW50ZihicHBfanMsIHBkbF9iNjRfbGVuICsgMTAwLCAie1widHJhbnNhY3Rpb25JZFwiOlwiJXNcIixcInByZXBhcmVEb3dubG9hZFJlc3BvbnNlXCI6XCIlc1wifSIsIA0KCQkJdHJhbnNhY3Rpb25JZCwgcGRsX2I2NCk7DQoJCS8vcHJpbnRmKCJqc19kYXRhOi0lcy1cbiIsIGJwcF9qcyk7DQoJfQ0KDQoJZnJlZShwZGxfYnl0ZSk7DQoJZnJlZShwZGxfYjY0KTsNCglyZXR1cm4gYnBwX2pzOw0KfQ0KDQoNCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovDQovLw0KLy9wbmZIZXg6IHBlbmRpbmdOb3RpZmljYXRpb24gv6i3tbvYtcRBUERVLLK7uqw5MDAwDQovLw0KLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8NCmNoYXIgKkhhbmRsZU5vdGlmaWNhdGlvbihjaGFyICpwbmZIZXgpDQp7DQoJY2hhciAqYnBwX2pzID0gTlVMTDsNCgl1bnNpZ25lZCBjaGFyICpwZGxfYnl0ZSA9IE5VTEw7DQoJaW50IHBkbF9ieXRlX2xlbiA9IDA7DQoJaW50IHBkbGhleF9sZW4gPSBzdHJsZW4ocG5mSGV4KTsNCgljaGFyICpwZGxfYjY0ID0gTlVMTDsNCglpbnQgcGRsX2I2NF9sZW4gPSAwOw0KDQoJcGRsX2J5dGUgPSBtYWxsb2MocGRsaGV4X2xlbi8yICsgMSk7DQoJaWYgKHBkbF9ieXRlID09IE5VTEwpIHsNCgkJcmV0dXJuIE5VTEw7DQoJfQ0KCW1lbXNldChwZGxfYnl0ZSwgMCwgcGRsaGV4X2xlbi8yICsgMSk7DQoNCglwZGxfYnl0ZV9sZW4gPSBzdHJpbmcyYnl0ZXMocG5mSGV4LCBwZGxfYnl0ZSwgcGRsaGV4X2xlbik7DQoJcGRsX2I2NCA9IGxwYV9iYXNlNjRfZW5jb2RlKHBkbF9ieXRlLCBwZGxfYnl0ZV9sZW4pOw0KCWlmIChwZGxfYjY0ID09IE5VTEwpIHsNCgkJZnJlZShwZGxfYnl0ZSk7DQoJCXJldHVybiBOVUxMOwkNCgl9DQoJcGRsX2I2NF9sZW4gPSBzdHJsZW4ocGRsX2I2NCk7DQoJDQoJYnBwX2pzID0gbWFsbG9jKHBkbF9iNjRfbGVuICsgMTAwKTsNCglpZiAoYnBwX2pzICE9IE5VTEwpIHsNCgkJbWVtc2V0KGJwcF9qcywgMCwgcGRsX2I2NF9sZW4gKyAxMDApOw0KCQlzbnByaW50ZihicHBfanMsIHBkbF9iNjRfbGVuICsgMTAwLCANCgkJCSJ7XCJoZWFkZXJcIjp7XCJmdW5jdGlvbkV4ZWN1dGlvblN0YXR1c1wiOntcInN0YXR1c1wiOlwiRXhlY3V0ZWQtU3VjY2Vzc1wifX0sXCJwZW5kaW5nTm90aWZpY2F0aW9uXCI6XCIlc1wifSIsIHBkbF9iNjQpOw0KCQkvL3ByaW50ZigianNfZGF0YTotJXMtXG4iLCBicHBfanMpOw0KCX0NCg0KCWZyZWUocGRsX2J5dGUpOw0KCWZyZWUocGRsX2I2NCk7DQoJcmV0dXJuIGJwcF9qczsNCn0NCg0KDQo=