LyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovDQovKioqKioqKioqKioqKioqKioqKioqKioqKiBGaWxlIERlc2NyaXB0aW9uICoqKioqKioqKioqKioqKioqKioqKioqKi8NCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLw0KLyogRmlsZSBOYW1lOgkJJFdvcmtmaWxlOiAgIGhteF91cHJhZGVfbnZyYW0uaCAgJA0KICogVmVyc2lvbjoJCQkkUmV2aXNpb246ICAgMS4wICAkDQogKiBPcmlnaW5hbCBBdXRob3I6IFlhbmcgSHl1biBVayAkDQogKiBDdXJyZW50IEF1dGhvcjoJJEF1dGhvcjogaHV5YW5nQGh1bWF4ZGlnaXRhbC5jb20gJA0KICogRGF0ZToJCQkkRGF0ZTogMjAxMS4xMS4wNw0KICogRmlsZSBEZXNjcmlwdGlvbjoJVXBncmFkZSBBUElzDQogKiBNb2R1bGU6DQogKiBSZW1hcmtzOg0KICovDQoNCg0KLyoqDQogKiBAYXV0aG9yIEh5dW51ayBZYW5nKGh1eWFuZ0BodW1heGRpZ2l0YWwuY29tKQ0KICogQGRhdGUgMDcgTm92IDIwMTENCiAqLw0KDQovKioNCiAqIEBub3RlDQogKiBDb3B5cmlnaHQgKEMpIDIwMTEgSHVtYXggQ29ycG9yYXRpb24uIEFsbCBSaWdodHMgUmVzZXJ2ZWQuIDxicj4NCiAqIFRoaXMgc29mdHdhcmUgaXMgdGhlIGNvbmZpZGVudGlhbCBhbmQgcHJvcHJpZXRhcnkgaW5mb3JtYXRpb24NCiAqIG9mIEh1bWF4IENvcnBvcmF0aW9uLiBZb3UgbWF5IG5vdCB1c2Ugb3IgZGlzdHJpYnV0ZSB0aGlzIHNvZnR3YXJlDQogKiBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiBhbnkgYXBwbGljYWJsZSBsaWNlbnNlDQogKiBhZ3JlZW1lbnQgaW4gd3JpdGluZyBiZXR3ZWVuIEh1bWF4IENvcnBvcmF0aW9uIGFuZCB5b3UuDQogKi8NCg0KIC8qQHsqLw0KDQovKioNCiAqIEBmaWxlIGhteF91cGdyYWRlX252cmFtLmgNCiAqLw0KDQovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8NCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqIEhlYWRlciBGaWxlcyoqKioqKioqKioqKioqKioqKioqKioqKioqLw0KLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovDQovKiBTdGFydCBJbmNsdWRpbmcgSGVhZGVyIEZpbGVzICovDQovKiBFbmQgSW5jbHVkaW5nIEhlYWRlcnMqLw0KDQovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8NCi8qKioqKioqKioqKioqKioqKioqKioqKiogRXh0ZXJuIHZhcmlhYmxlcyAqKioqKioqKioqKioqKioqKioqKioqKioqLw0KLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovDQovKiBTdGFydCBFeHRlcm4gdmFyaWFibGVlICovDQoNCi8qIEVuZCBFeHRlcm4gdmFyaWFibGUgKi8NCg0KDQovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8NCi8qKioqKioqKioqKioqKioqKioqKioqKiogTWFjcm8gRGVmaW5pdGlvbiAqKioqKioqKioqKioqKioqKioqKioqKioqLw0KLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovDQovKiBTdGFydCBNYWNybyBkZWZpbml0aW9uICovDQoNCi8qIEVuZCBNYWNybyBkZWZpbml0aW9uICovDQoNCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLw0KLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiB0eXBlZGVmICoqKioqKioqKioqKioqKioqKioqKioqKioqKiovDQovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8NCi8qIFN0YXJ0IHR5cGVkZWYgKi8NCg0KdHlwZWRlZiBlbnVtDQp7DQoJTlZSQU1fT1NEX09OID0gMCwNCglOVlJBTV9PU0RfT0ZGDQp9TlZSQU1fT1NEX0RJU1BMQVlfRTsNCg0KdHlwZWRlZiBlbnVtDQp7DQoJTlZSQU1fRlJPTlRQQU5FTF9ESVNQTEFZX09OID0gMCwNCglOVlJBTV9GUk9OVFBBTkVMX0RJU1BMQVlfT0ZGDQp9TlZSQU1fRlJPTlRQQU5FTF9ESVNQTEFZX0U7DQoNCnR5cGVkZWYgZW51bQ0Kew0KCU5WUkFNX0FTUEVDVF9SQVRJT180XzMgPSAwLA0KCU5WUkFNX0FTUEVDVF9SQVRJT18xNl85DQp9TlZSQU1fQVNQRUNUX1JBVElPX0U7DQoNCnR5cGVkZWYgZW51bQ0Kew0KCU5WUkFNX09UQV9TU1UgPSAxLA0KCU5WUkFNX09UQV9EVEcgPSAyLA0KCU5WUkFNX09UQV9IVU1BWCA9IDMsDQoJTlZSQU1fT1RBX05PUkRJRyA9IDQsDQoJTlZSQU1fT1RBX0ZJTEUgPSA1LA0KCU5WUkFNX09UQV9TS1lEID0gNiwNCglOVlJBTV9PVEFfTUFYDQp9TlZSQU1fT1RBX1RZUEVfRTsNCg0KDQp0eXBlZGVmIGVudW0NCnsNCglOVlJBTV9PVEFfQ0hBTk5FTF9TQVQJCT0gMSwNCglOVlJBTV9PVEFfQ0hBTk5FTF9DQUIJCT0gMiwNCglOVlJBTV9PVEFfQ0hBTk5FTF9URVIJCT0gMywNCglOVlJBTV9PVEFfQ0hBTk5FTF9GTEFTSAkJPSA0LA0KCU5WUkFNX09UQV9DSEFOTkVMX0ZUUAkJPSA1DQp9TlZSQU1fT1RBX0NIQU5ORUxfRTsNCg0KdHlwZWRlZiBlbnVtDQp7DQoJTlZSQU1fUkVTT0xVVElPTl9Vbmtub3duCQkJPTB4MDAwMDAwMDAsDQoJTlZSQU1fUkVTT0xVVElPTl83MjB4MjQwUAkJPTB4MDAwMDAwMDEsDQoJTlZSQU1fUkVTT0xVVElPTl8yODgweDI0MFAJCT0weDAwMDAwMDAyLA0KCU5WUkFNX1JFU09MVVRJT05fNjQweDQ4MFAJCT0weDAwMDAwMDA0LA0KCU5WUkFNX1JFU09MVVRJT05fNzIweDQ4MEkJCT0weDAwMDAwMDA4LA0KCU5WUkFNX1JFU09MVVRJT05fNzIweDQ4MFAJCT0weDAwMDAwMDEwLA0KCU5WUkFNX1JFU09MVVRJT05fMTQ0MHg0ODBQCQk9MHgwMDAwMDAyMCwNCglOVlJBTV9SRVNPTFVUSU9OXzI4ODB4NDgwSQkJPTB4MDAwMDAwNDAsDQoJTlZSQU1fUkVTT0xVVElPTl8yODgweDQ4MFAJCT0weDAwMDAwMDgwLA0KCU5WUkFNX1JFU09MVVRJT05fNzIweDI4OFAJCT0weDAwMDAwMTAwLA0KCU5WUkFNX1JFU09MVVRJT05fMjg4MHgyODhQIAkJPTB4MDAwMDAyMDAsDQoJTlZSQU1fUkVTT0xVVElPTl83MjB4NTc2SQkJPTB4MDAwMDA0MDAsDQoJTlZSQU1fUkVTT0xVVElPTl83MjB4NTc2UAkJPTB4MDAwMDA4MDAsDQoJTlZSQU1fUkVTT0xVVElPTl8xNDQweDU3NlAJCT0weDAwMDAxMDAwLA0KCU5WUkFNX1JFU09MVVRJT05fMjg4MHg1NzZJIAkJPTB4MDAwMDIwMDAsDQoJTlZSQU1fUkVTT0xVVElPTl8yODgweDU3NlAJCT0weDAwMDA0MDAwLA0KCU5WUkFNX1JFU09MVVRJT05fMTA4MHg3MjBQCQk9MHgwMDAwODAwMCwNCglOVlJBTV9SRVNPTFVUSU9OXzEyODB4NzIwUAkJPTB4MDAwMTAwMDAsDQoJTlZSQU1fUkVTT0xVVElPTl8xOTIweDEwODBJCQk9MHgwMDAyMDAwMCwNCglOVlJBTV9SRVNPTFVUSU9OXzE5MjB4MTA4MFAJCT0weDAwMDQwMDAwLA0KCU5WUkFNX1JFU09MVVRJT05fRFVNTVkJCQk9MHgwMDBGRkZGRg0KfSBOVlJBTV9WSURFT19SRVNPTFVUSU9OX0U7DQoNCnR5cGVkZWYgZW51bQ0Kew0KCU5WUkFNX0hETUlfRklFTERfUkFURV9Vbmtub3duCT0weDAwMDAsDQoJTlZSQU1fSERNSV9GSUVMRF9SQVRFXzI0SFoJCT0weDAwMDEsDQoJTlZSQU1fSERNSV9GSUVMRF9SQVRFXzI1SFogCQk9MHgwMDAyLA0KCU5WUkFNX0hETUlfRklFTERfUkFURV8zMEhaIAkJPTB4MDAwNCwNCglOVlJBTV9IRE1JX0ZJRUxEX1JBVEVfNTBIWiAJCT0weDAwMDgsDQoJTlZSQU1fSERNSV9GSUVMRF9SQVRFXzYwSFogCQk9MHgwMDEwLA0KCU5WUkFNX0hETUlfRklFTERfUkFURV8xMDBIWiAJCT0weDAwMjAsDQoJTlZSQU1fSERNSV9GSUVMRF9SQVRFXzEyMEhaIAkJPTB4MDA0MCwNCglOVlJBTV9IRE1JX0ZJRUxEX1JBVEVfMjAwSFoJCT0weDAwODAsDQoJTlZSQU1fSERNSV9GSUVMRF9SQVRFXzI0MEhaCQk9MHgwMTAwLA0KCU5WUkFNX0hETUlfRklFTERfUkFURV9EVU1NWQkJPTB4RkZGRg0KfSBOVlJBTV9IRE1JX1ZJREVPX0ZJRUxEX1JBVEVfRTsNCg0KDQp0eXBlZGVmIGVudW0NCnsNCglOVlJBTV9IRE1JX1ZJREVPX0FSX2VOb0RhdGEgPSAwLA0KCU5WUkFNX0hETUlfVklERU9fQVJfZTRfMywNCglOVlJBTV9IRE1JX1ZJREVPX0FSX2UxNl85DQp9TlZSQU1fSERNSV9WSURFT19BUl9FOw0KDQoNCnR5cGVkZWYgZW51bQ0Kew0KCU5WUkFNX1NDQVJUX09VVFBVVF9DVkJTPTMsDQoJTlZSQU1fU0NBUlRfT1VUUFVUX1JHQiwNCglOVlJBTV9TQ0FSVF9PVVRQVVRfU1ZJREVPLA0KDQoJTlZSQU1fU0NBUlRfTUFYDQp9IE5WUkFNX1NDQVJUX1NFVFRJTkdfVkFMVUU7DQoNCnR5cGVkZWYgZW51bSB0YWdOVlJBTV9GSUVMRA0Kew0KCU5WUkFNX0ZJRUxEX1NZU1RFTV9JRCA9IDAsCQkJCQkvLyB1bnNpZ25lZCBpbnQJCQkJLy8gNAkJCQkvLyBTeXN0ZW0gSWQNCglOVlJBTV9GSUVMRF9TRkxBU0gsDQoJTlZSQU1fRklFTERfU0VSSUFMX05PLA0KCU5WUkFNX0ZJRUxEX01BQ19BRERSLA0KCU5WUkFNX0ZJRUxEX0hEQ1BfS0VZLA0KCU5WUkFNX0ZJRUxEX0RUQ1BfS0VZLA0KCU5WUkFNX0ZJRUxEX0NJX1BMVVNfS0VZLA0KCU5WUkFNX0ZJRUxEX1BBUklOR19EQVRBLA0KCU5WUkFNX0ZJRUxEX1BSSVZBVEUsDQoJTlZSQU1fRklFTERfQ1NDX0tFWSwNCglOVlJBTV9GSUVMRF9DTV9TRVJJQUxfTk8sDQoJTlZSQU1fRklFTERfQ01fTUFDX0FERFIsDQoJTlZSQU1fRklFTERfQ01fTUFDX0FERFJfQU5PVEhFUiwNCglOVlJBTV9GSUVMRF9JUkRFVE9fQkJDQiwNCg0KCU5WUkFNX0ZJRUxEX09UQV9UWVBFMSA9IDB4MTAwLAkJCQkvLyBOVlJBTV9PVEFfVFlQRV9FDQoJTlZSQU1fRklFTERfT1RBX1RZUEUyLCAJCQkJCQkvLyBOVlJBTV9PVEFfVFlQRV9FDQoJTlZSQU1fRklFTERfT1RBX1RZUEUzLAkJCQkJCS8vIE5WUkFNX09UQV9UWVBFX0UNCglOVlJBTV9GSUVMRF9DSF9UWVBFMSwJCQkJCQkvLyBOVlJBTV9PVEFfQ0hBTk5FTF9FDQoJTlZSQU1fRklFTERfQ0hfVFlQRTIsCQkJCQkJLy8gTlZSQU1fT1RBX0NIQU5ORUxfRQ0KCU5WUkFNX0ZJRUxEX0NIX1RZUEUzLAkJCQkJCS8vIE5WUkFNX09UQV9DSEFOTkVMX0UNCglOVlJBTV9GSUVMRF9PVEFfRkxBRzEsCQkJCQkJLy8gTlZSQU1fT1RBX0ZMQUdfRQ0KCU5WUkFNX0ZJRUxEX09UQV9GTEFHMiwJCQkJCQkvLyBOVlJBTV9PVEFfRkxBR19FDQoJTlZSQU1fRklFTERfT1RBX0ZMQUczLAkJCQkJCS8vIE5WUkFNX09UQV9GTEFHX0UNCglOVlJBTV9GSUVMRF9UVU5FUl9JRDEsCQkJCQkJLy8gVHVuZXIgSWQNCglOVlJBTV9GSUVMRF9UVU5FUl9JRDIsCQkJCQkJLy8gVHVuZXIgSWQNCglOVlJBTV9GSUVMRF9UVU5FUl9JRDMsCQkJCQkJLy8gVHVuZXIgSWQNCglOVlJBTV9GSUVMRF9BTlRFTkFfUE9XRVIxLAkJCQkJLy8gRXh0ZXJuYWwgQW50ZW5hIFBvd2VyIGZvciBUZXIsIDA6T2ZmLzE6T24NCglOVlJBTV9GSUVMRF9BTlRFTkFfUE9XRVIyLAkJCQkJLy8gRXh0ZXJuYWwgQW50ZW5hIFBvd2VyIGZvciBUZXIsIDA6T2ZmLzE6T24NCglOVlJBTV9GSUVMRF9BTlRFTkFfUE9XRVIzLAkJCQkJLy8gRXh0ZXJuYWwgQW50ZW5hIFBvd2VyIGZvciBUZXIsIDA6T2ZmLzE6T24NCglOVlJBTV9GSUVMRF9FU19QSUQxLAkJCQkJCQkvLyBFbGVtZW50IFN0cmVhbSBQSUQgZm9yIE9UQQ0KCU5WUkFNX0ZJRUxEX0VTX1BJRDIsCQkJCQkJCS8vIEVsZW1lbnQgU3RyZWFtIFBJRCBmb3IgT1RBDQoJTlZSQU1fRklFTERfRVNfUElEMywJCQkJCQkJLy8gRWxlbWVudCBTdHJlYW0gUElEIGZvciBPVEENCglOVlJBTV9GSUVMRF9UUkFOU0FDVElPTl9JRDEsCQkJCQkvLyBUcmFuc2FjdGlvbiBJZCBmb3IgTm9yZGljIE9UQQ0KCU5WUkFNX0ZJRUxEX1RSQU5TQUNUSU9OX0lEMiwJCQkJCS8vIFRyYW5zYWN0aW9uIElkIGZvciBOb3JkaWMgT1RBDQoJTlZSQU1fRklFTERfVFJBTlNBQ1RJT05fSUQzLAkJCQkJLy8gVHJhbnNhY3Rpb24gSWQgZm9yIE5vcmRpYyBPVEENCglOVlJBTV9GSUVMRF9DSF9JTkZPX1MsCQkJCQkJLy8gRElfQ0hBTk5FTF9QQVJBTQ0KCU5WUkFNX0ZJRUxEX0NIX0lORk9fVCwJCQkJCQkvLyBESV9DSEFOTkVMX1BBUkFNDQoJTlZSQU1fRklFTERfQ0hfSU5GT19DLAkJCQkJCS8vIERJX0NIQU5ORUxfUEFSQU0NCglOVlJBTV9GSUVMRF9ORVRfUE9SVEFMX0lQLAkJCQkJLy8gcG9ydGFsIGlwIGFkZHJlc3MNCglOVlJBTV9GSUVMRF9ORVRfRE9XTl9QQVRILAkJCQkJLy8gTmV0d29yayBEb3dubG9hZCBQYXRoDQoJTlZSQU1fRklFTERfTkVUX0RFVklDRV9JRCwJCQkJCS8vIGV0aGVybmV0IGRldmljZSBpZCAwID0gZXRoMA0KCU5WUkFNX0ZJRUxEX05FVF9JUF9DT05GSUcsCQkJCQkvLyBESENQL01hbnVhbA0KCU5WUkFNX0ZJRUxEX05FVF9JUF9TRVRUSU5HLAkJCQkJLy8gTWFudWFsIElQIHNldHRpbmcNCglOVlJBTV9GSUVMRF9PVEFfRlRQX0lORk8sCQkJCQkvLyBOVlJBTV9GVFBfT1RBX1NFVFRJTkdfVA0KCU5WUkFNX0ZJRUxEX0ZJTEVfU0laRSwJCQkJCQkvLyBmaWxlIHNpemUgb2YgYmFja2dyb3VsZCBvdGENCg0KCU5WUkFNX0ZJRUxEX0xPQURFUl9WRVJTSU9OLAkJCQkJLy8gVmVyc2lvbiBvZiBib290IExvYWRlcg0KCU5WUkFNX0ZJRUxEX0FQUF9WRVJTSU9OLAkJCQkJCS8vIFZlcnNpb24gbnVtYmVyIG9mIEFwcGxpY2F0aW9uDQoJTlZSQU1fRklFTERfT1RBTERSX1ZFUlNJT04sCQkJCQkvLyBWZXJzaW9uIG9mIE9UQSBMb2FkZXINCglOVlJBTV9GSUVMRF9DVVJfT1RBSU1BR0VfVkVSU0lPTiwJCQkvLyBWZXJzaW9uIG51bWJlciBvZiBPVEEgaW1hZ2UNCglOVlJBTV9GSUVMRF9MT0FERVJfVkVSLA0KCU5WUkFNX0ZJRUxEX0FQUF9WRVIsDQoNCglOVlJBTV9GSUVMRF9MQU5HVUFHRSwJCQkJCQkvLyBPU0QgbGFuZ3VhZ2UgY29kZSBpbiBJU08gNjM5IGNvZGUNCglOVlJBTV9GSUVMRF9DT1VOVFJZX0NPREUsCQkJCQkvLyB1bnNpZ25lZCBjaGFyIGFbM10NCglOVlJBTV9GSUVMRF9UVl9TVEFOREFSRCwJCQkJCQkvLyBESV9WSURFT19TRF9TVEFOREFSRA0KCU5WUkFNX0ZJRUxEX1NDQVJUX1JHQiwJCQkJCQkvLyBOVlJBTV9TQ0FSVF9TRVRUSU5HX1ZBTFVFDQoJTlZSQU1fRklFTERfSERfUkVTT1VMVElPTiwJCQkJCS8vIE5WUkFNX1ZJREVPX1JFU09MVVRJT05fRQ0KCU5WUkFNX0ZJRUxEX0ZJRUxEX1JBVEUsCQkJCQkJLy8gTlZSQU1fSERNSV9WSURFT19GSUVMRF9SQVRFX0UNCglOVlJBTV9GSUVMRF9PQURfVkVSU0lPTiwJCQkJCQkvLyBmb3IgTUhFRyA/Pz8NCglOVlJBTV9GSUVMRF9SQ1VfQ1VTVE9NX0NPREUsCQkJCQkvLyBmb3IgUkNVIGN1c3RvbSBjb2RlDQoJTlZSQU1fRklFTERfUkNVX0NVU1RPTV9DT0RFMiwJCQkJLy8gZm9yIGFsdGVybmF0aXZlIFJDVSBjdXN0b20gY29kZQ0KCU5WUkFNX0ZJRUxEX1BBTkVMX0RJU1BMQVksCQkJCQkvLyBESV9PVEFfUEFORUxESVNQTEFZX3QNCglOVlJBTV9GSUVMRF9QQU5FTF9ESU1NSU5HLAkJCQkJLy8gdW5zaWduZWQgY2hhcg0KCU5WUkFNX0ZJRUxEX09TRF9ESVNQTEFZLAkJCQkJCS8vIE5WUkFNX09TRF9ESVNQTEFZX0UNCglOVlJBTV9GSUVMRF9TVEFSVF9CQU5LX0ZMQUcsCQkJCQkvLyC1ziCws8DHIGJhbmvB3yC+7rXwt84gus7GwyDH0iDB9iCw4cGkDQoJTlZSQU1fRklFTERfQ0hFQ0tfVVNCLAkJCQkJCS8vILrOxsMgvcMgVVNCILi2v+7GrsfYvK0gaGRmuKYgsMu758fSwfYguLvB9iCw4cGkDQoJTlZSQU1fRklFTERfQ0hFQ0tfVVNCX0NPVU5ULAkJCQkJLy8gwKcgtb/A2yC9x8bQIL3DILjuILn4IMDnIL3DtbUgx9LB9iBjb3VudLimIMD6wOUNCglOVlJBTV9GSUVMRF9BU1BFQ1RfUkFUSU8sCQkJCQkvLyBOVlJBTV9BU1BFQ1RfUkFUSU9fRQ0KCU5WUkFNX0ZJRUxEX1VTQUdFX0lELAkJCQkJCS8vIGZvciBVUEMgT1RBDQoJTlZSQU1fRklFTERfQklOOEssCQkJCQkJCS8vIGZvciBlZXByb20gZW11bGF0aW9uDQoJTlZSQU1fRklFTERfSVJERVRPX0NQQ0IsCQkJCQkJLy8gZm9yIElSREVUTyBDUENCDQoJTlZSQU1fRklFTERfSVJERVRPX0NQQ0JfRU5DUllQVEVELCAJCQkvLyBmb3IgSVJERVRPIENQQ0IgKGVuY3J5cHRlZCkNCg0KCU5WUkFNX0ZJRUxEX0FDVElWQVRFRF9LRVJORUxfTlVNLCAJCQkvLyBBQ1RJVkFURURfS0VSTkVMX05VTQ0KCU5WUkFNX0ZJRUxEX0FDVElWQVRFRF9ST09URlNfTlVNLCAJCQkvLyBBQ1RJVkFURURfUk9PVEZTX05VTQ0KCU5WUkFNX0ZJRUxEX01URF9UWVBFX0ZPUl9LRVJORUwsIAkJCS8vIE1URF9UWVBFX0ZPUl9LRVJORUwNCglOVlJBTV9GSUVMRF9UWVBFX09GX0ZJTEVTWVNURU0sIAkJCQkvLyBUWVBFX09GX0ZJTEVTWVNURU0NCglOVlJBTV9GSUVMRF9MX1RZUEVfT0ZfRklMRVNZU1RFTSwJCQkJLy8gTGVuZ3RoIFRZUEVfT0ZfRklMRVNZU1RFTQ0KCU5WUkFNX0ZJRUxEX05BTUVfT0ZfQk9BUkQsIAkJCQkJLy8gTkFNRV9PRl9CT0FSRA0KCU5WUkFNX0ZJRUxEX0xfTkFNRV9PRl9CT0FSRCwgCQkJCQkvLyBMZW5ndGggTkFNRV9PRl9CT0FSRA0KDQoNCglOVlJBTV9GSUVMRF9SQVdGUyA9IDB4MTAwMCwNCglOVlJBTV9GSUVMRF9EVU1NWSA9IDB4RkZGRg0KfSBOVlJBTV9GSUVMRF9UOw0KDQp0eXBlZGVmIGVudW0NCnsNCglOVlJBTV9PVEFfRkxBR19OT19PVEEJCQk9IDB4MDAsDQoJTlZSQU1fT1RBX0ZMQUdfREVURUNURUQJCQk9IDB4MDEsDQoJTlZSQU1fT1RBX0ZMQUdfQ09NUExFVEVECQkJPSAweDAyLA0KCU5WUkFNX09UQV9GTEFHX0ZPUkNFX1VQR1JBREUJCT0gMHgwNCwNCglOVlJBTV9PVEFfRkxBR19OQUdSQV9SRUNPVkVSWQk9IDB4MDgsDQoJTlZSQU1fT1RBX0ZMQUdfRE9XTkxPQURJTkcJCT0gMHgxMCwNCglOVlJBTV9PVEFfRkxBR19XUklUSU5HCQkJPSAweDIwLA0KCU5WUkFNX09UQV9GTEFHX0VSUk9SCQkJCT0gMHg4MA0KfSBOVlJBTV9PVEFfRkxBR19FOw0KDQp0eXBlZGVmIHN0cnVjdCBOVlJBTV9ORVRfSVBfU0VUVElOR19UYWcNCnsNCiNkZWZpbmUgTkVUX0FERFJfTEVOR1RIIDQNCgl1bnNpZ25lZCBjaGFyCQlpcFtORVRfQUREUl9MRU5HVEhdOw0KCXVuc2lnbmVkIGNoYXIJCW1hc2tbTkVUX0FERFJfTEVOR1RIXTsNCgl1bnNpZ25lZCBjaGFyIAkJZ2F0ZXdheVtORVRfQUREUl9MRU5HVEhdOw0KCXVuc2lnbmVkIGNoYXIJCWRuc1tORVRfQUREUl9MRU5HVEhdOw0KfSBOVlJBTV9ORVRfSVBfU0VUVElOR19UOw0KDQp0eXBlZGVmIHN0cnVjdCBOVlJBTV9GVFBfT1RBX1NFVFRJTkdfVGFnDQp7DQojZGVmaW5lIE5WUkFNX0ZUUF9VU0VSX0xFTkdUSCAJCTIwDQojZGVmaW5lIE5WUkFNX0ZUUF9QQVNTV0RfTEVOR1RIIAkJMjANCiNkZWZpbmUgTlZSQU1fRlRQX0RJUl9QQVRIX0xFTkdUSCAJMjAwDQojZGVmaW5lIE5WUkFNX0ZUUF9GSUxFX05BTUVfTEVOR1RIIAk1MA0KCXVuc2lnbmVkIGNoYXIJCWFTZXJ2ZXJJcFtORVRfQUREUl9MRU5HVEhdOw0KCXVuc2lnbmVkIGNoYXIgCQlhVXNlck5hbWVbTlZSQU1fRlRQX1VTRVJfTEVOR1RIXTsNCgl1bnNpZ25lZCBjaGFyIAkJYVBhc3N3ZFtOVlJBTV9GVFBfUEFTU1dEX0xFTkdUSF07DQoJdW5zaWduZWQgY2hhciAJCWFEaXJQYXRoW05WUkFNX0ZUUF9ESVJfUEFUSF9MRU5HVEhdOw0KCXVuc2lnbmVkIGNoYXIgCQlhRmlsZU5hbWVbTlZSQU1fRlRQX0ZJTEVfTkFNRV9MRU5HVEhdOw0KfSBOVlJBTV9GVFBfT1RBX1NFVFRJTkdfVDsNCg0KdHlwZWRlZiBlbnVtDQp7DQoJTlZSQU1fSVBfREhDUCA9IDAsDQoJTlZSQU1fSVBfTUFOVUFMDQp9IE5WUkFNX05FVF9JUF9DT05GSUdfRTsNCg0KLyogU3RhcnQgZ2xvYmFsIGZ1bmN0aW9uIHByb3RvdHlwZXMgKi8NCnR5cGVkZWYgZW51bSBITVhfTlZSQU1fUEFSVElUSU9OX2UNCnsNCglITVhfTlZSQU1fUEFSVElUSU9OX1JPLA0KCUhNWF9OVlJBTV9QQVJUSVRJT05fUlcsDQoJSE1YX05WUkFNX1BBUlRJVElPTl9XX1JBV0ZTLA0KCUhNWF9OVlJBTV9QQVJUSVRJT05fTUFYDQp9SE1YX05WUkFNX1BBUlRJVElPTl9FOw0KDQoNCnR5cGVkZWYgZW51bQ0Kew0KCURSVl9PSwkJCT0JMCwNCiAJRFJWX0VSUiwNCg0KCURSVl9FUlJfSU5WQUxJRF9QQVJBTUVURVIsDQoJRFJWX0VSUl9JTklUSUFMSVpBVElPTiwNCglEUlZfRVJSX0VWRU5UX0lOSVRJQUxJWkFUSU9OLA0KCURSVl9FUlJfT1VUT0ZNRU1PUlksDQoJRFJWX0VSUl9FWFRFUk5BTF9FUlJPUg0KDQp9RFJWX0Vycm9yOw0KDQovKiBFbmQgdHlwZWRlZiAqLw0KDQoNCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLw0KLyoqKioqKioqKioqKioqKioqKioqIGdsb2JhbCBmdW5jdGlvbiBwcm90b3R5cGUgKioqKioqKioqKioqKioqKioqKiovDQovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8NCmV4dGVybiBpbnQgSE1YX1VQR1JBREVfTlZSQU1fV3JpdGUodW5zaWduZWQgbG9uZyBvZmZzZXQsIHVuc2lnbmVkIGNoYXIgKiBkYXRhLCB1bnNpZ25lZCBpbnQgc2l6ZSApOw0KZXh0ZXJuIGludCBITVhfVVBHUkFERV9OVlJBTV9SZWFkKHVuc2lnbmVkIGxvbmcgb2Zmc2V0LCB1bnNpZ25lZCBjaGFyICogZGF0YSwgdW5zaWduZWQgaW50IHNpemUgKTsNCg0KDQovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8NCi8qKioqKioqKioqKioqKioqKioqKiBnbG9iYWwgZnVuY3Rpb24gcHJvdG90eXBlICoqKioqKioqKioqKioqKioqKioqLw0KLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovDQpEUlZfRXJyb3IJSE1YX05WUkFNX0luaXQodm9pZCk7DQpEUlZfRXJyb3IJSE1YX05WUkFNX1dyaXRlKEhNWF9OVlJBTV9QQVJUSVRJT05fRSBwYXJ0aXRpb24sIHVuc2lnbmVkIGNoYXIgKnBOYW1lLCB1bnNpZ25lZCBpbnQgb2Zmc2V0LCB1bnNpZ25lZCBjaGFyICpwVmFsdWUsIHVuc2lnbmVkIGludCB1bFNpemUpOw0KRFJWX0Vycm9yCUhNWF9OVlJBTV9SZWFkKEhNWF9OVlJBTV9QQVJUSVRJT05fRSBwYXJ0aXRpb24sIHVuc2lnbmVkIGNoYXIgKnBOYW1lLCB1bnNpZ25lZCBpbnQgb2Zmc2V0LCB1bnNpZ25lZCBjaGFyICpwVmFsdWUsIHVuc2lnbmVkIGludCB1bFNpemUpOw0KRFJWX0Vycm9yCUhNWF9OVlJBTV9HZXRGaWVsZChOVlJBTV9GSUVMRF9UIGZpZWxkLCB1bnNpZ25lZCBpbnQgb2Zmc2V0LCB2b2lkICpkYXRhLCBpbnQgbkRhdGFTaXplKTsNCkRSVl9FcnJvcglITVhfTlZSQU1fU2V0RmllbGQoTlZSQU1fRklFTERfVCBmaWVsZCwgdW5zaWduZWQgaW50IG9mZnNldCwgdm9pZCAqZGF0YSwgaW50IG5EYXRhU2l6ZSk7DQpEUlZfRXJyb3IJSE1YX05WUkFNX0dldExlbmd0aChOVlJBTV9GSUVMRF9UIGZpZWxkLCBpbnQgKnBMZW4pOw0KRFJWX0Vycm9yCUhNWF9OVlJBTV9SZW1vdmUoSE1YX05WUkFNX1BBUlRJVElPTl9FIHBhcnRpdGlvbiwgdW5zaWduZWQgY2hhciAqcE5hbWUpOw0KRFJWX0Vycm9yCUhNWF9OVlJBTV9EaXIodm9pZCk7DQoNCg0KLyogRW5kIGdsb2JhbCBmdW5jdGlvbiBwcm90b3R5cGVzICovDQoNCg0KLypAfSovDQo=