LyoqDQogICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKg0KICAqIEBmaWxlICAgIHN0bTMyZjd4eF9oYWxfcmNjX2V4LmMNCiAgKiBAYXV0aG9yICBNQ0QgQXBwbGljYXRpb24gVGVhbQ0KICAqIEB2ZXJzaW9uIFYxLjAuMA0KICAqIEBkYXRlICAgIDEyLU1heS0yMDE1DQogICogQGJyaWVmICAgRXh0ZW5zaW9uIFJDQyBIQUwgbW9kdWxlIGRyaXZlci4NCiAgKiAgICAgICAgICBUaGlzIGZpbGUgcHJvdmlkZXMgZmlybXdhcmUgZnVuY3Rpb25zIHRvIG1hbmFnZSB0aGUgZm9sbG93aW5nIA0KICAqICAgICAgICAgIGZ1bmN0aW9uYWxpdGllcyBSQ0MgZXh0ZW5zaW9uIHBlcmlwaGVyYWw6DQogICogICAgICAgICAgICsgRXh0ZW5kZWQgUGVyaXBoZXJhbCBDb250cm9sIGZ1bmN0aW9ucw0KICAqICANCiAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqDQogICogQGF0dGVudGlvbg0KICAqDQogICogPGgyPjxjZW50ZXI+JmNvcHk7IENPUFlSSUdIVChjKSAyMDE1IFNUTWljcm9lbGVjdHJvbmljczwvY2VudGVyPjwvaDI+DQogICoNCiAgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQgbW9kaWZpY2F0aW9uLA0KICAqIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlIG1ldDoNCiAgKiAgIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSwNCiAgKiAgICAgIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuDQogICogICAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UsDQogICogICAgICB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZSBkb2N1bWVudGF0aW9uDQogICogICAgICBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4NCiAgKiAgIDMuIE5laXRoZXIgdGhlIG5hbWUgb2YgU1RNaWNyb2VsZWN0cm9uaWNzIG5vciB0aGUgbmFtZXMgb2YgaXRzIGNvbnRyaWJ1dG9ycw0KICAqICAgICAgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlDQogICogICAgICB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4NCiAgKg0KICAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMgIkFTIElTIg0KICAqIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUNCiAgKiBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUNCiAgKiBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUIEhPTERFUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFDQogICogRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwNCiAgKiBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUg0KICAqIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSDQogICogQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwNCiAgKiBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQ0KICAqIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuDQogICoNCiAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqDQogICovIA0KDQovKiBJbmNsdWRlcyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLw0KI2luY2x1ZGUgInN0bTMyZjd4eF9oYWwuaCINCg0KLyoqIEBhZGR0b2dyb3VwIFNUTTMyRjd4eF9IQUxfRHJpdmVyDQogICogQHsNCiAgKi8NCg0KLyoqIEBkZWZncm91cCBSQ0NFeCBSQ0NFeA0KICAqIEBicmllZiBSQ0NFeCBIQUwgbW9kdWxlIGRyaXZlcg0KICAqIEB7DQogICovDQoNCiNpZmRlZiBIQUxfUkNDX01PRFVMRV9FTkFCTEVEDQoNCi8qIFByaXZhdGUgdHlwZWRlZiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovDQovKiBQcml2YXRlIGRlZmluZSAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLw0KLyoqIEBkZWZncm91cCBSQ0NFeF9Qcml2YXRlX0RlZmluZXMgUkNDRXggUHJpdmF0ZSBEZWZpbmVzDQogICogQHsNCiAgKi8NCiAgDQojZGVmaW5lIFBMTEkyU19USU1FT1VUX1ZBTFVFICAgIDEwMCAvKiBUaW1lb3V0IHZhbHVlIGZpeGVkIHRvIDEwMCBtcyAgKi8NCiNkZWZpbmUgUExMU0FJX1RJTUVPVVRfVkFMVUUgICAgMTAwIC8qIFRpbWVvdXQgdmFsdWUgZml4ZWQgdG8gMTAwIG1zICAqLw0KDQovKioNCiAgKiBAfQ0KICAqLw0KLyogUHJpdmF0ZSBtYWNybyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8NCi8qKiBAZGVmZ3JvdXAgUkNDRXhfUHJpdmF0ZV9NYWNyb3MgUkNDRXggUHJpdmF0ZSBNYWNyb3MNCiAqIEB7DQogKi8NCi8qKg0KICAqIEB9DQogICovDQoNCi8qKiBAZGVmZ3JvdXAgUkNDRXhfUHJpdmF0ZV9NYWNyb3MgUkNDRXggUHJpdmF0ZSBNYWNyb3MNCiAqIEB7DQogKi8NCg0KLyoqDQogICogQH0NCiAgKi8NCg0KDQovKiBQcml2YXRlIHZhcmlhYmxlcyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLw0KLyogUHJpdmF0ZSBmdW5jdGlvbiBwcm90b3R5cGVzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8NCi8qIFByaXZhdGUgZnVuY3Rpb25zIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovDQoNCi8qKiBAZGVmZ3JvdXAgUkNDRXhfRXhwb3J0ZWRfRnVuY3Rpb25zIFJDQ0V4IEV4cG9ydGVkIEZ1bmN0aW9ucw0KICAqIEB7DQogICovDQoNCi8qKiBAZGVmZ3JvdXAgUkNDRXhfRXhwb3J0ZWRfRnVuY3Rpb25zX0dyb3VwMSBFeHRlbmRlZCBQZXJpcGhlcmFsIENvbnRyb2wgZnVuY3Rpb25zIA0KICogIEBicmllZiAgRXh0ZW5kZWQgUGVyaXBoZXJhbCBDb250cm9sIGZ1bmN0aW9ucyAgDQogKg0KQHZlcmJhdGltICAgDQogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQ0KICAgICAgICAgICAgICAgICMjIyMjIEV4dGVuZGVkIFBlcmlwaGVyYWwgQ29udHJvbCBmdW5jdGlvbnMgICMjIyMjDQogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAgDQogICAgWy4uXQ0KICAgIFRoaXMgc3Vic2VjdGlvbiBwcm92aWRlcyBhIHNldCBvZiBmdW5jdGlvbnMgYWxsb3dpbmcgdG8gY29udHJvbCB0aGUgUkNDIENsb2NrcyANCiAgICBmcmVxdWVuY2llcy4NCiAgICBbLi5dIA0KICAgIChAKSBJbXBvcnRhbnQgbm90ZTogQ2FyZSBtdXN0IGJlIHRha2VuIHdoZW4gSEFMX1JDQ0V4X1BlcmlwaENMS0NvbmZpZygpIGlzIHVzZWQgdG8NCiAgICAgICAgc2VsZWN0IHRoZSBSVEMgY2xvY2sgc291cmNlOyBpbiB0aGlzIGNhc2UgdGhlIEJhY2t1cCBkb21haW4gd2lsbCBiZSByZXNldCBpbiAgDQogICAgICAgIG9yZGVyIHRvIG1vZGlmeSB0aGUgUlRDIENsb2NrIHNvdXJjZSwgYXMgY29uc2VxdWVuY2UgUlRDIHJlZ2lzdGVycyAoaW5jbHVkaW5nIA0KICAgICAgICB0aGUgYmFja3VwIHJlZ2lzdGVycykgYW5kIFJDQ19CRENSIHJlZ2lzdGVyIHdpbGwgYmUgc2V0IHRvIHRoZWlyIHJlc2V0IHZhbHVlcy4NCiAgICAgIA0KQGVuZHZlcmJhdGltDQogICogQHsNCiAgKi8NCi8qKg0KICAqIEBicmllZiAgSW5pdGlhbGl6ZXMgdGhlIFJDQyBleHRlbmRlZCBwZXJpcGhlcmFscyBjbG9ja3MgYWNjb3JkaW5nIHRvIHRoZSBzcGVjaWZpZWQNCiAgKiAgICAgICAgIHBhcmFtZXRlcnMgaW4gdGhlIFJDQ19QZXJpcGhDTEtJbml0VHlwZURlZi4NCiAgKiBAcGFyYW0gIFBlcmlwaENsa0luaXQ6IHBvaW50ZXIgdG8gYW4gUkNDX1BlcmlwaENMS0luaXRUeXBlRGVmIHN0cnVjdHVyZSB0aGF0DQogICogICAgICAgICBjb250YWlucyB0aGUgY29uZmlndXJhdGlvbiBpbmZvcm1hdGlvbiBmb3IgdGhlIEV4dGVuZGVkIFBlcmlwaGVyYWxzDQogICogICAgICAgICBjbG9ja3MoSTJTLCBTQUksIExUREMgUlRDLCBUSU0sIFVBUlRzLCBVU0FSVHMsIExUUElNLCBTRE1NQy4uLikuDQogICogICAgICAgICANCiAgKiBAbm90ZSAgIENhcmUgbXVzdCBiZSB0YWtlbiB3aGVuIEhBTF9SQ0NFeF9QZXJpcGhDTEtDb25maWcoKSBpcyB1c2VkIHRvIHNlbGVjdCANCiAgKiAgICAgICAgIHRoZSBSVEMgY2xvY2sgc291cmNlOyBpbiB0aGlzIGNhc2UgdGhlIEJhY2t1cCBkb21haW4gd2lsbCBiZSByZXNldCBpbiAgDQogICogICAgICAgICBvcmRlciB0byBtb2RpZnkgdGhlIFJUQyBDbG9jayBzb3VyY2UsIGFzIGNvbnNlcXVlbmNlIFJUQyByZWdpc3RlcnMgKGluY2x1ZGluZyANCiAgKiAgICAgICAgIHRoZSBiYWNrdXAgcmVnaXN0ZXJzKSBhbmQgUkNDX0JEQ1IgcmVnaXN0ZXIgYXJlIHNldCB0byB0aGVpciByZXNldCB2YWx1ZXMuDQogICoNCiAgKiBAcmV0dmFsIEhBTCBzdGF0dXMNCiAgKi8NCkhBTF9TdGF0dXNUeXBlRGVmIEhBTF9SQ0NFeF9QZXJpcGhDTEtDb25maWcoUkNDX1BlcmlwaENMS0luaXRUeXBlRGVmICAqUGVyaXBoQ2xrSW5pdCkNCnsNCiAgdWludDMyX3QgdGlja3N0YXJ0ID0gMDsNCiAgdWludDMyX3QgdG1wcmVnMCA9IDA7DQogIHVpbnQzMl90IHRtcHJlZzEgPSAwOw0KICB1aW50MzJfdCBwbGxpMnN1c2VkID0gMDsNCiAgdWludDMyX3QgcGxsc2FpdXNlZCA9IDA7DQogICAgDQogIC8qIENoZWNrIHRoZSBwYXJhbWV0ZXJzICovDQogIGFzc2VydF9wYXJhbShJU19SQ0NfUEVSSVBIQ0xPQ0soUGVyaXBoQ2xrSW5pdC0+UGVyaXBoQ2xvY2tTZWxlY3Rpb24pKTsNCiAgDQogIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gSTJTIGNvbmZpZ3VyYXRpb24gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovDQogIGlmKCgoUGVyaXBoQ2xrSW5pdC0+UGVyaXBoQ2xvY2tTZWxlY3Rpb24pICYgUkNDX1BFUklQSENMS19JMlMpID09IChSQ0NfUEVSSVBIQ0xLX0kyUykpDQogIHsNCiAgICAvKiBDaGVjayB0aGUgcGFyYW1ldGVycyAqLw0KICAgIGFzc2VydF9wYXJhbShJU19SQ0NfSTJTQ0xLU09VUkNFKFBlcmlwaENsa0luaXQtPkkyc0Nsb2NrU2VsZWN0aW9uKSk7DQogICAgDQogICAgLyogQ29uZmlndXJlIEkyUyBDbG9jayBzb3VyY2UgKi8NCiAgICBfX0hBTF9SQ0NfSTJTX0NPTkZJRyhQZXJpcGhDbGtJbml0LT5JMnNDbG9ja1NlbGVjdGlvbik7DQogICAgDQogICAgLyogRW5hYmxlIHRoZSBQTExJMlMgd2hlbiBpdCdzIHVzZWQgYXMgY2xvY2sgc291cmNlIGZvciBJMlMgKi8NCiAgICBpZihQZXJpcGhDbGtJbml0LT5JMnNDbG9ja1NlbGVjdGlvbiA9PSBSQ0NfSTJTQ0xLU09VUkNFX1BMTEkyUykNCiAgICB7DQogICAgICBwbGxpMnN1c2VkID0gMTsgDQogICAgfQ0KICB9DQogIA0KICAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBTQUkxIGNvbmZpZ3VyYXRpb24gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLw0KICBpZigoKFBlcmlwaENsa0luaXQtPlBlcmlwaENsb2NrU2VsZWN0aW9uKSAmIFJDQ19QRVJJUEhDTEtfU0FJMSkgPT0gKFJDQ19QRVJJUEhDTEtfU0FJMSkpDQogIHsNCiAgICAvKiBDaGVjayB0aGUgcGFyYW1ldGVycyAqLw0KICAgIGFzc2VydF9wYXJhbShJU19SQ0NfU0FJMUNMS1NPVVJDRShQZXJpcGhDbGtJbml0LT5TYWkxQ2xvY2tTZWxlY3Rpb24pKTsNCiAgICANCiAgICAvKiBDb25maWd1cmUgU0FJMSBDbG9jayBzb3VyY2UgKi8NCiAgICBfX0hBTF9SQ0NfU0FJMV9DT05GSUcoUGVyaXBoQ2xrSW5pdC0+U2FpMUNsb2NrU2VsZWN0aW9uKTsNCiAgICAvKiBFbmFibGUgdGhlIFBMTEkyUyB3aGVuIGl0J3MgdXNlZCBhcyBjbG9jayBzb3VyY2UgZm9yIFNBSSAqLw0KICAgIGlmKFBlcmlwaENsa0luaXQtPlNhaTFDbG9ja1NlbGVjdGlvbiA9PSBSQ0NfU0FJMUNMS1NPVVJDRV9QTExJMlMpDQogICAgew0KICAgICAgcGxsaTJzdXNlZCA9IDE7IA0KICAgIH0NCiAgICAvKiBFbmFibGUgdGhlIFBMTFNBSSB3aGVuIGl0J3MgdXNlZCBhcyBjbG9jayBzb3VyY2UgZm9yIFNBSSAqLw0KICAgIGlmKFBlcmlwaENsa0luaXQtPlNhaTFDbG9ja1NlbGVjdGlvbiA9PSBSQ0NfU0FJMUNMS1NPVVJDRV9QTExTQUkpDQogICAgew0KICAgICAgcGxsc2FpdXNlZCA9IDE7IA0KICAgIH0NCiAgfQ0KICANCiAgLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gU0FJMiBjb25maWd1cmF0aW9uIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8NCiAgaWYoKChQZXJpcGhDbGtJbml0LT5QZXJpcGhDbG9ja1NlbGVjdGlvbikgJiBSQ0NfUEVSSVBIQ0xLX1NBSTIpID09IChSQ0NfUEVSSVBIQ0xLX1NBSTIpKQ0KICB7DQogICAgLyogQ2hlY2sgdGhlIHBhcmFtZXRlcnMgKi8NCiAgICBhc3NlcnRfcGFyYW0oSVNfUkNDX1NBSTJDTEtTT1VSQ0UoUGVyaXBoQ2xrSW5pdC0+U2FpMkNsb2NrU2VsZWN0aW9uKSk7DQogICAgDQogICAgLyogQ29uZmlndXJlIFNBSTIgQ2xvY2sgc291cmNlICovDQogICAgX19IQUxfUkNDX1NBSTJfQ09ORklHKFBlcmlwaENsa0luaXQtPlNhaTJDbG9ja1NlbGVjdGlvbik7DQogICAgDQogICAgLyogRW5hYmxlIHRoZSBQTExJMlMgd2hlbiBpdCdzIHVzZWQgYXMgY2xvY2sgc291cmNlIGZvciBTQUkgKi8NCiAgICBpZihQZXJpcGhDbGtJbml0LT5TYWkyQ2xvY2tTZWxlY3Rpb24gPT0gUkNDX1NBSTJDTEtTT1VSQ0VfUExMSTJTKQ0KICAgIHsNCiAgICAgIHBsbGkyc3VzZWQgPSAxOyANCiAgICB9DQogICAgLyogRW5hYmxlIHRoZSBQTExTQUkgd2hlbiBpdCdzIHVzZWQgYXMgY2xvY2sgc291cmNlIGZvciBTQUkgKi8NCiAgICBpZihQZXJpcGhDbGtJbml0LT5TYWkyQ2xvY2tTZWxlY3Rpb24gPT0gUkNDX1NBSTJDTEtTT1VSQ0VfUExMU0FJKQ0KICAgIHsNCiAgICAgIHBsbHNhaXVzZWQgPSAxOyANCiAgICB9DQogIH0NCiAgDQogIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gU1BESUYtUlggQ29uZmlndXJhdGlvbiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovDQogIGlmKCgoUGVyaXBoQ2xrSW5pdC0+UGVyaXBoQ2xvY2tTZWxlY3Rpb24pICYgUkNDX1BFUklQSENMS19TUERJRlJYKSA9PSBSQ0NfUEVSSVBIQ0xLX1NQRElGUlgpDQogIHsgICAgDQogICAgICBwbGxpMnN1c2VkID0gMTsgDQogIH0gIA0KICANCiAgLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gUlRDIGNvbmZpZ3VyYXRpb24gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLw0KICBpZigoKFBlcmlwaENsa0luaXQtPlBlcmlwaENsb2NrU2VsZWN0aW9uKSAmIFJDQ19QRVJJUEhDTEtfUlRDKSA9PSAoUkNDX1BFUklQSENMS19SVEMpKQ0KICB7DQogICAgLyogRW5hYmxlIFBvd2VyIENsb2NrKi8NCiAgICBfX0hBTF9SQ0NfUFdSX0NMS19FTkFCTEUoKTsNCiAgICANCiAgICAvKiBFbmFibGUgd3JpdGUgYWNjZXNzIHRvIEJhY2t1cCBkb21haW4gKi8NCiAgICBQV1ItPkNSMSB8PSBQV1JfQ1IxX0RCUDsNCiAgICANCiAgICAvKiBHZXQgU3RhcnQgVGljayovDQogICAgdGlja3N0YXJ0ID0gSEFMX0dldFRpY2soKTsNCiAgICANCiAgICAvKiBXYWl0IGZvciBCYWNrdXAgZG9tYWluIFdyaXRlIHByb3RlY3Rpb24gZGlzYWJsZSAqLw0KICAgIHdoaWxlKChQV1ItPkNSMSAmIFBXUl9DUjFfREJQKSA9PSBSRVNFVCkNCiAgICB7DQogICAgICBpZigoSEFMX0dldFRpY2soKSAtIHRpY2tzdGFydCkgPiBSQ0NfREJQX1RJTUVPVVRfVkFMVUUpDQogICAgICB7DQogICAgICAgIHJldHVybiBIQUxfVElNRU9VVDsNCiAgICAgIH0gICAgICANCiAgICB9DQogICAgDQogICAgLyogUmVzZXQgdGhlIEJhY2t1cCBkb21haW4gb25seSBpZiB0aGUgUlRDIENsb2NrIHNvdXJjZSBzZWxlY3Rpb24gaXMgbW9kaWZpZWQgKi8gDQogICAgaWYoKFJDQy0+QkRDUiAmIFJDQ19CRENSX1JUQ1NFTCkgIT0gKFBlcmlwaENsa0luaXQtPlJUQ0Nsb2NrU2VsZWN0aW9uICYgUkNDX0JEQ1JfUlRDU0VMKSkNCiAgICB7DQogICAgICAvKiBTdG9yZSB0aGUgY29udGVudCBvZiBCRENSIHJlZ2lzdGVyIGJlZm9yZSB0aGUgcmVzZXQgb2YgQmFja3VwIERvbWFpbiAqLw0KICAgICAgdG1wcmVnMCA9IChSQ0MtPkJEQ1IgJiB+KFJDQ19CRENSX1JUQ1NFTCkpOw0KICAgICAgDQogICAgICAvKiBSVEMgQ2xvY2sgc2VsZWN0aW9uIGNhbiBiZSBjaGFuZ2VkIG9ubHkgaWYgdGhlIEJhY2t1cCBEb21haW4gaXMgcmVzZXQgKi8NCiAgICAgIF9fSEFMX1JDQ19CQUNLVVBSRVNFVF9GT1JDRSgpOw0KICAgICAgX19IQUxfUkNDX0JBQ0tVUFJFU0VUX1JFTEVBU0UoKTsNCiAgICAgIA0KICAgICAgLyogUmVzdG9yZSB0aGUgQ29udGVudCBvZiBCRENSIHJlZ2lzdGVyICovDQogICAgICBSQ0MtPkJEQ1IgPSB0bXByZWcwOw0KICAgIH0NCiAgICANCiAgICAvKiBJZiBMU0UgaXMgc2VsZWN0ZWQgYXMgUlRDIGNsb2NrIHNvdXJjZSwgd2FpdCBmb3IgTFNFIHJlYWN0aXZhdGlvbiAqLw0KICAgIGlmKFBlcmlwaENsa0luaXQtPlJUQ0Nsb2NrU2VsZWN0aW9uID09IFJDQ19SVENDTEtTT1VSQ0VfTFNFKQ0KICAgIHsNCiAgICAgIC8qIEdldCBTdGFydCBUaWNrKi8NCiAgICAgIHRpY2tzdGFydCA9IEhBTF9HZXRUaWNrKCk7DQogICAgIA0KICAgICAgLyogV2FpdCB0aWxsIExTRSBpcyByZWFkeSAqLyAgDQogICAgICB3aGlsZShfX0hBTF9SQ0NfR0VUX0ZMQUcoUkNDX0ZMQUdfTFNFUkRZKSA9PSBSRVNFVCkNCiAgICAgIHsNCiAgICAgICAgaWYoKEhBTF9HZXRUaWNrKCkgLSB0aWNrc3RhcnQgKSA+IFJDQ19MU0VfVElNRU9VVF9WQUxVRSkNCiAgICAgICAgew0KICAgICAgICAgIHJldHVybiBIQUxfVElNRU9VVDsNCiAgICAgICAgfSAgICAgIA0KICAgICAgfSAgDQogICAgfQ0KICAgIF9fSEFMX1JDQ19SVENfQ09ORklHKFBlcmlwaENsa0luaXQtPlJUQ0Nsb2NrU2VsZWN0aW9uKTsgDQogIH0NCiAgLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gVElNIGNvbmZpZ3VyYXRpb24gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLw0KICBpZigoKFBlcmlwaENsa0luaXQtPlBlcmlwaENsb2NrU2VsZWN0aW9uKSAmIFJDQ19QRVJJUEhDTEtfVElNKSA9PSAoUkNDX1BFUklQSENMS19USU0pKQ0KICB7DQogICAgLyogQ2hlY2sgdGhlIHBhcmFtZXRlcnMgKi8NCiAgICBhc3NlcnRfcGFyYW0oSVNfUkNDX1RJTVBSRVMoUGVyaXBoQ2xrSW5pdC0+VElNUHJlc1NlbGVjdGlvbikpOw0KICAgIA0KICAgIC8qIENvbmZpZ3VyZSBUaW1lciBQcmVzY2FsZXIgKi8NCiAgICBfX0hBTF9SQ0NfVElNQ0xLUFJFU0NBTEVSKFBlcmlwaENsa0luaXQtPlRJTVByZXNTZWxlY3Rpb24pOw0KICB9DQogIA0KICAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIEkyQzEgQ29uZmlndXJhdGlvbiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovDQogIGlmKCgoUGVyaXBoQ2xrSW5pdC0+UGVyaXBoQ2xvY2tTZWxlY3Rpb24pICYgUkNDX1BFUklQSENMS19JMkMxKSA9PSBSQ0NfUEVSSVBIQ0xLX0kyQzEpDQogIHsNCiAgICAvKiBDaGVjayB0aGUgcGFyYW1ldGVycyAqLw0KICAgIGFzc2VydF9wYXJhbShJU19SQ0NfSTJDMUNMS1NPVVJDRShQZXJpcGhDbGtJbml0LT5JMmMxQ2xvY2tTZWxlY3Rpb24pKTsNCiAgICANCiAgICAvKiBDb25maWd1cmUgdGhlIEkyQzEgY2xvY2sgc291cmNlICovDQogICAgX19IQUxfUkNDX0kyQzFfQ09ORklHKFBlcmlwaENsa0luaXQtPkkyYzFDbG9ja1NlbGVjdGlvbik7DQogIH0NCiAgDQogIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gSTJDMiBDb25maWd1cmF0aW9uIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8NCiAgaWYoKChQZXJpcGhDbGtJbml0LT5QZXJpcGhDbG9ja1NlbGVjdGlvbikgJiBSQ0NfUEVSSVBIQ0xLX0kyQzIpID09IFJDQ19QRVJJUEhDTEtfSTJDMikNCiAgew0KICAgIC8qIENoZWNrIHRoZSBwYXJhbWV0ZXJzICovDQogICAgYXNzZXJ0X3BhcmFtKElTX1JDQ19JMkMyQ0xLU09VUkNFKFBlcmlwaENsa0luaXQtPkkyYzJDbG9ja1NlbGVjdGlvbikpOw0KICAgIA0KICAgIC8qIENvbmZpZ3VyZSB0aGUgSTJDMiBjbG9jayBzb3VyY2UgKi8NCiAgICBfX0hBTF9SQ0NfSTJDMl9DT05GSUcoUGVyaXBoQ2xrSW5pdC0+STJjMkNsb2NrU2VsZWN0aW9uKTsNCiAgfQ0KICANCiAgLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBJMkMzIENvbmZpZ3VyYXRpb24gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLw0KICBpZigoKFBlcmlwaENsa0luaXQtPlBlcmlwaENsb2NrU2VsZWN0aW9uKSAmIFJDQ19QRVJJUEhDTEtfSTJDMykgPT0gUkNDX1BFUklQSENMS19JMkMzKQ0KICB7DQogICAgLyogQ2hlY2sgdGhlIHBhcmFtZXRlcnMgKi8NCiAgICBhc3NlcnRfcGFyYW0oSVNfUkNDX0kyQzNDTEtTT1VSQ0UoUGVyaXBoQ2xrSW5pdC0+STJjM0Nsb2NrU2VsZWN0aW9uKSk7DQogICAgDQogICAgLyogQ29uZmlndXJlIHRoZSBJMkMzIGNsb2NrIHNvdXJjZSAqLw0KICAgIF9fSEFMX1JDQ19JMkMzX0NPTkZJRyhQZXJpcGhDbGtJbml0LT5JMmMzQ2xvY2tTZWxlY3Rpb24pOw0KICB9DQogICAgDQogIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gSTJDNCBDb25maWd1cmF0aW9uIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8NCiAgaWYoKChQZXJpcGhDbGtJbml0LT5QZXJpcGhDbG9ja1NlbGVjdGlvbikgJiBSQ0NfUEVSSVBIQ0xLX0kyQzQpID09IFJDQ19QRVJJUEhDTEtfSTJDNCkNCiAgew0KICAgIC8qIENoZWNrIHRoZSBwYXJhbWV0ZXJzICovDQogICAgYXNzZXJ0X3BhcmFtKElTX1JDQ19JMkM0Q0xLU09VUkNFKFBlcmlwaENsa0luaXQtPkkyYzRDbG9ja1NlbGVjdGlvbikpOw0KICAgIA0KICAgIC8qIENvbmZpZ3VyZSB0aGUgSTJDNCBjbG9jayBzb3VyY2UgKi8NCiAgICBfX0hBTF9SQ0NfSTJDNF9DT05GSUcoUGVyaXBoQ2xrSW5pdC0+STJjNENsb2NrU2VsZWN0aW9uKTsNCiAgfQ0KDQogIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gVVNBUlQxIENvbmZpZ3VyYXRpb24gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLw0KICBpZigoKFBlcmlwaENsa0luaXQtPlBlcmlwaENsb2NrU2VsZWN0aW9uKSAmIFJDQ19QRVJJUEhDTEtfVVNBUlQxKSA9PSBSQ0NfUEVSSVBIQ0xLX1VTQVJUMSkNCiAgew0KICAgIC8qIENoZWNrIHRoZSBwYXJhbWV0ZXJzICovDQogICAgYXNzZXJ0X3BhcmFtKElTX1JDQ19VU0FSVDFDTEtTT1VSQ0UoUGVyaXBoQ2xrSW5pdC0+VXNhcnQxQ2xvY2tTZWxlY3Rpb24pKTsNCiAgICANCiAgICAvKiBDb25maWd1cmUgdGhlIFVTQVJUMSBjbG9jayBzb3VyY2UgKi8NCiAgICBfX0hBTF9SQ0NfVVNBUlQxX0NPTkZJRyhQZXJpcGhDbGtJbml0LT5Vc2FydDFDbG9ja1NlbGVjdGlvbik7DQogIH0NCg0KICAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIFVTQVJUMiBDb25maWd1cmF0aW9uIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8NCiAgaWYoKChQZXJpcGhDbGtJbml0LT5QZXJpcGhDbG9ja1NlbGVjdGlvbikgJiBSQ0NfUEVSSVBIQ0xLX1VTQVJUMikgPT0gUkNDX1BFUklQSENMS19VU0FSVDIpDQogIHsNCiAgICAvKiBDaGVjayB0aGUgcGFyYW1ldGVycyAqLw0KICAgIGFzc2VydF9wYXJhbShJU19SQ0NfVVNBUlQyQ0xLU09VUkNFKFBlcmlwaENsa0luaXQtPlVzYXJ0MkNsb2NrU2VsZWN0aW9uKSk7DQogICAgDQogICAgLyogQ29uZmlndXJlIHRoZSBVU0FSVDIgY2xvY2sgc291cmNlICovDQogICAgX19IQUxfUkNDX1VTQVJUMl9DT05GSUcoUGVyaXBoQ2xrSW5pdC0+VXNhcnQyQ2xvY2tTZWxlY3Rpb24pOw0KICB9DQoNCiAgLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBVU0FSVDMgQ29uZmlndXJhdGlvbiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovDQogIGlmKCgoUGVyaXBoQ2xrSW5pdC0+UGVyaXBoQ2xvY2tTZWxlY3Rpb24pICYgUkNDX1BFUklQSENMS19VU0FSVDMpID09IFJDQ19QRVJJUEhDTEtfVVNBUlQzKQ0KICB7DQogICAgLyogQ2hlY2sgdGhlIHBhcmFtZXRlcnMgKi8NCiAgICBhc3NlcnRfcGFyYW0oSVNfUkNDX1VTQVJUM0NMS1NPVVJDRShQZXJpcGhDbGtJbml0LT5Vc2FydDNDbG9ja1NlbGVjdGlvbikpOw0KICAgIA0KICAgIC8qIENvbmZpZ3VyZSB0aGUgVVNBUlQzIGNsb2NrIHNvdXJjZSAqLw0KICAgIF9fSEFMX1JDQ19VU0FSVDNfQ09ORklHKFBlcmlwaENsa0luaXQtPlVzYXJ0M0Nsb2NrU2VsZWN0aW9uKTsNCiAgfQ0KDQogIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gVUFSVDQgQ29uZmlndXJhdGlvbiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovDQogIGlmKCgoUGVyaXBoQ2xrSW5pdC0+UGVyaXBoQ2xvY2tTZWxlY3Rpb24pICYgUkNDX1BFUklQSENMS19VQVJUNCkgPT0gUkNDX1BFUklQSENMS19VQVJUNCkNCiAgew0KICAgIC8qIENoZWNrIHRoZSBwYXJhbWV0ZXJzICovDQogICAgYXNzZXJ0X3BhcmFtKElTX1JDQ19VQVJUNENMS1NPVVJDRShQZXJpcGhDbGtJbml0LT5VYXJ0NENsb2NrU2VsZWN0aW9uKSk7DQogICAgDQogICAgLyogQ29uZmlndXJlIHRoZSBVQVJUNCBjbG9jayBzb3VyY2UgKi8NCiAgICBfX0hBTF9SQ0NfVUFSVDRfQ09ORklHKFBlcmlwaENsa0luaXQtPlVhcnQ0Q2xvY2tTZWxlY3Rpb24pOw0KICB9DQoNCiAgLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBVQVJUNSBDb25maWd1cmF0aW9uIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8NCiAgaWYoKChQZXJpcGhDbGtJbml0LT5QZXJpcGhDbG9ja1NlbGVjdGlvbikgJiBSQ0NfUEVSSVBIQ0xLX1VBUlQ1KSA9PSBSQ0NfUEVSSVBIQ0xLX1VBUlQ1KQ0KICB7DQogICAgLyogQ2hlY2sgdGhlIHBhcmFtZXRlcnMgKi8NCiAgICBhc3NlcnRfcGFyYW0oSVNfUkNDX1VBUlQ1Q0xLU09VUkNFKFBlcmlwaENsa0luaXQtPlVhcnQ1Q2xvY2tTZWxlY3Rpb24pKTsNCiAgICANCiAgICAvKiBDb25maWd1cmUgdGhlIFVBUlQ1IGNsb2NrIHNvdXJjZSAqLw0KICAgIF9fSEFMX1JDQ19VQVJUNV9DT05GSUcoUGVyaXBoQ2xrSW5pdC0+VWFydDVDbG9ja1NlbGVjdGlvbik7DQogIH0NCg0KICAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIFVTQVJUNiBDb25maWd1cmF0aW9uIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8NCiAgaWYoKChQZXJpcGhDbGtJbml0LT5QZXJpcGhDbG9ja1NlbGVjdGlvbikgJiBSQ0NfUEVSSVBIQ0xLX1VTQVJUNikgPT0gUkNDX1BFUklQSENMS19VU0FSVDYpDQogIHsNCiAgICAvKiBDaGVjayB0aGUgcGFyYW1ldGVycyAqLw0KICAgIGFzc2VydF9wYXJhbShJU19SQ0NfVVNBUlQ2Q0xLU09VUkNFKFBlcmlwaENsa0luaXQtPlVzYXJ0NkNsb2NrU2VsZWN0aW9uKSk7DQogICAgDQogICAgLyogQ29uZmlndXJlIHRoZSBVU0FSVDYgY2xvY2sgc291cmNlICovDQogICAgX19IQUxfUkNDX1VTQVJUNl9DT05GSUcoUGVyaXBoQ2xrSW5pdC0+VXNhcnQ2Q2xvY2tTZWxlY3Rpb24pOw0KICB9DQoNCiAgLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBVQVJUNyBDb25maWd1cmF0aW9uIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8NCiAgaWYoKChQZXJpcGhDbGtJbml0LT5QZXJpcGhDbG9ja1NlbGVjdGlvbikgJiBSQ0NfUEVSSVBIQ0xLX1VBUlQ3KSA9PSBSQ0NfUEVSSVBIQ0xLX1VBUlQ3KQ0KICB7DQogICAgLyogQ2hlY2sgdGhlIHBhcmFtZXRlcnMgKi8NCiAgICBhc3NlcnRfcGFyYW0oSVNfUkNDX1VBUlQ3Q0xLU09VUkNFKFBlcmlwaENsa0luaXQtPlVhcnQ3Q2xvY2tTZWxlY3Rpb24pKTsNCiAgICANCiAgICAvKiBDb25maWd1cmUgdGhlIFVBUlQ3IGNsb2NrIHNvdXJjZSAqLw0KICAgIF9fSEFMX1JDQ19VQVJUN19DT05GSUcoUGVyaXBoQ2xrSW5pdC0+VWFydDdDbG9ja1NlbGVjdGlvbik7DQogIH0NCg0KICAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIFVBUlQ4IENvbmZpZ3VyYXRpb24gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLw0KICBpZigoKFBlcmlwaENsa0luaXQtPlBlcmlwaENsb2NrU2VsZWN0aW9uKSAmIFJDQ19QRVJJUEhDTEtfVUFSVDgpID09IFJDQ19QRVJJUEhDTEtfVUFSVDgpDQogIHsNCiAgICAvKiBDaGVjayB0aGUgcGFyYW1ldGVycyAqLw0KICAgIGFzc2VydF9wYXJhbShJU19SQ0NfVUFSVDhDTEtTT1VSQ0UoUGVyaXBoQ2xrSW5pdC0+VWFydDhDbG9ja1NlbGVjdGlvbikpOw0KICAgIA0KICAgIC8qIENvbmZpZ3VyZSB0aGUgVUFSVDggY2xvY2sgc291cmNlICovDQogICAgX19IQUxfUkNDX1VBUlQ4X0NPTkZJRyhQZXJpcGhDbGtJbml0LT5VYXJ0OENsb2NrU2VsZWN0aW9uKTsNCiAgfQ0KICANCiAgLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gQ0VDIENvbmZpZ3VyYXRpb24gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLw0KICBpZigoKFBlcmlwaENsa0luaXQtPlBlcmlwaENsb2NrU2VsZWN0aW9uKSAmIFJDQ19QRVJJUEhDTEtfQ0VDKSA9PSBSQ0NfUEVSSVBIQ0xLX0NFQykNCiAgew0KICAgIC8qIENoZWNrIHRoZSBwYXJhbWV0ZXJzICovDQogICAgYXNzZXJ0X3BhcmFtKElTX1JDQ19DRUNDTEtTT1VSQ0UoUGVyaXBoQ2xrSW5pdC0+Q2VjQ2xvY2tTZWxlY3Rpb24pKTsNCiAgICANCiAgICAvKiBDb25maWd1cmUgdGhlIENFQyBjbG9jayBzb3VyY2UgKi8NCiAgICBfX0hBTF9SQ0NfQ0VDX0NPTkZJRyhQZXJpcGhDbGtJbml0LT5DZWNDbG9ja1NlbGVjdGlvbik7DQogIH0NCiAgDQogIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gQ0s0OCBDb25maWd1cmF0aW9uIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8NCiAgaWYoKChQZXJpcGhDbGtJbml0LT5QZXJpcGhDbG9ja1NlbGVjdGlvbikgJiBSQ0NfUEVSSVBIQ0xLX0NMSzQ4KSA9PSBSQ0NfUEVSSVBIQ0xLX0NMSzQ4KQ0KICB7DQogICAgLyogQ2hlY2sgdGhlIHBhcmFtZXRlcnMgKi8NCiAgICBhc3NlcnRfcGFyYW0oSVNfUkNDX0NMSzQ4U09VUkNFKFBlcmlwaENsa0luaXQtPkNsazQ4Q2xvY2tTZWxlY3Rpb24pKTsNCiAgICANCiAgICAvKiBDb25maWd1cmUgdGhlIENMSzQ4IHNvdXJjZSAqLw0KICAgIF9fSEFMX1JDQ19DTEs0OF9DT05GSUcoUGVyaXBoQ2xrSW5pdC0+Q2xrNDhDbG9ja1NlbGVjdGlvbik7DQoNCiAgICAvKiBFbmFibGUgdGhlIFBMTFNBSSB3aGVuIGl0J3MgdXNlZCBhcyBjbG9jayBzb3VyY2UgZm9yIENLNDggKi8NCiAgICBpZihQZXJpcGhDbGtJbml0LT5DbGs0OENsb2NrU2VsZWN0aW9uID09IFJDQ19DTEs0OFNPVVJDRV9QTExTQUlQKQ0KICAgIHsNCiAgICAgIHBsbHNhaXVzZWQgPSAxOyANCiAgICB9DQogIH0NCg0KICAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIExUREMgQ29uZmlndXJhdGlvbiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovDQojaWYgZGVmaW5lZChTVE0zMkY3NTZ4eCkgfHwgZGVmaW5lZChTVE0zMkY3NDZ4eCkNCiAgaWYoKChQZXJpcGhDbGtJbml0LT5QZXJpcGhDbG9ja1NlbGVjdGlvbikgJiBSQ0NfUEVSSVBIQ0xLX0xUREMpID09IFJDQ19QRVJJUEhDTEtfTFREQykNCiAgew0KICAgIHBsbHNhaXVzZWQgPSAxOyANCiAgfQ0KI2VuZGlmIC8qIFNUTTMyRjc1Nnh4IHx8IFNUTTMyRjc0Nnh4ICovDQogIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gTFBUSU0xIENvbmZpZ3VyYXRpb24gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLw0KICBpZigoKFBlcmlwaENsa0luaXQtPlBlcmlwaENsb2NrU2VsZWN0aW9uKSAmIFJDQ19QRVJJUEhDTEtfTFBUSU0xKSA9PSBSQ0NfUEVSSVBIQ0xLX0xQVElNMSkNCiAgew0KICAgIC8qIENoZWNrIHRoZSBwYXJhbWV0ZXJzICovDQogICAgYXNzZXJ0X3BhcmFtKElTX1JDQ19MUFRJTTFDTEsoUGVyaXBoQ2xrSW5pdC0+THB0aW0xQ2xvY2tTZWxlY3Rpb24pKTsNCiAgICANCiAgICAvKiBDb25maWd1cmUgdGhlIExUUElNMSBjbG9jayBzb3VyY2UgKi8NCiAgICBfX0hBTF9SQ0NfTFBUSU0xX0NPTkZJRyhQZXJpcGhDbGtJbml0LT5McHRpbTFDbG9ja1NlbGVjdGlvbik7DQogICB9DQogIA0KICAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gU0RNTUMgQ29uZmlndXJhdGlvbiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLw0KICBpZigoKFBlcmlwaENsa0luaXQtPlBlcmlwaENsb2NrU2VsZWN0aW9uKSAmIFJDQ19QRVJJUEhDTEtfU0RNTUMxKSA9PSBSQ0NfUEVSSVBIQ0xLX1NETU1DMSkNCiAgew0KICAgIC8qIENoZWNrIHRoZSBwYXJhbWV0ZXJzICovDQogICAgYXNzZXJ0X3BhcmFtKElTX1JDQ19TRE1NQzFDTEtTT1VSQ0UoUGVyaXBoQ2xrSW5pdC0+U2RtbWMxQ2xvY2tTZWxlY3Rpb24pKTsNCiAgICANCiAgICAvKiBDb25maWd1cmUgdGhlIFNETU1DMSBjbG9jayBzb3VyY2UgKi8NCiAgICBfX0hBTF9SQ0NfU0RNTUMxX0NPTkZJRyhQZXJpcGhDbGtJbml0LT5TZG1tYzFDbG9ja1NlbGVjdGlvbik7DQogIH0NCg0KICAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIFBMTEkyUyBDb25maWd1cmF0aW9uIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovDQogIC8qIFBMTEkyUyBpcyBjb25maWd1cmVkIHdoZW4gYSBwZXJpcGhlcmFsIHdpbGwgdXNlIGl0IGFzIHNvdXJjZSBjbG9jayA6IFNBSTEsIFNBSTIsIEkyUyBvciBTUERJRi1SWCAqLw0KICBpZigocGxsaTJzdXNlZCA9PSAxKSB8fCAoUGVyaXBoQ2xrSW5pdC0+UGVyaXBoQ2xvY2tTZWxlY3Rpb24gPT0gUkNDX1BFUklQSENMS19QTExJMlMpKQ0KICB7DQogICAgLyogRGlzYWJsZSB0aGUgUExMSTJTICovDQogICAgX19IQUxfUkNDX1BMTEkyU19ESVNBQkxFKCk7ICANCiAgICANCiAgICAvKiBHZXQgU3RhcnQgVGljayovDQogICAgdGlja3N0YXJ0ID0gSEFMX0dldFRpY2soKTsNCiAgICANCiAgICAvKiBXYWl0IHRpbGwgUExMSTJTIGlzIGRpc2FibGVkICovDQogICAgd2hpbGUoX19IQUxfUkNDX0dFVF9GTEFHKFJDQ19GTEFHX1BMTEkyU1JEWSkgICE9IFJFU0VUKQ0KICAgIHsNCiAgICAgIGlmKChIQUxfR2V0VGljaygpIC0gdGlja3N0YXJ0KSA+IFBMTEkyU19USU1FT1VUX1ZBTFVFKQ0KICAgICAgew0KICAgICAgICAvKiByZXR1cm4gaW4gY2FzZSBvZiBUaW1lb3V0IGRldGVjdGVkICovICAgICAgICAgDQogICAgICAgIHJldHVybiBIQUxfVElNRU9VVDsNCiAgICAgIH0NCiAgICB9DQogICAgDQogICAgLyogY2hlY2sgZm9yIGNvbW1vbiBQTExJMlMgUGFyYW1ldGVycyAqLw0KICAgIGFzc2VydF9wYXJhbShJU19SQ0NfUExMSTJTTl9WQUxVRShQZXJpcGhDbGtJbml0LT5QTExJMlMuUExMSTJTTikpOw0KICAgICAgDQogICAgLyotLS0tLS0tLS0tLS0tLS0tLSBJbiBDYXNlIG9mIFBMTEkyUyBpcyBzZWxlY3RlZCBhcyBzb3VyY2UgY2xvY2sgZm9yIEkyUyAtLS0tLS0tLS0tLS0tLS0tLS0tKi8gDQogICAgaWYoKCgoKFBlcmlwaENsa0luaXQtPlBlcmlwaENsb2NrU2VsZWN0aW9uKSAmIFJDQ19QRVJJUEhDTEtfSTJTKSA9PSBSQ0NfUEVSSVBIQ0xLX0kyUykgJiYgKFBlcmlwaENsa0luaXQtPkkyc0Nsb2NrU2VsZWN0aW9uID09IFJDQ19JMlNDTEtTT1VSQ0VfUExMSTJTKSkpDQogICAgew0KICAgICAgLyogY2hlY2sgZm9yIFBhcmFtZXRlcnMgKi8NCiAgICAgIGFzc2VydF9wYXJhbShJU19SQ0NfUExMSTJTUl9WQUxVRShQZXJpcGhDbGtJbml0LT5QTExJMlMuUExMSTJTUikpOw0KICAgIA0KICAgICAgLyogUmVhZCBQTExJMlNQIGFuZCBQTExJMlNRIHZhbHVlIGZyb20gUExMSTJTQ0ZHUiByZWdpc3RlciAodGhpcyB2YWx1ZSBpcyBub3QgbmVlZGVkIGZvciBJMlMgY29uZmlndXJhdGlvbikgKi8NCiAgICAgIHRtcHJlZzAgPSAoKFJDQy0+UExMSTJTQ0ZHUiAmIFJDQ19QTExJMlNDRkdSX1BMTEkyU1ApID4+IFBPU0lUSU9OX1ZBTChSQ0NfUExMSTJTQ0ZHUl9QTExJMlNQKSk7DQogICAgICB0bXByZWcxID0gKChSQ0MtPlBMTEkyU0NGR1IgJiBSQ0NfUExMSTJTQ0ZHUl9QTExJMlNRKSA+PiBQT1NJVElPTl9WQUwoUkNDX1BMTEkyU0NGR1JfUExMSTJTUSkpOw0KICAgICAgLyogQ29uZmlndXJlIHRoZSBQTExJMlMgZGl2aXNpb24gZmFjdG9ycyAqLw0KICAgICAgLyogUExMSTJTX1ZDTyA9IGYoVkNPIGNsb2NrKSA9IGYoUExMSTJTIGNsb2NrIGlucHV0KSDXIChQTExJMlNOL1BMTE0pICovDQogICAgICAvKiBJMlNDTEsgPSBmKFBMTEkyUyBjbG9jayBvdXRwdXQpID0gZihWQ08gY2xvY2spIC8gUExMSTJTUiAqLw0KICAgICAgX19IQUxfUkNDX1BMTEkyU19DT05GSUcoUGVyaXBoQ2xrSW5pdC0+UExMSTJTLlBMTEkyU04gLCB0bXByZWcwLCB0bXByZWcxLCBQZXJpcGhDbGtJbml0LT5QTExJMlMuUExMSTJTUik7DQogICAgfQ0KICAgICAgICANCiAgICAvKi0tLS0tLS0tLS0tLS0tLS0tIEluIENhc2Ugb2YgUExMSTJTIGlzIHNlbGVjdGVkIGFzIHNvdXJjZSBjbG9jayBmb3IgU0FJIC0tLS0tLS0tLS0tLS0tLS0tLS0qLyAgDQogICAgaWYoKCgoKFBlcmlwaENsa0luaXQtPlBlcmlwaENsb2NrU2VsZWN0aW9uKSAmIFJDQ19QRVJJUEhDTEtfU0FJMSkgPT0gUkNDX1BFUklQSENMS19TQUkxKSAmJiAoUGVyaXBoQ2xrSW5pdC0+U2FpMUNsb2NrU2VsZWN0aW9uID09IFJDQ19TQUkxQ0xLU09VUkNFX1BMTEkyUykpIHx8DQogICAgICAgKCgoKFBlcmlwaENsa0luaXQtPlBlcmlwaENsb2NrU2VsZWN0aW9uKSAmIFJDQ19QRVJJUEhDTEtfU0FJMikgPT0gUkNDX1BFUklQSENMS19TQUkyKSAmJiAoUGVyaXBoQ2xrSW5pdC0+U2FpMkNsb2NrU2VsZWN0aW9uID09IFJDQ19TQUkyQ0xLU09VUkNFX1BMTEkyUykpKSANCiAgICB7DQogICAgICAvKiBDaGVjayBmb3IgUExMSTJTIFBhcmFtZXRlcnMgKi8NCiAgICAgIGFzc2VydF9wYXJhbShJU19SQ0NfUExMSTJTUV9WQUxVRShQZXJpcGhDbGtJbml0LT5QTExJMlMuUExMSTJTUSkpOw0KICAgICAgLyogQ2hlY2sgZm9yIFBMTEkyUy9ESVZRIHBhcmFtZXRlcnMgKi8NCiAgICAgIGFzc2VydF9wYXJhbShJU19SQ0NfUExMSTJTX0RJVlFfVkFMVUUoUGVyaXBoQ2xrSW5pdC0+UExMSTJTRGl2USkpOw0KICAgICAgICAgICAgDQogICAgICAvKiBSZWFkIFBMTEkyU1AgYW5kIFBMTEkyU1IgdmFsdWVzIGZyb20gUExMSTJTQ0ZHUiByZWdpc3RlciAodGhpcyB2YWx1ZSBpcyBub3QgbmVlZGVkIGZvciBTQUkgY29uZmlndXJhdGlvbikgKi8NCiAgICAgIHRtcHJlZzAgPSAoKFJDQy0+UExMSTJTQ0ZHUiAmIFJDQ19QTExJMlNDRkdSX1BMTEkyU1ApID4+IFBPU0lUSU9OX1ZBTChSQ0NfUExMSTJTQ0ZHUl9QTExJMlNQKSk7DQogICAgICB0bXByZWcxID0gKChSQ0MtPlBMTEkyU0NGR1IgJiBSQ0NfUExMSTJTQ0ZHUl9QTExJMlNSKSA+PiBQT1NJVElPTl9WQUwoUkNDX1BMTEkyU0NGR1JfUExMSTJTUikpOw0KICAgICAgLyogQ29uZmlndXJlIHRoZSBQTExJMlMgZGl2aXNpb24gZmFjdG9ycyAqLyAgICAgIA0KICAgICAgLyogUExMSTJTX1ZDTyBJbnB1dCAgPSBQTExfU09VUkNFL1BMTE0gKi8NCiAgICAgIC8qIFBMTEkyU19WQ08gT3V0cHV0ID0gUExMSTJTX1ZDTyBJbnB1dCAqIFBMTEkyU04gKi8NCiAgICAgIC8qIFNBSV9DTEsoZmlyc3QgbGV2ZWwpID0gUExMSTJTX1ZDTyBPdXRwdXQvUExMSTJTUSAqLw0KICAgICAgX19IQUxfUkNDX1BMTEkyU19DT05GSUcoUGVyaXBoQ2xrSW5pdC0+UExMSTJTLlBMTEkyU04sIHRtcHJlZzAsIFBlcmlwaENsa0luaXQtPlBMTEkyUy5QTExJMlNRLCB0bXByZWcxKTsNCiAgIA0KICAgICAgLyogU0FJX0NMS194ID0gU0FJX0NMSyhmaXJzdCBsZXZlbCkvUExMSTJTRElWUSAqLyANCiAgICAgIF9fSEFMX1JDQ19QTExJMlNfUExMU0FJQ0xLRElWUV9DT05GSUcoUGVyaXBoQ2xrSW5pdC0+UExMSTJTRGl2USk7ICAgDQogICAgfSAgICAgICAgICANCg0KICAgIC8qLS0tLS0tLS0tLS0tLS0tLS0gSW4gQ2FzZSBvZiBQTExJMlMgaXMgc2VsZWN0ZWQgYXMgc291cmNlIGNsb2NrIGZvciBTUERJRi1SWCAtLS0tLS0tLS0tLS0tLS0tLS0tKi8gIA0KICAgIGlmKCgoUGVyaXBoQ2xrSW5pdC0+UGVyaXBoQ2xvY2tTZWxlY3Rpb24pICYgUkNDX1BFUklQSENMS19TUERJRlJYKSA9PSBSQ0NfUEVSSVBIQ0xLX1NQRElGUlgpDQogICAgew0KICAgICAgLyogY2hlY2sgZm9yIFBhcmFtZXRlcnMgKi8NCiAgICAgIGFzc2VydF9wYXJhbShJU19SQ0NfUExMSTJTUF9WQUxVRShQZXJpcGhDbGtJbml0LT5QTExJMlMuUExMSTJTUCkpOw0KICAgICANCiAgICAgLyogUmVhZCBQTExJMlNSIHZhbHVlIGZyb20gUExMSTJTQ0ZHUiByZWdpc3RlciAodGhpcyB2YWx1ZSBpcyBub3QgbmVlZGVkIGZvciBTUERJRi1SWCBjb25maWd1cmF0aW9uKSAqLw0KICAgICAgdG1wcmVnMCA9ICgoUkNDLT5QTExJMlNDRkdSICYgUkNDX1BMTEkyU0NGR1JfUExMSTJTUSkgPj4gUE9TSVRJT05fVkFMKFJDQ19QTExJMlNDRkdSX1BMTEkyU1EpKTsNCiAgICAgIHRtcHJlZzEgPSAoKFJDQy0+UExMSTJTQ0ZHUiAmIFJDQ19QTExJMlNDRkdSX1BMTEkyU1IpID4+IFBPU0lUSU9OX1ZBTChSQ0NfUExMSTJTQ0ZHUl9QTExJMlNSKSk7DQogICAgICAvKiBDb25maWd1cmUgdGhlIFBMTEkyUyBkaXZpc2lvbiBmYWN0b3JzICovDQogICAgICAvKiBQTExJMlNfVkNPID0gZihWQ08gY2xvY2spID0gZihQTExJMlMgY2xvY2sgaW5wdXQpINcgKFBMTEkyU04vUExMTSkgKi8NCiAgICAgIC8qIFNQRElGQ0xLID0gZihQTExJMlMgY2xvY2sgb3V0cHV0KSA9IGYoVkNPIGNsb2NrKSAvIFBMTEkyU1AgKi8NCiAgICAgIF9fSEFMX1JDQ19QTExJMlNfQ09ORklHKFBlcmlwaENsa0luaXQtPlBMTEkyUy5QTExJMlNOICwgUGVyaXBoQ2xrSW5pdC0+UExMSTJTLlBMTEkyU1AsIHRtcHJlZzAsIHRtcHJlZzEpOw0KICAgIH0gIA0KICAgICAgICAgDQogICAgLyotLS0tLS0tLS0tLS0tLS0tLSBJbiBDYXNlIG9mIFBMTEkyUyBpcyBqdXN0IHNlbGVjdGVkICAtLS0tLS0tLS0tLS0tLS0tLSovICANCiAgICBpZigoUGVyaXBoQ2xrSW5pdC0+UGVyaXBoQ2xvY2tTZWxlY3Rpb24gJiBSQ0NfUEVSSVBIQ0xLX1BMTEkyUykgPT0gUkNDX1BFUklQSENMS19QTExJMlMpDQogICAgew0KICAgICAgLyogQ2hlY2sgZm9yIFBhcmFtZXRlcnMgKi8NCiAgICAgIGFzc2VydF9wYXJhbShJU19SQ0NfUExMSTJTTl9WQUxVRShQZXJpcGhDbGtJbml0LT5QTExJMlMuUExMSTJTTikpOw0KICAgICAgYXNzZXJ0X3BhcmFtKElTX1JDQ19QTExJMlNQX1ZBTFVFKFBlcmlwaENsa0luaXQtPlBMTEkyUy5QTExJMlNQKSk7DQogICAgICBhc3NlcnRfcGFyYW0oSVNfUkNDX1BMTEkyU1JfVkFMVUUoUGVyaXBoQ2xrSW5pdC0+UExMSTJTLlBMTEkyU1IpKTsNCiAgICAgIGFzc2VydF9wYXJhbShJU19SQ0NfUExMSTJTUV9WQUxVRShQZXJpcGhDbGtJbml0LT5QTExJMlMuUExMSTJTUSkpOw0KDQogICAgICAvKiBDb25maWd1cmUgdGhlIFBMTEkyUyBkaXZpc2lvbiBmYWN0b3JzICovDQogICAgICAvKiBQTExJMlNfVkNPID0gZihWQ08gY2xvY2spID0gZihQTExJMlMgY2xvY2sgaW5wdXQpINcgKFBMTEkyU04vUExMSTJTTSkgKi8NCiAgICAgIC8qIFNQRElGUlhDTEsgPSBmKFBMTEkyUyBjbG9jayBvdXRwdXQpID0gZihWQ08gY2xvY2spIC8gUExMSTJTUCAqLw0KICAgICAgX19IQUxfUkNDX1BMTEkyU19DT05GSUcoUGVyaXBoQ2xrSW5pdC0+UExMSTJTLlBMTEkyU04gLCBQZXJpcGhDbGtJbml0LT5QTExJMlMuUExMSTJTUCwgUGVyaXBoQ2xrSW5pdC0+UExMSTJTLlBMTEkyU1EsIFBlcmlwaENsa0luaXQtPlBMTEkyUy5QTExJMlNSKTsNCiAgICB9IA0KICAgIA0KICAgIC8qIEVuYWJsZSB0aGUgUExMSTJTICovDQogICAgX19IQUxfUkNDX1BMTEkyU19FTkFCTEUoKTsNCiAgICANCiAgICAvKiBHZXQgU3RhcnQgVGljayovDQogICAgdGlja3N0YXJ0ID0gSEFMX0dldFRpY2soKTsNCg0KICAgIC8qIFdhaXQgdGlsbCBQTExJMlMgaXMgcmVhZHkgKi8NCiAgICB3aGlsZShfX0hBTF9SQ0NfR0VUX0ZMQUcoUkNDX0ZMQUdfUExMSTJTUkRZKSAgPT0gUkVTRVQpDQogICAgew0KICAgICAgaWYoKEhBTF9HZXRUaWNrKCkgLSB0aWNrc3RhcnQpID4gUExMSTJTX1RJTUVPVVRfVkFMVUUpDQogICAgICB7DQogICAgICAgIC8qIHJldHVybiBpbiBjYXNlIG9mIFRpbWVvdXQgZGV0ZWN0ZWQgKi8gICAgICAgICAgICAgICAgDQogICAgICAgIHJldHVybiBIQUxfVElNRU9VVDsNCiAgICAgIH0NCiAgICB9DQogIH0gDQogIA0KICAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIFBMTFNBSSBDb25maWd1cmF0aW9uIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovDQogIC8qIFBMTFNBSSBpcyBjb25maWd1cmVkIHdoZW4gYSBwZXJpcGhlcmFsIHdpbGwgdXNlIGl0IGFzIHNvdXJjZSBjbG9jayA6IFNBSTEsIFNBSTIsIExUREMgb3IgQ0s0OCAqLw0KICBpZihwbGxzYWl1c2VkID09IDEpDQogIHsNCiAgICAvKiBEaXNhYmxlIFBMTFNBSSBDbG9jayAqLw0KICAgIF9fSEFMX1JDQ19QTExTQUlfRElTQUJMRSgpOyANCiAgICANCiAgICAvKiBHZXQgU3RhcnQgVGljayovDQogICAgdGlja3N0YXJ0ID0gSEFMX0dldFRpY2soKTsNCg0KICAgIC8qIFdhaXQgdGlsbCBQTExTQUkgaXMgZGlzYWJsZWQgKi8NCiAgICB3aGlsZShfX0hBTF9SQ0NfUExMU0FJX0dFVF9GTEFHKCkgIT0gUkVTRVQpDQogICAgew0KICAgICAgaWYoKEhBTF9HZXRUaWNrKCkgLSB0aWNrc3RhcnQpID4gUExMU0FJX1RJTUVPVVRfVkFMVUUpDQogICAgICB7IA0KICAgICAgICAvKiByZXR1cm4gaW4gY2FzZSBvZiBUaW1lb3V0IGRldGVjdGVkICovICAgICAgICANCiAgICAgICAgcmV0dXJuIEhBTF9USU1FT1VUOw0KICAgICAgfQ0KICAgIH0gDQogICAgDQogICAgLyogQ2hlY2sgdGhlIFBMTFNBSSBkaXZpc2lvbiBmYWN0b3JzICovDQogICAgYXNzZXJ0X3BhcmFtKElTX1JDQ19QTExTQUlOX1ZBTFVFKFBlcmlwaENsa0luaXQtPlBMTFNBSS5QTExTQUlOKSk7DQogICAgDQogICAgLyotLS0tLS0tLS0tLS0tLS0tLSBJbiBDYXNlIG9mIFBMTFNBSSBpcyBzZWxlY3RlZCBhcyBzb3VyY2UgY2xvY2sgZm9yIFNBSSAtLS0tLS0tLS0tLS0tLS0tLS0tKi8gIA0KICAgIGlmKCgoKChQZXJpcGhDbGtJbml0LT5QZXJpcGhDbG9ja1NlbGVjdGlvbikgJiBSQ0NfUEVSSVBIQ0xLX1NBSTEpID09IFJDQ19QRVJJUEhDTEtfU0FJMSkgJiYgKFBlcmlwaENsa0luaXQtPlNhaTFDbG9ja1NlbGVjdGlvbiA9PSBSQ0NfU0FJMUNMS1NPVVJDRV9QTExTQUkpKSB8fA0KICAgICAgICgoKChQZXJpcGhDbGtJbml0LT5QZXJpcGhDbG9ja1NlbGVjdGlvbikgJiBSQ0NfUEVSSVBIQ0xLX1NBSTIpID09IFJDQ19QRVJJUEhDTEtfU0FJMikgJiYgKFBlcmlwaENsa0luaXQtPlNhaTJDbG9ja1NlbGVjdGlvbiA9PSBSQ0NfU0FJMkNMS1NPVVJDRV9QTExTQUkpKSkNCiAgICB7DQogICAgICAvKiBjaGVjayBmb3IgUExMU0FJUSBQYXJhbWV0ZXIgKi8NCiAgICAgIGFzc2VydF9wYXJhbShJU19SQ0NfUExMU0FJUV9WQUxVRShQZXJpcGhDbGtJbml0LT5QTExTQUkuUExMU0FJUSkpOw0KICAgICAgLyogY2hlY2sgZm9yIFBMTFNBSS9ESVZRIFBhcmFtZXRlciAqLw0KICAgICAgYXNzZXJ0X3BhcmFtKElTX1JDQ19QTExTQUlfRElWUV9WQUxVRShQZXJpcGhDbGtJbml0LT5QTExTQUlEaXZRKSk7DQogICAgDQogICAgICAvKiBSZWFkIFBMTFNBSVAgdmFsdWUgZnJvbSBQTExTQUlDRkdSIHJlZ2lzdGVyICh0aGlzIHZhbHVlIGlzIG5vdCBuZWVkZWQgZm9yIFNBSSBjb25maWd1cmF0aW9uKSAqLw0KICAgICAgdG1wcmVnMCA9ICgoUkNDLT5QTExTQUlDRkdSICYgUkNDX1BMTFNBSUNGR1JfUExMU0FJUCkgPj4gUE9TSVRJT05fVkFMKFJDQ19QTExTQUlDRkdSX1BMTFNBSVApKTsNCiAgICAgIHRtcHJlZzEgPSAoKFJDQy0+UExMU0FJQ0ZHUiAmIFJDQ19QTExJMlNDRkdSX1BMTEkyU1IpID4+IFBPU0lUSU9OX1ZBTChSQ0NfUExMU0FJQ0ZHUl9QTExTQUlSKSk7DQogICAgICAvKiBQTExTQUlfVkNPIElucHV0ICA9IFBMTF9TT1VSQ0UvUExMTSAqLw0KICAgICAgLyogUExMU0FJX1ZDTyBPdXRwdXQgPSBQTExTQUlfVkNPIElucHV0ICogUExMU0FJTiAqLw0KICAgICAgLyogU0FJX0NMSyhmaXJzdCBsZXZlbCkgPSBQTExTQUlfVkNPIE91dHB1dC9QTExTQUlRICovDQogICAgICBfX0hBTF9SQ0NfUExMU0FJX0NPTkZJRyhQZXJpcGhDbGtJbml0LT5QTExTQUkuUExMU0FJTiAsIHRtcHJlZzAsIFBlcmlwaENsa0luaXQtPlBMTFNBSS5QTExTQUlRLCB0bXByZWcxKTsNCiAgICAgIA0KICAgICAgLyogU0FJX0NMS194ID0gU0FJX0NMSyhmaXJzdCBsZXZlbCkvUExMU0FJRElWUSAqLyANCiAgICAgIF9fSEFMX1JDQ19QTExTQUlfUExMU0FJQ0xLRElWUV9DT05GSUcoUGVyaXBoQ2xrSW5pdC0+UExMU0FJRGl2USk7DQogICAgfSAgICAgICAgICAgDQoNCiAgICAvKi0tLS0tLS0tLS0tLS0tLS0tIEluIENhc2Ugb2YgUExMU0FJIGlzIHNlbGVjdGVkIGFzIHNvdXJjZSBjbG9jayBmb3IgQ0xLNDggLS0tLS0tLS0tLS0tLS0tLS0tLSovICAgDQogICAgLyogSW4gQ2FzZSBvZiBQTExJMlMgaXMgc2VsZWN0ZWQgYXMgc291cmNlIGNsb2NrIGZvciBDSzQ4ICovIA0KICAgIGlmKCgoKFBlcmlwaENsa0luaXQtPlBlcmlwaENsb2NrU2VsZWN0aW9uKSAmIFJDQ19QRVJJUEhDTEtfQ0xLNDgpID09IFJDQ19QRVJJUEhDTEtfQ0xLNDgpICYmIChQZXJpcGhDbGtJbml0LT5DbGs0OENsb2NrU2VsZWN0aW9uID09IFJDQ19DTEs0OFNPVVJDRV9QTExTQUlQKSkNCiAgICB7DQogICAgICAvKiBjaGVjayBmb3IgUGFyYW1ldGVycyAqLw0KICAgICAgYXNzZXJ0X3BhcmFtKElTX1JDQ19QTExTQUlQX1ZBTFVFKFBlcmlwaENsa0luaXQtPlBMTFNBSS5QTExTQUlQKSk7DQogICAgICAvKiBSZWFkIFBMTFNBSVEgYW5kIFBMTFNBSVIgdmFsdWUgZnJvbSBQTExTQUlDRkdSIHJlZ2lzdGVyICh0aGlzIHZhbHVlIGlzIG5vdCBuZWVkZWQgZm9yIENLNDggY29uZmlndXJhdGlvbikgKi8NCiAgICAgIHRtcHJlZzAgPSAoKFJDQy0+UExMU0FJQ0ZHUiAmIFJDQ19QTExTQUlDRkdSX1BMTFNBSVEpID4+IFBPU0lUSU9OX1ZBTChSQ0NfUExMU0FJQ0ZHUl9QTExTQUlRKSk7DQogICAgICB0bXByZWcxID0gKChSQ0MtPlBMTFNBSUNGR1IgJiBSQ0NfUExMU0FJQ0ZHUl9QTExTQUlSKSA+PiBQT1NJVElPTl9WQUwoUkNDX1BMTFNBSUNGR1JfUExMU0FJUikpOw0KICAgICAgDQogICAgICAvKiBDb25maWd1cmUgdGhlIFBMTFNBSSBkaXZpc2lvbiBmYWN0b3JzICovDQogICAgICAvKiBQTExTQUlfVkNPID0gZihWQ08gY2xvY2spID0gZihQTExTQUkgY2xvY2sgaW5wdXQpINcgKFBMTEkyU04vUExMTSkgKi8NCiAgICAgIC8qIDQ4Q0xLID0gZihQTExTQUkgY2xvY2sgb3V0cHV0KSA9IGYoVkNPIGNsb2NrKSAvIFBMTFNBSVAgKi8NCiAgICAgIF9fSEFMX1JDQ19QTExTQUlfQ09ORklHKFBlcmlwaENsa0luaXQtPlBMTFNBSS5QTExTQUlOICwgUGVyaXBoQ2xrSW5pdC0+UExMU0FJLlBMTFNBSVAsIHRtcHJlZzAsIHRtcHJlZzEpOw0KICAgIH0gICAgICAgIA0KDQojaWYgZGVmaW5lZChTVE0zMkY3NTZ4eCkgfHwgZGVmaW5lZChTVE0zMkY3NDZ4eCkNCiAgICAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gTFREQyBjb25maWd1cmF0aW9uIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLw0KICAgIGlmKCgoUGVyaXBoQ2xrSW5pdC0+UGVyaXBoQ2xvY2tTZWxlY3Rpb24pICYgUkNDX1BFUklQSENMS19MVERDKSA9PSAoUkNDX1BFUklQSENMS19MVERDKSkNCiAgICB7DQogICAgICBhc3NlcnRfcGFyYW0oSVNfUkNDX1BMTFNBSVJfVkFMVUUoUGVyaXBoQ2xrSW5pdC0+UExMU0FJLlBMTFNBSVIpKTsNCiAgICAgIGFzc2VydF9wYXJhbShJU19SQ0NfUExMU0FJX0RJVlJfVkFMVUUoUGVyaXBoQ2xrSW5pdC0+UExMU0FJRGl2UikpOw0KICAgICAgDQogICAgICAvKiBSZWFkIFBMTFNBSVAgYW5kIFBMTFNBSVEgdmFsdWUgZnJvbSBQTExTQUlDRkdSIHJlZ2lzdGVyICh0aGVzZSB2YWx1ZSBhcmUgbm90IG5lZWRlZCBmb3IgTFREQyBjb25maWd1cmF0aW9uKSAqLw0KICAgICAgdG1wcmVnMCA9ICgoUkNDLT5QTExTQUlDRkdSICYgUkNDX1BMTFNBSUNGR1JfUExMU0FJUSkgPj4gUE9TSVRJT05fVkFMKFJDQ19QTExTQUlDRkdSX1BMTFNBSVEpKTsNCiAgICAgIHRtcHJlZzEgPSAoKFJDQy0+UExMU0FJQ0ZHUiAmIFJDQ19QTExTQUlDRkdSX1BMTFNBSVApID4+IFBPU0lUSU9OX1ZBTChSQ0NfUExMU0FJQ0ZHUl9QTExTQUlQKSk7DQogICAgICANCiAgICAgIC8qIFBMTFNBSV9WQ08gSW5wdXQgID0gUExMX1NPVVJDRS9QTExNICovDQogICAgICAvKiBQTExTQUlfVkNPIE91dHB1dCA9IFBMTFNBSV9WQ08gSW5wdXQgKiBQTExTQUlOICovDQogICAgICAvKiBMVERDX0NMSyhmaXJzdCBsZXZlbCkgPSBQTExTQUlfVkNPIE91dHB1dC9QTExTQUlSICovDQogICAgICBfX0hBTF9SQ0NfUExMU0FJX0NPTkZJRyhQZXJpcGhDbGtJbml0LT5QTExTQUkuUExMU0FJTiAsIHRtcHJlZzEsIHRtcHJlZzAsIFBlcmlwaENsa0luaXQtPlBMTFNBSS5QTExTQUlSKTsNCiAgICAgIA0KICAgICAgLyogTFREQ19DTEsgPSBMVERDX0NMSyhmaXJzdCBsZXZlbCkvUExMU0FJRElWUiAqLyANCiAgICAgIF9fSEFMX1JDQ19QTExTQUlfUExMU0FJQ0xLRElWUl9DT05GSUcoUGVyaXBoQ2xrSW5pdC0+UExMU0FJRGl2Uik7DQogICAgfSAgICANCiNlbmRpZiAvKiBTVE0zMkY3NTZ4eCB8fCBTVE0zMkY3NDZ4eCAqLyAgDQoNCiAgICAvKiBFbmFibGUgUExMU0FJIENsb2NrICovDQogICAgX19IQUxfUkNDX1BMTFNBSV9FTkFCTEUoKTsNCiAgICANCiAgICAvKiBHZXQgU3RhcnQgVGljayovDQogICAgdGlja3N0YXJ0ID0gSEFMX0dldFRpY2soKTsNCg0KICAgIC8qIFdhaXQgdGlsbCBQTExTQUkgaXMgcmVhZHkgKi8NCiAgICB3aGlsZShfX0hBTF9SQ0NfUExMU0FJX0dFVF9GTEFHKCkgPT0gUkVTRVQpDQogICAgew0KICAgICAgaWYoKEhBTF9HZXRUaWNrKCkgLSB0aWNrc3RhcnQpID4gUExMU0FJX1RJTUVPVVRfVkFMVUUpDQogICAgICB7IA0KICAgICAgICAvKiByZXR1cm4gaW4gY2FzZSBvZiBUaW1lb3V0IGRldGVjdGVkICovICAgICAgICANCiAgICAgICAgcmV0dXJuIEhBTF9USU1FT1VUOw0KICAgICAgfQ0KICAgIH0NCiAgfQ0KICByZXR1cm4gSEFMX09LOw0KfQ0KDQovKioNCiAgKiBAYnJpZWYgIEdldCB0aGUgUkNDX1BlcmlwaENMS0luaXRUeXBlRGVmIGFjY29yZGluZyB0byB0aGUgaW50ZXJuYWwNCiAgKiAgICAgICAgIFJDQyBjb25maWd1cmF0aW9uIHJlZ2lzdGVycy4NCiAgKiBAcGFyYW0gIFBlcmlwaENsa0luaXQ6IHBvaW50ZXIgdG8gdGhlIGNvbmZpZ3VyZWQgUkNDX1BlcmlwaENMS0luaXRUeXBlRGVmIHN0cnVjdHVyZQ0KICAqIEByZXR2YWwgTm9uZQ0KICAqLw0Kdm9pZCBIQUxfUkNDRXhfR2V0UGVyaXBoQ0xLQ29uZmlnKFJDQ19QZXJpcGhDTEtJbml0VHlwZURlZiAgKlBlcmlwaENsa0luaXQpDQp7DQogIHVpbnQzMl90IHRlbXByZWcgPSAwOw0KICANCiAgLyogU2V0IGFsbCBwb3NzaWJsZSB2YWx1ZXMgZm9yIHRoZSBleHRlbmRlZCBjbG9jayB0eXBlIHBhcmFtZXRlci0tLS0tLS0tLS0tLSovDQogIFBlcmlwaENsa0luaXQtPlBlcmlwaENsb2NrU2VsZWN0aW9uID0gUkNDX1BFUklQSENMS19JMlMgICAgICB8IFJDQ19QRVJJUEhDTEtfTFBUSU0xIHxcDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUkNDX1BFUklQSENMS19TQUkxICAgICB8IFJDQ19QRVJJUEhDTEtfU0FJMiAgICAgfFwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBSQ0NfUEVSSVBIQ0xLX1RJTSAgICAgIHwgUkNDX1BFUklQSENMS19SVEMgICAgICB8XA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFJDQ19QRVJJUEhDTEtfQ0VDICAgICAgfCBSQ0NfUEVSSVBIQ0xLX0kyQzQgICAgIHxcDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUkNDX1BFUklQSENMS19JMkMxICAgICB8IFJDQ19QRVJJUEhDTEtfSTJDMiAgICAgfFwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBSQ0NfUEVSSVBIQ0xLX0kyQzMgICAgIHwgUkNDX1BFUklQSENMS19VU0FSVDEgICB8XA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFJDQ19QRVJJUEhDTEtfVVNBUlQyICAgfCBSQ0NfUEVSSVBIQ0xLX1VTQVJUMyAgIHxcDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUkNDX1BFUklQSENMS19VQVJUNCAgICB8IFJDQ19QRVJJUEhDTEtfVUFSVDUgICAgfFwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBSQ0NfUEVSSVBIQ0xLX1VTQVJUNiAgIHwgUkNDX1BFUklQSENMS19VQVJUNyAgICB8XA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFJDQ19QRVJJUEhDTEtfVUFSVDggICAgfCBSQ0NfUEVSSVBIQ0xLX1NETU1DMSAgICB8XA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFJDQ19QRVJJUEhDTEtfQ0xLNDg7ICAgICAgICAgIA0KICANCiAgLyogR2V0IHRoZSBQTExJMlMgQ2xvY2sgY29uZmlndXJhdGlvbiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovDQogIFBlcmlwaENsa0luaXQtPlBMTEkyUy5QTExJMlNOID0gKHVpbnQzMl90KSgoUkNDLT5QTExJMlNDRkdSICYgUkNDX1BMTEkyU0NGR1JfUExMSTJTTikgPj4gUE9TSVRJT05fVkFMKFJDQ19QTExJMlNDRkdSX1BMTEkyU04pKTsNCiAgUGVyaXBoQ2xrSW5pdC0+UExMSTJTLlBMTEkyU1AgPSAodWludDMyX3QpKChSQ0MtPlBMTEkyU0NGR1IgJiBSQ0NfUExMSTJTQ0ZHUl9QTExJMlNQKSA+PiBQT1NJVElPTl9WQUwoUkNDX1BMTEkyU0NGR1JfUExMSTJTUCkpOw0KICBQZXJpcGhDbGtJbml0LT5QTExJMlMuUExMSTJTUSA9ICh1aW50MzJfdCkoKFJDQy0+UExMSTJTQ0ZHUiAmIFJDQ19QTExJMlNDRkdSX1BMTEkyU1EpID4+IFBPU0lUSU9OX1ZBTChSQ0NfUExMSTJTQ0ZHUl9QTExJMlNRKSk7DQogIFBlcmlwaENsa0luaXQtPlBMTEkyUy5QTExJMlNSID0gKHVpbnQzMl90KSgoUkNDLT5QTExJMlNDRkdSICYgUkNDX1BMTEkyU0NGR1JfUExMSTJTUikgPj4gUE9TSVRJT05fVkFMKFJDQ19QTExJMlNDRkdSX1BMTEkyU1IpKTsNCiAgDQogIC8qIEdldCB0aGUgUExMU0FJIENsb2NrIGNvbmZpZ3VyYXRpb24gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLw0KICBQZXJpcGhDbGtJbml0LT5QTExTQUkuUExMU0FJTiA9ICh1aW50MzJfdCkoKFJDQy0+UExMU0FJQ0ZHUiAmIFJDQ19QTExTQUlDRkdSX1BMTFNBSU4pID4+IFBPU0lUSU9OX1ZBTChSQ0NfUExMU0FJQ0ZHUl9QTExTQUlOKSk7DQogIFBlcmlwaENsa0luaXQtPlBMTFNBSS5QTExTQUlQID0gKHVpbnQzMl90KSgoUkNDLT5QTExTQUlDRkdSICYgUkNDX1BMTFNBSUNGR1JfUExMU0FJUCkgPj4gUE9TSVRJT05fVkFMKFJDQ19QTExTQUlDRkdSX1BMTFNBSVApKTsNCiAgUGVyaXBoQ2xrSW5pdC0+UExMU0FJLlBMTFNBSVEgPSAodWludDMyX3QpKChSQ0MtPlBMTFNBSUNGR1IgJiBSQ0NfUExMU0FJQ0ZHUl9QTExTQUlRKSA+PiBQT1NJVElPTl9WQUwoUkNDX1BMTFNBSUNGR1JfUExMU0FJUSkpOyANCiAgUGVyaXBoQ2xrSW5pdC0+UExMU0FJLlBMTFNBSVIgPSAodWludDMyX3QpKChSQ0MtPlBMTFNBSUNGR1IgJiBSQ0NfUExMU0FJQ0ZHUl9QTExTQUlSKSA+PiBQT1NJVElPTl9WQUwoUkNDX1BMTFNBSUNGR1JfUExMU0FJUikpOyANCiAgDQogIC8qIEdldCB0aGUgUExMU0FJL1BMTEkyUyBkaXZpc2lvbiBmYWN0b3JzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLw0KICBQZXJpcGhDbGtJbml0LT5QTExJMlNEaXZRID0gKHVpbnQzMl90KSgoUkNDLT5EQ0tDRkdSMSAmIFJDQ19EQ0tDRkdSMV9QTExJMlNESVZRKSA+PiBQT1NJVElPTl9WQUwoUkNDX0RDS0NGR1IxX1BMTEkyU0RJVlEpKTsNCiAgUGVyaXBoQ2xrSW5pdC0+UExMU0FJRGl2USA9ICh1aW50MzJfdCkoKFJDQy0+RENLQ0ZHUjEgJiBSQ0NfRENLQ0ZHUjFfUExMU0FJRElWUSkgPj4gUE9TSVRJT05fVkFMKFJDQ19EQ0tDRkdSMV9QTExTQUlESVZRKSk7DQogIFBlcmlwaENsa0luaXQtPlBMTFNBSURpdlIgPSAodWludDMyX3QpKChSQ0MtPkRDS0NGR1IxICYgUkNDX0RDS0NGR1IxX1BMTFNBSURJVlIpID4+IFBPU0lUSU9OX1ZBTChSQ0NfRENLQ0ZHUjFfUExMU0FJRElWUikpOw0KDQogIC8qIEdldCB0aGUgU0FJMSBjbG9jayBjb25maWd1cmF0aW9uIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLw0KICBQZXJpcGhDbGtJbml0LT5TYWkxQ2xvY2tTZWxlY3Rpb24gPSBfX0hBTF9SQ0NfR0VUX1NBSTFfU09VUkNFKCk7DQogIA0KICAvKiBHZXQgdGhlIFNBSTIgY2xvY2sgY29uZmlndXJhdGlvbiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8NCiAgUGVyaXBoQ2xrSW5pdC0+U2FpMkNsb2NrU2VsZWN0aW9uID0gX19IQUxfUkNDX0dFVF9TQUkyX1NPVVJDRSgpOw0KICANCiAgLyogR2V0IHRoZSBJMlMgY2xvY2sgY29uZmlndXJhdGlvbiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLw0KICBQZXJpcGhDbGtJbml0LT5JMnNDbG9ja1NlbGVjdGlvbiA9IF9fSEFMX1JDQ19HRVRfSTJTQ0xLU09VUkNFKCk7DQogIA0KICAvKiBHZXQgdGhlIEkyQzEgY2xvY2sgY29uZmlndXJhdGlvbiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLw0KICBQZXJpcGhDbGtJbml0LT5JMmMxQ2xvY2tTZWxlY3Rpb24gPSBfX0hBTF9SQ0NfR0VUX0kyQzFfU09VUkNFKCk7DQogIA0KICAvKiBHZXQgdGhlIEkyQzIgY2xvY2sgY29uZmlndXJhdGlvbiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLw0KICBQZXJpcGhDbGtJbml0LT5JMmMyQ2xvY2tTZWxlY3Rpb24gPSBfX0hBTF9SQ0NfR0VUX0kyQzJfU09VUkNFKCk7DQogIA0KICAvKiBHZXQgdGhlIEkyQzMgY2xvY2sgY29uZmlndXJhdGlvbiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLw0KICBQZXJpcGhDbGtJbml0LT5JMmMzQ2xvY2tTZWxlY3Rpb24gPSBfX0hBTF9SQ0NfR0VUX0kyQzNfU09VUkNFKCk7DQogIA0KICAvKiBHZXQgdGhlIEkyQzQgY2xvY2sgY29uZmlndXJhdGlvbiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLw0KICBQZXJpcGhDbGtJbml0LT5JMmM0Q2xvY2tTZWxlY3Rpb24gPSBfX0hBTF9SQ0NfR0VUX0kyQzRfU09VUkNFKCk7DQogIA0KICAvKiBHZXQgdGhlIFVTQVJUMSBjbG9jayBjb25maWd1cmF0aW9uIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovDQogIFBlcmlwaENsa0luaXQtPlVzYXJ0MUNsb2NrU2VsZWN0aW9uID0gX19IQUxfUkNDX0dFVF9VU0FSVDFfU09VUkNFKCk7DQogIA0KICAvKiBHZXQgdGhlIFVTQVJUMiBjbG9jayBjb25maWd1cmF0aW9uIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovDQogIFBlcmlwaENsa0luaXQtPlVzYXJ0MkNsb2NrU2VsZWN0aW9uID0gX19IQUxfUkNDX0dFVF9VU0FSVDJfU09VUkNFKCk7DQogIA0KICAvKiBHZXQgdGhlIFVTQVJUMyBjbG9jayBjb25maWd1cmF0aW9uIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovDQogIFBlcmlwaENsa0luaXQtPlVzYXJ0M0Nsb2NrU2VsZWN0aW9uID0gX19IQUxfUkNDX0dFVF9VU0FSVDNfU09VUkNFKCk7DQogIA0KICAvKiBHZXQgdGhlIFVBUlQ0IGNsb2NrIGNvbmZpZ3VyYXRpb24gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8NCiAgUGVyaXBoQ2xrSW5pdC0+VWFydDRDbG9ja1NlbGVjdGlvbiA9IF9fSEFMX1JDQ19HRVRfVUFSVDRfU09VUkNFKCk7DQogIA0KICAvKiBHZXQgdGhlIFVBUlQ1IGNsb2NrIGNvbmZpZ3VyYXRpb24gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8NCiAgUGVyaXBoQ2xrSW5pdC0+VWFydDVDbG9ja1NlbGVjdGlvbiA9IF9fSEFMX1JDQ19HRVRfVUFSVDVfU09VUkNFKCk7DQogIA0KICAvKiBHZXQgdGhlIFVTQVJUNiBjbG9jayBjb25maWd1cmF0aW9uIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovDQogIFBlcmlwaENsa0luaXQtPlVzYXJ0NkNsb2NrU2VsZWN0aW9uID0gX19IQUxfUkNDX0dFVF9VU0FSVDZfU09VUkNFKCk7DQogIA0KICAvKiBHZXQgdGhlIFVBUlQ3IGNsb2NrIGNvbmZpZ3VyYXRpb24gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8NCiAgUGVyaXBoQ2xrSW5pdC0+VWFydDdDbG9ja1NlbGVjdGlvbiA9IF9fSEFMX1JDQ19HRVRfVUFSVDdfU09VUkNFKCk7DQogIA0KICAvKiBHZXQgdGhlIFVBUlQ4IGNsb2NrIGNvbmZpZ3VyYXRpb24gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8NCiAgUGVyaXBoQ2xrSW5pdC0+VWFydDhDbG9ja1NlbGVjdGlvbiA9IF9fSEFMX1JDQ19HRVRfVUFSVDhfU09VUkNFKCk7DQogIA0KICAvKiBHZXQgdGhlIExQVElNMSBjbG9jayBjb25maWd1cmF0aW9uIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovDQogIFBlcmlwaENsa0luaXQtPkxwdGltMUNsb2NrU2VsZWN0aW9uID0gX19IQUxfUkNDX0dFVF9MUFRJTTFfU09VUkNFKCk7DQogIA0KICAvKiBHZXQgdGhlIENFQyBjbG9jayBjb25maWd1cmF0aW9uIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8NCiAgUGVyaXBoQ2xrSW5pdC0+Q2VjQ2xvY2tTZWxlY3Rpb24gPSBfX0hBTF9SQ0NfR0VUX0NFQ19TT1VSQ0UoKTsNCiAgDQogIC8qIEdldCB0aGUgQ0s0OCBjbG9jayBjb25maWd1cmF0aW9uIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8NCiAgUGVyaXBoQ2xrSW5pdC0+Q2xrNDhDbG9ja1NlbGVjdGlvbiA9IF9fSEFMX1JDQ19HRVRfQ0xLNDhfU09VUkNFKCk7DQoNCiAgLyogR2V0IHRoZSBTRE1NQyBjbG9jayBjb25maWd1cmF0aW9uIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8NCiAgUGVyaXBoQ2xrSW5pdC0+U2RtbWMxQ2xvY2tTZWxlY3Rpb24gPSBfX0hBTF9SQ0NfR0VUX1NETU1DMV9TT1VSQ0UoKTsNCiAgDQogIC8qIEdldCB0aGUgUlRDIENsb2NrIGNvbmZpZ3VyYXRpb24gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLw0KICB0ZW1wcmVnID0gKFJDQy0+Q0ZHUiAmIFJDQ19DRkdSX1JUQ1BSRSk7DQogIFBlcmlwaENsa0luaXQtPlJUQ0Nsb2NrU2VsZWN0aW9uID0gKHVpbnQzMl90KSgodGVtcHJlZykgfCAoUkNDLT5CRENSICYgUkNDX0JEQ1JfUlRDU0VMKSk7DQogIA0KICAvKiBHZXQgdGhlIFRJTSBQcmVzY2FsZXIgY29uZmlndXJhdGlvbiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovDQogIGlmICgoUkNDLT5EQ0tDRkdSMSAmIFJDQ19EQ0tDRkdSMV9USU1QUkUpID09IFJFU0VUKQ0KICB7DQogICAgUGVyaXBoQ2xrSW5pdC0+VElNUHJlc1NlbGVjdGlvbiA9IFJDQ19USU1QUkVTX0RFU0FDVElWQVRFRDsNCiAgfQ0KICBlbHNlDQogIHsNCiAgICBQZXJpcGhDbGtJbml0LT5USU1QcmVzU2VsZWN0aW9uID0gUkNDX1RJTVBSRVNfQUNUSVZBVEVEOw0KICB9DQp9DQoNCi8qKg0KICAqIEBicmllZiAgUmV0dXJuIHRoZSBwZXJpcGhlcmFsIGNsb2NrIGZyZXF1ZW5jeSBmb3IgYSBnaXZlbiBwZXJpcGhlcmFsKFNBSS4uKSANCiAgKiBAbm90ZSAgIFJldHVybiAwIGlmIHBlcmlwaGVyYWwgY2xvY2sgaWRlbnRpZmllciBub3QgbWFuYWdlZCBieSB0aGlzIEFQSQ0KICAqIEBwYXJhbSAgUGVyaXBoQ2xrOiBQZXJpcGhlcmFsIGNsb2NrIGlkZW50aWZpZXINCiAgKiAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6DQogICogICAgICAgICAgICBAYXJnIFJDQ19QRVJJUEhDTEtfU0FJMTogU0FJMSBwZXJpcGhlcmFsIGNsb2NrDQogICogICAgICAgICAgICBAYXJnIFJDQ19QRVJJUEhDTEtfU0FJMjogU0FJMiBwZXJpcGhlcmFsIGNsb2NrDQogICogQHJldHZhbCBGcmVxdWVuY3kgaW4gS0h6DQogICovDQp1aW50MzJfdCBIQUxfUkNDRXhfR2V0UGVyaXBoQ0xLRnJlcSh1aW50MzJfdCBQZXJpcGhDbGspDQp7DQogIHVpbnQzMl90IHRtcHJlZyA9IDA7DQogIC8qIFRoaXMgdmFyaWFibGUgdXNlZCB0byBzdG9yZSB0aGUgU0FJIGNsb2NrIGZyZXF1ZW5jeSAodmFsdWUgaW4gSHopICovDQogIHVpbnQzMl90IGZyZXF1ZW5jeSA9IDA7DQogIC8qIFRoaXMgdmFyaWFibGUgdXNlZCB0byBzdG9yZSB0aGUgVkNPIElucHV0ICh2YWx1ZSBpbiBIeikgKi8NCiAgdWludDMyX3QgdmNvaW5wdXQgPSAwOw0KICAvKiBUaGlzIHZhcmlhYmxlIHVzZWQgdG8gc3RvcmUgdGhlIFNBSSBjbG9jayBzb3VyY2UgKi8NCiAgdWludDMyX3Qgc2FpY2xvY2tzb3VyY2UgPSAwOw0KICBpZiAoKFBlcmlwaENsayA9PSBSQ0NfUEVSSVBIQ0xLX1NBSTEpIHx8IChQZXJpcGhDbGsgPT0gUkNDX1BFUklQSENMS19TQUkyKSkNCiAgew0KICAgIHNhaWNsb2Nrc291cmNlID0gUkNDLT5EQ0tDRkdSMTsgICANCiAgICBzYWljbG9ja3NvdXJjZSAmPSAoUkNDX0RDS0NGR1IxX1NBSTFTRUwgfCBSQ0NfRENLQ0ZHUjFfU0FJMlNFTCk7DQogICAgc3dpdGNoIChzYWljbG9ja3NvdXJjZSkNCiAgICB7DQogICAgY2FzZSAwOiAvKiBQTExTQUkgaXMgdGhlIGNsb2NrIHNvdXJjZSBmb3IgU0FJKi8gDQogICAgICB7DQogICAgICAgIC8qIENvbmZpZ3VyZSB0aGUgUExMU0FJIGRpdmlzaW9uIGZhY3RvciAqLw0KICAgICAgICAvKiBQTExTQUlfVkNPIElucHV0ICA9IFBMTF9TT1VSQ0UvUExMTSAqLyANCiAgICAgICAgaWYoKFJDQy0+UExMQ0ZHUiAmIFJDQ19QTExDRkdSX1BMTFNSQykgPT0gUkNDX1BMTFNPVVJDRV9IU0kpDQogICAgICAgIHsNCiAgICAgICAgICAvKiBJbiBDYXNlIHRoZSBQTEwgU291cmNlIGlzIEhTSSAoSW50ZXJuYWwgQ2xvY2spICovDQogICAgICAgICAgdmNvaW5wdXQgPSAoSFNJX1ZBTFVFIC8gKHVpbnQzMl90KShSQ0MtPlBMTENGR1IgJiBSQ0NfUExMQ0ZHUl9QTExNKSk7DQogICAgICAgIH0NCiAgICAgICAgZWxzZQ0KICAgICAgICB7DQogICAgICAgICAgLyogSW4gQ2FzZSB0aGUgUExMIFNvdXJjZSBpcyBIU0UgKEV4dGVybmFsIENsb2NrKSAqLw0KICAgICAgICAgIHZjb2lucHV0ID0gKChIU0VfVkFMVUUgLyAodWludDMyX3QpKFJDQy0+UExMQ0ZHUiAmIFJDQ19QTExDRkdSX1BMTE0pKSk7DQogICAgICAgIH0gICANCiAgICAgICAgLyogUExMU0FJX1ZDTyBPdXRwdXQgPSBQTExTQUlfVkNPIElucHV0ICogUExMU0FJTiAqLw0KICAgICAgICAvKiBTQUlfQ0xLKGZpcnN0IGxldmVsKSA9IFBMTFNBSV9WQ08gT3V0cHV0L1BMTFNBSVEgKi8NCiAgICAgICAgdG1wcmVnID0gKFJDQy0+UExMU0FJQ0ZHUiAmIFJDQ19QTExTQUlDRkdSX1BMTFNBSVEpID4+IDI0Ow0KICAgICAgICBmcmVxdWVuY3kgPSAodmNvaW5wdXQgKiAoKFJDQy0+UExMU0FJQ0ZHUiAmIFJDQ19QTExTQUlDRkdSX1BMTFNBSU4pID4+IDYpKS8odG1wcmVnKTsNCiAgICAgICAgDQogICAgICAgIC8qIFNBSV9DTEtfeCA9IFNBSV9DTEsoZmlyc3QgbGV2ZWwpL1BMTFNBSURJVlEgKi8NCiAgICAgICAgdG1wcmVnID0gKCgoUkNDLT5EQ0tDRkdSMSAmIFJDQ19EQ0tDRkdSMV9QTExTQUlESVZRKSA+PiA4KSArIDEpOw0KICAgICAgICBmcmVxdWVuY3kgPSBmcmVxdWVuY3kvKHRtcHJlZyk7IA0KICAgICAgICBicmVhazsgICAgICAgDQogICAgICB9DQogICAgY2FzZSBSQ0NfRENLQ0ZHUjFfU0FJMVNFTF8wOiAvKiBQTExJMlMgaXMgdGhlIGNsb2NrIHNvdXJjZSBmb3IgU0FJKi8NCiAgICBjYXNlIFJDQ19EQ0tDRkdSMV9TQUkyU0VMXzA6IC8qIFBMTEkyUyBpcyB0aGUgY2xvY2sgc291cmNlIGZvciBTQUkqLw0KICAgICAgeyAgDQogICAgICAgIC8qIENvbmZpZ3VyZSB0aGUgUExMSTJTIGRpdmlzaW9uIGZhY3RvciAqLw0KICAgICAgICAvKiBQTExJMlNfVkNPIElucHV0ICA9IFBMTF9TT1VSQ0UvUExMTSAqLyANCiAgICAgICAgaWYoKFJDQy0+UExMQ0ZHUiAmIFJDQ19QTExDRkdSX1BMTFNSQykgPT0gUkNDX1BMTFNPVVJDRV9IU0kpDQogICAgICAgIHsNCiAgICAgICAgICAvKiBJbiBDYXNlIHRoZSBQTEwgU291cmNlIGlzIEhTSSAoSW50ZXJuYWwgQ2xvY2spICovDQogICAgICAgICAgdmNvaW5wdXQgPSAoSFNJX1ZBTFVFIC8gKHVpbnQzMl90KShSQ0MtPlBMTENGR1IgJiBSQ0NfUExMQ0ZHUl9QTExNKSk7DQogICAgICAgIH0NCiAgICAgICAgZWxzZQ0KICAgICAgICB7DQogICAgICAgICAgLyogSW4gQ2FzZSB0aGUgUExMIFNvdXJjZSBpcyBIU0UgKEV4dGVybmFsIENsb2NrKSAqLw0KICAgICAgICAgIHZjb2lucHV0ID0gKChIU0VfVkFMVUUgLyAodWludDMyX3QpKFJDQy0+UExMQ0ZHUiAmIFJDQ19QTExDRkdSX1BMTE0pKSk7DQogICAgICAgIH0NCiAgICAgICAgDQogICAgICAgIC8qIFBMTEkyU19WQ08gT3V0cHV0ID0gUExMSTJTX1ZDTyBJbnB1dCAqIFBMTEkyU04gKi8NCiAgICAgICAgLyogU0FJX0NMSyhmaXJzdCBsZXZlbCkgPSBQTExJMlNfVkNPIE91dHB1dC9QTExJMlNRICovDQogICAgICAgIHRtcHJlZyA9IChSQ0MtPlBMTEkyU0NGR1IgJiBSQ0NfUExMSTJTQ0ZHUl9QTExJMlNRKSA+PiAyNDsNCiAgICAgICAgZnJlcXVlbmN5ID0gKHZjb2lucHV0ICogKChSQ0MtPlBMTEkyU0NGR1IgJiBSQ0NfUExMSTJTQ0ZHUl9QTExJMlNOKSA+PiA2KSkvKHRtcHJlZyk7DQogICAgICAgIA0KICAgICAgICAvKiBTQUlfQ0xLX3ggPSBTQUlfQ0xLKGZpcnN0IGxldmVsKS9QTExJMlNESVZRICovDQogICAgICAgIHRtcHJlZyA9ICgoUkNDLT5EQ0tDRkdSMSAmIFJDQ19EQ0tDRkdSMV9QTExJMlNESVZRKSArIDEpOyANCiAgICAgICAgZnJlcXVlbmN5ID0gZnJlcXVlbmN5Lyh0bXByZWcpOw0KICAgICAgICBicmVhazsNCiAgICAgIH0NCiAgICBjYXNlIFJDQ19EQ0tDRkdSMV9TQUkxU0VMXzE6IC8qIEV4dGVybmFsIGNsb2NrIGlzIHRoZSBjbG9jayBzb3VyY2UgZm9yIFNBSSovDQogICAgY2FzZSBSQ0NfRENLQ0ZHUjFfU0FJMlNFTF8xOiAvKiBFeHRlcm5hbCBjbG9jayBpcyB0aGUgY2xvY2sgc291cmNlIGZvciBTQUkqLw0KICAgICAgew0KICAgICAgICBmcmVxdWVuY3kgPSBFWFRFUk5BTF9DTE9DS19WQUxVRTsNCiAgICAgICAgYnJlYWs7ICAgICAgIA0KICAgICAgfQ0KICAgIGRlZmF1bHQgOg0KICAgICAgew0KICAgICAgICBicmVhazsNCiAgICAgIH0NCiAgICB9DQogIH0NCiAgcmV0dXJuIGZyZXF1ZW5jeTsNCn0NCg0KLyoqDQogICogQH0NCiAgKi8NCg0KLyoqDQogICogQH0NCiAgKi8NCg0KI2VuZGlmIC8qIEhBTF9SQ0NfTU9EVUxFX0VOQUJMRUQgKi8NCi8qKg0KICAqIEB9DQogICovDQoNCi8qKg0KICAqIEB9DQogICovDQoNCi8qKioqKioqKioqKioqKioqKioqKioqKiogKEMpIENPUFlSSUdIVCBTVE1pY3JvZWxlY3Ryb25pY3MgKioqKipFTkQgT0YgRklMRSoqKiovDQo=