LyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioNCiAqIFRyYWNlYWx5emVyIHYyLjcuMCBSZWNvcmRlciBMaWJyYXJ5DQogKiBQZXJjZXBpbyBBQiwgd3d3LnBlcmNlcGlvLmNvbQ0KICoNCiAqIHRyY1VzZXIuYw0KICoNCiAqIFRoZSBwdWJsaWMgQVBJIG9mIHRoZSB0cmFjZSByZWNvcmRlciBsaWJyYXJ5Lg0KICoNCiAqIFRlcm1zIG9mIFVzZQ0KICogVGhpcyBzb2Z0d2FyZSBpcyBjb3B5cmlnaHQgUGVyY2VwaW8gQUIuIFRoZSByZWNvcmRlciBsaWJyYXJ5IGlzIGZyZWUgZm9yDQogKiB1c2UgdG9nZXRoZXIgd2l0aCBQZXJjZXBpbyBwcm9kdWN0cy4gWW91IG1heSBkaXN0cmlidXRlIHRoZSByZWNvcmRlciBsaWJyYXJ5DQogKiBpbiBpdHMgb3JpZ2luYWwgZm9ybSwgaW5jbHVkaW5nIG1vZGlmaWNhdGlvbnMgaW4gdHJjSGFyZHdhcmVQb3J0LmMvLmgNCiAqIGdpdmVuIHRoYXQgdGhlc2UgbW9kaWZpY2F0aW9uIGFyZSBjbGVhcmx5IG1hcmtlZCBhcyB5b3VyIG93biBtb2RpZmljYXRpb25zDQogKiBhbmQgZG9jdW1lbnRlZCBpbiB0aGUgaW5pdGlhbCBjb21tZW50IHNlY3Rpb24gb2YgdGhlc2Ugc291cmNlIGZpbGVzLg0KICogVGhpcyBzb2Z0d2FyZSBpcyB0aGUgaW50ZWxsZWN0dWFsIHByb3BlcnR5IG9mIFBlcmNlcGlvIEFCIGFuZCBtYXkgbm90IGJlDQogKiBzb2xkIG9yIGluIG90aGVyIHdheXMgY29tbWVyY2lhbGx5IHJlZGlzdHJpYnV0ZWQgd2l0aG91dCBleHBsaWNpdCB3cml0dGVuDQogKiBwZXJtaXNzaW9uIGJ5IFBlcmNlcGlvIEFCLg0KICoNCiAqIERpc2NsYWltZXINCiAqIFRoZSB0cmFjZSB0b29sIGFuZCByZWNvcmRlciBsaWJyYXJ5IGlzIGJlaW5nIGRlbGl2ZXJlZCB0byB5b3UgQVMgSVMgYW5kDQogKiBQZXJjZXBpbyBBQiBtYWtlcyBubyB3YXJyYW50eSBhcyB0byBpdHMgdXNlIG9yIHBlcmZvcm1hbmNlLiBQZXJjZXBpbyBBQiBkb2VzDQogKiBub3QgYW5kIGNhbm5vdCB3YXJyYW50IHRoZSBwZXJmb3JtYW5jZSBvciByZXN1bHRzIHlvdSBtYXkgb2J0YWluIGJ5IHVzaW5nIHRoZQ0KICogc29mdHdhcmUgb3IgZG9jdW1lbnRhdGlvbi4gUGVyY2VwaW8gQUIgbWFrZSBubyB3YXJyYW50aWVzLCBleHByZXNzIG9yDQogKiBpbXBsaWVkLCBhcyB0byBub25pbmZyaW5nZW1lbnQgb2YgdGhpcmQgcGFydHkgcmlnaHRzLCBtZXJjaGFudGFiaWxpdHksIG9yDQogKiBmaXRuZXNzIGZvciBhbnkgcGFydGljdWxhciBwdXJwb3NlLiBJbiBubyBldmVudCB3aWxsIFBlcmNlcGlvIEFCLCBpdHMNCiAqIHRlY2hub2xvZ3kgcGFydG5lcnMsIG9yIGRpc3RyaWJ1dG9ycyBiZSBsaWFibGUgdG8geW91IGZvciBhbnkgY29uc2VxdWVudGlhbCwNCiAqIGluY2lkZW50YWwgb3Igc3BlY2lhbCBkYW1hZ2VzLCBpbmNsdWRpbmcgYW55IGxvc3QgcHJvZml0cyBvciBsb3N0IHNhdmluZ3MsDQogKiBldmVuIGlmIGEgcmVwcmVzZW50YXRpdmUgb2YgUGVyY2VwaW8gQUIgaGFzIGJlZW4gYWR2aXNlZCBvZiB0aGUgcG9zc2liaWxpdHkNCiAqIG9mIHN1Y2ggZGFtYWdlcywgb3IgZm9yIGFueSBjbGFpbSBieSBhbnkgdGhpcmQgcGFydHkuIFNvbWUganVyaXNkaWN0aW9ucyBkbw0KICogbm90IGFsbG93IHRoZSBleGNsdXNpb24gb3IgbGltaXRhdGlvbiBvZiBpbmNpZGVudGFsLCBjb25zZXF1ZW50aWFsIG9yIHNwZWNpYWwNCiAqIGRhbWFnZXMsIG9yIHRoZSBleGNsdXNpb24gb2YgaW1wbGllZCB3YXJyYW50aWVzIG9yIGxpbWl0YXRpb25zIG9uIGhvdyBsb25nIGFuDQogKiBpbXBsaWVkIHdhcnJhbnR5IG1heSBsYXN0LCBzbyB0aGUgYWJvdmUgbGltaXRhdGlvbnMgbWF5IG5vdCBhcHBseSB0byB5b3UuDQogKg0KICogVGFicyBhcmUgdXNlZCBmb3IgaW5kZW50IGluIHRoaXMgZmlsZSAoMSB0YWIgPSA0IHNwYWNlcykNCiAqDQogKiBDb3B5cmlnaHQgUGVyY2VwaW8gQUIsIDIwMTQuDQogKiB3d3cucGVyY2VwaW8uY29tDQogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLw0KI2luY2x1ZGUgIkZyZWVSVE9TLmgiDQojaW5jbHVkZSAidGFzay5oIg0KDQojaW5jbHVkZSAidHJjVXNlci5oIg0KDQojaWYgKFVTRV9UUkFDRUFMWVpFUl9SRUNPUkRFUiA9PSAxKQ0KDQojaW5jbHVkZSA8c3RyaW5nLmg+DQojaW5jbHVkZSA8c3RkYXJnLmg+DQojaW5jbHVkZSA8c3RkaW50Lmg+DQoNClRSQUNFX1NUT1BfSE9PSyB2VHJhY2VTdG9wSG9va1B0ciA9IChUUkFDRV9TVE9QX0hPT0spMDsNCg0KZXh0ZXJuIHVpbnQ4X3QgaW5FeGNsdWRlZFRhc2s7DQpleHRlcm4gdWludDhfdCBuSVNSYWN0aXZlOw0KZXh0ZXJuIG9iamVjdEhhbmRsZVR5cGUgaGFuZGxlX29mX2xhc3RfbG9nZ2VkX3Rhc2s7DQpleHRlcm4gdWludDMyX3QgZHRzX21pbjsNCmV4dGVybiB1aW50MzJfdCBod3RjX2NvdW50X21heF9hZnRlcl90aWNrOw0KZXh0ZXJuIHVpbnQzMl90IGh3dGNfY291bnRfc3VtX2FmdGVyX3RpY2s7DQpleHRlcm4gdWludDMyX3QgaHd0Y19jb3VudF9zdW1fYWZ0ZXJfdGlja19jb3VudGVyOw0KZXh0ZXJuIGNoYXIqIHRyYWNlRXJyb3JNZXNzYWdlOw0KDQovKioqIFByaXZhdGUgZnVuY3Rpb25zICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovDQp2b2lkIHZUcmFjZVByaW50Rl9IZWxwZXIodHJhY2VMYWJlbCBldmVudExhYmVsLCBjb25zdCBjaGFyKiBmb3JtYXRTdHIsIHZhX2xpc3QgdmwpOw0KDQojaWYgKFVTRV9TRVBBUkFURV9VU0VSX0VWRU5UX0JVRkZFUiA9PSAxKQ0Kdm9pZCB2VHJhY2VDaGFubmVsUHJpbnRGX0hlbHBlcihVc2VyRXZlbnRDaGFubmVsIGNoYW5uZWxQYWlyLCB2YV9saXN0IHZsKTsNCnN0YXRpYyB2b2lkIHBydlRyYWNlVXNlckV2ZW50SGVscGVyMShVc2VyRXZlbnRDaGFubmVsIGNoYW5uZWwsIHRyYWNlTGFiZWwgZXZlbnRMYWJlbCwgdHJhY2VMYWJlbCBmb3JtYXRMYWJlbCwgdmFfbGlzdCB2bCk7DQpzdGF0aWMgdm9pZCBwcnZUcmFjZVVzZXJFdmVudEhlbHBlcjIoVXNlckV2ZW50Q2hhbm5lbCBjaGFubmVsLCB1aW50MzJfdCogZGF0YSwgdWludDMyX3Qgbm9PZlNsb3RzKTsNCiNlbmRpZg0KDQpzdGF0aWMgdm9pZCBwcnZUcmFjZVRhc2tJbnN0YW5jZUZpbmlzaChpbnQ4X3QgZGlyZWN0KTsNCg0KDQovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKg0KICogdlRyYWNlSW5pdFRyYWNlRGF0YQ0KICoNCiAqIEFsbG9jYXRlcywgaWYgbmVjZXNzYXJ5LCBhbmQgaW5pdGlhbGl6ZXMgdGhlIHJlY29yZGVyIGRhdGEgc3RydWN0dXJlLCBiYXNlZA0KICogb24gdGhlIGNvbnN0YW50cyBpbiB0cmNDb25maWcuaC4NCiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovDQp2b2lkIHZUcmFjZUluaXRUcmFjZURhdGEodm9pZCkNCnsNCglwcnZUcmFjZUluaXRUcmFjZURhdGEoKTsNCn0NCg0KLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioNCiAqIHZUcmFjZVNldFJlY29yZGVyRGF0YQ0KICoNCiAqIElmIGN1c3RvbSBhbGxvY2F0aW9uIGlzIHVzZWQsIHRoaXMgZnVuY3Rpb24gbXVzdCBiZSBjYWxsZWQgc28gdGhlIHJlY29yZGVyDQogKiBsaWJyYXJ5IGtub3dzIHdoZXJlIHRvIHNhdmUgdGhlIHRyYWNlIGRhdGEuDQogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLw0KI2lmIFRSQUNFX0RBVEFfQUxMT0NBVElPTiA9PSBUUkFDRV9EQVRBX0FMTE9DQVRJT05fQ1VTVE9NDQp2b2lkIHZUcmFjZVNldFJlY29yZGVyRGF0YSh2b2lkKiBwUmVjb3JkZXJEYXRhKQ0Kew0KCVRSQUNFX0FTU0VSVChwUmVjb3JkZXJEYXRhICE9IE5VTEwsICJ2VHJhY2VTZXRUcmFjZURhdGEsIHBSZWNvcmRlckRhdGEgPT0gTlVMTCIsICk7DQoJUmVjb3JkZXJEYXRhUHRyID0gcFJlY29yZGVyRGF0YTsNCn0NCiNlbmRpZg0KDQovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKg0KICogdlRyYWNlU2V0U3RvcEhvb2sNCiAqDQogKiBTZXRzIGEgZnVuY3Rpb24gdG8gYmUgY2FsbGVkIHdoZW4gdGhlIHJlY29yZGVyIGlzIHN0b3BwZWQuDQogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLw0Kdm9pZCB2VHJhY2VTZXRTdG9wSG9vayhUUkFDRV9TVE9QX0hPT0sgc3RvcEhvb2tGdW5jdGlvbikNCnsNCgl2VHJhY2VTdG9wSG9va1B0ciA9IHN0b3BIb29rRnVuY3Rpb247DQp9DQoNCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqDQogKiB2VHJhY2VDbGVhcg0KICoNCiAqIFJlc2V0cyB0aGUgcmVjb3JkZXIuIE9ubHkgbmVjZXNzYXJ5IGlmIGEgcmVzdGFydCBpcyBkZXNpcmVkIC0gdGhpcyBpcyBub3QNCiAqIG5lZWRlZCBpbiB0aGUgc3RhcnR1cCBpbml0aWFsaXphdGlvbi4NCiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovDQp2b2lkIHZUcmFjZUNsZWFyKHZvaWQpDQp7DQoJVFJBQ0VfU1JfQUxMT0NfQ1JJVElDQUxfU0VDVElPTigpOw0KCXRyY0NSSVRJQ0FMX1NFQ1RJT05fQkVHSU4oKTsNCg0KCVJlY29yZGVyRGF0YVB0ci0+YWJzVGltZUxhc3RFdmVudFNlY29uZCA9IDA7DQoNCglSZWNvcmRlckRhdGFQdHItPmFic1RpbWVMYXN0RXZlbnQgPSAwOw0KCVJlY29yZGVyRGF0YVB0ci0+bmV4dEZyZWVJbmRleCA9IDA7DQoJUmVjb3JkZXJEYXRhUHRyLT5udW1FdmVudHMgPSAwOw0KCVJlY29yZGVyRGF0YVB0ci0+YnVmZmVySXNGdWxsID0gMDsNCgl0cmFjZUVycm9yTWVzc2FnZSA9IE5VTEw7DQoJUmVjb3JkZXJEYXRhUHRyLT5pbnRlcm5hbEVycm9yT2NjdXJlZCA9IDA7DQoNCgltZW1zZXQoUmVjb3JkZXJEYXRhUHRyLT5ldmVudERhdGEsIDAsIFJlY29yZGVyRGF0YVB0ci0+bWF4RXZlbnRzICogNCk7DQoNCgl0cmNDUklUSUNBTF9TRUNUSU9OX0VORCgpOw0KDQp9DQoNCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqDQogKiB1aVRyYWNlU3RhcnQNCiAqDQogKiBTdGFydHMgdGhlIHJlY29yZGVyLiBUaGUgcmVjb3JkZXIgd2lsbCBub3QgYmUgc3RhcnRlZCBpZiBhbiBlcnJvciBoYXMgYmVlbg0KICogaW5kaWNhdGVkIHVzaW5nIHZUcmFjZUVycm9yLCBlLmcuIGlmIGFueSBvZiB0aGUgTnggY29uc3RhbnRzIGluIHRyY0NvbmZpZy5oDQogKiBoYXMgYSB0b28gc21hbGwgdmFsdWUgKE5UQVNLLCBOUVVFVUUsIGV0YykuDQogKg0KICogUmV0dXJucyAxIGlmIHRoZSByZWNvcmRlciB3YXMgc3RhcnRlZCBzdWNjZXNzZnVsbHkuDQogKiBSZXR1cm5zIDAgaWYgdGhlIHJlY29yZGVyIHN0YXJ0IHdhcyBwcmV2ZW50ZWQgZHVlIHRvIGEgcHJldmlvdXMgaW50ZXJuYWwNCiAqIGVycm9yLiBJbiB0aGF0IGNhc2UsIGNoZWNrIHZUcmFjZUdldExhc3RFcnJvciB0byBnZXQgdGhlIGVycm9yIG1lc3NhZ2UuDQogKiBBbnkgZXJyb3IgbWVzc2FnZSBpcyBhbHNvIHByZXNlbnRlZCB3aGVuIG9wZW5pbmcgYSB0cmFjZSBmaWxlLg0KICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8NCg0KdWludDMyX3QgdWlUcmFjZVN0YXJ0KHZvaWQpDQp7DQoJb2JqZWN0SGFuZGxlVHlwZSBoYW5kbGU7DQoJVFJBQ0VfU1JfQUxMT0NfQ1JJVElDQUxfU0VDVElPTigpOw0KDQoJaGFuZGxlID0gMDsNCg0KCWlmIChSZWNvcmRlckRhdGFQdHIgPT0gTlVMTCkNCgl7DQoJCXZUcmFjZUVycm9yKCJSZWNvcmRlckRhdGFQdHIgaXMgTlVMTC4gQ2FsbCB2VHJhY2VJbml0VHJhY2VEYXRhKCkgYmVmb3JlIHN0YXJ0aW5nIHRyYWNlLiIpOw0KCQlyZXR1cm4gMDsNCgl9DQoNCglpZiAodHJhY2VFcnJvck1lc3NhZ2UgPT0gTlVMTCkNCgl7DQoJCXRyY0NSSVRJQ0FMX1NFQ1RJT05fQkVHSU4oKTsNCgkJUmVjb3JkZXJEYXRhUHRyLT5yZWNvcmRlckFjdGl2ZSA9IDE7DQoNCgkJaGFuZGxlID0gVFJBQ0VfR0VUX1RBU0tfTlVNQkVSKFRSQUNFX0dFVF9DVVJSRU5UX1RBU0soKSk7DQoJCWlmIChoYW5kbGUgPT0gMCkNCgkJew0KCQkJLyogVGhpcyBvY2N1cnMgaWYgdGhlIHNjaGVkdWxlciBpcyBub3QgeWV0IHN0YXJ0ZWQuDQoJCQlUaGlzIGNyZWF0ZXMgYSBkdW1teSAiKHN0YXJ0dXApIiB0YXNrIGVudHJ5IGludGVybmFsbHkgaW4gdGhlDQoJCQlyZWNvcmRlciAqLw0KCQkJaGFuZGxlID0geFRyYWNlR2V0T2JqZWN0SGFuZGxlKFRSQUNFX0NMQVNTX1RBU0spOw0KCQkJdlRyYWNlU2V0T2JqZWN0TmFtZShUUkFDRV9DTEFTU19UQVNLLCBoYW5kbGUsICIoc3RhcnR1cCkiKTsNCg0KCQkJdlRyYWNlU2V0UHJpb3JpdHlQcm9wZXJ0eShUUkFDRV9DTEFTU19UQVNLLCBoYW5kbGUsIDApOw0KCQl9DQoNCgkJdlRyYWNlU3RvcmVUYXNrc3dpdGNoKGhhbmRsZSk7IC8qIFJlZ2lzdGVyIHRoZSBjdXJyZW50bHkgcnVubmluZyB0YXNrICovDQoJCXRyY0NSSVRJQ0FMX1NFQ1RJT05fRU5EKCk7DQoJfQ0KDQoJcmV0dXJuIFJlY29yZGVyRGF0YVB0ci0+cmVjb3JkZXJBY3RpdmU7DQp9DQoNCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqDQogKiB2VHJhY2VTdGFydA0KICoNCiAqIFN0YXJ0cyB0aGUgcmVjb3JkZXIuIFRoZSByZWNvcmRlciB3aWxsIG5vdCBiZSBzdGFydGVkIGlmIGFuIGVycm9yIGhhcyBiZWVuDQogKiBpbmRpY2F0ZWQgdXNpbmcgdlRyYWNlRXJyb3IsIGUuZy4gaWYgYW55IG9mIHRoZSBOeCBjb25zdGFudHMgaW4gdHJjQ29uZmlnLmgNCiAqIGhhcyBhIHRvbyBzbWFsbCB2YWx1ZSAoTlRBU0ssIE5RVUVVRSwgZXRjKS4NCiAqDQogKiBUaGlzIGZ1bmN0aW9uIGlzIG9ic29sZXRlLCBidXQgaGFzIGJlZW4gc2F2ZWQgZm9yIGJhY2t3YXJkcyBjb21wYXRpYmlsaXR5Lg0KICogV2UgcmVjb21tZW5kIHVzaW5nIHVpVHJhY2VTdGFydCBpbnN0ZWFkLg0KICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8NCnZvaWQgdlRyYWNlU3RhcnQodm9pZCkNCnsNCgkodm9pZCl1aVRyYWNlU3RhcnQoKTsNCn0NCg0KLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioNCiAqIHZUcmFjZVN0b3ANCiAqDQogKiBTdG9wcyB0aGUgcmVjb3JkZXIuIFRoZSByZWNvcmRpbmcgY2FuIGJlIHJlc3VtZWQgYnkgY2FsbGluZyB2VHJhY2VTdGFydC4NCiAqIFRoaXMgZG9lcyBub3QgcmVzZXQgdGhlIHJlY29yZGVyLiBVc2UgdlRyYWNlQ2xlYXIgaWYgdGhhdCBpcyBkZXNpcmVkLg0KICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8NCnZvaWQgdlRyYWNlU3RvcCh2b2lkKQ0Kew0KCVJlY29yZGVyRGF0YVB0ci0+cmVjb3JkZXJBY3RpdmUgPSAwOw0KDQoJaWYgKHZUcmFjZVN0b3BIb29rUHRyICE9IChUUkFDRV9TVE9QX0hPT0spMCkNCgl7DQoJCSgqdlRyYWNlU3RvcEhvb2tQdHIpKCk7CQkJLyogQW4gYXBwbGljYXRpb24gY2FsbC1iYWNrIGZ1bmN0aW9uLiAqLw0KCX0NCn0NCg0KLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioNCiAqIHhUcmFjZUdldExhc3RFcnJvcg0KICoNCiAqIEdpdmVzIHRoZSBsYXN0IGVycm9yIG1lc3NhZ2UsIGlmIGFueS4gTlVMTCBpZiBubyBlcnJvciBtZXNzYWdlIGlzIHN0b3JlZC4NCiAqIEFueSBlcnJvciBtZXNzYWdlIGlzIGFsc28gcHJlc2VudGVkIHdoZW4gb3BlbmluZyBhIHRyYWNlIGZpbGUuDQogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLw0KY2hhciogeFRyYWNlR2V0TGFzdEVycm9yKHZvaWQpDQp7DQoJcmV0dXJuIHRyYWNlRXJyb3JNZXNzYWdlOw0KfQ0KDQovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKg0KKiB2VHJhY2VDbGVhckVycm9yDQoqDQoqIFJlbW92ZXMgYW55IHByZXZpb3VzIGVycm9yIG1lc3NhZ2UgZ2VuZXJhdGVkIGJ5IHJlY29yZGVyIGNhbGxpbmcgdlRyYWNlRXJyb3IuDQoqIEJ5IGNhbGxpbmcgdGhpcyBmdW5jdGlvbiwgaXQgbWF5IGJlIHBvc3NpYmxlIHRvIHN0YXJ0L3Jlc3RhcnQgdGhlIHRyYWNlDQoqIGRlc3BpdGUgZXJyb3JzIGluIHRoZSByZWNvcmRlciwgYnV0IHRoZXJlIGlzIG5vIGd1YXJhbnRlZSB0aGF0IHRoZSB0cmFjZQ0KKiByZWNvcmRlciB3aWxsIHdvcmsgY29ycmVjdGx5IGluIHRoYXQgY2FzZSwgZGVwZW5kaW5nIG9uIHRoZSB0eXBlIG9mIGVycm9yLg0KKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLw0Kdm9pZCB2VHJhY2VDbGVhckVycm9yKGludCByZXNldEVycm9yTWVzc2FnZSkNCnsNCgkoIHZvaWQgKSByZXNldEVycm9yTWVzc2FnZTsNCgl0cmFjZUVycm9yTWVzc2FnZSA9IE5VTEw7DQoJUmVjb3JkZXJEYXRhUHRyLT5pbnRlcm5hbEVycm9yT2NjdXJlZCA9IDA7DQp9DQoNCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqDQogKiB2VHJhY2VHZXRUcmFjZUJ1ZmZlcg0KICoNCiAqIFJldHVybnMgYSBwb2ludGVyIHRvIHRoZSByZWNvcmRlciBkYXRhIHN0cnVjdHVyZS4gVXNlIHRoaXMgdG9nZXRoZXIgd2l0aA0KICogdWlUcmFjZUdldFRyYWNlQnVmZmVyU2l6ZSBpZiB5b3Ugd2lzaCB0byBpbXBsZW1lbnQgYW4gb3duIHN0b3JlL3VwbG9hZA0KICogc29sdXRpb24sIGUuZy4sIGluIGNhc2UgYSBkZWJ1Z2dlciBjb25uZWN0aW9uIGlzIG5vdCBhdmFpbGFibGUgZm9yIHVwbG9hZGluZw0KICogdGhlIGRhdGEuDQogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLw0Kdm9pZCogdlRyYWNlR2V0VHJhY2VCdWZmZXIodm9pZCkNCnsNCglyZXR1cm4gUmVjb3JkZXJEYXRhUHRyOw0KfQ0KDQovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKg0KICogdWlUcmFjZUdldFRyYWNlQnVmZmVyU2l6ZQ0KICoNCiAqIEdldHMgdGhlIHNpemUgb2YgdGhlIHJlY29yZGVyIGRhdGEgc3RydWN0dXJlLiBGb3IgdXNlIHRvZ2V0aGVyIHdpdGgNCiAqIHZUcmFjZUdldFRyYWNlQnVmZmVyIGlmIHlvdSB3aXNoIHRvIGltcGxlbWVudCBhbiBvd24gc3RvcmUvdXBsb2FkIHNvbHV0aW9uLA0KICogZS5nLiwgaW4gY2FzZSBhIGRlYnVnZ2VyIGNvbm5lY3Rpb24gaXMgbm90IGF2YWlsYWJsZSBmb3IgdXBsb2FkaW5nIHRoZSBkYXRhLg0KICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8NCnVpbnQzMl90IHVpVHJhY2VHZXRUcmFjZUJ1ZmZlclNpemUodm9pZCkNCnsNCglyZXR1cm4gc2l6ZW9mKFJlY29yZGVyRGF0YVR5cGUpOw0KfQ0KDQovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqDQogKiBwcnZUcmFjZVRhc2tJbnN0YW5jZUZpbmlzaC4NCiAqDQogKiBQcml2YXRlIGNvbW1vbiBmdW5jdGlvbiBmb3IgdGhlIHZUcmFjZVRhc2tJbnN0YW5jZUZpbmlzaFhYWCBmdW5jdGlvbnMuDQogKiANCiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8NCnZvaWQgcHJ2VHJhY2VUYXNrSW5zdGFuY2VGaW5pc2goaW50OF90IGRpcmVjdCkNCnsNCglUYXNrSW5zdGFuY2VTdGF0dXNFdmVudCogdGlzOw0KCXVpbnQ4X3QgZHRzNDU7DQoNCglUUkFDRV9TUl9BTExPQ19DUklUSUNBTF9TRUNUSU9OKCk7DQoNCgl0cmNDUklUSUNBTF9TRUNUSU9OX0JFR0lOKCk7DQoJaWYgKFJlY29yZGVyRGF0YVB0ci0+cmVjb3JkZXJBY3RpdmUgJiYgKCEgaW5FeGNsdWRlZFRhc2sgfHwgbklTUmFjdGl2ZSkgJiYgaGFuZGxlX29mX2xhc3RfbG9nZ2VkX3Rhc2spDQoJew0KCQlkdHM0NSA9ICh1aW50OF90KXBydlRyYWNlR2V0RFRTKDB4RkYpOw0KCQl0aXMgPSAoVGFza0luc3RhbmNlU3RhdHVzRXZlbnQqKSB4VHJhY2VOZXh0RnJlZUV2ZW50QnVmZmVyU2xvdCgpOw0KCQlpZiAodGlzICE9IE5VTEwpDQoJCXsNCgkJCWlmIChkaXJlY3QgPT0gMCkNCgkJCQl0aXMtPnR5cGUgPSBUQVNLX0lOU1RBTkNFX0ZJTklTSEVEX05FWFRfS1NFOw0KCQkJZWxzZQ0KCQkJCXRpcy0+dHlwZSA9IFRBU0tfSU5TVEFOQ0VfRklOSVNIRURfRElSRUNUOw0KDQoJCQl0aXMtPmR0cyA9IGR0czQ1Ow0KCQkJcHJ2VHJhY2VVcGRhdGVDb3VudGVycygpOw0KCQl9DQoJfQ0KCXRyY0NSSVRJQ0FMX1NFQ1RJT05fRU5EKCk7DQp9DQoNCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioNCiAqIHZUcmFjZVRhc2tJbnN0YW5jZUZpbmlzaCh2b2lkKQ0KICoNCiAqIE1hcmtzIHRoZSBjdXJyZW50IHRhc2sgaW5zdGFuY2UgYXMgZmluaXNoZWQgb24gdGhlIG5leHQga2VybmVsIGNhbGwuDQogKg0KICogSWYgdGhhdCBrZXJuZWwgY2FsbCBpcyBibG9ja2luZywgdGhlIGluc3RhbmNlIGVuZHMgYWZ0ZXIgdGhlIGJsb2NraW5nIGV2ZW50DQogKiBhbmQgdGhlIGNvcnJlc3BvbmRpbmcgcmV0dXJuIGV2ZW50IGlzIHRoZW4gdGhlIHN0YXJ0IG9mIHRoZSBuZXh0IGluc3RhbmNlLg0KICogSWYgdGhlIGtlcm5lbCBjYWxsIGlzIG5vdCBibG9ja2luZywgdGhlIHZpZXdlciBpbnN0ZWFkIHNwbGl0cyB0aGUgY3VycmVudA0KICogZnJhZ21lbnQgcmlnaHQgYmVmb3JlIHRoZSBrZXJuZWwgY2FsbCwgd2hpY2ggbWFrZXMgdGhpcyBjYWxsIHRoZSBmaXJzdCBldmVudA0KICogb2YgdGhlIG5leHQgaW5zdGFuY2UuDQogKg0KICogU2VlIGFsc28gVVNFX0lNUExJQ0lUX0lGRV9SVUxFUyBpbiB0cmNDb25maWcuaA0KICoNCiAqIEV4YW1wbGU6DQogKg0KICoJCXdoaWxlKDEpDQogKgkJew0KICoJCQl4UXVldWVSZWNlaXZlKENvbW1hbmRRdWV1ZSwgJmNvbW1hbmQsIHRpbWVvdXREdXJhdGlvbik7DQogKgkJCXByb2Nlc3NDb21tYW5kKGNvbW1hbmQpOw0KICogICAgICAgICAgdlRyYWNlSW5zdGFuY2VGaW5pc2goKTsNCiAqCQl9DQogKg0KICogTm90ZTogVGhpcyBpcyBvbmx5IHN1cHBvcnRlZCBpbiBUcmFjZWFseXplciB0b29scyB2Mi43IG9yIGxhdGVyDQogKg0KICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLw0Kdm9pZCB2VHJhY2VUYXNrSW5zdGFuY2VGaW5pc2godm9pZCkNCnsNCiAgICBwcnZUcmFjZVRhc2tJbnN0YW5jZUZpbmlzaCgwKTsNCn0NCg0KLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKg0KICogdlRyYWNlVGFza0luc3RhbmNlRmluaXNoRGlyZWN0KHZvaWQpDQogKg0KICogTWFya3MgdGhlIGN1cnJlbnQgdGFzayBpbnN0YW5jZSBhcyBmaW5pc2hlZCBhdCB0aGlzIHZlcnkgaW5zdGFudC4NCiAqIFRoaXMgbWFrZXMgdGhlIHZpZXdlciB0byBzcGxpdHMgdGhlIGN1cnJlbnQgZnJhZ21lbnQgYXQgdGhpcyBwb2ludCBhbmQgYmVnaW4NCiAqIGEgbmV3IGFjdG9yIGluc3RhbmNlLg0KICoNCiAqIFNlZSBhbHNvIFVTRV9JTVBMSUNJVF9JRkVfUlVMRVMgaW4gdHJjQ29uZmlnLmgNCiAqDQogKiBFeGFtcGxlOg0KICoNCiAqCQlUaGlzIGV4YW1wbGUgd2lsbCBnZW5lcmF0ZSB0d28gaW5zdGFuY2VzIGZvciBlYWNoIGxvb3AgaXRlcmF0aW9uLg0KICoJCVRoZSBmaXJzdCBpbnN0YW5jZSBlbmRzIGF0IHZUcmFjZUluc3RhbmNlRmluaXNoRGlyZWN0KCksIHdoaWxlIHRoZSBzZWNvbmQNCiAqICAgICAgaW5zdGFuY2UgZW5kcyBhdCB0aGUgbmV4dCB4UXVldWVSZWNlaXZlIGNhbGwuDQogKg0KICoJCXdoaWxlICgxKQ0KICoJCXsNCiAqICAgICAgICAgIHhRdWV1ZVJlY2VpdmUoQ29tbWFuZFF1ZXVlLCAmY29tbWFuZCwgdGltZW91dER1cmF0aW9uKTsNCiAqCQkJUHJvY2Vzc0NvbW1hbmQoY29tbWFuZCk7DQogKgkJCXZUcmFjZUluc3RhbmNlRmluaXNoRGlyZWN0KCk7DQogKgkJCURvU29tZXRpbmdFbHNlKCk7DQogKiAgICAgICAgICB2VHJhY2VJbnN0YW5jZUZpbmlzaCgpOw0KICogICAgICB9DQogKg0KICogTm90ZTogVGhpcyBpcyBvbmx5IHN1cHBvcnRlZCBpbiBUcmFjZWFseXplciB0b29scyB2Mi43IG9yIGxhdGVyDQogKg0KICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLw0Kdm9pZCB2VHJhY2VUYXNrSW5zdGFuY2VGaW5pc2hEaXJlY3Qodm9pZCkNCnsNCglwcnZUcmFjZVRhc2tJbnN0YW5jZUZpbmlzaCgxKTsNCn0NCg0KLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioNCiAqIEludGVycnVwdCByZWNvcmRpbmcgZnVuY3Rpb25zDQogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLw0KDQojaWYgKElOQ0xVREVfSVNSX1RSQUNJTkcgPT0gMSkNCg0KI2RlZmluZSBNQVhfSVNSX05FU1RJTkcgMTYNCnN0YXRpYyB1aW50OF90IGlzcnN0YWNrW01BWF9JU1JfTkVTVElOR107DQoNCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqDQogKiB2VHJhY2VTZXRJU1JQcm9wZXJ0aWVzDQogKg0KICogUmVnaXN0ZXJzIGFuIEludGVycnVwdCBTZXJ2aWNlIFJvdXRpbmUgaW4gdGhlIHJlY29yZGVyIGxpYnJhcnksIFRoaXMgbXVzdCBiZQ0KICogY2FsbGVkIGJlZm9yZSB1c2luZyB2VHJhY2VTdG9yZUlTUkJlZ2luIHRvIHN0b3JlIElTUiBldmVudHMuIFRoaXMgaXMNCiAqIHR5cGljYWxseSBjYWxsZWQgaW4gdGhlIHN0YXJ0dXAgb2YgdGhlIHN5c3RlbSwgYmVmb3JlIHRoZSBzY2hlZHVsZXIgaXMNCiAqIHN0YXJ0ZWQuDQogKg0KICogRXhhbXBsZToNCiAqCSAjZGVmaW5lIElEX0lTUl9USU1FUjEgMQkJLy8gbG93ZXN0IHZhbGlkIElEIGlzIDENCiAqCSAjZGVmaW5lIFBSSU9fT0ZfSVNSX1RJTUVSMSAzIC8vIHRoZSBoYXJkd2FyZSBwcmlvcml0eSBvZiB0aGUgaW50ZXJydXB0DQogKgkgLi4uDQogKgkgdlRyYWNlU2V0SVNSUHJvcGVydGllcyhJRF9JU1JfVElNRVIxLCAiSVNSVGltZXIxIiwgUFJJT19PRl9JU1JfVElNRVIxKTsNCiAqCSAuLi4NCiAqCSB2b2lkIElTUl9oYW5kbGVyKCkNCiAqCSB7DQogKgkJIHZUcmFjZVN0b3JlSVNSQmVnaW4oSURfT0ZfSVNSX1RJTUVSMSk7DQogKgkJIC4uLg0KICoJCSB2VHJhY2VTdG9yZUlTUkVuZCgwKTsNCiAqCSB9DQogKg0KICogTk9URTogVG8gc2FmZWx5IHJlY29yZCBJU1JzLCB5b3UgbmVlZCB0byBtYWtlIHN1cmUgdGhhdCBhbGwgdHJhY2VkDQogKiBpbnRlcnJ1cHRzIGFjdHVhbGx5IGFyZSBkaXNhYmxlZCBieSB0cmNDUklUSUNBTF9TRUNUSU9OX0JFR0lOKCkuIEhvd2V2ZXIsDQogKiBpbiBzb21lIHBvcnRzIHRoaXMgZG9lcyBub3QgZGlzYWJsZSBoaWdoIHByaW9yaXR5IGludGVycnVwdHMhDQogKiBJZiBhbiBJU1IgY2FsbHMgdlRyYWNlU3RvcmVJU1JCZWdpbiB3aGlsZSB0aGUgcmVjb3JkZXIgaXMgYnVzeSwgaXQgd2lsbA0KICogc3RvcCB0aGUgcmVjb3JkaW5nIGFuZCBnaXZlIGFuIGVycm9yIG1lc3NhZ2UuDQogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLw0Kdm9pZCB2VHJhY2VTZXRJU1JQcm9wZXJ0aWVzKG9iamVjdEhhbmRsZVR5cGUgaGFuZGxlLCBjb25zdCBjaGFyKiBuYW1lLCBjaGFyIHByaW9yaXR5KQ0Kew0KCVRSQUNFX0FTU0VSVChoYW5kbGUgPD0gUmVjb3JkZXJEYXRhUHRyLT5PYmplY3RQcm9wZXJ0eVRhYmxlLk51bWJlck9mT2JqZWN0c1BlckNsYXNzW1RSQUNFX0NMQVNTX0lTUl0sICJ2VHJhY2VTZXRJU1JQcm9wZXJ0aWVzOiBJbnZhbGlkIHZhbHVlIGZvciBoYW5kbGUiLCApOw0KCVRSQUNFX0FTU0VSVChuYW1lICE9IE5VTEwsICJ2VHJhY2VTZXRJU1JQcm9wZXJ0aWVzOiBuYW1lID09IE5VTEwiLCApOw0KDQoJdlRyYWNlU2V0T2JqZWN0TmFtZShUUkFDRV9DTEFTU19JU1IsIGhhbmRsZSwgbmFtZSk7DQoJdlRyYWNlU2V0UHJpb3JpdHlQcm9wZXJ0eShUUkFDRV9DTEFTU19JU1IsIGhhbmRsZSwgcHJpb3JpdHkpOw0KfQ0KDQojaWYgKFNFTEVDVEVEX1BPUlQgPT0gUE9SVF9BUk1fQ29ydGV4TSkNCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioNCiAqIChBZHZhbmNlZC4uLikNCiAqDQogKiBJU1JfVEFJTENIQUlOSU5HX1RIUkVTSE9MRCAoRm9yIENvcnRleC1NIGRldmljZXMgb25seSkNCiAqDQogKiBBUk0gQ29ydGV4LU0gZGV2aWNlcyBtYXkgZXhlY3V0ZSBJU1JzIGJhY2stdG8tYmFjayAodGFpbC1jaGFpbmVkKSB3aXRob3V0DQogKiByZXN1bWluZyB0aGUgcHJldmlvdXMgY29udGV4dCBpbiBiZXR3ZWVuLiBTaW5jZSB0aGlzIGlzIGRlY2lkZWQgaW4NCiAqIGhhcmR3YXJlLCB3ZSBjYW4gb25seSBkZXRlY3QgdGhpcyBpbmRpcmVjdGx5LCBpbiB0aGUgZm9sbG93aW5nIG1hbm5lcjoNCiAqDQogKiBXaGVuIGVudGVyaW5nIHZUcmFjZVN0b3JlSVNSQmVnaW4sIHdlIGNoZWNrIHRoZSBudW1iZXIgb2YgQ1BVIGN5Y2xlcyBzaW5jZQ0KICogdGhlIGxhc3QgcmV0dXJuIG9mIHZUcmFjZVN0b3JlSVNSRW5kLiBJZiBsZXNzIG9yIGVxdWFsIHRvIHRoZSBjb25zdGFudA0KICogSVNSX1RBSUxDSEFJTklOR19USFJFU0hPTEQgaXQgaXMgYXNzdW1lZCB0aGF0IHRoZSBJU1JzIGV4ZWN1dGVkIGJhY2stdG8tYmFjaw0KICogKHRhaWwtY2hhaW5lZCkuIEluIHRoYXQgY2FzZSwgdGhlIHByZXZpb3VzbHkgc3RvcmVkIFJFU1VNRSBldmVudA0KICogKHBvaW50ZWQgdG8gYnkgcHRyTGFzdElTUkV4aXRFdmVudCkgaXMgdGhlbiBkZWxldGVkIHRvIGF2b2lkIHNob3dpbmcgYQ0KICogZnJhZ21lbnQgb2YgdGhlIHByZXZpb3VzIGNvbnRleHQgaW4gYmV0d2VlbiB0aGUgSVNSIGV2ZW50cy4gVGhlIGRlbGV0ZSBpcw0KICogbWFkZSBieSByZXBsYWNpbmcgdGhlIGV2ZW50IGNvZGUgd2l0aCBhIFhUUzE2TCBldmVudCwgdGhhdCBzZXJ2ZXMgdG8ga2VlcA0KICogdGhlIGRpZmZlcmVudGlhbCB0aW1lc3RhbXAgZnJvbSB0aGUgZWFybGllciBldmVudC4NCiAqDQogKiBUaGUgdmFsdWUgb2YgSVNSX1RBSUxDSEFJTklOR19USFJFU0hPTEQgZGVwZW5kcyBvbiB0aGUgaW50ZXJydXB0IGxhdGVuY3kgb2YNCiAqIHRoZSBwcm9jZXNzb3IsIG9uIHRoZSBjb21waWxlciBhbmQgb24gdGhlIGNvbXBpbGVyIHNldHRpbmdzLCBidXQgc2hvdWxkIGJlDQogKiBhcm91bmQgNzAgY3ljbGVzLiBUaGUgZGVmYXVsdCB2YWx1ZSBpcyA2NiBjeWNsZXMsIHdoaWNoIHNob3VsZCBiZSBjb3JyZWN0IHdoZW4NCiAqIHVzaW5nIEdDQyB3aXRoIG9wdGltaXphdGlvbnMgZGlzYWJsZWQgKC1PMCkgYW5kIENvcnRleC1NMy9NNC4NCiAqDQogKiBUbyBtZWFzdXJlIHRoaXMgdmFsdWUsIHNlZSBNRUFTVVJFX0lTUl9UQUlMQ0hBSU5JTkdfVEhSRVNIT0xEIGJlbG93Lg0KICoNCiAqIElmIHRoaXMgdmFsdWUgc2V0IHRvbyBsb3csIHRhaWwtY2hhaW5lZCBJU1JzIHdpbGwgaW5jb3JyZWN0bHkgYmUgc2hvd24NCiAqIHNlcGFyYXRlZCwgd2l0aCBhIHNob3J0IGZyYWdtZW50IG9mIHRoZSBwcmV2aW91cyB0YXNrIG9yIElTUiBpbiBiZXR3ZWVuLg0KICogSWYgdGhpcyB2YWx1ZSBpcyBzZXQgdG9vIGhpZ2gsIHlvdSBnZXQgdGhlIG9wcG9zaXRlIGVmZmVjdCAtIHNlcGFyYXRlIElTUnMNCiAqIHdpbGwgYXBwZWFyIHRvIGV4ZWN1dGUgdGFpbC1jaGFpbmVkIGFuZCB3aWxsIGFwcGVhciB0byBoYXZlIGhpZ2hlciBleGVjdXRpb24NCiAqIHRpbWUgYW5kIHJlc3BvbnNlIHRpbWUgKG1heGltdW0gSVNSX1RBSUxDSEFJTklOR19USFJFU0hPTEQgY3ljbGVzIG1vcmUpLg0KICoNCiAqIFJlYWQgdGhlIGJsb2cgcG9zdCBleHBsYWluaW5nIHRoaXMgb24gb3VyIHdlYnNpdGU6DQogKiBodHRwOi8vcGVyY2VwaW8uY29tLzIwMTQvMDUvMDYvc3ctYmFzZWQtZXhjLXRyYWNpbmctYXJtLWNvcnRleC1tLw0KICoNCiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8NCiNkZWZpbmUgSVNSX1RBSUxDSEFJTklOR19USFJFU0hPTEQgNjYNCg0KdWludDhfdCogcHRyTGFzdElTUkV4aXRFdmVudCA9IE5VTEw7DQp1aW50MzJfdCBEV1RDeWNsZUNvdW50QXRMYXN0SVNSRXhpdCA9IDA7DQoNCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioNCiAqIChBZHZhbmNlZC4uLikNCiAqDQogKiBNRUFTVVJFX0lTUl9UQUlMQ0hBSU5JTkdfVEhSRVNIT0xEIChGb3IgQ29ydGV4LU0gZGV2aWNlcyBvbmx5KQ0KICoNCiAqIEFsbG93cyBmb3IgY2FsaWJyYXRpbmcgdGhlIHZhbHVlIG9mIElTUl9UQUlMQ0hBSU5JTkdfVEhSRVNIT0xEIChzZWUgYWJvdmUpLg0KICoNCiAqIFRoaXMgaXMgaW50ZW5kZWQgdG8gbWVhc3VyZSB0aGUgbWluaW11bSBudW1iZXIgb2YgY2xvY2sgY3ljbGVzIGZyb20gdGhlIGVuZA0KICogb2YgdlRyYWNlU3RvcmVJU1JFbmQgdG8gdGhlIGJlZ2lubmluZyBvZiB0aGUgZm9sbG93aW5nIHZUcmFjZVN0b3JlSVNSQmVnaW4uDQogKiBGb3IgdGhpcyBwdXJwb3NlLCB3ZSBhc3N1bWUgYSB0ZXN0IHNldHVwIHVzaW5nIHRoZSBTeXNUaWNrIGludGVycnVwdCwgd2hpY2gNCiAqIGlzIGF2YWlsYWJsZSBvbiBtb3N0IENvcnRleC1NIGRldmljZXMgYW5kIHR5cGljYWxseSB1c2VkIGJ5IHRoZSBSVE9TIGtlcm5lbC4NCiAqIFRvIGRvIHRoZSBtZWFzdXJlbWVudCwgZm9sbG93IHRoZXNlIHN0ZXBzOg0KICoNCiAqIDEuIE1ha2Ugc3VyZSBNRUFTVVJFX0lTUl9UQUlMQ0hBSU5JTkdfVEhSRVNIT0xEIGlzIGVuYWJsZWQgKGRlZmluZWQgYXMgMSkNCiAqDQogKiAyLiBUZW1wb3JhcmlseSByZXBsYWNlIHlvdXIgU3lzVGljayBoYW5kbGVyIHdpdGggdGhlIGZvbGxvd2luZzoNCiAqDQogKgl2b2lkIHhQb3J0U3lzVGlja0hhbmRsZXIoIHZvaWQgKQ0KICoJew0KICoJCXZUcmFjZVN0b3JlSVNSQmVnaW4oMSk7DQogKgkJdlRyYWNlU3RvcmVJU1JFbmQoMCk7DQogKgl9DQogKg0KICogMy4gVG8gbWFrZSBzdXJlIHRoYXQgdGhlIElTUnMgZXhlY3V0ZSBiYWNrLXRvLWJhY2ssIGluY3JlYXNlIHRoZSBPUyB0aWNrDQogKglmcmVxdWVuY3kgdG8gYSB2ZXJ5IGhpZ2ggbGV2ZWwgc28gdGhhdCB0aGUgT1MgdGljayBpbnRlcnJ1cHQgZXhlY3V0ZQ0KICoJY29udGludW91c2x5IHdpdGggbm8gYXBwbGljYXRpb24gdGFza3MgaW4gYmV0d2VlbiwgZS5nLiAxMCBNSHouDQogKg0KICogNC4gUHV0IGEgYnJlYWtwb2ludCBpbiB0aGUgaGlnaGVzdCBwcmlvcml0eSB0YXNrIGFuZCBtYWtlIHN1cmUgaXQgaXMgbm90DQogKglyZWFjaGVkLiBUaGlzIG1lYW5zIHRoYXQgdGhlIFN5c1RpY2sgaGFuZGxlciBpcyBleGVjdXRpbmcgYXQgbWF4aW11bSByYXRlDQogKglhbmQgdGhlcmVieSB0YWlsLWNoYWluZWQsIHdoZXJlIHRoZSBpbnRlcnJ1cHQgbGF0ZW5jeSBpcyA2IGN5Y2xlcy4NCiAqDQogKiA1LiBMZXQgdGhlIHN5c3RlbSBydW4gd2l0aG91dCBicmVha3BvaW50cyBhbmQgaW5zcGVjdCB0aGUgdmFsdWUgb2YNCiAqCXRocmVzaG9sZF9sb3dfd2F0ZXJtYXJrLiBUaGlzIGlzIHRoZSBtaW5pbXVtIHRvdGFsIGxhdGVuY3kgb2JzZXJ2ZWQuDQogKglUaGUgaGFyZHdhcmUgbGF0ZW5jeSBpcyA2IGNsb2NrIGN5Y2xlcyBkdWUgdG8gdGhlIHRhaWwtY2hhaW5pbmcsIHNvIHRoZQ0KICoJc29mdHdhcmUgbGF0ZW5jeSAoU0wpIGlzIHRoZW4gU0wgPSB0aHJlc2hvbGRfbG93X3dhdGVybWFyayAtIDYuDQogKg0KICogVGhlIHRocmVzaG9sZCB2YWx1ZSBJU1JfVEFJTENIQUlOSU5HX1RIUkVTSE9MRCBzaG91bGQgYmUgU0wgKyAyICogSEwsIHdoZXJlDQogKiBITCBpcyB0aGUgbm9ybWFsIGhhcmR3YXJlIGludGVycnVwdCBsYXRlbmN5LCBpLmUuLCB0aGUgbnVtYmVyIG9mIENQVQ0KICogY3ljbGVzIHRvIGVudGVyIG9yIGV4aXQgdGhlIGV4Y2VwdGlvbiBoYW5kbGVyIGZvciBhbiBleGNlcHRpb24gaW4gdGFzaw0KICogY29udGV4dC4gVGhlIEhMIHZhbHVlIGlzIDEyLTE2IGRlcGVuZGluZyBvbiBjb3JlLCBhcyBzaG93biBiZWxvdy4NCiAqDQogKiBWYWx1ZXMgZm9yIElTUl9UQUlMQ0hBSU5JTkdfVEhSRVNIT0xELCBhc3N1bWluZyBTTCA9IDQyDQogKglDb3J0ZXgtTTMgYW5kIE00IChITCA9IDEyKToJNjYgY3ljbGVzDQogKglDb3J0ZXgtTTAgKEhMID0gMTYpOgkJNzQgY3ljbGVzDQogKglDb3J0ZXgtTTArIChITCA9IDE1KToJCTcyIGN5Y2xlcw0KICoNCiAqIElmIHRoZSBJU1JfVEFJTENIQUlOSU5HX1RIUkVTSE9MRCB2YWx1ZSBpcyBzZXQgdG9vIGxvdywgc29tZSB0YWlsLWNoYWluZWQNCiAqIElTUnMgYmUgc2hvd24gc2VwYXJhdGVkLCB3aXRoIGEgc2hvcnQgZnJhZ21lbnQgb2YgdGhlIHByZXZpb3VzIGNvbnRleHQNCiAqIGluIGJldHdlZW4uIE9uIHRoZSBvdGhlciBoYW5kLCBpZiB0aGUgdmFsdWUgaXMgc2V0IHRvbyBoaWdoLCBJU1JzIHRoYXQgDQogKiBhY3R1YWxseSBhcmUgc2VwYXJhdGVkIG1heSBhcHBlYXIgdG8gZXhlY3V0ZSBiYWNrLXRvLWJhY2sgKHRhaWwtY2hhaW5lZCkuDQogKg0KICogUmVhZCB0aGUgYmxvZyBwb3N0IGV4cGxhaW5pbmcgdGhpcyBvbiBvdXIgd2Vic2l0ZToNCiAqIGh0dHA6Ly9wZXJjZXBpby5jb20vMjAxNC8wNS8wNi9zdy1iYXNlZC1leGMtdHJhY2luZy1hcm0tY29ydGV4LW0vDQogKg0KICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLw0KI2RlZmluZSBNRUFTVVJFX0lTUl9UQUlMQ0hBSU5JTkdfVEhSRVNIT0xEIDENCg0KI2lmIChNRUFTVVJFX0lTUl9UQUlMQ0hBSU5JTkdfVEhSRVNIT0xEID09IDEpDQp2b2xhdGlsZSB1aW50MzJfdCB0aHJlc2hvbGRfbG93X3dhdGVybWFyayA9IDIwMDAwMDAwMDA7DQojZW5kaWYNCg0KI2VuZGlmDQoNCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqDQogKiB2VHJhY2VTdG9yZUlTUkJlZ2luDQogKg0KICogUmVnaXN0ZXJzIHRoZSBiZWdpbm5pbmcgb2YgYW4gSW50ZXJydXB0IFNlcnZpY2UgUm91dGluZS4NCiAqDQogKiBFeGFtcGxlOg0KICoJICNkZWZpbmUgSURfSVNSX1RJTUVSMSAxCQkvLyBsb3dlc3QgdmFsaWQgSUQgaXMgMQ0KICoJICNkZWZpbmUgUFJJT19PRl9JU1JfVElNRVIxIDMgLy8gdGhlIGhhcmR3YXJlIHByaW9yaXR5IG9mIHRoZSBpbnRlcnJ1cHQNCiAqCSAuLi4NCiAqCSB2VHJhY2VTZXRJU1JQcm9wZXJ0aWVzKElEX0lTUl9USU1FUjEsICJJU1JUaW1lcjEiLCBQUklPX09GX0lTUl9USU1FUjEpOw0KICoJIC4uLg0KICoJIHZvaWQgSVNSX2hhbmRsZXIoKQ0KICoJIHsNCiAqCQkgdlRyYWNlU3RvcmVJU1JCZWdpbihJRF9PRl9JU1JfVElNRVIxKTsNCiAqCQkgLi4uDQogKgkJIHZUcmFjZVN0b3JlSVNSRW5kKDApOw0KICoJIH0NCiAqDQogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLw0Kdm9pZCB2VHJhY2VTdG9yZUlTUkJlZ2luKG9iamVjdEhhbmRsZVR5cGUgaGFuZGxlKQ0Kew0KCXVpbnQxNl90IGR0czQ7DQoJI2lmIChTRUxFQ1RFRF9QT1JUID09IFBPUlRfQVJNX0NvcnRleE0pDQoJdWludDMyX3QgQ1BVQ3ljbGVzU2luY2VMYXN0SVNSRXhpdCA9IFJFR19EV1RfQ1lDQ05UIC0gRFdUQ3ljbGVDb3VudEF0TGFzdElTUkV4aXQ7DQoJI2VuZGlmDQoJVFNFdmVudCogdHM7DQoJVFJBQ0VfU1JfQUxMT0NfQ1JJVElDQUxfU0VDVElPTigpOw0KDQoJdHMgPSBOVUxMOw0KDQojaWYgKFNFTEVDVEVEX1BPUlQgPT0gUE9SVF9BUk1fQ29ydGV4TSkNCglpZiAoRFdUQ3ljbGVDb3VudEF0TGFzdElTUkV4aXQgPiAwKQ0KCXsNCgkJI2lmIChNRUFTVVJFX0lTUl9UQUlMQ0hBSU5JTkdfVEhSRVNIT0xEID09IDEpDQoJCS8qIEFsbG93cyBmb3IgdmVyaWZ5aW5nIHRoZSB2YWx1ZSBvZiBJU1JfVEFJTENIQUlOSU5HX1RIUkVTSE9MRCAqLw0KCQlpZiAoQ1BVQ3ljbGVzU2luY2VMYXN0SVNSRXhpdCA8IHRocmVzaG9sZF9sb3dfd2F0ZXJtYXJrKQ0KCQl7DQoJCQl0aHJlc2hvbGRfbG93X3dhdGVybWFyayA9IENQVUN5Y2xlc1NpbmNlTGFzdElTUkV4aXQ7DQoJCX0NCgkJI2VuZGlmDQoNCgkJaWYgKENQVUN5Y2xlc1NpbmNlTGFzdElTUkV4aXQgPD0gSVNSX1RBSUxDSEFJTklOR19USFJFU0hPTEQpDQoJCXsNCgkJCS8qIFRoaXMgaXMganVkZ2VkIHRvIGJlIGEgY2FzZSBvZiBJU1IgdGFpbC1jaGFpbmluZyBzaW5jZSB0aGUNCgkJCW51bWJlciBvZiBjeWNsZXMgc2luY2UgdGhlIGxhc3QgdlRyYWNlU3RvcmVJU1JFbmQgaXMgc2hvcnRlciBvciBlcXVhbCB0bw0KCQkJdGhlIHRocmVzaG9sZCAoSVNSX1RBSUxDSEFJTklOR19USFJFU0hPTEQpICovDQoNCgkJCWlmIChwdHJMYXN0SVNSRXhpdEV2ZW50ICE9IE5VTEwpDQoJCQl7DQoJCQkJLyogT3ZlcndyaXRlIHRoZSBsYXN0IElTUiBleGl0IGV2ZW50IHdpdGggYSAibmV1dHJhbCIgZXZlbnQgdGhhdCBvbmx5DQoJCQkJCWFjY291bnRzIGZvciB0aGUgdGltZSBwYXNzZWQgKi8NCgkJCQkqcHRyTGFzdElTUkV4aXRFdmVudCA9IFhUUzE2TDsNCgkJCX0NCgkJfQ0KDQoJfQ0KI2VuZGlmDQoNCglpZiAocmVjb3JkZXJfYnVzeSkNCgl7DQoJIHZUcmFjZUVycm9yKCJJbGxlZ2FsIGNhbGwgdG8gdlRyYWNlU3RvcmVJU1JCZWdpbiwgcmVjb3JkZXIgYnVzeSEiKTsNCgkgcmV0dXJuOw0KCX0NCgl0cmNDUklUSUNBTF9TRUNUSU9OX0JFR0lOKCk7DQoJaWYgKFJlY29yZGVyRGF0YVB0ci0+cmVjb3JkZXJBY3RpdmUgJiYgaGFuZGxlX29mX2xhc3RfbG9nZ2VkX3Rhc2spDQoJew0KDQoJCVRSQUNFX0FTU0VSVChoYW5kbGUgPD0gUmVjb3JkZXJEYXRhUHRyLT5PYmplY3RQcm9wZXJ0eVRhYmxlLk51bWJlck9mT2JqZWN0c1BlckNsYXNzW1RSQUNFX0NMQVNTX0lTUl0sICJ2VHJhY2VTdG9yZUlTUkJlZ2luOiBJbnZhbGlkIHZhbHVlIGZvciBoYW5kbGUiLCApOw0KDQoJCWR0czQgPSAodWludDE2X3QpcHJ2VHJhY2VHZXREVFMoMHhGRkZGKTsNCg0KCQlpZiAoUmVjb3JkZXJEYXRhUHRyLT5yZWNvcmRlckFjdGl2ZSkgLyogTmVlZCB0byByZXBlYXQgdGhpcyBjaGVjayEgKi8NCgkJew0KCQkJaWYgKG5JU1JhY3RpdmUgPCBNQVhfSVNSX05FU1RJTkcpDQoJCQl7DQoJCQkJdWludDhfdCBobmQ4ID0gcHJ2VHJhY2VHZXQ4Qml0SGFuZGxlKGhhbmRsZSk7DQoJCQkJaXNyc3RhY2tbbklTUmFjdGl2ZV0gPSBoYW5kbGU7DQoJCQkJbklTUmFjdGl2ZSsrOw0KCQkJCXRzID0gKFRTRXZlbnQqKXhUcmFjZU5leHRGcmVlRXZlbnRCdWZmZXJTbG90KCk7DQoJCQkJaWYgKHRzICE9IE5VTEwpDQoJCQkJew0KCQkJCQl0cy0+dHlwZSA9IFRTX0lTUl9CRUdJTjsNCgkJCQkJdHMtPmR0cyA9IGR0czQ7DQoJCQkJCXRzLT5vYmpIYW5kbGUgPSBobmQ4Ow0KCQkJCQlwcnZUcmFjZVVwZGF0ZUNvdW50ZXJzKCk7DQoJCQkJfQ0KCQkJfQ0KCQkJZWxzZQ0KCQkJew0KCQkJCS8qIFRoaXMgc2hvdWxkIG5vdCBvY2N1ciB1bmxlc3Mgc29tZXRoaW5nIGlzIHZlcnkgd3JvbmcgKi8NCgkJCQl2VHJhY2VFcnJvcigiVG9vIG1hbnkgbmVzdGVkIGludGVycnVwdHMhIik7DQoJCQl9DQoJCX0NCgl9DQoJdHJjQ1JJVElDQUxfU0VDVElPTl9FTkQoKTsNCn0NCg0KLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioNCiAqIHZUcmFjZVN0b3JlSVNSRW5kDQogKg0KICogUmVnaXN0ZXJzIHRoZSBlbmQgb2YgYW4gSW50ZXJydXB0IFNlcnZpY2UgUm91dGluZS4NCiAqDQogKiBUaGUgcGFyYW1ldGVyIHBlbmRpbmdJU1IgaW5kaWNhdGVzIGlmIHRoZSBpbnRlcnJ1cHQgaGFzIHJlcXVlc3RlZCBhDQogKiB0YXNrLXN3aXRjaCAoPSAxKSBvciBpZiB0aGUgaW50ZXJydXB0IHJldHVybnMgdG8gdGhlIGVhcmxpZXIgY29udGV4dCAoPSAwKQ0KICoNCiAqIEV4YW1wbGU6DQogKg0KICoJICNkZWZpbmUgSURfSVNSX1RJTUVSMSAxCQkvLyBsb3dlc3QgdmFsaWQgSUQgaXMgMQ0KICoJICNkZWZpbmUgUFJJT19PRl9JU1JfVElNRVIxIDMgLy8gdGhlIGhhcmR3YXJlIHByaW9yaXR5IG9mIHRoZSBpbnRlcnJ1cHQNCiAqCSAuLi4NCiAqCSB2VHJhY2VTZXRJU1JQcm9wZXJ0aWVzKElEX0lTUl9USU1FUjEsICJJU1JUaW1lcjEiLCBQUklPX09GX0lTUl9USU1FUjEpOw0KICoJIC4uLg0KICoJIHZvaWQgSVNSX2hhbmRsZXIoKQ0KICoJIHsNCiAqCQkgdlRyYWNlU3RvcmVJU1JCZWdpbihJRF9PRl9JU1JfVElNRVIxKTsNCiAqCQkgLi4uDQogKgkJIHZUcmFjZVN0b3JlSVNSRW5kKDApOw0KICoJIH0NCiAqDQogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLw0Kdm9pZCB2VHJhY2VTdG9yZUlTUkVuZChpbnQgcGVuZGluZ0lTUikNCnsNCglUU0V2ZW50KiB0czsNCgl1aW50MTZfdCBkdHM1Ow0KCVRSQUNFX1NSX0FMTE9DX0NSSVRJQ0FMX1NFQ1RJT04oKTsNCg0KCWlmIChyZWNvcmRlcl9idXN5KQ0KCXsNCgkJdlRyYWNlRXJyb3IoIklsbGVnYWwgY2FsbCB0byB2VHJhY2VTdG9yZUlTUkVuZCwgcmVjb3JkZXIgYnVzeSEiKTsNCgkJcmV0dXJuOw0KCX0NCg0KCXRyY0NSSVRJQ0FMX1NFQ1RJT05fQkVHSU4oKTsNCglpZiAocGVuZGluZ0lTUiA9PSAwKQ0KCXsNCgkJaWYgKFJlY29yZGVyRGF0YVB0ci0+cmVjb3JkZXJBY3RpdmUgJiYgaGFuZGxlX29mX2xhc3RfbG9nZ2VkX3Rhc2spDQoJCXsNCgkJCXVpbnQ4X3QgaG5kOCwgdHlwZTsNCgkJCWR0czUgPSAodWludDE2X3QpcHJ2VHJhY2VHZXREVFMoMHhGRkZGKTsNCg0KCQkJaWYgKG5JU1JhY3RpdmUgPiAxKQ0KCQkJew0KCQkJCS8qIHJldHVybiB0byBhbm90aGVyIGlzciAqLw0KCQkJCXR5cGUgPSBUU19JU1JfUkVTVU1FOw0KCQkJCWhuZDggPSBwcnZUcmFjZUdldDhCaXRIYW5kbGUoaXNyc3RhY2tbbklTUmFjdGl2ZV0pOw0KCQkJfQ0KCQkJZWxzZQ0KCQkJew0KCQkJCS8qIHJldHVybiB0byB0YXNrICovDQoJCQkJdHlwZSA9IFRTX1RBU0tfUkVTVU1FOw0KCQkJCWhuZDggPSBwcnZUcmFjZUdldDhCaXRIYW5kbGUoaGFuZGxlX29mX2xhc3RfbG9nZ2VkX3Rhc2spOw0KCQkJfQ0KDQoJCQl0cyA9IChUU0V2ZW50Kil4VHJhY2VOZXh0RnJlZUV2ZW50QnVmZmVyU2xvdCgpOw0KCQkJaWYgKHRzICE9IE5VTEwpDQoJCQl7DQoJCQkJdHMtPnR5cGUgPSB0eXBlOw0KCQkJCXRzLT5vYmpIYW5kbGUgPSBobmQ4Ow0KCQkJCXRzLT5kdHMgPSBkdHM1Ow0KCQkJCXBydlRyYWNlVXBkYXRlQ291bnRlcnMoKTsNCgkJCX0NCg0KCQkJI2lmIChTRUxFQ1RFRF9QT1JUID09IFBPUlRfQVJNX0NvcnRleE0pDQoJCQkvKiBSZW1lbWJlciB0aGUgbGFzdCBJU1IgZXhpdCBldmVudCwgYXMgdGhlIGV2ZW50IG5lZWRzIHRvIGJlIG1vZGlmaWVkIGluIGNhc2Ugb2YgYSBmb2xsb3dpbmcgSVNSIGVudHJ5IChpZiB0YWlsLWNoYWluZWQgSVNScykgKi8NCgkJCXB0ckxhc3RJU1JFeGl0RXZlbnQgPSAodWludDhfdCopdHM7DQoJCQkjZW5kaWYNCgkJfQ0KCX0NCgluSVNSYWN0aXZlLS07DQoNCgkjaWYgKFNFTEVDVEVEX1BPUlQgPT0gUE9SVF9BUk1fQ29ydGV4TSkNCglEV1RDeWNsZUNvdW50QXRMYXN0SVNSRXhpdCA9IFJFR19EV1RfQ1lDQ05UOw0KCSNlbmRpZg0KDQoJdHJjQ1JJVElDQUxfU0VDVElPTl9FTkQoKTsNCn0NCg0KI2Vsc2UNCg0KLyogSVNSIHRyYWNpbmcgaXMgdHVybmVkIG9mZiAqLw0Kdm9pZCB2VHJhY2VJbmNyZWFzZUlTUkFjdGl2ZSh2b2lkKQ0Kew0KCWlmIChSZWNvcmRlckRhdGFQdHItPnJlY29yZGVyQWN0aXZlICYmIGhhbmRsZV9vZl9sYXN0X2xvZ2dlZF90YXNrKQ0KCQluSVNSYWN0aXZlKys7DQp9DQoNCnZvaWQgdlRyYWNlRGVjcmVhc2VJU1JBY3RpdmUodm9pZCkNCnsNCglpZiAoUmVjb3JkZXJEYXRhUHRyLT5yZWNvcmRlckFjdGl2ZSAmJiBoYW5kbGVfb2ZfbGFzdF9sb2dnZWRfdGFzaykNCgkJbklTUmFjdGl2ZS0tOw0KfQ0KI2VuZGlmDQoNCg0KLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLw0KLyogVXNlciBFdmVudCBmdW5jdGlvbnMJCQkJCQkJCQkJCQkJCQkqLw0KLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLw0KDQojaWYgKElOQ0xVREVfVVNFUl9FVkVOVFMgPT0gMSkNCg0KI2RlZmluZSBNQVhfQVJHX1NJWkUgKDQrMzIpDQovKioqIExvY2FsbHkgdXNlZCBpbiB2VHJhY2VQcmludEYgKioqLw0Kc3RhdGljIHVpbnQ4X3Qgd3JpdGVJbnQ4KHZvaWQgKiBidWZmZXIsIHVpbnQ4X3QgaSwgdWludDhfdCB2YWx1ZSkNCnsNCglUUkFDRV9BU1NFUlQoYnVmZmVyICE9IE5VTEwsICJ3cml0ZUludDg6IGJ1ZmZlciA9PSBOVUxMIiwgMCk7DQoNCglpZiAoaSA+PSBNQVhfQVJHX1NJWkUpDQoJew0KCQlyZXR1cm4gMjU1Ow0KCX0NCg0KCSgodWludDhfdCopYnVmZmVyKVtpXSA9IHZhbHVlOw0KDQoJaWYgKGkgKyAxID4gTUFYX0FSR19TSVpFKQ0KCXsNCgkJcmV0dXJuIDI1NTsNCgl9DQoNCglyZXR1cm4gaSArIDE7DQp9DQoNCi8qKiogTG9jYWxseSB1c2VkIGluIHZUcmFjZVByaW50RiAqKiovDQpzdGF0aWMgdWludDhfdCB3cml0ZUludDE2KHZvaWQgKiBidWZmZXIsIHVpbnQ4X3QgaSwgdWludDE2X3QgdmFsdWUpDQp7DQoJVFJBQ0VfQVNTRVJUKGJ1ZmZlciAhPSBOVUxMLCAid3JpdGVJbnQxNjogYnVmZmVyID09IE5VTEwiLCAwKTsNCg0KCS8qIEFsaWduIHRvIG11bHRpcGxlIG9mIDIgKi8NCgl3aGlsZSAoKGkgJSAyKSAhPSAwKQ0KCXsNCgkJaWYgKGkgPj0gTUFYX0FSR19TSVpFKQ0KCQl7DQoJCQlyZXR1cm4gMjU1Ow0KCQl9DQoNCgkJKCh1aW50OF90KilidWZmZXIpW2ldID0gMDsNCgkJaSsrOw0KCX0NCg0KCWlmIChpICsgMiA+IE1BWF9BUkdfU0laRSkNCgl7DQoJCXJldHVybiAyNTU7DQoJfQ0KDQoJKCh1aW50MTZfdCopYnVmZmVyKVtpLzJdID0gdmFsdWU7DQoNCglyZXR1cm4gaSArIDI7DQp9DQoNCi8qKiogTG9jYWxseSB1c2VkIGluIHZUcmFjZVByaW50RiAqKiovDQpzdGF0aWMgdWludDhfdCB3cml0ZUludDMyKHZvaWQgKiBidWZmZXIsIHVpbnQ4X3QgaSwgdWludDMyX3QgdmFsdWUpDQp7DQoJVFJBQ0VfQVNTRVJUKGJ1ZmZlciAhPSBOVUxMLCAid3JpdGVJbnQzMjogYnVmZmVyID09IE5VTEwiLCAwKTsNCg0KCS8qIEEgMzIgYml0IHZhbHVlIHNob3VsZCBiZWdpbiBhdCBhbiBldmVuIDQtYnl0ZSBhZGRyZXNzICovDQoJd2hpbGUgKChpICUgNCkgIT0gMCkNCgl7DQoJCWlmIChpID49IE1BWF9BUkdfU0laRSkNCgkJew0KCQkJcmV0dXJuIDI1NTsNCgkJfQ0KDQoJCSgodWludDhfdCopYnVmZmVyKVtpXSA9IDA7DQoJCWkrKzsNCgl9DQoNCglpZiAoaSArIDQgPiBNQVhfQVJHX1NJWkUpDQoJew0KCQlyZXR1cm4gMjU1Ow0KCX0NCg0KCSgodWludDMyX3QqKWJ1ZmZlcilbaS80XSA9IHZhbHVlOw0KDQoJcmV0dXJuIGkgKyA0Ow0KfQ0KDQojaWYgKElOQ0xVREVfRkxPQVRfU1VQUE9SVCkNCg0KLyoqKiBMb2NhbGx5IHVzZWQgaW4gdlRyYWNlUHJpbnRGICoqKi8NCnN0YXRpYyB1aW50OF90IHdyaXRlRmxvYXQodm9pZCAqIGJ1ZmZlciwgdWludDhfdCBpLCBmbG9hdCB2YWx1ZSkNCnsNCglUUkFDRV9BU1NFUlQoYnVmZmVyICE9IE5VTEwsICJ3cml0ZUZsb2F0OiBidWZmZXIgPT0gTlVMTCIsIDApOw0KDQoJLyogQSAzMiBiaXQgdmFsdWUgc2hvdWxkIGJlZ2luIGF0IGFuIGV2ZW4gNC1ieXRlIGFkZHJlc3MgKi8NCgl3aGlsZSAoKGkgJSA0KSAhPSAwKQ0KCXsNCgkJaWYgKGkgPj0gTUFYX0FSR19TSVpFKQ0KCQl7DQoJCQlyZXR1cm4gMjU1Ow0KCQl9DQoNCgkJKCh1aW50OF90KilidWZmZXIpW2ldID0gMDsNCgkJaSsrOw0KCX0NCg0KCWlmIChpICsgNCA+IE1BWF9BUkdfU0laRSkNCgl7DQoJCXJldHVybiAyNTU7DQoJfQ0KDQoJKChmbG9hdCopYnVmZmVyKVtpLzRdID0gdmFsdWU7DQoNCglyZXR1cm4gaSArIDQ7DQp9DQoNCi8qKiogTG9jYWxseSB1c2VkIGluIHZUcmFjZVByaW50RiAqKiovDQpzdGF0aWMgdWludDhfdCB3cml0ZURvdWJsZSh2b2lkICogYnVmZmVyLCB1aW50OF90IGksIGRvdWJsZSB2YWx1ZSkNCnsNCgl1aW50MzJfdCAqIGRlc3Q7DQoJdWludDMyX3QgKiBzcmMgPSAodWludDMyX3QqKSZ2YWx1ZTsNCg0KCVRSQUNFX0FTU0VSVChidWZmZXIgIT0gTlVMTCwgIndyaXRlRG91YmxlOiBidWZmZXIgPT0gTlVMTCIsIDApOw0KDQoJLyogVGhlIGRvdWJsZSBpcyB3cml0dGVuIGFzIHR3byAzMiBiaXQgdmFsdWVzLCBhbmQgc2hvdWxkIGJlZ2luIGF0IGFuIGV2ZW4NCgk0LWJ5dGUgYWRkcmVzcyAodG8gYXZvaWQgaGF2aW5nIHRvIGFsaWduIHdpdGggOCBieXRlKSAqLw0KCXdoaWxlIChpICUgNCAhPSAwKQ0KCXsNCgkJaWYgKGkgPj0gTUFYX0FSR19TSVpFKQ0KCQl7DQoJCQlyZXR1cm4gMjU1Ow0KCQl9DQoNCgkJKCh1aW50OF90KilidWZmZXIpW2ldID0gMDsNCgkJaSsrOw0KCX0NCg0KCWlmIChpICsgOCA+IE1BWF9BUkdfU0laRSkNCgl7DQoJCXJldHVybiAyNTU7DQoJfQ0KDQoJZGVzdCA9ICYoKCh1aW50MzJfdCAqKWJ1ZmZlcilbaS80XSk7DQoNCglkZXN0WzBdID0gc3JjWzBdOw0KCWRlc3RbMV0gPSBzcmNbMV07DQoNCglyZXR1cm4gaSArIDg7DQp9DQoNCiNlbmRpZg0KDQovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKg0KICogcHJ2VHJhY2VVc2VyRXZlbnRGb3JtYXQNCiAqDQogKiBQYXJzZXMgdGhlIGZvcm1hdCBzdHJpbmcgYW5kIHN0b3JlcyB0aGUgYXJndW1lbnRzIGluIHRoZSBidWZmZXIuDQogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLw0Kc3RhdGljIHVpbnQ4X3QgcHJ2VHJhY2VVc2VyRXZlbnRGb3JtYXQoY29uc3QgY2hhciogZm9ybWF0U3RyLCB2YV9saXN0IHZsLCB1aW50OF90KiBidWZmZXIsIHVpbnQ4X3QgYnl0ZU9mZnNldCkNCnsNCgl1aW50MTZfdCBmb3JtYXRTdHJJbmRleCA9IDA7DQoJdWludDhfdCBhcmdDb3VudGVyID0gMDsNCgl1aW50OF90IGkgPSBieXRlT2Zmc2V0Ow0KDQoJd2hpbGUgKGZvcm1hdFN0cltmb3JtYXRTdHJJbmRleF0gIT0gJ1wwJykNCgl7DQoJCWlmIChmb3JtYXRTdHJbZm9ybWF0U3RySW5kZXhdID09ICclJykNCgkJew0KCQkJYXJnQ291bnRlcisrOw0KDQoJCQlpZiAoYXJnQ291bnRlciA+IDE1KQ0KCQkJew0KCQkJCXZUcmFjZUVycm9yKCJ2VHJhY2VQcmludEYgLSBUb28gbWFueSBhcmd1bWVudHMsIG1heCAxNSBhbGxvd2VkISIpOw0KCQkJCXJldHVybiAwOw0KCQkJfQ0KDQoJCQkvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKg0KCQkJKiBUaGVzZSBiZWxvdyBjb2RlIHdyaXRlcyByYXcgZGF0YSAocHJpbWl0aXZlIGRhdGF0eXBlcykgaW4gdGhlIGV2ZW50IGJ1ZmZlciwNCgkJCSogaW5zdGVhZCBvZiB0aGUgbm9ybWFsIGV2ZW50IHN0cnVjdHMgKHdoZXJlIGJ5dGUgMCBpcyBldmVudCB0eXBlKS4NCgkJCSogVGhlc2UgZGF0YSBlbnRyaWVzIG11c3QgbmV2ZXIgYmUgaW50ZXJwcmV0ZWQgYXMgcmVhbCBldmVudCBkYXRhLCBhcyB0aGUgdHlwZQ0KCQkJKiBmaWVsZCB3b3VsZCBiZSBtaXNsZWFkaW5nIHNpbmNlIHVzZWQgZm9yIHBheWxvYWQgZGF0YS4NCgkJCSoNCgkJCSogVGhlIGNvcnJlY3RuZXNzIG9mIHRoaXMgZW5jb2RpbmcgZGVwZW5kcyBvbiB0d28gbWVjaGFuaXNtczoNCgkJCSoNCgkJCSogMS4gQW4gaW5pdGlhbCBVU0VSX0VWRU5ULCB3aGljaCB0eXBlIGNvZGUgdGVsbHMgdGhlIG51bWJlciBvZiAzMi1iaXQgZGF0YQ0KCQkJKiBlbnRpcmVzIHRoYXQgZm9sbG93cy4gKGNvZGUgLSBVU0VSX0VWRU5UID0gbnVtYmVyIG9mIGRhdGEgZW50cmllcykuDQoJCQkqIE5vdGUgdGhhdCBhIGRhdGEgZW50cnkgY29ycmVzcG9uZHMgdG8gdGhlIHNsb3RzIHRoYXQgbm9ybWFsbHkgY29ycmVzcG9uZHMgdG8NCgkJCSogb25lICgxKSBldmVudCwgaS5lLiwgMzIgYml0cy4gdlRyYWNlUHJpbnRGIG1heSBlbmNvZGUgc2V2ZXJhbCBwaWVjZXMgb2YgZGF0YQ0KCQkJKiBpbiBvbmUgZGF0YSBlbnRyeSwgZS5nLiwgdHdvIDE2LWJpdCB2YWx1ZXMgb3IgZm91ciA4LWJpdCB2YWx1ZXMsIG9uZSAxNi1iaXQNCgkJCSogdmFsdWUgZm9sbG93ZWQgYnkgdHdvIDgtYml0IHZhbHVlcywgZXRjLg0KCQkJKg0KCQkJKiAyLiBBIHR3by1waGFzZSBjb21taXQgcHJvY2VkdXJlLCB3aGVyZSB0aGUgVVNFUl9FVkVOVCBhbmQgZGF0YSBlbnRyaWVzIGFyZQ0KCQkJKiB3cml0dGVuIHRvIGEgbG9jYWwgYnVmZmVyIGF0IGZpcnN0LCBhbmQgd2hlbiBhbGwgY2hlY2tzIGFyZSBPSyB0aGVuIGNvcGllZCB0bw0KCQkJKiB0aGUgbWFpbiBldmVudCBidWZmZXIgdXNpbmcgYSBmYXN0IG1lbWNweS4gVGhlIGV2ZW50IGNvZGUgaXMgZmluYWxpemVkIGFzIHRoZQ0KCQkJKiB2ZXJ5IGxhc3Qgc3RlcC4gQmVmb3JlIHRoYXQgc3RlcCwgdGhlIGV2ZW50IGNvZGUgaW5kaWNhdGVzIGFuIHVuZmluaXNoZWQNCgkJCSogZXZlbnQsIHdoaWNoIGNhdXNlcyBpdCB0byBiZSBpZ25vcmVkIGFuZCBzdG9wIHRoZSBsb2FkaW5nIG9mIHRoZSBmaWxlIChzaW5jZQ0KCQkJKiBhbiB1bmZpbmlzaGVkIGV2ZW50IGlzIHRoZSBsYXN0IGV2ZW50IGluIHRoZSB0cmFjZSkuDQoJCQkqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLw0KCQkJZm9ybWF0U3RySW5kZXgrKzsNCg0KCQkJd2hpbGUgKChmb3JtYXRTdHJbZm9ybWF0U3RySW5kZXhdID49ICcwJyAmJiBmb3JtYXRTdHJbZm9ybWF0U3RySW5kZXhdIDw9ICc5JykgfHwgZm9ybWF0U3RyW2Zvcm1hdFN0ckluZGV4XSA9PSAnIycgfHwgZm9ybWF0U3RyW2Zvcm1hdFN0ckluZGV4XSA9PSAnLicpDQoJCQkJZm9ybWF0U3RySW5kZXgrKzsNCg0KCQkJaWYgKGZvcm1hdFN0cltmb3JtYXRTdHJJbmRleF0gIT0gJ1wwJykNCgkJCXsNCgkJCQlzd2l0Y2ggKGZvcm1hdFN0cltmb3JtYXRTdHJJbmRleF0pDQoJCQkJew0KCQkJCQljYXNlICdkJzoJaSA9IHdyaXRlSW50MzIoCWJ1ZmZlciwNCgkJCQkJCQkJCQkJCWksDQoJCQkJCQkJCQkJCQkodWludDMyX3QpdmFfYXJnKHZsLCB1aW50MzJfdCkpOw0KCQkJCQkJCQlicmVhazsNCgkJCQkJY2FzZSAneCc6DQoJCQkJCWNhc2UgJ1gnOg0KCQkJCQljYXNlICd1JzoJaSA9IHdyaXRlSW50MzIoCWJ1ZmZlciwNCgkJCQkJCQkJCQkJCWksDQoJCQkJCQkJCQkJCQkodWludDMyX3QpdmFfYXJnKHZsLCB1aW50MzJfdCkpOw0KCQkJCQkJCQlicmVhazsNCgkJCQkJY2FzZSAncyc6CWkgPSB3cml0ZUludDE2KAlidWZmZXIsDQoJCQkJCQkJCQkJCQlpLA0KCQkJCQkJCQkJCQkJKHVpbnQxNl90KXhUcmFjZU9wZW5MYWJlbCgoY2hhciopdmFfYXJnKHZsLCBjaGFyKikpKTsNCgkJCQkJCQkJYnJlYWs7DQoNCiNpZiAoSU5DTFVERV9GTE9BVF9TVVBQT1JUKQ0KCQkJCQkvKiBZZXMsICJkb3VibGUiIGFzIHR5cGUgYWxzbyBpbiB0aGUgZmxvYXQNCgkJCQkJY2FzZS4gVGhpcyBzaW5jZSAiZmxvYXQiIGlzIHByb21vdGVkIGludG8gImRvdWJsZSINCgkJCQkJYnkgdGhlIHZhX2FyZyBzdHVmZi4gKi8NCgkJCQkJY2FzZSAnZic6CWkgPSB3cml0ZUZsb2F0KAlidWZmZXIsDQoJCQkJCQkJCQkJCQlpLA0KCQkJCQkJCQkJCQkJKGZsb2F0KXZhX2FyZyh2bCwgZG91YmxlKSk7DQoJCQkJCQkJCWJyZWFrOw0KI2Vsc2UNCgkJCQkJLyogTm8gc3VwcG9ydCBmb3IgZmxvYXRzLCBidXQgYXR0ZW1wdCB0byBzdG9yZSBhIGZsb2F0IHVzZXIgZXZlbnQNCgkJCQkJYXZvaWQgYSBwb3NzaWJsZSBjcmFzaCBkdWUgdG8gZmxvYXQgcmVmZXJlbmNlLiBJbnN0ZWFkIHN0b3JlIHRoZQ0KCQkJCQlkYXRhIG9uIHVpbnRfMzIgZm9ybWF0ICh3aWxsIG5vdCBiZSBkaXNwbGF5ZWQgYW55d2F5KS4gVGhpcyBpcyBqdXN0DQoJCQkJCXRvIGtlZXAgdmFfYXJnIGFuZCBpIGNvbnNpc3RlbnQuICovDQoNCgkJCQkJY2FzZSAnZic6CWkgPSB3cml0ZUludDMyKAlidWZmZXIsDQoJCQkJCQkJCQkJCQlpLA0KCQkJCQkJCQkJCQkJKHVpbnQzMl90KXZhX2FyZyh2bCwgZG91YmxlKSk7DQoJCQkJCQkJCWJyZWFrOw0KI2VuZGlmDQoJCQkJCWNhc2UgJ2wnOg0KCQkJCQkJCQlmb3JtYXRTdHJJbmRleCsrOw0KCQkJCQkJCQlzd2l0Y2ggKGZvcm1hdFN0cltmb3JtYXRTdHJJbmRleF0pDQoJCQkJCQkJCXsNCiNpZiAoSU5DTFVERV9GTE9BVF9TVVBQT1JUKQ0KCQkJCQkJCQkJY2FzZSAnZic6CWkgPSB3cml0ZURvdWJsZShidWZmZXIsDQoJCQkJCQkJCQkJCQkJCQkJaSwNCgkJCQkJCQkJCQkJCQkJCQkoZG91YmxlKXZhX2FyZyh2bCwgZG91YmxlKSk7DQoJCQkJCQkJCQkJCQlicmVhazsNCiNlbHNlDQoJCQkJCQkJCQkvKiBObyBzdXBwb3J0IGZvciBmbG9hdHMsIGJ1dCBhdHRlbXB0IHRvIHN0b3JlIGEgZmxvYXQgdXNlciBldmVudA0KCQkJCQkJCQkJYXZvaWQgYSBwb3NzaWJsZSBjcmFzaCBkdWUgdG8gZmxvYXQgcmVmZXJlbmNlLiBJbnN0ZWFkIHN0b3JlIHRoZQ0KCQkJCQkJCQkJZGF0YSBvbiB1aW50XzMyIGZvcm1hdCAod2lsbCBub3QgYmUgZGlzcGxheWVkIGFueXdheSkuIFRoaXMgaXMganVzdA0KCQkJCQkJCQkJdG8ga2VlcCB2YV9hcmcgYW5kIGkgY29uc2lzdGVudC4gKi8NCgkJCQkJCQkJCWNhc2UgJ2YnOglpID0gd3JpdGVJbnQzMigJYnVmZmVyLCAvKiBJbiB0aGlzIGNhc2UsIHRoZSB2YWx1ZSB3aWxsIG5vdCBiZSBzaG93biBhbnl3YXkgKi8NCgkJCQkJCQkJCQkJCQkJCQlpLA0KCQkJCQkJCQkJCQkJCQkJCSh1aW50MzJfdCl2YV9hcmcodmwsIGRvdWJsZSkpOw0KDQoJCQkJCQkJCQkJCQlpID0gd3JpdGVJbnQzMigJYnVmZmVyLCAvKiBEbyBpdCB0d2ljZSwgdG8gd3JpdGUgaW4gdG90YWwgOCBieXRlcyAqLw0KCQkJCQkJCQkJCQkJCQkJCWksDQoJCQkJCQkJCQkJCQkJCQkJKHVpbnQzMl90KXZhX2FyZyh2bCwgZG91YmxlKSk7DQoJCQkJCQkJCQkJYnJlYWs7DQojZW5kaWYNCg0KCQkJCQkJCQl9DQoJCQkJCQkJCWJyZWFrOw0KCQkJCQljYXNlICdoJzoNCgkJCQkJCQkJZm9ybWF0U3RySW5kZXgrKzsNCgkJCQkJCQkJc3dpdGNoIChmb3JtYXRTdHJbZm9ybWF0U3RySW5kZXhdKQ0KCQkJCQkJCQl7DQoJCQkJCQkJCQljYXNlICdkJzoJaSA9IHdyaXRlSW50MTYoCWJ1ZmZlciwNCgkJCQkJCQkJCQkJCQkJCQlpLA0KCQkJCQkJCQkJCQkJCQkJCSh1aW50MTZfdCl2YV9hcmcodmwsIHVpbnQzMl90KSk7DQoJCQkJCQkJCQkJCQlicmVhazsNCgkJCQkJCQkJCWNhc2UgJ3UnOglpID0gd3JpdGVJbnQxNigJYnVmZmVyLA0KCQkJCQkJCQkJCQkJCQkJCWksDQoJCQkJCQkJCQkJCQkJCQkJKHVpbnQxNl90KXZhX2FyZyh2bCwgdWludDMyX3QpKTsNCgkJCQkJCQkJCQkJCWJyZWFrOw0KCQkJCQkJCQl9DQoJCQkJCQkJCWJyZWFrOw0KCQkJCQljYXNlICdiJzoNCgkJCQkJCQkJZm9ybWF0U3RySW5kZXgrKzsNCgkJCQkJCQkJc3dpdGNoIChmb3JtYXRTdHJbZm9ybWF0U3RySW5kZXhdKQ0KCQkJCQkJCQl7DQoJCQkJCQkJCQljYXNlICdkJzoJaSA9IHdyaXRlSW50OCgJYnVmZmVyLA0KCQkJCQkJCQkJCQkJCQkJCWksDQoJCQkJCQkJCQkJCQkJCQkJKHVpbnQ4X3QpdmFfYXJnKHZsLCB1aW50MzJfdCkpOw0KCQkJCQkJCQkJCQkJYnJlYWs7DQoNCgkJCQkJCQkJCWNhc2UgJ3UnOglpID0gd3JpdGVJbnQ4KAlidWZmZXIsDQoJCQkJCQkJCQkJCQkJCQkJaSwNCgkJCQkJCQkJCQkJCQkJCQkodWludDhfdCl2YV9hcmcodmwsIHVpbnQzMl90KSk7DQoJCQkJCQkJCQkJCQlicmVhazsNCgkJCQkJCQkJfQ0KCQkJCQkJCQlicmVhazsNCgkJCQl9DQoJCQl9DQoJCQllbHNlDQoJCQkJYnJlYWs7DQoJCX0NCgkJZm9ybWF0U3RySW5kZXgrKzsNCgkJaWYgKGkgPT0gMjU1KQ0KCQl7DQoJCQl2VHJhY2VFcnJvcigidlRyYWNlUHJpbnRGIC0gVG9vIGxhcmdlIGFyZ3VtZW50cywgbWF4IDMyIGJ5dGUgYWxsb3dlZCEiKTsNCgkJCXJldHVybiAwOw0KCQl9DQoJfQ0KCXJldHVybiAoaSszKS80Ow0KfQ0KDQojaWYgKFVTRV9TRVBBUkFURV9VU0VSX0VWRU5UX0JVRkZFUiA9PSAxKQ0KDQovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKg0KICogcHJ2VHJhY2VDbGVhckNoYW5uZWxCdWZmZXINCiAqDQogKiBDbGVhcnMgYSBudW1iZXIgb2YgaXRlbXMgaW4gdGhlIGNoYW5uZWwgYnVmZmVyLCBzdGFydGluZyBmcm9tIG5leHRTbG90VG9Xcml0ZS4NCiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovDQpzdGF0aWMgdm9pZCBwcnZUcmFjZUNsZWFyQ2hhbm5lbEJ1ZmZlcih1aW50MzJfdCBjb3VudCkNCnsNCgl1aW50MzJfdCBzbG90czsNCg0KCVRSQUNFX0FTU0VSVChVU0VSX0VWRU5UX0JVRkZFUl9TSVpFID49IGNvdW50LA0KCQkicHJ2VHJhY2VDbGVhckNoYW5uZWxCdWZmZXI6IFVTRVJfRVZFTlRfQlVGRkVSX1NJWkUgaXMgdG9vIHNtYWxsIHRvIGhhbmRsZSB0aGlzIGV2ZW50LiIsICk7DQoNCgkvKiBDaGVjayBpZiB3ZSdyZSBjbG9zZSB0byB0aGUgZW5kIG9mIHRoZSBidWZmZXIgKi8NCglpZiAoUmVjb3JkZXJEYXRhUHRyLT51c2VyRXZlbnRCdWZmZXIubmV4dFNsb3RUb1dyaXRlICsgY291bnQgPiBVU0VSX0VWRU5UX0JVRkZFUl9TSVpFKQ0KCXsNCgkJc2xvdHMgPSBVU0VSX0VWRU5UX0JVRkZFUl9TSVpFIC0gUmVjb3JkZXJEYXRhUHRyLT51c2VyRXZlbnRCdWZmZXIubmV4dFNsb3RUb1dyaXRlOyAvKiBOdW1iZXIgb2Ygc2xvdHMgYmVmb3JlIGVuZCBvZiBidWZmZXIgKi8NCgkJKHZvaWQpbWVtc2V0KCZSZWNvcmRlckRhdGFQdHItPnVzZXJFdmVudEJ1ZmZlci5jaGFubmVsQnVmZmVyW1JlY29yZGVyRGF0YVB0ci0+dXNlckV2ZW50QnVmZmVyLm5leHRTbG90VG9Xcml0ZV0sIDAsIHNsb3RzKTsNCgkJKHZvaWQpbWVtc2V0KCZSZWNvcmRlckRhdGFQdHItPnVzZXJFdmVudEJ1ZmZlci5jaGFubmVsQnVmZmVyWzBdLCAwLCAoY291bnQgLSBzbG90cykpOw0KCX0NCgllbHNlDQoJCSh2b2lkKW1lbXNldCgmUmVjb3JkZXJEYXRhUHRyLT51c2VyRXZlbnRCdWZmZXIuY2hhbm5lbEJ1ZmZlcltSZWNvcmRlckRhdGFQdHItPnVzZXJFdmVudEJ1ZmZlci5uZXh0U2xvdFRvV3JpdGVdLCAwLCBjb3VudCk7DQp9DQoNCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqDQogKiBwcnZUcmFjZUNvcHlUb0RhdGFCdWZmZXINCiAqDQogKiBDb3BpZXMgYSBudW1iZXIgb2YgaXRlbXMgdG8gdGhlIGRhdGEgYnVmZmVyLCBzdGFydGluZyBmcm9tIG5leHRTbG90VG9Xcml0ZS4NCiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovDQpzdGF0aWMgdm9pZCBwcnZUcmFjZUNvcHlUb0RhdGFCdWZmZXIodWludDMyX3QqIGRhdGEsIHVpbnQzMl90IGNvdW50KQ0Kew0KCVRSQUNFX0FTU0VSVChkYXRhICE9IE5VTEwsDQoJCSJwcnZUcmFjZUNvcHlUb0RhdGFCdWZmZXI6IGRhdGEgPT0gTlVMTC4iLCApOw0KCVRSQUNFX0FTU0VSVChjb3VudCA8PSBVU0VSX0VWRU5UX0JVRkZFUl9TSVpFLA0KCQkicHJ2VHJhY2VDb3B5VG9EYXRhQnVmZmVyOiBVU0VSX0VWRU5UX0JVRkZFUl9TSVpFIGlzIHRvbyBzbWFsbCB0byBoYW5kbGUgdGhpcyBldmVudC4iLCApOw0KDQoJdWludDMyX3Qgc2xvdHM7DQoJLyogQ2hlY2sgaWYgd2UncmUgY2xvc2UgdG8gdGhlIGVuZCBvZiB0aGUgYnVmZmVyICovDQoJaWYgKFJlY29yZGVyRGF0YVB0ci0+dXNlckV2ZW50QnVmZmVyLm5leHRTbG90VG9Xcml0ZSArIGNvdW50ID4gVVNFUl9FVkVOVF9CVUZGRVJfU0laRSkNCgl7DQoJCXNsb3RzID0gVVNFUl9FVkVOVF9CVUZGRVJfU0laRSAtIFJlY29yZGVyRGF0YVB0ci0+dXNlckV2ZW50QnVmZmVyLm5leHRTbG90VG9Xcml0ZTsgLyogTnVtYmVyIG9mIHNsb3RzIGJlZm9yZSBlbmQgb2YgYnVmZmVyICovDQoJCSh2b2lkKW1lbWNweSgmUmVjb3JkZXJEYXRhUHRyLT51c2VyRXZlbnRCdWZmZXIuZGF0YUJ1ZmZlcltSZWNvcmRlckRhdGFQdHItPnVzZXJFdmVudEJ1ZmZlci5uZXh0U2xvdFRvV3JpdGUgKiA0XSwgZGF0YSwgc2xvdHMgKiA0KTsNCgkJKHZvaWQpbWVtY3B5KCZSZWNvcmRlckRhdGFQdHItPnVzZXJFdmVudEJ1ZmZlci5kYXRhQnVmZmVyWzBdLCBkYXRhICsgc2xvdHMsIChjb3VudCAtIHNsb3RzKSAqIDQpOw0KCX0NCgllbHNlDQoJew0KCQkodm9pZCltZW1jcHkoJlJlY29yZGVyRGF0YVB0ci0+dXNlckV2ZW50QnVmZmVyLmRhdGFCdWZmZXJbUmVjb3JkZXJEYXRhUHRyLT51c2VyRXZlbnRCdWZmZXIubmV4dFNsb3RUb1dyaXRlICogNF0sIGRhdGEsIGNvdW50ICogNCk7DQoJfQ0KfQ0KDQovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKg0KICogcHJ2VHJhY2VVc2VyRXZlbnRIZWxwZXIxDQogKg0KICogQ2FsbHMgb24gcHJ2VHJhY2VVc2VyRXZlbnRGb3JtYXQoKSB0byBkbyB0aGUgYWN0dWFsIGZvcm1hdHRpbmcsIHRoZW4gZ29lcyBvbg0KICogdG8gdGhlIG5leHQgaGVscGVyIGZ1bmN0aW9uLg0KICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8NCnN0YXRpYyB2b2lkIHBydlRyYWNlVXNlckV2ZW50SGVscGVyMShVc2VyRXZlbnRDaGFubmVsIGNoYW5uZWwsIHRyYWNlTGFiZWwgZXZlbnRMYWJlbCwgdHJhY2VMYWJlbCBmb3JtYXRMYWJlbCwgdmFfbGlzdCB2bCkNCnsNCgl1aW50MzJfdCBkYXRhWygzICsgTUFYX0FSR19TSVpFKSAvIDRdOw0KCXVpbnQ4X3QgYnl0ZU9mZnNldCA9IDQ7IC8qIE5lZWQgcm9vbSBmb3IgdGltZXN0YW1wICovDQoJdWludDhfdCBub09mU2xvdHM7DQoNCglpZiAoY2hhbm5lbCA9PSAwKQ0KCXsNCgkJLyogV2UgYXJlIGRlYWxpbmcgd2l0aCBhbiB1bmtub3duIGNoYW5uZWwgZm9ybWF0IHBhaXIgKi8NCgkJYnl0ZU9mZnNldCArPSA0OyAvKiBBbHNvIG5lZWQgcm9vbSBmb3IgY2hhbm5lbCBhbmQgZm9ybWF0ICovDQoJCSgodWludDE2X3QqKWRhdGEpWzJdID0gZXZlbnRMYWJlbDsNCgkJKCh1aW50MTZfdCopZGF0YSlbM10gPSBmb3JtYXRMYWJlbDsNCgl9DQoNCglub09mU2xvdHMgPSBwcnZUcmFjZVVzZXJFdmVudEZvcm1hdCgoY2hhciopJihSZWNvcmRlckRhdGFQdHItPlN5bWJvbFRhYmxlLnN5bWJ5dGVzW2Zvcm1hdExhYmVsKzRdKSwgdmwsICh1aW50OF90KilkYXRhLCBieXRlT2Zmc2V0KTsNCg0KCXBydlRyYWNlVXNlckV2ZW50SGVscGVyMihjaGFubmVsLCBkYXRhLCBub09mU2xvdHMpOw0KfQ0KDQovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKg0KICogcHJ2VHJhY2VVc2VyRXZlbnRIZWxwZXIyDQogKg0KICogVGhpcyBmdW5jdGlvbiBzaW1wbHkgY29waWVzIHRoZSBkYXRhIGJ1ZmZlciB0byB0aGUgYWN0dWFsIHVzZXIgZXZlbnQgYnVmZmVyLg0KICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8NCnN0YXRpYyB2b2lkIHBydlRyYWNlVXNlckV2ZW50SGVscGVyMihVc2VyRXZlbnRDaGFubmVsIGNoYW5uZWwsIHVpbnQzMl90KiBkYXRhLCB1aW50MzJfdCBub09mU2xvdHMpDQp7DQoJc3RhdGljIHVpbnQzMl90IG9sZF90aW1lc3RhbXAgPSAwOw0KCXVpbnQzMl90IG9sZF9uZXh0U2xvdFRvV3JpdGUgPSAwOw0KDQoJVFJBQ0VfQVNTRVJUKFVTRVJfRVZFTlRfQlVGRkVSX1NJWkUgPj0gbm9PZlNsb3RzLCAidlRyYWNlUHJpbnRGOiBVU0VSX0VWRU5UX0JVRkZFUl9TSVpFIGlzIHRvbyBzbWFsbCB0byBoYW5kbGUgdGhpcyBldmVudC4iLCApOw0KDQoJdHJjQ1JJVElDQUxfU0VDVElPTl9CRUdJTigpOw0KCS8qIFN0b3JlIHRoZSB0aW1lc3RhbXAgKi8NCgl2VHJhY2VQb3J0R2V0VGltZVN0YW1wKGRhdGEpOw0KDQoJaWYgKCpkYXRhIDwgb2xkX3RpbWVzdGFtcCkNCgl7DQoJCVJlY29yZGVyRGF0YVB0ci0+dXNlckV2ZW50QnVmZmVyLndyYXBhcm91bmRDb3VudGVyKys7DQoJfQ0KDQoJb2xkX3RpbWVzdGFtcCA9ICpkYXRhOw0KDQoJLyogU3RhcnQgYnkgZXJhc2luZyBhbnkgaW5mb3JtYXRpb24gaW4gdGhlIGNoYW5uZWwgYnVmZmVyICovDQoJcHJ2VHJhY2VDbGVhckNoYW5uZWxCdWZmZXIobm9PZlNsb3RzKTsNCg0KCXBydlRyYWNlQ29weVRvRGF0YUJ1ZmZlcihkYXRhLCBub09mU2xvdHMpOyAvKiBXaWxsIHdyYXAgYXJvdW5kIHRoZSBkYXRhIGlmIG5lY2Vzc2FyeSAqLw0KDQoJb2xkX25leHRTbG90VG9Xcml0ZSA9IFJlY29yZGVyRGF0YVB0ci0+dXNlckV2ZW50QnVmZmVyLm5leHRTbG90VG9Xcml0ZTsgLyogU2F2ZSB0aGUgaW5kZXggdGhhdCB3ZSB3YW50IHRvIHdyaXRlIHRoZSBjaGFubmVsIGRhdGEgYXQgd2hlbiB3ZSdyZSBkb25lICovDQoJUmVjb3JkZXJEYXRhUHRyLT51c2VyRXZlbnRCdWZmZXIubmV4dFNsb3RUb1dyaXRlID0gKFJlY29yZGVyRGF0YVB0ci0+dXNlckV2ZW50QnVmZmVyLm5leHRTbG90VG9Xcml0ZSArIG5vT2ZTbG90cykgJSBVU0VSX0VWRU5UX0JVRkZFUl9TSVpFOyAvKiBNYWtlIHN1cmUgd2UgbmV2ZXIgZW5kIHVwIG91dHNpZGUgdGhlIGJ1ZmZlciAqLw0KDQoJLyogV3JpdGUgdG8gdGhlIGNoYW5uZWwgYnVmZmVyIHRvIGluZGljYXRlIHRoYXQgdGhpcyB1c2VyIGV2ZW50IGlzIHJlYWR5IHRvIGJlIHVzZWQgKi8NCglpZiAoY2hhbm5lbCAhPSAwKQ0KCXsNCgkJUmVjb3JkZXJEYXRhUHRyLT51c2VyRXZlbnRCdWZmZXIuY2hhbm5lbEJ1ZmZlcltvbGRfbmV4dFNsb3RUb1dyaXRlXSA9IGNoYW5uZWw7DQoJfQ0KCWVsc2UNCgl7DQoJCS8qIDB4RkYgaW5kaWNhdGVzIHRoYXQgdGhpcyBpcyBub3QgYSBub3JtYWwgY2hhbm5lbCBpZCAqLw0KCQlSZWNvcmRlckRhdGFQdHItPnVzZXJFdmVudEJ1ZmZlci5jaGFubmVsQnVmZmVyW29sZF9uZXh0U2xvdFRvV3JpdGVdID0gKFVzZXJFdmVudENoYW5uZWwpMHhGRjsNCgl9DQoJdHJjQ1JJVElDQUxfU0VDVElPTl9FTkQoKTsNCn0NCg0KLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioNCiAqIHhUcmFjZVJlZ2lzdGVyQ2hhbm5lbEZvcm1hdA0KICoNCiAqIEF0dGVtcHRzIHRvIGNyZWF0ZSBhIHBhaXIgb2YgdGhlIGNoYW5uZWwgYW5kIGZvcm1hdCBzdHJpbmcuDQogKg0KICogTm90ZTogVGhpcyBpcyBvbmx5IGF2YWlsYWJsZSBpZiBVU0VfU0VQQVJBVEVfVVNFUl9FVkVOVF9CVUZGRVIgaXMgZW5hYmxlZCBpbg0KICogdHJjQ29uZmlnLmgNCiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovDQpVc2VyRXZlbnRDaGFubmVsIHhUcmFjZVJlZ2lzdGVyQ2hhbm5lbEZvcm1hdCh0cmFjZUxhYmVsIGNoYW5uZWwsIHRyYWNlTGFiZWwgZm9ybWF0U3RyKQ0Kew0KCXVpbnQ4X3QgaTsNCglVc2VyRXZlbnRDaGFubmVsIHJldFZhbCA9IDA7DQoNCglUUkFDRV9BU1NFUlQoZm9ybWF0U3RyICE9IDAsICJ2VHJhY2VSZWdpc3RlckNoYW5uZWxGb3JtYXQ6IGZvcm1hdFN0ciA9PSAwIiwgKFVzZXJFdmVudENoYW5uZWwpMCk7DQoNCgl0cmNDUklUSUNBTF9TRUNUSU9OX0JFR0lOKCk7DQoJZm9yIChpID0gMTsgaSA8PSBDSEFOTkVMX0ZPUk1BVF9QQUlSUzsgaSsrKSAvKiBTaXplIG9mIHRoZSBjaGFubmVscyBidWZmZXIgaXMgQ0hBTk5FTF9GT1JNQVRfUEFJUlMgKyAxLiBJbmRleCAwIGlzIHVudXNlZC4gKi8NCgl7DQoJCWlmKFJlY29yZGVyRGF0YVB0ci0+dXNlckV2ZW50QnVmZmVyLmNoYW5uZWxzW2ldLm5hbWUgPT0gMCAmJiBSZWNvcmRlckRhdGFQdHItPnVzZXJFdmVudEJ1ZmZlci5jaGFubmVsc1tpXS5kZWZhdWx0Rm9ybWF0ID09IDApDQoJCXsNCgkJCS8qIEZvdW5kIGVtcHR5IHNsb3QgKi8NCgkJCVJlY29yZGVyRGF0YVB0ci0+dXNlckV2ZW50QnVmZmVyLmNoYW5uZWxzW2ldLm5hbWUgPSBjaGFubmVsOw0KCQkJUmVjb3JkZXJEYXRhUHRyLT51c2VyRXZlbnRCdWZmZXIuY2hhbm5lbHNbaV0uZGVmYXVsdEZvcm1hdCA9IGZvcm1hdFN0cjsNCgkJCXJldFZhbCA9IChVc2VyRXZlbnRDaGFubmVsKWk7DQoJCQlicmVhazsNCgkJfQ0KDQoJCWlmIChSZWNvcmRlckRhdGFQdHItPnVzZXJFdmVudEJ1ZmZlci5jaGFubmVsc1tpXS5uYW1lID09IGNoYW5uZWwgJiYgUmVjb3JkZXJEYXRhUHRyLT51c2VyRXZlbnRCdWZmZXIuY2hhbm5lbHNbaV0uZGVmYXVsdEZvcm1hdCA9PSBmb3JtYXRTdHIpDQoJCXsNCgkJCS8qIEZvdW5kIGEgbWF0Y2ggKi8NCgkJCXJldFZhbCA9IChVc2VyRXZlbnRDaGFubmVsKWk7DQoJCQlicmVhazsNCgkJfQ0KCX0NCgl0cmNDUklUSUNBTF9TRUNUSU9OX0VORCgpOw0KCXJldHVybiByZXRWYWw7DQp9DQoNCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioNCiAqIHZUcmFjZUNoYW5uZWxQcmludEYNCiAqDQogKiBTbGlnaHRseSBmYXN0ZXIgdmVyc2lvbiBvZiB2VHJhY2VQcmludEYoKSBkdWUgdG8gbm8gbG9va3Vwcy4NCiAqDQogKiBOb3RlOiBUaGlzIGlzIG9ubHkgYXZhaWxhYmxlIGlmIFVTRV9TRVBBUkFURV9VU0VSX0VWRU5UX0JVRkZFUiBpcyBlbmFibGVkIGluDQogKiB0cmNDb25maWcuaA0KICoNCiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovDQp2b2lkIHZUcmFjZUNoYW5uZWxQcmludEYoVXNlckV2ZW50Q2hhbm5lbCBjaGFubmVsUGFpciwgLi4uKQ0Kew0KI2lmIChUUkFDRV9TQ0hFRFVMSU5HX09OTFkgPT0gMCkNCgl2YV9saXN0IHZsOw0KDQoJdmFfc3RhcnQodmwsIGNoYW5uZWxQYWlyKTsNCgl2VHJhY2VDaGFubmVsUHJpbnRGX0hlbHBlcihjaGFubmVsUGFpciwgdmwpOw0KCXZhX2VuZCh2bCk7DQojZW5kaWYgLyogVFJBQ0VfU0NIRURVTElOR19PTkxZICovDQp9DQoNCnZvaWQgdlRyYWNlQ2hhbm5lbFByaW50Rl9IZWxwZXIoVXNlckV2ZW50Q2hhbm5lbCBjaGFubmVsUGFpciwgdmFfbGlzdCB2bCkNCnsNCgl0cmFjZUxhYmVsIGNoYW5uZWw7DQoJdHJhY2VMYWJlbCBmb3JtYXRTdHI7DQoNCglUUkFDRV9BU1NFUlQoY2hhbm5lbFBhaXIgIT0gMCwgInZUcmFjZUNoYW5uZWxQcmludEY6IGNoYW5uZWxQYWlyID09IDAiLCApOw0KCVRSQUNFX0FTU0VSVChjaGFubmVsUGFpciA8PSBDSEFOTkVMX0ZPUk1BVF9QQUlSUywgInZUcmFjZUNoYW5uZWxQcmludEY6ICIsICk7DQoNCgljaGFubmVsID0gUmVjb3JkZXJEYXRhUHRyLT51c2VyRXZlbnRCdWZmZXIuY2hhbm5lbHNbY2hhbm5lbFBhaXJdLm5hbWU7DQoJZm9ybWF0U3RyID0gUmVjb3JkZXJEYXRhUHRyLT51c2VyRXZlbnRCdWZmZXIuY2hhbm5lbHNbY2hhbm5lbFBhaXJdLmRlZmF1bHRGb3JtYXQ7DQoNCglwcnZUcmFjZVVzZXJFdmVudEhlbHBlcjEoY2hhbm5lbFBhaXIsIGNoYW5uZWwsIGZvcm1hdFN0ciwgdmwpOw0KfQ0KDQovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqDQogKiB2VHJhY2VDaGFubmVsVXNlckV2ZW50DQogKg0KICogU2xpZ2h0bHkgZmFzdGVyIHZlcnNpb24gb2YgdlRyYWNlVXNlckV2ZW50KCkgZHVlIHRvIG5vIGxvb2t1cHMuDQogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLw0Kdm9pZCB2VHJhY2VDaGFubmVsVXNlckV2ZW50KFVzZXJFdmVudENoYW5uZWwgY2hhbm5lbFBhaXIpDQp7DQojaWYgKFRSQUNFX1NDSEVEVUxJTkdfT05MWSA9PSAwKQ0KCXVpbnQzMl90IGRhdGFbKDMgKyBNQVhfQVJHX1NJWkUpIC8gNF07DQoNCglUUkFDRV9BU1NFUlQoY2hhbm5lbFBhaXIgIT0gMCwgInZUcmFjZUNoYW5uZWxQcmludEY6IGNoYW5uZWxQYWlyID09IDAiLCApOw0KCVRSQUNFX0FTU0VSVChjaGFubmVsUGFpciA8PSBDSEFOTkVMX0ZPUk1BVF9QQUlSUywgInZUcmFjZUNoYW5uZWxQcmludEY6ICIsICk7DQoNCglwcnZUcmFjZVVzZXJFdmVudEhlbHBlcjIoY2hhbm5lbFBhaXIsIGRhdGEsIDEpOyAvKiBPbmx5IG5lZWQgb25lIHNsb3QgZm9yIHRpbWVzdGFtcCAqLw0KI2VuZGlmIC8qIFRSQUNFX1NDSEVEVUxJTkdfT05MWSAqLw0KfQ0KI2VuZGlmIC8qIFVTRV9TRVBBUkFURV9VU0VSX0VWRU5UX0JVRkZFUiA9PSAxICovDQoNCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioNCiAqIHZUcmFjZVByaW50Rg0KICoNCiAqIEFkdmFuY2VkIHVzZXIgZXZlbnRzIChQcm9mZXNzaW9uYWwgRWRpdGlvbiBvbmx5KQ0KICoNCiAqIEdlbmVyYXRlcyBVc2VyIEV2ZW50IHdpdGggZm9ybWF0dGVkIHRleHQgYW5kIGRhdGEsIHNpbWlsYXIgdG8gYSAicHJpbnRmIi4NCiAqIEl0IGlzIHZlcnkgZmFzdCBjb21wYXJlZCB0byBhIG5vcm1hbCAicHJpbnRmIiBzaW5jZSB0aGlzIGZ1bmN0aW9uIG9ubHkNCiAqIHN0b3JlcyB0aGUgYXJndW1lbnRzLiBUaGUgYWN0dWFsIGZvcm1hdHRpbmcgaXMgZG9uZQ0KICogb24gdGhlIGhvc3QgUEMgd2hlbiB0aGUgdHJhY2UgaXMgZGlzcGxheWVkIGluIHRoZSB2aWV3ZXIgdG9vbC4NCiAqDQogKiBVc2VyIEV2ZW50IGxhYmVscyBhcmUgY3JlYXRlZCB1c2luZyB4VHJhY2VPcGVuTGFiZWwuDQogKiBFeGFtcGxlOg0KICoNCiAqCSB0cmFjZUxhYmVsIGFkY191ZWNoYW5uZWwgPSB4VHJhY2VPcGVuTGFiZWwoIkFEQyBVc2VyIEV2ZW50cyIpOw0KICoJIC4uLg0KICoJIHZUcmFjZVByaW50KGFkY191ZWNoYW5uZWwsDQogKgkJCQkgIkFEQyBjaGFubmVsICVkOiAlbGYgdm9sdHMiLA0KICoJCQkJIGNoLCAoZG91YmxlKWFkY19yZWFkaW5nLyhkb3VibGUpc2NhbGUpOw0KICoNCiAqIFRoaXMgY2FuIGJlIGNvbWJpbmVkIGludG8gb25lIGxpbmUsIGlmIGRlc2lyZWQsIGJ1dCB0aGlzIGlzIHNsb3dlcjoNCiAqDQogKgkgdlRyYWNlUHJpbnQoeFRyYWNlT3BlbkxhYmVsKCJBREMgVXNlciBFdmVudHMiKSwNCiAqCQkJCSAiQURDIGNoYW5uZWwgJWQ6ICVsZiB2b2x0cyIsDQogKgkJCQkgY2gsIChkb3VibGUpYWRjX3JlYWRpbmcvKGRvdWJsZSlzY2FsZSk7DQogKg0KICogQ2FsbGluZyB4VHJhY2VPcGVuTGFiZWwgbXVsdGlwbGUgdGltZXMgd2lsbCBub3QgY3JlYXRlIGR1cGxpY2F0ZSBlbnRyaWVzLCBidXQNCiAqIGl0IGlzIG9mIGNvdXJzZSBmYXN0ZXIgdG8ganVzdCBkbyBpdCBvbmNlLCBhbmQgdGhlbiBrZWVwIHRoZSBoYW5kbGUgZm9yIGxhdGVyDQogKiB1c2UuIElmIHlvdSBkb260dCBoYXZlIGFueSBkYXRhIGFyZ3VtZW50cywgb25seSBhIHRleHQgbGFiZWwvc3RyaW5nLCBpdCBpcw0KICogYmV0dGVyIHRvIHVzZSB2VHJhY2VVc2VyRXZlbnQgLSBpdCBpcyBmYXN0ZXIuDQogKg0KICogRm9ybWF0IHNwZWNpZmllcnMgc3VwcG9ydGVkOg0KICogJWQgLSAzMiBiaXQgc2lnbmVkIGludGVnZXINCiAqICV1IC0gMzIgYml0IHVuc2lnbmVkIGludGVnZXINCiAqICVmIC0gMzIgYml0IGZsb2F0DQogKiAlcyAtIHN0cmluZyAoaXMgY29waWVkIHRvIHRoZSByZWNvcmRlciBzeW1ib2wgdGFibGUpDQogKiAlaGQgLSAxNiBiaXQgc2lnbmVkIGludGVnZXINCiAqICVodSAtIDE2IGJpdCB1bnNpZ25lZCBpbnRlZ2VyDQogKiAlYmQgLSA4IGJpdCBzaWduZWQgaW50ZWdlcg0KICogJWJ1IC0gOCBiaXQgdW5zaWduZWQgaW50ZWdlcg0KICogJWxmIC0gZG91YmxlLXByZWNpc2lvbiBmbG9hdCAoTm90ZSEgU2VlIGJlbG93Li4uKQ0KICoNCiAqIFVwIHRvIDE1IGRhdGEgYXJndW1lbnRzIGFyZSBhbGxvd2VkLCB3aXRoIGEgdG90YWwgc2l6ZSBvZiBtYXhpbXVtIDMyIGJ5dGUuDQogKiBJbiBjYXNlIHRoaXMgaXMgZXhjZWVkZWQsIHRoZSB1c2VyIGV2ZW50IGlzIGNoYW5nZWQgaW50byBhbiBlcnJvciBtZXNzYWdlLg0KICoNCiAqIFRoZSBkYXRhIGlzIHN0b3JlZCBpbiB0cmFjZSBidWZmZXIsIGFuZCBpcyBwYWNrZWQgdG8gYWxsb3cgc3RvcmluZyBtdWx0aXBsZQ0KICogc21hbGxlciBkYXRhIGVudHJpZXMgaW4gdGhlIHNhbWUgNC1ieXRlIHJlY29yZCwgZS5nLiwgZm91ciA4LWJpdCB2YWx1ZXMuDQogKiBBIHN0cmluZyByZXF1aXJlcyB0d28gYnl0ZXMsIGFzIHRoZSBzeW1ib2wgdGFibGUgaXMgbGltaXRlZCB0byA2NEsuIFN0b3JpbmcNCiAqIGEgZG91YmxlICglbGYpIHVzZXMgdHdvIHJlY29yZHMsIHNvIHRoaXMgaXMgcXVpdGUgY29zdGx5LiBVc2UgZmxvYXQgKCVmKQ0KICogdW5sZXNzIHRoZSBoaWdoZXIgcHJlY2lzaW9uIGlzIHJlYWxseSBuZWNlc3NhcnkuDQogKg0KICogTm90ZSB0aGF0IHRoZSBkb3VibGUtcHJlY2lzaW9uIGZsb2F0ICglbGYpIGFzc3VtZXMgYSA2NCBiaXQgZG91YmxlDQogKiByZXByZXNlbnRhdGlvbi4gVGhpcyBkb2VzIG5vdCBzZWVtIHRvIGJlIHRoZSBjYXNlIG9uIGUuZy4gUElDMjQgYW5kIFBJQzMyLg0KICogQmVmb3JlIHVzaW5nIGEgJWxmIGFyZ3VtZW50IG9uIGEgMTYtYml0IE1DVSwgcGxlYXNlIHZlcmlmeSB0aGF0DQogKiAic2l6ZW9mKGRvdWJsZSkiIGFjdHVhbGx5IGdpdmVzIDggYXMgZXhwZWN0ZWQuIElmIG5vdCwgdXNlICVmIGluc3RlYWQuDQogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLw0KDQp2b2lkIHZUcmFjZVByaW50Rih0cmFjZUxhYmVsIGV2ZW50TGFiZWwsIGNvbnN0IGNoYXIqIGZvcm1hdFN0ciwgLi4uKQ0Kew0KI2lmIChUUkFDRV9TQ0hFRFVMSU5HX09OTFkgPT0gMCkNCgl2YV9saXN0IHZsOw0KDQoJdmFfc3RhcnQodmwsIGZvcm1hdFN0cik7DQoJdlRyYWNlUHJpbnRGX0hlbHBlcihldmVudExhYmVsLCBmb3JtYXRTdHIsIHZsKTsNCgl2YV9lbmQodmwpOw0KI2VuZGlmIC8qIFRSQUNFX1NDSEVEVUxJTkdfT05MWSAqLw0KfQ0KDQp2b2lkIHZUcmFjZVByaW50Rl9IZWxwZXIodHJhY2VMYWJlbCBldmVudExhYmVsLCBjb25zdCBjaGFyKiBmb3JtYXRTdHIsIHZhX2xpc3QgdmwpDQp7DQojaWYgKFVTRV9TRVBBUkFURV9VU0VSX0VWRU5UX0JVRkZFUiA9PSAwKQ0KCXVpbnQzMl90IG5vT2ZTbG90czsNCglVc2VyRXZlbnQqIHVlMTsNCgl1aW50MzJfdCB0ZW1wRGF0YUJ1ZmZlclsoMyArIE1BWF9BUkdfU0laRSkgLyA0XTsNCglUUkFDRV9TUl9BTExPQ19DUklUSUNBTF9TRUNUSU9OKCk7DQoNCgkvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioNCgkqIFRoZSBhcnJheSB0ZW1wRGF0YUJ1ZmZlciBpcyBhIGxvY2FsIGJ1ZmZlciB1c2VkIGluIGEgdHdvLXBoYXNlIGNvbW1pdCBvZg0KCSogdGhlIGV2ZW50IGRhdGEsIHNpbmNlIGEgdlRyYWNlUHJpbnRGIG1heSBzcGFuIG92ZXIgbXVsdGlwbGUgc2xvdHMgaW4gdGhlDQoJKiBidWZmZXIuDQoJKiBUaGlzIGJ1ZmZlciBjYW4gYmUgbWFkZSBsYXJnZXIsIG9mIGNvdXJzZSwgYnV0IHJlbWVtYmVyIHRoZSByaXNrIGZvcg0KCSogc3RhY2sgb3ZlcmZsb3cuIE5vdGU6IFRoaXMgc2hvdWxkIGJlIGEgTE9DQUwgYnVmZmVyLCBtdXN0IG5vdCBiZSBtYWRlDQoJKiBnbG9iYWwuIFRoYXQgd291bGQgY2F1c2UgZGF0YSBjb3JydXB0aW9uIHdoZW4gdHdvIGNhbGxzIHRvIHZUcmFjZVByaW50Rg0KCSogZnJvbSBkaWZmZXJlbnQgdGFza3Mgb3ZlcmxhcHMgKGludGVycnVwdHMgYXJlIG9ubHkgZGlzYWJsZWQgaW4gYSBzbWFsbA0KCSogcGFydCBvZiB0aGlzIGZ1bmN0aW9uLCBvdGhlcndpc2UgZW5hYmxlZCkNCgkqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovDQoNCglUUkFDRV9BU1NFUlQoZm9ybWF0U3RyICE9IE5VTEwsICJ2VHJhY2VQcmludEY6IGZvcm1hdFN0ciA9PSBOVUxMIiwgKTsNCg0KCXRyY0NSSVRJQ0FMX1NFQ1RJT05fQkVHSU4oKTsNCg0KCWlmIChSZWNvcmRlckRhdGFQdHItPnJlY29yZGVyQWN0aXZlICYmICghIGluRXhjbHVkZWRUYXNrIHx8IG5JU1JhY3RpdmUpICYmIGhhbmRsZV9vZl9sYXN0X2xvZ2dlZF90YXNrKQ0KCXsNCgkJLyogRmlyc3QsIHdyaXRlIHRoZSAicHJpbWFyeSIgdXNlciBldmVudCBlbnRyeSBpbiB0aGUgbG9jYWwgYnVmZmVyLCBidXQNCgkJbGV0IHRoZSBldmVudCB0eXBlIGJlICJFVkVOVF9CRUlOR19XUklUVEVOIiBmb3Igbm93Li4uKi8NCg0KCQl1ZTEgPSAoVXNlckV2ZW50KikoJnRlbXBEYXRhQnVmZmVyWzBdKTsNCg0KCQl1ZTEtPnR5cGUgPSBFVkVOVF9CRUlOR19XUklUVEVOOwkgLyogVXBkYXRlIHRoaXMgYXMgdGhlIGxhc3Qgc3RlcCAqLw0KDQoJCW5vT2ZTbG90cyA9IHBydlRyYWNlVXNlckV2ZW50Rm9ybWF0KGZvcm1hdFN0ciwgdmwsICh1aW50OF90Kil0ZW1wRGF0YUJ1ZmZlciwgNCk7DQoNCgkJLyogU3RvcmUgdGhlIGZvcm1hdCBzdHJpbmcsIHdpdGggYSByZWZlcmVuY2UgdG8gdGhlIGNoYW5uZWwgc3ltYm9sICovDQoJCXVlMS0+cGF5bG9hZCA9IHBydlRyYWNlT3BlblN5bWJvbChmb3JtYXRTdHIsIGV2ZW50TGFiZWwpOw0KDQoJCXVlMS0+ZHRzID0gKHVpbnQ4X3QpcHJ2VHJhY2VHZXREVFMoMHhGRik7DQoNCgkJIC8qIHBydlRyYWNlR2V0RFRTIG1pZ2h0IHN0b3AgdGhlIHJlY29yZGVyIGluIHNvbWUgY2FzZXMuLi4gKi8NCgkJaWYgKFJlY29yZGVyRGF0YVB0ci0+cmVjb3JkZXJBY3RpdmUpDQoJCXsNCg0KCQkJLyogSWYgdGhlIGRhdGEgZG9lcyBub3QgZml0IGluIHRoZSByZW1haW5pbmcgbWFpbiBidWZmZXIsIHdyYXAgYXJvdW5kIHRvDQoJCQkwIGlmIGFsbG93ZWQsIG90aGVyd2lzZSBzdG9wIHRoZSByZWNvcmRlciBhbmQgcXVpdCkuICovDQoJCQlpZiAoUmVjb3JkZXJEYXRhUHRyLT5uZXh0RnJlZUluZGV4ICsgbm9PZlNsb3RzID4gUmVjb3JkZXJEYXRhUHRyLT5tYXhFdmVudHMpDQoJCQl7DQoJCQkJI2lmIChUUkFDRV9SRUNPUkRFUl9TVE9SRV9NT0RFID09IFRSQUNFX1NUT1JFX01PREVfUklOR19CVUZGRVIpDQoJCQkJKHZvaWQpbWVtc2V0KCYgUmVjb3JkZXJEYXRhUHRyLT5ldmVudERhdGFbUmVjb3JkZXJEYXRhUHRyLT5uZXh0RnJlZUluZGV4ICogNF0sDQoJCQkJCQkwLA0KCQkJCQkJKFJlY29yZGVyRGF0YVB0ci0+bWF4RXZlbnRzIC0gUmVjb3JkZXJEYXRhUHRyLT5uZXh0RnJlZUluZGV4KSo0KTsNCgkJCQlSZWNvcmRlckRhdGFQdHItPm5leHRGcmVlSW5kZXggPSAwOw0KCQkJCVJlY29yZGVyRGF0YVB0ci0+YnVmZmVySXNGdWxsID0gMTsNCgkJCQkjZWxzZQ0KDQoJCQkJLyogU3RvcCByZWNvcmRlciwgc2luY2UgdGhlIGV2ZW50IGRhdGEgd2lsbCBub3QgZml0IGluIHRoZQ0KCQkJCWJ1ZmZlciBhbmQgbm90IGNpcmN1bGFyIGJ1ZmZlciBpbiB0aGlzIGNhc2UuLi4gKi8NCgkJCQl2VHJhY2VTdG9wKCk7DQoJCQkJI2VuZGlmDQoJCQl9DQoNCgkJCS8qIENoZWNrIGlmIHJlY29yZGVyIGhhcyBiZWVuIHN0b3BwZWQgKGkuZS4sIHZUcmFjZVN0b3AgYWJvdmUpICovDQoJCQlpZiAoUmVjb3JkZXJEYXRhUHRyLT5yZWNvcmRlckFjdGl2ZSkNCgkJCXsNCgkJCQkvKiBDaGVjayB0aGF0IHRoZSBidWZmZXIgdG8gYmUgb3ZlcndyaXR0ZW4gZG9lcyBub3QgY29udGFpbiBhbnkgdXNlcg0KCQkJCWV2ZW50cyB0aGF0IHdvdWxkIGJlIHBhcnRpYWxseSBvdmVyd3JpdHRlbi4gSWYgc28sIHRoZXkgbXVzdCBiZSAia2lsbGVkIg0KCQkJCWJ5IHJlcGxhY2luZyB0aGUgdXNlciBldmVudCBhbmQgZm9sbG93aW5nIGRhdGEgd2l0aCBOVUxMIGV2ZW50cyAoaS5lLiwNCgkJCQl1c2luZyBhIG1lbXNldCB0byB6ZXJvKS4qLw0KCQkJCSNpZiAoVFJBQ0VfUkVDT1JERVJfU1RPUkVfTU9ERSA9PSBUUkFDRV9TVE9SRV9NT0RFX1JJTkdfQlVGRkVSKQ0KCQkJCXBydkNoZWNrRGF0YVRvQmVPdmVyd3JpdHRlbkZvck11bHRpRW50cnlFdmVudHMoKHVpbnQ4X3Qpbm9PZlNsb3RzKTsNCgkJCQkjZW5kaWYNCgkJCQkvKiBDb3B5IHRoZSBsb2NhbCBidWZmZXIgdG8gdGhlIG1haW4gYnVmZmVyICovDQoJCQkJKHZvaWQpbWVtY3B5KCYgUmVjb3JkZXJEYXRhUHRyLT5ldmVudERhdGFbUmVjb3JkZXJEYXRhUHRyLT5uZXh0RnJlZUluZGV4ICogNF0sDQoJCQkJCQl0ZW1wRGF0YUJ1ZmZlciwNCgkJCQkJCW5vT2ZTbG90cyAqIDQpOw0KDQoJCQkJLyogVXBkYXRlIHRoZSBldmVudCB0eXBlLCBpLmUuLCBudW1iZXIgb2YgZGF0YSBlbnRyaWVzIGZvbGxvd2luZyB0aGUNCgkJCQltYWluIFVTRVJfRVZFTlQgZW50cnkgKE5vdGU6IGltcG9ydGFudCB0aGF0IHRoaXMgaXMgYWZ0ZXIgdGhlIG1lbWNweSwNCgkJCQlidXQgd2l0aGluIHRoZSBjcml0aWNhbCBzZWN0aW9uISkqLw0KCQkJCVJlY29yZGVyRGF0YVB0ci0+ZXZlbnREYXRhW1JlY29yZGVyRGF0YVB0ci0+bmV4dEZyZWVJbmRleCAqIDRdID0NCgkJCQkgKHVpbnQ4X3QpICggVVNFUl9FVkVOVCArIG5vT2ZTbG90cyAtIDEgKTsNCg0KCQkJCS8qIFVwZGF0ZSB0aGUgbWFpbiBidWZmZXIgZXZlbnQgaW5kZXggKGFscmVhZHkgY2hlY2tlZCB0aGF0IGl0IGZpdHMgaW4NCgkJCQl0aGUgYnVmZmVyLCBzbyBubyBuZWVkIHRvIGNoZWNrIGZvciB3cmFwcGluZykqLw0KDQoJCQkJUmVjb3JkZXJEYXRhUHRyLT5uZXh0RnJlZUluZGV4ICs9IG5vT2ZTbG90czsNCgkJCQlSZWNvcmRlckRhdGFQdHItPm51bUV2ZW50cyArPSBub09mU2xvdHM7DQoNCgkJCQlpZiAoUmVjb3JkZXJEYXRhUHRyLT5uZXh0RnJlZUluZGV4ID49IEVWRU5UX0JVRkZFUl9TSVpFKQ0KCQkJCXsNCgkJCQkJI2lmIChUUkFDRV9SRUNPUkRFUl9TVE9SRV9NT0RFID09IFRSQUNFX1NUT1JFX01PREVfUklOR19CVUZGRVIpDQoJCQkJCS8qIFdlIGhhdmUgcmVhY2hlZCB0aGUgZW5kLCBidXQgdGhpcyBpcyBhIHJpbmcgYnVmZmVyLiBTdGFydCBmcm9tIHRoZSBiZWdpbm5pbmcgYWdhaW4uICovDQoJCQkJCVJlY29yZGVyRGF0YVB0ci0+YnVmZmVySXNGdWxsID0gMTsNCgkJCQkJUmVjb3JkZXJEYXRhUHRyLT5uZXh0RnJlZUluZGV4ID0gMDsNCgkJCQkJI2Vsc2UNCgkJCQkJLyogV2UgaGF2ZSByZWFjaGVkIHRoZSBlbmQgc28gd2Ugc3RvcC4gKi8NCgkJCQkJdlRyYWNlU3RvcCgpOw0KCQkJCQkjZW5kaWYNCgkJCQl9DQoJCQl9DQoNCgkJCSNpZiAoVFJBQ0VfUkVDT1JERVJfU1RPUkVfTU9ERSA9PSBUUkFDRV9TVE9SRV9NT0RFX1JJTkdfQlVGRkVSKQ0KCQkJLyogTWFrZSBzdXJlIHRoZSBuZXh0IGVudHJ5IGlzIGNsZWFyZWQgY29ycmVjdGx5ICovDQoJCQlwcnZDaGVja0RhdGFUb0JlT3ZlcndyaXR0ZW5Gb3JNdWx0aUVudHJ5RXZlbnRzKDEpOw0KCQkJI2VuZGlmDQoNCgkJfQ0KCX0NCgl0cmNDUklUSUNBTF9TRUNUSU9OX0VORCgpOw0KDQojZWxpZiAoVVNFX1NFUEFSQVRFX1VTRVJfRVZFTlRfQlVGRkVSID09IDEpDQoJLyogVXNlIHRoZSBzZXBhcmF0ZSB1c2VyIGV2ZW50IGJ1ZmZlciAqLw0KCXRyYWNlTGFiZWwgZm9ybWF0TGFiZWw7DQoJVXNlckV2ZW50Q2hhbm5lbCBjaGFubmVsOw0KDQoJaWYgKFJlY29yZGVyRGF0YVB0ci0+cmVjb3JkZXJBY3RpdmUgJiYgKCEgaW5FeGNsdWRlZFRhc2sgfHwgbklTUmFjdGl2ZSkgJiYgaGFuZGxlX29mX2xhc3RfbG9nZ2VkX3Rhc2spDQoJew0KCQlmb3JtYXRMYWJlbCA9IHhUcmFjZU9wZW5MYWJlbChmb3JtYXRTdHIpOw0KDQoJCWNoYW5uZWwgPSB4VHJhY2VSZWdpc3RlckNoYW5uZWxGb3JtYXQoZXZlbnRMYWJlbCwgZm9ybWF0TGFiZWwpOw0KDQoJCXBydlRyYWNlVXNlckV2ZW50SGVscGVyMShjaGFubmVsLCBldmVudExhYmVsLCBmb3JtYXRMYWJlbCwgdmwpOw0KCX0NCiNlbmRpZg0KfQ0KDQovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqDQogKiB2VHJhY2VVc2VyRXZlbnQNCiAqDQogKiBCYXNpYyB1c2VyIGV2ZW50IChTdGFuZGFyZCBhbmQgUHJvZmVzc2lvbmFsIEVkaXRpb24gb25seSkNCiAqDQogKiBHZW5lcmF0ZXMgYSBVc2VyIEV2ZW50IHdpdGggYSB0ZXh0IGxhYmVsLiBUaGUgbGFiZWwgaXMgY3JlYXRlZC9sb29rZWQgdXANCiAqIGluIHRoZSBzeW1ib2wgdGFibGUgdXNpbmcgeFRyYWNlT3BlbkxhYmVsLg0KICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8NCnZvaWQgdlRyYWNlVXNlckV2ZW50KHRyYWNlTGFiZWwgZXZlbnRMYWJlbCkNCnsNCiNpZiAoVFJBQ0VfU0NIRURVTElOR19PTkxZID09IDApDQojaWYgKFVTRV9TRVBBUkFURV9VU0VSX0VWRU5UX0JVRkZFUiA9PSAwKQ0KCVVzZXJFdmVudCogdWU7DQoJdWludDhfdCBkdHMxOw0KCVRSQUNFX1NSX0FMTE9DX0NSSVRJQ0FMX1NFQ1RJT04oKTsNCg0KCVRSQUNFX0FTU0VSVChldmVudExhYmVsID4gMCwgInZUcmFjZVVzZXJFdmVudDogSW52YWxpZCB2YWx1ZSBmb3IgZXZlbnRMYWJlbCIsICk7DQoNCgl0cmNDUklUSUNBTF9TRUNUSU9OX0JFR0lOKCk7DQoJaWYgKFJlY29yZGVyRGF0YVB0ci0+cmVjb3JkZXJBY3RpdmUgJiYgKCEgaW5FeGNsdWRlZFRhc2sgfHwgbklTUmFjdGl2ZSkgJiYgaGFuZGxlX29mX2xhc3RfbG9nZ2VkX3Rhc2spDQoJew0KCQlkdHMxID0gKHVpbnQ4X3QpcHJ2VHJhY2VHZXREVFMoMHhGRik7DQoJCXVlID0gKFVzZXJFdmVudCopIHhUcmFjZU5leHRGcmVlRXZlbnRCdWZmZXJTbG90KCk7DQoJCWlmICh1ZSAhPSBOVUxMKQ0KCQl7DQoJCQl1ZS0+ZHRzID0gZHRzMTsNCgkJCXVlLT50eXBlID0gVVNFUl9FVkVOVDsNCgkJCXVlLT5wYXlsb2FkID0gZXZlbnRMYWJlbDsNCgkJCXBydlRyYWNlVXBkYXRlQ291bnRlcnMoKTsNCgkJfQ0KCX0NCgl0cmNDUklUSUNBTF9TRUNUSU9OX0VORCgpOw0KDQojZWxpZiAoVVNFX1NFUEFSQVRFX1VTRVJfRVZFTlRfQlVGRkVSID09IDEpDQoJVXNlckV2ZW50Q2hhbm5lbCBjaGFubmVsOw0KCXVpbnQzMl90IG5vT2ZTbG90cyA9IDE7DQoJdWludDMyX3QgdGVtcERhdGFCdWZmZXJbKDMgKyBNQVhfQVJHX1NJWkUpIC8gNF07DQoJaWYgKFJlY29yZGVyRGF0YVB0ci0+cmVjb3JkZXJBY3RpdmUgJiYgKCEgaW5FeGNsdWRlZFRhc2sgfHwgbklTUmFjdGl2ZSkgJiYgaGFuZGxlX29mX2xhc3RfbG9nZ2VkX3Rhc2spDQoJew0KCQljaGFubmVsID0geFRyYWNlUmVnaXN0ZXJDaGFubmVsRm9ybWF0KDAsIGV2ZW50TGFiZWwpOw0KDQoJCWlmIChjaGFubmVsID09IDApDQoJCXsNCgkJCS8qIFdlIGFyZSBkZWFsaW5nIHdpdGggYW4gdW5rbm93biBjaGFubmVsIGZvcm1hdCBwYWlyICovDQoJCQlub09mU2xvdHMrKzsgLyogQWxzbyBuZWVkIHJvb20gZm9yIGNoYW5uZWwgYW5kIGZvcm1hdCAqLw0KCQkJKCh1aW50MTZfdCopdGVtcERhdGFCdWZmZXIpWzJdID0gMDsNCgkJCSgodWludDE2X3QqKXRlbXBEYXRhQnVmZmVyKVszXSA9IGV2ZW50TGFiZWw7DQoJCX0NCg0KCQlwcnZUcmFjZVVzZXJFdmVudEhlbHBlcjIoY2hhbm5lbCwgdGVtcERhdGFCdWZmZXIsIG5vT2ZTbG90cyk7DQoJfQ0KI2VuZGlmDQojZW5kaWYgLyogVFJBQ0VfU0NIRURVTElOR19PTkxZICovDQp9DQoNCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqDQogKiB4VHJhY2VPcGVuTGFiZWwNCiAqDQogKiBDcmVhdGVzIHVzZXIgZXZlbnQgbGFiZWxzIGZvciB1c2VyIGV2ZW50IGNoYW5uZWxzIG9yIGZvciBpbmRpdmlkdWFsIGV2ZW50cy4NCiAqIFVzZXIgZXZlbnRzIGNhbiBiZSB1c2VkIHRvIGxvZyBhcHBsaWNhdGlvbiBldmVudHMgYW5kIGRhdGEgZm9yIGRpc3BsYXkgaW4NCiAqIHRoZSB2aXN1YWxpemF0aW9uIHRvb2wuIEEgdXNlciBldmVudCBpcyBpZGVudGlmaWVkIGJ5IGEgbGFiZWwsIGkuZS4sIGEgc3RyaW5nLA0KICogd2hpY2ggaXMgc3RvcmVkIGluIHRoZSByZWNvcmRlcidzIHN5bWJvbCB0YWJsZS4NCiAqIFdoZW4gbG9nZ2luZyBhIHVzZXIgZXZlbnQsIGEgbnVtZXJpYyBoYW5kbGUgKHJlZmVyZW5jZSkgdG8gdGhpcyBzdHJpbmcgaXMNCiAqIHVzZWQgdG8gaWRlbnRpZnkgdGhlIGV2ZW50LiBUaGlzIGlzIG9idGFpbmVkIGJ5IGNhbGxpbmcNCiAqDQogKgkgeFRyYWNlT3BlbkxhYmVsKCkNCiAqDQogKiB3aGljaCBhZGRzIHRoZSBzdHJpbmcgdG8gdGhlIHN5bWJvbCB0YWJsZSAoaWYgbm90IGFscmVhZHkgcHJlc2VudCkNCiAqIGFuZCByZXR1cm5zIHRoZSBjb3JyZXNwb25kaW5nIGhhbmRsZS4NCiAqDQogKiBUaGlzIGNhbiBiZSB1c2VkIGluIHR3byB3YXlzOg0KICoNCiAqIDEuIFRoZSBoYW5kbGUgaXMgbG9va2VkIHVwIGV2ZXJ5IHRpbWUsIHdoZW4gc3RvcmluZyB0aGUgdXNlciBldmVudC4NCiAqDQogKiBFeGFtcGxlOg0KICoJIHZUcmFjZVVzZXJFdmVudCh4VHJhY2VPcGVuTGFiZWwoIk15VXNlckV2ZW50IikpOw0KICoNCiAqIDIuIFRoZSBsYWJlbCBpcyByZWdpc3RlcmVkIGp1c3Qgb25jZSwgd2l0aCB0aGUgaGFuZGxlIHN0b3JlZCBpbiBhbg0KICogYXBwbGljYXRpb24gdmFyaWFibGUgLSBtdWNoIGxpa2UgdXNpbmcgYSBmaWxlIGhhbmRsZS4NCiAqDQogKiBFeGFtcGxlOg0KICoJIG15RXZlbnRIYW5kbGUgPSB4VHJhY2VPcGVuTGFiZWwoIk15VXNlckV2ZW50Iik7DQogKgkgLi4uDQogKgkgdlRyYWNlVXNlckV2ZW50KG15RXZlbnRIYW5kbGUpOw0KICoNCiAqIFRoZSBzZWNvbmQgb3B0aW9uIGlzIGZhc3RlciBzaW5jZSBubyBsb29rdXAgaXMgcmVxdWlyZWQgb24gZWFjaCBldmVudCwgYW5kDQogKiB0aGVyZWZvcmUgcmVjb21tZW5kZWQgZm9yIHVzZXIgZXZlbnRzIHRoYXQgYXJlIGZyZXF1ZW50bHkNCiAqIGV4ZWN1dGVkIGFuZC9vciBsb2NhdGVkIGluIHRpbWUtY3JpdGljYWwgY29kZS4gVGhlIGxvb2t1cCBvcGVyYXRpb24gaXMNCiAqIGhvd2V2ZXIgZmFpcmx5IGZhc3QgZHVlIHRvIHRoZSBkZXNpZ24gb2YgdGhlIHN5bWJvbCB0YWJsZS4NCiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovDQp0cmFjZUxhYmVsIHhUcmFjZU9wZW5MYWJlbChjb25zdCBjaGFyKiBsYWJlbCkNCnsNCglUUkFDRV9BU1NFUlQobGFiZWwgIT0gTlVMTCwgInhUcmFjZU9wZW5MYWJlbDogbGFiZWwgPT0gTlVMTCIsICh0cmFjZUxhYmVsKTApOw0KDQoJcmV0dXJuIHBydlRyYWNlT3BlblN5bWJvbChsYWJlbCwgMCk7DQp9DQoNCiNlbmRpZg0KDQojZW5kaWYNCg==