LyoqQGZpbGUNCiAgVGhpcyBmaWxlIGNvbnRhaW5zIHRoZSBmb3JtIHByb2Nlc3NpbmcgY29kZSB0byB0aGUgSElJIGRhdGFiYXNlLg0KDQpDb3B5cmlnaHQgKGMpIDIwMDYgLSAyMDA4IEludGVsIENvcnBvcmF0aW9uLiA8QlI+DQpBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzDQphcmUgbGljZW5zZWQgYW5kIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUgQlNEIExpY2Vuc2UNCndoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLiAgVGhlIGZ1bGwgdGV4dCBvZiB0aGUgbGljZW5zZSBtYXkgYmUgZm91bmQgYXQNCmh0dHA6Ly9vcGVuc291cmNlLm9yZy9saWNlbnNlcy9ic2QtbGljZW5zZS5waHANCg0KVEhFIFBST0dSQU0gSVMgRElTVFJJQlVURUQgVU5ERVIgVEhFIEJTRCBMSUNFTlNFIE9OIEFOICJBUyBJUyIgQkFTSVMsDQpXSVRIT1VUIFdBUlJBTlRJRVMgT1IgUkVQUkVTRU5UQVRJT05TIE9GIEFOWSBLSU5ELCBFSVRIRVIgRVhQUkVTUyBPUiBJTVBMSUVELg0KDQoqKi8NCg0KDQojaW5jbHVkZSAiSGlpRGF0YWJhc2UuaCINCiNpbmNsdWRlICJVZWZpSWZyRGVmYXVsdC5oIg0KDQovLw0KLy8gVGhpcyBzdHJ1Y3R1cmUgaXMgb25seSBpbnRlbmRlZCB0byBiZSB1c2VkIGluIHRoaXMgZmlsZS4NCi8vDQojcHJhZ21hIHBhY2soMSkNCnR5cGVkZWYgc3RydWN0IHsNCiAgRUZJX0hJSV9QQUNLX0hFQURFUiAgICAgICAgICAgIFBhY2thZ2VIZWFkZXI7DQogIEZSQU1FV09SS19FRklfSUZSX0ZPUk1fU0VUICAgICBGb3JtU2V0Ow0KICBFRklfSUZSX0VORF9GT1JNX1NFVCAgICAgICAgICAgRW5kRm9ybVNldDsNCn0gRldfSElJX0ZPUk1TRVRfVEVNUExBVEU7DQojcHJhZ21hIHBhY2soKQ0KDQpGV19ISUlfRk9STVNFVF9URU1QTEFURSBGb3JtU2V0VGVtcGxhdGUgPSB7DQogIHsNCiAgICBzaXplb2YgKEZXX0hJSV9GT1JNU0VUX1RFTVBMQVRFKSwNCiAgICBFRklfSElJX0lGUg0KICB9LA0KICB7DQogICAgew0KICAgICAgRlJBTUVXT1JLX0VGSV9JRlJfRk9STV9TRVRfT1AsDQogICAgICBzaXplb2YgKEZSQU1FV09SS19FRklfSUZSX0ZPUk1fU0VUKQ0KICAgIH0sDQogICAgezAsIDAsIDAsIHswLCAwLCAwLCAwLCAwLCAwLCAwLCAwfX0sIC8vR3VpZA0KICAgIDAsDQogICAgMCwNCiAgICAwLA0KICAgIDAsDQogICAgMCwNCiAgICAwDQogIH0sDQogIHsNCiAgICB7DQogICAgICBFRklfSUZSX0VORF9GT1JNX1NFVF9PUCwNCiAgICAgIHNpemVvZiAoRUZJX0lGUl9FTkRfRk9STV9TRVQpDQogICAgfQ0KICB9DQp9Ow0KDQoNCkVGSV9HVUlEICBtVGlhbm9IaWlJZnJHdWlkICAgICAgICAgICAgICA9IEVGSV9JRlJfVElBTk9fR1VJRDsNCg0KLyoqDQoNCiAgVGhpcyB0aHVuayBtb2R1bGUgb25seSBoYW5kbGVzIFVFRkkgSElJIHBhY2thZ2VzLiBUaGUgY2FsbGVyIG9mIHRoaXMgZnVuY3Rpb24gDQogIHdvbqGvdCBiZSBhYmxlIHRvIHBhcnNlIHRoZSBjb250ZW50LiBUaGVyZWZvcmUsIGl0IGlzIG5vdCBzdXBwb3J0ZWQuDQogIA0KICBUaGlzIGZ1bmN0aW9uIHdpbGwgQVNTRVJUIGFuZCByZXR1cm4gRUZJX1VOU1VQUE9SVEVELg0KDQogIEBwYXJhbSBUaGlzICAgICAgICAgICAgTi5BLg0KICBAcGFyYW0gSGFuZGxlICAgICAgICAgIE4uQS4NCiAgQHBhcmFtIEJ1ZmZlclNpemUgICAgICBOLkEuDQogIEBwYXJhbSBCdWZmZXIgICAgICAgICAgTi5BLg0KDQogIEByZXR2YWwgRUZJX1VOU1VQUE9SVEVEDQoNCioqLw0KRUZJX1NUQVRVUw0KRUZJQVBJDQpIaWlFeHBvcnREYXRhYmFzZSAoDQogIElOICAgICBFRklfSElJX1BST1RPQ09MICpUaGlzLA0KICBJTiAgICAgRlJBTUVXT1JLX0VGSV9ISUlfSEFORExFICAgIEhhbmRsZSwNCiAgSU4gT1VUIFVJTlROICAgICAgICAgICAgKkJ1ZmZlclNpemUsDQogIE9VVCAgICBWT0lEICAgICAgICAgICAgICpCdWZmZXINCiAgKQ0Kew0KICBBU1NFUlQgKEZBTFNFKTsNCiAgcmV0dXJuIEVGSV9VTlNVUFBPUlRFRDsNCn0NCg0KDQovKioNCiAgVGhpcyBmdW5jdGlvbiBhbGxvd3MgYSBwcm9ncmFtIHRvIGV4dHJhY3QgYSBmb3JtIG9yIGZvcm0gcGFja2FnZSB0aGF0IGhhcw0KICBwcmV2aW91c2x5IGJlZW4gcmVnaXN0ZXJlZCB3aXRoIHRoZSBFRkkgSElJIGRhdGFiYXNlLg0KDQogIEluIHRoaXMgdGh1bmsgbW9kdWxlLCB0aGlzIGZ1bmN0aW9uIHdpbGwgY3JlYXRlIGEgSUZSIFBhY2thZ2Ugd2l0aCBvbmx5IA0KICBvbmUgRm9ybXNldC4gRWZmZWN0aXZlbHksIG9ubHkgdGhlIEdVSUQgb2YgdGhlIEZvcm1zZXQgaXMgdXBkYXRlZCBhbmQgcmV0dXJuDQogIGluIHRoaXMgSUZSIHBhY2thZ2UgdG8gY2FsbGVyLiBUaGlzIGlzIGVuYWJsZSB0aGUgRnJhbWV3b3JrIG1vZHVsZXMgd2hpY2ggY2FsbCANCiAgYSBBUEkgbmFtZWQgR2V0U3RyaW5nRnJvbVRva2VuLiBHZXRTdHJpbmdGcm9tVG9rZW4gcmV0aWV2ZXMgYSBTdHJpbmcgYmFzZWQgb24NCiAgYSBTdHJpbmcgVG9rZW4gZnJvbSBhIFBhY2thZ2UgTGlzdCBrbm93biBvbmx5IGJ5IHRoZSBGb3Jtc2V0IEdVSUQuDQogIA0KDQoNCiAgQHBhcmFtIFRoaXMgICAgICAgICAgICAgQSBwb2ludGVyIHRvIHRoZSBFRklfSElJX1BST1RPQ09MIGluc3RhbmNlLg0KICBAcGFyYW0gSGFuZGxlICAgICAgICAgICBIYW5kbGUgb24gd2hpY2ggdGhlIGZvcm0gcmVzaWRlcy4gVHlwZSBGUkFNRVdPUktfRUZJX0hJSV9IQU5ETEUgIGlzIGRlZmluZWQgaW4NCiAgICAgICAgICAgICAgICAgICAgICAgICAgRUZJX0hJSV9QUk9UT0NPTC5OZXdQYWNrKCkgaW4gdGhlIFBhY2thZ2VzIHNlY3Rpb24uDQogIEBwYXJhbSBGb3JtSWQgICAgICAgICAgIElnbm9yZWQgYnkgdGhpcyBpbXBsZW1lbnRhdGlvbi4NCiAgQHBhcmFtIEJ1ZmZlckxlbmd0aFRlbXAgT24gaW5wdXQsIHRoZSBzaXplIG9mIGlucHV0IGJ1ZmZlci4gT24gb3V0cHV0LCBpdA0KICAgICAgICAgICAgICAgICAgICAgICAgICBpcyB0aGUgc2l6ZSBvZiBGV19ISUlfRk9STVNFVF9URU1QTEFURS4NCiAgQHBhcmFtIEJ1ZmZlciAgICAgICAgICAgVGhlIGJ1ZmZlciBkZXNpZ25lZCB0byByZWNlaXZlIHRoZSBmb3JtKHMpLg0KDQogIEByZXR2YWwgIEVGSV9TVUNDRVNTICAgICAgICAgICAgQnVmZmVyIGZpbGxlZCB3aXRoIHRoZSByZXF1ZXN0ZWQgZm9ybXMuIEJ1ZmZlckxlbmd0aA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdhcyB1cGRhdGVkLg0KICBAcmV0dmFsICBFRklfSU5WQUxJRF9QQVJBTUVURVIgIFRoZSBoYW5kbGUgaXMgdW5rbm93bi4NCiAgQHJldHZhbCAgRUZJX05PVF9GT1VORCAgICAgICAgICBBIGZvcm0gb24gdGhlIHJlcXVlc3RlZCBoYW5kbGUgY2Fubm90IGJlIGZvdW5kIHdpdGggdGhlDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVxdWVzdGVkIEZvcm1JZC4NCiAgQHJldHZhbCAgRUZJX0JVRkZFUl9UT09fU01BTEwgICBUaGUgYnVmZmVyIHByb3ZpZGVkIHdhcyBub3QgbGFyZ2UgZW5vdWdoIHRvIGFsbG93IHRoZSBmb3JtIHRvIGJlIHN0b3JlZC4NCg0KKiovDQpFRklfU1RBVFVTDQpFRklBUEkNCkhpaUdldEZvcm1zICgNCiAgSU4gICAgIEVGSV9ISUlfUFJPVE9DT0wgICAgICAgICAgICAgKlRoaXMsDQogIElOICAgICBGUkFNRVdPUktfRUZJX0hJSV9IQU5ETEUgICAgIEhhbmRsZSwNCiAgSU4gICAgIEVGSV9GT1JNX0lEICAgICAgICAgICAgICAgICAgRm9ybUlkLA0KICBJTiBPVVQgVUlOVE4gICAgICAgICAgICAgICAgICAgICAgICAqQnVmZmVyTGVuZ3RoVGVtcCwNCiAgT1VUICAgIFVJTlQ4ICAgICAgICAgICAgICAgICAgICAgICAgKkJ1ZmZlcg0KICApDQp7DQogIEhJSV9USFVOS19QUklWQVRFX0RBVEEgICAgICAgICAgICAgICAgKlByaXZhdGU7DQogIEhJSV9USFVOS19DT05URVhUICAqVGh1bmtDb250ZXh0Ow0KICBGV19ISUlfRk9STVNFVF9URU1QTEFURSAgICAgICAgICAgICpPdXRwdXRGb3JtU2V0Ow0KDQogIGlmICgqQnVmZmVyTGVuZ3RoVGVtcCA8IHNpemVvZihGV19ISUlfRk9STVNFVF9URU1QTEFURSkpIHsNCiAgICAqQnVmZmVyTGVuZ3RoVGVtcCA9IHNpemVvZihGV19ISUlfRk9STVNFVF9URU1QTEFURSk7DQogICAgcmV0dXJuIEVGSV9CVUZGRVJfVE9PX1NNQUxMOw0KICB9DQogIA0KICBQcml2YXRlID0gSElJX1RIVU5LX1BSSVZBVEVfREFUQV9GUk9NX1RISVMoVGhpcyk7DQoNCiAgVGh1bmtDb250ZXh0ID0gRndIaWlIYW5kbGVUb1RodW5rQ29udGV4dCAoUHJpdmF0ZSwgSGFuZGxlKTsNCg0KICBpZiAoVGh1bmtDb250ZXh0ID09IE5VTEwpIHsNCiAgICByZXR1cm4gRUZJX05PVF9GT1VORDsNCiAgfQ0KDQogIE91dHB1dEZvcm1TZXQgPSAoRldfSElJX0ZPUk1TRVRfVEVNUExBVEUgKikgQnVmZmVyOw0KICANCiAgQ29weU1lbSAoT3V0cHV0Rm9ybVNldCwgJkZvcm1TZXRUZW1wbGF0ZSwgc2l6ZW9mIChGV19ISUlfRk9STVNFVF9URU1QTEFURSkpOw0KICBDb3B5TWVtICgmT3V0cHV0Rm9ybVNldC0+Rm9ybVNldC5HdWlkLCAmVGh1bmtDb250ZXh0LT5UYWdHdWlkLCBzaXplb2YgKEVGSV9HVUlEKSk7IA0KDQogIGlmIChUaHVua0NvbnRleHQtPkZvcm1TZXQgIT0gTlVMTCkgew0KICAgIE91dHB1dEZvcm1TZXQtPkZvcm1TZXQuQ2xhc3MgPSBUaHVua0NvbnRleHQtPkZvcm1TZXQtPkNsYXNzOw0KICAgIE91dHB1dEZvcm1TZXQtPkZvcm1TZXQuU3ViQ2xhc3MgPSBUaHVua0NvbnRleHQtPkZvcm1TZXQtPlN1YkNsYXNzOw0KICAgIE91dHB1dEZvcm1TZXQtPkZvcm1TZXQuSGVscCAgICAgPSBUaHVua0NvbnRleHQtPkZvcm1TZXQtPkhlbHA7DQogICAgT3V0cHV0Rm9ybVNldC0+Rm9ybVNldC5Gb3JtU2V0VGl0bGUgPSBUaHVua0NvbnRleHQtPkZvcm1TZXQtPkZvcm1TZXRUaXRsZTsNCiAgfQ0KDQogIHJldHVybiBFRklfU1VDQ0VTUzsNCn0NCg0KDQovKioNCg0KICBUaGlzIGZ1bmN0aW9uIGFsbG93cyBhIHByb2dyYW0gdG8gZXh0cmFjdCB0aGUgTlYgSW1hZ2UNCiAgdGhhdCByZXByZXNlbnRzIHRoZSBkZWZhdWx0IHN0b3JhZ2UgaW1hZ2UNCg0KDQogIEBwYXJhbSBUaGlzICAgICAgICAgICAgQSBwb2ludGVyIHRvIHRoZSBFRklfSElJX1BST1RPQ09MIGluc3RhbmNlLg0KICBAcGFyYW0gSGFuZGxlICAgICAgICAgIFRoZSBISUkgaGFuZGxlIGZyb20gd2hpY2ggd2lsbCBoYXZlIGRlZmF1bHQgZGF0YSByZXRyaWV2ZWQuDQogICAgICAgICAgICAgICAgICAgICAgICAgVUlOVE4gICAgICAgICAgICAtIE1hc2sgdXNlZCB0byByZXRyaWV2ZSB0aGUgZGVmYXVsdCBpbWFnZS4NCiAgQHBhcmFtIERlZmF1bHRNYXNrICAgICBFREVTX1RPRE86IEFkZCBwYXJhbWV0ZXIgZGVzY3JpcHRpb24NCiAgQHBhcmFtIFZhcmlhYmxlUGFja0xpc3QgQ2FsbGVlIGFsbG9jYXRlZCwgdGlnaHRseS1wYWNrZWQsIGxpbmsgbGlzdCBkYXRhDQogICAgICAgICAgICAgICAgICAgICAgICAgc3RydWN0dXJlIHRoYXQgY29udGFpbiBhbGwgZGVmYXVsdCB2YXJhaWJsZSBwYWNrcw0KICAgICAgICAgICAgICAgICAgICAgICAgIGZyb20gdGhlIEhpaSBEYXRhYmFzZS4NCg0KICBAcmV0dmFsICBFRklfTk9UX0ZPVU5EICAgICAgICAgIElmIEhpaSBkYXRhYmFzZSBkb2VzIG5vdCBjb250YWluIGFueSBkZWZhdWx0IGltYWdlcy4NCiAgQHJldHZhbCAgRUZJX0lOVkFMSURfUEFSQU1FVEVSICBJbnZhbGlkIGlucHV0IHBhcmFtZXRlci4NCiAgQHJldHZhbCAgRUZJX1NVQ0NFU1MgICAgICAgICAgICBPcGVyYXRpb24gc3VjY2Vzc2Z1bC4NCg0KKiovDQpFRklfU1RBVFVTDQpFRklBUEkNCkhpaUdldERlZmF1bHRJbWFnZSAoDQogIElOICAgICBFRklfSElJX1BST1RPQ09MICAgICAgICAgICAgKlRoaXMsDQogIElOICAgICBGUkFNRVdPUktfRUZJX0hJSV9IQU5ETEUgICAgSGFuZGxlLA0KICBJTiAgICAgVUlOVE4gICAgICAgICAgICAgICAgICAgICAgIERlZmF1bHRNYXNrLA0KICBPVVQgICAgRUZJX0hJSV9WQVJJQUJMRV9QQUNLX0xJU1QgICoqVmFyaWFibGVQYWNrTGlzdA0KICApDQp7DQogIExJU1RfRU5UUlkgICAgICAgICpVZWZpRGVmYXVsdHM7DQogIEVGSV9TVEFUVVMgICAgICAgIFN0YXR1czsNCiAgSElJX1RIVU5LX1BSSVZBVEVfREFUQSAqUHJpdmF0ZTsNCiAgSElJX1RIVU5LX0NPTlRFWFQgKlRodW5rQ29udGV4dDsNCg0KICBQcml2YXRlID0gSElJX1RIVU5LX1BSSVZBVEVfREFUQV9GUk9NX1RISVMoVGhpcyk7DQoNCiAgVGh1bmtDb250ZXh0ID0gRndIaWlIYW5kbGVUb1RodW5rQ29udGV4dCAoUHJpdmF0ZSwgSGFuZGxlKTsNCiAgaWYgKFRodW5rQ29udGV4dCA9PSBOVUxMKSB7DQogICAgQVNTRVJUIChGQUxTRSk7DQogICAgcmV0dXJuIEVGSV9JTlZBTElEX1BBUkFNRVRFUjsNCiAgfQ0KDQogIFVlZmlEZWZhdWx0cyA9IE5VTEw7DQogIFN0YXR1cyA9IFVlZmlJZnJHZXRCdWZmZXJUeXBlRGVmYXVsdHMgKFRodW5rQ29udGV4dCwgJlVlZmlEZWZhdWx0cyk7DQogIGlmIChFRklfRVJST1IgKFN0YXR1cykpIHsNCiAgICBnb3RvIERvbmU7DQogIH0NCg0KICBTdGF0dXMgPSBVZWZpRGVmYXVsdHNUb0Z3RGVmYXVsdHMgKFVlZmlEZWZhdWx0cywgRGVmYXVsdE1hc2ssIFRodW5rQ29udGV4dC0+Rm9ybVNldC0+RGVmYXVsdFZhclN0b3JlSWQsIFZhcmlhYmxlUGFja0xpc3QpOw0KDQpEb25lOg0KICBGcmVlRGVmYXVsdExpc3QgKFVlZmlEZWZhdWx0cyk7DQogIA0KICByZXR1cm4gU3RhdHVzOw0KfQ0KDQovKioNCiAgVGhpcyBmdW5jdGlvbiB1cGRhdGUgdGhlIEZvcm1DYWxsYmFja1Byb3RvY29sIGNhY2hlZCBpbiBDb25maWcgQWNjZXNzDQogIHByaXZhdGUgY29udGV4dCBkYXRhLg0KDQogIEBwYXJhbSBDYWxsYmFja0hhbmRsZSAgVGhlIEVGSSBIYW5kbGUgb24gd2hpY2ggdGhlIEZyYW1ld29yayBGb3JtQ2FsbGJhY2tQcm90b2NvbCBpcyANCiAgICAgICAgICAgICAgICAgICAgICAgICBpbnN0YWxsZWQuDQogIEBwYXJhbSBUaHVua0NvbnRleHQgICAgVGhlIFRodW5rIENvbnRleHQuDQoNCiAgQHJldHZhbCBFRklfU1VDQ0VTUyAgICAgICAgICAgICBUaGUgdXBkYXRlIGlzIHN1Y2Nlc3NmdWwuDQogIEByZXR2YWwgRUZJX0lOVkFMSURfUEFSQU1FVEVSICAgSWYgbm8gRnJhbWV3b3JrIEZvcm1DYWxsYmFja1Byb3RvY29sIGlzIGxvY2F0ZWQgb24gQ2FsbGJhY2tIYW5kbGUuDQoNCioqLw0KRUZJX1NUQVRVUw0KVXBkYXRlRm9ybUNhbGxCYWNrICgNCiAgSU4gICAgICAgRUZJX0hBTkRMRSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ2FsbGJhY2tIYW5kbGUsDQogIElOIENPTlNUIEhJSV9USFVOS19DT05URVhUICAgICAgICAgICAgICAgICAgICAgICAgICpUaHVua0NvbnRleHQNCiAgKQ0Kew0KICBFRklfU1RBVFVTICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdGF0dXM7DQogIEVGSV9GT1JNX0NBTExCQUNLX1BST1RPQ09MICAgICAgICAgICAgICAgICpGb3JtQ2FsbGJhY2tQcm90b2NvbDsNCiAgRUZJX0hJSV9DT05GSUdfQUNDRVNTX1BST1RPQ09MICAgICAgICAgICAgKkNvbmZpZ0FjY2Vzc1Byb3RvY29sOw0KICBFRklfSEFORExFICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVZWZpRHJpdmVySGFuZGxlOw0KICBDT05GSUdfQUNDRVNTX1BSSVZBVEUgICAgICAgICAgICAgICAgICAgICAqQ29uZmlnQWNjZXNzUHJpdmF0ZTsNCiAgDQogIFN0YXR1cyA9IGdCUy0+SGFuZGxlUHJvdG9jb2wgKA0KICAgICAgICAgICAgICAgICAgIENhbGxiYWNrSGFuZGxlLA0KICAgICAgICAgICAgICAgICAgICZnRWZpRm9ybUNhbGxiYWNrUHJvdG9jb2xHdWlkLA0KICAgICAgICAgICAgICAgICAgIChWT0lEICoqKSAmRm9ybUNhbGxiYWNrUHJvdG9jb2wNCiAgICAgICAgICAgICAgICAgICApOw0KICBpZiAoRUZJX0VSUk9SIChTdGF0dXMpKSB7DQogICAgcmV0dXJuIEVGSV9JTlZBTElEX1BBUkFNRVRFUjsNCiAgfQ0KICANCiAgU3RhdHVzID0gbUhpaURhdGFiYXNlLT5HZXRQYWNrYWdlTGlzdEhhbmRsZSAoDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbUhpaURhdGFiYXNlLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRodW5rQ29udGV4dC0+VWVmaUhpaUhhbmRsZSwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmVWVmaURyaXZlckhhbmRsZQ0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICk7DQogIEFTU0VSVF9FRklfRVJST1IgKFN0YXR1cyk7DQogIFN0YXR1cyA9IGdCUy0+SGFuZGxlUHJvdG9jb2wgKA0KICAgICAgICAgICAgICAgICAgIFVlZmlEcml2ZXJIYW5kbGUsDQogICAgICAgICAgICAgICAgICAgJmdFZmlIaWlDb25maWdBY2Nlc3NQcm90b2NvbEd1aWQsDQogICAgICAgICAgICAgICAgICAgKFZPSUQgKiopICZDb25maWdBY2Nlc3NQcm90b2NvbA0KICAgICAgICAgICAgICAgICAgICk7DQogIEFTU0VSVF9FRklfRVJST1IgKFN0YXR1cyk7DQogIA0KICBDb25maWdBY2Nlc3NQcml2YXRlID0gQ09ORklHX0FDQ0VTU19QUklWQVRFX0ZST01fUFJPVE9DT0wgKENvbmZpZ0FjY2Vzc1Byb3RvY29sKTsNCiAgDQogIENvbmZpZ0FjY2Vzc1ByaXZhdGUtPkZvcm1DYWxsYmFja1Byb3RvY29sID0gRm9ybUNhbGxiYWNrUHJvdG9jb2w7DQoNCiAgcmV0dXJuIEVGSV9TVUNDRVNTOw0KfQ0KDQoNCi8qKg0KICBHZXQgdGhlIHBhY2thZ2UgZGF0YSBmcm9tIHRoZSBQYWNrYWdlIExpc3QuDQoNCiAgQHBhcmFtIEhpaVBhY2thZ2VMaXN0ICBQYWNrYWdlIExpc3QuDQogIEBwYXJhbSBQYWNrYWdlSW5kZXggICAgVGhlIGluZGV4IG9mIHRoZSBQYWNrYWdlIGluIHRoZSBQYWNrYWdlIExpc3QuDQogIEBwYXJhbSBCdWZmZXJMZW4gICAgICAgVGhlIExlbmd0aCBvZiB0aGUgUGFjYWdlIGRhdGEuDQogIEBwYXJhbSBCdWZmZXIgICAgICAgICAgT24gb3V0cHV0LCB0aGUgUGFja2FnZSBkYXRhLg0KDQogIEByZXR1cm4gRUZJX05PVF9GT1VORCAgTm8gUGFja2FnZSBpcyBmb3VuZCBmb3IgUGFja2FnZUluZGV4Lg0KICBAcmV0dXJuIEVGSV9TVUNDRVNTICAgIFRoZSBwYWNrYWdlIGRhdGEgaXMgcmV0dXJuZWQuDQoNCioqLw0KRUZJX1NUQVRVUw0KR2V0UGFja2FnZURhdGEgKA0KICBJTiAgRUZJX0hJSV9QQUNLQUdFX0xJU1RfSEVBREVSICpIaWlQYWNrYWdlTGlzdCwNCiAgSU4gIFVJTlQzMiAgICAgICAgICAgICAgICAgICAgICBQYWNrYWdlSW5kZXgsDQogIE9VVCBVSU5UMzIgICAgICAgICAgICAgICAgICAgICAgKkJ1ZmZlckxlbiwNCiAgT1VUIEVGSV9ISUlfUEFDS0FHRV9IRUFERVIgICAgICAqKkJ1ZmZlcg0KICApDQp7DQogIFVJTlQzMiAgICAgICAgICAgICAgICAgICAgICAgIEluZGV4Ow0KICBFRklfSElJX1BBQ0tBR0VfSEVBREVSICAgICAgICAqUGFja2FnZTsNCiAgVUlOVDMyICAgICAgICAgICAgICAgICAgICAgICAgT2Zmc2V0Ow0KICBVSU5UMzIgICAgICAgICAgICAgICAgICAgICAgICBQYWNrYWdlTGlzdExlbmd0aDsNCiAgRUZJX0hJSV9QQUNLQUdFX0hFQURFUiAgICAgICAgUGFja2FnZUhlYWRlciA9IHswLCAwfTsNCg0KICBBU1NFUlQoSGlpUGFja2FnZUxpc3QgIT0gTlVMTCk7DQoNCiAgaWYgKChCdWZmZXJMZW4gPT0gTlVMTCkgfHwgKEJ1ZmZlciA9PSBOVUxMKSkgew0KICAgIHJldHVybiBFRklfSU5WQUxJRF9QQVJBTUVURVI7DQogIH0NCg0KICBQYWNrYWdlID0gTlVMTDsNCiAgSW5kZXggICA9IDA7DQogIE9mZnNldCAgPSBzaXplb2YgKEVGSV9ISUlfUEFDS0FHRV9MSVNUX0hFQURFUik7DQogIENvcHlNZW0gKCZQYWNrYWdlTGlzdExlbmd0aCwgJkhpaVBhY2thZ2VMaXN0LT5QYWNrYWdlTGVuZ3RoLCBzaXplb2YgKFVJTlQzMikpOw0KICB3aGlsZSAoT2Zmc2V0IDwgUGFja2FnZUxpc3RMZW5ndGgpIHsNCiAgICBQYWNrYWdlID0gKEVGSV9ISUlfUEFDS0FHRV9IRUFERVIgKikgKCgoVUlOVDggKikgSGlpUGFja2FnZUxpc3QpICsgT2Zmc2V0KTsNCiAgICBDb3B5TWVtICgmUGFja2FnZUhlYWRlciwgUGFja2FnZSwgc2l6ZW9mIChFRklfSElJX1BBQ0tBR0VfSEVBREVSKSk7DQogICAgaWYgKEluZGV4ID09IFBhY2thZ2VJbmRleCkgew0KICAgICAgYnJlYWs7DQogICAgfQ0KICAgIE9mZnNldCArPSBQYWNrYWdlSGVhZGVyLkxlbmd0aDsNCiAgICBJbmRleCsrOw0KICB9DQogIGlmIChPZmZzZXQgPj0gUGFja2FnZUxpc3RMZW5ndGgpIHsNCiAgICAvLw0KICAgIC8vIG5vIHBhY2thZ2UgZm91bmQgaW4gdGhpcyBQYWNrYWdlIExpc3QNCiAgICAvLw0KICAgIHJldHVybiBFRklfTk9UX0ZPVU5EOw0KICB9DQoNCiAgKkJ1ZmZlckxlbiA9IFBhY2thZ2VIZWFkZXIuTGVuZ3RoOw0KICAqQnVmZmVyICAgID0gUGFja2FnZTsNCiAgcmV0dXJuIEVGSV9TVUNDRVNTOw0KfQ0KDQovKioNCiAgQ2hlY2sgaWYgTGFiZWwgZXhpc3QgaW4gdGhlIElGUiBmb3JtIHBhY2thZ2UgYW5kIHJldHVybiB0aGUgRm9ybVNldCBHVUlEDQogIGFuZCBGb3JtIElELg0KDQogIEBwYXJhbSBQYWNrYWdlICAgICAgVGhlIFBhY2thZ2UgSGVhZGVyLg0KICBAcGFyYW0gTGFiZWwgICAgICAgIFRoZSBMYWJlbCBJRC4NCiAgQHBhcmFtIEZvcm1zZXRHdWlkICBSZXR1cm5zIHRoZSBGb3JtU2V0IEdVSUQuDQogIEBwYXJhbSBGb3JtSWQgICAgICAgUmV0dXJucyB0aGUgRm9ybSBJRC4NCg0KICBAcmV0dmFsIEVGSV9TVUNDRVNTICAgICBUaGUgRk9STSBJRCBpcyBmb3VuZC4NCiAgQHJldHZhbCBFRklfTk9UX0ZPVU5EICAgVGhlIEZPUk0gSUQgaXMgbm90IGZvdW5kLg0KKiovDQpFRklfU1RBVFVTDQpMb2NhdGVMYWJlbCAoDQogIElOIENPTlNUIEVGSV9ISUlfUEFDS0FHRV9IRUFERVIgKlBhY2thZ2UsDQogIElOICAgICAgIEVGSV9GT1JNX0xBQkVMICAgICAgICAgIExhYmVsLA0KICBPVVQgICAgICBFRklfR1VJRCAgICAgICAgICAgICAgICAqRm9ybXNldEd1aWQsDQogIE9VVCAgICAgIEVGSV9GT1JNX0lEICAgICAgICAgICAgICpGb3JtSWQNCiAgKQ0Kew0KICBVSU5UTiAgICAgICAgICAgICAgICAgICAgIE9mZnNldDsNCiAgRUZJX0lGUl9PUF9IRUFERVIgICAgICAgICAqSWZyT3BIZHI7DQogIEVGSV9HVUlEICAgICAgICAgICAgICAgICAgSW50ZXJuYWxGb3JtU2V0R3VpZDsNCiAgRUZJX0ZPUk1fSUQgICAgICAgICAgICAgICBJbnRlcm5hbEZvcm1JZDsNCiAgQk9PTEVBTiAgICAgICAgICAgICAgICAgICBHZXRGb3JtU2V0Ow0KICBCT09MRUFOICAgICAgICAgICAgICAgICAgIEdldEZvcm07DQogIEVGSV9JRlJfR1VJRF9MQUJFTCAgICAgICAgKkxhYmVsT3Bjb2RlOw0KDQogIElmck9wSGRyICAgPSAoRUZJX0lGUl9PUF9IRUFERVIgKikoKFVJTlQ4ICopIFBhY2thZ2UgKyBzaXplb2YgKEVGSV9ISUlfUEFDS0FHRV9IRUFERVIpKTsNCiAgT2Zmc2V0ICAgICA9IHNpemVvZiAoRUZJX0hJSV9QQUNLQUdFX0hFQURFUik7DQoNCiAgSW50ZXJuYWxGb3JtSWQ9IDA7DQogIFplcm9NZW0gKCZJbnRlcm5hbEZvcm1TZXRHdWlkLCBzaXplb2YgKEVGSV9HVUlEKSk7DQogIEdldEZvcm1TZXQgPSBGQUxTRTsNCiAgR2V0Rm9ybSAgICA9IEZBTFNFOw0KDQogIHdoaWxlIChPZmZzZXQgPCBQYWNrYWdlLT5MZW5ndGgpIHsNCiAgICBzd2l0Y2ggKElmck9wSGRyLT5PcENvZGUpIHsNCiAgICBjYXNlIEVGSV9JRlJfRk9STV9TRVRfT1AgOg0KICAgICAgQ29weU1lbSAoJkludGVybmFsRm9ybVNldEd1aWQsICYoKEVGSV9JRlJfRk9STV9TRVQgKikgSWZyT3BIZHIpLT5HdWlkLCBzaXplb2YgKEVGSV9HVUlEKSk7DQogICAgICBHZXRGb3JtU2V0ID0gVFJVRTsNCiAgICAgIGJyZWFrOw0KDQogICAgY2FzZSBFRklfSUZSX0ZPUk1fT1A6DQogICAgICBDb3B5TWVtICgmSW50ZXJuYWxGb3JtSWQsICYoKEVGSV9JRlJfRk9STSAqKSBJZnJPcEhkciktPkZvcm1JZCwgc2l6ZW9mIChFRklfRk9STV9JRCkpOw0KICAgICAgR2V0Rm9ybSA9IFRSVUU7DQogICAgICBicmVhazsNCg0KICAgIGNhc2UgRUZJX0lGUl9HVUlEX09QIDoNCiAgICAgIExhYmVsT3Bjb2RlID0gKEVGSV9JRlJfR1VJRF9MQUJFTCAqKSBJZnJPcEhkcjsNCiAgICAgIC8vDQogICAgICAvLyBJZiBpdCBpcyBhbiBMYWJlbCBvcGNvZGUuDQogICAgICAvLw0KICAgICAgaWYgKChMYWJlbE9wY29kZS0+RXh0ZW5kT3BDb2RlID09IEVGSV9JRlJfRVhURU5EX09QX0xBQkVMKSAmJiAoQ29tcGFyZU1lbSAoJkxhYmVsT3Bjb2RlLT5HdWlkLCAmbVRpYW5vSGlpSWZyR3VpZCwgc2l6ZW9mIChFRklfR1VJRCkpID09IDApKSB7DQogICAgICAgIGlmIChDb21wYXJlTWVtICgmTGFiZWwsICZMYWJlbE9wY29kZS0+TnVtYmVyLCBzaXplb2YgKFVJTlQxNikpID09IDApIHsNCiAgICAgICAgICBBU1NFUlQgKEdldEZvcm0gJiYgR2V0Rm9ybVNldCk7DQogICAgICAgICAgQ29weUd1aWQgKEZvcm1zZXRHdWlkLCAmSW50ZXJuYWxGb3JtU2V0R3VpZCk7DQogICAgICAgICAgKkZvcm1JZCA9IEludGVybmFsRm9ybUlkOw0KICAgICAgICAgIHJldHVybiBFRklfU1VDQ0VTUzsNCiAgICAgICAgfQ0KICAgICAgfQ0KICAgICAgYnJlYWs7DQogICAgZGVmYXVsdCA6DQogICAgICBicmVhazsNCiAgICB9DQoNCiAgICAvLw0KICAgIC8vIEdvIHRvIHRoZSBuZXh0IE9wLUNvZGUNCiAgICAvLw0KICAgIE9mZnNldCAgICs9IElmck9wSGRyLT5MZW5ndGg7DQogICAgSWZyT3BIZHIgPSAoRUZJX0lGUl9PUF9IRUFERVIgKikgKChDSEFSOCAqKSAoSWZyT3BIZHIpICsgSWZyT3BIZHItPkxlbmd0aCk7DQogIH0NCg0KICByZXR1cm4gRUZJX05PVF9GT1VORDsNCn0NCg0KLyoqDQogIEZpbmQgdGhlIGZpcnN0IEVGSV9GT1JNX0xBQkVMIGluIEZvcm1TZXRzIGZvciBhIGdpdmVuIEVGSV9ISUlfSEFOTERFIGRlZmluZWQuDQogIA0KICBFRklfRk9STV9MQUJFTCBpcyBhIHNwZWNpZmljIHRvIFRpYW5vIGltcGxlbWVudGF0aW9uLiBUaGUgY3VycmVudCBpbXBsZW1lbnRhdGlvbg0KICBkb2VzIG5vdCByZXN0cmljdCBsYWJlbHMgd2l0aCBzYW1lIGxhYmVsIHZhbHVlIHRvIGJlIGR1cGxpY2F0ZWQgaW4gZWl0aGVyIEZvcm1TZXQgDQogIHNjb3BlIG9yIEZvcm0gc2NvcGUuIFRoaXMgZnVuY3Rpb24gd2lsbCBvbmx5IGxvY2F0ZSB0aGUgRklSU1QgRUZJX0ZPUk1fTEFCRUwNCiAgd2l0aCB2YWx1ZSBhcyB0aGUgc2FtZSBhcyB0aGUgaW5wdXQgTGFiZWwgaW4gdGhlIEZvcm1zZXQgcmVnaXN0ZXJlZCB3aXRoIFVlZmlIaWlIYW5kbGUuIFRoZSBGb3JtU2V0IEdVSUQgDQogIGFuZCBGb3JtIElEIGlzIHJldHVybmVkIGlmIHN1Y2ggTGFiZWwgaXMgZm91bmQuDQoNCiAgDQogIEByZXR2YWwgRUZJX0lOVkFMSURfUEFSQU1FVEVSIElmIFVlZmlIaWlIYW5kbGUgaXMgbm90IGEgdmFsaWQgaGFuZGxlLg0KICBAcmV0dmFsIEVGSV9OT1RfRk9VTkQgICBUaGUgcGFja2FnZSBsaXN0IGlkZW50aWZpZWQgYnkgVWVmaUhpaUhhbmRsZSBkZW9zIG5vdCBjb250YWluIEZvcm1TZXQgb3INCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhlcmUgaXMgbm8gRm9ybSBJRCB3aXRoIHZhbHVlIExhYmVsIGZvdW5kIGluIGFsbCBGb3JtIFNldHMgaW4gdGhlIHBhY2FrZ2UNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGlzdC4NCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgDQogIEByZXR2YWwgRUZJX1NVQ0NFU1MgICAgICAgVGhlIGZpcnN0IGZvdW5kIEZvcm0gSUQgaXMgcmV0dXJuZWQgaW4gRm9ybUlkLg0KKiovDQpFRklfU1RBVFVTDQpMb2NhdGVGb3JtSWQgKA0KICBJTiAgRUZJX0hJSV9IQU5ETEUgSGFuZGxlLA0KICBJTiAgRUZJX0ZPUk1fTEFCRUwgTGFiZWwsDQogIE9VVCBFRklfR1VJRCAgICAgICAqRm9ybXNldEd1aWQsDQogIE9VVCBFRklfRk9STV9JRCAgICAqRm9ybUlkDQogICkNCnsNCiAgRUZJX1NUQVRVUyAgICAgICAgICAgICAgICAgICBTdGF0dXM7DQogIEVGSV9ISUlfUEFDS0FHRV9MSVNUX0hFQURFUiAgKkhpaVBhY2thZ2VMaXN0Ow0KICBVSU5UMzIgICAgICAgICAgICAgICAgICAgICAgIEluZGV4Ow0KICBVSU5UTiAgICAgICAgICAgICAgICAgICAgICAgIEJ1ZmZlclNpemU7DQogIEVGSV9ISUlfUEFDS0FHRV9IRUFERVIgICAgICAgUGFja2FnZUhlYWRlcjsNCiAgRUZJX0hJSV9QQUNLQUdFX0hFQURFUiAgICAgICAqUGFja2FnZTsNCiAgVUlOVDMyICAgICAgICAgICAgICAgICAgICAgICBQYWNrYWdlTGVuZ3RoOw0KDQogIEJ1ZmZlclNpemUgPSAwOw0KICBIaWlQYWNrYWdlTGlzdCAgID0gTlVMTDsNCiAgU3RhdHVzID0gbUhpaURhdGFiYXNlLT5FeHBvcnRQYWNrYWdlTGlzdHMgKG1IaWlEYXRhYmFzZSwgSGFuZGxlLCAmQnVmZmVyU2l6ZSwgSGlpUGFja2FnZUxpc3QpOw0KICBpZiAoU3RhdHVzID09IEVGSV9CVUZGRVJfVE9PX1NNQUxMKSB7DQogICAgSGlpUGFja2FnZUxpc3QgPSBBbGxvY2F0ZVBvb2wgKEJ1ZmZlclNpemUpOw0KICAgIEFTU0VSVCAoSGlpUGFja2FnZUxpc3QgIT0gTlVMTCk7DQoNCiAgICBTdGF0dXMgPSBtSGlpRGF0YWJhc2UtPkV4cG9ydFBhY2thZ2VMaXN0cyAobUhpaURhdGFiYXNlLCBIYW5kbGUsICZCdWZmZXJTaXplLCBIaWlQYWNrYWdlTGlzdCk7DQogICAgaWYgKEVGSV9FUlJPUiAoU3RhdHVzKSkgew0KICAgICAgZ290byBEb25lOw0KICAgIH0NCiAgfQ0KDQogIGZvciAoSW5kZXggPSAwOyA7IEluZGV4KyspIHsNCiAgICBTdGF0dXMgPSBHZXRQYWNrYWdlRGF0YSAoSGlpUGFja2FnZUxpc3QsIEluZGV4LCAmUGFja2FnZUxlbmd0aCwgJlBhY2thZ2UpOw0KICAgIGlmICghRUZJX0VSUk9SIChTdGF0dXMpKSB7DQogICAgICBDb3B5TWVtICgmUGFja2FnZUhlYWRlciwgUGFja2FnZSwgc2l6ZW9mIChFRklfSElJX1BBQ0tBR0VfSEVBREVSKSk7DQogICAgICBpZiAoUGFja2FnZUhlYWRlci5UeXBlID09IEVGSV9ISUlfUEFDS0FHRV9GT1JNUykgew0KICAgICAgICBTdGF0dXMgPSBMb2NhdGVMYWJlbCAoUGFja2FnZSwgTGFiZWwsIEZvcm1zZXRHdWlkLCBGb3JtSWQpOw0KICAgICAgICBpZiAoIUVGSV9FUlJPUihTdGF0dXMpKSB7DQogICAgICAgICAgYnJlYWs7DQogICAgICAgIH0NCiAgICAgIH0NCiAgICB9IGVsc2Ugew0KICAgICAgYnJlYWs7DQogICAgfQ0KICB9DQoNCiAgDQpEb25lOg0KICBGcmVlUG9vbCAoSGlpUGFja2FnZUxpc3QpOw0KICANCiAgcmV0dXJuIFN0YXR1czsNCn0NCg0KLyoqDQogIFRoaXMgZnVuY3Rpb24gYWxsb3dzIHRoZSBjYWxsZXIgdG8gdXBkYXRlIGEgZm9ybSB0aGF0IGhhcw0KICBwcmV2aW91c2x5IGJlZW4gcmVnaXN0ZXJlZCB3aXRoIHRoZSBFRkkgSElJIGRhdGFiYXNlLg0KDQoNCiAgQHBhcmFtIFRoaXMgICAgICAgICAgICBFREVTX1RPRE86IEFkZCBwYXJhbWV0ZXIgZGVzY3JpcHRpb24NCiAgQHBhcmFtIEhhbmRsZSAgICAgICAgICBIaWkgSGFuZGxlIGFzc29jaWF0ZWQgd2l0aCB0aGUgRm9ybXNldCB0byBtb2RpZnkNCiAgQHBhcmFtIExhYmVsICAgICAgICAgICBVcGRhdGUgaW5mb3JtYXRpb24gc3RhcnRpbmcgaW1tZWRpYXRlbHkgYWZ0ZXIgdGhpcyBsYWJlbCBpbiB0aGUgSUZSDQogIEBwYXJhbSBBZGREYXRhICAgICAgICAgSWYgVFJVRSwgYWRkIGRhdGEuICBJZiBGQUxTRSwgcmVtb3ZlIGRhdGENCiAgQHBhcmFtIERhdGEgICAgICAgICAgICBJZiBhZGRpbmcgZGF0YSwgdGhpcyBpcyB0aGUgcG9pbnRlciB0byB0aGUgZGF0YSB0byBhZGQNCg0KICBAcmV0dmFsICBFRklfU1VDQ0VTUyAgVXBkYXRlIHN1Y2Nlc3MuDQogIEByZXR2YWwgIE90aGVyICAgICAgICBVcGRhdGUgZmFpbC4NCg0KKiovDQpFRklfU1RBVFVTDQpFRklBUEkNCkhpaVRodW5rVXBkYXRlRm9ybSAoDQogIElOIEVGSV9ISUlfUFJPVE9DT0wgICAgICAgICAgICAgICAgICAqVGhpcywNCiAgSU4gRlJBTUVXT1JLX0VGSV9ISUlfSEFORExFICAgICAgICAgIEhhbmRsZSwNCiAgSU4gRUZJX0ZPUk1fTEFCRUwgICAgICAgICAgICAgICAgICAgIExhYmVsLA0KICBJTiBCT09MRUFOICAgICAgICAgICAgICAgICAgICAgICAgICAgQWRkRGF0YSwNCiAgSU4gRUZJX0hJSV9VUERBVEVfREFUQSAgICAgICAgICAgICAgICpEYXRhDQogICkNCnsNCiAgRUZJX1NUQVRVUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RhdHVzOw0KICBISUlfVEhVTktfUFJJVkFURV9EQVRBICAgICAgICAgICAgICAgICAgICAqUHJpdmF0ZTsNCiAgSElJX1RIVU5LX0NPTlRFWFQgICAgICAgICAgICAgICAgICAgICAgICAgKlRodW5rQ29udGV4dDsNCiAgRUZJX0hJSV9IQU5ETEUgICAgICAgICAgICAgICAgICAgICAgICAgICAgVWVmaUhpaUhhbmRsZTsNCiAgRUZJX0dVSUQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRm9ybXNldEd1aWQ7DQogIEVGSV9GT1JNX0lEICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZvcm1JZDsNCiAgRUZJX1RQTCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT2xkVHBsOw0KICBWT0lEICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqU3RhcnRPcENvZGVIYW5kbGU7DQogIFZPSUQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpFbmRPcENvZGVIYW5kbGU7DQogIEVGSV9JRlJfR1VJRF9MQUJFTCAgICAgICAgICAgICAgICAgICAgICAgICpTdGFydExhYmVsOw0KICBFRklfSUZSX0dVSURfTEFCRUwgICAgICAgICAgICAgICAgICAgICAgICAqRW5kTGFiZWw7DQoNCiAgT2xkVHBsID0gZ0JTLT5SYWlzZVRQTCAoVFBMX05PVElGWSk7DQogIA0KICBtSW5GcmFtZXdvcmtVcGRhdGVQYWtjYWdlID0gVFJVRTsNCiAgU3RhdHVzID0gRUZJX1NVQ0NFU1M7DQoNCiAgUHJpdmF0ZSA9IEhJSV9USFVOS19QUklWQVRFX0RBVEFfRlJPTV9USElTKFRoaXMpOw0KDQogIFRodW5rQ29udGV4dCA9IEZ3SGlpSGFuZGxlVG9UaHVua0NvbnRleHQgKFByaXZhdGUsIEhhbmRsZSk7DQoNCiAgaWYgKFRodW5rQ29udGV4dCA9PSBOVUxMKSB7DQogICAgU3RhdHVzID0gRUZJX05PVF9GT1VORDsNCiAgICBnb3RvIERvbmU7DQogIH0NCiAgDQogIGlmIChEYXRhLT5Gb3JtU2V0VXBkYXRlKSB7DQogICAgU3RhdHVzID0gVXBkYXRlRm9ybUNhbGxCYWNrICgoRUZJX0hBTkRMRSkgKFVJTlROKSBEYXRhLT5Gb3JtQ2FsbGJhY2tIYW5kbGUsIFRodW5rQ29udGV4dCk7DQogICAgaWYgKEVGSV9FUlJPUiAoU3RhdHVzKSkgew0KICAgICAgZ290byBEb25lOw0KICAgIH0NCiAgfQ0KDQogIGlmIChUaHVua0NvbnRleHQtPklmclBhY2thZ2VDb3VudCA9PSAwKSB7DQogICAgQVNTRVJUIChGQUxTRSk7DQogICAgU3RhdHVzID0gRUZJX0lOVkFMSURfUEFSQU1FVEVSOw0KICAgIGdvdG8gRG9uZTsNCiAgfSBlbHNlIHsNCiAgICBVZWZpSGlpSGFuZGxlID0gVGh1bmtDb250ZXh0LT5VZWZpSGlpSGFuZGxlOw0KICB9DQoNCiAgU3RhdHVzID0gTG9jYXRlRm9ybUlkIChVZWZpSGlpSGFuZGxlLCBMYWJlbCwgJkZvcm1zZXRHdWlkLCAmRm9ybUlkKTsNCiAgaWYgKEVGSV9FUlJPUiAoU3RhdHVzKSkgew0KICAgIC8vDQogICAgLy8gQ2FuJ3QgZmluZCB0aGUgbGFiZWwuDQogICAgLy8NCiAgICBnb3RvIERvbmU7DQogIH0NCg0KICAvLw0KICAvLyBJbml0IE9wQ29kZSBIYW5kbGUNCiAgLy8NCiAgU3RhcnRPcENvZGVIYW5kbGUgPSBIaWlBbGxvY2F0ZU9wQ29kZUhhbmRsZSAoKTsNCiAgQVNTRVJUIChTdGFydE9wQ29kZUhhbmRsZSAhPSBOVUxMKTsNCg0KICBFbmRPcENvZGVIYW5kbGUgPSBIaWlBbGxvY2F0ZU9wQ29kZUhhbmRsZSAoKTsNCiAgQVNTRVJUIChFbmRPcENvZGVIYW5kbGUgIT0gTlVMTCk7DQoNCiAgLy8NCiAgLy8gQ3JlYXRlIEhpaSBFeHRlbmQgTGFiZWwgT3BDb2RlIGFzIHRoZSBzdGFydCBvcGNvZGUNCiAgLy8NCiAgU3RhcnRMYWJlbCA9IChFRklfSUZSX0dVSURfTEFCRUwgKikgSGlpQ3JlYXRlR3VpZE9wQ29kZSAoU3RhcnRPcENvZGVIYW5kbGUsICZnRWZpSWZyVGlhbm9HdWlkLCBOVUxMLCBzaXplb2YgKEVGSV9JRlJfR1VJRF9MQUJFTCkpOw0KICBTdGFydExhYmVsLT5FeHRlbmRPcENvZGUgPSBFRklfSUZSX0VYVEVORF9PUF9MQUJFTDsNCiAgU3RhcnRMYWJlbC0+TnVtYmVyICAgICAgID0gTGFiZWw7DQoNCiAgLy8NCiAgLy8gQ3JlYXRlIEhpaSBFeHRlbmQgTGFiZWwgT3BDb2RlIGFzIHRoZSBlbmQgb3Bjb2RlDQogIC8vDQogIEVuZExhYmVsID0gKEVGSV9JRlJfR1VJRF9MQUJFTCAqKSBIaWlDcmVhdGVHdWlkT3BDb2RlIChFbmRPcENvZGVIYW5kbGUsICZnRWZpSWZyVGlhbm9HdWlkLCBOVUxMLCBzaXplb2YgKEVGSV9JRlJfR1VJRF9MQUJFTCkpOw0KICBFbmRMYWJlbC0+RXh0ZW5kT3BDb2RlID0gRUZJX0lGUl9FWFRFTkRfT1BfTEFCRUw7DQogIEVuZExhYmVsLT5OdW1iZXIgICAgICAgPSAweGZmZmY7DQoNCiAgaWYgKEFkZERhdGEpIHsNCiAgICBpZiAoRGF0YS0+RGF0YUNvdW50ICE9IDApIHsNCg0KICAgICAgVGh1bmtDb250ZXh0ID0gVWVmaUhpaUhhbmRsZVRvVGh1bmtDb250ZXh0IChQcml2YXRlLCBVZWZpSGlpSGFuZGxlKTsNCiAgICAgIFN0YXR1cyA9IEZ3VXBkYXRlRGF0YVRvVWVmaVVwZGF0ZURhdGEgKFRodW5rQ29udGV4dCwgRGF0YSwgU3RhcnRPcENvZGVIYW5kbGUpOw0KICAgICAgQVNTRVJUX0VGSV9FUlJPUiAoU3RhdHVzKTsNCg0KICAgICAgU3RhdHVzID0gSGlpVXBkYXRlRm9ybSAoVWVmaUhpaUhhbmRsZSwgJkZvcm1zZXRHdWlkLCBGb3JtSWQsIFN0YXJ0T3BDb2RlSGFuZGxlLCBOVUxMKTsNCiAgICAgIEFTU0VSVF9FRklfRVJST1IgKFN0YXR1cyk7DQogICAgfQ0KICB9IGVsc2Ugew0KICAgIC8vDQogICAgLy8gRGVsZXRlIE9wY29kZSBzdGFydGluZyBmcm9tIExhYmUgaW4gRm9ybUlkIGZvdW5kDQogICAgLy8NCiAgICBTdGF0dXMgPSBIaWlVcGRhdGVGb3JtIChVZWZpSGlpSGFuZGxlLCAmRm9ybXNldEd1aWQsIEZvcm1JZCwgU3RhcnRPcENvZGVIYW5kbGUsIEVuZE9wQ29kZUhhbmRsZSk7DQogICAgQVNTRVJUX0VGSV9FUlJPUiAoU3RhdHVzKTsNCiAgfQ0KDQogIEhpaUZyZWVPcENvZGVIYW5kbGUgKFN0YXJ0T3BDb2RlSGFuZGxlKTsNCiAgSGlpRnJlZU9wQ29kZUhhbmRsZSAoRW5kT3BDb2RlSGFuZGxlKTsNCg0KRG9uZToNCg0KICBtSW5GcmFtZXdvcmtVcGRhdGVQYWtjYWdlID0gRkFMU0U7IA0KDQogIGdCUy0+UmVzdG9yZVRQTCAoT2xkVHBsKTsNCg0KICByZXR1cm4gU3RhdHVzOw0KfQ0K