ZGlmZiAtLWdpdCBhL0FOTk9VTkNFIGIvQU5OT1VOQ0UKaW5kZXggZjJlN2ZhYy4uOTkzODdmYiAxMDA2NDQKLS0tIGEvQU5OT1VOQ0UKKysrIGIvQU5OT1VOQ0UKQEAgLTEsMTMgKzEsMTMgQEAKLVRoaXMgaXMgcmVsZWFzZSA5ODAyMTUgb2YgV2luZSwgdGhlIE1TIFdpbmRvd3MgZW11bGF0b3IuICBUaGlzIGlzIHN0aWxsIGEKK1RoaXMgaXMgcmVsZWFzZSA5ODAzMDEgb2YgV2luZSwgdGhlIE1TIFdpbmRvd3MgZW11bGF0b3IuICBUaGlzIGlzIHN0aWxsIGEKIGRldmVsb3BlcidzIG9ubHkgcmVsZWFzZS4gIFRoZXJlIGFyZSBtYW55IGJ1Z3MgYW5kIG1hbnkgdW5pbXBsZW1lbnRlZCBBUEkKIGZlYXR1cmVzLiAgTW9zdCBhcHBsaWNhdGlvbnMgc3RpbGwgZG8gbm90IHdvcmsgY29ycmVjdGx5LgogCiBQYXRjaGVzIHNob3VsZCBiZSBzdWJtaXR0ZWQgdG8gImp1bGxpYXJkQGxyYy5lcGZsLmNoIi4gIFBsZWFzZSBkb24ndAogZm9yZ2V0IHRvIGluY2x1ZGUgYSBDaGFuZ2VMb2cgZW50cnkuCiAKLVdIQVQnUyBORVcgd2l0aCBXaW5lLTk4MDIxNTogKHNlZSBDaGFuZ2VMb2cgZm9yIGRldGFpbHMpCi0JLSBQcmVsaW1pbmFyeSBjb25zb2xlIGFsbG9jYXRpb24gc3VwcG9ydC4KLQktIEhvcGVmdWxseSBubyBtb3JlIFhsaWIgZXJybm8gcHJvYmxlbXMuCitXSEFUJ1MgTkVXIHdpdGggV2luZS05ODAzMDE6IChzZWUgQ2hhbmdlTG9nIGZvciBkZXRhaWxzKQorCS0gTmV3IGRlYnVnZ2luZyBwcmludGZzIHNjaGVtZS4KKwktIEJldHRlciBET1MgZGV2aWNlIGhhbmRsaW5nLgogCS0gTG90cyBvZiBidWcgZml4ZXMuCiAKIFNlZSB0aGUgUkVBRE1FIGZpbGUgaW4gdGhlIGRpc3RyaWJ1dGlvbiBmb3IgaW5zdGFsbGF0aW9uIGluc3RydWN0aW9ucy4KQEAgLTE2LDEwICsxNiwxMCBAQAogdGhlIHJlbGVhc2UgaXMgYXZhaWxhYmxlIGF0IHRoZSBmdHAgc2l0ZXMuICBUaGUgc291cmNlcyB3aWxsIGJlIGF2YWlsYWJsZQogZnJvbSB0aGUgZm9sbG93aW5nIGxvY2F0aW9uczoKIAotICBmdHA6Ly9zdW5zaXRlLnVuYy5lZHUvcHViL0xpbnV4L0FMUEhBL3dpbmUvZGV2ZWxvcG1lbnQvV2luZS05ODAyMTUudGFyLmd6Ci0gIGZ0cDovL3RzeC0xMS5taXQuZWR1L3B1Yi9saW51eC9BTFBIQS9XaW5lL2RldmVsb3BtZW50L1dpbmUtOTgwMjE1LnRhci5negotICBmdHA6Ly9mdHAuaW5mb21hZ2ljLmNvbS9wdWIvbWlycm9ycy9saW51eC93aW5lL2RldmVsb3BtZW50L1dpbmUtOTgwMjE1LnRhci5negotICBmdHA6Ly9mdHAucHJvZ3NvYy51dHMuZWR1LmF1L3B1Yi9XaW5lL2RldmVsb3BtZW50L1dpbmUtOTgwMjE1LnRhci5negorICBmdHA6Ly9zdW5zaXRlLnVuYy5lZHUvcHViL0xpbnV4L0FMUEhBL3dpbmUvZGV2ZWxvcG1lbnQvV2luZS05ODAzMDEudGFyLmd6CisgIGZ0cDovL3RzeC0xMS5taXQuZWR1L3B1Yi9saW51eC9BTFBIQS9XaW5lL2RldmVsb3BtZW50L1dpbmUtOTgwMzAxLnRhci5negorICBmdHA6Ly9mdHAuaW5mb21hZ2ljLmNvbS9wdWIvbWlycm9ycy9saW51eC93aW5lL2RldmVsb3BtZW50L1dpbmUtOTgwMzAxLnRhci5negorICBmdHA6Ly9mdHAucHJvZ3NvYy51dHMuZWR1LmF1L3B1Yi9XaW5lL2RldmVsb3BtZW50L1dpbmUtOTgwMzAxLnRhci5negogCiBJdCBzaG91bGQgYWxzbyBiZSBhdmFpbGFibGUgZnJvbSBhbnkgc2l0ZSB0aGF0IG1pcnJvcnMgdHN4LTExIG9yIHN1bnNpdGUuCiAKZGlmZiAtLWdpdCBhL0FVVEhPUlMgYi9BVVRIT1JTCmluZGV4IDA5YWFkM2YuLjQ1ODA4NDUgMTAwNjQ0Ci0tLSBhL0FVVEhPUlMKKysrIGIvQVVUSE9SUwpAQCAtMTAsNiArMTAsNyBAQAogTWFydGluIEF5b3R0ZSwKIEthcmwgQmFja3N0cvZtLAogUGV0ZXIgQmFqdXN6LAorTWFyY2VsIEJhdXIsCiBHZW9yZyBCZXllcmxlLAogUm9zcyBCaXJvLAogTWFydGluIEJvZWhtZSwKZGlmZiAtLWdpdCBhL0NoYW5nZUxvZyBiL0NoYW5nZUxvZwppbmRleCA3ZWU3YWQ0Li5hNzdjZGMzIDEwMDY0NAotLS0gYS9DaGFuZ2VMb2cKKysrIGIvQ2hhbmdlTG9nCkBAIC0xLDQgKzEsMTY3IEBACiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCitTdW4gRmViIDI5IDEwOjQ1OjIzIDE5OTcgIEFuZHJlYXMgTW9ociA8MTAwLjMwOTM2QGdlcm1hbnkubmV0PgorCisJKiBbbG9hZGVyL25lX2ltYWdlLmNdCisJRml4ZWQgcHJvYmxlbSB3aXRoIHdlaXJkIERMTHMgKE5FX0ZGTEFHU19TSU5HTEVEQVRBICYmIERHUk9VUCA9IDApLgorCisJKiBbbXNkb3MvZG9zbWVtLmNdCisJRXhwb3J0IGFkZHJlc3MgZm9yIF9fMDAwMEgsIHRvby4KKworCSogW21zZG9zL2RwbWkuY10KKwlDaGFuZ2VkIE1lbUFsbG9jIGZ1bmN0aW9ucyB0byByZXR1cm4gbGVzcyBmcmFnbWVudGVkIGFkZHJlc3Nlcy4KKworU2F0IEZlYiAyOCAxODo1MDoxMiAxOTk4ICBBbGV4YW5kcmUgSnVsbGlhcmQgIDxqdWxsaWFyZEBscmMuZXBmbC5jaD4KKworCSogW3NjaGVkdWxlci9wcm9jZXNzLmNdIFtzY2hlZHVsZXIvc3lzZGVwcy5jXQorCURvbid0IHVzZSAlZnMgcmVnaXN0ZXIgYmVmb3JlIHRocmVhZGluZyBpbml0aWFsaXphdGlvbi4KKworU2F0IEZlYiAyOCAxNDowNDo1NiAxOTk4ICBLcmlzdGlhbiBOaWVsc2VuICA8a3Jpc3RpYW4ubmllbHNlbkByaXNvZS5kaz4KKworCSogW2NvbmZpZ3VyZS5pbl0gW2luY2x1ZGUvYWNjb25maWcuaF0KKwlBdXRvY29uZiBtYWNybyB0byBjaGVjayBmb3Igbm9uLXJlZW50cmFudCBYIGxpYnJhcmllcy4KKworCSogW3dpbmRvd3Mvd2lucG9zLmNdCisJSW4gU2V0V2luZG93UG9zMzIoKSwgZG8gbm90IGNhdXNlIFdNX1NJWkUgbWVzc2FnZXMgd2hlbiB0aGUKKwlTV1BfTk9TSVpFIGZsYWcgaXMgc3BlY2lmaWVkLiBUaGlzIGZpeGVzIHRoZSBkaXZpc2lvbi1ieS16ZXJvIGluCisJQm9ybGFuZCBDKysgNC4wICJPcGVuIFByb2plY3QiIG1lbnUgaXRlbS4KKworU2F0IEZlYiAyOCAxMzoxMToyNiAxOTk4ICBKYW1lcyBNb29keSAgPDAxMzI2M21AZHJhZ29uLmFjYWRpYXUuY2E+CisKKwkqIFtvbGUvb2xlMm5scy5jXQorCUNoYW5nZWQgIkVuZ2xpc2giIHZhbHVlcyBmcm9tIEdlcm1hbiB0byBFbmdsaXNoLgorCisJKiBbZmlsZXMvZG9zX2ZzLmNdCisJRml4ZWQgb2ZmLWJ5LW9uZSBtb250aCBidWcuCisKK0ZyaSBGZWIgMjcgMjI6MTI6MDEgMTk5OCAgRG91Z2xhcyBSaWRnd2F5ICA8cmlkZ3dheUB3aW5laHEuY29tPgorCisJKiBbd2luZG93cy93aW4uY10KKwlGaXggd2luZWxpYiBjbGFzcyBtZW51IGxvYWRpbmcgYnVnLgorCisJKiBbaW5jbHVkZS9tb2R1bGUuaF0gW2xvYWRlci9tb2R1bGUuY10KKwlMb2FkTW9kdWxlMzIgc2hvdWxkIGJlIGltcGxlbWVudGVkIGluIHRlcm1zIG9mIENyZWF0ZVByb2Nlc3MuCisKKwkqIFtwcm9ncmFtcy92aWV3LypdCisJTWV0YWZpbGUgdmlld2VyIHNhbXBsZSBwcm9ncmFtLgorCisJKiBbZG9jdW1lbnRhdGlvbi93aW5lLnRleGluZm9dIFtkb2N1bWVudGF0aW9uL01ha2VmaWxlLmluXQorCUltcHJvdmVtZW50cyBhbmQgYWRkaXRpb25zLCBIVE1MIHRhcmdldC4KKworRnJpIEZlYiAyNyAwNDoyNzo0OCAxOTk4ICBEaW1pdHJpZSBPLiBQYXVuIDxkaW1pQGNzLnRvcm9udG8uZWR1PgorCisJKiBbKi8qXQorCVN3aXRjaGVkIHRvIHRoZSBuZXcgZGVidWcgbWVzc2FnZXMgaW50ZXJmYWNlLiBGb3IgbW9yZSBpbmZvcm1hdGlvbgorCXBsZWFzZSByZWZlciB0byBkb2N1bWVudGF0aW9uL2RlYnVnLW1zZ3MuIEJlY2F1c2UgdGhlIG5ldyBzY2hlbWUKKwlpbnRyb2R1Y2VzIGEgbmV3IHNlbWFudGljIGxldmVsLCBJIGhhZCB0byBtYW51YWxseSBkbyB0aHJvdWdoCisJYWJvdXQgNTMwIGRwcmludGZfeHh4ISAgVGhlIHJlc3Qgb2YgYWJvdXQgMjQwMCB3aGVyZSB0cmFuc2Zvcm1lZAorCXZpYSBhIHNjcmlwdC4gIEJlY2F1c2Ugb2YgdGhlIGxhcmdlIG51bWJlciBvZiBjaGFuZ2VzIHRoYXQgSSBoYWQKKwl0byBkbywgc29tZSBtYXkgaGF2ZSBub3QgY29tZSBvdXQgYXMgbmljZWx5IGFzIEkgd2FudGVkIHRoZW0uICBJZgorCXRoaXMgaXMgdGhlIGNhc2UsIHBsZWFzZSBsZXQgbWUga25vdy4gVGhlcmUgaXMgYSBsb3Qgb2Ygd29yayBsZWZ0CisJdG8gZG86IC0tIGEgZmV3IGh1bmRyZWQgcHJpbnRmJ3MgdG8gYmUgY29udmVydGVkIC0tIGFib3V0IDIzMDAKKwlmcHJpbnRmJ3MgdG8gYmUgY29udmVydGVkIC0tIGFib3V0IDYwMCBGSVhNRSdzIHRvIGJlIHRyYW5zZm9ybWVkCisJVGhlIHByb2JsZW0gaXMgdGhhdCBpbiB0aGUgYWJvdmUgbWVudGlvbmVkIGNhc2VzLCBhIGxvdCBvZiBtYW51YWwKKwlpbnRlcnZlbnRpb24gaXMgcmVxdWlyZWQgYmVjYXVzZSBhIGxvdCBvZiB0aGUgaW5mb3JtYXRpb24gaXMKKwltaXNzaW5nLiAgVGhlcmUgYXJlIGFsc28gYSBsb3Qgb2Ygb3RoZXIgdGhpbmdzIHRvIGJlIGRvbmUgdG8gdGhlCisJaW50ZXJmYWNlIGFuZCBzbyBmb3J0aC4gSSBoYXZlIG5vdyBpZGVhcyBmb3IgYSBhdCBsZWFzdCBhIG1vbnRoCisJd29ydGggb2YgZnVsbCB0aW1lIHdvcmsgOikgSSB3aWxsIHByb2NlZWQgd2l0aCBtYW55IGNoYW5nZXMgaW4gdGhlCisJbmV4dCBmZXcgcmVsZWFzZXMsIHNvIHBsZWFzZSBkbyBub3Qgc3RhcnQgbW9kaWZpbmcgdGhpbmdzIGJlY2F1c2UKKwl0aGVyZSB3aWxsIGJlIGEgaGVsbCBvZiBhIGxvdCBvZiBjb25mbGljdHMuIElmIHlvdSBoYXZlIGlkZWFzIHRoYXQKKwl5b3Ugd2FudCB0byBpbnRlZ3JhdGUgb3IgeW91IHdhbnQgdG8gd29yayBvbiBkaWZmZXJlbnQgdGhpbmdzLAorCXBsZWFzZSBjb29yZGluYXRlIHdpdGggbWUuCisKK1RodSBGZWIgMjYgMTM6MDQ6MjkgMTk5OCAgRGF2aWQgTGVlIExhbWJlcnQgPGxhbWJlcjQ1QGVnci5tc3UuZWR1PgorCisJKiBbb2xlL29sZTJubHMuY10gW2luY2x1ZGUvd2luZG93cy5oXQorCUZpcnN0IHRyeSBhdCBPTEUgZGF0ZS0gYW5kIHRpbWUtZm9ybWF0dGluZyBmdW5jdGlvbnMuCisKK1dlZCBGZWIgMjUgMTE6MjA6MzUgMTk5OCBNYXJjdXMgTWVpc3NuZXIgPG1zbWVpc3NuQGNpcC5pbmZvcm1hdGlrLnVuaS1lcmxhbmdlbi5kZT4KKworCSogW2ZpbGVzLyouY10KKwlDaGFuZ2VkIGRvcyBkZXZpY2UgaGFuZGxpbmcsIGFkZGVkICdDT04nIGRldmljZWhhbmRsaW5nLgorCisJKiBbZ3JhcGhpY3MvZGRyYXcuY10KKwlCdWcgZml4ZXMsIHNvbWUgYWRkaXRpb25zLgorCisJKiBbaWYxNjMyL2J1aWx0aW4uY11bbG9hZGVyL21vZHVsZS5jXVtsaWJyYXJ5L3dpbmVzdHViLmNdCisJU21hbGwgaGFjayBzbyB3ZSBkb24ndCBuZWVkIGEgZHVtbXkgQlVJTFRJTl9Mb2FkTW9kdWxlCisJaW4gd2luZXN0dWIuYy4KKworCSogW29sZS8qXVtyZWxheTMyL29sZTMyLnNwZWNdW2lmMTYzMi9zdG9yYWdlLnNwZWNdCisJc3RvcmFnZS5kbGwgc3RhcnRlZC4gd2lud29yZCBsb2FkcyBkb2N1bWVudHMgKHNhdmluZworCWRvZXNuJ3Qgd29yayB5ZXQsIGR1bm5vIHdoeSkuCisJU2V2ZXJhbCBvbGUgYWRkaXRpb25zLCBzb21lIGNsZWFudXBzIGFuZCBidWdmaXhlcy4KKwlJTWFsbG9jMTYgaW1wbGVtZW50ZWQuCisKKwkqIFtsb2FkZXIvcGVfaW1hZ2UuY10KKwlBZGRlZCBzb21lIGNvbW1lbnRzLCBmaXhlZCBjaXJjdWxhciBkbGwgcmVmZXJlbmNlcywKKwlmaXhlZCBtb2RyZWYgb3JkZXJpbmcsIGZpeGVkIHRscyBhbGxvY2F0aW9uLgorCisJKiBbbWVtb3J5L2dsb2JhbC5jXQorCUFkZGVkIHZhbGlkaXR5IGNoZWNrcyBiZWZvcmUgZXZlcnkgR0VUX0FSRU5BX1BUUi4KKwkoc2V2ZXJhbCBmdW5jdGlvbnMgcmVseSBvbiBHbG9iYWwqIHJldHVybiB2YWx1ZXMKKwkgb24gaW52YWxpZCBoYW5kbGVzLCBsaWtlIElzVGFzaykuCisJSW1wbGVtZW50ZWQgR2xvYmFsVW5sb2NrRnJlZTE2LgorCisJKiBbbWVtb3J5L3ZpcnR1YWwuY10KKwlSZXBsYWNlZCBkcHJpbnRmX3ZpcnR1YWwgYnkgZnByaW50Ziwgc28gd2UgY2FuCisJZG8gJ2luZm8gbWFwJyBhZ2FpbiBpbiB0aGUgZGVidWdnZXIuIEluY3JlYXNlIHJlYWQKKwlsaW5lc2l6ZSBmb3IgTGludXgyLjEgY2FzZXMuCisKKwkqIFttaXNjL2NwdS5jXVttaXNjL3JlZ2lzdHJ5LmNdCisJTW92ZWQgY3B1IHJlZ2lzdHJ5IGluaXRpYWxpemF0aW9uIHRvIG1pc2MvY3B1LmMuCisKKwkqIFttdWx0aW1lZGlhL2Rzb3VuZC5jXQorCUVuaGFuY2VkLCByZXBsYWNlZCBHRVRPU1BBQ0UgYnVmZmVyaW5nY2hlY2sgYnkgU0VURlJBR01FTlQuCisKKwkqIFtyZWxheTMyL2NydGRsbC5zcGVjXVtyZWxheTMyL250ZGxsLnNwZWNdCisJUmVwbGFjZWQgc29tZSBwdHIgYnkgcmVzcGVjdGl2ZSAnc3RyJyBhbmQgJ3dzdHInIGFyZ3VtZW50cworCWZvciBsaWJjIGZ1bmN0aW9ucy4KKworCSogW3NjaGVkdWxlci90aHJlYWQuY10KKwlBZGRlZCBzb21lIHNhbml0eSBjaGVja3MgdG8gc3RhY2thbGxvY2F0aW9uLCB0bHNoYW5kbGluZyBmaXhlZC4KKworCSogW3Rvb2xzL2J1aWxkLmNdCisJRml4ZWQgY2RlY2wgYXJndW1lbnR0eXBlIG9yZGVyICh3YXMgcmV2ZXJzZWQpLgorCisJKiBbd2luMzIvb3JkaW5hbHMuY10KKwlJbXBsZW1lbnRlZCBLRVJORUxfNDQ5LgorCisJKiBbd2luZG93cy9kaW5wdXQuY10KKwlTb21lIGZpeGVzLCBuZWVkcyBtdWNoIG1vcmUgd29yay4gVG9tYiBSYWlkZXIyIHdvcmtzIHdpdGgga2V5Ym9hcmQgOykKKworVHVlIEZlYiAyNCAyMDo0NjozNyAxOTk4ICBKYW1lcyBKdXJhbiAgIDxqcmoxMjBAcHN1LmVkdT4KKworCSogW3dpbmRvd3Mvd2luLmNdCisJRml4ZWQgVVNFUjMyIG9yZGluYWwgbnVtYmVycyBpbiBkb2N1bWVudGF0aW9uLgorCitTYXQgRmViIDIxIDEyOjMwOjM4IDE5OTggIEpvaG4gUmljaGFyZHNvbiA8anJpY2hhcmRAemtvLmRlYy5jb20+CisKKwkqIFtmaWxlcy9maWxlLmNdIFtpbmNsdWRlL2szMm9iai5oXSBbbWVtb3J5L3ZpcnR1YWwuY10KKwlbc2NoZWR1bGVyL2NyaXRzZWN0aW9uLmNdIFtzY2hlZHVsZXIvZXZlbnQuY10gW3NjaGVkdWxlci9oYW5kbGUuY10KKwlbc2NoZWR1bGVyL2szMm9iai5jXSBbc2NoZWR1bGVyL211dGV4LmNdIFtzY2hlZHVsZXIvcHJvY2Vzcy5jXQorCVtzY2hlZHVsZXIvc2VtYXBob3JlLmNdIFtzY2hlZHVsZXIvdGhyZWFkLmNdCisJQWRkZWQgZ2VuZXJpYyBrMzJvYmogcmVhZCBhbmQgd3JpdGUgcm91dGluZXMgZm9yIGszMm9ianMgdGhhdAorCXN1cHBvcnQgSS9PLgorCisJKiBbZG9jdW1lbnRhdGlvbi9jb25zb2xlXQorCVVwZGF0ZWQgY29uc29sZSBkb2NzLgorCisJKiBbd2luMzIvY29uc29sZS5jXQorCU1ha2UgY29uc29sZSB3b3JrIGxpa2UgYSBrMzJvYmogdGhhdCBzdXBwb3J0cyBJL08uCisKKwkqIFtpbmNsdWRlL3dpbmRvd3MuaF0KKwlNYWtlIFdyaXRlRmlsZSBhbmQgUmVhZEZpbGUgdGFrZSBIQU5ETEUzMiBmb3IgaGFuZGxlLgorCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCitTdW4gRmViIDE1IDE0OjA3OjA3IDE5OTggIERpbWl0cmllIE8uIFBhdW4gIDxkaW1pQG1haWwuY3MudG9yb250by5lZHU+CisKKwkqIFtjb250cm9scy9tZW51LmNdIFttaXNjL3Zlci5jXSBbbXVsdGltZWRpYS9kc291bmQuY10KKwkgIFttdWx0aW1lZGlhL2pveXN0aWNrLmNdIFt3aW5kb3dzL2RpYWxvZy5jXQorCU1vZGlmaWVkIHNvbWUgZHByaW50Zl94eHgncyB0byBwcmVwYXJlIHRoZW0gZm9yIGEgbmV3CisJZHByaW50Zl8gc2NoZW1lLiBCYXNpY2FsbHksIEkgY2hhbmdlZCB0aGUgZHByaW50ZidzIHRoYXQKKwlvdXRwdXRlZCBhIGxpbmUgd2l0aCBtYW55IGRwcmludGYgY2FsbHMgdG8gZG8ganVzdCBvbmUKKwlkcHJpbnRmIGNhbGwuCisKIFN1biBGZWIgMTUgMTI6MDI6NTkgMTk5OCAgQWxleGFuZHJlIEp1bGxpYXJkICA8anVsbGlhcmRAbHJjLmVwZmwuY2g+CiAKIAkqIFtncmFwaGljcy94MTFkcnYvKi5jXSBbb2JqZWN0cy8qLmNdCmRpZmYgLS1naXQgYS9jb25maWd1cmUgYi9jb25maWd1cmUKaW5kZXggNDRlZmRhZS4uMGFhZGZhMyAxMDA3NTUKLS0tIGEvY29uZmlndXJlCisrKyBiL2NvbmZpZ3VyZQpAQCAtMTcsNiArMTcsOCBAQAogYWNfaGVscD0iJGFjX2hlbHAKICAgLS1lbmFibGUtZGxsICAgICAgICAgICAgYnVpbGQgdGhlIFdpbmUgbGlicmFyeSBhcyBhIERMTCIKIGFjX2hlbHA9IiRhY19oZWxwCisgIC0td2l0aG91dC1yZWVudHJhbnQteCAgIENvbXBpbGUgZm9yIHVzZSB3aXRoIG5vbi1yZWVudHJhbnQgWCBsaWJyYXJpZXMiCithY19oZWxwPSIkYWNfaGVscAogICAtLXdpdGgteCAgICAgICAgICAgICAgICB1c2UgdGhlIFggV2luZG93IFN5c3RlbSIKIAogIyBJbml0aWFsaXplIHNvbWUgdmFyaWFibGVzIHNldCBieSBvcHRpb25zLgpAQCAtNTY5LDEzICs1NzEsMjAgQEAKIAogCiAKKyMgQ2hlY2sgd2hldGhlciAtLXdpdGgtcmVlbnRyYW50LXggb3IgLS13aXRob3V0LXJlZW50cmFudC14IHdhcyBnaXZlbi4KK2lmIHRlc3QgIiR7d2l0aF9yZWVudHJhbnRfeCtzZXR9IiA9IHNldDsgdGhlbgorICB3aXRodmFsPSIkd2l0aF9yZWVudHJhbnRfeCIKKyAgOgorZmkKKworCiAKIAogCiAKIAogZWNobyAkYWNfbiAiY2hlY2tpbmcgd2hldGhlciAke01BS0UtbWFrZX0gc2V0cyBcJHtNQUtFfSIiLi4uICRhY19jIiAxPiY2Ci1lY2hvICJjb25maWd1cmU6NTc5OiBjaGVja2luZyB3aGV0aGVyICR7TUFLRS1tYWtlfSBzZXRzIFwke01BS0V9IiA+JjUKK2VjaG8gImNvbmZpZ3VyZTo1ODg6IGNoZWNraW5nIHdoZXRoZXIgJHtNQUtFLW1ha2V9IHNldHMgXCR7TUFLRX0iID4mNQogc2V0IGR1bW15ICR7TUFLRS1tYWtlfTsgYWNfbWFrZT1gZWNobyAiJDIiIHwgc2VkICd5JS4vKy0lX19wXyUnYAogaWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FjX2N2X3Byb2dfbWFrZV8ke2FjX21ha2V9X3NldCcrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCiAgIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2CkBAIC02MDQsNyArNjEzLDcgQEAKICMgRXh0cmFjdCB0aGUgZmlyc3Qgd29yZCBvZiAiZ2NjIiwgc28gaXQgY2FuIGJlIGEgcHJvZ3JhbSBuYW1lIHdpdGggYXJncy4KIHNldCBkdW1teSBnY2M7IGFjX3dvcmQ9JDIKIGVjaG8gJGFjX24gImNoZWNraW5nIGZvciAkYWNfd29yZCIiLi4uICRhY19jIiAxPiY2Ci1lY2hvICJjb25maWd1cmU6NjA4OiBjaGVja2luZyBmb3IgJGFjX3dvcmQiID4mNQorZWNobyAiY29uZmlndXJlOjYxNzogY2hlY2tpbmcgZm9yICRhY193b3JkIiA+JjUKIGlmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhY19jdl9wcm9nX0NDJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KICAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKIGVsc2UKQEAgLTYzMyw3ICs2NDIsNyBAQAogICAjIEV4dHJhY3QgdGhlIGZpcnN0IHdvcmQgb2YgImNjIiwgc28gaXQgY2FuIGJlIGEgcHJvZ3JhbSBuYW1lIHdpdGggYXJncy4KIHNldCBkdW1teSBjYzsgYWNfd29yZD0kMgogZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yICRhY193b3JkIiIuLi4gJGFjX2MiIDE+JjYKLWVjaG8gImNvbmZpZ3VyZTo2Mzc6IGNoZWNraW5nIGZvciAkYWNfd29yZCIgPiY1CitlY2hvICJjb25maWd1cmU6NjQ2OiBjaGVja2luZyBmb3IgJGFjX3dvcmQiID4mNQogaWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FjX2N2X3Byb2dfQ0MnK3NldH0nYFwiID0gc2V0IjsgdGhlbgogICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgogZWxzZQpAQCAtNjgxLDcgKzY5MCw3IEBACiBmaQogCiBlY2hvICRhY19uICJjaGVja2luZyB3aGV0aGVyIHRoZSBDIGNvbXBpbGVyICgkQ0MgJENGTEFHUyAkTERGTEFHUykgd29ya3MiIi4uLiAkYWNfYyIgMT4mNgotZWNobyAiY29uZmlndXJlOjY4NTogY2hlY2tpbmcgd2hldGhlciB0aGUgQyBjb21waWxlciAoJENDICRDRkxBR1MgJExERkxBR1MpIHdvcmtzIiA+JjUKK2VjaG8gImNvbmZpZ3VyZTo2OTQ6IGNoZWNraW5nIHdoZXRoZXIgdGhlIEMgY29tcGlsZXIgKCRDQyAkQ0ZMQUdTICRMREZMQUdTKSB3b3JrcyIgPiY1CiAKIGFjX2V4dD1jCiAjIENGTEFHUyBpcyBub3QgaW4gYWNfY3BwIGJlY2F1c2UgLWcsIC1PLCBldGMuIGFyZSBub3QgdmFsaWQgY3BwIG9wdGlvbnMuCkBAIC02OTEsMTEgKzcwMCwxMSBAQAogY3Jvc3NfY29tcGlsaW5nPSRhY19jdl9wcm9nX2NjX2Nyb3NzCiAKIGNhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDxFT0YKLSNsaW5lIDY5NSAiY29uZmlndXJlIgorI2xpbmUgNzA0ICJjb25maWd1cmUiCiAjaW5jbHVkZSAiY29uZmRlZnMuaCIKIG1haW4oKXtyZXR1cm4oMCk7fQogRU9GCi1pZiB7IChldmFsIGVjaG8gY29uZmlndXJlOjY5OTogXCIkYWNfbGlua1wiKSAxPiY1OyAoZXZhbCAkYWNfbGluaykgMj4mNTsgfSAmJiB0ZXN0IC1zIGNvbmZ0ZXN0OyB0aGVuCitpZiB7IChldmFsIGVjaG8gY29uZmlndXJlOjcwODogXCIkYWNfbGlua1wiKSAxPiY1OyAoZXZhbCAkYWNfbGluaykgMj4mNTsgfSAmJiB0ZXN0IC1zIGNvbmZ0ZXN0OyB0aGVuCiAgIGFjX2N2X3Byb2dfY2Nfd29ya3M9eWVzCiAgICMgSWYgd2UgY2FuJ3QgcnVuIGEgdHJpdmlhbCBwcm9ncmFtLCB3ZSBhcmUgcHJvYmFibHkgdXNpbmcgYSBjcm9zcyBjb21waWxlci4KICAgaWYgKC4vY29uZnRlc3Q7IGV4aXQpIDI+L2Rldi9udWxsOyB0aGVuCkBAIC03MTUsMTIgKzcyNCwxMiBAQAogICB7IGVjaG8gImNvbmZpZ3VyZTogZXJyb3I6IGluc3RhbGxhdGlvbiBvciBjb25maWd1cmF0aW9uIHByb2JsZW06IEMgY29tcGlsZXIgY2Fubm90IGNyZWF0ZSBleGVjdXRhYmxlcy4iIDE+JjI7IGV4aXQgMTsgfQogZmkKIGVjaG8gJGFjX24gImNoZWNraW5nIHdoZXRoZXIgdGhlIEMgY29tcGlsZXIgKCRDQyAkQ0ZMQUdTICRMREZMQUdTKSBpcyBhIGNyb3NzLWNvbXBpbGVyIiIuLi4gJGFjX2MiIDE+JjYKLWVjaG8gImNvbmZpZ3VyZTo3MTk6IGNoZWNraW5nIHdoZXRoZXIgdGhlIEMgY29tcGlsZXIgKCRDQyAkQ0ZMQUdTICRMREZMQUdTKSBpcyBhIGNyb3NzLWNvbXBpbGVyIiA+JjUKK2VjaG8gImNvbmZpZ3VyZTo3Mjg6IGNoZWNraW5nIHdoZXRoZXIgdGhlIEMgY29tcGlsZXIgKCRDQyAkQ0ZMQUdTICRMREZMQUdTKSBpcyBhIGNyb3NzLWNvbXBpbGVyIiA+JjUKIGVjaG8gIiRhY190IiIkYWNfY3ZfcHJvZ19jY19jcm9zcyIgMT4mNgogY3Jvc3NfY29tcGlsaW5nPSRhY19jdl9wcm9nX2NjX2Nyb3NzCiAKIGVjaG8gJGFjX24gImNoZWNraW5nIHdoZXRoZXIgd2UgYXJlIHVzaW5nIEdOVSBDIiIuLi4gJGFjX2MiIDE+JjYKLWVjaG8gImNvbmZpZ3VyZTo3MjQ6IGNoZWNraW5nIHdoZXRoZXIgd2UgYXJlIHVzaW5nIEdOVSBDIiA+JjUKK2VjaG8gImNvbmZpZ3VyZTo3MzM6IGNoZWNraW5nIHdoZXRoZXIgd2UgYXJlIHVzaW5nIEdOVSBDIiA+JjUKIGlmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhY19jdl9wcm9nX2djYycrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCiAgIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2CiBlbHNlCkBAIC03MjksNyArNzM4LDcgQEAKICAgeWVzOwogI2VuZGlmCiBFT0YKLWlmIHsgYWNfdHJ5PScke0NDLWNjfSAtRSBjb25mdGVzdC5jJzsgeyAoZXZhbCBlY2hvIGNvbmZpZ3VyZTo3MzM6IFwiJGFjX3RyeVwiKSAxPiY1OyAoZXZhbCAkYWNfdHJ5KSAyPiY1OyB9OyB9IHwgZWdyZXAgeWVzID4vZGV2L251bGwgMj4mMTsgdGhlbgoraWYgeyBhY190cnk9JyR7Q0MtY2N9IC1FIGNvbmZ0ZXN0LmMnOyB7IChldmFsIGVjaG8gY29uZmlndXJlOjc0MjogXCIkYWNfdHJ5XCIpIDE+JjU7IChldmFsICRhY190cnkpIDI+JjU7IH07IH0gfCBlZ3JlcCB5ZXMgPi9kZXYvbnVsbCAyPiYxOyB0aGVuCiAgIGFjX2N2X3Byb2dfZ2NjPXllcwogZWxzZQogICBhY19jdl9wcm9nX2djYz1ubwpAQCAtNzQ0LDcgKzc1Myw3IEBACiAgIGFjX3NhdmVfQ0ZMQUdTPSIkQ0ZMQUdTIgogICBDRkxBR1M9CiAgIGVjaG8gJGFjX24gImNoZWNraW5nIHdoZXRoZXIgJHtDQy1jY30gYWNjZXB0cyAtZyIiLi4uICRhY19jIiAxPiY2Ci1lY2hvICJjb25maWd1cmU6NzQ4OiBjaGVja2luZyB3aGV0aGVyICR7Q0MtY2N9IGFjY2VwdHMgLWciID4mNQorZWNobyAiY29uZmlndXJlOjc1NzogY2hlY2tpbmcgd2hldGhlciAke0NDLWNjfSBhY2NlcHRzIC1nIiA+JjUKIGlmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhY19jdl9wcm9nX2NjX2cnK3NldH0nYFwiID0gc2V0IjsgdGhlbgogICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgogZWxzZQpAQCAtNzcyLDcgKzc4MSw3IEBACiBmaQogCiBlY2hvICRhY19uICJjaGVja2luZyBob3cgdG8gcnVuIHRoZSBDIHByZXByb2Nlc3NvciIiLi4uICRhY19jIiAxPiY2Ci1lY2hvICJjb25maWd1cmU6Nzc2OiBjaGVja2luZyBob3cgdG8gcnVuIHRoZSBDIHByZXByb2Nlc3NvciIgPiY1CitlY2hvICJjb25maWd1cmU6Nzg1OiBjaGVja2luZyBob3cgdG8gcnVuIHRoZSBDIHByZXByb2Nlc3NvciIgPiY1CiAjIE9uIFN1bnMsIHNvbWV0aW1lcyAkQ1BQIG5hbWVzIGEgZGlyZWN0b3J5LgogaWYgdGVzdCAtbiAiJENQUCIgJiYgdGVzdCAtZCAiJENQUCI7IHRoZW4KICAgQ1BQPQpAQCAtNzg3LDEzICs3OTYsMTMgQEAKICAgIyBPbiB0aGUgTmVYVCwgY2MgLUUgcnVucyB0aGUgY29kZSB0aHJvdWdoIHRoZSBjb21waWxlcidzIHBhcnNlciwKICAgIyBub3QganVzdCB0aHJvdWdoIGNwcC4KICAgY2F0ID4gY29uZnRlc3QuJGFjX2V4dCA8PEVPRgotI2xpbmUgNzkxICJjb25maWd1cmUiCisjbGluZSA4MDAgImNvbmZpZ3VyZSIKICNpbmNsdWRlICJjb25mZGVmcy5oIgogI2luY2x1ZGUgPGFzc2VydC5oPgogU3ludGF4IEVycm9yCiBFT0YKIGFjX3RyeT0iJGFjX2NwcCBjb25mdGVzdC4kYWNfZXh0ID4vZGV2L251bGwgMj5jb25mdGVzdC5vdXQiCi17IChldmFsIGVjaG8gY29uZmlndXJlOjc5NzogXCIkYWNfdHJ5XCIpIDE+JjU7IChldmFsICRhY190cnkpIDI+JjU7IH0KK3sgKGV2YWwgZWNobyBjb25maWd1cmU6ODA2OiBcIiRhY190cnlcIikgMT4mNTsgKGV2YWwgJGFjX3RyeSkgMj4mNTsgfQogYWNfZXJyPWBncmVwIC12ICdeICorJyBjb25mdGVzdC5vdXRgCiBpZiB0ZXN0IC16ICIkYWNfZXJyIjsgdGhlbgogICA6CkBAIC04MDQsMTMgKzgxMywxMyBAQAogICBybSAtcmYgY29uZnRlc3QqCiAgIENQUD0iJHtDQy1jY30gLUUgLXRyYWRpdGlvbmFsLWNwcCIKICAgY2F0ID4gY29uZnRlc3QuJGFjX2V4dCA8PEVPRgotI2xpbmUgODA4ICJjb25maWd1cmUiCisjbGluZSA4MTcgImNvbmZpZ3VyZSIKICNpbmNsdWRlICJjb25mZGVmcy5oIgogI2luY2x1ZGUgPGFzc2VydC5oPgogU3ludGF4IEVycm9yCiBFT0YKIGFjX3RyeT0iJGFjX2NwcCBjb25mdGVzdC4kYWNfZXh0ID4vZGV2L251bGwgMj5jb25mdGVzdC5vdXQiCi17IChldmFsIGVjaG8gY29uZmlndXJlOjgxNDogXCIkYWNfdHJ5XCIpIDE+JjU7IChldmFsICRhY190cnkpIDI+JjU7IH0KK3sgKGV2YWwgZWNobyBjb25maWd1cmU6ODIzOiBcIiRhY190cnlcIikgMT4mNTsgKGV2YWwgJGFjX3RyeSkgMj4mNTsgfQogYWNfZXJyPWBncmVwIC12ICdeICorJyBjb25mdGVzdC5vdXRgCiBpZiB0ZXN0IC16ICIkYWNfZXJyIjsgdGhlbgogICA6CkBAIC04MzcsNyArODQ2LDcgQEAKICMgVXNlcyBhY18gdmFycyBhcyB0ZW1wcyB0byBhbGxvdyBjb21tYW5kIGxpbmUgdG8gb3ZlcnJpZGUgY2FjaGUgYW5kIGNoZWNrcy4KICMgLS13aXRob3V0LXggb3ZlcnJpZGVzIGV2ZXJ5dGhpbmcgZWxzZSwgYnV0IGRvZXMgbm90IHRvdWNoIHRoZSBjYWNoZS4KIGVjaG8gJGFjX24gImNoZWNraW5nIGZvciBYIiIuLi4gJGFjX2MiIDE+JjYKLWVjaG8gImNvbmZpZ3VyZTo4NDE6IGNoZWNraW5nIGZvciBYIiA+JjUKK2VjaG8gImNvbmZpZ3VyZTo4NTA6IGNoZWNraW5nIGZvciBYIiA+JjUKIAogIyBDaGVjayB3aGV0aGVyIC0td2l0aC14IG9yIC0td2l0aG91dC14IHdhcyBnaXZlbi4KIGlmIHRlc3QgIiR7d2l0aF94K3NldH0iID0gc2V0OyB0aGVuCkBAIC04OTksMTIgKzkwOCwxMiBAQAogCiAgICMgRmlyc3QsIHRyeSB1c2luZyB0aGF0IGZpbGUgd2l0aCBubyBzcGVjaWFsIGRpcmVjdG9yeSBzcGVjaWZpZWQuCiBjYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8RU9GCi0jbGluZSA5MDMgImNvbmZpZ3VyZSIKKyNsaW5lIDkxMiAiY29uZmlndXJlIgogI2luY2x1ZGUgImNvbmZkZWZzLmgiCiAjaW5jbHVkZSA8JHhfZGlyZWN0X3Rlc3RfaW5jbHVkZT4KIEVPRgogYWNfdHJ5PSIkYWNfY3BwIGNvbmZ0ZXN0LiRhY19leHQgPi9kZXYvbnVsbCAyPmNvbmZ0ZXN0Lm91dCIKLXsgKGV2YWwgZWNobyBjb25maWd1cmU6OTA4OiBcIiRhY190cnlcIikgMT4mNTsgKGV2YWwgJGFjX3RyeSkgMj4mNTsgfQoreyAoZXZhbCBlY2hvIGNvbmZpZ3VyZTo5MTc6IFwiJGFjX3RyeVwiKSAxPiY1OyAoZXZhbCAkYWNfdHJ5KSAyPiY1OyB9CiBhY19lcnI9YGdyZXAgLXYgJ14gKisnIGNvbmZ0ZXN0Lm91dGAKIGlmIHRlc3QgLXogIiRhY19lcnIiOyB0aGVuCiAgIHJtIC1yZiBjb25mdGVzdCoKQEAgLTk3MywxNCArOTgyLDE0IEBACiAgIGFjX3NhdmVfTElCUz0iJExJQlMiCiAgIExJQlM9Ii1sJHhfZGlyZWN0X3Rlc3RfbGlicmFyeSAkTElCUyIKIGNhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDxFT0YKLSNsaW5lIDk3NyAiY29uZmlndXJlIgorI2xpbmUgOTg2ICJjb25maWd1cmUiCiAjaW5jbHVkZSAiY29uZmRlZnMuaCIKIAogaW50IG1haW4oKSB7CiAke3hfZGlyZWN0X3Rlc3RfZnVuY3Rpb259KCkKIDsgcmV0dXJuIDA7IH0KIEVPRgotaWYgeyAoZXZhbCBlY2hvIGNvbmZpZ3VyZTo5ODQ6IFwiJGFjX2xpbmtcIikgMT4mNTsgKGV2YWwgJGFjX2xpbmspIDI+JjU7IH0gJiYgdGVzdCAtcyBjb25mdGVzdDsgdGhlbgoraWYgeyAoZXZhbCBlY2hvIGNvbmZpZ3VyZTo5OTM6IFwiJGFjX2xpbmtcIikgMT4mNTsgKGV2YWwgJGFjX2xpbmspIDI+JjU7IH0gJiYgdGVzdCAtcyBjb25mdGVzdDsgdGhlbgogICBybSAtcmYgY29uZnRlc3QqCiAgIExJQlM9IiRhY19zYXZlX0xJQlMiCiAjIFdlIGNhbiBsaW5rIFggcHJvZ3JhbXMgd2l0aCBubyBzcGVjaWFsIGxpYnJhcnkgcGF0aC4KQEAgLTEwODYsMTcgKzEwOTUsMTcgQEAKICAgICBjYXNlICJgKHVuYW1lIC1zcikgMj4vZGV2L251bGxgIiBpbgogICAgICJTdW5PUyA1IiopCiAgICAgICBlY2hvICRhY19uICJjaGVja2luZyB3aGV0aGVyIC1SIG11c3QgYmUgZm9sbG93ZWQgYnkgYSBzcGFjZSIiLi4uICRhY19jIiAxPiY2Ci1lY2hvICJjb25maWd1cmU6MTA5MDogY2hlY2tpbmcgd2hldGhlciAtUiBtdXN0IGJlIGZvbGxvd2VkIGJ5IGEgc3BhY2UiID4mNQorZWNobyAiY29uZmlndXJlOjEwOTk6IGNoZWNraW5nIHdoZXRoZXIgLVIgbXVzdCBiZSBmb2xsb3dlZCBieSBhIHNwYWNlIiA+JjUKICAgICAgIGFjX3hzYXZlX0xJQlM9IiRMSUJTIjsgTElCUz0iJExJQlMgLVIkeF9saWJyYXJpZXMiCiAgICAgICBjYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8RU9GCi0jbGluZSAxMDkzICJjb25maWd1cmUiCisjbGluZSAxMTAyICJjb25maWd1cmUiCiAjaW5jbHVkZSAiY29uZmRlZnMuaCIKIAogaW50IG1haW4oKSB7CiAKIDsgcmV0dXJuIDA7IH0KIEVPRgotaWYgeyAoZXZhbCBlY2hvIGNvbmZpZ3VyZToxMTAwOiBcIiRhY19saW5rXCIpIDE+JjU7IChldmFsICRhY19saW5rKSAyPiY1OyB9ICYmIHRlc3QgLXMgY29uZnRlc3Q7IHRoZW4KK2lmIHsgKGV2YWwgZWNobyBjb25maWd1cmU6MTEwOTogXCIkYWNfbGlua1wiKSAxPiY1OyAoZXZhbCAkYWNfbGluaykgMj4mNTsgfSAmJiB0ZXN0IC1zIGNvbmZ0ZXN0OyB0aGVuCiAgIHJtIC1yZiBjb25mdGVzdCoKICAgYWNfUl9ub3NwYWNlPXllcwogZWxzZQpAQCAtMTExMiwxNCArMTEyMSwxNCBAQAogICAgICAgZWxzZQogCUxJQlM9IiRhY194c2F2ZV9MSUJTIC1SICR4X2xpYnJhcmllcyIKIAljYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8RU9GCi0jbGluZSAxMTE2ICJjb25maWd1cmUiCisjbGluZSAxMTI1ICJjb25maWd1cmUiCiAjaW5jbHVkZSAiY29uZmRlZnMuaCIKIAogaW50IG1haW4oKSB7CiAKIDsgcmV0dXJuIDA7IH0KIEVPRgotaWYgeyAoZXZhbCBlY2hvIGNvbmZpZ3VyZToxMTIzOiBcIiRhY19saW5rXCIpIDE+JjU7IChldmFsICRhY19saW5rKSAyPiY1OyB9ICYmIHRlc3QgLXMgY29uZnRlc3Q7IHRoZW4KK2lmIHsgKGV2YWwgZWNobyBjb25maWd1cmU6MTEzMjogXCIkYWNfbGlua1wiKSAxPiY1OyAoZXZhbCAkYWNfbGluaykgMj4mNTsgfSAmJiB0ZXN0IC1zIGNvbmZ0ZXN0OyB0aGVuCiAgIHJtIC1yZiBjb25mdGVzdCoKICAgYWNfUl9zcGFjZT15ZXMKIGVsc2UKQEAgLTExNTEsNyArMTE2MCw3IEBACiAgICAgIyBsaWJyYXJpZXMgd2VyZSBidWlsdCB3aXRoIERFQ25ldCBzdXBwb3J0LiAgQW5kIGthcmxAY3MudW1iLmVkdSBzYXlzCiAgICAgIyB0aGUgQWxwaGEgbmVlZHMgZG5ldF9zdHViIChkbmV0IGRvZXMgbm90IGV4aXN0KS4KICAgICBlY2hvICRhY19uICJjaGVja2luZyBmb3IgZG5ldF9udG9hIGluIC1sZG5ldCIiLi4uICRhY19jIiAxPiY2Ci1lY2hvICJjb25maWd1cmU6MTE1NTogY2hlY2tpbmcgZm9yIGRuZXRfbnRvYSBpbiAtbGRuZXQiID4mNQorZWNobyAiY29uZmlndXJlOjExNjQ6IGNoZWNraW5nIGZvciBkbmV0X250b2EgaW4gLWxkbmV0IiA+JjUKIGFjX2xpYl92YXI9YGVjaG8gZG5ldCdfJ2RuZXRfbnRvYSB8IHNlZCAneSUuLystJV9fcF8lJ2AKIGlmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhY19jdl9saWJfJGFjX2xpYl92YXInK3NldH0nYFwiID0gc2V0IjsgdGhlbgogICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgpAQCAtMTE1OSw3ICsxMTY4LDcgQEAKICAgYWNfc2F2ZV9MSUJTPSIkTElCUyIKIExJQlM9Ii1sZG5ldCAgJExJQlMiCiBjYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8RU9GCi0jbGluZSAxMTYzICJjb25maWd1cmUiCisjbGluZSAxMTcyICJjb25maWd1cmUiCiAjaW5jbHVkZSAiY29uZmRlZnMuaCIKIC8qIE92ZXJyaWRlIGFueSBnY2MyIGludGVybmFsIHByb3RvdHlwZSB0byBhdm9pZCBhbiBlcnJvci4gICovCiAvKiBXZSB1c2UgY2hhciBiZWNhdXNlIGludCBtaWdodCBtYXRjaCB0aGUgcmV0dXJuIHR5cGUgb2YgYSBnY2MyCkBAIC0xMTcwLDcgKzExNzksNyBAQAogZG5ldF9udG9hKCkKIDsgcmV0dXJuIDA7IH0KIEVPRgotaWYgeyAoZXZhbCBlY2hvIGNvbmZpZ3VyZToxMTc0OiBcIiRhY19saW5rXCIpIDE+JjU7IChldmFsICRhY19saW5rKSAyPiY1OyB9ICYmIHRlc3QgLXMgY29uZnRlc3Q7IHRoZW4KK2lmIHsgKGV2YWwgZWNobyBjb25maWd1cmU6MTE4MzogXCIkYWNfbGlua1wiKSAxPiY1OyAoZXZhbCAkYWNfbGluaykgMj4mNTsgfSAmJiB0ZXN0IC1zIGNvbmZ0ZXN0OyB0aGVuCiAgIHJtIC1yZiBjb25mdGVzdCoKICAgZXZhbCAiYWNfY3ZfbGliXyRhY19saWJfdmFyPXllcyIKIGVsc2UKQEAgLTExOTIsNyArMTIwMSw3IEBACiAKICAgICBpZiB0ZXN0ICRhY19jdl9saWJfZG5ldF9kbmV0X250b2EgPSBubzsgdGhlbgogICAgICAgZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yIGRuZXRfbnRvYSBpbiAtbGRuZXRfc3R1YiIiLi4uICRhY19jIiAxPiY2Ci1lY2hvICJjb25maWd1cmU6MTE5NjogY2hlY2tpbmcgZm9yIGRuZXRfbnRvYSBpbiAtbGRuZXRfc3R1YiIgPiY1CitlY2hvICJjb25maWd1cmU6MTIwNTogY2hlY2tpbmcgZm9yIGRuZXRfbnRvYSBpbiAtbGRuZXRfc3R1YiIgPiY1CiBhY19saWJfdmFyPWBlY2hvIGRuZXRfc3R1YidfJ2RuZXRfbnRvYSB8IHNlZCAneSUuLystJV9fcF8lJ2AKIGlmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhY19jdl9saWJfJGFjX2xpYl92YXInK3NldH0nYFwiID0gc2V0IjsgdGhlbgogICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgpAQCAtMTIwMCw3ICsxMjA5LDcgQEAKICAgYWNfc2F2ZV9MSUJTPSIkTElCUyIKIExJQlM9Ii1sZG5ldF9zdHViICAkTElCUyIKIGNhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDxFT0YKLSNsaW5lIDEyMDQgImNvbmZpZ3VyZSIKKyNsaW5lIDEyMTMgImNvbmZpZ3VyZSIKICNpbmNsdWRlICJjb25mZGVmcy5oIgogLyogT3ZlcnJpZGUgYW55IGdjYzIgaW50ZXJuYWwgcHJvdG90eXBlIHRvIGF2b2lkIGFuIGVycm9yLiAgKi8KIC8qIFdlIHVzZSBjaGFyIGJlY2F1c2UgaW50IG1pZ2h0IG1hdGNoIHRoZSByZXR1cm4gdHlwZSBvZiBhIGdjYzIKQEAgLTEyMTEsNyArMTIyMCw3IEBACiBkbmV0X250b2EoKQogOyByZXR1cm4gMDsgfQogRU9GCi1pZiB7IChldmFsIGVjaG8gY29uZmlndXJlOjEyMTU6IFwiJGFjX2xpbmtcIikgMT4mNTsgKGV2YWwgJGFjX2xpbmspIDI+JjU7IH0gJiYgdGVzdCAtcyBjb25mdGVzdDsgdGhlbgoraWYgeyAoZXZhbCBlY2hvIGNvbmZpZ3VyZToxMjI0OiBcIiRhY19saW5rXCIpIDE+JjU7IChldmFsICRhY19saW5rKSAyPiY1OyB9ICYmIHRlc3QgLXMgY29uZnRlc3Q7IHRoZW4KICAgcm0gLXJmIGNvbmZ0ZXN0KgogICBldmFsICJhY19jdl9saWJfJGFjX2xpYl92YXI9eWVzIgogZWxzZQpAQCAtMTI0MCwxMiArMTI0OSwxMiBAQAogICAgICMgVGhlIG5zbCBsaWJyYXJ5IHByZXZlbnRzIHByb2dyYW1zIGZyb20gb3BlbmluZyB0aGUgWCBkaXNwbGF5CiAgICAgIyBvbiBJcml4IDUuMiwgYWNjb3JkaW5nIHRvIGRpY2tleUBjbGFyay5uZXQuCiAgICAgZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yIGdldGhvc3RieW5hbWUiIi4uLiAkYWNfYyIgMT4mNgotZWNobyAiY29uZmlndXJlOjEyNDQ6IGNoZWNraW5nIGZvciBnZXRob3N0YnluYW1lIiA+JjUKK2VjaG8gImNvbmZpZ3VyZToxMjUzOiBjaGVja2luZyBmb3IgZ2V0aG9zdGJ5bmFtZSIgPiY1CiBpZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3ZfZnVuY19nZXRob3N0YnluYW1lJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KICAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKIGVsc2UKICAgY2F0ID4gY29uZnRlc3QuJGFjX2V4dCA8PEVPRgotI2xpbmUgMTI0OSAiY29uZmlndXJlIgorI2xpbmUgMTI1OCAiY29uZmlndXJlIgogI2luY2x1ZGUgImNvbmZkZWZzLmgiCiAvKiBTeXN0ZW0gaGVhZGVyIHRvIGRlZmluZSBfX3N0dWIgbWFjcm9zIGFuZCBob3BlZnVsbHkgZmV3IHByb3RvdHlwZXMsCiAgICAgd2hpY2ggY2FuIGNvbmZsaWN0IHdpdGggY2hhciBnZXRob3N0YnluYW1lKCk7IGJlbG93LiAgKi8KQEAgLTEyNjgsNyArMTI3Nyw3IEBACiAKIDsgcmV0dXJuIDA7IH0KIEVPRgotaWYgeyAoZXZhbCBlY2hvIGNvbmZpZ3VyZToxMjcyOiBcIiRhY19saW5rXCIpIDE+JjU7IChldmFsICRhY19saW5rKSAyPiY1OyB9ICYmIHRlc3QgLXMgY29uZnRlc3Q7IHRoZW4KK2lmIHsgKGV2YWwgZWNobyBjb25maWd1cmU6MTI4MTogXCIkYWNfbGlua1wiKSAxPiY1OyAoZXZhbCAkYWNfbGluaykgMj4mNTsgfSAmJiB0ZXN0IC1zIGNvbmZ0ZXN0OyB0aGVuCiAgIHJtIC1yZiBjb25mdGVzdCoKICAgZXZhbCAiYWNfY3ZfZnVuY19nZXRob3N0YnluYW1lPXllcyIKIGVsc2UKQEAgLTEyODksNyArMTI5OCw3IEBACiAKICAgICBpZiB0ZXN0ICRhY19jdl9mdW5jX2dldGhvc3RieW5hbWUgPSBubzsgdGhlbgogICAgICAgZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yIGdldGhvc3RieW5hbWUgaW4gLWxuc2wiIi4uLiAkYWNfYyIgMT4mNgotZWNobyAiY29uZmlndXJlOjEyOTM6IGNoZWNraW5nIGZvciBnZXRob3N0YnluYW1lIGluIC1sbnNsIiA+JjUKK2VjaG8gImNvbmZpZ3VyZToxMzAyOiBjaGVja2luZyBmb3IgZ2V0aG9zdGJ5bmFtZSBpbiAtbG5zbCIgPiY1CiBhY19saWJfdmFyPWBlY2hvIG5zbCdfJ2dldGhvc3RieW5hbWUgfCBzZWQgJ3klLi8rLSVfX3BfJSdgCiBpZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3ZfbGliXyRhY19saWJfdmFyJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KICAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKQEAgLTEyOTcsNyArMTMwNiw3IEBACiAgIGFjX3NhdmVfTElCUz0iJExJQlMiCiBMSUJTPSItbG5zbCAgJExJQlMiCiBjYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8RU9GCi0jbGluZSAxMzAxICJjb25maWd1cmUiCisjbGluZSAxMzEwICJjb25maWd1cmUiCiAjaW5jbHVkZSAiY29uZmRlZnMuaCIKIC8qIE92ZXJyaWRlIGFueSBnY2MyIGludGVybmFsIHByb3RvdHlwZSB0byBhdm9pZCBhbiBlcnJvci4gICovCiAvKiBXZSB1c2UgY2hhciBiZWNhdXNlIGludCBtaWdodCBtYXRjaCB0aGUgcmV0dXJuIHR5cGUgb2YgYSBnY2MyCkBAIC0xMzA4LDcgKzEzMTcsNyBAQAogZ2V0aG9zdGJ5bmFtZSgpCiA7IHJldHVybiAwOyB9CiBFT0YKLWlmIHsgKGV2YWwgZWNobyBjb25maWd1cmU6MTMxMjogXCIkYWNfbGlua1wiKSAxPiY1OyAoZXZhbCAkYWNfbGluaykgMj4mNTsgfSAmJiB0ZXN0IC1zIGNvbmZ0ZXN0OyB0aGVuCitpZiB7IChldmFsIGVjaG8gY29uZmlndXJlOjEzMjE6IFwiJGFjX2xpbmtcIikgMT4mNTsgKGV2YWwgJGFjX2xpbmspIDI+JjU7IH0gJiYgdGVzdCAtcyBjb25mdGVzdDsgdGhlbgogICBybSAtcmYgY29uZnRlc3QqCiAgIGV2YWwgImFjX2N2X2xpYl8kYWNfbGliX3Zhcj15ZXMiCiBlbHNlCkBAIC0xMzM4LDEyICsxMzQ3LDEyIEBACiAgICAgIyAtbHNvY2tldCBtdXN0IGJlIGdpdmVuIGJlZm9yZSAtbG5zbCBpZiBib3RoIGFyZSBuZWVkZWQuCiAgICAgIyBXZSBhc3N1bWUgdGhhdCBpZiBjb25uZWN0IG5lZWRzIC1sbnNsLCBzbyBkb2VzIGdldGhvc3RieW5hbWUuCiAgICAgZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yIGNvbm5lY3QiIi4uLiAkYWNfYyIgMT4mNgotZWNobyAiY29uZmlndXJlOjEzNDI6IGNoZWNraW5nIGZvciBjb25uZWN0IiA+JjUKK2VjaG8gImNvbmZpZ3VyZToxMzUxOiBjaGVja2luZyBmb3IgY29ubmVjdCIgPiY1CiBpZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3ZfZnVuY19jb25uZWN0JytzZXR9J2BcIiA9IHNldCI7IHRoZW4KICAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKIGVsc2UKICAgY2F0ID4gY29uZnRlc3QuJGFjX2V4dCA8PEVPRgotI2xpbmUgMTM0NyAiY29uZmlndXJlIgorI2xpbmUgMTM1NiAiY29uZmlndXJlIgogI2luY2x1ZGUgImNvbmZkZWZzLmgiCiAvKiBTeXN0ZW0gaGVhZGVyIHRvIGRlZmluZSBfX3N0dWIgbWFjcm9zIGFuZCBob3BlZnVsbHkgZmV3IHByb3RvdHlwZXMsCiAgICAgd2hpY2ggY2FuIGNvbmZsaWN0IHdpdGggY2hhciBjb25uZWN0KCk7IGJlbG93LiAgKi8KQEAgLTEzNjYsNyArMTM3NSw3IEBACiAKIDsgcmV0dXJuIDA7IH0KIEVPRgotaWYgeyAoZXZhbCBlY2hvIGNvbmZpZ3VyZToxMzcwOiBcIiRhY19saW5rXCIpIDE+JjU7IChldmFsICRhY19saW5rKSAyPiY1OyB9ICYmIHRlc3QgLXMgY29uZnRlc3Q7IHRoZW4KK2lmIHsgKGV2YWwgZWNobyBjb25maWd1cmU6MTM3OTogXCIkYWNfbGlua1wiKSAxPiY1OyAoZXZhbCAkYWNfbGluaykgMj4mNTsgfSAmJiB0ZXN0IC1zIGNvbmZ0ZXN0OyB0aGVuCiAgIHJtIC1yZiBjb25mdGVzdCoKICAgZXZhbCAiYWNfY3ZfZnVuY19jb25uZWN0PXllcyIKIGVsc2UKQEAgLTEzODcsNyArMTM5Niw3IEBACiAKICAgICBpZiB0ZXN0ICRhY19jdl9mdW5jX2Nvbm5lY3QgPSBubzsgdGhlbgogICAgICAgZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yIGNvbm5lY3QgaW4gLWxzb2NrZXQiIi4uLiAkYWNfYyIgMT4mNgotZWNobyAiY29uZmlndXJlOjEzOTE6IGNoZWNraW5nIGZvciBjb25uZWN0IGluIC1sc29ja2V0IiA+JjUKK2VjaG8gImNvbmZpZ3VyZToxNDAwOiBjaGVja2luZyBmb3IgY29ubmVjdCBpbiAtbHNvY2tldCIgPiY1CiBhY19saWJfdmFyPWBlY2hvIHNvY2tldCdfJ2Nvbm5lY3QgfCBzZWQgJ3klLi8rLSVfX3BfJSdgCiBpZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3ZfbGliXyRhY19saWJfdmFyJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KICAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKQEAgLTEzOTUsNyArMTQwNCw3IEBACiAgIGFjX3NhdmVfTElCUz0iJExJQlMiCiBMSUJTPSItbHNvY2tldCAkWF9FWFRSQV9MSUJTICRMSUJTIgogY2F0ID4gY29uZnRlc3QuJGFjX2V4dCA8PEVPRgotI2xpbmUgMTM5OSAiY29uZmlndXJlIgorI2xpbmUgMTQwOCAiY29uZmlndXJlIgogI2luY2x1ZGUgImNvbmZkZWZzLmgiCiAvKiBPdmVycmlkZSBhbnkgZ2NjMiBpbnRlcm5hbCBwcm90b3R5cGUgdG8gYXZvaWQgYW4gZXJyb3IuICAqLwogLyogV2UgdXNlIGNoYXIgYmVjYXVzZSBpbnQgbWlnaHQgbWF0Y2ggdGhlIHJldHVybiB0eXBlIG9mIGEgZ2NjMgpAQCAtMTQwNiw3ICsxNDE1LDcgQEAKIGNvbm5lY3QoKQogOyByZXR1cm4gMDsgfQogRU9GCi1pZiB7IChldmFsIGVjaG8gY29uZmlndXJlOjE0MTA6IFwiJGFjX2xpbmtcIikgMT4mNTsgKGV2YWwgJGFjX2xpbmspIDI+JjU7IH0gJiYgdGVzdCAtcyBjb25mdGVzdDsgdGhlbgoraWYgeyAoZXZhbCBlY2hvIGNvbmZpZ3VyZToxNDE5OiBcIiRhY19saW5rXCIpIDE+JjU7IChldmFsICRhY19saW5rKSAyPiY1OyB9ICYmIHRlc3QgLXMgY29uZnRlc3Q7IHRoZW4KICAgcm0gLXJmIGNvbmZ0ZXN0KgogICBldmFsICJhY19jdl9saWJfJGFjX2xpYl92YXI9eWVzIgogZWxzZQpAQCAtMTQzMCwxMiArMTQzOSwxMiBAQAogCiAgICAgIyBnb21lekBtaS51bmktZXJsYW5nZW4uZGUgc2F5cyAtbHBvc2l4IGlzIG5lY2Vzc2FyeSBvbiBBL1VYLgogICAgIGVjaG8gJGFjX24gImNoZWNraW5nIGZvciByZW1vdmUiIi4uLiAkYWNfYyIgMT4mNgotZWNobyAiY29uZmlndXJlOjE0MzQ6IGNoZWNraW5nIGZvciByZW1vdmUiID4mNQorZWNobyAiY29uZmlndXJlOjE0NDM6IGNoZWNraW5nIGZvciByZW1vdmUiID4mNQogaWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FjX2N2X2Z1bmNfcmVtb3ZlJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KICAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKIGVsc2UKICAgY2F0ID4gY29uZnRlc3QuJGFjX2V4dCA8PEVPRgotI2xpbmUgMTQzOSAiY29uZmlndXJlIgorI2xpbmUgMTQ0OCAiY29uZmlndXJlIgogI2luY2x1ZGUgImNvbmZkZWZzLmgiCiAvKiBTeXN0ZW0gaGVhZGVyIHRvIGRlZmluZSBfX3N0dWIgbWFjcm9zIGFuZCBob3BlZnVsbHkgZmV3IHByb3RvdHlwZXMsCiAgICAgd2hpY2ggY2FuIGNvbmZsaWN0IHdpdGggY2hhciByZW1vdmUoKTsgYmVsb3cuICAqLwpAQCAtMTQ1OCw3ICsxNDY3LDcgQEAKIAogOyByZXR1cm4gMDsgfQogRU9GCi1pZiB7IChldmFsIGVjaG8gY29uZmlndXJlOjE0NjI6IFwiJGFjX2xpbmtcIikgMT4mNTsgKGV2YWwgJGFjX2xpbmspIDI+JjU7IH0gJiYgdGVzdCAtcyBjb25mdGVzdDsgdGhlbgoraWYgeyAoZXZhbCBlY2hvIGNvbmZpZ3VyZToxNDcxOiBcIiRhY19saW5rXCIpIDE+JjU7IChldmFsICRhY19saW5rKSAyPiY1OyB9ICYmIHRlc3QgLXMgY29uZnRlc3Q7IHRoZW4KICAgcm0gLXJmIGNvbmZ0ZXN0KgogICBldmFsICJhY19jdl9mdW5jX3JlbW92ZT15ZXMiCiBlbHNlCkBAIC0xNDc5LDcgKzE0ODgsNyBAQAogCiAgICAgaWYgdGVzdCAkYWNfY3ZfZnVuY19yZW1vdmUgPSBubzsgdGhlbgogICAgICAgZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yIHJlbW92ZSBpbiAtbHBvc2l4IiIuLi4gJGFjX2MiIDE+JjYKLWVjaG8gImNvbmZpZ3VyZToxNDgzOiBjaGVja2luZyBmb3IgcmVtb3ZlIGluIC1scG9zaXgiID4mNQorZWNobyAiY29uZmlndXJlOjE0OTI6IGNoZWNraW5nIGZvciByZW1vdmUgaW4gLWxwb3NpeCIgPiY1CiBhY19saWJfdmFyPWBlY2hvIHBvc2l4J18ncmVtb3ZlIHwgc2VkICd5JS4vKy0lX19wXyUnYAogaWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FjX2N2X2xpYl8kYWNfbGliX3Zhcicrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCiAgIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2CkBAIC0xNDg3LDcgKzE0OTYsNyBAQAogICBhY19zYXZlX0xJQlM9IiRMSUJTIgogTElCUz0iLWxwb3NpeCAgJExJQlMiCiBjYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8RU9GCi0jbGluZSAxNDkxICJjb25maWd1cmUiCisjbGluZSAxNTAwICJjb25maWd1cmUiCiAjaW5jbHVkZSAiY29uZmRlZnMuaCIKIC8qIE92ZXJyaWRlIGFueSBnY2MyIGludGVybmFsIHByb3RvdHlwZSB0byBhdm9pZCBhbiBlcnJvci4gICovCiAvKiBXZSB1c2UgY2hhciBiZWNhdXNlIGludCBtaWdodCBtYXRjaCB0aGUgcmV0dXJuIHR5cGUgb2YgYSBnY2MyCkBAIC0xNDk4LDcgKzE1MDcsNyBAQAogcmVtb3ZlKCkKIDsgcmV0dXJuIDA7IH0KIEVPRgotaWYgeyAoZXZhbCBlY2hvIGNvbmZpZ3VyZToxNTAyOiBcIiRhY19saW5rXCIpIDE+JjU7IChldmFsICRhY19saW5rKSAyPiY1OyB9ICYmIHRlc3QgLXMgY29uZnRlc3Q7IHRoZW4KK2lmIHsgKGV2YWwgZWNobyBjb25maWd1cmU6MTUxMTogXCIkYWNfbGlua1wiKSAxPiY1OyAoZXZhbCAkYWNfbGluaykgMj4mNTsgfSAmJiB0ZXN0IC1zIGNvbmZ0ZXN0OyB0aGVuCiAgIHJtIC1yZiBjb25mdGVzdCoKICAgZXZhbCAiYWNfY3ZfbGliXyRhY19saWJfdmFyPXllcyIKIGVsc2UKQEAgLTE1MjIsMTIgKzE1MzEsMTIgQEAKIAogICAgICMgQlNESSBCU0QvT1MgMi4xIG5lZWRzIC1saXBjIGZvciBYT3BlbkRpc3BsYXkuCiAgICAgZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yIHNobWF0IiIuLi4gJGFjX2MiIDE+JjYKLWVjaG8gImNvbmZpZ3VyZToxNTI2OiBjaGVja2luZyBmb3Igc2htYXQiID4mNQorZWNobyAiY29uZmlndXJlOjE1MzU6IGNoZWNraW5nIGZvciBzaG1hdCIgPiY1CiBpZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3ZfZnVuY19zaG1hdCcrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCiAgIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2CiBlbHNlCiAgIGNhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDxFT0YKLSNsaW5lIDE1MzEgImNvbmZpZ3VyZSIKKyNsaW5lIDE1NDAgImNvbmZpZ3VyZSIKICNpbmNsdWRlICJjb25mZGVmcy5oIgogLyogU3lzdGVtIGhlYWRlciB0byBkZWZpbmUgX19zdHViIG1hY3JvcyBhbmQgaG9wZWZ1bGx5IGZldyBwcm90b3R5cGVzLAogICAgIHdoaWNoIGNhbiBjb25mbGljdCB3aXRoIGNoYXIgc2htYXQoKTsgYmVsb3cuICAqLwpAQCAtMTU1MCw3ICsxNTU5LDcgQEAKIAogOyByZXR1cm4gMDsgfQogRU9GCi1pZiB7IChldmFsIGVjaG8gY29uZmlndXJlOjE1NTQ6IFwiJGFjX2xpbmtcIikgMT4mNTsgKGV2YWwgJGFjX2xpbmspIDI+JjU7IH0gJiYgdGVzdCAtcyBjb25mdGVzdDsgdGhlbgoraWYgeyAoZXZhbCBlY2hvIGNvbmZpZ3VyZToxNTYzOiBcIiRhY19saW5rXCIpIDE+JjU7IChldmFsICRhY19saW5rKSAyPiY1OyB9ICYmIHRlc3QgLXMgY29uZnRlc3Q7IHRoZW4KICAgcm0gLXJmIGNvbmZ0ZXN0KgogICBldmFsICJhY19jdl9mdW5jX3NobWF0PXllcyIKIGVsc2UKQEAgLTE1NzEsNyArMTU4MCw3IEBACiAKICAgICBpZiB0ZXN0ICRhY19jdl9mdW5jX3NobWF0ID0gbm87IHRoZW4KICAgICAgIGVjaG8gJGFjX24gImNoZWNraW5nIGZvciBzaG1hdCBpbiAtbGlwYyIiLi4uICRhY19jIiAxPiY2Ci1lY2hvICJjb25maWd1cmU6MTU3NTogY2hlY2tpbmcgZm9yIHNobWF0IGluIC1saXBjIiA+JjUKK2VjaG8gImNvbmZpZ3VyZToxNTg0OiBjaGVja2luZyBmb3Igc2htYXQgaW4gLWxpcGMiID4mNQogYWNfbGliX3Zhcj1gZWNobyBpcGMnXydzaG1hdCB8IHNlZCAneSUuLystJV9fcF8lJ2AKIGlmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhY19jdl9saWJfJGFjX2xpYl92YXInK3NldH0nYFwiID0gc2V0IjsgdGhlbgogICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgpAQCAtMTU3OSw3ICsxNTg4LDcgQEAKICAgYWNfc2F2ZV9MSUJTPSIkTElCUyIKIExJQlM9Ii1saXBjICAkTElCUyIKIGNhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDxFT0YKLSNsaW5lIDE1ODMgImNvbmZpZ3VyZSIKKyNsaW5lIDE1OTIgImNvbmZpZ3VyZSIKICNpbmNsdWRlICJjb25mZGVmcy5oIgogLyogT3ZlcnJpZGUgYW55IGdjYzIgaW50ZXJuYWwgcHJvdG90eXBlIHRvIGF2b2lkIGFuIGVycm9yLiAgKi8KIC8qIFdlIHVzZSBjaGFyIGJlY2F1c2UgaW50IG1pZ2h0IG1hdGNoIHRoZSByZXR1cm4gdHlwZSBvZiBhIGdjYzIKQEAgLTE1OTAsNyArMTU5OSw3IEBACiBzaG1hdCgpCiA7IHJldHVybiAwOyB9CiBFT0YKLWlmIHsgKGV2YWwgZWNobyBjb25maWd1cmU6MTU5NDogXCIkYWNfbGlua1wiKSAxPiY1OyAoZXZhbCAkYWNfbGluaykgMj4mNTsgfSAmJiB0ZXN0IC1zIGNvbmZ0ZXN0OyB0aGVuCitpZiB7IChldmFsIGVjaG8gY29uZmlndXJlOjE2MDM6IFwiJGFjX2xpbmtcIikgMT4mNTsgKGV2YWwgJGFjX2xpbmspIDI+JjU7IH0gJiYgdGVzdCAtcyBjb25mdGVzdDsgdGhlbgogICBybSAtcmYgY29uZnRlc3QqCiAgIGV2YWwgImFjX2N2X2xpYl8kYWNfbGliX3Zhcj15ZXMiCiBlbHNlCkBAIC0xNjIzLDcgKzE2MzIsNyBAQAogICAjIGxpYnJhcmllcyB3ZSBjaGVjayBmb3IgYmVsb3csIHNvIHVzZSBhIGRpZmZlcmVudCB2YXJpYWJsZS4KICAgIyAgLS1pbnRlcnJhbkB1bHVydS5TdGFuZm9yZC5FRFUsIGtiQGNzLnVtYi5lZHUuCiAgIGVjaG8gJGFjX24gImNoZWNraW5nIGZvciBJY2VDb25uZWN0aW9uTnVtYmVyIGluIC1sSUNFIiIuLi4gJGFjX2MiIDE+JjYKLWVjaG8gImNvbmZpZ3VyZToxNjI3OiBjaGVja2luZyBmb3IgSWNlQ29ubmVjdGlvbk51bWJlciBpbiAtbElDRSIgPiY1CitlY2hvICJjb25maWd1cmU6MTYzNjogY2hlY2tpbmcgZm9yIEljZUNvbm5lY3Rpb25OdW1iZXIgaW4gLWxJQ0UiID4mNQogYWNfbGliX3Zhcj1gZWNobyBJQ0UnXydJY2VDb25uZWN0aW9uTnVtYmVyIHwgc2VkICd5JS4vKy0lX19wXyUnYAogaWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FjX2N2X2xpYl8kYWNfbGliX3Zhcicrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCiAgIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2CkBAIC0xNjMxLDcgKzE2NDAsNyBAQAogICBhY19zYXZlX0xJQlM9IiRMSUJTIgogTElCUz0iLWxJQ0UgICRMSUJTIgogY2F0ID4gY29uZnRlc3QuJGFjX2V4dCA8PEVPRgotI2xpbmUgMTYzNSAiY29uZmlndXJlIgorI2xpbmUgMTY0NCAiY29uZmlndXJlIgogI2luY2x1ZGUgImNvbmZkZWZzLmgiCiAvKiBPdmVycmlkZSBhbnkgZ2NjMiBpbnRlcm5hbCBwcm90b3R5cGUgdG8gYXZvaWQgYW4gZXJyb3IuICAqLwogLyogV2UgdXNlIGNoYXIgYmVjYXVzZSBpbnQgbWlnaHQgbWF0Y2ggdGhlIHJldHVybiB0eXBlIG9mIGEgZ2NjMgpAQCAtMTY0Miw3ICsxNjUxLDcgQEAKIEljZUNvbm5lY3Rpb25OdW1iZXIoKQogOyByZXR1cm4gMDsgfQogRU9GCi1pZiB7IChldmFsIGVjaG8gY29uZmlndXJlOjE2NDY6IFwiJGFjX2xpbmtcIikgMT4mNTsgKGV2YWwgJGFjX2xpbmspIDI+JjU7IH0gJiYgdGVzdCAtcyBjb25mdGVzdDsgdGhlbgoraWYgeyAoZXZhbCBlY2hvIGNvbmZpZ3VyZToxNjU1OiBcIiRhY19saW5rXCIpIDE+JjU7IChldmFsICRhY19saW5rKSAyPiY1OyB9ICYmIHRlc3QgLXMgY29uZnRlc3Q7IHRoZW4KICAgcm0gLXJmIGNvbmZ0ZXN0KgogICBldmFsICJhY19jdl9saWJfJGFjX2xpYl92YXI9eWVzIgogZWxzZQpAQCAtMTY3MSw3ICsxNjgwLDcgQEAKICMgRXh0cmFjdCB0aGUgZmlyc3Qgd29yZCBvZiAiJGFjX3Byb2ciLCBzbyBpdCBjYW4gYmUgYSBwcm9ncmFtIG5hbWUgd2l0aCBhcmdzLgogc2V0IGR1bW15ICRhY19wcm9nOyBhY193b3JkPSQyCiBlY2hvICRhY19uICJjaGVja2luZyBmb3IgJGFjX3dvcmQiIi4uLiAkYWNfYyIgMT4mNgotZWNobyAiY29uZmlndXJlOjE2NzU6IGNoZWNraW5nIGZvciAkYWNfd29yZCIgPiY1CitlY2hvICJjb25maWd1cmU6MTY4NDogY2hlY2tpbmcgZm9yICRhY193b3JkIiA+JjUKIGlmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhY19jdl9wcm9nX1lBQ0MnK3NldH0nYFwiID0gc2V0IjsgdGhlbgogICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgogZWxzZQpAQCAtMTcwMyw3ICsxNzEyLDcgQEAKICMgRXh0cmFjdCB0aGUgZmlyc3Qgd29yZCBvZiAiZmxleCIsIHNvIGl0IGNhbiBiZSBhIHByb2dyYW0gbmFtZSB3aXRoIGFyZ3MuCiBzZXQgZHVtbXkgZmxleDsgYWNfd29yZD0kMgogZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yICRhY193b3JkIiIuLi4gJGFjX2MiIDE+JjYKLWVjaG8gImNvbmZpZ3VyZToxNzA3OiBjaGVja2luZyBmb3IgJGFjX3dvcmQiID4mNQorZWNobyAiY29uZmlndXJlOjE3MTY6IGNoZWNraW5nIGZvciAkYWNfd29yZCIgPiY1CiBpZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3ZfcHJvZ19MRVgnK3NldH0nYFwiID0gc2V0IjsgdGhlbgogICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgogZWxzZQpAQCAtMTczNiw3ICsxNzQ1LDcgQEAKICAgKikgYWNfbGliPWwgOzsKICAgZXNhYwogICBlY2hvICRhY19uICJjaGVja2luZyBmb3IgeXl3cmFwIGluIC1sJGFjX2xpYiIiLi4uICRhY19jIiAxPiY2Ci1lY2hvICJjb25maWd1cmU6MTc0MDogY2hlY2tpbmcgZm9yIHl5d3JhcCBpbiAtbCRhY19saWIiID4mNQorZWNobyAiY29uZmlndXJlOjE3NDk6IGNoZWNraW5nIGZvciB5eXdyYXAgaW4gLWwkYWNfbGliIiA+JjUKIGFjX2xpYl92YXI9YGVjaG8gJGFjX2xpYidfJ3l5d3JhcCB8IHNlZCAneSUuLystJV9fcF8lJ2AKIGlmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhY19jdl9saWJfJGFjX2xpYl92YXInK3NldH0nYFwiID0gc2V0IjsgdGhlbgogICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgpAQCAtMTc0NCw3ICsxNzUzLDcgQEAKICAgYWNfc2F2ZV9MSUJTPSIkTElCUyIKIExJQlM9Ii1sJGFjX2xpYiAgJExJQlMiCiBjYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8RU9GCi0jbGluZSAxNzQ4ICJjb25maWd1cmUiCisjbGluZSAxNzU3ICJjb25maWd1cmUiCiAjaW5jbHVkZSAiY29uZmRlZnMuaCIKIC8qIE92ZXJyaWRlIGFueSBnY2MyIGludGVybmFsIHByb3RvdHlwZSB0byBhdm9pZCBhbiBlcnJvci4gICovCiAvKiBXZSB1c2UgY2hhciBiZWNhdXNlIGludCBtaWdodCBtYXRjaCB0aGUgcmV0dXJuIHR5cGUgb2YgYSBnY2MyCkBAIC0xNzU1LDcgKzE3NjQsNyBAQAogeXl3cmFwKCkKIDsgcmV0dXJuIDA7IH0KIEVPRgotaWYgeyAoZXZhbCBlY2hvIGNvbmZpZ3VyZToxNzU5OiBcIiRhY19saW5rXCIpIDE+JjU7IChldmFsICRhY19saW5rKSAyPiY1OyB9ICYmIHRlc3QgLXMgY29uZnRlc3Q7IHRoZW4KK2lmIHsgKGV2YWwgZWNobyBjb25maWd1cmU6MTc2ODogXCIkYWNfbGlua1wiKSAxPiY1OyAoZXZhbCAkYWNfbGluaykgMj4mNTsgfSAmJiB0ZXN0IC1zIGNvbmZ0ZXN0OyB0aGVuCiAgIHJtIC1yZiBjb25mdGVzdCoKICAgZXZhbCAiYWNfY3ZfbGliXyRhY19saWJfdmFyPXllcyIKIGVsc2UKQEAgLTE3ODAsNyArMTc4OSw3IEBACiAjIEV4dHJhY3QgdGhlIGZpcnN0IHdvcmQgb2YgInJhbmxpYiIsIHNvIGl0IGNhbiBiZSBhIHByb2dyYW0gbmFtZSB3aXRoIGFyZ3MuCiBzZXQgZHVtbXkgcmFubGliOyBhY193b3JkPSQyCiBlY2hvICRhY19uICJjaGVja2luZyBmb3IgJGFjX3dvcmQiIi4uLiAkYWNfYyIgMT4mNgotZWNobyAiY29uZmlndXJlOjE3ODQ6IGNoZWNraW5nIGZvciAkYWNfd29yZCIgPiY1CitlY2hvICJjb25maWd1cmU6MTc5MzogY2hlY2tpbmcgZm9yICRhY193b3JkIiA+JjUKIGlmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhY19jdl9wcm9nX1JBTkxJQicrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCiAgIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2CiBlbHNlCkBAIC0xODE3LDcgKzE4MjYsNyBAQAogIyBTVlI0IC91c3IvdWNiL2luc3RhbGwsIHdoaWNoIHRyaWVzIHRvIHVzZSB0aGUgbm9uZXhpc3RlbnQgZ3JvdXAgInN0YWZmIgogIyAuL2luc3RhbGwsIHdoaWNoIGNhbiBiZSBlcnJvbmVvdXNseSBjcmVhdGVkIGJ5IG1ha2UgZnJvbSAuL2luc3RhbGwuc2guCiBlY2hvICRhY19uICJjaGVja2luZyBmb3IgYSBCU0QgY29tcGF0aWJsZSBpbnN0YWxsIiIuLi4gJGFjX2MiIDE+JjYKLWVjaG8gImNvbmZpZ3VyZToxODIxOiBjaGVja2luZyBmb3IgYSBCU0QgY29tcGF0aWJsZSBpbnN0YWxsIiA+JjUKK2VjaG8gImNvbmZpZ3VyZToxODMwOiBjaGVja2luZyBmb3IgYSBCU0QgY29tcGF0aWJsZSBpbnN0YWxsIiA+JjUKIGlmIHRlc3QgLXogIiRJTlNUQUxMIjsgdGhlbgogaWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FjX2N2X3BhdGhfaW5zdGFsbCcrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCiAgIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2CkBAIC0xODY3LDcgKzE4NzYsNyBAQAogdGVzdCAteiAiJElOU1RBTExfREFUQSIgJiYgSU5TVEFMTF9EQVRBPScke0lOU1RBTEx9IC1tIDY0NCcKIAogZWNobyAkYWNfbiAiY2hlY2tpbmcgd2hldGhlciBsbiAtcyB3b3JrcyIiLi4uICRhY19jIiAxPiY2Ci1lY2hvICJjb25maWd1cmU6MTg3MTogY2hlY2tpbmcgd2hldGhlciBsbiAtcyB3b3JrcyIgPiY1CitlY2hvICJjb25maWd1cmU6MTg4MDogY2hlY2tpbmcgd2hldGhlciBsbiAtcyB3b3JrcyIgPiY1CiBpZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3ZfcHJvZ19MTl9TJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KICAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKIGVsc2UKQEAgLTE4OTAsNyArMTg5OSw3IEBACiAKIAogZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yIGkzODZfc2V0X2xkdCBpbiAtbGkzODYiIi4uLiAkYWNfYyIgMT4mNgotZWNobyAiY29uZmlndXJlOjE4OTQ6IGNoZWNraW5nIGZvciBpMzg2X3NldF9sZHQgaW4gLWxpMzg2IiA+JjUKK2VjaG8gImNvbmZpZ3VyZToxOTAzOiBjaGVja2luZyBmb3IgaTM4Nl9zZXRfbGR0IGluIC1saTM4NiIgPiY1CiBhY19saWJfdmFyPWBlY2hvIGkzODYnXydpMzg2X3NldF9sZHQgfCBzZWQgJ3klLi8rLSVfX3BfJSdgCiBpZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3ZfbGliXyRhY19saWJfdmFyJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KICAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKQEAgLTE4OTgsNyArMTkwNyw3IEBACiAgIGFjX3NhdmVfTElCUz0iJExJQlMiCiBMSUJTPSItbGkzODYgICRMSUJTIgogY2F0ID4gY29uZnRlc3QuJGFjX2V4dCA8PEVPRgotI2xpbmUgMTkwMiAiY29uZmlndXJlIgorI2xpbmUgMTkxMSAiY29uZmlndXJlIgogI2luY2x1ZGUgImNvbmZkZWZzLmgiCiAvKiBPdmVycmlkZSBhbnkgZ2NjMiBpbnRlcm5hbCBwcm90b3R5cGUgdG8gYXZvaWQgYW4gZXJyb3IuICAqLwogLyogV2UgdXNlIGNoYXIgYmVjYXVzZSBpbnQgbWlnaHQgbWF0Y2ggdGhlIHJldHVybiB0eXBlIG9mIGEgZ2NjMgpAQCAtMTkwOSw3ICsxOTE4LDcgQEAKIGkzODZfc2V0X2xkdCgpCiA7IHJldHVybiAwOyB9CiBFT0YKLWlmIHsgKGV2YWwgZWNobyBjb25maWd1cmU6MTkxMzogXCIkYWNfbGlua1wiKSAxPiY1OyAoZXZhbCAkYWNfbGluaykgMj4mNTsgfSAmJiB0ZXN0IC1zIGNvbmZ0ZXN0OyB0aGVuCitpZiB7IChldmFsIGVjaG8gY29uZmlndXJlOjE5MjI6IFwiJGFjX2xpbmtcIikgMT4mNTsgKGV2YWwgJGFjX2xpbmspIDI+JjU7IH0gJiYgdGVzdCAtcyBjb25mdGVzdDsgdGhlbgogICBybSAtcmYgY29uZnRlc3QqCiAgIGV2YWwgImFjX2N2X2xpYl8kYWNfbGliX3Zhcj15ZXMiCiBlbHNlCkBAIC0xOTM3LDcgKzE5NDYsNyBAQAogZmkKIAogZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yIGlzd2FsbnVtIGluIC1sdyIiLi4uICRhY19jIiAxPiY2Ci1lY2hvICJjb25maWd1cmU6MTk0MTogY2hlY2tpbmcgZm9yIGlzd2FsbnVtIGluIC1sdyIgPiY1CitlY2hvICJjb25maWd1cmU6MTk1MDogY2hlY2tpbmcgZm9yIGlzd2FsbnVtIGluIC1sdyIgPiY1CiBhY19saWJfdmFyPWBlY2hvIHcnXydpc3dhbG51bSB8IHNlZCAneSUuLystJV9fcF8lJ2AKIGlmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhY19jdl9saWJfJGFjX2xpYl92YXInK3NldH0nYFwiID0gc2V0IjsgdGhlbgogICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgpAQCAtMTk0NSw3ICsxOTU0LDcgQEAKICAgYWNfc2F2ZV9MSUJTPSIkTElCUyIKIExJQlM9Ii1sdyAgJExJQlMiCiBjYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8RU9GCi0jbGluZSAxOTQ5ICJjb25maWd1cmUiCisjbGluZSAxOTU4ICJjb25maWd1cmUiCiAjaW5jbHVkZSAiY29uZmRlZnMuaCIKIC8qIE92ZXJyaWRlIGFueSBnY2MyIGludGVybmFsIHByb3RvdHlwZSB0byBhdm9pZCBhbiBlcnJvci4gICovCiAvKiBXZSB1c2UgY2hhciBiZWNhdXNlIGludCBtaWdodCBtYXRjaCB0aGUgcmV0dXJuIHR5cGUgb2YgYSBnY2MyCkBAIC0xOTU2LDcgKzE5NjUsNyBAQAogaXN3YWxudW0oKQogOyByZXR1cm4gMDsgfQogRU9GCi1pZiB7IChldmFsIGVjaG8gY29uZmlndXJlOjE5NjA6IFwiJGFjX2xpbmtcIikgMT4mNTsgKGV2YWwgJGFjX2xpbmspIDI+JjU7IH0gJiYgdGVzdCAtcyBjb25mdGVzdDsgdGhlbgoraWYgeyAoZXZhbCBlY2hvIGNvbmZpZ3VyZToxOTY5OiBcIiRhY19saW5rXCIpIDE+JjU7IChldmFsICRhY19saW5rKSAyPiY1OyB9ICYmIHRlc3QgLXMgY29uZnRlc3Q7IHRoZW4KICAgcm0gLXJmIGNvbmZ0ZXN0KgogICBldmFsICJhY19jdl9saWJfJGFjX2xpYl92YXI9eWVzIgogZWxzZQpAQCAtMTk4NCw3ICsxOTkzLDcgQEAKIGZpCiAKIGVjaG8gJGFjX24gImNoZWNraW5nIGZvciBYRjg2REdBUXVlcnlFeHRlbnNpb24gaW4gLWxYeGY4NmRnYSIiLi4uICRhY19jIiAxPiY2Ci1lY2hvICJjb25maWd1cmU6MTk4ODogY2hlY2tpbmcgZm9yIFhGODZER0FRdWVyeUV4dGVuc2lvbiBpbiAtbFh4Zjg2ZGdhIiA+JjUKK2VjaG8gImNvbmZpZ3VyZToxOTk3OiBjaGVja2luZyBmb3IgWEY4NkRHQVF1ZXJ5RXh0ZW5zaW9uIGluIC1sWHhmODZkZ2EiID4mNQogYWNfbGliX3Zhcj1gZWNobyBYeGY4NmRnYSdfJ1hGODZER0FRdWVyeUV4dGVuc2lvbiB8IHNlZCAneSUuLystJV9fcF8lJ2AKIGlmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhY19jdl9saWJfJGFjX2xpYl92YXInK3NldH0nYFwiID0gc2V0IjsgdGhlbgogICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgpAQCAtMTk5Miw3ICsyMDAxLDcgQEAKICAgYWNfc2F2ZV9MSUJTPSIkTElCUyIKIExJQlM9Ii1sWHhmODZkZ2EgJFhfTElCUyAtbFhleHQgLWxYMTEgJExJQlMiCiBjYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8RU9GCi0jbGluZSAxOTk2ICJjb25maWd1cmUiCisjbGluZSAyMDA1ICJjb25maWd1cmUiCiAjaW5jbHVkZSAiY29uZmRlZnMuaCIKIC8qIE92ZXJyaWRlIGFueSBnY2MyIGludGVybmFsIHByb3RvdHlwZSB0byBhdm9pZCBhbiBlcnJvci4gICovCiAvKiBXZSB1c2UgY2hhciBiZWNhdXNlIGludCBtaWdodCBtYXRjaCB0aGUgcmV0dXJuIHR5cGUgb2YgYSBnY2MyCkBAIC0yMDAzLDcgKzIwMTIsNyBAQAogWEY4NkRHQVF1ZXJ5RXh0ZW5zaW9uKCkKIDsgcmV0dXJuIDA7IH0KIEVPRgotaWYgeyAoZXZhbCBlY2hvIGNvbmZpZ3VyZToyMDA3OiBcIiRhY19saW5rXCIpIDE+JjU7IChldmFsICRhY19saW5rKSAyPiY1OyB9ICYmIHRlc3QgLXMgY29uZnRlc3Q7IHRoZW4KK2lmIHsgKGV2YWwgZWNobyBjb25maWd1cmU6MjAxNjogXCIkYWNfbGlua1wiKSAxPiY1OyAoZXZhbCAkYWNfbGluaykgMj4mNTsgfSAmJiB0ZXN0IC1zIGNvbmZ0ZXN0OyB0aGVuCiAgIHJtIC1yZiBjb25mdGVzdCoKICAgZXZhbCAiYWNfY3ZfbGliXyRhY19saWJfdmFyPXllcyIKIGVsc2UKQEAgLTIwMjksMTIgKzIwMzgsMTIgQEAKIAogCiBlY2hvICRhY19uICJjaGVja2luZyAiZm9yIE9wZW4gU291bmQgU3lzdGVtIiIiLi4uICRhY19jIiAxPiY2Ci1lY2hvICJjb25maWd1cmU6MjAzMzogY2hlY2tpbmcgImZvciBPcGVuIFNvdW5kIFN5c3RlbSIiID4mNQorZWNobyAiY29uZmlndXJlOjIwNDI6IGNoZWNraW5nICJmb3IgT3BlbiBTb3VuZCBTeXN0ZW0iIiA+JjUKIGlmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhY19jdl9jX29wZW5zb3VuZHN5c3RlbScrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCiAgIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2CiBlbHNlCiAgIGNhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDxFT0YKLSNsaW5lIDIwMzggImNvbmZpZ3VyZSIKKyNsaW5lIDIwNDcgImNvbmZpZ3VyZSIKICNpbmNsdWRlICJjb25mZGVmcy5oIgogI2luY2x1ZGUgPHN5cy9zb3VuZGNhcmQuaD4KIGludCBtYWluKCkgewpAQCAtMjA0Niw3ICsyMDU1LDcgQEAKIAogOyByZXR1cm4gMDsgfQogRU9GCi1pZiB7IChldmFsIGVjaG8gY29uZmlndXJlOjIwNTA6IFwiJGFjX2NvbXBpbGVcIikgMT4mNTsgKGV2YWwgJGFjX2NvbXBpbGUpIDI+JjU7IH07IHRoZW4KK2lmIHsgKGV2YWwgZWNobyBjb25maWd1cmU6MjA1OTogXCIkYWNfY29tcGlsZVwiKSAxPiY1OyAoZXZhbCAkYWNfY29tcGlsZSkgMj4mNTsgfTsgdGhlbgogICBybSAtcmYgY29uZnRlc3QqCiAgIGFjX2N2X2Nfb3BlbnNvdW5kc3lzdGVtPSJ5ZXMiCiBlbHNlCkBAIC0yMDcwLDEyICsyMDc5LDEyIEBACiAKIAogZWNobyAkYWNfbiAiY2hlY2tpbmcgImZvciB1bmlvbiBzZW11biIiIi4uLiAkYWNfYyIgMT4mNgotZWNobyAiY29uZmlndXJlOjIwNzQ6IGNoZWNraW5nICJmb3IgdW5pb24gc2VtdW4iIiA+JjUKK2VjaG8gImNvbmZpZ3VyZToyMDgzOiBjaGVja2luZyAiZm9yIHVuaW9uIHNlbXVuIiIgPiY1CiBpZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3ZfY191bmlvbl9zZW11bicrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCiAgIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2CiBlbHNlCiAgIGNhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDxFT0YKLSNsaW5lIDIwNzkgImNvbmZpZ3VyZSIKKyNsaW5lIDIwODggImNvbmZpZ3VyZSIKICNpbmNsdWRlICJjb25mZGVmcy5oIgogI2luY2x1ZGUgPHN5cy90eXBlcy5oPgogI2luY2x1ZGUgPHN5cy9zZW0uaD4KQEAgLTIwODMsNyArMjA5Miw3IEBACiB1bmlvbiBzZW11biBmb28KIDsgcmV0dXJuIDA7IH0KIEVPRgotaWYgeyAoZXZhbCBlY2hvIGNvbmZpZ3VyZToyMDg3OiBcIiRhY19jb21waWxlXCIpIDE+JjU7IChldmFsICRhY19jb21waWxlKSAyPiY1OyB9OyB0aGVuCitpZiB7IChldmFsIGVjaG8gY29uZmlndXJlOjIwOTY6IFwiJGFjX2NvbXBpbGVcIikgMT4mNTsgKGV2YWwgJGFjX2NvbXBpbGUpIDI+JjU7IH07IHRoZW4KICAgcm0gLXJmIGNvbmZ0ZXN0KgogICBhY19jdl9jX3VuaW9uX3NlbXVuPSJ5ZXMiCiBlbHNlCkBAIC0yMTExLDcgKzIxMjAsNyBAQAogdGhlbgogICBDRkxBR1M9IiRDRkxBR1MgLVdhbGwiCiAgIGVjaG8gJGFjX24gImNoZWNraW5nICJmb3IgZ2NjIHN0cmVuZ3RoLXJlZHVjZSBidWciIiIuLi4gJGFjX2MiIDE+JjYKLWVjaG8gImNvbmZpZ3VyZToyMTE1OiBjaGVja2luZyAiZm9yIGdjYyBzdHJlbmd0aC1yZWR1Y2UgYnVnIiIgPiY1CitlY2hvICJjb25maWd1cmU6MjEyNDogY2hlY2tpbmcgImZvciBnY2Mgc3RyZW5ndGgtcmVkdWNlIGJ1ZyIiID4mNQogaWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FjX2N2X2NfZ2NjX3N0cmVuZ3RoX2J1Zycrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCiAgIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2CiBlbHNlCkBAIC0yMTE5LDcgKzIxMjgsNyBAQAogICBhY19jdl9jX2djY19zdHJlbmd0aF9idWc9InllcyIKIGVsc2UKICAgY2F0ID4gY29uZnRlc3QuJGFjX2V4dCA8PEVPRgotI2xpbmUgMjEyMyAiY29uZmlndXJlIgorI2xpbmUgMjEzMiAiY29uZmlndXJlIgogI2luY2x1ZGUgImNvbmZkZWZzLmgiCiAKIGludCBtYWluKHZvaWQpIHsKQEAgLTIxMzAsNyArMjEzOSw3IEBACiAgIGV4aXQoIEFycmF5WzFdICE9IC0yICk7CiB9CiBFT0YKLWlmIHsgKGV2YWwgZWNobyBjb25maWd1cmU6MjEzNDogXCIkYWNfbGlua1wiKSAxPiY1OyAoZXZhbCAkYWNfbGluaykgMj4mNTsgfSAmJiB0ZXN0IC1zIGNvbmZ0ZXN0ICYmICguL2NvbmZ0ZXN0OyBleGl0KSAyPi9kZXYvbnVsbAoraWYgeyAoZXZhbCBlY2hvIGNvbmZpZ3VyZToyMTQzOiBcIiRhY19saW5rXCIpIDE+JjU7IChldmFsICRhY19saW5rKSAyPiY1OyB9ICYmIHRlc3QgLXMgY29uZnRlc3QgJiYgKC4vY29uZnRlc3Q7IGV4aXQpIDI+L2Rldi9udWxsCiB0aGVuCiAgIGFjX2N2X2NfZ2NjX3N0cmVuZ3RoX2J1Zz0ibm8iCiBlbHNlCkBAIC0yMTUzLDcgKzIxNjIsNyBAQAogCiAKIGVjaG8gJGFjX24gImNoZWNraW5nICJ3aGV0aGVyIGV4dGVybmFsIHN5bWJvbHMgbmVlZCBhbiB1bmRlcnNjb3JlIHByZWZpeCIiIi4uLiAkYWNfYyIgMT4mNgotZWNobyAiY29uZmlndXJlOjIxNTc6IGNoZWNraW5nICJ3aGV0aGVyIGV4dGVybmFsIHN5bWJvbHMgbmVlZCBhbiB1bmRlcnNjb3JlIHByZWZpeCIiID4mNQorZWNobyAiY29uZmlndXJlOjIxNjY6IGNoZWNraW5nICJ3aGV0aGVyIGV4dGVybmFsIHN5bWJvbHMgbmVlZCBhbiB1bmRlcnNjb3JlIHByZWZpeCIiID4mNQogaWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FjX2N2X2NfZXh0ZXJuX3ByZWZpeCcrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCiAgIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2CiBlbHNlCkBAIC0yMTY1LDE0ICsyMTc0LDE0IEBACiAJLmxvbmcgMAogRU9GCiBjYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8RU9GCi0jbGluZSAyMTY5ICJjb25maWd1cmUiCisjbGluZSAyMTc4ICJjb25maWd1cmUiCiAjaW5jbHVkZSAiY29uZmRlZnMuaCIKIGV4dGVybiBpbnQgYWNfdGVzdDsKIGludCBtYWluKCkgewogaWYgKGFjX3Rlc3QpIHJldHVybiAxCiA7IHJldHVybiAwOyB9CiBFT0YKLWlmIHsgKGV2YWwgZWNobyBjb25maWd1cmU6MjE3NjogXCIkYWNfbGlua1wiKSAxPiY1OyAoZXZhbCAkYWNfbGluaykgMj4mNTsgfSAmJiB0ZXN0IC1zIGNvbmZ0ZXN0OyB0aGVuCitpZiB7IChldmFsIGVjaG8gY29uZmlndXJlOjIxODU6IFwiJGFjX2xpbmtcIikgMT4mNTsgKGV2YWwgJGFjX2xpbmspIDI+JjU7IH0gJiYgdGVzdCAtcyBjb25mdGVzdDsgdGhlbgogICBybSAtcmYgY29uZnRlc3QqCiAgIGFjX2N2X2NfZXh0ZXJuX3ByZWZpeD0ieWVzIgogZWxzZQpAQCAtMjE5Niw3ICsyMjA1LDcgQEAKIAogCiBlY2hvICRhY19uICJjaGVja2luZyAid2hldGhlciBhc3NlbWJsZXIgYWNjZXB0cyAuc3RyaW5nIiIiLi4uICRhY19jIiAxPiY2Ci1lY2hvICJjb25maWd1cmU6MjIwMDogY2hlY2tpbmcgIndoZXRoZXIgYXNzZW1ibGVyIGFjY2VwdHMgLnN0cmluZyIiID4mNQorZWNobyAiY29uZmlndXJlOjIyMDk6IGNoZWNraW5nICJ3aGV0aGVyIGFzc2VtYmxlciBhY2NlcHRzIC5zdHJpbmciIiA+JjUKIGlmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhY19jdl9jX2FzbV9zdHJpbmcnK3NldH0nYFwiID0gc2V0IjsgdGhlbgogICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgogZWxzZQpAQCAtMjIwNiwxNCArMjIxNSwxNCBAQAogCS5zdHJpbmcgInRlc3QiCiBFT0YKIGNhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDxFT0YKLSNsaW5lIDIyMTAgImNvbmZpZ3VyZSIKKyNsaW5lIDIyMTkgImNvbmZpZ3VyZSIKICNpbmNsdWRlICJjb25mZGVmcy5oIgogCiBpbnQgbWFpbigpIHsKIAogOyByZXR1cm4gMDsgfQogRU9GCi1pZiB7IChldmFsIGVjaG8gY29uZmlndXJlOjIyMTc6IFwiJGFjX2xpbmtcIikgMT4mNTsgKGV2YWwgJGFjX2xpbmspIDI+JjU7IH0gJiYgdGVzdCAtcyBjb25mdGVzdDsgdGhlbgoraWYgeyAoZXZhbCBlY2hvIGNvbmZpZ3VyZToyMjI2OiBcIiRhY19saW5rXCIpIDE+JjU7IChldmFsICRhY19saW5rKSAyPiY1OyB9ICYmIHRlc3QgLXMgY29uZnRlc3Q7IHRoZW4KICAgcm0gLXJmIGNvbmZ0ZXN0KgogICBhY19jdl9jX2FzbV9zdHJpbmc9InllcyIKIGVsc2UKQEAgLTIyNDAsMjEgKzIyNDksMjEgQEAKIGlmIHRlc3QgIiRMSUJfVEFSR0VUIiA9ICJsaWJ3aW5lLnNvLjEuMCIKIHRoZW4KICAgZWNobyAkYWNfbiAiY2hlY2tpbmcgIndoZXRoZXIgd2UgY2FuIGJ1aWxkIGEgZGxsIiIiLi4uICRhY19jIiAxPiY2Ci1lY2hvICJjb25maWd1cmU6MjI0NDogY2hlY2tpbmcgIndoZXRoZXIgd2UgY2FuIGJ1aWxkIGEgZGxsIiIgPiY1CitlY2hvICJjb25maWd1cmU6MjI1MzogY2hlY2tpbmcgIndoZXRoZXIgd2UgY2FuIGJ1aWxkIGEgZGxsIiIgPiY1CiBpZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3ZfY19kbGwnK3NldH0nYFwiID0gc2V0IjsgdGhlbgogICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgogZWxzZQogICBzYXZlZF9jZmxhZ3M9JENGTEFHUwogICBDRkxBR1M9IiRDRkxBR1MgLWZQSUMgLXNoYXJlZCAtV2wsLXNvbmFtZSxjb25mdGVzdC5zby4xLjAiCiAgIGNhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDxFT0YKLSNsaW5lIDIyNTEgImNvbmZpZ3VyZSIKKyNsaW5lIDIyNjAgImNvbmZpZ3VyZSIKICNpbmNsdWRlICJjb25mZGVmcy5oIgogCiBpbnQgbWFpbigpIHsKIHJldHVybiAxCiA7IHJldHVybiAwOyB9CiBFT0YKLWlmIHsgKGV2YWwgZWNobyBjb25maWd1cmU6MjI1ODogXCIkYWNfbGlua1wiKSAxPiY1OyAoZXZhbCAkYWNfbGluaykgMj4mNTsgfSAmJiB0ZXN0IC1zIGNvbmZ0ZXN0OyB0aGVuCitpZiB7IChldmFsIGVjaG8gY29uZmlndXJlOjIyNjc6IFwiJGFjX2xpbmtcIikgMT4mNTsgKGV2YWwgJGFjX2xpbmspIDI+JjU7IH0gJiYgdGVzdCAtcyBjb25mdGVzdDsgdGhlbgogICBybSAtcmYgY29uZnRlc3QqCiAgIGFjX2N2X2NfZGxsPSJ5ZXMiCiBlbHNlCkBAIC0yMjc5LDE1ICsyMjg4LDU3IEBACiAKIAogCitlY2hvICRhY19uICJjaGVja2luZyAiZm9yIHJlZW50cmFudCBYIGxpYnJhcmllcyIiIi4uLiAkYWNfYyIgMT4mNgorZWNobyAiY29uZmlndXJlOjIyOTM6IGNoZWNraW5nICJmb3IgcmVlbnRyYW50IFggbGlicmFyaWVzIiIgPiY1CitpZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snd2luZV9jdl94X3JlZW50cmFudCcrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCisgIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2CitlbHNlCisgICBpZiB0ZXN0ICJ4JHdpdGhfcmVlbnRyYW50X3giID0gInhubyIKKyAgICB0aGVuCisgICAgICAgIHdpbmVfY3ZfeF9yZWVudHJhbnQ9bm8KKyAgICBlbHNlCisJbGliWDExX2NrZWNrPW5vbmUKKwlmb3IgZGlyIGluICIkeF9saWJyYXJpZXMiIC91c3IvbGliIC91c3IvbG9jYWwvbGliIC9saWI7IGRvCisJICAgIGlmIHRlc3QgLWUgJGRpci9saWJYMTEuc287IHRoZW4KKwkJbGliWDExX2NoZWNrPSItRCAkZGlyL2xpYlgxMS5zbyIKKwkJYnJlYWsgMQorCSAgICBmaQorCSAgICBpZiB0ZXN0IC1lICRkaXIvbGliWDExLmE7IHRoZW4KKwkJbGliWDExX2NoZWNrPSIkZGlyL2xpYlgxMS5hIgorCQlicmVhayAxCisJICAgIGZpCisJZG9uZQorCWlmIHRlc3QgIiRsaWJYMTFfY2hlY2siICE9ICJub25lIjsgdGhlbgorCSAgICBpZiBubSAkbGliWDExX2NoZWNrIHwgZ3JlcCAtcSBfX2Vycm5vX2xvY2F0aW9uOyB0aGVuCisJCXdpbmVfY3ZfeF9yZWVudHJhbnQ9eWVzCisJICAgIGVsc2UKKwkJd2luZV9jdl94X3JlZW50cmFudD1ubworCSAgICBmaQorCWVsc2UKKwkgICAgd2luZV9jdl94X3JlZW50cmFudD11bmtub3duCisJZmkKKyAgICBmaSAgCitmaQorCitlY2hvICIkYWNfdCIiJHdpbmVfY3ZfeF9yZWVudHJhbnQiIDE+JjYKK2lmIHRlc3QgIiR3aW5lX2N2X3hfcmVlbnRyYW50IiA9ICJubyIKK3RoZW4KKyAgY2F0ID4+IGNvbmZkZWZzLmggPDxcRU9GCisjZGVmaW5lIE5PX1JFRU5UUkFOVF9YMTEgMQorRU9GCisKK2ZpCisKKwogZm9yIGFjX2Z1bmMgaW4gY2xvbmUgbWVtbW92ZSBzdHJlcnJvciB0Y2dldGF0dHIgdXNsZWVwIHdhaXQ0IHdhaXRwaWQKIGRvCiBlY2hvICRhY19uICJjaGVja2luZyBmb3IgJGFjX2Z1bmMiIi4uLiAkYWNfYyIgMT4mNgotZWNobyAiY29uZmlndXJlOjIyODY6IGNoZWNraW5nIGZvciAkYWNfZnVuYyIgPiY1CitlY2hvICJjb25maWd1cmU6MjMzNzogY2hlY2tpbmcgZm9yICRhY19mdW5jIiA+JjUKIGlmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhY19jdl9mdW5jXyRhY19mdW5jJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KICAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKIGVsc2UKICAgY2F0ID4gY29uZnRlc3QuJGFjX2V4dCA8PEVPRgotI2xpbmUgMjI5MSAiY29uZmlndXJlIgorI2xpbmUgMjM0MiAiY29uZmlndXJlIgogI2luY2x1ZGUgImNvbmZkZWZzLmgiCiAvKiBTeXN0ZW0gaGVhZGVyIHRvIGRlZmluZSBfX3N0dWIgbWFjcm9zIGFuZCBob3BlZnVsbHkgZmV3IHByb3RvdHlwZXMsCiAgICAgd2hpY2ggY2FuIGNvbmZsaWN0IHdpdGggY2hhciAkYWNfZnVuYygpOyBiZWxvdy4gICovCkBAIC0yMzEwLDcgKzIzNjEsNyBAQAogCiA7IHJldHVybiAwOyB9CiBFT0YKLWlmIHsgKGV2YWwgZWNobyBjb25maWd1cmU6MjMxNDogXCIkYWNfbGlua1wiKSAxPiY1OyAoZXZhbCAkYWNfbGluaykgMj4mNTsgfSAmJiB0ZXN0IC1zIGNvbmZ0ZXN0OyB0aGVuCitpZiB7IChldmFsIGVjaG8gY29uZmlndXJlOjIzNjU6IFwiJGFjX2xpbmtcIikgMT4mNTsgKGV2YWwgJGFjX2xpbmspIDI+JjU7IH0gJiYgdGVzdCAtcyBjb25mdGVzdDsgdGhlbgogICBybSAtcmYgY29uZnRlc3QqCiAgIGV2YWwgImFjX2N2X2Z1bmNfJGFjX2Z1bmM9eWVzIgogZWxzZQpAQCAtMjMzOCwxNyArMjM4OSwxNyBAQAogZG8KIGFjX3NhZmU9YGVjaG8gIiRhY19oZHIiIHwgc2VkICd5JS4vKy0lX19wXyUnYAogZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yICRhY19oZHIiIi4uLiAkYWNfYyIgMT4mNgotZWNobyAiY29uZmlndXJlOjIzNDI6IGNoZWNraW5nIGZvciAkYWNfaGRyIiA+JjUKK2VjaG8gImNvbmZpZ3VyZToyMzkzOiBjaGVja2luZyBmb3IgJGFjX2hkciIgPiY1CiBpZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3ZfaGVhZGVyXyRhY19zYWZlJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KICAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKIGVsc2UKICAgY2F0ID4gY29uZnRlc3QuJGFjX2V4dCA8PEVPRgotI2xpbmUgMjM0NyAiY29uZmlndXJlIgorI2xpbmUgMjM5OCAiY29uZmlndXJlIgogI2luY2x1ZGUgImNvbmZkZWZzLmgiCiAjaW5jbHVkZSA8JGFjX2hkcj4KIEVPRgogYWNfdHJ5PSIkYWNfY3BwIGNvbmZ0ZXN0LiRhY19leHQgPi9kZXYvbnVsbCAyPmNvbmZ0ZXN0Lm91dCIKLXsgKGV2YWwgZWNobyBjb25maWd1cmU6MjM1MjogXCIkYWNfdHJ5XCIpIDE+JjU7IChldmFsICRhY190cnkpIDI+JjU7IH0KK3sgKGV2YWwgZWNobyBjb25maWd1cmU6MjQwMzogXCIkYWNfdHJ5XCIpIDE+JjU7IChldmFsICRhY190cnkpIDI+JjU7IH0KIGFjX2Vycj1gZ3JlcCAtdiAnXiAqKycgY29uZnRlc3Qub3V0YAogaWYgdGVzdCAteiAiJGFjX2VyciI7IHRoZW4KICAgcm0gLXJmIGNvbmZ0ZXN0KgpAQCAtMjM3NSwxMiArMjQyNiwxMiBAQAogZG9uZQogCiBlY2hvICRhY19uICJjaGVja2luZyB3aGV0aGVyIHN0YXQgZmlsZS1tb2RlIG1hY3JvcyBhcmUgYnJva2VuIiIuLi4gJGFjX2MiIDE+JjYKLWVjaG8gImNvbmZpZ3VyZToyMzc5OiBjaGVja2luZyB3aGV0aGVyIHN0YXQgZmlsZS1tb2RlIG1hY3JvcyBhcmUgYnJva2VuIiA+JjUKK2VjaG8gImNvbmZpZ3VyZToyNDMwOiBjaGVja2luZyB3aGV0aGVyIHN0YXQgZmlsZS1tb2RlIG1hY3JvcyBhcmUgYnJva2VuIiA+JjUKIGlmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhY19jdl9oZWFkZXJfc3RhdF9icm9rZW4nK3NldH0nYFwiID0gc2V0IjsgdGhlbgogICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgogZWxzZQogICBjYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8RU9GCi0jbGluZSAyMzg0ICJjb25maWd1cmUiCisjbGluZSAyNDM1ICJjb25maWd1cmUiCiAjaW5jbHVkZSAiY29uZmRlZnMuaCIKICNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KICNpbmNsdWRlIDxzeXMvc3RhdC5oPgpAQCAtMjQzMSwxMiArMjQ4MiwxMiBAQAogZmkKIAogZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yIHdvcmtpbmcgY29uc3QiIi4uLiAkYWNfYyIgMT4mNgotZWNobyAiY29uZmlndXJlOjI0MzU6IGNoZWNraW5nIGZvciB3b3JraW5nIGNvbnN0IiA+JjUKK2VjaG8gImNvbmZpZ3VyZToyNDg2OiBjaGVja2luZyBmb3Igd29ya2luZyBjb25zdCIgPiY1CiBpZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3ZfY19jb25zdCcrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCiAgIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2CiBlbHNlCiAgIGNhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDxFT0YKLSNsaW5lIDI0NDAgImNvbmZpZ3VyZSIKKyNsaW5lIDI0OTEgImNvbmZpZ3VyZSIKICNpbmNsdWRlICJjb25mZGVmcy5oIgogCiBpbnQgbWFpbigpIHsKQEAgLTI0ODUsNyArMjUzNiw3IEBACiAKIDsgcmV0dXJuIDA7IH0KIEVPRgotaWYgeyAoZXZhbCBlY2hvIGNvbmZpZ3VyZToyNDg5OiBcIiRhY19jb21waWxlXCIpIDE+JjU7IChldmFsICRhY19jb21waWxlKSAyPiY1OyB9OyB0aGVuCitpZiB7IChldmFsIGVjaG8gY29uZmlndXJlOjI1NDA6IFwiJGFjX2NvbXBpbGVcIikgMT4mNTsgKGV2YWwgJGFjX2NvbXBpbGUpIDI+JjU7IH07IHRoZW4KICAgcm0gLXJmIGNvbmZ0ZXN0KgogICBhY19jdl9jX2NvbnN0PXllcwogZWxzZQpAQCAtMjUwNiwxMiArMjU1NywxMiBAQAogZmkKIAogZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yIEFOU0kgQyBoZWFkZXIgZmlsZXMiIi4uLiAkYWNfYyIgMT4mNgotZWNobyAiY29uZmlndXJlOjI1MTA6IGNoZWNraW5nIGZvciBBTlNJIEMgaGVhZGVyIGZpbGVzIiA+JjUKK2VjaG8gImNvbmZpZ3VyZToyNTYxOiBjaGVja2luZyBmb3IgQU5TSSBDIGhlYWRlciBmaWxlcyIgPiY1CiBpZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3ZfaGVhZGVyX3N0ZGMnK3NldH0nYFwiID0gc2V0IjsgdGhlbgogICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgogZWxzZQogICBjYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8RU9GCi0jbGluZSAyNTE1ICJjb25maWd1cmUiCisjbGluZSAyNTY2ICJjb25maWd1cmUiCiAjaW5jbHVkZSAiY29uZmRlZnMuaCIKICNpbmNsdWRlIDxzdGRsaWIuaD4KICNpbmNsdWRlIDxzdGRhcmcuaD4KQEAgLTI1MTksNyArMjU3MCw3IEBACiAjaW5jbHVkZSA8ZmxvYXQuaD4KIEVPRgogYWNfdHJ5PSIkYWNfY3BwIGNvbmZ0ZXN0LiRhY19leHQgPi9kZXYvbnVsbCAyPmNvbmZ0ZXN0Lm91dCIKLXsgKGV2YWwgZWNobyBjb25maWd1cmU6MjUyMzogXCIkYWNfdHJ5XCIpIDE+JjU7IChldmFsICRhY190cnkpIDI+JjU7IH0KK3sgKGV2YWwgZWNobyBjb25maWd1cmU6MjU3NDogXCIkYWNfdHJ5XCIpIDE+JjU7IChldmFsICRhY190cnkpIDI+JjU7IH0KIGFjX2Vycj1gZ3JlcCAtdiAnXiAqKycgY29uZnRlc3Qub3V0YAogaWYgdGVzdCAteiAiJGFjX2VyciI7IHRoZW4KICAgcm0gLXJmIGNvbmZ0ZXN0KgpAQCAtMjUzNiw3ICsyNTg3LDcgQEAKIGlmIHRlc3QgJGFjX2N2X2hlYWRlcl9zdGRjID0geWVzOyB0aGVuCiAgICMgU3VuT1MgNC54IHN0cmluZy5oIGRvZXMgbm90IGRlY2xhcmUgbWVtKiwgY29udHJhcnkgdG8gQU5TSS4KIGNhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDxFT0YKLSNsaW5lIDI1NDAgImNvbmZpZ3VyZSIKKyNsaW5lIDI1OTEgImNvbmZpZ3VyZSIKICNpbmNsdWRlICJjb25mZGVmcy5oIgogI2luY2x1ZGUgPHN0cmluZy5oPgogRU9GCkBAIC0yNTU0LDcgKzI2MDUsNyBAQAogaWYgdGVzdCAkYWNfY3ZfaGVhZGVyX3N0ZGMgPSB5ZXM7IHRoZW4KICAgIyBJU0MgMi4wLjIgc3RkbGliLmggZG9lcyBub3QgZGVjbGFyZSBmcmVlLCBjb250cmFyeSB0byBBTlNJLgogY2F0ID4gY29uZnRlc3QuJGFjX2V4dCA8PEVPRgotI2xpbmUgMjU1OCAiY29uZmlndXJlIgorI2xpbmUgMjYwOSAiY29uZmlndXJlIgogI2luY2x1ZGUgImNvbmZkZWZzLmgiCiAjaW5jbHVkZSA8c3RkbGliLmg+CiBFT0YKQEAgLTI1NzUsNyArMjYyNiw3IEBACiAgIDoKIGVsc2UKICAgY2F0ID4gY29uZnRlc3QuJGFjX2V4dCA8PEVPRgotI2xpbmUgMjU3OSAiY29uZmlndXJlIgorI2xpbmUgMjYzMCAiY29uZmlndXJlIgogI2luY2x1ZGUgImNvbmZkZWZzLmgiCiAjaW5jbHVkZSA8Y3R5cGUuaD4KICNkZWZpbmUgSVNMT1dFUihjKSAoJ2EnIDw9IChjKSAmJiAoYykgPD0gJ3onKQpAQCAtMjU4Niw3ICsyNjM3LDcgQEAKIGV4aXQgKDApOyB9CiAKIEVPRgotaWYgeyAoZXZhbCBlY2hvIGNvbmZpZ3VyZToyNTkwOiBcIiRhY19saW5rXCIpIDE+JjU7IChldmFsICRhY19saW5rKSAyPiY1OyB9ICYmIHRlc3QgLXMgY29uZnRlc3QgJiYgKC4vY29uZnRlc3Q7IGV4aXQpIDI+L2Rldi9udWxsCitpZiB7IChldmFsIGVjaG8gY29uZmlndXJlOjI2NDE6IFwiJGFjX2xpbmtcIikgMT4mNTsgKGV2YWwgJGFjX2xpbmspIDI+JjU7IH0gJiYgdGVzdCAtcyBjb25mdGVzdCAmJiAoLi9jb25mdGVzdDsgZXhpdCkgMj4vZGV2L251bGwKIHRoZW4KICAgOgogZWxzZQpAQCAtMjYxMCwxMiArMjY2MSwxMiBAQAogZmkKIAogZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yIHNpemVfdCIiLi4uICRhY19jIiAxPiY2Ci1lY2hvICJjb25maWd1cmU6MjYxNDogY2hlY2tpbmcgZm9yIHNpemVfdCIgPiY1CitlY2hvICJjb25maWd1cmU6MjY2NTogY2hlY2tpbmcgZm9yIHNpemVfdCIgPiY1CiBpZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3ZfdHlwZV9zaXplX3QnK3NldH0nYFwiID0gc2V0IjsgdGhlbgogICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgogZWxzZQogICBjYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8RU9GCi0jbGluZSAyNjE5ICJjb25maWd1cmUiCisjbGluZSAyNjcwICJjb25maWd1cmUiCiAjaW5jbHVkZSAiY29uZmRlZnMuaCIKICNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KICNpZiBTVERDX0hFQURFUlMKQEAgLTI3NzIsOCArMjgyMywxMCBAQAogb2JqZWN0cy9NYWtlZmlsZQogb2xlL01ha2VmaWxlCiBwcm9ncmFtcy9NYWtlZmlsZQorcHJvZ3JhbXMvY2xvY2svTWFrZWZpbGUKIHByb2dyYW1zL25vdGVwYWQvTWFrZWZpbGUKIHByb2dyYW1zL3Byb2dtYW4vTWFrZWZpbGUKK3Byb2dyYW1zL3ZpZXcvTWFrZWZpbGUKIHByb2dyYW1zL3dpbmhlbHAvTWFrZWZpbGUKIHByb2dyYW1zL3dpbnZlci9NYWtlZmlsZQogcmMvTWFrZWZpbGUKQEAgLTI4OTgsOCArMjk1MSwxMCBAQAogb2JqZWN0cy9NYWtlZmlsZQogb2xlL01ha2VmaWxlCiBwcm9ncmFtcy9NYWtlZmlsZQorcHJvZ3JhbXMvY2xvY2svTWFrZWZpbGUKIHByb2dyYW1zL25vdGVwYWQvTWFrZWZpbGUKIHByb2dyYW1zL3Byb2dtYW4vTWFrZWZpbGUKK3Byb2dyYW1zL3ZpZXcvTWFrZWZpbGUKIHByb2dyYW1zL3dpbmhlbHAvTWFrZWZpbGUKIHByb2dyYW1zL3dpbnZlci9NYWtlZmlsZQogcmMvTWFrZWZpbGUKZGlmZiAtLWdpdCBhL2NvbmZpZ3VyZS5pbiBiL2NvbmZpZ3VyZS5pbgppbmRleCBjNzBkODBjLi5mMDJlMzBjIDEwMDY0NAotLS0gYS9jb25maWd1cmUuaW4KKysrIGIvY29uZmlndXJlLmluCkBAIC0yOCw2ICsyOCw5IEBACiBkbmwgWyAgLS1lbmFibGUtaXBjICAgICAgICAgICAgdXNlIGludGVyLXByb2Nlc3MgY29tbXVuaWNhdGlvbiBmb3IgRERFXSwKIGRubCBbaWYgdGVzdCAiJGVuYWJsZXZhbCIgPSAibm8iOyB0aGVuIDogOyBlbHNlIE9QVElPTlM9Ii1EQ09ORklHX0lQQyI7IGZpXSkKIAorQUNfQVJHX1dJVEgocmVlbnRyYW50LXgsCitbICAtLXdpdGhvdXQtcmVlbnRyYW50LXggICBDb21waWxlIGZvciB1c2Ugd2l0aCBub24tcmVlbnRyYW50IFggbGlicmFyaWVzXSkKKwogQUNfU1VCU1QoTUFJTl9UQVJHRVQpCiBBQ19TVUJTVChMSUJfVEFSR0VUKQogQUNfU1VCU1QoT1BUSU9OUykKQEAgLTE2Miw2ICsxNjUsNDMgQEAKIGZpCiBBQ19TVUJTVChETExGTEFHUykKIAorZG5sICoqKiogQ2hlY2sgZm9yIHJlZW50cmFudCBYIGxpYnJhcmllcyAqKioqCitkbmwKK2RubCBUaGlzIG1heSBmYWlsIHRvIGRldGVybWluZSB3aGV0aGVyIFggbGlicmFyaWVzIGFyZSByZWVudHJhbnQgaWYKK2RubCBBQ19QQVRIX1hUUkEgZG9lcyBub3Qgc2V0IHhfbGlicmFyaWVzLiBJbiB0aGlzIGNhc2UgbWFudWFsIGNvbmZpZ3VyYXRpb24KK2RubCBpcyBwb3NzaWJsZSB3aXRoIHRoZSAtLXdpdGhvdXQtcmVlbnRyYW50LXggb3B0aW9uLgorCitBQ19DQUNIRV9DSEVDSyggImZvciByZWVudHJhbnQgWCBsaWJyYXJpZXMiLCB3aW5lX2N2X3hfcmVlbnRyYW50LAorICBbIGlmIHRlc3QgIngkd2l0aF9yZWVudHJhbnRfeCIgPSAieG5vIgorICAgIHRoZW4KKyAgICAgICAgd2luZV9jdl94X3JlZW50cmFudD1ubworICAgIGVsc2UKKwlsaWJYMTFfY2tlY2s9bm9uZQorCWZvciBkaXIgaW4gIiR4X2xpYnJhcmllcyIgL3Vzci9saWIgL3Vzci9sb2NhbC9saWIgL2xpYjsgZG8KKwkgICAgaWYgdGVzdCAtZSAkZGlyL2xpYlgxMS5zbzsgdGhlbgorCQlsaWJYMTFfY2hlY2s9Ii1EICRkaXIvbGliWDExLnNvIgorCQlicmVhayAxCisJICAgIGZpCisJICAgIGlmIHRlc3QgLWUgJGRpci9saWJYMTEuYTsgdGhlbgorCQlsaWJYMTFfY2hlY2s9IiRkaXIvbGliWDExLmEiCisJCWJyZWFrIDEKKwkgICAgZmkKKwlkb25lCisJaWYgdGVzdCAiJGxpYlgxMV9jaGVjayIgIT0gIm5vbmUiOyB0aGVuCisJICAgIGlmIG5tICRsaWJYMTFfY2hlY2sgfCBncmVwIC1xIF9fZXJybm9fbG9jYXRpb247IHRoZW4KKwkJd2luZV9jdl94X3JlZW50cmFudD15ZXMKKwkgICAgZWxzZQorCQl3aW5lX2N2X3hfcmVlbnRyYW50PW5vCisJICAgIGZpCisJZWxzZQorCSAgICB3aW5lX2N2X3hfcmVlbnRyYW50PXVua25vd24KKwlmaQorICAgIGZpIF0gKQoraWYgdGVzdCAiJHdpbmVfY3ZfeF9yZWVudHJhbnQiID0gIm5vIgordGhlbgorICBBQ19ERUZJTkUoTk9fUkVFTlRSQU5UX1gxMSkKK2ZpCisKIGRubCAqKioqIENoZWNrIGZvciBmdW5jdGlvbnMgYW5kIGhlYWRlciBmaWxlcyAqKioqCiAKIEFDX0NIRUNLX0ZVTkNTKGNsb25lIG1lbW1vdmUgc3RyZXJyb3IgdGNnZXRhdHRyIHVzbGVlcCB3YWl0NCB3YWl0cGlkKQpAQCAtMTk5LDggKzIzOSwxMCBAQAogb2JqZWN0cy9NYWtlZmlsZQogb2xlL01ha2VmaWxlCiBwcm9ncmFtcy9NYWtlZmlsZQorcHJvZ3JhbXMvY2xvY2svTWFrZWZpbGUKIHByb2dyYW1zL25vdGVwYWQvTWFrZWZpbGUKIHByb2dyYW1zL3Byb2dtYW4vTWFrZWZpbGUKK3Byb2dyYW1zL3ZpZXcvTWFrZWZpbGUKIHByb2dyYW1zL3dpbmhlbHAvTWFrZWZpbGUKIHByb2dyYW1zL3dpbnZlci9NYWtlZmlsZQogcmMvTWFrZWZpbGUKZGlmZiAtLWdpdCBhL2NvbnRyb2xzL2NvbWJvLmMgYi9jb250cm9scy9jb21iby5jCmluZGV4IGFmNjFkNjMuLjRjYWNlYzcgMTAwNjQ0Ci0tLSBhL2NvbnRyb2xzL2NvbWJvLmMKKysrIGIvY29udHJvbHMvY29tYm8uYwpAQCAtMTgsNyArMTgsNiBAQAogI2luY2x1ZGUgImhlYXAuaCIKICNpbmNsdWRlICJjb21iby5oIgogI2luY2x1ZGUgImRyaXZlLmgiCi0jaW5jbHVkZSAic3RkZGVidWcuaCIKICNpbmNsdWRlICJkZWJ1Zy5oIgogCiAgIC8qIGJpdHMgaW4gdGhlIGR3S2V5RGF0YSAqLwpAQCAtNjMsNyArNjIsNyBAQAogICAgICAgQ0JpdEhlaWdodCA9IGJtLmJtSGVpZ2h0OwogICAgICAgQ0JpdFdpZHRoICA9IGJtLmJtV2lkdGg7CiAKLSAgICAgIGRwcmludGZfY29tYm8oc3RkZGViLCAiY29tYm8gYml0bWFwIFslaSwlaV1cbiIsIENCaXRXaWR0aCwgQ0JpdEhlaWdodCApOworICAgICAgZHByaW50Zl9pbmZvKGNvbWJvLCAiY29tYm8gYml0bWFwIFslaSwlaV1cbiIsIENCaXRXaWR0aCwgQ0JpdEhlaWdodCApOwogCiAgICAgICBoUHJldkIgPSBTZWxlY3RPYmplY3QxNiggaERDLCBoQ29tYm9CbXApOwogICAgICAgU2V0UmVjdDE2KCAmciwgMCwgMCwgQ0JpdFdpZHRoLCBDQml0SGVpZ2h0ICk7CkBAIC0xMDIsNyArMTAxLDcgQEAKIAlpZiggISh3bmQtPmR3RXhTdHlsZSAmIFdTX0VYX05PUEFSRU5UTk9USUZZKSApCiAJICAgICAgbHBoYy0+d1N0YXRlIHw9IENCRl9OT1RJRlk7CiAKLQlkcHJpbnRmX2NvbWJvKHN0ZGRlYiwgIkNPTUJPX05DQ3JlYXRlOiBbMHglMDh4XSwgc3R5bGUgPSAlMDh4XG4iLCAKKwlkcHJpbnRmX2luZm8oY29tYm8sICJDT01CT19OQ0NyZWF0ZTogWzB4JTA4eF0sIHN0eWxlID0gJTA4eFxuIiwgCiAJCQkJCQkoVUlOVDMyKWxwaGMsIGxwaGMtPmR3U3R5bGUgKTsKIAogCXJldHVybiAoTFJFU1VMVCkoVUlOVDMyKXduZC0+aHduZFNlbGY7IApAQCAtMTIwLDcgKzExOSw3IEBACiAgICB7CiAgICAgICAgV05EKgkJd25kID0gbHBoYy0+c2VsZjsKIAotICAgICAgIGRwcmludGZfY29tYm8oc3RkZGViLCJDb21ibyBbJTA0eF06IGZyZWVpbmcgc3RvcmFnZVxuIiwgQ0JfSFdORChscGhjKSk7CisgICAgICAgZHByaW50Zl9pbmZvKGNvbWJvLCJDb21ibyBbJTA0eF06IGZyZWVpbmcgc3RvcmFnZVxuIiwgQ0JfSFdORChscGhjKSk7CiAKICAgICAgICBpZiggKENCX0dFVFRZUEUobHBoYykgIT0gQ0JTX1NJTVBMRSkgJiYgbHBoYy0+aFduZExCb3ggKSAKICAgIAkgICBEZXN0cm95V2luZG93MzIoIGxwaGMtPmhXbmRMQm94ICk7CkBAIC0yMTksNyArMjE4LDcgQEAKICAgIGlmKCBscGhjLT5kcm9wcGVkV2lkdGggPiAobHByTEItPnJpZ2h0IC0gbHByTEItPmxlZnQpICkKICAgICAgICBscHJMQi0+cmlnaHQgPSBscHJMQi0+bGVmdCArIChJTlQxNilscGhjLT5kcm9wcGVkV2lkdGg7CiAKLWRwcmludGZfY29tYm8oc3RkZGViLCJDb21ibyBbJTA0eF06ICglaSwlaS0laSwlaSkgcGxhY2VtZW50XG5cdHRleHRcdD0gKCVpLCVpLSVpLCVpKVwKK2RwcmludGZfaW5mbyhjb21ibywiQ29tYm8gWyUwNHhdOiAoJWksJWktJWksJWkpIHBsYWNlbWVudFxuXHR0ZXh0XHQ9ICglaSwlaS0laSwlaSlcCiBcblx0YnV0dG9uXHQ9ICglaSwlaS0laSwlaSlcblx0bGJveFx0PSAoJWksJWktJWksJWkpXG4iLCBDQl9IV05EKGxwaGMpLAogbHBoYy0+UmVjdENvbWJvLmxlZnQsIGxwaGMtPlJlY3RDb21iby50b3AsIGxwaGMtPlJlY3RDb21iby5yaWdodCwgbHBoYy0+UmVjdENvbWJvLmJvdHRvbSwKIGxwckVkaXQtPmxlZnQsIGxwckVkaXQtPnRvcCwgbHByRWRpdC0+cmlnaHQsIGxwckVkaXQtPmJvdHRvbSwKQEAgLTMzOCwxMiArMzM3LDEyIEBACiAJCQkJU1dQX05PTU9WRSB8IFNXUF9OT1pPUkRFUiB8IFNXUF9OT0FDVElWQVRFICk7CiAJCWxwaGMtPndTdGF0ZSAmPSB+Q0JGX05PUkVTSVpFOwogCSAgICAgIH0KLQkgICAgICBkcHJpbnRmX2NvbWJvKHN0ZGRlYiwiQ09NQk9fQ3JlYXRlOiBpbml0IGRvbmVcbiIpOworCSAgICAgIGRwcmludGZfaW5mbyhjb21ibywiQ09NQk9fQ3JlYXRlOiBpbml0IGRvbmVcbiIpOwogCSAgICAgIHJldHVybiB3bmQtPmh3bmRTZWxmOwogCSAgfQotCSAgZHByaW50Zl9jb21ibyhzdGRlcnIsICJDT01CT19DcmVhdGU6IGVkaXQgY29udHJvbCBmYWlsdXJlLlxuIik7Ci0gICAgICB9IGVsc2UgZHByaW50Zl9jb21ibyhzdGRlcnIsICJDT01CT19DcmVhdGU6IGxpc3Rib3ggZmFpbHVyZS5cbiIpOwotICB9IGVsc2UgZHByaW50Zl9jb21ibyhzdGRlcnIsICJDT01CT19DcmVhdGU6IG5vIG93bmVyIGZvciB2aXNpYmxlIGNvbWJvLlxuIik7CisJICBkcHJpbnRmX2Vycihjb21ibywgIkNPTUJPX0NyZWF0ZTogZWRpdCBjb250cm9sIGZhaWx1cmUuXG4iKTsKKyAgICAgIH0gZWxzZSBkcHJpbnRmX2Vycihjb21ibywgIkNPTUJPX0NyZWF0ZTogbGlzdGJveCBmYWlsdXJlLlxuIik7CisgIH0gZWxzZSBkcHJpbnRmX2Vycihjb21ibywgIkNPTUJPX0NyZWF0ZTogbm8gb3duZXIgZm9yIHZpc2libGUgY29tYm8uXG4iKTsKIAogICAvKiBDcmVhdGVXaW5kb3coKSB3aWxsIHNlbmQgV01fTkNERVNUUk9ZIHRvIGNsZWFudXAgKi8KIApAQCAtNTYyLDcgKzU2MSw3IEBACiAgICBpZiggbGVuZ3RoID4gMCApIAogICAgICAgIHBUZXh0ID0gKExQU1RSKSBIZWFwQWxsb2MoIEdldFByb2Nlc3NIZWFwKCksIDAsIGxlbmd0aCArIDEpOwogCi0gICBkcHJpbnRmX2NvbWJvKHN0ZGRlYiwiXHRDQlVwZGF0ZUxCb3g6IGVkaXQgdGV4dCBsZW5ndGggJWlcbiIsIGxlbmd0aCApOworICAgZHByaW50Zl9pbmZvKGNvbWJvLCJcdENCVXBkYXRlTEJveDogZWRpdCB0ZXh0IGxlbmd0aCAlaVxuIiwgbGVuZ3RoICk7CiAKICAgIGlmKCBwVGV4dCApCiAgICB7CkBAIC01OTgsNyArNTk3LDcgQEAKICAgIElOVDMyCWxlbmd0aDsKICAgIExQU1RSCXBUZXh0ID0gTlVMTDsKIAotICAgZHByaW50Zl9jb21ibyhzdGRkZWIsIlx0Q0JVcGRhdGVFZGl0OiAlaVxuIiwgaW5kZXggKTsKKyAgIGRwcmludGZfaW5mbyhjb21ibywiXHRDQlVwZGF0ZUVkaXQ6ICVpXG4iLCBpbmRleCApOwogCiAgICBpZiggaW5kZXggPT0gLTEgKQogICAgewpAQCAtNjQzLDcgKzY0Miw3IEBACiAgICBSRUNUMTYJcmVjdDsKICAgIExQUkVDVDE2CXBSZWN0ID0gTlVMTDsKIAotICAgZHByaW50Zl9jb21ibyhzdGRkZWIsIkNvbWJvIFslMDR4XTogZHJvcCBkb3duXG4iLCBDQl9IV05EKGxwaGMpKTsKKyAgIGRwcmludGZfaW5mbyhjb21ibywiQ29tYm8gWyUwNHhdOiBkcm9wIGRvd25cbiIsIENCX0hXTkQobHBoYykpOwogCiAgICBDQl9OT1RJRlkoIGxwaGMsIENCTl9EUk9QRE9XTiApOwogCkBAIC02OTksNyArNjk4LDcgQEAKICAgIGlmKCBJc1dpbmRvdzMyKCBoV25kICkgJiYgQ0JfR0VUVFlQRShscGhjKSAhPSBDQlNfU0lNUExFICkKICAgIHsKIAotICAgICAgIGRwcmludGZfY29tYm8oc3RkZGViLCJDb21ibyBbJTA0eF06IHJvbGwgdXAgWyVpXVxuIiwgQ0JfSFdORChscGhjKSwgKElOVDMyKW9rICk7CisgICAgICAgZHByaW50Zl9pbmZvKGNvbWJvLCJDb21ibyBbJTA0eF06IHJvbGwgdXAgWyVpXVxuIiwgQ0JfSFdORChscGhjKSwgKElOVDMyKW9rICk7CiAKICAgICAgICAvKiBhbHdheXMgc2VuZCBXTV9MQlVUVE9OVVA/ICovCiAgICAgICAgU2VuZE1lc3NhZ2UzMkEoIGxwaGMtPmhXbmRMQm94LCBXTV9MQlVUVE9OVVAsIDAsIChMUEFSQU0pKC0xKSApOwpAQCAtODQwLDcgKzgzOSw3IEBACiAgICAgICAgeyAgIAogCSAgIGNhc2UgKEVOX1NFVEZPQ1VTID4+IDgpOgogCi0JCWRwcmludGZfY29tYm8oc3RkZGViLCJDb21ibyBbJTA0eF06IGVkaXQgWyUwNHhdIGdvdCBmb2N1c1xuIiwgCisJCWRwcmludGZfaW5mbyhjb21ibywiQ29tYm8gWyUwNHhdOiBlZGl0IFslMDR4XSBnb3QgZm9jdXNcbiIsIAogCQkJCSAgICAgQ0JfSFdORChscGhjKSwgKEhXTkQxNilscGhjLT5oV25kRWRpdCApOwogCiAJCWlmKCAhKGxwaGMtPndTdGF0ZSAmIENCRl9GT0NVU0VEKSApIENPTUJPX1NldEZvY3VzKCBscGhjICk7CkBAIC04NDgsNyArODQ3LDcgQEAKIAogCSAgIGNhc2UgKEVOX0tJTExGT0NVUyA+PiA4KToKIAotCQlkcHJpbnRmX2NvbWJvKHN0ZGRlYiwiQ29tYm8gWyUwNHhdOiBlZGl0IFslMDR4XSBsb3N0IGZvY3VzXG4iLAorCQlkcHJpbnRmX2luZm8oY29tYm8sIkNvbWJvIFslMDR4XTogZWRpdCBbJTA0eF0gbG9zdCBmb2N1c1xuIiwKIAkJCQkgICAgICBDQl9IV05EKGxwaGMpLCAoSFdORDE2KWxwaGMtPmhXbmRFZGl0ICk7CiAKIAkJLyogTk9URTogaXQgc2VlbXMgdGhhdCBXaW5kb3dzJyBlZGl0IGNvbnRyb2wgc2VuZHMgYW4KQEAgLTg4OSw3ICs4ODgsNyBAQAogCSAgIGNhc2UgTEJOX1NFTENIQU5HRToKIAkgICBjYXNlIExCTl9TRUxDQU5DRUw6CiAKLQkJZHByaW50Zl9jb21ibyhzdGRkZWIsIkNvbWJvIFslMDR4XTogbGJveCBzZWxlY3Rpb24gY2hhbmdlIFslMDR4XVxuIiwgCisJCWRwcmludGZfaW5mbyhjb21ibywiQ29tYm8gWyUwNHhdOiBsYm94IHNlbGVjdGlvbiBjaGFuZ2UgWyUwNHhdXG4iLCAKIAkJCQkJCSAgICAgIENCX0hXTkQobHBoYyksIGxwaGMtPndTdGF0ZSApOwogCiAJCS8qIGRvIG5vdCByb2xsIHVwIGlmIHNlbGVjdGlvbiBpcyBiZWluZyB0cmFja2VkIApAQCAtOTIzLDcgKzkyMiw3IEBACiB7CiAgICBIV05EMzIJaFduZCA9IGxwaGMtPnNlbGYtPmh3bmRTZWxmOwogCi0gICBkcHJpbnRmX2NvbWJvKHN0ZGRlYiwiQ29tYm8gWyUwNHhdOiBvd25lcmRyYXcgb3AgJTA0eFxuIiwgCisgICBkcHJpbnRmX2luZm8oY29tYm8sIkNvbWJvIFslMDR4XTogb3duZXJkcmF3IG9wICUwNHhcbiIsIAogCQkJCSAgICAgICBDQl9IV05EKGxwaGMpLCAoVUlOVDE2KW1zZyApOwogCiAjZGVmaW5lIGxwSVMgICAgKChMUERFTEVURUlURU1TVFJVQ1QzMilsUGFyYW0pCkBAIC0xMDYxLDcgKzEwNjAsNyBAQAogICBHZXRXaW5kb3dSZWN0MTYoIGxwaGMtPnNlbGYtPmh3bmRTZWxmLCAmcmVjdCApOwogICB3ID0gcmVjdC5yaWdodCAtIHJlY3QubGVmdDsgaCA9IHJlY3QuYm90dG9tIC0gcmVjdC50b3A7CiAKLSAgZHByaW50Zl9jb21ibyhzdGRkZWIsIkNPTUJPX1NpemU6IHcgPSAlaSwgaCA9ICVpXG4iLCB3LCBoICk7CisgIGRwcmludGZfaW5mbyhjb21ibywiQ09NQk9fU2l6ZTogdyA9ICVpLCBoID0gJWlcbiIsIHcsIGggKTsKIAogICAvKiBDcmVhdGVXaW5kb3coKSBtYXkgc2VuZCBhIGJvZ3VzIFdNX1NJWkUsIGlnbm9yZSBpdCAqLwogCkBAIC0xMjU4LDcgKzEyNTcsNyBAQAogICAgIHsKICAgICAgIExQSEVBRENPTUJPCWxwaGMgPSBDQl9HRVRQVFIocFduZCk7CiAKLSAgICAgIGRwcmludGZfY29tYm8oIHN0ZGRlYiwgIkNvbWJvIFslMDR4XTogbXNnICVzIHdwICUwOHggbHAgJTA4bHhcbiIsCisgICAgICBkcHJpbnRmX2luZm8oY29tYm8sICJDb21ibyBbJTA0eF06IG1zZyAlcyB3cCAlMDh4IGxwICUwOGx4XG4iLAogICAgICAgICAgICAgICAgICAgICAgcFduZC0+aHduZFNlbGYsIFNQWV9HZXRNc2dOYW1lKG1lc3NhZ2UpLCB3UGFyYW0sIGxQYXJhbSApOwogCiAgICAgICBpZiggbHBoYyB8fCBtZXNzYWdlID09IFdNX05DQ1JFQVRFICkKQEAgLTE1NjAsNyArMTU1OSw3IEBACiAJCXJldHVybiAobHBoYy0+d1N0YXRlICYgQ0JGX0VVSSkgPyBUUlVFIDogRkFMU0U7CiAKIAljYXNlIChXTV9VU0VSICsgMHgxQik6Ci0JICAgICAgICBkcHJpbnRmX2NvbWJvKHN0ZGRlYiwiQ29tYm8gWyUwNHhdOiB1bmRvY3VtZW50ZWQgbXNnIVxuIiwgKEhXTkQxNilod25kICk7CisJICAgICAgICBkcHJpbnRmX3dhcm4oY29tYm8sICJDb21ibyBbJTA0eF06IHVuZG9jdW1lbnRlZCBtc2chXG4iLCAoSFdORDE2KWh3bmQgKTsKICAgICB9CiAgICAgcmV0dXJuIERlZldpbmRvd1Byb2MzMkEoaHduZCwgbWVzc2FnZSwgd1BhcmFtLCBsUGFyYW0pOwogICB9CmRpZmYgLS1naXQgYS9jb250cm9scy9lZGl0LmMgYi9jb250cm9scy9lZGl0LmMKaW5kZXggMzAzZDJmMS4uMzViNzc0ZiAxMDA2NDQKLS0tIGEvY29udHJvbHMvZWRpdC5jCisrKyBiL2NvbnRyb2xzL2VkaXQuYwpAQCAtMTgsNyArMTgsNiBAQAogI2luY2x1ZGUgImNvbWJvLmgiCiAjaW5jbHVkZSAibG9jYWwuaCIKICNpbmNsdWRlICJyZXNvdXJjZS5oIgotI2luY2x1ZGUgInN0ZGRlYnVnLmgiCiAjaW5jbHVkZSAiZGVidWcuaCIKICNpbmNsdWRlICJjYWxsYmFjay5oIgogCkBAIC0xMTAsNyArMTA5LDcgQEAKICNkZWZpbmUgT1JERVJfVUlOVDMyKHgseSkgZG8geyBpZiAoKFVJTlQzMikoeSkgPCAoVUlOVDMyKSh4KSkgU1dBUF9VSU5UMzIoKHgpLCh5KSk7IH0gd2hpbGUoMCkKIAogI2RlZmluZSBEUFJJTlRGX0VESVRfTk9USUZZKGh3bmQsIHN0cikgXAotCSh7ZHByaW50Zl9lZGl0KHN0ZGRlYiwgXAorCSh7ZHByaW50Zl9pbmZvKGVkaXQsIFwKIAkJCSJlZGl0OiBub3RpZmljYXRpb24gIiBzdHIgIiBzZW50IHRvIGh3bmQ9JTA4eFxuIiwgXAogCQkJKFVJTlQzMikoaHduZCkpO30pCiAKQEAgLTEyMywxMSArMTIyLDExIEBACiAJCQlNQUtFV1BBUkFNKCh3bmQpLT53SURtZW51LCB3Tm90aWZ5Q29kZSksIFwKIAkJCShMUEFSQU0pKHduZCktPmh3bmRTZWxmKSkKICNkZWZpbmUgRFBSSU5URl9FRElUX01TRzE2KHN0cikgXAotCWRwcmludGZfZWRpdChzdGRkZWIsIFwKKwlkcHJpbnRmX2luZm8oZWRpdCwgXAogCQkJImVkaXQ6IDE2IGJpdCA6ICIgc3RyICI6IGh3bmQ9JTA4eCwgd1BhcmFtPSUwOHgsIGxQYXJhbT0lMDh4XG4iLCBcCiAJCQkoVUlOVDMyKWh3bmQsIChVSU5UMzIpd1BhcmFtLCAoVUlOVDMyKWxQYXJhbSkKICNkZWZpbmUgRFBSSU5URl9FRElUX01TRzMyKHN0cikgXAotCWRwcmludGZfZWRpdChzdGRkZWIsIFwKKwlkcHJpbnRmX2luZm8oZWRpdCwgXAogCQkJImVkaXQ6IDMyIGJpdCA6ICIgc3RyICI6IGh3bmQ9JTA4eCwgd1BhcmFtPSUwOHgsIGxQYXJhbT0lMDh4XG4iLCBcCiAJCQkoVUlOVDMyKWh3bmQsIChVSU5UMzIpd1BhcmFtLCAoVUlOVDMyKWxQYXJhbSkKIApAQCAtOTg3LDcgKzk4Niw3IEBACiAJfQogICAgICAgICBlbHNlIGlmIChlcy0+d29yZF9icmVha19wcm9jMzJBKQogICAgICAgICB7Ci0gICAgICAgICAgICBkcHJpbnRmX3JlbGF5KCBzdGRkZWIsICJDYWxsVG8zMih3b3JkYnJrPSVwLHN0cj0nJXMnLGlkeD0lZCxjbnQ9JWQsYWN0PSVkKVxuIiwKKyAgICAgICAgICAgIGRwcmludGZfaW5mbyhyZWxheSwgIkNhbGxUbzMyKHdvcmRicms9JXAsc3RyPSclcycsaWR4PSVkLGNudD0lZCxhY3Q9JWQpXG4iLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgZXMtPndvcmRfYnJlYWtfcHJvYzMyQSwgZXMtPnRleHQgKyBzdGFydCwgaW5kZXgsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb3VudCwgYWN0aW9uICk7CiAgICAgICAgICAgICByZXR1cm4gKElOVDMyKWVzLT53b3JkX2JyZWFrX3Byb2MzMkEoIGVzLT50ZXh0ICsgc3RhcnQsIGluZGV4LApAQCAtMTMxOSw3ICsxMzE4LDcgQEAKIAlpZiAoc2l6ZSA+IGVzLT5idWZmZXJfbGltaXQpCiAJCXNpemUgPSBlcy0+YnVmZmVyX2xpbWl0OwogCi0JZHByaW50Zl9lZGl0KHN0ZGRlYiwgImVkaXQ6IEVESVRfTWFrZUZpdDogdHJ5aW5nIHRvIFJlQWxsb2MgdG8gJWQrMVxuIiwgc2l6ZSk7CisJZHByaW50Zl9pbmZvKGVkaXQsICJlZGl0OiBFRElUX01ha2VGaXQ6IHRyeWluZyB0byBSZUFsbG9jIHRvICVkKzFcbiIsIHNpemUpOwogCiAJRURJVF9VbmxvY2tCdWZmZXIod25kLCBlcywgVFJVRSk7CiAJaWYgKGVzLT50ZXh0KSB7CkBAIC0xMzI5LDI1ICsxMzI4LDI1IEBACiAJCQllcy0+YnVmZmVyX3NpemUgPSAwOwogCX0gZWxzZSBpZiAoZXMtPmhsb2MzMikgewogCQlpZiAoKGhOZXczMiA9IExvY2FsUmVBbGxvYzMyKGVzLT5obG9jMzIsIHNpemUgKyAxLCAwKSkpIHsKLQkJCWRwcmludGZfZWRpdChzdGRkZWIsICJlZGl0OiBFRElUX01ha2VGaXQ6IE9sZCAzMiBiaXQgaGFuZGxlICUwOHgsIG5ldyBoYW5kbGUgJTA4eFxuIiwgZXMtPmhsb2MzMiwgaE5ldzMyKTsKKwkJCWRwcmludGZfaW5mbyhlZGl0LCAiZWRpdDogRURJVF9NYWtlRml0OiBPbGQgMzIgYml0IGhhbmRsZSAlMDh4LCBuZXcgaGFuZGxlICUwOHhcbiIsIGVzLT5obG9jMzIsIGhOZXczMik7CiAJCQllcy0+aGxvYzMyID0gaE5ldzMyOwogCQkJZXMtPmJ1ZmZlcl9zaXplID0gTUlOKExvY2FsU2l6ZTMyKGVzLT5obG9jMzIpIC0gMSwgZXMtPmJ1ZmZlcl9saW1pdCk7CiAJCX0KIAl9IGVsc2UgaWYgKGVzLT5obG9jMTYpIHsKIAkJaWYgKChoTmV3MTYgPSBMT0NBTF9SZUFsbG9jKHduZC0+aEluc3RhbmNlLCBlcy0+aGxvYzE2LCBzaXplICsgMSwgTE1FTV9NT1ZFQUJMRSkpKSB7Ci0JCQlkcHJpbnRmX2VkaXQoc3RkZGViLCAiZWRpdDogRURJVF9NYWtlRml0OiBPbGQgMTYgYml0IGhhbmRsZSAlMDh4LCBuZXcgaGFuZGxlICUwOHhcbiIsIGVzLT5obG9jMTYsIGhOZXcxNik7CisJCQlkcHJpbnRmX2luZm8oZWRpdCwgImVkaXQ6IEVESVRfTWFrZUZpdDogT2xkIDE2IGJpdCBoYW5kbGUgJTA4eCwgbmV3IGhhbmRsZSAlMDh4XG4iLCBlcy0+aGxvYzE2LCBoTmV3MTYpOwogCQkJZXMtPmhsb2MxNiA9IGhOZXcxNjsKIAkJCWVzLT5idWZmZXJfc2l6ZSA9IE1JTihMT0NBTF9TaXplKHduZC0+aEluc3RhbmNlLCBlcy0+aGxvYzE2KSAtIDEsIGVzLT5idWZmZXJfbGltaXQpOwogCQl9CiAJfQogCWlmIChlcy0+YnVmZmVyX3NpemUgPCBzaXplKSB7CiAJCUVESVRfTG9ja0J1ZmZlcih3bmQsIGVzKTsKLQkJZHByaW50Zl9lZGl0KHN0ZGRlYiwgImVkaXQ6IEVESVRfTWFrZUZpdDogRkFJTEVEICEgIFdlIG5vdyBoYXZlICVkKzFcbiIsIGVzLT5idWZmZXJfc2l6ZSk7CisJCWRwcmludGZfd2FybihlZGl0LCAiZWRpdDogRURJVF9NYWtlRml0OiBGQUlMRUQgISAgV2Ugbm93IGhhdmUgJWQrMVxuIiwgZXMtPmJ1ZmZlcl9zaXplKTsKIAkJRURJVF9OT1RJRllfUEFSRU5UKHduZCwgRU5fRVJSU1BBQ0UsICJFTl9FUlJTUEFDRSIpOwogCQlyZXR1cm4gRkFMU0U7CiAJfSBlbHNlIHsKIAkJRURJVF9Mb2NrQnVmZmVyKHduZCwgZXMpOwotCQlkcHJpbnRmX2VkaXQoc3RkZGViLCAiZWRpdDogRURJVF9NYWtlRml0OiBXZSBub3cgaGF2ZSAlZCsxXG4iLCBlcy0+YnVmZmVyX3NpemUpOworCQlkcHJpbnRmX2luZm8oZWRpdCwgImVkaXQ6IEVESVRfTWFrZUZpdDogV2Ugbm93IGhhdmUgJWQrMVxuIiwgZXMtPmJ1ZmZlcl9zaXplKTsKIAkJcmV0dXJuIFRSVUU7CiAJfQogfQpAQCAtMTM2NiwxMiArMTM2NSwxMiBAQAogCQlyZXR1cm4gVFJVRTsKIAlzaXplID0gKChzaXplIC8gR1JPV0xFTkdUSCkgKyAxKSAqIEdST1dMRU5HVEg7CiAKLQlkcHJpbnRmX2VkaXQoc3RkZGViLCAiZWRpdDogRURJVF9NYWtlVW5kb0ZpdDogdHJ5aW5nIHRvIFJlQWxsb2MgdG8gJWQrMVxuIiwgc2l6ZSk7CisJZHByaW50Zl9pbmZvKGVkaXQsICJlZGl0OiBFRElUX01ha2VVbmRvRml0OiB0cnlpbmcgdG8gUmVBbGxvYyB0byAlZCsxXG4iLCBzaXplKTsKIAogCWlmICgoZXMtPnVuZG9fdGV4dCA9IEhlYXBSZUFsbG9jKGVzLT5oZWFwLCAwLCBlcy0+dW5kb190ZXh0LCBzaXplICsgMSkpKSB7CiAJCWVzLT51bmRvX2J1ZmZlcl9zaXplID0gSGVhcFNpemUoZXMtPmhlYXAsIDAsIGVzLT51bmRvX3RleHQpIC0gMTsKIAkJaWYgKGVzLT51bmRvX2J1ZmZlcl9zaXplIDwgc2l6ZSkgewotCQkJZHByaW50Zl9lZGl0KHN0ZGRlYiwgImVkaXQ6IEVESVRfTWFrZVVuZG9GaXQ6IEZBSUxFRCAhICBXZSBub3cgaGF2ZSAlZCsxXG4iLCBlcy0+dW5kb19idWZmZXJfc2l6ZSk7CisJCQlkcHJpbnRmX3dhcm4oZWRpdCwgImVkaXQ6IEVESVRfTWFrZVVuZG9GaXQ6IEZBSUxFRCAhICBXZSBub3cgaGF2ZSAlZCsxXG4iLCBlcy0+dW5kb19idWZmZXJfc2l6ZSk7CiAJCQlyZXR1cm4gRkFMU0U7CiAJCX0KIAkJcmV0dXJuIFRSVUU7CkBAIC0xNjU5LDcgKzE2NTgsNyBAQAogCX0gZWxzZSBpZiAobGluZSkKIAkJcmV0dXJuOwogCi0JZHByaW50Zl9lZGl0KHN0ZGRlYiwgImVkaXQ6IEVESVRfUGFpbnRMaW5lOiBsaW5lPSVkXG4iLCBsaW5lKTsKKwlkcHJpbnRmX2luZm8oZWRpdCwgImVkaXQ6IEVESVRfUGFpbnRMaW5lOiBsaW5lPSVkXG4iLCBsaW5lKTsKIAogCXBvcyA9IEVESVRfRU1fUG9zRnJvbUNoYXIod25kLCBlcywgRURJVF9FTV9MaW5lSW5kZXgod25kLCBlcywgbGluZSksIEZBTFNFKTsKIAl4ID0gU0xPV09SRChwb3MpOwpAQCAtMTg2OCw3ICsxODY3LDcgQEAKIHsKIAlJTlQzMiByZXQgPSAwOwogCi0JZHByaW50Zl9lZGl0KHN0ZGRlYiwgImVkaXQ6IEVESVRfV29yZEJyZWFrUHJvYzogcz0lcCwgaW5kZXg9JXUiCisJZHByaW50Zl9pbmZvKGVkaXQsICJlZGl0OiBFRElUX1dvcmRCcmVha1Byb2M6IHM9JXAsIGluZGV4PSV1IgogCQkJIiwgY291bnQ9JXUsIGFjdGlvbj0lZFxuIiwgcywgaW5kZXgsIGNvdW50LCBhY3Rpb24pOwogCiAJc3dpdGNoIChhY3Rpb24pIHsKQEAgLTIwMDgsNyArMjAwNyw3IEBACiAJZXMtPmJ1ZmZlcl9zaXplID0gbmV3U2l6ZTsKIAllcy0+dGV4dCA9IG5ld1RleHQ7CiAJRURJVF9Mb2NrQnVmZmVyKHduZCwgZXMpOwotCWRwcmludGZfZWRpdChzdGRkZWIsICJlZGl0OiBFTV9HRVRIQU5ETEU6IHN3aXRjaGVkIHRvIDMyIGJpdCBsb2NhbCBoZWFwXG4iKTsKKwlkcHJpbnRmX2luZm8oZWRpdCwgImVkaXQ6IEVNX0dFVEhBTkRMRTogc3dpdGNoZWQgdG8gMzIgYml0IGxvY2FsIGhlYXBcbiIpOwogCiAJcmV0dXJuIGVzLT5obG9jMzI7CiB9CkBAIC0yMDQ3LDcgKzIwNDYsNyBAQAogCQkJZnByaW50ZihzdGRlcnIsICJlZGl0OiBFTV9HRVRIQU5ETEU6IGNvdWxkIG5vdCBpbml0aWFsaXplIGxvY2FsIGhlYXBcbiIpOwogCQkJcmV0dXJuIDA7CiAJCX0KLQkJZHByaW50Zl9lZGl0KHN0ZGRlYiwgImVkaXQ6IEVNX0dFVEhBTkRMRTogbG9jYWwgaGVhcCBpbml0aWFsaXplZFxuIik7CisJCWRwcmludGZfaW5mbyhlZGl0LCAiZWRpdDogRU1fR0VUSEFORExFOiBsb2NhbCBoZWFwIGluaXRpYWxpemVkXG4iKTsKIAl9CiAJaWYgKCEobmV3QnVmID0gTE9DQUxfQWxsb2Mod25kLT5oSW5zdGFuY2UsIExNRU1fTU9WRUFCTEUsIGxzdHJsZW4zMkEoZXMtPnRleHQpICsgMSkpKSB7CiAJCWZwcmludGYoc3RkZXJyLCAiZWRpdDogRU1fR0VUSEFORExFOiBjb3VsZCBub3QgYWxsb2NhdGUgbmV3IDE2IGJpdCBidWZmZXJcbiIpOwpAQCAtMjA3Miw3ICsyMDcxLDcgQEAKIAllcy0+YnVmZmVyX3NpemUgPSBuZXdTaXplOwogCWVzLT50ZXh0ID0gbmV3VGV4dDsKIAlFRElUX0xvY2tCdWZmZXIod25kLCBlcyk7Ci0JZHByaW50Zl9lZGl0KHN0ZGRlYiwgImVkaXQ6IEVNX0dFVEhBTkRMRTogc3dpdGNoZWQgdG8gMTYgYml0IGJ1ZmZlclxuIik7CisJZHByaW50Zl9pbmZvKGVkaXQsICJlZGl0OiBFTV9HRVRIQU5ETEU6IHN3aXRjaGVkIHRvIDE2IGJpdCBidWZmZXJcbiIpOwogCiAJcmV0dXJuIGVzLT5obG9jMTY7CiB9CkBAIC0yNjI0LDcgKzI2MjMsNyBAQAogCQlpZiAoYWN0aW9uICYgRUNfUklHSFRNQVJHSU4pCiAJCQllcy0+cmlnaHRfbWFyZ2luID0gcmlnaHQ7CiAJfQotCWRwcmludGZfZWRpdChzdGRkZWIsICJFRElUX0VNX1NldE1hcmdpbnM6IGxlZnQ9JWQsIHJpZ2h0PSVkXG4iLCBlcy0+bGVmdF9tYXJnaW4sIGVzLT5yaWdodF9tYXJnaW4pOworCWRwcmludGZfaW5mbyhlZGl0LCAiRURJVF9FTV9TZXRNYXJnaW5zOiBsZWZ0PSVkLCByaWdodD0lZFxuIiwgZXMtPmxlZnRfbWFyZ2luLCBlcy0+cmlnaHRfbWFyZ2luKTsKIH0KIAogCkBAIC0yODEwLDcgKzI4MDksNyBAQAogCiAJbHN0cmNweTMyQSh1dGV4dCwgZXMtPnVuZG9fdGV4dCk7CiAKLQlkcHJpbnRmX2VkaXQoc3RkZGViLCAiZWRpdDogYmVmb3JlIFVORE86aW5zZXJ0aW9uIGxlbmd0aCA9ICVkLCBkZWxldGlvbiBidWZmZXIgPSAlc1xuIiwKKwlkcHJpbnRmX2luZm8oZWRpdCwgImVkaXQ6IGJlZm9yZSBVTkRPOmluc2VydGlvbiBsZW5ndGggPSAlZCwgZGVsZXRpb24gYnVmZmVyID0gJXNcbiIsCiAJCQllcy0+dW5kb19pbnNlcnRfY291bnQsIHV0ZXh0KTsKIAogCUVESVRfRU1fU2V0U2VsKHduZCwgZXMsIGVzLT51bmRvX3Bvc2l0aW9uLCBlcy0+dW5kb19wb3NpdGlvbiArIGVzLT51bmRvX2luc2VydF9jb3VudCwgRkFMU0UpOwpAQCAtMjgxOSw3ICsyODE4LDcgQEAKIAlFRElUX0VNX1NldFNlbCh3bmQsIGVzLCBlcy0+dW5kb19wb3NpdGlvbiwgZXMtPnVuZG9fcG9zaXRpb24gKyBlcy0+dW5kb19pbnNlcnRfY291bnQsIEZBTFNFKTsKIAlIZWFwRnJlZShlcy0+aGVhcCwgMCwgdXRleHQpOwogCi0JZHByaW50Zl9lZGl0KHN0ZGRlYiwgImVkaXQ6IGFmdGVyIFVORE86IGluc2VydGlvbiBsZW5ndGggPSAlZCwgZGVsZXRpb24gYnVmZmVyID0gJXNcbiIsCisJZHByaW50Zl9pbmZvKGVkaXQsICJlZGl0OiBhZnRlciBVTkRPOiBpbnNlcnRpb24gbGVuZ3RoID0gJWQsIGRlbGV0aW9uIGJ1ZmZlciA9ICVzXG4iLAogCQkJZXMtPnVuZG9faW5zZXJ0X2NvdW50LCBlcy0+dW5kb190ZXh0KTsKIAogCXJldHVybiBUUlVFOwpAQCAtMjg5MSw3ICsyODkwLDcgQEAKIAkJCUVESVRfRU1fU2Nyb2xsQ2FyZXQod25kLCBlcyk7CiAJCQlicmVhazsKIAkJZGVmYXVsdDoKLQkJCWRwcmludGZfZWRpdChzdGRkZWIsICJlZGl0OiB1bmtub3duIG1lbnUgaXRlbSwgcGxlYXNlIHJlcG9ydFxuIik7CisJCQlkcHJpbnRmX2VycihlZGl0LCAiZWRpdDogdW5rbm93biBtZW51IGl0ZW0sIHBsZWFzZSByZXBvcnRcbiIpOwogCQkJYnJlYWs7CiAJfQogfQpAQCAtMzE5Myw3ICszMTkyLDcgQEAKIAkJYnJlYWs7CiAKIAlkZWZhdWx0OgotCQlkcHJpbnRmX2VkaXQoc3RkZGViLCAiZWRpdDogdW5kb2N1bWVudGVkIChoYWNrZWQpIFdNX0hTQ1JPTEwgcGFyYW1ldGVyLCBwbGVhc2UgcmVwb3J0XG4iKTsKKwkJZHByaW50Zl9lcnIoZWRpdCwgImVkaXQ6IHVuZG9jdW1lbnRlZCAoaGFja2VkKSBXTV9IU0NST0xMIHBhcmFtZXRlciwgcGxlYXNlIHJlcG9ydFxuIik7CiAJCXJldHVybiAwOwogCX0KIAlpZiAoZHgpCkBAIC0zMjg2LDcgKzMyODUsNyBAQAogCQlIV05EMzIgaENvbWJvID0gd25kLT5wYXJlbnQtPmh3bmRTZWxmOwogCQlCT09MMzIgYlVJRmxpcCA9IFRSVUU7CiAKLQkJZHByaW50Zl9jb21ibyhzdGRkZWIsICJFRElUX0NoZWNrQ29tYm8gWyUwNHhdOiBoYW5kbGluZyBtc2cgJTA0eCAoJTA0eClcbiIsCisJCWRwcmludGZfaW5mbyhjb21ibywgIkVESVRfQ2hlY2tDb21ibyBbJTA0eF06IGhhbmRsaW5nIG1zZyAlMDR4ICglMDR4KVxuIiwKIAkJCQkJd25kLT5od25kU2VsZiwgKFVJTlQxNiltc2csIChVSU5UMTYpa2V5KTsKIAogCQlzd2l0Y2ggKG1zZykgewpAQCAtMzcxOSw3ICszNzE4LDcgQEAKIHsKIAlFRElUX0VNX1NldFNlbCh3bmQsIGVzLCAwLCAtMSwgRkFMU0UpOwogCWlmICh0ZXh0KSB7Ci0JCWRwcmludGZfZWRpdChzdGRkZWIsICJcdCclcydcbiIsIHRleHQpOworCQlkcHJpbnRmX2luZm8oZWRpdCwgIlx0JyVzJ1xuIiwgdGV4dCk7CiAJCUVESVRfRU1fUmVwbGFjZVNlbCh3bmQsIGVzLCBGQUxTRSwgdGV4dCk7CiAJCWVzLT54X29mZnNldCA9IDA7CiAJfQpkaWZmIC0tZ2l0IGEvY29udHJvbHMvbGlzdGJveC5jIGIvY29udHJvbHMvbGlzdGJveC5jCmluZGV4IGE4MzA0ODkuLmMxNTEyZTcgMTAwNjQ0Ci0tLSBhL2NvbnRyb2xzL2xpc3Rib3guYworKysgYi9jb250cm9scy9saXN0Ym94LmMKQEAgLTEzLDcgKzEzLDYgQEAKICNpbmNsdWRlICJzcHkuaCIKICNpbmNsdWRlICJ3aW4uaCIKICNpbmNsdWRlICJjb21iby5oIgotI2luY2x1ZGUgInN0ZGRlYnVnLmgiCiAjaW5jbHVkZSAiZGVidWcuaCIKIAogLyogVW5pbXBsZW1lbnRlZCB5ZXQ6CkBAIC0zMDksNyArMzA4LDcgQEAKICAgICAgICAgaWYgKChkZXNjci0+aGVpZ2h0ID4gZGVzY3ItPml0ZW1faGVpZ2h0KSAmJgogICAgICAgICAgICAgKGRlc2NyLT5oZWlnaHQgJSBkZXNjci0+aXRlbV9oZWlnaHQpKQogICAgICAgICB7Ci0gICAgICAgICAgICBkcHJpbnRmX2xpc3Rib3goc3RkZGViLCAiTGlzdGJveCAlMDR4OiBjaGFuZ2luZyBoZWlnaHQgJWQgLT4gJWRcbiIsCisgICAgICAgICAgICBkcHJpbnRmX2luZm8obGlzdGJveCwgIkxpc3Rib3ggJTA0eDogY2hhbmdpbmcgaGVpZ2h0ICVkIC0+ICVkXG4iLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIHduZC0+aHduZFNlbGYsIGRlc2NyLT5oZWlnaHQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVzY3ItPmhlaWdodCAtIGRlc2NyLT5oZWlnaHQlZGVzY3ItPml0ZW1faGVpZ2h0ICk7CiAgICAgICAgICAgICBTZXRXaW5kb3dQb3MzMiggd25kLT5od25kU2VsZiwgMCwgMCwgMCwKQEAgLTMyMCw3ICszMTksNyBAQAogICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICB9CiAgICAgfQotICAgIGRwcmludGZfbGlzdGJveCggc3RkZGViLCAiTGlzdGJveCAlMDR4OiBuZXcgc2l6ZSA9ICVkLCVkXG4iLAorICAgIGRwcmludGZfaW5mbyhsaXN0Ym94LCAiTGlzdGJveCAlMDR4OiBuZXcgc2l6ZSA9ICVkLCVkXG4iLAogICAgICAgICAgICAgICAgICAgICAgd25kLT5od25kU2VsZiwgZGVzY3ItPndpZHRoLCBkZXNjci0+aGVpZ2h0ICk7CiAgICAgTElTVEJPWF9VcGRhdGVQYWdlKCB3bmQsIGRlc2NyICk7CiAgICAgTElTVEJPWF9VcGRhdGVTY3JvbGwoIHduZCwgZGVzY3IgKTsKQEAgLTQ1OCw3ICs0NTcsNyBAQAogICAgICAgICBpZiAod25kLT5kd1N0eWxlICYgV1NfRElTQUJMRUQpIGRpcy5pdGVtU3RhdGUgfD0gT0RTX0RJU0FCTEVEOwogICAgICAgICBkaXMuaXRlbURhdGEgICAgID0gaXRlbSA/IGl0ZW0tPmRhdGEgOiAwOwogICAgICAgICBkaXMucmNJdGVtICAgICAgID0gKnJlY3Q7Ci0gICAgICAgIGRwcmludGZfbGlzdGJveCggc3RkZGViLCAiTGlzdGJveCAlMDR4OiBkcmF3aXRlbSAlZCAoJXMpIGFjdGlvbj0lMDJ4ICIKKyAgICAgICAgZHByaW50Zl9pbmZvKGxpc3Rib3gsICJMaXN0Ym94ICUwNHg6IGRyYXdpdGVtICVkICglcykgYWN0aW9uPSUwMnggIgogICAgICAgICAgICAgICAgICAgICAgICAgICJzdGF0ZT0lMDJ4IHJlY3Q9JWQsJWQtJWQsJWRcbiIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgd25kLT5od25kU2VsZiwgaW5kZXgsIGl0ZW0gPyBpdGVtLT5zdHIgOiAiIiwgYWN0aW9uLAogICAgICAgICAgICAgICAgICAgICAgICAgIGRpcy5pdGVtU3RhdGUsIHJlY3QtPmxlZnQsIHJlY3QtPnRvcCwKQEAgLTQ4MCw3ICs0NzksNyBAQAogICAgICAgICAgICAgb2xkVGV4dCA9IFNldFRleHRDb2xvcjMyKCBoZGMsIEdldFN5c0NvbG9yMzIoQ09MT1JfSElHSExJR0hUVEVYVCkpOwogICAgICAgICB9CiAKLSAgICAgICAgZHByaW50Zl9saXN0Ym94KCBzdGRkZWIsICJMaXN0Ym94ICUwNHg6IHBhaW50aW5nICVkICglcykgYWN0aW9uPSUwMnggIgorICAgICAgICBkcHJpbnRmX2luZm8obGlzdGJveCwgIkxpc3Rib3ggJTA0eDogcGFpbnRpbmcgJWQgKCVzKSBhY3Rpb249JTAyeCAiCiAgICAgICAgICAgICAgICAgICAgICAgICAgInJlY3Q9JWQsJWQtJWQsJWRcbiIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgd25kLT5od25kU2VsZiwgaW5kZXgsIGl0ZW0gPyBpdGVtLT5zdHIgOiAiIiwgYWN0aW9uLAogICAgICAgICAgICAgICAgICAgICAgICAgIHJlY3QtPmxlZnQsIHJlY3QtPnRvcCwgcmVjdC0+cmlnaHQsIHJlY3QtPmJvdHRvbSApOwpAQCAtNjAzLDEyICs2MDIsMTUgQEAKICAgICB7CiAgICAgICAgIElOVDMyIGk7CiAgICAgICAgIExQSU5UMTYgcCA9IChMUElOVDE2KXRhYnM7Ci0gICAgICAgIGRwcmludGZfbGlzdGJveCggc3RkZGViLCAiTGlzdGJveCAlMDR4OiBzZXR0YWJzdG9wcyAiLCB3bmQtPmh3bmRTZWxmKTsKKwlkYmdfZGVjbF9zdHIobGlzdGJveCwgMjU2KTsKKwogICAgICAgICBmb3IgKGkgPSAwOyBpIDwgZGVzY3ItPm5iX3RhYnM7IGkrKykgewotICAgICAgICAgICAgZGVzY3ItPnRhYnNbaV0gPSAqcCsrPDwxOyAvKiBGSVhNRSAqLwotICAgICAgICAgICAgZHByaW50Zl9saXN0Ym94KCBzdGRkZWIsICIlaGQgIiwgZGVzY3ItPnRhYnNbaV0pOworCSAgICBkZXNjci0+dGFic1tpXSA9ICpwKys8PDE7IC8qIEZJWE1FICovCisJICAgIGlmKGRlYnVnZ2luZ19pbmZvKGxpc3Rib3gpKQorICAgICAgICAgICAgICBkc3ByaW50ZihsaXN0Ym94LCAiJWhkICIsIGRlc2NyLT50YWJzW2ldKTsKIAl9Ci0JZHByaW50Zl9saXN0Ym94KCBzdGRkZWIsICJcbiIpOworICAgICAgICBkcHJpbnRmX2luZm8obGlzdGJveCwgIkxpc3Rib3ggJTA0eDogc2V0dGFic3RvcHMgJXNcbiIsIAorCQkJIHduZC0+aHduZFNlbGYsIGRiZ19zdHIobGlzdGJveCkpOwogICAgIH0KICAgICBlbHNlIG1lbWNweSggZGVzY3ItPnRhYnMsIHRhYnMsIGRlc2NyLT5uYl90YWJzICogc2l6ZW9mKElOVDMyKSApOwogICAgIC8qIEZJWE1FOiByZXBhaW50IHRoZSB3aW5kb3c/ICovCkBAIC05ODYsNyArOTg4LDcgQEAKICAgICBpZiAoZGVzY3ItPnN0eWxlICYgTEJTX09XTkVSRFJBV1ZBUklBQkxFKQogICAgIHsKICAgICAgICAgaWYgKChpbmRleCA8IDApIHx8IChpbmRleCA+PSBkZXNjci0+bmJfaXRlbXMpKSByZXR1cm4gTEJfRVJSOwotICAgICAgICBkcHJpbnRmX2xpc3Rib3goIHN0ZGRlYiwgIkxpc3Rib3ggJTA0eDogaXRlbSAlZCBoZWlnaHQgPSAlZFxuIiwKKyAgICAgICAgZHByaW50Zl9pbmZvKGxpc3Rib3gsICJMaXN0Ym94ICUwNHg6IGl0ZW0gJWQgaGVpZ2h0ID0gJWRcbiIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgd25kLT5od25kU2VsZiwgaW5kZXgsIGhlaWdodCApOwogICAgICAgICBkZXNjci0+aXRlbXNbaW5kZXhdLmhlaWdodCA9IGhlaWdodDsKICAgICAgICAgTElTVEJPWF9VcGRhdGVTY3JvbGwoIHduZCwgZGVzY3IgKTsKQEAgLTk5NCw3ICs5OTYsNyBAQAogICAgIH0KICAgICBlbHNlIGlmIChoZWlnaHQgIT0gZGVzY3ItPml0ZW1faGVpZ2h0KQogICAgIHsKLSAgICAgICAgZHByaW50Zl9saXN0Ym94KCBzdGRkZWIsICJMaXN0Ym94ICUwNHg6IG5ldyBoZWlnaHQgPSAlZFxuIiwKKyAgICAgICAgZHByaW50Zl9pbmZvKGxpc3Rib3gsICJMaXN0Ym94ICUwNHg6IG5ldyBoZWlnaHQgPSAlZFxuIiwKICAgICAgICAgICAgICAgICAgICAgICAgICB3bmQtPmh3bmRTZWxmLCBoZWlnaHQgKTsKICAgICAgICAgZGVzY3ItPml0ZW1faGVpZ2h0ID0gaGVpZ2h0OwogICAgICAgICBMSVNUQk9YX1VwZGF0ZVBhZ2UoIHduZCwgZGVzY3IgKTsKQEAgLTEwMTYsNyArMTAxOCw3IEBACiAgICAgICAgIHBvcyA9IGRlc2NyLT5ob3J6X2V4dGVudCAtIGRlc2NyLT53aWR0aDsKICAgICBpZiAocG9zIDwgMCkgcG9zID0gMDsKICAgICBpZiAoIShkaWZmID0gZGVzY3ItPmhvcnpfcG9zIC0gcG9zKSkgcmV0dXJuOwotICAgIGRwcmludGZfbGlzdGJveCggc3RkZGViLCAiTGlzdGJveCAlMDR4OiBuZXcgaG9yeiBwb3MgPSAlZFxuIiwKKyAgICBkcHJpbnRmX2luZm8obGlzdGJveCwgIkxpc3Rib3ggJTA0eDogbmV3IGhvcnogcG9zID0gJWRcbiIsCiAgICAgICAgICAgICAgICAgICAgICB3bmQtPmh3bmRTZWxmLCBwb3MgKTsKICAgICBkZXNjci0+aG9yel9wb3MgPSBwb3M7CiAgICAgTElTVEJPWF9VcGRhdGVTY3JvbGwoIHduZCwgZGVzY3IgKTsKQEAgLTEwMzgsNyArMTA0MCw3IEBACiAgICAgICAgIHJldHVybiBMQl9PS0FZOwogICAgIGlmIChleHRlbnQgPD0gMCkgZXh0ZW50ID0gMTsKICAgICBpZiAoZXh0ZW50ID09IGRlc2NyLT5ob3J6X2V4dGVudCkgcmV0dXJuIExCX09LQVk7Ci0gICAgZHByaW50Zl9saXN0Ym94KCBzdGRkZWIsICJMaXN0Ym94ICUwNHg6IG5ldyBob3J6IGV4dGVudCA9ICVkXG4iLAorICAgIGRwcmludGZfaW5mbyhsaXN0Ym94LCAiTGlzdGJveCAlMDR4OiBuZXcgaG9yeiBleHRlbnQgPSAlZFxuIiwKICAgICAgICAgICAgICAgICAgICAgIHduZC0+aHduZFNlbGYsIGV4dGVudCApOwogICAgIGRlc2NyLT5ob3J6X2V4dGVudCA9IGV4dGVudDsKICAgICBpZiAoZGVzY3ItPmhvcnpfcG9zID4gZXh0ZW50IC0gZGVzY3ItPndpZHRoKQpAQCAtMTA1Niw3ICsxMDU4LDcgQEAKIHsKICAgICB3aWR0aCArPSAyOyAgLyogRm9yIGxlZnQgYW5kIHJpZ2h0IG1hcmdpbiAqLwogICAgIGlmICh3aWR0aCA9PSBkZXNjci0+Y29sdW1uX3dpZHRoKSByZXR1cm4gTEJfT0tBWTsKLSAgICBkcHJpbnRmX2xpc3Rib3goIHN0ZGRlYiwgIkxpc3Rib3ggJTA0eDogbmV3IGNvbHVtbiB3aWR0aCA9ICVkXG4iLAorICAgIGRwcmludGZfaW5mbyhsaXN0Ym94LCAiTGlzdGJveCAlMDR4OiBuZXcgY29sdW1uIHdpZHRoID0gJWRcbiIsCiAgICAgICAgICAgICAgICAgICAgICB3bmQtPmh3bmRTZWxmLCB3aWR0aCApOwogICAgIGRlc2NyLT5jb2x1bW5fd2lkdGggPSB3aWR0aDsKICAgICBMSVNUQk9YX1VwZGF0ZVBhZ2UoIHduZCwgZGVzY3IgKTsKQEAgLTEzMDUsNyArMTMwNyw3IEBACiAgICAgICAgIG1pcy5pdGVtSGVpZ2h0ID0gZGVzY3ItPml0ZW1faGVpZ2h0OwogICAgICAgICBTZW5kTWVzc2FnZTMyQSggZGVzY3ItPm93bmVyLCBXTV9NRUFTVVJFSVRFTSwgaWQsIChMUEFSQU0pJm1pcyApOwogICAgICAgICBpdGVtLT5oZWlnaHQgPSBtaXMuaXRlbUhlaWdodCA/IG1pcy5pdGVtSGVpZ2h0IDogMTsKLSAgICAgICAgZHByaW50Zl9saXN0Ym94KCBzdGRkZWIsICJMaXN0Ym94ICUwNHg6IG1lYXN1cmUgaXRlbSAlZCAoJXMpID0gJWRcbiIsCisgICAgICAgIGRwcmludGZfaW5mbyhsaXN0Ym94LCAiTGlzdGJveCAlMDR4OiBtZWFzdXJlIGl0ZW0gJWQgKCVzKSA9ICVkXG4iLAogICAgICAgICAgICAgICAgICAgICAgICAgIHduZC0+aHduZFNlbGYsIGluZGV4LCBzdHIgPyBzdHIgOiAiIiwgaXRlbS0+aGVpZ2h0ICk7CiAgICAgfQogCkBAIC0xMzU3LDcgKzEzNTksNyBAQAogICAgICAgICByZXR1cm4gcmV0OwogICAgIH0KIAotICAgIGRwcmludGZfbGlzdGJveCggc3RkZGViLCAiTGlzdGJveCAlMDR4OiBhZGRlZCBpdGVtICVkICclcydcbiIsCisgICAgZHByaW50Zl9pbmZvKGxpc3Rib3gsICJMaXN0Ym94ICUwNHg6IGFkZGVkIGl0ZW0gJWQgJyVzJ1xuIiwKICAgICAgICAgICAgICAgICAgICAgIHduZC0+aHduZFNlbGYsIGluZGV4LCBIQVNfU1RSSU5HUyhkZXNjcikgPyBuZXdfc3RyIDogIiIgKTsKICAgICByZXR1cm4gaW5kZXg7CiB9CkBAIC0xNjk0LDcgKzE2OTYsNyBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgV1BBUkFNMzIgd1BhcmFtLCBJTlQzMiB4LCBJTlQzMiB5ICkKIHsKICAgICBJTlQzMiBpbmRleCA9IExJU1RCT1hfR2V0SXRlbUZyb21Qb2ludCggd25kLCBkZXNjciwgeCwgeSApOwotICAgIGRwcmludGZfbGlzdGJveCggc3RkZGViLCAiTGlzdGJveCAlMDR4OiBsYnV0dG9uZG93biAlZCwlZCBpdGVtICVkXG4iLAorICAgIGRwcmludGZfaW5mbyhsaXN0Ym94LCAiTGlzdGJveCAlMDR4OiBsYnV0dG9uZG93biAlZCwlZCBpdGVtICVkXG4iLAogICAgICAgICAgICAgICAgICAgICAgd25kLT5od25kU2VsZiwgeCwgeSwgaW5kZXggKTsKICAgICBpZiAoIWRlc2NyLT5jYXJldF9vbiAmJiAoR2V0Rm9jdXMzMigpID09IHduZC0+aHduZFNlbGYpKSByZXR1cm4gMDsKICAgICBpZiAoaW5kZXggIT0gLTEpCkBAIC0yMDI5LDcgKzIwMzEsNyBAQAogCiAgICAgaWYoIGxwaGMgKQogICAgIHsKLQlkcHJpbnRmX2NvbWJvKHN0ZGRlYiwiQ29tYm9MQm94IFslMDR4XTogcmVzZXR0aW5nIG93bmVyICUwNHggLT4gJTA0eFxuIiwKKwlkcHJpbnRmX2luZm8oY29tYm8sIkNvbWJvTEJveCBbJTA0eF06IHJlc2V0dGluZyBvd25lciAlMDR4IC0+ICUwNHhcbiIsCiAJCQkgICAgICB3bmQtPmh3bmRTZWxmLCBkZXNjci0+b3duZXIsIGxwaGMtPnNlbGYtPmh3bmRTZWxmICk7CiAJZGVzY3ItPm93bmVyID0gbHBoYy0+c2VsZi0+aHduZFNlbGY7CiAgICAgfQpAQCAtMjA5OCw3ICsyMTAwLDcgQEAKICAgICAgICAgaWYgKG1zZyA9PSBXTV9DUkVBVEUpCiAgICAgICAgIHsKICAgICAgICAgICAgIGlmICghTElTVEJPWF9DcmVhdGUoIHduZCwgTlVMTCApKSByZXR1cm4gLTE7Ci0gICAgICAgICAgICBkcHJpbnRmX2xpc3Rib3goIHN0ZGRlYiwgIkxpc3Rib3g6IGNyZWF0aW5nIHduZD0lMDR4IGRlc2NyPSVwXG4iLAorICAgICAgICAgICAgZHByaW50Zl9pbmZvKGxpc3Rib3gsICJMaXN0Ym94OiBjcmVhdGluZyB3bmQ9JTA0eCBkZXNjcj0lcFxuIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaHduZCwgKihMQl9ERVNDUiAqKil3bmQtPndFeHRyYSApOwogICAgICAgICAgICAgcmV0dXJuIDA7CiAgICAgICAgIH0KQEAgLTIxMDYsNyArMjEwOCw3IEBACiAgICAgICAgIHJldHVybiBEZWZXaW5kb3dQcm9jMzJBKCBod25kLCBtc2csIHdQYXJhbSwgbFBhcmFtICk7CiAgICAgfQogCi0gICAgZHByaW50Zl9saXN0Ym94KCBzdGRkZWIsICJMaXN0Ym94ICUwNHg6IG1zZyAlcyB3cCAlMDh4IGxwICUwOGx4XG4iLAorICAgIGRwcmludGZfaW5mbyhsaXN0Ym94LCAiTGlzdGJveCAlMDR4OiBtc2cgJXMgd3AgJTA4eCBscCAlMDhseFxuIiwKICAgICAgICAgICAgICAgICAgICAgIHduZC0+aHduZFNlbGYsIFNQWV9HZXRNc2dOYW1lKG1zZyksIHdQYXJhbSwgbFBhcmFtICk7CiAgICAgc3dpdGNoKG1zZykKICAgICB7CkBAIC0yNDc2LDcgKzI0NzgsNyBAQAogCiAgICAgZGVmYXVsdDoKICAgICAgICAgaWYgKChtc2cgPj0gV01fVVNFUikgJiYgKG1zZyA8IDB4YzAwMCkpCi0gICAgICAgICAgICBkcHJpbnRmX2xpc3Rib3goc3RkZGViLCJMaXN0Ym94ICUwNHg6IHVua25vd24gbXNnICUwNHggd3AgJTA4eCBscCAlMDhseFxuIiwKKyAgICAgICAgICAgIGRwcmludGZfd2FybihsaXN0Ym94LCAiTGlzdGJveCAlMDR4OiB1bmtub3duIG1zZyAlMDR4IHdwICUwOHggbHAgJTA4bHhcbiIsCiAgICAgICAgICAgICAgICAgICAgIGh3bmQsIG1zZywgd1BhcmFtLCBsUGFyYW0gKTsKICAgICAgICAgcmV0dXJuIERlZldpbmRvd1Byb2MzMkEoIGh3bmQsIG1zZywgd1BhcmFtLCBsUGFyYW0gKTsKICAgICB9CkBAIC0yNTIxLDcgKzI1MjMsNyBAQAogICAgIHsKIAlMQl9ERVNDUiAqZGVzY3IgPSAqKExCX0RFU0NSICoqKXduZC0+d0V4dHJhOwogCi0gICAgICAgIGRwcmludGZfY29tYm8oIHN0ZGRlYiwgIkNvbWJvTEJveCBbJTA0eF06IG1zZyAlcyB3cCAlMDh4IGxwICUwOGx4XG4iLAorICAgICAgICBkcHJpbnRmX2luZm8oY29tYm8sICJDb21ib0xCb3ggWyUwNHhdOiBtc2cgJXMgd3AgJTA4eCBscCAlMDhseFxuIiwKICAgICAgICAgICAgICAgICAgICAgICAgd25kLT5od25kU2VsZiwgU1BZX0dldE1zZ05hbWUobXNnKSwgd1BhcmFtLCBsUGFyYW0gKTsKIAogCWlmKCBkZXNjciB8fCBtc2cgPT0gV01fQ1JFQVRFICkKQEAgLTI1MzIsNyArMjUzNCw3IEBACiAJICAgIHsKIAkJY2FzZSBXTV9DUkVBVEU6CiAjZGVmaW5lIGxwY3MJKChMUENSRUFURVNUUlVDVDMyQSlsUGFyYW0pCi0JCSAgICAgZHByaW50Zl9jb21ibyhzdGRkZWIsICJcdHBhc3NlZCBwYXJlbnQgaGFuZGxlID0gMHglMDh4XG4iLCAKKwkJICAgICBkcHJpbnRmX2luZm8oY29tYm8sICJcdHBhc3NlZCBwYXJlbnQgaGFuZGxlID0gMHglMDh4XG4iLCAKIAkJCQkJICAgICAgICAgKFVJTlQzMilscGNzLT5scENyZWF0ZVBhcmFtcyk7CiAKIAkJICAgICBscGhjID0gKExQSEVBRENPTUJPKShscGNzLT5scENyZWF0ZVBhcmFtcyk7CkBAIC0yNTc4LDcgKzI1ODAsNyBAQAogICAgICAgICB9CiAgICAgICAgIGxSZXQgPSBEZWZXaW5kb3dQcm9jMzJBKCBod25kLCBtc2csIHdQYXJhbSwgbFBhcmFtICk7CiAKLSAgICAgICAgZHByaW50Zl9jb21ibyhzdGRkZWIsIlx0Q29tYm9MQm94OiBkZWZhdWx0IG9uIG1zZyBbJTA0eF1cbiIsIChVSU5UMTYpbXNnICk7CisgICAgICAgIGRwcmludGZfaW5mbyhjb21ibywiXHRDb21ib0xCb3g6IGRlZmF1bHQgb24gbXNnIFslMDR4XVxuIiwgKFVJTlQxNiltc2cgKTsKICAgICB9CiAKICAgICByZXR1cm4gbFJldDsKZGlmZiAtLWdpdCBhL2NvbnRyb2xzL21lbnUuYyBiL2NvbnRyb2xzL21lbnUuYwppbmRleCBlZTlmYWRmLi4yNGFlY2Q0IDEwMDY0NAotLS0gYS9jb250cm9scy9tZW51LmMKKysrIGIvY29udHJvbHMvbWVudS5jCkBAIC0zMiw3ICszMiw2IEBACiAjaW5jbHVkZSAibWVzc2FnZS5oIgogI2luY2x1ZGUgImdyYXBoaWNzLmgiCiAjaW5jbHVkZSAicmVzb3VyY2UuaCIKLSNpbmNsdWRlICJzdGRkZWJ1Zy5oIgogI2luY2x1ZGUgInR3ZWFrLmgiCiAjaW5jbHVkZSAiZGVidWcuaCIKIApAQCAtMTY1LDEwICsxNjQsMTAgQEAKICAqLwogCiAjZGVmaW5lIGRlYnVnX3ByaW50X21lbnVpdGVtKHByZSwgbXAsIHBvc3QpIFwKLSAgaWYoZGVidWdnaW5nX21lbnUpIGRvX2RlYnVnX3ByaW50X21lbnVpdGVtKHByZSwgbXAsIHBvc3QpCisgIGlmKCFkZWJ1Z2dpbmdfaW5mbyhtZW51KSkgOyBlbHNlIGRvX2RlYnVnX3ByaW50X21lbnVpdGVtKHByZSwgbXAsIHBvc3QpCiAKICNkZWZpbmUgTUVOVU9VVCh0ZXh0KSBcCi0gIHArPXNwcmludGYocCwgIiVzJXMiLCAoY291bnQrKyA/ICIsIiA6ICIiKSwgKHRleHQpKQorICBkc3ByaW50ZihtZW51LCAiJXMlcyIsIChjb3VudCsrID8gIiwiIDogIiIpLCAodGV4dCkpCiAKICNkZWZpbmUgTUVOVUZMQUcoYml0LHRleHQpIFwKICAgZG8geyBcCkBAIC0xNzgsMTkgKzE3NywxNyBAQAogc3RhdGljIHZvaWQgZG9fZGVidWdfcHJpbnRfbWVudWl0ZW0oY29uc3QgY2hhciAqcHJlZml4LCBNRU5VSVRFTSAqIG1wLCAKIAkJCQkgICAgY29uc3QgY2hhciAqcG9zdGZpeCkKIHsKLSAgICBjaGFyIGJ1ZmZbMjU2XTsKLSAgICBjaGFyICpwOworICAgIGRiZ19kZWNsX3N0cihtZW51LCAyNTYpOwogCi0gICAgcCA9IGJ1ZmY7CiAgICAgaWYgKG1wKSB7CiAJVUlOVDMyIGZsYWdzID0gbXAtPmZUeXBlOwogCWludCB0eXAgPSBNRU5VX0lURU1fVFlQRShmbGFncyk7Ci0JcCs9c3ByaW50ZihwLCAieyBJRD0weCV4IiwgbXAtPndJRCk7CisJZHNwcmludGYobWVudSwgInsgSUQ9MHgleCIsIG1wLT53SUQpOwogCWlmIChmbGFncyAmIE1GX1BPUFVQKQotCSAgICBwKz1zcHJpbnRmKHAsICIsIFN1Yj0weCV4IiwgbXAtPmhTdWJNZW51KTsKKwkgICAgZHNwcmludGYobWVudSwgIiwgU3ViPTB4JXgiLCBtcC0+aFN1Yk1lbnUpOwogCWlmIChmbGFncykgewogCSAgICBpbnQgY291bnQgPSAwOwotCSAgICBwKz1zcHJpbnRmKHAsICIsIFR5cD0iKTsKKwkgICAgZHNwcmludGYobWVudSwgIiwgVHlwPSIpOwogCSAgICBpZiAodHlwID09IE1GVF9TVFJJTkcpCiAJCS8qIE5vdGhpbmcgKi8gOwogCSAgICBlbHNlIGlmICh0eXAgPT0gTUZUX1NFUEFSQVRPUikKQEAgLTIxMiwxMiArMjA5LDEyIEBACiAJICAgIE1FTlVGTEFHKE1GVF9SSUdIVEpVU1RJRlksICJyaWdodCIpOwogCiAJICAgIGlmIChmbGFncykKLQkJcCs9c3ByaW50ZihwLCAiKzB4JXgiLCBmbGFncyk7CisJCWRzcHJpbnRmKG1lbnUsICIrMHgleCIsIGZsYWdzKTsKIAl9CiAJZmxhZ3MgPSBtcC0+ZlN0YXRlOwogCWlmIChmbGFncykgewogCSAgICBpbnQgY291bnQgPSAwOwotCSAgICBwKz1zcHJpbnRmKHAsICIsIFN0YXRlPSIpOworCSAgICBkc3ByaW50ZihtZW51LCAiLCBTdGF0ZT0iKTsKIAkgICAgTUVOVUZMQUcoTUZTX0dSQVlFRCwgImdyZXkiKTsKIAkgICAgTUVOVUZMQUcoTUZTX0RJU0FCTEVELCAiZGlzIik7CiAJICAgIE1FTlVGTEFHKE1GU19DSEVDS0VELCAiY2hlY2siKTsKQEAgLTIyNSwyOCArMjIyLDI4IEBACiAJICAgIE1FTlVGTEFHKE1GX1VTRUNIRUNLQklUTUFQUywgInVzZWJpdCIpOwogCSAgICBNRU5VRkxBRyhNRl9NT1VTRVNFTEVDVCwgIm1vdXNlIik7CiAJICAgIGlmIChmbGFncykKLQkJcCs9c3ByaW50ZihwLCAiKzB4JXgiLCBmbGFncyk7CisJCWRzcHJpbnRmKG1lbnUsICIrMHgleCIsIGZsYWdzKTsKIAl9CiAJaWYgKG1wLT5oQ2hlY2tCaXQpCi0JICAgIHArPXNwcmludGYocCwgIiwgQ2hrPTB4JXgiLCBtcC0+aENoZWNrQml0KTsKKwkgICAgZHNwcmludGYobWVudSwgIiwgQ2hrPTB4JXgiLCBtcC0+aENoZWNrQml0KTsKIAlpZiAobXAtPmhVbkNoZWNrQml0KQotCSAgICBwKz1zcHJpbnRmKHAsICIsIFVuYz0weCV4IiwgbXAtPmhVbkNoZWNrQml0KTsKKwkgICAgZHNwcmludGYobWVudSwgIiwgVW5jPTB4JXgiLCBtcC0+aFVuQ2hlY2tCaXQpOwogCiAJaWYgKHR5cCA9PSBNRlRfU1RSSU5HKSB7CiAJICAgIGlmIChtcC0+dGV4dCkKLQkJcCs9c3ByaW50ZihwLCAiLCBUZXh0PVwiJXNcIiIsIG1wLT50ZXh0KTsKKwkJZHNwcmludGYobWVudSwgIiwgVGV4dD1cIiVzXCIiLCBtcC0+dGV4dCk7CiAJICAgIGVsc2UKLQkJcCs9c3ByaW50ZihwLCAiLCBUZXh0PU51bGwiKTsKKwkJZHNwcmludGYobWVudSwgIiwgVGV4dD1OdWxsIik7CiAJfSBlbHNlIGlmIChtcC0+dGV4dCA9PSBOVUxMKQogCSAgICAvKiBOb3RoaW5nICovIDsKIAllbHNlCi0JICAgIHArPXNwcmludGYocCwgIiwgVGV4dD0lcCIsIG1wLT50ZXh0KTsKLQlwKz1zcHJpbnRmKHAsICIgfSIpOworCSAgICBkc3ByaW50ZihtZW51LCAiLCBUZXh0PSVwIiwgbXAtPnRleHQpOworCWRzcHJpbnRmKG1lbnUsICIgfSIpOwogICAgIH0gZWxzZSB7Ci0JcCs9c3ByaW50ZihwLCAiTlVMTCIpOworCWRzcHJpbnRmKG1lbnUsICJOVUxMIik7CiAgICAgfQogCi0gICAgZHByaW50Zl9tZW51KHN0ZGRlYiwgIiVzICVzICVzXG4iLCBwcmVmaXgsIGJ1ZmYsIHBvc3RmaXgpOworICAgIGRwcmludGZfaW5mbyhtZW51LCAiJXMgJXMgJXNcbiIsIHByZWZpeCwgZGJnX3N0cihtZW51KSwgcG9zdGZpeCk7CiB9CiAKICN1bmRlZiBNRU5VT1VUCkBAIC0yNzAsNyArMjY3LDcgQEAKIAlmcHJpbnRmKCBzdGRlcnIsICJVbmFibGUgdG8gbG9hZCBkZWZhdWx0IHN5c3RlbSBtZW51XG4iICk7CiAgICAgfQogCi0gICAgZHByaW50Zl9tZW51KCBzdGRkZWIsICJNRU5VX0NvcHlTeXNQb3B1cDogcmV0dXJuaW5nICV4LlxuIiwgaE1lbnUgKTsKKyAgICBkcHJpbnRmX2luZm8obWVudSwgIk1FTlVfQ29weVN5c1BvcHVwOiByZXR1cm5pbmcgJXguXG4iLCBoTWVudSApOwogCiAgICAgcmV0dXJuIGhNZW51OwogfQpAQCAtMzA4LDcgKzMwNSw3IEBACiAJICAgIG1lbnUgPSAoUE9QVVBNRU5VKikgVVNFUl9IRUFQX0xJTl9BRERSKGhQb3B1cE1lbnUpOwogCSAgICBtZW51LT53RmxhZ3MgfD0gTUZfU1lTTUVOVTsKIAotCSAgICBkcHJpbnRmX21lbnUoc3RkZGViLCJHZXRTeXNNZW51IGhNZW51PSUwNHggKCUwNHgpXG4iLCBoTWVudSwgaFBvcHVwTWVudSApOworCSAgICBkcHJpbnRmX2luZm8obWVudSwiR2V0U3lzTWVudSBoTWVudT0lMDR4ICglMDR4KVxuIiwgaE1lbnUsIGhQb3B1cE1lbnUgKTsKIAkgICAgcmV0dXJuIGhNZW51OwogCX0KIAlEZXN0cm95TWVudTMyKCBoTWVudSApOwpAQCAtNDU2LDcgKzQ1Myw3IEBACiAJICAgIGJyZWFrOwogICAgIH0KIAotICAgIGRwcmludGZfbWVudSggc3RkZGViLCAiTUVOVV9HZXRTdGFydE9mUHJldkNvbHVtbjogcmV0ICVkLlxuIiwgaSApOworICAgIGRwcmludGZfaW5mbyhtZW51LCAiTUVOVV9HZXRTdGFydE9mUHJldkNvbHVtbjogcmV0ICVkLlxuIiwgaSApOwogCiAgICAgcmV0dXJuIGk7CiB9CkBAIC01NTUsNyArNTUyLDcgQEAKIHN0YXRpYyBVSU5UMzIgTUVOVV9GaW5kSXRlbUJ5S2V5KCBIV05EMzIgaHduZE93bmVyLCBITUVOVTMyIGhtZW51LCAKIAkJCQkgIFVJTlQzMiBrZXksIEJPT0wzMiBmb3JjZU1lbnVDaGFyICkKIHsKLSAgICBkcHJpbnRmX21lbnUoc3RkZGViLCJcdGxvb2tpbmcgZm9yICclYycgaW4gWyUwNHhdXG4iLCAoY2hhcilrZXksIChVSU5UMTYpaG1lbnUgKTsKKyAgICBkcHJpbnRmX2luZm8obWVudSwiXHRsb29raW5nIGZvciAnJWMnIGluIFslMDR4XVxuIiwgKGNoYXIpa2V5LCAoVUlOVDE2KWhtZW51ICk7CiAKICAgICBpZiAoIUlzTWVudTMyKCBobWVudSApKSAKICAgICB7CkBAIC01NzYsNyArNTczLDcgQEAKIAkgICAgIGtleSA9IHRvdXBwZXIoa2V5KTsKIAkgICAgIGZvciAoaSA9IDA7IGkgPCBtZW51LT5uSXRlbXM7IGkrKywgaXRlbSsrKQogCSAgICAgewotCQlpZiAoSVNfU1RSSU5HX0lURU0oaXRlbS0+ZlR5cGUpKQorCQlpZiAoaXRlbS0+dGV4dCAmJiAoSVNfU1RSSU5HX0lURU0oaXRlbS0+ZlR5cGUpKSkKIAkJewogCQkgICAgY2hhciAqcCA9IHN0cmNociggaXRlbS0+dGV4dCwgJyYnICk7CiAJCSAgICBpZiAocCAmJiAocFsxXSAhPSAnJicpICYmICh0b3VwcGVyKHBbMV0pID09IGtleSkpIHJldHVybiBpOwpAQCAtNjAzLDcgKzYwMCw3IEBACiAgICAgRFdPUkQgZHdTaXplOwogICAgIGNoYXIgKnA7CiAKLSAgICBkcHJpbnRmX21lbnUoc3RkZGViLCAiTUVOVV9DYWxjSXRlbVNpemU6IEhEQyAweCV4IGF0ICglZCwlZClcbiIsCisgICAgZHByaW50Zl9pbmZvKG1lbnUsICJNRU5VX0NhbGNJdGVtU2l6ZTogSERDIDB4JXggYXQgKCVkLCVkKVxuIiwKICAgICAgICAgICAgICAgICAgaGRjLCBvcmdYLCBvcmdZKTsKICAgICBkZWJ1Z19wcmludF9tZW51aXRlbSgiTUVOVV9DYWxjSXRlbVNpemU6IG1lbnVpdGVtOiIsIGxwaXRlbSwgCiAJCQkgKG1lbnVCYXIgPyAiIChNZW51QmFyKSIgOiAiIikpOwpAQCAtNjIxLDcgKzYxOCw3IEBACiAgICAgICAgIFNlbmRNZXNzYWdlMzJBKCBod25kT3duZXIsIFdNX01FQVNVUkVJVEVNLCAwLCAoTFBBUkFNKSZtaXMgKTsKICAgICAgICAgbHBpdGVtLT5yZWN0LmJvdHRvbSArPSBtaXMuaXRlbUhlaWdodDsKICAgICAgICAgbHBpdGVtLT5yZWN0LnJpZ2h0ICArPSBtaXMuaXRlbVdpZHRoOwotICAgICAgICBkcHJpbnRmX21lbnUoc3RkZGViLCAiTUVOVV9DYWxjSXRlbVNpemU6ICUwOHggJWR4JWRcbiIsCisgICAgICAgIGRwcmludGZfaW5mbyhtZW51LCAiTUVOVV9DYWxjSXRlbVNpemU6ICUwOHggJWR4JWRcbiIsCiAgICAgICAgICAgICAgICAgICAgICBscGl0ZW0tPndJRCwgbWlzLml0ZW1XaWR0aCwgbWlzLml0ZW1IZWlnaHQpOwogICAgICAgICByZXR1cm47CiAgICAgfSAKQEAgLTc1Niw3ICs3NTMsNyBAQAogCiAgICAgaWYgKChscHJlY3QgPT0gTlVMTCkgfHwgKGxwcG9wID09IE5VTEwpKSByZXR1cm47CiAgICAgaWYgKGxwcG9wLT5uSXRlbXMgPT0gMCkgcmV0dXJuOwotICAgIGRwcmludGZfbWVudShzdGRkZWIsIk1FTlVfTWVudUJhckNhbGNTaXplIGxlZnQ9JWQgdG9wPSVkIHJpZ2h0PSVkIGJvdHRvbT0lZFxuIiwgCisgICAgZHByaW50Zl9pbmZvKG1lbnUsIk1FTlVfTWVudUJhckNhbGNTaXplIGxlZnQ9JWQgdG9wPSVkIHJpZ2h0PSVkIGJvdHRvbT0lZFxuIiwgCiAgICAgICAgICAgICAgICAgIGxwcmVjdC0+bGVmdCwgbHByZWN0LT50b3AsIGxwcmVjdC0+cmlnaHQsIGxwcmVjdC0+Ym90dG9tKTsKICAgICBscHBvcC0+V2lkdGggID0gbHByZWN0LT5yaWdodCAtIGxwcmVjdC0+bGVmdDsKICAgICBscHBvcC0+SGVpZ2h0ID0gMDsKQEAgLTc3Niw3ICs3NzMsNyBAQAogCSAgICBpZiAoKGkgIT0gc3RhcnQpICYmCiAJCShscGl0ZW0tPmZUeXBlICYgKE1GX01FTlVCUkVBSyB8IE1GX01FTlVCQVJCUkVBSykpKSBicmVhazsKIAotCSAgICBkcHJpbnRmX21lbnUoIHN0ZGRlYiwKKwkgICAgZHByaW50Zl9pbmZvKG1lbnUsCiAJCQkgICJNRU5VX01lbnVCYXJDYWxjU2l6ZTogY2FsbGluZyBNRU5VX0NhbGNJdGVtU2l6ZSIKIAkJCSAgIiBvcmc9KCVkLCAlZClcbiIsIG9yZ1gsIG9yZ1kgKTsKIAkgICAgZGVidWdfcHJpbnRfbWVudWl0ZW0gKCIgIGl0ZW06ICIsIGxwaXRlbSwgIiIpOwpAQCAtODQ3LDcgKzg0NCw3IEBACiAgICAgewogICAgICAgICBEUkFXSVRFTVNUUlVDVDMyIGRpczsKIAotICAgICAgICBkcHJpbnRmX21lbnUoIHN0ZGRlYiwgIkRyYXdNZW51SXRlbTogT3duZXJkcmF3IVxuIiApOworICAgICAgICBkcHJpbnRmX2luZm8obWVudSwgIkRyYXdNZW51SXRlbTogT3duZXJkcmF3IVxuIiApOwogICAgICAgICBkaXMuQ3RsVHlwZSAgID0gT0RUX01FTlU7CiAgICAgICAgIGRpcy5pdGVtSUQgICAgPSBscGl0ZW0tPndJRDsKICAgICAgICAgZGlzLml0ZW1EYXRhICA9IChEV09SRClscGl0ZW0tPnRleHQ7CkBAIC0xMTQwLDcgKzExMzcsNyBAQAogICAgIAogICAgIGxwcG9wID0gKExQUE9QVVBNRU5VKSBVU0VSX0hFQVBfTElOX0FERFIoIChITUVOVTE2KXduZFB0ci0+d0lEbWVudSApOwogICAgIGlmIChscHBvcCA9PSBOVUxMIHx8IGxwcmVjdCA9PSBOVUxMKSByZXR1cm4gU1lTTUVUUklDU19DWU1FTlU7Ci0gICAgZHByaW50Zl9tZW51KHN0ZGRlYiwiTUVOVV9EcmF3TWVudUJhciglMDR4LCAlcCwgJXApOyAhXG4iLCAKKyAgICBkcHJpbnRmX2luZm8obWVudSwiTUVOVV9EcmF3TWVudUJhciglMDR4LCAlcCwgJXApOyAhXG4iLCAKIAkJIGhEQywgbHByZWN0LCBscHBvcCk7CiAgICAgaWYgKGxwcG9wLT5IZWlnaHQgPT0gMCkgTUVOVV9NZW51QmFyQ2FsY1NpemUoaERDLCBscHJlY3QsIGxwcG9wLCBod25kKTsKICAgICBscHJlY3QtPmJvdHRvbSA9IGxwcmVjdC0+dG9wICsgbHBwb3AtPkhlaWdodDsKQEAgLTExNzUsNyArMTE3Miw3IEBACiAgICAgewogCUhUQVNLMTYgaFRhc2sgPSAwOwogCi0JZHByaW50Zl9tZW51KHN0ZGRlYiwicGF0Y2hpbmcgcmVzaWRlbnQgcG9wdXA6ICUwNHggJTA0eCBbJTA0eCAlMDR4XVxuIiwgCisJZHByaW50Zl9pbmZvKG1lbnUsInBhdGNoaW5nIHJlc2lkZW50IHBvcHVwOiAlMDR4ICUwNHggWyUwNHggJTA0eF1cbiIsIAogCQljaGVja1F1ZXVlLCBjaGVja1duZCA/IGNoZWNrV25kLT5od25kU2VsZiA6IDAsIHBUb3BQb3B1cFduZC0+aG1lbVRhc2tRLCAKIAkJcFRvcFBvcHVwV25kLT5vd25lciA/IHBUb3BQb3B1cFduZC0+b3duZXItPmh3bmRTZWxmIDogMCk7CiAKQEAgLTEyMTMsNyArMTIxMCw3IEBACiAJCXBUb3BQb3B1cFduZC0+aG1lbVRhc2tRID0gdGFzay0+aFF1ZXVlOwogCQlyZXR1cm4gVFJVRTsKIAkgICAgfSAKLQkgICAgZWxzZSBkcHJpbnRmX21lbnUoc3RkZGViLCJmYWlsZWQgdG8gcGF0Y2ggcmVzaWRlbnQgcG9wdXAuXG4iKTsKKwkgICAgZWxzZSBkcHJpbnRmX3dhcm4obWVudSwiZmFpbGVkIHRvIHBhdGNoIHJlc2lkZW50IHBvcHVwLlxuIik7CiAJfSAKICAgICB9CiAgICAgcmV0dXJuIEZBTFNFOwpAQCAtMTQ5MSw3ICsxNDg4LDcgQEAKIAogICAgIGlmICghKG1lbnUgPSAoUE9QVVBNRU5VICopVVNFUl9IRUFQX0xJTl9BRERSKGhNZW51KSkpIAogICAgIHsKLSAgICAgICAgZHByaW50Zl9tZW51KCBzdGRkZWIsICJNRU5VX0luc2VydEl0ZW06ICUwNHggbm90IGEgbWVudSBoYW5kbGVcbiIsCisgICAgICAgIGRwcmludGZfd2FybihtZW51LCAiTUVOVV9JbnNlcnRJdGVtOiAlMDR4IG5vdCBhIG1lbnUgaGFuZGxlXG4iLAogICAgICAgICAgICAgICAgICAgICAgIGhNZW51ICk7CiAgICAgICAgIHJldHVybiBOVUxMOwogICAgIH0KQEAgLTE1MDksMTMgKzE1MDYsMTMgQEAKICAgICB7CiAgICAgICAgIGlmICghTUVOVV9GaW5kSXRlbSggJmhNZW51LCAmcG9zLCBmbGFncyApKSAKICAgICAgICAgewotICAgICAgICAgICAgZHByaW50Zl9tZW51KCBzdGRkZWIsICJNRU5VX0luc2VydEl0ZW06IGl0ZW0gJXggbm90IGZvdW5kXG4iLAorICAgICAgICAgICAgZHByaW50Zl93YXJuKG1lbnUsICJNRU5VX0luc2VydEl0ZW06IGl0ZW0gJXggbm90IGZvdW5kXG4iLAogICAgICAgICAgICAgICAgICAgICAgICAgICBwb3MgKTsKICAgICAgICAgICAgIHJldHVybiBOVUxMOwogICAgICAgICB9CiAgICAgICAgIGlmICghKG1lbnUgPSAoTFBQT1BVUE1FTlUpIFVTRVJfSEVBUF9MSU5fQUREUihoTWVudSkpKQogICAgICAgICB7Ci0gICAgICAgICAgICBkcHJpbnRmX21lbnUoc3RkZGViLCJNRU5VX0luc2VydEl0ZW06ICUwNHggbm90IGEgbWVudSBoYW5kbGVcbiIsCisgICAgICAgICAgICBkcHJpbnRmX3dhcm4obWVudSwiTUVOVV9JbnNlcnRJdGVtOiAlMDR4IG5vdCBhIG1lbnUgaGFuZGxlXG4iLAogICAgICAgICAgICAgICAgICAgICAgICAgIGhNZW51KTsKICAgICAgICAgICAgIHJldHVybiBOVUxMOwogICAgICAgICB9CkBAIC0xNTI2LDcgKzE1MjMsNyBAQAogICAgIG5ld0l0ZW1zID0gSGVhcEFsbG9jKCBTeXN0ZW1IZWFwLCAwLCBzaXplb2YoTUVOVUlURU0pICogKG1lbnUtPm5JdGVtcysxKSApOwogICAgIGlmICghbmV3SXRlbXMpCiAgICAgewotICAgICAgICBkcHJpbnRmX21lbnUoIHN0ZGRlYiwgIk1FTlVfSW5zZXJ0SXRlbTogYWxsb2NhdGlvbiBmYWlsZWRcbiIgKTsKKyAgICAgICAgZHByaW50Zl93YXJuKG1lbnUsICJNRU5VX0luc2VydEl0ZW06IGFsbG9jYXRpb24gZmFpbGVkXG4iICk7CiAgICAgICAgIHJldHVybiBOVUxMOwogICAgIH0KICAgICBpZiAobWVudS0+bkl0ZW1zID4gMCkKQEAgLTE2MjMsNyArMTYyMCw3IEBACiAJewogCSAgICBMUFNUUiBuZXdzdHIgPSBIRUFQX3N0cmR1cFd0b0EoR2V0UHJvY2Vzc0hlYXAoKSwKIAkJCQkJICAgMCwgbWlpLmR3VHlwZURhdGEpOwotCSAgICBkcHJpbnRmX21lbnUoc3RkZGViLCAiTWVudSBpdGVtOiBbJTA4eCwlMDh4LCUwNHgsJTA0eCwlc11cbiIsCisJICAgIGRwcmludGZfaW5mbyhtZW51LCAiTWVudSBpdGVtOiBbJTA4eCwlMDh4LCUwNHgsJTA0eCwlc11cbiIsCiAJCQkgbWlpLmZUeXBlLCBtaWkuZlN0YXRlLCBtaWkud0lELCByZXNpbmZvLCBuZXdzdHIpOwogCSAgSGVhcEZyZWUoIEdldFByb2Nlc3NIZWFwKCksIDAsIG5ld3N0ciApOwogCX0KQEAgLTE4MzcsNyArMTgzNCw3IEBACiAKICAgICBpdGVtID0gJm1lbnUtPml0ZW1zW21lbnUtPkZvY3VzZWRJdGVtXTsKIAotICAgIGRwcmludGZfbWVudShzdGRkZWIsICJNRU5VX0V4ZWNGb2N1c2VkSXRlbTogJTA4eCAlMDh4ICUwOHhcbiIsCisgICAgZHByaW50Zl9pbmZvKG1lbnUsICJNRU5VX0V4ZWNGb2N1c2VkSXRlbTogJTA4eCAlMDh4ICUwOHhcbiIsCiAgICAgICAgICAgICAgICAgIGhNZW51LCBpdGVtLT53SUQsIGl0ZW0tPmhTdWJNZW51KTsKIAogICAgIGlmICghKGl0ZW0tPmZUeXBlICYgTUZfUE9QVVApKQpAQCAtMTkzMiw3ICsxOTI5LDcgQEAKIAkgICAgcG10LT5oQ3VycmVudE1lbnUgPSBNRU5VX1Nob3dTdWJQb3B1cCggcG10LT5oT3duZXJXbmQsIGhQdE1lbnUsIEZBTFNFICk7CiAJICAgIHJldHVybiBUUlVFOwogCX0gCi0JZWxzZSBkcHJpbnRmX21lbnUoc3RkZGViLCJcdHVuYWJsZSB0byBmaW5kIGNsaWNrZWQgaXRlbSFcbiIpOworCWVsc2UgZHByaW50Zl93YXJuKG1lbnUsICJcdHVuYWJsZSB0byBmaW5kIGNsaWNrZWQgaXRlbSFcbiIpOwogICAgIH0KICAgICByZXR1cm4gRkFMU0U7CiB9CkBAIC0yMDI2LDcgKzIwMjMsNyBAQAogCUxSRVNVTFQgbCA9IFNlbmRNZXNzYWdlMTYoIHBtdC0+aE93bmVyV25kLCBXTV9ORVhUTUVOVSwgKFdQQVJBTTE2KXZrLCAKIAkJKElTX1NZU1RFTV9NRU5VKG1lbnUpKSA/IEdldFN1Yk1lbnUxNihwbXQtPmhUb3BNZW51LDApIDogcG10LT5oVG9wTWVudSApOwogCi0JZHByaW50Zl9tZW51KHN0ZGRlYiwiTmV4dE1lbnU6ICUwNHggWyUwNHhdIC0+ICUwNHggWyUwNHhdXG4iLAorCWRwcmludGZfaW5mbyhtZW51LCJOZXh0TWVudTogJTA0eCBbJTA0eF0gLT4gJTA0eCBbJTA0eF1cbiIsCiAJCSAgICAgKFVJTlQxNilwbXQtPmhDdXJyZW50TWVudSwgKFVJTlQxNilwbXQtPmhPd25lclduZCwgTE9XT1JEKGwpLCBISVdPUkQobCkgKTsKIAogCWlmKCBsID09IDAgKQpAQCAtMjA3NCw3ICsyMDcxLDcgQEAKIAkJICAgIC8qIEZJWE1FOiBOb3Qgc3VyZSB3aGF0IHRvIGRvIGhlcmUsIHBlcmhhcHMsCiAJCSAgICAgKiB0cnkgdG8gdHJhY2sgaE5ld01lbnUgYXMgYSBwb3B1cD8gKi8KIAotCQkgICAgZHByaW50Zl9tZW51KHN0ZGRlYiwiTUVOVV9Eb05leHRNZW51KCkgZ290IGNvbmZ1c2VkLlxuIik7CisJCSAgICBkcHJpbnRmX2luZm8obWVudSwiTUVOVV9Eb05leHRNZW51KCkgZ290IGNvbmZ1c2VkLlxuIik7CiAJCSAgICByZXR1cm4gRkFMU0U7CiAJCX0KIAkgICAgfQpAQCAtMjIwNSw3ICsyMjAyLDcgQEAKICAgICBQT1BVUE1FTlUgKm1lbnUgPSAoUE9QVVBNRU5VICopIFVTRVJfSEVBUF9MSU5fQUREUiggcG10LT5oVG9wTWVudSApOwogICAgIFVJTlQzMiAgbmV4dGNvbDsKIAotICAgIGRwcmludGZfbWVudSggc3RkZGViLCAiTUVOVV9LZXlSaWdodCBjYWxsZWQsIGN1ciAleCAoJXMpLCB0b3AgJXggKCVzKS5cbiIsCisgICAgZHByaW50Zl9pbmZvKG1lbnUsICJNRU5VX0tleVJpZ2h0IGNhbGxlZCwgY3VyICV4ICglcyksIHRvcCAleCAoJXMpLlxuIiwKIAkJICBwbXQtPmhDdXJyZW50TWVudSwKIAkJICAoKFBPUFVQTUVOVSAqKVVTRVJfSEVBUF9MSU5fQUREUihwbXQtPmhDdXJyZW50TWVudSkpLT4KIAkJICAgICBpdGVtc1swXS50ZXh0LApAQCAtMjIyNSw3ICsyMjIyLDcgQEAKICAgICAvKiBDaGVjayB0byBzZWUgaWYgdGhlcmUncyBhbm90aGVyIGNvbHVtbiAqLwogICAgIGlmKCAobmV4dGNvbCA9IE1FTlVfR2V0U3RhcnRPZk5leHRDb2x1bW4oIHBtdC0+aEN1cnJlbnRNZW51ICkpICE9IAogCU5PX1NFTEVDVEVEX0lURU0gKSB7Ci0JZHByaW50Zl9tZW51KCBzdGRkZWIsICJLZXlSaWdodDogR29pbmcgdG8gJWQuXG4iLCBuZXh0Y29sICk7CisJZHByaW50Zl9pbmZvKG1lbnUsICJLZXlSaWdodDogR29pbmcgdG8gJWQuXG4iLCBuZXh0Y29sICk7CiAJTUVOVV9TZWxlY3RJdGVtKCBwbXQtPmhPd25lclduZCwgcG10LT5oQ3VycmVudE1lbnUsCiAJCQkgbmV4dGNvbCwgVFJVRSApOwogCXJldHVybjsKQEAgLTI2MTQsNyArMjYxMSw3IEBACiAKIAlpZiggaHduZCA9PSBwVG9wUG9wdXBXbmQtPmh3bmRTZWxmICkKIAl7CQotCSAgICBkcHJpbnRmX21lbnUoc3RkZGViLCJyZXNpZGVudCBwb3B1cCBkZXN0cm95ZWQhXG4iKTsKKwkgICAgZHByaW50Zl9lcnIobWVudSwgInJlc2lkZW50IHBvcHVwIGRlc3Ryb3llZCFcbiIpOwogCiAJICAgIHBUb3BQb3B1cFduZCA9IE5VTEw7IAogCSAgICB1U3ViUFduZExldmVsID0gMDsgCkBAIC0yNjYzLDcgKzI2NjAsNyBAQAogICAgIFdORCAqd25kUHRyOwogICAgIExQUE9QVVBNRU5VIGxwcG9wOwogCi0gICAgZHByaW50Zl9tZW51KCBzdGRkZWIsICJNRU5VX0dldE1lbnVCYXJIZWlnaHQ6IEhXTkQgMHgleCwgd2lkdGggJWQsICIKKyAgICBkcHJpbnRmX2luZm8obWVudSwgIk1FTlVfR2V0TWVudUJhckhlaWdodDogSFdORCAweCV4LCB3aWR0aCAlZCwgIgogCQkgICJhdCAoJWQsICVkKS5cbiIsIGh3bmQsIG1lbnViYXJXaWR0aCwgb3JnWCwgb3JnWSApOwogICAgIAogICAgIGlmICghKHduZFB0ciA9IFdJTl9GaW5kV25kUHRyKCBod25kICkpKSByZXR1cm4gMDsKQEAgLTI2ODMsNyArMjY4MCw3IEBACiBCT09MMTYgV0lOQVBJIENoYW5nZU1lbnUxNiggSE1FTlUxNiBoTWVudSwgVUlOVDE2IHBvcywgU0VHUFRSIGRhdGEsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVUlOVDE2IGlkLCBVSU5UMTYgZmxhZ3MgKQogewotICAgIGRwcmludGZfbWVudSggc3RkZGViLCJDaGFuZ2VNZW51MTY6IG1lbnU9JTA0eCBwb3M9JWQgZGF0YT0lMDhseCBpZD0lMDR4IGZsYWdzPSUwNHhcbiIsCisgICAgZHByaW50Zl9pbmZvKG1lbnUsIkNoYW5nZU1lbnUxNjogbWVudT0lMDR4IHBvcz0lZCBkYXRhPSUwOGx4IGlkPSUwNHggZmxhZ3M9JTA0eFxuIiwKICAgICAgICAgICAgICAgICAgIGhNZW51LCBwb3MsIChEV09SRClkYXRhLCBpZCwgZmxhZ3MgKTsKICAgICBpZiAoZmxhZ3MgJiBNRl9BUFBFTkQpIHJldHVybiBBcHBlbmRNZW51MTYoIGhNZW51LCBmbGFncyAmIH5NRl9BUFBFTkQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZCwgZGF0YSApOwpAQCAtMjcwOSw3ICsyNzA2LDcgQEAKIEJPT0wzMiBXSU5BUEkgQ2hhbmdlTWVudTMyQSggSE1FTlUzMiBoTWVudSwgVUlOVDMyIHBvcywgTFBDU1RSIGRhdGEsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFVJTlQzMiBpZCwgVUlOVDMyIGZsYWdzICkKIHsKLSAgICBkcHJpbnRmX21lbnUoIHN0ZGRlYiwiQ2hhbmdlTWVudTMyQTogbWVudT0lMDh4IHBvcz0lZCBkYXRhPSUwOGx4IGlkPSUwOHggZmxhZ3M9JTA4eFxuIiwKKyAgICBkcHJpbnRmX2luZm8obWVudSwiQ2hhbmdlTWVudTMyQTogbWVudT0lMDh4IHBvcz0lZCBkYXRhPSUwOGx4IGlkPSUwOHggZmxhZ3M9JTA4eFxuIiwKICAgICAgICAgICAgICAgICAgIGhNZW51LCBwb3MsIChEV09SRClkYXRhLCBpZCwgZmxhZ3MgKTsKICAgICBpZiAoZmxhZ3MgJiBNRl9BUFBFTkQpIHJldHVybiBBcHBlbmRNZW51MzJBKCBoTWVudSwgZmxhZ3MgJiB+TUZfQVBQRU5ELAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlkLCBkYXRhICk7CkBAIC0yNzMwLDcgKzI3MjcsNyBAQAogQk9PTDMyIFdJTkFQSSBDaGFuZ2VNZW51MzJXKCBITUVOVTMyIGhNZW51LCBVSU5UMzIgcG9zLCBMUENXU1RSIGRhdGEsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFVJTlQzMiBpZCwgVUlOVDMyIGZsYWdzICkKIHsKLSAgICBkcHJpbnRmX21lbnUoIHN0ZGRlYiwiQ2hhbmdlTWVudTMyVzogbWVudT0lMDh4IHBvcz0lZCBkYXRhPSUwOGx4IGlkPSUwOHggZmxhZ3M9JTA4eFxuIiwKKyAgICBkcHJpbnRmX2luZm8obWVudSwiQ2hhbmdlTWVudTMyVzogbWVudT0lMDh4IHBvcz0lZCBkYXRhPSUwOGx4IGlkPSUwOHggZmxhZ3M9JTA4eFxuIiwKICAgICAgICAgICAgICAgICAgIGhNZW51LCBwb3MsIChEV09SRClkYXRhLCBpZCwgZmxhZ3MgKTsKICAgICBpZiAoZmxhZ3MgJiBNRl9BUFBFTkQpIHJldHVybiBBcHBlbmRNZW51MzJXKCBoTWVudSwgZmxhZ3MgJiB+TUZfQVBQRU5ELAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlkLCBkYXRhICk7CkBAIC0yNzYyLDcgKzI3NTksNyBAQAogICAgIE1FTlVJVEVNICppdGVtOwogICAgIERXT1JEIHJldDsKIAotICAgIGRwcmludGZfbWVudSggc3RkZGViLCJDaGVja01lbnVJdGVtOiAlMDR4ICUwNHggJTA0eFxuIiwgaE1lbnUsIGlkLCBmbGFncyApOworICAgIGRwcmludGZfaW5mbyhtZW51LCJDaGVja01lbnVJdGVtOiAlMDR4ICUwNHggJTA0eFxuIiwgaE1lbnUsIGlkLCBmbGFncyApOwogICAgIGlmICghKGl0ZW0gPSBNRU5VX0ZpbmRJdGVtKCAmaE1lbnUsICZpZCwgZmxhZ3MgKSkpIHJldHVybiAtMTsKICAgICByZXQgPSBpdGVtLT5mU3RhdGUgJiBNRl9DSEVDS0VEOwogICAgIGlmIChmbGFncyAmIE1GX0NIRUNLRUQpIGl0ZW0tPmZTdGF0ZSB8PSBNRl9DSEVDS0VEOwpAQCAtMjc4OCw3ICsyNzg1LDcgQEAKICAgICBCT09MMzIgICAgYlJldCA9IEZBTFNFOwogICAgIE1FTlVJVEVNICppdGVtLCAqZmlyc3QgPSBOVUxMOwogCi0gICAgZHByaW50Zl9tZW51KHN0ZGRlYiwiRW5hYmxlTWVudUl0ZW0gKCUwNHgsICUwNFgsICUwNFgpICFcbiIsIAorICAgIGRwcmludGZfaW5mbyhtZW51LCJFbmFibGVNZW51SXRlbSAoJTA0eCwgJTA0WCwgJTA0WCkgIVxuIiwgCiAJCSAgICAgICAgICAgICAgICAgICAgICAgIGhNZW51LCB3SXRlbUlELCB3RmxhZ3MpOwogCiAgICAgd2hpbGUoIChpdGVtID0gTUVOVV9GaW5kSXRlbSggJmhNZW51LCAmd0l0ZW1JRCwgd0ZsYWdzICkpICkKQEAgLTI4MzYsMTQgKzI4MzMsMTQgQEAKIHsKICAgICBNRU5VSVRFTSAqaXRlbTsKIAotICAgIGRwcmludGZfbWVudSggc3RkZGViLCAiR2V0TWVudVN0cmluZzMyQTogbWVudT0lMDR4IGl0ZW09JTA0eCBwdHI9JXAgbGVuPSVkIGZsYWdzPSUwNHhcbiIsCisgICAgZHByaW50Zl9pbmZvKG1lbnUsICJHZXRNZW51U3RyaW5nMzJBOiBtZW51PSUwNHggaXRlbT0lMDR4IHB0cj0lcCBsZW49JWQgZmxhZ3M9JTA0eFxuIiwKICAgICAgICAgICAgICAgICAgaE1lbnUsIHdJdGVtSUQsIHN0ciwgbk1heFNpeiwgd0ZsYWdzICk7CiAgICAgaWYgKCFzdHIgfHwgIW5NYXhTaXopIHJldHVybiAwOwogICAgIHN0clswXSA9ICdcMCc7CiAgICAgaWYgKCEoaXRlbSA9IE1FTlVfRmluZEl0ZW0oICZoTWVudSwgJndJdGVtSUQsIHdGbGFncyApKSkgcmV0dXJuIDA7CiAgICAgaWYgKCFJU19TVFJJTkdfSVRFTShpdGVtLT5mVHlwZSkpIHJldHVybiAwOwogICAgIGxzdHJjcHluMzJBKCBzdHIsIGl0ZW0tPnRleHQsIG5NYXhTaXogKTsKLSAgICBkcHJpbnRmX21lbnUoIHN0ZGRlYiwgIkdldE1lbnVTdHJpbmczMkE6IHJldHVybmluZyAnJXMnXG4iLCBzdHIgKTsKKyAgICBkcHJpbnRmX2luZm8obWVudSwgIkdldE1lbnVTdHJpbmczMkE6IHJldHVybmluZyAnJXMnXG4iLCBzdHIgKTsKICAgICByZXR1cm4gc3RybGVuKHN0cik7CiB9CiAKQEAgLTI4NTYsNyArMjg1Myw3IEBACiB7CiAgICAgTUVOVUlURU0gKml0ZW07CiAKLSAgICBkcHJpbnRmX21lbnUoIHN0ZGRlYiwgIkdldE1lbnVTdHJpbmczMlc6IG1lbnU9JTA0eCBpdGVtPSUwNHggcHRyPSVwIGxlbj0lZCBmbGFncz0lMDR4XG4iLAorICAgIGRwcmludGZfaW5mbyhtZW51LCAiR2V0TWVudVN0cmluZzMyVzogbWVudT0lMDR4IGl0ZW09JTA0eCBwdHI9JXAgbGVuPSVkIGZsYWdzPSUwNHhcbiIsCiAgICAgICAgICAgICAgICAgIGhNZW51LCB3SXRlbUlELCBzdHIsIG5NYXhTaXosIHdGbGFncyApOwogICAgIGlmICghc3RyIHx8ICFuTWF4U2l6KSByZXR1cm4gMDsKICAgICBzdHJbMF0gPSAnXDAnOwpAQCAtMjg4NCw3ICsyODgxLDcgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVUlOVDMyIHdIaWxpdGUgKQogewogICAgIExQUE9QVVBNRU5VIG1lbnU7Ci0gICAgZHByaW50Zl9tZW51KHN0ZGRlYiwiSGlsaXRlTWVudUl0ZW0oJTA0eCwgJTA0eCwgJTA0eCwgJTA0eCk7XG4iLCAKKyAgICBkcHJpbnRmX2luZm8obWVudSwiSGlsaXRlTWVudUl0ZW0oJTA0eCwgJTA0eCwgJTA0eCwgJTA0eCk7XG4iLCAKICAgICAgICAgICAgICAgICAgaFduZCwgaE1lbnUsIHdJdGVtSUQsIHdIaWxpdGUpOwogICAgIGlmICghTUVOVV9GaW5kSXRlbSggJmhNZW51LCAmd0l0ZW1JRCwgd0hpbGl0ZSApKSByZXR1cm4gRkFMU0U7CiAgICAgaWYgKCEobWVudSA9IChMUFBPUFVQTUVOVSkgVVNFUl9IRUFQX0xJTl9BRERSKGhNZW51KSkpIHJldHVybiBGQUxTRTsKQEAgLTI5MTAsNyArMjkwNyw3IEBACiBVSU5UMzIgV0lOQVBJIEdldE1lbnVTdGF0ZTMyKCBITUVOVTMyIGhNZW51LCBVSU5UMzIgd0l0ZW1JRCwgVUlOVDMyIHdGbGFncyApCiB7CiAgICAgTUVOVUlURU0gKml0ZW07Ci0gICAgZHByaW50Zl9tZW51KHN0ZGRlYiwiR2V0TWVudVN0YXRlKCUwNHgsICUwNHgsICUwNHgpO1xuIiwgCisgICAgZHByaW50Zl9pbmZvKG1lbnUsIkdldE1lbnVTdGF0ZSglMDR4LCAlMDR4LCAlMDR4KTtcbiIsIAogCQkgaE1lbnUsIHdJdGVtSUQsIHdGbGFncyk7CiAgICAgaWYgKCEoaXRlbSA9IE1FTlVfRmluZEl0ZW0oICZoTWVudSwgJndJdGVtSUQsIHdGbGFncyApKSkgcmV0dXJuIC0xOwogICAgIGRlYnVnX3ByaW50X21lbnVpdGVtICgiICBpdGVtOiAiLCBpdGVtLCAiIik7CkBAIC0yOTM3LDcgKzI5MzQsNyBAQAogewogICAgIExQUE9QVVBNRU5VCW1lbnUgPSAoTFBQT1BVUE1FTlUpIFVTRVJfSEVBUF9MSU5fQUREUihoTWVudSk7CiAgICAgaWYgKCFJU19BX01FTlUobWVudSkpIHJldHVybiAtMTsKLSAgICBkcHJpbnRmX21lbnUoIHN0ZGRlYiwiR2V0TWVudUl0ZW1Db3VudDE2KCUwNHgpIHJldHVybmluZyAlZFxuIiwgCisgICAgZHByaW50Zl9pbmZvKG1lbnUsIkdldE1lbnVJdGVtQ291bnQxNiglMDR4KSByZXR1cm5pbmcgJWRcbiIsIAogICAgICAgICAgICAgICAgICAgaE1lbnUsIG1lbnUtPm5JdGVtcyApOwogICAgIHJldHVybiBtZW51LT5uSXRlbXM7CiB9CkBAIC0yOTUwLDcgKzI5NDcsNyBAQAogewogICAgIExQUE9QVVBNRU5VCW1lbnUgPSAoTFBQT1BVUE1FTlUpIFVTRVJfSEVBUF9MSU5fQUREUihoTWVudSk7CiAgICAgaWYgKCFJU19BX01FTlUobWVudSkpIHJldHVybiAtMTsKLSAgICBkcHJpbnRmX21lbnUoIHN0ZGRlYiwiR2V0TWVudUl0ZW1Db3VudDMyKCUwNHgpIHJldHVybmluZyAlZFxuIiwgCisgICAgZHByaW50Zl9pbmZvKG1lbnUsIkdldE1lbnVJdGVtQ291bnQzMiglMDR4KSByZXR1cm5pbmcgJWRcbiIsIAogICAgICAgICAgICAgICAgICAgaE1lbnUsIG1lbnUtPm5JdGVtcyApOwogICAgIHJldHVybiBtZW51LT5uSXRlbXM7CiB9CkBAIC0zMDA3LDEwICszMDA0LDEwIEBACiAgICAgTUVOVUlURU0gKml0ZW07CiAKICAgICBpZiAoSVNfU1RSSU5HX0lURU0oZmxhZ3MpICYmIHN0cikKLSAgICAgICAgZHByaW50Zl9tZW51KCBzdGRkZWIsICJJbnNlcnRNZW51OiBoTWVudSAlMDR4LCBwb3MgJWQsIGZsYWdzICUwOHgsICIKKyAgICAgICAgZHByaW50Zl9pbmZvKG1lbnUsICJJbnNlcnRNZW51OiBoTWVudSAlMDR4LCBwb3MgJWQsIGZsYWdzICUwOHgsICIKIAkJICAgICAgImlkICUwNHgsIHN0ciAnJXMnXG4iLAogICAgICAgICAgICAgICAgICAgICAgIGhNZW51LCBwb3MsIGZsYWdzLCBpZCwgc3RyICk7Ci0gICAgZWxzZSBkcHJpbnRmX21lbnUoIHN0ZGRlYiwgIkluc2VydE1lbnU6IGhNZW51ICUwNHgsIHBvcyAlZCwgZmxhZ3MgJTA4eCwgIgorICAgIGVsc2UgZHByaW50Zl9pbmZvKG1lbnUsICJJbnNlcnRNZW51OiBoTWVudSAlMDR4LCBwb3MgJWQsIGZsYWdzICUwOHgsICIKIAkJICAgICAgICJpZCAlMDR4LCBzdHIgJTA4bHggKG5vdCBhIHN0cmluZylcbiIsCiAgICAgICAgICAgICAgICAgICAgICAgIGhNZW51LCBwb3MsIGZsYWdzLCBpZCwgKERXT1JEKXN0ciApOwogCkBAIC0zMDk2LDcgKzMwOTMsNyBAQAogICAgIExQUE9QVVBNRU5VCW1lbnU7CiAgICAgTUVOVUlURU0gKml0ZW07CiAKLSAgICBkcHJpbnRmX21lbnUoc3RkZGViLCJSZW1vdmVNZW51ICglMDR4LCAlMDR4LCAlMDR4KVxuIixoTWVudSwgblBvcywgd0ZsYWdzKTsKKyAgICBkcHJpbnRmX2luZm8obWVudSwiUmVtb3ZlTWVudSAoJTA0eCwgJTA0eCwgJTA0eClcbiIsaE1lbnUsIG5Qb3MsIHdGbGFncyk7CiAgICAgaWYgKCEoaXRlbSA9IE1FTlVfRmluZEl0ZW0oICZoTWVudSwgJm5Qb3MsIHdGbGFncyApKSkgcmV0dXJuIEZBTFNFOwogICAgIGlmICghKG1lbnUgPSAoTFBQT1BVUE1FTlUpIFVTRVJfSEVBUF9MSU5fQUREUihoTWVudSkpKSByZXR1cm4gRkFMU0U7CiAgICAgCkBAIC0zMTcwLDEzICszMTY3LDEzIEBACiAKICAgICBpZiAoSVNfU1RSSU5HX0lURU0oZmxhZ3MpKQogICAgIHsKLQlkcHJpbnRmX21lbnUoIHN0ZGRlYiwgIk1vZGlmeU1lbnU6ICUwNHggJWQgJTA0eCAlMDR4ICclcydcbiIsCisJZHByaW50Zl9pbmZvKG1lbnUsICJNb2RpZnlNZW51OiAlMDR4ICVkICUwNHggJTA0eCAnJXMnXG4iLAogICAgICAgICAgICAgICAgICAgICAgIGhNZW51LCBwb3MsIGZsYWdzLCBpZCwgc3RyID8gc3RyIDogIiNOVUxMIyIgKTsKICAgICAgICAgaWYgKCFzdHIpIHJldHVybiBGQUxTRTsKICAgICB9CiAgICAgZWxzZQogICAgIHsKLQlkcHJpbnRmX21lbnUoIHN0ZGRlYiwgIk1vZGlmeU1lbnU6ICUwNHggJWQgJTA0eCAlMDR4ICUwOGx4XG4iLAorCWRwcmludGZfaW5mbyhtZW51LCAiTW9kaWZ5TWVudTogJTA0eCAlZCAlMDR4ICUwNHggJTA4bHhcbiIsCiAgICAgICAgICAgICAgICAgICAgICAgaE1lbnUsIHBvcywgZmxhZ3MsIGlkLCAoRFdPUkQpc3RyICk7CiAgICAgfQogCkBAIC0zMjU0LDcgKzMyNTEsNyBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSEJJVE1BUDMyIGhOZXdVbkNoZWNrLCBIQklUTUFQMzIgaE5ld0NoZWNrKQogewogICAgIE1FTlVJVEVNICppdGVtOwotICAgIGRwcmludGZfbWVudShzdGRkZWIsIlNldE1lbnVJdGVtQml0bWFwcyglMDR4LCAlMDR4LCAlMDR4LCAlMDR4LCAlMDR4KVxuIiwKKyAgICBkcHJpbnRmX2luZm8obWVudSwiU2V0TWVudUl0ZW1CaXRtYXBzKCUwNHgsICUwNHgsICUwNHgsICUwNHgsICUwNHgpXG4iLAogICAgICAgICAgICAgICAgICBoTWVudSwgblBvcywgd0ZsYWdzLCBoTmV3Q2hlY2ssIGhOZXdVbkNoZWNrKTsKICAgICBpZiAoIShpdGVtID0gTUVOVV9GaW5kSXRlbSggJmhNZW51LCAmblBvcywgd0ZsYWdzICkpKSByZXR1cm4gRkFMU0U7CiAKQEAgLTMyOTksNyArMzI5Niw3IEBACiAgICAgbWVudS0+aFduZCAgID0gMDsKICAgICBtZW51LT5pdGVtcyAgPSBOVUxMOwogICAgIG1lbnUtPkZvY3VzZWRJdGVtID0gTk9fU0VMRUNURURfSVRFTTsKLSAgICBkcHJpbnRmX21lbnUoIHN0ZGRlYiwgIkNyZWF0ZU1lbnU6IHJldHVybiAlMDR4XG4iLCBoTWVudSApOworICAgIGRwcmludGZfaW5mbyhtZW51LCAiQ3JlYXRlTWVudTogcmV0dXJuICUwNHhcbiIsIGhNZW51ICk7CiAgICAgcmV0dXJuIGhNZW51OwogfQogCkBAIC0zMzE4LDcgKzMzMTUsNyBAQAogICovCiBCT09MMzIgV0lOQVBJIERlc3Ryb3lNZW51MzIoIEhNRU5VMzIgaE1lbnUgKQogewotICAgIGRwcmludGZfbWVudShzdGRkZWIsIkRlc3Ryb3lNZW51KCUwNHgpXG4iLCBoTWVudSk7CisgICAgZHByaW50Zl9pbmZvKG1lbnUsIkRlc3Ryb3lNZW51KCUwNHgpXG4iLCBoTWVudSk7CiAKICAgICAvKiBTaWxlbnRseSBpZ25vcmUgYXR0ZW1wdHMgdG8gZGVzdHJveSBkZWZhdWx0IHN5c3RlbSBwb3B1cCAqLwogCkBAIC0zNDY2LDcgKzM0NjMsNyBAQAogewogICAgIFdORCAqIHduZFB0ciA9IFdJTl9GaW5kV25kUHRyKGhXbmQpOwogCi0gICAgZHByaW50Zl9tZW51KHN0ZGRlYiwiU2V0TWVudSglMDR4LCAlMDR4KTtcbiIsIGhXbmQsIGhNZW51KTsKKyAgICBkcHJpbnRmX2luZm8obWVudSwiU2V0TWVudSglMDR4LCAlMDR4KTtcbiIsIGhXbmQsIGhNZW51KTsKIAogICAgIGlmICh3bmRQdHIgJiYgISh3bmRQdHItPmR3U3R5bGUgJiBXU19DSElMRCkpCiAgICAgewpAQCAtMzU3OCwxMSArMzU3NSwxMSBAQAogICAgIGlmIChISVdPUkQobmFtZSkpCiAgICAgewogICAgICAgICBjaGFyICpzdHIgPSAoY2hhciAqKVBUUl9TRUdfVE9fTElOKCBuYW1lICk7Ci0gICAgICAgIGRwcmludGZfbWVudSggc3RkZGViLCAiTG9hZE1lbnUoJTA0eCwnJXMnKVxuIiwgaW5zdGFuY2UsIHN0ciApOworICAgICAgICBkcHJpbnRmX2luZm8obWVudSwgIkxvYWRNZW51KCUwNHgsJyVzJylcbiIsIGluc3RhbmNlLCBzdHIgKTsKICAgICAgICAgaWYgKHN0clswXSA9PSAnIycpIG5hbWUgPSAoU0VHUFRSKWF0b2koIHN0ciArIDEgKTsKICAgICB9CiAgICAgZWxzZQotICAgICAgICBkcHJpbnRmX3Jlc291cmNlKHN0ZGRlYiwiTG9hZE1lbnUoJTA0eCwlMDR4KVxuIixpbnN0YW5jZSxMT1dPUkQobmFtZSkpOworICAgICAgICBkcHJpbnRmX2luZm8ocmVzb3VyY2UsIkxvYWRNZW51KCUwNHgsJTA0eClcbiIsaW5zdGFuY2UsTE9XT1JEKG5hbWUpKTsKIAogICAgIGlmICghbmFtZSkgcmV0dXJuIDA7CiAgICAgCkBAIC0zNjMwLDcgKzM2MjcsNyBAQAogICAgIFdPUkQgdmVyc2lvbiwgb2Zmc2V0OwogICAgIExQQ1NUUiBwID0gKExQQ1NUUil0ZW1wbGF0ZTsKIAotICAgIGRwcmludGZfbWVudShzdGRkZWIsIkxvYWRNZW51SW5kaXJlY3QxNjogJXBcbiIsIHRlbXBsYXRlICk7CisgICAgZHByaW50Zl9pbmZvKG1lbnUsIkxvYWRNZW51SW5kaXJlY3QxNjogJXBcbiIsIHRlbXBsYXRlICk7CiAgICAgdmVyc2lvbiA9IEdFVF9XT1JEKHApOwogICAgIHAgKz0gc2l6ZW9mKFdPUkQpOwogICAgIGlmICh2ZXJzaW9uKQpAQCAtMzY1OSw3ICszNjU2LDcgQEAKICAgICBXT1JEIHZlcnNpb24sIG9mZnNldDsKICAgICBMUENTVFIgcCA9IChMUENTVFIpdGVtcGxhdGU7CiAKLSAgICBkcHJpbnRmX21lbnUoc3RkZGViLCJMb2FkTWVudUluZGlyZWN0MzJBOiAlcFxuIiwgdGVtcGxhdGUgKTsKKyAgICBkcHJpbnRmX2luZm8obWVudSwiTG9hZE1lbnVJbmRpcmVjdDMyQTogJXBcbiIsIHRlbXBsYXRlICk7CiAgICAgdmVyc2lvbiA9IEdFVF9XT1JEKHApOwogICAgIHAgKz0gc2l6ZW9mKFdPUkQpOwogICAgIHN3aXRjaCAodmVyc2lvbikKQEAgLTM5MzQsNyArMzkzMSw3IEBACiAgICAgIE1FTlVJVEVNICptaWZpcnN0LCAqbWlsYXN0LCAqbWljaGVjazsKICAgICAgSE1FTlUzMiBtZmlyc3QgPSBoTWVudSwgbWxhc3QgPSBoTWVudSwgbWNoZWNrID0gaE1lbnU7CiAKLSAgICAgZHByaW50Zl9tZW51IChzdGRkZWIsCisgICAgIGRwcmludGZfaW5mbyhtZW51LAogCQkgICAiQ2hlY2tNZW51UmFkaW9JdGVtMzI6IG94JXg6ICVkLSVkLCBjaGVjayAlZCwgYnlwb3M9JWRcbiIsCiAJCSAgIGhNZW51LCBmaXJzdCwgbGFzdCwgY2hlY2ssIGJ5cG9zKTsKIApAQCAtMzk4OCw3ICszOTg1LDcgQEAKICAgICAgTUVOVUlURU0gKml0ZW07CiAgICAgIEhNRU5VMzIgb3JnaE1lbnUgPSBoTWVudTsKIAotICAgICBkcHJpbnRmX21lbnUgKHN0ZGRlYiwgIkdldE1lbnVJdGVtUmVjdDMyICgweCV4LDB4JXgsJWQsJXApXG4iLAorICAgICBkcHJpbnRmX2luZm8obWVudSwgIkdldE1lbnVJdGVtUmVjdDMyICgweCV4LDB4JXgsJWQsJXApXG4iLAogCQkgICBod25kLCBoTWVudSwgdUl0ZW0sIHJlY3QpOwogCiAgICAgIGl0ZW0gPSBNRU5VX0ZpbmRJdGVtICgmaE1lbnUsICZ1SXRlbSwgTUZfQllQT1NJVElPTik7CmRpZmYgLS1naXQgYS9jb250cm9scy9wcm9ncmVzcy5jIGIvY29udHJvbHMvcHJvZ3Jlc3MuYwppbmRleCA2YTZlMzg4Li40MjZjMmM0IDEwMDY0NAotLS0gYS9jb250cm9scy9wcm9ncmVzcy5jCisrKyBiL2NvbnRyb2xzL3Byb2dyZXNzLmMKQEAgLTE3LDcgKzE3LDYgQEAKICNpbmNsdWRlICJncmFwaGljcy5oIgogI2luY2x1ZGUgImhlYXAuaCIKICNpbmNsdWRlICJ3aW4uaCIKLSNpbmNsdWRlICJzdGRkZWJ1Zy5oIgogI2luY2x1ZGUgImRlYnVnLmgiCiAKIC8qIENvbnRyb2wgY29uZmlndXJhdGlvbiBjb25zdGFudHMgKi8KQEAgLTI3LDcgKzI2LDcgQEAKIAogLyogV29yayBjb25zdGFudHMgKi8KIAotI2RlZmluZSBVTktOT1dOX1BBUkFNKG1zZywgd1BhcmFtLCBsUGFyYW0pIGRwcmludGZfcHJvZ3Jlc3Moc3RkZGViLCBcCisjZGVmaW5lIFVOS05PV05fUEFSQU0obXNnLCB3UGFyYW0sIGxQYXJhbSkgZHByaW50Zl93YXJuKHByb2dyZXNzLCBcCiAgICAgICAgICJQcm9ncmVzcyBDdHJsOiBVbmtub3duIHBhcmFtZXRlcihzKSBmb3IgbWVzc2FnZSAiICNtc2cgICAgIFwKIAkiKCUwNHgpOiB3cD0lMDR4IGxwPSUwOGx4XG4iLCBtc2csIHdQYXJhbSwgbFBhcmFtKTsgCiAKQEAgLTQ4LDcgKzQ3LDcgQEAKICAgUkVDVDMyIHJlY3Q7CiAgIEhEQzMyIGhkYzsKIAotICBkcHJpbnRmX3Byb2dyZXNzKHN0ZGRlYiwgIlByb2dyZXNzIEJhcjogcGFpbnQgcG9zPSVkIG1pbj0lZCwgbWF4PSVkXG4iLAorICBkcHJpbnRmX2luZm8ocHJvZ3Jlc3MsICJQcm9ncmVzcyBCYXI6IHBhaW50IHBvcz0lZCBtaW49JWQsIG1heD0lZFxuIiwKIAkJICAgaW5mb1B0ci0+Q3VyVmFsLCBpbmZvUHRyLT5NaW5WYWwsIGluZm9QdHItPk1heFZhbCk7CiAKICAgLyogZ2V0IGEgZGMgKi8KQEAgLTExNSwxMSArMTE0LDExIEBACiAgICAgICBpbmZvUHRyLT5NYXhWYWw9MTAwOwogICAgICAgaW5mb1B0ci0+Q3VyVmFsPTA7IAogICAgICAgaW5mb1B0ci0+U3RlcD0xMDsKLSAgICAgIGRwcmludGZfdXBkb3duKHN0ZGRlYiwgIlByb2dyZXNzIEN0cmwgY3JlYXRpb24sIGh3bmQ9JTA0eFxuIiwgaHduZCk7CisgICAgICBkcHJpbnRmX2luZm8odXBkb3duLCAiUHJvZ3Jlc3MgQ3RybCBjcmVhdGlvbiwgaHduZD0lMDR4XG4iLCBod25kKTsKICAgICAgIGJyZWFrOwogICAgIAogICAgIGNhc2UgV01fREVTVFJPWToKLSAgICAgIGRwcmludGZfdXBkb3duKHN0ZGRlYiwgIlByb2dyZXNzIEN0cmwgZGVzdHJ1Y3Rpb24sIGh3bmQ9JTA0eFxuIiwgaHduZCk7CisgICAgICBkcHJpbnRmX2luZm8odXBkb3duLCAiUHJvZ3Jlc3MgQ3RybCBkZXN0cnVjdGlvbiwgaHduZD0lMDR4XG4iLCBod25kKTsKICAgICAgIGJyZWFrOwogCiAgICAgY2FzZSBXTV9FUkFTRUJLR05EOgpkaWZmIC0tZ2l0IGEvY29udHJvbHMvc2Nyb2xsLmMgYi9jb250cm9scy9zY3JvbGwuYwppbmRleCBmMWY0NTEyLi45NTZmMzU5IDEwMDY0NAotLS0gYS9jb250cm9scy9zY3JvbGwuYworKysgYi9jb250cm9scy9zY3JvbGwuYwpAQCAtMTUsNyArMTUsNiBAQAogI2luY2x1ZGUgImdyYXBoaWNzLmgiCiAjaW5jbHVkZSAiaGVhcC5oIgogI2luY2x1ZGUgIndpbi5oIgotI2luY2x1ZGUgInN0ZGRlYnVnLmgiCiAjaW5jbHVkZSAiZGVidWcuaCIKIAogCkBAIC02MTYsNyArNjE1LDcgQEAKICAgICAgICAgICByZXR1cm47ICAvKiBTaG91bGQgbmV2ZXIgaGFwcGVuICovCiAgICAgfQogCi0gICAgZHByaW50Zl9zY3JvbGwoIHN0ZGRlYiwgIlNjcm9sbEJhciBFdmVudDogaHduZD0lMDR4IGJhcj0lZCBtc2c9JXggcHQ9JWQsJWQgaGl0PSVkXG4iLAorICAgIGRwcmludGZfaW5mbyhzY3JvbGwsICJTY3JvbGxCYXIgRXZlbnQ6IGh3bmQ9JTA0eCBiYXI9JWQgbXNnPSV4IHB0PSVkLCVkIGhpdD0lZFxuIiwKICAgICAgICAgICAgICAgICAgICAgaHduZCwgbkJhciwgbXNnLCBwdC54LCBwdC55LCBoaXR0ZXN0ICk7CiAKICAgICBzd2l0Y2godHJhY2tIaXRUZXN0KQpAQCAtNzk1LDcgKzc5NCw3IEBACiAgICAgICAgICAgICB9CiAgICAgICAgIH0KICAgICAgICAgaWYgKCFoVXBBcnJvdykgU0NST0xMX0xvYWRCaXRtYXBzKCk7Ci0gICAgICAgIGRwcmludGZfc2Nyb2xsKCBzdGRkZWIsICJTY3JvbGxCYXIgY3JlYXRpb24sIGh3bmQ9JTA0eFxuIiwgaHduZCApOworICAgICAgICBkcHJpbnRmX2luZm8oc2Nyb2xsLCAiU2Nyb2xsQmFyIGNyZWF0aW9uLCBod25kPSUwNHhcbiIsIGh3bmQgKTsKICAgICAgICAgcmV0dXJuIDA7CiAJCiAgICAgY2FzZSBXTV9MQlVUVE9ORE9XTjoKQEAgLTkxMCwxOSArOTA5LDE4IEBACiAgICAgU0NST0xMQkFSX0lORk8gKmluZm9QdHI7CiAgICAgVUlOVDMyIG5ld19mbGFnczsKICAgICBCT09MMzIgcmVwYWludF9hcnJvd3MgPSBGQUxTRTsKKyAgICBkYmdfZGVjbF9zdHIoc2Nyb2xsLCAyNTYpOwogCiAgICAgaWYgKCEoaW5mb1B0ciA9IFNDUk9MTF9HZXRTY3JvbGxJbmZvKGh3bmQsIG5CYXIpKSkgcmV0dXJuIDA7CiAgICAgaWYgKGluZm8tPmZNYXNrICYgfihTSUZfQUxMIHwgU0lGX0RJU0FCTEVOT1NDUk9MTCkpIHJldHVybiAwOwogICAgIGlmICgoaW5mby0+Y2JTaXplICE9IHNpemVvZigqaW5mbykpICYmCiAgICAgICAgIChpbmZvLT5jYlNpemUgIT0gc2l6ZW9mKCppbmZvKS1zaXplb2YoaW5mby0+blRyYWNrUG9zKSkpIHJldHVybiAwOwogCi0gICAgZHByaW50Zl9zY3JvbGwoIHN0ZGRlYiwgIlNldFNjcm9sbEluZm86IGh3bmQ9JTA0eCBiYXI9JWQiLCBod25kLCBuQmFyICk7Ci0KICAgICAvKiBTZXQgdGhlIHBhZ2Ugc2l6ZSAqLwogCiAgICAgaWYgKGluZm8tPmZNYXNrICYgU0lGX1BBR0UpCiAgICAgewotICAgICAgICBkcHJpbnRmX3Njcm9sbCggc3RkZGViLCAiIHBhZ2U9JWQiLCBpbmZvLT5uUGFnZSApOworICAgICAgICBkc3ByaW50ZihzY3JvbGwsICIgcGFnZT0lZCIsIGluZm8tPm5QYWdlICk7CiAgICAgICAgIGluZm9QdHItPlBhZ2UgPSBpbmZvLT5uUGFnZTsKICAgICB9CiAKQEAgLTkzMCw3ICs5MjgsNyBAQAogCiAgICAgaWYgKGluZm8tPmZNYXNrICYgU0lGX1BPUykKICAgICB7Ci0gICAgICAgIGRwcmludGZfc2Nyb2xsKCBzdGRkZWIsICIgcG9zPSVkIiwgaW5mby0+blBvcyApOworICAgICAgICBkc3ByaW50ZihzY3JvbGwsICIgcG9zPSVkIiwgaW5mby0+blBvcyApOwogICAgICAgICBpbmZvUHRyLT5DdXJWYWwgPSBpbmZvLT5uUG9zOwogICAgIH0KIApAQCAtOTM4LDcgKzkzNiw3IEBACiAKICAgICBpZiAoaW5mby0+Zk1hc2sgJiBTSUZfUkFOR0UpCiAgICAgewotICAgICAgICBkcHJpbnRmX3Njcm9sbCggc3RkZGViLCAiIG1pbj0lZCBtYXg9JWQiLCBpbmZvLT5uTWluLCBpbmZvLT5uTWF4ICk7CisgICAgICAgIGRzcHJpbnRmKHNjcm9sbCwgIiBtaW49JWQgbWF4PSVkIiwgaW5mby0+bk1pbiwgaW5mby0+bk1heCApOwogCiAgICAgICAgIC8qIEludmFsaWQgcmFuZ2UgLT4gcmFuZ2UgaXMgc2V0IHRvICgwLDApICovCiAgICAgICAgIGlmICgoaW5mby0+bk1pbiA+IGluZm8tPm5NYXgpIHx8CkBAIC05NTQsNiArOTUyLDkgQEAKICAgICAgICAgfQogICAgIH0KIAorICAgIGRwcmludGZfaW5mbyhzY3JvbGwsICJTZXRTY3JvbGxJbmZvOiBod25kPSUwNHggYmFyPSVkICVzXG4iLCAKKwkJICAgIGh3bmQsIG5CYXIsIGRiZ19zdHIoc2Nyb2xsKSk7CisKICAgICAvKiBNYWtlIHN1cmUgdGhlIHBhZ2Ugc2l6ZSBpcyB2YWxpZCAqLwogCiAgICAgaWYgKGluZm9QdHItPlBhZ2UgPCAwKSBpbmZvUHRyLT5QYWdlID0gMDsKQEAgLTk2Nyw3ICs5NjgsNyBAQAogICAgIGVsc2UgaWYgKGluZm9QdHItPkN1clZhbCA+IGluZm9QdHItPk1heFZhbCAtIE1BWCggaW5mb1B0ci0+UGFnZS0xLCAwICkpCiAgICAgICAgIGluZm9QdHItPkN1clZhbCA9IGluZm9QdHItPk1heFZhbCAtIE1BWCggaW5mb1B0ci0+UGFnZS0xLCAwICk7CiAKLSAgICBkcHJpbnRmX3Njcm9sbCggc3RkZGViLCAiXG4gICBuZXcgdmFsdWVzOiBwYWdlPSVkIHBvcz0lZCBtaW49JWQgbWF4PSVkXG4iLAorICAgIGRwcmludGZfaW5mbyhzY3JvbGwsICJcbiAgIG5ldyB2YWx1ZXM6IHBhZ2U9JWQgcG9zPSVkIG1pbj0lZCBtYXg9JWRcbiIsCiAgICAgICAgICAgICAgICAgICAgIGluZm9QdHItPlBhZ2UsIGluZm9QdHItPkN1clZhbCwKICAgICAgICAgICAgICAgICAgICAgaW5mb1B0ci0+TWluVmFsLCBpbmZvUHRyLT5NYXhWYWwgKTsKIApAQCAtMTIwOCw3ICsxMjA5LDcgQEAKICAgICBXTkQgKnduZFB0ciA9IFdJTl9GaW5kV25kUHRyKCBod25kICk7CiAKICAgICBpZiAoIXduZFB0cikgcmV0dXJuIEZBTFNFOwotICAgIGRwcmludGZfc2Nyb2xsKCBzdGRkZWIsICJTaG93U2Nyb2xsQmFyOiBod25kPSUwNHggYmFyPSVkIG9uPSVkXG4iLAorICAgIGRwcmludGZfaW5mbyhzY3JvbGwsICJTaG93U2Nyb2xsQmFyOiBod25kPSUwNHggYmFyPSVkIG9uPSVkXG4iLAogICAgICAgICAgICAgICAgICAgICBod25kLCBuQmFyLCBmU2hvdyApOwogCiAgICAgc3dpdGNoKG5CYXIpCkBAIC0xMjg0LDcgKzEyODUsNyBAQAogICAgIFNDUk9MTEJBUl9JTkZPICppbmZvUHRyOwogCiAgICAgaWYgKCEoaW5mb1B0ciA9IFNDUk9MTF9HZXRTY3JvbGxJbmZvKCBod25kLCBuQmFyICkpKSByZXR1cm4gRkFMU0U7Ci0gICAgZHByaW50Zl9zY3JvbGwoIHN0ZGRlYiwgIkVuYWJsZVNjcm9sbEJhcjogJTA0eCAlZCAlZFxuIiwKKyAgICBkcHJpbnRmX2luZm8oc2Nyb2xsLCAiRW5hYmxlU2Nyb2xsQmFyOiAlMDR4ICVkICVkXG4iLAogICAgICAgICAgICAgICAgICAgICBod25kLCBuQmFyLCBmbGFncyApOwogICAgIGZsYWdzICY9IEVTQl9ESVNBQkxFX0JPVEg7CiAgICAgaWYgKGluZm9QdHItPmZsYWdzID09IGZsYWdzKSByZXR1cm4gRkFMU0U7CmRpZmYgLS1naXQgYS9jb250cm9scy91aXRvb2xzLmMgYi9jb250cm9scy91aXRvb2xzLmMKaW5kZXggMTU3NzlhMS4uODg3MmExMSAxMDA2NDQKLS0tIGEvY29udHJvbHMvdWl0b29scy5jCisrKyBiL2NvbnRyb2xzL3VpdG9vbHMuYwpAQCAtNTc0LDcgKzU3NCw3IEBACiAgKi8KIEJPT0wzMiBXSU5BUEkgRHJhd0VkZ2UzMiggSERDMzIgaGRjLCBMUFJFQ1QzMiByYywgVUlOVDMyIGVkZ2UsIFVJTlQzMiBmbGFncyApCiB7Ci0gICAgZHByaW50Zl9ncmFwaGljcyggc3RkZGViLCAiRHJhd0VkZ2U6ICUwNHggJWQsJWQtJWQsJWQgJTA0eCAlMDR4XG4iLAorICAgIGRwcmludGZfaW5mbyhncmFwaGljcywgIkRyYXdFZGdlOiAlMDR4ICVkLCVkLSVkLCVkICUwNHggJTA0eFxuIiwKICAgICAgICAgICAgICAgICAgICAgICBoZGMsIHJjLT5sZWZ0LCByYy0+dG9wLCByYy0+cmlnaHQsIHJjLT5ib3R0b20sCiAgICAgICAgICAgICAgICAgICAgICAgZWRnZSwgZmxhZ3MgKTsKIApkaWZmIC0tZ2l0IGEvY29udHJvbHMvdXBkb3duLmMgYi9jb250cm9scy91cGRvd24uYwppbmRleCBjMGEyODQ4Li44YTgzMDJhIDEwMDY0NAotLS0gYS9jb250cm9scy91cGRvd24uYworKysgYi9jb250cm9scy91cGRvd24uYwpAQCAtMzUsOCArMzUsNiBAQAogI2luY2x1ZGUgImdyYXBoaWNzLmgiCiAjaW5jbHVkZSAiaGVhcC5oIgogI2luY2x1ZGUgIndpbi5oIgotI2luY2x1ZGUgInN0ZGRlYnVnLmgiCi0vKiNkZWZpbmUgIERFQlVHX1VQRE9XTiovCiAjaW5jbHVkZSAiZGVidWcuaCIKIAogLyogQ29udHJvbCBjb25maWd1cmF0aW9uIGNvbnN0YW50cyAqLwpAQCAtNjIsNyArNjAsNyBAQAogCiBzdGF0aWMgaW50IGFjY2VsSW5kZXggPSAtMTsKIAotI2RlZmluZSBVTktOT1dOX1BBUkFNKG1zZywgd1BhcmFtLCBsUGFyYW0pIGRwcmludGZfdXBkb3duKHN0ZGRlYiwgXAorI2RlZmluZSBVTktOT1dOX1BBUkFNKG1zZywgd1BhcmFtLCBsUGFyYW0pIGRwcmludGZfd2Fybih1cGRvd24sIFwKICAgICAgICAgIlVwRG93biBDdHJsOiBVbmtub3duIHBhcmFtZXRlcihzKSBmb3IgbWVzc2FnZSAiICNtc2cgICAgIFwKIAkiKCUwNHgpOiB3cD0lMDR4IGxwPSUwOGx4XG4iLCBtc2csIHdQYXJhbSwgbFBhcmFtKTsKIApAQCAtMjA5LDcgKzIwNyw3IEBACiAgICAgaWYoKnNyYyB8fCAhVVBET1dOX0luQm91bmRzKHduZFB0ciwgbmV3VmFsKSkgCiAgICAgICByZXR1cm4gRkFMU0U7CiAKLSAgICBkcHJpbnRmX3VwZG93bihzdGRkZWIsICJVcERvd24gQ3RybDogbmV3IHZhbHVlKCVkKSByZWFkIGZyb20gYnVkZHkgIgorICAgIGRwcmludGZfaW5mbyh1cGRvd24sICJVcERvd24gQ3RybDogbmV3IHZhbHVlKCVkKSByZWFkIGZyb20gYnVkZHkgIgogCQkgICAiKG9sZD0lZClcbiIsICBuZXdWYWwsIGluZm9QdHItPkN1clZhbCk7CiAgIH0KICAgCkBAIC0yMzQsNyArMjMyLDcgQEAKICAgaWYgKCFJc1dpbmRvdzMyKGluZm9QdHItPkJ1ZGR5KSkgCiAgICAgcmV0dXJuIEZBTFNFOwogCi0gIGRwcmludGZfdXBkb3duKHN0ZGRlYiwgIlVwRG93biBDdHJsOiBzZXQgbmV3IHZhbHVlKCVkKSB0byBidWRkeS5cbiIsCisgIGRwcmludGZfaW5mbyh1cGRvd24sICJVcERvd24gQ3RybDogc2V0IG5ldyB2YWx1ZSglZCkgdG8gYnVkZHkuXG4iLAogCQkgaW5mb1B0ci0+Q3VyVmFsKTsKIAogICAvKmlmIHRoZSBidWRkeSBpcyBhIGxpc3Qgd2luZG93LCB3ZSBtdXN0IHNldCBjdXJyIGluZGV4ICovCkBAIC0zODEsNyArMzc5LDcgQEAKICAgaW50IG9sZF92YWwgPSBpbmZvUHRyLT5DdXJWYWw7CiAgIE5NX1VQRE9XTiBuaTsKIAotICBkcHJpbnRmX3VwZG93bihzdGRkZWIsICJVcERvd24gQ3RybCBhY3Rpb246ICVzIGJ5ICVkXG4iLAorICBkcHJpbnRmX2luZm8odXBkb3duLCAiVXBEb3duIEN0cmwgYWN0aW9uOiAlcyBieSAlZFxuIiwKIAkJIGluY3IgPyAiaW5jIiA6ICJkZWMiLCBkZWx0YSk7CiAKICAgLyogY2hlY2sgaWYgd2UgY2FuIGRvIHRoZSBtb2RpZmljYXRpb24gZmlyc3QgKi8KQEAgLTU4MywxMyArNTgxLDEzIEBACiAgICAgICBpZih3bmRQdHItPmR3U3R5bGUgJiBVRFNfQVVUT0JVRERZKQogCVVQRE9XTl9TZXRCdWRkeSh3bmRQdHIsIEdldFdpbmRvdzMyKHduZFB0ci0+aHduZFNlbGYsIEdXX0hXTkRQUkVWKSk7CiAJCi0gICAgICBkcHJpbnRmX3VwZG93bihzdGRkZWIsICJVcERvd24gQ3RybCBjcmVhdGlvbiwgaHduZD0lMDR4XG4iLCBod25kKTsKKyAgICAgIGRwcmludGZfaW5mbyh1cGRvd24sICJVcERvd24gQ3RybCBjcmVhdGlvbiwgaHduZD0lMDR4XG4iLCBod25kKTsKICAgICAgIGJyZWFrOwogICAgIAogICAgIGNhc2UgV01fREVTVFJPWToKICAgICAgIGlmKGluZm9QdHItPkFjY2VsVmVjdCkKIAlmcmVlKGluZm9QdHItPkFjY2VsVmVjdCk7Ci0gICAgICBkcHJpbnRmX3VwZG93bihzdGRkZWIsICJVcERvd24gQ3RybCBkZXN0cnVjdGlvbiwgaHduZD0lMDR4XG4iLCBod25kKTsKKyAgICAgIGRwcmludGZfaW5mbyh1cGRvd24sICJVcERvd24gQ3RybCBkZXN0cnVjdGlvbiwgaHduZD0lMDR4XG4iLCBod25kKTsKICAgICAgIGJyZWFrOwogCQogICAgIGNhc2UgV01fRU5BQkxFOgpAQCAtNjc5LDcgKzY3Nyw3IEBACiAgICAgICByZXR1cm4gdGVtcDsKIAogICAgIGNhc2UgVURNX1NFVEFDQ0VMOgotICAgICAgZHByaW50Zl91cGRvd24oc3RkZGViLCAiVXBEb3duIEN0cmwgbmV3IGFjY2VsIGluZm8sIGh3bmQ9JTA0eFxuIiwgaHduZCk7CisgICAgICBkcHJpbnRmX2luZm8odXBkb3duLCAiVXBEb3duIEN0cmwgbmV3IGFjY2VsIGluZm8sIGh3bmQ9JTA0eFxuIiwgaHduZCk7CiAgICAgICBpZihpbmZvUHRyLT5BY2NlbFZlY3QpewogCWZyZWUoaW5mb1B0ci0+QWNjZWxWZWN0KTsKIAlpbmZvUHRyLT5BY2NlbENvdW50ID0gMDsKQEAgLTY5OSw3ICs2OTcsNyBAQAogICAgICAgcmV0dXJuIGluZm9QdHItPkJhc2U7CiAKICAgICBjYXNlIFVETV9TRVRCQVNFOgotICAgICAgZHByaW50Zl91cGRvd24oc3RkZGViLCAiVXBEb3duIEN0cmwgbmV3IGJhc2UoJWQpLCBod25kPSUwNHhcbiIsIAorICAgICAgZHByaW50Zl9pbmZvKHVwZG93biwgIlVwRG93biBDdHJsIG5ldyBiYXNlKCVkKSwgaHduZD0lMDR4XG4iLCAKIAkJICAgICB3UGFyYW0sIGh3bmQpOwogICAgICAgaWYgKCAhKHdQYXJhbT09MTAgfHwgd1BhcmFtPT0xNikgfHwgbFBhcmFtKQogCVVOS05PV05fUEFSQU0oVURNX1NFVEJBU0UsIHdQYXJhbSwgbFBhcmFtKTsKQEAgLTcyMSw3ICs3MTksNyBAQAogICAgICAgdGVtcCA9IGluZm9QdHItPkJ1ZGR5OwogICAgICAgaW5mb1B0ci0+QnVkZHkgPSB3UGFyYW07CiAgICAgICBVUERPV05fU2V0QnVkZHkod25kUHRyLCB3UGFyYW0pOwotICAgICAgZHByaW50Zl91cGRvd24oc3RkZGViLCAiVXBEb3duIEN0cmwgbmV3IGJ1ZGR5KCUwNHgpLCBod25kPSUwNHhcbiIsIAorICAgICAgZHByaW50Zl9pbmZvKHVwZG93biwgIlVwRG93biBDdHJsIG5ldyBidWRkeSglMDR4KSwgaHduZD0lMDR4XG4iLCAKIAkJICAgICBpbmZvUHRyLT5CdWRkeSwgaHduZCk7CiAgICAgICByZXR1cm4gdGVtcDsKIApAQCAtNzM1LDcgKzczMyw3IEBACiAgICAgICBpZiAod1BhcmFtIHx8IEhJV09SRChsUGFyYW0pKQogCVVOS05PV05fUEFSQU0oVURNX0dFVFBPUywgd1BhcmFtLCBsUGFyYW0pOwogICAgICAgdGVtcCA9IFNMT1dPUkQobFBhcmFtKTsKLSAgICAgIGRwcmludGZfdXBkb3duKHN0ZGRlYiwgIlVwRG93biBDdHJsIG5ldyB2YWx1ZSglZCksIGh3bmQ9JTA0eFxuIiwKKyAgICAgIGRwcmludGZfaW5mbyh1cGRvd24sICJVcERvd24gQ3RybCBuZXcgdmFsdWUoJWQpLCBod25kPSUwNHhcbiIsCiAJCSAgICAgdGVtcCwgaHduZCk7CiAgICAgICBpZighVVBET1dOX0luQm91bmRzKHduZFB0ciwgdGVtcCkpewogCWlmKHRlbXAgPCBpbmZvUHRyLT5NaW5WYWwpICAKQEAgLTc2MCw3ICs3NTgsNyBAQAogICAgICAgaW5mb1B0ci0+TWF4VmFsID0gU0xPV09SRChsUGFyYW0pOyAvKiBVRF9NSU5WQUwgPD0gTWF4IDw9IFVEX01BWFZBTCAqLwogICAgICAgaW5mb1B0ci0+TWluVmFsID0gU0hJV09SRChsUGFyYW0pOyAvKiBVRF9NSU5WQUwgPD0gTWluIDw9IFVEX01BWFZBTCAqLwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB8TWF4LU1pbnwgPD0gVURfTUFYVkFMICAgICAgICAqLwotICAgICAgZHByaW50Zl91cGRvd24oc3RkZGViLCAiVXBEb3duIEN0cmwgbmV3IHJhbmdlKCVkIHRvICVkKSwgaHduZD0lMDR4XG4iLCAKKyAgICAgIGRwcmludGZfaW5mbyh1cGRvd24sICJVcERvd24gQ3RybCBuZXcgcmFuZ2UoJWQgdG8gJWQpLCBod25kPSUwNHhcbiIsIAogCQkgICAgIGluZm9QdHItPk1pblZhbCwgaW5mb1B0ci0+TWF4VmFsLCBod25kKTsKICAgICAgIGJyZWFrOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAKZGlmZiAtLWdpdCBhL2RvY3VtZW50YXRpb24vTWFrZWZpbGUuaW4gYi9kb2N1bWVudGF0aW9uL01ha2VmaWxlLmluCmluZGV4IDYwMjYxNTguLmZkZjQ0YjEgMTAwNjQ0Ci0tLSBhL2RvY3VtZW50YXRpb24vTWFrZWZpbGUuaW4KKysrIGIvZG9jdW1lbnRhdGlvbi9NYWtlZmlsZS5pbgpAQCAtMTgsMTQgKzE4LDIxIEBACiAJd2luZS5pbmZvLTEgXAogCXdpbmUuaW5mby0yCiAKK0hUTUxGSUxFUyA9IFwKKwl3aW5lX3RvYy5odG1sIFwKKwl3aW5lLmh0bWwKKwogRFZJRklMRVMgPSB3aW5lLmR2aQogCi1hbGw6ICQoSU5GT0ZJTEVTKSAkKERWSUZJTEVTKQorCithbGw6ICQoSU5GT0ZJTEVTKSAkKERWSUZJTEVTKSAkKEhUTUxGSUxFUykKIAogaW5mbzogJChJTkZPRklMRVMpCiAKIGR2aTogJChEVklGSUxFUykKIAoraHRtbDogJChIVE1MRklMRVMpCisKIEBNQUtFX1JVTEVTQAogCiAkKElORk9GSUxFUyk6ICQoU09VUkNFUykKQEAgLTM0LDYgKzQxLDEwIEBACiAkKERWSUZJTEVTKTogJChTT1VSQ0VTKQogCXRleGkyZHZpICQoU1JDRElSKS93aW5lLnRleGluZm8KIAorJChIVE1MRklMRVMpOiAkKFNPVVJDRVMpCisJbWFrZWluZm8gLUUgd2luZS50ZXhpICQoU1JDRElSKS93aW5lLnRleGluZm8KKwl0ZXhpMmh0bWwgd2luZS50ZXhpIAorCiAkKElOQ0xVREVTKToKIAkkKFJNKSAkKElOQ0xVREVTKQogCWZvciBpIGluICQoSU5DTFVERVMpOyBkbyAkKExOX1MpICQoVE9QU1JDRElSKS8kJGkgJCRpIHx8IGV4aXQgMTsgZG9uZQpAQCAtNDgsNyArNTksOCBAQAogY2xlYW46OgogCSQoUk0pICQoSU5GT0ZJTEVTKSAkKERWSUZJTEVTKSAkKElOQ0xVREVTKQogCSQoUk0pIHdpbmUuYXV4IHdpbmUuY3Agd2luZS5jcHMgd2luZS5mbiB3aW5lLmZucyB3aW5lLmt5IHdpbmUubG9nIFwKLQkJd2luZS5wZyB3aW5lLnRvYyB3aW5lLnRwIHdpbmUudHBzIHdpbmUudnIgd2luZS52cnMKKwkJd2luZS5wZyB3aW5lLnRvYyB3aW5lLnRwIHdpbmUudHBzIHdpbmUudnIgd2luZS52cnMgXAorCQl3aW5lLnRleGkKIAkkKFJNKSAtciBtYW4zdwogCiAjIyMgRGVwZW5kZW5jaWVzOgpkaWZmIC0tZ2l0IGEvZG9jdW1lbnRhdGlvbi9jb25zb2xlIGIvZG9jdW1lbnRhdGlvbi9jb25zb2xlCmluZGV4IGE2MjNlMzUuLmY2YzcxYzYgMTAwNjQ0Ci0tLSBhL2RvY3VtZW50YXRpb24vY29uc29sZQorKysgYi9kb2N1bWVudGF0aW9uL2NvbnNvbGUKQEAgLTQsMTIgKzQsMTcgQEAKIAogQ29uc29sZXMgYXJlIGp1c3QgeHRlcm1zIGNyZWF0ZWQgd2l0aCB0aGUgLVN4eG4gc3dpdGNoLgogQSBwdHkgaXMgb3BlbmVkIGFuZCB0aGUgbWFzdGVyIGdvZXMgdG8gdGhlIHh0ZXJtIHNpZGUKLWFuZCB0aGUgc2xhdmUgaXMgaGVsZCBieSB0aGUgd2luZSBzaWRlLiAgVGhlIHNsYXZlIGZkCi1pcyBjaGFuZ2VkIGludG8gYSBIQU5ETEUzMiBhbmQgdGhpcyBIQU5ETEUzMiBpcyBzZXQKK2FuZCB0aGUgc2xhdmUgaXMgaGVsZCBieSB0aGUgd2luZSBzaWRlLiAgVGhlIGNvbnNvbGUKK2l0c2VsZiBpdCB0dXJuZWQgaW50byBhIGZldyBIQU5ETEUzMnMgYW5kIGlzIHNldCAKIHRvIHRoZSBTVERfKl9IQU5ETEVTLgogCi1Gb3Igbm93IHdyaXRpbmcvcmVhZGluZyB0byBhIGNvbnNvbGUganVzdCBjYWxscyBGaWxlV3JpdGUvRmlsZVJlYWQuCitJdCBpcyBwb3NzaWJsZSB0byB1c2UgdGhlIFdyaXRlRmlsZSBhbmQgUmVhZEZpbGUgY29tbWFuZHMKK3RvIHdyaXRlIHRvIGEgd2luMzIgY29uc29sZS4gIFRvIGFjY29tcGxpc2ggdGhpcywgYWxsIEszMk9CSnMgCit0aGF0IHN1cHBvcnQgSS9PIGhhdmUgYSByZWFkIGFuZCB3cml0ZSBmdW5jdGlvbiBwb2ludGVyLgorU28sIFdyaXRlRmlsZSBjYWxscyBLMzJPQkpfV3JpdGVGaWxlIHdoaWNoIGNhbGxzIHRoZSBLMzJPQkoncword3JpdGUgZnVuY3Rpb24gcG9pbnRlciwgd2hpY2ggdGhlbiBmaW5hbGx5IGNhbGxzIHdyaXRlLgogCitbdGhpcyBwYXJhZ3JhcGggaXMgbm93IG91dCBvZiBkYXRlXQogSWYgdGhlIGNvbW1hbmQgbGluZSBjb25zb2xlIGlzIHRvIGJlIGluaGVpcml0ZWQgb3IKIGEgcHJvY2VzcyBpbmhlcml0cyBpdCdzIHBhcmVudHMgY29uc29sZSAoLS0gY2FuIHRoYXQgaGFwcGVuPz8/KSwKIHRoZSBjb25zb2xlIGlzIGNyZWF0ZWQgYXQgcHJvY2VzcyBpbml0IHRpbWUgdmlhIFBST0NFU1NfSW5oZXJpdENvbnNvbGUuCkBAIC0yMywyMCArMjgsNTUgQEAKIGl0IGlzIHBvc3NpYmxlIHRvIGNyZWF0ZSBhIG5ldyBjb25zb2xlICh2aWEgQWxsb2NDb25zb2xlKS4KIAogCi1MaWtlIG1vc3QgazMyIG9iamVjdHMsIHdoZW4gdGhlIEZyZWVDb25zb2xlIGlzIGNhbGxlZCwgdGhlIAotcmVmIGNvdW50IGlzIGRlY3JlbWVudGVkIGFuZCB0aGUgY29uc29sZSBpcyBmcmVlZCB3aGVuCi1pdCByZWFjaGVzIHplcm8uICBUaGUgZnJlZSBraWxscyB0aGUgeHRlcm0gYW5kIGNsb3NlcwotdGhlIG1hc3Rlci9zbGF2ZSBmZHMuCitXaGVuIEZyZWVDb25zb2xlIGlzIGNhbGxlZCwgYWxsIGhhbmRsZXMgdGhhdCB0aGUgcHJvY2VzcyBoYXMKK29wZW4gdG8gdGhlIGNvbnNvbGUgYXJlIGNsb3NlZC4gIExpa2UgbW9zdCBrMzJvYmpzLCBpZiB0aGUgCitjb25zb2xlJ3MgcmVmY291bnQgcmVhY2hlcyB6ZXJvLCBpdHMgazMyb2JqIGRlc3Ryb3kgZnVuY3Rpb24KK2lzIGNhbGxlZC4gIFRoZSBkZXN0cm95IGtpbGxzIHRoZSB4dGVybSBpZiBvbmUgd2FzIG9wZW4uCiAKIEFsc28gbGlrZSBtb3N0IGszMiBvYmplY3RzLCB3ZSBhc3N1bWUgdGhhdCAoSzMyT0JKKSBoZWFkZXIgaXMgdGhlCiBmaXJzdCBmaWVsZCBzbyB0aGUgY2FzdGluZyAoZnJvbSBLMzJPQkogKnRvIENPTlNPTEUgKikKIHdvcmtzIGNvcnJlY3RseS4KIAorRnJlZUNvbnNvbGUgaXMgY2FsbGVkIG9uIHByb2Nlc3MgZXhpdCAoaW4gRXhpdFByb2Nlc3MpIGlmIAorcGRiLT5jb25zb2xlIGlzIG5vdCBOVUxMLgorCiBCVUdTCiAtLS0tCitDb25zb2xlIHByb2Nlc3NlcyBkbyBub3QgaW5oZXJpdCB0aGVpciBwYXJlbnQncyBoYW5kbGVzLiAgSSB0aGluawordGhlcmUgbmVlZHMgdG8gYmUgdHdvIGNhc2VzLCBvbmUgd2hlcmUgdGhleSBoYXZlIHRvIGluaGVyaXQKK3RoZSBzdGRpbi9zdGRvdXQvc3RkZXJyIGZyb20gdW5peCwgYW5kIG9uZSB3aGVyZSB0aGV5IGhhdmUgdG8KK2luaGVyaXQgZnJvbSBhbm90aGVyIHdpbmRvd3MgYXBwLgogCi1BIGV4aXQgaGFuZGxlciBuZWVkcyB0byBiZSBhZGRlZC4gIElmIHRoZSBwcm9jZXNzIGV4aXRzCi13aXRob3V0IGNhbGxpbmcgRnJlZUNvbnNvbGUsIHRoZSB4dGVybSBjb250aW51ZXMgb24uLi4KLUJ1dC4uLiB0aGVyZSBzaG91bGQgcHJvYmFibHkgYmUgYSBnZW5lcmljIGV4aXQgaGFuZGxlciBpbgotd2luZSBmb3IgdGhpcyBraW5kIG9mIHN0dWZmIChLMzJPQkpzKS4KIAorPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCitleHBlcmltZW50YXRpb24gd2l0aCBOVDQgeWllbGRzIHRoYXQ6CisKK1dyaXRlRmlsZQorLS0tLS0tLS0tCisJbyBkb2VzIG5vdCB0cnVuY2F0ZSBmaWxlIG9uIDAgbGVuZ3RoIHdyaXRlCisJbyAwIGxlbmd0aCB3cml0ZSBvciBlcnJvciBvbiB3cml0ZSBjaGFuZ2VzIG51bWNoYXJzd3JpdHRlbiB0byAwCisJbyAwIGxlbmd0aCB3cml0ZSByZXR1cm5zIFRSVUUKKwlvIHdvcmtzIHdpdGggY29uc29sZSBoYW5kbGVzCisKK19sd3JpdGUKKy0tLS0tLS0KKwlvIGRvZXMgdHJ1bmNhdGUvZXhwYW5kIGZpbGUgYXQgY3VycmVudCBwb3NpdGlvbiBvbiAwIGxlbmd0aCB3cml0ZQorCW8gcmV0dXJucyAwIG9uIGEgemVybyBsZW5ndGggd3JpdGUKKwlvIHdvcmtzIHdpdGggY29uc29sZSBoYW5kbGVzICh0eXBlY2FzdGVkKQorCitXcml0ZUNvbnNvbGUKKy0tLS0tLS0tLS0tLQorCW8gZXhwZWN0cyBvbmx5IGNvbnNvbGUgaGFuZGxlcworCisKK1NldEZpbGVQb2ludGVyCistLS0tLS0tLS0tLS0tLQorCW8gcmV0dXJucyAtMSAoZXJyIDYpIHdoZW4gdXNlZCB3aXRoIGEgY29uc29sZSBoYW5kbGUKKworCitGcmVlQ29uc29sZQorLS0tLS0tLS0tLS0KKwlvIGV2ZW4gd2hlbiBhbGwgdGhlIGhhbmRsZXMgdG8gaXQgYXJlIGZyZWVkLCB0aGUgd2luMzIgY29uc29sZQorCSAgc3RheXMgdmlzaWJsZSwgdGhlIG9ubHkgd2F5IEkgY291bGQgZmluZCB0byBmcmVlIGl0CisJICB3YXMgdmlhIHRoZSBGcmVlQ29uc29sZQpkaWZmIC0tZ2l0IGEvZG9jdW1lbnRhdGlvbi9kZWJ1Zy1tc2dzIGIvZG9jdW1lbnRhdGlvbi9kZWJ1Zy1tc2dzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjM5NTNhNjgKLS0tIC9kZXYvbnVsbAorKysgYi9kb2N1bWVudGF0aW9uL2RlYnVnLW1zZ3MKQEAgLTAsMCArMSwzNTEgQEAKK05vdGU6IHRoZSBkZWJ1Z2dpbmcgaW50ZXJmYWNlIGlzIHVuZGVyIGRldmVsb3BtZW50LiBQbGVhc2UgZG8gbm90IG1ha2UKKyAgICAgIGNoYW5nZXMgdG8gaXQgeWV0IGFzIEkgd2lsbCBkbyBtYWpvciBjaGFuZ2VzIGluIHRoZSBuZXh0IGZldyB3ZWVrcy4KKyAgICAgIFRvIG1ha2UgbXkgbGlmZSBlYXNpZXIsIFBMRUFTRSBmb2xsb3cgdGhlIGd1aWRlbGluZXMgZGVzY3JpYmVkIGluCisgICAgICB0aGlzIGRvY3VtZW50LiBJZiB5b3UgaGF2ZSBzb21lIGlkZWFzIHRoYXQgeW91IHdvdWxkIGxpa2UgdG8KKyAgICAgIGluY29ycG9yYXRlLCBwbGVhc2UgY29udGFjdCBtZSBmaXJzdC4KKyAgICAgIFBsZWFzZSByZWFkIHRoZSBkb2N1bWVudCBiZWZvcmUgd3JpdGluZyBuZXcgY29kZS4KKyAgICAgIEFsc28sIERPIE5PVCBVU0UgZnByaW50ZiAob3IgcHJpbnRmKSB0byBvdXRwdXQgdGhpbmdzLiBBbGwgdGhlc2UKKyAgICAgIHdpbGwgaGF2ZSB0byBiZSB0cmFuc2xhdGVkIHRvIGRwcmludGZfIGNhbGxzIGFuZCB0aGVyZSBhcmUgYWxyZWFkeQorICAgICAgYWJvdXQgMzAwMCBvZiB0aGVtISBBbHNvLCBpbnN0ZWFkIG9mIHdyaXRpbmcgRklYTUVzIGluIHRoZSBzb3VyY2UsCisgICAgICBvdXRwdXQgYSBkcHJpbnRmX2ZpeG1lIG1lc3NhZ2UuIEJ1dCByZWFkIG9uLi4uCisyNSBGZWIgMTk5OCwgRGltaXRyaWUgTy4gUGF1biA8ZGltaUBjcy50b3JvbnRvLmVkdT4KKworCitEZWJ1Z2dpbmcgY2xhc3NlcworLS0tLS0tLS0tLS0tLS0tLS0KKworVGhlIGRlYnVnZ2luZyBtZXNzYWdlcyBhcmUgZGl2aWRlZCBpbnRvIDQgY2xhc3NlczoKKworZml4bWUgLS0gTWVzc2FnZXMgaW4gdGhpcyBjbGFzcyByZWxhdGUgdG8gYmVoYXZpb3Igb2YgV2luZSB0aGF0IGRvZXMKKyAgICAgICAgIG5vdCBjb3JyZXNwb25kIHRvIHN0YW5kYXJkIFdpbmRvd3MgYmVoYXZpb3IgYW5kIHRoYXQgc2hvdWxkCisgICAgICAgICBiZSBmaXhlZC4gCisgICAgICAgICBFeGFtcGxlczogc3R1YnMsIHNlbWktaW1wbGVtZW50ZWQgZmVhdHVyZXMsIGV0Yy4KKworZXJyICAgLS0gTWVzc2FnZXMgaW4gdGhpcyBjbGFzcyByZWxhdGUgdG8gc2VyaW91cyBlcnJvcnMgaW4gV2luZS4KKyAgICAgICAgIFRoaXMgc29ydCBvZiBtZXNzYWdlcyBhcmUgY2xvc2UgdG8gYXNzZXJ0cyAtLSB0aGF0IGlzLAorICAgICAgICAgeW91IHNob3VsZCBvdXRwdXQgYSAnZXJyJyBtZXNzYWdlIHdoZW4gdGhlIGNvZGUgZGV0ZWN0cyBhCisgICAgICAgICBjb25kaXRpb24gd2hpY2ggc2hvdWxkIG5vdCBoYXBwZW4uCisJIEV4YW1wbGVzOiB1bmV4cGVjdGVkIGNoYW5nZSBpbiBpbnRlcm5hbCBzdGF0ZSwgZXRjLgorCit3YXJuICAtLSBUaGlzIGFyZSB3YXJuaW5nIG1lc3NhZ2VzLiBZb3Ugc2hvdWxkIHJlcG9ydCBhIHdhcm5pbmcgd2hlbgorICAgICAgICAgc29tZXRoaW5nIHVud2FudGVkIGhhcHBlbiBidXQgdGhlIGZ1bmN0aW9uIGJlaGF2ZXMgcHJvcGVybHkuCisgICAgICAgICBUaGF0IGlzLCBvdXRwdXQgYSB3YXJuaW5nIHdoZW4geW91IGVuY291bnRlciBzb21ldGhpbmcKKyAgICAgICAgIHVuZXhwZWN0ZWQgKGV4OiBjb3VsZCBub3Qgb3BlbiBhIGZpbGUpIGJ1dCB0aGUgZnVuY3Rpb24gZGVhbHMKKyAgICAgICAgIGNvcnJlY3RseSB3aXRoIHRoZSBzaXR1YXRpb24gKHRoYXQgaXMsIGFjY29yZGluZyB0byB0aGUgZG9jcykuCisgICAgICAgICBJZiB5b3UgZG8gbm90IGRlYWwgY29ycmVjdGx5IHdpdGggaXQsIG91dHB1dCBhIGZpeG1lLgorCSBFeGFtcGxlczogZmFpbCB0byBhY2Nlc3MgYSByZXNvdXJjZSByZXF1aXJlZCBieSB0aGUgYXBwLCBldGMuCisKK2luZm8gIC0tIFRoaXMgYXJlIGRldGFpbGVkIGRlYnVnZ2luZyBtZXNzYWdlcyB0aGF0IGFyZSBtYWlubHkgdXNlZnVsIAorICAgICAgICAgdG8gZGVidWcgYSBjb21wb25lbnQuIFRoaXMgYXJlIHVzdWFsbHkgdHVybmVkIG9mZi4KKyAgICAgICAgIEV4YW1wbGVzOiBldmVyeXRoaW5nIGVsc2UgdGhhdCBkb2VzIG5vdCBmYWxsIGluIG9uZSBvZiB0aGUKKyAgICAgICAgICAgICAgICAgICBhYm92ZSBtZW50aW9uZWQgY2F0ZWdvcmllcyBhbmQgdGhlIHVzZXIgZG9lcyBub3QKKyAgICAgICAgICAgICAgICAgICBuZWVkIHRvIGtub3cgYWJvdXQgaXQuIFRoaXMgc29ydCBvZiBtZXNzYWdlcyBzaW1wbHkKKyAgICAgICAgICAgICAgICAgICBvdXRwdXRzIHNvbWV0aGluZyBhYm91dCB0aGUgc3RhdGUgb2Ygc29tZSBjb21wb25lbnQgCisgICAgICAgICAgICAgICAgICAgdGhhdCBpcyBvZiBpbnRlcmVzdCBtYWlubHkgdG8gdGhlIGRldmVsb3BlciBvZiB0aGF0CisgICAgICAgICAgICAgICAgICAgY29tcG9uZW50LgorICAgICAgICAgICAgCitXZSB3aWxsIHJlZmVyIHRvIGEgZ2VuZXJpYyBjbGFzcyBhcyB5eXkuCisKK1RoZSB1c2VyIGhhcyB0aGUgY2FwYWJpbGl0eSB0byB0dXJuIG9uIG9yIG9mZiBtZXNzYWdlcyBpbiBhIHBhcnRpY3VsYXIKK2NsYXNzLiBZb3UgY2FuIGV4cGVjdCB0aGUgZm9sbG93aW5nIHBhdHRlcnMgb2YgdXNhZ2UgKGJ1dCBub3RlIHRoYXQgCithbnkgY29tYmluYXRpb24gaXMgcG9zc2libGUpOgorICAtLSB3aGVuIHlvdSBkZWJ1ZyBhIGNvbXBvbmVudCwgYWxsIGNsYXNzZXMgKGluZm8sd2FybixlcnIsZml4bWUpCisgICAgIHdpbGwgYmUgZW5hYmxlZC4KKyAgLS0gZHVyaW5nIHRoZSBwcmUtYWxwaGEgKG1heWJlIGFscGhhKSBzdGFnZSBvZiBXaW5lLCBtb3N0IGxpa2VseQorICAgICB0aGUgaW5mbyBjbGFzcyB3aWxsIGJlIGRpc2FibGVkIGJ5IGRlZmF1bHQsIGJ1dCBhbGwgb3RoZXJzCisgICAgICh3YXJuLGVycixmaXhtZSkgd2lsbCBiZSBlbmFibGVkIGJ5IGRlZmF1bHQuCisgIC0tIHdoZW4gV2luZSB3aWxsIGJlY29tZSBzdGFibGUsIG1vc3QgbGlrZWx5IHRoZSBpbmZvIGFuZCB3YXJuCisgICAgIGNsYXNzZXMgd2lsbCBiZSBkaXNhYmxlZCBieSBkZWZhdWx0LCBidXQgYWxsIGVyciBhbmQgZml4bWUgCisgICAgIHdpbGwgYmUgZW5hYmxlZCBieSBkZWZhdWx0LgorICAtLSBpbiBzb21lIGluc3RhbGxhdGlvbnMgdGhhdCB3YW50IHRoZSBzbWFsbGVzdCBmb290cHJpbnQKKyAgICAgYW5kIHdoZXJlIHRoZSBkZWJ1ZyBpbmZvcm1hdGlvbiBpcyBvZiBubyBpbnRlcmVzdCwgCisgICAgIGFsbCBjbGFzc2VzIG1heSBiZSBkaXNhYmxlZCBieSBkZWZhdWx0LgorCitPZiBjb3Vyc2UsIHRoZSB1c2VyIHdpbGwgaGF2ZSB0aGUgcnVudGltZSBhYmlsaXR5IHRvIG92ZXJyaWRlIHRoZXNlCitkZWZhdWx0cy4gSG93ZXZlciwgdGhpcyBhYmlsaXR5IG1heSBiZSB0dXJuZWQgb2ZmIGFuZCBjZXJ0YWluIGNsYXNzZXMKK29mIG1lc3NhZ2VzIG1heSBiZSBjb21wbGV0ZWx5IGRpc2FibGVkIGF0IGNvbXBpbGUgdGltZSB0byByZWR1Y2UgdGhlIAorc2l6ZSBvZiBXaW5lLgorCitEZWJ1Z2dpbmcgY2hhbm5lbHMKKy0tLS0tLS0tLS0tLS0tLS0tLQorCitBbHNvLCB3ZSBkaXZpZGUgdGhlIGRlYnVnZ2luZyBtZXNzYWdlcyBwZXIgY29tcG9uZW50LiBFYWNoIGNvbXBvbmVudAoraXMgYXNzaWduZWQgYSBkZWJ1Z2dpbmcgY2hhbm5lbCAob3IgdHlwZSkuIFRoZSBpZGVudGlmaWVyIG9mIHRoZQorY2hhbm5lbCBtdXN0IGJlIGEgdmFsaWQgQyBpZGVudGlmaWVyIGJ1dCBub3RlIHRoYXQgaXQgbWF5IGFsc28gYmUgYQorcmVzZXJ2ZSB3b3JkIGxpa2UgaW50IG9yIHN0YXRpYy4KKworRXhhbXBsZXMgb2YgZGVidWdnaW5nIGNoYW5uZWxzL3R5cGVzOgorcmVnLCB1cGRvd24sIHN0cmluZworCitXZSB3aWxsIHJlZmVyIHRvIGEgZ2VuZXJpYyBjaGFubmVsIGFzIHh4eC4KKworTm90ZTogZm9yIHRob3NlIHdobyBrbm93IHRoZSBvbGQgaW50ZXJmYWNlLCB0aGUgY2hhbm5lbC90eXBlIGlzCisgICAgICB3aGF0IGZvbGxvd2VkIHRoZSBfIGluIHRoZSBkcHJpbnRmX3h4eCBzdGF0ZW1lbnRzLgorICAgICAgRm9yIGV4YW1wbGUsIHRvIG91dHB1dCBhIG1lc3NhZ2Ugb24gdGhlIGRlYnVnZ2luZyBjaGFubmVsCisgICAgICByZWcgaW4gdGhlIG9sZCBpbnRlcmZhY2UgeW91IHdvdWxkIGhhdmUgdG8gd3JpdGU6CisKKyAgICAgIGRwcmludGZfcmVnKHN0ZGRlYiwgIkNvdWxkIG5vdCBhY2Nlc3Mga2V5IVxuIik7CisKKyAgICAgIEluIHRoZSBuZXcgaW50ZXJmYWNlLCB3ZSBkcm9wIHRoZSBzdGRkZWIgYXMgaXQgaXMgaW1wbGljaXQuCisgICAgICBIb3dldmVyLCB3ZSBhZGQgYW4gb3J0aG9nb25hbCBwaWVjZSBvZiBpbmZvcm1hdGlvbiB0byB0aGUKKyAgICAgIG1lc3NhZ2U6IGl0cyBjbGFzcy4gVGhpcyBpcyB2ZXJ5IGltcG9ydGFudCBhcyBpdCB3aWxsIGFsbG93CisgICAgICB1cyB0byBzZWxlY3RpdmVseSB0dXJuIG9uIG9yIG9mZiBjZXJ0YWluIG1lc3NhZ2VzIGJhc2VkIG9uCisgICAgICB0eXBlIG9mIGluZm9ybWF0aW9uIHRoZXkgcmVwb3J0LiBGb3IgdGhpcyByZWFzb24gaXQgaXMgVkVSWQorICAgICAgaW1wb3J0YW50IHRvIGNob29zZSB0aGUgcmlnaHQgY2xhc3MgZm9yIHRoZSBtZXNzYWdlLiAKKyAgICAgIEFueWhvdywgc3VwcG9zZSB3ZSBmaWd1cmVkIHRoYXQgdGhpcyBtZXNzYWdlIHNob3VsZCBiZWxvbmcKKyAgICAgIGluIHRoZSB3YXJuIGNsYXNzLCBzbyBpbiB0aGUgbmV3IGludGVyZmFjZSwgeW91IHdyaXRlOgorCisgICAgICBkcHJpbnRmX3dhcm4ocmVnLCAiQ291bGQgbm90IGFjY2VzcyBrZXkhXG4iKTsKKworLS0tCisKK0hvdyB0byB1c2UgaXQKKy0tLS0tLS0tLS0tLS0KKworU28sIHRvIG91dHB1dCBhIG1lc3NhZ2UgKGNsYXNzIHl5eSkgb24gY2hhbm5lbCB4eHgsIGRvOgorCisjaW5jbHVkZSAiZGVidWcuaCIKKworLi4uLgorCitkcHJpbnRmX3l5eSh4eHgsICI8bWVzc2FnZT4iLCAuLi4pOworCisKK1NvbWUgZXhhbXBsZXMgZnJvbSB0aGUgY29kZToKKworI2luY2x1ZGUgImRlYnVnLmgiCisKKy4uLgorCisgIGRwcmludGZfaW5mbyhjcnRkbGwsCisJICAgICAgICJDUlRETExfc2V0YnVmKGZpbGUgJXAgYnVmICVwKVxuIiwKKwkgICAgICAgZmlsZSwgYnVmKTsKKworICBkcHJpbnRmX3dhcm4oYXNwaSwgIkVycm9yIG9wZW5pbmcgZGV2aWNlIGVycm5vPSVkXG4iLCBzYXZlX2Vycm9yKTsKKworCitJZiB5b3UgbmVlZCB0byBkZWNsYXJlIGEgbmV3IGRlYnVnZ2luZyBjaGFubmVsLCBkbzoKKyV0b29scy9tYWtlX2RlYnVnCitpbiB0aGUgcm9vdCBkaXJlY3Rvcnkgb2YgV2luZS4KKworTm90ZSB0aGF0IHRoaXMgd2lsbCByZXN1bHQgaW4gYWxtb3N0IGNvbXBsZXRlIHJlY29tcGlsYXRpb24gb2YgV2luZS4KKworTm90ZXM6CisgICAxLiBQbGVhc2UgcGF5IGF0dGVudGlvbiB0byB3aGljaCBjbGFzcyB5b3UgYXNzaWduIHRoZSBtZXNzYWdlLgorICAgICAgSXQgaXMgdmVyeSwgVmVyeSwgVkVSWSBpbXBvcnRhbnQgdG8gZ2V0IHRoZSBjbGFzcyByaWdodC4KKyAgICAgIFRoZXJlIGFyZSBvbmx5IDQgY2xhc3Nlcywgc28gaXQgaXMgbm90IGhhcmQuIFRoZSByZWFzb24KKyAgICAgIGl0IGlzIGltcG9ydGFudCB0byBnZXQgaXQgcmlnaHQgaXMgdGhhdCB0b28gbXVjaCBpbmZvcm1hdGlvbgorICAgICAgaXMgbm8gaW5mb3JtYXRpb24uIEZvciBleGFtcGxlLCBpZiB5b3UgcHV0IHRoaW5ncyBpbnRvIHRoZSAKKyAgICAgIHdhcm4gY2xhc3MgdGhhdCBzaG91bGQgcmVhbGx5IGJlIGluIHRoZSBpbmZvIGNsYXNzLCB0aGUgCisgICAgICBvdXRwdXQgd2lsbCBiZSB0b28gYmlnIGFuZCB0aGlzIHdpbGwgZm9yY2UgdGhlIHVzZXIgdG8gCisgICAgICB0dXJuIG9mIHdhcm5pbmdzLiBCdXQgdGhpcyB3YXkgaGUgd2lsbCBmYWlsIHRvIHNlZSB0aGUgaW1wb3J0YW50CisgICAgICBvbmVzLiBBbHNvLCBpZiB5b3UgcHV0IHdhcm5pbmdzIGludG8gdGhlIGluZm8gY2xhc3MgbGV0cyBzYXksCisgICAgICBoZSB3aWxsIG1vc3QgbGlrZWx5IG1pc3MgdGhvc2UgYmVjYXVzZSB1c3VhbGx5IHRoZSBpbmZvIGNsYXNzCisgICAgICBpcyB0dXJuZWQgb2ZmLiBBIHNpbWlsYXIgYXJndW1lbnQgY2FuIGJlIG1hZGUgaWYgeW91IG1peCBhbnkKKyAgICAgIG90aGVyIHR3byBjbGFzc2VzLgorICAgMi4gQUxMIExJTkVTIE1VU1QgRU5EIFdJVEggQSBORVdMSU5FISEhIElmIHlvdSBjYW4gTk9UIG91dHB1dAorICAgICAgZXZlcnl0aGluZyB0aGF0IHlvdSB3YW50IGluIHRoZSBsaW5lIHdpdGggb25seSBvbmUgZHByaW50Zl94eHgKKyAgICAgIHN0YXRlbWVudCwgdGhlbiB5b3UgbmVlZCB0byBidWlsZCB0aGUgc3RyaW5nIGluIG1lbW9yeS4KKyAgICAgIFBsZWFzZSByZWFkIHRoZSBzZWN0aW9uIGJlbG93ICJJbi1tZW1vcnkgbWVzc2FnZXMiIG9uIHRoZQorICAgICAgcHJlZmVycmVkIHdheSB0byBkbyBpdC4gUExFQVNFIFVTRSBUSEFUIElOVEVSRkFDRSBUTyBCVUlMRAorICAgICAgTUVTU0FHRVMgSU4gTUVNT1JZLiBUaGUgcmVhc29uIGlzIHRoYXQgd2UgYXJlIG5vdCBzdXJlIHRoYXQKKyAgICAgIHdlIGxpa2UgaXQgYW5kIGhhdmluZyBldmVyeXRoaW5nIGluIG9uZSBmb3JtYXQgd2lsbCBmYWNpbGl0YXRlCisgICAgICB0aGUgKGF1dG9tYXRpYykgdHJhbnNsYXRpb24gdG8gYSBiZXR0ZXIgaW50ZXJmYWNlLgorCisKKworQXJlIHdlIGRlYnVnZ2luZz8KKy0tLS0tLS0tLS0tLS0tLS0tCisKK1RvIHRlc3Qgd2hldGhlciB0aGUgZGVidWdnaW5nIG91dHB1dCBvZiBjbGFzcyB5eXkgb24gY2hhbm5lbCB4eHggaXMKK2VuYWJsZWQsIGRvOgorCitkZWJ1Z2dpbmdfeXl5KHh4eCkKKworRXhhbXBsZXM6CisKK2lmKGRlYnVnZ2luZ19pbmZvKGF0b20pKXsKKyAgLi4uYmxhaC4uLgorfQorCisKKworSW4tbWVtb3J5IG1lc3NhZ2VzCistLS0tLS0tLS0tLS0tLS0tLS0KKworSWYgeW91IE5FRUQgdG8gYnVpbGQgdGhlIG1lc3NhZ2UgZnJvbSBtdWx0aXBsZSBjYWxscywgeW91IG5lZWQgdG8gCitidWlsZCBpdCBpbiBtZW1vcnkuIFRvIGRvIHRoYXQsIHlvdSBzaG91bGQgdXNlIHRoZSBmb2xsb3dpbmcKK2ludGVyZmFjZToKKworIC0gZGVjbGFyZSBhIHN0cmluZyAod2hlcmUgeW91IGFyZSBhbGxvd2VkIHRvIGRlY2xhcmUgQyB2YXJpYWJsZXMpCisgICBhcyBmb2xsb3dzOgorICAgZGJnX2RlY2xfc3RyKG5hbWUsIGxlbik7CisgICB3aGVyZSBuYW1lICBpcyB0aGUgbmFtZSBvZiB0aGUgc3RyaW5nICh5b3Ugc2hvdWxkIHVzZSB0aGUgY2hhbm5lbAorICAgbmFtZSBvbiB3aGljaCB5b3UgYXJlIGdvaW5nIHRvIG91dHB1dCBpdCkKKworIC0gcHJpbnQgaW4gaXQgd2l0aDoKKyAgIGRzcHJpbnRmKG5hbWUsICI8bWVzc2FnZT4iLCAuLi4pOworICAgd2hpY2ggaXMganVzdCBsaWtlIGEgc3ByaW50ZiBmdW5jdGlvbiBidXQgaW5zdGVhZCBvZiBhIEMgc3RyaW5nIGFzCisgICBmaXJzdCBwYXJhbWV0ZXIgaXQgdGFrZXMgdGhlIG5hbWUgeW91IHVzZWQgdG8gZGVjbGFyZSBpdC4KKworIC0gb2J0YWluIGEgcG9pbnRlciB0byB0aGUgc3RyaW5nIHdpdGg6CisgICBkYmdfc3RyKG5hbWUpCisKKyAtIHJlc2V0IHRoZSBzdHJpbmcgKGlmIHlvdSB3YW50IHRvIHJldXNlIGl0IHdpdGgpOgorICAgZGJnX3Jlc2V0X3N0cihuYW1lKTsKKworRXhhbXBsZSAobW9kaWZpZWQgZnJvbSB0aGUgY29kZSk6CisKK3ZvaWQgc29tZV9mdW5jKHRhYnMpCit7CisgIElOVDMyIGk7CisgIExQSU5UMTYgcCA9IChMUElOVDE2KXRhYnM7CisgIGRiZ19kZWNsX3N0cihsaXN0Ym94LCAyNTYpOyAgICAgICAgICAgICAgICAgICAvKiBkZWNsYXJlIHRoZSBzdHJpbmcgKi8KKworICBmb3IgKGkgPSAwOyBpIDwgZGVzY3ItPm5iX3RhYnM7IGkrKykgeworICAgIGRlc2NyLT50YWJzW2ldID0gKnArKzw8MTsgCisgICAgaWYoZGVidWdnaW5nX2luZm8obGlzdGJveCkpICAgICAgICAgICAgICAgICAgLyogd3JpdGUgaW4gaXQgb25seSBpZgorICAgICAgZHNwcmludGYobGlzdGJveCwgIiVoZCAiLCBkZXNjci0+dGFic1tpXSk7IC8qIHdlIGFyZSBnb25uYSBvdXRwdXQgaXQgKi8KKyAgfQorICBkcHJpbnRmX2luZm8obGlzdGJveCwgIkxpc3Rib3ggJTA0eDogc2V0dGFic3RvcHMgJXNcbiIsIAorCSAgICAgICB3bmQtPmh3bmRTZWxmLCBkYmdfc3RyKGxpc3Rib3gpKTsgLyogb3V0cHV0IHRoZSB3aG9sZSB0aGluZyAqLworfQorCitJZiB5b3UgbmVlZCB0byB1c2UgaXQgdHdvIHRpbWVzIGluIHRoZSBzYW1lIHNjb3BlIGRvIGxpa2UgdGhpczoKKwordm9pZCBzb21lX2Z1bmModGFicykKK3sKKyAgSU5UMzIgaTsKKyAgTFBJTlQxNiBwID0gKExQSU5UMTYpdGFiczsKKyAgZGJnX2RlY2xfc3RyKGxpc3Rib3gsIDI1Nik7ICAgICAgICAgICAgICAgICAgIC8qIGRlY2xhcmUgdGhlIHN0cmluZyAgICAgICovCisKKyAgZm9yIChpID0gMDsgaSA8IGRlc2NyLT5uYl90YWJzOyBpKyspIHsKKyAgICBkZXNjci0+dGFic1tpXSA9ICpwKys8PDE7ICAKKyAgICBpZihkZWJ1Z2dpbmdfaW5mbyhsaXN0Ym94KSkgICAgICAgICAgICAgICAgICAvKiB3cml0ZSBpbiBpdCBvbmx5IGlmCisgICAgICBkc3ByaW50ZihsaXN0Ym94LCAiJWhkICIsIGRlc2NyLT50YWJzW2ldKTsgLyogd2UgYXJlIGdvbm5hIG91dHB1dCBpdCAqLworICB9CisgIGRwcmludGZfaW5mbyhsaXN0Ym94LCAiTGlzdGJveCAlMDR4OiBzZXR0YWJzdG9wcyAlc1xuIiwgCisJICAgICAgIHduZC0+aHduZFNlbGYsIGRiZ19zdHIobGlzdGJveCkpOyAvKiBvdXRwdXQgdGhlIHdob2xlIHRoaW5nICovCisKKyAgZGJnX3Jlc2V0X3N0cihsaXN0Ym94KTsgICAgICAgICAgICAgICAgICAgICAgICAvKiAhISFyZXNldCB0aGUgc3RyaW5nISEhICovCisgIGZvciAoaSA9IDA7IGkgPCBkZXNjci0+ZXh0cmFpbmZvX25yOyBpKyspIHsKKyAgICBkZXNjci0+ZXh0cmFpbmZvID0gKnArMTsgCisgICAgaWYoZGVidWdnaW5nX2luZm8obGlzdGJveCkpICAgICAgICAgICAgICAgICAgLyogd3JpdGUgaW4gaXQgb25seSBpZgorICAgICAgZHNwcmludGYobGlzdGJveCwiJTNkICIsZGVzY3ItPmV4dHJhaW5mbyk7IC8qIHdlIGFyZSBnb25uYSBvdXRwdXQgaXQgKi8KKyAgfQorCisgIGRwcmludGZfaW5mbyhsaXN0Ym94LCAiTGlzdGJveCAlMDR4OiBleHRyYWluZm8gJXNcbiIsIAorCSAgICAgICB3bmQtPmh3bmRTZWxmLCBkYmdfc3RyKGxpc3Rib3gpKTsgLyogb3V0cHV0IHRoZSB3aG9sZSB0aGluZyAqLworCit9CisKK0lNUE9SVEFOVCBOT1RFOgorICBBcyBJIGFscmVhZHkgc3RhdGVkLCBJIGRvIG5vdCB0aGluayB0aGlzIHdpbGwgYmUgdGhlIHVsdGltYXRlIGludGVyZmFjZQorICBmb3IgYnVpbGRpbmcgaW4tbWVtb3J5IGRlYnVnZ2luZyBtZXNzYWdlcy4gSW4gZmFjdCwgSSBkbyBoYXZlIGJldHRlciBpZGVhcworICB3aGljaCBJIGhvcGUgdG8gaGF2ZSB0aW1lIHRvIGltcGxlbWVudCBmb3IgdGhlIG5leHQgcmVsZWFzZS4gRm9yIHRoaXMKKyAgcmVhc29uLCBwbGVhc2UgdHJ5IG5vdCB0byB1c2UgaXQuIEhvd2V2ZXIsIGlmIHlvdSBuZWVkIHRvIG91dHB1dCBhIGxpbmUKKyAgaW4gbW9yZSB0aGFuIG9uZSBkcHJpbnRmX3h4eCBjYWxscywgdGhlbiBVU0UgVEhJUyBJTlRFUkZBQ0UuIERPIE5PVCB1c2UKKyAgb3RoZXIgbWV0aG9kcy4gVGhpcyB3YXksIEkgd2lsbCBlYXNpbHkgdHJhbnNsYXRlIGV2ZXJ5dGhpbmcgdG8gdGhlIG5ldworICBpbnRlcmZhY2UgKHdoZW4gaXQgd2lsbCBiZWNvbWUgYXZhaWxhYmxlKS4gU28sIGlmIHlvdSBuZWVkIHRvIHVzZSBpZiwKKyAgdGhlbiBmb2xsb3cgdGhlIGZvbGxvd2luZyBndWlkZWxpbmVzOgorICAgLS0gd3JhcCBjYWxscyB0byBkc3ByaW50ZiB3aXRoIGEgCisgICAgICBpZihkZWJ1Z2dpbmdfeXl5KHh4eCkpCisgICAgICAgIGRzcHJpbnRmKHh4eCwuLi4pOworICAgICAgT2YgY291cnNlLCBpZiB0aGUgY2FsbCB0byBkc3ByaW50ZiBpcyBtYWRlIGZyb20gd2l0aGluIGEgZnVuY3Rpb24gCisgICAgICB3aGljaCB5b3Uga25vdyBpcyBjYWxsZWQgb25seSBpZiBkZWJ1Z2dpbmdfeXl5KHh4eCkgaXMgdHJ1ZQorICAgICAgKHNheSB5b3UgY2FsbCBpdCBvbmx5IGxpa2UgdGhpczoKKyAgICAgICAgaWYoZGVidWdnaW5nX3l5eSh4eHgpKQorICAgICAgICAgIHByaW50X3NvbWVfZGVidWdfaW5mbygpOworICAgICAgKQorICAgICAgdGhlbiB5b3UgbmVlZCBub3QgKGFuZCBzaG91bGQgbm90KSB3cmFwIGNhbGxzIHRvIGRzcHJpbnRmIHdpdGgKKyAgICAgIHRoZSBiZWZvcmUgbWVudGlvbmVkIGlmLgorICAgLS0gbmFtZSB0aGUgc3RyaW5nIEVYQUNUTFkgbGlrZSB0aGUgZGVidWdnaW5nIGNoYW5uZWwgb24gd2hpY2gKKyAgICAgIGlzIGdvaW5nIHRvIGJlIG91dHB1dC4gUGxlYXNlIHNlZSB0aGUgYWJvdmUgZXhhbXBsZS4gCisKKworUmVzb3VyY2UgaWRlbnRpZmllcnMKKy0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK1Jlc291cmNlIGlkZW50aWZpZXJzIGNhbiBiZSBlaXRoZXIgc3RyaW5ncyBvciBudW1iZXJzLiBUbyBtYWtlIGxpZmUgYSBiaXQKK2Vhc2llciBmb3Igb3V0cHV0dGluZyB0aGlzIGJlYXN0cyAoYW5kIHRvIGhlbHAgeW91IGF2b2lkIHRoZSBuZWVkIHRvIGJ1aWxkCit0aGUgbWVzc2FnZSBpbiBtZW1vcnkpLCBJIGludHJvZHVjZWQgYSBuZXcgZnVuY3Rpb24gY2FsbGVkOgorCitkZWJ1Z3JlcworCitUaGUgZnVuY3Rpb24gaXMgZGVmaW5lZCBpbiBkZWJ1Z3N0ci5oCithbmQgaGFzIHRoZSBmb2xsb3dpbmcgcHJvdG90eXBlOgorCitMUFNUUiBkZWJ1Z3Jlcyhjb25zdCB2b2lkICppZCk7CisKK0l0IHRha2VzIGEgcG9pbnRlciB0byB0aGUgcmVzb3VyY2UgaWQgYW5kIHJldHVybnMgYSBuaWNlbHkgZm9ybWF0dGVkCitzdHJpbmcgb2YgdGhlIGlkZW50aWZpZXIuCisKK0l0IHRoZSBoaWdoIHdvcmQgb2YgdGhlIHBvaW50ZXIgaXMgMCwgdGhlbiBpdCBhc3N1bWVzIHRoYXQgdGhlCitpZGVudGlmaWVyIGlzIGEgbnVtYmVyIGFuZCB0aHVzIHJldHVybnMgYSBzdHJpbmcgb2YgdGhlIGZvcm06CisKKyN4eHh4CisKK3doZXJlIHh4eHggYXJlIDQgaGV4LWRpZ2l0cyByZXByZXNlbnRpbmcgdGhlIGxvdyB3b3JkIG9mIGlkLgorCitJdCB0aGUgaGlnaCB3b3JkIG9mIHRoZSBwb2ludGVyIGlzIG5vdCAwLCB0aGVuIGl0IGFzc3VtZXMgdGhhdCB0aGUKK2lkZW50aWZpZXIgaXMgYSBzdHJpbmcgYW5kIHRodXMgcmV0dXJucyBhIHN0cmluZyBvZiB0aGUgZm9ybToKKworJzxpZGVudGlmaWVyPicKKworVGh1cywgdG8gdXNlIGl0LCBkbyBzb21ldGhpbmcgb24gdGhlIGZvbGxvd2luZyBsaW5lczoKKworI2luY2x1ZGUgImRlYnVnc3RyLmgiCisKKy4uLgorCisgICBkcHJpbnRmX3l5eSh4eHgsICJyZXNvdXJjZSBpcyAlcyIsIGRlYnVncmVzKG15cmVzb3VyY2UpKTsKKworCitUaGUgLWRlYnVnbXNnIGNvbW1hbmQgbGluZSBvcHRpb24KKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCitTbywgdGhlIC1kZWJ1Z21zZyBjb21tYW5kIGxpbmUgb3B0aW9uIGhhcyBiZWVuIGNoYW5nZWQgYXMgZm9sbG93czoKKyAgLSB0aGUgbmV3IHN5bnRheCBpczogLWRlYnVnbXNnIFt5eXldI3h4eFssW3l5eTFdI3h4eDFdKgorICAgIHdoZXJlICMgaXMgZWl0aGVyICsgb3IgLQorCisgIC0gd2hlbiB0aGUgb3B0aW9uYWwgY2xhc3MgYXJndW1lbnQgKHl5eSkgaXMgbm90IHByZXNlbnQsIAorICAgIHRoZW4gdGhlIHN0YXRlbWVudCB3aWxsIGVuYWJsZSgrKS9kaXNhYmxlKC0pIGFsbCBtZXNzYWdlcyBmb3IKKyAgICB0aGUgZ2l2ZW4gY2hhbm5lbCAoeHh4KSBvbiBhbGwgY2xhc3Nlcy4gRm9yIGV4YW1wbGU6CisgICAKKyAgICAtZGVidWdtc2cgK3JlZywtZmlsZQorICAgCisgICAgZW5hYmxlcyBhbGwgbWVzc2FnZXMgb24gdGhlIHJlZyBjaGFubmVsIGFuZCBkaXNhYmxlcyBhbGwKKyAgICBtZXNzYWdlcyBvbiB0aGUgZmlsZSBjaGFubmVsLgorICAgIFRoaXMgaXMgdmVyeSBjbG9zZSAoYWN0dWFsbHkgaWRlbnRpY2FsKSB0byB0aGUgb2xkIHNlbWFudGljcy4KKworICAtIHdoZW4gdGhlIG9wdGlvbmFsIGNsYXNzIGFyZ3VtZW50ICh5eXkpIGlzIHByZXNlbnQsIAorICAgIHRoZW4gdGhlIHN0YXRlbWVudCB3aWxsIGVuYWJsZSgrKS9kaXNhYmxlKC0pIG1lc3NhZ2VzIGZvcgorICAgIHRoZSBnaXZlbiBjaGFubmVsICh4eHgpIG9ubHkgb24gdGhlIGdpdmVuIGNsYXNzLiBGb3IgZXhhbXBsZToKKyAgIAorICAgIC1kZWJ1Z21zZyBpbmZvK3JlZyx3YXJuLWZpbGUKKyAgIAorICAgIGVuYWJsZXMgaW5mbyBtZXNzYWdlcyBvbiB0aGUgcmVnIGNoYW5uZWwgYW5kIGRpc2FibGVzIHdhcm5pbmcKKyAgICBtZXNzYWdlcyBvbiB0aGUgZmlsZSBjaGFubmVsLgorCisgIC0gYWxzbywgdGhlIHBzZXVkby1jaGFubmVsIGFsbCBpcyBhbHNvIHN1cHBvcnRlZCBhbmQgaXQgaGFzIHRoZSAKKyAgICBpbnR1aXRpdmUgc2VtYW50aWNzOgorCisgICAgLWRlYnVnbXNnICthbGwgICAgICAtLSBlbmFibGVzIGFsbCBkZWJ1ZyBtZXNzYWdlcworICAgIC1kZWJ1Z21zZyAtYWxsICAgICAgLS0gZGlzYWJsZXMgYWxsIGRlYnVnIG1lc3NhZ2VzICAgCisgICAgLWRlYnVnbXNnIHl5eSthbGwgICAtLSBlbmFibGVzIGRlYnVnIG1lc3NhZ2VzIGZvciBjbGFzcyB5eXkgb24gYWxsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBjaGFubmVscy4KKyAgICAtZGVidWdtc2cgeXl5LWFsbCAgIC0tIGRpc2FibGVzIGRlYnVnIG1lc3NhZ2VzIGZvciBjbGFzcyB5eXkgb24gYWxsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBjaGFubmVscy4KKworICAgIFNvLCBmb3IgZXhhbXBsZToKKworICAgIC1kZWJ1Z21zZyB3YXJuLWFsbCAgLS0gZGlzYWJsZXMgYWxsIHdhcm5pbmcgbWVzc2FnZXMuCisKKworQWxzbywgbm90ZSB0aGF0IGF0IHRoZSBtb21lbnQ6CisgICAtIHRoZSBmaXhtZSwgZXJyLCB3YXJuIGNsYXNzZXMgYXJlIGFsbCBlbmFibGVkIGJ5IGRlZmF1bHQKKyAgIC0gdGhlIGluZm8gY2xhc3MgaXMgZGlzYWJsZWQgYnkgZGVmYXVsdAorICAgLSB0aGVyZSBpcyBubyB3YXkgdG8gY29tcGlsZSBvdXQgdGhlIG1lc3NhZ2VzLiBBbGwgYXJlIAorICAgICBydW50aW1lIGNvbmZpZ3VyYWJsZS4gVGhpcyB3aWxsIGNvbWUgbmV4dCByZWxlYXNlLgorCisKZGlmZiAtLWdpdCBhL2RvY3VtZW50YXRpb24vZGVidWdnaW5nIGIvZG9jdW1lbnRhdGlvbi9kZWJ1Z2dpbmcKaW5kZXggMTY4NmFlNy4uNzE0MjE3OSAxMDA2NDQKLS0tIGEvZG9jdW1lbnRhdGlvbi9kZWJ1Z2dpbmcKKysrIGIvZG9jdW1lbnRhdGlvbi9kZWJ1Z2dpbmcKQEAgLTUxLDE4ICs1MSwxOSBAQAogICAgIHRoZSByZWFzb24gaXMgbG9jYXRlZCBpbiB0aGUgbGFzdCBjYWxsKHMpLiAgVGhvc2UgbGluZXMgdXN1YWxseSBsb29rIGxpa2UKICAgICB0aGlzOgogCi18Q2FsbCBLRVJORUwuOTA6IExTVFJMRU4oMDIyNzowNjkyKSByZXQ9MDFlNzoyY2U3IGRzPTAyMjcKLSAgICAgIF5eXl5eXl5eXiAgXiAgICAgICBeXl5eXl5eXl4gICAgICBeXl5eXl5eXl4gICAgXl5eXgotICAgICAgfCAgICAgICAgICB8ICAgICAgIHwgICAgICAgICAgICAgIHwgICAgICAgICAgICB8RGF0YXNlZ21lbnQgb24gZW50cnkKLSAgICAgIHwgICAgICAgICAgfCAgICAgICB8ICAgICAgICAgICAgICB8UmV0dXJuIGFkZHJlc3MuCit8Q2FsbCBLRVJORUwuOTA6IExTVFJMRU4oMDIyNzowNjkyICJ0ZXh0IikgcmV0PTAxZTc6MmNlNyBkcz0wMjI3CisgICAgICBeXl5eXl5eXl4gIF4gICAgICAgXl5eXl5eXl5eIF5eXl5eXiAgICAgIF5eXl5eXl5eXiAgICBeXl5eCisgICAgICB8ICAgICAgICAgIHwgICAgICAgfCAgICAgICAgIHwgICAgICAgICAgIHwgICAgICAgICAgICB8RGF0YXNlZ21lbnQKKyAgICAgIHwgICAgICAgICAgfCAgICAgICB8ICAgICAgICAgfCAgICAgICAgICAgfFJldHVybiBhZGRyZXNzCisgICAgICB8ICAgICAgICAgIHwgICAgICAgfCAgICAgICAgIHx0ZXh0dWFsIHBhcmFtZXRlcgogICAgICAgfCAgICAgICAgICB8ICAgICAgIHwKICAgICAgIHwgICAgICAgICAgfCAgICAgICB8QXJndW1lbnQocykuIFRoaXMgb25lIGlzIGEgd2luMTYgc2VnbWVudGVkIHBvaW50ZXIuCiAgICAgICB8ICAgICAgICAgIHxGdW5jdGlvbiBjYWxsZWQuCiAgICAgICB8VGhlIG1vZHVsZSwgdGhlIGZ1bmN0aW9uIGlzIGNhbGxlZCBpbi4gSW4gdGhpcyBjYXNlIGl0IGlzIEtFUk5FTC4KIAkJICAgICAgICAKLXxSZXQgIEtFUk5FTC45MDogTFNUUkxFTigpIHJldHZhbD0weDAwMDcgcmV0PTAxZTc6MmNlNyBkcz0wMjI3Cit8UmV0ICBLRVJORUwuOTA6IExTVFJMRU4oKSByZXR2YWw9MHgwMDA0IHJldD0wMWU3OjJjZTcgZHM9MDIyNwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF5eXl5eXgotCQkJCSAgfFJldHVybnZhbHVlIGlzIDE2IGJpdCBhbmQgaGFzIHRoZSB2YWx1ZSA3LgorCQkJCSAgfFJldHVybnZhbHVlIGlzIDE2IGJpdCBhbmQgaGFzIHRoZSB2YWx1ZSA0LgogCiAKICAzLiBJZiB5b3UgaGF2ZSBmb3VuZCBhIG1pc2JlaGF2aW5nIGZ1bmN0aW9uLCB0cnkgdG8gZmluZCBvdXQgd2h5IGl0CkBAIC0xMTksMTggKzEyMCwyOCBAQAogICAiY29udGludWUiLiBXaXRoICItZGVidWdtc2cgK2FsbCIgV2luZSB3aWxsIG5vdyBzdG9wIGRpcmVjdGx5IGRpcmVjdGx5CiAgIGJlZm9yZSBzZXR0aW5nIHVwIHRoZSBNZXNzYWdlYm94LiAgUHJvY2VlZCBhcyBleHBsYWluZWQgYWJvdmUuCiAKKyAgWW91IGNhbiBhbHNvIHJ1biB3aW5lIHVzaW5nICJ3aW5lIC1kZWJ1Z21zZyArcmVsYXkgcHJvZ3JhbS5leGUgMj4mMXxsZXNzIC1pIgorICBhbmQgaW4gbGVzcyBzZWFyY2ggZm9yIG1lc3NhZ2Vib3guCiAKIERpc2Fzc2VtYmxpbmcgcHJvZ3JhbXM6CiA9PT09PT09PT09PT09PT09PT09PT09PQogICBZb3UgbWF5IGFsc28gdHJ5IHRvIGRpc2Fzc2VtYmxlIHRoZSBvZmZlbmRpbmcgcHJvZ3JhbSB0byBjaGVjayBmb3IgCiAgIHVuZG9jdW1lbnRlZCBmZWF0dXJlcyBhbmQvb3IgdXNlIG9mIHRoZW0uCi0gIFRoZSBiZXN0LCBmcmVlbHkgYXZhaWxhYmxlLCBkaXNhc3NlbWJsZXIgZm9yIHdpbjE2IHByb2dyYW1zIGlzCisKKyAgVGhlIGJlc3QsIGZyZWVseSBhdmFpbGFibGUsIGRpc2Fzc2VtYmxlciBmb3IgV2luMTYgcHJvZ3JhbXMgaXMKICAgV2luZG93cyBDb2RlYmFjaywgYXJjaGl2ZW5hbWUgd2NieHh4LnppcCwgd2hpY2ggdXN1YWxseSBjYW4gYmUgZm91bmQKICAgaW4gdGhlIENpY2EtTWlycm9yIHN1YmRpcmVjdG9yeSBvbiB0aGUgV0lORSBmdHBzaXRlcy4gKFNlZSBBTk5PVU5DRSkuCi0gIERpc2Fzc2VtYmxpbmcgd2luMzIgcHJvZ3JhbXMgaXMgY3VycmVudHkgb25seSBwb3NzaWJsZSB1c2luZyAKLSAgV2luZG93cyBEaXNhc3NlbWJsZXIgMzIsIGFyY2hpdmVuYW1lIHNvbWV0aGluZyBsaWtlIHdkYXNtMzJ4LnppcCBvbgotICBmdHAud2luc2l0ZS5jb20gYW5kIG1pcnJvcnMuCisgIERpc2Fzc2VtYmxpbmcgd2luMzIgcHJvZ3JhbXMgaXMgcG9zc2libGUgdXNpbmcgdGhlIFdpbmRvd3MgRGlzYXNzZW1ibGVyIDMyLAorICBhcmNoaXZlbmFtZSBzb21ldGhpbmcgbGlrZSB3MzJkYXNtLnppcCBvbiBmdHAud2luc2l0ZS5jb20gYW5kIG1pcnJvcnMuCisgIFRoZSBzaGFyZXdhcmUgdmVyc2lvbiBkb2VzIG5vdCBhbGxvdyBzYXZpbmcgb2YgZGlzYXNzZW1ibHkgbGlzdGluZ3MuCisKKyAgW0l0IGFsc28gaGFzIGEgYnVnLCBpdCBkaXNhc3NlbWJsZXMgdGhlIGRsbCBhbmQgaW1tZWRpYXRlbHkgYWZ0ZXIgdGhhdAorICAgY3Jhc2hlcywgbGVhdmluZyBhIHZlcnkgbGFyZ2UgZmlsZSBjYWxlZCAnd2luc3lzJyBpbiB0aGUgZGlyZWN0b3J5IG9mIHRoZQorICAgZGlzYXNzZW1ibGVkIGZpbGUuIFRoaXMgZmlsZSBjb250YWlucyBub3RoaW5nIG9mIHZhbHVlIChqdXN0IHRoZSBkaXNhc3NlbWJseSkKKyAgIGFuZCBjYW4gYmUgc2FmZWx5IGRlbGV0ZWQuXQorCiAgIFVuZGVyc3RhbmRpbmcgZGlzYXNzZW1ibGVkIGNvZGUgaXMganVzdCBhIHF1ZXN0aW9uIG9mIGV4ZXJjaXNlLgorCiAgIE1vc3QgY29kZSBvdXQgdGhlcmUgdXNlcyBzdGFuZGFyZCBDIGZ1bmN0aW9uIGVudHJpZXMgKGZvciBpdCBpcyB1c3VhbGx5IAogICB3cml0dGVuIGluIEMpLiBXaW4xNiBmdW5jdGlvbiBlbnRyaWVzIHVzdWFsbHkgbG9vayBsaWtlIHRoYXQ6CiB8ICAJcHVzaCBicApAQCAtMTU3LDcgKzE2OCw2IEBACiB8CWNhbGwgS0VSTkVMLkxTVFJMRU4KICAgSGVyZSBmaXJzdCB0aGUgc2VsZWN0b3IgYW5kIHRoZW4gdGhlIG9mZnNldCB0byB0aGUgcGFzc2VkIHN0cmluZyBhcmUgcHVzaGVkLgogCi0KIFNhbXBsZSBkZWJ1Z2dpbmcgc2Vzc2lvbjoKID09PT09PT09PT09PT09PT09PT09PT09PT0KIApAQCAtMTcxLDg4ICsxODEsNzggQEAKIAogCiB8bWFyY3VzQGpldCAkIHdpbmUgd2lud29yZC5leGUgLWRlYnVnbXNnICtyZWxheSAtZGVidWcKLXxDYWxsVG8zMihmdW5jPTA4MDA3ZTAwLDAwMDAwMWM0LDAwMDAwMDgxLDAwMDAwMDAwLDAwMDAwMDAwKQotfENhbGxUbzMyKGZ1bmM9MDgwMDdlMDAsMDAwMDAxYzQsMDAwMDAwMTQsMDAwMDA2ZDAsMDAwMDAwMDApCi18V2luMTYgdGFzayAnd2lud29yZCc6IEJyZWFrcG9pbnQgMSBhdCAweDAxNTc6MHgwMDFhCi18Q2FsbFRvMTYoZnVuYz0wMDk3OjAxMzAsZHM9MDAwMCkKLXxDYWxsIFdQUk9DUy4yNDogVEFTS19SRVNDSEVEVUxFKCkgcmV0PTAwM2Y6MDc1OSBkcz0wMDAwCi18UmV0ICBXUFJPQ1MuMjQ6IFRBU0tfUkVTQ0hFRFVMRSgpIHJldHZhbD0weDAwMDAgcmV0PTAwM2Y6MDc1OSBkcz0wOGE3Ci18Q2FsbFRvMTYoZnVuYz0wMTU3OjAwMWEsZHM9MDhhNywweDExZDcsMHgwMDAwLDB4MDAwMCwweDNjYjQsMHgxZjQwLDB4MDAwMCwweDAwMDAsMHgwOGE3KQotfExvYWRpbmcgc3ltYm9scyBmcm9tIEVMRiBmaWxlIC9ob21lL21hcmN1cy93aW5lL3dpbmUuLi4KLXwuLi5tb3JlIExvYWRpbmcgc3ltYm9scyAuLi4gCi18U3RvcHBlZCBvbiBicmVha3BvaW50IDEgYXQgMHgwMTU3OjB4MDAxYSAoV1BST0NTX1ZYRF9QQUdFRklMRSsweGZmZmZlZWVhKQorfENhbGxUbzMyKHduZHByb2M9MHg0MDA2NWJjMCxod25kPTAwMDAwMWFjLG1zZz0wMDAwMDA4MSx3cD0wMDAwMDAwMCxscD0wMDAwMDAwMCkKK3xXaW4xNiB0YXNrICd3aW53b3JkJzogQnJlYWtwb2ludCAxIGF0IDB4MDFkNzoweDAwMWEKK3xDYWxsVG8xNihmdW5jPTAxMjc6MDA3MCxkcz0wOTI3KQorfENhbGwgV1BST0NTLjI0OiBUQVNLX1JFU0NIRURVTEUoKSByZXQ9MDBiNzoxNDU2IGRzPTA5MjcKK3xSZXQgIFdQUk9DUy4yNDogVEFTS19SRVNDSEVEVUxFKCkgcmV0dmFsPTB4ODY3MiByZXQ9MDBiNzoxNDU2IGRzPTA5MjcKK3xDYWxsVG8xNihmdW5jPTAxZDc6MDAxYSxkcz0wOTI3KQorfCAgICAgQVg9MDAwMCBCWD0zY2I0IENYPTFmNDAgRFg9MDAwMCBTST0wMDAwIERJPTA5MjcgQlA9MDAwMCBFUz0xMWY3Cit8TG9hZGluZyBzeW1ib2xzOiAvaG9tZS9tYXJjdXMvd2luZS93aW5lLi4uCit8U3RvcHBlZCBvbiBicmVha3BvaW50IDEgYXQgMHgwMWQ3OjB4MDAxYQogfEluIDE2IGJpdCBtb2RlLgogfFdpbmUtZGJnPmJyZWFrIE1lc3NhZ2VCb3gzMkEgICAgICAgICAgICAgICAgICAgICAgICAgIDwtLS0tIFNldCBCcmVha3BvaW50Ci18QnJlYWtwb2ludCAyIGF0IDB4MDgwZTc5MmMgKE1lc3NhZ2VCb3gzMkEgW21zZ2JveC5jOjE5OF0pCit8QnJlYWtwb2ludCAyIGF0IDB4NDAxODkxMDAgKE1lc3NhZ2VCb3gzMkEgW21zZ2JveC5jOjE5MF0pCiB8V2luZS1kYmc+YyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC0tLS0gQ29udGludWUKIHxDYWxsIEtFUk5FTC45MTogSU5JVFRBU0soKSByZXQ9MDE1NzowMDIyIGRzPTA4YTcKIHwgICAgIEFYPTAwMDAgQlg9M2NiNCBDWD0xZjQwIERYPTAwMDAgU0k9MDAwMCBEST0wOGE3IEVTPTExZDcgRUZMPTAwMDAwMjg2CiB8Q2FsbFRvMTYoZnVuYz0wOTBmOjA4NWMsZHM9MGRjZiwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwODAwLDB4MDAwMCwweDAwMDAsMHgwZGNmKQogfC4uLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwtLS0tLSBNdWNoIGRlYnVnb3V0cHV0Ci18Q2FsbCBLRVJORUwuOTc6IEdFVFRFTVBGSUxFTkFNRSgweDAwYzMsMDhhNzo4MzUwLDB4MDAwMCwwOGE3OjgyMzQpIHJldD0wNThmOjA5YjEgZHM9MDhhNwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXiAgICAgIF4gICAgICAgICBeICAgICAgXgotCQkJCSB8ICAgICAgfCAgICAgICAgIHwgICAgICB8TFBTVFIgYnVmZmVyCi0JCQkJIHwgICAgICB8ICAgICAgICAgfFVJTlQxNiB1bmlxdWUKLQkJCQkgfCAgICAgIHxMUENTVFIgcHJlZml4Ci0JCQkJIHxCWVRFIGRyaXZlCit8Q2FsbCBLRVJORUwuMTM2OiBHRVREUklWRVRZUEUoMHgwMDAwKSByZXQ9MDYwZjowOTdiIGRzPTA5MjcKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBeXl5eXl4gRHJpdmUgMCAoQTopCit8UmV0ICBLRVJORUwuMTM2OiBHRVREUklWRVRZUEUoKSByZXR2YWw9MHgwMDAyIHJldD0wNjBmOjA5N2IgZHM9MDkyNworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF5eXl5eXiAgRFJJVkVfUkVNT1ZFQUJMRQorCQkJCQkJKEl0IGlzIGEgZmxvcHB5IGRpc2tkcml2ZS4pCiAKLXxSZXQgIEtFUk5FTC45NzogR0VUVEVNUEZJTEVOQU1FKCkgcmV0dmFsPTB4Y2UzZiByZXQ9MDU4ZjowOWIxIGRzPTA4YTcKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHxuZXcgdW5pcXVlIG51bWJlcgorfENhbGwgS0VSTkVMLjEzNjogR0VURFJJVkVUWVBFKDB4MDAwMSkgcmV0PTA2MGY6MDk3YiBkcz0wOTI3CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXl5eXl5eIERyaXZlIDEgKEI6KQorfFJldCAgS0VSTkVMLjEzNjogR0VURFJJVkVUWVBFKCkgcmV0dmFsPTB4MDAwMCByZXQ9MDYwZjowOTdiIGRzPTA5MjcKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBeXl5eXl4gIERSSVZFX0NBTk5PVERFVEVSTUlORQorCQkJCQkJKEkgZG9uJ3QgaGF2ZSBkcml2ZSBCOiBhc3NpZ25lZCkKIAotfENhbGwgS0VSTkVMLjc0OiBPUEVORklMRSgwOGE3OjgyMzQsMDhhNzo4MmM2LDB4MTAxMikgcmV0PTA1OGY6MDlkOCBkcz0wOGE3Ci0gICAgICAgICAgICAgICAgICAgICAgICAgIF4gICAgICAgICBeICAgICAgICAgXgotICAgICAgICAgICAgICAgICAgICAgICAgICB8ICAgICAgICAgfCAgICAgICAgIHxVSU5UMzIgbW9kZQotICAgICAgICAgICAgICAgICAgICAgICAgICB8ICAgICAgICAgfE9GU1RSVUNUICpvZnMKLSAgICAgICAgICAgICAgICAgICAgICAgICAgfExQQ1NUUiBuYW1lCit8Q2FsbCBLRVJORUwuMTM2OiBHRVREUklWRVRZUEUoMHgwMDAyKSByZXQ9MDYwZjowOTdiIGRzPTA5MjcKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBeXl5eXl5eIERyaXZlIDIgKEM6KQorfFJldCAgS0VSTkVMLjEzNjogR0VURFJJVkVUWVBFKCkgcmV0dmFsPTB4MDAwMyByZXQ9MDYwZjowOTdiIGRzPTA5MjcKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBeXl5eXl4gRFJJVkVfRklYRUQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHNwZWNpZmllZCBhcyBhIGhhcmRkaXNrKQogCi18UmV0ICBLRVJORUwuNzQ6IE9QRU5GSUxFKCkgcmV0dmFsPTB4ZmZmZiByZXQ9MDU4ZjowOWQ4IGRzPTA4YTcKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXgotCQkJCSAgIHwgLTEgYWthLiBIRklMRV9FUlJPUgorfENhbGwgS0VSTkVMLjk3OiBHRVRURU1QRklMRU5BTUUoMHgwMGMzLDB4MDkyNzgzNjQiZG9jIiwweDAwMDAsMDkyNzo4MjQ4KSByZXQ9MDYwZjowOWIxIGRzPTA5MjcKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF5eXl5eXiAgICAgICAgICAgXl5eXl4gICAgICAgIF5eXl5eXl5eXgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAgICAgICAgICAgICAgICB8ICAgICAgICAgICAgfGJ1ZmZlciBmb3IgZm5hbWUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgICAgICAgICAgICAgICAgfHRlbXBvcmFyeSBuYW1lIH5kb2NYWFhYLnRtcAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfEZvcmNlIHVzZSBvZiBEcml2ZSBDOi4KIAotfENhbGwgVVNFUi4xOiBNRVNTQUdFQk9YKDB4MDAwMCwwOGVmOjgzNjIsMDAwMDowMDAwLDB4MTAzMCkgcmV0PTA1ZDc6MDg0ZiBkcz0wOGVmU3RvcHBlZCBvbiBicmVha3BvaW50IDIgYXQgMHgwODBlNzkyYyAoTWVzc2FnZUJveDMyQSBbbXNnYm94LmM6MTk4XSkKLXwxOTggICAgIHsKLXxJbiAzMiBiaXQgbW9kZS4KLXxXaW5lLWRiZz4gXwotCi0gICAgTm93LCB3ZSBzZWUgdGhhdCBPUEVORklMRSBzZWVtIHRvIGhhdmUgcmV0dXJuZWQgMHhGRkZGIChvciAtMSkuIENoZWNraW5nCi0gICAgdGhlIGltcGxlbWVudGF0aW9uIG9mIE9wZW5GaWxlIGluIGZpbGVzL2ZpbGUuYywgdGhpcyBzaWduYWxzIGFuIGVycm9yLgotICAgIFRoZSBtb2RlIGZsYWdzIChPRl9SRUFEV1JJVEV8T0ZfU0hBUkVfRVhDTFVTSVZFfE9GX0NSRUFURSkgc2VlbXMgdG8KLSAgICBpbmRpY2F0ZSwgdGhhdCBXaW5Xb3JkIHdhbnRzIHRvIG9wZW4gdGhlIGZpbGUgZm9yIHdyaXRpbmcsIHNvIHdlIGNoZWNrCi0gICAgdGhlIGZpbGVuYW1lLiBTaW5jZSB3ZSBkb24ndCBzZWUgdGhlIGZpbGVuYW1lIGluIHRoaXMgZGVidWdvdXRwdXQsIHdlIHVzZQotICAgIHRoZSBkcHJpbnRmX2ZpbGUoKSBpbiBPcGVuRmlsZSB0byBwcmludCBvdXQgbW9yZSBpbmZvcm1hdGlvbiBieSBhZGRpbmcKLSAgICAiLWRlYnVnbXNnICtyZWxheSIgdG8gdGhlIGNvbW1hbmRsaW5lLgotCi0gICAgKEluIGZhY3QsIHdlIHNlZSB0aGF0IHRoZSBmaWxlbmFtZSBoYXMgYmVlbiByZXR1cm5lZCBieSB0aGUgR2V0VGVtcEZpbGVOYW1lCi0gICAgIGZ1bmN0aW9uIGFib3ZlLCBidXQgd2UgY2hlY2sgaXQgYW55d2F5LikKLQotfG1hcmN1c0BqZXQgJCB3aW5lIHdpbndvcmQuZXhlIC1kZWJ1Z21zZyArcmVsYXksK2ZpbGUgLWRlYnVnCi18Li4uLi5tdWNoIG1vcmUgZGVidWdvdXRwdXQgLi4uLi4KLXwKLQotfENhbGwgS0VSTkVMLjk3OiBHRVRURU1QRklMRU5BTUUoMHgwMGMzLDA4ZWY6ODM1MCwweDAwMDAsMDhlZjo4MjM0KSByZXQ9MDVkNzowOWIxIGRzPTA4ZWYKLXxGSUxFX0NyZWF0ZTogJ0M6XH5kb2M4YjkzLnRtcCcgMDFiNiAxCi18RklMRV9TZXREb3NFcnJvcjogZXJybm8gPSAxMwotCi18V2FybmluZzogR2V0VGVtcEZpbGVOYW1lIHJldHVybnMgJ0M6XH5kb2M4YjkzLnRtcCcsIHdoaWNoIGRvZXNuJ3Qgc2VlbSB0byBiZSB3cml0ZWFibGUuCit8V2FybmluZzogR2V0VGVtcEZpbGVOYW1lIHJldHVybnMgJ0M6fmRvYzkyODEudG1wJywgd2hpY2ggZG9lc24ndCBzZWVtIHRvIGJlIHdyaXRlYWJsZS4KIHxQbGVhc2UgY2hlY2sgeW91ciBjb25maWd1cmF0aW9uIGZpbGUgaWYgdGhpcyBnZW5lcmF0ZXMgYSBmYWlsdXJlLgotIF4gV2FybmluZyBtZXNzYWdlCiAKLXxHZXRUZW1wRmlsZU5hbWU6IHJldHVybmluZyBDOlx+ZG9jOGI5My50bXAKLXxSZXQgIEtFUk5FTC45NzogR0VUVEVNUEZJTEVOQU1FKCkgcmV0dmFsPTB4OGI5MyByZXQ9MDVkNzowOWIxIGRzPTA4ZWYKLXxDYWxsIEtFUk5FTC43NDogT1BFTkZJTEUoMDhlZjo4MjM0LDA4ZWY6ODJjNiwweDEwMTIpIHJldD0wNWQ3OjA5ZDggZHM9MDhlZgotfE9wZW5GaWxlOiBDOlx+ZG9jOGI5My50bXAgMTAxMgotfEZJTEVfQ3JlYXRlOiAnQzpcfmRvYzhiOTMudG1wJyAwMWI2IDAKLXxGSUxFX1NldERvc0Vycm9yOiBlcnJubyA9IDEzCi18T3BlbkZpbGUoQzpcfmRvYzhiOTMudG1wKTogcmV0dXJuID0gSEZJTEVfRVJST1IKLXxSZXQgIEtFUk5FTC43NDogT1BFTkZJTEUoKSByZXR2YWw9MHhmZmZmIHJldD0wNWQ3OjA5ZDggZHM9MDhlZgorV2hvb3BzLCBpdCBldmVuIGRldGVjdHMgdGhhdCBzb21ldGhpbmcgaXMgd3JvbmchCiAKK3xSZXQgIEtFUk5FTC45NzogR0VUVEVNUEZJTEVOQU1FKCkgcmV0dmFsPTB4OTI4MSByZXQ9MDYwZjowOWIxIGRzPTA5MjcKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF5eXl5eXiBUZW1wb3Jhcnkgc3RvcmFnZSBJRAogCi0gICAgVGhlIGZpbGVuYW1lIGlzICJDOlx+ZG9jZDAzZC50bXAiLiBPZiBjb3Vyc2UsIEM6XCBpcyB3cml0ZWFibGUgZm9yIHRoZQotICAgIHN1cGVydXNlciBvbmx5LCBzbyB0aGUgb3BlbiBmYWlscyBmb3IgYSBub3JtYWwgdXNlciBhbmQgT3BlbkZpbGUgcmV0dXJucwotICAgIC0xLCB3aGljaCBpbiB0dXJuIGdlbmVyYXRlcyB0aGlzIG1lc3NhZ2Vib3guIChBcyBzYWlkIGJ5IHRoZSB3YXJuaW5nCi0gICAgbWVzc2FnZS4pCit8Q2FsbCBLRVJORUwuNzQ6IE9QRU5GSUxFKDB4MDkyNzgyNDgiQzp+ZG9jOTI4MS50bXAiLDA5Mjc6ODJkYSwweDEwMTIpIHJldD0wNjBmOjA5ZDggZHM9MDkyNworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXl5eXl5eXl5eXl5eXl5eXiBeXl5eXl5eXl4gXl5eXl5eXgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfGZpbGVuYW1lICAgICAgICB8T0ZTVFJVQ1QgfG9wZW4gbW9kZToKIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT0ZfQ1JFQVRFfE9GX1NIQVJFX0VYQ0xVU0lWRXxPRl9SRUFEV1JJVEUKKworVGhpcyBmYWlscywgc2luY2UgbXkgQzogZHJpdmUgaXMgaW4gdGhpcyBjYXNlIG1vdW50ZWQgcmVhZG9ubHkuCisKK3xSZXQgIEtFUk5FTC43NDogT1BFTkZJTEUoKSByZXR2YWw9MHhmZmZmIHJldD0wNjBmOjA5ZDggZHM9MDkyNworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBeXl5eXl4gSEZJTEVfRVJST1IxNiwgeWVzLCBpdCBmYWlsZWQuCisKK3xDYWxsIFVTRVIuMTogTUVTU0FHRUJPWCgweDAwMDAsMHgwOTI3ODM3NiJTaWUgbfxzc2VuIFdpbmRvd3MgdmVybGFzc2VuIHVuZCBTSEFSRS5FWEUgbGFkZW4gYmV2b3IgU2llIFdvcmQgc3RhcnRlbi4iLDB4MDAwMDAwMDAsMHgxMDMwKSByZXQ9MDYwZjowODRmIGRzPTA5MjcKKyAgICAgICAgICAgCitBbmQgTWVzc2FnZUJveCdlZC4KKworfFN0b3BwZWQgb24gYnJlYWtwb2ludCAyIGF0IDB4NDAxODkxMDAgKE1lc3NhZ2VCb3gzMkEgW21zZ2JveC5jOjE5MF0pCit8MTkwICAgICB7CQk8LSB0aGUgc291cmNlbGluZQorSW4gMzIgYml0IG1vZGUuCitXaW5lLWRiZz4KKworCVRoZSBjb2RlIHNlZW1zIHRvIGZpbmQgYSB3cml0ZWFibGUgaGFyZGRpc2sgYW5kIHRyaWVzIHRvIGNyZWF0ZSBhIGZpbGUKKwl0aGVyZS4gVG8gd29yayBhcm91bmQgdGhpcyBidWcsIHlvdSBjYW4gZGVmaW5lIEM6IGFzIGEgbmV0d29ya2RyaXZlLAorCXdoaWNoIGlzIGlnbm9yZWQgYnkgdGhlIGNvZGUgYWJvdmUuCiAKIFdyaXR0ZW4gYnkgTWFyY3VzIE1laXNzbmVyIDxtc21laXNzbkBjaXAuaW5mb3JtYXRpay51bmktZXJsYW5nZW4uZGU+LAogYWRkaXRpb25zIHdlbGNvbWUuCmRpZmYgLS1naXQgYS9kb2N1bWVudGF0aW9uL3dpbmUudGV4aW5mbyBiL2RvY3VtZW50YXRpb24vd2luZS50ZXhpbmZvCmluZGV4IDAyZjg4YTYuLjE0MjVmODQgMTAwNjQ0Ci0tLSBhL2RvY3VtZW50YXRpb24vd2luZS50ZXhpbmZvCisrKyBiL2RvY3VtZW50YXRpb24vd2luZS50ZXhpbmZvCkBAIC0yMyw3ICsyMyw3IEBACiBUaGlzIGZpbGUgZG9jdW1lbnRzIFdpbmUsIHRoZSBXaW5kb3dzIEVtdWxhdG9yLgogCiBAYyAKLUNvcHlyaWdodCBAY29weXJpZ2h0e30gMTk5NyBUaGUgV2luZSBhdXRob3JzLiBAKgorQ29weXJpZ2h0IEBjb3B5cmlnaHR7fSAxOTk3LDE5OTggVGhlIFdpbmUgYXV0aG9ycy4gQCoKIEB4cmVme0F1dGhvcnMsIFRoZSBXaW5lIEF1dGhvcnMsIFRoZSBXaW5lIEF1dGhvcnN9LAogZm9yIGEgbGlzdCBvZiB0aGUgY29weXJpZ2h0IGhvbGRlcnMuCiAKQEAgLTQ0LDggKzQ0LDggQEAKIHRoZSBzZWN0aW9uIGVudGl0bGVkIGBgTGljZW5zZSwgV2FycmFudHksIGFuZCBBdXRob3JzIG9mIFdpbmUnJy4KIAogQHNwIDQKLUZJWE1FOiBVTklYIGFuZCBQT1NJWCB0cmFkZW1hcmtzLiBAKgotWDExIEAqCitGSVhNRTogWDExIGFuZCBQT1NJWCB0cmFkZW1hcmtzLiBAKgorVU5JWCBpcyBhIHJlZ2lzdGVyZWQgdHJhZGVtYXJrIG9mIHRoZSBPcGVuIEdyb3VwLgogTWljcm9zb2Z0LCBXaW5kb3dzLCBNUy1XaW5kb3dzLCBXaW5kb3dzLU5ULCBXaW5kb3dzIDk1LCBhbmQgTVMtRE9TIGFyZQogcmVnaXN0ZXJlZCB0cmFkZW1hcmtzIG9mIE1pY3Jvc29mdCBDb3Jwb3JhdGlvbi4KIE5UIGlzIGEgdHJhZGVtYXJrIG9mIE5vcnRoZXJuIFRlbGVjb20gTGltaXRlZC4KQEAgLTU5LDE3ICs1OSwxNiBAQAogQHNldGNoYXB0ZXJuZXdwYWdlIG9kZAogCiBAdGl0bGVwYWdlCi1Ac3AgMTAKIAotQGNlbnRlciBAdGl0bGVmb250e1RoZSBXaW5lIFJlZmVyZW5jZSBNYW51YWx9Ci1AY2VudGVyIEVkaXRpb24gMC4wLjMsIDE0IEF1Z3VzdCAxOTk3CitAdGl0bGV7VGhlIFdpbmUgUmVmZXJlbmNlIE1hbnVhbH0KK0BzdWJ0aXRsZXtFZGl0aW9uIDAuMC41LCBGZWJydWFyeSAxOTk4fQogCi0KK0BhdXRob3J7VGhlIFdpbmUgVGVhbX0KIEBjIFRoZSBmb2xsb3dpbmcgdHdvIGNvbW1hbmRzIHN0YXJ0IHRoZSBjb3B5cmlnaHQgcGFnZS4KIEBwYWdlCiBAdnNraXAgMHB0IHBsdXMgMWZpbGxsCiAKLUNvcHlyaWdodCBAY29weXJpZ2h0e30gMTk5NyBUaGUgV2luZSBhdXRob3JzLiBAKgorQ29weXJpZ2h0IEBjb3B5cmlnaHR7fSAxOTk3LCAxOTk4IFRoZSBXaW5lIGF1dGhvcnMuIEAqCiBAeHJlZntBdXRob3JzLCBUaGUgV2luZSBBdXRob3JzLCBUaGUgV2luZSBBdXRob3JzfSwKIGZvciBhIGxpc3Qgb2YgdGhlIGNvcHlyaWdodCBob2xkZXJzLgogCkBAIC0xMDEsMTIgKzEwMCwxMiBAQAogCiBAYyBFZGl0IHRoaXMgbWFjcm8gbWFudWFsbHkgaW4gdGhlIGFib3ZlIHBhcnRzIG9mIHRoZSBkb2N1bWVudAogQG1hY3JvIHdpbmVtYW51YWx2ZXJzaW9uCi0wLjAuMworMC4wLjQKIEBlbmQgbWFjcm8KIAogQGMgRWRpdCB0aGlzIG1hY3JvIG1hbnVhbGx5IGluIHRoZSBhYm92ZSBwYXJ0cyBvZiB0aGUgZG9jdW1lbnQKIEBtYWNybyB3aW5lbWFudWFsZGF0ZQotMTQgQXVndXN0IDE5OTcKK0ZlYnJ1YXJ5IDE5OTgKIEBlbmQgbWFjcm8KIAogQGMgRWRpdCB0aGlzIG1hY3JvIG1hbnVhbGx5IGludG8gdGhlIFRlWCB0aXRsZXBhZ2UKQEAgLTEyMiwxMiArMTIxLDEyIEBACiBAYyBNSUNST1NPRlQKIEBjCiAKLUBjIEZJWE1FOiBhdXRvbWF0aWNhbCB0cmFkZW1hcmsgcmVmZXJlbmNlCitAYyBGSVhNRTogYXV0b21hdGljIHRyYWRlbWFyayByZWZlcmVuY2UKIEBtYWNybyBtc3dpbmRvd3MKIE1TLVdpbmRvd3MKIEBlbmQgbWFjcm8KIAotQGMgRklYTUU6IGF1dG9tYXRpY2FsIHRyYWRlbWFyayByZWZlcmVuY2UKK0BjIEZJWE1FOiBhdXRvbWF0aWMgdHJhZGVtYXJrIHJlZmVyZW5jZQogQGMgc3BlbGwgaXQgYWx3YXlzIHRoZSBzYW1lCiBAbWFjcm8gV0lOMzIKIFdJTjMyCkBAIC0xMzYsMTcgKzEzNSwxNyBAQAogV0lOMTYKIEBlbmQgbWFjcm8KIAotQGMgRklYTUU6IGF1dG9tYXRpY2FsIHRyYWRlbWFyayByZWZlcmVuY2UKK0BjIEZJWE1FOiBhdXRvbWF0aWMgdHJhZGVtYXJrIHJlZmVyZW5jZQogQG1hY3JvIFdJTk5UCiBXaW5kb3dzIE5UCiBAZW5kIG1hY3JvCiAKLUBjIEZJWE1FOiBhdXRvbWF0aWNhbCB0cmFkZW1hcmsgcmVmZXJlbmNlCitAYyBGSVhNRTogYXV0b21hdGljIHRyYWRlbWFyayByZWZlcmVuY2UKIEBtYWNybyBXSU5OVDQwCiBXaW5kb3dzIE5UIDQuMAogQGVuZCBtYWNybwogCi1AYyBGSVhNRTogYXV0b21hdGljYWwgdHJhZGVtYXJrIHJlZmVyZW5jZQorQGMgRklYTUU6IGF1dG9tYXRpYyB0cmFkZW1hcmsgcmVmZXJlbmNlCiBAbWFjcm8gV0lOOTUKIFdpbmRvd3MgOTUKIEBlbmQgbWFjcm8KQEAgLTE1NSwxMiArMTU0LDEyIEBACiBAYwogQGMgVEhFIE9USEVSUwogQGMKLUBjIEZJWE1FOiBhdXRvbWF0aWNhbCB0cmFkZW1hcmsgcmVmZXJlbmNlCitAYyBGSVhNRTogYXV0b21hdGljIHRyYWRlbWFyayByZWZlcmVuY2UKIEBtYWNybyB1bml4CiBVTklYCiBAZW5kIG1hY3JvCiAKLUBjIEZJWE1FOiBhdXRvbWF0aWNhbCB0cmFkZW1hcmsgcmVmZXJlbmNlCitAYyBGSVhNRTogYXV0b21hdGljIHRyYWRlbWFyayByZWZlcmVuY2UKIEBtYWNybyBwb3NpeAogUE9TSVgKIEBlbmQgbWFjcm8KQEAgLTEyMDMsNyArMTIwMiwxNCBAQAogQHNlY3Rpb24gQXBwbHlpbmcgcGF0Y2hlcwogQHhyZWZ7Q3JlYXRpbmcgcGF0Y2hlc30sIGZvciBpbnN0cnVjdGlvbnMgb24gY3JlYXRpbmcgcGF0Y2hlcy4KIAotRklYTUU6IHdyaXRlIHBhdGNoIGluc3RydWN0aW9ucworQGtiZHtjZH0gdG8gdGhlIHRvcCBzb3VyY2UgZGlyZWN0b3J5IGZvciBXaW5lLCBhbmQgcnVuIAorQGNvZGV7cGF0Y2ggLXAxIDwgQHZhcntwYXRjaGZpbGV9fS4KK1doYXQgbmVlZHMgdG8gYmUgZG9uZSBuZXh0IGRlcGVuZHMgdG8gc29tZSBleHRlbnQgb24gd2hhdCB0aGUKK3BhdGNoIHRvdWNoZXMuIEZvciBzbWFsbCBwYXRjaGVzIHdoaWNoIG9ubHkgYWx0ZXIgQyBzb3VyY2UsIGl0IGNhbiBiZQorZW5vdWdoIHRvIHJlcnVuIEBjb2Rle21ha2V9LiBJbiBnZW5lcmFsLCB0aGUgc2VxdWVuY2UgQGNvZGV7Y29uZmlndXJlfSwKK0Bjb2Rle21ha2UgZGVwZW5kfSwgQGNvZGV7bWFrZX0gaXMgc3VmZmljaWVudCwgdW5sZXNzIHRoZSBwYXRjaCBhbHRlcnMKK0Bjb2Rle1tjb25maWcuaW5dfSwgaW4gd2hpY2ggY2FzZSB5b3UgbXVzdCByZWdlbmVyYXRlIEBjb2Rle2NvbmZpZ3VyZX0KK3ZpYSBAY29kZXttYWtlIGNvbmZpZ3VyZX0gKHdoaWNoIGp1c3QgcnVucyBAY29kZXthdXRvY29uZn0pLgogCiAKIEBub2RlIFRoZSBXaW5lIFByb2plY3QsICwgSW5zdGFsbGF0aW9uLCBUb3AKQEAgLTE4NDIsNyArMTg0OCw3IEBACiBlbXVsYXRvciwgdGhleSB3b24ndC4KIAogWW91IHRoZXJlZm9yZSBoYXZlIHRvIGFjY2VzcyBhbGwgZnVuY3Rpb25zIGFuZCBkYXRhIHR5cGVzIGJ5IHRoZWlyIGZ1bGwKLW5hbWVzLCB3aXRoIHRoZSBwcm9wZXIgc3VmZml4IGV4cGxpY2l0ZWx5IGFwcGVuZGVkLiBJbiBXaW5lLCB0aGUgMTYgYml0CituYW1lcywgd2l0aCB0aGUgcHJvcGVyIHN1ZmZpeCBleHBsaWNpdGx5IGFwcGVuZGVkLiBJbiBXaW5lLCB0aGUgMTYgYml0CiBhbmQgMzIgYml0IHZlcnNpb25zIG9mIHRoZSBmdW5jdGlvbnMgYXJlIGRpc3RpbmN0IGVudGl0aWVzLCB3aGljaCBtaWdodAogKHRoZW9yZXRpY2FsbHkpIHNob3cgYSBjb21wbGV0ZWx5IGRpZmZlcmVudCBiZWhhdmlvdXIuIFRoZXkgbWF5IGV2ZW4KIGNhbGwgZWFjaCBvdGhlciAoYW5kIHRoZXkgd2lsbCBxdWl0ZSBmcmVxdWVudGx5KS4KQEAgLTE4NTgsNyArMTg2NCwyMCBAQAogQHNlY3Rpb24gQ3JlYXRpbmcgcGF0Y2hlcwogQHhyZWZ7QXBwbHlpbmcgcGF0Y2hlc30sIGZvciBpbnN0cnVjdGlvbnMgb24gYXBwbHlpbmcgcGF0Y2hlcy4KIAotRklYTUU6IGhvdyB0byBjcmVhdGUgcGF0Y2hlcworUGF0Y2hlcyBhcmUgY3JlYXRlZCB3aXRoIHRoZSBwcm9ncmFtIEBjb2Rle2RpZmZ9LiBZb3UgbmVlZCBhIGNvcHkKK29mIGNsZWFuIHNvdXJjZSB0cmVlIHRvIGRpZmYgYWdhaW5zdC4gVGhlIEBzYW1wey11fSBvcHRpb24sIHRvIGNyZWF0ZSAKK3VuaWZpZWQgZGlmZnMsIGlzIHBvcHVsYXIgYnV0IG5vdCBvYmxpZ2F0b3J5LgorRm9yIGNoYW5nZXMgdG8gYSBzaW5nbGUgZmlsZSwKK0Bjb2Rle2RpZmYgLXUgd2luZTk5MDEwMS93aW5kb3dzL3dpbi5jIG15d2luZS93aW5kb3dzL3dpbi5jID4gd2luX3BhdGNofQoraXMgc3VmZmljaWVudC4KK1RvIGdlbmVyYXRlIGEgY29tcGxldGUgZGlmZiBiZXR3ZWVuIHlvdXIgdHJlZSBhbmQgdGhlIGRpc3RyaWJ1dGlvbiwKK3VzZSBAY29kZXtkaWZmIC11UiB3aW5lOTkwMTAxIG15d2luZX0uCisKK1RoaXMgYXNzdW1lcyB0aGF0IHRoZSBvcmlnaW5hbCBkaXN0cmlidXRpb24gYW5kIHlvdXIgcGVyc29uYWwgdHJlZQoraGF2ZSB0aGUgc2FtZSBwYXJlbnQgZGlyZWN0b3J5LCBmcm9tIHdoaWNoIHlvdSBtYWtlIHRoZSBkaWZmLgorVGhpcyBlbnN1cmVzIGEgY29uc2lzdGVudCBmb3JtYXQgZm9yIHRoZSBkaWZmcywgd2hpY2ggaW4gdHVybgoraXMgbmVjZXNzYXJ5IHNvIHRoYXQgdGhleSBjYW4gYmUgYXBwbGllZCBjb25zaXN0ZW50bHkgYXMgZGVzY3JpYmVkIGluCitAeHJlZntBcHBseWluZyBwYXRjaGVzfS4KIAogQG5vZGUgQWRkaW5nIERvY3VtZW50YXRpb24sIEZpbGUgbmFtZXMsIENyZWF0aW5nIHBhdGNoZXMsIFRoZSBXaW5lIFByb2plY3QKIEBzZWN0aW9uIEFkZGluZyBEb2N1bWVudGF0aW9uCmRpZmYgLS1naXQgYS9maWxlcy9kaXJlY3RvcnkuYyBiL2ZpbGVzL2RpcmVjdG9yeS5jCmluZGV4IGY3NDBmM2UuLmRhZmVjOTYgMTAwNjQ0Ci0tLSBhL2ZpbGVzL2RpcmVjdG9yeS5jCisrKyBiL2ZpbGVzL2RpcmVjdG9yeS5jCkBAIC0xOCw3ICsxOCw2IEBACiAjaW5jbHVkZSAiaGVhcC5oIgogI2luY2x1ZGUgIm1zZG9zLmgiCiAjaW5jbHVkZSAib3B0aW9ucy5oIgotI2luY2x1ZGUgInN0ZGRlYnVnLmgiCiAjaW5jbHVkZSAiZGVidWcuaCIKIAogI2RlZmluZSBNQVhfUEFUSF9FTEVNRU5UUyAyMApAQCAtOTcsMTAgKzk2LDEwIEBACiAgICAgICAgIERJUl9QYXRoRWxlbWVudHMrKzsKICAgICB9CiAKLSAgICBpZiAoZGVidWdnaW5nX2Rvc2ZzKQorICAgIGlmIChkZWJ1Z2dpbmdfaW5mbyhkb3NmcykpCiAgICAgICAgIGZvciAoaSA9IDA7IGkgPCBESVJfUGF0aEVsZW1lbnRzOyBpKyspCiAgICAgICAgIHsKLSAgICAgICAgICAgIGRwcmludGZfZG9zZnMoIHN0ZGRlYiwgIlBhdGhbJWRdOiAlcyA9ICVzXG4iLAorICAgICAgICAgICAgZHByaW50Zl9pbmZvKGRvc2ZzLCAiUGF0aFslZF06ICVzID0gJXNcbiIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpLCBESVJfRG9zUGF0aFtpXSwgRElSX1VuaXhQYXRoW2ldICk7CiAgICAgICAgIH0KIH0KQEAgLTE1Niw5ICsxNTUsOSBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXRoLCBzaXplb2YocGF0aCkgKTsKICAgICBESVJfUGFyc2VXaW5kb3dzUGF0aCggcGF0aCApOwogCi0gICAgZHByaW50Zl9kb3Nmcyggc3RkZGViLCAiV2luZG93c0RpciA9ICVzXG5TeXN0ZW1EaXIgID0gJXNcbiIsCisgICAgZHByaW50Zl9pbmZvKGRvc2ZzLCAiV2luZG93c0RpciA9ICVzXG5TeXN0ZW1EaXIgID0gJXNcbiIsCiAgICAgICAgICAgICAgICAgICAgRElSX1dpbmRvd3NEb3NEaXIsIERJUl9TeXN0ZW1Eb3NEaXIgKTsKLSAgICBkcHJpbnRmX2Rvc2ZzKCBzdGRkZWIsICJUZW1wRGlyICAgID0gJXNcbkN3ZCAgICAgICAgPSAlYzpcXCVzXG4iLAorICAgIGRwcmludGZfaW5mbyhkb3NmcywgIlRlbXBEaXIgICAgPSAlc1xuQ3dkICAgICAgICA9ICVjOlxcJXNcbiIsCiAgICAgICAgICAgICAgICAgICAgRElSX1RlbXBEb3NEaXIsICdBJyArIGRyaXZlLCBEUklWRV9HZXREb3NDd2QoIGRyaXZlICkgKTsKIAogICAgIC8qIFB1dCB0aGUgdGVtcCBhbmQgV2luZG93cyBhbmQgc3lzdGVtIGRpcmVjdG9yaWVzIGludG8gdGhlIGVudmlyb25tZW50ICovCkBAIC0zMjgsNyArMzI3LDcgQEAKICAqLwogQk9PTDE2IFdJTkFQSSBDcmVhdGVEaXJlY3RvcnkxNiggTFBDU1RSIHBhdGgsIExQVk9JRCBkdW1teSApCiB7Ci0gICAgZHByaW50Zl9maWxlKCBzdGRkZWIsIkNyZWF0ZURpcmVjdG9yeTE2KCVzLCVwKVxuIiwgcGF0aCwgZHVtbXkgKTsKKyAgICBkcHJpbnRmX2luZm8oZmlsZSwiQ3JlYXRlRGlyZWN0b3J5MTYoJXMsJXApXG4iLCBwYXRoLCBkdW1teSApOwogICAgIHJldHVybiAoQk9PTDE2KUNyZWF0ZURpcmVjdG9yeTMyQSggcGF0aCwgTlVMTCApOwogfQogCkBAIC0zNDAsMTIgKzMzOSwxMSBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExQU0VDVVJJVFlfQVRUUklCVVRFUyBscHNlY2F0dHJpYnMgKQogewogICAgIERPU19GVUxMX05BTUUgZnVsbF9uYW1lOwotICAgIExQQ1NUUiB1bml4TmFtZTsKIAotICAgIGRwcmludGZfZmlsZSggc3RkZGViLCAiQ3JlYXRlRGlyZWN0b3J5MzJBKCVzLCVwKVxuIiwgcGF0aCwgbHBzZWNhdHRyaWJzICk7Ci0gICAgaWYgKCh1bml4TmFtZSA9IERPU0ZTX0lzRGV2aWNlKCBwYXRoICkpICE9IE5VTEwpCisgICAgZHByaW50Zl9pbmZvKGZpbGUsICJDcmVhdGVEaXJlY3RvcnkzMkEoJXMsJXApXG4iLCBwYXRoLCBscHNlY2F0dHJpYnMgKTsKKyAgICBpZiAoRE9TRlNfSXNEZXZpY2UoIHBhdGggKSkKICAgICB7Ci0gICAgICAgIGRwcmludGZfZmlsZShzdGRkZWIsICJDcmVhdGVEaXJlY3Rvcnk6IGRldmljZSAnJXMnIVxuIiwgdW5peE5hbWUpOworICAgICAgICBkcHJpbnRmX2luZm8oZmlsZSwgIkNyZWF0ZURpcmVjdG9yeTogY2Fubm90IHVzZSBkZXZpY2UgJyVzJyFcbiIscGF0aCk7CiAgICAgICAgIERPU19FUlJPUiggRVJfQWNjZXNzRGVuaWVkLCBFQ19BY2Nlc3NEZW5pZWQsIFNBX0Fib3J0LCBFTF9EaXNrICk7CiAgICAgICAgIHJldHVybiBGQUxTRTsKICAgICB9CkBAIC00MDcsMTMgKzQwNSwxMiBAQAogQk9PTDMyIFdJTkFQSSBSZW1vdmVEaXJlY3RvcnkzMkEoIExQQ1NUUiBwYXRoICkKIHsKICAgICBET1NfRlVMTF9OQU1FIGZ1bGxfbmFtZTsKLSAgICBMUENTVFIgdW5peE5hbWU7CiAKLSAgICBkcHJpbnRmX2ZpbGUoc3RkZGViLCAiUmVtb3ZlRGlyZWN0b3J5OiAnJXMnXG4iLCBwYXRoICk7CisgICAgZHByaW50Zl9pbmZvKGZpbGUsICJSZW1vdmVEaXJlY3Rvcnk6ICclcydcbiIsIHBhdGggKTsKIAotICAgIGlmICgodW5peE5hbWUgPSBET1NGU19Jc0RldmljZSggcGF0aCApKSAhPSBOVUxMKQorICAgIGlmIChET1NGU19Jc0RldmljZSggcGF0aCApKQogICAgIHsKLSAgICAgICAgZHByaW50Zl9maWxlKHN0ZGRlYiwgIlJlbW92ZURpcmVjdG9yeTogZGV2aWNlICclcychXG4iLCB1bml4TmFtZSk7CisgICAgICAgIGRwcmludGZfaW5mbyhmaWxlLCAiUmVtb3ZlRGlyZWN0b3J5OiBjYW5ub3QgcmVtb3ZlIGRldmljZSAnJXMnIVxuIiwgcGF0aCk7CiAgICAgICAgIERPU19FUlJPUiggRVJfRmlsZU5vdEZvdW5kLCBFQ19Ob3RGb3VuZCwgU0FfQWJvcnQsIEVMX0Rpc2sgKTsKICAgICAgICAgcmV0dXJuIEZBTFNFOwogICAgIH0KZGlmZiAtLWdpdCBhL2ZpbGVzL2Rvc19mcy5jIGIvZmlsZXMvZG9zX2ZzLmMKaW5kZXggNWNkOGU3Ni4uNDE2YzVjMCAxMDA2NDQKLS0tIGEvZmlsZXMvZG9zX2ZzLmMKKysrIGIvZmlsZXMvZG9zX2ZzLmMKQEAgLTI3LDcgKzI3LDYgQEAKICNpbmNsdWRlICJmaWxlLmgiCiAjaW5jbHVkZSAiaGVhcC5oIgogI2luY2x1ZGUgIm1zZG9zLmgiCi0jaW5jbHVkZSAic3RkZGVidWcuaCIKICNpbmNsdWRlICJkZWJ1Zy5oIgogCiAvKiBEZWZpbmUgdGhlIFZGQVQgaW9jdGwgdG8gZ2V0IGJvdGggc2hvcnQgYW5kIGxvbmcgZmlsZSBuYW1lcyAqLwpAQCAtNTAsMjAgKzQ5LDggQEAKIC8qIENoYXJzIHdlIGRvbid0IHdhbnQgdG8gc2VlIGluIERPUyBmaWxlIG5hbWVzICovCiAjZGVmaW5lIElOVkFMSURfRE9TX0NIQVJTICAiKj88PnxcIis9LDtbXSBcMzQ1IgogCi1zdGF0aWMgY29uc3QgY2hhciAqRE9TRlNfRGV2aWNlc1tdWzJdID0KLXsKLSAgICB7ICJDT04iLCAgIiIgfSwKLSAgICB7ICJQUk4iLCAgIiIgfSwKLSAgICB7ICJOVUwiLCAgIi9kZXYvbnVsbCIgfSwKLSAgICB7ICJBVVgiLCAgIiIgfSwKLSAgICB7ICJMUFQxIiwgIiIgfSwKLSAgICB7ICJMUFQyIiwgIiIgfSwKLSAgICB7ICJMUFQzIiwgIiIgfSwKLSAgICB7ICJMUFQ0IiwgIiIgfSwKLSAgICB7ICJDT00xIiwgIiIgfSwKLSAgICB7ICJDT00yIiwgIiIgfSwKLSAgICB7ICJDT00zIiwgIiIgfSwKLSAgICB7ICJDT000IiwgIiIgfQorc3RhdGljIGNvbnN0IGNoYXIgKkRPU0ZTX0RldmljZXNbXSA9IHsKKyJDT04iLCJQUk4iLCJOVUwiLCJBVVgiLCJMUFQxIiwiTFBUMiIsIkxQVDMiLCJMUFQ0IiwiQ09NMSIsIkNPTTIiLCJDT00zIiwiQ09NNCIsCiB9OwogCiAKQEAgLTUxMywxMyArNTAwLDEzIEBACiAgICAgaWYgKChwID0gc3RyY2hyKCBuYW1lLCAnXFwnICkpKSBsZW4gPSBNSU4oIChpbnQpKHAgLSBuYW1lKSwgbGVuICk7CiAgICAgaWYgKGxvbmdfbGVuIDwgbGVuICsgMSkgcmV0dXJuIEZBTFNFOwogCi0gICAgZHByaW50Zl9kb3Nmcyggc3RkZGViLCAiRE9TRlNfRmluZFVuaXhOYW1lOiAlcywlc1xuIiwgcGF0aCwgbmFtZSApOworICAgIGRwcmludGZfaW5mbyhkb3NmcywgIkRPU0ZTX0ZpbmRVbml4TmFtZTogJXMsJXNcbiIsIHBhdGgsIG5hbWUgKTsKIAogICAgIGlmICghRE9TRlNfVG9Eb3NGQ0JGb3JtYXQoIG5hbWUsIGRvc19uYW1lICkpIGRvc19uYW1lWzBdID0gJ1wwJzsKIAogICAgIGlmICghKGRpciA9IERPU0ZTX09wZW5EaXIoIHBhdGggKSkpCiAgICAgewotICAgICAgICBkcHJpbnRmX2Rvc2ZzKCBzdGRkZWIsICJET1NGU19GaW5kVW5peE5hbWUoJXMsJXMpOiBjYW4ndCBvcGVuIGRpcjogJXNcbiIsCisgICAgICAgIGRwcmludGZfd2Fybihkb3NmcywgIkRPU0ZTX0ZpbmRVbml4TmFtZSglcywlcyk6IGNhbid0IG9wZW4gZGlyOiAlc1xuIiwKICAgICAgICAgICAgICAgICAgICAgICAgcGF0aCwgbmFtZSwgc3RyZXJyb3IoZXJybm8pICk7CiAgICAgICAgIHJldHVybiBGQUxTRTsKICAgICB9CkBAIC01NTksMTIgKzU0NiwxMSBAQAogICAgICAgICAgICAgZWxzZQogICAgICAgICAgICAgICAgIERPU0ZTX0hhc2goIGxvbmdfbmFtZSwgc2hvcnRfYnVmLCBGQUxTRSwgaWdub3JlX2Nhc2UgKTsKICAgICAgICAgfQotICAgICAgICBkcHJpbnRmX2Rvc2ZzKCBzdGRkZWIsICJET1NGU19GaW5kVW5peE5hbWUoJXMsJXMpIC0+ICVzICglcylcbiIsCi0gICAgICAgICAgICAgICAgICAgICAgIHBhdGgsIG5hbWUsIGxvbmdfbmFtZSwgc2hvcnRfYnVmID8gc2hvcnRfYnVmIDogIioqKiIpOworICAgICAgICBkcHJpbnRmX2luZm8oZG9zZnMsICIoJXMsJXMpIC0+ICVzICglcylcbiIsCisJCSAgICAgcGF0aCwgbmFtZSwgbG9uZ19uYW1lLCBzaG9ydF9idWYgPyBzaG9ydF9idWYgOiAiKioqIik7CiAgICAgfQogICAgIGVsc2UKLSAgICAgICAgZHByaW50Zl9kb3NmcyhzdGRkZWIsIkRPU0ZTX0ZpbmRVbml4TmFtZSglcywlcykgLT4gKiogTm90IGZvdW5kICoqXG4iLAotICAgICAgICAgICAgICAgICAgICAgIHBhdGgsIG5hbWUgKTsKKyAgICAgICAgZHByaW50Zl93YXJuKGRvc2ZzLCAiZmlsZTogJyVzJyBOT1QgRk9VTkQgaW4gZGlyOiAnJXMnXG4iLCBuYW1lLCBwYXRoKTsKICAgICBET1NGU19DbG9zZURpciggZGlyICk7CiAgICAgcmV0dXJuIHJldDsKIH0KQEAgLTU3MywxMCArNTU5LDM0IEBACiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICAqICAgICAgICAgICBET1NGU19Jc0RldmljZQogICoKLSAqIENoZWNrIGlmIGEgRE9TIGZpbGUgbmFtZSByZXByZXNlbnRzIGEgRE9TIGRldmljZS4gUmV0dXJucyB0aGUgbmFtZQotICogb2YgdGhlIGFzc29jaWF0ZWQgVW5peCBkZXZpY2UsIG9yIE5VTEwgaWYgbm90IGZvdW5kLgorICogQ2hlY2sgaWYgYSBET1MgZmlsZSBuYW1lIHJlcHJlc2VudHMgYSBET1MgZGV2aWNlLgogICovCi1jb25zdCBjaGFyICpET1NGU19Jc0RldmljZSggY29uc3QgY2hhciAqbmFtZSApCitCT09MMzIgRE9TRlNfSXNEZXZpY2UoIGNvbnN0IGNoYXIgKm5hbWUgKQoreworICAgIGludAlpOworICAgIGNvbnN0IGNoYXIgKnA7CisKKyAgICBpZiAobmFtZVswXSAmJiAobmFtZVsxXSA9PSAnOicpKSBuYW1lICs9IDI7CisgICAgaWYgKChwID0gc3RycmNociggbmFtZSwgJy8nICkpKSBuYW1lID0gcCArIDE7CisgICAgaWYgKChwID0gc3RycmNociggbmFtZSwgJ1xcJyApKSkgbmFtZSA9IHAgKyAxOworICAgIGZvciAoaSA9IDA7IGkgPCBzaXplb2YoRE9TRlNfRGV2aWNlcykvc2l6ZW9mKERPU0ZTX0RldmljZXNbMF0pOyBpKyspCisgICAgeworICAgICAgICBjb25zdCBjaGFyICpkZXYgPSBET1NGU19EZXZpY2VzW2ldOworICAgICAgICBpZiAoIWxzdHJuY21waTMyQSggZGV2LCBuYW1lLCBzdHJsZW4oZGV2KSApKQorICAgICAgICB7CisgICAgICAgICAgICBwID0gbmFtZSArIHN0cmxlbiggZGV2ICk7CisgICAgICAgICAgICBpZiAoISpwIHx8ICgqcCA9PSAnLicpKSByZXR1cm4gVFJVRTsKKyAgICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gRkFMU0U7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogICAgICAgICAgIERPU0ZTX09wZW5EZXZpY2UKKyAqCisgKiBPcGVuIGEgRE9TIGRldmljZS4gVGhpcyBtaWdodCBub3QgbWFwIDE6MSBpbnRvIHRoZSBVTklYIGRldmljZSBjb25jZXB0LgorICovCitIRklMRTMyIERPU0ZTX09wZW5EZXZpY2UoIGNvbnN0IGNoYXIgKm5hbWUsIGludCB1bml4bW9kZSApCiB7CiAgICAgaW50IGk7CiAgICAgY29uc3QgY2hhciAqcDsKQEAgLTU4NiwxNiArNTk2LDM3IEBACiAgICAgaWYgKChwID0gc3RycmNociggbmFtZSwgJ1xcJyApKSkgbmFtZSA9IHAgKyAxOwogICAgIGZvciAoaSA9IDA7IGkgPCBzaXplb2YoRE9TRlNfRGV2aWNlcykvc2l6ZW9mKERPU0ZTX0RldmljZXNbMF0pOyBpKyspCiAgICAgewotICAgICAgICBjb25zdCBjaGFyICpkZXYgPSBET1NGU19EZXZpY2VzW2ldWzBdOworICAgICAgICBjb25zdCBjaGFyICpkZXYgPSBET1NGU19EZXZpY2VzW2ldOwogICAgICAgICBpZiAoIWxzdHJuY21waTMyQSggZGV2LCBuYW1lLCBzdHJsZW4oZGV2KSApKQogICAgICAgICB7CiAgICAgICAgICAgICBwID0gbmFtZSArIHN0cmxlbiggZGV2ICk7Ci0gICAgICAgICAgICBpZiAoISpwIHx8ICgqcCA9PSAnLicpKSByZXR1cm4gRE9TRlNfRGV2aWNlc1tpXVsxXTsKKyAgICAgICAgICAgIGlmICghKnAgfHwgKCpwID09ICcuJykpIHsKKwkgICAgCS8qIGdvdCBpdCAqLworCQlpZiAoIXN0cmNtcChET1NGU19EZXZpY2VzW2ldLCJOVUwiKSkKKwkJCXJldHVybiBGSUxFX09wZW5Vbml4RmlsZSgiL2Rldi9udWxsIix1bml4bW9kZSk7CisJCWlmICghc3RyY21wKERPU0ZTX0RldmljZXNbaV0sIkNPTiIpKSB7CisJCQlzd2l0Y2ggKHVuaXhtb2RlKSB7CisJCQljYXNlIE9fUkRPTkxZOgorCQkJCXJldHVybiBHZXRTdGRIYW5kbGUoIFNURF9JTlBVVF9IQU5ETEUgKTsKKwkJCQlicmVhazsKKwkJCWNhc2UgT19XUk9OTFk6CisJCQkJcmV0dXJuIEdldFN0ZEhhbmRsZSggU1REX09VVFBVVF9IQU5ETEUgKTsKKwkJCQlicmVhazsKKwkJCWRlZmF1bHQ6CisJCQkJZnByaW50ZihzdGRlcnIsIkRPU0ZTX09wZW5EZXZpY2U6IENPTiBjYW5ub3QgYmUgb3BlbmVkIHJlYWQvd3JpdGUgY3VycmVudGx5LCBGSVhNRS5cbiIpOworCQkJCXJldHVybiBIRklMRV9FUlJPUjMyOworCQkJCWJyZWFrOworCQkJfQorCQl9CisJCS8qIEZJWE1FOiB0aGUgcmVzdCBvZiB0aGUgZGV2aWNlcyAuLi4gbHB0WCwgY29tWCBldC5hbC4gKi8KKyAgICAJCXJldHVybiBIRklMRV9FUlJPUjMyOworCSAgICB9CiAgICAgICAgIH0KICAgICB9Ci0gICAgcmV0dXJuIE5VTEw7CisgICAgcmV0dXJuIEhGSUxFX0VSUk9SMzI7CiB9CiAKKwogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgKiAgICAgICAgICAgRE9TRlNfR2V0UGF0aERyaXZlCiAgKgpAQCAtNjQ4LDcgKzY3OSw3IEBACiAgICAgVUlOVDMyIGZsYWdzOwogICAgIGNoYXIgKnBfbCwgKnBfcywgKnJvb3Q7CiAKLSAgICBkcHJpbnRmX2Rvc2ZzKCBzdGRkZWIsICJET1NGU19HZXRGdWxsTmFtZTogJXMgKGxhc3Q9JWQpXG4iLAorICAgIGRwcmludGZfaW5mbyhkb3NmcywgIkRPU0ZTX0dldEZ1bGxOYW1lOiAlcyAobGFzdD0lZClcbiIsCiAgICAgICAgICAgICAgICAgICAgbmFtZSwgY2hlY2tfbGFzdCApOwogCiAgICAgaWYgKChmdWxsLT5kcml2ZSA9IERPU0ZTX0dldFBhdGhEcml2ZSggJm5hbWUgKSkgPT0gLTEpIHJldHVybiBGQUxTRTsKQEAgLTc1Niw3ICs3ODcsNyBAQAogICAgIH0KICAgICBpZiAoIWZ1bGwtPmxvbmdfbmFtZVswXSkgc3RyY3B5KCBmdWxsLT5sb25nX25hbWUsICIvIiApOwogICAgIGlmICghZnVsbC0+c2hvcnRfbmFtZVsyXSkgc3RyY3B5KCBmdWxsLT5zaG9ydF9uYW1lICsgMiwgIlxcIiApOwotICAgIGRwcmludGZfZG9zZnMoIHN0ZGRlYiwgIkRPU0ZTX0dldEZ1bGxOYW1lOiByZXR1cm5pbmcgJXMgPSAlc1xuIiwKKyAgICBkcHJpbnRmX2luZm8oZG9zZnMsICJET1NGU19HZXRGdWxsTmFtZTogcmV0dXJuaW5nICVzID0gJXNcbiIsCiAgICAgICAgICAgICAgICAgICAgZnVsbC0+bG9uZ19uYW1lLCBmdWxsLT5zaG9ydF9uYW1lICk7CiAgICAgcmV0dXJuIFRSVUU7CiB9CkBAIC04NDYsNyArODc3LDcgQEAKICAgICBpbnQgZHJpdmU7CiAgICAgY2hhciAqcDsKIAotICAgIGRwcmludGZfZG9zZnMoIHN0ZGRlYiwgIkdldEZ1bGxQYXRoTmFtZTogY29udmVydGluZyAlc1xuIiwgbmFtZSApOworICAgIGRwcmludGZfaW5mbyhkb3NmcywgIkdldEZ1bGxQYXRoTmFtZTogY29udmVydGluZyAlc1xuIiwgbmFtZSApOwogCiAgICAgaWYgKCFuYW1lIHx8ICFyZXN1bHQpIHJldHVybiAwOwogCkBAIC05MTAsNyArOTQxLDcgQEAKICAgICBpZiAodW5pY29kZSkgbHN0cmNweW5BdG9XKCAoTFBXU1RSKXJlc3VsdCwgYnVmZmVyLCBsZW4gKTsKICAgICBlbHNlIGxzdHJjcHluMzJBKCByZXN1bHQsIGJ1ZmZlciwgbGVuICk7CiAKLSAgICBkcHJpbnRmX2Rvc2ZzKCBzdGRkZWIsICJHZXRGdWxsUGF0aE5hbWU6IHJldHVybmluZyAlc1xuIiwgYnVmZmVyICk7CisgICAgZHByaW50Zl9pbmZvKGRvc2ZzLCAiR2V0RnVsbFBhdGhOYW1lOiByZXR1cm5pbmcgJXNcbiIsIGJ1ZmZlciApOwogICAgIHJldHVybiBzdHJsZW4oYnVmZmVyKTsKIH0KIApAQCAtOTk1LDcgKzEwMjYsNyBAQAogICAgIGVsc2UgIC8qIE5vdCBpbiB0aGUgY2FjaGUsIG9wZW4gaXQgYW5ldyAqLwogICAgIHsKICAgICAgICAgY29uc3QgY2hhciAqZHJpdmVfcGF0aDsKLSAgICAgICAgZHByaW50Zl9kb3Nmcyggc3RkZGViLCAiRE9TRlNfRmluZE5leHQ6IGNhY2hlIG1pc3MsIHBhdGg9JXMgc2tpcD0lZCBidWY9JXMgY3VyPSVkXG4iLAorICAgICAgICBkcHJpbnRmX2luZm8oZG9zZnMsICJET1NGU19GaW5kTmV4dDogY2FjaGUgbWlzcywgcGF0aD0lcyBza2lwPSVkIGJ1Zj0lcyBjdXI9JWRcbiIsCiAgICAgICAgICAgICAgICAgICAgICAgIHBhdGgsIHNraXAsIGJ1ZmZlciwgY3VyX3BvcyApOwogICAgICAgICBjdXJfcG9zID0gc2tpcDsKICAgICAgICAgaWYgKGRpcikgRE9TRlNfQ2xvc2VEaXIoZGlyKTsKQEAgLTEwMDQsNyArMTAzNSw3IEBACiAgICAgICAgIGRyaXZlX3BhdGggPSBwYXRoICsgc3RybGVuKERSSVZFX0dldFJvb3QoZHJpdmUpKTsKICAgICAgICAgd2hpbGUgKCgqZHJpdmVfcGF0aCA9PSAnLycpIHx8ICgqZHJpdmVfcGF0aCA9PSAnXFwnKSkgZHJpdmVfcGF0aCsrOwogICAgICAgICBkcml2ZV9yb290ID0gISpkcml2ZV9wYXRoOwotICAgICAgICBkcHJpbnRmX2Rvc2ZzKHN0ZGRlYiwgIkRPU0ZTX0ZpbmROZXh0OiBkcml2ZV9yb290ID0gJWRcbiIsIGRyaXZlX3Jvb3QpOworICAgICAgICBkcHJpbnRmX2luZm8oZG9zZnMsICJET1NGU19GaW5kTmV4dDogZHJpdmVfcm9vdCA9ICVkXG4iLCBkcml2ZV9yb290KTsKICAgICAgICAgbHN0cmNweW4zMkEoIGJ1ZmZlciwgcGF0aCwgc2l6ZW9mKGJ1ZmZlcikgLSAxICk7CiAgICAgfQogICAgIHN0cmNhdCggYnVmZmVyLCAiLyIgKTsKQEAgLTEwNzAsNyArMTEwMSw3IEBACiAKICAgICAgICAgbHN0cmNweW4zMkEoIGVudHJ5LT5jRmlsZU5hbWUsIGxvbmdfbmFtZSwgc2l6ZW9mKGVudHJ5LT5jRmlsZU5hbWUpICk7CiAgICAgICAgIGlmICghKGZsYWdzICYgRFJJVkVfQ0FTRV9QUkVTRVJWSU5HKSkgQ2hhckxvd2VyMzJBKCBlbnRyeS0+Y0ZpbGVOYW1lICk7Ci0gICAgICAgIGRwcmludGZfZG9zZnMoIHN0ZGRlYiwgIkRPU0ZTX0ZpbmROZXh0OiByZXR1cm5pbmcgJXMgKCVzKSAlMDJseCAlbGRcbiIsCisgICAgICAgIGRwcmludGZfaW5mbyhkb3NmcywgIkRPU0ZTX0ZpbmROZXh0OiByZXR1cm5pbmcgJXMgKCVzKSAlMDJseCAlbGRcbiIsCiAgICAgICAgICAgICAgICAgICAgICAgIGVudHJ5LT5jRmlsZU5hbWUsIGVudHJ5LT5jQWx0ZXJuYXRlRmlsZU5hbWUsCiAgICAgICAgICAgICAgICAgICAgICAgIGVudHJ5LT5kd0ZpbGVBdHRyaWJ1dGVzLCBlbnRyeS0+bkZpbGVTaXplTG93ICk7CiAgICAgICAgIGN1cl9wb3MgKz0gY291bnQ7CkBAIC0xNTM3LDcgKzE1NjgsNyBAQAogICAgIHRpbWVfdCB4dGltZSA9IERPU0ZTX0ZpbGVUaW1lVG9Vbml4VGltZSggZnQsICZyZW1haW5kZXIgKTsKICAgICB4dG0gPSBnbXRpbWUoJnh0aW1lKTsKICAgICBzeXN0LT53WWVhciAgICAgICAgID0geHRtLT50bV95ZWFyOwotICAgIHN5c3QtPndNb250aCAgICAgICAgPSB4dG0tPnRtX21vbjsKKyAgICBzeXN0LT53TW9udGggICAgICAgID0geHRtLT50bV9tb24gKyAxOwogICAgIHN5c3QtPndEYXlPZldlZWsgICAgPSB4dG0tPnRtX3dkYXk7CiAgICAgc3lzdC0+d0RheQkgICAgICAgID0geHRtLT50bV9tZGF5OwogICAgIHN5c3QtPndIb3VyCSAgICAgICAgPSB4dG0tPnRtX2hvdXI7CkBAIC0xNTU3LDcgKzE1ODgsNyBAQAogICAgIExQU1RSIHM7CiAgICAgY2hhciAgYnVmZmVyWzIwMF07CiAKLSAgICBkcHJpbnRmX2Rvc2ZzKHN0ZGRlYiwiUXVlcnlEb3NEZXZpY2UoJXMsLi4uKVxuIixkZXZuYW1lP2Rldm5hbWU6IjxudWxsPiIpOworICAgIGRwcmludGZfaW5mbyhkb3NmcywiUXVlcnlEb3NEZXZpY2UoJXMsLi4uKVxuIixkZXZuYW1lP2Rldm5hbWU6IjxudWxsPiIpOwogICAgIGlmICghZGV2bmFtZSkgewogCS8qIHJldHVybiBrbm93biBNU0RPUyBkZXZpY2VzICovCiAJbHN0cmNweTMyQShidWZmZXIsIkNPTiBDT00xIENPTTIgTFBUMSBOVUwgIik7CkBAIC0xNjAxLDcgKzE2MzIsNyBAQAogICAgIHN0cnVjdCB0bSB4dG07CiAKICAgICB4dG0udG1feWVhcgk9IHN5c3QtPndZZWFyOwotICAgIHh0bS50bV9tb24JPSBzeXN0LT53TW9udGg7CisgICAgeHRtLnRtX21vbgk9IHN5c3QtPndNb250aCAtIDE7CiAgICAgeHRtLnRtX3dkYXkJPSBzeXN0LT53RGF5T2ZXZWVrOwogICAgIHh0bS50bV9tZGF5CT0gc3lzdC0+d0RheTsKICAgICB4dG0udG1faG91cgk9IHN5c3QtPndIb3VyOwpkaWZmIC0tZ2l0IGEvZmlsZXMvZHJpdmUuYyBiL2ZpbGVzL2RyaXZlLmMKaW5kZXggY2RiN2Q5Yy4uMzUyNjZjZCAxMDA2NDQKLS0tIGEvZmlsZXMvZHJpdmUuYworKysgYi9maWxlcy9kcml2ZS5jCkBAIC0zMyw3ICszMyw2IEBACiAjaW5jbHVkZSAibXNkb3MuaCIKICNpbmNsdWRlICJvcHRpb25zLmgiCiAjaW5jbHVkZSAidGFzay5oIgotI2luY2x1ZGUgInN0ZGRlYnVnLmgiCiAjaW5jbHVkZSAiZGVidWcuaCIKIAogdHlwZWRlZiBzdHJ1Y3QKQEAgLTE5NCwxMiArMTkzLDEyIEBACiAgICAgICAgICAgICAgICAgRFJJVkVfQ3VyRHJpdmUgPSBpOwogCiAgICAgICAgICAgICBjb3VudCsrOwotICAgICAgICAgICAgZHByaW50Zl9kb3Nmcyggc3RkZGViLCAiJXM6IHBhdGg9JXMgdHlwZT0lcyBsYWJlbD0nJXMnIHNlcmlhbD0lMDhseCBmbGFncz0lMDh4IGRldj0leCBpbm89JXhcbiIsCisgICAgICAgICAgICBkcHJpbnRmX2luZm8oZG9zZnMsICIlczogcGF0aD0lcyB0eXBlPSVzIGxhYmVsPSclcycgc2VyaWFsPSUwOGx4IGZsYWdzPSUwOHggZGV2PSV4IGlubz0leFxuIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5hbWUsIHBhdGgsIERSSVZFX1R5cGVzW2RyaXZlLT50eXBlXSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRyaXZlLT5sYWJlbCwgZHJpdmUtPnNlcmlhbCwgZHJpdmUtPmZsYWdzLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgKGludClkcml2ZS0+ZGV2LCAoaW50KWRyaXZlLT5pbm8gKTsKICAgICAgICAgfQotICAgICAgICBlbHNlIGRwcmludGZfZG9zZnMoIHN0ZGRlYiwgIiVzOiBub3QgZGVmaW5lZFxuIiwgbmFtZSApOworICAgICAgICBlbHNlIGRwcmludGZfd2Fybihkb3NmcywgIiVzOiBub3QgZGVmaW5lZFxuIiwgbmFtZSApOwogICAgIH0KIAogICAgIGlmICghY291bnQpIApAQCAtMjY2LDcgKzI2NSw3IEBACiAgICAgICAgIERPU19FUlJPUiggRVJfSW52YWxpZERyaXZlLCBFQ19NZWRpYUVycm9yLCBTQV9BYm9ydCwgRUxfRGlzayApOwogICAgICAgICByZXR1cm4gMDsKICAgICB9Ci0gICAgZHByaW50Zl9kb3Nmcyggc3RkZGViLCAiRFJJVkVfU2V0Q3VycmVudERyaXZlOiAlYzpcbiIsICdBJyArIGRyaXZlICk7CisgICAgZHByaW50Zl9pbmZvKGRvc2ZzLCAiRFJJVkVfU2V0Q3VycmVudERyaXZlOiAlYzpcbiIsICdBJyArIGRyaXZlICk7CiAgICAgRFJJVkVfQ3VyRHJpdmUgPSBkcml2ZTsKICAgICBpZiAocFRhc2spIHBUYXNrLT5jdXJkcml2ZSA9IGRyaXZlIHwgMHg4MDsKICAgICByZXR1cm4gMTsKQEAgLTMyNiw3ICszMjUsNyBAQAogICAgICpuZXh0ID0gMDsKIAogICAgIGlmIChyb290ZHJpdmUgIT0gLTEpCi0gICAgICAgIGRwcmludGZfZG9zZnMoIHN0ZGRlYiwgIkRSSVZFX0ZpbmREcml2ZVJvb3Q6ICVzIC0+IGRyaXZlICVjOiwgcm9vdD0nJXMnLCBuYW1lPSclcydcbiIsCisgICAgICAgIGRwcmludGZfaW5mbyhkb3NmcywgIkRSSVZFX0ZpbmREcml2ZVJvb3Q6ICVzIC0+IGRyaXZlICVjOiwgcm9vdD0nJXMnLCBuYW1lPSclcydcbiIsCiAgICAgICAgICAgICAgICAgICAgICAgIGJ1ZmZlciwgJ0EnICsgcm9vdGRyaXZlLAogICAgICAgICAgICAgICAgICAgICAgICBET1NEcml2ZXNbcm9vdGRyaXZlXS5yb290LCAqcGF0aCApOwogICAgIHJldHVybiByb290ZHJpdmU7CkBAIC00NDcsNyArNDQ2LDcgQEAKICAgICBCWV9IQU5ETEVfRklMRV9JTkZPUk1BVElPTiBpbmZvOwogICAgIFREQiAqcFRhc2sgPSAoVERCICopR2xvYmFsTG9jazE2KCBHZXRDdXJyZW50VGFzaygpICk7CiAKLSAgICBkcHJpbnRmX2Rvc2ZzKCBzdGRkZWIsICJEUklWRV9DaGRpciglYzosJXMpXG4iLCAnQScgKyBkcml2ZSwgcGF0aCApOworICAgIGRwcmludGZfaW5mbyhkb3NmcywgIkRSSVZFX0NoZGlyKCVjOiwlcylcbiIsICdBJyArIGRyaXZlLCBwYXRoICk7CiAgICAgc3RyY3B5KCBidWZmZXIsICJBOiIgKTsKICAgICBidWZmZXJbMF0gKz0gZHJpdmU7CiAgICAgbHN0cmNweW4zMkEoIGJ1ZmZlciArIDIsIHBhdGgsIHNpemVvZihidWZmZXIpIC0gMiApOwpAQCAtNDYyLDcgKzQ2MSw3IEBACiAgICAgdW5peF9jd2QgPSBmdWxsX25hbWUubG9uZ19uYW1lICsgc3RybGVuKCBET1NEcml2ZXNbZHJpdmVdLnJvb3QgKTsKICAgICB3aGlsZSAoKnVuaXhfY3dkID09ICcvJykgdW5peF9jd2QrKzsKIAotICAgIGRwcmludGZfZG9zZnMoIHN0ZGRlYiwgIkRSSVZFX0NoZGlyKCVjOik6IHVuaXhfY3dkPSVzIGRvc19jd2Q9JXNcbiIsCisgICAgZHByaW50Zl9pbmZvKGRvc2ZzLCAiRFJJVkVfQ2hkaXIoJWM6KTogdW5peF9jd2Q9JXMgZG9zX2N3ZD0lc1xuIiwKICAgICAgICAgICAgICAgICAgICAnQScgKyBkcml2ZSwgdW5peF9jd2QsIGZ1bGxfbmFtZS5zaG9ydF9uYW1lICsgMyApOwogCiAgICAgSGVhcEZyZWUoIFN5c3RlbUhlYXAsIDAsIERPU0RyaXZlc1tkcml2ZV0uZG9zX2N3ZCApOwpAQCAtNTM1LDcgKzUzNCw3IEBACiAKICAgICBpZiAoIG5ldy0+cm9vdCApCiAgICAgewotICAgICAgICBkcHJpbnRmX2Rvc2ZzICggc3RkZGViLCAiQ2FuXCd0IG1hcCBkcml2ZSAlYyB0byBkcml2ZSAlYyAtICIKKyAgICAgICAgZHByaW50Zl9pbmZvKGRvc2ZzLCAiQ2FuXCd0IG1hcCBkcml2ZSAlYyB0byBkcml2ZSAlYyAtICIKIAkgICAgICAgICAgICAgICAgICAgICAgICAiZHJpdmUgJWMgYWxyZWFkeSBleGlzdHNcbiIsCiAJCQknQScgKyBleGlzdGluZ19kcml2ZSwgJ0EnICsgbmV3X2RyaXZlLAogCQkJJ0EnICsgbmV3X2RyaXZlICk7CkBAIC01NTIsNyArNTUxLDcgQEAKICAgICBuZXctPmRldiA9IG9sZC0+ZGV2OwogICAgIG5ldy0+aW5vID0gb2xkLT5pbm87CiAKLSAgICBkcHJpbnRmX2Rvc2ZzICggc3RkZGViLCAiRHJpdmUgJWMgaXMgbm93IGVxdWFsIHRvIGRyaXZlICVjXG4iLAorICAgIGRwcmludGZfaW5mbyhkb3NmcywgIkRyaXZlICVjIGlzIG5vdyBlcXVhbCB0byBkcml2ZSAlY1xuIiwKICAgICAgICAgICAgICAgICAgICAgJ0EnICsgbmV3X2RyaXZlLCAnQScgKyBleGlzdGluZ19kcml2ZSApOwogCiAgICAgcmV0dXJuIDE7CkBAIC01NjYsNyArNTY1LDcgQEAKICAqLwogaW50IERSSVZFX09wZW5EZXZpY2UoIGludCBkcml2ZSwgaW50IGZsYWdzICkKIHsKLSAgICBpZiAoIURSSVZFX0lzVmFsaWQoIGRyaXZlICkpIHJldHVybiBOVUxMOworICAgIGlmICghRFJJVkVfSXNWYWxpZCggZHJpdmUgKSkgcmV0dXJuIC0xOwogICAgIHJldHVybiBvcGVuKCBET1NEcml2ZXNbZHJpdmVdLmRldmljZSwgZmxhZ3MgKTsKIH0KIApAQCAtNzM1LDcgKzczNCw3IEBACiAgKi8KIFVJTlQxNiBXSU5BUEkgR2V0RHJpdmVUeXBlMTYoIFVJTlQxNiBkcml2ZSApCiB7Ci0gICAgZHByaW50Zl9kb3Nmcyggc3RkZGViLCAiR2V0RHJpdmVUeXBlMTYoJWM6KVxuIiwgJ0EnICsgZHJpdmUgKTsKKyAgICBkcHJpbnRmX2luZm8oZG9zZnMsICJHZXREcml2ZVR5cGUxNiglYzopXG4iLCAnQScgKyBkcml2ZSApOwogICAgIHN3aXRjaChEUklWRV9HZXRUeXBlKGRyaXZlKSkKICAgICB7CiAgICAgY2FzZSBUWVBFX0ZMT1BQWTogIHJldHVybiBEUklWRV9SRU1PVkFCTEU7CkBAIC03NTMsNyArNzUyLDcgQEAKICAqLwogVUlOVDMyIFdJTkFQSSBHZXREcml2ZVR5cGUzMkEoIExQQ1NUUiByb290ICkKIHsKLSAgICBkcHJpbnRmX2Rvc2ZzKCBzdGRkZWIsICJHZXREcml2ZVR5cGUzMkEoJXMpXG4iLCByb290ICk7CisgICAgZHByaW50Zl9pbmZvKGRvc2ZzLCAiR2V0RHJpdmVUeXBlMzJBKCVzKVxuIiwgcm9vdCApOwogICAgIGlmICgocm9vdFsxXSkgJiYgKHJvb3RbMV0gIT0gJzonKSkKICAgICB7CiAgICAgICAgIGZwcmludGYoIHN0ZGVyciwgIkdldERyaXZlVHlwZTMyQTogaW52YWxpZCByb290ICclcydcbiIsIHJvb3QgKTsKZGlmZiAtLWdpdCBhL2ZpbGVzL2ZpbGUuYyBiL2ZpbGVzL2ZpbGUuYwppbmRleCAyOWY5YWJmLi5lMWRlMjE4IDEwMDY0NAotLS0gYS9maWxlcy9maWxlLmMKKysrIGIvZmlsZXMvZmlsZS5jCkBAIC0zMSwxMyArMzEsMTYgQEAKICNpbmNsdWRlICJsZHQuaCIKICNpbmNsdWRlICJwcm9jZXNzLmgiCiAjaW5jbHVkZSAidGFzay5oIgotI2luY2x1ZGUgInN0ZGRlYnVnLmgiCiAjaW5jbHVkZSAiZGVidWcuaCIKIAogI2lmIGRlZmluZWQoTUFQX0FOT05ZTU9VUykgJiYgIWRlZmluZWQoTUFQX0FOT04pCiAjZGVmaW5lIE1BUF9BTk9OIE1BUF9BTk9OWU1PVVMKICNlbmRpZgogCitzdGF0aWMgQk9PTDMyIEZJTEVfUmVhZChLMzJPQkogKnB0ciwgTFBWT0lEIGxwQnVmZmVyLCBEV09SRCBuTnVtYmVyT2ZDaGFycywKKwkJCUxQRFdPUkQgbHBOdW1iZXJPZkNoYXJzLCBMUE9WRVJMQVBQRUQgbHBPdmVybGFwcGVkKTsKK3N0YXRpYyBCT09MMzIgRklMRV9Xcml0ZShLMzJPQkogKnB0ciwgTFBDVk9JRCBscEJ1ZmZlciwgRFdPUkQgbk51bWJlck9mQ2hhcnMsCisJCQkgTFBEV09SRCBscE51bWJlck9mQ2hhcnMsIExQT1ZFUkxBUFBFRCBscE92ZXJsYXBwZWQpOwogc3RhdGljIHZvaWQgRklMRV9EZXN0cm95KCBLMzJPQkogKm9iaiApOwogCiBjb25zdCBLMzJPQkpfT1BTIEZJTEVfT3BzID0KQEAgLTQ3LDYgKzUwLDggQEAKICAgICBOVUxMLCAgICAgICAgICAgICAgLyogc2F0aXNmaWVkICovCiAgICAgTlVMTCwgICAgICAgICAgICAgIC8qIGFkZF93YWl0ICovCiAgICAgTlVMTCwgICAgICAgICAgICAgIC8qIHJlbW92ZV93YWl0ICovCisgICAgRklMRV9SZWFkLAkgICAgICAgIC8qIHJlYWQgKi8KKyAgICBGSUxFX1dyaXRlLCAgICAgICAgLyogd3JpdGUgKi8KICAgICBGSUxFX0Rlc3Ryb3kgICAgICAgLyogZGVzdHJveSAqLwogfTsKIApAQCAtOTIsNiArOTcsNzAgQEAKIH0KIAogCisvKiBGSVhNRTogbHBPdmVybGFwcGVkIGlzIGlnbm9yZWQgKi8KK3N0YXRpYyBCT09MMzIgRklMRV9SZWFkKEszMk9CSiAqcHRyLCBMUFZPSUQgbHBCdWZmZXIsIERXT1JEIG5OdW1iZXJPZkNoYXJzLAorCQkJTFBEV09SRCBscE51bWJlck9mQ2hhcnMsIExQT1ZFUkxBUFBFRCBscE92ZXJsYXBwZWQpCit7CisJRklMRV9PQkpFQ1QgKmZpbGUgPSAoRklMRV9PQkpFQ1QgKilwdHI7CisJaW50IHJlc3VsdDsKKworCWRwcmludGZfaW5mbyhmaWxlLCAiRklMRV9SZWFkOiAlcCAlcCAlbGRcbiIsIHB0ciwgbHBCdWZmZXIsCisgICAgICAgICAgICAgICAgICAgICBuTnVtYmVyT2ZDaGFycyk7CisKKwlpZiAobk51bWJlck9mQ2hhcnMgPT0gMCkgeworCQkqbHBOdW1iZXJPZkNoYXJzID0gMDsgIC8qIEZJWE1FOiBkb2VzIHRoaXMgY2hhbmdlICovCisJCXJldHVybiBUUlVFOworCX0KKworCWlmICgocmVzdWx0ID0gcmVhZChmaWxlLT51bml4X2hhbmRsZSwgbHBCdWZmZXIsIG5OdW1iZXJPZkNoYXJzKSkgPT0gLTEpCisgICAgICAgIHsKKyAgICAgICAgICAgIEZJTEVfU2V0RG9zRXJyb3IoKTsKKyAgICAgICAgICAgIHJldHVybiBGQUxTRTsKKwl9CisJKmxwTnVtYmVyT2ZDaGFycyA9IHJlc3VsdDsKKwlyZXR1cm4gVFJVRTsKK30KKworLyoqCisgKiAgZXhwZXJpbWVudGF0aW9uIHlpZWxkcyB0aGF0IFdyaXRlRmlsZToKKyAqCW8gZG9lcyBub3QgdHJ1bmNhdGUgb24gd3JpdGUgb2YgMAorICoJbyBhbHdheXMgY2hhbmdlcyB0aGUgKmxwTnVtYmVyT2ZDaGFycyB0byBhY3R1YWwgbnVtYmVyIG9mCisgKgkgIGNoYXJhY3RlcnMgd3JpdHRlbgorICoJbyB3cml0ZSBvZiAwIG5OdW1iZXJPZkNoYXJzIHJldHVybnMgVFJVRQorICovCitzdGF0aWMgQk9PTDMyIEZJTEVfV3JpdGUoSzMyT0JKICpwdHIsIExQQ1ZPSUQgbHBCdWZmZXIsIERXT1JEIG5OdW1iZXJPZkNoYXJzLAorCQkJIExQRFdPUkQgbHBOdW1iZXJPZkNoYXJzLCBMUE9WRVJMQVBQRUQgbHBPdmVybGFwcGVkKQoreworCUZJTEVfT0JKRUNUICpmaWxlID0gKEZJTEVfT0JKRUNUICopcHRyOworCWludCByZXN1bHQ7CisKKwlkcHJpbnRmX2luZm8oZmlsZSwgIkZJTEVfV3JpdGU6ICVwICVwICVsZFxuIiwgcHRyLCBscEJ1ZmZlciwKKwkJICAgICAgbk51bWJlck9mQ2hhcnMpOworCisJKmxwTnVtYmVyT2ZDaGFycyA9IDA7IAorCisJLyogRklYTUU6IHRoZXJlIHdhcyBhIGxvb3AgaGVyZSBiZWZvcmUgdGhhdCAKKwkgKiByZXRyaWVkIHdyaXRlcyBhZnRlciBFQUdBSU4sIHdoeT8/PyAtLSBJIGFzc3VtZQorCSAqIGl0IGlzIGJlY2F1c2Ugd2luMzIgZG9lc24ndCBoYXZlIGludGVycnVwdGVkCisJICogc3lzdGVtIGNhbGxzIAorCSAqLworCisJZm9yICg7OykKKyAgICAgICAgeworCQlyZXN1bHQgPSB3cml0ZShmaWxlLT51bml4X2hhbmRsZSwgbHBCdWZmZXIsIG5OdW1iZXJPZkNoYXJzKTsKKwkJaWYgKHJlc3VsdCAhPSAtMSkgeworCQkJKmxwTnVtYmVyT2ZDaGFycyA9IHJlc3VsdDsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBUUlVFOworCQl9CisJCWlmIChlcnJubyAhPSBFSU5UUikgeworCQkJRklMRV9TZXREb3NFcnJvcigpOworCQkJcmV0dXJuIEZBTFNFOworCQl9CisgICAgICAgIH0KK30KKworCisKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogICogICAgICAgICAgIEZJTEVfRGVzdHJveQogICoKQEAgLTE2MCw4ICsyMjksNyBAQAogewogICAgIGludCBzYXZlX2Vycm5vID0gZXJybm87IC8qIGVycm5vIGdldHMgb3ZlcndyaXR0ZW4gYnkgcHJpbnRmICovCiAKLSAgICBkcHJpbnRmX2ZpbGUoc3RkZGViLCAiRklMRV9TZXREb3NFcnJvcjogZXJybm8gPSAlZCAlc1xuIiwgZXJybm8sCi0JCSBzdHJlcnJvcihlcnJubykgKTsKKyAgICBkcHJpbnRmX2luZm8oZmlsZSwgIkZJTEVfU2V0RG9zRXJyb3I6IGVycm5vID0gJWQgJXNcbiIsIGVycm5vLCBzdHJlcnJvcihlcnJubykpOwogICAgIHN3aXRjaCAoc2F2ZV9lcnJubykKICAgICB7CiAgICAgY2FzZSBFQUdBSU46CkBAIC0yMzUsNyArMzAzLDcgQEAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogICogICAgICAgICAgIEZJTEVfT3BlblVuaXhGaWxlCiAgKi8KLXN0YXRpYyBIRklMRTMyIEZJTEVfT3BlblVuaXhGaWxlKCBjb25zdCBjaGFyICpuYW1lLCBpbnQgbW9kZSApCitIRklMRTMyIEZJTEVfT3BlblVuaXhGaWxlKCBjb25zdCBjaGFyICpuYW1lLCBpbnQgbW9kZSApCiB7CiAgICAgSEZJTEUzMiBoYW5kbGU7CiAgICAgRklMRV9PQkpFQ1QgKmZpbGU7CkBAIC0yNzcsMTkgKzM0NSwyNCBAQAogICAgIERPU19GVUxMX05BTUUgZnVsbF9uYW1lOwogICAgIGNvbnN0IGNoYXIgKnVuaXhOYW1lOwogCi0gICAgZHByaW50Zl9maWxlKHN0ZGRlYiwgIkZJTEVfT3BlbjogJyVzJyAlMDR4XG4iLCBwYXRoLCBtb2RlICk7CisgICAgZHByaW50Zl9pbmZvKGZpbGUsICJGSUxFX09wZW46ICclcycgJTA0eFxuIiwgcGF0aCwgbW9kZSApOwogCiAgICAgaWYgKCFwYXRoKSByZXR1cm4gSEZJTEVfRVJST1IzMjsKIAotICAgIGlmICgodW5peE5hbWUgPSBET1NGU19Jc0RldmljZSggcGF0aCApKSAhPSBOVUxMKQorICAgIGlmIChET1NGU19Jc0RldmljZSggcGF0aCApKQogICAgIHsKLSAgICAgICAgZHByaW50Zl9maWxlKCBzdGRkZWIsICJGSUxFX09wZW46IG9wZW5pbmcgZGV2aWNlICclcydcbiIsIHVuaXhOYW1lICk7Ci0gICAgICAgIGlmICghdW5peE5hbWVbMF0pICAvKiBOb24tZXhpc3RpbmcgZGV2aWNlICovCi0gICAgICAgIHsKLSAgICAgICAgICAgIGRwcmludGZfZmlsZShzdGRkZWIsICJGSUxFX09wZW46IE5vbi1leGlzdGluZyBkZXZpY2VcbiIpOwotICAgICAgICAgICAgRE9TX0VSUk9SKCBFUl9GaWxlTm90Rm91bmQsIEVDX05vdEZvdW5kLCBTQV9BYm9ydCwgRUxfRGlzayApOwotICAgICAgICAgICAgcmV0dXJuIEhGSUxFX0VSUk9SMzI7Ci0gICAgICAgIH0KKyAgICAJSEZJTEUzMglyZXQ7CisKKyAgICAgICAgZHByaW50Zl9pbmZvKGZpbGUsICJGSUxFX09wZW46IG9wZW5pbmcgZGV2aWNlICclcydcbiIsIHBhdGggKTsKKworCWlmIChIRklMRV9FUlJPUjMyIT0ocmV0PURPU0ZTX09wZW5EZXZpY2UoIHBhdGgsIG1vZGUgKSkpCisJCXJldHVybiByZXQ7CisKKwkvKiBEbyBub3Qgc2lsZW5jZSB0aGlzIHBsZWFzZS4gSXQgaXMgYSBjcml0aWNhbCBlcnJvci4gLU1NICovCisgICAgICAgIGZwcmludGYoc3RkZXJyLCAiRklMRV9PcGVuOiBDb3VsZG4ndCBvcGVuIGRldmljZSAnJXMnIVxuIixwYXRoKTsKKyAgICAgICAgRE9TX0VSUk9SKCBFUl9GaWxlTm90Rm91bmQsIEVDX05vdEZvdW5kLCBTQV9BYm9ydCwgRUxfRGlzayApOworICAgICAgICByZXR1cm4gSEZJTEVfRVJST1IzMjsKKwkKICAgICB9CiAgICAgZWxzZSAvKiBjaGVjayBmb3IgZmlsZW5hbWUsIGRvbid0IGNoZWNrIGZvciBsYXN0IGVudHJ5IGlmIGNyZWF0aW5nICovCiAgICAgewpAQCAtMzA4LDE2ICszODEsMTUgQEAKIHsKICAgICBIRklMRTMyIGhhbmRsZTsKICAgICBGSUxFX09CSkVDVCAqZmlsZTsKLSAgICBjb25zdCBjaGFyICp1bml4TmFtZTsKICAgICBET1NfRlVMTF9OQU1FIGZ1bGxfbmFtZTsKIAotICAgIGRwcmludGZfZmlsZShzdGRkZWIsICJGSUxFX0NyZWF0ZTogJyVzJyAlMDR4ICVkXG4iLCBwYXRoLCBtb2RlLCB1bmlxdWUgKTsKKyAgICBkcHJpbnRmX2luZm8oZmlsZSwgIkZJTEVfQ3JlYXRlOiAnJXMnICUwNHggJWRcbiIsIHBhdGgsIG1vZGUsIHVuaXF1ZSApOwogCiAgICAgaWYgKCFwYXRoKSByZXR1cm4gSU5WQUxJRF9IQU5ETEVfVkFMVUUzMjsKIAotICAgIGlmICgodW5peE5hbWUgPSBET1NGU19Jc0RldmljZSggcGF0aCApKSAhPSBOVUxMKQorICAgIGlmIChET1NGU19Jc0RldmljZSggcGF0aCApKQogICAgIHsKLSAgICAgICAgZHByaW50Zl9maWxlKHN0ZGRlYiwgIkZJTEVfQ3JlYXRlOiBjcmVhdGluZyBkZXZpY2UgJyVzJyFcbiIsIHVuaXhOYW1lKTsKKyAgICAgICAgZnByaW50ZihzdGRlcnIsICJGSUxFX0NyZWF0ZTogY2Fubm90IGNyZWF0ZSBET1MgZGV2aWNlICclcychXG4iLCBwYXRoKTsKICAgICAgICAgRE9TX0VSUk9SKCBFUl9BY2Nlc3NEZW5pZWQsIEVDX05vdEZvdW5kLCBTQV9BYm9ydCwgRUxfRGlzayApOwogICAgICAgICByZXR1cm4gSU5WQUxJRF9IQU5ETEVfVkFMVUUzMjsKICAgICB9CkBAIC01MTAsMTEgKzU4MiwxMSBAQAogICAgIEZJTEVfT0JKRUNUICpmaWxlOwogICAgIEhGSUxFMzIgaGFuZGxlOwogCi0gICAgZHByaW50Zl9maWxlKCBzdGRkZWIsICJGSUxFX0R1cCBmb3IgaGFuZGxlICVkXG4iLCBoRmlsZSApOworICAgIGRwcmludGZfaW5mbyhmaWxlLCAiRklMRV9EdXAgZm9yIGhhbmRsZSAlZFxuIiwgaEZpbGUgKTsKICAgICBpZiAoIShmaWxlID0gRklMRV9HZXRGaWxlKCBoRmlsZSApKSkgcmV0dXJuIEhGSUxFX0VSUk9SMzI7CiAgICAgaGFuZGxlID0gSEFORExFX0FsbG9jKCAmZmlsZS0+aGVhZGVyLCBGSUxFX0FMTF9BQ0NFU1MgLypGSVhNRSovLCBGQUxTRSApOwogICAgIEZJTEVfUmVsZWFzZUZpbGUoIGZpbGUgKTsKLSAgICBkcHJpbnRmX2ZpbGUoIHN0ZGRlYiwgIkZJTEVfRHVwIHJldHVybiBoYW5kbGUgJWRcbiIsIGhhbmRsZSApOworICAgIGRwcmludGZfaW5mbyhmaWxlLCAiRklMRV9EdXAgcmV0dXJuIGhhbmRsZSAlZFxuIiwgaGFuZGxlICk7CiAgICAgcmV0dXJuIGhhbmRsZTsKIH0KIApAQCAtNTI4LDcgKzYwMCw3IEBACiB7CiAgICAgRklMRV9PQkpFQ1QgKmZpbGU7CiAKLSAgICBkcHJpbnRmX2ZpbGUoIHN0ZGRlYiwgIkZJTEVfRHVwMiBmb3IgaGFuZGxlICVkXG4iLCBoRmlsZTEgKTsKKyAgICBkcHJpbnRmX2luZm8oZmlsZSwgIkZJTEVfRHVwMiBmb3IgaGFuZGxlICVkXG4iLCBoRmlsZTEgKTsKICAgICAvKiBGSVhNRTogc2hvdWxkIHVzZSBEdXBsaWNhdGVIYW5kbGUgKi8KICAgICBpZiAoIShmaWxlID0gRklMRV9HZXRGaWxlKCBoRmlsZTEgKSkpIHJldHVybiBIRklMRV9FUlJPUjMyOwogICAgIGlmICghSEFORExFX1NldE9ialB0ciggaEZpbGUyLCAmZmlsZS0+aGVhZGVyLCAwICkpIGhGaWxlMiA9IEhGSUxFX0VSUk9SMzI7CkBAIC02MDAsNyArNjcyLDcgQEAKICAgICAgICAgICAgIEhGSUxFMzIgaGFuZGxlID0gRklMRV9DcmVhdGUoIGJ1ZmZlciwgMDY2NiwgVFJVRSApOwogICAgICAgICAgICAgaWYgKGhhbmRsZSAhPSBJTlZBTElEX0hBTkRMRV9WQUxVRTMyKQogICAgICAgICAgICAgeyAgLyogV2UgY3JlYXRlZCBpdCAqLwotICAgICAgICAgICAgICAgIGRwcmludGZfZmlsZSggc3RkZGViLCAiR2V0VGVtcEZpbGVOYW1lMzJBOiBjcmVhdGVkICVzXG4iLAorICAgICAgICAgICAgICAgIGRwcmludGZfaW5mbyhmaWxlLCAiR2V0VGVtcEZpbGVOYW1lMzJBOiBjcmVhdGVkICVzXG4iLAogCQkJICAgICAgYnVmZmVyKTsKICAgICAgICAgICAgICAgICBDbG9zZUhhbmRsZSggaGFuZGxlICk7CiAgICAgICAgICAgICAgICAgYnJlYWs7CkBAIC02MjQsNyArNjk2LDcgQEAKICAgICAgICAgICAgICAgICAgICAgICJQbGVhc2UgY2hlY2sgeW91ciBjb25maWd1cmF0aW9uIGZpbGUgaWYgdGhpcyBnZW5lcmF0ZXMgYSBmYWlsdXJlLlxuIiwKICAgICAgICAgICAgICAgICAgICAgIGJ1ZmZlcik7CiAgICAgfQotICAgIGRwcmludGZfZmlsZSggc3RkZGViLCAiR2V0VGVtcEZpbGVOYW1lMzJBOiByZXR1cm5pbmcgJXNcbiIsIGJ1ZmZlciApOworICAgIGRwcmludGZfaW5mbyhmaWxlLCAiR2V0VGVtcEZpbGVOYW1lMzJBOiByZXR1cm5pbmcgJXNcbiIsIGJ1ZmZlciApOwogICAgIHJldHVybiB1bmlxdWUgPyB1bmlxdWUgOiBudW07CiB9CiAKQEAgLTY3OCw3ICs3NTAsNyBAQAogCXJldHVybiBIRklMRV9FUlJPUjMyOwogICAgIH0KIAotICAgIGRwcmludGZfZmlsZSggc3RkZGViLCAiT3BlbkZpbGU6ICVzICUwNHhcbiIsIG5hbWUsIG1vZGUgKTsKKyAgICBkcHJpbnRmX2luZm8oZmlsZSwgIk9wZW5GaWxlOiAlcyAlMDR4XG4iLCBuYW1lLCBtb2RlICk7CiAKICAgICAvKiB0aGUgd2F0Y29tIDEwLjYgSURFIHJlbGllcyBvbiBhIHZhbGlkIHBhdGggcmV0dXJuZWQgaW4gb2ZzLT5zelBhdGhOYW1lCiAgICAgICAgQXJlIHRoZXJlIGFueSBjYXNlcyB3aGVyZSBnZXR0aW5nIHRoZSBwYXRoIGhlcmUgaXMgd3Jvbmc/IApAQCAtNjkyLDcgKzc2NCw3IEBACiAgICAgewogICAgICAgICBvZnMtPmZGaXhlZERpc2sgPSAoR2V0RHJpdmVUeXBlMTYoIG9mcy0+c3pQYXRoTmFtZVswXS0nQScgKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgIT0gRFJJVkVfUkVNT1ZBQkxFKTsKLSAgICAgICAgZHByaW50Zl9maWxlKCBzdGRkZWIsICJPcGVuRmlsZSglcyk6IE9GX1BBUlNFLCByZXMgPSAnJXMnXG4iLAorICAgICAgICBkcHJpbnRmX2luZm8oZmlsZSwgIk9wZW5GaWxlKCVzKTogT0ZfUEFSU0UsIHJlcyA9ICclcydcbiIsCiAgICAgICAgICAgICAgICAgICAgICAgbmFtZSwgb2ZzLT5zelBhdGhOYW1lICk7CiAgICAgICAgIHJldHVybiAwOwogICAgIH0KQEAgLTcyNSw3ICs3OTcsNyBAQAogICAgIGlmICghRElSX1NlYXJjaFBhdGgoIE5VTEwsIG5hbWUsIE5VTEwsICZmdWxsX25hbWUsIHdpbjMyICkpIGdvdG8gbm90X2ZvdW5kOwogCiBmb3VuZDoKLSAgICBkcHJpbnRmX2ZpbGUoIHN0ZGRlYiwgIk9wZW5GaWxlOiBmb3VuZCAlcyA9ICVzXG4iLAorICAgIGRwcmludGZfaW5mbyhmaWxlLCAiT3BlbkZpbGU6IGZvdW5kICVzID0gJXNcbiIsCiAgICAgICAgICAgICAgICAgICBmdWxsX25hbWUubG9uZ19uYW1lLCBmdWxsX25hbWUuc2hvcnRfbmFtZSApOwogICAgIGxzdHJjcHluMzJBKCBvZnMtPnN6UGF0aE5hbWUsIGZ1bGxfbmFtZS5zaG9ydF9uYW1lLAogICAgICAgICAgICAgICAgICBzaXplb2Yob2ZzLT5zelBhdGhOYW1lKSApOwpAQCAtNzMzLDcgKzgwNSw3IEBACiAgICAgaWYgKG1vZGUgJiBPRl9ERUxFVEUpCiAgICAgewogICAgICAgICBpZiAodW5saW5rKCBmdWxsX25hbWUubG9uZ19uYW1lICkgPT0gLTEpIGdvdG8gbm90X2ZvdW5kOwotICAgICAgICBkcHJpbnRmX2ZpbGUoIHN0ZGRlYiwgIk9wZW5GaWxlKCVzKTogT0ZfREVMRVRFIHJldHVybiA9IE9LXG4iLCBuYW1lKTsKKyAgICAgICAgZHByaW50Zl9pbmZvKGZpbGUsICJPcGVuRmlsZSglcyk6IE9GX0RFTEVURSByZXR1cm4gPSBPS1xuIiwgbmFtZSk7CiAgICAgICAgIHJldHVybiAxOwogICAgIH0KIApAQCAtNzU3LDcgKzgyOSw3IEBACiAgICAgICAgIGlmIChtZW1jbXAoIG9mcy0+cmVzZXJ2ZWQsIGZpbGVkYXRldGltZSwgc2l6ZW9mKG9mcy0+cmVzZXJ2ZWQpICkpCiAgICAgICAgIHsKICAgICAgICAgICAgIENsb3NlSGFuZGxlKCBoRmlsZVJldCApOwotICAgICAgICAgICAgZHByaW50Zl9maWxlKCBzdGRkZWIsICJPcGVuRmlsZSglcyk6IE9GX1ZFUklGWSBmYWlsZWRcbiIsIG5hbWUgKTsKKyAgICAgICAgICAgIGRwcmludGZfd2FybihmaWxlLCAiT3BlbkZpbGUoJXMpOiBPRl9WRVJJRlkgZmFpbGVkXG4iLCBuYW1lICk7CiAgICAgICAgICAgICAvKiBGSVhNRTogd2hhdCBlcnJvciBoZXJlPyAqLwogICAgICAgICAgICAgRE9TX0VSUk9SKCBFUl9GaWxlTm90Rm91bmQsIEVDX05vdEZvdW5kLCBTQV9BYm9ydCwgRUxfRGlzayApOwogICAgICAgICAgICAgZ290byBlcnJvcjsKQEAgLTc2NiwxOSArODM4LDE5IEBACiAgICAgbWVtY3B5KCBvZnMtPnJlc2VydmVkLCBmaWxlZGF0ZXRpbWUsIHNpemVvZihvZnMtPnJlc2VydmVkKSApOwogCiBzdWNjZXNzOiAgLyogV2UgZ2V0IGhlcmUgaWYgdGhlIG9wZW4gd2FzIHN1Y2Nlc3NmdWwgKi8KLSAgICBkcHJpbnRmX2ZpbGUoIHN0ZGRlYiwgIk9wZW5GaWxlKCVzKTogT0ssIHJldHVybiA9ICVkXG4iLCBuYW1lLCBoRmlsZVJldCApOworICAgIGRwcmludGZfaW5mbyhmaWxlLCAiT3BlbkZpbGUoJXMpOiBPSywgcmV0dXJuID0gJWRcbiIsIG5hbWUsIGhGaWxlUmV0ICk7CiAgICAgaWYgKG1vZGUgJiBPRl9FWElTVCkgLyogUmV0dXJuIHRoZSBoYW5kbGUsIGJ1dCBjbG9zZSBpdCBmaXJzdCAqLwogICAgICAgICBDbG9zZUhhbmRsZSggaEZpbGVSZXQgKTsKICAgICByZXR1cm4gaEZpbGVSZXQ7CiAKIG5vdF9mb3VuZDogIC8qIFdlIGdldCBoZXJlIGlmIHRoZSBmaWxlIGRvZXMgbm90IGV4aXN0ICovCi0gICAgZHByaW50Zl9maWxlKCBzdGRkZWIsICJPcGVuRmlsZTogJyVzJyBub3QgZm91bmRcbiIsIG5hbWUgKTsKKyAgICBkcHJpbnRmX3dhcm4oZmlsZSwgIk9wZW5GaWxlOiAnJXMnIG5vdCBmb3VuZFxuIiwgbmFtZSApOwogICAgIERPU19FUlJPUiggRVJfRmlsZU5vdEZvdW5kLCBFQ19Ob3RGb3VuZCwgU0FfQWJvcnQsIEVMX0Rpc2sgKTsKICAgICAvKiBmYWxsIHRocm91Z2ggKi8KIAogZXJyb3I6ICAvKiBXZSBnZXQgaGVyZSBpZiB0aGVyZSB3YXMgYW4gZXJyb3Igb3BlbmluZyB0aGUgZmlsZSAqLwogICAgIG9mcy0+bkVyckNvZGUgPSBET1NfRXh0ZW5kZWRFcnJvcjsKLSAgICBkcHJpbnRmX2ZpbGUoIHN0ZGRlYiwgIk9wZW5GaWxlKCVzKTogcmV0dXJuID0gSEZJTEVfRVJST1IgZXJyb3I9ICVkXG4iLCAKKyAgICBkcHJpbnRmX3dhcm4oZmlsZSwgIk9wZW5GaWxlKCVzKTogcmV0dXJuID0gSEZJTEVfRVJST1IgZXJyb3I9ICVkXG4iLCAKIAkJICBuYW1lLG9mcy0+bkVyckNvZGUgKTsKICAgICByZXR1cm4gSEZJTEVfRVJST1IzMjsKIH0KQEAgLTgwNyw3ICs4NzksNyBAQAogICovCiBIRklMRTE2IFdJTkFQSSBfbGNsb3NlMTYoIEhGSUxFMTYgaEZpbGUgKQogewotICAgIGRwcmludGZfZmlsZSggc3RkZGViLCAiX2xjbG9zZTE2OiBoYW5kbGUgJWRcbiIsIGhGaWxlICk7CisgICAgZHByaW50Zl9pbmZvKGZpbGUsICJfbGNsb3NlMTY6IGhhbmRsZSAlZFxuIiwgaEZpbGUgKTsKICAgICByZXR1cm4gQ2xvc2VIYW5kbGUoIGhGaWxlICkgPyAwIDogSEZJTEVfRVJST1IxNjsKIH0KIApAQCAtODE3LDcgKzg4OSw3IEBACiAgKi8KIEhGSUxFMzIgV0lOQVBJIF9sY2xvc2UzMiggSEZJTEUzMiBoRmlsZSApCiB7Ci0gICAgZHByaW50Zl9maWxlKCBzdGRkZWIsICJfbGNsb3NlMzI6IGhhbmRsZSAlZFxuIiwgaEZpbGUgKTsKKyAgICBkcHJpbnRmX2luZm8oZmlsZSwgIl9sY2xvc2UzMjogaGFuZGxlICVkXG4iLCBoRmlsZSApOwogICAgIHJldHVybiBDbG9zZUhhbmRsZSggaEZpbGUgKSA/IDAgOiBIRklMRV9FUlJPUjMyOwogfQogCkBAIC04MjksNyArOTAxLDcgQEAKIHsKICAgICBMT05HIG1heGxlbjsKIAotICAgIGRwcmludGZfZmlsZSggc3RkZGViLCAiV0lOMTZfaHJlYWQ6ICVkICUwOGx4ICVsZFxuIiwKKyAgICBkcHJpbnRmX2luZm8oZmlsZSwgIldJTjE2X2hyZWFkOiAlZCAlMDhseCAlbGRcbiIsCiAgICAgICAgICAgICAgICAgICBoRmlsZSwgKERXT1JEKWJ1ZmZlciwgY291bnQgKTsKIAogICAgIC8qIFNvbWUgcHJvZ3JhbXMgcGFzcyBhIGNvdW50IGxhcmdlciB0aGFuIHRoZSBhbGxvY2F0ZWQgYnVmZmVyICovCkBAIC04NTEsMTggKzkyMywxOSBAQAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgKiAgICAgICAgICAgX2xyZWFkMzIgICAoS0VSTkVMMzIuNTk2KQogICovCi1VSU5UMzIgV0lOQVBJIF9scmVhZDMyKCBIRklMRTMyIGhGaWxlLCBMUFZPSUQgYnVmZmVyLCBVSU5UMzIgY291bnQgKQorVUlOVDMyIFdJTkFQSSBfbHJlYWQzMiggSEZJTEUzMiBoYW5kbGUsIExQVk9JRCBidWZmZXIsIFVJTlQzMiBjb3VudCApCiB7Ci0gICAgRklMRV9PQkpFQ1QgKmZpbGU7Ci0gICAgVUlOVDMyIHJlc3VsdDsKKyAgICBLMzJPQkogKnB0cjsKKyAgICBEV09SRCBudW1Xcml0dGVuOworICAgIEJPT0wzMiByZXN1bHQgPSBGQUxTRTsKIAotICAgIGRwcmludGZfZmlsZSggc3RkZGViLCAiX2xyZWFkMzI6ICVkICVwICVkXG4iLCBoRmlsZSwgYnVmZmVyLCBjb3VudCApOwotICAgIGlmICghKGZpbGUgPSBGSUxFX0dldEZpbGUoIGhGaWxlICkpKSByZXR1cm4gLTE7Ci0gICAgaWYgKCFjb3VudCkgcmVzdWx0ID0gMDsKLSAgICBlbHNlIGlmICgocmVzdWx0ID0gcmVhZCggZmlsZS0+dW5peF9oYW5kbGUsIGJ1ZmZlciwgY291bnQgKSkgPT0gLTEpCi0gICAgICAgIEZJTEVfU2V0RG9zRXJyb3IoKTsKLSAgICBGSUxFX1JlbGVhc2VGaWxlKCBmaWxlICk7Ci0gICAgcmV0dXJuIHJlc3VsdDsKKyAgICBkcHJpbnRmX2luZm8oIGZpbGUsICJfbHJlYWQzMjogJWQgJXAgJWRcbiIsIGhhbmRsZSwgYnVmZmVyLCBjb3VudCk7CisgICAgaWYgKCEocHRyID0gSEFORExFX0dldE9ialB0ciggaGFuZGxlLCBLMzJPQkpfVU5LTk9XTiwgMCkpKSByZXR1cm4gLTE7CisgICAgaWYgKEszMk9CSl9PUFMocHRyKS0+cmVhZCkKKyAgICAgICAgcmVzdWx0ID0gSzMyT0JKX09QUyhwdHIpLT5yZWFkKHB0ciwgYnVmZmVyLCBjb3VudCwgJm51bVdyaXR0ZW4sIE5VTEwpOworICAgIEszMk9CSl9EZWNDb3VudCggcHRyICk7CisgICAgaWYgKCFyZXN1bHQpIHJldHVybiAtMTsKKyAgICByZXR1cm4gKFVJTlQzMiludW1Xcml0dGVuOwogfQogCiAKQEAgLTg4MSw3ICs5NTQsNyBAQAogSEZJTEUxNiBXSU5BUEkgX2xjcmVhdDE2KCBMUENTVFIgcGF0aCwgSU5UMTYgYXR0ciApCiB7CiAgICAgaW50IG1vZGUgPSAoYXR0ciAmIDEpID8gMDQ0NCA6IDA2NjY7Ci0gICAgZHByaW50Zl9maWxlKCBzdGRkZWIsICJfbGNyZWF0MTY6ICVzICUwMnhcbiIsIHBhdGgsIGF0dHIgKTsKKyAgICBkcHJpbnRmX2luZm8oZmlsZSwgIl9sY3JlYXQxNjogJXMgJTAyeFxuIiwgcGF0aCwgYXR0ciApOwogICAgIHJldHVybiAoSEZJTEUxNilGSUxFX0NyZWF0ZSggcGF0aCwgbW9kZSwgRkFMU0UgKTsKIH0KIApAQCAtODkyLDcgKzk2NSw3IEBACiBIRklMRTMyIFdJTkFQSSBfbGNyZWF0MzIoIExQQ1NUUiBwYXRoLCBJTlQzMiBhdHRyICkKIHsKICAgICBpbnQgbW9kZSA9IChhdHRyICYgMSkgPyAwNDQ0IDogMDY2NjsKLSAgICBkcHJpbnRmX2ZpbGUoIHN0ZGRlYiwgIl9sY3JlYXQzMjogJXMgJTAyeFxuIiwgcGF0aCwgYXR0ciApOworICAgIGRwcmludGZfaW5mbyhmaWxlLCAiX2xjcmVhdDMyOiAlcyAlMDJ4XG4iLCBwYXRoLCBhdHRyICk7CiAgICAgcmV0dXJuIEZJTEVfQ3JlYXRlKCBwYXRoLCBtb2RlLCBGQUxTRSApOwogfQogCkBAIC05MDMsNyArOTc2LDcgQEAKIEhGSUxFMzIgX2xjcmVhdF91bmlxKCBMUENTVFIgcGF0aCwgSU5UMzIgYXR0ciApCiB7CiAgICAgaW50IG1vZGUgPSAoYXR0ciAmIDEpID8gMDQ0NCA6IDA2NjY7Ci0gICAgZHByaW50Zl9maWxlKCBzdGRkZWIsICJfbGNyZWF0X3VuaXE6ICVzICUwMnhcbiIsIHBhdGgsIGF0dHIgKTsKKyAgICBkcHJpbnRmX2luZm8oZmlsZSwgIl9sY3JlYXRfdW5pcTogJXMgJTAyeFxuIiwgcGF0aCwgYXR0ciApOwogICAgIHJldHVybiBGSUxFX0NyZWF0ZSggcGF0aCwgbW9kZSwgVFJVRSApOwogfQogCkBAIC05MjMsNyArOTk2LDcgQEAKICAgICAgICAgU2V0TGFzdEVycm9yKCBFUlJPUl9JTlZBTElEX1BBUkFNRVRFUiApOwogICAgICAgICByZXR1cm4gMHhmZmZmZmZmZjsKICAgICB9Ci0gICAgZHByaW50Zl9maWxlKCBzdGRkZWIsICJTZXRGaWxlUG9pbnRlcjogaGFuZGxlICVkIG9mZnNldCAlbGQgb3JpZ2luICVsZFxuIiwKKyAgICBkcHJpbnRmX2luZm8oZmlsZSwgIlNldEZpbGVQb2ludGVyOiBoYW5kbGUgJWQgb2Zmc2V0ICVsZCBvcmlnaW4gJWxkXG4iLAogICAgICAgICAgICAgICAgICAgaEZpbGUsIGRpc3RhbmNlLCBtZXRob2QgKTsKIAogICAgIGlmICghKGZpbGUgPSBGSUxFX0dldEZpbGUoIGhGaWxlICkpKSByZXR1cm4gMHhmZmZmZmZmZjsKQEAgLTk3NSw3ICsxMDQ4LDcgQEAKIHsKICAgICBJTlQzMiB1bml4TW9kZTsKIAotICAgIGRwcmludGZfZmlsZShzdGRkZWIsICJfbG9wZW4zMignJXMnLCUwNHgpXG4iLCBwYXRoLCBtb2RlICk7CisgICAgZHByaW50Zl9pbmZvKGZpbGUsICJfbG9wZW4zMignJXMnLCUwNHgpXG4iLCBwYXRoLCBtb2RlICk7CiAKICAgICBzd2l0Y2gobW9kZSAmIDMpCiAgICAgewpAQCAtMTA0MCwzMSArMTExMyw0MyBAQAogCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICAqICAgICAgICAgICBfaHdyaXRlMzIgICAoS0VSTkVMMzIuNTkxKQorICoKKyAqCWV4cGVyaW1lbmF0aW9uIHlpZWxkcyB0aGF0IF9sd3JpdGU6CisgKgkJbyB0cnVuY2F0ZXMgdGhlIGZpbGUgYXQgdGhlIGN1cnJlbnQgcG9zaXRpb24gd2l0aCAKKyAqCQkgIGEgMCBsZW4gd3JpdGUKKyAqCQlvIHJldHVybnMgMCBvbiBhIDAgbGVuZ3RoIHdyaXRlCisgKgkJbyB3b3JrcyB3aXRoIGNvbnNvbGUgaGFuZGxlcworICoJCQogICovCi1MT05HIFdJTkFQSSBfaHdyaXRlMzIoIEhGSUxFMzIgaEZpbGUsIExQQ1NUUiBidWZmZXIsIExPTkcgY291bnQgKQorTE9ORyBXSU5BUEkgX2h3cml0ZTMyKCBIRklMRTMyIGhhbmRsZSwgTFBDU1RSIGJ1ZmZlciwgTE9ORyBjb3VudCApCiB7Ci0gICAgRklMRV9PQkpFQ1QgKmZpbGU7Ci0gICAgTE9ORyByZXN1bHQ7CisJSzMyT0JKICppb3B0cjsKKwlEV09SRCByZXN1bHQ7CisJQk9PTDMyIHN0YXR1cyA9IEZBTFNFOworCQorCWRwcmludGZfaW5mbyhmaWxlLCAiX2h3cml0ZTMyOiAlZCAlcCAlbGRcbiIsIGhhbmRsZSwgYnVmZmVyLCBjb3VudCApOwogCi0gICAgZHByaW50Zl9maWxlKCBzdGRkZWIsICJfaHdyaXRlMzI6ICVkICVwICVsZFxuIiwgaEZpbGUsIGJ1ZmZlciwgY291bnQgKTsKKwlpZiAoY291bnQgPT0gMCkgeyAgICAgICAvKiBFeHBhbmQgb3IgdHJ1bmNhdGUgYXQgY3VycmVudCBwb3NpdGlvbiAqLworCQlGSUxFX09CSkVDVCAqZmlsZSA9IEZJTEVfR2V0RmlsZShoYW5kbGUpOwogCi0gICAgaWYgKCEoZmlsZSA9IEZJTEVfR2V0RmlsZSggaEZpbGUgKSkpIHJldHVybiBIRklMRV9FUlJPUjMyOwotICAgIGlmIChjb3VudCA9PSAwKSAgLyogRXhwYW5kIG9yIHRydW5jYXRlIGF0IGN1cnJlbnQgcG9zaXRpb24gKi8KLSAgICAgICAgcmVzdWx0ID0gZnRydW5jYXRlKCBmaWxlLT51bml4X2hhbmRsZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBsc2VlayggZmlsZS0+dW5peF9oYW5kbGUsIDAsIFNFRUtfQ1VSICkgKTsKLSAgICBlbHNlIGZvciAoOzspCi0gICAgewotICAgICAgICByZXN1bHQgPSB3cml0ZSggZmlsZS0+dW5peF9oYW5kbGUsIGJ1ZmZlciwgY291bnQgKTsKLSAgICAgICAgaWYgKHJlc3VsdCAhPSAtMSkgYnJlYWs7Ci0gICAgICAgIGlmIChlcnJubyAhPSBFSU5UUikKLSAgICAgICAgewotICAgICAgICAgICAgRklMRV9TZXREb3NFcnJvcigpOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBGSUxFX1JlbGVhc2VGaWxlKCBmaWxlICk7Ci0gICAgcmV0dXJuIHJlc3VsdDsKKwkJaWYgKCBmdHJ1bmNhdGUoZmlsZS0+dW5peF9oYW5kbGUsCisJCQkgICAgICAgbHNlZWsoIGZpbGUtPnVuaXhfaGFuZGxlLCAwLCBTRUVLX0NVUikpID09IDAgKSB7CisJCQlGSUxFX1JlbGVhc2VGaWxlKGZpbGUpOworCQkJcmV0dXJuIDA7CisJCX0gZWxzZSB7CisJCQlGSUxFX1NldERvc0Vycm9yKCk7CisJCQlGSUxFX1JlbGVhc2VGaWxlKGZpbGUpOworCQkJcmV0dXJuIEhGSUxFX0VSUk9SMzI7CisJCX0KKwl9CisJCisJaWYgKCEoaW9wdHIgPSBIQU5ETEVfR2V0T2JqUHRyKCBoYW5kbGUsIEszMk9CSl9VTktOT1dOLCAwICkpKQorICAgICAgICAgICAgcmV0dXJuIEhGSUxFX0VSUk9SMzI7CisgICAgICAgIGlmIChLMzJPQkpfT1BTKGlvcHRyKS0+d3JpdGUpCisgICAgICAgICAgICBzdGF0dXMgPSBLMzJPQkpfT1BTKGlvcHRyKS0+d3JpdGUoaW9wdHIsIGJ1ZmZlciwgY291bnQsICZyZXN1bHQsIE5VTEwpOworCUszMk9CSl9EZWNDb3VudCggaW9wdHIgKTsKKwlpZiAoIXN0YXR1cykgcmVzdWx0ID0gSEZJTEVfRVJST1IzMjsKKwlyZXR1cm4gcmVzdWx0OwogfQogCiAKQEAgLTEwNzcsNyArMTE2Miw3IEBACiAgICAgUERCICpwZGIgPSAoUERCICopR2xvYmFsTG9jazE2KCBoUERCICk7CiAgICAgQllURSAqZmlsZXMgPSBQVFJfU0VHX1RPX0xJTiggcGRiLT5maWxlSGFuZGxlc1B0ciApOwogCi0gICAgZHByaW50Zl9maWxlKCBzdGRkZWIsICJTZXRIYW5kbGVDb3VudDE2KCVkKVxuIiwgY291bnQgKTsKKyAgICBkcHJpbnRmX2luZm8oZmlsZSwgIlNldEhhbmRsZUNvdW50MTYoJWQpXG4iLCBjb3VudCApOwogCiAgICAgaWYgKGNvdW50IDwgMjApIGNvdW50ID0gMjA7ICAvKiBObyBwb2ludCBpbiBnb2luZyBiZWxvdyAyMCAqLwogICAgIGVsc2UgaWYgKGNvdW50ID4gMjU0KSBjb3VudCA9IDI1NDsKQEAgLTExMzcsNyArMTIyMiw3IEBACiAgICAgRklMRV9PQkpFQ1QgKmZpbGU7CiAgICAgQk9PTDMyIHJldDsKIAotICAgIGRwcmludGZfZmlsZSggc3RkZGViLCAiRmx1c2hGaWxlQnVmZmVycyglZClcbiIsIGhGaWxlICk7CisgICAgZHByaW50Zl9pbmZvKGZpbGUsICJGbHVzaEZpbGVCdWZmZXJzKCVkKVxuIiwgaEZpbGUgKTsKICAgICBpZiAoIShmaWxlID0gRklMRV9HZXRGaWxlKCBoRmlsZSApKSkgcmV0dXJuIEZBTFNFOwogICAgIGlmIChmc3luYyggZmlsZS0+dW5peF9oYW5kbGUgKSAhPSAtMSkgcmV0ID0gVFJVRTsKICAgICBlbHNlCkBAIC0xMTU4LDcgKzEyNDMsNyBAQAogICAgIEZJTEVfT0JKRUNUICpmaWxlOwogICAgIEJPT0wzMiByZXQgPSBUUlVFOwogCi0gICAgZHByaW50Zl9maWxlKCBzdGRkZWIsICJTZXRFbmRPZkZpbGUoJWQpXG4iLCBoRmlsZSApOworICAgIGRwcmludGZfaW5mbyhmaWxlLCAiU2V0RW5kT2ZGaWxlKCVkKVxuIiwgaEZpbGUgKTsKICAgICBpZiAoIShmaWxlID0gRklMRV9HZXRGaWxlKCBoRmlsZSApKSkgcmV0dXJuIEZBTFNFOwogICAgIGlmIChmdHJ1bmNhdGUoIGZpbGUtPnVuaXhfaGFuZGxlLAogICAgICAgICAgICAgICAgICAgIGxzZWVrKCBmaWxlLT51bml4X2hhbmRsZSwgMCwgU0VFS19DVVIgKSApKQpAQCAtMTE4NiwxMyArMTI3MSwxMiBAQAogQk9PTDMyIFdJTkFQSSBEZWxldGVGaWxlMzJBKCBMUENTVFIgcGF0aCApCiB7CiAgICAgRE9TX0ZVTExfTkFNRSBmdWxsX25hbWU7Ci0gICAgY29uc3QgY2hhciAqdW5peE5hbWU7CiAKLSAgICBkcHJpbnRmX2ZpbGUoc3RkZGViLCAiRGVsZXRlRmlsZTogJyVzJ1xuIiwgcGF0aCApOworICAgIGRwcmludGZfaW5mbyhmaWxlLCAiRGVsZXRlRmlsZTogJyVzJ1xuIiwgcGF0aCApOwogCi0gICAgaWYgKCh1bml4TmFtZSA9IERPU0ZTX0lzRGV2aWNlKCBwYXRoICkpICE9IE5VTEwpCisgICAgaWYgKERPU0ZTX0lzRGV2aWNlKCBwYXRoICkpCiAgICAgewotICAgICAgICBkcHJpbnRmX2ZpbGUoc3RkZGViLCAiRGVsZXRlRmlsZTogcmVtb3ZpbmcgZGV2aWNlICclcychXG4iLCB1bml4TmFtZSk7CisgICAgICAgIGZwcmludGYoc3RkZXJyLCAiRGVsZXRlRmlsZTogY2Fubm90IHJlbW92ZSBET1MgZGV2aWNlICclcychXG4iLCBwYXRoKTsKICAgICAgICAgRE9TX0VSUk9SKCBFUl9GaWxlTm90Rm91bmQsIEVDX05vdEZvdW5kLCBTQV9BYm9ydCwgRUxfRGlzayApOwogICAgICAgICByZXR1cm4gRkFMU0U7CiAgICAgfQpAQCAtMTM2MSw3ICsxNDQ1LDcgQEAKICAgICBET1NfRlVMTF9OQU1FIGZ1bGxfbmFtZTEsIGZ1bGxfbmFtZTI7CiAgICAgaW50IG1vZGU9MDsgLyogbW9kZSA9PSAxOiB1c2UgY29weSAqLwogCi0gICAgZHByaW50Zl9maWxlKCBzdGRkZWIsICJNb3ZlRmlsZUV4MzJBKCVzLCVzLCUwNGx4KVxuIiwgZm4xLCBmbjIsIGZsYWcpOworICAgIGRwcmludGZfaW5mbyhmaWxlLCAiTW92ZUZpbGVFeDMyQSglcywlcywlMDRseClcbiIsIGZuMSwgZm4yLCBmbGFnKTsKIAogICAgIGlmICghRE9TRlNfR2V0RnVsbE5hbWUoIGZuMSwgVFJVRSwgJmZ1bGxfbmFtZTEgKSkgcmV0dXJuIEZBTFNFOwogICAgIGlmIChmbjIpIHsgLyogIWZuMiBtZWFucyBkZWxldGUgZm4xICovCkBAIC0xNDYxLDcgKzE1NDUsNyBAQAogICAgIERPU19GVUxMX05BTUUgZnVsbF9uYW1lMSwgZnVsbF9uYW1lMjsKICAgICBzdHJ1Y3Qgc3RhdCBmc3RhdDsKIAotICAgIGRwcmludGZfZmlsZSggc3RkZGViLCAiTW92ZUZpbGUzMkEoJXMsJXMpXG4iLCBmbjEsIGZuMiApOworICAgIGRwcmludGZfaW5mbyhmaWxlLCAiTW92ZUZpbGUzMkEoJXMsJXMpXG4iLCBmbjEsIGZuMiApOwogCiAgICAgaWYgKCFET1NGU19HZXRGdWxsTmFtZSggZm4xLCBUUlVFLCAmZnVsbF9uYW1lMSApKSByZXR1cm4gRkFMU0U7CiAgICAgaWYgKERPU0ZTX0dldEZ1bGxOYW1lKCBmbjIsIFRSVUUsICZmdWxsX25hbWUyICkpIApAQCAtMTQ3OSw3ICsxNTYzLDcgQEAKICAgICBlbHNlIC8qY29weSAqLyB7CiAgICAgICBpZiAoc3RhdCggIGZ1bGxfbmFtZTEubG9uZ19uYW1lLCAmZnN0YXQgKSkKIAl7Ci0JICBkcHJpbnRmX2ZpbGUoIHN0ZGRlYiwgIkludmFsaWQgc291cmNlIGZpbGUgJXNcbiIsCisJICBkcHJpbnRmX3dhcm4oZmlsZSwgIkludmFsaWQgc291cmNlIGZpbGUgJXNcbiIsCiAJCQlmdWxsX25hbWUxLmxvbmdfbmFtZSk7CiAJICBGSUxFX1NldERvc0Vycm9yKCk7CiAJICByZXR1cm4gRkFMU0U7CkBAIC0xNTgwLDcgKzE2NjQsNyBAQAogICAgIHN0cnVjdCB1dGltYnVmIHV0aW1idWY7CiAgICAgCiAgICAgaWYgKCFmaWxlKSByZXR1cm4gRklMRV9UWVBFX1VOS05PV047IC8qIEZJWE1FOiBjb3JyZWN0PyAqLwotICAgIGRwcmludGZfZmlsZShzdGRkZWIsIlNldEZpbGVUaW1lKCVzLCVwLCVwLCVwKVxuIiwKKyAgICBkcHJpbnRmX2luZm8oZmlsZSwiU2V0RmlsZVRpbWUoJXMsJXAsJXAsJXApXG4iLAogCWZpbGUtPnVuaXhfbmFtZSwKIAlscENyZWF0aW9uVGltZSwKIAlscExhc3RBY2Nlc3NUaW1lLApAQCAtMTY5NywxMiArMTc4MSwxMiBAQAogICBzdHJ1Y3QgZmxvY2sgZjsKICAgRklMRV9PQkpFQ1QgKmZpbGU7CiAKLSAgZHByaW50Zl9maWxlKHN0ZGRlYiwgIkxvY2tGaWxlMzI6IGhhbmRsZSAlZCBvZmZzZXRsb3c9JWxkIG9mZnNldGhpZ2g9JWxkIG5ieXRlc2xvdz0lbGQgbmJ5dGVzaGlnaD0lbGRcbiIsCisgIGRwcmludGZfaW5mbyhmaWxlLCAiTG9ja0ZpbGUzMjogaGFuZGxlICVkIG9mZnNldGxvdz0lbGQgb2Zmc2V0aGlnaD0lbGQgbmJ5dGVzbG93PSVsZCBuYnl0ZXNoaWdoPSVsZFxuIiwKIAkgICAgICAgaEZpbGUsIGR3RmlsZU9mZnNldExvdywgZHdGaWxlT2Zmc2V0SGlnaCwKIAkgICAgICAgbk51bWJlck9mQnl0ZXNUb0xvY2tMb3csIG5OdW1iZXJPZkJ5dGVzVG9Mb2NrSGlnaCk7CiAKICAgaWYgKGR3RmlsZU9mZnNldEhpZ2ggfHwgbk51bWJlck9mQnl0ZXNUb0xvY2tIaWdoKSB7Ci0gICAgZHByaW50Zl9maWxlKHN0ZGRlYiwgIkxvY2tGaWxlMzI6IFVuaW1wbGVtZW50ZWQgYnl0ZXMgPiAzMmJpdHNcbiIpOworICAgIGRwcmludGZfZml4bWUoZmlsZSwgIkxvY2tGaWxlMzI6IFVuaW1wbGVtZW50ZWQgYnl0ZXMgPiAzMmJpdHNcbiIpOwogICAgIHJldHVybiBGQUxTRTsKICAgfQogCkBAIC0xNzQ4LDEyICsxODMyLDEyIEBACiAgIEZJTEVfT0JKRUNUICpmaWxlOwogICBzdHJ1Y3QgZmxvY2sgZjsKIAotICBkcHJpbnRmX2ZpbGUoc3RkZGViLCAiVW5sb2NrRmlsZTMyOiBoYW5kbGUgJWQgb2Zmc2V0bG93PSVsZCBvZmZzZXRoaWdoPSVsZCBuYnl0ZXNsb3c9JWxkIG5ieXRlc2hpZ2g9JWxkXG4iLAorICBkcHJpbnRmX2luZm8oZmlsZSwgIlVubG9ja0ZpbGUzMjogaGFuZGxlICVkIG9mZnNldGxvdz0lbGQgb2Zmc2V0aGlnaD0lbGQgbmJ5dGVzbG93PSVsZCBuYnl0ZXNoaWdoPSVsZFxuIiwKIAkgICAgICAgaEZpbGUsIGR3RmlsZU9mZnNldExvdywgZHdGaWxlT2Zmc2V0SGlnaCwKIAkgICAgICAgbk51bWJlck9mQnl0ZXNUb1VubG9ja0xvdywgbk51bWJlck9mQnl0ZXNUb1VubG9ja0hpZ2gpOwogCiAgIGlmIChkd0ZpbGVPZmZzZXRIaWdoIHx8IG5OdW1iZXJPZkJ5dGVzVG9VbmxvY2tIaWdoKSB7Ci0gICAgZHByaW50Zl9maWxlKHN0ZGRlYiwgIlVubG9ja0ZpbGUzMjogVW5pbXBsZW1lbnRlZCBieXRlcyA+IDMyYml0c1xuIik7CisgICAgZHByaW50Zl93YXJuKGZpbGUsICJVbmxvY2tGaWxlMzI6IFVuaW1wbGVtZW50ZWQgYnl0ZXMgPiAzMmJpdHNcbiIpOwogICAgIHJldHVybiBGQUxTRTsKICAgfQogCmRpZmYgLS1naXQgYS9maWxlcy9wcm9maWxlLmMgYi9maWxlcy9wcm9maWxlLmMKaW5kZXggNTQ1MDQ5ZC4uMmI2ZjdlYiAxMDA2NDQKLS0tIGEvZmlsZXMvcHJvZmlsZS5jCisrKyBiL2ZpbGVzL3Byb2ZpbGUuYwpAQCAtMTMsNyArMTMsNiBAQAogI2luY2x1ZGUgIndpbmRvd3MuaCIKICNpbmNsdWRlICJmaWxlLmgiCiAjaW5jbHVkZSAiaGVhcC5oIgotI2luY2x1ZGUgInN0ZGRlYnVnLmgiCiAjaW5jbHVkZSAiZGVidWcuaCIKIAogdHlwZWRlZiBzdHJ1Y3QgdGFnUFJPRklMRUtFWQpAQCAtMjE2LDExICsyMTUsMTIgQEAKICAgICAgICAgKnByZXZfa2V5ICA9IGtleTsKICAgICAgICAgcHJldl9rZXkgPSAma2V5LT5uZXh0OwogICAgIH0KLSAgICBpZiAoZGVidWdnaW5nX3Byb2ZpbGUpCisgICAgaWYgKGRlYnVnZ2luZ19pbmZvKHByb2ZpbGUpKQogICAgIHsKLSAgICAgICAgZnByaW50Ziggc3RkZGViLCAiUFJPRklMRV9Mb2FkOlxuIiApOwotICAgICAgICBQUk9GSUxFX1NhdmUoIHN0ZGRlYiwgZmlyc3Rfc2VjdGlvbiApOwotICAgICAgICBmcHJpbnRmKCBzdGRkZWIsICJQUk9GSUxFX0xvYWQgZmluaXNoZWQuXG4iICk7CisgICAgICAgIGRwcmludGZfaW5mbyhwcm9maWxlLCAiUFJPRklMRV9Mb2FkOlxuIiApOworCS8qIEZJWE1FOiBpbXByb3BlciB1c2Ugb2Ygc3RkZGViISAqLworICAgICAgICBQUk9GSUxFX1NhdmUoc3RkZGViLCBmaXJzdF9zZWN0aW9uICk7CisgICAgICAgIGRwcmludGZfaW5mbyhwcm9maWxlLCAiUFJPRklMRV9Mb2FkIGZpbmlzaGVkLlxuIiApOwogICAgIH0KICAgICByZXR1cm4gZmlyc3Rfc2VjdGlvbjsKIH0KQEAgLTM1Nyw3ICszNTcsNyBAQAogICAgICAgICByZXR1cm4gRkFMU0U7CiAgICAgfQogCi0gICAgZHByaW50Zl9wcm9maWxlKCBzdGRkZWIsICJTYXZpbmcgJyVzJyBpbnRvICclcydcbiIsCisgICAgZHByaW50Zl9pbmZvKHByb2ZpbGUsICJTYXZpbmcgJyVzJyBpbnRvICclcydcbiIsCiAgICAgICAgICAgICAgICAgICAgICBDdXJQcm9maWxlLmRvc19uYW1lLCB1bml4X25hbWUgKTsKICAgICBQUk9GSUxFX1NhdmUoIGZpbGUsIEN1clByb2ZpbGUuc2VjdGlvbiApOwogICAgIGZjbG9zZSggZmlsZSApOwpAQCAtMzgwLDcgKzM4MCw3IEBACiAKICAgICBpZiAoQ3VyUHJvZmlsZS5maWxlbmFtZSAmJiAhc3RyY21wKCBmaWxlbmFtZSwgQ3VyUHJvZmlsZS5maWxlbmFtZSApKQogICAgIHsKLSAgICAgICAgZHByaW50Zl9wcm9maWxlKCBzdGRkZWIsICJQUk9GSUxFX09wZW4oJXMpOiBhbHJlYWR5IG9wZW5lZFxuIiwKKyAgICAgICAgZHByaW50Zl9pbmZvKHByb2ZpbGUsICJQUk9GSUxFX09wZW4oJXMpOiBhbHJlYWR5IG9wZW5lZFxuIiwKICAgICAgICAgICAgICAgICAgICAgICAgICBmaWxlbmFtZSApOwogICAgICAgICByZXR1cm4gVFJVRTsKICAgICB9CkBAIC00MDAsNyArNDAwLDcgQEAKICAgICBpZiAoQ3VyUHJvZmlsZS5kb3NfbmFtZSAmJgogICAgICAgICAhc3RyY21wKCBmdWxsX25hbWUuc2hvcnRfbmFtZSwgQ3VyUHJvZmlsZS5kb3NfbmFtZSApKQogICAgIHsKLSAgICAgICAgZHByaW50Zl9wcm9maWxlKCBzdGRkZWIsICJQUk9GSUxFX09wZW4oJXMpOiBhbHJlYWR5IG9wZW5lZFxuIiwKKyAgICAgICAgZHByaW50Zl9pbmZvKHByb2ZpbGUsICJQUk9GSUxFX09wZW4oJXMpOiBhbHJlYWR5IG9wZW5lZFxuIiwKICAgICAgICAgICAgICAgICAgICAgICAgICBmaWxlbmFtZSApOwogICAgICAgICByZXR1cm4gVFJVRTsKICAgICB9CkBAIC00MjksNyArNDI5LDcgQEAKICAgICAgICAgQ2hhckxvd2VyMzJBKCBwICk7CiAgICAgICAgIGlmICgoZmlsZSA9IGZvcGVuKCBidWZmZXIsICJyIiApKSkKICAgICAgICAgewotICAgICAgICAgICAgZHByaW50Zl9wcm9maWxlKCBzdGRkZWIsICJQUk9GSUxFX09wZW4oJXMpOiBmb3VuZCBpdCBpbiAlc1xuIiwKKyAgICAgICAgICAgIGRwcmludGZfaW5mbyhwcm9maWxlLCAiUFJPRklMRV9PcGVuKCVzKTogZm91bmQgaXQgaW4gJXNcbiIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbGVuYW1lLCBidWZmZXIgKTsKICAgICAgICAgICAgIEN1clByb2ZpbGUudW5peF9uYW1lID0gSEVBUF9zdHJkdXBBKCBTeXN0ZW1IZWFwLCAwLCBidWZmZXIgKTsKICAgICAgICAgfQpAQCAtNDQwLDcgKzQ0MCw3IEBACiAgICAgICAgIEN1clByb2ZpbGUudW5peF9uYW1lID0gSEVBUF9zdHJkdXBBKCBTeXN0ZW1IZWFwLCAwLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnVsbF9uYW1lLmxvbmdfbmFtZSApOwogICAgICAgICBpZiAoKGZpbGUgPSBmb3BlbiggZnVsbF9uYW1lLmxvbmdfbmFtZSwgInIiICkpKQotICAgICAgICAgICAgZHByaW50Zl9wcm9maWxlKCBzdGRkZWIsICJQUk9GSUxFX09wZW4oJXMpOiBmb3VuZCBpdCBpbiAlc1xuIiwKKyAgICAgICAgICAgIGRwcmludGZfaW5mbyhwcm9maWxlLCAiUFJPRklMRV9PcGVuKCVzKTogZm91bmQgaXQgaW4gJXNcbiIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbGVuYW1lLCBmdWxsX25hbWUubG9uZ19uYW1lICk7CiAgICAgfQogCkBAIC01MDYsNyArNTA2LDcgQEAKICAgICAgICAga2V5ID0gUFJPRklMRV9GaW5kKCAmQ3VyUHJvZmlsZS5zZWN0aW9uLCBzZWN0aW9uLCBrZXlfbmFtZSwgRkFMU0UgKTsKICAgICAgICAgUFJPRklMRV9Db3B5RW50cnkoIGJ1ZmZlciwgKGtleSAmJiBrZXktPnZhbHVlKSA/IGtleS0+dmFsdWUgOiBkZWZfdmFsLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgbGVuLCBGQUxTRSApOwotICAgICAgICBkcHJpbnRmX3Byb2ZpbGUoIHN0ZGRlYiwgIlBST0ZJTEVfR2V0U3RyaW5nKCclcycsJyVzJywnJXMnKTogcmV0dXJuaW5nICclcydcbiIsCisgICAgICAgIGRwcmludGZfaW5mbyhwcm9maWxlLCAiUFJPRklMRV9HZXRTdHJpbmcoJyVzJywnJXMnLCclcycpOiByZXR1cm5pbmcgJyVzJ1xuIiwKICAgICAgICAgICAgICAgICAgICAgICAgICBzZWN0aW9uLCBrZXlfbmFtZSwgZGVmX3ZhbCwgYnVmZmVyICk7CiAgICAgICAgIHJldHVybiBzdHJsZW4oIGJ1ZmZlciApOwogICAgIH0KQEAgLTUyNCw3ICs1MjQsNyBAQAogewogICAgIGlmICgha2V5X25hbWUpICAvKiBEZWxldGUgYSB3aG9sZSBzZWN0aW9uICovCiAgICAgewotICAgICAgICBkcHJpbnRmX3Byb2ZpbGUoc3RkZGViLCAiUFJPRklMRV9EZWxldGVTZWN0aW9uKCclcycpXG4iLCBzZWN0aW9uX25hbWUpOworICAgICAgICBkcHJpbnRmX2luZm8ocHJvZmlsZSwgIlBST0ZJTEVfRGVsZXRlU2VjdGlvbignJXMnKVxuIiwgc2VjdGlvbl9uYW1lKTsKICAgICAgICAgQ3VyUHJvZmlsZS5jaGFuZ2VkIHw9IFBST0ZJTEVfRGVsZXRlU2VjdGlvbiggJkN1clByb2ZpbGUuc2VjdGlvbiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VjdGlvbl9uYW1lICk7CiAgICAgICAgIHJldHVybiBUUlVFOyAgICAgICAgIC8qIEV2ZW4gaWYgUFJPRklMRV9EZWxldGVTZWN0aW9uKCkgaGFzIGZhaWxlZCwKQEAgLTUzMiw3ICs1MzIsNyBAQAogICAgIH0KICAgICBlbHNlIGlmICghdmFsdWUpICAvKiBEZWxldGUgYSBrZXkgKi8KICAgICB7Ci0gICAgICAgIGRwcmludGZfcHJvZmlsZSggc3RkZGViLCAiUFJPRklMRV9EZWxldGVLZXkoJyVzJywnJXMnKVxuIiwKKyAgICAgICAgZHByaW50Zl9pbmZvKHByb2ZpbGUsICJQUk9GSUxFX0RlbGV0ZUtleSgnJXMnLCclcycpXG4iLAogICAgICAgICAgICAgICAgICAgICAgICAgIHNlY3Rpb25fbmFtZSwga2V5X25hbWUgKTsKICAgICAgICAgQ3VyUHJvZmlsZS5jaGFuZ2VkIHw9IFBST0ZJTEVfRGVsZXRlS2V5KCAmQ3VyUHJvZmlsZS5zZWN0aW9uLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlY3Rpb25fbmFtZSwga2V5X25hbWUgKTsKQEAgLTU0MiwyMCArNTQyLDIwIEBACiAgICAgewogICAgICAgICBQUk9GSUxFS0VZICprZXkgPSBQUk9GSUxFX0ZpbmQoICZDdXJQcm9maWxlLnNlY3Rpb24sIHNlY3Rpb25fbmFtZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBrZXlfbmFtZSwgVFJVRSApOwotICAgICAgICBkcHJpbnRmX3Byb2ZpbGUoIHN0ZGRlYiwgIlBST0ZJTEVfU2V0U3RyaW5nKCclcycsJyVzJywnJXMnKTogIiwKKyAgICAgICAgZHByaW50Zl9pbmZvKHByb2ZpbGUsICJQUk9GSUxFX1NldFN0cmluZygnJXMnLCclcycsJyVzJyk6IFxuIiwKICAgICAgICAgICAgICAgICAgICAgICAgICBzZWN0aW9uX25hbWUsIGtleV9uYW1lLCB2YWx1ZSApOwogICAgICAgICBpZiAoIWtleSkgcmV0dXJuIEZBTFNFOwogICAgICAgICBpZiAoa2V5LT52YWx1ZSkKICAgICAgICAgewogICAgICAgICAgICAgaWYgKCFzdHJjbXAoIGtleS0+dmFsdWUsIHZhbHVlICkpCiAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgZHByaW50Zl9wcm9maWxlKCBzdGRkZWIsICJubyBjaGFuZ2UgbmVlZGVkXG4iICk7CisgICAgICAgICAgICAgICAgZHByaW50Zl9pbmZvKHByb2ZpbGUsICIgIG5vIGNoYW5nZSBuZWVkZWRcbiIgKTsKICAgICAgICAgICAgICAgICByZXR1cm4gVFJVRTsgIC8qIE5vIGNoYW5nZSBuZWVkZWQgKi8KICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGRwcmludGZfcHJvZmlsZSggc3RkZGViLCAicmVwbGFjaW5nICclcydcbiIsIGtleS0+dmFsdWUgKTsKKyAgICAgICAgICAgIGRwcmludGZfaW5mbyhwcm9maWxlLCAiICByZXBsYWNpbmcgJyVzJ1xuIiwga2V5LT52YWx1ZSApOwogICAgICAgICAgICAgSGVhcEZyZWUoIFN5c3RlbUhlYXAsIDAsIGtleS0+dmFsdWUgKTsKICAgICAgICAgfQotICAgICAgICBlbHNlIGRwcmludGZfcHJvZmlsZSggc3RkZGViLCAiY3JlYXRpbmcga2V5XG4iICk7CisgICAgICAgIGVsc2UgZHByaW50Zl9pbmZvKHByb2ZpbGUsICIgIGNyZWF0aW5nIGtleVxuIiApOwogICAgICAgICBrZXktPnZhbHVlID0gSEVBUF9zdHJkdXBBKCBTeXN0ZW1IZWFwLCAwLCB2YWx1ZSApOwogICAgICAgICBDdXJQcm9maWxlLmNoYW5nZWQgPSBUUlVFOwogICAgIH0KQEAgLTU3Niw3ICs1NzYsNyBAQAogICAgICAgICBQUk9GSUxFS0VZICprZXkgPSBQUk9GSUxFX0ZpbmQoJldpbmVQcm9maWxlLCBzZWN0aW9uLCBrZXlfbmFtZSwgRkFMU0UpOwogICAgICAgICBQUk9GSUxFX0NvcHlFbnRyeSggYnVmZmVyLCAoa2V5ICYmIGtleS0+dmFsdWUpID8ga2V5LT52YWx1ZSA6IGRlZiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxlbiwgVFJVRSApOwotICAgICAgICBkcHJpbnRmX3Byb2ZpbGUoIHN0ZGRlYiwgIlBST0ZJTEVfR2V0V2luZUluaVN0cmluZygnJXMnLCclcycsJyVzJyk6IHJldHVybmluZyAnJXMnXG4iLAorICAgICAgICBkcHJpbnRmX2luZm8ocHJvZmlsZSwgIlBST0ZJTEVfR2V0V2luZUluaVN0cmluZygnJXMnLCclcycsJyVzJyk6IHJldHVybmluZyAnJXMnXG4iLAogICAgICAgICAgICAgICAgICAgICAgICAgIHNlY3Rpb24sIGtleV9uYW1lLCBkZWYsIGJ1ZmZlciApOwogICAgICAgICByZXR1cm4gc3RybGVuKCBidWZmZXIgKTsKICAgICB9CkBAIC03MDcsNyArNzA3LDcgQEAKIAlyZXR2YWwgPSBkZWY7CiAgICAgfQogCi0gICAgZHByaW50Zl9wcm9maWxlKHN0ZGRlYiwgIlBST0ZJTEVfR2V0V2luZUluaUJvb2woXCIlc1wiLCBcIiVzXCIsICVzKSwgIgorICAgIGRwcmludGZfaW5mbyhwcm9maWxlLCAiUFJPRklMRV9HZXRXaW5lSW5pQm9vbChcIiVzXCIsIFwiJXNcIiwgJXMpLCAiCiAJCSAgICAiWyVjXSwgcmV0ICVzLlxuIiwgc2VjdGlvbiwga2V5X25hbWUsCiAJCSAgICBkZWYgPyAiVFJVRSIgOiAiRkFMU0UiLCBrZXlfdmFsdWVbMF0sCiAJCSAgICByZXR2YWwgPyAiVFJVRSIgOiAiRkFMU0UiKTsKQEAgLTEwMzEsMTEgKzEwMzEsMTEgQEAKIHsKICAgICBjaGFyICpwID0oY2hhciopc3RyaW5nOwogCi0gICAgZnByaW50Ziggc3RkbmltcCwiV3JpdGVQcml2YXRlUHJvZmlsZVNlY3Rpb24zMkEgZW1wdHkgc3R1cFxuIik7Ci0gICAgaWYgKGRlYnVnZ2luZ19wcm9maWxlKSB7Ci0gICAgICBmcHJpbnRmKHN0ZGRlYiwiZmlsZSglcykgPT4gWyVzXVxuIiwgZmlsZW5hbWUsc2VjdGlvbik7CisgICAgZHByaW50Zl9maXhtZShwcm9maWxlLCAiV3JpdGVQcml2YXRlUHJvZmlsZVNlY3Rpb24zMkEgZW1wdHkgc3R1cFxuIik7CisgICAgaWYgKGRlYnVnZ2luZ19pbmZvKHByb2ZpbGUpKSB7CisgICAgICBkcHJpbnRmX2luZm8ocHJvZmlsZSwgImZpbGUoJXMpID0+IFslc11cbiIsIGZpbGVuYW1lLCBzZWN0aW9uKTsKICAgICAgIHdoaWxlICgqKHArMSkpIHsKLQlmcHJpbnRmKHN0ZGRlYiwiJXNcbiIscCk7CisJZHByaW50Zl9pbmZvKHByb2ZpbGUsICIlc1xuIiwgcCk7CiAgICAgICAgIHAgKz0gc3RybGVuKHApOwogCXAgKz0gMTsKICAgICAgIH0KZGlmZiAtLWdpdCBhL2dyYXBoaWNzL2JpdGJsdC5jIGIvZ3JhcGhpY3MvYml0Ymx0LmMKaW5kZXggMjM1NmRlOC4uZjc3OWRmZCAxMDA2NDQKLS0tIGEvZ3JhcGhpY3MvYml0Ymx0LmMKKysrIGIvZ3JhcGhpY3MvYml0Ymx0LmMKQEAgLTUsNyArNSw2IEBACiAgKi8KIAogI2luY2x1ZGUgImRjLmgiCi0jaW5jbHVkZSAic3RkZGVidWcuaCIKICNpbmNsdWRlICJkZWJ1Zy5oIgogCiAKQEAgLTE4LDcgKzE3LDcgQEAKICAgICBEQyAqIGRjID0gRENfR2V0RENQdHIoIGhkYyApOwogICAgIGlmICghZGMgfHwgIWRjLT5mdW5jcy0+cFBhdEJsdCkgcmV0dXJuIEZBTFNFOwogCi0gICAgZHByaW50Zl9iaXRibHQoIHN0ZGRlYiwgIlBhdEJsdDE2OiAlMDR4ICVkLCVkICVkeCVkICUwNmx4XG4iLAorICAgIGRwcmludGZfaW5mbyhiaXRibHQsICJQYXRCbHQxNjogJTA0eCAlZCwlZCAlZHglZCAlMDZseFxuIiwKICAgICAgICAgICAgICAgICAgICAgaGRjLCBsZWZ0LCB0b3AsIHdpZHRoLCBoZWlnaHQsIHJvcCApOwogICAgIHJldHVybiBkYy0+ZnVuY3MtPnBQYXRCbHQoIGRjLCBsZWZ0LCB0b3AsIHdpZHRoLCBoZWlnaHQsIHJvcCApOwogfQpAQCAtMzMsNyArMzIsNyBAQAogICAgIERDICogZGMgPSBEQ19HZXREQ1B0ciggaGRjICk7CiAgICAgaWYgKCFkYyB8fCAhZGMtPmZ1bmNzLT5wUGF0Qmx0KSByZXR1cm4gRkFMU0U7CiAKLSAgICBkcHJpbnRmX2JpdGJsdCggc3RkZGViLCAiUGF0Qmx0MzI6ICUwNHggJWQsJWQgJWR4JWQgJTA2bHhcbiIsCisgICAgZHByaW50Zl9pbmZvKGJpdGJsdCwgIlBhdEJsdDMyOiAlMDR4ICVkLCVkICVkeCVkICUwNmx4XG4iLAogICAgICAgICAgICAgICAgICAgICBoZGMsIGxlZnQsIHRvcCwgd2lkdGgsIGhlaWdodCwgcm9wICk7CiAgICAgcmV0dXJuIGRjLT5mdW5jcy0+cFBhdEJsdCggZGMsIGxlZnQsIHRvcCwgd2lkdGgsIGhlaWdodCwgcm9wICk7CiB9CkBAIC01Miw3ICs1MSw3IEBACiAgICAgaWYgKCFkY0RzdC0+ZnVuY3MtPnBCaXRCbHQpIHJldHVybiBGQUxTRTsKICAgICBkY1NyYyA9IERDX0dldERDUHRyKCBoZGNTcmMgKTsKIAotICAgIGRwcmludGZfYml0Ymx0KHN0ZGRlYiwKKyAgICBkcHJpbnRmX2luZm8oYml0Ymx0LAogICAgICAgICAgICAgICAgICJCaXRCbHQxNjogaGRjU3JjPSUwNHggJWQsJWQgJWQgYnBwIC0+IGhkY0Rlc3Q9JTA0eCAlZCwlZCAlZHglZHglZCByb3A9JTA2bHhcbiIsCiAgICAgICAgICAgICAgICAgaGRjU3JjLCB4U3JjLCB5U3JjLCBkY1NyYyA/IGRjU3JjLT53LmJpdHNQZXJQaXhlbCA6IDAsCiAgICAgICAgICAgICAgICAgaGRjRHN0LCB4RHN0LCB5RHN0LCB3aWR0aCwgaGVpZ2h0LCBkY0RzdC0+dy5iaXRzUGVyUGl4ZWwsIHJvcCk7CkBAIC03NCw3ICs3Myw3IEBACiAgICAgaWYgKCFkY0RzdC0+ZnVuY3MtPnBCaXRCbHQpIHJldHVybiBGQUxTRTsKICAgICBkY1NyYyA9IERDX0dldERDUHRyKCBoZGNTcmMgKTsKIAotICAgIGRwcmludGZfYml0Ymx0KHN0ZGRlYiwKKyAgICBkcHJpbnRmX2luZm8oYml0Ymx0LAogICAgICAgICAgICAgICAgICJCaXRCbHQzMjogaGRjU3JjPSUwNHggJWQsJWQgJWQgYnBwIC0+IGhkY0Rlc3Q9JTA0eCAlZCwlZCAlZHglZHglZCByb3A9JTA2bHhcbiIsCiAgICAgICAgICAgICAgICAgaGRjU3JjLCB4U3JjLCB5U3JjLCBkY1NyYyA/IGRjU3JjLT53LmJpdHNQZXJQaXhlbCA6IDAsCiAgICAgICAgICAgICAgICAgaGRjRHN0LCB4RHN0LCB5RHN0LCB3aWR0aCwgaGVpZ2h0LCBkY0RzdC0+dy5iaXRzUGVyUGl4ZWwsIHJvcCk7CkBAIC05Nyw3ICs5Niw3IEBACiAgICAgaWYgKCFkY0RzdC0+ZnVuY3MtPnBTdHJldGNoQmx0KSByZXR1cm4gRkFMU0U7CiAgICAgZGNTcmMgPSBEQ19HZXREQ1B0ciggaGRjU3JjICk7CiAKLSAgICBkcHJpbnRmX2JpdGJsdChzdGRkZWIsCisgICAgZHByaW50Zl9pbmZvKGJpdGJsdCwKICAgICAgICAgIlN0cmV0Y2hCbHQxNjogJTA0eCAlZCwlZCAlZHglZHglZCAtPiAlMDR4ICVkLCVkICVkeCVkeCVkIHJvcD0lMDZseFxuIiwKICAgICAgICAgICAgICAgICAgICBoZGNTcmMsIHhTcmMsIHlTcmMsIHdpZHRoU3JjLCBoZWlnaHRTcmMsCiAgICAgICAgICAgICAgICAgICAgZGNTcmMgPyBkY1NyYy0+dy5iaXRzUGVyUGl4ZWwgOiAwLCBoZGNEc3QsIHhEc3QsIHlEc3QsCkBAIC0xMjIsNyArMTIxLDcgQEAKICAgICBpZiAoIWRjRHN0LT5mdW5jcy0+cFN0cmV0Y2hCbHQpIHJldHVybiBGQUxTRTsKICAgICBkY1NyYyA9IERDX0dldERDUHRyKCBoZGNTcmMgKTsKIAotICAgIGRwcmludGZfYml0Ymx0KHN0ZGRlYiwKKyAgICBkcHJpbnRmX2luZm8oYml0Ymx0LAogICAgICAgICAiU3RyZXRjaEJsdDMyOiAlMDR4ICVkLCVkICVkeCVkeCVkIC0+ICUwNHggJWQsJWQgJWR4JWR4JWQgcm9wPSUwNmx4XG4iLAogICAgICAgICAgICAgICAgICAgIGhkY1NyYywgeFNyYywgeVNyYywgd2lkdGhTcmMsIGhlaWdodFNyYywKICAgICAgICAgICAgICAgICAgICBkY1NyYyA/IGRjU3JjLT53LmJpdHNQZXJQaXhlbCA6IDAsIGhkY0RzdCwgeERzdCwgeURzdCwKZGlmZiAtLWdpdCBhL2dyYXBoaWNzL2RkcmF3LmMgYi9ncmFwaGljcy9kZHJhdy5jCmluZGV4IGNlNDE3ZjcuLjNiMTM1MDcgMTAwNjQ0Ci0tLSBhL2dyYXBoaWNzL2RkcmF3LmMKKysrIGIvZ3JhcGhpY3MvZGRyYXcuYwpAQCAtMSw0ICsxLDQgQEAKLS8qCQlEaXJlY3REcmF3CisvKgkJRGlyZWN0RHJhdyB1c2luZyBER0EKICAqCiAgKiBDb3B5cmlnaHQgMTk5NywxOTk4IE1hcmN1cyBNZWlzc25lcgogICovCkBAIC0xNCw3ICsxNCw4IEBACiAvKiBQcm9ncmVzcyBvbiBmb2xsb3dpbmcgcHJvZ3JhbXM6CiAgKgogICogLSBEaWFibG8gWzY0MHg0ODB4OF06Ci0gKiAgIFRoZSBtb3ZpZXMgcGxheS4gVGhlIGdhbWUgZG9lc24ndCB3b3JrIHlldC4KKyAqICAgVGhlIG1vdmllcyBwbGF5LiBUaGUgZ2FtZSBkb2Vzbid0IHdvcmssIGl0IHNvbWVob3cgdHJpZXMgdG8gd3JpdGUKKyAqICAgaW50byAyIGxpbmVzIF9CRUZPUkVfIHRoZSBzdGFydCBvZiB0aGUgc3VyZmFjZS4gRG9uJ3Qga25vdyB3aHkuCiAgKgogICogLSBXaW5nQ29tbWFuZGVyIDQgLyBXaW45NSBQYXRjaCBbNjQweDQ4MHg4XToKICAqICAgVGhlIGludHJvbW92aWUgcGxheXMsIGluIDggYml0IG1vZGUgKHRvIHJlY29uZmlndXJlIHdjNCwgcnVuIHdpbmUKQEAgLTIyLDIyICsyMywyNiBAQAogICogICBteSBNYXRyb3ggTXlzdGlxdWUgd2hpY2ggdXNlcyA1NjUgKHJnYikgY29sb3J3ZWlnaHQgaW5zdGVhZCBvZiB0aGUgdXN1YWwKICAqICAgNTU1LiBTcGVjaWZ5aW5nIGl0IGluIEREUElYRUxGT1JNQVQgZGlkbid0IGhlbHAuCiAgKiAgIFJlcXVpcmVzIHRvIGJlIHJ1biBpbiA2NDB4NDgweGRlcHRoIG1vZGUgKGRvZXNuJ3Qgc2VlbSB0byBoZWVkCi0gKiAgIEREU1VSRkFDRURFU0MubFBpdGNoKS4KKyAqICAgRERTVVJGQUNFREVTQy5sUGl0Y2gpLiBZb3UgY2FuIGZseSB0aGUgZmlyc3QgbWlzc2lvbiB3aXRoIE1hbmlhYywgYnV0CisgKiAgIGl0IGNyYXNoZXMgYXMgc29vbiBhcyB5b3UgYXJyaXZlIGF0IEJsdWUgUG9pbnQgU3RhdGlvbi4uLgogICoKICAqIC0gTW9ua2V5IElzbGFuZCAzIFs2NDB4NDgweDhdOgotICogICBHb2VzIHRvIHRoZSBlYXN5L2hhcmQgc2VsZWN0aW9uIHNjcmVlbiwgdGhlbiBoYW5ncyBkdWUgdG8gbm90IE1UIHNhZmUKLSAqICAgWExpYnMuCisgKiAgIEdvZXMgdG8gdGhlIGVhc3kvaGFyZCBzZWxlY3Rpb24gc2NyZWVuLCB0aGVuIGhhbmdzIGR1ZSB0byBNVCBwcm9ibGVtcy4KICAqIAogICogLSBEaXNjV29ybGQgMiBbNjQweDQ4MHg4XToKLSAqICAgUGxheXMgdGhyb3VnaCBuZWFybHkgYWxsIGludHJvIG1vdmllcy4gU291bmQgYW5kIGFuaW1hdGlvbiBhIGJpdCBicm9rZW4uCisgKiAgIFtDcmFzaGVzIHdpdGggJ2NsaScgaW4gcmVsZWFzZWQgdmVyc2lvbi4gWWVzLiBQcml2aWxlZ2VkIGluc3RydWN0aW9ucworICogICAgaW4gMzJiaXQgY29kZS4gV2lsbCB0aGV5IGV2ZXIgbGVhcm4uLi5dCisgKiAgIFBsYXlzIHRocm91Z2ggbmVhcmx5IGFsbCBpbnRybyBtb3ZpZXMuIFNvdW5kIGFuZCBhbmltYXRpb24gc2tpcCBhIGxvdCBvZgorICogICBzdHVmZiAocG9zc2libGUgRGlyZWN0U291bmQgcHJvYmxlbSkuCiAgKiAKICAqIC0gWHZUIFs2NDB4NDgweDE2XToKICAqICAgU2hvd3MgdGhlIHNwbGFzaCBzY3JlZW4sIHRoZW4gZmFpbHMgd2l0aCBtaXNzaW5nIEpveXN0aWNrLgogICoKICAqIC0gVG9tYiBSYWlkZXIgMiBEZW1vICh1c2luZyA4IGJpdCByZW5kZXJlcikgWzY0MHg0ODB4OF06Ci0gKiAgIFNob3dzIHNlbGVjdGlvbiBzY3JlZW4sIGJ1dCBrZXlib2FyZCBpbnB1dCBkb2Vzbid0IHdvcmsuCisgKiAgIFBsYXlhYmxlLiBTb3VuZCBpcyB3ZWlyZC4KICAqCiAgKiAtIFdpbmdDb21tYW5kZXIgUHJvcGhlY3kgRGVtbyAodXNpbmcgc29mdHdhcmUgcmVuZGVyZXIpIFs2NDB4NDgweDE2XToKKyAqICAgW0NyYXNoZXMgd2l0aCBhbiBpbnZhbGlkIG9wY29kZSAob3V0YikgaW4gdGhlIHJlbGVhc2UgdmVyc2lvbi5dCiAgKiAgIFBsYXlzIGludHJvbW92aWUsIGhhbmdzIGluIHNlbGVjdGlvbiBzY3JlZW4gKG5vIGtleWJvYXJkIGlucHV0LCBwcm9iYWJseQogICogICBEaXJlY3RJbnB1dCBwcm9ibGVtKS4KICAqLwpAQCAtNTgsMTAgKzYzLDggQEAKICNpbmNsdWRlICJkYy5oIgogI2luY2x1ZGUgIndpbi5oIgogI2luY2x1ZGUgIm1pc2NlbXUuaCIKLSNpbmNsdWRlICJtbXN5c3RlbS5oIgogI2luY2x1ZGUgImRkcmF3LmgiCiAjaW5jbHVkZSAiZDNkLmgiCi0jaW5jbHVkZSAic3RkZGVidWcuaCIKICNpbmNsdWRlICJkZWJ1Zy5oIgogCiAjaWZkZWYgSEFWRV9MSUJYWEY4NkRHQQpAQCAtMzAxLDE1ICszMDQsMTYgQEAKIAlpbnQJCQluaXRlbXM7CiAKIAlpZiAoIXZpKQotCQl2aSA9IFhHZXRWaXN1YWxJbmZvKGRpc3BsYXksVmlzdWFsTm9NYXNrLCZ2dCwmbml0ZW1zKTsKKwkJdmkgPSBUU1hHZXRWaXN1YWxJbmZvKGRpc3BsYXksVmlzdWFsTm9NYXNrLCZ2dCwmbml0ZW1zKTsKIAotCXBmLT5kd0ZvdXJDQyA9IG1taW9GT1VSQ0MoJ1InLCdHJywnQicsJyAnKTsKKwlwZi0+ZHdGb3VyQ0MgPSAwOwogCWlmIChkZHJhdy0+ZC5kZXB0aD09OCkgewogCQlwZi0+ZHdGbGFncyAJCT0gRERQRl9SR0J8RERQRl9QQUxFVFRFSU5ERVhFRDg7CiAJCXBmLT54LmR3UkdCQml0Q291bnQJPSA4OwogCQlwZi0+eS5kd1JCaXRNYXNrICAJPSAwOwogCQlwZi0+ei5kd0dCaXRNYXNrICAJPSAwOwogCQlwZi0+eHguZHdCQml0TWFzayAJPSAwOworCQlwZi0+eHkuZHdSR0JBbHBoYUJpdE1hc2s9IDA7CiAJCXJldHVybiAwOwogCX0KIAlpZiAoZGRyYXctPmQuZGVwdGg9PTE2KSB7CkBAIC0zMTgsNiArMzIyLDcgQEAKIAkJcGYtPnkuZHdSQml0TWFzawk9IHZpWzBdLnJlZF9tYXNrOwogCQlwZi0+ei5kd0dCaXRNYXNrCT0gdmlbMF0uZ3JlZW5fbWFzazsKIAkJcGYtPnh4LmR3QkJpdE1hc2sJPSB2aVswXS5ibHVlX21hc2s7CisJCXBmLT54eS5kd1JHQkFscGhhQml0TWFzaz0gMDsKIAkJcmV0dXJuIDA7CiAJfQogCWZwcmludGYoc3RkZXJyLCJfZ2V0cGl4ZWxmb3JtYXQ6b29wcz9cbiIpOwpAQCAtMzMxLDIyICszMzYsMjIgQEAKIHN0YXRpYyBIUkVTVUxUIFdJTkFQSSBJRGlyZWN0RHJhd1N1cmZhY2VfTG9jaygKICAgICBMUERJUkVDVERSQVdTVVJGQUNFIHRoaXMsTFBSRUNUMzIgbHByZWN0LExQRERTVVJGQUNFREVTQyBscGRkc2QsRFdPUkQgZmxhZ3MsIEhBTkRMRTMyIGhuZAogKSB7Ci0JaWYgKGRlYnVnZ2luZ19kZHJhdyB8fCAoZmxhZ3MgJiB+KERETE9DS19XQUlUfERETE9DS19SRUFET05MWXxERExPQ0tfV1JJVEVPTkxZKSkpCi0JCWZwcmludGYoc3RkZXJyLCJJRGlyZWN0RHJhd1N1cmZhY2UoJXApLT5Mb2NrKCVwLCVwLCUwOGx4LCUwOGx4KVxuIiwKLQkJCXRoaXMsbHByZWN0LGxwZGRzZCxmbGFncywoRFdPUkQpaG5kCi0JCSk7CisgICAgICAgIGRwcmludGZfaW5mbyhkZHJhdywgIklEaXJlY3REcmF3U3VyZmFjZSglcCktPkxvY2soJXAsJXAsJTA4bHgsJTA4bHgpXG4iLAorCQl0aGlzLGxwcmVjdCxscGRkc2QsZmxhZ3MsKERXT1JEKWhuZCk7CisJaWYgKGZsYWdzICYgfihERExPQ0tfV0FJVHxERExPQ0tfUkVBRE9OTFl8RERMT0NLX1dSSVRFT05MWSkpCisJICAgIGRwcmludGZfd2FybihkZHJhdywgIklEaXJlY3REcmF3U3VyZmFjZSglcCktPkxvY2soJXAsJXAsJTA4bHgsJTA4bHgpXG4iLAorCQkJIHRoaXMsbHByZWN0LGxwZGRzZCxmbGFncywoRFdPUkQpaG5kKTsKIAogCWlmIChscHJlY3QpIHsKLQkJLyoKLQkJZnByaW50ZihzdGRlcnIsIglscHJlY3Q6ICVkeCVkLSVkeCVkXG4iLAorCQlkcHJpbnRmX2luZm8oZGRyYXcsIglscHJlY3Q6ICVkeCVkLSVkeCVkXG4iLAogCQkJbHByZWN0LT50b3AsbHByZWN0LT5sZWZ0LGxwcmVjdC0+Ym90dG9tLGxwcmVjdC0+cmlnaHQKIAkJKTsKLQkJICovCiAJCWxwZGRzZC0+eS5scFN1cmZhY2UgPQl0aGlzLT5zLnN1cmZhY2UrCiAJCQkJCShscHJlY3QtPnRvcCp0aGlzLT5zLmxwaXRjaCkrCiAJCQkJCShscHJlY3QtPmxlZnQqKHRoaXMtPnMuZGRyYXctPmQuZGVwdGgvOCkpOwogCX0gZWxzZQogCQlscGRkc2QtPnkubHBTdXJmYWNlID0gdGhpcy0+cy5zdXJmYWNlOworCWxwZGRzZC0+ZHdGbGFncyA9IEREU0RfV0lEVEh8RERTRF9IRUlHSFR8RERTRF9QSVhFTEZPUk1BVHxERFNEX1BJVENIfEREU0RfTFBTVVJGQUNFOwogCWxwZGRzZC0+ZHdXaWR0aAkJPSB0aGlzLT5zLndpZHRoOwogCWxwZGRzZC0+ZHdIZWlnaHQJPSB0aGlzLT5zLmhlaWdodDsKIAlscGRkc2QtPmxQaXRjaAkJPSB0aGlzLT5zLmxwaXRjaDsKQEAgLTM1NywxNCArMzYyLDE0IEBACiBzdGF0aWMgSFJFU1VMVCBXSU5BUEkgSURpcmVjdERyYXdTdXJmYWNlX1VubG9jaygKIAlMUERJUkVDVERSQVdTVVJGQUNFIHRoaXMsTFBWT0lEIHN1cmZhY2UKICkgewotCWRwcmludGZfZGRyYXcoc3RkZXJyLCJJRGlyZWN0RHJhd1N1cmZhY2UoJXApLT5VbmxvY2soJXApXG4iLHRoaXMsc3VyZmFjZSk7CisJZHByaW50Zl9pbmZvKGRkcmF3LCJJRGlyZWN0RHJhd1N1cmZhY2UoJXApLT5VbmxvY2soJXApXG4iLHRoaXMsc3VyZmFjZSk7CiAJcmV0dXJuIDA7CiB9CiAKIHN0YXRpYyBIUkVTVUxUIFdJTkFQSSBJRGlyZWN0RHJhd1N1cmZhY2VfRmxpcCgKIAlMUERJUkVDVERSQVdTVVJGQUNFIHRoaXMsTFBESVJFQ1REUkFXU1VSRkFDRSBmbGlwdG8sRFdPUkQgZHdGbGFncwogKSB7Ci0JZHByaW50Zl9kZHJhdyhzdGRlcnIsIklEaXJlY3REcmF3U3VyZmFjZSglcCktPkZsaXAoJXAsJTA4bHgpXG4iLHRoaXMsZmxpcHRvLGR3RmxhZ3MpOworCWRwcmludGZfaW5mbyhkZHJhdywiSURpcmVjdERyYXdTdXJmYWNlKCVwKS0+RmxpcCglcCwlMDhseClcbiIsdGhpcyxmbGlwdG8sZHdGbGFncyk7CiAJaWYgKCFmbGlwdG8pIHsKIAkJaWYgKHRoaXMtPnMuYmFja2J1ZmZlcikKIAkJCWZsaXB0byA9IHRoaXMtPnMuYmFja2J1ZmZlcjsKQEAgLTM5NCw3ICszOTksNyBAQAogc3RhdGljIEhSRVNVTFQgV0lOQVBJIElEaXJlY3REcmF3U3VyZmFjZV9TZXRQYWxldHRlKAogCUxQRElSRUNURFJBV1NVUkZBQ0UgdGhpcyxMUERJUkVDVERSQVdQQUxFVFRFIHBhbAogKSB7Ci0JZHByaW50Zl9kZHJhdyhzdGRlcnIsIklEaXJlY3REcmF3U3VyZmFjZSglcCktPlNldFBhbGV0dGUoJXApXG4iLHRoaXMscGFsKTsKKwlkcHJpbnRmX2luZm8oZGRyYXcsIklEaXJlY3REcmF3U3VyZmFjZSglcCktPlNldFBhbGV0dGUoJXApXG4iLHRoaXMscGFsKTsKIAl0aGlzLT5zLnBhbGV0dGUgPSBwYWw7IC8qIHByb2JhYmx5IGFkZHJlZiBpdCB0b28gKi8KIAlyZXR1cm4gMDsKIH0KQEAgLTQ3MCwxMSArNDc1LDEzIEBACiAJTFBESVJFQ1REUkFXU1VSRkFDRSB0aGlzLERXT1JEIGRzdHgsRFdPUkQgZHN0eSxMUERJUkVDVERSQVdTVVJGQUNFIHNyYyxMUFJFQ1QzMiByc3JjLERXT1JEIHRyYW5zCiApIHsKIAlpbnQJaSxicHA7Ci0JZnByaW50ZihzdGRlcnIsIklEaXJlY3REcmF3U3VyZmFjZSglcCktPkJsdEZhc3QoJWxkLCVsZCwlcCwlcCwlMDhseCksc3R1YiFcbiIsCi0JCXRoaXMsZHN0eCxkc3R5LHNyYyxyc3JjLHRyYW5zCi0JKTsKLQlmcHJpbnRmKHN0ZGVyciwiCXRyYW5zOiIpO19kdW1wX0REQkxURkFTVCh0cmFucyk7ZnByaW50ZihzdGRlcnIsIlxuIik7Ci0JZnByaW50ZihzdGRlcnIsIglzcmNyZWN0OiAlZHglZC0lZHglZFxuIixyc3JjLT5sZWZ0LHJzcmMtPnRvcCxyc3JjLT5yaWdodCxyc3JjLT5ib3R0b20pOworCWlmIChkZWJ1Z2dpbmdfaW5mbyhkZHJhdykpIHsKKwkgICAgZnByaW50ZihzdGRlcnIsIklEaXJlY3REcmF3U3VyZmFjZSglcCktPkJsdEZhc3QoJWxkLCVsZCwlcCwlcCwlMDhseCksc3R1YiFcbiIsCisJCSAgICB0aGlzLGRzdHgsZHN0eSxzcmMscnNyYyx0cmFucworCSAgICApOworCSAgICBmcHJpbnRmKHN0ZGVyciwiCXRyYW5zOiIpO19kdW1wX0REQkxURkFTVCh0cmFucyk7ZnByaW50ZihzdGRlcnIsIlxuIik7CisJICAgIGZwcmludGYoc3RkZXJyLCIJc3JjcmVjdDogJWR4JWQtJWR4JWRcbiIscnNyYy0+bGVmdCxyc3JjLT50b3AscnNyYy0+cmlnaHQscnNyYy0+Ym90dG9tKTsKKwl9CiAJYnBwID0gdGhpcy0+cy5kZHJhdy0+ZC5kZXB0aC84OwogCWZvciAoaT0wO2k8cnNyYy0+Ym90dG9tLXJzcmMtPnRvcDtpKyspIHsKIAkJbWVtY3B5KAl0aGlzLT5zLnN1cmZhY2UrKChpK2RzdHkpKnRoaXMtPnMud2lkdGgqYnBwKStkc3R4KmJwcCwKQEAgLTQ5Nyw3ICs1MDQsNyBAQAogc3RhdGljIEhSRVNVTFQgV0lOQVBJIElEaXJlY3REcmF3U3VyZmFjZV9HZXRDYXBzKAogCUxQRElSRUNURFJBV1NVUkZBQ0UgdGhpcyxMUEREU0NBUFMgY2FwcwogKSB7Ci0JZHByaW50Zl9kZHJhdyhzdGRlcnIsIklEaXJlY3REcmF3U3VyZmFjZSglcCktPkdldENhcHMoJXApXG4iLHRoaXMsY2Fwcyk7CisJZHByaW50Zl9pbmZvKGRkcmF3LCJJRGlyZWN0RHJhd1N1cmZhY2UoJXApLT5HZXRDYXBzKCVwKVxuIix0aGlzLGNhcHMpOwogCWNhcHMtPmR3Q2FwcyA9IEREQ0FQU19QQUxFVFRFOyAvKiBwcm9iYWJseSBtb3JlICovCiAJcmV0dXJuIDA7CiB9CkBAIC01MDUsOCArNTEyLDkgQEAKIHN0YXRpYyBIUkVTVUxUIFdJTkFQSSBJRGlyZWN0RHJhd1N1cmZhY2VfR2V0U3VyZmFjZURlc2MoCiAJTFBESVJFQ1REUkFXU1VSRkFDRSB0aGlzLExQRERTVVJGQUNFREVTQyBkZHNkCiApIHsgCi0JaWYgKGRlYnVnZ2luZ19kZHJhdykgewotCQlmcHJpbnRmKHN0ZGVyciwiSURpcmVjdERyYXdTdXJmYWNlKCVwKS0+R2V0U3VyZmFjZURlc2MoJXApXG4iLHRoaXMsZGRzZCk7CisJaWYgKGRlYnVnZ2luZ19pbmZvKGRkcmF3KSkgeworCQlkcHJpbnRmX2luZm8oZGRyYXcsICJJRGlyZWN0RHJhd1N1cmZhY2UoJXApLT5HZXRTdXJmYWNlRGVzYyglcClcbiIsCisJCQkgICAgIHRoaXMsZGRzZCk7CiAJCWZwcmludGYoc3RkZXJyLCIJZmxhZ3M6ICIpOwogCQlfZHVtcF9ERFNEKGRkc2QtPmR3RmxhZ3MpOwogCQlmcHJpbnRmKHN0ZGVyciwiXG4iKTsKQEAgLTUyNiwxNiArNTM0LDIwIEBACiB9CiAKIHN0YXRpYyBVTE9ORyBXSU5BUEkgSURpcmVjdERyYXdTdXJmYWNlX0FkZFJlZihMUERJUkVDVERSQVdTVVJGQUNFIHRoaXMpIHsKLQlkcHJpbnRmX2RkcmF3KHN0ZGVyciwiSURpcmVjdERyYXdTdXJmYWNlKCVwKS0+QWRkUmVmKClcbiIsdGhpcyk7CisJZHByaW50Zl9pbmZvKGRkcmF3LCJJRGlyZWN0RHJhd1N1cmZhY2UoJXApLT5BZGRSZWYoKVxuIix0aGlzKTsKIAlyZXR1cm4gKysodGhpcy0+cmVmKTsKIH0KIAogc3RhdGljIFVMT05HIFdJTkFQSSBJRGlyZWN0RHJhd1N1cmZhY2VfUmVsZWFzZShMUERJUkVDVERSQVdTVVJGQUNFIHRoaXMpIHsKLQlkcHJpbnRmX2RkcmF3KHN0ZGVyciwiSURpcmVjdERyYXdTdXJmYWNlKCVwKS0+UmVsZWFzZSgpXG4iLHRoaXMpOworCWRwcmludGZfaW5mbyhkZHJhdywiSURpcmVjdERyYXdTdXJmYWNlKCVwKS0+UmVsZWFzZSgpXG4iLHRoaXMpOwogCWlmICghLS0odGhpcy0+cmVmKSkgewogCQl0aGlzLT5zLmRkcmF3LT5scHZ0YmwtPmZuUmVsZWFzZSh0aGlzLT5zLmRkcmF3KTsKIAkJLyogY2xlYXIgb3V0IG9mIHN1cmZhY2UgbGlzdCAqLwotCQl0aGlzLT5zLmRkcmF3LT5kLnZwbWFzayAmPSB+KDE8PCh0aGlzLT5zLmZiX2hlaWdodC90aGlzLT5zLmRkcmF3LT5kLmZiX2hlaWdodCkpOworCQlpZiAodGhpcy0+cy5mYl9oZWlnaHQgPT0gLTEpIHsKKwkJCUhlYXBGcmVlKEdldFByb2Nlc3NIZWFwKCksMCx0aGlzLT5zLnN1cmZhY2UpOworCQl9IGVsc2UgeworCQkJdGhpcy0+cy5kZHJhdy0+ZC52cG1hc2sgJj0gfigxPDwodGhpcy0+cy5mYl9oZWlnaHQvdGhpcy0+cy5kZHJhdy0+ZC5mYl9oZWlnaHQpKTsKKwkJfQogCQlIZWFwRnJlZShHZXRQcm9jZXNzSGVhcCgpLDAsdGhpcyk7CiAJCXJldHVybiAwOwogCX0KQEAgLTU0NSw5ICs1NTcsMTIgQEAKIHN0YXRpYyBIUkVTVUxUIFdJTkFQSSBJRGlyZWN0RHJhd1N1cmZhY2VfR2V0QXR0YWNoZWRTdXJmYWNlKAogCUxQRElSRUNURFJBV1NVUkZBQ0UgdGhpcyxMUEREU0NBUFMgbHBkZHNkLExQRElSRUNURFJBV1NVUkZBQ0UgKmxwZHNmCiApIHsKLQlpZiAoZGVidWdnaW5nX2RkcmF3KSB7Ci0JCWZwcmludGYoc3RkZXJyLCJJRGlyZWN0RHJhd1N1cmZhY2UoJXApLT5HZXRBdHRhY2hlZFN1cmZhY2UoJXAsJXApXG4iLHRoaXMsbHBkZHNkLGxwZHNmKTsKLQkJZnByaW50ZihzdGRlcnIsIgljYXBzICIpO19kdW1wX0REU0NBUFMobHBkZHNkLT5kd0NhcHMpO2ZwcmludGYoc3RkZXJyLCJcbiIpOworICAgICAgICBkcHJpbnRmX2luZm8oZGRyYXcsICJJRGlyZWN0RHJhd1N1cmZhY2UoJXApLT5HZXRBdHRhY2hlZFN1cmZhY2UoJXAsJXApXG4iLAorCQkgICAgIHRoaXMsIGxwZGRzZCwgbHBkc2YpOworCWlmIChkZWJ1Z2dpbmdfaW5mbyhkZHJhdykpIHsKKwkJZnByaW50ZihzdGRlcnIsIgljYXBzICIpOworCQlfZHVtcF9ERFNDQVBTKGxwZGRzZC0+ZHdDYXBzKTsKKwkJZnByaW50ZihzdGRlcnIsIlxuIik7CiAJfQogCWlmICghKGxwZGRzZC0+ZHdDYXBzICYgRERTQ0FQU19CQUNLQlVGRkVSKSkgewogCQlmcHJpbnRmKHN0ZGVyciwiSURpcmVjdERyYXdTdXJmYWNlOjpHZXRBdHRhY2hlZFN1cmZhY2UoKTp3aG9vcHMsIGNhbiBvbmx5IGhhbmRsZSBiYWNrYnVmZmVycyBmb3Igbm93XG4iKTsKQEAgLTYwOSw4ICs2MjQsOCBAQAogc3RhdGljIEhSRVNVTFQgV0lOQVBJIElEaXJlY3REcmF3U3VyZmFjZV9RdWVyeUludGVyZmFjZShMUERJUkVDVERSQVdTVVJGQUNFIHRoaXMsUkVGSUlEIHJlZmlpZCxMUFZPSUQgKm9iaikgewogICAgICAgICBjaGFyICAgIHhyZWZpaWRbNTBdOwogCi0gICAgICAgIFN0cmluZ0Zyb21DTFNJRCgoTFBDTFNJRClyZWZpaWQseHJlZmlpZCk7Ci0gICAgICAgIGRwcmludGZfZGRyYXcoc3RkZXJyLCJJRGlyZWN0RHJhd1N1cmZhY2UoJXApLT5RdWVyeUludGVyZmFjZSglcywlcClcbiIsdGhpcyx4cmVmaWlkLG9iaik7CisgICAgICAgIFdJTkVfU3RyaW5nRnJvbUNMU0lEKChMUENMU0lEKXJlZmlpZCx4cmVmaWlkKTsKKyAgICAgICAgZHByaW50Zl9pbmZvKGRkcmF3LCJJRGlyZWN0RHJhd1N1cmZhY2UoJXApLT5RdWVyeUludGVyZmFjZSglcywlcClcbiIsdGhpcyx4cmVmaWlkLG9iaik7CiAJCiAJLyogdGhhdHMgdmVyc2lvbiAzIChEaXJlY3RYIDUpICovCiAJaWYgKAkhbWVtY21wKCZJSURfSURpcmVjdERyYXdTdXJmYWNlMyxyZWZpaWQsc2l6ZW9mKElJRF9JRGlyZWN0RHJhd1N1cmZhY2UzKSkpIHsKQEAgLTY5Myw3ICs3MDgsNyBAQAogc3RhdGljIEhSRVNVTFQgV0lOQVBJIElEaXJlY3REcmF3U3VyZmFjZTJfVW5sb2NrKAogCUxQRElSRUNURFJBV1NVUkZBQ0UyIHRoaXMsTFBWT0lEIHN1cmZhY2UKICkgewotCWRwcmludGZfZGRyYXcoc3RkZXJyLCJJRGlyZWN0RHJhd1N1cmZhY2UyKCVwKS0+VW5sb2NrKCVwKVxuIix0aGlzLHN1cmZhY2UpOworCWRwcmludGZfaW5mbyhkZHJhdywiSURpcmVjdERyYXdTdXJmYWNlMiglcCktPlVubG9jayglcClcbiIsdGhpcyxzdXJmYWNlKTsKIAlyZXR1cm4gMDsKIH0KIApAQCAtNzA0LDE5ICs3MTksMTIgQEAKIH0KIAogc3RhdGljIFVMT05HIFdJTkFQSSBJRGlyZWN0RHJhd1N1cmZhY2UyX0FkZFJlZihMUERJUkVDVERSQVdTVVJGQUNFMiB0aGlzKSB7Ci0JZHByaW50Zl9kZHJhdyhzdGRlcnIsIklEaXJlY3REcmF3U3VyZmFjZTIoJXApLT5BZGRSZWYoKVxuIix0aGlzKTsKKwlkcHJpbnRmX2luZm8oZGRyYXcsIklEaXJlY3REcmF3U3VyZmFjZTIoJXApLT5BZGRSZWYoKVxuIix0aGlzKTsKIAlyZXR1cm4gKysodGhpcy0+cmVmKTsKIH0KIAogc3RhdGljIFVMT05HIFdJTkFQSSBJRGlyZWN0RHJhd1N1cmZhY2UyX1JlbGVhc2UoTFBESVJFQ1REUkFXU1VSRkFDRTIgdGhpcykgewotCWRwcmludGZfZGRyYXcoc3RkZXJyLCJJRGlyZWN0RHJhd1N1cmZhY2UyKCVwKS0+UmVsZWFzZSgpXG4iLHRoaXMpOwotCWlmICghLS0odGhpcy0+cmVmKSkgewotCQl0aGlzLT5zLmRkcmF3LT5scHZ0YmwtPmZuUmVsZWFzZSh0aGlzLT5zLmRkcmF3KTsKLQkJdGhpcy0+cy5kZHJhdy0+ZC52cG1hc2sgJj0gfigxPDwodGhpcy0+cy5mYl9oZWlnaHQvdGhpcy0+cy5kZHJhdy0+ZC5mYl9oZWlnaHQpKTsKLQkJSGVhcEZyZWUoR2V0UHJvY2Vzc0hlYXAoKSwwLHRoaXMpOwotCQlyZXR1cm4gMDsKLQl9Ci0JcmV0dXJuIHRoaXMtPnJlZjsKKwlyZXR1cm4gSURpcmVjdERyYXdTdXJmYWNlX1JlbGVhc2UoKExQRElSRUNURFJBV1NVUkZBQ0UpdGhpcyk7CiB9CiAKIHN0YXRpYyBIUkVTVUxUIFdJTkFQSSBJRGlyZWN0RHJhd1N1cmZhY2UyX0dldEF0dGFjaGVkU3VyZmFjZSgKQEAgLTgxMywxMiArODIxLDEyIEBACiB9CiAKIHN0YXRpYyBVTE9ORyBXSU5BUEkgSURpcmVjdERyYXdTdXJmYWNlM19BZGRSZWYoTFBESVJFQ1REUkFXU1VSRkFDRTMgdGhpcykgewotCWRwcmludGZfZGRyYXcoc3RkZXJyLCJJRGlyZWN0RHJhd1N1cmZhY2UzKCVwKS0+QWRkUmVmKClcbiIsdGhpcyk7CisJZHByaW50Zl9pbmZvKGRkcmF3LCJJRGlyZWN0RHJhd1N1cmZhY2UzKCVwKS0+QWRkUmVmKClcbiIsdGhpcyk7CiAJcmV0dXJuICsrKHRoaXMtPnJlZik7CiB9CiAKIHN0YXRpYyBVTE9ORyBXSU5BUEkgSURpcmVjdERyYXdTdXJmYWNlM19SZWxlYXNlKExQRElSRUNURFJBV1NVUkZBQ0UzIHRoaXMpIHsKLQlkcHJpbnRmX2RkcmF3KHN0ZGVyciwiSURpcmVjdERyYXdTdXJmYWNlMyglcCktPlJlbGVhc2UoKVxuIix0aGlzKTsKKwlkcHJpbnRmX2luZm8oZGRyYXcsIklEaXJlY3REcmF3U3VyZmFjZTMoJXApLT5SZWxlYXNlKClcbiIsdGhpcyk7CiAJaWYgKCEtLSh0aGlzLT5yZWYpKSB7CiAJCXRoaXMtPnMuZGRyYXctPmxwdnRibC0+Zm5SZWxlYXNlKHRoaXMtPnMuZGRyYXcpOwogCQl0aGlzLT5zLmRkcmF3LT5kLnZwbWFzayAmPSB+KDE8PCh0aGlzLT5zLmZiX2hlaWdodC90aGlzLT5zLmRkcmF3LT5kLmZiX2hlaWdodCkpOwpAQCAtOTYyLDExICs5NzAsMTggQEAKICAqCQkJSURpcmVjdERyYXdQYWxldHRlCiAgKi8KIHN0YXRpYyBIUkVTVUxUIFdJTkFQSSBJRGlyZWN0RHJhd1BhbGV0dGVfR2V0RW50cmllcygKLQlMUERJUkVDVERSQVdQQUxFVFRFIHRoaXMsRFdPUkQgeCxEV09SRCB5LERXT1JEIHosTFBQQUxFVFRFRU5UUlkgcGFsZW50CisJTFBESVJFQ1REUkFXUEFMRVRURSB0aGlzLERXT1JEIHgsRFdPUkQgc3RhcnQsRFdPUkQgZW5kLExQUEFMRVRURUVOVFJZIHBhbGVudAogKSB7Ci0JZnByaW50ZihzdGRlcnIsIklEaXJlY3REcmF3UGFsZXR0ZSglcCktPkdldEVudHJpZXMoJTA4bHgsJTA4bHgsJTA4bHgsJXApLHN0dWIhXG4iLAotCQl0aGlzLHgseSx6LHBhbGVudAorCWludAlpOworCisJZnByaW50ZihzdGRlcnIsIklEaXJlY3REcmF3UGFsZXR0ZSglcCktPkdldEVudHJpZXMoJTA4bHgsJWxkLCVsZCwlcCksc3R1YiFcbiIsCisJCXRoaXMseCxzdGFydCxlbmQscGFsZW50CiAJKTsKKwlmb3IgKGk9c3RhcnQ7aTxlbmQ7aSsrKSB7CisJCXBhbGVudFtpLXN0YXJ0XS5wZVJlZCA9IGk7CisJCXBhbGVudFtpLXN0YXJ0XS5wZUdyZWVuID0gaTsKKwkJcGFsZW50W2ktc3RhcnRdLnBlQmx1ZSA9IGk7CisJfQogCXJldHVybiAwOwogfQogCkBAIC05NzYsNyArOTkxLDcgQEAKIAlYQ29sb3IJCXhjOwogCWludAkJaTsKIAotCWRwcmludGZfZGRyYXcoc3RkZXJyLCJJRGlyZWN0RHJhd1BhbGV0dGUoJXApLT5TZXRFbnRyaWVzKCUwOGx4LCVsZCwlbGQsJXApXG4iLAorCWRwcmludGZfaW5mbyhkZHJhdywiSURpcmVjdERyYXdQYWxldHRlKCVwKS0+U2V0RW50cmllcyglMDhseCwlbGQsJWxkLCVwKVxuIiwKIAkJdGhpcyx4LHN0YXJ0LGVuZCxwYWxlbnQKIAkpOwogCWlmICghdGhpcy0+Y20pIC8qIHNob3VsZCBub3QgaGFwcGVuICovIHsKQEAgLTk4NCwxMyArOTk5LDE5IEBACiAJCXJldHVybiBEREVSUl9HRU5FUklDOwogCX0KIC8qIEZJWE1FOiBmcmVlIGNvbG9yY2VsbHMgaW5zdGVhZCBvZiBmcmVlaW5nIHdob2xlIG1hcCAqLwotCVhGcmVlQ29sb3JtYXAoZGlzcGxheSx0aGlzLT5jbSk7CisJVFNYRnJlZUNvbG9ybWFwKGRpc3BsYXksdGhpcy0+Y20pOwogCXRoaXMtPmNtID0gVFNYQ3JlYXRlQ29sb3JtYXAoZGlzcGxheSxEZWZhdWx0Um9vdFdpbmRvdyhkaXNwbGF5KSxEZWZhdWx0VmlzdWFsT2ZTY3JlZW4oc2NyZWVuKSxBbGxvY0FsbCk7CiAJaWYgKHN0YXJ0PjApIHsKIAkJeGMucmVkID0geGMuYmx1ZSA9IHhjLmdyZWVuID0gMDsgeGMuZmxhZ3MgPSBEb1JlZHxEb0dyZWVufERvQmx1ZTsgeGMucGl4ZWwgPSAwOyBUU1hTdG9yZUNvbG9yKGRpc3BsYXksdGhpcy0+Y20sJnhjKTsKKwkJdGhpcy0+cGFsZW50c1swXS5wZVJlZCA9IDA7CisJCXRoaXMtPnBhbGVudHNbMF0ucGVCbHVlID0gMDsKKwkJdGhpcy0+cGFsZW50c1swXS5wZUdyZWVuID0gMDsKIAl9CiAJaWYgKGVuZDwyNTYpIHsKIAkJeGMucmVkID0geGMuYmx1ZSA9IHhjLmdyZWVuID0gMHhmZmZmOyB4Yy5mbGFncyA9IERvUmVkfERvR3JlZW58RG9CbHVlOyB4Yy5waXhlbCA9IDI1NTsgVFNYU3RvcmVDb2xvcihkaXNwbGF5LHRoaXMtPmNtLCZ4Yyk7CisJCXRoaXMtPnBhbGVudHNbMjU1XS5wZVJlZCA9IDI1NTsKKwkJdGhpcy0+cGFsZW50c1syNTVdLnBlQmx1ZSA9IDI1NTsKKwkJdGhpcy0+cGFsZW50c1syNTVdLnBlR3JlZW4gPSAyNTU7CiAJfQogCWZvciAoaT1zdGFydDtpPGVuZDtpKyspIHsKIAkJeGMucmVkID0gcGFsZW50W2ktc3RhcnRdLnBlUmVkPDw4OwpAQCAtOTk5LDYgKzEwMjAsOSBAQAogCQl4Yy5mbGFncyA9IERvUmVkfERvQmx1ZXxEb0dyZWVuOwogCQl4Yy5waXhlbCA9IGk7CiAJCVRTWFN0b3JlQ29sb3IoZGlzcGxheSx0aGlzLT5jbSwmeGMpOworCQl0aGlzLT5wYWxlbnRzW2ldLnBlUmVkID0gcGFsZW50W2ktc3RhcnRdLnBlUmVkOworCQl0aGlzLT5wYWxlbnRzW2ldLnBlQmx1ZSA9IHBhbGVudFtpLXN0YXJ0XS5wZUJsdWU7CisJCXRoaXMtPnBhbGVudHNbaV0ucGVHcmVlbiA9IHBhbGVudFtpLXN0YXJ0XS5wZUdyZWVuOwogCX0KIAlYRjg2REdBSW5zdGFsbENvbG9ybWFwKGRpc3BsYXksRGVmYXVsdFNjcmVlbihkaXNwbGF5KSx0aGlzLT5jbSk7CiAJcmV0dXJuIDA7CkBAIC0xMDA3LDcgKzEwMzEsNyBAQAogc3RhdGljIFVMT05HIFdJTkFQSSBJRGlyZWN0RHJhd1BhbGV0dGVfUmVsZWFzZShMUERJUkVDVERSQVdQQUxFVFRFIHRoaXMpIHsKIAlpZiAoIS0tKHRoaXMtPnJlZikpIHsKIAkJaWYgKHRoaXMtPmNtKSB7Ci0JCQlYRnJlZUNvbG9ybWFwKGRpc3BsYXksdGhpcy0+Y20pOworCQkJVFNYRnJlZUNvbG9ybWFwKGRpc3BsYXksdGhpcy0+Y20pOwogCQkJdGhpcy0+Y20gPSAwOwogCQl9CiAJCUhlYXBGcmVlKEdldFByb2Nlc3NIZWFwKCksMCx0aGlzKTsKQEAgLTEwOTksOSArMTEyMywxMCBAQAogKSB7CiAJaW50CWk7CiAKLQlpZiAoZGVidWdnaW5nX2RkcmF3KSB7Ci0JCWZwcmludGYoc3RkZXJyLCJJRGlyZWN0RHJhdyglcCktPkNyZWF0ZVN1cmZhY2UoJXAsJXAsJXApXG4iLHRoaXMsbHBkZHNkLGxwZHNmLGxwdW5rKTsKLQkJZnByaW50ZihzdGRlcnIsIiBbdz0lbGQsaD0lbGQsZmxhZ3MgIixscGRkc2QtPmR3V2lkdGgsbHBkZHNkLT5kd0hlaWdodCk7CisJZHByaW50Zl9pbmZvKGRkcmF3LCAiSURpcmVjdERyYXcoJXApLT5DcmVhdGVTdXJmYWNlKCVwLCVwLCVwKVxuIiwKKwkJICAgICB0aGlzLGxwZGRzZCxscGRzZixscHVuayk7CisJaWYgKGRlYnVnZ2luZ19pbmZvKGRkcmF3KSkgeworCQlmcHJpbnRmKHN0ZGVyciwiW3c9JWxkLGg9JWxkLGZsYWdzICIsbHBkZHNkLT5kd1dpZHRoLGxwZGRzZC0+ZHdIZWlnaHQpOwogCQlfZHVtcF9ERFNEKGxwZGRzZC0+ZHdGbGFncyk7CiAJCWZwcmludGYoc3RkZXJyLCJjYXBzICIpOwogCQlfZHVtcF9ERFNDQVBTKGxwZGRzZC0+ZGRzQ2Fwcy5kd0NhcHMpOwpAQCAtMTExMiwxOSArMTEzNywzNCBAQAogCXRoaXMtPmxwdnRibC0+Zm5BZGRSZWYodGhpcyk7CiAJKCpscGRzZiktPnJlZiA9IDE7CiAJKCpscGRzZiktPmxwdnRibCA9ICZkZHN2dDsKLQlmb3IgKGk9MDtpPDMyO2krKykKLQkJaWYgKCEodGhpcy0+ZC52cG1hc2sgJiAoMTw8aSkpKQotCQkJYnJlYWs7Ci0JZHByaW50Zl9kZHJhdyhzdGRlcnIsInVzaW5nIHZpZXdwb3J0ICVkIGZvciBhIHByaW1hcnkgc3VyZmFjZVxuIixpKTsKLQkvKiBpZiBpID09IDMyIG9yIG1heGltdW0gLi4uIHJldHVybiBlcnJvciAqLwotCXRoaXMtPmQudnBtYXNrfD0oMTw8aSk7Ci0JKCpscGRzZiktPnMuc3VyZmFjZSA9IHRoaXMtPmQuZmJfYWRkcisoKGkqdGhpcy0+ZC52cF9oZWlnaHQpKnRoaXMtPmQuZmJfd2lkdGgqdGhpcy0+ZC5kZXB0aC84KTsKLQkoKmxwZHNmKS0+cy5mYl9oZWlnaHQgPSBpKnRoaXMtPmQuZmJfaGVpZ2h0OworCWlmICgJKGxwZGRzZC0+ZHdGbGFncyAmIEREU0RfQ0FQUykgJiYgCisJCShscGRkc2QtPmRkc0NhcHMuZHdDYXBzICYgRERTQ0FQU19PRkZTQ1JFRU5QTEFJTikKKwkpIHsKKwkJaWYgKCEobHBkZHNkLT5kd0ZsYWdzICYgRERTRF9XSURUSCkpCisJCQlscGRkc2QtPmR3V2lkdGggPSB0aGlzLT5kLmZiX3dpZHRoOworCQlpZiAoIShscGRkc2QtPmR3RmxhZ3MgJiBERFNEX0hFSUdIVCkpCisJCQlscGRkc2QtPmR3V2lkdGggPSB0aGlzLT5kLmZiX2hlaWdodDsKKwkJKCpscGRzZiktPnMuc3VyZmFjZSA9IChMUEJZVEUpSGVhcEFsbG9jKEdldFByb2Nlc3NIZWFwKCksMCxscGRkc2QtPmR3V2lkdGgqbHBkZHNkLT5kd0hlaWdodCp0aGlzLT5kLmRlcHRoLzgpOworCQkoKmxwZHNmKS0+cy5mYl9oZWlnaHQgPSAtMTsKKwkJKCpscGRzZiktPnMubHBpdGNoID0gbHBkZHNkLT5kd1dpZHRoKnRoaXMtPmQuZGVwdGgvODsKKwkJZHByaW50Zl9pbmZvKGRkcmF3LCJ1c2luZyBzeXN0ZW0gbWVtb3J5IGZvciBhIHByaW1hcnkgc3VyZmFjZVxuIik7CisJfSBlbHNlIHsKKwkJZm9yIChpPTA7aTwzMjtpKyspCisJCQlpZiAoISh0aGlzLT5kLnZwbWFzayAmICgxPDxpKSkpCisJCQkJYnJlYWs7CisJCWRwcmludGZfaW5mbyhkZHJhdywidXNpbmcgdmlld3BvcnQgJWQgZm9yIGEgcHJpbWFyeSBzdXJmYWNlXG4iLGkpOworCQkvKiBpZiBpID09IDMyIG9yIG1heGltdW0gLi4uIHJldHVybiBlcnJvciAqLworCQl0aGlzLT5kLnZwbWFza3w9KDE8PGkpOworCQkoKmxwZHNmKS0+cy5zdXJmYWNlID0gdGhpcy0+ZC5mYl9hZGRyKygoaSp0aGlzLT5kLmZiX2hlaWdodCkqdGhpcy0+ZC5mYl93aWR0aCp0aGlzLT5kLmRlcHRoLzgpOworCQkoKmxwZHNmKS0+cy5mYl9oZWlnaHQgPSBpKnRoaXMtPmQuZmJfaGVpZ2h0OworCQkoKmxwZHNmKS0+cy5scGl0Y2ggPSB0aGlzLT5kLmZiX3dpZHRoKnRoaXMtPmQuZGVwdGgvODsKKwl9CisKKwlscGRkc2QtPmxQaXRjaCA9ICgqbHBkc2YpLT5zLmxwaXRjaDsKIAogCSgqbHBkc2YpLT5zLndpZHRoID0gdGhpcy0+ZC53aWR0aDsKIAkoKmxwZHNmKS0+cy5oZWlnaHQgPSB0aGlzLT5kLmhlaWdodDsKIAkoKmxwZHNmKS0+cy5kZHJhdyA9IHRoaXM7Ci0JKCpscGRzZiktPnMubHBpdGNoID0gdGhpcy0+ZC5mYl93aWR0aCp0aGlzLT5kLmRlcHRoLzg7CiAJKCpscGRzZiktPnMuYmFja2J1ZmZlciA9IE5VTEw7CiAJaWYgKGxwZGRzZC0+ZHdGbGFncyAmIEREU0RfQkFDS0JVRkZFUkNPVU5UKSB7CiAJCUxQRElSRUNURFJBV1NVUkZBQ0UJYmFjazsKQEAgLTExMzksMTAgKzExNzksMTAgQEAKIAkJZm9yIChpPTA7aTwzMjtpKyspCiAJCQlpZiAoISh0aGlzLT5kLnZwbWFzayAmICgxPDxpKSkpCiAJCQkJYnJlYWs7Ci0JCWRwcmludGZfZGRyYXcoc3RkZXJyLCJ1c2luZyB2aWV3cG9ydCAlZCBmb3IgYmFja2J1ZmZlclxuIixpKTsKKwkJZHByaW50Zl9pbmZvKGRkcmF3LCJ1c2luZyB2aWV3cG9ydCAlZCBmb3IgYmFja2J1ZmZlclxuIixpKTsKIAkJLyogaWYgaSA9PSAzMiBvciBtYXhpbXVtIC4uLiByZXR1cm4gZXJyb3IgKi8KIAkJdGhpcy0+ZC52cG1hc2t8PSgxPDxpKTsKLQkJYmFjay0+cy5zdXJmYWNlID0gdGhpcy0+ZC5mYl9hZGRyKygoaSp0aGlzLT5kLnZwX2hlaWdodCkqdGhpcy0+ZC5mYl93aWR0aCp0aGlzLT5kLmRlcHRoLzgpOworCQliYWNrLT5zLnN1cmZhY2UgPSB0aGlzLT5kLmZiX2FkZHIrKChpKnRoaXMtPmQuZmJfaGVpZ2h0KSp0aGlzLT5kLmZiX3dpZHRoKnRoaXMtPmQuZGVwdGgvOCk7CiAJCWJhY2stPnMuZmJfaGVpZ2h0ID0gaSp0aGlzLT5kLmZiX2hlaWdodDsKIAogCQliYWNrLT5zLndpZHRoID0gdGhpcy0+ZC53aWR0aDsKQEAgLTExODIsMTQgKzEyMjIsMTYgQEAKIAkJRkUoRERTQ0xfQ1JFQVRFREVWSUNFV0lORE9XKQogCX07CiAKLQlkcHJpbnRmX2RkcmF3KHN0ZGVyciwiSURpcmVjdERyYXcoJXApLT5TZXRDb29wZXJhdGl2ZUxldmVsKCUwOGx4LCUwOGx4KVxuIiwKKwlkcHJpbnRmX2luZm8oZGRyYXcsIklEaXJlY3REcmF3KCVwKS0+U2V0Q29vcGVyYXRpdmVMZXZlbCglMDhseCwlMDhseClcbiIsCiAJCXRoaXMsKERXT1JEKWh3bmQsY29vcGxldmVsCiAJKTsKLQlkcHJpbnRmX2RkcmF3KHN0ZGVyciwiCWNvb3BlcmF0aXZlIGxldmVsICIpOwotCWZvciAoaT0wO2k8c2l6ZW9mKGZsYWdtYXApL3NpemVvZihmbGFnbWFwWzBdKTtpKyspCi0JCWlmIChmbGFnbWFwW2ldLm1hc2sgJiBjb29wbGV2ZWwpCi0JCQlkcHJpbnRmX2RkcmF3KHN0ZGVyciwiJXMgIixmbGFnbWFwW2ldLm5hbWUpOwotCWRwcmludGZfZGRyYXcoc3RkZXJyLCJcbiIpOworCWlmKGRlYnVnZ2luZ19pbmZvKGRkcmF3KSl7CisJICBkYmdfZGVjbF9zdHIoZGRyYXcsIDUxMik7CisJICBmb3IgKGk9MDtpPHNpemVvZihmbGFnbWFwKS9zaXplb2YoZmxhZ21hcFswXSk7aSsrKQorCSAgICBpZiAoZmxhZ21hcFtpXS5tYXNrICYgY29vcGxldmVsKQorCSAgICAgIGRzcHJpbnRmKGRkcmF3LCAiJXMgIiwgZmxhZ21hcFtpXS5uYW1lKTsKKwkgIGRwcmludGZfaW5mbyhkZHJhdywiCWNvb3BlcmF0aXZlIGxldmVsICVzXG4iLCBkYmdfc3RyKGRkcmF3KSk7CisJfQogCXRoaXMtPmQubWFpbndpbmRvdyA9IGh3bmQ7CiAJcmV0dXJuIDA7CiB9CkBAIC0xMjAxLDcgKzEyNDMsOCBAQAogCWludAlpLCpkZXB0aHMsZGVwY291bnQ7CiAJY2hhcglidWZbMjAwXTsKIAotCWRwcmludGZfZGRyYXcoc3RkZXJyLCJJRGlyZWN0RHJhdyglcCktPlNldERpc3BsYXlNb2RlKCVsZCwlbGQsJWxkKSxzdHViIVxuIix0aGlzLHdpZHRoLGhlaWdodCxkZXB0aCk7CisJZHByaW50Zl9maXhtZShkZHJhdywgIklEaXJlY3REcmF3KCVwKS0+U2V0RGlzcGxheU1vZGUoJWxkLCVsZCwlbGQpLHN0dWIhXG4iLAorCQkgICAgICB0aGlzLCB3aWR0aCwgaGVpZ2h0LCBkZXB0aCk7CiAKIAlkZXB0aHMgPSBUU1hMaXN0RGVwdGhzKGRpc3BsYXksRGVmYXVsdFNjcmVlbihkaXNwbGF5KSwmZGVwY291bnQpOwogCWZvciAoaT0wO2k8ZGVwY291bnQ7aSsrKQpAQCAtMTIzMCw2ICsxMjczLDcgQEAKIAkgKiBpdCB3b3JrcyBmb3IgdGhlIGxpYnJhcnkgdG9vPwogCSAqLwogCVhGODZER0FEaXJlY3RWaWRlbyhkaXNwbGF5LERlZmF1bHRTY3JlZW4oZGlzcGxheSksWEY4NkRHQURpcmVjdEdyYXBoaWNzKTsKKwlYRjg2REdBU2V0Vmlld1BvcnQoZGlzcGxheSxEZWZhdWx0U2NyZWVuKGRpc3BsYXkpLDAsdGhpcy0+ZC5mYl9oZWlnaHQpOwogI2lmZGVmIFJFU1RPUkVfU0lHTkFMUwogCVNJR05BTF9Jbml0RW11bGF0b3IoKTsKICNlbmRpZgpAQCAtMTIzOSw3ICsxMjgzLDcgQEAKIHN0YXRpYyBIUkVTVUxUIFdJTkFQSSBJRGlyZWN0RHJhd19HZXRDYXBzKAogCUxQRElSRUNURFJBVyB0aGlzLExQRERDQVBTIGNhcHMxLExQRERDQVBTIGNhcHMyCiApICB7Ci0JZHByaW50Zl9kZHJhdyhzdGRlcnIsIklEaXJlY3REcmF3KCVwKS0+R2V0Q2FwcyglcCwlcClcbiIsdGhpcyxjYXBzMSxjYXBzMik7CisJZHByaW50Zl9pbmZvKGRkcmF3LCJJRGlyZWN0RHJhdyglcCktPkdldENhcHMoJXAsJXApXG4iLHRoaXMsY2FwczEsY2FwczIpOwogCWNhcHMxLT5kd1ZpZE1lbVRvdGFsID0gdGhpcy0+ZC5mYl9tZW1zaXplOwogCWNhcHMxLT5kd0NhcHMgPSAweGZmZmZmZmZmJn4oRERDQVBTX0JBTktTV0lUQ0hFRCk7CQkvKiB3ZSBjYW4gZG8gYW55dGhpbmcgKi8KIAljYXBzMS0+ZGRzQ2Fwcy5kd0NhcHMgPSAweGZmZmZmZmZmOwkvKiB3ZSBjYW4gZG8gYW55dGhpbmcgKi8KQEAgLTEyNjYsNyArMTMxMCw3IEBACiBzdGF0aWMgSFJFU1VMVCBXSU5BUEkgSURpcmVjdERyYXdfQ3JlYXRlUGFsZXR0ZSgKIAlMUERJUkVDVERSQVcgdGhpcyxEV09SRCB4LExQUEFMRVRURUVOVFJZIHBhbGVudCxMUERJUkVDVERSQVdQQUxFVFRFICpscGRkcGFsLExQVU5LTk9XTiBscHVuawogKSB7Ci0JZHByaW50Zl9kZHJhdyhzdGRlcnIsIklEaXJlY3REcmF3KCVwKS0+Q3JlYXRlUGFsZXR0ZSglMDhseCwlcCwlcCwlcClcbiIsCisJZHByaW50Zl9pbmZvKGRkcmF3LCJJRGlyZWN0RHJhdyglcCktPkNyZWF0ZVBhbGV0dGUoJTA4bHgsJXAsJXAsJXApXG4iLAogCQl0aGlzLHgscGFsZW50LGxwZGRwYWwsbHB1bmsKIAkpOwogCSpscGRkcGFsID0gKExQRElSRUNURFJBV1BBTEVUVEUpSGVhcEFsbG9jKEdldFByb2Nlc3NIZWFwKCksSEVBUF9aRVJPX01FTU9SWSxzaXplb2YoSURpcmVjdERyYXdQYWxldHRlKSk7CkBAIC0xMjgyLDcgKzEzMjYsOCBAQAogfQogCiBzdGF0aWMgSFJFU1VMVCBXSU5BUEkgSURpcmVjdERyYXdfUmVzdG9yZURpc3BsYXlNb2RlKExQRElSRUNURFJBVyB0aGlzKSB7Ci0JZHByaW50Zl9kZHJhdyhzdGRlcnIsIklEaXJlY3REcmF3KCVwKS0+UmVzdG9yZURpc3BsYXlNb2RlKCksc3R1YiFcbiIsdGhpcyk7CisJZHByaW50Zl9maXhtZShkZHJhdywgIklEaXJlY3REcmF3KCVwKS0+UmVzdG9yZURpc3BsYXlNb2RlKCksc3R1YiFcbiIsIAorCQkgICAgICB0aGlzKTsKIAlTbGVlcCgxMDAwKTsKIAlYRjg2REdBRGlyZWN0VmlkZW8oZGlzcGxheSxEZWZhdWx0U2NyZWVuKGRpc3BsYXkpLDApOwogI2lmZGVmIFJFU1RPUkVfU0lHTkFMUwpAQCAtMTI5NSw3ICsxMzQwLDcgQEAKIHN0YXRpYyBIUkVTVUxUIFdJTkFQSSBJRGlyZWN0RHJhd19XYWl0Rm9yVmVydGljYWxCbGFuaygKIAlMUERJUkVDVERSQVcgdGhpcyxEV09SRCB4LEhBTkRMRTMyIGgKICkgewotCWZwcmludGYoc3RkZXJyLCJJRGlyZWN0RHJhdyglcCktPldhaXRGb3JWZXJ0aWNhbEJsYW5rKDB4JTA4bHgsMHglMDh4KSxzdHViIVxuIix0aGlzLHgsaCk7CisJZHByaW50Zl9pbmZvKGRkcmF3LCJJRGlyZWN0RHJhdyglcCktPldhaXRGb3JWZXJ0aWNhbEJsYW5rKDB4JTA4bHgsMHglMDh4KSxzdHViIVxuIix0aGlzLHgsaCk7CiAJcmV0dXJuIDA7CiB9CiAKQEAgLTEzMjAsOCArMTM2NSw4IEBACiApIHsKICAgICAgICAgY2hhciAgICB4cmVmaWlkWzUwXTsKIAotICAgICAgICBTdHJpbmdGcm9tQ0xTSUQoKExQQ0xTSUQpcmVmaWlkLHhyZWZpaWQpOwotICAgICAgICBkcHJpbnRmX2RkcmF3KHN0ZGVyciwiSURpcmVjdERyYXcoJXApLT5RdWVyeUludGVyZmFjZSglcywlcClcbiIsdGhpcyx4cmVmaWlkLG9iaik7CisgICAgICAgIFdJTkVfU3RyaW5nRnJvbUNMU0lEKChMUENMU0lEKXJlZmlpZCx4cmVmaWlkKTsKKyAgICAgICAgZHByaW50Zl9pbmZvKGRkcmF3LCJJRGlyZWN0RHJhdyglcCktPlF1ZXJ5SW50ZXJmYWNlKCVzLCVwKVxuIix0aGlzLHhyZWZpaWQsb2JqKTsKICAgICAgICAgaWYgKCFtZW1jbXAoJklJRF9JVW5rbm93bixyZWZpaWQsc2l6ZW9mKElJRF9JVW5rbm93bikpKSB7CiAgICAgICAgICAgICAgICAgKm9iaiA9IHRoaXM7CiAJCXRoaXMtPmxwdnRibC0+Zm5BZGRSZWYodGhpcyk7CkBAIC0xMzY3LDcgKzE0MTIsNyBAQAogc3RhdGljIEhSRVNVTFQgV0lOQVBJIElEaXJlY3REcmF3X0dldFZlcnRpY2FsQmxhbmtTdGF0dXMoCiAJTFBESVJFQ1REUkFXIHRoaXMsQk9PTDMyICpzdGF0dXMKICkgewotICAgICAgICBmcHJpbnRmKHN0ZGVyciwiSURpcmVjdERyYXcoJXApLT5HZXRWZXJ0aWNhbEJsYW5rU2F0dXMoJXApXG4iLHRoaXMsc3RhdHVzKTsKKyAgICAgICAgZHByaW50Zl9pbmZvKGRkcmF3LCJJRGlyZWN0RHJhdyglcCktPkdldFZlcnRpY2FsQmxhbmtTYXR1cyglcClcbiIsdGhpcyxzdGF0dXMpOwogCSpzdGF0dXMgPSBUUlVFOwogCXJldHVybiAwOwogfQpAQCAtMTM3Nyw3ICsxNDIyLDcgQEAKICkgewogCUREU1VSRkFDRURFU0MJZGRzZmQ7CiAKLQlkcHJpbnRmX2RkcmF3KHN0ZGVyciwiSURpcmVjdERyYXcoJXApLT5FbnVtRGlzcGxheU1vZGVzKDB4JTA4bHgsJXAsJXAsJXApXG4iLHRoaXMsZHdGbGFncyxscGRkc2ZkLGNvbnRleHQsbW9kZXNjYik7CisJZHByaW50Zl9pbmZvKGRkcmF3LCJJRGlyZWN0RHJhdyglcCktPkVudW1EaXNwbGF5TW9kZXMoMHglMDhseCwlcCwlcCwlcClcbiIsdGhpcyxkd0ZsYWdzLGxwZGRzZmQsY29udGV4dCxtb2Rlc2NiKTsKIAogCiAJX2dldHBpeGVsZm9ybWF0KHRoaXMsJihkZHNmZC5kZHBmUGl4ZWxGb3JtYXQpKTsKQEAgLTE0MTIsMTAgKzE0NTcsMTAgQEAKIHN0YXRpYyBIUkVTVUxUIFdJTkFQSSBJRGlyZWN0RHJhd19HZXREaXNwbGF5TW9kZSgKIAlMUERJUkVDVERSQVcgdGhpcyxMUEREU1VSRkFDRURFU0MgbHBkZHNmZAogKSB7Ci0JZHByaW50Zl9kZHJhdyhzdGRlcnIsIklEaXJlY3REcmF3KCVwKS0+R2V0RGlzcGxheU1vZGUoJXApXG4iLHRoaXMsbHBkZHNmZCk7CisJZHByaW50Zl9pbmZvKGRkcmF3LCJJRGlyZWN0RHJhdyglcCktPkdldERpc3BsYXlNb2RlKCVwKVxuIix0aGlzLGxwZGRzZmQpOwogCWxwZGRzZmQtPmR3RmxhZ3MgPSBERFNEX0hFSUdIVHxERFNEX1dJRFRIfEREU0RfUElUQ0h8RERTRF9CQUNLQlVGRkVSQ09VTlR8RERTRF9QSVhFTEZPUk1BVHxERFNEX0NBUFM7Ci0JbHBkZHNmZC0+ZHdIZWlnaHQgPSB0aGlzLT5kLnZwX2hlaWdodDsKLQlscGRkc2ZkLT5kd1dpZHRoID0gdGhpcy0+ZC52cF93aWR0aDsKKwlscGRkc2ZkLT5kd0hlaWdodCA9IHNjcmVlbkhlaWdodDsKKwlscGRkc2ZkLT5kd1dpZHRoID0gc2NyZWVuV2lkdGg7CiAJbHBkZHNmZC0+bFBpdGNoID0gdGhpcy0+ZC5mYl93aWR0aCp0aGlzLT5kLmRlcHRoLzg7CiAJbHBkZHNmZC0+ZHdCYWNrQnVmZmVyQ291bnQgPSAxOwogCWxwZGRzZmQtPnguZHdSZWZyZXNoUmF0ZSA9IDYwOwpAQCAtMTQyOSw2ICsxNDc0LDEzIEBACiAJcmV0dXJuIEREX09LOwogfQogCitzdGF0aWMgSFJFU1VMVCBXSU5BUEkgSURpcmVjdERyYXdfR2V0TW9uaXRvckZyZXF1ZW5jeSgKKwlMUERJUkVDVERSQVcgdGhpcyxMUERXT1JEIGZyZXEKKykgeworCWZwcmludGYoc3RkZXJyLCJJRGlyZWN0RHJhdyglcCktPkdldE1vbml0b3JGcmVxdWVuY3koJXApXG4iLHRoaXMsZnJlcSk7CisJKmZyZXEgPSA2MCoxMDA7IC8qIDYwIEh6ICovCisJcmV0dXJuIDA7Cit9CiAKIHN0YXRpYyBJRGlyZWN0RHJhd19WVGFibGUgZGR2dCA9IHsKIAlJRGlyZWN0RHJhd19RdWVyeUludGVyZmFjZSwKQEAgLTE0NDYsNyArMTQ5OCw3IEBACiAJSURpcmVjdERyYXdfR2V0RGlzcGxheU1vZGUsCiAJKHZvaWQqKTE0LAogCSh2b2lkKikxNSwKLQkodm9pZCopMTYsCisJSURpcmVjdERyYXdfR2V0TW9uaXRvckZyZXF1ZW5jeSwKIAkodm9pZCopMTcsCiAJSURpcmVjdERyYXdfR2V0VmVydGljYWxCbGFua1N0YXR1cywKIAkodm9pZCopMTksCkBAIC0xNTA4LDcgKzE1NjAsOCBAQAogc3RhdGljIEhSRVNVTFQgV0lOQVBJIElEaXJlY3REcmF3Ml9TZXREaXNwbGF5TW9kZSgKIAlMUERJUkVDVERSQVcyIHRoaXMsRFdPUkQgd2lkdGgsRFdPUkQgaGVpZ2h0LERXT1JEIGRlcHRoLERXT1JEIHh4LERXT1JEIHl5CiApIHsKLQlkcHJpbnRmX2RkcmF3KHN0ZGVyciwiSURpcmVjdERyYXcyKCVwKS0+U2V0RGlzcGxheU1vZGUoJWxkLCVsZCwlbGQsJTA4bHgsJTA4bHgpLHN0dWIhXG4iLHRoaXMsd2lkdGgsaGVpZ2h0LGRlcHRoLHh4LHl5KTsKKwlkcHJpbnRmX2ZpeG1lKGRkcmF3LCJJRGlyZWN0RHJhdzIoJXApLT5TZXREaXNwbGF5TW9kZSglbGQsJWxkLCVsZCwlMDhseCwlMDhseCksc3R1YiFcbiIsCisJCSAgICAgIHRoaXMsIHdpZHRoLCBoZWlnaHQsIGRlcHRoLCB4eCwgeXkpOwogCiAJcmV0dXJuIElEaXJlY3REcmF3X1NldERpc3BsYXlNb2RlKChMUERJUkVDVERSQVcpdGhpcyx3aWR0aCxoZWlnaHQsZGVwdGgpOwogfQpAQCAtMTUzOSw3ICsxNTkyLDcgQEAKIHN0YXRpYyBIUkVTVUxUIFdJTkFQSSBJRGlyZWN0RHJhdzJfR2V0QXZhaWxhYmxlVmlkTWVtKAogCUxQRElSRUNURFJBVzIgdGhpcyxMUEREU0NBUFMgZGRzY2FwcyxMUERXT1JEIHRvdGFsLExQRFdPUkQgZnJlZQogKSB7Ci0JZnByaW50ZihzdGRlcnIsIklEaXJlY3REcmF3MiglcCktPkdldEF2YWlsYWJsZVZpZE1lbSglcCwlcCwlcCksc3R1YiFcbiIsCisJZnByaW50ZihzdGRlcnIsIklEaXJlY3REcmF3MiglcCktPkdldEF2YWlsYWJsZVZpZE1lbSglcCwlcCwlcClcbiIsCiAJCXRoaXMsZGRzY2Fwcyx0b3RhbCxmcmVlCiAJKTsKIAlpZiAodG90YWwpICp0b3RhbCA9IHRoaXMtPmQuZmJfbWVtc2l6ZSAqIDEwMjQ7CkBAIC0xNTUwLDkgKzE2MDMsMTkgQEAKIHN0YXRpYyBIUkVTVUxUIFdJTkFQSSBJRGlyZWN0RHJhdzJfR2V0TW9uaXRvckZyZXF1ZW5jeSgKIAlMUERJUkVDVERSQVcyIHRoaXMsTFBEV09SRCBmcmVxCiApIHsKLQlmcHJpbnRmKHN0ZGVyciwiSURpcmVjdERyYXcyKCVwKS0+R2V0TW9uaXRvckZyZXF1ZW5jeSglcClcbiIsdGhpcyxmcmVxKTsKLQkqZnJlcSA9IDYwOwotCXJldHVybiAwOworCXJldHVybiBJRGlyZWN0RHJhd19HZXRNb25pdG9yRnJlcXVlbmN5KChMUERJUkVDVERSQVcpdGhpcyxmcmVxKTsKK30KKworc3RhdGljIEhSRVNVTFQgV0lOQVBJIElEaXJlY3REcmF3Ml9HZXRWZXJ0aWNhbEJsYW5rU3RhdHVzKAorCUxQRElSRUNURFJBVzIgdGhpcyxCT09MMzIgKnN0YXR1cworKSB7CisJcmV0dXJuIElEaXJlY3REcmF3X0dldFZlcnRpY2FsQmxhbmtTdGF0dXMoKExQRElSRUNURFJBVyl0aGlzLHN0YXR1cyk7Cit9CisKK3N0YXRpYyBIUkVTVUxUIFdJTkFQSSBJRGlyZWN0RHJhdzJfV2FpdEZvclZlcnRpY2FsQmxhbmsoCisJTFBESVJFQ1REUkFXMiB0aGlzLERXT1JEIHgsSEFORExFMzIgaAorKSB7CisJcmV0dXJuIElEaXJlY3REcmF3X1dhaXRGb3JWZXJ0aWNhbEJsYW5rKChMUERJUkVDVERSQVcpdGhpcyx4LGgpOwogfQogCiBzdGF0aWMgSURpcmVjdERyYXcyX1ZUYWJsZSBkZDJ2dCA9IHsKQEAgLTE1NzMsMTIgKzE2MzYsMTIgQEAKIAkodm9pZCopMTUsCiAJSURpcmVjdERyYXcyX0dldE1vbml0b3JGcmVxdWVuY3ksCiAJKHZvaWQqKTE3LAotCSh2b2lkKikxOCwKKwlJRGlyZWN0RHJhdzJfR2V0VmVydGljYWxCbGFua1N0YXR1cywKIAkodm9pZCopMTksCiAJSURpcmVjdERyYXcyX1Jlc3RvcmVEaXNwbGF5TW9kZSwKIAlJRGlyZWN0RHJhdzJfU2V0Q29vcGVyYXRpdmVMZXZlbCwKIAlJRGlyZWN0RHJhdzJfU2V0RGlzcGxheU1vZGUsCi0JKHZvaWQqKTIzLypJRGlyZWN0RHJhd19XYWl0Rm9yVmVydGljYWxCbGFuayovLAorCUlEaXJlY3REcmF3Ml9XYWl0Rm9yVmVydGljYWxCbGFuaywKIAlJRGlyZWN0RHJhdzJfR2V0QXZhaWxhYmxlVmlkTWVtCiAJCiB9OwpAQCAtMTU5NCwxMSArMTY1NywxMSBAQAogCWNoYXIJKmFkZHI7CiAKIAlpZiAobHBHVUlEKQotCQlTdHJpbmdGcm9tQ0xTSUQobHBHVUlELHhjbHNpZCk7CisJCVdJTkVfU3RyaW5nRnJvbUNMU0lEKGxwR1VJRCx4Y2xzaWQpOwogCWVsc2UKIAkJc3RyY3B5KHhjbHNpZCwiPG51bGw+Iik7CiAKLQlkcHJpbnRmX2RkcmF3KHN0ZGVyciwiRGlyZWN0RHJhd0NyZWF0ZSglcywlcCwlcClcbiIseGNsc2lkLGxwbHBERCxwVW5rT3V0ZXIpOworCWRwcmludGZfaW5mbyhkZHJhdywiRGlyZWN0RHJhd0NyZWF0ZSglcywlcCwlcClcbiIseGNsc2lkLGxwbHBERCxwVW5rT3V0ZXIpOwogCWlmIChnZXR1aWQoKSkgewogCQlNZXNzYWdlQm94MzJBKDAsIlVzaW5nIHRoZSBYRjg2REdBIGV4dGVuc2lvbiByZXF1aXJlcyB0aGUgcHJvZ3JhbSB0byBiZSBydW4gdXNpbmcgVUlEIDAuIiwiV0lORSBEaXJlY3REcmF3IixNQl9PS3xNQl9JQ09OU1RPUCk7CiAJCXJldHVybiBFX1VORVhQRUNURUQ7CkBAIC0xNjExLDEyICsxNjc0LDEyIEBACiAJCXJldHVybiAwOwogCX0KIAlYRjg2REdBUXVlcnlWZXJzaW9uKGRpc3BsYXksJm1ham9yLCZtaW5vcik7Ci0JZHByaW50Zl9kZHJhdyhzdGRlcnIsIlhGODZER0EgaXMgdmVyc2lvbiAlZC4lZFxuIixtYWpvcixtaW5vcik7CisJZHByaW50Zl9pbmZvKGRkcmF3LCJYRjg2REdBIGlzIHZlcnNpb24gJWQuJWRcbiIsbWFqb3IsbWlub3IpOwogCVhGODZER0FRdWVyeURpcmVjdFZpZGVvKGRpc3BsYXksRGVmYXVsdFNjcmVlbihkaXNwbGF5KSwmZmxhZ3MpOwogCWlmICghKGZsYWdzICYgWEY4NkRHQURpcmVjdFByZXNlbnQpKQogCQlmcHJpbnRmKHN0ZGVyciwiZGlyZWN0IHZpZGVvIGlzIE5PVCBFTkFCTEVELlxuIik7CiAJWEY4NkRHQUdldFZpZGVvKGRpc3BsYXksRGVmYXVsdFNjcmVlbihkaXNwbGF5KSwmYWRkciwmd2lkdGgsJmJhbmtzaXplLCZtZW1zaXplKTsKLQlkcHJpbnRmX2RkcmF3KHN0ZGVyciwidmlkZW8gZnJhbWVidWZmZXI6IGJlZ2luICVwLCB3aWR0aCAlZCxiYW5rc2l6ZSAlZCxtZW1zaXplICVkXG4iLAorCWRwcmludGZfaW5mbyhkZHJhdywidmlkZW8gZnJhbWVidWZmZXI6IGJlZ2luICVwLCB3aWR0aCAlZCxiYW5rc2l6ZSAlZCxtZW1zaXplICVkXG4iLAogCQlhZGRyLHdpZHRoLGJhbmtzaXplLG1lbXNpemUKIAkpOwogCSgqbHBscEREKS0+ZC5mYl93aWR0aCA9IHdpZHRoOwpAQCAtMTYyNCwxMiArMTY4NywxMiBAQAogCSgqbHBscEREKS0+ZC5mYl9tZW1zaXplID0gbWVtc2l6ZTsKIAkoKmxwbHBERCktPmQuZmJfYmFua3NpemUgPSBiYW5rc2l6ZTsKIAotCVhGODZER0FTZXRWaWV3UG9ydChkaXNwbGF5LERlZmF1bHRTY3JlZW4oZGlzcGxheSksMCwwKTsKIAlYRjg2REdBR2V0Vmlld1BvcnRTaXplKGRpc3BsYXksRGVmYXVsdFNjcmVlbihkaXNwbGF5KSwmd2lkdGgsJmhlaWdodCk7CisJWEY4NkRHQVNldFZpZXdQb3J0KGRpc3BsYXksRGVmYXVsdFNjcmVlbihkaXNwbGF5KSwwLDApOwogCSgqbHBscEREKS0+ZC52cF93aWR0aCA9IHdpZHRoOwogCSgqbHBscEREKS0+ZC52cF9oZWlnaHQgPSBoZWlnaHQ7Ci0JKCpscGxwREQpLT5kLmZiX2hlaWdodCA9IGhlaWdodDsKLQkoKmxwbHBERCktPmQudnBtYXNrID0gMDsKKwkoKmxwbHBERCktPmQuZmJfaGVpZ2h0ID0gc2NyZWVuSGVpZ2h0OworCSgqbHBscEREKS0+ZC52cG1hc2sgPSAxOwogCiAJLyoganVzdCBhc3N1bWUgdGhlIGRlZmF1bHQgZGVwdGggaXMgdGhlIERHQSBkZXB0aCB0b28gKi8KIAkoKmxwbHBERCktPmQuZGVwdGggPSBEZWZhdWx0RGVwdGhPZlNjcmVlbihzY3JlZW4pOwpkaWZmIC0tZ2l0IGEvZ3JhcGhpY3MvZW52LmMgYi9ncmFwaGljcy9lbnYuYwppbmRleCA5ZTI4NGQ3Li4xM2FhMzdmIDEwMDY0NAotLS0gYS9ncmFwaGljcy9lbnYuYworKysgYi9ncmFwaGljcy9lbnYuYwpAQCAtOSw3ICs5LDYgQEAKICNpbmNsdWRlICJ3aW5kb3dzLmgiCiAjaW5jbHVkZSAiZ2RpLmgiCiAjaW5jbHVkZSAiZGVidWcuaCIKLSNpbmNsdWRlICJzdGRkZWJ1Zy5oIgogCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICAqICAgICAgICAgICBHZXRFbnZpcm9ubWVudCAgIChHREkuMTM0KQpkaWZmIC0tZ2l0IGEvZ3JhcGhpY3MvbWFwcGluZy5jIGIvZ3JhcGhpY3MvbWFwcGluZy5jCmluZGV4IGI4MTBhMjMuLjhhZDE5OGQgMTAwNjQ0Ci0tLSBhL2dyYXBoaWNzL21hcHBpbmcuYworKysgYi9ncmFwaGljcy9tYXBwaW5nLmMKQEAgLTYsNyArNiw2IEBACiAKICNpbmNsdWRlIDxtYXRoLmg+CiAjaW5jbHVkZSAiZGMuaCIKLSNpbmNsdWRlICJzdGRkZWJ1Zy5oIgogI2luY2x1ZGUgImRlYnVnLmgiCiAKIApAQCAtMTY0LDcgKzE2Myw3IEBACiAgICAgaWYgKCFkYykgcmV0dXJuIDA7CiAgICAgaWYgKGRjLT5mdW5jcy0+cFNldE1hcE1vZGUpIHJldHVybiBkYy0+ZnVuY3MtPnBTZXRNYXBNb2RlKCBkYywgbW9kZSApOwogCi0gICAgZHByaW50Zl9nZGkoc3RkZGViLCAiU2V0TWFwTW9kZTogJTA0eCAlZFxuIiwgaGRjLCBtb2RlICk7CisgICAgZHByaW50Zl9pbmZvKGdkaSwgIlNldE1hcE1vZGU6ICUwNHggJWRcbiIsIGhkYywgbW9kZSApOwogICAgIAogICAgIHByZXZNb2RlID0gZGMtPncuTWFwTW9kZTsKICAgICBzd2l0Y2gobW9kZSkKZGlmZiAtLWdpdCBhL2dyYXBoaWNzL21ldGFmaWxlZHJ2L2dyYXBoaWNzLmMgYi9ncmFwaGljcy9tZXRhZmlsZWRydi9ncmFwaGljcy5jCmluZGV4IDE2NDdhNjYuLmY2NjE1ZmYgMTAwNjQ0Ci0tLSBhL2dyYXBoaWNzL21ldGFmaWxlZHJ2L2dyYXBoaWNzLmMKKysrIGIvZ3JhcGhpY3MvbWV0YWZpbGVkcnYvZ3JhcGhpY3MuYwpAQCAtMTIsNyArMTIsNiBAQAogI2luY2x1ZGUgInJlZ2lvbi5oIgogI2luY2x1ZGUgInhtYWxsb2MuaCIKICNpbmNsdWRlICJtZXRhZmlsZWRydi5oIgotI2luY2x1ZGUgInN0ZGRlYnVnLmgiCiAjaW5jbHVkZSAiZGVidWcuaCIKIAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKZGlmZiAtLWdpdCBhL2dyYXBoaWNzL21ldGFmaWxlZHJ2L2luaXQuYyBiL2dyYXBoaWNzL21ldGFmaWxlZHJ2L2luaXQuYwppbmRleCA1ODU4N2YwLi45ZDIzMmJjIDEwMDY0NAotLS0gYS9ncmFwaGljcy9tZXRhZmlsZWRydi9pbml0LmMKKysrIGIvZ3JhcGhpY3MvbWV0YWZpbGVkcnYvaW5pdC5jCkBAIC05LDcgKzksNiBAQAogI2luY2x1ZGUgImhlYXAuaCIKICNpbmNsdWRlICJnbG9iYWwuaCIKICNpbmNsdWRlICJtZXRhZmlsZS5oIgotI2luY2x1ZGUgInN0ZGRlYnVnLmgiCiAjaW5jbHVkZSAiZGVidWcuaCIKIAogc3RhdGljIGNvbnN0IERDX0ZVTkNUSU9OUyBNRkRSVl9GdW5jcyA9CkBAIC0xNTEsNyArMTUwLDcgQEAKICAgICBNRVRBRklMRURSVl9QREVWSUNFICpwaHlzRGV2OwogICAgIEhGSUxFMzIgaEZpbGU7CiAKLSAgICBkcHJpbnRmX21ldGFmaWxlKCBzdGRkZWIsICJDcmVhdGVNZXRhRmlsZTE2OiAnJXMnXG4iLCBmaWxlbmFtZSApOworICAgIGRwcmludGZfaW5mbyhtZXRhZmlsZSwgIkNyZWF0ZU1ldGFGaWxlMTY6ICclcydcbiIsIGZpbGVuYW1lICk7CiAKICAgICBpZiAoIShkYyA9IE1GRFJWX0FsbG9jTWV0YUZpbGUoKSkpIHJldHVybiAwOwogICAgIHBoeXNEZXYgPSAoTUVUQUZJTEVEUlZfUERFVklDRSAqKWRjLT5waHlzRGV2OwpAQCAtMTc2LDcgKzE3NSw3IEBACiAgICAgZWxzZSAgLyogbWVtb3J5IGJhc2VkIG1ldGFmaWxlICovCiAJcGh5c0Rldi0+bWgtPm10VHlwZSA9IE1FVEFGSUxFX01FTU9SWTsKIAotICAgIGRwcmludGZfbWV0YWZpbGUoIHN0ZGRlYiwgIkNyZWF0ZU1ldGFGaWxlMTY6IHJldHVybmluZyAlMDR4XG4iLCBkYy0+aFNlbGYpOworICAgIGRwcmludGZfaW5mbyhtZXRhZmlsZSwgIkNyZWF0ZU1ldGFGaWxlMTY6IHJldHVybmluZyAlMDR4XG4iLCBkYy0+aFNlbGYpOwogICAgIHJldHVybiBkYy0+aFNlbGY7CiB9CiAKQEAgLTE5OSw3ICsxOTgsNyBAQAogICAgIEhGSUxFMzIgaEZpbGU7CiAgICAgTUVUQUZJTEVEUlZfUERFVklDRSAqcGh5c0RldjsKICAgICAKLSAgICBkcHJpbnRmX21ldGFmaWxlKCBzdGRkZWIsICJDbG9zZU1ldGFGaWxlKCUwNHgpXG4iLCBoZGMgKTsKKyAgICBkcHJpbnRmX2luZm8obWV0YWZpbGUsICJDbG9zZU1ldGFGaWxlKCUwNHgpXG4iLCBoZGMgKTsKIAogICAgIGlmICghKGRjID0gKERDICopIEdESV9HZXRPYmpQdHIoIGhkYywgTUVUQUZJTEVfRENfTUFHSUMgKSkpIHJldHVybiAwOwogICAgIHBoeXNEZXYgPSAoTUVUQUZJTEVEUlZfUERFVklDRSAqKWRjLT5waHlzRGV2OwpkaWZmIC0tZ2l0IGEvZ3JhcGhpY3MvbWV0YWZpbGVkcnYvb2JqZWN0cy5jIGIvZ3JhcGhpY3MvbWV0YWZpbGVkcnYvb2JqZWN0cy5jCmluZGV4IGRjYjA5NmQuLmRlOGJiYzYgMTAwNjQ0Ci0tLSBhL2dyYXBoaWNzL21ldGFmaWxlZHJ2L29iamVjdHMuYworKysgYi9ncmFwaGljcy9tZXRhZmlsZWRydi9vYmplY3RzLmMKQEAgLTEyLDcgKzEyLDYgQEAKICNpbmNsdWRlICJtZXRhZmlsZS5oIgogI2luY2x1ZGUgIm1ldGFmaWxlZHJ2LmgiCiAjaW5jbHVkZSAicGVuLmgiCi0jaW5jbHVkZSAic3RkZGVidWcuaCIKICNpbmNsdWRlICJkZWJ1Zy5oIgogCiAKQEAgLTg2LDcgKzg1LDcgQEAKICAgICBIR0RJT0JKMzIgcmV0ID0gMDsKIAogICAgIGlmICghcHRyKSByZXR1cm4gMDsKLSAgICBkcHJpbnRmX2dkaShzdGRkZWIsICJTZWxlY3RPYmplY3Q6IGhkYz0lMDR4ICUwNHhcbiIsIGRjLT5oU2VsZiwgaGFuZGxlICk7CisgICAgZHByaW50Zl9pbmZvKGdkaSwgIlNlbGVjdE9iamVjdDogaGRjPSUwNHggJTA0eFxuIiwgZGMtPmhTZWxmLCBoYW5kbGUgKTsKICAgICAKICAgICBzd2l0Y2gocHRyLT53TWFnaWMpCiAgICAgewpkaWZmIC0tZ2l0IGEvZ3JhcGhpY3MvbWV0YWZpbGVkcnYvdGV4dC5jIGIvZ3JhcGhpY3MvbWV0YWZpbGVkcnYvdGV4dC5jCmluZGV4IGM0Y2FmMWUuLjFhODYxN2EgMTAwNjQ0Ci0tLSBhL2dyYXBoaWNzL21ldGFmaWxlZHJ2L3RleHQuYworKysgYi9ncmFwaGljcy9tZXRhZmlsZWRydi90ZXh0LmMKQEAgLTEzLDcgKzEzLDYgQEAKICNpbmNsdWRlICJoZWFwLmgiCiAjaW5jbHVkZSAibWV0YWZpbGUuaCIKICNpbmNsdWRlICJtZXRhZmlsZWRydi5oIgotI2luY2x1ZGUgInN0ZGRlYnVnLmgiCiAjaW5jbHVkZSAiZGVidWcuaCIKICNpbmNsdWRlICJ4bWFsbG9jLmgiCiAKZGlmZiAtLWdpdCBhL2dyYXBoaWNzL3BhaW50aW5nLmMgYi9ncmFwaGljcy9wYWludGluZy5jCmluZGV4IDY3NTZjNDMuLjI1MTFlYzQgMTAwNjQ0Ci0tLSBhL2dyYXBoaWNzL3BhaW50aW5nLmMKKysrIGIvZ3JhcGhpY3MvcGFpbnRpbmcuYwpAQCAtMjQsNyArMjQsNiBAQAogI2luY2x1ZGUgImNvbG9yLmgiCiAjaW5jbHVkZSAicmVnaW9uLmgiCiAjaW5jbHVkZSAicGF0aC5oIgotI2luY2x1ZGUgInN0ZGRlYnVnLmgiCiAjaW5jbHVkZSAiZGVidWcuaCIKIAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCmRpZmYgLS1naXQgYS9ncmFwaGljcy93aW4xNmRydi9icnVzaC5jIGIvZ3JhcGhpY3Mvd2luMTZkcnYvYnJ1c2guYwppbmRleCAzMDVjZGU1Li43ZjM5N2RlIDEwMDY0NAotLS0gYS9ncmFwaGljcy93aW4xNmRydi9icnVzaC5jCisrKyBiL2dyYXBoaWNzL3dpbjE2ZHJ2L2JydXNoLmMKQEAgLTgsNyArOCw2IEBACiAjaW5jbHVkZSAiYnJ1c2guaCIKICNpbmNsdWRlICJ3aW4xNmRydi5oIgogI2luY2x1ZGUgImhlYXAuaCIKLSNpbmNsdWRlICJzdGRkZWJ1Zy5oIgogI2luY2x1ZGUgImRlYnVnLmgiCiAKIEhCUlVTSDMyIFdJTjE2RFJWX0JSVVNIX1NlbGVjdE9iamVjdCggREMgKiBkYywgSEJSVVNIMzIgaGJydXNoLApAQCAtMjYsNyArMjUsNyBAQAogCiAgICAgaWYgKCBwaHlzRGV2LT5CcnVzaEluZm8gKQogICAgIHsKLSAgICAgICAgZHByaW50Zl93aW4xNmRydihzdGRkZWIsICJVblJlYWxpemluZyBCcnVzaEluZm9cbiIpOworICAgICAgICBkcHJpbnRmX2luZm8od2luMTZkcnYsICJVblJlYWxpemluZyBCcnVzaEluZm9cbiIpOwogICAgICAgICBuU2l6ZSA9IFBSVERSVl9SZWFsaXplT2JqZWN0IChwaHlzRGV2LT5zZWdwdHJQREVWSUNFLCAtRFJWT0JKX0JSVVNILAogCQkJCSAgICAgIHBoeXNEZXYtPkJydXNoSW5mbywKIAkJCQkgICAgICBwaHlzRGV2LT5CcnVzaEluZm8sIDApOwpkaWZmIC0tZ2l0IGEvZ3JhcGhpY3Mvd2luMTZkcnYvZm9udC5jIGIvZ3JhcGhpY3Mvd2luMTZkcnYvZm9udC5jCmluZGV4IGE2NjlmNGMuLmYwYzhkY2UgMTAwNjQ0Ci0tLSBhL2dyYXBoaWNzL3dpbjE2ZHJ2L2ZvbnQuYworKysgYi9ncmFwaGljcy93aW4xNmRydi9mb250LmMKQEAgLTEyLDcgKzEyLDYgQEAKICNpbmNsdWRlICJtb2R1bGUuaCIKICNpbmNsdWRlICJmb250LmgiCiAjaW5jbHVkZSAiaGVhcC5oIgotI2luY2x1ZGUgInN0ZGRlYnVnLmgiCiAjaW5jbHVkZSAiZGVidWcuaCIKIAogCkBAIC0yNSw3ICsyNCw3IEBACiAgICAgV0lOMTZEUlZfUERFVklDRSAqcGh5c0RldiA9IChXSU4xNkRSVl9QREVWSUNFICopZGMtPnBoeXNEZXY7CiAgICAgRFdPUkQgZHdSZXQ7CiAgICAgCi0gICAgZHByaW50Zl93aW4xNmRydihzdGRkZWIsICJXSU4xNkRSVl9HZXRUZXh0RXh0UG9pbnQ6ICUwNHggJXMgJWQgJXBcbiIsCisgICAgZHByaW50Zl9pbmZvKHdpbjE2ZHJ2LCAiV0lOMTZEUlZfR2V0VGV4dEV4dFBvaW50OiAlMDR4ICVzICVkICVwXG4iLAogCQkgICAgICAgICAgICAgICAgZGMtPmhTZWxmLCBzdHIsIGNvdW50LCBzaXplKTsKIAogICAgIGR3UmV0ID0gUFJURFJWX0V4dFRleHRPdXQocGh5c0Rldi0+c2VncHRyUERFVklDRSwgMCwgMCwgCkBAIC0zNSw3ICszNCw3IEBACiAJCQkgICAgICB3aW4xNmRydl9TZWdQdHJfVGV4dFhGb3JtLCBOVUxMLCBOVUxMLCAwKTsKICAgICBzaXplLT5jeCA9IFhEU1RPTFMoZGMsTE9XT1JEKGR3UmV0KSk7CiAgICAgc2l6ZS0+Y3kgPSBZRFNUT0xTKGRjLEhJV09SRChkd1JldCkpOwotICAgIGRwcmludGZfd2luMTZkcnYoc3RkZGViLCAiV0lOMTZEUlZfR2V0VGV4dEV4dFBvaW50OiBjeD0weCV4LCBjeT0weCV4XG4iLAorICAgIGRwcmludGZfaW5mbyh3aW4xNmRydiwgIldJTjE2RFJWX0dldFRleHRFeHRQb2ludDogY3g9MHgleCwgY3k9MHgleFxuIiwKIAkJc2l6ZS0+Y3gsIHNpemUtPmN5ICk7CiAgICAgcmV0dXJuIFRSVUU7CiB9CkBAIC00OCwxMSArNDcsMTEgQEAKIHsKICAgICBXSU4xNkRSVl9QREVWSUNFICpwaHlzRGV2ID0gKFdJTjE2RFJWX1BERVZJQ0UgKilkYy0+cGh5c0RldjsKIAotICAgIGRwcmludGZfd2luMTZkcnYoc3RkZGViLCAiV0lOMTZEUlZfR2V0VGV4dE1ldHJpY3M6ICUwNHggXG4iLCBkYy0+aFNlbGYpOworICAgIGRwcmludGZfaW5mbyh3aW4xNmRydiwgIldJTjE2RFJWX0dldFRleHRNZXRyaWNzOiAlMDR4IFxuIiwgZGMtPmhTZWxmKTsKIAogICAgIEZPTlRfVGV4dE1ldHJpYzE2dG8zMkEoICZwaHlzRGV2LT50bSwgbWV0cmljcyApOwogCi0gICAgZHByaW50Zl93aW4xNmRydihzdGRkZWIsCisgICAgZHByaW50Zl9pbmZvKHdpbjE2ZHJ2LAogCSAgICJIICVkLCBBICVkLCBEICVkLCBJbnQgJWQsIEV4dCAlZCwgQVcgJWQsIE1XICVkLCBXICVkXG4iLAogICAgICAgICAgICBtZXRyaWNzLT50bUhlaWdodCwKICAgICAgICAgICAgbWV0cmljcy0+dG1Bc2NlbnQsCkBAIC03NCwxMyArNzMsMTMgQEAKIAogICAgIGRjLT53LmhGb250ID0gaGZvbnQ7CiAKLSAgICBkcHJpbnRmX3dpbjE2ZHJ2KHN0ZGRlYiwgIldJTjE2RFJWX0ZPTlRfU2VsZWN0T2JqZWN0ICclcycgaD0lZFxuIiwKKyAgICBkcHJpbnRmX2luZm8od2luMTZkcnYsICJXSU4xNkRSVl9GT05UX1NlbGVjdE9iamVjdCAnJXMnIGg9JWRcbiIsCiAJCSAgICAgZm9udC0+bG9nZm9udC5sZkZhY2VOYW1lLCBmb250LT5sb2dmb250LmxmSGVpZ2h0KTsKIAogCiAgICAgaWYoIHBoeXNEZXYtPkZvbnRJbmZvICkKICAgICB7Ci0gICAgICAgIGRwcmludGZfd2luMTZkcnYoc3RkZGViLCAiVW5SZWFsaXppbmcgRm9udEluZm9cbiIpOworICAgICAgICBkcHJpbnRmX2luZm8od2luMTZkcnYsICJVblJlYWxpemluZyBGb250SW5mb1xuIik7CiAgICAgICAgIG5TaXplID0gUFJURFJWX1JlYWxpemVPYmplY3QgKHBoeXNEZXYtPnNlZ3B0clBERVZJQ0UsIC1EUlZPQkpfRk9OVCwKIAkJCQkgICAgICBwaHlzRGV2LT5Gb250SW5mbywKIAkJCQkgICAgICBwaHlzRGV2LT5Gb250SW5mbywgMCk7CkBAIC0xMzAsNyArMTI5LDcgQEAKICAgICBwaHlzRGV2LT50bS50bUNoYXJTZXQgICAgICAgICAgPSBmaS0+ZGZDaGFyU2V0OwogI3VuZGVmIGZpCiAKLSAgICBkcHJpbnRmX3dpbjE2ZHJ2KHN0ZGRlYiwKKyAgICBkcHJpbnRmX2luZm8od2luMTZkcnYsCiAgICAgICAgICAgICJIICVkLCBBICVkLCBEICVkLCBJbnQgJWQsIEV4dCAlZCwgQVcgJWQsIE1XICVkLCBXICVkXG4iLAogICAgICAgICAgICBwaHlzRGV2LT50bS50bUhlaWdodCwKICAgICAgICAgICAgcGh5c0Rldi0+dG0udG1Bc2NlbnQsCkBAIC0xNTUsMTcgKzE1NCwxOCBAQAogCiAgICAgV0lOMTZEUlZfUERFVklDRSAqcGh5c0RldiA9IChXSU4xNkRSVl9QREVWSUNFICopZGMtPnBoeXNEZXY7CiAgICAgCi0gICAgZHByaW50Zl93aW4xNmRydiggc3RkZGViLCAiV0lOMTZEUlZfR2V0Q2hhcldpZHRoOiAlZCAtICVkIGludG8gJXBcbiIsCisgICAgZHByaW50Zl9pbmZvKHdpbjE2ZHJ2LCAiV0lOMTZEUlZfR2V0Q2hhcldpZHRoOiAlZCAtICVkIGludG8gJXBcbiIsCiAJCSAgICAgIGZpcnN0Q2hhciwgbGFzdENoYXIsIGJ1ZmZlciApOwogCiAgICAgd1JldCA9IFBSVERSVl9HZXRDaGFyV2lkdGgoIHBoeXNEZXYtPnNlZ3B0clBERVZJQ0UsIGJ1ZmZlciwgZmlyc3RDaGFyLCAKIAkJCQlsYXN0Q2hhciwgcGh5c0Rldi0+Rm9udEluZm8sIAogCQkJCXdpbjE2ZHJ2X1NlZ1B0cl9EcmF3TW9kZSwgCiAJCQkJd2luMTZkcnZfU2VnUHRyX1RleHRYRm9ybSApOwotICAgIGlmKCBkZWJ1Z2dpbmdfd2luMTZkcnYgKQorICAgIGlmKCBkZWJ1Z2dpbmdfaW5mbyh3aW4xNmRydikgKXsKICAgICAgICAgZm9yKGkgPSAwOyBpIDw9IGxhc3RDaGFyIC0gZmlyc3RDaGFyOyBpKyspCi0JICAgIGRwcmludGZfd2luMTZkcnYoc3RkZGViLCAiQ2hhciAleDogd2lkdGggJWRcbiIsIGkgKyBmaXJzdENoYXIsCisJICAgIGRwcmludGZfaW5mbyh3aW4xNmRydiwgIkNoYXIgJXg6IHdpZHRoICVkXG4iLCBpICsgZmlyc3RDaGFyLAogCQkJICAgICAgICAgICAgICAgICBidWZmZXJbaV0pOworICAgIH0KIAogICAgIHJldHVybiB3UmV0OwogfQpAQCAtMjA3LDcgKzIwNyw3IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFBURVhUTUVUUklDMTYgbHBUZXh0TWV0cmljcywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBXT1JEIHdGb250VHlwZSwgTE9ORyBscENsaWVudERhdGEpIAogewotICAgIGRwcmludGZfd2luMTZkcnYoc3RkZGViLCAiSW4gV2luZUVudW1ERm9udENhbGxiYWNrIHBsZj0lcFxuIiwgbHBMb2dGb250KTsKKyAgICBkcHJpbnRmX2luZm8od2luMTZkcnYsICJJbiBXaW5lRW51bURGb250Q2FsbGJhY2sgcGxmPSVwXG4iLCBscExvZ0ZvbnQpOwogICAgIHJldHVybiAoKigoKFdFUEZDICopbHBDbGllbnREYXRhKS0+cHJvYykpKCBscExvZ0ZvbnQsIGxwVGV4dE1ldHJpY3MsIAogCQkJCSAgICAgd0ZvbnRUeXBlLCAoKFdFUEZDICopbHBDbGllbnREYXRhKS0+bHAgKTsKIH0KZGlmZiAtLWdpdCBhL2dyYXBoaWNzL3dpbjE2ZHJ2L2dyYXBoaWNzLmMgYi9ncmFwaGljcy93aW4xNmRydi9ncmFwaGljcy5jCmluZGV4IDcyOTRhY2IuLjYzZjM0YWIgMTAwNjQ0Ci0tLSBhL2dyYXBoaWNzL3dpbjE2ZHJ2L2dyYXBoaWNzLmMKKysrIGIvZ3JhcGhpY3Mvd2luMTZkcnYvZ3JhcGhpY3MuYwpAQCAtNyw3ICs3LDYgQEAKICNpbmNsdWRlIDxzdGRpby5oPgogI2luY2x1ZGUgImhlYXAuaCIKICNpbmNsdWRlICJ3aW4xNmRydi5oIgotI2luY2x1ZGUgInN0ZGRlYnVnLmgiCiAjaW5jbHVkZSAiZGVidWcuaCIKIAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKQEAgLTYxLDkgKzYwLDkgQEAKICAgICBCT09MMzIgYlJldCA9IDA7CiAgICAgUE9JTlQxNiBwb2ludHNbMl07CiAKLSAgICBkcHJpbnRmX3dpbjE2ZHJ2KHN0ZGRlYiwgIkluIFdJTjE2RFJWX1JlY3RhbmdsZSwgeCAlZCB5ICVkIERDT3JnWCAlZCB5ICVkXG4iLAorICAgIGRwcmludGZfaW5mbyh3aW4xNmRydiwgIkluIFdJTjE2RFJWX1JlY3RhbmdsZSwgeCAlZCB5ICVkIERDT3JnWCAlZCB5ICVkXG4iLAogICAgICAgICAgICBsZWZ0LCB0b3AsIGRjLT53LkRDT3JnWCwgZGMtPncuRENPcmdZKTsKLSAgICBkcHJpbnRmX3dpbjE2ZHJ2KHN0ZGRlYiwgIkluIFdJTjE2RFJWX1JlY3RhbmdsZSwgVlBvcnRPcmdYICVkIHkgJWRcbiIsCisgICAgZHByaW50Zl9pbmZvKHdpbjE2ZHJ2LCAiSW4gV0lOMTZEUlZfUmVjdGFuZ2xlLCBWUG9ydE9yZ1ggJWQgeSAlZFxuIiwKICAgICAgICAgICAgZGMtPnZwb3J0T3JnWCwgZGMtPnZwb3J0T3JnWSk7CiAgICAgcG9pbnRzWzBdLnggPSBYTFBUT0RQKGRjLCBsZWZ0KTsKICAgICBwb2ludHNbMF0ueSA9IFlMUFRPRFAoZGMsIHRvcCk7CkBAIC0xNTMsOSArMTUyLDkgQEAKICAgICBXSU4xNkRSVl9QREVWSUNFICpwaHlzRGV2ID0gKFdJTjE2RFJWX1BERVZJQ0UgKilkYy0+cGh5c0RldjsKICAgICBCT09MMzIgYlJldCA9IDA7CiAgICAgUE9JTlQxNiBwb2ludHNbMl07Ci0gICAgZHByaW50Zl93aW4xNmRydihzdGRkZWIsICJJbiBXSU4xNkRSVl9FbGxpcHNlLCB4ICVkIHkgJWQgRENPcmdYICVkIHkgJWRcbiIsCisgICAgZHByaW50Zl9pbmZvKHdpbjE2ZHJ2LCAiSW4gV0lOMTZEUlZfRWxsaXBzZSwgeCAlZCB5ICVkIERDT3JnWCAlZCB5ICVkXG4iLAogICAgICAgICAgICBsZWZ0LCB0b3AsIGRjLT53LkRDT3JnWCwgZGMtPncuRENPcmdZKTsKLSAgICBkcHJpbnRmX3dpbjE2ZHJ2KHN0ZGRlYiwgIkluIFdJTjE2RFJWX0VsbGlwc2UsIFZQb3J0T3JnWCAlZCB5ICVkXG4iLAorICAgIGRwcmludGZfaW5mbyh3aW4xNmRydiwgIkluIFdJTjE2RFJWX0VsbGlwc2UsIFZQb3J0T3JnWCAlZCB5ICVkXG4iLAogICAgICAgICAgICBkYy0+dnBvcnRPcmdYLCBkYy0+dnBvcnRPcmdZKTsKICAgICBwb2ludHNbMF0ueCA9IFhMUFRPRFAoZGMsIGxlZnQpOwogICAgIHBvaW50c1swXS55ID0gWUxQVE9EUChkYywgdG9wKTsKZGlmZiAtLWdpdCBhL2dyYXBoaWNzL3dpbjE2ZHJ2L2luaXQuYyBiL2dyYXBoaWNzL3dpbjE2ZHJ2L2luaXQuYwppbmRleCA5MWQwYzMwLi42NzAzY2Y1IDEwMDY0NAotLS0gYS9ncmFwaGljcy93aW4xNmRydi9pbml0LmMKKysrIGIvZ3JhcGhpY3Mvd2luMTZkcnYvaW5pdC5jCkBAIC0yMSw3ICsyMSw2IEBACiAjaW5jbHVkZSAiZm9udC5oIgogI2luY2x1ZGUgImNhbGxiYWNrLmgiCiAjaW5jbHVkZSAib3B0aW9ucy5oIgotI2luY2x1ZGUgInN0ZGRlYnVnLmgiCiAjaW5jbHVkZSAiZGVidWcuaCIKIAogI2RlZmluZSBTVVBQT1JUX1JFQUxJWkVEX0ZPTlRTIDEKQEAgLTE3OCw3ICsxNzcsNyBAQAogICAgICAgICByZXR1cm4gRkFMU0U7CiAgICAgfQogCi0gICAgZHByaW50Zl93aW4xNmRydihzdGRkZWIsICJJbiBjcmVhdGRjIGZvciAoJXMsJXMsJXMpIGluaXREYXRhIDB4JXBcbiIsZHJpdmVyLCBkZXZpY2UsIG91dHB1dCwgaW5pdERhdGEpOworICAgIGRwcmludGZfaW5mbyh3aW4xNmRydiwgIkluIGNyZWF0ZGMgZm9yICglcywlcywlcykgaW5pdERhdGEgMHglcFxuIixkcml2ZXIsIGRldmljZSwgb3V0cHV0LCBpbml0RGF0YSk7CiAKICAgICBwaHlzRGV2ID0gKFdJTjE2RFJWX1BERVZJQ0UgKilIZWFwQWxsb2MoIFN5c3RlbUhlYXAsIDAsIHNpemVvZigqcGh5c0RldikgKTsKICAgICBpZiAoIXBoeXNEZXYpIHJldHVybiBGQUxTRTsKQEAgLTE4NywxMSArMTg2LDExIEBACiAgICAgcExQRCA9IExvYWRQcmludGVyRHJpdmVyKGRyaXZlcik7CiAgICAgaWYgKHBMUEQgPT0gTlVMTCkKICAgICB7Ci0JZHByaW50Zl93aW4xNmRydihzdGRkZWIsICJMUEdESV9DcmVhdGVEQzogRmFpbGVkIHRvIGZpbmQgcHJpbnRlciBkcml2ZXJcbiIpOworCWRwcmludGZfd2Fybih3aW4xNmRydiwgIkxQR0RJX0NyZWF0ZURDOiBGYWlsZWQgdG8gZmluZCBwcmludGVyIGRyaXZlclxuIik7CiAgICAgICAgIEhlYXBGcmVlKCBTeXN0ZW1IZWFwLCAwLCBwaHlzRGV2ICk7CiAgICAgICAgIHJldHVybiBGQUxTRTsKICAgICB9Ci0gICAgZHByaW50Zl93aW4xNmRydihzdGRkZWIsICJ3aW5kZXZDcmVhdGVEQyBwTFBEIDB4JXBcbiIsIHBMUEQpOworICAgIGRwcmludGZfaW5mbyh3aW4xNmRydiwgIndpbmRldkNyZWF0ZURDIHBMUEQgMHglcFxuIiwgcExQRCk7CiAKICAgICAvKiBOb3cgR2V0IHRoZSBkZXZpY2UgY2FwYWJpbGl0aWVzIGZyb20gdGhlIHByaW50ZXIgZHJpdmVyICovCiAgICAgCkBAIC0yMjcsNyArMjI2LDcgQEAKICAgICBwUERIID0gKFBERVZJQ0VfSEVBREVSICopKChCWVRFKilQVFJfU0VHX1RPX0xJTihwaHlzRGV2LT5zZWdwdHJQREVWSUNFKSAtIHNpemVvZihQREVWSUNFX0hFQURFUikpOyAKICAgICBwUERILT5wTFBEID0gcExQRDsKICAgICAKLSAgICBkcHJpbnRmX3dpbjE2ZHJ2KHN0ZGRlYiwgIlBSVERSVl9FbmFibGU6IFBERVZJQ0UgYWxsb2NhdGVkICUwOGx4XG4iLChEV09SRCkocGh5c0Rldi0+c2VncHRyUERFVklDRSkpOworICAgIGRwcmludGZfaW5mbyh3aW4xNmRydiwgIlBSVERSVl9FbmFibGU6IFBERVZJQ0UgYWxsb2NhdGVkICUwOGx4XG4iLChEV09SRCkocGh5c0Rldi0+c2VncHRyUERFVklDRSkpOwogICAgIAogICAgIC8qIE5vdyBnZXQgdGhlIHByaW50ZXIgZHJpdmVyIHRvIGluaXRpYWxpc2UgdGhpcyBkYXRhICovCiAgICAgd1JldCA9IFBSVERSVl9FbmFibGUoKExQVk9JRClwaHlzRGV2LT5zZWdwdHJQREVWSUNFLCBJTklUUERFVklDRSwgZGV2aWNlLCBkcml2ZXIsIG91dHB1dCwgTlVMTCk7IApAQCAtNTM5LDcgKzUzOCw3IEBACiAgICAgSEFORExFMTYgaEhhbmRsZSA9IChIQU5ETEUxNilTUF9FUlJPUjsKICAgICBQUFJJTlRKT0IgcFByaW50Sm9iOwogCi0gICAgZHByaW50Zl93aW4xNmRydihzdGRkZWIsICJPcGVuSm9iOiBcIiVzXCIgXCIlc1wiICUwNHhcbiIsIGxwT3V0cHV0LCBscFRpdGxlLCBoREMpOworICAgIGRwcmludGZfaW5mbyh3aW4xNmRydiwgIk9wZW5Kb2I6IFwiJXNcIiBcIiVzXCIgJTA0eFxuIiwgbHBPdXRwdXQsIGxwVGl0bGUsIGhEQyk7CiAKICAgICBwUHJpbnRKb2IgPSBnUHJpbnRKb2JzVGFibGVbMF07CiAgICAgaWYgKHBQcmludEpvYiA9PSBOVUxMKQpAQCAtNTY0LDcgKzU2Myw3IEBACiAJICAgIGdQcmludEpvYnNUYWJsZVtwUHJpbnRKb2ItPm5JbmRleF0gPSBwUHJpbnRKb2I7IAogCX0KICAgICB9Ci0gICAgZHByaW50Zl93aW4xNmRydihzdGRkZWIsICJPcGVuSm9iOiByZXR1cm4gJTA0eFxuIiwgaEhhbmRsZSk7CisgICAgZHByaW50Zl9pbmZvKHdpbjE2ZHJ2LCAiT3BlbkpvYjogcmV0dXJuICUwNHhcbiIsIGhIYW5kbGUpOwogICAgIHJldHVybiBoSGFuZGxlOwogfQogCkBAIC01NzMsNyArNTcyLDcgQEAKICAgICBpbnQgblJldCA9IFNQX0VSUk9SOwogICAgIFBQUklOVEpPQiBwUHJpbnRKb2IgPSBOVUxMOwogCi0gICAgZHByaW50Zl93aW4xNmRydihzdGRkZWIsICJDbG9zZUpvYjogJTA0eFxuIiwgaEpvYik7CisgICAgZHByaW50Zl9pbmZvKHdpbjE2ZHJ2LCAiQ2xvc2VKb2I6ICUwNHhcbiIsIGhKb2IpOwogCiAgICAgcFByaW50Sm9iID0gRmluZFByaW50Sm9iRnJvbUhhbmRsZShoSm9iKTsKICAgICBpZiAocFByaW50Sm9iICE9IE5VTEwpCkBAIC01OTEsNyArNTkwLDcgQEAKICAgICBpbnQgblJldCA9IFNQX0VSUk9SOwogICAgIFBQUklOVEpPQiBwUHJpbnRKb2IgPSBOVUxMOwogCi0gICAgZHByaW50Zl93aW4xNmRydihzdGRkZWIsICJXcml0ZVNwb29sOiAlMDR4ICUwOGx4ICUwNHhcbiIsIGhKb2IsIChEV09SRClscERhdGEsIGNjaCk7CisgICAgZHByaW50Zl9pbmZvKHdpbjE2ZHJ2LCAiV3JpdGVTcG9vbDogJTA0eCAlMDhseCAlMDR4XG4iLCBoSm9iLCAoRFdPUkQpbHBEYXRhLCBjY2gpOwogCiAgICAgcFByaW50Sm9iID0gRmluZFByaW50Sm9iRnJvbUhhbmRsZShoSm9iKTsKICAgICBpZiAocFByaW50Sm9iICE9IE5VTEwgJiYgcFByaW50Sm9iLT5mZCA+PSAwICYmIGNjaCkKQEAgLTYwOCw3ICs2MDcsNyBAQAogewogICAgIGludCBuUmV0ID0gMDsKIAotICAgIGRwcmludGZfd2luMTZkcnYoc3RkZGViLCAiV3JpdGVEaWFsb2c6ICUwNHggJTA0eCBcIiVzXCJcbiIsIGhKb2IsICBjY2hNc2csIGxwTXNnKTsKKyAgICBkcHJpbnRmX2luZm8od2luMTZkcnYsICJXcml0ZURpYWxvZzogJTA0eCAlMDR4IFwiJXNcIlxuIiwgaEpvYiwgIGNjaE1zZywgbHBNc2cpOwogCiAgICAgblJldCA9IE1lc3NhZ2VCb3gxNigwLCBscE1zZywgIlByaW50aW5nIEVycm9yIiwgTUJfT0tDQU5DRUwpOwogICAgIHJldHVybiBuUmV0OwpAQCAtNjE4LDcgKzYxNyw3IEBACiB7CiAgICAgaW50IG5SZXQ7CiAKLSAgICBkcHJpbnRmX3dpbjE2ZHJ2KHN0ZGRlYiwgIkRlbGV0ZUpvYjogJTA0eFxuIiwgaEpvYik7CisgICAgZHByaW50Zl9pbmZvKHdpbjE2ZHJ2LCAiRGVsZXRlSm9iOiAlMDR4XG4iLCBoSm9iKTsKIAogICAgIG5SZXQgPSBGcmVlUHJpbnRKb2IoaEpvYik7CiAgICAgcmV0dXJuIG5SZXQ7CkBAIC02MzEsMTMgKzYzMCwxMyBAQAogICovCiBpbnQgV0lOQVBJIFN0YXJ0U3Bvb2xQYWdlKEhBTkRMRTE2IGhKb2IpCiB7Ci0gICAgZHByaW50Zl93aW4xNmRydihzdGRkZWIsICJTdGFydFNwb29sUGFnZSBHREkuMjQ2IHVuaW1wbGVtZW50ZWRcbiIpOworICAgIGRwcmludGZfZml4bWUod2luMTZkcnYsICJTdGFydFNwb29sUGFnZSBHREkuMjQ2IHVuaW1wbGVtZW50ZWRcbiIpOwogICAgIHJldHVybiAxOwogCiB9CiBpbnQgV0lOQVBJIEVuZFNwb29sUGFnZShIQU5ETEUxNiBoSm9iKQogewotICAgIGRwcmludGZfd2luMTZkcnYoc3RkZGViLCAiRW5kU3Bvb2xQYWdlIEdESS4yNDcgdW5pbXBsZW1lbnRlZFxuIik7CisgICAgZHByaW50Zl9maXhtZSh3aW4xNmRydiwgIkVuZFNwb29sUGFnZSBHREkuMjQ3IHVuaW1wbGVtZW50ZWRcbiIpOwogICAgIHJldHVybiAxOwogfQogCkBAIC02NDUsNiArNjQ0LDYgQEAKIERXT1JEIFdJTkFQSSBHZXRTcG9vbEpvYihpbnQgbk9wdGlvbiwgTE9ORyBwYXJhbSkKIHsKICAgICBEV09SRCByZXR2YWwgPSAwOwotICAgIGRwcmludGZfd2luMTZkcnYoc3RkZGViLCAiSW4gR2V0U3Bvb2xKb2IgcGFyYW0gMHglbHggbm9wdGlvbiAlZFxuIixwYXJhbSwgbk9wdGlvbik7CisgICAgZHByaW50Zl9pbmZvKHdpbjE2ZHJ2LCAiSW4gR2V0U3Bvb2xKb2IgcGFyYW0gMHglbHggbm9wdGlvbiAlZFxuIixwYXJhbSwgbk9wdGlvbik7CiAgICAgcmV0dXJuIHJldHZhbDsKIH0KZGlmZiAtLWdpdCBhL2dyYXBoaWNzL3dpbjE2ZHJ2L29iamVjdHMuYyBiL2dyYXBoaWNzL3dpbjE2ZHJ2L29iamVjdHMuYwppbmRleCBjMmUxZjgyLi5hOWE5ZTZlIDEwMDY0NAotLS0gYS9ncmFwaGljcy93aW4xNmRydi9vYmplY3RzLmMKKysrIGIvZ3JhcGhpY3Mvd2luMTZkcnYvb2JqZWN0cy5jCkBAIC0xMCw3ICsxMCw2IEBACiAjaW5jbHVkZSAiYnJ1c2guaCIKICNpbmNsdWRlICJmb250LmgiCiAjaW5jbHVkZSAicGVuLmgiCi0jaW5jbHVkZSAic3RkZGVidWcuaCIKICNpbmNsdWRlICJkZWJ1Zy5oIgogCiAKQEAgLTMyLDcgKzMxLDcgQEAKICAgICBIR0RJT0JKMzIgcmV0ID0gMDsKIAogICAgIGlmICghcHRyKSByZXR1cm4gMDsKLSAgICBkcHJpbnRmX2dkaShzdGRkZWIsICJTZWxlY3RPYmplY3Q6IGhkYz0lMDR4ICUwNHhcbiIsIGRjLT5oU2VsZiwgaGFuZGxlICk7CisgICAgZHByaW50Zl9pbmZvKGdkaSwgIlNlbGVjdE9iamVjdDogaGRjPSUwNHggJTA0eFxuIiwgZGMtPmhTZWxmLCBoYW5kbGUgKTsKICAgICAKICAgICBzd2l0Y2gocHRyLT53TWFnaWMpCiAgICAgewpkaWZmIC0tZ2l0IGEvZ3JhcGhpY3Mvd2luMTZkcnYvcGVuLmMgYi9ncmFwaGljcy93aW4xNmRydi9wZW4uYwppbmRleCBjMmU1NDU0Li40NTlkY2ZlIDEwMDY0NAotLS0gYS9ncmFwaGljcy93aW4xNmRydi9wZW4uYworKysgYi9ncmFwaGljcy93aW4xNmRydi9wZW4uYwpAQCAtOCw3ICs4LDYgQEAKICNpbmNsdWRlICJjb2xvci5oIgogI2luY2x1ZGUgIndpbjE2ZHJ2LmgiCiAjaW5jbHVkZSAiaGVhcC5oIgotI2luY2x1ZGUgInN0ZGRlYnVnLmgiCiAjaW5jbHVkZSAiZGVidWcuaCIKIAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCkBAIC0yMSw3ICsyMCw3IEBACiAgICAgaW50CQkgblNpemU7CiAgICAgTE9HUEVOMTYgCSBsUGVuMTY7CiAgICAgZGMtPncuaFBlbiA9IGhwZW47Ci0gICAgZHByaW50Zl93aW4xNmRydihzdGRkZWIsICJJbiBXSU4xNkRSVl9QRU5fU2VsZWN0T2JqZWN0XG4iKTsKKyAgICBkcHJpbnRmX2luZm8od2luMTZkcnYsICJJbiBXSU4xNkRSVl9QRU5fU2VsZWN0T2JqZWN0XG4iKTsKICAgICBsUGVuMTYubG9wblN0eWxlICAgPSBwZW4tPmxvZ3Blbi5sb3BuU3R5bGU7CiAgICAgbFBlbjE2LmxvcG5XaWR0aC54ID0gcGVuLT5sb2dwZW4ubG9wbldpZHRoLng7CiAgICAgbFBlbjE2LmxvcG5XaWR0aC55ID0gcGVuLT5sb2dwZW4ubG9wbldpZHRoLnk7CkBAIC0yOSw3ICsyOCw3IEBACiAKICAgICBpZiAoIHBoeXNEZXYtPlBlbkluZm8gKQogICAgIHsKLSAgICAgICAgZHByaW50Zl93aW4xNmRydihzdGRkZWIsICJVblJlYWxpemluZyBQZW5JbmZvXG4iKTsKKyAgICAgICAgZHByaW50Zl9pbmZvKHdpbjE2ZHJ2LCAiVW5SZWFsaXppbmcgUGVuSW5mb1xuIik7CiAgICAgICAgIG5TaXplID0gUFJURFJWX1JlYWxpemVPYmplY3QgKHBoeXNEZXYtPnNlZ3B0clBERVZJQ0UsIC1EUlZPQkpfUEVOLAogCQkJCSAgICAgIHBoeXNEZXYtPlBlbkluZm8sCiAJCQkJICAgICAgcGh5c0Rldi0+UGVuSW5mbywgMCk7CmRpZmYgLS1naXQgYS9ncmFwaGljcy93aW4xNmRydi9wcnRkcnYuYyBiL2dyYXBoaWNzL3dpbjE2ZHJ2L3BydGRydi5jCmluZGV4IGZhYzE3NTcuLmM2ODZhMGEgMTAwNjQ0Ci0tLSBhL2dyYXBoaWNzL3dpbjE2ZHJ2L3BydGRydi5jCisrKyBiL2dyYXBoaWNzL3dpbjE2ZHJ2L3BydGRydi5jCkBAIC0xNSw3ICsxNSw2IEBACiAjaW5jbHVkZSAiaGVhcC5oIgogI2luY2x1ZGUgImJydXNoLmgiCiAjaW5jbHVkZSAiY2FsbGJhY2suaCIKLSNpbmNsdWRlICJzdGRkZWJ1Zy5oIgogI2luY2x1ZGUgImRlYnVnLmgiCiAjaW5jbHVkZSAiYml0bWFwLmgiCiAjaW5jbHVkZSAicGVuLmgiCkBAIC01Niw3ICs1NSw3IEBACiAgICAgICBMb2FkUHJpbnRlckRydkZ1bmMoQURWQU5DRURTRVRVUERJQUxPRyk7CiAgICAgICBMb2FkUHJpbnRlckRydkZ1bmMoRElBTE9HRk4pOwogICAgICAgTG9hZFByaW50ZXJEcnZGdW5jKFBTRVVET0VESVQpOwotICAgICAgZHByaW50Zl93aW4xNmRydiAoc3RkZGViLCJnb3QgZnVuYyBDT05UUk9MIDB4JXAgZW5hYmxlIDB4JXAgZW51bURmb250cyAweCVwIHJlYWxpemVvYmplY3QgMHglcCBleHRleHRvdXQgMHglcFxuIiwKKyAgICAgIGRwcmludGZfaW5mbyh3aW4xNmRydiwiZ290IGZ1bmMgQ09OVFJPTCAweCVwIGVuYWJsZSAweCVwIGVudW1EZm9udHMgMHglcCByZWFsaXplb2JqZWN0IDB4JXAgZXh0ZXh0b3V0IDB4JXBcbiIsCiAgICAgICAgICAgICAgIHBMUEQtPmZuW0ZVTkNfQ09OVFJPTF0sCiAgICAgICAgICAgICAgIHBMUEQtPmZuW0ZVTkNfRU5BQkxFXSwKICAgICAgICAgICAgICAgcExQRC0+Zm5bRlVOQ19FTlVNREZPTlRTXSwKQEAgLTc5LDcgKzc4LDcgQEAKIAlwdG1wTFBEID0gZ2FwTG9hZGVkUHJpbnRlckRyaXZlcnNbbkRyaXZlclNsb3QrK107CiAJaWYgKHB0bXBMUEQgIT0gTlVMTCkKIAl7Ci0JICAgIGRwcmludGZfd2luMTZkcnYoc3RkZGViLCAiQ29tcGFyaW5nICVzLCVzXG4iLHB0bXBMUEQtPnN6RHJpdmVyLHBzekRyaXZlcik7CisJICAgIGRwcmludGZfaW5mbyh3aW4xNmRydiwgIkNvbXBhcmluZyAlcywlc1xuIixwdG1wTFBELT5zekRyaXZlcixwc3pEcml2ZXIpOwogCSAgICAvKiBGb3VuZCBkcml2ZXIgc3RvcmUgaW5mbywgZXhpdCBsb29wICovCiAJICAgIGlmIChsc3RyY21waTMyQShwdG1wTFBELT5zekRyaXZlciwgcHN6RHJpdmVyKSA9PSAwKQogCSAgICAgIHBMUEQgPSBwdG1wTFBEOwpAQCAtMTUxLDcgKzE1MCw3IEBACiAJLyogRmFpbGVkIHRvIGxvYWQgZHJpdmVyICovCiAJZnByaW50ZihzdGRlcnIsICJGYWlsZWQgdG8gbG9hZCBwcmludGVyIGRyaXZlciAlc1xuIiwgcHN6RHJpdmVyKTsKICAgICB9IGVsc2UgewotICAgICAgICBkcHJpbnRmX3dpbjE2ZHJ2KHN0ZGRlYiwgIkxvYWRlZCB0aGUgbGlicmFyeVxuIik7CisgICAgICAgIGRwcmludGZfaW5mbyh3aW4xNmRydiwgIkxvYWRlZCB0aGUgbGlicmFyeVxuIik7CiAJLyogQWxsb2NhdGUgc29tZSBtZW1vcnkgZm9yIHByaW50ZXIgZHJpdmVyIGluZm8gKi8KIAlwTFBEID0gbWFsbG9jKHNpemVvZihMT0FERURfUFJJTlRFUl9EUklWRVIpKTsKIAltZW1zZXQocExQRCwgMCAsIHNpemVvZihMT0FERURfUFJJTlRFUl9EUklWRVIpKTsKQEAgLTE2Miw3ICsxNjEsNyBAQAogCS8qIEdldCBEUyBmb3IgdGhlIHByaW50ZXIgbW9kdWxlICovCiAJcExQRC0+ZHNfcmVnCT0gaEluc3Q7CiAKLQlkcHJpbnRmX3dpbjE2ZHJ2KHN0ZGRlYiwgIkRTIGZvciAlcyBpcyAleFxuIiwgcHN6RHJpdmVyLCBwTFBELT5kc19yZWcpOworCWRwcmludGZfaW5mbyh3aW4xNmRydiwgIkRTIGZvciAlcyBpcyAleFxuIiwgcHN6RHJpdmVyLCBwTFBELT5kc19yZWcpOwogCiAJLyogR2V0IGFkZHJlc3Mgb2YgcHJpbnRlciBkcml2ZXIgZnVuY3Rpb25zICovCiAJR2V0UHJpbnRlckRyaXZlckZ1bmN0aW9ucyhoSW5zdCwgcExQRCk7CkBAIC0xODksMjAgKzE4OCwyMCBAQAogICAgIFdPUkQgd1JldCA9IDA7CiAgICAgTE9BREVEX1BSSU5URVJfRFJJVkVSICpwTFBEID0gTlVMTDsKIAotICAgIGRwcmludGZfd2luMTZkcnYoc3RkZGViLCAiUFJURFJWX0NvbnRyb2w6ICUwOHggMHgleCAlMDhseCAlMDhseFxuIiwgKHVuc2lnbmVkIGludClscERlc3REZXYsIHdmdW5jdGlvbiwgbHBJbkRhdGEsIGxwT3V0RGF0YSk7CisgICAgZHByaW50Zl9pbmZvKHdpbjE2ZHJ2LCAiUFJURFJWX0NvbnRyb2w6ICUwOHggMHgleCAlMDhseCAlMDhseFxuIiwgKHVuc2lnbmVkIGludClscERlc3REZXYsIHdmdW5jdGlvbiwgbHBJbkRhdGEsIGxwT3V0RGF0YSk7CiAKICAgICBpZiAoKHBMUEQgPSBGaW5kUHJpbnRlckRyaXZlckZyb21QREVWSUNFKGxwRGVzdERldikpICE9IE5VTEwpCiAgICAgewogCWlmIChwTFBELT5mbltGVU5DX0NPTlRST0xdID09IE5VTEwpCiAJewotCSAgICBkcHJpbnRmX3dpbjE2ZHJ2KHN0ZGRlYiwgIlBSVERSVl9Db250cm9sOiBOb3Qgc3VwcG9ydGVkIGJ5IGRyaXZlclxuIik7CisJICAgIGRwcmludGZfd2Fybih3aW4xNmRydiwgIlBSVERSVl9Db250cm9sOiBOb3Qgc3VwcG9ydGVkIGJ5IGRyaXZlclxuIik7CiAJICAgIHJldHVybiAwOwogCX0KIAl3UmV0ID0gQ2FsbGJhY2tzLT5DYWxsRHJ2Q29udHJvbFByb2MoIHBMUEQtPmZuW0ZVTkNfQ09OVFJPTF0sIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChTRUdQVFIpbHBEZXN0RGV2LCB3ZnVuY3Rpb24sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbHBJbkRhdGEsIGxwT3V0RGF0YSApOwogICAgIH0KLSAgICBkcHJpbnRmX3dpbjE2ZHJ2KHN0ZGRlYiwgIlBSVERSVl9Db250cm9sOiByZXR1cm4gJXhcbiIsIHdSZXQpOworICAgIGRwcmludGZfaW5mbyh3aW4xNmRydiwgIlBSVERSVl9Db250cm9sOiByZXR1cm4gJXhcbiIsIHdSZXQpOwogICAgIHJldHVybiB3UmV0OwogfQogCkBAIC0yMTUsNyArMjE0LDcgQEAKICAgICBXT1JEIHdSZXQgPSAwOwogICAgIExPQURFRF9QUklOVEVSX0RSSVZFUiAqcExQRCA9IE5VTEw7CiAKLSAgICBkcHJpbnRmX3dpbjE2ZHJ2KHN0ZGRlYiwgIlBSVERSVl9FbmFibGU6ICVzICVzXG4iLGxwRGVzdERldlR5cGUsIGxwT3V0cHV0RmlsZSk7CisgICAgZHByaW50Zl9pbmZvKHdpbjE2ZHJ2LCAiUFJURFJWX0VuYWJsZTogJXMgJXNcbiIsbHBEZXN0RGV2VHlwZSwgbHBPdXRwdXRGaWxlKTsKIAogICAgIC8qIEdldCB0aGUgcHJpbnRlciBkcml2ZXIgaW5mbyAqLwogICAgIGlmICh3U3R5bGUgPT0gSU5JVFBERVZJQ0UpCkBAIC0yMjksNyArMjI4LDcgQEAKIAlXT1JECQl3UDI7CiAKIAlpZiAoIXBMUEQtPmZuW0ZVTkNfRU5BQkxFXSkgewotCSAgICBkcHJpbnRmX3dpbjE2ZHJ2KHN0ZGRlYiwgIlBSVERSVl9FbmFibGU6IE5vdCBzdXBwb3J0ZWQgYnkgZHJpdmVyXG4iKTsKKwkgICAgZHByaW50Zl93YXJuKHdpbjE2ZHJ2LCAiUFJURFJWX0VuYWJsZTogTm90IHN1cHBvcnRlZCBieSBkcml2ZXJcbiIpOwogCSAgICByZXR1cm4gMDsKIAl9CiAKQEAgLTI2MCw3ICsyNTksNyBAQAogCSAgICBTRUdQVFJfRlJFRShsUDEpOwogCX0KICAgICB9Ci0gICAgZHByaW50Zl93aW4xNmRydihzdGRkZWIsICJQUlREUlZfRW5hYmxlOiByZXR1cm4gJXhcbiIsIHdSZXQpOworICAgIGRwcmludGZfaW5mbyh3aW4xNmRydiwgIlBSVERSVl9FbmFibGU6IHJldHVybiAleFxuIiwgd1JldCk7CiAgICAgcmV0dXJuIHdSZXQ7CiB9CiAKQEAgLTI3NCw3ICsyNzMsNyBAQAogICAgIFdPUkQgd1JldCA9IDA7CiAgICAgTE9BREVEX1BSSU5URVJfRFJJVkVSICpwTFBEID0gTlVMTDsKIAotICAgIGRwcmludGZfd2luMTZkcnYoc3RkZGViLCAiUFJURFJWX0VudW1ERm9udHM6ICUwOGx4ICVzICVwICVwXG4iLAorICAgIGRwcmludGZfaW5mbyh3aW4xNmRydiwgIlBSVERSVl9FbnVtREZvbnRzOiAlMDhseCAlcyAlcCAlcFxuIiwKIAkJICAgICBscERlc3REZXYsIGxwRmFjZU5hbWUsIGxwQ2FsbGJhY2tGdW5jLCBscENsaWVudERhdGEpOwogCiAgICAgaWYgKChwTFBEID0gRmluZFByaW50ZXJEcml2ZXJGcm9tUERFVklDRShscERlc3REZXYpKSAhPSBOVUxMKQpAQCAtMjgzLDcgKzI4Miw3IEBACiAJTFBCWVRFIGxQMjsKIAogCWlmIChwTFBELT5mbltGVU5DX0VOVU1ERk9OVFNdID09IE5VTEwpIHsKLQkgICAgZHByaW50Zl93aW4xNmRydihzdGRkZWIsICJQUlREUlZfRW51bURGb250czogTm90IHN1cHBvcnRlZCBieSBkcml2ZXJcbiIpOworCSAgICBkcHJpbnRmX3dhcm4od2luMTZkcnYsICJQUlREUlZfRW51bURGb250czogTm90IHN1cHBvcnRlZCBieSBkcml2ZXJcbiIpOwogCSAgICByZXR1cm4gMDsKIAl9CiAKQEAgLTMwMCw3ICsyOTksNyBAQAogICAgIH0gZWxzZSAKICAgICAgICAgZnByaW50ZihzdGRlcnIsIkZhaWxlZCB0byBmaW5kIGRldmljZVxuIik7CiAgICAgCi0gICAgZHByaW50Zl93aW4xNmRydihzdGRkZWIsICJQUlREUlZfRW51bURGb250czogcmV0dXJuICV4XG4iLCB3UmV0KTsKKyAgICBkcHJpbnRmX2luZm8od2luMTZkcnYsICJQUlREUlZfRW51bURGb250czogcmV0dXJuICV4XG4iLCB3UmV0KTsKICAgICByZXR1cm4gd1JldDsKIH0KIC8qCkBAIC0zMTIsNyArMzExLDcgQEAKICAgICBXT1JEIHdSZXQgPSAwOwogICAgIExPQURFRF9QUklOVEVSX0RSSVZFUiAqcExQRCA9IE5VTEw7CiAKLSAgICBkcHJpbnRmX3dpbjE2ZHJ2KHN0ZGRlYiwgIlBSVERSVl9FbnVtT2JqOlxuIik7CisgICAgZHByaW50Zl9pbmZvKHdpbjE2ZHJ2LCAiUFJURFJWX0VudW1PYmo6XG4iKTsKIAogICAgIGlmICgocExQRCA9IEZpbmRQcmludGVyRHJpdmVyRnJvbVBERVZJQ0UobHBEZXN0RGV2KSkgIT0gTlVMTCkKICAgICB7CkBAIC0zMjIsNyArMzIxLDcgQEAKIAogCWlmIChwTFBELT5mbltGVU5DX0VOVU1PQkpdID09IE5VTEwpCiAJewotCSAgICBkcHJpbnRmX3dpbjE2ZHJ2KHN0ZGRlYiwgIlBSVERSVl9FbnVtT2JqOiBOb3Qgc3VwcG9ydGVkIGJ5IGRyaXZlclxuIik7CisJICAgIGRwcmludGZfd2Fybih3aW4xNmRydiwgIlBSVERSVl9FbnVtT2JqOiBOb3Qgc3VwcG9ydGVkIGJ5IGRyaXZlclxuIik7CiAJICAgIHJldHVybiAwOwogCX0KIApAQCAtMzQzLDcgKzM0Miw3IEBACiAgICAgZWxzZSAKICAgICAgICAgZnByaW50ZihzdGRlcnIsIkZhaWxlZCB0byBmaW5kIGRldmljZVxuIik7CiAgICAgCi0gICAgZHByaW50Zl93aW4xNmRydihzdGRkZWIsICJQUlREUlZfRW51bU9iajogcmV0dXJuICV4XG4iLCB3UmV0KTsKKyAgICBkcHJpbnRmX2luZm8od2luMTZkcnYsICJQUlREUlZfRW51bU9iajogcmV0dXJuICV4XG4iLCB3UmV0KTsKICAgICByZXR1cm4gd1JldDsKIH0KIApAQCAtMzYyLDcgKzM2MSw3IEBACiAgICAgV09SRCB3UmV0ID0gMDsKICAgICBMT0FERURfUFJJTlRFUl9EUklWRVIgKnBMUEQgPSBOVUxMOwogICAgIAotICAgIGRwcmludGZfd2luMTZkcnYoc3RkZGViLCAiUFJURFJWX09VVFBVVCAlZFxuIiwgd1N0eWxlICk7CisgICAgZHByaW50Zl9pbmZvKHdpbjE2ZHJ2LCAiUFJURFJWX09VVFBVVCAlZFxuIiwgd1N0eWxlICk7CiAgICAgCiAgICAgaWYgKChwTFBEID0gRmluZFByaW50ZXJEcml2ZXJGcm9tUERFVklDRShscERlc3REZXYpKSAhPSBOVUxMKQogICAgIHsKQEAgLTM3Myw3ICszNzIsNyBAQAogCWludCAgIG5TaXplOwogCWlmIChwTFBELT5mbltGVU5DX09VVFBVVF0gPT0gTlVMTCkKIAl7Ci0JICAgIGRwcmludGZfd2luMTZkcnYoc3RkZGViLCAiUFJURFJWX091dHB1dDogTm90IHN1cHBvcnRlZCBieSBkcml2ZXJcbiIpOworCSAgICBkcHJpbnRmX3dhcm4od2luMTZkcnYsICJQUlREUlZfT3V0cHV0OiBOb3Qgc3VwcG9ydGVkIGJ5IGRyaXZlclxuIik7CiAJICAgIHJldHVybiAwOwogCX0KIApAQCAtNDE2LDcgKzQxNSw3IEBACiAJICAgICAgICB7CiAJCSAgICBDT05WX1JFQ1QzMlRPMTYoIHBSZWN0LCBsUDggKTsKIAotCQkgICAgZHByaW50Zl93aW4xNmRydihzdGRkZWIsICJyZWN0ID0gJWQsJWQgLSAlZCwlZFxuIiwKKwkJICAgIGRwcmludGZfaW5mbyh3aW4xNmRydiwgInJlY3QgPSAlZCwlZCAtICVkLCVkXG4iLAogCQkJICAgIGxQOC0+bGVmdCwgbFA4LT50b3AsIGxQOC0+cmlnaHQsIGxQOC0+Ym90dG9tICk7CiAJCSAgICB3UmV0ID0gQ2FsbGJhY2tzLT5DYWxsRHJ2T3V0cHV0UHJvYyhwTFBELT5mbltGVU5DX09VVFBVVF0sIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsUDEsIHdQMiwgd1AzLCBTRUdQVFJfR0VUKGxQNCksCkBAIC00MzQsNyArNDMzLDcgQEAKIAl9CiAgICAgICAgIFNFR1BUUl9GUkVFKGxQNCk7CiAgICAgfQotICAgIGRwcmludGZfd2luMTZkcnYoc3RkZGViLCAiUFJURFJWX091dHB1dCByZXR1cm4gJWRcbiIsIHdSZXQpOworICAgIGRwcmludGZfaW5mbyh3aW4xNmRydiwgIlBSVERSVl9PdXRwdXQgcmV0dXJuICVkXG4iLCB3UmV0KTsKICAgICByZXR1cm4gd1JldDsKIH0KIApAQCAtNDQ4LDcgKzQ0Nyw3IEBACiAgICAgV09SRCBkd1JldCA9IDA7CiAgICAgTE9BREVEX1BSSU5URVJfRFJJVkVSICpwTFBEID0gTlVMTDsKICAgICAKLSAgICBkcHJpbnRmX3dpbjE2ZHJ2KHN0ZGRlYiwKKyAgICBkcHJpbnRmX2luZm8od2luMTZkcnYsCiAJCSAgICAgIlBSVERSVl9SZWFsaXplT2JqZWN0OiAlMDhseCAlMDR4ICVwICVwICUwOGx4XG4iLAogCQkgICAgIGxwRGVzdERldiwgd1N0eWxlLCBscEluT2JqLCBscE91dE9iaiwgbHBUZXh0WEZvcm0pOwogICAgIApAQCAtNDYxLDcgKzQ2MCw3IEBACiAKIAlpZiAocExQRC0+Zm5bRlVOQ19SRUFMSVpFT0JKRUNUXSA9PSBOVUxMKQogCXsKLQkgICAgZHByaW50Zl93aW4xNmRydihzdGRkZWIsCisJICAgIGRwcmludGZfd2Fybih3aW4xNmRydiwKIAkJCSAgICAiUFJURFJWX1JlYWxpemVPYmplY3Q6IE5vdCBzdXBwb3J0ZWQgYnkgZHJpdmVyXG4iKTsKIAkgICAgcmV0dXJuIDA7CiAJfQpAQCAtNTA3LDcgKzUwNiw3IEBACiAJbFA0ID0gU0VHUFRSX0dFVCggbHBPdXRPYmogKTsKIAogICAgICAgICBsUDUgPSBscFRleHRYRm9ybTsKLQlkcHJpbnRmX3dpbjE2ZHJ2KHN0ZGRlYiwKKwlkcHJpbnRmX2luZm8od2luMTZkcnYsCiAJCQkgIkNhbGxpbmcgUmVhbGl6ZSAlMDhseCAlMDR4ICUwOGx4ICUwOGx4ICUwOGx4XG4iLAogCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbFAxLCB3UDIsIGxQMywgbFA0LCBsUDUpOwogCWR3UmV0ID0gQ2FsbGJhY2tzLT5DYWxsRHJ2UmVhbGl6ZVByb2MocExQRC0+Zm5bRlVOQ19SRUFMSVpFT0JKRUNUXSwgCkBAIC01MTYsNyArNTE1LDcgQEAKIAkgICAgU0VHUFRSX0ZSRUUobHBCdWYpOwogCiAgICAgfQotICAgIGRwcmludGZfd2luMTZkcnYoc3RkZGViLCAiUFJURFJWX1JlYWxpemVPYmplY3Q6IHJldHVybiAleFxuIiwgZHdSZXQpOworICAgIGRwcmludGZfaW5mbyh3aW4xNmRydiwgIlBSVERSVl9SZWFsaXplT2JqZWN0OiByZXR1cm4gJXhcbiIsIGR3UmV0KTsKICAgICByZXR1cm4gZHdSZXQ7CiB9CiAKQEAgLTUzNyw3ICs1MzYsNyBAQAogICAgIFdPUkQgd1JldCA9IDA7CiAgICAgTE9BREVEX1BSSU5URVJfRFJJVkVSICpwTFBEID0gTlVMTDsKICAgICAKLSAgICBkcHJpbnRmX3dpbjE2ZHJ2KHN0ZGRlYiwgIlBSVERSVl9TdHJldGNoQmx0OlxuIik7CisgICAgZHByaW50Zl9pbmZvKHdpbjE2ZHJ2LCAiUFJURFJWX1N0cmV0Y2hCbHQ6XG4iKTsKICAgICAKICAgICBpZiAoKHBMUEQgPSBGaW5kUHJpbnRlckRyaXZlckZyb21QREVWSUNFKGxwRGVzdERldikpICE9IE5VTEwpCiAgICAgewpAQCAtNTQ3LDcgKzU0Niw3IEBACiAKIAlpZiAocExQRC0+Zm5bRlVOQ19TVFJFVENIQkxUXSA9PSBOVUxMKQogCXsKLQkgICAgZHByaW50Zl93aW4xNmRydihzdGRkZWIsICJQUlREUlZfU3RyZXRjaEJsdDogTm90IHN1cHBvcnRlZCBieSBkcml2ZXJcbiIpOworCSAgICBkcHJpbnRmX3dhcm4od2luMTZkcnYsICJQUlREUlZfU3RyZXRjaEJsdDogTm90IHN1cHBvcnRlZCBieSBkcml2ZXJcbiIpOwogCSAgICByZXR1cm4gMDsKIAl9CiAJbFAxICA9IGxwRGVzdERldjsKQEAgLTU5MSw3ICs1OTAsNyBAQAogICAgIERXT1JEIGR3UmV0ID0gMDsKICAgICBMT0FERURfUFJJTlRFUl9EUklWRVIgKnBMUEQgPSBOVUxMOwogICAgIAotICAgIGRwcmludGZfd2luMTZkcnYoc3RkZGViLCAiUFJURFJWX0V4dFRleHRPdXQ6XG4iKTsKKyAgICBkcHJpbnRmX2luZm8od2luMTZkcnYsICJQUlREUlZfRXh0VGV4dE91dDpcbiIpOwogICAgIAogICAgIGlmICgocExQRCA9IEZpbmRQcmludGVyRHJpdmVyRnJvbVBERVZJQ0UobHBEZXN0RGV2KSkgIT0gTlVMTCkKICAgICB7CkBAIC02MDQsNyArNjAzLDcgQEAKIAogCWlmIChwTFBELT5mbltGVU5DX0VYVFRFWFRPVVRdID09IE5VTEwpCiAJewotCSAgICBkcHJpbnRmX3dpbjE2ZHJ2KHN0ZGRlYiwgIlBSVERSVl9FeHRUZXh0T3V0OiBOb3Qgc3VwcG9ydGVkIGJ5IGRyaXZlclxuIik7CisJICAgIGRwcmludGZfd2Fybih3aW4xNmRydiwgIlBSVERSVl9FeHRUZXh0T3V0OiBOb3Qgc3VwcG9ydGVkIGJ5IGRyaXZlclxuIik7CiAJICAgIHJldHVybiAwOwogCX0KIApAQCAtNjE0LDcgKzYxMyw3IEBACiAJCiAJaWYgKGxwQ2xpcFJlY3QgIT0gTlVMTCkgewogCSAgICBsUDQgPSBTRUdQVFJfTkVXKFJFQ1QxNik7Ci0gICAgICAgICAgICBkcHJpbnRmX3dpbjE2ZHJ2KHN0ZGRlYiwgIkFkZGluZyBscENsaXBSZWN0XG4iKTsKKyAgICAgICAgICAgIGRwcmludGZfaW5mbyh3aW4xNmRydiwgIkFkZGluZyBscENsaXBSZWN0XG4iKTsKIAkgICAgbWVtY3B5KGxQNCxscENsaXBSZWN0LHNpemVvZihSRUNUMTYpKTsKIAl9IGVsc2UKIAkgIGxQNCA9IDBMOwpAQCAtNjI0LDcgKzYyMyw3IEBACiAJICAgIGlmIChuU2l6ZT5hYnMod0NvdW50KSkKIAkgICAgCW5TaXplID0gYWJzKHdDb3VudCk7CiAJICAgIGxQNSA9IFNFR1BUUl9BTExPQyhuU2l6ZSsxKTsKLSAgICAgICAgICAgIGRwcmludGZfd2luMTZkcnYoc3RkZGViLCAiQWRkaW5nIGxwU3RyaW5nIChuU2l6ZSBpcyAlZClcbiIsblNpemUpOworICAgICAgICAgICAgZHByaW50Zl9pbmZvKHdpbjE2ZHJ2LCAiQWRkaW5nIGxwU3RyaW5nIChuU2l6ZSBpcyAlZClcbiIsblNpemUpOwogCSAgICBtZW1jcHkobFA1LGxwU3RyaW5nLG5TaXplKTsKIAkgICAgKigoY2hhciAqKWxQNSArIG5TaXplKSA9ICdcMCc7CiAJfSBlbHNlCkBAIC02MzgsMTggKzYzNywxOCBAQAogICAgICAgICBsUDkgPSBscFRleHRYRm9ybTsKIAkKIAlpZiAobHBDaGFyV2lkdGhzICE9IE5VTEwpIAotCSAgZHByaW50Zl93aW4xNmRydihzdGRkZWIsICJQUlREUlZfRXh0VGV4dE91dDogQ2hhciB3aWR0aHMgbm90IHN1cHBvcnRlZFxuIik7CisJICBkcHJpbnRmX2ZpeG1lKHdpbjE2ZHJ2LCAiUFJURFJWX0V4dFRleHRPdXQ6IENoYXIgd2lkdGhzIG5vdCBzdXBwb3J0ZWRcbiIpOwogCWxQMTAgPSAwOwogCQogCWlmIChscE9wYXF1ZVJlY3QgIT0gTlVMTCkgewogCSAgICBsUDExID0gU0VHUFRSX05FVyhSRUNUMTYpOwotICAgICAgICAgICAgZHByaW50Zl93aW4xNmRydihzdGRkZWIsICJBZGRpbmcgbHBPcGFxdWVSZWN0XG4iKTsKKyAgICAgICAgICAgIGRwcmludGZfaW5mbyh3aW4xNmRydiwgIkFkZGluZyBscE9wYXF1ZVJlY3RcbiIpOwogCSAgICBtZW1jcHkobFAxMSxscE9wYXF1ZVJlY3Qsc2l6ZW9mKFJFQ1QxNikpOwkKIAl9IGVsc2UKIAkgIGxQMTEgPSAwTDsKIAkKIAl3UDEyID0gd09wdGlvbnM7Ci0JZHByaW50Zl93aW4xNmRydihzdGRkZWIsICJDYWxsaW5nIEV4dFRleHRPdXQgMHglbHggMHgleCAweCV4ICVwXG4lKnMgMHgleCAweCVseCAweCVseFxuIgorCWRwcmludGZfaW5mbyh3aW4xNmRydiwgIkNhbGxpbmcgRXh0VGV4dE91dCAweCVseCAweCV4IDB4JXggJXBcbiUqcyAweCV4IDB4JWx4IDB4JWx4XG4iCiAgICAgICAgICAgICAgICAiMHglbHggMHglbHggJXAgMHgleFxuIixsUDEsIHdQMiwgd1AzLCBsUDQsIAogCQkJCQkgICBuU2l6ZSxsUDUsIGlQNiwgbFA3LCBsUDgsIGxQOSwgbFAxMCwKIAkJCQkJICAgbFAxMSwgd1AxMik7CkBAIC02NjAsNyArNjU5LDcgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsUDgsIGxQOSwgbFAxMCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTRUdQVFJfR0VUKGxQMTEpLCB3UDEyKTsKICAgICB9Ci0gICAgZHByaW50Zl93aW4xNmRydihzdGRkZWIsICJQUlREUlZfRXh0VGV4dE91dDogcmV0dXJuICVseFxuIiwgZHdSZXQpOworICAgIGRwcmludGZfaW5mbyh3aW4xNmRydiwgIlBSVERSVl9FeHRUZXh0T3V0OiByZXR1cm4gJWx4XG4iLCBkd1JldCk7CiAgICAgcmV0dXJuIGR3UmV0OwogfQogCkBAIC03NTcsNyArNzU2LDcgQEAKICAgICBXT1JEIHdSZXQgPSAwOwogICAgIExPQURFRF9QUklOVEVSX0RSSVZFUiAqcExQRCA9IE5VTEw7CiAgICAgCi0gICAgZHByaW50Zl93aW4xNmRydihzdGRkZWIsICJQUlREUlZfR2V0Q2hhcldpZHRoOlxuIik7CisgICAgZHByaW50Zl9pbmZvKHdpbjE2ZHJ2LCAiUFJURFJWX0dldENoYXJXaWR0aDpcbiIpOwogICAgIAogICAgIGlmICgocExQRCA9IEZpbmRQcmludGVyRHJpdmVyRnJvbVBERVZJQ0UobHBEZXN0RGV2KSkgIT0gTlVMTCkKICAgICB7CkBAIC03NjcsNyArNzY2LDcgQEAKIAkKIAlpZiAocExQRC0+Zm5bRlVOQ19HRVRDSEFSV0lEVEhdID09IE5VTEwpCiAJewotCSAgICBkcHJpbnRmX3dpbjE2ZHJ2KHN0ZGRlYiwKKwkgICAgZHByaW50Zl93YXJuKHdpbjE2ZHJ2LAogCQkiUFJURFJWX0dldENoYXJXaWR0aDogTm90IHN1cHBvcnRlZCBieSBkcml2ZXJcbiIpOwogCSAgICByZXR1cm4gMDsKIAl9CmRpZmYgLS1naXQgYS9ncmFwaGljcy93aW4xNmRydi90ZXh0LmMgYi9ncmFwaGljcy93aW4xNmRydi90ZXh0LmMKaW5kZXggNThkNzcxZC4uMmJiZDJhYSAxMDA2NDQKLS0tIGEvZ3JhcGhpY3Mvd2luMTZkcnYvdGV4dC5jCisrKyBiL2dyYXBoaWNzL3dpbjE2ZHJ2L3RleHQuYwpAQCAtMTAsNyArMTAsNiBAQAogI2luY2x1ZGUgIndpbjE2ZHJ2LmgiCiAjaW5jbHVkZSAiZGMuaCIKICNpbmNsdWRlICJnZGkuaCIKLSNpbmNsdWRlICJzdGRkZWJ1Zy5oIgogI2luY2x1ZGUgImRlYnVnLmgiCiAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgpAQCAtMzIsNyArMzEsNyBAQAogICAgIGlmIChjb3VudCA9PSAwKQogICAgICAgcmV0dXJuIEZBTFNFOwogCi0gICAgZHByaW50Zl93aW4xNmRydihzdGRkZWIsICJXSU4xNkRSVl9FeHRUZXh0T3V0OiAlMDR4ICVkICVkICV4ICVwICUqcyAlcFxuIiwKKyAgICBkcHJpbnRmX2luZm8od2luMTZkcnYsICJXSU4xNkRSVl9FeHRUZXh0T3V0OiAlMDR4ICVkICVkICV4ICVwICUqcyAlcFxuIiwKIAkgICBkYy0+aFNlbGYsIHgsIHksIGZsYWdzLCAgbHByZWN0LCBjb3VudCA+IDAgPyBjb3VudCA6IDgsIHN0ciwgbHBEeCk7CiAKIApAQCAtNTUsNyArNTQsNyBAQAogICAgICAgICAgICAgCiAgICAgICAgIH0KICAgICAgICAgCi0JZHByaW50Zl93aW4xNmRydihzdGRkZWIsICJ0ZXh0YWxpZ24gPSAlZFxuIiwgZGMtPncudGV4dEFsaWduKTsKKwlkcHJpbnRmX2luZm8od2luMTZkcnYsICJ0ZXh0YWxpZ24gPSAlZFxuIiwgZGMtPncudGV4dEFsaWduKTsKIAogCWlmIChkYy0+dy50ZXh0QWxpZ24gJiBUQV9VUERBVEVDUCkKIAl7CmRpZmYgLS1naXQgYS9ncmFwaGljcy93aW5nLmMgYi9ncmFwaGljcy93aW5nLmMKaW5kZXggYmUzYzkwMS4uZjE2NzYzMyAxMDA2NDQKLS0tIGEvZ3JhcGhpY3Mvd2luZy5jCisrKyBiL2dyYXBoaWNzL3dpbmcuYwpAQCAtMTcsNyArMTcsNiBAQAogI2luY2x1ZGUgImRjLmgiCiAjaW5jbHVkZSAiZ2RpLmgiCiAjaW5jbHVkZSAieG1hbGxvYy5oIgotI2luY2x1ZGUgInN0ZGRlYnVnLmgiCiAjaW5jbHVkZSAiZGVidWcuaCIKIAogZXh0ZXJuIHZvaWQgQ0xJUFBJTkdfVXBkYXRlR0NSZWdpb24oREMqICk7CmRpZmYgLS1naXQgYS9ncmFwaGljcy94MTFkcnYvYml0Ymx0LmMgYi9ncmFwaGljcy94MTFkcnYvYml0Ymx0LmMKaW5kZXggMTAwZDYzZS4uZDcxY2VmYiAxMDA2NDQKLS0tIGEvZ3JhcGhpY3MveDExZHJ2L2JpdGJsdC5jCisrKyBiL2dyYXBoaWNzL3gxMWRydi9iaXRibHQuYwpAQCAtMTYsNyArMTYsNiBAQAogI2luY2x1ZGUgIm1ldGFmaWxlLmgiCiAjaW5jbHVkZSAib3B0aW9ucy5oIgogI2luY2x1ZGUgIngxMWRydi5oIgotI2luY2x1ZGUgInN0ZGRlYnVnLmgiCiAjaW5jbHVkZSAiZGVidWcuaCIKICNpbmNsdWRlICJ4bWFsbG9jLmgiCiAKQEAgLTExMjAsMTIgKzExMTksMTIgQEAKICAgICB3aWR0aERzdCAgPSB3aWR0aERzdCAqIGRjRHN0LT52cG9ydEV4dFggLyBkY0RzdC0+d25kRXh0WDsKICAgICBoZWlnaHREc3QgPSBoZWlnaHREc3QgKiBkY0RzdC0+dnBvcnRFeHRZIC8gZGNEc3QtPnduZEV4dFk7CiAKLSAgICBkcHJpbnRmX2JpdGJsdCggc3RkZGViLCAiICAgIHZwb3J0ZHN0PSVkLCVkLSVkLCVkIHduZGRzdD0lZCwlZC0lZCwlZFxuIiwKKyAgICBkcHJpbnRmX2luZm8oYml0Ymx0LCAiICAgIHZwb3J0ZHN0PSVkLCVkLSVkLCVkIHduZGRzdD0lZCwlZC0lZCwlZFxuIiwKICAgICAgICAgICAgICAgICAgICAgZGNEc3QtPnZwb3J0T3JnWCwgZGNEc3QtPnZwb3J0T3JnWSwKICAgICAgICAgICAgICAgICAgICAgZGNEc3QtPnZwb3J0RXh0WCwgZGNEc3QtPnZwb3J0RXh0WSwKICAgICAgICAgICAgICAgICAgICAgZGNEc3QtPnduZE9yZ1gsIGRjRHN0LT53bmRPcmdZLAogICAgICAgICAgICAgICAgICAgICBkY0RzdC0+d25kRXh0WCwgZGNEc3QtPnduZEV4dFkgKTsKLSAgICBkcHJpbnRmX2JpdGJsdCggc3RkZGViLCAiICAgIHJlY3Rkc3Q9JWQsJWQtJWQsJWQgb3JnZHN0PSVkLCVkXG4iLAorICAgIGRwcmludGZfaW5mbyhiaXRibHQsICIgICAgcmVjdGRzdD0lZCwlZC0lZCwlZCBvcmdkc3Q9JWQsJWRcbiIsCiAgICAgICAgICAgICAgICAgICAgIHhEc3QsIHlEc3QsIHdpZHRoRHN0LCBoZWlnaHREc3QsCiAgICAgICAgICAgICAgICAgICAgIGRjRHN0LT53LkRDT3JnWCwgZGNEc3QtPncuRENPcmdZICk7CiAKQEAgLTExMzYsMTkgKzExMzUsMTkgQEAKICAgICAgICAgd2lkdGhTcmMgID0gd2lkdGhTcmMgKiBkY1NyYy0+dnBvcnRFeHRYIC8gZGNTcmMtPnduZEV4dFg7CiAgICAgICAgIGhlaWdodFNyYyA9IGhlaWdodFNyYyAqIGRjU3JjLT52cG9ydEV4dFkgLyBkY1NyYy0+d25kRXh0WTsKICAgICAgICAgZlN0cmV0Y2ggID0gKHdpZHRoU3JjICE9IHdpZHRoRHN0KSB8fCAoaGVpZ2h0U3JjICE9IGhlaWdodERzdCk7Ci0gICAgICAgIGRwcmludGZfYml0Ymx0KCBzdGRkZWIsIiAgICB2cG9ydHNyYz0lZCwlZC0lZCwlZCB3bmRzcmM9JWQsJWQtJWQsJWRcbiIsCisgICAgICAgIGRwcmludGZfaW5mbyhiaXRibHQsIiAgICB2cG9ydHNyYz0lZCwlZC0lZCwlZCB3bmRzcmM9JWQsJWQtJWQsJWRcbiIsCiAgICAgICAgICAgICAgICAgICAgICAgICBkY1NyYy0+dnBvcnRPcmdYLCBkY1NyYy0+dnBvcnRPcmdZLAogICAgICAgICAgICAgICAgICAgICAgICAgZGNTcmMtPnZwb3J0RXh0WCwgZGNTcmMtPnZwb3J0RXh0WSwKICAgICAgICAgICAgICAgICAgICAgICAgIGRjU3JjLT53bmRPcmdYLCBkY1NyYy0+d25kT3JnWSwKICAgICAgICAgICAgICAgICAgICAgICAgIGRjU3JjLT53bmRFeHRYLCBkY1NyYy0+d25kRXh0WSApOwotICAgICAgICBkcHJpbnRmX2JpdGJsdCggc3RkZGViLCAiICAgIHJlY3RzcmM9JWQsJWQtJWQsJWQgb3Jnc3JjPSVkLCVkXG4iLAorICAgICAgICBkcHJpbnRmX2luZm8oYml0Ymx0LCAiICAgIHJlY3RzcmM9JWQsJWQtJWQsJWQgb3Jnc3JjPSVkLCVkXG4iLAogICAgICAgICAgICAgICAgICAgICAgICAgeFNyYywgeVNyYywgd2lkdGhTcmMsIGhlaWdodFNyYywKICAgICAgICAgICAgICAgICAgICAgICAgIGRjU3JjLT53LkRDT3JnWCwgZGNTcmMtPncuRENPcmdZICk7CiAgICAgICAgIGlmICghQklUQkxUX0dldFZpc1JlY3RhbmdsZXMoIGRjRHN0LCB4RHN0LCB5RHN0LCB3aWR0aERzdCwgaGVpZ2h0RHN0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkY1NyYywgeFNyYywgeVNyYywgd2lkdGhTcmMsIGhlaWdodFNyYywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnZpc1JlY3RTcmMsICZ2aXNSZWN0RHN0ICkpCiAgICAgICAgICAgICByZXR1cm4gVFJVRTsKLSAgICAgICAgZHByaW50Zl9iaXRibHQoIHN0ZGRlYiwgIiAgICB2aXNzcmM9JWQsJWQtJWQsJWQgdmlzZHN0PSVkLCVkLSVkLCVkXG4iLAorICAgICAgICBkcHJpbnRmX2luZm8oYml0Ymx0LCAiICAgIHZpc3NyYz0lZCwlZC0lZCwlZCB2aXNkc3Q9JWQsJWQtJWQsJWRcbiIsCiAgICAgICAgICAgICAgICAgICAgICAgICB2aXNSZWN0U3JjLmxlZnQsIHZpc1JlY3RTcmMudG9wLAogICAgICAgICAgICAgICAgICAgICAgICAgdmlzUmVjdFNyYy5yaWdodCwgdmlzUmVjdFNyYy5ib3R0b20sCiAgICAgICAgICAgICAgICAgICAgICAgICB2aXNSZWN0RHN0LmxlZnQsIHZpc1JlY3REc3QudG9wLApAQCAtMTE2MCw3ICsxMTU5LDcgQEAKICAgICAgICAgaWYgKCFCSVRCTFRfR2V0VmlzUmVjdGFuZ2xlcyggZGNEc3QsIHhEc3QsIHlEc3QsIHdpZHRoRHN0LCBoZWlnaHREc3QsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5VTEwsIDAsIDAsIDAsIDAsIE5VTEwsICZ2aXNSZWN0RHN0ICkpCiAgICAgICAgICAgICByZXR1cm4gVFJVRTsKLSAgICAgICAgZHByaW50Zl9iaXRibHQoIHN0ZGRlYiwgIiAgICB2aXNzcmM9bm9uZSB2aXNkc3Q9JWQsJWQtJWQsJWRcbiIsCisgICAgICAgIGRwcmludGZfaW5mbyhiaXRibHQsICIgICAgdmlzc3JjPW5vbmUgdmlzZHN0PSVkLCVkLSVkLCVkXG4iLAogICAgICAgICAgICAgICAgICAgICAgICAgdmlzUmVjdERzdC5sZWZ0LCB2aXNSZWN0RHN0LnRvcCwKICAgICAgICAgICAgICAgICAgICAgICAgIHZpc1JlY3REc3QucmlnaHQsIHZpc1JlY3REc3QuYm90dG9tICk7CiAgICAgfQpkaWZmIC0tZ2l0IGEvZ3JhcGhpY3MveDExZHJ2L2JpdG1hcC5jIGIvZ3JhcGhpY3MveDExZHJ2L2JpdG1hcC5jCmluZGV4IDFjM2NiOGIuLjk2MGMzYzcgMTAwNjQ0Ci0tLSBhL2dyYXBoaWNzL3gxMWRydi9iaXRtYXAuYworKysgYi9ncmFwaGljcy94MTFkcnYvYml0bWFwLmMKQEAgLTEzLDcgKzEzLDYgQEAKICNpbmNsdWRlICJkYy5oIgogI2luY2x1ZGUgImJpdG1hcC5oIgogI2luY2x1ZGUgImhlYXAuaCIKLSNpbmNsdWRlICJzdGRkZWJ1Zy5oIgogI2luY2x1ZGUgImRlYnVnLmgiCiAKIGV4dGVybiB2b2lkIENMSVBQSU5HX1VwZGF0ZUdDUmVnaW9uKERDKiApOwpkaWZmIC0tZ2l0IGEvZ3JhcGhpY3MveDExZHJ2L2JydXNoLmMgYi9ncmFwaGljcy94MTFkcnYvYnJ1c2guYwppbmRleCA1YzJmYWUxLi45MGZmNjBhIDEwMDY0NAotLS0gYS9ncmFwaGljcy94MTFkcnYvYnJ1c2guYworKysgYi9ncmFwaGljcy94MTFkcnYvYnJ1c2guYwpAQCAtOSw3ICs5LDYgQEAKICNpbmNsdWRlICJiaXRtYXAuaCIKICNpbmNsdWRlICJjb2xvci5oIgogI2luY2x1ZGUgIngxMWRydi5oIgotI2luY2x1ZGUgInN0ZGRlYnVnLmgiCiAjaW5jbHVkZSAiZGVidWcuaCIKIAogc3RhdGljIGNvbnN0IGNoYXIgSGF0Y2hCcnVzaGVzW05CX0hBVENIX1NUWUxFUyArIDFdWzhdID0KQEAgLTIwOSw3ICsyMDgsNyBAQAogICAgIEJJVE1BUElORk8gKiBibXBJbmZvOwogICAgIEhCUlVTSDE2IHByZXZIYW5kbGUgPSBkYy0+dy5oQnJ1c2g7CiAKLSAgICBkcHJpbnRmX2dkaShzdGRkZWIsICJCcnVzaF9TZWxlY3RPYmplY3Q6IGhkYz0lMDR4IGhicnVzaD0lMDR4XG4iLAorICAgIGRwcmludGZfaW5mbyhnZGksICJCcnVzaF9TZWxlY3RPYmplY3Q6IGhkYz0lMDR4IGhicnVzaD0lMDR4XG4iLAogICAgICAgICAgICAgICAgIGRjLT5oU2VsZixoYnJ1c2gpOwogI2lmZGVmIE5PVERFRgogICAgIGlmIChkYy0+aGVhZGVyLndNYWdpYyA9PSBNRVRBRklMRV9EQ19NQUdJQykKQEAgLTI0NCwxNiArMjQzLDE2IEBACiAgICAgc3dpdGNoKGJydXNoLT5sb2dicnVzaC5sYlN0eWxlKQogICAgIHsKICAgICAgIGNhc2UgQlNfTlVMTDoKLQlkcHJpbnRmX2dkaSggc3RkZGViLCJCU19OVUxMXG4iICk7CisJZHByaW50Zl9pbmZvKGdkaSwiQlNfTlVMTFxuIiApOwogCWJyZWFrOwogCiAgICAgICBjYXNlIEJTX1NPTElEOgotICAgICAgICBkcHJpbnRmX2dkaSggc3RkZGViLCJCU19TT0xJRFxuIiApOworICAgICAgICBkcHJpbnRmX2luZm8oZ2RpLCJCU19TT0xJRFxuIiApOwogCUJSVVNIX1NlbGVjdFNvbGlkQnJ1c2goIGRjLCBicnVzaC0+bG9nYnJ1c2gubGJDb2xvciApOwogCWJyZWFrOwogCQogICAgICAgY2FzZSBCU19IQVRDSEVEOgotCWRwcmludGZfZ2RpKCBzdGRkZWIsICJCU19IQVRDSEVEXG4iICk7CisJZHByaW50Zl9pbmZvKGdkaSwgIkJTX0hBVENIRURcbiIgKTsKIAlkYy0+dS54LmJydXNoLnBpeGVsID0gQ09MT1JfVG9QaHlzaWNhbCggZGMsIGJydXNoLT5sb2dicnVzaC5sYkNvbG9yICk7CiAJZGMtPnUueC5icnVzaC5waXhtYXAgPSBUU1hDcmVhdGVCaXRtYXBGcm9tRGF0YSggZGlzcGxheSwgcm9vdFdpbmRvdywKIAkJCQkgSGF0Y2hCcnVzaGVzW2JydXNoLT5sb2dicnVzaC5sYkhhdGNoXSwgOCwgOCApOwpAQCAtMjYxLDEyICsyNjAsMTIgQEAKIAlicmVhazsKIAkKICAgICAgIGNhc2UgQlNfUEFUVEVSTjoKLQlkcHJpbnRmX2dkaSggc3RkZGViLCAiQlNfUEFUVEVSTlxuIik7CisJZHByaW50Zl9pbmZvKGdkaSwgIkJTX1BBVFRFUk5cbiIpOwogCUJSVVNIX1NlbGVjdFBhdHRlcm5CcnVzaCggZGMsIChIQlJVU0gxNilicnVzaC0+bG9nYnJ1c2gubGJIYXRjaCApOwogCWJyZWFrOwogCiAgICAgICBjYXNlIEJTX0RJQlBBVFRFUk46Ci0JZHByaW50Zl9nZGkoIHN0ZGRlYiwgIkJTX0RJQlBBVFRFUk5cbiIpOworCWRwcmludGZfaW5mbyhnZGksICJCU19ESUJQQVRURVJOXG4iKTsKIAlpZiAoKGJtcEluZm8gPSAoQklUTUFQSU5GTyAqKSBHbG9iYWxMb2NrMTYoIChIR0xPQkFMMTYpYnJ1c2gtPmxvZ2JydXNoLmxiSGF0Y2ggKSkpCiAJewogCSAgICBpbnQgc2l6ZSA9IERJQl9CaXRtYXBJbmZvU2l6ZSggYm1wSW5mbywgYnJ1c2gtPmxvZ2JydXNoLmxiQ29sb3IgKTsKZGlmZiAtLWdpdCBhL2dyYXBoaWNzL3gxMWRydi9jbGlwcGluZy5jIGIvZ3JhcGhpY3MveDExZHJ2L2NsaXBwaW5nLmMKaW5kZXggYTc3OGMxZS4uOGU4N2NlNSAxMDA2NDQKLS0tIGEvZ3JhcGhpY3MveDExZHJ2L2NsaXBwaW5nLmMKKysrIGIvZ3JhcGhpY3MveDExZHJ2L2NsaXBwaW5nLmMKQEAgLTgsNyArOCw2IEBACiAjaW5jbHVkZSAiZGMuaCIKICNpbmNsdWRlICJ4MTFkcnYuaCIKICNpbmNsdWRlICJyZWdpb24uaCIKLSNpbmNsdWRlICJzdGRkZWJ1Zy5oIgogI2luY2x1ZGUgImRlYnVnLmgiCiAjaW5jbHVkZSAiaGVhcC5oIgogCmRpZmYgLS1naXQgYS9ncmFwaGljcy94MTFkcnYvZ3JhcGhpY3MuYyBiL2dyYXBoaWNzL3gxMWRydi9ncmFwaGljcy5jCmluZGV4IGRhMTRkNDguLjA5MTgyOWUgMTAwNjQ0Ci0tLSBhL2dyYXBoaWNzL3gxMWRydi9ncmFwaGljcy5jCisrKyBiL2dyYXBoaWNzL3gxMWRydi9ncmFwaGljcy5jCkBAIC0yNSw3ICsyNSw2IEBACiAjaW5jbHVkZSAiYml0bWFwLmgiCiAjaW5jbHVkZSAiY2FsbGJhY2suaCIKICNpbmNsdWRlICJtZXRhZmlsZS5oIgotI2luY2x1ZGUgInN0ZGRlYnVnLmgiCiAjaW5jbHVkZSAicGFsZXR0ZS5oIgogI2luY2x1ZGUgImNvbG9yLmgiCiAjaW5jbHVkZSAicmVnaW9uLmgiCkBAIC0yNzEsNyArMjcwLDcgQEAKIFgxMURSVl9Sb3VuZFJlY3QoIERDICpkYywgSU5UMzIgbGVmdCwgSU5UMzIgdG9wLCBJTlQzMiByaWdodCwKICAgICAgICAgICAgICAgICAgIElOVDMyIGJvdHRvbSwgSU5UMzIgZWxsX3dpZHRoLCBJTlQzMiBlbGxfaGVpZ2h0ICkKIHsKLSAgICBkcHJpbnRmX2dyYXBoaWNzKHN0ZGRlYiwgIlgxMURSVl9Sb3VuZFJlY3QoJWQgJWQgJWQgJWQgICVkICVkXG4iLCAKKyAgICBkcHJpbnRmX2luZm8oZ3JhcGhpY3MsICJYMTFEUlZfUm91bmRSZWN0KCVkICVkICVkICVkICAlZCAlZFxuIiwgCiAgICAgCWxlZnQsIHRvcCwgcmlnaHQsIGJvdHRvbSwgZWxsX3dpZHRoLCBlbGxfaGVpZ2h0KTsKIAogICAgIGxlZnQgICA9IFhMUFRPRFAoIGRjLCBsZWZ0ICk7CkBAIC02OTUsNyArNjk0LDcgQEAKICAgICBCT09MMzIgcmVzdWx0OwogICAgIHN0cnVjdCBGbG9vZEZpbGxfcGFyYW1zIHBhcmFtcyA9IHsgZGMsIHgsIHksIGNvbG9yLCBmaWxsVHlwZSB9OwogCi0gICAgZHByaW50Zl9ncmFwaGljcyggc3RkZGViLCAiWDExRFJWX0V4dEZsb29kRmlsbCAlZCwlZCAlMDZseCAlZFxuIiwKKyAgICBkcHJpbnRmX2luZm8oZ3JhcGhpY3MsICJYMTFEUlZfRXh0Rmxvb2RGaWxsICVkLCVkICUwNmx4ICVkXG4iLAogICAgICAgICAgICAgICAgICAgICAgIHgsIHksIGNvbG9yLCBmaWxsVHlwZSApOwogCiAgICAgaWYgKCFQdFZpc2libGUzMiggZGMtPmhTZWxmLCB4LCB5ICkpIHJldHVybiBGQUxTRTsKZGlmZiAtLWdpdCBhL2dyYXBoaWNzL3gxMWRydi9vYmplY3RzLmMgYi9ncmFwaGljcy94MTFkcnYvb2JqZWN0cy5jCmluZGV4IGM2NjViMDcuLjFhOGZhN2UgMTAwNjQ0Ci0tLSBhL2dyYXBoaWNzL3gxMWRydi9vYmplY3RzLmMKKysrIGIvZ3JhcGhpY3MveDExZHJ2L29iamVjdHMuYwpAQCAtMTAsNyArMTAsNiBAQAogI2luY2x1ZGUgImJydXNoLmgiCiAjaW5jbHVkZSAiZm9udC5oIgogI2luY2x1ZGUgInBlbi5oIgotI2luY2x1ZGUgInN0ZGRlYnVnLmgiCiAjaW5jbHVkZSAiZGVidWcuaCIKIAogCkBAIC0zMiw3ICszMSw3IEBACiAgICAgSEdESU9CSjMyIHJldCA9IDA7CiAKICAgICBpZiAoIXB0cikgcmV0dXJuIDA7Ci0gICAgZHByaW50Zl9nZGkoc3RkZGViLCAiU2VsZWN0T2JqZWN0OiBoZGM9JTA0eCAlMDR4XG4iLCBkYy0+aFNlbGYsIGhhbmRsZSApOworICAgIGRwcmludGZfaW5mbyhnZGksICJTZWxlY3RPYmplY3Q6IGhkYz0lMDR4ICUwNHhcbiIsIGRjLT5oU2VsZiwgaGFuZGxlICk7CiAgICAgCiAgICAgc3dpdGNoKHB0ci0+d01hZ2ljKQogICAgIHsKZGlmZiAtLWdpdCBhL2dyYXBoaWNzL3gxMWRydi9wZW4uYyBiL2dyYXBoaWNzL3gxMWRydi9wZW4uYwppbmRleCAzYTQyNGNmLi5hOTE4Yzg1IDEwMDY0NAotLS0gYS9ncmFwaGljcy94MTFkcnYvcGVuLmMKKysrIGIvZ3JhcGhpY3MveDExZHJ2L3Blbi5jCkBAIC02LDcgKzYsNiBAQAogCiAjaW5jbHVkZSAicGVuLmgiCiAjaW5jbHVkZSAiY29sb3IuaCIKLSNpbmNsdWRlICJzdGRkZWJ1Zy5oIgogI2luY2x1ZGUgImRlYnVnLmgiCiAKIHN0YXRpYyBjb25zdCBjaGFyIFBFTl9kYXNoW10gICAgICAgPSB7IDUsMyB9OyAgICAgIC8qIC0tLS0tICAgLS0tLS0gICAtLS0tLSAgKi8KZGlmZiAtLWdpdCBhL2dyYXBoaWNzL3gxMWRydi90ZXh0LmMgYi9ncmFwaGljcy94MTFkcnYvdGV4dC5jCmluZGV4IGNkNzY5NzQuLmEyMDY4NjAgMTAwNjQ0Ci0tLSBhL2dyYXBoaWNzL3gxMWRydi90ZXh0LmMKKysrIGIvZ3JhcGhpY3MveDExZHJ2L3RleHQuYwpAQCAtMTMsOCArMTMsNiBAQAogLyojaW5jbHVkZSAiY2FsbGJhY2suaCIqLwogI2luY2x1ZGUgImhlYXAuaCIKICNpbmNsdWRlICJ4MTFmb250LmgiCi0jaW5jbHVkZSAic3RkZGVidWcuaCIKLS8qICNkZWZpbmUgREVCVUdfVEVYVCAqLwogI2luY2x1ZGUgImRlYnVnLmgiCiAKICNkZWZpbmUgU1dBUF9JTlQoYSxiKSAgeyBpbnQgdCA9IGE7IGEgPSBiOyBiID0gdDsgfQpAQCAtNDUsMTAgKzQzLDEwIEBACiAgICAgbGZVbmRlcmxpbmUgPSAocGZvLT5mb19mbGFncyAmIEZPX1NZTlRIX1VOREVSTElORSkgPyAxIDogMDsKICAgICBsZlN0cmlrZU91dCA9IChwZm8tPmZvX2ZsYWdzICYgRk9fU1lOVEhfU1RSSUtFT1VUKSA/IDEgOiAwOwogCi0gICAgZHByaW50Zl90ZXh0KHN0ZGRlYiwiRXh0VGV4dE91dDogaGRjPSUwNHggZGY9JTA0eCAlZCwlZCAnJS4qcycsICVkICBmbGFncz0lZFxuIiwKKyAgICBkcHJpbnRmX2luZm8odGV4dCwiRXh0VGV4dE91dDogaGRjPSUwNHggZGY9JTA0eCAlZCwlZCAnJS4qcycsICVkICBmbGFncz0lZFxuIiwKICAgICAgICAgICAgICAgICAgZGMtPmhTZWxmLCAoVUlOVDE2KShkYy0+dS54LmZvbnQpLCB4LCB5LCAoaW50KWNvdW50LCBzdHIsIGNvdW50LCBmbGFncyk7CiAKLSAgICBpZiAobHByZWN0ICE9IE5VTEwpIGRwcmludGZfdGV4dChzdGRkZWIsICJcdHJlY3Q9KCVkLCVkLSAlZCwlZClcbiIsCisgICAgaWYgKGxwcmVjdCAhPSBOVUxMKSBkcHJpbnRmX2luZm8odGV4dCwgIlx0cmVjdD0oJWQsJWQtICVkLCVkKVxuIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBscHJlY3QtPmxlZnQsIGxwcmVjdC0+dG9wLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxwcmVjdC0+cmlnaHQsIGxwcmVjdC0+Ym90dG9tICk7CiAgICAgICAvKiBTZXR1cCBjb29yZGluYXRlcyAqLwpAQCAtODcsNyArODUsNyBAQAogICAgIHggPSBYTFBUT0RQKCBkYywgeCApOwogICAgIHkgPSBZTFBUT0RQKCBkYywgeSApOwogCi0gICAgZHByaW50Zl90ZXh0KHN0ZGRlYiwiXHRyZWFsIGNvb3JkOiB4PSVpLCB5PSVpLCByZWN0PSglZCwlZC0lZCwlZClcbiIsCisgICAgZHByaW50Zl9pbmZvKHRleHQsIlx0cmVhbCBjb29yZDogeD0laSwgeT0laSwgcmVjdD0oJWQsJWQtJWQsJWQpXG4iLAogCQkJICB4LCB5LCByZWN0LmxlZnQsIHJlY3QudG9wLCByZWN0LnJpZ2h0LCByZWN0LmJvdHRvbSk7CiAKICAgICAgIC8qIERyYXcgdGhlIHJlY3RhbmdsZSAqLwpkaWZmIC0tZ2l0IGEvZ3JhcGhpY3MveDExZHJ2L3hmb250LmMgYi9ncmFwaGljcy94MTFkcnYveGZvbnQuYwppbmRleCAxYTk5YjdkLi43NTZiZmMyIDEwMDY0NAotLS0gYS9ncmFwaGljcy94MTFkcnYveGZvbnQuYworKysgYi9ncmFwaGljcy94MTFkcnYveGZvbnQuYwpAQCAtMjIsNyArMjIsNiBAQAogI2luY2x1ZGUgIm9wdGlvbnMuaCIKICNpbmNsdWRlICJ4MTFmb250LmgiCiAjaW5jbHVkZSAiZm9udC5oIgotI2luY2x1ZGUgInN0ZGRlYnVnLmgiCiAjaW5jbHVkZSAiZGVidWcuaCIKIAogI2RlZmluZSBERUJVR19GT05UX0lOSVQJCTEKQEAgLTUyNCw3ICs1MjMsNyBAQAogCSAgICBzcHJpbnRmKCBscGNoLCAiJWktKi0qLSotKi0qLSVzKiIsIGZvLT5maS0+bGZkX2hlaWdodCwgbHBFbmNvZGluZyApOwogICAgfQogCi0gICBkcHJpbnRmX2ZvbnQoc3RkZGViLCJcdExGRDogJXNcbiIsIGxwTEZEICk7CisgICBkcHJpbnRmX2luZm8oZm9udCwiXHRMRkQ6ICVzXG4iLCBscExGRCApOwogICAgcmV0dXJuIFRSVUU7CiB9CiAKQEAgLTgyNiw3ICs4MjUsNyBAQAogCX0KIAogI2lmZGVmIERFQlVHX0ZPTlRfSU5JVAotCWRwcmludGZfZm9udChzdGRkZWIsInR5cGVmYWNlIFwnJXNcJ1xuIiwgZnItPmxmRmFjZU5hbWUpOworCWRwcmludGZfaW5mbyhmb250LCJ0eXBlZmFjZSBcJyVzXCdcbiIsIGZyLT5sZkZhY2VOYW1lKTsKICNlbmRpZgogCWZyLT5mcl9mbGFncyB8PSBGUl9OQU1FU0VUOwogICAgIH0KQEAgLTg2Nyw3ICs4NjYsNyBAQAogCWlmKCAhbHN0cmNtcGkzMkEoIHBmYS0+ZmFUeXBlRmFjZSwgbHBBbGlhcyApICkKIAl7CiAjaWZkZWYgREVCVUdfRk9OVF9JTklUCi0JICAgIGRwcmludGZfZm9udChzdGRkZWIsIlx0cmVkdW5kYW50IGFsaWFzICclcycgLT4gJyVzJ1xuIiwgbHBBbGlhcywgbHBUeXBlRmFjZSApOworCSAgICBkcHJpbnRmX2luZm8oZm9udCwiXHRyZWR1bmRhbnQgYWxpYXMgJyVzJyAtPiAnJXMnXG4iLCBscEFsaWFzLCBscFR5cGVGYWNlICk7CiAjZW5kaWYKIAkgICAgcmV0dXJuIE5VTEw7CiAJfSAKQEAgLTg4Nyw3ICs4ODYsNyBAQAogICAgICAgICBsc3RyY3B5MzJBKCBwZmEtPmZhQWxpYXMsIGxwQWxpYXMgKTsKIAogI2lmZGVmIERFQlVHX0ZPTlRfSU5JVAotICAgICAgICBkcHJpbnRmX2ZvbnQoc3RkZGViLCAiXHRhZGRlZCBhbGlhcyAnJXMnIGZvciAlc1xuIiwgbHBBbGlhcywgbHBUeXBlRmFjZSApOworICAgICAgICBkcHJpbnRmX2luZm8oZm9udCwgIlx0YWRkZWQgYWxpYXMgJyVzJyBmb3IgJXNcbiIsIGxwQWxpYXMsIGxwVHlwZUZhY2UgKTsKICNlbmRpZgogCXJldHVybiBwZmE7CiAgICAgfQpAQCAtOTg5LDcgKzk4OCw3IEBACiAJCQl9CiAJCQkJCQkKICNpZmRlZiBERUJVR19GT05UX0lOSVQKLSAgICAgICAgICAgICAgICAgICAgICAgIGRwcmludGZfZm9udChzdGRkZWIsICJcdHN1YnN0aXR1dGVkICclcycgd2l0aCAlc1xuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgIGRwcmludGZfaW5mbyhmb250LCAiXHRzdWJzdGl0dXRlZCAnJXMnIHdpdGggJXNcbiIsCiAJCQkJCQlmck1hdGNoLT5sZkZhY2VOYW1lLCBscEFsaWFzICk7CiAjZW5kaWYKIAkJCWxzdHJjcHluMzJBKCBmck1hdGNoLT5sZkZhY2VOYW1lLCBscEFsaWFzLCBMRl9GQUNFU0laRSApOwpAQCAtMTA2Myw3ICsxMDYyLDcgQEAKIAkJICAgIGZvbnRSZXNvdXJjZSogCXBmciA9IGZvbnRMaXN0OwogCQkgICAgZm9udEluZm8qIAkJcGZpID0gTlVMTDsKIAotCQkgICAgZHByaW50Zl9mb250KHN0ZGRlYiwiUmVhZGluZyBjYWNoZWQgZm9udCBtZXRyaWNzOlxuIik7CisJCSAgICBkcHJpbnRmX2luZm8oZm9udCwiUmVhZGluZyBjYWNoZWQgZm9udCBtZXRyaWNzOlxuIik7CiAKIAkJICAgIHJlYWQoIGZkLCBmb250TGlzdCwgaSk7IC8qIHJlYWQgYWxsIG1ldHJpY3MgYXQgb25jZSAqLwogCQkgICAgd2hpbGUoIG9mZnNldCA8IGxlbmd0aCApCkBAIC0xMTAzLDcgKzExMDIsNyBAQAogCQkJb2Zmc2V0ICs9IHNpemVvZihpbnQpOwogCQkJZm9yKCBwZnIgPSBmb250TGlzdDsgcGZyOyBwZnIgPSBwZnItPm5leHQgKQogCQkJewotCQkJICAgIGRwcmludGZfZm9udChzdGRkZWIsIlx0JXMsICVpIGluc3RhbmNlc1xuIiwgbHBjaCwgcGZyLT5jb3VudCApOworCQkJICAgIGRwcmludGZfaW5mbyhmb250LCJcdCVzLCAlaSBpbnN0YW5jZXNcbiIsIGxwY2gsIHBmci0+Y291bnQgKTsKIAkJCSAgICBwZnItPnJlc291cmNlID0gbHBjaDsKIAkJCSAgICB3aGlsZSggVFJVRSApCiAJCQkgICAgeyAKQEAgLTExNTksMTMgKzExNTgsMTMgQEAKICAgICAgICAgaSArPSBuX2ZmICogc2l6ZW9mKGZvbnRSZXNvdXJjZSkgKyBqICogc2l6ZW9mKGZvbnRJbmZvKSArIHNpemVvZihpbnQpOwogCXdyaXRlKCBmZCwgJmksIHNpemVvZihpbnQpICk7CiAKLQlkcHJpbnRmX2ZvbnQoc3RkZGViLCJXcml0aW5nIGZvbnQgY2FjaGU6XG4iKTsKKwlkcHJpbnRmX2luZm8oZm9udCwiV3JpdGluZyBmb250IGNhY2hlOlxuIik7CiAKIAlmb3IoIHBmciA9IGZvbnRMaXN0OyBwZnI7IHBmciA9IHBmci0+bmV4dCApCiAJewogCSAgICBmb250SW5mbyBmaTsKIAotCSAgICBkcHJpbnRmX2ZvbnQoc3RkZGViLCJcdCVzLCAlaSBpbnN0YW5jZXNcbiIsIHBmci0+cmVzb3VyY2UsIHBmci0+Y291bnQgKTsKKwkgICAgZHByaW50Zl9pbmZvKGZvbnQsIlx0JXMsICVpIGluc3RhbmNlc1xuIiwgcGZyLT5yZXNvdXJjZSwgcGZyLT5jb3VudCApOwogCiAJICAgIGkgPSB3cml0ZSggZmQsIHBmciwgc2l6ZW9mKGZvbnRSZXNvdXJjZSkgKTsKIAkgICAgaWYoIGkgPT0gc2l6ZW9mKGZvbnRSZXNvdXJjZSkgKSAKQEAgLTEzMjQsNyArMTMyMyw3IEBACiAgICAgICAKICAgeF9wYXR0ZXJuID0gVFNYTGlzdEZvbnRzKGRpc3BsYXksICIqIiwgTUFYX0ZPTlRfRkFNSUxJRVMgKiAxNiwgJnhfY291bnQgKTsKIAotICBkcHJpbnRmX2ZvbnQoc3RkZGViLCJGb250IE1hcHBlcjogaW5pdGlhbGl6aW5nICVpIGZvbnRzIFtMUFk9JWksIFhEUj0laSwgRFI9JWldXG4iLCAKKyAgZHByaW50Zl9pbmZvKGZvbnQsIkZvbnQgTWFwcGVyOiBpbml0aWFsaXppbmcgJWkgZm9udHMgW0xQWT0laSwgWERSPSVpLCBEUj0laV1cbiIsIAogCQkJCSAgICB4X2NvdW50LCBwRGV2Q2Fwcy0+bG9nUGl4ZWxzWSwgRGVmUmVzb2x1dGlvbiwgcmVzKTsKICAgZm9yKCBpID0geF9jaGVja3N1bSA9IDA7IGkgPCB4X2NvdW50OyBpKysgKQogICB7CkBAIC0xMzk3LDcgKzEzOTYsNyBAQAogCSAgIGxzdHJjcHluMzJBKCBmci0+cmVzb3VyY2UsIHR5cGVmYWNlLCBqICsgMSApOwogCiAjaWZkZWYgREVCVUdfRk9OVF9JTklUCi0JICAgZHByaW50Zl9mb250KHN0ZGRlYiwiICAgIGZhbWlseTogJXNcbiIsIGZyLT5yZXNvdXJjZSApOworCSAgIGRwcmludGZfaW5mbyhmb250LCIgICAgZmFtaWx5OiAlc1xuIiwgZnItPnJlc291cmNlICk7CiAjZW5kaWYKIAogCSAgIGlmKCBwZnIgKSBwZnItPm5leHQgPSBmcjsKQEAgLTE0NDEsNyArMTQ0MCw3IEBACiAgICAgICAgICAgIFRTWEZyZWVGb250KCBkaXNwbGF5LCB4X2ZzICk7CiAKICNpZmRlZiBERUJVR19GT05UX0lOSVQKLQkgICBkcHJpbnRmX2ZvbnQoc3RkZGViLCJcdFslIDJpcHRdICclcydcbiIsIGZpLT5kZi5kZlBvaW50cywgdHlwZWZhY2UgKTsKKwkgICBkcHJpbnRmX2luZm8oZm9udCwiXHRbJSAyaXB0XSAnJXMnXG4iLCBmaS0+ZGYuZGZQb2ludHMsIHR5cGVmYWNlICk7CiAjZW5kaWYKIAkgICBYRk9OVF9DaGVja0ZJTGlzdCggZnIsIGZpLCBSRU1PVkVfU1VCU0VUUyApOwogCSAgIGZpID0gTlVMTDsJLyogcHJldmVudGluZyByZXVzZSAqLwpAQCAtMTQ4Niw3ICsxNDg1LDcgQEAKICAgWEZPTlRfR3Jvd0ZyZWVMaXN0KDAsIGZvbnRDYWNoZVNpemUgLSAxKTsKIAogI2lmZGVmIERFQlVHX0ZPTlRfSU5JVAotICAgICAgICBkcHJpbnRmX2ZvbnQoc3RkZGViLCJkb25lIVxuIik7CisgICAgICAgIGRwcmludGZfaW5mbyhmb250LCJkb25lIVxuIik7CiAjZW5kaWYKIAogICAvKiB1cGRhdGUgdGV4dCBjYXBzIHBhcmFtZXRlciAqLwpAQCAtMTU1MCw3ICsxNTQ5LDcgQEAKICAgIEJPT0wzMiAgICAgICBiU2NhbGUgPSBwZmktPmZpX2ZsYWdzICYgRklfU0NBTEFCTEU7CiAgICBJTlQzMiAgICAgICAgZCwgaDsKIAotICAgZHByaW50Zl9mb250KCBzdGRkZWIsIlx0WyAlLTJpcHQgaD0lLTNpIHc9JS0zaSAlcyVzXSIsIHBmaS0+ZGYuZGZQb2ludHMsCisgICBkcHJpbnRmX2luZm8oZm9udCwiXHRbICUtMmlwdCBoPSUtM2kgdz0lLTNpICVzJXNdXG4iLCBwZmktPmRmLmRmUG9pbnRzLAogCQkgcGZpLT5kZi5kZlBpeEhlaWdodCwgcGZpLT5kZi5kZkF2Z1dpZHRoLAogCQkocGZpLT5kZi5kZldlaWdodCA+IDQwMCkgPyAiQm9sZCAiIDogIk5vcm1hbCAiLAogCQkocGZpLT5kZi5kZkl0YWxpYykgPyAiSXRhbGljIiA6ICIiICk7CkBAIC0xNjQwLDcgKzE2MzksNyBAQAogICAgaWYoIHBlbmFsdHkgJiYgcGZpLT5sZmRfcmVzb2x1dGlvbiAhPSBEZWZSZXNvbHV0aW9uICkgCiAgICAgICAgcGVuYWx0eSsrOwogCi0gICBkcHJpbnRmX2ZvbnQoc3RkZGViLCItPiAlaVxuIiwgcGVuYWx0eSApOworICAgZHByaW50Zl9pbmZvKGZvbnQsIiAgcmV0dXJuaW5nICVpXG4iLCBwZW5hbHR5ICk7CiAKICAgIHJldHVybiBwZW5hbHR5OwogfQpAQCAtMTcxOCw3ICsxNzE3LDcgQEAKICAgfQogCiAjaWZkZWYgREVCVUdfRk9OVF9JTklUCi0gIGlmKCBpICkgZHByaW50Zl9mb250KHN0ZGRlYiwiXHQgICAgcHVyZ2VkICVpIHN1YnNldHMgWyVpXVxuIiwgaSAsIGZyLT5jb3VudCk7CisgIGlmKCBpICkgZHByaW50Zl9pbmZvKGZvbnQsIlx0ICAgIHB1cmdlZCAlaSBzdWJzZXRzIFslaV1cbiIsIGkgLCBmci0+Y291bnQpOwogI2VuZGlmCiB9CiAKQEAgLTE3NjEsNyArMTc2MCw3IEBACiAKICAgICBpZiggZm0ucGZyICkgICAgICAgIC8qIG1hdGNoIGZhbWlseSAqLwogICAgIHsKLQlkcHJpbnRmX2ZvbnQoc3RkZGViLCAiJXNcbiIsIGZtLnBmci0+bGZGYWNlTmFtZSApOworCWRwcmludGZfaW5mbyhmb250LCAiJXNcbiIsIGZtLnBmci0+bGZGYWNlTmFtZSApOwogCiAgICAgICAgIFhGT05UX01hdGNoRklMaXN0KCAmZm0gKTsKICAgICAgICAgKnBmbSA9IGZtOwpAQCAtMTc3NSw3ICsxNzc0LDcgQEAKICAgICAgICAgZm9yKCBzdGFydCA9IGZvbnRMaXN0OyBzdGFydCAmJiBzY29yZTsgc3RhcnQgPSBzdGFydC0+bmV4dCApCiAgICAgICAgIHsKICAgICAgICAgICAgIGZtLnBmciA9IHN0YXJ0OwotCSAgICBkcHJpbnRmX2ZvbnQoc3RkZGViLCAiJXNcbiIsIGZtLnBmci0+bGZGYWNlTmFtZSApOworCSAgICBkcHJpbnRmX2luZm8oZm9udCwgIiVzXG4iLCBmbS5wZnItPmxmRmFjZU5hbWUgKTsKIAogICAgICAgICAgICAgY3VycmVudF9zY29yZSA9IFhGT05UX01hdGNoRklMaXN0KCAmZm0gKTsKICAgICAgICAgICAgIGlmKCBjdXJyZW50X3Njb3JlIDwgc2NvcmUgKQpAQCAtMTg1MCw3ICsxODQ5LDcgQEAKICAgICB7CiAJaW50CXByZXZfaSwgcHJldl9qLCBqOwogCi0JZHByaW50Zl9mb250KHN0ZGRlYiwiZm9udCBjYWNoZSBpcyBmdWxsXG4iKTsKKwlkcHJpbnRmX2luZm8oZm9udCwiZm9udCBjYWNoZSBpcyBmdWxsXG4iKTsKIAogCS8qIGxvb2t1cCB0aGUgbGVhc3QgcmVjZW50bHkgdXNlZCBmb250ICovCiAKQEAgLTE4NjksNyArMTg2OCw3IEBACiAJewogCSAgICAvKiBkZXRhY2ggZnJvbSB0aGUgbHJ1IGxpc3QgKi8KIAotCSAgICBkcHJpbnRmX2ZvbnQoc3RkZGViLCJcdGZyZWVpbmcgZW50cnkgJWlcbiIsIGogKTsKKwkgICAgZHByaW50Zl9pbmZvKGZvbnQsIlx0ZnJlZWluZyBlbnRyeSAlaVxuIiwgaiApOwogCiAJICAgIGlmKCBwcmV2X2ogPj0gMCApCiAJCWZvbnRDYWNoZVtwcmV2X2pdLmxydSA9IGZvbnRDYWNoZVtqXS5scnU7CkBAIC0xODg3LDcgKzE4ODYsNyBAQAogCiAJICAgIHByZXZfaSA9IGZvbnRDYWNoZVNpemUgKyBGT05UQ0FDSEU7CiAKLQkgICAgZHByaW50Zl9mb250KHN0ZGRlYiwiXHRncm93aW5nIGZvbnQgY2FjaGUgZnJvbSAlaSB0byAlaVxuIiwgZm9udENhY2hlU2l6ZSwgcHJldl9pICk7CisJICAgIGRwcmludGZfaW5mbyhmb250LCJcdGdyb3dpbmcgZm9udCBjYWNoZSBmcm9tICVpIHRvICVpXG4iLCBmb250Q2FjaGVTaXplLCBwcmV2X2kgKTsKIAogCSAgICBpZiggKG5ld0NhY2hlID0gKGZvbnRPYmplY3QqKUhlYXBSZUFsbG9jKFN5c3RlbUhlYXAsIDAsICAKIAkJCQkJCSAgICAgZm9udENhY2hlLCBwcmV2X2kpKSApCkBAIC0xOTQyLDcgKzE5NDEsNyBAQAogCSAgICB7CiAJCVVJTlQzMgl1UmVsYXhMZXZlbCA9IDA7CiAKLQkJZHByaW50Zl9mb250KHN0ZGRlYiwiWFJlYWxpemVGb250OiAoJXUpICclcycgaD0laSB3ZWlnaHQ9JWkgJXNcbiIsCisJCWRwcmludGZfaW5mbyhmb250LCJYUmVhbGl6ZUZvbnQ6ICgldSkgJyVzJyBoPSVpIHdlaWdodD0laSAlc1xuIiwKIAkJCQkgICAgIHBsZi0+bGZDaGFyU2V0LCBwbGYtPmxmRmFjZU5hbWUsIHBsZi0+bGZIZWlnaHQsIAogCQkJCSAgICAgcGxmLT5sZldlaWdodCwgKHBsZi0+bGZJdGFsaWMpID8gIkl0YWxpYyIgOiAiIiApOwogCkBAIC0yMDIwLDcgKzIwMTksNyBAQAogICAgIHBmby0+bHJ1ID0gZm9udE1SVTsKICAgICBmb250TVJVID0gKHBmbyAtIGZvbnRDYWNoZSk7CiAKLSAgICBkcHJpbnRmX2ZvbnQoc3RkZGViLCJwaHlzZm9udCAlaVxuIiwgZm9udE1SVSk7CisgICAgZHByaW50Zl9pbmZvKGZvbnQsInBoeXNmb250ICVpXG4iLCBmb250TVJVKTsKIAogICAgIHJldHVybiAoWF9QSFlTRk9OVCkoWF9QRk9OVF9NQUdJQyB8IGZvbnRNUlUpOwogfQpkaWZmIC0tZ2l0IGEvaWYxNjMyL2J1aWx0aW4uYyBiL2lmMTYzMi9idWlsdGluLmMKaW5kZXggMDE2Nzc1MC4uZTU2MTgzZCAxMDA2NDQKLS0tIGEvaWYxNjMyL2J1aWx0aW4uYworKysgYi9pZjE2MzIvYnVpbHRpbi5jCkBAIC0xOCw3ICsxOCw2IEBACiAjaW5jbHVkZSAic3RhY2tmcmFtZS5oIgogI2luY2x1ZGUgInVzZXIuaCIKICNpbmNsdWRlICJwcm9jZXNzLmgiCi0jaW5jbHVkZSAic3RkZGVidWcuaCIKICNpbmNsdWRlICJkZWJ1Zy5oIgogCiAvKiBCdWlsdC1pbiBtb2R1bGVzIGRlc2NyaXB0b3JzICovCkBAIC0xNDIsNyArMTQxLDcgQEAKICAgICBpZiAoIWhNb2R1bGUpIHJldHVybiAwOwogICAgIEZhclNldE93bmVyKCBoTW9kdWxlLCBoTW9kdWxlICk7CiAKLSAgICBkcHJpbnRmX21vZHVsZSggc3RkZGViLCAiQnVpbHQtaW4gJXM6IGhtb2R1bGU9JTA0eFxuIiwKKyAgICBkcHJpbnRmX2luZm8obW9kdWxlLCAiQnVpbHQtaW4gJXM6IGhtb2R1bGU9JTA0eFxuIiwKICAgICAgICAgICAgICAgICAgICAgZGVzY3ItPm5hbWUsIGhNb2R1bGUgKTsKICAgICBwTW9kdWxlID0gKE5FX01PRFVMRSAqKUdsb2JhbExvY2sxNiggaE1vZHVsZSApOwogICAgIHBNb2R1bGUtPnNlbGYgPSBoTW9kdWxlOwpAQCAtMTg2LDYgKzE4NSw4IEBACiAgICAgV09SRCB2ZWN0b3I7CiAgICAgSE1PRFVMRTE2IGhNb2R1bGU7CiAKKyAgICBmbkJVSUxUSU5fTG9hZE1vZHVsZSA9IEJVSUxUSU5fTG9hZE1vZHVsZTsKKwogICAgIGZvciAoZGxsID0gQnVpbHRpbkRMTHM7IGRsbC0+ZGVzY3I7IGRsbCsrKQogICAgIHsKICAgICAgICAgaWYgKGRsbC0+ZmxhZ3MgJiBETExfRkxBR19BTFdBWVNfVVNFRCkKZGlmZiAtLWdpdCBhL2lmMTYzMi9jb21wb2JqLnNwZWMgYi9pZjE2MzIvY29tcG9iai5zcGVjCmluZGV4IDU1ZWI3ZTkuLmYwY2UzYzkgMTAwNjQ0Ci0tLSBhL2lmMTYzMi9jb21wb2JqLnNwZWMKKysrIGIvaWYxNjMyL2NvbXBvYmouc3BlYwpAQCAtMiwxMCArMiwxMCBAQAogdHlwZQl3aW4xNgogCiAxIHBhc2NhbCBDb0J1aWxkVmVyc2lvbigpIENvQnVpbGRWZXJzaW9uCi0yIHBhc2NhbCBDb0luaXRpYWxpemUobG9uZykgQ29Jbml0aWFsaXplCisyIHBhc2NhbCBDb0luaXRpYWxpemUobG9uZykgQ29Jbml0aWFsaXplMTYKIDMgcGFzY2FsIENvVW5pbml0aWFsaXplKCkgQ29Vbml0aWFsaXplCi00IHBhc2NhbCBDb0dldE1hbGxvYyhsb25nIHB0cikgQ29HZXRNYWxsb2MKLTUgcGFzY2FsIENvUmVnaXN0ZXJDbGFzc09iamVjdChwdHIgcHRyIGxvbmcgbG9uZyBwdHIpIENvUmVnaXN0ZXJDbGFzc09iamVjdAorNCBwYXNjYWwgQ29HZXRNYWxsb2MobG9uZyBwdHIpIENvR2V0TWFsbG9jMTYKKzUgcGFzY2FsIENvUmVnaXN0ZXJDbGFzc09iamVjdChwdHIgcHRyIGxvbmcgbG9uZyBwdHIpIENvUmVnaXN0ZXJDbGFzc09iamVjdDE2CiA2IHN0dWIgQ09SRVZPS0VDTEFTU09CSkVDVAogNyBzdHViIENPR0VUQ0xBU1NPQkpFQ1QKIDggc3R1YiBDT01BUlNIQUxJTlRFUkZBQ0UKQEAgLTE5LDggKzE5LDggQEAKIDE2IHN0dWIgQ09SRUxFQVNFTUFSU0hBTERBVEEKIDE3IHBhc2NhbDE2IENPRlJFRVVOVVNFRExJQlJBUklFUygpIENvRnJlZVVudXNlZExpYnJhcmllcwogMTggcGFzY2FsMTYgSXNFcXVhbEdVSUQocHRyIHB0cikgSXNFcXVhbEdVSUQKLTE5IHBhc2NhbCBTdHJpbmdGcm9tQ0xTSUQocHRyIHB0cikgU3RyaW5nRnJvbUNMU0lECi0yMCBwYXNjYWwgQ0xTSURGcm9tU3RyaW5nKHN0ciBwdHIpIENMU0lERnJvbVN0cmluZworMTkgcGFzY2FsIFN0cmluZ0Zyb21DTFNJRChwdHIgcHRyKSBTdHJpbmdGcm9tQ0xTSUQxNgorMjAgcGFzY2FsIENMU0lERnJvbVN0cmluZyhzdHIgcHRyKSBDTFNJREZyb21TdHJpbmcxNgogMjEgc3R1YiBJU1ZBTElEUFRSSU4KIDIyIHN0dWIgSVNWQUxJRFBUUk9VVAogMjMgc3R1YiBJU1ZBTElESU5URVJGQUNFCkBAIC02MSw3ICs2MSw3IEBACiA1OCBzdHViIF9JSURfSURGUkVTRVJWRUQyCiA1OSBzdHViIF9JSURfSURGUkVTRVJWRUQzCiA2MCBzdHViIF9JSURfSU1FU1NBR0VGSUxURVIKLTYxIHBhc2NhbCBDTFNJREZyb21Qcm9nSUQoc3RyIHB0cikgQ0xTSURGcm9tUHJvZ0lECis2MSBwYXNjYWwgQ0xTSURGcm9tUHJvZ0lEKHN0ciBwdHIpIENMU0lERnJvbVByb2dJRDE2CiA2MiBzdHViIFBST0dJREZST01DTFNJRAogNjMgc3R1YiBDT0xPQ0tPQkpFQ1RFWFRFUk5BTAogNjQgc3R1YiBfQ0xTSURfU1RETUFSU0hBTApAQCAtMTQ3LDMgKzE0NywxNCBAQAogMjAxIHBhc2NhbCBDQUxMT0JKRUNUSU5XT1cocHRyIHB0cikgQ2FsbE9iamVjdEluV09XCiAyMDQgc3R1YiBDT01QT0JKXzIwNAogMjA3IHN0dWIgQ09NUE9CSl8yMDcKKworIyBXSU5FIGludGVybmFsIHJlbGF5cyAoZm9yIFdpbjE2IGludGVyZmFjZXMpCis1MDAgY2RlY2wgSU1hbGxvYzE2X1F1ZXJ5SW50ZXJmYWNlKHB0ciBwdHIgcHRyKSBJTWFsbG9jMTZfUXVlcnlJbnRlcmZhY2UKKzUwMSBjZGVjbCBJTWFsbG9jMTZfQWRkUmVmKHB0cikgSU1hbGxvYzE2X0FkZFJlZgorNTAyIGNkZWNsIElNYWxsb2MxNl9SZWxlYXNlKHB0cikgSU1hbGxvYzE2X1JlbGVhc2UKKzUwMyBjZGVjbCBJTWFsbG9jMTZfQWxsb2MocHRyIGxvbmcpIElNYWxsb2MxNl9BbGxvYworNTA0IGNkZWNsIElNYWxsb2MxNl9SZWFsbG9jKHB0ciBzZWdwdHIgbG9uZykgSU1hbGxvYzE2X1JlYWxsb2MKKzUwNSBjZGVjbCBJTWFsbG9jMTZfRnJlZShwdHIgc2VncHRyKSBJTWFsbG9jMTZfRnJlZQorNTA2IGNkZWNsIElNYWxsb2MxNl9HZXRTaXplKHB0ciBzZWdwdHIpIElNYWxsb2MxNl9HZXRTaXplCis1MDcgY2RlY2wgSU1hbGxvYzE2X0RpZEFsbG9jKHB0ciBzZWdwdHIpIElNYWxsb2MxNl9EaWRBbGxvYworNTA4IGNkZWNsIElNYWxsb2MxNl9IZWFwTWluaW1pemUocHRyKSBJTWFsbG9jMTZfSGVhcE1pbmltaXplCmRpZmYgLS1naXQgYS9pZjE2MzIvZHVtbXkuYyBiL2lmMTYzMi9kdW1teS5jCmluZGV4IGRiZjIzYzguLjY1YzBkYTggMTAwNjQ0Ci0tLSBhL2lmMTYzMi9kdW1teS5jCisrKyBiL2lmMTYzMi9kdW1teS5jCkBAIC0yLDcgKzIsNyBAQAogI2luY2x1ZGUgIndpbnR5cGVzLmgiCiBsb25nIFdJTkFQSSBzdHViX0dESV8zNzkodm9pZCkgeyBmcHJpbnRmKHN0ZGVyciwgIldhcm5pbmc6IEdESV8zNzk6U1RBUlRQQUdFIHVuaW1wbGVtZW50ZWQgc3R1YlxuIik7IHJldHVybiAxOyB9CiBsb25nIFdJTkFQSSBzdHViX0dESV8zODAodm9pZCkgeyBmcHJpbnRmKHN0ZGVyciwgIldhcm5pbmc6IEdESV8zODA6RU5EUEFHRSB1bmltcGxlbWVudGVkIHN0dWJcbiIpOyByZXR1cm4gMTsgfQotbG9uZyBXSU5BUEkgc3R1Yl9HRElfMzgxKHZvaWQpIHsgZnByaW50ZihzdGRlcnIsICJXYXJuaW5nOiBHRElfMzgxOlNFVEFCT1JUUFJPQyB1bmltcGxlbWVudGVkIHN0dWJcbiIpOyByZXR1cm4gMTsgfQorbG9uZyBXSU5BUEkgc3R1Yl9HRElfMzgxKEhEQzE2IGhkYywgU0VHUFRSIHByb2MpIHsgZnByaW50ZihzdGRlcnIsICJXYXJuaW5nOiBHRElfMzgxOlNFVEFCT1JUUFJPQyB1bmltcGxlbWVudGVkIHN0dWJcbiIpOyByZXR1cm4gMTsgfQogbG9uZyBXSU5BUEkgc3R1Yl9HRElfMzgyKHZvaWQpIHsgZnByaW50ZihzdGRlcnIsICJXYXJuaW5nOiBHRElfMzgyOkFCT1JUUFJPQyB1bmltcGxlbWVudGVkIHN0dWJcbiIpOyByZXR1cm4gMTsgfQogbG9uZyBXSU5BUEkgc3R1Yl9HRElfNTMwKHZvaWQpIHsgZnByaW50ZihzdGRlcnIsICJXYXJuaW5nOiBHRElfNTMwOiB1bmltcGxlbWVudGVkIHN0dWJcbiIpOyByZXR1cm4gMDsgfQogbG9uZyBXSU5BUEkgc3R1Yl9HRElfNTMxKHZvaWQpIHsgZnByaW50ZihzdGRlcnIsICJXYXJuaW5nOiBHRElfNTMxOiB1bmltcGxlbWVudGVkIHN0dWJcbiIpOyByZXR1cm4gMDsgfQpAQCAtNDYsNCArNDYsMyBAQAogbG9uZyBXSU5BUEkgc3R1Yl9VU0VSXzkyMih2b2lkKSB7IGZwcmludGYoc3RkZXJyLCAiV2FybmluZzogVVNFUl85MjI6IHVuaW1wbGVtZW50ZWQgc3R1YlxuIik7IHJldHVybiAwOyB9CiBsb25nIFdJTkFQSSBzdHViX1VTRVJfOTIzKHZvaWQpIHsgZnByaW50ZihzdGRlcnIsICJXYXJuaW5nOiBVU0VSXzkyMzogdW5pbXBsZW1lbnRlZCBzdHViXG4iKTsgcmV0dXJuIDA7IH0KIGxvbmcgV0lOQVBJIHN0dWJfS0VSTkVMXzcwMCh2b2lkKSB7IGZwcmludGYoc3RkZXJyLCAiV2FybmluZzogS0VSTkVMXzcwMDogdW5pbXBsZW1lbnRlZCBzdHViXG4iKTsgcmV0dXJuIDE7IH0KLWxvbmcgV0lOQVBJIHN0dWJfS0VSTkVMXzQ0OSh2b2lkKSB7IGZwcmludGYoc3RkZXJyLCAiV2FybmluZzogS0VSTkVMXzQ0OTogdW5pbXBsZW1lbnRlZCBzdHViXG4iKTsgcmV0dXJuIDA7IH0KZGlmZiAtLWdpdCBhL2lmMTYzMi9nZGkuc3BlYyBiL2lmMTYzMi9nZGkuc3BlYwppbmRleCA4ZDJmZjhjLi5iZjdmZDZmIDEwMDY0NAotLS0gYS9pZjE2MzIvZ2RpLnNwZWMKKysrIGIvaWYxNjMyL2dkaS5zcGVjCkBAIC0yNjAsNyArMjYwLDcgQEAKIDM3OCBwYXNjYWwxNiBFbmREb2Mod29yZCkgRW5kRG9jMTYKIDM3OSBwYXNjYWwxNiBTdGFydFBhZ2UoKSBzdHViX0dESV8zNzkKIDM4MCBwYXNjYWwxNiBFbmRQYWdlKCkgc3R1Yl9HRElfMzgwCi0zODEgcGFzY2FsMTYgU2V0QWJvcnRQcm9jKCkgc3R1Yl9HRElfMzgxCiszODEgcGFzY2FsMTYgU2V0QWJvcnRQcm9jKHdvcmQgc2VncHRyKSBzdHViX0dESV8zODEKIDM4MiBwYXNjYWwxNiBBYm9ydERvYygpIHN0dWJfR0RJXzM4MgogNDAwIHBhc2NhbDE2IEZhc3RXaW5kb3dGcmFtZSh3b3JkIHB0ciBzX3dvcmQgc193b3JkIGxvbmcpIEZhc3RXaW5kb3dGcmFtZQogNDAxIHN0dWIgR0RJTU9WRUJJVE1BUApkaWZmIC0tZ2l0IGEvaWYxNjMyL2tlcm5lbC5zcGVjIGIvaWYxNjMyL2tlcm5lbC5zcGVjCmluZGV4IDNjMzQ3YzcuLmFiYjBiZmYgMTAwNjQ0Ci0tLSBhL2lmMTYzMi9rZXJuZWwuc3BlYworKysgYi9pZjE2MzIva2VybmVsLnNwZWMKQEAgLTI2MCw3ICsyNjAsNyBAQAogMzM3IHBhc2NhbDE2IElzQmFkU3RyaW5nUHRyKHNlZ3B0ciB3b3JkKSBJc0JhZFN0cmluZ1B0cjE2CiAzMzggc3R1YiBIYXNHUEhhbmRsZXIKIDMzOSBwYXNjYWwxNiBEaWFnUXVlcnkoKSBEaWFnUXVlcnkKLTM0MCBwYXNjYWwxNiBEaWFnT3V0cHV0KCkgRGlhZ091dHB1dAorMzQwIHBhc2NhbDE2IERpYWdPdXRwdXQoc3RyKSBEaWFnT3V0cHV0CiAzNDEgcGFzY2FsIFRvb2xIZWxwSG9vayhwdHIpIFRvb2xIZWxwSG9vawogMzQyIHN0dWIgX19HUAogMzQzIHN0dWIgUmVnaXN0ZXJXaW5PbGRBcEhvb2sKQEAgLTMwOCwxNCArMzA4LDE2IEBACiA0NDUgc3R1YiBLRVJORUxfNDQ1CiA0NDYgc3R1YiBLRVJORUxfNDQ2CiA0NDcgc3R1YiBLRVJORUxfNDQ3Ci00NDkgcGFzY2FsIEtFUk5FTF80NDkoKSBzdHViX0tFUk5FTF80NDkKKzQ0OSBwYXNjYWwgS0VSTkVMXzQ0OSgpIEtFUk5FTF80NDkKIDQ1MCBwYXNjYWwxNiBLRVJORUxfNDUwKCkgc3R1Yl9LRVJORUxfNDUwCiA0NTQgc3R1YiBLRVJORUxfNDU0CiA0NTUgc3R1YiBLRVJORUxfNDU1Ci00NzEgc3R1YiBLRVJORUxfNDcxCis0NzEgcGFzY2FsIEtFUk5FTF80NzEoKSBfS0VSTkVMXzQ3MQogNDcyIHJlZ2lzdGVyIEtFUk5FTF80NzIoKSBfS0VSTkVMXzQ3MgogNDczIHN0dWIgS0VSTkVMXzQ3MwogNDc1IHN0dWIgS0VSTkVMXzQ3NQorNDgwIHN0dWIgS0VSTkVMXzQ4MAorNDgxIHN0dWIgS0VSTkVMXzQ4MQogNDgyIHN0dWIgS0VSTkVMXzQ4MgogNDg1IHN0dWIgS0VSTkVMXzQ4NQogNDkxIHN0dWIgUmVnaXN0ZXJTZXJ2aWNlUHJvY2VzcwpkaWZmIC0tZ2l0IGEvaWYxNjMyL3JlbGF5LmMgYi9pZjE2MzIvcmVsYXkuYwppbmRleCA3NGU3ZmFkLi4zY2M1YjBkIDEwMDY0NAotLS0gYS9pZjE2MzIvcmVsYXkuYworKysgYi9pZjE2MzIvcmVsYXkuYwpAQCAtMTMsMTMgKzEzLDExIEBACiAjaW5jbHVkZSAibW9kdWxlLmgiCiAjaW5jbHVkZSAic3RhY2tmcmFtZS5oIgogI2luY2x1ZGUgInRhc2suaCIKLSNpbmNsdWRlICJzdGRkZWJ1Zy5oIgotLyogI2RlZmluZSBERUJVR19SRUxBWSAqLwogI2luY2x1ZGUgImRlYnVnLmgiCiAKICNpZiAwCiAvKiBNYWtlIG1ha2VfZGVidWcgdGhpbmsgdGhlc2Ugd2VyZSByZWFsbHkgdXNlZCAqLwotZHByaW50Zl9yZWxheQorZHByaW50Zl9pbmZvKHJlbGF5LCAidGVzdCAtIGR1bW15Iik7CiAjZW5kaWYKIAogCkBAIC04Myw3ICs4MSw3IEBACiAgICAgY2hhciAqYXJnczE2OwogICAgIGludCBpOwogCi0gICAgaWYgKCFkZWJ1Z2dpbmdfcmVsYXkpIHJldHVybjsKKyAgICBpZiAoIWRlYnVnZ2luZ19pbmZvKHJlbGF5KSkgcmV0dXJuOwogCiAgICAgZnJhbWUgPSBDVVJSRU5UX1NUQUNLMTY7CiAgICAgcHJpbnRmKCAiQ2FsbCAlcygiLCBCVUlMVElOX0dldEVudHJ5UG9pbnQxNiggZnJhbWUtPmVudHJ5X2NzLApAQCAtMjAxLDcgKzE5OSw3IEBACiAgICAgU1RBQ0sxNkZSQU1FICpmcmFtZTsKICAgICBXT1JEIG9yZGluYWw7CiAKLSAgICBpZiAoIWRlYnVnZ2luZ19yZWxheSkgcmV0dXJuOworICAgIGlmICghZGVidWdnaW5nX2luZm8ocmVsYXkpKSByZXR1cm47CiAgICAgZnJhbWUgPSBDVVJSRU5UX1NUQUNLMTY7CiAgICAgcHJpbnRmKCAiUmV0ICAlcygpICIsIEJVSUxUSU5fR2V0RW50cnlQb2ludDE2KCBmcmFtZS0+ZW50cnlfY3MsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmcmFtZS0+ZW50cnlfaXAsCkBAIC0yNTksNyArMjU3LDcgQEAKIHsKICAgICBUSERCICp0aGRiOwogCi0gICAgaWYgKCFkZWJ1Z2dpbmdfcmVsYXkpIHJldHVybjsKKyAgICBpZiAoIWRlYnVnZ2luZ19pbmZvKHJlbGF5KSkgcmV0dXJuOwogICAgIHRoZGIgPSBUSFJFQURfQ3VycmVudCgpOwogCiAgICAgaWYgKG5iX2FyZ3MgPT0gLTEpICAvKiBSZWdpc3RlciBmdW5jdGlvbiAqLwpAQCAtMzg1LDcgKzM4Myw3IEBACiAgICAgaWYgKGxwYnVmWzhdICE9IFNTX3JlZyhjb250ZXh0KSkKICAgICAgICAgZnByaW50Ziggc3RkZXJyLCAiU3dpdGNoaW5nIHN0YWNrIHNlZ21lbnQgd2l0aCBUaHJvdygpIG5vdCBzdXBwb3J0ZWQ7IGV4cGVjdCBjcmFzaCBub3dcbiIgKTsKIAotICAgIGlmIChkZWJ1Z2dpbmdfcmVsYXkpICAvKiBNYWtlIHN1cmUgd2UgaGF2ZSBhIHZhbGlkIGVudHJ5IHBvaW50IGFkZHJlc3MgKi8KKyAgICBpZiAoZGVidWdnaW5nX2luZm8ocmVsYXkpKSAgLyogTWFrZSBzdXJlIHdlIGhhdmUgYSB2YWxpZCBlbnRyeSBwb2ludCBhZGRyZXNzICovCiAgICAgewogICAgICAgICBzdGF0aWMgRkFSUFJPQzE2IGVudHJ5UG9pbnQgPSBOVUxMOwogCkBAIC00MTAsMTIgKzQwOCwxMyBAQAogCURXT1JEICphcmdzLCByZXQ7CiAgICAgICAgIFZBX0xJU1QxNiB2YWxpc3Q7CiAJaW50IGk7CisJZGJnX2RlY2xfc3RyKHJlbGF5LCAxMDI0KTsKIAogICAgICAgICBWQV9TVEFSVDE2KCB2YWxpc3QgKTsKICAgICAgICAgbnJvZmFyZ3MgICAgPSBWQV9BUkcxNiggdmFsaXN0LCBEV09SRCApOwogICAgICAgICBhcmdjb252bWFzayA9IFZBX0FSRzE2KCB2YWxpc3QsIERXT1JEICk7CiAgICAgICAgIHByb2MzMiAgICAgID0gVkFfQVJHMTYoIHZhbGlzdCwgRkFSUFJPQzMyICk7Ci0JZHByaW50Zl9yZWxheShzdGRkZWIsIkNhbGxQcm9jMzJXKCVsZCwlbGQsJXAsIEV4JWQgYXJnc1siLG5yb2ZhcmdzLGFyZ2NvbnZtYXNrLHByb2MzMixFeCk7CisJZHNwcmludGYocmVsYXksICJDYWxsUHJvYzMyVyglbGQsJWxkLCVwLCBFeCVkIGFyZ3NbIixucm9mYXJncyxhcmdjb252bWFzayxwcm9jMzIsRXgpOwogCWFyZ3MgPSAoRFdPUkQqKUhFQVBfeGFsbG9jKCBHZXRQcm9jZXNzSGVhcCgpLCAwLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZW9mKERXT1JEKSpucm9mYXJncyApOwogCWZvciAoaT0wO2k8bnJvZmFyZ3M7aSsrKSB7CkBAIC00MjMsMTUgKzQyMiwxNSBAQAogICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgU0VHUFRSIHB0ciA9IFZBX0FSRzE2KCB2YWxpc3QsIFNFR1BUUiApOwogICAgICAgICAgICAgICAgICAgICBhcmdzW25yb2ZhcmdzLWktMV0gPSAoRFdPUkQpUFRSX1NFR19UT19MSU4ocHRyKTsKLSAgICAgICAgICAgICAgICAgICAgZHByaW50Zl9yZWxheShzdGRkZWIsIiUwOGx4KCVwKSwiLHB0cixQVFJfU0VHX1RPX0xJTihwdHIpKTsKKyAgICAgICAgICAgICAgICAgICAgZHNwcmludGYocmVsYXksIiUwOGx4KCVwKSwiLHB0cixQVFJfU0VHX1RPX0xJTihwdHIpKTsKIAkJfQogICAgICAgICAgICAgICAgIGVsc2UKICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgIGFyZ3NbbnJvZmFyZ3MtaS0xXSA9IFZBX0FSRzE2KCB2YWxpc3QsIERXT1JEICk7Ci0gICAgICAgICAgICAgICAgICAgIGRwcmludGZfcmVsYXkoc3RkZGViLCIlbGQsIixhcmdzW25yb2ZhcmdzLWktMV0pOworICAgICAgICAgICAgICAgICAgICBkc3ByaW50ZihyZWxheSwiJWxkLCIsYXJnc1tucm9mYXJncy1pLTFdKTsKIAkJfQogCX0KLQlkcHJpbnRmX3JlbGF5KHN0ZGRlYiwiXSkgLSAiKTsKKwlkc3ByaW50ZihyZWxheSwiXSkiKTsKICAgICAgICAgVkFfRU5EMTYoIHZhbGlzdCApOwogCiAJc3dpdGNoIChucm9mYXJncykgewpAQCAtNDY5LDcgKzQ2OCw3IEBACiAgICAgICAgIGlmICghRXgpIFNUQUNLMTZfUE9QKCBUSFJFQURfQ3VycmVudCgpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKDMgKyBucm9mYXJncykgKiBzaXplb2YoRFdPUkQpICk7CiAKLQlkcHJpbnRmX3JlbGF5KHN0ZGRlYiwicmV0dXJucyAlMDhseFxuIixyZXQpOworCWRwcmludGZfaW5mbyhyZWxheSwiJXMgLSByZXR1cm5zICUwOGx4XG4iLGRiZ19zdHIocmVsYXkpLHJldCk7CiAJSGVhcEZyZWUoIEdldFByb2Nlc3NIZWFwKCksIDAsIGFyZ3MgKTsKIAlyZXR1cm4gcmV0OwogfQpkaWZmIC0tZ2l0IGEvaWYxNjMyL3N0b3JhZ2Uuc3BlYyBiL2lmMTYzMi9zdG9yYWdlLnNwZWMKaW5kZXggZjA5YzEzYi4uMjgyNWU3ZSAxMDA2NDQKLS0tIGEvaWYxNjMyL3N0b3JhZ2Uuc3BlYworKysgYi9pZjE2MzIvc3RvcmFnZS5zcGVjCkBAIC0xLDEzICsxLDYwIEBACisjIENvbXBvdW5kIFN0b3JhZ2UgRExMLgorIyAoRklYTUU6IHNvbWUgbWV0aG9kcyBhcmUgY29tbWVudGVkIG91dC4gQ29tbWVudGluZyB0aGVtIGluIF9XSUxMXworIyAgcmVzdWx0IGluIGRhdGFsb3NzLiBEbyBpdCBhdCB5b3VyIG93biByaXNrLikKIG5hbWUJc3RvcmFnZQogdHlwZQl3aW4xNgogIAotMSBzdHViIFN0Z0NyZWF0ZURvY0ZpbGUKKzEgcGFzY2FsIFN0Z0NyZWF0ZURvY0ZpbGVBKHN0ciBsb25nIGxvbmcgcHRyKSBTdGdDcmVhdGVEb2NGaWxlMTYKIDIgc3R1YiBTdGdDcmVhdGVEb2NGaWxlT25JTG9ja0J5dGVzCi0zIHN0dWIgU3RnT3BlblN0b3JhZ2UKKzMgcGFzY2FsIFN0Z09wZW5TdG9yYWdlKHN0ciBwdHIgbG9uZyBwdHIgbG9uZyBwdHIpIFN0Z09wZW5TdG9yYWdlMTYKIDQgc3R1YiBTdGdPcGVuU3RvcmFnZU9uSUxvY2tCeXRlcwotNSBzdHViIFN0Z0lzU3RvcmFnZUZpbGUKKzUgcGFzY2FsIFN0Z0lzU3RvcmFnZUZpbGUoc3RyKSBTdGdJc1N0b3JhZ2VGaWxlMTYKIDYgc3R1YiBTdGdJc1N0b3JhZ2VJTG9ja0J5dGVzCiA3IHN0dWIgU3RnU2V0VGltZXMKICM4IFdFUAogIzkgX19fRVhQT1JURURTVFVCCiAxMDMgc3R1YiBEbGxHZXRDbGFzc09iamVjdAorCisjIFN0b3JhZ2UgSW50ZXJmYWNlIGZ1bmN0aW9ucy4gU3RhcnRpbmcgYXQgNTAwCisjIHRoZXNlIGFyZSBub3QgZXhwb3J0ZWQgaW4gdGhlIHJlYWwgc3RvcmFnZS5kbGwsIHdlIHVzZSB0aGVtCisjIGFzIDE2LT4zMiByZWxheXMuIFRoZXkgdXNlIHRoZSBjZGVjbCBjYWxsaW5nIGNvbnZlbnRpb24uCisKKyMgSVN0b3JhZ2UKKzUwMCBjZGVjbCBJU3RvcmFnZTE2X1F1ZXJ5SW50ZXJmYWNlKHB0ciBwdHIgcHRyKSBJU3RvcmFnZTE2X1F1ZXJ5SW50ZXJmYWNlCis1MDEgY2RlY2wgSVN0b3JhZ2UxNl9BZGRSZWYocHRyKSBJU3RvcmFnZTE2X0FkZFJlZgorNTAyIGNkZWNsIElTdG9yYWdlMTZfUmVsZWFzZShwdHIpIElTdG9yYWdlMTZfUmVsZWFzZQorIzUwMyBjZGVjbCBJU3RvcmFnZTE2X0NyZWF0ZVN0cmVhbShwdHIgc3RyIGxvbmcgbG9uZyBsb25nIHB0cikgSVN0b3JhZ2UxNl9DcmVhdGVTdHJlYW0KKzUwMyBzdHViICBJU3RvcmFnZTE2X0NyZWF0ZVN0cmVhbQorCis1MDQgY2RlY2wgSVN0b3JhZ2UxNl9PcGVuU3RyZWFtKHB0ciBzdHIgcHRyIGxvbmcgbG9uZyBwdHIpIElTdG9yYWdlMTZfT3BlblN0cmVhbQorIzUwNSBjZGVjbCBJU3RvcmFnZTE2X0NyZWF0ZVN0b3JhZ2UocHRyIHN0ciBsb25nIGxvbmcgbG9uZyBwdHIpIElTdG9yYWdlMTZfQ3JlYXRlU3RvcmFnZQorNTA1IHN0dWIgIElTdG9yYWdlMTZfQ3JlYXRlU3RvcmFnZQorNTA2IGNkZWNsIElTdG9yYWdlMTZfT3BlblN0b3JhZ2UocHRyIHN0ciBwdHIgbG9uZyBwdHIgbG9uZyBwdHIpIElTdG9yYWdlMTZfT3BlblN0b3JhZ2UKKzUwNyBjZGVjbCBJU3RvcmFnZTE2X0NvcHlUbyhwdHIgbG9uZyBwdHIgcHRyIHB0cikgSVN0b3JhZ2UxNl9Db3B5VG8KKzUwOCBzdHViICBJU3RvcmFnZTE2X01vdmVFbGVtZW50VG8KKzUwOSBjZGVjbCBJU3RvcmFnZTE2X0NvbW1pdChwdHIgbG9uZykgSVN0b3JhZ2UxNl9Db21taXQKKzUxMCBzdHViICBJU3RvcmFnZTE2X1JldmVydAorNTExIHN0dWIgIElTdG9yYWdlMTZfRW51bUVsZW1lbnRzCis1MTIgc3R1YiAgSVN0b3JhZ2UxNl9EZXN0cm95RWxlbWVudAorNTEzIHN0dWIgIElTdG9yYWdlMTZfUmVuYW1lRWxlbWVudAorNTE0IHN0dWIgIElTdG9yYWdlMTZfU2V0RWxlbWVudFRpbWVzCis1MTUgc3R1YiAgSVN0b3JhZ2UxNl9TZXRDbGFzcworNTE2IHN0dWIgIElTdG9yYWdlMTZfU2V0U3RhdGVCaXRzCis1MTcgY2RlY2wgSVN0b3JhZ2UxNl9TdGF0KHB0ciBwdHIgbG9uZykgSVN0b3JhZ2UxNl9TdGF0CisKKyMgSVN0cmVhbQorNTE4IGNkZWNsIElTdHJlYW0xNl9RdWVyeUludGVyZmFjZShwdHIgcHRyIHB0cikgSVN0cmVhbTE2X1F1ZXJ5SW50ZXJmYWNlCis1MTkgY2RlY2wgSVN0cmVhbTE2X0FkZFJlZihwdHIpIElTdHJlYW0xNl9BZGRSZWYKKzUyMCBjZGVjbCBJU3RyZWFtMTZfUmVsZWFzZShwdHIpIElTdHJlYW0xNl9SZWxlYXNlCis1MjEgY2RlY2wgSVN0cmVhbTE2X1JlYWQocHRyIHB0ciBsb25nIHB0cikgSVN0cmVhbTE2X1JlYWQKKyM1MjIgY2RlY2wgSVN0cmVhbTE2X1dyaXRlKHB0ciBwdHIgbG9uZyBwdHIpIElTdHJlYW0xNl9Xcml0ZQorNTIyIHN0dWIgIElTdHJlYW0xNl9Xcml0ZQorNTIzIGNkZWNsIElTdHJlYW0xNl9TZWVrKHB0ciBsb25nIGxvbmcgbG9uZyBwdHIpIElTdHJlYW0xNl9TZWVrCis1MjQgc3R1YiAgSVN0cmVhbTE2X1NldFNpemUKKzUyNSBzdHViICBJU3RyZWFtMTZfQ29weVRvCis1MjYgc3R1YiAgSVN0cmVhbTE2X0NvbW1pdAorNTI3IHN0dWIgIElTdHJlYW0xNl9SZXZlcnQKKzUyOCBzdHViICBJU3RyZWFtMTZfTG9ja1JlZ2lvbgorNTI5IHN0dWIgIElTdHJlYW0xNl9VbmxvY2tSZWdpb24KKzUzMCBzdHViICBJU3RyZWFtMTZfU3RhdAorNTMxIHN0dWIgIElTdHJlYW0xNl9DbG9uZQpkaWZmIC0tZ2l0IGEvaWYxNjMyL3RodW5rLmMgYi9pZjE2MzIvdGh1bmsuYwppbmRleCA0OTllYzIwLi4wNWVhZWY3IDEwMDY0NAotLS0gYS9pZjE2MzIvdGh1bmsuYworKysgYi9pZjE2MzIvdGh1bmsuYwpAQCAtMTgsNyArMTgsNiBAQAogI2luY2x1ZGUgInRhc2suaCIKICNpbmNsdWRlICJleGNlcHQuaCIKICNpbmNsdWRlICJ3aW4uaCIKLSNpbmNsdWRlICJzdGRkZWJ1Zy5oIgogI2luY2x1ZGUgImRlYnVnLmgiCiAKIApAQCAtMjI3LDcgKzIyNiw3IEBACiAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgIH0KICAgICB9Ci0gICAgZHByaW50Zl90aHVuayggc3RkZGViLCAiVEhVTktfRnJlZTogaW52YWxpZCB0aHVuayBhZGRyICVwXG4iLCB0aHVuayApOworICAgIGRwcmludGZfZXJyKHRodW5rLCAiVEhVTktfRnJlZTogaW52YWxpZCB0aHVuayBhZGRyICVwXG4iLCB0aHVuayApOwogfQogCiAKQEAgLTYyNiw3ICs2MjUsNyBAQAogICAgIExQRFdPUkQgICAgIGFyZ3MgPSAoTFBEV09SRCl4YXJnczsKICAgICBEV09SRCAgICAgICByZXQsaTsKIAotICAgIGRwcmludGZfcmVsYXkoc3RkZGViLCJXT1dDYWxsYmFjazE2RXgoJXAsMHglMDhseCwlbGQsJXAsJXApXG4iLAorICAgIGRwcmludGZfaW5mbyhyZWxheSwiV09XQ2FsbGJhY2sxNkV4KCVwLDB4JTA4bHgsJWxkLCVwLCVwKVxuIiwKICAgICAJcHJvYyxkd0ZsYWdzLGNiQXJncyx4YXJncyxwZHdyZXQKICAgICApOwogICAgIGlmIChkd0ZsYWdzID09IFdDQjE2X0NERUNMKSB7CmRpZmYgLS1naXQgYS9pZjE2MzIvdzMyc3lzLnNwZWMgYi9pZjE2MzIvdzMyc3lzLnNwZWMKaW5kZXggZmY1YTNkZC4uMzc4YzQ4MiAxMDA2NDQKLS0tIGEvaWYxNjMyL3czMnN5cy5zcGVjCisrKyBiL2lmMTYzMi93MzJzeXMuc3BlYwpAQCAtNSw3ICs1LDcgQEAKIDIgc3R1YiBJU1BFRk9STUFUCiAzIHN0dWIgRVhFQ1BFCiA0IHN0dWIgR0VUUEVFWEVJTkZPCi01IHN0dWIgR0VUVzMyU1lTVkVSU0lPTgorNSByZXR1cm4gR0VUVzMyU1lTVkVSU0lPTiAwIDB4MTAwCiA2IHN0dWIgTE9BRFBFUkVTT1VSQ0UKIDcgc3R1YiBHRVRQRVJFU09VUkNFVEFCTEUKIDggc3R1YiBFWEVDUEVFWApkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hY2NvbmZpZy5oIGIvaW5jbHVkZS9hY2NvbmZpZy5oCmluZGV4IGU3ZWM3NWIuLmRhY2MzNDUgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvYWNjb25maWcuaAorKysgYi9pbmNsdWRlL2FjY29uZmlnLmgKQEAgLTE3LDMgKzE3LDYgQEAKIAogLyogRGVmaW5lIGlmIHlvdSBoYXZlIHRoZSBPcGVuIFNvdW5kIHN5c3RlbS4gICovCiAjdW5kZWYgSEFWRV9PU1MKKworLyogRGVmaW5lIGlmIFggbGlicmFyaWVzIGFyZSBub3QgcmVlbnRyYW50IChjb21waWxlZCB3aXRob3V0IC1EX1JFRU5UUkFOVCkuICAqLworI3VuZGVmIE5PX1JFRU5UUkFOVF9YMTEKZGlmZiAtLWdpdCBhL2luY2x1ZGUvY29tcG9iai5oIGIvaW5jbHVkZS9jb21wb2JqLmgKaW5kZXggOWI3NGVkYS4uZDVmODMzYSAxMDA2NDQKLS0tIGEvaW5jbHVkZS9jb21wb2JqLmgKKysrIGIvaW5jbHVkZS9jb21wb2JqLmgKQEAgLTEsNCArMSw0IEBACi0jaWYgIWRlZmluZWQoQ09NUE9CSl9IKQorI2lmbmRlZiBDT01QT0JKX0gKICNkZWZpbmUgQ09NUE9CSl9ICiAKICNpbmNsdWRlICJvbGUuaCIKQEAgLTE1LDkgKzE1LDE0IEBACiB0eXBlZGVmIHN0cnVjdCB0YWdHVUlECUNMU0lELCpMUENMU0lELCpSRUZDTFNJRDsKIHR5cGVkZWYgc3RydWN0IHRhZ0dVSUQJSUlELCpSRUZJSUQsKkxQSUlEOwogCi1PTEVTVEFUVVMgV0lOQVBJIFN0cmluZ0Zyb21DTFNJRChjb25zdCBDTFNJRCAqaWQsIExQU1RSKTsKLU9MRVNUQVRVUyBXSU5BUEkgQ0xTSURGcm9tU3RyaW5nKGNvbnN0IExQQ1NUUiwgQ0xTSUQgKik7CitPTEVTVEFUVVMgV0lOQVBJIFN0cmluZ0Zyb21DTFNJRDE2KGNvbnN0IENMU0lEICppZCwgTFBPTEVTVFIxNiopOworT0xFU1RBVFVTIFdJTkFQSSBTdHJpbmdGcm9tQ0xTSUQzMihjb25zdCBDTFNJRCAqaWQsIExQT0xFU1RSMzIqKTsKKyNkZWZpbmUgU3RyaW5nRnJvbUNMU0lEIFdJTkVMSUJfTkFNRShTdHJpbmdGcm9tQ0xTSUQpCitPTEVTVEFUVVMgV0lOQVBJIENMU0lERnJvbVN0cmluZzE2KExQQ09MRVNUUjE2LCBDTFNJRCAqKTsKK09MRVNUQVRVUyBXSU5BUEkgQ0xTSURGcm9tU3RyaW5nMzIoTFBDT0xFU1RSMzIsIENMU0lEICopOworI2RlZmluZSBDTFNJREZyb21TdHJpbmcgV0lORUxJQl9OQU1FKENMU0lERnJvbVN0cmluZykKIAorT0xFU1RBVFVTIFdJTkFQSSBXSU5FX1N0cmluZ0Zyb21DTFNJRChjb25zdCBDTFNJRCAqaWQsIExQU1RSKTsKIAogI2lmZGVmIElOSVRHVUlECiAjZGVmaW5lIERFRklORV9HVUlEKG5hbWUsIGwsIHcxLCB3MiwgYjEsIGIyLCBiMywgYjQsIGI1LCBiNiwgYjcsIGI4KSBcCmRpZmYgLS1naXQgYS9pbmNsdWRlL2NvbmZpZy5oLmluIGIvaW5jbHVkZS9jb25maWcuaC5pbgppbmRleCAwZjMzNWVjLi41YmQ5NGQyIDEwMDY0NAotLS0gYS9pbmNsdWRlL2NvbmZpZy5oLmluCisrKyBiL2luY2x1ZGUvY29uZmlnLmguaW4KQEAgLTMwLDYgKzMwLDkgQEAKIC8qIERlZmluZSBpZiB5b3UgaGF2ZSB0aGUgT3BlbiBTb3VuZCBzeXN0ZW0uICAqLwogI3VuZGVmIEhBVkVfT1NTCiAKKy8qIERlZmluZSBpZiBYIGxpYnJhcmllcyBhcmUgbm90IHJlZW50cmFudCAoY29tcGlsZWQgd2l0aG91dCAtRF9SRUVOVFJBTlQpLiAgKi8KKyN1bmRlZiBOT19SRUVOVFJBTlRfWDExCisKIC8qIERlZmluZSBpZiB5b3UgaGF2ZSB0aGUgY2xvbmUgZnVuY3Rpb24uICAqLwogI3VuZGVmIEhBVkVfQ0xPTkUKIApkaWZmIC0tZ2l0IGEvaW5jbHVkZS9kZHJhdy5oIGIvaW5jbHVkZS9kZHJhdy5oCmluZGV4IDcwNzg3NTcuLmYyMmZiMzYgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvZGRyYXcuaAorKysgYi9pbmNsdWRlL2RkcmF3LmgKQEAgLTgxMyw2ICs4MTMsNyBAQAogICAgIERXT1JECQkJcmVmOwogICAgIExQRElSRUNURFJBVwkJZGRyYXc7CiAgICAgQ29sb3JtYXAJCQljbTsKKyAgICBQQUxFVFRFRU5UUlkJCXBhbGVudHNbMjU2XTsKIH07CiAjdW5kZWYgVEhJUwogCmRpZmYgLS1naXQgYS9pbmNsdWRlL2RlYnVnLmggYi9pbmNsdWRlL2RlYnVnLmgKaW5kZXggMmYzNWM3My4uZjAwZmY1NyAxMDA2NDQKLS0tIGEvaW5jbHVkZS9kZWJ1Zy5oCisrKyBiL2luY2x1ZGUvZGVidWcuaApAQCAtMSwxODU4ICsxLDk1IEBACi0jaW5jbHVkZSA8c3RkaW8uaD4KKy8qIERvIG5vdCBtb2RpZnkgdGhpcyBmaWxlIC0tIGl0IGlzIGF1dG9tYXRpY2FsbHkgZ2VuZXJhdGVkISAqLwogCi0jZGVmaW5lIHN0ZGRlYiBzdGRvdXQKLSNkZWZpbmUgc3RkbmltcCBzdGRvdXQKLQotLyogRG8gbm90IHJlbW92ZSB0aGlzIGxpbmUgb3IgY2hhbmdlIGFueXRoaW5nIGJlbG93IHRoaXMgbGluZSAqLwotCi0jaWZkZWYgREVCVUdfTk9ORV9FWFQKLSN1bmRlZiBERUJVR19BQ0NFTAotI3VuZGVmIERFQlVHX0FTUEkKLSN1bmRlZiBERUJVR19BVE9NCi0jdW5kZWYgREVCVUdfQklUQkxUCi0jdW5kZWYgREVCVUdfQklUTUFQCi0jdW5kZWYgREVCVUdfQ0FSRVQKLSN1bmRlZiBERUJVR19DREFVRElPCi0jdW5kZWYgREVCVUdfQ0xBU1MKLSN1bmRlZiBERUJVR19DTElQQk9BUkQKLSN1bmRlZiBERUJVR19DTElQUElORwotI3VuZGVmIERFQlVHX0NPTUJPCi0jdW5kZWYgREVCVUdfQ09NTQotI3VuZGVmIERFQlVHX0NPTU1ETEcKLSN1bmRlZiBERUJVR19DUlRETEwKLSN1bmRlZiBERUJVR19DVVJTT1IKLSN1bmRlZiBERUJVR19EQwotI3VuZGVmIERFQlVHX0RERQotI3VuZGVmIERFQlVHX0REUkFXCi0jdW5kZWYgREVCVUdfRElBTE9HCi0jdW5kZWYgREVCVUdfRExMCi0jdW5kZWYgREVCVUdfRE9TRlMKLSN1bmRlZiBERUJVR19EUklWRVIKLSN1bmRlZiBERUJVR19EU09VTkQKLSN1bmRlZiBERUJVR19FRElUCi0jdW5kZWYgREVCVUdfRVZFTlQKLSN1bmRlZiBERUJVR19FWEVDCi0jdW5kZWYgREVCVUdfRklMRQotI3VuZGVmIERFQlVHX0ZJWFVQCi0jdW5kZWYgREVCVUdfRk9OVAotI3VuZGVmIERFQlVHX0dESQotI3VuZGVmIERFQlVHX0dMT0JBTAotI3VuZGVmIERFQlVHX0dSQVBISUNTCi0jdW5kZWYgREVCVUdfSEVBUAotI3VuZGVmIERFQlVHX0hPT0sKLSN1bmRlZiBERUJVR19JQ09OCi0jdW5kZWYgREVCVUdfSU5UCi0jdW5kZWYgREVCVUdfS0VZCi0jdW5kZWYgREVCVUdfS0VZQk9BUkQKLSN1bmRlZiBERUJVR19MRFQKLSN1bmRlZiBERUJVR19MSVNUQk9YCi0jdW5kZWYgREVCVUdfTE9DQUwKLSN1bmRlZiBERUJVR19NQ0kKLSN1bmRlZiBERUJVR19NQ0lBTklNCi0jdW5kZWYgREVCVUdfTUNJV0FWRQotI3VuZGVmIERFQlVHX01ESQotI3VuZGVmIERFQlVHX01FTlUKLSN1bmRlZiBERUJVR19NRVNTQUdFCi0jdW5kZWYgREVCVUdfTUVUQUZJTEUKLSN1bmRlZiBERUJVR19NSURJCi0jdW5kZWYgREVCVUdfTU1BVVgKLSN1bmRlZiBERUJVR19NTUlPCi0jdW5kZWYgREVCVUdfTU1TWVMKLSN1bmRlZiBERUJVR19NTVRJTUUKLSN1bmRlZiBERUJVR19NT0RVTEUKLSN1bmRlZiBERUJVR19NU0cKLSN1bmRlZiBERUJVR19OT05DTElFTlQKLSN1bmRlZiBERUJVR19PTEUKLSN1bmRlZiBERUJVR19QQUxFVFRFCi0jdW5kZWYgREVCVUdfUFJPRklMRQotI3VuZGVmIERFQlVHX1BST0dSRVNTCi0jdW5kZWYgREVCVUdfUFJPUAotI3VuZGVmIERFQlVHX1JFRwotI3VuZGVmIERFQlVHX1JFR0lPTgotI3VuZGVmIERFQlVHX1JFTEFZCi0jdW5kZWYgREVCVUdfUkVTT1VSQ0UKLSN1bmRlZiBERUJVR19TQ1JPTEwKLSN1bmRlZiBERUJVR19TRUxFQ1RPUgotI3VuZGVmIERFQlVHX1NFTQotI3VuZGVmIERFQlVHX1NFTkRNU0cKLSN1bmRlZiBERUJVR19TSE0KLSN1bmRlZiBERUJVR19TVFJFU1MKLSN1bmRlZiBERUJVR19TVFJJTkcKLSN1bmRlZiBERUJVR19UQVNLCi0jdW5kZWYgREVCVUdfVEVYVAotI3VuZGVmIERFQlVHX1RIVU5LCi0jdW5kZWYgREVCVUdfVElNRVIKLSN1bmRlZiBERUJVR19UT09MSEVMUAotI3VuZGVmIERFQlVHX1RXRUFLCi0jdW5kZWYgREVCVUdfVVBET1dOCi0jdW5kZWYgREVCVUdfVkVSCi0jdW5kZWYgREVCVUdfVklSVFVBTAotI3VuZGVmIERFQlVHX1ZYRAotI3VuZGVmIERFQlVHX1dJTgotI3VuZGVmIERFQlVHX1dJTjE2RFJWCi0jdW5kZWYgREVCVUdfV0lOMzIKLSN1bmRlZiBERUJVR19XSU5TT0NLCi0jdW5kZWYgREVCVUdfWDExCisjaWZuZGVmIF9fREVCVUdUT09MU19ICisjaW5jbHVkZSAiZGVidWd0b29scy5oIgogI2VuZGlmCiAKLSNpZmRlZiBERUJVR19BTExfRVhUCi0jZGVmaW5lIERFQlVHX0FDQ0VMCi0jZGVmaW5lIERFQlVHX0FTUEkKLSNkZWZpbmUgREVCVUdfQVRPTQotI2RlZmluZSBERUJVR19CSVRCTFQKLSNkZWZpbmUgREVCVUdfQklUTUFQCi0jZGVmaW5lIERFQlVHX0NBUkVUCi0jZGVmaW5lIERFQlVHX0NEQVVESU8KLSNkZWZpbmUgREVCVUdfQ0xBU1MKLSNkZWZpbmUgREVCVUdfQ0xJUEJPQVJECi0jZGVmaW5lIERFQlVHX0NMSVBQSU5HCi0jZGVmaW5lIERFQlVHX0NPTUJPCi0jZGVmaW5lIERFQlVHX0NPTU0KLSNkZWZpbmUgREVCVUdfQ09NTURMRwotI2RlZmluZSBERUJVR19DUlRETEwKLSNkZWZpbmUgREVCVUdfQ1VSU09SCi0jZGVmaW5lIERFQlVHX0RDCi0jZGVmaW5lIERFQlVHX0RERQotI2RlZmluZSBERUJVR19ERFJBVwotI2RlZmluZSBERUJVR19ESUFMT0cKLSNkZWZpbmUgREVCVUdfRExMCi0jZGVmaW5lIERFQlVHX0RPU0ZTCi0jZGVmaW5lIERFQlVHX0RSSVZFUgotI2RlZmluZSBERUJVR19EU09VTkQKLSNkZWZpbmUgREVCVUdfRURJVAotI2RlZmluZSBERUJVR19FVkVOVAotI2RlZmluZSBERUJVR19FWEVDCi0jZGVmaW5lIERFQlVHX0ZJTEUKLSNkZWZpbmUgREVCVUdfRklYVVAKLSNkZWZpbmUgREVCVUdfRk9OVAotI2RlZmluZSBERUJVR19HREkKLSNkZWZpbmUgREVCVUdfR0xPQkFMCi0jZGVmaW5lIERFQlVHX0dSQVBISUNTCi0jZGVmaW5lIERFQlVHX0hFQVAKLSNkZWZpbmUgREVCVUdfSE9PSwotI2RlZmluZSBERUJVR19JQ09OCi0jZGVmaW5lIERFQlVHX0lOVAotI2RlZmluZSBERUJVR19LRVkKLSNkZWZpbmUgREVCVUdfS0VZQk9BUkQKLSNkZWZpbmUgREVCVUdfTERUCi0jZGVmaW5lIERFQlVHX0xJU1RCT1gKLSNkZWZpbmUgREVCVUdfTE9DQUwKLSNkZWZpbmUgREVCVUdfTUNJCi0jZGVmaW5lIERFQlVHX01DSUFOSU0KLSNkZWZpbmUgREVCVUdfTUNJV0FWRQotI2RlZmluZSBERUJVR19NREkKLSNkZWZpbmUgREVCVUdfTUVOVQotI2RlZmluZSBERUJVR19NRVNTQUdFCi0jZGVmaW5lIERFQlVHX01FVEFGSUxFCi0jZGVmaW5lIERFQlVHX01JREkKLSNkZWZpbmUgREVCVUdfTU1BVVgKLSNkZWZpbmUgREVCVUdfTU1JTwotI2RlZmluZSBERUJVR19NTVNZUwotI2RlZmluZSBERUJVR19NTVRJTUUKLSNkZWZpbmUgREVCVUdfTU9EVUxFCi0jZGVmaW5lIERFQlVHX01TRwotI2RlZmluZSBERUJVR19OT05DTElFTlQKLSNkZWZpbmUgREVCVUdfT0xFCi0jZGVmaW5lIERFQlVHX1BBTEVUVEUKLSNkZWZpbmUgREVCVUdfUFJPRklMRQotI2RlZmluZSBERUJVR19QUk9HUkVTUwotI2RlZmluZSBERUJVR19QUk9QCi0jZGVmaW5lIERFQlVHX1JFRwotI2RlZmluZSBERUJVR19SRUdJT04KLSNkZWZpbmUgREVCVUdfUkVMQVkKLSNkZWZpbmUgREVCVUdfUkVTT1VSQ0UKLSNkZWZpbmUgREVCVUdfU0NST0xMCi0jZGVmaW5lIERFQlVHX1NFTEVDVE9SCi0jZGVmaW5lIERFQlVHX1NFTQotI2RlZmluZSBERUJVR19TRU5ETVNHCi0jZGVmaW5lIERFQlVHX1NITQotI2RlZmluZSBERUJVR19TVFJFU1MKLSNkZWZpbmUgREVCVUdfU1RSSU5HCi0jZGVmaW5lIERFQlVHX1RBU0sKLSNkZWZpbmUgREVCVUdfVEVYVAotI2RlZmluZSBERUJVR19USFVOSwotI2RlZmluZSBERUJVR19USU1FUgotI2RlZmluZSBERUJVR19UT09MSEVMUAotI2RlZmluZSBERUJVR19UV0VBSwotI2RlZmluZSBERUJVR19VUERPV04KLSNkZWZpbmUgREVCVUdfVkVSCi0jZGVmaW5lIERFQlVHX1ZJUlRVQUwKLSNkZWZpbmUgREVCVUdfVlhECi0jZGVmaW5lIERFQlVHX1dJTgotI2RlZmluZSBERUJVR19XSU4xNkRSVgotI2RlZmluZSBERUJVR19XSU4zMgotI2RlZmluZSBERUJVR19XSU5TT0NLCi0jZGVmaW5lIERFQlVHX1gxMQotI2VuZGlmCi0KLSNpZmRlZiBERUJVR19SVU5USU1FCi0jaWZkZWYgREVCVUdfREVGSU5FX1ZBUklBQkxFUwotc2hvcnQgZGVidWdfbXNnX2VuYWJsZWRbXT17Ci0jaWZkZWYgREVCVUdfQUNDRUwKLSAgICAxLAotI2Vsc2UKLSAgICAwLAotI2VuZGlmCi0jaWZkZWYgREVCVUdfQVNQSQotICAgIDEsCi0jZWxzZQotICAgIDAsCi0jZW5kaWYKLSNpZmRlZiBERUJVR19BVE9NCi0gICAgMSwKLSNlbHNlCi0gICAgMCwKLSNlbmRpZgotI2lmZGVmIERFQlVHX0JJVEJMVAotICAgIDEsCi0jZWxzZQotICAgIDAsCi0jZW5kaWYKLSNpZmRlZiBERUJVR19CSVRNQVAKLSAgICAxLAotI2Vsc2UKLSAgICAwLAotI2VuZGlmCi0jaWZkZWYgREVCVUdfQ0FSRVQKLSAgICAxLAotI2Vsc2UKLSAgICAwLAotI2VuZGlmCi0jaWZkZWYgREVCVUdfQ0RBVURJTwotICAgIDEsCi0jZWxzZQotICAgIDAsCi0jZW5kaWYKLSNpZmRlZiBERUJVR19DTEFTUwotICAgIDEsCi0jZWxzZQotICAgIDAsCi0jZW5kaWYKLSNpZmRlZiBERUJVR19DTElQQk9BUkQKLSAgICAxLAotI2Vsc2UKLSAgICAwLAotI2VuZGlmCi0jaWZkZWYgREVCVUdfQ0xJUFBJTkcKLSAgICAxLAotI2Vsc2UKLSAgICAwLAotI2VuZGlmCi0jaWZkZWYgREVCVUdfQ09NQk8KLSAgICAxLAotI2Vsc2UKLSAgICAwLAotI2VuZGlmCi0jaWZkZWYgREVCVUdfQ09NTQotICAgIDEsCi0jZWxzZQotICAgIDAsCi0jZW5kaWYKLSNpZmRlZiBERUJVR19DT01NRExHCi0gICAgMSwKLSNlbHNlCi0gICAgMCwKLSNlbmRpZgotI2lmZGVmIERFQlVHX0NSVERMTAotICAgIDEsCi0jZWxzZQotICAgIDAsCi0jZW5kaWYKLSNpZmRlZiBERUJVR19DVVJTT1IKLSAgICAxLAotI2Vsc2UKLSAgICAwLAotI2VuZGlmCi0jaWZkZWYgREVCVUdfREMKLSAgICAxLAotI2Vsc2UKLSAgICAwLAotI2VuZGlmCi0jaWZkZWYgREVCVUdfRERFCi0gICAgMSwKLSNlbHNlCi0gICAgMCwKLSNlbmRpZgotI2lmZGVmIERFQlVHX0REUkFXCi0gICAgMSwKLSNlbHNlCi0gICAgMCwKLSNlbmRpZgotI2lmZGVmIERFQlVHX0RJQUxPRwotICAgIDEsCi0jZWxzZQotICAgIDAsCi0jZW5kaWYKLSNpZmRlZiBERUJVR19ETEwKLSAgICAxLAotI2Vsc2UKLSAgICAwLAotI2VuZGlmCi0jaWZkZWYgREVCVUdfRE9TRlMKLSAgICAxLAotI2Vsc2UKLSAgICAwLAotI2VuZGlmCi0jaWZkZWYgREVCVUdfRFJJVkVSCi0gICAgMSwKLSNlbHNlCi0gICAgMCwKLSNlbmRpZgotI2lmZGVmIERFQlVHX0RTT1VORAotICAgIDEsCi0jZWxzZQotICAgIDAsCi0jZW5kaWYKLSNpZmRlZiBERUJVR19FRElUCi0gICAgMSwKLSNlbHNlCi0gICAgMCwKLSNlbmRpZgotI2lmZGVmIERFQlVHX0VWRU5UCi0gICAgMSwKLSNlbHNlCi0gICAgMCwKLSNlbmRpZgotI2lmZGVmIERFQlVHX0VYRUMKLSAgICAxLAotI2Vsc2UKLSAgICAwLAotI2VuZGlmCi0jaWZkZWYgREVCVUdfRklMRQotICAgIDEsCi0jZWxzZQotICAgIDAsCi0jZW5kaWYKLSNpZmRlZiBERUJVR19GSVhVUAotICAgIDEsCi0jZWxzZQotICAgIDAsCi0jZW5kaWYKLSNpZmRlZiBERUJVR19GT05UCi0gICAgMSwKLSNlbHNlCi0gICAgMCwKLSNlbmRpZgotI2lmZGVmIERFQlVHX0dESQotICAgIDEsCi0jZWxzZQotICAgIDAsCi0jZW5kaWYKLSNpZmRlZiBERUJVR19HTE9CQUwKLSAgICAxLAotI2Vsc2UKLSAgICAwLAotI2VuZGlmCi0jaWZkZWYgREVCVUdfR1JBUEhJQ1MKLSAgICAxLAotI2Vsc2UKLSAgICAwLAotI2VuZGlmCi0jaWZkZWYgREVCVUdfSEVBUAotICAgIDEsCi0jZWxzZQotICAgIDAsCi0jZW5kaWYKLSNpZmRlZiBERUJVR19IT09LCi0gICAgMSwKLSNlbHNlCi0gICAgMCwKLSNlbmRpZgotI2lmZGVmIERFQlVHX0lDT04KLSAgICAxLAotI2Vsc2UKLSAgICAwLAotI2VuZGlmCi0jaWZkZWYgREVCVUdfSU5UCi0gICAgMSwKLSNlbHNlCi0gICAgMCwKLSNlbmRpZgotI2lmZGVmIERFQlVHX0tFWQotICAgIDEsCi0jZWxzZQotICAgIDAsCi0jZW5kaWYKLSNpZmRlZiBERUJVR19LRVlCT0FSRAotICAgIDEsCi0jZWxzZQotICAgIDAsCi0jZW5kaWYKLSNpZmRlZiBERUJVR19MRFQKLSAgICAxLAotI2Vsc2UKLSAgICAwLAotI2VuZGlmCi0jaWZkZWYgREVCVUdfTElTVEJPWAotICAgIDEsCi0jZWxzZQotICAgIDAsCi0jZW5kaWYKLSNpZmRlZiBERUJVR19MT0NBTAotICAgIDEsCi0jZWxzZQotICAgIDAsCi0jZW5kaWYKLSNpZmRlZiBERUJVR19NQ0kKLSAgICAxLAotI2Vsc2UKLSAgICAwLAotI2VuZGlmCi0jaWZkZWYgREVCVUdfTUNJQU5JTQotICAgIDEsCi0jZWxzZQotICAgIDAsCi0jZW5kaWYKLSNpZmRlZiBERUJVR19NQ0lXQVZFCi0gICAgMSwKLSNlbHNlCi0gICAgMCwKLSNlbmRpZgotI2lmZGVmIERFQlVHX01ESQotICAgIDEsCi0jZWxzZQotICAgIDAsCi0jZW5kaWYKLSNpZmRlZiBERUJVR19NRU5VCi0gICAgMSwKLSNlbHNlCi0gICAgMCwKLSNlbmRpZgotI2lmZGVmIERFQlVHX01FU1NBR0UKLSAgICAxLAotI2Vsc2UKLSAgICAwLAotI2VuZGlmCi0jaWZkZWYgREVCVUdfTUVUQUZJTEUKLSAgICAxLAotI2Vsc2UKLSAgICAwLAotI2VuZGlmCi0jaWZkZWYgREVCVUdfTUlESQotICAgIDEsCi0jZWxzZQotICAgIDAsCi0jZW5kaWYKLSNpZmRlZiBERUJVR19NTUFVWAotICAgIDEsCi0jZWxzZQotICAgIDAsCi0jZW5kaWYKLSNpZmRlZiBERUJVR19NTUlPCi0gICAgMSwKLSNlbHNlCi0gICAgMCwKLSNlbmRpZgotI2lmZGVmIERFQlVHX01NU1lTCi0gICAgMSwKLSNlbHNlCi0gICAgMCwKLSNlbmRpZgotI2lmZGVmIERFQlVHX01NVElNRQotICAgIDEsCi0jZWxzZQotICAgIDAsCi0jZW5kaWYKLSNpZmRlZiBERUJVR19NT0RVTEUKLSAgICAxLAotI2Vsc2UKLSAgICAwLAotI2VuZGlmCi0jaWZkZWYgREVCVUdfTVNHCi0gICAgMSwKLSNlbHNlCi0gICAgMCwKLSNlbmRpZgotI2lmZGVmIERFQlVHX05PTkNMSUVOVAotICAgIDEsCi0jZWxzZQotICAgIDAsCi0jZW5kaWYKLSNpZmRlZiBERUJVR19PTEUKLSAgICAxLAotI2Vsc2UKLSAgICAwLAotI2VuZGlmCi0jaWZkZWYgREVCVUdfUEFMRVRURQotICAgIDEsCi0jZWxzZQotICAgIDAsCi0jZW5kaWYKLSNpZmRlZiBERUJVR19QUk9GSUxFCi0gICAgMSwKLSNlbHNlCi0gICAgMCwKLSNlbmRpZgotI2lmZGVmIERFQlVHX1BST0dSRVNTCi0gICAgMSwKLSNlbHNlCi0gICAgMCwKLSNlbmRpZgotI2lmZGVmIERFQlVHX1BST1AKLSAgICAxLAotI2Vsc2UKLSAgICAwLAotI2VuZGlmCi0jaWZkZWYgREVCVUdfUkVHCi0gICAgMSwKLSNlbHNlCi0gICAgMCwKLSNlbmRpZgotI2lmZGVmIERFQlVHX1JFR0lPTgotICAgIDEsCi0jZWxzZQotICAgIDAsCi0jZW5kaWYKLSNpZmRlZiBERUJVR19SRUxBWQotICAgIDEsCi0jZWxzZQotICAgIDAsCi0jZW5kaWYKLSNpZmRlZiBERUJVR19SRVNPVVJDRQotICAgIDEsCi0jZWxzZQotICAgIDAsCi0jZW5kaWYKLSNpZmRlZiBERUJVR19TQ1JPTEwKLSAgICAxLAotI2Vsc2UKLSAgICAwLAotI2VuZGlmCi0jaWZkZWYgREVCVUdfU0VMRUNUT1IKLSAgICAxLAotI2Vsc2UKLSAgICAwLAotI2VuZGlmCi0jaWZkZWYgREVCVUdfU0VNCi0gICAgMSwKLSNlbHNlCi0gICAgMCwKLSNlbmRpZgotI2lmZGVmIERFQlVHX1NFTkRNU0cKLSAgICAxLAotI2Vsc2UKLSAgICAwLAotI2VuZGlmCi0jaWZkZWYgREVCVUdfU0hNCi0gICAgMSwKLSNlbHNlCi0gICAgMCwKLSNlbmRpZgotI2lmZGVmIERFQlVHX1NUUkVTUwotICAgIDEsCi0jZWxzZQotICAgIDAsCi0jZW5kaWYKLSNpZmRlZiBERUJVR19TVFJJTkcKLSAgICAxLAotI2Vsc2UKLSAgICAwLAotI2VuZGlmCi0jaWZkZWYgREVCVUdfVEFTSwotICAgIDEsCi0jZWxzZQotICAgIDAsCi0jZW5kaWYKLSNpZmRlZiBERUJVR19URVhUCi0gICAgMSwKLSNlbHNlCi0gICAgMCwKLSNlbmRpZgotI2lmZGVmIERFQlVHX1RIVU5LCi0gICAgMSwKLSNlbHNlCi0gICAgMCwKLSNlbmRpZgotI2lmZGVmIERFQlVHX1RJTUVSCi0gICAgMSwKLSNlbHNlCi0gICAgMCwKLSNlbmRpZgotI2lmZGVmIERFQlVHX1RPT0xIRUxQCi0gICAgMSwKLSNlbHNlCi0gICAgMCwKLSNlbmRpZgotI2lmZGVmIERFQlVHX1RXRUFLCi0gICAgMSwKLSNlbHNlCi0gICAgMCwKLSNlbmRpZgotI2lmZGVmIERFQlVHX1VQRE9XTgotICAgIDEsCi0jZWxzZQotICAgIDAsCi0jZW5kaWYKLSNpZmRlZiBERUJVR19WRVIKLSAgICAxLAotI2Vsc2UKLSAgICAwLAotI2VuZGlmCi0jaWZkZWYgREVCVUdfVklSVFVBTAotICAgIDEsCi0jZWxzZQotICAgIDAsCi0jZW5kaWYKLSNpZmRlZiBERUJVR19WWEQKLSAgICAxLAotI2Vsc2UKLSAgICAwLAotI2VuZGlmCi0jaWZkZWYgREVCVUdfV0lOCi0gICAgMSwKLSNlbHNlCi0gICAgMCwKLSNlbmRpZgotI2lmZGVmIERFQlVHX1dJTjE2RFJWCi0gICAgMSwKLSNlbHNlCi0gICAgMCwKLSNlbmRpZgotI2lmZGVmIERFQlVHX1dJTjMyCi0gICAgMSwKLSNlbHNlCi0gICAgMCwKLSNlbmRpZgotI2lmZGVmIERFQlVHX1dJTlNPQ0sKLSAgICAxLAotI2Vsc2UKLSAgICAwLAotI2VuZGlmCi0jaWZkZWYgREVCVUdfWDExCi0gICAgMSwKLSNlbHNlCi0gICAgMCwKLSNlbmRpZgotICAgIDAKLX07Ci0jZWxzZQotZXh0ZXJuIHNob3J0IGRlYnVnX21zZ19lbmFibGVkW107Ci0jZW5kaWYKLSNlbmRpZgotCi0jaWZkZWYgREVCVUdfUlVOVElNRQotI2RlZmluZSBkcHJpbnRmX2FjY2VsIGlmKCFkZWJ1Z19tc2dfZW5hYmxlZFswXSkgOyBlbHNlIGZwcmludGYKLSNkZWZpbmUgZGVidWdnaW5nX2FjY2VsIGRlYnVnX21zZ19lbmFibGVkWzBdCi0jZWxzZQotI2lmZGVmIERFQlVHX0FDQ0VMCi0jZGVmaW5lIGRwcmludGZfYWNjZWwgZnByaW50ZgotI2RlZmluZSBkZWJ1Z2dpbmdfYWNjZWwgMQotI2Vsc2UKLSNkZWZpbmUgZHByaW50Zl9hY2NlbCB3aGlsZSgwKSBmcHJpbnRmCi0jZGVmaW5lIGRlYnVnZ2luZ19hY2NlbCAwCi0jZW5kaWYKLSNlbmRpZgotCi0jaWZkZWYgREVCVUdfUlVOVElNRQotI2RlZmluZSBkcHJpbnRmX2FzcGkgaWYoIWRlYnVnX21zZ19lbmFibGVkWzFdKSA7IGVsc2UgZnByaW50ZgotI2RlZmluZSBkZWJ1Z2dpbmdfYXNwaSBkZWJ1Z19tc2dfZW5hYmxlZFsxXQotI2Vsc2UKLSNpZmRlZiBERUJVR19BU1BJCi0jZGVmaW5lIGRwcmludGZfYXNwaSBmcHJpbnRmCi0jZGVmaW5lIGRlYnVnZ2luZ19hc3BpIDEKLSNlbHNlCi0jZGVmaW5lIGRwcmludGZfYXNwaSB3aGlsZSgwKSBmcHJpbnRmCi0jZGVmaW5lIGRlYnVnZ2luZ19hc3BpIDAKLSNlbmRpZgotI2VuZGlmCi0KLSNpZmRlZiBERUJVR19SVU5USU1FCi0jZGVmaW5lIGRwcmludGZfYXRvbSBpZighZGVidWdfbXNnX2VuYWJsZWRbMl0pIDsgZWxzZSBmcHJpbnRmCi0jZGVmaW5lIGRlYnVnZ2luZ19hdG9tIGRlYnVnX21zZ19lbmFibGVkWzJdCi0jZWxzZQotI2lmZGVmIERFQlVHX0FUT00KLSNkZWZpbmUgZHByaW50Zl9hdG9tIGZwcmludGYKLSNkZWZpbmUgZGVidWdnaW5nX2F0b20gMQotI2Vsc2UKLSNkZWZpbmUgZHByaW50Zl9hdG9tIHdoaWxlKDApIGZwcmludGYKLSNkZWZpbmUgZGVidWdnaW5nX2F0b20gMAotI2VuZGlmCi0jZW5kaWYKLQotI2lmZGVmIERFQlVHX1JVTlRJTUUKLSNkZWZpbmUgZHByaW50Zl9iaXRibHQgaWYoIWRlYnVnX21zZ19lbmFibGVkWzNdKSA7IGVsc2UgZnByaW50ZgotI2RlZmluZSBkZWJ1Z2dpbmdfYml0Ymx0IGRlYnVnX21zZ19lbmFibGVkWzNdCi0jZWxzZQotI2lmZGVmIERFQlVHX0JJVEJMVAotI2RlZmluZSBkcHJpbnRmX2JpdGJsdCBmcHJpbnRmCi0jZGVmaW5lIGRlYnVnZ2luZ19iaXRibHQgMQotI2Vsc2UKLSNkZWZpbmUgZHByaW50Zl9iaXRibHQgd2hpbGUoMCkgZnByaW50ZgotI2RlZmluZSBkZWJ1Z2dpbmdfYml0Ymx0IDAKLSNlbmRpZgotI2VuZGlmCi0KLSNpZmRlZiBERUJVR19SVU5USU1FCi0jZGVmaW5lIGRwcmludGZfYml0bWFwIGlmKCFkZWJ1Z19tc2dfZW5hYmxlZFs0XSkgOyBlbHNlIGZwcmludGYKLSNkZWZpbmUgZGVidWdnaW5nX2JpdG1hcCBkZWJ1Z19tc2dfZW5hYmxlZFs0XQotI2Vsc2UKLSNpZmRlZiBERUJVR19CSVRNQVAKLSNkZWZpbmUgZHByaW50Zl9iaXRtYXAgZnByaW50ZgotI2RlZmluZSBkZWJ1Z2dpbmdfYml0bWFwIDEKLSNlbHNlCi0jZGVmaW5lIGRwcmludGZfYml0bWFwIHdoaWxlKDApIGZwcmludGYKLSNkZWZpbmUgZGVidWdnaW5nX2JpdG1hcCAwCi0jZW5kaWYKLSNlbmRpZgotCi0jaWZkZWYgREVCVUdfUlVOVElNRQotI2RlZmluZSBkcHJpbnRmX2NhcmV0IGlmKCFkZWJ1Z19tc2dfZW5hYmxlZFs1XSkgOyBlbHNlIGZwcmludGYKLSNkZWZpbmUgZGVidWdnaW5nX2NhcmV0IGRlYnVnX21zZ19lbmFibGVkWzVdCi0jZWxzZQotI2lmZGVmIERFQlVHX0NBUkVUCi0jZGVmaW5lIGRwcmludGZfY2FyZXQgZnByaW50ZgotI2RlZmluZSBkZWJ1Z2dpbmdfY2FyZXQgMQotI2Vsc2UKLSNkZWZpbmUgZHByaW50Zl9jYXJldCB3aGlsZSgwKSBmcHJpbnRmCi0jZGVmaW5lIGRlYnVnZ2luZ19jYXJldCAwCi0jZW5kaWYKLSNlbmRpZgotCi0jaWZkZWYgREVCVUdfUlVOVElNRQotI2RlZmluZSBkcHJpbnRmX2NkYXVkaW8gaWYoIWRlYnVnX21zZ19lbmFibGVkWzZdKSA7IGVsc2UgZnByaW50ZgotI2RlZmluZSBkZWJ1Z2dpbmdfY2RhdWRpbyBkZWJ1Z19tc2dfZW5hYmxlZFs2XQotI2Vsc2UKLSNpZmRlZiBERUJVR19DREFVRElPCi0jZGVmaW5lIGRwcmludGZfY2RhdWRpbyBmcHJpbnRmCi0jZGVmaW5lIGRlYnVnZ2luZ19jZGF1ZGlvIDEKLSNlbHNlCi0jZGVmaW5lIGRwcmludGZfY2RhdWRpbyB3aGlsZSgwKSBmcHJpbnRmCi0jZGVmaW5lIGRlYnVnZ2luZ19jZGF1ZGlvIDAKLSNlbmRpZgotI2VuZGlmCi0KLSNpZmRlZiBERUJVR19SVU5USU1FCi0jZGVmaW5lIGRwcmludGZfY2xhc3MgaWYoIWRlYnVnX21zZ19lbmFibGVkWzddKSA7IGVsc2UgZnByaW50ZgotI2RlZmluZSBkZWJ1Z2dpbmdfY2xhc3MgZGVidWdfbXNnX2VuYWJsZWRbN10KLSNlbHNlCi0jaWZkZWYgREVCVUdfQ0xBU1MKLSNkZWZpbmUgZHByaW50Zl9jbGFzcyBmcHJpbnRmCi0jZGVmaW5lIGRlYnVnZ2luZ19jbGFzcyAxCi0jZWxzZQotI2RlZmluZSBkcHJpbnRmX2NsYXNzIHdoaWxlKDApIGZwcmludGYKLSNkZWZpbmUgZGVidWdnaW5nX2NsYXNzIDAKLSNlbmRpZgotI2VuZGlmCi0KLSNpZmRlZiBERUJVR19SVU5USU1FCi0jZGVmaW5lIGRwcmludGZfY2xpcGJvYXJkIGlmKCFkZWJ1Z19tc2dfZW5hYmxlZFs4XSkgOyBlbHNlIGZwcmludGYKLSNkZWZpbmUgZGVidWdnaW5nX2NsaXBib2FyZCBkZWJ1Z19tc2dfZW5hYmxlZFs4XQotI2Vsc2UKLSNpZmRlZiBERUJVR19DTElQQk9BUkQKLSNkZWZpbmUgZHByaW50Zl9jbGlwYm9hcmQgZnByaW50ZgotI2RlZmluZSBkZWJ1Z2dpbmdfY2xpcGJvYXJkIDEKLSNlbHNlCi0jZGVmaW5lIGRwcmludGZfY2xpcGJvYXJkIHdoaWxlKDApIGZwcmludGYKLSNkZWZpbmUgZGVidWdnaW5nX2NsaXBib2FyZCAwCi0jZW5kaWYKLSNlbmRpZgotCi0jaWZkZWYgREVCVUdfUlVOVElNRQotI2RlZmluZSBkcHJpbnRmX2NsaXBwaW5nIGlmKCFkZWJ1Z19tc2dfZW5hYmxlZFs5XSkgOyBlbHNlIGZwcmludGYKLSNkZWZpbmUgZGVidWdnaW5nX2NsaXBwaW5nIGRlYnVnX21zZ19lbmFibGVkWzldCi0jZWxzZQotI2lmZGVmIERFQlVHX0NMSVBQSU5HCi0jZGVmaW5lIGRwcmludGZfY2xpcHBpbmcgZnByaW50ZgotI2RlZmluZSBkZWJ1Z2dpbmdfY2xpcHBpbmcgMQotI2Vsc2UKLSNkZWZpbmUgZHByaW50Zl9jbGlwcGluZyB3aGlsZSgwKSBmcHJpbnRmCi0jZGVmaW5lIGRlYnVnZ2luZ19jbGlwcGluZyAwCi0jZW5kaWYKLSNlbmRpZgotCi0jaWZkZWYgREVCVUdfUlVOVElNRQotI2RlZmluZSBkcHJpbnRmX2NvbWJvIGlmKCFkZWJ1Z19tc2dfZW5hYmxlZFsxMF0pIDsgZWxzZSBmcHJpbnRmCi0jZGVmaW5lIGRlYnVnZ2luZ19jb21ibyBkZWJ1Z19tc2dfZW5hYmxlZFsxMF0KLSNlbHNlCi0jaWZkZWYgREVCVUdfQ09NQk8KLSNkZWZpbmUgZHByaW50Zl9jb21ibyBmcHJpbnRmCi0jZGVmaW5lIGRlYnVnZ2luZ19jb21ibyAxCi0jZWxzZQotI2RlZmluZSBkcHJpbnRmX2NvbWJvIHdoaWxlKDApIGZwcmludGYKLSNkZWZpbmUgZGVidWdnaW5nX2NvbWJvIDAKLSNlbmRpZgotI2VuZGlmCi0KLSNpZmRlZiBERUJVR19SVU5USU1FCi0jZGVmaW5lIGRwcmludGZfY29tbSBpZighZGVidWdfbXNnX2VuYWJsZWRbMTFdKSA7IGVsc2UgZnByaW50ZgotI2RlZmluZSBkZWJ1Z2dpbmdfY29tbSBkZWJ1Z19tc2dfZW5hYmxlZFsxMV0KLSNlbHNlCi0jaWZkZWYgREVCVUdfQ09NTQotI2RlZmluZSBkcHJpbnRmX2NvbW0gZnByaW50ZgotI2RlZmluZSBkZWJ1Z2dpbmdfY29tbSAxCi0jZWxzZQotI2RlZmluZSBkcHJpbnRmX2NvbW0gd2hpbGUoMCkgZnByaW50ZgotI2RlZmluZSBkZWJ1Z2dpbmdfY29tbSAwCi0jZW5kaWYKLSNlbmRpZgotCi0jaWZkZWYgREVCVUdfUlVOVElNRQotI2RlZmluZSBkcHJpbnRmX2NvbW1kbGcgaWYoIWRlYnVnX21zZ19lbmFibGVkWzEyXSkgOyBlbHNlIGZwcmludGYKLSNkZWZpbmUgZGVidWdnaW5nX2NvbW1kbGcgZGVidWdfbXNnX2VuYWJsZWRbMTJdCi0jZWxzZQotI2lmZGVmIERFQlVHX0NPTU1ETEcKLSNkZWZpbmUgZHByaW50Zl9jb21tZGxnIGZwcmludGYKLSNkZWZpbmUgZGVidWdnaW5nX2NvbW1kbGcgMQotI2Vsc2UKLSNkZWZpbmUgZHByaW50Zl9jb21tZGxnIHdoaWxlKDApIGZwcmludGYKLSNkZWZpbmUgZGVidWdnaW5nX2NvbW1kbGcgMAotI2VuZGlmCi0jZW5kaWYKLQotI2lmZGVmIERFQlVHX1JVTlRJTUUKLSNkZWZpbmUgZHByaW50Zl9jcnRkbGwgaWYoIWRlYnVnX21zZ19lbmFibGVkWzEzXSkgOyBlbHNlIGZwcmludGYKLSNkZWZpbmUgZGVidWdnaW5nX2NydGRsbCBkZWJ1Z19tc2dfZW5hYmxlZFsxM10KLSNlbHNlCi0jaWZkZWYgREVCVUdfQ1JURExMCi0jZGVmaW5lIGRwcmludGZfY3J0ZGxsIGZwcmludGYKLSNkZWZpbmUgZGVidWdnaW5nX2NydGRsbCAxCi0jZWxzZQotI2RlZmluZSBkcHJpbnRmX2NydGRsbCB3aGlsZSgwKSBmcHJpbnRmCi0jZGVmaW5lIGRlYnVnZ2luZ19jcnRkbGwgMAotI2VuZGlmCi0jZW5kaWYKLQotI2lmZGVmIERFQlVHX1JVTlRJTUUKLSNkZWZpbmUgZHByaW50Zl9jdXJzb3IgaWYoIWRlYnVnX21zZ19lbmFibGVkWzE0XSkgOyBlbHNlIGZwcmludGYKLSNkZWZpbmUgZGVidWdnaW5nX2N1cnNvciBkZWJ1Z19tc2dfZW5hYmxlZFsxNF0KLSNlbHNlCi0jaWZkZWYgREVCVUdfQ1VSU09SCi0jZGVmaW5lIGRwcmludGZfY3Vyc29yIGZwcmludGYKLSNkZWZpbmUgZGVidWdnaW5nX2N1cnNvciAxCi0jZWxzZQotI2RlZmluZSBkcHJpbnRmX2N1cnNvciB3aGlsZSgwKSBmcHJpbnRmCi0jZGVmaW5lIGRlYnVnZ2luZ19jdXJzb3IgMAotI2VuZGlmCi0jZW5kaWYKLQotI2lmZGVmIERFQlVHX1JVTlRJTUUKLSNkZWZpbmUgZHByaW50Zl9kYyBpZighZGVidWdfbXNnX2VuYWJsZWRbMTVdKSA7IGVsc2UgZnByaW50ZgotI2RlZmluZSBkZWJ1Z2dpbmdfZGMgZGVidWdfbXNnX2VuYWJsZWRbMTVdCi0jZWxzZQotI2lmZGVmIERFQlVHX0RDCi0jZGVmaW5lIGRwcmludGZfZGMgZnByaW50ZgotI2RlZmluZSBkZWJ1Z2dpbmdfZGMgMQotI2Vsc2UKLSNkZWZpbmUgZHByaW50Zl9kYyB3aGlsZSgwKSBmcHJpbnRmCi0jZGVmaW5lIGRlYnVnZ2luZ19kYyAwCi0jZW5kaWYKLSNlbmRpZgotCi0jaWZkZWYgREVCVUdfUlVOVElNRQotI2RlZmluZSBkcHJpbnRmX2RkZSBpZighZGVidWdfbXNnX2VuYWJsZWRbMTZdKSA7IGVsc2UgZnByaW50ZgotI2RlZmluZSBkZWJ1Z2dpbmdfZGRlIGRlYnVnX21zZ19lbmFibGVkWzE2XQotI2Vsc2UKLSNpZmRlZiBERUJVR19EREUKLSNkZWZpbmUgZHByaW50Zl9kZGUgZnByaW50ZgotI2RlZmluZSBkZWJ1Z2dpbmdfZGRlIDEKLSNlbHNlCi0jZGVmaW5lIGRwcmludGZfZGRlIHdoaWxlKDApIGZwcmludGYKLSNkZWZpbmUgZGVidWdnaW5nX2RkZSAwCi0jZW5kaWYKLSNlbmRpZgotCi0jaWZkZWYgREVCVUdfUlVOVElNRQotI2RlZmluZSBkcHJpbnRmX2RkcmF3IGlmKCFkZWJ1Z19tc2dfZW5hYmxlZFsxN10pIDsgZWxzZSBmcHJpbnRmCi0jZGVmaW5lIGRlYnVnZ2luZ19kZHJhdyBkZWJ1Z19tc2dfZW5hYmxlZFsxN10KLSNlbHNlCi0jaWZkZWYgREVCVUdfRERSQVcKLSNkZWZpbmUgZHByaW50Zl9kZHJhdyBmcHJpbnRmCi0jZGVmaW5lIGRlYnVnZ2luZ19kZHJhdyAxCi0jZWxzZQotI2RlZmluZSBkcHJpbnRmX2RkcmF3IHdoaWxlKDApIGZwcmludGYKLSNkZWZpbmUgZGVidWdnaW5nX2RkcmF3IDAKLSNlbmRpZgotI2VuZGlmCi0KLSNpZmRlZiBERUJVR19SVU5USU1FCi0jZGVmaW5lIGRwcmludGZfZGlhbG9nIGlmKCFkZWJ1Z19tc2dfZW5hYmxlZFsxOF0pIDsgZWxzZSBmcHJpbnRmCi0jZGVmaW5lIGRlYnVnZ2luZ19kaWFsb2cgZGVidWdfbXNnX2VuYWJsZWRbMThdCi0jZWxzZQotI2lmZGVmIERFQlVHX0RJQUxPRwotI2RlZmluZSBkcHJpbnRmX2RpYWxvZyBmcHJpbnRmCi0jZGVmaW5lIGRlYnVnZ2luZ19kaWFsb2cgMQotI2Vsc2UKLSNkZWZpbmUgZHByaW50Zl9kaWFsb2cgd2hpbGUoMCkgZnByaW50ZgotI2RlZmluZSBkZWJ1Z2dpbmdfZGlhbG9nIDAKLSNlbmRpZgotI2VuZGlmCi0KLSNpZmRlZiBERUJVR19SVU5USU1FCi0jZGVmaW5lIGRwcmludGZfZGxsIGlmKCFkZWJ1Z19tc2dfZW5hYmxlZFsxOV0pIDsgZWxzZSBmcHJpbnRmCi0jZGVmaW5lIGRlYnVnZ2luZ19kbGwgZGVidWdfbXNnX2VuYWJsZWRbMTldCi0jZWxzZQotI2lmZGVmIERFQlVHX0RMTAotI2RlZmluZSBkcHJpbnRmX2RsbCBmcHJpbnRmCi0jZGVmaW5lIGRlYnVnZ2luZ19kbGwgMQotI2Vsc2UKLSNkZWZpbmUgZHByaW50Zl9kbGwgd2hpbGUoMCkgZnByaW50ZgotI2RlZmluZSBkZWJ1Z2dpbmdfZGxsIDAKLSNlbmRpZgotI2VuZGlmCi0KLSNpZmRlZiBERUJVR19SVU5USU1FCi0jZGVmaW5lIGRwcmludGZfZG9zZnMgaWYoIWRlYnVnX21zZ19lbmFibGVkWzIwXSkgOyBlbHNlIGZwcmludGYKLSNkZWZpbmUgZGVidWdnaW5nX2Rvc2ZzIGRlYnVnX21zZ19lbmFibGVkWzIwXQotI2Vsc2UKLSNpZmRlZiBERUJVR19ET1NGUwotI2RlZmluZSBkcHJpbnRmX2Rvc2ZzIGZwcmludGYKLSNkZWZpbmUgZGVidWdnaW5nX2Rvc2ZzIDEKLSNlbHNlCi0jZGVmaW5lIGRwcmludGZfZG9zZnMgd2hpbGUoMCkgZnByaW50ZgotI2RlZmluZSBkZWJ1Z2dpbmdfZG9zZnMgMAotI2VuZGlmCi0jZW5kaWYKLQotI2lmZGVmIERFQlVHX1JVTlRJTUUKLSNkZWZpbmUgZHByaW50Zl9kcml2ZXIgaWYoIWRlYnVnX21zZ19lbmFibGVkWzIxXSkgOyBlbHNlIGZwcmludGYKLSNkZWZpbmUgZGVidWdnaW5nX2RyaXZlciBkZWJ1Z19tc2dfZW5hYmxlZFsyMV0KLSNlbHNlCi0jaWZkZWYgREVCVUdfRFJJVkVSCi0jZGVmaW5lIGRwcmludGZfZHJpdmVyIGZwcmludGYKLSNkZWZpbmUgZGVidWdnaW5nX2RyaXZlciAxCi0jZWxzZQotI2RlZmluZSBkcHJpbnRmX2RyaXZlciB3aGlsZSgwKSBmcHJpbnRmCi0jZGVmaW5lIGRlYnVnZ2luZ19kcml2ZXIgMAotI2VuZGlmCi0jZW5kaWYKLQotI2lmZGVmIERFQlVHX1JVTlRJTUUKLSNkZWZpbmUgZHByaW50Zl9kc291bmQgaWYoIWRlYnVnX21zZ19lbmFibGVkWzIyXSkgOyBlbHNlIGZwcmludGYKLSNkZWZpbmUgZGVidWdnaW5nX2Rzb3VuZCBkZWJ1Z19tc2dfZW5hYmxlZFsyMl0KLSNlbHNlCi0jaWZkZWYgREVCVUdfRFNPVU5ECi0jZGVmaW5lIGRwcmludGZfZHNvdW5kIGZwcmludGYKLSNkZWZpbmUgZGVidWdnaW5nX2Rzb3VuZCAxCi0jZWxzZQotI2RlZmluZSBkcHJpbnRmX2Rzb3VuZCB3aGlsZSgwKSBmcHJpbnRmCi0jZGVmaW5lIGRlYnVnZ2luZ19kc291bmQgMAotI2VuZGlmCi0jZW5kaWYKLQotI2lmZGVmIERFQlVHX1JVTlRJTUUKLSNkZWZpbmUgZHByaW50Zl9lZGl0IGlmKCFkZWJ1Z19tc2dfZW5hYmxlZFsyM10pIDsgZWxzZSBmcHJpbnRmCi0jZGVmaW5lIGRlYnVnZ2luZ19lZGl0IGRlYnVnX21zZ19lbmFibGVkWzIzXQotI2Vsc2UKLSNpZmRlZiBERUJVR19FRElUCi0jZGVmaW5lIGRwcmludGZfZWRpdCBmcHJpbnRmCi0jZGVmaW5lIGRlYnVnZ2luZ19lZGl0IDEKLSNlbHNlCi0jZGVmaW5lIGRwcmludGZfZWRpdCB3aGlsZSgwKSBmcHJpbnRmCi0jZGVmaW5lIGRlYnVnZ2luZ19lZGl0IDAKLSNlbmRpZgotI2VuZGlmCi0KLSNpZmRlZiBERUJVR19SVU5USU1FCi0jZGVmaW5lIGRwcmludGZfZXZlbnQgaWYoIWRlYnVnX21zZ19lbmFibGVkWzI0XSkgOyBlbHNlIGZwcmludGYKLSNkZWZpbmUgZGVidWdnaW5nX2V2ZW50IGRlYnVnX21zZ19lbmFibGVkWzI0XQotI2Vsc2UKLSNpZmRlZiBERUJVR19FVkVOVAotI2RlZmluZSBkcHJpbnRmX2V2ZW50IGZwcmludGYKLSNkZWZpbmUgZGVidWdnaW5nX2V2ZW50IDEKLSNlbHNlCi0jZGVmaW5lIGRwcmludGZfZXZlbnQgd2hpbGUoMCkgZnByaW50ZgotI2RlZmluZSBkZWJ1Z2dpbmdfZXZlbnQgMAotI2VuZGlmCi0jZW5kaWYKLQotI2lmZGVmIERFQlVHX1JVTlRJTUUKLSNkZWZpbmUgZHByaW50Zl9leGVjIGlmKCFkZWJ1Z19tc2dfZW5hYmxlZFsyNV0pIDsgZWxzZSBmcHJpbnRmCi0jZGVmaW5lIGRlYnVnZ2luZ19leGVjIGRlYnVnX21zZ19lbmFibGVkWzI1XQotI2Vsc2UKLSNpZmRlZiBERUJVR19FWEVDCi0jZGVmaW5lIGRwcmludGZfZXhlYyBmcHJpbnRmCi0jZGVmaW5lIGRlYnVnZ2luZ19leGVjIDEKLSNlbHNlCi0jZGVmaW5lIGRwcmludGZfZXhlYyB3aGlsZSgwKSBmcHJpbnRmCi0jZGVmaW5lIGRlYnVnZ2luZ19leGVjIDAKLSNlbmRpZgotI2VuZGlmCi0KLSNpZmRlZiBERUJVR19SVU5USU1FCi0jZGVmaW5lIGRwcmludGZfZmlsZSBpZighZGVidWdfbXNnX2VuYWJsZWRbMjZdKSA7IGVsc2UgZnByaW50ZgotI2RlZmluZSBkZWJ1Z2dpbmdfZmlsZSBkZWJ1Z19tc2dfZW5hYmxlZFsyNl0KLSNlbHNlCi0jaWZkZWYgREVCVUdfRklMRQotI2RlZmluZSBkcHJpbnRmX2ZpbGUgZnByaW50ZgotI2RlZmluZSBkZWJ1Z2dpbmdfZmlsZSAxCi0jZWxzZQotI2RlZmluZSBkcHJpbnRmX2ZpbGUgd2hpbGUoMCkgZnByaW50ZgotI2RlZmluZSBkZWJ1Z2dpbmdfZmlsZSAwCi0jZW5kaWYKLSNlbmRpZgotCi0jaWZkZWYgREVCVUdfUlVOVElNRQotI2RlZmluZSBkcHJpbnRmX2ZpeHVwIGlmKCFkZWJ1Z19tc2dfZW5hYmxlZFsyN10pIDsgZWxzZSBmcHJpbnRmCi0jZGVmaW5lIGRlYnVnZ2luZ19maXh1cCBkZWJ1Z19tc2dfZW5hYmxlZFsyN10KLSNlbHNlCi0jaWZkZWYgREVCVUdfRklYVVAKLSNkZWZpbmUgZHByaW50Zl9maXh1cCBmcHJpbnRmCi0jZGVmaW5lIGRlYnVnZ2luZ19maXh1cCAxCi0jZWxzZQotI2RlZmluZSBkcHJpbnRmX2ZpeHVwIHdoaWxlKDApIGZwcmludGYKLSNkZWZpbmUgZGVidWdnaW5nX2ZpeHVwIDAKLSNlbmRpZgotI2VuZGlmCi0KLSNpZmRlZiBERUJVR19SVU5USU1FCi0jZGVmaW5lIGRwcmludGZfZm9udCBpZighZGVidWdfbXNnX2VuYWJsZWRbMjhdKSA7IGVsc2UgZnByaW50ZgotI2RlZmluZSBkZWJ1Z2dpbmdfZm9udCBkZWJ1Z19tc2dfZW5hYmxlZFsyOF0KLSNlbHNlCi0jaWZkZWYgREVCVUdfRk9OVAotI2RlZmluZSBkcHJpbnRmX2ZvbnQgZnByaW50ZgotI2RlZmluZSBkZWJ1Z2dpbmdfZm9udCAxCi0jZWxzZQotI2RlZmluZSBkcHJpbnRmX2ZvbnQgd2hpbGUoMCkgZnByaW50ZgotI2RlZmluZSBkZWJ1Z2dpbmdfZm9udCAwCi0jZW5kaWYKLSNlbmRpZgotCi0jaWZkZWYgREVCVUdfUlVOVElNRQotI2RlZmluZSBkcHJpbnRmX2dkaSBpZighZGVidWdfbXNnX2VuYWJsZWRbMjldKSA7IGVsc2UgZnByaW50ZgotI2RlZmluZSBkZWJ1Z2dpbmdfZ2RpIGRlYnVnX21zZ19lbmFibGVkWzI5XQotI2Vsc2UKLSNpZmRlZiBERUJVR19HREkKLSNkZWZpbmUgZHByaW50Zl9nZGkgZnByaW50ZgotI2RlZmluZSBkZWJ1Z2dpbmdfZ2RpIDEKLSNlbHNlCi0jZGVmaW5lIGRwcmludGZfZ2RpIHdoaWxlKDApIGZwcmludGYKLSNkZWZpbmUgZGVidWdnaW5nX2dkaSAwCi0jZW5kaWYKLSNlbmRpZgotCi0jaWZkZWYgREVCVUdfUlVOVElNRQotI2RlZmluZSBkcHJpbnRmX2dsb2JhbCBpZighZGVidWdfbXNnX2VuYWJsZWRbMzBdKSA7IGVsc2UgZnByaW50ZgotI2RlZmluZSBkZWJ1Z2dpbmdfZ2xvYmFsIGRlYnVnX21zZ19lbmFibGVkWzMwXQotI2Vsc2UKLSNpZmRlZiBERUJVR19HTE9CQUwKLSNkZWZpbmUgZHByaW50Zl9nbG9iYWwgZnByaW50ZgotI2RlZmluZSBkZWJ1Z2dpbmdfZ2xvYmFsIDEKLSNlbHNlCi0jZGVmaW5lIGRwcmludGZfZ2xvYmFsIHdoaWxlKDApIGZwcmludGYKLSNkZWZpbmUgZGVidWdnaW5nX2dsb2JhbCAwCi0jZW5kaWYKLSNlbmRpZgotCi0jaWZkZWYgREVCVUdfUlVOVElNRQotI2RlZmluZSBkcHJpbnRmX2dyYXBoaWNzIGlmKCFkZWJ1Z19tc2dfZW5hYmxlZFszMV0pIDsgZWxzZSBmcHJpbnRmCi0jZGVmaW5lIGRlYnVnZ2luZ19ncmFwaGljcyBkZWJ1Z19tc2dfZW5hYmxlZFszMV0KLSNlbHNlCi0jaWZkZWYgREVCVUdfR1JBUEhJQ1MKLSNkZWZpbmUgZHByaW50Zl9ncmFwaGljcyBmcHJpbnRmCi0jZGVmaW5lIGRlYnVnZ2luZ19ncmFwaGljcyAxCi0jZWxzZQotI2RlZmluZSBkcHJpbnRmX2dyYXBoaWNzIHdoaWxlKDApIGZwcmludGYKLSNkZWZpbmUgZGVidWdnaW5nX2dyYXBoaWNzIDAKLSNlbmRpZgotI2VuZGlmCi0KLSNpZmRlZiBERUJVR19SVU5USU1FCi0jZGVmaW5lIGRwcmludGZfaGVhcCBpZighZGVidWdfbXNnX2VuYWJsZWRbMzJdKSA7IGVsc2UgZnByaW50ZgotI2RlZmluZSBkZWJ1Z2dpbmdfaGVhcCBkZWJ1Z19tc2dfZW5hYmxlZFszMl0KLSNlbHNlCi0jaWZkZWYgREVCVUdfSEVBUAotI2RlZmluZSBkcHJpbnRmX2hlYXAgZnByaW50ZgotI2RlZmluZSBkZWJ1Z2dpbmdfaGVhcCAxCi0jZWxzZQotI2RlZmluZSBkcHJpbnRmX2hlYXAgd2hpbGUoMCkgZnByaW50ZgotI2RlZmluZSBkZWJ1Z2dpbmdfaGVhcCAwCi0jZW5kaWYKLSNlbmRpZgotCi0jaWZkZWYgREVCVUdfUlVOVElNRQotI2RlZmluZSBkcHJpbnRmX2hvb2sgaWYoIWRlYnVnX21zZ19lbmFibGVkWzMzXSkgOyBlbHNlIGZwcmludGYKLSNkZWZpbmUgZGVidWdnaW5nX2hvb2sgZGVidWdfbXNnX2VuYWJsZWRbMzNdCi0jZWxzZQotI2lmZGVmIERFQlVHX0hPT0sKLSNkZWZpbmUgZHByaW50Zl9ob29rIGZwcmludGYKLSNkZWZpbmUgZGVidWdnaW5nX2hvb2sgMQotI2Vsc2UKLSNkZWZpbmUgZHByaW50Zl9ob29rIHdoaWxlKDApIGZwcmludGYKLSNkZWZpbmUgZGVidWdnaW5nX2hvb2sgMAotI2VuZGlmCi0jZW5kaWYKLQotI2lmZGVmIERFQlVHX1JVTlRJTUUKLSNkZWZpbmUgZHByaW50Zl9pY29uIGlmKCFkZWJ1Z19tc2dfZW5hYmxlZFszNF0pIDsgZWxzZSBmcHJpbnRmCi0jZGVmaW5lIGRlYnVnZ2luZ19pY29uIGRlYnVnX21zZ19lbmFibGVkWzM0XQotI2Vsc2UKLSNpZmRlZiBERUJVR19JQ09OCi0jZGVmaW5lIGRwcmludGZfaWNvbiBmcHJpbnRmCi0jZGVmaW5lIGRlYnVnZ2luZ19pY29uIDEKLSNlbHNlCi0jZGVmaW5lIGRwcmludGZfaWNvbiB3aGlsZSgwKSBmcHJpbnRmCi0jZGVmaW5lIGRlYnVnZ2luZ19pY29uIDAKLSNlbmRpZgotI2VuZGlmCi0KLSNpZmRlZiBERUJVR19SVU5USU1FCi0jZGVmaW5lIGRwcmludGZfaW50IGlmKCFkZWJ1Z19tc2dfZW5hYmxlZFszNV0pIDsgZWxzZSBmcHJpbnRmCi0jZGVmaW5lIGRlYnVnZ2luZ19pbnQgZGVidWdfbXNnX2VuYWJsZWRbMzVdCi0jZWxzZQotI2lmZGVmIERFQlVHX0lOVAotI2RlZmluZSBkcHJpbnRmX2ludCBmcHJpbnRmCi0jZGVmaW5lIGRlYnVnZ2luZ19pbnQgMQotI2Vsc2UKLSNkZWZpbmUgZHByaW50Zl9pbnQgd2hpbGUoMCkgZnByaW50ZgotI2RlZmluZSBkZWJ1Z2dpbmdfaW50IDAKLSNlbmRpZgotI2VuZGlmCi0KLSNpZmRlZiBERUJVR19SVU5USU1FCi0jZGVmaW5lIGRwcmludGZfa2V5IGlmKCFkZWJ1Z19tc2dfZW5hYmxlZFszNl0pIDsgZWxzZSBmcHJpbnRmCi0jZGVmaW5lIGRlYnVnZ2luZ19rZXkgZGVidWdfbXNnX2VuYWJsZWRbMzZdCi0jZWxzZQotI2lmZGVmIERFQlVHX0tFWQotI2RlZmluZSBkcHJpbnRmX2tleSBmcHJpbnRmCi0jZGVmaW5lIGRlYnVnZ2luZ19rZXkgMQotI2Vsc2UKLSNkZWZpbmUgZHByaW50Zl9rZXkgd2hpbGUoMCkgZnByaW50ZgotI2RlZmluZSBkZWJ1Z2dpbmdfa2V5IDAKLSNlbmRpZgotI2VuZGlmCi0KLSNpZmRlZiBERUJVR19SVU5USU1FCi0jZGVmaW5lIGRwcmludGZfa2V5Ym9hcmQgaWYoIWRlYnVnX21zZ19lbmFibGVkWzM3XSkgOyBlbHNlIGZwcmludGYKLSNkZWZpbmUgZGVidWdnaW5nX2tleWJvYXJkIGRlYnVnX21zZ19lbmFibGVkWzM3XQotI2Vsc2UKLSNpZmRlZiBERUJVR19LRVlCT0FSRAotI2RlZmluZSBkcHJpbnRmX2tleWJvYXJkIGZwcmludGYKLSNkZWZpbmUgZGVidWdnaW5nX2tleWJvYXJkIDEKLSNlbHNlCi0jZGVmaW5lIGRwcmludGZfa2V5Ym9hcmQgd2hpbGUoMCkgZnByaW50ZgotI2RlZmluZSBkZWJ1Z2dpbmdfa2V5Ym9hcmQgMAotI2VuZGlmCi0jZW5kaWYKLQotI2lmZGVmIERFQlVHX1JVTlRJTUUKLSNkZWZpbmUgZHByaW50Zl9sZHQgaWYoIWRlYnVnX21zZ19lbmFibGVkWzM4XSkgOyBlbHNlIGZwcmludGYKLSNkZWZpbmUgZGVidWdnaW5nX2xkdCBkZWJ1Z19tc2dfZW5hYmxlZFszOF0KLSNlbHNlCi0jaWZkZWYgREVCVUdfTERUCi0jZGVmaW5lIGRwcmludGZfbGR0IGZwcmludGYKLSNkZWZpbmUgZGVidWdnaW5nX2xkdCAxCi0jZWxzZQotI2RlZmluZSBkcHJpbnRmX2xkdCB3aGlsZSgwKSBmcHJpbnRmCi0jZGVmaW5lIGRlYnVnZ2luZ19sZHQgMAotI2VuZGlmCi0jZW5kaWYKLQotI2lmZGVmIERFQlVHX1JVTlRJTUUKLSNkZWZpbmUgZHByaW50Zl9saXN0Ym94IGlmKCFkZWJ1Z19tc2dfZW5hYmxlZFszOV0pIDsgZWxzZSBmcHJpbnRmCi0jZGVmaW5lIGRlYnVnZ2luZ19saXN0Ym94IGRlYnVnX21zZ19lbmFibGVkWzM5XQotI2Vsc2UKLSNpZmRlZiBERUJVR19MSVNUQk9YCi0jZGVmaW5lIGRwcmludGZfbGlzdGJveCBmcHJpbnRmCi0jZGVmaW5lIGRlYnVnZ2luZ19saXN0Ym94IDEKLSNlbHNlCi0jZGVmaW5lIGRwcmludGZfbGlzdGJveCB3aGlsZSgwKSBmcHJpbnRmCi0jZGVmaW5lIGRlYnVnZ2luZ19saXN0Ym94IDAKLSNlbmRpZgotI2VuZGlmCi0KLSNpZmRlZiBERUJVR19SVU5USU1FCi0jZGVmaW5lIGRwcmludGZfbG9jYWwgaWYoIWRlYnVnX21zZ19lbmFibGVkWzQwXSkgOyBlbHNlIGZwcmludGYKLSNkZWZpbmUgZGVidWdnaW5nX2xvY2FsIGRlYnVnX21zZ19lbmFibGVkWzQwXQotI2Vsc2UKLSNpZmRlZiBERUJVR19MT0NBTAotI2RlZmluZSBkcHJpbnRmX2xvY2FsIGZwcmludGYKLSNkZWZpbmUgZGVidWdnaW5nX2xvY2FsIDEKLSNlbHNlCi0jZGVmaW5lIGRwcmludGZfbG9jYWwgd2hpbGUoMCkgZnByaW50ZgotI2RlZmluZSBkZWJ1Z2dpbmdfbG9jYWwgMAotI2VuZGlmCi0jZW5kaWYKLQotI2lmZGVmIERFQlVHX1JVTlRJTUUKLSNkZWZpbmUgZHByaW50Zl9tY2kgaWYoIWRlYnVnX21zZ19lbmFibGVkWzQxXSkgOyBlbHNlIGZwcmludGYKLSNkZWZpbmUgZGVidWdnaW5nX21jaSBkZWJ1Z19tc2dfZW5hYmxlZFs0MV0KLSNlbHNlCi0jaWZkZWYgREVCVUdfTUNJCi0jZGVmaW5lIGRwcmludGZfbWNpIGZwcmludGYKLSNkZWZpbmUgZGVidWdnaW5nX21jaSAxCi0jZWxzZQotI2RlZmluZSBkcHJpbnRmX21jaSB3aGlsZSgwKSBmcHJpbnRmCi0jZGVmaW5lIGRlYnVnZ2luZ19tY2kgMAotI2VuZGlmCi0jZW5kaWYKLQotI2lmZGVmIERFQlVHX1JVTlRJTUUKLSNkZWZpbmUgZHByaW50Zl9tY2lhbmltIGlmKCFkZWJ1Z19tc2dfZW5hYmxlZFs0Ml0pIDsgZWxzZSBmcHJpbnRmCi0jZGVmaW5lIGRlYnVnZ2luZ19tY2lhbmltIGRlYnVnX21zZ19lbmFibGVkWzQyXQotI2Vsc2UKLSNpZmRlZiBERUJVR19NQ0lBTklNCi0jZGVmaW5lIGRwcmludGZfbWNpYW5pbSBmcHJpbnRmCi0jZGVmaW5lIGRlYnVnZ2luZ19tY2lhbmltIDEKLSNlbHNlCi0jZGVmaW5lIGRwcmludGZfbWNpYW5pbSB3aGlsZSgwKSBmcHJpbnRmCi0jZGVmaW5lIGRlYnVnZ2luZ19tY2lhbmltIDAKLSNlbmRpZgotI2VuZGlmCi0KLSNpZmRlZiBERUJVR19SVU5USU1FCi0jZGVmaW5lIGRwcmludGZfbWNpd2F2ZSBpZighZGVidWdfbXNnX2VuYWJsZWRbNDNdKSA7IGVsc2UgZnByaW50ZgotI2RlZmluZSBkZWJ1Z2dpbmdfbWNpd2F2ZSBkZWJ1Z19tc2dfZW5hYmxlZFs0M10KLSNlbHNlCi0jaWZkZWYgREVCVUdfTUNJV0FWRQotI2RlZmluZSBkcHJpbnRmX21jaXdhdmUgZnByaW50ZgotI2RlZmluZSBkZWJ1Z2dpbmdfbWNpd2F2ZSAxCi0jZWxzZQotI2RlZmluZSBkcHJpbnRmX21jaXdhdmUgd2hpbGUoMCkgZnByaW50ZgotI2RlZmluZSBkZWJ1Z2dpbmdfbWNpd2F2ZSAwCi0jZW5kaWYKLSNlbmRpZgotCi0jaWZkZWYgREVCVUdfUlVOVElNRQotI2RlZmluZSBkcHJpbnRmX21kaSBpZighZGVidWdfbXNnX2VuYWJsZWRbNDRdKSA7IGVsc2UgZnByaW50ZgotI2RlZmluZSBkZWJ1Z2dpbmdfbWRpIGRlYnVnX21zZ19lbmFibGVkWzQ0XQotI2Vsc2UKLSNpZmRlZiBERUJVR19NREkKLSNkZWZpbmUgZHByaW50Zl9tZGkgZnByaW50ZgotI2RlZmluZSBkZWJ1Z2dpbmdfbWRpIDEKLSNlbHNlCi0jZGVmaW5lIGRwcmludGZfbWRpIHdoaWxlKDApIGZwcmludGYKLSNkZWZpbmUgZGVidWdnaW5nX21kaSAwCi0jZW5kaWYKLSNlbmRpZgotCi0jaWZkZWYgREVCVUdfUlVOVElNRQotI2RlZmluZSBkcHJpbnRmX21lbnUgaWYoIWRlYnVnX21zZ19lbmFibGVkWzQ1XSkgOyBlbHNlIGZwcmludGYKLSNkZWZpbmUgZGVidWdnaW5nX21lbnUgZGVidWdfbXNnX2VuYWJsZWRbNDVdCi0jZWxzZQotI2lmZGVmIERFQlVHX01FTlUKLSNkZWZpbmUgZHByaW50Zl9tZW51IGZwcmludGYKLSNkZWZpbmUgZGVidWdnaW5nX21lbnUgMQotI2Vsc2UKLSNkZWZpbmUgZHByaW50Zl9tZW51IHdoaWxlKDApIGZwcmludGYKLSNkZWZpbmUgZGVidWdnaW5nX21lbnUgMAotI2VuZGlmCi0jZW5kaWYKLQotI2lmZGVmIERFQlVHX1JVTlRJTUUKLSNkZWZpbmUgZHByaW50Zl9tZXNzYWdlIGlmKCFkZWJ1Z19tc2dfZW5hYmxlZFs0Nl0pIDsgZWxzZSBmcHJpbnRmCi0jZGVmaW5lIGRlYnVnZ2luZ19tZXNzYWdlIGRlYnVnX21zZ19lbmFibGVkWzQ2XQotI2Vsc2UKLSNpZmRlZiBERUJVR19NRVNTQUdFCi0jZGVmaW5lIGRwcmludGZfbWVzc2FnZSBmcHJpbnRmCi0jZGVmaW5lIGRlYnVnZ2luZ19tZXNzYWdlIDEKLSNlbHNlCi0jZGVmaW5lIGRwcmludGZfbWVzc2FnZSB3aGlsZSgwKSBmcHJpbnRmCi0jZGVmaW5lIGRlYnVnZ2luZ19tZXNzYWdlIDAKLSNlbmRpZgotI2VuZGlmCi0KLSNpZmRlZiBERUJVR19SVU5USU1FCi0jZGVmaW5lIGRwcmludGZfbWV0YWZpbGUgaWYoIWRlYnVnX21zZ19lbmFibGVkWzQ3XSkgOyBlbHNlIGZwcmludGYKLSNkZWZpbmUgZGVidWdnaW5nX21ldGFmaWxlIGRlYnVnX21zZ19lbmFibGVkWzQ3XQotI2Vsc2UKLSNpZmRlZiBERUJVR19NRVRBRklMRQotI2RlZmluZSBkcHJpbnRmX21ldGFmaWxlIGZwcmludGYKLSNkZWZpbmUgZGVidWdnaW5nX21ldGFmaWxlIDEKLSNlbHNlCi0jZGVmaW5lIGRwcmludGZfbWV0YWZpbGUgd2hpbGUoMCkgZnByaW50ZgotI2RlZmluZSBkZWJ1Z2dpbmdfbWV0YWZpbGUgMAotI2VuZGlmCi0jZW5kaWYKLQotI2lmZGVmIERFQlVHX1JVTlRJTUUKLSNkZWZpbmUgZHByaW50Zl9taWRpIGlmKCFkZWJ1Z19tc2dfZW5hYmxlZFs0OF0pIDsgZWxzZSBmcHJpbnRmCi0jZGVmaW5lIGRlYnVnZ2luZ19taWRpIGRlYnVnX21zZ19lbmFibGVkWzQ4XQotI2Vsc2UKLSNpZmRlZiBERUJVR19NSURJCi0jZGVmaW5lIGRwcmludGZfbWlkaSBmcHJpbnRmCi0jZGVmaW5lIGRlYnVnZ2luZ19taWRpIDEKLSNlbHNlCi0jZGVmaW5lIGRwcmludGZfbWlkaSB3aGlsZSgwKSBmcHJpbnRmCi0jZGVmaW5lIGRlYnVnZ2luZ19taWRpIDAKLSNlbmRpZgotI2VuZGlmCi0KLSNpZmRlZiBERUJVR19SVU5USU1FCi0jZGVmaW5lIGRwcmludGZfbW1hdXggaWYoIWRlYnVnX21zZ19lbmFibGVkWzQ5XSkgOyBlbHNlIGZwcmludGYKLSNkZWZpbmUgZGVidWdnaW5nX21tYXV4IGRlYnVnX21zZ19lbmFibGVkWzQ5XQotI2Vsc2UKLSNpZmRlZiBERUJVR19NTUFVWAotI2RlZmluZSBkcHJpbnRmX21tYXV4IGZwcmludGYKLSNkZWZpbmUgZGVidWdnaW5nX21tYXV4IDEKLSNlbHNlCi0jZGVmaW5lIGRwcmludGZfbW1hdXggd2hpbGUoMCkgZnByaW50ZgotI2RlZmluZSBkZWJ1Z2dpbmdfbW1hdXggMAotI2VuZGlmCi0jZW5kaWYKLQotI2lmZGVmIERFQlVHX1JVTlRJTUUKLSNkZWZpbmUgZHByaW50Zl9tbWlvIGlmKCFkZWJ1Z19tc2dfZW5hYmxlZFs1MF0pIDsgZWxzZSBmcHJpbnRmCi0jZGVmaW5lIGRlYnVnZ2luZ19tbWlvIGRlYnVnX21zZ19lbmFibGVkWzUwXQotI2Vsc2UKLSNpZmRlZiBERUJVR19NTUlPCi0jZGVmaW5lIGRwcmludGZfbW1pbyBmcHJpbnRmCi0jZGVmaW5lIGRlYnVnZ2luZ19tbWlvIDEKLSNlbHNlCi0jZGVmaW5lIGRwcmludGZfbW1pbyB3aGlsZSgwKSBmcHJpbnRmCi0jZGVmaW5lIGRlYnVnZ2luZ19tbWlvIDAKLSNlbmRpZgotI2VuZGlmCi0KLSNpZmRlZiBERUJVR19SVU5USU1FCi0jZGVmaW5lIGRwcmludGZfbW1zeXMgaWYoIWRlYnVnX21zZ19lbmFibGVkWzUxXSkgOyBlbHNlIGZwcmludGYKLSNkZWZpbmUgZGVidWdnaW5nX21tc3lzIGRlYnVnX21zZ19lbmFibGVkWzUxXQotI2Vsc2UKLSNpZmRlZiBERUJVR19NTVNZUwotI2RlZmluZSBkcHJpbnRmX21tc3lzIGZwcmludGYKLSNkZWZpbmUgZGVidWdnaW5nX21tc3lzIDEKLSNlbHNlCi0jZGVmaW5lIGRwcmludGZfbW1zeXMgd2hpbGUoMCkgZnByaW50ZgotI2RlZmluZSBkZWJ1Z2dpbmdfbW1zeXMgMAotI2VuZGlmCi0jZW5kaWYKLQotI2lmZGVmIERFQlVHX1JVTlRJTUUKLSNkZWZpbmUgZHByaW50Zl9tbXRpbWUgaWYoIWRlYnVnX21zZ19lbmFibGVkWzUyXSkgOyBlbHNlIGZwcmludGYKLSNkZWZpbmUgZGVidWdnaW5nX21tdGltZSBkZWJ1Z19tc2dfZW5hYmxlZFs1Ml0KLSNlbHNlCi0jaWZkZWYgREVCVUdfTU1USU1FCi0jZGVmaW5lIGRwcmludGZfbW10aW1lIGZwcmludGYKLSNkZWZpbmUgZGVidWdnaW5nX21tdGltZSAxCi0jZWxzZQotI2RlZmluZSBkcHJpbnRmX21tdGltZSB3aGlsZSgwKSBmcHJpbnRmCi0jZGVmaW5lIGRlYnVnZ2luZ19tbXRpbWUgMAotI2VuZGlmCi0jZW5kaWYKLQotI2lmZGVmIERFQlVHX1JVTlRJTUUKLSNkZWZpbmUgZHByaW50Zl9tb2R1bGUgaWYoIWRlYnVnX21zZ19lbmFibGVkWzUzXSkgOyBlbHNlIGZwcmludGYKLSNkZWZpbmUgZGVidWdnaW5nX21vZHVsZSBkZWJ1Z19tc2dfZW5hYmxlZFs1M10KLSNlbHNlCi0jaWZkZWYgREVCVUdfTU9EVUxFCi0jZGVmaW5lIGRwcmludGZfbW9kdWxlIGZwcmludGYKLSNkZWZpbmUgZGVidWdnaW5nX21vZHVsZSAxCi0jZWxzZQotI2RlZmluZSBkcHJpbnRmX21vZHVsZSB3aGlsZSgwKSBmcHJpbnRmCi0jZGVmaW5lIGRlYnVnZ2luZ19tb2R1bGUgMAotI2VuZGlmCi0jZW5kaWYKLQotI2lmZGVmIERFQlVHX1JVTlRJTUUKLSNkZWZpbmUgZHByaW50Zl9tc2cgaWYoIWRlYnVnX21zZ19lbmFibGVkWzU0XSkgOyBlbHNlIGZwcmludGYKLSNkZWZpbmUgZGVidWdnaW5nX21zZyBkZWJ1Z19tc2dfZW5hYmxlZFs1NF0KLSNlbHNlCi0jaWZkZWYgREVCVUdfTVNHCi0jZGVmaW5lIGRwcmludGZfbXNnIGZwcmludGYKLSNkZWZpbmUgZGVidWdnaW5nX21zZyAxCi0jZWxzZQotI2RlZmluZSBkcHJpbnRmX21zZyB3aGlsZSgwKSBmcHJpbnRmCi0jZGVmaW5lIGRlYnVnZ2luZ19tc2cgMAotI2VuZGlmCi0jZW5kaWYKLQotI2lmZGVmIERFQlVHX1JVTlRJTUUKLSNkZWZpbmUgZHByaW50Zl9ub25jbGllbnQgaWYoIWRlYnVnX21zZ19lbmFibGVkWzU1XSkgOyBlbHNlIGZwcmludGYKLSNkZWZpbmUgZGVidWdnaW5nX25vbmNsaWVudCBkZWJ1Z19tc2dfZW5hYmxlZFs1NV0KLSNlbHNlCi0jaWZkZWYgREVCVUdfTk9OQ0xJRU5UCi0jZGVmaW5lIGRwcmludGZfbm9uY2xpZW50IGZwcmludGYKLSNkZWZpbmUgZGVidWdnaW5nX25vbmNsaWVudCAxCi0jZWxzZQotI2RlZmluZSBkcHJpbnRmX25vbmNsaWVudCB3aGlsZSgwKSBmcHJpbnRmCi0jZGVmaW5lIGRlYnVnZ2luZ19ub25jbGllbnQgMAotI2VuZGlmCi0jZW5kaWYKLQotI2lmZGVmIERFQlVHX1JVTlRJTUUKLSNkZWZpbmUgZHByaW50Zl9vbGUgaWYoIWRlYnVnX21zZ19lbmFibGVkWzU2XSkgOyBlbHNlIGZwcmludGYKLSNkZWZpbmUgZGVidWdnaW5nX29sZSBkZWJ1Z19tc2dfZW5hYmxlZFs1Nl0KLSNlbHNlCi0jaWZkZWYgREVCVUdfT0xFCi0jZGVmaW5lIGRwcmludGZfb2xlIGZwcmludGYKLSNkZWZpbmUgZGVidWdnaW5nX29sZSAxCi0jZWxzZQotI2RlZmluZSBkcHJpbnRmX29sZSB3aGlsZSgwKSBmcHJpbnRmCi0jZGVmaW5lIGRlYnVnZ2luZ19vbGUgMAotI2VuZGlmCi0jZW5kaWYKLQotI2lmZGVmIERFQlVHX1JVTlRJTUUKLSNkZWZpbmUgZHByaW50Zl9wYWxldHRlIGlmKCFkZWJ1Z19tc2dfZW5hYmxlZFs1N10pIDsgZWxzZSBmcHJpbnRmCi0jZGVmaW5lIGRlYnVnZ2luZ19wYWxldHRlIGRlYnVnX21zZ19lbmFibGVkWzU3XQotI2Vsc2UKLSNpZmRlZiBERUJVR19QQUxFVFRFCi0jZGVmaW5lIGRwcmludGZfcGFsZXR0ZSBmcHJpbnRmCi0jZGVmaW5lIGRlYnVnZ2luZ19wYWxldHRlIDEKLSNlbHNlCi0jZGVmaW5lIGRwcmludGZfcGFsZXR0ZSB3aGlsZSgwKSBmcHJpbnRmCi0jZGVmaW5lIGRlYnVnZ2luZ19wYWxldHRlIDAKLSNlbmRpZgotI2VuZGlmCi0KLSNpZmRlZiBERUJVR19SVU5USU1FCi0jZGVmaW5lIGRwcmludGZfcHJvZmlsZSBpZighZGVidWdfbXNnX2VuYWJsZWRbNThdKSA7IGVsc2UgZnByaW50ZgotI2RlZmluZSBkZWJ1Z2dpbmdfcHJvZmlsZSBkZWJ1Z19tc2dfZW5hYmxlZFs1OF0KLSNlbHNlCi0jaWZkZWYgREVCVUdfUFJPRklMRQotI2RlZmluZSBkcHJpbnRmX3Byb2ZpbGUgZnByaW50ZgotI2RlZmluZSBkZWJ1Z2dpbmdfcHJvZmlsZSAxCi0jZWxzZQotI2RlZmluZSBkcHJpbnRmX3Byb2ZpbGUgd2hpbGUoMCkgZnByaW50ZgotI2RlZmluZSBkZWJ1Z2dpbmdfcHJvZmlsZSAwCi0jZW5kaWYKLSNlbmRpZgotCi0jaWZkZWYgREVCVUdfUlVOVElNRQotI2RlZmluZSBkcHJpbnRmX3Byb2dyZXNzIGlmKCFkZWJ1Z19tc2dfZW5hYmxlZFs1OV0pIDsgZWxzZSBmcHJpbnRmCi0jZGVmaW5lIGRlYnVnZ2luZ19wcm9ncmVzcyBkZWJ1Z19tc2dfZW5hYmxlZFs1OV0KLSNlbHNlCi0jaWZkZWYgREVCVUdfUFJPR1JFU1MKLSNkZWZpbmUgZHByaW50Zl9wcm9ncmVzcyBmcHJpbnRmCi0jZGVmaW5lIGRlYnVnZ2luZ19wcm9ncmVzcyAxCi0jZWxzZQotI2RlZmluZSBkcHJpbnRmX3Byb2dyZXNzIHdoaWxlKDApIGZwcmludGYKLSNkZWZpbmUgZGVidWdnaW5nX3Byb2dyZXNzIDAKLSNlbmRpZgotI2VuZGlmCi0KLSNpZmRlZiBERUJVR19SVU5USU1FCi0jZGVmaW5lIGRwcmludGZfcHJvcCBpZighZGVidWdfbXNnX2VuYWJsZWRbNjBdKSA7IGVsc2UgZnByaW50ZgotI2RlZmluZSBkZWJ1Z2dpbmdfcHJvcCBkZWJ1Z19tc2dfZW5hYmxlZFs2MF0KLSNlbHNlCi0jaWZkZWYgREVCVUdfUFJPUAotI2RlZmluZSBkcHJpbnRmX3Byb3AgZnByaW50ZgotI2RlZmluZSBkZWJ1Z2dpbmdfcHJvcCAxCi0jZWxzZQotI2RlZmluZSBkcHJpbnRmX3Byb3Agd2hpbGUoMCkgZnByaW50ZgotI2RlZmluZSBkZWJ1Z2dpbmdfcHJvcCAwCi0jZW5kaWYKLSNlbmRpZgotCi0jaWZkZWYgREVCVUdfUlVOVElNRQotI2RlZmluZSBkcHJpbnRmX3JlZyBpZighZGVidWdfbXNnX2VuYWJsZWRbNjFdKSA7IGVsc2UgZnByaW50ZgotI2RlZmluZSBkZWJ1Z2dpbmdfcmVnIGRlYnVnX21zZ19lbmFibGVkWzYxXQotI2Vsc2UKLSNpZmRlZiBERUJVR19SRUcKLSNkZWZpbmUgZHByaW50Zl9yZWcgZnByaW50ZgotI2RlZmluZSBkZWJ1Z2dpbmdfcmVnIDEKLSNlbHNlCi0jZGVmaW5lIGRwcmludGZfcmVnIHdoaWxlKDApIGZwcmludGYKLSNkZWZpbmUgZGVidWdnaW5nX3JlZyAwCi0jZW5kaWYKLSNlbmRpZgotCi0jaWZkZWYgREVCVUdfUlVOVElNRQotI2RlZmluZSBkcHJpbnRmX3JlZ2lvbiBpZighZGVidWdfbXNnX2VuYWJsZWRbNjJdKSA7IGVsc2UgZnByaW50ZgotI2RlZmluZSBkZWJ1Z2dpbmdfcmVnaW9uIGRlYnVnX21zZ19lbmFibGVkWzYyXQotI2Vsc2UKLSNpZmRlZiBERUJVR19SRUdJT04KLSNkZWZpbmUgZHByaW50Zl9yZWdpb24gZnByaW50ZgotI2RlZmluZSBkZWJ1Z2dpbmdfcmVnaW9uIDEKLSNlbHNlCi0jZGVmaW5lIGRwcmludGZfcmVnaW9uIHdoaWxlKDApIGZwcmludGYKLSNkZWZpbmUgZGVidWdnaW5nX3JlZ2lvbiAwCi0jZW5kaWYKLSNlbmRpZgotCi0jaWZkZWYgREVCVUdfUlVOVElNRQotI2RlZmluZSBkcHJpbnRmX3JlbGF5IGlmKCFkZWJ1Z19tc2dfZW5hYmxlZFs2M10pIDsgZWxzZSBmcHJpbnRmCi0jZGVmaW5lIGRlYnVnZ2luZ19yZWxheSBkZWJ1Z19tc2dfZW5hYmxlZFs2M10KLSNlbHNlCi0jaWZkZWYgREVCVUdfUkVMQVkKLSNkZWZpbmUgZHByaW50Zl9yZWxheSBmcHJpbnRmCi0jZGVmaW5lIGRlYnVnZ2luZ19yZWxheSAxCi0jZWxzZQotI2RlZmluZSBkcHJpbnRmX3JlbGF5IHdoaWxlKDApIGZwcmludGYKLSNkZWZpbmUgZGVidWdnaW5nX3JlbGF5IDAKLSNlbmRpZgotI2VuZGlmCi0KLSNpZmRlZiBERUJVR19SVU5USU1FCi0jZGVmaW5lIGRwcmludGZfcmVzb3VyY2UgaWYoIWRlYnVnX21zZ19lbmFibGVkWzY0XSkgOyBlbHNlIGZwcmludGYKLSNkZWZpbmUgZGVidWdnaW5nX3Jlc291cmNlIGRlYnVnX21zZ19lbmFibGVkWzY0XQotI2Vsc2UKLSNpZmRlZiBERUJVR19SRVNPVVJDRQotI2RlZmluZSBkcHJpbnRmX3Jlc291cmNlIGZwcmludGYKLSNkZWZpbmUgZGVidWdnaW5nX3Jlc291cmNlIDEKLSNlbHNlCi0jZGVmaW5lIGRwcmludGZfcmVzb3VyY2Ugd2hpbGUoMCkgZnByaW50ZgotI2RlZmluZSBkZWJ1Z2dpbmdfcmVzb3VyY2UgMAotI2VuZGlmCi0jZW5kaWYKLQotI2lmZGVmIERFQlVHX1JVTlRJTUUKLSNkZWZpbmUgZHByaW50Zl9zY3JvbGwgaWYoIWRlYnVnX21zZ19lbmFibGVkWzY1XSkgOyBlbHNlIGZwcmludGYKLSNkZWZpbmUgZGVidWdnaW5nX3Njcm9sbCBkZWJ1Z19tc2dfZW5hYmxlZFs2NV0KLSNlbHNlCi0jaWZkZWYgREVCVUdfU0NST0xMCi0jZGVmaW5lIGRwcmludGZfc2Nyb2xsIGZwcmludGYKLSNkZWZpbmUgZGVidWdnaW5nX3Njcm9sbCAxCi0jZWxzZQotI2RlZmluZSBkcHJpbnRmX3Njcm9sbCB3aGlsZSgwKSBmcHJpbnRmCi0jZGVmaW5lIGRlYnVnZ2luZ19zY3JvbGwgMAotI2VuZGlmCi0jZW5kaWYKLQotI2lmZGVmIERFQlVHX1JVTlRJTUUKLSNkZWZpbmUgZHByaW50Zl9zZWxlY3RvciBpZighZGVidWdfbXNnX2VuYWJsZWRbNjZdKSA7IGVsc2UgZnByaW50ZgotI2RlZmluZSBkZWJ1Z2dpbmdfc2VsZWN0b3IgZGVidWdfbXNnX2VuYWJsZWRbNjZdCi0jZWxzZQotI2lmZGVmIERFQlVHX1NFTEVDVE9SCi0jZGVmaW5lIGRwcmludGZfc2VsZWN0b3IgZnByaW50ZgotI2RlZmluZSBkZWJ1Z2dpbmdfc2VsZWN0b3IgMQotI2Vsc2UKLSNkZWZpbmUgZHByaW50Zl9zZWxlY3RvciB3aGlsZSgwKSBmcHJpbnRmCi0jZGVmaW5lIGRlYnVnZ2luZ19zZWxlY3RvciAwCi0jZW5kaWYKLSNlbmRpZgotCi0jaWZkZWYgREVCVUdfUlVOVElNRQotI2RlZmluZSBkcHJpbnRmX3NlbSBpZighZGVidWdfbXNnX2VuYWJsZWRbNjddKSA7IGVsc2UgZnByaW50ZgotI2RlZmluZSBkZWJ1Z2dpbmdfc2VtIGRlYnVnX21zZ19lbmFibGVkWzY3XQotI2Vsc2UKLSNpZmRlZiBERUJVR19TRU0KLSNkZWZpbmUgZHByaW50Zl9zZW0gZnByaW50ZgotI2RlZmluZSBkZWJ1Z2dpbmdfc2VtIDEKLSNlbHNlCi0jZGVmaW5lIGRwcmludGZfc2VtIHdoaWxlKDApIGZwcmludGYKLSNkZWZpbmUgZGVidWdnaW5nX3NlbSAwCi0jZW5kaWYKLSNlbmRpZgotCi0jaWZkZWYgREVCVUdfUlVOVElNRQotI2RlZmluZSBkcHJpbnRmX3NlbmRtc2cgaWYoIWRlYnVnX21zZ19lbmFibGVkWzY4XSkgOyBlbHNlIGZwcmludGYKLSNkZWZpbmUgZGVidWdnaW5nX3NlbmRtc2cgZGVidWdfbXNnX2VuYWJsZWRbNjhdCi0jZWxzZQotI2lmZGVmIERFQlVHX1NFTkRNU0cKLSNkZWZpbmUgZHByaW50Zl9zZW5kbXNnIGZwcmludGYKLSNkZWZpbmUgZGVidWdnaW5nX3NlbmRtc2cgMQotI2Vsc2UKLSNkZWZpbmUgZHByaW50Zl9zZW5kbXNnIHdoaWxlKDApIGZwcmludGYKLSNkZWZpbmUgZGVidWdnaW5nX3NlbmRtc2cgMAotI2VuZGlmCi0jZW5kaWYKLQotI2lmZGVmIERFQlVHX1JVTlRJTUUKLSNkZWZpbmUgZHByaW50Zl9zaG0gaWYoIWRlYnVnX21zZ19lbmFibGVkWzY5XSkgOyBlbHNlIGZwcmludGYKLSNkZWZpbmUgZGVidWdnaW5nX3NobSBkZWJ1Z19tc2dfZW5hYmxlZFs2OV0KLSNlbHNlCi0jaWZkZWYgREVCVUdfU0hNCi0jZGVmaW5lIGRwcmludGZfc2htIGZwcmludGYKLSNkZWZpbmUgZGVidWdnaW5nX3NobSAxCi0jZWxzZQotI2RlZmluZSBkcHJpbnRmX3NobSB3aGlsZSgwKSBmcHJpbnRmCi0jZGVmaW5lIGRlYnVnZ2luZ19zaG0gMAotI2VuZGlmCi0jZW5kaWYKLQotI2lmZGVmIERFQlVHX1JVTlRJTUUKLSNkZWZpbmUgZHByaW50Zl9zdHJlc3MgaWYoIWRlYnVnX21zZ19lbmFibGVkWzcwXSkgOyBlbHNlIGZwcmludGYKLSNkZWZpbmUgZGVidWdnaW5nX3N0cmVzcyBkZWJ1Z19tc2dfZW5hYmxlZFs3MF0KLSNlbHNlCi0jaWZkZWYgREVCVUdfU1RSRVNTCi0jZGVmaW5lIGRwcmludGZfc3RyZXNzIGZwcmludGYKLSNkZWZpbmUgZGVidWdnaW5nX3N0cmVzcyAxCi0jZWxzZQotI2RlZmluZSBkcHJpbnRmX3N0cmVzcyB3aGlsZSgwKSBmcHJpbnRmCi0jZGVmaW5lIGRlYnVnZ2luZ19zdHJlc3MgMAotI2VuZGlmCi0jZW5kaWYKLQotI2lmZGVmIERFQlVHX1JVTlRJTUUKLSNkZWZpbmUgZHByaW50Zl9zdHJpbmcgaWYoIWRlYnVnX21zZ19lbmFibGVkWzcxXSkgOyBlbHNlIGZwcmludGYKLSNkZWZpbmUgZGVidWdnaW5nX3N0cmluZyBkZWJ1Z19tc2dfZW5hYmxlZFs3MV0KLSNlbHNlCi0jaWZkZWYgREVCVUdfU1RSSU5HCi0jZGVmaW5lIGRwcmludGZfc3RyaW5nIGZwcmludGYKLSNkZWZpbmUgZGVidWdnaW5nX3N0cmluZyAxCi0jZWxzZQotI2RlZmluZSBkcHJpbnRmX3N0cmluZyB3aGlsZSgwKSBmcHJpbnRmCi0jZGVmaW5lIGRlYnVnZ2luZ19zdHJpbmcgMAotI2VuZGlmCi0jZW5kaWYKLQotI2lmZGVmIERFQlVHX1JVTlRJTUUKLSNkZWZpbmUgZHByaW50Zl90YXNrIGlmKCFkZWJ1Z19tc2dfZW5hYmxlZFs3Ml0pIDsgZWxzZSBmcHJpbnRmCi0jZGVmaW5lIGRlYnVnZ2luZ190YXNrIGRlYnVnX21zZ19lbmFibGVkWzcyXQotI2Vsc2UKLSNpZmRlZiBERUJVR19UQVNLCi0jZGVmaW5lIGRwcmludGZfdGFzayBmcHJpbnRmCi0jZGVmaW5lIGRlYnVnZ2luZ190YXNrIDEKLSNlbHNlCi0jZGVmaW5lIGRwcmludGZfdGFzayB3aGlsZSgwKSBmcHJpbnRmCi0jZGVmaW5lIGRlYnVnZ2luZ190YXNrIDAKLSNlbmRpZgotI2VuZGlmCi0KLSNpZmRlZiBERUJVR19SVU5USU1FCi0jZGVmaW5lIGRwcmludGZfdGV4dCBpZighZGVidWdfbXNnX2VuYWJsZWRbNzNdKSA7IGVsc2UgZnByaW50ZgotI2RlZmluZSBkZWJ1Z2dpbmdfdGV4dCBkZWJ1Z19tc2dfZW5hYmxlZFs3M10KLSNlbHNlCi0jaWZkZWYgREVCVUdfVEVYVAotI2RlZmluZSBkcHJpbnRmX3RleHQgZnByaW50ZgotI2RlZmluZSBkZWJ1Z2dpbmdfdGV4dCAxCi0jZWxzZQotI2RlZmluZSBkcHJpbnRmX3RleHQgd2hpbGUoMCkgZnByaW50ZgotI2RlZmluZSBkZWJ1Z2dpbmdfdGV4dCAwCi0jZW5kaWYKLSNlbmRpZgotCi0jaWZkZWYgREVCVUdfUlVOVElNRQotI2RlZmluZSBkcHJpbnRmX3RodW5rIGlmKCFkZWJ1Z19tc2dfZW5hYmxlZFs3NF0pIDsgZWxzZSBmcHJpbnRmCi0jZGVmaW5lIGRlYnVnZ2luZ190aHVuayBkZWJ1Z19tc2dfZW5hYmxlZFs3NF0KLSNlbHNlCi0jaWZkZWYgREVCVUdfVEhVTksKLSNkZWZpbmUgZHByaW50Zl90aHVuayBmcHJpbnRmCi0jZGVmaW5lIGRlYnVnZ2luZ190aHVuayAxCi0jZWxzZQotI2RlZmluZSBkcHJpbnRmX3RodW5rIHdoaWxlKDApIGZwcmludGYKLSNkZWZpbmUgZGVidWdnaW5nX3RodW5rIDAKLSNlbmRpZgotI2VuZGlmCi0KLSNpZmRlZiBERUJVR19SVU5USU1FCi0jZGVmaW5lIGRwcmludGZfdGltZXIgaWYoIWRlYnVnX21zZ19lbmFibGVkWzc1XSkgOyBlbHNlIGZwcmludGYKLSNkZWZpbmUgZGVidWdnaW5nX3RpbWVyIGRlYnVnX21zZ19lbmFibGVkWzc1XQotI2Vsc2UKLSNpZmRlZiBERUJVR19USU1FUgotI2RlZmluZSBkcHJpbnRmX3RpbWVyIGZwcmludGYKLSNkZWZpbmUgZGVidWdnaW5nX3RpbWVyIDEKLSNlbHNlCi0jZGVmaW5lIGRwcmludGZfdGltZXIgd2hpbGUoMCkgZnByaW50ZgotI2RlZmluZSBkZWJ1Z2dpbmdfdGltZXIgMAotI2VuZGlmCi0jZW5kaWYKLQotI2lmZGVmIERFQlVHX1JVTlRJTUUKLSNkZWZpbmUgZHByaW50Zl90b29saGVscCBpZighZGVidWdfbXNnX2VuYWJsZWRbNzZdKSA7IGVsc2UgZnByaW50ZgotI2RlZmluZSBkZWJ1Z2dpbmdfdG9vbGhlbHAgZGVidWdfbXNnX2VuYWJsZWRbNzZdCi0jZWxzZQotI2lmZGVmIERFQlVHX1RPT0xIRUxQCi0jZGVmaW5lIGRwcmludGZfdG9vbGhlbHAgZnByaW50ZgotI2RlZmluZSBkZWJ1Z2dpbmdfdG9vbGhlbHAgMQotI2Vsc2UKLSNkZWZpbmUgZHByaW50Zl90b29saGVscCB3aGlsZSgwKSBmcHJpbnRmCi0jZGVmaW5lIGRlYnVnZ2luZ190b29saGVscCAwCi0jZW5kaWYKLSNlbmRpZgotCi0jaWZkZWYgREVCVUdfUlVOVElNRQotI2RlZmluZSBkcHJpbnRmX3R3ZWFrIGlmKCFkZWJ1Z19tc2dfZW5hYmxlZFs3N10pIDsgZWxzZSBmcHJpbnRmCi0jZGVmaW5lIGRlYnVnZ2luZ190d2VhayBkZWJ1Z19tc2dfZW5hYmxlZFs3N10KLSNlbHNlCi0jaWZkZWYgREVCVUdfVFdFQUsKLSNkZWZpbmUgZHByaW50Zl90d2VhayBmcHJpbnRmCi0jZGVmaW5lIGRlYnVnZ2luZ190d2VhayAxCi0jZWxzZQotI2RlZmluZSBkcHJpbnRmX3R3ZWFrIHdoaWxlKDApIGZwcmludGYKLSNkZWZpbmUgZGVidWdnaW5nX3R3ZWFrIDAKLSNlbmRpZgotI2VuZGlmCi0KLSNpZmRlZiBERUJVR19SVU5USU1FCi0jZGVmaW5lIGRwcmludGZfdXBkb3duIGlmKCFkZWJ1Z19tc2dfZW5hYmxlZFs3OF0pIDsgZWxzZSBmcHJpbnRmCi0jZGVmaW5lIGRlYnVnZ2luZ191cGRvd24gZGVidWdfbXNnX2VuYWJsZWRbNzhdCi0jZWxzZQotI2lmZGVmIERFQlVHX1VQRE9XTgotI2RlZmluZSBkcHJpbnRmX3VwZG93biBmcHJpbnRmCi0jZGVmaW5lIGRlYnVnZ2luZ191cGRvd24gMQotI2Vsc2UKLSNkZWZpbmUgZHByaW50Zl91cGRvd24gd2hpbGUoMCkgZnByaW50ZgotI2RlZmluZSBkZWJ1Z2dpbmdfdXBkb3duIDAKLSNlbmRpZgotI2VuZGlmCi0KLSNpZmRlZiBERUJVR19SVU5USU1FCi0jZGVmaW5lIGRwcmludGZfdmVyIGlmKCFkZWJ1Z19tc2dfZW5hYmxlZFs3OV0pIDsgZWxzZSBmcHJpbnRmCi0jZGVmaW5lIGRlYnVnZ2luZ192ZXIgZGVidWdfbXNnX2VuYWJsZWRbNzldCi0jZWxzZQotI2lmZGVmIERFQlVHX1ZFUgotI2RlZmluZSBkcHJpbnRmX3ZlciBmcHJpbnRmCi0jZGVmaW5lIGRlYnVnZ2luZ192ZXIgMQotI2Vsc2UKLSNkZWZpbmUgZHByaW50Zl92ZXIgd2hpbGUoMCkgZnByaW50ZgotI2RlZmluZSBkZWJ1Z2dpbmdfdmVyIDAKLSNlbmRpZgotI2VuZGlmCi0KLSNpZmRlZiBERUJVR19SVU5USU1FCi0jZGVmaW5lIGRwcmludGZfdmlydHVhbCBpZighZGVidWdfbXNnX2VuYWJsZWRbODBdKSA7IGVsc2UgZnByaW50ZgotI2RlZmluZSBkZWJ1Z2dpbmdfdmlydHVhbCBkZWJ1Z19tc2dfZW5hYmxlZFs4MF0KLSNlbHNlCi0jaWZkZWYgREVCVUdfVklSVFVBTAotI2RlZmluZSBkcHJpbnRmX3ZpcnR1YWwgZnByaW50ZgotI2RlZmluZSBkZWJ1Z2dpbmdfdmlydHVhbCAxCi0jZWxzZQotI2RlZmluZSBkcHJpbnRmX3ZpcnR1YWwgd2hpbGUoMCkgZnByaW50ZgotI2RlZmluZSBkZWJ1Z2dpbmdfdmlydHVhbCAwCi0jZW5kaWYKLSNlbmRpZgotCi0jaWZkZWYgREVCVUdfUlVOVElNRQotI2RlZmluZSBkcHJpbnRmX3Z4ZCBpZighZGVidWdfbXNnX2VuYWJsZWRbODFdKSA7IGVsc2UgZnByaW50ZgotI2RlZmluZSBkZWJ1Z2dpbmdfdnhkIGRlYnVnX21zZ19lbmFibGVkWzgxXQotI2Vsc2UKLSNpZmRlZiBERUJVR19WWEQKLSNkZWZpbmUgZHByaW50Zl92eGQgZnByaW50ZgotI2RlZmluZSBkZWJ1Z2dpbmdfdnhkIDEKLSNlbHNlCi0jZGVmaW5lIGRwcmludGZfdnhkIHdoaWxlKDApIGZwcmludGYKLSNkZWZpbmUgZGVidWdnaW5nX3Z4ZCAwCi0jZW5kaWYKLSNlbmRpZgotCi0jaWZkZWYgREVCVUdfUlVOVElNRQotI2RlZmluZSBkcHJpbnRmX3dpbiBpZighZGVidWdfbXNnX2VuYWJsZWRbODJdKSA7IGVsc2UgZnByaW50ZgotI2RlZmluZSBkZWJ1Z2dpbmdfd2luIGRlYnVnX21zZ19lbmFibGVkWzgyXQotI2Vsc2UKLSNpZmRlZiBERUJVR19XSU4KLSNkZWZpbmUgZHByaW50Zl93aW4gZnByaW50ZgotI2RlZmluZSBkZWJ1Z2dpbmdfd2luIDEKLSNlbHNlCi0jZGVmaW5lIGRwcmludGZfd2luIHdoaWxlKDApIGZwcmludGYKLSNkZWZpbmUgZGVidWdnaW5nX3dpbiAwCi0jZW5kaWYKLSNlbmRpZgotCi0jaWZkZWYgREVCVUdfUlVOVElNRQotI2RlZmluZSBkcHJpbnRmX3dpbjE2ZHJ2IGlmKCFkZWJ1Z19tc2dfZW5hYmxlZFs4M10pIDsgZWxzZSBmcHJpbnRmCi0jZGVmaW5lIGRlYnVnZ2luZ193aW4xNmRydiBkZWJ1Z19tc2dfZW5hYmxlZFs4M10KLSNlbHNlCi0jaWZkZWYgREVCVUdfV0lOMTZEUlYKLSNkZWZpbmUgZHByaW50Zl93aW4xNmRydiBmcHJpbnRmCi0jZGVmaW5lIGRlYnVnZ2luZ193aW4xNmRydiAxCi0jZWxzZQotI2RlZmluZSBkcHJpbnRmX3dpbjE2ZHJ2IHdoaWxlKDApIGZwcmludGYKLSNkZWZpbmUgZGVidWdnaW5nX3dpbjE2ZHJ2IDAKLSNlbmRpZgotI2VuZGlmCi0KLSNpZmRlZiBERUJVR19SVU5USU1FCi0jZGVmaW5lIGRwcmludGZfd2luMzIgaWYoIWRlYnVnX21zZ19lbmFibGVkWzg0XSkgOyBlbHNlIGZwcmludGYKLSNkZWZpbmUgZGVidWdnaW5nX3dpbjMyIGRlYnVnX21zZ19lbmFibGVkWzg0XQotI2Vsc2UKLSNpZmRlZiBERUJVR19XSU4zMgotI2RlZmluZSBkcHJpbnRmX3dpbjMyIGZwcmludGYKLSNkZWZpbmUgZGVidWdnaW5nX3dpbjMyIDEKLSNlbHNlCi0jZGVmaW5lIGRwcmludGZfd2luMzIgd2hpbGUoMCkgZnByaW50ZgotI2RlZmluZSBkZWJ1Z2dpbmdfd2luMzIgMAotI2VuZGlmCi0jZW5kaWYKLQotI2lmZGVmIERFQlVHX1JVTlRJTUUKLSNkZWZpbmUgZHByaW50Zl93aW5zb2NrIGlmKCFkZWJ1Z19tc2dfZW5hYmxlZFs4NV0pIDsgZWxzZSBmcHJpbnRmCi0jZGVmaW5lIGRlYnVnZ2luZ193aW5zb2NrIGRlYnVnX21zZ19lbmFibGVkWzg1XQotI2Vsc2UKLSNpZmRlZiBERUJVR19XSU5TT0NLCi0jZGVmaW5lIGRwcmludGZfd2luc29jayBmcHJpbnRmCi0jZGVmaW5lIGRlYnVnZ2luZ193aW5zb2NrIDEKLSNlbHNlCi0jZGVmaW5lIGRwcmludGZfd2luc29jayB3aGlsZSgwKSBmcHJpbnRmCi0jZGVmaW5lIGRlYnVnZ2luZ193aW5zb2NrIDAKLSNlbmRpZgotI2VuZGlmCi0KLSNpZmRlZiBERUJVR19SVU5USU1FCi0jZGVmaW5lIGRwcmludGZfeDExIGlmKCFkZWJ1Z19tc2dfZW5hYmxlZFs4Nl0pIDsgZWxzZSBmcHJpbnRmCi0jZGVmaW5lIGRlYnVnZ2luZ194MTEgZGVidWdfbXNnX2VuYWJsZWRbODZdCi0jZWxzZQotI2lmZGVmIERFQlVHX1gxMQotI2RlZmluZSBkcHJpbnRmX3gxMSBmcHJpbnRmCi0jZGVmaW5lIGRlYnVnZ2luZ194MTEgMQotI2Vsc2UKLSNkZWZpbmUgZHByaW50Zl94MTEgd2hpbGUoMCkgZnByaW50ZgotI2RlZmluZSBkZWJ1Z2dpbmdfeDExIDAKLSNlbmRpZgotI2VuZGlmCi0KLQotI2lmZGVmIERFQlVHX1JVTlRJTUUKLSNpZmRlZiBERUJVR19ERUZJTkVfVkFSSUFCTEVTCi1zdGF0aWMgY2hhciAqZGVidWdfbXNnX25hbWVbXSA9IHsKLSAgICAiYWNjZWwiLAotICAgICJhc3BpIiwKLSAgICAiYXRvbSIsCi0gICAgImJpdGJsdCIsCi0gICAgImJpdG1hcCIsCi0gICAgImNhcmV0IiwKLSAgICAiY2RhdWRpbyIsCi0gICAgImNsYXNzIiwKLSAgICAiY2xpcGJvYXJkIiwKLSAgICAiY2xpcHBpbmciLAotICAgICJjb21ibyIsCi0gICAgImNvbW0iLAotICAgICJjb21tZGxnIiwKLSAgICAiY3J0ZGxsIiwKLSAgICAiY3Vyc29yIiwKLSAgICAiZGMiLAotICAgICJkZGUiLAotICAgICJkZHJhdyIsCi0gICAgImRpYWxvZyIsCi0gICAgImRsbCIsCi0gICAgImRvc2ZzIiwKLSAgICAiZHJpdmVyIiwKLSAgICAiZHNvdW5kIiwKLSAgICAiZWRpdCIsCi0gICAgImV2ZW50IiwKLSAgICAiZXhlYyIsCi0gICAgImZpbGUiLAotICAgICJmaXh1cCIsCi0gICAgImZvbnQiLAotICAgICJnZGkiLAotICAgICJnbG9iYWwiLAotICAgICJncmFwaGljcyIsCi0gICAgImhlYXAiLAotICAgICJob29rIiwKLSAgICAiaWNvbiIsCi0gICAgImludCIsCi0gICAgImtleSIsCi0gICAgImtleWJvYXJkIiwKLSAgICAibGR0IiwKLSAgICAibGlzdGJveCIsCi0gICAgImxvY2FsIiwKLSAgICAibWNpIiwKLSAgICAibWNpYW5pbSIsCi0gICAgIm1jaXdhdmUiLAotICAgICJtZGkiLAotICAgICJtZW51IiwKLSAgICAibWVzc2FnZSIsCi0gICAgIm1ldGFmaWxlIiwKLSAgICAibWlkaSIsCi0gICAgIm1tYXV4IiwKLSAgICAibW1pbyIsCi0gICAgIm1tc3lzIiwKLSAgICAibW10aW1lIiwKLSAgICAibW9kdWxlIiwKLSAgICAibXNnIiwKLSAgICAibm9uY2xpZW50IiwKLSAgICAib2xlIiwKLSAgICAicGFsZXR0ZSIsCi0gICAgInByb2ZpbGUiLAotICAgICJwcm9ncmVzcyIsCi0gICAgInByb3AiLAotICAgICJyZWciLAotICAgICJyZWdpb24iLAotICAgICJyZWxheSIsCi0gICAgInJlc291cmNlIiwKLSAgICAic2Nyb2xsIiwKLSAgICAic2VsZWN0b3IiLAotICAgICJzZW0iLAotICAgICJzZW5kbXNnIiwKLSAgICAic2htIiwKLSAgICAic3RyZXNzIiwKLSAgICAic3RyaW5nIiwKLSAgICAidGFzayIsCi0gICAgInRleHQiLAotICAgICJ0aHVuayIsCi0gICAgInRpbWVyIiwKLSAgICAidG9vbGhlbHAiLAotICAgICJ0d2VhayIsCi0gICAgInVwZG93biIsCi0gICAgInZlciIsCi0gICAgInZpcnR1YWwiLAotICAgICJ2eGQiLAotICAgICJ3aW4iLAotICAgICJ3aW4xNmRydiIsCi0gICAgIndpbjMyIiwKLSAgICAid2luc29jayIsCi0gICAgIngxMSIsCi0gICAgIiIKLX07Ci0jZW5kaWYKLSNlbmRpZgorI2RlZmluZSBkYmNoX2FjY2VsIDAKKyNkZWZpbmUgZGJjaF9hc3BpIDEKKyNkZWZpbmUgZGJjaF9hdG9tIDIKKyNkZWZpbmUgZGJjaF9iaXRibHQgMworI2RlZmluZSBkYmNoX2JpdG1hcCA0CisjZGVmaW5lIGRiY2hfY2FyZXQgNQorI2RlZmluZSBkYmNoX2NkYXVkaW8gNgorI2RlZmluZSBkYmNoX2NsYXNzIDcKKyNkZWZpbmUgZGJjaF9jbGlwYm9hcmQgOAorI2RlZmluZSBkYmNoX2NsaXBwaW5nIDkKKyNkZWZpbmUgZGJjaF9jb21ibyAxMAorI2RlZmluZSBkYmNoX2NvbW0gMTEKKyNkZWZpbmUgZGJjaF9jb21tZGxnIDEyCisjZGVmaW5lIGRiY2hfY29uc29sZSAxMworI2RlZmluZSBkYmNoX2NydGRsbCAxNAorI2RlZmluZSBkYmNoX2N1cnNvciAxNQorI2RlZmluZSBkYmNoX2RjIDE2CisjZGVmaW5lIGRiY2hfZGRlIDE3CisjZGVmaW5lIGRiY2hfZGRyYXcgMTgKKyNkZWZpbmUgZGJjaF9kaWFsb2cgMTkKKyNkZWZpbmUgZGJjaF9kbGwgMjAKKyNkZWZpbmUgZGJjaF9kb3NmcyAyMQorI2RlZmluZSBkYmNoX2RyaXZlciAyMgorI2RlZmluZSBkYmNoX2Rzb3VuZCAyMworI2RlZmluZSBkYmNoX2VkaXQgMjQKKyNkZWZpbmUgZGJjaF9ldmVudCAyNQorI2RlZmluZSBkYmNoX2V4ZWMgMjYKKyNkZWZpbmUgZGJjaF9maWxlIDI3CisjZGVmaW5lIGRiY2hfZml4dXAgMjgKKyNkZWZpbmUgZGJjaF9mb250IDI5CisjZGVmaW5lIGRiY2hfZ2RpIDMwCisjZGVmaW5lIGRiY2hfZ2xvYmFsIDMxCisjZGVmaW5lIGRiY2hfZ3JhcGhpY3MgMzIKKyNkZWZpbmUgZGJjaF9oZWFwIDMzCisjZGVmaW5lIGRiY2hfaG9vayAzNAorI2RlZmluZSBkYmNoX2ljb24gMzUKKyNkZWZpbmUgZGJjaF9pbnQgMzYKKyNkZWZpbmUgZGJjaF9rZXkgMzcKKyNkZWZpbmUgZGJjaF9rZXlib2FyZCAzOAorI2RlZmluZSBkYmNoX2xkdCAzOQorI2RlZmluZSBkYmNoX2xpc3Rib3ggNDAKKyNkZWZpbmUgZGJjaF9sb2NhbCA0MQorI2RlZmluZSBkYmNoX21jaSA0MgorI2RlZmluZSBkYmNoX21jaWFuaW0gNDMKKyNkZWZpbmUgZGJjaF9tY2l3YXZlIDQ0CisjZGVmaW5lIGRiY2hfbWRpIDQ1CisjZGVmaW5lIGRiY2hfbWVudSA0NgorI2RlZmluZSBkYmNoX21lc3NhZ2UgNDcKKyNkZWZpbmUgZGJjaF9tZXRhZmlsZSA0OAorI2RlZmluZSBkYmNoX21pZGkgNDkKKyNkZWZpbmUgZGJjaF9tbWF1eCA1MAorI2RlZmluZSBkYmNoX21taW8gNTEKKyNkZWZpbmUgZGJjaF9tbXN5cyA1MgorI2RlZmluZSBkYmNoX21tdGltZSA1MworI2RlZmluZSBkYmNoX21vZHVsZSA1NAorI2RlZmluZSBkYmNoX21zZyA1NQorI2RlZmluZSBkYmNoX25vbmNsaWVudCA1NgorI2RlZmluZSBkYmNoX29sZSA1NworI2RlZmluZSBkYmNoX3BhbGV0dGUgNTgKKyNkZWZpbmUgZGJjaF9wcm9maWxlIDU5CisjZGVmaW5lIGRiY2hfcHJvZ3Jlc3MgNjAKKyNkZWZpbmUgZGJjaF9wcm9wIDYxCisjZGVmaW5lIGRiY2hfcmVnIDYyCisjZGVmaW5lIGRiY2hfcmVnaW9uIDYzCisjZGVmaW5lIGRiY2hfcmVsYXkgNjQKKyNkZWZpbmUgZGJjaF9yZXNvdXJjZSA2NQorI2RlZmluZSBkYmNoX3Njcm9sbCA2NgorI2RlZmluZSBkYmNoX3NlbGVjdG9yIDY3CisjZGVmaW5lIGRiY2hfc2VtIDY4CisjZGVmaW5lIGRiY2hfc2VuZG1zZyA2OQorI2RlZmluZSBkYmNoX3NobSA3MAorI2RlZmluZSBkYmNoX3N0ZGRlYiA3MQorI2RlZmluZSBkYmNoX3N0cmVzcyA3MgorI2RlZmluZSBkYmNoX3N0cmluZyA3MworI2RlZmluZSBkYmNoX3Rhc2sgNzQKKyNkZWZpbmUgZGJjaF90ZXh0IDc1CisjZGVmaW5lIGRiY2hfdGh1bmsgNzYKKyNkZWZpbmUgZGJjaF90aW1lciA3NworI2RlZmluZSBkYmNoX3Rvb2xoZWxwIDc4CisjZGVmaW5lIGRiY2hfdHdlYWsgNzkKKyNkZWZpbmUgZGJjaF91cGRvd24gODAKKyNkZWZpbmUgZGJjaF92ZXIgODEKKyNkZWZpbmUgZGJjaF92aXJ0dWFsIDgyCisjZGVmaW5lIGRiY2hfdnhkIDgzCisjZGVmaW5lIGRiY2hfd2luIDg0CisjZGVmaW5lIGRiY2hfd2luMTZkcnYgODUKKyNkZWZpbmUgZGJjaF93aW4zMiA4NgorI2RlZmluZSBkYmNoX3dpbnNvY2sgODcKKyNkZWZpbmUgZGJjaF94MTEgODgKZGlmZiAtLWdpdCBhL2luY2x1ZGUvZGVidWdkZWZzLmggYi9pbmNsdWRlL2RlYnVnZGVmcy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmVmYTYzNzEKLS0tIC9kZXYvbnVsbAorKysgYi9pbmNsdWRlL2RlYnVnZGVmcy5oCkBAIC0wLDAgKzEsMTk3IEBACisvKiBEbyBub3QgbW9kaWZ5IHRoaXMgZmlsZSAtLSBpdCBpcyBhdXRvbWF0aWNhbGx5IGdlbmVyYXRlZCEgKi8KKworI2lmbmRlZiBfX0RFQlVHVE9PTFNfSAorI2luY2x1ZGUgImRlYnVndG9vbHMuaCIKKyNlbmRpZgorCisjZGVmaW5lIERFQlVHX0NIQU5ORUxfQ09VTlQgODkKKyNpZmRlZiBERUJVR19SVU5USU1FCitzaG9ydCBkZWJ1Z19tc2dfZW5hYmxlZFtdW0RFQlVHX0NMQVNTX0NPVU5UXSA9IHsKK3sxLCAxLCAwLCAwfSwKK3sxLCAxLCAwLCAwfSwKK3sxLCAxLCAwLCAwfSwKK3sxLCAxLCAwLCAwfSwKK3sxLCAxLCAwLCAwfSwKK3sxLCAxLCAwLCAwfSwKK3sxLCAxLCAwLCAwfSwKK3sxLCAxLCAwLCAwfSwKK3sxLCAxLCAwLCAwfSwKK3sxLCAxLCAwLCAwfSwKK3sxLCAxLCAwLCAwfSwKK3sxLCAxLCAwLCAwfSwKK3sxLCAxLCAwLCAwfSwKK3sxLCAxLCAwLCAwfSwKK3sxLCAxLCAwLCAwfSwKK3sxLCAxLCAwLCAwfSwKK3sxLCAxLCAwLCAwfSwKK3sxLCAxLCAwLCAwfSwKK3sxLCAxLCAwLCAwfSwKK3sxLCAxLCAwLCAwfSwKK3sxLCAxLCAwLCAwfSwKK3sxLCAxLCAwLCAwfSwKK3sxLCAxLCAwLCAwfSwKK3sxLCAxLCAwLCAwfSwKK3sxLCAxLCAwLCAwfSwKK3sxLCAxLCAwLCAwfSwKK3sxLCAxLCAwLCAwfSwKK3sxLCAxLCAwLCAwfSwKK3sxLCAxLCAwLCAwfSwKK3sxLCAxLCAwLCAwfSwKK3sxLCAxLCAwLCAwfSwKK3sxLCAxLCAwLCAwfSwKK3sxLCAxLCAwLCAwfSwKK3sxLCAxLCAwLCAwfSwKK3sxLCAxLCAwLCAwfSwKK3sxLCAxLCAwLCAwfSwKK3sxLCAxLCAwLCAwfSwKK3sxLCAxLCAwLCAwfSwKK3sxLCAxLCAwLCAwfSwKK3sxLCAxLCAwLCAwfSwKK3sxLCAxLCAwLCAwfSwKK3sxLCAxLCAwLCAwfSwKK3sxLCAxLCAwLCAwfSwKK3sxLCAxLCAwLCAwfSwKK3sxLCAxLCAwLCAwfSwKK3sxLCAxLCAwLCAwfSwKK3sxLCAxLCAwLCAwfSwKK3sxLCAxLCAwLCAwfSwKK3sxLCAxLCAwLCAwfSwKK3sxLCAxLCAwLCAwfSwKK3sxLCAxLCAwLCAwfSwKK3sxLCAxLCAwLCAwfSwKK3sxLCAxLCAwLCAwfSwKK3sxLCAxLCAwLCAwfSwKK3sxLCAxLCAwLCAwfSwKK3sxLCAxLCAwLCAwfSwKK3sxLCAxLCAwLCAwfSwKK3sxLCAxLCAwLCAwfSwKK3sxLCAxLCAwLCAwfSwKK3sxLCAxLCAwLCAwfSwKK3sxLCAxLCAwLCAwfSwKK3sxLCAxLCAwLCAwfSwKK3sxLCAxLCAwLCAwfSwKK3sxLCAxLCAwLCAwfSwKK3sxLCAxLCAwLCAwfSwKK3sxLCAxLCAwLCAwfSwKK3sxLCAxLCAwLCAwfSwKK3sxLCAxLCAwLCAwfSwKK3sxLCAxLCAwLCAwfSwKK3sxLCAxLCAwLCAwfSwKK3sxLCAxLCAwLCAwfSwKK3sxLCAxLCAwLCAwfSwKK3sxLCAxLCAwLCAwfSwKK3sxLCAxLCAwLCAwfSwKK3sxLCAxLCAwLCAwfSwKK3sxLCAxLCAwLCAwfSwKK3sxLCAxLCAwLCAwfSwKK3sxLCAxLCAwLCAwfSwKK3sxLCAxLCAwLCAwfSwKK3sxLCAxLCAwLCAwfSwKK3sxLCAxLCAwLCAwfSwKK3sxLCAxLCAwLCAwfSwKK3sxLCAxLCAwLCAwfSwKK3sxLCAxLCAwLCAwfSwKK3sxLCAxLCAwLCAwfSwKK3sxLCAxLCAwLCAwfSwKK3sxLCAxLCAwLCAwfSwKK3sxLCAxLCAwLCAwfSwKK3sxLCAxLCAwLCAwfSwKK307Citjb25zdCBjaGFyKiBkZWJ1Z19jaF9uYW1lW10gPSB7CisiYWNjZWwiLAorImFzcGkiLAorImF0b20iLAorImJpdGJsdCIsCisiYml0bWFwIiwKKyJjYXJldCIsCisiY2RhdWRpbyIsCisiY2xhc3MiLAorImNsaXBib2FyZCIsCisiY2xpcHBpbmciLAorImNvbWJvIiwKKyJjb21tIiwKKyJjb21tZGxnIiwKKyJjb25zb2xlIiwKKyJjcnRkbGwiLAorImN1cnNvciIsCisiZGMiLAorImRkZSIsCisiZGRyYXciLAorImRpYWxvZyIsCisiZGxsIiwKKyJkb3NmcyIsCisiZHJpdmVyIiwKKyJkc291bmQiLAorImVkaXQiLAorImV2ZW50IiwKKyJleGVjIiwKKyJmaWxlIiwKKyJmaXh1cCIsCisiZm9udCIsCisiZ2RpIiwKKyJnbG9iYWwiLAorImdyYXBoaWNzIiwKKyJoZWFwIiwKKyJob29rIiwKKyJpY29uIiwKKyJpbnQiLAorImtleSIsCisia2V5Ym9hcmQiLAorImxkdCIsCisibGlzdGJveCIsCisibG9jYWwiLAorIm1jaSIsCisibWNpYW5pbSIsCisibWNpd2F2ZSIsCisibWRpIiwKKyJtZW51IiwKKyJtZXNzYWdlIiwKKyJtZXRhZmlsZSIsCisibWlkaSIsCisibW1hdXgiLAorIm1taW8iLAorIm1tc3lzIiwKKyJtbXRpbWUiLAorIm1vZHVsZSIsCisibXNnIiwKKyJub25jbGllbnQiLAorIm9sZSIsCisicGFsZXR0ZSIsCisicHJvZmlsZSIsCisicHJvZ3Jlc3MiLAorInByb3AiLAorInJlZyIsCisicmVnaW9uIiwKKyJyZWxheSIsCisicmVzb3VyY2UiLAorInNjcm9sbCIsCisic2VsZWN0b3IiLAorInNlbSIsCisic2VuZG1zZyIsCisic2htIiwKKyJzdGRkZWIiLAorInN0cmVzcyIsCisic3RyaW5nIiwKKyJ0YXNrIiwKKyJ0ZXh0IiwKKyJ0aHVuayIsCisidGltZXIiLAorInRvb2xoZWxwIiwKKyJ0d2VhayIsCisidXBkb3duIiwKKyJ2ZXIiLAorInZpcnR1YWwiLAorInZ4ZCIsCisid2luIiwKKyJ3aW4xNmRydiIsCisid2luMzIiLAorIndpbnNvY2siLAorIngxMSIsCit9OworCitjb25zdCBjaGFyKiBkZWJ1Z19jbF9uYW1lW10gPQoreyAiZml4bWUiLCAiZXJyIiwgIndhcm4iLCAiaW5mbyIgfTsKKworI2VuZGlmIC8qREVCVUdfUlVOVElNRSovCisKKy8qIGVuZCBvZiBhdXRvbWF0aWNhbGx5IGdlbmVyYXRlZCBkZWJ1Zy5oICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL2RlYnVnc3RyLmggYi9pbmNsdWRlL2RlYnVnc3RyLmgKaW5kZXggMjBhYzg2NS4uN2JiMzk5NiAxMDA2NDQKLS0tIGEvaW5jbHVkZS9kZWJ1Z3N0ci5oCisrKyBiL2luY2x1ZGUvZGVidWdzdHIuaApAQCAtMTEsNSArMTEsOCBAQAogTFBTVFIgZGVidWdzdHJfYSAoTFBDU1RSIHMpOwogTFBTVFIgZGVidWdzdHJfd24gKExQQ1dTVFIgcywgaW50IG4pOwogTFBTVFIgZGVidWdzdHJfdyAoTFBDV1NUUiBzKTsKK0xQU1RSIGRlYnVncmVzIChjb25zdCB2b2lkICpyZXMpOwogCiAjZW5kaWYgLyogX19XSU5FX0RFQlVHU1RSX0ggKi8KKworCmRpZmYgLS1naXQgYS9pbmNsdWRlL2RlYnVndG9vbHMuaCBiL2luY2x1ZGUvZGVidWd0b29scy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjM5M2RkMjUKLS0tIC9kZXYvbnVsbAorKysgYi9pbmNsdWRlL2RlYnVndG9vbHMuaApAQCAtMCwwICsxLDY2IEBACisKKyNpZm5kZWYgX19ERUJVR1RPT0xTX0gKKyNkZWZpbmUgX19ERUJVR1RPT0xTX0gKKworI2luY2x1ZGUgPHN0ZGlvLmg+CisKKyNkZWZpbmUgREVCVUdfUlVOVElNRQorI2RlZmluZSBzdGRkZWIgIHN0ZG91dAorI2RlZmluZSBzdGRuaW1wIHN0ZG91dAorCisjZGVmaW5lIERFQlVHX0NMQVNTX0NPVU5UIDQKKworZXh0ZXJuIHNob3J0IGRlYnVnX21zZ19lbmFibGVkW11bREVCVUdfQ0xBU1NfQ09VTlRdOworZXh0ZXJuIGNvbnN0IGNoYXIqIGRlYnVnX2NoX25hbWVbXTsKK2V4dGVybiBjb25zdCBjaGFyKiBkZWJ1Z19jbF9uYW1lW107CisKKyNkZWZpbmUgZGJnX3N0cihuYW1lKSBkZWJ1Z19zdHJfIyNuYW1lCisjZGVmaW5lIGRiZ19idWYobmFtZSkgZGVidWdfYnVmXyMjbmFtZQorCisjZGVmaW5lIGRiZ19kZWNsX3N0cihuYW1lLCBzaXplKSBcCisgIGNoYXIgZGJnX3N0cihuYW1lKVtzaXplXSwgKmRiZ19idWYobmFtZSk9ZGJnX3N0cihuYW1lKQorCisjZGVmaW5lIGRiZ19yZXNldF9zdHIobmFtZSkgXAorICBkYmdfYnVmKG5hbWUpPWRiZ19zdHIobmFtZSkKKworI2RlZmluZSBkc3ByaW50ZihuYW1lLCBmb3JtYXQsIGFyZ3MuLi4pIFwKKyAgZGJnX2J1ZihuYW1lKSs9c3ByaW50ZihkYmdfYnVmKG5hbWUpLCBmb3JtYXQsICMjIGFyZ3MpCisKKyNkZWZpbmUgZGJnX2NoX2luZGV4KGNoKSAoZGJjaF8jI2NoKQorI2RlZmluZSBkYmdfY2xfaW5kZXgoY2wpIChkYmNsXyMjY2wpCisKKyNkZWZpbmUgZGVidWdnaW5nXyhjbCwgY2gpIFwKKyAgKGRiZ19jaF9pbmRleChjaCkgPj0wICYmIGRiZ19jbF9pbmRleChjbCkgPj0gMCAmJiBcCisgICBkZWJ1Z19tc2dfZW5hYmxlZFtkYmdfY2hfaW5kZXgoY2gpXVtkYmdfY2xfaW5kZXgoY2wpXSkKKworI2RlZmluZSBkcHJpbnRmKGZvcm1hdCwgYXJncy4uLikgXAorICBmcHJpbnRmKHN0ZGRlYiwgZm9ybWF0LCAjIyBhcmdzKQorCisjZGVmaW5lIGRwcmludGZfKGNsLCBjaCwgZm9ybWF0LCBhcmdzLi4uKSBcCisgICAgICAgICAgICBpZighZGVidWdnaW5nXyhjbCwgY2gpKSA7IFwKKyAgICAgICAgICAgIGVsc2UgZHByaW50ZigiJXM6JXM6JXM6JWQ6JXM6ICJmb3JtYXQsIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICBkZWJ1Z19jbF9uYW1lW2RiZ19jbF9pbmRleChjbCldLCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgZGVidWdfY2hfbmFtZVtkYmdfY2hfaW5kZXgoY2gpXSwgXAorCSAgICAgICAgICAgICAgICAgX19GSUxFX18sIF9fTElORV9fLCBfX0ZVTkNUSU9OX18gLCAjIyBhcmdzKQorCisKKworI2RlZmluZSBkZWJ1Z2dpbmdfZml4bWUoY2gpIGRlYnVnZ2luZ18oZml4bWUsIGNoKQorI2RlZmluZSBkZWJ1Z2dpbmdfZXJyKGNoKSBkZWJ1Z2dpbmdfKGVyciwgY2gpCisjZGVmaW5lIGRlYnVnZ2luZ193YXJuKGNoKSBkZWJ1Z2dpbmdfKHdhcm4sIGNoKQorI2RlZmluZSBkZWJ1Z2dpbmdfaW5mbyhjaCkgZGVidWdnaW5nXyhpbmZvLCBjaCkKKworI2RlZmluZSBkcHJpbnRmX2ZpeG1lKGNoLCBmb3JtYXQsIGFyZ3MuLi4pIGRwcmludGZfKGZpeG1lLCBjaCwgZm9ybWF0LCAjIyBhcmdzKQorI2RlZmluZSBkcHJpbnRmX2VycihjaCwgZm9ybWF0LCBhcmdzLi4uKSBkcHJpbnRmXyhlcnIsIGNoLCBmb3JtYXQsICMjIGFyZ3MpCisjZGVmaW5lIGRwcmludGZfd2FybihjaCwgZm9ybWF0LCBhcmdzLi4uKSBkcHJpbnRmXyh3YXJuLCBjaCwgZm9ybWF0LCAjIyBhcmdzKQorI2RlZmluZSBkcHJpbnRmX2luZm8oY2gsIGZvcm1hdCwgYXJncy4uLikgZHByaW50Zl8oaW5mbywgY2gsIGZvcm1hdCwgIyMgYXJncykKKworI2RlZmluZSBkYmNsX2ZpeG1lIDAKKyNkZWZpbmUgZGJjbF9lcnIgICAxCisjZGVmaW5lIGRiY2xfd2FybiAgMgorI2RlZmluZSBkYmNsX2luZm8gIDMKKworI2VuZGlmCisKKworCmRpZmYgLS1naXQgYS9pbmNsdWRlL2RpbnB1dC5oIGIvaW5jbHVkZS9kaW5wdXQuaAppbmRleCA1NjNjN2UxLi5kMTAzZTdiIDEwMDY0NAotLS0gYS9pbmNsdWRlL2RpbnB1dC5oCisrKyBiL2luY2x1ZGUvZGlucHV0LmgKQEAgLTU4LDYgKzU4LDYzIEBACiAKIHR5cGVkZWYgc3RydWN0IElEaXJlY3RJbnB1dDMyQSBJRGlyZWN0SW5wdXQzMkEsKkxQRElSRUNUSU5QVVQzMkE7CiB0eXBlZGVmIHN0cnVjdCBJRGlyZWN0SW5wdXREZXZpY2UzMkEgSURpcmVjdElucHV0RGV2aWNlMzJBLCpMUERJUkVDVElOUFVUREVWSUNFMzJBOwordHlwZWRlZiBzdHJ1Y3QgU3lzS2V5Ym9hcmQzMkEgU3lzS2V5Ym9hcmQzMkEsKkxQU1lTS0VZQk9BUkQzMkE7CisKKyNkZWZpbmUgRElfT0sgICAgICAgICAgICAgICAgICAgICAgICAgICBTX09LCisjZGVmaW5lIERJX05PVEFUVEFDSEVEICAgICAgICAgICAgICAgICAgU19GQUxTRQorI2RlZmluZSBESV9CVUZGRVJPVkVSRkxPVyAgICAgICAgICAgICAgIFNfRkFMU0UKKyNkZWZpbmUgRElfUFJPUE5PRUZGRUNUICAgICAgICAgICAgICAgICBTX0ZBTFNFCisjZGVmaW5lIERJX05PRUZGRUNUICAgICAgICAgICAgICAgICAgICAgU19GQUxTRQorI2RlZmluZSBESV9QT0xMRURERVZJQ0UgICAgICAgICAgICAgICAgICgoSFJFU1VMVCkweDAwMDAwMDAyTCkKKyNkZWZpbmUgRElfRE9XTkxPQURTS0lQUEVEICAgICAgICAgICAgICAoKEhSRVNVTFQpMHgwMDAwMDAwM0wpCisjZGVmaW5lIERJX0VGRkVDVFJFU1RBUlRFRCAgICAgICAgICAgICAgKChIUkVTVUxUKTB4MDAwMDAwMDRMKQorI2RlZmluZSBESV9UUlVOQ0FURUQgICAgICAgICAgICAgICAgICAgICgoSFJFU1VMVCkweDAwMDAwMDA4TCkKKyNkZWZpbmUgRElfVFJVTkNBVEVEQU5EUkVTVEFSVEVEICAgICAgICAoKEhSRVNVTFQpMHgwMDAwMDAwQ0wpCisKKyNkZWZpbmUgRElFUlJfT0xERElSRUNUSU5QVVRWRVJTSU9OICAgICBcCisgICAgTUFLRV9IUkVTVUxUKFNFVkVSSVRZX0VSUk9SLCBGQUNJTElUWV9XSU4zMiwgRVJST1JfT0xEX1dJTl9WRVJTSU9OKQorI2RlZmluZSBESUVSUl9CRVRBRElSRUNUSU5QVVRWRVJTSU9OICAgIFwKKyAgICBNQUtFX0hSRVNVTFQoU0VWRVJJVFlfRVJST1IsIEZBQ0lMSVRZX1dJTjMyLCBFUlJPUl9STU9ERV9BUFApCisjZGVmaW5lIERJRVJSX0JBRERSSVZFUlZFUiAgICAgICAgICAgICAgXAorICAgIE1BS0VfSFJFU1VMVChTRVZFUklUWV9FUlJPUiwgRkFDSUxJVFlfV0lOMzIsIEVSUk9SX0JBRF9EUklWRVJfTEVWRUwpCisjZGVmaW5lIERJRVJSX0RFVklDRU5PVFJFRyAgICAgICAgICAgICAgUkVHREJfRV9DTEFTU05PVFJFRworI2RlZmluZSBESUVSUl9OT1RGT1VORCAgICAgICAgICAgICAgICAgIFwKKyAgICBNQUtFX0hSRVNVTFQoU0VWRVJJVFlfRVJST1IsIEZBQ0lMSVRZX1dJTjMyLCBFUlJPUl9GSUxFX05PVF9GT1VORCkKKyNkZWZpbmUgRElFUlJfT0JKRUNUTk9URk9VTkQgICAgICAgICAgICBcCisgICAgTUFLRV9IUkVTVUxUKFNFVkVSSVRZX0VSUk9SLCBGQUNJTElUWV9XSU4zMiwgRVJST1JfRklMRV9OT1RfRk9VTkQpCisjZGVmaW5lIERJRVJSX0lOVkFMSURQQVJBTSAgICAgICAgICAgICAgRV9JTlZBTElEQVJHCisjZGVmaW5lIERJRVJSX05PSU5URVJGQUNFICAgICAgICAgICAgICAgRV9OT0lOVEVSRkFDRQorI2RlZmluZSBESUVSUl9HRU5FUklDICAgICAgICAgICAgICAgICAgIEVfRkFJTAorI2RlZmluZSBESUVSUl9PVVRPRk1FTU9SWSAgICAgICAgICAgICAgIEVfT1VUT0ZNRU1PUlkKKyNkZWZpbmUgRElFUlJfVU5TVVBQT1JURUQgICAgICAgICAgICAgICBFX05PVElNUEwKKyNkZWZpbmUgRElFUlJfTk9USU5JVElBTElaRUQgICAgICAgICAgICBcCisgICAgTUFLRV9IUkVTVUxUKFNFVkVSSVRZX0VSUk9SLCBGQUNJTElUWV9XSU4zMiwgRVJST1JfTk9UX1JFQURZKQorI2RlZmluZSBESUVSUl9BTFJFQURZSU5JVElBTElaRUQgICAgICAgIFwKKyAgICBNQUtFX0hSRVNVTFQoU0VWRVJJVFlfRVJST1IsIEZBQ0lMSVRZX1dJTjMyLCBFUlJPUl9BTFJFQURZX0lOSVRJQUxJWkVEKQorI2RlZmluZSBESUVSUl9OT0FHR1JFR0FUSU9OICAgICAgICAgICAgIENMQVNTX0VfTk9BR0dSRUdBVElPTgorI2RlZmluZSBESUVSUl9PVEhFUkFQUEhBU1BSSU8gICAgICAgICAgIEVfQUNDRVNTREVOSUVECisjZGVmaW5lIERJRVJSX0lOUFVUTE9TVCAgICAgICAgICAgICAgICAgXAorICAgIE1BS0VfSFJFU1VMVChTRVZFUklUWV9FUlJPUiwgRkFDSUxJVFlfV0lOMzIsIEVSUk9SX1JFQURfRkFVTFQpCisjZGVmaW5lIERJRVJSX0FDUVVJUkVEICAgICAgICAgICAgICAgICAgXAorICAgIE1BS0VfSFJFU1VMVChTRVZFUklUWV9FUlJPUiwgRkFDSUxJVFlfV0lOMzIsIEVSUk9SX0JVU1kpCisjZGVmaW5lIERJRVJSX05PVEFDUVVJUkVEICAgICAgICAgICAgICAgXAorICAgIE1BS0VfSFJFU1VMVChTRVZFUklUWV9FUlJPUiwgRkFDSUxJVFlfV0lOMzIsIEVSUk9SX0lOVkFMSURfQUNDRVNTKQorI2RlZmluZSBESUVSUl9SRUFET05MWSAgICAgICAgICAgICAgICAgIEVfQUNDRVNTREVOSUVECisjZGVmaW5lIERJRVJSX0hBTkRMRUVYSVNUUyAgICAgICAgICAgICAgRV9BQ0NFU1NERU5JRUQKKyNpZm5kZWYgRV9QRU5ESU5HCisjZGVmaW5lIEVfUEVORElORyAgICAgICAgICAgICAgICAgICAgICAgMHg4MDAwMDAwQUwKKyNlbmRpZgorI2RlZmluZSBESUVSUl9JTlNVRkZJQ0lFTlRQUklWUyAgICAgICAgIDB4ODAwNDAyMDBMCisjZGVmaW5lIERJRVJSX0RFVklDRUZVTEwgICAgICAgICAgICAgICAgMHg4MDA0MDIwMUwKKyNkZWZpbmUgRElFUlJfTU9SRURBVEEgICAgICAgICAgICAgICAgICAweDgwMDQwMjAyTAorI2RlZmluZSBESUVSUl9OT1RET1dOTE9BREVEICAgICAgICAgICAgIDB4ODAwNDAyMDNMCisjZGVmaW5lIERJRVJSX0hBU0VGRkVDVFMgICAgICAgICAgICAgICAgMHg4MDA0MDIwNEwKKyNkZWZpbmUgRElFUlJfTk9URVhDTFVTSVZFQUNRVUlSRUQgICAgICAweDgwMDQwMjA1TAorI2RlZmluZSBESUVSUl9JTkNPTVBMRVRFRUZGRUNUICAgICAgICAgIDB4ODAwNDAyMDZMCisjZGVmaW5lIERJRVJSX05PVEJVRkZFUkVEICAgICAgICAgICAgICAgMHg4MDA0MDIwN0wKKyNkZWZpbmUgRElFUlJfRUZGRUNUUExBWUlORyAgICAgICAgICAgICAweDgwMDQwMjA4TAorI2RlZmluZSBESUVSUl9VTlBMVUdHRUQgICAgICAgICAgICAgICAgIDB4ODAwNDAyMDlMCisjZGVmaW5lIERJRVJSX1JFUE9SVEZVTEwgICAgICAgICAgICAgICAgMHg4MDA0MDIwQUwKIAogdHlwZWRlZiBzdHJ1Y3QgewogICAgIERXT1JECWR3U2l6ZTsKQEAgLTMwMyw2ICszNjAsOCBAQAogI2RlZmluZSBESURGX0FCU0FYSVMJCTB4MDAwMDAwMDEKICNkZWZpbmUgRElERl9SRUxBWElTCQkweDAwMDAwMDAyCiAKKyNkZWZpbmUgRElHRERfUEVFSwkJMHgwMDAwMDAwMQorCiB0eXBlZGVmIHN0cnVjdCB7CiAgICAgRFdPUkQJZHdPZnM7CiAgICAgRFdPUkQJZHdEYXRhOwpAQCAtMzM4LDYgKzM5Nyw2NiBAQAogI2RlZmluZSBESVBIX0JZSUQJMgogI2RlZmluZSBESVBIX0JZVVNBR0UJMwogCisjZGVmaW5lIERJTUFLRVVTQUdFRFdPUkQoVXNhZ2VQYWdlLCBVc2FnZSkgKERXT1JEKU1BS0VMT05HKFVzYWdlLCBVc2FnZVBhZ2UpCisKK3R5cGVkZWYgc3RydWN0IERJUFJPUERXT1JEIHsKKwlESVBST1BIRUFERVIJZGlwaDsKKwlEV09SRAkJZHdEYXRhOworfSBESVBST1BEV09SRCwgKkxQRElQUk9QRFdPUkQ7Cit0eXBlZGVmIGNvbnN0IERJUFJPUERXT1JEICpMUENESVBST1BEV09SRDsKKwordHlwZWRlZiBzdHJ1Y3QgRElQUk9QUkFOR0UgeworCURJUFJPUEhFQURFUglkaXBoOworCUxPTkcJCWxNaW47CisJTE9ORwkJbE1heDsKK30gRElQUk9QUkFOR0UsICpMUERJUFJPUFJBTkdFOwordHlwZWRlZiBjb25zdCBESVBST1BSQU5HRSAqTFBDRElQUk9QUkFOR0U7CisKKyNkZWZpbmUgRElQUk9QUkFOR0VfTk9NSU4JKChMT05HKTB4ODAwMDAwMDApCisjZGVmaW5lIERJUFJPUFJBTkdFX05PTUFYCSgoTE9ORykweDdGRkZGRkZGKQorCit0eXBlZGVmIHN0cnVjdCBESVBST1BDQUwgeworCURJUFJPUEhFQURFUiBkaXBoOworCUxPTkcgICAgbE1pbjsKKwlMT05HICAgIGxDZW50ZXI7CisJTE9ORyAgICBsTWF4OworfSBESVBST1BDQUwsICpMUERJUFJPUENBTDsKK3R5cGVkZWYgY29uc3QgRElQUk9QQ0FMICpMUENESVBST1BDQUw7CisKK3R5cGVkZWYgc3RydWN0IERJUFJPUEdVSURBTkRQQVRIIHsKKwlESVBST1BIRUFERVIgZGlwaDsKKwlHVUlEICAgIGd1aWRDbGFzczsKKwlXQ0hBUiAgIHdzelBhdGhbTUFYX1BBVEhdOworfSBESVBST1BHVUlEQU5EUEFUSCwgKkxQRElQUk9QR1VJREFORFBBVEgsKkxQQ0RJUFJPUEdVSURBTkRQQVRIOworCisvKiBzcGVjaWFsIHByb3BlcnR5IEdVSURzICovCisjZGVmaW5lIE1BS0VESVBST1AocHJvcCkJKChSRUZHVUlEKShwcm9wKSkKKyNkZWZpbmUgRElQUk9QX0JVRkZFUlNJWkUJTUFLRURJUFJPUCgxKQorI2RlZmluZSBESVBST1BfQVhJU01PREUJCU1BS0VESVBST1AoMikKKworI2RlZmluZSBESVBST1BBWElTTU9ERV9BQlMJMAorI2RlZmluZSBESVBST1BBWElTTU9ERV9SRUwJMQorCisjZGVmaW5lIERJUFJPUF9HUkFOVUxBUklUWQlNQUtFRElQUk9QKDMpCisjZGVmaW5lIERJUFJPUF9SQU5HRQkJTUFLRURJUFJPUCg0KQorI2RlZmluZSBESVBST1BfREVBRFpPTkUJCU1BS0VESVBST1AoNSkKKyNkZWZpbmUgRElQUk9QX1NBVFVSQVRJT04JTUFLRURJUFJPUCg2KQorI2RlZmluZSBESVBST1BfRkZHQUlOCQlNQUtFRElQUk9QKDcpCisjZGVmaW5lIERJUFJPUF9GRkxPQUQJCU1BS0VESVBST1AoOCkKKyNkZWZpbmUgRElQUk9QX0FVVE9DRU5URVIJTUFLRURJUFJPUCg5KQorCisjZGVmaW5lIERJUFJPUEFVVE9DRU5URVJfT0ZGCTAKKyNkZWZpbmUgRElQUk9QQVVUT0NFTlRFUl9PTgkxCisKKyNkZWZpbmUgRElQUk9QX0NBTElCUkFUSU9OTU9ERQlNQUtFRElQUk9QKDEwKQorCisjZGVmaW5lIERJUFJPUENBTElCUkFUSU9OTU9ERV9DT09LRUQJMAorI2RlZmluZSBESVBST1BDQUxJQlJBVElPTk1PREVfUkFXCTEKKworI2RlZmluZSBESVBST1BfQ0FMSUJSQVRJT04JTUFLRURJUFJPUCgxMSkKKyNkZWZpbmUgRElQUk9QX0dVSURBTkRQQVRICU1BS0VESVBST1AoMTIpCisKKwogdHlwZWRlZiBzdHJ1Y3QgRElERVZDQVBTIHsKICAgICBEV09SRAlkd1NpemU7CiAgICAgRFdPUkQJZHdGbGFnczsKQEAgLTQwMiw2ICs1MjEsMTMgQEAKIAlEV09SRAkJCQlyZWY7CiAJR1VJRAkJCQlndWlkOwogfTsKKworc3RydWN0IFN5c0tleWJvYXJkMzJBIHsKKwlMUERJUkVDVElOUFVUREVWSUNFQV9WVEFCTEUJbHB2dGJsOworCURXT1JECQkJCXJlZjsKKwlHVUlECQkJCWd1aWQ7CisJQllURQkJCQlrZXlzdGF0ZVsyNTZdOworfTsKICN1bmRlZiBUSElTCiAKICNkZWZpbmUgVEhJUyBMUERJUkVDVElOUFVUMzJBIHRoaXMKZGlmZiAtLWdpdCBhL2luY2x1ZGUvZHNvdW5kLmggYi9pbmNsdWRlL2Rzb3VuZC5oCmluZGV4IDAxM2YwMzUuLjA4MTY5NmIgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvZHNvdW5kLmgKKysrIGIvaW5jbHVkZS9kc291bmQuaApAQCAtMjI1LDYgKzIyNSw3IEBACiAJRFNCVUZGRVJERVNDCQkJZHNiZDsKIAlMUERTQlBPU0lUSU9OTk9USUZZCQlub3RpZmllczsKIAlpbnQJCQkJbnJvZm5vdGlmaWVzOworCWRvdWJsZQkJCQl2b2xmYWM7CiB9OwogI3VuZGVmIFRISVMKIApkaWZmIC0tZ2l0IGEvaW5jbHVkZS9maWxlLmggYi9pbmNsdWRlL2ZpbGUuaAppbmRleCBkZTQzZTFiLi43YjljNmU0IDEwMDY0NAotLS0gYS9pbmNsdWRlL2ZpbGUuaAorKysgYi9pbmNsdWRlL2ZpbGUuaApAQCAtNDEsNiArNDEsNyBAQAogZXh0ZXJuIEhGSUxFMzIgRklMRV9EdXAoIEhGSUxFMzIgaEZpbGUgKTsKIGV4dGVybiBIRklMRTMyIEZJTEVfRHVwMiggSEZJTEUzMiBoRmlsZTEsIEhGSUxFMzIgaEZpbGUyICk7CiBleHRlcm4gSEZJTEUzMiBGSUxFX09wZW4oIExQQ1NUUiBwYXRoLCBJTlQzMiBtb2RlICk7CitleHRlcm4gSEZJTEUzMiBGSUxFX09wZW5Vbml4RmlsZSggTFBDU1RSIHBhdGgsIElOVDMyIG1vZGUgKTsKIGV4dGVybiBCT09MMzIgRklMRV9TZXRGaWxlVHlwZSggSEZJTEUzMiBoRmlsZSwgRFdPUkQgdHlwZSApOwogZXh0ZXJuIExQVk9JRCBGSUxFX21tYXAoIEhGSUxFMzIgaEZpbGUsIExQVk9JRCBzdGFydCwKICAgICAgICAgICAgICAgICAgICAgICAgICBEV09SRCBzaXplX2hpZ2gsIERXT1JEIHNpemVfbG93LApAQCAtNjgsNyArNjksOCBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEV09SRCByZW1haW5kZXIgKTsKIGV4dGVybiB0aW1lX3QgRE9TRlNfRmlsZVRpbWVUb1VuaXhUaW1lKCBjb25zdCBGSUxFVElNRSAqZnQsIERXT1JEICpyZW1haW5kZXIgKTsKIGV4dGVybiBCT09MMzIgRE9TRlNfVG9Eb3NGQ0JGb3JtYXQoIExQQ1NUUiBuYW1lLCBMUFNUUiBidWZmZXIgKTsKLWV4dGVybiBjb25zdCBjaGFyICpET1NGU19Jc0RldmljZSggY29uc3QgY2hhciAqbmFtZSApOworZXh0ZXJuIEJPT0wzMiBET1NGU19Jc0RldmljZSggY29uc3QgY2hhciAqbmFtZSApOworZXh0ZXJuIEhGSUxFMzIgRE9TRlNfT3BlbkRldmljZSggY29uc3QgY2hhciAqbmFtZSwgSU5UMzIgbW9kZSApOwogZXh0ZXJuIEJPT0wzMiBET1NGU19GaW5kVW5peE5hbWUoIExQQ1NUUiBwYXRoLCBMUENTVFIgbmFtZSwgTFBTVFIgbG9uZ19idWYsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSU5UMzIgbG9uZ19sZW4sIExQU1RSIHNob3J0X2J1ZiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCT09MMzIgaWdub3JlX2Nhc2UgKTsKZGlmZiAtLWdpdCBhL2luY2x1ZGUvaW50ZXJmYWNlcy5oIGIvaW5jbHVkZS9pbnRlcmZhY2VzLmgKaW5kZXggZWY3MGEyMi4uZThmMjk5MyAxMDA2NDQKLS0tIGEvaW5jbHVkZS9pbnRlcmZhY2VzLmgKKysrIGIvaW5jbHVkZS9pbnRlcmZhY2VzLmgKQEAgLTU0LDggKzU0LDggQEAKIH07CiAjdW5kZWYgVEhJUwogCi0jZGVmaW5lIFRISVMgTFBNQUxMT0MgdGhpcwotdHlwZWRlZiBzdHJ1Y3QgSU1hbGxvYyAqTFBNQUxMT0MsSU1hbGxvYzsKKyNkZWZpbmUgVEhJUyBMUE1BTExPQzMyIHRoaXMKK3R5cGVkZWYgc3RydWN0IElNYWxsb2MzMiAqTFBNQUxMT0MzMixJTWFsbG9jMzI7CiB0eXBlZGVmIHN0cnVjdCB7CiAJU1RETUVUSE9EKFF1ZXJ5SW50ZXJmYWNlKSAoVEhJU18gUkVGSUlEIHJpaWQsTFBWT0lEIEZBUiogcHB2T2JqKSBQVVJFOwogCVNURE1FVEhPRF8oVUxPTkcsQWRkUmVmKSAoVEhJUykgUFVSRTsKQEAgLTY1LDIwICs2NSw0NiBAQAogCVNURE1FVEhPRF8oTFBWT0lELFJlYWxsb2MpICggVEhJU18gTFBWT0lEIHB2LERXT1JEIGNiKTsKIAlTVERNRVRIT0RfKFZPSUQsRnJlZSkgKCBUSElTXyBMUFZPSUQgcHYpOwogCVNURE1FVEhPRF8oRFdPUkQsR2V0U2l6ZSkgKCBUSElTXyBMUFZPSUQgcHYpOwotCVNURE1FVEhPRF8oTFBJTlQzMixEaWRBbGxvYykgKCBUSElTXyBMUFZPSUQgcHYpOworCVNURE1FVEhPRF8oSU5UMzIsRGlkQWxsb2MpICggVEhJU18gTFBWT0lEIHB2KTsKIAlTVERNRVRIT0RfKExQVk9JRCxIZWFwTWluaW1pemUpICggVEhJUyApOwotfSAqTFBNQUxMT0NfVlRBQkxFLElNYWxsb2NfVlRhYmxlOworfSAqTFBNQUxMT0MzMl9WVEFCTEUsSU1hbGxvYzMyX1ZUYWJsZTsKIAotc3RydWN0IElNYWxsb2MgewotCUxQTUFMTE9DX1ZUQUJMRSBscHZ0Ymw7Ci0JRFdPUkQJCXJlZjsKK3N0cnVjdCBJTWFsbG9jMzIgeworCUxQTUFMTE9DMzJfVlRBQkxFCWxwdnRibDsKKwlEV09SRAkJCXJlZjsKK307CisjdW5kZWYgVEhJUworCisjZGVmaW5lIFRISVMgTFBNQUxMT0MxNiB0aGlzCit0eXBlZGVmIHN0cnVjdCBJTWFsbG9jMTYgKkxQTUFMTE9DMTYsSU1hbGxvYzE2OwordHlwZWRlZiBzdHJ1Y3QgeworCVNURE1FVEhPRChRdWVyeUludGVyZmFjZSkgKFRISVNfIFJFRklJRCByaWlkLExQVk9JRCBGQVIqIHBwdk9iaikgUFVSRTsKKwlTVERNRVRIT0RfKFVMT05HLEFkZFJlZikgKFRISVMpIFBVUkU7CisJU1RETUVUSE9EXyhVTE9ORyxSZWxlYXNlKSAoVEhJUykgUFVSRTsKKworCVNURE1FVEhPRF8oTFBWT0lELEFsbG9jKSAoIFRISVNfIERXT1JEIGNiKTsKKwlTVERNRVRIT0RfKExQVk9JRCxSZWFsbG9jKSAoIFRISVNfIExQVk9JRCBwdixEV09SRCBjYik7CisJU1RETUVUSE9EXyhWT0lELEZyZWUpICggVEhJU18gTFBWT0lEIHB2KTsKKwlTVERNRVRIT0RfKERXT1JELEdldFNpemUpICggVEhJU18gTFBWT0lEIHB2KTsKKwlTVERNRVRIT0RfKElOVDE2LERpZEFsbG9jKSAoIFRISVNfIExQVk9JRCBwdik7CisJU1RETUVUSE9EXyhMUFZPSUQsSGVhcE1pbmltaXplKSAoIFRISVMgKTsKK30gKkxQTUFMTE9DMTZfVlRBQkxFLElNYWxsb2MxNl9WVGFibGU7CisKK3N0cnVjdCBJTWFsbG9jMTYgeworCUxQTUFMTE9DMTZfVlRBQkxFCWxwdnRibDsKKwlEV09SRAkJCXJlZjsKKwkvKiBHbW0sIEkgdGhpbmsgb25lIGlzIG5vdCBlbm91Z2gsIHdlIHNob3VsZCBwcm9iYWJseSBtYW5hZ2UgYSBsaXN0IG9mCisJICogaGVhcHMKKwkgKi8KKwlIR0xPQkFMMTYJCWhlYXA7CiB9OwogI3VuZGVmIFRISVMKIAogLyogcHJpdmF0ZSBwcm90b3R5cGVzIGZvciB0aGUgY29uc3RydWN0b3JzICovCiAjaWZkZWYgX19XSU5FX18KIExQVU5LTk9XTglJVW5rbm93bl9Db25zdHJ1Y3RvcigpOwotTFBNQUxMT0MJSU1hbGxvY19Db25zdHJ1Y3RvcigpOworTFBNQUxMT0MxNglJTWFsbG9jMTZfQ29uc3RydWN0b3IoKTsKK0xQTUFMTE9DMzIJSU1hbGxvYzMyX0NvbnN0cnVjdG9yKCk7CiAjZW5kaWYKIAogI3VuZGVmIFNURE1FVEhPRApkaWZmIC0tZ2l0IGEvaW5jbHVkZS9rMzJvYmouaCBiL2luY2x1ZGUvazMyb2JqLmgKaW5kZXggZjExN2NlOC4uM2U0ZGMyOCAxMDA2NDQKLS0tIGEvaW5jbHVkZS9rMzJvYmouaAorKysgYi9pbmNsdWRlL2szMm9iai5oCkBAIC04LDYgKzgsNyBAQAogI2RlZmluZSBfX1dJTkVfSzMyT0JKX0gKIAogI2luY2x1ZGUgIndpbnR5cGVzLmgiCisjaW5jbHVkZSAid2luZG93cy5oIgogCiAvKiBPYmplY3QgdHlwZXMgKi8KIHR5cGVkZWYgZW51bQpAQCAtNDcsNiArNDgsOCBAQAogICAgIEJPT0wzMiAoKnNhdGlzZmllZCkoSzMyT0JKKixEV09SRCk7ICAgLyogV2FpdCBvbiBvYmplY3QgaXMgc2F0aXNmaWVkICovCiAgICAgdm9pZCAgICgqYWRkX3dhaXQpKEszMk9CSiosRFdPUkQpOyAgICAvKiBBZGQgdGhyZWFkIHRvIHdhaXQgcXVldWUgKi8KICAgICB2b2lkICAgKCpyZW1vdmVfd2FpdCkoSzMyT0JKKixEV09SRCk7IC8qIFJlbW92ZSB0aHJlYWQgZnJvbSB3YWl0IHF1ZXVlICovCisgICAgQk9PTDMyICgqcmVhZCkoSzMyT0JKKixMUFZPSUQsRFdPUkQsTFBEV09SRCxMUE9WRVJMQVBQRUQpOworICAgIEJPT0wzMiAoKndyaXRlKShLMzJPQkoqLExQQ1ZPSUQsRFdPUkQsTFBEV09SRCxMUE9WRVJMQVBQRUQpOwogICAgIHZvaWQgICAoKmRlc3Ryb3kpKEszMk9CSiAqKTsgICAgICAgICAgLyogRGVzdHJveSBvYmplY3Qgb24gcmVmY291bnQ9PTAgKi8KIH0gSzMyT0JKX09QUzsKIApkaWZmIC0tZ2l0IGEvaW5jbHVkZS9tbXN5c3RlbS5oIGIvaW5jbHVkZS9tbXN5c3RlbS5oCmluZGV4IDQ5M2I3YWMuLmJlMjlmNWYgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbW1zeXN0ZW0uaAorKysgYi9pbmNsdWRlL21tc3lzdGVtLmgKQEAgLTc4Miw2ICs3ODIsNyBAQAogI2RlZmluZSBKT1lFUlJfTk9DQU5ETyAgICAgICAgKEpPWUVSUl9CQVNFKzYpICAgICAgLyogcmVxdWVzdCBub3QgY29tcGxldGVkICovCiAjZGVmaW5lIEpPWUVSUl9VTlBMVUdHRUQgICAgICAoSk9ZRVJSX0JBU0UrNykgICAgICAvKiBqb3lzdGljayBpcyB1bnBsdWdnZWQgKi8KIAorLyogSk9ZSU5GTywgSk9ZSU5GT0VYLCBNTV9KT1kqICovCiAjZGVmaW5lIEpPWV9CVVRUT04xICAgICAgICAgMHgwMDAxCiAjZGVmaW5lIEpPWV9CVVRUT04yICAgICAgICAgMHgwMDAyCiAjZGVmaW5lIEpPWV9CVVRUT04zICAgICAgICAgMHgwMDA0CkBAIC03OTQsNiArNzk1LDUwIEBACiAjZGVmaW5lIEpPWVNUSUNLSUQxICAgICAgICAgMAogI2RlZmluZSBKT1lTVElDS0lEMiAgICAgICAgIDEKIAorLyogSk9ZQ0FQUy53Q2FwcyAqLworI2RlZmluZSBKT1lDQVBTX0hBU1oJCTB4MDAwMQorI2RlZmluZSBKT1lDQVBTX0hBU1IJCTB4MDAwMgorI2RlZmluZSBKT1lDQVBTX0hBU1UJCTB4MDAwNAorI2RlZmluZSBKT1lDQVBTX0hBU1YJCTB4MDAwOAorI2RlZmluZSBKT1lDQVBTX0hBU1BPVgkJMHgwMDEwCisjZGVmaW5lIEpPWUNBUFNfUE9WNERJUgkJMHgwMDIwCisjZGVmaW5lIEpPWUNBUFNfUE9WQ1RTCQkweDAwNDAKKworLyogSk9ZSU5GT0VYIHN0dWZmICovCisjZGVmaW5lIEpPWV9QT1ZDRU5URVJFRAkJKFdPUkQpIC0xCisjZGVmaW5lIEpPWV9QT1ZGT1JXQVJECQkwCisjZGVmaW5lIEpPWV9QT1ZSSUdIVAkJOTAwMAorI2RlZmluZSBKT1lfUE9WQkFDS1dBUkQJCTE4MDAwCisjZGVmaW5lIEpPWV9QT1ZMRUZUCQkyNzAwMAorCisjZGVmaW5lIEpPWV9SRVRVUk5YCQkweDAwMDAwMDAxCisjZGVmaW5lIEpPWV9SRVRVUk5ZCQkweDAwMDAwMDAyCisjZGVmaW5lIEpPWV9SRVRVUk5aCQkweDAwMDAwMDA0CisjZGVmaW5lIEpPWV9SRVRVUk5SCQkweDAwMDAwMDA4CisjZGVmaW5lIEpPWV9SRVRVUk5VCQkweDAwMDAwMDEwCisjZGVmaW5lIEpPWV9SRVRVUk5WCQkweDAwMDAwMDIwCisjZGVmaW5lIEpPWV9SRVRVUk5QT1YJCTB4MDAwMDAwNDAKKyNkZWZpbmUgSk9ZX1JFVFVSTkJVVFRPTlMJMHgwMDAwMDA4MAorI2RlZmluZSBKT1lfUkVUVVJOUkFXREFUQQkweDAwMDAwMTAwCisjZGVmaW5lIEpPWV9SRVRVUk5QT1ZDVFMJMHgwMDAwMDIwMAorI2RlZmluZSBKT1lfUkVUVVJOQ0VOVEVSRUQJMHgwMDAwMDQwMAorI2RlZmluZSBKT1lfVVNFREVBRFpPTkUJCTB4MDAwMDA4MDAKKyNkZWZpbmUgSk9ZX1JFVFVSTkFMTAkJKEpPWV9SRVRVUk5YIHwgSk9ZX1JFVFVSTlkgfCBKT1lfUkVUVVJOWiB8IFwKKwkJCQkgSk9ZX1JFVFVSTlIgfCBKT1lfUkVUVVJOVSB8IEpPWV9SRVRVUk5WIHwgXAorCQkJCSBKT1lfUkVUVVJOUE9WIHwgSk9ZX1JFVFVSTkJVVFRPTlMpCisjZGVmaW5lIEpPWV9DQUxfUkVBREFMV0FZUwkweDAwMDEwMDAwCisjZGVmaW5lIEpPWV9DQUxfUkVBRFhZT05MWQkweDAwMDIwMDAwCisjZGVmaW5lIEpPWV9DQUxfUkVBRDMJCTB4MDAwNDAwMDAKKyNkZWZpbmUgSk9ZX0NBTF9SRUFENAkJMHgwMDA4MDAwMAorI2RlZmluZSBKT1lfQ0FMX1JFQURYT05MWQkweDAwMTAwMDAwCisjZGVmaW5lIEpPWV9DQUxfUkVBRFlPTkxZCTB4MDAyMDAwMDAKKyNkZWZpbmUgSk9ZX0NBTF9SRUFENQkJMHgwMDQwMDAwMAorI2RlZmluZSBKT1lfQ0FMX1JFQUQ2CQkweDAwODAwMDAwCisjZGVmaW5lIEpPWV9DQUxfUkVBRFpPTkxZCTB4MDEwMDAwMDAKKyNkZWZpbmUgSk9ZX0NBTF9SRUFEUk9OTFkJMHgwMjAwMDAwMAorI2RlZmluZSBKT1lfQ0FMX1JFQURVT05MWQkweDA0MDAwMDAwCisjZGVmaW5lIEpPWV9DQUxfUkVBRFZPTkxZCTB4MDgwMDAwMDAKKwogdHlwZWRlZiBzdHJ1Y3QgewogICAgIFdPUkQgd01pZDsgICAgICAgICAgICAgICAgICAvKiBtYW51ZmFjdHVyZXIgSUQgKi8KICAgICBXT1JEIHdQaWQ7ICAgICAgICAgICAgICAgICAgLyogcHJvZHVjdCBJRCAqLwpAQCAtODkyLDYgKzkzNywyMiBAQAogICAgIFVJTlQzMiB3QnV0dG9uczsKIH0gSk9ZSU5GTzMyLCAqTFBKT1lJTkZPMzI7CiAKK3R5cGVkZWYgc3RydWN0IHsKKyAgICBEV09SRAlkd1NpemU7CQkvKiBzaXplIG9mIHN0cnVjdHVyZSAqLworICAgIERXT1JECWR3RmxhZ3M7CS8qIGZsYWdzIHRvIGluZGljYXRlIHdoYXQgdG8gcmV0dXJuICovCisgICAgRFdPUkQJZHdYcG9zOwkJLyogeCBwb3NpdGlvbiAqLworICAgIERXT1JECWR3WXBvczsJCS8qIHkgcG9zaXRpb24gKi8KKyAgICBEV09SRAlkd1pwb3M7CQkvKiB6IHBvc2l0aW9uICovCisgICAgRFdPUkQJZHdScG9zOwkJLyogcnVkZGVyLzR0aCBheGlzIHBvc2l0aW9uICovCisgICAgRFdPUkQJZHdVcG9zOwkJLyogNXRoIGF4aXMgcG9zaXRpb24gKi8KKyAgICBEV09SRAlkd1Zwb3M7CQkvKiA2dGggYXhpcyBwb3NpdGlvbiAqLworICAgIERXT1JECWR3QnV0dG9uczsJLyogYnV0dG9uIHN0YXRlcyAqLworICAgIERXT1JECWR3QnV0dG9uTnVtYmVyOwkvKiBjdXJyZW50IGJ1dHRvbiBudW1iZXIgcHJlc3NlZCAqLworICAgIERXT1JECWR3UE9WOwkJLyogcG9pbnQgb2YgdmlldyBzdGF0ZSAqLworICAgIERXT1JECWR3UmVzZXJ2ZWQxOwkvKiByZXNlcnZlZCBmb3IgY29tbXVuaWNhdGlvbiBiZXR3ZWVuIHdpbm1tICYgZHJpdmVyICovCisgICAgRFdPUkQJZHdSZXNlcnZlZDI7CS8qIHJlc2VydmVkIGZvciBmdXR1cmUgZXhwYW5zaW9uICovCit9IEpPWUlORk9FWCwqTFBKT1lJTkZPRVg7CisKIERFQ0xfV0lORUxJQl9UWVBFKEpPWUlORk8pOwogREVDTF9XSU5FTElCX1RZUEUoTFBKT1lJTkZPKTsKIApAQCAtOTA1LDYgKzk2Niw3IEBACiBNTVJFU1VMVDE2IFdJTkFQSSBqb3lHZXRQb3MxNihVSU5UMTYsTFBKT1lJTkZPMTYpOwogTU1SRVNVTFQzMiBXSU5BUEkgam95R2V0UG9zMzIoVUlOVDMyLExQSk9ZSU5GTzMyKTsKICNkZWZpbmUgam95R2V0UG9zIFdJTkVMSUJfTkFNRShqb3lHZXRQb3MpCitNTVJFU1VMVDMyIFdJTkFQSSBqb3lHZXRQb3NFeChVSU5UMzIsTFBKT1lJTkZPRVgpOwogTU1SRVNVTFQxNiBXSU5BUEkgam95R2V0VGhyZXNob2xkMTYoVUlOVDE2LFVJTlQxNiopOwogTU1SRVNVTFQzMiBXSU5BUEkgam95R2V0VGhyZXNob2xkMzIoVUlOVDMyLFVJTlQzMiopOwogI2RlZmluZSBqb3lHZXRUaHJlc2hvbGQgV0lORUxJQl9OQU1FKGpveUdldFRocmVzaG9sZCkKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbW9kdWxlLmggYi9pbmNsdWRlL21vZHVsZS5oCmluZGV4IGVhOTg4ZGIuLmU3OWFhNDcgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbW9kdWxlLmgKKysrIGIvaW5jbHVkZS9tb2R1bGUuaApAQCAtOTEsNiArOTEsMTQgQEAKICAgICBTRUdQVFIgICAgcmVzZXJ2ZWQgV0lORV9QQUNLRUQ7CiB9IExPQURQQVJBTVM7CiAKK3R5cGVkZWYgc3RydWN0IAoreworICAgIExQU1RSIGxwRW52QWRkcmVzczsKKyAgICBMUFNUUiBscENtZExpbmU7CisgICAgTFBTVFIgbHBDbWRTaG93OworICAgIERXT1JEIGR3UmVzZXJ2ZWQ7Cit9IExPQURQQVJBTVMzMjsKKwogI3ByYWdtYSBwYWNrKDQpCiAKIC8qIFJlc291cmNlIHR5cGVzICovCkBAIC0xNTEsNCArMTU5LDcgQEAKIGV4dGVybiBITU9EVUxFMzIgQlVJTFRJTjMyX0xvYWRNb2R1bGUoIExQQ1NUUiBuYW1lLCBCT09MMzIgZm9yY2UsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJ1Y3QgX1BEQjMyICpwcm9jZXNzICk7CiAKKy8qIGlmMTYzMi9idWlsdGluLmMgKi8KK2V4dGVybiBITU9EVUxFMzIgKCpmbkJVSUxUSU5fTG9hZE1vZHVsZSkoTFBDU1RSIG5hbWUsIEJPT0wzMiBmb3JjZSk7CisKICNlbmRpZiAgLyogX19XSU5FX01PRFVMRV9IICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL29sZS5oIGIvaW5jbHVkZS9vbGUuaAppbmRleCA3MWMxNjU5Li5jZjA1MTkwIDEwMDY0NAotLS0gYS9pbmNsdWRlL29sZS5oCisrKyBiL2luY2x1ZGUvb2xlLmgKQEAgLTcsMTAgKzcsMTkgQEAKIAogI2luY2x1ZGUgIndpbmRvd3MuaCIKIAotdHlwZWRlZiBDSEFSCU9MRV9DSEFSLE9MRUNIQVI7Ci10eXBlZGVmIExQQ1NUUglPTEVfTFBDU1RSOwotdHlwZWRlZiBMUFNUUglMUE9MRVNUUjsKLXR5cGVkZWYgTFBDU1RSCUxQQ09MRVNUUjsKK3R5cGVkZWYgQ0hBUglPTEVDSEFSMTY7Cit0eXBlZGVmIExQU1RSCUxQT0xFU1RSMTY7Cit0eXBlZGVmIExQQ1NUUglMUENPTEVTVFIxNjsKK3R5cGVkZWYgV0NIQVIJT0xFQ0hBUjMyOwordHlwZWRlZiBMUFdTVFIJTFBPTEVTVFIzMjsKK3R5cGVkZWYgTFBDV1NUUglMUENPTEVTVFIzMjsKK0RFQ0xfV0lORUxJQl9UWVBFKE9MRUNIQVIpOworREVDTF9XSU5FTElCX1RZUEUoTFBPTEVTVFIpOworREVDTF9XSU5FTElCX1RZUEUoTFBDT0xFU1RSKTsKKworI2RlZmluZSBPTEVTVFIxNih4KSB4CisjZGVmaW5lIE9MRVNUUjMyKHgpIEwjI3gKKyNkZWZpbmUgT0xFU1RSIFdJTkVMSUJfTkFNRShPTEVTVFIpCiAKIHR5cGVkZWYgdW5zaWduZWQgc2hvcnQgVkFSVFlQRTsKIHR5cGVkZWYgTE9ORyBESVNQSUQ7CkBAIC0xNzAsMTAgKzE3OSwxMCBAQAogdHlwZWRlZiBzdHJ1Y3QgX09MRVNFUlZFUkRPQ1ZUQkwgewogCU9MRVNUQVRVUwkoQ0FMTEJBQ0sgKlNhdmUpKExQT0xFU0VSVkVSRE9DKTsKIAlPTEVTVEFUVVMJKENBTExCQUNLICpDbG9zZSkoTFBPTEVTRVJWRVJET0MpOwotCU9MRVNUQVRVUwkoQ0FMTEJBQ0sgKlNldEhvc3ROYW1lcykoTFBPTEVTRVJWRVJET0MsT0xFX0xQQ1NUUixPTEVfTFBDU1RSKTsKKwlPTEVTVEFUVVMJKENBTExCQUNLICpTZXRIb3N0TmFtZXMpKExQT0xFU0VSVkVSRE9DLExQQ09MRVNUUjE2LExQQ09MRVNUUjE2KTsKIAlPTEVTVEFUVVMJKENBTExCQUNLICpTZXREb2NEaW1lbnNpb25zKShMUE9MRVNFUlZFUkRPQyxMUFJFQ1QxNik7CiAjdW5kZWYgR2V0T2JqZWN0ICAvKiBGSVhNRSAqLwotCU9MRVNUQVRVUwkoQ0FMTEJBQ0sgKkdldE9iamVjdCkoTFBPTEVTRVJWRVJET0MsT0xFX0xQQ1NUUixMUE9MRU9CSkVDVCosTFBPTEVDTElFTlQpOworCU9MRVNUQVRVUwkoQ0FMTEJBQ0sgKkdldE9iamVjdCkoTFBPTEVTRVJWRVJET0MsTFBDT0xFU1RSMTYsTFBPTEVPQkpFQ1QqLExQT0xFQ0xJRU5UKTsKIAlPTEVTVEFUVVMJKENBTExCQUNLICpSZWxlYXNlKShMUE9MRVNFUlZFUkRPQyk7CiAJT0xFU1RBVFVTCShDQUxMQkFDSyAqU2V0Q29sb3JTY2hlbWUpKExQT0xFU0VSVkVSRE9DLExQTE9HUEFMRVRURSk7CiAJT0xFU1RBVFVTCShDQUxMQkFDSyAqRXhlY3V0ZSkoTFBPTEVTRVJWRVJET0MsSEdMT0JBTDE2KTsKQEAgLTE4NiwxMCArMTk1LDEwIEBACiAKIHR5cGVkZWYgc3RydWN0IF9PTEVTRVJWRVIqCUxQT0xFU0VSVkVSOwogdHlwZWRlZiBzdHJ1Y3QgX09MRVNFUlZFUlZUQkwgewotCU9MRVNUQVRVUwkoQ0FMTEJBQ0sgKk9wZW4pKExQT0xFU0VSVkVSLExIU0VSVkVSRE9DLE9MRV9MUENTVFIsTFBPTEVTRVJWRVJET0MgKik7Ci0JT0xFU1RBVFVTCShDQUxMQkFDSyAqQ3JlYXRlKShMUE9MRVNFUlZFUixMSFNFUlZFUkRPQyxPTEVfTFBDU1RSLE9MRV9MUENTVFIsTFBPTEVTRVJWRVJET0MqKTsKLQlPTEVTVEFUVVMJKENBTExCQUNLICpDcmVhdGVGcm9tVGVtcGxhdGUpKExQT0xFU0VSVkVSLExIU0VSVkVSRE9DLE9MRV9MUENTVFIsT0xFX0xQQ1NUUixPTEVfTFBDU1RSLExQT0xFU0VSVkVSRE9DICopOwotCU9MRVNUQVRVUwkoQ0FMTEJBQ0sgKkVkaXQpKExQT0xFU0VSVkVSLExIU0VSVkVSRE9DLE9MRV9MUENTVFIsT0xFX0xQQ1NUUixMUE9MRVNFUlZFUkRPQyAqKTsKKwlPTEVTVEFUVVMJKENBTExCQUNLICpPcGVuKShMUE9MRVNFUlZFUixMSFNFUlZFUkRPQyxMUENPTEVTVFIxNixMUE9MRVNFUlZFUkRPQyAqKTsKKwlPTEVTVEFUVVMJKENBTExCQUNLICpDcmVhdGUpKExQT0xFU0VSVkVSLExIU0VSVkVSRE9DLExQQ09MRVNUUjE2LExQQ09MRVNUUjE2LExQT0xFU0VSVkVSRE9DKik7CisJT0xFU1RBVFVTCShDQUxMQkFDSyAqQ3JlYXRlRnJvbVRlbXBsYXRlKShMUE9MRVNFUlZFUixMSFNFUlZFUkRPQyxMUENPTEVTVFIxNixMUENPTEVTVFIxNixMUENPTEVTVFIxNixMUE9MRVNFUlZFUkRPQyAqKTsKKwlPTEVTVEFUVVMJKENBTExCQUNLICpFZGl0KShMUE9MRVNFUlZFUixMSFNFUlZFUkRPQyxMUENPTEVTVFIxNixMUENPTEVTVFIxNixMUE9MRVNFUlZFUkRPQyAqKTsKIAlPTEVTVEFUVVMJKENBTExCQUNLICpFeGl0KShMUE9MRVNFUlZFUik7CiAJT0xFU1RBVFVTCShDQUxMQkFDSyAqUmVsZWFzZSkoTFBPTEVTRVJWRVIpOyAKIAlPTEVTVEFUVVMJKENBTExCQUNLICpFeGVjdXRlKShMUE9MRVNFUlZFUik7IApAQCAtMjEwLDcgKzIxOSw3IEBACiB9IE9MRUNMSUVOVDsKIAogdHlwZWRlZiBzdHJ1Y3QgX09MRU9CSkVDVFZUQkwgewotICAgICAgICB2b2lkICogIAkoQ0FMTEJBQ0sgKlF1ZXJ5UHJvdG9jb2wpKExQT0xFT0JKRUNULE9MRV9MUENTVFIpOworICAgICAgICB2b2lkICogIAkoQ0FMTEJBQ0sgKlF1ZXJ5UHJvdG9jb2wpKExQT0xFT0JKRUNULExQQ09MRVNUUjE2KTsKIAlPTEVTVEFUVVMJKENBTExCQUNLICpSZWxlYXNlKShMUE9MRU9CSkVDVCk7CiAJT0xFU1RBVFVTCShDQUxMQkFDSyAqU2hvdykoTFBPTEVPQkpFQ1QsQk9PTDE2KTsKIAlPTEVTVEFUVVMJKENBTExCQUNLICpEb1ZlcmIpKExQT0xFT0JKRUNULFVJTlQxNixCT09MMTYsQk9PTDE2KTsKQEAgLTIyMSwxMCArMjMwLDEwIEBACiAJT0xFU1RBVFVTCShDQUxMQkFDSyAqRW51bUZvcm1hdHMpKExQT0xFT0JKRUNULE9MRUNMSVBGT1JNQVQpOwogCU9MRVNUQVRVUwkoQ0FMTEJBQ0sgKlNldENvbG9yU2NoZW1lKShMUE9MRU9CSkVDVCxMUExPR1BBTEVUVEUpOwogCU9MRVNUQVRVUwkoQ0FMTEJBQ0sgKkRlbGV0ZSkoTFBPTEVPQkpFQ1QpOwotCU9MRVNUQVRVUwkoQ0FMTEJBQ0sgKlNldEhvc3ROYW1lcykoTFBPTEVPQkpFQ1QsT0xFX0xQQ1NUUixPTEVfTFBDU1RSKTsKKwlPTEVTVEFUVVMJKENBTExCQUNLICpTZXRIb3N0TmFtZXMpKExQT0xFT0JKRUNULExQQ09MRVNUUjE2LExQQ09MRVNUUjE2KTsKIAlPTEVTVEFUVVMJKENBTExCQUNLICpTYXZlVG9TdHJlYW0pKExQT0xFT0JKRUNULExQT0xFU1RSRUFNKTsKLQlPTEVTVEFUVVMJKENBTExCQUNLICpDbG9uZSkoTFBPTEVPQkpFQ1QsTFBPTEVDTElFTlQsTEhDTElFTlRET0MsT0xFX0xQQ1NUUixMUE9MRU9CSkVDVCAqKTsKLQlPTEVTVEFUVVMJKENBTExCQUNLICpDb3B5RnJvbUxpbmspKExQT0xFT0JKRUNULExQT0xFQ0xJRU5ULExIQ0xJRU5URE9DLE9MRV9MUENTVFIsTFBPTEVPQkpFQ1QgKik7CisJT0xFU1RBVFVTCShDQUxMQkFDSyAqQ2xvbmUpKExQT0xFT0JKRUNULExQT0xFQ0xJRU5ULExIQ0xJRU5URE9DLExQQ09MRVNUUjE2LExQT0xFT0JKRUNUICopOworCU9MRVNUQVRVUwkoQ0FMTEJBQ0sgKkNvcHlGcm9tTGluaykoTFBPTEVPQkpFQ1QsTFBPTEVDTElFTlQsTEhDTElFTlRET0MsTFBDT0xFU1RSMTYsTFBPTEVPQkpFQ1QgKik7CiAJT0xFU1RBVFVTCShDQUxMQkFDSyAqRXF1YWwpKExQT0xFT0JKRUNULExQT0xFT0JKRUNUKTsKIAlPTEVTVEFUVVMJKENBTExCQUNLICpDb3B5VG9DbGlwQm9hcmQpKExQT0xFT0JKRUNUKTsKIAlPTEVTVEFUVVMJKENBTExCQUNLICpEcmF3KShMUE9MRU9CSkVDVCxIREMxNixMUFJFQ1QxNixMUFJFQ1QxNixIREMxNik7CkBAIC0yMzMsMTAgKzI0MiwxMCBAQAogCU9MRVNUQVRVUwkoQ0FMTEJBQ0sgKkNsb3NlKShMUE9MRU9CSkVDVCk7CiAJT0xFU1RBVFVTCShDQUxMQkFDSyAqVXBkYXRlKShMUE9MRU9CSkVDVCk7CiAJT0xFU1RBVFVTCShDQUxMQkFDSyAqUmVjb25uZWN0KShMUE9MRU9CSkVDVCk7Ci0JT0xFU1RBVFVTCShDQUxMQkFDSyAqT2JqZWN0Q29udmVydCkoTFBPTEVPQkpFQ1QsT0xFX0xQQ1NUUixMUE9MRUNMSUVOVCxMSENMSUVOVERPQyxPTEVfTFBDU1RSLExQT0xFT0JKRUNUKik7CisJT0xFU1RBVFVTCShDQUxMQkFDSyAqT2JqZWN0Q29udmVydCkoTFBPTEVPQkpFQ1QsTFBDT0xFU1RSMTYsTFBPTEVDTElFTlQsTEhDTElFTlRET0MsTFBDT0xFU1RSMTYsTFBPTEVPQkpFQ1QqKTsKIAlPTEVTVEFUVVMJKENBTExCQUNLICpHZXRMaW5rVXBkYXRlT3B0aW9ucykoTFBPTEVPQkpFQ1QsTFBPTEVPUFRfVVBEQVRFKTsKIAlPTEVTVEFUVVMJKENBTExCQUNLICpTZXRMaW5rVXBkYXRlT3B0aW9ucykoTFBPTEVPQkpFQ1QsT0xFT1BUX1VQREFURSk7Ci0JT0xFU1RBVFVTCShDQUxMQkFDSyAqUmVuYW1lKShMUE9MRU9CSkVDVCxPTEVfTFBDU1RSKTsKKwlPTEVTVEFUVVMJKENBTExCQUNLICpSZW5hbWUpKExQT0xFT0JKRUNULExQQ09MRVNUUjE2KTsKIAlPTEVTVEFUVVMJKENBTExCQUNLICpRdWVyeU5hbWUpKExQT0xFT0JKRUNULExQU1RSLExQVUlOVDE2KTsKIAlPTEVTVEFUVVMJKENBTExCQUNLICpRdWVyeVR5cGUpKExQT0xFT0JKRUNULExQTE9ORyk7CiAJT0xFU1RBVFVTCShDQUxMQkFDSyAqUXVlcnlCb3VuZHMpKExQT0xFT0JKRUNULExQUkVDVDE2KTsKQEAgLTI3OSwxMiArMjg4LDEyIEBACiB9IENBTExDT05WOwogCiB0eXBlZGVmIHN0cnVjdCB0YWdQQVJBTURBVEEgewotICAgIE9MRUNIQVIgKiBzek5hbWU7ICAgIC8qIHBhcmFtZXRlciBuYW1lICovCisgICAgT0xFQ0hBUjE2ICogc3pOYW1lOyAgICAvKiBwYXJhbWV0ZXIgbmFtZSAqLwogICAgIFZBUlRZUEUgdnQ7ICAgICAgICAgLyogcGFyYW1ldGVyIHR5cGUgKi8KIH0gUEFSQU1EQVRBLCAqIExQUEFSQU1EQVRBOwogCiB0eXBlZGVmIHN0cnVjdCB0YWdNRVRIT0REQVRBIHsKLSAgICBPTEVDSEFSICogc3pOYW1lOyAgICAvKiBtZXRob2QgbmFtZSAqLworICAgIE9MRUNIQVIxNiAqIHN6TmFtZTsgICAgLyogbWV0aG9kIG5hbWUgKi8KICAgICBQQVJBTURBVEEgKiBwcGRhdGE7ICAvKiBwb2ludGVyIHRvIGFuIGFycmF5IG9mIFBBUkFNREFUQXMgKi8KICAgICBESVNQSUQgZGlzcGlkOyAgICAgIC8qIG1ldGhvZCBJRCAqLwogICAgIFVJTlQxNiBpTWV0aDsgICAgICAgICAvKiBtZXRob2QgaW5kZXggKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvcHJvY2Vzcy5oIGIvaW5jbHVkZS9wcm9jZXNzLmgKaW5kZXggZGJjZTAxNC4uMDMyM2E5OCAxMDA2NDQKLS0tIGEvaW5jbHVkZS9wcm9jZXNzLmgKKysrIGIvaW5jbHVkZS9wcm9jZXNzLmgKQEAgLTExNSw1ICsxMTUsNSBAQAogZXh0ZXJuIFBEQjMyICpQUk9DRVNTX0dldFB0ciggSEFORExFMzIgaGFuZGxlLCBEV09SRCBhY2Nlc3MgKTsKIGV4dGVybiBQREIzMiAqUFJPQ0VTU19JZFRvUERCKCBEV09SRCBpZCApOwogZXh0ZXJuIFBEQjMyICpQUk9DRVNTX0NyZWF0ZSggVERCICpwVGFzaywgTFBDU1RSIGNtZF9saW5lICk7Ci0KK2V4dGVybiB2b2lkIFBST0NFU1NfQ2xvc2VPYmpIYW5kbGVzKFBEQjMyICpwZGIsIEszMk9CSiAqcHRyKTsKICNlbmRpZiAgLyogX19XSU5FX1BST0NFU1NfSCAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9zaGxvYmouaCBiL2luY2x1ZGUvc2hsb2JqLmgKaW5kZXggMzViMjNjYy4uZjNjZmYwYSAxMDA2NDQKLS0tIGEvaW5jbHVkZS9zaGxvYmouaAorKysgYi9pbmNsdWRlL3NobG9iai5oCkBAIC0xNDYsNyArMTQ2LDcgQEAKIAogICAgIC8qICoqKiBJU2hlbGxGb2xkZXIgbWV0aG9kcyAqKiogKi8KICAgICBTVERNRVRIT0QoUGFyc2VEaXNwbGF5TmFtZSkgKFRISVNfIEhXTkQzMiBod25kT3duZXIsCi0gICAgICAgIExQQkMgcGJjUmVzZXJ2ZWQsIExQT0xFU1RSIGxwc3pEaXNwbGF5TmFtZSwKKyAgICAgICAgTFBCQyBwYmNSZXNlcnZlZCwgTFBPTEVTVFIzMiBscHN6RGlzcGxheU5hbWUsCiAgICAgICAgIFVMT05HICogcGNoRWF0ZW4sIExQSVRFTUlETElTVCAqIHBwaWRsLCBVTE9ORyAqcGR3QXR0cmlidXRlcykgUFVSRTsKICAgICBTVERNRVRIT0QoRW51bU9iamVjdHMpICggVEhJU18gSFdORDMyIGh3bmRPd25lciwgRFdPUkQgZ3JmRmxhZ3MsIExQRU5VTUlETElTVAogKiBwcGVudW1JRExpc3QpIFBVUkU7CkBAIC0xNjMsNyArMTYzLDcgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFJFRklJRCByaWlkLCBVSU5UMzIgKiBwcmdmSW5PdXQsIExQVk9JRCAqIHBwdk91dCkgUFVSRTsKICAgICBTVERNRVRIT0QoR2V0RGlzcGxheU5hbWVPZikgKFRISVNfIExQQ0lURU1JRExJU1QgcGlkbCwgRFdPUkQgdUZsYWdzLCBMUFNUUlJFVCBscE5hbWUpIFBVUkU7CiAgICAgU1RETUVUSE9EKFNldE5hbWVPZikgICAgICAgIChUSElTXyBIV05EMzIgaHduZE93bmVyLCBMUENJVEVNSURMSVNUIHBpZGwsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMUENPTEVTVFIgbHBzek5hbWUsIERXT1JEIHVGbGFncywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExQQ09MRVNUUjMyIGxwc3pOYW1lLCBEV09SRCB1RmxhZ3MsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMUElURU1JRExJU1QgKiBwcGlkbE91dCkgUFVSRTsKIH0gKkxQU0hFTExGT0xERVJfVlRBQkxFLElTaGVsbEZvbGRlcl9WVGFibGU7CiAKZGlmZiAtLWdpdCBhL2luY2x1ZGUvc3RkZGVidWcuaCBiL2luY2x1ZGUvc3RkZGVidWcuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzFjNjA5Mi4uMDAwMDAwMAotLS0gYS9pbmNsdWRlL3N0ZGRlYnVnLmgKKysrIC9kZXYvbnVsbApAQCAtMSwyNTYgKzAsMCBAQAotLyogSWYgeW91IGRlZmluZSB0aGlzIHlvdSBjYW4gZW5hYmxlIG9yIGRpc2FibGUgc3BlY2lmaWMgZGVidWdnaW5nLSAqLwotLyogbWVzc2FnZXMgYXQgcnVuLXRpbWUgYnkgc3VwcGx5aW5nIHRoZSAiLWRlYnVnbXNnIiBvcHRpb24gdG8gV2luZSAqLwotI2RlZmluZSBERUJVR19SVU5USU1FIC8qICovCi0KLQotLyogRGVmaW5lIHRoaXMgaWYgeW91IHdhbnQgdG8gZW5hYmxlIGFsbCBkZWJ1Z2dpbmctbWVzc2FnZXMsIGV4Y2VwdCAgKi8KLS8qIHRoZSBvbmVzIGV4cGxpY2l0bHkgZGlzYWJsZWQgaW4gYSBzcGVjaWZpYyAqLmMtZmlsZS4gICAgICAgICAgICAgICovCi0vKiAjZGVmaW5lIERFQlVHX0FMTCAqLwotCi0vKiBEZWZpbmUgdGhpcyBpZiB5b3Ugd2FudCB0byBlbmFibGUgYWxsIGRlYnVnZ2luZy1tZXNzYWdlcywgZXZlbiAgICAqLwotLyogdGhlIG9uZXMgZXhwbGljaXRseSBkaXNhYmxlZCBpbiBzcGVjaWZpYyAqLmMtZmlsZXMuICAgICAgICAgICAgICAgKi8KLS8qICNkZWZpbmUgREVCVUdfQUxMX0VYVCAqLwotCi0vKiBEZWZpbmUgdGhpcyBpZiB5b3Ugd2FudCB0byBkaXNhYmxlIGFsbCBkZWJ1Z2dpbmctbWVzc2FnZXMsIGV4Y2VwdCAqLwotLyogdGhlIG9uZXMgZXhwbGljaXRseSBlbmFibGVkIGluIGEgc3BlY2lmaXkgKi5jLWZpbGUuICAgICAgICAgICAgICAgKi8KLS8qICNkZWZpbmUgREVCVUdfTk9ORSAqLwotCi0vKiBEZWZpbmUgdGhpcyBpZiB5b3Ugd2FudCB0byBkaXNhYmxlIGFsbCBkZWJ1Z2dpbmctbWVzc2FnZXMsIGV2ZW4gICAqLwotLyogdGhlIG9uZXMgZXhwbGljaXRseSBlbmFibGVkIGluIHNwZWNpZmljICouYy1maWxlcy4gICAgICAgICAgICAgICAgKi8KLS8qICNkZWZpbmUgREVCVUdfTk9ORV9FWFQgKi8KLQotCi0vKiBZb3UgY2FuIGVuYWJsZSBvciBkaXNhYmxlIHNwZWNpZmljIGRlYnVnZ2luZy1tZXNzYWdlcyBoZXJlLiAgICAgICAqLyAKLS8qIEhvd2V2ZXIsIHRoaXMgY2FuIGJlIG92ZXJyaWRkZW4gaW4gdGhlIGluZGl2aWR1YWwgKi5jLWZpbGVzICAgICAgICovCi0vKiBiZXR3ZWVuICNpbmNsdWRlIDxzdGRkZWJ1Zy5oPiBhbmQgI2luY2x1ZGUgPGRlYnVnLmg+ICAgICAgICAgICAgICAqLwotCi0KLS8qICNkZWZpbmUgREVCVUdfRURJVCAgICAgICovCi0vKiAjZGVmaW5lIERFQlVHX01FTlUgICAgICAqLwotLyogI2RlZmluZSBERUJVR19NRU5VQ0FMQyAgKi8KLS8qICNkZWZpbmUgREVCVUdfU0NST0xMICAgICovCi0vKiAjZGVmaW5lIERFQlVHX0NPTUJPICAgICAqLwotLyogI2RlZmluZSBERUJVR19MSVNUQk9YICAgKi8KLS8qICNkZWZpbmUgREVCVUdfVEFTSyAgICAgICovCi0vKiAjZGVmaW5lIERFQlVHX1NFTEVDVE9SUyAqLwotLyogI2RlZmluZSBERUJVR19SRVNPVVJDRSAgKi8KLS8qICNkZWZpbmUgREVCVUdfQUNDRUwgICAgICovCi0vKiAjZGVmaW5lIERFQlVHX0ZJWFVQICAgICAqLwotLyogI2RlZmluZSBERUJVR19NT0RVTEUgICAgKi8KLS8qICNkZWZpbmUgREVCVUdfTERUICAgICAgICovCi0vKiAjZGVmaW5lIERFQlVHX0hFQVAgICAgICAqLwotLyogI2RlZmluZSBERUJVR19NQ0lBTklNICAgKi8KLS8qICNkZWZpbmUgREVCVUdfTUNJV0FWRSAgICovCi0vKiAjZGVmaW5lIERFQlVHX01JREkgICAgICAqLwotLyogI2RlZmluZSBERUJVR19JTlQgICAgICAgKi8KLS8qICNkZWZpbmUgREVCVUdfTUVUQUZJTEUgICovCi0vKiAjZGVmaW5lIERFQlVHX0dESSAgICAgICAqLwotLyogI2RlZmluZSBERUJVR19CSVRNQVAgICAgKi8KLS8qICNkZWZpbmUgREVCVUdfRk9OVCAgICAgICovCi0vKiAjZGVmaW5lIERFQlVHX1BBTEVUVEUgICAqLwotLyogI2RlZmluZSBERUJVR19JQ09OICAgICAgKi8KLS8qICNkZWZpbmUgREVCVUdfUkVHSU9OICAgICovCi0vKiAjZGVmaW5lIERFQlVHX1RFWFQgICAgICAqLwotLyogI2RlZmluZSBERUJVR19DTElQUElORyAgKi8KLS8qICNkZWZpbmUgREVCVUdfQ0FSRVQgICAgICovCi0vKiAjZGVmaW5lIERFQlVHX0NMQVNTICAgICAqLwotLyogI2RlZmluZSBERUJVR19EQyAgICAgICAgKi8KLS8qICNkZWZpbmUgREVCVUdfRElBTE9HICAgICovCi0vKiAjZGVmaW5lIERFQlVHX01FU1NBR0UgICAqLwotLyogI2RlZmluZSBERUJVR19FVkVOVCAgICAgKi8KLS8qICNkZWZpbmUgREVCVUdfS0VZICAgICAgICovCi0vKiAjZGVmaW5lIERFQlVHX0dSQVBISUNTICAqLwotLyogI2RlZmluZSBERUJVR19NREkgICAgICAgKi8KLS8qICNkZWZpbmUgREVCVUdfTVNHICAgICAgICovCi0vKiAjZGVmaW5lIERFQlVHX05PTkNMSUVOVCAqLwotLyogI2RlZmluZSBERUJVR19TWVNDT0xPUiAgKi8KLS8qICNkZWZpbmUgREVCVUdfVElNRVIgICAgICovCi0vKiAjZGVmaW5lIERFQlVHX1VUSUxJVFkgICAqLwotLyogI2RlZmluZSBERUJVR19XSU4gICAgICAgKi8KLS8qICNkZWZpbmUgREVCVUdfRU5VTSAgICAgICovCi0vKiAjZGVmaW5lIERFQlVHX0RMTCAgICAgICAqLwotLyogI2RlZmluZSBERUJVR19NU0dCT1ggICAgKi8KLS8qICNkZWZpbmUgREVCVUdfQ0FUQ0ggICAgICovCi0gCi0KLS8qIERvIG5vdCByZW1vdmUgdGhpcyBsaW5lIG9yIGNoYW5nZSBhbnl0aGluZyBiZWxvdyB0aGlzIGxpbmUgKi8KLQotI2lmZGVmIERFQlVHX05PTkUKLSN1bmRlZiBERUJVR19BQ0NFTAotI3VuZGVmIERFQlVHX0FTUEkKLSN1bmRlZiBERUJVR19BVE9NCi0jdW5kZWYgREVCVUdfQklUQkxUCi0jdW5kZWYgREVCVUdfQklUTUFQCi0jdW5kZWYgREVCVUdfQ0FSRVQKLSN1bmRlZiBERUJVR19DREFVRElPCi0jdW5kZWYgREVCVUdfQ0xBU1MKLSN1bmRlZiBERUJVR19DTElQQk9BUkQKLSN1bmRlZiBERUJVR19DTElQUElORwotI3VuZGVmIERFQlVHX0NPTUJPCi0jdW5kZWYgREVCVUdfQ09NTQotI3VuZGVmIERFQlVHX0NPTU1ETEcKLSN1bmRlZiBERUJVR19DUlRETEwKLSN1bmRlZiBERUJVR19DVVJTT1IKLSN1bmRlZiBERUJVR19EQwotI3VuZGVmIERFQlVHX0RERQotI3VuZGVmIERFQlVHX0REUkFXCi0jdW5kZWYgREVCVUdfRElBTE9HCi0jdW5kZWYgREVCVUdfRExMCi0jdW5kZWYgREVCVUdfRE9TRlMKLSN1bmRlZiBERUJVR19EUklWRVIKLSN1bmRlZiBERUJVR19EU09VTkQKLSN1bmRlZiBERUJVR19FRElUCi0jdW5kZWYgREVCVUdfRVZFTlQKLSN1bmRlZiBERUJVR19FWEVDCi0jdW5kZWYgREVCVUdfRklMRQotI3VuZGVmIERFQlVHX0ZJWFVQCi0jdW5kZWYgREVCVUdfRk9OVAotI3VuZGVmIERFQlVHX0dESQotI3VuZGVmIERFQlVHX0dMT0JBTAotI3VuZGVmIERFQlVHX0dSQVBISUNTCi0jdW5kZWYgREVCVUdfSEVBUAotI3VuZGVmIERFQlVHX0hPT0sKLSN1bmRlZiBERUJVR19JQ09OCi0jdW5kZWYgREVCVUdfSU5UCi0jdW5kZWYgREVCVUdfS0VZCi0jdW5kZWYgREVCVUdfS0VZQk9BUkQKLSN1bmRlZiBERUJVR19MRFQKLSN1bmRlZiBERUJVR19MSVNUQk9YCi0jdW5kZWYgREVCVUdfTE9DQUwKLSN1bmRlZiBERUJVR19NQ0kKLSN1bmRlZiBERUJVR19NQ0lBTklNCi0jdW5kZWYgREVCVUdfTUNJV0FWRQotI3VuZGVmIERFQlVHX01ESQotI3VuZGVmIERFQlVHX01FTlUKLSN1bmRlZiBERUJVR19NRVNTQUdFCi0jdW5kZWYgREVCVUdfTUVUQUZJTEUKLSN1bmRlZiBERUJVR19NSURJCi0jdW5kZWYgREVCVUdfTU1BVVgKLSN1bmRlZiBERUJVR19NTUlPCi0jdW5kZWYgREVCVUdfTU1TWVMKLSN1bmRlZiBERUJVR19NTVRJTUUKLSN1bmRlZiBERUJVR19NT0RVTEUKLSN1bmRlZiBERUJVR19NU0cKLSN1bmRlZiBERUJVR19OT05DTElFTlQKLSN1bmRlZiBERUJVR19PTEUKLSN1bmRlZiBERUJVR19QQUxFVFRFCi0jdW5kZWYgREVCVUdfUFJPRklMRQotI3VuZGVmIERFQlVHX1BST0dSRVNTCi0jdW5kZWYgREVCVUdfUFJPUAotI3VuZGVmIERFQlVHX1JFRwotI3VuZGVmIERFQlVHX1JFR0lPTgotI3VuZGVmIERFQlVHX1JFTEFZCi0jdW5kZWYgREVCVUdfUkVTT1VSQ0UKLSN1bmRlZiBERUJVR19TQ1JPTEwKLSN1bmRlZiBERUJVR19TRUxFQ1RPUgotI3VuZGVmIERFQlVHX1NFTQotI3VuZGVmIERFQlVHX1NFTkRNU0cKLSN1bmRlZiBERUJVR19TSE0KLSN1bmRlZiBERUJVR19TVFJFU1MKLSN1bmRlZiBERUJVR19TVFJJTkcKLSN1bmRlZiBERUJVR19UQVNLCi0jdW5kZWYgREVCVUdfVEVYVAotI3VuZGVmIERFQlVHX1RIVU5LCi0jdW5kZWYgREVCVUdfVElNRVIKLSN1bmRlZiBERUJVR19UT09MSEVMUAotI3VuZGVmIERFQlVHX1RXRUFLCi0jdW5kZWYgREVCVUdfVVBET1dOCi0jdW5kZWYgREVCVUdfVkVSCi0jdW5kZWYgREVCVUdfVklSVFVBTAotI3VuZGVmIERFQlVHX1ZYRAotI3VuZGVmIERFQlVHX1dJTgotI3VuZGVmIERFQlVHX1dJTjE2RFJWCi0jdW5kZWYgREVCVUdfV0lOMzIKLSN1bmRlZiBERUJVR19XSU5TT0NLCi0jdW5kZWYgREVCVUdfWDExCi0jZW5kaWYKLQotI2lmZGVmIERFQlVHX0FMTAotI2RlZmluZSBERUJVR19BQ0NFTAotI2RlZmluZSBERUJVR19BU1BJCi0jZGVmaW5lIERFQlVHX0FUT00KLSNkZWZpbmUgREVCVUdfQklUQkxUCi0jZGVmaW5lIERFQlVHX0JJVE1BUAotI2RlZmluZSBERUJVR19DQVJFVAotI2RlZmluZSBERUJVR19DREFVRElPCi0jZGVmaW5lIERFQlVHX0NMQVNTCi0jZGVmaW5lIERFQlVHX0NMSVBCT0FSRAotI2RlZmluZSBERUJVR19DTElQUElORwotI2RlZmluZSBERUJVR19DT01CTwotI2RlZmluZSBERUJVR19DT01NCi0jZGVmaW5lIERFQlVHX0NPTU1ETEcKLSNkZWZpbmUgREVCVUdfQ1JURExMCi0jZGVmaW5lIERFQlVHX0NVUlNPUgotI2RlZmluZSBERUJVR19EQwotI2RlZmluZSBERUJVR19EREUKLSNkZWZpbmUgREVCVUdfRERSQVcKLSNkZWZpbmUgREVCVUdfRElBTE9HCi0jZGVmaW5lIERFQlVHX0RMTAotI2RlZmluZSBERUJVR19ET1NGUwotI2RlZmluZSBERUJVR19EUklWRVIKLSNkZWZpbmUgREVCVUdfRFNPVU5ECi0jZGVmaW5lIERFQlVHX0VESVQKLSNkZWZpbmUgREVCVUdfRVZFTlQKLSNkZWZpbmUgREVCVUdfRVhFQwotI2RlZmluZSBERUJVR19GSUxFCi0jZGVmaW5lIERFQlVHX0ZJWFVQCi0jZGVmaW5lIERFQlVHX0ZPTlQKLSNkZWZpbmUgREVCVUdfR0RJCi0jZGVmaW5lIERFQlVHX0dMT0JBTAotI2RlZmluZSBERUJVR19HUkFQSElDUwotI2RlZmluZSBERUJVR19IRUFQCi0jZGVmaW5lIERFQlVHX0hPT0sKLSNkZWZpbmUgREVCVUdfSUNPTgotI2RlZmluZSBERUJVR19JTlQKLSNkZWZpbmUgREVCVUdfS0VZCi0jZGVmaW5lIERFQlVHX0tFWUJPQVJECi0jZGVmaW5lIERFQlVHX0xEVAotI2RlZmluZSBERUJVR19MSVNUQk9YCi0jZGVmaW5lIERFQlVHX0xPQ0FMCi0jZGVmaW5lIERFQlVHX01DSQotI2RlZmluZSBERUJVR19NQ0lBTklNCi0jZGVmaW5lIERFQlVHX01DSVdBVkUKLSNkZWZpbmUgREVCVUdfTURJCi0jZGVmaW5lIERFQlVHX01FTlUKLSNkZWZpbmUgREVCVUdfTUVTU0FHRQotI2RlZmluZSBERUJVR19NRVRBRklMRQotI2RlZmluZSBERUJVR19NSURJCi0jZGVmaW5lIERFQlVHX01NQVVYCi0jZGVmaW5lIERFQlVHX01NSU8KLSNkZWZpbmUgREVCVUdfTU1TWVMKLSNkZWZpbmUgREVCVUdfTU1USU1FCi0jZGVmaW5lIERFQlVHX01PRFVMRQotI2RlZmluZSBERUJVR19NU0cKLSNkZWZpbmUgREVCVUdfTk9OQ0xJRU5UCi0jZGVmaW5lIERFQlVHX09MRQotI2RlZmluZSBERUJVR19QQUxFVFRFCi0jZGVmaW5lIERFQlVHX1BST0ZJTEUKLSNkZWZpbmUgREVCVUdfUFJPR1JFU1MKLSNkZWZpbmUgREVCVUdfUFJPUAotI2RlZmluZSBERUJVR19SRUcKLSNkZWZpbmUgREVCVUdfUkVHSU9OCi0jZGVmaW5lIERFQlVHX1JFTEFZCi0jZGVmaW5lIERFQlVHX1JFU09VUkNFCi0jZGVmaW5lIERFQlVHX1NDUk9MTAotI2RlZmluZSBERUJVR19TRUxFQ1RPUgotI2RlZmluZSBERUJVR19TRU0KLSNkZWZpbmUgREVCVUdfU0VORE1TRwotI2RlZmluZSBERUJVR19TSE0KLSNkZWZpbmUgREVCVUdfU1RSRVNTCi0jZGVmaW5lIERFQlVHX1NUUklORwotI2RlZmluZSBERUJVR19UQVNLCi0jZGVmaW5lIERFQlVHX1RFWFQKLSNkZWZpbmUgREVCVUdfVEhVTksKLSNkZWZpbmUgREVCVUdfVElNRVIKLSNkZWZpbmUgREVCVUdfVE9PTEhFTFAKLSNkZWZpbmUgREVCVUdfVFdFQUsKLSNkZWZpbmUgREVCVUdfVVBET1dOCi0jZGVmaW5lIERFQlVHX1ZFUgotI2RlZmluZSBERUJVR19WSVJUVUFMCi0jZGVmaW5lIERFQlVHX1ZYRAotI2RlZmluZSBERUJVR19XSU4KLSNkZWZpbmUgREVCVUdfV0lOMTZEUlYKLSNkZWZpbmUgREVCVUdfV0lOMzIKLSNkZWZpbmUgREVCVUdfV0lOU09DSwotI2RlZmluZSBERUJVR19YMTEKLSNlbmRpZgpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9zdG9yYWdlLmggYi9pbmNsdWRlL3N0b3JhZ2UuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kY2UyMTliCi0tLSAvZGV2L251bGwKKysrIGIvaW5jbHVkZS9zdG9yYWdlLmgKQEAgLTAsMCArMSwyMTIgQEAKKyNpZm5kZWYgX1dJTkVfU1RPUkFHRV9ICisjZGVmaW5lIF9XSU5FX1NUT1JBR0VfSAorCisvKiBEb2VzIHRoaXMgbG9vayBsaWtlIGEgY2VsbGFyIHRvIHlvdT8gKi8KKworI2RlZmluZSBTVERNRVRIT0QoeGZuKSBIUkVTVUxUIChDQUxMQkFDSyAqZm4jI3hmbikKKyNkZWZpbmUgU1RETUVUSE9EXyhyZXQseGZuKSByZXQgKENBTExCQUNLICpmbiMjeGZuKQorI2RlZmluZSBQVVJFCisjZGVmaW5lIEZBUgorI2RlZmluZSBUSElTXyBUSElTLAorCitzdHJ1Y3Qgc3RvcmFnZV9oZWFkZXIgeworCUJZVEUJbWFnaWNbOF07CS8qIDAwOiBtYWdpYyAqLworCUJZVEUJdW5rbm93bjFbMzZdOwkvKiAwODogdW5rbm93biAqLworCURXT1JECW51bV9vZl9iYmRfYmxvY2tzOy8qIDJDOiBsZW5ndGggb2YgYmlnIGRhdGFibG9ja3MgKi8KKwlEV09SRAlyb290X3N0YXJ0YmxvY2s7LyogMzA6IHJvb3Qgc3RvcmFnZSBmaXJzdCBiaWcgYmxvY2sgKi8KKwlEV09SRAl1bmtub3duMlsyXTsJLyogMzQ6IHVua25vd24gKi8KKwlEV09SRAlzYmRfc3RhcnRibG9jazsJLyogM0M6IHNtYWxsIGJsb2NrIGRlcG90IGZpcnN0IGJpZyBibG9jayAqLworCURXT1JECXVua25vd24zWzNdOwkvKiA0MDogdW5rbm93biAqLworCURXT1JECWJiZF9saXN0WzEwOV07CS8qIDRDOiBiaWcgZGF0YSBibG9jayBsaXN0ICh1cCB0byBlbmQgb2Ygc2VjdG9yKSovCit9Oworc3RydWN0IHN0b3JhZ2VfcHBzX2VudHJ5IHsKKwlXQ0hBUglwcHNfcmF3bmFtZVszMl07LyogMDA6IFwwIHRlcm1pbmF0ZWQgd2lkZWNoYXIgbmFtZSAqLworCVdPUkQJcHBzX3NpemVvZm5hbWU7CS8qIDQwOiBuYW1lbGVuZ3RoIGluIGJ5dGVzICovCisJQllURQlwcHNfdHlwZTsJLyogNDI6IGZsYWdzLCAxIHN0b3JhZ2UvZGlyLCAyIHN0cmVhbSwgNSByb290ICovCisJQllURQlwcHNfdW5rbm93bjA7CS8qIDQzOiB1bmtub3duICovCisJRFdPUkQJcHBzX3ByZXY7CS8qIDQ0OiBwcmV2aW91cyBwcHMgKi8KKwlEV09SRAlwcHNfbmV4dDsJLyogNDg6IG5leHQgcHBzICovCisJRFdPUkQJcHBzX2RpcjsJLyogNEM6IGRpcmVjdG9yeSBwcHMgKi8KKwlHVUlECXBwc19ndWlkOwkvKiA1MDogY2xhc3MgSUQgKi8KKwlEV09SRAlwcHNfdW5rbm93bjE7CS8qIDYwOiB1bmtub3duICovCisJRklMRVRJTUUgcHBzX2Z0MTsJLyogNjQ6IGZpbGV0aW1lMSAqLworCUZJTEVUSU1FIHBwc19mdDI7CS8qIDcwOiBmaWxldGltZTIgKi8KKwlEV09SRAlwcHNfc2I7CQkvKiA3NDogZGF0YSBzdGFydGJsb2NrICovCisJRFdPUkQJcHBzX3NpemU7CS8qIDc4OiBkYXRhbGVuZ3RoLiAoPDB4MTAwMCk/c21hbGw6YmlnIGJsb2NrcyovCisJRFdPUkQJcHBzX3Vua25vd24yOwkvKiA3QzogdW5rbm93biAqLworfTsKKworI2RlZmluZSBTVE9SQUdFX0NIQUlORU5UUllfRkFUCQkweGZmZmZmZmZkCisjZGVmaW5lIFNUT1JBR0VfQ0hBSU5FTlRSWV9FTkRPRkNIQUlOCTB4ZmZmZmZmZmUKKyNkZWZpbmUgU1RPUkFHRV9DSEFJTkVOVFJZX0ZSRUUJCTB4ZmZmZmZmZmYKKwordHlwZWRlZiBMUE9MRVNUUjE2ICpTTkIxNjsKK3R5cGVkZWYgTFBPTEVTVFIzMiAqU05CMzI7CitERUNMX1dJTkVMSUJfVFlQRShTTkIpOworCit0eXBlZGVmIHN0cnVjdCBJU3RvcmFnZTE2IElTdG9yYWdlMTYsKkxQU1RPUkFHRTE2OwordHlwZWRlZiBzdHJ1Y3QgSVN0b3JhZ2UzMiBJU3RvcmFnZTMyLCpMUFNUT1JBR0UzMjsKK3R5cGVkZWYgc3RydWN0IElTdHJlYW0xNiBJU3RyZWFtMTYsKkxQU1RSRUFNMTY7Cit0eXBlZGVmIHN0cnVjdCBJU3RyZWFtMzIgSVN0cmVhbTMyLCpMUFNUUkVBTTMyOworCit0eXBlZGVmIHN0cnVjdCBJRW51bVNUQVRTVEcgSUVudW1TVEFUU1RHLCpMUEVOVU1TVEFUU1RHOworCit0eXBlZGVmIHN0cnVjdCB7CisgICAgTFBPTEVTVFIxNglwd2NzTmFtZTsKKyAgICBEV09SRAl0eXBlOworICAgIFVMQVJHRV9JTlRFR0VSIGNiU2l6ZTsKKyAgICBGSUxFVElNRQltdGltZTsKKyAgICBGSUxFVElNRQljdGltZTsKKyAgICBGSUxFVElNRQlhdGltZTsKKyAgICBEV09SRAlncmZNb2RlOworICAgIERXT1JECWdyZkxvY2tzU3VwcG9ydGVkOworICAgIENMU0lECWNsc2lkOworICAgIERXT1JECWdyZlN0YXRlQml0czsKKyAgICBEV09SRAlyZXNlcnZlZDsKK30gU1RBVFNURzsKKworI2RlZmluZSBTVEdNX0RJUkVDVAkJMHgwMDAwMDAwMAorI2RlZmluZSBTVEdNX1RSQU5TQUNURUQJCTB4MDAwMTAwMDAKKyNkZWZpbmUgU1RHTV9TSU1QTEUJCTB4MDgwMDAwMDAKKyNkZWZpbmUgU1RHTV9SRUFECQkweDAwMDAwMDAwCisjZGVmaW5lIFNUR01fV1JJVEUJCTB4MDAwMDAwMDEKKyNkZWZpbmUgU1RHTV9SRUFEV1JJVEUJCTB4MDAwMDAwMDIKKyNkZWZpbmUgU1RHTV9TSEFSRV9ERU5ZX05PTkUJMHgwMDAwMDA0MAorI2RlZmluZSBTVEdNX1NIQVJFX0RFTllfUkVBRAkweDAwMDAwMDMwCisjZGVmaW5lIFNUR01fU0hBUkVfREVOWV9XUklURQkweDAwMDAwMDIwCisjZGVmaW5lIFNUR01fU0hBUkVfRVhDTFVTSVZFCTB4MDAwMDAwMTAKKyNkZWZpbmUgU1RHTV9QUklPUklUWQkJMHgwMDA0MDAwMAorI2RlZmluZSBTVEdNX0RFTEVURU9OUkVMRUFTRQkweDA0MDAwMDAwCisjZGVmaW5lIFNUR01fTk9TQ1JBVENICQkweDAwMTAwMDAwCisjZGVmaW5lIFNUR01fQ1JFQVRFCQkweDAwMDAxMDAwCisjZGVmaW5lIFNUR01fQ09OVkVSVAkJMHgwMDAyMDAwMAorI2RlZmluZSBTVEdNX0ZBSUxJRlRIRVJFCTB4MDAwMDAwMDAKKworI2RlZmluZSBUSElTIExQU1RPUkFHRTE2IHRoaXMKK3R5cGVkZWYgc3RydWN0IElTdG9yYWdlMTZfVlRhYmxlIHsKKwkvKiBJVW5rbm93biBtZXRob2RzICovCisJU1RETUVUSE9EKFF1ZXJ5SW50ZXJmYWNlKSAoVEhJU18gUkVGSUlEIHJpaWQsTFBWT0lEIEZBUiogcHB2T2JqKTsKKwlTVERNRVRIT0RfKFVMT05HLEFkZFJlZikgKFRISVMpOworCVNURE1FVEhPRF8oVUxPTkcsUmVsZWFzZSkgKFRISVMpOworCS8qIElTdG9yYWdlIG1ldGhvZHMgKi8KKwlTVERNRVRIT0QoQ3JlYXRlU3RyZWFtKShUSElTXyBMUENPTEVTVFIxNiBwd2NzTmFtZSwgRFdPUkQgZ3JmTW9kZSwgRFdPUkQgcmVzZXJ2ZWQxLCBEV09SRCByZXNlcnZlZDIsIElTdHJlYW0xNiAqKnBwc3RtKTsKKyAgICAgICAgU1RETUVUSE9EKE9wZW5TdHJlYW0pKFRISVNfIExQQ09MRVNUUjE2IHB3Y3NOYW1lLCB2b2lkICpyZXNlcnZlZDEsIERXT1JEIGdyZk1vZGUsIERXT1JEIHJlc2VydmVkMiwgSVN0cmVhbTE2ICoqcHBzdG0pOworICAgICAgICBTVERNRVRIT0QoQ3JlYXRlU3RvcmFnZSkoVEhJU18gTFBDT0xFU1RSMTYgcHdjc05hbWUsIERXT1JEIGdyZk1vZGUsIERXT1JEIGR3U3RnRm10LCBEV09SRCByZXNlcnZlZDIsIElTdG9yYWdlMTYgKipwcHN0Zyk7CisgICAgICAgIFNURE1FVEhPRChPcGVuU3RvcmFnZSkoVEhJU18gTFBDT0xFU1RSMTYgcHdjc05hbWUsSVN0b3JhZ2UxNiAqcHN0Z1ByaW9yaXR5LCBEV09SRCBncmZNb2RlLCBTTkIxNiBTTkIxNkV4Y2x1ZGUsIERXT1JEIHJlc2VydmVkLCBJU3RvcmFnZTE2ICoqcHBzdGcpOworCVNURE1FVEhPRChDb3B5VG8pKFRISVNfIERXT1JEIGNpaWRFeGNsdWRlLCBjb25zdCBJSUQgKnJnaWlkRXhjbHVkZSwgU05CMTYgU05CMTZFeGNsdWRlLCBJU3RvcmFnZTE2ICpwc3RnRGVzdCk7CisJU1RETUVUSE9EKE1vdmVFbGVtZW50VG8pKFRISVNfIExQQ09MRVNUUjE2IHB3Y3NOYW1lLCBJU3RvcmFnZTE2ICpwc3RnRGVzdCwgTFBDT0xFU1RSMTYgcHdjc05ld05hbWUsIERXT1JEIGdyZkZsYWdzKTsKKwlTVERNRVRIT0QoQ29tbWl0KShUSElTXyBEV09SRCBncmZDb21taXRGbGFncyk7CisJU1RETUVUSE9EKFJldmVydCkoVEhJUyk7CisJU1RETUVUSE9EKEVudW1FbGVtZW50cykoVEhJU18gRFdPUkQgcmVzZXJ2ZWQxLHZvaWQgKnJlc2VydmVkMiwgRFdPUkQgcmVzZXJ2ZWQzLCBJRW51bVNUQVRTVEcgKipwcGVudW0pOworICAgICAgICBTVERNRVRIT0QoRGVzdHJveUVsZW1lbnQpKFRISVNfIExQQ09MRVNUUjE2IHB3Y3NOYW1lKTsKKwlTVERNRVRIT0QoUmVuYW1lRWxlbWVudCkoVEhJU18gTFBDT0xFU1RSMTYgcHdjc09sZE5hbWUsIExQQ09MRVNUUjE2IHB3Y3NOZXdOYW1lKTsKKwlTVERNRVRIT0QoU2V0RWxlbWVudFRpbWVzKShUSElTXyBMUENPTEVTVFIxNiBwd2NzTmFtZSwgY29uc3QgRklMRVRJTUUgKnBjdGltZSwgIGNvbnN0IEZJTEVUSU1FICpwYXRpbWUsIGNvbnN0IEZJTEVUSU1FICpwbXRpbWUpOworCVNURE1FVEhPRChTZXRDbGFzcykoVEhJU18gUkVGQ0xTSUQgY2xzaWQpOworCVNURE1FVEhPRChTZXRTdGF0ZUJpdHMpKFRISVNfIERXT1JEIGdyZlN0YXRlQml0cywgRFdPUkQgZ3JmTWFzayk7CisJU1RETUVUSE9EKFN0YXQpKFRISVNfIFNUQVRTVEcgKnBzdGF0c3RnLCBEV09SRCBncmZTdGF0RmxhZyk7Cit9IElTdG9yYWdlMTZfVlRhYmxlLCpMUFNUT1JBR0UxNl9WVEFCTEU7CisKK3N0cnVjdCBJU3RvcmFnZTE2IHsKKwlMUFNUT1JBR0UxNl9WVEFCTEUJCWxwdnRibDsKKwlEV09SRAkJCQlyZWY7CisJU0VHUFRSCQkJCXRoaXNwdHI7IC8qIHBvaW50ZXIgdG8gdGhpcyBzdHJ1Y3QgYXMgc2VnbWVudGVkICovCisJc3RydWN0IHN0b3JhZ2VfcHBzX2VudHJ5CXN0ZGU7CisJaW50CQkJCXBwc2VudDsKKwlIRklMRTMyCQkJCWhmOworfTsKKyN1bmRlZiBUSElTCisjZGVmaW5lIFRISVMgTFBTVE9SQUdFMzIgdGhpcwordHlwZWRlZiBzdHJ1Y3QgSVN0b3JhZ2UzMl9WVGFibGUgeworCS8qIElVbmtub3duIG1ldGhvZHMgKi8KKwlTVERNRVRIT0QoUXVlcnlJbnRlcmZhY2UpIChUSElTXyBSRUZJSUQgcmlpZCxMUFZPSUQgRkFSKiBwcHZPYmopOworCVNURE1FVEhPRF8oVUxPTkcsQWRkUmVmKSAoVEhJUyk7CisJU1RETUVUSE9EXyhVTE9ORyxSZWxlYXNlKSAoVEhJUyk7CisJLyogSVN0b3JhZ2UgbWV0aG9kcyAqLworCVNURE1FVEhPRChDcmVhdGVTdHJlYW0pKFRISVNfIExQQ09MRVNUUjMyIHB3Y3NOYW1lLCBEV09SRCBncmZNb2RlLCBEV09SRCByZXNlcnZlZDEsIERXT1JEIHJlc2VydmVkMiwgSVN0cmVhbTMyICoqcHBzdG0pOworICAgICAgICBTVERNRVRIT0QoT3BlblN0cmVhbSkoVEhJU18gTFBDT0xFU1RSMzIgcHdjc05hbWUsIHZvaWQgKnJlc2VydmVkMSwgRFdPUkQgZ3JmTW9kZSwgRFdPUkQgcmVzZXJ2ZWQyLCBJU3RyZWFtMzIgKipwcHN0bSk7CisgICAgICAgIFNURE1FVEhPRChDcmVhdGVTdG9yYWdlKShUSElTXyBMUENPTEVTVFIzMiBwd2NzTmFtZSwgRFdPUkQgZ3JmTW9kZSwgRFdPUkQgZHdTdGdGbXQsIERXT1JEIHJlc2VydmVkMiwgSVN0b3JhZ2UzMiAqKnBwc3RnKTsKKyAgICAgICAgU1RETUVUSE9EKE9wZW5TdG9yYWdlKShUSElTXyBMUENPTEVTVFIzMiBwd2NzTmFtZSxJU3RvcmFnZTMyICpwc3RnUHJpb3JpdHksIERXT1JEIGdyZk1vZGUsIFNOQjMyIFNOQjE2RXhjbHVkZSwgRFdPUkQgcmVzZXJ2ZWQsIElTdG9yYWdlMzIgKipwcHN0Zyk7CisJU1RETUVUSE9EKENvcHlUbykoVEhJU18gRFdPUkQgY2lpZEV4Y2x1ZGUsIGNvbnN0IElJRCAqcmdpaWRFeGNsdWRlLCBTTkIzMiBTTkIxNkV4Y2x1ZGUsIElTdG9yYWdlMzIgKnBzdGdEZXN0KTsKKwlTVERNRVRIT0QoTW92ZUVsZW1lbnRUbykoVEhJU18gTFBDT0xFU1RSMzIgcHdjc05hbWUsIElTdG9yYWdlMzIgKnBzdGdEZXN0LCBMUENPTEVTVFIzMiBwd2NzTmV3TmFtZSwgRFdPUkQgZ3JmRmxhZ3MpOworCVNURE1FVEhPRChDb21taXQpKFRISVNfIERXT1JEIGdyZkNvbW1pdEZsYWdzKTsKKwlTVERNRVRIT0QoUmV2ZXJ0KShUSElTKTsKKwlTVERNRVRIT0QoRW51bUVsZW1lbnRzKShUSElTXyBEV09SRCByZXNlcnZlZDEsdm9pZCAqcmVzZXJ2ZWQyLCBEV09SRCByZXNlcnZlZDMsIElFbnVtU1RBVFNURyAqKnBwZW51bSk7CisgICAgICAgIFNURE1FVEhPRChEZXN0cm95RWxlbWVudCkoVEhJU18gTFBDT0xFU1RSMzIgcHdjc05hbWUpOworCVNURE1FVEhPRChSZW5hbWVFbGVtZW50KShUSElTXyBMUENPTEVTVFIzMiBwd2NzT2xkTmFtZSwgTFBDT0xFU1RSMzIgcHdjc05ld05hbWUpOworCVNURE1FVEhPRChTZXRFbGVtZW50VGltZXMpKFRISVNfIExQQ09MRVNUUjMyIHB3Y3NOYW1lLCBjb25zdCBGSUxFVElNRSAqcGN0aW1lLCAgY29uc3QgRklMRVRJTUUgKnBhdGltZSwgY29uc3QgRklMRVRJTUUgKnBtdGltZSk7CisJU1RETUVUSE9EKFNldENsYXNzKShUSElTXyBSRUZDTFNJRCBjbHNpZCk7CisJU1RETUVUSE9EKFNldFN0YXRlQml0cykoVEhJU18gRFdPUkQgZ3JmU3RhdGVCaXRzLCBEV09SRCBncmZNYXNrKTsKKwlTVERNRVRIT0QoU3RhdCkoVEhJU18gU1RBVFNURyAqcHN0YXRzdGcsIERXT1JEIGdyZlN0YXRGbGFnKTsKK30gSVN0b3JhZ2UzMl9WVGFibGUsKkxQU1RPUkFHRTMyX1ZUQUJMRTsKKworc3RydWN0IElTdG9yYWdlMzIgeworCUxQU1RPUkFHRTMyX1ZUQUJMRQkJbHB2dGJsOworCURXT1JECQkJCXJlZjsKKwlzdHJ1Y3Qgc3RvcmFnZV9wcHNfZW50cnkJc3RkZTsKKwlpbnQJCQkJcHBzZW50OworCUhGSUxFMzIJCQkJaGY7Cit9OworI3VuZGVmIFRISVMKKworI2RlZmluZSBUSElTIExQU1RSRUFNMTYgdGhpcwordHlwZWRlZiBzdHJ1Y3QgSVN0cmVhbTE2X1ZUYWJsZSB7CisgICAgICAgIFNURE1FVEhPRChRdWVyeUludGVyZmFjZSkoVEhJU18gUkVGSUlEIHJpaWQsIHZvaWQgICogKnBwdk9iamVjdCk7CisgICAgICAgIFNURE1FVEhPRF8oVUxPTkcsQWRkUmVmKShUSElTKTsKKyAgICAgICAgU1RETUVUSE9EXyhVTE9ORyxSZWxlYXNlKShUSElTKTsKKwlTVERNRVRIT0QoUmVhZCkoVEhJU18gdm9pZCAgKnB2LCBVTE9ORyBjYiwgVUxPTkcgICpwY2JSZWFkKTsKKwlTVERNRVRIT0QoV3JpdGUpKFRISVNfIGNvbnN0IHZvaWQgICpwdixVTE9ORyBjYixVTE9ORyAgKnBjYldyaXR0ZW4pOworCVNURE1FVEhPRChTZWVrKShUSElTXyBMQVJHRV9JTlRFR0VSIGRsaWJNb3ZlLERXT1JEIGR3T3JpZ2luLFVMQVJHRV9JTlRFR0VSICAqcGxpYk5ld1Bvc2l0aW9uKTsgCisJU1RETUVUSE9EKFNldFNpemUpKFRISVNfIFVMQVJHRV9JTlRFR0VSIGxpYk5ld1NpemUpOworCVNURE1FVEhPRChDb3B5VG8pKFRISVNfIElTdHJlYW0xNiAgKnBzdG0sVUxBUkdFX0lOVEVHRVIgY2IsVUxBUkdFX0lOVEVHRVIgICpwY2JSZWFkLFVMQVJHRV9JTlRFR0VSICAqcGNiV3JpdHRlbik7CisJU1RETUVUSE9EKENvbW1pdCkoVEhJU18gRFdPUkQgZ3JmQ29tbWl0RmxhZ3MpOworCVNURE1FVEhPRChSZXZlcnQpKFRISVMpOworICAgICAgICBTVERNRVRIT0QoTG9ja1JlZ2lvbikoVEhJU18gVUxBUkdFX0lOVEVHRVIgbGliT2Zmc2V0LCBVTEFSR0VfSU5URUdFUiBjYixEV09SRCBkd0xvY2tUeXBlKTsKKwlTVERNRVRIT0QoVW5sb2NrUmVnaW9uKShUSElTXyBVTEFSR0VfSU5URUdFUiBsaWJPZmZzZXQsIFVMQVJHRV9JTlRFR0VSIGNiLCBEV09SRCBkd0xvY2tUeXBlKTsKKwlTVERNRVRIT0QoU3RhdCkoVEhJU18gU1RBVFNURyAgKnBzdGF0c3RnLCBEV09SRCBncmZTdGF0RmxhZyk7CisJU1RETUVUSE9EKENsb25lKShUSElTXyBJU3RyZWFtMTYgKipwcHN0bSk7Cit9IElTdHJlYW0xNl9WVGFibGUsKkxQU1RSRUFNMTZfVlRBQkxFOworCitzdHJ1Y3QgSVN0cmVhbTE2IHsKKwlMUFNUUkVBTTE2X1ZUQUJMRQkJbHB2dGJsOworCURXT1JECQkJCXJlZjsKKwlTRUdQVFIJCQkJdGhpc3B0cjsgLyogcG9pbnRlciB0byB0aGlzIHN0cnVjdCBhcyBzZWdtZW50ZWQgKi8KKwlzdHJ1Y3Qgc3RvcmFnZV9wcHNfZW50cnkJc3RkZTsKKwlpbnQJCQkJcHBzZW50OworCUhGSUxFMzIJCQkJaGY7CisJVUxBUkdFX0lOVEVHRVIJCQlvZmZzZXQ7Cit9OworI3VuZGVmIFRISVMKKyNkZWZpbmUgVEhJUyBMUFNUUkVBTTMyIHRoaXMKK3R5cGVkZWYgc3RydWN0IElTdHJlYW0zMl9WVGFibGUgeworICAgICAgICBTVERNRVRIT0QoUXVlcnlJbnRlcmZhY2UpKFRISVNfIFJFRklJRCByaWlkLCB2b2lkICAqICpwcHZPYmplY3QpOworICAgICAgICBTVERNRVRIT0RfKFVMT05HLEFkZFJlZikoVEhJUyk7CisgICAgICAgIFNURE1FVEhPRF8oVUxPTkcsUmVsZWFzZSkoVEhJUyk7CisJU1RETUVUSE9EKFJlYWQpKFRISVNfIHZvaWQgICpwdiwgVUxPTkcgY2IsIFVMT05HICAqcGNiUmVhZCk7CisJU1RETUVUSE9EKFdyaXRlKShUSElTXyBjb25zdCB2b2lkICAqcHYsVUxPTkcgY2IsVUxPTkcgICpwY2JXcml0dGVuKTsKKwlTVERNRVRIT0QoU2VlaykoVEhJU18gTEFSR0VfSU5URUdFUiBkbGliTW92ZSxEV09SRCBkd09yaWdpbixVTEFSR0VfSU5URUdFUiAgKnBsaWJOZXdQb3NpdGlvbik7IAorCVNURE1FVEhPRChTZXRTaXplKShUSElTXyBVTEFSR0VfSU5URUdFUiBsaWJOZXdTaXplKTsKKwlTVERNRVRIT0QoQ29weVRvKShUSElTXyBJU3RyZWFtMzIgICpwc3RtLFVMQVJHRV9JTlRFR0VSIGNiLFVMQVJHRV9JTlRFR0VSICAqcGNiUmVhZCxVTEFSR0VfSU5URUdFUiAgKnBjYldyaXR0ZW4pOworCVNURE1FVEhPRChDb21taXQpKFRISVNfIERXT1JEIGdyZkNvbW1pdEZsYWdzKTsKKwlTVERNRVRIT0QoUmV2ZXJ0KShUSElTKTsKKyAgICAgICAgU1RETUVUSE9EKExvY2tSZWdpb24pKFRISVNfIFVMQVJHRV9JTlRFR0VSIGxpYk9mZnNldCwgVUxBUkdFX0lOVEVHRVIgY2IsRFdPUkQgZHdMb2NrVHlwZSk7CisJU1RETUVUSE9EKFVubG9ja1JlZ2lvbikoVEhJU18gVUxBUkdFX0lOVEVHRVIgbGliT2Zmc2V0LCBVTEFSR0VfSU5URUdFUiBjYiwgRFdPUkQgZHdMb2NrVHlwZSk7CisJU1RETUVUSE9EKFN0YXQpKFRISVNfIFNUQVRTVEcgICpwc3RhdHN0ZywgRFdPUkQgZ3JmU3RhdEZsYWcpOworCVNURE1FVEhPRChDbG9uZSkoVEhJU18gSVN0cmVhbTMyICAqKnBwc3RtKTsKK30gSVN0cmVhbTMyX1ZUYWJsZSwqTFBTVFJFQU0zMl9WVEFCTEU7CisKK3N0cnVjdCBJU3RyZWFtMzIgeworCUxQU1RSRUFNMzJfVlRBQkxFCQlscHZ0Ymw7CisJRFdPUkQJCQkJcmVmOworCXN0cnVjdCBzdG9yYWdlX3Bwc19lbnRyeQlzdGRlOworCWludAkJCQlwcHNlbnQ7CisJSEZJTEUzMgkJCQloZjsKKwlVTEFSR0VfSU5URUdFUgkJCW9mZnNldDsKK307CisjdW5kZWYgVEhJUworCisjdW5kZWYgU1RETUVUSE9ECisjdW5kZWYgU1RETUVUSE9EXworI3VuZGVmIFBVUkUKKyN1bmRlZiBGQVIKKyN1bmRlZiBUSElTXworI2VuZGlmCmRpZmYgLS1naXQgYS9pbmNsdWRlL3RocmVhZC5oIGIvaW5jbHVkZS90aHJlYWQuaAppbmRleCA4ZmZlOTgwLi44NGQ1ZGFlIDEwMDY0NAotLS0gYS9pbmNsdWRlL3RocmVhZC5oCisrKyBiL2luY2x1ZGUvdGhyZWFkLmgKQEAgLTEyLDYgKzEyLDggQEAKICNpbmNsdWRlICJ3aW5udC5oIgogI2luY2x1ZGUgInNlbGVjdG9ycy5oIiAgLyogZm9yIFNFVF9GUyAqLwogCitzdHJ1Y3QgX1BEQjMyOworCiAvKiBUaHJlYWQgZXhjZXB0aW9uIGJsb2NrICovCiB0eXBlZGVmIHN0cnVjdCBfVEVCCiB7CkBAIC0zMCw2ICszMiw3IEBACiAgICAgSFFVRVVFMTYgICAgIHF1ZXVlOyAgICAgICAgICAvKiAyOCBNZXNzYWdlIHF1ZXVlICovCiAgICAgV09SRCAgICAgICAgIHBhZDE7ICAgICAgICAgICAvKiAyYSAqLwogICAgIExQVk9JRCAgICAgICp0bHNfcHRyOyAgICAgICAgLyogMmMgUG9pbnRlciB0byBUTFMgYXJyYXkgKi8KKyAgICBzdHJ1Y3QgX1BEQjMyICpwcm9jZXNzOyAgICAgIC8qIDMwIG93bmluZyBwcm9jZXNzICh1c2VkIGJ5IE5UMy41MSBhcHBsZXRzKSovCiB9IFRFQjsKIAogLyogRXZlbnQgd2FpdGluZyBzdHJ1Y3R1cmUgKi8KQEAgLTQxLDggKzQ0LDYgQEAKICAgICBLMzJPQkogICAgICAgKm9ianNbTUFYSU1VTV9XQUlUX09CSkVDVFNdOyAgLyogT2JqZWN0IHBvaW50ZXJzICovCiB9IFdBSVRfU1RSVUNUOwogCi1zdHJ1Y3QgX1BEQjMyOwotCiAvKiBUaHJlYWQgZGF0YWJhc2UgKi8KIHR5cGVkZWYgc3RydWN0IF9USERCCiB7CkBAIC01MCw3ICs1MSw2IEBACiAgICAgc3RydWN0IF9QREIzMiAqcHJvY2VzczsgICAgICAgIC8qICAwOCBQcm9jZXNzIG93bmluZyB0aGlzIHRocmVhZCAqLwogICAgIEszMk9CSiAgICAgICAgKmV2ZW50OyAgICAgICAgICAvKiAgMGMgVGhyZWFkIGV2ZW50ICovCiAgICAgVEVCICAgICAgICAgICAgdGViOyAgICAgICAgICAgIC8qICAxMCBUaHJlYWQgZXhjZXB0aW9uIGJsb2NrICovCi0gICAgRFdPUkQgICAgICAgICAgY3VyX3N0YWNrOyAgICAgIC8qICA0MCBDdXJyZW50IHN0YWNrICh3YXM6IHByb2Nlc3MyKSAqLwogICAgIERXT1JEICAgICAgICAgIGZsYWdzOyAgICAgICAgICAvKiAgNDQgRmxhZ3MgKi8KICAgICBEV09SRCAgICAgICAgICBleGl0X2NvZGU7ICAgICAgLyogIDQ4IFRlcm1pbmF0aW9uIHN0YXR1cyAqLwogICAgIFdPUkQgICAgICAgICAgIHRlYl9zZWw7ICAgICAgICAvKiAgNGMgU2VsZWN0b3IgdG8gVEVCICovCkBAIC02Nyw3ICs2Nyw4IEBACiAgICAgdm9pZCAgICAgICAgICAqZGVidWdnZXJfQ0I7ICAgIC8qICA3NCBEZWJ1Z2dlciBjb250ZXh0IGJsb2NrICovCiAgICAgRFdPUkQgICAgICAgICAgZGVidWdfdGhyZWFkOyAgIC8qICA3OCBUaHJlYWQgZGVidWdnaW5nIHRoaXMgb25lICg/KSAqLwogICAgIHZvaWQgICAgICAgICAgKnBjb250ZXh0OyAgICAgICAvKiAgN2MgVGhyZWFkIHJlZ2lzdGVyIGNvbnRleHQgKi8KLSAgICBEV09SRCAgICAgICAgICB1bmtub3duM1szXTsgICAgLyogIDgwIFVua25vd24gKi8KKyAgICBEV09SRCAgICAgICAgICBjdXJfc3RhY2s7ICAgICAgLyogIDgwIEN1cnJlbnQgc3RhY2sgKHdhczogdW5rbm93bikgKi8KKyAgICBEV09SRCAgICAgICAgICB1bmtub3duM1syXTsgICAgLyogIDg0IFVua25vd24gKi8KICAgICBXT1JEICAgICAgICAgICBjdXJyZW50X3NzOyAgICAgLyogIDhjIEFub3RoZXIgMTYtYml0IHN0YWNrIHNlbGVjdG9yICovCiAgICAgV09SRCAgICAgICAgICAgcGFkMjsgICAgICAgICAgIC8qICA4ZSAqLwogICAgIHZvaWQgICAgICAgICAgKnNzX3RhYmxlOyAgICAgICAvKiAgOTAgUG9pbnRlciB0byBpbmZvIGFib3V0IDE2LWJpdCBzdGFjayAqLwpAQCAtMTI1LDYgKzEyNiw3IEBACiBleHRlcm4gVEhEQiAqVEhSRUFEX0dldFB0ciggSEFORExFMzIgaGFuZGxlLCBEV09SRCBhY2Nlc3MgKTsKIGV4dGVybiB2b2lkIFRIUkVBRF9BZGRRdWV1ZSggVEhSRUFEX1FVRVVFICpxdWV1ZSwgVEhEQiAqdGhyZWFkICk7CiBleHRlcm4gdm9pZCBUSFJFQURfUmVtb3ZlUXVldWUoIFRIUkVBRF9RVUVVRSAqcXVldWUsIFRIREIgKnRocmVhZCApOworZXh0ZXJuIERXT1JEIFRIUkVBRF9UbHNBbGxvYyggVEhEQiAqdGhyZWFkICk7CiAKIC8qIHNjaGVkdWxlci9ldmVudC5jICovCiBleHRlcm4gdm9pZCBFVkVOVF9TZXQoIEszMk9CSiAqb2JqICk7CmRpZmYgLS1naXQgYS9pbmNsdWRlL3ZlcnNpb24uaCBiL2luY2x1ZGUvdmVyc2lvbi5oCmluZGV4IDdjOTYxNjUuLmMyMjRhN2EgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvdmVyc2lvbi5oCisrKyBiL2luY2x1ZGUvdmVyc2lvbi5oCkBAIC0xICsxIEBACi0jZGVmaW5lIFdJTkVfUkVMRUFTRV9JTkZPICJXaW5lIHJlbGVhc2UgOTgwMjE1IgorI2RlZmluZSBXSU5FX1JFTEVBU0VfSU5GTyAiV2luZSByZWxlYXNlIDk4MDMwMSIKZGlmZiAtLWdpdCBhL2luY2x1ZGUvd2luZG93cy5oIGIvaW5jbHVkZS93aW5kb3dzLmgKaW5kZXggYTk4M2FhNS4uYjQzOTNkZSAxMDA2NDQKLS0tIGEvaW5jbHVkZS93aW5kb3dzLmgKKysrIGIvaW5jbHVkZS93aW5kb3dzLmgKQEAgLTU3NjcsNiArNTc2Nyw5IEBACiBEV09SRCAgICAgICBXSU5BUEkgR2V0Q3VycmVudFByb2Nlc3NJZCh2b2lkKTsKIEhBTkRMRTMyICAgIFdJTkFQSSBHZXRDdXJyZW50VGhyZWFkKHZvaWQpOwogRFdPUkQgICAgICAgV0lOQVBJIEdldEN1cnJlbnRUaHJlYWRJZCh2b2lkKTsKK0lOVDMyICAgICAgIFdJTkFQSSBHZXREYXRlRm9ybWF0MzJBKExDSUQsRFdPUkQsTFBTWVNURU1USU1FLExQQ1NUUixMUFNUUixJTlQzMik7CitJTlQzMiAgICAgICBXSU5BUEkgR2V0RGF0ZUZvcm1hdDMyVyhMQ0lELERXT1JELExQU1lTVEVNVElNRSxMUENXU1RSLExQV1NUUixJTlQzMik7CisjZGVmaW5lICAgICBHZXREYXRlRm9ybWF0IFdJTkVMSUJfTkFNRV9BVyhHZXREYXRlRm9ybWF0KQogQk9PTDMyICAgICAgV0lOQVBJIEdldERDT3JnRXgoSERDMzIsTFBQT0lOVDMyKTsKIExQU1RSICAgICAgIFdJTkFQSSBHZXRFbnZpcm9ubWVudFN0cmluZ3MzMkEodm9pZCk7CiBMUFdTVFIgICAgICBXSU5BUEkgR2V0RW52aXJvbm1lbnRTdHJpbmdzMzJXKHZvaWQpOwpAQCAtNTg1Niw2ICs1ODU5LDggQEAKIEJPT0wzMiAgICAgIFdJTkFQSSBNb3ZlRmlsZUV4MzJXKExQQ1dTVFIsTFBDV1NUUixEV09SRCk7CiAjZGVmaW5lICAgICBNb3ZlRmlsZUV4IFdJTkVMSUJfTkFNRV9BVyhNb3ZlRmlsZUV4KQogRFdPUkQgICAgICAgV0lOQVBJIE1zZ1dhaXRGb3JNdWx0aXBsZU9iamVjdHMoRFdPUkQsSEFORExFMzIqLEJPT0wzMixEV09SRCxEV09SRCk7CitJTlQzMiAgICAgICBXSU5BUEkgTXVsdGlCeXRlVG9XaWRlQ2hhcihVSU5UMzIsRFdPUkQsTFBDU1RSLElOVDMyLExQV1NUUixJTlQzMik7CitJTlQzMiAgICAgICBXSU5BUEkgV2lkZUNoYXJUb011bHRpQnl0ZShVSU5UMzIsRFdPUkQsTFBDV1NUUixJTlQzMixMUFNUUixJTlQzMixMUENTVFIsQk9PTDMyKik7CiBIQU5ETEUzMiAgICBXSU5BUEkgT3BlbkV2ZW50MzJBKERXT1JELEJPT0wzMixMUENTVFIpOwogSEFORExFMzIgICAgV0lOQVBJIE9wZW5FdmVudDMyVyhEV09SRCxCT09MMzIsTFBDV1NUUik7CiAjZGVmaW5lICAgICBPcGVuRXZlbnQgV0lORUxJQl9OQU1FX0FXKE9wZW5FdmVudCkKQEAgLTU4NzcsNyArNTg4Miw3IEBACiBCT09MMzIgICAgICBXSU5BUEkgUmVhZENvbnNvbGUzMkEoSEFORExFMzIsTFBWT0lELERXT1JELExQRFdPUkQsTFBWT0lEKTsKIEJPT0wzMiAgICAgIFdJTkFQSSBSZWFkQ29uc29sZTMyVyhIQU5ETEUzMixMUFZPSUQsRFdPUkQsTFBEV09SRCxMUFZPSUQpOwogI2RlZmluZSAgICAgUmVhZENvbnNvbGUgV0lORUxJQl9OQU1FX0FXKFJlYWRDb25zb2xlKQotQk9PTDMyICAgICAgV0lOQVBJIFJlYWRGaWxlKEhGSUxFMzIsTFBWT0lELERXT1JELExQRFdPUkQsTFBPVkVSTEFQUEVEKTsKK0JPT0wzMiAgICAgIFdJTkFQSSBSZWFkRmlsZShIQU5ETEUzMixMUFZPSUQsRFdPUkQsTFBEV09SRCxMUE9WRVJMQVBQRUQpOwogRFdPUkQgICAgICAgV0lOQVBJIFJlZ0NyZWF0ZUtleUV4MzJBKEhLRVksTFBDU1RSLERXT1JELExQU1RSLERXT1JELFJFR1NBTSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMUFNFQ1VSSVRZX0FUVFJJQlVURVMsTFBIS0VZLExQRFdPUkQpOwogRFdPUkQgICAgICAgV0lOQVBJIFJlZ0NyZWF0ZUtleUV4MzJXKEhLRVksTFBDV1NUUixEV09SRCxMUFdTVFIsRFdPUkQsUkVHU0FNLApAQCAtNTk2Nyw3ICs1OTcyLDcgQEAKIEJPT0wzMiAgICAgIFdJTkFQSSBXcml0ZUNvbnNvbGUzMkEoSEFORExFMzIsTFBDVk9JRCxEV09SRCxMUERXT1JELExQVk9JRCk7CiBCT09MMzIgICAgICBXSU5BUEkgV3JpdGVDb25zb2xlMzJXKEhBTkRMRTMyLExQQ1ZPSUQsRFdPUkQsTFBEV09SRCxMUFZPSUQpOwogI2RlZmluZSAgICAgV3JpdGVDb25zb2xlIFdJTkVMSUJfTkFNRV9BVyhXcml0ZUNvbnNvbGUpCi1CT09MMzIgICAgICBXSU5BUEkgV3JpdGVGaWxlKEhGSUxFMzIsTFBWT0lELERXT1JELExQRFdPUkQsTFBPVkVSTEFQUEVEKTsKK0JPT0wzMiAgICAgIFdJTkFQSSBXcml0ZUZpbGUoSEFORExFMzIsTFBDVk9JRCxEV09SRCxMUERXT1JELExQT1ZFUkxBUFBFRCk7CiAKIC8qIERlY2xhcmF0aW9ucyBmb3IgZnVuY3Rpb25zIHRoYXQgYXJlIHRoZSBzYW1lIGluIFdpbjE2IGFuZCBXaW4zMiAqLwogCmRpZmYgLS1naXQgYS9pbmNsdWRlL3dpbmVycm9yLmggYi9pbmNsdWRlL3dpbmVycm9yLmgKaW5kZXggZTBjOWRkYS4uNzYzYTEyNCAxMDA2NDQKLS0tIGEvaW5jbHVkZS93aW5lcnJvci5oCisrKyBiL2luY2x1ZGUvd2luZXJyb3IuaApAQCAtNCw2ICs0LDExIEBACiAKIGV4dGVybiBpbnQgV0lOMzJfTGFzdEVycm9yOwogCisjZGVmaW5lIEZBQ0lMSVRZX1dJTjMyCQk3CisKKyNkZWZpbmUgU0VWRVJJVFlfRVJST1IJCTEKKworCiAjZGVmaW5lIE1BS0VfSFJFU1VMVChzZXYsZmFjLGNvZGUpIFwKICAgICAoKEhSRVNVTFQpICgoKHVuc2lnbmVkIGxvbmcpKHNldik8PDMxKSB8ICgodW5zaWduZWQgbG9uZykoZmFjKTw8MTYpIHwgKCh1bnNpZ25lZCBsb25nKShjb2RlKSkpICkKICNkZWZpbmUgTUFLRV9TQ09ERShzZXYsZmFjLGNvZGUpIFwKQEAgLTUyLDYgKzU3LDcgQEAKICNkZWZpbmUgRVJST1JfUE9TU0lCTEVfREVBRExPQ0sgICAgIDExMzEKICNkZWZpbmUgRVJST1JfQkFEX0RFVklDRSAgICAgICAgICAgIDEyMDAKICNkZWZpbmUgRVJST1JfTk9fTkVUV09SSyAgICAgICAgICAgIDEyMjIKKyNkZWZpbmUgRVJST1JfQUxSRUFEWV9JTklUSUFMSVpFRCAgIDEyNDcKICNkZWZpbmUgRVJST1JfQ09NTUlUTUVOVF9MSU1JVCAgICAgIDE0NTUKIAogLyogSFJFU1VMVCB2YWx1ZXMgZm9yIE9MRSwgU0hFTEwgYW5kIG90aGVyIEludGVyZmFjZSBzdHVmZiAqLwpAQCAtNjYsNCArNzIsMzggQEAKICNkZWZpbmUJRV9PVVRPRk1FTU9SWQkJCTB4ODAwNzAwMEUKICNkZWZpbmUJRV9JTlZBTElEQVJHCQkJMHg4MDA3MDA1NwogCisjZGVmaW5lIFNUR19FX0lOVkFMSURGVU5DVElPTgkJMHg4MDAzMDAwMQorI2RlZmluZSBTVEdfRV9GSUxFTk9URk9VTkQJCTB4ODAwMzAwMDIKKyNkZWZpbmUgU1RHX0VfUEFUSE5PVEZPVU5ECQkweDgwMDMwMDAzCisjZGVmaW5lIFNUR19FX1RPT01BTllPUEVORklMRVMJCTB4ODAwMzAwMDQKKyNkZWZpbmUgU1RHX0VfQUNDRVNTREVOSUVECQkweDgwMDMwMDA1CisjZGVmaW5lIFNUR19FX0lOVkFMSURIQU5ETEUJCTB4ODAwMzAwMDYKKyNkZWZpbmUgU1RHX0VfSU5TVUZGSUNJRU5UTUVNT1JZCTB4ODAwMzAwMDgKKyNkZWZpbmUgU1RHX0VfSU5WQUxJRFBPSU5URVIJCTB4ODAwMzAwMDkKKyNkZWZpbmUgU1RHX0VfTk9NT1JFRklMRVMJCTB4ODAwMzAwMTIKKyNkZWZpbmUgU1RHX0VfRElTS0lTV1JJVEVQUk9URUNURUQJMHg4MDAzMDAxMworI2RlZmluZSBTVEdfRV9TRUVLRVJST1IJCQkweDgwMDMwMDE5CisjZGVmaW5lIFNUR19FX1dSSVRFRkFVTFQJCTB4ODAwMzAwMUQKKyNkZWZpbmUgU1RHX0VfUkVBREZBVUxUCQkJMHg4MDAzMDAxRQorI2RlZmluZSBTVEdfRV9TSEFSRVZJT0xBVElPTgkJMHg4MDAzMDAyMAorI2RlZmluZSBTVEdfRV9MT0NLVklPTEFUSU9OCQkweDgwMDMwMDIxCisjZGVmaW5lIFNUR19FX0ZJTEVBTFJFQURZRVhJU1RTCQkweDgwMDMwMDUwCisjZGVmaW5lIFNUR19FX0lOVkFMSURQQVJBTUVURVIJCTB4ODAwMzAwNTcKKyNkZWZpbmUgU1RHX0VfTUVESVVNRlVMTAkJMHg4MDAzMDA3MAorI2RlZmluZSBTVEdfRV9BQk5PUk1BTEFQSUVYSVQJCTB4ODAwMzAwRkEKKyNkZWZpbmUgU1RHX0VfSU5WQUxJREhFQURFUgkJMHg4MDAzMDBGQgorI2RlZmluZSBTVEdfRV9JTlZBTElETkFNRQkJMHg4MDAzMDBGQworI2RlZmluZSBTVEdfRV9VTktOT1dOCQkJMHg4MDAzMDBGRAorI2RlZmluZSBTVEdfRV9VTklNUExFTUVOVEVERlVOQ1RJT04JMHg4MDAzMDBGRQorI2RlZmluZSBTVEdfRV9JTlZBTElERkxBRwkJMHg4MDAzMDBGRgorI2RlZmluZSBTVEdfRV9JTlVTRQkJCTB4ODAwMzAxMDAKKyNkZWZpbmUgU1RHX0VfTk9UQ1VSUkVOVAkJMHg4MDAzMDEwMQorI2RlZmluZSBTVEdfRV9SRVZFUlRFRAkJCTB4ODAwMzAxMDIKKyNkZWZpbmUgU1RHX0VfQ0FOVFNBVkUJCQkweDgwMDMwMTAzCisjZGVmaW5lIFNUR19FX09MREZPUk1BVAkJCTB4ODAwMzAxMDQKKyNkZWZpbmUgU1RHX0VfT0xERExMCQkJMHg4MDAzMDEwNQorI2RlZmluZSBTVEdfRV9TSEFSRVJFUVVJUkVECQkweDgwMDMwMTA2CisjZGVmaW5lIFNUR19FX05PVEZJTEVCQVNFRFNUT1JBR0UJMHg4MDAzMDEwNworI2RlZmluZSBTVEdfRV9FWFRBTlRNQVJTSEFMTElOR1MJMHg4MDAzMDEwOAorCiAjZW5kaWYgIC8qIF9fV0lORV9XSU5FUlJPUl9IICovCmRpZmYgLS1naXQgYS9pcGMvZGRlX2F0b20uYyBiL2lwYy9kZGVfYXRvbS5jCmluZGV4IDFhZWY2NTQuLjQ1ODU2NWEgMTAwNjQ0Ci0tLSBhL2lwYy9kZGVfYXRvbS5jCisrKyBiL2lwYy9kZGVfYXRvbS5jCkBAIC0xNiw3ICsxNiw2IEBACiAjaW5jbHVkZSAic2htX21haW5fYmxrLmgiCiAjaW5jbHVkZSAic2htX2ZyYWdtZW50LmgiCiAjaW5jbHVkZSAibGR0LmgiCi0jaW5jbHVkZSAic3RkZGVidWcuaCIKICNpbmNsdWRlICJkZWJ1Zy5oIgogCiB0eXBlZGVmIHN0cnVjdApAQCAtMTMwLDcgKzEyOSw3IEBACiAgICAgIHJldHVybiAoYXRvbTxNSU5fU1RSX0FUT00pID8gYXRvbSA6IDA7CiAgIH0KIAotICBkcHJpbnRmX2F0b20oc3RkZGViLCJHbG9iYWxBZGRBdG9tKFwiJXNcIilcbiIsc3RyKTsKKyAgZHByaW50Zl9pbmZvKGF0b20sIkdsb2JhbEFkZEF0b20oXCIlc1wiKVxuIixzdHIpOwogCiAgIERERV9JUENfaW5pdCgpOwkJLyogd2lsbCBpbml0aWFsaXplIG9ubHkgaWYgbmVlZGVkICovCiAgIApAQCAtMTc1LDcgKzE3NCw3IEBACiAgIEF0b21EYXRhX3B0ciBhdG9tX3B0cjsKICAgQVRPTSByZXR2YWw9KEFUT00pIDA7CiAgIAotICBkcHJpbnRmX2F0b20oc3RkZGViLCJHbG9iYWxEZWxldGVBdG9tKFwiJWRcIilcbiIsKGludClhdG9tKTsKKyAgZHByaW50Zl9pbmZvKGF0b20sIkdsb2JhbERlbGV0ZUF0b20oXCIlZFwiKVxuIiwoaW50KWF0b20pOwogICBhdG9tX2lkeD0oaW50KWF0b20gLSBNSU5fU1RSX0FUT007CiAgIAogICBpZiAoYXRvbV9pZHggPCAwICkKQEAgLTIxMiw3ICsyMTEsNyBAQAogICBpbnQgYXRvbV9vZnM7CiAgIGNoYXIgKnN0cjsKIAotICBkcHJpbnRmX2F0b20oc3RkZGViLCJHbG9iYWxGaW5kQXRvbSglMDhseClcbiIsIG5hbWUgKTsKKyAgZHByaW50Zl9pbmZvKGF0b20sIkdsb2JhbEZpbmRBdG9tKCUwOGx4KVxuIiwgbmFtZSApOwogCiAgIC8qIEZpcnN0IGNoZWNrIGZvciBpbnRlZ2VyIGF0b20gKi8KIApAQCAtMjI0LDcgKzIyMyw3IEBACiAgICAgIEFUT00gYXRvbT0gKEFUT00pIGF0b2koJnN0clsxXSk7CiAgICAgIHJldHVybiAoYXRvbTxNSU5fU1RSX0FUT00pID8gYXRvbSA6IDA7CiAgIH0KLSAgZHByaW50Zl9hdG9tKHN0ZGRlYiwiR2xvYmFsRmluZEF0b20oXCIlc1wiKVxuIixzdHIpOworICBkcHJpbnRmX2luZm8oYXRvbSwiR2xvYmFsRmluZEF0b20oXCIlc1wiKVxuIixzdHIpOwogCiAgIERERV9JUENfaW5pdCgpOwkJLyogd2lsbCBpbml0aWFsaXplIG9ubHkgaWYgbmVlZGVkICovCiAKZGlmZiAtLWdpdCBhL2lwYy9kZGVfYXRvbV90ZXN0LmMgYi9pcGMvZGRlX2F0b21fdGVzdC5jCmluZGV4IGRkNTg3YzQuLmIwZDAzNDEgMTAwNjQ0Ci0tLSBhL2lwYy9kZGVfYXRvbV90ZXN0LmMKKysrIGIvaXBjL2RkZV9hdG9tX3Rlc3QuYwpAQCAtMTIsNyArMTIsNiBAQAogI2luY2x1ZGUgPHdpbi5oPgogI2luY2x1ZGUgImRkZV9hdG9tLmgiCiAjaW5jbHVkZSAic2htX21haW5fYmxrLmgiCi0jaW5jbHVkZSA8c3RkZGVidWcuaD4KICNpbmNsdWRlIDxkZWJ1Zy5oPgogI2RlZmluZSBUT0dFVEhFUiAoRERFX0FUT01TLzUpCiAKQEAgLTI1LDkgKzI0LDkgQEAKICAgaW50IGksaixhdG9tX247CiAgIGludCBhdG9tX2xlbltUT0dFVEhFUl07CiAgIAotICBkZWJ1Z2dpbmdfc2htPTE7Ci0gIGRlYnVnZ2luZ19hdG9tPTA7Ci0gIGRlYnVnZ2luZ19zZW09MDsKKyAgZGVidWdnaW5nX2luZm8oc2htKT0xOworICBkZWJ1Z2dpbmdfaW5mbyhhdG9tKT0wOworICBkZWJ1Z2dpbmdfaW5mbyhzZW0pPTA7CiAgIAogICBmb3IgKGk9MCA7IGk8PTEwMDAwL1RPR0VUSEVSIDsgaSsrKSB7CiAgICAgIGZvciAoYXRvbV9uPTAgOyBhdG9tX248VE9HRVRIRVIgOyBhdG9tX24rKykgewpkaWZmIC0tZ2l0IGEvaXBjL2RkZV9tZW0uYyBiL2lwYy9kZGVfbWVtLmMKaW5kZXggNWYxMGVkZS4uYWMyOWM3MCAxMDA2NDQKLS0tIGEvaXBjL2RkZV9tZW0uYworKysgYi9pcGMvZGRlX21lbS5jCkBAIC0xMCw5ICsxMCw4IEBACiAjaWZkZWYgQ09ORklHX0lQQwogCiAjaW5jbHVkZSA8c3RkaW8uaD4KLSNpbmNsdWRlIDxzdGRkZWJ1Zy5oPgotI2luY2x1ZGUgPGRlYnVnLmg+CiAjaW5jbHVkZSA8YXNzZXJ0Lmg+CisjaW5jbHVkZSAiZGVidWcuaCIKICNpbmNsdWRlICJsZHQuaCIKICNpbmNsdWRlICJzaG1fbWFpbl9ibGsuaCIKICNpbmNsdWRlICJzaG1fZnJhZ21lbnQuaCIKQEAgLTU5LDE4ICs1OCwxOCBAQAogewogICBzdHJ1Y3Qgc2htX2Jsb2NrICpibG9jazsKICAgCi0gIGRwcmludGZfZ2xvYmFsKHN0ZGRlYiwic2htOmxvY2F0ZV9oYW5kbGUoMHglMDR4KVxuIiwgaCk7CisgIGRwcmludGZfaW5mbyhnbG9iYWwsInNobTpsb2NhdGVfaGFuZGxlKDB4JTA0eClcbiIsIGgpOwogCiAKICAgaWYgKFNhbXBsZUJpdCggJmZyZWVfaGFuZGxlcywgRERFX01FTV9JRFgoaCkpID09IDApIHsKLSAgICAgZHByaW50Zl9nbG9iYWwoc3RkZGViLCAic2htOmxvY2F0ZV9oYW5kbGU6IHJldHVybiBOVUxMXG4iKTsKKyAgICAgZHByaW50Zl9pbmZvKGdsb2JhbCwgInNobTpsb2NhdGVfaGFuZGxlOiByZXR1cm4gTlVMTFxuIik7CiAgICAgIHJldHVybiBOVUxMOwkJICAgLyogZnJlZSEhISAqLwogICB9CiAgIAogICBibG9jaz0gc2htX2xvY2F0ZV9ibG9jayhEREVfTUVNX0lORk8oaCkuc2htaWQsIG1hcCk7CiAgIGlmIChibG9jayA9PSBOVUxMKSB7CiAgICAgICAvKiBub3RoaW5nIGZvdW5kICovCi0gICAgICBkcHJpbnRmX2dsb2JhbChzdGRkZWIsICJzaG06bG9jYXRlX2hhbmRsZTogcmV0dXJuIE5VTExcbiIpOworICAgICAgZHByaW50Zl9pbmZvKGdsb2JhbCwgInNobTpsb2NhdGVfaGFuZGxlOiByZXR1cm4gTlVMTFxuIik7CiAgICAgICByZXR1cm4gTlVMTDsKICAgfQogCkBAIC04OCw3ICs4Nyw3IEBACiAgIGlmIChiaXRfbnIgIT0gLTEpCiAgICAgIHJldHVybiBEREVfTUVNX0hBTkRMRShiaXRfbnIpOwogCi0gIGRwcmludGZfZ2xvYmFsKHN0ZGRlYiwiZGRlX2FsbG9jX2hhbmRsZTogbm8gZnJlZSBEREUgaGFuZGxlIGZvdW5kXG4iKTsKKyAgZHByaW50Zl9pbmZvKGdsb2JhbCwiZGRlX2FsbG9jX2hhbmRsZTogbm8gZnJlZSBEREUgaGFuZGxlIGZvdW5kXG4iKTsKICAgcmV0dXJuIDA7CiB9CiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgpAQCAtMTAzLDcgKzEwMiw3IEBACiAgICAgc3RydWN0IGxvY2FsX3NobV9tYXAgKmN1cnI7CiAgICAgSEdMT0JBTDE2IGhhbmRsZTsKICAgICAKLSAgICBkcHJpbnRmX2dsb2JhbChzdGRkZWIsIkRERV9tYWxsb2MgZmxhZ3MgJTRYLCBzaXplICVsZFxuIiwgZmxhZ3MsIHNpemUpOworICAgIGRwcmludGZfaW5mbyhnbG9iYWwsIkRERV9tYWxsb2MgZmxhZ3MgJTRYLCBzaXplICVsZFxuIiwgZmxhZ3MsIHNpemUpOwogICAgIERERV9JUENfaW5pdCgpOwkJLyogbWFrZSBzdXJlIG1haW4gc2htIGJsb2NrIGFsbG9jYXRlZCAqLyAKIAogICAgIHNobV93cml0ZV93YWl0KG1haW5fYmxvY2stPnByb2NbY3Vycl9wcm9jX2lkeF0uc2VtKTsKQEAgLTE1MiwxNCArMTUxLDE0IEBACiAgICAgaGFuZGxlPSBkZGVfYWxsb2NfaGFuZGxlKCk7CiAgICAgCiAgICAgaWYgKGhhbmRsZSkgewotICAgICAgIGRwcmludGZfZ2xvYmFsKHN0ZGRlYiwKKyAgICAgICBkcHJpbnRmX2luZm8oZ2xvYmFsLAogCQkgICAgICAiRERFX21hbGxvYyByZXR1cm5pbmcgaGFuZGxlPTB4JTR4LCBwdHI9MHglMDhseFxuIiwKIAkJICAgICAgKGludCloYW5kbGUsIChsb25nKSBISU5GTzJEQVRBUFRSKGhfaW5mbykpOwogICAgICAgIERERV9NRU1fSU5GTyhoYW5kbGUpLnJlbD0gIFBUUjJSRUwoYmxvY2ssIGhfaW5mbyk7CiAgICAgICAgRERFX01FTV9JTkZPKGhhbmRsZSkuc2htaWQ9IHNobWlkOwogICAgIH0KICAgICBlbHNlCi0gICAgICAgZHByaW50Zl9nbG9iYWwoc3RkZGViLCJEREVfbWFsbG9jIGZhaWxlZFxuIik7CisgICAgICAgZHByaW50Zl93YXJuKGdsb2JhbCwgIkRERV9tYWxsb2MgZmFpbGVkXG4iKTsKIAogICAgIHNobV93cml0ZV9zaWduYWwobWFpbl9ibG9jay0+cHJvY1tjdXJyX3Byb2NfaWR4XS5zZW0pOwogICAgIApAQCAtMTczLDcgKzE3Miw3IEBACiAgIGludCBoYW5kbGVfaW5kZXg9IGggJiAweDdmZmY7CiAgIHN0cnVjdCBsb2NhbF9zaG1fbWFwIG1hcDsKIAotICBkcHJpbnRmX2dsb2JhbChzdGRkZWIsIkRERV9HbG9iYWxGcmVlKDB4JTA0eClcbiIsaCk7CisgIGRwcmludGZfaW5mbyhnbG9iYWwsIkRERV9HbG9iYWxGcmVlKDB4JTA0eClcbiIsaCk7CiAKICAgaWYgKGg9PTApCiAgICAgIHJldHVybiAwOwpAQCAtMjM5LDcgKzIzOCw3IEBACiAgIGlmIChzZWdwdHIgIT0gTlVMTCkKICAgICAgICpzZWdwdHI9MDsKIAotICBkcHJpbnRmX2dsb2JhbChzdGRkZWIsIkRERV9BdHRhY2hIYW5kbGUoJTA0eClcbiIsaGFuZGxlKTsKKyAgZHByaW50Zl9pbmZvKGdsb2JhbCwiRERFX0F0dGFjaEhhbmRsZSglMDR4KVxuIixoYW5kbGUpOwogICBoX2luZm89bG9jYXRlX2hhbmRsZShoYW5kbGUsIE5VTEwpOwogCiAgIGlmIChoX2luZm8gPT0gTlVMTCkgCkBAIC0yNTAsNyArMjQ5LDcgQEAKICAgICAgIHJldHVybiBOVUxMOwogICB9CiAgIAotICBkcHJpbnRmX2dsb2JhbChzdGRkZWIsIkRERV9BdHRhY2hIYW5kbGU6IGhfaW5mbz0lMDZseFxuIiwobG9uZyloX2luZm8pOworICBkcHJpbnRmX2luZm8oZ2xvYmFsLCJEREVfQXR0YWNoSGFuZGxlOiBoX2luZm89JTA2bHhcbiIsKGxvbmcpaF9pbmZvKTsKIAogICBzaG1kYXRhLmhhbmRsZT0gaGFuZGxlOwogICBzaG1kYXRhLnNobWlkPSBEREVfTUVNX0lORk8oaGFuZGxlKS5zaG1pZDsKQEAgLTI2NCwxMCArMjYzLDEwIEBACiAgIGlmIChzZWdwdHIgIT0gTlVMTCkgCiAgICAgICAqc2VncHRyPSAoU0VHUFRSKU1BS0VMT05HKCAwLCBzaG1kYXRhLnNlbCk7CiAKLSAgaWYgKGRlYnVnZ2luZ19kZGUpCisgIGlmIChkZWJ1Z2dpbmdfaW5mbyhkZGUpKQogICAgICAgZGVidWdfbGFzdF9oYW5kbGVfc2l6ZT0gaF9pbmZvLT5zaXplOwogCi0gIGRwcmludGZfZ2xvYmFsKHN0ZGRlYiwiRERFX0F0dGFjaEhhbmRsZSByZXR1cm5zIHB0cj0weCUwOGx4XG4iLCAobG9uZylwdHIpOworICBkcHJpbnRmX2luZm8oZ2xvYmFsLCJEREVfQXR0YWNoSGFuZGxlIHJldHVybnMgcHRyPTB4JTA4bHhcbiIsIChsb25nKXB0cik7CiAKICAgcmV0dXJuIChMUFNUUilwdHI7CiAKZGlmZiAtLWdpdCBhL2lwYy9kZGVfcHJvYy5jIGIvaXBjL2RkZV9wcm9jLmMKaW5kZXggNTcxNDJiMS4uYTA4YjA2OSAxMDA2NDQKLS0tIGEvaXBjL2RkZV9wcm9jLmMKKysrIGIvaXBjL2RkZV9wcm9jLmMKQEAgLTI2LDcgKzI2LDYgQEAKICNpbmNsdWRlICJkZGVfcHJvYy5oIgogI2luY2x1ZGUgImRkZV9tZW0uaCIKICNpbmNsdWRlICJkZGUuaCIKLSNpbmNsdWRlICJzdGRkZWJ1Zy5oIgogI2luY2x1ZGUgImRlYnVnLmgiCiAjaW5jbHVkZSAieG1hbGxvYy5oIgogCkBAIC00OCw5ICs0Nyw3IEBACiAjZGVmaW5lIERERV9NU0dfU0laRSAgIHNpemVvZihNU0cxNikKICNkZWZpbmUgRlJFRV9XTkQgKFdPUkQpKC0yKQogI2RlZmluZSBERUxFVEVEX1dORCAoV09SRCkoLTMpCi0jaWYgZGVmaW5lZChERUJVR19NU0cpIHx8IGRlZmluZWQoREVCVUdfUlVOVElNRSkKIHN0YXRpYyBjaGFyICptc2dfdHlwZVs0XT17IioqKioqKioqIiwgIkRERV9TRU5EIiwgIkRERV9QT1NUIiwgIkRERV9BQ0sifTsKLSNlbmRpZgogCiBzdHJ1Y3QgbXNnX2RhdCB7CiAJc3RydWN0IG1zZ2J1ZiBkYXQ7CkBAIC0xMjYsNyArMTIzLDcgQEAKIHsKICAgZGRlX3Byb2MgcHJvYzsKICAgaW50IHByb2NfaWR4OwotICBkcHJpbnRmX2RkZShzdGRkZWIsImRkZV9wcm9jX2FkZCguLilcbiIpOworICBkcHJpbnRmX2luZm8oZGRlLCJkZGVfcHJvY19hZGQoLi4pXG4iKTsKICAgc2htX3dyaXRlX3dhaXQobWFpbl9ibG9jay0+c2VtKTsKIAogICAvKiBmaW5kIGZyZWUgcHJvY19pZHggYW5kIGFsbG9jYXRlIGl0ICovCkBAIC0xNjcsNyArMTY0LDcgQEAKICAgICAgICBzaXplPSBtc2dyY3YoIG1haW5fYmxvY2stPnByb2NbY3Vycl9wcm9jX2lkeF0ubXNnICwgJmFja19idWZmLmRhdCwKIAkJICAgICAxLCBEREVfQUNLLCBJUENfTk9XQUlUKTsKICAgICAgICBpZiAoc2l6ZT49MCkgewotCSAgZHByaW50Zl9tc2coc3RkZGViLCJnZXRfYWNrOiByZWNlaXZlZCBEREVfQUNLIG1lc3NhZ2VcbiIpOworCSAgZHByaW50Zl9pbmZvKG1zZywiZ2V0X2FjazogcmVjZWl2ZWQgRERFX0FDSyBtZXNzYWdlXG4iKTsKIAkgIHJldHVybiBUUlVFOwogICAgICAgIH0KICAgICAgICBpZiAoRERFX0dldFJlbW90ZU1lc3NhZ2UoKSkgewpAQCAtMjAwLDcgKzE5Nyw3IEBACiAgICAgIHJldHVybiBGQUxTRTsKICAgfQogCi0gIGlmIChkZWJ1Z2dpbmdfZGRlKSB7CisgIGlmIChkZWJ1Z2dpbmdfaW5mbyhkZGUpIHx8IGRlYnVnZ2luZ193YXJuX2RkZSkgewogICAgICBNU0cxNiAqbXNnPShNU0cxNiopICZtc2didWYtPm10ZXh0OwogICAgICBjaGFyICp0aXRsZTsKICAgICAgaWYgKG1zZ2J1Zi0+bXR5cGU9PURERV9TRU5EKQpAQCAtMjEyLDEzICsyMDksMTMgQEAKICAgICAgaWYgKHRpdGxlKQogCSBwcmludF9kZGVfbWVzc2FnZSh0aXRsZSwgbXNnKTsKICAgICAgZWxzZQotICAgICAgIGZwcmludGYoc3RkZGViLCJVbmtub3duIG1lc3NhZ2UgdHlwZT0weCVseFxuIixtc2didWYtPm10eXBlKTsKKyAgICAgICBkcHJpbnRmX3dhcm4oZGRlLCAiVW5rbm93biBtZXNzYWdlIHR5cGU9MHglbHhcbiIsIG1zZ2J1Zi0+bXR5cGUpOwogICB9Ci0gIGRwcmludGZfbXNnKHN0ZGRlYiwKKyAgZHByaW50Zl9pbmZvKG1zZywKIAkgICAgICAiRERFX0RvT25lTWVzc2FnZTogdG8gcHJvY19pZHg9JWQgKHBpZD0lZCksIHF1ZXVlPSV1XG4iLAogCSAgICAgIHByb2NfaWR4LCBwcm9jLT5waWQsICh1bnNpZ25lZClwcm9jLT5tc2cpOwogICBpZiAoIHByb2MtPm1zZyAhPSAtMSkgewotICAgICBkcHJpbnRmX21zZyhzdGRkZWIsICJEREVfRG9PbmVNZXNzYWdlOiBkb2luZy4uLih0eXBlPSVzKVxuIiwKKyAgICAgZHByaW50Zl9pbmZvKG1zZywgIkRERV9Eb09uZU1lc3NhZ2U6IGRvaW5nLi4uKHR5cGU9JXMpXG4iLAogCQkgbXNnX3R5cGVbbXNnYnVmLT5tdHlwZV0pOwogICAgICBzaXplPW1zZ3NuZCAocHJvYy0+bXNnLCBtc2didWYsIHNpemUsIDApOwogCkBAIC0yMjgsNyArMjI1LDcgQEAKICAgICAgfQogICAgICBraWxsKHByb2MtPnBpZCxTSUdVU1IyKTsJICAgLyogdGVsbCB0aGUgcHJvY2VzcyB0aGVyZSBpcyBhIG1lc3NhZ2UgKi8KIAotICAgICBkcHJpbnRmX21zZyhzdGRkZWIsIkRERV9Eb09uZU1lc3NhZ2U6ICIKKyAgICAgZHByaW50Zl9pbmZvKG1zZywiRERFX0RvT25lTWVzc2FnZTogIgogCQkgIlRyeWluZyB0byBnZXQgYWNrbm93bGVkZ21lbnQgZnJvbSBtc2cgcXVldWU9JWRcbiIsCiAJCSBwcm9jLT5tc2cpOwogICAgICBZaWVsZDE2KCk7CQkJLyogZm9yY2UgdGFzayBzd2l0Y2gsIGFuZCAqLwpAQCAtMjQyLDcgKzIzOSw3IEBACiAgICAgIH0KICAgfQogICBlbHNlIHsKLSAgICAgZHByaW50Zl9tc2coc3RkZGViLCJEREVfRG9PbmVNZXNzYWdlOiBtZXNzYWdlIG5vdCBzZW50LCAiCisgICAgIGRwcmludGZfd2Fybihtc2csICJEREVfRG9PbmVNZXNzYWdlOiBtZXNzYWdlIG5vdCBzZW50LCAiCiAJCSAidGFyZ2V0IGhhcyBubyBtZXNzYWdlIHF1ZXVlXG4iKTsKICAgICAgcmV0dXJuIEZBTFNFOwogICB9CkBAIC0zMTUsMTEgKzMxMiwxMSBAQAogICBpZiAoICEgRERFX0lzUmVtb3RlV2luZG93KG1zZy0+aHduZCkgJiYgbXNnLT5od25kIT0gKEhXTkQxNiktMSkKICAgICAgcmV0dXJuIEZBTFNFOwogCi0gIGRwcmludGZfbXNnKHN0ZGRlYiwgIiVzOiBEREVfRG9NZXNzYWdlKGh3bmQ9MHgleCxtc2c9MHgleCwuLilcbiIsCisgIGRwcmludGZfaW5mbyhtc2csICIlczogRERFX0RvTWVzc2FnZShod25kPTB4JXgsbXNnPTB4JXgsLi4pXG4iLAogCSAgICAgIG1zZ190eXBlW3R5cGVdLCAoaW50KW1zZy0+aHduZCwoaW50KW1zZy0+bWVzc2FnZSk7CiAKIAotICBkcHJpbnRmX21zZyhzdGRkZWIsCisgIGRwcmludGZfaW5mbyhtc2csCiAJICAgICAgIkRERV9Eb01lc3NhZ2UoaHduZD0weCV4LG1zZz0weCV4LC4uKSAvLyBIV05EX0JST0FEQ0FTVCAhXG4iLAogCSAgICAgIChpbnQpbXNnLT5od25kLChpbnQpbXNnLT5tZXNzYWdlKTsKICAgcmVtb3RlX21lc3NhZ2U9KHZvaWQqKSZtc2dfZGF0LmRhdC5tdGV4dDsKQEAgLTM2NCw3ICszNjEsNyBAQAogCiAgICBwcm9jPURERV9XSU4yUFJPQyh3bmQpOwogICAgbXNnPW1haW5fYmxvY2stPnByb2NbcHJvY10ubXNnOwotICAgZHByaW50Zl9tc2coc3RkZGViLCJEREVfR2V0UmVtb3RlTWVzc2FnZTogc2VuZGluZyBBQ0sgIgorICAgZHByaW50Zl9pbmZvKG1zZywiRERFX0dldFJlbW90ZU1lc3NhZ2U6IHNlbmRpbmcgQUNLICIKIAkgICAgICAgInRvIHduZD0lNHgsIHByb2M9JWQsbXNnPSVkLCBwaWQ9JWRcbiIsd25kLHByb2MsbXNnLAogCSAgICAgICBtYWluX2Jsb2NrLT5wcm9jW3Byb2NdLnBpZAogICAgICApOwpAQCAtNDA1LDcgKzQwMiw3IEBACiAKICAgaWYgKHNpemU9PURERV9NU0dfU0laRSkgewkgICAvKiBpcyB0aGlzIGEgY29ycmVjdCBtZXNzYWdlIChpZiBhbnkpID8qLwogICAgICB3YXNfc2VudD1UUlVFOwotICAgICBkcHJpbnRmX21zZyhzdGRkZWIsCisgICAgIGRwcmludGZfaW5mbyhtc2csCiAJCSAiRERFOnJlY2VpdmUgc2VudCBtZXNzYWdlLiBtc2c9JTA0eCB3UGFyPSUwNHgiCiAJCSAiIGxQYXI9JTA4bHhcbiIsCiAJCSByZW1vdGVfbWVzc2FnZS0+bWVzc2FnZSwgcmVtb3RlX21lc3NhZ2UtPndQYXJhbSwKQEAgLTQxNiw3ICs0MTMsNyBAQAogCiAgICAgIGlmIChzaXplPT1EREVfTVNHX1NJWkUpIHsJICAgLyogaXMgdGhpcyBhIGNvcnJlY3QgbWVzc2FnZSAoaWYgYW55KSA/Ki8KIAl3YXNfc2VudD1GQUxTRTsKLQlkcHJpbnRmX21zZyhzdGRkZWIsCisJZHByaW50Zl9pbmZvKG1zZywKIAkJICAgICJEREU6cmVjZWl2ZSBwb3N0ZWQgbWVzc2FnZS4gIgogCQkgICAgIm1zZz0lMDR4IHdQYXI9JTA0eCBsUGFyPSUwOGx4XG4iLAogCQkgICAgcmVtb3RlX21lc3NhZ2UtPm1lc3NhZ2UsIHJlbW90ZV9tZXNzYWdlLT53UGFyYW0sCkBAIC00MzIsNyArNDI5LDcgQEAKIAogICBuZXN0aW5nKys7CiAKLSAgaWYgKGRlYnVnZ2luZ19kZGUpIHsKKyAgaWYgKGRlYnVnZ2luZ19pbmZvKGRkZSkpIHsKICAgICAgY2hhciAqdGl0bGU7CiAgICAgIGlmICh3YXNfc2VudCkKIAl0aXRsZT0icmVjZWl2ZSBzZW50IGRkZToiOwpAQCAtNDQ1LDcgKzQ0Miw3IEBACiAgICAgSFdORDE2IGRkZV93aW5kb3c9IERERV9XSU5fSU5GTyhyZW1vdGVfbWVzc2FnZS0+aHduZCkud25kOwogICAgICAvKiB3ZSBzaG91bGQga25vdyBleGFjdGx5IHdoZXJlIHRvIHNlbmQgdGhlIG1lc3NhZ2UgKGxvY2FsbHkpKi8KICAgICAgaWYgKHdhc19zZW50KSB7Ci0JZHByaW50Zl9kZGUoc3RkZGViLAorCWRwcmludGZfaW5mbyhkZGUsCiAJCSAgICAiU2VuZE1lc3NhZ2Uod25kPTB4JTA0eCwgbXNnPTB4JTA0eCwgd1Bhcj0weCUwNHgsIgogCQkgICAgImxQYXI9MHglMDh4XG4iLAogCQkgICAgZGRlX3dpbmRvdywgcmVtb3RlX21lc3NhZ2UtPm1lc3NhZ2UsCkBAIC01MjcsNyArNTI0LDcgQEAKICAgICAgaW5fdGVzdC0tOwogICAgICByZXR1cm47CiAgIH0KLSAgZHByaW50Zl9tc2coc3RkZGViLCJEREVfVGVzdERERSgweCUwNHgpXG4iLCBod25kKTsKKyAgZHByaW50Zl9pbmZvKG1zZywiRERFX1Rlc3REREUoMHglMDR4KVxuIiwgaHduZCk7CiAgIGlmIChod25kPT0wKQogICAgICAgaHduZD0tMTsKICAgLyoganVzdCBzZW5kIGEgbWVzc2FnZSB0byBzZWUgaG93IHRoaW5ncyBhcmUgZ29pbmcgKi8KQEAgLTU2NSw2ICs1NjIsNyBAQAogICAgIERERUFEVklTRSAqZGRlYWR2aXNlOwogICAgIERERURBVEEgKmRkZWRhdGE7CiAgICAgRERFUE9LRSAqZGRlcG9rZTsKKyAgICBkYmdfZGVjbF9zdHIoZGRlLCAyMDQ4KTsKIAogICAgIGlmIChpc19kZGVfaGFuZGxlKG1zZy0+bFBhcmFtICYgMHhmZmZmKSApCiAJcHRyPURERV9BdHRhY2hIYW5kbGUobXNnLT5sUGFyYW0mMHhmZmZmLCBOVUxMKTsKQEAgLTU3Myw4ICs1NzEsOCBAQAogICAgIHdTdGF0dXM9TE9XT1JEKG1zZy0+bFBhcmFtKTsKICAgICBoV29yZD1ISVdPUkQobXNnLT5sUGFyYW0pOwogCi0gICAgZnByaW50ZihzdGRkZWIsIiVzIiwgZGVzYyk7Ci0gICAgZnByaW50ZihzdGRkZWIsIiUwNHggJTA0eD09JXMgJTA0eCAlMDhseCAiLAorICAgIGRzcHJpbnRmKGRkZSwiJXMiLCBkZXNjKTsKKyAgICBkc3ByaW50ZihkZGUsIiUwNHggJTA0eD09JXMgJTA0eCAlMDhseCAiLAogCSAgICBtc2ctPmh3bmQsIG1zZy0+bWVzc2FnZSwiIiwvKk1lc3NhZ2VUeXBlTmFtZXNbbXNnLT5tZXNzYWdlXSwqLwogCSAgICBtc2ctPndQYXJhbSwgbXNnLT5sUGFyYW0pOwogICAgIHN3aXRjaChtc2ctPm1lc3NhZ2UpIHsKQEAgLTU4OCw1MiArNTg2LDUyIEBACiAJLyogRERFQURWSVNFOiBoT3B0aW9ucyBpbiBXTV9EREVfQURWSVNFIG1lc3NhZ2UgKi8KIAlpZiAocHRyKSB7CiAJICAgZGRlYWR2aXNlPXB0cjsKLQkgICBmcHJpbnRmKHN0ZGRlYiwiZkRlZmVyVXBkPSVkLGZBY2tSZXE9JWQsY2ZGb3JtYXQ9MHgleCIsCisJICAgZHNwcmludGYoZGRlLCJmRGVmZXJVcGQ9JWQsZkFja1JlcT0lZCxjZkZvcm1hdD0weCV4IiwKIAkJICAgZGRlYWR2aXNlLT5mRGVmZXJVcGQsIGRkZWFkdmlzZS0+ZkFja1JlcSwKIAkJICAgZGRlYWR2aXNlLT5jZkZvcm1hdCk7CiAJfSBlbHNlCi0JICAgZnByaW50ZihzdGRkZWIsIk5PLURBVEEiKTsKLQlmcHJpbnRmKHN0ZGRlYiwiIGF0b209MHgleCIsaFdvcmQpOworCSAgIGRzcHJpbnRmKGRkZSwiTk8tREFUQSIpOworCWRzcHJpbnRmKGRkZSwiIGF0b209MHgleCIsaFdvcmQpOwogCWJyZWFrOwogCiAgICAgICBjYXNlIFdNX0RERV9VTkFEVklTRToKLQlmcHJpbnRmKHN0ZGRlYiwiZm9ybWF0PTB4JXgsIGF0b209MHgleCIsd1N0YXR1cyxoV29yZCk7CisJZHNwcmludGYoZGRlLCJmb3JtYXQ9MHgleCwgYXRvbT0weCV4Iix3U3RhdHVzLGhXb3JkKTsKIAlicmVhazsKICAgICAgIGNhc2UgV01fRERFX0FDSzoKIAlkZGVhY2s9KERERUFDSyopJndTdGF0dXM7Ci0JZnByaW50ZihzdGRkZWIsImJBcHBSZXR1cm5Db2RlPSVkLGZCdXN5PSVkLGZBY2s9JWQiLAorCWRzcHJpbnRmKGRkZSwiYkFwcFJldHVybkNvZGU9JWQsZkJ1c3k9JWQsZkFjaz0lZCIsCiAJCWRkZWFjay0+YkFwcFJldHVybkNvZGUsIGRkZWFjay0+ZkJ1c3ksIGRkZWFjay0+ZkFjayk7CiAJaWYgKGRkZWFjay0+ZkFjaykKLQkgICBmcHJpbnRmKHN0ZGRlYiwiKFRydWUpIik7CisJICAgZHNwcmludGYoZGRlLCIoVHJ1ZSkiKTsKIAllbHNlCi0JICAgZnByaW50ZihzdGRkZWIsIihGYWxzZSkiKTsKKwkgICBkc3ByaW50ZihkZGUsIihGYWxzZSkiKTsKIAlicmVhazsKIAogICAgICAgY2FzZSBXTV9EREVfREFUQToKIAlpZiAocHRyKSB7CiAJICAgZGRlZGF0YT1wdHI7Ci0JICAgZnByaW50ZihzdGRkZWIsImZSZXNwb25zZT0lZCxmUmVsZWFzZT0lZCwiCisJICAgZHNwcmludGYoZGRlLCJmUmVzcG9uc2U9JWQsZlJlbGVhc2U9JWQsIgogCQkgICAiZkFja1JlcT0lZCxjZkZvcm1hdD0weCV4LHZhbHVlPVwiJS4qc1wiIiwKIAkJICAgZGRlZGF0YS0+ZlJlc3BvbnNlLCBkZGVkYXRhLT5mUmVsZWFzZSwKIAkJICAgZGRlZGF0YS0+ZkFja1JlcSwgZGRlZGF0YS0+Y2ZGb3JtYXQsCiAJCSAgIGRlYnVnX2xhc3RfaGFuZGxlX3NpemUtIChpbnQpc2l6ZW9mKCpkZGVkYXRhKSsxLAogCQkgICBkZGVkYXRhLT5WYWx1ZSk7CiAJfSBlbHNlCi0JICAgZnByaW50ZihzdGRkZWIsIk5PLURBVEEiKTsKLQlmcHJpbnRmKHN0ZGRlYiwiIGF0b209MHglMDR4IixoV29yZCk7CisJICAgZHNwcmludGYoZGRlLCJOTy1EQVRBIik7CisJZHNwcmludGYoZGRlLCIgYXRvbT0weCUwNHgiLGhXb3JkKTsKIAlicmVhazsKIAogICAgICAgY2FzZSBXTV9EREVfUE9LRToKIAlpZiAocHRyKSB7CiAJICAgZGRlcG9rZT1wdHI7Ci0JICAgZnByaW50ZihzdGRkZWIsImZSZWxlYXNlPSVkLGNmRm9ybWF0PTB4JXgsdmFsdWVbMF09JyVjJyIsCisJICAgZHNwcmludGYoZGRlLCJmUmVsZWFzZT0lZCxjZkZvcm1hdD0weCV4LHZhbHVlWzBdPSclYyciLAogCQkgICBkZGVwb2tlLT5mUmVsZWFzZSwgZGRlcG9rZS0+Y2ZGb3JtYXQsIGRkZXBva2UtPlZhbHVlWzBdKTsKIAl9IGVsc2UKLQkgICBmcHJpbnRmKHN0ZGRlYiwiTk8tREFUQSIpOwotCWZwcmludGYoc3RkZGViLCIgYXRvbT0weCUwNHgiLGhXb3JkKTsKKwkgICBkc3ByaW50ZihkZGUsIk5PLURBVEEiKTsKKwlkc3ByaW50ZihkZGUsIiBhdG9tPTB4JTA0eCIsaFdvcmQpOwogCWJyZWFrOwogICAgIH0KLSAgICBmcHJpbnRmKHN0ZGRlYiwiXG4iKTsKKyAgICBkcHJpbnRmX2luZm8oZGRlLCIlc1xuIiwgZGJnX3N0cihkZGUpKTsKIH0KIAogdm9pZCBkZGVfcHJvY19kb25lKGRkZV9wcm9jIHByb2MpCmRpZmYgLS1naXQgYS9pcGMvc2htX2Jsb2NrLmMgYi9pcGMvc2htX2Jsb2NrLmMKaW5kZXggNmE1MTA2Yi4uNWY1NTcwZiAxMDA2NDQKLS0tIGEvaXBjL3NobV9ibG9jay5jCisrKyBiL2lwYy9zaG1fYmxvY2suYwpAQCAtMTYsOSArMTYsOCBAQAogI2luY2x1ZGUgPGFzc2VydC5oPgogI2luY2x1ZGUgPHVuaXN0ZC5oPgogI2luY2x1ZGUgPHN0ZGxpYi5oPgotI2luY2x1ZGUgPHN0ZGRlYnVnLmg+Ci0jaW5jbHVkZSA8ZGVidWcuaD4KLSNpbmNsdWRlIDxnbG9iYWwuaD4KKyNpbmNsdWRlICJkZWJ1Zy5oIgorI2luY2x1ZGUgImdsb2JhbC5oIgogI2luY2x1ZGUgInNlbGVjdG9ycy5oIgogI2luY2x1ZGUgInNobV9mcmFnbWVudC5oIgogI2luY2x1ZGUgInNobV9ibG9jay5oIgpAQCAtMzgsNyArMzcsNyBAQAogICovCiB2b2lkIHNobV9zZXR1cF9ibG9jayhzdHJ1Y3Qgc2htX2Jsb2NrICpibG9jaywgaW50IGZpcnN0LCBpbnQgc2l6ZSkKIHsKLSAgZHByaW50Zl9zaG0oc3RkZGViLCJTZXR0aW5nIHVwIHNobSBibG9jayBhdCAweCUwOHhcbiIsKGludCApYmxvY2spOworICBkcHJpbnRmX2luZm8oc2htLCJTZXR0aW5nIHVwIHNobSBibG9jayBhdCAweCUwOHhcbiIsKGludCApYmxvY2spOwogICAvKiBzZXR1cCBibG9jayBpbnRlcm5hbCBkYXRhIHN0cnVjdHVyZSAqLwogICBpZiAoZmlyc3QgPD0gMCkgewogICAgICBmaXJzdD1zaXplb2YoKmJsb2NrKTsKQEAgLTU0LDcgKzUzLDcgQEAKICAgLyogYmxvY2stPnNpemUgaXMgaW5pdGlhbGl6ZWQgaW4gc2htX0ZyYWdtZW50SW5pdCAqLwogICBzaG1fRnJhZ21lbnRJbml0KGJsb2NrLCBmaXJzdCwgc2l6ZSk7ICAvKiBmaXJzdCBpdGVtIGluIHRoZSBmcmVlIGxpc3QgKi8KICAgCi0gIGRwcmludGZfc2htKHN0ZGRlYiwKKyAgZHByaW50Zl9pbmZvKHNobSwKIAkgICAgICAiYmxvY2sgd2FzIHNldCB1cCBhdCAweCUwOHgsIHNpemU9MHglMDR4S0IsIDFzdCB1c2FibGU9JTAyeFxuIiwKIAkgICAgICAoaW50IClibG9jayxzaXplLzEwMjQsZmlyc3QpOwogfQpkaWZmIC0tZ2l0IGEvaXBjL3NobV9mcmFnbWVudC5jIGIvaXBjL3NobV9mcmFnbWVudC5jCmluZGV4IDE1YzUxZmUuLmY1ZWM3YmYgMTAwNjQ0Ci0tLSBhL2lwYy9zaG1fZnJhZ21lbnQuYworKysgYi9pcGMvc2htX2ZyYWdtZW50LmMKQEAgLTEwLDcgKzEwLDYgQEAKICNpZmRlZiBDT05GSUdfSVBDCiAKICNpbmNsdWRlIDxzdGRpby5oPgkJICAgLyogZm9yIGRlYnVnZ2luZyBvbmx5ICovCi0jaW5jbHVkZSA8c3RkZGVidWcuaD4KICNpbmNsdWRlIDxkZWJ1Zy5oPgkJICAgLyogZm9yICJzdGRkZWIiICovCiAKICNpbmNsdWRlICJzaG1fZnJhZ21lbnQuaCIKZGlmZiAtLWdpdCBhL2lwYy9zaG1fZnJhZ21lbnRfdGVzdC5jIGIvaXBjL3NobV9mcmFnbWVudF90ZXN0LmMKaW5kZXggYzI3MDYxYi4uMDU0YWI2MyAxMDA2NDQKLS0tIGEvaXBjL3NobV9mcmFnbWVudF90ZXN0LmMKKysrIGIvaXBjL3NobV9mcmFnbWVudF90ZXN0LmMKQEAgLTksNyArOSw2IEBACiAgKi8KICNpbmNsdWRlIDxhc3NlcnQuaD4KICNpbmNsdWRlIDxzdGRpby5oPgkJICAgCi0jaW5jbHVkZSA8c3RkZGVidWcuaD4KICNkZWZpbmUgREVCVUdfREVGSU5FX1ZBUklBQkxFUwkgICAvKiBqdXN0IGF2b2lkIGR1bWIgZXJyb3JzICovCiAjaW5jbHVkZSA8ZGVidWcuaD4JCSAgIC8qIGZvciAic3RkZGViIiAqLwogI2luY2x1ZGUgPHN0ZGxpYi5oPgpkaWZmIC0tZ2l0IGEvaXBjL3NobV9tYWluX2Jsay5jIGIvaXBjL3NobV9tYWluX2Jsay5jCmluZGV4IDA5YTkxYjIuLjc0MDI0NzUgMTAwNjQ0Ci0tLSBhL2lwYy9zaG1fbWFpbl9ibGsuYworKysgYi9pcGMvc2htX21haW5fYmxrLmMKQEAgLTE4LDggKzE4LDcgQEAKICNpbmNsdWRlIDx1bmlzdGQuaD4KICNpbmNsdWRlIDxlcnJuby5oPgogI2luY2x1ZGUgPHNpZ25hbC5oPgotI2luY2x1ZGUgPHN0ZGRlYnVnLmg+Ci0jaW5jbHVkZSA8ZGVidWcuaD4KKyNpbmNsdWRlICJkZWJ1Zy5oIgogI2luY2x1ZGUgInNobV9mcmFnbWVudC5oIgogI2luY2x1ZGUgInNobV9ibG9jay5oIgogI2luY2x1ZGUgInNobV9tYWluX2Jsay5oIgpAQCAtODAsNyArNzksNyBAQAogLyogc2V0dXAgYSBuZXcgbWFpbiBzaG0gYmxvY2sgKG9ubHkgY29uc3RydWN0IGEgc2htIGJsb2NrIG9iamVjdCkuICovCiBzdGF0aWMgdm9pZCBzaG1fc2V0dXBfbWFpbl9ibG9jaygpCiB7Ci0gIGRwcmludGZfc2htKHN0ZGRlYiwiY3JlYXRpbmcgZGF0YSBzdHJ1Y3R1cmVcbiIpOworICBkcHJpbnRmX2luZm8oc2htLCJjcmVhdGluZyBkYXRhIHN0cnVjdHVyZVxuIik7CiAgIG1haW5fYmxvY2stPmJ1aWxkX2xvY2s9MTsKICAgc3RyY3B5KG1haW5fYmxvY2stPm1hZ2ljLCBzaG1faGVhZGVyKTsKIApAQCAtMTM0LDI5ICsxMzMsMjkgQEAKIAogICAvKiBNYWtlIHN1cmUgd2UgZG9uJ3Qgd29yayBvbiBzb21lYm9keSBlbHNlJ3MgYmxvY2sgKi8KICAgaWYgKHNobV9pbmZvLnNobV9wZXJtLmN1aWQgIT0gZ2V0dWlkKCkpIHsgLyogY3JlYXRvciBpcyBub3QgbWUgKi8KLSAgICAgZHByaW50Zl9zaG0oc3RkZGViLCJDcmVhdG9yIGlzIG5vdCBtZSFcbiIpOworICAgICBkcHJpbnRmX3dhcm4oc2htLCAiQ3JlYXRvciBpcyBub3QgbWUhXG4iKTsKICAgICAgcmV0dXJuIDA7CiAgIH0KIAotICBkcHJpbnRmX3NobShzdGRkZWIsInNoYXJlZCBtZW1vcnkgZXhpc3QsIGF0dGFjaGluZyBhbnl3aGVyZVxuIik7CisgIGRwcmludGZfaW5mbyhzaG0sInNoYXJlZCBtZW1vcnkgZXhpc3QsIGF0dGFjaGluZyBhbnl3aGVyZVxuIik7CiAgIG1haW5fYmxvY2s9KHN0cnVjdCBzaG1fbWFpbl9ibG9jayAqKXNobWF0KHNobV9pZCwgMCwgMCk7CiAgIGlmICggKGludCltYWluX2Jsb2NrPT0tMSkgewotICAgICBkcHJpbnRmX3NobShzdGRkZWIsIkF0dGFjaCBmYWlsZWRcbiIpOworICAgICBkcHJpbnRmX3dhcm4oc2htLCAiQXR0YWNoIGZhaWxlZFxuIik7CiAgICAgIHJldHVybiAwOwogICB9CiAKICAgaWYgKHN0cmNtcChtYWluX2Jsb2NrLT5tYWdpYywgc2htX2hlYWRlcikgIT0gMCkgewotICAgICBkcHJpbnRmX3NobShzdGRkZWIsIkRldGFjaGluZywgd3JvbmcgbWFnaWNcbiIpOworICAgICBkcHJpbnRmX2luZm8oc2htLCJEZXRhY2hpbmcsIHdyb25nIG1hZ2ljXG4iKTsKICAgICAgc2htZHQoKHZvaWQgKiltYWluX2Jsb2NrKTsKICAgICAgcmV0dXJuIDA7CiAgIH0KIAotICBpZiAoZGVidWdnaW5nX3NobSkKKyAgaWYgKGRlYnVnZ2luZ19pbmZvKHNobSkpCiAgICAgIHByaW50X3NobV9pbmZvKHNobV9pZCk7CiAKICAgLyogSXMgaXQgYW4gb2xkIHVudXNlZCBibG9jayA/ICovCiAgIGlmIChzaG1faW5mby5zaG1fbmF0dGNoID09IDApIHsKLSAgICAgZHByaW50Zl9zaG0oc3RkZGViLCJObyBhdHRhY2hlcywgZGVsZXRpbmcgb2xkIGRhdGFcbiIpOworICAgICBkcHJpbnRmX2luZm8oc2htLCJObyBhdHRhY2hlcywgZGVsZXRpbmcgb2xkIGRhdGFcbiIpOwogICAgICBzaG1fZGVsZXRlX2FsbChzaG1faWQpOwogICAgICByZXR1cm4gMDsKICAgfQpAQCAtMTgxLDEwICsxODAsMTAgQEAKICAgICBpbnQgc2htX2lkOwkJCS8qIERlc2NyaXB0b3IgdG8gdGhpcyBzaGFyZWQgbWVtb3J5ICovCiAgICAgaW50IGk7CiAKLSAgICBkcHJpbnRmX3NobShzdGRkZWIsInNobV9sb2NhdGVfTWFpbkJsb2NrOiB0cnlpbmcgdG8gYXR0YWNoLCBrZXk9MHgleFxuIiwKKyAgICBkcHJpbnRmX2luZm8oc2htLCJzaG1fbG9jYXRlX01haW5CbG9jazogdHJ5aW5nIHRvIGF0dGFjaCwga2V5PTB4JXhcbiIsCiAJCXNobV9rZXkpOwogICAgIGZvciAoaT0wIDsgaSA8IFNITV9LRVlfUkFOR0UgOyBpKyspIHsKLSAgICAgICBkcHJpbnRmX3NobShzdGRkZWIsIml0ZXJhdGlvbj0lZFxuIiwgaSk7CisgICAgICAgZHByaW50Zl9pbmZvKHNobSwiaXRlcmF0aW9uPSVkXG4iLCBpKTsKIAogICAgICAgIHNobV9pZD0gc2htZ2V0ICggc2htX2tleStpLCBTSE1fTUlOQkxPQ0sgLDA3MDApOwogCkBAIC0yMDMsOCArMjAyLDggQEAKIAkgICAgY2FzZSBFTk9NRU06CSAgIC8qIG5vIGZyZWUgbWVtb3J5ICovCiAJICAgIGNhc2UgRU5PRU5UOgkgICAvKiB0aGlzIGtleSBkb2VzIG5vdCBleGlzdCAqLwogCSAgICBkZWZhdWx0IDoKLQkgICAgICBkcHJpbnRmX3NobShzdGRkZWIsInNobWdldCBmYWlsZWQsIGVycm5vPSVkLCAlc1xuIiwKLQkJCSAgZXJybm8sIHN0cmVycm9yKGVycm5vKSApOworCSAgICAgIGRwcmludGZfd2FybihzaG0sInNobWdldCBmYWlsZWQsIGVycm5vPSVkLCAlc1xuIiwKKwkJICAgICBlcnJubywgc3RyZXJyb3IoZXJybm8pICk7CiAJICAgICAgcmV0dXJuIDA7CQkgICAvKiBGYWlsZWQgKi8KIAkgIH0KICAgICAgICB9IC8qIGlmIC4uIGVsc2UgKi8KQEAgLTIyMyw3ICsyMjIsNyBAQAogICBpbnQgZmxhZ3M9IDA3MDAgfCBJUENfQ1JFQVQgfCBJUENfRVhDTDsKICAgaW50IGk7CiAKLSAgZHByaW50Zl9zaG0oc3RkZGViLCJjcmVhdGluZyBzaGFyZWQgbWVtb3J5XG4iKTsKKyAgZHByaW50Zl9pbmZvKHNobSwiY3JlYXRpbmcgc2hhcmVkIG1lbW9yeVxuIik7CiAKICAgLyogdHJ5IHRvIGFsbG9jYXRlIHNoYXJlZCBtZW1vcnkgd2l0aCBrZXk9IldpbmUiLCBzaXplPVNITV9NSU5CTE9DSywgKi8KICAgLyogY29tcGxldGUgdXNlciBwZXJtaXNzaW9uICovCkBAIC0yMzMsMTIgKzIzMiwxMiBAQAogCWJyZWFrOwogICB9CiAgIGlmIChzaG1faWQgPT0gLTEpIHsKLSAgICAgZHByaW50Zl9zaG0oc3RkZGViLCJmYWlsZWQgdG8gY3JlYXRlIHNoYXJlZCBtZW1vcnlcbiIpOworICAgICBkcHJpbnRmX3dhcm4oc2htLCAiZmFpbGVkIHRvIGNyZWF0ZSBzaGFyZWQgbWVtb3J5XG4iKTsKICAgICAgcmV0dXJuIDA7CiAgIH0KLSAgZHByaW50Zl9zaG0oc3RkZGViLCJzaGFyZWQgbWVtb3J5IGNyZWF0ZWQsIGF0dGFjaGluZ1xuIik7CisgIGRwcmludGZfaW5mbyhzaG0sInNoYXJlZCBtZW1vcnkgY3JlYXRlZCwgYXR0YWNoaW5nXG4iKTsKICAgbWFpbl9ibG9jaz0oc3RydWN0IHNobV9tYWluX2Jsb2NrKikgc2htYXQoc2htX2lkLCAwLDApOwotICBpZiAoZGVidWdnaW5nX3NobSkKKyAgaWYgKGRlYnVnZ2luZ19pbmZvKHNobSkpCiAgICAgIHByaW50X3NobV9pbmZvKHNobV9pZCk7CiAgIG1haW5fc2htX2lkPSBzaG1faWQ7CiAgIHNobV9zZXR1cF9tYWluX2Jsb2NrKCk7CmRpZmYgLS1naXQgYS9pcGMvc2htX3NlbWFwaC5jIGIvaXBjL3NobV9zZW1hcGguYwppbmRleCBmNzMwMTU0Li42ZDAyMWJiIDEwMDY0NAotLS0gYS9pcGMvc2htX3NlbWFwaC5jCisrKyBiL2lwYy9zaG1fc2VtYXBoLmMKQEAgLTE1LDggKzE1LDcgQEAKICNpbmNsdWRlIDxzeXMvc2VtLmg+CiAjaW5jbHVkZSA8c3RkaW8uaD4KICNpbmNsdWRlIDxlcnJuby5oPgotI2luY2x1ZGUgPHN0ZGRlYnVnLmg+Ci0jaW5jbHVkZSA8ZGVidWcuaD4KKyNpbmNsdWRlICJkZWJ1Zy5oIgogI2luY2x1ZGUgInNobV9zZW1hcGguaCIKICNkZWZpbmUgU0VNX1JFQUQgIDAKICNkZWZpbmUgU0VNX1dSSVRFIDEKQEAgLTI5LDcgKzI4LDcgQEAKICAgc3RydWN0IHNlbWJ1ZiBzb3BbMl07CiAgIGludCByZXQ7CiAgIAotICBkcHJpbnRmX3NlbShzdGRkZWIsInNobV9yZWFkX3dhaXQoJWQpXG4iLHNlbWlkKTsKKyAgZHByaW50Zl9pbmZvKHNlbSwic2htX3JlYWRfd2FpdCglZClcbiIsc2VtaWQpOwogICBzb3BbMF0uc2VtX251bT1TRU1fUkVBRDsKICAgc29wWzBdLnNlbV9vcD0xOwkJICAgLyogYWRkIHRoaXMgcmVhZCBpbnN0YW5jZSAqLwogICBzb3BbMF0uc2VtX2ZsZz1TRU1fVU5ETzsJICAgLyogdW5kbyBpbiBjYXNlIHByb2Nlc3MgZGllcyAqLwpAQCAtNTEsNyArNTAsNyBAQAogICBzdHJ1Y3Qgc2VtYnVmIHNvcFszXTsKICAgaW50IHJldDsKICAgCi0gIGRwcmludGZfc2VtKHN0ZGRlYiwic2htX3dyaXRlX3dhaXQoJWQpXG4iLHNlbWlkKTsKKyAgZHByaW50Zl9pbmZvKHNlbSwic2htX3dyaXRlX3dhaXQoJWQpXG4iLHNlbWlkKTsKICAgc29wWzBdLnNlbV9udW09U0VNX1JFQUQ7CiAgIHNvcFswXS5zZW1fb3A9MDsJCSAgIC8qIHdhaXQgdW50aWwgbm8gcmVhZGluZyBpbnN0YW5jZSBleGlzdCAqLwogICBzb3BbMF0uc2VtX2ZsZz1TRU1fVU5ETzsJCSAgIApAQCAtNzcsNyArNzYsNyBAQAogICBzdHJ1Y3Qgc2VtYnVmIHNvcFsyXTsKICAgaW50IHJldDsKIAotICBkcHJpbnRmX3NlbShzdGRkZWIsInNobV93cml0ZV9zaWduYWwoJWQpXG4iLHNlbWlkKTsKKyAgZHByaW50Zl9pbmZvKHNlbSwic2htX3dyaXRlX3NpZ25hbCglZClcbiIsc2VtaWQpOwogICBzb3BbMF0uc2VtX251bT1TRU1fUkVBRDsKICAgc29wWzBdLnNlbV9vcD0tMTsJCiAgIHNvcFswXS5zZW1fZmxnPUlQQ19OT1dBSVQgfCBTRU1fVU5ETzsJLyogbm8gcmVhc29uIHRvIHdhaXQgKi8KQEAgLTEwMCw3ICs5OSw3IEBACiAgIHN0cnVjdCBzZW1idWYgc29wWzJdOwogICBpbnQgcmV0OwogCi0gIGRwcmludGZfc2VtKHN0ZGRlYiwic2htX3JlYWRfc2lnbmFsKCVkKVxuIixzZW1pZCk7CisgIGRwcmludGZfaW5mbyhzZW0sInNobV9yZWFkX3NpZ25hbCglZClcbiIsc2VtaWQpOwogICBzb3BbMF0uc2VtX251bT1TRU1fUkVBRDsKICAgc29wWzBdLnNlbV9vcD0tMTsJCiAgIHNvcFswXS5zZW1fZmxnPUlQQ19OT1dBSVQgfCBTRU1fVU5ETzsJLyogbm8gcmVhc29uIHRvIHdhaXQgKi8KZGlmZiAtLWdpdCBhL2lwYy9zaG1fc2VtYXBoX3Rlc3QuYyBiL2lwYy9zaG1fc2VtYXBoX3Rlc3QuYwppbmRleCBmZGNlZWI1Li42MTMyODYxIDEwMDY0NAotLS0gYS9pcGMvc2htX3NlbWFwaF90ZXN0LmMKKysrIGIvaXBjL3NobV9zZW1hcGhfdGVzdC5jCkBAIC0xNiw3ICsxNiw2IEBACiAjaW5jbHVkZSAic2htX3NlbWFwaC5oIgogI2luY2x1ZGUgPHN5cy9zaG0uaD4KICNkZWZpbmUgREVCVUdfREVGSU5FX1ZBUklBQkxFUwotI2luY2x1ZGUgPHN0ZGRlYnVnLmg+CiAjaW5jbHVkZSA8ZGVidWcuaD4KIAogc3RhdGljIHZvbGF0aWxlIGludCAqIHZvbGF0aWxlIGRhdGE7CmRpZmYgLS1naXQgYS9pcGMvd2luZV90ZXN0X3N0dWIuYyBiL2lwYy93aW5lX3Rlc3Rfc3R1Yi5jCmluZGV4IDBmZGI1OTkuLjIyMjkzNTEgMTAwNjQ0Ci0tLSBhL2lwYy93aW5lX3Rlc3Rfc3R1Yi5jCisrKyBiL2lwYy93aW5lX3Rlc3Rfc3R1Yi5jCkBAIC01LDcgKzUsNiBAQAogI2luY2x1ZGUgPHdpbi5oPgogI2RlZmluZSBERUJVR19ERUZJTkVfVkFSSUFCTEVTCiAjZGVmaW5lIERFQlVHX0FMTAotI2luY2x1ZGUgPHN0ZGRlYnVnLmg+CiAjaW5jbHVkZSA8ZGVidWcuaD4KIAogI2RlZmluZSBEREVfUFJPQzJXSU4ocHJvY19pZHgpICAgKCAgKEhXTkQpIH4oIChwcm9jX2lkeCkrMSkgICkKZGlmZiAtLWdpdCBhL2xpYnJhcnkvd2luZXN0dWIuYyBiL2xpYnJhcnkvd2luZXN0dWIuYwppbmRleCBjMjNlMDc1Li5mODFlZGE2IDEwMDY0NAotLS0gYS9saWJyYXJ5L3dpbmVzdHViLmMKKysrIGIvbGlicmFyeS93aW5lc3R1Yi5jCkBAIC0xLDE3ICsxLDkgQEAKIC8qIFNhbXBsZSB3aW5lc3R1Yi5jIGZpbGUgZm9yIGNvbXBpbGluZyBwcm9ncmFtcyB3aXRoIGxpYndpbmUuc28uICovCiAKICNpbmNsdWRlIDxzdHJpbmcuaD4KLSNpbmNsdWRlIDxzdGRpby5oPgogI2luY2x1ZGUgIndpbmRvd3MuaCIKICNpbmNsdWRlICJ4bWFsbG9jLmgiCiAKLS8qIFN0dWIgbmVlZGVkIGZvciBsaW5raW5nIHdpdGggV2luZWxpYiAqLwotLyogRklYTUU6IHRoaXMgc2hvdWxkIG5vdCBiZSBuZWNlc3NhcnkgKi8KLUhNT0RVTEUzMiBCVUlMVElOX0xvYWRNb2R1bGUoIExQQ1NUUiBuYW1lLCBCT09MMzIgZm9yY2UgKSB7IAotCWZwcmludGYoc3RkZXJyLCJCVUlMVElOX0xvYWRNb2R1bGUoJXMsJWQpIGNhbGxlZCBpbiBhIGxpYnJhcnkhXG4iLG5hbWUsZm9yY2UpOwotCXJldHVybiAwOwotfQotCiBleHRlcm4gaW50IFBBU0NBTCBXaW5NYWluKEhJTlNUQU5DRTMyLEhJTlNUQU5DRTMyLExQU1RSLGludCk7CiBleHRlcm4gQk9PTDMyIE1BSU5fV2luZWxpYkluaXQoIGludCAqYXJnYywgY2hhciAqYXJndltdICk7CiBleHRlcm4gdm9pZCBUQVNLX1Jlc2NoZWR1bGUodm9pZCk7CkBAIC0yMyw3ICsxNSw3IEBACiAKIGludCBtYWluKCBpbnQgYXJnYywgY2hhciAqYXJndiBbXSApCiB7Ci0gIEhJTlNUQU5DRTE2IGhJbnN0YW5jZTsKKyAgSElOU1RBTkNFMzIgaEluc3RhbmNlOwogICBMUFNUUiBscHN6Q21kUGFyYW07CiAgIGludCBpLCBsZW4gPSAwOwogICBfQVJHQyA9IGFyZ2M7CmRpZmYgLS1naXQgYS9sb2FkZXIvbWFpbi5jIGIvbG9hZGVyL21haW4uYwppbmRleCBlMjU1Y2M3Li5kMmE2NDIzIDEwMDY0NAotLS0gYS9sb2FkZXIvbWFpbi5jCisrKyBiL2xvYWRlci9tYWluLmMKQEAgLTExLDggKzExLDYgQEAKICNpbmNsdWRlIDxzdHJpbmcuaD4KICNpbmNsdWRlIDxlcnJuby5oPgogI2luY2x1ZGUgIndpbmRvd3MuaCIKLSNpbmNsdWRlICJtb2R1bGUuaCIKLSNpbmNsdWRlICJzZWxlY3RvcnMuaCIKICNpbmNsdWRlICJiaXRtYXAuaCIKICNpbmNsdWRlICJjb21tLmgiCiAjaW5jbHVkZSAid2luLmgiCkBAIC0yNyw3ICsyNSw2IEBACiAjaW5jbHVkZSAiaGVhcC5oIgogI2luY2x1ZGUgImtleWJvYXJkLmgiCiAjaW5jbHVkZSAibWlzY2VtdS5oIgotI2luY2x1ZGUgIm5lZXhlLmgiCiAjaW5jbHVkZSAib3B0aW9ucy5oIgogI2luY2x1ZGUgInNweS5oIgogI2luY2x1ZGUgInRhc2suaCIKQEAgLTM2LDcgKzMzLDYgQEAKICNpbmNsdWRlICJkY2UuaCIKICNpbmNsdWRlICJzaGVsbC5oIgogI2luY2x1ZGUgIndpbnByb2MuaCIKLSNpbmNsdWRlICJzdGRkZWJ1Zy5oIgogI2luY2x1ZGUgImRlYnVnLmgiCiAKIApkaWZmIC0tZ2l0IGEvbG9hZGVyL21vZHVsZS5jIGIvbG9hZGVyL21vZHVsZS5jCmluZGV4IGM3MjE2ZTYuLjhiYzA3ODMgMTAwNjQ0Ci0tLSBhL2xvYWRlci9tb2R1bGUuYworKysgYi9sb2FkZXIvbW9kdWxlLmMKQEAgLTE2LDcgKzE2LDYgQEAKICNpbmNsdWRlICJmaWxlLmgiCiAjaW5jbHVkZSAiZ2xvYmFsLmgiCiAjaW5jbHVkZSAiaGVhcC5oIgotI2luY2x1ZGUgImhvb2suaCIKICNpbmNsdWRlICJtb2R1bGUuaCIKICNpbmNsdWRlICJuZWV4ZS5oIgogI2luY2x1ZGUgInByb2Nlc3MuaCIKQEAgLTI1LDcgKzI0LDYgQEAKICNpbmNsdWRlICJzdGFja2ZyYW1lLmgiCiAjaW5jbHVkZSAidGFzay5oIgogI2luY2x1ZGUgInRvb2xoZWxwLmgiCi0jaW5jbHVkZSAic3RkZGVidWcuaCIKICNpbmNsdWRlICJkZWJ1Zy5oIgogI2luY2x1ZGUgImNhbGxiYWNrLmgiCiAKQEAgLTM0LDYgKzMyLDkgQEAKIHN0YXRpYyBITU9EVUxFMTYgaEZpcnN0TW9kdWxlID0gMDsKIHN0YXRpYyBITU9EVUxFMTYgaENhY2hlZE1vZHVsZSA9IDA7ICAvKiBNb2R1bGUgY2FjaGVkIGJ5IE1PRFVMRV9PcGVuRmlsZSAqLwogCitzdGF0aWMgSE1PRFVMRTMyIE1PRFVMRV9Mb2FkTW9kdWxlKExQQ1NUUiBuYW1lLEJPT0wzMiBmb3JjZSkgeyByZXR1cm4gMDsgfQorSE1PRFVMRTMyICgqZm5CVUlMVElOX0xvYWRNb2R1bGUpKExQQ1NUUiBuYW1lLEJPT0wzMiBmb3JjZSkgPSBNT0RVTEVfTG9hZE1vZHVsZTsKKwogCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICAqICAgICAgICAgICBNT0RVTEVfR2V0UHRyCkBAIC0yNjgsNyArMjY5LDcgQEAKICAgICBzdGF0aWMgaW50IGNhY2hlZGZkID0gLTE7CiAKICAgICBoTW9kdWxlID0gTU9EVUxFX0hBTkRMRXRvSE1PRFVMRTE2KGhNb2R1bGUpOwotICAgIGRwcmludGZfbW9kdWxlKCBzdGRkZWIsICJNT0RVTEVfT3BlbkZpbGUoJTA0eCkgY2FjaGU6IG1vZD0lMDR4IGZkPSVkXG4iLAorICAgIGRwcmludGZfaW5mbyhtb2R1bGUsICJNT0RVTEVfT3BlbkZpbGUoJTA0eCkgY2FjaGU6IG1vZD0lMDR4IGZkPSVkXG4iLAogICAgICAgICAgICAgICAgICAgICBoTW9kdWxlLCBoQ2FjaGVkTW9kdWxlLCBjYWNoZWRmZCApOwogICAgIGlmICghKHBNb2R1bGUgPSBNT0RVTEVfR2V0UHRyKCBoTW9kdWxlICkpKSByZXR1cm4gLTE7CiAgICAgaWYgKGhDYWNoZWRNb2R1bGUgPT0gaE1vZHVsZSkgcmV0dXJuIGNhY2hlZGZkOwpAQCAtMjc5LDcgKzI4MCw3IEBACiAgICAgICAgIChjYWNoZWRmZCA9IG9wZW4oIGZ1bGxfbmFtZS5sb25nX25hbWUsIE9fUkRPTkxZICkpID09IC0xKQogICAgICAgICBmcHJpbnRmKCBzdGRlcnIsICJNT0RVTEVfT3BlbkZpbGU6IGNhbid0IG9wZW4gZmlsZSAnJXMnIGZvciBtb2R1bGUgJTA0eFxuIiwKICAgICAgICAgICAgICAgICAgbmFtZSwgaE1vZHVsZSApOwotICAgIGRwcmludGZfbW9kdWxlKCBzdGRkZWIsICJNT0RVTEVfT3BlbkZpbGU6IG9wZW5lZCAnJXMnIC0+ICVkXG4iLAorICAgIGRwcmludGZfaW5mbyhtb2R1bGUsICJNT0RVTEVfT3BlbkZpbGU6IG9wZW5lZCAnJXMnIC0+ICVkXG4iLAogICAgICAgICAgICAgICAgICAgICBuYW1lLCBjYWNoZWRmZCApOwogICAgIHJldHVybiBjYWNoZWRmZDsKIH0KQEAgLTU2OCw3ICs1NjksNyBAQAogICAgIHsKICAgICAgICAgZmFzdGxvYWRfb2Zmc2V0PW5lX2hlYWRlci5mYXN0bG9hZF9vZmZzZXQ8PG5lX2hlYWRlci5hbGlnbl9zaGlmdF9jb3VudDsKICAgICAgICAgZmFzdGxvYWRfbGVuZ3RoPW5lX2hlYWRlci5mYXN0bG9hZF9sZW5ndGg8PG5lX2hlYWRlci5hbGlnbl9zaGlmdF9jb3VudDsKLSAgICAgICAgZHByaW50Zl9tb2R1bGUoIHN0ZGRlYiwgIlVzaW5nIGZhc3QtbG9hZCBhcmVhIG9mZnNldD0leCBsZW49JWRcbiIsCisgICAgICAgIGRwcmludGZfaW5mbyhtb2R1bGUsICJVc2luZyBmYXN0LWxvYWQgYXJlYSBvZmZzZXQ9JXggbGVuPSVkXG4iLAogICAgICAgICAgICAgICAgICAgICAgICAgZmFzdGxvYWRfb2Zmc2V0LCBmYXN0bG9hZF9sZW5ndGggKTsKICAgICAgICAgaWYgKChmYXN0bG9hZCA9IEhlYXBBbGxvYyggU3lzdGVtSGVhcCwgMCwgZmFzdGxvYWRfbGVuZ3RoICkpICE9IE5VTEwpCiAgICAgICAgIHsKQEAgLTc1NSw3ICs3NTYsNyBAQAogCiAgICAgaWYgKCEocE1vZHVsZSA9IE1PRFVMRV9HZXRQdHIoIGhNb2R1bGUgKSkpIHJldHVybiAwOwogCi0gICAgZHByaW50Zl9tb2R1bGUoIHN0ZGRlYiwgIk1PRFVMRV9HZXRPcmRpbmFsKCUwNHgsJyVzJylcbiIsCisgICAgZHByaW50Zl9pbmZvKG1vZHVsZSwgIk1PRFVMRV9HZXRPcmRpbmFsKCUwNHgsJyVzJylcbiIsCiAgICAgICAgICAgICAgICAgICAgIGhNb2R1bGUsIG5hbWUgKTsKIAogICAgICAgLyogRmlyc3QgaGFuZGxlIG5hbWVzIG9mIHRoZSBmb3JtICcjeHh4eCcgKi8KQEAgLTc3OCw3ICs3NzksNyBAQAogICAgIHsKICAgICAgICAgaWYgKCgoQllURSkqY3BudCA9PSBsZW4pICYmICFtZW1jbXAoIGNwbnQrMSwgYnVmZmVyLCBsZW4gKSkKICAgICAgICAgewotICAgICAgICAgICAgZHByaW50Zl9tb2R1bGUoIHN0ZGRlYiwgIiAgRm91bmQ6IG9yZGluYWw9JWRcbiIsCisgICAgICAgICAgICBkcHJpbnRmX2luZm8obW9kdWxlLCAiICBGb3VuZDogb3JkaW5hbD0lZFxuIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKFdPUkQgKikoY3BudCArICpjcG50ICsgMSkgKTsKICAgICAgICAgICAgIHJldHVybiAqKFdPUkQgKikoY3BudCArICpjcG50ICsgMSk7CiAgICAgICAgIH0KQEAgLTc5Niw3ICs3OTcsNyBAQAogICAgIHsKICAgICAgICAgaWYgKCgoQllURSkqY3BudCA9PSBsZW4pICYmICFtZW1jbXAoIGNwbnQrMSwgYnVmZmVyLCBsZW4gKSkKICAgICAgICAgewotICAgICAgICAgICAgZHByaW50Zl9tb2R1bGUoIHN0ZGRlYiwgIiAgRm91bmQ6IG9yZGluYWw9JWRcbiIsCisgICAgICAgICAgICBkcHJpbnRmX2luZm8obW9kdWxlLCAiICBGb3VuZDogb3JkaW5hbD0lZFxuIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKFdPUkQgKikoY3BudCArICpjcG50ICsgMSkgKTsKICAgICAgICAgICAgIHJldHVybiAqKFdPUkQgKikoY3BudCArICpjcG50ICsgMSk7CiAgICAgICAgIH0KQEAgLTEwNDMsNyArMTA0NCw3IEBACiAgICAgaWYgKG9yZGluYWwpIFdFUCA9IE1PRFVMRV9HZXRFbnRyeVBvaW50KCBoTW9kdWxlLCBvcmRpbmFsICk7CiAgICAgaWYgKCFXRVApCiAgICAgewotCWRwcmludGZfbW9kdWxlKCBzdGRkZWIsICJtb2R1bGUgJTA0eCBkb2Vzbid0IGhhdmUgYSBXRVBcbiIsIGhNb2R1bGUgKTsKKwlkcHJpbnRmX3dhcm4obW9kdWxlLCAibW9kdWxlICUwNHggZG9lc24ndCBoYXZlIGEgV0VQXG4iLCBoTW9kdWxlICk7CiAJcmV0dXJuIEZBTFNFOwogICAgIH0KICAgICByZXR1cm4gQ2FsbGJhY2tzLT5DYWxsV2luZG93c0V4aXRQcm9jKCBXRVAsIFdFUF9GUkVFX0RMTCApOwpAQCAtMTE1NywxMyArMTE1OCwxMyBAQAogICAgICAgICBpZiAoIWhNb2R1bGUpICAvKiBXZSBoYXZlIHRvIGxvYWQgdGhlIG1vZHVsZSAqLwogICAgICAgICB7CiAgICAgICAgICAgICAvKiBUcnkgdG8gbG9hZCB0aGUgYnVpbHQtaW4gZmlyc3QgaWYgbm90IGRpc2FibGVkICovCi0gICAgICAgICAgICBpZiAoKGhNb2R1bGUgPSBCVUlMVElOX0xvYWRNb2R1bGUoIG5hbWUsIEZBTFNFICkpKQorICAgICAgICAgICAgaWYgKChoTW9kdWxlID0gZm5CVUlMVElOX0xvYWRNb2R1bGUoIG5hbWUsIEZBTFNFICkpKQogICAgICAgICAgICAgICAgIHJldHVybiBNT0RVTEVfSEFORExFdG9ITU9EVUxFMTYoIGhNb2R1bGUgKTsKICAgICAgICAgICAgIAogICAgICAgICAgICAgaWYgKChoRmlsZSA9IE9wZW5GaWxlMzIoIG5hbWUsICZvZnMsIE9GX1JFQUQgKSkgPT0gSEZJTEVfRVJST1IzMikKICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAvKiBOb3cgdHJ5IHRoZSBidWlsdC1pbiBldmVuIGlmIGRpc2FibGVkICovCi0gICAgICAgICAgICAgICAgaWYgKChoTW9kdWxlID0gQlVJTFRJTl9Mb2FkTW9kdWxlKCBuYW1lLCBUUlVFICkpKQorICAgICAgICAgICAgICAgIGlmICgoaE1vZHVsZSA9IGZuQlVJTFRJTl9Mb2FkTW9kdWxlKCBuYW1lLCBUUlVFICkpKQogICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgZnByaW50Ziggc3RkZXJyLCAiV2FybmluZzogY291bGQgbm90IGxvYWQgV2luZG93cyBETEwgJyVzJywgdXNpbmcgYnVpbHQtaW4gbW9kdWxlLlxuIiwgbmFtZSApOwogICAgICAgICAgICAgICAgICAgICByZXR1cm4gTU9EVUxFX0hBTkRMRXRvSE1PRFVMRTE2KCBoTW9kdWxlICk7CkBAIC0xMjY3LDEyICsxMjY4LDM0IEBACiB9CiAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgkgICAgTG9hZE1vZHVsZTMyICAgIChLRVJORUwzMikKLSAqIEZJWE1FOiBjaGVjayB0aGlzIGZ1bmN0aW9uCisgKgkgICAgTG9hZE1vZHVsZTMyICAgIChLRVJORUwzMi40OTkpCisgKgorICogRklYTUUKKyAqCisgKiAgVGhpcyBzaG91bGQgZ2V0IGltcGxlbWVudGVkIHZpYSBDcmVhdGVQcm9jZXNzIC0tIE1PRFVMRV9Mb2FkCisgKiAgaXMgcmVzb2x1dGVseSAxNi1iaXQuCiAgKi8KIERXT1JEIExvYWRNb2R1bGUzMiggTFBDU1RSIG5hbWUsIExQVk9JRCBwYXJhbUJsb2NrICkgCiB7CisjaWZkZWYgMAorICBMT0FEUEFSQU1TMzIgKnAgPSBwYXJhbUJsb2NrOworICBTVEFSVFVQSU5GTyBzdDsKKyAgUFJPQ0VTU0lORk9STUFUSU9OIHBpOworICBzdC5jYiA9IHNpemVvZihTVEFSVFVQSU5GTyk7CisgIHN0LndTaG93V2luZG93ID0gcC0+bHBDbWRTaG93WzJdIDsgV1JPTkcKKworICBCT09MMzIgcmV0ID0gQ3JlYXRlUHJvY2VzczMyQSggbmFtZSwgcC0+bHBDbWRMaW5lLCAKKwkJCQkgTlVMTCwgTlVMTCwgRkFMU0UsIDAsIHAtPmxwRW52QWRkcmVzcywKKwkJCQkgTlVMTCwgJnN0LCAmcGkpOworICBpZiAoIXJldCkgeworICAgIC8qICAgIGhhbmRsZSBlcnJvcnMgYXBwcm9wcmlhdGVseSAqLworICB9CisgIENsb3NlSGFuZGxlMzIocGkuaFByb2Nlc3MpOworICBDbG9zZUhhbmRsZTMyKHBpLmhUaHJlYWQpOyAKKworI2Vsc2UKICAgICByZXR1cm4gTU9EVUxFX0xvYWQoIG5hbWUsIHBhcmFtQmxvY2ssIDAgKTsKKyNlbmRpZgogfQogCiAKQEAgLTEyODQsNyArMTMwNyw3IEBACiAgICAgTkVfTU9EVUxFICpwTW9kdWxlOwogCiAgICAgaWYgKCEocE1vZHVsZSA9IE1PRFVMRV9HZXRQdHIoIGhNb2R1bGUgKSkpIHJldHVybiBGQUxTRTsKLSAgICBkcHJpbnRmX21vZHVsZSggc3RkZGViLCAiRnJlZU1vZHVsZTE2OiAlcyBjb3VudCAlZFxuIiwgCisgICAgZHByaW50Zl9pbmZvKG1vZHVsZSwgIkZyZWVNb2R1bGUxNjogJXMgY291bnQgJWRcbiIsIAogCQkgICAgTU9EVUxFX0dldE1vZHVsZU5hbWUoaE1vZHVsZSksIHBNb2R1bGUtPmNvdW50ICk7CiAKICAgICByZXR1cm4gTU9EVUxFX0ZyZWVNb2R1bGUoIGhNb2R1bGUsIEdsb2JhbExvY2sxNihHZXRDdXJyZW50VGFzaygpKSApOwpAQCAtMTMxMiw3ICsxMzM1LDcgQEAKIHsKICAgICBITU9EVUxFMzIJaE1vZHVsZTsKIAotICAgIGRwcmludGZfd2luMzIoc3RkZGViLCAiR2V0TW9kdWxlSGFuZGxlQTogJXNcbiIsIG1vZHVsZSA/IG1vZHVsZSA6ICJOVUxMIik7CisgICAgZHByaW50Zl9pbmZvKHdpbjMyLCAiR2V0TW9kdWxlSGFuZGxlQTogJXNcbiIsIG1vZHVsZSA/IG1vZHVsZSA6ICJOVUxMIik7CiAvKiBGcmVlY2VsbCB1c2VzIHRoZSByZXN1bHQgb2YgR2V0TW9kdWxlSGFuZGxlQSgwKSBhcyB0aGUgaEluc3RhbmNlIGluCiBhbGwgY2FsbHMgdG8gZS5nLiBDcmVhdGVXaW5kb3dFeC4gKi8KICAgICBpZiAobW9kdWxlID09IE5VTEwpIHsKQEAgLTEzNDEsNyArMTM2NCw3IEBACiAgICAgTkVfTU9EVUxFICpwTW9kdWxlOwogCiAgICAgaWYgKCEocE1vZHVsZSA9IE1PRFVMRV9HZXRQdHIoIGhNb2R1bGUgKSkpIHJldHVybiAwOwotICAgIGRwcmludGZfbW9kdWxlKCBzdGRkZWIsICJHZXRNb2R1bGVVc2FnZSglMDR4KTogcmV0dXJuaW5nICVkXG4iLAorICAgIGRwcmludGZfaW5mbyhtb2R1bGUsICJHZXRNb2R1bGVVc2FnZSglMDR4KTogcmV0dXJuaW5nICVkXG4iLAogICAgICAgICAgICAgICAgICAgICBoTW9kdWxlLCBwTW9kdWxlLT5jb3VudCApOwogICAgIHJldHVybiBwTW9kdWxlLT5jb3VudDsKIH0KQEAgLTEzNTgsNyArMTM4MSw3IEBACiAgICAgaWYgKCFoTW9kdWxlKSBoTW9kdWxlID0gR2V0Q3VycmVudFRhc2soKTsKICAgICBpZiAoIShwTW9kdWxlID0gTU9EVUxFX0dldFB0ciggaE1vZHVsZSApKSkgcmV0dXJuIDA7CiAgICAgbHN0cmNweW4zMkEoIGxwRmlsZU5hbWUsIE5FX01PRFVMRV9OQU1FKHBNb2R1bGUpLCBuU2l6ZSApOwotICAgIGRwcmludGZfbW9kdWxlKCBzdGRkZWIsICJHZXRNb2R1bGVGaWxlTmFtZTE2OiAlc1xuIiwgbHBGaWxlTmFtZSApOworICAgIGRwcmludGZfaW5mbyhtb2R1bGUsICJHZXRNb2R1bGVGaWxlTmFtZTE2OiAlc1xuIiwgbHBGaWxlTmFtZSApOwogICAgIHJldHVybiBzdHJsZW4obHBGaWxlTmFtZSk7CiB9CiAKQEAgLTEzNzgsNyArMTQwMSw3IEBACiAgICAgfQogICAgIGlmICghKHBNb2R1bGUgPSBNT0RVTEVfR2V0UHRyKCBoTW9kdWxlICkpKSByZXR1cm4gMDsKICAgICBsc3RyY3B5bjMyQSggbHBGaWxlTmFtZSwgTkVfTU9EVUxFX05BTUUocE1vZHVsZSksIHNpemUgKTsKLSAgICBkcHJpbnRmX21vZHVsZSggc3RkZGViLCAiR2V0TW9kdWxlRmlsZU5hbWUzMkE6ICVzXG4iLCBscEZpbGVOYW1lICk7CisgICAgZHByaW50Zl9pbmZvKG1vZHVsZSwgIkdldE1vZHVsZUZpbGVOYW1lMzJBOiAlc1xuIiwgbHBGaWxlTmFtZSApOwogICAgIHJldHVybiBzdHJsZW4obHBGaWxlTmFtZSk7CiB9ICAgICAgICAgICAgICAgICAgIAogIApAQCAtMTQ3Myw3ICsxNDk2LDcgQEAKICAqLwogQk9PTDMyIFdJTkFQSSBGcmVlTGlicmFyeTMyKEhJTlNUQU5DRTMyIGhMaWJNb2R1bGUpCiB7Ci0JZHByaW50Zl9tb2R1bGUoc3RkZGViLCJGcmVlTGlicmFyeTogaExpYk1vZHVsZTogJTA4eFxuIiwgaExpYk1vZHVsZSk7CisJZHByaW50Zl9pbmZvKG1vZHVsZSwiRnJlZUxpYnJhcnk6IGhMaWJNb2R1bGU6ICUwOHhcbiIsIGhMaWJNb2R1bGUpOwogCXJldHVybiBNT0RVTEVfRnJlZU1vZHVsZShoTGliTW9kdWxlLCAKIAkgICAgICAgICAgICAgICAgICAgICAgICAgR2xvYmFsTG9jazE2KEdldEN1cnJlbnRUYXNrKCkpICk7CiB9CkBAIC0xNDkxLDcgKzE1MTQsNyBAQAogICAgICAgICBmcHJpbnRmKCBzdGRlcnIsICJMb2FkTGlicmFyeSBub3Qgc3VwcG9ydGVkIGluIFdpbmVsaWJcbiIgKTsKICAgICAgICAgcmV0dXJuIDA7CiAgICAgfQotICAgIGRwcmludGZfbW9kdWxlKCBzdGRkZWIsICJMb2FkTGlicmFyeTogKCUwOHgpICVzXG4iLCAoaW50KWxpYm5hbWUsIGxpYm5hbWUpOworICAgIGRwcmludGZfaW5mbyhtb2R1bGUsICJMb2FkTGlicmFyeTogKCUwOHgpICVzXG4iLCAoaW50KWxpYm5hbWUsIGxpYm5hbWUpOwogCiAgICAgaGFuZGxlID0gTU9EVUxFX0xvYWQoIGxpYm5hbWUsIChMUFZPSUQpLTEsIDAgKTsKICAgICBpZiAoaGFuZGxlID09IChISU5TVEFOQ0UxNikyKSAgLyogZmlsZSBub3QgZm91bmQgKi8KQEAgLTE1MjEsNyArMTU0NCw3IEBACiAgKi8KIHZvaWQgV0lOQVBJIEZyZWVMaWJyYXJ5MTYoIEhJTlNUQU5DRTE2IGhhbmRsZSApCiB7Ci0gICAgZHByaW50Zl9tb2R1bGUoIHN0ZGRlYiwiRnJlZUxpYnJhcnk6ICUwNHhcbiIsIGhhbmRsZSApOworICAgIGRwcmludGZfaW5mbyhtb2R1bGUsIkZyZWVMaWJyYXJ5OiAlMDR4XG4iLCBoYW5kbGUgKTsKICAgICBGcmVlTW9kdWxlMTYoIGhhbmRsZSApOwogfQogCkBAIC0xNTUzLDcgKzE1NzYsNyBAQAogewogICAgIExPQURQQVJBTVMgcGFyYW1zOwogICAgIEhHTE9CQUwxNiBjbWRTaG93SGFuZGxlLCBjbWRMaW5lSGFuZGxlOwotICAgIEhJTlNUQU5DRTE2IGhhbmRsZSA9IDI7CisgICAgSElOU1RBTkNFMzIgaGFuZGxlID0gMjsKICAgICBXT1JEICpjbWRTaG93UHRyOwogICAgIGNoYXIgKnAsICpjbWRsaW5lLCBmaWxlbmFtZVsyNTZdOwogICAgIHN0YXRpYyBpbnQgdXNlX2xvYWRfbW9kdWxlID0gMTsKQEAgLTE2MzAsNyArMTY1Myw3IEBACiAJICAgIHBhcmFtcy5jbWRMaW5lICA9IChTRUdQVFIpV0lOMTZfR2xvYmFsTG9jazE2KCBjbWRMaW5lSGFuZGxlICk7CiAJICAgIHBhcmFtcy5zaG93Q21kICA9IChTRUdQVFIpV0lOMTZfR2xvYmFsTG9jazE2KCBjbWRTaG93SGFuZGxlICk7CiAJICAgIHBhcmFtcy5yZXNlcnZlZCA9IDA7Ci0JICAgIGhhbmRsZSA9IExvYWRNb2R1bGUxNiggZmlsZW5hbWUsICZwYXJhbXMgKTsKKwkgICAgaGFuZGxlID0gTG9hZE1vZHVsZTMyKCBmaWxlbmFtZSwgJnBhcmFtcyApOwogCSAgICBpZiAoaGFuZGxlID09IDIpICAvKiBmaWxlIG5vdCBmb3VuZCAqLwogCSAgICB7CiAJCS8qIENoZWNrIHRoYXQgdGhlIG9yaWdpbmFsIGZpbGUgbmFtZSBkaWQgbm90IGhhdmUgYSBzdWZmaXggKi8KQEAgLTE3MzUsMTYgKzE3NTgsMTYgQEAKICAgICBoTW9kdWxlID0gTU9EVUxFX0hBTkRMRXRvSE1PRFVMRTE2KGhNb2R1bGUpOwogICAgIGlmIChISVdPUkQobmFtZSkpIHsKICAgICAgICAgb3JkaW5hbCA9IE1PRFVMRV9HZXRPcmRpbmFsKCBoTW9kdWxlLCBuYW1lICk7Ci0gICAgICAgIGRwcmludGZfbW9kdWxlKCBzdGRkZWIsICJXSU4zMl9HZXRQcm9jQWRkcmVzczE2OiAlMDR4ICclcydcbiIsCisgICAgICAgIGRwcmludGZfaW5mbyhtb2R1bGUsICJXSU4zMl9HZXRQcm9jQWRkcmVzczE2OiAlMDR4ICclcydcbiIsCiAgICAgICAgICAgICAgICAgICAgICAgICBoTW9kdWxlLCBuYW1lICk7CiAgICAgfSBlbHNlIHsKICAgICAgICAgb3JkaW5hbCA9IExPV09SRChuYW1lKTsKLSAgICAgICAgZHByaW50Zl9tb2R1bGUoIHN0ZGRlYiwgIkdldFByb2NBZGRyZXNzOiAlMDR4ICUwNHhcbiIsCisgICAgICAgIGRwcmludGZfaW5mbyhtb2R1bGUsICJHZXRQcm9jQWRkcmVzczogJTA0eCAlMDR4XG4iLAogICAgICAgICAgICAgICAgICAgICAgICAgaE1vZHVsZSwgb3JkaW5hbCApOwogICAgIH0KICAgICBpZiAoIW9yZGluYWwpIHJldHVybiAoRkFSUFJPQzE2KTA7CiAgICAgcmV0ID0gTU9EVUxFX0dldEVudHJ5UG9pbnQoIGhNb2R1bGUsIG9yZGluYWwgKTsKLSAgICBkcHJpbnRmX21vZHVsZShzdGRkZWIsIldJTjMyX0dldFByb2NBZGRyZXNzMTY6IHJldHVybmluZyAlMDh4XG4iLChVSU5UMzIpcmV0KTsKKyAgICBkcHJpbnRmX2luZm8obW9kdWxlLCJXSU4zMl9HZXRQcm9jQWRkcmVzczE2OiByZXR1cm5pbmcgJTA4eFxuIiwoVUlOVDMyKXJldCk7CiAgICAgcmV0dXJuIHJldDsKIH0KIApAQCAtMTc2MiwyMCArMTc4NSwyMCBAQAogICAgIGlmIChISVdPUkQobmFtZSkgIT0gMCkKICAgICB7CiAgICAgICAgIG9yZGluYWwgPSBNT0RVTEVfR2V0T3JkaW5hbCggaE1vZHVsZSwgKExQU1RSKVBUUl9TRUdfVE9fTElOKG5hbWUpICk7Ci0gICAgICAgIGRwcmludGZfbW9kdWxlKCBzdGRkZWIsICJHZXRQcm9jQWRkcmVzczogJTA0eCAnJXMnXG4iLAorICAgICAgICBkcHJpbnRmX2luZm8obW9kdWxlLCAiR2V0UHJvY0FkZHJlc3M6ICUwNHggJyVzJ1xuIiwKICAgICAgICAgICAgICAgICAgICAgICAgIGhNb2R1bGUsIChMUFNUUilQVFJfU0VHX1RPX0xJTihuYW1lKSApOwogICAgIH0KICAgICBlbHNlCiAgICAgewogICAgICAgICBvcmRpbmFsID0gTE9XT1JEKG5hbWUpOwotICAgICAgICBkcHJpbnRmX21vZHVsZSggc3RkZGViLCAiR2V0UHJvY0FkZHJlc3M6ICUwNHggJTA0eFxuIiwKKyAgICAgICAgZHByaW50Zl9pbmZvKG1vZHVsZSwgIkdldFByb2NBZGRyZXNzOiAlMDR4ICUwNHhcbiIsCiAgICAgICAgICAgICAgICAgICAgICAgICBoTW9kdWxlLCBvcmRpbmFsICk7CiAgICAgfQogICAgIGlmICghb3JkaW5hbCkgcmV0dXJuIChGQVJQUk9DMTYpMDsKIAogICAgIHJldCA9IE1PRFVMRV9HZXRFbnRyeVBvaW50KCBoTW9kdWxlLCBvcmRpbmFsICk7CiAKLSAgICBkcHJpbnRmX21vZHVsZSggc3RkZGViLCAiR2V0UHJvY0FkZHJlc3M6IHJldHVybmluZyAlMDh4XG4iLCAoVUlOVDMyKXJldCApOworICAgIGRwcmludGZfaW5mbyhtb2R1bGUsICJHZXRQcm9jQWRkcmVzczogcmV0dXJuaW5nICUwOHhcbiIsIChVSU5UMzIpcmV0ICk7CiAgICAgcmV0dXJuIHJldDsKIH0KIApAQCAtMTc4OCw5ICsxODExLDkgQEAKICAgICBORV9NT0RVTEUgKnBNb2R1bGU7CiAKICAgICBpZiAoSElXT1JEKGZ1bmN0aW9uKSkKLQlkcHJpbnRmX3dpbjMyKHN0ZGRlYiwiR2V0UHJvY0FkZHJlc3MzMiglMDhseCwlcylcbiIsKERXT1JEKWhNb2R1bGUsZnVuY3Rpb24pOworCWRwcmludGZfaW5mbyh3aW4zMiwiR2V0UHJvY0FkZHJlc3MzMiglMDhseCwlcylcbiIsKERXT1JEKWhNb2R1bGUsZnVuY3Rpb24pOwogICAgIGVsc2UKLQlkcHJpbnRmX3dpbjMyKHN0ZGRlYiwiR2V0UHJvY0FkZHJlc3MzMiglMDhseCwlcClcbiIsKERXT1JEKWhNb2R1bGUsZnVuY3Rpb24pOworCWRwcmludGZfaW5mbyh3aW4zMiwiR2V0UHJvY0FkZHJlc3MzMiglMDhseCwlcClcbiIsKERXT1JEKWhNb2R1bGUsZnVuY3Rpb24pOwogICAgIGlmICghKHBNb2R1bGUgPSBNT0RVTEVfR2V0UHRyKCBoTW9kdWxlICkpKQogICAgICAgICByZXR1cm4gKEZBUlBST0MzMikwOwogICAgIGlmICghcE1vZHVsZS0+bW9kdWxlMzIpCmRpZmYgLS1naXQgYS9sb2FkZXIvbmVfaW1hZ2UuYyBiL2xvYWRlci9uZV9pbWFnZS5jCmluZGV4IGQwOTJiM2QuLjdiMTNiYWIgMTAwNjQ0Ci0tLSBhL2xvYWRlci9uZV9pbWFnZS5jCisrKyBiL2xvYWRlci9uZV9pbWFnZS5jCkBAIC0yMyw3ICsyMyw2IEBACiAjaW5jbHVkZSAiZmlsZS5oIgogI2luY2x1ZGUgIm1vZHVsZS5oIgogI2luY2x1ZGUgInN0YWNrZnJhbWUuaCIKLSNpbmNsdWRlICJzdGRkZWJ1Zy5oIgogI2luY2x1ZGUgImRlYnVnLmgiCiAjaW5jbHVkZSAieG1hbGxvYy5oIgogCkBAIC01NSw3ICs1NCw3IEBACiAgICAgaWYgKCFwU2VnLT5maWxlcG9zKSByZXR1cm4gVFJVRTsgIC8qIE5vIGZpbGUgaW1hZ2UsIGp1c3QgcmV0dXJuICovCiAJCiAgICAgZmQgPSBNT0RVTEVfT3BlbkZpbGUoIHBNb2R1bGUtPnNlbGYgKTsKLSAgICBkcHJpbnRmX21vZHVsZSggc3RkZGViLCAiTG9hZGluZyBzZWdtZW50ICVkLCBzZWxlY3Rvcj0lMDR4LCBmbGFncz0lMDR4XG4iLAorICAgIGRwcmludGZfaW5mbyhtb2R1bGUsICJMb2FkaW5nIHNlZ21lbnQgJWQsIHNlbGVjdG9yPSUwNHgsIGZsYWdzPSUwNHhcbiIsCiAgICAgICAgICAgICAgICAgICAgIHNlZ251bSwgcFNlZy0+c2VsZWN0b3IsIHBTZWctPmZsYWdzICk7CiAgICAgbHNlZWsoIGZkLCBwU2VnLT5maWxlcG9zIDw8IHBNb2R1bGUtPmFsaWdubWVudCwgU0VFS19TRVQgKTsKICAgICBpZiAocFNlZy0+c2l6ZSkgc2l6ZSA9IHBTZWctPnNpemU7CkBAIC0xNDMsNyArMTQyLDcgQEAKICAgICByZWFkKCBmZCwgJmNvdW50LCBzaXplb2YoY291bnQpICk7CiAgICAgaWYgKCFjb3VudCkgcmV0dXJuIFRSVUU7CiAKLSAgICBkcHJpbnRmX2ZpeHVwKCBzdGRkZWIsICJGaXh1cHMgZm9yICUqLipzLCBzZWdtZW50ICVkLCBzZWxlY3RvciAlMDR4XG4iLAorICAgIGRwcmludGZfaW5mbyhmaXh1cCwgIkZpeHVwcyBmb3IgJSouKnMsIHNlZ21lbnQgJWQsIHNlbGVjdG9yICUwNHhcbiIsCiAgICAgICAgICAgICAgICAgICAgKigoQllURSAqKXBNb2R1bGUgKyBwTW9kdWxlLT5uYW1lX3RhYmxlKSwKICAgICAgICAgICAgICAgICAgICAqKChCWVRFICopcE1vZHVsZSArIHBNb2R1bGUtPm5hbWVfdGFibGUpLAogICAgICAgICAgICAgICAgICAgIChjaGFyICopcE1vZHVsZSArIHBNb2R1bGUtPm5hbWVfdGFibGUgKyAxLApAQCAtMTUzLDcgKzE1Miw3IEBACiAgICAgaWYgKHJlYWQoIGZkLCByZWxvY19lbnRyaWVzLCBjb3VudCAqIHNpemVvZihzdHJ1Y3QgcmVsb2NhdGlvbl9lbnRyeV9zKSkgIT0KICAgICAgICAgICAgIGNvdW50ICogc2l6ZW9mKHN0cnVjdCByZWxvY2F0aW9uX2VudHJ5X3MpKQogICAgIHsKLSAgICAgICAgZHByaW50Zl9maXh1cCggc3RkZGViLCAiVW5hYmxlIHRvIHJlYWQgcmVsb2NhdGlvbiBpbmZvcm1hdGlvblxuIiApOworICAgICAgICBkcHJpbnRmX3dhcm4oZml4dXAsICJVbmFibGUgdG8gcmVhZCByZWxvY2F0aW9uIGluZm9ybWF0aW9uXG4iICk7CiAgICAgICAgIHJldHVybiBGQUxTRTsKICAgICB9CiAKQEAgLTE5NCwxNCArMTkzLDE0IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGNoYXIgKilwVGFyZ2V0ICsgcFRhcmdldC0+bmFtZV90YWJsZSArIDEsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3JkaW5hbCApOwogICAgICAgICAgICAgfQotICAgICAgICAgICAgaWYgKGRlYnVnZ2luZ19maXh1cCkKKyAgICAgICAgICAgIGlmIChkZWJ1Z2dpbmdfaW5mbyhmaXh1cCkpCiAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgTkVfTU9EVUxFICpwVGFyZ2V0ID0gTU9EVUxFX0dldFB0ciggbW9kdWxlICk7Ci0gICAgICAgICAgICAgICAgZnByaW50Ziggc3RkZGViLCIlZDogJSouKnMuJWQ9JTA0eDolMDR4XG4iLCBpICsgMSwgCi0gICAgICAgICAgICAgICAgICAgICAgICAgKigoQllURSAqKXBUYXJnZXQgKyBwVGFyZ2V0LT5uYW1lX3RhYmxlKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAqKChCWVRFICopcFRhcmdldCArIHBUYXJnZXQtPm5hbWVfdGFibGUpLAotICAgICAgICAgICAgICAgICAgICAgICAgIChjaGFyICopcFRhcmdldCArIHBUYXJnZXQtPm5hbWVfdGFibGUgKyAxLAotICAgICAgICAgICAgICAgICAgICAgICAgIG9yZGluYWwsIEhJV09SRChhZGRyZXNzKSwgTE9XT1JEKGFkZHJlc3MpICk7CisgICAgICAgICAgICAgICAgZHByaW50Zl9pbmZvKGZpeHVwLCAiJWQ6ICUqLipzLiVkPSUwNHg6JTA0eFxuIiwgaSArIDEsIAorCQkJICAgICAqKChCWVRFICopcFRhcmdldCArIHBUYXJnZXQtPm5hbWVfdGFibGUpLAorCQkJICAgICAqKChCWVRFICopcFRhcmdldCArIHBUYXJnZXQtPm5hbWVfdGFibGUpLAorCQkJICAgICAoY2hhciAqKXBUYXJnZXQgKyBwVGFyZ2V0LT5uYW1lX3RhYmxlICsgMSwKKwkJCSAgICAgb3JkaW5hbCwgSElXT1JEKGFkZHJlc3MpLCBMT1dPUkQoYWRkcmVzcykgKTsKICAgICAgICAgICAgIH0KIAkgICAgYnJlYWs7CiAJICAgIApAQCAtMjE1LDIwICsyMTQsMjAgQEAKIAogICAgICAgICAgICAgYWRkcmVzcyA9IE1PRFVMRV9HZXRFbnRyeVBvaW50KCBtb2R1bGUsIG9yZGluYWwgKTsKIAotICAgICAgICAgICAgaWYgKCFhZGRyZXNzKQorICAgICAgICAgICAgaWYgKGRlYnVnZ2luZ19lcnIoZml4dXApICYmICFhZGRyZXNzKQogICAgICAgICAgICAgewogICAgICAgICAgICAgICAgIE5FX01PRFVMRSAqcFRhcmdldCA9IE1PRFVMRV9HZXRQdHIoIG1vZHVsZSApOwotICAgICAgICAgICAgICAgIGZwcmludGYoIHN0ZGVyciwgIldhcm5pbmc6IG5vIGhhbmRsZXIgZm9yICUuKnMuJXMsIHNldHRpbmcgdG8gMDowXG4iLAotICAgICAgICAgICAgICAgICAgICAgICAgKigoQllURSAqKXBUYXJnZXQgKyBwVGFyZ2V0LT5uYW1lX3RhYmxlKSwKLSAgICAgICAgICAgICAgICAgICAgICAgIChjaGFyICopcFRhcmdldCArIHBUYXJnZXQtPm5hbWVfdGFibGUgKyAxLCBmdW5jX25hbWUgKTsKKyAgICAgICAgICAgICAgICBkcHJpbnRmX2VycihmaXh1cCwgIldhcm5pbmc6IG5vIGhhbmRsZXIgZm9yICUuKnMuJXMsIHNldHRpbmcgdG8gMDowXG4iLAorCQkJICAgICooKEJZVEUgKilwVGFyZ2V0ICsgcFRhcmdldC0+bmFtZV90YWJsZSksCisJCQkgICAgKGNoYXIgKilwVGFyZ2V0ICsgcFRhcmdldC0+bmFtZV90YWJsZSArIDEsIGZ1bmNfbmFtZSApOwogICAgICAgICAgICAgfQotICAgICAgICAgICAgaWYgKGRlYnVnZ2luZ19maXh1cCkKKyAgICAgICAgICAgIGlmIChkZWJ1Z2dpbmdfaW5mbyhmaXh1cCkpCiAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgTkVfTU9EVUxFICpwVGFyZ2V0ID0gTU9EVUxFX0dldFB0ciggbW9kdWxlICk7Ci0gICAgICAgICAgICAgICAgZnByaW50Ziggc3RkZGViLCIlZDogJS4qcy4lcz0lMDR4OiUwNHhcbiIsIGkgKyAxLCAKLSAgICAgICAgICAgICAgICAgICAgICAgICAqKChCWVRFICopcFRhcmdldCArIHBUYXJnZXQtPm5hbWVfdGFibGUpLAotICAgICAgICAgICAgICAgICAgICAgICAgIChjaGFyICopcFRhcmdldCArIHBUYXJnZXQtPm5hbWVfdGFibGUgKyAxLAotICAgICAgICAgICAgICAgICAgICAgICAgIGZ1bmNfbmFtZSwgSElXT1JEKGFkZHJlc3MpLCBMT1dPUkQoYWRkcmVzcykgKTsKKwkgICAgICAgIE5FX01PRFVMRSAqcFRhcmdldCA9IE1PRFVMRV9HZXRQdHIoIG1vZHVsZSApOworICAgICAgICAgICAgICAgIGRwcmludGZfaW5mbyhmaXh1cCwgIiVkOiAlLipzLiVzPSUwNHg6JTA0eFxuIiwgaSArIDEsIAorCQkJICAgICAqKChCWVRFICopcFRhcmdldCArIHBUYXJnZXQtPm5hbWVfdGFibGUpLAorCQkJICAgICAoY2hhciAqKXBUYXJnZXQgKyBwVGFyZ2V0LT5uYW1lX3RhYmxlICsgMSwKKwkJCSAgICAgZnVuY19uYW1lLCBISVdPUkQoYWRkcmVzcyksIExPV09SRChhZGRyZXNzKSApOwogICAgICAgICAgICAgfQogCSAgICBicmVhazsKIAkgICAgCkBAIC0yNDIsNyArMjQxLDcgQEAKICAgICAgICAgICAgICAgICBhZGRyZXNzID0gKEZBUlBST0MxNilQVFJfU0VHX09GRl9UT19TRUdQVFIoIHBTZWdUYWJsZVtyZXAtPnRhcmdldDEtMV0uc2VsZWN0b3IsIHJlcC0+dGFyZ2V0MiApOwogCSAgICB9CiAJICAgIAotCSAgICBkcHJpbnRmX2ZpeHVwKHN0ZGRlYiwiJWQ6ICUwNHg6JTA0eFxuIiwgCisJICAgIGRwcmludGZfaW5mbyhmaXh1cCwiJWQ6ICUwNHg6JTA0eFxuIiwgCiAJCQkgIGkgKyAxLCBISVdPUkQoYWRkcmVzcyksIExPV09SRChhZGRyZXNzKSApOwogCSAgICBicmVhazsKIApAQCAtMjU1LDIxICsyNTQsMTcgQEAKIAkgICAgICogc3VjY2Vzc2Z1bGx5IGVtdWxhdGUgdGhlIGNvcHJvY2Vzc29yIGlmIGl0IGRvZXNuJ3QKIAkgICAgICogZXhpc3QuCiAJICAgICAqLwotCSAgICBkcHJpbnRmX2ZpeHVwKHN0ZGRlYiwKLSAgICAgICAgICAgICAgICAgICAiJWQ6IEFERFIgVFlQRSAlZCwgIFRZUEUgJWQsICBPRkZTRVQgJTA0eCwgICIsCisJICAgIGRwcmludGZfaW5mbyhmaXh1cCwKKyAgICAgICAgICAgICAgICAgICAiJWQ6IEFERFIgVFlQRSAlZCwgIFRZUEUgJWQsICBPRkZTRVQgJTA0eCwgIFRBUkdFVCAlMDR4ICUwNHhcbiIsCiAJCSAgIGkgKyAxLCByZXAtPmFkZHJlc3NfdHlwZSwgcmVwLT5yZWxvY2F0aW9uX3R5cGUsIAotCQkgICByZXAtPm9mZnNldCk7Ci0JICAgIGRwcmludGZfZml4dXAoc3RkZGViLCJUQVJHRVQgJTA0eCAlMDR4XG4iLCAKLQkJICAgcmVwLT50YXJnZXQxLCByZXAtPnRhcmdldDIpOworCQkgICByZXAtPm9mZnNldCwgcmVwLT50YXJnZXQxLCByZXAtPnRhcmdldDIpOwogCSAgICBjb250aW51ZTsKIAkgICAgCiAJICBkZWZhdWx0OgotCSAgICBkcHJpbnRmX2ZpeHVwKHN0ZGRlYiwKLQkJICAgIldBUk5JTkc6ICVkOiBBRERSIFRZUEUgJWQsICB1bmtub3duIFRZUEUgJWQsICBPRkZTRVQgJTA0eCwgICIsCi0JCSAgIGkgKyAxLCByZXAtPmFkZHJlc3NfdHlwZSwgcmVwLT5yZWxvY2F0aW9uX3R5cGUsIAotCQkgICByZXAtPm9mZnNldCk7Ci0JICAgIGRwcmludGZfZml4dXAoc3RkZGViLCJUQVJHRVQgJTA0eCAlMDR4XG4iLCAKLQkJICAgIHJlcC0+dGFyZ2V0MSwgcmVwLT50YXJnZXQyKTsKKwkgICAgZHByaW50Zl93YXJuKGZpeHVwLCAiV0FSTklORzogJWQ6IEFERFIgVFlQRSAlZCwgICIKKwkJCSAgInVua25vd24gVFlQRSAlZCwgT0ZGU0VUICUwNHgsIFRBUkdFVCAlMDR4ICUwNHhcbiIsCisJCQkgIGkgKyAxLCByZXAtPmFkZHJlc3NfdHlwZSwgcmVwLT5yZWxvY2F0aW9uX3R5cGUsIAorCQkJICByZXAtPm9mZnNldCwgcmVwLT50YXJnZXQxLCByZXAtPnRhcmdldDIpOwogCSAgICBmcmVlKHJlbG9jX2VudHJpZXMpOwogCSAgICByZXR1cm4gRkFMU0U7CiAJfQpAQCAtMjg3LDcgKzI4Miw3IEBACiAJICBjYXNlIE5FX1JBRERSX0xPV0JZVEU6CiAgICAgICAgICAgICBkbyB7CiAgICAgICAgICAgICAgICAgc3AgPSBQVFJfU0VHX09GRl9UT19MSU4oIHBTZWctPnNlbGVjdG9yLCBvZmZzZXQgKTsKLSAgICAgICAgICAgICAgICBkcHJpbnRmX2ZpeHVwKHN0ZGRlYiwiICAgICUwNHg6JTA0eDolMDR4IEJZVEUlc1xuIiwKKyAgICAgICAgICAgICAgICBkcHJpbnRmX2luZm8oZml4dXAsIiAgICAlMDR4OiUwNHg6JTA0eCBCWVRFJXNcbiIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwU2VnLT5zZWxlY3Rvciwgb2Zmc2V0LCAqc3AsIGFkZGl0aXZlID8gIiBhZGRpdGl2ZSI6IiIpOwogICAgICAgICAgICAgICAgIG9mZnNldCA9ICpzcDsKIAkJaWYoYWRkaXRpdmUpCkBAIC0zMDEsNyArMjk2LDcgQEAKIAkgIGNhc2UgTkVfUkFERFJfT0ZGU0VUMTY6CiAJICAgIGRvIHsKICAgICAgICAgICAgICAgICBzcCA9IFBUUl9TRUdfT0ZGX1RPX0xJTiggcFNlZy0+c2VsZWN0b3IsIG9mZnNldCApOwotCQlkcHJpbnRmX2ZpeHVwKHN0ZGRlYiwiICAgICUwNHg6JTA0eDolMDR4IE9GRlNFVDE2JXNcbiIsCisJCWRwcmludGZfaW5mbyhmaXh1cCwiICAgICUwNHg6JTA0eDolMDR4IE9GRlNFVDE2JXNcbiIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwU2VnLT5zZWxlY3Rvciwgb2Zmc2V0LCAqc3AsIGFkZGl0aXZlID8gIiBhZGRpdGl2ZSIgOiAiIiApOwogCQlvZmZzZXQgPSAqc3A7CiAJCSpzcCA9IExPV09SRChhZGRyZXNzKTsKQEAgLTMxMyw3ICszMDgsNyBAQAogCSAgY2FzZSBORV9SQUREUl9QT0lOVEVSMzI6CiAJICAgIGRvIHsKICAgICAgICAgICAgICAgICBzcCA9IFBUUl9TRUdfT0ZGX1RPX0xJTiggcFNlZy0+c2VsZWN0b3IsIG9mZnNldCApOwotCQlkcHJpbnRmX2ZpeHVwKHN0ZGRlYiwiICAgICUwNHg6JTA0eDolMDR4IFBPSU5URVIzMiVzXG4iLAorCQlkcHJpbnRmX2luZm8oZml4dXAsIiAgICAlMDR4OiUwNHg6JTA0eCBQT0lOVEVSMzIlc1xuIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBTZWctPnNlbGVjdG9yLCBvZmZzZXQsICpzcCwgYWRkaXRpdmUgPyAiIGFkZGl0aXZlIiA6ICIiICk7CiAJCW9mZnNldCA9ICpzcDsKIAkJKnNwICAgID0gTE9XT1JEKGFkZHJlc3MpOwpAQCAtMzI2LDcgKzMyMSw3IEBACiAJICBjYXNlIE5FX1JBRERSX1NFTEVDVE9SOgogCSAgICBkbyB7CiAgICAgICAgICAgICAgICAgc3AgPSBQVFJfU0VHX09GRl9UT19MSU4oIHBTZWctPnNlbGVjdG9yLCBvZmZzZXQgKTsKLQkJZHByaW50Zl9maXh1cChzdGRkZWIsIiAgICAlMDR4OiUwNHg6JTA0eCBTRUxFQ1RPUiVzXG4iLAorCQlkcHJpbnRmX2luZm8oZml4dXAsIiAgICAlMDR4OiUwNHg6JTA0eCBTRUxFQ1RPUiVzXG4iLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcFNlZy0+c2VsZWN0b3IsIG9mZnNldCwgKnNwLCBhZGRpdGl2ZSA/ICIgYWRkaXRpdmUiIDogIiIgKTsKIAkJb2Zmc2V0ID0gKnNwOwogCQkqc3AgICAgPSBISVdPUkQoYWRkcmVzcyk7CkBAIC0zMzksMTIgKzMzNCwxMCBAQAogCSAgICBicmVhazsKIAkgICAgCiAJICBkZWZhdWx0OgotCSAgICBkcHJpbnRmX2ZpeHVwKHN0ZGRlYiwKLQkJICAgIldBUk5JTkc6ICVkOiB1bmtub3duIEFERFIgVFlQRSAlZCwgIFRZUEUgJWQsICBPRkZTRVQgJTA0eCwgICIsCisJICAgIGRwcmludGZfd2FybihmaXh1cCwgIldBUk5JTkc6ICVkOiB1bmtub3duIEFERFIgVFlQRSAlZCwgICIKKwkJCSAgIlRZUEUgJWQsICBPRkZTRVQgJTA0eCwgIFRBUkdFVCAlMDR4ICUwNHhcbiIsCiAJCSAgIGkgKyAxLCByZXAtPmFkZHJlc3NfdHlwZSwgcmVwLT5yZWxvY2F0aW9uX3R5cGUsIAotCQkgICByZXAtPm9mZnNldCk7Ci0JICAgIGRwcmludGZfZml4dXAoc3RkZGViLAotCQkgICAiVEFSR0VUICUwNHggJTA0eFxuIiwgcmVwLT50YXJnZXQxLCByZXAtPnRhcmdldDIpOworCQkgICByZXAtPm9mZnNldCwgcmVwLT50YXJnZXQxLCByZXAtPnRhcmdldDIpOwogCSAgICBmcmVlKHJlbG9jX2VudHJpZXMpOwogCSAgICByZXR1cm4gRkFMU0U7CiAJfQpAQCAtMzc0LDcgKzM2Nyw3IEBACiAgICAgICAgIERXT1JEIG9sZHN0YWNrOwogICAgICAgICBXT1JEIHNhdmVkX2Rncm91cCA9IHBTZWdUYWJsZVtwTW9kdWxlLT5kZ3JvdXAgLSAxXS5zZWxlY3RvcjsKIAotICAgICAgICBkcHJpbnRmX21vZHVsZShzdGRkZWIsICJNT0RVTEVfTG9hZDogJS4qcyBpcyBhIHNlbGYtbG9hZGluZyBtb2R1bGUhXG4iLAorICAgICAgICBkcHJpbnRmX2luZm8obW9kdWxlLCAiTkVfTG9hZEFsbFNlZ21lbnRzOiAlLipzIGlzIGEgc2VsZi1sb2FkaW5nIG1vZHVsZSFcbiIsCiAgICAgICAgICAgICAgICAgICAgICAgICooKEJZVEUqKXBNb2R1bGUgKyBwTW9kdWxlLT5uYW1lX3RhYmxlKSwKICAgICAgICAgICAgICAgICAgICAgICAgKGNoYXIgKilwTW9kdWxlICsgcE1vZHVsZS0+bmFtZV90YWJsZSArIDEpOwogICAgICAgICBpZiAoIU5FX0xvYWRTZWdtZW50KCBwTW9kdWxlLCAxICkpIHJldHVybiBGQUxTRTsKQEAgLTQzMSw3ICs0MjQsNyBAQAogICAgICAgICBCWVRFICpwc3RyID0gKEJZVEUgKilwTW9kdWxlICsgcE1vZHVsZS0+aW1wb3J0X3RhYmxlICsgKnBNb2RSZWY7CiAgICAgICAgIG1lbWNweSggYnVmZmVyLCBwc3RyICsgMSwgKnBzdHIgKTsKICAgICAgICAgc3RyY3B5KCBidWZmZXIgKyAqcHN0ciwgIi5kbGwiICk7Ci0gICAgICAgIGRwcmludGZfbW9kdWxlKCBzdGRkZWIsICJMb2FkaW5nICclcydcbiIsIGJ1ZmZlciApOworICAgICAgICBkcHJpbnRmX2luZm8obW9kdWxlLCAiTG9hZGluZyAnJXMnXG4iLCBidWZmZXIgKTsKICAgICAgICAgaWYgKCEoKnBNb2RSZWYgPSBNT0RVTEVfRmluZE1vZHVsZSggYnVmZmVyICkpKQogICAgICAgICB7CiAgICAgICAgICAgICAvKiBJZiB0aGUgRExMIGlzIG5vdCBsb2FkZWQgeWV0LCBsb2FkIGl0IGFuZCBzdG9yZSAqLwpAQCAtNDgzLDEyICs0NzYsMTMgQEAKICAgICBXT1JEIGRncm91cCA9IDA7CiAgICAgV09SRCBzZWw7CiAgICAgQllURSAqcCwgKmZpeHVwX3B0ciwgY291bnQ7CisgICAgZGJnX2RlY2xfc3RyKG1vZHVsZSwgNTEyKTsKIAogICAgIHBTZWdUYWJsZSA9IE5FX1NFR19UQUJMRShwTW9kdWxlKTsKICAgICBpZiAocE1vZHVsZS0+ZmxhZ3MgJiBORV9GRkxBR1NfU0lOR0xFREFUQSkKICAgICAgICAgZGdyb3VwID0gcFNlZ1RhYmxlW3BNb2R1bGUtPmRncm91cC0xXS5zZWxlY3RvcjsKIAotICAgIGRwcmludGZfbW9kdWxlKCBzdGRkZWIsICJNT0RVTEVfRml4dXBQcm9sb2dzKCUwNHgpXG4iLCBwTW9kdWxlLT5zZWxmICk7CisgICAgZHByaW50Zl9pbmZvKG1vZHVsZSwgIk1PRFVMRV9GaXh1cFByb2xvZ3MoJTA0eClcbiIsIHBNb2R1bGUtPnNlbGYgKTsKICAgICBwID0gKEJZVEUgKilwTW9kdWxlICsgcE1vZHVsZS0+ZW50cnlfdGFibGU7CiAgICAgd2hpbGUgKCpwKQogICAgIHsKQEAgLTUwOSwyMSArNTAzLDIzIEBACiAgICAgICAgIHAgKz0gMjsKICAgICAgICAgd2hpbGUgKGNvdW50LS0gPiAwKQogICAgICAgICB7Ci0gICAgICAgICAgICBkcHJpbnRmX21vZHVsZSggc3RkZGViLCJGbGFnczogJTA0eCwgc2VsICUwMnggIiwgKnAsIHNlbCk7CisJICAgIGRiZ19yZXNldF9zdHIobW9kdWxlKTsKKyAgICAgICAgICAgIGRzcHJpbnRmKG1vZHVsZSwiRmxhZ3M6ICUwNHgsIHNlbCAlMDJ4ICIsICpwLCBzZWwpOwogICAgICAgICAgICAgLyogQWNjb3JkaW5nIHRvIHRoZSBvdXRwdXQgZ2VuZXJhdGVkIGJ5IFREVU1QLCB0aGUgZmxhZ3MgbWVhbjoKICAgICAgICAgICAgICAqIDB4MDAwMSBmdW5jdGlvbiBpcyBleHBvcnRlZAogCSAgICAgKiAweDAwMDIgU2luZ2xlIGRhdGEgKHNlZW1zIHRvIG9jY3VyIG9ubHkgaW4gRExMcykKIAkgICAgICovCiAJICAgIGlmIChzZWwgPT0gMHhmZikgeyAvKiBtb3ZlYWJsZSAqLwotCQlkcHJpbnRmX21vZHVsZSggc3RkZGViLCAiKCUwMngpIG8gJTA0eCAiLCBwWzNdLCAqKFdPUkQgKikocCs0KSApOworCQlkc3ByaW50Zihtb2R1bGUsICIoJTAyeCkgbyAlMDR4IiwgcFszXSwgKihXT1JEICopKHArNCkgKTsKIAkJZml4dXBfcHRyID0gKGNoYXIgKilHRVRfU0VMX0JBU0UocFNlZ1RhYmxlW3BbM10tMV0uc2VsZWN0b3IpICsgKihXT1JEICopKHAgKyA0KTsKIAkgICAgfSBlbHNlIHsgLyogZml4ZWQgKi8KLQkJZHByaW50Zl9tb2R1bGUoIHN0ZGRlYiwgIm9mZnNldCAlMDR4ICIsICooV09SRCAqKShwKzEpICk7Ci0JCWZpeHVwX3B0ciA9IChjaGFyICopR0VUX1NFTF9CQVNFKHBTZWdUYWJsZVtzZWwtMV0uc2VsZWN0b3IpICsgKihXT1JEICopKHAgKyAxKTsKKwkJZHNwcmludGYobW9kdWxlLCAib2Zmc2V0ICUwNHgiLCAqKFdPUkQgKikocCsxKSApOworCQlmaXh1cF9wdHIgPSAoY2hhciAqKUdFVF9TRUxfQkFTRShwU2VnVGFibGVbc2VsLTFdLnNlbGVjdG9yKSArIAorCQkgICooV09SRCAqKShwICsgMSk7CiAJICAgIH0KLQkgICAgZHByaW50Zl9tb2R1bGUoIHN0ZGRlYiwgIlNpZ25hdHVyZTogJTAyeCAlMDJ4ICUwMngsZmYgJXhcbiIsCi0JCQkgICBmaXh1cF9wdHJbMF0sIGZpeHVwX3B0clsxXSwgZml4dXBfcHRyWzJdLAotCQkJICAgcE1vZHVsZS0+ZmxhZ3MgKTsKKwkgICAgZHByaW50Zl9pbmZvKG1vZHVsZSwgIiVzIFNpZ25hdHVyZTogJTAyeCAlMDJ4ICUwMngsZmYgJXhcbiIsCisJCQkgICAgZGJnX3N0cihtb2R1bGUpLCBmaXh1cF9wdHJbMF0sIGZpeHVwX3B0clsxXSwgCisJCQkgICAgZml4dXBfcHRyWzJdLCBwTW9kdWxlLT5mbGFncyApOwogICAgICAgICAgICAgaWYgKCpwICYgMHgwMDAxKQogICAgICAgICAgICAgewogICAgICAgICAgICAgICAgIC8qIFZlcmlmeSB0aGUgc2lnbmF0dXJlICovCkBAIC01NTMsMTEgKzU0OSwxMSBAQAogCQkJfQogICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgfSBlbHNlIHsKLQkJICAgIGRwcmludGZfZml4dXAoIHN0ZGRlYiwgIlVua25vd24gc2lnbmF0dXJlXG4iICk7CisJCSAgICBkcHJpbnRmX3dhcm4oZml4dXAsICJVbmtub3duIHNpZ25hdHVyZVxuIiApOwogCQl9CiAgICAgICAgICAgICB9CiAJICAgIGVsc2UKLQkgICAgICBkcHJpbnRmX21vZHVsZSggc3RkZGViLCJcbiIpOworCSAgICAgIGRwcmludGZfaW5mbyhtb2R1bGUsIlxuIik7CiAgICAgICAgICAgICBwICs9IChzZWwgPT0gMHhmZikgPyA2IDogMzsgIAogICAgICAgICB9CiAgICAgfQpAQCAtNjE4LDggKzYxNCwxNyBAQAogICAgIH0KICAgICBlbHNlICAvKiBEQVRBIFNJTkdMRSBETEwgKi8KICAgICB7Ci0gICAgICAgIERTX3JlZygmY29udGV4dCkgID0gcFNlZ1RhYmxlW3BNb2R1bGUtPmRncm91cC0xXS5zZWxlY3RvcjsKLSAgICAgICAgRUNYX3JlZygmY29udGV4dCkgPSBwTW9kdWxlLT5oZWFwX3NpemU7CisJaWYgKHBNb2R1bGUtPmRncm91cCkgeworICAgICAgICAgICAgRFNfcmVnKCZjb250ZXh0KSAgPSBwU2VnVGFibGVbcE1vZHVsZS0+ZGdyb3VwLTFdLnNlbGVjdG9yOworICAgICAgICAgICAgRUNYX3JlZygmY29udGV4dCkgPSBwTW9kdWxlLT5oZWFwX3NpemU7CisJfQorCWVsc2UgLyogaG1tLCBETEwgaGFzIG5vIGRncm91cCwKKwkJYnV0IHdoeSBoYXMgaXQgTkVfRkZMQUdTX1NJTkdMRURBVEEgc2V0ID8KKwkJQnVnZ3kgRExMIGNvbXBpbGVyID8gKi8KKwl7CisgICAgICAgICAgICBEU19yZWcoJmNvbnRleHQpICA9IDA7CisgICAgICAgICAgICBFQ1hfcmVnKCZjb250ZXh0KSA9IDA7CisJfQogICAgIH0KIAogICAgIENTX3JlZygmY29udGV4dCkgID0gcFNlZ1RhYmxlW3BNb2R1bGUtPmNzLTFdLnNlbGVjdG9yOwpAQCAtNjMwLDcgKzYzNSw3IEBACiAKIAogICAgIHBNb2R1bGUtPmNzID0gMDsgIC8qIERvbid0IGluaXRpYWxpemUgaXQgdHdpY2UgKi8KLSAgICBkcHJpbnRmX2RsbCggc3RkZGViLCAiQ2FsbGluZyBMaWJNYWluLCBjczppcD0lMDRseDolMDR4IGRzPSUwNGx4IGRpPSUwNHggY3g9JTA0eFxuIiwgCisgICAgZHByaW50Zl9pbmZvKGRsbCwgIkNhbGxpbmcgTGliTWFpbiwgY3M6aXA9JTA0bHg6JTA0eCBkcz0lMDRseCBkaT0lMDR4IGN4PSUwNHhcbiIsIAogICAgICAgICAgICAgICAgICBDU19yZWcoJmNvbnRleHQpLCBJUF9yZWcoJmNvbnRleHQpLCBEU19yZWcoJmNvbnRleHQpLAogICAgICAgICAgICAgICAgICBESV9yZWcoJmNvbnRleHQpLCBDWF9yZWcoJmNvbnRleHQpICk7CiAgICAgQ2FsbGJhY2tzLT5DYWxsUmVnaXN0ZXJTaG9ydFByb2MoICZjb250ZXh0LCAwICk7CmRpZmYgLS1naXQgYS9sb2FkZXIvbmVfcmVzb3VyY2UuYyBiL2xvYWRlci9uZV9yZXNvdXJjZS5jCmluZGV4IDBlMzQwYmQuLmIwOTE0MTEgMTAwNjQ0Ci0tLSBhL2xvYWRlci9uZV9yZXNvdXJjZS5jCisrKyBiL2xvYWRlci9uZV9yZXNvdXJjZS5jCkBAIC0xOCw3ICsxOCw2IEBACiAjaW5jbHVkZSAibW9kdWxlLmgiCiAjaW5jbHVkZSAibmVleGUuaCIKICNpbmNsdWRlICJyZXNvdXJjZS5oIgotI2luY2x1ZGUgInN0ZGRlYnVnLmgiCiAjaW5jbHVkZSAiZGVidWcuaCIKIAogI2RlZmluZSAgTkVYVF9UWVBFSU5GTyhwVHlwZUluZm8pICgoTkVfVFlQRUlORk8gKikoKGNoYXIqKSgocFR5cGVJbmZvKSArIDEpICsgXApAQCAtNDcsMTMgKzQ2LDEzIEBACiAJcE5hbWVJbmZvID0gKE5FX05BTUVJTkZPICopKHBUeXBlSW5mbyArIDEpOwogCWZvciAoY291bnQgPSBwVHlwZUluZm8tPmNvdW50OyBjb3VudCA+IDA7IGNvdW50LS0sIHBOYW1lSW5mbysrKQogCXsKLSAgICAgICAgICAgIGRwcmludGZfcmVzb3VyY2UoIHN0ZGRlYiwgIk5hbWVUYWJsZSBlbnRyeTogdHlwZT0lMDR4IGlkPSUwNHhcbiIsCisgICAgICAgICAgICBkcHJpbnRmX2luZm8ocmVzb3VyY2UsICJOYW1lVGFibGUgZW50cnk6IHR5cGU9JTA0eCBpZD0lMDR4XG4iLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcFR5cGVJbmZvLT50eXBlX2lkLCBwTmFtZUluZm8tPmlkICk7CiAgICAgICAgICAgICBoYW5kbGUgPSBMb2FkUmVzb3VyY2UxNiggcE1vZHVsZS0+c2VsZiwgCiAJCQkJICAgKEhSU1JDMTYpKChpbnQpcE5hbWVJbmZvIC0gKGludClwTW9kdWxlKSApOwogICAgICAgICAgICAgZm9yKHAgPSAoV09SRCopTG9ja1Jlc291cmNlMTYoaGFuZGxlKTsgcCAmJiAqcDsgcCA9IChXT1JEICopKChjaGFyKilwKypwKSkKICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBkcHJpbnRmX3Jlc291cmNlKCBzdGRkZWIsIiAgdHlwZT0lMDR4ICclcycgaWQ9JTA0eCAnJXMnXG4iLAorICAgICAgICAgICAgICAgIGRwcmludGZfaW5mbyhyZXNvdXJjZSwiICB0eXBlPSUwNHggJyVzJyBpZD0lMDR4ICclcydcbiIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcFsxXSwgKGNoYXIgKikocCszKSwgcFsyXSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoY2hhciAqKShwKzMpK3N0cmxlbigoY2hhciAqKShwKzMpKSsxICk7CiAgICAgICAgICAgICAgICAgLyogQ2hlY2sgZm9yIGNvcnJlY3QgdHlwZSAqLwpAQCAtODEsNyArODAsNyBAQAogCiAgICAgICAgICAgICAgICAgLyogSWYgd2UgZ2V0IGhlcmUsIHdlJ3ZlIGZvdW5kIHRoZSBlbnRyeSAqLwogCi0gICAgICAgICAgICAgICAgZHByaW50Zl9yZXNvdXJjZSggc3RkZGViLCAiICBGb3VuZCFcbiIgKTsKKyAgICAgICAgICAgICAgICBkcHJpbnRmX2luZm8ocmVzb3VyY2UsICIgIEZvdW5kIVxuIiApOwogICAgICAgICAgICAgICAgIHJldCA9IE1BS0VMT05HKCBwWzFdLCBwWzJdICk7CiAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICB9CkBAIC0xMTMsMTEgKzExMiwxMSBAQAogCQlCWVRFICpwID0gKEJZVEUqKXBNb2R1bGUgKyBwTW9kdWxlLT5yZXNfdGFibGUgKyBwVHlwZUluZm8tPnR5cGVfaWQ7CiAJCWlmICgoKnAgPT0gbGVuKSAmJiAhbHN0cm5jbXBpMzJBKCBwKzEsIHN0ciwgbGVuICkpCiAJCXsKLQkJICAgIGRwcmludGZfcmVzb3VyY2UoIHN0ZGRlYiwgIiAgRm91bmQgdHlwZSAnJXMnXG4iLCBzdHIgKTsKKwkJICAgIGRwcmludGZfaW5mbyhyZXNvdXJjZSwgIiAgRm91bmQgdHlwZSAnJXMnXG4iLCBzdHIgKTsKIAkJICAgIHJldHVybiBwVHlwZUluZm87CiAJCX0KIAkgICAgfQotCSAgICBkcHJpbnRmX3Jlc291cmNlKCBzdGRkZWIsICIgIFNraXBwaW5nIHR5cGUgJTA0eFxuIiwgcFR5cGVJbmZvLT50eXBlX2lkICk7CisJICAgIGRwcmludGZfaW5mbyhyZXNvdXJjZSwgIiAgU2tpcHBpbmcgdHlwZSAlMDR4XG4iLCBwVHlwZUluZm8tPnR5cGVfaWQgKTsKIAkgICAgcFR5cGVJbmZvID0gTkVYVF9UWVBFSU5GTyhwVHlwZUluZm8pOwogCX0KICAgICB9CkBAIC0xMjgsMTAgKzEyNywxMCBAQAogCXsKICAgICAgICAgICAgIGlmIChwVHlwZUluZm8tPnR5cGVfaWQgPT0gaWQpCiAJICAgIHsKLQkJZHByaW50Zl9yZXNvdXJjZSggc3RkZGViLCAiICBGb3VuZCB0eXBlICUwNHhcbiIsIGlkICk7CisJCWRwcmludGZfaW5mbyhyZXNvdXJjZSwgIiAgRm91bmQgdHlwZSAlMDR4XG4iLCBpZCApOwogCQlyZXR1cm4gcFR5cGVJbmZvOwogCSAgICB9Ci0JICAgIGRwcmludGZfcmVzb3VyY2UoIHN0ZGRlYiwgIiAgU2tpcHBpbmcgdHlwZSAlMDR4XG4iLCBwVHlwZUluZm8tPnR5cGVfaWQgKTsKKwkgICAgZHByaW50Zl9pbmZvKHJlc291cmNlLCAiICBTa2lwcGluZyB0eXBlICUwNHhcbiIsIHBUeXBlSW5mby0+dHlwZV9pZCApOwogCSAgICBwVHlwZUluZm8gPSBORVhUX1RZUEVJTkZPKHBUeXBlSW5mbyk7CiAJfQogICAgIH0KQEAgLTE4OSw3ICsxODgsNyBAQAogCVdPUkQgc2l6ZVNoaWZ0ID0gKihXT1JEICopKChjaGFyICopcE1vZHVsZSArIHBNb2R1bGUtPnJlc190YWJsZSk7CiAJTkVfTkFNRUlORk8qIHBOYW1lSW5mbyA9IChORV9OQU1FSU5GTyopKChjaGFyKilwTW9kdWxlICsgaFJzcmMpOwogCi0gICAgICAgIGRwcmludGZfcmVzb3VyY2UoIHN0ZGRlYiwgIk5FUmVzb3VyY2VIYW5kbGVyOiBsb2FkaW5nLCBwb3M9JWQsIGxlbj0lZFxuIiwKKyAgICAgICAgZHByaW50Zl9pbmZvKHJlc291cmNlLCAiTkVSZXNvdXJjZUhhbmRsZXI6IGxvYWRpbmcsIHBvcz0lZCwgbGVuPSVkXG4iLAogICAgICAgICAgICAgICAgICAgICAgICAgIChpbnQpcE5hbWVJbmZvLT5vZmZzZXQgPDwgc2l6ZVNoaWZ0LAogICAgICAgICAgICAgICAgICAgICAgICAgIChpbnQpcE5hbWVJbmZvLT5sZW5ndGggPDwgc2l6ZVNoaWZ0ICk7CiAJaWYoIGhNZW1PYmogKQpAQCAtMjE3LDcgKzIxNiw3IEBACiAgICAgTkVfTU9EVUxFICpwTW9kdWxlID0gTU9EVUxFX0dldFB0ciggaE1vZHVsZSApOwogICAgIE5FX1RZUEVJTkZPICpwVHlwZUluZm8gPSAoTkVfVFlQRUlORk8gKikoKGNoYXIgKilwTW9kdWxlICsgcE1vZHVsZS0+cmVzX3RhYmxlICsgMik7CiAKLSAgICBkcHJpbnRmX3Jlc291cmNlKHN0ZGRlYiwiSW5pdFJlc291cmNlSGFuZGxlclslMDR4XVxuIiwgaE1vZHVsZSApOworICAgIGRwcmludGZfaW5mbyhyZXNvdXJjZSwiSW5pdFJlc291cmNlSGFuZGxlclslMDR4XVxuIiwgaE1vZHVsZSApOwogCiAgICAgd2hpbGUocFR5cGVJbmZvLT50eXBlX2lkKQogICAgIHsKQEAgLTI4MCwxNSArMjc5LDE1IEBACiAJICAgIGhSc3JjID0gTkVfRmluZFJlc291cmNlRnJvbVR5cGUocE1vZHVsZSwgcFR5cGVJbmZvLCByZXNJZCk7CiAJICAgIGlmKCBoUnNyYyApCiAJICAgIHsKLQkJZHByaW50Zl9yZXNvdXJjZSggc3RkZGViLCAiICAgIEZvdW5kIGlkICUwOGx4XG4iLCByZXNJZCApOworCQlkcHJpbnRmX2luZm8ocmVzb3VyY2UsICIgICAgRm91bmQgaWQgJTA4bHhcbiIsIHJlc0lkICk7CiAJCXJldHVybiBoUnNyYzsKIAkgICAgfQotCSAgICBkcHJpbnRmX3Jlc291cmNlKCBzdGRkZWIsICIgICAgTm90IGZvdW5kLCBnb2luZyBvblxuIiApOworCSAgICBkcHJpbnRmX2luZm8ocmVzb3VyY2UsICIgICAgTm90IGZvdW5kLCBnb2luZyBvblxuIiApOwogCSAgICBwVHlwZUluZm8gPSBORVhUX1RZUEVJTkZPKHBUeXBlSW5mbyk7CiAJfQogICAgIH0gd2hpbGUoIHBUeXBlSW5mbyApOwogCi0gICAgZHByaW50Zl9yZXNvdXJjZSggc3RkZGViLCAiZmFpbGVkIVxuIik7CisgICAgZHByaW50Zl93YXJuKHJlc291cmNlLCAiZmFpbGVkIVxuIik7CiAgICAgcmV0dXJuIDA7CiB9CiAKQEAgLTM4OSw3ICszODgsNyBAQAogCSAgICAmJiAhKEdsb2JhbEZsYWdzMTYocE5hbWVJbmZvLT5oYW5kbGUpICYgR01FTV9ESVNDQVJERUQpKQogCXsKIAkgICAgcE5hbWVJbmZvLT51c2FnZSsrOwotCSAgICBkcHJpbnRmX3Jlc291cmNlKCBzdGRkZWIsICIgIEFscmVhZHkgbG9hZGVkLCBuZXcgY291bnQ9JWRcbiIsCisJICAgIGRwcmludGZfaW5mbyhyZXNvdXJjZSwgIiAgQWxyZWFkeSBsb2FkZWQsIG5ldyBjb3VudD0lZFxuIiwKIAkJCSAgICAgIHBOYW1lSW5mby0+dXNhZ2UgKTsKIAl9CiAJZWxzZQpAQCAtNDYwLDcgKzQ1OSw3IEBACiAgICAgICAgIHBUeXBlSW5mbyA9IChORV9UWVBFSU5GTyAqKXBOYW1lSW5mbzsKICAgICB9CiAKLSAgICBkcHJpbnRmX3Jlc291cmNlKHN0ZGRlYiwgIk5FX0ZyZWVSZXNvdXJjZVslMDR4XTogbm8gaW50cmluc2ljIHJlc291cmNlIGZvciAlMDR4XG4iLCAKKyAgICBkcHJpbnRmX2luZm8ocmVzb3VyY2UsICJORV9GcmVlUmVzb3VyY2VbJTA0eF06IG5vIGludHJpbnNpYyByZXNvdXJjZSBmb3IgJTA0eFxuIiwgCiAJCQkgICAgICBoTW9kdWxlLCBoYW5kbGUgKTsKICAgICBHbG9iYWxGcmVlMTYoIGhhbmRsZSApOyAvKiBpdCBjb3VsZCBoYXZlIGJlZW4gRGlyZWN0UmVzQWxsb2MoKSdlZCAqLwogICAgIHJldHVybiBoYW5kbGU7CmRpZmYgLS1naXQgYS9sb2FkZXIvcGVfaW1hZ2UuYyBiL2xvYWRlci9wZV9pbWFnZS5jCmluZGV4IDk2YTliMTUuLjg0MmM3ZjcgMTAwNjQ0Ci0tLSBhL2xvYWRlci9wZV9pbWFnZS5jCisrKyBiL2xvYWRlci9wZV9pbWFnZS5jCkBAIC0xLDcgKzEsNyBAQAogLyogCiAgKiAgQ29weXJpZ2h0CTE5OTQJRXJpYyBZb3VuZGFsZSAmIEVyaWsgQm9zCiAgKiAgQ29weXJpZ2h0CTE5OTUJTWFydGluIHZvbiBM9ndpcwotICogIENvcHlyaWdodCAgIDE5OTYgICAgTWFyY3VzIE1laXNzbmVyCisgKiAgQ29weXJpZ2h0ICAgMTk5Ni05OCBNYXJjdXMgTWVpc3NuZXIKICAqCiAgKgliYXNlZCBvbiBFcmljIFlvdW5kYWxlJ3MgcGUtdGVzdCBhbmQ6CiAgKgpAQCAtOSw4ICs5LDI2IEBACiAgKiBtYWtlIHRoYXQ6CiAgKglmdHAubWljcm9zb2Z0LmNvbTovZGV2ZWxvcHIvTVNETi9PY3RDRC9QRUZJTEUuWklQCiAgKi8KKy8qIE5vdGVzOgorICogQmVmb3JlIHlvdSBzdGFydCBjaGFuZ2luZyBzb21ldGhpbmcgaW4gdGhpcyBmaWxlIGJlIGF3YXJlIG9mIHRoZSBmb2xsb3dpbmc6CisgKgorICogLSBUaGVyZSBhcmUgc2V2ZXJhbCBmdW5jdGlvbnMgY2FsbGVkIHJlY3Vyc2l2ZWx5LiBJbiBhIHZlcnkgc3VidGxlIGFuZCAKKyAqICAgb2JzY3VyZSB3YXkuIERMTHMgY2FuIHJlZmVyZW5jZSBlYWNoIG90aGVyIHJlY3Vyc2l2ZWx5IGV0Yy4KKyAqIC0gSWYgeW91IHdhbnQgdG8gZW5oYW5jZSwgc3BlZWQgdXAgb3IgY2xlYW4gdXAgc29tZXRoaW5nIGluIGhlcmUsIHRoaW5rCisgKiAgIHR3aWNlIFdIWSBpdCBpcyBpbXBsZW1lbnRlZCBpbiB0aGF0IHN0cmFuZ2Ugd2F5LiBUaGVyZSBpcyB1c3VhbGx5IGEgcmVhc29uLgorICogICBUaG91Z2ggc29tZXRpbWVzIGl0IG1pZ2h0IGp1c3QgYmUgbGF6eW5lc3MgOykKKyAqIC0gSW4gUEVfTWFwSW1hZ2UsIHJpZ2h0IGJlZm9yZSBmaXh1cF9pbXBvcnRzKCkgYWxsIGV4dGVybmFsIGFuZCBpbnRlcm5hbCAKKyAqICAgc3RhdGUgTVVTVCBiZSBjb3JyZWN0IHNpbmNlIHRoaXMgZnVuY3Rpb24gY2FuIGJlIGNhbGxlZCB3aXRoIHRoZSBTQU1FIGltYWdlCisgKiAgIEFHQUlOLiAoVGhhdHMgcmVjdXJzaW9uIGZvciB5b3UuKSBUaGF0IG1lYW5zIE1PRFJFRi5tb2R1bGUgYW5kCisgKiAgIE5FX01PRFVMRS5tb2R1bGUzMi4KKyAqIC0gTm8sIHlvdSBjYW5ub3QgdXNlIExpbnV4IG1tYXAoKSB0byBtbWFwKCkgdGhlIGltYWdlcyBkaXJlY3RseS4gTGludXggYWxpZ25zCisgKiAgIHRoZW0gYXQgcGFnZXNpemUgKDQwOTYpLCBXaW4zMiByZXF1aXJlcyA1MTIgYnl0ZSBhbGlnbm1lbnQuCisgKiAtIEFsbCB0aG9zZSBmdW5jdGlvbiBtYXAgdGhpbmdzIGludG8gYSBuZXcgYWRkcmVzc3BhY2UuIEZyb20gdGhlIHdyb25nCisgKiAgIHByb2Nlc3MgYW5kIHRoZSB3cm9uZyB0aHJlYWQuIFNvIGNhbGxpbmcgb3RoZXIgQVBJIGZ1bmN0aW9ucyB3aWxsIG1lc3MgCisgKiAgIHRoaW5ncyB1cCBiYWRseSBzb21ldGltZXMuCisgKi8KIAotI2luY2x1ZGUgPGN0eXBlLmg+CisvKiNpbmNsdWRlIDxjdHlwZS5oPiovCiAjaW5jbHVkZSA8ZXJybm8uaD4KICNpbmNsdWRlIDxzdGRpby5oPgogI2luY2x1ZGUgPHN0ZGxpYi5oPgpAQCAtMzIsNyArNTAsNiBAQAogI2luY2x1ZGUgImdsb2JhbC5oIgogI2luY2x1ZGUgInRhc2suaCIKICNpbmNsdWRlICJsZHQuaCIKLSNpbmNsdWRlICJzdGRkZWJ1Zy5oIgogI2luY2x1ZGUgImRlYnVnLmgiCiAjaW5jbHVkZSAieG1hbGxvYy5oIgogCkBAIC01Nyw3ICs3NCw3IEBACiAgIElNQUdFX0VYUE9SVF9ESVJFQ1RPUlkgKnBlX2V4cG9ydHMgPSAoSU1BR0VfRVhQT1JUX0RJUkVDVE9SWSopUlZBKHJ2YV9zdGFydCk7CiAKICAgTW9kdWxlID0gKGNoYXIqKVJWQShwZV9leHBvcnRzLT5OYW1lKTsKLSAgZHByaW50Zl93aW4zMihzdGRkZWIsIlxuKioqKioqKkVYUE9SVCBEQVRBKioqKioqKlxuTW9kdWxlIG5hbWUgaXMgJXMsICVsZCBmdW5jdGlvbnMsICVsZCBuYW1lc1xuIiwgCisgIGRwcmludGZfaW5mbyh3aW4zMiwiXG4qKioqKioqRVhQT1JUIERBVEEqKioqKioqXG5Nb2R1bGUgbmFtZSBpcyAlcywgJWxkIGZ1bmN0aW9ucywgJWxkIG5hbWVzXG4iLCAKIAkgTW9kdWxlLAogCSBwZV9leHBvcnRzLT5OdW1iZXJPZkZ1bmN0aW9ucywKIAkgcGVfZXhwb3J0cy0+TnVtYmVyT2ZOYW1lcyk7CkBAIC02NiwxOSArODMsMjMgQEAKICAgZnVuY3Rpb25zPWZ1bmN0aW9uPSh1X2xvbmcqKSBSVkEocGVfZXhwb3J0cy0+QWRkcmVzc09mRnVuY3Rpb25zKTsKICAgbmFtZT0odV9jaGFyKiopIFJWQShwZV9leHBvcnRzLT5BZGRyZXNzT2ZOYW1lcyk7CiAKLSAgZHByaW50Zl93aW4zMihzdGRkZWIsIiBPcmQgICAgUlZBICAgICBBZGRyICAgTmFtZVxuIiApOworICBkcHJpbnRmX2luZm8od2luMzIsIiBPcmQgICAgUlZBICAgICBBZGRyICAgTmFtZVxuIiApOwogICBmb3IgKGk9MDtpPHBlX2V4cG9ydHMtPk51bWJlck9mRnVuY3Rpb25zO2krKywgZnVuY3Rpb24rKykKICAgewogICAgICAgaWYgKCEqZnVuY3Rpb24pIGNvbnRpbnVlOyAgLyogTm8gc3VjaCBmdW5jdGlvbiAqLwotICAgICAgZHByaW50Zl93aW4zMiggc3RkZGViLCIlNGxkICUwOGx4ICUwOHgiLAotICAgICAgICAgICAgICAgICAgICAgaSArIHBlX2V4cG9ydHMtPkJhc2UsICpmdW5jdGlvbiwgUlZBKCpmdW5jdGlvbikgKTsKLSAgICAgIC8qIENoZWNrIGlmIHdlIGhhdmUgYSBuYW1lIGZvciBpdCAqLwotICAgICAgZm9yIChqID0gMDsgaiA8IHBlX2V4cG9ydHMtPk51bWJlck9mTmFtZXM7IGorKykKKyAgICAgIGlmIChkZWJ1Z2dpbmdfaW5mbyh3aW4zMikpeworCWRiZ19kZWNsX3N0cih3aW4zMiwgMTAyNCk7CisKKwlkc3ByaW50Zih3aW4zMiwiJTRsZCAlMDhseCAlMDh4IiwKKwkJIGkgKyBwZV9leHBvcnRzLT5CYXNlLCAqZnVuY3Rpb24sIFJWQSgqZnVuY3Rpb24pICk7CisJLyogQ2hlY2sgaWYgd2UgaGF2ZSBhIG5hbWUgZm9yIGl0ICovCisJZm9yIChqID0gMDsgaiA8IHBlX2V4cG9ydHMtPk51bWJlck9mTmFtZXM7IGorKykKICAgICAgICAgICBpZiAob3JkaW5hbFtqXSA9PSBpKQotICAgICAgICAgICAgICBkcHJpbnRmX3dpbjMyKCBzdGRkZWIsICIgICVzIiwgKGNoYXIqKVJWQShuYW1lW2pdKSApOwotICAgICAgaWYgKCgqZnVuY3Rpb24gPj0gcnZhX3N0YXJ0KSAmJiAoKmZ1bmN0aW9uIDw9IHJ2YV9lbmQpKQotCSAgZHByaW50Zl93aW4zMihzdGRkZWIsICIgKGZvcndhcmRlZCAtPiAlcykiLCAoY2hhciAqKVJWQSgqZnVuY3Rpb24pKTsKLSAgICAgIGRwcmludGZfd2luMzIoIHN0ZGRlYiwiXG4iICk7CisJICAgIGRzcHJpbnRmKHdpbjMyLCAiICAlcyIsIChjaGFyKilSVkEobmFtZVtqXSkgKTsKKwlpZiAoKCpmdW5jdGlvbiA+PSBydmFfc3RhcnQpICYmICgqZnVuY3Rpb24gPD0gcnZhX2VuZCkpCisJICBkc3ByaW50Zih3aW4zMiwgIiAoZm9yd2FyZGVkIC0+ICVzKSIsIChjaGFyICopUlZBKCpmdW5jdGlvbikpOworCWRwcmludGZfaW5mbyh3aW4zMiwiJXNcbiIsIGRiZ19zdHIod2luMzIpKTsKKyAgICAgIH0KICAgfQogfQogCkBAIC0xMTQsOSArMTM1LDkgQEAKIAlleHBvcnRzICAgPSBwZW0tPnBlX2V4cG9ydDsKIAogCWlmIChISVdPUkQoZnVuY05hbWUpKQotCQlkcHJpbnRmX3dpbjMyKHN0ZGRlYiwiUEVfRmluZEV4cG9ydGVkRnVuY3Rpb24oJXMpXG4iLGZ1bmNOYW1lKTsKKwkJZHByaW50Zl9pbmZvKHdpbjMyLCJQRV9GaW5kRXhwb3J0ZWRGdW5jdGlvbiglcylcbiIsZnVuY05hbWUpOwogCWVsc2UKLQkJZHByaW50Zl93aW4zMihzdGRkZWIsIlBFX0ZpbmRFeHBvcnRlZEZ1bmN0aW9uKCVkKVxuIiwoaW50KWZ1bmNOYW1lKTsKKwkJZHByaW50Zl9pbmZvKHdpbjMyLCJQRV9GaW5kRXhwb3J0ZWRGdW5jdGlvbiglZClcbiIsKGludClmdW5jTmFtZSk7CiAJaWYgKCFleHBvcnRzKSB7CiAJCWZwcmludGYoc3RkZXJyLCJNb2R1bGUgJTA4eC9NT0RSRUYgJXAgZG9lc24ndCBoYXZlIGEgZXhwb3J0cyB0YWJsZS5cbiIsaE1vZHVsZSxwZW0pOwogCQlyZXR1cm4gTlVMTDsKQEAgLTEzNiw2ICsxNTcsNyBAQAogCQkJaWYoIXN0cmNtcChlbmFtZSxmdW5jTmFtZSkpCiAgICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWRkciA9IGZ1bmN0aW9uWypvcmRpbmFsXTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIWFkZHIpIHJldHVybiBOVUxMOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICgoYWRkciA8IHJ2YV9zdGFydCkgfHwgKGFkZHIgPj0gcnZhX2VuZCkpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAoRkFSUFJPQzMyKVJWQShhZGRyKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3J3YXJkID0gKGNoYXIgKilSVkEoYWRkcik7CkBAIC0xNDYsMTEgKzE2OCwxMiBAQAogCQl9CiAJfSBlbHNlIHsKIAkJaWYgKExPV09SRChmdW5jTmFtZSktZXhwb3J0cy0+QmFzZSA+IGV4cG9ydHMtPk51bWJlck9mRnVuY3Rpb25zKSB7Ci0JCQlkcHJpbnRmX3dpbjMyKHN0ZGRlYiwiCW9yZGluYWwgJWQgb3V0IG9mIHJhbmdlIVxuIiwKKwkJCWRwcmludGZfaW5mbyh3aW4zMiwiCW9yZGluYWwgJWQgb3V0IG9mIHJhbmdlIVxuIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTE9XT1JEKGZ1bmNOYW1lKSk7CiAJCQlyZXR1cm4gTlVMTDsKIAkJfQogCQlhZGRyID0gZnVuY3Rpb25bKGludClmdW5jTmFtZS1leHBvcnRzLT5CYXNlXTsKKyAgICAgICAgICAgICAgICBpZiAoIWFkZHIpIHJldHVybiBOVUxMOwogCQlpZiAoKGFkZHIgPCBydmFfc3RhcnQpIHx8IChhZGRyID49IHJ2YV9lbmQpKQogCQkJcmV0dXJuIChGQVJQUk9DMzIpUlZBKGFkZHIpOwogCQlmb3J3YXJkID0gKGNoYXIgKilSVkEoYWRkcik7CkBAIC0xODMsNyArMjA2LDcgQEAKICAgICAgICAgbW9kbmFtZSA9ICI8dW5rbm93bj4iOwogCiAgICAgLyogT0ssIG5vdyBkdW1wIHRoZSBpbXBvcnQgbGlzdCAqLwotICAgIGRwcmludGZfd2luMzIgKHN0ZGRlYiwgIlxuRHVtcGluZyBpbXBvcnRzIGxpc3RcbiIpOworICAgIGRwcmludGZfaW5mbyh3aW4zMiwgIlxuRHVtcGluZyBpbXBvcnRzIGxpc3RcbiIpOwogCiAgICAgLyogZmlyc3QsIGNvdW50IHRoZSBudW1iZXIgb2YgaW1wb3J0ZWQgbm9uLWludGVybmFsIG1vZHVsZXMgKi8KICAgICBwZV9pbXAgPSBwZW0tPnBlX2ltcG9ydDsKQEAgLTIzMCwyNyArMjUzLDI0IEBACiAJCXhwZW0gPSB4cGVtLT5uZXh0OwogCX0KIAlpZiAoeHBlbSkgewotCQkvKiBpdCBoYXMgYmVlbiBsb2FkZWQgKkJFRk9SRSogdXMsIHNvIHdlIGhhdmUgdG8gaW5pdAotCQkgKiBpdCBiZWZvcmUgdXMuIHdlIGp1c3Qgc3dhcCB0aGUgdHdvIG1vZHVsZXMgd2hpY2ggc2hvdWxkCi0JCSAqIHdvcmsuCisJCS8qIEl0IGhhcyBiZWVuIGxvYWRlZCAqQkVGT1JFKiB1cywgc28gd2UgaGF2ZSB0byBpbml0aWFsaXplCisJCSAqIGl0IGJlZm9yZSB1cy4gV2UgY2Fubm90IGp1c3QgbGluayBpbiB0aGUgeHBlbSBiZWZvcmUgcGVtLAorCQkgKiBzaW5jZSB4cGVtIG1pZ2h0IHJlZmVyZW5jZSBtb3JlIGRsbHMgd2hpY2ggd291bGQgYmUgaW4gdGhlCisJCSAqIHdyb25nIG9yZGVyIGFmdGVyIHRoYXQuCisJCSAqIEluc3RlYWQgd2UgbGluayBpbiBwZW0gcmlnaHQgQUZURVIgeHBlbSwgd2hpY2ggc2hvdWxkIGtlZXAKKwkJICogdGhlIGNvcnJlY3Qgb3JkZXIuIChJIGFtIG5vdCAxMDAlIHN1cmUgYWJvdXQgdGhhdC4pCiAJCSAqLwotCQkvKiB1bmxpbmsgeHBlbSBmcm9tIGNoYWluICovCisJCS8qIHVubGluayBwZW0gZnJvbSBjaGFpbiAqLwogCQl5cGVtID0gJihwcm9jZXNzLT5tb2RyZWZfbGlzdCk7CiAJCXdoaWxlICgqeXBlbSkgewotCQkJaWYgKCgqeXBlbSk9PXhwZW0pCi0JCQkJYnJlYWs7Ci0JCQl5cGVtID0gJigoKnlwZW0pLT5uZXh0KTsKLQkJfQotCQkqeXBlbQkJPSB4cGVtLT5uZXh0OwotCi0JCS8qIGxpbmsgaXQgZGlyZWN0bHkgYmVmb3JlIHBlbSAqLwotCQl5cGVtCQk9ICYocHJvY2Vzcy0+bW9kcmVmX2xpc3QpOwotCQl3aGlsZSAoKnlwZW0pIHsKIAkJCWlmICgoKnlwZW0pPT1wZW0pCiAJCQkJYnJlYWs7CiAJCQl5cGVtID0gJigoKnlwZW0pLT5uZXh0KTsKIAkJfQotCQkqeXBlbQkJPSB4cGVtOworCQkqeXBlbQkJPSBwZW0tPm5leHQ7CisKKwkJLyogbGluayBwZW0gZGlyZWN0bHkgQUZURVIgeHBlbSAqLworCQlwZW0tPm5leHQJPSB4cGVtLT5uZXh0OwogCQl4cGVtLT5uZXh0CT0gcGVtOwogCQkKIAl9CkBAIC0yNjUsMTIgKzI4NSwxMiBAQAogCiAJTW9kdWxlID0gKGNoYXIgKikgUlZBKHBlX2ltcC0+TmFtZSk7CiAgICAgICAgIGhJbXBNb2R1bGUgPSBNT0RVTEVfSEFORExFdG9ITU9EVUxFMzIoIE1PRFVMRV9GaW5kTW9kdWxlKE1vZHVsZSkgKTsKLQlkcHJpbnRmX3dpbjMyIChzdGRkZWIsICIlc1xuIiwgTW9kdWxlKTsKKwlkcHJpbnRmX2luZm8od2luMzIsICIlc1xuIiwgTW9kdWxlKTsKIAogCS8qIEZJWE1FOiBmb3J3YXJkZXIgZW50cmllcyAuLi4gKi8KIAogCWlmIChwZV9pbXAtPnUuT3JpZ2luYWxGaXJzdFRodW5rICE9IDApIHsgLyogb3JpZ2luYWwgTVMgc3R5bGUgKi8KLQkgICAgZHByaW50Zl93aW4zMiAoc3RkZGViLCAiTWljcm9zb2Z0IHN0eWxlIGltcG9ydHMgdXNlZFxuIik7CisJICAgIGRwcmludGZfaW5mbyh3aW4zMiwgIk1pY3Jvc29mdCBzdHlsZSBpbXBvcnRzIHVzZWRcbiIpOwogCSAgICBpbXBvcnRfbGlzdCA9KExQSU1BR0VfVEhVTktfREFUQSkgUlZBKHBlX2ltcC0+dS5PcmlnaW5hbEZpcnN0VGh1bmspOwogCSAgICB0aHVua19saXN0ID0gKExQSU1BR0VfVEhVTktfREFUQSkgUlZBKHBlX2ltcC0+Rmlyc3RUaHVuayk7CiAKQEAgLTI3OCw3ICsyOTgsNyBAQAogCQlpZiAoSU1BR0VfU05BUF9CWV9PUkRJTkFMKGltcG9ydF9saXN0LT51MS5PcmRpbmFsKSkgewogCQkgICAgaW50IG9yZGluYWwgPSBJTUFHRV9PUkRJTkFMKGltcG9ydF9saXN0LT51MS5PcmRpbmFsKTsKIAotCQkgICAgZHByaW50Zl93aW4zMiAoc3RkZGViLCAiLS0tIE9yZGluYWwgJXMsJWRcbiIsIE1vZHVsZSwgb3JkaW5hbCk7CisJCSAgICBkcHJpbnRmX2luZm8od2luMzIsICItLS0gT3JkaW5hbCAlcywlZFxuIiwgTW9kdWxlLCBvcmRpbmFsKTsKIAkJICAgIHRodW5rX2xpc3QtPnUxLkZ1bmN0aW9uPShMUERXT1JEKVBFX0ZpbmRFeHBvcnRlZEZ1bmN0aW9uKAogICAgICAgICAgICAgICAgICAgICAgICAgcHJvY2VzcywgaEltcE1vZHVsZSwgKExQQ1NUUilvcmRpbmFsKTsKIAkJICAgIGlmICghdGh1bmtfbGlzdC0+dTEuRnVuY3Rpb24pIHsKQEAgLTI4OCw3ICszMDgsNyBAQAogCQkgICAgfQogCQl9IGVsc2UgewkJLyogaW1wb3J0IGJ5IG5hbWUgKi8KIAkJICAgIHBlX25hbWUgPSAoTFBJTUFHRV9JTVBPUlRfQllfTkFNRSlSVkEoaW1wb3J0X2xpc3QtPnUxLkFkZHJlc3NPZkRhdGEpOwotCQkgICAgZHByaW50Zl93aW4zMiAoc3RkZGViLCAiLS0tICVzICVzLiVkXG4iLCBwZV9uYW1lLT5OYW1lLCBNb2R1bGUsIHBlX25hbWUtPkhpbnQpOworCQkgICAgZHByaW50Zl9pbmZvKHdpbjMyLCAiLS0tICVzICVzLiVkXG4iLCBwZV9uYW1lLT5OYW1lLCBNb2R1bGUsIHBlX25hbWUtPkhpbnQpOwogCQkgICAgdGh1bmtfbGlzdC0+dTEuRnVuY3Rpb249KExQRFdPUkQpUEVfRmluZEV4cG9ydGVkRnVuY3Rpb24oCiAgICAgICAgICAgICAgICAgICAgICAgICBwcm9jZXNzLCBoSW1wTW9kdWxlLCBwZV9uYW1lLT5OYW1lKTsKIAkJICAgIGlmICghdGh1bmtfbGlzdC0+dTEuRnVuY3Rpb24pIHsKQEAgLTMwMSwxNCArMzIxLDE0IEBACiAJCXRodW5rX2xpc3QrKzsKIAkgICAgfQogCX0gZWxzZSB7CS8qIEJvcmxhbmQgc3R5bGUgKi8KLQkgICAgZHByaW50Zl93aW4zMiAoc3RkZGViLCAiQm9ybGFuZCBzdHlsZSBpbXBvcnRzIHVzZWRcbiIpOworCSAgICBkcHJpbnRmX2luZm8od2luMzIsICJCb3JsYW5kIHN0eWxlIGltcG9ydHMgdXNlZFxuIik7CiAJICAgIHRodW5rX2xpc3QgPSAoTFBJTUFHRV9USFVOS19EQVRBKSBSVkEocGVfaW1wLT5GaXJzdFRodW5rKTsKIAkgICAgd2hpbGUgKHRodW5rX2xpc3QtPnUxLk9yZGluYWwpIHsKIAkJaWYgKElNQUdFX1NOQVBfQllfT1JESU5BTCh0aHVua19saXN0LT51MS5PcmRpbmFsKSkgewogCQkgICAgLyogbm90IHN1cmUgYWJvdXQgdGhpcyBicmFuY2gsIGJ1dCBpdCBzZWVtcyB0byB3b3JrICovCiAJCSAgICBpbnQgb3JkaW5hbCA9IElNQUdFX09SRElOQUwodGh1bmtfbGlzdC0+dTEuT3JkaW5hbCk7CiAKLQkJICAgIGRwcmludGZfd2luMzIoc3RkZGViLCItLS0gT3JkaW5hbCAlcy4lZFxuIixNb2R1bGUsb3JkaW5hbCk7CisJCSAgICBkcHJpbnRmX2luZm8od2luMzIsIi0tLSBPcmRpbmFsICVzLiVkXG4iLE1vZHVsZSxvcmRpbmFsKTsKIAkJICAgIHRodW5rX2xpc3QtPnUxLkZ1bmN0aW9uPShMUERXT1JEKVBFX0ZpbmRFeHBvcnRlZEZ1bmN0aW9uKAogICAgICAgICAgICAgICAgICAgICAgICAgcHJvY2VzcywgaEltcE1vZHVsZSwgKExQQ1NUUikgb3JkaW5hbCk7CiAJCSAgICBpZiAoIXRodW5rX2xpc3QtPnUxLkZ1bmN0aW9uKSB7CkBAIC0zMTgsNyArMzM4LDcgQEAKIAkJICAgIH0KIAkJfSBlbHNlIHsKIAkJICAgIHBlX25hbWU9KExQSU1BR0VfSU1QT1JUX0JZX05BTUUpIFJWQSh0aHVua19saXN0LT51MS5BZGRyZXNzT2ZEYXRhKTsKLQkJICAgIGRwcmludGZfd2luMzIoc3RkZGViLCItLS0gJXMgJXMuJWRcbiIsCisJCSAgICBkcHJpbnRmX2luZm8od2luMzIsIi0tLSAlcyAlcy4lZFxuIiwKIAkJICAgCQkgIHBlX25hbWUtPk5hbWUsTW9kdWxlLHBlX25hbWUtPkhpbnQpOwogCQkgICAgdGh1bmtfbGlzdC0+dTEuRnVuY3Rpb249KExQRFdPUkQpUEVfRmluZEV4cG9ydGVkRnVuY3Rpb24oCiAgICAgICAgICAgICAgICAgICAgICAgICBwcm9jZXNzLCBoSW1wTW9kdWxlLCBwZV9uYW1lLT5OYW1lICk7CkBAIC0zNDIsMTEgKzM2MiwxMSBAQAogICAgIGludCBpLHZtYV9zaXplID0gMDsKICAgICBJTUFHRV9TRUNUSU9OX0hFQURFUiAqcGVfc2VnID0gUEVfU0VDVElPTlMoaE1vZHVsZSk7CiAKLSAgICBkcHJpbnRmX3dpbjMyKHN0ZGRlYiwgIkR1bXAgb2Ygc2VnbWVudCB0YWJsZVxuIik7Ci0gICAgZHByaW50Zl93aW4zMihzdGRkZWIsICIgICBOYW1lICAgIFZTeiAgVmFkZHIgICAgIFN6UmF3ICAgRmlsZWFkciAgKlJlbG9jICpMaW5ldW0gI1JlbG9jICNMaW51bSBDaGFyXG4iKTsKKyAgICBkcHJpbnRmX2luZm8od2luMzIsICJEdW1wIG9mIHNlZ21lbnQgdGFibGVcbiIpOworICAgIGRwcmludGZfaW5mbyh3aW4zMiwgIiAgIE5hbWUgICAgVlN6ICBWYWRkciAgICAgU3pSYXcgICBGaWxlYWRyICAqUmVsb2MgKkxpbmV1bSAjUmVsb2MgI0xpbnVtIENoYXJcbiIpOwogICAgIGZvciAoaSA9IDA7IGk8IFBFX0hFQURFUihoTW9kdWxlKS0+RmlsZUhlYWRlci5OdW1iZXJPZlNlY3Rpb25zOyBpKyspCiAgICAgewotICAgICAgICBkcHJpbnRmX3dpbjMyKHN0ZGRlYiwgIiU4czogJTQuNGx4ICU4LjhseCAlOC44bHggJTguOGx4ICU4LjhseCAlOC44bHggJTQuNHggJTQuNHggJTguOGx4XG4iLCAKKyAgICAgICAgZHByaW50Zl9pbmZvKHdpbjMyLCAiJThzOiAlNC40bHggJTguOGx4ICU4LjhseCAlOC44bHggJTguOGx4ICU4LjhseCAlNC40eCAlNC40eCAlOC44bHhcbiIsIAogICAgICAgICAgICAgICAgICAgICAgIHBlX3NlZy0+TmFtZSwgCiAgICAgICAgICAgICAgICAgICAgICAgcGVfc2VnLT5NaXNjLlZpcnR1YWxTaXplLAogICAgICAgICAgICAgICAgICAgICAgIHBlX3NlZy0+VmlydHVhbEFkZHJlc3MsCkBAIC0zODEsMTQgKzQwMSwxNCBAQAogCQljaGFyICpwYWdlID0gKGNoYXIqKSBSVkEoci0+VmlydHVhbEFkZHJlc3MpOwogCQlpbnQgY291bnQgPSAoci0+U2l6ZU9mQmxvY2sgLSA4KS8yOwogCQlpbnQgaTsKLQkJZHByaW50Zl9maXh1cChzdGRkZWIsICIleCByZWxvY2F0aW9ucyBmb3IgcGFnZSAlbHhcbiIsCisJCWRwcmludGZfaW5mbyhmaXh1cCwgIiV4IHJlbG9jYXRpb25zIGZvciBwYWdlICVseFxuIiwKIAkJCWNvdW50LCByLT5WaXJ0dWFsQWRkcmVzcyk7CiAJCS8qIHBhdGNoaW5nIGluIHJldmVyc2Ugb3JkZXIgKi8KIAkJZm9yKGk9MDtpPGNvdW50O2krKykKIAkJewogCQkJaW50IG9mZnNldCA9IHItPlR5cGVPZmZzZXRbaV0gJiAweEZGRjsKIAkJCWludCB0eXBlID0gci0+VHlwZU9mZnNldFtpXSA+PiAxMjsKLQkJCWRwcmludGZfZml4dXAoc3RkZGViLCJwYXRjaGluZyAleCB0eXBlICV4XG4iLCBvZmZzZXQsIHR5cGUpOworCQkJZHByaW50Zl9pbmZvKGZpeHVwLCJwYXRjaGluZyAleCB0eXBlICV4XG4iLCBvZmZzZXQsIHR5cGUpOwogCQkJc3dpdGNoKHR5cGUpCiAJCQl7CiAJCQljYXNlIElNQUdFX1JFTF9CQVNFRF9BQlNPTFVURTogYnJlYWs7CkBAIC00OTUsOCArNTE1LDggQEAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgKiBUaGlzIG1hcHMgYSBsb2FkZWQgUEUgZGxsIGludG8gdGhlIGFkZHJlc3Mgc3BhY2Ugb2YgdGhlIHNwZWNpZmllZCBwcm9jZXNzLgogICovCi1zdGF0aWMgSE1PRFVMRTMyIFBFX01hcEltYWdlKCBITU9EVUxFMzIgaE1vZHVsZSwgUERCMzIgKnByb2Nlc3MsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPRlNUUlVDVCAqb2ZzLCBEV09SRCBmbGFncyApCitzdGF0aWMgQk9PTDMyIFBFX01hcEltYWdlKCBITU9EVUxFMzIgKnBoTW9kdWxlLCBQREIzMiAqcHJvY2VzcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIE9GU1RSVUNUICpvZnMsIERXT1JEIGZsYWdzICkKIHsKIAlQRV9NT0RSRUYJCSpwZW07CiAJaW50CQkJaSwgcmVzdWx0OwpAQCAtNTA0LDYgKzUyNCw3IEBACiAJSU1BR0VfREFUQV9ESVJFQ1RPUlkJZGlyOwogCWNoYXIJCQkqbW9kbmFtZTsKIAlpbnQJCQl2bWFfc2l6ZTsKKwlITU9EVUxFMzIJCWhNb2R1bGUgPSAqcGhNb2R1bGU7CiAKICAgICAgICAgSU1BR0VfU0VDVElPTl9IRUFERVIgKnBlX3NlZzsKICAgICAgICAgSU1BR0VfRE9TX0hFQURFUiAqZG9zX2hlYWRlciA9IChJTUFHRV9ET1NfSEVBREVSICopaE1vZHVsZTsKQEAgLTUyNCw3ICs1NDUsNyBAQAogCiAJbG9hZF9hZGRyID0gbnRfaGVhZGVyLT5PcHRpb25hbEhlYWRlci5JbWFnZUJhc2U7CiAJdm1hX3NpemUgPSBjYWxjX3ZtYV9zaXplKCBoTW9kdWxlICk7Ci0JZHByaW50Zl93aW4zMihzdGRkZWIsICJMb2FkIGFkZHIgaXMgJWx4XG4iLGxvYWRfYWRkcik7CisJZHByaW50Zl9pbmZvKHdpbjMyLCAiTG9hZCBhZGRyIGlzICVseFxuIixsb2FkX2FkZHIpOwogCWxvYWRfYWRkciA9IChEV09SRClWaXJ0dWFsQWxsb2MoICh2b2lkKilsb2FkX2FkZHIsIHZtYV9zaXplLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNRU1fUkVTRVJWRSB8IE1FTV9DT01NSVQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBBR0VfRVhFQ1VURV9SRUFEV1JJVEUgKTsKQEAgLTUzMyw5ICs1NTQsMTIgQEAKIAkJCQkJCSBNRU1fUkVTRVJWRSB8IE1FTV9DT01NSVQsCiAJCQkJCQkgUEFHRV9FWEVDVVRFX1JFQURXUklURSApOwogCX0KLQlwZW0tPm1vZHVsZSA9IChITU9EVUxFMzIpbG9hZF9hZGRyOworCS8qICpwaE1vZHVsZSBpcyB0aGUgbW9kdWxlMzIgZW50cnkgaW4gdGhlIE5FX01PRFVMRS4gV2UgbmVlZCB0bworCSAqIGNoYW5nZSBpdCBoZXJlLCBzaW5jZSBpdCBjYW4gZ2V0IHJlZmVyZW5jZWQgYnkgZml4dXBfaW1wb3J0cygpCisJICovCisJcGVtLT5tb2R1bGUgPSAqcGhNb2R1bGUgPSAoSE1PRFVMRTMyKWxvYWRfYWRkcjsKIAotCWRwcmludGZfd2luMzIoc3RkZGViLCAiTG9hZCBhZGRyIGlzIHJlYWxseSAlbHgsIHJhbmdlICV4XG4iLAorCWRwcmludGZfaW5mbyh3aW4zMiwgIkxvYWQgYWRkciBpcyByZWFsbHkgJWx4LCByYW5nZSAleFxuIiwKICAgICAgICAgICAgICAgICAgICAgICBsb2FkX2FkZHIsIHZtYV9zaXplKTsKIAkKICAgICAgICAgLyogU3RvcmUgdGhlIE5UIGhlYWRlciBhdCB0aGUgbG9hZCBhZGRyCkBAIC02MTEsMTAgKzYzNSwxMCBAQAogCX0KIAogCWlmKG50X2hlYWRlci0+T3B0aW9uYWxIZWFkZXIuRGF0YURpcmVjdG9yeVtJTUFHRV9ESVJFQ1RPUllfRU5UUllfRVhDRVBUSU9OXS5TaXplKQotCQlkcHJpbnRmX3dpbjMyKHN0ZG5pbXAsIkV4Y2VwdGlvbiBkaXJlY3RvcnkgaWdub3JlZFxuIik7CisJCWRwcmludGZfZml4bWUod2luMzIsIkV4Y2VwdGlvbiBkaXJlY3RvcnkgaWdub3JlZFxuIik7CiAKIAlpZihudF9oZWFkZXItPk9wdGlvbmFsSGVhZGVyLkRhdGFEaXJlY3RvcnlbSU1BR0VfRElSRUNUT1JZX0VOVFJZX1NFQ1VSSVRZXS5TaXplKQotCQlkcHJpbnRmX3dpbjMyKHN0ZG5pbXAsIlNlY3VyaXR5IGRpcmVjdG9yeSBpZ25vcmVkXG4iKTsKKwkJZHByaW50Zl9maXhtZSh3aW4zMiwiU2VjdXJpdHkgZGlyZWN0b3J5IGlnbm9yZWRcbiIpOwogCiAKIApAQCAtNjI4LDI5ICs2NTIsMjkgQEAKIAogCWlmKG50X2hlYWRlci0+T3B0aW9uYWxIZWFkZXIuRGF0YURpcmVjdG9yeQogCQlbSU1BR0VfRElSRUNUT1JZX0VOVFJZX0NPUFlSSUdIVF0uU2l6ZSkKLQkJZHByaW50Zl93aW4zMihzdGRuaW1wLCJDb3B5cmlnaHQgc3RyaW5nIGlnbm9yZWRcbiIpOworCQlkcHJpbnRmX2ZpeG1lKHdpbjMyLCJDb3B5cmlnaHQgc3RyaW5nIGlnbm9yZWRcbiIpOwogCiAJaWYobnRfaGVhZGVyLT5PcHRpb25hbEhlYWRlci5EYXRhRGlyZWN0b3J5CiAJCVtJTUFHRV9ESVJFQ1RPUllfRU5UUllfR0xPQkFMUFRSXS5TaXplKQotCQlkcHJpbnRmX3dpbjMyKHN0ZG5pbXAsIkdsb2JhbCBQb2ludGVyIChNSVBTKSBpZ25vcmVkXG4iKTsKKwkJZHByaW50Zl9maXhtZSh3aW4zMiwiR2xvYmFsIFBvaW50ZXIgKE1JUFMpIGlnbm9yZWRcbiIpOwogCiAJaWYobnRfaGVhZGVyLT5PcHRpb25hbEhlYWRlci5EYXRhRGlyZWN0b3J5CiAJCVtJTUFHRV9ESVJFQ1RPUllfRU5UUllfTE9BRF9DT05GSUddLlNpemUpCi0JCWRwcmludGZfd2luMzIoc3RkbmltcCwiTG9hZCBDb25maWd1cmF0aW9uIGRpcmVjdG9yeSBpZ25vcmVkXG4iKTsKKwkJZHByaW50Zl9maXhtZSh3aW4zMiwiTG9hZCBDb25maWd1cmF0aW9uIGRpcmVjdG9yeSBpZ25vcmVkXG4iKTsKIAogCWlmKG50X2hlYWRlci0+T3B0aW9uYWxIZWFkZXIuRGF0YURpcmVjdG9yeQogCQlbSU1BR0VfRElSRUNUT1JZX0VOVFJZX0JPVU5EX0lNUE9SVF0uU2l6ZSkKLQkJZHByaW50Zl93aW4zMihzdGRuaW1wLCJCb3VuZCBJbXBvcnQgZGlyZWN0b3J5IGlnbm9yZWRcbiIpOworCQlkcHJpbnRmX2ZpeG1lKHdpbjMyLCJCb3VuZCBJbXBvcnQgZGlyZWN0b3J5IGlnbm9yZWRcbiIpOwogCiAJaWYobnRfaGVhZGVyLT5PcHRpb25hbEhlYWRlci5EYXRhRGlyZWN0b3J5CiAJCVtJTUFHRV9ESVJFQ1RPUllfRU5UUllfSUFUXS5TaXplKQotCQlkcHJpbnRmX3dpbjMyKHN0ZG5pbXAsIkltcG9ydCBBZGRyZXNzIFRhYmxlIGRpcmVjdG9yeSBpZ25vcmVkXG4iKTsKKwkJZHByaW50Zl9maXhtZSh3aW4zMiwiSW1wb3J0IEFkZHJlc3MgVGFibGUgZGlyZWN0b3J5IGlnbm9yZWRcbiIpOwogCWlmKG50X2hlYWRlci0+T3B0aW9uYWxIZWFkZXIuRGF0YURpcmVjdG9yeVsxM10uU2l6ZSkKLQkJZHByaW50Zl93aW4zMihzdGRuaW1wLCJVbmtub3duIGRpcmVjdG9yeSAxMyBpZ25vcmVkXG4iKTsKKwkJZHByaW50Zl9maXhtZSh3aW4zMiwiVW5rbm93biBkaXJlY3RvcnkgMTMgaWdub3JlZFxuIik7CiAJaWYobnRfaGVhZGVyLT5PcHRpb25hbEhlYWRlci5EYXRhRGlyZWN0b3J5WzE0XS5TaXplKQotCQlkcHJpbnRmX3dpbjMyKHN0ZG5pbXAsIlVua25vd24gZGlyZWN0b3J5IDE0IGlnbm9yZWRcbiIpOworCQlkcHJpbnRmX2ZpeG1lKHdpbjMyLCJVbmtub3duIGRpcmVjdG9yeSAxNCBpZ25vcmVkXG4iKTsKIAlpZihudF9oZWFkZXItPk9wdGlvbmFsSGVhZGVyLkRhdGFEaXJlY3RvcnlbMTVdLlNpemUpCi0JCWRwcmludGZfd2luMzIoc3RkbmltcCwiVW5rbm93biBkaXJlY3RvcnkgMTUgaWdub3JlZFxuIik7CisJCWRwcmludGZfZml4bWUod2luMzIsIlVua25vd24gZGlyZWN0b3J5IDE1IGlnbm9yZWRcbiIpOwogCiAJaWYocGVtLT5wZV9yZWxvYykJZG9fcmVsb2NhdGlvbnMocGVtKTsKIAlpZihwZW0tPnBlX2V4cG9ydCkJZHVtcF9leHBvcnRzKHBlbS0+bW9kdWxlKTsKQEAgLTY5MSw3ICs3MTUsNyBAQAogICAgICAgICAvKiBOb3cgdGhhdCB3ZSBnb3QgZXZlcnl0aGluZyBhdCB0aGUgcmlnaHQgYWRkcmVzcywKICAgICAgICAgICogd2UgY2FuIHVubWFwIHRoZSBwcmV2aW91cyBtb2R1bGUgKi8KICAgICAgICAgVW5tYXBWaWV3T2ZGaWxlKCAoTFBWT0lEKWhNb2R1bGUgKTsKLSAgICAgICAgcmV0dXJuIChITU9EVUxFMzIpbG9hZF9hZGRyOworICAgICAgICByZXR1cm4gMTsKIH0KIAogSElOU1RBTkNFMTYgTU9EVUxFX0NyZWF0ZUluc3RhbmNlKEhNT0RVTEUxNiBoTW9kdWxlLExPQURQQVJBTVMgKnBhcmFtcyk7CkBAIC03MDUsNyArNzI5LDcgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBIRklMRTMyIGhGaWxlLCBEV09SRCBmbGFncykKIHsKIAlPRlNUUlVDVAlvZnM7Ci0JSE1PRFVMRTMyCWhNb2R1bGUscmV0OworCUhNT0RVTEUzMgloTW9kdWxlOwogCU5FX01PRFVMRQkqcE1vZHVsZTsKIAlQRV9NT0RSRUYJKnBlbTsKIApAQCAtNzY3LDEzICs3OTEsMTEgQEAKIAkJaWYgKHBNb2R1bGUtPm1vZHVsZTMyIDwgMzIpIHJldHVybiAyMTsKIAl9CiAJLyogcmVjdXJzZSAqLwotCXJldCA9IFBFX01hcEltYWdlKCBwTW9kdWxlLT5tb2R1bGUzMiwgcHJvY2VzcywgJm9mcyxmbGFncyk7Ci0JaWYgKCFyZXQpIHsKKwlpZiAoIVBFX01hcEltYWdlKCAmKHBNb2R1bGUtPm1vZHVsZTMyKSwgcHJvY2VzcywgJm9mcyxmbGFncykpIHsKIAkJLyogc2hvdWxkIGZyZWUgdGhpcyBtb2R1bGUgYW5kIHRoZSBhbHJlYWR5IHJlZmVyZW5jZWQgb25lcyAqLwogCQlyZXR1cm4gMDsKIAl9Ci0JcE1vZHVsZS0+bW9kdWxlMzIgPSByZXQ7Ci0JcmV0dXJuIHJldDsKKwlyZXR1cm4gcE1vZHVsZS0+bW9kdWxlMzI7CiB9CiAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgpAQCAtNzg0LDcgKzgwNiw3IEBACiBISU5TVEFOQ0UxNiBQRV9Mb2FkTW9kdWxlKCBIRklMRTMyIGhGaWxlLCBPRlNUUlVDVCAqb2ZzLCBMT0FEUEFSQU1TKiBwYXJhbXMgKQogewogICAgIEhNT0RVTEUxNiBoTW9kdWxlMTY7Ci0gICAgSE1PRFVMRTMyIGhNb2R1bGUzMiwgcmV0OworICAgIEhNT0RVTEUzMiBoTW9kdWxlMzI7CiAgICAgSElOU1RBTkNFMTYgaEluc3RhbmNlOwogICAgIE5FX01PRFVMRSAqcE1vZHVsZTsKICAgICBUSERCICp0aGRiID0gVEhSRUFEX0N1cnJlbnQoKTsKQEAgLTgwNywyMCArODI5LDE5IEBACiAgICAgICAgIFREQiAqcFRhc2sgPSAoVERCICopR2xvYmFsTG9jazE2KCBoVGFzayApOwogICAgICAgICB0aGRiID0gcFRhc2stPnRoZGI7CiAgICAgfQotICAgIGlmICghKHJldCA9IFBFX01hcEltYWdlKCBoTW9kdWxlMzIsIHRoZGItPnByb2Nlc3MsIG9mcywgMCApKSkKKyAgICBpZiAoIVBFX01hcEltYWdlKCAmKHBNb2R1bGUtPm1vZHVsZTMyKSwgdGhkYi0+cHJvY2Vzcywgb2ZzLCAwICkpCiAgICAgewotICAgICAJLyogRklYTUU6IHNob3VsZCBkZXN0cm95IHRoZSB0YXNrIGNyZWF0ZWQgLi4uICovCisgICAgIAkvKiBGSVhNRTogc2hvdWxkIGRlc3Ryb3kgdGhlIHRhc2sgY3JlYXRlZCBhbmQgZnJlZSByZWZlcmVuY2VkIHN0dWZmICovCiAgICAgICAgIHJldHVybiAwOwogICAgIH0KLSAgICBwTW9kdWxlLT5tb2R1bGUzMiA9IHJldDsKLSAgICAvKiB5dWNrLiBidXQgdGhlcmUgaXMgbm8gb3RoZXIgZ29vZCBwbGFjZSB0byBkbyB0aGF0Li4uICovCisgICAgLyogRklYTUU6IFl1Y2suIElzIHRoZXJlIG5vIG90aGVyIGdvb2QgcGxhY2UgdG8gZG8gdGhhdD8gKi8KICAgICBQRV9Jbml0VGxzKCB0aGRiICk7CiAgICAgcmV0dXJuIGhJbnN0YW5jZTsKIH0KIAogaW50IFBFX1VubG9hZEltYWdlKCBITU9EVUxFMzIgaE1vZHVsZSApCiB7Ci0JcHJpbnRmKCJQRXVubG9hZEltYWdlKCkgY2FsbGVkIVxuIik7CisJZnByaW50ZihzdGRlcnIsIlBFdW5sb2FkSW1hZ2UoKSBjYWxsZWQhXG4iKTsKIAkvKiBmcmVlIHJlc291cmNlcywgaW1hZ2UsIHVubWFwICovCiAJcmV0dXJuIDE7CiB9CkBAIC04NDgsNyArODY5LDcgQEAKICAgICApIHsKICAgICAgICAgRkFSUFJPQzMyIGVudHJ5ID0gKEZBUlBST0MzMilSVkFfUFRSKCBwZW0tPm1vZHVsZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9wdGlvbmFsSGVhZGVyLkFkZHJlc3NPZkVudHJ5UG9pbnQgKTsKLSAgICAgICAgZHByaW50Zl9yZWxheSggc3RkZGViLCAiQ2FsbFRvMzIoZW50cnlwcm9jPSVwLG1vZHVsZT0lMDh4LHR5cGU9JWxkLHJlcz0lcClcbiIsCisgICAgICAgIGRwcmludGZfaW5mbyhyZWxheSwgIkNhbGxUbzMyKGVudHJ5cHJvYz0lcCxtb2R1bGU9JTA4eCx0eXBlPSVsZCxyZXM9JXApXG4iLAogICAgICAgICAgICAgICAgICAgICAgICBlbnRyeSwgcGVtLT5tb2R1bGUsIHR5cGUsIGxwUmVzZXJ2ZWQgKTsKICAgICAgICAgZW50cnkoIHBlbS0+bW9kdWxlLCB0eXBlLCBscFJlc2VydmVkICk7CiAgICAgfQpAQCAtODk5LDcgKzkyMCw3IEBACiAJCQlEYXRhRGlyZWN0b3J5W0lNQUdFX0ZJTEVfVEhSRUFEX0xPQ0FMX1NUT1JBR0VdLlZpcnR1YWxBZGRyZXNzKTsKIAkJCiAJCWlmICghKHBlbS0+ZmxhZ3MgJiBQRV9NT0RSRUZfVExTX0FMTE9DRUQpKSB7Ci0JCQlwZW0tPnRsc2luZGV4ID0gVGxzQWxsb2MoKTsKKwkJCXBlbS0+dGxzaW5kZXggPSBUSFJFQURfVGxzQWxsb2ModGhkYik7CiAJCQkqKHBkaXItPkFkZHJlc3NPZkluZGV4KT1wZW0tPnRsc2luZGV4OyAgIAogCQl9CiAJCXBlbS0+ZmxhZ3MgfD0gUEVfTU9EUkVGX1RMU19BTExPQ0VEOwpAQCAtOTI5LDQgKzk1MCwzIEBACiAJfQogCXJldHVybiBUUlVFOwogfQotCmRpZmYgLS1naXQgYS9sb2FkZXIvcGVfcmVzb3VyY2UuYyBiL2xvYWRlci9wZV9yZXNvdXJjZS5jCmluZGV4IDYwZmE1YjguLmRhMDYxNDIgMTAwNjQ0Ci0tLSBhL2xvYWRlci9wZV9yZXNvdXJjZS5jCisrKyBiL2xvYWRlci9wZV9yZXNvdXJjZS5jCkBAIC0yMiw3ICsyMiw2IEBACiAjaW5jbHVkZSAibGlicmVzLmgiCiAjaW5jbHVkZSAic3RhY2tmcmFtZS5oIgogI2luY2x1ZGUgIm5lZXhlLmgiCi0jaW5jbHVkZSAic3RkZGVidWcuaCIKICNpbmNsdWRlICJkZWJ1Zy5oIgogCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgpkaWZmIC0tZ2l0IGEvbG9hZGVyL3Jlc291cmNlLmMgYi9sb2FkZXIvcmVzb3VyY2UuYwppbmRleCA1ZTk4ZmI1Li44ZDdhZDgxIDEwMDY0NAotLS0gYS9sb2FkZXIvcmVzb3VyY2UuYworKysgYi9sb2FkZXIvcmVzb3VyY2UuYwpAQCAtMjAsMTYgKzIwLDEwIEBACiAjaW5jbHVkZSAidGFzay5oIgogI2luY2x1ZGUgIm1vZHVsZS5oIgogI2luY2x1ZGUgInJlc291cmNlLmgiCi0jaW5jbHVkZSAic3RkZGVidWcuaCIKKyNpbmNsdWRlICJkZWJ1Z3N0ci5oIgogI2luY2x1ZGUgImRlYnVnLmgiCiAjaW5jbHVkZSAibGlicmVzLmgiCiAKLSNkZWZpbmUgUHJpbnRJZChuYW1lKSBcCi0gICAgaWYgKEhJV09SRCgoRFdPUkQpbmFtZSkpIFwKLSAgICAgICAgZHByaW50Zl9yZXNvdXJjZSggc3RkZGViLCAiJyVzJyIsIChjaGFyICopUFRSX1NFR19UT19MSU4obmFtZSkpOyBcCi0gICAgZWxzZSBcCi0gICAgICAgIGRwcmludGZfcmVzb3VyY2UoIHN0ZGRlYiwgIiMlMDR4IiwgTE9XT1JEKG5hbWUpKTsgCi0KIGV4dGVybiBXT1JEIFdJTkVfTGFuZ3VhZ2VJZDsKIAogLyogZXJyb3IgbWVzc2FnZSB3aGVuIDE2LWJpdCByZXNvdXJjZSBmdW5jdGlvbiBpcyBjYWxsZWQgZm9yIFdpbjMyIG1vZHVsZSAqLwpAQCAtNDUsMjggKzM5LDMwIEBACiAgICAgTkVfTU9EVUxFICpwTW9kdWxlOwogCiAgICAgaE1vZHVsZSA9IE1PRFVMRV9IQU5ETEV0b0hNT0RVTEUxNiggaE1vZHVsZSApOyAKLSAgICBkcHJpbnRmX3Jlc291cmNlKHN0ZGRlYiwgIkZpbmRSZXNvdXJjZTE2OiBtb2R1bGU9JTA0eCIsIGhNb2R1bGUgKTsKIAogICAgIGlmIChISVdPUkQobmFtZSkpICAvKiBDaGVjayBmb3IgJyN4eHgnIG5hbWUgKi8KICAgICB7CiAJY2hhciAqcHRyID0gUFRSX1NFR19UT19MSU4oIG5hbWUgKTsKIAlpZiAocHRyWzBdID09ICcjJykKLQkgICAgaWYgKCEobmFtZSA9IChTRUdQVFIpYXRvaSggcHRyICsgMSApKSkgcmV0dXJuIDA7CisJICAgIGlmICghKG5hbWUgPSAoU0VHUFRSKWF0b2koIHB0ciArIDEgKSkpIHsKKwkgICAgICBkcHJpbnRmX3dhcm4ocmVzb3VyY2UsICJJbmNvcnJlY3QgcmVzb3VyY2UgbmFtZTogJXNcbiIsIHB0cik7CisJICAgICAgcmV0dXJuIDA7CisJICAgIH0KICAgICB9CiAKLSAgICBkcHJpbnRmX3Jlc291cmNlKCBzdGRkZWIsICIgbmFtZT0iICk7Ci0gICAgUHJpbnRJZCggbmFtZSApOwotCiAgICAgaWYgKEhJV09SRCh0eXBlKSkgIC8qIENoZWNrIGZvciAnI3h4eCcgdHlwZSAqLwogICAgIHsKIAljaGFyICpwdHIgPSBQVFJfU0VHX1RPX0xJTiggdHlwZSApOwogCWlmIChwdHJbMF0gPT0gJyMnKQotCSAgICBpZiAoISh0eXBlID0gKFNFR1BUUilhdG9pKCBwdHIgKyAxICkpKSByZXR1cm4gMDsKKwkgIGlmICghKHR5cGUgPSAoU0VHUFRSKWF0b2koIHB0ciArIDEgKSkpeworCSAgICBkcHJpbnRmX3dhcm4ocmVzb3VyY2UsICJJbmNvcnJlY3QgcmVzb3VyY2UgdHlwZTogJXNcbiIsIHB0cik7CisJICAgIHJldHVybiAwOworCSAgfQogICAgIH0KIAotICAgIGRwcmludGZfcmVzb3VyY2UoIHN0ZGRlYiwgIiB0eXBlPSIgKTsKLSAgICBQcmludElkKCB0eXBlICk7Ci0gICAgZHByaW50Zl9yZXNvdXJjZSggc3RkZGViLCAiXG4iICk7CisgICAgZHByaW50Zl9pbmZvKHJlc291cmNlLCAiRmluZFJlc291cmNlMTY6IG1vZHVsZT0lMDR4IG5hbWU9JXMgdHlwZT0lc1xuIiwgCisJCSBoTW9kdWxlLCBkZWJ1Z3JlcyhQVFJfU0VHX1RPX0xJTihuYW1lKSksIAorCQkgZGVidWdyZXMoUFRSX1NFR19UT19MSU4odHlwZSkpICk7CiAKICAgICBpZiAoKHBNb2R1bGUgPSBNT0RVTEVfR2V0UHRyKCBoTW9kdWxlICkpKQogICAgIHsKQEAgLTEyOSwxOCArMTI1LDExIEBACiAKICAgICAgICAgaWYgKCFoTW9kdWxlKSBoTW9kdWxlID0gR2V0VGFza0RTKCk7CiAgICAgICAgIGhNb2R1bGUgPSBNT0RVTEVfSEFORExFdG9ITU9EVUxFMzIoIGhNb2R1bGUgKTsKLSAgICAgICAgZHByaW50Zl9yZXNvdXJjZShzdGRkZWIsICJGaW5kUmVzb3VyY2UzMlc6IG1vZHVsZT0lMDh4IHR5cGU9IiwKLSAgICAgICAgICAgICAgICAgICAgICAgICBoTW9kdWxlICk7Ci0gICAgICAgIGlmIChISVdPUkQodHlwZSkpCi0gICAgICAgICAgICBkcHJpbnRmX3Jlc291cmNlKHN0ZGRlYiwiJXAiLHR5cGUpOwotICAgICAgICBlbHNlCi0gICAgICAgICAgICBkcHJpbnRmX3Jlc291cmNlKHN0ZGRlYiwiIyVwIix0eXBlKTsKLSAgICAgICAgZHByaW50Zl9yZXNvdXJjZSggc3RkZGViLCAiIG5hbWU9IiApOwotICAgICAgICBpZiAoSElXT1JEKG5hbWUpKQotICAgICAgICAgICAgZHByaW50Zl9yZXNvdXJjZShzdGRkZWIsIiVwIixuYW1lKTsKLSAgICAgICAgZWxzZQotICAgICAgICAgICAgZHByaW50Zl9yZXNvdXJjZShzdGRkZWIsIiMlcCIsbmFtZSk7Ci0gICAgICAgIGRwcmludGZfcmVzb3VyY2UoIHN0ZGRlYiwgIlxuIiApOworICAgICAgICBkcHJpbnRmX2luZm8ocmVzb3VyY2UsICJGaW5kUmVzb3VyY2UzMlc6IG1vZHVsZT0lMDh4ICIKKwkJCSAidHlwZT0lcyVwIG5hbWU9JXMlcFxuIiwgaE1vZHVsZSwKKwkJCSAoSElXT1JEKHR5cGUpKT8gIiIgOiAiIyIsIHR5cGUsIAorCQkJIChISVdPUkQobmFtZSkpPyAiIiA6ICIjIiwgbmFtZSk7CisKICAgICAgICAgaWYgKCEocE1vZHVsZSA9IE1PRFVMRV9HZXRQdHIoIGhNb2R1bGUgKSkpIHJldHVybiAwOwogICAgICAgICBpZiAoIShwTW9kdWxlLT5mbGFncyAmIE5FX0ZGTEFHU19XSU4zMikpIHJldHVybiAwOwogICAgICAgICByZXR1cm4gUEVfRmluZFJlc291cmNlRXgzMlcoaE1vZHVsZSxuYW1lLHR5cGUsbGFuZyk7CkBAIC0xNjUsNyArMTU0LDcgQEAKICAgICBORV9NT0RVTEUgKnBNb2R1bGU7CiAKICAgICBoTW9kdWxlID0gTU9EVUxFX0hBTkRMRXRvSE1PRFVMRTE2KCBoTW9kdWxlICk7Ci0gICAgZHByaW50Zl9yZXNvdXJjZShzdGRkZWIsICJMb2FkUmVzb3VyY2UxNjogbW9kdWxlPSUwNHggcmVzPSUwNHhcbiIsCisgICAgZHByaW50Zl9pbmZvKHJlc291cmNlLCAiTG9hZFJlc291cmNlMTY6IG1vZHVsZT0lMDR4IHJlcz0lMDR4XG4iLAogICAgICAgICAgICAgICAgICAgICAgaE1vZHVsZSwgaFJzcmMgKTsKICAgICBpZiAoIWhSc3JjKSByZXR1cm4gMDsKICAgICBpZiAoKHBNb2R1bGUgPSBNT0RVTEVfR2V0UHRyKCBoTW9kdWxlICkpKQpAQCAtMTkzLDcgKzE4Miw3IEBACiAKICAgICAgICAgaWYgKCFoTW9kdWxlKSBoTW9kdWxlID0gR2V0VGFza0RTKCk7IC8qIEZJWE1FOiBzZWUgRmluZFJlc291cmNlMzJXICovCiAgICAgICAgIGhNb2R1bGUgPSBNT0RVTEVfSEFORExFdG9ITU9EVUxFMzIoIGhNb2R1bGUgKTsKLSAgICAgICAgZHByaW50Zl9yZXNvdXJjZShzdGRkZWIsICJMb2FkUmVzb3VyY2UzMjogbW9kdWxlPSUwNHggcmVzPSUwNHhcbiIsCisgICAgICAgIGRwcmludGZfaW5mbyhyZXNvdXJjZSwgIkxvYWRSZXNvdXJjZTMyOiBtb2R1bGU9JTA0eCByZXM9JTA0eFxuIiwKICAgICAgICAgICAgICAgICAgICAgICAgICBoTW9kdWxlLCBoUnNyYyApOwogICAgICAgICBpZiAoIWhSc3JjKSByZXR1cm4gMDsKIApAQCAtMjE4LDcgKzIwNyw3IEBACiAgICAgSE1PRFVMRTE2IGhNb2R1bGU7CiAgICAgTkVfTU9EVUxFICpwTW9kdWxlOwogCi0gICAgZHByaW50Zl9yZXNvdXJjZShzdGRkZWIsICJMb2NrUmVzb3VyY2U6IGhhbmRsZT0lMDR4XG4iLCBoYW5kbGUgKTsKKyAgICBkcHJpbnRmX2luZm8ocmVzb3VyY2UsICJMb2NrUmVzb3VyY2U6IGhhbmRsZT0lMDR4XG4iLCBoYW5kbGUgKTsKICAgICBpZiAoIWhhbmRsZSkgcmV0dXJuIChTRUdQVFIpMDsKICAgICBoTW9kdWxlID0gTU9EVUxFX0hBTkRMRXRvSE1PRFVMRTE2KCBoYW5kbGUgKTsKICAgICBpZiAoIShwTW9kdWxlID0gTU9EVUxFX0dldFB0ciggaE1vZHVsZSApKSkgcmV0dXJuIDA7CkBAIC0yMzgsNyArMjI3LDcgQEAKICAgICAgICAgSE1PRFVMRTE2IGhNb2R1bGU7CiAgICAgICAgIE5FX01PRFVMRSAqcE1vZHVsZTsKIAotICAgICAgICBkcHJpbnRmX3Jlc291cmNlKHN0ZGRlYiwgIkxvY2tSZXNvdXJjZTogaGFuZGxlPSUwNHhcbiIsIGhhbmRsZSApOworICAgICAgICBkcHJpbnRmX2luZm8ocmVzb3VyY2UsICJMb2NrUmVzb3VyY2U6IGhhbmRsZT0lMDR4XG4iLCBoYW5kbGUgKTsKICAgICAgICAgaWYgKCFoYW5kbGUpIHJldHVybiBOVUxMOwogICAgICAgICBoTW9kdWxlID0gTU9EVUxFX0hBTkRMRXRvSE1PRFVMRTE2KCBoYW5kbGUgKTsKICAgICAgICAgaWYgKCEocE1vZHVsZSA9IE1PRFVMRV9HZXRQdHIoIGhNb2R1bGUgKSkpIHJldHVybiAwOwpAQCAtMjcyLDcgKzI2MSw3IEBACiAgICAgICAgIEhNT0RVTEUxNiBoTW9kdWxlOwogICAgICAgICBORV9NT0RVTEUgKnBNb2R1bGU7CiAKLSAgICAgICAgZHByaW50Zl9yZXNvdXJjZShzdGRkZWIsICJGcmVlUmVzb3VyY2UxNjogaGFuZGxlPSUwNHhcbiIsIGhhbmRsZSApOworICAgICAgICBkcHJpbnRmX2luZm8ocmVzb3VyY2UsICJGcmVlUmVzb3VyY2UxNjogaGFuZGxlPSUwNHhcbiIsIGhhbmRsZSApOwogICAgICAgICBpZiAoIWhhbmRsZSkgcmV0dXJuIEZBTFNFOwogICAgICAgICBoTW9kdWxlID0gTU9EVUxFX0hBTkRMRXRvSE1PRFVMRTE2KCBoYW5kbGUgKTsKICAgICAgICAgaWYgKCEocE1vZHVsZSA9IE1PRFVMRV9HZXRQdHIoIGhNb2R1bGUgKSkpIHJldHVybiAwOwpAQCAtMzA0LDcgKzI5Myw3IEBACiAgICAgTkVfTU9EVUxFICpwTW9kdWxlOwogCiAgICAgaE1vZHVsZSA9IE1PRFVMRV9IQU5ETEV0b0hNT0RVTEUxNiggaE1vZHVsZSApOwotICAgIGRwcmludGZfcmVzb3VyY2Uoc3RkZGViLCAiQWNjZXNzUmVzb3VyY2UxNjogbW9kdWxlPSUwNHggcmVzPSUwNHhcbiIsCisgICAgZHByaW50Zl9pbmZvKHJlc291cmNlLCAiQWNjZXNzUmVzb3VyY2UxNjogbW9kdWxlPSUwNHggcmVzPSUwNHhcbiIsCiAgICAgICAgICAgICAgICAgICAgICBoTW9kdWxlLCBoUnNyYyApOwogICAgIGlmICghaFJzcmMpIHJldHVybiAwOwogICAgIGlmICghKHBNb2R1bGUgPSBNT0RVTEVfR2V0UHRyKCBoTW9kdWxlICkpKSByZXR1cm4gMDsKQEAgLTMyNyw3ICszMTYsNyBAQAogSU5UMzIgV0lOQVBJIEFjY2Vzc1Jlc291cmNlMzIoIEhJTlNUQU5DRTMyIGhNb2R1bGUsIEhSU1JDMzIgaFJzcmMgKQogewogICAgIGhNb2R1bGUgPSBNT0RVTEVfSEFORExFdG9ITU9EVUxFMzIoIGhNb2R1bGUgKTsKLSAgICBkcHJpbnRmX3Jlc291cmNlKHN0ZGRlYiwgIkFjY2Vzc1Jlc291cmNlOiBtb2R1bGU9JTA0eCByZXM9JTA0eFxuIiwKKyAgICBkcHJpbnRmX2luZm8ocmVzb3VyY2UsICJBY2Nlc3NSZXNvdXJjZTogbW9kdWxlPSUwNHggcmVzPSUwNHhcbiIsCiAgICAgICAgICAgICAgICAgICAgICBoTW9kdWxlLCBoUnNyYyApOwogICAgIGlmICghaFJzcmMpIHJldHVybiAwOwogICAgIGZwcmludGYoc3RkZXJyLCJBY2Nlc3NSZXNvdXJjZTMyOiBub3QgaW1wbGVtZW50ZWRcbiIpOwpAQCAtMzQzLDcgKzMzMiw3IEBACiAgICAgTkVfTU9EVUxFICpwTW9kdWxlOwogCiAgICAgaE1vZHVsZSA9IE1PRFVMRV9IQU5ETEV0b0hNT0RVTEUxNiggaE1vZHVsZSApOwotICAgIGRwcmludGZfcmVzb3VyY2Uoc3RkZGViLCAiU2l6ZW9mUmVzb3VyY2UxNjogbW9kdWxlPSUwNHggcmVzPSUwNHhcbiIsCisgICAgZHByaW50Zl9pbmZvKHJlc291cmNlLCAiU2l6ZW9mUmVzb3VyY2UxNjogbW9kdWxlPSUwNHggcmVzPSUwNHhcbiIsCiAgICAgICAgICAgICAgICAgICAgICBoTW9kdWxlLCBoUnNyYyApOwogICAgIGlmICghKHBNb2R1bGUgPSBNT0RVTEVfR2V0UHRyKCBoTW9kdWxlICkpKSByZXR1cm4gMDsKICAgICBpZiAoIV9fd2luZWxpYikKQEAgLTM2NSw3ICszNTQsNyBAQAogRFdPUkQgV0lOQVBJIFNpemVvZlJlc291cmNlMzIoIEhJTlNUQU5DRTMyIGhNb2R1bGUsIEhSU1JDMzIgaFJzcmMgKQogewogICAgIGhNb2R1bGUgPSBNT0RVTEVfSEFORExFdG9ITU9EVUxFMzIoIGhNb2R1bGUgKTsKLSAgICBkcHJpbnRmX3Jlc291cmNlKHN0ZGRlYiwgIlNpemVvZlJlc291cmNlMzI6IG1vZHVsZT0lMDR4IHJlcz0lMDR4XG4iLAorICAgIGRwcmludGZfaW5mbyhyZXNvdXJjZSwgIlNpemVvZlJlc291cmNlMzI6IG1vZHVsZT0lMDR4IHJlcz0lMDR4XG4iLAogICAgICAgICAgICAgICAgICAgICAgaE1vZHVsZSwgaFJzcmMgKTsKICAgICBpZiAoIV9fd2luZWxpYikgcmV0dXJuIFBFX1NpemVvZlJlc291cmNlMzIoaE1vZHVsZSxoUnNyYyk7CiAgICAgZWxzZQpAQCAtMzg0LDcgKzM3Myw3IEBACiAgICAgTkVfTU9EVUxFICpwTW9kdWxlOwogCiAgICAgaE1vZHVsZSA9IE1PRFVMRV9IQU5ETEV0b0hNT0RVTEUxNiggaE1vZHVsZSApOwotICAgIGRwcmludGZfcmVzb3VyY2Uoc3RkZGViLCAiQWxsb2NSZXNvdXJjZTogbW9kdWxlPSUwNHggcmVzPSUwNHggc2l6ZT0lbGRcbiIsCisgICAgZHByaW50Zl9pbmZvKHJlc291cmNlLCAiQWxsb2NSZXNvdXJjZTogbW9kdWxlPSUwNHggcmVzPSUwNHggc2l6ZT0lbGRcbiIsCiAgICAgICAgICAgICAgICAgICAgICBoTW9kdWxlLCBoUnNyYywgc2l6ZSApOwogICAgIGlmICghaFJzcmMpIHJldHVybiAwOwogICAgIGlmICghKHBNb2R1bGUgPSBNT0RVTEVfR2V0UHRyKCBoTW9kdWxlICkpKSByZXR1cm4gMDsKQEAgLTQwOCw3ICszOTcsNyBAQAogSEdMT0JBTDE2IFdJTkFQSSBEaXJlY3RSZXNBbGxvYyggSElOU1RBTkNFMTYgaEluc3RhbmNlLCBXT1JEIHdUeXBlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVUlOVDE2IHdTaXplICkKIHsKLSAgICBkcHJpbnRmX3Jlc291cmNlKHN0ZGRlYiwiRGlyZWN0UmVzQWxsb2MoJTA0eCwlMDR4LCUwNHgpXG4iLAorICAgIGRwcmludGZfaW5mbyhyZXNvdXJjZSwiRGlyZWN0UmVzQWxsb2MoJTA0eCwlMDR4LCUwNHgpXG4iLAogICAgICAgICAgICAgICAgICAgICAgaEluc3RhbmNlLCB3VHlwZSwgd1NpemUgKTsKICAgICBoSW5zdGFuY2UgPSBNT0RVTEVfSEFORExFdG9ITU9EVUxFMTYoaEluc3RhbmNlKTsKICAgICBpZighaEluc3RhbmNlKXJldHVybiAwOwpAQCAtNDI3LDEwICs0MTYsMTAgQEAKICAgICBIUlNSQzE2CWhSc3JjOwogCiAgICAgaWYgKEhJV09SRChscFRhYmxlTmFtZSkpCi0gICAgICAgIGRwcmludGZfYWNjZWwoIHN0ZGRlYiwgIkxvYWRBY2NlbGVyYXRvcnM6ICUwNHggJyVzJ1xuIiwKKyAgICAgICAgZHByaW50Zl9pbmZvKGFjY2VsLCAiTG9hZEFjY2VsZXJhdG9yczogJTA0eCAnJXMnXG4iLAogICAgICAgICAgICAgICAgICAgICAgIGluc3RhbmNlLCAoY2hhciAqKVBUUl9TRUdfVE9fTElOKCBscFRhYmxlTmFtZSApICk7CiAgICAgZWxzZQotICAgICAgICBkcHJpbnRmX2FjY2VsKCBzdGRkZWIsICJMb2FkQWNjZWxlcmF0b3JzOiAlMDR4ICUwNHhcbiIsCisgICAgICAgIGRwcmludGZfaW5mbyhhY2NlbCwgIkxvYWRBY2NlbGVyYXRvcnM6ICUwNHggJTA0eFxuIiwKICAgICAgICAgICAgICAgICAgICAgICAgaW5zdGFuY2UsIExPV09SRChscFRhYmxlTmFtZSkgKTsKIAogICAgIGlmICghKGhSc3JjID0gRmluZFJlc291cmNlMTYoIGluc3RhbmNlLCBscFRhYmxlTmFtZSwgUlRfQUNDRUxFUkFUT1IgKSkpCkBAIC00NTIsMTAgKzQ0MSwxMCBAQAogICAgIEhSU1JDMzIgaFJzcmM7CiAKICAgICBpZiAoSElXT1JEKGxwVGFibGVOYW1lKSkKLSAgICAgICAgZHByaW50Zl9hY2NlbCggc3RkZGViLCAiTG9hZEFjY2VsZXJhdG9yczogJTA0eCAnJXMnXG4iLAorICAgICAgICBkcHJpbnRmX2luZm8oYWNjZWwsICJMb2FkQWNjZWxlcmF0b3JzOiAlMDR4ICclcydcbiIsCiAgICAgICAgICAgICAgICAgICAgICAgaW5zdGFuY2UsIChjaGFyICopKCBscFRhYmxlTmFtZSApICk7CiAgICAgZWxzZQotICAgICAgICBkcHJpbnRmX2FjY2VsKCBzdGRkZWIsICJMb2FkQWNjZWxlcmF0b3JzOiAlMDR4ICUwNHhcbiIsCisgICAgICAgIGRwcmludGZfaW5mbyhhY2NlbCwgIkxvYWRBY2NlbGVyYXRvcnM6ICUwNHggJTA0eFxuIiwKICAgICAgICAgICAgICAgICAgICAgICAgaW5zdGFuY2UsIExPV09SRChscFRhYmxlTmFtZSkgKTsKIAogICAgIGlmICghKGhSc3JjID0gRmluZFJlc291cmNlMzJXKCBpbnN0YW5jZSwgbHBUYWJsZU5hbWUsIApAQCAtNTE2LDcgKzUwNSw3IEBACiAgICAgaW50IHN0cmluZ19udW07CiAgICAgaW50IGk7CiAKLSAgICBkcHJpbnRmX3Jlc291cmNlKHN0ZGRlYiwiTG9hZFN0cmluZzogaW5zdD0lMDR4IGlkPSUwNHggYnVmZj0lMDh4IGxlbj0lZFxuIiwKKyAgICBkcHJpbnRmX2luZm8ocmVzb3VyY2UsIkxvYWRTdHJpbmc6IGluc3Q9JTA0eCBpZD0lMDR4IGJ1ZmY9JTA4eCBsZW49JWRcbiIsCiAgICAgICAgICAgICAgICAgICAgICBpbnN0YW5jZSwgcmVzb3VyY2VfaWQsIChpbnQpIGJ1ZmZlciwgYnVmbGVuKTsKIAogICAgIGhyc3JjID0gRmluZFJlc291cmNlMTYoIGluc3RhbmNlLCAoU0VHUFRSKSgocmVzb3VyY2VfaWQ+PjQpKzEpLCBSVF9TVFJJTkcgKTsKQEAgLTUyOSw3ICs1MTgsNyBAQAogICAgIGZvciAoaSA9IDA7IGkgPCBzdHJpbmdfbnVtOyBpKyspCiAJcCArPSAqcCArIDE7CiAgICAgCi0gICAgZHByaW50Zl9yZXNvdXJjZSggc3RkZGViLCAic3RybGVuID0gJWRcbiIsIChpbnQpKnAgKTsKKyAgICBkcHJpbnRmX2luZm8ocmVzb3VyY2UsICJzdHJsZW4gPSAlZFxuIiwgKGludCkqcCApOwogICAgIAogICAgIGkgPSBNSU4oYnVmbGVuIC0gMSwgKnApOwogICAgIGlmIChidWZmZXIgPT0gTlVMTCkKQEAgLTU0Nyw3ICs1MzYsNyBAQAogICAgIH0KICAgICBGcmVlUmVzb3VyY2UxNiggaG1lbSApOwogCi0gICAgZHByaW50Zl9yZXNvdXJjZShzdGRkZWIsIkxvYWRTdHJpbmcgLy8gJyVzJyBjb3BpZWQgIVxuIiwgYnVmZmVyKTsKKyAgICBkcHJpbnRmX2luZm8ocmVzb3VyY2UsIkxvYWRTdHJpbmcgLy8gJyVzJyBjb3BpZWQgIVxuIiwgYnVmZmVyKTsKICAgICByZXR1cm4gaTsKIH0KIApAQCAtNTY1LDcgKzU1NCw3IEBACiAKICAgICBpZiAoSElXT1JEKHJlc291cmNlX2lkKT09MHhGRkZGKSAvKiBuZXRzY2FwZSAzIHBhc3NlcyB0aGlzICovCiAJcmVzb3VyY2VfaWQgPSAoVUlOVDMyKSgtKChJTlQzMilyZXNvdXJjZV9pZCkpOwotICAgIGRwcmludGZfcmVzb3VyY2Uoc3RkZGViLCAiTG9hZFN0cmluZzogaW5zdGFuY2UgPSAlMDR4LCBpZCA9ICUwNHgsIGJ1ZmZlciA9ICUwOHgsICIKKyAgICBkcHJpbnRmX2luZm8ocmVzb3VyY2UsICJMb2FkU3RyaW5nOiBpbnN0YW5jZSA9ICUwNHgsIGlkID0gJTA0eCwgYnVmZmVyID0gJTA4eCwgIgogCSAgICJsZW5ndGggPSAlZFxuIiwgaW5zdGFuY2UsIChpbnQpcmVzb3VyY2VfaWQsIChpbnQpIGJ1ZmZlciwgYnVmbGVuKTsKIAogICAgIGhyc3JjID0gRmluZFJlc291cmNlMzJXKCBpbnN0YW5jZSwgKExQQ1dTVFIpKChyZXNvdXJjZV9pZD4+NCkrMSksIApAQCAtNTc5LDcgKzU2OCw3IEBACiAgICAgZm9yIChpID0gMDsgaSA8IHN0cmluZ19udW07IGkrKykKIAlwICs9ICpwICsgMTsKICAgICAKLSAgICBkcHJpbnRmX3Jlc291cmNlKCBzdGRkZWIsICJzdHJsZW4gPSAlZFxuIiwgKGludCkqcCApOworICAgIGRwcmludGZfaW5mbyhyZXNvdXJjZSwgInN0cmxlbiA9ICVkXG4iLCAoaW50KSpwICk7CiAgICAgCiAgICAgaSA9IE1JTihidWZsZW4gLSAxLCAqcCk7CiAgICAgaWYgKGJ1ZmZlciA9PSBOVUxMKQpAQCAtNTk4LDcgKzU4Nyw3IEBACiAjZW5kaWYKICAgICB9CiAjaWYgMAotICAgIGRwcmludGZfcmVzb3VyY2Uoc3RkZGViLCJMb2FkU3RyaW5nIC8vICclcycgY29waWVkICFcbiIsIGJ1ZmZlcik7CisgICAgZHByaW50Zl9pbmZvKHJlc291cmNlLCJMb2FkU3RyaW5nIC8vICclcycgY29waWVkICFcbiIsIGJ1ZmZlcik7CiAjZW5kaWYKICAgICByZXR1cm4gaTsKIH0KQEAgLTY2OSw4ICs2NTgsNyBAQAogCUNIQVIJc3RyWzFdOwogICAgIH0gKnN0cmU7CiAKLSAgICBkcHJpbnRmX3Jlc291cmNlKHN0ZGRlYiwgIkxvYWRNZXNzYWdlOiBpbnN0YW5jZSA9ICUwNHgsIGlkID0gJTA0eCwgYnVmZmVyID0gJTA4eCwgIgotCSAgICJsZW5ndGggPSAlZFxuIiwgaW5zdGFuY2UsIChpbnQpaWQsIChpbnQpIGJ1ZmZlciwgYnVmbGVuKTsKKyAgICBkcHJpbnRmX2luZm8ocmVzb3VyY2UsICJMb2FkTWVzc2FnZTogaW5zdGFuY2UgPSAlMDhseCwgaWQgPSAlMDhseCwgYnVmZmVyID0gJXAsIGxlbmd0aCA9ICVsZFxuIiwgKERXT1JEKWluc3RhbmNlLCAoRFdPUkQpaWQsIGJ1ZmZlciwgKERXT1JEKWJ1Zmxlbik7CiAKICAgICAvKkZJWE1FOiBJIGFtIG5vdCBzdXJlIGFib3V0IHRoZSAnMScgLi4uIEJ1dCBJJ3ZlIG9ubHkgc2VlbiB0aG9zZSBlbnRyaWVzKi8KICAgICBocnNyYyA9IEZpbmRSZXNvdXJjZUV4MzJXKGluc3RhbmNlLChMUFdTVFIpMSwoTFBDV1NUUilSVF9NRVNTQUdFTElTVCxsYW5nKTsKQEAgLTY5OCw3ICs2ODYsNyBAQAogICAgIAlzdHJlID0gKHN0cnVjdCBfc3RyaW5nZW50cnkqKSgoKGNoYXIqKXN0cmUpK3NsZW4pOwogICAgIH0KICAgICBzbGVuPXN0cmUtPmxlbjsKLSAgICBkcHJpbnRmX3Jlc291cmNlKHN0ZGRlYiwiCS0gc3RybGVuPSVkXG4iLHNsZW4pOworICAgIGRwcmludGZfaW5mbyhyZXNvdXJjZSwiCS0gc3RybGVuPSVkXG4iLHNsZW4pOwogICAgIGkgPSBNSU4oYnVmbGVuIC0gMSwgc2xlbik7CiAgICAgaWYgKGJ1ZmZlciA9PSBOVUxMKQogCXJldHVybiBzbGVuOyAvKiBkaWZmZXJlbnQgdG8gTG9hZFN0cmluZyAqLwpAQCAtNzEyLDcgKzcwMCw3IEBACiAJfQogICAgIH0KICAgICBpZiAoYnVmZmVyKQotCSAgICBkcHJpbnRmX3Jlc291cmNlKHN0ZGRlYiwiTG9hZE1lc3NhZ2UgLy8gJyVzJyBjb3BpZWQgIVxuIiwgYnVmZmVyKTsKKwkgICAgZHByaW50Zl9pbmZvKHJlc291cmNlLCJMb2FkTWVzc2FnZSAvLyAnJXMnIGNvcGllZCAhXG4iLCBidWZmZXIpOwogICAgIHJldHVybiBpOwogfQogCkBAIC03NDksMTQgKzczNywxMyBAQAogCiAgICAgaE1vZHVsZSA9IEdldEV4ZVB0ciggaE1vZHVsZSApOwogCi0gICAgZHByaW50Zl9yZXNvdXJjZShzdGRkZWIsICJTZXRSZXNvdXJjZUhhbmRsZXI6IG1vZHVsZT0lMDR4IHR5cGU9IiwgaE1vZHVsZSApOwotICAgIFByaW50SWQoIHMgKTsKLSAgICBkcHJpbnRmX3Jlc291cmNlKCBzdGRkZWIsICJcbiIgKTsKKyAgICBkcHJpbnRmX2luZm8ocmVzb3VyY2UsICJTZXRSZXNvdXJjZUhhbmRsZXI6IG1vZHVsZT0lMDR4IHR5cGU9JXNcbiIsIAorCQkgaE1vZHVsZSwgZGVidWdyZXMoUFRSX1NFR19UT19MSU4ocykpICk7CiAKICAgICBpZiAoKHBNb2R1bGUgPSBNT0RVTEVfR2V0UHRyKCBoTW9kdWxlICkpKQogICAgIHsKIAlpZiAocE1vZHVsZS0+ZmxhZ3MgJiBORV9GRkxBR1NfV0lOMzIpCi0JICAgIGZwcmludGYoc3RkZXJyLCJTZXRSZXNvdXJjZUhhbmRsZXI6ICVzIiwgTkVXaW4zMkZhaWx1cmVTdHJpbmcpOworCSAgICBmcHJpbnRmKHN0ZGVyciwiU2V0UmVzb3VyY2VIYW5kbGVyOiAlc1xuIiwgTkVXaW4zMkZhaWx1cmVTdHJpbmcpOwogCWVsc2UgaWYgKHBNb2R1bGUtPnJlc190YWJsZSkKIAkgICAgcmV0dXJuIE5FX1NldFJlc291cmNlSGFuZGxlciggaE1vZHVsZSwgcywgcmVzb3VyY2VIYW5kbGVyICk7CiAgICAgfQpkaWZmIC0tZ2l0IGEvbG9hZGVyL3NpZ25hbC5jIGIvbG9hZGVyL3NpZ25hbC5jCmluZGV4IDY2ZGVmNWQuLjAwOTJiMjIgMTAwNjQ0Ci0tLSBhL2xvYWRlci9zaWduYWwuYworKysgYi9sb2FkZXIvc2lnbmFsLmMKQEAgLTMzLDYgKzMzLDcgQEAKIAogI2lmIGRlZmluZWQobGludXgpICYmIGRlZmluZWQoX19pMzg2X18pCiAvKiBUaGlzIGlzIHRoZSBzaWdhY3Rpb24gc3RydWN0dXJlIGZyb20gdGhlIExpbnV4IDIuMS4yMCBrZXJuZWwuICAqLworI3VuZGVmIHNhX2hhbmRsZXIKIHN0cnVjdCBrZXJuZWxfc2lnYWN0aW9uCiB7CiAgICAgdm9pZCAoKnNhX2hhbmRsZXIpKCk7CmRpZmYgLS1naXQgYS9sb2FkZXIvdGFzay5jIGIvbG9hZGVyL3Rhc2suYwppbmRleCBlZWVhZWIwLi5jZTU2YjBhIDEwMDY0NAotLS0gYS9sb2FkZXIvdGFzay5jCisrKyBiL2xvYWRlci90YXNrLmMKQEAgLTI5LDcgKzI5LDYgQEAKICNpbmNsdWRlICJ0b29saGVscC5oIgogI2luY2x1ZGUgIndpbm50LmgiCiAjaW5jbHVkZSAidGhyZWFkLmgiCi0jaW5jbHVkZSAic3RkZGVidWcuaCIKICNpbmNsdWRlICJkZWJ1Zy5oIgogI2luY2x1ZGUgImRkZV9wcm9jLmgiCiAKQEAgLTE3Nyw5ICsxNzYsOSBAQAogICAgIC8qIERpc3BsYXkgaXQgKi8KIAogICAgIHAgPSAoY2hhciAqKSBHbG9iYWxMb2NrMTYoIGhhbmRsZSApOwotICAgIGRwcmludGZfdGFzayhzdGRkZWIsICJNYXN0ZXIgRE9TIGVudmlyb25tZW50IGF0ICVwXG4iLCBwKTsKLSAgICBmb3IgKDsgKnA7IHAgKz0gc3RybGVuKHApICsgMSkgZHByaW50Zl90YXNrKHN0ZGRlYiwgIiAgICAlc1xuIiwgcCk7Ci0gICAgZHByaW50Zl90YXNrKCBzdGRkZWIsICJQcm9nbmFtZTogJXNcbiIsIHArMyApOworICAgIGRwcmludGZfaW5mbyh0YXNrLCAiTWFzdGVyIERPUyBlbnZpcm9ubWVudCBhdCAlcFxuIiwgcCk7CisgICAgZm9yICg7ICpwOyBwICs9IHN0cmxlbihwKSArIDEpIGRwcmludGZfaW5mbyh0YXNrLCAiICAgICVzXG4iLCBwKTsKKyAgICBkcHJpbnRmX2luZm8odGFzaywgIlByb2duYW1lOiAlc1xuIiwgcCszICk7CiAKICAgICByZXR1cm4gaGFuZGxlOwogfQpAQCAtMzQ4LDcgKzM0Nyw3IEBACiAKICAgICAgICAgSW5pdEFwcCggcFRhc2stPmhNb2R1bGUgKTsKICAgICAgICAgUEVfSW5pdGlhbGl6ZURMTHMoIFBST0NFU1NfQ3VycmVudCgpLCBETExfUFJPQ0VTU19BVFRBQ0gsIChMUFZPSUQpLTEgKTsKLSAgICAgICAgZHByaW50Zl9yZWxheSggc3RkZGViLCAiQ2FsbFRvMzIoZW50cnlwcm9jPSVwKVxuIiwgZW50cnkgKTsKKyAgICAgICAgZHByaW50Zl9pbmZvKHJlbGF5LCAiQ2FsbFRvMzIoZW50cnlwcm9jPSVwKVxuIiwgZW50cnkgKTsKICAgICAgICAgZXhpdF9jb2RlID0gZW50cnkoKTsKICAgICAgICAgVEFTS19LaWxsQ3VycmVudFRhc2soIGV4aXRfY29kZSApOwogICAgIH0KQEAgLTM3Nyw3ICszNzYsNyBAQAogICAgICAgICBFQ1hfcmVnKCZjb250ZXh0KSA9IHBNb2R1bGUtPmhlYXBfc2l6ZTsKICAgICAgICAgRURJX3JlZygmY29udGV4dCkgPSBjb250ZXh0LlNlZ0RzOwogCi0gICAgICAgIGRwcmludGZfdGFzayggc3RkZGViLCAiU3RhcnRpbmcgbWFpbiBwcm9ncmFtOiBjczppcD0lMDRseDolMDR4IGRzPSUwNGx4IHNzOnNwPSUwNHg6JTA0eFxuIiwKKyAgICAgICAgZHByaW50Zl9pbmZvKHRhc2ssICJTdGFydGluZyBtYWluIHByb2dyYW06IGNzOmlwPSUwNGx4OiUwNHggZHM9JTA0bHggc3M6c3A9JTA0eDolMDR4XG4iLAogICAgICAgICAgICAgICAgICAgICAgIENTX3JlZygmY29udGV4dCksIElQX3JlZygmY29udGV4dCksIERTX3JlZygmY29udGV4dCksCiAgICAgICAgICAgICAgICAgICAgICAgU0VMRUNUT1JPRihwVGFzay0+dGhkYi0+Y3VyX3N0YWNrKSwKICAgICAgICAgICAgICAgICAgICAgICBPRkZTRVRPRihwVGFzay0+dGhkYi0+Y3VyX3N0YWNrKSApOwpAQCAtNTY0LDcgKzU2Myw3IEBACiAKICAgICBUQVNLX0xpbmtUYXNrKCBoVGFzayApOwogCi0gICAgZHByaW50Zl90YXNrKCBzdGRkZWIsICJDcmVhdGVUYXNrOiBtb2R1bGU9JyVzJyBjbWRsaW5lPSclcycgdGFzaz0lMDR4XG4iLAorICAgIGRwcmludGZfaW5mbyh0YXNrLCAiQ3JlYXRlVGFzazogbW9kdWxlPSclcycgY21kbGluZT0nJXMnIHRhc2s9JTA0eFxuIiwKICAgICAgICAgICAgICAgICAgIG5hbWUsIGNtZExpbmUsIGhUYXNrICk7CiAKICAgICByZXR1cm4gaFRhc2s7CkBAIC02MjIsNyArNjIxLDcgQEAKICAgICBUREIqIHBUYXNrID0gKFREQiopIEdsb2JhbExvY2sxNiggaEN1cnJlbnRUYXNrICk7CiAgICAgaWYgKCFwVGFzaykgVVNFUl9FeGl0V2luZG93cygpOyAgLyogTm8gY3VycmVudCB0YXNrIHlldCAqLwogCi0gICAgZHByaW50Zl90YXNrKHN0ZGRlYiwgIktpbGxpbmcgdGFzayAlMDR4XG4iLCBoQ3VycmVudFRhc2sgKTsKKyAgICBkcHJpbnRmX2luZm8odGFzaywgIktpbGxpbmcgdGFzayAlMDR4XG4iLCBoQ3VycmVudFRhc2sgKTsKIAogICAgIC8qIERlbGV0ZSBhY3RpdmUgc29ja2V0cyAqLwogCkBAIC02NDQsNyArNjQzLDcgQEAKIAogICAgIGlmIChuVGFza0NvdW50IDw9IDEpCiAgICAgewotICAgICAgICBkcHJpbnRmX3Rhc2soIHN0ZGRlYiwgIlxudGhpcyBpcyB0aGUgbGFzdCB0YXNrLCBleGl0aW5nXG4iICk7CisgICAgICAgIGRwcmludGZfaW5mbyh0YXNrLCAiXG50aGlzIGlzIHRoZSBsYXN0IHRhc2ssIGV4aXRpbmdcbiIgKTsKICAgICAgICAgVVNFUl9FeGl0V2luZG93cygpOwogICAgIH0KIApAQCAtNzI1LDcgKzcyNCw3IEBACiAgICAgICAgIHsKICAgICAgICAgICAgIHBOZXdUYXNrID0gKFREQiAqKUdsb2JhbExvY2sxNiggaFRhc2sgKTsKIAotCSAgICBkcHJpbnRmX3Rhc2soIHN0ZGRlYiwgIlx0dGFzayA9ICUwNHgsIGV2ZW50cyA9ICVpXG4iLCBoVGFzaywgcE5ld1Rhc2stPm5FdmVudHMpOworCSAgICBkcHJpbnRmX2luZm8odGFzaywgIlx0dGFzayA9ICUwNHgsIGV2ZW50cyA9ICVpXG4iLCBoVGFzaywgcE5ld1Rhc2stPm5FdmVudHMpOwogCiAgICAgICAgICAgICBpZiAocE5ld1Rhc2stPm5FdmVudHMpIGJyZWFrOwogICAgICAgICAgICAgaFRhc2sgPSBwTmV3VGFzay0+aE5leHQ7CkBAIC03NDAsMTEgKzczOSwxMSBAQAogCiAgICAgaWYgKGhUYXNrID09IGhDdXJyZW50VGFzaykgCiAgICAgewotICAgICAgIGRwcmludGZfdGFzayggc3RkZGViLCAicmV0dXJuaW5nIHRvIHRoZSBjdXJyZW50IHRhc2soJTA0eClcbiIsIGhUYXNrICk7CisgICAgICAgZHByaW50Zl9pbmZvKHRhc2ssICJyZXR1cm5pbmcgdG8gdGhlIGN1cnJlbnQgdGFzayglMDR4KVxuIiwgaFRhc2sgKTsKICAgICAgICByZXR1cm47ICAvKiBOb3RoaW5nIHRvIGRvICovCiAgICAgfQogICAgIHBOZXdUYXNrID0gKFREQiAqKUdsb2JhbExvY2sxNiggaFRhc2sgKTsKLSAgICBkcHJpbnRmX3Rhc2soIHN0ZGRlYiwgIlN3aXRjaGluZyB0byB0YXNrICUwNHggKCUuOHMpXG4iLAorICAgIGRwcmludGZfaW5mbyh0YXNrLCAiU3dpdGNoaW5nIHRvIHRhc2sgJTA0eCAoJS44cylcbiIsCiAgICAgICAgICAgICAgICAgICBoVGFzaywgcE5ld1Rhc2stPm1vZHVsZV9uYW1lICk7CiAKICAgICAgLyogTWFrZSB0aGUgdGFzayB0aGUgbGFzdCBpbiB0aGUgbGlua2VkIGxpc3QgKHJvdW5kLXJvYmluIHNjaGVkdWxpbmcpICovCkBAIC0xMDEzLDcgKzEwMTIsNyBAQAogICAgIHRodW5rID0gUFRSX1NFR19UT19MSU4oIHRodW5rYWRkciApOwogICAgIGxmdW5jID0gUFRSX1NFR19UT19MSU4oIGZ1bmMgKTsKIAotICAgIGRwcmludGZfdGFzayggc3RkZGViLCAiTWFrZVByb2NJbnN0YW5jZSglMDhseCwlMDR4KTogZ290IHRodW5rICUwOGx4XG4iLAorICAgIGRwcmludGZfaW5mbyh0YXNrLCAiTWFrZVByb2NJbnN0YW5jZSglMDhseCwlMDR4KTogZ290IHRodW5rICUwOGx4XG4iLAogICAgICAgICAgICAgICAgICAgKERXT1JEKWZ1bmMsIGhJbnN0YW5jZSwgKERXT1JEKXRodW5rYWRkciApOwogICAgIGlmICgoKGxmdW5jWzBdPT0weDhjKSAmJiAobGZ1bmNbMV09PTB4ZDgpKSB8fAogICAgIAkoKGxmdW5jWzBdPT0weDFlKSAmJiAobGZ1bmNbMV09PTB4NTgpKQpAQCAtMTAzNyw3ICsxMDM2LDcgQEAKICAqLwogdm9pZCBXSU5BUEkgRnJlZVByb2NJbnN0YW5jZTE2KCBGQVJQUk9DMTYgZnVuYyApCiB7Ci0gICAgZHByaW50Zl90YXNrKCBzdGRkZWIsICJGcmVlUHJvY0luc3RhbmNlKCUwOGx4KVxuIiwgKERXT1JEKWZ1bmMgKTsKKyAgICBkcHJpbnRmX2luZm8odGFzaywgIkZyZWVQcm9jSW5zdGFuY2UoJTA4bHgpXG4iLCAoRFdPUkQpZnVuYyApOwogICAgIGlmICghX193aW5lbGliKSBUQVNLX0ZyZWVUaHVuayggaEN1cnJlbnRUYXNrLCAoU0VHUFRSKWZ1bmMgKTsKIH0KIApAQCAtMTExOSw3ICsxMTE4LDcgQEAKIAogICAgIGlmICghKHBUYXNrID0gKFREQiAqKUdsb2JhbExvY2sxNiggaEN1cnJlbnRUYXNrICkpKSByZXR1cm47CiAgICAgaWYgKCEocERhdGEgPSAoSU5TVEFOQ0VEQVRBICopR2xvYmFsTG9jazE2KCBzZWcgKSkpIHJldHVybjsKLSAgICBkcHJpbnRmX3Rhc2soIHN0ZGRlYiwgIlN3aXRjaFN0YWNrVG86IG9sZD0lMDR4OiUwNHggbmV3PSUwNHg6JTA0eFxuIiwKKyAgICBkcHJpbnRmX2luZm8odGFzaywgIlN3aXRjaFN0YWNrVG86IG9sZD0lMDR4OiUwNHggbmV3PSUwNHg6JTA0eFxuIiwKICAgICAgICAgICAgICAgICAgIFNFTEVDVE9ST0YoIHBUYXNrLT50aGRiLT5jdXJfc3RhY2sgKSwKICAgICAgICAgICAgICAgICAgIE9GRlNFVE9GKCBwVGFzay0+dGhkYi0+Y3VyX3N0YWNrICksIHNlZywgcHRyICk7CiAKQEAgLTExNjgsNyArMTE2Nyw3IEBACiAgICAgICAgIGZwcmludGYoIHN0ZGVyciwgIlN3aXRjaFN0YWNrQmFjazogbm8gcHJldmlvdXMgU3dpdGNoU3RhY2tUb1xuIiApOwogICAgICAgICByZXR1cm47CiAgICAgfQotICAgIGRwcmludGZfdGFzayggc3RkZGViLCAiU3dpdGNoU3RhY2tCYWNrOiByZXN0b3Jpbmcgc3RhY2sgJTA0eDolMDR4XG4iLAorICAgIGRwcmludGZfaW5mbyh0YXNrLCAiU3dpdGNoU3RhY2tCYWNrOiByZXN0b3Jpbmcgc3RhY2sgJTA0eDolMDR4XG4iLAogICAgICAgICAgICAgICAgICAgU0VMRUNUT1JPRihwRGF0YS0+b2xkX3NzX3NwKSwgT0ZGU0VUT0YocERhdGEtPm9sZF9zc19zcCkgKTsKIAogICAgIG9sZEZyYW1lID0gKFNUQUNLMTZGUkFNRSAqKVBUUl9TRUdfVE9fTElOKCBwVGFzay0+dGhkYi0+Y3VyX3N0YWNrICk7CkBAIC0xMTgyLDcgKzExODEsNyBAQAogCiAgICAgbmV3RnJhbWUgPSAoU1RBQ0sxNkZSQU1FICopUFRSX1NFR19UT19MSU4oIHBUYXNrLT50aGRiLT5jdXJfc3RhY2sgKTsKICAgICBuZXdGcmFtZS0+ZnJhbWUzMiA9IG9sZEZyYW1lLT5mcmFtZTMyOwotICAgIGlmIChkZWJ1Z2dpbmdfcmVsYXkpCisgICAgaWYgKGRlYnVnZ2luZ19pbmZvKHJlbGF5KSkKICAgICB7CiAgICAgICAgIG5ld0ZyYW1lLT5lbnRyeV9pcCA9IG9sZEZyYW1lLT5lbnRyeV9pcDsKICAgICAgICAgbmV3RnJhbWUtPmVudHJ5X2NzID0gb2xkRnJhbWUtPmVudHJ5X2NzOwpAQCAtMTQ0Nyw3ICsxNDQ2LDcgQEAKICAgICBUREIgKnBUYXNrOwogICAgIElOU1RBTkNFREFUQSAqcEluc3REYXRhOwogCi0gICAgZHByaW50Zl90b29saGVscCggc3RkZGViLCAiVGFza05leHQoJXApOiB0YXNrPSUwNHhcbiIsIGxwdGUsIGxwdGUtPmhOZXh0ICk7CisgICAgZHByaW50Zl9pbmZvKHRvb2xoZWxwLCAiVGFza05leHQoJXApOiB0YXNrPSUwNHhcbiIsIGxwdGUsIGxwdGUtPmhOZXh0ICk7CiAgICAgaWYgKCFscHRlLT5oTmV4dCkgcmV0dXJuIEZBTFNFOwogICAgIHBUYXNrID0gKFREQiAqKUdsb2JhbExvY2sxNiggbHB0ZS0+aE5leHQgKTsKICAgICBpZiAoIXBUYXNrIHx8IHBUYXNrLT5tYWdpYyAhPSBUREJfTUFHSUMpIHJldHVybiBGQUxTRTsKZGlmZiAtLWdpdCBhL21lbW9yeS9nbG9iYWwuYyBiL21lbW9yeS9nbG9iYWwuYwppbmRleCA4ZGFmZDQ3Li5hZjMzY2UwIDEwMDY0NAotLS0gYS9tZW1vcnkvZ2xvYmFsLmMKKysrIGIvbWVtb3J5L2dsb2JhbC5jCkBAIC0xOCw3ICsxOCw2IEBACiAjaW5jbHVkZSAiZGRlX21lbS5oIgogI2luY2x1ZGUgInN0YWNrZnJhbWUuaCIKICNpbmNsdWRlICJtb2R1bGUuaCIKLSNpbmNsdWRlICJzdGRkZWJ1Zy5oIgogI2luY2x1ZGUgImRlYnVnLmgiCiAjaW5jbHVkZSAid2luZXJyb3IuaCIKIApAQCAtNTAsNiArNDksNyBAQAogCiAjZGVmaW5lIEdMT0JBTF9NQVhfQUxMT0NfU0laRSAweDAwZmYwMDAwICAvKiBMYXJnZXN0IGFsbG9jYXRpb24gaXMgMTZNIC0gNjRLICovCiAKKyNkZWZpbmUgVkFMSURfSEFORExFKGhhbmRsZSkgKCgoaGFuZGxlKT4+X19BSFNISUZUKTxnbG9iYWxBcmVuYVNpemUpCiAjZGVmaW5lIEdFVF9BUkVOQV9QVFIoaGFuZGxlKSAgKHBHbG9iYWxBcmVuYSArICgoaGFuZGxlKSA+PiBfX0FIU0hJRlQpKQogCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKQEAgLTE2NSw2ICsxNjUsOCBAQAogCiAgICAgaWYgKCFoYW5kbGUpIHJldHVybiBUUlVFOwogICAgIHNlbCA9IEdsb2JhbEhhbmRsZVRvU2VsKCBoYW5kbGUgKTsgCisgICAgaWYgKCFWQUxJRF9IQU5ETEUoc2VsKSkKKyAgICAJcmV0dXJuIEZBTFNFOwogICAgIHBBcmVuYSA9IEdFVF9BUkVOQV9QVFIoc2VsKTsKICAgICBTRUxFQ1RPUl9GcmVlQmxvY2soIHNlbCwgKHBBcmVuYS0+c2l6ZSArIDB4ZmZmZikgLyAweDEwMDAwICk7CiAgICAgbWVtc2V0KCBwQXJlbmEsIDAsIHNpemVvZihHTE9CQUxBUkVOQSkgKTsKQEAgLTE4NCw3ICsxODYsNyBAQAogICAgIEhHTE9CQUwxNiBoYW5kbGU7CiAgICAgU0hNREFUQSBzaG1kYXRhOwogCi0gICAgZHByaW50Zl9nbG9iYWwoIHN0ZGRlYiwgIkdsb2JhbEFsbG9jOiAlbGQgZmxhZ3M9JTA0eFxuIiwgc2l6ZSwgZmxhZ3MgKTsKKyAgICBkcHJpbnRmX2luZm8oZ2xvYmFsLCAiR2xvYmFsQWxsb2M6ICVsZCBmbGFncz0lMDR4XG4iLCBzaXplLCBmbGFncyApOwogCiAgICAgLyogSWYgc2l6ZSBpcyAwLCBjcmVhdGUgYSBkaXNjYXJkZWQgYmxvY2sgKi8KIApAQCAtMjkxLDcgKzI5Myw3IEBACiAgICAgR0xPQkFMQVJFTkEgKnBBcmVuYSwgKnBOZXdBcmVuYTsKICAgICBXT1JEIHNlbCA9IEdsb2JhbEhhbmRsZVRvU2VsKCBoYW5kbGUgKTsKIAotICAgIGRwcmludGZfZ2xvYmFsKCBzdGRkZWIsICJHbG9iYWxSZUFsbG9jMTY6ICUwNHggJWxkIGZsYWdzPSUwNHhcbiIsCisgICAgZHByaW50Zl9pbmZvKGdsb2JhbCwgIkdsb2JhbFJlQWxsb2MxNjogJTA0eCAlbGQgZmxhZ3M9JTA0eFxuIiwKICAgICAgICAgICAgICAgICAgICAgaGFuZGxlLCBzaXplLCBmbGFncyApOwogICAgIGlmICghaGFuZGxlKSByZXR1cm4gMDsKICAgICAKQEAgLTMwNCw2ICszMDYsMTAgQEAKICAgICB9CiAjZW5kaWYgIC8qIENPTkZJR19JUEMgKi8KIAorICAgIGlmICghVkFMSURfSEFORExFKGhhbmRsZSkpIHsKKyAgICAJZnByaW50ZihzdGRlcnIsIiBJbnZhbGlkIGhhbmRsZSAweCUwNHggcGFzc2VkIHRvIEdsb2JhbFJlQWxsb2MxNiFcbiIsaGFuZGxlKTsKKyAgICAJcmV0dXJuIDA7CisgICAgfQogICAgIHBBcmVuYSA9IEdFVF9BUkVOQV9QVFIoIGhhbmRsZSApOwogCiAgICAgICAvKiBEaXNjYXJkIHRoZSBibG9jayBpZiByZXF1ZXN0ZWQgKi8KQEAgLTM0NCw3ICszNTAsNyBAQAogCiAgICAgcHRyID0gKHZvaWQgKilwQXJlbmEtPmJhc2U7CiAgICAgb2xkc2l6ZSA9IHBBcmVuYS0+c2l6ZTsKLSAgICBkcHJpbnRmX2dsb2JhbChzdGRkZWIsIm9sZHNpemUgJTA4bHhcbiIsb2xkc2l6ZSk7CisgICAgZHByaW50Zl9pbmZvKGdsb2JhbCwib2xkc2l6ZSAlMDhseFxuIixvbGRzaXplKTsKICAgICBpZiAocHRyICYmIChzaXplID09IG9sZHNpemUpKSByZXR1cm4gaGFuZGxlOyAgLyogTm90aGluZyB0byBkbyAqLwogCiAgICAgcHRyID0gSGVhcFJlQWxsb2MoIFN5c3RlbUhlYXAsIDAsIHB0ciwgc2l6ZSApOwpAQCAtMzk1LDkgKzQwMSwxNSBAQAogICovCiBIR0xPQkFMMTYgV0lOQVBJIEdsb2JhbEZyZWUxNiggSEdMT0JBTDE2IGhhbmRsZSApCiB7Ci0gICAgdm9pZCAqcHRyID0gKHZvaWQgKilHRVRfQVJFTkFfUFRSKGhhbmRsZSktPmJhc2U7CisgICAgdm9pZCAqcHRyOwogCi0gICAgZHByaW50Zl9nbG9iYWwoIHN0ZGRlYiwgIkdsb2JhbEZyZWUxNjogJTA0eFxuIiwgaGFuZGxlICk7CisgICAgaWYgKCFWQUxJRF9IQU5ETEUoaGFuZGxlKSkgeworICAgIAlmcHJpbnRmKHN0ZGVyciwiIEludmFsaWQgaGFuZGxlIDB4JTA0eCBwYXNzZWQgdG8gR2xvYmFsRnJlZTE2IVxuIixoYW5kbGUpOworICAgIAlyZXR1cm4gMDsKKyAgICB9CisgICAgcHRyID0gKHZvaWQgKilHRVRfQVJFTkFfUFRSKGhhbmRsZSktPmJhc2U7CisKKyAgICBkcHJpbnRmX2luZm8oZ2xvYmFsLCAiR2xvYmFsRnJlZTE2OiAlMDR4XG4iLCBoYW5kbGUgKTsKICAgICBpZiAoIUdMT0JBTF9GcmVlQmxvY2soIGhhbmRsZSApKSByZXR1cm4gaGFuZGxlOyAgLyogZmFpbGVkICovCiAjaWZkZWYgQ09ORklHX0lQQwogICAgIGlmIChpc19kZGVfaGFuZGxlKGhhbmRsZSkpIHJldHVybiBEREVfR2xvYmFsRnJlZShoYW5kbGUpOwpAQCAtNDE0LDcgKzQyNiw3IEBACiAgKi8KIFNFR1BUUiBXSU5BUEkgV0lOMTZfR2xvYmFsTG9jazE2KCBIR0xPQkFMMTYgaGFuZGxlICkKIHsKLSAgICBkcHJpbnRmX2dsb2JhbCggc3RkZGViLCAiV0lOMTZfR2xvYmFsTG9jazE2KCUwNHgpIC0+ICUwOGx4XG4iLAorICAgIGRwcmludGZfaW5mbyhnbG9iYWwsICJXSU4xNl9HbG9iYWxMb2NrMTYoJTA0eCkgLT4gJTA4bHhcbiIsCiAgICAgICAgICAgICAgICAgICAgIGhhbmRsZSwgTUFLRUxPTkcoIDAsIEdsb2JhbEhhbmRsZVRvU2VsKGhhbmRsZSkpICk7CiAgICAgaWYgKGhhbmRsZSkKICAgICB7CkBAIC00MjUsNiArNDM3LDEwIEBACiAJICAgIHJldHVybiBQVFJfU0VHX09GRl9UT19TRUdQVFIoIERERV9HbG9iYWxIYW5kbGVUb1NlbChoYW5kbGUpLCAwICk7CiAjZW5kaWYgIC8qIENPTkZJR19JUEMgKi8KIAorCWlmICghVkFMSURfSEFORExFKGhhbmRsZSkpIHsKKwkgICAgZnByaW50ZihzdGRlcnIsIkludmFsaWQgaGFuZGxlIDB4JTA0eCBwYXNzZWQgdG8gV0lOMTZfR2xvYmFsTG9jazE2IVxuIixoYW5kbGUpOworCSAgICByZXR1cm4gKFNFR1BUUikwOworCX0KIAlpZiAoIUdFVF9BUkVOQV9QVFIoaGFuZGxlKS0+YmFzZSkgcmV0dXJuIChTRUdQVFIpMDsKICAgICAgICAgR0VUX0FSRU5BX1BUUihoYW5kbGUpLT5sb2NrQ291bnQrKzsKIAlyZXR1cm4gUFRSX1NFR19PRkZfVE9fU0VHUFRSKCBHbG9iYWxIYW5kbGVUb1NlbChoYW5kbGUpLCAwICk7CkBAIC00NDIsNiArNDU4LDggQEAKIExQVk9JRCBXSU5BUEkgR2xvYmFsTG9jazE2KCBIR0xPQkFMMTYgaGFuZGxlICkKIHsKICAgICBpZiAoIWhhbmRsZSkgcmV0dXJuIDA7CisgICAgaWYgKCFWQUxJRF9IQU5ETEUoaGFuZGxlKSkKKwlyZXR1cm4gKExQVk9JRCkwOwogICAgIEdFVF9BUkVOQV9QVFIoaGFuZGxlKS0+bG9ja0NvdW50Kys7CiAjaWZkZWYgQ09ORklHX0lQQwogICAgIGlmIChpc19kZGVfaGFuZGxlKGhhbmRsZSkpIHJldHVybiBEREVfQXR0YWNoSGFuZGxlKGhhbmRsZSwgTlVMTCk7CkBAIC00NTYsNyArNDc0LDExIEBACiBCT09MMTYgV0lOQVBJIEdsb2JhbFVubG9jazE2KCBIR0xPQkFMMTYgaGFuZGxlICkKIHsKICAgICBHTE9CQUxBUkVOQSAqcEFyZW5hID0gR0VUX0FSRU5BX1BUUihoYW5kbGUpOwotICAgIGRwcmludGZfZ2xvYmFsKCBzdGRkZWIsICJHbG9iYWxVbmxvY2sxNjogJTA0eFxuIiwgaGFuZGxlICk7CisgICAgaWYgKCFWQUxJRF9IQU5ETEUoaGFuZGxlKSkgeworCWZwcmludGYoc3RkZXJyLCJJbnZhbGlkIGhhbmRsZSAweCUwNHggcGFzc2VkIHRvIEdsb2JhbFVubG9jazE2IVxuIixoYW5kbGUpOworCXJldHVybiAwOworICAgIH0KKyAgICBkcHJpbnRmX2luZm8oZ2xvYmFsLCAiR2xvYmFsVW5sb2NrMTY6ICUwNHhcbiIsIGhhbmRsZSApOwogICAgIGlmIChwQXJlbmEtPmxvY2tDb3VudCkgcEFyZW5hLT5sb2NrQ291bnQtLTsKICAgICByZXR1cm4gcEFyZW5hLT5sb2NrQ291bnQ7CiB9CkBAIC00NjcsOCArNDg5LDEwIEBACiAgKi8KIERXT1JEIFdJTkFQSSBHbG9iYWxTaXplMTYoIEhHTE9CQUwxNiBoYW5kbGUgKQogewotICAgIGRwcmludGZfZ2xvYmFsKCBzdGRkZWIsICJHbG9iYWxTaXplMTY6ICUwNHhcbiIsIGhhbmRsZSApOworICAgIGRwcmludGZfaW5mbyhnbG9iYWwsICJHbG9iYWxTaXplMTY6ICUwNHhcbiIsIGhhbmRsZSApOwogICAgIGlmICghaGFuZGxlKSByZXR1cm4gMDsKKyAgICBpZiAoIVZBTElEX0hBTkRMRShoYW5kbGUpKQorCXJldHVybiAwOwogICAgIHJldHVybiBHRVRfQVJFTkFfUFRSKGhhbmRsZSktPnNpemU7CiB9CiAKQEAgLTQ3OCw3ICs1MDIsMTEgQEAKICAqLwogRFdPUkQgV0lOQVBJIEdsb2JhbEhhbmRsZTE2KCBXT1JEIHNlbCApCiB7Ci0gICAgZHByaW50Zl9nbG9iYWwoIHN0ZGRlYiwgIkdsb2JhbEhhbmRsZTE2OiAlMDR4XG4iLCBzZWwgKTsKKyAgICBkcHJpbnRmX2luZm8oZ2xvYmFsLCAiR2xvYmFsSGFuZGxlMTY6ICUwNHhcbiIsIHNlbCApOworICAgIGlmICghVkFMSURfSEFORExFKHNlbCkpIHsKKwlmcHJpbnRmKHN0ZGVyciwiSW52YWxpZCBoYW5kbGUgMHglMDR4IHBhc3NlZCB0byBHbG9iYWxIYW5kbGUxNiFcbiIsc2VsKTsKKwlyZXR1cm4gMDsKKyAgICB9CiAgICAgcmV0dXJuIE1BS0VMT05HKCBHRVRfQVJFTkFfUFRSKHNlbCktPmhhbmRsZSwgR2xvYmFsSGFuZGxlVG9TZWwoc2VsKSApOwogfQogCkBAIC01MDIsNyArNTMwLDExIEBACiB7CiAgICAgR0xPQkFMQVJFTkEgKnBBcmVuYTsKIAotICAgIGRwcmludGZfZ2xvYmFsKCBzdGRkZWIsICJHbG9iYWxGbGFnczE2OiAlMDR4XG4iLCBoYW5kbGUgKTsKKyAgICBkcHJpbnRmX2luZm8oZ2xvYmFsLCAiR2xvYmFsRmxhZ3MxNjogJTA0eFxuIiwgaGFuZGxlICk7CisgICAgaWYgKCFWQUxJRF9IQU5ETEUoaGFuZGxlKSkgeworCWZwcmludGYoc3RkZXJyLCJJbnZhbGlkIGhhbmRsZSAweCUwNHggcGFzc2VkIHRvIEdsb2JhbEZsYWdzMTYhXG4iLGhhbmRsZSk7CisJcmV0dXJuIDA7CisgICAgfQogICAgIHBBcmVuYSA9IEdFVF9BUkVOQV9QVFIoaGFuZGxlKTsKICAgICByZXR1cm4gcEFyZW5hLT5sb2NrQ291bnQgfAogICAgICAgICAgICAoKHBBcmVuYS0+ZmxhZ3MgJiBHQV9ESVNDQVJEQUJMRSkgPyBHTUVNX0RJU0NBUkRBQkxFIDogMCkgfApAQCAtNTE1LDggKzU0NywxMiBAQAogICovCiBIR0xPQkFMMTYgV0lOQVBJIExvY2tTZWdtZW50MTYoIEhHTE9CQUwxNiBoYW5kbGUgKQogewotICAgIGRwcmludGZfZ2xvYmFsKCBzdGRkZWIsICJMb2NrU2VnbWVudDogJTA0eFxuIiwgaGFuZGxlICk7CisgICAgZHByaW50Zl9pbmZvKGdsb2JhbCwgIkxvY2tTZWdtZW50OiAlMDR4XG4iLCBoYW5kbGUgKTsKICAgICBpZiAoaGFuZGxlID09IChIR0xPQkFMMTYpLTEpIGhhbmRsZSA9IENVUlJFTlRfRFM7CisgICAgaWYgKCFWQUxJRF9IQU5ETEUoaGFuZGxlKSkgeworCWZwcmludGYoc3RkZXJyLCJJbnZhbGlkIGhhbmRsZSAweCUwNHggcGFzc2VkIHRvIExvY2tTZWdtZW50MTYhXG4iLGhhbmRsZSk7CisJcmV0dXJuIDA7CisgICAgfQogICAgIEdFVF9BUkVOQV9QVFIoaGFuZGxlKS0+bG9ja0NvdW50Kys7CiAgICAgcmV0dXJuIGhhbmRsZTsKIH0KQEAgLTUyNyw4ICs1NjMsMTIgQEAKICAqLwogdm9pZCBXSU5BUEkgVW5sb2NrU2VnbWVudDE2KCBIR0xPQkFMMTYgaGFuZGxlICkKIHsKLSAgICBkcHJpbnRmX2dsb2JhbCggc3RkZGViLCAiVW5sb2NrU2VnbWVudDogJTA0eFxuIiwgaGFuZGxlICk7CisgICAgZHByaW50Zl9pbmZvKGdsb2JhbCwgIlVubG9ja1NlZ21lbnQ6ICUwNHhcbiIsIGhhbmRsZSApOwogICAgIGlmIChoYW5kbGUgPT0gKEhHTE9CQUwxNiktMSkgaGFuZGxlID0gQ1VSUkVOVF9EUzsKKyAgICBpZiAoIVZBTElEX0hBTkRMRShoYW5kbGUpKSB7CisJZnByaW50ZihzdGRlcnIsIkludmFsaWQgaGFuZGxlIDB4JTA0eCBwYXNzZWQgdG8gVW5sb2NrU2VnbWVudDE2IVxuIixoYW5kbGUpOworCXJldHVybjsKKyAgICB9CiAgICAgR0VUX0FSRU5BX1BUUihoYW5kbGUpLT5sb2NrQ291bnQtLTsKICAgICAvKiBGSVhNRTogdGhpcyBvdWdodCB0byByZXR1cm4gdGhlIGxvY2sgY291bnQgaW4gQ1ggKGdvIGZpZ3VyZS4uLikgKi8KIH0KQEAgLTU4Myw3ICs2MjMsNyBAQAogICovCiBMT05HIFdJTkFQSSBTZXRTd2FwQXJlYVNpemUxNiggV09SRCBzaXplICkKIHsKLSAgICBkcHJpbnRmX2dsb2JhbChzdGRuaW1wLCAiU1RVQjogU2V0U3dhcEFyZWFTaXplKCVkKVxuIiwgc2l6ZSApOworICAgIGRwcmludGZfZml4bWUoZ2xvYmFsLCAiU1RVQjogU2V0U3dhcEFyZWFTaXplKCVkKVxuIiwgc2l6ZSApOwogICAgIHJldHVybiBNQUtFTE9ORyggc2l6ZSwgMHhmZmZmICk7CiB9CiAKQEAgLTU5Myw3ICs2MzMsNyBAQAogICovCiBIR0xPQkFMMTYgV0lOQVBJIEdsb2JhbExSVU9sZGVzdCggSEdMT0JBTDE2IGhhbmRsZSApCiB7Ci0gICAgZHByaW50Zl9nbG9iYWwoIHN0ZGRlYiwgIkdsb2JhbExSVU9sZGVzdDogJTA0eFxuIiwgaGFuZGxlICk7CisgICAgZHByaW50Zl9pbmZvKGdsb2JhbCwgIkdsb2JhbExSVU9sZGVzdDogJTA0eFxuIiwgaGFuZGxlICk7CiAgICAgaWYgKGhhbmRsZSA9PSAoSEdMT0JBTDE2KS0xKSBoYW5kbGUgPSBDVVJSRU5UX0RTOwogICAgIHJldHVybiBoYW5kbGU7CiB9CkBAIC02MDQsNyArNjQ0LDcgQEAKICAqLwogSEdMT0JBTDE2IFdJTkFQSSBHbG9iYWxMUlVOZXdlc3QoIEhHTE9CQUwxNiBoYW5kbGUgKQogewotICAgIGRwcmludGZfZ2xvYmFsKCBzdGRkZWIsICJHbG9iYWxMUlVOZXdlc3Q6ICUwNHhcbiIsIGhhbmRsZSApOworICAgIGRwcmludGZfaW5mbyhnbG9iYWwsICJHbG9iYWxMUlVOZXdlc3Q6ICUwNHhcbiIsIGhhbmRsZSApOwogICAgIGlmIChoYW5kbGUgPT0gKEhHTE9CQUwxNiktMSkgaGFuZGxlID0gQ1VSUkVOVF9EUzsKICAgICByZXR1cm4gaGFuZGxlOwogfQpAQCAtNjYyLDcgKzcwMiwxMSBAQAogICovCiBXT1JEIFdJTkFQSSBHbG9iYWxQYWdlTG9jayggSEdMT0JBTDE2IGhhbmRsZSApCiB7Ci0gICAgZHByaW50Zl9nbG9iYWwoIHN0ZGRlYiwgIkdsb2JhbFBhZ2VMb2NrOiAlMDR4XG4iLCBoYW5kbGUgKTsKKyAgICBkcHJpbnRmX2luZm8oZ2xvYmFsLCAiR2xvYmFsUGFnZUxvY2s6ICUwNHhcbiIsIGhhbmRsZSApOworICAgIGlmICghVkFMSURfSEFORExFKGhhbmRsZSkpIHsKKwlmcHJpbnRmKHN0ZGVyciwiSW52YWxpZCBoYW5kbGUgMHglMDR4IHBhc3NlZCB0byBHbG9iYWxQYWdlTG9jayFcbiIsaGFuZGxlKTsKKwlyZXR1cm4gMDsKKyAgICB9CiAgICAgcmV0dXJuICsrKEdFVF9BUkVOQV9QVFIoaGFuZGxlKS0+cGFnZUxvY2tDb3VudCk7CiB9CiAKQEAgLTY3Miw3ICs3MTYsMTEgQEAKICAqLwogV09SRCBXSU5BUEkgR2xvYmFsUGFnZVVubG9jayggSEdMT0JBTDE2IGhhbmRsZSApCiB7Ci0gICAgZHByaW50Zl9nbG9iYWwoIHN0ZGRlYiwgIkdsb2JhbFBhZ2VVbmxvY2s6ICUwNHhcbiIsIGhhbmRsZSApOworICAgIGRwcmludGZfaW5mbyhnbG9iYWwsICJHbG9iYWxQYWdlVW5sb2NrOiAlMDR4XG4iLCBoYW5kbGUgKTsKKyAgICBpZiAoIVZBTElEX0hBTkRMRShoYW5kbGUpKSB7CisJZnByaW50ZihzdGRlcnIsIkludmFsaWQgaGFuZGxlIDB4JTA0eCBwYXNzZWQgdG8gR2xvYmFsUGFnZVVubG9jayFcbiIsaGFuZGxlKTsKKwlyZXR1cm4gMDsKKyAgICB9CiAgICAgcmV0dXJuIC0tKEdFVF9BUkVOQV9QVFIoaGFuZGxlKS0+cGFnZUxvY2tDb3VudCk7CiB9CiAKQEAgLTY4Miw3ICs3MzAsMTEgQEAKICAqLwogdm9pZCBXSU5BUEkgR2xvYmFsRml4MTYoIEhHTE9CQUwxNiBoYW5kbGUgKQogewotICAgIGRwcmludGZfZ2xvYmFsKCBzdGRkZWIsICJHbG9iYWxGaXgxNjogJTA0eFxuIiwgaGFuZGxlICk7CisgICAgZHByaW50Zl9pbmZvKGdsb2JhbCwgIkdsb2JhbEZpeDE2OiAlMDR4XG4iLCBoYW5kbGUgKTsKKyAgICBpZiAoIVZBTElEX0hBTkRMRShoYW5kbGUpKSB7CisJZnByaW50ZihzdGRlcnIsIkludmFsaWQgaGFuZGxlIDB4JTA0eCBwYXNzZWQgdG8gR2xvYmFsRml4MTYhXG4iLGhhbmRsZSk7CisJcmV0dXJuOworICAgIH0KICAgICBHRVRfQVJFTkFfUFRSKGhhbmRsZSktPmxvY2tDb3VudCsrOwogfQogCkBAIC02OTIsNyArNzQ0LDExIEBACiAgKi8KIHZvaWQgV0lOQVBJIEdsb2JhbFVuZml4MTYoIEhHTE9CQUwxNiBoYW5kbGUgKQogewotICAgIGRwcmludGZfZ2xvYmFsKCBzdGRkZWIsICJHbG9iYWxVbmZpeDE2OiAlMDR4XG4iLCBoYW5kbGUgKTsKKyAgICBkcHJpbnRmX2luZm8oZ2xvYmFsLCAiR2xvYmFsVW5maXgxNjogJTA0eFxuIiwgaGFuZGxlICk7CisgICAgaWYgKCFWQUxJRF9IQU5ETEUoaGFuZGxlKSkgeworCWZwcmludGYoc3RkZXJyLCJJbnZhbGlkIGhhbmRsZSAweCUwNHggcGFzc2VkIHRvIEdsb2JhbFVuZml4MTYhXG4iLGhhbmRsZSk7CisJcmV0dXJuOworICAgIH0KICAgICBHRVRfQVJFTkFfUFRSKGhhbmRsZSktPmxvY2tDb3VudC0tOwogfQogCkBAIC03MDIsNiArNzU4LDEwIEBACiAgKi8KIHZvaWQgV0lOQVBJIEZhclNldE93bmVyKCBIR0xPQkFMMTYgaGFuZGxlLCBIQU5ETEUxNiBoT3duZXIgKQogeworICAgIGlmICghVkFMSURfSEFORExFKGhhbmRsZSkpIHsKKwlmcHJpbnRmKHN0ZGVyciwiSW52YWxpZCBoYW5kbGUgMHglMDR4IHBhc3NlZCB0byBGYXJTZXRPd25lciFcbiIsaGFuZGxlKTsKKwlyZXR1cm47CisgICAgfQogICAgIEdFVF9BUkVOQV9QVFIoaGFuZGxlKS0+aE93bmVyID0gaE93bmVyOwogfQogCkBAIC03MTEsNiArNzcxLDEwIEBACiAgKi8KIEhBTkRMRTE2IFdJTkFQSSBGYXJHZXRPd25lciggSEdMT0JBTDE2IGhhbmRsZSApCiB7CisgICAgaWYgKCFWQUxJRF9IQU5ETEUoaGFuZGxlKSkgeworCWZwcmludGYoc3RkZXJyLCJJbnZhbGlkIGhhbmRsZSAweCUwNHggcGFzc2VkIHRvIEZhckdldE93bmVyIVxuIixoYW5kbGUpOworCXJldHVybiAwOworICAgIH0KICAgICByZXR1cm4gR0VUX0FSRU5BX1BUUihoYW5kbGUpLT5oT3duZXI7CiB9CiAKQEAgLTcyMCwxMSArNzg0LDE1IEBACiAgKi8KIFdPUkQgV0lOQVBJIEdsb2JhbEhhbmRsZVRvU2VsKCBIR0xPQkFMMTYgaGFuZGxlICkKIHsKLSAgICBkcHJpbnRmX3Rvb2xoZWxwKCBzdGRkZWIsICJHbG9iYWxIYW5kbGVUb1NlbDogJTA0eFxuIiwgaGFuZGxlICk7CisgICAgZHByaW50Zl9pbmZvKHRvb2xoZWxwLCAiR2xvYmFsSGFuZGxlVG9TZWw6ICUwNHhcbiIsIGhhbmRsZSApOwogICAgIGlmICghaGFuZGxlKSByZXR1cm4gMDsKICNpZmRlZiBDT05GSUdfSVBDCiAgICAgaWYgKGlzX2RkZV9oYW5kbGUoaGFuZGxlKSkgcmV0dXJuIERERV9HbG9iYWxIYW5kbGVUb1NlbChoYW5kbGUpOwogI2VuZGlmCisgICAgaWYgKCFWQUxJRF9IQU5ETEUoaGFuZGxlKSkgeworCWZwcmludGYoc3RkZXJyLCJJbnZhbGlkIGhhbmRsZSAweCUwNHggcGFzc2VkIHRvIEdsb2JhbEhhbmRsZVRvU2VsIVxuIixoYW5kbGUpOworCXJldHVybiAwOworICAgIH0KICAgICBpZiAoIShoYW5kbGUgJiA3KSkKICAgICB7CiAgICAgICAgIGZwcmludGYoIHN0ZGVyciwgIlByb2dyYW0gYXR0ZW1wdGVkIGludmFsaWQgc2VsZWN0b3IgY29udmVyc2lvblxuIiApOwpAQCAtOTYxLDcgKzEwMjksNyBAQAogICAgfQogICAgZWxzZQogICAgewotICAgICAgZHByaW50Zl9nbG9iYWwoc3RkZGViLCAiR2xvYmFsTG9jazMyOiBpbnZhbGlkIGhhbmRsZVxuIik7CisgICAgICBkcHJpbnRmX3dhcm4oZ2xvYmFsLCAiR2xvYmFsTG9jazMyOiBpbnZhbGlkIGhhbmRsZVxuIik7CiAgICAgICBwYWxsb2M9KExQVk9JRCkgTlVMTDsKICAgIH0KICAgIC8qIEhlYXBVbmxvY2soR2V0UHJvY2Vzc0hlYXAoKSk7ICovOwpAQCAtOTkyLDcgKzEwNjAsNyBAQAogICAgfQogICAgZWxzZQogICAgewotICAgICAgZHByaW50Zl9nbG9iYWwoc3RkZGViLCAiR2xvYmFsVW5sb2NrMzI6IGludmFsaWQgaGFuZGxlXG4iKTsKKyAgICAgIGRwcmludGZfd2FybihnbG9iYWwsICJHbG9iYWxVbmxvY2szMjogaW52YWxpZCBoYW5kbGVcbiIpOwogICAgICAgbG9ja2VkPUZBTFNFOwogICAgfQogICAgLyogSGVhcFVubG9jayhHZXRQcm9jZXNzSGVhcCgpKTsgKi8KQEAgLTExNjUsNyArMTIzMyw3IEBACiAgICAgICB9CiAgICAgICBlbHNlCiAgICAgICB7Ci0JIGRwcmludGZfZ2xvYmFsKHN0ZGRlYiwgIkdsb2JhbFNpemUzMjogaW52YWxpZCBoYW5kbGVcbiIpOworCSBkcHJpbnRmX3dhcm4oZ2xvYmFsLCAiR2xvYmFsU2l6ZTMyOiBpbnZhbGlkIGhhbmRsZVxuIik7CiAJIHJldHZhbD0wOwogICAgICAgfQogICAgICAgLyogSGVhcFVubG9jayhHZXRQcm9jZXNzSGVhcCgpKTsgKi8KQEAgLTEyMzQsNyArMTMwMiw3IEBACiAgICAgICB9CiAgICAgICBlbHNlCiAgICAgICB7Ci0JIGRwcmludGZfZ2xvYmFsKHN0ZGRlYiwiR2xvYmFsRmxhZ3MzMjogaW52YWxpZCBoYW5kbGVcbiIpOworCSBkcHJpbnRmX3dhcm4oZ2xvYmFsLCJHbG9iYWxGbGFnczMyOiBpbnZhbGlkIGhhbmRsZVxuIik7CiAJIHJldHZhbD0wOwogICAgICAgfQogICAgICAgLyogSGVhcFVubG9jayhHZXRQcm9jZXNzSGVhcCgpKTsgKi8KQEAgLTEzMjQsMyArMTM5MiwxNCBAQAogICAgIGlmIChobWVtKSAqaG1lbSA9IHhobWVtOwogICAgIHJldHVybiBXSU4xNl9HbG9iYWxMb2NrMTYoeGhtZW0pOwogfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogICAgICAgICAgIFdPV0dsb2JhbFVubG9ja0ZyZWUgKEtFUk5FTDMyLjY0KQorICoKKyAqIENvbWJpbmVkIEdsb2JhbFVubG9jayBhbmQgR2xvYmFsRnJlZS4KKyAqLworV09SRCBXT1dHbG9iYWxVbmxvY2tGcmVlMTYoRFdPUkQgdnBtZW0pIHsKKyAgICBpZiAoIUdsb2JhbFVubG9jazE2KEhJV09SRCh2cG1lbSkpKQorICAgIAlyZXR1cm4gMDsKKyAgICByZXR1cm4gR2xvYmFsRnJlZTE2KEhJV09SRCh2cG1lbSkpOworfQpkaWZmIC0tZ2l0IGEvbWVtb3J5L2hlYXAuYyBiL21lbW9yeS9oZWFwLmMKaW5kZXggOTkwNGIzZC4uNjQ5OTE3MiAxMDA2NDQKLS0tIGEvbWVtb3J5L2hlYXAuYworKysgYi9tZW1vcnkvaGVhcC5jCkBAIC0xNCw3ICsxNCw2IEBACiAjaW5jbHVkZSAid2luZXJyb3IuaCIKICNpbmNsdWRlICJ3aW5udC5oIgogI2luY2x1ZGUgImhlYXAuaCIKLSNpbmNsdWRlICJzdGRkZWJ1Zy5oIgogI2luY2x1ZGUgImRlYnVnLmgiCiAKIC8qIE5vdGU6IHRoZSBoZWFwIGRhdGEgc3RydWN0dXJlcyBhcmUgYmFzZWQgb24gd2hhdCBQaWV0cmVrIGRlc2NyaWJlcyBpbiBoaXMKQEAgLTE4OSw3ICsxODgsNyBAQAogICAgICAgICBTZXRMYXN0RXJyb3IoIEVSUk9SX0lOVkFMSURfSEFORExFICk7CiAgICAgICAgIHJldHVybiBOVUxMOwogICAgIH0KLSAgICBpZiAoZGVidWdnaW5nX2hlYXAgJiYgIUhlYXBWYWxpZGF0ZSggaGVhcCwgMCwgTlVMTCApKQorICAgIGlmIChkZWJ1Z2dpbmdfaW5mbyhoZWFwKSAmJiAhSGVhcFZhbGlkYXRlKCBoZWFwLCAwLCBOVUxMICkpCiAgICAgewogICAgICAgICBIRUFQX0R1bXAoIGhlYXBQdHIgKTsKICAgICAgICAgYXNzZXJ0KCBGQUxTRSApOwpAQCAtMzAzLDcgKzMwMiw3IEBACiAKICAgICAvKiBJZiBkZWJ1Z2dpbmcsIGVyYXNlIHRoZSBmcmVlZCBibG9jayBjb250ZW50ICovCiAKLSAgICBpZiAoZGVidWdnaW5nX2hlYXApCisgICAgaWYgKGRlYnVnZ2luZ19pbmZvKGhlYXApKQogICAgIHsKICAgICAgICAgY2hhciAqcEVuZCA9IChjaGFyICopcHRyICsgc2l6ZTsKICAgICAgICAgaWYgKHBFbmQgPiAoY2hhciAqKXN1YmhlYXAgKyBzdWJoZWFwLT5jb21taXRTaXplKQpAQCAtMzIyLDcgKzMyMSw3IEBACiAgICAgICAgIHBOZXh0LT5uZXh0LT5wcmV2ID0gcE5leHQtPnByZXY7CiAgICAgICAgIHBOZXh0LT5wcmV2LT5uZXh0ID0gcE5leHQtPm5leHQ7CiAgICAgICAgIHNpemUgKz0gKHBOZXh0LT5zaXplICYgQVJFTkFfU0laRV9NQVNLKSArIHNpemVvZigqcE5leHQpOwotICAgICAgICBpZiAoZGVidWdnaW5nX2hlYXApCisgICAgICAgIGlmIChkZWJ1Z2dpbmdfaW5mbyhoZWFwKSkKICAgICAgICAgICAgIG1lbXNldCggcE5leHQsIEFSRU5BX0ZSRUVfRklMTEVSLCBzaXplb2YoQVJFTkFfRlJFRSkgKTsKICAgICB9CiAKQEAgLTU0MSw3ICs1NDAsNyBAQAogICAgIHN1YmhlYXAtPm5leHQgPSBoZWFwLT5zdWJoZWFwLm5leHQ7CiAgICAgaGVhcC0+c3ViaGVhcC5uZXh0ID0gc3ViaGVhcDsKICAgICBzaXplID0gc3ViaGVhcC0+c2l6ZTsKLSAgICBkcHJpbnRmX2hlYXAoIHN0ZGRlYiwgIkhFQVBfRmluZEZyZWVCbG9jazogY3JlYXRlZCBuZXcgc3ViLWhlYXAgJTA4bHggb2YgJTA4bHggYnl0ZXMgZm9yIGhlYXAgJTA4bHhcbiIsCisgICAgZHByaW50Zl9pbmZvKGhlYXAsICJIRUFQX0ZpbmRGcmVlQmxvY2s6IGNyZWF0ZWQgbmV3IHN1Yi1oZWFwICUwOGx4IG9mICUwOGx4IGJ5dGVzIGZvciBoZWFwICUwOGx4XG4iLAogICAgICAgICAgICAgICAgICAgKERXT1JEKXN1YmhlYXAsIHNpemUsIChEV09SRCloZWFwICk7CiAKICAgICBIRUFQX0NyZWF0ZUZyZWVCbG9jayggc3ViaGVhcCwgc3ViaGVhcCArIDEsIHNpemUgLSBzaXplb2YoKnN1YmhlYXApICk7CkBAIC04NTEsNyArODUwLDcgQEAKICAgICBIRUFQICpoZWFwUHRyID0gSEVBUF9HZXRQdHIoIGhlYXAgKTsKICAgICBTVUJIRUFQICpzdWJoZWFwOwogCi0gICAgZHByaW50Zl9oZWFwKCBzdGRkZWIsICJIZWFwRGVzdHJveTogJTA4eFxuIiwgaGVhcCApOworICAgIGRwcmludGZfaW5mbyhoZWFwLCAiSGVhcERlc3Ryb3k6ICUwOHhcbiIsIGhlYXAgKTsKICAgICBpZiAoIWhlYXBQdHIpIHJldHVybiBGQUxTRTsKIAogICAgIERlbGV0ZUNyaXRpY2FsU2VjdGlvbiggJmhlYXBQdHItPmNyaXRTZWN0aW9uICk7CkBAIC04OTAsNyArODg5LDcgQEAKIAogICAgIGlmICghKHBBcmVuYSA9IEhFQVBfRmluZEZyZWVCbG9jayggaGVhcFB0ciwgc2l6ZSwgJnN1YmhlYXAgKSkpCiAgICAgewotICAgICAgICBkcHJpbnRmX2hlYXAoIHN0ZGRlYiwgIkhlYXBBbGxvYyglMDh4LCUwOGx4LCUwOGx4KTogcmV0dXJuaW5nIE5VTExcbiIsCisgICAgICAgIGRwcmludGZfaW5mbyhoZWFwLCAiSGVhcEFsbG9jKCUwOHgsJTA4bHgsJTA4bHgpOiByZXR1cm5pbmcgTlVMTFxuIiwKICAgICAgICAgICAgICAgICAgIGhlYXAsIGZsYWdzLCBzaXplICApOwogICAgICAgICBpZiAoIShmbGFncyAmIEhFQVBfTk9fU0VSSUFMSVpFKSkgSGVhcFVubG9jayggaGVhcCApOwogICAgICAgICBTZXRMYXN0RXJyb3IoIEVSUk9SX0NPTU1JVE1FTlRfTElNSVQgKTsKQEAgLTkxNiwxMSArOTE1LDExIEBACiAgICAgSEVBUF9TaHJpbmtCbG9jayggc3ViaGVhcCwgcEluVXNlLCBzaXplICk7CiAKICAgICBpZiAoZmxhZ3MgJiBIRUFQX1pFUk9fTUVNT1JZKSBtZW1zZXQoIHBJblVzZSArIDEsIDAsIHNpemUgKTsKLSAgICBlbHNlIGlmIChkZWJ1Z2dpbmdfaGVhcCkgbWVtc2V0KCBwSW5Vc2UgKyAxLCBBUkVOQV9JTlVTRV9GSUxMRVIsIHNpemUgKTsKKyAgICBlbHNlIGlmIChkZWJ1Z2dpbmdfaW5mbyhoZWFwKSkgbWVtc2V0KCBwSW5Vc2UgKyAxLCBBUkVOQV9JTlVTRV9GSUxMRVIsIHNpemUgKTsKIAogICAgIGlmICghKGZsYWdzICYgSEVBUF9OT19TRVJJQUxJWkUpKSBIZWFwVW5sb2NrKCBoZWFwICk7CiAKLSAgICBkcHJpbnRmX2hlYXAoIHN0ZGRlYiwgIkhlYXBBbGxvYyglMDh4LCUwOGx4LCUwOGx4KTogcmV0dXJuaW5nICUwOGx4XG4iLAorICAgIGRwcmludGZfaW5mbyhoZWFwLCAiSGVhcEFsbG9jKCUwOHgsJTA4bHgsJTA4bHgpOiByZXR1cm5pbmcgJTA4bHhcbiIsCiAgICAgICAgICAgICAgICAgICBoZWFwLCBmbGFncywgc2l6ZSwgKERXT1JEKShwSW5Vc2UgKyAxKSApOwogICAgIHJldHVybiAoTFBWT0lEKShwSW5Vc2UgKyAxKTsKIH0KQEAgLTk0NSw3ICs5NDQsNyBAQAogICAgIHsKICAgICAgICAgaWYgKCEoZmxhZ3MgJiBIRUFQX05PX1NFUklBTElaRSkpIEhlYXBVbmxvY2soIGhlYXAgKTsKICAgICAgICAgU2V0TGFzdEVycm9yKCBFUlJPUl9JTlZBTElEX1BBUkFNRVRFUiApOwotICAgICAgICBkcHJpbnRmX2hlYXAoIHN0ZGRlYiwgIkhlYXBGcmVlKCUwOHgsJTA4bHgsJTA4bHgpOiByZXR1cm5pbmcgRkFMU0VcbiIsCisgICAgICAgIGRwcmludGZfaW5mbyhoZWFwLCAiSGVhcEZyZWUoJTA4eCwlMDhseCwlMDhseCk6IHJldHVybmluZyBGQUxTRVxuIiwKICAgICAgICAgICAgICAgICAgICAgICBoZWFwLCBmbGFncywgKERXT1JEKXB0ciApOwogICAgICAgICByZXR1cm4gRkFMU0U7CiAgICAgfQpAQCAtOTU5LDcgKzk1OCw3IEBACiAgICAgaWYgKCEoZmxhZ3MgJiBIRUFQX05PX1NFUklBTElaRSkpIEhlYXBVbmxvY2soIGhlYXAgKTsKIC8qICAgIFNldExhc3RFcnJvciggMCApOyAqLwogCi0gICAgZHByaW50Zl9oZWFwKCBzdGRkZWIsICJIZWFwRnJlZSglMDh4LCUwOGx4LCUwOGx4KTogcmV0dXJuaW5nIFRSVUVcbiIsCisgICAgZHByaW50Zl9pbmZvKGhlYXAsICJIZWFwRnJlZSglMDh4LCUwOGx4LCUwOGx4KTogcmV0dXJuaW5nIFRSVUVcbiIsCiAgICAgICAgICAgICAgICAgICBoZWFwLCBmbGFncywgKERXT1JEKXB0ciApOwogICAgIHJldHVybiBUUlVFOwogfQpAQCAtOTkxLDcgKzk5MCw3IEBACiAgICAgewogICAgICAgICBpZiAoIShmbGFncyAmIEhFQVBfTk9fU0VSSUFMSVpFKSkgSGVhcFVubG9jayggaGVhcCApOwogICAgICAgICBTZXRMYXN0RXJyb3IoIEVSUk9SX0lOVkFMSURfUEFSQU1FVEVSICk7Ci0gICAgICAgIGRwcmludGZfaGVhcCggc3RkZGViLCAiSGVhcFJlQWxsb2MoJTA4eCwlMDhseCwlMDhseCwlMDhseCk6IHJldHVybmluZyBOVUxMXG4iLAorICAgICAgICBkcHJpbnRmX2luZm8oaGVhcCwgIkhlYXBSZUFsbG9jKCUwOHgsJTA4bHgsJTA4bHgsJTA4bHgpOiByZXR1cm5pbmcgTlVMTFxuIiwKICAgICAgICAgICAgICAgICAgICAgICBoZWFwLCBmbGFncywgKERXT1JEKXB0ciwgc2l6ZSApOwogICAgICAgICByZXR1cm4gTlVMTDsKICAgICB9CkBAIC0xMDY1LDcgKzEwNjQsNyBAQAogICAgICAgICBpZiAoZmxhZ3MgJiBIRUFQX1pFUk9fTUVNT1JZKQogICAgICAgICAgICAgbWVtc2V0KCAoY2hhciAqKShwQXJlbmEgKyAxKSArIG9sZFNpemUsIDAsCiAgICAgICAgICAgICAgICAgICAgIChwQXJlbmEtPnNpemUgJiBBUkVOQV9TSVpFX01BU0spIC0gb2xkU2l6ZSApOwotICAgICAgICBlbHNlIGlmIChkZWJ1Z2dpbmdfaGVhcCkKKyAgICAgICAgZWxzZSBpZiAoZGVidWdnaW5nX2luZm8oaGVhcCkpCiAgICAgICAgICAgICBtZW1zZXQoIChjaGFyICopKHBBcmVuYSArIDEpICsgb2xkU2l6ZSwgQVJFTkFfSU5VU0VfRklMTEVSLAogICAgICAgICAgICAgICAgICAgICAocEFyZW5hLT5zaXplICYgQVJFTkFfU0laRV9NQVNLKSAtIG9sZFNpemUgKTsKICAgICB9CkBAIC0xMDc1LDcgKzEwNzQsNyBAQAogICAgIHBBcmVuYS0+Y2FsbGVyRUlQID0gKigoRFdPUkQgKikmaGVhcCAtIDEpOyAgLyogaGFjayBoYWNrICovCiAgICAgaWYgKCEoZmxhZ3MgJiBIRUFQX05PX1NFUklBTElaRSkpIEhlYXBVbmxvY2soIGhlYXAgKTsKIAotICAgIGRwcmludGZfaGVhcCggc3RkZGViLCAiSGVhcFJlQWxsb2MoJTA4eCwlMDhseCwlMDhseCwlMDhseCk6IHJldHVybmluZyAlMDhseFxuIiwKKyAgICBkcHJpbnRmX2luZm8oaGVhcCwgIkhlYXBSZUFsbG9jKCUwOHgsJTA4bHgsJTA4bHgsJTA4bHgpOiByZXR1cm5pbmcgJTA4bHhcbiIsCiAgICAgICAgICAgICAgICAgICBoZWFwLCBmbGFncywgKERXT1JEKXB0ciwgc2l6ZSwgKERXT1JEKShwQXJlbmEgKyAxKSApOwogICAgIHJldHVybiAoTFBWT0lEKShwQXJlbmEgKyAxKTsKIH0KQEAgLTExMzgsNyArMTEzNyw3IEBACiAgICAgfQogICAgIGlmICghKGZsYWdzICYgSEVBUF9OT19TRVJJQUxJWkUpKSBIZWFwVW5sb2NrKCBoZWFwICk7CiAKLSAgICBkcHJpbnRmX2hlYXAoIHN0ZGRlYiwgIkhlYXBTaXplKCUwOHgsJTA4bHgsJTA4bHgpOiByZXR1cm5pbmcgJTA4bHhcbiIsCisgICAgZHByaW50Zl9pbmZvKGhlYXAsICJIZWFwU2l6ZSglMDh4LCUwOGx4LCUwOGx4KTogcmV0dXJuaW5nICUwOGx4XG4iLAogICAgICAgICAgICAgICAgICAgaGVhcCwgZmxhZ3MsIChEV09SRClwdHIsIHJldCApOwogICAgIHJldHVybiByZXQ7CiB9CmRpZmYgLS1naXQgYS9tZW1vcnkvbGR0LmMgYi9tZW1vcnkvbGR0LmMKaW5kZXggNTAxNzFiMC4uNTVhMjg3NSAxMDA2NDQKLS0tIGEvbWVtb3J5L2xkdC5jCisrKyBiL21lbW9yeS9sZHQuYwpAQCAtMTAsNyArMTAsNiBAQAogI2luY2x1ZGUgPHN0cmluZy5oPgogI2luY2x1ZGUgPGVycm5vLmg+CiAjaW5jbHVkZSAibGR0LmgiCi0jaW5jbHVkZSAic3RkZGVidWcuaCIKICNpbmNsdWRlICJkZWJ1Zy5oIgogCiAjaWZkZWYgX19pMzg2X18KQEAgLTE0OCw3ICsxNDcsNyBAQAogewogICAgIGludCByZXQgPSAwOwogCi0gICAgZHByaW50Zl9sZHQoc3RkZGViLAorICAgIGRwcmludGZfaW5mbyhsZHQsCiAJICAiTERUX1NldEVudHJ5OiBlbnRyeT0lMDR4IGJhc2U9JTA4bHggbGltaXQ9JTA1bHggJXMgJWQtYml0IGZsYWdzPSVjJWMlY1xuIiwKICAgICAgICAgICBlbnRyeSwgY29udGVudC0+YmFzZSwgY29udGVudC0+bGltaXQsCiAgICAgICAgICAgY29udGVudC0+bGltaXRfaW5fcGFnZXMgPyAicGFnZXMiIDogImJ5dGVzIiwKZGlmZiAtLWdpdCBhL21lbW9yeS9sb2NhbC5jIGIvbWVtb3J5L2xvY2FsLmMKaW5kZXggY2I1NzJlOC4uMmViY2EzMCAxMDA2NDQKLS0tIGEvbWVtb3J5L2xvY2FsLmMKKysrIGIvbWVtb3J5L2xvY2FsLmMKQEAgLTI0LDcgKzI0LDYgQEAKICNpbmNsdWRlICJtb2R1bGUuaCIKICNpbmNsdWRlICJzdGFja2ZyYW1lLmgiCiAjaW5jbHVkZSAidG9vbGhlbHAuaCIKLSNpbmNsdWRlICJzdGRkZWJ1Zy5oIgogI2luY2x1ZGUgImRlYnVnLmgiCiAKIC8qIG5lZWRlZCBvbmx5ICBmb3IgR0RJX0hlYXBTZWwgYW5kIFVTRVJfSGVhcFNlbCAqLwpAQCAtMTI2LDcgKzEyNSw3IEBACiB7CiAgICAgTE9DQUxIRUFQSU5GTyAqcEluZm87CiAgICAgSU5TVEFOQ0VEQVRBICpwdHIgPSAoSU5TVEFOQ0VEQVRBICopUFRSX1NFR19PRkZfVE9fTElOKCBkcywgMCApOwotICAgIGRwcmludGZfbG9jYWwoIHN0ZGRlYiwgIkhlYXAgYXQgJXAsICUwNHhcbiIsIHB0ciwgcHRyLT5oZWFwICk7CisgICAgZHByaW50Zl9pbmZvKGxvY2FsLCAiSGVhcCBhdCAlcCwgJTA0eFxuIiwgcHRyLCBwdHItPmhlYXAgKTsKICAgICBpZiAoIXB0ciB8fCAhcHRyLT5oZWFwKSByZXR1cm4gTlVMTDsKICAgICBpZiAoSXNCYWRSZWFkUHRyMTYoIChTRUdQVFIpTUFLRUxPTkcocHRyLT5oZWFwLGRzKSwgc2l6ZW9mKExPQ0FMSEVBUElORk8pKSkKICAgICAgICAgcmV0dXJuIE5VTEw7CkBAIC0xNjQsNyArMTYzLDcgQEAKICAgICAgICAgbmV4dCA9IHBOZXh0LT5uZXh0OwogICAgIH0KIAotICAgIGRwcmludGZfbG9jYWwoIHN0ZGRlYiwgIkxvY2FsX01ha2VCbG9ja0ZyZWUgJTA0eCwgbmV4dCAlMDR4XG4iLCBibG9jaywgbmV4dCApOworICAgIGRwcmludGZfaW5mbyhsb2NhbCwgIkxvY2FsX01ha2VCbG9ja0ZyZWUgJTA0eCwgbmV4dCAlMDR4XG4iLCBibG9jaywgbmV4dCApOwogICAgICAgLyogSW5zZXJ0IHRoZSBmcmVlIGJsb2NrIGluIHRoZSBmcmVlLWxpc3QgKi8KIAogICAgIHBBcmVuYS0+ZnJlZV9wcmV2ID0gcE5leHQtPmZyZWVfcHJldjsKQEAgLTIyOSw3ICsyMjgsNyBAQAogCiAgICAgICAvKiBSZW1vdmUgdGhlIGJsb2NrIGZyb20gdGhlIGZyZWUtbGlzdCAqLwogCi0gICAgZHByaW50Zl9sb2NhbCggc3RkZGViLCAiTG9jYWxfUmVtb3ZlQmxvY2tcbiIpOworICAgIGRwcmludGZfaW5mbyhsb2NhbCwgIkxvY2FsX1JlbW92ZUJsb2NrXG4iKTsKICAgICBwQXJlbmEgPSBBUkVOQV9QVFIoIGJhc2VwdHIsIGJsb2NrICk7CiAgICAgaWYgKChwQXJlbmEtPnByZXYgJiAzKSA9PSBMT0NBTF9BUkVOQV9GUkVFKQogICAgICAgICBMT0NBTF9SZW1vdmVGcmVlQmxvY2soIGJhc2VwdHIsIGJsb2NrICk7CkBAIC0yNTMsMTEgKzI1MiwxOCBAQAogICovCiBzdGF0aWMgdm9pZCBMT0NBTF9QcmludEhlYXAoIEhBTkRMRTE2IGRzICkKIHsKLSAgICBjaGFyICpwdHIgPSBQVFJfU0VHX09GRl9UT19MSU4oIGRzLCAwICk7Ci0gICAgTE9DQUxIRUFQSU5GTyAqcEluZm8gPSBMT0NBTF9HZXRIZWFwKCBkcyApOworICAgIGNoYXIgKnB0cjsKKyAgICBMT0NBTEhFQVBJTkZPICpwSW5mbzsKICAgICBXT1JEIGFyZW5hOwogCi0gICAgaWYgKCFkZWJ1Z2dpbmdfbG9jYWwpIHJldHVybjsKKyAgICAvKiBGSVhNRSAtIHRoZSB0ZXN0IHNob3VsZCBiZSBkb25lIHdoZW4gY2FsbGluZyB0aGUgZnVuY3Rpb24hIAorICAgICAgICAgICAgICAgcGx1cyBpcyBub3QgY2xlYXIgdGhhdCB3ZSBzaG91bGQgcHJpbnQgdGhpcyBpbmZvCisgICAgICAgICAgICAgICBvbmx5IHdoZW4gZGVidWdnaW5nX2luZm8gaXMgb24hICovCisgICAgaWYoIWRlYnVnZ2luZ19pbmZvKGxvY2FsKSkgcmV0dXJuOworCisgICAgcHRyID0gUFRSX1NFR19PRkZfVE9fTElOKCBkcywgMCApOworICAgIHBJbmZvID0gTE9DQUxfR2V0SGVhcCggZHMgKTsKKwogICAgIGlmICghcEluZm8pCiAgICAgewogICAgICAgICBwcmludGYoICJMb2NhbCBIZWFwIGNvcnJ1cHRlZCEgIGRzPSUwNHhcbiIsIGRzICk7CkBAIC0zMjEsMTMgKzMyNywxMyBAQAogICAgICAgLyogLSBsYXJnZSBmcmVlIGJsb2NrICAgIChGUkVFKSAgICAgICAqLwogICAgICAgLyogLSBsYXN0IGFyZW5hICAgICAgICAgIChGUkVFKSAgICAgICAqLwogCi0gICAgZHByaW50Zl9sb2NhbChzdGRkZWIsICJMb2NhbEluaXQ6ICUwNHggJTA0eC0lMDR4XG4iLCBzZWxlY3Rvciwgc3RhcnQsIGVuZCk7CisgICAgZHByaW50Zl9pbmZvKGxvY2FsLCAiTG9jYWxJbml0OiAlMDR4ICUwNHgtJTA0eFxuIiwgc2VsZWN0b3IsIHN0YXJ0LCBlbmQpOwogICAgIGlmICghc2VsZWN0b3IpIHNlbGVjdG9yID0gQ1VSUkVOVF9EUzsKIAotICAgIGlmIChkZWJ1Z2dpbmdfaGVhcCkKKyAgICBpZiAoZGVidWdnaW5nX2luZm8oaGVhcCkpCiAgICAgewotICAgICAgICAvKiBJZiBkZWJ1Z2dpbmdfaGVhcCBpcyBzZXQsIHRoZSBnbG9iYWwgaGVhcCBibG9ja3MgYXJlIGNsZWFyZWQgKi8KLSAgICAgICAgLyogYmVmb3JlIHVzZSwgc28gd2UgY2FuIHRlc3QgZm9yIGRvdWJsZSBpbml0aWFsaXphdGlvbi4gKi8KKyAgICAgICAgLyogSWYgZGVidWdnaW5nX2luZm8oaGVhcCkgaXMgc2V0LCB0aGUgZ2xvYmFsIGhlYXAgYmxvY2tzIGFyZSAqLworICAgICAgICAvKiBjbGVhcmVkIGJlZm9yZSB1c2UsIHNvIHdlIGNhbiB0ZXN0IGZvciBkb3VibGUgaW5pdGlhbGl6YXRpb24uICovCiAgICAgICAgIGlmIChMT0NBTF9HZXRIZWFwKHNlbGVjdG9yKSkKICAgICAgICAgewogICAgICAgICAgICAgZnByaW50Ziggc3RkZXJyLCAiTG9jYWxJbml0OiBIZWFwICUwNHggaW5pdGlhbGl6ZWQgdHdpY2UuXG4iLCBzZWxlY3Rvcik7CkBAIC0zNDksNyArMzU1LDcgQEAKIAkJc3RhcnQgPSBHbG9iYWxTaXplMTYoIEdsb2JhbEhhbmRsZTE2KCBzZWxlY3RvciApICk7CiAJCXN0YXJ0IC09IGVuZDsKIAkJZW5kICs9IHN0YXJ0OwotCQlkcHJpbnRmX2xvY2FsKCBzdGRkZWIsIiBuZXcgc3RhcnQgJTA0eCwgbWluc3RhcnQ6ICUwNHhcbiIsIHN0YXJ0LCBwU2VnLT5taW5zaXplICsgcE1vZHVsZS0+c3RhY2tfc2l6ZSk7CisJCWRwcmludGZfaW5mbyhsb2NhbCwiIG5ldyBzdGFydCAlMDR4LCBtaW5zdGFydDogJTA0eFxuIiwgc3RhcnQsIHBTZWctPm1pbnNpemUgKyBwTW9kdWxlLT5zdGFja19zaXplKTsKIAkgICAgfQogCX0KICAgICB9CkBAIC00NzEsNyArNDc3LDcgQEAKICAgICAgICAgcEhlYXBJbmZvLT5pdGVtcy0tOwogICAgIH0KIAotICAgIGRwcmludGZfbG9jYWwoIHN0ZGRlYiwgIkhlYXAgZXhwYW5kZWRcbiIgKTsKKyAgICBkcHJpbnRmX2luZm8obG9jYWwsICJIZWFwIGV4cGFuZGVkXG4iICk7CiAgICAgTE9DQUxfUHJpbnRIZWFwKCBkcyApOwogfQogCkBAIC00ODUsNyArNDkxLDcgQEAKICAgICBMT0NBTEhFQVBJTkZPICpwSW5mbzsKICAgICBMT0NBTEFSRU5BICpwQXJlbmEsICpwUHJldiwgKnBOZXh0OwogCi0gICAgZHByaW50Zl9sb2NhbCggc3RkZGViLCAiTG9jYWxGcmVlQXJlbmE6ICUwNHggZHM9JTA0eFxuIiwgYXJlbmEsIGRzICk7CisgICAgZHByaW50Zl9pbmZvKGxvY2FsLCAiTG9jYWxGcmVlQXJlbmE6ICUwNHggZHM9JTA0eFxuIiwgYXJlbmEsIGRzICk7CiAgICAgaWYgKCEocEluZm8gPSBMT0NBTF9HZXRIZWFwKCBkcyApKSkgcmV0dXJuIGFyZW5hOwogCiAgICAgcEFyZW5hID0gQVJFTkFfUFRSKCBwdHIsIGFyZW5hICk7CkBAIC02NTQsMTYgKzY2MCwxNiBAQAogICAgICAgICBMT0NBTF9QcmludEhlYXAoZHMpOwogICAgICAgICByZXR1cm4gMDsKICAgICB9Ci0gICAgZHByaW50Zl9sb2NhbChzdGRkZWIsCisgICAgZHByaW50Zl9pbmZvKGxvY2FsLAogICAgICAgICAgICAgICAgICAgIkxPQ0FMX0NvbXBhY3Q6IGRzID0gJTA0eCwgbWluZnJlZSA9ICUwNHgsIGZsYWdzID0gJTA0eFxuIiwKICAgICAgICAgICAgICAgICAgIGRzLCBtaW5mcmVlLCBmbGFncyk7CiAgICAgZnJlZXNwYWNlID0gTE9DQUxfR2V0RnJlZVNwYWNlKGRzLCBtaW5mcmVlID8gMCA6IDEpOwogICAgIGlmKGZyZWVzcGFjZSA+PSBtaW5mcmVlIHx8IChmbGFncyAmIExNRU1fTk9DT01QQUNUKSkKICAgICB7Ci0gICAgICAgIGRwcmludGZfbG9jYWwoc3RkZGViLCAiUmV0dXJuaW5nICUwNHguXG4iLCBmcmVlc3BhY2UpOworICAgICAgICBkcHJpbnRmX2luZm8obG9jYWwsICJSZXR1cm5pbmcgJTA0eC5cbiIsIGZyZWVzcGFjZSk7CiAgICAgICAgIHJldHVybiBmcmVlc3BhY2U7CiAgICAgfQotICAgIGRwcmludGZfbG9jYWwoc3RkZGViLCAiTG9jYWxfQ29tcGFjdDogQ29tcGFjdGluZyBoZWFwICUwNHguXG4iLCBkcyk7CisgICAgZHByaW50Zl9pbmZvKGxvY2FsLCAiTG9jYWxfQ29tcGFjdDogQ29tcGFjdGluZyBoZWFwICUwNHguXG4iLCBkcyk7CiAgICAgdGFibGUgPSBwSW5mby0+aHRhYmxlOwogICAgIHdoaWxlKHRhYmxlKQogICAgIHsKQEAgLTY3Myw3ICs2NzksNyBAQAogICAgICAgICAgICAgaWYoKHBFbnRyeS0+bG9jayA9PSAwKSAmJiAocEVudHJ5LT5mbGFncyAhPSAoTE1FTV9ESVNDQVJERUQgPj4gOCkpKQogICAgICAgICAgICAgewogICAgICAgICAgICAgICAgIC8qIE9LIHdlIGNhbiBtb3ZlIHRoaXMgb25lIGlmIHdlIHdhbnQgKi8KLSAgICAgICAgICAgICAgICBkcHJpbnRmX2xvY2FsKHN0ZGRlYiwKKyAgICAgICAgICAgICAgICBkcHJpbnRmX2luZm8obG9jYWwsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiaGFuZGxlICUwNHggKGJsb2NrICUwNHgpIGNhbiBiZSBtb3ZlZC5cbiIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoV09SRCkoKGNoYXIgKilwRW50cnkgLSBwdHIpLCBwRW50cnktPmFkZHIpOwogICAgICAgICAgICAgICAgIG1vdmVhcmVuYSA9IEFSRU5BX0hFQURFUihwRW50cnktPmFkZHIpOwpAQCAtNzAxLDcgKzcwNyw3IEBACiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgIGlmIChmaW5hbGFyZW5hKSAvKiBBY3R1YWxseSBnb3Qgc29tZXdoZXJlIHRvIG1vdmUgKi8KICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIGRwcmludGZfbG9jYWwoc3RkZGViLCAiTW92aW5nIGl0IHRvICUwNHguXG4iLCBmaW5hbGFyZW5hKTsKKyAgICAgICAgICAgICAgICAgICAgZHByaW50Zl9pbmZvKGxvY2FsLCAiTW92aW5nIGl0IHRvICUwNHguXG4iLCBmaW5hbGFyZW5hKTsKICAgICAgICAgICAgICAgICAgICAgcEZpbmFsQXJlbmEgPSBBUkVOQV9QVFIocHRyLCBmaW5hbGFyZW5hKTsKICAgICAgICAgICAgICAgICAgICAgc2l6ZSA9IHBGaW5hbEFyZW5hLT5zaXplOwogICAgICAgICAgICAgICAgICAgICBMT0NBTF9SZW1vdmVGcmVlQmxvY2socHRyLCBmaW5hbGFyZW5hKTsKQEAgLTczMiw3ICs3MzgsNyBAQAogICAgIGZyZWVzcGFjZSA9IExPQ0FMX0dldEZyZWVTcGFjZShkcywgbWluZnJlZSA/IDAgOiAxKTsKICAgICBpZihmcmVlc3BhY2UgPj0gbWluZnJlZSB8fCAoZmxhZ3MgJiBMTUVNX05PRElTQ0FSRCkpCiAgICAgewotICAgICAgICBkcHJpbnRmX2xvY2FsKHN0ZGRlYiwgIlJldHVybmluZyAlMDR4LlxuIiwgZnJlZXNwYWNlKTsKKyAgICAgICAgZHByaW50Zl9pbmZvKGxvY2FsLCAiUmV0dXJuaW5nICUwNHguXG4iLCBmcmVlc3BhY2UpOwogICAgICAgICByZXR1cm4gZnJlZXNwYWNlOwogICAgIH0KIApAQCAtNzQ1LDcgKzc1MSw3IEBACiAgICAgICAgICAgICBpZihwRW50cnktPmFkZHIgJiYgcEVudHJ5LT5sb2NrID09IDAgJiYKIAkgICAgIChwRW50cnktPmZsYWdzICYgKExNRU1fRElTQ0FSREFCTEUgPj4gOCkpKQogCSAgICB7Ci0gICAgICAgICAgICAgICAgZHByaW50Zl9sb2NhbChzdGRkZWIsICJEaXNjYXJkaW5nIGhhbmRsZSAlMDR4IChibG9jayAlMDR4KS5cbiIsCisgICAgICAgICAgICAgICAgZHByaW50Zl9pbmZvKGxvY2FsLCAiRGlzY2FyZGluZyBoYW5kbGUgJTA0eCAoYmxvY2sgJTA0eCkuXG4iLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGNoYXIgKilwRW50cnkgLSBwdHIsIHBFbnRyeS0+YWRkcik7CiAgICAgICAgICAgICAgICAgTE9DQUxfRnJlZUFyZW5hKGRzLCBBUkVOQV9IRUFERVIocEVudHJ5LT5hZGRyKSk7CiAgICAgICAgICAgICAgICAgcEVudHJ5LT5hZGRyID0gMDsKQEAgLTc4NCw3ICs3OTAsNyBAQAogCWlmIChhcmVuYSA9PSBwQXJlbmEtPmZyZWVfbmV4dCkgYnJlYWs7CiAgICAgICAgIGlmIChwQXJlbmEtPnNpemUgPj0gc2l6ZSkgcmV0dXJuIGFyZW5hOwogICAgIH0KLSAgICBkcHJpbnRmX2xvY2FsKCBzdGRkZWIsICJMb2NhbF9GaW5kRnJlZUJsb2NrOiBub3QgZW5vdWdoIHNwYWNlXG4iICk7CisgICAgZHByaW50Zl93YXJuKGxvY2FsLCAiTG9jYWxfRmluZEZyZWVCbG9jazogbm90IGVub3VnaCBzcGFjZVxuIiApOwogICAgIExPQ0FMX1ByaW50SGVhcChkcyk7CiAgICAgcmV0dXJuIDA7CiB9CkBAIC04MjcsMTUgKzgzMywxNSBAQAogICAgIH0KICAgICBpZiAoYXJlbmEgPT0gMCkgewogICAgICAgICBpZiAoZHMgPT0gR0RJX0hlYXBTZWwpIHsgCi0JICAgIGZwcmludGYoIHN0ZGVyciwgCisJICAgIGRwcmludGZfd2Fybihsb2NhbCwgCiAJICAgICAgICJMb2NhbF9HZXRCbG9jazogbm90IGVub3VnaCBzcGFjZSBpbiBHREkgbG9jYWwgaGVhcCAoJTA0eCkgZm9yICVkIGJ5dGVzXG4iLAogCQkgICAgIGRzLCBzaXplICk7CiAJfSBlbHNlIGlmIChkcyA9PSBVU0VSX0hlYXBTZWwpIHsKLQkgICAgZnByaW50Ziggc3RkZXJyLCAKKwkgICAgZHByaW50Zl93YXJuKGxvY2FsLCAKIAkgICAgICAgIkxvY2FsX0dldEJsb2NrOiBub3QgZW5vdWdoIHNwYWNlIGluIFVTRVIgbG9jYWwgaGVhcCAoJTA0eCkgZm9yICVkIGJ5dGVzXG4iLAogCQkgICAgIGRzLCBzaXplICk7CiAJfSBlbHNlIHsKLQkgICAgZHByaW50Zl9sb2NhbCggc3RkZGViLCAKKwkgICAgZHByaW50Zl93YXJuKGxvY2FsLCAKIAkgICAgICAgIkxvY2FsX0dldEJsb2NrOiBub3QgZW5vdWdoIHNwYWNlIGluIGxvY2FsIGhlYXAgJTA0eCBmb3IgJWQgYnl0ZXNcbiIsCiAJCSAgICAgZHMsIHNpemUgKTsKIAl9CkBAIC04NDQsNyArODUwLDcgQEAKIAogICAgICAgLyogTWFrZSBhIGJsb2NrIG91dCBvZiB0aGUgZnJlZSBhcmVuYSAqLwogICAgIHBBcmVuYSA9IEFSRU5BX1BUUiggcHRyLCBhcmVuYSApOwotICAgIGRwcmludGZfbG9jYWwoc3RkZGViLCAiTE9DQUxfR2V0QmxvY2sgc2l6ZSA9ICUwNHgsIGFyZW5hICUwNHggc2l6ZSAlMDR4XG4iLAorICAgIGRwcmludGZfaW5mbyhsb2NhbCwgIkxPQ0FMX0dldEJsb2NrIHNpemUgPSAlMDR4LCBhcmVuYSAlMDR4IHNpemUgJTA0eFxuIiwKICAgICAgICAgICAgICAgICAgIHNpemUsIGFyZW5hLCBwQXJlbmEtPnNpemUgKTsKICAgICBMT0NBTF9SZW1vdmVGcmVlQmxvY2soIHB0ciwgYXJlbmEgKTsKICAgICBMT0NBTF9TaHJpbmtBcmVuYSggZHMsIGFyZW5hLCBzaXplICk7CkBAIC04NjYsNyArODcyLDcgQEAKICAgICBITE9DQUwxNiBoYW5kbGU7CiAgICAgaW50IGk7CiAKLSAgICBkcHJpbnRmX2xvY2FsKCBzdGRkZWIsICJMb2NhbF9OZXdIVGFibGVcbiIgKTsKKyAgICBkcHJpbnRmX2luZm8obG9jYWwsICJMb2NhbF9OZXdIVGFibGVcbiIgKTsKICAgICBpZiAoIShwSW5mbyA9IExPQ0FMX0dldEhlYXAoIGRzICkpKQogICAgIHsKICAgICAgICAgZnByaW50Ziggc3RkZXJyLCAiTG9jYWwgaGVhcCBub3QgZm91bmRcbiIpOwpAQCAtOTM4LDcgKzk0NCw3IEBACiAKICAgICBwRW50cnktPmxvY2sgPSAwOwogICAgIHBFbnRyeS0+ZmxhZ3MgPSAwOwotICAgIGRwcmludGZfbG9jYWwoIHN0ZGRlYiwgIkxPQ0FMX0dldE5ld0hhbmRsZUVudHJ5KCUwNHgpOiAlMDR4XG4iLAorICAgIGRwcmludGZfaW5mbyhsb2NhbCwgIkxPQ0FMX0dldE5ld0hhbmRsZUVudHJ5KCUwNHgpOiAlMDR4XG4iLAogICAgICAgICAgICAgICAgICAgIGRzLCAoKGNoYXIgKilwRW50cnkgLSBwdHIpICk7CiAgICAgcmV0dXJuIChITE9DQUwxNikoKGNoYXIgKilwRW50cnkgLSBwdHIpOwogfQpAQCAtOTkwLDcgKzk5Niw3IEBACiAgICAgCiAgICAgLyogUmVtb3ZlIHRoZSB0YWJsZSBmcm9tIHRoZSBsaW5rZWQgbGlzdCBhbmQgZnJlZSBpdCAqLwogCi0gICAgZHByaW50Zl9sb2NhbCggc3RkZGViLCAiTE9DQUxfRnJlZUhhbmRsZUVudHJ5KCUwNHgpOiBmcmVlaW5nIHRhYmxlICUwNHhcbiIsCisgICAgZHByaW50Zl9pbmZvKGxvY2FsLCAiTE9DQUxfRnJlZUhhbmRsZUVudHJ5KCUwNHgpOiBmcmVlaW5nIHRhYmxlICUwNHhcbiIsCiAgICAgICAgICAgICAgICAgICAgZHMsIHRhYmxlKTsKICAgICAqcFRhYmxlID0gKihXT1JEICopcEVudHJ5OwogICAgIExPQ0FMX0ZyZWVBcmVuYSggZHMsIEFSRU5BX0hFQURFUiggdGFibGUgKSApOwpAQCAtMTAwNiw3ICsxMDEyLDcgQEAKIHsKICAgICBjaGFyICpwdHIgPSBQVFJfU0VHX09GRl9UT19MSU4oIGRzLCAwICk7CiAKLSAgICBkcHJpbnRmX2xvY2FsKCBzdGRkZWIsICJMb2NhbEZyZWU6ICUwNHggZHM9JTA0eFxuIiwgaGFuZGxlLCBkcyApOworICAgIGRwcmludGZfaW5mbyhsb2NhbCwgIkxvY2FsRnJlZTogJTA0eCBkcz0lMDR4XG4iLCBoYW5kbGUsIGRzICk7CiAgICAgCiAgICAgaWYgKCFoYW5kbGUpIHsgZnByaW50Ziggc3RkZXJyLCAiTE9DQUxfRnJlZTogaGFuZGxlIGlzIDAuXG4iICk7IHJldHVybiAwOyB9CiAgICAgaWYgKEhBTkRMRV9GSVhFRCggaGFuZGxlICkpCkBAIC0xMDE5LDcgKzEwMjUsNyBAQAogICAgICAgICBMT0NBTEhBTkRMRUVOVFJZICpwRW50cnkgPSAoTE9DQUxIQU5ETEVFTlRSWSAqKShwdHIgKyBoYW5kbGUpOwogICAgICAgICBpZiAocEVudHJ5LT5mbGFncyAhPSAoTE1FTV9ESVNDQVJERUQgPj4gOCkpCiAgICAgICAgIHsKLSAgICAgICAgICAgIGRwcmludGZfbG9jYWwoIHN0ZGRlYiwgIkxvY2FsRnJlZTogcmVhbCBibG9jayBhdCAlMDR4XG4iLAorICAgICAgICAgICAgZHByaW50Zl9pbmZvKGxvY2FsLCAiTG9jYWxGcmVlOiByZWFsIGJsb2NrIGF0ICUwNHhcbiIsCiAJCQkgICBwRW50cnktPmFkZHIgKTsKICAgICAgICAgICAgIGlmIChMT0NBTF9GcmVlQXJlbmEoIGRzLCBBUkVOQV9IRUFERVIocEVudHJ5LT5hZGRyKSApKQogICAgICAgICAgICAgICAgIHJldHVybiBoYW5kbGU7IC8qIGNvdWxkbid0IGZyZWUgaXQgKi8KQEAgLTEwNDEsNyArMTA0Nyw3IEBACiAgICAgY2hhciAqcHRyOwogICAgIEhMT0NBTDE2IGhhbmRsZTsKICAgICAKLSAgICBkcHJpbnRmX2xvY2FsKCBzdGRkZWIsICJMb2NhbEFsbG9jOiAlMDR4ICVkIGRzPSUwNHhcbiIsIGZsYWdzLCBzaXplLCBkcyApOworICAgIGRwcmludGZfaW5mbyhsb2NhbCwgIkxvY2FsQWxsb2M6ICUwNHggJWQgZHM9JTA0eFxuIiwgZmxhZ3MsIHNpemUsIGRzICk7CiAKICAgICBpZihzaXplID4gMCAmJiBzaXplIDw9IDQpIHNpemUgPSA1OwogICAgIGlmIChmbGFncyAmIExNRU1fTU9WRUFCTEUpCkBAIC0xMTA4LDcgKzExMTQsNyBAQAogICAgICAoKExPQ0FMSEFORExFRU5UUlkgKikocHRyICsgaGFuZGxlKSktPmxvY2sgPT0gMHhmZikgLyogQW4gdW51c2VkIGhhbmRsZSAqLwogCXJldHVybiAwOwogCi0gICAgZHByaW50Zl9sb2NhbCggc3RkZGViLCAiTG9jYWxSZUFsbG9jOiAlMDR4ICVkICUwNHggZHM9JTA0eFxuIiwKKyAgICBkcHJpbnRmX2luZm8obG9jYWwsICJMb2NhbFJlQWxsb2M6ICUwNHggJWQgJTA0eCBkcz0lMDR4XG4iLAogICAgICAgICAgICAgICAgICAgIGhhbmRsZSwgc2l6ZSwgZmxhZ3MsIGRzICk7CiAgICAgaWYgKCEocEluZm8gPSBMT0NBTF9HZXRIZWFwKCBkcyApKSkgcmV0dXJuIDA7CiAgICAgCkBAIC0xMTIzLDcgKzExMjksNyBAQAogCSAgICBpZihwRW50cnktPmFkZHIpCiAJCWZwcmludGYoc3RkZXJyLAogCQkJIkxPQ0FMX1JlQWxsb2M6IERpY2FyZGVkIGJsb2NrIGhhcyBub24temVybyBhZGRyLlxuIik7Ci0JICAgIGRwcmludGZfbG9jYWwoc3RkZGViLCAiUmVBbGxvY2F0aW5nIGRpc2NhcmRlZCBibG9ja1xuIik7CisJICAgIGRwcmludGZfaW5mbyhsb2NhbCwgIlJlQWxsb2NhdGluZyBkaXNjYXJkZWQgYmxvY2tcbiIpOwogCSAgICBpZihzaXplIDw9IDQpIHNpemUgPSA1OwogCSAgICBpZiAoIShobCA9IExPQ0FMX0dldEJsb2NrKCBkcywgc2l6ZSArIHNpemVvZihITE9DQUwxNiksIGZsYWdzKSkpCiAJCXJldHVybiAwOwpAQCAtMTE1Myw3ICsxMTU5LDcgQEAKIAl7CiAJICAgIHBFbnRyeSA9IChMT0NBTEhBTkRMRUVOVFJZICopKHB0ciArIGhhbmRsZSk7CiAJICAgIHBFbnRyeS0+ZmxhZ3MgPSAoZmxhZ3MgJiAweDBmMDApID4+IDg7Ci0JICAgIGRwcmludGZfbG9jYWwoc3RkZGViLCAiQ2hhbmdpbmcgZmxhZ3MgdG8gJXguXG4iLCBwRW50cnktPmZsYWdzKTsKKwkgICAgZHByaW50Zl9pbmZvKGxvY2FsLCAiQ2hhbmdpbmcgZmxhZ3MgdG8gJXguXG4iLCBwRW50cnktPmZsYWdzKTsKIAl9CiAJcmV0dXJuIGhhbmRsZTsKICAgICB9CkBAIC0xMTY0LDcgKzExNzAsNyBAQAogICAgICAgICB7CiAJICAgIGlmIChIQU5ETEVfRklYRUQoaGFuZGxlKSkKIAkgICAgewotICAgICAgICAgICAgICAgIGRwcmludGZfbG9jYWwoc3RkZGViLCAiRnJlZWluZyBmaXhlZCBibG9jay5cbiIpOworICAgICAgICAgICAgICAgIGRwcmludGZfaW5mbyhsb2NhbCwgIkZyZWVpbmcgZml4ZWQgYmxvY2suXG4iKTsKICAgICAgICAgICAgICAgICByZXR1cm4gTE9DQUxfRnJlZSggZHMsIGhhbmRsZSApOwogICAgICAgICAgICAgfQogCSAgICBlbHNlIC8qIE1vdmVhYmxlIGJsb2NrICovCkBAIC0xMTczLDcgKzExNzksNyBAQAogCQlpZiAocEVudHJ5LT5sb2NrID09IDApCiAJCXsKIAkJICAgIC8qIGRpc2NhcmRzIG1vdmVhYmxlIGJsb2NrcyAqLwotICAgICAgICAgICAgICAgICAgICBkcHJpbnRmX2xvY2FsKHN0ZGRlYiwiRGlzY2FyZGluZyBibG9ja1xuIik7CisgICAgICAgICAgICAgICAgICAgIGRwcmludGZfaW5mbyhsb2NhbCwiRGlzY2FyZGluZyBibG9ja1xuIik7CiAgICAgICAgICAgICAgICAgICAgIExPQ0FMX0ZyZWVBcmVuYShkcywgQVJFTkFfSEVBREVSKHBFbnRyeS0+YWRkcikpOwogICAgICAgICAgICAgICAgICAgICBwRW50cnktPmFkZHIgPSAwOwogICAgICAgICAgICAgICAgICAgICBwRW50cnktPmZsYWdzID0gKExNRU1fRElTQ0FSREVEID4+IDgpOwpAQCAtMTE5NSw3ICsxMjAxLDcgQEAKICAgICB9CiAKICAgICBhcmVuYSA9IEFSRU5BX0hFQURFUiggYmxvY2toYW5kbGUgKTsKLSAgICBkcHJpbnRmX2xvY2FsKCBzdGRkZWIsICJMb2NhbFJlQWxsb2M6IGFyZW5hIGlzICUwNHhcbiIsIGFyZW5hICk7CisgICAgZHByaW50Zl9pbmZvKGxvY2FsLCAiTG9jYWxSZUFsbG9jOiBhcmVuYSBpcyAlMDR4XG4iLCBhcmVuYSApOwogICAgIHBBcmVuYSA9IEFSRU5BX1BUUiggcHRyLCBhcmVuYSApOwogCiAgICAgaWYoc2l6ZSA8PSA0KSBzaXplID0gNTsKQEAgLTEyMDYsOSArMTIxMiw5IEBACiAKICAgICBpZiAobmV4dGFyZW5hIDw9IHBBcmVuYS0+bmV4dCkKICAgICB7Ci0JZHByaW50Zl9sb2NhbCggc3RkZGViLCAic2l6ZSByZWR1Y3Rpb24sIG1ha2luZyBuZXcgZnJlZSBibG9ja1xuIik7CisJZHByaW50Zl9pbmZvKGxvY2FsLCAic2l6ZSByZWR1Y3Rpb24sIG1ha2luZyBuZXcgZnJlZSBibG9ja1xuIik7CiAJTE9DQUxfU2hyaW5rQXJlbmEoZHMsIGFyZW5hLCBuZXh0YXJlbmEgLSBhcmVuYSk7Ci0gICAgICAgIGRwcmludGZfbG9jYWwoIHN0ZGRlYiwgIkxvY2FsUmVBbGxvYzogcmV0dXJuaW5nICUwNHhcbiIsIGhhbmRsZSApOworICAgICAgICBkcHJpbnRmX2luZm8obG9jYWwsICJMb2NhbFJlQWxsb2M6IHJldHVybmluZyAlMDR4XG4iLCBoYW5kbGUgKTsKICAgICAgICAgcmV0dXJuIGhhbmRsZTsKICAgICB9CiAKQEAgLTEyMTgsOSArMTIyNCw5IEBACiAgICAgaWYgKCgocE5leHQtPnByZXYgJiAzKSA9PSBMT0NBTF9BUkVOQV9GUkVFKSAmJgogICAgICAgICAobmV4dGFyZW5hIDw9IHBOZXh0LT5uZXh0KSkKICAgICB7Ci0JZHByaW50Zl9sb2NhbCggc3RkZGViLCAic2l6ZSBpbmNyZWFzZSwgbWFraW5nIG5ldyBmcmVlIGJsb2NrXG4iKTsKKwlkcHJpbnRmX2luZm8obG9jYWwsICJzaXplIGluY3JlYXNlLCBtYWtpbmcgbmV3IGZyZWUgYmxvY2tcbiIpOwogICAgICAgICBMT0NBTF9Hcm93QXJlbmFVcHdhcmQoZHMsIGFyZW5hLCBuZXh0YXJlbmEgLSBhcmVuYSk7Ci0gICAgICAgIGRwcmludGZfbG9jYWwoIHN0ZGRlYiwgIkxvY2FsUmVBbGxvYzogcmV0dXJuaW5nICUwNHhcbiIsIGhhbmRsZSApOworICAgICAgICBkcHJpbnRmX2luZm8obG9jYWwsICJMb2NhbFJlQWxsb2M6IHJldHVybmluZyAlMDR4XG4iLCBoYW5kbGUgKTsKICAgICAgICAgcmV0dXJuIGhhbmRsZTsKICAgICB9CiAKQEAgLTEyMzEsNyArMTIzNyw3IEBACiAgICAgewogCWlmIChIQU5ETEVfRklYRUQoaGFuZGxlKSkKICAgICAgICAgewotICAgICAgICAgICAgZHByaW50Zl9sb2NhbChzdGRkZWIsCisgICAgICAgICAgICBkcHJpbnRmX3dhcm4obG9jYWwsCiAJICAgICAiTmVlZGVkIHRvIG1vdmUgZml4ZWQgYmxvY2ssIGJ1dCBMTUVNX01PVkVBQkxFIG5vdCBzcGVjaWZpZWQuXG4iKTsKICAgICAgICAgICAgIHJldHVybiAwOwogICAgICAgICB9CkBAIC0xMjM5LDggKzEyNDUsOCBAQAogCXsKIAkgICAgaWYoKChMT0NBTEhBTkRMRUVOVFJZICopKHB0ciArIGhhbmRsZSkpLT5sb2NrICE9IDApCiAJICAgIHsKLQkJZHByaW50Zl9sb2NhbChzdGRkZWIsCi0JIk5lZWRlZCB0byBtb3ZlIGxvY2tlZCBibG9jaywgYnV0IExNRU1fTU9WRUFCTEUgbm90IHNwZWNpZmllZC5cbiIpOworCQlkcHJpbnRmX3dhcm4obG9jYWwsCisJICAgICAgICJOZWVkZWQgdG8gbW92ZSBsb2NrZWQgYmxvY2ssIGJ1dCBMTUVNX01PVkVBQkxFIG5vdCBzcGVjaWZpZWQuXG4iKTsKIAkJcmV0dXJuIDA7CiAJICAgIH0KICAgICAgICAgfQpAQCAtMTI3Niw3ICsxMjgyLDcgQEAKICAgICB9CiAgICAgaWYgKEhBTkRMRV9NT1ZFQUJMRSggaGFuZGxlICkpCiAgICAgewotCWRwcmludGZfbG9jYWwoIHN0ZGRlYiwgIkxvY2FsUmVBbGxvYzogZml4aW5nIGhhbmRsZVxuIik7CisJZHByaW50Zl9pbmZvKGxvY2FsLCAiTG9jYWxSZUFsbG9jOiBmaXhpbmcgaGFuZGxlXG4iKTsKICAgICAgICAgcEVudHJ5ID0gKExPQ0FMSEFORExFRU5UUlkgKikocHRyICsgaGFuZGxlKTsKICAgICAgICAgcEVudHJ5LT5hZGRyID0gaG1lbSArIHNpemVvZihITE9DQUwxNik7CiAJLyogQmFjayBwdHIgc2hvdWxkIHN0aWxsIGJlIGNvcnJlY3QgKi8KQEAgLTEyODUsNyArMTI5MSw3IEBACiAJaG1lbSA9IGhhbmRsZTsKICAgICB9CiAgICAgaWYgKHNpemUgPT0gb2xkc2l6ZSkgaG1lbSA9IDA7ICAvKiBSZWFsbG9jIGZhaWxlZCAqLwotICAgIGRwcmludGZfbG9jYWwoIHN0ZGRlYiwgIkxvY2FsUmVBbGxvYzogcmV0dXJuaW5nICUwNHhcbiIsIGhtZW0gKTsKKyAgICBkcHJpbnRmX2luZm8obG9jYWwsICJMb2NhbFJlQWxsb2M6IHJldHVybmluZyAlMDR4XG4iLCBobWVtICk7CiAgICAgcmV0dXJuIGhtZW07CiB9CiAKQEAgLTEyOTUsNyArMTMwMSw4IEBACiAgKi8KIHN0YXRpYyBITE9DQUwxNiBMT0NBTF9JbnRlcm5hbExvY2soIExQU1RSIGhlYXAsIEhMT0NBTDE2IGhhbmRsZSApCiB7Ci0gICAgZHByaW50Zl9sb2NhbCggc3RkZGViLCAiTG9jYWxMb2NrOiAlMDR4ICIsIGhhbmRsZSApOworICAgIEhMT0NBTDE2IG9sZF9oYW5kbGUgPSBoYW5kbGU7CisKICAgICBpZiAoSEFORExFX01PVkVBQkxFKGhhbmRsZSkpCiAgICAgewogICAgICAgICBMT0NBTEhBTkRMRUVOVFJZICpwRW50cnkgPSAoTE9DQUxIQU5ETEVFTlRSWSAqKShoZWFwICsgaGFuZGxlKTsKQEAgLTEzMDMsNyArMTMxMCw4IEBACiAgICAgICAgIGlmIChwRW50cnktPmxvY2sgPCAweGZlKSBwRW50cnktPmxvY2srKzsKICAgICAgICAgaGFuZGxlID0gcEVudHJ5LT5hZGRyOwogICAgIH0KLSAgICBkcHJpbnRmX2xvY2FsKCBzdGRkZWIsICJyZXR1cm5pbmcgJTA0eFxuIiwgaGFuZGxlICk7CisgICAgZHByaW50Zl9pbmZvKGxvY2FsLCAiTG9jYWxMb2NrOiAlMDR4IHJldHVybmluZyAlMDR4XG4iLCAKKwkJICAgb2xkX2hhbmRsZSwgaGFuZGxlICk7CiAgICAgcmV0dXJuIGhhbmRsZTsKIH0KIApAQCAtMTMzNSw3ICsxMzQzLDcgQEAKIHsKICAgICBjaGFyICpwdHIgPSBQVFJfU0VHX09GRl9UT19MSU4oIGRzLCAwICk7CiAKLSAgICBkcHJpbnRmX2xvY2FsKCBzdGRkZWIsICJMb2NhbFVubG9jazogJTA0eFxuIiwgaGFuZGxlICk7CisgICAgZHByaW50Zl9pbmZvKGxvY2FsLCAiTG9jYWxVbmxvY2s6ICUwNHhcbiIsIGhhbmRsZSApOwogICAgIGlmIChIQU5ETEVfTU9WRUFCTEUoaGFuZGxlKSkKICAgICB7CiAgICAgICAgIExPQ0FMSEFORExFRU5UUlkgKnBFbnRyeSA9IChMT0NBTEhBTkRMRUVOVFJZICopKHB0ciArIGhhbmRsZSk7CkBAIC0xMzU4LDcgKzEzNjYsNyBAQAogICAgIGNoYXIgKnB0ciA9IFBUUl9TRUdfT0ZGX1RPX0xJTiggQ1VSUkVOVF9EUywgMCApOwogICAgIExPQ0FMQVJFTkEgKnBBcmVuYTsKIAotICAgIGRwcmludGZfbG9jYWwoIHN0ZGRlYiwgIkxvY2FsU2l6ZTogJTA0eCBkcz0lMDR4XG4iLCBoYW5kbGUsIGRzICk7CisgICAgZHByaW50Zl9pbmZvKGxvY2FsLCAiTG9jYWxTaXplOiAlMDR4IGRzPSUwNHhcbiIsIGhhbmRsZSwgZHMgKTsKIAogICAgIGlmIChIQU5ETEVfTU9WRUFCTEUoIGhhbmRsZSApKSBoYW5kbGUgPSAqKFdPUkQgKikocHRyICsgaGFuZGxlKTsKICAgICBpZiAoIWhhbmRsZSkgcmV0dXJuIDA7CkBAIC0xMzc5LDEzICsxMzg3LDEzIEBACiAgICAgaWYgKEhBTkRMRV9NT1ZFQUJMRShoYW5kbGUpKQogICAgIHsKICAgICAgICAgTE9DQUxIQU5ETEVFTlRSWSAqcEVudHJ5ID0gKExPQ0FMSEFORExFRU5UUlkgKikocHRyICsgaGFuZGxlKTsKLSAgICAgICAgZHByaW50Zl9sb2NhbCggc3RkZGViLCAiTE9DQUxfRmxhZ3MoJTA0eCwlMDR4KTogcmV0dXJuaW5nICUwNHhcbiIsCisgICAgICAgIGRwcmludGZfaW5mbyhsb2NhbCwgIkxPQ0FMX0ZsYWdzKCUwNHgsJTA0eCk6IHJldHVybmluZyAlMDR4XG4iLAogICAgICAgICAgICAgICAgICAgICAgICBkcywgaGFuZGxlLCBwRW50cnktPmxvY2sgfCAocEVudHJ5LT5mbGFncyA8PCA4KSApOwogICAgICAgICByZXR1cm4gcEVudHJ5LT5sb2NrIHwgKHBFbnRyeS0+ZmxhZ3MgPDwgOCk7CiAgICAgfQogICAgIGVsc2UKICAgICB7Ci0gICAgICAgIGRwcmludGZfbG9jYWwoIHN0ZGRlYiwgIkxPQ0FMX0ZsYWdzKCUwNHgsJTA0eCk6IHJldHVybmluZyAwXG4iLAorICAgICAgICBkcHJpbnRmX2luZm8obG9jYWwsICJMT0NBTF9GbGFncyglMDR4LCUwNHgpOiByZXR1cm5pbmcgMFxuIiwKICAgICAgICAgICAgICAgICAgICAgICAgZHMsIGhhbmRsZSApOwogICAgICAgICByZXR1cm4gMDsKICAgICB9CkBAIC0xNDM0LDcgKzE0NDIsNyBAQAogCWlmIChhcmVuYSA9PSBwQXJlbmEtPmZyZWVfbmV4dCkgYnJlYWs7CiAgICAgICAgIHRvdGFsICs9IHBBcmVuYS0+c2l6ZTsKICAgICB9Ci0gICAgZHByaW50Zl9sb2NhbCggc3RkZGViLCAiTE9DQUxfQ291bnRGcmVlKCUwNHgpOiByZXR1cm5pbmcgJWRcbiIsIGRzLCB0b3RhbCk7CisgICAgZHByaW50Zl9pbmZvKGxvY2FsLCAiTE9DQUxfQ291bnRGcmVlKCUwNHgpOiByZXR1cm5pbmcgJWRcbiIsIGRzLCB0b3RhbCk7CiAgICAgcmV0dXJuIHRvdGFsOwogfQogCkBAIC0xNTUyLDcgKzE1NjAsNyBAQAogICovCiBVSU5UMTYgV0lOQVBJIExvY2FsQ29tcGFjdDE2KCBVSU5UMTYgbWluZnJlZSApCiB7Ci0gICAgZHByaW50Zl9sb2NhbCggc3RkZGViLCAiTG9jYWxDb21wYWN0OiAlMDR4XG4iLCBtaW5mcmVlICk7CisgICAgZHByaW50Zl9pbmZvKGxvY2FsLCAiTG9jYWxDb21wYWN0OiAlMDR4XG4iLCBtaW5mcmVlICk7CiAgICAgcmV0dXJuIExPQ0FMX0NvbXBhY3QoIENVUlJFTlRfRFMsIG1pbmZyZWUsIDAgKTsKIH0KIApAQCAtMTU3Miw3ICsxNTgwLDcgQEAKIAlMT0NBTF9QcmludEhlYXAoIGRzICk7CiAJcmV0dXJuIDA7CiAgICAgfQotICAgIGRwcmludGZfbG9jYWwoIHN0ZGRlYiwgIkxvY2FsTm90aWZ5KCUwNHgpOiAlMDhseFxuIiwgZHMsIChEV09SRClmdW5jICk7CisgICAgZHByaW50Zl9pbmZvKGxvY2FsLCAiTG9jYWxOb3RpZnkoJTA0eCk6ICUwOGx4XG4iLCBkcywgKERXT1JEKWZ1bmMgKTsKICAgICBmcHJpbnRmKHN0ZG5pbXAsICJMb2NhbE5vdGlmeSgpOiBIYWxmIGltcGxlbWVudGVkXG4iKTsKICAgICBvbGROb3RpZnkgPSBwSW5mby0+bm90aWZ5OwogICAgIHBJbmZvLT5ub3RpZnkgPSBmdW5jOwpAQCAtMTU4NSw3ICsxNTkzLDcgQEAKICAqLwogVUlOVDE2IFdJTkFQSSBMb2NhbFNocmluazE2KCBIR0xPQkFMMTYgaGFuZGxlLCBVSU5UMTYgbmV3c2l6ZSApCiB7Ci0gICAgZHByaW50Zl9sb2NhbCggc3RkZGViLCAiTG9jYWxTaHJpbms6ICUwNHggJTA0eFxuIiwgaGFuZGxlLCBuZXdzaXplICk7CisgICAgZHByaW50Zl9pbmZvKGxvY2FsLCAiTG9jYWxTaHJpbms6ICUwNHggJTA0eFxuIiwgaGFuZGxlLCBuZXdzaXplICk7CiAgICAgcmV0dXJuIDA7CiB9CiAKQEAgLTE2MTgsNyArMTYyNiw3IEBACiAgKi8KIFdPUkQgV0lOQVBJIExvY2FsSGVhcFNpemUodm9pZCkKIHsKLSAgICBkcHJpbnRmX2xvY2FsKCBzdGRkZWIsICJMb2NhbEhlYXBTaXplOlxuIiApOworICAgIGRwcmludGZfaW5mbyhsb2NhbCwgIkxvY2FsSGVhcFNpemU6XG4iICk7CiAgICAgcmV0dXJuIExPQ0FMX0hlYXBTaXplKCBDVVJSRU5UX0RTICk7CiB9CiAKQEAgLTE2MzcsNyArMTY0NSw3IEBACiAJcmV0dXJuIDA7CiAgICAgfQogICAgIGlmIChkZWx0YSkgcEluZm8tPmhkZWx0YSA9IGRlbHRhOwotICAgIGRwcmludGZfbG9jYWwoc3RkZGViLCAiTG9jYWxIYW5kbGVEZWx0YTogcmV0dXJuaW5nICUwNHhcbiIsIHBJbmZvLT5oZGVsdGEpOworICAgIGRwcmludGZfaW5mbyhsb2NhbCwgIkxvY2FsSGFuZGxlRGVsdGE6IHJldHVybmluZyAlMDR4XG4iLCBwSW5mby0+aGRlbHRhKTsKICAgICByZXR1cm4gcEluZm8tPmhkZWx0YTsKIH0KIApkaWZmIC0tZ2l0IGEvbWVtb3J5L3NlbGVjdG9yLmMgYi9tZW1vcnkvc2VsZWN0b3IuYwppbmRleCBkYjdjYTcwLi45MTg4ZjU1IDEwMDY0NAotLS0gYS9tZW1vcnkvc2VsZWN0b3IuYworKysgYi9tZW1vcnkvc2VsZWN0b3IuYwpAQCAtMTAsNyArMTAsNiBAQAogI2luY2x1ZGUgIm1pc2NlbXUuaCIKICNpbmNsdWRlICJzZWxlY3RvcnMuaCIKICNpbmNsdWRlICJzdGFja2ZyYW1lLmgiCi0jaW5jbHVkZSAic3RkZGVidWcuaCIKICNpbmNsdWRlICJkZWJ1Zy5oIgogCiAKQEAgLTYwLDcgKzU5LDcgQEAKIAogICAgIGNvdW50ID0gc2VsID8gKChHRVRfU0VMX0xJTUlUKHNlbCkgPj4gMTYpICsgMSkgOiAxOwogICAgIG5ld3NlbCA9IEFsbG9jU2VsZWN0b3JBcnJheSggY291bnQgKTsKLSAgICBkcHJpbnRmX3NlbGVjdG9yKCBzdGRkZWIsICJBbGxvY1NlbGVjdG9yKCUwNHgpOiByZXR1cm5pbmcgJTA0eFxuIiwKKyAgICBkcHJpbnRmX2luZm8oc2VsZWN0b3IsICJBbGxvY1NlbGVjdG9yKCUwNHgpOiByZXR1cm5pbmcgJTA0eFxuIiwKICAgICAgICAgICAgICAgICAgICAgICBzZWwsIG5ld3NlbCApOwogICAgIGlmICghbmV3c2VsKSByZXR1cm4gMDsKICAgICBpZiAoIXNlbCkgcmV0dXJuIG5ld3NlbDsgIC8qIG5vdGhpbmcgdG8gY29weSAqLwpAQCAtMTQ5LDcgKzE0OCw3IEBACiAgICAgbGR0X2VudHJ5IGVudHJ5OwogICAgIFNUQUNLMTZGUkFNRSAqZnJhbWU7CiAKLSAgICBkcHJpbnRmX3NlbGVjdG9yKCBzdGRkZWIsICJTRUxFQ1RPUl9GcmVlQmxvY2soJTA0eCwlZClcbiIsIHNlbCwgY291bnQgKTsKKyAgICBkcHJpbnRmX2luZm8oc2VsZWN0b3IsICJTRUxFQ1RPUl9GcmVlQmxvY2soJTA0eCwlZClcbiIsIHNlbCwgY291bnQgKTsKICAgICBzZWwgJj0gfihfX0FISU5DUiAtIDEpOyAgLyogY2xlYXIgYm90dG9tIGJpdHMgb2Ygc2VsZWN0b3IgKi8KICAgICBuZXh0c2VsID0gc2VsICsgKGNvdW50IDw8IF9fQUhTSElGVCk7CiAKQEAgLTI1Myw3ICsyNTIsNyBAQAogICAgIGxkdF9lbnRyeSBlbnRyeTsKIAogICAgIG5ld3NlbCA9IEFsbG9jU2VsZWN0b3JBcnJheSggMSApOwotICAgIGRwcmludGZfc2VsZWN0b3IoIHN0ZGRlYiwgIkFsbG9jQ1N0b0RTQWxpYXMoJTA0eCk6IHJldHVybmluZyAlMDR4XG4iLAorICAgIGRwcmludGZfaW5mbyhzZWxlY3RvciwgIkFsbG9jQ1N0b0RTQWxpYXMoJTA0eCk6IHJldHVybmluZyAlMDR4XG4iLAogICAgICAgICAgICAgICAgICAgICAgIHNlbCwgbmV3c2VsICk7CiAgICAgaWYgKCFuZXdzZWwpIHJldHVybiAwOwogICAgIExEVF9HZXRFbnRyeSggU0VMRUNUT1JfVE9fRU5UUlkoc2VsKSwgJmVudHJ5ICk7CkBAIC0yNzIsNyArMjcxLDcgQEAKICAgICBsZHRfZW50cnkgZW50cnk7CiAKICAgICBuZXdzZWwgPSBBbGxvY1NlbGVjdG9yQXJyYXkoIDEgKTsKLSAgICBkcHJpbnRmX3NlbGVjdG9yKCBzdGRkZWIsICJBbGxvY0RTdG9DU0FsaWFzKCUwNHgpOiByZXR1cm5pbmcgJTA0eFxuIiwKKyAgICBkcHJpbnRmX2luZm8oc2VsZWN0b3IsICJBbGxvY0RTdG9DU0FsaWFzKCUwNHgpOiByZXR1cm5pbmcgJTA0eFxuIiwKICAgICAgICAgICAgICAgICAgICAgICBzZWwsIG5ld3NlbCApOwogICAgIGlmICghbmV3c2VsKSByZXR1cm4gMDsKICAgICBMRFRfR2V0RW50cnkoIFNFTEVDVE9SX1RPX0VOVFJZKHNlbCksICZlbnRyeSApOwpkaWZmIC0tZ2l0IGEvbWVtb3J5L3N0cmluZy5jIGIvbWVtb3J5L3N0cmluZy5jCmluZGV4IGZiOTQ4NTkuLjhhNGExOGEgMTAwNjQ0Ci0tLSBhL21lbW9yeS9zdHJpbmcuYworKysgYi9tZW1vcnkvc3RyaW5nLmMKQEAgLTEwLDcgKzEwLDYgQEAKICNpbmNsdWRlICJ3aW5kb3dzLmgiCiAjaW5jbHVkZSAid2luZXJyb3IuaCIKICNpbmNsdWRlICJsZHQuaCIKLSNpbmNsdWRlICJzdGRkZWJ1Zy5oIgogI2luY2x1ZGUgImRlYnVnLmgiCiAjaW5jbHVkZSAiZGVidWdzdHIuaCIKIApAQCAtNzgsNyArNzcsNyBAQAogICovCiBMUFNUUiBXSU5BUEkgbHN0cmNhdDMyQSggTFBTVFIgZHN0LCBMUENTVFIgc3JjICkKIHsKLSAgICBkcHJpbnRmX3N0cmluZyhzdGRkZWIsInN0cmNhdDogQXBwZW5kICVzIHRvICVzXG4iLAorICAgIGRwcmludGZfaW5mbyhzdHJpbmcsInN0cmNhdDogQXBwZW5kICVzIHRvICVzXG4iLAogCQkgICBkZWJ1Z3N0cl9hIChzcmMpLCBkZWJ1Z3N0cl9hIChkc3QpKTsKICAgICAvKiBXaW5kb3dzIGRvZXMgbm90IGNoZWNrIGZvciBOVUxMIHBvaW50ZXJzIGhlcmUsIHNvIHdlIGRvbid0IGVpdGhlciAqLwogICAgIHN0cmNhdCggZHN0LCBzcmMgKTsKQEAgLTkyLDcgKzkxLDcgQEAKIExQV1NUUiBXSU5BUEkgbHN0cmNhdDMyVyggTFBXU1RSIGRzdCwgTFBDV1NUUiBzcmMgKQogewogICAgIHJlZ2lzdGVyIExQV1NUUiBwID0gZHN0OwotICAgIGRwcmludGZfc3RyaW5nKHN0ZGRlYiwic3RyY2F0OiBBcHBlbmQgTCVzIHRvIEwlc1xuIiwKKyAgICBkcHJpbnRmX2luZm8oc3RyaW5nLCJzdHJjYXQ6IEFwcGVuZCBMJXMgdG8gTCVzXG4iLAogCQkgICBkZWJ1Z3N0cl93IChzcmMpLCBkZWJ1Z3N0cl93IChkc3QpKTsKICAgICAvKiBXaW5kb3dzIGRvZXMgbm90IGNoZWNrIGZvciBOVUxMIHBvaW50ZXJzIGhlcmUsIHNvIHdlIGRvbid0IGVpdGhlciAqLwogICAgIHdoaWxlICgqcCkgcCsrOwpAQCAtMTE3LDcgKzExNiw3IEBACiBMUFNUUiBXSU5BUEkgbHN0cmNhdG4zMkEoIExQU1RSIGRzdCwgTFBDU1RSIHNyYywgSU5UMzIgbiApCiB7CiAgICAgcmVnaXN0ZXIgTFBTVFIgcCA9IGRzdDsKLSAgICBkcHJpbnRmX3N0cmluZyhzdGRkZWIsInN0cmNhdG4gYWRkICVkIGNoYXJzIGZyb20gJXMgdG8gJXNcbiIsCisgICAgZHByaW50Zl9pbmZvKHN0cmluZywic3RyY2F0biBhZGQgJWQgY2hhcnMgZnJvbSAlcyB0byAlc1xuIiwKIAkJICAgbiwgZGVidWdzdHJfYW4gKHNyYywgbiksIGRlYnVnc3RyX2EgKGRzdCkpOwogICAgIHdoaWxlICgqcCkgcCsrOwogICAgIGlmICgobiAtPSAoSU5UMzIpKHAgLSBkc3QpKSA8PSAwKSByZXR1cm4gZHN0OwpAQCAtMTMyLDcgKzEzMSw3IEBACiBMUFdTVFIgV0lOQVBJIGxzdHJjYXRuMzJXKCBMUFdTVFIgZHN0LCBMUENXU1RSIHNyYywgSU5UMzIgbiApCiB7CiAgICAgcmVnaXN0ZXIgTFBXU1RSIHAgPSBkc3Q7Ci0gICAgZHByaW50Zl9zdHJpbmcoc3RkZGViLCJzdHJjYXRuIGFkZCAlZCBjaGFycyBmcm9tIEwlcyB0byBMJXNcbiIsCisgICAgZHByaW50Zl9pbmZvKHN0cmluZywic3RyY2F0biBhZGQgJWQgY2hhcnMgZnJvbSBMJXMgdG8gTCVzXG4iLAogCQkgICBuLCBkZWJ1Z3N0cl93biAoc3JjLCBuKSwgZGVidWdzdHJfdyAoZHN0KSk7CiAgICAgd2hpbGUgKCpwKSBwKys7CiAgICAgaWYgKChuIC09IChJTlQzMikocCAtIGRzdCkpIDw9IDApIHJldHVybiBkc3Q7CkBAIC0xNTUsNyArMTU0LDcgQEAKICAqLwogSU5UMzIgV0lOQVBJIGxzdHJjbXAzMkEoIExQQ1NUUiBzdHIxLCBMUENTVFIgc3RyMiApCiB7Ci0gICAgZHByaW50Zl9zdHJpbmcoc3RkZGViLCJzdHJjbXA6ICVzIGFuZCAlc1xuIiwKKyAgICBkcHJpbnRmX2luZm8oc3RyaW5nLCJzdHJjbXA6ICVzIGFuZCAlc1xuIiwKIAkJICAgZGVidWdzdHJfYSAoc3RyMSksIGRlYnVnc3RyX2EgKHN0cjIpKTsKICAgICAvKiBXaW45NSBLRVJORUwzMi5ETEwgZG9lcyBpdCB0aGF0IHdheS4gSGFuZHMgb2ZmISAqLwogICAgIGlmICghc3RyMSB8fCAhc3RyMikgewpAQCAtMTcxLDcgKzE3MCw3IEBACiAgKi8KIElOVDMyIFdJTkFQSSBsc3RyY21wMzJXKCBMUENXU1RSIHN0cjEsIExQQ1dTVFIgc3RyMiApCiB7Ci0gICAgZHByaW50Zl9zdHJpbmcoc3RkZGViLCJzdHJjbXA6IEwlcyBhbmQgTCVzXG4iLAorICAgIGRwcmludGZfaW5mbyhzdHJpbmcsInN0cmNtcDogTCVzIGFuZCBMJXNcbiIsCiAJCSAgIGRlYnVnc3RyX3cgKHN0cjEpLCBkZWJ1Z3N0cl93IChzdHIyKSk7CiAgICAgaWYgKCFzdHIxIHx8ICFzdHIyKSB7CiAgICAgCVNldExhc3RFcnJvcihFUlJPUl9JTlZBTElEX1BBUkFNRVRFUik7CkBAIC0xOTgsNyArMTk3LDcgQEAKIHsKICAgICBJTlQzMiByZXM7CiAKLSAgICBkcHJpbnRmX3N0cmluZyhzdGRkZWIsInN0cmNtcGkgJXMgYW5kICVzXG4iLAorICAgIGRwcmludGZfaW5mbyhzdHJpbmcsInN0cmNtcGkgJXMgYW5kICVzXG4iLAogCQkgICBkZWJ1Z3N0cl9hIChzdHIxKSwgZGVidWdzdHJfYSAoc3RyMikpOwogICAgIGlmICghc3RyMSB8fCAhc3RyMikgewogICAgIAlTZXRMYXN0RXJyb3IoRVJST1JfSU5WQUxJRF9QQVJBTUVURVIpOwpAQCAtMjIzLDcgKzIyMiw3IEBACiAKICNpZiAwCiAgICAgLyogVG9vIG11Y2ghICAoRnJvbSByZWdpc3RyeSBsb2FkaW5nLikgICovCi0gICAgZHByaW50Zl9zdHJpbmcoc3RkZGViLCJzdHJjbXBpIEwlcyBhbmQgTCVzXG4iLAorICAgIGRwcmludGZfaW5mbyhzdHJpbmcsInN0cmNtcGkgTCVzIGFuZCBMJXNcbiIsCiAJCSAgIGRlYnVnc3RyX3cgKHN0cjEpLCBkZWJ1Z3N0cl93IChzdHIyKSk7CiAjZW5kaWYKICAgICBpZiAoIXN0cjEgfHwgIXN0cjIpIHsKQEAgLTI1Niw3ICsyNTUsNyBAQAogICovCiBMUFNUUiBXSU5BUEkgbHN0cmNweTMyQSggTFBTVFIgZHN0LCBMUENTVFIgc3JjICkKIHsKLSAgICBkcHJpbnRmX3N0cmluZyhzdGRkZWIsInN0cmNweSAlc1xuIiwgZGVidWdzdHJfYSAoc3JjKSk7CisgICAgZHByaW50Zl9pbmZvKHN0cmluZywic3RyY3B5ICVzXG4iLCBkZWJ1Z3N0cl9hIChzcmMpKTsKICAgICAvKiBXaW5kb3dzIGRvZXMgbm90IGNoZWNrIGZvciBOVUxMIHBvaW50ZXJzIGhlcmUsIHNvIHdlIGRvbid0IGVpdGhlciAqLwogICAgIHN0cmNweSggZHN0LCBzcmMgKTsKICAgICByZXR1cm4gZHN0OwpAQCAtMjY5LDcgKzI2OCw3IEBACiBMUFdTVFIgV0lOQVBJIGxzdHJjcHkzMlcoIExQV1NUUiBkc3QsIExQQ1dTVFIgc3JjICkKIHsKICAgICByZWdpc3RlciBMUFdTVFIgcCA9IGRzdDsKLSAgICBkcHJpbnRmX3N0cmluZyhzdGRkZWIsInN0cmNweSBMJXNcbiIsIGRlYnVnc3RyX3cgKHNyYykpOworICAgIGRwcmludGZfaW5mbyhzdHJpbmcsInN0cmNweSBMJXNcbiIsIGRlYnVnc3RyX3cgKHNyYykpOwogICAgIC8qIFdpbmRvd3MgZG9lcyBub3QgY2hlY2sgZm9yIE5VTEwgcG9pbnRlcnMgaGVyZSwgc28gd2UgZG9uJ3QgZWl0aGVyICovCiAgICAgd2hpbGUgKCgqcCsrID0gKnNyYysrKSk7CiAgICAgcmV0dXJuIGRzdDsKQEAgLTI5Miw3ICsyOTEsNyBAQAogTFBTVFIgV0lOQVBJIGxzdHJjcHluMzJBKCBMUFNUUiBkc3QsIExQQ1NUUiBzcmMsIElOVDMyIG4gKQogewogICAgIExQU1RSIHAgPSBkc3Q7Ci0gICAgZHByaW50Zl9zdHJpbmcoc3RkZGViLCJzdHJjcHluICVzIGZvciAlZCBjaGFyc1xuIiwKKyAgICBkcHJpbnRmX2luZm8oc3RyaW5nLCJzdHJjcHluICVzIGZvciAlZCBjaGFyc1xuIiwKIAkJICAgZGVidWdzdHJfYW4gKHNyYyxuKSwgbik7CiAgICAgLyogV2luZG93cyBkb2VzIG5vdCBjaGVjayBmb3IgTlVMTCBwb2ludGVycyBoZXJlLCBzbyB3ZSBkb24ndCBlaXRoZXIgKi8KICAgICB3aGlsZSAoKG4tLSA+IDEpICYmICpzcmMpICpwKysgPSAqc3JjKys7CkBAIC0zMDcsNyArMzA2LDcgQEAKIExQV1NUUiBXSU5BUEkgbHN0cmNweW4zMlcoIExQV1NUUiBkc3QsIExQQ1dTVFIgc3JjLCBJTlQzMiBuICkKIHsKICAgICBMUFdTVFIgcCA9IGRzdDsKLSAgICBkcHJpbnRmX3N0cmluZyhzdGRkZWIsInN0cmNweW4gTCVzIGZvciAlZCBjaGFyc1xuIiwKKyAgICBkcHJpbnRmX2luZm8oc3RyaW5nLCJzdHJjcHluIEwlcyBmb3IgJWQgY2hhcnNcbiIsCiAJCSAgIGRlYnVnc3RyX3duIChzcmMsbiksIG4pOwogICAgIC8qIFdpbmRvd3MgZG9lcyBub3QgY2hlY2sgZm9yIE5VTEwgcG9pbnRlcnMgaGVyZSwgc28gd2UgZG9uJ3QgZWl0aGVyICovCiAgICAgd2hpbGUgKChuLS0gPiAxKSAmJiAqc3JjKSAqcCsrID0gKnNyYysrOwpAQCAtMzM0LDcgKzMzMyw3IEBACiAgICAgICogaW4gbHN0cmxlbigpIC4uLiB3ZSBjaGVjayBvbmx5IGZvciBOVUxMIHBvaW50ZXIgcmVmZXJlbmNlLgogICAgICAqIC0gTWFyY3VzIE1laXNzbmVyCiAgICAgICovCi0gICAgZHByaW50Zl9zdHJpbmcoc3RkZGViLCJzdHJsZW4gJXNcbiIsIGRlYnVnc3RyX2EgKHN0cikpOworICAgIGRwcmludGZfaW5mbyhzdHJpbmcsInN0cmxlbiAlc1xuIiwgZGVidWdzdHJfYSAoc3RyKSk7CiAgICAgaWYgKCFzdHIpIHJldHVybiAwOwogICAgIHJldHVybiAoSU5UMzIpc3RybGVuKHN0cik7CiB9CkBAIC0zNDYsNyArMzQ1LDcgQEAKIElOVDMyIFdJTkFQSSBsc3RybGVuMzJXKCBMUENXU1RSIHN0ciApCiB7CiAgICAgSU5UMzIgbGVuID0gMDsKLSAgICBkcHJpbnRmX3N0cmluZyhzdGRkZWIsInN0cmxlbiBMJXNcbiIsIGRlYnVnc3RyX3cgKHN0cikpOworICAgIGRwcmludGZfaW5mbyhzdHJpbmcsInN0cmxlbiBMJXNcbiIsIGRlYnVnc3RyX3cgKHN0cikpOwogICAgIGlmICghc3RyKSByZXR1cm4gMDsKICAgICB3aGlsZSAoKnN0cisrKSBsZW4rKzsKICAgICByZXR1cm4gbGVuOwpAQCAtMzU4LDcgKzM1Nyw3IEBACiAgKi8KIElOVDMyIFdJTkFQSSBsc3RybmNtcDMyQSggTFBDU1RSIHN0cjEsIExQQ1NUUiBzdHIyLCBJTlQzMiBuICkKIHsKLSAgICBkcHJpbnRmX3N0cmluZyhzdGRkZWIsInN0cm5jbXAgJXMgYW5kICVzIGZvciAlZCBjaGFyc1xuIiwKKyAgICBkcHJpbnRmX2luZm8oc3RyaW5nLCJzdHJuY21wICVzIGFuZCAlcyBmb3IgJWQgY2hhcnNcbiIsCiAJCSAgIGRlYnVnc3RyX2FuIChzdHIxLCBuKSwgZGVidWdzdHJfYW4gKHN0cjIsIG4pLCBuKTsKICAgICByZXR1cm4gKElOVDMyKXN0cm5jbXAoIHN0cjEsIHN0cjIsIG4gKTsKIH0KQEAgLTM2OSw3ICszNjgsNyBAQAogICovCiBJTlQzMiBXSU5BUEkgbHN0cm5jbXAzMlcoIExQQ1dTVFIgc3RyMSwgTFBDV1NUUiBzdHIyLCBJTlQzMiBuICkKIHsKLSAgICBkcHJpbnRmX3N0cmluZyhzdGRkZWIsInN0cm5jbXAgTCVzIGFuZCBMJXMgZm9yICVkIGNoYXJzXG4iLAorICAgIGRwcmludGZfaW5mbyhzdHJpbmcsInN0cm5jbXAgTCVzIGFuZCBMJXMgZm9yICVkIGNoYXJzXG4iLAogCQkgICBkZWJ1Z3N0cl93biAoc3RyMSwgbiksIGRlYnVnc3RyX3duIChzdHIyLCBuKSwgbik7CiAgICAgaWYgKCFuKSByZXR1cm4gMDsKICAgICB3aGlsZSAoKC0tbiA+IDApICYmICpzdHIxICYmICgqc3RyMSA9PSAqc3RyMikpIHsgc3RyMSsrOyBzdHIyKys7IH0KQEAgLTM4NCw3ICszODMsNyBAQAogewogICAgIElOVDMyIHJlczsKIAotICAgIGRwcmludGZfc3RyaW5nKHN0ZGRlYiwic3RybmNtcGkgJXMgYW5kICVzIGZvciAlZCBjaGFyc1xuIiwKKyAgICBkcHJpbnRmX2luZm8oc3RyaW5nLCJzdHJuY21waSAlcyBhbmQgJXMgZm9yICVkIGNoYXJzXG4iLAogCQkgICBkZWJ1Z3N0cl9hbiAoc3RyMSwgbiksIGRlYnVnc3RyX2FuIChzdHIyLCBuKSwgbik7CiAgICAgaWYgKCFuKSByZXR1cm4gMDsKICAgICB3aGlsZSAoKC0tbiA+IDApICYmICpzdHIxKQpAQCAtNDAxLDcgKzQwMCw3IEBACiB7CiAgICAgSU5UMzIgcmVzOwogCi0gICAgZHByaW50Zl9zdHJpbmcoc3RkZGViLCJzdHJuY21waSBMJXMgYW5kIEwlcyBmb3IgJWQgY2hhcnNcbiIsCisgICAgZHByaW50Zl9pbmZvKHN0cmluZywic3RybmNtcGkgTCVzIGFuZCBMJXMgZm9yICVkIGNoYXJzXG4iLAogCQkgICBkZWJ1Z3N0cl93biAoc3RyMSwgbiksIGRlYnVnc3RyX3duIChzdHIyLCBuKSwgbik7CiAgICAgaWYgKCFuKSByZXR1cm4gMDsKICAgICB3aGlsZSAoKC0tbiA+IDApICYmICpzdHIxKQpAQCAtNTQyLDkgKzU0MSw5IEBACiB7CiAgICAgTFBTVFIgb2xkZCA9IGQ7CiAgICAgaWYgKCFzIHx8ICFkKSByZXR1cm4gVFJVRTsKLSAgICBkcHJpbnRmX3N0cmluZyAoc3RkZGViLCJDaGFyVG9PZW0gJXNcbiIsIGRlYnVnc3RyX2EgKHMpKTsKKyAgICBkcHJpbnRmX2luZm8oc3RyaW5nLCJDaGFyVG9PZW0gJXNcbiIsIGRlYnVnc3RyX2EgKHMpKTsKICAgICB3aGlsZSAoKCpkKysgPSBBTlNJX1RPX09FTSgqcysrKSkpOwotICAgIGRwcmludGZfc3RyaW5nIChzdGRkZWIsIiAgICAgICB0byAlc1xuIiwgZGVidWdzdHJfYSAob2xkZCkpOworICAgIGRwcmludGZfaW5mbyhzdHJpbmcsIiAgICAgICB0byAlc1xuIiwgZGVidWdzdHJfYSAob2xkZCkpOwogICAgIHJldHVybiBUUlVFOwogfQogCkBAIC01NzYsOSArNTc1LDkgQEAKIHsKICAgICBMUFNUUiBvbGRkID0gZDsKICAgICBpZiAoIXMgfHwgIWQpIHJldHVybiBUUlVFOwotICAgIGRwcmludGZfc3RyaW5nIChzdGRkZWIsIkNoYXJUb09lbSBMJXNcbiIsIGRlYnVnc3RyX3cgKHMpKTsKKyAgICBkcHJpbnRmX2luZm8oc3RyaW5nLCJDaGFyVG9PZW0gTCVzXG4iLCBkZWJ1Z3N0cl93IChzKSk7CiAgICAgd2hpbGUgKCgqZCsrID0gQU5TSV9UT19PRU0oKnMrKykpKTsKLSAgICBkcHJpbnRmX3N0cmluZyAoc3RkZGViLCIgICAgICAgdG8gJXNcbiIsIGRlYnVnc3RyX2EgKG9sZGQpKTsKKyAgICBkcHJpbnRmX2luZm8oc3RyaW5nLCIgICAgICAgdG8gJXNcbiIsIGRlYnVnc3RyX2EgKG9sZGQpKTsKICAgICByZXR1cm4gVFJVRTsKIH0KIApAQCAtNTg5LDkgKzU4OCw5IEBACiBCT09MMzIgV0lOQVBJIE9lbVRvQ2hhcjMyQSggTFBDU1RSIHMsIExQU1RSIGQgKQogewogICAgIExQU1RSIG9sZGQgPSBkOwotICAgIGRwcmludGZfc3RyaW5nKHN0ZGRlYiwiT2VtVG9DaGFyICVzXG4iLCBkZWJ1Z3N0cl9hIChzKSk7CisgICAgZHByaW50Zl9pbmZvKHN0cmluZywiT2VtVG9DaGFyICVzXG4iLCBkZWJ1Z3N0cl9hIChzKSk7CiAgICAgd2hpbGUgKCgqZCsrID0gT0VNX1RPX0FOU0koKnMrKykpKTsKLSAgICBkcHJpbnRmX3N0cmluZyhzdGRkZWIsIiAgICAgICB0byAlc1xuIiwgZGVidWdzdHJfYSAob2xkZCkpOworICAgIGRwcmludGZfaW5mbyhzdHJpbmcsIiAgICAgICB0byAlc1xuIiwgZGVidWdzdHJfYSAob2xkZCkpOwogICAgIHJldHVybiBUUlVFOwogfQogCkBAIC02MDEsNyArNjAwLDcgQEAKICAqLwogQk9PTDMyIFdJTkFQSSBPZW1Ub0NoYXJCdWZmMzJBKCBMUENTVFIgcywgTFBTVFIgZCwgRFdPUkQgbGVuICkKIHsKLSAgICBkcHJpbnRmX3N0cmluZyhzdGRkZWIsIk9lbVRvQ2hhckJ1ZmYgJXNcbiIsIGRlYnVnc3RyX2FuIChzLCBsZW4pKTsKKyAgICBkcHJpbnRmX2luZm8oc3RyaW5nLCJPZW1Ub0NoYXJCdWZmICVzXG4iLCBkZWJ1Z3N0cl9hbiAocywgbGVuKSk7CiAgICAgd2hpbGUgKGxlbi0tKSAqZCsrID0gT0VNX1RPX0FOU0koKnMrKyk7CiAgICAgcmV0dXJuIFRSVUU7CiB9CkBAIC02MTIsNyArNjExLDcgQEAKICAqLwogQk9PTDMyIFdJTkFQSSBPZW1Ub0NoYXJCdWZmMzJXKCBMUENTVFIgcywgTFBXU1RSIGQsIERXT1JEIGxlbiApCiB7Ci0gICAgZHByaW50Zl9zdHJpbmcoc3RkZGViLCJPZW1Ub0NoYXJCdWZmICVzXG4iLCBkZWJ1Z3N0cl9hbiAocywgbGVuKSk7CisgICAgZHByaW50Zl9pbmZvKHN0cmluZywiT2VtVG9DaGFyQnVmZiAlc1xuIiwgZGVidWdzdHJfYW4gKHMsIGxlbikpOwogICAgIHdoaWxlIChsZW4tLSkgKmQrKyA9IChXQ0hBUilPRU1fVE9fQU5TSSgqcysrKTsKICAgICByZXR1cm4gVFJVRTsKIH0KZGlmZiAtLWdpdCBhL21lbW9yeS92aXJ0dWFsLmMgYi9tZW1vcnkvdmlydHVhbC5jCmluZGV4IDQ0MmNjZDUuLjBlZTRmMjEgMTAwNjQ0Ci0tLSBhL21lbW9yeS92aXJ0dWFsLmMKKysrIGIvbWVtb3J5L3ZpcnR1YWwuYwpAQCAtMTgsNyArMTgsNiBAQAogI2luY2x1ZGUgImhlYXAuaCIKICNpbmNsdWRlICJwcm9jZXNzLmgiCiAjaW5jbHVkZSAieG1hbGxvYy5oIgotI2luY2x1ZGUgInN0ZGRlYnVnLmgiCiAjaW5jbHVkZSAiZGVidWcuaCIKIAogI2lmbmRlZiBNU19TWU5DCkBAIC0xMDQsOSArMTAzLDE0IEBACiAgICAgTlVMTCwgICAgICAgICAgICAgICAgICAgICAgLyogc2F0aXNmaWVkICovCiAgICAgTlVMTCwgICAgICAgICAgICAgICAgICAgICAgLyogYWRkX3dhaXQgKi8KICAgICBOVUxMLCAgICAgICAgICAgICAgICAgICAgICAvKiByZW1vdmVfd2FpdCAqLworICAgIE5VTEwsICAgICAgICAgICAgICAgICAgICAgIC8qIHJlYWQgKi8KKyAgICBOVUxMLCAgICAgICAgICAgICAgICAgICAgICAvKiB3cml0ZSAqLwogICAgIFZJUlRVQUxfRGVzdHJveU1hcHBpbmcgICAgIC8qIGRlc3Ryb3kgKi8KIH07CiAKKyNkZWZpbmUgVklSVFVBTF9ERUJVR19EVU1QX1ZJRVcodmlldykgXAorICAgaWYgKCFkZWJ1Z2dpbmdfaW5mbyh2aXJ0dWFsKSk7IGVsc2UgVklSVFVBTF9EdW1wVmlldyh2aWV3KQorCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICAqICAgICAgICAgICBWSVJUVUFMX0dldFByb3RTdHIKICAqLwpAQCAtMTMzLDI5ICsxMzcsMjggQEAKICAgICBVSU5UMzIgYWRkciA9IHZpZXctPmJhc2U7CiAgICAgQllURSBwcm90ID0gdmlldy0+cHJvdFswXTsKIAotICAgIGRwcmludGZfdmlydHVhbCggc3RkZGViLCAiVmlldzogJTA4eCAtICUwOHglcyIsCisgICAgcHJpbnRmKCAiVmlldzogJTA4eCAtICUwOHglcyIsCiAgICAgICAgICAgICAgdmlldy0+YmFzZSwgdmlldy0+YmFzZSArIHZpZXctPnNpemUgLSAxLAogICAgICAgICAgICAgICh2aWV3LT5mbGFncyAmIFZGTEFHX1NZU1RFTSkgPyAiIChzeXN0ZW0pIiA6ICIiICk7CiAgICAgaWYgKHZpZXctPm1hcHBpbmcgJiYgdmlldy0+bWFwcGluZy0+ZmlsZSkKLSAgICAgICAgZHByaW50Zl92aXJ0dWFsKCBzdGRkZWIsICIgJXMgQCAlMDh4XG4iLAotICAgICAgICAgICAgICAgICB2aWV3LT5tYXBwaW5nLT5maWxlLT51bml4X25hbWUsIHZpZXctPm9mZnNldCApOworICAgICAgICBwcmludGYoICIgJXMgQCAlMDh4XG4iLCB2aWV3LT5tYXBwaW5nLT5maWxlLT51bml4X25hbWUsIHZpZXctPm9mZnNldCApOwogICAgIGVsc2UKLSAgICAgICAgZHByaW50Zl92aXJ0dWFsKCBzdGRkZWIsICIgKGFub255bW91cylcbiIpOworICAgICAgICBwcmludGYoICIgKGFub255bW91cylcbiIpOwogCiAgICAgZm9yIChjb3VudCA9IGkgPSAxOyBpIDwgdmlldy0+c2l6ZSA+PiBwYWdlX3NoaWZ0OyBpKyssIGNvdW50KyspCiAgICAgewogICAgICAgICBpZiAodmlldy0+cHJvdFtpXSA9PSBwcm90KSBjb250aW51ZTsKLSAgICAgICAgZHByaW50Zl92aXJ0dWFsKCBzdGRkZWIsICIgICAgICAlMDh4IC0gJTA4eCAlc1xuIiwKLSAgICAgICAgICAgICAgICAgYWRkciwgYWRkciArIChjb3VudCA8PCBwYWdlX3NoaWZ0KSAtIDEsCi0gICAgICAgICAgICAgICAgIFZJUlRVQUxfR2V0UHJvdFN0cihwcm90KSApOworICAgICAgICBwcmludGYoICIgICAgICAlMDh4IC0gJTA4eCAlc1xuIiwKKyAgICAgICAgICAgICAgICBhZGRyLCBhZGRyICsgKGNvdW50IDw8IHBhZ2Vfc2hpZnQpIC0gMSwKKyAgICAgICAgICAgICAgICBWSVJUVUFMX0dldFByb3RTdHIocHJvdCkgKTsKICAgICAgICAgYWRkciArPSAoY291bnQgPDwgcGFnZV9zaGlmdCk7CiAgICAgICAgIHByb3QgPSB2aWV3LT5wcm90W2ldOwogICAgICAgICBjb3VudCA9IDA7CiAgICAgfQogICAgIGlmIChjb3VudCkKLSAgICAgICAgZHByaW50Zl92aXJ0dWFsKCBzdGRkZWIsICIgICAgICAlMDh4IC0gJTA4eCAlc1xuIiwKLSAgICAgICAgICAgICAgICAgYWRkciwgYWRkciArIChjb3VudCA8PCBwYWdlX3NoaWZ0KSAtIDEsCi0gICAgICAgICAgICAgICAgIFZJUlRVQUxfR2V0UHJvdFN0cihwcm90KSApOworICAgICAgICBwcmludGYoICIgICAgICAlMDh4IC0gJTA4eCAlc1xuIiwKKyAgICAgICAgICAgICAgICBhZGRyLCBhZGRyICsgKGNvdW50IDw8IHBhZ2Vfc2hpZnQpIC0gMSwKKyAgICAgICAgICAgICAgICBWSVJUVUFMX0dldFByb3RTdHIocHJvdCkgKTsKIH0KIAogCkBAIC0xNjUsNyArMTY4LDcgQEAKIHZvaWQgVklSVFVBTF9EdW1wKHZvaWQpCiB7CiAgICAgRklMRV9WSUVXICp2aWV3ID0gVklSVFVBTF9GaXJzdFZpZXc7Ci0gICAgZHByaW50Zl92aXJ0dWFsKCBzdGRkZWIsICJcbkR1bXAgb2YgYWxsIHZpcnR1YWwgbWVtb3J5IHZpZXdzOlxuXG4iICk7CisgICAgcHJpbnRmKCAiXG5EdW1wIG9mIGFsbCB2aXJ0dWFsIG1lbW9yeSB2aWV3czpcblxuIiApOwogICAgIHdoaWxlICh2aWV3KQogICAgIHsKICAgICAgICAgVklSVFVBTF9EdW1wVmlldyggdmlldyApOwpAQCAtMjM1LDcgKzIzOCw3IEBACiAgICAgICAgIGlmICh2aWV3LT5uZXh0KSB2aWV3LT5uZXh0LT5wcmV2ID0gdmlldzsKICAgICAgICAgcHJldi0+bmV4dCAgPSB2aWV3OwogICAgIH0KLSAgICBpZiAoZGVidWdnaW5nX3ZpcnR1YWwpIFZJUlRVQUxfRHVtcFZpZXcoIHZpZXcgKTsKKyAgICBWSVJUVUFMX0RFQlVHX0RVTVBfVklFVyggdmlldyApOwogICAgIHJldHVybiB2aWV3OwogfQogCkBAIC0zNDIsNyArMzQ1LDcgQEAKIHN0YXRpYyBCT09MMzIgVklSVFVBTF9TZXRQcm90KCBGSUxFX1ZJRVcgKnZpZXcsIFVJTlQzMiBiYXNlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFVJTlQzMiBzaXplLCBCWVRFIHZwcm90ICkKIHsKLSAgICBkcHJpbnRmX3ZpcnR1YWwoIHN0ZGRlYiwgIlZJUlRVQUxfU2V0UHJvdDogJTA4eC0lMDh4ICVzXG4iLAorICAgIGRwcmludGZfaW5mbyh2aXJ0dWFsLCAiVklSVFVBTF9TZXRQcm90OiAlMDh4LSUwOHggJXNcbiIsCiAgICAgICAgICAgICAgICAgICAgICBiYXNlLCBiYXNlICsgc2l6ZSAtIDEsIFZJUlRVQUxfR2V0UHJvdFN0ciggdnByb3QgKSApOwogCiAgICAgaWYgKG1wcm90ZWN0KCAodm9pZCAqKWJhc2UsIHNpemUsIFZJUlRVQUxfR2V0VW5peFByb3QodnByb3QpICkpCkBAIC0zNTAsNyArMzUzLDcgQEAKIAogICAgIG1lbXNldCggdmlldy0+cHJvdCArICgoYmFzZSAtIHZpZXctPmJhc2UpID4+IHBhZ2Vfc2hpZnQpLAogICAgICAgICAgICAgdnByb3QsIHNpemUgPj4gcGFnZV9zaGlmdCApOwotICAgIGlmIChkZWJ1Z2dpbmdfdmlydHVhbCkgVklSVFVBTF9EdW1wVmlldyggdmlldyApOworICAgIFZJUlRVQUxfREVCVUdfRFVNUF9WSUVXKCB2aWV3ICk7CiAgICAgcmV0dXJuIFRSVUU7CiB9CiAKQEAgLTM5OSw3ICs0MDIsNyBAQAogICAgICAgICBpbnQgZmQgPSBvcGVuICgiL3Byb2Mvc2VsZi9tYXBzIiwgT19SRE9OTFkpOwogICAgICAgICBpZiAoZmQgPj0gMCkKICAgICAgICAgewotICAgICAgICAgICAgY2hhciBidWZmZXJbODBdOworICAgICAgICAgICAgY2hhciBidWZmZXJbNTEyXTsgLyogbGluZSBtaWdodCBiZSByYXRoZXIgbG9uZyBpbiAyLjEgKi8KIAogICAgICAgICAgICAgZm9yICg7OykKICAgICAgICAgICAgIHsKQEAgLTQ0MSw3ICs0NDQsNyBAQAogICAgIFVJTlQzMiBiYXNlLCBwdHIsIHZpZXdfc2l6ZTsKICAgICBCWVRFIHZwcm90OwogCi0gICAgZHByaW50Zl92aXJ0dWFsKCBzdGRkZWIsICJWaXJ0dWFsQWxsb2M6ICUwOHggJTA4bHggJWx4ICUwOGx4XG4iLAorICAgIGRwcmludGZfaW5mbyh2aXJ0dWFsLCAiVmlydHVhbEFsbG9jOiAlMDh4ICUwOGx4ICVseCAlMDhseFxuIiwKICAgICAgICAgICAgICAgICAgICAgIChVSU5UMzIpYWRkciwgc2l6ZSwgdHlwZSwgcHJvdGVjdCApOwogCiAgICAgLyogUm91bmQgcGFyYW1ldGVycyB0byBhIHBhZ2UgYm91bmRhcnkgKi8KQEAgLTQ3MCw2ICs0NzMsMTMgQEAKICAgICAgICAgc2l6ZSA9IChzaXplICsgcGFnZV9tYXNrKSAmIH5wYWdlX21hc2s7CiAgICAgfQogCisgICAgaWYgKHR5cGUgJiBNRU1fVE9QX0RPV04pIHsKKyAgICAJLyogRklYTUU6IE1FTV9UT1BfRE9XTiBhbGxvY2F0ZXMgdGhlIGxhcmdlc3QgcG9zc2libGUgYWRkcmVzcy4KKwkgKiAgCSAgSXMgdGhlcmUgX0FOWV8gd2F5IHRvIGRvIGl0IHdpdGggVU5JWCBtbWFwKCk/CisJICovCisgICAgCWZwcmludGYoc3RkZXJyLCJWaXJ0dWFsQWxsb2M6TUVNX1RPUF9ET1dOIGlnbm9yZWRcbiIpOworICAgIAl0eXBlICY9IH5NRU1fVE9QX0RPV047CisgICAgfQogICAgIC8qIENvbXB1dGUgdGhlIHByb3RlY3Rpb24gZmxhZ3MgKi8KIAogICAgIGlmICghKHR5cGUgJiAoTUVNX0NPTU1JVCB8IE1FTV9SRVNFUlZFKSkgfHwKQEAgLTUyMiw3ICs1MzIsNyBAQAogICAgICAgICAgICAgU2V0TGFzdEVycm9yKCBFUlJPUl9PVVRPRk1FTU9SWSApOwogICAgICAgICAgICAgcmV0dXJuIE5VTEw7CiAgICAgICAgIH0KLSAgICAgICAgaWYgKGRlYnVnZ2luZ192aXJ0dWFsKSBWSVJUVUFMX0R1bXBWaWV3KCB2aWV3ICk7CisgICAgICAgIFZJUlRVQUxfREVCVUdfRFVNUF9WSUVXKCB2aWV3ICk7CiAgICAgICAgIHJldHVybiAoTFBWT0lEKXB0cjsKICAgICB9CiAKQEAgLTU0OCw3ICs1NTgsNyBAQAogICAgIEZJTEVfVklFVyAqdmlldzsKICAgICBVSU5UMzIgYmFzZTsKIAotICAgIGRwcmludGZfdmlydHVhbCggc3RkZGViLCAiVmlydHVhbEZyZWU6ICUwOHggJTA4bHggJWx4XG4iLAorICAgIGRwcmludGZfaW5mbyh2aXJ0dWFsLCAiVmlydHVhbEZyZWU6ICUwOHggJTA4bHggJWx4XG4iLAogICAgICAgICAgICAgICAgICAgICAgKFVJTlQzMilhZGRyLCBzaXplLCB0eXBlICk7CiAKICAgICAvKiBGaXggdGhlIHBhcmFtZXRlcnMgKi8KQEAgLTYxOCw3ICs2MjgsNyBAQAogICAgIFVJTlQzMiBiYXNlLCBpOwogICAgIEJZVEUgdnByb3QsICpwOwogCi0gICAgZHByaW50Zl92aXJ0dWFsKCBzdGRkZWIsICJWaXJ0dWFsUHJvdGVjdDogJTA4eCAlMDhseCAlMDhseFxuIiwKKyAgICBkcHJpbnRmX2luZm8odmlydHVhbCwgIlZpcnR1YWxQcm90ZWN0OiAlMDh4ICUwOGx4ICUwOGx4XG4iLAogICAgICAgICAgICAgICAgICAgICAgKFVJTlQzMilhZGRyLCBzaXplLCBuZXdfcHJvdCApOwogCiAgICAgLyogRml4IHRoZSBwYXJhbWV0ZXJzICovCkBAIC04OTAsNyArOTAwLDcgQEAKIAogICAgIC8qIENoZWNrIHBhcmFtZXRlcnMgKi8KIAotICAgIGRwcmludGZfdmlydHVhbChzdGRkZWIsIkNyZWF0ZUZpbGVNYXBwaW5nMzJBKCV4LCVwLCUwOGx4LCUwOGx4JTA4bHgsJXMpXG4iLAorICAgIGRwcmludGZfaW5mbyh2aXJ0dWFsLCJDcmVhdGVGaWxlTWFwcGluZzMyQSgleCwlcCwlMDhseCwlMDhseCUwOGx4LCVzKVxuIiwKICAgICAgICAgICAgICAgICAgICAgaEZpbGUsIGF0dHIsIHByb3RlY3QsIHNpemVfaGlnaCwgc2l6ZV9sb3csIG5hbWUgKTsKIAogICAgIHZwcm90ID0gVklSVFVBTF9HZXRQcm90KCBwcm90ZWN0ICk7CkBAIC0xMTAyLDcgKzExMTIsNyBAQAogCiAgICAgLyogTWFwIHRoZSBmaWxlICovCiAKLSAgICBkcHJpbnRmX3ZpcnR1YWwoIHN0ZGRlYiwgIk1hcFZpZXdPZkZpbGU6IGhhbmRsZT0leCBzaXplPSV4IG9mZnNldD0lbHhcbiIsCisgICAgZHByaW50Zl9pbmZvKHZpcnR1YWwsICJNYXBWaWV3T2ZGaWxlOiBoYW5kbGU9JXggc2l6ZT0leCBvZmZzZXQ9JWx4XG4iLAogICAgICAgICAgICAgICAgICAgICAgaGFuZGxlLCBzaXplLCBvZmZzZXRfbG93ICk7CiAKICAgICBwdHIgPSAoVUlOVDMyKUZJTEVfZG9tbWFwKCBtYXBwaW5nLT5maWxlLCBhZGRyLCAwLCBzaXplLCAwLCBvZmZzZXRfbG93LApAQCAtMTEzNyw3ICsxMTQ3LDcgQEAKICAgICBGSUxFX1ZJRVcgKnZpZXc7CiAgICAgVUlOVDMyIGFkZHIgPSBST1VORF9BRERSKCBiYXNlICk7CiAKLSAgICBkcHJpbnRmX3ZpcnR1YWwoIHN0ZGRlYiwgIkZsdXNoVmlld09mRmlsZSBhdCAlcCBmb3IgJWxkIGJ5dGVzXG4iLAorICAgIGRwcmludGZfaW5mbyh2aXJ0dWFsLCAiRmx1c2hWaWV3T2ZGaWxlIGF0ICVwIGZvciAlbGQgYnl0ZXNcbiIsCiAgICAgICAgICAgICAgICAgICAgICBiYXNlLCBjYkZsdXNoICk7CiAKICAgICBpZiAoISh2aWV3ID0gVklSVFVBTF9GaW5kVmlldyggYWRkciApKSkKZGlmZiAtLWdpdCBhL21pc2MvYXNwaS5jIGIvbWlzYy9hc3BpLmMKaW5kZXggOTkzY2Q0YS4uMzYzYzQyNCAxMDA2NDQKLS0tIGEvbWlzYy9hc3BpLmMKKysrIGIvbWlzYy9hc3BpLmMKQEAgLTEzLDcgKzEzLDcgQEAKICNpbmNsdWRlICJvcHRpb25zLmgiCiAjaW5jbHVkZSAiaGVhcC5oIgogI2luY2x1ZGUgImRlYnVnLmgiCi0jaW5jbHVkZSAic3RkZGVidWcuaCIKKwogCiAvKiBGSVhNRSEKICAqIDEpIFJlc2lkdWFsIGJ5dGUgbGVuZ3RoIHJlcG9ydGluZyBub3QgaGFuZGxlZApAQCAtMTIyLDE2ICsxMjIsMTYgQEAKICAgICBzcHJpbnRmKGlkc3RyLCAic2NzaSBjJTFkdCUxZGQlMWQiLCBwcmItPlNSQl9IYUlkLCBwcmItPlNSQl9UYXJnZXQsIHByYi0+U1JCX0x1bik7CiAKICAgICBpZiAoIVBST0ZJTEVfR2V0V2luZUluaVN0cmluZyhpZHN0ciwgIkRldmljZSIsICIiLCBkZXZpY2Vfc3RyLCBzaXplb2YoZGV2aWNlX3N0cikpKSB7Ci0JZHByaW50Zl9hc3BpKHN0ZGRlYiwgIlRyeWluZyB0byBvcGVuIHVubGlzdGVkIHNjc2kgZGV2aWNlICVzXG4iLCBpZHN0cik7CisJZHByaW50Zl9pbmZvKGFzcGksICJUcnlpbmcgdG8gb3BlbiB1bmxpc3RlZCBzY3NpIGRldmljZSAlc1xuIiwgaWRzdHIpOwogCXJldHVybiAtMTsKICAgICB9CiAKLSAgICBkcHJpbnRmX2FzcGkoc3RkZGViLCAiT3BlbmluZyBkZXZpY2UgJXM9JXNcbiIsIGlkc3RyLCBkZXZpY2Vfc3RyKTsKKyAgICBkcHJpbnRmX2luZm8oYXNwaSwgIk9wZW5pbmcgZGV2aWNlICVzPSVzXG4iLCBpZHN0ciwgZGV2aWNlX3N0cik7CiAKICAgICBmZCA9IG9wZW4oZGV2aWNlX3N0ciwgT19SRFdSKTsKICAgICBpZiAoZmQgPT0gLTEpIHsKIAlpbnQgc2F2ZV9lcnJvciA9IGVycm5vOwotCWRwcmludGZfYXNwaShzdGRkZWIsICJFcnJvciBvcGVuaW5nIGRldmljZSBlcnJubz0lZFxuIiwgc2F2ZV9lcnJvcik7CisJZHByaW50Zl93YXJuKGFzcGksICJFcnJvciBvcGVuaW5nIGRldmljZSBlcnJubz0lZFxuIiwgc2F2ZV9lcnJvcik7CiAJcmV0dXJuIC0xOwogICAgIH0KIApAQCAtMTU2LDU5ICsxNTYsNTggQEAKICAgaW50CWk7CiAgIEJZVEUgKmNkYjsKICAgQllURSAqbHBCdWY7CisgIGRiZ19kZWNsX3N0cihhc3BpLCA1MTIpOwogCiAgIGxwQnVmID0gUFRSX1NFR19UT19MSU4ocHJiLT5TUkJfQnVmUG9pbnRlcik7CiAKICAgc3dpdGNoIChwcmItPkNEQkJ5dGVbMF0pIHsKICAgY2FzZSBDTURfSU5RVUlSWToKLSAgICBkcHJpbnRmX2FzcGkoc3RkZGViLCAie1xuIik7Ci0gICAgZHByaW50Zl9hc3BpKHN0ZGRlYiwgIlx0RVZQRDogJWRcbiIsIHByYi0+Q0RCQnl0ZVsxXSAmIDEpOwotICAgIGRwcmludGZfYXNwaShzdGRkZWIsICJcdExVTjogJWRcbiIsIChwcmItPkNEQkJ5dGVbMV0gJiAweGMpID4+IDEpOwotICAgIGRwcmludGZfYXNwaShzdGRkZWIsICJcdFBBR0UgQ09ERTogJWRcbiIsIHByYi0+Q0RCQnl0ZVsyXSk7Ci0gICAgZHByaW50Zl9hc3BpKHN0ZGRlYiwgIlx0QUxMT0NBVElPTiBMRU5HVEg6ICVkXG4iLCBwcmItPkNEQkJ5dGVbNF0pOwotICAgIGRwcmludGZfYXNwaShzdGRkZWIsICJcdENPTlRST0w6ICVkXG4iLCBwcmItPkNEQkJ5dGVbNV0pOwotICAgIGRwcmludGZfYXNwaShzdGRkZWIsICJ9XG4iKTsKKyAgICBkcHJpbnRmX2luZm8oYXNwaSwgIntcbiIpOworICAgIGRwcmludGZfaW5mbyhhc3BpLCAiXHRFVlBEOiAlZFxuIiwgcHJiLT5DREJCeXRlWzFdICYgMSk7CisgICAgZHByaW50Zl9pbmZvKGFzcGksICJcdExVTjogJWRcbiIsIChwcmItPkNEQkJ5dGVbMV0gJiAweGMpID4+IDEpOworICAgIGRwcmludGZfaW5mbyhhc3BpLCAiXHRQQUdFIENPREU6ICVkXG4iLCBwcmItPkNEQkJ5dGVbMl0pOworICAgIGRwcmludGZfaW5mbyhhc3BpLCAiXHRBTExPQ0FUSU9OIExFTkdUSDogJWRcbiIsIHByYi0+Q0RCQnl0ZVs0XSk7CisgICAgZHByaW50Zl9pbmZvKGFzcGksICJcdENPTlRST0w6ICVkXG4iLCBwcmItPkNEQkJ5dGVbNV0pOworICAgIGRwcmludGZfaW5mbyhhc3BpLCAifVxuIik7CiAgICAgYnJlYWs7CiAgIGNhc2UgQ01EX1NDQU5fU0NBTjoKLSAgICBkcHJpbnRmX2FzcGkoc3RkZGViLCAiVHJhbnNmZXIgTGVuZ3RoOiAlZFxuIiwgcHJiLT5DREJCeXRlWzRdKTsKKyAgICBkcHJpbnRmX2luZm8oYXNwaSwgIlRyYW5zZmVyIExlbmd0aDogJWRcbiIsIHByYi0+Q0RCQnl0ZVs0XSk7CiAgICAgYnJlYWs7CiAgIH0KIAotICBkcHJpbnRmX2FzcGkoc3RkZGViLCAiSG9zdCBBZGFwdGVyOiAlZFxuIiwgcHJiLT5TUkJfSGFJZCk7Ci0gIGRwcmludGZfYXNwaShzdGRkZWIsICJGbGFnczogJWRcbiIsIHByYi0+U1JCX0ZsYWdzKTsKKyAgZHByaW50Zl9pbmZvKGFzcGksICJIb3N0IEFkYXB0ZXI6ICVkXG4iLCBwcmItPlNSQl9IYUlkKTsKKyAgZHByaW50Zl9pbmZvKGFzcGksICJGbGFnczogJWRcbiIsIHByYi0+U1JCX0ZsYWdzKTsKICAgaWYgKFRBUkdFVF9UT19IT1NUKHByYikpIHsKLSAgICBkcHJpbnRmX2FzcGkoc3RkZGViLCAiXHREYXRhIHRyYW5zZmVyOiBUYXJnZXQgdG8gaG9zdC4gTGVuZ3RoIGNoZWNrZWQuXG4iKTsKKyAgICBkcHJpbnRmX2luZm8oYXNwaSwgIlx0RGF0YSB0cmFuc2ZlcjogVGFyZ2V0IHRvIGhvc3QuIExlbmd0aCBjaGVja2VkLlxuIik7CiAgIH0KICAgZWxzZSBpZiAoSE9TVF9UT19UQVJHRVQocHJiKSkgewotICAgIGRwcmludGZfYXNwaShzdGRkZWIsICJcdERhdGEgdHJhbnNmZXI6IEhvc3QgdG8gdGFyZ2V0LiBMZW5ndGggY2hlY2tlZC5cbiIpOworICAgIGRwcmludGZfaW5mbyhhc3BpLCAiXHREYXRhIHRyYW5zZmVyOiBIb3N0IHRvIHRhcmdldC4gTGVuZ3RoIGNoZWNrZWQuXG4iKTsKICAgfQogICBlbHNlIGlmIChOT19EQVRBX1RSQU5TRkVSRUQocHJiKSkgewotICAgIGRwcmludGZfYXNwaShzdGRkZWIsICJcdERhdGEgdHJhbnNmZXI6IG5vbmVcbiIpOworICAgIGRwcmludGZfaW5mbyhhc3BpLCAiXHREYXRhIHRyYW5zZmVyOiBub25lXG4iKTsKICAgfQogICBlbHNlIHsKLSAgICBkcHJpbnRmX2FzcGkoc3RkZGViLCAiXHRUcmFuc2ZlciBieSBzY3NpIGNtZC4gTGVuZ3RoIG5vdCBjaGVja2VkXG4iKTsKKyAgICBkcHJpbnRmX3dhcm4oYXNwaSwgIlx0VHJhbnNmZXIgYnkgc2NzaSBjbWQuIExlbmd0aCBub3QgY2hlY2tlZFxuIik7CiAgIH0KIAotICBkcHJpbnRmX2FzcGkoc3RkZGViLCAiXHRSZXNpZHVhbCBieXRlIGxlbmd0aCByZXBvcnRpbmcgJXNcbiIsIHByYi0+U1JCX0ZsYWdzICYgMHg0ID8gImVuYWJsZWQiIDogImRpc2FibGVkIik7Ci0gIGRwcmludGZfYXNwaShzdGRkZWIsICJcdExpbmtpbmcgJXNcbiIsIHByYi0+U1JCX0ZsYWdzICYgMHgyID8gImVuYWJsZWQiIDogImRpc2FibGVkIik7Ci0gIGRwcmludGZfYXNwaShzdGRkZWIsICJcdFBvc3RpbmcgJXNcbiIsIHByYi0+U1JCX0ZsYWdzICYgMHgxID8gImVuYWJsZWQiIDogImRpc2FibGVkIik7Ci0gIGRwcmludGZfYXNwaShzdGRkZWIsICJUYXJnZXQ6ICVkXG4iLCBwcmItPlNSQl9UYXJnZXQpOwotICBkcHJpbnRmX2FzcGkoc3RkZGViLCAiTHVuOiAlZFxuIiwgcHJiLT5TUkJfTHVuKTsKLSAgZHByaW50Zl9hc3BpKHN0ZGRlYiwgIkJ1ZkxlbjogJWxkXG4iLCBwcmItPlNSQl9CdWZMZW4pOwotICBkcHJpbnRmX2FzcGkoc3RkZGViLCAiU2Vuc2VMZW46ICVkXG4iLCBwcmItPlNSQl9TZW5zZUxlbik7Ci0gIGRwcmludGZfYXNwaShzdGRkZWIsICJCdWZQdHI6ICVseCAoJXApXG4iLCBwcmItPlNSQl9CdWZQb2ludGVyLCBscEJ1Zik7Ci0gIGRwcmludGZfYXNwaShzdGRkZWIsICJMaW5rUG9pbnRlciAlbHhcbiIsIHByYi0+U1JCX1JzdmQxKTsKLSAgZHByaW50Zl9hc3BpKHN0ZGRlYiwgIkNEQiBMZW5ndGg6ICVkXG4iLCBwcmItPlNSQl9DREJMZW4pOwotICBkcHJpbnRmX2FzcGkoc3RkZGViLCAiUE9TVCBQcm9jOiAlbHhcbiIsIChEV09SRCkgcHJiLT5TUkJfUG9zdFByb2MpOworICBkcHJpbnRmX2luZm8oYXNwaSwgIlx0UmVzaWR1YWwgYnl0ZSBsZW5ndGggcmVwb3J0aW5nICVzXG4iLCBwcmItPlNSQl9GbGFncyAmIDB4NCA/ICJlbmFibGVkIiA6ICJkaXNhYmxlZCIpOworICBkcHJpbnRmX2luZm8oYXNwaSwgIlx0TGlua2luZyAlc1xuIiwgcHJiLT5TUkJfRmxhZ3MgJiAweDIgPyAiZW5hYmxlZCIgOiAiZGlzYWJsZWQiKTsKKyAgZHByaW50Zl9pbmZvKGFzcGksICJcdFBvc3RpbmcgJXNcbiIsIHByYi0+U1JCX0ZsYWdzICYgMHgxID8gImVuYWJsZWQiIDogImRpc2FibGVkIik7CisgIGRwcmludGZfaW5mbyhhc3BpLCAiVGFyZ2V0OiAlZFxuIiwgcHJiLT5TUkJfVGFyZ2V0KTsKKyAgZHByaW50Zl9pbmZvKGFzcGksICJMdW46ICVkXG4iLCBwcmItPlNSQl9MdW4pOworICBkcHJpbnRmX2luZm8oYXNwaSwgIkJ1ZkxlbjogJWxkXG4iLCBwcmItPlNSQl9CdWZMZW4pOworICBkcHJpbnRmX2luZm8oYXNwaSwgIlNlbnNlTGVuOiAlZFxuIiwgcHJiLT5TUkJfU2Vuc2VMZW4pOworICBkcHJpbnRmX2luZm8oYXNwaSwgIkJ1ZlB0cjogJWx4ICglcClcbiIsIHByYi0+U1JCX0J1ZlBvaW50ZXIsIGxwQnVmKTsKKyAgZHByaW50Zl9pbmZvKGFzcGksICJMaW5rUG9pbnRlciAlbHhcbiIsIHByYi0+U1JCX1JzdmQxKTsKKyAgZHByaW50Zl9pbmZvKGFzcGksICJDREIgTGVuZ3RoOiAlZFxuIiwgcHJiLT5TUkJfQ0RCTGVuKTsKKyAgZHByaW50Zl9pbmZvKGFzcGksICJQT1NUIFByb2M6ICVseFxuIiwgKERXT1JEKSBwcmItPlNSQl9Qb3N0UHJvYyk7CiAgIGNkYiA9ICZwcmItPkNEQkJ5dGVbMF07Ci0gIGRwcmludGZfYXNwaShzdGRkZWIsICJDREIgYnVmZmVyWyIpOwogICBjbWQgPSBwcmItPkNEQkJ5dGVbMF07CiAgIGZvciAoaSA9IDA7IGkgPCBwcmItPlNSQl9DREJMZW47IGkrKykgewotICAgIGlmIChpICE9IDApCi0gICAgICBkcHJpbnRmX2FzcGkoc3RkZGViLCAiLCIpOwotICAgIGRwcmludGZfYXNwaShzdGRkZWIsICIlMDJ4IiwgKmNkYisrKTsKKyAgICBpZiAoaSAhPSAwKSBkc3ByaW50Zihhc3BpLCAiLCIpOworICAgIGRzcHJpbnRmKGFzcGksICIlMDJ4IiwgKmNkYisrKTsKICAgfQotICBkcHJpbnRmX2FzcGkoc3RkZGViLCAiXVxuIik7CisgIGRwcmludGZfaW5mbyhhc3BpLCAiQ0RCIGJ1ZmZlclslc11cbiIsIGRiZ19zdHIoYXNwaSkpOwogfQogCiBzdGF0aWMgdm9pZApAQCAtMjE2LDE1ICsyMTUsMTQgQEAKIHsKICAgaW50CWk7CiAgIEJZVEUgKmNkYjsKKyAgZGJnX2RlY2xfc3RyKGFzcGksIDUxMik7CiAKICAgY2RiID0gJnByYi0+Q0RCQnl0ZVswXTsKLSAgZHByaW50Zl9hc3BpKHN0ZGRlYiwgIlNlbnNlQXJlYVsiKTsKICAgZm9yIChpID0gMDsgaSA8IHByYi0+U1JCX1NlbnNlTGVuOyBpKyspIHsKLSAgICBpZiAoaSkKLSAgICAgIGRwcmludGZfYXNwaShzdGRkZWIsICIsIik7Ci0gICAgZHByaW50Zl9hc3BpKHN0ZGRlYiwgIiUwMngiLCAqY2RiKyspOworICAgIGlmIChpKSBkc3ByaW50Zihhc3BpLCAiLCIpOworICAgIGRzcHJpbnRmKGFzcGksICIlMDJ4IiwgKmNkYisrKTsKICAgfQotICBkcHJpbnRmX2FzcGkoc3RkZGViLCAiXVxuIik7CisgIGRwcmludGZfaW5mbyhhc3BpLCAiU2Vuc2VBcmVhWyVzXVxuIiwgZGJnX3N0cihhc3BpKSk7CiB9CiAKIHN0YXRpYyB2b2lkCkBAIC0yMzYsNyArMjM0LDcgQEAKIAogICBzd2l0Y2ggKHByYi0+Q0RCQnl0ZVswXSkgewogICBjYXNlIENNRF9JTlFVSVJZOgotICAgIGRwcmludGZfYXNwaShzdGRkZWIsICJWZW5kb3I6ICVzXG4iLCBscEJ1ZiArIElOUVVJUllfVkVORE9SKTsKKyAgICBkcHJpbnRmX2luZm8oYXNwaSwgIlZlbmRvcjogJXNcbiIsIGxwQnVmICsgSU5RVUlSWV9WRU5ET1IpOwogICAgIGJyZWFrOwogICBjYXNlIENNRF9URVNUX1VOSVRfUkVBRFk6CiAgICAgUHJpbnRTZW5zZUFyZWExNihwcmIpOwpAQCAtMzE0LDIwICszMTIsMjAgQEAKIAlpZiAobXllcnJvciA9PSBFTk9NRU0pIHsKIAkgICAgZnByaW50ZihzdGRlcnIsICJBU1BJOiBMaW51eCBnZW5lcmljIHNjc2kgZHJpdmVyXG4gIFlvdSBwcm9iYWJseSBuZWVkIHRvIHJlLWNvbXBpbGUgeW91ciBrZXJuZWwgd2l0aCBhIGxhcmdlciBTR19CSUdfQlVGRiB2YWx1ZSAoc2cuaClcbiAgU3VnZ2VzdCAxMzA1NjBcbiIpOwogCX0KLQlkcHJpbnRmX2FzcGkoc3RkZGViLCAiZXJybm86ID0gJWRcbiIsIG15ZXJyb3IpOworCWRwcmludGZfd2Fybihhc3BpLCAiZXJybm86ID0gJWRcbiIsIG15ZXJyb3IpOwogICAgIH0KICAgICBnb3RvIGVycm9yX2V4aXQ7CiAgIH0KIAogICBzdGF0dXMgPSByZWFkKGZkLCBzZ19yZXBseV9oZHIsIG91dF9sZW4pOwogICBpZiAoc3RhdHVzIDwgMCB8fCBzdGF0dXMgIT0gb3V0X2xlbikgewotICAgIGRwcmludGZfYXNwaShzdGRkZWIsICJub3QgZW5vdWdoIGJ5dGVzIHJlYWQgZnJvbSBzY3NpIGRldmljZSVkXG4iLCBzdGF0dXMpOworICAgIGRwcmludGZfd2Fybihhc3BpLCAibm90IGVub3VnaCBieXRlcyByZWFkIGZyb20gc2NzaSBkZXZpY2UlZFxuIiwgc3RhdHVzKTsKICAgICBnb3RvIGVycm9yX2V4aXQ7CiAgIH0KIAogICBpZiAoc2dfcmVwbHlfaGRyLT5yZXN1bHQgIT0gMCkgewogICAgIGVycm9yX2NvZGUgPSBzZ19yZXBseV9oZHItPnJlc3VsdDsKLSAgICBkcHJpbnRmX2FzcGkoc3RkZGViLCAicmVwbHkgaGVhZGVyIGVycm9yICglZClcbiIsIHNnX3JlcGx5X2hkci0+cmVzdWx0KTsKKyAgICBkcHJpbnRmX3dhcm4oYXNwaSwgInJlcGx5IGhlYWRlciBlcnJvciAoJWQpXG4iLCBzZ19yZXBseV9oZHItPnJlc3VsdCk7CiAgICAgZ290byBlcnJvcl9leGl0OwogICB9CiAKQEAgLTM1MSw3ICszNDksNyBAQAogICAvKiBub3cgZG8gIHBvc3RpbmcgKi8KIAogICBpZiAoQVNQSV9QT1NUSU5HKHByYikgJiYgcHJiLT5TUkJfUG9zdFByb2MpIHsKLSAgICBkcHJpbnRmX2FzcGkoc3RkZGViLCAiQVNQSTogUG9zdCBSb3V0aW5lICglbHgpIGNhbGxlZFxuIiwgKERXT1JEKSBwcmItPlNSQl9Qb3N0UHJvYyk7CisgICAgZHByaW50Zl9pbmZvKGFzcGksICJBU1BJOiBQb3N0IFJvdXRpbmUgKCVseCkgY2FsbGVkXG4iLCAoRFdPUkQpIHByYi0+U1JCX1Bvc3RQcm9jKTsKICAgICBDYWxsYmFja3MtPkNhbGxBU1BJUG9zdFByb2MocHJiLT5TUkJfUG9zdFByb2MsIHNlZ3B0cl9wcmIpOwogICB9CiAKQEAgLTM2MywxNyArMzYxLDE3IEBACiBlcnJvcl9leGl0OgogICBpZiAoZXJyb3JfY29kZSA9PSBFQlVTWSkgewogICAgICAgcHJiLT5TUkJfU3RhdHVzID0gU1NfQVNQSV9JU19CVVNZOwotICAgICAgZHByaW50Zl9hc3BpKHN0ZGRlYiwgIkFTUEk6IERldmljZSBidXN5XG4iKTsKKyAgICAgIGRwcmludGZfaW5mbyhhc3BpLCAiQVNQSTogRGV2aWNlIGJ1c3lcbiIpOwogICB9CiAgIGVsc2UgewotICAgICAgZHByaW50Zl9hc3BpKHN0ZGRlYiwgIkFTUElfR2VuZXJpY0hhbmRsZVNjc2lDbWQgZmFpbGVkXG4iKTsKKyAgICAgIGRwcmludGZfd2Fybihhc3BpLCAiQVNQSV9HZW5lcmljSGFuZGxlU2NzaUNtZCBmYWlsZWRcbiIpOwogICAgICAgcHJiLT5TUkJfU3RhdHVzID0gU1NfRVJSOwogICB9CiAKICAgLyogSSdtIG5vdCBzdXJlIGV4YWN0bHkgZXJyb3IgY29kZXMgd29yayBoZXJlCiAgICAqIFdlIHByb2JhYmx5IHNob3VsZCBzZXQgcHJiLT5TUkJfVGFyZ1N0YXQsIFNSQl9IYVN0YXQgPwogICAgKi8KLSAgZHByaW50Zl9hc3BpKHN0ZGRlYiwgIkFTUElfR2VuZXJpY0hhbmRsZVNjc2lDbWQ6IGVycm9yX2V4aXRcbiIpOworICBkcHJpbnRmX3dhcm4oYXNwaSwgIkFTUElfR2VuZXJpY0hhbmRsZVNjc2lDbWQ6IGVycm9yX2V4aXRcbiIpOwogICBmcmVlKHNnX3JlcGx5X2hkcik7CiAgIGZyZWUoc2dfaGQpOwogICByZXR1cm4gcHJiLT5TUkJfU3RhdHVzOwpAQCAtMzg3LDcgKzM4NSw3IEBACiBXT1JEIFdJTkFQSSBHZXRBU1BJU3VwcG9ydEluZm8xNigpCiB7CiAjaWZkZWYgbGludXgKLSAgICBkcHJpbnRmX2FzcGkoc3RkZGViLCAiR0VUQVNQSVN1cHBvcnRJbmZvXG4iKTsKKyAgICBkcHJpbnRmX2luZm8oYXNwaSwgIkdFVEFTUElTdXBwb3J0SW5mb1xuIik7CiAgICAgLyogaGlnaCBieXRlIFNTX0NPTVAgLSBsb3cgYnl0ZSBudW1iZXIgb2YgaG9zdCBhZGFwdGVycy4KICAgICAgKiBGSVhNRSEhISBUaGUgbnVtYmVyIG9mIGhvc3QgYWRhcHRlcnMgaXMgaW5jb3JyZWN0LgogICAgICAqIEknbSBub3Qgc3VyZSBob3cgdG8gZGV0ZXJtaW5lIHRoaXMgdW5kZXIgbGludXggZXRjLgpAQCAtNDA5LDE5ICs0MDcsMTkgQEAKIAogICBzd2l0Y2ggKGxwU1JCLT5jb21tb24uU1JCX2NtZCkgewogICBjYXNlIFNDX0hBX0lOUVVJUlk6Ci0gICAgZHByaW50Zl9hc3BpKHN0ZGRlYiwgIkFTUEk6IE5vdCBpbXBsZW1lbnRlZCBTQ19IQV9JTlFVSVJZXG4iKTsKKyAgICBkcHJpbnRmX2ZpeG1lKGFzcGksICJBU1BJOiBOb3QgaW1wbGVtZW50ZWQgU0NfSEFfSU5RVUlSWVxuIik7CiAgICAgYnJlYWs7CiAgIGNhc2UgU0NfR0VUX0RFVl9UWVBFOgotICAgIGRwcmludGZfYXNwaShzdGRkZWIsICJBU1BJOiBOb3QgaW1wbGVtZW50ZWQgU0NfR0VUX0RFVl9UWVBFXG4iKTsKKyAgICBkcHJpbnRmX2ZpeG1lKGFzcGksICJBU1BJOiBOb3QgaW1wbGVtZW50ZWQgU0NfR0VUX0RFVl9UWVBFXG4iKTsKICAgICBicmVhazsKICAgY2FzZSBTQ19FWEVDX1NDU0lfQ01EOgogICAgIHJldHVybiBBU1BJX0V4ZWNTY3NpQ21kMTYoJmxwU1JCLT5jbWQsIHNlZ3B0cl9zcmIpOwogICAgIGJyZWFrOwogICBjYXNlIFNDX1JFU0VUX0RFVjoKLSAgICBkcHJpbnRmX2FzcGkoc3RkZGViLCAiQVNQSTogTm90IGltcGxlbWVudGVkIFNDX1JFU0VUX0RFVlxuIik7CisgICAgZHByaW50Zl9maXhtZShhc3BpLCAiQVNQSTogTm90IGltcGxlbWVudGVkIFNDX1JFU0VUX0RFVlxuIik7CiAgICAgYnJlYWs7CiAgIGRlZmF1bHQ6Ci0gICAgZHByaW50Zl9hc3BpKHN0ZGRlYiwgIkFTUEk6IFVua25vd24gY29tbWFuZCAlZFxuIiwgbHBTUkItPmNvbW1vbi5TUkJfY21kKTsKKyAgICBkcHJpbnRmX3dhcm4oYXNwaSwgIkFTUEk6IFVua25vd24gY29tbWFuZCAlZFxuIiwgbHBTUkItPmNvbW1vbi5TUkJfY21kKTsKICAgfQogICByZXR1cm4gU1NfSU5WQUxJRF9TUkI7CiAjZWxzZQpkaWZmIC0tZ2l0IGEvbWlzYy9jb21tLmMgYi9taXNjL2NvbW0uYwppbmRleCA3MzY4MWQ5Li5kNDE4OTk0IDEwMDY0NAotLS0gYS9taXNjL2NvbW0uYworKysgYi9taXNjL2NvbW0uYwpAQCAtMzQsNyArMzQsNiBAQAogI2luY2x1ZGUgImNvbW0uaCIKICNpbmNsdWRlICJoZWFwLmgiCiAjaW5jbHVkZSAib3B0aW9ucy5oIgotI2luY2x1ZGUgInN0ZGRlYnVnLmgiCiAjaW5jbHVkZSAiZGVidWcuaCIKIAogI2lmbmRlZiBUSU9DSU5RCkBAIC04NCw3ICs4Myw3IEBACiAJCQkJCUNPTVt4XS5mZCA9IDA7CiAJCQkJCXN0cmNweShDT01beF0uZGV2aWNlbmFtZSwgdGVtcCk7CiAJCQkJfQotICAgICAgICAgICAgICAgIGRwcmludGZfY29tbShzdGRkZWIsCisgICAgICAgICAgICAgICAgZHByaW50Zl9pbmZvKGNvbW0sCiAgICAgICAgICAgICAgICAgICAgICAgICAiQ29tbV9Jbml0OiAlcyA9ICVzXG4iLCBvcHRpb24sIENPTVt4XS5kZXZpY2VuYW1lKTsKICAJCX0KIApAQCAtMTA3LDcgKzEwNiw3IEBACiAJCQkJCUxQVFt4XS5mZCA9IDA7CiAJCQkJCXN0cmNweShMUFRbeF0uZGV2aWNlbmFtZSwgdGVtcCk7CiAJCQkJfQotICAgICAgICAgICAgICAgIGRwcmludGZfY29tbShzdGRkZWIsCisgICAgICAgICAgICAgICAgZHByaW50Zl9pbmZvKGNvbW0sCiAgICAgICAgICAgICAgICAgICAgICAgICAiQ29tbV9Jbml0OiAlcyA9ICVzXG4iLCBvcHRpb24sIExQVFt4XS5kZXZpY2VuYW1lKTsKIAkJfQogCkBAIC0xNTMsNyArMTUyLDcgQEAKIAogaW50IFdpbkVycm9yKHZvaWQpCiB7Ci0gICAgICAgIGRwcmludGZfY29tbShzdGRkZWIsICJXaW5FcnJvcjogZXJybm8gPSAlZFxuIiwgZXJybm8pOworICAgICAgICBkcHJpbnRmX2luZm8oY29tbSwgIldpbkVycm9yOiBlcnJubyA9ICVkXG4iLCBlcnJubyk7CiAJc3dpdGNoIChlcnJubykgewogCQlkZWZhdWx0OgogCQkJcmV0dXJuIENFX0lPRTsKQEAgLTE3MCw3ICsxNjksNyBAQAogCWludCBwb3J0OwogCWNoYXIgKnB0ciwgdGVtcFsyNTZdOwogCi0JZHByaW50Zl9jb21tKHN0ZGRlYiwKKwlkcHJpbnRmX2luZm8oY29tbSwKIAkJIkJ1aWxkQ29tbURDQjogKCVzKSwgcHRyICVwXG4iLCBkZXZpY2UsIGxwZGNiKTsKIAljb21tZXJyb3IgPSAwOwogCkBAIC0yMDgsMTMgKzIwNywxMyBAQAogCQkJbHBkY2ItPkJhdWRSYXRlID0gQ09NW3BvcnRdLmJhdWRyYXRlOwogCQllbHNlCiAJCQlscGRjYi0+QmF1ZFJhdGUgPSBhdG9pKHB0cik7Ci0gICAgICAgIAlkcHJpbnRmX2NvbW0oc3RkZGViLCJCdWlsZENvbW1EQ0I6IGJhdWRyYXRlICglZClcbiIsIGxwZGNiLT5CYXVkUmF0ZSk7CisgICAgICAgIAlkcHJpbnRmX2luZm8oY29tbSwiQnVpbGRDb21tRENCOiBiYXVkcmF0ZSAoJWQpXG4iLCBscGRjYi0+QmF1ZFJhdGUpOwogCiAJCXB0ciA9IHN0cnRvayhOVUxMLCAiLCAiKTsKIAkJaWYgKGlzbG93ZXIoKnB0cikpCiAJCQkqcHRyID0gdG91cHBlcigqcHRyKTsKIAotICAgICAgICAJZHByaW50Zl9jb21tKHN0ZGRlYiwiQnVpbGRDb21tRENCOiBwYXJpdHkgKCVjKVxuIiwgKnB0cik7CisgICAgICAgIAlkcHJpbnRmX2luZm8oY29tbSwiQnVpbGRDb21tRENCOiBwYXJpdHkgKCVjKVxuIiwgKnB0cik7CiAJCWxwZGNiLT5mUGFyaXR5ID0gMTsKIAkJc3dpdGNoICgqcHRyKSB7CiAJCQljYXNlICdOJzoKQEAgLTIzNiwxMSArMjM1LDExIEBACiAJCX0KIAogCQlwdHIgPSBzdHJ0b2soTlVMTCwgIiwgIik7IAotICAgICAgICAgCWRwcmludGZfY29tbShzdGRkZWIsICJCdWlsZENvbW1EQ0I6IGNoYXJzaXplICglYylcbiIsICpwdHIpOworICAgICAgICAgCWRwcmludGZfaW5mbyhjb21tLCAiQnVpbGRDb21tRENCOiBjaGFyc2l6ZSAoJWMpXG4iLCAqcHRyKTsKIAkJbHBkY2ItPkJ5dGVTaXplID0gKnB0ciAtICcwJzsKIAogCQlwdHIgPSBzdHJ0b2soTlVMTCwgIiwgIik7Ci0gICAgICAgIAlkcHJpbnRmX2NvbW0oc3RkZGViLCAiQnVpbGRDb21tRENCOiBzdG9wYml0cyAoJWMpXG4iLCAqcHRyKTsKKyAgICAgICAgCWRwcmludGZfaW5mbyhjb21tLCAiQnVpbGRDb21tRENCOiBzdG9wYml0cyAoJWMpXG4iLCAqcHRyKTsKIAkJc3dpdGNoICgqcHRyKSB7CiAJCQljYXNlICcxJzoKIAkJCQlscGRjYi0+U3RvcEJpdHMgPSBPTkVTVE9QQklUOwpAQCAtMjc0LDcgKzI3Myw3IEBACiAJaW50CXBvcnQ7CiAJY2hhcgkqcHRyLCp0ZW1wOwogCi0JZHByaW50Zl9jb21tKHN0ZGRlYiwiQnVpbGRDb21tRENCQW5kVGltZW91dHMzMkEoJXMsJXAsJXApXG4iLGRldmljZSxscGRjYixscHRpbWVvdXRzKTsKKwlkcHJpbnRmX2luZm8oY29tbSwiQnVpbGRDb21tRENCQW5kVGltZW91dHMzMkEoJXMsJXAsJXApXG4iLGRldmljZSxscGRjYixscHRpbWVvdXRzKTsKIAljb21tZXJyb3IgPSAwOwogCiAJaWYgKCFsc3RybmNtcGkzMkEoZGV2aWNlLCJDT00iLDMpKSB7CkBAIC00MDEsNyArNDAwLDcgQEAKIAlMUFNUUglkZXZpZEE7CiAJQk9PTDMyCXJldDsKIAotCWRwcmludGZfY29tbShzdGRkZWIsIkJ1aWxkQ29tbURDQkFuZFRpbWVvdXRzMzJXKCVwLCVwLCVwKVxuIixkZXZpZCxscGRjYixscHRpbWVvdXRzKTsKKwlkcHJpbnRmX2luZm8oY29tbSwiQnVpbGRDb21tRENCQW5kVGltZW91dHMzMlcoJXAsJXAsJXApXG4iLGRldmlkLGxwZGNiLGxwdGltZW91dHMpOwogCWRldmlkQSA9IEhFQVBfc3RyZHVwV3RvQSggR2V0UHJvY2Vzc0hlYXAoKSwgMCwgZGV2aWQgKTsKIAlyZXQ9QnVpbGRDb21tRENCQW5kVGltZW91dHMzMkEoZGV2aWRBLGxwZGNiLGxwdGltZW91dHMpOwogICAgICAgICBIZWFwRnJlZSggR2V0UHJvY2Vzc0hlYXAoKSwgMCwgZGV2aWRBICk7CkBAIC00MjMsNyArNDIyLDcgQEAKIHsKIAlpbnQgcG9ydCxmZDsKIAotICAgIAlkcHJpbnRmX2NvbW0oc3RkZGViLAorICAgIAlkcHJpbnRmX2luZm8oY29tbSwKIAkJIk9wZW5Db21tOiAlcywgJWQsICVkXG4iLCBkZXZpY2UsIGNiSW5RdWV1ZSwgY2JPdXRRdWV1ZSk7CiAJY29tbWVycm9yID0gMDsKIApAQCAtNDM1LDcgKzQzNCw3IEBACiAJCQljb21tZXJyb3IgPSBJRV9CQURJRDsKIAkJfQogCi0gICAgICAgICAgICAgICAgZHByaW50Zl9jb21tKHN0ZGRlYiwKKyAgICAgICAgICAgICAgICBkcHJpbnRmX2luZm8oY29tbSwKICAgICAgICAgICAgICAgICAgICAgICAgIk9wZW5Db21tOiAlcyA9ICVzXG4iLCBkZXZpY2UsIENPTVtwb3J0XS5kZXZpY2VuYW1lKTsKIAogCQlpZiAoIVZhbGlkQ09NUG9ydChwb3J0KSkgewpAQCAtNDg4LDcgKzQ4Nyw3IEBACiBJTlQxNiBXSU5BUEkgQ2xvc2VDb21tKElOVDE2IGZkKQogewogICAgICAgICBpbnQgcG9ydDsKLSAgICAJZHByaW50Zl9jb21tKHN0ZGRlYiwiQ2xvc2VDb21tOiBmZCAlZFxuIiwgZmQpOworICAgIAlkcHJpbnRmX2luZm8oY29tbSwiQ2xvc2VDb21tOiBmZCAlZFxuIiwgZmQpOwogICAgICAgIAlpZiAoKHBvcnQgPSBHZXRDb21tUG9ydChmZCkpICE9LTEpIHsgIC8qIFtMV10gICAgICAgKi8KICAgICAJICAgICAgICBTRUdQVFJfRlJFRSh1bmtub3duW3BvcnRdKTsgCiAgICAgCSAgICAgICAgQ09NW3BvcnRdLmZkID0gMDsgICAgICAgLyogIG15IGFkYXB0YXRpb24gb2YgUkVSJ3MgZml4ICAgKi8gIApAQCAtNTEzLDcgKzUxMiw3IEBACiB7CiAJc3RydWN0IERvc0RldmljZVN0cnVjdCAqcHRyOwogCi0JZHByaW50Zl9jb21tKHN0ZGRlYiwiU2V0Q29tbUJyZWFrOiBmZDogJWRcbiIsIGZkKTsKKwlkcHJpbnRmX2luZm8oY29tbSwiU2V0Q29tbUJyZWFrOiBmZDogJWRcbiIsIGZkKTsKIAlpZiAoKHB0ciA9IEdldERldmljZVN0cnVjdChmZCkpID09IE5VTEwpIHsKIAkJY29tbWVycm9yID0gSUVfQkFESUQ7CiAJCXJldHVybiAtMTsKQEAgLTUzMiw3ICs1MzEsNyBAQAogCiAJc3RydWN0IERvc0RldmljZVN0cnVjdCAqcHRyOwogCi0JZHByaW50Zl9jb21tKHN0ZGRlYiwiU2V0Q29tbUJyZWFrOiBmZDogJWRcbiIsIGZkKTsKKwlkcHJpbnRmX2luZm8oY29tbSwiU2V0Q29tbUJyZWFrOiBmZDogJWRcbiIsIGZkKTsKIAlpZiAoKHB0ciA9IEdldERldmljZVN0cnVjdChmZCkpID09IE5VTEwpIHsKIAkJY29tbWVycm9yID0gSUVfQkFESUQ7CiAJCXJldHVybiBGQUxTRTsKQEAgLTU1MCw3ICs1NDksNyBAQAogewogCXN0cnVjdCBEb3NEZXZpY2VTdHJ1Y3QgKnB0cjsKIAotICAgIAlkcHJpbnRmX2NvbW0oc3RkZGViLCJDbGVhckNvbW1CcmVhazogZmQ6ICVkXG4iLCBmZCk7CisgICAgCWRwcmludGZfaW5mbyhjb21tLCJDbGVhckNvbW1CcmVhazogZmQ6ICVkXG4iLCBmZCk7CiAJaWYgKChwdHIgPSBHZXREZXZpY2VTdHJ1Y3QoZmQpKSA9PSBOVUxMKSB7CiAJCWNvbW1lcnJvciA9IElFX0JBRElEOwogCQlyZXR1cm4gLTE7CkBAIC01NjgsNyArNTY3LDcgQEAKIHsKIAlzdHJ1Y3QgRG9zRGV2aWNlU3RydWN0ICpwdHI7CiAKLSAgICAJZHByaW50Zl9jb21tKHN0ZGRlYiwiQ2xlYXJDb21tQnJlYWs6IGZkOiAlZFxuIiwgZmQpOworICAgIAlkcHJpbnRmX2luZm8oY29tbSwiQ2xlYXJDb21tQnJlYWs6IGZkOiAlZFxuIiwgZmQpOwogCWlmICgocHRyID0gR2V0RGV2aWNlU3RydWN0KGZkKSkgPT0gTlVMTCkgewogCQljb21tZXJyb3IgPSBJRV9CQURJRDsKIAkJcmV0dXJuIEZBTFNFOwpAQCAtNTg3LDcgKzU4Niw3IEBACiAJaW50CW1heDsKIAlzdHJ1Y3QgdGVybWlvcyBwb3J0OwogCi0gICAgCWRwcmludGZfY29tbShzdGRkZWIsIkVzY2FwZUNvbW1GdW5jdGlvbiBmZDogJWQsIGZ1bmN0aW9uOiAlZFxuIiwgZmQsIG5GdW5jdGlvbik7CisgICAgCWRwcmludGZfaW5mbyhjb21tLCJFc2NhcGVDb21tRnVuY3Rpb24gZmQ6ICVkLCBmdW5jdGlvbjogJWRcbiIsIGZkLCBuRnVuY3Rpb24pOwogCWlmICh0Y2dldGF0dHIoZmQsJnBvcnQpID09IC0xKSB7CiAJCWNvbW1lcnJvcj1XaW5FcnJvcigpOwkKIAkJcmV0dXJuIC0xOwpAQCAtNjYzLDcgKzY2Miw3IEBACiAJc3RydWN0IHRlcm1pb3MJcG9ydDsKIAlzdHJ1Y3QgRG9zRGV2aWNlU3RydWN0ICpwdHI7CiAKLSAgICAJZHByaW50Zl9jb21tKHN0ZGRlYiwiRXNjYXBlQ29tbUZ1bmN0aW9uIGZkOiAlZCwgZnVuY3Rpb246ICVkXG4iLCBmZCwgbkZ1bmN0aW9uKTsKKyAgICAJZHByaW50Zl9pbmZvKGNvbW0sIkVzY2FwZUNvbW1GdW5jdGlvbiBmZDogJWQsIGZ1bmN0aW9uOiAlZFxuIiwgZmQsIG5GdW5jdGlvbik7CiAJaWYgKHRjZ2V0YXR0cihmZCwmcG9ydCkgPT0gLTEpIHsKIAkJY29tbWVycm9yPVdpbkVycm9yKCk7CQogCQlyZXR1cm4gRkFMU0U7CkBAIC03MzUsNyArNzM0LDcgQEAKIHsKIAlpbnQgcXVldWU7CiAKLSAgICAJZHByaW50Zl9jb21tKHN0ZGRlYiwiRmx1c2hDb21tIGZkOiAlZCwgcXVldWU6ICVkXG4iLCBmZCwgZm5RdWV1ZSk7CisgICAgCWRwcmludGZfaW5mbyhjb21tLCJGbHVzaENvbW0gZmQ6ICVkLCBxdWV1ZTogJWRcbiIsIGZkLCBmblF1ZXVlKTsKIAlzd2l0Y2ggKGZuUXVldWUpIHsKIAkJY2FzZSAwOglxdWV1ZSA9IFRDT0ZMVVNIOwogCQkJYnJlYWs7CkBAIC03NjAsNyArNzU5LDcgQEAKICAqLwogQk9PTDMyIFdJTkFQSSBQdXJnZUNvbW0oIEhBTkRMRTMyIGhGaWxlLCBEV09SRCBmbGFncykgCiB7Ci0gICAgZHByaW50Zl9jb21tKHN0ZG5pbXAsICJQdXJnZUNvbW0oJTA4eCAlMDhseCkgdW5pbXBsZW1lbnRlZCBzdHViXG4iLAorICAgIGRwcmludGZfZml4bWUoY29tbSwgIlB1cmdlQ29tbSglMDh4ICUwOGx4KSB1bmltcGxlbWVudGVkIHN0dWJcbiIsCiAgICAgICAgICAgICAgICAgIGhGaWxlLCBmbGFncyk7CiAgICAgcmV0dXJuIDA7CiB9CkBAIC03ODUsMTUgKzc4NCwxNSBAQAogICAgICAgICAgICAgICAgIGlmIChyYykgZnByaW50ZihzdGRlcnIsICJFcnJvciAhXG4iKTsKIAkJbHBTdGF0LT5jYkluUXVlID0gY250OwogCi0gICAgCQlkcHJpbnRmX2NvbW0oc3RkZGViLAotCQkJIkdldENvbW1FcnJvcjogZmQgJWQsIGVycm9yICVkLCBscFN0YXQgJWQgJWQgJWRcbiIsCi0JCQlmZCwgY29tbWVycm9yLAotCQkJbHBTdGF0LT5zdGF0dXMsIGxwU3RhdC0+Y2JJblF1ZSwgbHBTdGF0LT5jYk91dFF1ZSk7CisgICAgCQlkcHJpbnRmX2luZm8oY29tbSwKKwkJICAgICAgICJHZXRDb21tRXJyb3I6IGZkICVkLCBlcnJvciAlZCwgbHBTdGF0ICVkICVkICVkXG4iLAorCQkgICAgICAgZmQsIGNvbW1lcnJvciwgbHBTdGF0LT5zdGF0dXMsIGxwU3RhdC0+Y2JJblF1ZSwgCisJCSAgICAgICBscFN0YXQtPmNiT3V0UXVlKTsKIAl9CiAJZWxzZQotCQlkcHJpbnRmX2NvbW0oc3RkZGViLAotICAgICAgICAgICAgICAgICJHZXRDb21tRXJyb3I6IGZkICVkLCBlcnJvciAlZCwgbHBTdGF0IE5VTExcbiIsCi0gICAgICAgICAgICAgICAgZmQsIGNvbW1lcnJvcik7CisJCWRwcmludGZfaW5mbyhjb21tLAorCQkgICAgICAgIkdldENvbW1FcnJvcjogZmQgJWQsIGVycm9yICVkLCBscFN0YXQgTlVMTFxuIiwKKwkJICAgICAgIGZkLCBjb21tZXJyb3IpOwogCiAJLyoKIAkgKiBbUkVSXSBJIGhhdmUgbm8gaWRlYSB3aGF0IHRoZSBmb2xsb3dpbmcgaXMgdHJ5aW5nIHRvIGFjY29tcGxpc2guCkBAIC04MTEsOCArODEwLDggQEAKIHsKIAlpbnQgdGVtcGVycm9yOwogCi0gICAgCWRwcmludGZfY29tbShzdGRkZWIsCi0JCSJDbGVhckNvbW1FcnJvcjogZmQgJWQgKGN1cnJlbnQgZXJyb3IgJWQpXG4iLCBmZCwgY29tbWVycm9yKTsKKyAgICAJZHByaW50Zl9pbmZvKGNvbW0sICJDbGVhckNvbW1FcnJvcjogZmQgJWQgKGN1cnJlbnQgZXJyb3IgJWQpXG4iLCAKKwkgICAgICAgZmQsIGNvbW1lcnJvcik7CiAJdGVtcGVycm9yID0gY29tbWVycm9yOwogCWNvbW1lcnJvciA9IDA7CiAJcmV0dXJuIFRSVUU7CkBAIC04MjcsMTkgKzgyNiwxOCBAQAogICAgICAgICBpbnQgYWN0OwogICAgICAgICBpbnQgcmVwaWQ7CiAgICAgICAgIHVuc2lnbmVkIGludCBtc3RhdDsKLSAgICAJZHByaW50Zl9jb21tKHN0ZGRlYiwiU2V0Q29tbUV2ZW50TWFzazpmZCAlZCxtYXNrICVkXG4iLGZkLGZ1RXZ0TWFzayk7CisgICAgCWRwcmludGZfaW5mbyhjb21tLCJTZXRDb21tRXZlbnRNYXNrOmZkICVkLG1hc2sgJWRcbiIsZmQsZnVFdnRNYXNrKTsKIAlldmVudG1hc2sgfD0gZnVFdnRNYXNrOwogICAgICAgICBpZiAoKGFjdCA9IEdldENvbW1Qb3J0KGZkKSkgPT0gLTEpIHsKLSAgICAgICAgICAgIGRwcmludGZfY29tbShzdGRkZWIsIiBmZCAlZCBub3QgY29tbSBwb3J0XG4iLGFjdCk7CisgICAgICAgICAgICBkcHJpbnRmX3dhcm4oY29tbSwiIGZkICVkIG5vdCBjb21tIHBvcnRcbiIsYWN0KTsKICAgICAgICAgICAgIHJldHVybiBOVUxMO30KICAgICAgICAgc3RvbCA9ICB1bmtub3duW2FjdF07CiAgICAgICAgIHN0b2wgKz0gbXNyOyAgICAKIAlyZXBpZCA9IGlvY3RsKGZkLFRJT0NNR0VULCZtc3RhdCk7Ci0JZHByaW50Zl9jb21tKHN0ZGRlYiwKLQkiIGlvY3RsICAlZCwgbXNyICV4IGF0ICVwICVwXG4iLHJlcGlkLG1zdGF0LHN0b2wsdW5rbm93blthY3RdKTsKKwlkcHJpbnRmX2luZm8oY29tbSwgIiBpb2N0bCAgJWQsIG1zciAleCBhdCAlcCAlcFxuIixyZXBpZCxtc3RhdCxzdG9sLHVua25vd25bYWN0XSk7CiAJaWYgKChtc3RhdCZUSU9DTV9DQVIpKSB7KnN0b2wgfD0gMHg4MDt9CiAJICAgICBlbHNlIHsqc3RvbCAmPTB4N2Y7fQotCWRwcmludGZfY29tbShzdGRkZWIsIiBtb2RlbSBkY2QgY29uc3RydWN0ICV4XG4iLCpzdG9sKTsKKwlkcHJpbnRmX2luZm8oY29tbSwiIG1vZGVtIGRjZCBjb25zdHJ1Y3QgJXhcbiIsKnN0b2wpOwogCXJldHVybiBTRUdQVFJfR0VUKHVua25vd25bYWN0XSk7CQogfQogCkBAIC04NTAsNyArODQ4LDcgQEAKIHsKIAlpbnQJZXZlbnRzID0gMDsKIAotICAgIAlkcHJpbnRmX2NvbW0oc3RkZGViLAorICAgIAlkcHJpbnRmX2luZm8oY29tbSwKIAkJIkdldENvbW1FdmVudE1hc2s6IGZkICVkLCBtYXNrICVkXG4iLCBmZCwgZm5FdnRDbGVhcik7CiAKIAkvKgpAQCAtODY0LDcgKzg2Miw3IEBACiAJCXJjID0gaW9jdGwoZmQsIFRJT0NJTlEsICZjbnQpOwogCQlpZiAoY250KSBldmVudHMgfD0gRVZfUlhDSEFSOwogCi0JCWRwcmludGZfY29tbShzdGRkZWIsCisJCWRwcmludGZfaW5mbyhjb21tLAogCQkJIkdldENvbW1FdmVudE1hc2s6IHJ4Y2hhciAlbGRcbiIsIGNudCk7CiAJfQogCkBAIC04NzMsNyArODcxLDcgQEAKIAkgKi8KIAkvKiBUT0RPICovCiAKLQlkcHJpbnRmX2NvbW0oc3RkZGViLAorCWRwcmludGZfaW5mbyhjb21tLAogCQkiR2V0Q29tbUV2ZW50TWFzazogcmV0dXJuIGV2ZW50cyAlZFxuIiwgZXZlbnRzKTsKIAlyZXR1cm4gZXZlbnRzOwogCkBAIC04OTIsNyArODkwLDcgQEAKICAqLwogQk9PTDMyIFdJTkFQSSBTZXR1cENvbW0oIEhBTkRMRTMyIGhGaWxlLCBEV09SRCBpbnNpemUsIERXT1JEIG91dHNpemUpCiB7Ci0gICAgICAgIGRwcmludGZfY29tbShzdGRuaW1wLCAiU2V0dXBDb21tOiBpbnNpemUgJWxkIG91dHNpemUgJWxkIHVuaW1wbGVtZW50ZWQgc3R1YlxuIiwgaW5zaXplLCBvdXRzaXplKTsKKyAgICAgICAgZHByaW50Zl9maXhtZShjb21tLCAiU2V0dXBDb21tOiBpbnNpemUgJWxkIG91dHNpemUgJWxkIHVuaW1wbGVtZW50ZWQgc3R1YlxuIiwgaW5zaXplLCBvdXRzaXplKTsKICAgICAgICByZXR1cm4gRkFMU0U7CiB9IAogCkBAIC05MDEsNyArODk5LDcgQEAKICAqLwogQk9PTDMyIFdJTkFQSSBHZXRDb21tTWFzayhJTlQzMiBmZCxMUERXT1JEIGV2dG1hc2spCiB7Ci0gICAgCWRwcmludGZfY29tbShzdGRkZWIsCisgICAgCWRwcmludGZfaW5mbyhjb21tLAogCQkiR2V0Q29tbU1hc2s6IGZkICVkLCBtYXNrICVwXG4iLCBmZCwgZXZ0bWFzayk7CiAJKmV2dG1hc2sgPSBldmVudG1hc2s7CiAJcmV0dXJuIFRSVUU7CkBAIC05MTIsNyArOTEwLDcgQEAKICAqLwogQk9PTDMyIFdJTkFQSSBTZXRDb21tTWFzayhJTlQzMiBmZCxEV09SRCBldnRtYXNrKQogewotICAgIAlkcHJpbnRmX2NvbW0oc3RkZGViLAorICAgIAlkcHJpbnRmX2luZm8oY29tbSwKIAkJIlNldENvbW1NYXNrOiBmZCAlZCwgbWFzayAlbHhcbiIsIGZkLCBldnRtYXNrKTsKIAlldmVudG1hc2sgPSBldnRtYXNrOwogCXJldHVybiBUUlVFOwpAQCAtOTI2LDcgKzkyNCw3IEBACiAJc3RydWN0IHRlcm1pb3MgcG9ydDsKIAlzdHJ1Y3QgRG9zRGV2aWNlU3RydWN0ICpwdHI7CiAKLSAgICAJZHByaW50Zl9jb21tKHN0ZGRlYiwKKyAgICAJZHByaW50Zl9pbmZvKGNvbW0sCiAJCSJTZXRDb21tU3RhdGUxNjogZmQgJWQsIHB0ciAlcFxuIiwgbHBkY2ItPklkLCBscGRjYik7CiAJaWYgKHRjZ2V0YXR0cihscGRjYi0+SWQsICZwb3J0KSA9PSAtMSkgewogCQljb21tZXJyb3IgPSBXaW5FcnJvcigpOwkKQEAgLTk1Nyw3ICs5NTUsNyBAQAogCX0KIAlpZiAocHRyLT5iYXVkcmF0ZSA+IDApCiAJICAJbHBkY2ItPkJhdWRSYXRlID0gcHRyLT5iYXVkcmF0ZTsKLSAgICAJZHByaW50Zl9jb21tKHN0ZGRlYiwiU2V0Q29tbVN0YXRlOiBiYXVkcmF0ZSAlZFxuIixscGRjYi0+QmF1ZFJhdGUpOworICAgIAlkcHJpbnRmX2luZm8oY29tbSwiU2V0Q29tbVN0YXRlOiBiYXVkcmF0ZSAlZFxuIixscGRjYi0+QmF1ZFJhdGUpOwogI2lmZGVmIENCQVVECiAJcG9ydC5jX2NmbGFnICY9IH5DQkFVRDsKIAlzd2l0Y2ggKGxwZGNiLT5CYXVkUmF0ZSkgewpAQCAtMTA1MSw3ICsxMDQ5LDcgQEAKICAgICAgICAgfQogICAgICAgICBwb3J0LmNfaXNwZWVkID0gcG9ydC5jX29zcGVlZDsKICNlbmRpZgotICAgIAlkcHJpbnRmX2NvbW0oc3RkZGViLCJTZXRDb21tU3RhdGU6IGJ5dGVzaXplICVkXG4iLGxwZGNiLT5CeXRlU2l6ZSk7CisgICAgCWRwcmludGZfaW5mbyhjb21tLCJTZXRDb21tU3RhdGU6IGJ5dGVzaXplICVkXG4iLGxwZGNiLT5CeXRlU2l6ZSk7CiAJcG9ydC5jX2NmbGFnICY9IH5DU0laRTsKIAlzd2l0Y2ggKGxwZGNiLT5CeXRlU2l6ZSkgewogCQljYXNlIDU6CkBAIC0xMDcxLDcgKzEwNjksNyBAQAogCQkJcmV0dXJuIC0xOwogCX0KIAotICAgIAlkcHJpbnRmX2NvbW0oc3RkZGViLCJTZXRDb21tU3RhdGU6IHBhcml0eSAlZFxuIixscGRjYi0+UGFyaXR5KTsKKyAgICAJZHByaW50Zl9pbmZvKGNvbW0sIlNldENvbW1TdGF0ZTogcGFyaXR5ICVkXG4iLGxwZGNiLT5QYXJpdHkpOwogCXBvcnQuY19jZmxhZyAmPSB+KFBBUkVOQiB8IFBBUk9ERCk7CiAJaWYgKGxwZGNiLT5mUGFyaXR5KQogCQlzd2l0Y2ggKGxwZGNiLT5QYXJpdHkpIHsKQEAgLTEwOTIsNyArMTA5MCw3IEBACiAJCX0KIAkKIAotICAgIAlkcHJpbnRmX2NvbW0oc3RkZGViLCJTZXRDb21tU3RhdGU6IHN0b3BiaXRzICVkXG4iLGxwZGNiLT5TdG9wQml0cyk7CisgICAgCWRwcmludGZfaW5mbyhjb21tLCJTZXRDb21tU3RhdGU6IHN0b3BiaXRzICVkXG4iLGxwZGNiLT5TdG9wQml0cyk7CiAKIAlzd2l0Y2ggKGxwZGNiLT5TdG9wQml0cykgewogCQljYXNlIE9ORVNUT1BCSVQ6CkBAIC0xMTM5LDcgKzExMzcsNyBAQAogCXN0cnVjdCB0ZXJtaW9zIHBvcnQ7CiAJc3RydWN0IERvc0RldmljZVN0cnVjdCAqcHRyOwogCi0gICAgCWRwcmludGZfY29tbShzdGRkZWIsIlNldENvbW1TdGF0ZTMyOiBmZCAlZCwgcHRyICVwXG4iLGZkLGxwZGNiKTsKKyAgICAJZHByaW50Zl9pbmZvKGNvbW0sIlNldENvbW1TdGF0ZTMyOiBmZCAlZCwgcHRyICVwXG4iLGZkLGxwZGNiKTsKIAlpZiAodGNnZXRhdHRyKGZkLCZwb3J0KSA9PSAtMSkgewogCQljb21tZXJyb3IgPSBXaW5FcnJvcigpOwkKIAkJcmV0dXJuIEZBTFNFOwpAQCAtMTE2OSw3ICsxMTY3LDcgQEAKIAl9CiAJaWYgKHB0ci0+YmF1ZHJhdGUgPiAwKQogCSAgCWxwZGNiLT5CYXVkUmF0ZSA9IHB0ci0+YmF1ZHJhdGU7Ci0gICAgCWRwcmludGZfY29tbShzdGRkZWIsIlNldENvbW1TdGF0ZTogYmF1ZHJhdGUgJWxkXG4iLGxwZGNiLT5CYXVkUmF0ZSk7CisgICAgCWRwcmludGZfaW5mbyhjb21tLCJTZXRDb21tU3RhdGU6IGJhdWRyYXRlICVsZFxuIixscGRjYi0+QmF1ZFJhdGUpOwogI2lmZGVmIENCQVVECiAJcG9ydC5jX2NmbGFnICY9IH5DQkFVRDsKIAlzd2l0Y2ggKGxwZGNiLT5CYXVkUmF0ZSkgewpAQCAtMTI1Nyw3ICsxMjU1LDcgQEAKICAgICAgICAgfQogICAgICAgICBwb3J0LmNfaXNwZWVkID0gcG9ydC5jX29zcGVlZDsKICNlbmRpZgotICAgIAlkcHJpbnRmX2NvbW0oc3RkZGViLCJTZXRDb21tU3RhdGU6IGJ5dGVzaXplICVkXG4iLGxwZGNiLT5CeXRlU2l6ZSk7CisgICAgCWRwcmludGZfaW5mbyhjb21tLCJTZXRDb21tU3RhdGU6IGJ5dGVzaXplICVkXG4iLGxwZGNiLT5CeXRlU2l6ZSk7CiAJcG9ydC5jX2NmbGFnICY9IH5DU0laRTsKIAlzd2l0Y2ggKGxwZGNiLT5CeXRlU2l6ZSkgewogCQljYXNlIDU6CkBAIC0xMjc3LDcgKzEyNzUsNyBAQAogCQkJcmV0dXJuIEZBTFNFOwogCX0KIAotICAgIAlkcHJpbnRmX2NvbW0oc3RkZGViLCJTZXRDb21tU3RhdGU6IHBhcml0eSAlZFxuIixscGRjYi0+UGFyaXR5KTsKKyAgICAJZHByaW50Zl9pbmZvKGNvbW0sIlNldENvbW1TdGF0ZTogcGFyaXR5ICVkXG4iLGxwZGNiLT5QYXJpdHkpOwogCXBvcnQuY19jZmxhZyAmPSB+KFBBUkVOQiB8IFBBUk9ERCk7CiAJaWYgKGxwZGNiLT5mUGFyaXR5KQogCQlzd2l0Y2ggKGxwZGNiLT5QYXJpdHkpIHsKQEAgLTEyOTgsNyArMTI5Niw3IEBACiAJCX0KIAkKIAotICAgIAlkcHJpbnRmX2NvbW0oc3RkZGViLCJTZXRDb21tU3RhdGU6IHN0b3BiaXRzICVkXG4iLGxwZGNiLT5TdG9wQml0cyk7CisgICAgCWRwcmludGZfaW5mbyhjb21tLCJTZXRDb21tU3RhdGU6IHN0b3BiaXRzICVkXG4iLGxwZGNiLT5TdG9wQml0cyk7CiAJc3dpdGNoIChscGRjYi0+U3RvcEJpdHMpIHsKIAkJY2FzZSBPTkVTVE9QQklUOgogCQkJCXBvcnQuY19jZmxhZyAmPSB+Q1NUT1BCOwpAQCAtMTM0Niw3ICsxMzQ0LDcgQEAKIHsKIAlzdHJ1Y3QgdGVybWlvcyBwb3J0OwogCi0gICAgCWRwcmludGZfY29tbShzdGRkZWIsIkdldENvbW1TdGF0ZTE2OiBmZCAlZCwgcHRyICVwXG4iLCBmZCwgbHBkY2IpOworICAgIAlkcHJpbnRmX2luZm8oY29tbSwiR2V0Q29tbVN0YXRlMTY6IGZkICVkLCBwdHIgJXBcbiIsIGZkLCBscGRjYik7CiAJaWYgKHRjZ2V0YXR0cihmZCwgJnBvcnQpID09IC0xKSB7CiAJCWNvbW1lcnJvciA9IFdpbkVycm9yKCk7CQogCQlyZXR1cm4gLTE7CkBAIC0xNDcxLDcgKzE0NjksNyBAQAogewogCXN0cnVjdCB0ZXJtaW9zCXBvcnQ7CiAKLSAgICAJZHByaW50Zl9jb21tKHN0ZGRlYiwiR2V0Q29tbVN0YXRlMzI6IGZkICVkLCBwdHIgJXBcbiIsIGZkLCBscGRjYik7CisgICAgCWRwcmludGZfaW5mbyhjb21tLCJHZXRDb21tU3RhdGUzMjogZmQgJWQsIHB0ciAlcFxuIiwgZmQsIGxwZGNiKTsKICAgICAgICAgaWYgKEdldERldmljZVN0cnVjdChmZCkgPT0gTlVMTCkgcmV0dXJuIEZBTFNFOwogCWlmICh0Y2dldGF0dHIoZmQsICZwb3J0KSA9PSAtMSkgewogCQljb21tZXJyb3IgPSBXaW5FcnJvcigpOwkKQEAgLTE1ODcsNyArMTU4NSw3IEBACiB7CiAJc3RydWN0IERvc0RldmljZVN0cnVjdCAqcHRyOwogCi0gICAgCWRwcmludGZfY29tbShzdGRkZWIsCisgICAgCWRwcmludGZfaW5mbyhjb21tLAogCQkiVHJhbnNtaXRDb21tQ2hhcjogZmQgJWQsIGRhdGEgJWQgXG4iLCBmZCwgY2hUcmFuc21pdCk7CiAJaWYgKChwdHIgPSBHZXREZXZpY2VTdHJ1Y3QoZmQpKSA9PSBOVUxMKSB7CiAJCWNvbW1lcnJvciA9IElFX0JBRElEOwpAQCAtMTYxNSw3ICsxNjEzLDcgQEAKIHsKIAlzdHJ1Y3QgRG9zRGV2aWNlU3RydWN0ICpwdHI7CiAKLSAgICAJZHByaW50Zl9jb21tKHN0ZGRlYiwiVHJhbnNtaXRDb21tQ2hhcjMyKCVkLCclYycpXG4iLGZkLGNoVHJhbnNtaXQpOworICAgIAlkcHJpbnRmX2luZm8oY29tbSwiVHJhbnNtaXRDb21tQ2hhcjMyKCVkLCclYycpXG4iLGZkLGNoVHJhbnNtaXQpOwogCWlmICgocHRyID0gR2V0RGV2aWNlU3RydWN0KGZkKSkgPT0gTlVMTCkgewogCQljb21tZXJyb3IgPSBJRV9CQURJRDsKIAkJcmV0dXJuIEZBTFNFOwpAQCAtMTY0MSw3ICsxNjM5LDcgQEAKIHsKIAlzdHJ1Y3QgRG9zRGV2aWNlU3RydWN0ICpwdHI7CiAKLSAgICAJZHByaW50Zl9jb21tKHN0ZGRlYiwiVW5nZXRDb21tQ2hhcjogZmQgJWQgKGNoYXIgJWQpXG4iLCBmZCwgY2hVbmdldCk7CisgICAgCWRwcmludGZfaW5mbyhjb21tLCJVbmdldENvbW1DaGFyOiBmZCAlZCAoY2hhciAlZClcbiIsIGZkLCBjaFVuZ2V0KTsKIAlpZiAoKHB0ciA9IEdldERldmljZVN0cnVjdChmZCkpID09IE5VTEwpIHsKIAkJY29tbWVycm9yID0gSUVfQkFESUQ7CiAJCXJldHVybiAtMTsKQEAgLTE2NjMsMTAgKzE2NjEsMTAgQEAKICAqLwogSU5UMTYgV0lOQVBJIFJlYWRDb21tKElOVDE2IGZkLExQU1RSIGxwdkJ1ZixJTlQxNiBjYlJlYWQpCiB7Ci0JaW50IHN0YXR1cywgeCwgbGVuZ3RoOworCWludCBzdGF0dXMsIGxlbmd0aDsKIAlzdHJ1Y3QgRG9zRGV2aWNlU3RydWN0ICpwdHI7CiAKLSAgICAJZHByaW50Zl9jb21tKHN0ZGRlYiwKKyAgICAJZHByaW50Zl9pbmZvKGNvbW0sCiAJICAgICJSZWFkQ29tbTogZmQgJWQsIHB0ciAlcCwgbGVuZ3RoICVkXG4iLCBmZCwgbHB2QnVmLCBjYlJlYWQpOwogCWlmICgocHRyID0gR2V0RGV2aWNlU3RydWN0KGZkKSkgPT0gTlVMTCkgewogCQljb21tZXJyb3IgPSBJRV9CQURJRDsKQEAgLTE2OTgsOSArMTY5Niw3IEBACiAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gbGVuZ3RoOwogICAgICAgICAgICAgICAgIH0KICAJfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBmb3IgKHg9MDsgeCA8IGxlbmd0aCtzdGF0dXM7IHgrKykgIAkKLSAJICAgICAgICBkcHJpbnRmX2NvbW0oc3RkZGViLCIlYyIsKihscHZCdWYreCkpOwotIAkgICAgICAgIGRwcmludGZfY29tbShzdGRkZWIsIlxudGh1cyAgZW5kZXRoXG4iKTsKKwkgICAgICAgIGRwcmludGZfaW5mbyhjb21tLCIlKnNcbiIsIGxlbmd0aCtzdGF0dXMsIGxwdkJ1Zik7CiAJCWNvbW1lcnJvciA9IDA7CiAJCXJldHVybiBsZW5ndGggKyBzdGF0dXM7CiAJfQpAQCAtMTcxMSwxMCArMTcwNywxMCBAQAogICovCiBJTlQxNiBXSU5BUEkgV3JpdGVDb21tKElOVDE2IGZkLCBMUFNUUiBscHZCdWYsIElOVDE2IGNiV3JpdGUpCiB7Ci0JaW50IHgsIGxlbmd0aDsKKwlpbnQgbGVuZ3RoOwogCXN0cnVjdCBEb3NEZXZpY2VTdHJ1Y3QgKnB0cjsKIAotICAgIAlkcHJpbnRmX2NvbW0oc3RkZGViLCJXcml0ZUNvbW06IGZkICVkLCBwdHIgJXAsIGxlbmd0aCAlZFxuIiwgCisgICAgCWRwcmludGZfaW5mbyhjb21tLCJXcml0ZUNvbW06IGZkICVkLCBwdHIgJXAsIGxlbmd0aCAlZFxuIiwgCiAJCWZkLCBscHZCdWYsIGNiV3JpdGUpOwogCWlmICgocHRyID0gR2V0RGV2aWNlU3RydWN0KGZkKSkgPT0gTlVMTCkgewogCQljb21tZXJyb3IgPSBJRV9CQURJRDsKQEAgLTE3MjYsOSArMTcyMiw3IEBACiAJCXJldHVybiAtMTsKIAl9CQogCQotCWZvciAoeD0wOyB4ICE9IGNiV3JpdGUgOyB4KyspCi0gICAgICAgIGRwcmludGZfY29tbShzdGRkZWIsIiVjIiwgKihscHZCdWYgKyB4KSApOwotICAgICAgICBkcHJpbnRmX2NvbW0oc3RkZGViLCJcbiIpOworCWRwcmludGZfaW5mbyhjb21tLCIlKnNcbiIsIGNiV3JpdGUsIGxwdkJ1ZiApOwogCWxlbmd0aCA9IHdyaXRlKGZkLCAodm9pZCAqKSBscHZCdWYsIGNiV3JpdGUpOwogCQogCWlmIChsZW5ndGggPT0gLTEpIHsKZGlmZiAtLWdpdCBhL21pc2MvY29tbWRsZy5jIGIvbWlzYy9jb21tZGxnLmMKaW5kZXggZjgxYzdiMS4uYzBmMmExMiAxMDA2NDQKLS0tIGEvbWlzYy9jb21tZGxnLmMKKysrIGIvbWlzYy9jb21tZGxnLmMKQEAgLTE3LDcgKzE3LDYgQEAKICNpbmNsdWRlICJtb2R1bGUuaCIKICNpbmNsdWRlICJyZXNvdXJjZS5oIgogI2luY2x1ZGUgImRyaXZlLmgiCi0jaW5jbHVkZSAic3RkZGVidWcuaCIKICNpbmNsdWRlICJkZWJ1Zy5oIgogCiBzdGF0aWMJRFdPUkQgCQlDb21tRGxnTGFzdEVycm9yID0gMDsKQEAgLTEzOCw3ICsxMzcsNyBAQAogCQkgICAgRnJlZVJlc291cmNlMTYoIGhEbGdUbXBsICk7CiAgICAgfQogCi0gICAgZHByaW50Zl9jb21tZGxnKHN0ZGRlYiwiR2V0T3BlbkZpbGVOYW1lIC8vIHJldHVybiBscHN0ckZpbGU9JyVzJyAhXG4iLCAKKyAgICBkcHJpbnRmX2luZm8oY29tbWRsZywiR2V0T3BlbkZpbGVOYW1lIC8vIHJldHVybiBscHN0ckZpbGU9JyVzJyAhXG4iLCAKICAgICAgICAgICAgKExQU1RSKVBUUl9TRUdfVE9fTElOKGxwb2ZuLT5scHN0ckZpbGUpKTsKICAgICByZXR1cm4gYlJldDsKIH0KQEAgLTIzMiw3ICsyMzEsNyBAQAogCQkgICAgRnJlZVJlc291cmNlMTYoIGhEbGdUbXBsICk7CiAgICAgfQogCi0gICAgZHByaW50Zl9jb21tZGxnKHN0ZGRlYiwgIkdldFNhdmVGaWxlTmFtZSAvLyByZXR1cm4gbHBzdHJGaWxlPSclcycgIVxuIiwgCisgICAgZHByaW50Zl9pbmZvKGNvbW1kbGcsICJHZXRTYXZlRmlsZU5hbWUgLy8gcmV0dXJuIGxwc3RyRmlsZT0nJXMnICFcbiIsIAogICAgICAgICAgICAgKExQU1RSKVBUUl9TRUdfVE9fTElOKGxwb2ZuLT5scHN0ckZpbGUpKTsKICAgICByZXR1cm4gYlJldDsKIH0KQEAgLTQ3NSw3ICs0NzQsNyBAQAogICBpbnQgaSwgbjsKICAgTFBPUEVORklMRU5BTUUxNiBscG9mbjsKICAgY2hhciB0bXBzdHJbNTEyXTsKLSAgTFBTVFIgcHN0cjsKKyAgTFBTVFIgcHN0ciwgb2xkX3BzdHI7CiAgIFNldFdpbmRvd0xvbmczMkEoaFduZCwgRFdMX1VTRVIsIGxQYXJhbSk7CiAgIGxwb2ZuID0gKExQT1BFTkZJTEVOQU1FMTYpUFRSX1NFR19UT19MSU4obFBhcmFtKTsKICAgaWYgKGxwb2ZuLT5scHN0clRpdGxlKSBTZXRXaW5kb3dUZXh0MTYoIGhXbmQsIGxwb2ZuLT5scHN0clRpdGxlICk7CkBAIC00ODQsMTUgKzQ4MywxNiBAQAogICAgIHsKICAgICAgIHBzdHIgPSAoTFBTVFIpUFRSX1NFR19UT19MSU4obHBvZm4tPmxwc3RyQ3VzdG9tRmlsdGVyKTsKICAgICAgIG4gPSAwOwotICAgICAgZHByaW50Zl9jb21tZGxnKHN0ZGRlYiwibHBzdHJDdXN0b21GaWx0ZXIgPSAlcFxuIiwgcHN0cik7CisgICAgICBkcHJpbnRmX2luZm8oY29tbWRsZywibHBzdHJDdXN0b21GaWx0ZXIgPSAlcFxuIiwgcHN0cik7CiAgICAgICB3aGlsZSgqcHN0cikKIAl7Ci0JICBkcHJpbnRmX2NvbW1kbGcoc3RkZGViLCJscHN0ckN1c3RvbUZpbHRlciAvLyBhZGQgc3RyPSclcycgIixwc3RyKTsKKwkgIG9sZF9wc3RyID0gcHN0cjsKICAgICAgICAgICBpID0gU2VuZERsZ0l0ZW1NZXNzYWdlMTYoaFduZCwgY21iMSwgQ0JfQUREU1RSSU5HMTYsIDAsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChMUEFSQU0pbHBvZm4tPmxwc3RyQ3VzdG9tRmlsdGVyICsgbiApOwogICAgICAgICAgIG4gKz0gc3RybGVuKHBzdHIpICsgMTsKIAkgIHBzdHIgKz0gc3RybGVuKHBzdHIpICsgMTsKLQkgIGRwcmludGZfY29tbWRsZyhzdGRkZWIsImFzc29jaWF0ZWQgdG8gJyVzJ1xuIiwgcHN0cik7CisJICBkcHJpbnRmX2luZm8oY29tbWRsZywibHBzdHJDdXN0b21GaWx0ZXIgLy8gYWRkIHN0cj0nJXMnICIKKwkJCSAgImFzc29jaWF0ZWQgdG8gJyVzJ1xuIiwgb2xkX3BzdHIsIHBzdHIpOwogICAgICAgICAgIFNlbmREbGdJdGVtTWVzc2FnZTE2KGhXbmQsIGNtYjEsIENCX1NFVElURU1EQVRBMTYsIGksIChMUEFSQU0pcHN0cik7CiAgICAgICAgICAgbiArPSBzdHJsZW4ocHN0cikgKyAxOwogCSAgcHN0ciArPSBzdHJsZW4ocHN0cikgKyAxOwpAQCAtNTAzLDEyICs1MDMsMTMgQEAKIAlwc3RyID0gKExQU1RSKVBUUl9TRUdfVE9fTElOKGxwb2ZuLT5scHN0ckZpbHRlcik7CiAJbiA9IDA7CiAJd2hpbGUoKnBzdHIpIHsKLQkgIGRwcmludGZfY29tbWRsZyhzdGRkZWIsImxwc3RyRmlsdGVyIC8vIGFkZCBzdHI9JyVzJyAiLCBwc3RyKTsKKwkgIG9sZF9wc3RyID0gcHN0cjsKIAkgIGkgPSBTZW5kRGxnSXRlbU1lc3NhZ2UxNihoV25kLCBjbWIxLCBDQl9BRERTVFJJTkcxNiwgMCwKIAkJCQkgICAgICAgKExQQVJBTSlscG9mbi0+bHBzdHJGaWx0ZXIgKyBuICk7CiAJICBuICs9IHN0cmxlbihwc3RyKSArIDE7CiAJICBwc3RyICs9IHN0cmxlbihwc3RyKSArIDE7Ci0JICBkcHJpbnRmX2NvbW1kbGcoc3RkZGViLCJhc3NvY2lhdGVkIHRvICclcydcbiIsIHBzdHIpOworCSAgZHByaW50Zl9pbmZvKGNvbW1kbGcsImxwc3RyRmlsdGVyIC8vIGFkZCBzdHI9JyVzJyAiCisJCQkgICJhc3NvY2lhdGVkIHRvICclcydcbiIsIG9sZF9wc3RyLCBwc3RyKTsKIAkgIFNlbmREbGdJdGVtTWVzc2FnZTE2KGhXbmQsIGNtYjEsIENCX1NFVElURU1EQVRBMTYsIGksIChMUEFSQU0pcHN0cik7CiAJICBuICs9IHN0cmxlbihwc3RyKSArIDE7CiAJICBwc3RyICs9IHN0cmxlbihwc3RyKSArIDE7CkBAIC01MjEsNyArNTIyLDcgQEAKICAgc3RybmNweSh0bXBzdHIsIEZJTEVETEdfR2V0RmlsZVR5cGUoUFRSX1NFR19UT19MSU4obHBvZm4tPmxwc3RyQ3VzdG9tRmlsdGVyKSwKIAkgICAgIFBUUl9TRUdfVE9fTElOKGxwb2ZuLT5scHN0ckZpbHRlciksIGxwb2ZuLT5uRmlsdGVySW5kZXggLSAxKSw1MTEpOwogICB0bXBzdHJbNTExXT0wOwotICBkcHJpbnRmX2NvbW1kbGcoc3RkZGViLCJuRmlsdGVySW5kZXggPSAlbGQgLy8gU2V0VGV4dCBvZiBlZHQxIHRvICclcydcbiIsIAorICBkcHJpbnRmX2luZm8oY29tbWRsZywibkZpbHRlckluZGV4ID0gJWxkIC8vIFNldFRleHQgb2YgZWR0MSB0byAnJXMnXG4iLCAKICAgCQkJbHBvZm4tPm5GaWx0ZXJJbmRleCwgdG1wc3RyKTsKICAgU2V0RGxnSXRlbVRleHQzMkEoIGhXbmQsIGVkdDEsIHRtcHN0ciApOwogICAvKiBnZXQgZHJpdmUgbGlzdCAqLwpAQCAtNjM2LDcgKzYzNyw3IEBACiAgICAgICBpZiAobFJldCA9PSBMQl9FUlIpCiAJcmV0dXJuIFRSVUU7CiAgICAgICBwc3RyID0gKExQU1RSKVNlbmREbGdJdGVtTWVzc2FnZTE2KGhXbmQsIGNtYjEsIENCX0dFVElURU1EQVRBMTYsIGxSZXQsIDApOwotICAgICAgZHByaW50Zl9jb21tZGxnKHN0ZGRlYiwiU2VsZWN0ZWQgZmlsdGVyIDogJXNcbiIsIHBzdHIpOworICAgICAgZHByaW50Zl9pbmZvKGNvbW1kbGcsIlNlbGVjdGVkIGZpbHRlciA6ICVzXG4iLCBwc3RyKTsKICAgICAgIFNldERsZ0l0ZW1UZXh0MzJBKCBoV25kLCBlZHQxLCBwc3RyICk7CiAgICAgICBGSUxFRExHX1NjYW5EaXIoaFduZCwgdG1wc3RyKTsKICAgICAgIHJldHVybiBUUlVFOwpAQCAtNjY0LDcgKzY2NSw3IEBACiAJICAgICAgc3RyY3B5KHRtcHN0cjIsIHRtcHN0cik7CiAJICAgICAgKnRtcHN0cj0wOwogCSAgICB9Ci0JICBkcHJpbnRmX2NvbW1kbGcoc3RkZGViLCJjb21tZGxnOiAlcywgJXNcbiIsIHRtcHN0ciwgdG1wc3RyMik7CisJICBkcHJpbnRmX2luZm8oY29tbWRsZywiY29tbWRsZzogJXMsICVzXG4iLCB0bXBzdHIsIHRtcHN0cjIpOwogICAgICAgICAgIFNldERsZ0l0ZW1UZXh0MzJBKCBoV25kLCBlZHQxLCB0bXBzdHIyICk7CiAJICBGSUxFRExHX1NjYW5EaXIoaFduZCwgdG1wc3RyKTsKIAkgIHJldHVybiBUUlVFOwpAQCAtNjc3LDcgKzY3OCw3IEBACiAgICAgICBsUmV0ID0gU2VuZERsZ0l0ZW1NZXNzYWdlMTYoaFduZCwgY21iMSwgQ0JfR0VUQ1VSU0VMMTYsIDAsIDApOwogICAgICAgaWYgKGxSZXQgPT0gTEJfRVJSKSByZXR1cm4gVFJVRTsKICAgICAgIGxwb2ZuLT5uRmlsdGVySW5kZXggPSBsUmV0ICsgMTsKLSAgICAgIGRwcmludGZfY29tbWRsZyhzdGRkZWIsImNvbW1kbGc6IGxwb2ZuLT5uRmlsdGVySW5kZXg9JWxkXG4iLCBscG9mbi0+bkZpbHRlckluZGV4KTsKKyAgICAgIGRwcmludGZfaW5mbyhjb21tZGxnLCJjb21tZGxnOiBscG9mbi0+bkZpbHRlckluZGV4PSVsZFxuIiwgbHBvZm4tPm5GaWx0ZXJJbmRleCk7CiAgICAgICBsc3RyY3B5bjMyQSh0bXBzdHIyLCAKIAkgICAgIEZJTEVETEdfR2V0RmlsZVR5cGUoUFRSX1NFR19UT19MSU4obHBvZm4tPmxwc3RyQ3VzdG9tRmlsdGVyKSwKIAkJCQkgUFRSX1NFR19UT19MSU4obHBvZm4tPmxwc3RyRmlsdGVyKSwKQEAgLTExMjcsNyArMTEyOCw3IEBACiAgICAgSFdORDMyIGh3bmREaWFsb2c7CiAgICAgTFBQUklOVERMRzE2IGxwUHJpbnQgPSAoTFBQUklOVERMRzE2KVBUUl9TRUdfVE9fTElOKHByaW50ZGxnKTsKIAotICAgIGRwcmludGZfY29tbWRsZyhzdGRkZWIsIlByaW50RGxnKCVwKSAvLyBGbGFncz0lMDhsWFxuIiwgbHBQcmludCwgbHBQcmludC0+RmxhZ3MgKTsKKyAgICBkcHJpbnRmX2luZm8oY29tbWRsZywiUHJpbnREbGcoJXApIC8vIEZsYWdzPSUwOGxYXG4iLCBscFByaW50LCBscFByaW50LT5GbGFncyApOwogCiAgICAgaWYgKGxwUHJpbnQtPkZsYWdzICYgUERfUkVUVVJOREVGQVVMVCkKICAgICAgICAgLyogRklYTUU6IHNob3VsZCBmaWxsIGxwUHJpbnQtPmhEZXZNb2RlIGFuZCBscFByaW50LT5oRGV2TmFtZXMgaGVyZSAqLwpAQCAtMTE3OSw3ICsxMTgwLDcgQEAKICAgc3dpdGNoICh3TXNnKQogICAgIHsKICAgICBjYXNlIFdNX0lOSVRESUFMT0c6Ci0gICAgICBkcHJpbnRmX2NvbW1kbGcoc3RkZGViLCJQcmludERsZ1Byb2MgLy8gV01fSU5JVERJQUxPRyBsUGFyYW09JTA4bFhcbiIsIGxQYXJhbSk7CisgICAgICBkcHJpbnRmX2luZm8oY29tbWRsZywiUHJpbnREbGdQcm9jIC8vIFdNX0lOSVRESUFMT0cgbFBhcmFtPSUwOGxYXG4iLCBsUGFyYW0pOwogICAgICAgU2hvd1dpbmRvdzE2KGhXbmQsIFNXX1NIT1dOT1JNQUwpOwogICAgICAgcmV0dXJuIChUUlVFKTsKICAgICBjYXNlIFdNX0NPTU1BTkQ6CkBAIC0xMjA3LDcgKzEyMDgsNyBAQAogICBzd2l0Y2ggKHdNc2cpCiAgICAgewogICAgIGNhc2UgV01fSU5JVERJQUxPRzoKLSAgICAgIGRwcmludGZfY29tbWRsZyhzdGRkZWIsIlByaW50U2V0dXBEbGdQcm9jIC8vIFdNX0lOSVRESUFMT0cgbFBhcmFtPSUwOGxYXG4iLCBsUGFyYW0pOworICAgICAgZHByaW50Zl9pbmZvKGNvbW1kbGcsIlByaW50U2V0dXBEbGdQcm9jIC8vIFdNX0lOSVRESUFMT0cgbFBhcmFtPSUwOGxYXG4iLCBsUGFyYW0pOwogICAgICAgU2hvd1dpbmRvdzE2KGhXbmQsIFNXX1NIT1dOT1JNQUwpOwogICAgICAgcmV0dXJuIChUUlVFKTsKICAgICBjYXNlIFdNX0NPTU1BTkQ6CkBAIC0xMjM5LDcgKzEyNDAsNyBAQAogc2hvcnQgV0lOQVBJIEdldEZpbGVUaXRsZTMyQShMUENTVFIgbHBGaWxlLCBMUFNUUiBscFRpdGxlLCBVSU5UMzIgY2JCdWYpCiB7CiAgICAgaW50IGksIGxlbjsKLSAgICBkcHJpbnRmX2NvbW1kbGcoc3RkZGViLCJHZXRGaWxlVGl0bGUoJXAgJXAgJWQpOyBcbiIsIGxwRmlsZSwgbHBUaXRsZSwgY2JCdWYpOworICAgIGRwcmludGZfaW5mbyhjb21tZGxnLCJHZXRGaWxlVGl0bGUoJXAgJXAgJWQpOyBcbiIsIGxwRmlsZSwgbHBUaXRsZSwgY2JCdWYpOwogICAgIGlmIChscEZpbGUgPT0gTlVMTCB8fCBscFRpdGxlID09IE5VTEwpCiAgICAgCXJldHVybiAtMTsKICAgICBsZW4gPSBzdHJsZW4obHBGaWxlKTsKQEAgLTEyNTYsNyArMTI1Nyw3IEBACiAJaSsrOwogCWJyZWFrOwogICAgIH0KLSAgICBkcHJpbnRmX2NvbW1kbGcoc3RkZGViLCJcbi0tLT4gJyVzJyAiLCAmbHBGaWxlW2ldKTsKKyAgICBkcHJpbnRmX2luZm8oY29tbWRsZywiLS0tPiAnJXMnIFxuIiwgJmxwRmlsZVtpXSk7CiAgICAgCiAgICAgbGVuID0gc3RybGVuKGxwRmlsZStpKSsxOwogICAgIGlmIChjYkJ1ZiA8IGxlbikKQEAgLTEzMDUsNyArMTMwNiw3IEBACiAgICAgTFBDVk9JRCB0ZW1wbGF0ZTsKICAgICBIV05EMzIgaHduZERpYWxvZzsKIAotICAgIGRwcmludGZfY29tbWRsZyhzdGRkZWIsIkNob29zZUNvbG9yXG4iKTsKKyAgICBkcHJpbnRmX2luZm8oY29tbWRsZywiQ2hvb3NlQ29sb3JcbiIpOwogICAgIGlmICghbHBDaENvbCkgcmV0dXJuIEZBTFNFOyAgICAKIAogICAgIGlmIChscENoQ29sLT5GbGFncyAmIENDX0VOQUJMRVRFTVBMQVRFSEFORExFKQpAQCAtMjA2OSw3ICsyMDcwLDcgQEAKICAgIFBPSU5UMTYgcG9pbnQ7CiAgICBzdHJ1Y3QgQ0NQUklWQVRFICogbHBwOyAKICAgIAotICAgZHByaW50Zl9jb21tZGxnKHN0ZGRlYiwiQ29sb3JEbGdQcm9jIC8vIFdNX0lOSVRESUFMT0cgbFBhcmFtPSUwOGxYXG4iLCBsUGFyYW0pOworICAgZHByaW50Zl9pbmZvKGNvbW1kbGcsIkNvbG9yRGxnUHJvYyAvLyBXTV9JTklURElBTE9HIGxQYXJhbT0lMDhsWFxuIiwgbFBhcmFtKTsKICAgIGxwcD1jYWxsb2MoMSxzaXplb2Yoc3RydWN0IENDUFJJVkFURSkpOwogICAgbHBwLT5scGNjPShMUENIT09TRUNPTE9SKWxQYXJhbTsKICAgIGlmIChscHAtPmxwY2MtPmxTdHJ1Y3RTaXplICE9IHNpemVvZihDSE9PU0VDT0xPUikpCkBAIC0yMTM4LDcgKzIxMzksNyBAQAogICAgIEhEQzMyIGhkYzsKICAgICBDT0xPUlJFRiAqY3I7CiAgICAgc3RydWN0IENDUFJJVkFURSAqIGxwcD0oc3RydWN0IENDUFJJVkFURSAqKUdldFdpbmRvd0xvbmczMkEoaERsZywgRFdMX1VTRVIpOyAKLSAgICBkcHJpbnRmX2NvbW1kbGcoc3RkZGViLCJDQ19XTUNvbW1hbmQgd1BhcmFtPSV4IGxQYXJhbT0lbHhcbiIsd1BhcmFtLGxQYXJhbSk7CisgICAgZHByaW50Zl9pbmZvKGNvbW1kbGcsIkNDX1dNQ29tbWFuZCB3UGFyYW09JXggbFBhcmFtPSVseFxuIix3UGFyYW0sbFBhcmFtKTsKICAgICBzd2l0Y2ggKHdQYXJhbSkKICAgICB7CiAgICAgICAgICAgY2FzZSAweDJjMjogIC8qIGVkaXQgbm90aWZ5IFJHQiAqLwpAQCAtMjQwMCw3ICsyNDAxLDcgQEAKICAgICBMUENWT0lEIHRlbXBsYXRlOwogICAgIEhXTkQzMiBod25kRGlhbG9nOwogCi0gICAgZHByaW50Zl9jb21tZGxnKHN0ZGRlYiwiQ2hvb3NlRm9udFxuIik7CisgICAgZHByaW50Zl9pbmZvKGNvbW1kbGcsIkNob29zZUZvbnRcbiIpOwogICAgIGlmICghbHBDaEZvbnQpIHJldHVybiBGQUxTRTsgICAgCiAKICAgICBpZiAobHBDaEZvbnQtPkZsYWdzICYgQ0ZfRU5BQkxFVEVNUExBVEVIQU5ETEUpCkBAIC0yNDgyLDcgKzI0ODMsNyBAQAogICBMUENIT09TRUZPTlQgbHBjZj0oTFBDSE9PU0VGT05UKUdldFdpbmRvd0xvbmczMkEoaERsZywgRFdMX1VTRVIpOyAKICAgTE9HRk9OVDE2ICpscGxmID0gKExPR0ZPTlQxNiAqKVBUUl9TRUdfVE9fTElOKCBsb2dmb250ICk7CiAKLSAgZHByaW50Zl9jb21tZGxnKHN0ZGRlYiwiRm9udEZhbWlseUVudW1Qcm9jOiBmb250PSVzIChuRm9udFR5cGU9JWQpXG4iLAorICBkcHJpbnRmX2luZm8oY29tbWRsZywiRm9udEZhbWlseUVudW1Qcm9jOiBmb250PSVzIChuRm9udFR5cGU9JWQpXG4iLAogICAgICAJCQlscGxmLT5sZkZhY2VOYW1lLG5Gb250VHlwZSk7CiAKICAgaWYgKGxwY2YtPkZsYWdzICYgQ0ZfRklYRURQSVRDSE9OTFkpCkBAIC0yNjAxLDggKzI2MDIsOCBAQAogICBURVhUTUVUUklDMTYgKmxwdG0gPSAoVEVYVE1FVFJJQzE2ICopUFRSX1NFR19UT19MSU4obWV0cmljcyk7CiAgIGludCBpOwogICAKLSAgZHByaW50Zl9jb21tZGxnKHN0ZGRlYiwiRm9udFN0eWxlRW51bVByb2M6IChuRm9udFR5cGU9JWQpXG4iLG5Gb250VHlwZSk7Ci0gIGRwcmludGZfY29tbWRsZyhzdGRkZWIsIiAgJXMgaD0lZCB3PSVkIGU9JWQgbz0lZCB3Zz0lZCBpPSVkIHU9JWQgcz0lZCBjaD0lZCBvcD0lZCBjcD0lZCBxPSVkIHBmPSV4aFxuIiwKKyAgZHByaW50Zl9pbmZvKGNvbW1kbGcsIkZvbnRTdHlsZUVudW1Qcm9jOiAobkZvbnRUeXBlPSVkKVxuIixuRm9udFR5cGUpOworICBkcHJpbnRmX2luZm8oY29tbWRsZywiICAlcyBoPSVkIHc9JWQgZT0lZCBvPSVkIHdnPSVkIGk9JWQgdT0lZCBzPSVkIGNoPSVkIG9wPSVkIGNwPSVkIHE9JWQgcGY9JXhoXG4iLAogCWxwbGYtPmxmRmFjZU5hbWUsbHBsZi0+bGZIZWlnaHQsbHBsZi0+bGZXaWR0aCxscGxmLT5sZkVzY2FwZW1lbnQsbHBsZi0+bGZPcmllbnRhdGlvbiwKIAlscGxmLT5sZldlaWdodCxscGxmLT5sZkl0YWxpYyxscGxmLT5sZlVuZGVybGluZSxscGxmLT5sZlN0cmlrZU91dCxscGxmLT5sZkNoYXJTZXQsCiAJbHBsZi0+bGZPdXRQcmVjaXNpb24sbHBsZi0+bGZDbGlwUHJlY2lzaW9uLGxwbGYtPmxmUXVhbGl0eSxscGxmLT5sZlBpdGNoQW5kRmFtaWx5KTsKQEAgLTI2MzgsMTEgKzI2MzksMTEgQEAKICAgU2V0V2luZG93TG9uZzMyQShoRGxnLCBEV0xfVVNFUiwgbFBhcmFtKTsgCiAgIGxwY2Y9KExQQ0hPT1NFRk9OVClsUGFyYW07CiAgIGxweHg9UFRSX1NFR19UT19MSU4obHBjZi0+bHBMb2dGb250KTsKLSAgZHByaW50Zl9jb21tZGxnKHN0ZGRlYiwiRm9ybWF0Q2hhckRsZ1Byb2MgLy8gV01fSU5JVERJQUxPRyBsUGFyYW09JTA4bFhcbiIsIGxQYXJhbSk7CisgIGRwcmludGZfaW5mbyhjb21tZGxnLCJGb3JtYXRDaGFyRGxnUHJvYyAvLyBXTV9JTklURElBTE9HIGxQYXJhbT0lMDhsWFxuIiwgbFBhcmFtKTsKIAogICBpZiAobHBjZi0+bFN0cnVjdFNpemUgIT0gc2l6ZW9mKENIT09TRUZPTlQpKQogICB7Ci0gICAgZHByaW50Zl9jb21tZGxnKHN0ZGRlYiwiV01fSU5JVERJQUxPRzogc3RydWN0dXJlIHNpemUgZmFpbHVyZSAhISFcbiIpOworICAgIGRwcmludGZfZXJyKGNvbW1kbGcsIldNX0lOSVRESUFMT0c6IHN0cnVjdHVyZSBzaXplIGZhaWx1cmUgISEhXG4iKTsKICAgICBFbmREaWFsb2czMiAoaERsZywgMCk7IAogICAgIHJldHVybiBGQUxTRTsKICAgfQpAQCAtMjY4MSw3ICsyNjgyLDcgQEAKICAgewogICAgIGlmICghRW51bUZvbnRGYW1pbGllczE2KGhkYywgTlVMTCxGb250RmFtaWx5RW51bVByb2MsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKExQQVJBTSlHZXREbGdJdGVtMzIoaERsZyxjbWIxKSkpCi0gICAgICBkcHJpbnRmX2NvbW1kbGcoc3RkZGViLCJXTV9JTklURElBTE9HOiBFbnVtRm9udEZhbWlsaWVzIHJldHVybnMgMFxuIik7CisgICAgICBkcHJpbnRmX2luZm8oY29tbWRsZywiV01fSU5JVERJQUxPRzogRW51bUZvbnRGYW1pbGllcyByZXR1cm5zIDBcbiIpOwogICAgIGlmIChscGNmLT5GbGFncyAmIENGX0lOSVRUT0xPR0ZPTlRTVFJVQ1QpCiAgICAgewogICAgICAgLyogbG9vayBmb3IgZml0dGluZyBmb250IG5hbWUgaW4gY29tYm9ib3gxICovCkBAIC0yNzI4LDcgKzI3MjksNyBAQAogICB9CiAgIGVsc2UKICAgewotICAgIGRwcmludGZfY29tbWRsZyhzdGRkZWIsIldNX0lOSVRESUFMT0c6IEhEQyBmYWlsdXJlICEhIVxuIik7CisgICAgZHByaW50Zl93YXJuKGNvbW1kbGcsIldNX0lOSVRESUFMT0c6IEhEQyBmYWlsdXJlICEhIVxuIik7CiAgICAgRW5kRGlhbG9nMzIgKGhEbGcsIDApOyAKICAgICByZXR1cm4gRkFMU0U7CiAgIH0KQEAgLTI3OTMsNyArMjc5NCw3IEBACiAgICBidWZmZXIgPSBTRUdQVFJfQUxMT0MoNDApOwogICAgc3dpdGNoIChscGRpLT5DdGxJRCkKICAgIHsKLSAgICBjYXNlIGNtYjE6CS8qIGRwcmludGZfY29tbWRsZyhzdGRkZWIsIldNX0RyYXdpdGVtIGNtYjFcbiIpOyAqLworICAgIGNhc2UgY21iMToJLyogZHByaW50Zl9pbmZvKGNvbW1kbGcsIldNX0RyYXdpdGVtIGNtYjFcbiIpOyAqLwogCQlTZW5kTWVzc2FnZTE2KGxwZGktPmh3bmRJdGVtLCBDQl9HRVRMQlRFWFQxNiwgbHBkaS0+aXRlbUlELAogCQkJKExQQVJBTSlTRUdQVFJfR0VUKGJ1ZmZlcikpOwkgICAgICAgICAgCiAJCUdldE9iamVjdDE2KCBoQml0bWFwVFQsIHNpemVvZihibSksICZibSApOwpAQCAtMjgxNCwxNCArMjgxNSwxNCBAQAogI2VuZGlmCiAJCWJyZWFrOwogICAgIGNhc2UgY21iMjoKLSAgICBjYXNlIGNtYjM6CS8qIGRwcmludGZfY29tbWRsZyhzdGRkZWIsIldNX0RSQVdJVEVOIGNtYjIsY21iM1xuIik7ICovCisgICAgY2FzZSBjbWIzOgkvKiBkcHJpbnRmX2luZm8oY29tbWRsZywiV01fRFJBV0lURU4gY21iMixjbWIzXG4iKTsgKi8KIAkJU2VuZE1lc3NhZ2UxNihscGRpLT5od25kSXRlbSwgQ0JfR0VUTEJURVhUMTYsIGxwZGktPml0ZW1JRCwKIAkJCShMUEFSQU0pU0VHUFRSX0dFVChidWZmZXIpKTsKIAkJVGV4dE91dDE2KGxwZGktPmhEQywgbHBkaS0+cmNJdGVtLmxlZnQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgIGxwZGktPnJjSXRlbS50b3AsIGJ1ZmZlciwgbHN0cmxlbjE2KGJ1ZmZlcikpOwogCQlicmVhazsKIAotICAgIGNhc2UgY21iNDoJLyogZHByaW50Zl9jb21tZGxnKHN0ZGRlYiwiV01fRFJBV0lURU0gY21iNCAoPUNPTE9SKVxuIik7ICovCisgICAgY2FzZSBjbWI0OgkvKiBkcHJpbnRmX2luZm8oY29tbWRsZywiV01fRFJBV0lURU0gY21iNCAoPUNPTE9SKVxuIik7ICovCiAJCVNlbmRNZXNzYWdlMTYobHBkaS0+aHduZEl0ZW0sIENCX0dFVExCVEVYVDE2LCBscGRpLT5pdGVtSUQsCiAgICAgCQkgICAgKExQQVJBTSlTRUdQVFJfR0VUKGJ1ZmZlcikpOwogCQlUZXh0T3V0MTYobHBkaS0+aERDLCBscGRpLT5yY0l0ZW0ubGVmdCArICAyNSs1LApAQCAtMjg4MCw3ICsyODgxLDcgQEAKICAgTFBDSE9PU0VGT05UIGxwY2Y9KExQQ0hPT1NFRk9OVClHZXRXaW5kb3dMb25nMzJBKGhEbGcsIERXTF9VU0VSKTsgCiAgIExQTE9HRk9OVDE2IGxweHg9UFRSX1NFR19UT19MSU4obHBjZi0+bHBMb2dGb250KTsKICAgCi0gIGRwcmludGZfY29tbWRsZyhzdGRkZWIsIkZvcm1hdENoYXJEbGdQcm9jIC8vIFdNX0NPTU1BTkQgbFBhcmFtPSUwOGxYXG4iLCBsUGFyYW0pOworICBkcHJpbnRmX2luZm8oY29tbWRsZywiRm9ybWF0Q2hhckRsZ1Byb2MgLy8gV01fQ09NTUFORCBsUGFyYW09JTA4bFhcbiIsIGxQYXJhbSk7CiAgIHN3aXRjaCAod1BhcmFtKQogICB7CiAJY2FzZSBjbWIxOmlmIChISVdPUkQobFBhcmFtKT09Q0JOX1NFTENIQU5HRSkKQEAgLTI4OTcsNyArMjg5OCw3IEBACiAgICAgICAgICAgICAgICAgICAgICAgICBjaGFyICpzdHIgPSBTRUdQVFJfQUxMT0MoMjU2KTsKICAgICAgICAgICAgICAgICAgICAgICAgIFNlbmREbGdJdGVtTWVzc2FnZTE2KGhEbGcsY21iMSxDQl9HRVRMQlRFWFQxNixpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKExQQVJBTSlTRUdQVFJfR0VUKHN0cikpOwotCSAgICAgICAgICAgICAgICBkcHJpbnRmX2NvbW1kbGcoc3RkZGViLCJXTV9DT01NQU5EL2NtYjEgPT4lc1xuIixzdHIpOworCSAgICAgICAgICAgICAgICBkcHJpbnRmX2luZm8oY29tbWRsZywiV01fQ09NTUFORC9jbWIxID0+JXNcbiIsc3RyKTsKICAgICAgICAJCSAgICAgICAgRW51bUZvbnRGYW1pbGllczE2KGhkYyxzdHIsRm9udFN0eWxlRW51bVByb2MsCiAJCSAgICAgICAgICAgICBNQUtFTE9ORyhHZXREbGdJdGVtMzIoaERsZyxjbWIyKSxHZXREbGdJdGVtMzIoaERsZyxjbWIzKSkpOwogCQkgICAgICAgIFNldEN1cnNvcjE2KGhjdXJzb3IpOwpAQCAtMjkwOCw3ICsyOTA5LDcgQEAKICAJCSAgICB9CiAgCQkgICAgZWxzZQogICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgZHByaW50Zl9jb21tZGxnKHN0ZGRlYiwiV01fQ09NTUFORDogSERDIGZhaWx1cmUgISEhXG4iKTsKKyAgICAgICAgICAgICAgICAgICAgICBkcHJpbnRmX3dhcm4oY29tbWRsZywiV01fQ09NTUFORDogSERDIGZhaWx1cmUgISEhXG4iKTsKICAgICAgICAgICAgICAgICAgICAgICBFbmREaWFsb2czMiAoaERsZywgMCk7IAogICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBUUlVFOwogICAgICAgICAgICAgICAgICAgICB9CkBAIC0yOTE5LDcgKzI5MjAsNyBAQAogCWNhc2UgY21iMzppZiAoSElXT1JEKGxQYXJhbSk9PUNCTl9TRUxDSEFOR0UgfHwgSElXT1JEKGxQYXJhbSk9PSBCTl9DTElDS0VEICkKIAkgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICBjaGFyICpzdHIgPSBTRUdQVFJfQUxMT0MoMjU2KTsKLSAgICAgICAgICAgICAgICAgICAgZHByaW50Zl9jb21tZGxnKHN0ZGRlYiwiV01fQ09NTUFORC9jbWIyLDMgPSUwOGxYXG4iLCBsUGFyYW0pOworICAgICAgICAgICAgICAgICAgICBkcHJpbnRmX2luZm8oY29tbWRsZywiV01fQ09NTUFORC9jbWIyLDMgPSUwOGxYXG4iLCBsUGFyYW0pOwogCQkgICAgaT1TZW5kRGxnSXRlbU1lc3NhZ2UxNihoRGxnLGNtYjEsQ0JfR0VUQ1VSU0VMMTYsMCwwKTsKIAkJICAgIGlmIChpPT1DQl9FUlIpCiAgICAgICAgICAgICAgICAgICAgICAgaT1HZXREbGdJdGVtVGV4dDMyQSggaERsZywgY21iMSwgc3RyLCAyNTYgKTsKQEAgLTMwMzUsNyArMzAzNiw3IEBACiAgICAgICBjYXNlIFdNX0NPTU1BTkQ6CiAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQ0ZuX1dNQ29tbWFuZChoRGxnLHdQYXJhbSxsUGFyYW0pOwogICAgICAgY2FzZSBXTV9DSE9PU0VGT05UX0dFVExPR0ZPTlQ6IAotICAgICAgICAgICAgICAgICAgICAgICAgIGRwcmludGZfY29tbWRsZyhzdGRkZWIsCisgICAgICAgICAgICAgICAgICAgICAgICAgZHByaW50Zl9pbmZvKGNvbW1kbGcsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICJGb3JtYXRDaGFyRGxnUHJvYyAvLyBXTV9DSE9PU0VGT05UX0dFVExPR0ZPTlQgbFBhcmFtPSUwOGxYXG4iLCBsUGFyYW0pOwogICAgICAgICAgICAgICAgICAgICAgICAgLyogRklYTUU6ICBjdXJyZW50IGxvZ2ZvbnQgYmFjayB0byBjYWxsZXIgKi8KICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwpkaWZmIC0tZ2l0IGEvbWlzYy9jcHUuYyBiL21pc2MvY3B1LmMKaW5kZXggOTI2NTk4Ni4uNjVlOWFjNCAxMDA2NDQKLS0tIGEvbWlzYy9jcHUuYworKysgYi9taXNjL2NwdS5jCkBAIC0xMCw2ICsxMCw3IEBACiAjaW5jbHVkZSA8c3RyaW5nLmg+CiAjaW5jbHVkZSAid2luZG93cy5oIgogI2luY2x1ZGUgIndpbm50LmgiCisjaW5jbHVkZSAid2lucmVnLmgiCiAKIHN0YXRpYyBCWVRFIFBGWzY0XSA9IHswLH07CiAKQEAgLTIwLDYgKzIxLDggQEAKIHsKIAlzdGF0aWMgaW50IGNhY2hlID0gMDsKIAlzdGF0aWMgU1lTVEVNX0lORk8gY2FjaGVkc2k7CisJSEtFWQl4aGtleT0wLGhrZXk7CisJY2hhcglidWZbMjBdOwogCiAJaWYgKGNhY2hlKSB7CiAJCW1lbWNweShzaSwmY2FjaGVkc2ksc2l6ZW9mKCpzaSkpOwpAQCAtNTUsNiArNTgsOCBAQAogCiAJaWYgKCFmKQogCQlyZXR1cm47CisgICAgICAgIHhoa2V5ID0gMDsKKwlSZWdDcmVhdGVLZXkxNihIS0VZX0xPQ0FMX01BQ0hJTkUsIlxcSEFSRFdBUkVcXERFU0NSSVBUSU9OXFxTeXN0ZW1cXENlbnRyYWxQcm9jZXNzb3IiLCZoa2V5KTsKIAl3aGlsZSAoZmdldHMobGluZSwyMDAsZikhPU5VTEwpIHsKIAkJY2hhcgkqcywqdmFsdWU7CiAKQEAgLTg4LDYgKzkzLDEwIEBACiAJCQkJCWJyZWFrOwogCQkJCX0KIAkJCX0KKwkJCS8qIHNldCB0aGUgQ1BVIHR5cGUgb2YgdGhlIGN1cnJlbnQgcHJvY2Vzc29yICovCisJCQlzcHJpbnRmKGJ1ZiwiQ1BVICVsZCIsY2FjaGVkc2kuZHdQcm9jZXNzb3JUeXBlKTsKKwkJCWlmICh4aGtleSkKKwkJCQlSZWdTZXRWYWx1ZUV4MzJBKHhoa2V5LCJJZGVudGlmaWVyIiwwLFJFR19TWixidWYsc3RybGVuKGJ1ZikpOwogCQkJY29udGludWU7CiAJCX0KIAkJLyogb2xkIDIuMCBtZXRob2QgKi8KQEAgLTExMiw2ICsxMjEsMTAgQEAKIAkJCQkJYnJlYWs7CiAJCQkJfQogCQkJfQorCQkJLyogc2V0IHRoZSBDUFUgdHlwZSBvZiB0aGUgY3VycmVudCBwcm9jZXNzb3IgKi8KKwkJCXNwcmludGYoYnVmLCJDUFUgJWxkIixjYWNoZWRzaS5kd1Byb2Nlc3NvclR5cGUpOworCQkJaWYgKHhoa2V5KQorCQkJCVJlZ1NldFZhbHVlRXgzMkEoeGhrZXksIklkZW50aWZpZXIiLDAsUkVHX1NaLGJ1ZixzdHJsZW4oYnVmKSk7CiAJCQljb250aW51ZTsKIAkJfQogCQlpZiAoIWxzdHJuY21waTMyQShsaW5lLCJmZGl2X2J1ZyIsc3RybGVuKCJmZGl2X2J1ZyIpKSkgewpAQCAtMTMzLDYgKzE0NiwxMiBAQAogCQkJaWYgKHNzY2FuZih2YWx1ZSwiJWQiLCZ4KSkKIAkJCQlpZiAoeCsxPmNhY2hlZHNpLmR3TnVtYmVyT2ZQcm9jZXNzb3JzKQogCQkJCQljYWNoZWRzaS5kd051bWJlck9mUHJvY2Vzc29ycz14KzE7CisKKwkJCS8qIGNyZWF0ZSBhIG5ldyBwcm9jZXNzb3Igc3Via2V5ICovCisJCQlzcHJpbnRmKGJ1ZiwiJWQiLHgpOworCQkJaWYgKHhoa2V5KQorCQkJCVJlZ0Nsb3NlS2V5KHhoa2V5KTsKKwkJCVJlZ0NyZWF0ZUtleTE2KGhrZXksYnVmLCZ4aGtleSk7CiAJCX0KIAkJaWYgKCFsc3RybmNtcGkzMkEobGluZSwic3RlcHBpbmciLHN0cmxlbigic3RlcHBpbmciKSkpIHsKIAkJCWludAl4OwpAQCAtMTUxLDExICsxNzAsMTUgQEAKIAlmY2xvc2UgKGYpOwogCX0KIAltZW1jcHkoc2ksJmNhY2hlZHNpLHNpemVvZigqc2kpKTsKLQlyZXR1cm47CiAjZWxzZSAgLyogbGludXggKi8KIAkvKiBGSVhNRTogaG93IGRvIHdlIGRvIHRoaXMgb24gb3RoZXIgc3lzdGVtcz8gKi8KLQlyZXR1cm47Ci0jZW5kaWYgIC8qIGxpbnV4ICovCisKKwlSZWdDcmVhdGVLZXkxNihoa2V5LCIwIiwmeGhrZXkpOworCVJlZ1NldFZhbHVlRXgzMkEoeGhrZXksIklkZW50aWZpZXIiLDAsUkVHX1NaLCJDUFUgMzg2IixzdHJsZW4oIkNQVSAzODYiKSk7CisjZW5kaWYgIC8qICFsaW51eCAqLworCWlmICh4aGtleSkKKwkJUmVnQ2xvc2VLZXkoeGhrZXkpOworCVJlZ0Nsb3NlS2V5KGhrZXkpOwogfQogCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKZGlmZiAtLWdpdCBhL21pc2MvY3J0ZGxsLmMgYi9taXNjL2NydGRsbC5jCmluZGV4IGRhYzliMzAuLjdjYThmYjkgMTAwNjQ0Ci0tLSBhL21pc2MvY3J0ZGxsLmMKKysrIGIvbWlzYy9jcnRkbGwuYwpAQCAtMzQsNyArMzQsNiBAQAogI2luY2x1ZGUgPHNldGptcC5oPgogI2luY2x1ZGUgIndpbi5oIgogI2luY2x1ZGUgIndpbmRvd3MuaCIKLSNpbmNsdWRlICJzdGRkZWJ1Zy5oIgogI2luY2x1ZGUgImRlYnVnLmgiCiAjaW5jbHVkZSAibW9kdWxlLmgiCiAjaW5jbHVkZSAiaGVhcC5oIgpAQCAtODMsMTIgKzgyLDEyIEBACiAJaW50CXhhcmdjLGksYWZ0ZXJsYXN0c3BhY2U7CiAJRFdPUkQJdmVyc2lvbjsKIAotCWRwcmludGZfY3J0ZGxsKHN0ZGRlYiwiQ1JURExMX19HZXRNYWluQXJncyglcCwlcCwlcCwlbGQpLlxuIiwKKwlkcHJpbnRmX2luZm8oY3J0ZGxsLCJDUlRETExfX0dldE1haW5BcmdzKCVwLCVwLCVwLCVsZCkuXG4iLAogCQlhcmdjLGFyZ3YsZW52aXJvbixmbGFnCiAJKTsKIAlDUlRETExfYWNtZGxuX2RsbCA9IGNtZGxpbmUgPSBIRUFQX3N0cmR1cEEoIEdldFByb2Nlc3NIZWFwKCksIDAsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR2V0Q29tbWFuZExpbmUzMkEoKSApOwotIAlkcHJpbnRmX2NydGRsbChzdGRkZWIsIkNSVERMTF9fR2V0TWFpbkFyZ3MgZ290IFwiJXNcIlxuIiwKKyAJZHByaW50Zl9pbmZvKGNydGRsbCwiQ1JURExMX19HZXRNYWluQXJncyBnb3QgXCIlc1wiXG4iLAogCQljbWRsaW5lKTsKIAogCXZlcnNpb24JPSBHZXRWZXJzaW9uMzIoKTsKQEAgLTEzMSw3ICsxMzAsNyBAQAogCUNSVERMTF9hcmd2X2RsbAk9IHhhcmd2OwogCSphcmd2CQk9IHhhcmd2OwogCi0JZHByaW50Zl9jcnRkbGwoc3RkZGViLCJDUlRETExfX0dldE1haW5BcmdzIGZvdW5kICVkIGFyZ3VtZW50c1xuIiwKKwlkcHJpbnRmX2luZm8oY3J0ZGxsLCJDUlRETExfX0dldE1haW5BcmdzIGZvdW5kICVkIGFyZ3VtZW50c1xuIiwKIAkJQ1JURExMX2FyZ2NfZGxsKTsKIAlDUlRETExfZW52aXJvbl9kbGwgPSAqZW52aXJvbiA9IEdldEVudmlyb25tZW50U3RyaW5nczMyQSgpOwogCXJldHVybiAwOwpAQCAtMTQ3LDcgKzE0Niw3IEBACiB7CiAJX0lOSVRURVJNRlVOCSpjdXJyZW50OwogCi0JZHByaW50Zl9jcnRkbGwoc3RkZGViLCJfaW5pdHRlcm0oJXAsJXApXG4iLHN0YXJ0LGVuZCk7CisJZHByaW50Zl9pbmZvKGNydGRsbCwiX2luaXR0ZXJtKCVwLCVwKVxuIixzdGFydCxlbmQpOwogCWN1cnJlbnQ9c3RhcnQ7CiAJd2hpbGUgKGN1cnJlbnQ8ZW5kKSB7CiAJCWlmICgqY3VycmVudCkgKCpjdXJyZW50KSgpOwpAQCAtMTc0LDcgKzE3Myw3IEBACiAgICAgZGVmYXVsdDoKICAgICAgIGZpbGU9ZmRvcGVuKGhhbmRsZSxtb2RlKTsKICAgICB9Ci0gIGRwcmludGZfY3J0ZGxsKHN0ZGRlYiwKKyAgZHByaW50Zl9pbmZvKGNydGRsbCwKIAkJICJDUlRETExfZmRvcGVuIG9wZW4gaGFuZGxlICVkIG1vZGUgJXMgIGdvdCBmaWxlICVwXG4iLAogCQkgaGFuZGxlLCBtb2RlLCBmaWxlKTsKICAgcmV0dXJuIChEV09SRClmaWxlOwpAQCAtMjE0LDcgKzIxMyw3IEBACiAgIERPU19GVUxMX05BTUUgZnVsbF9uYW1lOwogICAKICAgaWYgKCFET1NGU19HZXRGdWxsTmFtZSggcGF0aCwgRkFMU0UsICZmdWxsX25hbWUgKSkgewotICAgIGRwcmludGZfY3J0ZGxsKHN0ZGRlYiwiQ1JURExMX2ZvcGVuIGZpbGUgJXMgYmFkIG5hbWVcbiIscGF0aCk7CisgICAgZHByaW50Zl93YXJuKGNydGRsbCwgIkNSVERMTF9mb3BlbiBmaWxlICVzIGJhZCBuYW1lXG4iLHBhdGgpOwogICAgcmV0dXJuIDA7CiAgIH0KICAgCkBAIC0yMzUsMTQgKzIzNCwxNCBAQAogICBlbHNlIGlmIChzdHJzdHIobW9kZSwiYSsiKSkgZmxhZ21vZGU9IE9fUkRXUiB8IE9fQ1JFQVQgfCBPX0FQUEVORDsKICAgZWxzZSBpZiAoc3RyY2hyKG1vZGUsJ3cnKSkgZmxhZ21vZGUgPSBPX1JEV1IgfCBPX0NSRUFUIHwgT19BUFBFTkQ7CiAgIGVsc2UgaWYgKHN0cmNocihtb2RlLCdiJykpCi0gICAgZHByaW50Zl9jcnRkbGwoc3RkZXJyLAorICAgIGRwcmludGZfaW5mbyhjcnRkbGwsCiAJCSAgICJDUlRETExfZm9wZW4gJXMgaW4gQklOQVJZIG1vZGVcbiIscGF0aCk7CiAgICAgICAKICAgZG9zX2ZpbGRlcz1GSUxFX09wZW4ocGF0aCwgZmxhZ21vZGUpOwogICB1bml4X2ZpbGRlcz1GSUxFX0dldFVuaXhIYW5kbGUoZG9zX2ZpbGRlcyk7CiAgIGZpbGUgPSBmZG9wZW4odW5peF9maWxkZXMsbW9kZSk7CiAKLSAgZHByaW50Zl9jcnRkbGwoc3RkZGViLAorICBkcHJpbnRmX2luZm8oY3J0ZGxsLAogCQkgIkNSVERMTF9mb3BlbiBmaWxlICVzIG1vZGUgJXMgZ290IHVmaCAlZCBkZmggJWQgZmlsZSAlcFxuIiwKIAkJIHBhdGgsbW9kZSx1bml4X2ZpbGRlcyxkb3NfZmlsZGVzLGZpbGUpOwogICByZXR1cm4gKERXT1JEKWZpbGU7CkBAIC0yNjMsNyArMjYyLDcgQEAKICAgICAga25vd24gYmluYXJ5IGV4dGVuc2lvbnMgbXVzdCBiZSB1bmNoYW5nZWQgKi8KICAgd2hpbGUgKCAoaSA8IChubWVtYipzaXplKSkgJiYgKHJldD09MSkpIHsKICAgICByZXQ9ZnJlYWQodGVtcCwxLDEsZmlsZSk7Ci0gICAgZHByaW50Zl9jcnRkbGwoc3RkZGViLAorICAgIGRwcmludGZfaW5mbyhjcnRkbGwsCiAJCSAiQ1JURExMX2ZyZWFkIGdvdCAlYyAweCUwMnggcmV0ICVkXG4iLAogCQkgICAoaXNhbHBoYSgqKHVuc2lnbmVkIGNoYXIqKXRlbXApKT8gKih1bnNpZ25lZCBjaGFyKil0ZW1wOgogCQkgICAgJyAnLCoodW5zaWduZWQgY2hhciopdGVtcCwgcmV0KTsKQEAgLTI3MiwxOCArMjcxLDI0IEBACiAgICAgICBpKys7CiAgICAgfQogICAgIGVsc2UKLSAgICAgIGRwcmludGZfY3J0ZGxsKHN0ZGRlYiwgIkNSVERMTF9mcmVhZCBza2lwcGluZyBeTVxuIik7CisgICAgICBkcHJpbnRmX2luZm8oY3J0ZGxsLCAiQ1JURExMX2ZyZWFkIHNraXBwaW5nIF5NXG4iKTsKICAgfQotICBkcHJpbnRmX2NydGRsbChzdGRkZWIsCi0JCSAiQ1JURExMX2ZyZWFkIDB4JTA4eCBpdGVtcyBvZiBzaXplICVkIGZyb20gZmlsZSAlcCB0byAlcCVzXG4iLAotCQkgbm1lbWIsc2l6ZSxmaWxlLHB0ciwoaSE9bm1lbWIpPyIgZmFpbGVkIjoiIik7CisgIGRwcmludGZfaW5mbyhjcnRkbGwsCisJCSAiQ1JURExMX2ZyZWFkIDB4JTA4eCBpdGVtcyBvZiBzaXplICVkIGZyb20gZmlsZSAlcCB0byAlcFxuIiwKKwkJIG5tZW1iLHNpemUsZmlsZSxwdHIsKTsKKyAgaWYoaSE9bm1lbWIpCisgICAgZHByaW50Zl93YXJuKGNydGRsbCwgIiBmYWlsZWQhXG4iKTsKKwogICByZXR1cm4gaTsKICNlbHNlCiAgICAgCiAgIHJldD1mcmVhZChwdHIsc2l6ZSxubWVtYixmaWxlKTsKLSAgZHByaW50Zl9jcnRkbGwoc3RkZGViLAotCQkgIkNSVERMTF9mcmVhZCAweCUwOHggaXRlbXMgb2Ygc2l6ZSAlZCBmcm9tIGZpbGUgJXAgdG8gJXAlc1xuIiwKLQkJIG5tZW1iLHNpemUsZmlsZSxwdHIsKHJldCE9bm1lbWIpPyIgZmFpbGVkIjoiIik7CisgIGRwcmludGZfaW5mbyhjcnRkbGwsCisJICAgICAgICJDUlRETExfZnJlYWQgMHglMDh4IGl0ZW1zIG9mIHNpemUgJWQgZnJvbSBmaWxlICVwIHRvICVwXG4iLAorCSAgICAgICBubWVtYixzaXplLGZpbGUscHRyKTsKKyAgaWYocmV0IT1ubWVtYikKKyAgICBkcHJpbnRmX3dhcm4oY3J0ZGxsLCAiIGZhaWxlZCFcbiIpOworCiAgIHJldHVybiByZXQ7CiAjZW5kaWYKIH0KQEAgLTI5NiwxMiArMzAxLDE0IEBACiAgIGxvbmcgcmV0OwogCiAgIHJldD1mc2VlayhzdHJlYW0sb2Zmc2V0LHdoZW5jZSk7Ci0gIGRwcmludGZfY3J0ZGxsKHN0ZGRlYiwKLQkJICJDUlRETExfZnNlZWsgZmlsZSAlcCB0byAweCUwOGx4IHBvcyAlcyVzXG4iLAorICBkcHJpbnRmX2luZm8oY3J0ZGxsLAorCQkgIkNSVERMTF9mc2VlayBmaWxlICVwIHRvIDB4JTA4bHggcG9zICVzXG4iLAogCQkgc3RyZWFtLG9mZnNldCwod2hlbmNlPT1TRUVLX1NFVCk/IlNFRUtfU0VUIjoKIAkJICh3aGVuY2U9PVNFRUtfQ1VSKT8iU0VFS19DVVIiOgotCQkgKHdoZW5jZT09U0VFS19FTkQpPyJTRUVLX0VORCI6IlVOS05PV04iLAotCQkgKHJldCk/ImZhaWxlZCI6IiIpOworCQkgKHdoZW5jZT09U0VFS19FTkQpPyJTRUVLX0VORCI6IlVOS05PV04iKTsKKyAgaWYocmV0KQorICAgIGRwcmludGZfd2FybihjcnRkbGwsICIgZmFpbGVkIVxuIik7CisKICAgcmV0dXJuIHJldDsKIH0KICAgCkBAIC0zMTMsNyArMzIwLDcgQEAKICAgbG9uZyByZXQ7CiAKICAgcmV0PWZ0ZWxsKHN0cmVhbSk7Ci0gIGRwcmludGZfY3J0ZGxsKHN0ZGRlYiwKKyAgZHByaW50Zl9pbmZvKGNydGRsbCwKIAkJICJDUlRETExfZnRlbGwgZmlsZSAlcCBhdCAweCUwOGx4XG4iLAogCQkgc3RyZWFtLHJldCk7CiAgIHJldHVybiByZXQ7CkBAIC0zMjcsOSArMzM0LDEyIEBACiAgIHNpemVfdCByZXQ7CiAKICAgcmV0PWZ3cml0ZShwdHIsc2l6ZSxubWVtYixmaWxlKTsKLSAgZHByaW50Zl9jcnRkbGwoc3RkZGViLAotCQkgIkNSVERMTF9md3JpdGUgMHglMDh4IGl0ZW1zIG9mIHNpemUgJWQgZnJvbSAlcCB0byBmaWxlICVwJXNcbiIsCi0JCSBubWVtYixzaXplLHB0cixmaWxlLChyZXQhPW5tZW1iKT8iIGZhaWxlZCI6IiIpOworICBkcHJpbnRmX2luZm8oY3J0ZGxsLAorCQkgIkNSVERMTF9md3JpdGUgMHglMDh4IGl0ZW1zIG9mIHNpemUgJWQgZnJvbSAlcCB0byBmaWxlICVwXG4iLAorCQkgbm1lbWIsc2l6ZSxwdHIsZmlsZSk7CisgIGlmKHJldCE9bm1lbWIpCisgICAgZHByaW50Zl93YXJuKGNydGRsbCwgIiBGYWlsZWQhXG4iKTsKKwogICByZXR1cm4gcmV0OwogfQogCkBAIC0zMzgsNyArMzQ4LDcgQEAKICAqLwogSU5UMzIgX19jZGVjbCBDUlRETExfc2V0YnVmKExQVk9JRCBmaWxlLCBMUFNUUiBidWYpCiB7Ci0gIGRwcmludGZfY3J0ZGxsKHN0ZGRlYiwKKyAgZHByaW50Zl9pbmZvKGNydGRsbCwKIAkJICJDUlRETExfc2V0YnVmKGZpbGUgJXAgYnVmICVwKVxuIiwKIAkJIGZpbGUsYnVmKTsKICAgLyogdGhpcyBkb2Vzbid0IHdvcms6InZvaWQgdmFsdWUgbm90IGlnbm9yZWQgYXMgaXQgb3VnaHQgdG8gYmUiIApAQCAtMzcxLDcgKzM4MSw3IEBACiAJZGVmYXVsdDoKIAkgIHJldHVybiAoLTEpOwogCX0KLQlkcHJpbnRmX2NydGRsbChzdGRkZWIsCisJZHByaW50Zl9pbmZvKGNydGRsbCwKIAkJICAgICAgICJDUlRETExfb3Blbl9vc2ZoYW5kbGUoaGFuZGxlICUwOGx4LGZsYWdzICVkKSByZXR1cm4gJWRcbiIsCiAJCSAgICAgICBvc2ZoYW5kbGUsZmxhZ3MsaGFuZGxlKTsKIAlyZXR1cm4gaGFuZGxlOwpAQCAtNDQ1LDcgKzQ1NSw3IEBACiAgKi8KIEJPT0wzMiBfX2NkZWNsIENSVERMTF9faXNhdHR5KERXT1JEIHgpCiB7Ci0JZHByaW50Zl9jcnRkbGwoc3RkZXJyLCJDUlRETExfX2lzYXR0eSglbGQpXG4iLHgpOworCWRwcmludGZfaW5mbyhjcnRkbGwsIkNSVERMTF9faXNhdHR5KCVsZClcbiIseCk7CiAJcmV0dXJuIFRSVUU7CiB9CiAKQEAgLTQ2Miw3ICs0NzIsNyBAQAogCSAgbGVuID0gKFVJTlQzMil3cml0ZShmZCxidWYsKExPTkcpY291bnQpOwogCWVsc2UKIAkgIGxlbiA9IF9sd3JpdGUzMihmZCxidWYsY291bnQpOwotCWRwcmludGZfY3J0ZGxsKHN0ZGRlYiwiQ1JURExMX3dyaXRlICVkLyVkIGJ5dGUgdG8gZGZoICVkIGZyb20gJXAsXG4iLAorCWRwcmludGZfaW5mbyhjcnRkbGwsIkNSVERMTF93cml0ZSAlZC8lZCBieXRlIHRvIGRmaCAlZCBmcm9tICVwLFxuIiwKIAkJICAgICAgIGxlbixjb3VudCxmZCxidWYpOwogCXJldHVybiBsZW47CiB9CkBAIC00ODIsNyArNDkyLDcgQEAKICAqLwogdm9pZCBfX2NkZWNsIENSVERMTF9fY2V4aXQoSU5UMzIgcmV0KQogewotICAgICAgICBkcHJpbnRmX2NydGRsbChzdGRkZWIsIkNSVERMTF9fY2V4aXQoJWQpXG4iLHJldCk7CisgICAgICAgIGRwcmludGZfaW5mbyhjcnRkbGwsIkNSVERMTF9fY2V4aXQoJWQpXG4iLHJldCk7CiAJRXhpdFByb2Nlc3MocmV0KTsKIH0KIApAQCAtNDkyLDcgKzUwMiw3IEBACiAgKi8KIHZvaWQgX19jZGVjbCBDUlRETExfZXhpdChEV09SRCByZXQpCiB7Ci0gICAgICAgIGRwcmludGZfY3J0ZGxsKHN0ZGRlYiwiQ1JURExMX2V4aXQoJWxkKVxuIixyZXQpOworICAgICAgICBkcHJpbnRmX2luZm8oY3J0ZGxsLCJDUlRETExfZXhpdCglbGQpXG4iLHJldCk7CiAJRXhpdFByb2Nlc3MocmV0KTsKIH0KIApAQCAtNTAyLDcgKzUxMiw3IEBACiAgKi8KIElOVDMyIF9fY2RlY2wgQ1JURExMX19hYm5vcm1hbF90ZXJtaW5hdGlvbih2b2lkKQogewotICAgICAgICBkcHJpbnRmX2NydGRsbChzdGRkZWIsIkNSVERMTF9fYWJub3JtYWxfdGVybWluYXRpb25cbiIpOworICAgICAgICBkcHJpbnRmX2luZm8oY3J0ZGxsLCJDUlRETExfX2Fibm9ybWFsX3Rlcm1pbmF0aW9uXG4iKTsKIAlyZXR1cm4gMDsKIH0KIApAQCAtNTE1LDcgKzUyNSwxMCBAQAogICAgIGludCByZXQ7CiAKICAgICByZXQgPSBmZmx1c2goc3RyZWFtKTsKLSAgICBkcHJpbnRmX2NydGRsbChzdGRkZWIsIkNSVERMTF9mZmx1c2ggJXAgcmV0dXJuZCAlZCAlc1xuIixzdHJlYW0scmV0LChyZXQpPyIiOiIgZmFpbGVkIik7CisgICAgZHByaW50Zl9pbmZvKGNydGRsbCwiQ1JURExMX2ZmbHVzaCAlcCByZXR1cm5kICVkXG4iLHN0cmVhbSxyZXQpOworICAgIGlmKHJldCkKKyAgICAgIGRwcmludGZfd2FybihjcnRkbGwsICIgRmFpbGVkIVxuIik7CisKICAgICByZXR1cm4gcmV0OwogfQogCkBAIC01MzAsNyArNTQzLDcgQEAKICAgICogd2luZG93czk1J3MgZnRwLmV4ZS4KICAgICovCiAgICByZXQgPSBnZXRzKGJ1Zik7Ci0gICBkcHJpbnRmX2NydGRsbChzdGRkZWIsIkNSVERMTF9nZXRzIGdvdCAlc1xuIixyZXQpOworICAgZHByaW50Zl9pbmZvKGNydGRsbCwiQ1JURExMX2dldHMgZ290ICVzXG4iLHJldCk7CiAgICByZXR1cm4gcmV0OwogfQogCkBAIC01NTgsNyArNTcxLDcgQEAKICAqLwogSU5UMzIgX19jZGVjbCBDUlRETExfZnB1dGMoIElOVDMyIGMsIEZJTEUgKnN0cmVhbSApCiB7Ci0gIGRwcmludGZfY3J0ZGxsKHN0ZGRlYiwKKyAgZHByaW50Zl9pbmZvKGNydGRsbCwKIAkJICJDUlRETExfZnB1dGMgJWMgdG8gZmlsZSAlcFxuIixjLHN0cmVhbSk7CiAgICAgcmV0dXJuIGZwdXRjKGMsc3RyZWFtKTsKIH0KQEAgLTU2OSw3ICs1ODIsNyBAQAogICovCiBJTlQzMiBfX2NkZWNsIENSVERMTF9mcHV0cyggTFBDU1RSIHMsIEZJTEUgKnN0cmVhbSApCiB7Ci0gIGRwcmludGZfY3J0ZGxsKHN0ZGRlYiwKKyAgZHByaW50Zl9pbmZvKGNydGRsbCwKIAkJICJDUlRETExfZnB1dHMgJXMgdG8gZmlsZSAlcFxuIixzLHN0cmVhbSk7CiAgICAgcmV0dXJuIGZwdXRzKHMsc3RyZWFtKTsKIH0KQEAgLTU4MCw3ICs1OTMsNyBAQAogICovCiBJTlQzMiBfX2NkZWNsIENSVERMTF9wdXRzKExQQ1NUUiBzKQogewotICBkcHJpbnRmX2NydGRsbChzdGRkZWIsCisgIGRwcmludGZfaW5mbyhjcnRkbGwsCiAJCSAiQ1JURExMX2ZwdXRzICVzIFxuIixzKTsKICAgICByZXR1cm4gcHV0cyhzKTsKIH0KQEAgLTU5MSw3ICs2MDQsNyBAQAogICovCiBJTlQzMiBfX2NkZWNsIENSVERMTF9wdXRjKElOVDMyIGMsIEZJTEUgKnN0cmVhbSkKIHsKLSAgZHByaW50Zl9jcnRkbGwoc3RkZGViLAorICBkcHJpbnRmX2luZm8oY3J0ZGxsLAogCQkgIkNSVERMTF9wdXRjICVjIHRvIGZpbGUgJXBcbiIsYyxzdHJlYW0pOwogICAgIHJldHVybiBmcHV0YyhjLHN0cmVhbSk7CiB9CkBAIC02MDEsNyArNjE0LDcgQEAKIElOVDMyIF9fY2RlY2wgQ1JURExMX2ZnZXRjKCBGSUxFICpzdHJlYW0gKQogewogICBpbnQgcmV0PSBmZ2V0YyhzdHJlYW0pOwotICBkcHJpbnRmX2NydGRsbChzdGRkZWIsCisgIGRwcmludGZfaW5mbyhjcnRkbGwsCiAJCSAiQ1JURExMX2ZnZXRjIGdvdCAlZFxuIixyZXQpOwogICByZXR1cm4gcmV0OwogfQpAQCAtNjEzLDcgKzYyNiw3IEBACiBJTlQzMiBfX2NkZWNsIENSVERMTF9nZXRjKCBGSUxFICpzdHJlYW0gKQogewogICBpbnQgcmV0PSBmZ2V0YyhzdHJlYW0pOwotICBkcHJpbnRmX2NydGRsbChzdGRkZWIsCisgIGRwcmludGZfaW5mbyhjcnRkbGwsCiAJCSAiQ1JURExMX2dldGMgZ290ICVkXG4iLHJldCk7CiAgIHJldHVybiByZXQ7CiB9CkBAIC02MjUsNyArNjM4LDcgQEAKIHsKICAgIHVuc2lnbmVkIGludCByZXQgPSAoeCA+PiBzaGlmdCl8KCB4ID4+KChzaXplb2YoeCkpLXNoaWZ0KSk7CiAKLSAgIGRwcmludGZfY3J0ZGxsKHN0ZGRlYiwKKyAgIGRwcmludGZfaW5mbyhjcnRkbGwsCiAJCSAgIkNSVERMTF9yb3RsIGdvdCAweCUwOHggcm90ICVkIHJldCAweCUwOHhcbiIsCiAJCSAgeCxzaGlmdCxyZXQpOwogICAgcmV0dXJuIHJldDsKQEAgLTYzOCw3ICs2NTEsNyBAQAogewogICAgdW5zaWduZWQgbG9uZyByZXQgPSAoeCA+PiBzaGlmdCl8KCB4ID4+KChzaXplb2YoeCkpLXNoaWZ0KSk7CiAKLSAgIGRwcmludGZfY3J0ZGxsKHN0ZGRlYiwKKyAgIGRwcmludGZfaW5mbyhjcnRkbGwsCiAJCSAgIkNSVERMTF9scm90bCBnb3QgMHglMDhseCByb3QgJWQgcmV0IDB4JTA4bHhcbiIsCiAJCSAgeCxzaGlmdCxyZXQpOwogICAgcmV0dXJuIHJldDsKQEAgLTY2Myw5ICs2NzYsMTIgQEAKICAgICAgICpjb250cm9sX009J1xuJzsKICAgICAgICooY29udHJvbF9NKzEpPTA7CiAgICAgfQotICBkcHJpbnRmX2NydGRsbChzdGRkZWIsCi0JCSAiQ1JURExMX2ZnZXRzIGdvdCAlcyBmb3IgJWQgY2hhcnMgZnJvbSBmaWxlICVwJXNcbiIsCi0JCSBzLHNpemUsc3RyZWFtLChyZXQpPyIiOiIgZmFpbGVkIik7CisgIGRwcmludGZfaW5mbyhjcnRkbGwsCisJCSAiQ1JURExMX2ZnZXRzIGdvdCAlcyBmb3IgJWQgY2hhcnMgZnJvbSBmaWxlICVwXG4iLAorCQkgcyxzaXplLHN0cmVhbSk7CisgIGlmKHJldCkKKyAgICBkcHJpbnRmX3dhcm4oY3J0ZGxsLCAiIEZhaWxlZCFcbiIpOworCiAgIHJldHVybiByZXQ7CiB9CiAKQEAgLTcyMCw3ICs3MzYsNyBAQAogICovCiB1bnNpZ25lZCBjaGFyKiBfX2NkZWNsIENSVERMTF9fbWJzY3B5KHVuc2lnbmVkIGNoYXIgKngsdW5zaWduZWQgY2hhciAqeSkKIHsKLSAgICBkcHJpbnRmX2NydGRsbChzdGRkZWIsIkNSVERMTF9tYnNjcHkgJXMgYW5kICVzXG4iLHgseSk7CisgICAgZHByaW50Zl9pbmZvKGNydGRsbCwiQ1JURExMX21ic2NweSAlcyBhbmQgJXNcbiIseCx5KTsKICAgICByZXR1cm4gc3RyY3B5KHgseSk7CiB9CiAKQEAgLTc2MSwxNCArNzc3LDEzIEBACiB7CiAgIHVuc2lnbmVkIGNoYXIgKnkgPXg7CiAgIAotICBkcHJpbnRmX2NydGRsbChzdGRkZWIsCi0JCSAiQ1JURExMX3N0cmx3ciBnb3QgJXMiLHgpOworICBkcHJpbnRmX2luZm8oY3J0ZGxsLCAiQ1JURExMX3N0cmx3ciBnb3QgJXNcbiIsIHgpOwogICB3aGlsZSAoKnkpIHsKICAgICBpZiAoKCp5ID4gMHg0MCkgJiYgKCp5PCAweDViKSkKICAgICAgICp5ID0gKnkgKyAweDIwOwogICAgIHkrKzsKICAgfQotICBkcHJpbnRmX2NydGRsbChzdGRkZWIsIiByZXR1cm5lZCAlc1xuIix4KTsKKyAgZHByaW50Zl9pbmZvKGNydGRsbCwgIiAgIHJldHVybmVkICVzXG4iLCB4KTsKIAkJIAogICByZXR1cm4geDsKIH0KQEAgLTc5NSw3ICs4MTAsNyBAQAogICB9CiAgIC8qIElmIGJ1ZmZlciB0b28gc2hvcnQsIGV4aXQuICAqLwogICBpZiAoaSA+IFNZU0JVRl9MRU5HVEgpIHsKLSAgICBkcHJpbnRmX2NydGRsbChzdGRkZWIsIl9zeXN0ZW0gYnVmZmVyIHRvIHNtYWxsXG4iKTsKKyAgICBkcHJpbnRmX2luZm8oY3J0ZGxsLCJfc3lzdGVtIGJ1ZmZlciB0byBzbWFsbFxuIik7CiAgICAgcmV0dXJuIDEyNzsKICAgfQogICAKQEAgLTgxMiw3ICs4MjcsNyBAQAogICB9CiAgICpicCsrID0gJyInOwogICAqYnAgPSAwOwotICBkcHJpbnRmX2NydGRsbChzdGRkZWIsCisgIGRwcmludGZfaW5mbyhjcnRkbGwsCiAJCSAiX3N5c3RlbSBnb3QgXCIlc1wiLCBleGVjdXRpbmcgXCIlc1wiXG4iLHgsYnVmZmVyKTsKIAogICByZXR1cm4gc3lzdGVtKGJ1ZmZlcik7CkBAIC04NjYsOCArODgxLDcgQEAKICAqLwogVk9JRCBfX2NkZWNsIENSVERMTF9sb25nam1wKGptcF9idWYgZW52LCBpbnQgdmFsKQogewotICAgIGRwcmludGZfY3J0ZGxsKHN0ZG5pbXAsIkNSVERMTF9sb25nam1wIHNlbWlzdHVwLCBleHBlY3QgY3Jhc2hcbiIpOwotICAgIGRwcmludGZfY3J0ZGxsKHN0ZGRlYiwgIkNSVERMTF9sb25nam1wIHNlbWlzdHVwLCBleHBlY3QgY3Jhc2hcbiIpOworICAgIGRwcmludGZfZml4bWUoY3J0ZGxsLCJDUlRETExfbG9uZ2ptcCBzZW1pc3R1cCwgZXhwZWN0IGNyYXNoXG4iKTsKICAgICByZXR1cm4gbG9uZ2ptcChlbnYsIHZhbCk7CiB9CiAKQEAgLTk1Niw4ICs5NzAsMTIgQEAKICAgICAgIGZjbG9zZShzdHJlYW0pOwogICAgICAgcmV0ID0gX2xjbG9zZTMyKCBkb3NfaGFuZGxlKTsKICAgICB9Ci0gICAgZHByaW50Zl9jcnRkbGwoc3RkZGViLCJDUlRETExfZmNsb3NlKCVwKSB1ZmggJWQgZGZoICVkJXNcbiIsCi0JCSAgIHN0cmVhbSx1bml4X2hhbmRsZSxkb3NfaGFuZGxlLChyZXQpPyIgZmFpbGVkIjoiIik7CisgICAgZHByaW50Zl9pbmZvKGNydGRsbCwiQ1JURExMX2ZjbG9zZSglcCkgdWZoICVkIGRmaCAlZFxuIiwKKwkJICAgc3RyZWFtLHVuaXhfaGFuZGxlLGRvc19oYW5kbGUpOworCisgICAgaWYocmV0KQorICAgICAgZHByaW50Zl93YXJuKGNydGRsbCwgIiBGYWlsZWQhXG4iKTsKKwogICAgIHJldHVybiByZXQ7CiB9CiAKQEAgLTk3MCwxMyArOTg4LDE2IEBACiAgICAgRE9TX0ZVTExfTkFNRSBmdWxsX25hbWU7CiAKICAgICBpZiAoIURPU0ZTX0dldEZ1bGxOYW1lKCBwYXRobmFtZSwgRkFMU0UsICZmdWxsX25hbWUgKSkgewotICAgICAgZHByaW50Zl9jcnRkbGwoc3RkZGViLCJDUlRETExfdW5saW5rIGZpbGUgJXMgYmFkIG5hbWVcbiIscGF0aG5hbWUpOworICAgICAgZHByaW50Zl93YXJuKGNydGRsbCwgIkNSVERMTF91bmxpbmsgZmlsZSAlcyBiYWQgbmFtZVxuIixwYXRobmFtZSk7CiAgICAgICByZXR1cm4gRU9GOwogICAgIH0KICAgCiAgICAgcmV0PXVubGluayhmdWxsX25hbWUubG9uZ19uYW1lKTsKLSAgICBkcHJpbnRmX2NydGRsbChzdGRkZWIsIkNSVERMTF91bmxpbmsoJXMgdW5peCAlcyklc1xuIiwKLQkJICAgcGF0aG5hbWUsZnVsbF9uYW1lLmxvbmdfbmFtZSwgKHJldCk/IiBmYWlsZWQiOiIiKTsKKyAgICBkcHJpbnRmX2luZm8oY3J0ZGxsLCJDUlRETExfdW5saW5rKCVzIHVuaXggJXMpXG4iLAorCQkgICBwYXRobmFtZSxmdWxsX25hbWUubG9uZ19uYW1lKTsKKyAgICBpZihyZXQpCisgICAgICBkcHJpbnRmX3dhcm4oY3J0ZGxsLCAiIEZhaWxlZCFcbiIpOworCiAgICAgcmV0dXJuIHJldDsKIH0KIApAQCAtMTAxNywxMiArMTAzOCwxMyBAQAogCiAgICAgaWYgKCFET1NGU19HZXRGdWxsTmFtZSggZmlsZW5hbWUsIFRSVUUsICZmdWxsX25hbWUgKSkKICAgICB7Ci0gICAgICBkcHJpbnRmX2NydGRsbChzdGRkZWIsIkNSVERMTF9fc3RhdCBmaWxlbmFtZSAlcyBiYWQgbmFtZVxuIixmaWxlbmFtZSk7CisgICAgICBkcHJpbnRmX3dhcm4oY3J0ZGxsLCAiQ1JURExMX19zdGF0IGZpbGVuYW1lICVzIGJhZCBuYW1lXG4iLGZpbGVuYW1lKTsKICAgICAgIHJldHVybiAtMTsKICAgICB9CiAgICAgcmV0PXN0YXQoZnVsbF9uYW1lLmxvbmdfbmFtZSwmbXlzdGF0KTsKLSAgICBkcHJpbnRmX2NydGRsbChzdGRkZWIsIkNSVERMTF9fc3RhdCAlcyVzXG4iLAotCQkgICBmaWxlbmFtZSwgKHJldCk/IiBmYWlsZWQiOiIiKTsKKyAgICBkcHJpbnRmX2luZm8oY3J0ZGxsLCJDUlRETExfX3N0YXQgJXNcbiIsIGZpbGVuYW1lKTsKKyAgICBpZihyZXQpIAorICAgICAgZHByaW50Zl93YXJuKGNydGRsbCwgIiBGYWlsZWQhXG4iKTsKIAogICAgIC8qIEZJWE1FOiBzaG91bGQgY2hlY2sgd2hhdCBXaW5kb3dzIHJldHVybnMgKi8KIApAQCAtMTA2MSwxMSArMTA4MywxMSBAQAogICAgIGlmIChmbGFncyAmIDB4MDIwMCApIHdpbmVmbGFncyB8PSBPX1RSVU5DOwogICAgIGlmIChmbGFncyAmIDB4MDQwMCApIHdpbmVmbGFncyB8PSBPX0VYQ0w7CiAgICAgaWYgKGZsYWdzICYgMHhmMGY0ICkgCi0gICAgICBkcHJpbnRmX2NydGRsbChzdGRkZWIsIkNSVERMTF9vcGVuIGZpbGUgdW5zdXBwb3J0ZWQgZmxhZ3MgMHglMDR4XG4iLGZsYWdzKTsKKyAgICAgIGRwcmludGZfaW5mbyhjcnRkbGwsIkNSVERMTF9vcGVuIGZpbGUgdW5zdXBwb3J0ZWQgZmxhZ3MgMHglMDR4XG4iLGZsYWdzKTsKICAgICAvKiBFbmQgRml4bWUgKi8KIAogICAgIHJldCA9IEZJTEVfT3BlbihwYXRoLHdpbmVmbGFncyk7Ci0gICAgZHByaW50Zl9jcnRkbGwoc3RkZGViLCJDUlRETExfb3BlbiBmaWxlICVzIG1vZGUgMHglMDR4IChsY2Ntb2RlIDB4JTA0eCkgZ290IGRmaCAlZFxuIiwKKyAgICBkcHJpbnRmX2luZm8oY3J0ZGxsLCJDUlRETExfb3BlbiBmaWxlICVzIG1vZGUgMHglMDR4IChsY2Ntb2RlIDB4JTA0eCkgZ290IGRmaCAlZFxuIiwKIAkJICAgcGF0aCx3aW5lZmxhZ3MsZmxhZ3MscmV0KTsKICAgICByZXR1cm4gcmV0OwogfQpAQCAtMTA3Nyw3ICsxMDk5LDEwIEBACiB7CiAgICAgaW50IHJldD1fbGNsb3NlMzIoZmQpOwogCi0gICAgZHByaW50Zl9jcnRkbGwoc3RkZGViLCJDUlRETExfY2xvc2UoJWQpJXNcbiIsZmQsKHJldCk/IiBmYWlsZWQiOiIiKTsKKyAgICBkcHJpbnRmX2luZm8oY3J0ZGxsLCJDUlRETExfY2xvc2UoJWQpXG4iLGZkKTsKKyAgICBpZihyZXQpCisgICAgICBkcHJpbnRmX3dhcm4oY3J0ZGxsLCAiIEZhaWxlZCFcbiIpOworCiAgICAgcmV0dXJuIHJldDsKIH0KIApAQCAtMTA4OSw3ICsxMTE0LDcgQEAKICAgICBpbnQgcmV0OwogICAgIAogICAgIHJldD1mZW9mKHN0cmVhbSk7Ci0gICAgZHByaW50Zl9jcnRkbGwoc3RkZGViLCJDUlRETExfZmVvZiglcCkgJXNcbiIsc3RyZWFtLChyZXQpPyJ0cnVlIjoiZmFsc2UiKTsKKyAgICBkcHJpbnRmX2luZm8oY3J0ZGxsLCJDUlRETExfZmVvZiglcCkgJXNcbiIsc3RyZWFtLChyZXQpPyJ0cnVlIjoiZmFsc2UiKTsKICAgICByZXR1cm4gcmV0OwogfQogCkBAIC0xMzM1LDEwICsxMzYwLDkgQEAKICNkZWZpbmUgT19URVhUICAgICAweDQwMDAKICNkZWZpbmUgT19CSU5BUlkgICAweDgwMDAKIAotCWRwcmludGZfY3J0ZGxsKHN0ZGRlYiwKLQkJICAgICAgICJDUlRETEwuX3NldG1vZGUgb24gZmhhbmRsZSAlZCBtb2RlICVzLCBTVFVCLlxuIiwKLQkJZmgsKG1vZGU9T19URVhUKT8iT19URVhUIjoKLQkJKG1vZGU9T19CSU5BUlkpPyJPX0JJTkFSWSI6IlVOS05PV04iKTsKKwlkcHJpbnRmX2ZpeG1lKGNydGRsbCwgIkNSVERMTC5fc2V0bW9kZSBvbiBmaGFuZGxlICVkIG1vZGUgJXMsIFNUVUIuXG4iLAorCQkgICAgICBmaCwobW9kZT1PX1RFWFQpPyJPX1RFWFQiOgorCQkgICAgICAgICAgICAgICAgICAgICAgICAobW9kZT1PX0JJTkFSWSk/Ik9fQklOQVJZIjoiVU5LTk9XTiIpOwogCXJldHVybiAtMTsKIH0KIApAQCAtMTM2OCw3ICsxMzkyLDcgQEAKICAgICBlbHNlIGlmICghKCptYikpCiAgICAgICByZXQgPTA7CiAgICAgICAKLSAgICBkcHJpbnRmX2NydGRsbChzdGRlcnIsIkNSVERMTF9tbGVuICVzIGZvciBtYXggJWQgYnl0ZXMgcmV0ICVkXG4iLG1iLHNpemUscmV0KTsKKyAgICBkcHJpbnRmX2luZm8oY3J0ZGxsLCJDUlRETExfbWxlbiAlcyBmb3IgbWF4ICVkIGJ5dGVzIHJldCAlZFxuIixtYixzaXplLHJldCk7CiAKICAgICByZXR1cm4gcmV0OwogfQpAQCAtMTM5NSw3ICsxNDE5LDcgQEAKICAgICBwKys7CiAgICAgcmV0ID0gKHAgLXdjcyk7CiAgICAgICAgICAgCi0gICAgZHByaW50Zl9jcnRkbGwoc3RkZGViLCJDUlRETExfbWJzdG93Y3MgJXMgZm9yICVkIGNoYXJzIHB1dCAlZCB3Y2hhcnNcbiIsCisgICAgZHByaW50Zl9pbmZvKGNydGRsbCwiQ1JURExMX21ic3Rvd2NzICVzIGZvciAlZCBjaGFycyBwdXQgJWQgd2NoYXJzXG4iLAogCQkgICBtYnMsc2l6ZSxyZXQpOwogICAgIHJldHVybiByZXQ7CiB9CkBAIC0xNDIzLDcgKzE0NDcsNyBAQAogICAgICBlbHNlCiAgICAgICAgcmV0ID0gLTE7CiAgICAKLSAgIGRwcmludGZfY3J0ZGxsKHN0ZGVyciwiQ1JURExMX21idG93YyAlcyBmb3IgJWQgY2hhcnNcbiIsbWIsc2l6ZSk7CisgICBkcHJpbnRmX2luZm8oY3J0ZGxsLCJDUlRETExfbWJ0b3djICVzIGZvciAlZCBjaGFyc1xuIixtYixzaXplKTsKICAgICAgICAgIAogICAgcmV0dXJuIHJldDsKIH0KQEAgLTE0ODQsNyArMTUwOCw3IEBACiAgIH0KICAgaWYgKCFET1NGU19HZXRGdWxsTmFtZSggbmFtZSwgRkFMU0UsICZmdWxsX25hbWUgKSkgcmV0dXJuIE5VTEw7CiAgIGxzdHJjcHluMzJBKGJ1ZixmdWxsX25hbWUuc2hvcnRfbmFtZSxzaXplKTsKLSAgZHByaW50Zl9jcnRkbGwoc3RkZXJyLCJDUlRETExfZnVsbHBhdGggZ290ICVzXG4iLGJ1Zik7CisgIGRwcmludGZfaW5mbyhjcnRkbGwsIkNSVERMTF9mdWxscGF0aCBnb3QgJXNcbiIsYnVmKTsKICAgcmV0dXJuIGJ1ZjsKIH0KIApAQCAtMTUwMCw3ICsxNTI0LDcgQEAKICAgICAgKi8KICAgY2hhciAqIGRyaXZlY2hhciwqZGlyY2hhciwqbmFtZWNoYXI7CiAKLSAgZHByaW50Zl9jcnRkbGwoc3RkZGViLCJDUlRETExfX3NwbGl0cGF0aCBnb3QgJXNcbiIscGF0aCk7CisgIGRwcmludGZfaW5mbyhjcnRkbGwsIkNSVERMTF9fc3BsaXRwYXRoIGdvdCAlc1xuIixwYXRoKTsKIAogICBkcml2ZWNoYXIgID0gc3RyY2hyKHBhdGgsJzonKTsKICAgZGlyY2hhciAgICA9IHN0cnJjaHIocGF0aCwnLycpOwpAQCAtMTU0NCw3ICsxNTY4LDcgQEAKIAl9CiAgICAgfQogCi0gIGRwcmludGZfY3J0ZGxsKHN0ZGRlYiwiQ1JURExMX19zcGxpdHBhdGggZm91bmQgJXMgJXMgJXMgJXNcbiIsZHJpdmUsZGlyZWN0b3J5LGZpbGVuYW1lLGV4dGVuc2lvbik7CisgIGRwcmludGZfaW5mbyhjcnRkbGwsIkNSVERMTF9fc3BsaXRwYXRoIGZvdW5kICVzICVzICVzICVzXG4iLGRyaXZlLGRpcmVjdG9yeSxmaWxlbmFtZSxleHRlbnNpb24pOwogICAKIH0KIApAQCAtMTU3NCw3ICsxNTk4LDcgQEAKICAgaWYgKGxlbiA+IHNpemUpCiAgICAgewogICAgICAgLyogc2V0IGVycm9yIHRvIEVSQU5HRSAqLwotICAgICAgZHByaW50Zl9jcnRkbGwoc3RkZGViLCJDUlRETExfZ2V0Y3dkIGJ1ZmZlciB0byBzbWFsbFxuIik7CisgICAgICBkcHJpbnRmX2luZm8oY3J0ZGxsLCJDUlRETExfZ2V0Y3dkIGJ1ZmZlciB0byBzbWFsbFxuIik7CiAgICAgICByZXR1cm4gTlVMTDsKICAgICB9CiAgIHJldHVybiBidWY7CkBAIC0xNjE2LDI5ICsxNjQwLDI4IEBACiAgICAgIERPU19GVUxMX05BTUUgdGVtcG5hbWU7CiAgICAgIAogICAgICBpZiAoKHJldCA9IHRlbXBuYW0oZGlyLHByZWZpeCkpPT1OVUxMKSB7Ci0gICAgICAgZHByaW50Zl9jcnRkbGwoc3RkZGViLAotCQkgICAgICAiQ1JURExMX3RlbXBuYW0gVW5hYmxlIHRvIGdldCB1bmlxdWUgZmlsZW5hbWVcbiIpOworICAgICAgIGRwcmludGZfd2FybihjcnRkbGwsICJVbmFibGUgdG8gZ2V0IHVuaXF1ZSBmaWxlbmFtZVxuIik7CiAgICAgICAgcmV0dXJuIE5VTEw7CiAgICAgIH0KICAgICAgaWYgKCFET1NGU19HZXRGdWxsTmFtZShyZXQsRkFMU0UsJnRlbXBuYW1lKSkKICAgICAgewotICAgICAgIGRwcmludGZfY3J0ZGxsKHN0ZGRlYiwKKyAgICAgICBkcHJpbnRmX2luZm8oY3J0ZGxsLAogCQkgICAgICAiQ1JURExMX3RlbXBuYW0gV3JvbmcgcGF0aD9cbiIpOwogICAgICAgIHJldHVybiBOVUxMOwogICAgICB9CiAgICAgIGZyZWUocmV0KTsKICAgICAgaWYgKChyZXQgPSBDUlRETExfbWFsbG9jKHN0cmxlbih0ZW1wbmFtZS5zaG9ydF9uYW1lKSsxKSkgPT0gTlVMTCkgewotCSBkcHJpbnRmX2NydGRsbChzdGRkZWIsCisJIGRwcmludGZfd2FybihjcnRkbGwsCiAJCQkiQ1JURExMX3RlbXBuYW0gQ1JURExfbWFsbG9jIGZvciBzaG9ydG5hbWUgZmFpbGVkXG4iKTsKIAkgcmV0dXJuIE5VTEw7CiAgICAgIH0KICAgICAgaWYgKChyZXQgPSBzdHJjcHkocmV0LHRlbXBuYW1lLnNob3J0X25hbWUpKSA9PSBOVUxMKSB7IAotICAgICAgIGRwcmludGZfY3J0ZGxsKHN0ZGRlYiwKKyAgICAgICBkcHJpbnRmX3dhcm4oY3J0ZGxsLAogCQkgICAgICAiQ1JURExMX3RlbXBuYW0gTWFsbG9jIGZvciBzaG9ydG5hbWUgZmFpbGVkXG4iKTsKICAgICAgICByZXR1cm4gTlVMTDsKICAgICAgfQogICAgICAKLSAgICAgZHByaW50Zl9jcnRkbGwoc3RkZGViLCJDUlRETExfdGVtcG5hbSBkaXIgJXMgcHJlZml4ICVzIGdvdCAlc1xuIiwKKyAgICAgZHByaW50Zl9pbmZvKGNydGRsbCwiQ1JURExMX3RlbXBuYW0gZGlyICVzIHByZWZpeCAlcyBnb3QgJXNcbiIsCiAJCSAgICBkaXIscHJlZml4LHJldCk7CiAgICAgIHJldHVybiByZXQ7CiAKQEAgLTE2NTQsMjAgKzE2NzcsMTkgQEAKICAgICAgY2hhciAqcmV0OwogCiAgICAgIGlmICgocmV0ID10bXBuYW0ocykpPT0gTlVMTCkgewotICAgICAgIGRwcmludGZfY3J0ZGxsKHN0ZGRlYiwKLQkJICAgICAgIkNSVERMTF90bXBuYW0gVW5hYmxlIHRvIGdldCB1bmlxdWUgZmlsZW5hbWVcbiIpOworICAgICAgIGRwcmludGZfd2FybihjcnRkbGwsICJVbmFibGUgdG8gZ2V0IHVuaXF1ZSBmaWxlbmFtZVxuIik7CiAgICAgICAgcmV0dXJuIE5VTEw7CiAgICAgIH0KICAgICAgaWYgKCFET1NGU19HZXRGdWxsTmFtZShyZXQsRkFMU0UsJkNSVERMTF90bXBuYW1lKSkKICAgICAgewotICAgICAgIGRwcmludGZfY3J0ZGxsKHN0ZGRlYiwKKyAgICAgICBkcHJpbnRmX2luZm8oY3J0ZGxsLAogCQkgICAgICAiQ1JURExMX3RtcG5hbSBXcm9uZyBwYXRoP1xuIik7CiAgICAgICAgcmV0dXJuIE5VTEw7CiAgICAgIH0KICAgICAgc3RyY2F0KENSVERMTF90bXBuYW1lLnNob3J0X25hbWUsIi4iKTsKLSAgICAgZHByaW50Zl9jcnRkbGwoc3RkZGViLCJDUlRETExfdG1wbmFtIGZvciBidWYgJXAgZ290ICVzXG4iLAorICAgICBkcHJpbnRmX2luZm8oY3J0ZGxsLCJDUlRETExfdG1wbmFtIGZvciBidWYgJXAgZ290ICVzXG4iLAogCQkgICAgcyxDUlRETExfdG1wbmFtZS5zaG9ydF9uYW1lKTsKLSAgICAgZHByaW50Zl9jcnRkbGwoc3RkZGViLCJDUlRETExfdG1wbmFtIGxvbmcgZ290ICVzXG4iLAorICAgICBkcHJpbnRmX2luZm8oY3J0ZGxsLCJDUlRETExfdG1wbmFtIGxvbmcgZ290ICVzXG4iLAogCQkgICAgQ1JURExMX3RtcG5hbWUubG9uZ19uYW1lKTsKICAgICAgaWYgKCBzICE9IE5VTEwpIAogICAgICAgIHJldHVybiBzdHJjcHkocyxDUlRETExfdG1wbmFtZS5zaG9ydF9uYW1lKTsKQEAgLTE2OTIsNyArMTcxNCw3IEBACiAgKi8KIFZPSUQgX19jZGVjbCBDUlRETExfc2lnbmFsKGludCBzaWcsIHNpZ19oYW5kbGVyX3R5cGUgcHRyKQogewotICAgIGRwcmludGZfY3J0ZGxsKHN0ZGRlYiwiQ1JURExMX3NpZ25hbCAlZCAlcDogU1RVQiFcbiIsc2lnLHB0cik7CisgICAgZHByaW50Zl9maXhtZShjcnRkbGwsICJDUlRETExfc2lnbmFsICVkICVwOiBTVFVCIVxuIiwgc2lnLCBwdHIpOwogfQogCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCkBAIC0xNzA2LDYgKzE3MjgsNiBAQAogICovCiBWT0lEIF9fY2RlY2wgQ1JURExMX19zbGVlcCh1bnNpZ25lZCBsb25nIHRpbWVvdXQpIAogewotICBkcHJpbnRmX2NydGRsbChzdGRkZWIsIkNSVERMTF9fc2xlZXAgZm9yICVsZCBtaWxsaXNlY29uZHNcbiIsdGltZW91dCk7CisgIGRwcmludGZfaW5mbyhjcnRkbGwsIkNSVERMTF9fc2xlZXAgZm9yICVsZCBtaWxsaXNlY29uZHNcbiIsdGltZW91dCk7CiAgIFNsZWVwKCh0aW1lb3V0KT90aW1lb3V0OjEpOwogfQpkaWZmIC0tZ2l0IGEvbWlzYy9kZGVtbC5jIGIvbWlzYy9kZGVtbC5jCmluZGV4IGI0MzA0NzUuLjQzNjdjNTMgMTAwNjQ0Ci0tLSBhL21pc2MvZGRlbWwuYworKysgYi9taXNjL2RkZW1sLmMKQEAgLTksNyArOSw2IEBACiAKICNpbmNsdWRlIDxzdGRpby5oPgogI2luY2x1ZGUgImRkZW1sLmgiCi0jaW5jbHVkZSAic3RkZGVidWcuaCIKICNpbmNsdWRlICJkZWJ1Zy5oIgogCiAKZGlmZiAtLWdpdCBhL21pc2MvZGVidWdzdHIuYyBiL21pc2MvZGVidWdzdHIuYwppbmRleCAyZWY0NjQ5Li5lNzIwYTMzIDEwMDY0NAotLS0gYS9taXNjL2RlYnVnc3RyLmMKKysrIGIvbWlzYy9kZWJ1Z3N0ci5jCkBAIC0xLDYgKzEsNyBAQAogI2luY2x1ZGUgImRlYnVnc3RyLmgiCiAjaW5jbHVkZSAieG1hbGxvYy5oIgogI2luY2x1ZGUgPHN0ZGxpYi5oPgorI2luY2x1ZGUgPHN0ZGlvLmg+CiAKIC8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KIApAQCAtMTI1LDMgKzEyNiwxOCBAQAogfQogCiAvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisvKiBUaGlzIHJvdXRpbmUgcmV0dXJucyBhIG5pY2VseSBmb3JtYXRlZCBuYW1lIG9mIHRoZSByZXNvdXJjZSByZXMKKyAgIElmIHRoZSByZXNvdXJjZSBuYW1lIGlzIGEgc3RyaW5nLCBpdCB3aWxsIHJldHVybiAnPHJlcy1uYW1lPicKKyAgIElmIGl0IGlzIGEgbnVtYmVyLCBpdCB3aWxsIHJldHVybiAjPDQtZGlnaXQtaGV4LW51bWJlcj4gKi8KK0xQU1RSCitkZWJ1Z3JlcyAoY29uc3Qgdm9pZCAqcmVzKQoreworICBpZiAoSElXT1JEKChEV09SRClyZXMpKQorICAgIHJldHVybiBkZWJ1Z3N0cl9hKChMUENTVFIpcmVzKTsKKyAgZWxzZXsKKyAgICBjaGFyIHJlc25hbWVbMTBdOworICAgIHNwcmludGYocmVzbmFtZSwgIiMlMDR4IiwgTE9XT1JEKHJlcykpOworICAgIHJldHVybiBkZWJ1Z3N0cl9hIChyZXNuYW1lKTsKKyAgfQorfQorCmRpZmYgLS1naXQgYS9taXNjL2Vycm9yLmMgYi9taXNjL2Vycm9yLmMKaW5kZXggZmMyZTEyNC4uM2EzNjIzNyAxMDA2NDQKLS0tIGEvbWlzYy9lcnJvci5jCisrKyBiL21pc2MvZXJyb3IuYwpAQCAtOSwxNCArOSwxMSBAQAogI2luY2x1ZGUgPHN0cmluZy5oPgogCiAjaW5jbHVkZSAid2luZG93cy5oIgotI2luY2x1ZGUgInN0ZGRlYnVnLmgiCiAjaW5jbHVkZSAiZGVidWcuaCIKIAotI2lmZGVmIERFQlVHX1JVTlRJTUUKLQogI2RlZmluZSBFcnJvclN0cmluZyhtYW5pZmVzdCkgeyBtYW5pZmVzdCwgIyBtYW5pZmVzdCB9CiAKLWNvbnN0IHN0cnVjdCB7CitzdGF0aWMgY29uc3Qgc3RydWN0IHsKIAlpbnQgY29uc3RhbnQ7CiAJY29uc3QgY2hhciAqbmFtZTsKIH0gRXJyb3JTdHJpbmdzW10gPSB7CkBAIC00Nyw5ICs0NCw3IEBACiAJRXJyb3JTdHJpbmcoRVJSX1NFTEJJVE1BUCkKIH07CiAKLSNkZWZpbmUgRXJyb3JTdHJpbmdDb3VudCAoc2l6ZW9mKEVycm9yU3RyaW5ncykgLyBzaXplb2YoRXJyb3JTdHJpbmdzWzBdKSkKLQotY29uc3Qgc3RydWN0IHsKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgewogCWludCBjb25zdGFudDsKIAljb25zdCBjaGFyICpuYW1lOwogfSBQYXJhbUVycm9yU3RyaW5nc1tdID0gewpAQCAtOTAsMjcgKzg1LDI1IEBACiAJRXJyb3JTdHJpbmcoRVJSX0JBRF9ITUVUQUZJTEUpCiB9OwogCisjdW5kZWYgIEVycm9yU3RyaW5nCisjZGVmaW5lIEVycm9yU3RyaW5nQ291bnQgKHNpemVvZihFcnJvclN0cmluZ3MpIC8gc2l6ZW9mKEVycm9yU3RyaW5nc1swXSkpCiAjZGVmaW5lIFBhcmFtRXJyb3JTdHJpbmdDb3VudCAoc2l6ZW9mKFBhcmFtRXJyb3JTdHJpbmdzKSAvIHNpemVvZihQYXJhbUVycm9yU3RyaW5nc1swXSkpCiAKLSNlbmRpZiAvKiBERUJVR19SVU5USU1FICovCi0KIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKglHZXRFcnJvclN0cmluZyAoaW50ZXJuYWwpCiAqLwotc3RhdGljIGNvbnN0IGNoYXIgKkdldEVycm9yU3RyaW5nKFVJTlQxNiB1RXJyKSB7Ci0Jc3RhdGljIGNoYXIgYnVmZmVyWzgwXTsKK3N0YXRpYyBjb25zdCBjaGFyICpHZXRFcnJvclN0cmluZyhVSU5UMTYgdUVycikgCit7CisgIHN0YXRpYyBjaGFyIGJ1ZmZlcls4MF07CisgIGludCBpOwogCi0jaWZkZWYgREVCVUdfUlVOVElNRQotCWludCBpOworICBmb3IgKGkgPSAwOyBpIDwgRXJyb3JTdHJpbmdDb3VudDsgaSsrKSB7CisgICAgaWYgKHVFcnIgPT0gRXJyb3JTdHJpbmdzW2ldLmNvbnN0YW50KQorICAgICAgcmV0dXJuIEVycm9yU3RyaW5nc1tpXS5uYW1lOworICB9CiAKLQlmb3IgKGkgPSAwOyBpIDwgRXJyb3JTdHJpbmdDb3VudDsgaSsrKSB7Ci0JCWlmICh1RXJyID09IEVycm9yU3RyaW5nc1tpXS5jb25zdGFudCkKLQkJCXJldHVybiBFcnJvclN0cmluZ3NbaV0ubmFtZTsKLQl9Ci0jZW5kaWYKLQotCXNwcmludGYoYnVmZmVyLCAiJXgiLCB1RXJyKTsKLQlyZXR1cm4gYnVmZmVyOworICBzcHJpbnRmKGJ1ZmZlciwgIiV4IiwgdUVycik7CisgIHJldHVybiBidWZmZXI7CiB9CiAKIApAQCAtMTI2LDcgKzExOSw2IEBACiAJfSBlbHNlCiAJCWJ1ZmZlclswXSA9ICdcMCc7CiAKLSNpZmRlZiBERUJVR19SVU5USU1FCiAJewogCQlpbnQgaTsKIApAQCAtMTM3LDcgKzEyOSw2IEBACiAJCQl9CiAJCX0KIAl9Ci0jZW5kaWYKIAogCXNwcmludGYoYnVmZmVyICsgc3RybGVuKGJ1ZmZlciksICIleCIsIHVFcnIpOwogCXJldHVybiBidWZmZXI7CmRpZmYgLS1naXQgYS9taXNjL2xzdHIuYyBiL21pc2MvbHN0ci5jCmluZGV4IDFlNTQ1MjcuLjI1MmQwODEgMTAwNjQ0Ci0tLSBhL21pc2MvbHN0ci5jCisrKyBiL21pc2MvbHN0ci5jCkBAIC0zMSw3ICszMSw2IEBACiAjaW5jbHVkZSAibGR0LmgiCiAjaW5jbHVkZSAic3RhY2tmcmFtZS5oIgogI2luY2x1ZGUgIm1vZHVsZS5oIgotI2luY2x1ZGUgInN0ZGRlYnVnLmgiCiAjaW5jbHVkZSAiZGVidWcuaCIKIAogLyogRnVubnkgdG8gZGl2aWRlIHRoZW0gYmV0d2VlbiB1c2VyIGFuZCBrZXJuZWwuICovCkBAIC01MTgsNyArNTE3LDcgQEAKIAlEV09SRAl3aWR0aCA9IGR3RmxhZ3MgJiBGT1JNQVRfTUVTU0FHRV9NQVhfV0lEVEhfTUFTSzsKIAlEV09SRAlub2xpbmVmZWVkID0gMDsKIAotCWRwcmludGZfcmVzb3VyY2Uoc3RkZGViLAorCWRwcmludGZfaW5mbyhyZXNvdXJjZSwKIAkJIkZvcm1hdE1lc3NhZ2UzMkEoMHglbHgsJXAsJWxkLDB4JWx4LCVwLCVsZCwlcClcbiIsCiAJCWR3RmxhZ3MsbHBTb3VyY2UsZHdNZXNzYWdlSWQsZHdMYW5ndWFnZUlkLGxwQnVmZmVyLG5TaXplLGFyZ3MKIAkpOwpAQCAtNTM1LDEwICs1MzQsMTAgQEAKIAkJSU5UMzIJYnVmc2l6ZTsKIAogCQlkd01lc3NhZ2VJZCAmPSAweEZGRkY7Ci0JCWJ1ZnNpemU9TG9hZE1lc3NhZ2UzMkEoMCxkd01lc3NhZ2VJZCxkd0xhbmd1YWdlSWQsTlVMTCwxMDApOworCQlidWZzaXplPUxvYWRNZXNzYWdlMzJBKChITU9EVUxFMzIpbHBTb3VyY2UsZHdNZXNzYWdlSWQsZHdMYW5ndWFnZUlkLE5VTEwsMTAwKTsKIAkJaWYgKGJ1ZnNpemUpIHsKIAkJCWZyb20gPSBIZWFwQWxsb2MoIEdldFByb2Nlc3NIZWFwKCksIDAsIGJ1ZnNpemUgKyAxICk7Ci0JCQlMb2FkTWVzc2FnZTMyQSgwLGR3TWVzc2FnZUlkLGR3TGFuZ3VhZ2VJZCxmcm9tLGJ1ZnNpemUrMSk7CisJCQlMb2FkTWVzc2FnZTMyQSgoSE1PRFVMRTMyKWxwU291cmNlLGR3TWVzc2FnZUlkLGR3TGFuZ3VhZ2VJZCxmcm9tLGJ1ZnNpemUrMSk7CiAJCX0KIAl9CiAJdGFyZ2V0CT0gSGVhcEFsbG9jKCBHZXRQcm9jZXNzSGVhcCgpLCBIRUFQX1pFUk9fTUVNT1JZLCAxMDApOwpAQCAtNjg0LDcgKzY4Myw3IEBACiAJRFdPUkQJd2lkdGggPSBkd0ZsYWdzICYgRk9STUFUX01FU1NBR0VfTUFYX1dJRFRIX01BU0s7CiAJRFdPUkQJbm9saW5lZmVlZCA9IDA7CiAKLQlkcHJpbnRmX3Jlc291cmNlKHN0ZGRlYiwKKwlkcHJpbnRmX2luZm8ocmVzb3VyY2UsCiAJCSJGb3JtYXRNZXNzYWdlMzJBKDB4JWx4LCVwLCVsZCwweCVseCwlcCwlbGQsJXApXG4iLAogCQlkd0ZsYWdzLGxwU291cmNlLGR3TWVzc2FnZUlkLGR3TGFuZ3VhZ2VJZCxscEJ1ZmZlcixuU2l6ZSxhcmdzCiAJKTsKQEAgLTcwMiwxMSArNzAxLDExIEBACiAJCUlOVDMyCWJ1ZnNpemU7CiAKIAkJZHdNZXNzYWdlSWQgJj0gMHhGRkZGOwotCQlidWZzaXplPUxvYWRNZXNzYWdlMzJBKDAsZHdNZXNzYWdlSWQsZHdMYW5ndWFnZUlkLE5VTEwsMTAwKTsKKwkJYnVmc2l6ZT1Mb2FkTWVzc2FnZTMyQSgoSE1PRFVMRTMyKWxwU291cmNlLGR3TWVzc2FnZUlkLGR3TGFuZ3VhZ2VJZCxOVUxMLDEwMCk7CiAJCWlmIChidWZzaXplKQogICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgZnJvbSA9IEhlYXBBbGxvYyggR2V0UHJvY2Vzc0hlYXAoKSwgMCwgYnVmc2l6ZSArIDEgKTsKLSAgICAgICAgICAgICAgICAgICAgTG9hZE1lc3NhZ2UzMkEoMCxkd01lc3NhZ2VJZCxkd0xhbmd1YWdlSWQsZnJvbSxidWZzaXplKzEpOworICAgICAgICAgICAgICAgICAgICBMb2FkTWVzc2FnZTMyQSgoSE1PRFVMRTMyKWxwU291cmNlLGR3TWVzc2FnZUlkLGR3TGFuZ3VhZ2VJZCxmcm9tLGJ1ZnNpemUrMSk7CiAJCX0KIAl9CiAJdGFyZ2V0CT0gSGVhcEFsbG9jKCBHZXRQcm9jZXNzSGVhcCgpLCBIRUFQX1pFUk9fTUVNT1JZLCAxMDAgKTsKZGlmZiAtLWdpdCBhL21pc2MvbHpleHBhbmQuYyBiL21pc2MvbHpleHBhbmQuYwppbmRleCA5MGMyMzIzLi5mOWRlZmViIDEwMDY0NAotLS0gYS9taXNjL2x6ZXhwYW5kLmMKKysrIGIvbWlzYy9semV4cGFuZC5jCkBAIC0xOSw3ICsxOSw2IEBACiAjaW5jbHVkZSAiaGVhcC5oIgogI2luY2x1ZGUgImxkdC5oIgogI2luY2x1ZGUgImx6ZXhwYW5kLmgiCi0jaW5jbHVkZSAic3RkZGVidWcuaCIKICNpbmNsdWRlICJkZWJ1Zy5oIgogCiAKQEAgLTExOSw3ICsxMTgsNyBAQAogICovCiBJTlQxNiBXSU5BUEkgTFpTdGFydDE2KHZvaWQpCiB7Ci0gICAgZHByaW50Zl9maWxlKHN0ZGRlYiwiTFpTdGFydDE2KHZvaWQpXG4iKTsKKyAgICBkcHJpbnRmX2luZm8oZmlsZSwiTFpTdGFydDE2KHZvaWQpXG4iKTsKICAgICByZXR1cm4gMTsKIH0KIApAQCAtMTI5LDcgKzEyOCw3IEBACiAgKi8KIElOVDMyIFdJTkFQSSBMWlN0YXJ0MzIodm9pZCkKIHsKLSAgICBkcHJpbnRmX2ZpbGUoc3RkZGViLCJMWlN0YXJ0MzIodm9pZClcbiIpOworICAgIGRwcmludGZfaW5mbyhmaWxlLCJMWlN0YXJ0MzIodm9pZClcbiIpOwogICAgIHJldHVybiAxOwogfQogCkBAIC0xNjIsNyArMTYxLDcgQEAKIAlzdHJ1Y3QJbHpzdGF0ZQkJKmx6czsKIAlEV09SRAlyZXQ7CiAKLQlkcHJpbnRmX2ZpbGUoc3RkZGViLCJMWkluaXQoJWQpXG4iLGhmU3JjKTsKKwlkcHJpbnRmX2luZm8oZmlsZSwiTFpJbml0KCVkKVxuIixoZlNyYyk7CiAJcmV0PXJlYWRfaGVhZGVyKGhmU3JjLCZoZWFkKTsKIAlpZiAocmV0PD0wKSB7CiAJCV9sbHNlZWszMihoZlNyYywwLFNFRUtfU0VUKTsKQEAgLTE5NSw3ICsxOTQsNyBAQAogICovCiB2b2lkIFdJTkFQSSBMWkRvbmUodm9pZCkKIHsKLSAgICBkcHJpbnRmX2ZpbGUoc3RkZGViLCJMWkRvbmUoKVxuIik7CisgICAgZHByaW50Zl9pbmZvKGZpbGUsIkxaRG9uZSgpXG4iKTsKIH0KIAogCkBAIC0yMjcsNyArMjI2LDcgQEAKIAlJTlQzMgkJZm5pc2xvd2VyY2FzZWQscmV0LGxlbjsKIAlMUFNUUgkJcyx0OwogCi0JZHByaW50Zl9maWxlKHN0ZGRlYiwiR2V0RXhwYW5kZWROYW1lKCVzKVxuIixpbik7CisJZHByaW50Zl9pbmZvKGZpbGUsIkdldEV4cGFuZGVkTmFtZSglcylcbiIsaW4pOwogCWZkPU9wZW5GaWxlMzIoaW4sJm9mcyxPRl9SRUFEKTsKIAlpZiAoZmQ9PUhGSUxFX0VSUk9SMzIpCiAJCXJldHVybiAoSU5UMzIpKElOVDE2KUxaRVJST1JfQkFESU5IQU5ETEU7CkBAIC0zMjMsNyArMzIyLDcgQEAKIAlzdHJ1Y3QJbHpzdGF0ZQkqbHpzOwogCiAJYnVmPShMUEJZVEUpdmJ1ZjsKLQlkcHJpbnRmX2ZpbGUoc3RkZGViLCJMWlJlYWQzMiglZCwlcCwlZClcbiIsZmQsYnVmLHRvcmVhZCk7CisJZHByaW50Zl9pbmZvKGZpbGUsIkxaUmVhZDMyKCVkLCVwLCVkKVxuIixmZCxidWYsdG9yZWFkKTsKIAlob3dtdWNoPXRvcmVhZDsKIAlmb3IgKGk9MDtpPG5yb2ZsenN0YXRlcztpKyspCiAJCWlmIChsenN0YXRlc1tpXS5semZkPT1mZCkKQEAgLTQyNyw3ICs0MjYsNyBAQAogCXN0cnVjdAlsenN0YXRlCSpsenM7CiAJTE9ORwluZXd3YW50ZWQ7CiAKLQlkcHJpbnRmX2ZpbGUoc3RkZGViLCJMWlNlZWsoJWQsJWxkLCVkKVxuIixmZCxvZmYsdHlwZSk7CisJZHByaW50Zl9pbmZvKGZpbGUsIkxaU2VlayglZCwlbGQsJWQpXG4iLGZkLG9mZix0eXBlKTsKIAlmb3IgKGk9MDtpPG5yb2ZsenN0YXRlcztpKyspCiAJCWlmIChsenN0YXRlc1tpXS5semZkPT1mZCkKIAkJCWJyZWFrOwpAQCAtNDgwLDcgKzQ3OSw3IEBACiAJQllURQlidWZbQlVGTEVOXTsKIAlJTlQzMglXSU5BUEkgKCp4cmVhZCkoSEZJTEUzMixMUFZPSUQsVUlOVDMyKTsKIAotCWRwcmludGZfZmlsZShzdGRkZWIsIkxaQ29weSglZCwlZClcbiIsc3JjLGRlc3QpOworCWRwcmludGZfaW5mbyhmaWxlLCJMWkNvcHkoJWQsJWQpXG4iLHNyYyxkZXN0KTsKIAlmb3IgKGk9MDtpPG5yb2ZsenN0YXRlcztpKyspCiAJCWlmIChzcmM9PWx6c3RhdGVzW2ldLmx6ZmQpCiAJCQlicmVhazsKQEAgLTU0Niw3ICs1NDUsNyBAQAogewogCUhGSUxFMzIJZmQsY2ZkOwogCi0JZHByaW50Zl9maWxlKHN0ZGRlYiwiTFpPcGVuRmlsZSglcywlcCwlZClcbiIsZm4sb2ZzLG1vZGUpOworCWRwcmludGZfaW5mbyhmaWxlLCJMWk9wZW5GaWxlKCVzLCVwLCVkKVxuIixmbixvZnMsbW9kZSk7CiAJLyogMHg3MCByZXByZXNlbnRzIGFsbCBPRl9TSEFSRV8qIGZsYWdzLCBpZ25vcmUgdGhlbSBmb3IgdGhlIGNoZWNrICovCiAJZmQ9T3BlbkZpbGUzMihmbixvZnMsbW9kZSk7CiAJaWYgKGZkPT1IRklMRV9FUlJPUjMyKQpAQCAtNjA0LDcgKzYwMyw3IEBACiB7CiAJaW50CWk7CiAKLQlkcHJpbnRmX2ZpbGUoc3RkZGViLCJMWkNsb3NlKCVkKVxuIixmZCk7CisJZHByaW50Zl9pbmZvKGZpbGUsIkxaQ2xvc2UoJWQpXG4iLGZkKTsKIAlmb3IgKGk9MDtpPG5yb2ZsenN0YXRlcztpKyspCiAJCWlmIChsenN0YXRlc1tpXS5semZkPT1mZCkKIAkJCWJyZWFrOwpAQCAtNjI3LDcgKzYyNiw3IEBACiAgKi8KIExPTkcgV0lOQVBJIENvcHlMWkZpbGUxNiggSEZJTEUxNiBzcmMsIEhGSUxFMTYgZGVzdCApCiB7Ci0gICAgZHByaW50Zl9maWxlKHN0ZGRlYiwiQ29weUxaRmlsZTE2KCVkLCVkKVxuIixzcmMsZGVzdCk7CisgICAgZHByaW50Zl9pbmZvKGZpbGUsIkNvcHlMWkZpbGUxNiglZCwlZClcbiIsc3JjLGRlc3QpOwogICAgIHJldHVybiBMWkNvcHkzMihzcmMsZGVzdCk7CiB9CiAKQEAgLTY0MCw2ICs2MzksNiBAQAogICovCiBMT05HIFdJTkFQSSBDb3B5TFpGaWxlMzIoIEhGSUxFMzIgc3JjLCBIRklMRTMyIGRlc3QgKQogewotICAgIGRwcmludGZfZmlsZShzdGRkZWIsIkNvcHlMWkZpbGUzMiglZCwlZClcbiIsc3JjLGRlc3QpOworICAgIGRwcmludGZfaW5mbyhmaWxlLCJDb3B5TFpGaWxlMzIoJWQsJWQpXG4iLHNyYyxkZXN0KTsKICAgICByZXR1cm4gTFpDb3B5MzIoc3JjLGRlc3QpOwogfQpkaWZmIC0tZ2l0IGEvbWlzYy9tYWluLmMgYi9taXNjL21haW4uYwppbmRleCAyY2E3OWM3Li4yZWNiNzIwIDEwMDY0NAotLS0gYS9taXNjL21haW4uYworKysgYi9taXNjL21haW4uYwpAQCAtMjksMTMgKzI5LDExIEBACiAjaW5jbHVkZSAicHJvY2Vzcy5oIgogI2luY2x1ZGUgInNoZWxsLmgiCiAjaW5jbHVkZSAid2luYmFzZS5oIgotI2RlZmluZSBERUJVR19ERUZJTkVfVkFSSUFCTEVTCi0jaW5jbHVkZSAic3RkZGVidWcuaCIKICNpbmNsdWRlICJkZWJ1Zy5oIgorI2luY2x1ZGUgImRlYnVnZGVmcy5oIgogI2luY2x1ZGUgInhtYWxsb2MuaCIKICNpbmNsdWRlICJ2ZXJzaW9uLmgiCiAKLQogY29uc3QgV0lORV9MQU5HVUFHRV9ERUYgTGFuZ3VhZ2VzW10gPQogewogICAgIHsiRW4iLDB4MDQwOX0sCS8qIExBTkdfRW4gKi8KQEAgLTQ2LDE0ICs0NCwxNCBAQAogICAgIHsiRmkiLDB4MDQwQn0sCS8qIExBTkdfRmkgKi8KICAgICB7IkRhIiwweDA0MDZ9LAkvKiBMQU5HX0RhICovCiAgICAgeyJDeiIsMHgwNDA1fSwJLyogTEFOR19DeiAqLwotICAgIHsiRW8iLCAgICAgMH0sCS8qIExBTkdfRW8gKi8gLyogRklYTUUgbGFuZ3VhZ2VpZCAqLworICAgIHsiRW8iLDB4MDQyNX0sCS8qIExBTkdfRW8gKi8KICAgICB7Ikl0IiwweDA0MTB9LAkvKiBMQU5HX0l0ICovCiAgICAgeyJLbyIsMHgwNDEyfSwJLyogTEFOR19LbyAqLwogICAgIHsiSHUiLDB4MDQzNn0sCS8qIExBTkdfSHUgKi8KLSAgICB7IlBsIiwweDA0MTV9LCAgICAgIC8qIExBTkdfUGwgKi8KLSAgICB7IlBvIiwweDA0MTZ9LCAgICAgIC8qIExBTkdfUG8gKi8KLSAgICB7IlN3IiwweDA0MTd9LCAgICAgIC8qIExBTkdfU3cgKi8KLSAgICB7IkNhIiwgICAgIDB9LCAgICAgIC8qIExBTkdfQ2EgKi8gLyogRklYTUUgbGFuZ3VhZ2VpZCAqLworICAgIHsiUGwiLDB4MDQxNX0sCS8qIExBTkdfUGwgKi8KKyAgICB7IlBvIiwweDA0MTZ9LAkvKiBMQU5HX1BvICovCisgICAgeyJTdyIsMHgwNDE3fSwJLyogTEFOR19TdyAqLworICAgIHsiQ2EiLDB4MDQyNn0sCS8qIExBTkdfQ2EgKi8KICAgICB7TlVMTCwwfQogfTsKIApAQCAtMjA2LDM3ICsyMDQsNTMgQEAKICAqICBUdXJucyBzcGVjaWZpYyBkZWJ1ZyBtZXNzYWdlcyBvbiBvciBvZmYsIGFjY29yZGluZyB0byAib3B0aW9ucyIuCiAgKiAgUmV0dXJucyBUUlVFIGlmIHBhcnNpbmcgd2FzIHN1Y2Nlc3NmdWwKICAqLwotI2lmZGVmIERFQlVHX1JVTlRJTUUKLQogQk9PTDMyIFBhcnNlRGVidWdPcHRpb25zKGNoYXIgKm9wdGlvbnMpCiB7Ci0gIGludCBsOworICBpbnQgbCwgY2xzOwogICBpZiAoc3RybGVuKG9wdGlvbnMpPDMpCiAgICAgcmV0dXJuIEZBTFNFOwogICBkbwogICB7Ci0gICAgaWYgKCgqb3B0aW9ucyE9JysnKSYmKCpvcHRpb25zIT0nLScpKQotICAgICAgcmV0dXJuIEZBTFNFOworICAgIGlmICgoKm9wdGlvbnMhPScrJykmJigqb3B0aW9ucyE9Jy0nKSl7CisgICAgICBpbnQgajsKKworICAgICAgZm9yKGo9MDsgajxERUJVR19DTEFTU19DT1VOVDsgaisrKQorCWlmKCFsc3RybmNtcGkzMkEob3B0aW9ucywgZGVidWdfY2xfbmFtZVtqXSwgc3RybGVuKGRlYnVnX2NsX25hbWVbal0pKSkKKwkgIGJyZWFrOworICAgICAgaWYoaj09REVCVUdfQ0xBU1NfQ09VTlQpCisJcmV0dXJuIEZBTFNFOworICAgICAgb3B0aW9ucyArPSBzdHJsZW4oZGVidWdfY2xfbmFtZVtqXSk7CisgICAgICBpZiAoKCpvcHRpb25zIT0nKycpJiYoKm9wdGlvbnMhPSctJykpCisJcmV0dXJuIEZBTFNFOworICAgICAgY2xzID0gajsKKyAgICB9CisgICAgZWxzZQorICAgICAgY2xzID0gLTE7IC8qIGFsbCBjbGFzc2VzICovCisKICAgICBpZiAoc3RyY2hyKG9wdGlvbnMsJywnKSkKICAgICAgIGw9c3RyY2hyKG9wdGlvbnMsJywnKS1vcHRpb25zOwogICAgIGVsc2UKICAgICAgIGw9c3RybGVuKG9wdGlvbnMpOworCiAgICAgaWYgKCFsc3RybmNtcGkzMkEob3B0aW9ucysxLCJhbGwiLGwtMSkpCiAgICAgICB7Ci0JaW50IGk7Ci0JZm9yIChpPTA7aTxzaXplb2YoZGVidWdfbXNnX2VuYWJsZWQpL3NpemVvZihzaG9ydCk7aSsrKQotCSAgZGVidWdfbXNnX2VuYWJsZWRbaV09KCpvcHRpb25zPT0nKycpOworCWludCBpLCBqOworCWZvciAoaT0wOyBpPERFQlVHX0NIQU5ORUxfQ09VTlQ7IGkrKykKKwkgIGZvcihqPTA7IGo8REVCVUdfQ0xBU1NfQ09VTlQ7IGorKykKKwkgICAgaWYoY2xzID09IC0xIHx8IGNscyA9PSBqKQorCSAgICAgIGRlYnVnX21zZ19lbmFibGVkW2ldW2pdPSgqb3B0aW9ucz09JysnKTsKICAgICAgIH0KICAgICBlbHNlCiAgICAgICB7Ci0JaW50IGk7Ci0JZm9yIChpPTA7aTxzaXplb2YoZGVidWdfbXNnX2VuYWJsZWQpL3NpemVvZihzaG9ydCk7aSsrKQotCSAgaWYgKGRlYnVnX21zZ19uYW1lICYmICghbHN0cm5jbXBpMzJBKG9wdGlvbnMrMSxkZWJ1Z19tc2dfbmFtZVtpXSxsLTEpKSkKLQkgICAgewotCSAgICAgIGRlYnVnX21zZ19lbmFibGVkW2ldPSgqb3B0aW9ucz09JysnKTsKLQkgICAgICBicmVhazsKLQkgICAgfQotCWlmIChpPT1zaXplb2YoZGVidWdfbXNnX2VuYWJsZWQpL3NpemVvZihzaG9ydCkpCisJaW50IGksIGo7CisJZm9yIChpPTA7IGk8REVCVUdfQ0hBTk5FTF9DT1VOVDsgaSsrKQorCSAgaWYgKGRlYnVnX2NoX25hbWUgJiYgKCFsc3RybmNtcGkzMkEob3B0aW9ucysxLGRlYnVnX2NoX25hbWVbaV0sbC0xKSkpeworCSAgICBmb3Ioaj0wOyBqPERFQlVHX0NMQVNTX0NPVU5UOyBqKyspCisJICAgICAgaWYoY2xzID09IC0xIHx8IGNscyA9PSBqKQorCQlkZWJ1Z19tc2dfZW5hYmxlZFtpXVtqXT0oKm9wdGlvbnM9PScrJyk7CisJICAgIGJyZWFrOworCSAgfQorCWlmIChpPT1ERUJVR19DSEFOTkVMX0NPVU5UKQogCSAgcmV0dXJuIEZBTFNFOwogICAgICAgfQogICAgIG9wdGlvbnMrPWw7CkBAIC0yNDgsOCArMjYyLDYgQEAKICAgICByZXR1cm4gVFJVRTsKIH0KIAotI2VuZGlmCi0KIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogICogICAgICAgICAgIE1BSU5fUGFyc2VMYW5ndWFnZU9wdGlvbgogICoKQEAgLTM3MCwyOSArMzgyLDM0IEBACiAgICAgICAgIE9wdGlvbnMubWFuYWdlZCA9IFRSVUU7CiAgICAgaWYgKE1BSU5fR2V0UmVzb3VyY2UoIGRiLCAiLm1vZGUiLCAmdmFsdWUpKQogICAgICAgICBNQUlOX1BhcnNlTW9kZU9wdGlvbiggKGNoYXIgKil2YWx1ZS5hZGRyICk7Ci0KLSNpZmRlZiBERUJVR19SVU5USU1FCiAgICAgaWYgKE1BSU5fR2V0UmVzb3VyY2UoIGRiLCAiLmRlYnVnb3B0aW9ucyIsICZ2YWx1ZSkpCiAJUGFyc2VEZWJ1Z09wdGlvbnMoKGNoYXIqKXZhbHVlLmFkZHIpOwotI2VuZGlmCiAgICAgaWYgKE1BSU5fR2V0UmVzb3VyY2UoIGRiLCAiLmRlYnVnbXNnIiwgJnZhbHVlKSkKICAgICAgIHsKICNpZm5kZWYgREVCVUdfUlVOVElNRQogCWZwcmludGYoc3RkZXJyLCIlczogT3B0aW9uIFwiLWRlYnVnbXNnXCIgbm90IGltcGxlbWVudGVkLlxuIiBcCi0gICAgICAgICAgIiAgICBSZWNvbXBpbGUgd2l0aCBERUJVR19SVU5USU1FIGluIGluY2x1ZGUvc3RkZGVidWcuaCBkZWZpbmVkLlxuIiwKKyAgICAgICAgICAiICAgIFJlY29tcGlsZSB3aXRoIERFQlVHX1JVTlRJTUUgaW4gaW5jbHVkZS9kZWJ1Z3Rvb2xzLmggZGVmaW5lZC5cbiIsCiAJICBhcmd2WzBdKTsKIAlleGl0KDEpOwogI2Vsc2UKIAlpZiAoUGFyc2VEZWJ1Z09wdGlvbnMoKGNoYXIqKXZhbHVlLmFkZHIpPT1GQUxTRSkKIAkgIHsKIAkgICAgaW50IGk7Ci0JICAgIGZwcmludGYoc3RkZXJyLCIlczogU3ludGF4OiAtZGVidWdtc2cgK3h4eCwuLi4gIG9yIC1kZWJ1Z21zZyAteHh4LC4uLlxuIixhcmd2WzBdKTsKLQkgICAgZnByaW50ZihzdGRlcnIsIkV4YW1wbGU6IC1kZWJ1Z21zZyArYWxsLC1oZWFwICAgIHR1cm4gb24gYWxsIG1lc3NhZ2VzIGV4Y2VwdCBoZWFwIG1lc3NhZ2VzXG4iKTsKKwkgICAgZnByaW50ZihzdGRlcnIsIiVzOiBTeW50YXg6IC1kZWJ1Z21zZyBbY2xhc3NdK3h4eCwuLi4gIG9yICIKKwkJICAgICItZGVidWdtc2cgW2NsYXNzXS14eHgsLi4uXG4iLGFyZ3ZbMF0pOworCSAgICBmcHJpbnRmKHN0ZGVyciwiRXhhbXBsZTogLWRlYnVnbXNnICthbGwsd2Fybi1oZWFwIgorCQkgICAgInR1cm4gb24gYWxsIG1lc3NhZ2VzIGV4Y2VwdCB3YXJuaW5nIGhlYXAgbWVzc2FnZXNcbiIpOworCisJICAgIGZwcmludGYoc3RkZXJyLCJBdmFpbGFibGUgbWVzc2FnZSBjbGFzc2VzOlxuIik7CisJICAgIGZvcihpPTA7aTxERUJVR19DTEFTU19DT1VOVDtpKyspCisJICAgICAgZnByaW50ZihzdGRlcnIsICIlLTlzIiwgZGVidWdfY2xfbmFtZVtpXSk7CisJICAgIGZwcmludGYoc3RkZXJyLCJcblxuIik7CisKIAkgICAgZnByaW50ZihzdGRlcnIsIkF2YWlsYWJsZSBtZXNzYWdlIHR5cGVzOlxuIik7CiAJICAgIGZwcmludGYoc3RkZXJyLCIlLTlzICIsImFsbCIpOwotCSAgICBmb3IoaT0wO2k8c2l6ZW9mKGRlYnVnX21zZ19lbmFibGVkKS9zaXplb2Yoc2hvcnQpO2krKykKLQkgICAgICBpZihkZWJ1Z19tc2dfbmFtZVtpXSkKLQkJZnByaW50ZihzdGRlcnIsIiUtOXMlYyIsZGVidWdfbXNnX25hbWVbaV0sCisJICAgIGZvcihpPTA7aTxERUJVR19DSEFOTkVMX0NPVU5UO2krKykKKwkgICAgICBpZihkZWJ1Z19jaF9uYW1lW2ldKQorCQlmcHJpbnRmKHN0ZGVyciwiJS05cyVjIixkZWJ1Z19jaF9uYW1lW2ldLAogCQkJKCgoaSsyKSU4PT0wKT8nXG4nOicgJykpOwogCSAgICBmcHJpbnRmKHN0ZGVyciwiXG5cbiIpOwogCSAgICBleGl0KDEpOwpkaWZmIC0tZ2l0IGEvbWlzYy9tcHIuYyBiL21pc2MvbXByLmMKaW5kZXggMzY3OWFmZi4uMzY5MWU2MSAxMDA2NDQKLS0tIGEvbWlzYy9tcHIuYworKysgYi9taXNjL21wci5jCkBAIC01LDcgKzUsNiBAQAogCiAjaW5jbHVkZSA8c3RkaW8uaD4KICNpbmNsdWRlICJ3aW4uaCIKLSNpbmNsdWRlICJzdGRkZWJ1Zy5oIgogI2luY2x1ZGUgImRlYnVnLmgiCiAKIERXT1JEIFdJTkFQSSBXTmV0R2V0Q2FjaGVkUGFzc3dvcmQoCmRpZmYgLS1naXQgYS9taXNjL250ZGxsLmMgYi9taXNjL250ZGxsLmMKaW5kZXggOTMzYWUxNC4uZjQ4ZjM3MCAxMDA2NDQKLS0tIGEvbWlzYy9udGRsbC5jCisrKyBiL21pc2MvbnRkbGwuYwpAQCAtMTQsNyArMTQsNiBAQAogI2luY2x1ZGUgIndpbmRvd3MuaCIKICNpbmNsdWRlICJudGRsbC5oIgogI2luY2x1ZGUgImhlYXAuaCIKLSNpbmNsdWRlICJzdGRkZWJ1Zy5oIgogI2luY2x1ZGUgImRlYnVnLmgiCiAjaW5jbHVkZSAibW9kdWxlLmgiCiAjaW5jbHVkZSAiaGVhcC5oIgpkaWZmIC0tZ2l0IGEvbWlzYy9yZWdpc3RyeS5jIGIvbWlzYy9yZWdpc3RyeS5jCmluZGV4IDEzNDNmYjQuLjNlNDc4NTEgMTAwNjQ0Ci0tLSBhL21pc2MvcmVnaXN0cnkuYworKysgYi9taXNjL3JlZ2lzdHJ5LmMKQEAgLTI1LDcgKzI1LDYgQEAKICNpbmNsdWRlICJ3aW5lcnJvci5oIgogI2luY2x1ZGUgImZpbGUuaCIKICNpbmNsdWRlICJoZWFwLmgiCi0jaW5jbHVkZSAic3RkZGVidWcuaCIKICNpbmNsdWRlICJkZWJ1Zy5oIgogI2luY2x1ZGUgInhtYWxsb2MuaCIKICNpbmNsdWRlICJ3aW5yZWcuaCIKQEAgLTExOCwxMCArMTE3LDEwIEBACiAKIAlmb3IgKGk9MDtpPG5yb2ZvcGVuaGFuZGxlcztpKyspIHsKIAkJaWYgKG9wZW5oYW5kbGVzW2ldLmxwa2V5PT1scGtleSkgewotCQkJZHByaW50Zl9yZWcoc3RkZGViLCJhZGRfaGFuZGxlOlRyaWVkIHRvIGFkZCAlcCB0d2ljZSFcbiIsbHBrZXkpOworCQkJZHByaW50Zl93YXJuKHJlZywgImFkZF9oYW5kbGU6VHJpZWQgdG8gYWRkICVwIHR3aWNlIVxuIixscGtleSk7CiAJCX0KIAkJaWYgKG9wZW5oYW5kbGVzW2ldLmhrZXk9PWhrZXkpIHsKLQkJCWRwcmludGZfcmVnKHN0ZGRlYiwiYWRkX2hhbmRsZTpUcmllZCB0byBhZGQgJWx4IHR3aWNlIVxuIiwoTE9ORyloa2V5KTsKKwkJCWRwcmludGZfd2FybihyZWcsICJhZGRfaGFuZGxlOlRyaWVkIHRvIGFkZCAlbHggdHdpY2UhXG4iLChMT05HKWhrZXkpOwogCQl9CiAJfQogCW9wZW5oYW5kbGVzPXhyZWFsbG9jKAlvcGVuaGFuZGxlcywKQEAgLTE0MCw3ICsxMzksNyBAQAogCWZvciAoaT0wO2k8bnJvZm9wZW5oYW5kbGVzO2krKykKIAkJaWYgKG9wZW5oYW5kbGVzW2ldLmhrZXk9PWhrZXkpCiAJCQlyZXR1cm4gb3BlbmhhbmRsZXNbaV0ubHBrZXk7Ci0JZHByaW50Zl9yZWcoc3RkZGViLCJnZXRfaGFuZGxlOkRpZG4ndCBmaW5kIGhhbmRsZSAlbHg/XG4iLChMT05HKWhrZXkpOworCWRwcmludGZfd2FybihyZWcsICJnZXRfaGFuZGxlOkRpZG4ndCBmaW5kIGhhbmRsZSAlbHg/XG4iLChMT05HKWhrZXkpOwogCXJldHVybiBOVUxMOwogfQogCkBAIC0xNTIsNyArMTUxLDcgQEAKIAkJaWYgKG9wZW5oYW5kbGVzW2ldLmhrZXk9PWhrZXkpCiAJCQlicmVhazsKIAlpZiAoaT09bnJvZm9wZW5oYW5kbGVzKSB7Ci0JCWRwcmludGZfcmVnKHN0ZGRlYiwicmVtb3ZlX2hhbmRsZTpEaWRuJ3QgZmluZCBoYW5kbGUgJTA4eD9cbiIsaGtleSk7CisJCWRwcmludGZfd2FybihyZWcsICJyZW1vdmVfaGFuZGxlOkRpZG4ndCBmaW5kIGhhbmRsZSAlMDh4P1xuIixoa2V5KTsKIAkJcmV0dXJuOwogCX0KIAltZW1jcHkoCW9wZW5oYW5kbGVzK2ksCkBAIC0yMDAsNyArMTk5LDcgQEAKIAljYXNlIEhLRVlfQ1VSUkVOVF9DT05GSUc6CiAJCXJldHVybiBrZXlfY3VycmVudF9jb25maWc7CiAJZGVmYXVsdDoKLQkJZHByaW50Zl9yZWcoc3RkZGViLCJsb29rdXBfaGtleSglbHgpLCBzcGVjaWFsIGtleSFcbiIsCisJCWRwcmludGZfd2FybihyZWcsICJsb29rdXBfaGtleSglbHgpLCBzcGVjaWFsIGtleSFcbiIsCiAJCQkoTE9ORyloa2V5CiAJCSk7CiAJCXJldHVybiBnZXRfaGFuZGxlKGhrZXkpOwpAQCAtMjg5LDQyICsyODgsMTIgQEAKIAogdm9pZAogU0hFTExfU3RhcnR1cFJlZ2lzdHJ5KCkgewotCUhLRVkJaGtleSx4aGtleT0wOwotCUZJTEUJKkY7Ci0JY2hhcglidWZbMjAwXSxjcHVidWZbMjAwXTsKKwlIS0VZCWhrZXk7CisJY2hhcglidWZbMjAwXTsKIAotCVJlZ0NyZWF0ZUtleTE2KEhLRVlfRFlOX0RBVEEsIlxcUGVyZlN0YXRzXFxTdGF0RGF0YSIsJnhoa2V5KTsKLQlSZWdDbG9zZUtleSh4aGtleSk7Ci0gICAgICAgIHhoa2V5ID0gMDsKLQlSZWdDcmVhdGVLZXkxNihIS0VZX0xPQ0FMX01BQ0hJTkUsIlxcSEFSRFdBUkVcXERFU0NSSVBUSU9OXFxTeXN0ZW1cXENlbnRyYWxQcm9jZXNzb3IiLCZoa2V5KTsKLSNpZmRlZiBsaW51eAotCUY9Zm9wZW4oIi9wcm9jL2NwdWluZm8iLCJyIik7Ci0JaWYgKEYpIHsKLQkJaW50CXByb2Nucj0tMSx4OwotCQl3aGlsZSAoTlVMTCE9ZmdldHMoYnVmLDIwMCxGKSkgewotCQkJaWYgKHNzY2FuZihidWYsInByb2Nlc3Nvclx0OiAlZCIsJngpKSB7Ci0JCQkJc3ByaW50ZihidWYsIiVkIix4KTsKLQkJCQlpZiAoeGhrZXkpCi0JCQkJCVJlZ0Nsb3NlS2V5KHhoa2V5KTsKLQkJCQlwcm9jbnI9eDsKLQkJCQlSZWdDcmVhdGVLZXkxNihoa2V5LGJ1ZiwmeGhrZXkpOwotCQkJfQotCQkJaWYgKHNzY2FuZihidWYsImNwdVx0XHQ6ICVzIixjcHVidWYpKSB7Ci0JCQkJc3ByaW50ZihidWYsIkNQVSAlcyIsY3B1YnVmKTsKLQkJCQlpZiAoeGhrZXkpCi0JCQkJCVJlZ1NldFZhbHVlRXgzMkEoeGhrZXksIklkZW50aWZpZXIiLDAsUkVHX1NaLGJ1ZixzdHJsZW4oYnVmKSk7Ci0JCQl9Ci0JCX0KLQkJZmNsb3NlKEYpOwotCX0KLQlpZiAoeGhrZXkpCi0JCVJlZ0Nsb3NlS2V5KHhoa2V5KTsKKwlSZWdDcmVhdGVLZXkxNihIS0VZX0RZTl9EQVRBLCJcXFBlcmZTdGF0c1xcU3RhdERhdGEiLCZoa2V5KTsKIAlSZWdDbG9zZUtleShoa2V5KTsKLSNlbHNlCi0JLyogRklYTUUgKi8KLQlSZWdDcmVhdGVLZXkxNihoa2V5LCIwIiwmeGhrZXkpOwotCVJlZ1NldFZhbHVlRXgzMkEoeGhrZXksIklkZW50aWZpZXIiLDAsUkVHX1NaLCJDUFUgMzg2IixzdHJsZW4oIkNQVSAzODYiKSk7Ci0jZW5kaWYKKwogCVJlZ09wZW5LZXkxNihIS0VZX0xPQ0FMX01BQ0hJTkUsIlxcSEFSRFdBUkVcXERFU0NSSVBUSU9OXFxTeXN0ZW0iLCZoa2V5KTsKIAlSZWdTZXRWYWx1ZUV4MzJBKGhrZXksIklkZW50aWZpZXIiLDAsUkVHX1NaLCJTeXN0ZW1UeXBlIFdJTkUiLHN0cmxlbigiU3lzdGVtVHlwZSBXSU5FIikpOwogCVJlZ0Nsb3NlS2V5KGhrZXkpOwpAQCAtMzQyLDkgKzMxMSw5IEBACiAJICogCQkJCQkJU3lzU2VydmljZXMKIAkgKi8JCQkJCQkKIAlpZiAoLTEhPWdldGhvc3RuYW1lKGJ1ZiwyMDApKSB7Ci0JCVJlZ0NyZWF0ZUtleTE2KEhLRVlfTE9DQUxfTUFDSElORSwiU3lzdGVtXFxDdXJyZW50Q29udHJvbFNldFxcQ29udHJvbFxcQ29tcHV0ZXJOYW1lXFxDb21wdXRlck5hbWUiLCZ4aGtleSk7Ci0JCVJlZ1NldFZhbHVlRXgxNih4aGtleSwiQ29tcHV0ZXJOYW1lIiwwLFJFR19TWixidWYsc3RybGVuKGJ1ZikrMSk7Ci0JCVJlZ0Nsb3NlS2V5KHhoa2V5KTsKKwkJUmVnQ3JlYXRlS2V5MTYoSEtFWV9MT0NBTF9NQUNISU5FLCJTeXN0ZW1cXEN1cnJlbnRDb250cm9sU2V0XFxDb250cm9sXFxDb21wdXRlck5hbWVcXENvbXB1dGVyTmFtZSIsJmhrZXkpOworCQlSZWdTZXRWYWx1ZUV4MTYoaGtleSwiQ29tcHV0ZXJOYW1lIiwwLFJFR19TWixidWYsc3RybGVuKGJ1ZikrMSk7CisJCVJlZ0Nsb3NlS2V5KGhrZXkpOwogCX0KIH0KIC8qKioqKioqKioqKioqKioqKioqKioqKiogU0FWRSBSZWdpc3RyeSBGdW5jdGlvbiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwpAQCAtNTYyLDYgKzUzMSwxMCBAQAogX2ZpbmRfb3JfYWRkX2tleShMUEtFWVNUUlVDVCBscGtleSxMUFdTVFIga2V5bmFtZSkgewogCUxQS0VZU1RSVUNUCWxweGtleSwqbHBscGtleTsKIAorCWlmIChrZXluYW1lWzBdPT0wKSB7CisJCWZyZWUoa2V5bmFtZSk7CisJCXJldHVybiBscGtleTsKKwl9CiAJbHBscGtleT0gJihscGtleS0+bmV4dHN1Yik7CiAJbHB4a2V5CT0gKmxwbHBrZXk7CiAJd2hpbGUgKGxweGtleSkgewpAQCAtODMzLDcgKzgwNiw3IEBACiAJCXJldHVybiAwOwogCX0KIAlpZiAodmVyIT1SRUdJU1RSWV9TQVZFX1ZFUlNJT04pIHsKLQkJZHByaW50Zl9yZWcoc3RkZGViLF9fRklMRV9fIjpfd2luZV9sb2Fkc3VicmVnOk9sZCBmb3JtYXQgKCVkKSByZWdpc3RyeSBmb3VuZCwgaWdub3JpbmcgaXQuIChidWYgd2FzICVzKS5cbiIsdmVyLGJ1Zik7CisJCWRwcmludGZfaW5mbyhyZWcsX19GSUxFX18iOl93aW5lX2xvYWRzdWJyZWc6T2xkIGZvcm1hdCAoJWQpIHJlZ2lzdHJ5IGZvdW5kLCBpZ25vcmluZyBpdC4gKGJ1ZiB3YXMgJXMpLlxuIix2ZXIsYnVmKTsKIAkJZnJlZShidWYpOwogCQlyZXR1cm4gMDsKIAl9CkBAIC04NTUsOCArODI4LDggQEAKIAogCUY9Zm9wZW4oZm4sInJiIik7CiAJaWYgKEY9PU5VTEwpIHsKLQkJZHByaW50Zl9yZWcoc3RkZGViLF9fRklMRV9fIjpDb3VsZG4ndCBvcGVuICVzIGZvciByZWFkaW5nOiAlc1xuIiwKLQkJCWZuLHN0cmVycm9yKGVycm5vKQorCQlkcHJpbnRmX3dhcm4ocmVnLCJDb3VsZG4ndCBvcGVuICVzIGZvciByZWFkaW5nOiAlc1xuIiwKKwkJICAgICAgIGZuLHN0cmVycm9yKGVycm5vKQogCQkpOwogCQlyZXR1cm47CiAJfQpAQCAtODg1LDcgKzg1OCw3IEBACiAJCQl2YWxmcm9tID0gZnJvbS0+dmFsdWVzK2o7CiAJCQluYW1lPXZhbGZyb20tPm5hbWU7CiAJCQlpZiAobmFtZSkgbmFtZT1zdHJkdXBXKG5hbWUpOwotCQkJZGF0YT0oTFBCWVRFKW1hbGxvYyh2YWxmcm9tLT5sZW4pOworCQkJZGF0YT0oTFBCWVRFKXhtYWxsb2ModmFsZnJvbS0+bGVuKTsKIAkJCW1lbWNweShkYXRhLHZhbGZyb20tPmRhdGEsdmFsZnJvbS0+bGVuKTsKIAogCQkJX2ZpbmRfb3JfYWRkX3ZhbHVlKApAQCAtMTAzMyw3ICsxMDA2LDcgQEAKIAogewogICAvKiBEaXNrIEtleSBIZWFkZXIgc3RydWN0dXJlIChSR0RCIHBhcnQpICovCi0gIHN0cnVjdAlka2ggeworCXN0cnVjdAlka2ggewogICAgICAgICAgICAgICAgIHVuc2lnbmVkIGxvbmcJCW5leHRrZXlvZmY7IAogCQl1bnNpZ25lZCBzaG9ydAkJbnJMUzsKIAkJdW5zaWduZWQgc2hvcnQJCW5yTVM7CkBAIC0xMDk4LDYgKzEwNzEsNyBAQAogCSAgcmV0dXJuIChOVUxMKTsKIAl9CiAKKyAgICAgICAgYXNzZXJ0KChka2gua2V5bmFtZWxlbjwyKSB8fCBjdXJkYXRhWzBdKTsKIAlscHhrZXk9X2ZpbmRfb3JfYWRkX2tleShscGtleSxzdHJjdnRBMlcoY3VyZGF0YSwgZGtoLmtleW5hbWVsZW4pKTsKIAljdXJkYXRhICs9IGRraC5rZXluYW1lbGVuOwogCkBAIC0xMTk0LDcgKzExNjgsNyBAQAogCU9GU1RSVUNUCW9mczsKIAlCWV9IQU5ETEVfRklMRV9JTkZPUk1BVElPTiBoZmRpbmZvOwogCi0JZHByaW50Zl9yZWcoc3RkZGViLCJMb2FkaW5nIFdpbjk1IHJlZ2lzdHJ5IGRhdGFiYXNlICclcydcbiIsZm4pOworCWRwcmludGZfaW5mbyhyZWcsIkxvYWRpbmcgV2luOTUgcmVnaXN0cnkgZGF0YWJhc2UgJyVzJ1xuIixmbik7CiAJaGZkPU9wZW5GaWxlMzIoZm4sJm9mcyxPRl9SRUFEKTsKIAlpZiAoaGZkPT1IRklMRV9FUlJPUjMyKQogCQlyZXR1cm47CkBAIC0xMjE0LDcgKzExODgsNyBAQAogCWlmICg0IT1fbHJlYWQzMihoZmQsbWFnaWMsNCkpCiAJCXJldHVybjsKIAlpZiAoc3RyY21wKG1hZ2ljLCJSR0tOIikpIHsKLQkJZHByaW50Zl9yZWcoc3RkZGViLCJzZWNvbmQgSUZGIGhlYWRlciBub3QgUkdLTiwgYnV0ICVzXG4iLG1hZ2ljKTsKKwkJZHByaW50Zl93YXJuKHJlZywgInNlY29uZCBJRkYgaGVhZGVyIG5vdCBSR0tOLCBidXQgJXNcbiIsIG1hZ2ljKTsKIAkJcmV0dXJuOwogCX0KIApAQCAtMTM3OSw3ICsxMzUzLDcgQEAKIAkJCQl9CiAJCQl9CiAJCX0gZWxzZSB7Ci0JCQlkcHJpbnRmX3JlZyhzdGRkZWIsIl9fdzMxX2R1bXB0cmVlOnN0cmFuZ2U6IG5vIGRpcmVjdG9yeSBrZXkgbmFtZSwgaWR4PSUwNHhcbiIsIGlkeCk7CisJCQlkcHJpbnRmX2luZm8ocmVnLCJfX3czMV9kdW1wdHJlZTpzdHJhbmdlOiBubyBkaXJlY3Rvcnkga2V5IG5hbWUsIGlkeD0lMDR4XG4iLCBpZHgpOwogCQl9CiAJCV9fdzMxX2R1bXB0cmVlKGRpci0+Y2hpbGRfaWR4LHR4dCx0YWIsaGVhZCx4bHBrZXksbGFzdG1vZGlmaWVkLGxldmVsKzEpOwogCQlpZHg9ZGlyLT5zaWJsaW5nX2lkeDsKQEAgLTE0MDUsMTIgKzEzNzksMTIgQEAKIAogCS8qIHJlYWQgJiBkdW1wIGhlYWRlciAqLwogCWlmIChzaXplb2YoaGVhZCkhPV9scmVhZDMyKGhmLCZoZWFkLHNpemVvZihoZWFkKSkpIHsKLQkJZHByaW50Zl9yZWcoc3RkZGViLCJfdzMxX2xvYWRyZWc6cmVnLmRhdCBpcyB0b28gc2hvcnQuXG4iKTsKKwkJZHByaW50Zl9lcnIocmVnLCAiX3czMV9sb2FkcmVnOnJlZy5kYXQgaXMgdG9vIHNob3J0LlxuIik7CiAJCV9sY2xvc2UzMihoZik7CiAJCXJldHVybjsKIAl9CiAJaWYgKG1lbWNtcChoZWFkLmNvb2tpZSwgIlNIQ0MzLjEwIiwgc2l6ZW9mKGhlYWQuY29va2llKSkhPTApIHsKLQkJZHByaW50Zl9yZWcoc3RkZGViLCJfdzMxX2xvYWRyZWc6cmVnLmRhdCBoYXMgYmFkIHNpZ25hdHVyZS5cbiIpOworCQlkcHJpbnRmX2VycihyZWcsICJfdzMxX2xvYWRyZWc6cmVnLmRhdCBoYXMgYmFkIHNpZ25hdHVyZS5cbiIpOwogCQlfbGNsb3NlMzIoaGYpOwogCQlyZXR1cm47CiAJfQpAQCAtMTQxOSw3ICsxMzkzLDcgQEAKIAkvKiByZWFkIGFuZCBkdW1wIGluZGV4IHRhYmxlICovCiAJdGFiID0geG1hbGxvYyhsZW4pOwogCWlmIChsZW4hPV9scmVhZDMyKGhmLHRhYixsZW4pKSB7Ci0JCWRwcmludGZfcmVnKHN0ZGVyciwiX3czMV9sb2FkcmVnOmNvdWxkbid0IHJlYWQgJWQgYnl0ZXMuXG4iLGxlbik7IAorCQlkcHJpbnRmX2VycihyZWcsIl93MzFfbG9hZHJlZzpjb3VsZG4ndCByZWFkICVkIGJ5dGVzLlxuIixsZW4pOyAKIAkJZnJlZSh0YWIpOwogCQlfbGNsb3NlMzIoaGYpOwogCQlyZXR1cm47CkBAIC0xNDI4LDE0ICsxNDAyLDE0IEBACiAJLyogcmVhZCB0ZXh0ICovCiAJdHh0ID0geG1hbGxvYyhoZWFkLnRleHRzaXplKTsKIAlpZiAoLTE9PV9sbHNlZWszMihoZixoZWFkLnRleHRvZmYsU0VFS19TRVQpKSB7Ci0JCWRwcmludGZfcmVnKHN0ZGVyciwiX3czMV9sb2FkcmVnOmNvdWxkbid0IHNlZWsgdG8gdGV4dGJsb2NrLlxuIik7IAorCQlkcHJpbnRmX2VycihyZWcsIl93MzFfbG9hZHJlZzpjb3VsZG4ndCBzZWVrIHRvIHRleHRibG9jay5cbiIpOyAKIAkJZnJlZSh0YWIpOwogCQlmcmVlKHR4dCk7CiAJCV9sY2xvc2UzMihoZik7CiAJCXJldHVybjsKIAl9CiAJaWYgKGhlYWQudGV4dHNpemUhPV9scmVhZDMyKGhmLHR4dCxoZWFkLnRleHRzaXplKSkgewotCQlkcHJpbnRmX3JlZyhzdGRlcnIsIl93MzFfbG9hZHJlZzp0ZXh0YmxvY2sgdG9vIHNob3J0ICglZCBpbnN0ZWFkIG9mICVsZCkuXG4iLGxlbixoZWFkLnRleHRzaXplKTsgCisJCWRwcmludGZfZXJyKHJlZywiX3czMV9sb2FkcmVnOnRleHRibG9jayB0b28gc2hvcnQgKCVkIGluc3RlYWQgb2YgJWxkKS5cbiIsbGVuLGhlYWQudGV4dHNpemUpOyAKIAkJZnJlZSh0YWIpOwogCQlmcmVlKHR4dCk7CiAJCV9sY2xvc2UzMihoZik7CkBAIC0xNDQzLDcgKzE0MTcsNyBAQAogCX0KIAogCWlmICghR2V0RmlsZUluZm9ybWF0aW9uQnlIYW5kbGUoaGYsJmhmaW5mbykpIHsKLQkJZHByaW50Zl9yZWcoc3RkZXJyLCJfdzMxX2xvYWRyZWc6R2V0RmlsZUluZm9ybWF0aW9uQnlIYW5kbGUgZmFpbGVkPy5cbiIpOyAKKwkJZHByaW50Zl9lcnIocmVnLCJfdzMxX2xvYWRyZWc6R2V0RmlsZUluZm9ybWF0aW9uQnlIYW5kbGUgZmFpbGVkPy5cbiIpOyAKIAkJZnJlZSh0YWIpOwogCQlmcmVlKHR4dCk7CiAJCV9sY2xvc2UzMihoZik7CkBAIC0xNTU1LDcgKzE1MjksNyBAQAogCUxQS0VZU1RSVUNUCWxwTmV4dEtleSxscHhrZXk7CiAJTFBXU1RSCQkqd3BzOwogCWludAkJd3BjLGk7Ci0JZHByaW50Zl9yZWcoc3RkZGViLCJSZWdPcGVuS2V5RXgzMlcoJWx4LCVzLCVsZCwlbHgsJXApXG4iLAorCWRwcmludGZfaW5mbyhyZWcsIlJlZ09wZW5LZXlFeDMyVyglbHgsJXMsJWxkLCVseCwlcClcbiIsCiAJCShMT05HKWhrZXksVzJDKGxwc3pTdWJLZXksMCksZHdSZXNlcnZlZCxzYW1EZXNpcmVkLHJldGtleQogCSk7CiAKQEAgLTE1OTcsNyArMTU3MSw3IEBACiAJTFBDV1NUUglscHN6U3ViS2V5LAogCUxQSEtFWQlyZXRrZXkKICkgewotCWRwcmludGZfcmVnKHN0ZGRlYiwiUmVnT3BlbktleTMyVyglbHgsJXMsJXApXG4iLAorCWRwcmludGZfaW5mbyhyZWcsIlJlZ09wZW5LZXkzMlcoJWx4LCVzLCVwKVxuIiwKIAkJKExPTkcpaGtleSxXMkMobHBzelN1YktleSwwKSxyZXRrZXkKIAkpOwogCXJldHVybiBSZWdPcGVuS2V5RXgzMlcoaGtleSxscHN6U3ViS2V5LDAsS0VZX0FMTF9BQ0NFU1MscmV0a2V5KTsKQEAgLTE2MTUsNyArMTU4OSw3IEBACiAJTFBXU1RSCWxwc3pTdWJLZXlXOwogCURXT1JECXJldDsKIAotCWRwcmludGZfcmVnKHN0ZGRlYiwiUmVnT3BlbktleUV4MzJBKCVseCwlcywlbGQsJWx4LCVwKVxuIiwKKwlkcHJpbnRmX2luZm8ocmVnLCJSZWdPcGVuS2V5RXgzMkEoJWx4LCVzLCVsZCwlbHgsJXApXG4iLAogCQkoTE9ORyloa2V5LGxwc3pTdWJLZXksZHdSZXNlcnZlZCxzYW1EZXNpcmVkLHJldGtleQogCSk7CiAJaWYgKGxwc3pTdWJLZXkpCkBAIC0xNjM0LDcgKzE2MDgsNyBAQAogCUxQQ1NUUglscHN6U3ViS2V5LAogCUxQSEtFWQlyZXRrZXkKICkgewotCWRwcmludGZfcmVnKHN0ZGRlYiwiUmVnT3BlbktleTMyQSglbHgsJXMsJXApXG4iLAorCWRwcmludGZfaW5mbyhyZWcsIlJlZ09wZW5LZXkzMkEoJWx4LCVzLCVwKVxuIiwKIAkJKExPTkcpaGtleSxscHN6U3ViS2V5LHJldGtleQogCSk7CiAJcmV0dXJuCVJlZ09wZW5LZXlFeDMyQShoa2V5LGxwc3pTdWJLZXksMCxLRVlfQUxMX0FDQ0VTUyxyZXRrZXkpOwpAQCAtMTY0Niw3ICsxNjIwLDcgQEAKIAlMUENTVFIJbHBzelN1YktleSwKIAlMUEhLRVkJcmV0a2V5CiApIHsKLQlkcHJpbnRmX3JlZyhzdGRkZWIsIlJlZ09wZW5LZXkxNiglbHgsJXMsJXApXG4iLAorCWRwcmludGZfaW5mbyhyZWcsIlJlZ09wZW5LZXkxNiglbHgsJXMsJXApXG4iLAogCQkoTE9ORyloa2V5LGxwc3pTdWJLZXkscmV0a2V5CiAJKTsKIAlyZXR1cm4gUmVnT3BlbktleTMyQShoa2V5LGxwc3pTdWJLZXkscmV0a2V5KTsKQEAgLTE2ODIsNyArMTY1Niw3IEBACiAJaW50CQl3cGMsaTsKIAogLypGSVhNRTogaGFuZGxlIHNlY3VyaXR5L2FjY2Vzcy93aGF0ZXZlciAqLwotCWRwcmludGZfcmVnKHN0ZGRlYiwiUmVnQ3JlYXRlS2V5RXgzMlcoJWx4LCVzLCVsZCwlcywlbHgsJWx4LCVwLCVwLCVwKVxuIiwKKwlkcHJpbnRmX2luZm8ocmVnLCJSZWdDcmVhdGVLZXlFeDMyVyglbHgsJXMsJWxkLCVzLCVseCwlbHgsJXAsJXAsJXApXG4iLAogCQkoTE9ORyloa2V5LAogCQlXMkMobHBzelN1YktleSwwKSwKIAkJZHdSZXNlcnZlZCwKQEAgLTE3NzgsNyArMTc1Miw3IEBACiApIHsKIAlEV09SRAlqdW5rLHJldDsKIAotCWRwcmludGZfcmVnKHN0ZGRlYiwiUmVnQ3JlYXRlS2V5MzJXKCVseCwlcywlcClcbiIsCisJZHByaW50Zl9pbmZvKHJlZywiUmVnQ3JlYXRlS2V5MzJXKCVseCwlcywlcClcbiIsCiAJCShMT05HKWhrZXksVzJDKGxwc3pTdWJLZXksMCkscmV0a2V5CiAJKTsKIAlyZXQ9UmVnQ3JlYXRlS2V5RXgzMlcoCkBAIC0xODEwLDcgKzE3ODQsNyBAQAogCUxQV1NUUglscHN6U3ViS2V5VyxscHN6Q2xhc3NXOwogCURXT1JECXJldDsKIAotCWRwcmludGZfcmVnKHN0ZGRlYiwiUmVnQ3JlYXRlS2V5RXgzMkEoJWx4LCVzLCVsZCwlcywlbHgsJWx4LCVwLCVwLCVwKVxuIiwKKwlkcHJpbnRmX2luZm8ocmVnLCJSZWdDcmVhdGVLZXlFeDMyQSglbHgsJXMsJWxkLCVzLCVseCwlbHgsJXAsJXAsJXApXG4iLAogCQkoTE9ORyloa2V5LAogCQlscHN6U3ViS2V5LAogCQlkd1Jlc2VydmVkLApAQCAtMTg1NSw3ICsxODI5LDcgQEAKICkgewogCURXT1JECWp1bms7CiAKLQlkcHJpbnRmX3JlZyhzdGRkZWIsIlJlZ0NyZWF0ZUtleTMyQSglbHgsJXMsJXApXG4iLAorCWRwcmludGZfaW5mbyhyZWcsIlJlZ0NyZWF0ZUtleTMyQSglbHgsJXMsJXApXG4iLAogCQkoTE9ORyloa2V5LGxwc3pTdWJLZXkscmV0a2V5CiAJKTsKIAlyZXR1cm4JUmVnQ3JlYXRlS2V5RXgzMkEoCkBAIC0xODc3LDcgKzE4NTEsNyBAQAogCUxQQ1NUUglscHN6U3ViS2V5LAogCUxQSEtFWQlyZXRrZXkKICkgewotCWRwcmludGZfcmVnKHN0ZGRlYiwiUmVnQ3JlYXRlS2V5MTYoJWx4LCVzLCVwKVxuIiwKKwlkcHJpbnRmX2luZm8ocmVnLCJSZWdDcmVhdGVLZXkxNiglbHgsJXMsJXApXG4iLAogCQkoTE9ORyloa2V5LGxwc3pTdWJLZXkscmV0a2V5CiAJKTsKIAlyZXR1cm4gUmVnQ3JlYXRlS2V5MzJBKGhrZXksbHBzelN1YktleSxyZXRrZXkpOwpAQCAtMTkwNyw3ICsxODgxLDcgQEAKIAlMUEtFWVNUUlVDVAlscGtleTsKIAlpbnQJCWk7CiAKLQlkcHJpbnRmX3JlZyhzdGRkZWIsIlJlZ1F1ZXJ5VmFsdWVFeDMyVygleCwlcywlcCwlcCwlcCwlbGQpXG4iLAorCWRwcmludGZfaW5mbyhyZWcsIlJlZ1F1ZXJ5VmFsdWVFeDMyVygleCwlcywlcCwlcCwlcCwlbGQpXG4iLAogCQloa2V5LFcyQyhscHN6VmFsdWVOYW1lLDApLGxwZHdSZXNlcnZlZCxscGR3VHlwZSxscGJEYXRhLAogCQlscGNiRGF0YT8qbHBjYkRhdGE6MAogCSk7CkBAIC0xOTY5LDcgKzE5NDMsNyBAQAogCUhLRVkJeGhrZXk7CiAJRFdPUkQJcmV0LGxwZHdUeXBlOwogCi0JZHByaW50Zl9yZWcoc3RkZGViLCJSZWdRdWVyeVZhbHVlMzJXKCV4LCVzLCVwLCVsZClcbi0+IiwKKwlkcHJpbnRmX2luZm8ocmVnLCJSZWdRdWVyeVZhbHVlMzJXKCV4LCVzLCVwLCVsZClcbiIsCiAJCWhrZXksVzJDKGxwc3pTdWJLZXksMCksbHBzekRhdGEsCiAJCWxwY2JEYXRhPypscGNiRGF0YTowCiAJKTsKQEAgLTIwMTEsNyArMTk4NSw3IEBACiAJRFdPUkQJKm15bGVuOwogCURXT1JECXR5cGU7CiAKLQlkcHJpbnRmX3JlZyhzdGRkZWIsIlJlZ1F1ZXJ5VmFsdWVFeDMyQSgleCwlcywlcCwlcCwlcCwlbGQpXG4tPiIsCisJZHByaW50Zl9pbmZvKHJlZywiUmVnUXVlcnlWYWx1ZUV4MzJBKCV4LCVzLCVwLCVwLCVwLCVsZClcbiIsCiAJCWhrZXksbHBzelZhbHVlTmFtZSxscGR3UmVzZXJ2ZWQsbHBkd1R5cGUsbHBiRGF0YSwKIAkJbHBjYkRhdGE/KmxwY2JEYXRhOjAKIAkpOwpAQCAtMjA5Niw3ICsyMDcwLDcgQEAKIAlMUEJZVEUJbHBiRGF0YSwKIAlMUERXT1JECWxwY2JEYXRhCiApIHsKLQlkcHJpbnRmX3JlZyhzdGRkZWIsIlJlZ1F1ZXJ5VmFsdWVFeDE2KCV4LCVzLCVwLCVwLCVwLCVsZClcbiIsCisJZHByaW50Zl9pbmZvKHJlZywiUmVnUXVlcnlWYWx1ZUV4MTYoJXgsJXMsJXAsJXAsJXAsJWxkKVxuIiwKIAkJaGtleSxscHN6VmFsdWVOYW1lLGxwZHdSZXNlcnZlZCxscGR3VHlwZSxscGJEYXRhLAogCQlscGNiRGF0YT8qbHBjYkRhdGE6MAogCSk7CkBAIC0yMTIwLDcgKzIwOTQsNyBAQAogCUhLRVkJeGhrZXk7CiAJRFdPUkQJcmV0LGxwZHdUeXBlOwogCi0JZHByaW50Zl9yZWcoc3RkZGViLCJSZWdRdWVyeVZhbHVlMzJBKCV4LCVzLCVwLCVsZClcbiIsCisJZHByaW50Zl9pbmZvKHJlZywiUmVnUXVlcnlWYWx1ZTMyQSgleCwlcywlcCwlbGQpXG4iLAogCQloa2V5LGxwc3pTdWJLZXksbHBzekRhdGEsCiAJCWxwY2JEYXRhPypscGNiRGF0YTowCiAJKTsKQEAgLTIxNTQsNyArMjEyOCw3IEBACiAJTFBTVFIJbHBzekRhdGEsCiAJTFBEV09SRAlscGNiRGF0YQogKSB7Ci0JZHByaW50Zl9yZWcoc3RkZGViLCJSZWdRdWVyeVZhbHVlMTYoJXgsJXMsJXAsJWxkKVxuIiwKKwlkcHJpbnRmX2luZm8ocmVnLCJSZWdRdWVyeVZhbHVlMTYoJXgsJXMsJXAsJWxkKVxuIiwKIAkJaGtleSxscHN6U3ViS2V5LGxwc3pEYXRhLGxwY2JEYXRhPypscGNiRGF0YTowCiAJKTsKIAkvKiBIQUNLOiB0aGUgMTZiaXQgUmVnUXVlcnlWYWx1ZSBkb2Vzbid0IGhhbmRsZSBzZWxlY3RvcmJsb2NrcwpAQCAtMjE4Niw3ICsyMTYwLDcgQEAKIAlMUEtFWVNUUlVDVAlscGtleTsKIAlpbnQJCWk7CiAKLQlkcHJpbnRmX3JlZyhzdGRkZWIsIlJlZ1NldFZhbHVlRXgzMlcoJXgsJXMsJWxkLCVsZCwlcCwlbGQpXG4iLAorCWRwcmludGZfaW5mbyhyZWcsIlJlZ1NldFZhbHVlRXgzMlcoJXgsJXMsJWxkLCVsZCwlcCwlbGQpXG4iLAogCQloa2V5LFcyQyhscHN6VmFsdWVOYW1lLDApLGR3UmVzZXJ2ZWQsZHdUeXBlLGxwYkRhdGEsY2JEYXRhCiAJKTsKIAkvKiB3ZSBubyBsb25nZXIgY2FyZSBhYm91dCB0aGUgbHBiRGF0YSB0eXBlIGhlcmUuLi4gKi8KQEAgLTIyNDMsNyArMjIxNyw3IEBACiAJTFBXU1RSCWxwc3pWYWx1ZU5hbWVXOwogCURXT1JECXJldDsKIAotCWRwcmludGZfcmVnKHN0ZGRlYiwiUmVnU2V0VmFsdWVFeDMyQSgleCwlcywlbGQsJWxkLCVwLCVsZClcbi0+IiwKKwlkcHJpbnRmX2luZm8ocmVnLCJSZWdTZXRWYWx1ZUV4MzJBKCV4LCVzLCVsZCwlbGQsJXAsJWxkKVxuIiwKIAkJaGtleSxscHN6VmFsdWVOYW1lLGR3UmVzZXJ2ZWQsZHdUeXBlLGxwYkRhdGEsY2JEYXRhCiAJKTsKIAlpZiAoKDE8PGR3VHlwZSkgJiBVTklDT05WTUFTSykgewpAQCAtMjI3Miw3ICsyMjQ2LDcgQEAKIAlMUEJZVEUJbHBiRGF0YSwKIAlEV09SRAljYkRhdGEKICkgewotCWRwcmludGZfcmVnKHN0ZGRlYiwiUmVnU2V0VmFsdWVFeDE2KCV4LCVzLCVsZCwlbGQsJXAsJWxkKVxuLT4iLAorCWRwcmludGZfaW5mbyhyZWcsIlJlZ1NldFZhbHVlRXgxNigleCwlcywlbGQsJWxkLCVwLCVsZClcbiIsCiAJCWhrZXksbHBzelZhbHVlTmFtZSxkd1Jlc2VydmVkLGR3VHlwZSxscGJEYXRhLGNiRGF0YQogCSk7CiAJcmV0dXJuIFJlZ1NldFZhbHVlRXgzMkEoaGtleSxscHN6VmFsdWVOYW1lLGR3UmVzZXJ2ZWQsZHdUeXBlLGxwYkRhdGEsY2JEYXRhKTsKQEAgLTIyODksNyArMjI2Myw3IEBACiAJSEtFWQl4aGtleTsKIAlEV09SRAlyZXQ7CiAKLQlkcHJpbnRmX3JlZyhzdGRkZWIsIlJlZ1NldFZhbHVlMzJXKCV4LCVzLCVsZCwlcywlbGQpXG4tPiIsCisJZHByaW50Zl9pbmZvKHJlZywiUmVnU2V0VmFsdWUzMlcoJXgsJXMsJWxkLCVzLCVsZClcbiIsCiAJCWhrZXksVzJDKGxwc3pTdWJLZXksMCksZHdUeXBlLFcyQyhscHN6RGF0YSwwKSxjYkRhdGEKIAkpOwogCWlmIChscHN6U3ViS2V5ICYmICpscHN6U3ViS2V5KSB7CkBAIC0yMzAzLDcgKzIyNzcsNyBAQAogCQlkd1R5cGU9UkVHX1NaOwogCX0KIAlpZiAoY2JEYXRhIT0yKmxzdHJsZW4zMlcobHBzekRhdGEpKzIpIHsKLQkJZHByaW50Zl9yZWcoc3RkZGViLCJSZWdTZXRWYWx1ZVggY2FsbGVkIHdpdGggbGVuPSVsZCAhPSBzdHJsZW4oJXMpKzE9JWQhXG4iLAorCQlkcHJpbnRmX2luZm8ocmVnLCJSZWdTZXRWYWx1ZVggY2FsbGVkIHdpdGggbGVuPSVsZCAhPSBzdHJsZW4oJXMpKzE9JWQhXG4iLAogCQkJY2JEYXRhLFcyQyhscHN6RGF0YSwwKSwyKmxzdHJsZW4zMlcobHBzekRhdGEpKzIKIAkJKTsKIAkJY2JEYXRhPTIqbHN0cmxlbjMyVyhscHN6RGF0YSkrMjsKQEAgLTIzMjUsNyArMjI5OSw3IEBACiAJRFdPUkQJcmV0OwogCUhLRVkJeGhrZXk7CiAKLQlkcHJpbnRmX3JlZyhzdGRkZWIsIlJlZ1NldFZhbHVlMzJBKCV4LCVzLCVsZCwlcywlbGQpXG4tPiIsCisJZHByaW50Zl9pbmZvKHJlZywiUmVnU2V0VmFsdWUzMkEoJXgsJXMsJWxkLCVzLCVsZClcbiIsCiAJCWhrZXksbHBzelN1YktleSxkd1R5cGUsbHBzekRhdGEsY2JEYXRhCiAJKTsKIAlpZiAobHBzelN1YktleSAmJiAqbHBzelN1YktleSkgewpAQCAtMjMzNiw3ICsyMzEwLDcgQEAKIAkJeGhrZXk9aGtleTsKIAogCWlmIChkd1R5cGUhPVJFR19TWikgewotCQlkcHJpbnRmX3JlZyhzdGRkZWIsIlJlZ1NldFZhbHVlQSBjYWxsZWQgd2l0aCBkd1R5cGU9JWxkIVxuIixkd1R5cGUpOworCQlkcHJpbnRmX2luZm8ocmVnLCJSZWdTZXRWYWx1ZUEgY2FsbGVkIHdpdGggZHdUeXBlPSVsZCFcbiIsZHdUeXBlKTsKIAkJZHdUeXBlPVJFR19TWjsKIAl9CiAJaWYgKGNiRGF0YSE9c3RybGVuKGxwc3pEYXRhKSsxKQpAQCAtMjM1Niw3ICsyMzMwLDcgQEAKIAlEV09SRAljYkRhdGEKICkgewogCURXT1JECXJldDsKLQlkcHJpbnRmX3JlZyhzdGRkZWIsIlJlZ1NldFZhbHVlMTYoJXgsJXMsJWxkLCVzLCVsZClcbi0+IiwKKwlkcHJpbnRmX2luZm8ocmVnLCJSZWdTZXRWYWx1ZTE2KCV4LCVzLCVsZCwlcywlbGQpXG4iLAogCQloa2V5LGxwc3pTdWJLZXksZHdUeXBlLGxwc3pEYXRhLGNiRGF0YQogCSk7CiAJcmV0PVJlZ1NldFZhbHVlMzJBKGhrZXksbHBzelN1YktleSxkd1R5cGUsbHBzekRhdGEsY2JEYXRhKTsKQEAgLTIzODQsNyArMjM1OCw3IEBACiApIHsKIAlMUEtFWVNUUlVDVAlscGtleSxscHhrZXk7CiAKLQlkcHJpbnRmX3JlZyhzdGRkZWIsIlJlZ0VudW1LZXlFeDMyVygleCwlbGQsJXAsJWxkLCVwLCVwLCVwLCVwKVxuIiwKKwlkcHJpbnRmX2luZm8ocmVnLCJSZWdFbnVtS2V5RXgzMlcoJXgsJWxkLCVwLCVsZCwlcCwlcCwlcCwlcClcbiIsCiAJCWhrZXksaVN1YmtleSxscHN6TmFtZSwqbHBjY2hOYW1lLGxwZHdSZXNlcnZlZCxscHN6Q2xhc3MsbHBjY2hDbGFzcyxmdAogCSk7CiAJbHBrZXk9bG9va3VwX2hrZXkoaGtleSk7CkBAIC0yNDIwLDcgKzIzOTQsNyBAQAogKSB7CiAJRklMRVRJTUUJZnQ7CiAKLQlkcHJpbnRmX3JlZyhzdGRkZWIsIlJlZ0VudW1LZXkzMlcoJXgsJWxkLCVwLCVsZClcbi0+IiwKKwlkcHJpbnRmX2luZm8ocmVnLCJSZWdFbnVtS2V5MzJXKCV4LCVsZCwlcCwlbGQpXG4iLAogCQloa2V5LGlTdWJrZXksbHBzek5hbWUsbHBjY2hOYW1lCiAJKTsKIAlyZXR1cm4gUmVnRW51bUtleUV4MzJXKGhrZXksaVN1YmtleSxscHN6TmFtZSwmbHBjY2hOYW1lLE5VTEwsTlVMTCxOVUxMLCZmdCk7CkBAIC0yNDQwLDcgKzI0MTQsNyBAQAogCUxQV1NUUglscHN6TmFtZVcsbHBzekNsYXNzVzsKIAogCi0JZHByaW50Zl9yZWcoc3RkZGViLCJSZWdFbnVtS2V5RXgzMkEoJXgsJWxkLCVwLCVsZCwlcCwlcCwlcCwlcClcbi0+IiwKKwlkcHJpbnRmX2luZm8ocmVnLCJSZWdFbnVtS2V5RXgzMkEoJXgsJWxkLCVwLCVsZCwlcCwlcCwlcCwlcClcbiIsCiAJCWhrZXksaVN1YmtleSxscHN6TmFtZSwqbHBjY2hOYW1lLGxwZHdSZXNlcnZlZCxscHN6Q2xhc3MsbHBjY2hDbGFzcyxmdAogCSk7CiAJaWYgKGxwc3pOYW1lKSB7CkBAIC0yNDkxLDcgKzI0NjUsNyBAQAogKSB7CiAJRklMRVRJTUUJZnQ7CiAKLQlkcHJpbnRmX3JlZyhzdGRkZWIsIlJlZ0VudW1LZXkzMkEoJXgsJWxkLCVwLCVsZClcbi0+IiwKKwlkcHJpbnRmX2luZm8ocmVnLCJSZWdFbnVtS2V5MzJBKCV4LCVsZCwlcCwlbGQpXG4iLAogCQloa2V5LGlTdWJrZXksbHBzek5hbWUsbHBjY2hOYW1lCiAJKTsKIAlyZXR1cm4JUmVnRW51bUtleUV4MzJBKApAQCAtMjUxMyw3ICsyNDg3LDcgQEAKIAlMUFNUUglscHN6TmFtZSwKIAlEV09SRAlscGNjaE5hbWUKICkgewotCWRwcmludGZfcmVnKHN0ZGRlYiwiUmVnRW51bUtleTE2KCV4LCVsZCwlcCwlbGQpXG4tPiIsCisJZHByaW50Zl9pbmZvKHJlZywiUmVnRW51bUtleTE2KCV4LCVsZCwlcCwlbGQpXG4iLAogCQloa2V5LGlTdWJrZXksbHBzek5hbWUsbHBjY2hOYW1lCiAJKTsKIAlyZXR1cm4gUmVnRW51bUtleTMyQShoa2V5LGlTdWJrZXksbHBzek5hbWUsbHBjY2hOYW1lKTsKQEAgLTI1NDAsNyArMjUxNCw3IEBACiAJTFBLRVlTVFJVQ1QJbHBrZXk7CiAJTFBLRVlWQUxVRQl2YWw7CiAKLQlkcHJpbnRmX3JlZyhzdGRkZWIsIlJlZ0VudW1WYWx1ZTMyVygleCwlbGQsJXAsJXAsJXAsJXAsJXAsJXApXG4iLAorCWRwcmludGZfaW5mbyhyZWcsIlJlZ0VudW1WYWx1ZTMyVygleCwlbGQsJXAsJXAsJXAsJXAsJXAsJXApXG4iLAogCQloa2V5LGlWYWx1ZSxscHN6VmFsdWUsbHBjY2hWYWx1ZSxscGRSZXNlcnZlZCxscGR3VHlwZSxscGJEYXRhLGxwY2JEYXRhCiAJKTsKIAlscGtleSA9IGxvb2t1cF9oa2V5KGhrZXkpOwpAQCAtMjU4Nyw3ICsyNTYxLDcgQEAKIAlMUEJZVEUJbHBiRGF0YVc7CiAJRFdPUkQJcmV0LGxwY2JEYXRhVzsKIAotCWRwcmludGZfcmVnKHN0ZGRlYiwiUmVnRW51bVZhbHVlMzJBKCV4LCVsZCwlcCwlcCwlcCwlcCwlcCwlcClcbiIsCisJZHByaW50Zl9pbmZvKHJlZywiUmVnRW51bVZhbHVlMzJBKCV4LCVsZCwlcCwlcCwlcCwlcCwlcCwlcClcbiIsCiAJCWhrZXksaVZhbHVlLGxwc3pWYWx1ZSxscGNjaFZhbHVlLGxwZFJlc2VydmVkLGxwZHdUeXBlLGxwYkRhdGEsbHBjYkRhdGEKIAkpOwogCkBAIC0yNjQwLDcgKzI2MTQsNyBAQAogCUxQQllURQlscGJEYXRhLAogCUxQRFdPUkQJbHBjYkRhdGEKICkgewotCWRwcmludGZfcmVnKHN0ZGRlYiwiUmVnRW51bVZhbHVlKCV4LCVsZCwlcCwlcCwlcCwlcCwlcCwlcClcbiIsCisJZHByaW50Zl9pbmZvKHJlZywiUmVnRW51bVZhbHVlKCV4LCVsZCwlcCwlcCwlcCwlcCwlcCwlcClcbiIsCiAJCWhrZXksaVZhbHVlLGxwc3pWYWx1ZSxscGNjaFZhbHVlLGxwZFJlc2VydmVkLGxwZHdUeXBlLGxwYkRhdGEsbHBjYkRhdGEKIAkpOwogCXJldHVybiBSZWdFbnVtVmFsdWUzMkEoCkBAIC0yNjYwLDcgKzI2MzQsNyBAQAogICovCiAvKiBSZWdDbG9zZUtleQkJCVtTSEVMTC4zXSBbS0VSTkVMLjIyMF0gW0FEVkFQSTMyLjEyNl0gKi8KIERXT1JEIFdJTkFQSSBSZWdDbG9zZUtleShIS0VZIGhrZXkpIHsKLQlkcHJpbnRmX3JlZyhzdGRkZWIsIlJlZ0Nsb3NlS2V5KCV4KVxuIixoa2V5KTsKKwlkcHJpbnRmX2luZm8ocmVnLCJSZWdDbG9zZUtleSgleClcbiIsaGtleSk7CiAJcmVtb3ZlX2hhbmRsZShoa2V5KTsKIAlyZXR1cm4gRVJST1JfU1VDQ0VTUzsKIH0KQEAgLTI2NzYsMTcgKzI2NTAsMTcgQEAKIAlMUFdTVFIJCSp3cHM7CiAJaW50CQl3cGMsaTsKIAotCWRwcmludGZfcmVnKHN0ZGRlYiwiUmVnRGVsZXRlS2V5MzJXKCV4LCVzKVxuIiwKKwlkcHJpbnRmX2luZm8ocmVnLCJSZWdEZWxldGVLZXkzMlcoJXgsJXMpXG4iLAogCQloa2V5LFcyQyhscHN6U3ViS2V5LDApCiAJKTsKIAlscE5leHRLZXkJPSBsb29rdXBfaGtleShoa2V5KTsKIAlpZiAoIWxwTmV4dEtleSkgewotCQlkcHJpbnRmX3JlZyAoc3RkZGViLCAiICBCYWRrZXlbMV0uXG4iKTsKKwkJZHByaW50Zl9pbmZvKHJlZywgIiAgQmFka2V5WzFdLlxuIik7CiAJCXJldHVybiBTSEVMTF9FUlJPUl9CQURLRVk7CiAJfQogCS8qIHdlIG5lZWQgdG8ga25vdyB0aGUgcHJldmlvdXMga2V5IGluIHRoZSBoaWVyLiAqLwogCWlmICghbHBzelN1YktleSB8fCAhKmxwc3pTdWJLZXkpIHsKLQkJZHByaW50Zl9yZWcgKHN0ZGRlYiwgIiAgQmFka2V5WzJdLlxuIik7CisJCWRwcmludGZfaW5mbyhyZWcsICIgIEJhZGtleVsyXS5cbiIpOwogCQlyZXR1cm4gU0hFTExfRVJST1JfQkFES0VZOwogCX0KIAlzcGxpdF9rZXlwYXRoKGxwc3pTdWJLZXksJndwcywmd3BjKTsKQEAgLTI2OTUsNyArMjY2OSw3IEBACiAJd2hpbGUgKGk8d3BjLTEpIHsKIAkJbHB4a2V5PWxwTmV4dEtleS0+bmV4dHN1YjsKIAkJd2hpbGUgKGxweGtleSkgewotCQkJZHByaW50Zl9yZWcgKHN0ZGRlYiwgIiAgU2Nhbm5pbmcgWyVzXVxuIiwKKwkJCWRwcmludGZfaW5mbyhyZWcsICIgIFNjYW5uaW5nIFslc11cbiIsCiAJCQkJICAgICBXMkMgKGxweGtleS0+a2V5bmFtZSwgMCkpOwogCQkJaWYgKCFsc3RyY21waTMyVyh3cHNbaV0sbHB4a2V5LT5rZXluYW1lKSkKIAkJCQlicmVhazsKQEAgLTI3MDMsNyArMjY3Nyw3IEBACiAJCX0KIAkJaWYgKCFscHhrZXkpIHsKIAkJCUZSRUVfS0VZX1BBVEg7Ci0JCQlkcHJpbnRmX3JlZyAoc3RkZGViLCAiICBOb3QgZm91bmQuXG4iKTsKKwkJCWRwcmludGZfaW5mbyhyZWcsICIgIE5vdCBmb3VuZC5cbiIpOwogCQkJLyogbm90IGZvdW5kIGlzIHN1Y2Nlc3MgKi8KIAkJCXJldHVybiBTSEVMTF9FUlJPUl9TVUNDRVNTOwogCQl9CkBAIC0yNzEzLDcgKzI2ODcsNyBAQAogCWxweGtleQk9IGxwTmV4dEtleS0+bmV4dHN1YjsKIAlscGxwUHJldktleSA9ICYobHBOZXh0S2V5LT5uZXh0c3ViKTsKIAl3aGlsZSAobHB4a2V5KSB7Ci0JCWRwcmludGZfcmVnIChzdGRkZWIsICIgIFNjYW5uaW5nIFslc11cbiIsCisJCWRwcmludGZfaW5mbyhyZWcsICIgIFNjYW5uaW5nIFslc11cbiIsCiAJCQkgICAgIFcyQyAobHB4a2V5LT5rZXluYW1lLCAwKSk7CiAJCWlmICghbHN0cmNtcGkzMlcod3BzW2ldLGxweGtleS0+a2V5bmFtZSkpCiAJCQlicmVhazsKQEAgLTI3MjIsMTMgKzI2OTYsMTIgQEAKIAl9CiAJaWYgKCFscHhrZXkpIHsKIAkJRlJFRV9LRVlfUEFUSDsKLQkJZHByaW50Zl9yZWcgKHN0ZGRlYiwgIiAgTm90IGZvdW5kLlxuIik7CisJCWRwcmludGZfd2FybihyZWcgLCAiICBOb3QgZm91bmQuXG4iKTsKIAkJcmV0dXJuIFNIRUxMX0VSUk9SX0JBREtFWTsKLQkJcmV0dXJuIFNIRUxMX0VSUk9SX1NVQ0NFU1M7CiAJfQogCWlmIChscHhrZXktPm5leHRzdWIpIHsKIAkJRlJFRV9LRVlfUEFUSDsKLQkJZHByaW50Zl9yZWcgKHN0ZGRlYiwgIiAgTm90IGVtcHR5LlxuIik7CisJCWRwcmludGZfd2FybihyZWcgLCAiICBOb3QgZW1wdHkuXG4iKTsKIAkJcmV0dXJuIFNIRUxMX0VSUk9SX0NBTlRXUklURTsKIAl9CiAJKmxwbHBQcmV2S2V5CT0gbHB4a2V5LT5uZXh0OwpAQCAtMjczOSw3ICsyNzEyLDcgQEAKIAkJZnJlZShscHhrZXktPnZhbHVlcyk7CiAJZnJlZShscHhrZXkpOwogCUZSRUVfS0VZX1BBVEg7Ci0JZHByaW50Zl9yZWcgKHN0ZGRlYiwgIiAgRG9uZS5cbiIpOworCWRwcmludGZfaW5mbyhyZWcsICIgIERvbmUuXG4iKTsKIAlyZXR1cm4JU0hFTExfRVJST1JfU1VDQ0VTUzsKIH0KIApAQCAtMjc0OCw3ICsyNzIxLDcgQEAKIAlMUFdTVFIJbHBzelN1YktleVc7CiAJRFdPUkQJcmV0OwogCi0JZHByaW50Zl9yZWcoc3RkZGViLCJSZWdEZWxldGVLZXkzMkEoJXgsJXMpXG4iLAorCWRwcmludGZfaW5mbyhyZWcsIlJlZ0RlbGV0ZUtleTMyQSgleCwlcylcbiIsCiAJCWhrZXksbHBzelN1YktleQogCSk7CiAJbHBzelN1YktleVc9SEVBUF9zdHJkdXBBdG9XKEdldFByb2Nlc3NIZWFwKCksMCxscHN6U3ViS2V5KTsKQEAgLTI3NTksNyArMjczMiw3IEBACiAKIC8qIFJlZ0RlbGV0ZUtleQkJCVtTSEVMTC40XSBbS0VSTkVMLjIxOV0gKi8KIERXT1JEIFdJTkFQSSBSZWdEZWxldGVLZXkxNihIS0VZIGhrZXksTFBDU1RSIGxwc3pTdWJLZXkpIHsKLQlkcHJpbnRmX3JlZyhzdGRkZWIsIlJlZ0RlbGV0ZUtleTE2KCV4LCVzKVxuIiwKKwlkcHJpbnRmX2luZm8ocmVnLCJSZWdEZWxldGVLZXkxNigleCwlcylcbiIsCiAJCWhrZXksbHBzelN1YktleQogCSk7CiAJcmV0dXJuIFJlZ0RlbGV0ZUtleTMyQShoa2V5LGxwc3pTdWJLZXkpOwpAQCAtMjc3OCw3ICsyNzUxLDcgQEAKIAlMUEtFWVNUUlVDVAlscGtleTsKIAlMUEtFWVZBTFVFCXZhbDsKIAotCWRwcmludGZfcmVnKHN0ZGRlYiwiUmVnRGVsZXRlVmFsdWUzMlcoJXgsJXMpXG4iLAorCWRwcmludGZfaW5mbyhyZWcsIlJlZ0RlbGV0ZVZhbHVlMzJXKCV4LCVzKVxuIiwKIAkJaGtleSxXMkMobHBzelZhbHVlLDApCiAJKTsKIAlscGtleT1sb29rdXBfaGtleShoa2V5KTsKQEAgLTI4MTksNyArMjc5Miw3IEBACiAJTFBXU1RSCWxwc3pWYWx1ZVc7CiAJRFdPUkQJcmV0OwogCi0JZHByaW50Zl9yZWcoIHN0ZGRlYiwgIlJlZ0RlbGV0ZVZhbHVlMzJBKCV4LCVzKVxuIiwgaGtleSxscHN6VmFsdWUgKTsKKwlkcHJpbnRmX2luZm8ocmVnLCAiUmVnRGVsZXRlVmFsdWUzMkEoJXgsJXMpXG4iLCBoa2V5LGxwc3pWYWx1ZSApOwogICAgICAgICBscHN6VmFsdWVXPUhFQVBfc3RyZHVwQXRvVyhHZXRQcm9jZXNzSGVhcCgpLDAsbHBzelZhbHVlKTsKIAlyZXQ9UmVnRGVsZXRlVmFsdWUzMlcoaGtleSxscHN6VmFsdWVXKTsKICAgICAgICAgSGVhcEZyZWUoR2V0UHJvY2Vzc0hlYXAoKSwwLGxwc3pWYWx1ZVcpOwpAQCAtMjgyOSwxNCArMjgwMiwxNCBAQAogLyogUmVnRGVsZXRlVmFsdWUJCVtLRVJORUwuMjIyXSAqLwogRFdPUkQgV0lOQVBJIFJlZ0RlbGV0ZVZhbHVlMTYoSEtFWSBoa2V5LExQU1RSIGxwc3pWYWx1ZSkKIHsKLQlkcHJpbnRmX3JlZyggc3RkZGViLCJSZWdEZWxldGVWYWx1ZTE2KCV4LCVzKVxuIiwgaGtleSxscHN6VmFsdWUgKTsKKwlkcHJpbnRmX2luZm8ocmVnLCJSZWdEZWxldGVWYWx1ZTE2KCV4LCVzKVxuIiwgaGtleSxscHN6VmFsdWUgKTsKIAlyZXR1cm4gUmVnRGVsZXRlVmFsdWUzMkEoaGtleSxscHN6VmFsdWUpOwogfQogCiAvKiBSZWdGbHVzaEtleQkJCVtBRFZBUEkzMi4xNDNdIFtLRVJORUwuMjI3XSAqLwogRFdPUkQgV0lOQVBJIFJlZ0ZsdXNoS2V5KEhLRVkgaGtleSkKIHsKLQlkcHJpbnRmX3JlZyhzdGRkZWIsIlJlZ0ZsdXNoS2V5KCV4KSwgU1RVQi5cbiIsaGtleSk7CisJZHByaW50Zl9maXhtZShyZWcsICJSZWdGbHVzaEtleSgleCksIFNUVUIuXG4iLCBoa2V5KTsKIAlyZXR1cm4gU0hFTExfRVJST1JfU1VDQ0VTUzsKIH0KIApAQCAtMjg2MSw3ICsyODM0LDcgQEAKIAlpbnQJCW5yb2ZrZXlzLG1heHN1YmtleSxtYXhjbGFzcyxtYXh2YWx1ZXMsbWF4dm5hbWUsbWF4dmRhdGE7CiAJaW50CQlpOwogCi0JZHByaW50Zl9yZWcoc3RkZGViLCJSZWdRdWVyeUluZm9LZXkzMlcoJXgsLi4uLi4uKVxuIixoa2V5KTsKKwlkcHJpbnRmX2luZm8ocmVnLCJSZWdRdWVyeUluZm9LZXkzMlcoJXgsLi4uLi4uKVxuIixoa2V5KTsKIAlscGtleT1sb29rdXBfaGtleShoa2V5KTsKIAlpZiAoIWxwa2V5KQogCQlyZXR1cm4gU0hFTExfRVJST1JfQkFES0VZOwpAQCAtMjkzNiw3ICsyOTA5LDcgQEAKIAlMUFdTVFIJCWxwc3pDbGFzc1c7CiAJRFdPUkQJCXJldDsKIAotCWRwcmludGZfcmVnKHN0ZGRlYiwiUmVnUXVlcnlJbmZvS2V5MzJBKCV4LC4uLi4uLilcbiIsaGtleSk7CisJZHByaW50Zl9pbmZvKHJlZywiUmVnUXVlcnlJbmZvS2V5MzJBKCV4LC4uLi4uLilcbiIsaGtleSk7CiAJaWYgKGxwc3pDbGFzcykgewogCQkqbHBjY2hDbGFzcyo9IDI7CiAJCWxwc3pDbGFzc1cgID0gKExQV1NUUil4bWFsbG9jKCpscGNjaENsYXNzKTsKZGlmZiAtLWdpdCBhL21pc2Mvc2hlbGwuYyBiL21pc2Mvc2hlbGwuYwppbmRleCA3MDA3YzIzLi42OWYxMmFhIDEwMDY0NAotLS0gYS9taXNjL3NoZWxsLmMKKysrIGIvbWlzYy9zaGVsbC5jCkBAIC0yMiw3ICsyMiw2IEBACiAjaW5jbHVkZSAiaW50ZXJmYWNlcy5oIgogI2luY2x1ZGUgInN5c21ldHJpY3MuaCIKICNpbmNsdWRlICJzaGxvYmouaCIKLSNpbmNsdWRlICJzdGRkZWJ1Zy5oIgogI2luY2x1ZGUgImRlYnVnLmgiCiAjaW5jbHVkZSAiZGVidWdzdHIuaCIKICNpbmNsdWRlICJ3aW5yZWcuaCIKQEAgLTM0LDYgKzMzLDcgQEAKICAgICAiTWFydGluIEF5b3R0ZSIsCiAgICAgIkthcmwgQmFja3N0clwzNjZtIiwKICAgICAiUGV0ZXIgQmFqdXN6IiwKKyAgICAiTWFyY2VsIEJhdXIiLAogICAgICJHZW9yZyBCZXllcmxlIiwKICAgICAiUm9zcyBCaXJvIiwKICAgICAiTWFydGluIEJvZWhtZSIsCkBAIC0yMjIsNyArMjIyLDcgQEAKICAgICBMUFNUUiBscEN1cnJlbnQ7CiAgICAgV09SRCAgaTsKICAgICAKLSAgICBkcHJpbnRmX3JlZyhzdGRkZWIsIkRyYWdRdWVyeUZpbGUoJTA0eCwgJWksICVwLCAldSlcbiIsCisgICAgZHByaW50Zl9pbmZvKHJlZywiRHJhZ1F1ZXJ5RmlsZSglMDR4LCAlaSwgJXAsICV1KVxuIiwKIAkJaERyb3Asd0ZpbGUsbHBzekZpbGUsd0xlbmd0aCk7CiAgICAgCiAgICAgbHBEcm9wRmlsZVN0cnVjdCA9IChMUERST1BGSUxFU1RSVUNUKSBHbG9iYWxMb2NrMTYoaERyb3ApOyAKQEAgLTI5Niw3ICsyOTYsNyBAQAogICAgIGludCBpOyAgICAgICAgICAgICAgICAgIC8qIHJhbmRvbSBjb3VudGVyICovCiAgICAgY2hhciB4bHBGaWxlWzI1Nl07ICAgICAgLyogcmVzdWx0IG9mIFNlYXJjaFBhdGggKi8KIAotICAgIGRwcmludGZfZXhlYyhzdGRkZWIsICJTSEVMTF9GaW5kRXhlY3V0YWJsZTogJXNcbiIsCisgICAgZHByaW50Zl9pbmZvKGV4ZWMsICJTSEVMTF9GaW5kRXhlY3V0YWJsZTogJXNcbiIsCiAgICAgICAgICAgICAgICAgIChscEZpbGUgIT0gTlVMTD9scEZpbGU6Ii0iKSApOwogICAgIGxwUmVzdWx0WzBdPSdcMCc7IC8qIFN0YXJ0IG9mZiB3aXRoIGFuIGVtcHR5IHJldHVybiBzdHJpbmcgKi8KIApAQCAtMzIyLDcgKzMyMiw3IEBACiAgICAgLyogTWFrZSBsb2NhbCBjb3B5ICYgbG93ZXJjYXNlIGl0IGZvciByZWcgJiAncHJvZ3JhbXM9JyBsb29rdXAgKi8KICAgICBsc3RyY3B5bjMyQSggdG1wZXh0LCBleHRlbnNpb24sIDUgKTsKICAgICBDaGFyTG93ZXIzMkEoIHRtcGV4dCApOwotICAgIGRwcmludGZfZXhlYyhzdGRkZWIsICJTSEVMTF9GaW5kRXhlY3V0YWJsZTogJXMgZmlsZVxuIiwgdG1wZXh0KTsKKyAgICBkcHJpbnRmX2luZm8oZXhlYywgIlNIRUxMX0ZpbmRFeGVjdXRhYmxlOiAlcyBmaWxlXG4iLCB0bXBleHQpOwogICAgIAogICAgIC8qIFRocmVlIHBsYWNlcyB0byBjaGVjazogKi8KICAgICAvKiAxLiB3aW4uaW5pLCBbd2luZG93c10sIHByb2dyYW1zIChOQiBubyBsZWFkaW5nICcuJykgKi8KQEAgLTM0OCw3ICszNDgsNyBAQAogCQkJCXN0cmNweShscFJlc3VsdCwgeGxwRmlsZSk7CiAJCQkJLyogTmVlZCB0byBwZXJoYXBzIGNoZWNrIHRoYXQgdGhlIGZpbGUgaGFzIGEgcGF0aAogCQkJCSAqIGF0dGFjaGVkICovCi0JCQkJZHByaW50Zl9leGVjKHN0ZGRlYiwgIlNIRUxMX0ZpbmRFeGVjdXRhYmxlOiBmb3VuZCAlc1xuIiwKKwkJCQlkcHJpbnRmX2luZm8oZXhlYywgIlNIRUxMX0ZpbmRFeGVjdXRhYmxlOiBmb3VuZCAlc1xuIiwKIAkJCQkJCQkgbHBSZXN1bHQpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gMzM7CiAKQEAgLTM2Niw3ICszNjYsNyBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICZmaWxldHlwZWxlbiApID09IFNIRUxMX0VSUk9SX1NVQ0NFU1MgKQogICAgIHsKIAlmaWxldHlwZVtmaWxldHlwZWxlbl09J1wwJzsKLQlkcHJpbnRmX2V4ZWMoc3RkZGViLCAiU0hFTExfRmluZEV4ZWN1dGFibGU6IEZpbGUgdHlwZTogJXNcbiIsCisJZHByaW50Zl9pbmZvKGV4ZWMsICJTSEVMTF9GaW5kRXhlY3V0YWJsZTogRmlsZSB0eXBlOiAlc1xuIiwKIAkJICAgICBmaWxldHlwZSk7CiAKIAkvKiBMb29raW5nIGZvciAuLi5idWZmZXJcc2hlbGxcbHBPcGVyYXRpb25cY29tbWFuZCAqLwpAQCAtNDIwLDcgKzQyMCw3IEBACiAJICB9CiAJfQogCi0gICAgZHByaW50Zl9leGVjKHN0ZGRlYiwgIlNIRUxMX0ZpbmRFeGVjdXRhYmxlOiByZXR1cm5pbmcgJXNcbiIsIGxwUmVzdWx0KTsKKyAgICBkcHJpbnRmX2luZm8oZXhlYywgIlNIRUxMX0ZpbmRFeGVjdXRhYmxlOiByZXR1cm5pbmcgJXNcbiIsIGxwUmVzdWx0KTsKICAgICByZXR1cm4gcmV0dmFsOwogfQogCkBAIC00MzUsNyArNDM1LDcgQEAKICAgICBjaGFyIG9sZF9kaXJbMTAyNF07CiAgICAgY2hhciBjbWRbMjU2XTsKIAotICAgIGRwcmludGZfZXhlYyhzdGRkZWIsICJTaGVsbEV4ZWN1dGUoJTA0eCwnJXMnLCclcycsJyVzJywnJXMnLCV4KVxuIiwKKyAgICBkcHJpbnRmX2luZm8oZXhlYywgIlNoZWxsRXhlY3V0ZSglMDR4LCclcycsJyVzJywnJXMnLCclcycsJXgpXG4iLAogCQloV25kLCBscE9wZXJhdGlvbiA/IGxwT3BlcmF0aW9uOiI8bnVsbD4iLCBscEZpbGUgPyBscEZpbGU6IjxudWxsPiIsCiAJCWxwUGFyYW1ldGVycyA/IGxwUGFyYW1ldGVycyA6ICI8bnVsbD4iLCAKIAkJbHBEaXJlY3RvcnkgPyBscERpcmVjdG9yeSA6ICI8bnVsbD4iLCBpU2hvd0NtZCk7CkBAIC00NjAsNyArNDYwLDcgQEAKICAgICAgICAgICAgIHN0cmNhdChjbWQsbHBQYXJhbWV0ZXJzKTsKICAgICAgICAgfQogCi0gICAgICAgIGRwcmludGZfZXhlYyhzdGRkZWIsIlNoZWxsRXhlY3V0ZTpzdGFydGluZyAlc1xuIixjbWQpOworICAgICAgICBkcHJpbnRmX2luZm8oZXhlYywiU2hlbGxFeGVjdXRlOnN0YXJ0aW5nICVzXG4iLGNtZCk7CiAgICAgICAgIHJldHZhbCA9IFdpbkV4ZWMzMiggY21kLCBpU2hvd0NtZCApOwogICAgIH0KICAgICBpZiAobHBEaXJlY3RvcnkpIFNldEN1cnJlbnREaXJlY3RvcnkzMkEoIG9sZF9kaXIgKTsKQEAgLTQ5OCw3ICs0OTgsNyBAQAogICAgIEhJTlNUQU5DRTMyIHJldHZhbD0zMTsgICAgLyogZGVmYXVsdCAtICdObyBhc3NvY2lhdGlvbiB3YXMgZm91bmQnICovCiAgICAgY2hhciBvbGRfZGlyWzEwMjRdOwogCi0gICAgZHByaW50Zl9leGVjKHN0ZGRlYiwgIkZpbmRFeGVjdXRhYmxlOiBGaWxlICVzLCBEaXIgJXNcbiIsIAorICAgIGRwcmludGZfaW5mbyhleGVjLCAiRmluZEV4ZWN1dGFibGU6IEZpbGUgJXMsIERpciAlc1xuIiwgCiAJCSAobHBGaWxlICE9IE5VTEw/bHBGaWxlOiItIiksIAogCQkgKGxwRGlyZWN0b3J5ICE9IE5VTEw/bHBEaXJlY3Rvcnk6Ii0iKSk7CiAKQEAgLTUxOSw3ICs1MTksNyBAQAogCiAgICAgcmV0dmFsID0gU0hFTExfRmluZEV4ZWN1dGFibGUoIGxwRmlsZSwgIm9wZW4iLCBscFJlc3VsdCApOwogCi0gICAgZHByaW50Zl9leGVjKHN0ZGRlYiwgIkZpbmRFeGVjdXRhYmxlOiByZXR1cm5pbmcgJXNcbiIsIGxwUmVzdWx0KTsKKyAgICBkcHJpbnRmX2luZm8oZXhlYywgIkZpbmRFeGVjdXRhYmxlOiByZXR1cm5pbmcgJXNcbiIsIGxwUmVzdWx0KTsKICAgICBpZiAobHBEaXJlY3RvcnkpIFNldEN1cnJlbnREaXJlY3RvcnkzMkEoIG9sZF9kaXIgKTsKICAgICByZXR1cm4gcmV0dmFsOwogfQpAQCAtOTMxLDcgKzkzMSw3IEBACiAgIEhGSUxFMzIgCWhGaWxlID0gT3BlbkZpbGUzMiggbHBzekV4ZUZpbGVOYW1lLCAmb2ZzLCBPRl9SRUFEICk7CiAgIFVJTlQxNglpY29uRGlyQ291bnQgPSAwLGljb25Db3VudCA9IDA7CiAgIAotICBkcHJpbnRmX3JlZyhzdGRkZWIsIkludGVybmFsRXh0cmFjdEljb24oJTA0eCxmaWxlICVzLHN0YXJ0ICVkLGV4dHJhY3QgJWRcbiIsIAorICBkcHJpbnRmX2luZm8ocmVnLCJJbnRlcm5hbEV4dHJhY3RJY29uKCUwNHgsZmlsZSAlcyxzdGFydCAlZCxleHRyYWN0ICVkXG4iLCAKIAkJICAgICAgIGhJbnN0YW5jZSwgbHBzekV4ZUZpbGVOYW1lLCBuSWNvbkluZGV4LCBuKTsKIAogICBpZiggaEZpbGUgPT0gSEZJTEVfRVJST1IzMiB8fCAhbiApIHJldHVybiAwOwpAQCAtOTY2LDEzICs5NjYsMTMgQEAKIAkgIHsKIAkgICAgIGljb25EaXJDb3VudCA9IHBUSW5mby0+Y291bnQ7CiAJICAgICBwSWNvbkRpciA9ICgoTkVfTkFNRUlORk8qKShwVEluZm8gKyAxKSk7Ci0JICAgICBkcHJpbnRmX3JlZyhzdGRkZWIsIlx0Zm91bmQgZGlyZWN0b3J5IC0gJWkgaWNvbiBmYW1pbGllc1xuIiwgaWNvbkRpckNvdW50KTsKKwkgICAgIGRwcmludGZfaW5mbyhyZWcsIlx0Zm91bmQgZGlyZWN0b3J5IC0gJWkgaWNvbiBmYW1pbGllc1xuIiwgaWNvbkRpckNvdW50KTsKIAkgIH0KIAlpZiggcFRJbmZvLT50eXBlX2lkID09IE5FX1JTQ1RZUEVfSUNPTiApIAogCSAgeyAKIAkgICAgIGljb25Db3VudCA9IHBUSW5mby0+Y291bnQ7CiAJICAgICBwSWNvblN0b3JhZ2UgPSAoKE5FX05BTUVJTkZPKikocFRJbmZvICsgMSkpOwotCSAgICAgZHByaW50Zl9yZWcoc3RkZGViLCJcdHRvdGFsIGljb25zIC0gJWlcbiIsIGljb25Db3VudCk7CisJICAgICBkcHJpbnRmX2luZm8ocmVnLCJcdHRvdGFsIGljb25zIC0gJWlcbiIsIGljb25Db3VudCk7CiAJICB9CiAgIAlwVEluZm8gPSAoTkVfVFlQRUlORk8gKikoKGNoYXIqKShwVEluZm8rMSkrcFRJbmZvLT5jb3VudCpzaXplb2YoTkVfTkFNRUlORk8pKTsKICAgICB9CkBAIC0xMzIzLDcgKzEzMjMsNyBAQAogCiAgIENoYXJUb09lbTMyQShzdHIsc3RyKTsKIAotICBkcHJpbnRmX3JlZyhzdGRkZWIsIkRvRW52U3Vic3Q6IGFjY2VwdCAlcyIsIHN0cik7CisgIGRwcmludGZfaW5mbyhyZWcsIkRvRW52U3Vic3Q6IGFjY2VwdCAlc1xuIiwgc3RyKTsKIAogICB3aGlsZSggKmxwc3RyICYmIGxwYnN0ciAtIGxwQnVmZmVyIDwgbGVuZ3RoICkKICAgIHsKQEAgLTEzNzIsNyArMTM3Miw3IEBACiAgIGVsc2UKICAgICAgIGxlbmd0aCA9IDA7CiAKLSAgZHByaW50Zl9yZWcoc3RkZGViLCIgcmV0dXJuICVzXG4iLCBzdHIpOworICBkcHJpbnRmX2luZm8ocmVnLCIgICAgcmV0dXJuICVzXG4iLCBzdHIpOwogCiAgIE9lbVRvQ2hhcjMyQShzdHIsc3RyKTsKICAgSGVhcEZyZWUoIEdldFByb2Nlc3NIZWFwKCksIDAsIGxwQnVmZmVyKTsKQEAgLTEzODksNyArMTM4OSw3IEBACiAgKi8KIExSRVNVTFQgV0lOQVBJIFNoZWxsSG9va1Byb2MoSU5UMTYgY29kZSwgV1BBUkFNMTYgd1BhcmFtLCBMUEFSQU0gbFBhcmFtKQogewotICAgIGRwcmludGZfcmVnKHN0ZGRlYiwiU2hlbGxIb29rUHJvYzogJWksICUwNHgsICUwOHhcbiIsIGNvZGUsIHdQYXJhbSwgCisgICAgZHByaW50Zl9pbmZvKHJlZywiU2hlbGxIb29rUHJvYzogJWksICUwNHgsICUwOHhcbiIsIGNvZGUsIHdQYXJhbSwgCiAJCQkJCQkgICAgICAodW5zaWduZWQpbFBhcmFtICk7CiAgICAgaWYoIFNIRUxMX2hIb29rICYmIFNIRUxMX2hXbmQgKQogICAgIHsKQEAgLTE0MTYsNyArMTQxNiw3IEBACiAgKi8KIEJPT0wzMiBXSU5BUEkgUmVnaXN0ZXJTaGVsbEhvb2soSFdORDE2IGhXbmQsIFVJTlQxNiB1QWN0aW9uKQogewotICAgIGRwcmludGZfcmVnKHN0ZGRlYiwiUmVnaXN0ZXJTaGVsbEhvb2s6ICUwNHggWyV1XVxuIiwgaFduZCwgdUFjdGlvbiApOworICAgIGRwcmludGZfaW5mbyhyZWcsIlJlZ2lzdGVyU2hlbGxIb29rOiAlMDR4IFsldV1cbiIsIGhXbmQsIHVBY3Rpb24gKTsKIAogICAgIHN3aXRjaCggdUFjdGlvbiApCiAgICAgewpAQCAtMTU0Nyw3ICsxNTQ3LDcgQEAKIAogdm9pZCBXSU5BUEkgQ29udHJvbF9SdW5ETEwgKEhXTkQzMiBod25kLCBMUENWT0lEIGNvZGUsIExQQ1NUUiBjbWQsIERXT1JEIGFyZzQpCiB7Ci0gIGRwcmludGZfZXhlYyAoc3RkZGViLCAiQ29udHJvbF9SdW5ETEwgKCUwOHgsICVwLCBcIiVzXCIsICUwOGx4KVxuIiwKKyAgZHByaW50Zl9pbmZvKGV4ZWMsICJDb250cm9sX1J1bkRMTCAoJTA4eCwgJXAsIFwiJXNcIiwgJTA4bHgpXG4iLAogCQlod25kLAogCQljb2RlID8gY29kZSA6ICIobnVsbCkiLAogCQljbWQgPyBjbWQgOiAiKG51bGwpIiwKQEAgLTE1NzMsOCArMTU3Myw4IEBACiAgICAgSFJFU1VMVAlocmVzID0gRV9PVVRPRk1FTU9SWTsKIAogCi0gICAgU3RyaW5nRnJvbUNMU0lEKChMUENMU0lEKXJjbHNpZCx4Y2xzaWQpOwotICAgIFN0cmluZ0Zyb21DTFNJRCgoTFBDTFNJRClpaWQseGlpZCk7CisgICAgV0lORV9TdHJpbmdGcm9tQ0xTSUQoKExQQ0xTSUQpcmNsc2lkLHhjbHNpZCk7CisgICAgV0lORV9TdHJpbmdGcm9tQ0xTSUQoKExQQ0xTSUQpaWlkLHhpaWQpOwogICAgIGZwcmludGYoc3RkZXJyLCJTSEVMTDMyX0RsbEdldENsYXNzT2JqZWN0KCVzLCVzLCVwKVxuIix4Y2xzaWQseGlpZCxwcHYpOwogCiAgICAgKnBwdiA9IE5VTEw7CkBAIC0xNjMzLDEwICsxNjMzLDkgQEAKICAqIFdoYXQgd2UgYXJlIGN1cnJlbnRseSBkb2luZyBpcyBub3QgdmVyeSB3cm9uZywgc2luY2Ugd2UgYWx3YXlzIHVzZSB0aGUgc2FtZQogICogaGVhcCAoUHJvY2Vzc0hlYXApLgogICovCi1EV09SRCBXSU5BUEkgU0hHZXRNYWxsb2MoTFBNQUxMT0MgKmxwbWFsKSB7CitEV09SRCBXSU5BUEkgU0hHZXRNYWxsb2MoTFBNQUxMT0MzMiAqbHBtYWwpIHsKIAlmcHJpbnRmKHN0ZGVyciwiU0hHZXRNYWxsb2MoKVxuIik7Ci0JKmxwbWFsID0gSU1hbGxvY19Db25zdHJ1Y3RvcigpOwotCXJldHVybiBOT0VSUk9SOworCXJldHVybiBDb0dldE1hbGxvYzMyKDAsbHBtYWwpOwogfQogCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgpkaWZmIC0tZ2l0IGEvbWlzYy9zaGVsbG9yZC5jIGIvbWlzYy9zaGVsbG9yZC5jCmluZGV4IDFkNGY4NTcuLjllZGE0MzMgMTAwNjQ0Ci0tLSBhL21pc2Mvc2hlbGxvcmQuYworKysgYi9taXNjL3NoZWxsb3JkLmMKQEAgLTI3LDcgKzI3LDYgQEAKICNpbmNsdWRlICJjdXJzb3JpY29uLmgiCiAjaW5jbHVkZSAiaW50ZXJmYWNlcy5oIgogI2luY2x1ZGUgInNobG9iai5oIgotI2luY2x1ZGUgInN0ZGRlYnVnLmgiCiAjaW5jbHVkZSAiZGVidWcuaCIKICNpbmNsdWRlICJ3aW5yZWcuaCIKIApAQCAtNDcwLDEwICs0NjksMTAgQEAKIAlEV09SRAlwYXRobGVuLHR5cGUsdG1vZGVsbGVuOwogCURXT1JECWhyZXM7CiAJCi0JU3RyaW5nRnJvbUNMU0lEKHJlZmlpZCx4aWlkKTsKKwlXSU5FX1N0cmluZ0Zyb21DTFNJRChyZWZpaWQseGlpZCk7CiAKIAlpZiAoY2xzaWQpCi0JCVN0cmluZ0Zyb21DTFNJRChjbHNpZCx4Y2xzaWQpOworCQlXSU5FX1N0cmluZ0Zyb21DTFNJRChjbHNpZCx4Y2xzaWQpOwogCWVsc2UgewogCQlpZiAoIWFjbHNpZCkKIAkJICAgIHJldHVybiAweDgwMDQwMTU0OwpAQCAtNTI0LDcgKzUyMyw3IEBACiAJZnByaW50ZihzdGRlcnIsIlNIRUxMMzJfMTgzKCUwOGx4LCUwOGx4LCUwOGx4KCVzKSwlMDhseCglcyksJTA4bHgsJXApLHN0dWIhXG4iLAogCQkoRFdPUkQpaG1vZCwoRFdPUkQpaHduZCxpZCxidWYyLHgsYnVmLHR5cGUsYXJnbGlzdAogCSk7Ci0JTWVzc2FnZUJveDMyQShod25kLGJ1ZjMsYnVmLGlkfDB4MTAwMDApOworCS8qTWVzc2FnZUJveDMyQShod25kLGJ1ZjMsYnVmLGlkfDB4MTAwMDApOyovCiB9CiAKIApkaWZmIC0tZ2l0IGEvbWlzYy9zcHkuYyBiL21pc2Mvc3B5LmMKaW5kZXggNDVmMzY4Yi4uOWE2YjNmYiAxMDA2NDQKLS0tIGEvbWlzYy9zcHkuYworKysgYi9taXNjL3NweS5jCkBAIC0xMiw3ICsxMiw2IEBACiAjaW5jbHVkZSAid2luLmgiCiAjaW5jbHVkZSAibW9kdWxlLmgiCiAjaW5jbHVkZSAib3B0aW9ucy5oIgotI2luY2x1ZGUgInN0ZGRlYnVnLmgiCiAjaW5jbHVkZSAiZGVidWcuaCIKICNpbmNsdWRlICJzcHkuaCIKIApAQCAtNjQzLDIxICs2NDIsMjEgQEAKIHsKICAgICBMUENTVFIgcG5hbWU7CiAKLSAgICBpZiAoIWRlYnVnZ2luZ19tZXNzYWdlIHx8IFNQWV9FWENMVURFKG1zZykpIHJldHVybjsKKyAgICBpZiAoIWRlYnVnZ2luZ19pbmZvKG1lc3NhZ2UpIHx8IFNQWV9FWENMVURFKG1zZykpIHJldHVybjsKIAogICAgIC8qIGVhY2ggU1BZX1NFTkRNRVNTQUdFIG11c3QgYmUgY29tcGxlbWVudGVkIGJ5IGNhbGwgdG8gU1BZX0V4aXRNZXNzYWdlICovCiAgICAgc3dpdGNoKGlGbGFnKQogICAgIHsKICAgICBjYXNlIFNQWV9ESVNQQVRDSE1FU1NBR0UxNjoKIAlwbmFtZSA9IFNQWV9HZXRXbmROYW1lKGhXbmQpOwotICAgICAgICBkcHJpbnRmX21lc3NhZ2Uoc3RkZGViLCIlKnMoJTA0eCkgJS0xNnMgbWVzc2FnZSBbJTA0eF0gJXMgZGlzcGF0Y2hlZCAgd3A9JTA0eCBscD0lMDhseFxuIiwKKyAgICAgICAgZHByaW50Zl9pbmZvKG1lc3NhZ2UsIiUqcyglMDR4KSAlLTE2cyBtZXNzYWdlIFslMDR4XSAlcyBkaXNwYXRjaGVkICB3cD0lMDR4IGxwPSUwOGx4XG4iLAogICAgICAgICAgICAgICAgICAgICAgICAgU1BZX0luZGVudExldmVsLCAiIiwgaFduZCwgcG5hbWUsIG1zZywgU1BZX0dldE1zZ05hbWUoIG1zZyApLAogICAgICAgICAgICAgICAgICAgICAgICAgd1BhcmFtLCBsUGFyYW0pOwogICAgICAgICBicmVhazsKIAogICAgIGNhc2UgU1BZX0RJU1BBVENITUVTU0FHRTMyOgogCXBuYW1lID0gU1BZX0dldFduZE5hbWUoaFduZCk7Ci0gICAgICAgIGRwcmludGZfbWVzc2FnZShzdGRkZWIsIiUqcyglMDh4KSAlLTE2cyBtZXNzYWdlIFslMDR4XSAlcyBkaXNwYXRjaGVkICB3cD0lMDh4IGxwPSUwOGx4XG4iLAorICAgICAgICBkcHJpbnRmX2luZm8obWVzc2FnZSwiJSpzKCUwOHgpICUtMTZzIG1lc3NhZ2UgWyUwNHhdICVzIGRpc3BhdGNoZWQgIHdwPSUwOHggbHA9JTA4bHhcbiIsCiAgICAgICAgICAgICAgICAgICAgICAgICBTUFlfSW5kZW50TGV2ZWwsICIiLCBoV25kLCBwbmFtZSwgbXNnLCBTUFlfR2V0TXNnTmFtZSggbXNnICksCiAgICAgICAgICAgICAgICAgICAgICAgICB3UGFyYW0sIGxQYXJhbSk7CiAgICAgICAgIGJyZWFrOwpAQCAtNjc1LDEyICs2NzQsMTIgQEAKIAkgICAgcG5hbWUgPSBTUFlfR2V0V25kTmFtZShoV25kKTsKIAogICAgICAgICAgICAgaWYgKGlGbGFnID09IFNQWV9TRU5ETUVTU0FHRTE2KQotICAgICAgICAgICAgICAgIGRwcmludGZfbWVzc2FnZShzdGRkZWIsCisgICAgICAgICAgICAgICAgZHByaW50Zl9pbmZvKG1lc3NhZ2UsCiAJCQkJIiUqcyglMDR4KSAlLTE2cyBtZXNzYWdlIFslMDR4XSAlcyBzZW50IGZyb20gJXMgd3A9JTA0eCBscD0lMDhseFxuIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU1BZX0luZGVudExldmVsLCAiIiwgaFduZCwgcG5hbWUsIG1zZywgU1BZX0dldE1zZ05hbWUoIG1zZyApLCAKIAkJCQl0YXNrTmFtZSwgd1BhcmFtLCBsUGFyYW0gKTsKICAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICBkcHJpbnRmX21lc3NhZ2Uoc3RkZGViLAorICAgICAgICAgICAgICAgIGRwcmludGZfaW5mbyhtZXNzYWdlLAogCQkJCSIlKnMoJTA4eCkgJS0xNnMgbWVzc2FnZSBbJTA0eF0gJXMgc2VudCBmcm9tICVzIHdwPSUwOHggbHA9JTA4bHhcbiIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNQWV9JbmRlbnRMZXZlbCwgIiIsIGhXbmQsIHBuYW1lLCBtc2csIFNQWV9HZXRNc2dOYW1lKCBtc2cgKSwgCiAJCQkJdGFza05hbWUsIHdQYXJhbSwgbFBhcmFtICk7CkBAIC02ODksMTQgKzY4OCwxNCBAQAogCiAgICAgY2FzZSBTUFlfREVGV05EUFJPQzE2OgogCWlmKCBTUFlfRXhjbHVkZURXUCApIHJldHVybjsKLSAgICAgICAgZHByaW50Zl9tZXNzYWdlKHN0ZGRlYiwgIiUqcyglMDR4KSAgRGVmV2luZG93UHJvYzE2OiAlcyBbJTA0eF0gIHdwPSUwNHggbHA9JTA4bHhcbiIsCisgICAgICAgIGRwcmludGZfaW5mbyhtZXNzYWdlLCAiJSpzKCUwNHgpICBEZWZXaW5kb3dQcm9jMTY6ICVzIFslMDR4XSAgd3A9JTA0eCBscD0lMDhseFxuIiwKICAgICAgICAgICAgICAgICAgICAgICAgIFNQWV9JbmRlbnRMZXZlbCwgIiIsIGhXbmQsIFNQWV9HZXRNc2dOYW1lKCBtc2cgKSwKICAgICAgICAgICAgICAgICAgICAgICAgIG1zZywgd1BhcmFtLCBsUGFyYW0gKTsKICAgICAgICAgYnJlYWs7CiAKICAgICBjYXNlIFNQWV9ERUZXTkRQUk9DMzI6CiAJaWYoIFNQWV9FeGNsdWRlRFdQICkgcmV0dXJuOwotICAgICAgICBkcHJpbnRmX21lc3NhZ2Uoc3RkZGViLCAiJSpzKCUwOHgpICBEZWZXaW5kb3dQcm9jMzI6ICVzIFslMDR4XSAgd3A9JTA4eCBscD0lMDhseFxuIiwKKyAgICAgICAgZHByaW50Zl9pbmZvKG1lc3NhZ2UsICIlKnMoJTA4eCkgIERlZldpbmRvd1Byb2MzMjogJXMgWyUwNHhdICB3cD0lMDh4IGxwPSUwOGx4XG4iLAogICAgICAgICAgICAgICAgICAgICAgICAgU1BZX0luZGVudExldmVsLCAiIiwgaFduZCwgU1BZX0dldE1zZ05hbWUoIG1zZyApLAogICAgICAgICAgICAgICAgICAgICAgICAgbXNnLCB3UGFyYW0sIGxQYXJhbSApOwogICAgICAgICBicmVhazsKQEAgLTcxMiw3ICs3MTEsNyBAQAogewogICAgIExQQ1NUUiBwbmFtZTsKIAotICAgIGlmICghZGVidWdnaW5nX21lc3NhZ2UgfHwgU1BZX0VYQ0xVREUobXNnKSB8fAorICAgIGlmICghZGVidWdnaW5nX2luZm8obWVzc2FnZSkgfHwgU1BZX0VYQ0xVREUobXNnKSB8fAogCShTUFlfRXhjbHVkZURXUCAmJiAoaUZsYWcgPT0gU1BZX1JFU1VMVF9ERUZXTkQxNiB8fCBpRmxhZyA9PSBTUFlfUkVTVUxUX0RFRldORDMyKSkgKQogCXJldHVybjsKIApAQCAtNzIxLDM5ICs3MjAsMzkgQEAKICAgICBzd2l0Y2goaUZsYWcpCiAgICAgewogICAgIGNhc2UgU1BZX1JFU1VMVF9ERUZXTkQxNjoKLQlkcHJpbnRmX21lc3NhZ2Uoc3RkZGViLCIlKnMoJTA0eCkgIERlZldpbmRvd1Byb2MxNjogJXMgWyUwNHhdIHJldHVybmVkICUwOGx4XG4iLAorCWRwcmludGZfaW5mbyhtZXNzYWdlLCIlKnMoJTA0eCkgIERlZldpbmRvd1Byb2MxNjogJXMgWyUwNHhdIHJldHVybmVkICUwOGx4XG4iLAogCQkJU1BZX0luZGVudExldmVsLCAiIiwgaFduZCwgU1BZX0dldE1zZ05hbWUoIG1zZyApLCBtc2csIGxSZXR1cm4gKTsKIAlicmVhazsKIAogICAgIGNhc2UgU1BZX1JFU1VMVF9ERUZXTkQzMjoKLQlkcHJpbnRmX21lc3NhZ2Uoc3RkZGViLCIlKnMoJTA4eCkgIERlZldpbmRvd1Byb2MzMjogJXMgWyUwNHhdIHJldHVybmVkICUwOGx4XG4iLAorCWRwcmludGZfaW5mbyhtZXNzYWdlLCIlKnMoJTA4eCkgIERlZldpbmRvd1Byb2MzMjogJXMgWyUwNHhdIHJldHVybmVkICUwOGx4XG4iLAogCQkJU1BZX0luZGVudExldmVsLCAiIiwgaFduZCwgU1BZX0dldE1zZ05hbWUoIG1zZyApLCBtc2csIGxSZXR1cm4gKTsKIAlicmVhazsKIAogICAgIGNhc2UgU1BZX1JFU1VMVF9PSzE2OgogCXBuYW1lID0gU1BZX0dldFduZE5hbWUoaFduZCk7Ci0gICAgICAgIGRwcmludGZfbWVzc2FnZShzdGRkZWIsIiUqcyglMDR4KSAlLTE2cyBtZXNzYWdlIFslMDR4XSAlcyByZXR1cm5lZCAlMDhseFxuIiwKKyAgICAgICAgZHByaW50Zl9pbmZvKG1lc3NhZ2UsIiUqcyglMDR4KSAlLTE2cyBtZXNzYWdlIFslMDR4XSAlcyByZXR1cm5lZCAlMDhseFxuIiwKICAgICAgICAgICAgICAgICAgICAgICAgIFNQWV9JbmRlbnRMZXZlbCwgIiIsIGhXbmQsIHBuYW1lLCBtc2csCiAgICAgICAgICAgICAgICAgICAgICAgICBTUFlfR2V0TXNnTmFtZSggbXNnICksIGxSZXR1cm4gKTsKICAgICAgICAgYnJlYWs7CiAKICAgICBjYXNlIFNQWV9SRVNVTFRfT0szMjoKIAlwbmFtZSA9IFNQWV9HZXRXbmROYW1lKGhXbmQpOwotICAgICAgICBkcHJpbnRmX21lc3NhZ2Uoc3RkZGViLCIlKnMoJTA4eCkgJS0xNnMgbWVzc2FnZSBbJTA0eF0gJXMgcmV0dXJuZWQgJTA4bHhcbiIsCisgICAgICAgIGRwcmludGZfaW5mbyhtZXNzYWdlLCIlKnMoJTA4eCkgJS0xNnMgbWVzc2FnZSBbJTA0eF0gJXMgcmV0dXJuZWQgJTA4bHhcbiIsCiAgICAgICAgICAgICAgICAgICAgICAgICBTUFlfSW5kZW50TGV2ZWwsICIiLCBoV25kLCBwbmFtZSwgbXNnLAogICAgICAgICAgICAgICAgICAgICAgICAgU1BZX0dldE1zZ05hbWUoIG1zZyApLCBsUmV0dXJuICk7CiAgICAgICAgIGJyZWFrOyAKIAogICAgIGNhc2UgU1BZX1JFU1VMVF9JTlZBTElESFdORDE2OgogCXBuYW1lID0gU1BZX0dldFduZE5hbWUoaFduZCk7Ci0gICAgICAgIGRwcmludGZfbWVzc2FnZShzdGRkZWIsIiUqcyglMDR4KSAlLTE2cyBtZXNzYWdlIFslMDR4XSAlcyBIQVMgSU5WQUxJRCBIV05EXG4iLAorICAgICAgICBkcHJpbnRmX3dhcm4obWVzc2FnZSwgIiUqcyglMDR4KSAlLTE2cyBtZXNzYWdlIFslMDR4XSAlcyBIQVMgSU5WQUxJRCBIV05EXG4iLAogICAgICAgICAgICAgICAgICAgICAgICAgU1BZX0luZGVudExldmVsLCAiIiwgaFduZCwgcG5hbWUsIG1zZywKICAgICAgICAgICAgICAgICAgICAgICAgIFNQWV9HZXRNc2dOYW1lKCBtc2cgKSApOwogICAgICAgICBicmVhazsKIAogICAgIGNhc2UgU1BZX1JFU1VMVF9JTlZBTElESFdORDMyOgogCXBuYW1lID0gU1BZX0dldFduZE5hbWUoaFduZCk7Ci0gICAgICAgIGRwcmludGZfbWVzc2FnZShzdGRkZWIsIiUqcyglMDh4KSAlLTE2cyBtZXNzYWdlIFslMDR4XSAlcyBIQVMgSU5WQUxJRCBIV05EXG4iLAorICAgICAgICBkcHJpbnRmX3dhcm4obWVzc2FnZSwgIiUqcyglMDh4KSAlLTE2cyBtZXNzYWdlIFslMDR4XSAlcyBIQVMgSU5WQUxJRCBIV05EXG4iLAogICAgICAgICAgICAgICAgICAgICAgICAgU1BZX0luZGVudExldmVsLCAiIiwgaFduZCwgcG5hbWUsIG1zZywKICAgICAgICAgICAgICAgICAgICAgICAgIFNQWV9HZXRNc2dOYW1lKCBtc2cgKSApOwogICAgICAgICBicmVhazsKQEAgLTc2OSwxMiArNzY4LDEyIEBACiAgICAgaW50IGk7CiAgICAgY2hhciBidWZmZXJbMTAyNF07CiAKLSAgICBpZiAoIWRlYnVnZ2luZ19tZXNzYWdlKSByZXR1cm4gVFJVRTsKKyAgICBpZiAoIWRlYnVnZ2luZ19pbmZvKG1lc3NhZ2UpKSByZXR1cm4gVFJVRTsKIAogICAgIFBST0ZJTEVfR2V0V2luZUluaVN0cmluZyggIlNweSIsICJJbmNsdWRlIiwgIiIsIGJ1ZmZlciwgc2l6ZW9mKGJ1ZmZlcikgKTsKICAgICBpZiAoYnVmZmVyWzBdICYmIHN0cmNtcCggYnVmZmVyLCAiSU5DTFVERUFMTCIgKSkKICAgICB7Ci0gICAgICAgIGRwcmludGZfbWVzc2FnZSggc3RkZGViLCAiU3B5SW5pdDogSW5jbHVkZT0lc1xuIiwgYnVmZmVyICk7CisgICAgICAgIGRwcmludGZfaW5mbyhtZXNzYWdlLCAiU3B5SW5pdDogSW5jbHVkZT0lc1xuIiwgYnVmZmVyICk7CiAgICAgICAgIGZvciAoaSA9IDA7IGkgPD0gU1BZX01BWF9NU0dOVU07IGkrKykKICAgICAgICAgICAgIFNQWV9FeGNsdWRlW2ldID0gKE1lc3NhZ2VUeXBlTmFtZXNbaV0gJiYgIXN0cnN0cihidWZmZXIsTWVzc2FnZVR5cGVOYW1lc1tpXSkpOwogICAgIH0KQEAgLTc4Miw3ICs3ODEsNyBAQAogICAgIFBST0ZJTEVfR2V0V2luZUluaVN0cmluZyggIlNweSIsICJFeGNsdWRlIiwgIiIsIGJ1ZmZlciwgc2l6ZW9mKGJ1ZmZlcikgKTsKICAgICBpZiAoYnVmZmVyWzBdKQogICAgIHsKLSAgICAgICAgZHByaW50Zl9tZXNzYWdlKCBzdGRkZWIsICJTcHlJbml0OiBFeGNsdWRlPSVzXG4iLCBidWZmZXIgKTsKKyAgICAgICAgZHByaW50Zl9pbmZvKG1lc3NhZ2UsICJTcHlJbml0OiBFeGNsdWRlPSVzXG4iLCBidWZmZXIgKTsKICAgICAgICAgaWYgKCFzdHJjbXAoIGJ1ZmZlciwgIkVYQ0xVREVBTEwiICkpCiAgICAgICAgICAgICBmb3IgKGkgPSAwOyBpIDw9IFNQWV9NQVhfTVNHTlVNOyBpKyspIFNQWV9FeGNsdWRlW2ldID0gVFJVRTsKICAgICAgICAgZWxzZQpkaWZmIC0tZ2l0IGEvbWlzYy9zdHJlc3MuYyBiL21pc2Mvc3RyZXNzLmMKaW5kZXggNmI0ZTJmZS4uNTcxNDU1MiAxMDA2NDQKLS0tIGEvbWlzYy9zdHJlc3MuYworKysgYi9taXNjL3N0cmVzcy5jCkBAIC0yLDIyICsyLDIwIEBACiAjaW5jbHVkZSA8bGltaXRzLmg+CiAjaW5jbHVkZSAid2luZG93cy5oIgogI2luY2x1ZGUgInN0cmVzcy5oIgotI2luY2x1ZGUgInN0ZGRlYnVnLmgiCi0vKiAjZGVmaW5lIERFQlVHX1NUUkVTUyAqLwotLyogI3VuZGVmICBERUJVR19TVFJFU1MgKi8KICNpbmNsdWRlICJkZWJ1Zy5oIgogCiAKIGludCBXSU5BUEkgQWxsb2NEaXNrU3BhY2UobG9uZyBsTGVmdCwgVUlOVDE2IHVEcml2ZSkKIHsKLQlkcHJpbnRmX3N0cmVzcyhzdGRuaW1wLCAic3RyZXNzLmRsbDogQWxsb2NEaXNrU3BhY2UgJWQsICVsZFxuIiwgdURyaXZlLCBsTGVmdCk7CisJZHByaW50Zl9maXhtZShzdHJlc3MsICJzdHJlc3MuZGxsOiBBbGxvY0Rpc2tTcGFjZSglZCwgJWxkKSAtIHN0dWJcbiIsIAorCQkgICAgICAgdURyaXZlLCBsTGVmdCk7CiAKIAlyZXR1cm4gMTsKIH0KIAogaW50IFdJTkFQSSBBbGxvY0ZpbGVIYW5kbGVzKGludCBMZWZ0KQogewotCWRwcmludGZfc3RyZXNzKHN0ZGRlYiwgInN0cmVzcy5kbGw6IEFsbG9jRmlsZUhhbmRsZXMgJWRcbiIsIExlZnQpOworCWRwcmludGZfaW5mbyhzdHJlc3MsICJzdHJlc3MuZGxsOiBBbGxvY0ZpbGVIYW5kbGVzKCVkKSAtIHN0dWJcbiIsIExlZnQpOwogCiAJaWYgKExlZnQgPCAwKQogCQlyZXR1cm4gLTE7CkBAIC0yNyw0OCArMjUsNDggQEAKIAogQk9PTDE2IFdJTkFQSSBBbGxvY0dESU1lbShVSU5UMTYgdUxlZnQpCiB7Ci0JZHByaW50Zl9zdHJlc3Moc3RkZGViLCAic3RyZXNzLmRsbDogQWxsb2NHRElNZW0gJWRcbiIsIHVMZWZ0KTsKKwlkcHJpbnRmX2luZm8oc3RyZXNzLCAic3RyZXNzLmRsbDogQWxsb2NHRElNZW0oJWQpIC0gc3R1YlxuIiwgdUxlZnQpOwogCiAJcmV0dXJuIDE7CiB9CiAKIEJPT0wxNiBXSU5BUEkgQWxsb2NNZW0oRFdPUkQgZHdMZWZ0KQogewotCWRwcmludGZfc3RyZXNzKHN0ZG5pbXAsICJzdHJlc3MuZGxsOiBBbGxvY01lbSAlbGRcbiIsIGR3TGVmdCk7CisJZHByaW50Zl9maXhtZShzdHJlc3MsICJzdHJlc3MuZGxsOiBBbGxvY01lbSglbGQpIC0gc3R1YlxuIiwgZHdMZWZ0KTsKIAogCXJldHVybiAxOwogfQogCiBCT09MMTYgV0lOQVBJIEFsbG9jVXNlck1lbShVSU5UMTYgdUNvbnRpZykKIHsKLQlkcHJpbnRmX3N0cmVzcyhzdGRkZWIsICJzdHJlc3MuZGxsOiBBbGxvY1VzZXJNZW0gJWRcbiIsIHVDb250aWcpOworCWRwcmludGZfaW5mbyhzdHJlc3MsICJzdHJlc3MuZGxsOiBBbGxvY1VzZXJNZW0gJWRcbiIsIHVDb250aWcpOwogCiAJcmV0dXJuIDE7CiB9CiAKIHZvaWQgV0lOQVBJIEZyZWVBbGxNZW0odm9pZCkKIHsKLQlkcHJpbnRmX3N0cmVzcyhzdGRkZWIsICJzdHJlc3MuZGxsOiBGcmVlQWxsTWVtXG4iKTsKKwlkcHJpbnRmX2luZm8oc3RyZXNzLCAic3RyZXNzLmRsbDogRnJlZUFsbE1lbVxuIik7CiB9CiAKIHZvaWQgV0lOQVBJIEZyZWVBbGxHRElNZW0odm9pZCkKIHsKLQlkcHJpbnRmX3N0cmVzcyhzdGRkZWIsICJzdHJlc3MuZGxsOiBGcmVlQWxsR0RJTWVtXG4iKTsKKwlkcHJpbnRmX2luZm8oc3RyZXNzLCAic3RyZXNzLmRsbDogRnJlZUFsbEdESU1lbVxuIik7CiB9CiAKIHZvaWQgV0lOQVBJIEZyZWVBbGxVc2VyTWVtKHZvaWQpCiB7Ci0JZHByaW50Zl9zdHJlc3Moc3RkZGViLCAic3RyZXNzLmRsbDogRnJlZUFsbFVzZXJNZW1cbiIpOworCWRwcmludGZfaW5mbyhzdHJlc3MsICJzdHJlc3MuZGxsOiBGcmVlQWxsVXNlck1lbVxuIik7CiB9CiAKIHZvaWQgV0lOQVBJIEdldEZyZWVBbGxVc2VyTWVtKHZvaWQpCiB7Ci0gICAgICAgZHByaW50Zl9zdHJlc3Moc3RkZGViLCAic3RyZXNzLmRsbDogR2V0RnJlZUFsbFVzZXJNZW1cbiIpOworICAgICAgIGRwcmludGZfaW5mbyhzdHJlc3MsICJzdHJlc3MuZGxsOiBHZXRGcmVlQWxsVXNlck1lbVxuIik7CiB9CiAKIGludCBXSU5BUEkgR2V0RnJlZUZpbGVIYW5kbGVzKHZvaWQpCiB7Ci0JZHByaW50Zl9zdHJlc3Moc3RkZGViLCAic3RyZXNzLmRsbDogR2V0RnJlZUZpbGVIYW5kbGVzXG4iKTsKKwlkcHJpbnRmX2luZm8oc3RyZXNzLCAic3RyZXNzLmRsbDogR2V0RnJlZUZpbGVIYW5kbGVzXG4iKTsKIAogI2lmbmRlZiBPUEVOX01BWAogCXJldHVybiBfUE9TSVhfT1BFTl9NQVg7CkBAIC03OSwxMCArNzcsMTAgQEAKIAogdm9pZCBXSU5BUEkgVW5BbGxvY0Rpc2tTcGFjZShVSU5UMTYgZHJpdmUpCiB7Ci0JZHByaW50Zl9zdHJlc3Moc3RkZGViLCAic3RyZXNzLmRsbDogVW5BbGxvY0Rpc2tTcGFjZSAlZFxuIiwgZHJpdmUpOworCWRwcmludGZfaW5mbyhzdHJlc3MsICJzdHJlc3MuZGxsOiBVbkFsbG9jRGlza1NwYWNlICVkXG4iLCBkcml2ZSk7CiB9CiAKIHZvaWQgV0lOQVBJIFVuQWxsb2NGaWxlSGFuZGxlcyh2b2lkKQogewotCWRwcmludGZfc3RyZXNzKHN0ZGRlYiwgInN0cmVzcy5kbGw6IEdldEZyZWVBbGxVc2VyTWVtXG4iKTsKKwlkcHJpbnRmX2luZm8oc3RyZXNzLCAic3RyZXNzLmRsbDogR2V0RnJlZUFsbFVzZXJNZW1cbiIpOwogfQpkaWZmIC0tZ2l0IGEvbWlzYy90b29saGVscC5jIGIvbWlzYy90b29saGVscC5jCmluZGV4IDJlNDg1YWUuLjllYzhjNmYgMTAwNjQ0Ci0tLSBhL21pc2MvdG9vbGhlbHAuYworKysgYi9taXNjL3Rvb2xoZWxwLmMKQEAgLTEyLDcgKzEyLDYgQEAKICNpbmNsdWRlICJ3aW5kb3dzLmgiCiAjaW5jbHVkZSAid2luLmgiCiAjaW5jbHVkZSAidG9vbGhlbHAuaCIKLSNpbmNsdWRlICJzdGRkZWJ1Zy5oIgogI2luY2x1ZGUgImRlYnVnLmgiCiAjaW5jbHVkZSAiaGVhcC5oIgogCkBAIC0zNiw3ICszNSw3IEBACiB7CiAgICAgaW50CWk7CiAKLSAgICBkcHJpbnRmX3Rvb2xoZWxwKCBzdGRkZWIsICJOb3RpZnlSZWdpc3RlcigleCwlbHgsJXgpIGNhbGxlZC5cbiIsCisgICAgZHByaW50Zl9pbmZvKHRvb2xoZWxwLCAiTm90aWZ5UmVnaXN0ZXIoJXgsJWx4LCV4KSBjYWxsZWQuXG4iLAogICAgICAgICAgICAgICAgICAgICAgIGh0YXNrLCAoRFdPUkQpbHBmbkNhbGxiYWNrLCB3RmxhZ3MgKTsKICAgICBpZiAoIWh0YXNrKSBodGFzayA9IEdldEN1cnJlbnRUYXNrKCk7CiAgICAgZm9yIChpPTA7aTxucm9mbm90aWZ5cztpKyspCkBAIC02Miw3ICs2MSw3IEBACiB7CiAgICAgaW50CWk7CiAgICAgCi0gICAgZHByaW50Zl90b29saGVscCggc3RkZGViLCAiTm90aWZ5VW5yZWdpc3RlcigleCkgY2FsbGVkLlxuIiwgaHRhc2sgKTsKKyAgICBkcHJpbnRmX2luZm8odG9vbGhlbHAsICJOb3RpZnlVbnJlZ2lzdGVyKCV4KSBjYWxsZWQuXG4iLCBodGFzayApOwogICAgIGlmICghaHRhc2spIGh0YXNrID0gR2V0Q3VycmVudFRhc2soKTsKICAgICBmb3IgKGk9bnJvZm5vdGlmeXM7aS0tOykKICAgICAgICAgaWYgKG5vdGlmeXNbaV0uaHRhc2s9PWh0YXNrKQpkaWZmIC0tZ2l0IGEvbWlzYy90d2Vhay5jIGIvbWlzYy90d2Vhay5jCmluZGV4IDUzZDdmNDIuLmUzOWY5NWEgMTAwNjQ0Ci0tLSBhL21pc2MvdHdlYWsuYworKysgYi9taXNjL3R3ZWFrLmMKQEAgLTIxMCw3ICsyMTAsNyBAQAogCSAgICBQUk9GSUxFX0dldFdpbmVJbmlJbnQoIlR3ZWFrLkNvbG9ycyIsICJQZW4wMDk1LkdybiIsIDB4MDApLAogCSAgICBQUk9GSUxFX0dldFdpbmVJbmlJbnQoIlR3ZWFrLkNvbG9ycyIsICJQZW4wMDk1LkJsdSIsIDB4MDApKSk7CiAKLSAgICBkcHJpbnRmX3R3ZWFrKHN0ZGRlYiwgIlRXRUFLX1ZhckluaXQ6IFVzaW5nICVzIGxvb2sgYW5kIGZlZWwuXG4iLAorICAgIGRwcmludGZfaW5mbyh0d2VhaywgIlRXRUFLX1ZhckluaXQ6IFVzaW5nICVzIGxvb2sgYW5kIGZlZWwuXG4iLAogCQkgIFRXRUFLX1dpbjk1TG9vayA/ICJXaW45NSIgOiAiV2luMy4xIik7CiAgICAgcmV0dXJuIDE7CiB9CmRpZmYgLS1naXQgYS9taXNjL3Zlci5jIGIvbWlzYy92ZXIuYwppbmRleCBjNTQ4ZGE3Li5kNThkZjhhIDEwMDY0NAotLS0gYS9taXNjL3Zlci5jCisrKyBiL21pc2MvdmVyLmMKQEAgLTE3LDcgKzE3LDYgQEAKICNpbmNsdWRlICJsemV4cGFuZC5oIgogI2luY2x1ZGUgIm1vZHVsZS5oIgogI2luY2x1ZGUgIm5lZXhlLmgiCi0jaW5jbHVkZSAic3RkZGVidWcuaCIKICNpbmNsdWRlICJkZWJ1Zy5oIgogI2luY2x1ZGUgInhtYWxsb2MuaCIKICNpbmNsdWRlICJ3aW5yZWcuaCIKQEAgLTMzLDcgKzMyLDcgQEAKICAqICAgICAgY2hhciBjb25zdCAqIHRlc3RzdHJpbmcsCiAgKiAgICAgIGNoYXIgY29uc3QgKiBlcGlsb2d1ZSApCiAgKgotICogICBUaGlzIGZ1bmN0aW9uIHdpbGwgcHJpbnQgdmlhIGRwcmludGZfdmVyIHRvIHN0ZGRlYiB0aGUgcHJvbG9ndWUgc3RyaW5nLAorICogICBUaGlzIGZ1bmN0aW9uIHdpbGwgcHJpbnQgdmlhIGRwcmludGZbX112ZXIgdG8gc3RkZGViIHRoZSBwcm9sb2d1ZSBzdHJpbmcsCiAgKiAgIGZvbGxvd2VkIGJ5IHRoZSBhZGRyZXNzIG9mIHRlc3RzdHJpbmcgYW5kIHRoZSBzdHJpbmcgaXQgY29udGFpbnMgaWYKICAqICAgdGVzdHN0cmluZyBpcyBub24tbnVsbCBvciAiKG51bGwpIiBvdGhlcndpc2UsIGFuZCB0aGVuIHRoZSBlcGlsb2d1ZQogICogICBzdHJpbmcgZm9sbG93ZWQgYnkgYSBuZXcgbGluZS4KQEAgLTQ2LDcgKzQ1LDcgQEAKICAqICAgICAgICAgdGhpcyBmdW5jdGlvbiBzaG91bGQgZml4IHRoZSBwcm9ibGVtLgogICogICAgICAxNS1GZWItMTk5OCBEaW1pdHJpZSBQYXVuIChkaW1pQGNzLnRvcm9udG8uZWR1KQogICogICAgICAgICBNb2RpZmllZCBpdCB0byBtYWtlIGl0IHByaW50IHRoZSBtZXNzYWdlIHVzaW5nIG9ubHkgb25lCi0gKiAgICAgICAgIGRwcmludGZfdmVyIGNhbGwuCisgKiAgICAgICAgIGRwcmludGZbX112ZXIgY2FsbC4KICAqCiAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAKQEAgLTU1LDcgKzU0LDcgQEAKICAgICBjaGFyIGNvbnN0ICogdGVzdHN0cmluZywKICAgICBjaGFyIGNvbnN0ICogZXBpbG9ndWUgKQogewotICAgIGRwcmludGZfdmVyKHN0ZGRlYiwgIiVzICVwIChcIiVzXCIpICVzXG4iLCBwcm9sb2d1ZSwgCisgICAgZHByaW50Zl9pbmZvKHZlciwgIiVzICVwIChcIiVzXCIpICVzXG4iLCBwcm9sb2d1ZSwgCiAJCSh2b2lkIGNvbnN0ICopIHRlc3RzdHJpbmcsIAogCQl0ZXN0c3RyaW5nID8gdGVzdHN0cmluZyA6ICIobnVsbCkiLAogCQllcGlsb2d1ZSk7CkBAIC02Myw3ICs2Miw3IEBACiAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICAqCi0gKiAgIFRoaXMgZnVuY3Rpb24gd2lsbCBwcmludCB2aWEgZHByaW50Zl92ZXIgdG8gc3RkZGViIGRlYnVnIGluZm8gcmVnYXJkaW5nCisgKiAgIFRoaXMgZnVuY3Rpb24gd2lsbCBwcmludCB2aWEgZHByaW50ZltfXXZlciB0byBzdGRkZWIgZGVidWcgaW5mbyByZWdhcmRpbmcKICAqICAgdGhlIGZpbGUgaW5mbyBzdHJ1Y3R1cmUgdmZmaS4KICAqICAgICAgMTUtRmViLTE5OTggRGltaXRyaWUgUGF1biAoZGltaUBjcy50b3JvbnRvLmVkdSkKICAqICAgICAgQWRkZWQgdGhpcyBmdW5jdGlvbiB0byBjbGVhbiB1cCB0aGUgY29kZS4KQEAgLTcxLDEwICs3MCw5IEBACiAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiBzdGF0aWMgdm9pZCBwcmludF92ZmZpX2RlYnVnKFZTX0ZJWEVERklMRUlORk8gKnZmZmkpCiB7Ci0gICAgICAgIGNoYXIgYnVmZlsxMDI0XTsKLQljaGFyICpwOworICAgICAgICBkYmdfZGVjbF9zdHIodmVyLCAxMDI0KTsKIAotCWRwcmludGZfdmVyKHN0ZGRlYiwiIHN0cnVjdHZlcnNpb249MHglbHguMHglbHgsIGZpbGV2ZXJzaW9uPTB4JWx4LjB4JWx4LCBwcm9kdWN0dmVyc2lvbj0weCVseC4weCVseCwgZmxhZ21hc2s9MHglbHgsIGZsYWdzPSVzJXMlcyVzJXMlc1xuIiwKKwlkcHJpbnRmX2luZm8odmVyLCIgc3RydWN0dmVyc2lvbj0weCVseC4weCVseCwgZmlsZXZlcnNpb249MHglbHguMHglbHgsIHByb2R1Y3R2ZXJzaW9uPTB4JWx4LjB4JWx4LCBmbGFnbWFzaz0weCVseCwgZmxhZ3M9JXMlcyVzJXMlcyVzXG4iLAogCQkgICAgKHZmZmktPmR3U3RydWNWZXJzaW9uPj4xNiksdmZmaS0+ZHdTdHJ1Y1ZlcnNpb24mMHhGRkZGLAogCQkgICAgdmZmaS0+ZHdGaWxlVmVyc2lvbk1TLHZmZmktPmR3RmlsZVZlcnNpb25MUywKIAkJICAgIHZmZmktPmR3UHJvZHVjdFZlcnNpb25NUyx2ZmZpLT5kd1Byb2R1Y3RWZXJzaW9uTFMsCkBAIC04Nyw5OCArODUsOTYgQEAKIAkJICAgICh2ZmZpLT5kd0ZpbGVGbGFncyAmIFZTX0ZGX1NQRUNJQUxCVUlMRCkgPyAiU1BFQ0lBTEJVSUxELCIgOiAiIgogCQkgICAgKTsKIAotCXAgPSBidWZmOwotCXArPXNwcmludGYocCwiIE9TPTB4JWx4LjB4JWx4ICgiLAorCWRzcHJpbnRmKHZlciwiIE9TPTB4JWx4LjB4JWx4ICIsCiAJCSh2ZmZpLT5kd0ZpbGVPUyYweEZGRkYwMDAwKT4+MTYsCiAJCXZmZmktPmR3RmlsZU9TJjB4MDAwMEZGRkYKIAkpOwogCXN3aXRjaCAodmZmaS0+ZHdGaWxlT1MmMHhGRkZGMDAwMCkgewotCWNhc2UgVk9TX0RPUzpwKz1zcHJpbnRmKHAsIkRPUywiKTticmVhazsKLQljYXNlIFZPU19PUzIxNjpwKz1zcHJpbnRmKHAsIk9TLzItMTYsIik7YnJlYWs7Ci0JY2FzZSBWT1NfT1MyMzI6cCs9c3ByaW50ZihwLCJPUy8yLTMyLCIpO2JyZWFrOwotCWNhc2UgVk9TX05UOnArPXNwcmludGYocCwiTlQsIik7YnJlYWs7CisJY2FzZSBWT1NfRE9TOmRzcHJpbnRmKHZlciwiRE9TLCIpO2JyZWFrOworCWNhc2UgVk9TX09TMjE2OmRzcHJpbnRmKHZlciwiT1MvMi0xNiwiKTticmVhazsKKwljYXNlIFZPU19PUzIzMjpkc3ByaW50Zih2ZXIsIk9TLzItMzIsIik7YnJlYWs7CisJY2FzZSBWT1NfTlQ6ZHNwcmludGYodmVyLCJOVCwiKTticmVhazsKIAljYXNlIFZPU19VTktOT1dOOgogCWRlZmF1bHQ6Ci0JCXArPXNwcmludGYocCwiVU5LTk9XTigweCVseCksIix2ZmZpLT5kd0ZpbGVPUyYweEZGRkYwMDAwKTticmVhazsKKwkJZHNwcmludGYodmVyLCJVTktOT1dOKDB4JWx4KSwiLHZmZmktPmR3RmlsZU9TJjB4RkZGRjAwMDApO2JyZWFrOwogCX0KIAlzd2l0Y2ggKHZmZmktPmR3RmlsZU9TICYgMHhGRkZGKSB7Ci0JY2FzZSBWT1NfX0JBU0U6cCs9c3ByaW50ZihwLCJCQVNFIik7YnJlYWs7Ci0JY2FzZSBWT1NfX1dJTkRPV1MxNjpwKz1zcHJpbnRmKHAsIldJTjE2Iik7YnJlYWs7Ci0JY2FzZSBWT1NfX1dJTkRPV1MzMjpwKz1zcHJpbnRmKHAsIldJTjMyIik7YnJlYWs7Ci0JY2FzZSBWT1NfX1BNMTY6cCs9c3ByaW50ZihwLCJQTTE2Iik7YnJlYWs7Ci0JY2FzZSBWT1NfX1BNMzI6cCs9c3ByaW50ZihwLCJQTTMyIik7YnJlYWs7Ci0JZGVmYXVsdDpwKz1zcHJpbnRmKHAsIlVOS05PV04oMHglbHgpIix2ZmZpLT5kd0ZpbGVPUyYweEZGRkYpO2JyZWFrOworCWNhc2UgVk9TX19CQVNFOmRzcHJpbnRmKHZlciwiQkFTRSIpO2JyZWFrOworCWNhc2UgVk9TX19XSU5ET1dTMTY6ZHNwcmludGYodmVyLCJXSU4xNiIpO2JyZWFrOworCWNhc2UgVk9TX19XSU5ET1dTMzI6ZHNwcmludGYodmVyLCJXSU4zMiIpO2JyZWFrOworCWNhc2UgVk9TX19QTTE2OmRzcHJpbnRmKHZlciwiUE0xNiIpO2JyZWFrOworCWNhc2UgVk9TX19QTTMyOmRzcHJpbnRmKHZlciwiUE0zMiIpO2JyZWFrOworCWRlZmF1bHQ6ZHNwcmludGYodmVyLCJVTktOT1dOKDB4JWx4KSIsdmZmaS0+ZHdGaWxlT1MmMHhGRkZGKTticmVhazsKIAl9Ci0JcCs9c3ByaW50ZihwLCIpIik7Ci0JZHByaW50Zl92ZXIoc3RkZGViLCAiJXNcbiIsIGJ1ZmYpOworCWRwcmludGZfaW5mbyh2ZXIsICIoJXMpXG4iLCBkYmdfc3RyKHZlcikpOwogCi0JcCA9IGJ1ZmY7CisJZGJnX3Jlc2V0X3N0cih2ZXIpOwogCXN3aXRjaCAodmZmaS0+ZHdGaWxlVHlwZSkgewogCWRlZmF1bHQ6CiAJY2FzZSBWRlRfVU5LTk9XTjoKLQkJcCs9c3ByaW50ZihwLCJmaWxldHlwZT1Vbmtub3duKDB4JWx4KSIsdmZmaS0+ZHdGaWxlVHlwZSk7CisJCWRzcHJpbnRmKHZlciwiZmlsZXR5cGU9VW5rbm93bigweCVseCkiLHZmZmktPmR3RmlsZVR5cGUpOwogCQlicmVhazsKLQljYXNlIFZGVF9BUFA6cCs9c3ByaW50ZihwLCJmaWxldHlwZT1BUFAsIik7YnJlYWs7Ci0JY2FzZSBWRlRfRExMOnArPXNwcmludGYocCwiZmlsZXR5cGU9RExMLCIpO2JyZWFrOworCWNhc2UgVkZUX0FQUDpkc3ByaW50Zih2ZXIsImZpbGV0eXBlPUFQUCwiKTticmVhazsKKwljYXNlIFZGVF9ETEw6ZHNwcmludGYodmVyLCJmaWxldHlwZT1ETEwsIik7YnJlYWs7CiAJY2FzZSBWRlRfRFJWOgotCQlwKz1zcHJpbnRmKHAsImZpbGV0eXBlPURSViwiKTsKKwkJZHNwcmludGYodmVyLCJmaWxldHlwZT1EUlYsIik7CiAJCXN3aXRjaCh2ZmZpLT5kd0ZpbGVTdWJ0eXBlKSB7CiAJCWRlZmF1bHQ6CiAJCWNhc2UgVkZUMl9VTktOT1dOOgotCQkJcCs9c3ByaW50ZihwLCJVTktOT1dOKDB4JWx4KSIsdmZmaS0+ZHdGaWxlU3VidHlwZSk7CisJCQlkc3ByaW50Zih2ZXIsIlVOS05PV04oMHglbHgpIix2ZmZpLT5kd0ZpbGVTdWJ0eXBlKTsKIAkJCWJyZWFrOwogCQljYXNlIFZGVDJfRFJWX1BSSU5URVI6Ci0JCQlwKz1zcHJpbnRmKHAsIlBSSU5URVIiKTsKKwkJCWRzcHJpbnRmKHZlciwiUFJJTlRFUiIpOwogCQkJYnJlYWs7CiAJCWNhc2UgVkZUMl9EUlZfS0VZQk9BUkQ6Ci0JCQlwKz1zcHJpbnRmKHAsIktFWUJPQVJEIik7CisJCQlkc3ByaW50Zih2ZXIsIktFWUJPQVJEIik7CiAJCQlicmVhazsKIAkJY2FzZSBWRlQyX0RSVl9MQU5HVUFHRToKLQkJCXArPXNwcmludGYocCwiTEFOR1VBR0UiKTsKKwkJCWRzcHJpbnRmKHZlciwiTEFOR1VBR0UiKTsKIAkJCWJyZWFrOwogCQljYXNlIFZGVDJfRFJWX0RJU1BMQVk6Ci0JCQlwKz1zcHJpbnRmKHAsIkRJU1BMQVkiKTsKKwkJCWRzcHJpbnRmKHZlciwiRElTUExBWSIpOwogCQkJYnJlYWs7CiAJCWNhc2UgVkZUMl9EUlZfTU9VU0U6Ci0JCQlwKz1zcHJpbnRmKHAsIk1PVVNFIik7CisJCQlkc3ByaW50Zih2ZXIsIk1PVVNFIik7CiAJCQlicmVhazsKIAkJY2FzZSBWRlQyX0RSVl9ORVRXT1JLOgotCQkJcCs9c3ByaW50ZihwLCJORVRXT1JLIik7CisJCQlkc3ByaW50Zih2ZXIsIk5FVFdPUksiKTsKIAkJCWJyZWFrOwogCQljYXNlIFZGVDJfRFJWX1NZU1RFTToKLQkJCXArPXNwcmludGYocCwiU1lTVEVNIik7CisJCQlkc3ByaW50Zih2ZXIsIlNZU1RFTSIpOwogCQkJYnJlYWs7CiAJCWNhc2UgVkZUMl9EUlZfSU5TVEFMTEFCTEU6Ci0JCQlwKz1zcHJpbnRmKHAsIklOU1RBTExBQkxFIik7CisJCQlkc3ByaW50Zih2ZXIsIklOU1RBTExBQkxFIik7CiAJCQlicmVhazsKIAkJY2FzZSBWRlQyX0RSVl9TT1VORDoKLQkJCXArPXNwcmludGYocCwiU09VTkQiKTsKKwkJCWRzcHJpbnRmKHZlciwiU09VTkQiKTsKIAkJCWJyZWFrOwogCQljYXNlIFZGVDJfRFJWX0NPTU06Ci0JCQlwKz1zcHJpbnRmKHAsIkNPTU0iKTsKKwkJCWRzcHJpbnRmKHZlciwiQ09NTSIpOwogCQkJYnJlYWs7CiAJCWNhc2UgVkZUMl9EUlZfSU5QVVRNRVRIT0Q6Ci0JCQlwKz1zcHJpbnRmKHAsIklOUFVUTUVUSE9EIik7CisJCQlkc3ByaW50Zih2ZXIsIklOUFVUTUVUSE9EIik7CiAJCQlicmVhazsKIAkJfQogCQlicmVhazsKIAljYXNlIFZGVF9GT05UOgotCQlwKz1zcHJpbnRmKHAsImZpbGV0eXBlPUZPTlQuIik7CisJCWRzcHJpbnRmKHZlciwiZmlsZXR5cGU9Rk9OVC4iKTsKIAkJc3dpdGNoICh2ZmZpLT5kd0ZpbGVTdWJ0eXBlKSB7CiAJCWRlZmF1bHQ6Ci0JCQlwKz1zcHJpbnRmKHAsIlVOS05PV04oMHglbHgpIix2ZmZpLT5kd0ZpbGVTdWJ0eXBlKTsKKwkJCWRzcHJpbnRmKHZlciwiVU5LTk9XTigweCVseCkiLHZmZmktPmR3RmlsZVN1YnR5cGUpOwogCQkJYnJlYWs7Ci0JCWNhc2UgVkZUMl9GT05UX1JBU1RFUjpwKz1zcHJpbnRmKHAsIlJBU1RFUiIpO2JyZWFrOwotCQljYXNlIFZGVDJfRk9OVF9WRUNUT1I6cCs9c3ByaW50ZihwLCJWRUNUT1IiKTticmVhazsKLQkJY2FzZSBWRlQyX0ZPTlRfVFJVRVRZUEU6cCs9c3ByaW50ZihwLCJUUlVFVFlQRSIpO2JyZWFrOworCQljYXNlIFZGVDJfRk9OVF9SQVNURVI6ZHNwcmludGYodmVyLCJSQVNURVIiKTticmVhazsKKwkJY2FzZSBWRlQyX0ZPTlRfVkVDVE9SOmRzcHJpbnRmKHZlciwiVkVDVE9SIik7YnJlYWs7CisJCWNhc2UgVkZUMl9GT05UX1RSVUVUWVBFOmRzcHJpbnRmKHZlciwiVFJVRVRZUEUiKTticmVhazsKIAkJfQogCQlicmVhazsKLQljYXNlIFZGVF9WWEQ6cCs9c3ByaW50ZihwLCJmaWxldHlwZT1WWEQiKTticmVhazsKLQljYXNlIFZGVF9TVEFUSUNfTElCOnArPXNwcmludGYocCwiZmlsZXR5cGU9U1RBVElDX0xJQiIpO2JyZWFrOworCWNhc2UgVkZUX1ZYRDpkc3ByaW50Zih2ZXIsImZpbGV0eXBlPVZYRCIpO2JyZWFrOworCWNhc2UgVkZUX1NUQVRJQ19MSUI6ZHNwcmludGYodmVyLCJmaWxldHlwZT1TVEFUSUNfTElCIik7YnJlYWs7CiAJfQotCWRwcmludGZfdmVyKHN0ZGRlYiwgIiVzXG4iLCBidWZmKTsKKwlkcHJpbnRmX2luZm8odmVyLCAiJXNcbiIsIGRiZ19zdHIodmVyKSk7CiAKLQlkcHJpbnRmX3ZlcihzdGRkZWIsICIgIGZpbGVkYXRhPTB4JWx4LjB4JWx4XG4iLAorCWRwcmludGZfaW5mbyh2ZXIsICIgIGZpbGVkYXRhPTB4JWx4LjB4JWx4XG4iLAogCQkgICAgdmZmaS0+ZHdGaWxlRGF0ZU1TLHZmZmktPmR3RmlsZURhdGVMUyk7CiB9CiAKQEAgLTMyMCwxMyArMzE2LDEzIEBACiAJbmVoZG9mZnNldCA9IExaVEVMTChsemZkKTsKIAlMWlJFQUQoJm5laGQpOwogCWlmIChuZWhkLnJlc291cmNlX3RhYl9vZmZzZXQ9PW5laGQucm5hbWVfdGFiX29mZnNldCkgewotCQlkcHJpbnRmX3ZlcihzdGRkZWIsIm5vIHJlc291cmNlcyBpbiBORSBkbGxcbiIpOworCQlkcHJpbnRmX2luZm8odmVyLCJubyByZXNvdXJjZXMgaW4gTkUgZGxsXG4iKTsKIAkJcmV0dXJuIDA7CiAJfQogCUxaU2VlazMyKGx6ZmQsbmVoZC5yZXNvdXJjZV90YWJfb2Zmc2V0K25laGRvZmZzZXQsU0VFS19TRVQpOwogCUxaUkVBRCgmc2hpZnRjb3VudCk7Ci0JZHByaW50Zl92ZXIoc3RkZGViLCJzaGlmdGNvdW50IGlzICVkXG4iLHNoaWZ0Y291bnQpOwotCWRwcmludGZfdmVyKHN0ZGRlYiwicmVhZGluZyByZXNvdXJjZSB0eXBlaW5mbyBkaXIuXG4iKTsKKwlkcHJpbnRmX2luZm8odmVyLCJzaGlmdGNvdW50IGlzICVkXG4iLHNoaWZ0Y291bnQpOworCWRwcmludGZfaW5mbyh2ZXIsInJlYWRpbmcgcmVzb3VyY2UgdHlwZWluZm8gZGlyLlxuIik7CiAKIAlpZiAoIUhJV09SRCh0eXBlaWQpKSB0eXBlaWQgPSAoU0VHUFRSKShMT1dPUkQodHlwZWlkKSB8IDB4ODAwMCk7CiAJaWYgKCFISVdPUkQocmVzaWQpKSAgcmVzaWQgID0gKFNFR1BUUikoTE9XT1JEKHJlc2lkKSB8IDB4ODAwMCk7CkBAIC0zMzYsNyArMzMyLDcgQEAKIAkJTFpSRUFEKCZ0aSk7CiAJCWlmICghdGkudHlwZV9pZCkKIAkJCXJldHVybiAwOwotCQlkcHJpbnRmX3ZlcihzdGRkZWIsIiAgICB0aS50eXBlaWQgPSUwNHgsY291bnQ9JWRcbiIsdGkudHlwZV9pZCx0aS5jb3VudCk7CisJCWRwcmludGZfaW5mbyh2ZXIsIiAgICB0aS50eXBlaWQgPSUwNHgsY291bnQ9JWRcbiIsdGkudHlwZV9pZCx0aS5jb3VudCk7CiAKIAkJc2tpcGZsYWc9MDsKIAkJaWYgKCFISVdPUkQodHlwZWlkKSkgewpAQCAtMzYwLDcgKzM1Niw3IEBACiAJCQkJc3RyPXhtYWxsb2MobGVuKTsKIAkJCQlpZiAobGVuIT1MWlJlYWQzMihsemZkLHN0cixsZW4pKQogCQkJCQlyZXR1cm4gMDsKLQkJCQlkcHJpbnRmX3ZlcihzdGRkZWIsInJlYWQgJXMgdG8gY29tcGFyZSBpdCB3aXRoICVzXG4iLAorCQkJCWRwcmludGZfaW5mbyh2ZXIsInJlYWQgJXMgdG8gY29tcGFyZSBpdCB3aXRoICVzXG4iLAogCQkJCQlzdHIsKGNoYXIqKVBUUl9TRUdfVE9fTElOKHR5cGVpZCkKIAkJCQkpOwogCQkJCWlmIChsc3RyY21waTMyQShzdHIsKGNoYXIqKVBUUl9TRUdfVE9fTElOKHR5cGVpZCkpKQpAQCAtMzc4LDcgKzM3NCw3IEBACiAJCQlpbnQJbGVuOwogCiAJCQlMWlJFQUQoJm5pKTsKLQkJCWRwcmludGZfdmVyKHN0ZGRlYiwiCW5pLmlkPSU0eCxvZmZzZXQ9JWQsbGVuZ3RoPSVkXG4iLAorCQkJZHByaW50Zl9pbmZvKHZlciwiCW5pLmlkPSU0eCxvZmZzZXQ9JWQsbGVuZ3RoPSVkXG4iLAogCQkJCW5pLmlkLG5pLm9mZnNldCxuaS5sZW5ndGgKIAkJCSk7CiAJCQlza2lwZmxhZz0xOwpAQCAtNDAxLDcgKzM5Nyw3IEBACiAJCQkJCXN0cj14bWFsbG9jKGxlbik7CiAJCQkJCWlmIChsZW4hPUxaUmVhZDMyKGx6ZmQsc3RyLGxlbikpCiAJCQkJCQlyZXR1cm4gMDsKLQkJCQkJZHByaW50Zl92ZXIoc3RkZGViLCJyZWFkICVzIHRvIGNvbXBhcmUgaXQgd2l0aCAlc1xuIiwKKwkJCQkJZHByaW50Zl9pbmZvKHZlciwicmVhZCAlcyB0byBjb21wYXJlIGl0IHdpdGggJXNcbiIsCiAJCQkJCQlzdHIsKGNoYXIqKVBUUl9TRUdfVE9fTElOKHR5cGVpZCkKIAkJCQkJKTsKIAkJCQkJaWYgKCFsc3RyY21waTMyQShzdHIsKGNoYXIqKVBUUl9TRUdfVE9fTElOKHR5cGVpZCkpKQpAQCAtNDIwLDcgKzQxNiw3IEBACiAJCQkJZnJlZShyZGF0YSk7CiAJCQkJcmV0dXJuIDA7CiAJCQl9Ci0JCQlkcHJpbnRmX3ZlcihzdGRkZWIsInJlc291cmNlIGZvdW5kLlxuIik7CisJCQlkcHJpbnRmX2luZm8odmVyLCJyZXNvdXJjZSBmb3VuZC5cbiIpOwogCQkJKnJlc2RhdGE9IChCWVRFKilyZGF0YTsKIAkJCSpyZXNsZW4JPSBsZW47CiAJCQlyZXR1cm4gMTsKQEAgLTQ0OSw3ICs0NDUsNyBAQAogCXBlaGRvZmZzZXQgPSBMWlRFTEwobHpmZCk7CiAJTFpSRUFEKCZwZWhkKTsKIAlyZXNkaXIgPSBwZWhkLk9wdGlvbmFsSGVhZGVyLkRhdGFEaXJlY3RvcnlbSU1BR0VfRklMRV9SRVNPVVJDRV9ESVJFQ1RPUlldOwotCWRwcmludGZfdmVyKHN0ZGRlYiwiZmluZF9wZV9yZXNvdXJjZSguLCVwLCVwLC4uLi4pXG4iLHR5cGVpZCxyZXNpZCk7CisJZHByaW50Zl9pbmZvKHZlciwiZmluZF9wZV9yZXNvdXJjZSguLCVwLCVwLC4uLi4pXG4iLHR5cGVpZCxyZXNpZCk7CiAJaWYgKCFyZXNkaXIuU2l6ZSkgewogCQlmcHJpbnRmKHN0ZGVyciwibWlzYy92ZXIuYzpmaW5kX3BlX3Jlc291cmNlKCkgbm8gcmVzb3VyY2UgZGlyZWN0b3J5IGZvdW5kIGluIFBFIGZpbGUuXG4iKTsKIAkJcmV0dXJuIDA7CkBAIC00ODQsMjAgKzQ4MCwyMCBAQAogCXJlc291cmNlZGlyID0gKExQSU1BR0VfUkVTT1VSQ0VfRElSRUNUT1JZKShpbWFnZStyZXNkaXIuVmlydHVhbEFkZHJlc3MpOwogCXhyZXNkaXIgPSBHZXRSZXNEaXJFbnRyeVcocmVzb3VyY2VkaXIsdHlwZWlkLChEV09SRClyZXNvdXJjZWRpcixGQUxTRSk7CiAJaWYgKCF4cmVzZGlyKSB7Ci0JCWRwcmludGZfdmVyKHN0ZGRlYiwiLi4ubm8gdHlwZWlkIGVudHJ5IGZvdW5kIGZvciAlcFxuIix0eXBlaWQpOworCQlkcHJpbnRmX2luZm8odmVyLCIuLi5ubyB0eXBlaWQgZW50cnkgZm91bmQgZm9yICVwXG4iLHR5cGVpZCk7CiAJCUhlYXBGcmVlKEdldFByb2Nlc3NIZWFwKCksMCxpbWFnZSk7CiAJCXJldHVybiAwOwogCX0KIAl4cmVzZGlyID0gR2V0UmVzRGlyRW50cnlXKHhyZXNkaXIscmVzaWQsKERXT1JEKXJlc291cmNlZGlyLEZBTFNFKTsKIAlpZiAoIXhyZXNkaXIpIHsKLQkJZHByaW50Zl92ZXIoc3RkZGViLCIuLi5ubyByZXNpZCBlbnRyeSBmb3VuZCBmb3IgJXBcbiIscmVzaWQpOworCQlkcHJpbnRmX2luZm8odmVyLCIuLi5ubyByZXNpZCBlbnRyeSBmb3VuZCBmb3IgJXBcbiIscmVzaWQpOwogCQlIZWFwRnJlZShHZXRQcm9jZXNzSGVhcCgpLDAsaW1hZ2UpOwogCQlyZXR1cm4gMDsKIAl9CiAJCiAJeHJlc2RpciA9IEdldFJlc0RpckVudHJ5Vyh4cmVzZGlyLDAsKERXT1JEKXJlc291cmNlZGlyLFRSVUUpOwogCWlmICgheHJlc2RpcikgewotCQlkcHJpbnRmX3ZlcihzdGRkZWIsIi4uLm5vIDAgKGRlZmF1bHQgbGFuZ3VhZ2UpIGVudHJ5IGZvdW5kIGZvciAlcFxuIixyZXNpZCk7CisJCWRwcmludGZfaW5mbyh2ZXIsIi4uLm5vIDAgKGRlZmF1bHQgbGFuZ3VhZ2UpIGVudHJ5IGZvdW5kIGZvciAlcFxuIixyZXNpZCk7CiAJCUhlYXBGcmVlKEdldFByb2Nlc3NIZWFwKCksMCxpbWFnZSk7CiAJCXJldHVybiAwOwogCX0KQEAgLTUzMSw3ICs1MjcsNyBAQAogCWludAkJCXJlc2xlbj0wOwogCWludAkJCXJlcz0wOwogCi0JZHByaW50Zl92ZXIoc3RkZGViLCJHZXRGaWxlUmVzb3VyY2VTaXplKCVzLCVseCwlbHgsJXApXG4iLAorCWRwcmludGZfaW5mbyh2ZXIsIkdldEZpbGVSZXNvdXJjZVNpemUoJXMsJWx4LCVseCwlcClcbiIsCiAJCWZpbGVuYW1lLChMT05HKXJlc3R5cGUsKExPTkcpcmVzaWQsb2ZmCiAJKTsKIAlsemZkPUxaT3BlbkZpbGUzMkEoZmlsZW5hbWUsJm9mcyxPRl9SRUFEKTsKQEAgLTU2OCw3ICs1NjQsNyBAQAogCWludAkJCXJlcz0wOwogCWludAkJCXJlc2xlbj1kYXRhbGVuOwogCi0JZHByaW50Zl92ZXIoc3RkZGViLCJHZXRGaWxlUmVzb3VyY2UoJXMsJWx4LCVseCwlbGQsJWxkLCVwKVxuIiwKKwlkcHJpbnRmX2luZm8odmVyLCJHZXRGaWxlUmVzb3VyY2UoJXMsJWx4LCVseCwlbGQsJWxkLCVwKVxuIiwKIAkJZmlsZW5hbWUsKExPTkcpcmVzdHlwZSwoTE9ORylyZXNpZCxvZmYsZGF0YWxlbixkYXRhCiAJKTsKIApAQCAtNjA3LDcgKzYwMyw3IEBACiAJQllURQlidWZbMTQ0XTsKIAlWU19GSVhFREZJTEVJTkZPICp2ZmZpOwogCi0JZHByaW50Zl92ZXIoc3RkZGViLCJHZXRGaWxlVmVyc2lvbkluZm9TaXplMTYoJXMsJXApXG4iLGZpbGVuYW1lLGhhbmRsZSk7CisJZHByaW50Zl9pbmZvKHZlciwiR2V0RmlsZVZlcnNpb25JbmZvU2l6ZTE2KCVzLCVwKVxuIixmaWxlbmFtZSxoYW5kbGUpOwogCWxlbj1HZXRGaWxlUmVzb3VyY2VTaXplKGZpbGVuYW1lLFZTX0ZJTEVfSU5GTyxWU19WRVJTSU9OX0lORk8saGFuZGxlKTsKIAlpZiAoIWxlbikKIAkJcmV0dXJuIDA7CkBAIC02MzMsNyArNjI5LDcgQEAKIAlpZiAoKihXT1JEKilidWYgPCBsZW4pCiAJCWxlbiA9ICooV09SRCopYnVmOwogCi0JaWYoZGVidWdnaW5nX3ZlcikKKwlpZihkZWJ1Z2dpbmdfaW5mbyh2ZXIpKQogCSAgcHJpbnRfdmZmaV9kZWJ1Zyh2ZmZpKTsKIAogCXJldHVybiBsZW47CkBAIC02NDIsNyArNjM4LDcgQEAKIC8qIEdldEZpbGVWZXJzaW9uSW5mb1NpemUzMkEJCQlbVkVSU0lPTi4xXSAqLwogRFdPUkQgV0lOQVBJIEdldEZpbGVWZXJzaW9uSW5mb1NpemUzMkEoTFBDU1RSIGZpbGVuYW1lLExQRFdPUkQgaGFuZGxlKQogewotCWRwcmludGZfdmVyKHN0ZGRlYiwiR2V0RmlsZVZlcnNpb25JbmZvU2l6ZTMyQSglcywlcClcbiIsZmlsZW5hbWUsaGFuZGxlKTsKKwlkcHJpbnRmX2luZm8odmVyLCJHZXRGaWxlVmVyc2lvbkluZm9TaXplMzJBKCVzLCVwKVxuIixmaWxlbmFtZSxoYW5kbGUpOwogCXJldHVybiBHZXRGaWxlVmVyc2lvbkluZm9TaXplMTYoZmlsZW5hbWUsaGFuZGxlKTsKIH0KIApAQCAtNjU5LDcgKzY1NSw3IEBACiBEV09SRCAgV0lOQVBJIEdldEZpbGVWZXJzaW9uSW5mbzE2KExQQ1NUUiBmaWxlbmFtZSxEV09SRCBoYW5kbGUsRFdPUkQgZGF0YXNpemUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExQVk9JRCBkYXRhKQogewotCWRwcmludGZfdmVyKHN0ZGRlYiwiR2V0RmlsZVZlcnNpb25JbmZvMTYoJXMsJWxkLCVsZCwlcClcbi0+IiwKKwlkcHJpbnRmX2luZm8odmVyLCJHZXRGaWxlVmVyc2lvbkluZm8xNiglcywlbGQsJWxkLCVwKVxuIiwKIAkJZmlsZW5hbWUsaGFuZGxlLGRhdGFzaXplLGRhdGEKIAkpOwogCXJldHVybiBHZXRGaWxlUmVzb3VyY2UoCkBAIC03MTYsMjcgKzcxMiwyNyBAQAogICAgIHJldHZhbCA9IDA7CiAKICAgICAvKiBQcmludCBvdXQgZGVidWdnaW5nIGluZm9ybWF0aW9uICovCi0gICAgZHByaW50Zl92ZXIoc3RkZGViLCAiVmVyRmluZEZpbGUoKSBjYWxsZWQgd2l0aCBwYXJhbWV0ZXJzOlxuIgorICAgIGRwcmludGZfaW5mbyh2ZXIsICJWZXJGaW5kRmlsZSgpIGNhbGxlZCB3aXRoIHBhcmFtZXRlcnM6XG4iCiAJCSJcdGZsYWdzID0gJXgiLCBmbGFncyk7CiAgICAgaWYoZmxhZ3MgJiBWRkZGX0lTU0hBUkVERklMRSkKLQlkcHJpbnRmX3ZlcihzdGRkZWIsICIgKFZGRkZfSVNTSEFSRURGSUxFKVxuIik7CisJZHByaW50Zl9pbmZvKHZlciwgIiAoVkZGRl9JU1NIQVJFREZJTEUpXG4iKTsKICAgICBlbHNlCi0JZHByaW50Zl92ZXIoc3RkZGViLCAiXG4iKTsKKwlkcHJpbnRmX2luZm8odmVyLCAiXG4iKTsKIAogICAgIHZlcl9kc3RyaW5nKCJcdGxwc3pGaWxlbmFtZSA9ICIsIGxwc3pGaWxlbmFtZSwgIiIpOwogICAgIHZlcl9kc3RyaW5nKCJcdGxwc3pXaW5EaXIgPSAiLCBscHN6V2luRGlyLCAiIik7CiAgICAgdmVyX2RzdHJpbmcoIlx0bHBzekFwcERpciA9ICIsIGxwc3pBcHBEaXIsICIiKTsKIAotICAgIGRwcmludGZfdmVyKHN0ZGRlYiwgIlx0bHBzekN1ckRpciA9ICVwXG4iLCBscHN6Q3VyRGlyKTsKKyAgICBkcHJpbnRmX2luZm8odmVyLCAiXHRscHN6Q3VyRGlyID0gJXBcbiIsIGxwc3pDdXJEaXIpOwogICAgIGlmKGxwdUN1ckRpckxlbikKLQlkcHJpbnRmX3ZlcihzdGRkZWIsICJcdGxwdUN1ckRpckxlbiA9ICVwICgldSlcbiIsCisJZHByaW50Zl9pbmZvKHZlciwgIlx0bHB1Q3VyRGlyTGVuID0gJXAgKCV1KVxuIiwKIAkJICAgIGxwdUN1ckRpckxlbiwgKmxwdUN1ckRpckxlbik7CiAgICAgZWxzZQotCWRwcmludGZfdmVyKHN0ZGRlYiwgIlx0bHB1Q3VyRGlyTGVuID0gKG51bGwpXG4iKTsKKwlkcHJpbnRmX2luZm8odmVyLCAiXHRscHVDdXJEaXJMZW4gPSAobnVsbClcbiIpOwogCi0gICAgZHByaW50Zl92ZXIoc3RkZGViLCAiXHRscHN6RGVzdERpciA9ICVwXG4iLCBscHN6RGVzdERpcik7CisgICAgZHByaW50Zl9pbmZvKHZlciwgIlx0bHBzekRlc3REaXIgPSAlcFxuIiwgbHBzekRlc3REaXIpOwogICAgIGlmKGxwdURlc3REaXJMZW4pCi0JZHByaW50Zl92ZXIoc3RkZGViLCAiXHRscHVEZXN0RGlyTGVuID0gJXAgKCV1KVxuIiwKKwlkcHJpbnRmX2luZm8odmVyLCAiXHRscHVEZXN0RGlyTGVuID0gJXAgKCV1KVxuIiwKIAkJICAgIGxwdURlc3REaXJMZW4sICpscHVEZXN0RGlyTGVuKTsKIAogICAgIC8qIEZpZ3VyZSBvdXQgd2hlcmUgdGhlIGZpbGUgc2hvdWxkIGdvOyBzaGFyZWQgZmlsZXMgZGVmYXVsdCB0byB0aGUKQEAgLTgyNCwyMSArODIwLDIxIEBACiAJKmxwdUN1ckRpckxlbiA9IGN1ckRpclNpemVSZXE7CiAgICAgfQogCi0gICAgZHByaW50Zl92ZXIoc3RkZGViLCAiVmVyRmluZEZpbGUoKSByZXQgPSAlbHUgKCVzJXMlcylcbiIsIHJldHZhbCwKKyAgICBkcHJpbnRmX2luZm8odmVyLCAiVmVyRmluZEZpbGUoKSByZXQgPSAlbHUgKCVzJXMlcylcbiIsIHJldHZhbCwKIAkJKHJldHZhbCAmIFZGRl9DVVJORURFU1QpID8gIlZGRl9DVVJORURFU1QgIiA6ICIiLAogCQkocmV0dmFsICYgVkZGX0ZJTEVJTlVTRSkgPyAiVkZGX0ZJTEVJTlVTRSAiIDogIiIsCiAJCShyZXR2YWwgJiBWRkZfQlVGRlRPT1NNQUxMKSA/ICJWRkZfQlVGRlRPT1NNQUxMICIgOiAiIik7CiAKICAgICB2ZXJfZHN0cmluZygiXHQoRXhpdCkgbHBzekN1ckRpciA9ICIsIGxwc3pDdXJEaXIsICIiKTsKICAgICBpZihscHVDdXJEaXJMZW4pCi0JZHByaW50Zl92ZXIoc3RkZGViLCAiXHQoRXhpdCkgbHB1Q3VyRGlyTGVuID0gJXAgKCV1KVxuIiwKKwlkcHJpbnRmX2luZm8odmVyLCAiXHQoRXhpdCkgbHB1Q3VyRGlyTGVuID0gJXAgKCV1KVxuIiwKIAkJICAgIGxwdUN1ckRpckxlbiwgKmxwdUN1ckRpckxlbik7CiAgICAgZWxzZQotCWRwcmludGZfdmVyKHN0ZGRlYiwgIlx0KEV4aXQpIGxwdUN1ckRpckxlbiA9IChudWxsKVxuIik7CisJZHByaW50Zl9pbmZvKHZlciwgIlx0KEV4aXQpIGxwdUN1ckRpckxlbiA9IChudWxsKVxuIik7CiAKICAgICB2ZXJfZHN0cmluZygiXHQoRXhpdCkgbHBzekRlc3REaXIgPSAiLCBscHN6RGVzdERpciwgIiIpOwogICAgIGlmKGxwdURlc3REaXJMZW4pCi0JZHByaW50Zl92ZXIoc3RkZGViLCAiXHQoRXhpdCkgbHB1RGVzdERpckxlbiA9ICVwICgldSlcbiIsCisJZHByaW50Zl9pbmZvKHZlciwgIlx0KEV4aXQpIGxwdURlc3REaXJMZW4gPSAlcCAoJXUpXG4iLAogCQkgICAgbHB1RGVzdERpckxlbiwgKmxwdURlc3REaXJMZW4pOwogCiAgICAgcmV0dXJuIHJldHZhbDsKQEAgLTExOTUsMTMgKzExOTEsMTMgQEAKIAogCXdoaWxlICgxKSB7CiAJCWRiPShzdHJ1Y3QgZGJBKilibG9jazsKLQkJZHByaW50Zl92ZXIoc3RkZGViLCJkYj0lcCxkYi0+bmV4dG9mZj0lZCxkYi0+ZGF0YWxlbj0lZCxkYi0+bmFtZT0lc1xuIiwKKwkJZHByaW50Zl9pbmZvKHZlciwiZGI9JXAsZGItPm5leHRvZmY9JWQsZGItPmRhdGFsZW49JWQsZGItPm5hbWU9JXNcbiIsCiAJCQlkYixkYi0+bmV4dG9mZixkYi0+ZGF0YWxlbixkYi0+bmFtZQogCQkpOwogCQlpZiAoKCFkYi0+bmV4dG9mZikgfHwgKGJ1ZmZfcmVtYWluPD0wKSkgLyogbm8gbW9yZSBlbnRyaWVzID8gKi8KIAkJCXJldHVybiBOVUxMOwogCi0JCWRwcmludGZfdmVyKHN0ZGRlYiwiY29tcGFyaW5nIHdpdGggJXNcbiIsZGItPm5hbWUpOworCQlkcHJpbnRmX2luZm8odmVyLCJjb21wYXJpbmcgd2l0aCAlc1xuIixkYi0+bmFtZSk7CiAJCWlmICghbHN0cm5jbXBpMzJBKGRiLT5uYW1lLHN0cixzdWJzdHJsZW4pKSB7CiAJCQlpZiAobmV4dHNsYXNoKSB7CiAJCQkJaW5jX3NpemU9REFUQV9PRkZTRVRfQShkYikrKChkYi0+ZGF0YWxlbiszKSZ+Myk7CkBAIC0xMjUyLDcgKzEyNDgsNyBAQAogCQl9IGVsc2UKIAkJCXZzID0gSEVBUF9zdHJkdXBBKEdldFByb2Nlc3NIZWFwKCksMCwibm8gZGF0YSIpOwogCi0JCWRwcmludGZfdmVyKHN0ZGRlYiwiZGItPm5leHRvZmY9JWQsZGItPm5hbWU9JXMsZGItPmRhdGE9XCIlc1wiXG4iLAorCQlkcHJpbnRmX2luZm8odmVyLCJkYi0+bmV4dG9mZj0lZCxkYi0+bmFtZT0lcyxkYi0+ZGF0YT1cIiVzXCJcbiIsCiAJCQlkYi0+bmV4dG9mZix4cyx2cwogCQkpOwogCQlIZWFwRnJlZShHZXRQcm9jZXNzSGVhcCgpLDAsdnMpOwpAQCAtMTI4OCw3ICsxMjg0LDcgQEAKIAlMUFNUUglzOwogCUJZVEUJKmJsb2NrPVBUUl9TRUdfVE9fTElOKHNlZ2Jsb2NrKSwqYjsKIAotCWRwcmludGZfdmVyKHN0ZGRlYiwiVmVyUXVlcnlWYWx1ZTE2KCVwLCVzLCVwLCVkKVxuIiwKKwlkcHJpbnRmX2luZm8odmVyLCJWZXJRdWVyeVZhbHVlMTYoJXAsJXMsJXAsJWQpXG4iLAogCQlibG9jayxzdWJibG9jayxidWZmZXIsKmJ1ZmxlbgogCSk7CiAKQEAgLTEzMTYsMTAgKzEzMTIsMTAgQEAKIAkJKmJ1Zmxlbgk9IGRiLT5kYXRhbGVuOwogCQlpZiAoZGItPmJ0ZXh0KSB7CiAJCSAgICB4cyA9IEhFQVBfc3RyZHVwV3RvQShHZXRQcm9jZXNzSGVhcCgpLDAsKFdDSEFSKiliKTsKLQkJICAgIGRwcmludGZfdmVyKHN0ZGVyciwiLT4lc1xuIix4cyk7CisJCSAgICBkcHJpbnRmX2luZm8odmVyLCItPiVzXG4iLHhzKTsKIAkJICAgIEhlYXBGcmVlKEdldFByb2Nlc3NIZWFwKCksMCx4cyk7CiAJCX0gZWxzZQotCQkgICAgZHByaW50Zl92ZXIoc3RkZXJyLCItPiVwXG4iLGIpOworCQkgICAgZHByaW50Zl9pbmZvKHZlciwiLT4lcFxuIixiKTsKIAl9IGVsc2UgewogCQlzdHJ1Y3QJZGJBCSpkYjsKIAkJYj1fZmluZF9kYXRhQShibG9jayxzLCooV09SRCopYmxvY2spOwpAQCAtMTMzNCw5ICsxMzMwLDkgQEAKIAkJKmJ1Zmxlbgk9IGRiLT5kYXRhbGVuOwogCQkvKiB0aGUgc3RyaW5nIGlzIG9ubHkgcHJpbnRhYmxlLCBpZiBpdCBpcyBiZWxvdyBcXFN0cmluZ0ZpbGVJbmZvKi8KIAkJaWYgKCFsc3RybmNtcGkzMkEoIlZTX1ZFUlNJT05fSU5GT1xcU3RyaW5nRmlsZUluZm9cXCIscyxzdHJsZW4oIlZTX1ZFUlNJT05fSU5GT1xcU3RyaW5nRmlsZUluZm9cXCIpKSkKLQkJICAgIGRwcmludGZfdmVyKHN0ZGRlYiwiCS0+ICVzPSVzXG4iLHN1YmJsb2NrLGIpOworCQkgICAgZHByaW50Zl9pbmZvKHZlciwiCS0+ICVzPSVzXG4iLHN1YmJsb2NrLGIpOwogCQllbHNlCi0JCSAgICBkcHJpbnRmX3ZlcihzdGRkZWIsIgktPiAlcz0lcFxuIixzdWJibG9jayxiKTsKKwkJICAgIGRwcmludGZfaW5mbyh2ZXIsIgktPiAlcz0lcFxuIixzdWJibG9jayxiKTsKIAl9CiAJKmJ1ZmZlcgk9IChiLWJsb2NrKStzZWdibG9jazsKIAlmcmVlKHMpOwpAQCAtMTM0OSw3ICsxMzQ1LDcgQEAKIAlCWVRFCSpiLCpibG9jaz0oTFBCWVRFKXZibG9jaywqKmJ1ZmZlcj0oTFBCWVRFKil2YnVmZmVyOwogCUxQU1RSCXM7CiAKLQlkcHJpbnRmX3ZlcihzdGRkZWIsIlZlclF1ZXJ5VmFsdWUzMkEoJXAsJXMsJXAsJWQpXG4iLAorCWRwcmludGZfaW5mbyh2ZXIsIlZlclF1ZXJ5VmFsdWUzMkEoJXAsJXMsJXAsJWQpXG4iLAogCQlibG9jayxzdWJibG9jayxidWZmZXIsKmJ1ZmxlbgogCSk7CiAKQEAgLTEzNzgsMTAgKzEzNzQsMTAgQEAKIAkJYgk9IGIrREFUQV9PRkZTRVRfVyhkYik7CiAJCWlmIChkYi0+YnRleHQpIHsKIAkJICAgIHhzID0gSEVBUF9zdHJkdXBXdG9BKEdldFByb2Nlc3NIZWFwKCksMCwoV0NIQVIqKWIpOwotCQkgICAgZHByaW50Zl92ZXIoc3RkZXJyLCItPiVzXG4iLHhzKTsKKwkJICAgIGRwcmludGZfaW5mbyh2ZXIsIi0+JXNcbiIseHMpOwogCQkgICAgSGVhcEZyZWUoR2V0UHJvY2Vzc0hlYXAoKSwwLHhzKTsKIAkJfSBlbHNlCi0JCSAgICBkcHJpbnRmX3ZlcihzdGRlcnIsIi0+JXBcbiIsYik7CisJCSAgICBkcHJpbnRmX2luZm8odmVyLCItPiVwXG4iLGIpOwogCQkvKiBUaGlzIGlzIGEgbGVhay4gICovCiAJCWIgPSBIRUFQX3N0cmR1cFd0b0EoR2V0UHJvY2Vzc0hlYXAoKSwwLChXQ0hBUiopYik7CiAJfSBlbHNlIHsKQEAgLTEzOTksOSArMTM5NSw5IEBACiAKIAkJLyogdGhlIHN0cmluZyBpcyBvbmx5IHByaW50YWJsZSwgaWYgaXQgaXMgYmVsb3cgXFxTdHJpbmdGaWxlSW5mbyovCiAJCWlmICghbHN0cm5jbXBpMzJBKCJWU19WRVJTSU9OX0lORk9cXFN0cmluZ0ZpbGVJbmZvXFwiLHMsc3RybGVuKCJWU19WRVJTSU9OX0lORk9cXFN0cmluZ0ZpbGVJbmZvXFwiKSkpCi0JCSAgICBkcHJpbnRmX3ZlcihzdGRkZWIsIgktPiAlcz0lc1xuIixzdWJibG9jayxiKTsKKwkJICAgIGRwcmludGZfaW5mbyh2ZXIsIgktPiAlcz0lc1xuIixzdWJibG9jayxiKTsKIAkJZWxzZQotCQkgICAgZHByaW50Zl92ZXIoc3RkZGViLCIJLT4gJXM9JXBcbiIsc3ViYmxvY2ssYik7CisJCSAgICBkcHJpbnRmX2luZm8odmVyLCIJLT4gJXM9JXBcbiIsc3ViYmxvY2ssYik7CiAJfQogCSpidWZmZXIJPSBiOwogCWZyZWUocyk7CmRpZmYgLS1naXQgYS9taXNjL3ZlcnNpb24uYyBiL21pc2MvdmVyc2lvbi5jCmluZGV4IGI2OTRhNzguLjk3MWU3NTggMTAwNjQ0Ci0tLSBhL21pc2MvdmVyc2lvbi5jCisrKyBiL21pc2MvdmVyc2lvbi5jCkBAIC0yOTQsNiArMjk0LDcgQEAKICAqCiAgKiB3cml0ZXMgYSBkZWJ1ZyBzdHJpbmcgaW50byA8d2luZGlyPlxib290bG9nLnR4dAogICovCi12b2lkIFdJTkFQSSBEaWFnT3V0cHV0KCkKK3ZvaWQgV0lOQVBJIERpYWdPdXRwdXQoTFBDU1RSIHN0cikKIHsKKwlmcHJpbnRmKHN0ZGVyciwiRElBR09VVFBVVDolc1xuIixzdHIpOwogfQpkaWZmIC0tZ2l0IGEvbWlzYy93aW5zb2NrLmMgYi9taXNjL3dpbnNvY2suYwppbmRleCA4MzUxNTFkLi4yMzljNDU2IDEwMDY0NAotLS0gYS9taXNjL3dpbnNvY2suYworKysgYi9taXNjL3dpbnNvY2suYwpAQCAtNDQsNyArNDQsNiBAQAogI2luY2x1ZGUgInRhc2suaCIKICNpbmNsdWRlICJtZXNzYWdlLmgiCiAjaW5jbHVkZSAibWlzY2VtdS5oIgotI2luY2x1ZGUgInN0ZGRlYnVnLmgiCiAjaW5jbHVkZSAiZGVidWcuaCIKIAogI2RlZmluZSBERUJVR19TT0NLQUREUiAwCkBAIC0yMDYsNyArMjA1LDcgQEAKIAogICAgIG9wdGxlbiA9IHNpemVvZihvcHR2YWwpOwogICAgIGdldHNvY2tvcHQocywgU09MX1NPQ0tFVCwgU09fRVJST1IsICZvcHR2YWwsICZvcHRsZW4pOwotICAgIGlmIChvcHR2YWwpIGRwcmludGZfd2luc29jayhzdGRkZWIsICJcdFslaV0gZXJyb3I6ICVkXG4iLCBzLCBvcHR2YWwpOworICAgIGlmIChvcHR2YWwpIGRwcmludGZfd2Fybih3aW5zb2NrLCAiXHRbJWldIGVycm9yOiAlZFxuIiwgcywgb3B0dmFsKTsKICAgICByZXR1cm4gb3B0dmFsICE9IDA7CiB9CiAKQEAgLTI0OSw3ICsyNDgsNyBAQAogCWlmKCBiMzIgKSB3c2ZkczMyLT5mZF9jb3VudCA9IGo7CiAJZWxzZSB3c2ZkczE2LT5mZF9jb3VudCA9IGo7CiAKLQlkcHJpbnRmX3dpbnNvY2soc3RkZGViLCAiXG4iKTsKKwlkcHJpbnRmX2luZm8od2luc29jaywgIlxuIik7CiAjdW5kZWYgd3NmZHMzMgogI3VuZGVmIHdzZmRzMTYKICAgICB9CkBAIC0zMDQsNyArMzAzLDcgQEAKICAgICBIVEFTSzE2ICAgICAgICAgICAgIHRpZCA9IEdldEN1cnJlbnRUYXNrKCk7CiAgICAgTFBXU0lORk8gICAgICAgICAgICBwd3NpOwogCi0gICAgZHByaW50Zl93aW5zb2NrKHN0ZGRlYiwgIldTQVN0YXJ0dXA6IHZlclJlcT0leFxuIiwgd1ZlcnNpb25SZXF1ZXN0ZWQpOworICAgIGRwcmludGZfaW5mbyh3aW5zb2NrLCAiV1NBU3RhcnR1cDogdmVyUmVxPSV4XG4iLCB3VmVyc2lvblJlcXVlc3RlZCk7CiAKICAgICBpZiAoTE9CWVRFKHdWZXJzaW9uUmVxdWVzdGVkKSA8IDEgfHwgKExPQllURSh3VmVyc2lvblJlcXVlc3RlZCkgPT0gMSAmJgogICAgICAgICBISUJZVEUod1ZlcnNpb25SZXF1ZXN0ZWQpIDwgMSkpIHJldHVybiBXU0FWRVJOT1RTVVBQT1JURUQ7CkBAIC0zNTksNyArMzU4LDcgQEAKIAogICAgIG1lbWNweShscFdTQURhdGEsICZXSU5TT0NLX2RhdGEsIHNpemVvZihXSU5TT0NLX2RhdGEpKTsKIAotICAgIGRwcmludGZfd2luc29jayhzdGRkZWIsICJXU0FTdGFydHVwOiBzdWNjZWVkZWRcbiIpOworICAgIGRwcmludGZfaW5mbyh3aW5zb2NrLCAiV1NBU3RhcnR1cDogc3VjY2VlZGVkXG4iKTsKICAgICByZXR1cm4gMDsKIH0KIApAQCAtNDExLDEyICs0MTAsMTIgQEAKIAlXSU5TT0NLX1NodXRkb3duKCk7CS8qIGp1c3QgaW4gY2FzZSAqLwogCiAgICAgaWYoIHB3c2ktPmZsYWdzICYgV1NJX0JMT0NLSU5HQ0FMTCApCi0JZHByaW50Zl93aW5zb2NrKHN0ZGRlYiwiXHRpbnNpZGUgYmxvY2tpbmcgY2FsbCFcbiIpOworCWRwcmludGZfaW5mbyh3aW5zb2NrLCJcdGluc2lkZSBibG9ja2luZyBjYWxsIVxuIik7CiAKIC8qIEZJWE1FOiBhb3BfY29udHJvbCgpIGRvZXNuJ3QgZGVjcmVtZW50IHB3c2ktPm51bV9hc3luY19ycQogICoKICAqICAgIGlmKCBwd3NpLT5udW1fYXN5bmNfcnEgKQotICoJICBkcHJpbnRmX3dpbnNvY2soc3RkZGViLCJcdGhhdmUgJWkgb3V0c3RhbmRpbmcgYXN5bmMgb3BzIVxuIiwgcHdzaS0+bnVtX2FzeW5jX3JxICk7CisgKgkgIGRwcmludGZfd2Fybih3aW5zb2NrLCJcdGhhdmUgJWkgb3V0c3RhbmRpbmcgYXN5bmMgb3BzIVxuIiwgcHdzaS0+bnVtX2FzeW5jX3JxICk7CiAgKi8KIAogICAgIGZvcihpID0gMCwgaiA9IDAsIG4gPSAwOyBpIDwgV1NfTUFYX1NPQ0tFVFNfUEVSX1BST0NFU1M7IGkrKykKQEAgLTQzMCw3ICs0MjksNyBAQAogICAgICAgICAgICAgY2xvc2UocHdzaS0+c29ja1tpXS5mZCk7IGorKzsgCiAgICAgICAgIH0KICAgICBpZiggaiApIAotCSAgZHByaW50Zl93aW5zb2NrKHN0ZGRlYiwiXHRjbG9zZWQgJWkgc29ja2V0cywga2lsbGVkICVpIGFzeW5jIHNlbGVjdHMhXG4iLCBqLCBuKTsKKwkgIGRwcmludGZfaW5mbyh3aW5zb2NrLCJcdGNsb3NlZCAlaSBzb2NrZXRzLCBraWxsZWQgJWkgYXN5bmMgc2VsZWN0cyFcbiIsIGosIG4pOwogCiAgICAgLyogZGVsZXRlIHNjcmF0Y2ggYnVmZmVycyAqLwogCkBAIC00NDgsNyArNDQ3LDcgQEAKIHsKICAgICBIVEFTSzE2CWhUYXNrID0gR2V0Q3VycmVudFRhc2soKTsKIAotICAgIGRwcmludGZfd2luc29jayhzdGRkZWIsICJXU0FDbGVhbnVwKCUwNHgpXG4iLCBoVGFzayApOworICAgIGRwcmludGZfaW5mbyh3aW5zb2NrLCAiV1NBQ2xlYW51cCglMDR4KVxuIiwgaFRhc2sgKTsKICAgICBpZiggaFRhc2sgKQogICAgIHsKIAlMUFdTSU5GTyBwd3NpID0gd3NpX2ZpbmQoaFRhc2spOwpAQCAtNDY3LDE0ICs0NjYsMTEgQEAKICAqLwogSU5UMzIgV0lOQVBJIFdTQUdldExhc3RFcnJvcih2b2lkKQogewotICAgIExQV1NJTkZPICAgICAgcHdzaSA9IHdzaV9maW5kKEdldEN1cnJlbnRUYXNrKCkpOwotICAgIElOVDE2CQlyZXQ7CisgICAgTFBXU0lORk8gcHdzaSA9IHdzaV9maW5kKEdldEN1cnJlbnRUYXNrKCkpOworICAgIElOVDE2ICAgIHJldCA9IChwd3NpKSA/IHB3c2ktPmVyciA6IFdTQU5PVElOSVRJQUxJU0VEOwogCi0gICAgZHByaW50Zl93aW5zb2NrKHN0ZGRlYiwgIldTQUdldExhc3RFcnJvciglMDh4KSIsICh1bnNpZ25lZClwd3NpKTsKLQotICAgIHJldCA9IChwd3NpKSA/IHB3c2ktPmVyciA6IFdTQU5PVElOSVRJQUxJU0VEOwotCi0gICAgZHByaW50Zl93aW5zb2NrKHN0ZGRlYiwgIiA9ICVpXG4iLCAoaW50KXJldCk7CisgICAgZHByaW50Zl9pbmZvKHdpbnNvY2ssICJXU0FHZXRMYXN0RXJyb3IoJTA4eCkgPSAlaVxuIiwgCisJCSAgICAodW5zaWduZWQpcHdzaSwgKGludClyZXQpOwogICAgIHJldHVybiByZXQ7CiB9CiAKQEAgLTQ4NSw3ICs0ODEsNyBAQAogewogICAgIExQV1NJTkZPICAgICAgcHdzaSA9IHdzaV9maW5kKEdldEN1cnJlbnRUYXNrKCkpOwogCi0gICAgZHByaW50Zl93aW5zb2NrKHN0ZGRlYiwgIldTQVNldExhc3RFcnJvciglMDh4KTogJWRcbiIsICh1bnNpZ25lZClwd3NpLCAoaW50KWlFcnJvcik7CisgICAgZHByaW50Zl9pbmZvKHdpbnNvY2ssICJXU0FTZXRMYXN0RXJyb3IoJTA4eCk6ICVkXG4iLCAodW5zaWduZWQpcHdzaSwgKGludClpRXJyb3IpOwogICAgIGlmKCBwd3NpICkgcHdzaS0+ZXJyID0gaUVycm9yOwogfQogCkBAIC01MjYsNyArNTIyLDcgQEAKICAgICB3c19zb2NrZXQqCXB3cyAgPSAod3Nfc29ja2V0KilXU19IQU5ETEUyUFRSKChTT0NLRVQxNilzKTsKICAgICBMUFdTSU5GTwlwd3NpID0gd3NpX2ZpbmQoR2V0Q3VycmVudFRhc2soKSk7CiAKLSAgICBkcHJpbnRmX3dpbnNvY2soc3RkZGViLCAiV1NfQUNDRVBUKCUwOHgpOiBzb2NrZXQgJTA0eFxuIiwgCisgICAgZHByaW50Zl9pbmZvKHdpbnNvY2ssICJXU19BQ0NFUFQoJTA4eCk6IHNvY2tldCAlMDR4XG4iLCAKIAkJCQkgICh1bnNpZ25lZClwd3NpLCAoVUlOVDE2KXMgKTsgCiAgICAgaWYoIF9jaGVja193cyhwd3NpLCBwd3MpICkKICAgICB7CkBAIC01NzcsNyArNTczLDcgQEAKICAgICB3c19zb2NrZXQqICAgIHB3cyAgPSAod3Nfc29ja2V0KilXU19IQU5ETEUyUFRSKHMpOwogICAgIExQV1NJTkZPICAgICAgcHdzaSA9IHdzaV9maW5kKEdldEN1cnJlbnRUYXNrKCkpOwogCi0gICAgZHByaW50Zl93aW5zb2NrKHN0ZGRlYiwgIldTX0JJTkQoJTA4eCk6IHNvY2tldCAlMDR4LCBwdHIgJTh4LCBsZW5ndGggJWRcbiIsIAorICAgIGRwcmludGZfaW5mbyh3aW5zb2NrLCAiV1NfQklORCglMDh4KTogc29ja2V0ICUwNHgsIHB0ciAlOHgsIGxlbmd0aCAlZFxuIiwgCiAJCQkgICAodW5zaWduZWQpcHdzaSwgcywgKGludCkgbmFtZSwgbmFtZWxlbik7CiAjaWYgREVCVUdfU09DS0FERFIKICAgICBkdW1wX3NvY2thZGRyKG5hbWUpOwpAQCAtNTg5LDcgKzU4NSw3IEBACiAJICBpZiAoIGJpbmQocHdzLT5mZCwgbmFtZSwgbmFtZWxlbikgPCAwICkgCiAJICB7CiAJICAgICBpbnQJbG9jX2Vycm5vID0gZXJybm87Ci0JICAgICBkcHJpbnRmX3dpbnNvY2soc3RkZGViLCJcdGZhaWx1cmUgLSBlcnJubyA9ICVpXG4iLCBlcnJubyk7CisJICAgICBkcHJpbnRmX3dhcm4od2luc29jaywgIlx0ZmFpbHVyZSAtIGVycm5vID0gJWlcbiIsIGVycm5vKTsKIAkgICAgIGVycm5vID0gbG9jX2Vycm5vOwogCSAgICAgc3dpdGNoKGVycm5vKQogCSAgICAgewpAQCAtNjIwLDcgKzYxNiw3IEBACiAgICAgd3Nfc29ja2V0KiAgICBwd3MgID0gKHdzX3NvY2tldCopV1NfSEFORExFMlBUUihzKTsKICAgICBMUFdTSU5GTyAgICAgIHB3c2kgPSB3c2lfZmluZChHZXRDdXJyZW50VGFzaygpKTsKIAotICAgIGRwcmludGZfd2luc29jayhzdGRkZWIsICJXU19DTE9TRSglMDh4KTogc29ja2V0ICUwOHhcbiIsICh1bnNpZ25lZClwd3NpLCBzKTsKKyAgICBkcHJpbnRmX2luZm8od2luc29jaywgIldTX0NMT1NFKCUwOHgpOiBzb2NrZXQgJTA4eFxuIiwgKHVuc2lnbmVkKXB3c2ksIHMpOwogCiAgICAgaWYoIF9jaGVja193cyhwd3NpLCBwd3MpICkKICAgICB7IApAQCAtNjU1LDcgKzY1MSw3IEBACiAgIHdzX3NvY2tldCogICAgcHdzICA9ICh3c19zb2NrZXQqKVdTX0hBTkRMRTJQVFIocyk7CiAgIExQV1NJTkZPICAgICAgcHdzaSA9IHdzaV9maW5kKEdldEN1cnJlbnRUYXNrKCkpOwogCi0gIGRwcmludGZfd2luc29jayhzdGRkZWIsICJXU19DT05ORUNUKCUwOHgpOiBzb2NrZXQgJTA0eCwgcHRyICU4eCwgbGVuZ3RoICVkXG4iLCAKKyAgZHByaW50Zl9pbmZvKHdpbnNvY2ssICJXU19DT05ORUNUKCUwOHgpOiBzb2NrZXQgJTA0eCwgcHRyICU4eCwgbGVuZ3RoICVkXG4iLCAKIAkJCSAgICh1bnNpZ25lZClwd3NpLCBzLCAoaW50KSBuYW1lLCBuYW1lbGVuKTsKICNpZiBERUJVR19TT0NLQUREUgogICBkdW1wX3NvY2thZGRyKG5hbWUpOwpAQCAtNzEzLDcgKzcwOSw3IEBACiAgICAgd3Nfc29ja2V0KiAgICBwd3MgID0gKHdzX3NvY2tldCopV1NfSEFORExFMlBUUihzKTsKICAgICBMUFdTSU5GTyAgICAgIHB3c2kgPSB3c2lfZmluZChHZXRDdXJyZW50VGFzaygpKTsKIAotICAgIGRwcmludGZfd2luc29jayhzdGRkZWIsICJXU19HRVRQRUVSTkFNRSglMDh4KTogc29ja2V0OiAlMDR4LCBwdHIgJTh4LCBwdHIgJTh4XG4iLCAKKyAgICBkcHJpbnRmX2luZm8od2luc29jaywgIldTX0dFVFBFRVJOQU1FKCUwOHgpOiBzb2NrZXQ6ICUwNHgsIHB0ciAlOHgsIHB0ciAlOHhcbiIsIAogCQkJICAgKHVuc2lnbmVkKXB3c2ksIHMsIChpbnQpIG5hbWUsICpuYW1lbGVuKTsKICAgICBpZiggX2NoZWNrX3dzKHB3c2ksIHB3cykgKQogICAgIHsKQEAgLTc1MCw3ICs3NDYsNyBAQAogICAgIHdzX3NvY2tldCogICAgcHdzICA9ICh3c19zb2NrZXQqKVdTX0hBTkRMRTJQVFIocyk7CiAgICAgTFBXU0lORk8gICAgICBwd3NpID0gd3NpX2ZpbmQoR2V0Q3VycmVudFRhc2soKSk7CiAKLSAgICBkcHJpbnRmX3dpbnNvY2soc3RkZGViLCAiV1NfR0VUU09DS05BTUUoJTA4eCk6IHNvY2tldDogJTA0eCwgcHRyICU4eCwgcHRyICU4eFxuIiwgCisgICAgZHByaW50Zl9pbmZvKHdpbnNvY2ssICJXU19HRVRTT0NLTkFNRSglMDh4KTogc29ja2V0OiAlMDR4LCBwdHIgJTh4LCBwdHIgJTh4XG4iLCAKIAkJCSAgKHVuc2lnbmVkKXB3c2ksIHMsIChpbnQpIG5hbWUsIChpbnQpICpuYW1lbGVuKTsKICAgICBpZiggX2NoZWNrX3dzKHB3c2ksIHB3cykgKQogICAgIHsKQEAgLTc5NCw3ICs3OTAsNyBAQAogICAgIHdzX3NvY2tldCogICAgcHdzICA9ICh3c19zb2NrZXQqKVdTX0hBTkRMRTJQVFIocyk7CiAgICAgTFBXU0lORk8gICAgICBwd3NpID0gd3NpX2ZpbmQoR2V0Q3VycmVudFRhc2soKSk7CiAKLSAgICBkcHJpbnRmX3dpbnNvY2soc3RkZGViLCAiV1NfR0VUU09DS09QVCglMDh4KTogc29ja2V0OiAlMDR4LCBvcHQgJWQsIHB0ciAlOHgsIHB0ciAlOHhcbiIsIAorICAgIGRwcmludGZfaW5mbyh3aW5zb2NrLCAiV1NfR0VUU09DS09QVCglMDh4KTogc29ja2V0OiAlMDR4LCBvcHQgJWQsIHB0ciAlOHgsIHB0ciAlOHhcbiIsIAogCQkJICAgKHVuc2lnbmVkKXB3c2ksIHMsIGxldmVsLCAoaW50KSBvcHR2YWwsIChpbnQpICpvcHRsZW4pOwogICAgIGlmKCBfY2hlY2tfd3MocHdzaSwgcHdzKSApCiAgICAgewpAQCAtODg3LDcgKzg4Myw3IEBACiAgIHdzX3NvY2tldCogICAgcHdzICA9ICh3c19zb2NrZXQqKVdTX0hBTkRMRTJQVFIocyk7CiAgIExQV1NJTkZPICAgICAgcHdzaSA9IHdzaV9maW5kKEdldEN1cnJlbnRUYXNrKCkpOwogCi0gIGRwcmludGZfd2luc29jayhzdGRkZWIsICJXU19JT0NUTCglMDh4KTogc29ja2V0ICUwNHgsIGNtZCAlMDh4LCBwdHIgJTh4XG4iLCAKKyAgZHByaW50Zl9pbmZvKHdpbnNvY2ssICJXU19JT0NUTCglMDh4KTogc29ja2V0ICUwNHgsIGNtZCAlMDh4LCBwdHIgJTh4XG4iLCAKIAkJCSAgKHVuc2lnbmVkKXB3c2ksIHMsIGNtZCwgKHVuc2lnbmVkKSBhcmdwKTsKICAgaWYoIF9jaGVja193cyhwd3NpLCBwd3MpICkKICAgewpAQCAtOTIwLDcgKzkxNiw3IEBACiAKIAlkZWZhdWx0OgkgIAogCQkvKiBOZXRzY2FwZSB0cmllcyBoYXJkIHRvIHVzZSBib2d1cyBpb2N0bCAweDY2N2UgKi8KLQkJZHByaW50Zl93aW5zb2NrKHN0ZGRlYiwiXHR1bmtub3duIFdTX0lPQ1RMIGNtZCAoJTA4eClcbiIsIGNtZCk7CisJCWRwcmludGZfd2Fybih3aW5zb2NrLCAiXHR1bmtub3duIFdTX0lPQ1RMIGNtZCAoJTA4eClcbiIsIGNtZCk7CiAgICAgfQogICAgIGlmKCBpb2N0bChwd3MtPmZkLCBuZXdjbWQsIChjaGFyKilhcmdwICkgPT0gMCApIHJldHVybiAwOwogICAgIHB3c2ktPmVyciA9IChlcnJubyA9PSBFQkFERikgPyBXU0FFTk9UU09DSyA6IHdzYUVycm5vKCk7IApAQCAtOTQ1LDcgKzk0MSw3IEBACiAgICAgd3Nfc29ja2V0KiAgICBwd3MgID0gKHdzX3NvY2tldCopV1NfSEFORExFMlBUUihzKTsKICAgICBMUFdTSU5GTyAgICAgIHB3c2kgPSB3c2lfZmluZChHZXRDdXJyZW50VGFzaygpKTsKIAotICAgIGRwcmludGZfd2luc29jayhzdGRkZWIsICJXU19MSVNURU4oJTA4eCk6IHNvY2tldCAlMDR4LCBiYWNrbG9nICVkXG4iLCAKKyAgICBkcHJpbnRmX2luZm8od2luc29jaywgIldTX0xJU1RFTiglMDh4KTogc29ja2V0ICUwNHgsIGJhY2tsb2cgJWRcbiIsIAogCQkJICAgICh1bnNpZ25lZClwd3NpLCBzLCBiYWNrbG9nKTsKICAgICBpZiggX2NoZWNrX3dzKHB3c2ksIHB3cykgKQogICAgIHsKQEAgLTk4MywxNCArOTc5LDE1IEBACiAgICAgd3Nfc29ja2V0KiAgICBwd3MgID0gKHdzX3NvY2tldCopV1NfSEFORExFMlBUUihzKTsKICAgICBMUFdTSU5GTyAgICAgIHB3c2kgPSB3c2lfZmluZChHZXRDdXJyZW50VGFzaygpKTsKIAotICAgIGRwcmludGZfd2luc29jayhzdGRkZWIsICJXU19SRUNWKCUwOHgpOiBzb2NrZXQgJTA0eCwgYnVmICU4eCwgbGVuICVkLCBmbGFncyAlZCIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICh1bnNpZ25lZClwd3NpLCBzLCAodW5zaWduZWQpYnVmLCBsZW4sIGZsYWdzKTsKKyAgICBkcHJpbnRmX2luZm8od2luc29jaywgIldTX1JFQ1YoJTA4eCk6IHNvY2tldCAlMDR4LCBidWYgJTh4LCBsZW4gJWQsICIKKwkJICAgICJmbGFncyAlZFxuIiwgKHVuc2lnbmVkKXB3c2ksIHMsICh1bnNpZ25lZClidWYsIAorCQkgICAgbGVuLCBmbGFncyk7CiAgICAgaWYoIF9jaGVja193cyhwd3NpLCBwd3MpICkKICAgICB7CiAJSU5UMzIgbGVuZ3RoOwogCWlmICgobGVuZ3RoID0gcmVjdihwd3MtPmZkLCBidWYsIGxlbiwgZmxhZ3MpKSA+PSAwKSAKIAl7IAotCSAgICBkcHJpbnRmX3dpbnNvY2soc3RkZGViLCAiIC0+ICVpIGJ5dGVzXG4iLCBsZW5ndGgpOworCSAgICBkcHJpbnRmX2luZm8od2luc29jaywgIiAtPiAlaSBieXRlc1xuIiwgbGVuZ3RoKTsKIAogCSAgICBpZiggcHdzLT5wc29wICYmIChwd3MtPmZsYWdzICYgKFdTX0ZEX1JFQUQgfCBXU19GRF9DTE9TRSkpICkKIAkJRVZFTlRfQWRkSU8oIHB3cy0+ZmQsIEVWRU5UX0lPX1JFQUQgKTsJLyogcmVlbmFibGVyICovCkBAIC0xMDAwLDcgKzk5Nyw3IEBACiAJcHdzaS0+ZXJyID0gd3NhRXJybm8oKTsKICAgICB9CiAgICAgZWxzZSBpZiggcHdzaSApIHB3c2ktPmVyciA9IFdTQUVOT1RTT0NLOwotICAgIGRwcmludGZfd2luc29jayhzdGRkZWIsICIgLT4gRVJST1JcbiIpOworICAgIGRwcmludGZfd2Fybih3aW5zb2NrLCAiIC0+IEVSUk9SXG4iKTsKICAgICByZXR1cm4gU09DS0VUX0VSUk9SOwogfQogCkBAIC0xMDIyLDggKzEwMTksOSBAQAogICAgIHdzX3NvY2tldCogICAgcHdzICA9ICh3c19zb2NrZXQqKVdTX0hBTkRMRTJQVFIocyk7CiAgICAgTFBXU0lORk8gICAgICBwd3NpID0gd3NpX2ZpbmQoR2V0Q3VycmVudFRhc2soKSk7CiAKLSAgICBkcHJpbnRmX3dpbnNvY2soc3RkZGViLCAiV1NfUkVDVkZST00oJTA4eCk6IHNvY2tldCAlMDR4LCBwdHIgJTA4eCwgbGVuICVkLCBmbGFncyAlZCIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICh1bnNpZ25lZClwd3NpLCBzLCAodW5zaWduZWQpYnVmLCBsZW4sIGZsYWdzKTsKKyAgICBkcHJpbnRmX2luZm8od2luc29jaywgIldTX1JFQ1ZGUk9NKCUwOHgpOiBzb2NrZXQgJTA0eCwgcHRyICUwOHgsICIKKwkJICAgICJsZW4gJWQsIGZsYWdzICVkXG4iLCAodW5zaWduZWQpcHdzaSwgcywgKHVuc2lnbmVkKWJ1ZiwKKwkJICAgIGxlbiwgZmxhZ3MpOwogI2lmIERFQlVHX1NPQ0tBRERSCiAgICAgaWYoIGZyb20gKSBkdW1wX3NvY2thZGRyKGZyb20pOwogICAgIGVsc2UgZnByaW50ZihzdGRlcnIsICJcdGZyb20gPSBOVUxMXG4iKTsKQEAgLTEwMzUsNyArMTAzMyw3IEBACiAKIAlpZiAoKGxlbmd0aCA9IHJlY3Zmcm9tKHB3cy0+ZmQsIGJ1ZiwgbGVuLCBmbGFncywgZnJvbSwgZnJvbWxlbjMyKSkgPj0gMCkKIAl7Ci0JICAgIGRwcmludGZfd2luc29jayhzdGRkZWIsICIgLT4gJWkgYnl0ZXNcbiIsIGxlbmd0aCk7CisJICAgIGRwcmludGZfaW5mbyh3aW5zb2NrLCAiIC0+ICVpIGJ5dGVzXG4iLCBsZW5ndGgpOwogCiAJICAgIGlmKCBwd3MtPnBzb3AgJiYgKHB3cy0+ZmxhZ3MgJiAoV1NfRkRfUkVBRCB8IFdTX0ZEX0NMT1NFKSkgKQogCQlFVkVOVF9BZGRJTyggcHdzLT5mZCwgRVZFTlRfSU9fUkVBRCApOyAgLyogcmVlbmFibGVyICovCkBAIC0xMDQ1LDcgKzEwNDMsNyBAQAogCXB3c2ktPmVyciA9IHdzYUVycm5vKCk7CiAgICAgfQogICAgIGVsc2UgaWYoIHB3c2kgKSBwd3NpLT5lcnIgPSBXU0FFTk9UU09DSzsKLSAgICBkcHJpbnRmX3dpbnNvY2soc3RkZGViLCAiIC0+IEVSUk9SXG4iKTsKKyAgICBkcHJpbnRmX3dhcm4od2luc29jaywgIiAtPiBFUlJPUlxuIik7CiAgICAgcmV0dXJuIFNPQ0tFVF9FUlJPUjsKIH0KIApAQCAtMTA3Myw3ICsxMDcxLDcgQEAKIHsKICAgICBMUFdTSU5GTyAgICAgIHB3c2kgPSB3c2lfZmluZChHZXRDdXJyZW50VGFzaygpKTsKIAkKLSAgICBkcHJpbnRmX3dpbnNvY2soc3RkZGViLCAiV1NfU0VMRUNUKCUwOHgpOiByZWFkICU4eCwgd3JpdGUgJTh4LCBleGNwICU4eFxuIiwgCisgICAgZHByaW50Zl9pbmZvKHdpbnNvY2ssICJXU19TRUxFQ1QoJTA4eCk6IHJlYWQgJTh4LCB3cml0ZSAlOHgsIGV4Y3AgJTh4XG4iLCAKICAgICAodW5zaWduZWQpIHB3c2ksICh1bnNpZ25lZCkgd3NfcmVhZGZkcywgKHVuc2lnbmVkKSB3c193cml0ZWZkcywgKHVuc2lnbmVkKSB3c19leGNlcHRmZHMpOwogCiAgICAgaWYoIHB3c2kgKQpAQCAtMTE1Miw3ICsxMTUwLDcgQEAKICAgICB3c19zb2NrZXQqICAgIHB3cyAgPSAod3Nfc29ja2V0KilXU19IQU5ETEUyUFRSKHMpOwogICAgIExQV1NJTkZPICAgICAgcHdzaSA9IHdzaV9maW5kKEdldEN1cnJlbnRUYXNrKCkpOwogCi0gICAgZHByaW50Zl93aW5zb2NrKHN0ZGRlYiwgIldTX1NFTkQoJTA4eCk6IHNvY2tldCAlMDR4LCBwdHIgJTA4eCwgbGVuZ3RoICVkLCBmbGFncyAlZFxuIiwgCisgICAgZHByaW50Zl9pbmZvKHdpbnNvY2ssICJXU19TRU5EKCUwOHgpOiBzb2NrZXQgJTA0eCwgcHRyICUwOHgsIGxlbmd0aCAlZCwgZmxhZ3MgJWRcbiIsIAogCQkJICAgKHVuc2lnbmVkKXB3c2ksIHMsICh1bnNpZ25lZCkgYnVmLCBsZW4sIGZsYWdzKTsKICAgICBpZiggX2NoZWNrX3dzKHB3c2ksIHB3cykgKQogICAgIHsKQEAgLTExODgsNyArMTE4Niw3IEBACiAgICAgd3Nfc29ja2V0KiAgICBwd3MgID0gKHdzX3NvY2tldCopV1NfSEFORExFMlBUUihzKTsKICAgICBMUFdTSU5GTyAgICAgIHB3c2kgPSB3c2lfZmluZChHZXRDdXJyZW50VGFzaygpKTsKIAotICAgIGRwcmludGZfd2luc29jayhzdGRkZWIsICJXU19TRU5EVE8oJTA4eCk6IHNvY2tldCAlMDR4LCBwdHIgJTA4eCwgbGVuZ3RoICVkLCBmbGFncyAlZFxuIiwKKyAgICBkcHJpbnRmX2luZm8od2luc29jaywgIldTX1NFTkRUTyglMDh4KTogc29ja2V0ICUwNHgsIHB0ciAlMDh4LCBsZW5ndGggJWQsIGZsYWdzICVkXG4iLAogICAgICAgICAgICAgICAgICAgICAgICAgICAodW5zaWduZWQpcHdzaSwgcywgKHVuc2lnbmVkKSBidWYsIGxlbiwgZmxhZ3MpOwogICAgIGlmKCBfY2hlY2tfd3MocHdzaSwgcHdzKSApCiAgICAgewpAQCAtMTIyNSw3ICsxMjIzLDcgQEAKICAgICB3c19zb2NrZXQqICAgIHB3cyAgPSAod3Nfc29ja2V0KilXU19IQU5ETEUyUFRSKHMpOwogICAgIExQV1NJTkZPICAgICAgcHdzaSA9IHdzaV9maW5kKEdldEN1cnJlbnRUYXNrKCkpOwogCi0gICAgZHByaW50Zl93aW5zb2NrKHN0ZGRlYiwgIldTX1NFVFNPQ0tPUFQoJTA4eCk6IHNvY2tldCAlMDR4LCBsZXYgJWQsIG9wdCAlZCwgcHRyICUwOHgsIGxlbiAlZFxuIiwKKyAgICBkcHJpbnRmX2luZm8od2luc29jaywgIldTX1NFVFNPQ0tPUFQoJTA4eCk6IHNvY2tldCAlMDR4LCBsZXYgJWQsIG9wdCAlZCwgcHRyICUwOHgsIGxlbiAlZFxuIiwKIAkJCSAgKHVuc2lnbmVkKXB3c2ksIHMsIGxldmVsLCBvcHRuYW1lLCAoaW50KSBvcHR2YWwsIG9wdGxlbik7CiAgICAgaWYoIF9jaGVja193cyhwd3NpLCBwd3MpICkKICAgICB7CkBAIC0xMjY1LDcgKzEyNjMsNyBAQAogICAgIHdzX3NvY2tldCogICAgcHdzICA9ICh3c19zb2NrZXQqKVdTX0hBTkRMRTJQVFIocyk7CiAgICAgTFBXU0lORk8gICAgICBwd3NpID0gd3NpX2ZpbmQoR2V0Q3VycmVudFRhc2soKSk7CiAKLSAgICBkcHJpbnRmX3dpbnNvY2soc3RkZGViLCAiV1NfU0hVVERPV04oJTA4eCk6IHNvY2tldCAlMDR4LCBob3cgJWlcbiIsCisgICAgZHByaW50Zl9pbmZvKHdpbnNvY2ssICJXU19TSFVURE9XTiglMDh4KTogc29ja2V0ICUwNHgsIGhvdyAlaVxuIiwKIAkJCSAgICAodW5zaWduZWQpcHdzaSwgcywgaG93ICk7CiAgICAgaWYoIF9jaGVja193cyhwd3NpLCBwd3MpICkKICAgICB7CkBAIC0xMzMwLDcgKzEzMjgsNyBAQAogewogICBMUFdTSU5GTyAgICAgIHB3c2kgPSB3c2lfZmluZChHZXRDdXJyZW50VGFzaygpKTsKIAotICBkcHJpbnRmX3dpbnNvY2soc3RkZGViLCAiV1NfU09DS0VUKCUwOHgpOiBhZj0lZCB0eXBlPSVkIHByb3RvY29sPSVkXG4iLCAKKyAgZHByaW50Zl9pbmZvKHdpbnNvY2ssICJXU19TT0NLRVQoJTA4eCk6IGFmPSVkIHR5cGU9JWQgcHJvdG9jb2w9JWRcbiIsIAogCQkJICAodW5zaWduZWQpcHdzaSwgYWYsIHR5cGUsIHByb3RvY29sKTsKIAogICBpZiggcHdzaSApCkBAIC0xMzc0LDcgKzEzNzIsNyBAQAogICAgIHsKICAgICAgICAgd3Nfc29ja2V0KiAgICAgIHBuZXcgPSB3c2lfYWxsb2Nfc29ja2V0KHB3c2ksIHNvY2spOwogCi0JZHByaW50Zl93aW5zb2NrKHN0ZGRlYiwiXHRjcmVhdGVkICVpIChoYW5kbGUgJTA0eClcbiIsIHNvY2ssIChVSU5UMTYpV1NfUFRSMkhBTkRMRShwbmV3KSk7CisJZHByaW50Zl9pbmZvKHdpbnNvY2ssIlx0Y3JlYXRlZCAlaSAoaGFuZGxlICUwNHgpXG4iLCBzb2NrLCAoVUlOVDE2KVdTX1BUUjJIQU5ETEUocG5ldykpOwogCiAgICAgICAgIGlmKCBwbmV3ICkgCiAJewpAQCAtMTM5NCw3ICsxMzkyLDcgQEAKICAgICB9IGVsc2UgcHdzaS0+ZXJyID0gd3NhRXJybm8oKTsKICAgfQogIAotICBkcHJpbnRmX3dpbnNvY2soc3RkZGViLCAiXHRcdGZhaWxlZCFcbiIpOworICBkcHJpbnRmX3dhcm4od2luc29jaywgIlx0XHRmYWlsZWQhXG4iKTsKICAgcmV0dXJuIElOVkFMSURfU09DS0VUMzI7CiB9CiAKQEAgLTE0NDEsNyArMTQzOSw3IEBACiBTRUdQVFIgV0lOQVBJIFdJTlNPQ0tfZ2V0aG9zdGJ5YWRkcjE2KGNvbnN0IGNoYXIgKmFkZHIsIElOVDE2IGxlbiwgSU5UMTYgdHlwZSkKIHsKICAgICBzdHJ1Y3QgV0lOX2hvc3RlbnQqIHJldHZhbDsKLSAgICBkcHJpbnRmX3dpbnNvY2soc3RkZGViLCAiV1NfR2V0SG9zdEJ5QWRkcjE2OiBwdHIgJTA4eCwgbGVuICVkLCB0eXBlICVkXG4iLAorICAgIGRwcmludGZfaW5mbyh3aW5zb2NrLCAiV1NfR2V0SG9zdEJ5QWRkcjE2OiBwdHIgJTA4eCwgbGVuICVkLCB0eXBlICVkXG4iLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICh1bnNpZ25lZCkgYWRkciwgbGVuLCB0eXBlKTsKICAgICByZXR2YWwgPSBfX3dzX2dldGhvc3RieWFkZHIoIGFkZHIsIGxlbiwgdHlwZSwgV1NfRFVQX1NFR1BUUiApOwogICAgIHJldHVybiByZXR2YWwgPyBTRUdQVFJfR0VUKHJldHZhbCkgOiAoKFNFR1BUUilOVUxMKTsKQEAgLTE0NTAsNyArMTQ0OCw3IEBACiBzdHJ1Y3QgV0lOX2hvc3RlbnQqIFdJTkFQSSBXSU5TT0NLX2dldGhvc3RieWFkZHIzMihjb25zdCBjaGFyICphZGRyLCBJTlQzMiBsZW4sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJTlQzMiB0eXBlKQogewotICAgIGRwcmludGZfd2luc29jayhzdGRkZWIsICJXU19HZXRIb3N0QnlBZGRyMzI6IHB0ciAlMDh4LCBsZW4gJWQsIHR5cGUgJWRcbiIsCisgICAgZHByaW50Zl9pbmZvKHdpbnNvY2ssICJXU19HZXRIb3N0QnlBZGRyMzI6IHB0ciAlMDh4LCBsZW4gJWQsIHR5cGUgJWRcbiIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICh1bnNpZ25lZCkgYWRkciwgbGVuLCB0eXBlKTsKICAgICByZXR1cm4gX193c19nZXRob3N0YnlhZGRyKGFkZHIsIGxlbiwgdHlwZSwgV1NfRFVQX0xJTkVBUik7CiB9CkBAIC0xNDc3LDE0ICsxNDc1LDE0IEBACiBTRUdQVFIgV0lOQVBJIFdJTlNPQ0tfZ2V0aG9zdGJ5bmFtZTE2KGNvbnN0IGNoYXIgKm5hbWUpCiB7CiAgICAgc3RydWN0IFdJTl9ob3N0ZW50KiByZXR2YWw7Ci0gICAgZHByaW50Zl93aW5zb2NrKHN0ZGRlYiwgIldTX0dldEhvc3RCeU5hbWUxNjogJXNcbiIsIChuYW1lKT9uYW1lOk5VTExfU1RSSU5HKTsKKyAgICBkcHJpbnRmX2luZm8od2luc29jaywgIldTX0dldEhvc3RCeU5hbWUxNjogJXNcbiIsIChuYW1lKT9uYW1lOk5VTExfU1RSSU5HKTsKICAgICByZXR2YWwgPSBfX3dzX2dldGhvc3RieW5hbWUoIG5hbWUsIFdTX0RVUF9TRUdQVFIgKTsKICAgICByZXR1cm4gKHJldHZhbCk/IFNFR1BUUl9HRVQocmV0dmFsKSA6ICgoU0VHUFRSKU5VTEwpIDsKIH0KIAogc3RydWN0IFdJTl9ob3N0ZW50KiBXSU5BUEkgV0lOU09DS19nZXRob3N0YnluYW1lMzIoY29uc3QgY2hhciogbmFtZSkKIHsKLSAgICBkcHJpbnRmX3dpbnNvY2soc3RkZGViLCAiV1NfR2V0SG9zdEJ5TmFtZTMyOiAlc1xuIiwgKG5hbWUpP25hbWU6TlVMTF9TVFJJTkcpOworICAgIGRwcmludGZfaW5mbyh3aW5zb2NrLCAiV1NfR2V0SG9zdEJ5TmFtZTMyOiAlc1xuIiwgKG5hbWUpP25hbWU6TlVMTF9TVFJJTkcpOwogICAgIHJldHVybiBfX3dzX2dldGhvc3RieW5hbWUoIG5hbWUsIFdTX0RVUF9MSU5FQVIgKTsKIH0KIApAQCAtMTUxMSwxNCArMTUwOSwxNCBAQAogU0VHUFRSIFdJTkFQSSBXSU5TT0NLX2dldHByb3RvYnluYW1lMTYoY29uc3QgY2hhciAqbmFtZSkKIHsKICAgICBzdHJ1Y3QgV0lOX3Byb3RvZW50KiByZXR2YWw7Ci0gICAgZHByaW50Zl93aW5zb2NrKHN0ZGRlYiwgIldTX0dldFByb3RvQnlOYW1lMTY6ICVzXG4iLCAobmFtZSk/bmFtZTpOVUxMX1NUUklORyk7CisgICAgZHByaW50Zl9pbmZvKHdpbnNvY2ssICJXU19HZXRQcm90b0J5TmFtZTE2OiAlc1xuIiwgKG5hbWUpP25hbWU6TlVMTF9TVFJJTkcpOwogICAgIHJldHZhbCA9IF9fd3NfZ2V0cHJvdG9ieW5hbWUobmFtZSwgV1NfRFVQX1NFR1BUUik7CiAgICAgcmV0dXJuIHJldHZhbCA/IFNFR1BUUl9HRVQocmV0dmFsKSA6ICgoU0VHUFRSKU5VTEwpOwogfQogCiBzdHJ1Y3QgV0lOX3Byb3RvZW50KiBXSU5BUEkgV0lOU09DS19nZXRwcm90b2J5bmFtZTMyKGNvbnN0IGNoYXIqIG5hbWUpCiB7Ci0gICAgZHByaW50Zl93aW5zb2NrKHN0ZGRlYiwgIldTX0dldFByb3RvQnlOYW1lMzI6ICVzXG4iLCAobmFtZSk/bmFtZTpOVUxMX1NUUklORyk7CisgICAgZHByaW50Zl9pbmZvKHdpbnNvY2ssICJXU19HZXRQcm90b0J5TmFtZTMyOiAlc1xuIiwgKG5hbWUpP25hbWU6TlVMTF9TVFJJTkcpOwogICAgIHJldHVybiBfX3dzX2dldHByb3RvYnluYW1lKG5hbWUsIFdTX0RVUF9MSU5FQVIpOwogfQogCkBAIC0xNTQ1LDE0ICsxNTQzLDE0IEBACiBTRUdQVFIgV0lOQVBJIFdJTlNPQ0tfZ2V0cHJvdG9ieW51bWJlcjE2KElOVDE2IG51bWJlcikKIHsKICAgICBzdHJ1Y3QgV0lOX3Byb3RvZW50KiByZXR2YWw7Ci0gICAgZHByaW50Zl93aW5zb2NrKHN0ZGRlYiwgIldTX0dldFByb3RvQnlOdW1iZXIxNjogJWlcbiIsIG51bWJlcik7CisgICAgZHByaW50Zl9pbmZvKHdpbnNvY2ssICJXU19HZXRQcm90b0J5TnVtYmVyMTY6ICVpXG4iLCBudW1iZXIpOwogICAgIHJldHZhbCA9IF9fd3NfZ2V0cHJvdG9ieW51bWJlcihudW1iZXIsIFdTX0RVUF9TRUdQVFIpOwogICAgIHJldHVybiByZXR2YWwgPyBTRUdQVFJfR0VUKHJldHZhbCkgOiAoKFNFR1BUUilOVUxMKTsKIH0KIAogc3RydWN0IFdJTl9wcm90b2VudCogV0lOQVBJIFdJTlNPQ0tfZ2V0cHJvdG9ieW51bWJlcjMyKElOVDMyIG51bWJlcikKIHsKLSAgICBkcHJpbnRmX3dpbnNvY2soc3RkZGViLCAiV1NfR2V0UHJvdG9CeU51bWJlcjMyOiAlaVxuIiwgbnVtYmVyKTsKKyAgICBkcHJpbnRmX2luZm8od2luc29jaywgIldTX0dldFByb3RvQnlOdW1iZXIzMjogJWlcbiIsIG51bWJlcik7CiAgICAgcmV0dXJuIF9fd3NfZ2V0cHJvdG9ieW51bWJlcihudW1iZXIsIFdTX0RVUF9MSU5FQVIpOwogfQogCkBAIC0xNTgzLDcgKzE1ODEsNyBAQAogU0VHUFRSIFdJTkFQSSBXSU5TT0NLX2dldHNlcnZieW5hbWUxNihjb25zdCBjaGFyICpuYW1lLCBjb25zdCBjaGFyICpwcm90bykKIHsKICAgICBzdHJ1Y3QgV0lOX3NlcnZlbnQqIHJldHZhbDsKLSAgICBkcHJpbnRmX3dpbnNvY2soc3RkZGViLCAiV1NfR2V0U2VydkJ5TmFtZTE2OiAnJXMnLCAnJXMnXG4iLAorICAgIGRwcmludGZfaW5mbyh3aW5zb2NrLCAiV1NfR2V0U2VydkJ5TmFtZTE2OiAnJXMnLCAnJXMnXG4iLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIChuYW1lKT9uYW1lOk5VTExfU1RSSU5HLCAocHJvdG8pP3Byb3RvOk5VTExfU1RSSU5HKTsKICAgICByZXR2YWwgPSBfX3dzX2dldHNlcnZieW5hbWUobmFtZSwgcHJvdG8sIFdTX0RVUF9TRUdQVFIpOwogICAgIHJldHVybiByZXR2YWwgPyBTRUdQVFJfR0VUKHJldHZhbCkgOiAoKFNFR1BUUilOVUxMKTsKQEAgLTE1OTEsNyArMTU4OSw3IEBACiAKIHN0cnVjdCBXSU5fc2VydmVudCogV0lOQVBJIFdJTlNPQ0tfZ2V0c2VydmJ5bmFtZTMyKGNvbnN0IGNoYXIgKm5hbWUsIGNvbnN0IGNoYXIgKnByb3RvKQogewotICAgIGRwcmludGZfd2luc29jayhzdGRkZWIsICJXU19HZXRTZXJ2QnlOYW1lMzI6ICclcycsICclcydcbiIsCisgICAgZHByaW50Zl9pbmZvKHdpbnNvY2ssICJXU19HZXRTZXJ2QnlOYW1lMzI6ICclcycsICclcydcbiIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKG5hbWUpP25hbWU6TlVMTF9TVFJJTkcsIChwcm90byk/cHJvdG86TlVMTF9TVFJJTkcpOwogICAgIHJldHVybiBfX3dzX2dldHNlcnZieW5hbWUobmFtZSwgcHJvdG8sIFdTX0RVUF9MSU5FQVIpOwogfQpAQCAtMTYyMyw3ICsxNjIxLDcgQEAKIFNFR1BUUiBXSU5BUEkgV0lOU09DS19nZXRzZXJ2Ynlwb3J0MTYoSU5UMTYgcG9ydCwgY29uc3QgY2hhciAqcHJvdG8pCiB7CiAgICAgc3RydWN0IFdJTl9zZXJ2ZW50KiByZXR2YWw7Ci0gICAgZHByaW50Zl93aW5zb2NrKHN0ZGRlYiwgIldTX0dldFNlcnZCeVBvcnQxNjogJWksICclcydcbiIsCisgICAgZHByaW50Zl9pbmZvKHdpbnNvY2ssICJXU19HZXRTZXJ2QnlQb3J0MTY6ICVpLCAnJXMnXG4iLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIChpbnQpcG9ydCwgKHByb3RvKT9wcm90bzpOVUxMX1NUUklORyk7CiAgICAgcmV0dmFsID0gX193c19nZXRzZXJ2Ynlwb3J0KHBvcnQsIHByb3RvLCBXU19EVVBfU0VHUFRSKTsKICAgICByZXR1cm4gcmV0dmFsID8gU0VHUFRSX0dFVChyZXR2YWwpIDogKChTRUdQVFIpTlVMTCk7CkBAIC0xNjMxLDcgKzE2MjksNyBAQAogCiBzdHJ1Y3QgV0lOX3NlcnZlbnQqIFdJTkFQSSBXSU5TT0NLX2dldHNlcnZieXBvcnQzMihJTlQzMiBwb3J0LCBjb25zdCBjaGFyICpwcm90bykKIHsKLSAgICBkcHJpbnRmX3dpbnNvY2soc3RkZGViLCAiV1NfR2V0U2VydkJ5UG9ydDMyOiAlaSwgJyVzJ1xuIiwKKyAgICBkcHJpbnRmX2luZm8od2luc29jaywgIldTX0dldFNlcnZCeVBvcnQzMjogJWksICclcydcbiIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGludClwb3J0LCAocHJvdG8pP3Byb3RvOk5VTExfU1RSSU5HKTsKICAgICByZXR1cm4gX193c19nZXRzZXJ2Ynlwb3J0KHBvcnQsIHByb3RvLCBXU19EVVBfTElORUFSKTsKIH0KQEAgLTE2NDQsNyArMTY0Miw3IEBACiB7CiAgICAgTFBXU0lORk8gICAgICAgICAgICAgIHB3c2kgPSB3c2lfZmluZChHZXRDdXJyZW50VGFzaygpKTsKIAotICAgIGRwcmludGZfd2luc29jayhzdGRkZWIsICJXU19HZXRIb3N0TmFtZSglMDh4KTogbmFtZSAlcywgbGVuICVkXG4iLAorICAgIGRwcmludGZfaW5mbyh3aW5zb2NrLCAiV1NfR2V0SG9zdE5hbWUoJTA4eCk6IG5hbWUgJXMsIGxlbiAlZFxuIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgKHVuc2lnbmVkKXB3c2ksIChuYW1lKT9uYW1lOk5VTExfU1RSSU5HLCBuYW1lbGVuKTsKICAgICBpZiggcHdzaSApCiAgICAgewpAQCAtMTY4NCw3ICsxNjgyLDcgQEAKIHsKICAgTFBXU0lORk8gICAgICAgICAgICAgIHB3c2kgPSB3c2lfZmluZChHZXRDdXJyZW50VGFzaygpKTsKIAotICBkcHJpbnRmX3dpbnNvY2soc3RkZGViLCAiV1NfQXN5bmNHZXRIb3N0QnlBZGRyMTYoJTA4eCk6IGh3bmQgJTA0eCwgbXNnICUwNHgsIGFkZHIgJTA4eFslaV1cbiIsCisgIGRwcmludGZfaW5mbyh3aW5zb2NrLCAiV1NfQXN5bmNHZXRIb3N0QnlBZGRyMTYoJTA4eCk6IGh3bmQgJTA0eCwgbXNnICUwNHgsIGFkZHIgJTA4eFslaV1cbiIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICh1bnNpZ25lZClwd3NpLCBoV25kLCB1TXNnLCAodW5zaWduZWQpYWRkciAsIGxlbiApOwogCiAgIGlmKCBwd3NpICkgCkBAIC0xNzAxLDcgKzE2OTksNyBAQAogewogICBMUFdTSU5GTyAgICAgICAgICAgICAgcHdzaSA9IHdzaV9maW5kKEdldEN1cnJlbnRUYXNrKCkpOwogCi0gIGRwcmludGZfd2luc29jayhzdGRkZWIsICJXU19Bc3luY0dldEhvc3RCeUFkZHIzMiglMDh4KTogaHduZCAlMDR4LCBtc2cgJTA4eCwgYWRkciAlMDh4WyVpXVxuIiwKKyAgZHByaW50Zl9pbmZvKHdpbnNvY2ssICJXU19Bc3luY0dldEhvc3RCeUFkZHIzMiglMDh4KTogaHduZCAlMDR4LCBtc2cgJTA4eCwgYWRkciAlMDh4WyVpXVxuIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgKHVuc2lnbmVkKXB3c2ksIChIV05EMTYpaFduZCwgdU1zZywgKHVuc2lnbmVkKWFkZHIgLCBsZW4gKTsKIAogICBpZiggcHdzaSApCkBAIC0xNzE5LDcgKzE3MTcsNyBAQAogewogICBMUFdTSU5GTyAgICAgICAgICAgICAgcHdzaSA9IHdzaV9maW5kKEdldEN1cnJlbnRUYXNrKCkpOwogCi0gIGRwcmludGZfd2luc29jayhzdGRkZWIsICJXU19Bc3luY0dldEhvc3RCeU5hbWUxNiglMDh4KTogaHduZCAlMDR4LCBtc2cgJTA0eCwgaG9zdCAlcywgCisgIGRwcmludGZfaW5mbyh3aW5zb2NrLCAiV1NfQXN5bmNHZXRIb3N0QnlOYW1lMTYoJTA4eCk6IGh3bmQgJTA0eCwgbXNnICUwNHgsIGhvc3QgJXMsIAogYnVmZmVyICVpXG4iLCAodW5zaWduZWQpcHdzaSwgaFduZCwgdU1zZywgKG5hbWUpP25hbWU6TlVMTF9TVFJJTkcsIChpbnQpYnVmbGVuICk7CiAKICAgaWYoIHB3c2kgKQpAQCAtMTczNSw3ICsxNzMzLDcgQEAKIAkJCQkJTFBTVFIgc2J1ZiwgSU5UMzIgYnVmbGVuKQogewogICBMUFdTSU5GTyAgICAgICAgICAgICAgcHdzaSA9IHdzaV9maW5kKEdldEN1cnJlbnRUYXNrKCkpOwotICBkcHJpbnRmX3dpbnNvY2soc3RkZGViLCAiV1NfQXN5bmNHZXRIb3N0QnlOYW1lMzIoJTA4eCk6IGh3bmQgJTA0eCwgbXNnICUwOHgsIGhvc3QgJXMsIAorICBkcHJpbnRmX2luZm8od2luc29jaywgIldTX0FzeW5jR2V0SG9zdEJ5TmFtZTMyKCUwOHgpOiBod25kICUwNHgsIG1zZyAlMDh4LCBob3N0ICVzLCAKIGJ1ZmZlciAlaVxuIiwgKHVuc2lnbmVkKXB3c2ksIChIV05EMTYpaFduZCwgdU1zZywgKG5hbWUpP25hbWU6TlVMTF9TVFJJTkcsIChpbnQpYnVmbGVuICk7CiAgIGlmKCBwd3NpICkKICAgICByZXR1cm4gX19XU0FzeW5jREJRdWVyeShwd3NpLCBoV25kLCB1TXNnLCAwLCBuYW1lLCAwLApAQCAtMTc1Miw3ICsxNzUwLDcgQEAKIHsKICAgTFBXU0lORk8gICAgICAgICAgICAgIHB3c2kgPSB3c2lfZmluZChHZXRDdXJyZW50VGFzaygpKTsKIAotICBkcHJpbnRmX3dpbnNvY2soc3RkZGViLCAiV1NfQXN5bmNHZXRQcm90b0J5TmFtZTE2KCUwOHgpOiBod25kICUwNHgsIG1zZyAlMDh4LCBwcm90b2NvbCAlc1xuIiwKKyAgZHByaW50Zl9pbmZvKHdpbnNvY2ssICJXU19Bc3luY0dldFByb3RvQnlOYW1lMTYoJTA4eCk6IGh3bmQgJTA0eCwgbXNnICUwOHgsIHByb3RvY29sICVzXG4iLAogICAgICAgICAgICAgICAgICAgICAgICAgICAodW5zaWduZWQpcHdzaSwgKEhXTkQxNiloV25kLCB1TXNnLCAobmFtZSk/bmFtZTpOVUxMX1NUUklORyApOwogCiAgIGlmKCBwd3NpICkKQEAgLTE3NjksNyArMTc2Nyw3IEBACiB7CiAgIExQV1NJTkZPICAgICAgICAgICAgICBwd3NpID0gd3NpX2ZpbmQoR2V0Q3VycmVudFRhc2soKSk7CiAKLSAgZHByaW50Zl93aW5zb2NrKHN0ZGRlYiwgIldTX0FzeW5jR2V0UHJvdG9CeU5hbWUzMiglMDh4KTogaHduZCAlMDR4LCBtc2cgJTA4eCwgcHJvdG9jb2wgJXNcbiIsCisgIGRwcmludGZfaW5mbyh3aW5zb2NrLCAiV1NfQXN5bmNHZXRQcm90b0J5TmFtZTMyKCUwOHgpOiBod25kICUwNHgsIG1zZyAlMDh4LCBwcm90b2NvbCAlc1xuIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgKHVuc2lnbmVkKXB3c2ksIChIV05EMTYpaFduZCwgdU1zZywgKG5hbWUpP25hbWU6TlVMTF9TVFJJTkcgKTsKIAogICBpZiggcHdzaSApCkBAIC0xNzg3LDcgKzE3ODUsNyBAQAogewogICBMUFdTSU5GTyAgICAgICAgICAgICAgcHdzaSA9IHdzaV9maW5kKEdldEN1cnJlbnRUYXNrKCkpOwogCi0gIGRwcmludGZfd2luc29jayhzdGRkZWIsICJXU19Bc3luY0dldFByb3RvQnlOdW1iZXIxNiglMDh4KTogaHduZCAlMDR4LCBtc2cgJTA0eCwgbnVtICVpXG4iLAorICBkcHJpbnRmX2luZm8od2luc29jaywgIldTX0FzeW5jR2V0UHJvdG9CeU51bWJlcjE2KCUwOHgpOiBod25kICUwNHgsIG1zZyAlMDR4LCBudW0gJWlcbiIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICh1bnNpZ25lZClwd3NpLCBoV25kLCB1TXNnLCBudW1iZXIgKTsKIAogICBpZiggcHdzaSApCkBAIC0xODA0LDcgKzE4MDIsNyBAQAogewogICBMUFdTSU5GTyAgICAgICAgICAgICAgcHdzaSA9IHdzaV9maW5kKEdldEN1cnJlbnRUYXNrKCkpOwogCi0gIGRwcmludGZfd2luc29jayhzdGRkZWIsICJXU19Bc3luY0dldFByb3RvQnlOdW1iZXIzMiglMDh4KTogaHduZCAlMDR4LCBtc2cgJTA4eCwgbnVtICVpXG4iLAorICBkcHJpbnRmX2luZm8od2luc29jaywgIldTX0FzeW5jR2V0UHJvdG9CeU51bWJlcjMyKCUwOHgpOiBod25kICUwNHgsIG1zZyAlMDh4LCBudW0gJWlcbiIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICh1bnNpZ25lZClwd3NpLCAoSFdORDE2KWhXbmQsIHVNc2csIG51bWJlciApOwogCiAgIGlmKCBwd3NpICkKQEAgLTE4MjIsNyArMTgyMCw3IEBACiB7CiAgIExQV1NJTkZPICAgICAgICAgICAgICBwd3NpID0gd3NpX2ZpbmQoR2V0Q3VycmVudFRhc2soKSk7CiAKLSAgZHByaW50Zl93aW5zb2NrKHN0ZGRlYiwgIldTX0FzeW5jR2V0U2VydkJ5TmFtZTE2KCUwOHgpOiBod25kICUwNHgsIG1zZyAlMDR4LCBuYW1lICVzLCBwcm90byAlc1xuIiwKKyAgZHByaW50Zl9pbmZvKHdpbnNvY2ssICJXU19Bc3luY0dldFNlcnZCeU5hbWUxNiglMDh4KTogaHduZCAlMDR4LCBtc2cgJTA0eCwgbmFtZSAlcywgcHJvdG8gJXNcbiIsCiAgICAgICAgICAgICAgICAgICAgKHVuc2lnbmVkKXB3c2ksIGhXbmQsIHVNc2csIChuYW1lKT9uYW1lOk5VTExfU1RSSU5HLCAocHJvdG8pP3Byb3RvOk5VTExfU1RSSU5HICk7CiAKICAgaWYoIHB3c2kgKQpAQCAtMTg0NCw3ICsxODQyLDcgQEAKIHsKICAgTFBXU0lORk8gICAgICAgICAgICAgIHB3c2kgPSB3c2lfZmluZChHZXRDdXJyZW50VGFzaygpKTsKIAotICBkcHJpbnRmX3dpbnNvY2soc3RkZGViLCAiV1NfQXN5bmNHZXRTZXJ2QnlOYW1lMzIoJTA4eCk6IGh3bmQgJTA0eCwgbXNnICUwOHgsIG5hbWUgJXMsIHByb3RvICVzXG4iLAorICBkcHJpbnRmX2luZm8od2luc29jaywgIldTX0FzeW5jR2V0U2VydkJ5TmFtZTMyKCUwOHgpOiBod25kICUwNHgsIG1zZyAlMDh4LCBuYW1lICVzLCBwcm90byAlc1xuIiwKICAgICAgICAgICAgKHVuc2lnbmVkKXB3c2ksIChIV05EMTYpaFduZCwgdU1zZywgKG5hbWUpP25hbWU6TlVMTF9TVFJJTkcsIChwcm90byk/cHJvdG86TlVMTF9TVFJJTkcgKTsKICAgaWYoIHB3c2kgKQogICB7CkBAIC0xODY2LDcgKzE4NjQsNyBAQAogewogICBMUFdTSU5GTyAgICAgICAgICAgICAgcHdzaSA9IHdzaV9maW5kKEdldEN1cnJlbnRUYXNrKCkpOwogCi0gIGRwcmludGZfd2luc29jayhzdGRkZWIsICJXU19Bc3luY0dldFNlcnZCeVBvcnQxNiglMDh4KTogaHduZCAlMDR4LCBtc2cgJTA0eCwgcG9ydCAlaSwgcHJvdG8gJXNcbiIsCisgIGRwcmludGZfaW5mbyh3aW5zb2NrLCAiV1NfQXN5bmNHZXRTZXJ2QnlQb3J0MTYoJTA4eCk6IGh3bmQgJTA0eCwgbXNnICUwNHgsIHBvcnQgJWksIHByb3RvICVzXG4iLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgKHVuc2lnbmVkKXB3c2ksIGhXbmQsIHVNc2csIHBvcnQsIChwcm90byk/cHJvdG86TlVMTF9TVFJJTkcgKTsKIAogICBpZiggcHdzaSApCkBAIC0xODg4LDcgKzE4ODYsNyBAQAogewogICBMUFdTSU5GTyAgICAgICAgICAgICAgcHdzaSA9IHdzaV9maW5kKEdldEN1cnJlbnRUYXNrKCkpOwogCi0gIGRwcmludGZfd2luc29jayhzdGRkZWIsICJXU19Bc3luY0dldFNlcnZCeVBvcnQzMiglMDh4KTogaHduZCAlMDR4LCBtc2cgJTA4eCwgcG9ydCAlaSwgcHJvdG8gJXNcbiIsCisgIGRwcmludGZfaW5mbyh3aW5zb2NrLCAiV1NfQXN5bmNHZXRTZXJ2QnlQb3J0MzIoJTA4eCk6IGh3bmQgJTA0eCwgbXNnICUwOHgsIHBvcnQgJWksIHByb3RvICVzXG4iLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgKHVuc2lnbmVkKXB3c2ksIChIV05EMTYpaFduZCwgdU1zZywgcG9ydCwgKHByb3RvKT9wcm90bzpOVUxMX1NUUklORyApOwogCiAgIGlmKCBwd3NpICkKQEAgLTE5MTIsNyArMTkxMCw3IEBACiAgICAgTFBXU0lORk8JCXB3c2kgPSB3c2lfZmluZChHZXRDdXJyZW50VGFzaygpKTsKICAgICB3c19hc3luY19vcCoJcF9hb3AgPSAod3NfYXN5bmNfb3AqKVdTX0hBTkRMRTJQVFIoaEFzeW5jVGFza0hhbmRsZSk7CiAKLSAgICBkcHJpbnRmX3dpbnNvY2soc3RkZGViLCAiV1NfQ2FuY2VsQXN5bmNSZXF1ZXN0KCUwOHgpOiBoYW5kbGUgJTA4eFxuIiwgCisgICAgZHByaW50Zl9pbmZvKHdpbnNvY2ssICJXU19DYW5jZWxBc3luY1JlcXVlc3QoJTA4eCk6IGhhbmRsZSAlMDh4XG4iLCAKIAkJCSAgICh1bnNpZ25lZClwd3NpLCBoQXN5bmNUYXNrSGFuZGxlKTsKICAgICBpZiggcHdzaSApCiAgICAgewpAQCAtMTk1Miw3ICsxOTUwLDcgQEAKICAgICBEV09SRAkJZHdFdmVudCwgZHdFcnJCeXRlczsKICAgICBpbnQJCQludW1fcG9zdGVkOwogCi0gICAgZHByaW50Zl93aW5zb2NrKHN0ZGRlYiwiV0lOU09DS19IYW5kbGVJTzogJWkgcGVuZGluZyBkZXNjcmlwdG9yc1xuIiwgbnVtX3BlbmRpbmcgKTsKKyAgICBkcHJpbnRmX2luZm8od2luc29jaywiV0lOU09DS19IYW5kbGVJTzogJWkgcGVuZGluZyBkZXNjcmlwdG9yc1xuIiwgbnVtX3BlbmRpbmcgKTsKIAogICAgIGZvciggbnVtX3Bvc3RlZCA9IGR3RXZlbnQgPSAwIDsgcHNvcDsgcHNvcCA9IHBzb3AtPm5leHQgKQogICAgIHsKQEAgLTE5NzAsNyArMTk2OCw3IEBACiAJICAgICAqIFJlZW5hYmxpbmcgY2FsbHMgdHVybiB0aGVtIGJhY2sgb24uCiAJICAgICAqLwogCi0JICAgIGRwcmludGZfd2luc29jayhzdGRkZWIsIlx0Y2hlY2tpbmcgcHNvcCA9IDB4JTA4eFxuIiwgKHVuc2lnbmVkKSBwc29wICk7CisJICAgIGRwcmludGZfaW5mbyh3aW5zb2NrLCJcdGNoZWNraW5nIHBzb3AgPSAweCUwOHhcbiIsICh1bnNpZ25lZCkgcHNvcCApOwogCiAJICAgIG51bV9wZW5kaW5nLS07CiAKQEAgLTIwNDYsNyArMjA0NCw3IEBACiAJCSAgICBpZiggUG9zdE1lc3NhZ2UzMkEoIHBzb3AtPmhXbmQsIHBzb3AtPnVNc2csIChXUEFSQU0zMilXU19QVFIySEFORExFKHBzb3AtPnB3cyksIAogCQkJICAgICAgICAgICAgICAoTFBBUkFNKVdTQU1BS0VTRUxFQ1RSRVBMWSggV1NfRkRfV1JJVEUsIDAgKSApICkKIAkJICAgIHsKLQkJCWRwcmludGZfd2luc29jayhzdGRkZWIsICJcdCAgICBod25kICUwNHggLSAlMDR4LCAlMDh4XG4iLAorCQkJZHByaW50Zl9pbmZvKHdpbnNvY2ssICJcdCAgICBod25kICUwNHggLSAlMDR4LCAlMDh4XG4iLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwc29wLT5oV25kLCBwc29wLT51TXNnLCAodW5zaWduZWQpTUFLRUxPTkcoV1NfRkRfV1JJVEUsIDApICk7CiAJCQlGRF9DTFIoIGZkLCAmZXZlbnRfc2V0W0VWRU5UX0lPX1dSSVRFXSApOwogCQkJbnVtX3Bvc3RlZCsrOwpAQCAtMjEwOCw3ICsyMTA2LDcgQEAKIAogCSAgICBpZiggYlBvc3QgKQogCSAgICB7Ci0JCWRwcmludGZfd2luc29jayhzdGRkZWIsICJcdCAgICBod25kICUwNHggLSAlMDR4LCAlMDh4XG4iLCAKKwkJZHByaW50Zl9pbmZvKHdpbnNvY2ssICJcdCAgICBod25kICUwNHggLSAlMDR4LCAlMDh4XG4iLCAKIAkJCQlwc29wLT5oV25kLCBwc29wLT51TXNnLCAodW5zaWduZWQpZHdFdmVudCApOwogCQlQb3N0TWVzc2FnZTMyQSggcHNvcC0+aFduZCwgcHNvcC0+dU1zZywgCiAJCQkgICAgICAoV1BBUkFNMzIpV1NfUFRSMkhBTkRMRShwc29wLT5wd3MpLCAoTFBBUkFNKWR3RXZlbnQgKTsKQEAgLTIxMTksNyArMjExNyw3IEBACiAJaWYoIG51bV9wZW5kaW5nIDw9IDAgKSBicmVhazsKICAgICB9CiAKLSAgICBkcHJpbnRmX3dpbnNvY2soc3RkZGViLCAiXHRkb25lLCAlaSBwb3N0ZWQgZXZlbnRzXG4iLCBudW1fcG9zdGVkICk7CisgICAgZHByaW50Zl9pbmZvKHdpbnNvY2ssICJcdGRvbmUsICVpIHBvc3RlZCBldmVudHNcbiIsIG51bV9wb3N0ZWQgKTsKICAgICByZXR1cm4gKCBudW1fcG9zdGVkICkgPyBUUlVFIDogRkFMU0U7CiB9CiAKQEAgLTIxMjgsNyArMjEyNiw3IEBACiAgICAgd3Nfc29ja2V0KiAgICBwd3MgID0gKHdzX3NvY2tldCopV1NfSEFORExFMlBUUihzKTsKICAgICBMUFdTSU5GTyAgICAgIHB3c2kgPSB3c2lfZmluZChHZXRDdXJyZW50VGFzaygpKTsKIAotICAgIGRwcmludGZfd2luc29jayhzdGRkZWIsICJXU19Bc3luY1NlbGVjdCglMDh4KTogJTA0eCwgaFduZCAlMDR4LCB1TXNnICUwOHgsIGV2ZW50ICUwOHhcbiIsCisgICAgZHByaW50Zl9pbmZvKHdpbnNvY2ssICJXU19Bc3luY1NlbGVjdCglMDh4KTogJTA0eCwgaFduZCAlMDR4LCB1TXNnICUwOHgsIGV2ZW50ICUwOHhcbiIsCiAJCQkgICh1bnNpZ25lZClwd3NpLCAoU09DS0VUMTYpcywgKEhXTkQxNiloV25kLCB1TXNnLCAodW5zaWduZWQpbEV2ZW50ICk7CiAgICAgaWYoIF9jaGVja193cyhwd3NpLCBwd3MpICkKICAgICB7CkBAIC0yMTQ5LDcgKzIxNDcsNyBAQAogCSAgICBpZiggcHdzLT5mbGFncyAmIChXU19GRF9DT05ORUNUIHwgV1NfRkRfV1JJVEUpICkKIAkJRVZFTlRfRGVsZXRlSU8oIHB3cy0+ZmQsIEVWRU5UX0lPX1dSSVRFICk7CiAKLQkgICAgZHByaW50Zl93aW5zb2NrKHN0ZGRlYiwiXHRyZW1vdmluZyBwc29wID0gMHglMDh4XG4iLCAodW5zaWduZWQpIHBzb3AgKTsKKwkgICAgZHByaW50Zl9pbmZvKHdpbnNvY2ssIlx0cmVtb3ZpbmcgcHNvcCA9IDB4JTA4eFxuIiwgKHVuc2lnbmVkKSBwc29wICk7CiAKIAkgICAgV1NfRlJFRSggcHdzLT5wc29wICk7CiAJICAgIHB3cy0+ZmxhZ3MgJj0gfihXU19GRF9SQVcgfCBXU19GRF9BQ0NFUFQgfCBXU19GRF9DT05ORUNUIHwgCkBAIC0yMTg4LDcgKzIxODYsNyBAQAogCiAJCS8qIFRPRE86IGhhbmRsZSBXU19GRF9BQ0NFUFQgcmlnaHQgYXdheSBpZiB0aGUgc29ja2V0IGlzIHJlYWRhYmxlICovCiAKLQkJZHByaW50Zl93aW5zb2NrKHN0ZGRlYiwiXHRjcmVhdGluZyBwc29wID0gMHglMDh4XG4iLCAodW5zaWduZWQpcHNvcCApOworCQlkcHJpbnRmX2luZm8od2luc29jaywiXHRjcmVhdGluZyBwc29wID0gMHglMDh4XG4iLCAodW5zaWduZWQpcHNvcCApOwogCiAJCXJldHVybiAwOyAvKiBzdWNjZXNzICovCiAJICAgIH0KQEAgLTIyMTMsNyArMjIxMSw3IEBACiB7CiAgIGludCBpID0gc2V0LT5mZF9jb3VudDsKICAgCi0gIGRwcmludGZfd2luc29jayhzdGRkZWIsICJfX1dTQUZESXNTZXQxNiglZCwlOGx4KCVpKSlcbiIsIHMsKHVuc2lnbmVkIGxvbmcpc2V0LCBpKTsKKyAgZHByaW50Zl9pbmZvKHdpbnNvY2ssICJfX1dTQUZESXNTZXQxNiglZCwlOGx4KCVpKSlcbiIsIHMsKHVuc2lnbmVkIGxvbmcpc2V0LCBpKTsKICAgICAKICAgd2hpbGUgKGktLSkKICAgICAgIGlmIChzZXQtPmZkX2FycmF5W2ldID09IHMpIHJldHVybiAxOwpAQCAtMjIyNyw3ICsyMjI1LDcgQEAKIHsKICAgaW50IGkgPSBzZXQtPmZkX2NvdW50OwogCi0gIGRwcmludGZfd2luc29jayhzdGRkZWIsICJfX1dTQUZESXNTZXQzMiglZCwlOGx4KCVpKSlcbiIsIHMsKHVuc2lnbmVkIGxvbmcpc2V0LCBpKTsKKyAgZHByaW50Zl9pbmZvKHdpbnNvY2ssICJfX1dTQUZESXNTZXQzMiglZCwlOGx4KCVpKSlcbiIsIHMsKHVuc2lnbmVkIGxvbmcpc2V0LCBpKTsKIAogICB3aGlsZSAoaS0tKQogICAgICAgaWYgKHNldC0+ZmRfYXJyYXlbaV0gPT0gcykgcmV0dXJuIDE7CkBAIC0yMjQ3LDcgKzIyNDUsNyBAQAogICAgKiBOb3RlOiBJdCBpcyBhbGxvd2VkIHRvIGNhbGwgdGhpcyBmdW5jdGlvbiB3aXRob3V0IHByaW9yIFdTQVN0YXJ0dXAoKS4KICAgICovCiAKLSAgZHByaW50Zl93aW5zb2NrKHN0ZGRlYiwgIldTX0lzQmxvY2tpbmcoKVxuIik7CisgIGRwcmludGZfaW5mbyh3aW5zb2NrLCAiV1NfSXNCbG9ja2luZygpXG4iKTsKICAgcmV0dXJuIEZBTFNFOwogfQogCkBAIC0yMjU4LDcgKzIyNTYsNyBAQAogewogICBMUFdTSU5GTyAgICAgICAgICAgICAgcHdzaSA9IHdzaV9maW5kKEdldEN1cnJlbnRUYXNrKCkpOwogCi0gIGRwcmludGZfd2luc29jayhzdGRkZWIsICJXU19DYW5jZWxCbG9ja2luZ0NhbGwoJTA4eClcbiIsICh1bnNpZ25lZClwd3NpKTsKKyAgZHByaW50Zl9pbmZvKHdpbnNvY2ssICJXU19DYW5jZWxCbG9ja2luZ0NhbGwoJTA4eClcbiIsICh1bnNpZ25lZClwd3NpKTsKIAogICBpZiggcHdzaSApIHJldHVybiAwOwogICByZXR1cm4gU09DS0VUX0VSUk9SOwpAQCAtMjI3Myw3ICsyMjcxLDcgQEAKICAgRkFSUFJPQzE2CQlwcmV2OwogICBMUFdTSU5GTyAgICAgICAgICAgICAgcHdzaSA9IHdzaV9maW5kKEdldEN1cnJlbnRUYXNrKCkpOwogCi0gIGRwcmludGZfd2luc29jayhzdGRkZWIsICJXU19TZXRCbG9ja2luZ0hvb2sxNiglMDh4KTogaG9vayAlMDh4XG4iLCAKKyAgZHByaW50Zl9pbmZvKHdpbnNvY2ssICJXU19TZXRCbG9ja2luZ0hvb2sxNiglMDh4KTogaG9vayAlMDh4XG4iLCAKIAkJCSAgKHVuc2lnbmVkKXB3c2ksICh1bnNpZ25lZCkgbHBCbG9ja0Z1bmMpOwogICBpZiggcHdzaSApIAogICB7IApAQCAtMjI5NCw3ICsyMjkyLDcgQEAKICAgRkFSUFJPQzMyICAgICAgICAgICAgIHByZXY7CiAgIExQV1NJTkZPICAgICAgICAgICAgICBwd3NpID0gd3NpX2ZpbmQoR2V0Q3VycmVudFRhc2soKSk7CiAKLSAgZHByaW50Zl93aW5zb2NrKHN0ZGRlYiwgIldTX1NldEJsb2NraW5nSG9vazMyKCUwOHgpOiBob29rICUwOHhcbiIsCisgIGRwcmludGZfaW5mbyh3aW5zb2NrLCAiV1NfU2V0QmxvY2tpbmdIb29rMzIoJTA4eCk6IGhvb2sgJTA4eFxuIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgKHVuc2lnbmVkKXB3c2ksICh1bnNpZ25lZCkgbHBCbG9ja0Z1bmMpOwogICBpZiggcHdzaSApIHsKICAgICAgIHByZXYgPSAoRkFSUFJPQzMyKXB3c2ktPmJsb2NraW5nX2hvb2s7CkBAIC0yMzEzLDcgKzIzMTEsNyBAQAogewogICAgIExQV1NJTkZPICAgICAgICAgICAgICBwd3NpID0gd3NpX2ZpbmQoR2V0Q3VycmVudFRhc2soKSk7CiAKLSAgICBkcHJpbnRmX3dpbnNvY2soc3RkZGViLCAiV1NfVW5ob29rQmxvY2tpbmdIb29rMTYoJTA4eClcbiIsICh1bnNpZ25lZClwd3NpKTsKKyAgICBkcHJpbnRmX2luZm8od2luc29jaywgIldTX1VuaG9va0Jsb2NraW5nSG9vazE2KCUwOHgpXG4iLCAodW5zaWduZWQpcHdzaSk7CiAgICAgaWYoIHB3c2kgKSByZXR1cm4gKElOVDE2KShwd3NpLT5ibG9ja2luZ19ob29rID0gMCk7CiAgICAgcmV0dXJuIFNPQ0tFVF9FUlJPUjsKIH0KQEAgLTIzMjYsNyArMjMyNCw3IEBACiB7CiAgICAgTFBXU0lORk8gICAgICAgICAgICAgIHB3c2kgPSB3c2lfZmluZChHZXRDdXJyZW50VGFzaygpKTsKIAotICAgIGRwcmludGZfd2luc29jayhzdGRkZWIsICJXU19Vbmhvb2tCbG9ja2luZ0hvb2szMiglMDh4KVxuIiwgKHVuc2lnbmVkKXB3c2kpOworICAgIGRwcmludGZfaW5mbyh3aW5zb2NrLCAiV1NfVW5ob29rQmxvY2tpbmdIb29rMzIoJTA4eClcbiIsICh1bnNpZ25lZClwd3NpKTsKICAgICBpZiggcHdzaSApCiAgICAgewogCXB3c2ktPmJsb2NraW5nX2hvb2sgPSAwOwpAQCAtMjU3MywxMCArMjU3MSwxMCBAQAogewogICAgIGludAlsb2NfZXJybm8gPSBlcnJubzsgCiAjaWYgZGVmaW5lZChfX0ZyZWVCU0RfXykKLSAgICAgICBkcHJpbnRmX3dpbnNvY2soc3RkZXJyLCAid2luc29jazogZXJybm8gJWQsICglcykuXG4iLCAKKyAgICAgICBkcHJpbnRmX2Vycih3aW5zb2NrLCAid2luc29jazogZXJybm8gJWQsICglcykuXG4iLCAKICAgICAgICAgICAgICAgICAJCQkgZXJybm8sIHN0cmVycm9yKGVycm5vKSk7CiAjZWxzZQotICAgICAgIGRwcmludGZfd2luc29jayhzdGRlcnIsICJ3aW5zb2NrOiBlcnJubyAlZFxuIiwgZXJybm8pOworICAgICAgIGRwcmludGZfZXJyKHdpbnNvY2ssICJ3aW5zb2NrOiBlcnJubyAlZFxuIiwgZXJybm8pOwogI2VuZGlmCiAKICAgICBzd2l0Y2gobG9jX2Vycm5vKQpAQCAtMjY0OCwxMyArMjY0NiwxMCBAQAogICAgIGludAkJbG9jX2Vycm5vID0gaF9lcnJubzsKIAogI2lmIGRlZmluZWQoX19GcmVlQlNEX18pCi0gICAgZHByaW50Zl93aW5zb2NrKHN0ZGVyciwgIndpbnNvY2s6IGhfZXJybm8gJWQsICglcykuXG4iLCAKKyAgICBkcHJpbnRmX2Vycih3aW5zb2NrLCAid2luc29jazogaF9lcnJubyAlZCwgKCVzKS5cbiIsIAogICAgICAgICAgICAgICAgCSAgICBoX2Vycm5vLCBzdHJlcnJvcihoX2Vycm5vKSk7CiAjZWxzZQotICAgIGRwcmludGZfd2luc29jayhzdGRlcnIsICJ3aW5zb2NrOiBoX2Vycm5vICVkLlxuIiwgaF9lcnJubyk7Ci0jaWZuZGVmIHN1bgotICAgIGlmKCBkZWJ1Z2dpbmdfd2luc29jayApICBoZXJyb3IoIndpbmU6IHdpbnNvY2s6IHdzYWhlcnJubyIpOwotI2VuZGlmCisgICAgZHByaW50Zl9lcnIod2luc29jaywgIndpbnNvY2s6IGhfZXJybm8gJWQuXG4iLCBoX2Vycm5vKTsKICNlbmRpZgogCiAgICAgc3dpdGNoKGxvY19lcnJubykKZGlmZiAtLWdpdCBhL21pc2Mvd2luc29ja19kbnMuYyBiL21pc2Mvd2luc29ja19kbnMuYwppbmRleCA0MTUwYjljLi4wMjlkOTczIDEwMDY0NAotLS0gYS9taXNjL3dpbnNvY2tfZG5zLmMKKysrIGIvbWlzYy93aW5zb2NrX2Rucy5jCkBAIC0xMzYsNyArMTM2LDcgQEAKICAgICBpbnQgbnVtID0gMDsKICAgICB3c19hc3luY19vcCogICBwLCAqbmV4dDsKIAotICAgIGRwcmludGZfd2luc29jayhzdGRkZWIsIlx0Y2FuY2VsbGluZyBhc3luYyBETlMgcmVxdWVzdHMuLi4gIik7CisgICAgZHByaW50Zl9pbmZvKHdpbnNvY2ssIiBjYW5jZWxsaW5nIGFzeW5jIEROUyByZXF1ZXN0cy4uLiBcbiIpOwogCiAgICAgU0lHTkFMX01hc2tBc3luY0V2ZW50cyggVFJVRSApOwogICAgIG5leHQgPSBfX2FzeW5jX29wX2xpc3Q7CkBAIC0xNTMsNyArMTUzLDcgQEAKIAl9CiAgICAgfQogICAgIFNJR05BTF9NYXNrQXN5bmNFdmVudHMoIEZBTFNFICk7Ci0gICAgZHByaW50Zl93aW5zb2NrKHN0ZGRlYiwiJWkgdG90YWxcbiIsIG51bSApOworICAgIGRwcmludGZfaW5mbyh3aW5zb2NrLCIgLT4gJWkgdG90YWxcbiIsIG51bSApOwogfQogCiB2b2lkIFdJTlNPQ0tfbGlua19hc3luY19vcCh3c19hc3luY19vcCogcF9hb3ApCkBAIC0xNzYsNyArMTc2LDcgQEAKIAkgIHsKIAkgICAgICB3c19hc3luY19vcCogZGVhZCA9IHA7CiAKLQkgICAgICBkcHJpbnRmX3dpbnNvY2soc3RkZGViLCJcdHJlYXBpbmcgZGVhZCBhb3AgWyUwOHhdXG4iLCAodW5zaWduZWQpcCApOworCSAgICAgIGRwcmludGZfaW5mbyh3aW5zb2NrLCJcdHJlYXBpbmcgZGVhZCBhb3AgWyUwOHhdXG4iLCAodW5zaWduZWQpcCApOwogCiAJICAgICAgcCA9IHAtPm5leHQ7CiAJICAgICAgV0lOU09DS191bmxpbmtfYXN5bmNfb3AoIGRlYWQgKTsKQEAgLTM0Myw3ICszNDMsNyBAQAogCSAgICBhc3luY19jdGwud3NfYW9wLT5waWQgPSBmb3JrKCk7CiAJICAgIGlmKCBhc3luY19jdGwud3NfYW9wLT5waWQgKQogCSAgICB7Ci0JCWRwcmludGZfd2luc29jayhzdGRkZWIsICJcdGFzeW5jX29wID0gJTA0eCAoY2hpbGQgJWkpXG4iLCAKKwkJZHByaW50Zl9pbmZvKHdpbnNvY2ssICJcdGFzeW5jX29wID0gJTA0eCAoY2hpbGQgJWkpXG4iLCAKIAkJCQloYW5kbGUsIGFzeW5jX2N0bC53c19hb3AtPnBpZCk7CiAKIAkJY2xvc2UoYXN5bmNfY3RsLndzX2FvcC0+ZmRbMV0pOyAgLyogd3JpdGUgZW5kcG9pbnQgKi8KQEAgLTQ1Miw3ICs0NTIsNyBAQAogCSA6IGdldGhvc3RieWFkZHIoYXN5bmNfY3RsLnJxLm5hbWUsCiAJCSAJIGFzeW5jX2N0bC5pbGVuZ3RoLCBhc3luY19jdGwudHlwZSk7CiAKLSAgZHByaW50Zl93aW5zb2NrKHN0ZGRlYiwiRE5TOiBnb3QgaG9zdGVudCBmb3IgWyVzXVxuIiwgYXN5bmNfY3RsLnJxLm5hbWUgKTsKKyAgZHByaW50Zl9pbmZvKHdpbnNvY2ssIkROUzogZ290IGhvc3RlbnQgZm9yIFslc11cbiIsIGFzeW5jX2N0bC5ycS5uYW1lICk7CiAKICAgaWYoIHBfaGUgKSAvKiBjb252ZXJ0IHRvIHRoZSBXaW5zb2NrIGZvcm1hdCB3aXRoIGludGVybmFsIHBvaW50ZXJzIGFzIG9mZnNldHMgKi8KICAgICAgIHNpemUgPSBXU19kdXBfaGUocHdzaSwgcF9oZSwgV1NfRFVQX09GRlNFVCB8IApAQCAtNDc2LDcgKzQ3Niw3IEBACiAJID8gZ2V0cHJvdG9ieW5hbWUoYXN5bmNfY3RsLnJxLm5hbWUpCiAJIDogZ2V0cHJvdG9ieW51bWJlcihhc3luY19jdGwudHlwZSk7CiAKLSAgZHByaW50Zl93aW5zb2NrKHN0ZGRlYiwiRE5TOiBnb3QgcHJvdG9lbnQgZm9yIFslc11cbiIsIGFzeW5jX2N0bC5ycS5uYW1lICk7CisgIGRwcmludGZfaW5mbyh3aW5zb2NrLCJETlM6IGdvdCBwcm90b2VudCBmb3IgWyVzXVxuIiwgYXN5bmNfY3RsLnJxLm5hbWUgKTsKIAogICBpZiggcF9wZSApIC8qIGNvbnZlcnQgdG8gdGhlIFdpbnNvY2sgZm9ybWF0IHdpdGggaW50ZXJuYWwgcG9pbnRlcnMgYXMgb2Zmc2V0cyAqLwogICAgICAgc2l6ZSA9IFdTX2R1cF9wZShwd3NpLCBwX3BlLCBXU19EVVBfT0ZGU0VUIHwKZGlmZiAtLWdpdCBhL21pc2Mvd3NwcmludGYuYyBiL21pc2Mvd3NwcmludGYuYwppbmRleCA5MzZhZmQwLi4wNDNmNWU5IDEwMDY0NAotLS0gYS9taXNjL3dzcHJpbnRmLmMKKysrIGIvbWlzYy93c3ByaW50Zi5jCkBAIC0xMSw3ICsxMSw3IEBACiAjaW5jbHVkZSAibGR0LmgiCiAjaW5jbHVkZSAic3RhY2tmcmFtZS5oIgogI2luY2x1ZGUgImRlYnVnLmgiCi0jaW5jbHVkZSAic3RkZGVidWcuaCIKKwogCiAjZGVmaW5lIFdQUklOVEZfTEVGVEFMSUdOICAgMHgwMDAxICAvKiBBbGlnbiBvdXRwdXQgb24gdGhlIGxlZnQgKCctJyBwcmVmaXgpICovCiAjZGVmaW5lIFdQUklOVEZfUFJFRklYX0hFWCAgMHgwMDAyICAvKiBQcmVmaXggaGV4IHdpdGggMHggKCcjJyBwcmVmaXgpICovCkBAIC0zOTYsNyArMzk2LDcgQEAKICAgICAgICAgbWF4bGVuIC09IGxlbjsKICAgICB9CiAgICAgKnAgPSAwOwotICAgIGRwcmludGZfc3RyaW5nKHN0ZGRlYiwiJXNcbiIsYnVmZmVyKTsKKyAgICBkcHJpbnRmX2luZm8oc3RyaW5nLCIlc1xuIixidWZmZXIpOwogICAgIHJldHVybiAobWF4bGVuID4gMSkgPyAoSU5UMzIpKHAgLSBidWZmZXIpIDogLTE7CiB9CiAKQEAgLTQ3Nyw3ICs0NzcsNyBAQAogICovCiBJTlQxNiBXSU5BUEkgd3ZzcHJpbnRmMTYoIExQU1RSIGJ1ZmZlciwgTFBDU1RSIHNwZWMsIExQQ1ZPSUQgYXJncyApCiB7Ci0gICAgZHByaW50Zl9zdHJpbmcoc3RkZGViLCJ3dnNwcmludGYxNiBmb3IgJXAgZ290ICIsYnVmZmVyKTsKKyAgICBkcHJpbnRmX2luZm8oc3RyaW5nLCJ3dnNwcmludGYxNiBmb3IgJXAgZ290OlxuIixidWZmZXIpOwogICAgIHJldHVybiB3dnNucHJpbnRmMTYoIGJ1ZmZlciwgMHhmZmZmLCBzcGVjLCBhcmdzICk7CiB9CiAKQEAgLTQ4Nyw3ICs0ODcsNyBAQAogICovCiBJTlQzMiBXSU5BUEkgd3ZzcHJpbnRmMzJBKCBMUFNUUiBidWZmZXIsIExQQ1NUUiBzcGVjLCB2YV9saXN0IGFyZ3MgKQogewotICAgIGRwcmludGZfc3RyaW5nKHN0ZGRlYiwid3ZzcHJpbnRmMzJBIGZvciAlcCBnb3QgIixidWZmZXIpOworICAgIGRwcmludGZfaW5mbyhzdHJpbmcsInd2c3ByaW50ZjMyQSBmb3IgJXAgZ290OlxuIixidWZmZXIpOwogICAgIHJldHVybiB3dnNucHJpbnRmMzJBKCBidWZmZXIsIDB4ZmZmZmZmZmYsIHNwZWMsIGFyZ3MgKTsKIH0KIApAQCAtNDk3LDcgKzQ5Nyw3IEBACiAgKi8KIElOVDMyIFdJTkFQSSB3dnNwcmludGYzMlcoIExQV1NUUiBidWZmZXIsIExQQ1dTVFIgc3BlYywgdmFfbGlzdCBhcmdzICkKIHsKLSAgICBkcHJpbnRmX3N0cmluZyhzdGRkZWIsInd2c3ByaW50ZjMyVyBmb3IgJXAgZ290ICIsYnVmZmVyKTsKKyAgICBkcHJpbnRmX2luZm8oc3RyaW5nLCJ3dnNwcmludGYzMlcgZm9yICVwIGdvdDpcbiIsYnVmZmVyKTsKICAgICByZXR1cm4gd3ZzbnByaW50ZjMyVyggYnVmZmVyLCAweGZmZmZmZmZmLCBzcGVjLCBhcmdzICk7CiB9CiAKQEAgLTUxMSw3ICs1MTEsNyBAQAogICAgIHZhX2xpc3QgdmFsaXN0OwogICAgIElOVDE2IHJlczsKIAotICAgIGRwcmludGZfc3RyaW5nKHN0ZGRlYiwid3NwcmludGYxNiBmb3IgJXAgZ290ICIsYnVmZmVyKTsKKyAgICBkcHJpbnRmX2luZm8oc3RyaW5nLCJ3c3ByaW50ZjE2IGZvciAlcCBnb3Q6XG4iLGJ1ZmZlcik7CiAgICAgdmFfc3RhcnQoIHZhbGlzdCwgc3BlYyApOwogICAgIC8qIE5vdGU6IHdlIGNhbGwgdGhlIDMyLWJpdCB2ZXJzaW9uLCBiZWNhdXNlIHRoZSBhcmdzIGFyZSAzMi1iaXQgKi8KICAgICByZXMgPSAoSU5UMTYpd3ZzbnByaW50ZjMyQSggYnVmZmVyLCAweGZmZmZmZmZmLCBzcGVjLCB2YWxpc3QgKTsKQEAgLTUyOSw3ICs1MjksNyBAQAogICAgIFZBX1NUQVJUMTYoIHZhbGlzdCApOwogICAgIGJ1ZmZlciA9IFZBX0FSRzE2KCB2YWxpc3QsIFNFR1BUUiApOwogICAgIHNwZWMgICA9IFZBX0FSRzE2KCB2YWxpc3QsIFNFR1BUUiApOwotICAgIGRwcmludGZfc3RyaW5nKHN0ZGRlYiwiV0lOMTZfd3NwcmludGYxNiBnb3QgIik7CisgICAgZHByaW50Zl9pbmZvKHN0cmluZywiV0lOMTZfd3NwcmludGYxNiBnb3Q6XG4iKTsKICAgICByZXMgPSB3dnNucHJpbnRmMTYoIChMUFNUUilQVFJfU0VHX1RPX0xJTihidWZmZXIpLCAweGZmZmYsCiAgICAgICAgICAgICAgICAgICAgICAgICAoTFBDU1RSKVBUUl9TRUdfVE9fTElOKHNwZWMpLCB2YWxpc3QgKTsKICAgICBWQV9FTkQxNiggdmFsaXN0ICk7CkBAIC01NDUsNyArNTQ1LDcgQEAKICAgICB2YV9saXN0IHZhbGlzdDsKICAgICBJTlQzMiByZXM7CiAKLSAgICBkcHJpbnRmX3N0cmluZyhzdGRkZWIsIndzcHJpbnRmMzJBIGZvciAlcCBnb3QgIixidWZmZXIpOworICAgIGRwcmludGZfaW5mbyhzdHJpbmcsIndzcHJpbnRmMzJBIGZvciAlcCBnb3Q6XG4iLGJ1ZmZlcik7CiAgICAgdmFfc3RhcnQoIHZhbGlzdCwgc3BlYyApOwogICAgIHJlcyA9IHd2c25wcmludGYzMkEoIGJ1ZmZlciwgMHhmZmZmZmZmZiwgc3BlYywgdmFsaXN0ICk7CiAgICAgdmFfZW5kKCB2YWxpc3QgKTsKQEAgLTU2MSw3ICs1NjEsNyBAQAogICAgIHZhX2xpc3QgdmFsaXN0OwogICAgIElOVDMyIHJlczsKIAotICAgIGRwcmludGZfc3RyaW5nKHN0ZGRlYiwid3NwcmludGYzMlcgZm9yICVwXG4iLGJ1ZmZlcik7CisgICAgZHByaW50Zl9pbmZvKHN0cmluZywid3NwcmludGYzMlcgZm9yICVwXG4iLGJ1ZmZlcik7CiAgICAgdmFfc3RhcnQoIHZhbGlzdCwgc3BlYyApOwogICAgIHJlcyA9IHd2c25wcmludGYzMlcoIGJ1ZmZlciwgMHhmZmZmZmZmZiwgc3BlYywgdmFsaXN0ICk7CiAgICAgdmFfZW5kKCB2YWxpc3QgKTsKZGlmZiAtLWdpdCBhL21pc2NlbXUvZW11bGF0ZS5jIGIvbWlzY2VtdS9lbXVsYXRlLmMKaW5kZXggNmU1ZWM1OC4uOTI2MWVhYSAxMDA2NDQKLS0tIGEvbWlzY2VtdS9lbXVsYXRlLmMKKysrIGIvbWlzY2VtdS9lbXVsYXRlLmMKQEAgLTEsOCArMSw2IEBACiAjaW5jbHVkZSA8c3RkbGliLmg+CiAjaW5jbHVkZSA8c3RkaW8uaD4KICNpbmNsdWRlICJtaXNjZW11LmgiCi0jaW5jbHVkZSAic3RkZGVidWcuaCIKLS8qICNkZWZpbmUgREVCVUdfSU5UICovCiAjaW5jbHVkZSAiZGVidWcuaCIKIAogc3RydWN0IFdpbjg3RW1JbmZvU3RydWN0CkBAIC0zMCw3ICsyOCw3IEBACiAKIHZvaWQgV0lOQVBJIFdJTjg3X2ZwbWF0aCggQ09OVEVYVCAqY29udGV4dCApCiB7Ci0gICAgZHByaW50Zl9pbnQoc3RkZGViLCAiX2ZwbWF0aDogKGNzOmVpcD0leDolbHggZXM9JXggYng9JTA0eCBheD0lMDR4IGR4PT0lMDR4KVxuIiwKKyAgICBkcHJpbnRmX2luZm8oaW50LCAiX2ZwbWF0aDogKGNzOmVpcD0leDolbHggZXM9JXggYng9JTA0eCBheD0lMDR4IGR4PT0lMDR4KVxuIiwKICAgICAgICAgICAgICAgICAgKFdPUkQpQ1NfcmVnKGNvbnRleHQpLCBFSVBfcmVnKGNvbnRleHQpLAogICAgICAgICAgICAgICAgICAoV09SRClFU19yZWcoY29udGV4dCksIEJYX3JlZyhjb250ZXh0KSwKICAgICAgICAgICAgICAgICAgQVhfcmVnKGNvbnRleHQpLCBEWF9yZWcoY29udGV4dCkgKTsKQEAgLTc2LDcgKzc0LDcgQEAKICAgICAgICAgICAgICAqLwogLyogRklYTUU6IGNvdWxkIHNvbWVvbmUgd2hvIHJlYWxseSB1bmRlcnN0YW5kcyBhc20oKSBmaXggdGhpcyBwbGVhc2U/IC0tQUogKi8KIC8qICAgICAgICAgICAgX19hc21fXygiZmlzdHAgJTA7d2FpdCIgOiAiPW0iIChkdykgOiA6ICJtZW1vcnkiKTsgKi8KLSAgICAgICAgICAgIGRwcmludGZfaW50KHN0ZGRlYiwiZW11bGF0ZS5jOk9uIHRvcCBvZiBzdGFjayB3YXMgJWxkXG4iLGR3KTsKKyAgICAgICAgICAgIGRwcmludGZfaW5mbyhpbnQsImVtdWxhdGUuYzpPbiB0b3Agb2Ygc3RhY2sgd2FzICVsZFxuIixkdyk7CiAgICAgICAgICAgICBBWF9yZWcoY29udGV4dCkgPSBMT1dPUkQoZHcpOwogICAgICAgICAgICAgRFhfcmVnKGNvbnRleHQpID0gSElXT1JEKGR3KTsKICAgICAgICAgfQpAQCAtMTEwLDE4ICsxMDgsMTggQEAKIHZvaWQgV0lOQVBJIFdJTjg3X1dpbkVtODdJbmZvKHN0cnVjdCBXaW44N0VtSW5mb1N0cnVjdCAqcFdJUywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBjYldpbjg3RW1JbmZvU3RydWN0KQogewotICBkcHJpbnRmX2ludChzdGRkZWIsICJfX1dpbkVtODdJbmZvKCVwLCVkKVxuIixwV0lTLGNiV2luODdFbUluZm9TdHJ1Y3QpOworICBkcHJpbnRmX2luZm8oaW50LCAiX19XaW5FbTg3SW5mbyglcCwlZClcbiIscFdJUyxjYldpbjg3RW1JbmZvU3RydWN0KTsKIH0KIAogdm9pZCBXSU5BUEkgV0lOODdfV2luRW04N1Jlc3RvcmUodm9pZCAqcFdpbjg3RW1TYXZlQXJlYSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBjYldpbjg3RW1TYXZlQXJlYSkKIHsKLSAgZHByaW50Zl9pbnQoc3RkZGViLCAiX19XaW5FbTg3UmVzdG9yZSglcCwlZClcbiIsCisgIGRwcmludGZfaW5mbyhpbnQsICJfX1dpbkVtODdSZXN0b3JlKCVwLCVkKVxuIiwKIAlwV2luODdFbVNhdmVBcmVhLGNiV2luODdFbVNhdmVBcmVhKTsKIH0KIAogdm9pZCBXSU5BUEkgV0lOODdfV2luRW04N1NhdmUodm9pZCAqcFdpbjg3RW1TYXZlQXJlYSwgaW50IGNiV2luODdFbVNhdmVBcmVhKQogewotICBkcHJpbnRmX2ludChzdGRkZWIsICJfX1dpbkVtODdTYXZlKCVwLCVkKVxuIiwKKyAgZHByaW50Zl9pbmZvKGludCwgIl9fV2luRW04N1NhdmUoJXAsJWQpXG4iLAogCXBXaW44N0VtU2F2ZUFyZWEsY2JXaW44N0VtU2F2ZUFyZWEpOwogfQpkaWZmIC0tZ2l0IGEvbXNkb3MvZG9zbWVtLmMgYi9tc2Rvcy9kb3NtZW0uYwppbmRleCBiYTg2NmE0Li44YzMyNmRiIDEwMDY0NAotLS0gYS9tc2Rvcy9kb3NtZW0uYworKysgYi9tc2Rvcy9kb3NtZW0uYwpAQCAtMjI2LDYgKzIyNiw3IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRE9TTUVNX2Rvc21lbSsoYWRkciksIDB4MTAwMDAsIGhLZXJuZWwsIFwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGQUxTRSwgRkFMU0UsIEZBTFNFLCBOVUxMICkpCiAKKyAgICBTRVRfRU5UUllfUE9JTlQoIDE4MywgMHgwMDAwMCApOyAgLyogS0VSTkVMLjE4MzogX18wMDAwSCAqLwogICAgIFNFVF9FTlRSWV9QT0lOVCggMTc0LCAweGEwMDAwICk7ICAvKiBLRVJORUwuMTc0OiBfX0EwMDBIICovCiAgICAgU0VUX0VOVFJZX1BPSU5UKCAxODEsIDB4YjAwMDAgKTsgIC8qIEtFUk5FTC4xODE6IF9fQjAwMEggKi8KICAgICBTRVRfRU5UUllfUE9JTlQoIDE4MiwgMHhiODAwMCApOyAgLyogS0VSTkVMLjE4MjogX19CODAwSCAqLwpAQCAtMzg2LDcgKzM4Nyw3IEBACiAgICBMUFZPSUQgICAgICAgbGluOwogCiAgICBsaW49RE9TTUVNX2Rvc21lbSsoeCYweGZmZmYpKygoKHgmMHhmZmZmMDAwMCk+PjE2KSoxNik7Ci0gICBkcHJpbnRmX3NlbGVjdG9yKHN0ZGRlYiwiRE9TTUVNX01hcFIyTCgweCUwOGx4KSByZXR1cm5zIDB4JXAuXG4iLAorICAgZHByaW50Zl9pbmZvKHNlbGVjdG9yLCJET1NNRU1fTWFwUjJMKDB4JTA4bHgpIHJldHVybnMgMHglcC5cbiIsCiAgICAgICAgICAgICAgICAgICAgIHgsbGluICk7CiAgICByZXR1cm4gbGluOwogfQpAQCAtNDA1LDcgKzQwNiw3IEBACiAJCUdNRU1fRklYRUQsRE9TTUVNX2Rvc21lbStyZWFsc2VsKjE2LDB4MTAwMDAsCiAJCWhNb2R1bGUsRkFMU0UsRkFMU0UsRkFMU0UsTlVMTAogCSk7Ci0JZHByaW50Zl9zZWxlY3RvcihzdGRkZWIsIkRPU01FTV9BbGxvY1NlbGVjdG9yKDB4JTA0eCkgcmV0dXJucyAweCUwNHguXG4iLAorCWRwcmludGZfaW5mbyhzZWxlY3RvciwiRE9TTUVNX0FsbG9jU2VsZWN0b3IoMHglMDR4KSByZXR1cm5zIDB4JTA0eC5cbiIsCiAJCXJlYWxzZWwsc2VsCiAJKTsKIAlyZXR1cm4gc2VsOwpkaWZmIC0tZ2l0IGEvbXNkb3MvZHBtaS5jIGIvbXNkb3MvZHBtaS5jCmluZGV4IDkwN2YwODEuLmQ0NjQ4YzYgMTAwNjQ0Ci0tLSBhL21zZG9zL2RwbWkuYworKysgYi9tc2Rvcy9kcG1pLmMKQEAgLTE1LDcgKzE1LDYgQEAKICNpbmNsdWRlICJkcml2ZS5oIgogI2luY2x1ZGUgIm1zZG9zLmgiCiAjaW5jbHVkZSAidG9vbGhlbHAuaCIKLSNpbmNsdWRlICJzdGRkZWJ1Zy5oIgogI2luY2x1ZGUgImRlYnVnLmgiCiAKICNkZWZpbmUgRE9TX0dFVF9EUklWRShyZWcpICgocmVnKSA/IChyZWcpIC0gMSA6IERSSVZFX0dldEN1cnJlbnREcml2ZSgpKQpAQCAtNDYxLDkgKzQ2MCw3IEBACiAgICAgICAgICAgICBicmVhazsKICAgICAgICAgfQogICAgIGNhc2UgMHgwNTAxOiAgLyogQWxsb2NhdGUgbWVtb3J5IGJsb2NrICovCi0gICAgICAgIGlmICghKHB0ciA9IChCWVRFICopSGVhcEFsbG9jKCBHZXRQcm9jZXNzSGVhcCgpLCAwLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTUFLRUxPTkcoIENYX3JlZyhjb250ZXh0KSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCWF9yZWcoY29udGV4dCkgKSkpKQorCWlmICghKHB0ciA9IChCWVRFICopVmlydHVhbEFsbG9jKE5VTEwsIE1BS0VMT05HKENYX3JlZyhjb250ZXh0KSwgQlhfcmVnKGNvbnRleHQpKSwgTUVNX0NPTU1JVCwgUEFHRV9FWEVDVVRFX1JFQURXUklURSkpKQogICAgICAgICB7CiAgICAgICAgICAgICBBWF9yZWcoY29udGV4dCkgPSAweDgwMTI7ICAvKiBsaW5lYXIgbWVtb3J5IG5vdCBhdmFpbGFibGUgKi8KICAgICAgICAgICAgIFNFVF9DRkxBRyhjb250ZXh0KTsKQEAgLTQ3Niw4ICs0NzMsNyBAQAogICAgICAgICBicmVhazsKIAogICAgIGNhc2UgMHgwNTAyOiAgLyogRnJlZSBtZW1vcnkgYmxvY2sgKi8KLSAgICAgICAgSGVhcEZyZWUoIEdldFByb2Nlc3NIZWFwKCksIDAsCi0gICAgICAgICAgICAgICAgICAodm9pZCAqKU1BS0VMT05HKCBESV9yZWcoY29udGV4dCksIFNJX3JlZyhjb250ZXh0KSApICk7CisJVmlydHVhbEZyZWUoKHZvaWQgKilNQUtFTE9ORyhESV9yZWcoY29udGV4dCksIFNJX3JlZyhjb250ZXh0KSksIDAsIE1FTV9SRUxFQVNFKTsKICAgICAgICAgYnJlYWs7CiAKICAgICBjYXNlIDB4MDUwMzogIC8qIFJlc2l6ZSBtZW1vcnkgYmxvY2sgKi8KZGlmZiAtLWdpdCBhL21zZG9zL2ludDEwLmMgYi9tc2Rvcy9pbnQxMC5jCmluZGV4IGU3M2Q1YmQuLjJmMzcxMDcgMTAwNjQ0Ci0tLSBhL21zZG9zL2ludDEwLmMKKysrIGIvbXNkb3MvaW50MTAuYwpAQCAtNSw3ICs1LDYgQEAKICNpbmNsdWRlIDxzdGRpby5oPgogI2luY2x1ZGUgPHN0ZGxpYi5oPgogI2luY2x1ZGUgIm1pc2NlbXUuaCIKLSNpbmNsdWRlICJzdGRkZWJ1Zy5oIgogLyogI2RlZmluZSBERUJVR19JTlQgKi8KICNpbmNsdWRlICJkZWJ1Zy5oIgogCmRpZmYgLS1naXQgYS9tc2Rvcy9pbnQxMS5jIGIvbXNkb3MvaW50MTEuYwppbmRleCBjNjZmMjBjLi40ZGUzZDQxIDEwMDY0NAotLS0gYS9tc2Rvcy9pbnQxMS5jCisrKyBiL21zZG9zL2ludDExLmMKQEAgLTcsNyArNyw2IEBACiAjaW5jbHVkZSAibWlzY2VtdS5oIgogI2luY2x1ZGUgIm1zZG9zLmgiCiAjaW5jbHVkZSAiZHJpdmUuaCIKLSNpbmNsdWRlICJzdGRkZWJ1Zy5oIgogI2luY2x1ZGUgImRlYnVnLmgiCiAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCmRpZmYgLS1naXQgYS9tc2Rvcy9pbnQxMy5jIGIvbXNkb3MvaW50MTMuYwppbmRleCBiNDZiNmEyLi44ZmE3MGFiIDEwMDY0NAotLS0gYS9tc2Rvcy9pbnQxMy5jCisrKyBiL21zZG9zL2ludDEzLmMKQEAgLTEzLDcgKzEzLDYgQEAKICNpbmNsdWRlIDxsaW51eC9mZC5oPgogI2VuZGlmCiAjaW5jbHVkZSAibWlzY2VtdS5oIgotI2luY2x1ZGUgInN0ZGRlYnVnLmgiCiAvKiAjZGVmaW5lIERFQlVHX0lOVCAqLwogI2luY2x1ZGUgImRlYnVnLmgiCiAjaW5jbHVkZSAiZHJpdmUuaCIKZGlmZiAtLWdpdCBhL21zZG9zL2ludDE1LmMgYi9tc2Rvcy9pbnQxNS5jCmluZGV4IDVkM2FkNTcuLjdiYzljNmEgMTAwNjQ0Ci0tLSBhL21zZG9zL2ludDE1LmMKKysrIGIvbXNkb3MvaW50MTUuYwpAQCAtNSw3ICs1LDYgQEAKICNpbmNsdWRlIDxzdGRpby5oPgogI2luY2x1ZGUgPHN0ZGxpYi5oPgogI2luY2x1ZGUgIm1pc2NlbXUuaCIKLSNpbmNsdWRlICJzdGRkZWJ1Zy5oIgogI2luY2x1ZGUgImRlYnVnLmgiCiAKIApkaWZmIC0tZ2l0IGEvbXNkb3MvaW50MWEuYyBiL21zZG9zL2ludDFhLmMKaW5kZXggMWU4MTU3YS4uOTBjMDNjNSAxMDA2NDQKLS0tIGEvbXNkb3MvaW50MWEuYworKysgYi9tc2Rvcy9pbnQxYS5jCkBAIC04LDggKzgsNiBAQAogI2luY2x1ZGUgPHN0ZGxpYi5oPgogI2luY2x1ZGUgIm9wdGlvbnMuaCIKICNpbmNsdWRlICJtaXNjZW11LmgiCi0jaW5jbHVkZSAic3RkZGVidWcuaCIKLS8qICNkZWZpbmUgREVCVUdfSU5UICovCiAjaW5jbHVkZSAiZGVidWcuaCIKIAogI2RlZmluZQlCQ0RfVE9fQklOKHgpICgoeCYxNSkgKyAoeD4+NCkqMTApCkBAIC01Nyw3ICs1NSw3IEBACiAgICAgICAgICAgICBDWF9yZWcoY29udGV4dCkgPSBISVdPUkQodGlja3MpOwogICAgICAgICAgICAgRFhfcmVnKGNvbnRleHQpID0gTE9XT1JEKHRpY2tzKTsKICAgICAgICAgICAgIEFYX3JlZyhjb250ZXh0KSA9IDA7ICAvKiBObyBtaWRuaWdodCByb2xsb3ZlciAqLwotICAgICAgICAgICAgZHByaW50Zl9pbnQoc3RkZGViLCJpbnQxYV8wMCAvLyB0aWNrcz0lbGRcbiIsIHRpY2tzKTsKKyAgICAgICAgICAgIGRwcmludGZfaW5mbyhpbnQsImludDFhXzAwIC8vIHRpY2tzPSVsZFxuIiwgdGlja3MpOwogICAgICAgICAgICAgYnJlYWs7CiAJCQogCWNhc2UgMjogCmRpZmYgLS1naXQgYS9tc2Rvcy9pbnQyMC5jIGIvbXNkb3MvaW50MjAuYwppbmRleCBhODRhNGQ3Li44ZWQ2Njg0IDEwMDY0NAotLS0gYS9tc2Rvcy9pbnQyMC5jCisrKyBiL21zZG9zL2ludDIwLmMKQEAgLTUsNyArNSw2IEBACiAjaW5jbHVkZSA8c3RkaW8uaD4KICNpbmNsdWRlIDxzdGRsaWIuaD4KICNpbmNsdWRlICJtaXNjZW11LmgiCi0jaW5jbHVkZSAic3RkZGVidWcuaCIKIC8qICNkZWZpbmUgREVCVUdfSU5UICovCiAjaW5jbHVkZSAiZGVidWcuaCIKICNpbmNsdWRlICJ0YXNrLmgiCmRpZmYgLS1naXQgYS9tc2Rvcy9pbnQyMS5jIGIvbXNkb3MvaW50MjEuYwppbmRleCAwZmE3YTIxLi4wNGRmNGUxIDEwMDY0NAotLS0gYS9tc2Rvcy9pbnQyMS5jCisrKyBiL21zZG9zL2ludDIxLmMKQEAgLTI0LDcgKzI0LDYgQEAKICNpbmNsdWRlICJ0YXNrLmgiCiAjaW5jbHVkZSAib3B0aW9ucy5oIgogI2luY2x1ZGUgIm1pc2NlbXUuaCIKLSNpbmNsdWRlICJzdGRkZWJ1Zy5oIgogI2luY2x1ZGUgImRlYnVnLmgiCiAjaWYgZGVmaW5lZChfX3N2cjRfXykgfHwgZGVmaW5lZChfU0NPX0RTKQogLyogU1ZSNCBET0VTTlQgZG8gbG9ja2luZyB0aGUgc2FtZSB3YXkgbXVzdCBpbXBsZW1lbnQgcHJvcGVybHkgKi8KQEAgLTE3MCw3ICsxNjksNyBAQAogICAgICAgICB9CiAgICAgICAgIGVsc2UgaWYgKGhlYXAgfHwgSU5UMjFfQ3JlYXRlSGVhcCgpKQogICAgICAgICB7Ci0gICAgICAgICAgICAgICAgZHByaW50Zl9pbnQoc3RkZGViLCAiaW50MjE6IEdldERyaXZlUEIgbm90IGZ1bGx5IGltcGxlbWVudGVkLlxuIik7CisgICAgICAgICAgICAgICAgZHByaW50Zl9maXhtZShpbnQsICJpbnQyMTogR2V0RHJpdmVQQiBub3QgZnVsbHkgaW1wbGVtZW50ZWQuXG4iKTsKIAogICAgICAgICAgICAgICAgIC8qIEZJWE1FOiBJIGhhdmUgbm8gaWRlYSB3aGF0IGEgbG90IG9mIHRoaXMgaW5mb3JtYXRpb24gc2hvdWxkCiAgICAgICAgICAgICAgICAgICogc2F5IG9yIHdoZXRoZXIgaXQgZXZlbiByZWFsbHkgbWF0dGVycyBzaW5jZSB3ZSdyZSBub3QgYWxsb3dpbmcKQEAgLTIwNyw3ICsyMDYsNyBAQAogc3RhdGljIHZvaWQgaW9jdGxHZXREZXZpY2VJbmZvKCBDT05URVhUICpjb250ZXh0ICkKIHsKICAgICBpbnQgY3Vycl9kcml2ZTsKLSAgICBkcHJpbnRmX2ludCAoc3RkZGViLCAiaW50MjE6IGlvY3RsICglZCwgR2V0RGV2aWNlSW5mbylcbiIsIEJYX3JlZyhjb250ZXh0KSk7CisgICAgZHByaW50Zl9pbmZvKGludCwgImludDIxOiBpb2N0bCAoJWQsIEdldERldmljZUluZm8pXG4iLCBCWF9yZWcoY29udGV4dCkpOwogICAgIAogICAgIGN1cnJfZHJpdmUgPSBEUklWRV9HZXRDdXJyZW50RHJpdmUoKTsKICAgICBEWF9yZWcoY29udGV4dCkgPSAweDAxNDAgKyBjdXJyX2RyaXZlICsgKChjdXJyX2RyaXZlID4gMSkgPyAweDA4MDAgOiAwKTsgLyogbm8gZmxvcHB5ICovCkBAIC0yMzksNyArMjM4LDcgQEAKIAlzd2l0Y2ggKENMX3JlZyhjb250ZXh0KSkgCiAJewogCQljYXNlIDB4NGE6IC8qIGxvY2sgbG9naWNhbCB2b2x1bWUgKi8KLQkJCWRwcmludGZfaW50KHN0ZGRlYiwiaW50MjE6IGxvY2sgbG9naWNhbCB2b2x1bWUgKCVkKSBsZXZlbCAlZCBtb2RlICVkXG4iLGRyaXZlLEJIX3JlZyhjb250ZXh0KSxEWF9yZWcoY29udGV4dCkpOworCQkJZHByaW50Zl9pbmZvKGludCwiaW50MjE6IGxvY2sgbG9naWNhbCB2b2x1bWUgKCVkKSBsZXZlbCAlZCBtb2RlICVkXG4iLGRyaXZlLEJIX3JlZyhjb250ZXh0KSxEWF9yZWcoY29udGV4dCkpOwogCQkJYnJlYWs7CiAKIAkJY2FzZSAweDYwOiAvKiBnZXQgZGV2aWNlIHBhcmFtZXRlcnMgKi8KQEAgLTI4MCw3ICsyNzksNyBAQAogCQkJYnJlYWs7CiAKIAkJY2FzZSAweDZhOgotCQkJZHByaW50Zl9pbnQoc3RkZGViLCJpbnQyMTogbG9naWNhbCB2b2x1bWUgJWQgdW5sb2NrZWQuXG4iLGRyaXZlKTsKKwkJCWRwcmludGZfaW5mbyhpbnQsImludDIxOiBsb2dpY2FsIHZvbHVtZSAlZCB1bmxvY2tlZC5cbiIsZHJpdmUpOwogCQkJYnJlYWs7CiAKIAkJZGVmYXVsdDoKQEAgLTMzNyw3ICszMzYsNyBAQAogCSAgICBicmVhazsKIAogCSAgY2FzZSAweDMwOiAgICAvKiBERU5ZUkVBRCAqLwotCSAgICBkcHJpbnRmX2ludChzdGRkZWIsCisJICAgIGRwcmludGZfaW5mbyhpbnQsCiAJICAgICAgIk9wZW5FeGlzdGluZ0ZpbGUgKCVzKTogREVOWVJFQUQgY2hhbmdlZCB0byBERU5ZQUxMXG4iLAogCSAgICAgIChjaGFyICopUFRSX1NFR19PRkZfVE9fTElOKERTX3JlZyhjb250ZXh0KSxEWF9yZWcoY29udGV4dCkpKTsKIAkgIGNhc2UgMHgxMDogICAgLyogREVOWUFMTCAqLyAgCkBAIC00MjUsNyArNDI0LDcgQEAKIAkgIENsb3NlRmlsZShjb250ZXh0KTsKIAkgIEFYX3JlZyhjb250ZXh0KSA9IDB4MDA1MDsJLypGaWxlIGV4aXN0cyovCiAJICBTRVRfQ0ZMQUcoY29udGV4dCk7Ci0JICBkcHJpbnRmX2ludChzdGRkZWIsICJpbnQyMTogZXh0ZW5kZWQgb3Blbi9jcmVhdGU6IGZhaWxlZCBiZWNhdXNlIGZpbGUgZXhpc3RzIFxuIik7CisJICBkcHJpbnRmX3dhcm4oaW50LCAiaW50MjE6IGV4dGVuZGVkIG9wZW4vY3JlYXRlOiBmYWlsZWQgYmVjYXVzZSBmaWxlIGV4aXN0cyBcbiIpOwogICAgICAgfQogICAgICAgZWxzZSBpZiAoKGFjdGlvbiAmIDB4MDcpID09IDIpIAogICAgICAgewpAQCAtNDM0LDcgKzQzMyw3IEBACiAJewogCQkgIEJYX3JlZyhjb250ZXh0KSA9IEFYX3JlZyhjb250ZXh0KTsKIAkJICBDbG9zZUZpbGUoY29udGV4dCk7Ci0JCSAgZHByaW50Zl9pbnQoc3RkZGViLCAiaW50MjE6IGV4dGVuZGVkIG9wZW4vY3JlYXRlOiBmYWlsZWQsIHRydW5jIG9uIHJvIGZpbGUiKTsKKwkJICBkcHJpbnRmX3dhcm4oaW50LCAiaW50MjE6IGV4dGVuZGVkIG9wZW4vY3JlYXRlOiBmYWlsZWQsIHRydW5jIG9uIHJvIGZpbGVcbiIpOwogCQkgIEFYX3JlZyhjb250ZXh0KSA9IDB4MDAwQzsJLypBY2Nlc3MgY29kZSBpbnZhbGlkKi8KIAkJICBTRVRfQ0ZMQUcoY29udGV4dCk7CiAJfQpAQCAtNDQzLDE5ICs0NDIsMTkgQEAKIAkJLyogU2h1ZmZsZSBhcmd1bWVudHMgdG8gY2FsbCBDbG9zZUZpbGUgd2hpbGUKIAkJICogcHJlc2VydmluZyBCWCBhbmQgRFggKi8KIAotCQlkcHJpbnRmX2ludChzdGRkZWIsICJpbnQyMTogZXh0ZW5kZWQgb3Blbi9jcmVhdGU6IENsb3NpbmcgYmVmb3JlIHRydW5jYXRlXG4iKTsKKwkJZHByaW50Zl9pbmZvKGludCwgImludDIxOiBleHRlbmRlZCBvcGVuL2NyZWF0ZTogQ2xvc2luZyBiZWZvcmUgdHJ1bmNhdGVcbiIpOwogCQlCWF9yZWcoY29udGV4dCkgPSBBWF9yZWcoY29udGV4dCk7CiAJCUNsb3NlRmlsZShjb250ZXh0KTsKIAkJaWYgKEVGTF9yZWcoY29udGV4dCkgJiAweDAwMDEpIAogCQl7Ci0JCSAgIGRwcmludGZfaW50KHN0ZGRlYiwgImludDIxOiBleHRlbmRlZCBvcGVuL2NyZWF0ZTogY2xvc2UgYmVmb3JlIHRydW5jIGZhaWxlZCIpOworCQkgICBkcHJpbnRmX3dhcm4oaW50LCAiaW50MjE6IGV4dGVuZGVkIG9wZW4vY3JlYXRlOiBjbG9zZSBiZWZvcmUgdHJ1bmMgZmFpbGVkXG4iKTsKIAkJICAgQVhfcmVnKGNvbnRleHQpID0gMHgwMDE5OwkvKlNlZWsgRXJyb3IqLwogCQkgICBDWF9yZWcoY29udGV4dCkgPSAwOwogCQkgICBTRVRfQ0ZMQUcoY29udGV4dCk7CiAJCX0KIAkJLyogU2h1ZmZsZSBhcmd1bWVudHMgdG8gY2FsbCBDcmVhdGVGaWxlICovCiAKLQkJZHByaW50Zl9pbnQoc3RkZGViLCAiaW50MjE6IGV4dGVuZGVkIG9wZW4vY3JlYXRlOiBUcnVuY2F0aW5nXG4iKTsKKwkJZHByaW50Zl9pbmZvKGludCwgImludDIxOiBleHRlbmRlZCBvcGVuL2NyZWF0ZTogVHJ1bmNhdGluZ1xuIik7CiAJCUFMX3JlZyhjb250ZXh0KSA9IEJMX3JlZyhjb250ZXh0KTsKIAkJLyogQ1ggaXMgc3RpbGwgdGhlIHNhbWUgKi8KIAkJRFhfcmVnKGNvbnRleHQpID0gU0lfcmVnKGNvbnRleHQpOwpAQCAtNDYzLDcgKzQ2Miw3IEBACiAKIAkJaWYgKEVGTF9yZWcoY29udGV4dCkgJiAweDAwMDEpIAkvKm5vIGZpbGUgb3BlbiwgZmxhZ3Mgc2V0ICovCiAJCXsKLQkJICAgIGRwcmludGZfaW50KHN0ZGRlYiwgImludDIxOiBleHRlbmRlZCBvcGVuL2NyZWF0ZTogdHJ1bmMgZmFpbGVkIik7CisJCSAgICBkcHJpbnRmX3dhcm4oaW50LCAiaW50MjE6IGV4dGVuZGVkIG9wZW4vY3JlYXRlOiB0cnVuYyBmYWlsZWRcbiIpOwogCQkgICAgcmV0dXJuIGJFeHRlbmRlZEVycm9yOwogCQl9CiAJCXVSZXR1cm5DWCA9IDB4MzsKQEAgLTQ4MCwxOSArNDc5LDE5IEBACiAgICAgICB7CiAJQ1hfcmVnKGNvbnRleHQpID0gMDsKIAlTRVRfQ0ZMQUcoY29udGV4dCk7Ci0JZHByaW50Zl9pbnQoc3RkZGViLCAiaW50MjE6IGV4dGVuZGVkIG9wZW4vY3JlYXRlOiBmYWlsZWQsIGZpbGUgZG9zZW4ndCBleGlzdFxuIik7CisJZHByaW50Zl93YXJuKGludCwgImludDIxOiBleHRlbmRlZCBvcGVuL2NyZWF0ZTogZmFpbGVkLCBmaWxlIGRvc2VuJ3QgZXhpc3RcbiIpOwogICAgICAgfQogICAgICAgZWxzZQogICAgICAgewogICAgICAgICAvKiBTaHVmZmxlIGFyZ3VtZW50cyB0byBjYWxsIENyZWF0ZUZpbGUgKi8KLSAgICAgICAgZHByaW50Zl9pbnQoc3RkZGViLCAiaW50MjE6IGV4dGVuZGVkIG9wZW4vY3JlYXRlOiBDcmVhdGluZ1xuIik7CisgICAgICAgIGRwcmludGZfaW5mbyhpbnQsICJpbnQyMTogZXh0ZW5kZWQgb3Blbi9jcmVhdGU6IENyZWF0aW5nXG4iKTsKICAgICAgICAgQUxfcmVnKGNvbnRleHQpID0gQkxfcmVnKGNvbnRleHQpOwogICAgICAgICAvKiBDWCBzaG91bGQgc3RpbGwgYmUgdGhlIHNhbWUgKi8KICAgICAgICAgRFhfcmVnKGNvbnRleHQpID0gU0lfcmVnKGNvbnRleHQpOwogICAgICAgICBiRXh0ZW5kZWRFcnJvciA9IElOVDIxX0NyZWF0ZUZpbGUoY29udGV4dCk7CiAgICAgICAgIGlmIChFRkxfcmVnKGNvbnRleHQpICYgMHgwMDAxKSAgLypubyBmaWxlIG9wZW4sIGZsYWdzIHNldCAqLwogCXsKLSAgCSAgICBkcHJpbnRmX2ludChzdGRkZWIsICJpbnQyMTogZXh0ZW5kZWQgb3Blbi9jcmVhdGU6IGNyZWF0ZSBmYWlsZWRcbiIpOworICAJICAgIGRwcmludGZfd2FybihpbnQsICJpbnQyMTogZXh0ZW5kZWQgb3Blbi9jcmVhdGU6IGNyZWF0ZSBmYWlsZWRcbiIpOwogCSAgICByZXR1cm4gYkV4dGVuZGVkRXJyb3I7CiAgICAgICAgIH0KICAgICAgICAgQ1hfcmVnKGNvbnRleHQpID0gMjsKQEAgLTUwOCw3ICs1MDcsNyBAQAogICAgIGludCBkcml2ZTsKICAgICBjaGFyICpkaXJuYW1lID0gUFRSX1NFR19PRkZfVE9fTElOKERTX3JlZyhjb250ZXh0KSxEWF9yZWcoY29udGV4dCkpOwogCi0gICAgZHByaW50Zl9pbnQoc3RkZGViLCJpbnQyMTogY2hhbmdlZGlyICVzXG4iLCBkaXJuYW1lKTsKKyAgICBkcHJpbnRmX2luZm8oaW50LCJpbnQyMTogY2hhbmdlZGlyICVzXG4iLCBkaXJuYW1lKTsKICAgICBpZiAoZGlybmFtZVswXSAmJiAoZGlybmFtZVsxXSA9PSAnOicpKQogICAgIHsKICAgICAgICAgZHJpdmUgPSB0b3VwcGVyKGRpcm5hbWVbMF0pIC0gJ0EnOwpAQCAtNjA2LDcgKzYwNSw3IEBACiAKICAgICAgICAgaWYgKChBWF9yZWcoY29udGV4dCkgPSBfbGNyZWF0X3VuaXEoIG5hbWUsIDAgKSkgIT0gKFdPUkQpSEZJTEVfRVJST1IxNikKICAgICAgICAgewotICAgICAgICAgICAgZHByaW50Zl9pbnQoIHN0ZGRlYiwgIklOVDIxX0NyZWF0ZVRlbXBGaWxlOiBjcmVhdGVkICVzXG4iLCBuYW1lICk7CisgICAgICAgICAgICBkcHJpbnRmX2luZm8oaW50LCAiSU5UMjFfQ3JlYXRlVGVtcEZpbGU6IGNyZWF0ZWQgJXNcbiIsIG5hbWUgKTsKICAgICAgICAgICAgIHJldHVybiBUUlVFOwogICAgICAgICB9CiAgICAgICAgIGlmIChET1NfRXh0ZW5kZWRFcnJvciAhPSBFUl9GaWxlRXhpc3RzKSByZXR1cm4gRkFMU0U7CkBAIC04MTEsNyArODEwLDcgQEAKIHsKICAgICBCT09MMzIJYlNldERPU0V4dGVuZGVkRXJyb3IgPSBGQUxTRTsKIAotICAgIGRwcmludGZfaW50KCBzdGRkZWIsICJpbnQyMTogQVg9JTA0eCBCWD0lMDR4IENYPSUwNHggRFg9JTA0eCAiCisgICAgZHByaW50Zl9pbmZvKGludCwgImludDIxOiBBWD0lMDR4IEJYPSUwNHggQ1g9JTA0eCBEWD0lMDR4ICIKICAgICAgICAgICAgICAgICAgIlNJPSUwNHggREk9JTA0eCBEUz0lMDR4IEVTPSUwNHggRUZMPSUwOGx4XG4iLAogICAgICAgICAgICAgICAgICBBWF9yZWcoY29udGV4dCksIEJYX3JlZyhjb250ZXh0KSwgQ1hfcmVnKGNvbnRleHQpLAogICAgICAgICAgICAgICAgICBEWF9yZWcoY29udGV4dCksIFNJX3JlZyhjb250ZXh0KSwgRElfcmVnKGNvbnRleHQpLApAQCAtOTIwLDcgKzkxOSw3IEBACiAgICAgICAgIHsKICAgICAgICAgICAgIFREQiAqcFRhc2sgPSAoVERCICopR2xvYmFsTG9jazE2KCBHZXRDdXJyZW50VGFzaygpICk7CiAgICAgICAgICAgICBwVGFzay0+ZHRhID0gUFRSX1NFR19PRkZfVE9fU0VHUFRSKERTX3JlZyhjb250ZXh0KSxEWF9yZWcoY29udGV4dCkpOwotICAgICAgICAgICAgZHByaW50Zl9pbnQoc3RkZGViLCAiaW50MjE6IFNldCBEVEE6ICUwOGx4XG4iLCBwVGFzay0+ZHRhKTsKKyAgICAgICAgICAgIGRwcmludGZfaW5mbyhpbnQsICJpbnQyMTogU2V0IERUQTogJTA4bHhcbiIsIHBUYXNrLT5kdGEpOwogICAgICAgICB9CiAgICAgICAgIGJyZWFrOwogCkBAIC0xNTg0LDkgKzE1ODMsOSBAQAogICAgIGNhc2UgMHg3MDogLyogTVMtRE9TIDcgKFdpbmRvd3M5NSkgLSA/Pz8gKGNvdW50cnktc3BlY2lmaWM/KSovCiAgICAgY2FzZSAweDcyOiAvKiBNUy1ET1MgNyAoV2luZG93czk1KSAtID8/PyAqLwogICAgIGNhc2UgMHg3MzogLyogTVMtRE9TIDcgKFdpbmRvd3M5NSkgLSBEUklWRSBMT0NLSU5HID8/PyAqLwotICAgICAgICBkcHJpbnRmX2ludChzdGRkZWIsImludDIxOiB3aW5kb3dzOTUgZnVuY3Rpb24gQVggJTA0eFxuIiwKKyAgICAgICAgZHByaW50Zl9pbmZvKGludCwiaW50MjE6IHdpbmRvd3M5NSBmdW5jdGlvbiBBWCAlMDR4XG4iLAogICAgICAgICAgICAgICAgICAgICBBWF9yZWcoY29udGV4dCkpOwotICAgICAgICBkcHJpbnRmX2ludChzdGRkZWIsICIgICAgICAgIHJldHVybmluZyB1bmltcGxlbWVudGVkXG4iKTsKKyAgICAgICAgZHByaW50Zl93YXJuKGludCwgIiAgICAgICAgcmV0dXJuaW5nIHVuaW1wbGVtZW50ZWRcbiIpOwogICAgICAgICBTRVRfQ0ZMQUcoY29udGV4dCk7CiAgICAgICAgIEFMX3JlZyhjb250ZXh0KSA9IDA7CiAgICAgICAgIGJyZWFrOwpAQCAtMTYwNyw3ICsxNjA2LDcgQEAKIAlTRVRfQ0ZMQUcoY29udGV4dCk7CiAgICAgfQogCi0gICAgZHByaW50Zl9pbnQoIHN0ZGRlYiwgInJldDIxOiBBWD0lMDR4IEJYPSUwNHggQ1g9JTA0eCBEWD0lMDR4ICIKKyAgICBkcHJpbnRmX2luZm8oaW50LCAicmV0MjE6IEFYPSUwNHggQlg9JTA0eCBDWD0lMDR4IERYPSUwNHggIgogICAgICAgICAgICAgICAgICAiU0k9JTA0eCBEST0lMDR4IERTPSUwNHggRVM9JTA0eCBFRkw9JTA4bHhcbiIsCiAgICAgICAgICAgICAgICAgIEFYX3JlZyhjb250ZXh0KSwgQlhfcmVnKGNvbnRleHQpLCBDWF9yZWcoY29udGV4dCksCiAgICAgICAgICAgICAgICAgIERYX3JlZyhjb250ZXh0KSwgU0lfcmVnKGNvbnRleHQpLCBESV9yZWcoY29udGV4dCksCmRpZmYgLS1naXQgYS9tc2Rvcy9pbnQyNS5jIGIvbXNkb3MvaW50MjUuYwppbmRleCAyZmQ2ZDczLi5kOTI3Mzk0IDEwMDY0NAotLS0gYS9tc2Rvcy9pbnQyNS5jCisrKyBiL21zZG9zL2ludDI1LmMKQEAgLTExLDggKzExLDYgQEAKICNpbmNsdWRlICJsZHQuaCIKICNpbmNsdWRlICJtaXNjZW11LmgiCiAjaW5jbHVkZSAiZHJpdmUuaCIKLSNpbmNsdWRlICJzdGRkZWJ1Zy5oIgotLyogI2RlZmluZSBERUJVR19JTlQgKi8KICNpbmNsdWRlICJkZWJ1Zy5oIgogCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgpAQCAtNDQsNyArNDIsNyBAQAogICAgICAgICBiZWdpbiAgPSBEWF9yZWcoY29udGV4dCk7CiAgICAgICAgIGxlbmd0aCA9IENYX3JlZyhjb250ZXh0KTsKICAgICB9Ci0gICAgZHByaW50Zl9pbnQoIHN0ZG5pbXAsICJpbnQyNTogYWJzIGRpc2tyZWFkLCBkcml2ZSAlZCwgc2VjdG9yICVsZCwgIgorICAgIGRwcmludGZfaW5mbyhpbnQsICJpbnQyNTogYWJzIGRpc2tyZWFkLCBkcml2ZSAlZCwgc2VjdG9yICVsZCwgIgogICAgICAgICAgICAgICAgICAiY291bnQgJWxkLCBidWZmZXIgJWRcbiIsCiAgICAgICAgICAgICAgICAgIEFMX3JlZyhjb250ZXh0KSwgYmVnaW4sIGxlbmd0aCwgKGludCkgZGF0YXB0cik7CiAKQEAgLTYzLDMgKzYxLDQgQEAKICAgICB9CiAgICAgUkVTRVRfQ0ZMQUcoY29udGV4dCk7CiB9CisKZGlmZiAtLWdpdCBhL21zZG9zL2ludDI2LmMgYi9tc2Rvcy9pbnQyNi5jCmluZGV4IGMyNGYxYTkuLmI1ZmZlMTYgMTAwNjQ0Ci0tLSBhL21zZG9zL2ludDI2LmMKKysrIGIvbXNkb3MvaW50MjYuYwpAQCAtMTAsOCArMTAsNiBAQAogI2luY2x1ZGUgImxkdC5oIgogI2luY2x1ZGUgIm1pc2NlbXUuaCIKICNpbmNsdWRlICJkcml2ZS5oIgotI2luY2x1ZGUgInN0ZGRlYnVnLmgiCi0vKiAjZGVmaW5lIERFQlVHX0lOVCAqLwogI2luY2x1ZGUgImRlYnVnLmgiCiAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCkBAIC00NCw3ICs0Miw3IEBACiAgICAgICAgIGxlbmd0aCA9IENYX3JlZyhjb250ZXh0KTsKICAgICB9CiAJCQotICAgIGRwcmludGZfaW50KCBzdGRuaW1wLCJpbnQyNjogYWJzIGRpc2t3cml0ZSwgZHJpdmUgJWQsIHNlY3RvciAlbGQsICIKKyAgICBkcHJpbnRmX2luZm8oaW50LCJpbnQyNjogYWJzIGRpc2t3cml0ZSwgZHJpdmUgJWQsIHNlY3RvciAlbGQsICIKICAgICAgICAgICAgICAgICAgImNvdW50ICVsZCwgYnVmZmVyICVkXG4iLAogICAgICAgICAgICAgICAgICBBTF9yZWcoY29udGV4dCksIGJlZ2luLCBsZW5ndGgsIChpbnQpIGRhdGFwdHIgKTsKIApkaWZmIC0tZ2l0IGEvbXNkb3MvaW50MmEuYyBiL21zZG9zL2ludDJhLmMKaW5kZXggMzViNmMyMi4uZGNhZDE3MyAxMDA2NDQKLS0tIGEvbXNkb3MvaW50MmEuYworKysgYi9tc2Rvcy9pbnQyYS5jCkBAIC02LDcgKzYsNiBAQAogI2luY2x1ZGUgPHN0ZGxpYi5oPgogI2luY2x1ZGUgIm1zZG9zLmgiCiAjaW5jbHVkZSAibWlzY2VtdS5oIgotI2luY2x1ZGUgInN0ZGRlYnVnLmgiCiAvKiAjZGVmaW5lIERFQlVHX0lOVCAqLwogI2luY2x1ZGUgImRlYnVnLmgiCiAKZGlmZiAtLWdpdCBhL21zZG9zL2ludDJmLmMgYi9tc2Rvcy9pbnQyZi5jCmluZGV4IGM4ZWZjYWIuLmYzMWFkNjEgMTAwNjQ0Ci0tLSBhL21zZG9zL2ludDJmLmMKKysrIGIvbXNkb3MvaW50MmYuYwpAQCAtMTEsNyArMTEsNiBAQAogI2luY2x1ZGUgIm1zZG9zLmgiCiAjaW5jbHVkZSAibWlzY2VtdS5oIgogI2luY2x1ZGUgIm1vZHVsZS5oIgotI2luY2x1ZGUgInN0ZGRlYnVnLmgiCiAvKiAjZGVmaW5lIERFQlVHX0lOVCAqLwogI2luY2x1ZGUgImRlYnVnLmgiCiAKZGlmZiAtLWdpdCBhL21zZG9zL2ludDNkLmMgYi9tc2Rvcy9pbnQzZC5jCmluZGV4IDhlNTE3ZDQuLjU3Yjk5OTUgMTAwNjQ0Ci0tLSBhL21zZG9zL2ludDNkLmMKKysrIGIvbXNkb3MvaW50M2QuYwpAQCAtNyw3ICs3LDYgQEAKICNpbmNsdWRlIDxzdGRsaWIuaD4KICNpbmNsdWRlICJtc2Rvcy5oIgogI2luY2x1ZGUgIm1pc2NlbXUuaCIKLSNpbmNsdWRlICJzdGRkZWJ1Zy5oIgogLyogI2RlZmluZSBERUJVR19JTlQgKi8KICNpbmNsdWRlICJkZWJ1Zy5oIgogCmRpZmYgLS1naXQgYS9tc2Rvcy9pbnQ1Yy5jIGIvbXNkb3MvaW50NWMuYwppbmRleCA2YTE3ZThhLi5lNWNjZTU3IDEwMDY0NAotLS0gYS9tc2Rvcy9pbnQ1Yy5jCisrKyBiL21zZG9zL2ludDVjLmMKQEAgLTYsNyArNiw2IEBACiAKICNpbmNsdWRlICJsZHQuaCIKICNpbmNsdWRlICJtaXNjZW11LmgiCi0jaW5jbHVkZSAic3RkZGVidWcuaCIKICNpbmNsdWRlICJkZWJ1Zy5oIgogCiAKZGlmZiAtLWdpdCBhL21zZG9zL2ludGVycnVwdHMuYyBiL21zZG9zL2ludGVycnVwdHMuYwppbmRleCAzMTcxMGZkLi42MDU4YmU3IDEwMDY0NAotLS0gYS9tc2Rvcy9pbnRlcnJ1cHRzLmMKKysrIGIvbXNkb3MvaW50ZXJydXB0cy5jCkBAIC0xMiw3ICsxMiw2IEBACiAjaW5jbHVkZSAibXNkb3MuaCIKICNpbmNsdWRlICJtb2R1bGUuaCIKICNpbmNsdWRlICJzdGFja2ZyYW1lLmgiCi0jaW5jbHVkZSAic3RkZGVidWcuaCIKICNpbmNsdWRlICJkZWJ1Zy5oIgogCiBzdGF0aWMgRkFSUFJPQzE2IElOVF9WZWN0b3JzWzI1Nl07CkBAIC0zNiw3ICszNSw3IEBACiAgKi8KIHZvaWQgSU5UX1NldEhhbmRsZXIoIEJZVEUgaW50bnVtLCBGQVJQUk9DMTYgaGFuZGxlciApCiB7Ci0gICAgZHByaW50Zl9pbnQoIHN0ZGRlYiwgIlNldCBpbnRlcnJ1cHQgdmVjdG9yICUwMnggPC0gJTA0eDolMDR4XG4iLAorICAgIGRwcmludGZfaW5mbyhpbnQsICJTZXQgaW50ZXJydXB0IHZlY3RvciAlMDJ4IDwtICUwNHg6JTA0eFxuIiwKICAgICAgICAgICAgICAgICAgaW50bnVtLCBISVdPUkQoaGFuZGxlciksIExPV09SRChoYW5kbGVyKSApOwogICAgIElOVF9WZWN0b3JzW2ludG51bV0gPSBoYW5kbGVyOwogfQpkaWZmIC0tZ2l0IGEvbXNkb3MvaW9wb3J0cy5jIGIvbXNkb3MvaW9wb3J0cy5jCmluZGV4IGMzNTdjMzcuLmE2M2QzMDUgMTAwNjQ0Ci0tLSBhL21zZG9zL2lvcG9ydHMuYworKysgYi9tc2Rvcy9pb3BvcnRzLmMKQEAgLTE4LDcgKzE4LDYgQEAKICNpbmNsdWRlIDx1bmlzdGQuaD4KICNpbmNsdWRlICJ3aW5kb3dzLmgiCiAjaW5jbHVkZSAib3B0aW9ucy5oIgotI2luY2x1ZGUgInN0ZGRlYnVnLmgiCiAjaW5jbHVkZSAiZGVidWcuaCIKIAogc3RhdGljIEJZVEUgY21vc2FkZHJlc3M7CkBAIC0yMjQsNyArMjIzLDcgQEAKICAgICB9CiAjZW5kaWYKIAotICAgIGRwcmludGZfaW50KHN0ZGRlYiwgIklPOiAlZCBieXRlcyBmcm9tIHBvcnQgMHglMDJ4ICIsIGNvdW50LCBwb3J0ICk7CisgICAgZHByaW50Zl9pbmZvKGludCwgIklPOiAlZCBieXRlcyBmcm9tIHBvcnQgMHglMDJ4XG4iLCBjb3VudCwgcG9ydCApOwogCiAgICAgd2hpbGUgKGNvdW50LS0gPiAwKQogICAgIHsKQEAgLTI0NCw3ICsyNDMsNyBAQAogICAgICAgICBwb3J0Kys7CiAgICAgICAgIHJlcyA9IChyZXMgPDwgOCkgfCBiOwogICAgIH0KLSAgICBkcHJpbnRmX2ludChzdGRkZWIsICIoIDB4JWx4IClcbiIsIHJlcyApOworICAgIGRwcmludGZfaW5mbyhpbnQsICIgIHJldHVybmluZyAoIDB4JWx4IClcbiIsIHJlcyApOwogICAgIHJldHVybiByZXM7CiB9CiAKQEAgLTI1Niw3ICsyNTUsNyBAQAogewogICAgIEJZVEUgYjsKIAotICAgIGRwcmludGZfaW50KCBzdGRkZWIsICJJTzogMHglbHggKCVkIGJ5dGVzKSB0byBwb3J0IDB4JTAyeFxuIiwKKyAgICBkcHJpbnRmX2luZm8oaW50LCAiSU86IDB4JWx4ICglZCBieXRlcykgdG8gcG9ydCAweCUwMnhcbiIsCiAgICAgICAgICAgICAgICAgIHZhbHVlLCBjb3VudCwgcG9ydCApOwogCiAjaWZkZWYgRElSRUNUX0lPX0FDQ0VTUwpkaWZmIC0tZ2l0IGEvbXNkb3MvdnhkLmMgYi9tc2Rvcy92eGQuYwppbmRleCA2NDM5NjdmLi44YTNiNzdhIDEwMDY0NAotLS0gYS9tc2Rvcy92eGQuYworKysgYi9tc2Rvcy92eGQuYwpAQCAtOCw4ICs4LDYgQEAKICNpbmNsdWRlICJ3aW5kb3dzLmgiCiAjaW5jbHVkZSAibXNkb3MuaCIKICNpbmNsdWRlICJtaXNjZW11LmgiCi0jaW5jbHVkZSAic3RkZGVidWcuaCIKLS8qICNkZWZpbmUgREVCVUdfVlhEICovCiAjaW5jbHVkZSAiZGVidWcuaCIKIAogCkBAIC0zNywxOCArMzUsMTggQEAKIAogICAgIC8qIHRha2VuIGZyb20gUmFsZiBCcm93bidzIEludGVycnVwdCBMaXN0ICovCiAKLSAgICBkcHJpbnRmX3Z4ZChzdGRkZWIsIlZ4RDogWyUwNHhdIFBhZ2VGaWxlXG4iLCAoVUlOVDE2KXNlcnZpY2UgKTsKKyAgICBkcHJpbnRmX2luZm8odnhkLCJWeEQ6IFslMDR4XSBQYWdlRmlsZVxuIiwgKFVJTlQxNilzZXJ2aWNlICk7CiAKICAgICBzd2l0Y2goc2VydmljZSkKICAgICB7CiAgICAgY2FzZSAweDAwOiAvKiBnZXQgdmVyc2lvbiwgaXMgdGhpcyB3aW5kb3dzIHZlcnNpb24/ICovCi0JZHByaW50Zl92eGQoc3RkZGViLCJWeEQgUGFnZUZpbGU6IHJldHVybmluZyB2ZXJzaW9uXG4iKTsKKwlkcHJpbnRmX2luZm8odnhkLCJWeEQgUGFnZUZpbGU6IHJldHVybmluZyB2ZXJzaW9uXG4iKTsKICAgICAgICAgQVhfcmVnKGNvbnRleHQpID0gVlhEX1dpblZlcnNpb24oKTsKIAlSRVNFVF9DRkxBRyhjb250ZXh0KTsKIAlicmVhazsKIAogICAgIGNhc2UgMHgwMTogLyogZ2V0IHN3YXAgZmlsZSBpbmZvICovCi0JZHByaW50Zl92eGQoc3RkZGViLCJWeEQgUGFnZUZpbGU6IHJldHVybmluZyBzd2FwIGZpbGUgaW5mb1xuIik7CisJZHByaW50Zl9pbmZvKHZ4ZCwiVnhEIFBhZ2VGaWxlOiByZXR1cm5pbmcgc3dhcCBmaWxlIGluZm9cbiIpOwogCUFYX3JlZyhjb250ZXh0KSA9IDB4MDA7IC8qIHBhZ2luZyBkaXNhYmxlZCAqLwogCUVDWF9yZWcoY29udGV4dCkgPSAwOyAgIC8qIG1heGltdW0gc2l6ZSBvZiBwYWdpbmcgZmlsZSAqLwkKIAkvKiBGSVhNRTogZG8gSSB0b3VjaCBEUzpTSSBvciBEUzpEST8gKi8KQEAgLTU2LDEyICs1NCwxMiBAQAogCWJyZWFrOwogCiAgICAgY2FzZSAweDAyOiAvKiBkZWxldGUgcGVybWFuZW50IHN3YXAgb24gZXhpdCAqLwotCWRwcmludGZfdnhkKHN0ZGRlYiwiVnhEIFBhZ2VGaWxlOiBzdXBwb3NlZCB0byBkZWxldGUgc3dhcFxuIik7CisJZHByaW50Zl9pbmZvKHZ4ZCwiVnhEIFBhZ2VGaWxlOiBzdXBwb3NlZCB0byBkZWxldGUgc3dhcFxuIik7CiAJUkVTRVRfQ0ZMQUcoY29udGV4dCk7CiAJYnJlYWs7CiAKICAgICBjYXNlIDB4MDM6IC8qIGN1cnJlbnQgdGVtcG9yYXJ5IHN3YXAgZmlsZSBzaXplICovCi0JZHByaW50Zl92eGQoc3RkZGViLCJWeEQgUGFnZUZpbGU6IHdoYXQgaXMgY3VycmVudCB0ZW1wLiBzd2FwIHNpemVcbiIpOworCWRwcmludGZfaW5mbyh2eGQsIlZ4RCBQYWdlRmlsZTogd2hhdCBpcyBjdXJyZW50IHRlbXAuIHN3YXAgc2l6ZVxuIik7CiAJUkVTRVRfQ0ZMQUcoY29udGV4dCk7CiAJYnJlYWs7CiAKQEAgLTgyLDEyICs4MCwxMiBAQAogewogICAgIHVuc2lnbmVkCXNlcnZpY2UgPSBEWF9yZWcoY29udGV4dCk7CiAKLSAgICBkcHJpbnRmX3Z4ZChzdGRkZWIsIlZ4RDogWyUwNHhdIFNoZWxsXG4iLCAoVUlOVDE2KXNlcnZpY2UpOworICAgIGRwcmludGZfaW5mbyh2eGQsIlZ4RDogWyUwNHhdIFNoZWxsXG4iLCAoVUlOVDE2KXNlcnZpY2UpOwogCiAgICAgc3dpdGNoIChzZXJ2aWNlKSAvKiBSYWxmIEJyb3duIHNheXMgRURYLCBidXQgSSB1c2UgRFggaW5zdGVhZCAqLwogICAgIHsKICAgICBjYXNlIDB4MDAwMDoKLQlkcHJpbnRmX3Z4ZChzdGRkZWIsIlZ4RCBTaGVsbDogcmV0dXJuaW5nIHZlcnNpb25cbiIpOworCWRwcmludGZfaW5mbyh2eGQsIlZ4RCBTaGVsbDogcmV0dXJuaW5nIHZlcnNpb25cbiIpOwogICAgICAgICBBWF9yZWcoY29udGV4dCkgPSBWWERfV2luVmVyc2lvbigpOwogCUVCWF9yZWcoY29udGV4dCkgPSAxOyAvKiBzeXN0ZW0gVk0gSGFuZGxlICovCiAJYnJlYWs7CkBAIC05NywxMiArOTUsMTIgQEAKICAgICBjYXNlIDB4MDAwMzoKICAgICBjYXNlIDB4MDAwNDoKICAgICBjYXNlIDB4MDAwNToKLQlkcHJpbnRmX3Z4ZChzdGRkZWIsIlZ4RCBTaGVsbDogRURYID0gJTA4bHhcbiIsRURYX3JlZyhjb250ZXh0KSk7CisJZHByaW50Zl9pbmZvKHZ4ZCwiVnhEIFNoZWxsOiBFRFggPSAlMDhseFxuIixFRFhfcmVnKGNvbnRleHQpKTsKIAlWWERfQkFSRiggY29udGV4dCwgInNoZWxsIiApOwogCWJyZWFrOwogCiAgICAgY2FzZSAweDAwMDY6IC8qIFNIRUxMX0dldF9WTV9TdGF0ZSAqLwotCWRwcmludGZfdnhkKHN0ZGRlYiwiVnhEIFNoZWxsOiByZXR1cm5pbmcgVk0gc3RhdGVcbiIpOworCWRwcmludGZfaW5mbyh2eGQsIlZ4RCBTaGVsbDogcmV0dXJuaW5nIFZNIHN0YXRlXG4iKTsKIAkvKiBBY3R1YWxseSB3ZSBkb24ndCwgbm90IHlldC4gV2UgaGF2ZSB0byByZXR1cm4gYSBzdHJ1Y3R1cmUKICAgICAgICAgICogYW5kIEkgYW0gbm90IHRvIHN1cmUgaG93IHRvIHNldCBpdCB1cCBhbmQgcmV0dXJuIGl0IHlldCwKICAgICAgICAgICogc28gZm9yIG5vdyBsZXQncyBkbyBub3RoaW5nLiBJIGNhbiAoaG9wZWZ1bGx5KSBnZXQgdGhpcwpAQCAtMTI4LDcgKzEyNiw3IEBACiAgICAgY2FzZSAweDAwMTU6CiAgICAgY2FzZSAweDAwMTY6CiAgICAgZGVmYXVsdDoKLSAJZHByaW50Zl92eGQoc3RkZGViLCJWeEQgU2hlbGw6IEVEWCA9ICUwOGx4XG4iLEVEWF9yZWcoY29udGV4dCkpOyAKKyAJZHByaW50Zl9pbmZvKHZ4ZCwiVnhEIFNoZWxsOiBFRFggPSAlMDhseFxuIixFRFhfcmVnKGNvbnRleHQpKTsgCiAJVlhEX0JBUkYoIGNvbnRleHQsICJzaGVsbCIpOwogCWJyZWFrOwogICAgIH0KQEAgLTE0MiwxMiArMTQwLDEyIEBACiB7CiAgICAgdW5zaWduZWQJc2VydmljZSA9IEFYX3JlZyhjb250ZXh0KTsKIAotICAgIGRwcmludGZfdnhkKHN0ZGRlYiwiVnhEOiBbJTA0eF0gQ29tbVxuIiwgKFVJTlQxNilzZXJ2aWNlKTsKKyAgICBkcHJpbnRmX2luZm8odnhkLCJWeEQ6IFslMDR4XSBDb21tXG4iLCAoVUlOVDE2KXNlcnZpY2UpOwogCiAgICAgc3dpdGNoIChzZXJ2aWNlKQogICAgIHsKICAgICBjYXNlIDB4MDAwMDogLyogZ2V0IHZlcnNpb24gKi8KLQlkcHJpbnRmX3Z4ZChzdGRkZWIsIlZ4RCBDb21tOiByZXR1cm5pbmcgdmVyc2lvblxuIik7CisJZHByaW50Zl9pbmZvKHZ4ZCwiVnhEIENvbW06IHJldHVybmluZyB2ZXJzaW9uXG4iKTsKICAgICAgICAgQVhfcmVnKGNvbnRleHQpID0gVlhEX1dpblZlcnNpb24oKTsKIAlSRVNFVF9DRkxBRyhjb250ZXh0KTsKIAlicmVhazsKQEAgLTE2Nyw3ICsxNjUsNyBAQAogewogICAgIHVuc2lnbmVkIHNlcnZpY2UgPSBBWF9yZWcoY29udGV4dCk7CiAKLSAgICBkcHJpbnRmX3Z4ZChzdGRkZWIsIlZ4RDogWyUwNHhdIFZpcnR1YWwgVGltZXJcbiIsIChVSU5UMTYpc2VydmljZSk7CisgICAgZHByaW50Zl9pbmZvKHZ4ZCwiVnhEOiBbJTA0eF0gVmlydHVhbCBUaW1lclxuIiwgKFVJTlQxNilzZXJ2aWNlKTsKIAogICAgIHN3aXRjaChzZXJ2aWNlKQogICAgIHsKZGlmZiAtLWdpdCBhL211bHRpbWVkaWEvYXVkaW8uYyBiL211bHRpbWVkaWEvYXVkaW8uYwppbmRleCA4YWJhZThjLi43NjgxODBmIDEwMDY0NAotLS0gYS9tdWx0aW1lZGlhL2F1ZGlvLmMKKysrIGIvbXVsdGltZWRpYS9hdWRpby5jCkBAIC0yNCw3ICsyNCw2IEBACiAjaW5jbHVkZSAibW1zeXN0ZW0uaCIKICNpbmNsdWRlICJoZWFwLmgiCiAjaW5jbHVkZSAibGR0LmgiCi0jaW5jbHVkZSAic3RkZGVidWcuaCIKICNpbmNsdWRlICJkZWJ1Zy5oIgogCiAjaWZkZWYgSEFWRV9PU1MKQEAgLTg4LDcgKzg3LDcgQEAKIHN0YXRpYyBEV09SRCBXQVZFX05vdGlmeUNsaWVudChVSU5UMTYgd0RldklELCBXT1JEIHdNc2csIAogCQkJCURXT1JEIGR3UGFyYW0xLCBEV09SRCBkd1BhcmFtMikKIHsKLQlkcHJpbnRmX21jaXdhdmUoc3RkZGViLCJXQVZFX05vdGlmeUNsaWVudCAvLyB3RGV2SUQgPSAlMDRYIHdNc2cgPSAlZCBkd1Bhcm0xID0gJTA0bFggZHdQYXJhbTIgPSAlMDRsWFxuIix3RGV2SUQsIHdNc2csIGR3UGFyYW0xLCBkd1BhcmFtMik7CisJZHByaW50Zl9pbmZvKG1jaXdhdmUsIldBVkVfTm90aWZ5Q2xpZW50IC8vIHdEZXZJRCA9ICUwNFggd01zZyA9ICVkIGR3UGFybTEgPSAlMDRsWCBkd1BhcmFtMiA9ICUwNGxYXG4iLHdEZXZJRCwgd01zZywgZHdQYXJhbTEsIGR3UGFyYW0yKTsKIAogCXN3aXRjaCAod01zZykgewogCWNhc2UgV09NX09QRU46CkBAIC0xMDQsNyArMTAzLDcgQEAKIAkJV091dERldlt3RGV2SURdLndhdmVEZXNjLmR3SW5zdGFuY2UsIAogICAgICAgICAgICAgICAgIGR3UGFyYW0xLCAKICAgICAgICAgICAgICAgICBkd1BhcmFtMikpIHsKLQkgICAgZHByaW50Zl9tY2l3YXZlKHN0ZGRlYiwiV0FWRV9Ob3RpZnlDbGllbnQgLy8gY2FuJ3Qgbm90aWZ5IGNsaWVudCAhXG4iKTsKKwkgICAgZHByaW50Zl93YXJuKG1jaXdhdmUsICJXQVZFX05vdGlmeUNsaWVudCAvLyBjYW4ndCBub3RpZnkgY2xpZW50ICFcbiIpOwogCSAgICByZXR1cm4gTU1TWVNFUlJfTk9FUlJPUjsKIAkgIH0KIAkgIGJyZWFrOwpAQCAtMTE4LDcgKzExNyw3IEBACiAJCVdJbkRldlt3RGV2SURdLndhdmVEZXNjLmR3Q2FsbEJhY2ssIFdJbkRldlt3RGV2SURdLndGbGFncywgCiAJCVdJbkRldlt3RGV2SURdLndhdmVEZXNjLmhXYXZlLCB3TXNnLCAKIAkJV0luRGV2W3dEZXZJRF0ud2F2ZURlc2MuZHdJbnN0YW5jZSwgZHdQYXJhbTEsIGR3UGFyYW0yKSkgewotCSAgICBkcHJpbnRmX21jaXdhdmUoc3RkZGViLCJXQVZFX05vdGlmeUNsaWVudCAvLyBjYW4ndCBub3RpZnkgY2xpZW50ICFcbiIpOworCSAgICBkcHJpbnRmX3dhcm4obWNpd2F2ZSwgIldBVkVfTm90aWZ5Q2xpZW50IC8vIGNhbid0IG5vdGlmeSBjbGllbnQgIVxuIik7CiAJICAgIHJldHVybiBNTVNZU0VSUl9OT0VSUk9SOwogCSAgfQogCSAgYnJlYWs7CkBAIC0xMzgsNyArMTM3LDcgQEAKIAlEV09SRAkJZHdSZXQ7CiAJY2hhcgkJc3RyWzEyOF07CiAKLQlkcHJpbnRmX21jaXdhdmUoc3RkZGViLCJXQVZFX21jaU9wZW4oJTA0WCwgJTA4bFgsICVwKVxuIiwgCisJZHByaW50Zl9pbmZvKG1jaXdhdmUsIldBVkVfbWNpT3BlbiglMDRYLCAlMDhsWCwgJXApXG4iLCAKIAkJCQl3RGV2SUQsIGR3RmxhZ3MsIGxwUGFybXMpOwogCWlmIChscFBhcm1zID09IE5VTEwpIHJldHVybiBNQ0lFUlJfSU5URVJOQUw7CiAKQEAgLTE1NywxMSArMTU2LDExIEBACiAKIAlNQ0lXYXZEZXZbd0RldklEXS5mSW5wdXQgPSBGQUxTRTsKIAotCWRwcmludGZfbWNpd2F2ZShzdGRkZWIsIldBVkVfbWNpT3BlbiAvLyB3RGV2SUQ9JTA0WFxuIiwgd0RldklEKTsKLQlkcHJpbnRmX21jaXdhdmUoc3RkZGViLCJXQVZFX21jaU9wZW4gLy8gYmVmb3JlIE9QRU5fRUxFTUVOVFxuIik7CisJZHByaW50Zl9pbmZvKG1jaXdhdmUsIldBVkVfbWNpT3BlbiAvLyB3RGV2SUQ9JTA0WFxuIiwgd0RldklEKTsKKwlkcHJpbnRmX2luZm8obWNpd2F2ZSwiV0FWRV9tY2lPcGVuIC8vIGJlZm9yZSBPUEVOX0VMRU1FTlRcbiIpOwogCWlmIChkd0ZsYWdzICYgTUNJX09QRU5fRUxFTUVOVCkgewogCQlscHN0ckVsZW1lbnROYW1lID0gKExQU1RSKVBUUl9TRUdfVE9fTElOKGxwUGFybXMtPmxwc3RyRWxlbWVudE5hbWUpOwotCQlkcHJpbnRmX21jaXdhdmUoc3RkZGViLCJXQVZFX21jaU9wZW4gLy8gTUNJX09QRU5fRUxFTUVOVCAnJXMnICFcbiIsCisJCWRwcmludGZfaW5mbyhtY2l3YXZlLCJXQVZFX21jaU9wZW4gLy8gTUNJX09QRU5fRUxFTUVOVCAnJXMnICFcbiIsCiAJCQkJCQlscHN0ckVsZW1lbnROYW1lKTsKIAkJaWYgKCBscHN0ckVsZW1lbnROYW1lICYmIChzdHJsZW4obHBzdHJFbGVtZW50TmFtZSkgPiAwKSkgewogCQkJc3RyY3B5KHN0ciwgbHBzdHJFbGVtZW50TmFtZSk7CkBAIC0xNjksMTQgKzE2OCwxNCBAQAogCQkJTUNJV2F2RGV2W3dEZXZJRF0uaEZpbGUgPSBtbWlvT3BlbjE2KHN0ciwgTlVMTCwgCiAJCQkJTU1JT19BTExPQ0JVRiB8IE1NSU9fUkVBRFdSSVRFIHwgTU1JT19FWENMVVNJVkUpOwogCQkJaWYgKE1DSVdhdkRldlt3RGV2SURdLmhGaWxlID09IDApIHsKLQkJCQlkcHJpbnRmX21jaXdhdmUoc3RkZGViLCJXQVZFX21jaU9wZW4gLy8gY2FuJ3QgZmluZCBmaWxlPSclcycgIVxuIiwgc3RyKTsKKwkJCQlkcHJpbnRmX3dhcm4obWNpd2F2ZSwgIldBVkVfbWNpT3BlbiAvLyBjYW4ndCBmaW5kIGZpbGU9JyVzJyAhXG4iLCBzdHIpOwogCQkJCXJldHVybiBNQ0lFUlJfRklMRV9OT1RfRk9VTkQ7CiAJCQl9CiAJCX0KIAkJZWxzZSAKIAkJCU1DSVdhdkRldlt3RGV2SURdLmhGaWxlID0gMDsKIAl9Ci0JZHByaW50Zl9tY2l3YXZlKHN0ZGRlYiwiV0FWRV9tY2lPcGVuIC8vIGhGaWxlPSV1XG4iLCBNQ0lXYXZEZXZbd0RldklEXS5oRmlsZSk7CisJZHByaW50Zl9pbmZvKG1jaXdhdmUsIldBVkVfbWNpT3BlbiAvLyBoRmlsZT0ldVxuIiwgTUNJV2F2RGV2W3dEZXZJRF0uaEZpbGUpOwogCW1lbWNweSgmTUNJV2F2RGV2W3dEZXZJRF0ub3BlblBhcm1zLCBscFBhcm1zLCBzaXplb2YoTUNJX1dBVkVfT1BFTl9QQVJNUzE2KSk7CiAJTUNJV2F2RGV2W3dEZXZJRF0ud05vdGlmeURldmljZUlEID0gbHBQYXJtcy0+d0RldmljZUlEOwogCWxwV2F2ZUZvcm1hdCA9ICZNQ0lXYXZEZXZbd0RldklEXS5XYXZlRm9ybWF0OwpAQCAtMTk1LDcgKzE5NCw3IEBACiAJCU1NQ0tJTkZPCWNrTWFpblJJRkY7CiAJCWlmIChtbWlvRGVzY2VuZChNQ0lXYXZEZXZbd0RldklEXS5oRmlsZSwgJmNrTWFpblJJRkYsIE5VTEwsIDApICE9IDApCiAJCQlyZXR1cm4gTUNJRVJSX0lOVEVSTkFMOwotCQlkcHJpbnRmX21jaXdhdmUoc3RkZGViLAorCQlkcHJpbnRmX2luZm8obWNpd2F2ZSwKIAkJCQkiV0FWRV9tY2lPcGVuIC8vIFBhcmVudENodW5rIGNraWQ9JS40cyBmY2NUeXBlPSUuNHMgY2tzaXplPSUwOGxYIFxuIiwKIAkJCQkoTFBTVFIpJmNrTWFpblJJRkYuY2tpZCwgKExQU1RSKSZja01haW5SSUZGLmZjY1R5cGUsCiAJCQkJY2tNYWluUklGRi5ja3NpemUpOwpAQCAtMjA1LDcgKzIwNCw3IEBACiAJCW1tY2tJbmZvLmNraWQgPSBtbWlvRk9VUkNDKCdmJywgJ20nLCAndCcsICcgJyk7CiAJCWlmIChtbWlvRGVzY2VuZChNQ0lXYXZEZXZbd0RldklEXS5oRmlsZSwgJm1tY2tJbmZvLCAmY2tNYWluUklGRiwgTU1JT19GSU5EQ0hVTkspICE9IDApCiAJCQlyZXR1cm4gTUNJRVJSX0lOVEVSTkFMOwotCQlkcHJpbnRmX21jaXdhdmUoc3RkZGViLAorCQlkcHJpbnRmX2luZm8obWNpd2F2ZSwKIAkJCQkiV0FWRV9tY2lPcGVuIC8vIENodW5rIEZvdW5kIGNraWQ9JS40cyBmY2NUeXBlPSUuNHMgY2tzaXplPSUwOGxYIFxuIiwKIAkJCQkoTFBTVFIpJm1tY2tJbmZvLmNraWQsIChMUFNUUikmbW1ja0luZm8uZmNjVHlwZSwKIAkJCQltbWNrSW5mby5ja3NpemUpOwpAQCAtMjE1LDExICsyMTQsMTEgQEAKIAkJbW1ja0luZm8uY2tpZCA9IG1taW9GT1VSQ0MoJ2QnLCAnYScsICd0JywgJ2EnKTsKIAkJaWYgKG1taW9EZXNjZW5kKE1DSVdhdkRldlt3RGV2SURdLmhGaWxlLCAmbW1ja0luZm8sICZja01haW5SSUZGLCBNTUlPX0ZJTkRDSFVOSykgIT0gMCkKIAkJCXJldHVybiBNQ0lFUlJfSU5URVJOQUw7Ci0JCWRwcmludGZfbWNpd2F2ZShzdGRkZWIsCisJCWRwcmludGZfaW5mbyhtY2l3YXZlLAogCQkJCSJXQVZFX21jaU9wZW4gLy8gQ2h1bmsgRm91bmQgY2tpZD0lLjRzIGZjY1R5cGU9JS40cyBja3NpemU9JTA4bFggXG4iLAogCQkJCShMUFNUUikmbW1ja0luZm8uY2tpZCwgKExQU1RSKSZtbWNrSW5mby5mY2NUeXBlLAogCQkJCW1tY2tJbmZvLmNrc2l6ZSk7Ci0JCWRwcmludGZfbWNpd2F2ZShzdGRkZWIsCisJCWRwcmludGZfaW5mbyhtY2l3YXZlLAogCQkJIldBVkVfbWNpT3BlbiAvLyBuQ2hhbm5lbHM9JWQgblNhbXBsZXNQZXJTZWM9JWxkXG4iLAogCQkJbHBXYXZlRm9ybWF0LT53Zi5uQ2hhbm5lbHMsIGxwV2F2ZUZvcm1hdC0+d2YublNhbXBsZXNQZXJTZWMpOwogCQlscFdhdmVGb3JtYXQtPndCaXRzUGVyU2FtcGxlID0gMDsKQEAgLTI1Nyw3ICsyNTYsNyBAQAogICAgICAgICBEV09SRAkJZHdSZXQ7CiAgICAgICAgIFdBVkVPUEVOREVTQwl3YXZlRGVzYzsKIAotCWRwcmludGZfbWNpd2F2ZShzdGRkZWIsIldBVkVfbWNpQ3VlKCV1LCAlMDhsWCwgJXApO1xuIiwgd0RldklELCBkd1BhcmFtLCBscFBhcm1zKTsKKwlkcHJpbnRmX2luZm8obWNpd2F2ZSwiV0FWRV9tY2lDdWUoJXUsICUwOGxYLCAlcCk7XG4iLCB3RGV2SUQsIGR3UGFyYW0sIGxwUGFybXMpOwogCiAvKiBhbHdheXMgY2xvc2UgZWxlbWVudHMgPyAqLwogCkBAIC0yOTUsNyArMjk0LDcgQEAKIHsKIAlEV09SRAkJZHdSZXQ7CiAKLQlkcHJpbnRmX21jaXdhdmUoc3RkZGViLAorCWRwcmludGZfaW5mbyhtY2l3YXZlLAogCQkJIldBVkVfbWNpQ2xvc2UoJXUsICUwOGxYLCAlcCk7XG4iLCB3RGV2SUQsIGR3UGFyYW0sIGxwUGFybXMpOwogCU1DSVdhdkRldlt3RGV2SURdLm5Vc2VDb3VudC0tOwogCWlmIChNQ0lXYXZEZXZbd0RldklEXS5uVXNlQ291bnQgPT0gMCkgewpAQCAtMzI1LDQyICszMjQsNDEgQEAKIAlMUFdBVkVIRFIJbHBXYXZlSGRyOwogCURXT1JECQlkd1JldDsKIAotCWRwcmludGZfbWNpd2F2ZShzdGRkZWIsCisJZHByaW50Zl9pbmZvKG1jaXdhdmUsCiAJCSAiV0FWRV9tY2lQbGF5KCV1LCAlMDhsWCwgJXApO1xuIiwgd0RldklELCBkd0ZsYWdzLCBscFBhcm1zKTsKIAogCWlmIChNQ0lXYXZEZXZbd0RldklEXS5mSW5wdXQpIHsKLQkgICAgICAgIGRwcmludGZfbWNpd2F2ZShzdGRkZWIsIldBVkVfbWNpUGxheSAvLyBjYW5ub3QgcGxheSBvbiBpbnB1dCBkZXZpY2VcbiIpOworCSAgICAgICAgZHByaW50Zl93YXJuKG1jaXdhdmUsICJXQVZFX21jaVBsYXkgLy8gY2Fubm90IHBsYXkgb24gaW5wdXQgZGV2aWNlXG4iKTsKIAkJcmV0dXJuIE1DSUVSUl9OT05BUFBMSUNBQkxFX0ZVTkNUSU9OOwogCX0KIAogCWlmIChNQ0lXYXZEZXZbd0RldklEXS5oRmlsZSA9PSAwKSB7Ci0gICAgICAgICAgICAgICAgZHByaW50Zl9tY2l3YXZlKHN0ZGRlYiwiV0FWRV9tY2lQbGF5IC8vIGNhbid0IGZpbmQgZmlsZT0nJTA4bHgnICFcbiIsCisgICAgICAgICAgICAgICAgZHByaW50Zl93YXJuKG1jaXdhdmUsICJXQVZFX21jaVBsYXkgLy8gY2FuJ3QgZmluZCBmaWxlPSclMDhseCcgIVxuIiwKICAgICAgICAgICAgICAgICAgICAgICAgIE1DSVdhdkRldlt3RGV2SURdLm9wZW5QYXJtcy5scHN0ckVsZW1lbnROYW1lKTsKIAkJcmV0dXJuIE1DSUVSUl9GSUxFX05PVF9GT1VORDsKIAl9CiAJc3RhcnQgPSAxOyAJCWVuZCA9IDk5OTk5OwogCWlmIChkd0ZsYWdzICYgTUNJX0ZST00pIHsKIAkJc3RhcnQgPSBscFBhcm1zLT5kd0Zyb207IAotCQlkcHJpbnRmX21jaXdhdmUoc3RkZGViLAorCQlkcHJpbnRmX2luZm8obWNpd2F2ZSwKIAkJCQkiV0FWRV9tY2lQbGF5IC8vIE1DSV9GUk9NPSVkIFxuIiwgc3RhcnQpOwogCX0KIAlpZiAoZHdGbGFncyAmIE1DSV9UTykgewogCQllbmQgPSBscFBhcm1zLT5kd1RvOwotCQlkcHJpbnRmX21jaXdhdmUoc3RkZGViLCJXQVZFX21jaVBsYXkgLy8gTUNJX1RPPSVkIFxuIiwgZW5kKTsKKwkJZHByaW50Zl9pbmZvKG1jaXdhdmUsIldBVkVfbWNpUGxheSAvLyBNQ0lfVE89JWQgXG4iLCBlbmQpOwogCX0KICNpZiAwCiAJaWYgKGR3RmxhZ3MgJiBNQ0lfTk9USUZZKSB7Ci0gICAgICAgIGRwcmludGZfbWNpd2F2ZShzdGRkZWIsCisgICAgICAgIGRwcmludGZfaW5mbyhtY2l3YXZlLAogCSAgICAgICAgIldBVkVfbWNpUGxheSAvLyBNQ0lfTk9USUZZICUwOGxYICFcbiIsIGxwUGFybXMtPmR3Q2FsbGJhY2spOwogCQlzd2l0Y2goZm9yaygpKSB7CiAJCQljYXNlIC0xOgotCQkJCWRwcmludGZfbWNpd2F2ZShzdGRkZWIsCi0JCQkJICAiV0FWRV9tY2lQbGF5IC8vIENhbid0ICdmb3JrJyBwcm9jZXNzICFcbiIpOworCQkJCWRwcmludGZfd2FybihtY2l3YXZlLCAiV0FWRV9tY2lQbGF5IC8vIENhbid0ICdmb3JrJyBwcm9jZXNzICFcbiIpOwogCQkJCWJyZWFrOwogCQkJY2FzZSAwOgogCQkJCWJyZWFrOyAgICAgICAgIAogCQkJZGVmYXVsdDoKLQkJCQlkcHJpbnRmX21jaXdhdmUoc3RkZGViLCJXQVZFX21jaVBsYXkgLy8gcHJvY2VzcyBzdGFydGVkICEgcmV0dXJuIHRvIGNhbGxlci4uLlxuIik7CisJCQkJZHByaW50Zl9pbmZvKG1jaXdhdmUsIldBVkVfbWNpUGxheSAvLyBwcm9jZXNzIHN0YXJ0ZWQgISByZXR1cm4gdG8gY2FsbGVyLi4uXG4iKTsKIAkJCQlyZXR1cm4gMDsKIAkJCX0KIAkJfQpAQCAtMzc1LDExICszNzMsMTEgQEAKIAlkd1JldD13b2RNZXNzYWdlKHdEZXZJRCxXT0RNX1BSRVBBUkUsMCwoRFdPUkQpbHBXYXZlSGRyLHNpemVvZihXQVZFSERSKSk7CiAJd2hpbGUoVFJVRSkgewogCQljb3VudCA9IG1taW9SZWFkKE1DSVdhdkRldlt3RGV2SURdLmhGaWxlLCBscFdhdmVIZHItPmxwRGF0YSwgYnVmc2l6ZSk7Ci0JCWRwcmludGZfbWNpd2F2ZShzdGRkZWIsIldBVkVfbWNpUGxheSAvLyBtbWlvUmVhZCBidWZzaXplPSVsZCBjb3VudD0lbGRcbiIsIGJ1ZnNpemUsIGNvdW50KTsKKwkJZHByaW50Zl9pbmZvKG1jaXdhdmUsIldBVkVfbWNpUGxheSAvLyBtbWlvUmVhZCBidWZzaXplPSVsZCBjb3VudD0lbGRcbiIsIGJ1ZnNpemUsIGNvdW50KTsKIAkJaWYgKGNvdW50IDwgMSkgYnJlYWs7CiAJCWxwV2F2ZUhkci0+ZHdCdWZmZXJMZW5ndGggPSBjb3VudDsKIC8qCQlscFdhdmVIZHItPmR3Qnl0ZXNSZWNvcmRlZCA9IGNvdW50OyAqLwotCQlkcHJpbnRmX21jaXdhdmUoc3RkZGViLCJXQVZFX21jaVBsYXkgLy8gYmVmb3JlIFdPRE1fV1JJVEUgbHBXYXZlSGRyPSVwIGR3QnVmZmVyTGVuZ3RoPSVsdSBkd0J5dGVzUmVjb3JkZWQ9JWx1XG4iLAorCQlkcHJpbnRmX2luZm8obWNpd2F2ZSwiV0FWRV9tY2lQbGF5IC8vIGJlZm9yZSBXT0RNX1dSSVRFIGxwV2F2ZUhkcj0lcCBkd0J1ZmZlckxlbmd0aD0lbHUgZHdCeXRlc1JlY29yZGVkPSVsdVxuIiwKIAkJCQlscFdhdmVIZHIsIGxwV2F2ZUhkci0+ZHdCdWZmZXJMZW5ndGgsIGxwV2F2ZUhkci0+ZHdCeXRlc1JlY29yZGVkKTsKIAkJZHdSZXQ9d29kTWVzc2FnZSh3RGV2SUQsV09ETV9XUklURSwwLChEV09SRClscFdhdmVIZHIsc2l6ZW9mKFdBVkVIRFIpKTsKIAl9CkBAIC0zOTAsNyArMzg4LDcgQEAKIAkJbHBXYXZlSGRyLT5scERhdGEgPSBOVUxMOwogCX0KIAlpZiAoZHdGbGFncyAmIE1DSV9OT1RJRlkpIHsKLQkJZHByaW50Zl9tY2l3YXZlKHN0ZGRlYiwiV0FWRV9tY2lQbGF5IC8vIE1DSV9OT1RJRllfU1VDQ0VTU0ZVTCAlMDhsWCAhXG4iLCBscFBhcm1zLT5kd0NhbGxiYWNrKTsKKwkJZHByaW50Zl9pbmZvKG1jaXdhdmUsIldBVkVfbWNpUGxheSAvLyBNQ0lfTk9USUZZX1NVQ0NFU1NGVUwgJTA4bFggIVxuIiwgbHBQYXJtcy0+ZHdDYWxsYmFjayk7CiAJCW1jaURyaXZlck5vdGlmeSgoSFdORDE2KUxPV09SRChscFBhcm1zLT5kd0NhbGxiYWNrKSwgCiAJCQlNQ0lXYXZEZXZbd0RldklEXS53Tm90aWZ5RGV2aWNlSUQsIE1DSV9OT1RJRllfU1VDQ0VTU0ZVTCk7CiAJfQpAQCAtNDA5LDI4ICs0MDcsMjggQEAKIAlMUFdBVkVIRFIJCWxwV2F2ZUhkcjsKIAlEV09SRAkJCWR3UmV0OwogCi0JZHByaW50Zl9tY2l3YXZlKHN0ZGRlYiwKKwlkcHJpbnRmX2luZm8obWNpd2F2ZSwKIAkJIldBVkVfbWNpUmVjb3JkKCV1LCAlMDhsWCwgJXApO1xuIiwgd0RldklELCBkd0ZsYWdzLCBscFBhcm1zKTsKIAogCWlmICghTUNJV2F2RGV2W3dEZXZJRF0uZklucHV0KSB7Ci0JICAgICAgICBkcHJpbnRmX21jaXdhdmUoc3RkZGViLCJXQVZFX21jaVBsYXkgLy8gY2Fubm90IHJlY29yZCBvbiBvdXRwdXQgZGV2aWNlXG4iKTsKKwkgICAgICAgIGRwcmludGZfd2FybihtY2l3YXZlLCAiV0FWRV9tY2lQbGF5IC8vIGNhbm5vdCByZWNvcmQgb24gb3V0cHV0IGRldmljZVxuIik7CiAJCXJldHVybiBNQ0lFUlJfTk9OQVBQTElDQUJMRV9GVU5DVElPTjsKIAl9CiAKIAlpZiAoTUNJV2F2RGV2W3dEZXZJRF0uaEZpbGUgPT0gMCkgewotCQlkcHJpbnRmX21jaXdhdmUoc3RkZGViLCJXQVZFX21jaVJlY29yZCAvLyBjYW4ndCBmaW5kIGZpbGU9JyUwOGx4JyAhXG4iLCAKKwkJZHByaW50Zl93YXJuKG1jaXdhdmUsICJXQVZFX21jaVJlY29yZCAvLyBjYW4ndCBmaW5kIGZpbGU9JyUwOGx4JyAhXG4iLCAKIAkJCQlNQ0lXYXZEZXZbd0RldklEXS5vcGVuUGFybXMubHBzdHJFbGVtZW50TmFtZSk7CiAJCXJldHVybiBNQ0lFUlJfRklMRV9OT1RfRk9VTkQ7CiAJfQogCXN0YXJ0ID0gMTsgCWVuZCA9IDk5OTk5OwogCWlmIChkd0ZsYWdzICYgTUNJX0ZST00pIHsKIAkJc3RhcnQgPSBscFBhcm1zLT5kd0Zyb207IAotCQlkcHJpbnRmX21jaXdhdmUoc3RkZGViLAorCQlkcHJpbnRmX2luZm8obWNpd2F2ZSwKIAkJCQkiV0FWRV9tY2lSZWNvcmQgLy8gTUNJX0ZST009JWQgXG4iLCBzdGFydCk7CiAJfQogCWlmIChkd0ZsYWdzICYgTUNJX1RPKSB7CiAJCWVuZCA9IGxwUGFybXMtPmR3VG87Ci0JCWRwcmludGZfbWNpd2F2ZShzdGRkZWIsIldBVkVfbWNpUmVjb3JkIC8vIE1DSV9UTz0lZCBcbiIsIGVuZCk7CisJCWRwcmludGZfaW5mbyhtY2l3YXZlLCJXQVZFX21jaVJlY29yZCAvLyBNQ0lfVE89JWQgXG4iLCBlbmQpOwogCX0KIAlidWZzaXplID0gNjQwMDA7CiAJbHBXYXZlSGRyID0gJk1DSVdhdkRldlt3RGV2SURdLldhdmVIZHI7CkBAIC00NDEsMjUgKzQzOSwyNSBAQAogCWxwV2F2ZUhkci0+ZHdGbGFncyA9IDBMOwogCWxwV2F2ZUhkci0+ZHdMb29wcyA9IDBMOwogCWR3UmV0PXdpZE1lc3NhZ2Uod0RldklELFdJRE1fUFJFUEFSRSwwLChEV09SRClscFdhdmVIZHIsc2l6ZW9mKFdBVkVIRFIpKTsKLQlkcHJpbnRmX21jaXdhdmUoc3RkZGViLCJXQVZFX21jaVJlY29yZCAvLyBhZnRlciBXSURNX1BSRVBBUkUgXG4iKTsKKwlkcHJpbnRmX2luZm8obWNpd2F2ZSwiV0FWRV9tY2lSZWNvcmQgLy8gYWZ0ZXIgV0lETV9QUkVQQVJFIFxuIik7CiAJd2hpbGUoVFJVRSkgewogCQlscFdhdmVIZHItPmR3Qnl0ZXNSZWNvcmRlZCA9IDA7CiAJCWR3UmV0ID0gd2lkTWVzc2FnZSh3RGV2SUQsIFdJRE1fU1RBUlQsIDAsIDBMLCAwTCk7Ci0JCWRwcmludGZfbWNpd2F2ZShzdGRkZWIsCisJCWRwcmludGZfaW5mbyhtY2l3YXZlLAogICAgICAgICAgICAgICAgICAgICAiV0FWRV9tY2lSZWNvcmQgLy8gYWZ0ZXIgV0lETV9TVEFSVCBscFdhdmVIZHI9JXAgZHdCeXRlc1JlY29yZGVkPSVsdVxuIiwKIAkJCQkJbHBXYXZlSGRyLCBscFdhdmVIZHItPmR3Qnl0ZXNSZWNvcmRlZCk7CiAJCWlmIChscFdhdmVIZHItPmR3Qnl0ZXNSZWNvcmRlZCA9PSAwKSBicmVhazsKIAl9Ci0JZHByaW50Zl9tY2l3YXZlKHN0ZGRlYiwiV0FWRV9tY2lSZWNvcmQgLy8gYmVmb3JlIFdJRE1fVU5QUkVQQVJFIFxuIik7CisJZHByaW50Zl9pbmZvKG1jaXdhdmUsIldBVkVfbWNpUmVjb3JkIC8vIGJlZm9yZSBXSURNX1VOUFJFUEFSRSBcbiIpOwogCWR3UmV0ID0gd2lkTWVzc2FnZSh3RGV2SUQsV0lETV9VTlBSRVBBUkUsMCwoRFdPUkQpbHBXYXZlSGRyLHNpemVvZihXQVZFSERSKSk7Ci0JZHByaW50Zl9tY2l3YXZlKHN0ZGRlYiwiV0FWRV9tY2lSZWNvcmQgLy8gYWZ0ZXIgV0lETV9VTlBSRVBBUkUgXG4iKTsKKwlkcHJpbnRmX2luZm8obWNpd2F2ZSwiV0FWRV9tY2lSZWNvcmQgLy8gYWZ0ZXIgV0lETV9VTlBSRVBBUkUgXG4iKTsKIAlpZiAobHBXYXZlSGRyLT5scERhdGEgIT0gTlVMTCkgewogCQlHbG9iYWxVbmxvY2sxNihoRGF0YSk7CiAJCUdsb2JhbEZyZWUxNihoRGF0YSk7CiAJCWxwV2F2ZUhkci0+bHBEYXRhID0gTlVMTDsKIAl9CiAJaWYgKGR3RmxhZ3MgJiBNQ0lfTk9USUZZKSB7Ci0JICBkcHJpbnRmX21jaXdhdmUoc3RkZGViLCJXQVZFX21jaVJlY29yZCAvLyBNQ0lfTk9USUZZX1NVQ0NFU1NGVUwgJTA4bFggIVxuIiwgbHBQYXJtcy0+ZHdDYWxsYmFjayk7CisJICBkcHJpbnRmX2luZm8obWNpd2F2ZSwiV0FWRV9tY2lSZWNvcmQgLy8gTUNJX05PVElGWV9TVUNDRVNTRlVMICUwOGxYICFcbiIsIGxwUGFybXMtPmR3Q2FsbGJhY2spOwogCQltY2lEcml2ZXJOb3RpZnkoKEhXTkQxNilMT1dPUkQobHBQYXJtcy0+ZHdDYWxsYmFjayksIAogCQkJTUNJV2F2RGV2W3dEZXZJRF0ud05vdGlmeURldmljZUlELCBNQ0lfTk9USUZZX1NVQ0NFU1NGVUwpOwogCX0KQEAgLTQ3NCw3ICs0NzIsNyBAQAogewogICAgICAgICBEV09SRCBkd1JldDsKIAotCWRwcmludGZfbWNpd2F2ZShzdGRkZWIsCisJZHByaW50Zl9pbmZvKG1jaXdhdmUsCiAJCSJXQVZFX21jaVN0b3AoJXUsICUwOGxYLCAlcCk7XG4iLCB3RGV2SUQsIGR3RmxhZ3MsIGxwUGFybXMpOwogCWlmIChscFBhcm1zID09IE5VTEwpIHJldHVybiBNQ0lFUlJfSU5URVJOQUw7CiAJaWYgKE1DSVdhdkRldlt3RGV2SURdLmZJbnB1dCkKQEAgLTQ5Myw3ICs0OTEsNyBAQAogewogICAgICAgICBEV09SRCBkd1JldDsKIAotCWRwcmludGZfbWNpd2F2ZShzdGRkZWIsCisJZHByaW50Zl9pbmZvKG1jaXdhdmUsCiAJCSJXQVZFX21jaVBhdXNlKCV1LCAlMDhsWCwgJXApO1xuIiwgd0RldklELCBkd0ZsYWdzLCBscFBhcm1zKTsKIAlpZiAobHBQYXJtcyA9PSBOVUxMKSByZXR1cm4gTUNJRVJSX0lOVEVSTkFMOwogCWlmIChNQ0lXYXZEZXZbd0RldklEXS5mSW5wdXQpCkBAIC01MTAsNyArNTA4LDcgQEAKICAqLwogc3RhdGljIERXT1JEIFdBVkVfbWNpUmVzdW1lKFVJTlQxNiB3RGV2SUQsIERXT1JEIGR3RmxhZ3MsIExQTUNJX0dFTkVSSUNfUEFSTVMgbHBQYXJtcykKIHsKLQlkcHJpbnRmX21jaXdhdmUoc3RkZGViLAorCWRwcmludGZfaW5mbyhtY2l3YXZlLAogCQkiV0FWRV9tY2lSZXN1bWUoJXUsICUwOGxYLCAlcCk7XG4iLCB3RGV2SUQsIGR3RmxhZ3MsIGxwUGFybXMpOwogCWlmIChscFBhcm1zID09IE5VTEwpIHJldHVybiBNQ0lFUlJfSU5URVJOQUw7CiAJcmV0dXJuIDA7CkBAIC01MjIsMjYgKzUyMCwyNiBAQAogICovCiBzdGF0aWMgRFdPUkQgV0FWRV9tY2lTZXQoVUlOVDE2IHdEZXZJRCwgRFdPUkQgZHdGbGFncywgTFBNQ0lfU0VUX1BBUk1TIGxwUGFybXMpCiB7Ci0JZHByaW50Zl9tY2l3YXZlKHN0ZGRlYiwKKwlkcHJpbnRmX2luZm8obWNpd2F2ZSwKIAkJIldBVkVfbWNpU2V0KCV1LCAlMDhsWCwgJXApO1xuIiwgd0RldklELCBkd0ZsYWdzLCBscFBhcm1zKTsKIAlpZiAobHBQYXJtcyA9PSBOVUxMKSByZXR1cm4gTUNJRVJSX0lOVEVSTkFMOwotCWRwcmludGZfbWNpd2F2ZShzdGRkZWIsCisJZHByaW50Zl9pbmZvKG1jaXdhdmUsCiAJCSAiV0FWRV9tY2lTZXQgLy8gZHdUaW1lRm9ybWF0PSUwOGxYXG4iLCBscFBhcm1zLT5kd1RpbWVGb3JtYXQpOwotCWRwcmludGZfbWNpd2F2ZShzdGRkZWIsCisJZHByaW50Zl9pbmZvKG1jaXdhdmUsCiAJCSAiV0FWRV9tY2lTZXQgLy8gZHdBdWRpbz0lMDhsWFxuIiwgbHBQYXJtcy0+ZHdBdWRpbyk7CiAJaWYgKGR3RmxhZ3MgJiBNQ0lfU0VUX1RJTUVfRk9STUFUKSB7CiAJCXN3aXRjaCAobHBQYXJtcy0+ZHdUaW1lRm9ybWF0KSB7CiAJCWNhc2UgTUNJX0ZPUk1BVF9NSUxMSVNFQ09ORFM6Ci0JCQlkcHJpbnRmX21jaXdhdmUoc3RkZGViLAkiV0FWRV9tY2lTZXQgLy8gTUNJX0ZPUk1BVF9NSUxMSVNFQ09ORFMgIVxuIik7CisJCQlkcHJpbnRmX2luZm8obWNpd2F2ZSwJIldBVkVfbWNpU2V0IC8vIE1DSV9GT1JNQVRfTUlMTElTRUNPTkRTICFcbiIpOwogCQkJYnJlYWs7CiAJCWNhc2UgTUNJX0ZPUk1BVF9CWVRFUzoKLQkJCWRwcmludGZfbWNpd2F2ZShzdGRkZWIsICJXQVZFX21jaVNldCAvLyBNQ0lfRk9STUFUX0JZVEVTICFcbiIpOworCQkJZHByaW50Zl9pbmZvKG1jaXdhdmUsICJXQVZFX21jaVNldCAvLyBNQ0lfRk9STUFUX0JZVEVTICFcbiIpOwogCQkJYnJlYWs7CiAJCWNhc2UgTUNJX0ZPUk1BVF9TQU1QTEVTOgotCQkJZHByaW50Zl9tY2l3YXZlKHN0ZGRlYiwJIldBVkVfbWNpU2V0IC8vIE1DSV9GT1JNQVRfU0FNUExFUyAhXG4iKTsKKwkJCWRwcmludGZfaW5mbyhtY2l3YXZlLAkiV0FWRV9tY2lTZXQgLy8gTUNJX0ZPUk1BVF9TQU1QTEVTICFcbiIpOwogCQkJYnJlYWs7CiAJCWRlZmF1bHQ6Ci0JCQlkcHJpbnRmX21jaXdhdmUoc3RkZGViLAkiV0FWRV9tY2lTZXQgLy8gYmFkIHRpbWUgZm9ybWF0ICFcbiIpOworCQkJZHByaW50Zl93YXJuKG1jaXdhdmUsCSJXQVZFX21jaVNldCAvLyBiYWQgdGltZSBmb3JtYXQgIVxuIik7CiAJCQlyZXR1cm4gTUNJRVJSX0JBRF9USU1FX0ZPUk1BVDsKIAkJfQogCX0KQEAgLTU0OSwzOCArNTQ3LDM4IEBACiAJaWYgKGR3RmxhZ3MgJiBNQ0lfU0VUX0RPT1JfT1BFTikgcmV0dXJuIE1DSUVSUl9VTlNVUFBPUlRFRF9GVU5DVElPTjsKIAlpZiAoZHdGbGFncyAmIE1DSV9TRVRfRE9PUl9DTE9TRUQpIHJldHVybiBNQ0lFUlJfVU5TVVBQT1JURURfRlVOQ1RJT047CiAJaWYgKGR3RmxhZ3MgJiBNQ0lfU0VUX0FVRElPKSAKLQkgIGRwcmludGZfbWNpd2F2ZShzdGRkZWIsIldBVkVfbWNpU2V0IC8vIE1DSV9TRVRfQVVESU8gIVxuIik7CisJICBkcHJpbnRmX2luZm8obWNpd2F2ZSwiV0FWRV9tY2lTZXQgLy8gTUNJX1NFVF9BVURJTyAhXG4iKTsKIAlpZiAoZHdGbGFncyAmJiBNQ0lfU0VUX09OKSB7Ci0JICBkcHJpbnRmX21jaXdhdmUoc3RkZGViLCJXQVZFX21jaVNldCAvLyBNQ0lfU0VUX09OICFcbiIpOworCSAgZHByaW50Zl9pbmZvKG1jaXdhdmUsIldBVkVfbWNpU2V0IC8vIE1DSV9TRVRfT04gIVxuIik7CiAJICBpZiAoZHdGbGFncyAmJiBNQ0lfU0VUX0FVRElPX0xFRlQpIAotCSAgICBkcHJpbnRmX21jaXdhdmUoc3RkZGViLCJXQVZFX21jaVNldCAvLyBNQ0lfU0VUX0FVRElPX0xFRlQgIVxuIik7CisJICAgIGRwcmludGZfaW5mbyhtY2l3YXZlLCJXQVZFX21jaVNldCAvLyBNQ0lfU0VUX0FVRElPX0xFRlQgIVxuIik7CiAJICBpZiAoZHdGbGFncyAmJiBNQ0lfU0VUX0FVRElPX1JJR0hUKSAKLQkgICAgZHByaW50Zl9tY2l3YXZlKHN0ZGRlYiwiV0FWRV9tY2lTZXQgLy8gTUNJX1NFVF9BVURJT19SSUdIVCAhXG4iKTsKKwkgICAgZHByaW50Zl9pbmZvKG1jaXdhdmUsIldBVkVfbWNpU2V0IC8vIE1DSV9TRVRfQVVESU9fUklHSFQgIVxuIik7CiAJfQogCWlmIChkd0ZsYWdzICYgTUNJX1NFVF9PRkYpIAotCSAgZHByaW50Zl9tY2l3YXZlKHN0ZGRlYiwiV0FWRV9tY2lTZXQgLy8gTUNJX1NFVF9PRkYgIVxuIik7CisJICBkcHJpbnRmX2luZm8obWNpd2F2ZSwiV0FWRV9tY2lTZXQgLy8gTUNJX1NFVF9PRkYgIVxuIik7CiAJaWYgKGR3RmxhZ3MgJiBNQ0lfV0FWRV9JTlBVVCkgCi0JICBkcHJpbnRmX21jaXdhdmUoc3RkZGViLCJXQVZFX21jaVNldCAvLyBNQ0lfV0FWRV9JTlBVVCAhXG4iKTsKKwkgIGRwcmludGZfaW5mbyhtY2l3YXZlLCJXQVZFX21jaVNldCAvLyBNQ0lfV0FWRV9JTlBVVCAhXG4iKTsKICAgICAgIAlpZiAoZHdGbGFncyAmIE1DSV9XQVZFX09VVFBVVCkgCi0JICBkcHJpbnRmX21jaXdhdmUoc3RkZGViLCJXQVZFX21jaVNldCAvLyBNQ0lfV0FWRV9PVVRQVVQgIVxuIik7CisJICBkcHJpbnRmX2luZm8obWNpd2F2ZSwiV0FWRV9tY2lTZXQgLy8gTUNJX1dBVkVfT1VUUFVUICFcbiIpOwogCWlmIChkd0ZsYWdzICYgTUNJX1dBVkVfU0VUX0FOWUlOUFVUKSAKLQkgIGRwcmludGZfbWNpd2F2ZShzdGRkZWIsIldBVkVfbWNpU2V0IC8vIE1DSV9XQVZFX1NFVF9BTllJTlBVVCAhXG4iKTsKKwkgIGRwcmludGZfaW5mbyhtY2l3YXZlLCJXQVZFX21jaVNldCAvLyBNQ0lfV0FWRV9TRVRfQU5ZSU5QVVQgIVxuIik7CiAJaWYgKGR3RmxhZ3MgJiBNQ0lfV0FWRV9TRVRfQU5ZT1VUUFVUKSAKLQkgIGRwcmludGZfbWNpd2F2ZShzdGRkZWIsIldBVkVfbWNpU2V0IC8vIE1DSV9XQVZFX1NFVF9BTllPVVRQVVQgIVxuIik7CisJICBkcHJpbnRmX2luZm8obWNpd2F2ZSwiV0FWRV9tY2lTZXQgLy8gTUNJX1dBVkVfU0VUX0FOWU9VVFBVVCAhXG4iKTsKIAlpZiAoZHdGbGFncyAmIE1DSV9XQVZFX1NFVF9BVkdCWVRFU1BFUlNFQykgCi0JICBkcHJpbnRmX21jaXdhdmUoc3RkZGViLAorCSAgZHByaW50Zl9pbmZvKG1jaXdhdmUsCiAJCQkgICJXQVZFX21jaVNldCAvLyBNQ0lfV0FWRV9TRVRfQVZHQllURVNQRVJTRUMgIVxuIik7CiAJaWYgKGR3RmxhZ3MgJiBNQ0lfV0FWRV9TRVRfQklUU1BFUlNBTVBMRSkgCi0JICBkcHJpbnRmX21jaXdhdmUoc3RkZGViLAorCSAgZHByaW50Zl9pbmZvKG1jaXdhdmUsCiAJCQkgICJXQVZFX21jaVNldCAvLyBNQ0lfV0FWRV9TRVRfQklUU1BFUlNBTVBMRSAhXG4iKTsKIAlpZiAoZHdGbGFncyAmIE1DSV9XQVZFX1NFVF9CTE9DS0FMSUdOKSAKLQkgIGRwcmludGZfbWNpd2F2ZShzdGRkZWIsIldBVkVfbWNpU2V0IC8vIE1DSV9XQVZFX1NFVF9CTE9DS0FMSUdOICFcbiIpOworCSAgZHByaW50Zl9pbmZvKG1jaXdhdmUsIldBVkVfbWNpU2V0IC8vIE1DSV9XQVZFX1NFVF9CTE9DS0FMSUdOICFcbiIpOwogCWlmIChkd0ZsYWdzICYgTUNJX1dBVkVfU0VUX0NIQU5ORUxTKSAKLQkgIGRwcmludGZfbWNpd2F2ZShzdGRkZWIsIldBVkVfbWNpU2V0IC8vIE1DSV9XQVZFX1NFVF9DSEFOTkVMUyAhXG4iKTsKKwkgIGRwcmludGZfaW5mbyhtY2l3YXZlLCJXQVZFX21jaVNldCAvLyBNQ0lfV0FWRV9TRVRfQ0hBTk5FTFMgIVxuIik7CiAJaWYgKGR3RmxhZ3MgJiBNQ0lfV0FWRV9TRVRfRk9STUFUVEFHKSAKLQkgIGRwcmludGZfbWNpd2F2ZShzdGRkZWIsIldBVkVfbWNpU2V0IC8vIE1DSV9XQVZFX1NFVF9GT1JNQVRUQUcgIVxuIik7CisJICBkcHJpbnRmX2luZm8obWNpd2F2ZSwiV0FWRV9tY2lTZXQgLy8gTUNJX1dBVkVfU0VUX0ZPUk1BVFRBRyAhXG4iKTsKIAlpZiAoZHdGbGFncyAmIE1DSV9XQVZFX1NFVF9TQU1QTEVTUEVSU0VDKSAKLQkgIGRwcmludGZfbWNpd2F2ZShzdGRkZWIsCisJICBkcHJpbnRmX2luZm8obWNpd2F2ZSwKIAkJCSAgIldBVkVfbWNpU2V0IC8vIE1DSV9XQVZFX1NFVF9TQU1QTEVTUEVSU0VDICFcbiIpOwogIAlyZXR1cm4gMDsKIH0KQEAgLTU5MSw3ICs1ODksNyBAQAogICovCiBzdGF0aWMgRFdPUkQgV0FWRV9tY2lTdGF0dXMoVUlOVDE2IHdEZXZJRCwgRFdPUkQgZHdGbGFncywgTFBNQ0lfU1RBVFVTX1BBUk1TIGxwUGFybXMpCiB7Ci0JZHByaW50Zl9tY2l3YXZlKHN0ZGRlYiwKKwlkcHJpbnRmX2luZm8obWNpd2F2ZSwKIAkJIldBVkVfbWNpU3RhdHVzKCV1LCAlMDhsWCwgJXApO1xuIiwgd0RldklELCBkd0ZsYWdzLCBscFBhcm1zKTsKIAlpZiAobHBQYXJtcyA9PSBOVUxMKSByZXR1cm4gTUNJRVJSX0lOVEVSTkFMOwogCWlmIChkd0ZsYWdzICYgTUNJX1NUQVRVU19JVEVNKSB7CkBAIC02MTAsNyArNjA4LDcgQEAKIAkJCWxwUGFybXMtPmR3UmV0dXJuID0gTUNJX01PREVfU1RPUDsKIAkJCWJyZWFrOwogCQljYXNlIE1DSV9TVEFUVVNfTUVESUFfUFJFU0VOVDoKLQkJCWRwcmludGZfbWNpd2F2ZShzdGRkZWIsIldBVkVfbWNpU3RhdHVzIC8vIE1DSV9TVEFUVVNfTUVESUFfUFJFU0VOVCAhXG4iKTsKKwkJCWRwcmludGZfaW5mbyhtY2l3YXZlLCJXQVZFX21jaVN0YXR1cyAvLyBNQ0lfU1RBVFVTX01FRElBX1BSRVNFTlQgIVxuIik7CiAJCQlscFBhcm1zLT5kd1JldHVybiA9IFRSVUU7CiAJCQlicmVhazsKIAkJY2FzZSBNQ0lfU1RBVFVTX05VTUJFUl9PRl9UUkFDS1M6CkBAIC02MjYsNTYgKzYyNCw1NiBAQAogCQkJfQogCQkJYnJlYWs7CiAJCWNhc2UgTUNJX1NUQVRVU19SRUFEWToKLQkJCWRwcmludGZfbWNpd2F2ZShzdGRkZWIsIldBVkVfbWNpU3RhdHVzIC8vIE1DSV9TVEFUVVNfUkVBRFkgIVxuIik7CisJCQlkcHJpbnRmX2luZm8obWNpd2F2ZSwiV0FWRV9tY2lTdGF0dXMgLy8gTUNJX1NUQVRVU19SRUFEWSAhXG4iKTsKIAkJCWxwUGFybXMtPmR3UmV0dXJuID0gVFJVRTsKIAkJCWJyZWFrOwogCQljYXNlIE1DSV9TVEFUVVNfVElNRV9GT1JNQVQ6Ci0JCQlkcHJpbnRmX21jaXdhdmUoc3RkZGViLCJXQVZFX21jaVN0YXR1cyAvLyBNQ0lfU1RBVFVTX1RJTUVfRk9STUFUICFcbiIpOworCQkJZHByaW50Zl9pbmZvKG1jaXdhdmUsIldBVkVfbWNpU3RhdHVzIC8vIE1DSV9TVEFUVVNfVElNRV9GT1JNQVQgIVxuIik7CiAJCQlscFBhcm1zLT5kd1JldHVybiA9IE1DSV9GT1JNQVRfTUlMTElTRUNPTkRTOwogCQkJYnJlYWs7CiAJCWNhc2UgTUNJX1dBVkVfSU5QVVQ6Ci0JCQlkcHJpbnRmX21jaXdhdmUoc3RkZGViLCJXQVZFX21jaVN0YXR1cyAvLyBNQ0lfV0FWRV9JTlBVVCAhXG4iKTsKKwkJCWRwcmludGZfaW5mbyhtY2l3YXZlLCJXQVZFX21jaVN0YXR1cyAvLyBNQ0lfV0FWRV9JTlBVVCAhXG4iKTsKIAkJCWxwUGFybXMtPmR3UmV0dXJuID0gMDsKIAkJCWJyZWFrOwogCQljYXNlIE1DSV9XQVZFX09VVFBVVDoKLQkJCWRwcmludGZfbWNpd2F2ZShzdGRkZWIsIldBVkVfbWNpU3RhdHVzIC8vIE1DSV9XQVZFX09VVFBVVCAhXG4iKTsKKwkJCWRwcmludGZfaW5mbyhtY2l3YXZlLCJXQVZFX21jaVN0YXR1cyAvLyBNQ0lfV0FWRV9PVVRQVVQgIVxuIik7CiAJCQlscFBhcm1zLT5kd1JldHVybiA9IDA7CiAJCQlicmVhazsKIAkJY2FzZSBNQ0lfV0FWRV9TVEFUVVNfQVZHQllURVNQRVJTRUM6Ci0JCQlkcHJpbnRmX21jaXdhdmUoc3RkZGViLCJXQVZFX21jaVN0YXR1cyAvLyBNQ0lfV0FWRV9TVEFUVVNfQVZHQllURVNQRVJTRUMgIVxuIik7CisJCQlkcHJpbnRmX2luZm8obWNpd2F2ZSwiV0FWRV9tY2lTdGF0dXMgLy8gTUNJX1dBVkVfU1RBVFVTX0FWR0JZVEVTUEVSU0VDICFcbiIpOwogCQkJbHBQYXJtcy0+ZHdSZXR1cm4gPSAyMjA1MDsKIAkJCWJyZWFrOwogCQljYXNlIE1DSV9XQVZFX1NUQVRVU19CSVRTUEVSU0FNUExFOgotCQkJZHByaW50Zl9tY2l3YXZlKHN0ZGRlYiwiV0FWRV9tY2lTdGF0dXMgLy8gTUNJX1dBVkVfU1RBVFVTX0JJVFNQRVJTQU1QTEUgIVxuIik7CisJCQlkcHJpbnRmX2luZm8obWNpd2F2ZSwiV0FWRV9tY2lTdGF0dXMgLy8gTUNJX1dBVkVfU1RBVFVTX0JJVFNQRVJTQU1QTEUgIVxuIik7CiAJCQlscFBhcm1zLT5kd1JldHVybiA9IDg7CiAJCQlicmVhazsKIAkJY2FzZSBNQ0lfV0FWRV9TVEFUVVNfQkxPQ0tBTElHTjoKLQkJCWRwcmludGZfbWNpd2F2ZShzdGRkZWIsIldBVkVfbWNpU3RhdHVzIC8vIE1DSV9XQVZFX1NUQVRVU19CTE9DS0FMSUdOICFcbiIpOworCQkJZHByaW50Zl9pbmZvKG1jaXdhdmUsIldBVkVfbWNpU3RhdHVzIC8vIE1DSV9XQVZFX1NUQVRVU19CTE9DS0FMSUdOICFcbiIpOwogCQkJbHBQYXJtcy0+ZHdSZXR1cm4gPSAxOwogCQkJYnJlYWs7CiAJCWNhc2UgTUNJX1dBVkVfU1RBVFVTX0NIQU5ORUxTOgotCQkJZHByaW50Zl9tY2l3YXZlKHN0ZGRlYiwiV0FWRV9tY2lTdGF0dXMgLy8gTUNJX1dBVkVfU1RBVFVTX0NIQU5ORUxTICFcbiIpOworCQkJZHByaW50Zl9pbmZvKG1jaXdhdmUsIldBVkVfbWNpU3RhdHVzIC8vIE1DSV9XQVZFX1NUQVRVU19DSEFOTkVMUyAhXG4iKTsKIAkJCWxwUGFybXMtPmR3UmV0dXJuID0gMTsKIAkJCWJyZWFrOwogCQljYXNlIE1DSV9XQVZFX1NUQVRVU19GT1JNQVRUQUc6Ci0JCQlkcHJpbnRmX21jaXdhdmUoc3RkZGViLCJXQVZFX21jaVN0YXR1cyAvLyBNQ0lfV0FWRV9GT1JNQVRUQUcgIVxuIik7CisJCQlkcHJpbnRmX2luZm8obWNpd2F2ZSwiV0FWRV9tY2lTdGF0dXMgLy8gTUNJX1dBVkVfRk9STUFUVEFHICFcbiIpOwogCQkJbHBQYXJtcy0+ZHdSZXR1cm4gPSBXQVZFX0ZPUk1BVF9QQ007CiAJCQlicmVhazsKIAkJY2FzZSBNQ0lfV0FWRV9TVEFUVVNfTEVWRUw6Ci0JCQlkcHJpbnRmX21jaXdhdmUoc3RkZGViLCJXQVZFX21jaVN0YXR1cyAvLyBNQ0lfV0FWRV9TVEFUVVNfTEVWRUwgIVxuIik7CisJCQlkcHJpbnRmX2luZm8obWNpd2F2ZSwiV0FWRV9tY2lTdGF0dXMgLy8gTUNJX1dBVkVfU1RBVFVTX0xFVkVMICFcbiIpOwogCQkJbHBQYXJtcy0+ZHdSZXR1cm4gPSAweEFBQUE1NTU1OwogCQkJYnJlYWs7CiAJCWNhc2UgTUNJX1dBVkVfU1RBVFVTX1NBTVBMRVNQRVJTRUM6Ci0JCQlkcHJpbnRmX21jaXdhdmUoc3RkZGViLCJXQVZFX21jaVN0YXR1cyAvLyBNQ0lfV0FWRV9TVEFUVVNfU0FNUExFU1BFUlNFQyAhXG4iKTsKKwkJCWRwcmludGZfaW5mbyhtY2l3YXZlLCJXQVZFX21jaVN0YXR1cyAvLyBNQ0lfV0FWRV9TVEFUVVNfU0FNUExFU1BFUlNFQyAhXG4iKTsKIAkJCWxwUGFybXMtPmR3UmV0dXJuID0gMjIwNTA7CiAJCQlicmVhazsKIAkJZGVmYXVsdDoKLQkJCWRwcmludGZfbWNpd2F2ZShzdGRkZWIsIldBVkVfbWNpU3RhdHVzIC8vIHVua25vd24gY29tbWFuZCAlMDhsWCAhXG4iLCBscFBhcm1zLT5kd0l0ZW0pOworCQkJZHByaW50Zl93YXJuKG1jaXdhdmUsIldBVkVfbWNpU3RhdHVzIC8vIHVua25vd24gY29tbWFuZCAlMDhsWCAhXG4iLCBscFBhcm1zLT5kd0l0ZW0pOwogCQkJcmV0dXJuIE1DSUVSUl9VTlJFQ09HTklaRURfQ09NTUFORDsKIAkJfQogCX0KIAlpZiAoZHdGbGFncyAmIE1DSV9OT1RJRlkpIHsKLQkJZHByaW50Zl9tY2l3YXZlKHN0ZGRlYiwiV0FWRV9tY2lTdGF0dXMgLy8gTUNJX05PVElGWV9TVUNDRVNTRlVMICUwOGxYICFcbiIsIGxwUGFybXMtPmR3Q2FsbGJhY2spOworCQlkcHJpbnRmX2luZm8obWNpd2F2ZSwiV0FWRV9tY2lTdGF0dXMgLy8gTUNJX05PVElGWV9TVUNDRVNTRlVMICUwOGxYICFcbiIsIGxwUGFybXMtPmR3Q2FsbGJhY2spOwogCQltY2lEcml2ZXJOb3RpZnkoKEhXTkQxNilMT1dPUkQobHBQYXJtcy0+ZHdDYWxsYmFjayksIAogCQkJTUNJV2F2RGV2W3dEZXZJRF0ud05vdGlmeURldmljZUlELCBNQ0lfTk9USUZZX1NVQ0NFU1NGVUwpOwogCX0KQEAgLTY4OCw3ICs2ODYsNyBAQAogc3RhdGljIERXT1JEIFdBVkVfbWNpR2V0RGV2Q2FwcyhVSU5UMTYgd0RldklELCBEV09SRCBkd0ZsYWdzLCAKIAkJCQkJTFBNQ0lfR0VUREVWQ0FQU19QQVJNUyBscFBhcm1zKQogewotCWRwcmludGZfbWNpd2F2ZShzdGRkZWIsCisJZHByaW50Zl9pbmZvKG1jaXdhdmUsCiAJCSJXQVZFX21jaUdldERldkNhcHMoJXUsICUwOGxYLCAlcCk7XG4iLCB3RGV2SUQsIGR3RmxhZ3MsIGxwUGFybXMpOwogCWlmIChscFBhcm1zID09IE5VTEwpIHJldHVybiBNQ0lFUlJfSU5URVJOQUw7CiAJaWYgKGR3RmxhZ3MgJiBNQ0lfR0VUREVWQ0FQU19JVEVNKSB7CkBAIC03MzgsNyArNzM2LDcgQEAKICAqLwogc3RhdGljIERXT1JEIFdBVkVfbWNpSW5mbyhVSU5UMTYgd0RldklELCBEV09SRCBkd0ZsYWdzLCBMUE1DSV9JTkZPX1BBUk1TMTYgbHBQYXJtcykKIHsKLQlkcHJpbnRmX21jaXdhdmUoc3RkZGViLAorCWRwcmludGZfaW5mbyhtY2l3YXZlLAogCQkiV0FWRV9tY2lJbmZvKCV1LCAlMDhsWCwgJXApO1xuIiwgd0RldklELCBkd0ZsYWdzLCBscFBhcm1zKTsKIAlpZiAobHBQYXJtcyA9PSBOVUxMKSByZXR1cm4gTUNJRVJSX0lOVEVSTkFMOwogCWxwUGFybXMtPmxwc3RyUmV0dXJuID0gTlVMTDsKQEAgLTc4MSw3ICs3NzksNyBAQAogCWludAlkc3Bfc3RlcmVvID0gMTsKIAlpbnQJYnl0ZXNwZXJzbXBsOwogCi0JZHByaW50Zl9tY2l3YXZlKHN0ZGRlYiwKKwlkcHJpbnRmX2luZm8obWNpd2F2ZSwKIAkJICAgIndvZEdldERldkNhcHMoJXUsICVwLCAlbHUpO1xuIiwgd0RldklELCBscENhcHMsIGR3U2l6ZSk7CiAJaWYgKGxwQ2FwcyA9PSBOVUxMKSByZXR1cm4gTU1TWVNFUlJfTk9URU5BQkxFRDsKIAlpZiAoYWNjZXNzKFNPVU5EX0RFViwwKSAhPSAwKSByZXR1cm4gTU1TWVNFUlJfTk9URU5BQkxFRDsKQEAgLTgzNiw3ICs4MzQsNyBAQAogCQl9CiAJfQogCWNsb3NlKGF1ZGlvKTsKLQlkcHJpbnRmX21jaXdhdmUoc3RkZGViLAorCWRwcmludGZfaW5mbyhtY2l3YXZlLAogCQkid29kR2V0RGV2Q2FwcyAvLyBkd0Zvcm1hdHMgPSAlMDhsWFxuIiwgbHBDYXBzLT5kd0Zvcm1hdHMpOwogCXJldHVybiBNTVNZU0VSUl9OT0VSUk9SOwogfQpAQCAtODUwLDQ0ICs4NDgsNDQgQEAKIAlpbnQgCSBhdWRpbyxhYnVmX3NpemUsc21wbHJhdGUsc2FtcGxlc2l6ZSxkc3Bfc3RlcmVvOwogCUxQV0FWRUZPUk1BVAlscEZvcm1hdDsKIAotCWRwcmludGZfbWNpd2F2ZShzdGRkZWIsCisJZHByaW50Zl9pbmZvKG1jaXdhdmUsCiAJCSJ3b2RPcGVuKCV1LCAlcCwgJTA4bFgpO1xuIiwgd0RldklELCBscERlc2MsIGR3RmxhZ3MpOwogCWlmIChscERlc2MgPT0gTlVMTCkgewotCQlkcHJpbnRmX21jaXdhdmUoc3RkZGViLCJMaW51eCAnd29kT3BlbicgLy8gSW52YWxpZCBQYXJhbWV0ZXIgIVxuIik7CisJCWRwcmludGZfd2FybihtY2l3YXZlLCAiTGludXggJ3dvZE9wZW4nIC8vIEludmFsaWQgUGFyYW1ldGVyICFcbiIpOwogCQlyZXR1cm4gTU1TWVNFUlJfSU5WQUxQQVJBTTsKIAl9CiAJaWYgKHdEZXZJRCA+PSBNQVhfV0FWT1VURFJWKSB7Ci0JCWRwcmludGZfbWNpd2F2ZShzdGRkZWIsIkxpbnV4ICd3b2RPcGVuJyAvLyBNQVhfV0FWT1VURFJWIHJlYWNoZWQgIVxuIik7CisJCWRwcmludGZfaW5mbyhtY2l3YXZlLCJMaW51eCAnd29kT3BlbicgLy8gTUFYX1dBVk9VVERSViByZWFjaGVkICFcbiIpOwogCQlyZXR1cm4gTU1TWVNFUlJfQUxMT0NBVEVEOwogCX0KIAlXT3V0RGV2W3dEZXZJRF0udW5peGRldiA9IDA7CiAJaWYgKGFjY2VzcyhTT1VORF9ERVYsMCkgIT0gMCkgcmV0dXJuIE1NU1lTRVJSX05PVEVOQUJMRUQ7CiAJYXVkaW8gPSBvcGVuIChTT1VORF9ERVYsIE9fV1JPTkxZLCAwKTsKIAlpZiAoYXVkaW8gPT0gLTEpIHsKLQkJZHByaW50Zl9tY2l3YXZlKHN0ZGRlYiwiTGludXggJ3dvZE9wZW4nIC8vIGNhbid0IG9wZW4gIVxuIik7CisJCWRwcmludGZfd2FybihtY2l3YXZlLCAiTGludXggJ3dvZE9wZW4nIC8vIGNhbid0IG9wZW4gIVxuIik7CiAJCXJldHVybiBNTVNZU0VSUl9BTExPQ0FURUQgOwogCX0KIAlJT0NUTChhdWRpbywgU05EQ1RMX0RTUF9HRVRCTEtTSVpFLCBhYnVmX3NpemUpOwogCWlmIChhYnVmX3NpemUgPCAxMDI0IHx8IGFidWZfc2l6ZSA+IDY1NTM2KSB7CiAJCWlmIChhYnVmX3NpemUgPT0gLTEpCi0JCQlkcHJpbnRmX21jaXdhdmUoc3RkZGViLCJMaW51eCAnd29kT3BlbicgLy8gSU9DVEwgY2FuJ3QgJ1NORENUTF9EU1BfR0VUQkxLU0laRScgIVxuIik7CisJCQlkcHJpbnRmX3dhcm4obWNpd2F2ZSwgIkxpbnV4ICd3b2RPcGVuJyAvLyBJT0NUTCBjYW4ndCAnU05EQ1RMX0RTUF9HRVRCTEtTSVpFJyAhXG4iKTsKIAkJZWxzZQotCQkJZHByaW50Zl9tY2l3YXZlKHN0ZGRlYiwiTGludXggJ3dvZE9wZW4nIC8vIFNORENUTF9EU1BfR0VUQkxLU0laRSBJbnZhbGlkIGJ1ZnNpemUgIVxuIik7CisJCQlkcHJpbnRmX3dhcm4obWNpd2F2ZSwgIkxpbnV4ICd3b2RPcGVuJyAvLyBTTkRDVExfRFNQX0dFVEJMS1NJWkUgSW52YWxpZCBidWZzaXplICFcbiIpOwogCQlyZXR1cm4gTU1TWVNFUlJfTk9URU5BQkxFRDsKIAl9CiAJV091dERldlt3RGV2SURdLndGbGFncyA9IEhJV09SRChkd0ZsYWdzICYgQ0FMTEJBQ0tfVFlQRU1BU0spOwogCXN3aXRjaChXT3V0RGV2W3dEZXZJRF0ud0ZsYWdzKSB7CiAJY2FzZSBEQ0JfTlVMTDoKLQkJZHByaW50Zl9tY2l3YXZlKHN0ZGRlYiwJIkxpbnV4ICd3b2RPcGVuJyAvLyBDQUxMQkFDS19OVUxMICFcbiIpOworCQlkcHJpbnRmX2luZm8obWNpd2F2ZSwJIkxpbnV4ICd3b2RPcGVuJyAvLyBDQUxMQkFDS19OVUxMICFcbiIpOwogCQlicmVhazsKIAljYXNlIERDQl9XSU5ET1c6Ci0JCWRwcmludGZfbWNpd2F2ZShzdGRkZWIsCSJMaW51eCAnd29kT3BlbicgLy8gQ0FMTEJBQ0tfV0lORE9XICFcbiIpOworCQlkcHJpbnRmX2luZm8obWNpd2F2ZSwJIkxpbnV4ICd3b2RPcGVuJyAvLyBDQUxMQkFDS19XSU5ET1cgIVxuIik7CiAJCWJyZWFrOwogCWNhc2UgRENCX1RBU0s6Ci0JCWRwcmludGZfbWNpd2F2ZShzdGRkZWIsCSJMaW51eCAnd29kT3BlbicgLy8gQ0FMTEJBQ0tfVEFTSyAhXG4iKTsKKwkJZHByaW50Zl9pbmZvKG1jaXdhdmUsCSJMaW51eCAnd29kT3BlbicgLy8gQ0FMTEJBQ0tfVEFTSyAhXG4iKTsKIAkJYnJlYWs7CiAJY2FzZSBEQ0JfRlVOQ1RJT046Ci0JCWRwcmludGZfbWNpd2F2ZShzdGRkZWIsCSJMaW51eCAnd29kT3BlbicgLy8gQ0FMTEJBQ0tfRlVOQ1RJT04gIVxuIik7CisJCWRwcmludGZfaW5mbyhtY2l3YXZlLAkiTGludXggJ3dvZE9wZW4nIC8vIENBTExCQUNLX0ZVTkNUSU9OICFcbiIpOwogCQlicmVhazsKIAl9CiAJV091dERldlt3RGV2SURdLmxwUXVldWVIZHIgPSBOVUxMOwpAQCAtODk2LDIyICs4OTQsMjIgQEAKIAlXT3V0RGV2W3dEZXZJRF0uYnVmc2l6ZSA9IGFidWZfc2l6ZTsKIAkvKiBGSVhNRTogY29weSBscEZvcm1hdCB0b28/ICovCiAJbWVtY3B5KCZXT3V0RGV2W3dEZXZJRF0ud2F2ZURlc2MsIGxwRGVzYywgc2l6ZW9mKFdBVkVPUEVOREVTQykpOwotCWRwcmludGZfbWNpd2F2ZShzdGRkZWIsIkxpbnV4ICd3b2RPcGVuJyAvLyBscERlc2MtPmxwRm9ybWF0ID0gJXBcbiIsbHBEZXNjLT5scEZvcm1hdCk7CisJZHByaW50Zl9pbmZvKG1jaXdhdmUsIkxpbnV4ICd3b2RPcGVuJyAvLyBscERlc2MtPmxwRm9ybWF0ID0gJXBcbiIsbHBEZXNjLT5scEZvcm1hdCk7CiAgICAgICAgIGxwRm9ybWF0ID0gbHBEZXNjLT5scEZvcm1hdDsgCi0JZHByaW50Zl9tY2l3YXZlKHN0ZGRlYiwiTGludXggJ3dvZE9wZW4nIC8vIGxwRm9ybWF0ID0gJXBcbiIsbHBGb3JtYXQpOworCWRwcmludGZfaW5mbyhtY2l3YXZlLCJMaW51eCAnd29kT3BlbicgLy8gbHBGb3JtYXQgPSAlcFxuIixscEZvcm1hdCk7CiAJaWYgKGxwRm9ybWF0LT53Rm9ybWF0VGFnICE9IFdBVkVfRk9STUFUX1BDTSkgewotCQlkcHJpbnRmX21jaXdhdmUoc3RkZGViLCJMaW51eCAnd29kT3BlbicgLy8gQmFkIGZvcm1hdCAlMDRYICFcbiIsCisJCWRwcmludGZfd2FybihtY2l3YXZlLCJMaW51eCAnd29kT3BlbicgLy8gQmFkIGZvcm1hdCAlMDRYICFcbiIsCiAJCQkJbHBGb3JtYXQtPndGb3JtYXRUYWcpOwotCQlkcHJpbnRmX21jaXdhdmUoc3RkZGViLCJMaW51eCAnd29kT3BlbicgLy8gQmFkIG5DaGFubmVscyAlZCAhXG4iLAorCQlkcHJpbnRmX3dhcm4obWNpd2F2ZSwiTGludXggJ3dvZE9wZW4nIC8vIEJhZCBuQ2hhbm5lbHMgJWQgIVxuIiwKIAkJCQlscEZvcm1hdC0+bkNoYW5uZWxzKTsKLQkJZHByaW50Zl9tY2l3YXZlKHN0ZGRlYiwiTGludXggJ3dvZE9wZW4nIC8vIEJhZCBuU2FtcGxlc1BlclNlYyAlbGQgIVxuIiwKKwkJZHByaW50Zl93YXJuKG1jaXdhdmUsIkxpbnV4ICd3b2RPcGVuJyAvLyBCYWQgblNhbXBsZXNQZXJTZWMgJWxkICFcbiIsCiAJCQkJbHBGb3JtYXQtPm5TYW1wbGVzUGVyU2VjKTsKIAkJcmV0dXJuIFdBVkVSUl9CQURGT1JNQVQ7CiAJfQogCW1lbWNweSgmV091dERldlt3RGV2SURdLkZvcm1hdCwgbHBGb3JtYXQsIHNpemVvZihQQ01XQVZFRk9STUFUKSk7CiAJaWYgKFdPdXREZXZbd0RldklEXS5Gb3JtYXQud2YubkNoYW5uZWxzID09IDApIHJldHVybiBXQVZFUlJfQkFERk9STUFUOwogCWlmIChXT3V0RGV2W3dEZXZJRF0uRm9ybWF0LndmLm5TYW1wbGVzUGVyU2VjID09IDApIHJldHVybiBXQVZFUlJfQkFERk9STUFUOwotCWRwcmludGZfbWNpd2F2ZShzdGRkZWIsIkxpbnV4ICd3b2RPcGVuJyAvLyB3Qml0c1BlclNhbXBsZT0ldSAhXG4iLAorCWRwcmludGZfaW5mbyhtY2l3YXZlLCJMaW51eCAnd29kT3BlbicgLy8gd0JpdHNQZXJTYW1wbGU9JXUgIVxuIiwKIAkJCQlXT3V0RGV2W3dEZXZJRF0uRm9ybWF0LndCaXRzUGVyU2FtcGxlKTsKIAlpZiAoV091dERldlt3RGV2SURdLkZvcm1hdC53Qml0c1BlclNhbXBsZSA9PSAwKSB7CiAJCVdPdXREZXZbd0RldklEXS5Gb3JtYXQud0JpdHNQZXJTYW1wbGUgPSA4ICoKQEAgLTkyNSwxNiArOTIzLDE2IEBACiAJSU9DVEwoYXVkaW8sIFNORENUTF9EU1BfU1BFRUQsIHNtcGxyYXRlKTsKIAlJT0NUTChhdWRpbywgU05EQ1RMX0RTUF9TQU1QTEVTSVpFLCBzYW1wbGVzaXplKTsKIAlJT0NUTChhdWRpbywgU05EQ1RMX0RTUF9TVEVSRU8sIGRzcF9zdGVyZW8pOwotCWRwcmludGZfbWNpd2F2ZShzdGRkZWIsIkxpbnV4ICd3b2RPcGVuJyAvLyB3Qml0c1BlclNhbXBsZT0ldSAhXG4iLAorCWRwcmludGZfaW5mbyhtY2l3YXZlLCJMaW51eCAnd29kT3BlbicgLy8gd0JpdHNQZXJTYW1wbGU9JXUgIVxuIiwKIAkJCQlXT3V0RGV2W3dEZXZJRF0uRm9ybWF0LndCaXRzUGVyU2FtcGxlKTsKLQlkcHJpbnRmX21jaXdhdmUoc3RkZGViLCJMaW51eCAnd29kT3BlbicgLy8gbkF2Z0J5dGVzUGVyU2VjPSVsdSAhXG4iLAorCWRwcmludGZfaW5mbyhtY2l3YXZlLCJMaW51eCAnd29kT3BlbicgLy8gbkF2Z0J5dGVzUGVyU2VjPSVsdSAhXG4iLAogCQkJCVdPdXREZXZbd0RldklEXS5Gb3JtYXQud2YubkF2Z0J5dGVzUGVyU2VjKTsKLQlkcHJpbnRmX21jaXdhdmUoc3RkZGViLCJMaW51eCAnd29kT3BlbicgLy8gblNhbXBsZXNQZXJTZWM9JWx1ICFcbiIsCisJZHByaW50Zl9pbmZvKG1jaXdhdmUsIkxpbnV4ICd3b2RPcGVuJyAvLyBuU2FtcGxlc1BlclNlYz0lbHUgIVxuIiwKIAkJCQlXT3V0RGV2W3dEZXZJRF0uRm9ybWF0LndmLm5TYW1wbGVzUGVyU2VjKTsKLQlkcHJpbnRmX21jaXdhdmUoc3RkZGViLCJMaW51eCAnd29kT3BlbicgLy8gbkNoYW5uZWxzPSV1ICFcbiIsCisJZHByaW50Zl9pbmZvKG1jaXdhdmUsIkxpbnV4ICd3b2RPcGVuJyAvLyBuQ2hhbm5lbHM9JXUgIVxuIiwKIAkJCQlXT3V0RGV2W3dEZXZJRF0uRm9ybWF0LndmLm5DaGFubmVscyk7CiAJaWYgKFdBVkVfTm90aWZ5Q2xpZW50KHdEZXZJRCwgV09NX09QRU4sIDBMLCAwTCkgIT0gTU1TWVNFUlJfTk9FUlJPUikgewotCQlkcHJpbnRmX21jaXdhdmUoc3RkZGViLCJMaW51eCAnd29kT3BlbicgLy8gY2FuJ3Qgbm90aWZ5IGNsaWVudCAhXG4iKTsKKwkJZHByaW50Zl93YXJuKG1jaXdhdmUsICJMaW51eCAnd29kT3BlbicgLy8gY2FuJ3Qgbm90aWZ5IGNsaWVudCAhXG4iKTsKIAkJcmV0dXJuIE1NU1lTRVJSX0lOVkFMUEFSQU07CiAJfQogCXJldHVybiBNTVNZU0VSUl9OT0VSUk9SOwpAQCAtOTQ1LDE0ICs5NDMsMTQgQEAKICAqLwogc3RhdGljIERXT1JEIHdvZENsb3NlKFdPUkQgd0RldklEKQogewotCWRwcmludGZfbWNpd2F2ZShzdGRkZWIsIndvZENsb3NlKCV1KTtcbiIsIHdEZXZJRCk7CisJZHByaW50Zl9pbmZvKG1jaXdhdmUsIndvZENsb3NlKCV1KTtcbiIsIHdEZXZJRCk7CiAJaWYgKHdEZXZJRCA+IE1BWF9XQVZPVVREUlYpIHJldHVybiBNTVNZU0VSUl9JTlZBTFBBUkFNOwogCWlmIChXT3V0RGV2W3dEZXZJRF0udW5peGRldiA9PSAwKSB7Ci0JCWRwcmludGZfbWNpd2F2ZShzdGRkZWIsIkxpbnV4ICd3b2RDbG9zZScgLy8gY2FuJ3QgY2xvc2UgIVxuIik7CisJCWRwcmludGZfd2FybihtY2l3YXZlLCAiTGludXggJ3dvZENsb3NlJyAvLyBjYW4ndCBjbG9zZSAhXG4iKTsKIAkJcmV0dXJuIE1NU1lTRVJSX05PVEVOQUJMRUQ7CiAJfQogCWlmIChXT3V0RGV2W3dEZXZJRF0ubHBRdWV1ZUhkciAhPSBOVUxMKSB7Ci0JICAgICAgICBkcHJpbnRmX21jaXdhdmUoc3RkZGViLCJsaW51eCAnd29kY2xvc2UnIC8vIHN0aWxsIGJ1ZmZlcnMgb3BlbiAhXG4iKTsKKwkgICAgICAgIGRwcmludGZfd2FybihtY2l3YXZlLCAibGludXggJ3dvZGNsb3NlJyAvLyBzdGlsbCBidWZmZXJzIG9wZW4gIVxuIik7CiAJCS8qIERvbid0IGNhcmUuIFdobyBuZWVkcyB0aG9zZSBidWZmZXJzIGFueXdheSAqLwogCQkvKnJldHVybiBXQVZFUlJfU1RJTExQTEFZSU5HOyAqLwogCX0KQEAgLTk2MSw3ICs5NTksNyBAQAogCVdPdXREZXZbd0RldklEXS5idWZzaXplID0gMDsKIAlXT3V0RGV2W3dEZXZJRF0ubHBRdWV1ZUhkciA9IE5VTEw7CiAJaWYgKFdBVkVfTm90aWZ5Q2xpZW50KHdEZXZJRCwgV09NX0NMT1NFLCAwTCwgMEwpICE9IE1NU1lTRVJSX05PRVJST1IpIHsKLQkJZHByaW50Zl9tY2l3YXZlKHN0ZGRlYiwiTGludXggJ3dvZENsb3NlJyAvLyBjYW4ndCBub3RpZnkgY2xpZW50ICFcbiIpOworCQlkcHJpbnRmX3dhcm4obWNpd2F2ZSwgIkxpbnV4ICd3b2RDbG9zZScgLy8gY2FuJ3Qgbm90aWZ5IGNsaWVudCAhXG4iKTsKIAkJcmV0dXJuIE1NU1lTRVJSX0lOVkFMUEFSQU07CiAJfQogCXJldHVybiBNTVNZU0VSUl9OT0VSUk9SOwpAQCAtOTc4LDkgKzk3Niw5IEBACiAJTFBTVFIJICAgICAgICBscERhdGE7CiAJTFBXQVZFSERSCXh3YXZlaGRyOwogCi0JZHByaW50Zl9tY2l3YXZlKHN0ZGRlYiwid29kV3JpdGUoJXUsICVwLCAlMDhsWCk7XG4iLCB3RGV2SUQsIGxwV2F2ZUhkciwgZHdTaXplKTsKKwlkcHJpbnRmX2luZm8obWNpd2F2ZSwid29kV3JpdGUoJXUsICVwLCAlMDhsWCk7XG4iLCB3RGV2SUQsIGxwV2F2ZUhkciwgZHdTaXplKTsKIAlpZiAoV091dERldlt3RGV2SURdLnVuaXhkZXYgPT0gMCkgewotICAgICAgICBkcHJpbnRmX21jaXdhdmUoc3RkZGViLCJMaW51eCAnd29kV3JpdGUnIC8vIGNhbid0IHBsYXkgIVxuIik7CisgICAgICAgIGRwcmludGZfd2FybihtY2l3YXZlLCAiTGludXggJ3dvZFdyaXRlJyAvLyBjYW4ndCBwbGF5ICFcbiIpOwogCQlyZXR1cm4gTU1TWVNFUlJfTk9URU5BQkxFRDsKIAl9CiAJaWYgKGxwV2F2ZUhkci0+bHBEYXRhID09IE5VTEwpIHJldHVybiBXQVZFUlJfVU5QUkVQQVJFRDsKQEAgLTk4OCwxNSArOTg2LDE1IEBACiAJaWYgKGxwV2F2ZUhkci0+ZHdGbGFncyAmIFdIRFJfSU5RVUVVRSkgcmV0dXJuIFdBVkVSUl9TVElMTFBMQVlJTkc7CiAJbHBXYXZlSGRyLT5kd0ZsYWdzICY9IH5XSERSX0RPTkU7CiAJbHBXYXZlSGRyLT5kd0ZsYWdzIHw9IFdIRFJfSU5RVUVVRTsKLQlkcHJpbnRmX21jaXdhdmUoc3RkZGViLAorCWRwcmludGZfaW5mbyhtY2l3YXZlLAogCQkid29kV3JpdGUoKSAvLyBkd0J1ZmZlckxlbmd0aCAlbHUgIVxuIiwgbHBXYXZlSGRyLT5kd0J1ZmZlckxlbmd0aCk7Ci0JZHByaW50Zl9tY2l3YXZlKHN0ZGRlYiwKKwlkcHJpbnRmX2luZm8obWNpd2F2ZSwKIAkJIndvZFdyaXRlKCkgLy8gV091dERldlsldV0udW5peGRldiAldSAhXG4iLCB3RGV2SUQsIFdPdXREZXZbd0RldklEXS51bml4ZGV2KTsKIAlscERhdGEgPSBscFdhdmVIZHItPmxwRGF0YTsKIAljb3VudCA9IHdyaXRlIChXT3V0RGV2W3dEZXZJRF0udW5peGRldiwgbHBEYXRhLCBscFdhdmVIZHItPmR3QnVmZmVyTGVuZ3RoKTsKLQlkcHJpbnRmX21jaXdhdmUoc3RkZGViLCJ3b2RXcml0ZSgpLy93cml0ZSByZXR1cm5lZCBjb3VudCAldSAhXG4iLGNvdW50KTsKKwlkcHJpbnRmX2luZm8obWNpd2F2ZSwid29kV3JpdGUoKS8vd3JpdGUgcmV0dXJuZWQgY291bnQgJXUgIVxuIixjb3VudCk7CiAJaWYgKGNvdW50ICE9IGxwV2F2ZUhkci0+ZHdCdWZmZXJMZW5ndGgpIHsKLQkJZHByaW50Zl9tY2l3YXZlKHN0ZGRlYiwiTGludXggJ3dvZFdyaXRlJyAvLyBlcnJvciB3cml0dGluZyAhXG4iKTsKKwkJZHByaW50Zl93YXJuKG1jaXdhdmUsICJMaW51eCAnd29kV3JpdGUnIC8vIGVycm9yIHdyaXR0aW5nICFcbiIpOwogCQlyZXR1cm4gTU1TWVNFUlJfTk9URU5BQkxFRDsKIAl9CiAJV091dERldlt3RGV2SURdLmR3VG90YWxQbGF5ZWQgKz0gY291bnQ7CkBAIC0xMDA4LDE0ICsxMDA2LDE0IEBACiAJCW1lbWNweSh4d2F2ZWhkcixscFdhdmVIZHIsc2l6ZW9mKFdBVkVIRFIpKTsKIAkJeHdhdmVoZHItPmxwRGF0YSA9IChMUEJZVEUpeHdhdmVoZHItPnJlc2VydmVkOwogCQlpZiAoV0FWRV9Ob3RpZnlDbGllbnQod0RldklELCBXT01fRE9ORSwgKERXT1JEKVNFR1BUUl9HRVQoeHdhdmVoZHIpLCBjb3VudCkgIT0gTU1TWVNFUlJfTk9FUlJPUikgewotCQkJZHByaW50Zl9tY2l3YXZlKHN0ZGRlYiwiTGludXggJ3dvZFdyaXRlJyAvLyBjYW4ndCBub3RpZnkgY2xpZW50ICFcbiIpOworCQkJZHByaW50Zl93YXJuKG1jaXdhdmUsICJMaW51eCAnd29kV3JpdGUnIC8vIGNhbid0IG5vdGlmeSBjbGllbnQgIVxuIik7CiAJCQlTRUdQVFJfRlJFRSh4d2F2ZWhkcik7CiAJCQlyZXR1cm4gTU1TWVNFUlJfSU5WQUxQQVJBTTsKIAkJfQogCQlTRUdQVFJfRlJFRSh4d2F2ZWhkcik7CiAJfSBlbHNlIHsKIAkJaWYgKFdBVkVfTm90aWZ5Q2xpZW50KHdEZXZJRCwgV09NX0RPTkUsIChEV09SRClscFdhdmVIZHIsIGNvdW50KSAhPSBNTVNZU0VSUl9OT0VSUk9SKSB7Ci0JCQlkcHJpbnRmX21jaXdhdmUoc3RkZGViLCJMaW51eCAnd29kV3JpdGUnIC8vIGNhbid0IG5vdGlmeSBjbGllbnQgIVxuIik7CisJCQlkcHJpbnRmX3dhcm4obWNpd2F2ZSwgIkxpbnV4ICd3b2RXcml0ZScgLy8gY2FuJ3Qgbm90aWZ5IGNsaWVudCAhXG4iKTsKIAkJCXJldHVybiBNTVNZU0VSUl9JTlZBTFBBUkFNOwogCQl9CiAJfQpAQCAtMTAyNywxMCArMTAyNSwxMCBAQAogICovCiBzdGF0aWMgRFdPUkQgd29kUHJlcGFyZShXT1JEIHdEZXZJRCwgTFBXQVZFSERSIGxwV2F2ZUhkciwgRFdPUkQgZHdTaXplKQogewotCWRwcmludGZfbWNpd2F2ZShzdGRkZWIsCisJZHByaW50Zl9pbmZvKG1jaXdhdmUsCiAJCSJ3b2RQcmVwYXJlKCV1LCAlcCwgJTA4bFgpO1xuIiwgd0RldklELCBscFdhdmVIZHIsIGR3U2l6ZSk7CiAJaWYgKFdPdXREZXZbd0RldklEXS51bml4ZGV2ID09IDApIHsKLQkJZHByaW50Zl9tY2l3YXZlKHN0ZGRlYiwiTGludXggJ3dvZFByZXBhcmUnIC8vIGNhbid0IHByZXBhcmUgIVxuIik7CisJCWRwcmludGZfd2FybihtY2l3YXZlLCAiTGludXggJ3dvZFByZXBhcmUnIC8vIGNhbid0IHByZXBhcmUgIVxuIik7CiAJCXJldHVybiBNTVNZU0VSUl9OT1RFTkFCTEVEOwogCX0KIAkvKiBkb24ndCBhcHBlbmQgdG8gcXVldWUsIHdvZFdyaXRlIGRvZXMgdGhhdCAqLwpAQCAtMTA0NywxMCArMTA0NSwxMCBAQAogICovCiBzdGF0aWMgRFdPUkQgd29kVW5wcmVwYXJlKFdPUkQgd0RldklELCBMUFdBVkVIRFIgbHBXYXZlSGRyLCBEV09SRCBkd1NpemUpCiB7Ci0JZHByaW50Zl9tY2l3YXZlKHN0ZGRlYiwKKwlkcHJpbnRmX2luZm8obWNpd2F2ZSwKIAkJIndvZFVucHJlcGFyZSgldSwgJXAsICUwOGxYKTtcbiIsIHdEZXZJRCwgbHBXYXZlSGRyLCBkd1NpemUpOwogCWlmIChXT3V0RGV2W3dEZXZJRF0udW5peGRldiA9PSAwKSB7Ci0JCWRwcmludGZfbWNpd2F2ZShzdGRkZWIsIkxpbnV4ICd3b2RVbnByZXBhcmUnIC8vIGNhbid0IHVucHJlcGFyZSAhXG4iKTsKKwkJZHByaW50Zl93YXJuKG1jaXdhdmUsICJMaW51eCAnd29kVW5wcmVwYXJlJyAvLyBjYW4ndCB1bnByZXBhcmUgIVxuIik7CiAJCXJldHVybiBNTVNZU0VSUl9OT1RFTkFCTEVEOwogCX0KIAlpZiAobHBXYXZlSGRyLT5kd0ZsYWdzICYgV0hEUl9JTlFVRVVFKQpAQCAtMTA1OCw3ICsxMDU2LDcgQEAKIAkKIAlscFdhdmVIZHItPmR3RmxhZ3MgJj0gfldIRFJfUFJFUEFSRUQ7CiAJbHBXYXZlSGRyLT5kd0ZsYWdzIHw9IFdIRFJfRE9ORTsKLQlkcHJpbnRmX21jaXdhdmUoc3RkZGViLAorCWRwcmludGZfaW5mbyhtY2l3YXZlLAogCQkiTGludXggJ3dvZFVucHJlcGFyZScgLy8gYWxsIGhlYWRlcnMgdW5wcmVwYXJlZCAhXG4iKTsKIAlyZXR1cm4gTU1TWVNFUlJfTk9FUlJPUjsKIH0KQEAgLTEwNjgsMTQgKzEwNjYsMTQgQEAKICAqLwogc3RhdGljIERXT1JEIHdvZFJlc3RhcnQoV09SRCB3RGV2SUQpCiB7Ci0JZHByaW50Zl9tY2l3YXZlKHN0ZGRlYiwid29kUmVzdGFydCgldSk7XG4iLCB3RGV2SUQpOworCWRwcmludGZfaW5mbyhtY2l3YXZlLCJ3b2RSZXN0YXJ0KCV1KTtcbiIsIHdEZXZJRCk7CiAJaWYgKFdPdXREZXZbd0RldklEXS51bml4ZGV2ID09IDApIHsKLQkJZHByaW50Zl9tY2l3YXZlKHN0ZGRlYiwiTGludXggJ3dvZFJlc3RhcnQnIC8vIGNhbid0IHJlc3RhcnQgIVxuIik7CisJCWRwcmludGZfd2FybihtY2l3YXZlLCAiTGludXggJ3dvZFJlc3RhcnQnIC8vIGNhbid0IHJlc3RhcnQgIVxuIik7CiAJCXJldHVybiBNTVNZU0VSUl9OT1RFTkFCTEVEOwogCX0KIAkvKiBGSVhNRTogaXMgTm90aWZ5Q2xpZW50IHdpdGggV09NX0RPTkUgcmlnaHQgPyAoQ29tZXQgQnVzdGVycyAxLjMuMyBuZWVkcyB0aGlzIG5vdGlmaWNhdGlvbikgKi8KICAgICAgICAJaWYgKFdBVkVfTm90aWZ5Q2xpZW50KHdEZXZJRCwgV09NX0RPTkUsIDBMLCAwTCkgIT0gTU1TWVNFUlJfTk9FUlJPUikgewotICAgICAgICAgICAgICAgCWRwcmludGZfbWNpd2F2ZShzdGRkZWIsIkxpbnV4ICd3b2RSZXN0YXJ0JyAvLyBjYW4ndCBub3RpZnkgY2xpZW50ICFcbiIpOworICAgICAgICAgICAgICAgCWRwcmludGZfd2FybihtY2l3YXZlLCAiTGludXggJ3dvZFJlc3RhcnQnIC8vIGNhbid0IG5vdGlmeSBjbGllbnQgIVxuIik7CiAgICAgICAgICAgICAgICAJcmV0dXJuIE1NU1lTRVJSX0lOVkFMUEFSQU07CiAgICAgICAgIH0KIApAQCAtMTA4Nyw5ICsxMDg1LDkgQEAKICAqLwogc3RhdGljIERXT1JEIHdvZFJlc2V0KFdPUkQgd0RldklEKQogewotCWRwcmludGZfbWNpd2F2ZShzdGRkZWIsIndvZFJlc2V0KCV1KTtcbiIsIHdEZXZJRCk7CisJZHByaW50Zl9pbmZvKG1jaXdhdmUsIndvZFJlc2V0KCV1KTtcbiIsIHdEZXZJRCk7CiAJaWYgKFdPdXREZXZbd0RldklEXS51bml4ZGV2ID09IDApIHsKLQkJZHByaW50Zl9tY2l3YXZlKHN0ZGRlYiwiTGludXggJ3dvZFJlc2V0JyAvLyBjYW4ndCByZXNldCAhXG4iKTsKKwkJZHByaW50Zl93YXJuKG1jaXdhdmUsICJMaW51eCAnd29kUmVzZXQnIC8vIGNhbid0IHJlc2V0ICFcbiIpOwogCQlyZXR1cm4gTU1TWVNFUlJfTk9URU5BQkxFRDsKIAkJfQogCXJldHVybiBNTVNZU0VSUl9OT0VSUk9SOwpAQCAtMTEwMiwzNSArMTEwMCwzNSBAQAogc3RhdGljIERXT1JEIHdvZEdldFBvc2l0aW9uKFdPUkQgd0RldklELCBMUE1NVElNRTE2IGxwVGltZSwgRFdPUkQgdVNpemUpCiB7CiAJaW50CQl0aW1lOwotCWRwcmludGZfbWNpd2F2ZShzdGRkZWIsIndvZEdldFBvc2l0aW9uKCV1LCAlcCwgJWx1KTtcbiIsIHdEZXZJRCwgbHBUaW1lLCB1U2l6ZSk7CisJZHByaW50Zl9pbmZvKG1jaXdhdmUsIndvZEdldFBvc2l0aW9uKCV1LCAlcCwgJWx1KTtcbiIsIHdEZXZJRCwgbHBUaW1lLCB1U2l6ZSk7CiAJaWYgKFdPdXREZXZbd0RldklEXS51bml4ZGV2ID09IDApIHsKLQkJZHByaW50Zl9tY2l3YXZlKHN0ZGRlYiwiTGludXggJ3dvZEdldFBvc2l0aW9uJyAvLyBjYW4ndCBnZXQgcG9zICFcbiIpOworCQlkcHJpbnRmX3dhcm4obWNpd2F2ZSwgIkxpbnV4ICd3b2RHZXRQb3NpdGlvbicgLy8gY2FuJ3QgZ2V0IHBvcyAhXG4iKTsKIAkJcmV0dXJuIE1NU1lTRVJSX05PVEVOQUJMRUQ7CiAJfQogCWlmIChscFRpbWUgPT0gTlVMTCkJcmV0dXJuIE1NU1lTRVJSX0lOVkFMUEFSQU07Ci0JZHByaW50Zl9tY2l3YXZlKHN0ZGRlYiwid29kR2V0UG9zaXRpb24gLy8gd1R5cGU9JTA0WCAhXG4iLCAKKwlkcHJpbnRmX2luZm8obWNpd2F2ZSwid29kR2V0UG9zaXRpb24gLy8gd1R5cGU9JTA0WCAhXG4iLCAKIAkJCWxwVGltZS0+d1R5cGUpOwotCWRwcmludGZfbWNpd2F2ZShzdGRkZWIsIndvZEdldFBvc2l0aW9uIC8vIHdCaXRzUGVyU2FtcGxlPSV1XG4iLAorCWRwcmludGZfaW5mbyhtY2l3YXZlLCJ3b2RHZXRQb3NpdGlvbiAvLyB3Qml0c1BlclNhbXBsZT0ldVxuIiwKIAkJCVdPdXREZXZbd0RldklEXS5Gb3JtYXQud0JpdHNQZXJTYW1wbGUpOyAKLQlkcHJpbnRmX21jaXdhdmUoc3RkZGViLCJ3b2RHZXRQb3NpdGlvbiAvLyBuU2FtcGxlc1BlclNlYz0lbHVcbiIsCisJZHByaW50Zl9pbmZvKG1jaXdhdmUsIndvZEdldFBvc2l0aW9uIC8vIG5TYW1wbGVzUGVyU2VjPSVsdVxuIiwKIAkJCVdPdXREZXZbd0RldklEXS5Gb3JtYXQud2YublNhbXBsZXNQZXJTZWMpOyAKLQlkcHJpbnRmX21jaXdhdmUoc3RkZGViLCJ3b2RHZXRQb3NpdGlvbiAvLyBuQ2hhbm5lbHM9JXVcbiIsCisJZHByaW50Zl9pbmZvKG1jaXdhdmUsIndvZEdldFBvc2l0aW9uIC8vIG5DaGFubmVscz0ldVxuIiwKIAkJCVdPdXREZXZbd0RldklEXS5Gb3JtYXQud2YubkNoYW5uZWxzKTsgCi0JZHByaW50Zl9tY2l3YXZlKHN0ZGRlYiwid29kR2V0UG9zaXRpb24gLy8gbkF2Z0J5dGVzUGVyU2VjPSVsdVxuIiwKKwlkcHJpbnRmX2luZm8obWNpd2F2ZSwid29kR2V0UG9zaXRpb24gLy8gbkF2Z0J5dGVzUGVyU2VjPSVsdVxuIiwKIAkJCVdPdXREZXZbd0RldklEXS5Gb3JtYXQud2YubkF2Z0J5dGVzUGVyU2VjKTsgCiAJc3dpdGNoKGxwVGltZS0+d1R5cGUpIHsKIAljYXNlIFRJTUVfQllURVM6CiAJCWxwVGltZS0+dS5jYiA9IFdPdXREZXZbd0RldklEXS5kd1RvdGFsUGxheWVkOwotCQlkcHJpbnRmX21jaXdhdmUoc3RkZGViLCJ3b2RHZXRQb3NpdGlvbiAvLyBUSU1FX0JZVEVTPSVsdVxuIiwgbHBUaW1lLT51LmNiKTsKKwkJZHByaW50Zl9pbmZvKG1jaXdhdmUsIndvZEdldFBvc2l0aW9uIC8vIFRJTUVfQllURVM9JWx1XG4iLCBscFRpbWUtPnUuY2IpOwogCQlicmVhazsKIAljYXNlIFRJTUVfU0FNUExFUzoKLQkJZHByaW50Zl9tY2l3YXZlKHN0ZGRlYiwid29kR2V0UG9zaXRpb24gLy8gZHdUb3RhbFBsYXllZD0lbHVcbiIsIAorCQlkcHJpbnRmX2luZm8obWNpd2F2ZSwid29kR2V0UG9zaXRpb24gLy8gZHdUb3RhbFBsYXllZD0lbHVcbiIsIAogCQkJCVdPdXREZXZbd0RldklEXS5kd1RvdGFsUGxheWVkKTsKLQkJZHByaW50Zl9tY2l3YXZlKHN0ZGRlYiwid29kR2V0UG9zaXRpb24gLy8gd0JpdHNQZXJTYW1wbGU9JXVcbiIsIAorCQlkcHJpbnRmX2luZm8obWNpd2F2ZSwid29kR2V0UG9zaXRpb24gLy8gd0JpdHNQZXJTYW1wbGU9JXVcbiIsIAogCQkJCVdPdXREZXZbd0RldklEXS5Gb3JtYXQud0JpdHNQZXJTYW1wbGUpOwogCQlscFRpbWUtPnUuc2FtcGxlID0gV091dERldlt3RGV2SURdLmR3VG90YWxQbGF5ZWQgKiA4IC8KIAkJCQkJV091dERldlt3RGV2SURdLkZvcm1hdC53Qml0c1BlclNhbXBsZTsKLQkJZHByaW50Zl9tY2l3YXZlKHN0ZGRlYiwid29kR2V0UG9zaXRpb24gLy8gVElNRV9TQU1QTEVTPSVsdVxuIiwgbHBUaW1lLT51LnNhbXBsZSk7CisJCWRwcmludGZfaW5mbyhtY2l3YXZlLCJ3b2RHZXRQb3NpdGlvbiAvLyBUSU1FX1NBTVBMRVM9JWx1XG4iLCBscFRpbWUtPnUuc2FtcGxlKTsKIAkJYnJlYWs7CiAJY2FzZSBUSU1FX1NNUFRFOgogCQl0aW1lID0gV091dERldlt3RGV2SURdLmR3VG90YWxQbGF5ZWQgLwpAQCAtMTE0MywxOCArMTE0MSwxOCBAQAogCQl0aW1lIC09IGxwVGltZS0+dS5zbXB0ZS5zZWMgKiAzMDsKIAkJbHBUaW1lLT51LnNtcHRlLmZyYW1lID0gdGltZTsKIAkJbHBUaW1lLT51LnNtcHRlLmZwcyA9IDMwOwotCQlkcHJpbnRmX21jaXdhdmUoc3RkZGViLAorCQlkcHJpbnRmX2luZm8obWNpd2F2ZSwKIAkJICAid29kR2V0UG9zaXRpb24gLy8gVElNRV9TTVBURT0lMDJ1OiUwMnU6JTAydTolMDJ1XG4iLAogCQkgIGxwVGltZS0+dS5zbXB0ZS5ob3VyLCBscFRpbWUtPnUuc21wdGUubWluLAogCQkgIGxwVGltZS0+dS5zbXB0ZS5zZWMsIGxwVGltZS0+dS5zbXB0ZS5mcmFtZSk7CiAJCWJyZWFrOwogCWRlZmF1bHQ6Ci0JCWRwcmludGZfbWNpd2F2ZShzdGRkZWIsIndvZEdldFBvc2l0aW9uKCkgZm9ybWF0IG5vdCBzdXBwb3J0ZWQgISB1c2UgVElNRV9NUyAhXG4iKTsKKwkJZHByaW50Zl9maXhtZShtY2l3YXZlLCAid29kR2V0UG9zaXRpb24oKSBmb3JtYXQgbm90IHN1cHBvcnRlZCAhIHVzZSBUSU1FX01TICFcbiIpOwogCQlscFRpbWUtPndUeXBlID0gVElNRV9NUzsKIAljYXNlIFRJTUVfTVM6CiAJCWxwVGltZS0+dS5tcyA9IFdPdXREZXZbd0RldklEXS5kd1RvdGFsUGxheWVkIC8KIAkJCQkoV091dERldlt3RGV2SURdLkZvcm1hdC53Zi5uQXZnQnl0ZXNQZXJTZWMgLyAxMDAwKTsKLQkJZHByaW50Zl9tY2l3YXZlKHN0ZGRlYiwid29kR2V0UG9zaXRpb24gLy8gVElNRV9NUz0lbHVcbiIsIGxwVGltZS0+dS5tcyk7CisJCWRwcmludGZfaW5mbyhtY2l3YXZlLCJ3b2RHZXRQb3NpdGlvbiAvLyBUSU1FX01TPSVsdVxuIiwgbHBUaW1lLT51Lm1zKTsKIAkJYnJlYWs7CiAJfQogCXJldHVybiBNTVNZU0VSUl9OT0VSUk9SOwpAQCAtMTE2NywyMCArMTE2NSwyMCBAQAogewogCWludCAJbWl4ZXI7CiAJaW50CQl2b2x1bWUsIGxlZnQsIHJpZ2h0OwotCWRwcmludGZfbWNpd2F2ZShzdGRkZWIsIndvZEdldFZvbHVtZSgldSwgJXApO1xuIiwgd0RldklELCBscGR3Vm9sKTsKKwlkcHJpbnRmX2luZm8obWNpd2F2ZSwid29kR2V0Vm9sdW1lKCV1LCAlcCk7XG4iLCB3RGV2SUQsIGxwZHdWb2wpOwogCWlmIChscGR3Vm9sID09IE5VTEwpIHJldHVybiBNTVNZU0VSUl9OT1RFTkFCTEVEOwogCWlmICgobWl4ZXIgPSBvcGVuKE1JWEVSX0RFViwgT19SRE9OTFkpKSA8IDApIHsKLQkJZHByaW50Zl9tY2l3YXZlKHN0ZGRlYiwgIkxpbnV4ICd3b2RHZXRWb2x1bWUnIC8vIG1peGVyIGRldmljZSBub3QgYXZhaWxhYmxlICFcbiIpOworCQlkcHJpbnRmX3dhcm4obWNpd2F2ZSwgIkxpbnV4ICd3b2RHZXRWb2x1bWUnIC8vIG1peGVyIGRldmljZSBub3QgYXZhaWxhYmxlICFcbiIpOwogCQlyZXR1cm4gTU1TWVNFUlJfTk9URU5BQkxFRDsKIAl9CiAJaWYgKGlvY3RsKG1peGVyLCBTT1VORF9NSVhFUl9SRUFEX1BDTSwgJnZvbHVtZSkgPT0gLTEpIHsKLQkJZHByaW50Zl9tY2l3YXZlKHN0ZGRlYiwiTGludXggJ3dvZEdldFZvbHVtZScgLy8gdW5hYmxlIHJlYWQgbWl4ZXIgIVxuIik7CisJCWRwcmludGZfd2FybihtY2l3YXZlLCAiTGludXggJ3dvZEdldFZvbHVtZScgLy8gdW5hYmxlIHJlYWQgbWl4ZXIgIVxuIik7CiAJCXJldHVybiBNTVNZU0VSUl9OT1RFTkFCTEVEOwogCX0KIAljbG9zZShtaXhlcik7CiAJbGVmdCA9IHZvbHVtZSAmIDB4N0Y7CiAJcmlnaHQgPSAodm9sdW1lID4+IDgpICYgMHg3RjsKLQlkcHJpbnRmX21jaXdhdmUoc3RkZGViLCJMaW51eCAnd29kR2V0Vm9sdW1lJyAvLyBsZWZ0PSVkIHJpZ2h0PSVkICFcbiIsIGxlZnQsIHJpZ2h0KTsKKwlkcHJpbnRmX2luZm8obWNpd2F2ZSwiTGludXggJ3dvZEdldFZvbHVtZScgLy8gbGVmdD0lZCByaWdodD0lZCAhXG4iLCBsZWZ0LCByaWdodCk7CiAJKmxwZHdWb2wgPSBNQUtFTE9ORyhsZWZ0IDw8IDksIHJpZ2h0IDw8IDkpOwogCXJldHVybiBNTVNZU0VSUl9OT0VSUk9SOwogfQpAQCAtMTE5MywxNSArMTE5MSwxNSBAQAogewogCWludCAJbWl4ZXI7CiAJaW50CQl2b2x1bWU7Ci0JZHByaW50Zl9tY2l3YXZlKHN0ZGRlYiwid29kU2V0Vm9sdW1lKCV1LCAlMDhsWCk7XG4iLCB3RGV2SUQsIGR3UGFyYW0pOworCWRwcmludGZfaW5mbyhtY2l3YXZlLCJ3b2RTZXRWb2x1bWUoJXUsICUwOGxYKTtcbiIsIHdEZXZJRCwgZHdQYXJhbSk7CiAJdm9sdW1lID0gKExPV09SRChkd1BhcmFtKSA+PiA5ICYgMHg3RikgKyAKIAkJKChISVdPUkQoZHdQYXJhbSkgPj4gOSAgJiAweDdGKSA8PCA4KTsKIAlpZiAoKG1peGVyID0gb3BlbihNSVhFUl9ERVYsIE9fV1JPTkxZKSkgPCAwKSB7Ci0JCWRwcmludGZfbWNpd2F2ZShzdGRkZWIsCSJMaW51eCAnd29kU2V0Vm9sdW1lJyAvLyBtaXhlciBkZXZpY2Ugbm90IGF2YWlsYWJsZSAhXG4iKTsKKwkJZHByaW50Zl93YXJuKG1jaXdhdmUsCSJMaW51eCAnd29kU2V0Vm9sdW1lJyAvLyBtaXhlciBkZXZpY2Ugbm90IGF2YWlsYWJsZSAhXG4iKTsKIAkJcmV0dXJuIE1NU1lTRVJSX05PVEVOQUJMRUQ7CiAJCX0KICAgICBpZiAoaW9jdGwobWl4ZXIsIFNPVU5EX01JWEVSX1dSSVRFX1BDTSwgJnZvbHVtZSkgPT0gLTEpIHsKLQkJZHByaW50Zl9tY2l3YXZlKHN0ZGRlYiwiTGludXggJ3dvZFNldFZvbHVtZScgLy8gdW5hYmxlIHNldCBtaXhlciAhXG4iKTsKKwkJZHByaW50Zl93YXJuKG1jaXdhdmUsICJMaW51eCAnd29kU2V0Vm9sdW1lJyAvLyB1bmFibGUgc2V0IG1peGVyICFcbiIpOwogCQlyZXR1cm4gTU1TWVNFUlJfTk9URU5BQkxFRDsKIAkJfQogCWNsb3NlKG1peGVyKTsKQEAgLTEyMTQsNyArMTIxMiw3IEBACiBEV09SRCB3b2RNZXNzYWdlKFdPUkQgd0RldklELCBXT1JEIHdNc2csIERXT1JEIGR3VXNlciwgCiAJCQkJCURXT1JEIGR3UGFyYW0xLCBEV09SRCBkd1BhcmFtMikKIHsKLQlkcHJpbnRmX21jaXdhdmUoc3RkZGViLCJ3b2RNZXNzYWdlKCV1LCAlMDRYLCAlMDhsWCwgJTA4bFgsICUwOGxYKTtcbiIsCisJZHByaW50Zl9pbmZvKG1jaXdhdmUsIndvZE1lc3NhZ2UoJXUsICUwNFgsICUwOGxYLCAlMDhsWCwgJTA4bFgpO1xuIiwKIAkJCXdEZXZJRCwgd01zZywgZHdVc2VyLCBkd1BhcmFtMSwgZHdQYXJhbTIpOwogICAgICAgICBzd2l0Y2god01zZykgewogCWNhc2UgV09ETV9PUEVOOgpAQCAtMTI1Niw3ICsxMjU0LDcgQEAKIAljYXNlIFdPRE1fUkVTRVQ6CiAJCXJldHVybiB3b2RSZXNldCh3RGV2SUQpOwogCWRlZmF1bHQ6Ci0JCWRwcmludGZfbWNpd2F2ZShzdGRkZWIsIndvZE1lc3NhZ2UgLy8gdW5rbm93biBtZXNzYWdlICFcbiIpOworCQlkcHJpbnRmX3dhcm4obWNpd2F2ZSwid29kTWVzc2FnZSAvLyB1bmtub3duIG1lc3NhZ2UgIVxuIik7CiAJfQogCXJldHVybiBNTVNZU0VSUl9OT1RTVVBQT1JURUQ7CiB9CkBAIC0xMjcxLDcgKzEyNjksNyBAQAogewogCWludCAJYXVkaW8sc21wbHJhdGUsc2FtcGxlc2l6ZT0xNixkc3Bfc3RlcmVvPTEsYnl0ZXNwZXJzbXBsOwogCi0JZHByaW50Zl9tY2l3YXZlKHN0ZGRlYiwKKwlkcHJpbnRmX2luZm8obWNpd2F2ZSwKIAkJIndpZEdldERldkNhcHMoJXUsICVwLCAlbHUpO1xuIiwgd0RldklELCBscENhcHMsIGR3U2l6ZSk7CiAJaWYgKGxwQ2FwcyA9PSBOVUxMKSByZXR1cm4gTU1TWVNFUlJfTk9URU5BQkxFRDsKIAlpZiAoYWNjZXNzKFNPVU5EX0RFViwwKSAhPSAwKSByZXR1cm4gTU1TWVNFUlJfTk9URU5BQkxFRDsKQEAgLTEzMjMsNyArMTMyMSw3IEBACiAJCX0KIAl9CiAJY2xvc2UoYXVkaW8pOwotCWRwcmludGZfbWNpd2F2ZShzdGRkZWIsCisJZHByaW50Zl9pbmZvKG1jaXdhdmUsCiAJCSJ3aWRHZXREZXZDYXBzIC8vIGR3Rm9ybWF0cyA9ICUwOGxYXG4iLCBscENhcHMtPmR3Rm9ybWF0cyk7CiAJcmV0dXJuIE1NU1lTRVJSX05PRVJST1I7CiB9CkBAIC0xMzM3LDQzICsxMzM1LDQzIEBACiAJaW50IAkJYXVkaW8sYWJ1Zl9zaXplLHNtcGxyYXRlLHNhbXBsZXNpemUsZHNwX3N0ZXJlbzsKIAlMUFdBVkVGT1JNQVQJbHBGb3JtYXQ7CiAKLQlkcHJpbnRmX21jaXdhdmUoc3RkZGViLCAid2lkT3BlbigldSwgJXAsICUwOGxYKTtcbiIsIHdEZXZJRCwgbHBEZXNjLCBkd0ZsYWdzKTsKKwlkcHJpbnRmX2luZm8obWNpd2F2ZSwgIndpZE9wZW4oJXUsICVwLCAlMDhsWCk7XG4iLCB3RGV2SUQsIGxwRGVzYywgZHdGbGFncyk7CiAJaWYgKGxwRGVzYyA9PSBOVUxMKSB7Ci0JCWRwcmludGZfbWNpd2F2ZShzdGRkZWIsIkxpbnV4ICd3aWRPcGVuJyAvLyBJbnZhbGlkIFBhcmFtZXRlciAhXG4iKTsKKwkJZHByaW50Zl93YXJuKG1jaXdhdmUsICJMaW51eCAnd2lkT3BlbicgLy8gSW52YWxpZCBQYXJhbWV0ZXIgIVxuIik7CiAJCXJldHVybiBNTVNZU0VSUl9JTlZBTFBBUkFNOwogCX0KIAlpZiAod0RldklEID49IE1BWF9XQVZJTkRSVikgewotCQlkcHJpbnRmX21jaXdhdmUoc3RkZGViLCJMaW51eCAnd2lkT3BlbicgLy8gTUFYX1dBVklORFJWIHJlYWNoZWQgIVxuIik7CisJCWRwcmludGZfaW5mbyhtY2l3YXZlLCJMaW51eCAnd2lkT3BlbicgLy8gTUFYX1dBVklORFJWIHJlYWNoZWQgIVxuIik7CiAJCXJldHVybiBNTVNZU0VSUl9BTExPQ0FURUQ7CiAJfQogCVdJbkRldlt3RGV2SURdLnVuaXhkZXYgPSAwOwogCWlmIChhY2Nlc3MoU09VTkRfREVWLDApICE9IDApIHJldHVybiBNTVNZU0VSUl9OT1RFTkFCTEVEOwogCWF1ZGlvID0gb3BlbiAoU09VTkRfREVWLCBPX1JET05MWSwgMCk7CiAJaWYgKGF1ZGlvID09IC0xKSB7Ci0JCWRwcmludGZfbWNpd2F2ZShzdGRkZWIsIkxpbnV4ICd3aWRPcGVuJyAvLyBjYW4ndCBvcGVuICFcbiIpOworCQlkcHJpbnRmX3dhcm4obWNpd2F2ZSwiTGludXggJ3dpZE9wZW4nIC8vIGNhbid0IG9wZW4gIVxuIik7CiAJCXJldHVybiBNTVNZU0VSUl9BTExPQ0FURUQ7CiAJfQogCUlPQ1RMKGF1ZGlvLCBTTkRDVExfRFNQX0dFVEJMS1NJWkUsIGFidWZfc2l6ZSk7CiAJaWYgKGFidWZfc2l6ZSA8IDEwMjQgfHwgYWJ1Zl9zaXplID4gNjU1MzYpIHsKIAkJaWYgKGFidWZfc2l6ZSA9PSAtMSkKLQkJCWRwcmludGZfbWNpd2F2ZShzdGRkZWIsIkxpbnV4ICd3aWRPcGVuJyAvLyBJT0NUTCBjYW4ndCAnU05EQ1RMX0RTUF9HRVRCTEtTSVpFJyAhXG4iKTsKKwkJCWRwcmludGZfd2FybihtY2l3YXZlLCAiTGludXggJ3dpZE9wZW4nIC8vIElPQ1RMIGNhbid0ICdTTkRDVExfRFNQX0dFVEJMS1NJWkUnICFcbiIpOwogCQllbHNlCi0JCQlkcHJpbnRmX21jaXdhdmUoc3RkZGViLCJMaW51eCAnd2lkT3BlbicgLy8gU05EQ1RMX0RTUF9HRVRCTEtTSVpFIEludmFsaWQgYnVmc2l6ZSAhXG4iKTsKKwkJCWRwcmludGZfd2FybihtY2l3YXZlLCAiTGludXggJ3dpZE9wZW4nIC8vIFNORENUTF9EU1BfR0VUQkxLU0laRSBJbnZhbGlkIGJ1ZnNpemUgIVxuIik7CiAJCXJldHVybiBNTVNZU0VSUl9OT1RFTkFCTEVEOwogCX0KIAlXSW5EZXZbd0RldklEXS53RmxhZ3MgPSBISVdPUkQoZHdGbGFncyAmIENBTExCQUNLX1RZUEVNQVNLKTsKIAlzd2l0Y2goV0luRGV2W3dEZXZJRF0ud0ZsYWdzKSB7CiAJY2FzZSBEQ0JfTlVMTDoKLQkJZHByaW50Zl9tY2l3YXZlKHN0ZGRlYiwiTGludXggJ3dpZE9wZW4nIC8vIENBTExCQUNLX05VTEwhXG4iKTsKKwkJZHByaW50Zl9pbmZvKG1jaXdhdmUsIkxpbnV4ICd3aWRPcGVuJyAvLyBDQUxMQkFDS19OVUxMIVxuIik7CiAJCWJyZWFrOwogCWNhc2UgRENCX1dJTkRPVzoKLQkJZHByaW50Zl9tY2l3YXZlKHN0ZGRlYiwiTGludXggJ3dpZE9wZW4nIC8vIENBTExCQUNLX1dJTkRPVyFcbiIpOworCQlkcHJpbnRmX2luZm8obWNpd2F2ZSwiTGludXggJ3dpZE9wZW4nIC8vIENBTExCQUNLX1dJTkRPVyFcbiIpOwogCQlicmVhazsKIAljYXNlIERDQl9UQVNLOgotCQlkcHJpbnRmX21jaXdhdmUoc3RkZGViLCJMaW51eCAnd2lkT3BlbicgLy8gQ0FMTEJBQ0tfVEFTSyFcbiIpOworCQlkcHJpbnRmX2luZm8obWNpd2F2ZSwiTGludXggJ3dpZE9wZW4nIC8vIENBTExCQUNLX1RBU0shXG4iKTsKIAkJYnJlYWs7CiAJY2FzZSBEQ0JfRlVOQ1RJT046Ci0JCWRwcmludGZfbWNpd2F2ZShzdGRkZWIsIkxpbnV4ICd3aWRPcGVuJyAvLyBDQUxMQkFDS19GVU5DVElPTiFcbiIpOworCQlkcHJpbnRmX2luZm8obWNpd2F2ZSwiTGludXggJ3dpZE9wZW4nIC8vIENBTExCQUNLX0ZVTkNUSU9OIVxuIik7CiAJCWJyZWFrOwogCX0KIAlpZiAoV0luRGV2W3dEZXZJRF0ubHBRdWV1ZUhkcikgewpAQCAtMTM4Niw3ICsxMzg0LDcgQEAKIAltZW1jcHkoJldJbkRldlt3RGV2SURdLndhdmVEZXNjLCBscERlc2MsIHNpemVvZihXQVZFT1BFTkRFU0MpKTsKICAgICAgICAgbHBGb3JtYXQgPSAoTFBXQVZFRk9STUFUKSBscERlc2MtPmxwRm9ybWF0OyAKIAlpZiAobHBGb3JtYXQtPndGb3JtYXRUYWcgIT0gV0FWRV9GT1JNQVRfUENNKSB7Ci0JCWRwcmludGZfbWNpd2F2ZShzdGRkZWIsIkxpbnV4ICd3aWRPcGVuJyAvLyBCYWQgZm9ybWF0ICUwNFggIVxuIiwKKwkJZHByaW50Zl93YXJuKG1jaXdhdmUsICJMaW51eCAnd2lkT3BlbicgLy8gQmFkIGZvcm1hdCAlMDRYICFcbiIsCiAJCQkJCWxwRm9ybWF0LT53Rm9ybWF0VGFnKTsKIAkJcmV0dXJuIFdBVkVSUl9CQURGT1JNQVQ7CiAJfQpAQCAtMTQwNiwxNiArMTQwNCwxNiBAQAogCUlPQ1RMKGF1ZGlvLCBTTkRDVExfRFNQX1NQRUVELCBzbXBscmF0ZSk7CiAJSU9DVEwoYXVkaW8sIFNORENUTF9EU1BfU0FNUExFU0laRSwgc2FtcGxlc2l6ZSk7CiAJSU9DVEwoYXVkaW8sIFNORENUTF9EU1BfU1RFUkVPLCBkc3Bfc3RlcmVvKTsKLQlkcHJpbnRmX21jaXdhdmUoc3RkZGViLCJMaW51eCAnd2lkT3BlbicgLy8gd0JpdHNQZXJTYW1wbGU9JXUgIVxuIiwKKwlkcHJpbnRmX2luZm8obWNpd2F2ZSwiTGludXggJ3dpZE9wZW4nIC8vIHdCaXRzUGVyU2FtcGxlPSV1ICFcbiIsCiAJCQkJV0luRGV2W3dEZXZJRF0uRm9ybWF0LndCaXRzUGVyU2FtcGxlKTsKLQlkcHJpbnRmX21jaXdhdmUoc3RkZGViLCJMaW51eCAnd2lkT3BlbicgLy8gblNhbXBsZXNQZXJTZWM9JWx1ICFcbiIsCisJZHByaW50Zl9pbmZvKG1jaXdhdmUsIkxpbnV4ICd3aWRPcGVuJyAvLyBuU2FtcGxlc1BlclNlYz0lbHUgIVxuIiwKIAkJCQlXSW5EZXZbd0RldklEXS5Gb3JtYXQud2YublNhbXBsZXNQZXJTZWMpOwotCWRwcmludGZfbWNpd2F2ZShzdGRkZWIsIkxpbnV4ICd3aWRPcGVuJyAvLyBuQ2hhbm5lbHM9JXUgIVxuIiwKKwlkcHJpbnRmX2luZm8obWNpd2F2ZSwiTGludXggJ3dpZE9wZW4nIC8vIG5DaGFubmVscz0ldSAhXG4iLAogCQkJCVdJbkRldlt3RGV2SURdLkZvcm1hdC53Zi5uQ2hhbm5lbHMpOwotCWRwcmludGZfbWNpd2F2ZShzdGRkZWIsIkxpbnV4ICd3aWRPcGVuJyAvLyBuQXZnQnl0ZXNQZXJTZWM9JWx1XG4iLAorCWRwcmludGZfaW5mbyhtY2l3YXZlLCJMaW51eCAnd2lkT3BlbicgLy8gbkF2Z0J5dGVzUGVyU2VjPSVsdVxuIiwKIAkJCVdJbkRldlt3RGV2SURdLkZvcm1hdC53Zi5uQXZnQnl0ZXNQZXJTZWMpOyAKIAlpZiAoV0FWRV9Ob3RpZnlDbGllbnQod0RldklELCBXSU1fT1BFTiwgMEwsIDBMKSAhPSBNTVNZU0VSUl9OT0VSUk9SKSB7Ci0JCWRwcmludGZfbWNpd2F2ZShzdGRkZWIsIkxpbnV4ICd3aWRPcGVuJyAvLyBjYW4ndCBub3RpZnkgY2xpZW50ICFcbiIpOworCQlkcHJpbnRmX3dhcm4obWNpd2F2ZSwiTGludXggJ3dpZE9wZW4nIC8vIGNhbid0IG5vdGlmeSBjbGllbnQgIVxuIik7CiAJCXJldHVybiBNTVNZU0VSUl9JTlZBTFBBUkFNOwogCX0KIAlyZXR1cm4gTU1TWVNFUlJfTk9FUlJPUjsKQEAgLTE0MjYsMjEgKzE0MjQsMjEgQEAKICAqLwogc3RhdGljIERXT1JEIHdpZENsb3NlKFdPUkQgd0RldklEKQogewotCWRwcmludGZfbWNpd2F2ZShzdGRkZWIsIndpZENsb3NlKCV1KTtcbiIsIHdEZXZJRCk7CisJZHByaW50Zl9pbmZvKG1jaXdhdmUsIndpZENsb3NlKCV1KTtcbiIsIHdEZXZJRCk7CiAJaWYgKHdEZXZJRCA+IE1BWF9XQVZJTkRSVikgcmV0dXJuIE1NU1lTRVJSX0lOVkFMUEFSQU07CiAJaWYgKFdJbkRldlt3RGV2SURdLnVuaXhkZXYgPT0gMCkgewotCQlkcHJpbnRmX21jaXdhdmUoc3RkZGViLCJMaW51eCAnd2lkQ2xvc2UnIC8vIGNhbid0IGNsb3NlICFcbiIpOworCQlkcHJpbnRmX3dhcm4obWNpd2F2ZSwiTGludXggJ3dpZENsb3NlJyAvLyBjYW4ndCBjbG9zZSAhXG4iKTsKIAkJcmV0dXJuIE1NU1lTRVJSX05PVEVOQUJMRUQ7CiAJfQogCWlmIChXSW5EZXZbd0RldklEXS5scFF1ZXVlSGRyICE9IE5VTEwpIHsKLQkgICAgICAgIGRwcmludGZfbWNpd2F2ZShzdGRkZWIsImxpbnV4ICd3aWRjbG9zZScgLy8gc3RpbGwgYnVmZmVycyBvcGVuICFcbiIpOworCSAgICAgICAgZHByaW50Zl93YXJuKG1jaXdhdmUsICJsaW51eCAnd2lkY2xvc2UnIC8vIHN0aWxsIGJ1ZmZlcnMgb3BlbiAhXG4iKTsKIAkJcmV0dXJuIFdBVkVSUl9TVElMTFBMQVlJTkc7CiAJfQogCWNsb3NlKFdJbkRldlt3RGV2SURdLnVuaXhkZXYpOwogCVdJbkRldlt3RGV2SURdLnVuaXhkZXYgPSAwOwogCVdJbkRldlt3RGV2SURdLmJ1ZnNpemUgPSAwOwogCWlmIChXQVZFX05vdGlmeUNsaWVudCh3RGV2SUQsIFdJTV9DTE9TRSwgMEwsIDBMKSAhPSBNTVNZU0VSUl9OT0VSUk9SKSB7Ci0JCWRwcmludGZfbWNpd2F2ZShzdGRkZWIsIkxpbnV4ICd3aWRDbG9zZScgLy8gY2FuJ3Qgbm90aWZ5IGNsaWVudCAhXG4iKTsKKwkJZHByaW50Zl93YXJuKG1jaXdhdmUsIkxpbnV4ICd3aWRDbG9zZScgLy8gY2FuJ3Qgbm90aWZ5IGNsaWVudCAhXG4iKTsKIAkJcmV0dXJuIE1NU1lTRVJSX0lOVkFMUEFSQU07CiAJfQogCXJldHVybiBNTVNZU0VSUl9OT0VSUk9SOwpAQCAtMTQ1NCwxOCArMTQ1MiwxOCBAQAogCWludAkJY291bnQJPSAxOwogCUxQV0FWRUhEUiAJbHBXSUhkcjsKIAotCWRwcmludGZfbWNpd2F2ZShzdGRkZWIsCisJZHByaW50Zl9pbmZvKG1jaXdhdmUsCiAJCSJ3aWRBZGRCdWZmZXIoJXUsICVwLCAlMDhsWCk7XG4iLCB3RGV2SUQsIGxwV2F2ZUhkciwgZHdTaXplKTsKIAlpZiAoV0luRGV2W3dEZXZJRF0udW5peGRldiA9PSAwKSB7Ci0JCWRwcmludGZfbWNpd2F2ZShzdGRkZWIsIkxpbnV4ICd3aWRBZGRCdWZmZXInIC8vIGNhbid0IGRvIGl0ICFcbiIpOworCQlkcHJpbnRmX3dhcm4obWNpd2F2ZSwiTGludXggJ3dpZEFkZEJ1ZmZlcicgLy8gY2FuJ3QgZG8gaXQgIVxuIik7CiAJCXJldHVybiBNTVNZU0VSUl9OT1RFTkFCTEVEOwogCX0KIAlpZiAoIShscFdhdmVIZHItPmR3RmxhZ3MgJiBXSERSX1BSRVBBUkVEKSkgewotCQlkcHJpbnRmX21jaXdhdmUoc3RkZGViLAkiTGludXggJ3dpZEFkZEJ1ZmZlcicgLy8gbmV2ZXIgYmVlbiBwcmVwYXJlZCAhXG4iKTsKKwkJZHByaW50Zl9pbmZvKG1jaXdhdmUsCSJMaW51eCAnd2lkQWRkQnVmZmVyJyAvLyBuZXZlciBiZWVuIHByZXBhcmVkICFcbiIpOwogCQlyZXR1cm4gV0FWRVJSX1VOUFJFUEFSRUQ7CiAJfQogCWlmIChscFdhdmVIZHItPmR3RmxhZ3MgJiBXSERSX0lOUVVFVUUpIHsKLQkJZHByaW50Zl9tY2l3YXZlKHN0ZGRlYiwJIkxpbnV4ICd3aWRBZGRCdWZmZXInIC8vIGhlYWRlciBhbHJlYWR5IGluIHVzZSAhXG4iKTsKKwkJZHByaW50Zl9pbmZvKG1jaXdhdmUsCSJMaW51eCAnd2lkQWRkQnVmZmVyJyAvLyBoZWFkZXIgYWxyZWFkeSBpbiB1c2UgIVxuIik7CiAJCXJldHVybiBXQVZFUlJfU1RJTExQTEFZSU5HOwogCX0KIAlscFdhdmVIZHItPmR3RmxhZ3MgfD0gV0hEUl9QUkVQQVJFRDsKQEAgLTE0ODQsNyArMTQ4Miw3IEBACiAJCWxwV2F2ZUhkci0+bHBOZXh0ID0gTlVMTDsKIAkJY291bnQrKzsKIAl9Ci0JZHByaW50Zl9tY2l3YXZlKHN0ZGRlYiwKKwlkcHJpbnRmX2luZm8obWNpd2F2ZSwKIAkJIndpZEFkZEJ1ZmZlciAvLyBidWZmZXIgYWRkZWQgISAobm93ICV1IGluIHF1ZXVlKVxuIiwgY291bnQpOwogCXJldHVybiBNTVNZU0VSUl9OT0VSUk9SOwogfQpAQCAtMTQ5NCwxMCArMTQ5MiwxMCBAQAogICovCiBzdGF0aWMgRFdPUkQgd2lkUHJlcGFyZShXT1JEIHdEZXZJRCwgTFBXQVZFSERSIGxwV2F2ZUhkciwgRFdPUkQgZHdTaXplKQogewotCWRwcmludGZfbWNpd2F2ZShzdGRkZWIsCisJZHByaW50Zl9pbmZvKG1jaXdhdmUsCiAJCSJ3aWRQcmVwYXJlKCV1LCAlcCwgJTA4bFgpO1xuIiwgd0RldklELCBscFdhdmVIZHIsIGR3U2l6ZSk7CiAJaWYgKFdJbkRldlt3RGV2SURdLnVuaXhkZXYgPT0gMCkgewotCQlkcHJpbnRmX21jaXdhdmUoc3RkZGViLCJMaW51eCAnd2lkUHJlcGFyZScgLy8gY2FuJ3QgcHJlcGFyZSAhXG4iKTsKKwkJZHByaW50Zl93YXJuKG1jaXdhdmUsIkxpbnV4ICd3aWRQcmVwYXJlJyAvLyBjYW4ndCBwcmVwYXJlICFcbiIpOwogCQlyZXR1cm4gTU1TWVNFUlJfTk9URU5BQkxFRDsKIAl9CiAJaWYgKGxwV2F2ZUhkci0+ZHdGbGFncyAmIFdIRFJfSU5RVUVVRSkKQEAgLTE1MDYsNyArMTUwNCw3IEBACiAJbHBXYXZlSGRyLT5kd0ZsYWdzICY9IH5XSERSX0lOUVVFVUU7CiAJbHBXYXZlSGRyLT5kd0ZsYWdzICY9IH5XSERSX0RPTkU7CiAJbHBXYXZlSGRyLT5kd0J5dGVzUmVjb3JkZWQgPSAwOwotCWRwcmludGZfbWNpd2F2ZShzdGRkZWIsIkxpbnV4ICd3aWRQcmVwYXJlJyAvLyBoZWFkZXIgcHJlcGFyZWQgIVxuIik7CisJZHByaW50Zl9pbmZvKG1jaXdhdmUsIkxpbnV4ICd3aWRQcmVwYXJlJyAvLyBoZWFkZXIgcHJlcGFyZWQgIVxuIik7CiAJcmV0dXJuIE1NU1lTRVJSX05PRVJST1I7CiB9CiAKQEAgLTE1MTUsMTcgKzE1MTMsMTcgQEAKICAqLwogc3RhdGljIERXT1JEIHdpZFVucHJlcGFyZShXT1JEIHdEZXZJRCwgTFBXQVZFSERSIGxwV2F2ZUhkciwgRFdPUkQgZHdTaXplKQogewotCWRwcmludGZfbWNpd2F2ZShzdGRkZWIsCisJZHByaW50Zl9pbmZvKG1jaXdhdmUsCiAJCSJ3aWRVbnByZXBhcmUoJXUsICVwLCAlMDhsWCk7XG4iLCB3RGV2SUQsIGxwV2F2ZUhkciwgZHdTaXplKTsKIAlpZiAoV0luRGV2W3dEZXZJRF0udW5peGRldiA9PSAwKSB7Ci0JCWRwcmludGZfbWNpd2F2ZShzdGRkZWIsIkxpbnV4ICd3aWRVbnByZXBhcmUnIC8vIGNhbid0IHVucHJlcGFyZSAhXG4iKTsKKwkJZHByaW50Zl93YXJuKG1jaXdhdmUsIkxpbnV4ICd3aWRVbnByZXBhcmUnIC8vIGNhbid0IHVucHJlcGFyZSAhXG4iKTsKIAkJcmV0dXJuIE1NU1lTRVJSX05PVEVOQUJMRUQ7CiAJfQogCWxwV2F2ZUhkci0+ZHdGbGFncyAmPSB+V0hEUl9QUkVQQVJFRDsKIAlscFdhdmVIZHItPmR3RmxhZ3MgJj0gfldIRFJfSU5RVUVVRTsKIAlscFdhdmVIZHItPmR3RmxhZ3MgfD0gV0hEUl9ET05FOwogCi0JZHByaW50Zl9tY2l3YXZlKHN0ZGRlYiwgIkxpbnV4ICd3aWRVbnByZXBhcmUnIC8vIGFsbCBoZWFkZXJzIHVucHJlcGFyZWQgIVxuIik7CisJZHByaW50Zl9pbmZvKG1jaXdhdmUsICJMaW51eCAnd2lkVW5wcmVwYXJlJyAvLyBhbGwgaGVhZGVycyB1bnByZXBhcmVkICFcbiIpOwogCXJldHVybiBNTVNZU0VSUl9OT0VSUk9SOwogfQogCkBAIC0xNTM5LDIyICsxNTM3LDIyIEBACiAJTFBXQVZFSERSIAlscFdJSGRyOwogCUxQV0FWRUhEUgkqbHBXYXZlSGRyOwogCi0JZHByaW50Zl9tY2l3YXZlKHN0ZGRlYiwid2lkU3RhcnQoJXUpO1xuIiwgd0RldklEKTsKKwlkcHJpbnRmX2luZm8obWNpd2F2ZSwid2lkU3RhcnQoJXUpO1xuIiwgd0RldklEKTsKIAlpZiAoV0luRGV2W3dEZXZJRF0udW5peGRldiA9PSAwKSB7Ci0JCWRwcmludGZfbWNpd2F2ZShzdGRkZWIsCSJMaW51eCAnd2lkU3RhcnQnIC8vIGNhbid0IHN0YXJ0IHJlY29yZGluZyAhXG4iKTsKKwkJZHByaW50Zl93YXJuKG1jaXdhdmUsCSJMaW51eCAnd2lkU3RhcnQnIC8vIGNhbid0IHN0YXJ0IHJlY29yZGluZyAhXG4iKTsKIAkJcmV0dXJuIE1NU1lTRVJSX05PVEVOQUJMRUQ7CiAJfQogCiAJbHBXYXZlSGRyID0gJihXSW5EZXZbd0RldklEXS5scFF1ZXVlSGRyKTsKLQlkcHJpbnRmX21jaXdhdmUoc3RkZGViLCJMaW51eCAnd2lkc3RhcnQnLy8gbHBXYXZlSGRyID0gJTA4bHhcbiIsKERXT1JEKWxwV2F2ZUhkcik7CisJZHByaW50Zl9pbmZvKG1jaXdhdmUsIkxpbnV4ICd3aWRzdGFydCcvLyBscFdhdmVIZHIgPSAlMDhseFxuIiwoRFdPUkQpbHBXYXZlSGRyKTsKIAlpZiAoISpscFdhdmVIZHIgfHwgISgqbHBXYXZlSGRyKS0+bHBEYXRhKSB7Ci0JCWRwcmludGZfbWNpd2F2ZShzdGRkZWIsIkxpbnV4ICd3aWRTdGFydCcgLy8gbmV2ZXIgYmVlbiBwcmVwYXJlZCAhXG4iKTsKKwkJZHByaW50Zl9pbmZvKG1jaXdhdmUsIkxpbnV4ICd3aWRTdGFydCcgLy8gbmV2ZXIgYmVlbiBwcmVwYXJlZCAhXG4iKTsKIAkJcmV0dXJuIFdBVkVSUl9VTlBSRVBBUkVEOwogCX0KIAogCXdoaWxlKCpscFdhdmVIZHIgIT0gTlVMTCkgewogCSAgICAgICAgbHBXSUhkciA9ICpscFdhdmVIZHI7Ci0JCWRwcmludGZfbWNpd2F2ZShzdGRkZWIsCisJCWRwcmludGZfaW5mbyhtY2l3YXZlLAogCQkJIndpZFN0YXJ0IC8vIHJlY29yZGluZyBidWYjJXU9JXAgc2l6ZT0lbHUgXG4iLAogCQkJY291bnQsIGxwV0lIZHItPmxwRGF0YSwgbHBXSUhkci0+ZHdCdWZmZXJMZW5ndGgpOwogCQlmZmx1c2goc3RkZGViKTsKQEAgLTE1NzEsMTQgKzE1NjksMTQgQEAKIAogCQkvKiBGSVhNRTogc2hvdWxkIHBhc3Mgc2VnbWVudGVkIHBvaW50ZXIgaGVyZSwgZG8gd2UgbmVlZCB0aGF0PyovCiAJCWlmIChXQVZFX05vdGlmeUNsaWVudCh3RGV2SUQsIFdJTV9EQVRBLCAoRFdPUkQpbHBXYXZlSGRyLCBscFdJSGRyLT5kd0J5dGVzUmVjb3JkZWQpICE9IE1NU1lTRVJSX05PRVJST1IpIHsKLQkJCWRwcmludGZfbWNpd2F2ZShzdGRkZWIsCSJMaW51eCAnd2lkU3RhcnQnIC8vIGNhbid0IG5vdGlmeSBjbGllbnQgIVxuIik7CisJCQlkcHJpbnRmX3dhcm4obWNpd2F2ZSwJIkxpbnV4ICd3aWRTdGFydCcgLy8gY2FuJ3Qgbm90aWZ5IGNsaWVudCAhXG4iKTsKIAkJCXJldHVybiBNTVNZU0VSUl9JTlZBTFBBUkFNOwogCQl9CiAJCS8qIHJlbW92ZXMgdGhlIGN1cnJlbnQgYmxvY2sgZnJvbSB0aGUgcXVldWUgKi8KIAkJKmxwV2F2ZUhkciA9IGxwV0lIZHItPmxwTmV4dDsKIAkJY291bnQrKzsKIAl9Ci0JZHByaW50Zl9tY2l3YXZlKHN0ZGRlYiwid2lkU3RhcnQgLy8gZW5kIG9mIHJlY29yZGluZyAhXG4iKTsKKwlkcHJpbnRmX2luZm8obWNpd2F2ZSwid2lkU3RhcnQgLy8gZW5kIG9mIHJlY29yZGluZyAhXG4iKTsKIAlmZmx1c2goc3RkZGViKTsKIAlyZXR1cm4gTU1TWVNFUlJfTk9FUlJPUjsKIH0KQEAgLTE1ODgsOSArMTU4Niw5IEBACiAgKi8KIHN0YXRpYyBEV09SRCB3aWRTdG9wKFdPUkQgd0RldklEKQogewotCWRwcmludGZfbWNpd2F2ZShzdGRkZWIsIndpZFN0b3AoJXUpO1xuIiwgd0RldklEKTsKKwlkcHJpbnRmX2luZm8obWNpd2F2ZSwid2lkU3RvcCgldSk7XG4iLCB3RGV2SUQpOwogCWlmIChXSW5EZXZbd0RldklEXS51bml4ZGV2ID09IDApIHsKLQkJZHByaW50Zl9tY2l3YXZlKHN0ZGRlYiwiTGludXggJ3dpZFN0b3AnIC8vIGNhbid0IHN0b3AgIVxuIik7CisJCWRwcmludGZfd2FybihtY2l3YXZlLCJMaW51eCAnd2lkU3RvcCcgLy8gY2FuJ3Qgc3RvcCAhXG4iKTsKIAkJcmV0dXJuIE1NU1lTRVJSX05PVEVOQUJMRUQ7CiAJfQogCXJldHVybiBNTVNZU0VSUl9OT0VSUk9SOwpAQCAtMTYwMSw5ICsxNTk5LDkgQEAKICAqLwogc3RhdGljIERXT1JEIHdpZFJlc2V0KFdPUkQgd0RldklEKQogewotCWRwcmludGZfbWNpd2F2ZShzdGRkZWIsIndpZFJlc2V0KCV1KTtcbiIsIHdEZXZJRCk7CisJZHByaW50Zl9pbmZvKG1jaXdhdmUsIndpZFJlc2V0KCV1KTtcbiIsIHdEZXZJRCk7CiAJaWYgKFdJbkRldlt3RGV2SURdLnVuaXhkZXYgPT0gMCkgewotCQlkcHJpbnRmX21jaXdhdmUoc3RkZGViLCJMaW51eCAnd2lkUmVzZXQnIC8vIGNhbid0IHJlc2V0ICFcbiIpOworCQlkcHJpbnRmX3dhcm4obWNpd2F2ZSwiTGludXggJ3dpZFJlc2V0JyAvLyBjYW4ndCByZXNldCAhXG4iKTsKIAkJcmV0dXJuIE1NU1lTRVJSX05PVEVOQUJMRUQ7CiAJfQogCXJldHVybiBNTVNZU0VSUl9OT0VSUk9SOwpAQCAtMTYxNiwzNCArMTYxNCwzNCBAQAogewogCWludAkJdGltZTsKICAgICAKLQlkcHJpbnRmX21jaXdhdmUoc3RkZGViLAorCWRwcmludGZfaW5mbyhtY2l3YXZlLAogCQkid2lkR2V0UG9zaXRpb24oJXUsICVwLCAlbHUpO1xuIiwgd0RldklELCBscFRpbWUsIHVTaXplKTsKIAlpZiAoV0luRGV2W3dEZXZJRF0udW5peGRldiA9PSAwKSB7Ci0JCWRwcmludGZfbWNpd2F2ZShzdGRkZWIsIkxpbnV4ICd3aWRHZXRQb3NpdGlvbicgLy8gY2FuJ3QgZ2V0IHBvcyAhXG4iKTsKKwkJZHByaW50Zl93YXJuKG1jaXdhdmUsIkxpbnV4ICd3aWRHZXRQb3NpdGlvbicgLy8gY2FuJ3QgZ2V0IHBvcyAhXG4iKTsKIAkJcmV0dXJuIE1NU1lTRVJSX05PVEVOQUJMRUQ7CiAJfQogCWlmIChscFRpbWUgPT0gTlVMTCkJcmV0dXJuIE1NU1lTRVJSX0lOVkFMUEFSQU07Ci0JZHByaW50Zl9tY2l3YXZlKHN0ZGRlYiwid2lkR2V0UG9zaXRpb24gLy8gd1R5cGU9JTA0WCAhXG4iLCAKKwlkcHJpbnRmX2luZm8obWNpd2F2ZSwid2lkR2V0UG9zaXRpb24gLy8gd1R5cGU9JTA0WCAhXG4iLCAKIAkJCWxwVGltZS0+d1R5cGUpOwotCWRwcmludGZfbWNpd2F2ZShzdGRkZWIsIndpZEdldFBvc2l0aW9uIC8vIHdCaXRzUGVyU2FtcGxlPSV1XG4iLAorCWRwcmludGZfaW5mbyhtY2l3YXZlLCJ3aWRHZXRQb3NpdGlvbiAvLyB3Qml0c1BlclNhbXBsZT0ldVxuIiwKIAkJCVdJbkRldlt3RGV2SURdLkZvcm1hdC53Qml0c1BlclNhbXBsZSk7IAotCWRwcmludGZfbWNpd2F2ZShzdGRkZWIsIndpZEdldFBvc2l0aW9uIC8vIG5TYW1wbGVzUGVyU2VjPSVsdVxuIiwKKwlkcHJpbnRmX2luZm8obWNpd2F2ZSwid2lkR2V0UG9zaXRpb24gLy8gblNhbXBsZXNQZXJTZWM9JWx1XG4iLAogCQkJV0luRGV2W3dEZXZJRF0uRm9ybWF0LndmLm5TYW1wbGVzUGVyU2VjKTsgCi0JZHByaW50Zl9tY2l3YXZlKHN0ZGRlYiwid2lkR2V0UG9zaXRpb24gLy8gbkNoYW5uZWxzPSV1XG4iLAorCWRwcmludGZfaW5mbyhtY2l3YXZlLCJ3aWRHZXRQb3NpdGlvbiAvLyBuQ2hhbm5lbHM9JXVcbiIsCiAJCQlXSW5EZXZbd0RldklEXS5Gb3JtYXQud2YubkNoYW5uZWxzKTsgCi0JZHByaW50Zl9tY2l3YXZlKHN0ZGRlYiwid2lkR2V0UG9zaXRpb24gLy8gbkF2Z0J5dGVzUGVyU2VjPSVsdVxuIiwKKwlkcHJpbnRmX2luZm8obWNpd2F2ZSwid2lkR2V0UG9zaXRpb24gLy8gbkF2Z0J5dGVzUGVyU2VjPSVsdVxuIiwKIAkJCVdJbkRldlt3RGV2SURdLkZvcm1hdC53Zi5uQXZnQnl0ZXNQZXJTZWMpOyAKIAlmZmx1c2goc3RkZGViKTsKIAlzd2l0Y2gobHBUaW1lLT53VHlwZSkgewogCWNhc2UgVElNRV9CWVRFUzoKIAkJbHBUaW1lLT51LmNiID0gV0luRGV2W3dEZXZJRF0uZHdUb3RhbFJlY29yZGVkOwotCQlkcHJpbnRmX21jaXdhdmUoc3RkZGViLAorCQlkcHJpbnRmX2luZm8obWNpd2F2ZSwKIAkJICAgICJ3aWRHZXRQb3NpdGlvbiAvLyBUSU1FX0JZVEVTPSVsdVxuIiwgbHBUaW1lLT51LmNiKTsKIAkJYnJlYWs7CiAJY2FzZSBUSU1FX1NBTVBMRVM6CiAJCWxwVGltZS0+dS5zYW1wbGUgPSBXSW5EZXZbd0RldklEXS5kd1RvdGFsUmVjb3JkZWQgKiA4IC8KIAkJCQkgIFdJbkRldlt3RGV2SURdLkZvcm1hdC53Qml0c1BlclNhbXBsZTsKLQkJZHByaW50Zl9tY2l3YXZlKHN0ZGRlYiwKKwkJZHByaW50Zl9pbmZvKG1jaXdhdmUsCiAJCQkJIndpZEdldFBvc2l0aW9uIC8vIFRJTUVfU0FNUExFUz0lbHVcbiIsIAogCQkJCWxwVGltZS0+dS5zYW1wbGUpOwogCQlicmVhazsKQEAgLTE2NTgsMTcgKzE2NTYsMTcgQEAKIAkJdGltZSAtPSBscFRpbWUtPnUuc21wdGUuc2VjICogMzA7CiAJCWxwVGltZS0+dS5zbXB0ZS5mcmFtZSA9IHRpbWU7CiAJCWxwVGltZS0+dS5zbXB0ZS5mcHMgPSAzMDsKLWRwcmludGZfbWNpd2F2ZShzdGRkZWIsIndpZEdldFBvc2l0aW9uIC8vIFRJTUVfU01QVEU9JTAydTolMDJ1OiUwMnU6JTAydVxuIiwKK2RwcmludGZfaW5mbyhtY2l3YXZlLCJ3aWRHZXRQb3NpdGlvbiAvLyBUSU1FX1NNUFRFPSUwMnU6JTAydTolMDJ1OiUwMnVcbiIsCiAJCQkJbHBUaW1lLT51LnNtcHRlLmhvdXIsIGxwVGltZS0+dS5zbXB0ZS5taW4sCiAJCQkJbHBUaW1lLT51LnNtcHRlLnNlYywgbHBUaW1lLT51LnNtcHRlLmZyYW1lKTsKIAkJYnJlYWs7CiAJZGVmYXVsdDoKLQkJZHByaW50Zl9tY2l3YXZlKHN0ZGRlYiwid2lkR2V0UG9zaXRpb24oKSBmb3JtYXQgbm90IHN1cHBvcnRlZCAhIHVzZSBUSU1FX01TICFcbiIpOworCQlkcHJpbnRmX2ZpeG1lKG1jaXdhdmUsICJ3aWRHZXRQb3NpdGlvbigpIGZvcm1hdCBub3Qgc3VwcG9ydGVkICEgdXNlIFRJTUVfTVMgIVxuIik7CiAJCWxwVGltZS0+d1R5cGUgPSBUSU1FX01TOwogCWNhc2UgVElNRV9NUzoKIAkJbHBUaW1lLT51Lm1zID0gV0luRGV2W3dEZXZJRF0uZHdUb3RhbFJlY29yZGVkIC8KIAkJCQkoV0luRGV2W3dEZXZJRF0uRm9ybWF0LndmLm5BdmdCeXRlc1BlclNlYyAvIDEwMDApOwotCQlkcHJpbnRmX21jaXdhdmUoc3RkZGViLAorCQlkcHJpbnRmX2luZm8obWNpd2F2ZSwKIAkJICAgICAgIndpZEdldFBvc2l0aW9uIC8vIFRJTUVfTVM9JWx1XG4iLCBscFRpbWUtPnUubXMpOwogCQlicmVhazsKIAl9CkBAIC0xNjgxLDcgKzE2NzksNyBAQAogRFdPUkQgd2lkTWVzc2FnZShXT1JEIHdEZXZJRCwgV09SRCB3TXNnLCBEV09SRCBkd1VzZXIsIAogCQkJCQlEV09SRCBkd1BhcmFtMSwgRFdPUkQgZHdQYXJhbTIpCiB7Ci0JZHByaW50Zl9tY2l3YXZlKHN0ZGRlYiwid2lkTWVzc2FnZSgldSwgJTA0WCwgJTA4bFgsICUwOGxYLCAlMDhsWCk7XG4iLAorCWRwcmludGZfaW5mbyhtY2l3YXZlLCJ3aWRNZXNzYWdlKCV1LCAlMDRYLCAlMDhsWCwgJTA4bFgsICUwOGxYKTtcbiIsCiAJCQl3RGV2SUQsIHdNc2csIGR3VXNlciwgZHdQYXJhbTEsIGR3UGFyYW0yKTsKIAlzd2l0Y2god01zZykgewogCWNhc2UgV0lETV9PUEVOOgpAQCAtMTcwOSw3ICsxNzA3LDcgQEAKIAljYXNlIFdJRE1fU1RPUDoKIAkJcmV0dXJuIHdpZFN0b3Aod0RldklEKTsKIAlkZWZhdWx0OgotCQlkcHJpbnRmX21jaXdhdmUoc3RkZGViLCJ3aWRNZXNzYWdlIC8vIHVua25vd24gbWVzc2FnZSAhXG4iKTsKKwkJZHByaW50Zl93YXJuKG1jaXdhdmUsIndpZE1lc3NhZ2UgLy8gdW5rbm93biBtZXNzYWdlICFcbiIpOwogCX0KIAlyZXR1cm4gTU1TWVNFUlJfTk9UU1VQUE9SVEVEOwogfQpAQCAtMTcyMSw3ICsxNzE5LDcgQEAKIExPTkcgV0FWRV9Ecml2ZXJQcm9jKERXT1JEIGR3RGV2SUQsIEhEUlZSMTYgaERyaXYsIFdPUkQgd01zZywgCiAJCSAgICAgRFdPUkQgZHdQYXJhbTEsIERXT1JEIGR3UGFyYW0yKQogewotCWRwcmludGZfbWNpd2F2ZShzdGRkZWIsIldBVkVfRHJpdmVyUHJvYyglMDhsWCwgJTA0WCwgJTA0WCwgJTA4bFgsICUwOGxYKVxuIiwgCisJZHByaW50Zl9pbmZvKG1jaXdhdmUsIldBVkVfRHJpdmVyUHJvYyglMDhsWCwgJTA0WCwgJTA0WCwgJTA4bFgsICUwOGxYKVxuIiwgCiAJCWR3RGV2SUQsIGhEcml2LCB3TXNnLCBkd1BhcmFtMSwgZHdQYXJhbTIpOwogCXN3aXRjaCh3TXNnKSB7CiAJY2FzZSBEUlZfTE9BRDoKZGlmZiAtLWdpdCBhL211bHRpbWVkaWEvZHNvdW5kLmMgYi9tdWx0aW1lZGlhL2Rzb3VuZC5jCmluZGV4IGU5MzFmNzguLmE3MTkwNDggMTAwNjQ0Ci0tLSBhL211bHRpbWVkaWEvZHNvdW5kLmMKKysrIGIvbXVsdGltZWRpYS9kc291bmQuYwpAQCAtNDIsNyArNDIsNiBAQAogI2luY2x1ZGUgIm1tc3lzdGVtLmgiCiAjaW5jbHVkZSAiZHNvdW5kLmgiCiAjaW5jbHVkZSAidGhyZWFkLmgiCi0jaW5jbHVkZSAic3RkZGVidWcuaCIKICNpbmNsdWRlICJkZWJ1Zy5oIgogCiAjaWZkZWYgSEFWRV9PU1MKQEAgLTUwLDcgKzQ5LDYgQEAKICNpbmNsdWRlIDxzeXMvc291bmRjYXJkLmg+CiAKIHN0YXRpYyBpbnQgYXVkaW9mZCA9IC0xOwotc3RhdGljIGludCBjdXJyZW50X2J1ZmZlcmVkX2ZyYWdzID0gNDsKIHN0YXRpYyBMUERJUkVDVFNPVU5ECWRzb3VuZCA9IE5VTEw7CiAKIHN0YXRpYyBzaG9ydCBwbGF5YnVmWzIwNDhdOwpAQCAtOTgsNyArOTYsNyBAQAogKSB7CiAJY2hhciB4YnVmWzUwXTsKIAotCVN0cmluZ0Zyb21DTFNJRChyaWlkLHhidWYpOworCVdJTkVfU3RyaW5nRnJvbUNMU0lEKHJpaWQseGJ1Zik7CiAJZnByaW50ZihzdGRlcnIsIklEaXJlY3RTb3VuZCglcCktPlF1ZXJ5SW50ZXJmYWNlKCVzLCVwKVxuIix0aGlzLHhidWYscHBvYmopOwogCXJldHVybiBFX0ZBSUw7CiB9CkBAIC0xMjksOSArMTI3LDExIEBACiApIHsKIAlpbnQJaTsKIAotCWZwcmludGYoc3RkZXJyLCJJRGlyZWN0U291bmROb3RpZnkoJXApLT5TZXROb3RpZmljYXRpb25Qb3NpdGlvbnMoMHglMDhseCwlcCksc3R1YiFcbiIsdGhpcyxob3dtdWNoLG5vdGlmeSk7Ci0JZm9yIChpPTA7aTxob3dtdWNoO2krKykKLQkJZnByaW50ZihzdGRlcnIsIglub3RpZnkgYXQgJWxkIHRvIDB4JTA4bHhcbiIsbm90aWZ5W2ldLmR3T2Zmc2V0LG5vdGlmeVtpXS5oRXZlbnROb3RpZnkpOworCWlmIChkZWJ1Z2dpbmdfaW5mbyhkc291bmQpKSB7CisJICAgIGZwcmludGYoc3RkZXJyLCJJRGlyZWN0U291bmROb3RpZnkoJXApLT5TZXROb3RpZmljYXRpb25Qb3NpdGlvbnMoMHglMDhseCwlcClcbiIsdGhpcyxob3dtdWNoLG5vdGlmeSk7CisJICAgIGZvciAoaT0wO2k8aG93bXVjaDtpKyspCisJCSAgICBmcHJpbnRmKHN0ZGVyciwiCW5vdGlmeSBhdCAlbGQgdG8gMHglMDhseFxuIixub3RpZnlbaV0uZHdPZmZzZXQsKERXT1JEKW5vdGlmeVtpXS5oRXZlbnROb3RpZnkpOworCX0KIAl0aGlzLT5kc2ItPm5vdGlmaWVzID0gSGVhcFJlQWxsb2MoR2V0UHJvY2Vzc0hlYXAoKSxIRUFQX1pFUk9fTUVNT1JZLHRoaXMtPmRzYi0+bm90aWZpZXMsKHRoaXMtPmRzYi0+bnJvZm5vdGlmaWVzK2hvd211Y2gpKnNpemVvZihEU0JQT1NJVElPTk5PVElGWSkpOwogCW1lbWNweSgJdGhpcy0+ZHNiLT5ub3RpZmllcyt0aGlzLT5kc2ItPm5yb2Zub3RpZmllcywKIAkJbm90aWZ5LApAQCAtMTM5LDggKzEzOSw2IEBACiAJKTsKIAl0aGlzLT5kc2ItPm5yb2Zub3RpZmllcys9aG93bXVjaDsKIAlxc29ydCh0aGlzLT5kc2ItPm5vdGlmaWVzLHRoaXMtPmRzYi0+bnJvZm5vdGlmaWVzLHNpemVvZihEU0JQT1NJVElPTk5PVElGWSksX3NvcnRfbm90aWZpZXMpOwotCWZvciAoaT0wO2k8dGhpcy0+ZHNiLT5ucm9mbm90aWZpZXM7aSsrKQotCQlmcHJpbnRmKHN0ZGVyciwiCW5vdGlmeSBhdCAlbGQgdG8gMHglMDhseFxuIix0aGlzLT5kc2ItPm5vdGlmaWVzW2ldLmR3T2Zmc2V0LHRoaXMtPmRzYi0+bm90aWZpZXNbaV0uaEV2ZW50Tm90aWZ5KTsKIAlyZXR1cm4gMDsKIH0KIApAQCAtMTU5LDkgKzE1Nyw5IEBACiApIHsKIAogCW1lbWNweSgmKHRoaXMtPndmeCksd2ZleCxzaXplb2YodGhpcy0+d2Z4KSk7Ci0JZHByaW50Zl9kc291bmQoc3RkZXJyLCJJRGlyZWN0U291bmRCdWZmZXIoJXApLT5TZXRGb3JtYXQoJXApLHN0dWIhXG4iLAorCWRwcmludGZfZml4bWUoZHNvdW5kLCJJRGlyZWN0U291bmRCdWZmZXIoJXApLT5TZXRGb3JtYXQoJXApXG4iLAogCQkgICAgICAgdGhpcyx3ZmV4KTsKLQlkcHJpbnRmX2Rzb3VuZChzdGRlcnIsIglbZm9ybWF0dGFnPTB4JTA0eCxjaGFucz0lZCxzYW1wbGVyYXRlPSVsZCIKKwlkcHJpbnRmX2luZm8oZHNvdW5kLCIJW2Zvcm1hdHRhZz0weCUwNHgsY2hhbnM9JWQsc2FtcGxlcmF0ZT0lbGQiCiAJCSAgICJieXRlc3BlcnNlYz0lbGQsYmxvY2thbGlnbj0lZCxiaXRzcGVyc2FtcD0lZCxjYlNpemU9JWRdXG4iLAogCQkgICB3ZmV4LT53Rm9ybWF0VGFnLCB3ZmV4LT5uQ2hhbm5lbHMsIHdmZXgtPm5TYW1wbGVzUGVyU2VjLAogCQkgICB3ZmV4LT5uQXZnQnl0ZXNQZXJTZWMsIHdmZXgtPm5CbG9ja0FsaWduLCAKQEAgLTE3MywxNSArMTcxLDE2IEBACiBzdGF0aWMgSFJFU1VMVCBXSU5BUEkgSURpcmVjdFNvdW5kQnVmZmVyX1NldFZvbHVtZSgKIAlMUERJUkVDVFNPVU5EQlVGRkVSIHRoaXMsTE9ORyB2b2wKICkgewotCWZwcmludGYoc3RkZXJyLCJJRGlyZWN0U291bmRCdWZmZXIoJXApLT5TZXRWb2x1bWUoJWxkKSxzdHViIVxuIix0aGlzLHZvbCk7CisJZnByaW50ZihzdGRlcnIsIklEaXJlY3RTb3VuZEJ1ZmZlciglcCktPlNldFZvbHVtZSglbGQpXG4iLHRoaXMsdm9sKTsKIAl0aGlzLT52b2x1bWUgPSB2b2w7CisJdGhpcy0+dm9sZmFjID0gKChkb3VibGUpdm9sKzEwMDAwLjApLzEwMDAwLjA7CiAJcmV0dXJuIDA7CiB9CiAKIHN0YXRpYyBIUkVTVUxUIFdJTkFQSSBJRGlyZWN0U291bmRCdWZmZXJfR2V0Vm9sdW1lKAogCUxQRElSRUNUU09VTkRCVUZGRVIgdGhpcyxMUExPTkcgdm9sCiApIHsKLQlkcHJpbnRmX2Rzb3VuZChzdGRlcnIsIklEaXJlY3RTb3VuZEJ1ZmZlciglcCktPkdldFZvbHVtZSglcCksc3R1YiFcbiIsdGhpcyx2b2wpOworCWRwcmludGZfZml4bWUoZHNvdW5kLCJJRGlyZWN0U291bmRCdWZmZXIoJXApLT5HZXRWb2x1bWUoJXApXG4iLHRoaXMsdm9sKTsKIAkqdm9sID0gdGhpcy0+dm9sdW1lOwogCXJldHVybiAwOwogfQpAQCAtMTg5LDE0ICsxODgsMTYgQEAKIHN0YXRpYyBIUkVTVUxUIFdJTkFQSSBJRGlyZWN0U291bmRCdWZmZXJfU2V0RnJlcXVlbmN5KAogCUxQRElSRUNUU09VTkRCVUZGRVIgdGhpcyxEV09SRCBmcmVxCiApIHsKLQlmcHJpbnRmKHN0ZGVyciwiSURpcmVjdFNvdW5kQnVmZmVyKCVwKS0+U2V0RnJlcXVlbmN5KCUwOGx4KSxzdHViIVxuIix0aGlzLGZyZXEpOworCWRwcmludGZfZml4bWUoZHNvdW5kLCJJRGlyZWN0U291bmRCdWZmZXIoJXApLT5TZXRGcmVxdWVuY3koJWxkKVxuIix0aGlzLGZyZXEpOworCXRoaXMtPndmeC5uU2FtcGxlc1BlclNlYyA9IGZyZXE7CisJdGhpcy0+d2Z4Lm5BdmdCeXRlc1BlclNlYyA9IGZyZXEqdGhpcy0+d2Z4Lm5DaGFubmVscyoodGhpcy0+d2Z4LndCaXRzUGVyU2FtcGxlLzgpOwogCXJldHVybiAwOwogfQogCiBzdGF0aWMgSFJFU1VMVCBXSU5BUEkgSURpcmVjdFNvdW5kQnVmZmVyX1BsYXkoCiAJTFBESVJFQ1RTT1VOREJVRkZFUiB0aGlzLERXT1JEIHJlc2VydmVkMSxEV09SRCByZXNlcnZlZDIsRFdPUkQgZmxhZ3MKICkgewotCWRwcmludGZfZHNvdW5kKHN0ZGVyciwiSURpcmVjdFNvdW5kQnVmZmVyKCVwKS0+UGxheSglMDhseCwlMDhseCwlMDhseCksc3R1YiFcbiIsCisJZHByaW50Zl9maXhtZShkc291bmQsIklEaXJlY3RTb3VuZEJ1ZmZlciglcCktPlBsYXkoJTA4bHgsJTA4bHgsJTA4bHgpXG4iLAogCQl0aGlzLHJlc2VydmVkMSxyZXNlcnZlZDIsZmxhZ3MKIAkpOwogCXRoaXMtPnBsYXlwb3MgPSAwOwpAQCAtMjA2LDcgKzIwNyw3IEBACiB9CiAKIHN0YXRpYyBIUkVTVUxUIFdJTkFQSSBJRGlyZWN0U291bmRCdWZmZXJfU3RvcChMUERJUkVDVFNPVU5EQlVGRkVSIHRoaXMpIHsKLQlkcHJpbnRmX2Rzb3VuZChzdGRlcnIsIklEaXJlY3RTb3VuZEJ1ZmZlciglcCktPlN0b3AoKVxuIix0aGlzKTsKKwlkcHJpbnRmX2luZm8oZHNvdW5kLCJJRGlyZWN0U291bmRCdWZmZXIoJXApLT5TdG9wKClcbiIsdGhpcyk7CiAJdGhpcy0+cGxheWluZyA9IDA7CiAJdGhpcy0+d3JpdGVwb3MgPSAwOyAvKiBobW0gKi8KIAlyZXR1cm4gMDsKQEAgLTI0MCw3ICsyNDEsNyBAQAogc3RhdGljIEhSRVNVTFQgV0lOQVBJIElEaXJlY3RTb3VuZEJ1ZmZlcl9HZXRDdXJyZW50UG9zaXRpb24oCiAJTFBESVJFQ1RTT1VOREJVRkZFUiB0aGlzLExQRFdPUkQgcGxheXBvcyxMUERXT1JEIHdyaXRlcG9zCiApIHsKLQlkcHJpbnRmX2Rzb3VuZChzdGRlcnIsIklEaXJlY3RTb3VuZEJ1ZmZlciglcCktPkdldEN1cnJlbnRQb3NpdGlvbiglcCwlcCksc3R1YiFcbiIsdGhpcyxwbGF5cG9zLHdyaXRlcG9zKTsKKwlkcHJpbnRmX2ZpeG1lKGRzb3VuZCwiSURpcmVjdFNvdW5kQnVmZmVyKCVwKS0+R2V0Q3VycmVudFBvc2l0aW9uKCVwLCVwKVxuIix0aGlzLHBsYXlwb3Msd3JpdGVwb3MpOwogCWlmIChwbGF5cG9zKSAqcGxheXBvcyA9IHRoaXMtPnBsYXlwb3M7CiAJaWYgKHdyaXRlcG9zKSAqd3JpdGVwb3MgPSB0aGlzLT53cml0ZXBvczsKIAlyZXR1cm4gMDsKQEAgLTI0OSw3ICsyNTAsNyBAQAogc3RhdGljIEhSRVNVTFQgV0lOQVBJIElEaXJlY3RTb3VuZEJ1ZmZlcl9HZXRTdGF0dXMoCiAJTFBESVJFQ1RTT1VOREJVRkZFUiB0aGlzLExQRFdPUkQgc3RhdHVzCiApIHsKLQlkcHJpbnRmX2Rzb3VuZChzdGRlcnIsIklEaXJlY3RTb3VuZEJ1ZmZlciglcCktPkdldFN0YXR1cyglcClcbiIsdGhpcyxzdGF0dXMpOworCWRwcmludGZfaW5mbyhkc291bmQsIklEaXJlY3RTb3VuZEJ1ZmZlciglcCktPkdldFN0YXR1cyglcClcbiIsdGhpcyxzdGF0dXMpOwogCSpzdGF0dXMgPSAwOwogCWlmICh0aGlzLT5wbGF5aW5nKQogCQkqc3RhdHVzIHw9IERTQlNUQVRVU19QTEFZSU5HOwpAQCAtMjYxLDcgKzI2Miw3IEBACiBzdGF0aWMgSFJFU1VMVCBXSU5BUEkgSURpcmVjdFNvdW5kQnVmZmVyX0dldEZvcm1hdCgKIAlMUERJUkVDVFNPVU5EQlVGRkVSIHRoaXMsTFBXQVZFRk9STUFURVggbHB3ZixEV09SRCB3ZnNpemUsTFBEV09SRCB3ZndyaXR0ZW4KICkgewotCWRwcmludGZfZHNvdW5kKHN0ZGVyciwiSURpcmVjdFNvdW5kQnVmZmVyKCVwKS0+R2V0Rm9ybWF0KCVwLCVsZCwlcClcbiIsdGhpcyxscHdmLHdmc2l6ZSx3ZndyaXR0ZW4pOworCWRwcmludGZfaW5mbyhkc291bmQsIklEaXJlY3RTb3VuZEJ1ZmZlciglcCktPkdldEZvcm1hdCglcCwlbGQsJXApXG4iLHRoaXMsbHB3Zix3ZnNpemUsd2Z3cml0dGVuKTsKIAlpZiAod2ZzaXplPnNpemVvZih0aGlzLT53ZngpKSB3ZnNpemUgPSBzaXplb2YodGhpcy0+d2Z4KTsKIAltZW1jcHkobHB3ZiwmKHRoaXMtPndmeCksd2ZzaXplKTsKIAlpZiAod2Z3cml0dGVuKSAqd2Z3cml0dGVuID0gd2ZzaXplOwpAQCAtMjcyLDcgKzI3Myw3IEBACiAJTFBESVJFQ1RTT1VOREJVRkZFUiB0aGlzLERXT1JEIHdyaXRlY3Vyc29yLERXT1JEIHdyaXRlYnl0ZXMsTFBWT0lEIGxwbHBhdWRpb3B0cjEsTFBEV09SRCBhdWRpb2J5dGVzMSxMUFZPSUQgbHBscGF1ZGlvcHRyMixMUERXT1JEIGF1ZGlvYnl0ZXMyLERXT1JEIGZsYWdzCiApIHsKIAotCWRwcmludGZfZHNvdW5kKHN0ZGVyciwiSURpcmVjdFNvdW5kQnVmZmVyKCVwKS0+TG9jayglbGQsJWxkLCVwLCVwLCVwLCVwLDB4JTA4bHgpXG4iLAorCWRwcmludGZfaW5mbyhkc291bmQsIklEaXJlY3RTb3VuZEJ1ZmZlciglcCktPkxvY2soJWxkLCVsZCwlcCwlcCwlcCwlcCwweCUwOGx4KVxuIiwKIAkJdGhpcywKIAkJd3JpdGVjdXJzb3IsCiAJCXdyaXRlYnl0ZXMsCkBAIC0yOTMsNyArMjk0LDcgQEAKIAkJCSooTFBCWVRFKilscGxwYXVkaW9wdHIyID0gTlVMTDsKIAkJaWYgKGF1ZGlvYnl0ZXMyKQogCQkJKmF1ZGlvYnl0ZXMyID0gMDsKLQkJZHByaW50Zl9kc291bmQoc3RkZXJyLCItPiVsZC4wXG4iLHdyaXRlYnl0ZXMpOworCQlkcHJpbnRmX2luZm8oZHNvdW5kLCItPiVsZC4wXG4iLHdyaXRlYnl0ZXMpOwogCX0gZWxzZSB7CiAJCSooTFBCWVRFKilscGxwYXVkaW9wdHIxID0gdGhpcy0+YnVmZmVyK3dyaXRlY3Vyc29yOwogCQkqYXVkaW9ieXRlczEgPSB0aGlzLT5idWZsZW4td3JpdGVjdXJzb3I7CkBAIC0zMDEsNyArMzAyLDcgQEAKIAkJCSooTFBCWVRFKilscGxwYXVkaW9wdHIyID0gdGhpcy0+YnVmZmVyOwogCQlpZiAoYXVkaW9ieXRlczIpCiAJCQkqYXVkaW9ieXRlczIgPSB3cml0ZWJ5dGVzLSh0aGlzLT5idWZsZW4td3JpdGVjdXJzb3IpOwotCQlkcHJpbnRmX2Rzb3VuZChzdGRlcnIsIi0+JWxkLiVsZFxuIiwqYXVkaW9ieXRlczEsYXVkaW9ieXRlczI/KmF1ZGlvYnl0ZXMyOjApOworCQlkcHJpbnRmX2luZm8oZHNvdW5kLCItPiVsZC4lbGRcbiIsKmF1ZGlvYnl0ZXMxLGF1ZGlvYnl0ZXMyPyphdWRpb2J5dGVzMjowKTsKIAl9CiAJdGhpcy0+d3JpdGVwb3M9KHdyaXRlY3Vyc29yK3dyaXRlYnl0ZXMpJXRoaXMtPmJ1ZmxlbjsKIAlyZXR1cm4gMDsKQEAgLTMxMCw3ICszMTEsNyBAQAogc3RhdGljIEhSRVNVTFQgV0lOQVBJIElEaXJlY3RTb3VuZEJ1ZmZlcl9TZXRDdXJyZW50UG9zaXRpb24oCiAJTFBESVJFQ1RTT1VOREJVRkZFUiB0aGlzLERXT1JEIG5ld3BvcwogKSB7Ci0JZHByaW50Zl9kc291bmQoc3RkZXJyLCJJRGlyZWN0U291bmRCdWZmZXIoJXApLT5TZXRDdXJyZW50UG9zaXRpb24oJWxkKVxuIix0aGlzLG5ld3Bvcyk7CisJZHByaW50Zl9pbmZvKGRzb3VuZCwiSURpcmVjdFNvdW5kQnVmZmVyKCVwKS0+U2V0Q3VycmVudFBvc2l0aW9uKCVsZClcbiIsdGhpcyxuZXdwb3MpOwogCXRoaXMtPnBsYXlwb3MgPSBuZXdwb3M7CiAJcmV0dXJuIDA7CiB9CkBAIC0zMTgsNyArMzE5LDcgQEAKIHN0YXRpYyBIUkVTVUxUIFdJTkFQSSBJRGlyZWN0U291bmRCdWZmZXJfU2V0UGFuKAogCUxQRElSRUNUU09VTkRCVUZGRVIgdGhpcyxMT05HIG5ld3BhbgogKSB7Ci0JZHByaW50Zl9kc291bmQoc3RkZXJyLCJJRGlyZWN0U291bmRCdWZmZXIoJXApLT5TZXRQYW4oJWxkKSxzdHViIVxuIix0aGlzLG5ld3Bhbik7CisJZHByaW50Zl9maXhtZShkc291bmQsIklEaXJlY3RTb3VuZEJ1ZmZlciglcCktPlNldFBhbiglbGQpXG4iLHRoaXMsbmV3cGFuKTsKIAl0aGlzLT5wYW4gPSBuZXdwYW47CiAJcmV0dXJuIDA7CiB9CkBAIC0zMjYsNyArMzI3LDcgQEAKIHN0YXRpYyBIUkVTVUxUIFdJTkFQSSBJRGlyZWN0U291bmRCdWZmZXJfR2V0UGFuKAogCUxQRElSRUNUU09VTkRCVUZGRVIgdGhpcyxMUExPTkcgcGFuCiApIHsKLQlkcHJpbnRmX2Rzb3VuZChzdGRlcnIsIklEaXJlY3RTb3VuZEJ1ZmZlciglcCktPkdldFBhbiglcCksc3R1YiFcbiIsdGhpcyxwYW4pOworCWRwcmludGZfZml4bWUoZHNvdW5kLCJJRGlyZWN0U291bmRCdWZmZXIoJXApLT5HZXRQYW4oJXApXG4iLHRoaXMscGFuKTsKIAkqcGFuID0gdGhpcy0+cGFuOwogCXJldHVybiAwOwogfQpAQCAtMzM0LDcgKzMzNSw3IEBACiBzdGF0aWMgSFJFU1VMVCBXSU5BUEkgSURpcmVjdFNvdW5kQnVmZmVyX1VubG9jaygKIAlMUERJUkVDVFNPVU5EQlVGRkVSIHRoaXMsTFBWT0lEIHAxLERXT1JEIHgxLExQVk9JRCBwMixEV09SRCB4MgogKSB7Ci0JZHByaW50Zl9kc291bmQoc3RkZXJyLCJJRGlyZWN0U291bmRCdWZmZXIoJXApLT5VbmxvY2soJXAsJWxkLCVwLCVsZClcbiIsCisJZHByaW50Zl9pbmZvKGRzb3VuZCwiSURpcmVjdFNvdW5kQnVmZmVyKCVwKS0+VW5sb2NrKCVwLCVsZCwlcCwlbGQpXG4iLAogCQl0aGlzLHAxLHgxLHAyLHgyCiAJKTsKIAlyZXR1cm4gMDsKQEAgLTM0Myw3ICszNDQsNyBAQAogc3RhdGljIEhSRVNVTFQgV0lOQVBJIElEaXJlY3RTb3VuZEJ1ZmZlcl9HZXRGcmVxdWVuY3koCiAJTFBESVJFQ1RTT1VOREJVRkZFUiB0aGlzLExQRFdPUkQgZnJlcQogKSB7Ci0JZHByaW50Zl9kc291bmQoc3RkZXJyLCJJRGlyZWN0U291bmRCdWZmZXIoJXApLT5HZXRGcmVxdWVuY3koJXApXG4iLAorCWRwcmludGZfaW5mbyhkc291bmQsIklEaXJlY3RTb3VuZEJ1ZmZlciglcCktPkdldEZyZXF1ZW5jeSglcClcbiIsCiAJCXRoaXMsZnJlcQogCSk7CiAJKmZyZXEgPSB0aGlzLT53ZngublNhbXBsZXNQZXJTZWM7CkBAIC0zNTMsNyArMzU0LDcgQEAKIHN0YXRpYyBIUkVTVUxUIFdJTkFQSSBJRGlyZWN0U291bmRCdWZmZXJfSW5pdGlhbGl6ZSgKIAlMUERJUkVDVFNPVU5EQlVGRkVSIHRoaXMsTFBESVJFQ1RTT1VORCBkc291bmQsTFBEU0JVRkZFUkRFU0MgZGJzZAogKSB7Ci0JZnByaW50ZihzdGRlcnIsIklEaXJlY3RTb3VuZEJ1ZmZlciglcCktPkluaXRpYWxpemUoJXAsJXApLHN0dWIhXG4iLHRoaXMsZHNvdW5kLGRic2QpOworCWZwcmludGYoc3RkZXJyLCJJRGlyZWN0U291bmRCdWZmZXIoJXApLT5Jbml0aWFsaXplKCVwLCVwKVxuIix0aGlzLGRzb3VuZCxkYnNkKTsKIAlyZXR1cm4gRFNFUlJfQUxSRUFEWUlOSVRJQUxJWkVEOwogfQogCkBAIC0zODQsNyArMzg1LDcgQEAKIAkJKnBwb2JqID0gKExQVk9JRClkc247CiAJCXJldHVybiAwOwogCX0KLQlTdHJpbmdGcm9tQ0xTSUQocmlpZCx4YnVmKTsKKwlXSU5FX1N0cmluZ0Zyb21DTFNJRChyaWlkLHhidWYpOwogCWZwcmludGYoc3RkZXJyLCJJRGlyZWN0U291bmRCdWZmZXIoJXApLT5RdWVyeUludGVyZmFjZSglcywlcClcbiIsdGhpcyx4YnVmLHBwb2JqKTsKIAlyZXR1cm4gRV9GQUlMOwogfQpAQCAtNDE5LDcgKzQyMCw3IEBACiBzdGF0aWMgSFJFU1VMVCBXSU5BUEkgSURpcmVjdFNvdW5kX1NldENvb3BlcmF0aXZlTGV2ZWwoCiAJTFBESVJFQ1RTT1VORCB0aGlzLEhXTkQzMiBod25kLERXT1JEIGxldmVsCiApIHsKLQlkcHJpbnRmX2Rzb3VuZChzdGRlcnIsIklEaXJlY3RTb3VuZCglcCktPlNldENvb3BlcmF0aXZlTGV2ZWwoJTA4bHgsJWxkKVxuIiwKKwlkcHJpbnRmX2luZm8oZHNvdW5kLCJJRGlyZWN0U291bmQoJXApLT5TZXRDb29wZXJhdGl2ZUxldmVsKCUwOGx4LCVsZClcbiIsCiAJCXRoaXMsKERXT1JEKWh3bmQsbGV2ZWwKIAkpOwogCXJldHVybiAwOwpAQCAtNDI5LDggKzQzMCw4IEBACiBzdGF0aWMgSFJFU1VMVCBXSU5BUEkgSURpcmVjdFNvdW5kX0NyZWF0ZVNvdW5kQnVmZmVyKAogCUxQRElSRUNUU09VTkQgdGhpcyxMUERTQlVGRkVSREVTQyBkc2JkLExQTFBESVJFQ1RTT1VOREJVRkZFUiBwcGRzYixMUFVOS05PV04gbHB1bmsKICkgewotCWlmIChkZWJ1Z2dpbmdfZHNvdW5kKSB7Ci0JCWZwcmludGYoc3RkZXJyLCJJRGlyZWN0U291bmQoJXApLT5DcmVhdGVTb3VuZEJ1ZmZlciglcCwlcCwlcCksc3R1YiFcbiIsdGhpcyxkc2JkLHBwZHNiLGxwdW5rKTsKKwlpZiAoZGVidWdnaW5nX2luZm8oZHNvdW5kKSkgeworCQlmcHJpbnRmKHN0ZGVyciwiSURpcmVjdFNvdW5kKCVwKS0+Q3JlYXRlU291bmRCdWZmZXIoJXAsJXAsJXApXG4iLHRoaXMsZHNiZCxwcGRzYixscHVuayk7CiAJCWZwcmludGYoc3RkZXJyLCJbc2l6ZT0lbGQsIixkc2JkLT5kd1NpemUpOwogCQlmcHJpbnRmKHN0ZGVyciwiZmxhZ3MgPSAweCUwOGx4LCIsZHNiZC0+ZHdGbGFncyk7CiAJCV9kdW1wX0RTQkNBUFMoZHNiZC0+ZHdGbGFncyk7CkBAIC00NDYsNiArNDQ3LDcgQEAKIAkoKnBwZHNiKS0+bHB2dGJsID0gJmRzYnZ0OwogCSgqcHBkc2IpLT5kc291bmQgPSB0aGlzOwogCSgqcHBkc2IpLT5wbGF5aW5nID0gMDsKKwkoKnBwZHNiKS0+dm9sZmFjID0gMS4wOwogCW1lbWNweSgmKCgqcHBkc2IpLT5kc2JkKSxkc2JkLHNpemVvZigqZHNiZCkpOwogCiAJLyogcmVnaXN0ZXIgYnVmZmVyICovCkBAIC00NjEsNyArNDYzLDcgQEAKIHN0YXRpYyBIUkVTVUxUIFdJTkFQSSBJRGlyZWN0U291bmRfRHVwbGljYXRlU291bmRCdWZmZXIoCiAJTFBESVJFQ1RTT1VORCB0aGlzLExQRElSRUNUU09VTkRCVUZGRVIgcGRzYixMUExQRElSRUNUU09VTkRCVUZGRVIgcHBkc2IKICkgewotCWZwcmludGYoc3RkZXJyLCJJRGlyZWN0U291bmQoJXApLT5EdXBsaWNhdGVTb3VuZEJ1ZmZlciglcCwlcCksc3R1YiFcbiIsdGhpcyxwZHNiLHBwZHNiKTsKKwlkcHJpbnRmX2ZpeG1lKGRzb3VuZCwiSURpcmVjdFNvdW5kKCVwKS0+RHVwbGljYXRlU291bmRCdWZmZXIoJXAsJXApXG4iLHRoaXMscGRzYixwcGRzYik7CiAKIAkqcHBkc2IgPSAoTFBESVJFQ1RTT1VOREJVRkZFUilIZWFwQWxsb2MoR2V0UHJvY2Vzc0hlYXAoKSxIRUFQX1pFUk9fTUVNT1JZLHNpemVvZihJRGlyZWN0U291bmRCdWZmZXIpKTsKIAkoKnBwZHNiKS0+cmVmID0xOwpAQCAtNDgzLDggKzQ4NSw4IEBACiAKIAogc3RhdGljIEhSRVNVTFQgV0lOQVBJIElEaXJlY3RTb3VuZF9HZXRDYXBzKExQRElSRUNUU09VTkQgdGhpcyxMUERTQ0FQUyBjYXBzKSB7Ci0JZnByaW50ZihzdGRlcnIsIklEaXJlY3RTb3VuZCglcCktPkdldENhcHMoJXApLHN0dWIhXG4iLHRoaXMsY2Fwcyk7Ci0JZnByaW50ZihzdGRlcnIsIglmbGFncyA9IDB4JTA4bHhcbiIsY2Fwcy0+ZHdGbGFncyk7CisJZHByaW50Zl9maXhtZShkc291bmQsIklEaXJlY3RTb3VuZCglcCktPkdldENhcHMoJXApXG4iLHRoaXMsY2Fwcyk7CisJZHByaW50Zl9maXhtZShkc291bmQsIglmbGFncyA9IDB4JTA4bHhcbiIsY2Fwcy0+ZHdGbGFncyk7CiAKIAljYXBzLT5kd1NpemUgPSBzaXplb2YoKmNhcHMpOwogCWNhcHMtPmR3RmxhZ3MgPSBEU0NBUFNfUFJJTUFSWVNURVJFT3xEU0NBUFNfUFJJTUFSWTE2QklUfERTQ0FQU19FTVVMRFJJVkVSfERTQ0FQU19TRUNPTkRBUllTVEVSRU98RFNDQVBTX1NFQ09OREFSWTE2QklUOwpAQCAtNTIyLDcgKzUyNCw3IEBACiApIHsKIAljaGFyIHhidWZbNTBdOwogCi0JU3RyaW5nRnJvbUNMU0lEKHJpaWQseGJ1Zik7CisJV0lORV9TdHJpbmdGcm9tQ0xTSUQocmlpZCx4YnVmKTsKIAlmcHJpbnRmKHN0ZGVyciwiSURpcmVjdFNvdW5kKCVwKS0+UXVlcnlJbnRlcmZhY2UoJXMsJXApXG4iLHRoaXMseGJ1ZixwcG9iaik7CiAJcmV0dXJuIEVfRkFJTDsKIH0KQEAgLTU0NSwxNCArNTQ3LDE5IEBACiBEU09VTkRfc2V0Zm9ybWF0KExQV0FWRUZPUk1BVEVYIHdmZXgpIHsKIAlpbnQJeHgsY2hhbm5lbHMsc3BlZWQsZm9ybWF0LG5mb3JtYXQ7CiAKKwogCXN3aXRjaCAod2ZleC0+d0Zvcm1hdFRhZykgewogCWRlZmF1bHQ6CiAJCWZwcmludGYoc3RkZXJyLCJ1bmtub3duIFdBVkVfRk9STUFUIHRhZyAlZFxuIix3ZmV4LT53Rm9ybWF0VGFnKTsKIAkJcmV0dXJuIERTRVJSX0JBREZPUk1BVDsKIAljYXNlIFdBVkVfRk9STUFUX1BDTToKLQkJZm9ybWF0ID0gQUZNVF9TMTZfTEU7CiAJCWJyZWFrOwogCX0KKwlpZiAod2ZleC0+d0JpdHNQZXJTYW1wbGU9PTgpCisJCWZvcm1hdCA9IEFGTVRfVTg7CisJZWxzZQorCQlmb3JtYXQgPSBBRk1UX1MxNl9MRTsKKwogCWlmICgtMT09aW9jdGwoYXVkaW9mZCxTTkRDVExfRFNQX0dFVEZNVFMsJnh4KSkgewogCQlwZXJyb3IoImlvY3RsIFNORENUTF9EU1BfR0VURk1UUyIpOwogCQlyZXR1cm4gLTE7CkBAIC01ODEsNiArNTg4LDkgQEAKIAkJcGVycm9yKCJpb2N0bCBTTkRDVExfRFNQX1NQRUVEIik7CiAJCXJldHVybiAtMTsKIAl9CisJZnByaW50ZihzdGRlcnIsImZyZXEgJWxkIGNoYW5uZWxzICVkIGJpdHMgJWRcbiIsCisJCXdmZXgtPm5TYW1wbGVzUGVyU2VjLHdmZXgtPm5DaGFubmVscyx3ZmV4LT53Qml0c1BlclNhbXBsZQorCSk7CiAJcmV0dXJuIDA7CiB9CiAKQEAgLTYxMCw2OCArNjIwLDEzNyBAQAogCiBzdGF0aWMgdm9pZCAKIERTT1VORF9NaXhJbkJ1ZmZlcihJRGlyZWN0U291bmRCdWZmZXIgKmRzYikgewotCWludAlpLGosYnVmbGVuID0gZHNiLT5idWZsZW47CisJaW50CWosYnVmbGVuID0gZHNiLT5idWZsZW47CiAJTFBEU0JQT1NJVElPTk5PVElGWQluZXh0ZXZlbnQ7CisJaW50CXhkaWZmID0gZHNiLT53ZngublNhbXBsZXNQZXJTZWMtZHNvdW5kLT53ZngublNhbXBsZXNQZXJTZWM7CisJZG91YmxlCXZvbGZhYyA9IGRzYi0+dm9sZmFjOwogCi0JaWYgKGRzYi0+d2Z4Lm5TYW1wbGVzUGVyU2VjICE9IGRzb3VuZC0+d2Z4Lm5TYW1wbGVzUGVyU2VjKSB7Ci0JCWZwcmludGYoc3RkZXJyLCJtaXhpbmcgaW4gYnVmZmVyIG9mIGRpZmZlcmVudCBmcmVxdWVuY3ksIGFyZ2ghXG4iKTsKKwlpZiAoeGRpZmY8MCkgeGRpZmY9LXhkaWZmOworCWlmICh4ZGlmZj4xNTAwKSB7CisJCWZwcmludGYoc3RkZXJyLCJtaXhpbmcgaW4gYnVmZmVyIG9mIGRpZmZlcmVudCBmcmVxdWVuY3kgKCVsZCB2cyAlbGQpLCBhcmdoIVxuIixkc2ItPndmeC5uU2FtcGxlc1BlclNlYyxkc291bmQtPndmeC5uU2FtcGxlc1BlclNlYyk7CiAJfQogCW5leHRldmVudCA9IERTT1VORF9uZXh0ZXZlbnQoZHNiKTsKKy8qCWZwcmludGYoc3RkZXJyLCIlZC4lZC4lZC4lZFxuIixkc291bmQtPndmeC53Qml0c1BlclNhbXBsZSxkc2ItPndmeC53Qml0c1BlclNhbXBsZSxkc291bmQtPndmeC5uQ2hhbm5lbHMsZHNiLT53ZngubkNoYW5uZWxzKTsqLwogCi0JaWYgKGRzYi0+d2Z4LndCaXRzUGVyU2FtcGxlID09IDgpIHsKLQkJdW5zaWduZWQgY2hhcgkqeGJ1ZiA9ICh1bnNpZ25lZCBjaGFyKikoZHNiLT5idWZmZXIpOwotCQlpZiAoZHNiLT53ZngubkNoYW5uZWxzID09IDEpIHsKLQkJCWZvciAoaj0wO2o8c2l6ZW9mKHBsYXlidWYpL3NpemVvZihwbGF5YnVmWzBdKS8yO2orKykgewotCQkJCWRzYi0+cGxheXBvcz0oZHNiLT5wbGF5cG9zKzEpJWJ1ZmxlbjsKLQkJCQlpZiAoIWRzYi0+cGxheXBvcyAmJiAhKGRzYi0+cGxheWZsYWdzJkRTQlBMQVlfTE9PUElORykpIHsKLQkJCQkJZHNiLT5wbGF5aW5nID0gMDsKLQkJCQkJZHNiLT5wbGF5cG9zID0gYnVmbGVuOwotCQkJCQlyZXR1cm47CisJaWYgKGRzb3VuZC0+d2Z4LndCaXRzUGVyU2FtcGxlID09IDgpIHsKKwkJY2hhcgkqcGxheWJ1ZjggPSAoY2hhciopcGxheWJ1ZjsKKworCQlpZiAoZHNiLT53Zngud0JpdHNQZXJTYW1wbGUgPT0gOCkgeworCQkJdW5zaWduZWQgY2hhcgkqeGJ1ZiA9ICh1bnNpZ25lZCBjaGFyKikoZHNiLT5idWZmZXIpOworCQkJaWYgKGRzYi0+d2Z4Lm5DaGFubmVscyA9PSAxKSB7CisJCQkJZm9yIChqPTA7ajxzaXplb2YocGxheWJ1ZikvMjtqKyspIHsKKwkJCQorCQkJCQlkc2ItPnBsYXlwb3M9KGRzYi0+cGxheXBvcysxKSVidWZsZW47CisJCQkJCWlmICghZHNiLT5wbGF5cG9zICYmICEoZHNiLT5wbGF5ZmxhZ3MmRFNCUExBWV9MT09QSU5HKSkgeworCQkJCQkJZHNiLT5wbGF5aW5nID0gMDsKKwkJCQkJCWRzYi0+cGxheXBvcyA9IGJ1ZmxlbjsKKwkJCQkJCXJldHVybjsKKwkJCQkJfQorCQkJCQkvKiBGSVhNRTogcGFuLHZvbHVtZSAqLworCQkJCQlwbGF5YnVmOFsoajw8MSkgIF0rPXhidWZbZHNiLT5wbGF5cG9zXSp2b2xmYWM7CisJCQkJCXBsYXlidWY4WyhqPDwxKSsxXSs9eGJ1Zltkc2ItPnBsYXlwb3NdKnZvbGZhYzsKKwkJCQkJQ0hFQ0tfRVZFTlQKIAkJCQl9Ci0JCQkJLyogRklYTUU6IHBhbix2b2x1bWUgKi8KLQkJCQlwbGF5YnVmWyhqPDwxKSAgXSs9eGJ1Zltkc2ItPnBsYXlwb3NdPDw4OwotCQkJCXBsYXlidWZbKGo8PDEpKzFdKz14YnVmW2RzYi0+cGxheXBvc108PDg7Ci0JCQkJQ0hFQ0tfRVZFTlQKKwkJCX0gZWxzZSB7CisJCQkJZm9yIChqPTA7ajxzaXplb2YocGxheWJ1Zik7aisrKSB7CisJCQkJCWRzYi0+cGxheXBvcz0oZHNiLT5wbGF5cG9zKzEpJWJ1ZmxlbjsKKwkJCQkJaWYgKCFkc2ItPnBsYXlwb3MgJiYgIShkc2ItPnBsYXlmbGFncyZEU0JQTEFZX0xPT1BJTkcpKSB7CisJCQkJCQlkc2ItPnBsYXlpbmcgPSAwOworCQkJCQkJZHNiLT5wbGF5cG9zID0gYnVmbGVuOworCQkJCQkJcmV0dXJuOworCQkJCQl9CisJCQkJCS8qIEZJWE1FOiBwYW4sdm9sdW1lICovCisJCQkJCXBsYXlidWY4W2pdKz14YnVmW2RzYi0+cGxheXBvc10qdm9sZmFjOworCQkJCQlDSEVDS19FVkVOVAorCQkJCX0KIAkJCX0KLQkJfSBlbHNlIHsKLQkJCWZvciAoaj0wO2o8c2l6ZW9mKHBsYXlidWYpL3NpemVvZihwbGF5YnVmWzBdKTtqKyspIHsKLQkJCQlkc2ItPnBsYXlwb3M9KGRzYi0+cGxheXBvcysxKSVidWZsZW47Ci0JCQkJaWYgKCFkc2ItPnBsYXlwb3MgJiYgIShkc2ItPnBsYXlmbGFncyZEU0JQTEFZX0xPT1BJTkcpKSB7Ci0JCQkJCWRzYi0+cGxheWluZyA9IDA7Ci0JCQkJCWRzYi0+cGxheXBvcyA9IGJ1ZmxlbjsKLQkJCQkJcmV0dXJuOworCQl9IGVsc2UgeyAvKiAxNiAqLworCQkJc2hvcnQJKnhidWYgPSAoc2hvcnQqKShkc2ItPmJ1ZmZlcik7CisJCQlpZiAoZHNiLT53ZngubkNoYW5uZWxzID09IDEpIHsKKwkJCQlmb3IgKGo9MDtqPHNpemVvZihwbGF5YnVmKS8yO2orKykgeworCQkJCQlkc2ItPnBsYXlwb3M9KGRzYi0+cGxheXBvcysyKSVidWZsZW47CisJCQkJCWlmICghZHNiLT5wbGF5cG9zICYmICEoZHNiLT5wbGF5ZmxhZ3MmRFNCUExBWV9MT09QSU5HKSkgeworCQkJCQkJZHNiLT5wbGF5aW5nID0gMDsKKwkJCQkJCWRzYi0+cGxheXBvcyA9IGJ1ZmxlbjsKKwkJCQkJCXJldHVybjsKKwkJCQkJfQorCQkJCQkvKiBGSVhNRTogcGFuLHZvbHVtZSAqLworCQkJCQlwbGF5YnVmOFsoajw8MSkgIF0rPSh4YnVmW2RzYi0+cGxheXBvcz4+MV0+PjgpKnZvbGZhYzsKKwkJCQkJcGxheWJ1ZjhbKGo8PDEpKzFdKz0oeGJ1Zltkc2ItPnBsYXlwb3M+PjFdPj44KSp2b2xmYWM7CisJCQkJCUNIRUNLX0VWRU5UCiAJCQkJfQotCQkJCS8qIEZJWE1FOiBwYW4sdm9sdW1lICovCi0JCQkJcGxheWJ1ZltqXSs9eGJ1Zltkc2ItPnBsYXlwb3NdPDw4OwotCQkJCUNIRUNLX0VWRU5UCisJCQl9IGVsc2UgeworCQkJCWZvciAoaj0wO2o8c2l6ZW9mKHBsYXlidWYpO2orKykgeworCQkJCQlkc2ItPnBsYXlwb3M9KGRzYi0+cGxheXBvcysyKSVidWZsZW47CisJCQkJCWlmICghZHNiLT5wbGF5cG9zICYmICEoZHNiLT5wbGF5ZmxhZ3MmRFNCUExBWV9MT09QSU5HKSkgeworCQkJCQkJZHNiLT5wbGF5aW5nID0gMDsKKwkJCQkJCWRzYi0+cGxheXBvcyA9IGJ1ZmxlbjsKKwkJCQkJCXJldHVybjsKKwkJCQkJfQorCQkJCQkvKiBGSVhNRTogcGFuLHZvbHVtZSAqLworCQkJCQlwbGF5YnVmOFtqXSs9KHhidWZbZHNiLT5wbGF5cG9zPj4xXT4+OCkqdm9sZmFjOworCQkJCQlDSEVDS19FVkVOVAorCQkJCX0KIAkJCX0KIAkJfQotCX0gZWxzZSB7IC8qIDE2ICovCi0JCXNob3J0CSp4YnVmID0gKHNob3J0KikoZHNiLT5idWZmZXIpOwotCQlpZiAoZHNiLT53ZngubkNoYW5uZWxzID09IDEpIHsKLQkJCWZvciAoaj0wO2o8c2l6ZW9mKHBsYXlidWYpL3NpemVvZihwbGF5YnVmWzBdKS8yO2orKykgewotCQkJCWRzYi0+cGxheXBvcz0oZHNiLT5wbGF5cG9zKzIpJWJ1ZmxlbjsKLQkJCQlpZiAoIWRzYi0+cGxheXBvcyAmJiAhKGRzYi0+cGxheWZsYWdzJkRTQlBMQVlfTE9PUElORykpIHsKLQkJCQkJZHNiLT5wbGF5aW5nID0gMDsKLQkJCQkJZHNiLT5wbGF5cG9zID0gYnVmbGVuOwotCQkJCQlyZXR1cm47CisJfSBlbHNlIHsgLyogMTYgYml0ICovCisJCWlmIChkc2ItPndmeC53Qml0c1BlclNhbXBsZSA9PSA4KSB7CisJCQl1bnNpZ25lZCBjaGFyCSp4YnVmID0gKHVuc2lnbmVkIGNoYXIqKShkc2ItPmJ1ZmZlcik7CisJCQlpZiAoZHNiLT53ZngubkNoYW5uZWxzID09IDEpIHsKKwkJCQlmb3IgKGo9MDtqPHNpemVvZihwbGF5YnVmKS9zaXplb2YocGxheWJ1ZlswXSkvMjtqKyspIHsKKwkJCQkJZHNiLT5wbGF5cG9zPShkc2ItPnBsYXlwb3MrMSklYnVmbGVuOworCQkJCQlpZiAoIWRzYi0+cGxheXBvcyAmJiAhKGRzYi0+cGxheWZsYWdzJkRTQlBMQVlfTE9PUElORykpIHsKKwkJCQkJCWRzYi0+cGxheWluZyA9IDA7CisJCQkJCQlkc2ItPnBsYXlwb3MgPSBidWZsZW47CisJCQkJCQlyZXR1cm47CisJCQkJCX0KKwkJCQkJLyogRklYTUU6IHBhbix2b2x1bWUgKi8KKwkJCQkJLyogRklYTUU6IHNob3VsZCBiZSAqMjU2ICovCisJCQkJCXBsYXlidWZbKGo8PDEpICBdKz0oeGJ1Zltkc2ItPnBsYXlwb3NdPDw3KSp2b2xmYWM7CisJCQkJCXBsYXlidWZbKGo8PDEpKzFdKz0oeGJ1Zltkc2ItPnBsYXlwb3NdPDw3KSp2b2xmYWM7CisJCQkJCUNIRUNLX0VWRU5UCiAJCQkJfQotCQkJCS8qIEZJWE1FOiBwYW4sdm9sdW1lICovCi0JCQkJcGxheWJ1Zlsoajw8MSkgIF0rPXhidWZbZHNiLT5wbGF5cG9zPj4xXTsKLQkJCQlwbGF5YnVmWyhqPDwxKSsxXSs9eGJ1Zltkc2ItPnBsYXlwb3M+PjFdOwotCQkJCUNIRUNLX0VWRU5UCisJCQl9IGVsc2UgeworCQkJCWZvciAoaj0wO2o8c2l6ZW9mKHBsYXlidWYpL3NpemVvZihwbGF5YnVmWzBdKTtqKyspIHsKKwkJCQkJZHNiLT5wbGF5cG9zPShkc2ItPnBsYXlwb3MrMSklYnVmbGVuOworCQkJCQlpZiAoIWRzYi0+cGxheXBvcyAmJiAhKGRzYi0+cGxheWZsYWdzJkRTQlBMQVlfTE9PUElORykpIHsKKwkJCQkJCWRzYi0+cGxheWluZyA9IDA7CisJCQkJCQlkc2ItPnBsYXlwb3MgPSBidWZsZW47CisJCQkJCQlyZXR1cm47CisJCQkJCX0KKwkJCQkJLyogRklYTUU6IHBhbix2b2x1bWUgKi8KKwkJCQkJLyogRklYTUU6IHNob3VsZCBiZSAqMjU2ICovCisJCQkJCXBsYXlidWZbal0rPSh4YnVmW2RzYi0+cGxheXBvc108PDcpKnZvbGZhYzsKKwkJCQkJQ0hFQ0tfRVZFTlQKKwkJCQl9CiAJCQl9Ci0JCX0gZWxzZSB7Ci0JCQlmb3IgKGo9MDtqPHNpemVvZihwbGF5YnVmKS9zaXplb2YocGxheWJ1ZlswXSk7aisrKSB7Ci0JCQkJZHNiLT5wbGF5cG9zPShkc2ItPnBsYXlwb3MrMiklYnVmbGVuOwotCQkJCWlmICghZHNiLT5wbGF5cG9zICYmICEoZHNiLT5wbGF5ZmxhZ3MmRFNCUExBWV9MT09QSU5HKSkgewotCQkJCQlkc2ItPnBsYXlpbmcgPSAwOwotCQkJCQlkc2ItPnBsYXlwb3MgPSBidWZsZW47Ci0JCQkJCXJldHVybjsKKwkJfSBlbHNlIHsgLyogMTYgKi8KKwkJCXNob3J0CSp4YnVmID0gKHNob3J0KikoZHNiLT5idWZmZXIpOworCQkJaWYgKGRzYi0+d2Z4Lm5DaGFubmVscyA9PSAxKSB7CisJCQkJZm9yIChqPTA7ajxzaXplb2YocGxheWJ1Zikvc2l6ZW9mKHBsYXlidWZbMF0pLzI7aisrKSB7CisJCQkJCWRzYi0+cGxheXBvcz0oZHNiLT5wbGF5cG9zKzIpJWJ1ZmxlbjsKKwkJCQkJaWYgKCFkc2ItPnBsYXlwb3MgJiYgIShkc2ItPnBsYXlmbGFncyZEU0JQTEFZX0xPT1BJTkcpKSB7CisJCQkJCQlkc2ItPnBsYXlpbmcgPSAwOworCQkJCQkJZHNiLT5wbGF5cG9zID0gYnVmbGVuOworCQkJCQkJcmV0dXJuOworCQkJCQl9CisJCQkJCS8qIEZJWE1FOiBwYW4sdm9sdW1lICovCisJCQkJCXBsYXlidWZbKGo8PDEpICBdKz0oeGJ1Zltkc2ItPnBsYXlwb3M+PjFdKnZvbGZhYyk7CisJCQkJCXBsYXlidWZbKGo8PDEpKzFdKz0oeGJ1Zltkc2ItPnBsYXlwb3M+PjFdKnZvbGZhYyk7CisJCQkJCUNIRUNLX0VWRU5UCiAJCQkJfQotCQkJCS8qIEZJWE1FOiBwYW4sdm9sdW1lICovCi0JCQkJcGxheWJ1ZltqXSs9eGJ1Zltkc2ItPnBsYXlwb3M+PjFdOwotCQkJCUNIRUNLX0VWRU5UCisJCQl9IGVsc2UgeworCQkJCWZvciAoaj0wO2o8c2l6ZW9mKHBsYXlidWYpL3NpemVvZihwbGF5YnVmWzBdKTtqKyspIHsKKwkJCQkJZHNiLT5wbGF5cG9zPShkc2ItPnBsYXlwb3MrMiklYnVmbGVuOworCQkJCQlpZiAoIWRzYi0+cGxheXBvcyAmJiAhKGRzYi0+cGxheWZsYWdzJkRTQlBMQVlfTE9PUElORykpIHsKKwkJCQkJCWRzYi0+cGxheWluZyA9IDA7CisJCQkJCQlkc2ItPnBsYXlwb3MgPSBidWZsZW47CisJCQkJCQlyZXR1cm47CisJCQkJCX0KKwkJCQkJLyogRklYTUU6IHBhbix2b2x1bWUgKi8KKwkJCQkJcGxheWJ1ZltqXSs9eGJ1Zltkc2ItPnBsYXlwb3M+PjFdKnZvbGZhYzsKKwkJCQkJQ0hFQ0tfRVZFTlQKKwkJCQl9CiAJCQl9CiAJCX0KIAl9CkBAIC02NzksMTcgKzc1OCwyMCBAQAogCiBzdGF0aWMgRFdPUkQKIERTT1VORF90aHJlYWQoTFBWT0lEIGFyZykgewotCWludAlmcmFnc2RpZmYscmVzLGksY3VybGVmdCxwbGF5aW5nOworCWludAlyZXMsaSxjdXJsZWZ0LHBsYXlpbmcsaGF2ZXByaW1hcnkgPSAwOwogCXN0cnVjdCBhdWRpb19idWZfaW5mbwlhYmk7CiAKIAlmcHJpbnRmKHN0ZGVyciwiZHNvdW5kIGlzIGF0IHBpZCAlZFxuIixnZXRwaWQoKSk7CiAJaW9jdGwoYXVkaW9mZCxTTkRDVExfRFNQX0dFVE9TUEFDRSwmYWJpKTsKLQlmcmFnc2RpZmYgPSBhYmkuZnJhZ3N0b3RhbC1hYmkuZnJhZ21lbnRzOwogCXdoaWxlICgxKSB7CiAJCWlmICghZHNvdW5kKSB7CiAJCQlmcHJpbnRmKHN0ZGVyciwiRFNPVU5EIHRocmVhZCBnaXZpbmcgdXAuXG4iKTsKIAkJCUV4aXRUaHJlYWQoMCk7CiAJCX0KKwkJaWYgKGdldHBwaWQoKT09MSkgeworCQkJZnByaW50ZihzdGRlcnIsIkRTT1VORCBmYXRoZXIgZGllZD8gR2l2aW5nIHVwLlxuIik7CisJCQlFeGl0VGhyZWFkKDApOworCQl9CiAJCS8qIFJBQ0U6IGRzb3VuZCBjb3VsZCBiZSBkZWxldGVkICovCiAJCWRzb3VuZC0+bHB2dGJsLT5mbkFkZFJlZihkc291bmQpOwogCQlpZiAoIWRzb3VuZC0+bnJvZmJ1ZmZlcnMpIHsKQEAgLTY5OCwyMCArNzgwLDE3IEBACiAJCQljb250aW51ZTsKIAkJfQogCQltZW1zZXQocGxheWJ1ZiwwLHNpemVvZihwbGF5YnVmKSk7Ci0JCS8qIGVtcHR5IGluIG1lbW9yeSBzb3VuZGJ1ZmZlcnMgKi8KLQkJd2hpbGUgKDEpIHsKLQkJCWlvY3RsKGF1ZGlvZmQsU05EQ1RMX0RTUF9HRVRPU1BBQ0UsJmFiaSk7Ci0JCQlpZiAoYWJpLmZyYWdzdG90YWwtYWJpLmZyYWdtZW50czw9ZnJhZ3NkaWZmK2N1cnJlbnRfYnVmZmVyZWRfZnJhZ3MpCi0JCQkJYnJlYWs7Ci0JCQlTbGVlcCgxKTsKLQkJfQogCQlwbGF5aW5nID0gMDsKIAkJZHNvdW5kLT5scHZ0YmwtPmZuQWRkUmVmKGRzb3VuZCk7IAorCQloYXZlcHJpbWFyeSA9IDA7CiAJCWZvciAoaT1kc291bmQtPm5yb2ZidWZmZXJzO2ktLTspIHsKIAkJCUlEaXJlY3RTb3VuZEJ1ZmZlcgkqZHNiID0gZHNvdW5kLT5idWZmZXJzW2ldOwogCiAJCQlkc2ItPmxwdnRibC0+Zm5BZGRSZWYoZHNiKTsKKwkJCWlmIChkc2ItPnBsYXlpbmcgJiYgZHNiLT5idWZsZW4pCisJCQkJcGxheWluZysrOwogCQkJaWYgKGRzYi0+ZHNiZC5kd0ZsYWdzICYgRFNCQ0FQU19QUklNQVJZQlVGRkVSKSB7CisJCQkJaGF2ZXByaW1hcnkgPSAxOwogCQkJCWlmIChtZW1jbXAoJmRzb3VuZC0+d2Z4LCYoZHNiLT53ZngpLHNpemVvZihkc291bmQtPndmeCkpKSB7CiAJCQkJCURTT1VORF9zZXRmb3JtYXQoJihkc2ItPndmeCkpOwogCQkJCQltZW1jcHkoJmRzb3VuZC0+d2Z4LCYoZHNiLT53ZngpLHNpemVvZihkc2ItPndmeCkpOwpAQCAtNzE5LDYgKzc5OCwyMSBAQAogCQkJfQogCQkJZHNiLT5scHZ0YmwtPmZuUmVsZWFzZShkc2IpOwogCQl9CisJCS8qIFdlIGhhdmUganVzdCBvbmUgcGxheWJ1ZmZlciwgc28gdXNlIGl0cyBmb3JtYXQgKi8KKwkJaWYgKChwbGF5aW5nPT0xKSAmJiAhaGF2ZXByaW1hcnkpIHsKKwkJCWZvciAoaT1kc291bmQtPm5yb2ZidWZmZXJzO2ktLTspIHsKKwkJCQlJRGlyZWN0U291bmRCdWZmZXIJKmRzYiA9IGRzb3VuZC0+YnVmZmVyc1tpXTsKKworCQkJCWRzYi0+bHB2dGJsLT5mbkFkZFJlZihkc2IpOworCQkJCWlmIChkc2ItPnBsYXlpbmcgJiYgZHNiLT5idWZsZW4pIHsKKwkJCQkJaWYgKG1lbWNtcCgmZHNvdW5kLT53ZngsJihkc2ItPndmeCksc2l6ZW9mKGRzb3VuZC0+d2Z4KSkpIHsKKwkJCQkJCURTT1VORF9zZXRmb3JtYXQoJihkc2ItPndmeCkpOworCQkJCQkJbWVtY3B5KCZkc291bmQtPndmeCwmKGRzYi0+d2Z4KSxzaXplb2YoZHNiLT53ZngpKTsKKwkJCQkJfQorCQkJCX0KKwkJCQlkc2ItPmxwdnRibC0+Zm5SZWxlYXNlKGRzYik7CisJCQl9CisJCX0KIAkJZm9yIChpPWRzb3VuZC0+bnJvZmJ1ZmZlcnM7aS0tOykgewogCQkJSURpcmVjdFNvdW5kQnVmZmVyCSpkc2IgPSBkc291bmQtPmJ1ZmZlcnNbaV07CiAKQEAgLTczMywxMiArODI3LDYgQEAKIAogCQkvKmZwdXRjKCcwJytwbGF5aW5nLHN0ZGVycik7Ki8KIAkJY3VybGVmdCA9IDA7Ci0JCWlvY3RsKGF1ZGlvZmQsU05EQ1RMX0RTUF9HRVRPU1BBQ0UsJmFiaSk7Ci0JCWlmICgoYWJpLmZyYWdzdG90YWwtYWJpLmZyYWdtZW50cyk8PTErZnJhZ3NkaWZmKSB7Ci0JCQljdXJyZW50X2J1ZmZlcmVkX2ZyYWdzKys7Ci0JCX0gZWxzZSBpZiAoKGFiaS5mcmFnc3RvdGFsLWFiaS5mcmFnbWVudHMpPjIrZnJhZ3NkaWZmKSB7Ci0JCQljdXJyZW50X2J1ZmZlcmVkX2ZyYWdzLS07Ci0JCX0KIAkJd2hpbGUgKGN1cmxlZnQgPCBzaXplb2YocGxheWJ1ZikpIHsKIAkJCXJlcyA9IHdyaXRlKGF1ZGlvZmQsKExQQllURSlwbGF5YnVmK2N1cmxlZnQsc2l6ZW9mKHBsYXlidWYpLWN1cmxlZnQpOwogCQkJaWYgKHJlcz09LTEpIHsKQEAgLTc1NSw2ICs4NDMsNyBAQAogI2VuZGlmIC8qIEhBVkVfT1NTICovCiAKIEhSRVNVTFQgV0lOQVBJIERpcmVjdFNvdW5kQ3JlYXRlKExQR1VJRCBscEdVSUQsTFBESVJFQ1RTT1VORCAqcHBEUyxJVW5rbm93biAqcFVua091dGVyICkgeworCWludAl4eDsKIAlpZiAobHBHVUlEKQogCQlmcHJpbnRmKHN0ZGVyciwiRGlyZWN0U291bmRDcmVhdGUoJXAsJXAsJXApXG4iLGxwR1VJRCxwcERTLHBVbmtPdXRlcik7CiAjaWZkZWYgSEFWRV9PU1MKQEAgLTc2NiwxMSArODU1LDEyIEBACiAJCWF1ZGlvZmQ9MDsKIAkJcmV0dXJuIERTRVJSX05PRFJJVkVSOwogCX0KLQkvKgotCXh4PTB4MDAwNDAwMGM7CisJeHg9MHgwMDAyMDAwYzsKIAlpZiAoLTE9PWlvY3RsKGF1ZGlvZmQsU05EQ1RMX0RTUF9TRVRGUkFHTUVOVCwmeHgpKQogCQlwZXJyb3IoImlvY3RsIFNFVEZSQUdNRU5UIik7Ci0JKi8KKwlmcHJpbnRmKHN0ZGVyciwiU0VURlJBR01FTlQuIGNvdW50IGlzIG5vdyAlZCwgZnJhZ3NpemUgaXMgJWRcbiIsCisJCSh4eD4+MTYpKzEseHgmMHhmZmZmCisJKTsKIAogCSpwcERTID0gKExQRElSRUNUU09VTkQpSGVhcEFsbG9jKEdldFByb2Nlc3NIZWFwKCksMCxzaXplb2YoSURpcmVjdFNvdW5kKSk7CiAJKCpwcERTKS0+cmVmCQk9IDE7CmRpZmYgLS1naXQgYS9tdWx0aW1lZGlhL2pveXN0aWNrLmMgYi9tdWx0aW1lZGlhL2pveXN0aWNrLmMKaW5kZXggMTVkZDBmYS4uYWUxYzU2OCAxMDA2NDQKLS0tIGEvbXVsdGltZWRpYS9qb3lzdGljay5jCisrKyBiL211bHRpbWVkaWEvam95c3RpY2suYwpAQCAtMjUsNyArMjUsNiBAQAogI2luY2x1ZGUgInVzZXIuaCIKICNpbmNsdWRlICJkcml2ZXIuaCIKICNpbmNsdWRlICJtbXN5c3RlbS5oIgotI2luY2x1ZGUgInN0ZGRlYnVnLmgiCiAjaW5jbHVkZSAiZGVidWcuaCIKIAogI2RlZmluZSBNQVhKT1lEUklWRVJTCTQKQEAgLTk1LDcgKzk0LDcgQEAKIAkJfSBlbHNlCiAJCQlyZXR1cm47CiAgICAgICAgIGlmIChqb3lDYXB0dXJlZCA9PSBGQUxTRSkgcmV0dXJuOwotCWRwcmludGZfbW1zeXMoc3RkZGViLCAiSm95U2VuZE1lc3NhZ2VzKClcbiIpOworCWRwcmludGZfaW5mbyhtbXN5cywgIkpveVNlbmRNZXNzYWdlcygpXG4iKTsKICAgICAgICAgZm9yIChqb3k9MDsgam95IDwgTUFYSk9ZRFJJVkVSUzsgam95KyspIHsKIAkJaWYgKGpveU9wZW5Ecml2ZXIoam95KSA9PSBGQUxTRSkgY29udGludWU7CiAgICAgICAgICAgICAgICAgZGV2X3N0YXQgPSByZWFkKGpveV9kZXZbam95XSwgJmpzLCBzaXplb2YoanMpKTsKQEAgLTEzOCwxNCArMTM3LDE2IEBACiAgICAgaW50IGpveTsKICAgICBVSU5UMTYgam95X2NudCA9IDA7CiAKLSAgICBkcHJpbnRmX21tc3lzKHN0ZGRlYiwgIkpveUdldE51bURldnM6ICIpOwogICAgIGZvciAoam95PTA7IGpveTxNQVhKT1lEUklWRVJTOyBqb3krKykKIAlpZiAoam95T3BlbkRyaXZlcihqb3kpID09IFRSVUUpIHsJCQogCQlqb3lDbG9zZURyaXZlcihqb3kpOwogCQlqb3lfY250Kys7CiAgICAgfQotICAgIGRwcmludGZfbW1zeXMoc3RkZGViLCAicmV0dXJuaW5nICVkXG4iLCBqb3lfY250KTsKLSAgICBpZiAoIWpveV9jbnQpIGZwcmludGYoc3RkZXJyLCAiTm8gam95c3RpY2sgZm91bmQgLSBwZXJoYXBzIGdldCBqb3lzdGljay0wLjguMC50YXIuZ3ogYW5kIGxvYWQgaXQgYXMgbW9kdWxlIG9yIHVzZSBMaW51eCA+PSAyLjEuNDUgdG8gYmUgYWJsZSB0byB1c2Ugam95c3RpY2tzLlxuIik7CisgICAgZHByaW50Zl9pbmZvKG1tc3lzLCAicmV0dXJuaW5nICVkXG4iLCBqb3lfY250KTsKKyAgICBpZiAoIWpveV9jbnQpIGZwcmludGYoc3RkZXJyLCAiTm8gam95c3RpY2sgZm91bmQgLSAiCisJCQkgICJwZXJoYXBzIGdldCBqb3lzdGljay0wLjguMC50YXIuZ3ogYW5kIGxvYWQiCisJCQkgICJpdCBhcyBtb2R1bGUgb3IgdXNlIExpbnV4ID49IDIuMS40NSB0byBiZSAiCisJCQkgICJhYmxlIHRvIHVzZSBqb3lzdGlja3MuXG4iKTsKICAgICByZXR1cm4gam95X2NudDsKIH0KIApAQCAtMjI1LDcgKzIyNiw3IEBACiAgKi8KIE1NUkVTVUxUMTYgV0lOQVBJIGpveUdldERldkNhcHMxNihVSU5UMTYgd0lELCBMUEpPWUNBUFMxNiBscENhcHMsIFVJTlQxNiB3U2l6ZSkKIHsKLSAgICBkcHJpbnRmX21tc3lzKHN0ZGVyciwgIkpveUdldERldkNhcHMoJTA0WCwgJXAsICVkKTtcbiIsCisgICAgZHByaW50Zl9pbmZvKG1tc3lzLCAiSm95R2V0RGV2Q2FwcyglMDRYLCAlcCwgJWQpO1xuIiwKICAgICAgICAgICAgIHdJRCwgbHBDYXBzLCB3U2l6ZSk7CiAgICAgaWYgKGpveU9wZW5Ecml2ZXIod0lEKSA9PSBUUlVFKSB7CiAgICAgICAgIGxwQ2Fwcy0+d01pZCA9IE1NX01JQ1JPU09GVDsKQEAgLTI2NSw3ICsyNjYsNyBAQAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEpveUdldFBvc0V4ICAgICAgICAgICAgIFtXSU5NTS4zMV0KICAqLwotTU1SRVNVTFQzMiBXSU5BUEkgam95R2V0UG9zRXgoVUlOVDMyIHdJRCwgTFBKT1lJTkZPMzIgbHBJbmZvKQorTU1SRVNVTFQzMiBXSU5BUEkgam95R2V0UG9zRXgoVUlOVDMyIHdJRCwgTFBKT1lJTkZPRVggbHBJbmZvKQogewogCS8qIEZJWE1FOiBpbXBsZW1lbnQgaXQgKi8KIAlyZXR1cm4gTU1TWVNFUlJfTk9EUklWRVI7CkBAIC0yOTMsNyArMjk0LDcgQEAKIHsKICAgICAgICAgc3RydWN0IGpzX3N0YXR1cyBqczsKIAotICAgICAgICBkcHJpbnRmX21tc3lzKHN0ZGVyciwgIkpveUdldFBvcyglMDRYLCAlcClcbiIsIHdJRCwgbHBJbmZvKTsKKyAgICAgICAgZHByaW50Zl9pbmZvKG1tc3lzLCAiSm95R2V0UG9zKCUwNFgsICVwKVxuIiwgd0lELCBscEluZm8pOwogICAgICAgICBpZiAoam95T3BlbkRyaXZlcih3SUQpID09IEZBTFNFKSByZXR1cm4gTU1TWVNFUlJfTk9EUklWRVI7CiAJZGV2X3N0YXQgPSByZWFkKGpveV9kZXZbd0lEXSwgJmpzLCBzaXplb2YoanMpKTsKIAlpZiAoZGV2X3N0YXQgIT0gc2l6ZW9mKGpzKSkgewpAQCAtMzA3LDcgKzMwOCw3IEBACiAJbHBJbmZvLT53WXBvcyA9IGpzLnk7CiAJbHBJbmZvLT53WnBvcyA9IDA7IC8qIEZJWE1FOiBEb24ndCBrbm93IHdoYXQgdG8gZG8gd2l0aCB0aGlzIHZhbHVlIGFzIGpveXN0aWNrIGRyaXZlciBkb2Vzbid0IHByb3ZpZGUgYSBaIHZhbHVlICovCiAJbHBJbmZvLT53QnV0dG9ucyA9IGpzLmJ1dHRvbnM7Ci0JZHByaW50Zl9tbXN5cyhzdGRlcnIsICJKb3lHZXRQb3M6IHg6ICVkLCB5OiAlZCwgYnV0dG9uczogJWRcbiIsIGpzLngsIGpzLnksIGpzLmJ1dHRvbnMpOworCWRwcmludGZfaW5mbyhtbXN5cywgIkpveUdldFBvczogeDogJWQsIHk6ICVkLCBidXR0b25zOiAlZFxuIiwganMueCwganMueSwganMuYnV0dG9ucyk7CiAJcmV0dXJuIEpPWUVSUl9OT0VSUk9SOwogfQogCkBAIC0zMjgsNyArMzI5LDcgQEAKICAqLwogTU1SRVNVTFQxNiBXSU5BUEkgam95R2V0VGhyZXNob2xkMTYoVUlOVDE2IHdJRCwgTFBVSU5UMTYgbHBUaHJlc2hvbGQpCiB7Ci0gICAgZHByaW50Zl9tbXN5cyhzdGRlcnIsICJKb3lHZXRUaHJlc2hvbGQoJTA0WCwgJXApO1xuIiwgd0lELCBscFRocmVzaG9sZCk7CisgICAgZHByaW50Zl9pbmZvKG1tc3lzLCAiSm95R2V0VGhyZXNob2xkKCUwNFgsICVwKTtcbiIsIHdJRCwgbHBUaHJlc2hvbGQpOwogICAgIGlmICh3SUQgPj0gTUFYSk9ZRFJJVkVSUykgcmV0dXJuIEpPWUVSUl9QQVJNUzsKICAgICAqbHBUaHJlc2hvbGQgPSBqb3lfdGhyZXNob2xkW3dJRF07CiAgICAgcmV0dXJuIEpPWUVSUl9OT0VSUk9SOwpAQCAtMzQ3LDcgKzM0OCw3IEBACiAgKi8KIE1NUkVTVUxUMTYgV0lOQVBJIGpveVJlbGVhc2VDYXB0dXJlMTYoVUlOVDE2IHdJRCkKIHsKLSAgICBkcHJpbnRmX21tc3lzKHN0ZGVyciwgIkpveVJlbGVhc2VDYXB0dXJlKCUwNFgpO1xuIiwgd0lEKTsKKyAgICBkcHJpbnRmX2luZm8obW1zeXMsICJKb3lSZWxlYXNlQ2FwdHVyZSglMDRYKTtcbiIsIHdJRCk7CiAgICAgam95Q2FwdHVyZWQgPSBGQUxTRTsKICAgICBqb3lDbG9zZURyaXZlcih3SUQpOwogICAgIGpveV9kZXZbd0lEXSA9IC0xOwpAQCAtMzY5LDcgKzM3MCw3IEBACiBNTVJFU1VMVDE2IFdJTkFQSSBqb3lTZXRDYXB0dXJlMTYoSFdORDE2IGhXbmQsVUlOVDE2IHdJRCxVSU5UMTYgd1BlcmlvZCxCT09MMTYgYkNoYW5nZWQpCiB7CiAKLSAgICBkcHJpbnRmX21tc3lzKHN0ZGVyciwgIkpveVNldENhcHR1cmUoJTA0WCwgJTA0WCwgJWQsICVkKTtcbiIsCisgICAgZHByaW50Zl9pbmZvKG1tc3lzLCAiSm95U2V0Q2FwdHVyZSglMDRYLCAlMDRYLCAlZCwgJWQpO1xuIiwKIAkgICAgaFduZCwgd0lELCB3UGVyaW9kLCBiQ2hhbmdlZCk7CiAKICAgICBpZiAoIUNhcHR1cmVXbmRbd0lEXSkgewpAQCAtMzk0LDcgKzM5NSw3IEBACiAgKi8KIE1NUkVTVUxUMTYgV0lOQVBJIGpveVNldFRocmVzaG9sZDE2KFVJTlQxNiB3SUQsIFVJTlQxNiB3VGhyZXNob2xkKQogewotICAgIGRwcmludGZfbW1zeXMoc3RkZXJyLCAiSm95U2V0VGhyZXNob2xkKCUwNFgsICVkKTtcbiIsIHdJRCwgd1RocmVzaG9sZCk7CisgICAgZHByaW50Zl9pbmZvKG1tc3lzLCAiSm95U2V0VGhyZXNob2xkKCUwNFgsICVkKTtcbiIsIHdJRCwgd1RocmVzaG9sZCk7CiAKICAgICBpZiAod0lEID4gMykgcmV0dXJuIEpPWUVSUl9QQVJNUzsKICAgICBqb3lfdGhyZXNob2xkW3dJRF0gPSB3VGhyZXNob2xkOwpkaWZmIC0tZ2l0IGEvbXVsdGltZWRpYS9tY2lhbmltLmMgYi9tdWx0aW1lZGlhL21jaWFuaW0uYwppbmRleCAzOWZjZGYxLi5hYTU0NWE1IDEwMDY0NAotLS0gYS9tdWx0aW1lZGlhL21jaWFuaW0uYworKysgYi9tdWx0aW1lZGlhL21jaWFuaW0uYwpAQCAtMTQsNyArMTQsNiBAQAogI2luY2x1ZGUgInVzZXIuaCIKICNpbmNsdWRlICJkcml2ZXIuaCIKICNpbmNsdWRlICJtbXN5c3RlbS5oIgotI2luY2x1ZGUgInN0ZGRlYnVnLmgiCiAjaW5jbHVkZSAiZGVidWcuaCIKIAogI2RlZmluZSBNQVhfQU5JTURSViAJCTIKQEAgLTU1LDcgKzU0LDcgQEAKIAlMUFNUUgkJbHBzdHJFbGVtZW50TmFtZTsKIAljaGFyCQlzdHJbMTI4XTsKIAotCWRwcmludGZfbWNpYW5pbShzdGRkZWIsIkFOSU1fbWNpT3BlbiglMDRYLCAlMDhsWCwgJXApO1xuIiwgCisJZHByaW50Zl9pbmZvKG1jaWFuaW0sIkFOSU1fbWNpT3BlbiglMDRYLCAlMDhsWCwgJXApO1xuIiwgCiAJCQkJCXdEZXZJRCwgZHdGbGFncywgbHBQYXJtcyk7CiAJaWYgKGxwUGFybXMgPT0gTlVMTCkgcmV0dXJuIE1DSUVSUl9JTlRFUk5BTDsKIAlpZiAoQW5pbURldlt3RGV2SURdLm5Vc2VDb3VudCA+IDApIHsKQEAgLTcxLDEyICs3MCwxMiBAQAogCQlBbmltRGV2W3dEZXZJRF0ublVzZUNvdW50ID0gMTsKIAkJQW5pbURldlt3RGV2SURdLmZTaGFyZWFibGUgPSBkd0ZsYWdzICYgTUNJX09QRU5fU0hBUkVBQkxFOwogCQl9Ci0JZHByaW50Zl9tY2lhbmltKHN0ZGRlYiwiQU5JTV9tY2lPcGVuIC8vIHdEZXZJRD0lMDRYXG4iLCB3RGV2SUQpOworCWRwcmludGZfaW5mbyhtY2lhbmltLCJBTklNX21jaU9wZW4gLy8gd0RldklEPSUwNFhcbiIsIHdEZXZJRCk7CiAJbHBQYXJtcy0+d0RldmljZUlEID0gd0RldklEOwotCWRwcmludGZfbWNpYW5pbShzdGRkZWIsIkFOSU1fbWNpT3BlbiAvLyBscFBhcm1zLT53RGV2SUQ9JTA0WFxuIiwgbHBQYXJtcy0+d0RldmljZUlEKTsKKwlkcHJpbnRmX2luZm8obWNpYW5pbSwiQU5JTV9tY2lPcGVuIC8vIGxwUGFybXMtPndEZXZJRD0lMDRYXG4iLCBscFBhcm1zLT53RGV2aWNlSUQpOwogICAgIGlmIChkd0ZsYWdzICYgTUNJX09QRU5fRUxFTUVOVCkgewogCQlscHN0ckVsZW1lbnROYW1lID0gKExQU1RSKVBUUl9TRUdfVE9fTElOKGxwUGFybXMtPmxwc3RyRWxlbWVudE5hbWUpOwotCQlkcHJpbnRmX21jaWFuaW0oc3RkZGViLCJBTklNX21jaU9wZW4gLy8gTUNJX09QRU5fRUxFTUVOVCAnJXMnICFcbiIsCisJCWRwcmludGZfaW5mbyhtY2lhbmltLCJBTklNX21jaU9wZW4gLy8gTUNJX09QRU5fRUxFTUVOVCAnJXMnICFcbiIsCiAJCQkJCQlscHN0ckVsZW1lbnROYW1lKTsKIAkJaWYgKHN0cmxlbihscHN0ckVsZW1lbnROYW1lKSA+IDApIHsKIAkJCXN0cmNweShzdHIsIGxwc3RyRWxlbWVudE5hbWUpOwpAQCAtOTYsNyArOTUsNyBAQAogICAgTW92ZWQgdG8gbW1zeXN0ZW0uYyBtY2lPcGVuIHJvdXRpbmUgCiAKIAlpZiAoZHdGbGFncyAmIE1DSV9OT1RJRlkpIHsKLQkJZHByaW50Zl9tY2lhbmltKHN0ZGRlYiwKKwkJZHByaW50Zl9pbmZvKG1jaWFuaW0sCiAJCQkiQU5JTV9tY2lPcGVuIC8vIE1DSV9OT1RJRllfU1VDQ0VTU0ZVTCAlMDhsWCAhXG4iLCAKIAkJCWxwUGFybXMtPmR3Q2FsbGJhY2spOwogCQltY2lEcml2ZXJOb3RpZnkoKEhXTkQxNilMT1dPUkQobHBQYXJtcy0+ZHdDYWxsYmFjayksIApAQCAtMTE1LDcgKzExNCw3IEBACiBzdGF0aWMgRFdPUkQgQU5JTV9tY2lDbG9zZShVSU5UMTYgd0RldklELCBEV09SRCBkd1BhcmFtLCBMUE1DSV9HRU5FUklDX1BBUk1TIGxwUGFybXMpCiB7CiAjaWYgZGVmaW5lZChsaW51eCkgfHwgZGVmaW5lZChfX0ZyZWVCU0RfXykKLQlkcHJpbnRmX21jaWFuaW0oc3RkZGViLCJBTklNX21jaUNsb3NlKCV1LCAlMDhsWCwgJXApO1xuIiwgCisJZHByaW50Zl9pbmZvKG1jaWFuaW0sIkFOSU1fbWNpQ2xvc2UoJXUsICUwOGxYLCAlcCk7XG4iLCAKIAkJCQl3RGV2SUQsIGR3UGFyYW0sIGxwUGFybXMpOwogCWlmIChBbmltRGV2W3dEZXZJRF0ubHBkd1RyYWNrTGVuICE9IE5VTEwpIGZyZWUoQW5pbURldlt3RGV2SURdLmxwZHdUcmFja0xlbik7CiAJaWYgKEFuaW1EZXZbd0RldklEXS5scGR3VHJhY2tQb3MgIT0gTlVMTCkgZnJlZShBbmltRGV2W3dEZXZJRF0ubHBkd1RyYWNrUG9zKTsKQEAgLTEzMCwxMSArMTI5LDExIEBACiAJCQkJCQlMUE1DSV9HRVRERVZDQVBTX1BBUk1TIGxwUGFybXMpCiB7CiAjaWYgZGVmaW5lZChsaW51eCkgfHwgZGVmaW5lZChfX0ZyZWVCU0RfXykKLQlkcHJpbnRmX21jaWFuaW0oc3RkZGViLCJBTklNX21jaUdldERldkNhcHMoJXUsICUwOGxYLCAlcCk7XG4iLCAKKwlkcHJpbnRmX2luZm8obWNpYW5pbSwiQU5JTV9tY2lHZXREZXZDYXBzKCV1LCAlMDhsWCwgJXApO1xuIiwgCiAJCQkJd0RldklELCBkd0ZsYWdzLCBscFBhcm1zKTsKIAlpZiAobHBQYXJtcyA9PSBOVUxMKSByZXR1cm4gTUNJRVJSX0lOVEVSTkFMOwogCWlmIChkd0ZsYWdzICYgTUNJX0dFVERFVkNBUFNfSVRFTSkgewotICAgICAgICAJZHByaW50Zl9tY2lhbmltKHN0ZGRlYiwKKyAgICAgICAgCWRwcmludGZfaW5mbyhtY2lhbmltLAogCQkiQU5JTV9tY2lHZXREZXZDYXBzIC8vIE1DSV9HRVRERVZDQVBTX0lURU0gZHdJdGVtPSUwOGxYO1xuIiwKIAkJCQlscFBhcm1zLT5kd0l0ZW0pOwogCQlzd2l0Y2gobHBQYXJtcy0+ZHdJdGVtKSB7CkBAIC0xNjksNyArMTY4LDcgQEAKIAkJCQlyZXR1cm4gTUNJRVJSX1VOUkVDT0dOSVpFRF9DT01NQU5EOwogCQkJfQogCQl9Ci0JZHByaW50Zl9tY2lhbmltKHN0ZGRlYiwKKwlkcHJpbnRmX2luZm8obWNpYW5pbSwKIAkJIkFOSU1fbWNpR2V0RGV2Q2FwcyAvLyBscFBhcm1zLT5kd1JldHVybj0lMDhsWDtcbiIsIAogCQlscFBhcm1zLT5kd1JldHVybik7CiAgCXJldHVybiAwOwpAQCAtMTkwLDEzICsxODksMTMgQEAKIAlVSU5UMTYJd01pbnV0ZXM7CiAJVUlOVDE2CXdTZWNvbmRzOwogCVVJTlQxNgl3RnJhbWVzOwotCWRwcmludGZfbWNpYW5pbShzdGRkZWIsIkFOSU1fQ2FsY1RpbWUoJXUsICUwOGxYLCAlbHUpO1xuIiwgCisJZHByaW50Zl9pbmZvKG1jaWFuaW0sIkFOSU1fQ2FsY1RpbWUoJXUsICUwOGxYLCAlbHUpO1xuIiwgCiAJCQl3RGV2SUQsIGR3Rm9ybWF0VHlwZSwgZHdGcmFtZSk7CiAgICAgCiAJc3dpdGNoIChkd0Zvcm1hdFR5cGUpIHsKIAkJY2FzZSBNQ0lfRk9STUFUX01JTExJU0VDT05EUzoKIAkJCWR3VGltZSA9IGR3RnJhbWUgLyBBTklNRlJBTUVTX1BFUlNFQyAqIDEwMDA7Ci0JCQlkcHJpbnRmX21jaWFuaW0oc3RkZGViLAorCQkJZHByaW50Zl9pbmZvKG1jaWFuaW0sCiAJCQkJIkFOSU1fQ2FsY1RpbWUgLy8gTUlMTElTRUNPTkRTICVsdVxuIiwgZHdUaW1lKTsKIAkJCWJyZWFrOwogCQljYXNlIE1DSV9GT1JNQVRfTVNGOgpAQCAtMjA1LDcgKzIwNCw3IEBACiAJCQl3RnJhbWVzID0gZHdGcmFtZSAtIEFOSU1GUkFNRVNfUEVSTUlOICogd01pbnV0ZXMgLSAKIAkJCQkJCQkJQU5JTUZSQU1FU19QRVJTRUMgKiB3U2Vjb25kczsKIAkJCWR3VGltZSA9IE1DSV9NQUtFX01TRih3TWludXRlcywgd1NlY29uZHMsIHdGcmFtZXMpOwotCQkJZHByaW50Zl9tY2lhbmltKHN0ZGRlYiwiQU5JTV9DYWxjVGltZSAvLyBNU0YgJTAydTolMDJ1OiUwMnUgLT4gZHdUaW1lPSVsdVxuIiwKKwkJCWRwcmludGZfaW5mbyhtY2lhbmltLCJBTklNX0NhbGNUaW1lIC8vIE1TRiAlMDJ1OiUwMnU6JTAydSAtPiBkd1RpbWU9JWx1XG4iLAogCQkJCQkJCQl3TWludXRlcywgd1NlY29uZHMsIHdGcmFtZXMsIGR3VGltZSk7CiAJCQlicmVhazsKIAkJZGVmYXVsdDoKQEAgLTIyMyw3ICsyMjIsNyBAQAogCQkJd0ZyYW1lcyA9IGR3RnJhbWUgLSBBTklNRlJBTUVTX1BFUk1JTiAqIHdNaW51dGVzIC0gCiAJCQkJCQkJCUFOSU1GUkFNRVNfUEVSU0VDICogd1NlY29uZHM7CiAJCQlkd1RpbWUgPSBNQ0lfTUFLRV9UTVNGKHdUcmFjaywgd01pbnV0ZXMsIHdTZWNvbmRzLCB3RnJhbWVzKTsKLQkJCWRwcmludGZfbWNpYW5pbShzdGRkZWIsCisJCQlkcHJpbnRmX2luZm8obWNpYW5pbSwKIAkJCQkiQU5JTV9DYWxjVGltZSAvLyAlMDJ1LSUwMnU6JTAydTolMDJ1XG4iLAogCQkJCXdUcmFjaywgd01pbnV0ZXMsIHdTZWNvbmRzLCB3RnJhbWVzKTsKIAkJCWJyZWFrOwpAQCAtMjQxLDE3ICsyNDAsMTcgQEAKIAlEV09SRAlkd0ZyYW1lID0gMDsKICNpZiBkZWZpbmVkKGxpbnV4KSB8fCBkZWZpbmVkKF9fRnJlZUJTRF9fKQogCVVJTlQxNgl3VHJhY2s7Ci0JZHByaW50Zl9tY2lhbmltKHN0ZGRlYiwiQU5JTV9DYWxjRnJhbWUoJXUsICUwOGxYLCAlbHUpO1xuIiwgCisJZHByaW50Zl9pbmZvKG1jaWFuaW0sIkFOSU1fQ2FsY0ZyYW1lKCV1LCAlMDhsWCwgJWx1KTtcbiIsIAogCQkJd0RldklELCBkd0Zvcm1hdFR5cGUsIGR3VGltZSk7CiAKICAgICAgICAgc3dpdGNoIChkd0Zvcm1hdFR5cGUpIHsKIAkJY2FzZSBNQ0lfRk9STUFUX01JTExJU0VDT05EUzoKIAkJCWR3RnJhbWUgPSBkd1RpbWUgKiBBTklNRlJBTUVTX1BFUlNFQyAvIDEwMDA7Ci0JCQlkcHJpbnRmX21jaWFuaW0oc3RkZGViLAorCQkJZHByaW50Zl9pbmZvKG1jaWFuaW0sCiAJCQkJIkFOSU1fQ2FsY0ZyYW1lIC8vIE1JTExJU0VDT05EUyAlbHVcbiIsIGR3RnJhbWUpOwogCQkJYnJlYWs7CiAJCWNhc2UgTUNJX0ZPUk1BVF9NU0Y6Ci0JCQlkcHJpbnRmX21jaWFuaW0oc3RkZGViLAorCQkJZHByaW50Zl9pbmZvKG1jaWFuaW0sCiAJCQkJIkFOSU1fQ2FsY0ZyYW1lIC8vIE1TRiAlMDJ1OiUwMnU6JTAydVxuIiwKIAkJCQlNQ0lfTVNGX01JTlVURShkd1RpbWUpLCBNQ0lfTVNGX1NFQ09ORChkd1RpbWUpLCAKIAkJCQlNQ0lfTVNGX0ZSQU1FKGR3VGltZSkpOwpAQCAtMjY0LDExICsyNjMsMTEgQEAKIAkJCWR3Rm9ybWF0VHlwZSA9IE1DSV9GT1JNQVRfVE1TRjsKIAkJY2FzZSBNQ0lfRk9STUFUX1RNU0Y6CiAJCQl3VHJhY2sgPSBNQ0lfVE1TRl9UUkFDSyhkd1RpbWUpOwotCQkJZHByaW50Zl9tY2lhbmltKHN0ZGRlYiwKKwkJCWRwcmludGZfaW5mbyhtY2lhbmltLAogCQkJCSJBTklNX0NhbGNGcmFtZSAvLyBUTVNGICUwMnUtJTAydTolMDJ1OiUwMnVcbiIsCiAJCQkJTUNJX1RNU0ZfVFJBQ0soZHdUaW1lKSwgTUNJX1RNU0ZfTUlOVVRFKGR3VGltZSksIAogCQkJCU1DSV9UTVNGX1NFQ09ORChkd1RpbWUpLCBNQ0lfVE1TRl9GUkFNRShkd1RpbWUpKTsKLQkJCWRwcmludGZfbWNpYW5pbShzdGRkZWIsCisJCQlkcHJpbnRmX2luZm8obWNpYW5pbSwKIAkJCQkiQU5JTV9DYWxjRnJhbWUgLy8gVE1TRiB0cmFja3Bvc1sldV09JWx1XG4iLAogCQkJCXdUcmFjaywgQW5pbURldlt3RGV2SURdLmxwZHdUcmFja1Bvc1t3VHJhY2sgLSAxXSk7CiAJCQlkd0ZyYW1lID0gQW5pbURldlt3RGV2SURdLmxwZHdUcmFja1Bvc1t3VHJhY2sgLSAxXTsKQEAgLTI4OCw3ICsyODcsNyBAQAogc3RhdGljIERXT1JEIEFOSU1fbWNpSW5mbyhVSU5UMTYgd0RldklELCBEV09SRCBkd0ZsYWdzLCBMUE1DSV9JTkZPX1BBUk1TMTYgbHBQYXJtcykKIHsKICNpZiBkZWZpbmVkKGxpbnV4KSB8fCBkZWZpbmVkKF9fRnJlZUJTRF9fKQotCWRwcmludGZfbWNpYW5pbShzdGRkZWIsIkFOSU1fbWNpSW5mbygldSwgJTA4bFgsICVwKTtcbiIsIAorCWRwcmludGZfaW5mbyhtY2lhbmltLCJBTklNX21jaUluZm8oJXUsICUwOGxYLCAlcCk7XG4iLCAKIAkJd0RldklELCBkd0ZsYWdzLCBscFBhcm1zKTsKIAlpZiAobHBQYXJtcyA9PSBOVUxMKSByZXR1cm4gTUNJRVJSX0lOVEVSTkFMOwogCWxwUGFybXMtPmxwc3RyUmV0dXJuID0gTlVMTDsKQEAgLTMyMiwxMSArMzIxLDExIEBACiBzdGF0aWMgRFdPUkQgQU5JTV9tY2lTdGF0dXMoVUlOVDE2IHdEZXZJRCwgRFdPUkQgZHdGbGFncywgTFBNQ0lfU1RBVFVTX1BBUk1TIGxwUGFybXMpCiB7CiAjaWYgZGVmaW5lZChsaW51eCkgfHwgZGVmaW5lZChfX0ZyZWVCU0RfXykKLQlkcHJpbnRmX21jaWFuaW0oc3RkZGViLCJBTklNX21jaVN0YXR1cygldSwgJTA4bFgsICVwKTtcbiIsIAorCWRwcmludGZfaW5mbyhtY2lhbmltLCJBTklNX21jaVN0YXR1cygldSwgJTA4bFgsICVwKTtcbiIsIAogCQkJd0RldklELCBkd0ZsYWdzLCBscFBhcm1zKTsKIAlpZiAobHBQYXJtcyA9PSBOVUxMKSByZXR1cm4gTUNJRVJSX0lOVEVSTkFMOwogCWlmIChkd0ZsYWdzICYgTUNJX05PVElGWSkgewotCQlkcHJpbnRmX21jaWFuaW0oc3RkZGViLAorCQlkcHJpbnRmX2luZm8obWNpYW5pbSwKIAkJCSJBTklNX21jaVN0YXR1cyAvLyBNQ0lfTk9USUZZX1NVQ0NFU1NGVUwgJTA4bFggIVxuIiwgCiAJCQlscFBhcm1zLT5kd0NhbGxiYWNrKTsKIAkJbWNpRHJpdmVyTm90aWZ5KChIV05EMTYpTE9XT1JEKGxwUGFybXMtPmR3Q2FsbGJhY2spLCAKQEAgLTMzNiwxMSArMzM1LDExIEBACiAJCXN3aXRjaChscFBhcm1zLT5kd0l0ZW0pIHsKIAkJCWNhc2UgTUNJX1NUQVRVU19DVVJSRU5UX1RSQUNLOgogCQkJCWxwUGFybXMtPmR3UmV0dXJuID0gQW5pbURldlt3RGV2SURdLm5DdXJUcmFjazsKLQkJCQlkcHJpbnRmX21jaWFuaW0oc3RkZGViLCJBTklNX21jaVN0YXR1cyAvLyBDVVJSRU5UX1RSQUNLPSVsdSFcbiIsIGxwUGFybXMtPmR3UmV0dXJuKTsKKwkJCQlkcHJpbnRmX2luZm8obWNpYW5pbSwiQU5JTV9tY2lTdGF0dXMgLy8gQ1VSUkVOVF9UUkFDSz0lbHUhXG4iLCBscFBhcm1zLT5kd1JldHVybik7CiAJCQkgCXJldHVybiAwOwogCQkJY2FzZSBNQ0lfU1RBVFVTX0xFTkdUSDoKIAkJCQlpZiAoZHdGbGFncyAmIE1DSV9UUkFDSykgewotCQkJCQlkcHJpbnRmX21jaWFuaW0oc3RkZGViLCJBTklNX21jaVN0YXR1cyAvLyBNQ0lfVFJBQ0sgIyVsdSBMRU5HVEg9Pz8/ICFcbiIsCisJCQkJCWRwcmludGZfaW5mbyhtY2lhbmltLCJBTklNX21jaVN0YXR1cyAvLyBNQ0lfVFJBQ0sgIyVsdSBMRU5HVEg9Pz8/ICFcbiIsCiAJCQkJCQkJCQkJCQkJCWxwUGFybXMtPmR3VHJhY2spOwogCQkJCQlpZiAobHBQYXJtcy0+ZHdUcmFjayA+IEFuaW1EZXZbd0RldklEXS5uVHJhY2tzKQogCQkJCQkJcmV0dXJuIE1DSUVSUl9PVVRPRlJBTkdFOwpAQCAtMzUwLDIwICszNDksMjAgQEAKIAkJCQkJbHBQYXJtcy0+ZHdSZXR1cm4gPSBBbmltRGV2W3dEZXZJRF0uZHdUb3RhbExlbjsKIAkJCQlscFBhcm1zLT5kd1JldHVybiA9IEFOSU1fQ2FsY1RpbWUod0RldklELCAKIAkJCQkJQW5pbURldlt3RGV2SURdLmR3VGltZUZvcm1hdCwgbHBQYXJtcy0+ZHdSZXR1cm4pOwotICAgICAgICAgICAgICAgIAkJZHByaW50Zl9tY2lhbmltKHN0ZGRlYiwiQU5JTV9tY2lTdGF0dXMgLy8gTEVOR1RIPSVsdSAhXG4iLCBscFBhcm1zLT5kd1JldHVybik7CisgICAgICAgICAgICAgICAgCQlkcHJpbnRmX2luZm8obWNpYW5pbSwiQU5JTV9tY2lTdGF0dXMgLy8gTEVOR1RIPSVsdSAhXG4iLCBscFBhcm1zLT5kd1JldHVybik7CiAJCQkgCXJldHVybiAwOwogCQkJY2FzZSBNQ0lfU1RBVFVTX01PREU6CiAJCQkJbHBQYXJtcy0+ZHdSZXR1cm4gPSBBbmltRGV2W3dEZXZJRF0ubW9kZTsKLQkJCQlkcHJpbnRmX21jaWFuaW0oc3RkZGViLCJBTklNX21jaVN0YXR1cyAvLyBNQ0lfU1RBVFVTX01PREU9JTA4bFggIVxuIiwKKwkJCQlkcHJpbnRmX2luZm8obWNpYW5pbSwiQU5JTV9tY2lTdGF0dXMgLy8gTUNJX1NUQVRVU19NT0RFPSUwOGxYICFcbiIsCiAJCQkJCQkJCQkJCQlscFBhcm1zLT5kd1JldHVybik7CiAJCQkgCXJldHVybiAwOwogCQkJY2FzZSBNQ0lfU1RBVFVTX01FRElBX1BSRVNFTlQ6CiAJCQkJbHBQYXJtcy0+ZHdSZXR1cm4gPSBUUlVFOwotCQkJCWRwcmludGZfbWNpYW5pbShzdGRkZWIsIkFOSU1fbWNpU3RhdHVzIC8vIE1DSV9TVEFUVVNfTUVESUFfUFJFU0VOVCAhXG4iKTsKKwkJCQlkcHJpbnRmX2luZm8obWNpYW5pbSwiQU5JTV9tY2lTdGF0dXMgLy8gTUNJX1NUQVRVU19NRURJQV9QUkVTRU5UICFcbiIpOwogCQkJIAlyZXR1cm4gMDsKIAkJCWNhc2UgTUNJX1NUQVRVU19OVU1CRVJfT0ZfVFJBQ0tTOgogCQkJCWxwUGFybXMtPmR3UmV0dXJuID0gMTsKLQkJCQlkcHJpbnRmX21jaWFuaW0oc3RkZGViLCJBTklNX21jaVN0YXR1cyAvLyBNQ0lfU1RBVFVTX05VTUJFUl9PRl9UUkFDS1MgPSAlbHUgIVxuIiwKKwkJCQlkcHJpbnRmX2luZm8obWNpYW5pbSwiQU5JTV9tY2lTdGF0dXMgLy8gTUNJX1NUQVRVU19OVU1CRVJfT0ZfVFJBQ0tTID0gJWx1ICFcbiIsCiAJCQkJCQkJCQkJCWxwUGFybXMtPmR3UmV0dXJuKTsKIAkJCQlpZiAobHBQYXJtcy0+ZHdSZXR1cm4gPT0gKFdPUkQpLTEpIHJldHVybiBNQ0lFUlJfSU5URVJOQUw7CiAJCQkgCXJldHVybiAwOwpAQCAtMzcxLDI1ICszNzAsMjUgQEAKIAkJCQlscFBhcm1zLT5kd1JldHVybiA9IEFuaW1EZXZbd0RldklEXS5kd0N1ckZyYW1lOwogCQkJCWlmIChkd0ZsYWdzICYgTUNJX1NUQVRVU19TVEFSVCkgewogCQkJCQlscFBhcm1zLT5kd1JldHVybiA9IDA7Ci0JCQkJCWRwcmludGZfbWNpYW5pbShzdGRkZWIsIkNEQVVESU9fbWNpU3RhdHVzIC8vIGdldCBNQ0lfU1RBVFVTX1NUQVJUICFcbiIpOworCQkJCQlkcHJpbnRmX2luZm8obWNpYW5pbSwiQ0RBVURJT19tY2lTdGF0dXMgLy8gZ2V0IE1DSV9TVEFUVVNfU1RBUlQgIVxuIik7CiAJCQkJCX0KIAkJCQlpZiAoZHdGbGFncyAmIE1DSV9UUkFDSykgewogCQkJCQlpZiAobHBQYXJtcy0+ZHdUcmFjayA+IEFuaW1EZXZbd0RldklEXS5uVHJhY2tzKQogCQkJCQkJcmV0dXJuIE1DSUVSUl9PVVRPRlJBTkdFOwogCQkJCQlscFBhcm1zLT5kd1JldHVybiA9IEFuaW1EZXZbd0RldklEXS5scGR3VHJhY2tQb3NbbHBQYXJtcy0+ZHdUcmFjayAtIDFdOwotCQkJCQlkcHJpbnRmX21jaWFuaW0oc3RkZGViLCJBTklNX21jaVN0YXR1cyAvLyBnZXQgTUNJX1RSQUNLICMlbHUgIVxuIiwgbHBQYXJtcy0+ZHdUcmFjayk7CisJCQkJCWRwcmludGZfaW5mbyhtY2lhbmltLCJBTklNX21jaVN0YXR1cyAvLyBnZXQgTUNJX1RSQUNLICMlbHUgIVxuIiwgbHBQYXJtcy0+ZHdUcmFjayk7CiAJCQkJCX0KIAkJCQlscFBhcm1zLT5kd1JldHVybiA9IEFOSU1fQ2FsY1RpbWUod0RldklELCAKIAkJCQkJQW5pbURldlt3RGV2SURdLmR3VGltZUZvcm1hdCwgbHBQYXJtcy0+ZHdSZXR1cm4pOwotCQkJCQlkcHJpbnRmX21jaWFuaW0oc3RkZGViLCJBTklNX21jaVN0YXR1cyAvLyBNQ0lfU1RBVFVTX1BPU0lUSU9OPSUwOGxYICFcbiIsCisJCQkJCWRwcmludGZfaW5mbyhtY2lhbmltLCJBTklNX21jaVN0YXR1cyAvLyBNQ0lfU1RBVFVTX1BPU0lUSU9OPSUwOGxYICFcbiIsCiAJCQkJCQkJCQkJCQkJCWxwUGFybXMtPmR3UmV0dXJuKTsKIAkJCSAJcmV0dXJuIDA7CiAJCQljYXNlIE1DSV9TVEFUVVNfUkVBRFk6Ci0JCQkJZHByaW50Zl9tY2lhbmltKHN0ZGRlYiwiQU5JTV9tY2lTdGF0dXMgLy8gTUNJX1NUQVRVU19SRUFEWSAhXG4iKTsKKwkJCQlkcHJpbnRmX2luZm8obWNpYW5pbSwiQU5JTV9tY2lTdGF0dXMgLy8gTUNJX1NUQVRVU19SRUFEWSAhXG4iKTsKIAkJCQlscFBhcm1zLT5kd1JldHVybiA9IFRSVUU7CiAJCQkgCXJldHVybiAwOwogCQkJY2FzZSBNQ0lfU1RBVFVTX1RJTUVfRk9STUFUOgotCQkJCWRwcmludGZfbWNpYW5pbShzdGRkZWIsIkFOSU1fbWNpU3RhdHVzIC8vIE1DSV9TVEFUVVNfVElNRV9GT1JNQVQgIVxuIik7CisJCQkJZHByaW50Zl9pbmZvKG1jaWFuaW0sIkFOSU1fbWNpU3RhdHVzIC8vIE1DSV9TVEFUVVNfVElNRV9GT1JNQVQgIVxuIik7CiAJCQkJbHBQYXJtcy0+ZHdSZXR1cm4gPSBNQ0lfRk9STUFUX01JTExJU0VDT05EUzsKIAkJCSAJcmV0dXJuIDA7CiAJCQlkZWZhdWx0OgpAQCAtNDEyLDcgKzQxMSw3IEBACiB7CiAjaWYgZGVmaW5lZChsaW51eCkgfHwgZGVmaW5lZChfX0ZyZWVCU0RfXykKIAlpbnQgCXN0YXJ0LCBlbmQ7Ci0JZHByaW50Zl9tY2lhbmltKHN0ZGRlYiwiQU5JTV9tY2lQbGF5KCV1LCAlMDhsWCwgJXApO1xuIiwgCisJZHByaW50Zl9pbmZvKG1jaWFuaW0sIkFOSU1fbWNpUGxheSgldSwgJTA4bFgsICVwKTtcbiIsIAogCQl3RGV2SUQsIGR3RmxhZ3MsIGxwUGFybXMpOwogCWlmIChscFBhcm1zID09IE5VTEwpIHJldHVybiBNQ0lFUlJfSU5URVJOQUw7CiAJc3RhcnQgPSAwOyAJCWVuZCA9IEFuaW1EZXZbd0RldklEXS5kd1RvdGFsTGVuOwpAQCAtNDIwLDE5ICs0MTksMTkgQEAKIAlpZiAoZHdGbGFncyAmIE1DSV9GUk9NKSB7CiAJCXN0YXJ0ID0gQU5JTV9DYWxjRnJhbWUod0RldklELCAKIAkJCUFuaW1EZXZbd0RldklEXS5kd1RpbWVGb3JtYXQsIGxwUGFybXMtPmR3RnJvbSk7IAotICAgICAgICBkcHJpbnRmX21jaWFuaW0oc3RkZGViLCJBTklNX21jaVBsYXkgLy8gTUNJX0ZST009JTA4bFggLT4gJXUgXG4iLAorICAgICAgICBkcHJpbnRmX2luZm8obWNpYW5pbSwiQU5JTV9tY2lQbGF5IC8vIE1DSV9GUk9NPSUwOGxYIC0+ICV1IFxuIiwKIAkJCQlscFBhcm1zLT5kd0Zyb20sIHN0YXJ0KTsKIAkJfQogCWlmIChkd0ZsYWdzICYgTUNJX1RPKSB7CiAJCWVuZCA9IEFOSU1fQ2FsY0ZyYW1lKHdEZXZJRCwgCiAJCQlBbmltRGV2W3dEZXZJRF0uZHdUaW1lRm9ybWF0LCBscFBhcm1zLT5kd1RvKTsKLSAgICAgICAgCWRwcmludGZfbWNpYW5pbShzdGRkZWIsCisgICAgICAgIAlkcHJpbnRmX2luZm8obWNpYW5pbSwKIAkJCSJBTklNX21jaVBsYXkgLy8gTUNJX1RPPSUwOGxYIC0+ICV1IFxuIiwKIAkJCWxwUGFybXMtPmR3VG8sIGVuZCk7CiAJCX0KIAlBbmltRGV2W3dEZXZJRF0ubW9kZSA9IE1DSV9NT0RFX1BMQVk7CiAJaWYgKGR3RmxhZ3MgJiBNQ0lfTk9USUZZKSB7Ci0JCWRwcmludGZfbWNpYW5pbShzdGRkZWIsCisJCWRwcmludGZfaW5mbyhtY2lhbmltLAogCQkJIkFOSU1fbWNpUGxheSAvLyBNQ0lfTk9USUZZX1NVQ0NFU1NGVUwgJTA4bFggIVxuIiwgCiAJCQlscFBhcm1zLT5kd0NhbGxiYWNrKTsKIAkJbWNpRHJpdmVyTm90aWZ5KChIV05EMTYpTE9XT1JEKGxwUGFybXMtPmR3Q2FsbGJhY2spLCAKQEAgLTQ1MCwxMiArNDQ5LDEyIEBACiBzdGF0aWMgRFdPUkQgQU5JTV9tY2lTdG9wKFVJTlQxNiB3RGV2SUQsIERXT1JEIGR3RmxhZ3MsIExQTUNJX0dFTkVSSUNfUEFSTVMgbHBQYXJtcykKIHsKICNpZiBkZWZpbmVkKGxpbnV4KSB8fCBkZWZpbmVkKF9fRnJlZUJTRF9fKQotCWRwcmludGZfbWNpYW5pbShzdGRkZWIsIkFOSU1fbWNpU3RvcCgldSwgJTA4bFgsICVwKTtcbiIsIAorCWRwcmludGZfaW5mbyhtY2lhbmltLCJBTklNX21jaVN0b3AoJXUsICUwOGxYLCAlcCk7XG4iLCAKIAkJCXdEZXZJRCwgZHdGbGFncywgbHBQYXJtcyk7CiAJaWYgKGxwUGFybXMgPT0gTlVMTCkgcmV0dXJuIE1DSUVSUl9JTlRFUk5BTDsKIAlBbmltRGV2W3dEZXZJRF0ubW9kZSA9IE1DSV9NT0RFX1NUT1A7CiAJaWYgKGR3RmxhZ3MgJiBNQ0lfTk9USUZZKSB7Ci0JCWRwcmludGZfbWNpYW5pbShzdGRkZWIsCisJCWRwcmludGZfaW5mbyhtY2lhbmltLAogCQkJIkFOSU1fbWNpU3RvcCAvLyBNQ0lfTk9USUZZX1NVQ0NFU1NGVUwgJTA4bFggIVxuIiwgCiAJCQlscFBhcm1zLT5kd0NhbGxiYWNrKTsKIAkJbWNpRHJpdmVyTm90aWZ5KChIV05EMTYpTE9XT1JEKGxwUGFybXMtPmR3Q2FsbGJhY2spLCAKQEAgLTQ3MywxMiArNDcyLDEyIEBACiBzdGF0aWMgRFdPUkQgQU5JTV9tY2lQYXVzZShVSU5UMTYgd0RldklELCBEV09SRCBkd0ZsYWdzLCBMUE1DSV9HRU5FUklDX1BBUk1TIGxwUGFybXMpCiB7CiAjaWYgZGVmaW5lZChsaW51eCkgfHwgZGVmaW5lZChfX0ZyZWVCU0RfXykKLQlkcHJpbnRmX21jaWFuaW0oc3RkZGViLCJBTklNX21jaVBhdXNlKCV1LCAlMDhsWCwgJXApO1xuIiwgCisJZHByaW50Zl9pbmZvKG1jaWFuaW0sIkFOSU1fbWNpUGF1c2UoJXUsICUwOGxYLCAlcCk7XG4iLCAKIAkJd0RldklELCBkd0ZsYWdzLCBscFBhcm1zKTsKIAlpZiAobHBQYXJtcyA9PSBOVUxMKSByZXR1cm4gTUNJRVJSX0lOVEVSTkFMOwogCUFuaW1EZXZbd0RldklEXS5tb2RlID0gTUNJX01PREVfUEFVU0U7CiAJaWYgKGR3RmxhZ3MgJiBNQ0lfTk9USUZZKSB7Ci0JCWRwcmludGZfbWNpYW5pbShzdGRkZWIsCisJCWRwcmludGZfaW5mbyhtY2lhbmltLAogCQkJIkFOSU1fbWNpUGF1c2UgLy8gTUNJX05PVElGWV9TVUNDRVNTRlVMICUwOGxYICFcbiIsIAogCQkJbHBQYXJtcy0+ZHdDYWxsYmFjayk7CiAJCW1jaURyaXZlck5vdGlmeSgoSFdORDE2KUxPV09SRChscFBhcm1zLT5kd0NhbGxiYWNrKSwgCkBAIC00OTYsMTIgKzQ5NSwxMiBAQAogc3RhdGljIERXT1JEIEFOSU1fbWNpUmVzdW1lKFVJTlQxNiB3RGV2SUQsIERXT1JEIGR3RmxhZ3MsIExQTUNJX0dFTkVSSUNfUEFSTVMgbHBQYXJtcykKIHsKICNpZiBkZWZpbmVkKGxpbnV4KSB8fCBkZWZpbmVkKF9fRnJlZUJTRF9fKQotCWRwcmludGZfbWNpYW5pbShzdGRkZWIsIkFOSU1fbWNpUmVzdW1lKCV1LCAlMDhsWCwgJXApO1xuIiwgCisJZHByaW50Zl9pbmZvKG1jaWFuaW0sIkFOSU1fbWNpUmVzdW1lKCV1LCAlMDhsWCwgJXApO1xuIiwgCiAJCXdEZXZJRCwgZHdGbGFncywgbHBQYXJtcyk7CiAJaWYgKGxwUGFybXMgPT0gTlVMTCkgcmV0dXJuIE1DSUVSUl9JTlRFUk5BTDsKIAlBbmltRGV2W3dEZXZJRF0ubW9kZSA9IE1DSV9NT0RFX1NUT1A7CiAJaWYgKGR3RmxhZ3MgJiBNQ0lfTk9USUZZKSB7Ci0JCWRwcmludGZfbWNpYW5pbShzdGRkZWIsCisJCWRwcmludGZfaW5mbyhtY2lhbmltLAogCQkJIkFOSU1fbWNpUmVzdW1lIC8vIE1DSV9OT1RJRllfU1VDQ0VTU0ZVTCAlMDhsWCAhXG4iLCAKIAkJCWxwUGFybXMtPmR3Q2FsbGJhY2spOwogCQltY2lEcml2ZXJOb3RpZnkoKEhXTkQxNilMT1dPUkQobHBQYXJtcy0+ZHdDYWxsYmFjayksIApAQCAtNTIxLDcgKzUyMCw3IEBACiAjaWYgZGVmaW5lZChsaW51eCkgfHwgZGVmaW5lZChfX0ZyZWVCU0RfXykKIAlEV09SRAlkd1JldDsKIAlNQ0lfUExBWV9QQVJNUyBQbGF5UGFybXM7Ci0JZHByaW50Zl9tY2lhbmltKHN0ZGRlYiwiQU5JTV9tY2lTZWVrKCV1LCAlMDhsWCwgJXApO1xuIiwgCisJZHByaW50Zl9pbmZvKG1jaWFuaW0sIkFOSU1fbWNpU2VlaygldSwgJTA4bFgsICVwKTtcbiIsIAogCQl3RGV2SUQsIGR3RmxhZ3MsIGxwUGFybXMpOwogCWlmIChscFBhcm1zID09IE5VTEwpIHJldHVybiBNQ0lFUlJfSU5URVJOQUw7CiAJQW5pbURldlt3RGV2SURdLm1vZGUgPSBNQ0lfTU9ERV9TRUVLOwpAQCAtNTQwLDcgKzUzOSw3IEBACiAJaWYgKGR3UmV0ICE9IDApIHJldHVybiBkd1JldDsKIAlkd1JldCA9IEFOSU1fbWNpU3RvcCh3RGV2SUQsIE1DSV9XQUlULCAoTFBNQ0lfR0VORVJJQ19QQVJNUykmUGxheVBhcm1zKTsKIAlpZiAoZHdGbGFncyAmIE1DSV9OT1RJRlkpIHsKLQkJZHByaW50Zl9tY2lhbmltKHN0ZGRlYiwKKwkJZHByaW50Zl9pbmZvKG1jaWFuaW0sCiAJCQkiQU5JTV9tY2lTZWVrIC8vIE1DSV9OT1RJRllfU1VDQ0VTU0ZVTCAlMDhsWCAhXG4iLCAKIAkJCWxwUGFybXMtPmR3Q2FsbGJhY2spOwogCQltY2lEcml2ZXJOb3RpZnkoKEhXTkQxNilMT1dPUkQobHBQYXJtcy0+ZHdDYWxsYmFjayksIApAQCAtNTU5LDcgKzU1OCw3IEBACiBzdGF0aWMgRFdPUkQgQU5JTV9tY2lTZXQoVUlOVDE2IHdEZXZJRCwgRFdPUkQgZHdGbGFncywgTFBNQ0lfU0VUX1BBUk1TIGxwUGFybXMpCiB7CiAjaWYgZGVmaW5lZChsaW51eCkgfHwgZGVmaW5lZChfX0ZyZWVCU0RfXykKLQlkcHJpbnRmX21jaWFuaW0oc3RkZGViLCJBTklNX21jaVNldCgldSwgJTA4bFgsICVwKTtcbiIsIAorCWRwcmludGZfaW5mbyhtY2lhbmltLCJBTklNX21jaVNldCgldSwgJTA4bFgsICVwKTtcbiIsIAogCQl3RGV2SUQsIGR3RmxhZ3MsIGxwUGFybXMpOwogCWlmIChscFBhcm1zID09IE5VTEwpIHJldHVybiBNQ0lFUlJfSU5URVJOQUw7CiAvKgpAQCAtNTY5LDE0ICs1NjgsMTQgQEAKIAlpZiAoZHdGbGFncyAmIE1DSV9TRVRfVElNRV9GT1JNQVQpIHsKIAkJc3dpdGNoIChscFBhcm1zLT5kd1RpbWVGb3JtYXQpIHsKIAkJCWNhc2UgTUNJX0ZPUk1BVF9NSUxMSVNFQ09ORFM6Ci0JCQkJZHByaW50Zl9tY2lhbmltKHN0ZGRlYiwKKwkJCQlkcHJpbnRmX2luZm8obWNpYW5pbSwKIAkJCQkJIkFOSU1fbWNpU2V0IC8vIE1DSV9GT1JNQVRfTUlMTElTRUNPTkRTICFcbiIpOwogCQkJCWJyZWFrOwogCQkJY2FzZSBNQ0lfRk9STUFUX01TRjoKLQkJCQlkcHJpbnRmX21jaWFuaW0oc3RkZGViLCJBTklNX21jaVNldCAvLyBNQ0lfRk9STUFUX01TRiAhXG4iKTsKKwkJCQlkcHJpbnRmX2luZm8obWNpYW5pbSwiQU5JTV9tY2lTZXQgLy8gTUNJX0ZPUk1BVF9NU0YgIVxuIik7CiAJCQkJYnJlYWs7CiAJCQljYXNlIE1DSV9GT1JNQVRfVE1TRjoKLQkJCQlkcHJpbnRmX21jaWFuaW0oc3RkZGViLCJBTklNX21jaVNldCAvLyBNQ0lfRk9STUFUX1RNU0YgIVxuIik7CisJCQkJZHByaW50Zl9pbmZvKG1jaWFuaW0sIkFOSU1fbWNpU2V0IC8vIE1DSV9GT1JNQVRfVE1TRiAhXG4iKTsKIAkJCQlicmVhazsKIAkJCWRlZmF1bHQ6CiAJCQkJZnByaW50ZihzdGRlcnIsIkFOSU1fbWNpU2V0IC8vIGJhZCB0aW1lIGZvcm1hdCAhXG4iKTsKQEAgLTU4OCw3ICs1ODcsNyBAQAogCWlmIChkd0ZsYWdzICYgTUNJX1NFVF9PTikgcmV0dXJuIE1DSUVSUl9VTlNVUFBPUlRFRF9GVU5DVElPTjsKIAlpZiAoZHdGbGFncyAmIE1DSV9TRVRfT0ZGKSByZXR1cm4gTUNJRVJSX1VOU1VQUE9SVEVEX0ZVTkNUSU9OOwogCWlmIChkd0ZsYWdzICYgTUNJX05PVElGWSkgewotCQlkcHJpbnRmX21jaWFuaW0oc3RkZGViLAorCQlkcHJpbnRmX2luZm8obWNpYW5pbSwKIAkJCSJBTklNX21jaVNldCAvLyBNQ0lfTk9USUZZX1NVQ0NFU1NGVUwgJTA4bFggIVxuIiwgCiAJCQlscFBhcm1zLT5kd0NhbGxiYWNrKTsKIAkJbWNpRHJpdmVyTm90aWZ5KChIV05EMTYpTE9XT1JEKGxwUGFybXMtPmR3Q2FsbGJhY2spLCAKZGlmZiAtLWdpdCBhL211bHRpbWVkaWEvbWNpY2RhLmMgYi9tdWx0aW1lZGlhL21jaWNkYS5jCmluZGV4IDY1YTMzNzUuLjdjNDNiN2QgMTAwNjQ0Ci0tLSBhL211bHRpbWVkaWEvbWNpY2RhLmMKKysrIGIvbXVsdGltZWRpYS9tY2ljZGEuYwpAQCAtMTQsNyArMTQsNiBAQAogI2luY2x1ZGUgInVzZXIuaCIKICNpbmNsdWRlICJkcml2ZXIuaCIKICNpbmNsdWRlICJtbXN5c3RlbS5oIgotI2luY2x1ZGUgInN0ZGRlYnVnLmgiCiAjaW5jbHVkZSAiZGVidWcuaCIKIAogI2lmZGVmIGxpbnV4CkBAIC05Niw3ICs5NSw3IEBACiAJCQkgIENESU9SRUFEVE9DSEVBREVSCiAjZW5kaWYKIAkJCSAgLCAmaGRyKSkgewotICAgICAgICAgICAgCQlkcHJpbnRmX2NkYXVkaW8oc3RkZGViLAorICAgICAgICAgICAgCQlkcHJpbnRmX3dhcm4oY2RhdWRpbywKIAkJCQkiR2V0TnVtYmVyT2ZUcmFja3MoJTA0WCkgLy8gRXJyb3Igb2NjdXJlZCAhXG4iLCAKIAkJCQl3RGV2SUQpOwogCQkJcmV0dXJuIChXT1JEKS0xOwpAQCAtMTMzLDcgKzEzMiw3IEBACiAJaWYgKENEQURldlt3RGV2SURdLm5UcmFja3MgPT0gMCkgewogCQlpZiAoQ0RBVURJT19HZXROdW1iZXJPZlRyYWNrcyh3RGV2SUQpID09IChXT1JEKS0xKSByZXR1cm4gRkFMU0U7CiAJCX0KLSAgICAJZHByaW50Zl9jZGF1ZGlvKHN0ZGRlYiwiQ0RBVURJT19HZXRUcmFja3NJbmZvIC8vIG5UcmFja3M9JXVcbiIsIAorICAgIAlkcHJpbnRmX2luZm8oY2RhdWRpbywiQ0RBVURJT19HZXRUcmFja3NJbmZvIC8vIG5UcmFja3M9JXVcbiIsIAogCQlDREFEZXZbd0RldklEXS5uVHJhY2tzKTsKIAlpZiAoQ0RBRGV2W3dEZXZJRF0ubHBkd1RyYWNrTGVuICE9IE5VTEwpIAogCQlmcmVlKENEQURldlt3RGV2SURdLmxwZHdUcmFja0xlbik7CkBAIC0xNDUsNyArMTQ0LDcgQEAKIAkJKENEQURldlt3RGV2SURdLm5UcmFja3MgKyAxKSAqIHNpemVvZihEV09SRCkpOwogCWlmIChDREFEZXZbd0RldklEXS5scGR3VHJhY2tMZW4gPT0gTlVMTCB8fAogCQlDREFEZXZbd0RldklEXS5scGR3VHJhY2tQb3MgPT0gTlVMTCkgewotICAgICAgICAJCWRwcmludGZfY2RhdWRpbyhzdGRkZWIsCisgICAgICAgIAkJZHByaW50Zl93YXJuKGNkYXVkaW8sCiAJCQkJIkNEQVVESU9fR2V0VHJhY2tzSW5mbyAvLyBlcnJvciBhbGxvY2F0aW5nIHRyYWNrIHRhYmxlICFcbiIpOwogCQlyZXR1cm4gRkFMU0U7CiAJCX0KQEAgLTE4Miw3ICsxODEsNyBAQAogCQkJICBDRElPUkVBRFRPQ0VOVFJZUwogI2VuZGlmCiAJCQkgICwgJmVudHJ5KSkgewotICAgICAgICAgICAgCQlkcHJpbnRmX2NkYXVkaW8oc3RkZGViLAorICAgICAgICAgICAgCQlkcHJpbnRmX3dhcm4oY2RhdWRpbywKIAkJCQkiQ0RBVURJT19HZXRUcmFja3NJbmZvIC8vIGVycm9yIHJlYWQgZW50cnlcbiIpOwogCQkJcmV0dXJuIEZBTFNFOwogCQkJfQpAQCAtMTk4LDcgKzE5Nyw3IEBACiAJCWlmIChpID09IDApIHsKIAkJCWxhc3Rfc3RhcnQgPSBzdGFydDsKIAkJCUNEQURldlt3RGV2SURdLmR3Rmlyc3RPZmZzZXQgPSBzdGFydDsKLSAgICAgICAgICAgIAkJZHByaW50Zl9jZGF1ZGlvKHN0ZGRlYiwKKyAgICAgICAgICAgIAkJZHByaW50Zl9pbmZvKGNkYXVkaW8sCiAJCQkJIkNEQVVESU9fR2V0VHJhY2tzSW5mbyAvLyBkd0ZpcnN0T2Zmc2V0PSV1XG4iLCAKIAkJCQlzdGFydCk7CiAJCQl9CkBAIC0yMDksMTMgKzIwOCwxMyBAQAogCQkJdG90YWxfbGVuZ3RoICs9IGxlbmd0aDsKIAkJCUNEQURldlt3RGV2SURdLmxwZHdUcmFja0xlbltpIC0gMV0gPSBsZW5ndGg7CiAJCQlDREFEZXZbd0RldklEXS5scGR3VHJhY2tQb3NbaSAtIDFdID0gc3RhcnQ7Ci0gICAgICAgICAgICAJCWRwcmludGZfY2RhdWRpbyhzdGRkZWIsCisgICAgICAgICAgICAJCWRwcmludGZfaW5mbyhjZGF1ZGlvLAogCQkJIkNEQVVESU9fR2V0VHJhY2tzSW5mbyAvLyB0cmFjayAjJXUgc3RhcnQ9JXUgbGVuPSV1XG4iLAogCQkJCWksIHN0YXJ0LCBsZW5ndGgpOwogCQkJfQogCQl9CiAJQ0RBRGV2W3dEZXZJRF0uZHdUb3RhbExlbiA9IHRvdGFsX2xlbmd0aDsKLSAgICAJZHByaW50Zl9jZGF1ZGlvKHN0ZGRlYiwiQ0RBVURJT19HZXRUcmFja3NJbmZvIC8vIHRvdGFsX2xlbj0ldVxuIiwgCisgICAgCWRwcmludGZfaW5mbyhjZGF1ZGlvLCJDREFVRElPX0dldFRyYWNrc0luZm8gLy8gdG90YWxfbGVuPSV1XG4iLCAKIAkJdG90YWxfbGVuZ3RoKTsKIAlyZXR1cm4gVFJVRTsKICNlbHNlCkBAIC0yMzAsNyArMjI5LDcgQEAKIHN0YXRpYyBEV09SRCBDREFVRElPX21jaU9wZW4oVUlOVDE2IHdEZXZJRCwgRFdPUkQgZHdGbGFncywgTFBNQ0lfT1BFTl9QQVJNUzE2IGxwUGFybXMpCiB7CiAjaWYgZGVmaW5lZChsaW51eCkgfHwgZGVmaW5lZChfX0ZyZWVCU0RfXykKLSAgICAJZHByaW50Zl9jZGF1ZGlvKHN0ZGRlYiwiQ0RBVURJT19tY2lPcGVuKCUwNFgsICUwOGxYLCAlcCk7XG4iLCAKKyAgICAJZHByaW50Zl9pbmZvKGNkYXVkaW8sIkNEQVVESU9fbWNpT3BlbiglMDRYLCAlMDhsWCwgJXApO1xuIiwgCiAJCQkJCXdEZXZJRCwgZHdGbGFncywgbHBQYXJtcyk7CiAJaWYgKGxwUGFybXMgPT0gTlVMTCkgcmV0dXJuIE1DSUVSUl9JTlRFUk5BTDsKIApAQCAtMjQ4LDE0ICsyNDcsMTQgQEAKIAkJQ0RBRGV2W3dEZXZJRF0uZlNoYXJlYWJsZSA9IGR3RmxhZ3MgJiBNQ0lfT1BFTl9TSEFSRUFCTEU7CiAJCX0KICAgICBpZiAoZHdGbGFncyAmIE1DSV9PUEVOX0VMRU1FTlQpIHsKLQkJZHByaW50Zl9jZGF1ZGlvKHN0ZGRlYiwiQ0RBVURJT19tY2lPcGVuIC8vIE1DSV9PUEVOX0VMRU1FTlQgIVxuIik7CisJCWRwcmludGZfaW5mbyhjZGF1ZGlvLCJDREFVRElPX21jaU9wZW4gLy8gTUNJX09QRU5fRUxFTUVOVCAhXG4iKTsKIC8qCQlyZXR1cm4gTUNJRVJSX05PX0VMRU1FTlRfQUxMT1dFRDsgKi8KIAkJfQogCW1lbWNweSgmQ0RBRGV2W3dEZXZJRF0ub3BlblBhcm1zLCBscFBhcm1zLCBzaXplb2YoTUNJX09QRU5fUEFSTVMxNikpOwogCUNEQURldlt3RGV2SURdLndOb3RpZnlEZXZpY2VJRCA9IGxwUGFybXMtPndEZXZpY2VJRDsKIAlDREFEZXZbd0RldklEXS51bml4ZGV2ID0gb3BlbiAoQ0RBVURJT19ERVYsIE9fUkRPTkxZLCAwKTsKIAlpZiAoQ0RBRGV2W3dEZXZJRF0udW5peGRldiA9PSAtMSkgewotCQlkcHJpbnRmX2NkYXVkaW8oc3RkZGViLCJDREFVRElPX21jaU9wZW4gLy8gY2FuJ3Qgb3BlbiAnJXMnICFcbiIsIENEQVVESU9fREVWKTsKKwkJZHByaW50Zl93YXJuKGNkYXVkaW8sIkNEQVVESU9fbWNpT3BlbiAvLyBjYW4ndCBvcGVuICclcycgIVxuIiwgQ0RBVURJT19ERVYpOwogCQlyZXR1cm4gTUNJRVJSX0hBUkRXQVJFOwogCQl9CiAJQ0RBRGV2W3dEZXZJRF0ubW9kZSA9IDA7CkBAIC0yNjcsNyArMjY2LDcgQEAKIAlDREFEZXZbd0RldklEXS5scGR3VHJhY2tMZW4gPSBOVUxMOwogCUNEQURldlt3RGV2SURdLmxwZHdUcmFja1BvcyA9IE5VTEw7CiAJaWYgKCFDREFVRElPX0dldFRyYWNrc0luZm8od0RldklEKSkgewotCQlkcHJpbnRmX2NkYXVkaW8oc3RkZGViLCJDREFVRElPX21jaU9wZW4gLy8gZXJyb3IgcmVhZGluZyBUcmFja3NJbmZvICFcbiIpOworCQlkcHJpbnRmX3dhcm4oY2RhdWRpbywiQ0RBVURJT19tY2lPcGVuIC8vIGVycm9yIHJlYWRpbmcgVHJhY2tzSW5mbyAhXG4iKTsKIC8qCQlyZXR1cm4gTUNJRVJSX0lOVEVSTkFMOyAqLwogCQl9CiAKQEAgLTI3NSw3ICsyNzQsNyBAQAogICAgTW92ZWQgdG8gbW1zeXN0ZW0uYyBtY2lPcGVuIHJvdXRpbmUKIAogCWlmIChkd0ZsYWdzICYgTUNJX05PVElGWSkgewotICAgICAgICAJZHByaW50Zl9jZGF1ZGlvKHN0ZGRlYiwKKyAgICAgICAgCWRwcmludGZfaW5mbyhjZGF1ZGlvLAogCQkJIkNEQVVESU9fbWNpT3BlbiAvLyBNQ0lfTk9USUZZX1NVQ0NFU1NGVUwgJTA4bFggIVxuIiwgCiAJCQlscFBhcm1zLT5kd0NhbGxiYWNrKTsKIAkJbWNpRHJpdmVyTm90aWZ5KChIV05EMTYpTE9XT1JEKGxwUGFybXMtPmR3Q2FsbGJhY2spLCAKQEAgLTI5NCw3ICsyOTMsNyBAQAogc3RhdGljIERXT1JEIENEQVVESU9fbWNpQ2xvc2UoVUlOVDE2IHdEZXZJRCwgRFdPUkQgZHdQYXJhbSwgTFBNQ0lfR0VORVJJQ19QQVJNUyBscFBhcm1zKQogewogI2lmIGRlZmluZWQobGludXgpIHx8IGRlZmluZWQoX19GcmVlQlNEX18pCi0gICAgCWRwcmludGZfY2RhdWRpbyhzdGRkZWIsIkNEQVVESU9fbWNpQ2xvc2UoJTA0WCwgJTA4bFgsICVwKTtcbiIsIAorICAgIAlkcHJpbnRmX2luZm8oY2RhdWRpbywiQ0RBVURJT19tY2lDbG9zZSglMDRYLCAlMDhsWCwgJXApO1xuIiwgCiAJCXdEZXZJRCwgZHdQYXJhbSwgbHBQYXJtcyk7CiAJaWYgKENEQURldlt3RGV2SURdLmxwZHdUcmFja0xlbiAhPSBOVUxMKSBmcmVlKENEQURldlt3RGV2SURdLmxwZHdUcmFja0xlbik7CiAJaWYgKENEQURldlt3RGV2SURdLmxwZHdUcmFja1BvcyAhPSBOVUxMKSBmcmVlKENEQURldlt3RGV2SURdLmxwZHdUcmFja1Bvcyk7CkBAIC0zMTAsMTEgKzMwOSwxMSBAQAogCQkJCQkJTFBNQ0lfR0VUREVWQ0FQU19QQVJNUyBscFBhcm1zKQogewogI2lmIGRlZmluZWQobGludXgpIHx8IGRlZmluZWQoX19GcmVlQlNEX18pCi0gICAgCWRwcmludGZfY2RhdWRpbyhzdGRkZWIsIkNEQVVESU9fbWNpR2V0RGV2Q2FwcyglMDRYLCAlMDhsWCwgJXApO1xuIiwgCisgICAgCWRwcmludGZfaW5mbyhjZGF1ZGlvLCJDREFVRElPX21jaUdldERldkNhcHMoJTA0WCwgJTA4bFgsICVwKTtcbiIsIAogCQl3RGV2SUQsIGR3RmxhZ3MsIGxwUGFybXMpOwogCWlmIChscFBhcm1zID09IE5VTEwpIHJldHVybiBNQ0lFUlJfSU5URVJOQUw7CiAJaWYgKGR3RmxhZ3MgJiBNQ0lfR0VUREVWQ0FQU19JVEVNKSB7Ci0gICAgICAgIAlkcHJpbnRmX2NkYXVkaW8oc3RkZGViLAorICAgICAgICAJZHByaW50Zl9pbmZvKGNkYXVkaW8sCiAJCSJDREFVRElPX21jaUdldERldkNhcHMgLy8gTUNJX0dFVERFVkNBUFNfSVRFTSBkd0l0ZW09JTA4bFg7XG4iLAogCQkJCWxwUGFybXMtPmR3SXRlbSk7CiAJCXN3aXRjaChscFBhcm1zLT5kd0l0ZW0pIHsKQEAgLTM0OSw3ICszNDgsNyBAQAogCQkJCXJldHVybiBNQ0lFUlJfVU5SRUNPR05JWkVEX0NPTU1BTkQ7CiAJCQl9CiAJCX0KLSAgICAJZHByaW50Zl9jZGF1ZGlvKHN0ZGRlYiwKKyAgICAJZHByaW50Zl9pbmZvKGNkYXVkaW8sCiAJCSJDREFVRElPX21jaUdldERldkNhcHMgLy8gbHBQYXJtcy0+ZHdSZXR1cm49JTA4bFg7XG4iLCAKIAkJbHBQYXJtcy0+ZHdSZXR1cm4pOwogIAlyZXR1cm4gMDsKQEAgLTM2NCw3ICszNjMsNyBAQAogc3RhdGljIERXT1JEIENEQVVESU9fbWNpSW5mbyhVSU5UMTYgd0RldklELCBEV09SRCBkd0ZsYWdzLCBMUE1DSV9JTkZPX1BBUk1TMTYgbHBQYXJtcykKIHsKICNpZiBkZWZpbmVkKGxpbnV4KSB8fCBkZWZpbmVkKF9fRnJlZUJTRF9fKQotICAgIAlkcHJpbnRmX2NkYXVkaW8oc3RkZGViLCJDREFVRElPX21jaUluZm8oJTA0WCwgJTA4bFgsICVwKTtcbiIsIAorICAgIAlkcHJpbnRmX2luZm8oY2RhdWRpbywiQ0RBVURJT19tY2lJbmZvKCUwNFgsICUwOGxYLCAlcCk7XG4iLCAKIAkJd0RldklELCBkd0ZsYWdzLCBscFBhcm1zKTsKIAlpZiAobHBQYXJtcyA9PSBOVUxMKSByZXR1cm4gTUNJRVJSX0lOVEVSTkFMOwogCWxwUGFybXMtPmxwc3RyUmV0dXJuID0gTlVMTDsKQEAgLTM5NSwxOCArMzk0LDE4IEBACiAjaWYgZGVmaW5lZChsaW51eCkgfHwgZGVmaW5lZChfX0ZyZWVCU0RfXykKIAlVSU5UMTYJd1RyYWNrOwogICAgIAotICAgIAlkcHJpbnRmX2NkYXVkaW8oc3RkZGViLCJDREFVRElPX0NhbGNGcmFtZSglMDRYLCAlMDhsWCwgJWx1KTtcbiIsIAorICAgIAlkcHJpbnRmX2luZm8oY2RhdWRpbywiQ0RBVURJT19DYWxjRnJhbWUoJTA0WCwgJTA4bFgsICVsdSk7XG4iLCAKIAkJd0RldklELCBkd0Zvcm1hdFR5cGUsIGR3VGltZSk7CiAgICAgCiAJc3dpdGNoIChkd0Zvcm1hdFR5cGUpIHsKIAkJY2FzZSBNQ0lfRk9STUFUX01JTExJU0VDT05EUzoKIAkJCWR3RnJhbWUgPSBkd1RpbWUgKiBDREZSQU1FU19QRVJTRUMgLyAxMDAwOwotICAgICAgICAgICAgCQlkcHJpbnRmX2NkYXVkaW8oc3RkZGViLAorICAgICAgICAgICAgCQlkcHJpbnRmX2luZm8oY2RhdWRpbywKIAkJCQkiQ0RBVURJT19DYWxjRnJhbWUgLy8gTUlMTElTRUNPTkRTICVsdVxuIiwgCiAJCQkJZHdGcmFtZSk7CiAJCQlicmVhazsKIAkJY2FzZSBNQ0lfRk9STUFUX01TRjoKLSAgICAgICAgICAgIAkJZHByaW50Zl9jZGF1ZGlvKHN0ZGRlYiwKKyAgICAgICAgICAgIAkJZHByaW50Zl9pbmZvKGNkYXVkaW8sCiAJCQkJIkNEQVVESU9fQ2FsY0ZyYW1lIC8vIE1TRiAlMDJ1OiUwMnU6JTAydVxuIiwKIAkJCQlNQ0lfTVNGX01JTlVURShkd1RpbWUpLCBNQ0lfTVNGX1NFQ09ORChkd1RpbWUpLCAKIAkJCQlNQ0lfTVNGX0ZSQU1FKGR3VGltZSkpOwpAQCAtNDE5LDExICs0MTgsMTEgQEAKIAkJCWR3Rm9ybWF0VHlwZSA9IE1DSV9GT1JNQVRfVE1TRjsKIAkJY2FzZSBNQ0lfRk9STUFUX1RNU0Y6CiAJCQl3VHJhY2sgPSBNQ0lfVE1TRl9UUkFDSyhkd1RpbWUpOwotICAgICAgICAgICAgCQlkcHJpbnRmX2NkYXVkaW8oc3RkZGViLAorICAgICAgICAgICAgCQlkcHJpbnRmX2luZm8oY2RhdWRpbywKIAkJCSJDREFVRElPX0NhbGNGcmFtZSAvLyBUTVNGICUwMnUtJTAydTolMDJ1OiUwMnVcbiIsCiAJCQkJCU1DSV9UTVNGX1RSQUNLKGR3VGltZSksIE1DSV9UTVNGX01JTlVURShkd1RpbWUpLCAKIAkJCQkJTUNJX1RNU0ZfU0VDT05EKGR3VGltZSksIE1DSV9UTVNGX0ZSQU1FKGR3VGltZSkpOwotICAgICAgICAgICAgCQlkcHJpbnRmX2NkYXVkaW8oc3RkZGViLAorICAgICAgICAgICAgCQlkcHJpbnRmX2luZm8oY2RhdWRpbywKIAkJCQkiQ0RBVURJT19DYWxjRnJhbWUgLy8gVE1TRiB0cmFja3Bvc1sldV09JWx1XG4iLAogCQkJCXdUcmFjaywgQ0RBRGV2W3dEZXZJRF0ubHBkd1RyYWNrUG9zW3dUcmFjayAtIDFdKTsKIAkJCWR3RnJhbWUgPSBDREFEZXZbd0RldklEXS5scGR3VHJhY2tQb3Nbd1RyYWNrIC0gMV07CkBAIC00NjIsNyArNDYxLDcgQEAKIAkJICBDRElPQ1JFQURTVUJDSEFOTkVMLCAmcmVhZF9zYwogI2VuZGlmCiAJCSAgKSkgewotICAgICAgICAJZHByaW50Zl9jZGF1ZGlvKHN0ZGRlYiwiQ0RBVURJT19HZXRDRFN0YXR1cyAvLyBvcGVuZWQgb3Igbm9fbWVkaWEgIVxuIik7CisgICAgICAgIAlkcHJpbnRmX2luZm8oY2RhdWRpbywiQ0RBVURJT19HZXRDRFN0YXR1cyAvLyBvcGVuZWQgb3Igbm9fbWVkaWEgIVxuIik7CiAJCUNEQURldlt3RGV2SURdLm1vZGUgPSBNQ0lfTU9ERV9OT1RfUkVBRFk7CiAJCXJldHVybiBUUlVFOwogCQl9CkBAIC00NzgsNyArNDc3LDcgQEAKICNlbGlmIF9fRnJlZUJTRF9fCiAJCWNhc2UgQ0RfQVNfQVVESU9fSU5WQUxJRDoKICNlbmRpZgotICAgICAgICAgICAgCQlkcHJpbnRmX2NkYXVkaW8oc3RkZGViLCJDREFVRElPX0dldENEU3RhdHVzIC8vIGRldmljZSBkb2Vzbid0IHN1cHBvcnQgc3RhdHVzLCByZXR1cm5pbmcgTk9UX1JFQURZLlxuIik7CisgICAgICAgICAgICAJCWRwcmludGZfd2FybihjZGF1ZGlvLCAiQ0RBVURJT19HZXRDRFN0YXR1cyAvLyBkZXZpY2UgZG9lc24ndCBzdXBwb3J0IHN0YXR1cywgcmV0dXJuaW5nIE5PVF9SRUFEWS5cbiIpOwogI2lmZGVmIGxpbnV4CiAJCQlDREFEZXZbd0RldklEXS5tb2RlID0gTUNJX01PREVfTk9UX1JFQURZOwogI2VsaWYgX19GcmVlQlNEX18KQEAgLTQ5MSw3ICs0OTAsNyBAQAogCQljYXNlIENEX0FTX05PX1NUQVRVUzoKICNlbmRpZgogCQkJQ0RBRGV2W3dEZXZJRF0ubW9kZSA9IE1DSV9NT0RFX1NUT1A7Ci0gICAgICAgICAgICAJCWRwcmludGZfY2RhdWRpbyhzdGRkZWIsIkNEQVVESU9fR2V0Q0RTdGF0dXMgLy8gTUNJX01PREVfU1RPUCAhXG4iKTsKKyAgICAgICAgICAgIAkJZHByaW50Zl9pbmZvKGNkYXVkaW8sIkNEQVVESU9fR2V0Q0RTdGF0dXMgLy8gTUNJX01PREVfU1RPUCAhXG4iKTsKIAkJCWJyZWFrOwogI2lmZGVmIGxpbnV4CiAJCWNhc2UgQ0RST01fQVVESU9fUExBWTogCkBAIC00OTksNyArNDk4LDcgQEAKIAkJY2FzZSBDRF9BU19QTEFZX0lOX1BST0dSRVNTOgogI2VuZGlmCiAJCQlDREFEZXZbd0RldklEXS5tb2RlID0gTUNJX01PREVfUExBWTsKLSAgICAgICAgICAgIAkJZHByaW50Zl9jZGF1ZGlvKHN0ZGRlYiwiQ0RBVURJT19HZXRDRFN0YXR1cyAvLyBNQ0lfTU9ERV9QTEFZICFcbiIpOworICAgICAgICAgICAgCQlkcHJpbnRmX2luZm8oY2RhdWRpbywiQ0RBVURJT19HZXRDRFN0YXR1cyAvLyBNQ0lfTU9ERV9QTEFZICFcbiIpOwogCQkJYnJlYWs7CiAjaWZkZWYgbGludXgKIAkJY2FzZSBDRFJPTV9BVURJT19QQVVTRUQ6CkBAIC01MDcsMTYgKzUwNiwxNiBAQAogCQljYXNlIENEX0FTX1BMQVlfUEFVU0VEOgogI2VuZGlmCiAJCQlDREFEZXZbd0RldklEXS5tb2RlID0gTUNJX01PREVfUEFVU0U7Ci0gICAgICAgICAgICAJCWRwcmludGZfY2RhdWRpbyhzdGRkZWIsIkNEQVVESU9fR2V0Q0RTdGF0dXMgLy8gTUNJX01PREVfUEFVU0UgIVxuIik7CisgICAgICAgICAgICAJCWRwcmludGZfaW5mbyhjZGF1ZGlvLCJDREFVRElPX0dldENEU3RhdHVzIC8vIE1DSV9NT0RFX1BBVVNFICFcbiIpOwogCQkJYnJlYWs7CiAJCWRlZmF1bHQ6Ci0gICAgICAgICAgICAJCWRwcmludGZfY2RhdWRpbyhzdGRkZWIsIkNEQVVESU9fR2V0Q0RTdGF0dXMgLy8gc3RhdHVzPSUwMlggIVxuIiwKICNpZmRlZiBsaW51eAotCQkJCQlDREFEZXZbd0RldklEXS5zYy5jZHNjX2F1ZGlvc3RhdHVzCisgICAgICAgICAgICAJCWRwcmludGZfaW5mbyhjZGF1ZGlvLCJDREFVRElPX0dldENEU3RhdHVzIC8vIHN0YXR1cz0lMDJYICFcbiIsCisJCQkJICAgICBDREFEZXZbd0RldklEXS5zYy5jZHNjX2F1ZGlvc3RhdHVzKTsKICNlbGlmIF9fRnJlZUJTRF9fCi0JCQkJCUNEQURldlt3RGV2SURdLnNjLmhlYWRlci5hdWRpb19zdGF0dXMKKyAgICAgICAgICAgIAkJZHByaW50Zl9pbmZvKGNkYXVkaW8sIkNEQVVESU9fR2V0Q0RTdGF0dXMgLy8gc3RhdHVzPSUwMlggIVxuIiwKKwkJCQkgICAgIENEQURldlt3RGV2SURdLnNjLmhlYWRlci5hdWRpb19zdGF0dXMpOwogI2VuZGlmCi0JCQkJCSk7CiAJCX0KICNpZmRlZiBsaW51eAogCUNEQURldlt3RGV2SURdLm5DdXJUcmFjayA9IENEQURldlt3RGV2SURdLnNjLmNkc2NfdHJrOwpAQCAtNTMxLDIyICs1MzAsMjMgQEAKIAkJQ0RGUkFNRVNfUEVSU0VDICogQ0RBRGV2W3dEZXZJRF0uc2Mud2hhdC5wb3NpdGlvbi5hYnNhZGRyLm1zZi5zZWNvbmQgKwogCQlDREFEZXZbd0RldklEXS5zYy53aGF0LnBvc2l0aW9uLmFic2FkZHIubXNmLmZyYW1lOwogI2VuZGlmCi0gICAgCWRwcmludGZfY2RhdWRpbyhzdGRkZWIsIkNEQVVESU9fR2V0Q0RTdGF0dXMgLy8gJTAydS0lMDJ1OiUwMnU6JTAydSBcbiIsCiAjaWZkZWYgbGludXgKLQkJQ0RBRGV2W3dEZXZJRF0uc2MuY2RzY190cmssCi0JCUNEQURldlt3RGV2SURdLnNjLmNkc2NfYWJzYWRkci5tc2YubWludXRlLAotCQlDREFEZXZbd0RldklEXS5zYy5jZHNjX2Fic2FkZHIubXNmLnNlY29uZCwKLQkJQ0RBRGV2W3dEZXZJRF0uc2MuY2RzY19hYnNhZGRyLm1zZi5mcmFtZQorICAgIAlkcHJpbnRmX2luZm8oY2RhdWRpbywiQ0RBVURJT19HZXRDRFN0YXR1cyAvLyAlMDJ1LSUwMnU6JTAydTolMDJ1IFxuIiwKKwkJICAgICBDREFEZXZbd0RldklEXS5zYy5jZHNjX3RyaywKKwkJICAgICBDREFEZXZbd0RldklEXS5zYy5jZHNjX2Fic2FkZHIubXNmLm1pbnV0ZSwKKwkJICAgICBDREFEZXZbd0RldklEXS5zYy5jZHNjX2Fic2FkZHIubXNmLnNlY29uZCwKKwkJICAgICBDREFEZXZbd0RldklEXS5zYy5jZHNjX2Fic2FkZHIubXNmLmZyYW1lKTsKICNlbGlmIF9fRnJlZUJTRF9fCi0JCUNEQURldlt3RGV2SURdLnNjLndoYXQucG9zaXRpb24udHJhY2tfbnVtYmVyLAotCQlDREFEZXZbd0RldklEXS5zYy53aGF0LnBvc2l0aW9uLmFic2FkZHIubXNmLm1pbnV0ZSwKLQkJQ0RBRGV2W3dEZXZJRF0uc2Mud2hhdC5wb3NpdGlvbi5hYnNhZGRyLm1zZi5zZWNvbmQsCi0JCUNEQURldlt3RGV2SURdLnNjLndoYXQucG9zaXRpb24uYWJzYWRkci5tc2YuZnJhbWUKKyAgICAJZHByaW50Zl9pbmZvKGNkYXVkaW8sIkNEQVVESU9fR2V0Q0RTdGF0dXMgLy8gJTAydS0lMDJ1OiUwMnU6JTAydSBcbiIsCisJCSAgICAgQ0RBRGV2W3dEZXZJRF0uc2Mud2hhdC5wb3NpdGlvbi50cmFja19udW1iZXIsCisJCSAgICAgQ0RBRGV2W3dEZXZJRF0uc2Mud2hhdC5wb3NpdGlvbi5hYnNhZGRyLm1zZi5taW51dGUsCisJCSAgICAgQ0RBRGV2W3dEZXZJRF0uc2Mud2hhdC5wb3NpdGlvbi5hYnNhZGRyLm1zZi5zZWNvbmQsCisJCSAgICAgQ0RBRGV2W3dEZXZJRF0uc2Mud2hhdC5wb3NpdGlvbi5hYnNhZGRyLm1zZi5mcmFtZSk7CiAjZW5kaWYKLQkJCSk7CisJCQkKIAlpZiAob2xkbW9kZSAhPSBDREFEZXZbd0RldklEXS5tb2RlICYmIG9sZG1vZGUgPT0gTUNJX01PREVfT1BFTikgewogCQlpZiAoIUNEQVVESU9fR2V0VHJhY2tzSW5mbyh3RGV2SUQpKSB7Ci0gICAgICAgICAgICBkcHJpbnRmX2NkYXVkaW8oc3RkZGViLCJDREFVRElPX0dldENEU3RhdHVzIC8vIGVycm9yIHVwZGF0aW5nIFRyYWNrc0luZm8gIVxuIik7CisJCSAgZHByaW50Zl93YXJuKGNkYXVkaW8sICJDREFVRElPX0dldENEU3RhdHVzIC8vIGVycm9yIHVwZGF0aW5nIFRyYWNrc0luZm8gIVxuIik7CiAJCQlyZXR1cm4gTUNJRVJSX0lOVEVSTkFMOwogCQkJfQogCQl9CkBAIC01NjksMTMgKzU2OSwxMyBAQAogCVVJTlQxNgl3U2Vjb25kczsKIAlVSU5UMTYJd0ZyYW1lczsKIAotICAgIAlkcHJpbnRmX2NkYXVkaW8oc3RkZGViLCJDREFVRElPX0NhbGNUaW1lKCUwNFgsICUwOGxYLCAlbHUpO1xuIiwgCisgICAgCWRwcmludGZfaW5mbyhjZGF1ZGlvLCJDREFVRElPX0NhbGNUaW1lKCUwNFgsICUwOGxYLCAlbHUpO1xuIiwgCiAJCXdEZXZJRCwgZHdGb3JtYXRUeXBlLCBkd0ZyYW1lKTsKIAogCXN3aXRjaCAoZHdGb3JtYXRUeXBlKSB7CiAJCWNhc2UgTUNJX0ZPUk1BVF9NSUxMSVNFQ09ORFM6CiAJCQlkd1RpbWUgPSBkd0ZyYW1lIC8gQ0RGUkFNRVNfUEVSU0VDICogMTAwMDsKLSAgICAgICAgICAgIAkJZHByaW50Zl9jZGF1ZGlvKHN0ZGRlYiwKKyAgICAgICAgICAgIAkJZHByaW50Zl9pbmZvKGNkYXVkaW8sCiAJCQkJIkNEQVVESU9fQ2FsY1RpbWUgLy8gTUlMTElTRUNPTkRTICVsdVxuIiwgCiAJCQkJZHdUaW1lKTsKIAkJCWJyZWFrOwpAQCAtNTg1LDcgKzU4NSw3IEBACiAJCQl3RnJhbWVzID0gZHdGcmFtZSAtIENERlJBTUVTX1BFUk1JTiAqIHdNaW51dGVzIC0gCiAJCQkJCQkJCUNERlJBTUVTX1BFUlNFQyAqIHdTZWNvbmRzOwogCQkJZHdUaW1lID0gTUNJX01BS0VfTVNGKHdNaW51dGVzLCB3U2Vjb25kcywgd0ZyYW1lcyk7Ci0gICAgICAgICAgICAJCWRwcmludGZfY2RhdWRpbyhzdGRkZWIsIkNEQVVESU9fQ2FsY1RpbWUgLy8gTVNGICUwMnU6JTAydTolMDJ1IC0+IGR3VGltZT0lbHVcbiIsCisgICAgICAgICAgICAJCWRwcmludGZfaW5mbyhjZGF1ZGlvLCJDREFVRElPX0NhbGNUaW1lIC8vIE1TRiAlMDJ1OiUwMnU6JTAydSAtPiBkd1RpbWU9JWx1XG4iLAogCQkJCQkJCQl3TWludXRlcywgd1NlY29uZHMsIHdGcmFtZXMsIGR3VGltZSk7CiAJCQlicmVhazsKIAkJZGVmYXVsdDoKQEAgLTYwMyw3ICs2MDMsNyBAQAogCQkJd0ZyYW1lcyA9IGR3RnJhbWUgLSBDREZSQU1FU19QRVJNSU4gKiB3TWludXRlcyAtIAogCQkJCQkJCQlDREZSQU1FU19QRVJTRUMgKiB3U2Vjb25kczsKIAkJCWR3VGltZSA9IE1DSV9NQUtFX1RNU0Yod1RyYWNrLCB3TWludXRlcywgd1NlY29uZHMsIHdGcmFtZXMpOwotICAgICAgICAgICAgCQlkcHJpbnRmX2NkYXVkaW8oc3RkZGViLAorICAgICAgICAgICAgCQlkcHJpbnRmX2luZm8oY2RhdWRpbywKIAkJCQkiQ0RBVURJT19DYWxjVGltZSAvLyAlMDJ1LSUwMnU6JTAydTolMDJ1XG4iLAogCQkJCQl3VHJhY2ssIHdNaW51dGVzLCB3U2Vjb25kcywgd0ZyYW1lcyk7CiAJCQlicmVhazsKQEAgLTYxOSwxMiArNjE5LDEyIEBACiBzdGF0aWMgRFdPUkQgQ0RBVURJT19tY2lTdGF0dXMoVUlOVDE2IHdEZXZJRCwgRFdPUkQgZHdGbGFncywgTFBNQ0lfU1RBVFVTX1BBUk1TIGxwUGFybXMpCiB7CiAjaWYgZGVmaW5lZChsaW51eCkgfHwgZGVmaW5lZChfX0ZyZWVCU0RfXykKLSAgICAJZHByaW50Zl9jZGF1ZGlvKHN0ZGRlYiwiQ0RBVURJT19tY2lTdGF0dXMoJTA0WCwgJTA4bFgsICVwKTtcbiIsIAorICAgIAlkcHJpbnRmX2luZm8oY2RhdWRpbywiQ0RBVURJT19tY2lTdGF0dXMoJTA0WCwgJTA4bFgsICVwKTtcbiIsIAogCQl3RGV2SUQsIGR3RmxhZ3MsIGxwUGFybXMpOwogCWlmIChscFBhcm1zID09IE5VTEwpIHJldHVybiBNQ0lFUlJfSU5URVJOQUw7CiAJaWYgKENEQURldlt3RGV2SURdLnVuaXhkZXYgPT0gMCkgcmV0dXJuIE1NU1lTRVJSX05PVEVOQUJMRUQ7CiAJaWYgKGR3RmxhZ3MgJiBNQ0lfTk9USUZZKSB7Ci0gICAgICAgIAlkcHJpbnRmX2NkYXVkaW8oc3RkZGViLAorICAgICAgICAJZHByaW50Zl9pbmZvKGNkYXVkaW8sCiAJCQkiQ0RBVURJT19tY2lTdGF0dXMgLy8gTUNJX05PVElGWV9TVUNDRVNTRlVMICUwOGxYICFcbiIsIAogCQkJbHBQYXJtcy0+ZHdDYWxsYmFjayk7CiAJCW1jaURyaXZlck5vdGlmeSgoSFdORDE2KUxPV09SRChscFBhcm1zLT5kd0NhbGxiYWNrKSwgCkBAIC02MzUsMTcgKzYzNSwxNyBAQAogCQkJY2FzZSBNQ0lfU1RBVFVTX0NVUlJFTlRfVFJBQ0s6CiAJCQkJaWYgKCFDREFVRElPX0dldENEU3RhdHVzKHdEZXZJRCkpIHJldHVybiBNQ0lFUlJfSU5URVJOQUw7CiAJCQkJbHBQYXJtcy0+ZHdSZXR1cm4gPSBDREFEZXZbd0RldklEXS5uQ3VyVHJhY2s7Ci0gICAgICAgICAgICAgICAgCQlkcHJpbnRmX2NkYXVkaW8oc3RkZGViLCJDREFVRElPX21jaVN0YXR1cyAvLyBDVVJSRU5UX1RSQUNLPSVsdSFcbiIsIGxwUGFybXMtPmR3UmV0dXJuKTsKKyAgICAgICAgICAgICAgICAJCWRwcmludGZfaW5mbyhjZGF1ZGlvLCJDREFVRElPX21jaVN0YXR1cyAvLyBDVVJSRU5UX1RSQUNLPSVsdSFcbiIsIGxwUGFybXMtPmR3UmV0dXJuKTsKIAkJCSAJcmV0dXJuIDA7CiAJCQljYXNlIE1DSV9TVEFUVVNfTEVOR1RIOgogCQkJCWlmIChDREFEZXZbd0RldklEXS5uVHJhY2tzID09IDApIHsKIAkJCQkJaWYgKCFDREFVRElPX0dldFRyYWNrc0luZm8od0RldklEKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgCQkJZHByaW50Zl9jZGF1ZGlvKHN0ZGRlYiwiQ0RBVURJT19tY2lTdGF0dXMgLy8gZXJyb3IgcmVhZGluZyBUcmFja3NJbmZvICFcbiIpOworICAgICAgICAgICAgICAgICAgICAgICAgCQkJZHByaW50Zl93YXJuKGNkYXVkaW8sICJDREFVRElPX21jaVN0YXR1cyAvLyBlcnJvciByZWFkaW5nIFRyYWNrc0luZm8gIVxuIik7CiAJCQkJCQlyZXR1cm4gTUNJRVJSX0lOVEVSTkFMOwogCQkJCQkJfQogCQkJCQl9CiAJCQkJaWYgKGR3RmxhZ3MgJiBNQ0lfVFJBQ0spIHsKLQkJCQkJZHByaW50Zl9jZGF1ZGlvKHN0ZGRlYiwiQ0RBVURJT19tY2lTdGF0dXMgLy8gTUNJX1RSQUNLICMlbHUgTEVOR1RIPT8/PyAhXG4iLAorCQkJCQlkcHJpbnRmX2luZm8oY2RhdWRpbywiQ0RBVURJT19tY2lTdGF0dXMgLy8gTUNJX1RSQUNLICMlbHUgTEVOR1RIPT8/PyAhXG4iLAogCQkJCQkJCWxwUGFybXMtPmR3VHJhY2spOwogCQkJCQlpZiAobHBQYXJtcy0+ZHdUcmFjayA+IENEQURldlt3RGV2SURdLm5UcmFja3MpCiAJCQkJCQlyZXR1cm4gTUNJRVJSX09VVE9GUkFOR0U7CkBAIC02NTUsMjQgKzY1NSwyNCBAQAogCQkJCQlscFBhcm1zLT5kd1JldHVybiA9IENEQURldlt3RGV2SURdLmR3VG90YWxMZW47CiAJCQkJbHBQYXJtcy0+ZHdSZXR1cm4gPSBDREFVRElPX0NhbGNUaW1lKHdEZXZJRCwgCiAJCQkJCUNEQURldlt3RGV2SURdLmR3VGltZUZvcm1hdCwgbHBQYXJtcy0+ZHdSZXR1cm4pOwotICAgICAgICAgICAgICAgIAkJZHByaW50Zl9jZGF1ZGlvKHN0ZGRlYiwiQ0RBVURJT19tY2lTdGF0dXMgLy8gTEVOR1RIPSVsdSAhXG4iLCBscFBhcm1zLT5kd1JldHVybik7CisgICAgICAgICAgICAgICAgCQlkcHJpbnRmX2luZm8oY2RhdWRpbywiQ0RBVURJT19tY2lTdGF0dXMgLy8gTEVOR1RIPSVsdSAhXG4iLCBscFBhcm1zLT5kd1JldHVybik7CiAJCQkgCXJldHVybiAwOwogCQkJY2FzZSBNQ0lfU1RBVFVTX01PREU6CiAJCQkJaWYgKCFDREFVRElPX0dldENEU3RhdHVzKHdEZXZJRCkpIHJldHVybiBNQ0lFUlJfSU5URVJOQUw7CiAJCQkJbHBQYXJtcy0+ZHdSZXR1cm4gPSBDREFEZXZbd0RldklEXS5tb2RlOwotICAgICAgICAgICAgICAgIAkJZHByaW50Zl9jZGF1ZGlvKHN0ZGRlYiwiQ0RBVURJT19tY2lTdGF0dXMgLy8gTUNJX1NUQVRVU19NT0RFPSUwOGxYICFcbiIsCisgICAgICAgICAgICAgICAgCQlkcHJpbnRmX2luZm8oY2RhdWRpbywiQ0RBVURJT19tY2lTdGF0dXMgLy8gTUNJX1NUQVRVU19NT0RFPSUwOGxYICFcbiIsCiAJCQkJCQkJCQkJCQlscFBhcm1zLT5kd1JldHVybik7CiAJCQkgCXJldHVybiAwOwogCQkJY2FzZSBNQ0lfU1RBVFVTX01FRElBX1BSRVNFTlQ6CiAJCQkJbHBQYXJtcy0+ZHdSZXR1cm4gPSAoQ0RBRGV2W3dEZXZJRF0ublRyYWNrcyA+IDApID8gVFJVRSA6IEZBTFNFOwogCQkJCWlmIChscFBhcm1zLT5kd1JldHVybiA9PSBGQUxTRSkKLSAgICAgICAgICAgICAgICAgICAgCQkJZHByaW50Zl9jZGF1ZGlvKHN0ZGRlYiwiQ0RBVURJT19tY2lTdGF0dXMgLy8gTUVESUFfTk9UX1BSRVNFTlQgIVxuIik7CisgICAgICAgICAgICAgICAgICAgIAkJCWRwcmludGZfaW5mbyhjZGF1ZGlvLCJDREFVRElPX21jaVN0YXR1cyAvLyBNRURJQV9OT1RfUFJFU0VOVCAhXG4iKTsKIAkJCQllbHNlCi0gICAgICAgICAgICAgICAgICAgIAkJCWRwcmludGZfY2RhdWRpbyhzdGRkZWIsIkNEQVVESU9fbWNpU3RhdHVzIC8vIE1DSV9TVEFUVVNfTUVESUFfUFJFU0VOVCAhXG4iKTsKKyAgICAgICAgICAgICAgICAgICAgCQkJZHByaW50Zl9pbmZvKGNkYXVkaW8sIkNEQVVESU9fbWNpU3RhdHVzIC8vIE1DSV9TVEFUVVNfTUVESUFfUFJFU0VOVCAhXG4iKTsKIAkJCSAJcmV0dXJuIDA7CiAJCQljYXNlIE1DSV9TVEFUVVNfTlVNQkVSX09GX1RSQUNLUzoKIAkJCQlscFBhcm1zLT5kd1JldHVybiA9IENEQVVESU9fR2V0TnVtYmVyT2ZUcmFja3Mod0RldklEKTsKLSAgICAgICAgICAgICAgICAJCWRwcmludGZfY2RhdWRpbyhzdGRkZWIsIkNEQVVESU9fbWNpU3RhdHVzIC8vIE1DSV9TVEFUVVNfTlVNQkVSX09GX1RSQUNLUyA9ICVsdSAhXG4iLAorICAgICAgICAgICAgICAgIAkJZHByaW50Zl9pbmZvKGNkYXVkaW8sIkNEQVVESU9fbWNpU3RhdHVzIC8vIE1DSV9TVEFUVVNfTlVNQkVSX09GX1RSQUNLUyA9ICVsdSAhXG4iLAogCQkJCQkJCQkJCQkJCWxwUGFybXMtPmR3UmV0dXJuKTsKIAkJCQlpZiAobHBQYXJtcy0+ZHdSZXR1cm4gPT0gKFdPUkQpLTEpIHJldHVybiBNQ0lFUlJfSU5URVJOQUw7CiAJCQkgCXJldHVybiAwOwpAQCAtNjgxLDMzICs2ODEsMzMgQEAKIAkJCQlscFBhcm1zLT5kd1JldHVybiA9IENEQURldlt3RGV2SURdLmR3Q3VyRnJhbWU7CiAJCQkJaWYgKGR3RmxhZ3MgJiBNQ0lfU1RBVFVTX1NUQVJUKSB7CiAJCQkJCWxwUGFybXMtPmR3UmV0dXJuID0gQ0RBRGV2W3dEZXZJRF0uZHdGaXJzdE9mZnNldDsKLSAgICAgICAgICAgICAgICAgICAgCQkJZHByaW50Zl9jZGF1ZGlvKHN0ZGRlYiwiQ0RBVURJT19tY2lTdGF0dXMgLy8gZ2V0IE1DSV9TVEFUVVNfU1RBUlQgIVxuIik7CisgICAgICAgICAgICAgICAgICAgIAkJCWRwcmludGZfaW5mbyhjZGF1ZGlvLCJDREFVRElPX21jaVN0YXR1cyAvLyBnZXQgTUNJX1NUQVRVU19TVEFSVCAhXG4iKTsKIAkJCQkJfQogCQkJCWlmIChkd0ZsYWdzICYgTUNJX1RSQUNLKSB7CiAJCQkJCWlmIChscFBhcm1zLT5kd1RyYWNrID4gQ0RBRGV2W3dEZXZJRF0ublRyYWNrcykKIAkJCQkJCXJldHVybiBNQ0lFUlJfT1VUT0ZSQU5HRTsKIAkJCQkJbHBQYXJtcy0+ZHdSZXR1cm4gPSBDREFEZXZbd0RldklEXS5scGR3VHJhY2tQb3NbbHBQYXJtcy0+ZHdUcmFjayAtIDFdOwotICAgICAgICAgICAgICAgICAgICAJCQlkcHJpbnRmX2NkYXVkaW8oc3RkZGViLCJDREFVRElPX21jaVN0YXR1cyAvLyBnZXQgTUNJX1RSQUNLICMlbHUgIVxuIiwgbHBQYXJtcy0+ZHdUcmFjayk7CisgICAgICAgICAgICAgICAgICAgIAkJCWRwcmludGZfaW5mbyhjZGF1ZGlvLCJDREFVRElPX21jaVN0YXR1cyAvLyBnZXQgTUNJX1RSQUNLICMlbHUgIVxuIiwgbHBQYXJtcy0+ZHdUcmFjayk7CiAJCQkJCX0KIAkJCQlscFBhcm1zLT5kd1JldHVybiA9IENEQVVESU9fQ2FsY1RpbWUod0RldklELAogCQkJCQlDREFEZXZbd0RldklEXS5kd1RpbWVGb3JtYXQsIGxwUGFybXMtPmR3UmV0dXJuKTsKLSAgICAgICAgICAgICAgICAJCQlkcHJpbnRmX2NkYXVkaW8oc3RkZGViLCJDREFVRElPX21jaVN0YXR1cyAvLyBNQ0lfU1RBVFVTX1BPU0lUSU9OPSUwOGxYICFcbiIsCisgICAgICAgICAgICAgICAgCQkJZHByaW50Zl9pbmZvKGNkYXVkaW8sIkNEQVVESU9fbWNpU3RhdHVzIC8vIE1DSV9TVEFUVVNfUE9TSVRJT049JTA4bFggIVxuIiwKIAkJCQkJCQkJCQkJCQkJbHBQYXJtcy0+ZHdSZXR1cm4pOwogCQkJIAlyZXR1cm4gMDsKIAkJCWNhc2UgTUNJX1NUQVRVU19SRUFEWToKLSAgICAgICAgICAgICAgICAJCWRwcmludGZfY2RhdWRpbyhzdGRkZWIsIkNEQVVESU9fbWNpU3RhdHVzIC8vIE1DSV9TVEFUVVNfUkVBRFkgIVxuIik7CisgICAgICAgICAgICAgICAgCQlkcHJpbnRmX2luZm8oY2RhdWRpbywiQ0RBVURJT19tY2lTdGF0dXMgLy8gTUNJX1NUQVRVU19SRUFEWSAhXG4iKTsKIAkJCQlscFBhcm1zLT5kd1JldHVybiA9IFRSVUU7CiAJCQkgCXJldHVybiAwOwogCQkJY2FzZSBNQ0lfU1RBVFVTX1RJTUVfRk9STUFUOgotICAgICAgICAgICAgICAgIAkJZHByaW50Zl9jZGF1ZGlvKHN0ZGRlYiwiQ0RBVURJT19tY2lTdGF0dXMgLy8gTUNJX1NUQVRVU19USU1FX0ZPUk1BVCAhXG4iKTsKKyAgICAgICAgICAgICAgICAJCWRwcmludGZfaW5mbyhjZGF1ZGlvLCJDREFVRElPX21jaVN0YXR1cyAvLyBNQ0lfU1RBVFVTX1RJTUVfRk9STUFUICFcbiIpOwogCQkJCWxwUGFybXMtPmR3UmV0dXJuID0gQ0RBRGV2W3dEZXZJRF0uZHdUaW1lRm9ybWF0OwogCQkJIAlyZXR1cm4gMDsKIAkJCWRlZmF1bHQ6Ci0gICAgICAgICAgICAgICAgCQlkcHJpbnRmX2NkYXVkaW8oc3RkZGViLCJDREFVRElPX21jaVN0YXR1cyAvLyB1bmtub3duIGNvbW1hbmQgJTA4bFggIVxuIiwgbHBQYXJtcy0+ZHdJdGVtKTsKKyAgICAgICAgICAgICAgICAJCWRwcmludGZfd2FybihjZGF1ZGlvLCAiQ0RBVURJT19tY2lTdGF0dXMgLy8gdW5rbm93biBjb21tYW5kICUwOGxYICFcbiIsIGxwUGFybXMtPmR3SXRlbSk7CiAJCQkJcmV0dXJuIE1DSUVSUl9VTlJFQ09HTklaRURfQ09NTUFORDsKIAkJCX0KIAkJfQotCWRwcmludGZfY2RhdWRpbyhzdGRkZWIsIkNEQVVESU9fbWNpU3RhdHVzIC8vIG5vdCBNQ0lfU1RBVFVTX0lURU0gIVxuIik7CisJZHByaW50Zl93YXJuKGNkYXVkaW8sICJDREFVRElPX21jaVN0YXR1cyAvLyBub3QgTUNJX1NUQVRVU19JVEVNICFcbiIpOwogIAlyZXR1cm4gMDsKICNlbHNlCiAJcmV0dXJuIE1NU1lTRVJSX05PVEVOQUJMRUQ7CkBAIC03MjgsNyArNzI4LDcgQEAKIAlzdHJ1Y3QJaW9jX3BsYXlfbXNmCW1zZjsKICNlbmRpZgogCi0gICAgCWRwcmludGZfY2RhdWRpbyhzdGRkZWIsIkNEQVVESU9fbWNpUGxheSglMDRYLCAlMDhsWCwgJXApO1xuIiwgCisgICAgCWRwcmludGZfaW5mbyhjZGF1ZGlvLCJDREFVRElPX21jaVBsYXkoJTA0WCwgJTA4bFgsICVwKTtcbiIsIAogCQl3RGV2SUQsIGR3RmxhZ3MsIGxwUGFybXMpOwogCWlmIChscFBhcm1zID09IE5VTEwpIHJldHVybiBNQ0lFUlJfSU5URVJOQUw7CiAJaWYgKENEQURldlt3RGV2SURdLnVuaXhkZXYgPT0gMCkgcmV0dXJuIE1NU1lTRVJSX05PVEVOQUJMRUQ7CkBAIC03MzcsMTMgKzczNywxMyBAQAogCWlmIChkd0ZsYWdzICYgTUNJX0ZST00pIHsKIAkJc3RhcnQgPSBDREFVRElPX0NhbGNGcmFtZSh3RGV2SUQsIAogCQkJQ0RBRGV2W3dEZXZJRF0uZHdUaW1lRm9ybWF0LCBscFBhcm1zLT5kd0Zyb20pOyAKLSAgICAgICAgZHByaW50Zl9jZGF1ZGlvKHN0ZGRlYiwiQ0RBVURJT19tY2lQbGF5IC8vIE1DSV9GUk9NPSUwOGxYIC0+ICV1IFxuIiwKKyAgICAgICAgZHByaW50Zl9pbmZvKGNkYXVkaW8sIkNEQVVESU9fbWNpUGxheSAvLyBNQ0lfRlJPTT0lMDhsWCAtPiAldSBcbiIsCiAJCQkJbHBQYXJtcy0+ZHdGcm9tLCBzdGFydCk7CiAJCX0KIAlpZiAoZHdGbGFncyAmIE1DSV9UTykgewogCQllbmQgPSBDREFVRElPX0NhbGNGcmFtZSh3RGV2SUQsIAogCQkJQ0RBRGV2W3dEZXZJRF0uZHdUaW1lRm9ybWF0LCBscFBhcm1zLT5kd1RvKTsKLSAgICAgICAgCWRwcmludGZfY2RhdWRpbyhzdGRkZWIsCisgICAgICAgIAlkcHJpbnRmX2luZm8oY2RhdWRpbywKIAkJCSJDREFVRElPX21jaVBsYXkgLy8gTUNJX1RPPSUwOGxYIC0+ICV1IFxuIiwKIAkJCWxwUGFybXMtPmR3VG8sIGVuZCk7CiAJCX0KQEAgLTc3MSw3ICs3NzEsNyBAQAogCQkgIENESU9DU1RBUlQKICNlbmRpZgogCQkgICkpIHsKLSAgICAgICAgCWRwcmludGZfY2RhdWRpbyhzdGRkZWIsIkNEQVVESU9fbWNpUGxheSAvLyBtb3RvciBkb2Vzbid0IHN0YXJ0ICFcbiIpOworICAgICAgICAJZHByaW50Zl93YXJuKGNkYXVkaW8sICJDREFVRElPX21jaVBsYXkgLy8gbW90b3IgZG9lc24ndCBzdGFydCAhXG4iKTsKIAkJcmV0dXJuIE1DSUVSUl9IQVJEV0FSRTsKIAkJfQogCWlmIChpb2N0bChDREFEZXZbd0RldklEXS51bml4ZGV2LCAKQEAgLTc4MSwyMSArNzgxLDIxIEBACiAJCSAgQ0RJT0NQTEFZTVNGCiAjZW5kaWYKIAkJICAsICZtc2YpKSB7Ci0gICAgICAgIAlkcHJpbnRmX2NkYXVkaW8oc3RkZGViLCJDREFVRElPX21jaVBsYXkgLy8gZGV2aWNlIGRvZXNuJ3QgcGxheSAhXG4iKTsKKyAgICAgICAgCWRwcmludGZfd2FybihjZGF1ZGlvLCAiQ0RBVURJT19tY2lQbGF5IC8vIGRldmljZSBkb2Vzbid0IHBsYXkgIVxuIik7CiAJCXJldHVybiBNQ0lFUlJfSEFSRFdBUkU7CiAJCX0KLSAgICAJZHByaW50Zl9jZGF1ZGlvKHN0ZGRlYiwiQ0RBVURJT19tY2lQbGF5IC8vIG1zZiA9ICVkOiVkOiVkICVkOiVkOiVkXG4iLAogI2lmZGVmIGxpbnV4CisgICAgCWRwcmludGZfaW5mbyhjZGF1ZGlvLCJDREFVRElPX21jaVBsYXkgLy8gbXNmID0gJWQ6JWQ6JWQgJWQ6JWQ6JWRcbiIsCiAJCW1zZi5jZG1zZl9taW4wLCBtc2YuY2Rtc2Zfc2VjMCwgbXNmLmNkbXNmX2ZyYW1lMCwKLQkJbXNmLmNkbXNmX21pbjEsIG1zZi5jZG1zZl9zZWMxLCBtc2YuY2Rtc2ZfZnJhbWUxCisJCW1zZi5jZG1zZl9taW4xLCBtc2YuY2Rtc2Zfc2VjMSwgbXNmLmNkbXNmX2ZyYW1lMSk7CiAjZWxpZiBfX0ZyZWVCU0RfXworICAgIAlkcHJpbnRmX2luZm8oY2RhdWRpbywiQ0RBVURJT19tY2lQbGF5IC8vIG1zZiA9ICVkOiVkOiVkICVkOiVkOiVkXG4iLAogCQltc2Yuc3RhcnRfbSwgbXNmLnN0YXJ0X3MsIG1zZi5zdGFydF9mLAotCQltc2YuZW5kX20sICAgbXNmLmVuZF9zLCAgIG1zZi5lbmRfZgorCQltc2YuZW5kX20sICAgbXNmLmVuZF9zLCAgIG1zZi5lbmRfZik7CiAjZW5kaWYKLQkJCSk7CiAJQ0RBRGV2W3dEZXZJRF0ubW9kZSA9IE1DSV9NT0RFX1BMQVk7CiAJaWYgKGR3RmxhZ3MgJiBNQ0lfTk9USUZZKSB7Ci0gICAgICAgIAlkcHJpbnRmX2NkYXVkaW8oc3RkZGViLAorICAgICAgICAJZHByaW50Zl9pbmZvKGNkYXVkaW8sCiAJCQkiQ0RBVURJT19tY2lQbGF5IC8vIE1DSV9OT1RJRllfU1VDQ0VTU0ZVTCAlMDhsWCAhXG4iLCAKIAkJCWxwUGFybXMtPmR3Q2FsbGJhY2spOwogLyoKQEAgLTgxNSw3ICs4MTUsNyBAQAogc3RhdGljIERXT1JEIENEQVVESU9fbWNpU3RvcChVSU5UMTYgd0RldklELCBEV09SRCBkd0ZsYWdzLCBMUE1DSV9HRU5FUklDX1BBUk1TIGxwUGFybXMpCiB7CiAjaWYgZGVmaW5lZChsaW51eCkgfHwgZGVmaW5lZChfX0ZyZWVCU0RfXykKLSAgICAJZHByaW50Zl9jZGF1ZGlvKHN0ZGRlYiwiQ0RBVURJT19tY2lTdG9wKCUwNFgsICUwOGxYLCAlcCk7XG4iLCAKKyAgICAJZHByaW50Zl9pbmZvKGNkYXVkaW8sIkNEQVVESU9fbWNpU3RvcCglMDRYLCAlMDhsWCwgJXApO1xuIiwgCiAJCXdEZXZJRCwgZHdGbGFncywgbHBQYXJtcyk7CiAJaWYgKGxwUGFybXMgPT0gTlVMTCkgcmV0dXJuIE1DSUVSUl9JTlRFUk5BTDsKIAlpZiAoaW9jdGwoQ0RBRGV2W3dEZXZJRF0udW5peGRldiwKQEAgLTgyNyw3ICs4MjcsNyBAQAogCQkgICkpIHJldHVybiBNQ0lFUlJfSEFSRFdBUkU7CiAJQ0RBRGV2W3dEZXZJRF0ubW9kZSA9IE1DSV9NT0RFX1NUT1A7CiAJaWYgKGR3RmxhZ3MgJiBNQ0lfTk9USUZZKSB7Ci0gICAgICAgIAlkcHJpbnRmX2NkYXVkaW8oc3RkZGViLAorICAgICAgICAJZHByaW50Zl9pbmZvKGNkYXVkaW8sCiAJCQkiQ0RBVURJT19tY2lTdG9wIC8vIE1DSV9OT1RJRllfU1VDQ0VTU0ZVTCAlMDhsWCAhXG4iLCAKIAkJCWxwUGFybXMtPmR3Q2FsbGJhY2spOwogCQltY2lEcml2ZXJOb3RpZnkoKEhXTkQxNilMT1dPUkQobHBQYXJtcy0+ZHdDYWxsYmFjayksIApAQCAtODQ1LDcgKzg0NSw3IEBACiBzdGF0aWMgRFdPUkQgQ0RBVURJT19tY2lQYXVzZShVSU5UMTYgd0RldklELCBEV09SRCBkd0ZsYWdzLCBMUE1DSV9HRU5FUklDX1BBUk1TIGxwUGFybXMpCiB7CiAjaWYgZGVmaW5lZChsaW51eCkgfHwgZGVmaW5lZChfX0ZyZWVCU0RfXykKLSAgICAJZHByaW50Zl9jZGF1ZGlvKHN0ZGRlYiwiQ0RBVURJT19tY2lQYXVzZSglMDRYLCAlMDhsWCwgJXApO1xuIiwgCisgICAgCWRwcmludGZfaW5mbyhjZGF1ZGlvLCJDREFVRElPX21jaVBhdXNlKCUwNFgsICUwOGxYLCAlcCk7XG4iLCAKIAkJd0RldklELCBkd0ZsYWdzLCBscFBhcm1zKTsKIAlpZiAobHBQYXJtcyA9PSBOVUxMKSByZXR1cm4gTUNJRVJSX0lOVEVSTkFMOwogCWlmIChpb2N0bChDREFEZXZbd0RldklEXS51bml4ZGV2LApAQCAtODU3LDcgKzg1Nyw3IEBACiAJCSAgKSkgcmV0dXJuIE1DSUVSUl9IQVJEV0FSRTsKIAlDREFEZXZbd0RldklEXS5tb2RlID0gTUNJX01PREVfUEFVU0U7CiAJaWYgKGR3RmxhZ3MgJiBNQ0lfTk9USUZZKSB7Ci0gICAgICAgIGRwcmludGZfY2RhdWRpbyhzdGRkZWIsCisgICAgICAgIGRwcmludGZfaW5mbyhjZGF1ZGlvLAogCQkiQ0RBVURJT19tY2lQYXVzZSAvLyBNQ0lfTk9USUZZX1NVQ0NFU1NGVUwgJTA4bFggIVxuIiwgCiAJCWxwUGFybXMtPmR3Q2FsbGJhY2spOwogCQltY2lEcml2ZXJOb3RpZnkoKEhXTkQxNilMT1dPUkQobHBQYXJtcy0+ZHdDYWxsYmFjayksIApAQCAtODc1LDcgKzg3NSw3IEBACiBzdGF0aWMgRFdPUkQgQ0RBVURJT19tY2lSZXN1bWUoVUlOVDE2IHdEZXZJRCwgRFdPUkQgZHdGbGFncywgTFBNQ0lfR0VORVJJQ19QQVJNUyBscFBhcm1zKQogewogI2lmIGRlZmluZWQobGludXgpIHx8IGRlZmluZWQoX19GcmVlQlNEX18pCi0gICAgCWRwcmludGZfY2RhdWRpbyhzdGRkZWIsIkNEQVVESU9fbWNpUmVzdW1lKCUwNFgsICUwOGxYLCAlcCk7XG4iLCAKKyAgICAJZHByaW50Zl9pbmZvKGNkYXVkaW8sIkNEQVVESU9fbWNpUmVzdW1lKCUwNFgsICUwOGxYLCAlcCk7XG4iLCAKIAkJd0RldklELCBkd0ZsYWdzLCBscFBhcm1zKTsKIAlpZiAobHBQYXJtcyA9PSBOVUxMKSByZXR1cm4gTUNJRVJSX0lOVEVSTkFMOwogCWlmIChpb2N0bChDREFEZXZbd0RldklEXS51bml4ZGV2LCAKQEAgLTg4Nyw3ICs4ODcsNyBAQAogCQkgICkpIHJldHVybiBNQ0lFUlJfSEFSRFdBUkU7CiAJQ0RBRGV2W3dEZXZJRF0ubW9kZSA9IE1DSV9NT0RFX1NUT1A7CiAJaWYgKGR3RmxhZ3MgJiBNQ0lfTk9USUZZKSB7Ci0gICAgICAgIAlkcHJpbnRmX2NkYXVkaW8oc3RkZGViLAorICAgICAgICAJZHByaW50Zl9pbmZvKGNkYXVkaW8sCiAJCQkiQ0RBVURJT19tY2lSZXN1bWUgLy8gTUNJX05PVElGWV9TVUNDRVNTRlVMICUwOGxYICFcbiIsIAogCQkJbHBQYXJtcy0+ZHdDYWxsYmFjayk7CiAJCW1jaURyaXZlck5vdGlmeSgoSFdORDE2KUxPV09SRChscFBhcm1zLT5kd0NhbGxiYWNrKSwgCkBAIC05MDcsNyArOTA3LDcgQEAKICNpZiBkZWZpbmVkKGxpbnV4KSB8fCBkZWZpbmVkKF9fRnJlZUJTRF9fKQogCURXT1JECWR3UmV0OwogCU1DSV9QTEFZX1BBUk1TIFBsYXlQYXJtczsKLSAgICAJZHByaW50Zl9jZGF1ZGlvKHN0ZGRlYiwiQ0RBVURJT19tY2lTZWVrKCUwNFgsICUwOGxYLCAlcCk7XG4iLCAKKyAgICAJZHByaW50Zl9pbmZvKGNkYXVkaW8sIkNEQVVESU9fbWNpU2VlayglMDRYLCAlMDhsWCwgJXApO1xuIiwgCiAJCXdEZXZJRCwgZHdGbGFncywgbHBQYXJtcyk7CiAJaWYgKGxwUGFybXMgPT0gTlVMTCkgcmV0dXJuIE1DSUVSUl9JTlRFUk5BTDsKIAlpZiAoaW9jdGwoQ0RBRGV2W3dEZXZJRF0udW5peGRldiwKQEAgLTkzNiw3ICs5MzYsNyBAQAogCWlmIChkd1JldCAhPSAwKSByZXR1cm4gZHdSZXQ7CiAJZHdSZXQgPSBDREFVRElPX21jaVN0b3Aod0RldklELCBNQ0lfV0FJVCwgKExQTUNJX0dFTkVSSUNfUEFSTVMpJlBsYXlQYXJtcyk7CiAJaWYgKGR3RmxhZ3MgJiBNQ0lfTk9USUZZKSB7Ci0gICAgICAgIAlkcHJpbnRmX2NkYXVkaW8oc3RkZGViLAorICAgICAgICAJZHByaW50Zl9pbmZvKGNkYXVkaW8sCiAJCQkiQ0RBVURJT19tY2lTZWVrIC8vIE1DSV9OT1RJRllfU1VDQ0VTU0ZVTCAlMDhsWCAhXG4iLCAKIAkJCWxwUGFybXMtPmR3Q2FsbGJhY2spOwogCQltY2lEcml2ZXJOb3RpZnkoKEhXTkQxNilMT1dPUkQobHBQYXJtcy0+ZHdDYWxsYmFjayksIApAQCAtOTU1LDcgKzk1NSw3IEBACiBzdGF0aWMgRFdPUkQgQ0RBVURJT19tY2lTZXQoVUlOVDE2IHdEZXZJRCwgRFdPUkQgZHdGbGFncywgTFBNQ0lfU0VUX1BBUk1TIGxwUGFybXMpCiB7CiAjaWYgZGVmaW5lZChsaW51eCkgfHwgZGVmaW5lZChfX0ZyZWVCU0RfXykKLSAgICAJZHByaW50Zl9jZGF1ZGlvKHN0ZGRlYiwiQ0RBVURJT19tY2lTZXQoJTA0WCwgJTA4bFgsICVwKTtcbiIsIAorICAgIAlkcHJpbnRmX2luZm8oY2RhdWRpbywiQ0RBVURJT19tY2lTZXQoJTA0WCwgJTA4bFgsICVwKTtcbiIsIAogCQl3RGV2SUQsIGR3RmxhZ3MsIGxwUGFybXMpOwogCWlmIChscFBhcm1zID09IE5VTEwpIHJldHVybiBNQ0lFUlJfSU5URVJOQUw7CiAvKgpAQCAtOTY1LDIzICs5NjUsMjMgQEAKIAlpZiAoZHdGbGFncyAmIE1DSV9TRVRfVElNRV9GT1JNQVQpIHsKIAkJc3dpdGNoIChscFBhcm1zLT5kd1RpbWVGb3JtYXQpIHsKIAkJCWNhc2UgTUNJX0ZPUk1BVF9NSUxMSVNFQ09ORFM6Ci0gICAgICAgICAgICAgICAgCQlkcHJpbnRmX2NkYXVkaW8oc3RkZGViLAorICAgICAgICAgICAgICAgIAkJZHByaW50Zl9pbmZvKGNkYXVkaW8sCiAJCQkJIkNEQVVESU9fbWNpU2V0IC8vIE1DSV9GT1JNQVRfTUlMTElTRUNPTkRTICFcbiIpOwogCQkJCWJyZWFrOwogCQkJY2FzZSBNQ0lfRk9STUFUX01TRjoKLSAgICAgICAgICAgICAgICAJCWRwcmludGZfY2RhdWRpbyhzdGRkZWIsIkNEQVVESU9fbWNpU2V0IC8vIE1DSV9GT1JNQVRfTVNGICFcbiIpOworICAgICAgICAgICAgICAgIAkJZHByaW50Zl9pbmZvKGNkYXVkaW8sIkNEQVVESU9fbWNpU2V0IC8vIE1DSV9GT1JNQVRfTVNGICFcbiIpOwogCQkJCWJyZWFrOwogCQkJY2FzZSBNQ0lfRk9STUFUX1RNU0Y6Ci0gICAgICAgICAgICAgICAgCQlkcHJpbnRmX2NkYXVkaW8oc3RkZGViLCJDREFVRElPX21jaVNldCAvLyBNQ0lfRk9STUFUX1RNU0YgIVxuIik7CisgICAgICAgICAgICAgICAgCQlkcHJpbnRmX2luZm8oY2RhdWRpbywiQ0RBVURJT19tY2lTZXQgLy8gTUNJX0ZPUk1BVF9UTVNGICFcbiIpOwogCQkJCWJyZWFrOwogCQkJZGVmYXVsdDoKLSAgICAgICAgICAgICAgICAJCWRwcmludGZfY2RhdWRpbyhzdGRkZWIsIkNEQVVESU9fbWNpU2V0IC8vIGJhZCB0aW1lIGZvcm1hdCAhXG4iKTsKKyAgICAgICAgICAgICAgICAJCWRwcmludGZfd2FybihjZGF1ZGlvLCAiQ0RBVURJT19tY2lTZXQgLy8gYmFkIHRpbWUgZm9ybWF0ICFcbiIpOwogCQkJCXJldHVybiBNQ0lFUlJfQkFEX1RJTUVfRk9STUFUOwogCQkJfQogCQlDREFEZXZbd0RldklEXS5kd1RpbWVGb3JtYXQgPSBscFBhcm1zLT5kd1RpbWVGb3JtYXQ7CiAJCX0KIAlpZiAoZHdGbGFncyAmIE1DSV9TRVRfRE9PUl9PUEVOKSB7Ci0gICAgICAgIAlkcHJpbnRmX2NkYXVkaW8oc3RkZGViLAorICAgICAgICAJZHByaW50Zl9pbmZvKGNkYXVkaW8sCiAJCQkiQ0RBVURJT19tY2lTZXQgLy8gTUNJX1NFVF9ET09SX09QRU4gIVxuIik7CiAjaWZkZWYgX19GcmVlQlNEX18KIAkJaWYgKGlvY3RsKENEQURldlt3RGV2SURdLnVuaXhkZXYsIENESU9DQUxMT1cpKSByZXR1cm4gTUNJRVJSX0hBUkRXQVJFOwpAQCAtOTkzLDcgKzk5Myw3IEBACiAJCUNEQURldlt3RGV2SURdLm5UcmFja3MgPSAwOwogCQl9CiAJaWYgKGR3RmxhZ3MgJiBNQ0lfU0VUX0RPT1JfQ0xPU0VEKSB7Ci0gICAgICAgIAlkcHJpbnRmX2NkYXVkaW8oc3RkZGViLAorICAgICAgICAJZHByaW50Zl9pbmZvKGNkYXVkaW8sCiAJCQkiQ0RBVURJT19tY2lTZXQgLy8gTUNJX1NFVF9ET09SX0NMT1NFRCAhXG4iKTsKICNpZmRlZiBfX0ZyZWVCU0RfXwogICAgICAgICAgICAgICAgIGlmIChpb2N0bChDREFEZXZbd0RldklEXS51bml4ZGV2LCBDRElPQ0FMTE9XKSkgcmV0dXJuIE1DSUVSUl9IQVJEV0FSRTsKQEAgLTEwMDksNyArMTAwOSw3IEBACiAJaWYgKGR3RmxhZ3MgJiBNQ0lfU0VUX09OKSByZXR1cm4gTUNJRVJSX1VOU1VQUE9SVEVEX0ZVTkNUSU9OOwogCWlmIChkd0ZsYWdzICYgTUNJX1NFVF9PRkYpIHJldHVybiBNQ0lFUlJfVU5TVVBQT1JURURfRlVOQ1RJT047CiAJaWYgKGR3RmxhZ3MgJiBNQ0lfTk9USUZZKSB7Ci0gICAgICAgIAlkcHJpbnRmX2NkYXVkaW8oc3RkZGViLAorICAgICAgICAJZHByaW50Zl9pbmZvKGNkYXVkaW8sCiAJCQkiQ0RBVURJT19tY2lTZXQgLy8gTUNJX05PVElGWV9TVUNDRVNTRlVMICUwOGxYICFcbiIsIAogCQkJbHBQYXJtcy0+ZHdDYWxsYmFjayk7CiAJCW1jaURyaXZlck5vdGlmeSgoSFdORDE2KUxPV09SRChscFBhcm1zLT5kd0NhbGxiYWNrKSwgCkBAIC0xMDg0LDcgKzEwODQsNyBAQAogCQkJcmV0dXJuIENEQVVESU9fbWNpU2Vlayhkd0RldklELCBkd1BhcmFtMSwgCiAJCQkJKExQTUNJX1NFRUtfUEFSTVMpUFRSX1NFR19UT19MSU4oZHdQYXJhbTIpKTsKIAkJY2FzZSBNQ0lfU0VUX0RPT1JfT1BFTjoKLSAgICAgICAgICAgIAkJZHByaW50Zl9jZGF1ZGlvKHN0ZGRlYiwKKyAgICAgICAgICAgIAkJZHByaW50Zl9pbmZvKGNkYXVkaW8sCiAJCQkJIkNEQVVESU9fRHJpdmVyUHJvYyAvLyBNQ0lfU0VUX0RPT1JfT1BFTiAhXG4iKTsKICNpZmRlZiBfX0ZyZWVCU0RfXwogCQkJaWYgKGlvY3RsKENEQURldltkd0RldklEXS51bml4ZGV2LCBDRElPQ0FMTE9XKSkgcmV0dXJuIE1DSUVSUl9IQVJEV0FSRTsKQEAgLTEwOTYsNyArMTA5Niw3IEBACiAJCQlDREFEZXZbZHdEZXZJRF0ublRyYWNrcyA9IDA7CiAJCQlyZXR1cm4gMDsKIAkJY2FzZSBNQ0lfU0VUX0RPT1JfQ0xPU0VEOgotICAgICAgICAgICAgCQlkcHJpbnRmX2NkYXVkaW8oc3RkZGViLCJDREFVRElPX0RyaXZlclByb2MgLy8gTUNJX1NFVF9ET09SX0NMT1NFRCAhXG4iKTsKKyAgICAgICAgICAgIAkJZHByaW50Zl9pbmZvKGNkYXVkaW8sIkNEQVVESU9fRHJpdmVyUHJvYyAvLyBNQ0lfU0VUX0RPT1JfQ0xPU0VEICFcbiIpOwogI2lmZGVmIF9fRnJlZUJTRF9fCiAJCQlpZiAoaW9jdGwoQ0RBRGV2W2R3RGV2SURdLnVuaXhkZXYsIENESU9DQUxMT1cpKSByZXR1cm4gTUNJRVJSX0hBUkRXQVJFOwogCQkJaWYgKGlvY3RsKENEQURldltkd0RldklEXS51bml4ZGV2LCBDRElPQ0NMT1NFKSkgcmV0dXJuIE1DSUVSUl9IQVJEV0FSRTsKZGlmZiAtLWdpdCBhL211bHRpbWVkaWEvbWNpc3RyaW5nLmMgYi9tdWx0aW1lZGlhL21jaXN0cmluZy5jCmluZGV4IDg4Y2Y2MGEuLmJkZDI4ODcgMTAwNjQ0Ci0tLSBhL211bHRpbWVkaWEvbWNpc3RyaW5nLmMKKysrIGIvbXVsdGltZWRpYS9tY2lzdHJpbmcuYwpAQCAtMjQsNyArMjQsNiBAQAogI2luY2x1ZGUgImRyaXZlci5oIgogI2luY2x1ZGUgIm1tc3lzdGVtLmgiCiAjaW5jbHVkZSAiY2FsbGJhY2suaCIKLSNpbmNsdWRlICJzdGRkZWJ1Zy5oIgogI2luY2x1ZGUgImRlYnVnLmgiCiAjaW5jbHVkZSAieG1hbGxvYy5oIgogCkBAIC02NiwxMCArNjUsMTAgQEAKICAqIGZvciB1c2UgaW4gbWNpU2VuZFN0cmluZygpCiAgKi8KICNkZWZpbmUgX01DSV9TVFIocykgZG8ge1wKLQlkcHJpbnRmX21jaShzdGRkZWIsIi0+cmV0dXJucyBcIiVzXCIiLHMpO1wKKwlkcHJpbnRmX2luZm8obWNpLCItPnJldHVybnMgXCIlc1wiIixzKTtcCiAJaWYgKGxwc3RyUmV0dXJuU3RyaW5nKSB7XAogCSAgICBsc3RyY3B5bjMyQShscHN0clJldHVyblN0cmluZyxzLHVSZXR1cm5MZW5ndGgpO1wKLQkgICAgZHByaW50Zl9tY2koc3RkZGViLCItLT5cIiVzXCJcbiIsbHBzdHJSZXR1cm5TdHJpbmcpO1wKKwkgICAgZHByaW50Zl9pbmZvKG1jaSwiLS0+XCIlc1wiXG4iLGxwc3RyUmV0dXJuU3RyaW5nKTtcCiAJfVwKIH0gd2hpbGUoMCkKIApAQCAtODksNyArODgsNyBAQAogCQlyZXM9QU5JTV9Ecml2ZXJQcm9jKEdldERydih3RGV2SUQpLT5tb2RwLndEZXZpY2VJRCwwLGNtZCxkd0ZsYWdzLChEV09SRCkocGFyYW1zKSk7XAogCQlicmVhaztcCiAJY2FzZSBNQ0lfREVWVFlQRV9ESUdJVEFMX1ZJREVPOlwKLQkJZHByaW50Zl9tY2koc3RkZGViLCJfTUNJX0NBTExfRFJJVkVSIC8vTm8gRElHSVRBTF9WSURFTyB5ZXQgIVxuIik7XAorCQlkcHJpbnRmX2ZpeG1lKG1jaSwiX01DSV9DQUxMX0RSSVZFUiAvL05vIERJR0lUQUxfVklERU8geWV0ICFcbiIpO1wKIAkJcmVzPU1DSUVSUl9ERVZJQ0VfTk9UX0lOU1RBTExFRDtcCiAJCWJyZWFrO1wKIAlkZWZhdWx0OlwKQEAgLTMzNiw3ICszMzUsNyBAQAogCXdoaWxlKEdldERydih3RGV2SUQpLT5tb2RwLndUeXBlKSB7CiAJCXdEZXZJRCA9IE1NU1lTVEVNX05leHREZXZJRCh3RGV2SUQpOwogCQlpZiAoIU1NU1lTVEVNX0RldklEVmFsaWQod0RldklEKSkgewotCQkJZHByaW50Zl9tY2koc3RkZGViLCBfX0ZJTEVfXyI6TUNJU1RSX09wZW46TUFYTUNJRFJJVkVSUyByZWFjaGVkICgleCkgIVxuIiwgd0RldklEKTsKKwkJCWRwcmludGZfaW5mbyhtY2ksIF9fRklMRV9fIjpNQ0lTVFJfT3BlbjpNQVhNQ0lEUklWRVJTIHJlYWNoZWQgKCV4KSAhXG4iLCB3RGV2SUQpOwogCQkJU0VHUFRSX0ZSRUUoUFRSX1NFR19UT19MSU4ocFUtPm9wZW5QYXJhbXMubHBzdHJFbGVtZW50TmFtZSkpOwogCQkJU0VHUFRSX0ZSRUUocFUpOwogCQkJcmV0dXJuIE1DSUVSUl9JTlRFUk5BTDsKQEAgLTIxMTMsNyArMjExMiw3IEBACiAJRFdPUkQJZHdGbGFnczsKIAlpbnQJcmVzPTAsaSxucm9ma2V5d29yZHM7CiAKLQlkcHJpbnRmX21jaShzdGRkZWIsIm1jaVNlbmRTdHJpbmcoJyVzJywgJXAsICVkLCAlWClcbiIsIGxwc3RyQ29tbWFuZCwgCisJZHByaW50Zl9pbmZvKG1jaSwibWNpU2VuZFN0cmluZygnJXMnLCAlcCwgJWQsICVYKVxuIiwgbHBzdHJDb21tYW5kLCAKIAkJbHBzdHJSZXR1cm5TdHJpbmcsIHVSZXR1cm5MZW5ndGgsIGh3bmRDYWxsYmFjawogCSk7CiAJLyogZm9ybWF0IGlzIDxjb21tYW5kPiA8ZGV2aWNlPiA8b3B0YXJncz4gKi8KQEAgLTIxODMsNyArMjE4Miw3IEBACiAJCQkJYnJlYWs7CiAJCQl3RGV2SUQgPSBNTVNZU1RFTV9OZXh0RGV2SUQod0RldklEKTsKIAkJCWlmICghTU1TWVNURU1fRGV2SURWYWxpZCh3RGV2SUQpKSB7Ci0JCQkJZHByaW50Zl9tY2koc3RkZGViLCBfX0ZJTEVfXyI6bWNpU2VuZFN0cmluZzpNQVhNQ0lEUklWRVJTIHJlYWNoZWQhXG4iKTsKKwkJCQlkcHJpbnRmX2luZm8obWNpLCBfX0ZJTEVfXyI6bWNpU2VuZFN0cmluZzpNQVhNQ0lEUklWRVJTIHJlYWNoZWQhXG4iKTsKIAkJCQlmcmVlKGtleXdvcmRzKTtmcmVlKGNtZCk7CiAJCQkJcmV0dXJuIE1DSUVSUl9JTlZBTElEX0RFVklDRV9OQU1FOwogCQkJfQpkaWZmIC0tZ2l0IGEvbXVsdGltZWRpYS9taWRpLmMgYi9tdWx0aW1lZGlhL21pZGkuYwppbmRleCBmMzhkNWRkLi42YTViOTRhIDEwMDY0NAotLS0gYS9tdWx0aW1lZGlhL21pZGkuYworKysgYi9tdWx0aW1lZGlhL21pZGkuYwpAQCAtMTgsOCArMTgsNiBAQAogI2luY2x1ZGUgImRyaXZlci5oIgogI2luY2x1ZGUgIm1tc3lzdGVtLmgiCiAjaW5jbHVkZSAieG1hbGxvYy5oIgotCi0jaW5jbHVkZSAic3RkZGVidWcuaCIKICNpbmNsdWRlICJkZWJ1Zy5oIgogCiAjaWZkZWYgbGludXgKQEAgLTkxLDcgKzg5LDcgQEAKIHN0YXRpYyBEV09SRCBNSURJX05vdGlmeUNsaWVudChVSU5UMTYgd0RldklELCBXT1JEIHdNc2csIAogCQkJCURXT1JEIGR3UGFyYW0xLCBEV09SRCBkd1BhcmFtMikKIHsKLQlkcHJpbnRmX21pZGkoc3RkZGViLCJNSURJX05vdGlmeUNsaWVudCAvLyB3RGV2SUQgPSAlMDRYIHdNc2cgPSAlZCBkd1Bhcm0xID0gJTA0bFggZHdQYXJhbTIgPSAlMDRsWFxuIix3RGV2SUQsIHdNc2csIGR3UGFyYW0xLCBkd1BhcmFtMik7CisJZHByaW50Zl9pbmZvKG1pZGksIk1JRElfTm90aWZ5Q2xpZW50IC8vIHdEZXZJRCA9ICUwNFggd01zZyA9ICVkIGR3UGFybTEgPSAlMDRsWCBkd1BhcmFtMiA9ICUwNGxYXG4iLHdEZXZJRCwgd01zZywgZHdQYXJhbTEsIGR3UGFyYW0yKTsKIAogI2lmIGRlZmluZWQobGludXgpIHx8IGRlZmluZWQoX19GcmVlQlNEX18pCiAKQEAgLTEwOSw3ICsxMDcsNyBAQAogCQlNaWRpT3V0RGV2W3dEZXZJRF0ubWlkaURlc2MuZHdJbnN0YW5jZSwgCiAgICAgICAgICAgICAgICAgZHdQYXJhbTEsIAogICAgICAgICAgICAgICAgIGR3UGFyYW0yKSkgewotCSAgICBkcHJpbnRmX21pZGkoc3RkZGViLCJNSURJX05vdGlmeUNsaWVudCAvLyBjYW4ndCBub3RpZnkgY2xpZW50ICFcbiIpOworCSAgICBkcHJpbnRmX3dhcm4obWlkaSwiTUlESV9Ob3RpZnlDbGllbnQgLy8gY2FuJ3Qgbm90aWZ5IGNsaWVudCAhXG4iKTsKIAkgICAgcmV0dXJuIE1NU1lTRVJSX05PRVJST1I7CiAJICB9CiAJICBicmVhazsKQEAgLTEyMiw3ICsxMjAsNyBAQAogCQlNaWRpSW5EZXZbd0RldklEXS5taWRpRGVzYy5kd0NhbGxiYWNrLCBNaWRpSW5EZXZbd0RldklEXS53RmxhZ3MsIAogCQlNaWRpSW5EZXZbd0RldklEXS5taWRpRGVzYy5oTWlkaSwgd01zZywgCiAJCU1pZGlJbkRldlt3RGV2SURdLm1pZGlEZXNjLmR3SW5zdGFuY2UsIGR3UGFyYW0xLCBkd1BhcmFtMikpIHsKLQkgICAgZHByaW50Zl9tY2l3YXZlKHN0ZGRlYiwiTUlESV9Ob3RpZnlDbGllbnQgLy8gY2FuJ3Qgbm90aWZ5IGNsaWVudCAhXG4iKTsKKwkgICAgZHByaW50Zl93YXJuKG1jaXdhdmUsIk1JRElfTm90aWZ5Q2xpZW50IC8vIGNhbid0IG5vdGlmeSBjbGllbnQgIVxuIik7CiAJCXJldHVybiBNTVNZU0VSUl9OT0VSUk9SOwogCQl9CiAJICBicmVhazsKQEAgLTE0Niw3ICsxNDQsNyBAQAogCQkJcmV0dXJuIDA7CiAJCX0KIAl9Ci0JZHByaW50Zl9taWRpKHN0ZGRlYiwgIk1JRElfUmVhZEJ5dGUgLy8gZXJyb3IgcmVhZGluZyB3RGV2SUQ9JTA0WFxuIiwgd0RldklEKTsKKwlkcHJpbnRmX3dhcm4obWlkaSwgIk1JRElfUmVhZEJ5dGUgLy8gZXJyb3IgcmVhZGluZyB3RGV2SUQ9JTA0WFxuIiwgd0RldklEKTsKIAlyZXR1cm4gTUNJRVJSX0lOVEVSTkFMOwogCiAjZWxzZQpAQCAtMTY5LDcgKzE2Nyw3IEBACiAJCQl9CiAJCX0KIAl9Ci0JZHByaW50Zl9taWRpKHN0ZGRlYiwgIk1JRElfUmVhZFdvcmQgLy8gZXJyb3IgcmVhZGluZyB3RGV2SUQ9JTA0WFxuIiwgd0RldklEKTsKKwlkcHJpbnRmX3dhcm4obWlkaSwgIk1JRElfUmVhZFdvcmQgLy8gZXJyb3IgcmVhZGluZyB3RGV2SUQ9JTA0WFxuIiwgd0RldklEKTsKIAlyZXR1cm4gTUNJRVJSX0lOVEVSTkFMOwogfQogCkBAIC0xODgsNyArMTg2LDcgQEAKIAkJCX0KIAkJfQogCX0KLQlkcHJpbnRmX21pZGkoc3RkZGViLCAiTUlESV9SZWFkTG9uZyAvLyBlcnJvciByZWFkaW5nIHdEZXZJRD0lMDRYXG4iLCB3RGV2SUQpOworCWRwcmludGZfd2FybihtaWRpLCAiTUlESV9SZWFkTG9uZyAvLyBlcnJvciByZWFkaW5nIHdEZXZJRD0lMDRYXG4iLCB3RGV2SUQpOwogCXJldHVybiBNQ0lFUlJfSU5URVJOQUw7CiB9CiAKQEAgLTIwMiwyMCArMjAwLDIwIEBACiAJRFdPUkQJdmFsdWU7CiAJaWYgKGxwZHcgPT0gTlVMTCkgcmV0dXJuIE1DSUVSUl9JTlRFUk5BTDsKIAlpZiAoTUlESV9SZWFkQnl0ZSh3RGV2SUQsICZieXRlKSAhPSAwKSB7Ci0JCWRwcmludGZfbWlkaShzdGRkZWIsICJNSURJX1JlYWRWYXJ5TGVuIC8vIGVycm9yIHJlYWRpbmcgd0RldklEPSUwNFhcbiIsIHdEZXZJRCk7CisJCWRwcmludGZfd2FybihtaWRpLCAiTUlESV9SZWFkVmFyeUxlbiAvLyBlcnJvciByZWFkaW5nIHdEZXZJRD0lMDRYXG4iLCB3RGV2SUQpOwogCQlyZXR1cm4gTUNJRVJSX0lOVEVSTkFMOwogCX0KIAl2YWx1ZSA9IChEV09SRCkoYnl0ZSAmIDB4N0YpOwogCXdoaWxlIChieXRlICYgMHg4MCkgewogCQlpZiAoTUlESV9SZWFkQnl0ZSh3RGV2SUQsICZieXRlKSAhPSAwKSB7Ci0JCQlkcHJpbnRmX21pZGkoc3RkZGViLCAiTUlESV9SZWFkVmFyeUxlbiAvLyBlcnJvciByZWFkaW5nIHdEZXZJRD0lMDRYXG4iLCB3RGV2SUQpOworCQkJZHByaW50Zl93YXJuKG1pZGksICJNSURJX1JlYWRWYXJ5TGVuIC8vIGVycm9yIHJlYWRpbmcgd0RldklEPSUwNFhcbiIsIHdEZXZJRCk7CiAJCQlyZXR1cm4gTUNJRVJSX0lOVEVSTkFMOwogCQl9CiAJCXZhbHVlID0gKHZhbHVlIDw8IDcpICsgKGJ5dGUgJiAweDdGKTsKIAl9CiAJKmxwZHcgPSB2YWx1ZTsKIC8qCi0JZHByaW50Zl9taWRpKHN0ZGRlYiwgIk1JRElfUmVhZFZhcnlMZW4gLy8gdmFsPSUwOGxYIFxuIiwgdmFsdWUpOworCWRwcmludGZfaW5mbyhtaWRpLCAiTUlESV9SZWFkVmFyeUxlbiAvLyB2YWw9JTA4bFggXG4iLCB2YWx1ZSk7CiAqLwogCXJldHVybiAwOwogfQpAQCAtMjI5LDkgKzIyNyw5IEBACiAjaWYgZGVmaW5lZChsaW51eCkgfHwgZGVmaW5lZChfX0ZyZWVCU0RfXykKIAlEV09SRAl0b2JlcmVhZDsKIAlGT1VSQ0MJZm91cmNjOwotCWRwcmludGZfbWlkaShzdGRkZWIsICJNSURJX1JlYWRNVGhkKCUwNFgsICUwOGxYKTtcbiIsIHdEZXZJRCwgZHdPZmZzZXQpOworCWRwcmludGZfaW5mbyhtaWRpLCAiTUlESV9SZWFkTVRoZCglMDRYLCAlMDhsWCk7XG4iLCB3RGV2SUQsIGR3T2Zmc2V0KTsKIAlpZiAobW1pb1NlZWsoTUNJTWlkaURldlt3RGV2SURdLmhGaWxlLCBkd09mZnNldCwgU0VFS19TRVQpICE9IGR3T2Zmc2V0KSB7Ci0JCWRwcmludGZfbWlkaShzdGRkZWIsICJNSURJX1JlYWRNVGhkIC8vIGNhbid0IHNlZWsgYXQgJTA4bFggYmVnaW4gb2YgJ01UaGQnIFxuIiwgZHdPZmZzZXQpOworCQlkcHJpbnRmX3dhcm4obWlkaSwgIk1JRElfUmVhZE1UaGQgLy8gY2FuJ3Qgc2VlayBhdCAlMDhsWCBiZWdpbiBvZiAnTVRoZCcgXG4iLCBkd09mZnNldCk7CiAJCXJldHVybiBNQ0lFUlJfSU5URVJOQUw7CiAJfQogCWlmIChtbWlvUmVhZChNQ0lNaWRpRGV2W3dEZXZJRF0uaEZpbGUsIChIUFNUUikmZm91cmNjLApAQCAtMjQ1LDcgKzI0Myw3IEBACiAJCXJldHVybiBNQ0lFUlJfSU5URVJOQUw7CiAJaWYgKE1JRElfUmVhZFdvcmQod0RldklELCAmTUNJTWlkaURldlt3RGV2SURdLm5UZW1wbykgIT0gMCkKIAkJcmV0dXJuIE1DSUVSUl9JTlRFUk5BTDsKLQlkcHJpbnRmX21pZGkoc3RkZGViLCAiTUlESV9SZWFkTVRoZCAvLyB0b2JlcmVhZD0lMDhsWCwgd0Zvcm1hdD0lMDRYIG5UcmFja3M9JTA0WCBuVGVtcG89JTA0WFxuIiwKKwlkcHJpbnRmX2luZm8obWlkaSwgIk1JRElfUmVhZE1UaGQgLy8gdG9iZXJlYWQ9JTA4bFgsIHdGb3JtYXQ9JTA0WCBuVHJhY2tzPSUwNFggblRlbXBvPSUwNFhcbiIsCiAJCXRvYmVyZWFkLCBNQ0lNaWRpRGV2W3dEZXZJRF0ud0Zvcm1hdCwKIAkJTUNJTWlkaURldlt3RGV2SURdLm5UcmFja3MsCiAJCU1DSU1pZGlEZXZbd0RldklEXS5uVGVtcG8pOwpAQCAtMjY3LDcgKzI2NSw3IEBACiAJRFdPUkQJdG9iZXJlYWQ7CiAJRk9VUkNDCWZvdXJjYzsKIAlpZiAobW1pb1NlZWsoTUNJTWlkaURldlt3RGV2SURdLmhGaWxlLCBkd09mZnNldCwgU0VFS19TRVQpICE9IGR3T2Zmc2V0KSB7Ci0JCWRwcmludGZfbWlkaShzdGRkZWIsICJNSURJX1JlYWRNVHJrIC8vIGNhbid0IHNlZWsgYXQgJTA4bFggYmVnaW4gb2YgJ01UaGQnIFxuIiwgZHdPZmZzZXQpOworCQlkcHJpbnRmX3dhcm4obWlkaSwgIk1JRElfUmVhZE1UcmsgLy8gY2FuJ3Qgc2VlayBhdCAlMDhsWCBiZWdpbiBvZiAnTVRoZCcgXG4iLCBkd09mZnNldCk7CiAJCX0KIAlpZiAobW1pb1JlYWQoTUNJTWlkaURldlt3RGV2SURdLmhGaWxlLCAoSFBTVFIpJmZvdXJjYywKIAkJKGxvbmcpIHNpemVvZihGT1VSQ0MpKSAhPSAobG9uZykgc2l6ZW9mKEZPVVJDQykpIHsKQEAgLTI3Niw3ICsyNzQsNyBAQAogCWlmIChNSURJX1JlYWRMb25nKHdEZXZJRCwgJnRvYmVyZWFkKSAhPSAwKSB7CiAJCXJldHVybiBNQ0lFUlJfSU5URVJOQUw7CiAJCX0KLQlkcHJpbnRmX21pZGkoc3RkZGViLCAiTUlESV9SZWFkTVRyayAvLyB0b2JlcmVhZD0lMDhsWFxuIiwgdG9iZXJlYWQpOworCWRwcmludGZfaW5mbyhtaWRpLCAiTUlESV9SZWFkTVRyayAvLyB0b2JlcmVhZD0lMDhsWFxuIiwgdG9iZXJlYWQpOwogCXRvYmVyZWFkIC09IDMgKiBzaXplb2YoV09SRCk7CiAJTUNJTWlkaURldlt3RGV2SURdLmR3VG90YWxMZW4gPSB0b2JlcmVhZDsKIAlyZXR1cm4gMDsKQEAgLTI5OCw3ICsyOTYsNyBAQAogCUxQU1RSCQlscHN0ckVsZW1lbnROYW1lOwogCWNoYXIJCXN0clsxMjhdOwogCi0JZHByaW50Zl9taWRpKHN0ZGRlYiwgIk1JRElfbWNpT3BlbiglMDhsWCwgJXApXG4iLCBkd0ZsYWdzLCBscFBhcm1zKTsKKwlkcHJpbnRmX2luZm8obWlkaSwgIk1JRElfbWNpT3BlbiglMDhsWCwgJXApXG4iLCBkd0ZsYWdzLCBscFBhcm1zKTsKIAlpZiAobHBQYXJtcyA9PSBOVUxMKSByZXR1cm4gTUNJRVJSX0lOVEVSTkFMOwogCiAJaWYgKE1DSU1pZGlEZXZbd0RldklEXS5uVXNlQ291bnQgPiAwKSB7CkBAIC0zMTUsMjYgKzMxMywyNiBAQAogCQlNQ0lNaWRpRGV2W3dEZXZJRF0uaE1pZGlIZHIgPSBVU0VSX0hFQVBfQUxMT0Moc2l6ZW9mKE1JRElIRFIpKTsKIAl9CiAKLQlkcHJpbnRmX21pZGkoc3RkZGViLCAiTUlESV9tY2lPcGVuIC8vIHdEZXZJRD0lMDRYXG4iLCB3RGV2SUQpOworCWRwcmludGZfaW5mbyhtaWRpLCAiTUlESV9tY2lPcGVuIC8vIHdEZXZJRD0lMDRYXG4iLCB3RGV2SUQpOwogLyoJbHBQYXJtcy0+d0RldmljZUlEID0gd0RldklEOyovCi0JZHByaW50Zl9taWRpKHN0ZGRlYiwgIk1JRElfbWNpT3BlbiAvLyBscFBhcm1zLT53RGV2SUQ9JTA0WFxuIiwgbHBQYXJtcy0+d0RldmljZUlEKTsKLQlkcHJpbnRmX21pZGkoc3RkZGViLCAiTUlESV9tY2lPcGVuIC8vIGJlZm9yZSBPUEVOX0VMRU1FTlRcbiIpOworCWRwcmludGZfaW5mbyhtaWRpLCAiTUlESV9tY2lPcGVuIC8vIGxwUGFybXMtPndEZXZJRD0lMDRYXG4iLCBscFBhcm1zLT53RGV2aWNlSUQpOworCWRwcmludGZfaW5mbyhtaWRpLCAiTUlESV9tY2lPcGVuIC8vIGJlZm9yZSBPUEVOX0VMRU1FTlRcbiIpOwogCWlmIChkd0ZsYWdzICYgTUNJX09QRU5fRUxFTUVOVCkgewogCQlscHN0ckVsZW1lbnROYW1lID0gKExQU1RSKVBUUl9TRUdfVE9fTElOKGxwUGFybXMtPmxwc3RyRWxlbWVudE5hbWUpOwotCQlkcHJpbnRmX21pZGkoc3RkZGViLCAiTUlESV9tY2lPcGVuIC8vIE1DSV9PUEVOX0VMRU1FTlQgJyVzJyAhXG4iLCBscHN0ckVsZW1lbnROYW1lKTsKKwkJZHByaW50Zl9pbmZvKG1pZGksICJNSURJX21jaU9wZW4gLy8gTUNJX09QRU5fRUxFTUVOVCAnJXMnICFcbiIsIGxwc3RyRWxlbWVudE5hbWUpOwogCQlpZiAoc3RybGVuKGxwc3RyRWxlbWVudE5hbWUpID4gMCkgewogCQkJc3RyY3B5KHN0ciwgbHBzdHJFbGVtZW50TmFtZSk7CiAJCQlDaGFyVXBwZXIzMkEoc3RyKTsKIAkJCU1DSU1pZGlEZXZbd0RldklEXS5oRmlsZSA9IG1taW9PcGVuMTYoc3RyLCBOVUxMLCAKIAkJCQlNTUlPX0FMTE9DQlVGIHwgTU1JT19SRUFEV1JJVEUgfCBNTUlPX0VYQ0xVU0lWRSk7CiAJCQlpZiAoTUNJTWlkaURldlt3RGV2SURdLmhGaWxlID09IDApIHsKLQkJCQlkcHJpbnRmX21pZGkoc3RkZGViLCAiTUlESV9tY2lPcGVuIC8vIGNhbid0IGZpbmQgZmlsZT0nJXMnICFcbiIsIHN0cik7CisJCQkJZHByaW50Zl93YXJuKG1pZGksICJNSURJX21jaU9wZW4gLy8gY2FuJ3QgZmluZCBmaWxlPSclcycgIVxuIiwgc3RyKTsKIAkJCQlyZXR1cm4gTUNJRVJSX0ZJTEVfTk9UX0ZPVU5EOwogCQkJfQogCQl9IGVsc2UgCiAJCQlNQ0lNaWRpRGV2W3dEZXZJRF0uaEZpbGUgPSAwOwogCX0KLQlkcHJpbnRmX21pZGkoc3RkZGViLCAiTUlESV9tY2lPcGVuIC8vIGhGaWxlPSV1XG4iLCBNQ0lNaWRpRGV2W3dEZXZJRF0uaEZpbGUpOworCWRwcmludGZfaW5mbyhtaWRpLCAiTUlESV9tY2lPcGVuIC8vIGhGaWxlPSV1XG4iLCBNQ0lNaWRpRGV2W3dEZXZJRF0uaEZpbGUpOwogCW1lbWNweSgmTUNJTWlkaURldlt3RGV2SURdLm9wZW5QYXJtcywgbHBQYXJtcywgc2l6ZW9mKE1DSV9PUEVOX1BBUk1TMTYpKTsKIAlNQ0lNaWRpRGV2W3dEZXZJRF0ud05vdGlmeURldmljZUlEID0gbHBQYXJtcy0+d0RldmljZUlEOwogCU1DSU1pZGlEZXZbd0RldklEXS5kd1N0YXR1cyA9IE1DSV9NT0RFX1NUT1A7CkBAIC0zNDYsMzAgKzM0NCwzMCBAQAogCQlpZiAobW1pb0Rlc2NlbmQoTUNJTWlkaURldlt3RGV2SURdLmhGaWxlLCAmY2tNYWluUklGRiwgTlVMTCwgMCkgIT0gMCkgewogCQkJcmV0dXJuIE1DSUVSUl9JTlRFUk5BTDsKIAkJfQotCQlkcHJpbnRmX21pZGkoc3RkZGViLCJNSURJX21jaU9wZW4gLy8gUGFyZW50Q2h1bmsgY2tpZD0lLjRzIGZjY1R5cGU9JS40cyBja3NpemU9JTA4bFggXG4iLAorCQlkcHJpbnRmX2luZm8obWlkaSwiTUlESV9tY2lPcGVuIC8vIFBhcmVudENodW5rIGNraWQ9JS40cyBmY2NUeXBlPSUuNHMgY2tzaXplPSUwOGxYIFxuIiwKIAkJCQkoTFBTVFIpJmNrTWFpblJJRkYuY2tpZCwgKExQU1RSKSZja01haW5SSUZGLmZjY1R5cGUsCiAJCQkJY2tNYWluUklGRi5ja3NpemUpOwogCQlkd09mZnNldCA9IDA7CiAJCWlmIChja01haW5SSUZGLmNraWQgPT0gbW1pb0ZPVVJDQygnUicsICdNJywgJ0knLCAnRCcpKSB7Ci0JCQlkcHJpbnRmX21pZGkoc3RkZGViLCAiTUlESV9tY2lPcGVuIC8vIGlzIGEgJ1JNSUQnIGZpbGUgXG4iKTsKKwkJCWRwcmludGZfaW5mbyhtaWRpLCAiTUlESV9tY2lPcGVuIC8vIGlzIGEgJ1JNSUQnIGZpbGUgXG4iKTsKIAkJCWR3T2Zmc2V0ID0gY2tNYWluUklGRi5kd0RhdGFPZmZzZXQ7CiAJCX0KIAkJaWYgKGNrTWFpblJJRkYuY2tpZCAhPSBtbWlvRk9VUkNDKCdNJywgJ1QnLCAnaCcsICdkJykpIHsKLQkJCWRwcmludGZfbWlkaShzdGRkZWIsICJNSURJX21jaU9wZW4gLy8gdW5rbm93biBmb3JtYXQgIVxuIik7CisJCQlkcHJpbnRmX3dhcm4obWlkaSwgIk1JRElfbWNpT3BlbiAvLyB1bmtub3duIGZvcm1hdCAhXG4iKTsKIAkJCXJldHVybiBNQ0lFUlJfSU5URVJOQUw7CiAJCX0KIAkJaWYgKE1JRElfUmVhZE1UaGQod0RldklELCBkd09mZnNldCkgIT0gMCkgewotCQkJZHByaW50Zl9taWRpKHN0ZGRlYiwgIk1JRElfbWNpT3BlbiAvLyBjYW4ndCByZWFkICdNVGhkJyBoZWFkZXIgXG4iKTsKKwkJCWRwcmludGZfd2FybihtaWRpLCAiTUlESV9tY2lPcGVuIC8vIGNhbid0IHJlYWQgJ01UaGQnIGhlYWRlciBcbiIpOwogCQkJcmV0dXJuIE1DSUVSUl9JTlRFUk5BTDsKIAkJfQogCQlkd09mZnNldCA9IG1taW9TZWVrKE1DSU1pZGlEZXZbd0RldklEXS5oRmlsZSwgMCwgU0VFS19DVVIpOwogCQlpZiAoTUlESV9SZWFkTVRyayh3RGV2SUQsIGR3T2Zmc2V0KSAhPSAwKSB7Ci0JCQlkcHJpbnRmX21pZGkoc3RkZGViLCAiTUlESV9tY2lPcGVuIC8vIGNhbid0IHJlYWQgJ01UcmsnIGhlYWRlciBcbiIpOworCQkJZHByaW50Zl93YXJuKG1pZGksICJNSURJX21jaU9wZW4gLy8gY2FuJ3QgcmVhZCAnTVRyaycgaGVhZGVyIFxuIik7CiAJCQlyZXR1cm4gTUNJRVJSX0lOVEVSTkFMOwogCQl9CiAJCWR3T2Zmc2V0ID0gbW1pb1NlZWsoTUNJTWlkaURldlt3RGV2SURdLmhGaWxlLCAwLCBTRUVLX0NVUik7CiAJCU1DSU1pZGlEZXZbd0RldklEXS5kd0JlZ2luRGF0YSA9IGR3T2Zmc2V0OwotCQlkcHJpbnRmX21pZGkoc3RkZGViLCAiTUlESV9tY2lPcGVuIC8vIENodW5rIEZvdW5kIGNraWQ9JS40cyBmY2NUeXBlPSUuNHMgY2tzaXplPSUwOGxYIFxuIiwKKwkJZHByaW50Zl9pbmZvKG1pZGksICJNSURJX21jaU9wZW4gLy8gQ2h1bmsgRm91bmQgY2tpZD0lLjRzIGZjY1R5cGU9JS40cyBja3NpemU9JTA4bFggXG4iLAogCQkJCShMUFNUUikmY2tNYWluUklGRi5ja2lkLCAoTFBTVFIpJmNrTWFpblJJRkYuZmNjVHlwZSwKIAkJCQlja01haW5SSUZGLmNrc2l6ZSk7CiAJfQpAQCAtMzg5LDEwICszODcsMTAgQEAKIHN0YXRpYyBEV09SRCBNSURJX21jaVN0b3AoVUlOVDE2IHdEZXZJRCwgRFdPUkQgZHdGbGFncywgTFBNQ0lfR0VORVJJQ19QQVJNUyBscFBhcm1zKQogewogI2lmIGRlZmluZWQobGludXgpIHx8IGRlZmluZWQoX19GcmVlQlNEX18pCi0JZHByaW50Zl9taWRpKHN0ZGRlYiwgIk1JRElfbWNpU3RvcCglMDRYLCAlMDhsWCwgJXApO1xuIiwgd0RldklELCBkd0ZsYWdzLCBscFBhcm1zKTsKKwlkcHJpbnRmX2luZm8obWlkaSwgIk1JRElfbWNpU3RvcCglMDRYLCAlMDhsWCwgJXApO1xuIiwgd0RldklELCBkd0ZsYWdzLCBscFBhcm1zKTsKIAlpZiAobHBQYXJtcyA9PSBOVUxMKSByZXR1cm4gTUNJRVJSX0lOVEVSTkFMOwogCU1DSU1pZGlEZXZbd0RldklEXS5kd1N0YXR1cyA9IE1DSV9NT0RFX1NUT1A7Ci0JZHByaW50Zl9taWRpKHN0ZGRlYiwgIk1JRElfbWNpU3RvcCAvLyBNQ0lNaWRpRGV2W3dEZXZJRF0uZHdTdGF0dXM9JXAgJWRcbiIsCisJZHByaW50Zl9pbmZvKG1pZGksICJNSURJX21jaVN0b3AgLy8gTUNJTWlkaURldlt3RGV2SURdLmR3U3RhdHVzPSVwICVkXG4iLAogCQkJJk1DSU1pZGlEZXZbd0RldklEXS5kd1N0YXR1cywgTUNJTWlkaURldlt3RGV2SURdLmR3U3RhdHVzKTsKIAlyZXR1cm4gMDsKICNlbHNlCkBAIC00MDksNyArNDA3LDcgQEAKICNpZiBkZWZpbmVkKGxpbnV4KSB8fCBkZWZpbmVkKF9fRnJlZUJTRF9fKQogCURXT1JECQlkd1JldDsKIAotCWRwcmludGZfbWlkaShzdGRkZWIsICJNSURJX21jaUNsb3NlKCUwNFgsICUwOGxYLCAlcCk7XG4iLCB3RGV2SUQsIGR3UGFyYW0sIGxwUGFybXMpOworCWRwcmludGZfaW5mbyhtaWRpLCAiTUlESV9tY2lDbG9zZSglMDRYLCAlMDhsWCwgJXApO1xuIiwgd0RldklELCBkd1BhcmFtLCBscFBhcm1zKTsKIAlpZiAoTUNJTWlkaURldlt3RGV2SURdLmR3U3RhdHVzICE9IE1DSV9NT0RFX1NUT1ApIHsKIAkJTUlESV9tY2lTdG9wKHdEZXZJRCwgTUNJX1dBSVQsIGxwUGFybXMpOwogCQl9CkBAIC00MTksNyArNDE3LDcgQEAKIAkJaWYgKE1DSU1pZGlEZXZbd0RldklEXS5oRmlsZSAhPSAwKSB7CiAJCQltbWlvQ2xvc2UoTUNJTWlkaURldlt3RGV2SURdLmhGaWxlLCAwKTsKIAkJCU1DSU1pZGlEZXZbd0RldklEXS5oRmlsZSA9IDA7Ci0JCQlkcHJpbnRmX21pZGkoc3RkZGViLCAiTUlESV9tY2lDbG9zZSAvLyBoRmlsZSBjbG9zZWQgIVxuIik7CisJCQlkcHJpbnRmX2luZm8obWlkaSwgIk1JRElfbWNpQ2xvc2UgLy8gaEZpbGUgY2xvc2VkICFcbiIpOwogCQkJfQogCQlVU0VSX0hFQVBfRlJFRShNQ0lNaWRpRGV2W3dEZXZJRF0uaE1pZGlIZHIpOwogCQlkd1JldCA9IG1vZE1lc3NhZ2Uod0RldklELCBNT0RNX0NMT1NFLCAwLCAwTCwgMEwpOwpAQCAtNDQ3LDMzICs0NDUsMzMgQEAKIAlEV09SRAkJZHdEYXRhLGR3UmV0OwogCUxQV09SRAkJcHRyOwogCi0JZHByaW50Zl9taWRpKHN0ZGRlYiwgIk1JRElfbWNpUGxheSglMDRYLCAlMDhsWCwgJXApO1xuIiwgd0RldklELCBkd0ZsYWdzLCBscFBhcm1zKTsKKwlkcHJpbnRmX2luZm8obWlkaSwgIk1JRElfbWNpUGxheSglMDRYLCAlMDhsWCwgJXApO1xuIiwgd0RldklELCBkd0ZsYWdzLCBscFBhcm1zKTsKIAlpZiAoTUNJTWlkaURldlt3RGV2SURdLmhGaWxlID09IDApIHsKLQkJZHByaW50Zl9taWRpKHN0ZGRlYiwgIk1JRElfbWNpUGxheSAvLyBjYW4ndCBmaW5kIGZpbGU9JyUwOGx4JyAhXG4iLCAKKwkJZHByaW50Zl93YXJuKG1pZGksICJNSURJX21jaVBsYXkgLy8gY2FuJ3QgZmluZCBmaWxlPSclMDhseCcgIVxuIiwgCiAJCQkJKERXT1JEKU1DSU1pZGlEZXZbd0RldklEXS5vcGVuUGFybXMubHBzdHJFbGVtZW50TmFtZSk7CiAJCXJldHVybiBNQ0lFUlJfRklMRV9OT1RfRk9VTkQ7CiAJfQogCXN0YXJ0ID0gMTsgCQllbmQgPSA5OTk5OTsKIAlpZiAoZHdGbGFncyAmIE1DSV9GUk9NKSB7CiAJCXN0YXJ0ID0gbHBQYXJtcy0+ZHdGcm9tOyAKLQkJZHByaW50Zl9taWRpKHN0ZGRlYiwgIk1JRElfbWNpUGxheSAvLyBNQ0lfRlJPTT0lZCBcbiIsIHN0YXJ0KTsKKwkJZHByaW50Zl9pbmZvKG1pZGksICJNSURJX21jaVBsYXkgLy8gTUNJX0ZST009JWQgXG4iLCBzdGFydCk7CiAJfQogCWlmIChkd0ZsYWdzICYgTUNJX1RPKSB7CiAJCWVuZCA9IGxwUGFybXMtPmR3VG87Ci0JCWRwcmludGZfbWlkaShzdGRkZWIsICJNSURJX21jaVBsYXkgLy8gTUNJX1RPPSVkIFxuIiwgZW5kKTsKKwkJZHByaW50Zl9pbmZvKG1pZGksICJNSURJX21jaVBsYXkgLy8gTUNJX1RPPSVkIFxuIiwgZW5kKTsKIAl9CiAjaWYgMAogCWlmIChkd0ZsYWdzICYgTUNJX05PVElGWSkgewotCQlkcHJpbnRmX21pZGkoc3RkZGViLCAiTUlESV9tY2lQbGF5IC8vIE1DSV9OT1RJRlkgJTA4bFggIVxuIiwgbHBQYXJtcy0+ZHdDYWxsYmFjayk7CisJCWRwcmludGZfaW5mbyhtaWRpLCAiTUlESV9tY2lQbGF5IC8vIE1DSV9OT1RJRlkgJTA4bFggIVxuIiwgbHBQYXJtcy0+ZHdDYWxsYmFjayk7CiAJCXN3aXRjaChmb3JrKCkpIHsKIAkJY2FzZSAtMToKLQkJCWRwcmludGZfbWlkaShzdGRkZWIsICJNSURJX21jaVBsYXkgLy8gQ2FuJ3QgJ2ZvcmsnIHByb2Nlc3MgIVxuIik7CisJCQlkcHJpbnRmX3dhcm4obWlkaSwgIk1JRElfbWNpUGxheSAvLyBDYW4ndCAnZm9yaycgcHJvY2VzcyAhXG4iKTsKIAkJCWJyZWFrOwogCQljYXNlIDA6Ci0JCQlkcHJpbnRmX21pZGkoc3RkZGViLCAiTUlESV9tY2lQbGF5IC8vIHByb2Nlc3Mgc3RhcnRlZCAhIHBsYXkgaW4gYmFja2dyb3VuZCAuLi5cbiIpOworCQkJZHByaW50Zl9pbmZvKG1pZGksICJNSURJX21jaVBsYXkgLy8gcHJvY2VzcyBzdGFydGVkICEgcGxheSBpbiBiYWNrZ3JvdW5kIC4uLlxuIik7CiAJCQlicmVhazsKIAkJZGVmYXVsdDoKLQkJCWRwcmludGZfbWlkaShzdGRkZWIsICJNSURJX21jaVBsYXkgLy8gcHJvY2VzcyBzdGFydGVkICEgcmV0dXJuIHRvIGNhbGxlci4uLlxuIik7CisJCQlkcHJpbnRmX2luZm8obWlkaSwgIk1JRElfbWNpUGxheSAvLyBwcm9jZXNzIHN0YXJ0ZWQgISByZXR1cm4gdG8gY2FsbGVyLi4uXG4iKTsKIAkJCXJldHVybiAwOwogCQl9CiAJfQpAQCAtNDg4LDExICs0ODYsMTEgQEAKIAlscE1pZGlIZHItPmR3RmxhZ3MgPSAwTDsKIAlkd1JldCA9IG1vZE1lc3NhZ2Uod0RldklELCBNT0RNX1BSRVBBUkUsIDAsIChEV09SRClscE1pZGlIZHIsIHNpemVvZihNSURJSERSKSk7CiAKLS8qCWRwcmludGZfbWlkaShzdGRkZWIsICJNSURJX21jaVBsYXkgLy8gYWZ0ZXIgTU9ETV9QUkVQQVJFIFxuIik7ICovCisvKglkcHJpbnRmX2luZm8obWlkaSwgIk1JRElfbWNpUGxheSAvLyBhZnRlciBNT0RNX1BSRVBBUkUgXG4iKTsgKi8KIAogCU1DSU1pZGlEZXZbd0RldklEXS5kd1N0YXR1cyA9IE1DSV9NT0RFX1BMQVk7CiAJd2hpbGUoTUNJTWlkaURldlt3RGV2SURdLmR3U3RhdHVzICE9IE1DSV9NT0RFX1NUT1ApIHsKLQkJZHByaW50Zl9taWRpKHN0ZGRlYiwgIk1JRElfbWNpUGxheSAvLyBNQ0lNaWRpRGV2W3dEZXZJRF0uZHdTdGF0dXM9JXAgJWRcbiIsCisJCWRwcmludGZfaW5mbyhtaWRpLCAiTUlESV9tY2lQbGF5IC8vIE1DSU1pZGlEZXZbd0RldklEXS5kd1N0YXR1cz0lcCAlZFxuIiwKIAkJCSZNQ0lNaWRpRGV2W3dEZXZJRF0uZHdTdGF0dXMsIE1DSU1pZGlEZXZbd0RldklEXS5kd1N0YXR1cyk7CiAKIAkJcHRyID0gKExQV09SRClscE1pZGlIZHItPmxwRGF0YTsKQEAgLTUwMywxMSArNTAxLDExIEBACiAvKgogCQljb3VudCA9IG1taW9SZWFkKE1DSU1pZGlEZXZbd0RldklEXS5oRmlsZSwgbHBNaWRpSGRyLT5scERhdGEsIGxwTWlkaUhkci0+ZHdCdWZmZXJMZW5ndGgpOwogKi8KLQkJZHByaW50Zl9taWRpKHN0ZGRlYiwgIk1JRElfbWNpUGxheSAvLyBhZnRlciByZWFkIGNvdW50ID0gJWRcbiIsY291bnQpOworCQlkcHJpbnRmX2luZm8obWlkaSwgIk1JRElfbWNpUGxheSAvLyBhZnRlciByZWFkIGNvdW50ID0gJWRcbiIsY291bnQpOwogCiAJCWlmIChjb3VudCA8IDEpIGJyZWFrOwogCQlscE1pZGlIZHItPmR3Qnl0ZXNSZWNvcmRlZCA9IGNvdW50OwotCQlkcHJpbnRmX21pZGkoc3RkZGViLCAiTUlESV9tY2lQbGF5IC8vIGJlZm9yZSBNT0RNX0xPTkdEQVRBIGxwTWlkaUhkcj0lcCBkd0J5dGVzUmVjb3JkZWQ9JWx1XG4iLAorCQlkcHJpbnRmX2luZm8obWlkaSwgIk1JRElfbWNpUGxheSAvLyBiZWZvcmUgTU9ETV9MT05HREFUQSBscE1pZGlIZHI9JXAgZHdCeXRlc1JlY29yZGVkPSVsdVxuIiwKIAkJCQkJbHBNaWRpSGRyLCBscE1pZGlIZHItPmR3Qnl0ZXNSZWNvcmRlZCk7CiAJCWR3UmV0ID0gbW9kTWVzc2FnZSh3RGV2SUQsIE1PRE1fTE9OR0RBVEEsIDAsIChEV09SRClscE1pZGlIZHIsIHNpemVvZihNSURJSERSKSk7CiAJCWlmIChkd1JldCAhPSBNTVNZU0VSUl9OT0VSUk9SKSB7CkBAIC01MzksNyArNTM3LDcgQEAKIAl9CiAJTUNJTWlkaURldlt3RGV2SURdLmR3U3RhdHVzID0gTUNJX01PREVfU1RPUDsKIAlpZiAoZHdGbGFncyAmIE1DSV9OT1RJRlkpIHsKLQkJZHByaW50Zl9taWRpKHN0ZGRlYiwgIk1JRElfbWNpUGxheSAvLyBNQ0lfTk9USUZZX1NVQ0NFU1NGVUwgJTA4bFggIVxuIiwgbHBQYXJtcy0+ZHdDYWxsYmFjayk7CisJCWRwcmludGZfaW5mbyhtaWRpLCAiTUlESV9tY2lQbGF5IC8vIE1DSV9OT1RJRllfU1VDQ0VTU0ZVTCAlMDhsWCAhXG4iLCBscFBhcm1zLT5kd0NhbGxiYWNrKTsKIAkJbWNpRHJpdmVyTm90aWZ5KChIV05EMTYpTE9XT1JEKGxwUGFybXMtPmR3Q2FsbGJhY2spLCAKIAkJCU1DSU1pZGlEZXZbd0RldklEXS53Tm90aWZ5RGV2aWNlSUQsIE1DSV9OT1RJRllfU1VDQ0VTU0ZVTCk7CiAjaWYgMApAQCAtNTYzLDIwICs1NjEsMjAgQEAKIAlMUE1JRElIRFIJbHBNaWRpSGRyOwogCURXT1JECQlkd1JldDsKIAotCWRwcmludGZfbWlkaShzdGRkZWIsICJNSURJX21jaVJlY29yZCglMDRYLCAlMDhsWCwgJXApO1xuIiwgd0RldklELCBkd0ZsYWdzLCBscFBhcm1zKTsKKwlkcHJpbnRmX2luZm8obWlkaSwgIk1JRElfbWNpUmVjb3JkKCUwNFgsICUwOGxYLCAlcCk7XG4iLCB3RGV2SUQsIGR3RmxhZ3MsIGxwUGFybXMpOwogCWlmIChNQ0lNaWRpRGV2W3dEZXZJRF0uaEZpbGUgPT0gMCkgewotCQlkcHJpbnRmX21pZGkoc3RkZGViLCAiTUlESV9tY2lSZWNvcmQgLy8gY2FuJ3QgZmluZCBmaWxlPSclMDhseCcgIVxuIiwgCisJCWRwcmludGZfd2FybihtaWRpLCAiTUlESV9tY2lSZWNvcmQgLy8gY2FuJ3QgZmluZCBmaWxlPSclMDhseCcgIVxuIiwgCiAJCQkoRFdPUkQpTUNJTWlkaURldlt3RGV2SURdLm9wZW5QYXJtcy5scHN0ckVsZW1lbnROYW1lKTsKIAkJcmV0dXJuIE1DSUVSUl9GSUxFX05PVF9GT1VORDsKIAl9CiAJc3RhcnQgPSAxOyAJCWVuZCA9IDk5OTk5OwogCWlmIChkd0ZsYWdzICYgTUNJX0ZST00pIHsKIAkJc3RhcnQgPSBscFBhcm1zLT5kd0Zyb207IAotCQlkcHJpbnRmX21pZGkoc3RkZGViLCAiTUlESV9tY2lSZWNvcmQgLy8gTUNJX0ZST009JWQgXG4iLCBzdGFydCk7CisJCWRwcmludGZfaW5mbyhtaWRpLCAiTUlESV9tY2lSZWNvcmQgLy8gTUNJX0ZST009JWQgXG4iLCBzdGFydCk7CiAJfQogCWlmIChkd0ZsYWdzICYgTUNJX1RPKSB7CiAJCWVuZCA9IGxwUGFybXMtPmR3VG87Ci0JCWRwcmludGZfbWlkaShzdGRkZWIsICJNSURJX21jaVJlY29yZCAvLyBNQ0lfVE89JWQgXG4iLCBlbmQpOworCQlkcHJpbnRmX2luZm8obWlkaSwgIk1JRElfbWNpUmVjb3JkIC8vIE1DSV9UTz0lZCBcbiIsIGVuZCk7CiAJfQogCWxwTWlkaUhkciA9IFVTRVJfSEVBUF9MSU5fQUREUihNQ0lNaWRpRGV2W3dEZXZJRF0uaE1pZGlIZHIpOwogCWxwTWlkaUhkci0+bHBEYXRhID0gKExQU1RSKSB4bWFsbG9jKDEyMDApOwpAQCAtNTg0LDI3ICs1ODIsMjcgQEAKIAlscE1pZGlIZHItPmR3VXNlciA9IDBMOwogCWxwTWlkaUhkci0+ZHdGbGFncyA9IDBMOwogCWR3UmV0ID0gbWlkTWVzc2FnZSh3RGV2SUQsIE1JRE1fUFJFUEFSRSwgMCwgKERXT1JEKWxwTWlkaUhkciwgc2l6ZW9mKE1JRElIRFIpKTsKLQlkcHJpbnRmX21pZGkoc3RkZGViLCAiTUlESV9tY2lSZWNvcmQgLy8gYWZ0ZXIgTUlETV9QUkVQQVJFIFxuIik7CisJZHByaW50Zl9pbmZvKG1pZGksICJNSURJX21jaVJlY29yZCAvLyBhZnRlciBNSURNX1BSRVBBUkUgXG4iKTsKIAlNQ0lNaWRpRGV2W3dEZXZJRF0uZHdTdGF0dXMgPSBNQ0lfTU9ERV9SRUNPUkQ7CiAJd2hpbGUoTUNJTWlkaURldlt3RGV2SURdLmR3U3RhdHVzICE9IE1DSV9NT0RFX1NUT1ApIHsKLQkJZHByaW50Zl9taWRpKHN0ZGRlYiwgIk1JRElfbWNpUmVjb3JkIC8vIE1DSU1pZGlEZXZbd0RldklEXS5kd1N0YXR1cz0lcCAlZFxuIiwKKwkJZHByaW50Zl9pbmZvKG1pZGksICJNSURJX21jaVJlY29yZCAvLyBNQ0lNaWRpRGV2W3dEZXZJRF0uZHdTdGF0dXM9JXAgJWRcbiIsCiAJCQkmTUNJTWlkaURldlt3RGV2SURdLmR3U3RhdHVzLCBNQ0lNaWRpRGV2W3dEZXZJRF0uZHdTdGF0dXMpOwogCQlscE1pZGlIZHItPmR3Qnl0ZXNSZWNvcmRlZCA9IDA7CiAJCWR3UmV0ID0gbWlkTWVzc2FnZSh3RGV2SUQsIE1JRE1fU1RBUlQsIDAsIDBMLCAwTCk7Ci0JCWRwcmludGZfbWlkaShzdGRkZWIsICJNSURJX21jaVJlY29yZCAvLyBhZnRlciBNSURNX1NUQVJUIGxwTWlkaUhkcj0lcCBkd0J5dGVzUmVjb3JkZWQ9JWx1XG4iLAorCQlkcHJpbnRmX2luZm8obWlkaSwgIk1JRElfbWNpUmVjb3JkIC8vIGFmdGVyIE1JRE1fU1RBUlQgbHBNaWRpSGRyPSVwIGR3Qnl0ZXNSZWNvcmRlZD0lbHVcbiIsCiAJCQkJCWxwTWlkaUhkciwgbHBNaWRpSGRyLT5kd0J5dGVzUmVjb3JkZWQpOwogCQlpZiAobHBNaWRpSGRyLT5kd0J5dGVzUmVjb3JkZWQgPT0gMCkgYnJlYWs7CiAJfQotCWRwcmludGZfbWlkaShzdGRkZWIsICJNSURJX21jaVJlY29yZCAvLyBiZWZvcmUgTUlETV9VTlBSRVBBUkUgXG4iKTsKKwlkcHJpbnRmX2luZm8obWlkaSwgIk1JRElfbWNpUmVjb3JkIC8vIGJlZm9yZSBNSURNX1VOUFJFUEFSRSBcbiIpOwogCWR3UmV0ID0gbWlkTWVzc2FnZSh3RGV2SUQsIE1JRE1fVU5QUkVQQVJFLCAwLCAoRFdPUkQpbHBNaWRpSGRyLCBzaXplb2YoTUlESUhEUikpOwotCWRwcmludGZfbWlkaShzdGRkZWIsICJNSURJX21jaVJlY29yZCAvLyBhZnRlciBNSURNX1VOUFJFUEFSRSBcbiIpOworCWRwcmludGZfaW5mbyhtaWRpLCAiTUlESV9tY2lSZWNvcmQgLy8gYWZ0ZXIgTUlETV9VTlBSRVBBUkUgXG4iKTsKIAlpZiAobHBNaWRpSGRyLT5scERhdGEgIT0gTlVMTCkgewogCQlmcmVlKGxwTWlkaUhkci0+bHBEYXRhKTsKIAkJbHBNaWRpSGRyLT5scERhdGEgPSBOVUxMOwogCX0KIAlNQ0lNaWRpRGV2W3dEZXZJRF0uZHdTdGF0dXMgPSBNQ0lfTU9ERV9TVE9QOwogCWlmIChkd0ZsYWdzICYgTUNJX05PVElGWSkgewotCQlkcHJpbnRmX21pZGkoc3RkZGViLCAiTUlESV9tY2lSZWNvcmQgLy8gTUNJX05PVElGWV9TVUNDRVNTRlVMICUwOGxYICFcbiIsIGxwUGFybXMtPmR3Q2FsbGJhY2spOworCQlkcHJpbnRmX2luZm8obWlkaSwgIk1JRElfbWNpUmVjb3JkIC8vIE1DSV9OT1RJRllfU1VDQ0VTU0ZVTCAlMDhsWCAhXG4iLCBscFBhcm1zLT5kd0NhbGxiYWNrKTsKIAkJbWNpRHJpdmVyTm90aWZ5KChIV05EMTYpTE9XT1JEKGxwUGFybXMtPmR3Q2FsbGJhY2spLCAKIAkJCU1DSU1pZGlEZXZbd0RldklEXS53Tm90aWZ5RGV2aWNlSUQsIE1DSV9OT1RJRllfU1VDQ0VTU0ZVTCk7CiAJfQpAQCAtNjIxLDcgKzYxOSw3IEBACiBzdGF0aWMgRFdPUkQgTUlESV9tY2lQYXVzZShVSU5UMTYgd0RldklELCBEV09SRCBkd0ZsYWdzLCBMUE1DSV9HRU5FUklDX1BBUk1TIGxwUGFybXMpCiB7CiAjaWYgZGVmaW5lZChsaW51eCkgfHwgZGVmaW5lZChfX0ZyZWVCU0RfXykKLQlkcHJpbnRmX21pZGkoc3RkZGViLCAiTUlESV9tY2lQYXVzZSglMDRYLCAlMDhsWCwgJXApO1xuIiwgd0RldklELCBkd0ZsYWdzLCBscFBhcm1zKTsKKwlkcHJpbnRmX2luZm8obWlkaSwgIk1JRElfbWNpUGF1c2UoJTA0WCwgJTA4bFgsICVwKTtcbiIsIHdEZXZJRCwgZHdGbGFncywgbHBQYXJtcyk7CiAJaWYgKGxwUGFybXMgPT0gTlVMTCkgcmV0dXJuIE1DSUVSUl9JTlRFUk5BTDsKIAlyZXR1cm4gMDsKICNlbHNlCkBAIC02MzYsNyArNjM0LDcgQEAKIHN0YXRpYyBEV09SRCBNSURJX21jaVJlc3VtZShVSU5UMTYgd0RldklELCBEV09SRCBkd0ZsYWdzLCBMUE1DSV9HRU5FUklDX1BBUk1TIGxwUGFybXMpCiB7CiAjaWYgZGVmaW5lZChsaW51eCkgfHwgZGVmaW5lZChfX0ZyZWVCU0RfXykKLQlkcHJpbnRmX21pZGkoc3RkZGViLCAiTUlESV9tY2lSZXN1bWUoJTA0WCwgJTA4bFgsICVwKTtcbiIsIHdEZXZJRCwgZHdGbGFncywgbHBQYXJtcyk7CisJZHByaW50Zl9pbmZvKG1pZGksICJNSURJX21jaVJlc3VtZSglMDRYLCAlMDhsWCwgJXApO1xuIiwgd0RldklELCBkd0ZsYWdzLCBscFBhcm1zKTsKIAlpZiAobHBQYXJtcyA9PSBOVUxMKSByZXR1cm4gTUNJRVJSX0lOVEVSTkFMOwogCXJldHVybiAwOwogI2Vsc2UKQEAgLTY1MSwyMyArNjQ5LDIzIEBACiBzdGF0aWMgRFdPUkQgTUlESV9tY2lTZXQoVUlOVDE2IHdEZXZJRCwgRFdPUkQgZHdGbGFncywgTFBNQ0lfU0VUX1BBUk1TIGxwUGFybXMpCiB7CiAjaWYgZGVmaW5lZChsaW51eCkgfHwgZGVmaW5lZChfX0ZyZWVCU0RfXykKLQlkcHJpbnRmX21pZGkoc3RkZGViLCAiTUlESV9tY2lTZXQoJTA0WCwgJTA4bFgsICVwKTtcbiIsIHdEZXZJRCwgZHdGbGFncywgbHBQYXJtcyk7CisJZHByaW50Zl9pbmZvKG1pZGksICJNSURJX21jaVNldCglMDRYLCAlMDhsWCwgJXApO1xuIiwgd0RldklELCBkd0ZsYWdzLCBscFBhcm1zKTsKIAlpZiAobHBQYXJtcyA9PSBOVUxMKSByZXR1cm4gTUNJRVJSX0lOVEVSTkFMOwotCWRwcmludGZfbWlkaShzdGRkZWIsICJNSURJX21jaVNldCAvLyBkd1RpbWVGb3JtYXQ9JTA4bFhcbiIsIGxwUGFybXMtPmR3VGltZUZvcm1hdCk7Ci0JZHByaW50Zl9taWRpKHN0ZGRlYiwgIk1JRElfbWNpU2V0IC8vIGR3QXVkaW89JTA4bFhcbiIsIGxwUGFybXMtPmR3QXVkaW8pOworCWRwcmludGZfaW5mbyhtaWRpLCAiTUlESV9tY2lTZXQgLy8gZHdUaW1lRm9ybWF0PSUwOGxYXG4iLCBscFBhcm1zLT5kd1RpbWVGb3JtYXQpOworCWRwcmludGZfaW5mbyhtaWRpLCAiTUlESV9tY2lTZXQgLy8gZHdBdWRpbz0lMDhsWFxuIiwgbHBQYXJtcy0+ZHdBdWRpbyk7CiAJaWYgKGR3RmxhZ3MgJiBNQ0lfU0VUX1RJTUVfRk9STUFUKSB7CiAJCXN3aXRjaCAobHBQYXJtcy0+ZHdUaW1lRm9ybWF0KSB7CiAJCWNhc2UgTUNJX0ZPUk1BVF9NSUxMSVNFQ09ORFM6Ci0JCQlkcHJpbnRmX21pZGkoc3RkZGViLCAiTUlESV9tY2lTZXQgLy8gTUNJX0ZPUk1BVF9NSUxMSVNFQ09ORFMgIVxuIik7CisJCQlkcHJpbnRmX2luZm8obWlkaSwgIk1JRElfbWNpU2V0IC8vIE1DSV9GT1JNQVRfTUlMTElTRUNPTkRTICFcbiIpOwogCQkJYnJlYWs7CiAJCWNhc2UgTUNJX0ZPUk1BVF9CWVRFUzoKLQkJCWRwcmludGZfbWlkaShzdGRkZWIsICJNSURJX21jaVNldCAvLyBNQ0lfRk9STUFUX0JZVEVTICFcbiIpOworCQkJZHByaW50Zl9pbmZvKG1pZGksICJNSURJX21jaVNldCAvLyBNQ0lfRk9STUFUX0JZVEVTICFcbiIpOwogCQkJYnJlYWs7CiAJCWNhc2UgTUNJX0ZPUk1BVF9TQU1QTEVTOgotCQkJZHByaW50Zl9taWRpKHN0ZGRlYiwgIk1JRElfbWNpU2V0IC8vIE1DSV9GT1JNQVRfU0FNUExFUyAhXG4iKTsKKwkJCWRwcmludGZfaW5mbyhtaWRpLCAiTUlESV9tY2lTZXQgLy8gTUNJX0ZPUk1BVF9TQU1QTEVTICFcbiIpOwogCQkJYnJlYWs7CiAJCWRlZmF1bHQ6Ci0JCQlkcHJpbnRmX21pZGkoc3RkZGViLCAiTUlESV9tY2lTZXQgLy8gYmFkIHRpbWUgZm9ybWF0ICFcbiIpOworCQkJZHByaW50Zl93YXJuKG1pZGksICJNSURJX21jaVNldCAvLyBiYWQgdGltZSBmb3JtYXQgIVxuIik7CiAJCQlyZXR1cm4gTUNJRVJSX0JBRF9USU1FX0ZPUk1BVDsKIAkJfQogCX0KQEAgLTY3NSwyNiArNjczLDI2IEBACiAJaWYgKGR3RmxhZ3MgJiBNQ0lfU0VUX0RPT1JfT1BFTikgcmV0dXJuIE1DSUVSUl9VTlNVUFBPUlRFRF9GVU5DVElPTjsKIAlpZiAoZHdGbGFncyAmIE1DSV9TRVRfRE9PUl9DTE9TRUQpIHJldHVybiBNQ0lFUlJfVU5TVVBQT1JURURfRlVOQ1RJT047CiAJaWYgKGR3RmxhZ3MgJiBNQ0lfU0VUX0FVRElPKQotCQlkcHJpbnRmX21pZGkoc3RkZGViLCAiTUlESV9tY2lTZXQgLy8gTUNJX1NFVF9BVURJTyAhXG4iKTsKKwkJZHByaW50Zl9pbmZvKG1pZGksICJNSURJX21jaVNldCAvLyBNQ0lfU0VUX0FVRElPICFcbiIpOwogCWlmIChkd0ZsYWdzICYmIE1DSV9TRVRfT04pIHsKLQkJZHByaW50Zl9taWRpKHN0ZGRlYiwgIk1JRElfbWNpU2V0IC8vIE1DSV9TRVRfT04gIVxuIik7CisJCWRwcmludGZfaW5mbyhtaWRpLCAiTUlESV9tY2lTZXQgLy8gTUNJX1NFVF9PTiAhXG4iKTsKIAkJaWYgKGR3RmxhZ3MgJiYgTUNJX1NFVF9BVURJT19MRUZUKQotCQkJZHByaW50Zl9taWRpKHN0ZGRlYiwgIk1JRElfbWNpU2V0IC8vIE1DSV9TRVRfQVVESU9fTEVGVCAhXG4iKTsKKwkJCWRwcmludGZfaW5mbyhtaWRpLCAiTUlESV9tY2lTZXQgLy8gTUNJX1NFVF9BVURJT19MRUZUICFcbiIpOwogCQlpZiAoZHdGbGFncyAmJiBNQ0lfU0VUX0FVRElPX1JJR0hUKQotCQkJZHByaW50Zl9taWRpKHN0ZGRlYiwgIk1JRElfbWNpU2V0IC8vIE1DSV9TRVRfQVVESU9fUklHSFQgIVxuIik7CisJCQlkcHJpbnRmX2luZm8obWlkaSwgIk1JRElfbWNpU2V0IC8vIE1DSV9TRVRfQVVESU9fUklHSFQgIVxuIik7CiAJfQogCWlmIChkd0ZsYWdzICYgTUNJX1NFVF9PRkYpCi0JCWRwcmludGZfbWlkaShzdGRkZWIsICJNSURJX21jaVNldCAvLyBNQ0lfU0VUX09GRiAhXG4iKTsKKwkJZHByaW50Zl9pbmZvKG1pZGksICJNSURJX21jaVNldCAvLyBNQ0lfU0VUX09GRiAhXG4iKTsKIAlpZiAoZHdGbGFncyAmIE1DSV9TRVFfU0VUX01BU1RFUikKLQkJZHByaW50Zl9taWRpKHN0ZGRlYiwgIk1JRElfbWNpU2V0IC8vIE1DSV9TRVFfU0VUX01BU1RFUiAhXG4iKTsKKwkJZHByaW50Zl9pbmZvKG1pZGksICJNSURJX21jaVNldCAvLyBNQ0lfU0VRX1NFVF9NQVNURVIgIVxuIik7CiAJaWYgKGR3RmxhZ3MgJiBNQ0lfU0VRX1NFVF9TTEFWRSkKLQkJZHByaW50Zl9taWRpKHN0ZGRlYiwgIk1JRElfbWNpU2V0IC8vIE1DSV9TRVFfU0VUX1NMQVZFICFcbiIpOworCQlkcHJpbnRmX2luZm8obWlkaSwgIk1JRElfbWNpU2V0IC8vIE1DSV9TRVFfU0VUX1NMQVZFICFcbiIpOwogCWlmIChkd0ZsYWdzICYgTUNJX1NFUV9TRVRfT0ZGU0VUKQotCQlkcHJpbnRmX21pZGkoc3RkZGViLCAiTUlESV9tY2lTZXQgLy8gTUNJX1NFUV9TRVRfT0ZGU0VUICFcbiIpOworCQlkcHJpbnRmX2luZm8obWlkaSwgIk1JRElfbWNpU2V0IC8vIE1DSV9TRVFfU0VUX09GRlNFVCAhXG4iKTsKIAlpZiAoZHdGbGFncyAmIE1DSV9TRVFfU0VUX1BPUlQpCi0JCWRwcmludGZfbWlkaShzdGRkZWIsICJNSURJX21jaVNldCAvLyBNQ0lfU0VRX1NFVF9QT1JUICFcbiIpOworCQlkcHJpbnRmX2luZm8obWlkaSwgIk1JRElfbWNpU2V0IC8vIE1DSV9TRVFfU0VUX1BPUlQgIVxuIik7CiAJaWYgKGR3RmxhZ3MgJiBNQ0lfU0VRX1NFVF9URU1QTykKLQkJZHByaW50Zl9taWRpKHN0ZGRlYiwgIk1JRElfbWNpU2V0IC8vIE1DSV9TRVFfU0VUX1RFTVBPICFcbiIpOworCQlkcHJpbnRmX2luZm8obWlkaSwgIk1JRElfbWNpU2V0IC8vIE1DSV9TRVFfU0VUX1RFTVBPICFcbiIpOwogIAlyZXR1cm4gMDsKICNlbHNlCiAJcmV0dXJuIE1DSUVSUl9JTlRFUk5BTDsKQEAgLTcwOCw3ICs3MDYsNyBAQAogc3RhdGljIERXT1JEIE1JRElfbWNpU3RhdHVzKFVJTlQxNiB3RGV2SUQsIERXT1JEIGR3RmxhZ3MsIExQTUNJX1NUQVRVU19QQVJNUyBscFBhcm1zKQogewogI2lmIGRlZmluZWQobGludXgpIHx8IGRlZmluZWQoX19GcmVlQlNEX18pCi0JZHByaW50Zl9taWRpKHN0ZGRlYiwgIk1JRElfbWNpU3RhdHVzKCUwNFgsICUwOGxYLCAlcCk7XG4iLCB3RGV2SUQsIGR3RmxhZ3MsIGxwUGFybXMpOworCWRwcmludGZfaW5mbyhtaWRpLCAiTUlESV9tY2lTdGF0dXMoJTA0WCwgJTA4bFgsICVwKTtcbiIsIHdEZXZJRCwgZHdGbGFncywgbHBQYXJtcyk7CiAJaWYgKGxwUGFybXMgPT0gTlVMTCkgcmV0dXJuIE1DSUVSUl9JTlRFUk5BTDsKIAlpZiAoZHdGbGFncyAmIE1DSV9TVEFUVVNfSVRFTSkgewogCQlzd2l0Y2gobHBQYXJtcy0+ZHdJdGVtKSB7CkBAIC03MjYsNyArNzI0LDcgQEAKIAkJCWxwUGFybXMtPmR3UmV0dXJuID0gTUNJX01PREVfU1RPUDsKIAkJCWJyZWFrOwogCQljYXNlIE1DSV9TVEFUVVNfTUVESUFfUFJFU0VOVDoKLQkJCWRwcmludGZfbWlkaShzdGRkZWIsICJNSURJX21jaVN0YXR1cyAvLyBNQ0lfU1RBVFVTX01FRElBX1BSRVNFTlQgIVxuIik7CisJCQlkcHJpbnRmX2luZm8obWlkaSwgIk1JRElfbWNpU3RhdHVzIC8vIE1DSV9TVEFUVVNfTUVESUFfUFJFU0VOVCAhXG4iKTsKIAkJCWxwUGFybXMtPmR3UmV0dXJuID0gVFJVRTsKIAkJCWJyZWFrOwogCQljYXNlIE1DSV9TVEFUVVNfTlVNQkVSX09GX1RSQUNLUzoKQEAgLTc0Miw0NCArNzQwLDQ0IEBACiAJCQl9CiAJCQlicmVhazsKIAkJY2FzZSBNQ0lfU1RBVFVTX1JFQURZOgotCQkJZHByaW50Zl9taWRpKHN0ZGRlYiwgIk1JRElfbWNpU3RhdHVzIC8vIE1DSV9TVEFUVVNfUkVBRFkgIVxuIik7CisJCQlkcHJpbnRmX2luZm8obWlkaSwgIk1JRElfbWNpU3RhdHVzIC8vIE1DSV9TVEFUVVNfUkVBRFkgIVxuIik7CiAJCQlscFBhcm1zLT5kd1JldHVybiA9IFRSVUU7CiAJCQlicmVhazsKIAkJY2FzZSBNQ0lfU1RBVFVTX1RJTUVfRk9STUFUOgotCQkJZHByaW50Zl9taWRpKHN0ZGRlYiwgIk1JRElfbWNpU3RhdHVzIC8vIE1DSV9TVEFUVVNfVElNRV9GT1JNQVQgIVxuIik7CisJCQlkcHJpbnRmX2luZm8obWlkaSwgIk1JRElfbWNpU3RhdHVzIC8vIE1DSV9TVEFUVVNfVElNRV9GT1JNQVQgIVxuIik7CiAJCQlscFBhcm1zLT5kd1JldHVybiA9IE1DSV9GT1JNQVRfTUlMTElTRUNPTkRTOwogCQkJYnJlYWs7CiAJCWNhc2UgTUNJX1NFUV9TVEFUVVNfRElWVFlQRToKLQkJCWRwcmludGZfbWlkaShzdGRkZWIsICJNSURJX21jaVN0YXR1cyAvLyBNQ0lfU0VRX1NUQVRVU19ESVZUWVBFICFcbiIpOworCQkJZHByaW50Zl9pbmZvKG1pZGksICJNSURJX21jaVN0YXR1cyAvLyBNQ0lfU0VRX1NUQVRVU19ESVZUWVBFICFcbiIpOwogCQkJbHBQYXJtcy0+ZHdSZXR1cm4gPSAwOwogCQkJYnJlYWs7CiAJCWNhc2UgTUNJX1NFUV9TVEFUVVNfTUFTVEVSOgotCQkJZHByaW50Zl9taWRpKHN0ZGRlYiwgIk1JRElfbWNpU3RhdHVzIC8vIE1DSV9TRVFfU1RBVFVTX01BU1RFUiAhXG4iKTsKKwkJCWRwcmludGZfaW5mbyhtaWRpLCAiTUlESV9tY2lTdGF0dXMgLy8gTUNJX1NFUV9TVEFUVVNfTUFTVEVSICFcbiIpOwogCQkJbHBQYXJtcy0+ZHdSZXR1cm4gPSAwOwogCQkJYnJlYWs7CiAJCWNhc2UgTUNJX1NFUV9TVEFUVVNfU0xBVkU6Ci0JCQlkcHJpbnRmX21pZGkoc3RkZGViLCAiTUlESV9tY2lTdGF0dXMgLy8gTUNJX1NFUV9TVEFUVVNfU0xBVkUgIVxuIik7CisJCQlkcHJpbnRmX2luZm8obWlkaSwgIk1JRElfbWNpU3RhdHVzIC8vIE1DSV9TRVFfU1RBVFVTX1NMQVZFICFcbiIpOwogCQkJbHBQYXJtcy0+ZHdSZXR1cm4gPSAwOwogCQkJYnJlYWs7CiAJCWNhc2UgTUNJX1NFUV9TVEFUVVNfT0ZGU0VUOgotCQkJZHByaW50Zl9taWRpKHN0ZGRlYiwgIk1JRElfbWNpU3RhdHVzIC8vIE1DSV9TRVFfU1RBVFVTX09GRlNFVCAhXG4iKTsKKwkJCWRwcmludGZfaW5mbyhtaWRpLCAiTUlESV9tY2lTdGF0dXMgLy8gTUNJX1NFUV9TVEFUVVNfT0ZGU0VUICFcbiIpOwogCQkJbHBQYXJtcy0+ZHdSZXR1cm4gPSAwOwogCQkJYnJlYWs7CiAJCWNhc2UgTUNJX1NFUV9TVEFUVVNfUE9SVDoKLQkJCWRwcmludGZfbWlkaShzdGRkZWIsICJNSURJX21jaVN0YXR1cyAvLyBNQ0lfU0VRX1NUQVRVU19QT1JUICFcbiIpOworCQkJZHByaW50Zl9pbmZvKG1pZGksICJNSURJX21jaVN0YXR1cyAvLyBNQ0lfU0VRX1NUQVRVU19QT1JUICFcbiIpOwogCQkJbHBQYXJtcy0+ZHdSZXR1cm4gPSAwOwogCQkJYnJlYWs7CiAJCWNhc2UgTUNJX1NFUV9TVEFUVVNfVEVNUE86Ci0JCQlkcHJpbnRmX21pZGkoc3RkZGViLCAiTUlESV9tY2lTdGF0dXMgLy8gTUNJX1NFUV9TVEFUVVNfVEVNUE8gIVxuIik7CisJCQlkcHJpbnRmX2luZm8obWlkaSwgIk1JRElfbWNpU3RhdHVzIC8vIE1DSV9TRVFfU1RBVFVTX1RFTVBPICFcbiIpOwogCQkJbHBQYXJtcy0+ZHdSZXR1cm4gPSAwOwogCQkJYnJlYWs7CiAJCWRlZmF1bHQ6Ci0JCQlkcHJpbnRmX21pZGkoc3RkZGViLCAiTUlESV9tY2lTdGF0dXMgLy8gdW5rbm93bSBjb21tYW5kICUwOGxYICFcbiIsIGxwUGFybXMtPmR3SXRlbSk7CisJCQlkcHJpbnRmX3dhcm4obWlkaSwgIk1JRElfbWNpU3RhdHVzIC8vIHVua25vd20gY29tbWFuZCAlMDhsWCAhXG4iLCBscFBhcm1zLT5kd0l0ZW0pOwogCQkJcmV0dXJuIE1DSUVSUl9VTlJFQ09HTklaRURfQ09NTUFORDsKIAkJfQogCX0KIAlpZiAoZHdGbGFncyAmIE1DSV9OT1RJRlkpIHsKLQkJZHByaW50Zl9taWRpKHN0ZGRlYiwgIk1JRElfbWNpU3RhdHVzIC8vIE1DSV9OT1RJRllfU1VDQ0VTU0ZVTCAlMDhsWCAhXG4iLCBscFBhcm1zLT5kd0NhbGxiYWNrKTsKKwkJZHByaW50Zl9pbmZvKG1pZGksICJNSURJX21jaVN0YXR1cyAvLyBNQ0lfTk9USUZZX1NVQ0NFU1NGVUwgJTA4bFggIVxuIiwgbHBQYXJtcy0+ZHdDYWxsYmFjayk7CiAJCW1jaURyaXZlck5vdGlmeSgoSFdORDE2KUxPV09SRChscFBhcm1zLT5kd0NhbGxiYWNrKSwgCiAJCQlNQ0lNaWRpRGV2W3dEZXZJRF0ud05vdGlmeURldmljZUlELCBNQ0lfTk9USUZZX1NVQ0NFU1NGVUwpOwogCX0KQEAgLTc5Niw3ICs3OTQsNyBAQAogCQkJCQlMUE1DSV9HRVRERVZDQVBTX1BBUk1TIGxwUGFybXMpCiB7CiAjaWYgZGVmaW5lZChsaW51eCkgfHwgZGVmaW5lZChfX0ZyZWVCU0RfXykKLQlkcHJpbnRmX21pZGkoc3RkZGViLCAiTUlESV9tY2lHZXREZXZDYXBzKCUwNFgsICUwOGxYLCAlcCk7XG4iLCB3RGV2SUQsIGR3RmxhZ3MsIGxwUGFybXMpOworCWRwcmludGZfaW5mbyhtaWRpLCAiTUlESV9tY2lHZXREZXZDYXBzKCUwNFgsICUwOGxYLCAlcCk7XG4iLCB3RGV2SUQsIGR3RmxhZ3MsIGxwUGFybXMpOwogCWlmIChscFBhcm1zID09IE5VTEwpIHJldHVybiBNQ0lFUlJfSU5URVJOQUw7CiAJaWYgKGR3RmxhZ3MgJiBNQ0lfR0VUREVWQ0FQU19JVEVNKSB7CiAJCXN3aXRjaChscFBhcm1zLT5kd0l0ZW0pIHsKQEAgLTg0Myw3ICs4NDEsNyBAQAogc3RhdGljIERXT1JEIE1JRElfbWNpSW5mbyhVSU5UMTYgd0RldklELCBEV09SRCBkd0ZsYWdzLCBMUE1DSV9JTkZPX1BBUk1TMTYgbHBQYXJtcykKIHsKICNpZiBkZWZpbmVkKGxpbnV4KSB8fCBkZWZpbmVkKF9fRnJlZUJTRF9fKQotCWRwcmludGZfbWlkaShzdGRkZWIsICJNSURJX21jaUluZm8oJTA0WCwgJTA4bFgsICVwKTtcbiIsIHdEZXZJRCwgZHdGbGFncywgbHBQYXJtcyk7CisJZHByaW50Zl9pbmZvKG1pZGksICJNSURJX21jaUluZm8oJTA0WCwgJTA4bFgsICVwKTtcbiIsIHdEZXZJRCwgZHdGbGFncywgbHBQYXJtcyk7CiAJaWYgKGxwUGFybXMgPT0gTlVMTCkgcmV0dXJuIE1DSUVSUl9JTlRFUk5BTDsKIAlscFBhcm1zLT5scHN0clJldHVybiA9IE5VTEw7CiAJc3dpdGNoKGR3RmxhZ3MpIHsKQEAgLTg3NSw3ICs4NzMsNyBAQAogICovCiBzdGF0aWMgRFdPUkQgbWlkR2V0RGV2Q2FwcyhXT1JEIHdEZXZJRCwgTFBNSURJSU5DQVBTMTYgbHBDYXBzLCBEV09SRCBkd1NpemUpCiB7Ci0JZHByaW50Zl9taWRpKHN0ZGRlYiwgIm1pZEdldERldkNhcHMoJTA0WCwgJXAsICUwOGxYKTtcbiIsIHdEZXZJRCwgbHBDYXBzLCBkd1NpemUpOworCWRwcmludGZfaW5mbyhtaWRpLCAibWlkR2V0RGV2Q2FwcyglMDRYLCAlcCwgJTA4bFgpO1xuIiwgd0RldklELCBscENhcHMsIGR3U2l6ZSk7CiAJbHBDYXBzLT53TWlkID0gMHgwMEZGOyAJICAgICAgICAvKiBNYW51ZmFjIElEICovCiAJbHBDYXBzLT53UGlkID0gMHgwMDAxOyAJICAgICAgICAvKiBQcm9kdWN0IElEICovCiAJbHBDYXBzLT52RHJpdmVyVmVyc2lvbiA9IDB4MDAxOyAvKiBQcm9kdWN0IFZlcnNpb24gKi8KQEAgLTg5MSwzNyArODg5LDM3IEBACiB7CiAjaWYgZGVmaW5lZChsaW51eCkgfHwgZGVmaW5lZChfX0ZyZWVCU0RfXykKIAlpbnQJCW1pZGk7Ci0JZHByaW50Zl9taWRpKHN0ZGRlYiwKKwlkcHJpbnRmX2luZm8obWlkaSwKIAkJIm1pZE9wZW4oJTA0WCwgJXAsICUwOGxYKTtcbiIsIHdEZXZJRCwgbHBEZXNjLCBkd0ZsYWdzKTsKIAlpZiAobHBEZXNjID09IE5VTEwpIHsKLQkJZHByaW50Zl9taWRpKHN0ZGRlYiwiTGludXggJ21pZE9wZW4nIC8vIEludmFsaWQgUGFyYW1ldGVyICFcbiIpOworCQlkcHJpbnRmX3dhcm4obWlkaSwgIkxpbnV4ICdtaWRPcGVuJyAvLyBJbnZhbGlkIFBhcmFtZXRlciAhXG4iKTsKIAkJcmV0dXJuIE1NU1lTRVJSX0lOVkFMUEFSQU07CiAJfQogCWlmICh3RGV2SUQgPj0gTUFYX01JRElJTkRSVikgewotCQlkcHJpbnRmX21pZGkoc3RkZGViLCJMaW51eCAnbWlkT3BlbicgLy8gTUFYX01JRElJTkRSViByZWFjaGVkICFcbiIpOworCQlkcHJpbnRmX2luZm8obWlkaSwiTGludXggJ21pZE9wZW4nIC8vIE1BWF9NSURJSU5EUlYgcmVhY2hlZCAhXG4iKTsKIAkJcmV0dXJuIE1NU1lTRVJSX0FMTE9DQVRFRDsKIAl9CiAJTWlkaUluRGV2W3dEZXZJRF0udW5peGRldiA9IDA7CiAJbWlkaSA9IG9wZW4gKE1JRElfREVWLCBPX1JET05MWSwgMCk7CiAJaWYgKG1pZGkgPT0gLTEpIHsKLQkJZHByaW50Zl9taWRpKHN0ZGRlYiwiTGludXggJ21pZE9wZW4nIC8vIGNhbid0IG9wZW4gIVxuIik7CisJCWRwcmludGZfd2FybihtaWRpLCJMaW51eCAnbWlkT3BlbicgLy8gY2FuJ3Qgb3BlbiAhXG4iKTsKIAkJcmV0dXJuIE1NU1lTRVJSX05PVEVOQUJMRUQ7CiAJfQogCU1pZGlJbkRldlt3RGV2SURdLndGbGFncyA9IEhJV09SRChkd0ZsYWdzICYgQ0FMTEJBQ0tfVFlQRU1BU0spOwogCXN3aXRjaChNaWRpSW5EZXZbd0RldklEXS53RmxhZ3MpIHsKIAkJY2FzZSBEQ0JfTlVMTDoKLQkJCWRwcmludGZfbWlkaShzdGRkZWIsIkxpbnV4ICdtaWRPcGVuJyAvLyBDQUxMQkFDS19OVUxMICFcbiIpOworCQkJZHByaW50Zl9pbmZvKG1pZGksIkxpbnV4ICdtaWRPcGVuJyAvLyBDQUxMQkFDS19OVUxMICFcbiIpOwogCQkJYnJlYWs7CiAJCWNhc2UgRENCX1dJTkRPVzoKLQkJCWRwcmludGZfbWlkaShzdGRkZWIsCisJCQlkcHJpbnRmX2luZm8obWlkaSwKIAkJCQkiTGludXggJ21pZE9wZW4nIC8vIENBTExCQUNLX1dJTkRPVyAhXG4iKTsKIAkJCWJyZWFrOwogCQljYXNlIERDQl9UQVNLOgotCQkJZHByaW50Zl9taWRpKHN0ZGRlYiwKKwkJCWRwcmludGZfaW5mbyhtaWRpLAogCQkJCSAgICJMaW51eCAnbWlkT3BlbicgLy8gQ0FMTEJBQ0tfVEFTSyAhXG4iKTsKIAkJCWJyZWFrOwogCQljYXNlIERDQl9GVU5DVElPTjoKLQkJCWRwcmludGZfbWlkaShzdGRkZWIsCisJCQlkcHJpbnRmX2luZm8obWlkaSwKIAkJCQkgICAiTGludXggJ21pZE9wZW4nIC8vIENBTExCQUNLX0ZVTkNUSU9OICFcbiIpOwogCQkJYnJlYWs7CiAJfQpAQCAtOTMwLDcgKzkyOCw3IEBACiAJTWlkaUluRGV2W3dEZXZJRF0uZHdUb3RhbFBsYXllZCA9IDA7CiAJTWlkaUluRGV2W3dEZXZJRF0uYnVmc2l6ZSA9IDB4M0ZGRjsKIAlpZiAoTUlESV9Ob3RpZnlDbGllbnQod0RldklELCBNSU1fT1BFTiwgMEwsIDBMKSAhPSBNTVNZU0VSUl9OT0VSUk9SKSB7Ci0JCWRwcmludGZfbWlkaShzdGRkZWIsIkxpbnV4ICdtaWRPcGVuJyAvLyBjYW4ndCBub3RpZnkgY2xpZW50ICFcbiIpOworCQlkcHJpbnRmX3dhcm4obWlkaSwiTGludXggJ21pZE9wZW4nIC8vIGNhbid0IG5vdGlmeSBjbGllbnQgIVxuIik7CiAJCXJldHVybiBNTVNZU0VSUl9JTlZBTFBBUkFNOwogCX0KIAlyZXR1cm4gTU1TWVNFUlJfTk9FUlJPUjsKQEAgLTk0NSwxNiArOTQzLDE2IEBACiBzdGF0aWMgRFdPUkQgbWlkQ2xvc2UoV09SRCB3RGV2SUQpCiB7CiAjaWYgZGVmaW5lZChsaW51eCkgfHwgZGVmaW5lZChfX0ZyZWVCU0RfXykKLQlkcHJpbnRmX21pZGkoc3RkZGViLCAibWlkQ2xvc2UoJTA0WCk7XG4iLCB3RGV2SUQpOworCWRwcmludGZfaW5mbyhtaWRpLCAibWlkQ2xvc2UoJTA0WCk7XG4iLCB3RGV2SUQpOwogCWlmIChNaWRpSW5EZXZbd0RldklEXS51bml4ZGV2ID09IDApIHsKLQkJZHByaW50Zl9taWRpKHN0ZGRlYiwiTGludXggJ21pZENsb3NlJyAvLyBjYW4ndCBjbG9zZSAhXG4iKTsKKwkJZHByaW50Zl93YXJuKG1pZGksIkxpbnV4ICdtaWRDbG9zZScgLy8gY2FuJ3QgY2xvc2UgIVxuIik7CiAJCXJldHVybiBNTVNZU0VSUl9OT1RFTkFCTEVEOwogCX0KIAljbG9zZShNaWRpSW5EZXZbd0RldklEXS51bml4ZGV2KTsKIAlNaWRpSW5EZXZbd0RldklEXS51bml4ZGV2ID0gMDsKIAlNaWRpSW5EZXZbd0RldklEXS5idWZzaXplID0gMDsKIAlpZiAoTUlESV9Ob3RpZnlDbGllbnQod0RldklELCBNSU1fQ0xPU0UsIDBMLCAwTCkgIT0gTU1TWVNFUlJfTk9FUlJPUikgewotCQlkcHJpbnRmX21pZGkoc3RkZGViLCJMaW51eCAnbWlkQ2xvc2UnIC8vIGNhbid0IG5vdGlmeSBjbGllbnQgIVxuIik7CisJCWRwcmludGZfd2FybihtaWRpLCJMaW51eCAnbWlkQ2xvc2UnIC8vIGNhbid0IG5vdGlmeSBjbGllbnQgIVxuIik7CiAJCXJldHVybiBNTVNZU0VSUl9JTlZBTFBBUkFNOwogCX0KIAlyZXR1cm4gTU1TWVNFUlJfTk9FUlJPUjsKQEAgLTk2OCw3ICs5NjYsNyBAQAogICovCiBzdGF0aWMgRFdPUkQgbWlkQWRkQnVmZmVyKFdPUkQgd0RldklELCBMUE1JRElIRFIgbHBNaWRpSGRyLCBEV09SRCBkd1NpemUpCiB7Ci0JZHByaW50Zl9taWRpKHN0ZGRlYiwgIm1pZEFkZEJ1ZmZlciglMDRYLCAlcCwgJTA4bFgpO1xuIiwgd0RldklELCBscE1pZGlIZHIsIGR3U2l6ZSk7CisJZHByaW50Zl9pbmZvKG1pZGksICJtaWRBZGRCdWZmZXIoJTA0WCwgJXAsICUwOGxYKTtcbiIsIHdEZXZJRCwgbHBNaWRpSGRyLCBkd1NpemUpOwogCXJldHVybiBNTVNZU0VSUl9OT1RFTkFCTEVEOwogfQogCkBAIC05NzcsNyArOTc1LDcgQEAKICAqLwogc3RhdGljIERXT1JEIG1pZFByZXBhcmUoV09SRCB3RGV2SUQsIExQTUlESUhEUiBscE1pZGlIZHIsIERXT1JEIGR3U2l6ZSkKIHsKLQlkcHJpbnRmX21pZGkoc3RkZGViLCAibWlkUHJlcGFyZSglMDRYLCAlcCwgJTA4bFgpO1xuIiwgd0RldklELCBscE1pZGlIZHIsIGR3U2l6ZSk7CisJZHByaW50Zl9pbmZvKG1pZGksICJtaWRQcmVwYXJlKCUwNFgsICVwLCAlMDhsWCk7XG4iLCB3RGV2SUQsIGxwTWlkaUhkciwgZHdTaXplKTsKIAlyZXR1cm4gTU1TWVNFUlJfTk9URU5BQkxFRDsKIH0KIApAQCAtOTg2LDcgKzk4NCw3IEBACiAgKi8KIHN0YXRpYyBEV09SRCBtaWRVbnByZXBhcmUoV09SRCB3RGV2SUQsIExQTUlESUhEUiBscE1pZGlIZHIsIERXT1JEIGR3U2l6ZSkKIHsKLQlkcHJpbnRmX21pZGkoc3RkZGViLCAibWlkVW5wcmVwYXJlKCUwNFgsICVwLCAlMDhsWCk7XG4iLCB3RGV2SUQsIGxwTWlkaUhkciwgZHdTaXplKTsKKwlkcHJpbnRmX2luZm8obWlkaSwgIm1pZFVucHJlcGFyZSglMDRYLCAlcCwgJTA4bFgpO1xuIiwgd0RldklELCBscE1pZGlIZHIsIGR3U2l6ZSk7CiAJcmV0dXJuIE1NU1lTRVJSX05PVEVOQUJMRUQ7CiB9CiAKQEAgLTk5NSw3ICs5OTMsNyBAQAogICovCiBzdGF0aWMgRFdPUkQgbWlkUmVzZXQoV09SRCB3RGV2SUQpCiB7Ci0JZHByaW50Zl9taWRpKHN0ZGRlYiwgIm1pZFJlc2V0KCUwNFgpO1xuIiwgd0RldklEKTsKKwlkcHJpbnRmX2luZm8obWlkaSwgIm1pZFJlc2V0KCUwNFgpO1xuIiwgd0RldklEKTsKIAlyZXR1cm4gTU1TWVNFUlJfTk9URU5BQkxFRDsKIH0KIApAQCAtMTAwNSw3ICsxMDAzLDcgQEAKICAqLwogc3RhdGljIERXT1JEIG1pZFN0YXJ0KFdPUkQgd0RldklEKQogewotCWRwcmludGZfbWlkaShzdGRkZWIsICJtaWRTdGFydCglMDRYKTtcbiIsIHdEZXZJRCk7CisJZHByaW50Zl9pbmZvKG1pZGksICJtaWRTdGFydCglMDRYKTtcbiIsIHdEZXZJRCk7CiAJcmV0dXJuIE1NU1lTRVJSX05PVEVOQUJMRUQ7CiB9CiAKQEAgLTEwMTUsNyArMTAxMyw3IEBACiAgKi8KIHN0YXRpYyBEV09SRCBtaWRTdG9wKFdPUkQgd0RldklEKQogewotCWRwcmludGZfbWlkaShzdGRkZWIsICJtaWRTdG9wKCUwNFgpO1xuIiwgd0RldklEKTsKKwlkcHJpbnRmX2luZm8obWlkaSwgIm1pZFN0b3AoJTA0WCk7XG4iLCB3RGV2SUQpOwogCXJldHVybiBNTVNZU0VSUl9OT1RFTkFCTEVEOwogfQogCkBAIC0xMDI2LDcgKzEwMjQsNyBAQAogRFdPUkQgbWlkTWVzc2FnZShXT1JEIHdEZXZJRCwgV09SRCB3TXNnLCBEV09SRCBkd1VzZXIsIAogCQkJCQlEV09SRCBkd1BhcmFtMSwgRFdPUkQgZHdQYXJhbTIpCiB7Ci0JZHByaW50Zl9taWRpKHN0ZGRlYiwgIm1pZE1lc3NhZ2UoJTA0WCwgJTA0WCwgJTA4bFgsICUwOGxYLCAlMDhsWCk7XG4iLCAKKwlkcHJpbnRmX2luZm8obWlkaSwgIm1pZE1lc3NhZ2UoJTA0WCwgJTA0WCwgJTA4bFgsICUwOGxYLCAlMDhsWCk7XG4iLCAKIAkJCXdEZXZJRCwgd01zZywgZHdVc2VyLCBkd1BhcmFtMSwgZHdQYXJhbTIpOwogCXN3aXRjaCh3TXNnKSB7CiAJY2FzZSBNSURNX09QRU46CkBAIC0xMDYzLDcgKzEwNjEsNyBAQAogICovCiBzdGF0aWMgRFdPUkQgbW9kR2V0RGV2Q2FwcyhXT1JEIHdEZXZJRCwgTFBNSURJT1VUQ0FQUzE2IGxwQ2FwcywgRFdPUkQgZHdTaXplKQogewotCWRwcmludGZfbWlkaShzdGRkZWIsICJtb2RHZXREZXZDYXBzKCUwNFgsICVwLCAlMDhsWCk7XG4iLCB3RGV2SUQsIGxwQ2FwcywgZHdTaXplKTsKKwlkcHJpbnRmX2luZm8obWlkaSwgIm1vZEdldERldkNhcHMoJTA0WCwgJXAsICUwOGxYKTtcbiIsIHdEZXZJRCwgbHBDYXBzLCBkd1NpemUpOwogCWxwQ2Fwcy0+d01pZCA9IDB4MDBGRjsgCS8qIE1hbnVmYWMgSUQgKi8KIAlscENhcHMtPndQaWQgPSAweDAwMDE7IAkvKiBQcm9kdWN0IElEICovCiAJbHBDYXBzLT52RHJpdmVyVmVyc2lvbiA9IDB4MDAxOyAvKiBQcm9kdWN0IFZlcnNpb24gKi8KQEAgLTEwNzYsNyArMTA3NCw3IEBACiAJbHBDYXBzLT53Vm9pY2VzICAgICA9IDE0OyAgICAgICAvKiBtYWtlIGl0IGlvY3RsICovCiAJbHBDYXBzLT53Tm90ZXMgICAgICA9IDE0OyAgICAgICAvKiBtYWtlIGl0IGlvY3RsICovCiAJbHBDYXBzLT5kd1N1cHBvcnQgICA9IE1JRElDQVBTX1ZPTFVNRXxNSURJQ0FQU19MUlZPTFVNRTsKLQlkcHJpbnRmX21pZGkoc3RkZGViLCJMaW51eCBtb2RHZXREZXZDYXBzIC8vIHRlY2huID0gJWQgdm9pY2VzPSVkIG5vdGVzID0gJWQgc3VwcG9ydCA9ICVsZFxuIixscENhcHMtPndUZWNobm9sb2d5LGxwQ2Fwcy0+d1ZvaWNlcyxscENhcHMtPndOb3RlcyxscENhcHMtPmR3U3VwcG9ydCk7CisJZHByaW50Zl9pbmZvKG1pZGksIkxpbnV4IG1vZEdldERldkNhcHMgLy8gdGVjaG4gPSAlZCB2b2ljZXM9JWQgbm90ZXMgPSAlZCBzdXBwb3J0ID0gJWxkXG4iLGxwQ2Fwcy0+d1RlY2hub2xvZ3ksbHBDYXBzLT53Vm9pY2VzLGxwQ2Fwcy0+d05vdGVzLGxwQ2Fwcy0+ZHdTdXBwb3J0KTsKIAogCXJldHVybiBNTVNZU0VSUl9OT0VSUk9SOwogfQpAQCAtMTA5MCwzNyArMTA4OCwzNyBAQAogI2lmIGRlZmluZWQobGludXgpIHx8IGRlZmluZWQoX19GcmVlQlNEX18pCiAJaW50CQltaWRpOwogCi0JZHByaW50Zl9taWRpKHN0ZGRlYiwKKwlkcHJpbnRmX2luZm8obWlkaSwKIAkJIm1vZE9wZW4oJTA0WCwgJXAsICUwOGxYKTtcbiIsIHdEZXZJRCwgbHBEZXNjLCBkd0ZsYWdzKTsKIAlpZiAobHBEZXNjID09IE5VTEwpIHsKLQkJZHByaW50Zl9taWRpKHN0ZGRlYiwiTGludXggJ21vZE9wZW4nIC8vIEludmFsaWQgUGFyYW1ldGVyICFcbiIpOworCQlkcHJpbnRmX3dhcm4obWlkaSwgIkxpbnV4ICdtb2RPcGVuJyAvLyBJbnZhbGlkIFBhcmFtZXRlciAhXG4iKTsKIAkJcmV0dXJuIE1NU1lTRVJSX0lOVkFMUEFSQU07CiAJfQogCWlmICh3RGV2SUQ+PSBNQVhfTUlESU9VVERSVikgewotCQlkcHJpbnRmX21pZGkoc3RkZGViLCJMaW51eCAnbW9kT3BlbicgLy8gTUFYX01JRElPVVREUlYgcmVhY2hlZCAhXG4iKTsKKwkJZHByaW50Zl9pbmZvKG1pZGksIkxpbnV4ICdtb2RPcGVuJyAvLyBNQVhfTUlESU9VVERSViByZWFjaGVkICFcbiIpOwogCQlyZXR1cm4gTU1TWVNFUlJfQUxMT0NBVEVEOwogCX0KIAlNaWRpT3V0RGV2W3dEZXZJRF0udW5peGRldiA9IDA7CiAJbWlkaSA9IG9wZW4gKE1JRElfREVWLCBPX1dST05MWSwgMCk7CiAJaWYgKG1pZGkgPT0gLTEpIHsKLQkJZHByaW50Zl9taWRpKHN0ZGRlYiwiTGludXggJ21vZE9wZW4nIC8vIGNhbid0IG9wZW4gIVxuIik7CisJCWRwcmludGZfd2FybihtaWRpLCJMaW51eCAnbW9kT3BlbicgLy8gY2FuJ3Qgb3BlbiAhXG4iKTsKIAkJcmV0dXJuIE1NU1lTRVJSX05PVEVOQUJMRUQ7CiAJfQogCU1pZGlPdXREZXZbd0RldklEXS53RmxhZ3MgPSBISVdPUkQoZHdGbGFncyAmIENBTExCQUNLX1RZUEVNQVNLKTsKIAlzd2l0Y2goTWlkaU91dERldlt3RGV2SURdLndGbGFncykgewogCWNhc2UgRENCX05VTEw6Ci0JCWRwcmludGZfbWlkaShzdGRkZWIsIkxpbnV4ICdtb2RPcGVuJyAvLyBDQUxMQkFDS19OVUxMICFcbiIpOworCQlkcHJpbnRmX2luZm8obWlkaSwiTGludXggJ21vZE9wZW4nIC8vIENBTExCQUNLX05VTEwgIVxuIik7CiAJCWJyZWFrOwogCWNhc2UgRENCX1dJTkRPVzoKLQkJZHByaW50Zl9taWRpKHN0ZGRlYiwKKwkJZHByaW50Zl9pbmZvKG1pZGksCiAJCQkiTGludXggJ21vZE9wZW4nIC8vIENBTExCQUNLX1dJTkRPVyAhXG4iKTsKIAkJYnJlYWs7CiAJY2FzZSBEQ0JfVEFTSzoKLQkJZHByaW50Zl9taWRpKHN0ZGRlYiwKKwkJZHByaW50Zl9pbmZvKG1pZGksCiAJCQkiTGludXggJ21vZE9wZW4nIC8vIENBTExCQUNLX1RBU0sgIVxuIik7CiAJCWJyZWFrOwogCWNhc2UgRENCX0ZVTkNUSU9OOgotCQlkcHJpbnRmX21pZGkoc3RkZGViLAorCQlkcHJpbnRmX2luZm8obWlkaSwKIAkJCSJMaW51eCAnbW9kT3BlbicgLy8gQ0FMTEJBQ0tfRlVOQ1RJT04gIVxuIik7CiAJCWJyZWFrOwogCX0KQEAgLTExMjksMTAgKzExMjcsMTAgQEAKIAlNaWRpT3V0RGV2W3dEZXZJRF0uZHdUb3RhbFBsYXllZCA9IDA7CiAJTWlkaU91dERldlt3RGV2SURdLmJ1ZnNpemUgPSAweDNGRkY7CiAJaWYgKE1JRElfTm90aWZ5Q2xpZW50KHdEZXZJRCwgTU9NX09QRU4sIDBMLCAwTCkgIT0gTU1TWVNFUlJfTk9FUlJPUikgewotCQlkcHJpbnRmX21pZGkoc3RkZGViLCJMaW51eCAnbW9kT3BlbicgLy8gY2FuJ3Qgbm90aWZ5IGNsaWVudCAhXG4iKTsKKwkJZHByaW50Zl93YXJuKG1pZGksIkxpbnV4ICdtb2RPcGVuJyAvLyBjYW4ndCBub3RpZnkgY2xpZW50ICFcbiIpOwogCQlyZXR1cm4gTU1TWVNFUlJfSU5WQUxQQVJBTTsKIAl9Ci0JZHByaW50Zl9taWRpKHN0ZGRlYiwKKwlkcHJpbnRmX2luZm8obWlkaSwKIAkJIkxpbnV4ICdtb2RPcGVuJyAvLyBTdWNjZXNmdWwgdW5peGRldj0lZCAhXG4iLCBtaWRpKTsKIAlyZXR1cm4gTU1TWVNFUlJfTk9FUlJPUjsKICNlbHNlCkBAIC0xMTQ3LDE2ICsxMTQ1LDE2IEBACiBzdGF0aWMgRFdPUkQgbW9kQ2xvc2UoV09SRCB3RGV2SUQpCiB7CiAjaWYgZGVmaW5lZChsaW51eCkgfHwgZGVmaW5lZChfX0ZyZWVCU0RfXykKLQlkcHJpbnRmX21pZGkoc3RkZGViLCAibW9kQ2xvc2UoJTA0WCk7XG4iLCB3RGV2SUQpOworCWRwcmludGZfaW5mbyhtaWRpLCAibW9kQ2xvc2UoJTA0WCk7XG4iLCB3RGV2SUQpOwogCWlmIChNaWRpT3V0RGV2W3dEZXZJRF0udW5peGRldiA9PSAwKSB7Ci0JCWRwcmludGZfbWlkaShzdGRkZWIsIkxpbnV4ICdtb2RDbG9zZScgLy8gY2FuJ3QgY2xvc2UgIVxuIik7CisJCWRwcmludGZfd2FybihtaWRpLCJMaW51eCAnbW9kQ2xvc2UnIC8vIGNhbid0IGNsb3NlICFcbiIpOwogCQlyZXR1cm4gTU1TWVNFUlJfTk9URU5BQkxFRDsKIAl9CiAJY2xvc2UoTWlkaU91dERldlt3RGV2SURdLnVuaXhkZXYpOwogCU1pZGlPdXREZXZbd0RldklEXS51bml4ZGV2ID0gMDsKIAlNaWRpT3V0RGV2W3dEZXZJRF0uYnVmc2l6ZSA9IDA7CiAJaWYgKE1JRElfTm90aWZ5Q2xpZW50KHdEZXZJRCwgTU9NX0NMT1NFLCAwTCwgMEwpICE9IE1NU1lTRVJSX05PRVJST1IpIHsKLQkJZHByaW50Zl9taWRpKHN0ZGRlYiwiTGludXggJ21vZENsb3NlJyAvLyBjYW4ndCBub3RpZnkgY2xpZW50ICFcbiIpOworCQlkcHJpbnRmX3dhcm4obWlkaSwiTGludXggJ21vZENsb3NlJyAvLyBjYW4ndCBub3RpZnkgY2xpZW50ICFcbiIpOwogCQlyZXR1cm4gTU1TWVNFUlJfSU5WQUxQQVJBTTsKIAl9CiAJcmV0dXJuIE1NU1lTRVJSX05PRVJST1I7CkBAIC0xMTczLDE3ICsxMTcxLDE2IEBACiAjaWYgZGVmaW5lZChsaW51eCkgfHwgZGVmaW5lZChfX0ZyZWVCU0RfXykKIAlXT1JECWV2ZW50OwogCi0JZHByaW50Zl9taWRpKHN0ZGRlYiwJCisJZHByaW50Zl9pbmZvKG1pZGksCQogCQkibW9kRGF0YSglMDRYLCAlMDhsWCk7XG4iLCB3RGV2SUQsIGR3UGFyYW0pOwogCWlmIChNaWRpT3V0RGV2W3dEZXZJRF0udW5peGRldiA9PSAwKSB7Ci0gICAgICAgIAlkcHJpbnRmX21pZGkoc3RkZGViLCJMaW51eCAnbW9kRGF0YScgLy8gY2FuJ3QgcGxheSAhXG4iKTsKKyAgICAgICAgCWRwcmludGZfd2FybihtaWRpLCJMaW51eCAnbW9kRGF0YScgLy8gY2FuJ3QgcGxheSAhXG4iKTsKIAkJcmV0dXJuIE1JRElFUlJfTk9ERVZJQ0U7CiAJfQogCWV2ZW50ID0gTE9XT1JEKGR3UGFyYW0pOwogCWlmICh3cml0ZSAoTWlkaU91dERldlt3RGV2SURdLnVuaXhkZXYsIAogCQkmZXZlbnQsIHNpemVvZihXT1JEKSkgIT0gc2l6ZW9mKFdPUkQpKSB7Ci0JCWRwcmludGZfbWlkaShzdGRkZWIsCi0JCQkibW9kRGF0YSgpIC8vIGVycm9yIHdyaXR0aW5nIHVuaXhkZXYgIVxuIik7CisJCWRwcmludGZfd2FybihtaWRpLCAibW9kRGF0YSgpIC8vIGVycm9yIHdyaXR0aW5nIHVuaXhkZXYgIVxuIik7CiAJfQogCXJldHVybiBNTVNZU0VSUl9OT1RFTkFCTEVEOwogI2Vsc2UKQEAgLTEyMDEsMTAgKzExOTgsMTAgQEAKIAlMUFdPUkQJcHRyOwogCWludCAgICAgZW47CiAKLQlkcHJpbnRmX21pZGkoc3RkZGViLAkKKwlkcHJpbnRmX2luZm8obWlkaSwJCiAJCSJtb2RMb25nRGF0YSglMDRYLCAlcCwgJTA4bFgpO1xuIiwgd0RldklELCBscE1pZGlIZHIsIGR3U2l6ZSk7CiAJaWYgKE1pZGlPdXREZXZbd0RldklEXS51bml4ZGV2ID09IDApIHsKLSAgICAgICAgZHByaW50Zl9taWRpKHN0ZGRlYiwiTGludXggJ21vZExvbmdEYXRhJyAvLyBjYW4ndCBwbGF5ICFcbiIpOworICAgICAgICBkcHJpbnRmX3dhcm4obWlkaSwiTGludXggJ21vZExvbmdEYXRhJyAvLyBjYW4ndCBwbGF5ICFcbiIpOwogCQlyZXR1cm4gTUlESUVSUl9OT0RFVklDRTsKIAkJfQogCWlmIChscE1pZGlIZHItPmxwRGF0YSA9PSBOVUxMKSByZXR1cm4gTUlESUVSUl9VTlBSRVBBUkVEOwpAQCAtMTIxMiw5ICsxMjA5LDkgQEAKIAlpZiAobHBNaWRpSGRyLT5kd0ZsYWdzICYgTUhEUl9JTlFVRVVFKSByZXR1cm4gTUlESUVSUl9TVElMTFBMQVlJTkc7CiAJbHBNaWRpSGRyLT5kd0ZsYWdzICY9IH5NSERSX0RPTkU7CiAJbHBNaWRpSGRyLT5kd0ZsYWdzIHw9IE1IRFJfSU5RVUVVRTsKLQlkcHJpbnRmX21pZGkoc3RkZGViLAorCWRwcmludGZfaW5mbyhtaWRpLAogCQkibW9kTG9uZ0RhdGEoKSAvLyBkd0J5dGVzUmVjb3JkZWQgJWx1ICFcbiIsIGxwTWlkaUhkci0+ZHdCeXRlc1JlY29yZGVkKTsKLQlkcHJpbnRmX21pZGkoc3RkZGViLAorCWRwcmludGZfaW5mbyhtaWRpLAogICAgICAgICAgICAgICAgICIgICAgICAgICAgICAgICAgICUwMlggJTAyWCAlMDJYICUwMlhcbiIsbHBNaWRpSGRyLT5scERhdGFbMF0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBscE1pZGlIZHItPmxwRGF0YVsxXSwKIAkJICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBscE1pZGlIZHItPmxwRGF0YVsyXSwKQEAgLTEyMzEsMTkgKzEyMjgsMTkgQEAKIAl9CiAKIAllbiA9IGVycm5vOwotCWRwcmludGZfbWlkaShzdGRkZWIsICJMaW51eCAnbW9kTG9uZ0RhdGEnIC8vIGFmdGVyIHdyaXRlIGNvdW50ID0gJWRcbiIsY291bnQpOworCWRwcmludGZfaW5mbyhtaWRpLCAiTGludXggJ21vZExvbmdEYXRhJyAvLyBhZnRlciB3cml0ZSBjb3VudCA9ICVkXG4iLGNvdW50KTsKIAlpZiAoY291bnQgIT0gbHBNaWRpSGRyLT5kd0J5dGVzUmVjb3JkZWQpIHsKLQkJZHByaW50Zl9taWRpKHN0ZGRlYiwKLQkJCSJtb2RMb25nRGF0YSgpIC8vIGVycm9yIHdyaXR0aW5nIHVuaXhkZXYgIyVkICEgKCVkICE9ICVsZClcbiIsCisJCWRwcmludGZfd2FybihtaWRpLAorCQkgICAgICAgIm1vZExvbmdEYXRhKCkgLy8gZXJyb3Igd3JpdHRpbmcgdW5peGRldiAjJWQgISAoJWQgIT0gJWxkKVxuIiwKIAkJCU1pZGlPdXREZXZbd0RldklEXS51bml4ZGV2LCBjb3VudCwgbHBNaWRpSGRyLT5kd0J5dGVzUmVjb3JkZWQpOwotCQlkcHJpbnRmX21pZGkoc3RkZGViLAotCQkJIiAgICAgICAgICAgICAgICAgZXJybm8gPSAlZCBlcnJvciA9ICVzXG4iLGVuLHN0cmVycm9yKGVuKSk7CisJCWRwcmludGZfaW5mbyhtaWRpLAorCQkJIlx0ZXJybm8gPSAlZCBlcnJvciA9ICVzXG4iLGVuLHN0cmVycm9yKGVuKSk7CiAJCXJldHVybiBNTVNZU0VSUl9OT1RFTkFCTEVEOwogCX0KIAlscE1pZGlIZHItPmR3RmxhZ3MgJj0gfk1IRFJfSU5RVUVVRTsKIAlscE1pZGlIZHItPmR3RmxhZ3MgfD0gTUhEUl9ET05FOwogCWlmIChNSURJX05vdGlmeUNsaWVudCh3RGV2SUQsIE1PTV9ET05FLCAwTCwgMEwpICE9IE1NU1lTRVJSX05PRVJST1IpIHsKLQkJZHByaW50Zl9taWRpKHN0ZGRlYiwiTGludXggJ21vZExvbmdEYXRhJyAvLyBjYW4ndCBub3RpZnkgY2xpZW50ICFcbiIpOworCQlkcHJpbnRmX3dhcm4obWlkaSwiTGludXggJ21vZExvbmdEYXRhJyAvLyBjYW4ndCBub3RpZnkgY2xpZW50ICFcbiIpOwogCQlyZXR1cm4gTU1TWVNFUlJfSU5WQUxQQVJBTTsKIAl9CiAJcmV0dXJuIE1NU1lTRVJSX05PRVJST1I7CkBAIC0xMjU4LDE0ICsxMjU1LDE0IEBACiBzdGF0aWMgRFdPUkQgbW9kUHJlcGFyZShXT1JEIHdEZXZJRCwgTFBNSURJSERSIGxwTWlkaUhkciwgRFdPUkQgZHdTaXplKQogewogI2lmIGRlZmluZWQobGludXgpIHx8IGRlZmluZWQoX19GcmVlQlNEX18pCi0JZHByaW50Zl9taWRpKHN0ZGRlYiwKKwlkcHJpbnRmX2luZm8obWlkaSwKIAkJICAibW9kUHJlcGFyZSglMDRYLCAlcCwgJTA4bFgpO1xuIiwgd0RldklELCBscE1pZGlIZHIsIGR3U2l6ZSk7CiAJaWYgKE1pZGlPdXREZXZbd0RldklEXS51bml4ZGV2ID09IDApIHsKLQkJZHByaW50Zl9taWRpKHN0ZGRlYiwiTGludXggJ21vZFByZXBhcmUnIC8vIGNhbid0IHByZXBhcmUgIVxuIik7CisJCWRwcmludGZfd2FybihtaWRpLCJMaW51eCAnbW9kUHJlcGFyZScgLy8gY2FuJ3QgcHJlcGFyZSAhXG4iKTsKIAkJcmV0dXJuIE1NU1lTRVJSX05PVEVOQUJMRUQ7CiAJfQogCWlmIChNaWRpT3V0RGV2W3dEZXZJRF0ubHBRdWV1ZUhkciAhPSBOVUxMKSB7Ci0JCWRwcmludGZfbWlkaShzdGRkZWIsIkxpbnV4ICdtb2RQcmVwYXJlJyAvLyBhbHJlYWR5IHByZXBhcmUgIVxuIik7CisJCWRwcmludGZfaW5mbyhtaWRpLCJMaW51eCAnbW9kUHJlcGFyZScgLy8gYWxyZWFkeSBwcmVwYXJlICFcbiIpOwogCQlyZXR1cm4gTU1TWVNFUlJfTk9URU5BQkxFRDsKIAl9CiAJTWlkaU91dERldlt3RGV2SURdLmR3VG90YWxQbGF5ZWQgPSAwOwpAQCAtMTI4NSwxMCArMTI4MiwxMCBAQAogc3RhdGljIERXT1JEIG1vZFVucHJlcGFyZShXT1JEIHdEZXZJRCwgTFBNSURJSERSIGxwTWlkaUhkciwgRFdPUkQgZHdTaXplKQogewogI2lmIGRlZmluZWQobGludXgpIHx8IGRlZmluZWQoX19GcmVlQlNEX18pCi0JZHByaW50Zl9taWRpKHN0ZGRlYiwKKwlkcHJpbnRmX2luZm8obWlkaSwKIAkJIm1vZFVucHJlcGFyZSglMDRYLCAlcCwgJTA4bFgpO1xuIiwgd0RldklELCBscE1pZGlIZHIsIGR3U2l6ZSk7CiAJaWYgKE1pZGlPdXREZXZbd0RldklEXS51bml4ZGV2ID09IDApIHsKLQkJZHByaW50Zl9taWRpKHN0ZGRlYiwiTGludXggJ21vZFVucHJlcGFyZScgLy8gY2FuJ3QgdW5wcmVwYXJlICFcbiIpOworCQlkcHJpbnRmX3dhcm4obWlkaSwiTGludXggJ21vZFVucHJlcGFyZScgLy8gY2FuJ3QgdW5wcmVwYXJlICFcbiIpOwogCQlyZXR1cm4gTU1TWVNFUlJfTk9URU5BQkxFRDsKIAl9CiAJcmV0dXJuIE1NU1lTRVJSX05PRVJST1I7CkBAIC0xMzAyLDcgKzEyOTksNyBAQAogICovCiBzdGF0aWMgRFdPUkQgbW9kUmVzZXQoV09SRCB3RGV2SUQpCiB7Ci0JZHByaW50Zl9taWRpKHN0ZGRlYiwgIm1vZFJlc2V0KCUwNFgpO1xuIiwgd0RldklEKTsKKwlkcHJpbnRmX2luZm8obWlkaSwgIm1vZFJlc2V0KCUwNFgpO1xuIiwgd0RldklEKTsKIAlyZXR1cm4gTU1TWVNFUlJfTk9URU5BQkxFRDsKIH0KIApAQCAtMTMxMyw3ICsxMzEwLDcgQEAKIERXT1JEIG1vZE1lc3NhZ2UoV09SRCB3RGV2SUQsIFdPUkQgd01zZywgRFdPUkQgZHdVc2VyLCAKIAkJCQkJRFdPUkQgZHdQYXJhbTEsIERXT1JEIGR3UGFyYW0yKQogewotCWRwcmludGZfbWlkaShzdGRkZWIsICJtb2RNZXNzYWdlKCUwNFgsICUwNFgsICUwOGxYLCAlMDhsWCwgJTA4bFgpO1xuIiwgCisJZHByaW50Zl9pbmZvKG1pZGksICJtb2RNZXNzYWdlKCUwNFgsICUwNFgsICUwOGxYLCAlMDhsWCwgJTA4bFgpO1xuIiwgCiAJCQl3RGV2SUQsIHdNc2csIGR3VXNlciwgZHdQYXJhbTEsIGR3UGFyYW0yKTsKIAlzd2l0Y2god01zZykgewogCWNhc2UgTU9ETV9PUEVOOgpkaWZmIC0tZ2l0IGEvbXVsdGltZWRpYS9taXhlci5jIGIvbXVsdGltZWRpYS9taXhlci5jCmluZGV4IDg5ZjkzOTQuLjliY2IyNGQgMTAwNjQ0Ci0tLSBhL211bHRpbWVkaWEvbWl4ZXIuYworKysgYi9tdWx0aW1lZGlhL21peGVyLmMKQEAgLTEzLDYgKzEzLDcgQEAKICNpbmNsdWRlICJ1c2VyLmgiCiAjaW5jbHVkZSAiZHJpdmVyLmgiCiAjaW5jbHVkZSAibW1zeXN0ZW0uaCIKKyNpbmNsdWRlICJkZWJ1Zy5oIgogCiAjaWZkZWYgbGludXgKICNpbmNsdWRlIDxsaW51eC9zb3VuZGNhcmQuaD4KQEAgLTIwLDkgKzIxLDYgQEAKICNpbmNsdWRlIDxtYWNoaW5lL3NvdW5kY2FyZC5oPgogI2VuZGlmCiAKLSNpbmNsdWRlICJzdGRkZWJ1Zy5oIgotI2luY2x1ZGUgImRlYnVnLmgiCi0KICNkZWZpbmUgTUlYRVJfREVWICIvZGV2L21peGVyIgogCiAjaWZkZWYgU09VTkRfVkVSU0lPTgpAQCAtNDAsMTAgKzM4LDEwIEBACiAjaWZkZWYgbGludXgKIAlpbnQgCQltaXhlcixtYXNrOwogCi0JZHByaW50Zl9tbWF1eChzdGRkZWIsIk1JWF9HZXREZXZDYXBzKCUwNFgsICVwLCAlbHUpO1xuIiwgd0RldklELCBscENhcHMsIGR3U2l6ZSk7CisJZHByaW50Zl9pbmZvKG1tYXV4LCJNSVhfR2V0RGV2Q2FwcyglMDRYLCAlcCwgJWx1KTtcbiIsIHdEZXZJRCwgbHBDYXBzLCBkd1NpemUpOwogCWlmIChscENhcHMgPT0gTlVMTCkgcmV0dXJuIE1NU1lTRVJSX05PVEVOQUJMRUQ7CiAJaWYgKChtaXhlciA9IG9wZW4oTUlYRVJfREVWLCBPX1JEV1IpKSA8IDApIHsKLQkJZHByaW50Zl9tbWF1eChzdGRkZWIsIk1JWF9HZXREZXZDYXBzIC8vIG1peGVyIGRldmljZSBub3QgYXZhaWxhYmxlICFcbiIpOworCQlkcHJpbnRmX3dhcm4obW1hdXgsICJNSVhfR2V0RGV2Q2FwcyAvLyBtaXhlciBkZXZpY2Ugbm90IGF2YWlsYWJsZSAhXG4iKTsKIAkJcmV0dXJuIE1NU1lTRVJSX05PVEVOQUJMRUQ7CiAJfQogCWxwQ2Fwcy0+d01pZCA9IDB4QUE7CkBAIC03OSw3ICs3Nyw3IEBACiAjaWZkZWYgbGludXgKIAlpbnQgCQltaXhlcixpLGosZGV2bWFzayxyZWNzcmMscmVjbWFzazsKIAotCWRwcmludGZfbW1hdXgoc3RkZGViLCJNSVhfR2V0RGV2TGluZUluZm8oJTA0WCwgJXAsICVsdSk7XG4iLCB3RGV2SUQsIGxwbWwsIGZkd0luZm8pOworCWRwcmludGZfaW5mbyhtbWF1eCwiTUlYX0dldERldkxpbmVJbmZvKCUwNFgsICVwLCAlbHUpO1xuIiwgd0RldklELCBscG1sLCBmZHdJbmZvKTsKIAlpZiAobHBtbCA9PSBOVUxMKSByZXR1cm4gTU1TWVNFUlJfTk9URU5BQkxFRDsKIAlpZiAoKG1peGVyID0gb3BlbihNSVhFUl9ERVYsIE9fUkRXUikpIDwgMCkKIAkJcmV0dXJuIE1NU1lTRVJSX05PVEVOQUJMRUQ7CkBAIC0xODAsNyArMTc4LDcgQEAKIHsKICNpZmRlZiBsaW51eAogCi0JZHByaW50Zl9tbWF1eChzdGRkZWIsIk1JWF9PcGVuKCUwNFgsICVwLCAlbHUpO1xuIix3RGV2SUQsbHBtb2QsZmxhZ3MpOworCWRwcmludGZfaW5mbyhtbWF1eCwiTUlYX09wZW4oJTA0WCwgJXAsICVsdSk7XG4iLHdEZXZJRCxscG1vZCxmbGFncyk7CiAJaWYgKGxwbW9kID09IE5VTEwpIHJldHVybiBNTVNZU0VSUl9OT1RFTkFCTEVEOwogCS8qIGhtbS4gV2UgZG9uJ3Qga2VlcCB0aGUgbWl4ZXIgZGV2aWNlIG9wZW4uIFNvIGp1c3QgcHJldGVuZCBpdCB3b3JrcyAqLwogCXJldHVybiBNTVNZU0VSUl9OT0VSUk9SOwpAQCAtMTk1LDcgKzE5Myw3IEBACiBEV09SRCBtaXhNZXNzYWdlKFdPUkQgd0RldklELCBXT1JEIHdNc2csIERXT1JEIGR3VXNlciwgCiAJCQkJCURXT1JEIGR3UGFyYW0xLCBEV09SRCBkd1BhcmFtMikKIHsKLQlkcHJpbnRmX21tYXV4KHN0ZGRlYiwibWl4TWVzc2FnZSglMDRYLCAlMDRYLCAlMDhsWCwgJTA4bFgsICUwOGxYKTtcbiIsIAorCWRwcmludGZfaW5mbyhtbWF1eCwibWl4TWVzc2FnZSglMDRYLCAlMDRYLCAlMDhsWCwgJTA4bFgsICUwOGxYKTtcbiIsIAogCQkJd0RldklELCB3TXNnLCBkd1VzZXIsIGR3UGFyYW0xLCBkd1BhcmFtMik7CiAJc3dpdGNoKHdNc2cpIHsKIAljYXNlIE1YRE1fR0VUREVWQ0FQUzoKQEAgLTIwMywxMiArMjAxLDEyIEBACiAJY2FzZSBNWERNX0dFVExJTkVJTkZPOgogCQlyZXR1cm4gTUlYX0dldExpbmVJbmZvKHdEZXZJRCwoTFBNSVhFUkxJTkUxNilkd1BhcmFtMSxkd1BhcmFtMik7CiAJY2FzZSBNWERNX0dFVE5VTURFVlM6Ci0JCWRwcmludGZfbW1zeXMoc3RkZGViLCJNSVhfR2V0TnVtRGV2cygpIHJldHVybiAxO1xuIik7CisJCWRwcmludGZfaW5mbyhtbXN5cywiTUlYX0dldE51bURldnMoKSByZXR1cm4gMTtcbiIpOwogCQlyZXR1cm4gMTsKIAljYXNlIE1YRE1fT1BFTjoKIAkJcmV0dXJuIE1JWF9PcGVuKHdEZXZJRCwoTFBNSVhFUk9QRU5ERVNDKWR3UGFyYW0xLGR3UGFyYW0yKTsKIAlkZWZhdWx0OgotCQlkcHJpbnRmX21tYXV4KHN0ZGRlYiwibWl4TWVzc2FnZSAvLyB1bmtub3duIG1lc3NhZ2UgJWQhXG4iLHdNc2cpOworCQlkcHJpbnRmX3dhcm4obW1hdXgsIm1peE1lc3NhZ2UgLy8gdW5rbm93biBtZXNzYWdlICVkIVxuIix3TXNnKTsKIAl9CiAJcmV0dXJuIE1NU1lTRVJSX05PVFNVUFBPUlRFRDsKIH0KZGlmZiAtLWdpdCBhL211bHRpbWVkaWEvbW1hdXguYyBiL211bHRpbWVkaWEvbW1hdXguYwppbmRleCBkZTM0YzRmLi4xNDU5OGI5IDEwMDY0NAotLS0gYS9tdWx0aW1lZGlhL21tYXV4LmMKKysrIGIvbXVsdGltZWRpYS9tbWF1eC5jCkBAIC0xNSw2ICsxNSw3IEBACiAjaW5jbHVkZSAidXNlci5oIgogI2luY2x1ZGUgImRyaXZlci5oIgogI2luY2x1ZGUgIm1tc3lzdGVtLmgiCisjaW5jbHVkZSAiZGVidWcuaCIKIAogI2lmZGVmIGxpbnV4CiAjaW5jbHVkZSA8bGludXgvc291bmRjYXJkLmg+CkBAIC0yMiw5ICsyMyw2IEBACiAjaW5jbHVkZSA8bWFjaGluZS9zb3VuZGNhcmQuaD4KICNlbmRpZgogCi0jaW5jbHVkZSAic3RkZGVidWcuaCIKLSNpbmNsdWRlICJkZWJ1Zy5oIgotCiAjZGVmaW5lIFNPVU5EX0RFViAiL2Rldi9kc3AiCiAjZGVmaW5lIE1JWEVSX0RFViAiL2Rldi9taXhlciIKIApAQCAtNDgsMTUgKzQ2LDE1IEBACiAjaWZkZWYgbGludXgKIAlpbnQgCW1peGVyLHZvbHVtZTsKIAotCWRwcmludGZfbW1hdXgoc3RkZGViLCJBVVhfR2V0RGV2Q2FwcyglMDRYLCAlcCwgJWx1KTtcbiIsIHdEZXZJRCwgbHBDYXBzLCBkd1NpemUpOworCWRwcmludGZfaW5mbyhtbWF1eCwiQVVYX0dldERldkNhcHMoJTA0WCwgJXAsICVsdSk7XG4iLCB3RGV2SUQsIGxwQ2FwcywgZHdTaXplKTsKIAlpZiAobHBDYXBzID09IE5VTEwpIHJldHVybiBNTVNZU0VSUl9OT1RFTkFCTEVEOwogCWlmICgobWl4ZXIgPSBvcGVuKE1JWEVSX0RFViwgT19SRFdSKSkgPCAwKSB7Ci0JCWRwcmludGZfbW1hdXgoc3RkZGViLCJBVVhfR2V0RGV2Q2FwcyAvLyBtaXhlciBkZXZpY2Ugbm90IGF2YWlsYWJsZSAhXG4iKTsKKwkJZHByaW50Zl93YXJuKG1tYXV4LCAiQVVYX0dldERldkNhcHMgLy8gbWl4ZXIgZGV2aWNlIG5vdCBhdmFpbGFibGUgIVxuIik7CiAJCXJldHVybiBNTVNZU0VSUl9OT1RFTkFCTEVEOwogCX0KIAlpZiAoaW9jdGwobWl4ZXIsIFNPVU5EX01JWEVSX1JFQURfTElORSwgJnZvbHVtZSkgPT0gLTEpIHsKIAkJY2xvc2UobWl4ZXIpOwotCQlkcHJpbnRmX21tYXV4KHN0ZGRlYiwiQVVYX0dldERldkNhcHMgLy8gdW5hYmxlIHJlYWQgbWl4ZXIgIVxuIik7CisJCWRwcmludGZfd2FybihtbWF1eCwgIkFVWF9HZXREZXZDYXBzIC8vIHVuYWJsZSByZWFkIG1peGVyICFcbiIpOwogCQlyZXR1cm4gTU1TWVNFUlJfTk9URU5BQkxFRDsKIAl9CiAJY2xvc2UobWl4ZXIpOwpAQCAtMTE5LDQ5ICsxMTcsNDkgQEAKICNpZmRlZiBsaW51eAogCWludCAJbWl4ZXIsdm9sdW1lLGxlZnQscmlnaHQsY21kOwogCi0JZHByaW50Zl9tbWF1eChzdGRkZWIsIkFVWF9HZXRWb2x1bWUoJTA0WCwgJXApO1xuIiwgd0RldklELCBscGR3Vm9sKTsKKwlkcHJpbnRmX2luZm8obW1hdXgsIkFVWF9HZXRWb2x1bWUoJTA0WCwgJXApO1xuIiwgd0RldklELCBscGR3Vm9sKTsKIAlpZiAobHBkd1ZvbCA9PSBOVUxMKSByZXR1cm4gTU1TWVNFUlJfTk9URU5BQkxFRDsKIAlpZiAoKG1peGVyID0gb3BlbihNSVhFUl9ERVYsIE9fUkRXUikpIDwgMCkgewotCQlkcHJpbnRmX21tYXV4KHN0ZGRlYiwiTGludXggJ0FVWF9HZXRWb2x1bWUnIC8vIG1peGVyIGRldmljZSBub3QgYXZhaWxhYmxlICFcbiIpOworCQlkcHJpbnRmX3dhcm4obW1hdXgsICJMaW51eCAnQVVYX0dldFZvbHVtZScgLy8gbWl4ZXIgZGV2aWNlIG5vdCBhdmFpbGFibGUgIVxuIik7CiAJCXJldHVybiBNTVNZU0VSUl9OT1RFTkFCTEVEOwogCX0KIAlzd2l0Y2god0RldklEKSB7CiAJCWNhc2UgMDoKLQkJCWRwcmludGZfbW1hdXgoc3RkZGViLCJMaW51eCAnQVVYX0dldFZvbHVtZScgLy8gU09VTkRfTUlYRVJfUkVBRF9QQ00gIVxuIik7CisJCQlkcHJpbnRmX2luZm8obW1hdXgsIkxpbnV4ICdBVVhfR2V0Vm9sdW1lJyAvLyBTT1VORF9NSVhFUl9SRUFEX1BDTSAhXG4iKTsKIAkJCWNtZCA9IFNPVU5EX01JWEVSX1JFQURfUENNOwogCQkJYnJlYWs7CiAJCWNhc2UgMToKLQkJCWRwcmludGZfbW1hdXgoc3RkZGViLCJMaW51eCAnQVVYX0dldFZvbHVtZScgLy8gU09VTkRfTUlYRVJfUkVBRF9TWU5USCAhXG4iKTsKKwkJCWRwcmludGZfaW5mbyhtbWF1eCwiTGludXggJ0FVWF9HZXRWb2x1bWUnIC8vIFNPVU5EX01JWEVSX1JFQURfU1lOVEggIVxuIik7CiAJCQljbWQgPSBTT1VORF9NSVhFUl9SRUFEX1NZTlRIOwogCQkJYnJlYWs7CiAJCWNhc2UgMjoKLQkJCWRwcmludGZfbW1hdXgoc3RkZGViLCJMaW51eCAnQVVYX0dldFZvbHVtZScgLy8gU09VTkRfTUlYRVJfUkVBRF9DRCAhXG4iKTsKKwkJCWRwcmludGZfaW5mbyhtbWF1eCwiTGludXggJ0FVWF9HZXRWb2x1bWUnIC8vIFNPVU5EX01JWEVSX1JFQURfQ0QgIVxuIik7CiAJCQljbWQgPSBTT1VORF9NSVhFUl9SRUFEX0NEOwogCQkJYnJlYWs7CiAJCWNhc2UgMzoKLQkJCWRwcmludGZfbW1hdXgoc3RkZGViLCJMaW51eCAnQVVYX0dldFZvbHVtZScgLy8gU09VTkRfTUlYRVJfUkVBRF9MSU5FICFcbiIpOworCQkJZHByaW50Zl9pbmZvKG1tYXV4LCJMaW51eCAnQVVYX0dldFZvbHVtZScgLy8gU09VTkRfTUlYRVJfUkVBRF9MSU5FICFcbiIpOwogCQkJY21kID0gU09VTkRfTUlYRVJfUkVBRF9MSU5FOwogCQkJYnJlYWs7CiAJCWNhc2UgNDoKLQkJCWRwcmludGZfbW1hdXgoc3RkZGViLCJMaW51eCAnQVVYX0dldFZvbHVtZScgLy8gU09VTkRfTUlYRVJfUkVBRF9NSUMgIVxuIik7CisJCQlkcHJpbnRmX2luZm8obW1hdXgsIkxpbnV4ICdBVVhfR2V0Vm9sdW1lJyAvLyBTT1VORF9NSVhFUl9SRUFEX01JQyAhXG4iKTsKIAkJCWNtZCA9IFNPVU5EX01JWEVSX1JFQURfTUlDOwogCQkJYnJlYWs7CiAJCWNhc2UgNToKLQkJCWRwcmludGZfbW1hdXgoc3RkZGViLCJMaW51eCAnQVVYX0dldFZvbHVtZScgLy8gU09VTkRfTUlYRVJfUkVBRF9WT0xVTUUgIVxuIik7CisJCQlkcHJpbnRmX2luZm8obW1hdXgsIkxpbnV4ICdBVVhfR2V0Vm9sdW1lJyAvLyBTT1VORF9NSVhFUl9SRUFEX1ZPTFVNRSAhXG4iKTsKIAkJCWNtZCA9IFNPVU5EX01JWEVSX1JFQURfVk9MVU1FOwogCQkJYnJlYWs7CiAJCWRlZmF1bHQ6Ci0JCQlkcHJpbnRmX21tYXV4KHN0ZGRlYiwgIkxpbnV4ICdBVVhfR2V0Vm9sdW1lJyAvLyBpbnZhbGlkIGRldmljZSBpZD0lMDRYICFcbiIsIHdEZXZJRCk7CisJCQlkcHJpbnRmX3dhcm4obW1hdXgsICJMaW51eCAnQVVYX0dldFZvbHVtZScgLy8gaW52YWxpZCBkZXZpY2UgaWQ9JTA0WCAhXG4iLCB3RGV2SUQpOwogCQkJcmV0dXJuIE1NU1lTRVJSX05PVEVOQUJMRUQ7CiAJCX0KIAlpZiAoaW9jdGwobWl4ZXIsIGNtZCwgJnZvbHVtZSkgPT0gLTEpIHsKLQkJZHByaW50Zl9tbWF1eChzdGRkZWIsIkxpbnV4ICdBVVhfR2V0Vm9sdW1lJyAvLyB1bmFibGUgcmVhZCBtaXhlciAhXG4iKTsKKwkJZHByaW50Zl93YXJuKG1tYXV4LCAiTGludXggJ0FVWF9HZXRWb2x1bWUnIC8vIHVuYWJsZSByZWFkIG1peGVyICFcbiIpOwogCQlyZXR1cm4gTU1TWVNFUlJfTk9URU5BQkxFRDsKIAl9CiAJY2xvc2UobWl4ZXIpOwogCWxlZnQgPSB2b2x1bWUgJiAweDdGOwogCXJpZ2h0ID0gKHZvbHVtZSA+PiA4KSAmIDB4N0Y7Ci0JZHByaW50Zl9tbWF1eChzdGRkZWIsIkxpbnV4ICdBVVhfR2V0Vm9sdW1lJyAvLyBsZWZ0PSVkIHJpZ2h0PSVkICFcbiIsIGxlZnQsIHJpZ2h0KTsKKwlkcHJpbnRmX2luZm8obW1hdXgsIkxpbnV4ICdBVVhfR2V0Vm9sdW1lJyAvLyBsZWZ0PSVkIHJpZ2h0PSVkICFcbiIsIGxlZnQsIHJpZ2h0KTsKIAkqbHBkd1ZvbCA9IE1BS0VMT05HKGxlZnQgPDwgOSwgcmlnaHQgPDwgOSk7CiAJcmV0dXJuIE1NU1lTRVJSX05PRVJST1I7CiAjZWxzZQpAQCAtMTc4LDQ0ICsxNzYsNDQgQEAKIAlpbnQgCW1peGVyOwogCWludAkJdm9sdW1lOwogCWludAkJY21kOwotCWRwcmludGZfbW1hdXgoc3RkZGViLCJBVVhfU2V0Vm9sdW1lKCUwNFgsICUwOGxYKTtcbiIsIHdEZXZJRCwgZHdQYXJhbSk7CisJZHByaW50Zl9pbmZvKG1tYXV4LCJBVVhfU2V0Vm9sdW1lKCUwNFgsICUwOGxYKTtcbiIsIHdEZXZJRCwgZHdQYXJhbSk7CiAJdm9sdW1lID0gKExPV09SRChkd1BhcmFtKSA+PiA5ICYgMHg3RikgKyAKIAkJKChISVdPUkQoZHdQYXJhbSkgPj4gOSAgJiAweDdGKSA8PCA4KTsKIAlpZiAoKG1peGVyID0gb3BlbihNSVhFUl9ERVYsIE9fUkRXUikpIDwgMCkgewotCQlkcHJpbnRmX21tYXV4KHN0ZGRlYiwiTGludXggJ0FVWF9TZXRWb2x1bWUnIC8vIG1peGVyIGRldmljZSBub3QgYXZhaWxhYmxlICFcbiIpOworCQlkcHJpbnRmX3dhcm4obW1hdXgsICJMaW51eCAnQVVYX1NldFZvbHVtZScgLy8gbWl4ZXIgZGV2aWNlIG5vdCBhdmFpbGFibGUgIVxuIik7CiAJCXJldHVybiBNTVNZU0VSUl9OT1RFTkFCTEVEOwogCQl9CiAJc3dpdGNoKHdEZXZJRCkgewogCQljYXNlIDA6Ci0JCQlkcHJpbnRmX21tYXV4KHN0ZGRlYiwiTGludXggJ0FVWF9TZXRWb2x1bWUnIC8vIFNPVU5EX01JWEVSX1dSSVRFX1BDTSAhXG4iKTsKKwkJCWRwcmludGZfaW5mbyhtbWF1eCwiTGludXggJ0FVWF9TZXRWb2x1bWUnIC8vIFNPVU5EX01JWEVSX1dSSVRFX1BDTSAhXG4iKTsKIAkJCWNtZCA9IFNPVU5EX01JWEVSX1dSSVRFX1BDTTsKIAkJCWJyZWFrOwogCQljYXNlIDE6Ci0JCQlkcHJpbnRmX21tYXV4KHN0ZGRlYiwiTGludXggJ0FVWF9TZXRWb2x1bWUnIC8vIFNPVU5EX01JWEVSX1dSSVRFX1NZTlRIICFcbiIpOworCQkJZHByaW50Zl9pbmZvKG1tYXV4LCJMaW51eCAnQVVYX1NldFZvbHVtZScgLy8gU09VTkRfTUlYRVJfV1JJVEVfU1lOVEggIVxuIik7CiAJCQljbWQgPSBTT1VORF9NSVhFUl9XUklURV9TWU5USDsKIAkJCWJyZWFrOwogCQljYXNlIDI6Ci0JCQlkcHJpbnRmX21tYXV4KHN0ZGRlYiwiTGludXggJ0FVWF9TZXRWb2x1bWUnIC8vIFNPVU5EX01JWEVSX1dSSVRFX0NEICFcbiIpOworCQkJZHByaW50Zl9pbmZvKG1tYXV4LCJMaW51eCAnQVVYX1NldFZvbHVtZScgLy8gU09VTkRfTUlYRVJfV1JJVEVfQ0QgIVxuIik7CiAJCQljbWQgPSBTT1VORF9NSVhFUl9XUklURV9DRDsKIAkJCWJyZWFrOwogCQljYXNlIDM6Ci0JCQlkcHJpbnRmX21tYXV4KHN0ZGRlYiwiTGludXggJ0FVWF9TZXRWb2x1bWUnIC8vIFNPVU5EX01JWEVSX1dSSVRFX0xJTkUgIVxuIik7CisJCQlkcHJpbnRmX2luZm8obW1hdXgsIkxpbnV4ICdBVVhfU2V0Vm9sdW1lJyAvLyBTT1VORF9NSVhFUl9XUklURV9MSU5FICFcbiIpOwogCQkJY21kID0gU09VTkRfTUlYRVJfV1JJVEVfTElORTsKIAkJCWJyZWFrOwogCQljYXNlIDQ6Ci0JCQlkcHJpbnRmX21tYXV4KHN0ZGRlYiwiTGludXggJ0FVWF9TZXRWb2x1bWUnIC8vIFNPVU5EX01JWEVSX1dSSVRFX01JQyAhXG4iKTsKKwkJCWRwcmludGZfaW5mbyhtbWF1eCwiTGludXggJ0FVWF9TZXRWb2x1bWUnIC8vIFNPVU5EX01JWEVSX1dSSVRFX01JQyAhXG4iKTsKIAkJCWNtZCA9IFNPVU5EX01JWEVSX1dSSVRFX01JQzsKIAkJCWJyZWFrOwogCQljYXNlIDU6Ci0JCQlkcHJpbnRmX21tYXV4KHN0ZGRlYiwiTGludXggJ0FVWF9TZXRWb2x1bWUnIC8vIFNPVU5EX01JWEVSX1dSSVRFX1ZPTFVNRSAhXG4iKTsKKwkJCWRwcmludGZfaW5mbyhtbWF1eCwiTGludXggJ0FVWF9TZXRWb2x1bWUnIC8vIFNPVU5EX01JWEVSX1dSSVRFX1ZPTFVNRSAhXG4iKTsKIAkJCWNtZCA9IFNPVU5EX01JWEVSX1dSSVRFX1ZPTFVNRTsKIAkJCWJyZWFrOwogCQlkZWZhdWx0OgotCQkJZHByaW50Zl9tbWF1eChzdGRkZWIsICJMaW51eCAnQVVYX1NldFZvbHVtZScgLy8gaW52YWxpZCBkZXZpY2UgaWQ9JTA0WCAhXG4iLCB3RGV2SUQpOworCQkJZHByaW50Zl93YXJuKG1tYXV4LCAiTGludXggJ0FVWF9TZXRWb2x1bWUnIC8vIGludmFsaWQgZGV2aWNlIGlkPSUwNFggIVxuIiwgd0RldklEKTsKIAkJCXJldHVybiBNTVNZU0VSUl9OT1RFTkFCTEVEOwogCQl9CiAgICAgaWYgKGlvY3RsKG1peGVyLCBjbWQsICZ2b2x1bWUpID09IC0xKSB7Ci0JCWRwcmludGZfbW1hdXgoc3RkZGViLCJMaW51eCAnQVVYX1NldFZvbHVtZScgLy8gdW5hYmxlIHNldCBtaXhlciAhXG4iKTsKKwkJZHByaW50Zl93YXJuKG1tYXV4LCAiTGludXggJ0FVWF9TZXRWb2x1bWUnIC8vIHVuYWJsZSBzZXQgbWl4ZXIgIVxuIik7CiAJCXJldHVybiBNTVNZU0VSUl9OT1RFTkFCTEVEOwogCQl9CiAJY2xvc2UobWl4ZXIpOwpAQCAtMjMyLDIwICsyMzAsMjAgQEAKIERXT1JEIGF1eE1lc3NhZ2UoV09SRCB3RGV2SUQsIFdPUkQgd01zZywgRFdPUkQgZHdVc2VyLCAKIAkJCQkJRFdPUkQgZHdQYXJhbTEsIERXT1JEIGR3UGFyYW0yKQogewotCWRwcmludGZfbW1hdXgoc3RkZGViLCJhdXhNZXNzYWdlKCUwNFgsICUwNFgsICUwOGxYLCAlMDhsWCwgJTA4bFgpO1xuIiwgCisJZHByaW50Zl9pbmZvKG1tYXV4LCJhdXhNZXNzYWdlKCUwNFgsICUwNFgsICUwOGxYLCAlMDhsWCwgJTA4bFgpO1xuIiwgCiAJCQl3RGV2SUQsIHdNc2csIGR3VXNlciwgZHdQYXJhbTEsIGR3UGFyYW0yKTsKIAlzd2l0Y2god01zZykgewogCWNhc2UgQVVYRE1fR0VUREVWQ0FQUzoKIAkJcmV0dXJuIEFVWF9HZXREZXZDYXBzKHdEZXZJRCwoTFBBVVhDQVBTMTYpZHdQYXJhbTEsZHdQYXJhbTIpOwogCWNhc2UgQVVYRE1fR0VUTlVNREVWUzoKLQkJZHByaW50Zl9tbWF1eChzdGRkZWIsIkFVWF9HZXROdW1EZXZzKCkgcmV0dXJuICVkO1xuIiwgTnVtRGV2KTsKKwkJZHByaW50Zl9pbmZvKG1tYXV4LCJBVVhfR2V0TnVtRGV2cygpIHJldHVybiAlZDtcbiIsIE51bURldik7CiAJCXJldHVybiBOdW1EZXY7CiAJY2FzZSBBVVhETV9HRVRWT0xVTUU6CiAJCXJldHVybiBBVVhfR2V0Vm9sdW1lKHdEZXZJRCwoTFBEV09SRClkd1BhcmFtMSk7CiAJY2FzZSBBVVhETV9TRVRWT0xVTUU6CiAJCXJldHVybiBBVVhfU2V0Vm9sdW1lKHdEZXZJRCxkd1BhcmFtMSk7CiAJZGVmYXVsdDoKLQkJZHByaW50Zl9tbWF1eChzdGRkZWIsImF1eE1lc3NhZ2UgLy8gdW5rbm93biBtZXNzYWdlICFcbiIpOworCQlkcHJpbnRmX3dhcm4obW1hdXgsICJhdXhNZXNzYWdlIC8vIHVua25vd24gbWVzc2FnZSAhXG4iKTsKIAl9CiAJcmV0dXJuIE1NU1lTRVJSX05PVFNVUFBPUlRFRDsKIH0KZGlmZiAtLWdpdCBhL211bHRpbWVkaWEvbW1pby5jIGIvbXVsdGltZWRpYS9tbWlvLmMKaW5kZXggZDE0MGZlMS4uNTk3MzUwYSAxMDA2NDQKLS0tIGEvbXVsdGltZWRpYS9tbWlvLmMKKysrIGIvbXVsdGltZWRpYS9tbWlvLmMKQEAgLTE5LDcgKzE5LDYgQEAKICNpbmNsdWRlICJ1c2VyLmgiCiAjaW5jbHVkZSAiZmlsZS5oIgogI2luY2x1ZGUgIm1tc3lzdGVtLmgiCi0jaW5jbHVkZSAic3RkZGVidWcuaCIKICNpbmNsdWRlICJkZWJ1Zy5oIgogI2luY2x1ZGUgInhtYWxsb2MuaCIKIApAQCAtMjcsNyArMjYsNyBAQAogKiAgICAgICAgICAgICAgIG1taW9Eb3NJT1Byb2MgICAgICAgICAgIFtpbnRlcm5hbF0KICovCiBzdGF0aWMgTFJFU1VMVCBtbWlvRG9zSU9Qcm9jKExQTU1JT0lORk8xNiBscG1taW9pbmZvLCBVSU5UMTYgdU1lc3NhZ2UsIExQQVJBTSBsUGFyYW0xLCBMUEFSQU0gbFBhcmFtMikgewotCWRwcmludGZfbW1pbyhzdGRkZWIsICJtbWlvRG9zSU9Qcm9jKCVwLCAlWCwgJWxkLCAlbGQpO1xuIiwgbHBtbWlvaW5mbywgdU1lc3NhZ2UsIGxQYXJhbTEsIGxQYXJhbTIpOworCWRwcmludGZfaW5mbyhtbWlvLCAibW1pb0Rvc0lPUHJvYyglcCwgJVgsICVsZCwgJWxkKTtcbiIsIGxwbW1pb2luZm8sIHVNZXNzYWdlLCBsUGFyYW0xLCBsUGFyYW0yKTsKIAogCXN3aXRjaCAodU1lc3NhZ2UpIHsKIApAQCAtNDMsNyArNDIsNyBAQAogCQkJTFBTVFIgc3pGaWxlTmFtZSA9IChMUFNUUikgbFBhcmFtMTsKIAogCQkJaWYgKGxwbW1pb2luZm8tPmR3RmxhZ3MgJiBNTUlPX0dFVFRFTVApIHsKLQkJCQlkcHJpbnRmX21taW8oc3RkbmltcCwgIm1taW9Eb3NJT1Byb2MgLy8gTU1JT19HRVRURU1QIG5vdCBpbXBsZW1lbnRlZFxuIik7CisJCQkJZHByaW50Zl9maXhtZShtbWlvLCAibW1pb0Rvc0lPUHJvYyAvLyBNTUlPX0dFVFRFTVAgbm90IGltcGxlbWVudGVkXG4iKTsKIAkJCQlyZXR1cm4gTU1JT0VSUl9DQU5OT1RPUEVOOwogCQkJfQogCkBAIC0xNDUsMTIgKzE0NCwxMiBAQAogICAgICAgICAgICAgICogUmV0dXJuczogemVybyBvbiBzdWNjZXNzLCBub24temVybyBvbiBmYWlsdXJlCiAgICAgICAgICAgICAgKi8KIAotICAgICAgICAgICAgZHByaW50Zl9tbWlvKHN0ZGRlYiwgIm1taW9Eb3NJT1Byb2M6IE1NSU9NX1JFTkFNRSB1bmltcGxlbWVudGVkXG4iKTsKKyAgICAgICAgICAgIGRwcmludGZfZml4bWUobW1pbywgIm1taW9Eb3NJT1Byb2M6IE1NSU9NX1JFTkFNRSB1bmltcGxlbWVudGVkXG4iKTsKICAgICAgICAgICAgIHJldHVybiBNTUlPRVJSX0ZJTEVOT1RGT1VORDsKIAkJfQogCiAJCWRlZmF1bHQ6Ci0JCQlkcHJpbnRmX21taW8oc3RkZGViLCAibW1pb0Rvc0lPUHJvYzogdW5leHBlY3RlZCBtZXNzYWdlICV1XG4iLCB1TWVzc2FnZSk7CisJCQlkcHJpbnRmX3dhcm4obW1pbywgIm1taW9Eb3NJT1Byb2M6IHVuZXhwZWN0ZWQgbWVzc2FnZSAldVxuIiwgdU1lc3NhZ2UpOwogCQkJcmV0dXJuIDA7CiAJfQogCQpAQCAtMTk2LDcgKzE5NSw3IEBACiAJSE1NSU8xNiBobW1pbzsKIAlVSU5UMTYgcmVzdWx0OwogCi0JZHByaW50Zl9tbWlvKHN0ZGRlYiwgIm1taW9PcGVuKCclcycsICVwLCAlMDhsWCk7XG4iLCBzekZpbGVOYW1lLCBscG1taW9pbmZvLCBkd09wZW5GbGFncyk7CisJZHByaW50Zl9pbmZvKG1taW8sICJtbWlvT3BlbignJXMnLCAlcCwgJTA4bFgpO1xuIiwgc3pGaWxlTmFtZSwgbHBtbWlvaW5mbywgZHdPcGVuRmxhZ3MpOwogCiAJaG1taW8gPSBHbG9iYWxBbGxvYzE2KEdITkQsIHNpemVvZihNTUlPSU5GTzE2KSk7CiAJbHBtbWluZm8gPSAoTFBNTUlPSU5GTzE2KUdsb2JhbExvY2sxNihobW1pbyk7CkBAIC0yNTcsNyArMjU2LDcgQEAKIAlMUE1NSU9JTkZPMTYgbHBtbWluZm87CiAJVUlOVDE2IHJlc3VsdDsKIAotCWRwcmludGZfbW1pbyhzdGRkZWIsICJtbWlvQ2xvc2UoJTA0WCwgJTA0WCk7XG4iLCBobW1pbywgdUZsYWdzKTsKKwlkcHJpbnRmX2luZm8obW1pbywgIm1taW9DbG9zZSglMDRYLCAlMDRYKTtcbiIsIGhtbWlvLCB1RmxhZ3MpOwogCiAJbHBtbWluZm8gPSAoTFBNTUlPSU5GTzE2KSBHbG9iYWxMb2NrMTYoaG1taW8pOwogCWlmIChscG1taW5mbyA9PSBOVUxMKQpAQCAtMjg3LDcgKzI4Niw3IEBACiAJTE9ORyBjb3VudDsKIAlMUE1NSU9JTkZPMTYgbHBtbWluZm87CiAKLQlkcHJpbnRmX21taW8oc3RkZGViLCAibW1pb1JlYWQoJTA0WCwgJXAsICVsZCk7XG4iLCBobW1pbywgcGNoLCBjY2gpOworCWRwcmludGZfaW5mbyhtbWlvLCAibW1pb1JlYWQoJTA0WCwgJXAsICVsZCk7XG4iLCBobW1pbywgcGNoLCBjY2gpOwogCiAJbHBtbWluZm8gPSAoTFBNTUlPSU5GTzE2KUdsb2JhbExvY2sxNihobW1pbyk7CiAJaWYgKGxwbW1pbmZvID09IE5VTEwpCkBAIC0yOTYsNyArMjk1LDcgQEAKIAljb3VudCA9IG1taW9TZW5kTWVzc2FnZShobW1pbywgTU1JT01fUkVBRCwgKExQQVJBTSkgcGNoLCAoTFBBUkFNKSBjY2gpOwogCiAJR2xvYmFsVW5sb2NrMTYoaG1taW8pOwotCWRwcmludGZfbW1pbyhzdGRkZWIsICJtbWlvUmVhZCAvLyBjb3VudD0lbGRcbiIsIGNvdW50KTsKKwlkcHJpbnRmX2luZm8obW1pbywgIm1taW9SZWFkIC8vIGNvdW50PSVsZFxuIiwgY291bnQpOwogCXJldHVybiBjb3VudDsKIH0KIApAQCAtMzEwLDcgKzMwOSw3IEBACiAJTE9ORyBjb3VudDsKIAlMUE1NSU9JTkZPMTYgbHBtbWluZm87CiAKLQlkcHJpbnRmX21taW8oc3RkZGViLCAibW1pb1dyaXRlKCUwNFgsICVwLCAlbGQpO1xuIiwgaG1taW8sIHBjaCwgY2NoKTsKKwlkcHJpbnRmX2luZm8obW1pbywgIm1taW9Xcml0ZSglMDRYLCAlcCwgJWxkKTtcbiIsIGhtbWlvLCBwY2gsIGNjaCk7CiAKIAlscG1taW5mbyA9IChMUE1NSU9JTkZPMTYpR2xvYmFsTG9jazE2KGhtbWlvKTsKIAlpZiAobHBtbWluZm8gPT0gTlVMTCkKQEAgLTMxOSw3ICszMTgsNyBAQAogCWNvdW50ID0gbW1pb1NlbmRNZXNzYWdlKGhtbWlvLCBNTUlPTV9XUklURSwgKExQQVJBTSkgcGNoLCAoTFBBUkFNKSBjY2gpOwogCiAJR2xvYmFsVW5sb2NrMTYoaG1taW8pOwotCWRwcmludGZfbW1pbyhzdGRkZWIsICJtbWlvV3JpdGUgLy8gY291bnQ9JWxkXG4iLCBjb3VudCk7CisJZHByaW50Zl9pbmZvKG1taW8sICJtbWlvV3JpdGUgLy8gY291bnQ9JWxkXG4iLCBjb3VudCk7CiAJcmV0dXJuIGNvdW50OwogfQogCkBAIC0zMzEsNyArMzMwLDcgQEAKIAlpbnQgb2Zmc2V0OwogCUxQTU1JT0lORk8xNiBscG1taW5mbzsKIAotCWRwcmludGZfbW1pbyhzdGRkZWIsICJtbWlvU2VlayglMDRYLCAlMDhsWCwgJWQpO1xuIiwgaG1taW8sIGxPZmZzZXQsIGlPcmlnaW4pOworCWRwcmludGZfaW5mbyhtbWlvLCAibW1pb1NlZWsoJTA0WCwgJTA4bFgsICVkKTtcbiIsIGhtbWlvLCBsT2Zmc2V0LCBpT3JpZ2luKTsKIAogCWxwbW1pbmZvID0gKExQTU1JT0lORk8xNilHbG9iYWxMb2NrMTYoaG1taW8pOwogCWlmIChscG1taW5mbyA9PSBOVUxMKQpAQCAtMzQ5LDcgKzM0OCw3IEBACiBVSU5UMTYgV0lOQVBJIG1taW9HZXRJbmZvKEhNTUlPMTYgaG1taW8sIE1NSU9JTkZPMTYgKiBscG1taW9pbmZvLCBVSU5UMTYgdUZsYWdzKQogewogCUxQTU1JT0lORk8xNglscG1taW5mbzsKLQlkcHJpbnRmX21taW8oc3RkZGViLCAibW1pb0dldEluZm9cbiIpOworCWRwcmludGZfaW5mbyhtbWlvLCAibW1pb0dldEluZm9cbiIpOwogCWxwbW1pbmZvID0gKExQTU1JT0lORk8xNilHbG9iYWxMb2NrMTYoaG1taW8pOwogCWlmIChscG1taW5mbyA9PSBOVUxMKSByZXR1cm4gMDsKIAltZW1jcHkobHBtbWlvaW5mbywgbHBtbWluZm8sIHNpemVvZihNTUlPSU5GTzE2KSk7CkBAIC0zNjMsNyArMzYyLDcgQEAKIFVJTlQxNiBXSU5BUEkgbW1pb1NldEluZm8oSE1NSU8xNiBobW1pbywgY29uc3QgTU1JT0lORk8xNiAqIGxwbW1pb2luZm8sIFVJTlQxNiB1RmxhZ3MpCiB7CiAJTFBNTUlPSU5GTzE2CWxwbW1pbmZvOwotCWRwcmludGZfbW1pbyhzdGRkZWIsICJtbWlvU2V0SW5mb1xuIik7CisJZHByaW50Zl9pbmZvKG1taW8sICJtbWlvU2V0SW5mb1xuIik7CiAJbHBtbWluZm8gPSAoTFBNTUlPSU5GTzE2KUdsb2JhbExvY2sxNihobW1pbyk7CiAJaWYgKGxwbW1pbmZvID09IE5VTEwpIHJldHVybiAwOwogCUdsb2JhbFVubG9jazE2KGhtbWlvKTsKQEAgLTM3Niw3ICszNzUsNyBAQAogVUlOVDE2IFdJTkFQSSBtbWlvU2V0QnVmZmVyKEhNTUlPMTYgaG1taW8sIExQU1RSIHBjaEJ1ZmZlciwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTE9ORyBjY2hCdWZmZXIsIFVJTlQxNiB1RmxhZ3MpCiB7Ci0JZHByaW50Zl9tbWlvKHN0ZGRlYiwgIm1taW9TZXRCdWZmZXIgLy8gZW1wdHkgc3R1YiBcbiIpOworCWRwcmludGZfZml4bWUobW1pbywgIm1taW9TZXRCdWZmZXIgLy8gZW1wdHkgc3R1YiBcbiIpOwogCXJldHVybiAwOwogfQogCkBAIC0zODYsNyArMzg1LDcgQEAKIFVJTlQxNiBXSU5BUEkgbW1pb0ZsdXNoKEhNTUlPMTYgaG1taW8sIFVJTlQxNiB1RmxhZ3MpCiB7CiAJTFBNTUlPSU5GTzE2CWxwbW1pbmZvOwotCWRwcmludGZfbW1pbyhzdGRkZWIsICJtbWlvRmx1c2goJTA0WCwgJTA0WClcbiIsIGhtbWlvLCB1RmxhZ3MpOworCWRwcmludGZfaW5mbyhtbWlvLCAibW1pb0ZsdXNoKCUwNFgsICUwNFgpXG4iLCBobW1pbywgdUZsYWdzKTsKIAlscG1taW5mbyA9IChMUE1NSU9JTkZPMTYpR2xvYmFsTG9jazE2KGhtbWlvKTsKIAlpZiAobHBtbWluZm8gPT0gTlVMTCkgcmV0dXJuIDA7CiAJR2xvYmFsVW5sb2NrMTYoaG1taW8pOwpAQCAtNDAwLDcgKzM5OSw3IEBACiB7CiAJaW50CQljb3VudCA9IDA7CiAJTFBNTUlPSU5GTzE2CWxwbW1pbmZvOwotCWRwcmludGZfbW1pbyhzdGRkZWIsICJtbWlvQWR2YW5jZVxuIik7CisJZHByaW50Zl9pbmZvKG1taW8sICJtbWlvQWR2YW5jZVxuIik7CiAJbHBtbWluZm8gPSAoTFBNTUlPSU5GTzE2KUdsb2JhbExvY2sxNihobW1pbyk7CiAJaWYgKGxwbW1pbmZvID09IE5VTEwpIHJldHVybiAwOwogCWlmICh1RmxhZ3MgPT0gTU1JT19SRUFEKSB7CkBAIC00NDIsNyArNDQxLDcgQEAKICAqLwogRk9VUkNDIFdJTkFQSSBtbWlvU3RyaW5nVG9GT1VSQ0MxNihMUENTVFIgc3osIFVJTlQxNiB1RmxhZ3MpCiB7Ci0JZHByaW50Zl9tbWlvKHN0ZGRlYiwgIm1taW9TdHJpbmdUb0ZPVVJDQyAvLyBlbXB0eSBzdHViIFxuIik7CisJZHByaW50Zl9maXhtZShtbWlvLCAibW1pb1N0cmluZ1RvRk9VUkNDIC8vIGVtcHR5IHN0dWIgXG4iKTsKIAlyZXR1cm4gMDsKIH0KIApAQCAtNDUyLDcgKzQ1MSw3IEBACiBMUE1NSU9QUk9DMTYgV0lOQVBJIG1taW9JbnN0YWxsSU9Qcm9jMTYoRk9VUkNDIGZjY0lPUHJvYywgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFBNTUlPUFJPQzE2IHBJT1Byb2MsIERXT1JEIGR3RmxhZ3MpCiB7Ci0JZHByaW50Zl9tbWlvKHN0ZGRlYiwgIm1taW9JbnN0YWxsSU9Qcm9jKCVsZCwgJXAsICUwOGxYKVxuIiwKKwlkcHJpbnRmX2luZm8obW1pbywgIm1taW9JbnN0YWxsSU9Qcm9jKCVsZCwgJXAsICUwOGxYKVxuIiwKIAkJCQkgZmNjSU9Qcm9jLCBwSU9Qcm9jLCBkd0ZsYWdzKTsKIAogCWlmIChkd0ZsYWdzICYgTU1JT19HTE9CQUxQUk9DKSB7CkBAIC00ODQsNyArNDgzLDcgQEAKIExQTU1JT1BST0MzMiBXSU5BUEkgbW1pb0luc3RhbGxJT1Byb2MzMkEoRk9VUkNDIGZjY0lPUHJvYywgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExQTU1JT1BST0MzMiBwSU9Qcm9jLCBEV09SRCBkd0ZsYWdzKQogewotCWRwcmludGZfbW1pbyhzdGRkZWIsICJtbWlvSW5zdGFsbElPUHJvY0EgKCVjJWMlYyVjLCVwLDB4JTA4bHgpLy8gZW1wdHkgc3R1YiBcbiIsCisJZHByaW50Zl9maXhtZShtbWlvLCAibW1pb0luc3RhbGxJT1Byb2NBICglYyVjJWMlYywlcCwweCUwOGx4KS8vIGVtcHR5IHN0dWIgXG4iLAogICAgICAgICAgICAgICAgICAgICAgKGNoYXIpKChmY2NJT1Byb2MmMHhmZjAwMDAwMCk+PjI0KSwKICAgICAgICAgICAgICAgICAgICAgIChjaGFyKSgoZmNjSU9Qcm9jJjB4MDBmZjAwMDApPj4xNiksCiAgICAgICAgICAgICAgICAgICAgICAoY2hhcikoKGZjY0lPUHJvYyYweDAwMDBmZjAwKT4+IDgpLApAQCAtNTE4LDEwICs1MTcsMTAgQEAKICNlbmRpZgogCiAJaWYgKG1zZykKLQkJZHByaW50Zl9tbWlvKHN0ZGRlYiwgIm1taW9TZW5kTWVzc2FnZSglMDRYLCAlcywgJWxkLCAlbGQpXG4iLAorCQlkcHJpbnRmX2luZm8obW1pbywgIm1taW9TZW5kTWVzc2FnZSglMDRYLCAlcywgJWxkLCAlbGQpXG4iLAogCQkJCQkgaG1taW8sIG1zZywgbFBhcmFtMSwgbFBhcmFtMik7CiAJZWxzZQotCQlkcHJpbnRmX21taW8oc3RkZGViLCAibW1pb1NlbmRNZXNzYWdlKCUwNFgsICV1LCAlbGQsICVsZClcbiIsCisJCWRwcmludGZfaW5mbyhtbWlvLCAibW1pb1NlbmRNZXNzYWdlKCUwNFgsICV1LCAlbGQsICVsZClcbiIsCiAJCQkJCSBobW1pbywgdU1lc3NhZ2UsIGxQYXJhbTEsIGxQYXJhbTIpOwogCQogCWxwbW1pbmZvID0gKExQTU1JT0lORk8xNilHbG9iYWxMb2NrMTYoaG1taW8pOwpAQCAtNTQ0LDIwICs1NDMsMjAgQEAKIHsKIAlEV09SRAlkd2ZjYywgZHdPbGRQb3M7CiAKLQlkcHJpbnRmX21taW8oc3RkZGViLCAibW1pb0Rlc2NlbmQoJTA0WCwgJXAsICVwLCAlMDRYKTtcbiIsIAorCWRwcmludGZfaW5mbyhtbWlvLCAibW1pb0Rlc2NlbmQoJTA0WCwgJXAsICVwLCAlMDRYKTtcbiIsIAogCQkJCWhtbWlvLCBscGNrLCBscGNrUGFyZW50LCB1RmxhZ3MpOwogCiAJaWYgKGxwY2sgPT0gTlVMTCkKIAkgICAgcmV0dXJuIDA7CiAKIAlkd2ZjYyA9IGxwY2stPmNraWQ7Ci0JZHByaW50Zl9tbWlvKHN0ZGRlYiwgIm1taW9EZXNjZW5kIC8vIGR3ZmNjPSUwOGxYXG4iLCBkd2ZjYyk7CisJZHByaW50Zl9pbmZvKG1taW8sICJtbWlvRGVzY2VuZCAvLyBkd2ZjYz0lMDhsWFxuIiwgZHdmY2MpOwogCiAJZHdPbGRQb3MgPSBtbWlvU2VlayhobW1pbywgMCwgU0VFS19DVVIpOwotCWRwcmludGZfbW1pbyhzdGRkZWIsICJtbWlvRGVzY2VuZCAvLyBkd09sZFBvcz0lbGRcbiIsIGR3T2xkUG9zKTsKKwlkcHJpbnRmX2luZm8obW1pbywgIm1taW9EZXNjZW5kIC8vIGR3T2xkUG9zPSVsZFxuIiwgZHdPbGRQb3MpOwogCiAJaWYgKGxwY2tQYXJlbnQgIT0gTlVMTCkgewotCQlkcHJpbnRmX21taW8oc3RkZGViLCAibW1pb0Rlc2NlbmQgLy8gc2VlayBpbnNpZGUgcGFyZW50IGF0ICVsZCAhXG4iLCBscGNrUGFyZW50LT5kd0RhdGFPZmZzZXQpOworCQlkcHJpbnRmX2luZm8obW1pbywgIm1taW9EZXNjZW5kIC8vIHNlZWsgaW5zaWRlIHBhcmVudCBhdCAlbGQgIVxuIiwgbHBja1BhcmVudC0+ZHdEYXRhT2Zmc2V0KTsKIAkJZHdPbGRQb3MgPSBtbWlvU2VlayhobW1pbywgbHBja1BhcmVudC0+ZHdEYXRhT2Zmc2V0LCBTRUVLX1NFVCk7CiAJfQogLyoKQEAgLTU2OSwxOSArNTY4LDE5IEBACiAJCSh1RmxhZ3MgJiBNTUlPX0ZJTkRMSVNUKSkgewogKi8KIAlpZiAoKHVGbGFncyAmIE1NSU9fRklORENIVU5LKSB8fCAodUZsYWdzICYgTU1JT19GSU5ETElTVCkpIHsKLQkJZHByaW50Zl9tbWlvKHN0ZGRlYiwgIm1taW9EZXNjZW5kIC8vIE1NSU9fRklORHh4eHggZHdmY2M9JTA4bFggIVxuIiwgZHdmY2MpOworCQlkcHJpbnRmX2luZm8obW1pbywgIm1taW9EZXNjZW5kIC8vIE1NSU9fRklORHh4eHggZHdmY2M9JTA4bFggIVxuIiwgZHdmY2MpOwogCQl3aGlsZSAoVFJVRSkgewogCQkgICAgICAgIExPTkcgaXg7CiAKIAkJCWl4ID0gbW1pb1JlYWQoaG1taW8sIChMUFNUUilscGNrLCBzaXplb2YoTU1DS0lORk8pKTsKLQkJCWRwcmludGZfbW1pbyhzdGRkZWIsICJtbWlvRGVzY2VuZCAvLyBhZnRlciBfbHJlYWQzMiBpeCA9ICVsZCByZXEgPSAlZCwgZXJybm8gPSAlZFxuIixpeCxzaXplb2YoTU1DS0lORk8pLGVycm5vKTsKKwkJCWRwcmludGZfaW5mbyhtbWlvLCAibW1pb0Rlc2NlbmQgLy8gYWZ0ZXIgX2xyZWFkMzIgaXggPSAlbGQgcmVxID0gJWQsIGVycm5vID0gJWRcbiIsaXgsc2l6ZW9mKE1NQ0tJTkZPKSxlcnJubyk7CiAJCQlpZiAoaXggPCBzaXplb2YoTU1DS0lORk8pKSB7CiAKIAkJCQltbWlvU2VlayhobW1pbywgZHdPbGRQb3MsIFNFRUtfU0VUKTsKLQkJCQlkcHJpbnRmX21taW8oc3RkZGViLCAibW1pb0Rlc2NlbmQgLy8gcmV0dXJuIENodW5rTm90Rm91bmRcbiIpOworCQkJCWRwcmludGZfd2FybihtbWlvLCAibW1pb0Rlc2NlbmQgLy8gcmV0dXJuIENodW5rTm90Rm91bmRcbiIpOwogCQkJCXJldHVybiBNTUlPRVJSX0NIVU5LTk9URk9VTkQ7CiAJCQl9Ci0JCQlkcHJpbnRmX21taW8oc3RkZGViLCAibW1pb0Rlc2NlbmQgLy8gZHdmY2M9JTA4bFggY2tpZD0lMDhsWCBja3NpemU9JTA4bFggIVxuIiwgCisJCQlkcHJpbnRmX2luZm8obW1pbywgIm1taW9EZXNjZW5kIC8vIGR3ZmNjPSUwOGxYIGNraWQ9JTA4bFggY2tzaXplPSUwOGxYICFcbiIsIAogCQkJCQkJCQkJZHdmY2MsIGxwY2stPmNraWQsIGxwY2stPmNrc2l6ZSk7CiAJCQlpZiAoZHdmY2MgPT0gbHBjay0+Y2tpZCkKIAkJCQlicmVhazsKQEAgLTU5NSw3ICs1OTQsNyBAQAogCWVsc2UgewogCQlpZiAobW1pb1JlYWQoaG1taW8sIChMUFNUUilscGNrLCBzaXplb2YoTU1DS0lORk8pKSA8IHNpemVvZihNTUNLSU5GTykpIHsKIAkJCW1taW9TZWVrKGhtbWlvLCBkd09sZFBvcywgU0VFS19TRVQpOwotCQkJZHByaW50Zl9tbWlvKHN0ZGRlYiwgIm1taW9EZXNjZW5kIC8vIHJldHVybiBDaHVua05vdEZvdW5kIDJuZFxuIik7CisJCQlkcHJpbnRmX3dhcm4obW1pbywgIm1taW9EZXNjZW5kIC8vIHJldHVybiBDaHVua05vdEZvdW5kIDJuZFxuIik7CiAJCQlyZXR1cm4gTU1JT0VSUl9DSFVOS05PVEZPVU5EOwogCQl9CiAJfQpAQCAtNjA0LDkgKzYwMyw5IEBACiAJCWxwY2stPmR3RGF0YU9mZnNldCArPSBzaXplb2YoRFdPUkQpOwogCW1taW9TZWVrKGhtbWlvLCBscGNrLT5kd0RhdGFPZmZzZXQsIFNFRUtfU0VUKTsKIAotCWRwcmludGZfbW1pbyhzdGRkZWIsICJtbWlvRGVzY2VuZCAvLyBscGNrLT5ja2lkPSUwOGxYIGxwY2stPmNrc2l6ZT0lbGQgIVxuIiwgCisJZHByaW50Zl9pbmZvKG1taW8sICJtbWlvRGVzY2VuZCAvLyBscGNrLT5ja2lkPSUwOGxYIGxwY2stPmNrc2l6ZT0lbGQgIVxuIiwgCiAJCQkJCQkJCWxwY2stPmNraWQsIGxwY2stPmNrc2l6ZSk7Ci0JZHByaW50Zl9tbWlvKHN0ZGRlYiwgIm1taW9EZXNjZW5kIC8vIGxwY2stPmZjY1R5cGU9JTA4bFggIVxuIiwgbHBjay0+ZmNjVHlwZSk7CisJZHByaW50Zl9pbmZvKG1taW8sICJtbWlvRGVzY2VuZCAvLyBscGNrLT5mY2NUeXBlPSUwOGxYICFcbiIsIGxwY2stPmZjY1R5cGUpOwogCiAJcmV0dXJuIDA7CiB9CkBAIC02MTYsNyArNjE1LDcgQEAKICovCiBVSU5UMTYgV0lOQVBJIG1taW9Bc2NlbmQoSE1NSU8xNiBobW1pbywgTU1DS0lORk8gKiBscGNrLCBVSU5UMTYgdUZsYWdzKQogewotCWRwcmludGZfbW1pbyhzdGRkZWIsICJtbWlvQXNjZW5kIC8vIGVtcHR5IHN0dWIgIVxuIik7CisJZHByaW50Zl9maXhtZShtbWlvLCAibW1pb0FzY2VuZCAvLyBlbXB0eSBzdHViICFcbiIpOwogCXJldHVybiAwOwogfQogCkBAIC02MjUsNyArNjI0LDcgQEAKICovCiBVSU5UMTYgV0lOQVBJIG1taW9DcmVhdGVDaHVuayhITU1JTzE2IGhtbWlvLCBNTUNLSU5GTyAqIGxwY2ssIFVJTlQxNiB1RmxhZ3MpCiB7Ci0JZHByaW50Zl9tbWlvKHN0ZGRlYiwgIm1taW9DcmVhdGVDaHVuayAvLyBlbXB0eSBzdHViIFxuIik7CisJZHByaW50Zl9maXhtZShtbWlvLCAibW1pb0NyZWF0ZUNodW5rIC8vIGVtcHR5IHN0dWIgXG4iKTsKIAlyZXR1cm4gMDsKIH0KIApAQCAtNjQwLDcgKzYzOSw3IEBACiAJTFBNTUlPSU5GTzE2IGxwbW1pbmZvOwogCUhNTUlPMTYgaG1taW87CiAKLQlkcHJpbnRmX21taW8oc3RkZGViLCAibW1pb1JlbmFtZSgnJXMnLCAnJXMnLCAlcCwgJTA4bFgpO1xuIiwKKwlkcHJpbnRmX2luZm8obW1pbywgIm1taW9SZW5hbWUoJyVzJywgJyVzJywgJXAsICUwOGxYKTtcbiIsCiAJCQkJIHN6RmlsZU5hbWUsIHN6TmV3RmlsZU5hbWUsIGxwbW1pb2luZm8sIGR3UmVuYW1lRmxhZ3MpOwogCiAJaG1taW8gPSBHbG9iYWxBbGxvYzE2KEdITkQsIHNpemVvZihNTUlPSU5GTzE2KSk7CmRpZmYgLS1naXQgYS9tdWx0aW1lZGlhL21tc3lzdGVtLmMgYi9tdWx0aW1lZGlhL21tc3lzdGVtLmMKaW5kZXggMWVlMDAyMy4uMzVlOTRlNyAxMDA2NDQKLS0tIGEvbXVsdGltZWRpYS9tbXN5c3RlbS5jCisrKyBiL211bHRpbWVkaWEvbW1zeXN0ZW0uYwpAQCAtMjIsOCArMjIsNiBAQAogI2luY2x1ZGUgImRyaXZlci5oIgogI2luY2x1ZGUgImZpbGUuaCIKICNpbmNsdWRlICJtbXN5c3RlbS5oIgotI2luY2x1ZGUgInN0ZGRlYnVnLmgiCi0vKiAjZGVmaW5lIERFQlVHX01NU1lTICovCiAjaW5jbHVkZSAiZGVidWcuaCIKICNpbmNsdWRlICJ4bWFsbG9jLmgiCiAjaW5jbHVkZSAiY2FsbGJhY2suaCIKQEAgLTEyMyw3ICsxMjEsNyBAQAogICovCiBCT09MMzIgV0lOQVBJIFBsYXlTb3VuZDMyQShMUENTVFIgcHN6U291bmQsIEhNT0RVTEUzMiBobW9kLCBEV09SRCBmZHdTb3VuZCkKIHsKLSAgZHByaW50Zl9tbXN5cyhzdGRkZWIsICJQbGF5U291bmRBOiBwc3pTb3VuZD0nJXAnIGhtb2Q9JTA0WCBmZHdTb3VuZD0lMDhsWFxuIiwKKyAgZHByaW50Zl9pbmZvKG1tc3lzLCAiUGxheVNvdW5kQTogcHN6U291bmQ9JyVwJyBobW9kPSUwNFggZmR3U291bmQ9JTA4bFhcbiIsCiAJCXBzelNvdW5kLCBobW9kLCBmZHdTb3VuZCk7CiAgIGlmKGhtb2QgIT0gMCB8fCAhKGZkd1NvdW5kICYgU05EX0ZJTEVOQU1FKSkgewogICAgIGZwcmludGYoc3RkZXJyLCAiUGxheVNvdW5kQTogb25seSBkaXNrIHNvdW5kIGZpbGVzIGFyZSBzdXBwb3J0ZWRcbiIpOwpAQCAtMTU2LDM3ICsxNTQsMzcgQEAKIAljaGFyCQkJc3RyWzEyOF07CiAJTFBTVFIJCQlwdHI7CiAKLQlkcHJpbnRmX21tc3lzKHN0ZGRlYiwgInNuZFBsYXlTb3VuZCAvLyBTb3VuZE5hbWU9JyVzJyB1RmxhZ3M9JTA0WCAhXG4iLCAKKwlkcHJpbnRmX2luZm8obW1zeXMsICJzbmRQbGF5U291bmQgLy8gU291bmROYW1lPSclcycgdUZsYWdzPSUwNFggIVxuIiwgCiAJCQkJCQkJCQlscHN6U291bmROYW1lLCB1RmxhZ3MpOwogCWlmIChscHN6U291bmROYW1lID09IE5VTEwpIHsKLQkJZHByaW50Zl9tbXN5cyhzdGRkZWIsICJzbmRQbGF5U291bmQgLy8gU3RvcCAhXG4iKTsKKwkJZHByaW50Zl9pbmZvKG1tc3lzLCAic25kUGxheVNvdW5kIC8vIFN0b3AgIVxuIik7CiAJCXJldHVybiBGQUxTRTsKIAkJfQogCWhtbWlvID0gbW1pb09wZW4xNigoTFBTVFIpbHBzelNvdW5kTmFtZSwgTlVMTCwgCiAJCU1NSU9fQUxMT0NCVUYgfCBNTUlPX1JFQUQgfCBNTUlPX0RFTllXUklURSk7CiAKIAlpZiAodUZsYWdzICYgU05EX01FTU9SWSkgewotCQlkcHJpbnRmX21tc3lzKHN0ZGRlYiwgInNuZFBsYXlTb3VuZCAvLyBTTkRfTUVNT1JZIGZsYWcgbm90IGltcGxlbWVudGVkIVxuIik7CisJCWRwcmludGZfZml4bWUobW1zeXMsICJzbmRQbGF5U291bmQgLy8gU05EX01FTU9SWSBmbGFnIG5vdCBpbXBsZW1lbnRlZCFcbiIpOwogCQlyZXR1cm4gRkFMU0U7CiAJfQogCiAJaWYgKGhtbWlvID09IDApIAogCXsKLQkJZHByaW50Zl9tbXN5cyhzdGRkZWIsICJzbmRQbGF5U291bmQgLy8gc2VhcmNoaW5nIGluIFN5c3RlbVNvdW5kIExpc3QgIVxuIik7CisJCWRwcmludGZfaW5mbyhtbXN5cywgInNuZFBsYXlTb3VuZCAvLyBzZWFyY2hpbmcgaW4gU3lzdGVtU291bmQgTGlzdCAhXG4iKTsKIAkJR2V0UHJvZmlsZVN0cmluZzMyQSgiU291bmRzIiwgKExQU1RSKWxwc3pTb3VuZE5hbWUsICIiLCBzdHIsIHNpemVvZihzdHIpKTsKIAkJaWYgKHN0cmxlbihzdHIpID09IDApIHJldHVybiBGQUxTRTsKIAkJaWYgKCAocHRyID0gKExQU1RSKXN0cmNocihzdHIsICcsJykpICE9IE5VTEwpICpwdHIgPSAnXDAnOwogCQlobW1pbyA9IG1taW9PcGVuMTYoc3RyLCBOVUxMLCBNTUlPX0FMTE9DQlVGIHwgTU1JT19SRUFEIHwgTU1JT19ERU5ZV1JJVEUpOwogCQlpZiAoaG1taW8gPT0gMCkgCiAJCXsKLQkJCWRwcmludGZfbW1zeXMoc3RkZGViLCAic25kUGxheVNvdW5kIC8vIGNhbid0IGZpbmQgU3lzdGVtU291bmQ9JyVzJyAhXG4iLCBzdHIpOworCQkJZHByaW50Zl93YXJuKG1tc3lzLCAic25kUGxheVNvdW5kIC8vIGNhbid0IGZpbmQgU3lzdGVtU291bmQ9JyVzJyAhXG4iLCBzdHIpOwogCQkJcmV0dXJuIEZBTFNFOwogCQl9CiAJfQogCiAJaWYgKG1taW9EZXNjZW5kKGhtbWlvLCAmY2tNYWluUklGRiwgTlVMTCwgMCkgPT0gMCkgCiAgICAgICAgIHsKLQkgICAgZHByaW50Zl9tbXN5cyhzdGRkZWIsICJzbmRQbGF5U291bmQgLy8gUGFyZW50Q2h1bmsgY2tpZD0lLjRzIGZjY1R5cGU9JS40cyBja3NpemU9JTA4bFggXG4iLAorCSAgICBkcHJpbnRmX2luZm8obW1zeXMsICJzbmRQbGF5U291bmQgLy8gUGFyZW50Q2h1bmsgY2tpZD0lLjRzIGZjY1R5cGU9JS40cyBja3NpemU9JTA4bFggXG4iLAogCQkJCShMUFNUUikmY2tNYWluUklGRi5ja2lkLCAoTFBTVFIpJmNrTWFpblJJRkYuZmNjVHlwZSwgY2tNYWluUklGRi5ja3NpemUpOwogCiAJICAgIGlmICgoY2tNYWluUklGRi5ja2lkID09IEZPVVJDQ19SSUZGKSAmJgpAQCAtMjAwLDE5ICsxOTgsMTkgQEAKIAkJewogCQkgICAgUENNV0FWRUZPUk1BVCAgICAgICAgICAgcGNtV2F2ZUZvcm1hdDsKIAotCQkgICAgZHByaW50Zl9tbXN5cyhzdGRkZWIsICJzbmRQbGF5U291bmQgLy8gQ2h1bmsgRm91bmQgY2tpZD0lLjRzIGZjY1R5cGU9JS40cyBja3NpemU9JTA4bFggXG4iLAorCQkgICAgZHByaW50Zl9pbmZvKG1tc3lzLCAic25kUGxheVNvdW5kIC8vIENodW5rIEZvdW5kIGNraWQ9JS40cyBmY2NUeXBlPSUuNHMgY2tzaXplPSUwOGxYIFxuIiwKIAkJCQkoTFBTVFIpJm1tY2tJbmZvLmNraWQsIChMUFNUUikmbW1ja0luZm8uZmNjVHlwZSwgbW1ja0luZm8uY2tzaXplKTsKIAogCQkgICAgaWYgKG1taW9SZWFkKGhtbWlvLCAoSFBTVFIpICZwY21XYXZlRm9ybWF0LAogCQkJICAgICAgICAobG9uZykgc2l6ZW9mKFBDTVdBVkVGT1JNQVQpKSA9PSAobG9uZykgc2l6ZW9mKFBDTVdBVkVGT1JNQVQpKQogCQkgICAgewogCi0JCQlkcHJpbnRmX21tc3lzKHN0ZGRlYiwgInNuZFBsYXlTb3VuZCAvLyB3Rm9ybWF0VGFnPSUwNFggIVxuIiwgcGNtV2F2ZUZvcm1hdC53Zi53Rm9ybWF0VGFnKTsKLQkJCWRwcmludGZfbW1zeXMoc3RkZGViLCAic25kUGxheVNvdW5kIC8vIG5DaGFubmVscz0lZCBcbiIsIHBjbVdhdmVGb3JtYXQud2YubkNoYW5uZWxzKTsKLQkJCWRwcmludGZfbW1zeXMoc3RkZGViLCAic25kUGxheVNvdW5kIC8vIG5TYW1wbGVzUGVyU2VjPSVsZFxuIiwgcGNtV2F2ZUZvcm1hdC53Zi5uU2FtcGxlc1BlclNlYyk7Ci0JCQlkcHJpbnRmX21tc3lzKHN0ZGRlYiwgInNuZFBsYXlTb3VuZCAvLyBuQXZnQnl0ZXNQZXJTZWM9JWxkXG4iLCBwY21XYXZlRm9ybWF0LndmLm5BdmdCeXRlc1BlclNlYyk7Ci0JCQlkcHJpbnRmX21tc3lzKHN0ZGRlYiwgInNuZFBsYXlTb3VuZCAvLyBuQmxvY2tBbGlnbj0lZCBcbiIsIHBjbVdhdmVGb3JtYXQud2YubkJsb2NrQWxpZ24pOwotCQkJZHByaW50Zl9tbXN5cyhzdGRkZWIsICJzbmRQbGF5U291bmQgLy8gd0JpdHNQZXJTYW1wbGU9JXUgIVxuIiwgcGNtV2F2ZUZvcm1hdC53Qml0c1BlclNhbXBsZSk7CisJCQlkcHJpbnRmX2luZm8obW1zeXMsICJzbmRQbGF5U291bmQgLy8gd0Zvcm1hdFRhZz0lMDRYICFcbiIsIHBjbVdhdmVGb3JtYXQud2Yud0Zvcm1hdFRhZyk7CisJCQlkcHJpbnRmX2luZm8obW1zeXMsICJzbmRQbGF5U291bmQgLy8gbkNoYW5uZWxzPSVkIFxuIiwgcGNtV2F2ZUZvcm1hdC53Zi5uQ2hhbm5lbHMpOworCQkJZHByaW50Zl9pbmZvKG1tc3lzLCAic25kUGxheVNvdW5kIC8vIG5TYW1wbGVzUGVyU2VjPSVsZFxuIiwgcGNtV2F2ZUZvcm1hdC53Zi5uU2FtcGxlc1BlclNlYyk7CisJCQlkcHJpbnRmX2luZm8obW1zeXMsICJzbmRQbGF5U291bmQgLy8gbkF2Z0J5dGVzUGVyU2VjPSVsZFxuIiwgcGNtV2F2ZUZvcm1hdC53Zi5uQXZnQnl0ZXNQZXJTZWMpOworCQkJZHByaW50Zl9pbmZvKG1tc3lzLCAic25kUGxheVNvdW5kIC8vIG5CbG9ja0FsaWduPSVkIFxuIiwgcGNtV2F2ZUZvcm1hdC53Zi5uQmxvY2tBbGlnbik7CisJCQlkcHJpbnRmX2luZm8obW1zeXMsICJzbmRQbGF5U291bmQgLy8gd0JpdHNQZXJTYW1wbGU9JXUgIVxuIiwgcGNtV2F2ZUZvcm1hdC53Qml0c1BlclNhbXBsZSk7CiAKIAkJCW1tY2tJbmZvLmNraWQgPSBtbWlvRk9VUkNDKCdkJywgJ2EnLCAndCcsICdhJyk7CiAJCQlpZiAobW1pb0Rlc2NlbmQoaG1taW8sICZtbWNrSW5mbywgJmNrTWFpblJJRkYsIE1NSU9fRklORENIVU5LKSA9PSAwKQpAQCAtMjIwLDcgKzIxOCw3IEBACiAJCQkgICAgV0FWRU9QRU5ERVNDCXdhdmVEZXNjOwogCQkJICAgIERXT1JECQlkd1JldDsKIAotCQkJICAgIGRwcmludGZfbW1zeXMoc3RkZGViLCAic25kUGxheVNvdW5kIC8vIENodW5rIEZvdW5kIFwKKwkJCSAgICBkcHJpbnRmX2luZm8obW1zeXMsICJzbmRQbGF5U291bmQgLy8gQ2h1bmsgRm91bmQgXAogIGNraWQ9JS40cyBmY2NUeXBlPSUuNHMgY2tzaXplPSUwOGxYIFxuIiwgKExQU1RSKSZtbWNrSW5mby5ja2lkLCAoTFBTVFIpJm1tY2tJbmZvLmZjY1R5cGUsIG1tY2tJbmZvLmNrc2l6ZSk7CiAKIAkJCSAgICBwY21XYXZlRm9ybWF0LndmLm5BdmdCeXRlc1BlclNlYyA9IHBjbVdhdmVGb3JtYXQud2YublNhbXBsZXNQZXJTZWMgKiAKQEAgLTI2MCw3ICsyNTgsNyBAQAogCiAJCQkJICAgIGJSZXQgPSBUUlVFOwogCQkJCX0KLQkJCQllbHNlIGRwcmludGZfbW1zeXMoc3RkZGViLCAic25kUGxheVNvdW5kIC8vIGNhbid0IHByZXBhcmUgV2F2ZU91dCBkZXZpY2UgIVxuIik7CisJCQkJZWxzZSBkcHJpbnRmX3dhcm4obW1zeXMsICJzbmRQbGF5U291bmQgLy8gY2FuJ3QgcHJlcGFyZSBXYXZlT3V0IGRldmljZSAhXG4iKTsKIAogCQkJCUdsb2JhbFVubG9jazE2KGhEYXRhKTsKIAkJCQlHbG9iYWxGcmVlMTYoaERhdGEpOwpAQCAtMjg5LDcgKzI4Nyw3IEBACiAgKi8KIFVJTlQxNiBXSU5BUEkgbW1zeXN0ZW1HZXRWZXJzaW9uMTYoKQogewotCWRwcmludGZfbW1zeXMoc3RkZGViLCAibW1zeXN0ZW1HZXRWZXJzaW9uIC8vIDMuMTAgKFdpbjk1PylcbiIpOworCWRwcmludGZfaW5mbyhtbXN5cywgIm1tc3lzdGVtR2V0VmVyc2lvbiAvLyAzLjEwIChXaW45NT8pXG4iKTsKIAlyZXR1cm4gMHgwMzBhOwogfQogCkBAIC0zMTAsMTQgKzMwOCwxNCBAQAogewogCUxQV0FWRU9QRU5ERVNDCWxwRGVzYzsKIAotCWRwcmludGZfbW1zeXMoc3RkZGViLCAiRHJpdmVyQ2FsbGJhY2soJTA4bFgsICUwNFgsICUwNFgsICUwNFgsICUwOGxYLCAlMDhsWCwgJTA4bFgpOyAhXG4iLAorCWRwcmludGZfaW5mbyhtbXN5cywgIkRyaXZlckNhbGxiYWNrKCUwOGxYLCAlMDRYLCAlMDRYLCAlMDRYLCAlMDhsWCwgJTA4bFgsICUwOGxYKTsgIVxuIiwKIAkJZHdDYWxsQmFjaywgdUZsYWdzLCBoRGV2LCB3TXNnLCBkd1VzZXIsIGR3UGFyYW0xLCBkd1BhcmFtMik7CiAJc3dpdGNoKHVGbGFncyAmIERDQl9UWVBFTUFTSykgewogCQljYXNlIERDQl9OVUxMOgotCQkJZHByaW50Zl9tbXN5cyhzdGRkZWIsICJEcml2ZXJDYWxsYmFjaygpIC8vIENBTExCQUNLX05VTEwgIVxuIik7CisJCQlkcHJpbnRmX2luZm8obW1zeXMsICJEcml2ZXJDYWxsYmFjaygpIC8vIENBTExCQUNLX05VTEwgIVxuIik7CiAJCQlicmVhazsKIAkJY2FzZSBEQ0JfV0lORE9XOgotCQkJZHByaW50Zl9tbXN5cyhzdGRkZWIsICJEcml2ZXJDYWxsYmFjaygpIC8vIENBTExCQUNLX1dJTkRPVyA9ICUwNGxYIGhhbmRsZSA9ICUwNFghXG4iLGR3Q2FsbEJhY2ssaERldik7CisJCQlkcHJpbnRmX2luZm8obW1zeXMsICJEcml2ZXJDYWxsYmFjaygpIC8vIENBTExCQUNLX1dJTkRPVyA9ICUwNGxYIGhhbmRsZSA9ICUwNFghXG4iLGR3Q2FsbEJhY2ssaERldik7CiAJCQlpZiAoIUlzV2luZG93MzIoZHdDYWxsQmFjaykpIHJldHVybiBGQUxTRTsKIAkJCWxwRGVzYyA9IChMUFdBVkVPUEVOREVTQykgVVNFUl9IRUFQX0xJTl9BRERSKGhEZXYpOwogCQkJaWYgKGxwRGVzYyA9PSBOVUxMKSByZXR1cm4gRkFMU0U7CkBAIC0zMjUsMTAgKzMyMywxMCBAQAogCQkJUG9zdE1lc3NhZ2UxNigoSFdORDE2KWR3Q2FsbEJhY2ssIHdNc2csIGhEZXYsIGR3UGFyYW0xKTsKIAkJCWJyZWFrOwogCQljYXNlIERDQl9UQVNLOgotCQkJZHByaW50Zl9tbXN5cyhzdGRkZWIsICJEcml2ZXJDYWxsYmFjaygpIC8vIENBTExCQUNLX1RBU0sgIVxuIik7CisJCQlkcHJpbnRmX2luZm8obW1zeXMsICJEcml2ZXJDYWxsYmFjaygpIC8vIENBTExCQUNLX1RBU0sgIVxuIik7CiAJCQlyZXR1cm4gRkFMU0U7CiAJCWNhc2UgRENCX0ZVTkNUSU9OOgotCQkJZHByaW50Zl9tbXN5cyhzdGRkZWIsICJEcml2ZXJDYWxsYmFjaygpIC8vIENBTExCQUNLX0ZVTkNUSU9OICFcbiIpOworCQkJZHByaW50Zl9pbmZvKG1tc3lzLCAiRHJpdmVyQ2FsbGJhY2soKSAvLyBDQUxMQkFDS19GVU5DVElPTiAhXG4iKTsKIAkJCUNhbGxiYWNrcy0+Q2FsbERyaXZlckNhbGxiYWNrKCAoRkFSUFJPQzE2KWR3Q2FsbEJhY2ssCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaERldiwgd01zZywgZHdVc2VyLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGR3UGFyYW0xLCBkd1BhcmFtMiApOwpAQCAtMzY2LDcgKzM2NCw3IEBACiAJVUlOVDE2CWNvdW50OwogCiAJY291bnQgPSBtaXhNZXNzYWdlKDAsTVhETV9HRVROVU1ERVZTLDBMLDBMLDBMKTsKLQlkcHJpbnRmX21tYXV4KHN0ZGRlYiwibWl4ZXJHZXROdW1EZXZzIHJldHVybnMgJWRcbiIsY291bnQpOworCWRwcmludGZfaW5mbyhtbWF1eCwibWl4ZXJHZXROdW1EZXZzIHJldHVybnMgJWRcbiIsY291bnQpOwogCXJldHVybiBjb3VudDsKIH0KIApAQCAtNzAwLDkgKzY5OCw5IEBACiBVSU5UMTYgV0lOQVBJIGF1eEdldE51bURldnMxNigpCiB7CiAJVUlOVDE2CWNvdW50ID0gMDsKLQlkcHJpbnRmX21tc3lzKHN0ZGRlYiwgImF1eEdldE51bURldnMgIVxuIik7CisJZHByaW50Zl9pbmZvKG1tc3lzLCAiYXV4R2V0TnVtRGV2cyAhXG4iKTsKIAljb3VudCArPSBhdXhNZXNzYWdlKDAsIEFVWERNX0dFVE5VTURFVlMsIDBMLCAwTCwgMEwpOwotCWRwcmludGZfbW1zeXMoc3RkZGViLCAiYXV4R2V0TnVtRGV2cyByZXR1cm4gJXUgXG4iLCBjb3VudCk7CisJZHByaW50Zl9pbmZvKG1tc3lzLCAiYXV4R2V0TnVtRGV2cyByZXR1cm4gJXUgXG4iLCBjb3VudCk7CiAJcmV0dXJuIGNvdW50OwogfQogCkBAIC03NDUsNyArNzQzLDcgQEAKICAqLwogVUlOVDE2IFdJTkFQSSBhdXhHZXREZXZDYXBzMTYoVUlOVDE2IHVEZXZpY2VJRCxMUEFVWENBUFMxNiBscENhcHMsIFVJTlQxNiB1U2l6ZSkKIHsKLQlkcHJpbnRmX21tc3lzKHN0ZGRlYiwgImF1eEdldERldkNhcHMoJTA0WCwgJXAsICVkKSAhXG4iLCAKKwlkcHJpbnRmX2luZm8obW1zeXMsICJhdXhHZXREZXZDYXBzKCUwNFgsICVwLCAlZCkgIVxuIiwgCiAJCQkJCXVEZXZpY2VJRCwgbHBDYXBzLCB1U2l6ZSk7CiAJcmV0dXJuIGF1eE1lc3NhZ2UodURldmljZUlELCBBVVhETV9HRVRERVZDQVBTLAogCQkJCTBMLCAoRFdPUkQpbHBDYXBzLCAoRFdPUkQpdVNpemUpOwpAQCAtNzY0LDcgKzc2Miw3IEBACiAgKi8KIFVJTlQxNiBXSU5BUEkgYXV4R2V0Vm9sdW1lMTYoVUlOVDE2IHVEZXZpY2VJRCwgRFdPUkQgKiBscGR3Vm9sdW1lKQogewotCWRwcmludGZfbW1zeXMoc3RkZGViLCAiYXV4R2V0Vm9sdW1lKCUwNFgsICVwKSAhXG4iLCB1RGV2aWNlSUQsIGxwZHdWb2x1bWUpOworCWRwcmludGZfaW5mbyhtbXN5cywgImF1eEdldFZvbHVtZSglMDRYLCAlcCkgIVxuIiwgdURldmljZUlELCBscGR3Vm9sdW1lKTsKIAlyZXR1cm4gYXV4TWVzc2FnZSh1RGV2aWNlSUQsIEFVWERNX0dFVFZPTFVNRSwgMEwsIChEV09SRClscGR3Vm9sdW1lLCAwTCk7CiB9CiAKQEAgLTc4MSw3ICs3NzksNyBAQAogICovCiBVSU5UMTYgV0lOQVBJIGF1eFNldFZvbHVtZTE2KFVJTlQxNiB1RGV2aWNlSUQsIERXT1JEIGR3Vm9sdW1lKQogewotCWRwcmludGZfbW1zeXMoc3RkZGViLCAiYXV4U2V0Vm9sdW1lKCUwNFgsICUwOGxYKSAhXG4iLCB1RGV2aWNlSUQsIGR3Vm9sdW1lKTsKKwlkcHJpbnRmX2luZm8obW1zeXMsICJhdXhTZXRWb2x1bWUoJTA0WCwgJTA4bFgpICFcbiIsIHVEZXZpY2VJRCwgZHdWb2x1bWUpOwogCXJldHVybiBhdXhNZXNzYWdlKHVEZXZpY2VJRCwgQVVYRE1fU0VUVk9MVU1FLCAwTCwgZHdWb2x1bWUsIDBMKTsKIH0KIApAQCAtODEyLDcgKzgxMCw3IEBACiAgKi8KIERXT1JEIFdJTkFQSSBhdXhPdXRNZXNzYWdlMTYoVUlOVDE2IHVEZXZpY2VJRCwgVUlOVDE2IHVNZXNzYWdlLCBEV09SRCBkdzEsIERXT1JEIGR3MikKIHsKLQlkcHJpbnRmX21tc3lzKHN0ZGRlYiwgImF1eE91dE1lc3NhZ2UoJTA0WCwgJTA0WCwgJTA4bFgsICUwOGxYKVxuIiwgCisJZHByaW50Zl9pbmZvKG1tc3lzLCAiYXV4T3V0TWVzc2FnZSglMDRYLCAlMDRYLCAlMDhsWCwgJTA4bFgpXG4iLCAKIAkJCQl1RGV2aWNlSUQsIHVNZXNzYWdlLCBkdzEsIGR3Mik7CiAJc3dpdGNoICh1TWVzc2FnZSkgewogCWNhc2UgQVVYRE1fR0VUTlVNREVWUzoKQEAgLTg1OSw3ICs4NTcsOCBAQAogQk9PTDE2IFdJTkFQSSBtY2lHZXRFcnJvclN0cmluZzE2KERXT1JEIHdFcnJvcixMUFNUUiBscHN0ckJ1ZmZlcixVSU5UMTYgdUxlbmd0aCkKIHsKIAlMUFNUUgltc2dwdHI7Ci0JZHByaW50Zl9tbXN5cyhzdGRkZWIsICJtY2lHZXRFcnJvclN0cmluZyglMDhsWCwgJXAsICVkKTtcbiIsIHdFcnJvciwgbHBzdHJCdWZmZXIsIHVMZW5ndGgpOworCWRwcmludGZfaW5mbyhtbXN5cywgIm1jaUdldEVycm9yU3RyaW5nKCUwOGxYLCAlcCwgJWQpO1xuIiwgCisJICAgICAgIHdFcnJvciwgbHBzdHJCdWZmZXIsIHVMZW5ndGgpOwogCWlmICgobHBzdHJCdWZmZXIgPT0gTlVMTCkgfHwgKHVMZW5ndGggPCAxKSkgcmV0dXJuKEZBTFNFKTsKIAlscHN0ckJ1ZmZlclswXSA9ICdcMCc7CiAJc3dpdGNoKHdFcnJvcikgewpAQCAtMTEyNCw3ICsxMTIzLDcgQEAKIAkJCWJyZWFrOwogCX0KICAgICAgICAgbHN0cmNweW4zMkEobHBzdHJCdWZmZXIsIG1zZ3B0ciwgdUxlbmd0aCk7Ci0JZHByaW50Zl9tbXN5cyhzdGRkZWIsICJtY2lHZXRFcnJvclN0cmluZyAvLyBtc2cgPSAlcztcbiIsIG1zZ3B0cik7CisJZHByaW50Zl9pbmZvKG1tc3lzLCAibWNpR2V0RXJyb3JTdHJpbmcgLy8gbXNnID0gJXM7XG4iLCBtc2dwdHIpOwogCXJldHVybiBUUlVFOwogfQogCkBAIC0xMTM0LDkgKzExMzMsOSBAQAogICovCiBCT09MMTYgV0lOQVBJIG1jaURyaXZlck5vdGlmeShIV05EMTYgaFduZENhbGxCYWNrLCBVSU5UMTYgd0RldklELCBVSU5UMTYgd1N0YXR1cykKIHsKLQlkcHJpbnRmX21tc3lzKHN0ZGRlYiwgIm1jaURyaXZlck5vdGlmeSglMDRYLCAldSwgJTA0WClcbiIsIGhXbmRDYWxsQmFjaywgd0RldklELCB3U3RhdHVzKTsKKwlkcHJpbnRmX2luZm8obW1zeXMsICJtY2lEcml2ZXJOb3RpZnkoJTA0WCwgJXUsICUwNFgpXG4iLCBoV25kQ2FsbEJhY2ssIHdEZXZJRCwgd1N0YXR1cyk7CiAJaWYgKCFJc1dpbmRvdzMyKGhXbmRDYWxsQmFjaykpIHJldHVybiBGQUxTRTsKLQlkcHJpbnRmX21tc3lzKHN0ZGRlYiwgIm1jaURyaXZlck5vdGlmeSAvLyBiZWZvcmUgUG9zdE1lc3NhZ2VcbiIpOworCWRwcmludGZfaW5mbyhtbXN5cywgIm1jaURyaXZlck5vdGlmeSAvLyBiZWZvcmUgUG9zdE1lc3NhZ2VcbiIpOwogCVBvc3RNZXNzYWdlMTYoIGhXbmRDYWxsQmFjaywgTU1fTUNJTk9USUZZLCB3U3RhdHVzLCAKICAgICAgICAgICAgICAgICAgICAgICAgTUFLRUxPTkcod0RldklELCAwKSk7CiAJcmV0dXJuIFRSVUU7CkBAIC0xMTU1LDIzICsxMTU0LDIzIEBACiAJRFdPUkQgZHdyZXQ7CiAKIAlscFBhcm1zID0gUFRSX1NFR19UT19MSU4obHAxNlBhcm1zKTsKLQlkcHJpbnRmX21tc3lzKHN0ZGRlYiwgIm1jaU9wZW4oJTA4bFgsICVwICglcCkpXG4iLCBkd1BhcmFtLCBscDE2UGFybXMsIGxwUGFybXMpOworCWRwcmludGZfaW5mbyhtbXN5cywgIm1jaU9wZW4oJTA4bFgsICVwICglcCkpXG4iLCBkd1BhcmFtLCBscDE2UGFybXMsIGxwUGFybXMpOwogCWlmIChscDE2UGFybXMgPT0gTlVMTCkgcmV0dXJuIE1DSUVSUl9JTlRFUk5BTDsKIAogCXdoaWxlKEdldERydih3RGV2SUQpLT5tb2RwLndUeXBlICE9IDApIHsKIAkJd0RldklEID0gTU1TWVNURU1fTmV4dERldklEKHdEZXZJRCk7CiAJCWlmICghTU1TWVNURU1fRGV2SURWYWxpZCh3RGV2SUQpKSB7Ci0JCQlkcHJpbnRmX21tc3lzKHN0ZGRlYiwgIk1DSV9PUEVOIC8vIE1BWE1DSURSSVZFUlMgcmVhY2hlZCAhXG4iKTsKKwkJCWRwcmludGZfaW5mbyhtbXN5cywgIk1DSV9PUEVOIC8vIE1BWE1DSURSSVZFUlMgcmVhY2hlZCAhXG4iKTsKIAkJCXJldHVybiBNQ0lFUlJfSU5URVJOQUw7CiAJCX0KIAl9Ci0JZHByaW50Zl9tbXN5cyhzdGRkZWIsICJtY2lPcGVuIC8vIHdEZXZJRD0lMDRYIFxuIiwgd0RldklEKTsKKwlkcHJpbnRmX2luZm8obW1zeXMsICJtY2lPcGVuIC8vIHdEZXZJRD0lMDRYIFxuIiwgd0RldklEKTsKIAltZW1jcHkoR2V0T3BlbkRydih3RGV2SUQpLGxwUGFybXMsc2l6ZW9mKCpscFBhcm1zKSk7CiAKIAlpZiAoZHdQYXJhbSAmIE1DSV9PUEVOX0VMRU1FTlQpIHsKIAkJY2hhcgkqcywqdDsKIAotCQlkcHJpbnRmX21tc3lzKHN0ZGRlYiwibWNpT3BlbiAvLyBscHN0ckVsZW1lbnROYW1lPSclcydcbiIsCisJCWRwcmludGZfaW5mbyhtbXN5cywibWNpT3BlbiAvLyBscHN0ckVsZW1lbnROYW1lPSclcydcbiIsCiAJCQkoY2hhciopUFRSX1NFR19UT19MSU4obHBQYXJtcy0+bHBzdHJFbGVtZW50TmFtZSkKIAkJKTsKIAkJcz0oY2hhciopUFRSX1NFR19UT19MSU4obHBQYXJtcy0+bHBzdHJFbGVtZW50TmFtZSk7CkBAIC0xMTc5LDcgKzExNzgsNyBAQAogCQlpZiAodCkgewogCQkJR2V0UHJvZmlsZVN0cmluZzMyQSgibWNpIGV4dGVuc2lvbnMiLHQrMSwiKiIsc3RyLHNpemVvZihzdHIpKTsKIAkJCUNoYXJVcHBlcjMyQShzdHIpOwotCQkJZHByaW50Zl9tbXN5cyhzdGRkZWIsICJtY2lPcGVuIC8vIHN0ciA9ICVzIFxuIiwgc3RyKTsKKwkJCWRwcmludGZfaW5mbyhtbXN5cywgIm1jaU9wZW4gLy8gc3RyID0gJXMgXG4iLCBzdHIpOwogCQkJaWYgKHN0cmNtcChzdHIsICJDREFVRElPIikgPT0gMCkgewogCQkJCXVEZXZUeXAgPSBNQ0lfREVWVFlQRV9DRF9BVURJTzsKIAkJCX0gZWxzZQpAQCAtMTE5Niw3ICsxMTk1LDcgQEAKIAkJCQl1RGV2VHlwID0gTUNJX0RFVlRZUEVfRElHSVRBTF9WSURFTzsKIAkJCX0gZWxzZSAKIAkJCWlmIChzdHJjbXAoc3RyLCIqIikgPT0gMCkgewotCQkJCWRwcmludGZfbW1zeXMoc3RkZGViLCJObyBbbWNpIGV4dGVuc2lvbnNdIGVudHJ5IGZvciAlcyBmb3VuZC5cbiIsdCk7CisJCQkJZHByaW50Zl9pbmZvKG1tc3lzLCJObyBbbWNpIGV4dGVuc2lvbnNdIGVudHJ5IGZvciAlcyBmb3VuZC5cbiIsdCk7CiAJCQkJcmV0dXJuIE1DSUVSUl9FWFRFTlNJT05fTk9UX0ZPVU5EOwogI2lmIHRlc3RpbmcxNgogCQkJfSBlbHNlICB7CkBAIC0xMjA5LDcgKzEyMDgsNyBAQAogCQkJCQlHZXREcnYod0RldklEKS0+ZHJpdmVycHJvYyA9IEdldFByb2NBZGRyZXNzMTYoaG1vZCxTRUdQVFJfR0VUKFNFR1BUUl9TVFJEVVAoIkRSSVZFUlBST0MiKSkpOwogCQkJCQl1RGV2VHlwID0gTUNJX0RFVlRZUEVfT1RIRVI7CiAJCQkJfSBlbHNlIHsKLQkJCQkJZHByaW50Zl9tbXN5cyhzdGRkZWIsIlttY2kgZXh0ZW5zaW9uc10gZW50cnkgJXMgZm9yICVzIG5vdCBzdXBwb3J0ZWQuXG4iLHN0cix0KTsKKwkJCQkJZHByaW50Zl9maXhtZShtbXN5cywgIlttY2kgZXh0ZW5zaW9uc10gZW50cnkgJXMgZm9yICVzIG5vdCBzdXBwb3J0ZWQuXG4iLHN0cix0KTsKIAkJCQkJcmV0dXJuIE1DSUVSUl9ERVZJQ0VfTk9UX0lOU1RBTExFRDsKIAkJCQl9CiAjZW5kaWYKQEAgLTEyMTksNyArMTIxOCw3IEBACiAJfQogCiAJaWYgKGR3UGFyYW0gJiBNQ0lfT1BFTl9BTElBUykgewotCQlkcHJpbnRmX21tc3lzKHN0ZGRlYiwgIk1DSV9PUEVOIC8vIEFsaWFzPSclcycgIVxuIiwKKwkJZHByaW50Zl9pbmZvKG1tc3lzLCAiTUNJX09QRU4gLy8gQWxpYXM9JyVzJyAhXG4iLAogCQkJKGNoYXIqKVBUUl9TRUdfVE9fTElOKGxwUGFybXMtPmxwc3RyQWxpYXMpKTsKICAgICAgICAgICAgICAgICBHZXRPcGVuRHJ2KHdEZXZJRCktPmxwc3RyQWxpYXMgPSAoTFBTVFIpU0VHUFRSX0dFVCgKICAgICAgICAgICAgICAgICAgICAgU0VHUFRSX1NUUkRVUCgoY2hhciopUFRSX1NFR19UT19MSU4obHBQYXJtcy0+bHBzdHJBbGlhcykpKTsKQEAgLTEyMjcsMTIgKzEyMjYsMTIgQEAKIAl9CiAJaWYgKGR3UGFyYW0gJiBNQ0lfT1BFTl9UWVBFKSB7CiAJCWlmIChkd1BhcmFtICYgTUNJX09QRU5fVFlQRV9JRCkgewotCQkJZHByaW50Zl9tbXN5cyhzdGRkZWIsICJNQ0lfT1BFTiAvLyBEZXY9JTA4bHghXG4iLCAoRFdPUkQpbHBQYXJtcy0+bHBzdHJEZXZpY2VUeXBlKTsKKwkJCWRwcmludGZfaW5mbyhtbXN5cywgIk1DSV9PUEVOIC8vIERldj0lMDhseCFcbiIsIChEV09SRClscFBhcm1zLT5scHN0ckRldmljZVR5cGUpOwogCQkJdURldlR5cCA9IExPV09SRCgoRFdPUkQpbHBQYXJtcy0+bHBzdHJEZXZpY2VUeXBlKTsKICAJCQlHZXRPcGVuRHJ2KHdEZXZJRCktPmxwc3RyRGV2aWNlVHlwZT0oTFBTVFIpbHBQYXJtcy0+bHBzdHJEZXZpY2VUeXBlOwogCQl9IGVsc2UgewogCQkJaWYgKGxwUGFybXMtPmxwc3RyRGV2aWNlVHlwZSA9PSBOVUxMKSByZXR1cm4gTUNJRVJSX0lOVEVSTkFMOwotCQkJZHByaW50Zl9tbXN5cyhzdGRkZWIsICJNQ0lfT1BFTiAvLyBEZXY9JyVzJyAhXG4iLAorCQkJZHByaW50Zl9pbmZvKG1tc3lzLCAiTUNJX09QRU4gLy8gRGV2PSclcycgIVxuIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChjaGFyKilQVFJfU0VHX1RPX0xJTihscFBhcm1zLT5scHN0ckRldmljZVR5cGUpKTsKICAgICAgICAgICAgICAgICAgICAgICAgIEdldE9wZW5EcnYod0RldklEKS0+bHBzdHJEZXZpY2VUeXBlPShMUFNUUilTRUdQVFJfR0VUKAogICAgICAgICAgICAgICBTRUdQVFJfU1RSRFVQKChjaGFyKilQVFJfU0VHX1RPX0xJTihscFBhcm1zLT5scHN0ckRldmljZVR5cGUpKSk7CkBAIC0xMjczLDcgKzEyNzIsNyBAQAogCUdldERydih3RGV2SUQpLT5tb2RwLndUeXBlID0gdURldlR5cDsKIAlHZXREcnYod0RldklEKS0+bW9kcC53RGV2aWNlSUQgPSAwOyAgLyogRklYTUU/IGZvciBtdWx0aXBsZSBkZXZpY2VzICovCiAJbHBQYXJtcy0+d0RldmljZUlEID0gd0RldklEOwotCWRwcmludGZfbW1zeXMoc3RkZGViLCAiTUNJX09QRU4gLy8gbWNpZGV2PSVkLCB1RGV2VHlwPSUwNFggd0RldmljZUlEPSUwNFggIVxuIiwgCisJZHByaW50Zl9pbmZvKG1tc3lzLCAiTUNJX09QRU4gLy8gbWNpZGV2PSVkLCB1RGV2VHlwPSUwNFggd0RldmljZUlEPSUwNFggIVxuIiwgCiAJCQkJd0RldklELCB1RGV2VHlwLCBscFBhcm1zLT53RGV2aWNlSUQpOwogCXN3aXRjaCh1RGV2VHlwKQogICAgICAgICB7CkBAIC0xMjk0LDEyICsxMjkzLDEyIEBACiAJCQkJICBkd1BhcmFtLCAoRFdPUkQpbHAxNlBhcm1zKTsKIAkgIGJyZWFrOwogICAgICAgICBjYXNlIE1DSV9ERVZUWVBFX0RJR0lUQUxfVklERU86Ci0JICBkcHJpbnRmX21tc3lzKHN0ZGRlYiwgIk1DSV9PUEVOIC8vIE5vIERJR0lUQUxfVklERU8geWV0ICFcbiIpOworCSAgZHByaW50Zl9pbmZvKG1tc3lzLCAiTUNJX09QRU4gLy8gTm8gRElHSVRBTF9WSURFTyB5ZXQgIVxuIik7CiAJICByZXR1cm4gTUNJRVJSX0RFVklDRV9OT1RfSU5TVEFMTEVEOwogICAgICAgICBkZWZhdWx0OgogI2lmIHRlc3RpbmcxNgogCSAgZHdyZXQgPSBDYWxsYmFja3MtPkNhbGxEcml2ZXJQcm9jKEdldERydih3RGV2SUQpLT5kcml2ZXJwcm9jLDAsR2V0RHJ2KHdEZXZJRCktPmhkcnYsTUNJX09QRU5fRFJJVkVSLGR3UGFyYW0sKERXT1JEKWxwMTZQYXJtcyk7Ci0JICBkcHJpbnRmX21tc3lzKHN0ZGRlYiwgIk1DSV9PUEVOIC8vIEludmFsaWQgRGV2aWNlIE5hbWUgJyUwOGx4JyAhXG4iLCAoRFdPUkQpbHBQYXJtcy0+bHBzdHJEZXZpY2VUeXBlKTsKKwkgIGRwcmludGZfd2FybihtbXN5cywgIk1DSV9PUEVOIC8vIEludmFsaWQgRGV2aWNlIE5hbWUgJyUwOGx4JyAhXG4iLCAoRFdPUkQpbHBQYXJtcy0+bHBzdHJEZXZpY2VUeXBlKTsKICNlbmRpZgogCSAgcmV0dXJuIE1DSUVSUl9JTlZBTElEX0RFVklDRV9OQU1FOwogICAgICAgICB9CkBAIC0xMzEwLDcgKzEzMDksNyBAQAogCQkJICAoZHdyZXQ9PTA/TUNJX05PVElGWV9TVUNDRVNTRlVMOk1DSV9OT1RJRllfRkFJTFVSRSkpOwogCiAJLyogb25seSBoYW5kbGVkIGRldmljZXMgZmFsbCB0aHJvdWdoICovCi0JZHByaW50Zl9tbXN5cyhzdGRkZWIsICJNQ0lfT1BFTiAvLyB3RGV2SUQgPSAlMDRYIHdEZXZpY2VJRCA9ICVkIGR3cmV0ID0gJWxkXG4iLHdEZXZJRCwgbHBQYXJtcy0+d0RldmljZUlELCBkd3JldCk7CisJZHByaW50Zl9pbmZvKG1tc3lzLCAiTUNJX09QRU4gLy8gd0RldklEID0gJTA0WCB3RGV2aWNlSUQgPSAlZCBkd3JldCA9ICVsZFxuIix3RGV2SUQsIGxwUGFybXMtPndEZXZpY2VJRCwgZHdyZXQpOwogCXJldHVybiBkd3JldDsKIH0KIApAQCAtMTMzNyw3ICsxMzM2LDcgQEAKIHsKIAlEV09SRAlkd1JldCA9IE1DSUVSUl9JTlRFUk5BTDsKIAotCWRwcmludGZfbW1zeXMoc3RkZGViLCAibWNpQ2xvc2UoJTA0eCwgJTA4bFgsICVwKVxuIiwgd0RldklELCBkd1BhcmFtLCBscFBhcm1zKTsKKwlkcHJpbnRmX2luZm8obW1zeXMsICJtY2lDbG9zZSglMDR4LCAlMDhsWCwgJXApXG4iLCB3RGV2SUQsIGR3UGFyYW0sIGxwUGFybXMpOwogCXN3aXRjaChHZXREcnYod0RldklEKS0+bW9kcC53VHlwZSkgewogCWNhc2UgTUNJX0RFVlRZUEVfQ0RfQVVESU86CiAJCWR3UmV0ID0gQ0RBVURJT19Ecml2ZXJQcm9jKEdldERydih3RGV2SUQpLT5tb2RwLndEZXZpY2VJRCwwLApAQCAtMTM2OSw3ICsxMzY4LDcgQEAKIAkgIG1jaURyaXZlck5vdGlmeShscFBhcm1zLT5kd0NhbGxiYWNrLHdEZXZJRCwKIAkJCSAgKGR3UmV0PT0wP01DSV9OT1RJRllfU1VDQ0VTU0ZVTDpNQ0lfTk9USUZZX0ZBSUxVUkUpKTsKIAotCWRwcmludGZfbW1zeXMoc3RkZGViLCAibWNpQ2xvc2UoKSAvLyByZXR1cm5zICVsZFxuIixkd1JldCk7CisJZHByaW50Zl9pbmZvKG1tc3lzLCAibWNpQ2xvc2UoKSAvLyByZXR1cm5zICVsZFxuIixkd1JldCk7CiAJcmV0dXJuIGR3UmV0OwogfQogCkBAIC0xMzg0LDIzICsxMzgzLDIzIEBACiAJTFBTVFIJbHBzdHJSZXR1cm47CiAJRFdPUkQJKmxwZHdSZXQ7CiAJTFBTVFIJU3lzRmlsZSA9ICJTWVNURU0uSU5JIjsKLQlkcHJpbnRmX21jaShzdGRkZWIsICJtY2lTeXNJbmZvKCUwOGxYLCAlMDhsWClcbiIsIGR3RmxhZ3MsIChEV09SRClscFBhcm1zKTsKKwlkcHJpbnRmX2luZm8obWNpLCAibWNpU3lzSW5mbyglMDhsWCwgJTA4bFgpXG4iLCBkd0ZsYWdzLCAoRFdPUkQpbHBQYXJtcyk7CiAJbHBzdHJSZXR1cm4gPSBQVFJfU0VHX1RPX0xJTihscFBhcm1zLT5scHN0clJldHVybik7CiAJc3dpdGNoKGR3RmxhZ3MpIHsKIAljYXNlIE1DSV9TWVNJTkZPX1FVQU5USVRZOgotCQlkcHJpbnRmX21jaShzdGRkZWIsICJtY2lTeXNJbmZvIC8vIE1DSV9TWVNJTkZPX1FVQU5USVRZIFxuIik7CisJCWRwcmludGZfaW5mbyhtY2ksICJtY2lTeXNJbmZvIC8vIE1DSV9TWVNJTkZPX1FVQU5USVRZIFxuIik7CiAJCWxwZHdSZXQgPSAoRFdPUkQgKilscHN0clJldHVybjsKIAkJKihscGR3UmV0KSA9IEluc3RhbGxlZENvdW50OwogCQlyZXR1cm4gMDsKIAljYXNlIE1DSV9TWVNJTkZPX0lOU1RBTExOQU1FOgotCQlkcHJpbnRmX21jaShzdGRkZWIsICJtY2lTeXNJbmZvIC8vIE1DSV9TWVNJTkZPX0lOU1RBTExOQU1FIFxuIik7CisJCWRwcmludGZfaW5mbyhtY2ksICJtY2lTeXNJbmZvIC8vIE1DSV9TWVNJTkZPX0lOU1RBTExOQU1FIFxuIik7CiAJCWlmIChscEluc3RhbGxOYW1lcyA9PSBOVUxMKSB7CiAJCQlJbnN0YWxsZWRDb3VudCA9IDA7CiAJCQlJbnN0YWxsZWRMaXN0TGVuID0gMDsKIAkJCXB0ciA9IGxwSW5zdGFsbE5hbWVzID0geG1hbGxvYygyMDQ4KTsKIAkJCUdldFByaXZhdGVQcm9maWxlU3RyaW5nMzJBKCJtY2kiLCBOVUxMLCAiIiwgbHBJbnN0YWxsTmFtZXMsIDIwMDAsIFN5c0ZpbGUpOwogCQkJd2hpbGUoc3RybGVuKHB0cikgPiAwKSB7Ci0JCQkJZHByaW50Zl9tY2koc3RkZGViLCAiLS0tPiAnJXMnIFxuIiwgcHRyKTsKKwkJCQlkcHJpbnRmX2luZm8obWNpLCAiLS0tPiAnJXMnIFxuIiwgcHRyKTsKIAkJCQlsZW4gPSBzdHJsZW4ocHRyKSArIDE7CiAJCQkJcHRyICs9IGxlbjsKIAkJCQlJbnN0YWxsZWRMaXN0TGVuICs9IGxlbjsKQEAgLTE0MTMsMTAgKzE0MTIsMTAgQEAKIAkJCXN0cmNweShscHN0clJldHVybiwgbHBJbnN0YWxsTmFtZXMpOwogCQlyZXR1cm4gMDsKIAljYXNlIE1DSV9TWVNJTkZPX05BTUU6Ci0JCWRwcmludGZfbWNpKHN0ZGRlYiwgIm1jaVN5c0luZm8gLy8gTUNJX1NZU0lORk9fTkFNRSBcbiIpOworCQlkcHJpbnRmX2luZm8obWNpLCAibWNpU3lzSW5mbyAvLyBNQ0lfU1lTSU5GT19OQU1FIFxuIik7CiAJCXJldHVybiAwOwogCWNhc2UgTUNJX1NZU0lORk9fT1BFTjoKLQkJZHByaW50Zl9tY2koc3RkZGViLCAibWNpU3lzSW5mbyAvLyBNQ0lfU1lTSU5GT19PUEVOIFxuIik7CisJCWRwcmludGZfaW5mbyhtY2ksICJtY2lTeXNJbmZvIC8vIE1DSV9TWVNJTkZPX09QRU4gXG4iKTsKIAkJcmV0dXJuIDA7CiAJfQogCXJldHVybiBNTVNZU0VSUl9JTlZBTFBBUkFNOwpAQCAtMTQ4Nyw3ICsxNDg2LDcgQEAKIHsKIAlpZiAobHBQYXJtcyA9PSBOVUxMKSByZXR1cm4gTUNJRVJSX0lOVEVSTkFMOwogCWlmIChkd1BhcmFtICYgTUNJX1NPVU5EX05BTUUpCi0JCWRwcmludGZfbWNpKHN0ZGRlYiwgIk1DSV9TT1VORCAvLyBmaWxlPSclcycgIVxuIiwgbHBQYXJtcy0+bHBzdHJTb3VuZE5hbWUpOworCQlkcHJpbnRmX2luZm8obWNpLCAiTUNJX1NPVU5EIC8vIGZpbGU9JyVzJyAhXG4iLCBscFBhcm1zLT5scHN0clNvdW5kTmFtZSk7CiAJcmV0dXJuIE1DSUVSUl9JTlZBTElEX0RFVklDRV9JRDsKIH0KICAqCkBAIC0xNTUyLDcgKzE1NTEsNyBAQAogICAgIAlMUE1DSV9PUEVOX1BBUk1TMzJBCWxwbW9wID0gKExQTUNJX09QRU5fUEFSTVMzMkEpZHdQYXJhbTI7CiAgICAgCWZwcmludGYoc3RkZXJyLCIJTUNJX09QRU4oJXMsJXMsJXMpXG4iLAogCQkoZHdQYXJhbTEmTUNJX09QRU5fVFlQRSkgICA/bHBtb3AtPmxwc3RyRGV2aWNlVHlwZToiPG51bGw+IiwKLQkJKGR3UGFyYW0xJk1DSV9PUEVOX0VMRU1FTlQpP2xwbW9wLT5scHN0ckVsZW1lbnROYW1lOiI8bnVsbD4iLAorCQkoZHdQYXJhbTEmTUNJX09QRU5fRUxFTUVOVCk/KEhJV09SRChscG1vcC0+bHBzdHJFbGVtZW50TmFtZSk/bHBtb3AtPmxwc3RyRWxlbWVudE5hbWU6IjxpZD4iKToiPG51bGw+IiwKIAkJKGR3UGFyYW0xJk1DSV9PUEVOX0FMSUFTKSAgP2xwbW9wLT5scHN0ckFsaWFzOiI8bnVsbD4iCiAJKTsKIAlicmVhazsKQEAgLTE1NjcsNyArMTU2Niw3IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRFdPUkQgZHdQYXJhbTIpCiB7CiAgICAgSERSVlIxNiBoRHJ2ID0gMDsKLSAgICBkcHJpbnRmX21jaShzdGRkZWIsICJtY2lTZW5kQ29tbWFuZCglMDRYLCAlcywgJTA4bFgsICUwOGxYKVxuIiwgCisgICAgZHByaW50Zl9pbmZvKG1jaSwgIm1jaVNlbmRDb21tYW5kKCUwNFgsICVzLCAlMDhsWCwgJTA4bFgpXG4iLCAKICAgICAgICAgICAgICAgICB3RGV2SUQsIF9tY2lDb21tYW5kVG9TdHJpbmcod01zZyksIGR3UGFyYW0xLCBkd1BhcmFtMik7CiAgICAgc3dpdGNoKHdNc2cpCiAgICAgewpAQCAtMTU5OSw3ICsxNTk4LDcgQEAKICAgICAgICAgZGVmYXVsdDoKIAkgICAgcmV0dXJuIENhbGxiYWNrcy0+Q2FsbERyaXZlclByb2MoR2V0RHJ2KHdEZXZJRCktPmRyaXZlcnByb2MsR2V0RHJ2KHdEZXZJRCktPm1vZHAud0RldmljZUlELEdldERydih3RGV2SUQpLT5oZHJ2LE1DSV9DTE9TRSxkd1BhcmFtMSxkd1BhcmFtMik7CiAKLSAgICAgICAgICAgIGRwcmludGZfbWNpKHN0ZGRlYiwKKyAgICAgICAgICAgIGRwcmludGZfd2FybihtY2ksCiAgICAgICAgICAgICAgICAgICAgICAgICAibWNpU2VuZENvbW1hbmQoKSAvLyB1bmtub3duIGRldmljZSB0eXBlPSUwNFggIVxuIiwgCiAgICAgICAgICAgICAgICAgICAgICAgICBHZXREcnYod0RldklEKS0+bW9kcC53VHlwZSk7CiAgICAgICAgIH0KQEAgLTE2MTQsNyArMTYxMyw3IEBACiB7CiAgICAgVUlOVDE2IHdEZXZJRDsKIAotICAgIGRwcmludGZfbWNpKHN0ZGRlYiwgIm1jaUdldERldmljZUlEKFwiJXNcIilcbiIsIGxwc3RyTmFtZSk7CisgICAgZHByaW50Zl9pbmZvKG1jaSwgIm1jaUdldERldmljZUlEKFwiJXNcIilcbiIsIGxwc3RyTmFtZSk7CiAgICAgaWYgKGxwc3RyTmFtZSAmJiAhbHN0cmNtcGkzMkEobHBzdHJOYW1lLCAiQUxMIikpCiAgICAgICAgIHJldHVybiBNQ0lfQUxMX0RFVklDRV9JRDsKIApAQCAtMTY4Myw5ICsxNjgyLDkgQEAKIFVJTlQxNiBXSU5BUEkgbWlkaU91dEdldE51bURldnMxNih2b2lkKQogewogCVVJTlQxNgljb3VudCA9IDA7Ci0JZHByaW50Zl9tbXN5cyhzdGRkZWIsICJtaWRpT3V0R2V0TnVtRGV2c1xuIik7CisJZHByaW50Zl9pbmZvKG1tc3lzLCAibWlkaU91dEdldE51bURldnNcbiIpOwogCWNvdW50ICs9IG1vZE1lc3NhZ2UoMCwgTU9ETV9HRVROVU1ERVZTLCAwTCwgMEwsIDBMKTsKLQlkcHJpbnRmX21tc3lzKHN0ZGRlYiwgIm1pZGlPdXRHZXROdW1EZXZzIHJldHVybiAldSBcbiIsIGNvdW50KTsKKwlkcHJpbnRmX2luZm8obW1zeXMsICJtaWRpT3V0R2V0TnVtRGV2cyByZXR1cm4gJXUgXG4iLCBjb3VudCk7CiAJcmV0dXJuIGNvdW50OwogfQogCkBAIC0xNzM1LDcgKzE3MzQsNyBAQAogICovCiBVSU5UMTYgV0lOQVBJIG1pZGlPdXRHZXREZXZDYXBzMTYoVUlOVDE2IHVEZXZpY2VJRCxMUE1JRElPVVRDQVBTMTYgbHBDYXBzLCBVSU5UMTYgdVNpemUpCiB7Ci0JZHByaW50Zl9tbXN5cyhzdGRkZWIsICJtaWRpT3V0R2V0RGV2Q2Fwc1xuIik7CisJZHByaW50Zl9pbmZvKG1tc3lzLCAibWlkaU91dEdldERldkNhcHNcbiIpOwogCXJldHVybiBtb2RNZXNzYWdlKHVEZXZpY2VJRCxNT0RNX0dFVERFVkNBUFMsMCwoRFdPUkQpbHBDYXBzLHVTaXplKTsKIH0KIApAQCAtMTc0NCw3ICsxNzQzLDcgQEAKICAqLwogVUlOVDMyIFdJTkFQSSBtaWRpT3V0R2V0RXJyb3JUZXh0MzJBKFVJTlQzMiB1RXJyb3IsIExQU1RSIGxwVGV4dCwgVUlOVDMyIHVTaXplKQogewotCWRwcmludGZfbW1zeXMoc3RkZGViLCAibWlkaU91dEdldEVycm9yVGV4dFxuIik7CisJZHByaW50Zl9pbmZvKG1tc3lzLCAibWlkaU91dEdldEVycm9yVGV4dFxuIik7CiAJcmV0dXJuIG1pZGlHZXRFcnJvclRleHQodUVycm9yLCBscFRleHQsIHVTaXplKTsKIH0KIApAQCAtMTc1NSw3ICsxNzU0LDggQEAKIHsKIAlMUFNUUgl4c3RyID0gSGVhcEFsbG9jKEdldFByb2Nlc3NIZWFwKCksMCx1U2l6ZSk7CiAJVUlOVDMyCXJldDsKLQlkcHJpbnRmX21tc3lzKHN0ZGRlYiwgIm1pZGlPdXRHZXRFcnJvclRleHRcbiIpOworCisJZHByaW50Zl9pbmZvKG1tc3lzLCAibWlkaU91dEdldEVycm9yVGV4dFxuIik7CiAJcmV0ID0gbWlkaUdldEVycm9yVGV4dCh1RXJyb3IsIHhzdHIsIHVTaXplKTsKIAlsc3RyY3B5QXRvVyhscFRleHQseHN0cik7CiAJSGVhcEZyZWUoR2V0UHJvY2Vzc0hlYXAoKSwwLHhzdHIpOwpAQCAtMTc2Niw3ICsxNzY2LDcgQEAKICAqLwogVUlOVDE2IFdJTkFQSSBtaWRpT3V0R2V0RXJyb3JUZXh0MTYoVUlOVDE2IHVFcnJvciwgTFBTVFIgbHBUZXh0LCBVSU5UMTYgdVNpemUpCiB7Ci0JZHByaW50Zl9tbXN5cyhzdGRkZWIsICJtaWRpT3V0R2V0RXJyb3JUZXh0XG4iKTsKKyAgICAgICAgZHByaW50Zl9pbmZvKG1tc3lzLCAibWlkaU91dEdldEVycm9yVGV4dFxuIik7CiAJcmV0dXJuIG1pZGlHZXRFcnJvclRleHQodUVycm9yLCBscFRleHQsIHVTaXplKTsKIH0KIApAQCAtMTgzOSwxMCArMTgzOSwxMCBAQAogCURXT1JECWR3UmV0ID0gMDsKIAlCT09MMzIJYk1hcHBlckZsZyA9IEZBTFNFOwogCWlmIChscGhNaWRpT3V0ICE9IE5VTEwpICpscGhNaWRpT3V0ID0gMDsKLQlkcHJpbnRmX21tc3lzKHN0ZGRlYiwgIm1pZGlPdXRPcGVuKCVwLCAlZCwgJTA4bFgsICUwOGxYLCAlMDhsWCk7XG4iLCAKKwlkcHJpbnRmX2luZm8obW1zeXMsICJtaWRpT3V0T3BlbiglcCwgJWQsICUwOGxYLCAlMDhsWCwgJTA4bFgpO1xuIiwgCiAJCWxwaE1pZGlPdXQsIHVEZXZpY2VJRCwgZHdDYWxsYmFjaywgZHdJbnN0YW5jZSwgZHdGbGFncyk7CiAJaWYgKHVEZXZpY2VJRCA9PSAoVUlOVDE2KU1JRElfTUFQUEVSKSB7Ci0JCWRwcmludGZfbW1zeXMoc3RkZGViLCAibWlkaU91dE9wZW4JLy8gTUlESV9NQVBQRVIgbW9kZSByZXF1ZXN0ZWQgIVxuIik7CisJCWRwcmludGZfaW5mbyhtbXN5cywgIm1pZGlPdXRPcGVuCS8vIE1JRElfTUFQUEVSIG1vZGUgcmVxdWVzdGVkICFcbiIpOwogCQliTWFwcGVyRmxnID0gVFJVRTsKIAkJdURldmljZUlEID0gMDsKIAl9CkBAIC0xODYwLDcgKzE4NjAsNyBAQAogCQlpZiAoZHdSZXQgPT0gTU1TWVNFUlJfTk9FUlJPUikgYnJlYWs7CiAJCWlmICghYk1hcHBlckZsZykgYnJlYWs7CiAJCXVEZXZpY2VJRCsrOwotCQlkcHJpbnRmX21tc3lzKHN0ZGRlYiwgIm1pZGlPdXRPcGVuCS8vIE1JRElfTUFQUEVSIG1vZGUgISB0cnkgbmV4dCBkcml2ZXIuLi5cbiIpOworCQlkcHJpbnRmX2luZm8obW1zeXMsICJtaWRpT3V0T3BlbgkvLyBNSURJX01BUFBFUiBtb2RlICEgdHJ5IG5leHQgZHJpdmVyLi4uXG4iKTsKIAl9CiAJcmV0dXJuIGR3UmV0OwogfQpAQCAtMTg3OSw3ICsxODc5LDcgQEAKIFVJTlQxNiBXSU5BUEkgbWlkaU91dENsb3NlMTYoSE1JRElPVVQxNiBoTWlkaU91dCkKIHsKIAlMUE1JRElPUEVOREVTQwlscERlc2M7Ci0JZHByaW50Zl9tbXN5cyhzdGRkZWIsICJtaWRpT3V0Q2xvc2UoJTA0WClcbiIsIGhNaWRpT3V0KTsKKwlkcHJpbnRmX2luZm8obW1zeXMsICJtaWRpT3V0Q2xvc2UoJTA0WClcbiIsIGhNaWRpT3V0KTsKIAlscERlc2MgPSAoTFBNSURJT1BFTkRFU0MpIFVTRVJfSEVBUF9MSU5fQUREUihoTWlkaU91dCk7CiAJaWYgKGxwRGVzYyA9PSBOVUxMKSByZXR1cm4gTU1TWVNFUlJfSU5WQUxIQU5ETEU7CiAJcmV0dXJuIG1vZE1lc3NhZ2UoMCwgTU9ETV9DTE9TRSwgbHBEZXNjLT5kd0luc3RhbmNlLCAwTCwgMEwpOwpAQCAtMTkwMSw3ICsxOTAxLDcgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNSURJSERSICogbHBNaWRpT3V0SGRyLCBVSU5UMTYgdVNpemUpCiB7CiAJTFBNSURJT1BFTkRFU0MJbHBEZXNjOwotCWRwcmludGZfbW1zeXMoc3RkZGViLCAibWlkaU91dFByZXBhcmVIZWFkZXIoJTA0WCwgJXAsICVkKVxuIiwgCisJZHByaW50Zl9pbmZvKG1tc3lzLCAibWlkaU91dFByZXBhcmVIZWFkZXIoJTA0WCwgJXAsICVkKVxuIiwgCiAJCQkJCWhNaWRpT3V0LCBscE1pZGlPdXRIZHIsIHVTaXplKTsKIAlscERlc2MgPSAoTFBNSURJT1BFTkRFU0MpIFVTRVJfSEVBUF9MSU5fQUREUihoTWlkaU91dCk7CiAJaWYgKGxwRGVzYyA9PSBOVUxMKSByZXR1cm4gTU1TWVNFUlJfSU5WQUxIQU5ETEU7CkBAIC0xOTI0LDcgKzE5MjQsNyBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1JRElIRFIgKiBscE1pZGlPdXRIZHIsIFVJTlQxNiB1U2l6ZSkKIHsKIAlMUE1JRElPUEVOREVTQwlscERlc2M7Ci0JZHByaW50Zl9tbXN5cyhzdGRkZWIsICJtaWRpT3V0VW5wcmVwYXJlSGVhZGVyKCUwNFgsICVwLCAlZClcbiIsIAorCWRwcmludGZfaW5mbyhtbXN5cywgIm1pZGlPdXRVbnByZXBhcmVIZWFkZXIoJTA0WCwgJXAsICVkKVxuIiwgCiAJCQkJCWhNaWRpT3V0LCBscE1pZGlPdXRIZHIsIHVTaXplKTsKIAlscERlc2MgPSAoTFBNSURJT1BFTkRFU0MpIFVTRVJfSEVBUF9MSU5fQUREUihoTWlkaU91dCk7CiAJaWYgKGxwRGVzYyA9PSBOVUxMKSByZXR1cm4gTU1TWVNFUlJfSU5WQUxIQU5ETEU7CkBAIC0xOTQ1LDcgKzE5NDUsNyBAQAogVUlOVDE2IFdJTkFQSSBtaWRpT3V0U2hvcnRNc2cxNihITUlESU9VVDE2IGhNaWRpT3V0LCBEV09SRCBkd01zZykKIHsKIAlMUE1JRElPUEVOREVTQwlscERlc2M7Ci0JZHByaW50Zl9tbXN5cyhzdGRkZWIsICJtaWRpT3V0U2hvcnRNc2coJTA0WCwgJTA4bFgpXG4iLCBoTWlkaU91dCwgZHdNc2cpOworCWRwcmludGZfaW5mbyhtbXN5cywgIm1pZGlPdXRTaG9ydE1zZyglMDRYLCAlMDhsWClcbiIsIGhNaWRpT3V0LCBkd01zZyk7CiAJbHBEZXNjID0gKExQTUlESU9QRU5ERVNDKSBVU0VSX0hFQVBfTElOX0FERFIoaE1pZGlPdXQpOwogCWlmIChscERlc2MgPT0gTlVMTCkgcmV0dXJuIE1NU1lTRVJSX0lOVkFMSEFORExFOwogCXJldHVybiBtb2RNZXNzYWdlKDAsIE1PRE1fREFUQSwgbHBEZXNjLT5kd0luc3RhbmNlLCBkd01zZywgMEwpOwpAQCAtMTk2Nyw3ICsxOTY3LDcgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNSURJSERSICogbHBNaWRpT3V0SGRyLCBVSU5UMTYgdVNpemUpCiB7CiAJTFBNSURJT1BFTkRFU0MJbHBEZXNjOwotCWRwcmludGZfbW1zeXMoc3RkZGViLCAibWlkaU91dExvbmdNc2coJTA0WCwgJXAsICVkKVxuIiwgCisJZHByaW50Zl9pbmZvKG1tc3lzLCAibWlkaU91dExvbmdNc2coJTA0WCwgJXAsICVkKVxuIiwgCiAJCQkJaE1pZGlPdXQsIGxwTWlkaU91dEhkciwgdVNpemUpOwogCWxwRGVzYyA9IChMUE1JRElPUEVOREVTQykgVVNFUl9IRUFQX0xJTl9BRERSKGhNaWRpT3V0KTsKIAlpZiAobHBEZXNjID09IE5VTEwpIHJldHVybiBNTVNZU0VSUl9JTlZBTEhBTkRMRTsKQEAgLTE5ODksNyArMTk4OSw3IEBACiBVSU5UMTYgV0lOQVBJIG1pZGlPdXRSZXNldDE2KEhNSURJT1VUMTYgaE1pZGlPdXQpCiB7CiAJTFBNSURJT1BFTkRFU0MJbHBEZXNjOwotCWRwcmludGZfbW1zeXMoc3RkZGViLCAibWlkaU91dFJlc2V0KCUwNFgpXG4iLCBoTWlkaU91dCk7CisJZHByaW50Zl9pbmZvKG1tc3lzLCAibWlkaU91dFJlc2V0KCUwNFgpXG4iLCBoTWlkaU91dCk7CiAJbHBEZXNjID0gKExQTUlESU9QRU5ERVNDKSBVU0VSX0hFQVBfTElOX0FERFIoaE1pZGlPdXQpOwogCWlmIChscERlc2MgPT0gTlVMTCkgcmV0dXJuIE1NU1lTRVJSX0lOVkFMSEFORExFOwogCXJldHVybiBtb2RNZXNzYWdlKDAsIE1PRE1fUkVTRVQsIGxwRGVzYy0+ZHdJbnN0YW5jZSwgMEwsIDBMKTsKQEAgLTIwMDcsNyArMjAwNyw3IEBACiAgKi8KIFVJTlQxNiBXSU5BUEkgbWlkaU91dEdldFZvbHVtZTE2KFVJTlQxNiB1RGV2aWNlSUQsIERXT1JEICogbHBkd1ZvbHVtZSkKIHsKLQlkcHJpbnRmX21tc3lzKHN0ZGRlYiwgIm1pZGlPdXRHZXRWb2x1bWUoJTA0WCwgJXApO1xuIiwgdURldmljZUlELCBscGR3Vm9sdW1lKTsKKwlkcHJpbnRmX2luZm8obW1zeXMsICJtaWRpT3V0R2V0Vm9sdW1lKCUwNFgsICVwKTtcbiIsIHVEZXZpY2VJRCwgbHBkd1ZvbHVtZSk7CiAJcmV0dXJuIG1vZE1lc3NhZ2UodURldmljZUlELCBNT0RNX0dFVFZPTFVNRSwgMEwsIChEV09SRClscGR3Vm9sdW1lLCAwTCk7CiB9CiAKQEAgLTIwMjQsNyArMjAyNCw3IEBACiAgKi8KIFVJTlQxNiBXSU5BUEkgbWlkaU91dFNldFZvbHVtZTE2KFVJTlQxNiB1RGV2aWNlSUQsIERXT1JEIGR3Vm9sdW1lKQogewotCWRwcmludGZfbW1zeXMoc3RkZGViLCAibWlkaU91dFNldFZvbHVtZSglMDRYLCAlMDhsWCk7XG4iLCB1RGV2aWNlSUQsIGR3Vm9sdW1lKTsKKwlkcHJpbnRmX2luZm8obW1zeXMsICJtaWRpT3V0U2V0Vm9sdW1lKCUwNFgsICUwOGxYKTtcbiIsIHVEZXZpY2VJRCwgZHdWb2x1bWUpOwogCXJldHVybiBtb2RNZXNzYWdlKHVEZXZpY2VJRCwgTU9ETV9TRVRWT0xVTUUsIDBMLCBkd1ZvbHVtZSwgMEwpOwogfQogCkBAIC0yMDg1LDcgKzIwODUsNyBAQAogICovCiBVSU5UMTYgV0lOQVBJIG1pZGlPdXRHZXRJRDE2KEhNSURJT1VUMTYgaE1pZGlPdXQsIFVJTlQxNiAqIGxwdURldmljZUlEKQogewotCWRwcmludGZfbW1zeXMoc3RkZGViLCAibWlkaU91dEdldElEXG4iKTsKKwlkcHJpbnRmX2luZm8obW1zeXMsICJtaWRpT3V0R2V0SURcbiIpOwogCXJldHVybiAwOwogfQogCkBAIC0yMDk3LDcgKzIwOTcsNyBAQAogewogCUxQTUlESU9QRU5ERVNDCWxwRGVzYzsKIAotCWRwcmludGZfbW1zeXMoc3RkZGViLCAibWlkaU91dE1lc3NhZ2UoJTA0WCwgJTA0WCwgJTA4bFgsICUwOGxYKVxuIiwgCisJZHByaW50Zl9pbmZvKG1tc3lzLCAibWlkaU91dE1lc3NhZ2UoJTA0WCwgJTA0WCwgJTA4bFgsICUwOGxYKVxuIiwgCiAJCQloTWlkaU91dCwgdU1lc3NhZ2UsIGR3UGFyYW0xLCBkd1BhcmFtMik7CiAJbHBEZXNjID0gKExQTUlESU9QRU5ERVNDKSBVU0VSX0hFQVBfTElOX0FERFIoaE1pZGlPdXQpOwogCWlmIChscERlc2MgPT0gTlVMTCkgcmV0dXJuIE1NU1lTRVJSX0lOVkFMSEFORExFOwpAQCAtMjEzNCw3ICsyMTM0LDcgQEAKIHsKIAlMUE1JRElPUEVOREVTQwlscERlc2M7CiAKLQlkcHJpbnRmX21tc3lzKHN0ZGRlYiwgIm1pZGlPdXRNZXNzYWdlKCUwNFgsICUwNFgsICUwOGxYLCAlMDhsWClcbiIsIAorCWRwcmludGZfaW5mbyhtbXN5cywgIm1pZGlPdXRNZXNzYWdlKCUwNFgsICUwNFgsICUwOGxYLCAlMDhsWClcbiIsIAogCQkJaE1pZGlPdXQsIHVNZXNzYWdlLCBkd1BhcmFtMSwgZHdQYXJhbTIpOwogCWxwRGVzYyA9IChMUE1JRElPUEVOREVTQykgVVNFUl9IRUFQX0xJTl9BRERSKGhNaWRpT3V0KTsKIAlpZiAobHBEZXNjID09IE5VTEwpIHJldHVybiBNTVNZU0VSUl9JTlZBTEhBTkRMRTsKQEAgLTIxNzksOSArMjE3OSw5IEBACiBVSU5UMTYgV0lOQVBJIG1pZGlJbkdldE51bURldnMxNih2b2lkKQogewogCVVJTlQxNgljb3VudCA9IDA7Ci0JZHByaW50Zl9tbXN5cyhzdGRkZWIsICJtaWRpSW5HZXROdW1EZXZzXG4iKTsKKwlkcHJpbnRmX2luZm8obW1zeXMsICJtaWRpSW5HZXROdW1EZXZzXG4iKTsKIAljb3VudCArPSBtaWRNZXNzYWdlKDAsIE1JRE1fR0VUTlVNREVWUywgMEwsIDBMLCAwTCk7Ci0JZHByaW50Zl9tbXN5cyhzdGRkZWIsICJtaWRpSW5HZXROdW1EZXZzIHJldHVybiAldSBcbiIsIGNvdW50KTsKKwlkcHJpbnRmX2luZm8obW1zeXMsICJtaWRpSW5HZXROdW1EZXZzIHJldHVybiAldSBcbiIsIGNvdW50KTsKIAlyZXR1cm4gY291bnQ7CiB9CiAKQEAgLTIyMjUsNyArMjIyNSw3IEBACiBVSU5UMTYgV0lOQVBJIG1pZGlJbkdldERldkNhcHMxNihVSU5UMTYgdURldmljZUlELAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExQTUlESUlOQ0FQUzE2IGxwQ2FwcywgVUlOVDE2IHVTaXplKQogewotCWRwcmludGZfbW1zeXMoc3RkZGViLCAibWlkaUluR2V0RGV2Q2Fwc1xuIik7CisJZHByaW50Zl9pbmZvKG1tc3lzLCAibWlkaUluR2V0RGV2Q2Fwc1xuIik7CiAJcmV0dXJuIG1pZE1lc3NhZ2UodURldmljZUlELE1JRE1fR0VUREVWQ0FQUywwLChEV09SRClscENhcHMsdVNpemUpOzsKIH0KIApAQCAtMjI1Myw3ICsyMjUzLDcgQEAKICAqLwogVUlOVDE2IFdJTkFQSSBtaWRpSW5HZXRFcnJvclRleHQxNihVSU5UMTYgdUVycm9yLCBMUFNUUiBscFRleHQsIFVJTlQxNiB1U2l6ZSkKIHsKLQlkcHJpbnRmX21tc3lzKHN0ZGRlYiwgIm1pZGlJbkdldEVycm9yVGV4dFxuIik7CisJZHByaW50Zl9pbmZvKG1tc3lzLCAibWlkaUluR2V0RXJyb3JUZXh0XG4iKTsKIAlyZXR1cm4gKG1pZGlHZXRFcnJvclRleHQodUVycm9yLCBscFRleHQsIHVTaXplKSk7CiB9CiAKQEAgLTIyODEsMTAgKzIyODEsMTAgQEAKIAlCT09MMzIJYk1hcHBlckZsZyA9IEZBTFNFOwogCiAJaWYgKGxwaE1pZGlJbiAhPSBOVUxMKSAqbHBoTWlkaUluID0gMDsKLQlkcHJpbnRmX21tc3lzKHN0ZGRlYiwgIm1pZGlJbk9wZW4oJXAsICVkLCAlMDhsWCwgJTA4bFgsICUwOGxYKTtcbiIsIAorCWRwcmludGZfaW5mbyhtbXN5cywgIm1pZGlJbk9wZW4oJXAsICVkLCAlMDhsWCwgJTA4bFgsICUwOGxYKTtcbiIsIAogCQlscGhNaWRpSW4sIHVEZXZpY2VJRCwgZHdDYWxsYmFjaywgZHdJbnN0YW5jZSwgZHdGbGFncyk7CiAJaWYgKHVEZXZpY2VJRCA9PSAoVUlOVDE2KU1JRElfTUFQUEVSKSB7Ci0JCWRwcmludGZfbW1zeXMoc3RkZGViLCAibWlkaUluT3BlbgkvLyBNSURJX01BUFBFUiBtb2RlIHJlcXVlc3RlZCAhXG4iKTsKKwkJZHByaW50Zl9pbmZvKG1tc3lzLCAibWlkaUluT3BlbgkvLyBNSURJX01BUFBFUiBtb2RlIHJlcXVlc3RlZCAhXG4iKTsKIAkJYk1hcHBlckZsZyA9IFRSVUU7CiAJCXVEZXZpY2VJRCA9IDA7CiAJfQpAQCAtMjMwMSw3ICsyMzAxLDcgQEAKIAkJaWYgKGR3UmV0ID09IE1NU1lTRVJSX05PRVJST1IpIGJyZWFrOwogCQlpZiAoIWJNYXBwZXJGbGcpIGJyZWFrOwogCQl1RGV2aWNlSUQrKzsKLQkJZHByaW50Zl9tbXN5cyhzdGRkZWIsICJtaWRpSW5PcGVuCS8vIE1JRElfTUFQUEVSIG1vZGUgISB0cnkgbmV4dCBkcml2ZXIuLi5cbiIpOworCQlkcHJpbnRmX2luZm8obW1zeXMsICJtaWRpSW5PcGVuCS8vIE1JRElfTUFQUEVSIG1vZGUgISB0cnkgbmV4dCBkcml2ZXIuLi5cbiIpOwogCX0KIAlyZXR1cm4gZHdSZXQ7CiB9CkBAIC0yMzIwLDcgKzIzMjAsNyBAQAogVUlOVDE2IFdJTkFQSSBtaWRpSW5DbG9zZTE2KEhNSURJSU4xNiBoTWlkaUluKQogewogCUxQTUlESU9QRU5ERVNDCWxwRGVzYzsKLQlkcHJpbnRmX21tc3lzKHN0ZGRlYiwgIm1pZGlJbkNsb3NlKCUwNFgpXG4iLCBoTWlkaUluKTsKKwlkcHJpbnRmX2luZm8obW1zeXMsICJtaWRpSW5DbG9zZSglMDRYKVxuIiwgaE1pZGlJbik7CiAJbHBEZXNjID0gKExQTUlESU9QRU5ERVNDKSBVU0VSX0hFQVBfTElOX0FERFIoaE1pZGlJbik7CiAJaWYgKGxwRGVzYyA9PSBOVUxMKSByZXR1cm4gTU1TWVNFUlJfSU5WQUxIQU5ETEU7CiAJcmV0dXJuIG1pZE1lc3NhZ2UoMCwgTUlETV9DTE9TRSwgbHBEZXNjLT5kd0luc3RhbmNlLCAwTCwgMEwpOwpAQCAtMjM0Miw3ICsyMzQyLDcgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1JRElIRFIgKiBscE1pZGlJbkhkciwgVUlOVDE2IHVTaXplKQogewogCUxQTUlESU9QRU5ERVNDCWxwRGVzYzsKLQlkcHJpbnRmX21tc3lzKHN0ZGRlYiwgIm1pZGlJblByZXBhcmVIZWFkZXIoJTA0WCwgJXAsICVkKVxuIiwgCisJZHByaW50Zl9pbmZvKG1tc3lzLCAibWlkaUluUHJlcGFyZUhlYWRlciglMDRYLCAlcCwgJWQpXG4iLCAKIAkJCQkJaE1pZGlJbiwgbHBNaWRpSW5IZHIsIHVTaXplKTsKIAlscERlc2MgPSAoTFBNSURJT1BFTkRFU0MpIFVTRVJfSEVBUF9MSU5fQUREUihoTWlkaUluKTsKIAlpZiAobHBEZXNjID09IE5VTEwpIHJldHVybiBNTVNZU0VSUl9JTlZBTEhBTkRMRTsKQEAgLTIzNjYsNyArMjM2Niw3IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1JRElIRFIgKiBscE1pZGlJbkhkciwgVUlOVDE2IHVTaXplKQogewogCUxQTUlESU9QRU5ERVNDCWxwRGVzYzsKLQlkcHJpbnRmX21tc3lzKHN0ZGRlYiwgIm1pZGlJblVucHJlcGFyZUhlYWRlciglMDRYLCAlcCwgJWQpXG4iLCAKKwlkcHJpbnRmX2luZm8obW1zeXMsICJtaWRpSW5VbnByZXBhcmVIZWFkZXIoJTA0WCwgJXAsICVkKVxuIiwgCiAJCQkJCWhNaWRpSW4sIGxwTWlkaUluSGRyLCB1U2l6ZSk7CiAJbHBEZXNjID0gKExQTUlESU9QRU5ERVNDKSBVU0VSX0hFQVBfTElOX0FERFIoaE1pZGlJbik7CiAJaWYgKGxwRGVzYyA9PSBOVUxMKSByZXR1cm4gTU1TWVNFUlJfSU5WQUxIQU5ETEU7CkBAIC0yMzg5LDcgKzIzODksNyBAQAogVUlOVDE2IFdJTkFQSSBtaWRpSW5BZGRCdWZmZXIxNihITUlESUlOMTYgaE1pZGlJbiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTUlESUhEUiAqIGxwTWlkaUluSGRyLCBVSU5UMTYgdVNpemUpCiB7Ci0JZHByaW50Zl9tbXN5cyhzdGRkZWIsICJtaWRpSW5BZGRCdWZmZXJcbiIpOworCWRwcmludGZfaW5mbyhtbXN5cywgIm1pZGlJbkFkZEJ1ZmZlclxuIik7CiAJcmV0dXJuIDA7CiB9CiAKQEAgLTI0MDYsNyArMjQwNiw3IEBACiAgKi8KIFVJTlQxNiBXSU5BUEkgbWlkaUluU3RhcnQxNihITUlESUlOMTYgaE1pZGlJbikKIHsKLQlkcHJpbnRmX21tc3lzKHN0ZGRlYiwgIm1pZGlJblN0YXJ0XG4iKTsKKwlkcHJpbnRmX2luZm8obW1zeXMsICJtaWRpSW5TdGFydFxuIik7CiAJcmV0dXJuIDA7CiB9CiAKQEAgLTI0MjMsNyArMjQyMyw3IEBACiAgKi8KIFVJTlQxNiBXSU5BUEkgbWlkaUluU3RvcDE2KEhNSURJSU4xNiBoTWlkaUluKQogewotCWRwcmludGZfbW1zeXMoc3RkZGViLCAibWlkaUluU3RvcFxuIik7CisJZHByaW50Zl9pbmZvKG1tc3lzLCAibWlkaUluU3RvcFxuIik7CiAJcmV0dXJuIDA7CiB9CiAKQEAgLTI0NDAsNyArMjQ0MCw3IEBACiAgKi8KIFVJTlQxNiBXSU5BUEkgbWlkaUluUmVzZXQxNihITUlESUlOMTYgaE1pZGlJbikKIHsKLQlkcHJpbnRmX21tc3lzKHN0ZGRlYiwgIm1pZGlJblJlc2V0XG4iKTsKKwlkcHJpbnRmX2luZm8obW1zeXMsICJtaWRpSW5SZXNldFxuIik7CiAJcmV0dXJuIDA7CiB9CiAKQEAgLTI0NDksNyArMjQ0OSw3IEBACiAgKi8KIFVJTlQzMiBXSU5BUEkgbWlkaUluR2V0SUQzMihITUlESUlOMzIgaE1pZGlJbiwgVUlOVDMyICogbHB1RGV2aWNlSUQpCiB7Ci0JZHByaW50Zl9tbXN5cyhzdGRkZWIsICJtaWRpSW5HZXRJRFxuIik7CisJZHByaW50Zl9pbmZvKG1tc3lzLCAibWlkaUluR2V0SURcbiIpOwogCXJldHVybiAwOwogfQogCkBAIC0yNDU4LDcgKzI0NTgsNyBAQAogICovCiBVSU5UMTYgV0lOQVBJIG1pZGlJbkdldElEMTYoSE1JRElJTjE2IGhNaWRpSW4sIFVJTlQxNiAqIGxwdURldmljZUlEKQogewotCWRwcmludGZfbW1zeXMoc3RkZGViLCAibWlkaUluR2V0SURcbiIpOworCWRwcmludGZfaW5mbyhtbXN5cywgIm1pZGlJbkdldElEXG4iKTsKIAlyZXR1cm4gMDsKIH0KIApAQCAtMjQ2OSw3ICsyNDY5LDcgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRFdPUkQgZHdQYXJhbTEsIERXT1JEIGR3UGFyYW0yKQogewogCUxQTUlESU9QRU5ERVNDCWxwRGVzYzsKLQlkcHJpbnRmX21tc3lzKHN0ZGRlYiwgIm1pZGlJbk1lc3NhZ2UoJTA0WCwgJTA0WCwgJTA4bFgsICUwOGxYKVxuIiwgCisJZHByaW50Zl9pbmZvKG1tc3lzLCAibWlkaUluTWVzc2FnZSglMDRYLCAlMDRYLCAlMDhsWCwgJTA4bFgpXG4iLCAKIAkJCWhNaWRpSW4sIHVNZXNzYWdlLCBkd1BhcmFtMSwgZHdQYXJhbTIpOwogCWxwRGVzYyA9IChMUE1JRElPUEVOREVTQykgVVNFUl9IRUFQX0xJTl9BRERSKGhNaWRpSW4pOwogCWlmIChscERlc2MgPT0gTlVMTCkgcmV0dXJuIE1NU1lTRVJSX0lOVkFMSEFORExFOwpAQCAtMjUwOCw3ICsyNTA4LDcgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRFdPUkQgZHdQYXJhbTEsIERXT1JEIGR3UGFyYW0yKQogewogCUxQTUlESU9QRU5ERVNDCWxwRGVzYzsKLQlkcHJpbnRmX21tc3lzKHN0ZGRlYiwgIm1pZGlJbk1lc3NhZ2UoJTA0WCwgJTA0WCwgJTA4bFgsICUwOGxYKVxuIiwgCisJZHByaW50Zl9pbmZvKG1tc3lzLCAibWlkaUluTWVzc2FnZSglMDRYLCAlMDRYLCAlMDhsWCwgJTA4bFgpXG4iLCAKIAkJCWhNaWRpSW4sIHVNZXNzYWdlLCBkd1BhcmFtMSwgZHdQYXJhbTIpOwogCWxwRGVzYyA9IChMUE1JRElPUEVOREVTQykgVVNFUl9IRUFQX0xJTl9BRERSKGhNaWRpSW4pOwogCWlmIChscERlc2MgPT0gTlVMTCkgcmV0dXJuIE1NU1lTRVJSX0lOVkFMSEFORExFOwpAQCAtMjU1NCw5ICsyNTU0LDkgQEAKIFVJTlQxNiBXSU5BUEkgd2F2ZU91dEdldE51bURldnMxNigpCiB7CiAJVUlOVDE2CWNvdW50ID0gMDsKLQlkcHJpbnRmX21tc3lzKHN0ZGRlYiwgIndhdmVPdXRHZXROdW1EZXZzXG4iKTsKKwlkcHJpbnRmX2luZm8obW1zeXMsICJ3YXZlT3V0R2V0TnVtRGV2c1xuIik7CiAJY291bnQgKz0gd29kTWVzc2FnZSggTU1TWVNURU1fRmlyc3REZXZJRCgpLCBXT0RNX0dFVE5VTURFVlMsIDBMLCAwTCwgMEwpOwotCWRwcmludGZfbW1zeXMoc3RkZGViLCAid2F2ZU91dEdldE51bURldnMgcmV0dXJuICV1IFxuIiwgY291bnQpOworCWRwcmludGZfaW5mbyhtbXN5cywgIndhdmVPdXRHZXROdW1EZXZzIHJldHVybiAldSBcbiIsIGNvdW50KTsKIAlyZXR1cm4gY291bnQ7CiB9CiAKQEAgLTI1NjgsNyArMjU2OCw3IEBACiB7CiAJaWYgKHVEZXZpY2VJRCA+IHdhdmVPdXRHZXROdW1EZXZzMTYoKSAtIDEpIHJldHVybiBNTVNZU0VSUl9CQURERVZJQ0VJRDsKIAlpZiAodURldmljZUlEID09IChVSU5UMTYpV0FWRV9NQVBQRVIpIHJldHVybiBNTVNZU0VSUl9CQURERVZJQ0VJRDsgLyogRklYTUU6IGRvIHdlIGhhdmUgYSB3YXZlIG1hcHBlciA/ICovCi0JZHByaW50Zl9tbXN5cyhzdGRkZWIsICJ3YXZlT3V0R2V0RGV2Q2Fwc1xuIik7CisJZHByaW50Zl9pbmZvKG1tc3lzLCAid2F2ZU91dEdldERldkNhcHNcbiIpOwogCXJldHVybiB3b2RNZXNzYWdlKHVEZXZpY2VJRCwgV09ETV9HRVRERVZDQVBTLCAwTCwgKERXT1JEKWxwQ2FwcywgdVNpemUpOwogfQogCkBAIC0yNjE1LDcgKzI2MTUsNyBAQAogICovCiBVSU5UMTYgV0lOQVBJIHdhdmVPdXRHZXRFcnJvclRleHQxNihVSU5UMTYgdUVycm9yLCBMUFNUUiBscFRleHQsIFVJTlQxNiB1U2l6ZSkKIHsKLQlkcHJpbnRmX21tc3lzKHN0ZGRlYiwgIndhdmVPdXRHZXRFcnJvclRleHRcbiIpOworCWRwcmludGZfaW5mbyhtbXN5cywgIndhdmVPdXRHZXRFcnJvclRleHRcbiIpOwogCXJldHVybih3YXZlR2V0RXJyb3JUZXh0KHVFcnJvciwgbHBUZXh0LCB1U2l6ZSkpOwogfQogCkBAIC0yNjQ3LDcgKzI2NDcsOCBAQAogc3RhdGljIFVJTlQxNiB3YXZlR2V0RXJyb3JUZXh0KFVJTlQxNiB1RXJyb3IsIExQU1RSIGxwVGV4dCwgVUlOVDE2IHVTaXplKQogewogCUxQU1RSCW1zZ3B0cjsKLQlkcHJpbnRmX21tc3lzKHN0ZGRlYiwgIndhdmVHZXRFcnJvclRleHQoJTA0WCwgJXAsICVkKTtcbiIsIHVFcnJvciwgbHBUZXh0LCB1U2l6ZSk7CisJZHByaW50Zl9pbmZvKG1tc3lzLCAid2F2ZUdldEVycm9yVGV4dCglMDRYLCAlcCwgJWQpO1xuIiwgCisJICAgICAgIHVFcnJvciwgbHBUZXh0LCB1U2l6ZSk7CiAJaWYgKChscFRleHQgPT0gTlVMTCkgfHwgKHVTaXplIDwgMSkpIHJldHVybihGQUxTRSk7CiAJbHBUZXh0WzBdID0gJ1wwJzsKIAlzd2l0Y2godUVycm9yKSB7CkBAIC0yNzMyLDEyICsyNzMzLDEyIEBACiAJRFdPUkQJCWR3UmV0ID0gMDsKIAlCT09MMzIJCWJNYXBwZXJGbGcgPSBGQUxTRTsKIAotCWRwcmludGZfbW1zeXMoc3RkZGViLCAid2F2ZU91dE9wZW4oJXAsICVkLCAlcCwgJTA4bFgsICUwOGxYLCAlMDhsWCk7XG4iLCAKKwlkcHJpbnRmX2luZm8obW1zeXMsICJ3YXZlT3V0T3BlbiglcCwgJWQsICVwLCAlMDhsWCwgJTA4bFgsICUwOGxYKTtcbiIsIAogCQlscGhXYXZlT3V0LCB1RGV2aWNlSUQsIGxwRm9ybWF0LCBkd0NhbGxiYWNrLCBkd0luc3RhbmNlLCBkd0ZsYWdzKTsKIAlpZiAoZHdGbGFncyAmIFdBVkVfRk9STUFUX1FVRVJZKQotCQlkcHJpbnRmX21tc3lzKHN0ZGRlYiwgIndhdmVPdXRPcGVuCS8vIFdBVkVfRk9STUFUX1FVRVJZIHJlcXVlc3RlZCAhXG4iKTsKKwkJZHByaW50Zl9pbmZvKG1tc3lzLCAid2F2ZU91dE9wZW4JLy8gV0FWRV9GT1JNQVRfUVVFUlkgcmVxdWVzdGVkICFcbiIpOwogCWlmICh1RGV2aWNlSUQgPT0gKFVJTlQxNilXQVZFX01BUFBFUikgewotCQlkcHJpbnRmX21tc3lzKHN0ZGRlYiwgIndhdmVPdXRPcGVuCS8vIFdBVkVfTUFQUEVSIG1vZGUgcmVxdWVzdGVkICFcbiIpOworCQlkcHJpbnRmX2luZm8obW1zeXMsICJ3YXZlT3V0T3BlbgkvLyBXQVZFX01BUFBFUiBtb2RlIHJlcXVlc3RlZCAhXG4iKTsKIAkJYk1hcHBlckZsZyA9IFRSVUU7CiAJCXVEZXZpY2VJRCA9IDA7CiAJfQpAQCAtMjc1OSwxMSArMjc2MCwxMSBAQAogCQlpZiAoZHdSZXQgPT0gTU1TWVNFUlJfTk9FUlJPUikgYnJlYWs7CiAJCWlmICghYk1hcHBlckZsZykgYnJlYWs7CiAJCXVEZXZpY2VJRCsrOwotCQlkcHJpbnRmX21tc3lzKHN0ZGRlYiwgIndhdmVPdXRPcGVuCS8vIFdBVkVfTUFQUEVSIG1vZGUgISB0cnkgbmV4dCBkcml2ZXIuLi5cbiIpOworCQlkcHJpbnRmX2luZm8obW1zeXMsICJ3YXZlT3V0T3BlbgkvLyBXQVZFX01BUFBFUiBtb2RlICEgdHJ5IG5leHQgZHJpdmVyLi4uXG4iKTsKIAl9CiAJbHBEZXNjLT51RGV2aWNlSUQgPSB1RGV2aWNlSUQ7ICAvKiBzYXZlIHBoeXNpY2FsIERldmljZSBJRCAqLwogCWlmIChkd0ZsYWdzICYgV0FWRV9GT1JNQVRfUVVFUlkpIHsKLQkJZHByaW50Zl9tbXN5cyhzdGRkZWIsICJ3YXZlT3V0T3BlbgkvLyBFbmQgb2YgV0FWRV9GT1JNQVRfUVVFUlkgIVxuIik7CisJCWRwcmludGZfaW5mbyhtbXN5cywgIndhdmVPdXRPcGVuCS8vIEVuZCBvZiBXQVZFX0ZPUk1BVF9RVUVSWSAhXG4iKTsKIAkJZHdSZXQgPSB3YXZlT3V0Q2xvc2UzMihoV2F2ZU91dCk7CiAJfQogCXJldHVybiBkd1JldDsKQEAgLTI3ODMsNyArMjc4NCw3IEBACiB7CiAJTFBXQVZFT1BFTkRFU0MJbHBEZXNjOwogCi0JZHByaW50Zl9tbXN5cyhzdGRkZWIsICJ3YXZlT3V0Q2xvc2UoJTA0WClcbiIsIGhXYXZlT3V0KTsKKwlkcHJpbnRmX2luZm8obW1zeXMsICJ3YXZlT3V0Q2xvc2UoJTA0WClcbiIsIGhXYXZlT3V0KTsKIAlscERlc2MgPSAoTFBXQVZFT1BFTkRFU0MpIFVTRVJfSEVBUF9MSU5fQUREUihoV2F2ZU91dCk7CiAJaWYgKGxwRGVzYyA9PSBOVUxMKSByZXR1cm4gTU1TWVNFUlJfSU5WQUxIQU5ETEU7CiAJcmV0dXJuIHdvZE1lc3NhZ2UoIGxwRGVzYy0+dURldmljZUlELCBXT0RNX0NMT1NFLCBscERlc2MtPmR3SW5zdGFuY2UsIDBMLCAwTCk7CkBAIC0yNzk3LDcgKzI3OTgsNyBAQAogewogCUxQV0FWRU9QRU5ERVNDCWxwRGVzYzsKIAotCWRwcmludGZfbW1zeXMoc3RkZGViLCAid2F2ZU91dFByZXBhcmVIZWFkZXIoJTA0WCwgJXAsICV1KTtcbiIsIAorCWRwcmludGZfaW5mbyhtbXN5cywgIndhdmVPdXRQcmVwYXJlSGVhZGVyKCUwNFgsICVwLCAldSk7XG4iLCAKIAkJCQkJaFdhdmVPdXQsIGxwV2F2ZU91dEhkciwgdVNpemUpOwogCWxwRGVzYyA9IChMUFdBVkVPUEVOREVTQykgVVNFUl9IRUFQX0xJTl9BRERSKGhXYXZlT3V0KTsKIAlpZiAobHBEZXNjID09IE5VTEwpIHJldHVybiBNTVNZU0VSUl9JTlZBTEhBTkRMRTsKQEAgLTI4MTQsNyArMjgxNSw3IEBACiAJTFBCWVRFCQlzYXZlZGRhdGEgPSBscFdhdmVPdXRIZHItPmxwRGF0YTsKIAlVSU5UMTYJCXJldDsKIAotCWRwcmludGZfbW1zeXMoc3RkZGViLCAid2F2ZU91dFByZXBhcmVIZWFkZXIoJTA0WCwgJXAsICV1KTtcbiIsIAorCWRwcmludGZfaW5mbyhtbXN5cywgIndhdmVPdXRQcmVwYXJlSGVhZGVyKCUwNFgsICVwLCAldSk7XG4iLCAKIAkJCQkJaFdhdmVPdXQsIGxwV2F2ZU91dEhkciwgdVNpemUpOwogCWxwRGVzYyA9IChMUFdBVkVPUEVOREVTQykgVVNFUl9IRUFQX0xJTl9BRERSKGhXYXZlT3V0KTsKIAlpZiAobHBEZXNjID09IE5VTEwpIHJldHVybiBNTVNZU0VSUl9JTlZBTEhBTkRMRTsKQEAgLTI4MzMsNyArMjgzNCw3IEBACiB7CiAJTFBXQVZFT1BFTkRFU0MJbHBEZXNjOwogCi0JZHByaW50Zl9tbXN5cyhzdGRkZWIsICJ3YXZlT3V0VW5wcmVwYXJlSGVhZGVyKCUwNFgsICVwLCAldSk7XG4iLCAKKwlkcHJpbnRmX2luZm8obW1zeXMsICJ3YXZlT3V0VW5wcmVwYXJlSGVhZGVyKCUwNFgsICVwLCAldSk7XG4iLCAKIAkJCQkJCWhXYXZlT3V0LCBscFdhdmVPdXRIZHIsIHVTaXplKTsKIAlscERlc2MgPSAoTFBXQVZFT1BFTkRFU0MpIFVTRVJfSEVBUF9MSU5fQUREUihoV2F2ZU91dCk7CiAJaWYgKGxwRGVzYyA9PSBOVUxMKSByZXR1cm4gTU1TWVNFUlJfSU5WQUxIQU5ETEU7CkBAIC0yODUwLDcgKzI4NTEsNyBAQAogCUxQQllURQkJc2F2ZWRkYXRhID0gbHBXYXZlT3V0SGRyLT5scERhdGE7CiAJVUlOVDE2CQlyZXQ7CiAKLQlkcHJpbnRmX21tc3lzKHN0ZGRlYiwgIndhdmVPdXRVbnByZXBhcmVIZWFkZXIoJTA0WCwgJXAsICV1KTtcbiIsIAorCWRwcmludGZfaW5mbyhtbXN5cywgIndhdmVPdXRVbnByZXBhcmVIZWFkZXIoJTA0WCwgJXAsICV1KTtcbiIsIAogCQkJCQkJaFdhdmVPdXQsIGxwV2F2ZU91dEhkciwgdVNpemUpOwogCWxwRGVzYyA9IChMUFdBVkVPUEVOREVTQykgVVNFUl9IRUFQX0xJTl9BRERSKGhXYXZlT3V0KTsKIAlpZiAobHBEZXNjID09IE5VTEwpIHJldHVybiBNTVNZU0VSUl9JTlZBTEhBTkRMRTsKQEAgLTI4NjgsNyArMjg2OSw3IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFVJTlQzMiB1U2l6ZSkKIHsKIAlMUFdBVkVPUEVOREVTQwlscERlc2M7Ci0JZHByaW50Zl9tbXN5cyhzdGRkZWIsICJ3YXZlT3V0V3JpdGUoJTA0WCwgJXAsICV1KTtcbiIsIGhXYXZlT3V0LCBscFdhdmVPdXRIZHIsIHVTaXplKTsKKwlkcHJpbnRmX2luZm8obW1zeXMsICJ3YXZlT3V0V3JpdGUoJTA0WCwgJXAsICV1KTtcbiIsIGhXYXZlT3V0LCBscFdhdmVPdXRIZHIsIHVTaXplKTsKIAlscERlc2MgPSAoTFBXQVZFT1BFTkRFU0MpIFVTRVJfSEVBUF9MSU5fQUREUihoV2F2ZU91dCk7CiAJaWYgKGxwRGVzYyA9PSBOVUxMKSByZXR1cm4gTU1TWVNFUlJfSU5WQUxIQU5ETEU7CiAJbHBXYXZlT3V0SGRyLT5yZXNlcnZlZCA9IChEV09SRClscFdhdmVPdXRIZHItPmxwRGF0YTsKQEAgLTI4ODMsNyArMjg4NCw3IEBACiAJTFBXQVZFT1BFTkRFU0MJbHBEZXNjOwogCVVJTlQxNgkJcmV0OwogCi0JZHByaW50Zl9tbXN5cyhzdGRkZWIsICJ3YXZlT3V0V3JpdGUoJTA0WCwgJXAsICV1KTtcbiIsIGhXYXZlT3V0LCBscFdhdmVPdXRIZHIsIHVTaXplKTsKKwlkcHJpbnRmX2luZm8obW1zeXMsICJ3YXZlT3V0V3JpdGUoJTA0WCwgJXAsICV1KTtcbiIsIGhXYXZlT3V0LCBscFdhdmVPdXRIZHIsIHVTaXplKTsKIAlscERlc2MgPSAoTFBXQVZFT1BFTkRFU0MpIFVTRVJfSEVBUF9MSU5fQUREUihoV2F2ZU91dCk7CiAJaWYgKGxwRGVzYyA9PSBOVUxMKSByZXR1cm4gTU1TWVNFUlJfSU5WQUxIQU5ETEU7CiAJbHBXYXZlT3V0SGRyLT5yZXNlcnZlZD0oRFdPUkQpbHBXYXZlT3V0SGRyLT5scERhdGE7LypzYXZlIG9yaWdpbmFsIHB0ciovCkBAIC0yOTA4LDcgKzI5MDksNyBAQAogewogCUxQV0FWRU9QRU5ERVNDCWxwRGVzYzsKIAotCWRwcmludGZfbW1zeXMoc3RkZGViLCAid2F2ZU91dFBhdXNlKCUwNFgpXG4iLCBoV2F2ZU91dCk7CisJZHByaW50Zl9pbmZvKG1tc3lzLCAid2F2ZU91dFBhdXNlKCUwNFgpXG4iLCBoV2F2ZU91dCk7CiAJbHBEZXNjID0gKExQV0FWRU9QRU5ERVNDKSBVU0VSX0hFQVBfTElOX0FERFIoaFdhdmVPdXQpOwogCWlmIChscERlc2MgPT0gTlVMTCkgcmV0dXJuIE1NU1lTRVJSX0lOVkFMSEFORExFOwogCXJldHVybiB3b2RNZXNzYWdlKCBscERlc2MtPnVEZXZpY2VJRCwgV09ETV9QQVVTRSwgbHBEZXNjLT5kd0luc3RhbmNlLCAwTCwgMEwpOwpAQCAtMjkyOCw3ICsyOTI5LDcgQEAKIHsKIAlMUFdBVkVPUEVOREVTQwlscERlc2M7CiAKLQlkcHJpbnRmX21tc3lzKHN0ZGRlYiwgIndhdmVPdXRSZXN0YXJ0KCUwNFgpXG4iLCBoV2F2ZU91dCk7CisJZHByaW50Zl9pbmZvKG1tc3lzLCAid2F2ZU91dFJlc3RhcnQoJTA0WClcbiIsIGhXYXZlT3V0KTsKIAlscERlc2MgPSAoTFBXQVZFT1BFTkRFU0MpIFVTRVJfSEVBUF9MSU5fQUREUihoV2F2ZU91dCk7CiAJaWYgKGxwRGVzYyA9PSBOVUxMKSByZXR1cm4gTU1TWVNFUlJfSU5WQUxIQU5ETEU7CiAJcmV0dXJuIHdvZE1lc3NhZ2UoIGxwRGVzYy0+dURldmljZUlELCBXT0RNX1JFU1RBUlQsIGxwRGVzYy0+ZHdJbnN0YW5jZSwgMEwsIDBMKTsKQEAgLTI5NDgsNyArMjk0OSw3IEBACiBVSU5UMTYgV0lOQVBJIHdhdmVPdXRSZXNldDE2KEhXQVZFT1VUMTYgaFdhdmVPdXQpCiB7CiAJTFBXQVZFT1BFTkRFU0MJbHBEZXNjOwotCWRwcmludGZfbW1zeXMoc3RkZGViLCAid2F2ZU91dFJlc2V0KCUwNFgpXG4iLCBoV2F2ZU91dCk7CisJZHByaW50Zl9pbmZvKG1tc3lzLCAid2F2ZU91dFJlc2V0KCUwNFgpXG4iLCBoV2F2ZU91dCk7CiAJbHBEZXNjID0gKExQV0FWRU9QRU5ERVNDKSBVU0VSX0hFQVBfTElOX0FERFIoaFdhdmVPdXQpOwogCWlmIChscERlc2MgPT0gTlVMTCkgcmV0dXJuIE1NU1lTRVJSX0lOVkFMSEFORExFOwogCXJldHVybiB3b2RNZXNzYWdlKCBscERlc2MtPnVEZXZpY2VJRCwgV09ETV9SRVNFVCwgbHBEZXNjLT5kd0luc3RhbmNlLCAwTCwgMEwpOwpAQCAtMjk3Miw3ICsyOTczLDcgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVUlOVDE2IHVTaXplKQogewogCUxQV0FWRU9QRU5ERVNDCWxwRGVzYzsKLQlkcHJpbnRmX21tc3lzKHN0ZGRlYiwgIndhdmVPdXRHZXRQb3NpdGlvbiglMDRYLCAlcCwgJXUpO1xuIiwgaFdhdmVPdXQsIGxwVGltZSwgdVNpemUpOworCWRwcmludGZfaW5mbyhtbXN5cywgIndhdmVPdXRHZXRQb3NpdGlvbiglMDRYLCAlcCwgJXUpO1xuIiwgaFdhdmVPdXQsIGxwVGltZSwgdVNpemUpOwogCWxwRGVzYyA9IChMUFdBVkVPUEVOREVTQykgVVNFUl9IRUFQX0xJTl9BRERSKGhXYXZlT3V0KTsKIAlpZiAobHBEZXNjID09IE5VTEwpIHJldHVybiBNTVNZU0VSUl9JTlZBTEhBTkRMRTsKIAlyZXR1cm4gd29kTWVzc2FnZSggbHBEZXNjLT51RGV2aWNlSUQsIFdPRE1fR0VUUE9TLCBscERlc2MtPmR3SW5zdGFuY2UsIApAQCAtMjk4Nyw3ICsyOTg4LDcgQEAKIFVJTlQxNiBXSU5BUEkgd2F2ZU91dCMjeHgjIzE2KEhXQVZFT1VUMTYgaFdhdmVPdXQsIGF0eXBlIHgpCQlcCiB7CQkJCQkJCQkJXAogCUxQV0FWRU9QRU5ERVNDCWxwRGVzYzsJCQkJCQlcCi0JZHByaW50Zl9tbXN5cyhzdGRkZWIsICJ3YXZlT3V0IiN4eCIoJTA0WCwgJTA4bHgpO1xuIiwgaFdhdmVPdXQsKERXT1JEKXgpO1wKKwlkcHJpbnRmX2luZm8obW1zeXMsICJ3YXZlT3V0IiN4eCIoJTA0WCwgJTA4bHgpO1xuIiwgaFdhdmVPdXQsKERXT1JEKXgpO1wKIAlscERlc2MgPSAoTFBXQVZFT1BFTkRFU0MpIFVTRVJfSEVBUF9MSU5fQUREUihoV2F2ZU91dCk7CQlcCiAJaWYgKGxwRGVzYyA9PSBOVUxMKSByZXR1cm4gTU1TWVNFUlJfSU5WQUxIQU5ETEU7CQlcCiAJcmV0dXJuIHdvZE1lc3NhZ2UobHBEZXNjLT51RGV2aWNlSUQsIFdPRE1fIyNYWCwgbHBEZXNjLT5kd0luc3RhbmNlLFwKQEAgLTMwMDYsNyArMzAwNyw3IEBACiB9CQkJCQkJCQkJXAogVUlOVDE2IFdJTkFQSSB3YXZlT3V0IyN4eCMjMTYoVUlOVDE2IGRldmlkLCBhdHlwZSB4KQkJCVwKIHsJCQkJCQkJCQlcCi0JZHByaW50Zl9tbXN5cyhzdGRkZWIsICJ3YXZlT3V0IiN4eCIoJTA0WCwgJTA4bHgpO1xuIiwgZGV2aWQsKERXT1JEKXgpOwlcCisJZHByaW50Zl9pbmZvKG1tc3lzLCAid2F2ZU91dCIjeHgiKCUwNFgsICUwOGx4KTtcbiIsIGRldmlkLChEV09SRCl4KTsJXAogCXJldHVybiB3b2RNZXNzYWdlKGRldmlkLCBXT0RNXyMjWFgsIDBMLAkoRFdPUkQpeCwgMEwpOwkJXAogfQogCQpAQCAtMzAyNyw3ICszMDI4LDcgQEAKICAqLwogVUlOVDE2IFdJTkFQSSB3YXZlT3V0QnJlYWtMb29wMTYoSFdBVkVPVVQxNiBoV2F2ZU91dCkKIHsKLQlkcHJpbnRmX21tc3lzKHN0ZGRlYiwgIndhdmVPdXRCcmVha0xvb3AoJTA0WClcbiIsIGhXYXZlT3V0KTsKKwlkcHJpbnRmX2luZm8obW1zeXMsICJ3YXZlT3V0QnJlYWtMb29wKCUwNFgpXG4iLCBoV2F2ZU91dCk7CiAJcmV0dXJuIE1NU1lTRVJSX0lOVkFMSEFORExFOwogfQogCkBAIC0zMDM3LDcgKzMwMzgsNyBAQAogVUlOVDMyIFdJTkFQSSB3YXZlT3V0R2V0SUQzMihIV0FWRU9VVDMyIGhXYXZlT3V0LCBVSU5UMzIgKiBscHVEZXZpY2VJRCkKIHsKIAlMUFdBVkVPUEVOREVTQwlscERlc2M7Ci0JZHByaW50Zl9tbXN5cyhzdGRkZWIsICJ3YXZlT3V0R2V0SUQoJTA0WCwgJXApO1xuIiwgaFdhdmVPdXQsIGxwdURldmljZUlEKTsKKwlkcHJpbnRmX2luZm8obW1zeXMsICJ3YXZlT3V0R2V0SUQoJTA0WCwgJXApO1xuIiwgaFdhdmVPdXQsIGxwdURldmljZUlEKTsKIAlscERlc2MgPSAoTFBXQVZFT1BFTkRFU0MpIFVTRVJfSEVBUF9MSU5fQUREUihoV2F2ZU91dCk7CiAJaWYgKGxwRGVzYyA9PSBOVUxMKSByZXR1cm4gTU1TWVNFUlJfSU5WQUxIQU5ETEU7CiAJaWYgKGxwdURldmljZUlEID09IE5VTEwpIHJldHVybiBNTVNZU0VSUl9JTlZBTEhBTkRMRTsKQEAgLTMwNTAsNyArMzA1MSw3IEBACiBVSU5UMTYgV0lOQVBJIHdhdmVPdXRHZXRJRDE2KEhXQVZFT1VUMTYgaFdhdmVPdXQsIFVJTlQxNiAqIGxwdURldmljZUlEKQogewogCUxQV0FWRU9QRU5ERVNDCWxwRGVzYzsKLQlkcHJpbnRmX21tc3lzKHN0ZGRlYiwgIndhdmVPdXRHZXRJRCglMDRYLCAlcCk7XG4iLCBoV2F2ZU91dCwgbHB1RGV2aWNlSUQpOworCWRwcmludGZfaW5mbyhtbXN5cywgIndhdmVPdXRHZXRJRCglMDRYLCAlcCk7XG4iLCBoV2F2ZU91dCwgbHB1RGV2aWNlSUQpOwogCWxwRGVzYyA9IChMUFdBVkVPUEVOREVTQykgVVNFUl9IRUFQX0xJTl9BRERSKGhXYXZlT3V0KTsKIAlpZiAobHBEZXNjID09IE5VTEwpIHJldHVybiBNTVNZU0VSUl9JTlZBTEhBTkRMRTsKIAlpZiAobHB1RGV2aWNlSUQgPT0gTlVMTCkgcmV0dXJuIE1NU1lTRVJSX0lOVkFMSEFORExFOwpAQCAtMzE2NCw5ICszMTY1LDkgQEAKIFVJTlQxNiBXSU5BUEkgd2F2ZUluR2V0TnVtRGV2czE2KCkKIHsKIAlVSU5UMTYJY291bnQgPSAwOwotCWRwcmludGZfbW1zeXMoc3RkZGViLCAid2F2ZUluR2V0TnVtRGV2c1xuIik7CisJZHByaW50Zl9pbmZvKG1tc3lzLCAid2F2ZUluR2V0TnVtRGV2c1xuIik7CiAJY291bnQgKz0gd2lkTWVzc2FnZSgwLCBXSURNX0dFVE5VTURFVlMsIDBMLCAwTCwgMEwpOwotCWRwcmludGZfbW1zeXMoc3RkZGViLCAid2F2ZUluR2V0TnVtRGV2cyByZXR1cm4gJXUgXG4iLCBjb3VudCk7CisJZHByaW50Zl9pbmZvKG1tc3lzLCAid2F2ZUluR2V0TnVtRGV2cyByZXR1cm4gJXUgXG4iLCBjb3VudCk7CiAJcmV0dXJuIGNvdW50OwogfQogCkBAIC0zMjA4LDcgKzMyMDksNyBAQAogICovCiBVSU5UMTYgV0lOQVBJIHdhdmVJbkdldERldkNhcHMxNihVSU5UMTYgdURldmljZUlELCBMUFdBVkVJTkNBUFMxNiBscENhcHMsIFVJTlQxNiB1U2l6ZSkKIHsKLQlkcHJpbnRmX21tc3lzKHN0ZGRlYiwgIndhdmVJbkdldERldkNhcHNcbiIpOworCWRwcmludGZfaW5mbyhtbXN5cywgIndhdmVJbkdldERldkNhcHNcbiIpOwogCXJldHVybiB3aWRNZXNzYWdlKHVEZXZpY2VJRCwgV0lETV9HRVRERVZDQVBTLCAwTCwgKERXT1JEKWxwQ2FwcywgdVNpemUpOwogfQogCkBAIC0zMjE3LDcgKzMyMTgsNyBAQAogICovCiBVSU5UMzIgV0lOQVBJIHdhdmVJbkdldEVycm9yVGV4dDMyQShVSU5UMzIgdUVycm9yLCBMUFNUUiBscFRleHQsIFVJTlQzMiB1U2l6ZSkKIHsKLSAgIGRwcmludGZfbW1zeXMoc3RkZGViLCAid2F2ZUluR2V0RXJyb3JUZXh0XG4iKTsKKyAgIGRwcmludGZfaW5mbyhtbXN5cywgIndhdmVJbkdldEVycm9yVGV4dFxuIik7CiAgICByZXR1cm4od2F2ZUdldEVycm9yVGV4dCh1RXJyb3IsIGxwVGV4dCwgdVNpemUpKTsKIH0KIApAQCAtMzIzOSw3ICszMjQwLDcgQEAKICAqLwogVUlOVDE2IFdJTkFQSSB3YXZlSW5HZXRFcnJvclRleHQxNihVSU5UMTYgdUVycm9yLCBMUFNUUiBscFRleHQsIFVJTlQxNiB1U2l6ZSkKIHsKLSAgIGRwcmludGZfbW1zeXMoc3RkZGViLCAid2F2ZUluR2V0RXJyb3JUZXh0XG4iKTsKKyAgIGRwcmludGZfaW5mbyhtbXN5cywgIndhdmVJbkdldEVycm9yVGV4dFxuIik7CiAgICByZXR1cm4od2F2ZUdldEVycm9yVGV4dCh1RXJyb3IsIGxwVGV4dCwgdVNpemUpKTsKIH0KIApAQCAtMzI2OCwxMiArMzI2OSwxMiBAQAogCUxQV0FWRU9QRU5ERVNDCWxwRGVzYzsKIAlEV09SRAlkd1JldCA9IDA7CiAJQk9PTDMyCWJNYXBwZXJGbGcgPSBGQUxTRTsKLQlkcHJpbnRmX21tc3lzKHN0ZGRlYiwgIndhdmVJbk9wZW4oJXAsICVkLCAlcCwgJTA4bFgsICUwOGxYLCAlMDhsWCk7XG4iLCAKKwlkcHJpbnRmX2luZm8obW1zeXMsICJ3YXZlSW5PcGVuKCVwLCAlZCwgJXAsICUwOGxYLCAlMDhsWCwgJTA4bFgpO1xuIiwgCiAJCWxwaFdhdmVJbiwgdURldmljZUlELCBscEZvcm1hdCwgZHdDYWxsYmFjaywgZHdJbnN0YW5jZSwgZHdGbGFncyk7CiAJaWYgKGR3RmxhZ3MgJiBXQVZFX0ZPUk1BVF9RVUVSWSkKLQkJZHByaW50Zl9tbXN5cyhzdGRkZWIsICJ3YXZlSW5PcGVuIC8vIFdBVkVfRk9STUFUX1FVRVJZIHJlcXVlc3RlZCAhXG4iKTsKKwkJZHByaW50Zl9pbmZvKG1tc3lzLCAid2F2ZUluT3BlbiAvLyBXQVZFX0ZPUk1BVF9RVUVSWSByZXF1ZXN0ZWQgIVxuIik7CiAJaWYgKHVEZXZpY2VJRCA9PSAoVUlOVDE2KVdBVkVfTUFQUEVSKSB7Ci0JCWRwcmludGZfbW1zeXMoc3RkZGViLCAid2F2ZUluT3BlbgkvLyBXQVZFX01BUFBFUiBtb2RlIHJlcXVlc3RlZCAhXG4iKTsKKwkJZHByaW50Zl9pbmZvKG1tc3lzLCAid2F2ZUluT3BlbgkvLyBXQVZFX01BUFBFUiBtb2RlIHJlcXVlc3RlZCAhXG4iKTsKIAkJYk1hcHBlckZsZyA9IFRSVUU7CiAJCXVEZXZpY2VJRCA9IDA7CiAJfQpAQCAtMzI5MiwxMSArMzI5MywxMSBAQAogCQlpZiAoZHdSZXQgPT0gTU1TWVNFUlJfTk9FUlJPUikgYnJlYWs7CiAJCWlmICghYk1hcHBlckZsZykgYnJlYWs7CiAJCXVEZXZpY2VJRCsrOwotCQlkcHJpbnRmX21tc3lzKHN0ZGRlYiwgIndhdmVJbk9wZW4JLy8gV0FWRV9NQVBQRVIgbW9kZSAhIHRyeSBuZXh0IGRyaXZlci4uLlxuIik7CisJCWRwcmludGZfaW5mbyhtbXN5cywgIndhdmVJbk9wZW4JLy8gV0FWRV9NQVBQRVIgbW9kZSAhIHRyeSBuZXh0IGRyaXZlci4uLlxuIik7CiAJfQogCWxwRGVzYy0+dURldmljZUlEID0gdURldmljZUlEOwogCWlmIChkd0ZsYWdzICYgV0FWRV9GT1JNQVRfUVVFUlkpIHsKLQkJZHByaW50Zl9tbXN5cyhzdGRkZWIsICJ3YXZlSW5PcGVuCS8vIEVuZCBvZiBXQVZFX0ZPUk1BVF9RVUVSWSAhXG4iKTsKKwkJZHByaW50Zl9pbmZvKG1tc3lzLCAid2F2ZUluT3BlbgkvLyBFbmQgb2YgV0FWRV9GT1JNQVRfUVVFUlkgIVxuIik7CiAJCWR3UmV0ID0gd2F2ZUluQ2xvc2UxNihoV2F2ZUluKTsKIAl9CiAJcmV0dXJuIGR3UmV0OwpAQCAtMzMxNiw3ICszMzE3LDcgQEAKIHsKIAlMUFdBVkVPUEVOREVTQwlscERlc2M7CiAKLQlkcHJpbnRmX21tc3lzKHN0ZGRlYiwgIndhdmVJbkNsb3NlKCUwNFgpXG4iLCBoV2F2ZUluKTsKKwlkcHJpbnRmX2luZm8obW1zeXMsICJ3YXZlSW5DbG9zZSglMDRYKVxuIiwgaFdhdmVJbik7CiAJbHBEZXNjID0gKExQV0FWRU9QRU5ERVNDKSBVU0VSX0hFQVBfTElOX0FERFIoaFdhdmVJbik7CiAJaWYgKGxwRGVzYyA9PSBOVUxMKSByZXR1cm4gTU1TWVNFUlJfSU5WQUxIQU5ETEU7CiAJcmV0dXJuIHdpZE1lc3NhZ2UobHBEZXNjLT51RGV2aWNlSUQsIFdJRE1fQ0xPU0UsIGxwRGVzYy0+ZHdJbnN0YW5jZSwgMEwsIDBMKTsKQEAgLTMzMzAsNyArMzMzMSw3IEBACiB7CiAJTFBXQVZFT1BFTkRFU0MJbHBEZXNjOwogCi0JZHByaW50Zl9tbXN5cyhzdGRkZWIsICJ3YXZlSW5QcmVwYXJlSGVhZGVyKCUwNFgsICVwLCAldSk7XG4iLCAKKwlkcHJpbnRmX2luZm8obW1zeXMsICJ3YXZlSW5QcmVwYXJlSGVhZGVyKCUwNFgsICVwLCAldSk7XG4iLCAKIAkJCQkJaFdhdmVJbiwgbHBXYXZlSW5IZHIsIHVTaXplKTsKIAlscERlc2MgPSAoTFBXQVZFT1BFTkRFU0MpIFVTRVJfSEVBUF9MSU5fQUREUihoV2F2ZUluKTsKIAlpZiAobHBEZXNjID09IE5VTEwpIHJldHVybiBNTVNZU0VSUl9JTlZBTEhBTkRMRTsKQEAgLTMzMzgsNyArMzMzOSw3IEBACiAJbHBXYXZlSW5IZHIgPSBscFdhdmVJbkhkcjsKIAlscFdhdmVJbkhkci0+bHBOZXh0ID0gTlVMTDsKICAgICAJbHBXYXZlSW5IZHItPmR3Qnl0ZXNSZWNvcmRlZCA9IDA7Ci0JZHByaW50Zl9tbXN5cyhzdGRkZWIsICJ3YXZlSW5QcmVwYXJlSGVhZGVyIC8vIGxwRGF0YT0lcCBzaXplPSVsdSBcbiIsIAorCWRwcmludGZfaW5mbyhtbXN5cywgIndhdmVJblByZXBhcmVIZWFkZXIgLy8gbHBEYXRhPSVwIHNpemU9JWx1IFxuIiwgCiAJCWxwV2F2ZUluSGRyLT5scERhdGEsIGxwV2F2ZUluSGRyLT5kd0J1ZmZlckxlbmd0aCk7CiAJcmV0dXJuIHdpZE1lc3NhZ2UobHBEZXNjLT51RGV2aWNlSUQsV0lETV9QUkVQQVJFLGxwRGVzYy0+ZHdJbnN0YW5jZSwgCiAJCQkgIChEV09SRClscFdhdmVJbkhkciwgdVNpemUpOwpAQCAtMzM1Myw3ICszMzU0LDcgQEAKIAlMUEJZVEUJCXNhdmVkZGF0YSA9IGxwV2F2ZUluSGRyLT5scERhdGE7CiAJVUlOVDE2CQlyZXQ7CiAKLQlkcHJpbnRmX21tc3lzKHN0ZGRlYiwgIndhdmVJblByZXBhcmVIZWFkZXIoJTA0WCwgJXAsICV1KTtcbiIsIAorCWRwcmludGZfaW5mbyhtbXN5cywgIndhdmVJblByZXBhcmVIZWFkZXIoJTA0WCwgJXAsICV1KTtcbiIsIAogCQkJCQloV2F2ZUluLCBscFdhdmVJbkhkciwgdVNpemUpOwogCWxwRGVzYyA9IChMUFdBVkVPUEVOREVTQykgVVNFUl9IRUFQX0xJTl9BRERSKGhXYXZlSW4pOwogCWlmIChscERlc2MgPT0gTlVMTCkgcmV0dXJuIE1NU1lTRVJSX0lOVkFMSEFORExFOwpAQCAtMzM2Miw3ICszMzYzLDcgQEAKIAlscFdhdmVJbkhkci0+bHBOZXh0ID0gTlVMTDsKICAgICAJbHBXYXZlSW5IZHItPmR3Qnl0ZXNSZWNvcmRlZCA9IDA7CiAKLQlkcHJpbnRmX21tc3lzKHN0ZGRlYiwgIndhdmVJblByZXBhcmVIZWFkZXIgLy8gbHBEYXRhPSVwIHNpemU9JWx1IFxuIiwgCisJZHByaW50Zl9pbmZvKG1tc3lzLCAid2F2ZUluUHJlcGFyZUhlYWRlciAvLyBscERhdGE9JXAgc2l6ZT0lbHUgXG4iLCAKIAkJbHBXYXZlSW5IZHItPmxwRGF0YSwgbHBXYXZlSW5IZHItPmR3QnVmZmVyTGVuZ3RoKTsKIAlscFdhdmVJbkhkci0+bHBEYXRhID0gUFRSX1NFR19UT19MSU4obHBXYXZlSW5IZHItPmxwRGF0YSk7CiAJcmV0ID0gd2lkTWVzc2FnZShscERlc2MtPnVEZXZpY2VJRCxXSURNX1BSRVBBUkUsbHBEZXNjLT5kd0luc3RhbmNlLCAKQEAgLTMzODAsNyArMzM4MSw3IEBACiB7CiAJTFBXQVZFT1BFTkRFU0MJbHBEZXNjOwogCi0JZHByaW50Zl9tbXN5cyhzdGRkZWIsICJ3YXZlSW5VbnByZXBhcmVIZWFkZXIoJTA0WCwgJXAsICV1KTtcbiIsIAorCWRwcmludGZfaW5mbyhtbXN5cywgIndhdmVJblVucHJlcGFyZUhlYWRlciglMDRYLCAlcCwgJXUpO1xuIiwgCiAJCQkJCQloV2F2ZUluLCBscFdhdmVJbkhkciwgdVNpemUpOwogCWxwRGVzYyA9IChMUFdBVkVPUEVOREVTQykgVVNFUl9IRUFQX0xJTl9BRERSKGhXYXZlSW4pOwogCWlmIChscERlc2MgPT0gTlVMTCkgcmV0dXJuIE1NU1lTRVJSX0lOVkFMSEFORExFOwpAQCAtMzM5OSw3ICszNDAwLDcgQEAKIHsKIAlMUFdBVkVPUEVOREVTQwlscERlc2M7CiAKLQlkcHJpbnRmX21tc3lzKHN0ZGRlYiwgIndhdmVJblVucHJlcGFyZUhlYWRlciglMDRYLCAlcCwgJXUpO1xuIiwgCisJZHByaW50Zl9pbmZvKG1tc3lzLCAid2F2ZUluVW5wcmVwYXJlSGVhZGVyKCUwNFgsICVwLCAldSk7XG4iLCAKIAkJCQkJCWhXYXZlSW4sIGxwV2F2ZUluSGRyLCB1U2l6ZSk7CiAJbHBEZXNjID0gKExQV0FWRU9QRU5ERVNDKSBVU0VSX0hFQVBfTElOX0FERFIoaFdhdmVJbik7CiAJaWYgKGxwRGVzYyA9PSBOVUxMKSByZXR1cm4gTU1TWVNFUlJfSU5WQUxIQU5ETEU7CkBAIC0zNDE5LDEzICszNDIwLDEzIEBACiB7CiAJTFBXQVZFT1BFTkRFU0MJbHBEZXNjOwogCi0JZHByaW50Zl9tbXN5cyhzdGRkZWIsICJ3YXZlSW5BZGRCdWZmZXIoJTA0WCwgJXAsICV1KTtcbiIsIGhXYXZlSW4sIGxwV2F2ZUluSGRyLCB1U2l6ZSk7CisJZHByaW50Zl9pbmZvKG1tc3lzLCAid2F2ZUluQWRkQnVmZmVyKCUwNFgsICVwLCAldSk7XG4iLCBoV2F2ZUluLCBscFdhdmVJbkhkciwgdVNpemUpOwogCWxwRGVzYyA9IChMUFdBVkVPUEVOREVTQykgVVNFUl9IRUFQX0xJTl9BRERSKGhXYXZlSW4pOwogCWlmIChscERlc2MgPT0gTlVMTCkgcmV0dXJuIE1NU1lTRVJSX0lOVkFMSEFORExFOwogCWlmIChscFdhdmVJbkhkciA9PSBOVUxMKSByZXR1cm4gTU1TWVNFUlJfSU5WQUxIQU5ETEU7CiAJbHBXYXZlSW5IZHItPmxwTmV4dCA9IE5VTEw7CiAJbHBXYXZlSW5IZHItPmR3Qnl0ZXNSZWNvcmRlZCA9IDA7Ci0JZHByaW50Zl9tbXN5cyhzdGRkZWIsICJ3YXZlSW5BZGRCdWZmZXIgLy8gbHBEYXRhPSVwIHNpemU9JWx1IFxuIiwgCisJZHByaW50Zl9pbmZvKG1tc3lzLCAid2F2ZUluQWRkQnVmZmVyIC8vIGxwRGF0YT0lcCBzaXplPSVsdSBcbiIsIAogCQlscFdhdmVJbkhkci0+bHBEYXRhLCBscFdhdmVJbkhkci0+ZHdCdWZmZXJMZW5ndGgpOwogCXJldHVybiB3aWRNZXNzYWdlKGxwRGVzYy0+dURldmljZUlELCBXSURNX0FEREJVRkZFUiwgbHBEZXNjLT5kd0luc3RhbmNlLAogCQkJCQkJCQkoRFdPUkQpbHBXYXZlSW5IZHIsIHVTaXplKTsKQEAgLTM0NDEsMTQgKzM0NDIsMTQgQEAKIAlMUFdBVkVPUEVOREVTQwlscERlc2M7CiAJVUlOVDE2CQlyZXQ7CiAKLQlkcHJpbnRmX21tc3lzKHN0ZGRlYiwgIndhdmVJbkFkZEJ1ZmZlciglMDRYLCAlcCwgJXUpO1xuIiwgaFdhdmVJbiwgbHBXYXZlSW5IZHIsIHVTaXplKTsKKwlkcHJpbnRmX2luZm8obW1zeXMsICJ3YXZlSW5BZGRCdWZmZXIoJTA0WCwgJXAsICV1KTtcbiIsIGhXYXZlSW4sIGxwV2F2ZUluSGRyLCB1U2l6ZSk7CiAJbHBEZXNjID0gKExQV0FWRU9QRU5ERVNDKSBVU0VSX0hFQVBfTElOX0FERFIoaFdhdmVJbik7CiAJaWYgKGxwRGVzYyA9PSBOVUxMKSByZXR1cm4gTU1TWVNFUlJfSU5WQUxIQU5ETEU7CiAJaWYgKGxwV2F2ZUluSGRyID09IE5VTEwpIHJldHVybiBNTVNZU0VSUl9JTlZBTEhBTkRMRTsKIAlscFdhdmVJbkhkci0+bHBOZXh0ID0gTlVMTDsKIAlscFdhdmVJbkhkci0+ZHdCeXRlc1JlY29yZGVkID0gMDsKIAlscFdhdmVJbkhkci0+bHBEYXRhID0gUFRSX1NFR19UT19MSU4obHBXYXZlSW5IZHItPmxwRGF0YSk7Ci0JZHByaW50Zl9tbXN5cyhzdGRkZWIsICJ3YXZlSW5BZGRCdWZmZXIgLy8gbHBEYXRhPSVwIHNpemU9JWx1IFxuIiwgCisJZHByaW50Zl9pbmZvKG1tc3lzLCAid2F2ZUluQWRkQnVmZmVyIC8vIGxwRGF0YT0lcCBzaXplPSVsdSBcbiIsIAogCQlscFdhdmVJbkhkci0+bHBEYXRhLCBscFdhdmVJbkhkci0+ZHdCdWZmZXJMZW5ndGgpOwogCXJldCA9IHdpZE1lc3NhZ2UobHBEZXNjLT51RGV2aWNlSUQsIFdJRE1fQUREQlVGRkVSLCBscERlc2MtPmR3SW5zdGFuY2UsCiAJCQkgIChEV09SRClscFdhdmVJbkhkciwgdVNpemUpOwpAQCAtMzQ3MSw3ICszNDcyLDcgQEAKIHsKIAlMUFdBVkVPUEVOREVTQwlscERlc2M7CiAKLQlkcHJpbnRmX21tc3lzKHN0ZGRlYiwgIndhdmVJblN0YXJ0KCUwNFgpXG4iLCBoV2F2ZUluKTsKKwlkcHJpbnRmX2luZm8obW1zeXMsICJ3YXZlSW5TdGFydCglMDRYKVxuIiwgaFdhdmVJbik7CiAJbHBEZXNjID0gKExQV0FWRU9QRU5ERVNDKSBVU0VSX0hFQVBfTElOX0FERFIoaFdhdmVJbik7CiAJaWYgKGxwRGVzYyA9PSBOVUxMKSByZXR1cm4gTU1TWVNFUlJfSU5WQUxIQU5ETEU7CiAJcmV0dXJuIHdpZE1lc3NhZ2UobHBEZXNjLT51RGV2aWNlSUQsV0lETV9TVEFSVCxscERlc2MtPmR3SW5zdGFuY2UsMCwwKTsKQEAgLTM0OTIsNyArMzQ5Myw3IEBACiB7CiAJTFBXQVZFT1BFTkRFU0MJbHBEZXNjOwogCi0JZHByaW50Zl9tbXN5cyhzdGRkZWIsICJ3YXZlSW5TdG9wKCUwNFgpXG4iLCBoV2F2ZUluKTsKKwlkcHJpbnRmX2luZm8obW1zeXMsICJ3YXZlSW5TdG9wKCUwNFgpXG4iLCBoV2F2ZUluKTsKIAlscERlc2MgPSAoTFBXQVZFT1BFTkRFU0MpIFVTRVJfSEVBUF9MSU5fQUREUihoV2F2ZUluKTsKIAlpZiAobHBEZXNjID09IE5VTEwpIHJldHVybiBNTVNZU0VSUl9JTlZBTEhBTkRMRTsKIAlyZXR1cm4gd2lkTWVzc2FnZShscERlc2MtPnVEZXZpY2VJRCwgV0lETV9TVE9QLCBscERlc2MtPmR3SW5zdGFuY2UsIDBMLCAwTCk7CkBAIC0zNTEzLDcgKzM1MTQsNyBAQAogewogCUxQV0FWRU9QRU5ERVNDCWxwRGVzYzsKIAotCWRwcmludGZfbW1zeXMoc3RkZGViLCAid2F2ZUluUmVzZXQoJTA0WClcbiIsIGhXYXZlSW4pOworCWRwcmludGZfaW5mbyhtbXN5cywgIndhdmVJblJlc2V0KCUwNFgpXG4iLCBoV2F2ZUluKTsKIAlscERlc2MgPSAoTFBXQVZFT1BFTkRFU0MpIFVTRVJfSEVBUF9MSU5fQUREUihoV2F2ZUluKTsKIAlpZiAobHBEZXNjID09IE5VTEwpIHJldHVybiBNTVNZU0VSUl9JTlZBTEhBTkRMRTsKIAlyZXR1cm4gd2lkTWVzc2FnZShscERlc2MtPnVEZXZpY2VJRCxXSURNX1JFU0VULGxwRGVzYy0+ZHdJbnN0YW5jZSwwLDApOwpAQCAtMzU0MCw3ICszNTQxLDcgQEAKIHsKIAlMUFdBVkVPUEVOREVTQwlscERlc2M7CiAKLQlkcHJpbnRmX21tc3lzKHN0ZGRlYiwgIndhdmVJbkdldFBvc2l0aW9uKCUwNFgsICVwLCAldSk7XG4iLCBoV2F2ZUluLCBscFRpbWUsIHVTaXplKTsKKwlkcHJpbnRmX2luZm8obW1zeXMsICJ3YXZlSW5HZXRQb3NpdGlvbiglMDRYLCAlcCwgJXUpO1xuIiwgaFdhdmVJbiwgbHBUaW1lLCB1U2l6ZSk7CiAJbHBEZXNjID0gKExQV0FWRU9QRU5ERVNDKSBVU0VSX0hFQVBfTElOX0FERFIoaFdhdmVJbik7CiAJaWYgKGxwRGVzYyA9PSBOVUxMKSByZXR1cm4gTU1TWVNFUlJfSU5WQUxIQU5ETEU7CiAJcmV0dXJuIHdpZE1lc3NhZ2UobHBEZXNjLT51RGV2aWNlSUQsIFdJRE1fR0VUUE9TLCBscERlc2MtPmR3SW5zdGFuY2UsCkBAIC0zNTU0LDcgKzM1NTUsNyBAQAogewogCUxQV0FWRU9QRU5ERVNDCWxwRGVzYzsKIAotCWRwcmludGZfbW1zeXMoc3RkZGViLCAid2F2ZUluR2V0SURcbiIpOworCWRwcmludGZfaW5mbyhtbXN5cywgIndhdmVJbkdldElEXG4iKTsKIAlpZiAobHB1RGV2aWNlSUQgPT0gTlVMTCkgcmV0dXJuIE1NU1lTRVJSX0lOVkFMSEFORExFOwogCWxwRGVzYyA9IChMUFdBVkVPUEVOREVTQykgVVNFUl9IRUFQX0xJTl9BRERSKGhXYXZlSW4pOwogCWlmIChscERlc2MgPT0gTlVMTCkgcmV0dXJuIE1NU1lTRVJSX0lOVkFMSEFORExFOwpAQCAtMzU3MCw3ICszNTcxLDcgQEAKIHsKIAlMUFdBVkVPUEVOREVTQwlscERlc2M7CiAKLQlkcHJpbnRmX21tc3lzKHN0ZGRlYiwgIndhdmVJbkdldElEXG4iKTsKKwlkcHJpbnRmX2luZm8obW1zeXMsICJ3YXZlSW5HZXRJRFxuIik7CiAJaWYgKGxwdURldmljZUlEID09IE5VTEwpIHJldHVybiBNTVNZU0VSUl9JTlZBTEhBTkRMRTsKIAlscERlc2MgPSAoTFBXQVZFT1BFTkRFU0MpIFVTRVJfSEVBUF9MSU5fQUREUihoV2F2ZUluKTsKIAlpZiAobHBEZXNjID09IE5VTEwpIHJldHVybiBNTVNZU0VSUl9JTlZBTEhBTkRMRTsKQEAgLTM2NjIsNyArMzY2Myw3IEBACiAqLwogSERSVlIxNiBXSU5BUEkgRHJ2T3BlbihMUFNUUiBscERyaXZlck5hbWUsIExQU1RSIGxwU2VjdGlvbk5hbWUsIExQQVJBTSBsUGFyYW0pCiB7Ci0JZHByaW50Zl9tbXN5cyhzdGRkZWIsICJEcnZPcGVuKCclcycsICclcycsICUwOGxYKTtcbiIsCisJZHByaW50Zl9pbmZvKG1tc3lzLCAiRHJ2T3BlbignJXMnLCAnJXMnLCAlMDhsWCk7XG4iLAogCQlscERyaXZlck5hbWUsIGxwU2VjdGlvbk5hbWUsIGxQYXJhbSk7CiAJcmV0dXJuIE9wZW5Ecml2ZXIobHBEcml2ZXJOYW1lLCBscFNlY3Rpb25OYW1lLCBsUGFyYW0pOwogfQpAQCAtMzY3Myw3ICszNjc0LDcgQEAKICovCiBMUkVTVUxUIFdJTkFQSSBEcnZDbG9zZShIRFJWUjE2IGhEcnZyLCBMUEFSQU0gbFBhcmFtMSwgTFBBUkFNIGxQYXJhbTIpCiB7Ci0JZHByaW50Zl9tbXN5cyhzdGRkZWIsICJEcnZDbG9zZSglMDRYLCAlMDhsWCwgJTA4bFgpO1xuIiwgaERydnIsIGxQYXJhbTEsIGxQYXJhbTIpOworCWRwcmludGZfaW5mbyhtbXN5cywgIkRydkNsb3NlKCUwNFgsICUwOGxYLCAlMDhsWCk7XG4iLCBoRHJ2ciwgbFBhcmFtMSwgbFBhcmFtMik7CiAJcmV0dXJuIENsb3NlRHJpdmVyKGhEcnZyLCBsUGFyYW0xLCBsUGFyYW0yKTsKIH0KIApAQCAtMzY4NSw3ICszNjg2LDcgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExQQVJBTSBsUGFyYW0yKQogewogCURXT1JEIAlkd0RyaXZlcklEID0gMDsKLQlkcHJpbnRmX21tc3lzKHN0ZGRlYiwgIkRydlNlbmRNZXNzYWdlKCUwNFgsICUwNFgsICUwOGxYLCAlMDhsWCk7XG4iLAorCWRwcmludGZfaW5mbyhtbXN5cywgIkRydlNlbmRNZXNzYWdlKCUwNFgsICUwNFgsICUwOGxYLCAlMDhsWCk7XG4iLAogCQkJCQloRHJpdmVyLCBtc2csIGxQYXJhbTEsIGxQYXJhbTIpOwogCXJldHVybiBDREFVRElPX0RyaXZlclByb2MoZHdEcml2ZXJJRCwgaERyaXZlciwgbXNnLCBsUGFyYW0xLCBsUGFyYW0yKTsKIH0KQEAgLTM2OTUsNyArMzY5Niw3IEBACiAqLwogSEFORExFMTYgV0lOQVBJIERydkdldE1vZHVsZUhhbmRsZShIRFJWUjE2IGhEcnZyKQogewotCWRwcmludGZfbW1zeXMoc3RkZGViLCAiRHJ2R2V0TW9kdWxlSGFuZGxlKCUwNFgpO1xuIiwgaERydnIpOworCWRwcmludGZfaW5mbyhtbXN5cywgIkRydkdldE1vZHVsZUhhbmRsZSglMDRYKTtcbiIsIGhEcnZyKTsKICAgICAgICAgcmV0dXJuIDA7CiB9CiAKZGlmZiAtLWdpdCBhL211bHRpbWVkaWEvdGltZS5jIGIvbXVsdGltZWRpYS90aW1lLmMKaW5kZXggNWE2ZDI2Ny4uMGU2MDIzNCAxMDA2NDQKLS0tIGEvbXVsdGltZWRpYS90aW1lLmMKKysrIGIvbXVsdGltZWRpYS90aW1lLmMKQEAgLTE1LDcgKzE1LDYgQEAKICNpbmNsdWRlICJ1c2VyLmgiCiAjaW5jbHVkZSAiZHJpdmVyLmgiCiAjaW5jbHVkZSAibW1zeXN0ZW0uaCIKLSNpbmNsdWRlICJzdGRkZWJ1Zy5oIgogI2luY2x1ZGUgImRlYnVnLmgiCiAjaW5jbHVkZSAieG1hbGxvYy5oIgogCkBAIC02MSwxMCArNjAsMTAgQEAKIAkgICAgbHBUaW1lci0+d0N1clRpbWUgPSBscFRpbWVyLT53RGVsYXk7CiAKIAkgICAgaWYgKGxwVGltZXItPmxwRnVuYyAhPSAoRkFSUFJPQzE2KSBOVUxMKSB7Ci0JCWRwcmludGZfbW10aW1lKHN0ZGRlYiwgIk1NU3lzVGltZUNhbGxiYWNrIC8vIGJlZm9yZSBDYWxsQmFjazE2ICFcbiIpOwotCQlkcHJpbnRmX21tdGltZShzdGRkZWIsICJNTVN5c1RpbWVDYWxsYmFjayAvLyBscEZ1bmM9JXAgd1RpbWVySUQ9JTA0WCBkd1VzZXI9JTA4bFggIVxuIiwKKwkJZHByaW50Zl9pbmZvKG1tdGltZSwgIk1NU3lzVGltZUNhbGxiYWNrIC8vIGJlZm9yZSBDYWxsQmFjazE2ICFcbiIpOworCQlkcHJpbnRmX2luZm8obW10aW1lLCAiTU1TeXNUaW1lQ2FsbGJhY2sgLy8gbHBGdW5jPSVwIHdUaW1lcklEPSUwNFggZHdVc2VyPSUwOGxYICFcbiIsCiAJCQlscFRpbWVyLT5scEZ1bmMsIGxwVGltZXItPndUaW1lcklELCBscFRpbWVyLT5kd1VzZXIpOwotCQlkcHJpbnRmX21tdGltZShzdGRkZWIsICJNTVN5c1RpbWVDYWxsYmFjayAvLyBoSW5zdGFuY2U9JTA0WCAhXG4iLCBscFRpbWVyLT5oSW5zdGFuY2UpOworCQlkcHJpbnRmX2luZm8obW10aW1lLCAiTU1TeXNUaW1lQ2FsbGJhY2sgLy8gaEluc3RhbmNlPSUwNFggIVxuIiwgbHBUaW1lci0+aEluc3RhbmNlKTsKIAogCiAvKiAgICAgICAgLSBUaW1lUHJvYyBjYWxsYmFjayB0aGF0IGlzIGNhbGxlZCBoZXJlIGlzIHNvbWV0aGluZyBzdHJhbmdlLCB1bmRlciBXaW5kb3dzIDMuMXggaXQgaXMgY2FsbGVkIApAQCAtODAsNyArNzksNyBAQAogCQkJCQkJICAgIGxwVGltZXItPmR3VXNlciwwLDAKIAkJCSk7CiAKLQkJZHByaW50Zl9tbXRpbWUoc3RkZGViLCAiTU1TeXNUaW1lQ2FsbGJhY2sgLy8gYWZ0ZXIgQ2FsbEJhY2sxNiAhXG4iKTsKKwkJZHByaW50Zl9pbmZvKG1tdGltZSwgIk1NU3lzVGltZUNhbGxiYWNrIC8vIGFmdGVyIENhbGxCYWNrMTYgIVxuIik7CiAJICAgIH0KIAkgICAgaWYgKGxwVGltZXItPndGbGFncyAmIFRJTUVfT05FU0hPVCkKIAkJdGltZUtpbGxFdmVudDMyKGxwVGltZXItPndUaW1lcklEKTsKQEAgLTEwNCwxNiArMTAzLDE2IEBACiAJICAgIGxwVGltZXItPndDdXJUaW1lID0gbHBUaW1lci0+d0RlbGF5OwogCiAJICAgIGlmIChscFRpbWVyLT5scEZ1bmMgIT0gKEZBUlBST0MxNikgTlVMTCkgewotCQlkcHJpbnRmX21tdGltZShzdGRkZWIsICJNTVN5c1RpbWVDYWxsYmFjayAvLyBiZWZvcmUgQ2FsbEJhY2sxNiAhXG4iKTsKLQkJZHByaW50Zl9tbXRpbWUoc3RkZGViLCAiTU1TeXNUaW1lQ2FsbGJhY2sgLy8gbHBGdW5jPSVwIHdUaW1lcklEPSUwNFggZHdVc2VyPSUwOGxYICFcbiIsCisJCWRwcmludGZfaW5mbyhtbXRpbWUsICJNTVN5c1RpbWVDYWxsYmFjayAvLyBiZWZvcmUgQ2FsbEJhY2sxNiAhXG4iKTsKKwkJZHByaW50Zl9pbmZvKG1tdGltZSwgIk1NU3lzVGltZUNhbGxiYWNrIC8vIGxwRnVuYz0lcCB3VGltZXJJRD0lMDRYIGR3VXNlcj0lMDhsWCAhXG4iLAogCQkJbHBUaW1lci0+bHBGdW5jLCBscFRpbWVyLT53VGltZXJJRCwgbHBUaW1lci0+ZHdVc2VyKTsKLQkJZHByaW50Zl9tbXRpbWUoc3RkZGViLCAiTU1TeXNUaW1lQ2FsbGJhY2sgLy8gaEluc3RhbmNlPSUwNFggIVxuIiwgbHBUaW1lci0+aEluc3RhbmNlKTsKKwkJZHByaW50Zl9pbmZvKG1tdGltZSwgIk1NU3lzVGltZUNhbGxiYWNrIC8vIGhJbnN0YW5jZT0lMDRYICFcbiIsIGxwVGltZXItPmhJbnN0YW5jZSk7CiAKIC8qIFRoaXMgaXMgd3JvbmcgKGxwRnVuYyBpcyBOVUxMIGFsbCB0aGUgdGltZSkKIAogICAgCSAgICAgICAgbHBGdW5jID0gTU9EVUxFX0dldEVudHJ5UG9pbnQoIGxwVGltZXItPmhJbnN0YW5jZSwKICAgICAgICAgICAgICAgICAgICAgICAgICBNT0RVTEVfR2V0T3JkaW5hbChscFRpbWVyLT5oSW5zdGFuY2UsIlRpbWVyQ2FsbEJhY2siICkpOwotCQlkcHJpbnRmX21tdGltZShzdGRkZWIsICJNTVN5c1RpbWVDYWxsYmFjayAvLyBscEZ1bmM9JTA4bHggIVxuIiwgbHBGdW5jKTsKKwkJZHByaW50Zl9pbmZvKG1tdGltZSwgIk1NU3lzVGltZUNhbGxiYWNrIC8vIGxwRnVuYz0lMDhseCAhXG4iLCBscEZ1bmMpOwogKi8KIAogCkBAIC0xMzAsNyArMTI5LDcgQEAKIAkJCQkJCSAgICBscFRpbWVyLT5kd1VzZXIsMCwwCiAJCQkpOwogCi0JCWRwcmludGZfbW10aW1lKHN0ZGRlYiwgIk1NU3lzVGltZUNhbGxiYWNrIC8vIGFmdGVyIENhbGxCYWNrMTYgIVxuIik7CisJCWRwcmludGZfaW5mbyhtbXRpbWUsICJNTVN5c1RpbWVDYWxsYmFjayAvLyBhZnRlciBDYWxsQmFjazE2ICFcbiIpOwogCQlmZmx1c2goc3Rkb3V0KTsKIAkgICAgfQogCSAgICBpZiAobHBUaW1lci0+d0ZsYWdzICYgVElNRV9PTkVTSE9UKQpAQCAtMTY1LDcgKzE2NCw3IEBACiAgKi8KIE1NUkVTVUxUMzIgV0lOQVBJIHRpbWVHZXRTeXN0ZW1UaW1lMzIoTFBNTVRJTUUzMiBscFRpbWUsIFVJTlQzMiB3U2l6ZSkKIHsKLSAgICBkcHJpbnRmX21tc3lzKHN0ZGRlYiwgInRpbWVHZXRTeXN0ZW1UaW1lMzIoJXAsICV1KTtcbiIsIGxwVGltZSwgd1NpemUpOworICAgIGRwcmludGZfaW5mbyhtbXN5cywgInRpbWVHZXRTeXN0ZW1UaW1lMzIoJXAsICV1KTtcbiIsIGxwVGltZSwgd1NpemUpOwogICAgIGlmICghbW1UaW1lU3RhcnRlZCkKIAlTdGFydE1NVGltZSgpOwogICAgIGxwVGltZS0+d1R5cGUgPSBUSU1FX01TOwpAQCAtMTc4LDcgKzE3Nyw3IEBACiAgKi8KIE1NUkVTVUxUMTYgV0lOQVBJIHRpbWVHZXRTeXN0ZW1UaW1lMTYoTFBNTVRJTUUxNiBscFRpbWUsIFVJTlQxNiB3U2l6ZSkKIHsKLSAgICBkcHJpbnRmX21tc3lzKHN0ZGRlYiwgInRpbWVHZXRTeXN0ZW1UaW1lMTYoJXAsICV1KTtcbiIsIGxwVGltZSwgd1NpemUpOworICAgIGRwcmludGZfaW5mbyhtbXN5cywgInRpbWVHZXRTeXN0ZW1UaW1lMTYoJXAsICV1KTtcbiIsIGxwVGltZSwgd1NpemUpOwogICAgIGlmICghbW1UaW1lU3RhcnRlZCkKIAlTdGFydE1NVGltZSgpOwogICAgIGxwVGltZS0+d1R5cGUgPSBUSU1FX01TOwpAQCAtMTk3LDcgKzE5Niw3IEBACiAgICAgTFBUSU1FUkVOVFJZIGxwTmV3VGltZXI7CiAgICAgTFBUSU1FUkVOVFJZIGxwVGltZXIgPSBscFRpbWVyTGlzdDsKIAotICAgIGRwcmludGZfbW10aW1lKHN0ZGRlYiwgInRpbWVTZXRFdmVudDMyKCV1LCAldSwgJXAsICUwOGxYLCAlMDRYKTtcbiIsCisgICAgZHByaW50Zl9pbmZvKG1tdGltZSwgInRpbWVTZXRFdmVudDMyKCV1LCAldSwgJXAsICUwOGxYLCAlMDRYKTtcbiIsCiAJCSAgd0RlbGF5LCB3UmVzb2wsIGxwRnVuYywgZHdVc2VyLCB3RmxhZ3MpOwogICAgIGlmICghbW1UaW1lU3RhcnRlZCkKIAlTdGFydE1NVGltZSgpOwpAQCAtMjE5LDggKzIxOCw4IEBACiAgICAgbHBOZXdUaW1lci0+bHBGdW5jID0gKEZBUlBST0MxNikgbHBGdW5jOwogICAgIGxwTmV3VGltZXItPmlzd2luMzIgPSAxOwogICAgIGxwTmV3VGltZXItPmhJbnN0YW5jZSA9IEdldFRhc2tEUygpOwotCWRwcmludGZfbW10aW1lKHN0ZGRlYiwgInRpbWVTZXRFdmVudCAvLyBoSW5zdGFuY2U9JTA0WCAhXG4iLCBscE5ld1RpbWVyLT5oSW5zdGFuY2UpOwotCWRwcmludGZfbW10aW1lKHN0ZGRlYiwgInRpbWVTZXRFdmVudCAvLyBscEZ1bmM9JXAgIVxuIiwgCisJZHByaW50Zl9pbmZvKG1tdGltZSwgInRpbWVTZXRFdmVudCAvLyBoSW5zdGFuY2U9JTA0WCAhXG4iLCBscE5ld1RpbWVyLT5oSW5zdGFuY2UpOworCWRwcmludGZfaW5mbyhtbXRpbWUsICJ0aW1lU2V0RXZlbnQgLy8gbHBGdW5jPSVwICFcbiIsIAogCQkJCWxwRnVuYyk7CiAgICAgbHBOZXdUaW1lci0+ZHdVc2VyID0gZHdVc2VyOwogICAgIGxwTmV3VGltZXItPndGbGFncyA9IHdGbGFnczsKQEAgLTIzNyw3ICsyMzYsNyBAQAogICAgIFdPUkQgd05ld0lEID0gMDsKICAgICBMUFRJTUVSRU5UUlkgbHBOZXdUaW1lcjsKICAgICBMUFRJTUVSRU5UUlkgbHBUaW1lciA9IGxwVGltZXJMaXN0OwotICAgIGRwcmludGZfbW10aW1lKHN0ZGRlYiwgInRpbWVTZXRFdmVudCgldSwgJXUsICVwLCAlMDhsWCwgJTA0WCk7XG4iLAorICAgIGRwcmludGZfaW5mbyhtbXRpbWUsICJ0aW1lU2V0RXZlbnQoJXUsICV1LCAlcCwgJTA4bFgsICUwNFgpO1xuIiwKIAkJICB3RGVsYXksIHdSZXNvbCwgbHBGdW5jLCBkd1VzZXIsIHdGbGFncyk7CiAgICAgaWYgKCFtbVRpbWVTdGFydGVkKQogCVN0YXJ0TU1UaW1lKCk7CkBAIC0yNTksOCArMjU4LDggQEAKICAgICBscE5ld1RpbWVyLT5scEZ1bmMgPSAoRkFSUFJPQzE2KSBscEZ1bmM7CiAgICAgbHBOZXdUaW1lci0+aXN3aW4zMiA9IDA7CiAgICAgbHBOZXdUaW1lci0+aEluc3RhbmNlID0gR2V0VGFza0RTKCk7Ci0JZHByaW50Zl9tbXRpbWUoc3RkZGViLCAidGltZVNldEV2ZW50IC8vIGhJbnN0YW5jZT0lMDRYICFcbiIsIGxwTmV3VGltZXItPmhJbnN0YW5jZSk7Ci0JZHByaW50Zl9tbXRpbWUoc3RkZGViLCAidGltZVNldEV2ZW50IC8vIFBUUl9TRUdfVE9fTElOKGxwRnVuYyk9JXAgIVxuIiwgCisJZHByaW50Zl9pbmZvKG1tdGltZSwgInRpbWVTZXRFdmVudCAvLyBoSW5zdGFuY2U9JTA0WCAhXG4iLCBscE5ld1RpbWVyLT5oSW5zdGFuY2UpOworCWRwcmludGZfaW5mbyhtbXRpbWUsICJ0aW1lU2V0RXZlbnQgLy8gUFRSX1NFR19UT19MSU4obHBGdW5jKT0lcCAhXG4iLCAKIAkJCQlQVFJfU0VHX1RPX0xJTihscEZ1bmMpKTsKICAgICBscE5ld1RpbWVyLT5kd1VzZXIgPSBkd1VzZXI7CiAgICAgbHBOZXdUaW1lci0+d0ZsYWdzID0gd0ZsYWdzOwpAQCAtMjk4LDcgKzI5Nyw3IEBACiAgKi8KIE1NUkVTVUxUMzIgV0lOQVBJIHRpbWVHZXREZXZDYXBzMzIoTFBUSU1FQ0FQUzMyIGxwQ2FwcyxVSU5UMzIgd1NpemUpCiB7Ci0gICAgZHByaW50Zl9tbXRpbWUoc3RkZGViLCAidGltZUdldERldkNhcHMoJXAsICV1KSAhXG4iLCBscENhcHMsIHdTaXplKTsKKyAgICBkcHJpbnRmX2luZm8obW10aW1lLCAidGltZUdldERldkNhcHMoJXAsICV1KSAhXG4iLCBscENhcHMsIHdTaXplKTsKICAgICBpZiAoIW1tVGltZVN0YXJ0ZWQpCiAJU3RhcnRNTVRpbWUoKTsKICAgICBscENhcHMtPndQZXJpb2RNaW4gPSBNTVNZU1RJTUVfTUlOSU5URVJWQUw7CkBAIC0zMTEsNyArMzEwLDcgQEAKICAqLwogTU1SRVNVTFQxNiBXSU5BUEkgdGltZUdldERldkNhcHMxNihMUFRJTUVDQVBTMTYgbHBDYXBzLCBVSU5UMTYgd1NpemUpCiB7Ci0gICAgZHByaW50Zl9tbXRpbWUoc3RkZGViLCAidGltZUdldERldkNhcHMoJXAsICV1KSAhXG4iLCBscENhcHMsIHdTaXplKTsKKyAgICBkcHJpbnRmX2luZm8obW10aW1lLCAidGltZUdldERldkNhcHMoJXAsICV1KSAhXG4iLCBscENhcHMsIHdTaXplKTsKICAgICBpZiAoIW1tVGltZVN0YXJ0ZWQpCiAJU3RhcnRNTVRpbWUoKTsKICAgICBscENhcHMtPndQZXJpb2RNaW4gPSBNTVNZU1RJTUVfTUlOSU5URVJWQUw7CkBAIC0zMjQsNyArMzIzLDcgQEAKICAqLwogTU1SRVNVTFQzMiBXSU5BUEkgdGltZUJlZ2luUGVyaW9kMzIoVUlOVDMyIHdQZXJpb2QpCiB7Ci0gICAgZHByaW50Zl9tbXRpbWUoc3RkZGViLCAidGltZUJlZ2luUGVyaW9kMzIoJXUpICFcbiIsIHdQZXJpb2QpOworICAgIGRwcmludGZfaW5mbyhtbXRpbWUsICJ0aW1lQmVnaW5QZXJpb2QzMigldSkgIVxuIiwgd1BlcmlvZCk7CiAgICAgaWYgKCFtbVRpbWVTdGFydGVkKQogCVN0YXJ0TU1UaW1lKCk7CiAgICAgaWYgKHdQZXJpb2QgPCBNTVNZU1RJTUVfTUlOSU5URVJWQUwgfHwgd1BlcmlvZCA+IE1NU1lTVElNRV9NQVhJTlRFUlZBTCkgCkBAIC0zMzYsNyArMzM1LDcgQEAKICAqLwogTU1SRVNVTFQxNiBXSU5BUEkgdGltZUJlZ2luUGVyaW9kMTYoVUlOVDE2IHdQZXJpb2QpCiB7Ci0gICAgZHByaW50Zl9tbXRpbWUoc3RkZGViLCAidGltZUJlZ2luUGVyaW9kKCV1KSAhXG4iLCB3UGVyaW9kKTsKKyAgICBkcHJpbnRmX2luZm8obW10aW1lLCAidGltZUJlZ2luUGVyaW9kKCV1KSAhXG4iLCB3UGVyaW9kKTsKICAgICBpZiAoIW1tVGltZVN0YXJ0ZWQpCiAJU3RhcnRNTVRpbWUoKTsKICAgICBpZiAod1BlcmlvZCA8IE1NU1lTVElNRV9NSU5JTlRFUlZBTCB8fCB3UGVyaW9kID4gTU1TWVNUSU1FX01BWElOVEVSVkFMKSAKQEAgLTM0OSw3ICszNDgsNyBAQAogICovCiBNTVJFU1VMVDMyIFdJTkFQSSB0aW1lRW5kUGVyaW9kMzIoVUlOVDMyIHdQZXJpb2QpCiB7Ci0gICAgZHByaW50Zl9tbXRpbWUoc3RkZGViLCAidGltZUVuZFBlcmlvZCgldSkgIVxuIiwgd1BlcmlvZCk7CisgICAgZHByaW50Zl9pbmZvKG1tdGltZSwgInRpbWVFbmRQZXJpb2QoJXUpICFcbiIsIHdQZXJpb2QpOwogICAgIGlmICh3UGVyaW9kIDwgTU1TWVNUSU1FX01JTklOVEVSVkFMIHx8IHdQZXJpb2QgPiBNTVNZU1RJTUVfTUFYSU5URVJWQUwpIAogICAgICAgICByZXR1cm4gVElNRVJSX05PQ0FORE87CiAgICAgcmV0dXJuIDA7CkBAIC0zNjAsNyArMzU5LDcgQEAKICAqLwogTU1SRVNVTFQxNiBXSU5BUEkgdGltZUVuZFBlcmlvZDE2KFVJTlQxNiB3UGVyaW9kKQogewotICAgIGRwcmludGZfbW10aW1lKHN0ZGRlYiwgInRpbWVFbmRQZXJpb2QoJXUpICFcbiIsIHdQZXJpb2QpOworICAgIGRwcmludGZfaW5mbyhtbXRpbWUsICJ0aW1lRW5kUGVyaW9kKCV1KSAhXG4iLCB3UGVyaW9kKTsKICAgICBpZiAod1BlcmlvZCA8IE1NU1lTVElNRV9NSU5JTlRFUlZBTCB8fCB3UGVyaW9kID4gTU1TWVNUSU1FX01BWElOVEVSVkFMKSAKICAgICAgICAgcmV0dXJuIFRJTUVSUl9OT0NBTkRPOwogICAgIHJldHVybiAwOwpAQCAtMzc0LDcgKzM3Myw3IEBACiAgICAgc3RhdGljIERXT1JEIGxhc3R0aWNrPTA7CiAgICAgRFdPUkQJbmV3dGljazsKIAotICAgIGRwcmludGZfbW10aW1lKHN0ZGRlYiwgInRpbWVHZXRUaW1lKCk7ICFcbiIpOworICAgIGRwcmludGZfaW5mbyhtbXRpbWUsICJ0aW1lR2V0VGltZSgpOyAhXG4iKTsKICAgICBpZiAoIW1tVGltZVN0YXJ0ZWQpCiAJU3RhcnRNTVRpbWUoKTsKICAgICBuZXd0aWNrID0gR2V0VGlja0NvdW50KCk7CkBAIC0zODIsNyArMzgxLDcgQEAKICAgICBpZiAobmV3dGljayE9bGFzdHRpY2spCiAgICAgCWNoZWNrX01NdGltZXJzKCk7CiAgICAgbGFzdHRpY2sgPSBuZXd0aWNrOwotICAgIGRwcmludGZfbW10aW1lKHN0ZGRlYiwgInRpbWVHZXRUaW1lKCkgLy8gVGltZSA9ICVsZFxuIixtbVN5c1RpbWVNUy51Lm1zKTsKKyAgICBkcHJpbnRmX2luZm8obW10aW1lLCAidGltZUdldFRpbWUoKSAvLyBUaW1lID0gJWxkXG4iLG1tU3lzVGltZU1TLnUubXMpOwogCiAKICAgICByZXR1cm4gbW1TeXNUaW1lTVMudS5tczsKZGlmZiAtLWdpdCBhL29iamVjdHMvYml0bWFwLmMgYi9vYmplY3RzL2JpdG1hcC5jCmluZGV4IDdkOGEzNmQuLmRmOWJkMmEgMTAwNjQ0Ci0tLSBhL29iamVjdHMvYml0bWFwLmMKKysrIGIvb2JqZWN0cy9iaXRtYXAuYwpAQCAtMTQsNyArMTQsNiBAQAogI2luY2x1ZGUgImRjLmgiCiAjaW5jbHVkZSAiYml0bWFwLmgiCiAjaW5jbHVkZSAiaGVhcC5oIgotI2luY2x1ZGUgInN0ZGRlYnVnLmgiCiAjaW5jbHVkZSAiZGVidWcuaCIKIAogI2lmZGVmIFBSRUxJTUlOQVJZX1dJTkcxNl9TVVBQT1JUCkBAIC0xNDMsNyArMTQyLDcgQEAKICAgICBwbGFuZXMgPSAoQllURSlwbGFuZXM7CiAgICAgYnBwICAgID0gKEJZVEUpYnBwOwogCi0gICAgZHByaW50Zl9nZGkoIHN0ZGRlYiwgIkNyZWF0ZUJpdG1hcDogJWR4JWQsICVkIGNvbG9yc1xuIiwgCisgICAgZHByaW50Zl9pbmZvKGdkaSwgIkNyZWF0ZUJpdG1hcDogJWR4JWQsICVkIGNvbG9yc1xuIiwgCiAgICAgICAgICAgICAgICAgIHdpZHRoLCBoZWlnaHQsIDEgPDwgKHBsYW5lcypicHApICk7CiAKICAgICAgIC8qIENoZWNrIHBhcmFtZXRlcnMgKi8KQEAgLTE5OSwxMSArMTk4LDExIEBACiAgICAgSEJJVE1BUDMyIGhibXBSZXQgPSAwOwogICAgIERDICpkYzsKIAotICAgIGRwcmludGZfZ2RpKCBzdGRkZWIsICJDcmVhdGVDb21wYXRpYmxlQml0bWFwKCUwNHgsJWQsJWQpID0gXG4iLCAKKyAgICBkcHJpbnRmX2luZm8oZ2RpLCAiQ3JlYXRlQ29tcGF0aWJsZUJpdG1hcCglMDR4LCVkLCVkKSA9IFxuIiwgCiAgICAgICAgICAgICAgICAgIGhkYywgd2lkdGgsIGhlaWdodCApOwogICAgIGlmICghKGRjID0gRENfR2V0RENQdHIoIGhkYyApKSkgcmV0dXJuIDA7CiAgICAgaGJtcFJldCA9IENyZWF0ZUJpdG1hcDMyKCB3aWR0aCwgaGVpZ2h0LCAxLCBkYy0+dy5iaXRzUGVyUGl4ZWwsIE5VTEwgKTsKLSAgICBkcHJpbnRmX2dkaShzdGRkZWIsIlx0XHQlMDR4XG4iLCBoYm1wUmV0KTsKKyAgICBkcHJpbnRmX2luZm8oZ2RpLCJcdFx0JTA0eFxuIiwgaGJtcFJldCk7CiAgICAgcmV0dXJuIGhibXBSZXQ7CiB9CiAKQEAgLTI3Miw3ICsyNzEsNyBAQAogICAgIGhlaWdodCA9IGNvdW50IC8gYm1wLT5iaXRtYXAuYm1XaWR0aEJ5dGVzOwogICAgIGlmIChoZWlnaHQgPiBibXAtPmJpdG1hcC5ibUhlaWdodCkgaGVpZ2h0ID0gYm1wLT5iaXRtYXAuYm1IZWlnaHQ7CiAKLSAgICBkcHJpbnRmX2JpdG1hcChzdGRkZWIsICJHZXRCaXRtYXBCaXRzOiAlZHglZCAlZCBjb2xvcnMgJXAgZmV0Y2hlZCBoZWlnaHQ6ICVsZFxuIiwKKyAgICBkcHJpbnRmX2luZm8oYml0bWFwLCAiR2V0Qml0bWFwQml0czogJWR4JWQgJWQgY29sb3JzICVwIGZldGNoZWQgaGVpZ2h0OiAlbGRcbiIsCiAJICAgIGJtcC0+Yml0bWFwLmJtV2lkdGgsIGJtcC0+Yml0bWFwLmJtSGVpZ2h0LAogCSAgICAxIDw8IGJtcC0+Yml0bWFwLmJtQml0c1BpeGVsLCBidWZmZXIsIGhlaWdodCApOwogCkBAIC0zOTUsNyArMzk0LDcgQEAKICAgICBibXAgPSAoQklUTUFQT0JKICopIEdESV9HZXRPYmpQdHIoIGhiaXRtYXAsIEJJVE1BUF9NQUdJQyApOwogICAgIGlmICghYm1wKSByZXR1cm4gMDsKIAotICAgIGRwcmludGZfYml0bWFwKHN0ZGRlYiwgIlNldEJpdG1hcEJpdHM6ICVkeCVkICVkIGNvbG9ycyAlcFxuIiwKKyAgICBkcHJpbnRmX2luZm8oYml0bWFwLCAiU2V0Qml0bWFwQml0czogJWR4JWQgJWQgY29sb3JzICVwXG4iLAogCSAgICBibXAtPmJpdG1hcC5ibVdpZHRoLCBibXAtPmJpdG1hcC5ibUhlaWdodCwKIAkgICAgMSA8PCBibXAtPmJpdG1hcC5ibUJpdHNQaXhlbCwgYnVmZmVyICk7CiAKQEAgLTUwNiwxMSArNTA1LDExIEBACiAJfQogCXN3aXRjaCAodHlwZSkgewogCWNhc2UgSU1BR0VfQklUTUFQOgotCQlyZXR1cm4gTG9hZEJpdG1hcDE2KGhpbnN0LG5hbWUpOworCQlyZXR1cm4gTG9hZEJpdG1hcDE2KGhpbnN0LChTRUdQVFIpbmFtZSk7CiAJY2FzZSBJTUFHRV9JQ09OOgotCQlyZXR1cm4gTG9hZEljb24xNihoaW5zdCxuYW1lKTsKKwkJcmV0dXJuIExvYWRJY29uMTYoaGluc3QsKFNFR1BUUiluYW1lKTsKIAljYXNlIElNQUdFX0NVUlNPUjoKLQkJcmV0dXJuIExvYWRDdXJzb3IxNihoaW5zdCxuYW1lKTsKKwkJcmV0dXJuIExvYWRDdXJzb3IxNihoaW5zdCwoU0VHUFRSKW5hbWUpOwogCX0KIAlyZXR1cm4gMDsKIAkKQEAgLTUyNSwxMSArNTI0LDExIEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJTlQzMiBkZXNpcmVkeCwgSU5UMzIgZGVzaXJlZHksIFVJTlQzMiBsb2FkZmxhZ3MpCiB7CiAJaWYgKEhJV09SRChuYW1lKSkgewotCQlkcHJpbnRmX3Jlc291cmNlKHN0ZGRlYiwiTG9hZEltYWdlMzJBKDB4JTA0eCwlcywlZCwlZCwlZCwweCUwOHgpXG4iLAorCQlkcHJpbnRmX2luZm8ocmVzb3VyY2UsIkxvYWRJbWFnZTMyQSgweCUwNHgsJXMsJWQsJWQsJWQsMHglMDh4KVxuIiwKIAkJCWhpbnN0LG5hbWUsdHlwZSxkZXNpcmVkeCxkZXNpcmVkeSxsb2FkZmxhZ3MKIAkJKTsKIAl9IGVsc2UgewotCQlkcHJpbnRmX3Jlc291cmNlKHN0ZGRlYiwiTG9hZEltYWdlMzJBKDB4JTA0eCwlcCwlZCwlZCwlZCwweCUwOHgpXG4iLAorCQlkcHJpbnRmX2luZm8ocmVzb3VyY2UsIkxvYWRJbWFnZTMyQSgweCUwNHgsJXAsJWQsJWQsJWQsMHglMDh4KVxuIiwKIAkJCWhpbnN0LG5hbWUsdHlwZSxkZXNpcmVkeCxkZXNpcmVkeSxsb2FkZmxhZ3MKIAkJKTsKIAl9CkBAIC01NDgsMTEgKzU0NywxMSBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSU5UMzIgZGVzaXJlZHgsIElOVDMyIGRlc2lyZWR5LCBVSU5UMzIgbG9hZGZsYWdzKQogewogCWlmIChISVdPUkQobmFtZSkpIHsKLQkJZHByaW50Zl9yZXNvdXJjZShzdGRkZWIsIkxvYWRJbWFnZTMyVygweCUwNHgsJXAsJWQsJWQsJWQsMHglMDh4KVxuIiwKKwkJZHByaW50Zl9pbmZvKHJlc291cmNlLCJMb2FkSW1hZ2UzMlcoMHglMDR4LCVwLCVkLCVkLCVkLDB4JTA4eClcbiIsCiAJCQloaW5zdCxuYW1lLHR5cGUsZGVzaXJlZHgsZGVzaXJlZHksbG9hZGZsYWdzCiAJCSk7CiAJfSBlbHNlIHsKLQkJZHByaW50Zl9yZXNvdXJjZShzdGRkZWIsIkxvYWRJbWFnZTMyVygweCUwNHgsJXAsJWQsJWQsJWQsMHglMDh4KVxuIiwKKwkJZHByaW50Zl9pbmZvKHJlc291cmNlLCJMb2FkSW1hZ2UzMlcoMHglMDR4LCVwLCVkLCVkLCVkLDB4JTA4eClcbiIsCiAJCQloaW5zdCxuYW1lLHR5cGUsZGVzaXJlZHgsZGVzaXJlZHksbG9hZGZsYWdzCiAJCSk7CiAJfQpAQCAtNjIwLDExICs2MTksMTEgQEAKICAgICBpZiAoSElXT1JEKG5hbWUpKQogICAgIHsKICAgICAgICAgY2hhciAqc3RyID0gKGNoYXIgKilQVFJfU0VHX1RPX0xJTiggbmFtZSApOwotICAgICAgICBkcHJpbnRmX2JpdG1hcCggc3RkZGViLCAiTG9hZEJpdG1hcDE2KCUwNHgsJyVzJylcbiIsIGluc3RhbmNlLCBzdHIgKTsKKyAgICAgICAgZHByaW50Zl9pbmZvKGJpdG1hcCwgIkxvYWRCaXRtYXAxNiglMDR4LCclcycpXG4iLCBpbnN0YW5jZSwgc3RyICk7CiAgICAgICAgIGlmIChzdHJbMF0gPT0gJyMnKSBuYW1lID0gKFNFR1BUUikoRFdPUkQpKFdPUkQpYXRvaSggc3RyICsgMSApOwogICAgIH0KICAgICBlbHNlCi0gICAgICAgIGRwcmludGZfYml0bWFwKCBzdGRkZWIsICJMb2FkQml0bWFwMTYoJTA0eCwlMDR4KVxuIiwKKyAgICAgICAgZHByaW50Zl9pbmZvKGJpdG1hcCwgIkxvYWRCaXRtYXAxNiglMDR4LCUwNHgpXG4iLAogICAgICAgICAgICAgICAgICAgICAgICAgaW5zdGFuY2UsIExPV09SRChuYW1lKSApOwogCiAgICAgaWYgKCFpbnN0YW5jZSkgIC8qIE9FTSBiaXRtYXAgKi8KZGlmZiAtLWdpdCBhL29iamVjdHMvYnJ1c2guYyBiL29iamVjdHMvYnJ1c2guYwppbmRleCA4OGEyMzJiLi5hZjY4ZDRjIDEwMDY0NAotLS0gYS9vYmplY3RzL2JydXNoLmMKKysrIGIvb2JqZWN0cy9icnVzaC5jCkBAIC05LDcgKzksNiBAQAogI2luY2x1ZGUgImJpdG1hcC5oIgogI2luY2x1ZGUgIm1ldGFmaWxlLmgiCiAjaW5jbHVkZSAiY29sb3IuaCIKLSNpbmNsdWRlICJzdGRkZWJ1Zy5oIgogI2luY2x1ZGUgImRlYnVnLmgiCiAKIApAQCAtNTMsNyArNTIsNyBAQAogSEJSVVNIMTYgV0lOQVBJIENyZWF0ZUhhdGNoQnJ1c2gxNiggSU5UMTYgc3R5bGUsIENPTE9SUkVGIGNvbG9yICkKIHsKICAgICBMT0dCUlVTSDMyIGxvZ2JydXNoID0geyBCU19IQVRDSEVELCBjb2xvciwgc3R5bGUgfTsKLSAgICBkcHJpbnRmX2dkaShzdGRkZWIsICJDcmVhdGVIYXRjaEJydXNoMTY6ICVkICUwNmx4XG4iLCBzdHlsZSwgY29sb3IgKTsKKyAgICBkcHJpbnRmX2luZm8oZ2RpLCAiQ3JlYXRlSGF0Y2hCcnVzaDE2OiAlZCAlMDZseFxuIiwgc3R5bGUsIGNvbG9yICk7CiAgICAgaWYgKChzdHlsZSA8IDApIHx8IChzdHlsZSA+PSBOQl9IQVRDSF9TVFlMRVMpKSByZXR1cm4gMDsKICAgICByZXR1cm4gQ3JlYXRlQnJ1c2hJbmRpcmVjdDMyKCAmbG9nYnJ1c2ggKTsKIH0KQEAgLTY1LDcgKzY0LDcgQEAKIEhCUlVTSDMyIFdJTkFQSSBDcmVhdGVIYXRjaEJydXNoMzIoIElOVDMyIHN0eWxlLCBDT0xPUlJFRiBjb2xvciApCiB7CiAgICAgTE9HQlJVU0gzMiBsb2dicnVzaCA9IHsgQlNfSEFUQ0hFRCwgY29sb3IsIHN0eWxlIH07Ci0gICAgZHByaW50Zl9nZGkoc3RkZGViLCAiQ3JlYXRlSGF0Y2hCcnVzaDMyOiAlZCAlMDZseFxuIiwgc3R5bGUsIGNvbG9yICk7CisgICAgZHByaW50Zl9pbmZvKGdkaSwgIkNyZWF0ZUhhdGNoQnJ1c2gzMjogJWQgJTA2bHhcbiIsIHN0eWxlLCBjb2xvciApOwogICAgIGlmICgoc3R5bGUgPCAwKSB8fCAoc3R5bGUgPj0gTkJfSEFUQ0hfU1RZTEVTKSkgcmV0dXJuIDA7CiAgICAgcmV0dXJuIENyZWF0ZUJydXNoSW5kaXJlY3QzMiggJmxvZ2JydXNoICk7CiB9CkBAIC04OCw3ICs4Nyw3IEBACiAgICAgTE9HQlJVU0gzMiBsb2dicnVzaCA9IHsgQlNfUEFUVEVSTiwgMCwgMCB9OwogICAgIEJJVE1BUE9CSiAqYm1wLCAqbmV3Ym1wOwogCi0gICAgZHByaW50Zl9nZGkoc3RkZGViLCAiQ3JlYXRlUGF0dGVybkJydXNoOiAlMDR4XG4iLCBoYml0bWFwICk7CisgICAgZHByaW50Zl9pbmZvKGdkaSwgIkNyZWF0ZVBhdHRlcm5CcnVzaDogJTA0eFxuIiwgaGJpdG1hcCApOwogCiAgICAgICAvKiBNYWtlIGEgY29weSBvZiB0aGUgYml0bWFwICovCiAKQEAgLTExOSw3ICsxMTgsNyBAQAogICAgIEJJVE1BUElORk8gKmluZm8sICpuZXdJbmZvOwogICAgIElOVDMyIHNpemU7CiAgICAgCi0gICAgZHByaW50Zl9nZGkoc3RkZGViLCAiQ3JlYXRlRElCUGF0dGVybkJydXNoOiAlMDR4XG4iLCBoYml0bWFwICk7CisgICAgZHByaW50Zl9pbmZvKGdkaSwgIkNyZWF0ZURJQlBhdHRlcm5CcnVzaDogJTA0eFxuIiwgaGJpdG1hcCApOwogCiAgICAgICAvKiBNYWtlIGEgY29weSBvZiB0aGUgYml0bWFwICovCiAKQEAgLTE1NCw3ICsxNTMsNyBAQAogICAgIEJJVE1BUElORk8gKmluZm8sICpuZXdJbmZvOwogICAgIElOVDMyIHNpemU7CiAgICAgCi0gICAgZHByaW50Zl9nZGkoc3RkZGViLCAiQ3JlYXRlRElCUGF0dGVybkJydXNoOiAlMDR4XG4iLCBoYml0bWFwICk7CisgICAgZHByaW50Zl9pbmZvKGdkaSwgIkNyZWF0ZURJQlBhdHRlcm5CcnVzaDogJTA0eFxuIiwgaGJpdG1hcCApOwogCiAgICAgICAvKiBNYWtlIGEgY29weSBvZiB0aGUgYml0bWFwICovCiAKQEAgLTE4Niw3ICsxODUsNyBAQAogSEJSVVNIMTYgV0lOQVBJIENyZWF0ZVNvbGlkQnJ1c2gxNiggQ09MT1JSRUYgY29sb3IgKQogewogICAgIExPR0JSVVNIMzIgbG9nYnJ1c2ggPSB7IEJTX1NPTElELCBjb2xvciwgMCB9OwotICAgIGRwcmludGZfZ2RpKHN0ZGRlYiwgIkNyZWF0ZVNvbGlkQnJ1c2gxNjogJTA2bHhcbiIsIGNvbG9yICk7CisgICAgZHByaW50Zl9pbmZvKGdkaSwgIkNyZWF0ZVNvbGlkQnJ1c2gxNjogJTA2bHhcbiIsIGNvbG9yICk7CiAgICAgcmV0dXJuIENyZWF0ZUJydXNoSW5kaXJlY3QzMiggJmxvZ2JydXNoICk7CiB9CiAKQEAgLTE5Nyw3ICsxOTYsNyBAQAogSEJSVVNIMzIgV0lOQVBJIENyZWF0ZVNvbGlkQnJ1c2gzMiggQ09MT1JSRUYgY29sb3IgKQogewogICAgIExPR0JSVVNIMzIgbG9nYnJ1c2ggPSB7IEJTX1NPTElELCBjb2xvciwgMCB9OwotICAgIGRwcmludGZfZ2RpKHN0ZGRlYiwgIkNyZWF0ZVNvbGlkQnJ1c2gzMjogJTA2bHhcbiIsIGNvbG9yICk7CisgICAgZHByaW50Zl9pbmZvKGdkaSwgIkNyZWF0ZVNvbGlkQnJ1c2gzMjogJTA2bHhcbiIsIGNvbG9yICk7CiAgICAgcmV0dXJuIENyZWF0ZUJydXNoSW5kaXJlY3QzMiggJmxvZ2JydXNoICk7CiB9CiAKZGlmZiAtLWdpdCBhL29iamVjdHMvY2xpcHBpbmcuYyBiL29iamVjdHMvY2xpcHBpbmcuYwppbmRleCA3ZjlhY2IyLi5jNDM1NzExIDEwMDY0NAotLS0gYS9vYmplY3RzL2NsaXBwaW5nLmMKKysrIGIvb2JqZWN0cy9jbGlwcGluZy5jCkBAIC04LDcgKzgsNiBAQAogI2luY2x1ZGUgImRjLmgiCiAjaW5jbHVkZSAibWV0YWZpbGUuaCIKICNpbmNsdWRlICJyZWdpb24uaCIKLSNpbmNsdWRlICJzdGRkZWJ1Zy5oIgogI2luY2x1ZGUgImRlYnVnLmgiCiAKICNkZWZpbmUgVVBEQVRFX0RJUlRZX0RDKGRjKSBcCkBAIC02Niw3ICs2NSw3IEBACiAgICAgREMgKiBkYyA9IChEQyAqKSBHRElfR2V0T2JqUHRyKCBoZGMsIERDX01BR0lDICk7CiAgICAgaWYgKCFkYykgcmV0dXJuIEVSUk9SOwogCi0gICAgZHByaW50Zl9jbGlwcGluZyhzdGRkZWIsICJTZWxlY3RDbGlwUmduOiAlMDR4ICUwNHhcbiIsIGhkYywgaHJnbiApOworICAgIGRwcmludGZfaW5mbyhjbGlwcGluZywgIlNlbGVjdENsaXBSZ246ICUwNHggJTA0eFxuIiwgaGRjLCBocmduICk7CiAKICAgICBpZiAoaHJnbikKICAgICB7CkBAIC05NSw3ICs5NCw3IEBACiAgICAgREMgKiBkYyA9IChEQyAqKSBHRElfR2V0T2JqUHRyKCBoZGMsIERDX01BR0lDICk7CiAgICAgaWYgKCFkYyB8fCAhaHJnbikgcmV0dXJuIEVSUk9SOwogCi0gICAgZHByaW50Zl9jbGlwcGluZyhzdGRkZWIsICJTZWxlY3RWaXNSZ246ICUwNHggJTA0eFxuIiwgaGRjLCBocmduICk7CisgICAgZHByaW50Zl9pbmZvKGNsaXBwaW5nLCAiU2VsZWN0VmlzUmduOiAlMDR4ICUwNHhcbiIsIGhkYywgaHJnbiApOwogCiAgICAgZGMtPncuZmxhZ3MgJj0gfkRDX0RJUlRZOwogCkBAIC0xMzAsNyArMTI5LDcgQEAKIAlyZXR1cm4gTlVMTFJFR0lPTjsgICAvKiA/PyAqLwogICAgIH0KIAotICAgIGRwcmludGZfY2xpcHBpbmcoc3RkZGViLCAiT2Zmc2V0Q2xpcFJnbjogJTA0eCAlZCwlZFxuIiwgaGRjLCB4LCB5ICk7CisgICAgZHByaW50Zl9pbmZvKGNsaXBwaW5nLCAiT2Zmc2V0Q2xpcFJnbjogJTA0eCAlZCwlZFxuIiwgaGRjLCB4LCB5ICk7CiAKICAgICBpZiAoZGMtPncuaENsaXBSZ24pCiAgICAgewpAQCAtMTUyLDcgKzE1MSw3IEBACiAgICAgSU5UMTYgcmV0dmFsOwogICAgIERDICogZGMgPSAoREMgKikgR0RJX0dldE9ialB0ciggaGRjLCBEQ19NQUdJQyApOwogICAgIGlmICghZGMpIHJldHVybiBFUlJPUjsgICAgCi0gICAgZHByaW50Zl9jbGlwcGluZyhzdGRkZWIsICJPZmZzZXRWaXNSZ246ICUwNHggJWQsJWRcbiIsIGhkYywgeCwgeSApOworICAgIGRwcmludGZfaW5mbyhjbGlwcGluZywgIk9mZnNldFZpc1JnbjogJTA0eCAlZCwlZFxuIiwgaGRjLCB4LCB5ICk7CiAgICAgcmV0dmFsID0gT2Zmc2V0UmduMzIoIGRjLT53LmhWaXNSZ24sIHgsIHkgKTsKICAgICBDTElQUElOR19VcGRhdGVHQ1JlZ2lvbiggZGMgKTsKICAgICBHRElfSEVBUF9VTkxPQ0soIGhkYyApOwpAQCAtMjI5LDcgKzIyOCw3IEBACiAgICAgdG9wICAgID0gWUxQVE9EUCggZGMsIHRvcCApOwogICAgIGJvdHRvbSA9IFlMUFRPRFAoIGRjLCBib3R0b20gKTsKIAotICAgIGRwcmludGZfY2xpcHBpbmcoc3RkZGViLCAiRXhjbHVkZUNsaXBSZWN0OiAlMDR4ICVkeCVkLCVkeCVkXG4iLAorICAgIGRwcmludGZfaW5mbyhjbGlwcGluZywgIkV4Y2x1ZGVDbGlwUmVjdDogJTA0eCAlZHglZCwlZHglZFxuIiwKIAkgICAgaGRjLCBsZWZ0LCB0b3AsIHJpZ2h0LCBib3R0b20gKTsKICAgICByZXQgPSBDTElQUElOR19JbnRlcnNlY3RDbGlwUmVjdCggZGMsIGxlZnQsIHRvcCwgcmlnaHQsIGJvdHRvbSwgQ0xJUF9FWENMVURFICk7CiAgICAgR0RJX0hFQVBfVU5MT0NLKCBoZGMgKTsKQEAgLTI2OSw3ICsyNjgsNyBAQAogICAgIHRvcCAgICA9IFlMUFRPRFAoIGRjLCB0b3AgKTsKICAgICBib3R0b20gPSBZTFBUT0RQKCBkYywgYm90dG9tICk7CiAKLSAgICBkcHJpbnRmX2NsaXBwaW5nKHN0ZGRlYiwgIkludGVyc2VjdENsaXBSZWN0OiAlMDR4ICVkeCVkLCVkeCVkXG4iLAorICAgIGRwcmludGZfaW5mbyhjbGlwcGluZywgIkludGVyc2VjdENsaXBSZWN0OiAlMDR4ICVkeCVkLCVkeCVkXG4iLAogCSAgICBoZGMsIGxlZnQsIHRvcCwgcmlnaHQsIGJvdHRvbSApOwogICAgIHJldCA9IENMSVBQSU5HX0ludGVyc2VjdENsaXBSZWN0KCBkYywgbGVmdCwgdG9wLCByaWdodCwgYm90dG9tLCBDTElQX0lOVEVSU0VDVCApOwogICAgIEdESV9IRUFQX1VOTE9DSyggaGRjICk7CkBAIC0zMjcsNyArMzI2LDcgQEAKIHsKICAgICBEQyAqIGRjID0gKERDICopIEdESV9HZXRPYmpQdHIoIGhkYywgRENfTUFHSUMgKTsKICAgICBpZiAoIWRjKSByZXR1cm4gRVJST1I7ICAgIAotICAgIGRwcmludGZfY2xpcHBpbmcoc3RkZGViLCAiRXhjbHVkZVZpc1JlY3Q6ICUwNHggJWR4JWQsJWR4JWRcbiIsCisgICAgZHByaW50Zl9pbmZvKGNsaXBwaW5nLCAiRXhjbHVkZVZpc1JlY3Q6ICUwNHggJWR4JWQsJWR4JWRcbiIsCiAJICAgIGhkYywgbGVmdCwgdG9wLCByaWdodCwgYm90dG9tICk7CiAKICAgICByZXR1cm4gQ0xJUFBJTkdfSW50ZXJzZWN0VmlzUmVjdCggZGMsIGxlZnQsIHRvcCwgcmlnaHQsIGJvdHRvbSwgVFJVRSApOwpAQCAtMzQyLDcgKzM0MSw3IEBACiB7CiAgICAgREMgKiBkYyA9IChEQyAqKSBHRElfR2V0T2JqUHRyKCBoZGMsIERDX01BR0lDICk7CiAgICAgaWYgKCFkYykgcmV0dXJuIEVSUk9SOyAgICAKLSAgICBkcHJpbnRmX2NsaXBwaW5nKHN0ZGRlYiwgIkludGVyc2VjdFZpc1JlY3Q6ICUwNHggJWR4JWQsJWR4JWRcbiIsCisgICAgZHByaW50Zl9pbmZvKGNsaXBwaW5nLCAiSW50ZXJzZWN0VmlzUmVjdDogJTA0eCAlZHglZCwlZHglZFxuIiwKIAkgICAgaGRjLCBsZWZ0LCB0b3AsIHJpZ2h0LCBib3R0b20gKTsKIAogICAgIHJldHVybiBDTElQUElOR19JbnRlcnNlY3RWaXNSZWN0KCBkYywgbGVmdCwgdG9wLCByaWdodCwgYm90dG9tLCBGQUxTRSApOwpAQCAtMzY2LDcgKzM2NSw3IEBACiAgICAgREMgKiBkYyA9IChEQyAqKSBHRElfR2V0T2JqUHRyKCBoZGMsIERDX01BR0lDICk7CiAgICAgaWYgKCFkYykgcmV0dXJuIEVSUk9SOyAgICAKIAotICAgIGRwcmludGZfY2xpcHBpbmcoc3RkZGViLCAiUHRWaXNpYmxlOiAlMDR4ICVkLCVkXG4iLCBoZGMsIHgsIHkgKTsKKyAgICBkcHJpbnRmX2luZm8oY2xpcHBpbmcsICJQdFZpc2libGU6ICUwNHggJWQsJWRcbiIsIGhkYywgeCwgeSApOwogICAgIGlmICghZGMtPncuaEdDQ2xpcFJnbikgcmV0dXJuIEZBTFNFOwogCiAgICAgaWYoIGRjLT53LmZsYWdzICYgRENfRElSVFkgKSBVUERBVEVfRElSVFlfREMoZGMpOwpAQCAtMzg0LDcgKzM4Myw3IEBACiAgICAgUkVDVDE2IHRtcFJlY3Q7CiAgICAgREMgKiBkYyA9IChEQyAqKSBHRElfR2V0T2JqUHRyKCBoZGMsIERDX01BR0lDICk7CiAgICAgaWYgKCFkYykgcmV0dXJuIEZBTFNFOwotICAgIGRwcmludGZfY2xpcHBpbmcoc3RkZGViLCJSZWN0VmlzaWJsZTogJTA0eCAlZCwlZHglZCwlZFxuIiwKKyAgICBkcHJpbnRmX2luZm8oY2xpcHBpbmcsIlJlY3RWaXNpYmxlOiAlMDR4ICVkLCVkeCVkLCVkXG4iLAogICAgICAgICAgICAgICAgICAgICAgaGRjLCByZWN0LT5sZWZ0LCByZWN0LT50b3AsIHJlY3QtPnJpZ2h0LCByZWN0LT5ib3R0b20gKTsKICAgICBpZiAoIWRjLT53LmhHQ0NsaXBSZ24pIHJldHVybiBGQUxTRTsKICAgICAvKiBjb3B5IHJlY3RhbmdsZSB0byBhdm9pZCBvdmVyd3JpdGluZyBieSBMUHRvRFAgKi8KQEAgLTQ2MSw3ICs0NjAsNyBAQAogICAgIFJHTk9CSiAqb2JqLCAqY29weU9iajsKICAgICBEQyAqIGRjID0gKERDICopIEdESV9HZXRPYmpQdHIoIGhkYywgRENfTUFHSUMgKTsKICAgICBpZiAoIWRjKSByZXR1cm4gMDsKLSAgICBkcHJpbnRmX2NsaXBwaW5nKHN0ZGRlYiwgIlNhdmVWaXNSZ246ICUwNHhcbiIsIGhkYyApOworICAgIGRwcmludGZfaW5mbyhjbGlwcGluZywgIlNhdmVWaXNSZ246ICUwNHhcbiIsIGhkYyApOwogICAgIGlmICghZGMtPncuaFZpc1JnbikKICAgICB7CiAgICAgICAgIGZwcmludGYoIHN0ZGVyciwgIlNhdmVWaXNSZ246IGhWaXNSZ24gaXMgemVyby4gUGxlYXNlIHJlcG9ydCB0aGlzLlxuIiApOwpAQCAtNTEzLDcgKzUxMiw3IEBACiAgICAgICAgIEdESV9IRUFQX1VOTE9DSyggaGRjICk7CiAgICAgICAgIHJldHVybiBFUlJPUjsgICAgCiAgICAgfQotICAgIGRwcmludGZfY2xpcHBpbmcoc3RkZGViLCAiUmVzdG9yZVZpc1JnbjogJTA0eFxuIiwgaGRjICk7CisgICAgZHByaW50Zl9pbmZvKGNsaXBwaW5nLCAiUmVzdG9yZVZpc1JnbjogJTA0eFxuIiwgaGRjICk7CiAgICAgaWYgKCEob2JqID0gKFJHTk9CSiAqKSBHRElfR2V0T2JqUHRyKCBkYy0+dy5oVmlzUmduLCBSRUdJT05fTUFHSUMgKSkpCiAgICAgewogICAgICAgICBHRElfSEVBUF9VTkxPQ0soIGhkYyApOwpkaWZmIC0tZ2l0IGEvb2JqZWN0cy9jb2xvci5jIGIvb2JqZWN0cy9jb2xvci5jCmluZGV4IDU0NzZhNzUuLjYzOTlkMzkgMTAwNjQ0Ci0tLSBhL29iamVjdHMvY29sb3IuYworKysgYi9vYmplY3RzL2NvbG9yLmMKQEAgLTEzLDcgKzEzLDYgQEAKICNpbmNsdWRlICJvcHRpb25zLmgiCiAjaW5jbHVkZSAiZ2RpLmgiCiAjaW5jbHVkZSAiY29sb3IuaCIKLSNpbmNsdWRlICJzdGRkZWJ1Zy5oIgogI2luY2x1ZGUgImRlYnVnLmgiCiAjaW5jbHVkZSAieG1hbGxvYy5oIgogCkBAIC0yODksNyArMjg4LDcgQEAKIAogICAgIENPTE9SX3N5c1BhbCA9IChQQUxFVFRFRU5UUlkqKXhtYWxsb2Moc2l6ZW9mKFBBTEVUVEVFTlRSWSkqY3MtPnNpemUpOwogCi0gICAgZHByaW50Zl9wYWxldHRlKHN0ZGRlYiwiXHRidWlsZGluZyBwcml2YXRlIG1hcCAtICVpIHBhbGV0dGUgZW50cmllc1xuIiwgY3MtPnNpemUpOworICAgIGRwcmludGZfaW5mbyhwYWxldHRlLCJcdGJ1aWxkaW5nIHByaXZhdGUgbWFwIC0gJWkgcGFsZXR0ZSBlbnRyaWVzXG4iLCBjcy0+c2l6ZSk7CiAKICAgICAgIC8qIEFsbG9jYXRlIHN5c3RlbSBwYWxldHRlIGNvbG9ycyAqLyAKIApAQCAtMzQ2LDkgKzM0NSw5IEBACiAgICBDT0xPUl9tYXggPSBQUk9GSUxFX0dldFdpbmVJbmlJbnQoICJvcHRpb25zIiwgIkFsbG9jU3lzdGVtQ29sb3JzIiwgMjU2KTsKICAgIGlmIChDT0xPUl9tYXggPiAyNTYpIENPTE9SX21heCA9IDI1NjsKICAgIGVsc2UgaWYgKENPTE9SX21heCA8IDIwKSBDT0xPUl9tYXggPSAyMDsKLSAgIGRwcmludGZfcGFsZXR0ZShzdGRkZWIsIkNPTE9SX0luaXQ6ICVkIGNvbG9ycyBjb25maWd1cmVkLlxuIiwgQ09MT1JfbWF4KTsKKyAgIGRwcmludGZfaW5mbyhwYWxldHRlLCJDT0xPUl9Jbml0OiAlZCBjb2xvcnMgY29uZmlndXJlZC5cbiIsIENPTE9SX21heCk7CiAgICAKLSAgIGRwcmludGZfcGFsZXR0ZShzdGRkZWIsIlx0YnVpbGRpbmcgc2hhcmVkIG1hcCAtICVpIHBhbGV0dGUgZW50cmllc1xuIiwgY3MtPnNpemUpOworICAgZHByaW50Zl9pbmZvKHBhbGV0dGUsIlx0YnVpbGRpbmcgc2hhcmVkIG1hcCAtICVpIHBhbGV0dGUgZW50cmllc1xuIiwgY3MtPnNpemUpOwogCiAgICAvKiBCZSBuaWNlIGFuZCBhbGxvY2F0ZSBzeXN0ZW0gY29sb3JzIGFzIHJlYWQtb25seSAqLwogCkBAIC0zNjUsNyArMzY0LDcgQEAKIAkgICAgIAogICAgICAgICAgICAgIGlmKCAhd2FybisrICkgCiAJICAgICB7Ci0JCSAgZHByaW50Zl9wYWxldHRlKHN0ZGRlYiwgIk5vdCBlbm91Z2ggY29sb3JzIGZvciB0aGUgZnVsbCBzeXN0ZW0gcGFsZXR0ZS5cbiIpOworCQkgIGRwcmludGZfd2FybihwYWxldHRlLCAiTm90IGVub3VnaCBjb2xvcnMgZm9yIHRoZSBmdWxsIHN5c3RlbSBwYWxldHRlLlxuIik7CiAKIAkgICAgICAgICAgYnAgPSBCbGFja1BpeGVsKGRpc3BsYXksIERlZmF1bHRTY3JlZW4oZGlzcGxheSkpOwogCSAgICAgICAgICB3cCA9IFdoaXRlUGl4ZWwoZGlzcGxheSwgRGVmYXVsdFNjcmVlbihkaXNwbGF5KSk7CkBAIC00MDMsNyArNDAyLDcgQEAKIAogICAgICAgICBzeXNQaXhlbFtpXSA9IGNvbG9yLnBpeGVsOwogCi0gICAgICAgIGRwcmludGZfcGFsZXR0ZShzdGRkZWIsIlx0c3lzY29sb3IoJWx4KSAtPiBwaXhlbCAlaVxuIiwKKyAgICAgICAgZHByaW50Zl9pbmZvKHBhbGV0dGUsIlx0c3lzY29sb3IoJWx4KSAtPiBwaXhlbCAlaVxuIiwKIAkJICAgICAgKihDT0xPUlJFRiopKF9fc3lzUGFsVGVtcGxhdGUraSksIChpbnQpY29sb3IucGl4ZWwpOwogCiAgICAgICAgIC8qIFNldCBFR0EgbWFwcGluZyBpZiBjb2xvciBpbiB0aGUgZmlyc3Qgb3IgbGFzdCBlaWdodCAqLwpAQCAtNDIwLDcgKzQxOSw3IEBACiAgICAgIHsKIAlpbnQgY19taW4gPSAwLCBjX21heCA9IGNzLT5zaXplLCBjX3ZhbDsKIAotCWRwcmludGZfcGFsZXR0ZShzdGRkZWIsIlx0ZHluYW1pYyBjb2xvcm1hcC4uLiAiKTsKKwlkcHJpbnRmX2luZm8ocGFsZXR0ZSwiXHRkeW5hbWljIGNvbG9ybWFwLi4uIFxuIik7CiAKIAkvKiBjb21tZW50IHRoaXMgb3V0IGlmIHlvdSB3YW50IHRvIGRlYnVnIHBhbGV0dGUgaW5pdCAqLwogCkBAIC00NjIsNyArNDYxLDcgQEAKIAogCVRTWFVuZ3JhYlNlcnZlcihkaXNwbGF5KTsKIAotCWRwcmludGZfcGFsZXR0ZShzdGRkZWIsImFkanVzdGVkIHNpemUgJWkgY29sb3JjZWxsc1xuIiwgY3MtPnNpemUpOworCWRwcmludGZfaW5mbyhwYWxldHRlLCJhZGp1c3RlZCBzaXplICVpIGNvbG9yY2VsbHNcbiIsIGNzLT5zaXplKTsKICAgICAgfQogICAgZWxzZSBpZiggY1NwYWNlLmZsYWdzICYgQ09MT1JfVklSVFVBTCApIAogCXsKQEAgLTQ3MSwxMiArNDcwLDEyIEBACiAJICAgKiB0byBtYWludGFpbiBjb21wYXRpYmlsaXR5CiAJICAgKi8KIAkgIGNzLT5zaXplID0gMjU2OwotCSAgZHByaW50Zl9wYWxldHRlKHN0ZGRlYiwiXHR2aXJ0dWFsIGNvbG9yc3BhY2UgLSBzY3JlZW5kZXB0aCAlaVxuIiwgc2NyZWVuRGVwdGgpOworCSAgZHByaW50Zl9pbmZvKHBhbGV0dGUsIlx0dmlydHVhbCBjb2xvcnNwYWNlIC0gc2NyZWVuZGVwdGggJWlcbiIsIHNjcmVlbkRlcHRoKTsKIAl9CiAgICBlbHNlIGNzLT5zaXplID0gTkJfUkVTRVJWRURfQ09MT1JTOwkvKiBzeXN0ZW0gcGFsZXR0ZSBvbmx5IC0gaG93ZXZlciB3ZSBjYW4gYWxsb2MgYSBidW5jaAogCQkJICAgICAgICAgICAgICAgICAqIG9mIGNvbG9ycyBhbmQgbWFwIHRvIHRoZW0gKi8KIAotICAgZHByaW50Zl9wYWxldHRlKHN0ZGRlYiwiU2hhcmVkIHN5c3RlbSBwYWxldHRlIHVzZXMgJWkgY29sb3JzLlxuIiwgY3MtPnNpemUpOworICAgZHByaW50Zl9pbmZvKHBhbGV0dGUsIlNoYXJlZCBzeXN0ZW0gcGFsZXR0ZSB1c2VzICVpIGNvbG9ycy5cbiIsIGNzLT5zaXplKTsKIAogICAgLyogc2V0IGdhcCB0byBhY2NvdW50IGZvciBwaXhlbCBzaG9ydGFnZS4gSXQgaGFzIHRvIGJlIHJpZ2h0IGluIHRoZSBjZW50ZXIKICAgICAqIG9mIHRoZSBzeXN0ZW0gcGFsZXR0ZSBiZWNhdXNlIG90aGVyd2lzZSByYXN0ZXIgb3BzIGdldCBzY3Jld2VkLiAqLwpAQCAtNTMwLDcgKzUyOSw3IEBACiAgICAgICAgICAgIGVsc2UKICAgICAgICAgICAgICBDT0xPUl9QYWxldHRlVG9QaXhlbFtpXSA9IGk7CiAKLSAgICAgIGRwcmludGZfcGFsZXR0ZShzdGRkZWIsIlx0aW5kZXggJWkgLT4gcGl4ZWwgJWlcbiIsIGksIENPTE9SX1BhbGV0dGVUb1BpeGVsW2ldKTsKKyAgICAgIGRwcmludGZfaW5mbyhwYWxldHRlLCJcdGluZGV4ICVpIC0+IHBpeGVsICVpXG4iLCBpLCBDT0xPUl9QYWxldHRlVG9QaXhlbFtpXSk7CiAKICAgICAgIGlmKCBDT0xPUl9QaXhlbFRvUGFsZXR0ZSApCiAgICAgICAgICAgQ09MT1JfUGl4ZWxUb1BhbGV0dGVbQ09MT1JfUGFsZXR0ZVRvUGl4ZWxbaV1dID0gaTsKQEAgLTU3NSw3ICs1NzQsNyBAQAogCiAgICAgdmlzdWFsID0gRGVmYXVsdFZpc3VhbCggZGlzcGxheSwgRGVmYXVsdFNjcmVlbihkaXNwbGF5KSApOwogCi0gICAgZHByaW50Zl9wYWxldHRlKHN0ZGRlYiwiQ09MT1JfSW5pdDogaW5pdGlhbGl6aW5nIHBhbGV0dGUgbWFuYWdlci4uLiIpOworICAgIGRwcmludGZfaW5mbyhwYWxldHRlLCJDT0xPUl9Jbml0OiBpbml0aWFsaXppbmcgcGFsZXR0ZSBtYW5hZ2VyLi4uXG4iKTsKIAogICAgIHdoaXRlID0gV2hpdGVQaXhlbE9mU2NyZWVuKCBzY3JlZW4gKTsKICAgICBibGFjayA9IEJsYWNrUGl4ZWxPZlNjcmVlbiggc2NyZWVuICk7CkBAIC02NTAsNyArNjQ5LDcgQEAKICAgICB9CiAgICAgfQogCi0gICAgZHByaW50Zl9wYWxldHRlKHN0ZGRlYiwiIHZpc3VhbCBjbGFzcyAlaSAoJWkpXG4iLCAKKyAgICBkcHJpbnRmX2luZm8ocGFsZXR0ZSwiIHZpc3VhbCBjbGFzcyAlaSAoJWkpXG4iLCAKIAkJICAgIHZpc3VhbC0+Y2xhc3MsIGNTcGFjZS5tb25vUGxhbmUpOwogCiAgICAgbWVtc2V0KENPTE9SX2ZyZWVMaXN0LCAwLCAyNTYqc2l6ZW9mKHVuc2lnbmVkIGNoYXIpKTsKQEAgLTk0Miw3ICs5NDEsNyBAQAogCiAJaWYoICFwYWxQdHIgKSByZXR1cm4gMDsKIAllbHNlIGlmKCAhcGFsUHRyLT5tYXBwaW5nICkgCi0gICAgICAgICAgICBkcHJpbnRmX3BhbGV0dGUoc3RkZGViLCJcdHBhbGV0dGUgJTA0eCBpcyBub3QgcmVhbGl6ZWRcbiIsIGRjLT53LmhQYWxldHRlKTsKKyAgICAgICAgICAgIGRwcmludGZfd2FybihwYWxldHRlLCAiXHRwYWxldHRlICUwNHggaXMgbm90IHJlYWxpemVkXG4iLCBkYy0+dy5oUGFsZXR0ZSk7CiAKIAlzd2l0Y2goc3BlY190eXBlKQkvKiB3ZSBoYXZlIHRvIHBlcnVzZSBEQyBhbmQgc3lzdGVtIHBhbGV0dGUgKi8KICAgICAJewpAQCAtOTYxLDcgKzk2MCw3IEBACiAJICAgIAlpbmRleCA9IENPTE9SX1BhbGV0dGVMb29rdXBQaXhlbCggQ09MT1Jfc3lzUGFsLCAyNTYsIAogCQkJCQkJICBDT0xPUl9QYWxldHRlVG9QaXhlbCwgY29sb3IsIEZBTFNFKTsKIAotCQkvKiBkcHJpbnRmX3BhbGV0dGUoc3RkZGViLCJcdFJHQiglbHgpIC0+IHBpeGVsICVpXG4iLCBjb2xvciwgaW5kZXgpOworCQkvKiBkcHJpbnRmX2luZm8ocGFsZXR0ZSwiXHRSR0IoJWx4KSAtPiBwaXhlbCAlaVxuIiwgY29sb3IsIGluZGV4KTsKIAkJICovCiAJICAgIAlicmVhazsKICAgICAgICAJICAgIGNhc2UgMTogIC8qIFBBTEVUVEVJTkRFWCAqLwpAQCAtOTcxLDE0ICs5NzAsMTQgQEAKIAkJICAgIGZwcmludGYoc3RkZXJyLCAiXHRSR0IoJWx4KSA6IGluZGV4ICVpIGlzIG91dCBvZiBib3VuZHNcbiIsIGNvbG9yLCBpbmRleCk7IAogCQllbHNlIGlmKCBwYWxQdHItPm1hcHBpbmcgKSBpbmRleCA9IHBhbFB0ci0+bWFwcGluZ1tpbmRleF07CiAKLQkJLyogIGRwcmludGZfcGFsZXR0ZShzdGRkZWIsIlx0UEFMRVRURUlOREVYKCUwNHgpIC0+IHBpeGVsICVpXG4iLCAoV09SRCljb2xvciwgaW5kZXgpOworCQkvKiAgZHByaW50Zl9pbmZvKHBhbGV0dGUsIlx0UEFMRVRURUlOREVYKCUwNHgpIC0+IHBpeGVsICVpXG4iLCAoV09SRCljb2xvciwgaW5kZXgpOwogCQkgKi8KIAkJYnJlYWs7CiAgICAgICAgICAgICBjYXNlIDI6ICAvKiBQQUxFVFRFUkdCICovCiAJCWluZGV4ID0gQ09MT1JfUGFsZXR0ZUxvb2t1cFBpeGVsKCBwYWxQdHItPmxvZ3BhbGV0dGUucGFsUGFsRW50cnksIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFsUHRyLT5sb2dwYWxldHRlLnBhbE51bUVudHJpZXMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYWxQdHItPm1hcHBpbmcsIGNvbG9yLCBGQUxTRSk7Ci0JCS8qIGRwcmludGZfcGFsZXR0ZShzdGRkZWIsIlx0UEFMRVRURVJHQiglbHgpIC0+IHBpeGVsICVpXG4iLCBjb2xvciwgaW5kZXgpOworCQkvKiBkcHJpbnRmX2luZm8ocGFsZXR0ZSwiXHRQQUxFVFRFUkdCKCVseCkgLT4gcGl4ZWwgJWlcbiIsIGNvbG9yLCBpbmRleCk7CiAJCSAqLwogCQlicmVhazsKIAl9CkBAIC0xMDc4LDcgKzEwNzcsNyBAQAogICAgICAgICBpZiggIXByZXZNYXBwaW5nIHx8IHBhbFB0ci0+bWFwcGluZ1t1U3RhcnRdICE9IGluZGV4ICkgaVJlbWFwcGVkKys7CiAgICAgICAgIHBhbFB0ci0+bWFwcGluZ1t1U3RhcnRdID0gaW5kZXg7CiAKLSAgICAgICAgZHByaW50Zl9wYWxldHRlKHN0ZGRlYiwiXHRlbnRyeSAlaSAoJWx4KSAtPiBwaXhlbCAlaVxuIiwgdVN0YXJ0LCAKKyAgICAgICAgZHByaW50Zl9pbmZvKHBhbGV0dGUsIlx0ZW50cnkgJWkgKCVseCkgLT4gcGl4ZWwgJWlcbiIsIHVTdGFydCwgCiAJCQkJKihDT0xPUlJFRiopKHBhbFB0ci0+bG9ncGFsZXR0ZS5wYWxQYWxFbnRyeSArIHVTdGFydCksIGluZGV4KTsKIAkKICAgICB9CmRpZmYgLS1naXQgYS9vYmplY3RzL2N1cnNvcmljb24uYyBiL29iamVjdHMvY3Vyc29yaWNvbi5jCmluZGV4IDg4OGU5NWUuLmRiMjM1NzQgMTAwNjQ0Ci0tLSBhL29iamVjdHMvY3Vyc29yaWNvbi5jCisrKyBiL29iamVjdHMvY3Vyc29yaWNvbi5jCkBAIC0zOCw3ICszOCw2IEBACiAjaW5jbHVkZSAic3lzbWV0cmljcy5oIgogI2luY2x1ZGUgIm1vZHVsZS5oIgogI2luY2x1ZGUgIndpbi5oIgotI2luY2x1ZGUgInN0ZGRlYnVnLmgiCiAjaW5jbHVkZSAiZGVidWcuaCIKICNpbmNsdWRlICJ0YXNrLmgiCiAjaW5jbHVkZSAidXNlci5oIgpAQCAtMjkwLDcgKzI4OSw3IEBACiAgICAgQklUTUFQSU5GTyAqYm1pOwogICAgIEhEQzMyIGhkYzsKIAotICAgIGRwcmludGZfY3Vyc29yKHN0ZGRlYiwiQ3JlYXRlRnJvbVJlc291cmNlOiAlMDh4ICgldSBieXRlcyksIHZlciAlMDh4LCAlaXglaSAlcyAlc1xuIiwKKyAgICBkcHJpbnRmX2luZm8oY3Vyc29yLCJDcmVhdGVGcm9tUmVzb3VyY2U6ICUwOHggKCV1IGJ5dGVzKSwgdmVyICUwOHgsICVpeCVpICVzICVzXG4iLAogICAgICAgICAgICAgICAgICAgICAgICAgKHVuc2lnbmVkKWJpdHMsIGNiU2l6ZSwgKHVuc2lnbmVkKWR3VmVyc2lvbiwgd2lkdGgsIGhlaWdodCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiSWNvbiA/ICJpY29uIiA6ICJjdXJzb3IiLCBjRmxhZyA/ICJtb25vIiA6ICIiICk7CiAgICAgaWYgKGR3VmVyc2lvbiA9PSAweDAwMDIwMDAwKQpAQCAtNDU1LDcgKzQ1NCw3IEBACiAgICAgSElDT04zMiByZXQ7CiAgICAgcmV0ID0gQ3JlYXRlSWNvbkZyb21SZXNvdXJjZUV4MTYoIGJpdHMsIGNiU2l6ZSwgYkljb24sIGR3VmVyc2lvbiwgMCwwLDApOwogICAgIGZwcmludGYoc3RkbmltcCwiQ3JlYXRlSWNvbkZyb21SZXNvdXJjZTMgcHJvYmFibHkgb25seSBhIHN0dWJcbiIpOwotICAgIGRwcmludGZfaWNvbihzdGRkZWIsIAorICAgIGRwcmludGZfaW5mbyhpY29uLCAKIAkiQ3JlYXRlSWNvbkZyb21SZXNvdXJjZTMyICVzIGF0ICVwIHNpemUgJWQgd2ludmVyICVkIHJldHVybiAweCUwNHhcbiIsCiAgICAgICAgICAgICAgICAgIChiSWNvbik/Ikljb24iOiJDdXJzb3IiLGJpdHMsY2JTaXplLGJJY29uLHJldCk7CiAgICAgcmV0dXJuIHJldDsKQEAgLTYzOCw3ICs2MzcsNyBAQAogICAgICAgICAgICBDT0xPUlJFRiAgICAgICBjb2w7CiAgICAgICAgICAgIENVUlNPUklDT05JTkZPIGNJOwogCi0JICAgZHByaW50Zl9pY29uKHN0ZGRlYiwgIkljb25Ub0N1cnNvcjpbJTA0eF0gJWl4JWkgJWlicHAgKGJvZ3VzICVpYnBzKVxuIiwgCisJICAgZHByaW50Zl9pbmZvKGljb24sICJJY29uVG9DdXJzb3I6WyUwNHhdICVpeCVpICVpYnBwIChib2d1cyAlaWJwcylcbiIsIAogCQloSWNvbiwgcEljb24tPm5XaWR0aCwgcEljb24tPm5IZWlnaHQsIHBJY29uLT5iQml0c1BlclBpeGVsLCBwSWNvbi0+bldpZHRoQnl0ZXMgKTsKIAogCSAgIHhvcl93aWR0aCA9IEJJVE1BUF9HZXRCaXRzV2lkdGgoIHBJY29uLT5uV2lkdGgsIGJwcCApOwpAQCAtNzA1LDEwICs3MDQsMTAgQEAKIEhDVVJTT1IxNiBXSU5BUEkgTG9hZEN1cnNvcjE2KCBISU5TVEFOQ0UxNiBoSW5zdGFuY2UsIFNFR1BUUiBuYW1lICkKIHsKICAgICBpZiAoSElXT1JEKG5hbWUpKQotICAgICAgICBkcHJpbnRmX2N1cnNvciggc3RkZGViLCAiTG9hZEN1cnNvcjE2OiAlMDR4ICclcydcbiIsCisgICAgICAgIGRwcmludGZfaW5mbyhjdXJzb3IsICJMb2FkQ3Vyc29yMTY6ICUwNHggJyVzJ1xuIiwKICAgICAgICAgICAgICAgICAgICAgICAgIGhJbnN0YW5jZSwgKGNoYXIgKilQVFJfU0VHX1RPX0xJTiggbmFtZSApICk7CiAgICAgZWxzZQotICAgICAgICBkcHJpbnRmX2N1cnNvciggc3RkZGViLCAiTG9hZEN1cnNvcjE2OiAlMDR4ICUwNHhcbiIsCisgICAgICAgIGRwcmludGZfaW5mbyhjdXJzb3IsICJMb2FkQ3Vyc29yMTY6ICUwNHggJTA0eFxuIiwKICAgICAgICAgICAgICAgICAgICAgICAgIGhJbnN0YW5jZSwgTE9XT1JEKG5hbWUpICk7CiAKICAgICByZXR1cm4gQ1VSU09SSUNPTl9Mb2FkMTYoIGhJbnN0YW5jZSwgbmFtZSwKQEAgLTcyMiwxMCArNzIxLDEwIEBACiBISUNPTjE2IFdJTkFQSSBMb2FkSWNvbjE2KCBISU5TVEFOQ0UxNiBoSW5zdGFuY2UsIFNFR1BUUiBuYW1lICkKIHsKICAgICBpZiAoSElXT1JEKG5hbWUpKQotICAgICAgICBkcHJpbnRmX2ljb24oIHN0ZGRlYiwgIkxvYWRJY29uOiAlMDR4ICclcydcbiIsCisgICAgICAgIGRwcmludGZfaW5mbyhpY29uLCAiTG9hZEljb246ICUwNHggJyVzJ1xuIiwKICAgICAgICAgICAgICAgICAgICAgICBoSW5zdGFuY2UsIChjaGFyICopUFRSX1NFR19UT19MSU4oIG5hbWUgKSApOwogICAgIGVsc2UKLSAgICAgICAgZHByaW50Zl9pY29uKCBzdGRkZWIsICJMb2FkSWNvbjogJTA0eCAlMDR4XG4iLAorICAgICAgICBkcHJpbnRmX2luZm8oaWNvbiwgIkxvYWRJY29uOiAlMDR4ICUwNHhcbiIsCiAgICAgICAgICAgICAgICAgICAgICAgaEluc3RhbmNlLCBMT1dPUkQobmFtZSkgKTsKIAogICAgIHJldHVybiBDVVJTT1JJQ09OX0xvYWQxNiggaEluc3RhbmNlLCBuYW1lLApAQCAtNzQ0LDcgKzc0Myw3IEBACiB7CiAgICAgQ1VSU09SSUNPTklORk8gaW5mbyA9IHsgeyB4SG90U3BvdCwgeUhvdFNwb3QgfSwgbldpZHRoLCBuSGVpZ2h0LCAwLCAxLCAxIH07CiAKLSAgICBkcHJpbnRmX2N1cnNvciggc3RkZGViLCAiQ3JlYXRlQ3Vyc29yOiAlZHglZCBzcG90PSVkLCVkIHhvcj0lcCBhbmQ9JXBcbiIsCisgICAgZHByaW50Zl9pbmZvKGN1cnNvciwgIkNyZWF0ZUN1cnNvcjogJWR4JWQgc3BvdD0lZCwlZCB4b3I9JXAgYW5kPSVwXG4iLAogICAgICAgICAgICAgICAgICAgICBuV2lkdGgsIG5IZWlnaHQsIHhIb3RTcG90LCB5SG90U3BvdCwgbHBYT1JiaXRzLCBscEFORGJpdHMpOwogICAgIHJldHVybiBDcmVhdGVDdXJzb3JJY29uSW5kaXJlY3QoIGhJbnN0YW5jZSwgJmluZm8sIGxwQU5EYml0cywgbHBYT1JiaXRzICk7CiB9CkBAIC03NjAsNyArNzU5LDcgQEAKIHsKICAgICBDVVJTT1JJQ09OSU5GTyBpbmZvID0geyB7IHhIb3RTcG90LCB5SG90U3BvdCB9LCBuV2lkdGgsIG5IZWlnaHQsIDAsIDEsIDEgfTsKIAotICAgIGRwcmludGZfY3Vyc29yKCBzdGRkZWIsICJDcmVhdGVDdXJzb3I6ICVkeCVkIHNwb3Q9JWQsJWQgeG9yPSVwIGFuZD0lcFxuIiwKKyAgICBkcHJpbnRmX2luZm8oY3Vyc29yLCAiQ3JlYXRlQ3Vyc29yOiAlZHglZCBzcG90PSVkLCVkIHhvcj0lcCBhbmQ9JXBcbiIsCiAgICAgICAgICAgICAgICAgICAgIG5XaWR0aCwgbkhlaWdodCwgeEhvdFNwb3QsIHlIb3RTcG90LCBscFhPUmJpdHMsIGxwQU5EYml0cyk7CiAgICAgcmV0dXJuIENyZWF0ZUN1cnNvckljb25JbmRpcmVjdCggTU9EVUxFX0hBTkRMRXRvSE1PRFVMRTE2KCBoSW5zdGFuY2UgKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmaW5mbywgbHBBTkRiaXRzLCBscFhPUmJpdHMgKTsKQEAgLTc3Niw3ICs3NzUsNyBAQAogewogICAgIENVUlNPUklDT05JTkZPIGluZm8gPSB7IHsgMCwgMCB9LCBuV2lkdGgsIG5IZWlnaHQsIDAsIGJQbGFuZXMsIGJCaXRzUGl4ZWx9OwogCi0gICAgZHByaW50Zl9pY29uKCBzdGRkZWIsICJDcmVhdGVJY29uOiAlZHglZHglZCwgeG9yPSVwLCBhbmQ9JXBcbiIsCisgICAgZHByaW50Zl9pbmZvKGljb24sICJDcmVhdGVJY29uOiAlZHglZHglZCwgeG9yPSVwLCBhbmQ9JXBcbiIsCiAgICAgICAgICAgICAgICAgICBuV2lkdGgsIG5IZWlnaHQsIGJQbGFuZXMgKiBiQml0c1BpeGVsLCBscFhPUmJpdHMsIGxwQU5EYml0cyk7CiAgICAgcmV0dXJuIENyZWF0ZUN1cnNvckljb25JbmRpcmVjdCggaEluc3RhbmNlLCAmaW5mbywgbHBBTkRiaXRzLCBscFhPUmJpdHMgKTsKIH0KQEAgLTc5MSw3ICs3OTAsNyBAQAogewogICAgIENVUlNPUklDT05JTkZPIGluZm8gPSB7IHsgMCwgMCB9LCBuV2lkdGgsIG5IZWlnaHQsIDAsIGJQbGFuZXMsIGJCaXRzUGl4ZWx9OwogCi0gICAgZHByaW50Zl9pY29uKCBzdGRkZWIsICJDcmVhdGVJY29uOiAlZHglZHglZCwgeG9yPSVwLCBhbmQ9JXBcbiIsCisgICAgZHByaW50Zl9pbmZvKGljb24sICJDcmVhdGVJY29uOiAlZHglZHglZCwgeG9yPSVwLCBhbmQ9JXBcbiIsCiAgICAgICAgICAgICAgICAgICBuV2lkdGgsIG5IZWlnaHQsIGJQbGFuZXMgKiBiQml0c1BpeGVsLCBscFhPUmJpdHMsIGxwQU5EYml0cyk7CiAgICAgcmV0dXJuIENyZWF0ZUN1cnNvckljb25JbmRpcmVjdCggTU9EVUxFX0hBTkRMRXRvSE1PRFVMRTE2KCBoSW5zdGFuY2UgKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmaW5mbywgbHBBTkRiaXRzLCBscFhPUmJpdHMgKTsKQEAgLTgzMiw3ICs4MzEsNyBAQAogICovCiBISUNPTjE2IFdJTkFQSSBDb3B5SWNvbjE2KCBISU5TVEFOQ0UxNiBoSW5zdGFuY2UsIEhJQ09OMTYgaEljb24gKQogewotICAgIGRwcmludGZfaWNvbiggc3RkZGViLCAiQ29weUljb24xNjogJTA0eCAlMDR4XG4iLCBoSW5zdGFuY2UsIGhJY29uICk7CisgICAgZHByaW50Zl9pbmZvKGljb24sICJDb3B5SWNvbjE2OiAlMDR4ICUwNHhcbiIsIGhJbnN0YW5jZSwgaEljb24gKTsKICAgICByZXR1cm4gQ1VSU09SSUNPTl9Db3B5KCBoSW5zdGFuY2UsIGhJY29uICk7CiB9CiAKQEAgLTg0NCw3ICs4NDMsNyBAQAogewogICBIVEFTSzE2IGhUYXNrID0gR2V0Q3VycmVudFRhc2sgKCk7CiAgIFREQiogcFRhc2sgPSAoVERCICopIEdsb2JhbExvY2sxNiAoaFRhc2spOwotICAgIGRwcmludGZfaWNvbiggc3RkZGViLCAiQ29weUljb24zMjogJTA0eFxuIiwgaEljb24gKTsKKyAgICBkcHJpbnRmX2luZm8oaWNvbiwgIkNvcHlJY29uMzI6ICUwNHhcbiIsIGhJY29uICk7CiAgIHJldHVybiBDVVJTT1JJQ09OX0NvcHkoIHBUYXNrLT5oSW5zdGFuY2UsIGhJY29uICk7CiB9CiAKQEAgLTg1NCw3ICs4NTMsNyBAQAogICovCiBIQ1VSU09SMTYgV0lOQVBJIENvcHlDdXJzb3IxNiggSElOU1RBTkNFMTYgaEluc3RhbmNlLCBIQ1VSU09SMTYgaEN1cnNvciApCiB7Ci0gICAgZHByaW50Zl9jdXJzb3IoIHN0ZGRlYiwgIkNvcHlDdXJzb3IxNjogJTA0eCAlMDR4XG4iLCBoSW5zdGFuY2UsIGhDdXJzb3IgKTsKKyAgICBkcHJpbnRmX2luZm8oY3Vyc29yLCAiQ29weUN1cnNvcjE2OiAlMDR4ICUwNHhcbiIsIGhJbnN0YW5jZSwgaEN1cnNvciApOwogICAgIHJldHVybiBDVVJTT1JJQ09OX0NvcHkoIGhJbnN0YW5jZSwgaEN1cnNvciApOwogfQogCkBAIC04NzMsNyArODcyLDcgQEAKICAqLwogQk9PTDMyIFdJTkFQSSBEZXN0cm95SWNvbjMyKCBISUNPTjMyIGhJY29uICkKIHsKLSAgICBkcHJpbnRmX2ljb24oIHN0ZGRlYiwgIkRlc3Ryb3lJY29uOiAlMDR4XG4iLCBoSWNvbiApOworICAgIGRwcmludGZfaW5mbyhpY29uLCAiRGVzdHJveUljb246ICUwNHhcbiIsIGhJY29uICk7CiAgICAgLyogRklYTUU6IHNob3VsZCBjaGVjayBmb3IgT0VNIGljb24gaGVyZSAqLwogICAgIHJldHVybiAoRnJlZVJlc291cmNlMTYoIGhJY29uICkgPT0gMCk7CiB9CkBAIC04OTMsNyArODkyLDcgQEAKICAqLwogQk9PTDMyIFdJTkFQSSBEZXN0cm95Q3Vyc29yMzIoIEhDVVJTT1IzMiBoQ3Vyc29yICkKIHsKLSAgICBkcHJpbnRmX2N1cnNvciggc3RkZGViLCAiRGVzdHJveUN1cnNvcjogJTA0eFxuIiwgaEN1cnNvciApOworICAgIGRwcmludGZfaW5mbyhjdXJzb3IsICJEZXN0cm95Q3Vyc29yOiAlMDR4XG4iLCBoQ3Vyc29yICk7CiAgICAgLyogRklYTUU6IHNob3VsZCBjaGVjayBmb3IgT0VNIGN1cnNvciBoZXJlICovCiAgICAgcmV0dXJuIChGcmVlUmVzb3VyY2UxNiggaEN1cnNvciApID09IDApOwogfQpAQCAtMTEyNiw3ICsxMTI1LDcgQEAKICAgICBIQ1VSU09SMzIgaE9sZEN1cnNvcjsKIAogICAgIGlmIChoQ3Vyc29yID09IGhBY3RpdmVDdXJzb3IpIHJldHVybiBoQWN0aXZlQ3Vyc29yOyAgLyogTm8gY2hhbmdlICovCi0gICAgZHByaW50Zl9jdXJzb3IoIHN0ZGRlYiwgIlNldEN1cnNvcjogJTA0eFxuIiwgaEN1cnNvciApOworICAgIGRwcmludGZfaW5mbyhjdXJzb3IsICJTZXRDdXJzb3I6ICUwNHhcbiIsIGhDdXJzb3IgKTsKICAgICBoT2xkQ3Vyc29yID0gaEFjdGl2ZUN1cnNvcjsKICAgICBoQWN0aXZlQ3Vyc29yID0gaEN1cnNvcjsKICAgICAvKiBDaGFuZ2UgdGhlIGN1cnNvciBzaGFwZSBvbmx5IGlmIGl0IGlzIHZpc2libGUgKi8KQEAgLTExNTQsNyArMTE1Myw3IEBACiAgKi8KIEJPT0wzMiBXSU5BUEkgU2V0Q3Vyc29yUG9zMzIoIElOVDMyIHgsIElOVDMyIHkgKQogewotICAgIGRwcmludGZfY3Vyc29yKCBzdGRkZWIsICJTZXRDdXJzb3JQb3M6IHg9JWQgeT0lZFxuIiwgeCwgeSApOworICAgIGRwcmludGZfaW5mbyhjdXJzb3IsICJTZXRDdXJzb3JQb3M6IHg9JWQgeT0lZFxuIiwgeCwgeSApOwogICAgIFRTWFdhcnBQb2ludGVyKCBkaXNwbGF5LCByb290V2luZG93LCByb290V2luZG93LCAwLCAwLCAwLCAwLCB4LCB5ICk7CiAgICAgcmV0dXJuIFRSVUU7CiB9CkBAIC0xMTc0LDcgKzExNzMsNyBAQAogICovCiBJTlQzMiBXSU5BUEkgU2hvd0N1cnNvcjMyKCBCT09MMzIgYlNob3cgKQogewotICAgIGRwcmludGZfY3Vyc29yKCBzdGRkZWIsICJTaG93Q3Vyc29yOiAlZCwgY291bnQ9JWRcbiIsCisgICAgZHByaW50Zl9pbmZvKGN1cnNvciwgIlNob3dDdXJzb3I6ICVkLCBjb3VudD0lZFxuIiwKICAgICAgICAgICAgICAgICAgICAgYlNob3csIENVUlNPUl9TaG93Q291bnQgKTsKIAogICAgIEVudGVyQ3JpdGljYWxTZWN0aW9uKCAmWDExRFJWX0NyaXRTZWN0aW9uICk7CkBAIC0xMjYzLDcgKzEyNjIsNyBAQAogICAgICAgICBlbHNlCiAgICAgICAgICAgICBNb3VzZUJ1dHRvbnNTdGF0ZXNbMl0gPSBGQUxTRTsKICAgICB9Ci0gICAgZHByaW50Zl9jdXJzb3Ioc3RkZGViLCAiR2V0Q3Vyc29yUG9zOiByZXQ9JWQsJWRcbiIsIHB0LT54LCBwdC0+eSApOworICAgIGRwcmludGZfaW5mbyhjdXJzb3IsICJHZXRDdXJzb3JQb3M6IHJldD0lZCwlZFxuIiwgcHQtPngsIHB0LT55ICk7CiB9CiAKIApAQCAtMTMyMSw3ICsxMzIwLDcgQEAKIAkgICAgaWYoIGVudHJ5ICkgcmV0VmFsID0gZW50cnktPndSZXNJZDsKIAl9CiAgICAgfQotICAgIGVsc2UgZHByaW50Zl9jdXJzb3Ioc3RkZGViLCJJY29uSWQ6IGludmFsaWQgcmVzb3VyY2UgZGlyZWN0b3J5XG4iKTsKKyAgICBlbHNlIGRwcmludGZfd2FybihjdXJzb3IsICJJY29uSWQ6IGludmFsaWQgcmVzb3VyY2UgZGlyZWN0b3J5XG4iKTsKICAgICByZXR1cm4gcmV0VmFsOwogfQogCkBAIC0xMzYxLDcgKzEzNjAsNyBAQAogewogICAgIExQQllURSBscERpciA9IChMUEJZVEUpR2xvYmFsTG9jazE2KGhSZXNvdXJjZSk7CiAKLSAgICBkcHJpbnRmX2N1cnNvciggc3RkZGViLCAiR2V0SWNvbklEOiBoUmVzPSUwNHgsIGVudHJpZXM9JWlcbiIsCisgICAgZHByaW50Zl9pbmZvKGN1cnNvciwgIkdldEljb25JRDogaFJlcz0lMDR4LCBlbnRyaWVzPSVpXG4iLAogICAgICAgICAgICAgICAgICAgICBoUmVzb3VyY2UsIGxwRGlyID8gKChDVVJTT1JJQ09ORElSKilscERpciktPmlkQ291bnQgOiAwKTsKIAogICAgIHN3aXRjaChyZXNUeXBlKQpAQCAtMTQzOSw3ICsxNDM4LDcgQEAKIHsKICAgICBMUEJZVEUgYml0cyA9IChMUEJZVEUpTG9ja1Jlc291cmNlMTYoIGhSZXNvdXJjZSApOwogCi0gICAgZHByaW50Zl9jdXJzb3Ioc3RkZGViLCJMb2FkSWNvbkhhbmRsZXI6IGhSZXM9JTA0eFxuIixoUmVzb3VyY2UpOworICAgIGRwcmludGZfaW5mbyhjdXJzb3IsIkxvYWRJY29uSGFuZGxlcjogaFJlcz0lMDR4XG4iLGhSZXNvdXJjZSk7CiAKICAgICByZXR1cm4gQ1VSU09SSUNPTl9DcmVhdGVGcm9tUmVzb3VyY2UoIDAsIDAsIGJpdHMsIDAsIFRSVUUsIAogCQkgICAgICBiTmV3ID8gMHgwMDAzMDAwMCA6IDB4MDAwMjAwMDAsIDAsIDAsIExSX0RFRkFVTFRDT0xPUiApOwpAQCAtMTU3Nyw3ICsxNTc2LDcgQEAKICAgICBIREMzMiBoTWVtREMgPSBDcmVhdGVDb21wYXRpYmxlREMzMiAoaGRjKTsKICAgICBCT09MMzIgcmVzdWx0ID0gRkFMU0U7CiAKLSAgICBkcHJpbnRmX2ljb24gKHN0ZGRlYiwgIkRyYXdJY29uRXgzMjogcGFydCBzdHViLlxuIik7CisgICAgZHByaW50Zl9maXhtZShpY29uLCAiRHJhd0ljb25FeDMyOiBwYXJ0IHN0dWIuXG4iKTsKIAogICAgIGlmIChoTWVtREMgJiYgcHRyKQogICAgIHsKZGlmZiAtLWdpdCBhL29iamVjdHMvZGMuYyBiL29iamVjdHMvZGMuYwppbmRleCBhMGNjYjNmLi43MGE2NWM3IDEwMDY0NAotLS0gYS9vYmplY3RzL2RjLmMKKysrIGIvb2JqZWN0cy9kYy5jCkBAIC0xMCw3ICsxMCw2IEBACiAjaW5jbHVkZSAiZ2RpLmgiCiAjaW5jbHVkZSAiaGVhcC5oIgogI2luY2x1ZGUgIm1ldGFmaWxlLmgiCi0jaW5jbHVkZSAic3RkZGVidWcuaCIKICNpbmNsdWRlICJjb2xvci5oIgogI2luY2x1ZGUgImRlYnVnLmgiCiAjaW5jbHVkZSAiZm9udC5oIgpAQCAtNDUwLDcgKzQ0OSw3IEBACiAgICAgfQogICAgIG5ld2RjID0gKERDICopIEdESV9IRUFQX0xPQ0soIGhhbmRsZSApOwogCi0gICAgZHByaW50Zl9kYyhzdGRkZWIsICJHZXREQ1N0YXRlKCUwNHgpOiByZXR1cm5pbmcgJTA0eFxuIiwgaGRjLCBoYW5kbGUgKTsKKyAgICBkcHJpbnRmX2luZm8oZGMsICJHZXREQ1N0YXRlKCUwNHgpOiByZXR1cm5pbmcgJTA0eFxuIiwgaGRjLCBoYW5kbGUgKTsKIAogICAgIG1lbXNldCggJm5ld2RjLT51LngsIDAsIHNpemVvZihuZXdkYy0+dS54KSApOwogICAgIG5ld2RjLT53LmZsYWdzICAgICAgICAgICA9IGRjLT53LmZsYWdzIHwgRENfU0FWRUQ7CkBAIC01MzgsNyArNTM3LDcgQEAKICAgICAgIEdESV9IRUFQX1VOTE9DSyggaGRjcyApOwogICAgICAgcmV0dXJuOwogICAgIH0KLSAgICBkcHJpbnRmX2RjKHN0ZGRlYiwgIlNldERDU3RhdGU6ICUwNHggJTA0eFxuIiwgaGRjLCBoZGNzICk7CisgICAgZHByaW50Zl9pbmZvKGRjLCAiU2V0RENTdGF0ZTogJTA0eCAlMDR4XG4iLCBoZGMsIGhkY3MgKTsKIAogICAgIGRjLT53LmZsYWdzICAgICAgICAgICA9IGRjcy0+dy5mbGFncyAmIH5EQ19TQVZFRDsKICAgICBkYy0+dy5kZXZDYXBzICAgICAgICAgPSBkY3MtPncuZGV2Q2FwczsKQEAgLTY0Myw3ICs2NDIsNyBAQAogICAgIAogICAgIGRjcy0+aGVhZGVyLmhOZXh0ID0gZGMtPmhlYWRlci5oTmV4dDsKICAgICBkYy0+aGVhZGVyLmhOZXh0ID0gaGRjczsKLSAgICBkcHJpbnRmX2RjKHN0ZGRlYiwgIlNhdmVEQyglMDR4KTogcmV0dXJuaW5nICVkXG4iLCBoZGMsIGRjLT5zYXZlTGV2ZWwrMSApOworICAgIGRwcmludGZfaW5mbyhkYywgIlNhdmVEQyglMDR4KTogcmV0dXJuaW5nICVkXG4iLCBoZGMsIGRjLT5zYXZlTGV2ZWwrMSApOwogICAgIHJldCA9ICsrZGMtPnNhdmVMZXZlbDsKICAgICBHRElfSEVBUF9VTkxPQ0soIGhkY3MgKTsKICAgICBHRElfSEVBUF9VTkxPQ0soIGhkYyApOwpAQCAtNjY4LDcgKzY2Nyw3IEBACiAgICAgREMgKiBkYywgKiBkY3M7CiAgICAgQk9PTDMyIHN1Y2Nlc3M7CiAKLSAgICBkcHJpbnRmX2RjKHN0ZGRlYiwgIlJlc3RvcmVEQzogJTA0eCAlZFxuIiwgaGRjLCBsZXZlbCApOworICAgIGRwcmludGZfaW5mbyhkYywgIlJlc3RvcmVEQzogJTA0eCAlZFxuIiwgaGRjLCBsZXZlbCApOwogICAgIGRjID0gKERDICopIEdESV9HZXRPYmpQdHIoIGhkYywgRENfTUFHSUMgKTsKICAgICBpZiAoIWRjKSAKICAgICB7CkBAIC03MjgsMTMgKzcyNywxMyBAQAogICAgIGlmICghKGRjID0gRENfQWxsb2NEQyggZnVuY3MgKSkpIHJldHVybiAwOwogICAgIGRjLT53LmZsYWdzID0gMDsKIAotICAgIGRwcmludGZfZGMoc3RkZGViLCAiQ3JlYXRlREMoJXMgJXMgJXMpOiByZXR1cm5pbmcgJTA0eFxuIiwKKyAgICBkcHJpbnRmX2luZm8oZGMsICJDcmVhdGVEQyglcyAlcyAlcyk6IHJldHVybmluZyAlMDR4XG4iLAogICAgICAgICAgICAgICAgZHJpdmVyLCBkZXZpY2UsIG91dHB1dCwgZGMtPmhTZWxmICk7CiAKICAgICBpZiAoZGMtPmZ1bmNzLT5wQ3JlYXRlREMgJiYKICAgICAgICAgIWRjLT5mdW5jcy0+cENyZWF0ZURDKCBkYywgZHJpdmVyLCBkZXZpY2UsIG91dHB1dCwgaW5pdERhdGEgKSkKICAgICB7Ci0gICAgICAgIGRwcmludGZfZGMoIHN0ZGRlYiwgIkNyZWF0ZURDOiBjcmVhdGlvbiBhYm9ydGVkIGJ5IGRldmljZVxuIiApOworICAgICAgICBkcHJpbnRmX3dhcm4oZGMsICJDcmVhdGVEQzogY3JlYXRpb24gYWJvcnRlZCBieSBkZXZpY2VcbiIgKTsKICAgICAgICAgR0RJX0hFQVBfRlJFRSggZGMtPmhTZWxmICk7CiAgICAgICAgIHJldHVybiAwOwogICAgIH0KQEAgLTgzMCw3ICs4MjksNyBAQAogCiAgICAgaWYgKCEoZGMgPSBEQ19BbGxvY0RDKCBmdW5jcyApKSkgcmV0dXJuIDA7CiAKLSAgICBkcHJpbnRmX2RjKHN0ZGRlYiwgIkNyZWF0ZUNvbXBhdGlibGVEQyglMDR4KTogcmV0dXJuaW5nICUwNHhcbiIsCisgICAgZHByaW50Zl9pbmZvKGRjLCAiQ3JlYXRlQ29tcGF0aWJsZURDKCUwNHgpOiByZXR1cm5pbmcgJTA0eFxuIiwKICAgICAgICAgICAgICAgIGhkYywgZGMtPmhTZWxmICk7CiAKICAgICAgIC8qIENyZWF0ZSBkZWZhdWx0IGJpdG1hcCAqLwpAQCAtODQ3LDcgKzg0Niw3IEBACiAgICAgaWYgKGRjLT5mdW5jcy0+cENyZWF0ZURDICYmCiAgICAgICAgICFkYy0+ZnVuY3MtPnBDcmVhdGVEQyggZGMsIE5VTEwsIE5VTEwsIE5VTEwsIE5VTEwgKSkKICAgICB7Ci0gICAgICAgIGRwcmludGZfZGMoc3RkZGViLCAiQ3JlYXRlQ29tcGF0aWJsZURDOiBjcmVhdGlvbiBhYm9ydGVkIGJ5IGRldmljZVxuIik7CisgICAgICAgIGRwcmludGZfd2FybihkYywgIkNyZWF0ZUNvbXBhdGlibGVEQzogY3JlYXRpb24gYWJvcnRlZCBieSBkZXZpY2VcbiIpOwogICAgICAgICBEZWxldGVPYmplY3QzMiggaGJpdG1hcCApOwogICAgICAgICBHRElfSEVBUF9GUkVFKCBkYy0+aFNlbGYgKTsKICAgICAgICAgcmV0dXJuIDA7CkBAIC04NzYsNyArODc1LDcgQEAKICAgICBEQyAqIGRjID0gKERDICopIEdESV9HZXRPYmpQdHIoIGhkYywgRENfTUFHSUMgKTsKICAgICBpZiAoIWRjKSByZXR1cm4gRkFMU0U7CiAKLSAgICBkcHJpbnRmX2RjKHN0ZGRlYiwgIkRlbGV0ZURDOiAlMDR4XG4iLCBoZGMgKTsKKyAgICBkcHJpbnRmX2luZm8oZGMsICJEZWxldGVEQzogJTA0eFxuIiwgaGRjICk7CiAKICAgICB3aGlsZSAoZGMtPnNhdmVMZXZlbCkKICAgICB7CkBAIC05NjIsNyArOTYxLDcgQEAKICAgICAgIHJldHVybiAwOwogICAgIH0KICAgICAKLSAgICBkcHJpbnRmX2RjKHN0ZGRlYiwgIkdldERldmljZUNhcHMoJTA0eCwlZCk6IHJldHVybmluZyAlZFxuIiwKKyAgICBkcHJpbnRmX2luZm8oZGMsICJHZXREZXZpY2VDYXBzKCUwNHgsJWQpOiByZXR1cm5pbmcgJWRcbiIsCiAJICAgIGhkYywgY2FwLCAqKFdPUkQgKikoKChjaGFyICopZGMtPncuZGV2Q2FwcykgKyBjYXApICk7CiAgICAgcmV0ID0gKihXT1JEICopKCgoY2hhciAqKWRjLT53LmRldkNhcHMpICsgY2FwKTsKICAgICBHRElfSEVBUF9VTkxPQ0soIGhkYyApOwpAQCAtMTI2OSw3ICsxMjY4LDcgQEAKIHsKICAgICBEQyAqZGMgPSAoREMgKilHRElfR2V0T2JqUHRyKCBoZGMsIERDX01BR0lDICk7CiAKLSAgICBkcHJpbnRmX2RjKCBzdGRkZWIsICJTZXREQ0hvb2s6IGhvb2tQcm9jICUwOHgsIGRlZmF1bHQgaXMgJTA4eFxuIiwKKyAgICBkcHJpbnRmX2luZm8oZGMsICJTZXREQ0hvb2s6IGhvb2tQcm9jICUwOHgsIGRlZmF1bHQgaXMgJTA4eFxuIiwKICAgICAgICAgICAgICAgICAoVUlOVDMyKWhvb2tQcm9jLCAoVUlOVDMyKURDSG9vayApOwogCiAgICAgaWYgKCFkYykgcmV0dXJuIEZBTFNFOwpAQCAtMTMwNyw3ICsxMzA2LDcgQEAKICAgICAgICAgLyogIlVuZG9jdW1lbnRlZCBXaW5kb3dzIiBpbmZvIGlzIHNsaWdodGx5IGNvbmZ1c2luZy4KICAgICAgICAgICovCiAKLSAgICAgICAgZHByaW50Zl9kYyhzdGRkZWIsIlNldEhvb2tGbGFnczogaERDICUwNHgsIGZsYWdzICUwNHhcbiIsaERDLGZsYWdzKTsKKyAgICAgICAgZHByaW50Zl9pbmZvKGRjLCJTZXRIb29rRmxhZ3M6IGhEQyAlMDR4LCBmbGFncyAlMDR4XG4iLGhEQyxmbGFncyk7CiAKICAgICAgICAgaWYoIGZsYWdzICYgRENIRl9JTlZBTElEQVRFVklTUkdOICkKICAgICAgICAgICAgIGRjLT53LmZsYWdzIHw9IERDX0RJUlRZOwpkaWZmIC0tZ2l0IGEvb2JqZWN0cy9kaWIuYyBiL29iamVjdHMvZGliLmMKaW5kZXggYzQyMjdlZi4uMTYyMmQxNyAxMDA2NDQKLS0tIGEvb2JqZWN0cy9kaWIuYworKysgYi9vYmplY3RzL2RpYi5jCkBAIC0xMiw3ICsxMiw2IEBACiAjaW5jbHVkZSAiYml0bWFwLmgiCiAjaW5jbHVkZSAiY2FsbGJhY2suaCIKICNpbmNsdWRlICJwYWxldHRlLmgiCi0jaW5jbHVkZSAic3RkZGVidWcuaCIKICNpbmNsdWRlICJjb2xvci5oIgogI2luY2x1ZGUgImRlYnVnLmgiCiAKQEAgLTU3OCw3ICs1NzcsNyBAQAogCQkJICBsaW5lIAktPSAoKnBJbisrKTsKIAkJCSAgaWYgKGxpbmUgPT0gMCkKIAkJCSAgICB7Ci0JCQkgICAgICBkcHJpbnRmX2JpdG1hcChzdGRkZWIsIAorCQkJICAgICAgZHByaW50Zl9pbmZvKGJpdG1hcCwgCiAJCQkJCSAgICAgIkRJQl9TZXRJbWFnZUJpdHNfUkxFOCgpOiAiCiAJCQkJCSAgICAgIkRlbHRhIHRvIGxhc3QgbGluZSBvZiBiaXRtYXAgIgogCQkJCQkgICAgICIod3JvbmdseT8pIGNhdXNlcyBsb29wIGV4aXRcbiIpOwpAQCAtNjI1LDcgKzYyNCw3IEBACiAgICAgICovCiAgICAgaWYgKCAoKihwSW4tMikgIT0gMC8qZXNjYXBlKi8pIHx8ICgqKHBJbi0xKSE9IFJsZUVuZCkgKQogICAgICAgewotCWRwcmludGZfYml0bWFwKHN0ZGRlYiwgIkRJQl9TZXRJbWFnZUJpdHNfUkxFOCgpOiBFbmQtb2YtYml0bWFwICIKKwlkcHJpbnRmX2luZm8oYml0bWFwLCAiRElCX1NldEltYWdlQml0c19STEU4KCk6IEVuZC1vZi1iaXRtYXAgIgogCQkgICAgICAgIndpdGhvdXQgKHN0cmljdGx5KSBwcm9wZXIgZXNjYXBlIGNvZGUuICBMYXN0IHR3byAiCiAJCSAgICAgICAiYnl0ZXMgd2VyZTogJTAyWCAlMDJYLlxuIiwKIAkJICAgICAgIChpbnQpKihwSW4tMiksCkBAIC0xMTgwLDcgKzExNzksNyBAQAogCUJZVEUqCWJiaXRzID0gYml0czsKIAlpbnQJcGFkLCB5ZW5kLCB4ZW5kID0gYm1wLT5iaXRtYXAuYm1XaWR0aDsKIAotICAgICAgICBkcHJpbnRmX2JpdG1hcChzdGRkZWIsICJHZXRESUJpdHM6ICV1IHNjYW5saW5lcyBvZiAoJWksJWkpIC0+ICglaSwlaSkgc3RhcnRpbmcgZnJvbSAldVxuIiwKKyAgICAgICAgZHByaW50Zl9pbmZvKGJpdG1hcCwgIkdldERJQml0czogJXUgc2NhbmxpbmVzIG9mICglaSwlaSkgLT4gKCVpLCVpKSBzdGFydGluZyBmcm9tICV1XG4iLAogCQkJICAgIGxpbmVzLCBibXAtPmJpdG1hcC5ibVdpZHRoLCBibXAtPmJpdG1hcC5ibUhlaWdodCwKIAkJCSAgICAoaW50KWluZm8tPmJtaUhlYWRlci5iaVdpZHRoLCAoaW50KWluZm8tPmJtaUhlYWRlci5iaUhlaWdodCwgc3RhcnRzY2FuICk7CiAKZGlmZiAtLWdpdCBhL29iamVjdHMvZm9udC5jIGIvb2JqZWN0cy9mb250LmMKaW5kZXggYjFhYzA4ZC4uMDRmZTEzMSAxMDA2NDQKLS0tIGEvb2JqZWN0cy9mb250LmMKKysrIGIvb2JqZWN0cy9mb250LmMKQEAgLTEyLDcgKzEyLDYgQEAKICNpbmNsdWRlICJoZWFwLmgiCiAjaW5jbHVkZSAibWV0YWZpbGUuaCIKICNpbmNsdWRlICJvcHRpb25zLmgiCi0jaW5jbHVkZSAic3RkZGVidWcuaCIKICNpbmNsdWRlICJkZWJ1Zy5oIgogI2luY2x1ZGUgImRlYnVnc3RyLmgiCiAKQEAgLTIyMyw3ICsyMjIsNyBAQAogCSAgICBmb250UHRyID0gKEZPTlRPQkogKikgR0RJX0hFQVBfTE9DSyggaEZvbnQgKTsKIAkgICAgbWVtY3B5KCAmZm9udFB0ci0+bG9nZm9udCwgZm9udCwgc2l6ZW9mKExPR0ZPTlQxNikgKTsKIAotCSAgICBkcHJpbnRmX2ZvbnQoc3RkZGViLCJDcmVhdGVGb250SW5kaXJlY3QoJWkgJWkpICclcycgJXMgJXMgPT4gJTA0eFxuIiwKKwkgICAgZHByaW50Zl9pbmZvKGZvbnQsIkNyZWF0ZUZvbnRJbmRpcmVjdCglaSAlaSkgJyVzJyAlcyAlcyA9PiAlMDR4XG4iLAogCQkJCSBmb250LT5sZkhlaWdodCwgZm9udC0+bGZXaWR0aCwgCiAJCQkJIGZvbnQtPmxmRmFjZU5hbWUgPyBmb250LT5sZkZhY2VOYW1lIDogIk5VTEwiLAogCQkJCSBmb250LT5sZldlaWdodCA+IDQwMCA/ICJCb2xkIiA6ICIiLApAQCAtMjcxLDcgKzI3MCw3IEBACiAgICAgTE9HRk9OVDE2IGxvZ2ZvbnQgPSB7IGhlaWdodCwgd2lkdGgsIGVzYywgb3JpZW50LCB3ZWlnaHQsIGl0YWxpYywgdW5kZXJsaW5lLAogICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJpa2VvdXQsIGNoYXJzZXQsIG91dHByZXMsIGNsaXBwcmVzLCBxdWFsaXR5LCBwaXRjaCwgfTsKIAotICAgIGRwcmludGZfZm9udChzdGRkZWIsIkNyZWF0ZUZvbnQxNignJXMnLCVkLCVkKVxuIiwKKyAgICBkcHJpbnRmX2luZm8oZm9udCwiQ3JlYXRlRm9udDE2KCclcycsJWQsJWQpXG4iLAogCQkgKG5hbWUgPyBuYW1lIDogIihudWxsKSIpICwgaGVpZ2h0LCB3aWR0aCk7CiAgICAgaWYgKG5hbWUpIAogCWxzdHJjcHluMzJBKGxvZ2ZvbnQubGZGYWNlTmFtZSxuYW1lLHNpemVvZihsb2dmb250LmxmRmFjZU5hbWUpKTsKQEAgLTcxNiw3ICs3MTUsNyBAQAogICAgICAgICAhZGMtPmZ1bmNzLT5wR2V0VGV4dEV4dGVudFBvaW50KCBkYywgc3RyLCBjb3VudCwgc2l6ZSApKQogICAgICAgICByZXR1cm4gRkFMU0U7CiAKLSAgICBkcHJpbnRmX2ZvbnQoc3RkZGViLCJHZXRUZXh0RXh0ZW50UG9pbnQoJTA4eCAlcyAlZCAlcCk6IHJldHVybmluZyAlZCwlZFxuIiwKKyAgICBkcHJpbnRmX2luZm8oZm9udCwiR2V0VGV4dEV4dGVudFBvaW50KCUwOHggJXMgJWQgJXApOiByZXR1cm5pbmcgJWQsJWRcbiIsCiAgICAgICAgICAgICAgICAgIGhkYywgZGVidWdzdHJfYW4gKHN0ciwgY291bnQpLCBjb3VudCwKIAkJIHNpemUsIHNpemUtPmN4LCBzaXplLT5jeSApOwogICAgIHJldHVybiBUUlVFOwpAQCAtNzQyLDcgKzc0MSw3IEBACiBCT09MMzIgV0lOQVBJIEdldFRleHRFeHRlbnRQb2ludDMyQUJ1Z2d5KCBIREMzMiBoZGMsIExQQ1NUUiBzdHIsIElOVDMyIGNvdW50LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFBTSVpFMzIgc2l6ZSApCiB7Ci0gICAgZHByaW50Zl9mb250KCBzdGRkZWIsICJHZXRUZXh0RXh0ZW50UG9pbnQzMkFCdWdneTogbm90IGJ1ZyBjb21wYXRpYmxlLlxuIik7CisgICAgZHByaW50Zl9pbmZvKGZvbnQsICJHZXRUZXh0RXh0ZW50UG9pbnQzMkFCdWdneTogbm90IGJ1ZyBjb21wYXRpYmxlLlxuIik7CiAgICAgcmV0dXJuIEdldFRleHRFeHRlbnRQb2ludDMyQSggaGRjLCBzdHIsIGNvdW50LCBzaXplICk7CiB9CiAKQEAgLTc1Miw3ICs3NTEsNyBAQAogQk9PTDMyIFdJTkFQSSBHZXRUZXh0RXh0ZW50UG9pbnQzMldCdWdneSggSERDMzIgaGRjLCBMUENXU1RSIHN0ciwgSU5UMzIgY291bnQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMUFNJWkUzMiBzaXplICkKIHsKLSAgICBkcHJpbnRmX2ZvbnQoIHN0ZGRlYiwgIkdldFRleHRFeHRlbnRQb2ludDMyV0J1Z2d5OiBub3QgYnVnIGNvbXBhdGlibGUuXG4iKTsKKyAgICBkcHJpbnRmX2luZm8oZm9udCwgIkdldFRleHRFeHRlbnRQb2ludDMyV0J1Z2d5OiBub3QgYnVnIGNvbXBhdGlibGUuXG4iKTsKICAgICByZXR1cm4gR2V0VGV4dEV4dGVudFBvaW50MzJXKCBoZGMsIHN0ciwgY291bnQsIHNpemUgKTsKIH0KIApAQCAtNzkyLDcgKzc5MSw3IEBACiAgICAgc2l6ZS0+Y3ggPSBleHRlbnQ7CiAgICAqbHBuRml0ID0gbkZpdDsKIAotICAgIGRwcmludGZfZm9udChzdGRkZWIsIkdldFRleHRFeHRlbnRFeFBvaW50MzJBKCUwOHggJyUuKnMnICVkKSByZXR1cm5pbmcgJWQgJWQgJWRcbiIsCisgICAgZHByaW50Zl9pbmZvKGZvbnQsIkdldFRleHRFeHRlbnRFeFBvaW50MzJBKCUwOHggJyUuKnMnICVkKSByZXR1cm5pbmcgJWQgJWQgJWRcbiIsCiAgICAgICAgICAgICAgICBoZGMsY291bnQsc3RyLG1heEV4dCxuRml0LCBzaXplLT5jeCxzaXplLT5jeSk7CiAgICAgcmV0dXJuIFRSVUU7CiB9CkBAIC04NjEsNyArODYwLDcgQEAKICAgICBtZXRyaWNzLT50bU1heENoYXJXaWR0aCAgICAgPSBXRFBUT0xQKG1ldHJpY3MtPnRtTWF4Q2hhcldpZHRoKTsKICAgICBtZXRyaWNzLT50bU92ZXJoYW5nICAgICAgICAgPSBXRFBUT0xQKG1ldHJpY3MtPnRtT3ZlcmhhbmcpOwogCi0gICAgZHByaW50Zl9mb250KHN0ZGRlYiwidGV4dCBtZXRyaWNzOgorICAgIGRwcmludGZfaW5mbyhmb250LCJ0ZXh0IG1ldHJpY3M6CiAgICAgV2VpZ2h0ID0gJTAzaVx0IEZpcnN0Q2hhciA9ICUwM2lcdCBBdmVDaGFyV2lkdGggPSAlaQogICAgIEl0YWxpYyA9ICUgM2lcdCBMYXN0Q2hhciA9ICUwM2lcdFx0IE1heENoYXJXaWR0aCA9ICVpCiAgICAgVW5kZXJMaW5lZCA9ICUwMWlcdCBEZWZhdWx0Q2hhciA9ICUwM2lcdCBPdmVyaGFuZyA9ICVpCkBAIC05ODgsOCArOTg3LDggQEAKICAqLwogRFdPUkQgV0lOQVBJIFNldE1hcHBlckZsYWdzMzIoIEhEQzMyIGhEQywgRFdPUkQgZHdGbGFnICkKIHsKLSAgICBkcHJpbnRmX2ZvbnQoc3RkbmltcCwiU2V0TWFwcGVyRmxhZ3MoJTA0eCwgJTA4bFgpIC8vIEVtcHR5IFN0dWIgIVxuIiwKLSAgICAgICAgICAgICAgICAgaERDLCBkd0ZsYWcpOworICAgIGRwcmludGZfZml4bWUoZm9udCwgIlNldE1hcHBlckZsYWdzKCUwNHgsICUwOGxYKSAvLyBFbXB0eSBTdHViICFcbiIsCisJCSAgaERDLCBkd0ZsYWcpOwogICAgIHJldHVybiAwTDsKIH0KIApAQCAtOTk4LDkgKzk5Nyw4IEBACiAgKi8KIEJPT0wxNiBHZXRBc3BlY3RSYXRpb0ZpbHRlckV4MTYoIEhEQzE2IGhkYywgTFBWT0lEIHBBc3BlY3RSYXRpbyApCiB7Ci0gIGRwcmludGZfZm9udChzdGRuaW1wLCAKLSAgICAgICJHZXRBc3BlY3RSYXRpb0ZpbHRlckV4KCUwNHgsICVwKTogLy8gRW1wdHkgU3R1YiAhXG4iLAotCSAgICAgICBoZGMsIHBBc3BlY3RSYXRpbyk7CisgIGRwcmludGZfZml4bWUoZm9udCwgIkdldEFzcGVjdFJhdGlvRmlsdGVyRXgoJTA0eCwgJXApOiAvLyBFbXB0eSBTdHViICFcbiIsCisJCWhkYywgcEFzcGVjdFJhdGlvKTsKICAgcmV0dXJuIEZBTFNFOwogfQogCmRpZmYgLS1naXQgYS9vYmplY3RzL2dkaW9iai5jIGIvb2JqZWN0cy9nZGlvYmouYwppbmRleCAwNTU3MDEyLi5kMTlhYWQzIDEwMDY0NAotLS0gYS9vYmplY3RzL2dkaW9iai5jCisrKyBiL29iamVjdHMvZ2Rpb2JqLmMKQEAgLTE2LDcgKzE2LDYgQEAKICNpbmNsdWRlICJwYWxldHRlLmgiCiAjaW5jbHVkZSAicGVuLmgiCiAjaW5jbHVkZSAicmVnaW9uLmgiCi0jaW5jbHVkZSAic3RkZGVidWcuaCIKICNpbmNsdWRlICJkZWJ1Zy5oIgogI2luY2x1ZGUgImdkaS5oIgogCkBAIC0zNjEsNyArMzYwLDcgQEAKICAgICAgICAgcmV0dXJuIFRSVUU7CiAgICAgaWYgKCEoaGVhZGVyID0gKEdESU9CSkhEUiAqKSBHRElfSEVBUF9MT0NLKCBvYmogKSkpIHJldHVybiBGQUxTRTsKIAotICAgIGRwcmludGZfZ2RpKHN0ZGRlYiwgIkRlbGV0ZU9iamVjdDogJTA0eFxuIiwgb2JqICk7CisgICAgZHByaW50Zl9pbmZvKGdkaSwgIkRlbGV0ZU9iamVjdDogJTA0eFxuIiwgb2JqICk7CiAKICAgICAgIC8qIERlbGV0ZSBvYmplY3QgKi8KIApAQCAtMzk0LDcgKzM5Myw3IEBACiB7CiAgICAgaWYgKChvYmogPCAwKSB8fCAob2JqID49IE5CX1NUT0NLX09CSkVDVFMpKSByZXR1cm4gMDsKICAgICBpZiAoIVN0b2NrT2JqZWN0c1tvYmpdKSByZXR1cm4gMDsKLSAgICBkcHJpbnRmX2dkaShzdGRkZWIsICJHZXRTdG9ja09iamVjdDogcmV0dXJuaW5nICVkXG4iLAorICAgIGRwcmludGZfaW5mbyhnZGksICJHZXRTdG9ja09iamVjdDogcmV0dXJuaW5nICVkXG4iLAogICAgICAgICAgICAgICAgIEZJUlNUX1NUT0NLX0hBTkRMRSArIG9iaiApOwogICAgIHJldHVybiAoSEdESU9CSjE2KShGSVJTVF9TVE9DS19IQU5ETEUgKyBvYmopOwogfQpAQCAtNDA3LDcgKzQwNiw3IEBACiB7CiAgICAgR0RJT0JKSERSICogcHRyID0gTlVMTDsKICAgICBJTlQxNiByZXN1bHQgPSAwOwotICAgIGRwcmludGZfZ2RpKHN0ZGRlYiwgIkdldE9iamVjdDE2OiAlMDR4ICVkICVwXG4iLCBoYW5kbGUsIGNvdW50LCBidWZmZXIgKTsKKyAgICBkcHJpbnRmX2luZm8oZ2RpLCAiR2V0T2JqZWN0MTY6ICUwNHggJWQgJXBcbiIsIGhhbmRsZSwgY291bnQsIGJ1ZmZlciApOwogICAgIGlmICghY291bnQpIHJldHVybiAwOwogCiAgICAgaWYgKChoYW5kbGUgPj0gRklSU1RfU1RPQ0tfSEFORExFKSAmJiAoaGFuZGxlIDw9IExBU1RfU1RPQ0tfSEFORExFKSkKQEAgLTQ0Niw3ICs0NDUsNyBAQAogewogICAgIEdESU9CSkhEUiAqIHB0ciA9IE5VTEw7CiAgICAgSU5UMzIgcmVzdWx0ID0gMDsKLSAgICBkcHJpbnRmX2dkaShzdGRkZWIsICJHZXRPYmplY3QzMkE6ICUwOHggJWQgJXBcbiIsIGhhbmRsZSwgY291bnQsIGJ1ZmZlciApOworICAgIGRwcmludGZfaW5mbyhnZGksICJHZXRPYmplY3QzMkE6ICUwOHggJWQgJXBcbiIsIGhhbmRsZSwgY291bnQsIGJ1ZmZlciApOwogICAgIGlmICghY291bnQpIHJldHVybiAwOwogCiAgICAgaWYgKChoYW5kbGUgPj0gRklSU1RfU1RPQ0tfSEFORExFKSAmJiAoaGFuZGxlIDw9IExBU1RfU1RPQ0tfSEFORExFKSkKQEAgLTQ4NSw3ICs0ODQsNyBAQAogewogICAgIEdESU9CSkhEUiAqIHB0ciA9IE5VTEw7CiAgICAgSU5UMzIgcmVzdWx0ID0gMDsKLSAgICBkcHJpbnRmX2dkaShzdGRkZWIsICJHZXRPYmplY3RUeXBlOiAlMDh4XG4iLCBoYW5kbGUgKTsKKyAgICBkcHJpbnRmX2luZm8oZ2RpLCAiR2V0T2JqZWN0VHlwZTogJTA4eFxuIiwgaGFuZGxlICk7CiAKICAgICBpZiAoKGhhbmRsZSA+PSBGSVJTVF9TVE9DS19IQU5ETEUpICYmIChoYW5kbGUgPD0gTEFTVF9TVE9DS19IQU5ETEUpKQogICAgICAgcHRyID0gU3RvY2tPYmplY3RzW2hhbmRsZSAtIEZJUlNUX1NUT0NLX0hBTkRMRV07CkBAIC01ODIsNyArNTgxLDcgQEAKIHsKICAgICBEQyAqIGRjID0gRENfR2V0RENQdHIoIGhkYyApOwogICAgIGlmICghZGMgfHwgIWRjLT5mdW5jcy0+cFNlbGVjdE9iamVjdCkgcmV0dXJuIDA7Ci0gICAgZHByaW50Zl9nZGkoc3RkZGViLCAiU2VsZWN0T2JqZWN0OiBoZGM9JTA0eCAlMDR4XG4iLCBoZGMsIGhhbmRsZSApOworICAgIGRwcmludGZfaW5mbyhnZGksICJTZWxlY3RPYmplY3Q6IGhkYz0lMDR4ICUwNHhcbiIsIGhkYywgaGFuZGxlICk7CiAgICAgcmV0dXJuIGRjLT5mdW5jcy0+cFNlbGVjdE9iamVjdCggZGMsIGhhbmRsZSApOwogfQogCkBAIC02MDcsNyArNjA2LDcgQEAKICAgICBHRElPQkpIRFIgKiBoZWFkZXIgPSAoR0RJT0JKSERSICopIEdESV9IRUFQX0xPQ0soIG9iaiApOwogICAgIGlmICghaGVhZGVyKSByZXR1cm4gRkFMU0U7CiAKLSAgICBkcHJpbnRmX2dkaSggc3RkZGViLCAiVW5yZWFsaXplT2JqZWN0OiAlMDR4XG4iLCBvYmogKTsKKyAgICBkcHJpbnRmX2luZm8oZ2RpLCAiVW5yZWFsaXplT2JqZWN0OiAlMDR4XG4iLCBvYmogKTsKIAogICAgICAgLyogVW5yZWFsaXplIG9iamVjdCAqLwogCkBAIC02NDgsNyArNjQ3LDcgQEAKICAgICBMT0dQRU4xNiAqcGVuOwogICAgIExPR0JSVVNIMTYgKmJydXNoID0gTlVMTDsKIAotICAgIGRwcmludGZfZ2RpKCBzdGRkZWIsICJFbnVtT2JqZWN0czE2OiAlMDR4ICVkICUwOGx4ICUwOGx4XG4iLAorICAgIGRwcmludGZfaW5mbyhnZGksICJFbnVtT2JqZWN0czE2OiAlMDR4ICVkICUwOGx4ICUwOGx4XG4iLAogICAgICAgICAgICAgICAgICBoZGMsIG5PYmpUeXBlLCAoRFdPUkQpbHBFbnVtRnVuYywgbFBhcmFtICk7CiAgICAgc3dpdGNoKG5PYmpUeXBlKQogICAgIHsKQEAgLTY2Miw3ICs2NjEsNyBAQAogICAgICAgICAgICAgcGVuLT5sb3BuV2lkdGgueSA9IDA7CiAgICAgICAgICAgICBwZW4tPmxvcG5Db2xvciAgID0gc29saWRfY29sb3JzW2ldOwogICAgICAgICAgICAgcmV0dmFsID0gbHBFbnVtRnVuYyggU0VHUFRSX0dFVChwZW4pLCBsUGFyYW0gKTsKLSAgICAgICAgICAgIGRwcmludGZfZ2RpKCBzdGRkZWIsICJFbnVtT2JqZWN0czE2OiBzb2xpZCBwZW4gJTA4bHgsIHJldD0lZFxuIiwKKyAgICAgICAgICAgIGRwcmludGZfaW5mbyhnZGksICJFbnVtT2JqZWN0czE2OiBzb2xpZCBwZW4gJTA4bHgsIHJldD0lZFxuIiwKICAgICAgICAgICAgICAgICAgICAgICAgICBzb2xpZF9jb2xvcnNbaV0sIHJldHZhbCk7CiAgICAgICAgICAgICBpZiAoIXJldHZhbCkgYnJlYWs7CiAgICAgICAgIH0KQEAgLTY3OCw3ICs2NzcsNyBAQAogICAgICAgICAgICAgYnJ1c2gtPmxiQ29sb3IgPSBzb2xpZF9jb2xvcnNbaV07CiAgICAgICAgICAgICBicnVzaC0+bGJIYXRjaCA9IDA7CiAgICAgICAgICAgICByZXR2YWwgPSBscEVudW1GdW5jKCBTRUdQVFJfR0VUKGJydXNoKSwgbFBhcmFtICk7Ci0gICAgICAgICAgICBkcHJpbnRmX2dkaSggc3RkZGViLCAiRW51bU9iamVjdHMxNjogc29saWQgYnJ1c2ggJTA4bHgsIHJldD0lZFxuIiwKKyAgICAgICAgICAgIGRwcmludGZfaW5mbyhnZGksICJFbnVtT2JqZWN0czE2OiBzb2xpZCBicnVzaCAlMDhseCwgcmV0PSVkXG4iLAogICAgICAgICAgICAgICAgICAgICAgICAgIHNvbGlkX2NvbG9yc1tpXSwgcmV0dmFsKTsKICAgICAgICAgICAgIGlmICghcmV0dmFsKSBicmVhazsKICAgICAgICAgfQpAQCAtNjkwLDcgKzY4OSw3IEBACiAgICAgICAgICAgICBicnVzaC0+bGJDb2xvciA9IFJHQigwLDAsMCk7CiAgICAgICAgICAgICBicnVzaC0+bGJIYXRjaCA9IGk7CiAgICAgICAgICAgICByZXR2YWwgPSBscEVudW1GdW5jKCBTRUdQVFJfR0VUKGJydXNoKSwgbFBhcmFtICk7Ci0gICAgICAgICAgICBkcHJpbnRmX2dkaSggc3RkZGViLCAiRW51bU9iamVjdHMxNjogaGF0Y2hlZCBicnVzaCAlZCwgcmV0PSVkXG4iLAorICAgICAgICAgICAgZHByaW50Zl9pbmZvKGdkaSwgIkVudW1PYmplY3RzMTY6IGhhdGNoZWQgYnJ1c2ggJWQsIHJldD0lZFxuIiwKICAgICAgICAgICAgICAgICAgICAgICAgICBpLCByZXR2YWwpOwogICAgICAgICAgICAgaWYgKCFyZXR2YWwpIGJyZWFrOwogICAgICAgICB9CkBAIC03MjcsNyArNzI2LDcgQEAKICAgICBMT0dQRU4zMiBwZW47CiAgICAgTE9HQlJVU0gzMiBicnVzaDsKIAotICAgIGRwcmludGZfZ2RpKCBzdGRkZWIsICJFbnVtT2JqZWN0czMyOiAlMDR4ICVkICUwOGx4ICUwOGx4XG4iLAorICAgIGRwcmludGZfaW5mbyhnZGksICJFbnVtT2JqZWN0czMyOiAlMDR4ICVkICUwOGx4ICUwOGx4XG4iLAogICAgICAgICAgICAgICAgICBoZGMsIG5PYmpUeXBlLCAoRFdPUkQpbHBFbnVtRnVuYywgbFBhcmFtICk7CiAgICAgc3dpdGNoKG5PYmpUeXBlKQogICAgIHsKQEAgLTc0MCw3ICs3MzksNyBAQAogICAgICAgICAgICAgcGVuLmxvcG5XaWR0aC55ID0gMDsKICAgICAgICAgICAgIHBlbi5sb3BuQ29sb3IgICA9IHNvbGlkX2NvbG9yc1tpXTsKICAgICAgICAgICAgIHJldHZhbCA9IGxwRW51bUZ1bmMoICZwZW4sIGxQYXJhbSApOwotICAgICAgICAgICAgZHByaW50Zl9nZGkoIHN0ZGRlYiwgIkVudW1PYmplY3RzMzI6IHNvbGlkIHBlbiAlMDhseCwgcmV0PSVkXG4iLAorICAgICAgICAgICAgZHByaW50Zl9pbmZvKGdkaSwgIkVudW1PYmplY3RzMzI6IHNvbGlkIHBlbiAlMDhseCwgcmV0PSVkXG4iLAogICAgICAgICAgICAgICAgICAgICAgICAgIHNvbGlkX2NvbG9yc1tpXSwgcmV0dmFsKTsKICAgICAgICAgICAgIGlmICghcmV0dmFsKSBicmVhazsKICAgICAgICAgfQpAQCAtNzU0LDcgKzc1Myw3IEBACiAgICAgICAgICAgICBicnVzaC5sYkNvbG9yID0gc29saWRfY29sb3JzW2ldOwogICAgICAgICAgICAgYnJ1c2gubGJIYXRjaCA9IDA7CiAgICAgICAgICAgICByZXR2YWwgPSBscEVudW1GdW5jKCAmYnJ1c2gsIGxQYXJhbSApOwotICAgICAgICAgICAgZHByaW50Zl9nZGkoIHN0ZGRlYiwgIkVudW1PYmplY3RzMzI6IHNvbGlkIGJydXNoICUwOGx4LCByZXQ9JWRcbiIsCisgICAgICAgICAgICBkcHJpbnRmX2luZm8oZ2RpLCAiRW51bU9iamVjdHMzMjogc29saWQgYnJ1c2ggJTA4bHgsIHJldD0lZFxuIiwKICAgICAgICAgICAgICAgICAgICAgICAgICBzb2xpZF9jb2xvcnNbaV0sIHJldHZhbCk7CiAgICAgICAgICAgICBpZiAoIXJldHZhbCkgYnJlYWs7CiAgICAgICAgIH0KQEAgLTc2Niw3ICs3NjUsNyBAQAogICAgICAgICAgICAgYnJ1c2gubGJDb2xvciA9IFJHQigwLDAsMCk7CiAgICAgICAgICAgICBicnVzaC5sYkhhdGNoID0gaTsKICAgICAgICAgICAgIHJldHZhbCA9IGxwRW51bUZ1bmMoICZicnVzaCwgbFBhcmFtICk7Ci0gICAgICAgICAgICBkcHJpbnRmX2dkaSggc3RkZGViLCAiRW51bU9iamVjdHMzMjogaGF0Y2hlZCBicnVzaCAlZCwgcmV0PSVkXG4iLAorICAgICAgICAgICAgZHByaW50Zl9pbmZvKGdkaSwgIkVudW1PYmplY3RzMzI6IGhhdGNoZWQgYnJ1c2ggJWQsIHJldD0lZFxuIiwKICAgICAgICAgICAgICAgICAgICAgICAgICBpLCByZXR2YWwpOwogICAgICAgICAgICAgaWYgKCFyZXR2YWwpIGJyZWFrOwogICAgICAgICB9CmRpZmYgLS1naXQgYS9vYmplY3RzL21ldGFmaWxlLmMgYi9vYmplY3RzL21ldGFmaWxlLmMKaW5kZXggNGQ0MjZkNy4uMWQ1OGFmMCAxMDA2NDQKLS0tIGEvb2JqZWN0cy9tZXRhZmlsZS5jCisrKyBiL29iamVjdHMvbWV0YWZpbGUuYwpAQCAtMTYsNyArMTYsNiBAQAogI2luY2x1ZGUgIm1ldGFmaWxlLmgiCiAjaW5jbHVkZSAibWV0YWZpbGVkcnYuaCIKICNpbmNsdWRlICJ0b29saGVscC5oIgotI2luY2x1ZGUgInN0ZGRlYnVnLmgiCiAjaW5jbHVkZSAiZGVidWcuaCIKIAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgpAQCAtODAsNyArNzksNyBAQAogICBIRklMRTMyIGhGaWxlOwogICBEV09SRCBzaXplOwogICAKLSAgZHByaW50Zl9tZXRhZmlsZShzdGRkZWIsIkdldE1ldGFGaWxlOiAlc1xuIiwgbHBGaWxlbmFtZSk7CisgIGRwcmludGZfaW5mbyhtZXRhZmlsZSwiR2V0TWV0YUZpbGU6ICVzXG4iLCBscEZpbGVuYW1lKTsKIAogICBpZiAoIWxwRmlsZW5hbWUpCiAgICAgcmV0dXJuIDA7CkBAIC0xOTAsNyArMTg5LDcgQEAKICAgICBNRVRBSEVBREVSICptaDI7CiAgICAgSEZJTEUzMiBoRmlsZTsKICAgICAKLSAgICBkcHJpbnRmX21ldGFmaWxlKHN0ZGRlYiwiQ29weU1ldGFGaWxlOiAlc1xuIiwgbHBGaWxlbmFtZSk7CisgICAgZHByaW50Zl9pbmZvKG1ldGFmaWxlLCJDb3B5TWV0YUZpbGU6ICVzXG4iLCBscEZpbGVuYW1lKTsKICAgICAKICAgICBtaCA9IChNRVRBSEVBREVSICopR2xvYmFsTG9jazE2KGhTcmNNZXRhRmlsZSk7CiAgICAgCkBAIC0yNjEsNyArMjYwLDcgQEAKICAgICAgICAgICAgIHJlc3U9VFJVRTsKICAgICAgIEdsb2JhbFVubG9jazE2KGhtZik7CiAgICAgfQotICAgIGRwcmludGZfbWV0YWZpbGUoc3RkZGViLCJJc1ZhbGlkTWV0YUZpbGUgJXggPT4gJWRcbiIsaG1mLHJlc3UpOworICAgIGRwcmludGZfaW5mbyhtZXRhZmlsZSwiSXNWYWxpZE1ldGFGaWxlICV4ID0+ICVkXG4iLGhtZixyZXN1KTsKICAgICByZXR1cm4gcmVzdTsgICAgICAgICAKIH0KIApAQCAtMjk3LDcgKzI5Niw3IEBACiAgICAgSEZPTlQzMiBoRm9udDsKICAgICBEQyAqZGM7CiAgICAgCi0gICAgZHByaW50Zl9tZXRhZmlsZShzdGRkZWIsIlBsYXlNZXRhRmlsZSglMDR4ICUwNHgpXG4iLGhkYyxobWYpOworICAgIGRwcmludGZfaW5mbyhtZXRhZmlsZSwiUGxheU1ldGFGaWxlKCUwNHggJTA0eClcbiIsaGRjLGhtZik7CiAgICAgaWYgKCFtaCkgcmV0dXJuIEZBTFNFOwogICAgIGlmICghKGRjID0gKERDICopIEdESV9HZXRPYmpQdHIoIGhkYywgRENfTUFHSUMgKSkpIHJldHVybiAwOwogICAgIGhQZW4gPSBkYy0+dy5oUGVuOwpAQCAtMzE1LDcgKzMxNCw3IEBACiAgICAgd2hpbGUgKG9mZnNldCA8IG1oLT5tdFNpemUgKiAyKQogICAgIHsKICAgICAgICAgbXIgPSAoTUVUQVJFQ09SRCAqKSgoY2hhciAqKW1oICsgb2Zmc2V0KTsKLQlkcHJpbnRmX21ldGFmaWxlKHN0ZGRlYiwib2Zmc2V0ID0gJTA0eCBzaXplID0gJTA4bHhcbiIsCisJZHByaW50Zl9pbmZvKG1ldGFmaWxlLCJvZmZzZXQgPSAlMDR4IHNpemUgPSAlMDhseFxuIiwKIAkJCSBvZmZzZXQsIG1yLT5yZFNpemUpOwogCWlmICghbXItPnJkU2l6ZSkgewogCQlmcHJpbnRmKHN0ZGVyciwiTUVUQUZJTEUgZW50cnkgZ290IHNpemUgMCBhdCBvZmZzZXQgJWQsIHRvdGFsIG1mIGxlbmd0aCBpcyAlbGRcbiIsb2Zmc2V0LG1oLT5tdFNpemUqMik7CkBAIC0zNzUsNyArMzc0LDcgQEAKICAgICBEQyAqZGM7CiAgICAgQk9PTDE2IHJlc3VsdCA9IFRSVUU7CiAgICAgCi0gICAgZHByaW50Zl9tZXRhZmlsZShzdGRkZWIsIkVudW1NZXRhRmlsZSglMDR4LCAlMDR4LCAlMDhseCwgJTA4bHgpXG4iLAorICAgIGRwcmludGZfaW5mbyhtZXRhZmlsZSwiRW51bU1ldGFGaWxlKCUwNHgsICUwNHgsICUwOGx4LCAlMDhseClcbiIsCiAJCSAgICAgaGRjLCBobWYsIChEV09SRClscEVudW1GdW5jLCBscERhdGEpOwogCiAgICAgaWYgKCEoZGMgPSAoREMgKikgR0RJX0dldE9ialB0ciggaGRjLCBEQ19NQUdJQyApKSkgcmV0dXJuIDA7CkBAIC00NjEsNyArNDYwLDcgQEAKICAgICBjaGFyICpwdHI7CiAgICAgQklUTUFQSU5GT0hFQURFUiAqaW5mb2hkcjsKIAotICAgIGRwcmludGZfbWV0YWZpbGUoc3RkZGViLAorICAgIGRwcmludGZfaW5mbyhtZXRhZmlsZSwKICJQbGF5TWV0YUZpbGVSZWNvcmQoJTA0eCAlMDhseCAlMDhseCAlMDR4KSBmdW5jdGlvbiAlMDR4XG4iLAogCQkgICAgIGhkYywoTE9ORylodCwgKExPTkcpbXIsIG5IYW5kbGVzLCBtci0+cmRGdW5jdGlvbik7CiAgICAgCkBAIC03MTIsNyArNzExLDcgQEAKIAlicmVhazsKIAogICAgIGNhc2UgTUVUQV9FU0NBUEU6Ci0JZHByaW50Zl9tZXRhZmlsZShzdGRkZWIsIlBsYXlNZXRhRmlsZVJlY29yZDogTUVUQV9FU0NBUEUgdW5pbXBsZW1lbnRlZC5cbiIpOworCWRwcmludGZfZml4bWUobWV0YWZpbGUsICJQbGF5TWV0YUZpbGVSZWNvcmQ6IE1FVEFfRVNDQVBFIHVuaW1wbGVtZW50ZWQuXG4iKTsKICAgICAgICAgYnJlYWs7CiAKICAgICAgICAgLyogLS0tIEJlZ2luIG9mIGZpeGVkIG9yIG5ldyBtZXRhZmlsZSBvcGVyYXRpb25zLiBKdWx5IDE5OTYgLS0tLSovCkBAIC03MzcsNyArNzM2LDcgQEAKICAgICAgICAgICAgIGR4eCA9IChMUElOVDE2KShzb3QrKCgoczErMSk+PjEpKjIpKTsJICAgCiAgICAgICAgICAgZWxzZSAKIAkgIHsKLQkgICBkcHJpbnRmX21ldGFmaWxlKHN0ZGRlYiwiRVhUVEVYVE9VVDogJXMgIGxlbjogJWxkXG4iLAorCSAgIGRwcmludGZfaW5mbyhtZXRhZmlsZSwiRVhUVEVYVE9VVDogJXMgIGxlbjogJWxkXG4iLAogICAgICAgICAgICAgIHNvdCxtci0+cmRTaXplKTsKICAgICAgICAgICAgZnByaW50ZihzdGRlcnIsCiAJICAgICAiUGxlYXNlIHJlcG9ydDogUGxheU1ldGFGaWxlL0V4dFRleHRPdXQgbGVuPSVsZCBzbGVuPSVkIHJkU2l6ZT0lbGQgb3B0PSUwNHhcbiIsCkBAIC03NTEsNyArNzUwLDcgQEAKIAkJICAgICAgICAgICBzb3QsCQkJCS8qIHN0cmluZyAqLwogICAgICAgICAgICAgICAgICAgICAgICAgICAgczEsIGR4eCk7ICAgICAgICAgICAgICAgICAgICAvKiBsZW5ndGgsIGR4IGFycmF5ICovCiAgICAgICAgIGlmIChkeHgpICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgIGRwcmludGZfbWV0YWZpbGUoc3RkZGViLCJFWFRURVhUT1VUOiAlcyAgbGVuOiAlbGQgIGR4MDogJWRcbiIsCisgICAgICAgICAgZHByaW50Zl9pbmZvKG1ldGFmaWxlLCJFWFRURVhUT1VUOiAlcyAgbGVuOiAlbGQgIGR4MDogJWRcbiIsCiAgICAgICAgICAgICBzb3QsbXItPnJkU2l6ZSxkeHhbMF0pOwogICAgICAgIH0KICAgICAgICBicmVhazsKQEAgLTg0Miw3ICs4NDEsNyBAQAogCiAgICAgIGNhc2UgTUVUQV9ESUJDUkVBVEVQQVRURVJOQlJVU0g6CiAJLyogICoobXItPnJkUGFyYW0pIG1heSBiZSBCU19QQVRURVJOIG9yIEJTX0RJQlBBVFRFUk46IGJ1dCB0aGVyZSdzIG5vIGRpZmZlcmVuY2UgKi8KLSAgICAgICAgZHByaW50Zl9tZXRhZmlsZShzdGRkZWIsIk1FVEFfRElCQ1JFQVRFUEFUVEVSTkJSVVNIOiAlZFxuIiwqKG1yLT5yZFBhcmFtKSk7CisgICAgICAgIGRwcmludGZfaW5mbyhtZXRhZmlsZSwiTUVUQV9ESUJDUkVBVEVQQVRURVJOQlJVU0g6ICVkXG4iLCoobXItPnJkUGFyYW0pKTsKIAlzMSA9IG1yLT5yZFNpemUgKiAyIC0gc2l6ZW9mKE1FVEFSRUNPUkQpIC0gMjsKIAlobmRsID0gR2xvYmFsQWxsb2MxNihHTUVNX01PVkVBQkxFLCBzMSk7CiAJcHRyID0gR2xvYmFsTG9jazE2KGhuZGwpOwpAQCAtOTA4LDcgKzkwNyw3IEBACiAJCQkJIEhNRVRBRklMRTE2IGhtZiAvKiBtZXRhZmlsZSBoYW5kbGUgKi8KIAkJCQkgKQogewotICAgIGRwcmludGZfbWV0YWZpbGUoc3RkZGViLCJHZXRNZXRhRmlsZUJpdHM6IGhNZW0gb3V0OiAlMDR4XG4iLCBobWYpOworICAgIGRwcmludGZfaW5mbyhtZXRhZmlsZSwiR2V0TWV0YUZpbGVCaXRzOiBoTWVtIG91dDogJTA0eFxuIiwgaG1mKTsKICAgICByZXR1cm4gaG1mOwogfQogCkBAIC05MjUsNyArOTI0LDcgQEAKIAkJCS8qIGhhbmRsZSB0byBhIG1lbW9yeSByZWdpb24gaG9sZGluZyBhIG1ldGFmaWxlICovCiApCiB7Ci0gICAgZHByaW50Zl9tZXRhZmlsZShzdGRkZWIsIlNldE1ldGFGaWxlQml0czogaG1mIG91dDogJTA0eFxuIiwgaE1lbSk7CisgICAgZHByaW50Zl9pbmZvKG1ldGFmaWxlLCJTZXRNZXRhRmlsZUJpdHM6IGhtZiBvdXQ6ICUwNHhcbiIsIGhNZW0pOwogCiAgICAgcmV0dXJuIGhNZW07CiB9CkBAIC0xMDQzLDcgKzEwNDIsNyBAQAogCW1lbWNweSgoV09SRCAqKXBoeXNEZXYtPm1oICsgcGh5c0Rldi0+bWgtPm10U2l6ZSwgbXIsIHJsZW4pOwogICAgICAgICBicmVhazsKICAgICBjYXNlIE1FVEFGSUxFX0RJU0s6Ci0gICAgICAgIGRwcmludGZfbWV0YWZpbGUoc3RkZGViLCJXcml0aW5nIHJlY29yZCB0byBkaXNrXG4iKTsKKyAgICAgICAgZHByaW50Zl9pbmZvKG1ldGFmaWxlLCJXcml0aW5nIHJlY29yZCB0byBkaXNrXG4iKTsKIAlpZiAoX2x3cml0ZTMyKHBoeXNEZXYtPm1oLT5tdE5vUGFyYW1ldGVycywgKGNoYXIgKiltciwgcmxlbikgPT0gLTEpCiAJICAgIHJldHVybiBGQUxTRTsKICAgICAgICAgYnJlYWs7CkBAIC0xNDQzLDcgKzE0NDIsNyBAQAogICAgICoobXItPnJkUGFyYW0gKyA5KSA9IEJNLmJtV2lkdGhCeXRlczsKICAgICAqKG1yLT5yZFBhcmFtICsxMCkgPSBCTS5ibVBsYW5lczsKICAgICAqKG1yLT5yZFBhcmFtICsxMSkgPSBCTS5ibUJpdHNQaXhlbDsKLSAgICBkcHJpbnRmX21ldGFmaWxlKHN0ZGRlYiwiTUZfU3RyZXRjaEJsdC0+bGVuID0gJWxkICByb3A9JWx4ICBcbiIsbGVuLHJvcCk7CisgICAgZHByaW50Zl9pbmZvKG1ldGFmaWxlLCJNRl9TdHJldGNoQmx0LT5sZW4gPSAlbGQgIHJvcD0lbHggIFxuIixsZW4scm9wKTsKICAgICBpZiAoR2V0Qml0bWFwQml0czMyKGRjU3JjLT53LmhCaXRtYXAsQk0uYm1XaWR0aEJ5dGVzICogQk0uYm1IZWlnaHQsCiAgICAgICAgICAgICAgICAgICAgICAgICBtci0+cmRQYXJhbSArMTIpKQogICAgIHsKQEAgLTE1MDgsNyArMTUwNyw3IEBACiAgICAgbHBCTUktPmJpWVBlbHNQZXJNZXRlciA9IE11bERpdjMyKEdldERldmljZUNhcHMoZGNTcmMtPmhTZWxmLExPR1BJWEVMU1kpLDM5MzcsMTAwKTsKICAgICBscEJNSS0+YmlDbHJJbXBvcnRhbnQgID0gMDsgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIDEgbWV0ZXIgID0gMzkuMzcgaW5jaCAqLwogCi0gICAgZHByaW50Zl9tZXRhZmlsZShzdGRkZWIsIk1GX1N0cmV0Y2hCbHRWaWFESUItPmxlbiA9ICVsZCAgcm9wPSVseCAgUGl4WVBNPSVsZCBDYXBzPSVkXG4iLAorICAgIGRwcmludGZfaW5mbyhtZXRhZmlsZSwiTUZfU3RyZXRjaEJsdFZpYURJQi0+bGVuID0gJWxkICByb3A9JWx4ICBQaXhZUE09JWxkIENhcHM9JWRcbiIsCiAgICAgICAgICAgICAgICBsZW4scm9wLGxwQk1JLT5iaVlQZWxzUGVyTWV0ZXIsR2V0RGV2aWNlQ2FwcyhoZGNTcmMsTE9HUElYRUxTWSkpOwogICAgIGlmIChHZXRESUJpdHMoaGRjU3JjLGRjU3JjLT53LmhCaXRtYXAsMCwoVUlOVDMyKWxwQk1JLT5iaUhlaWdodCwKICAgICAgICAgICAgICAgICAgIChMUFNUUilscEJNSSArIERJQl9CaXRtYXBJbmZvU2l6ZSggKEJJVE1BUElORk8gKilscEJNSSwKQEAgLTE1MjUsNyArMTUyNCw3IEBACiAgICAgKihtci0+cmRQYXJhbSArMTIpID0gQk0uYm1XaWR0aEJ5dGVzOwogICAgICoobXItPnJkUGFyYW0gKzEzKSA9IEJNLmJtUGxhbmVzOwogICAgICoobXItPnJkUGFyYW0gKzE0KSA9IEJNLmJtQml0c1BpeGVsOwotICAgIGRwcmludGZfbWV0YWZpbGUoc3RkZGViLCJNRl9TdHJldGNoQmx0LT5sZW4gPSAlbGQgIHJvcD0lbHggIFxuIixsZW4scm9wKTsKKyAgICBkcHJpbnRmX2luZm8obWV0YWZpbGUsIk1GX1N0cmV0Y2hCbHQtPmxlbiA9ICVsZCAgcm9wPSVseCAgXG4iLGxlbixyb3ApOwogICAgIGlmIChHZXRCaXRtYXBCaXRzMzIoIGRjU3JjLT53LmhCaXRtYXAsIEJNLmJtV2lkdGhCeXRlcyAqIEJNLmJtSGVpZ2h0LAogICAgICAgICAgICAgICAgICAgICAgICAgIG1yLT5yZFBhcmFtICsxNSkpCiAjZW5kaWYgICAgCmRpZmYgLS1naXQgYS9vYmplY3RzL29lbWJpdG1hcC5jIGIvb2JqZWN0cy9vZW1iaXRtYXAuYwppbmRleCA3MDBlOWZlLi5kMzYyZjc3IDEwMDY0NAotLS0gYS9vYmplY3RzL29lbWJpdG1hcC5jCisrKyBiL29iamVjdHMvb2VtYml0bWFwLmMKQEAgLTE2LDcgKzE2LDYgQEAKICNpbmNsdWRlICJjb2xvci5oIgogI2luY2x1ZGUgImN1cnNvcmljb24uaCIKICNpbmNsdWRlICJoZWFwLmgiCi0jaW5jbHVkZSAic3RkZGVidWcuaCIKICNpbmNsdWRlICJ0d2Vhay5oIgogI2luY2x1ZGUgImRlYnVnLmgiCiAKZGlmZiAtLWdpdCBhL29iamVjdHMvcGFsZXR0ZS5jIGIvb2JqZWN0cy9wYWxldHRlLmMKaW5kZXggNjdmNDQxMS4uZDExYzJjZCAxMDA2NDQKLS0tIGEvb2JqZWN0cy9wYWxldHRlLmMKKysrIGIvb2JqZWN0cy9wYWxldHRlLmMKQEAgLTE2LDggKzE2LDYgQEAKICNpbmNsdWRlICJjb2xvci5oIgogI2luY2x1ZGUgInBhbGV0dGUuaCIKICNpbmNsdWRlICJ4bWFsbG9jLmgiCi0jaW5jbHVkZSAic3RkZGVidWcuaCIKLS8qICNkZWZpbmUgREVCVUdfUEFMRVRURSAqLwogI2luY2x1ZGUgImRlYnVnLmgiCiAKIHN0YXRpYyBVSU5UMzIgU3lzdGVtUGFsZXR0ZVVzZSA9IFNZU1BBTF9TVEFUSUM7ICAvKiBjdXJyZW50bHkgbm90IGNvbnNpZGVyZWQgKi8KQEAgLTk1LDcgKzkzLDcgQEAKICAgICBIUEFMRVRURTMyIGhwYWxldHRlOwogICAgIGludCBzaXplID0gc2l6ZW9mKExPR1BBTEVUVEUpICsgKHBhbGV0dGUtPnBhbE51bUVudHJpZXMgLSAxKSAqIHNpemVvZihQQUxFVFRFRU5UUlkpOwogCi0gICAgZHByaW50Zl9wYWxldHRlKHN0ZGRlYiwiQ3JlYXRlUGFsZXR0ZTogJWkgZW50cmllcywgIiwKKyAgICBkcHJpbnRmX2luZm8ocGFsZXR0ZSwiQ3JlYXRlUGFsZXR0ZTogJWkgZW50cmllcyBcbiIsCiAgICAgICAgICAgICAgICAgICAgIHBhbGV0dGUtPnBhbE51bUVudHJpZXMpOwogCiAgICAgaHBhbGV0dGUgPSBHRElfQWxsb2NPYmplY3QoIHNpemUgKyBzaXplb2YoaW50KikgK3NpemVvZihHRElPQkpIRFIpICwgUEFMRVRURV9NQUdJQyApOwpAQCAtMTA4LDcgKzEwNiw3IEBACiAgICAgcGFsZXR0ZVB0ci0+bWFwcGluZyA9IE5VTEw7CiAgICAgR0RJX0hFQVBfVU5MT0NLKCBocGFsZXR0ZSApOwogCi0gICAgZHByaW50Zl9wYWxldHRlKHN0ZGRlYiwicmV0dXJuaW5nICUwNHhcbiIsIGhwYWxldHRlKTsKKyAgICBkcHJpbnRmX2luZm8ocGFsZXR0ZSwiICAgcmV0dXJuaW5nICUwNHhcbiIsIGhwYWxldHRlKTsKICAgICByZXR1cm4gaHBhbGV0dGU7CiB9CiAKQEAgLTE0MCw3ICsxMzgsNyBAQAogICAgIFBBTEVUVEVPQkogKiBwYWxQdHI7CiAgICAgSU5UMzIgbnVtRW50cmllczsKIAotICAgIGRwcmludGZfcGFsZXR0ZSggc3RkZGViLCJHZXRQYWxldHRlRW50cmllczogaHBhbCA9ICUwNHgsICVpIGVudHJpZXNcbiIsCisgICAgZHByaW50Zl9pbmZvKHBhbGV0dGUsIkdldFBhbGV0dGVFbnRyaWVzOiBocGFsID0gJTA0eCwgJWkgZW50cmllc1xuIiwKICAgICAgICAgICAgICAgICAgICAgIGhwYWxldHRlLCBjb3VudCApOwogICAgICAgICAKICAgICBwYWxQdHIgPSAoUEFMRVRURU9CSiAqKSBHRElfR2V0T2JqUHRyKCBocGFsZXR0ZSwgUEFMRVRURV9NQUdJQyApOwpAQCAtMTgyLDcgKzE4MCw3IEBACiAgICAgUEFMRVRURU9CSiAqIHBhbFB0cjsKICAgICBJTlQzMiBudW1FbnRyaWVzOwogCi0gICAgZHByaW50Zl9wYWxldHRlKCBzdGRkZWIsIlNldFBhbGV0dGVFbnRyaWVzOiBocGFsID0gJTA0eCwgJWkgZW50cmllc1xuIiwKKyAgICBkcHJpbnRmX2luZm8ocGFsZXR0ZSwiU2V0UGFsZXR0ZUVudHJpZXM6IGhwYWwgPSAlMDR4LCAlaSBlbnRyaWVzXG4iLAogICAgICAgICAgICAgICAgICAgICAgaHBhbGV0dGUsIGNvdW50ICk7CiAKICAgICBwYWxQdHIgPSAoUEFMRVRURU9CSiAqKSBHRElfR2V0T2JqUHRyKCBocGFsZXR0ZSwgUEFMRVRURV9NQUdJQyApOwpAQCAtMjI1LDcgKzIyMyw3IEBACiAgICAgaW50CQkgcHJldnNpemUsIHNpemUgPSBzaXplb2YoTE9HUEFMRVRURSkgKyAoY0VudHJpZXMgLSAxKSAqIHNpemVvZihQQUxFVFRFRU5UUlkpOwogICAgIGludCoJIG1hcHBpbmcgPSBOVUxMOwogCi0gICAgZHByaW50Zl9wYWxldHRlKHN0ZGRlYiwiUmVzaXplUGFsZXR0ZTogaHBhbCA9ICUwNHgsIHByZXYgPSAlaSwgbmV3ID0gJWlcbiIsCisgICAgZHByaW50Zl9pbmZvKHBhbGV0dGUsIlJlc2l6ZVBhbGV0dGU6IGhwYWwgPSAlMDR4LCBwcmV2ID0gJWksIG5ldyA9ICVpXG4iLAogCQkgICAgaFBhbCwgcGFsUHRyID8gcGFsUHRyLT5sb2dwYWxldHRlLnBhbE51bUVudHJpZXMgOiAtMSwKICAgICAgICAgICAgICAgICAgICAgY0VudHJpZXMgKTsKICAgICBpZiggIXBhbFB0ciApIHJldHVybiBGQUxTRTsKQEAgLTI3Nyw3ICsyNzUsNyBAQAogQk9PTDMyIFdJTkFQSSBBbmltYXRlUGFsZXR0ZTMyKCBIUEFMRVRURTMyIGhQYWwsIFVJTlQzMiBTdGFydEluZGV4LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFVJTlQzMiBOdW1FbnRyaWVzLCBMUFBBTEVUVEVFTlRSWSBQYWxldHRlQ29sb3JzKQogewotICAgIGRwcmludGZfcGFsZXR0ZShzdGRkZWIsICJBbmltYXRlUGFsZXR0ZTogJTA0eCAoJWkgLSAlaSkiLCBoUGFsLCAKKyAgICBkcHJpbnRmX2luZm8ocGFsZXR0ZSwgIkFuaW1hdGVQYWxldHRlOiAlMDR4ICglaSAtICVpKVxuIiwgaFBhbCwgCiAgICAgICAgICAgICAgICAgICAgIFN0YXJ0SW5kZXgsIFN0YXJ0SW5kZXggKyBOdW1FbnRyaWVzICk7CiAKICAgICBpZiggaFBhbCAhPSBTVE9DS19ERUZBVUxUX1BBTEVUVEUgKSAKQEAgLTM1OCw3ICszNTYsOCBAQAogICAgIFVJTlQzMiBpOwogICAgIERDICpkYzsKIAotICAgIGRwcmludGZfcGFsZXR0ZShzdGRkZWIsIkdldFN5c3RlbVBhbGV0dGVFbnRyaWVzOiBoZGMgPSAlMDR4LCBjb3VuZCA9ICVpIiwgaGRjLCBjb3VudCApOworICAgIGRwcmludGZfaW5mbyhwYWxldHRlLCAiR2V0U3lzdGVtUGFsZXR0ZUVudHJpZXM6IGhkYyA9ICUwNHgsICIKKwkJICAgICJjb3VuZCA9ICVpXG4iLCBoZGMsIGNvdW50ICk7CiAKICAgICBpZiAoIShkYyA9IChEQyAqKSBHRElfR2V0T2JqUHRyKCBoZGMsIERDX01BR0lDICkpKSByZXR1cm4gMDsKICAgICBpZiAoc3RhcnQgPj0gZGMtPncuZGV2Q2Fwcy0+c2l6ZVBhbGV0dGUpCkBAIC0zNzIsNyArMzcxLDcgQEAKICAgICB7CiAJKihDT0xPUlJFRiopKGVudHJpZXMgKyBpKSA9IENPTE9SX0dldFN5c3RlbVBhbGV0dGVFbnRyeSggc3RhcnQgKyBpICk7CiAKLSAgICAgICAgZHByaW50Zl9wYWxldHRlKCBzdGRkZWIsIlx0aWR4KCUwMngpIC0+IFJHQiglMDhseClcbiIsCisgICAgICAgIGRwcmludGZfaW5mbyhwYWxldHRlLCJcdGlkeCglMDJ4KSAtPiBSR0IoJTA4bHgpXG4iLAogICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXJ0ICsgaSwgKihDT0xPUlJFRiopKGVudHJpZXMgKyBpKSApOwogICAgIH0KICAgICBHRElfSEVBUF9VTkxPQ0soIGhkYyApOwpAQCAtNDAyLDcgKzQwMSw3IEBACiAJCQkJICAgICAgICAgIHBhbE9iai0+bG9ncGFsZXR0ZS5wYWxOdW1FbnRyaWVzLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTlVMTCwgY29sb3IsIEZBTFNFICk7CiAKLSAgICBkcHJpbnRmX3BhbGV0dGUoc3RkZGViLCJHZXROZWFyZXN0UGFsZXR0ZUluZGV4KCUwNHgsJTA2bHgpOiByZXR1cm5pbmcgJWRcbiIsIAorICAgIGRwcmludGZfaW5mbyhwYWxldHRlLCJHZXROZWFyZXN0UGFsZXR0ZUluZGV4KCUwNHgsJTA2bHgpOiByZXR1cm5pbmcgJWRcbiIsIAogICAgICAgICAgICAgICAgICAgICBocGFsZXR0ZSwgY29sb3IsIGluZGV4ICk7CiAgICAgR0RJX0hFQVBfVU5MT0NLKCBocGFsZXR0ZSApOwogICAgIHJldHVybiBpbmRleDsKQEAgLTQzOCw3ICs0MzcsNyBAQAogICAgICAgR0RJX0hFQVBfVU5MT0NLKCBkYy0+dy5oUGFsZXR0ZSApOwogICAgIH0KIAotICAgIGRwcmludGZfcGFsZXR0ZShzdGRkZWIsIkdldE5lYXJlc3RDb2xvciglMDZseCk6IHJldHVybmluZyAlMDZseFxuIiwgCisgICAgZHByaW50Zl9pbmZvKHBhbGV0dGUsIkdldE5lYXJlc3RDb2xvciglMDZseCk6IHJldHVybmluZyAlMDZseFxuIiwgCiAgICAgICAgICAgICAgICAgICAgIGNvbG9yLCBuZWFyZXN0ICk7CiAgICAgR0RJX0hFQVBfVU5MT0NLKCBoZGMgKTsgICAgCiAgICAgcmV0dXJuIG5lYXJlc3Q7CkBAIC00OTAsNyArNDg5LDcgQEAKICAgICBIUEFMRVRURTE2IHByZXY7CiAgICAgREMgKmRjOwogCi0gICAgZHByaW50Zl9wYWxldHRlKHN0ZGRlYiwgIkdESVNlbGVjdFBhbGV0dGU6ICUwNHggJTA0eFxuIiwgaGRjLCBocGFsICk7CisgICAgZHByaW50Zl9pbmZvKHBhbGV0dGUsICJHRElTZWxlY3RQYWxldHRlOiAlMDR4ICUwNHhcbiIsIGhkYywgaHBhbCApOwogICAgIAogICAgIGRjID0gKERDICopIEdESV9HZXRPYmpQdHIoIGhkYywgRENfTUFHSUMgKTsKICAgICBpZiAoIWRjKSAKQEAgLTUyMCw3ICs1MTksNyBAQAogCWlmICghZGMpIHJldHVybiAwOwogICAgIH0KIAotICAgIGRwcmludGZfcGFsZXR0ZShzdGRkZWIsICJHRElSZWFsaXplUGFsZXR0ZTogJTA0eC4uLiIsIGhkYyApOworICAgIGRwcmludGZfaW5mbyhwYWxldHRlLCAiR0RJUmVhbGl6ZVBhbGV0dGU6ICUwNHguLi5cbiIsIGhkYyApOwogICAgIAogICAgIGlmKCBkYyAmJiAgZGMtPncuaFBhbGV0dGUgIT0gaExhc3RSZWFsaXplZFBhbGV0dGUgKQogICAgIHsKQEAgLTUzNSwxMSArNTM0LDExIEBACiAJR0RJX0hFQVBfVU5MT0NLKCBkYy0+dy5oUGFsZXR0ZSApOwogCWhMYXN0UmVhbGl6ZWRQYWxldHRlID0gZGMtPncuaFBhbGV0dGU7CiAgICAgfQotICAgIGVsc2UgZHByaW50Zl9wYWxldHRlKHN0ZGRlYiwgIiBza2lwcGluZyAoaExhc3RSZWFsaXplZFBhbGV0dGUgPSAlMDR4KSAiLAorICAgIGVsc2UgZHByaW50Zl9pbmZvKHBhbGV0dGUsICIgIHNraXBwaW5nIChoTGFzdFJlYWxpemVkUGFsZXR0ZSA9ICUwNHgpXG4iLAogCQkJIGhMYXN0UmVhbGl6ZWRQYWxldHRlKTsKICAgICAKICAgICBHRElfSEVBUF9VTkxPQ0soIGhkYyApOwotICAgIGRwcmludGZfcGFsZXR0ZShzdGRuaW1wLCAiIHJlYWxpemVkICVpIGNvbG9yc1xuIiwgcmVhbGl6ZWQgKTsKKyAgICBkcHJpbnRmX2ZpeG1lKHBhbGV0dGUsICIgICByZWFsaXplZCAlaSBjb2xvcnMgLSBub3QgaW1wbWVuZW50ZWQ/XG4iLCByZWFsaXplZCApOwogICAgIHJldHVybiAoVUlOVDE2KXJlYWxpemVkOwogfQogCkBAIC01NTMsNyArNTUyLDcgQEAKICAgICBQQUxFVFRFT0JKKiAgcGFsUHRyOwogICAgIGludCAgICAgICAgICBpLCBpbmRleCwgcmVhbGl6ZWQgPSAwOwogCi0gICAgZHByaW50Zl9wYWxldHRlKHN0ZGRlYiwiUmVhbGl6ZURlZmF1bHRQYWxldHRlOiAlMDR4XG4iLCBoZGMgKTsKKyAgICBkcHJpbnRmX2luZm8ocGFsZXR0ZSwiUmVhbGl6ZURlZmF1bHRQYWxldHRlOiAlMDR4XG4iLCBoZGMgKTsKIAogICAgIGRjID0gKERDICopIEdESV9HZXRPYmpQdHIoIGhkYywgRENfTUFHSUMgKTsKICAgICBpZiAoIWRjKSAKQEAgLTYyMCwxMSArNjE5LDExIEBACiAgICAgV09SRAl3QmtnUGFsZXR0ZSA9IDE7CiAgICAgUEFMRVRURU9CSiogbHB0ID0gKFBBTEVUVEVPQkoqKSBHRElfR2V0T2JqUHRyKCBoUGFsLCBQQUxFVFRFX01BR0lDICk7CiAKLSAgICBkcHJpbnRmX3BhbGV0dGUoc3RkZGViLCJTZWxlY3RQYWxldHRlOiBkYyAlMDR4IHBhbCAlMDR4LCBmb3JjZT0laSAiLCAKKyAgICBkcHJpbnRmX2luZm8ocGFsZXR0ZSwiU2VsZWN0UGFsZXR0ZTogZGMgJTA0eCBwYWwgJTA0eCwgZm9yY2U9JWkgXG4iLCAKIAkJCSAgICBoREMsIGhQYWwsIGJGb3JjZUJhY2tncm91bmQpOwogICAgIGlmKCAhbHB0ICkgcmV0dXJuIDA7CiAKLSAgICBkcHJpbnRmX3BhbGV0dGUoc3RkZGViLCIgZW50cmllcyA9ICVkXG4iLCAKKyAgICBkcHJpbnRmX2luZm8ocGFsZXR0ZSwiIGVudHJpZXMgPSAlZFxuIiwgCiAJCQkgICAgbHB0LT5sb2dwYWxldHRlLnBhbE51bUVudHJpZXMpOwogICAgIEdESV9IRUFQX1VOTE9DSyggaFBhbCApOwogCmRpZmYgLS1naXQgYS9vYmplY3RzL3Blbi5jIGIvb2JqZWN0cy9wZW4uYwppbmRleCBjYTNhMTkxLi5lMWY0NGE5IDEwMDY0NAotLS0gYS9vYmplY3RzL3Blbi5jCisrKyBiL29iamVjdHMvcGVuLmMKQEAgLTcsNyArNyw2IEBACiAjaW5jbHVkZSAicGVuLmgiCiAjaW5jbHVkZSAibWV0YWZpbGUuaCIKICNpbmNsdWRlICJjb2xvci5oIgotI2luY2x1ZGUgInN0ZGRlYnVnLmgiCiAjaW5jbHVkZSAiZGVidWcuaCIKIAogCkBAIC0xOCw3ICsxNyw3IEBACiBIUEVOMTYgV0lOQVBJIENyZWF0ZVBlbjE2KCBJTlQxNiBzdHlsZSwgSU5UMTYgd2lkdGgsIENPTE9SUkVGIGNvbG9yICkKIHsKICAgICBMT0dQRU4zMiBsb2dwZW4gPSB7IHN0eWxlLCB7IHdpZHRoLCAwIH0sIGNvbG9yIH07Ci0gICAgZHByaW50Zl9nZGkoc3RkZGViLCAiQ3JlYXRlUGVuMTY6ICVkICVkICUwNmx4XG4iLCBzdHlsZSwgd2lkdGgsIGNvbG9yICk7CisgICAgZHByaW50Zl9pbmZvKGdkaSwgIkNyZWF0ZVBlbjE2OiAlZCAlZCAlMDZseFxuIiwgc3R5bGUsIHdpZHRoLCBjb2xvciApOwogICAgIHJldHVybiBDcmVhdGVQZW5JbmRpcmVjdDMyKCAmbG9ncGVuICk7CiB9CiAKQEAgLTI5LDcgKzI4LDcgQEAKIEhQRU4zMiBXSU5BUEkgQ3JlYXRlUGVuMzIoIElOVDMyIHN0eWxlLCBJTlQzMiB3aWR0aCwgQ09MT1JSRUYgY29sb3IgKQogewogICAgIExPR1BFTjMyIGxvZ3BlbiA9IHsgc3R5bGUsIHsgd2lkdGgsIDAgfSwgY29sb3IgfTsKLSAgICBkcHJpbnRmX2dkaShzdGRkZWIsICJDcmVhdGVQZW4zMjogJWQgJWQgJTA2bHhcbiIsIHN0eWxlLCB3aWR0aCwgY29sb3IgKTsKKyAgICBkcHJpbnRmX2luZm8oZ2RpLCAiQ3JlYXRlUGVuMzI6ICVkICVkICUwNmx4XG4iLCBzdHlsZSwgd2lkdGgsIGNvbG9yICk7CiAgICAgcmV0dXJuIENyZWF0ZVBlbkluZGlyZWN0MzIoICZsb2dwZW4gKTsKIH0KIApkaWZmIC0tZ2l0IGEvb2JqZWN0cy9yZWdpb24uYyBiL29iamVjdHMvcmVnaW9uLmMKaW5kZXggZjNhZGVlNC4uZWY3OThkZCAxMDA2NDQKLS0tIGEvb2JqZWN0cy9yZWdpb24uYworKysgYi9vYmplY3RzL3JlZ2lvbi5jCkBAIC04Miw3ICs4Miw2IEBACiAKICNpbmNsdWRlIDxzdGRpby5oPgogI2luY2x1ZGUgInJlZ2lvbi5oIgotI2luY2x1ZGUgInN0ZGRlYnVnLmgiCiAjaW5jbHVkZSAiZGVidWcuaCIKICNpbmNsdWRlICJoZWFwLmgiCiAjaW5jbHVkZSAiZGMuaCIKQEAgLTEwNywxMSArMTA2LDExIEBACiB7CiAgICAgUkVDVDMyICpwUmVjdCwgKnBSZWN0RW5kID0gcFJlZy0+cmVjdHMgKyBwUmVnLT5udW1SZWN0czsKIAotICAgIGRwcmludGZfcmVnaW9uKHN0ZGRlYiwgIlJlZ2lvbiAlcDogJWQsJWQgLSAlZCwlZCAlZCByZWN0c1xuIiwgcFJlZywKKyAgICBkcHJpbnRmX2luZm8ocmVnaW9uLCAiUmVnaW9uICVwOiAlZCwlZCAtICVkLCVkICVkIHJlY3RzXG4iLCBwUmVnLAogCSAgICBwUmVnLT5leHRlbnRzLmxlZnQsIHBSZWctPmV4dGVudHMudG9wLAogCSAgICBwUmVnLT5leHRlbnRzLnJpZ2h0LCBwUmVnLT5leHRlbnRzLmJvdHRvbSwgcFJlZy0+bnVtUmVjdHMpOwogICAgIGZvcihwUmVjdCA9IHBSZWctPnJlY3RzOyBwUmVjdCA8IHBSZWN0RW5kOyBwUmVjdCsrKQotICAgICAgICBkcHJpbnRmX3JlZ2lvbihzdGRkZWIsICJcdCVkLCVkIC0gJWQsJWRcbiIsIHBSZWN0LT5sZWZ0LCBwUmVjdC0+dG9wLAorICAgICAgICBkcHJpbnRmX2luZm8ocmVnaW9uLCAiXHQlZCwlZCAtICVkLCVkXG4iLCBwUmVjdC0+bGVmdCwgcFJlY3QtPnRvcCwKIAkJICAgICAgIHBSZWN0LT5yaWdodCwgcFJlY3QtPmJvdHRvbSk7CiAgICAgcmV0dXJuOwogfQpAQCAtMTcxLDcgKzE3MCw3IEBACiAgKi8KIEJPT0wzMiBSRUdJT05fRGVsZXRlT2JqZWN0KCBIUkdOMzIgaHJnbiwgUkdOT0JKICogb2JqICkKIHsKLSAgICBkcHJpbnRmX3JlZ2lvbihzdGRkZWIsICJEZWxldGVSZWdpb246ICUwNHhcbiIsIGhyZ24gKTsKKyAgICBkcHJpbnRmX2luZm8ocmVnaW9uLCAiRGVsZXRlUmVnaW9uOiAlMDR4XG4iLCBocmduICk7CiAKICAgICBSRUdJT05fRGVzdHJveVdpbmVSZWdpb24oIG9iai0+cmduICk7CiAgICAgcmV0dXJuIEdESV9GcmVlT2JqZWN0KCBocmduICk7CkBAIC0xOTgsNyArMTk3LDcgQEAKIAlpbnQgbmJveCA9IG9iai0+cmduLT5udW1SZWN0czsKIAlSRUNUMzIgKnBib3ggPSBvYmotPnJnbi0+cmVjdHM7CiAJCi0JZHByaW50Zl9yZWdpb24oc3RkZGViLCAiT2Zmc2V0UmduOiAlMDR4ICVkLCVkXG4iLCBocmduLCB4LCB5ICk7CisJZHByaW50Zl9pbmZvKHJlZ2lvbiwgIk9mZnNldFJnbjogJTA0eCAlZCwlZFxuIiwgaHJnbiwgeCwgeSApOwogCWlmKG5ib3ggJiYgKHggfHwgeSkpIHsKIAkgICAgd2hpbGUobmJveC0tKSB7CiAJICAgICAgICBwYm94LT5sZWZ0ICs9IHg7CkBAIC0yNDAsNyArMjM5LDcgQEAKICAgICBpZiAob2JqKQogICAgIHsKIAlJTlQzMiByZXQ7Ci0JZHByaW50Zl9yZWdpb24oc3RkZGViLCAiR2V0UmduQm94OiAlMDR4XG4iLCBocmduICk7CisJZHByaW50Zl9pbmZvKHJlZ2lvbiwgIkdldFJnbkJveDogJTA0eFxuIiwgaHJnbiApOwogCXJlY3QtPmxlZnQgPSBvYmotPnJnbi0+ZXh0ZW50cy5sZWZ0OwogCXJlY3QtPnRvcCA9IG9iai0+cmduLT5leHRlbnRzLnRvcDsKIAlyZWN0LT5yaWdodCA9IG9iai0+cmduLT5leHRlbnRzLnJpZ2h0OwpAQCAtMjcxLDcgKzI3MCw3IEBACiAKICAgICBpZiAoIShocmduID0gUkVHSU9OX0NyZWF0ZVJlZ2lvbigpKSkKIAlyZXR1cm4gMDsKLSAgICBkcHJpbnRmX3JlZ2lvbihzdGRkZWIsICJDcmVhdGVSZWN0UmduOiAiKTsKKyAgICBkcHJpbnRmX2luZm8ocmVnaW9uLCAiQ3JlYXRlUmVjdFJnbjogXG4iKTsKICAgICBTZXRSZWN0UmduMzIoaHJnbiwgbGVmdCwgdG9wLCByaWdodCwgYm90dG9tKTsKICAgICByZXR1cm4gaHJnbjsKIH0KQEAgLTMxMiw3ICszMTEsNyBAQAogewogICAgIFJHTk9CSiAqIG9iajsKIAotICAgIGRwcmludGZfcmVnaW9uKHN0ZGRlYiwgIlNldFJlY3RSZ246ICUwNHggJWQsJWQtJWQsJWRcbiIsIAorICAgIGRwcmludGZfaW5mbyhyZWdpb24sICJTZXRSZWN0UmduOiAlMDR4ICVkLCVkLSVkLCVkXG4iLCAKIAkJICAgaHJnbiwgbGVmdCwgdG9wLCByaWdodCwgYm90dG9tICk7CiAgICAgCiAgICAgaWYgKCEob2JqID0gKFJHTk9CSiAqKSBHRElfR2V0T2JqUHRyKCBocmduLCBSRUdJT05fTUFHSUMgKSkpIHJldHVybjsKQEAgLTM2NSw3ICszNjQsNyBAQAogCiAgICAgaWYgKCEoaHJnbiA9IFJFR0lPTl9DcmVhdGVSZWdpb24oKSkpIHJldHVybiAwOwogICAgIG9iaiA9IChSR05PQkogKikgR0RJX0hFQVBfTE9DSyggaHJnbiApOwotICAgIGRwcmludGZfcmVnaW9uKHN0ZGRlYiwiQ3JlYXRlUm91bmRSZWN0UmduKCVkLCVkLSVkLCVkICVkeCVkKTogcmV0PSUwNHhcbiIsCisgICAgZHByaW50Zl9pbmZvKHJlZ2lvbiwiQ3JlYXRlUm91bmRSZWN0UmduKCVkLCVkLSVkLCVkICVkeCVkKTogcmV0PSUwNHhcbiIsCiAJICAgICAgIGxlZnQsIHRvcCwgcmlnaHQsIGJvdHRvbSwgZWxsaXBzZV93aWR0aCwgZWxsaXBzZV9oZWlnaHQsIGhyZ24gKTsKIAogICAgICAgLyogQ2hlY2sgcGFyYW1ldGVycyAqLwpAQCAtNDk2LDcgKzQ5NSw3IEBACiAgICAgRFdPUkQgc2l6ZTsKICAgICBSR05PQkogKm9iaiA9IChSR05PQkogKikgR0RJX0dldE9ialB0ciggaHJnbiwgUkVHSU9OX01BR0lDICk7CiAgICAgCi0gICAgZHByaW50Zl9yZWdpb24oc3RkZGViLCAiR2V0UmVnaW9uRGF0YTogJTA0eCBjb3VudCA9ICVsZCwgcmduZGF0YSA9ICVwXG4iLAorICAgIGRwcmludGZfaW5mbyhyZWdpb24sICJHZXRSZWdpb25EYXRhOiAlMDR4IGNvdW50ID0gJWxkLCByZ25kYXRhID0gJXBcbiIsCiAJCSAgIGhyZ24sIGNvdW50LCByZ25kYXRhKTsKIAogICAgIGlmKCFvYmopIHJldHVybiAwOwpAQCAtNTMzLDcgKzUzMiw3IEBACiAgICAgUkdOT0JKICpvYmogPSAoUkdOT0JKICopIEdESV9HZXRPYmpQdHIoIGhyZ24sIFJFR0lPTl9NQUdJQyApOwogICAgIFJFQ1QzMiAqcEN1clJlY3QsICpwRW5kUmVjdDsKIAotICAgIGRwcmludGZfcmVnaW9uKHN0ZGRlYiwgIkV4dENyZWF0ZVJlZ2lvbjogJXAgJWxkICVwLiBSZXR1cm5pbmcgJTA0eFxuIiwKKyAgICBkcHJpbnRmX2luZm8ocmVnaW9uLCAiRXh0Q3JlYXRlUmVnaW9uOiAlcCAlbGQgJXAuIFJldHVybmluZyAlMDR4XG4iLAogCQkgICBscFhmb3JtLCBkd0NvdW50LCByZ25kYXRhLCBocmduKTsKICAgICBpZighaHJnbikKICAgICB7CkBAIC03NzQsNyArNzczLDcgQEAKICAgICBEQyAqIGRjID0gRENfR2V0RENQdHIoIGhkYyApOwogICAgIFJFQ1QzMiB0bXBSZWN0OwogCi0gICAgZHByaW50Zl9yZWdpb24oIHN0ZGRlYiwgIlJFR0lPTl9MUFRPRFA6IGhkYz0lMDR4IGRlc3Q9JTA0eCBzcmM9JTA0eFxuIiwKKyAgICBkcHJpbnRmX2luZm8ocmVnaW9uLCAiUkVHSU9OX0xQVE9EUDogaGRjPSUwNHggZGVzdD0lMDR4IHNyYz0lMDR4XG4iLAogCQkgICAgaGRjLCBoRGVzdCwgaFNyYykgOwogICAgIAogICAgIGlmIChkYy0+dy5NYXBNb2RlID09IE1NX1RFWFQpIC8qIFJlcXVpcmVzIG9ubHkgYSB0cmFuc2xhdGlvbiAqLwpAQCAtODI5LDcgKzgyOCw3IEBACiAgICAgUkdOT0JKICpkZXN0T2JqID0gKFJHTk9CSiAqKSBHRElfR2V0T2JqUHRyKCBoRGVzdCwgUkVHSU9OX01BR0lDKTsKICAgICBJTlQzMiByZXN1bHQgPSBFUlJPUjsKIAotICAgIGRwcmludGZfcmVnaW9uKHN0ZGRlYiwgIkNvbWJpbmVSZ246ICUwNHgsJTA0eCAtPiAlMDR4IG1vZGU9JXhcbiIsIAorICAgIGRwcmludGZfaW5mbyhyZWdpb24sICJDb21iaW5lUmduOiAlMDR4LCUwNHggLT4gJTA0eCBtb2RlPSV4XG4iLCAKIAkJICAgaFNyYzEsIGhTcmMyLCBoRGVzdCwgbW9kZSApOwogICAgIGlmIChkZXN0T2JqKQogICAgIHsKQEAgLTgzNyw4ICs4MzYsOSBAQAogCiAJaWYgKHNyYzFPYmopCiAJewotCSAgICBkcHJpbnRmX3JlZ2lvbihzdGRkZWIsICJzcmMxOlxuIik7Ci0JICAgIGlmKGRlYnVnZ2luZ19yZWdpb24pIFJFR0lPTl9EdW1wUmVnaW9uKHNyYzFPYmotPnJnbik7CisJICAgIGRwcmludGZfaW5mbyhyZWdpb24sICJzcmMxOlxuIik7CisJICAgIGlmKGRlYnVnZ2luZ19pbmZvKHJlZ2lvbikpIAorCSAgICAgIFJFR0lPTl9EdW1wUmVnaW9uKHNyYzFPYmotPnJnbik7CiAJICAgIGlmIChtb2RlID09IFJHTl9DT1BZKQogCSAgICB7CiAJCVJFR0lPTl9Db3B5UmVnaW9uKCBkZXN0T2JqLT5yZ24sIHNyYzFPYmotPnJnbiApOwpAQCAtODUwLDggKzg1MCw5IEBACiAKIAkJaWYgKHNyYzJPYmopCiAJCXsKLQkJICAgIGRwcmludGZfcmVnaW9uKHN0ZGRlYiwgInNyYzI6XG4iKTsKLQkJICAgIGlmKGRlYnVnZ2luZ19yZWdpb24pIFJFR0lPTl9EdW1wUmVnaW9uKHNyYzJPYmotPnJnbik7CisJCSAgICBkcHJpbnRmX2luZm8ocmVnaW9uLCAic3JjMjpcbiIpOworCQkgICAgaWYoZGVidWdnaW5nX2luZm8ocmVnaW9uKSkgCisJCSAgICAgIFJFR0lPTl9EdW1wUmVnaW9uKHNyYzJPYmotPnJnbik7CiAJCSAgICBzd2l0Y2ggKG1vZGUpCiAJCSAgICB7CiAJCSAgICBjYXNlIFJHTl9BTkQ6CkBAIC04NzMsOCArODc0LDkgQEAKIAkgICAgfQogCSAgICBHRElfSEVBUF9VTkxPQ0soIGhTcmMxICk7CiAJfQotCWRwcmludGZfcmVnaW9uKHN0ZGRlYiwgImRlc3Q6XG4iKTsKLQlpZihkZWJ1Z2dpbmdfcmVnaW9uKSBSRUdJT05fRHVtcFJlZ2lvbihkZXN0T2JqLT5yZ24pOworCWRwcmludGZfaW5mbyhyZWdpb24sICJkZXN0OlxuIik7CisJaWYoZGVidWdnaW5nX2luZm8ocmVnaW9uKSkgCisJICBSRUdJT05fRHVtcFJlZ2lvbihkZXN0T2JqLT5yZ24pOwogCiAJR0RJX0hFQVBfVU5MT0NLKCBoRGVzdCApOwogICAgIH0KZGlmZiAtLWdpdCBhL29iamVjdHMvdGV4dC5jIGIvb2JqZWN0cy90ZXh0LmMKaW5kZXggNjBlYzEwYy4uODdjYWI2ZCAxMDA2NDQKLS0tIGEvb2JqZWN0cy90ZXh0LmMKKysrIGIvb2JqZWN0cy90ZXh0LmMKQEAgLTEwLDggKzEwLDYgQEAKICNpbmNsdWRlICJkYy5oIgogI2luY2x1ZGUgImdkaS5oIgogI2luY2x1ZGUgImhlYXAuaCIKLSNpbmNsdWRlICJzdGRkZWJ1Zy5oIgotLyogI2RlZmluZSBERUJVR19URVhUICovCiAjaW5jbHVkZSAiZGVidWcuaCIKICNpbmNsdWRlICJjYWNoZS5oIgogCkBAIC0yMDAsNyArMTk4LDcgQEAKICAgICBpbnQgd2lkdGggPSByZWN0LT5yaWdodCAtIHJlY3QtPmxlZnQ7CiAgICAgaW50IG1heF93aWR0aCA9IDA7CiAKLSAgICBkcHJpbnRmX3RleHQoc3RkZGViLCJEcmF3VGV4dDogJyVzJywgJWQgLCBbKCVkLCVkKSwoJWQsJWQpXVxuIiwgc3RyLAorICAgIGRwcmludGZfaW5mbyh0ZXh0LCJEcmF3VGV4dDogJyVzJywgJWQgLCBbKCVkLCVkKSwoJWQsJWQpXVxuIiwgc3RyLAogCQkgY291bnQsIHJlY3QtPmxlZnQsIHJlY3QtPnRvcCwgcmVjdC0+cmlnaHQsIHJlY3QtPmJvdHRvbSk7CiAgICAgCiAgICAgaWYgKGNvdW50ID09IC0xKSBjb3VudCA9IHN0cmxlbihzdHIpOwpAQCAtNjM4LDcgKzYzNiw3IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElOVDE2IGNvdW50LCBJTlQxNiBjVGFiU3RvcHMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IElOVDE2ICpscFRhYlBvcywgSU5UMTYgblRhYk9yZyApCiB7Ci0gICAgZHByaW50Zl90ZXh0KCBzdGRkZWIsICJUYWJiZWRUZXh0T3V0MTY6ICUwNHggJWQsJWQgJyUuKnMnICVkXG4iLAorICAgIGRwcmludGZfaW5mbyh0ZXh0LCAiVGFiYmVkVGV4dE91dDE2OiAlMDR4ICVkLCVkICclLipzJyAlZFxuIiwKICAgICAgICAgICAgICAgICAgIGhkYywgeCwgeSwgY291bnQsIGxwc3RyLCBjb3VudCApOwogICAgIHJldHVybiBURVhUX1RhYmJlZFRleHRPdXQoIGhkYywgeCwgeSwgbHBzdHIsIGNvdW50LCBjVGFiU3RvcHMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbHBUYWJQb3MsIE5VTEwsIG5UYWJPcmcsIFRSVUUgKTsKQEAgLTY1Miw3ICs2NTAsNyBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSU5UMzIgY291bnQsIElOVDMyIGNUYWJTdG9wcywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IElOVDMyICpscFRhYlBvcywgSU5UMzIgblRhYk9yZyApCiB7Ci0gICAgZHByaW50Zl90ZXh0KCBzdGRkZWIsICJUYWJiZWRUZXh0T3V0MzJBOiAlMDR4ICVkLCVkICclLipzJyAlZFxuIiwKKyAgICBkcHJpbnRmX2luZm8odGV4dCwgIlRhYmJlZFRleHRPdXQzMkE6ICUwNHggJWQsJWQgJyUuKnMnICVkXG4iLAogICAgICAgICAgICAgICAgICAgaGRjLCB4LCB5LCBjb3VudCwgbHBzdHIsIGNvdW50ICk7CiAgICAgcmV0dXJuIFRFWFRfVGFiYmVkVGV4dE91dCggaGRjLCB4LCB5LCBscHN0ciwgY291bnQsIGNUYWJTdG9wcywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOVUxMLCBscFRhYlBvcywgblRhYk9yZywgVFJVRSApOwpAQCAtNjgyLDcgKzY4MCw3IEBACiBEV09SRCBXSU5BUEkgR2V0VGFiYmVkVGV4dEV4dGVudDE2KCBIREMxNiBoZGMsIExQQ1NUUiBscHN0ciwgSU5UMTYgY291bnQsIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSU5UMTYgY1RhYlN0b3BzLCBjb25zdCBJTlQxNiAqbHBUYWJQb3MgKQogewotICAgIGRwcmludGZfdGV4dCggc3RkZGViLCAiR2V0VGFiYmVkVGV4dEV4dGVudDogJTA0eCAnJS4qcycgJWRcbiIsCisgICAgZHByaW50Zl9pbmZvKHRleHQsICJHZXRUYWJiZWRUZXh0RXh0ZW50OiAlMDR4ICclLipzJyAlZFxuIiwKICAgICAgICAgICAgICAgICAgIGhkYywgY291bnQsIGxwc3RyLCBjb3VudCApOwogICAgIHJldHVybiBURVhUX1RhYmJlZFRleHRPdXQoIGhkYywgMCwgMCwgbHBzdHIsIGNvdW50LCBjVGFiU3RvcHMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbHBUYWJQb3MsIE5VTEwsIDAsIEZBTFNFICk7CkBAIC02OTUsNyArNjkzLDcgQEAKIERXT1JEIFdJTkFQSSBHZXRUYWJiZWRUZXh0RXh0ZW50MzJBKCBIREMzMiBoZGMsIExQQ1NUUiBscHN0ciwgSU5UMzIgY291bnQsIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElOVDMyIGNUYWJTdG9wcywgY29uc3QgSU5UMzIgKmxwVGFiUG9zICkKIHsKLSAgICBkcHJpbnRmX3RleHQoIHN0ZGRlYiwgIkdldFRhYmJlZFRleHRFeHRlbnQ6ICUwNHggJyUuKnMnICVkXG4iLAorICAgIGRwcmludGZfaW5mbyh0ZXh0LCAiR2V0VGFiYmVkVGV4dEV4dGVudDogJTA0eCAnJS4qcycgJWRcbiIsCiAgICAgICAgICAgICAgICAgICBoZGMsIGNvdW50LCBscHN0ciwgY291bnQgKTsKICAgICByZXR1cm4gVEVYVF9UYWJiZWRUZXh0T3V0KCBoZGMsIDAsIDAsIGxwc3RyLCBjb3VudCwgY1RhYlN0b3BzLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5VTEwsIGxwVGFiUG9zLCAwLCBGQUxTRSApOwpkaWZmIC0tZ2l0IGEvb2xlL01ha2VmaWxlLmluIGIvb2xlL01ha2VmaWxlLmluCmluZGV4IDFkOTIzNzMzLi44NWU5ODFhIDEwMDY0NAotLS0gYS9vbGUvTWFrZWZpbGUuaW4KKysrIGIvb2xlL01ha2VmaWxlLmluCkBAIC0xMyw3ICsxMyw4IEBACiAJb2xlMmRpc3AuYyBcCiAJb2xlMm5scy5jIFwKIAlvbGVjbGkuYyBcCi0Jb2xlc3ZyLmMKKwlvbGVzdnIuYyBcCisJc3RvcmFnZS5jCiAKIGFsbDogJChNT0RVTEUpLm8KIApkaWZmIC0tZ2l0IGEvb2xlL2NvbXBvYmouYyBiL29sZS9jb21wb2JqLmMKaW5kZXggZWY0NzZhOS4uMDQ4NGY3OCAxMDA2NDQKLS0tIGEvb2xlL2NvbXBvYmouYworKysgYi9vbGUvY29tcG9iai5jCkBAIC0xMiwxMCArMTIsMTIgQEAKICNpbmNsdWRlIDx0aW1lLmg+CiAjaW5jbHVkZSAib2xlLmgiCiAjaW5jbHVkZSAib2xlMi5oIgotI2luY2x1ZGUgInN0ZGRlYnVnLmgiCisjaW5jbHVkZSAid2luZXJyb3IuaCIKICNpbmNsdWRlICJkZWJ1Zy5oIgogI2luY2x1ZGUgImZpbGUuaCIKICNpbmNsdWRlICJjb21wb2JqLmgiCisjaW5jbHVkZSAiaGVhcC5oIgorI2luY2x1ZGUgImxkdC5oIgogI2luY2x1ZGUgImludGVyZmFjZXMuaCIKICNpbmNsdWRlICJzaGxvYmouaCIKICNpbmNsdWRlICJkZHJhdy5oIgpAQCAtMjMsMjcgKzI1LDM2IEBACiAjaW5jbHVkZSAiZGlucHV0LmgiCiAjaW5jbHVkZSAiZDNkLmgiCiAKLURXT1JEIGN1cnJlbnRNYWxsb2M9MDsKK0xQTUFMTE9DMTYgY3VycmVudE1hbGxvYzE2PU5VTEw7CitMUE1BTExPQzMyIGN1cnJlbnRNYWxsb2MzMj1OVUxMOwogCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICAqICAgICAgICAgICBDb0J1aWxkVmVyc2lvbiBbQ09NUE9CSi4xXQogICovCiBEV09SRCBXSU5BUEkgQ29CdWlsZFZlcnNpb24oKQogewotCWRwcmludGZfb2xlKHN0ZGRlYiwiQ29CdWlsZFZlcnNpb24oKVxuIik7Ci0JcmV0dXJuIChybW08PDE2KStydXA7CisgICAgZHByaW50Zl9pbmZvKG9sZSwiQ29CdWlsZFZlcnNpb24oKVxuIik7CisgICAgcmV0dXJuIChybW08PDE2KStydXA7CiB9CiAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogICogICAgICAgICAgIENvSW5pdGlhbGl6ZQlbQ09NUE9CSi4yXQotICogbHBSZXNlcnZlZCBpcyBhbiBJTWFsbG9jIHBvaW50ZXIgaW4gMTZiaXQgT0xFLiBXZSBqdXN0IHN0b3JlZCBpdCBhcy1pcy4KKyAqIGxwUmVzZXJ2ZWQgaXMgYW4gSU1hbGxvYyBwb2ludGVyIGluIDE2Yml0IE9MRS4KICAqLwotSFJFU1VMVCBXSU5BUEkgQ29Jbml0aWFsaXplKERXT1JEIGxwUmVzZXJ2ZWQpCitIUkVTVUxUIFdJTkFQSSBDb0luaXRpYWxpemUxNihMUE1BTExPQzE2IGxwUmVzZXJ2ZWQpCiB7Ci0JZHByaW50Zl9vbGUoc3RkbmltcCwiQ29Jbml0aWFsaXplXG4iKTsKLQkvKiByZW1lbWJlciB0aGUgTFBNQUxMT0MsIG1heWJlIHNvbWVib2R5IHdhbnRzIHRvIHJlYWQgaXQgbGF0ZXIgb24gKi8KLQljdXJyZW50TWFsbG9jID0gbHBSZXNlcnZlZDsKLQlyZXR1cm4gU19PSzsKKyAgICBjdXJyZW50TWFsbG9jMTYgPSBscFJlc2VydmVkOworICAgIHJldHVybiBTX09LOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqICAgICAgICAgICBDb0luaXRpYWxpemUJKE9MRTMyLjI2KQorICogbHBSZXNlcnZlZCBpcyBhbiBJTWFsbG9jIHBvaW50ZXIgaW4gMzJiaXQgT0xFLgorICovCitIUkVTVUxUIFdJTkFQSSBDb0luaXRpYWxpemUzMihMUE1BTExPQzMyIGxwUmVzZXJ2ZWQpCit7CisgICAgY3VycmVudE1hbGxvYzMyID0gbHBSZXNlcnZlZDsKKyAgICByZXR1cm4gU19PSzsKIH0KIAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCkBAIC01MSwyMiArNjIsMjkgQEAKICAqLwogdm9pZCBXSU5BUEkgQ29Vbml0aWFsaXplKCkKIHsKLQlkcHJpbnRmX29sZShzdGRuaW1wLCJDb1VuaXRpYWxpemUoKVxuIik7CisgICAgZHByaW50Zl9pbmZvKG9sZSwiQ29Vbml0aWFsaXplKClcbiIpOwogfQogCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICAqICAgICAgICAgICBDb0dldE1hbGxvYyAgICBbQ09NUE9CSi40XQogICovCi1IUkVTVUxUIFdJTkFQSSBDb0dldE1hbGxvYyhEV09SRCBkd01lbUNvbnRleHQsIERXT1JEICogbHBNYWxsb2MpCitIUkVTVUxUIFdJTkFQSSBDb0dldE1hbGxvYzE2KERXT1JEIGR3TWVtQ29udGV4dCwgTFBNQUxMT0MxNiAqIGxwTWFsbG9jKQogewotCWlmKGN1cnJlbnRNYWxsb2MpCi0JewotCQkqbHBNYWxsb2MgPSBjdXJyZW50TWFsbG9jOwotCQlyZXR1cm4gU19PSzsKLQl9Ci0JKmxwTWFsbG9jID0gMDsKLQkvKiAxNi1iaXQgRV9OT1RJTVBMICovCi0JcmV0dXJuIDB4ODAwMDAwMDFMOworICAgIGlmKCFjdXJyZW50TWFsbG9jMTYpCisJY3VycmVudE1hbGxvYzE2ID0gSU1hbGxvYzE2X0NvbnN0cnVjdG9yKCk7CisgICAgKmxwTWFsbG9jID0gY3VycmVudE1hbGxvYzE2OworICAgIHJldHVybiBTX09LOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqICAgICAgICAgICBDb0dldE1hbGxvYyAgICAoT0xFMzIuNF0KKyAqLworSFJFU1VMVCBXSU5BUEkgQ29HZXRNYWxsb2MzMihEV09SRCBkd01lbUNvbnRleHQsIExQTUFMTE9DMzIgKmxwTWFsbG9jKQoreworICAgIGlmKCFjdXJyZW50TWFsbG9jMzIpCisJY3VycmVudE1hbGxvYzMyID0gSU1hbGxvYzMyX0NvbnN0cnVjdG9yKCk7CisgICAgKmxwTWFsbG9jID0gY3VycmVudE1hbGxvYzMyOworICAgIHJldHVybiBTX09LOwogfQogCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKQEAgLTc0LDggKzkyLDggQEAKICAqLwogT0xFU1RBVFVTIFdJTkFQSSBDb0Rpc2Nvbm5lY3RPYmplY3QoIExQVU5LTk9XTiBscFVuaywgRFdPUkQgcmVzZXJ2ZWQgKQogewotICAgIGRwcmludGZfb2xlKHN0ZG5pbXAsIkNvRGlzY29ubmVjdE9iamVjdDolcCAlbHhcbiIsbHBVbmsscmVzZXJ2ZWQpOwotICAgIHJldHVybiBPTEVfT0s7CisgICAgZHByaW50Zl9pbmZvKG9sZSwiQ29EaXNjb25uZWN0T2JqZWN0OiVwICVseFxuIixscFVuayxyZXNlcnZlZCk7CisgICAgcmV0dXJuIFNfT0s7CiB9CiAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgpAQCAtOTIsMTQgKzExMCwxNCBAQAogCiAvKiBDbGFzcyBpZDogRFdPUkQtV09SRC1XT1JELUJZVEVTWzJdLUJZVEVTWzZdICovCiAKLU9MRVNUQVRVUyBXSU5BUEkgQ0xTSURGcm9tU3RyaW5nKGNvbnN0IExQQ1NUUiBpZHN0ciwgQ0xTSUQgKmlkKQorT0xFU1RBVFVTIFdJTkFQSSBDTFNJREZyb21TdHJpbmcxNihjb25zdCBMUENPTEVTVFIxNiBpZHN0ciwgQ0xTSUQgKmlkKQogewogICBCWVRFICpzID0gKEJZVEUgKikgaWRzdHI7CiAgIEJZVEUgKnA7CiAgIGludAlpOwogICBCWVRFIHRhYmxlWzI1Nl07CiAKLSAgZHByaW50Zl9vbGUoc3RkZGViLCJDbHNJREZyb21TdHJpbmcoKSAlcyAtPiAlcFxuIiwgaWRzdHIsIGlkKTsKKyAgZHByaW50Zl9pbmZvKG9sZSwiQ2xzSURGcm9tU3RyaW5nKCkgJXMgLT4gJXBcbiIsIGlkc3RyLCBpZCk7CiAKICAgLyogcXVpY2sgbG9va3VwIHRhYmxlICovCiAgIG1lbXNldCh0YWJsZSwgMCwgMjU2KTsKQEAgLTE1MywxMyArMTcxLDI1IEBACiAgICAgcyArPSAyOwogICB9CiAKLSAgcmV0dXJuIE9MRV9PSzsKKyAgcmV0dXJuIFNfT0s7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogICAgICAgICAgIENMU0lERnJvbVN0cmluZyAoT0xFMzIuMykKKyAqLworT0xFU1RBVFVTIFdJTkFQSSBDTFNJREZyb21TdHJpbmczMihjb25zdCBMUENPTEVTVFIzMiBpZHN0ciwgQ0xTSUQgKmlkKQoreworICAgIExQT0xFU1RSMTYgICAgICB4aWQgPSBIRUFQX3N0cmR1cFd0b0EoR2V0UHJvY2Vzc0hlYXAoKSwwLGlkc3RyKTsKKyAgICBPTEVTVEFUVVMgICAgICAgcmV0ID0gQ0xTSURGcm9tU3RyaW5nMTYoeGlkLGlkKTsKKworICAgIEhlYXBGcmVlKEdldFByb2Nlc3NIZWFwKCksMCx4aWQpOworICAgIHJldHVybiByZXQ7CiB9CiAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogICogICAgICAgICAgIFN0cmluZ0Zyb21DTFNJRCBbQ09NUE9CSi4xOV0KICAqLwotT0xFU1RBVFVTIFdJTkFQSSBTdHJpbmdGcm9tQ0xTSUQoY29uc3QgQ0xTSUQgKmlkLCBMUFNUUiBpZHN0cikKK09MRVNUQVRVUyBXSU5BUEkgV0lORV9TdHJpbmdGcm9tQ0xTSUQoY29uc3QgQ0xTSUQgKmlkLCBMUFNUUiBpZHN0cikKIHsKICAgc3RhdGljIGNvbnN0IGNoYXIgKmhleCA9ICIwMTIzNDU2Nzg5QUJDREVGIjsKICAgY2hhciAqczsKQEAgLTE4MywxNiArMjEzLDY0IEBACiAgICAgaWRzdHJbaV0gPSB0b3VwcGVyKGlkc3RyW2ldKTsKICAgfQogCi0gIGRwcmludGZfb2xlKHN0ZGRlYiwiU3RyaW5nRnJvbUNsc0lEOiAlcC0+JXNcbiIsIGlkLCBpZHN0cik7CisgIGRwcmludGZfaW5mbyhvbGUsIlN0cmluZ0Zyb21DbHNJRDogJXAtPiVzXG4iLCBpZCwgaWRzdHIpOwogCiAgIHJldHVybiBPTEVfT0s7CiB9CiAKK09MRVNUQVRVUyBXSU5BUEkgU3RyaW5nRnJvbUNMU0lEMTYoY29uc3QgQ0xTSUQgKmlkLCBMUE9MRVNUUjE2ICppZHN0cikKK3sKKyAgICBMUE1BTExPQzE2CW1sbGM7CisgICAgT0xFU1RBVFVTCXJldDsKKyAgICBEV09SRAlhcmdzWzJdOworCisgICAgcmV0ID0gQ29HZXRNYWxsb2MxNigwLCZtbGxjKTsKKyAgICBpZiAocmV0KSByZXR1cm4gcmV0OworCisgICAgYXJnc1swXSA9IChEV09SRCltbGxjOworICAgIGFyZ3NbMV0gPSA0MDsKKworICAgIC8qIE5vIG5lZWQgZm9yIGEgQ2FsbGJhY2sgZW50cnksIHdlIGhhdmUgV09XQ2FsbGJhY2sxNkV4IHdoaWNoIGRvZXMKKyAgICAgKiBldmVyeXRoaW5nIHdlIG5lZWQuCisgICAgICovCisgICAgaWYgKCFXT1dDYWxsYmFjazE2RXgoCisgICAgCShGQVJQUk9DMTYpKChMUE1BTExPQzE2X1ZUQUJMRSlQVFJfU0VHX1RPX0xJTigKKwkJKChMUE1BTExPQzE2KVBUUl9TRUdfVE9fTElOKG1sbGMpKS0+bHB2dGJsKQorCSktPmZuQWxsb2MsCisJV0NCMTZfQ0RFQ0wsCisJMiwKKwkoTFBWT0lEKWFyZ3MsCisJKExQRFdPUkQpaWRzdHIKKyAgICApKSB7CisgICAgCWZwcmludGYoc3RkZXJyLCJDYWxsVG8xNiBJTWFsbG9jMTYgZmFpbGVkXG4iKTsKKyAgICAJcmV0dXJuIEVfRkFJTDsKKyAgICB9CisgICAgcmV0dXJuIFdJTkVfU3RyaW5nRnJvbUNMU0lEKGlkLFBUUl9TRUdfVE9fTElOKCppZHN0cikpOworfQorCitPTEVTVEFUVVMgV0lOQVBJIFN0cmluZ0Zyb21DTFNJRDMyKGNvbnN0IENMU0lEICppZCwgTFBPTEVTVFIzMiAqaWRzdHIpCit7CisJY2hhciAgICAgICAgICAgIGJ1Zls4MF07CisJT0xFU1RBVFVTICAgICAgIHJldDsKKwlMUE1BTExPQzMyCW1sbGM7CisKKwlpZiAoKHJldD1Db0dldE1hbGxvYzMyKDAsJm1sbGMpKSkKKwkJcmV0dXJuIHJldDsKKworCXJldD1XSU5FX1N0cmluZ0Zyb21DTFNJRChpZCxidWYpOworCWlmICghcmV0KSB7CisJCSppZHN0ciA9IG1sbGMtPmxwdnRibC0+Zm5BbGxvYyhtbGxjLHN0cmxlbihidWYpKjIrMik7CisJCWxzdHJjcHlBdG9XKCppZHN0cixidWYpOworCX0KKwlyZXR1cm4gcmV0OworfQorCisKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogICogICAgICAgICAgIENMU0lERnJvbVByb2dJRCBbQ09NUE9CSi42MV0KICAqLwogCi1PTEVTVEFUVVMgV0lOQVBJIENMU0lERnJvbVByb2dJRChMUENTVFIgcHJvZ2lkLExQQ0xTSUQgcmlpZCkKK09MRVNUQVRVUyBXSU5BUEkgQ0xTSURGcm9tUHJvZ0lEMTYoTFBDU1RSIHByb2dpZCxMUENMU0lEIHJpaWQpCiB7CiAJY2hhcgkqYnVmLGJ1ZjJbODBdOwogCURXT1JECWJ1ZjJsZW47CkBAIC0yMTIsNyArMjkwLDE5IEBACiAJCXJldHVybiBPTEVfRVJST1JfR0VORVJJQzsKIAl9CiAJUmVnQ2xvc2VLZXkoeGhrZXkpOwotCXJldHVybiBDTFNJREZyb21TdHJpbmcoYnVmMixyaWlkKTsKKwlyZXR1cm4gQ0xTSURGcm9tU3RyaW5nMTYoYnVmMixyaWlkKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiAgICAgICAgICAgQ0xTSURGcm9tUHJvZ0lEIChPTEUzMi4yKQorICovCitPTEVTVEFUVVMgV0lOQVBJIENMU0lERnJvbVByb2dJRDMyKExQQ09MRVNUUjMyIHByb2dpZCxMUENMU0lEIHJpaWQpCit7CisJTFBPTEVTVFIxNiBwaWQgPSBIRUFQX3N0cmR1cFd0b0EoR2V0UHJvY2Vzc0hlYXAoKSwwLHByb2dpZCk7CisJT0xFU1RBVFVTICAgICAgIHJldCA9IENMU0lERnJvbVByb2dJRDE2KHBpZCxyaWlkKTsKKworCUhlYXBGcmVlKEdldFByb2Nlc3NIZWFwKCksMCxwaWQpOworCXJldHVybiByZXQ7CiB9CiAKIE9MRVNUQVRVUyBXSU5BUEkgTG9va3VwRVRhc2soTFBWT0lEIHAxLExQVk9JRCBwMikgewpAQCAtMjI4LDEzICszMTgsMTMgQEAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogICoJCUNvUmVnaXN0ZXJDbGFzc09iamVjdCBbQ09NUE9CSi41XQogICovCi1PTEVTVEFUVVMgV0lOQVBJIENvUmVnaXN0ZXJDbGFzc09iamVjdCgKK09MRVNUQVRVUyBXSU5BUEkgQ29SZWdpc3RlckNsYXNzT2JqZWN0MTYoCiAJUkVGQ0xTSUQgcmNsc2lkLCBMUFVOS05PV04gcFVuayxEV09SRCBkd0Nsc0NvbnRleHQsRFdPUkQgZmxhZ3MsCiAJTFBEV09SRCBscGR3UmVnaXN0ZXIKICkgewogCWNoYXIJYnVmWzgwXTsKIAotCVN0cmluZ0Zyb21DTFNJRChyY2xzaWQsYnVmKTsKKwlXSU5FX1N0cmluZ0Zyb21DTFNJRChyY2xzaWQsYnVmKTsKIAogCWZwcmludGYoc3RkZXJyLCJDb1JlZ2lzdGVyQ2xhc3NPYmplY3QoJXMsJXAsMHglMDhseCwweCUwOGx4LCVwKSxzdHViXG4iLAogCQlidWYscFVuayxkd0Nsc0NvbnRleHQsZmxhZ3MsbHBkd1JlZ2lzdGVyCkBAIC0yNDMsNyArMzMzLDI0IEBACiB9CiAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoJCUNvUmVnaXN0ZXJDbGFzc09iamVjdCBbQ09NUE9CSi4yN10KKyAqCQlDb1JlZ2lzdGVyQ2xhc3NPYmplY3QgKE9MRTMyLjM2KQorICovCitPTEVTVEFUVVMgV0lOQVBJIENvUmVnaXN0ZXJDbGFzc09iamVjdDMyKAorCVJFRkNMU0lEIHJjbHNpZCwgTFBVTktOT1dOIHBVbmssRFdPUkQgZHdDbHNDb250ZXh0LERXT1JEIGZsYWdzLAorCUxQRFdPUkQgbHBkd1JlZ2lzdGVyCispIHsKKyAgICBjaGFyIGJ1Zls4MF07CisKKyAgICBXSU5FX1N0cmluZ0Zyb21DTFNJRChyY2xzaWQsYnVmKTsKKworICAgIGZwcmludGYoc3RkZXJyLCJDb1JlZ2lzdGVyQ2xhc3NPYmplY3QoJXMsJXAsMHglMDhseCwweCUwOGx4LCVwKSxzdHViXG4iLAorCSAgICBidWYscFVuayxkd0Nsc0NvbnRleHQsZmxhZ3MsbHBkd1JlZ2lzdGVyCisgICAgKTsKKyAgICByZXR1cm4gMDsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgkJQ29SZWdpc3Rlck1lc3NhZ2VGaWx0ZXIgW0NPTVBPQkouMjddCiAgKi8KIE9MRVNUQVRVUyBXSU5BUEkgQ29SZWdpc3Rlck1lc3NhZ2VGaWx0ZXIxNigKIAlMUE1FU1NBR0VGSUxURVIgbHBNZXNzYWdlRmlsdGVyLExQTUVTU0FHRUZJTFRFUiAqbHBscE1lc3NhZ2VGaWx0ZXIKQEAgLTI4MywzICszOTAsMzQgQEAKIAlET1NGU19Vbml4VGltZVRvRmlsZVRpbWUodGltZShOVUxMKSwgbHBGaWxlVGltZSwgMCk7CiAJcmV0dXJuIFNfT0s7CiB9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogICAgICAgICAgIENvVGFza01lbUFsbG9jIChPTEUzMi40MykKKyAqLworTFBWT0lEIFdJTkFQSSBDb1Rhc2tNZW1BbGxvYyhVTE9ORyBzaXplKSB7CisgICAgTFBNQUxMT0MzMglscG1hbGxvYzsKKyAgICBIUkVTVUxUCXJldCA9IENvR2V0TWFsbG9jMzIoMCwmbHBtYWxsb2MpOworCisgICAgaWYgKHJldCkgCisJcmV0dXJuIE5VTEw7CisgICAgcmV0dXJuIGxwbWFsbG9jLT5scHZ0YmwtPmZuQWxsb2MobHBtYWxsb2Msc2l6ZSk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogICAgICAgICAgIENvVGFza01lbUZyZWUgKE9MRTMyLjQ0KQorICovCitWT0lEIFdJTkFQSSBDb1Rhc2tNZW1GcmVlKExQVk9JRCBwdHIpIHsKKyAgICBMUE1BTExPQzMyCWxwbWFsbG9jOworICAgIEhSRVNVTFQJcmV0ID0gQ29HZXRNYWxsb2MzMigwLCZscG1hbGxvYyk7CisKKyAgICBpZiAocmV0KSByZXR1cm47CisgICAgcmV0dXJuIGxwbWFsbG9jLT5scHZ0YmwtPmZuRnJlZShscG1hbGxvYyxwdHIpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqICAgICAgICAgICBDb0luaXRpYWxpemVXT1cgKE9MRTMyLjI3KQorICovCitIUkVTVUxUIFdJTkFQSSBDb0luaXRpYWxpemVXT1coRFdPUkQgeCxEV09SRCB5KSB7CisgICAgZnByaW50ZihzdGRlcnIsIkNvSW5pdGlhbGl6ZVdPVygweCUwOGx4LDB4JTA4bHgpLHN0dWIhXG4iLHgseSk7CisgICAgcmV0dXJuIDA7Cit9CmRpZmYgLS1naXQgYS9vbGUvZm9sZGVycy5jIGIvb2xlL2ZvbGRlcnMuYwppbmRleCA0NWQ1NDY2Li43OTAzZTg5IDEwMDY0NAotLS0gYS9vbGUvZm9sZGVycy5jCisrKyBiL29sZS9mb2xkZXJzLmMKQEAgLTksNyArOSw2IEBACiAjaW5jbHVkZSA8c3RyaW5nLmg+CiAjaW5jbHVkZSAib2xlLmgiCiAjaW5jbHVkZSAib2xlMi5oIgotI2luY2x1ZGUgInN0ZGRlYnVnLmgiCiAjaW5jbHVkZSAiZGVidWcuaCIKICNpbmNsdWRlICJjb21wb2JqLmgiCiAjaW5jbHVkZSAiaW50ZXJmYWNlcy5oIgpAQCAtOTUsNyArOTQsNyBAQAogKSB7CiAJY2hhcgl4Y2xzaWRbNTBdOwogCi0JU3RyaW5nRnJvbUNMU0lEKHJpaWQseGNsc2lkKTsKKwlXSU5FX1N0cmluZ0Zyb21DTFNJRChyaWlkLHhjbHNpZCk7CiAJZnByaW50ZihzdGRlcnIsIklTaGVsbEZvbGRlciglcCktPkJpbmRUb09iamVjdCglcCwlcCwlcywlcCksc3R1YiFcbiIsCiAJCXRoaXMscGlkbCxwYmNSZXNlcnZlZCx4Y2xzaWQscHB2T3V0CiAJKTsKQEAgLTEwNSwxMCArMTA0LDEwIEBACiAKIHN0YXRpYyBIUkVTVUxUIFdJTkFQSSBJU2hlbGxGb2xkZXJfUGFyc2VEaXNwbGF5TmFtZSgKIAlMUFNIRUxMRk9MREVSIHRoaXMsSFdORDMyIGh3bmRPd25lcixMUEJDIHBiY1Jlc2VydmVkLAotCUxQT0xFU1RSIGxwc3pEaXNwbGF5TmFtZSxEV09SRCAqcGNoRWF0ZW4sTFBJVEVNSURMSVNUICpwcGlkbCwKKwlMUE9MRVNUUjMyIGxwc3pEaXNwbGF5TmFtZSxEV09SRCAqcGNoRWF0ZW4sTFBJVEVNSURMSVNUICpwcGlkbCwKIAlEV09SRCAqcGR3QXR0cmlidXRlcwogKSB7Ci0JZnByaW50ZihzdGRlcnIsIklTaGVsbEZvbGRlciglcCktPlBhcnNlRGlzcGxheU5hbWUoJTA4eCwlcCwlcywlcCwlcCwlcCksc3R1YiFcbiIsCisJZnByaW50ZihzdGRlcnIsIklTaGVsbEZvbGRlciglcCktPlBhcnNlRGlzcGxheU5hbWUoJTA4eCwlcCwlcCwlcCwlcCwlcCksc3R1YiFcbiIsCiAJCXRoaXMsaHduZE93bmVyLHBiY1Jlc2VydmVkLGxwc3pEaXNwbGF5TmFtZSxwY2hFYXRlbixwcGlkbCxwZHdBdHRyaWJ1dGVzCiAJKTsKIAkqKERXT1JEKilwYmNSZXNlcnZlZCA9IDA7CkBAIC0xMzEsNyArMTMwLDcgQEAKICkgewogCWNoYXIJeGNsc2lkWzUwXTsKIAotCVN0cmluZ0Zyb21DTFNJRChyaWlkLHhjbHNpZCk7CisJV0lORV9TdHJpbmdGcm9tQ0xTSUQocmlpZCx4Y2xzaWQpOwogCWZwcmludGYoc3RkZXJyLCJJU2hlbGxGb2xkZXIoJXApLT5DcmVhdGVWaWV3T2JqZWN0KDB4JTA0eCwlcywlcCksc3R1YiFcbiIsCiAJCXRoaXMsaHduZE93bmVyLHhjbHNpZCxwcHYKIAkpOwpkaWZmIC0tZ2l0IGEvb2xlL2lmcy5jIGIvb2xlL2lmcy5jCmluZGV4IDk1OGEwYWUuLjhlNjE0N2IgMTAwNjQ0Ci0tLSBhL29sZS9pZnMuYworKysgYi9vbGUvaWZzLmMKQEAgLTcsMjEgKzcsMjggQEAKICNpbmNsdWRlIDxjdHlwZS5oPgogI2luY2x1ZGUgPHN0ZGxpYi5oPgogI2luY2x1ZGUgPHN0cmluZy5oPgorI2luY2x1ZGUgPGFzc2VydC5oPgogI2luY2x1ZGUgIndpbmVycm9yLmgiCiAjaW5jbHVkZSAib2xlLmgiCiAjaW5jbHVkZSAib2xlMi5oIgorI2luY2x1ZGUgImxkdC5oIgorI2luY2x1ZGUgImhlYXAuaCIKICNpbmNsdWRlICJjb21wb2JqLmgiCiAjaW5jbHVkZSAiaW50ZXJmYWNlcy5oIgogI2luY2x1ZGUgInNobG9iai5oIgotI2luY2x1ZGUgInN0ZGRlYnVnLmgiCisjaW5jbHVkZSAibG9jYWwuaCIKKyNpbmNsdWRlICJtb2R1bGUuaCIKICNpbmNsdWRlICJkZWJ1Zy5oIgogCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogSVVua25vd24KKyAqLwogc3RhdGljIFVMT05HIFdJTkFQSSBJVW5rbm93bl9BZGRSZWYoTFBVTktOT1dOIHRoaXMpIHsgCi0JZHByaW50Zl9yZWxheShzdGRkZWIsIklVbmtub3duKCVwKS0+QWRkUmVmKClcbiIsdGhpcyk7CisJZHByaW50Zl9pbmZvKHJlbGF5LCJJVW5rbm93biglcCktPkFkZFJlZigpXG4iLHRoaXMpOwogCXJldHVybiArKyh0aGlzLT5yZWYpOwogfQogc3RhdGljIFVMT05HIFdJTkFQSSBJVW5rbm93bl9SZWxlYXNlKExQVU5LTk9XTiB0aGlzKSB7Ci0JZHByaW50Zl9yZWxheShzdGRkZWIsIklVbmtub3duKCVwKS0+UmVsZWFzZSgpXG4iLHRoaXMpOworCWRwcmludGZfaW5mbyhyZWxheSwiSVVua25vd24oJXApLT5SZWxlYXNlKClcbiIsdGhpcyk7CiAJaWYgKCEtLSh0aGlzLT5yZWYpKSB7CiAJCUhlYXBGcmVlKEdldFByb2Nlc3NIZWFwKCksMCx0aGlzKTsKIAkJcmV0dXJuIDA7CkBAIC0zMiw4ICszOSw4IEBACiBzdGF0aWMgSFJFU1VMVCBXSU5BUEkgSVVua25vd25fUXVlcnlJbnRlcmZhY2UoTFBVTktOT1dOIHRoaXMsUkVGSUlEIHJlZmlpZCxMUFZPSUQgKm9iaikgewogCWNoYXIJeHJlZmlpZFs1MF07CiAKLQlTdHJpbmdGcm9tQ0xTSUQoKExQQ0xTSUQpcmVmaWlkLHhyZWZpaWQpOwotCWRwcmludGZfcmVsYXkoc3RkZGViLCJJVW5rbm93biglcCktPlF1ZXJ5SW50ZXJmYWNlKCVzLCVwKVxuIix0aGlzLHhyZWZpaWQsb2JqKTsKKwlXSU5FX1N0cmluZ0Zyb21DTFNJRCgoTFBDTFNJRClyZWZpaWQseHJlZmlpZCk7CisJZHByaW50Zl9pbmZvKHJlbGF5LCJJVW5rbm93biglcCktPlF1ZXJ5SW50ZXJmYWNlKCVzLCVwKVxuIix0aGlzLHhyZWZpaWQsb2JqKTsKIAogCWlmICghbWVtY21wKCZJSURfSVVua25vd24scmVmaWlkLHNpemVvZihJSURfSVVua25vd24pKSkgewogCQkqb2JqID0gdGhpczsKQEAgLTUzLDI4ICs2MCwzMCBAQAogSVVua25vd25fQ29uc3RydWN0b3IoKSB7CiAJTFBVTktOT1dOCXVuazsKIAotCWZwcmludGYoc3RkZXJyLCJjbG9uaW5nIElVbmtub3duLlxuIik7CiAJdW5rID0gKExQVU5LTk9XTilIZWFwQWxsb2MoR2V0UHJvY2Vzc0hlYXAoKSwwLHNpemVvZihJVW5rbm93bikpOwogCXVuay0+bHB2dGJsCT0gJnV2dDsKIAl1bmstPnJlZgk9IDE7CiAJcmV0dXJuIHVuazsKIH0KIAotc3RhdGljIFVMT05HIFdJTkFQSSBJTWFsbG9jX0FkZFJlZihMUE1BTExPQyB0aGlzKSB7Ci0JZHByaW50Zl9yZWxheShzdGRkZWIsIklNYWxsb2MoJXApLT5BZGRSZWYoKVxuIix0aGlzKTsKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBJTWFsbG9jMTYKKyAqLworVUxPTkcgV0lOQVBJIElNYWxsb2MxNl9BZGRSZWYoTFBNQUxMT0MxNiB0aGlzKSB7CisJZHByaW50Zl9pbmZvKHJlbGF5LCJJTWFsbG9jMTYoJXApLT5BZGRSZWYoKVxuIix0aGlzKTsKIAlyZXR1cm4gMTsgLyogY2Fubm90IGJlIGZyZWVkICovCiB9CiAKLXN0YXRpYyBVTE9ORyBXSU5BUEkgSU1hbGxvY19SZWxlYXNlKExQTUFMTE9DIHRoaXMpIHsKLQlkcHJpbnRmX3JlbGF5KHN0ZGRlYiwiSU1hbGxvYyglcCktPlJlbGVhc2UoKVxuIix0aGlzKTsKK1VMT05HIFdJTkFQSSBJTWFsbG9jMTZfUmVsZWFzZShMUE1BTExPQzE2IHRoaXMpIHsKKwlkcHJpbnRmX2luZm8ocmVsYXksIklNYWxsb2MxNiglcCktPlJlbGVhc2UoKVxuIix0aGlzKTsKIAlyZXR1cm4gMTsgLyogY2Fubm90IGJlIGZyZWVkICovCiB9CiAKLXN0YXRpYyBIUkVTVUxUIFdJTkFQSSBJTWFsbG9jX1F1ZXJ5SW50ZXJmYWNlKExQTUFMTE9DIHRoaXMsUkVGSUlEIHJlZmlpZCxMUFZPSUQgKm9iaikgeworSFJFU1VMVCBXSU5BUEkgSU1hbGxvYzE2X1F1ZXJ5SW50ZXJmYWNlKExQTUFMTE9DMTYgdGhpcyxSRUZJSUQgcmVmaWlkLExQVk9JRCAqb2JqKSB7CiAJY2hhcgl4cmVmaWlkWzUwXTsKIAotCVN0cmluZ0Zyb21DTFNJRCgoTFBDTFNJRClyZWZpaWQseHJlZmlpZCk7Ci0JZHByaW50Zl9yZWxheShzdGRkZWIsIklNYWxsb2MoJXApLT5RdWVyeUludGVyZmFjZSglcywlcClcbiIsdGhpcyx4cmVmaWlkLG9iaik7CisJV0lORV9TdHJpbmdGcm9tQ0xTSUQoKExQQ0xTSUQpcmVmaWlkLHhyZWZpaWQpOworCWRwcmludGZfaW5mbyhyZWxheSwiSU1hbGxvYzE2KCVwKS0+UXVlcnlJbnRlcmZhY2UoJXMsJXApXG4iLHRoaXMseHJlZmlpZCxvYmopOwogCWlmICgJIW1lbWNtcCgmSUlEX0lVbmtub3duLHJlZmlpZCxzaXplb2YoSUlEX0lVbmtub3duKSkgfHwKIAkJIW1lbWNtcCgmSUlEX0lNYWxsb2MscmVmaWlkLHNpemVvZihJSURfSU1hbGxvYykpCiAJKSB7CkBAIC04NCw1MyArOTMsMTY0IEBACiAJcmV0dXJuIE9MRV9FX0VOVU1fTk9NT1JFOyAKIH0KIAotc3RhdGljIExQVk9JRCBXSU5BUEkgSU1hbGxvY19BbGxvYyhMUE1BTExPQyB0aGlzLERXT1JEIGNiKSB7Ci0JZHByaW50Zl9yZWxheShzdGRkZWIsIklNYWxsb2MoJXApLT5BbGxvYyglbGQpXG4iLHRoaXMsY2IpOwotCXJldHVybiBIZWFwQWxsb2MoR2V0UHJvY2Vzc0hlYXAoKSwwLGNiKTsKK0xQVk9JRCBXSU5BUEkgSU1hbGxvYzE2X0FsbG9jKExQTUFMTE9DMTYgdGhpcyxEV09SRCBjYikgeworCWRwcmludGZfaW5mbyhyZWxheSwiSU1hbGxvYzE2KCVwKS0+QWxsb2MoJWxkKVxuIix0aGlzLGNiKTsKKwlyZXR1cm4gKExQVk9JRClQVFJfU0VHX09GRl9UT19TRUdQVFIodGhpcy0+aGVhcCxMT0NBTF9BbGxvYyh0aGlzLT5oZWFwLDAsY2IpKTsKIH0KIAotc3RhdGljIExQVk9JRCBXSU5BUEkgSU1hbGxvY19SZWFsbG9jKExQTUFMTE9DIHRoaXMsTFBWT0lEIHB2LERXT1JEIGNiKSB7Ci0JZHByaW50Zl9yZWxheShzdGRkZWIsIklNYWxsb2MoJXApLT5SZWFsbG9jKCVwLCVsZClcbiIsdGhpcyxwdixjYik7Ci0JcmV0dXJuIEhlYXBSZUFsbG9jKEdldFByb2Nlc3NIZWFwKCksMCxwdixjYik7CitMUFZPSUQgV0lOQVBJIElNYWxsb2MxNl9SZWFsbG9jKExQTUFMTE9DMTYgdGhpcyxMUFZPSUQgcHYsRFdPUkQgY2IpIHsKKwlkcHJpbnRmX2luZm8ocmVsYXksIklNYWxsb2MxNiglcCktPlJlYWxsb2MoJXAsJWxkKVxuIix0aGlzLHB2LGNiKTsKKwlyZXR1cm4gKExQVk9JRClQVFJfU0VHX09GRl9UT19TRUdQVFIodGhpcy0+aGVhcCxMT0NBTF9SZUFsbG9jKHRoaXMtPmhlYXAsMCxMT1dPUkQocHYpLGNiKSk7CiB9Ci1zdGF0aWMgVk9JRCBXSU5BUEkgSU1hbGxvY19GcmVlKExQTUFMTE9DIHRoaXMsTFBWT0lEIHB2KSB7Ci0JZHByaW50Zl9yZWxheShzdGRkZWIsIklNYWxsb2MoJXApLT5GcmVlKCVwKVxuIix0aGlzLHB2KTsKLQlIZWFwRnJlZShHZXRQcm9jZXNzSGVhcCgpLDAscHYpOworVk9JRCBXSU5BUEkgSU1hbGxvYzE2X0ZyZWUoTFBNQUxMT0MxNiB0aGlzLExQVk9JRCBwdikgeworCWRwcmludGZfaW5mbyhyZWxheSwiSU1hbGxvYzE2KCVwKS0+RnJlZSglcClcbiIsdGhpcyxwdik7CisJTE9DQUxfRnJlZSh0aGlzLT5oZWFwLExPV09SRChwdikpOwogfQogCi1zdGF0aWMgRFdPUkQgV0lOQVBJIElNYWxsb2NfR2V0U2l6ZShMUE1BTExPQyB0aGlzLExQVk9JRCBwdikgewotCWRwcmludGZfcmVsYXkoc3RkZGViLCJJTWFsbG9jKCVwKS0+R2V0U2l6ZSglcClcbiIsdGhpcyxwdik7Ci0JcmV0dXJuIEhlYXBTaXplKEdldFByb2Nlc3NIZWFwKCksMCxwdik7CitEV09SRCBXSU5BUEkgSU1hbGxvYzE2X0dldFNpemUoTFBNQUxMT0MxNiB0aGlzLExQVk9JRCBwdikgeworCWRwcmludGZfaW5mbyhyZWxheSwiSU1hbGxvYzE2KCVwKS0+R2V0U2l6ZSglcClcbiIsdGhpcyxwdik7CisJcmV0dXJuIExPQ0FMX1NpemUodGhpcy0+aGVhcCxMT1dPUkQocHYpKTsKIH0KIAotc3RhdGljIExQSU5UMzIgV0lOQVBJIElNYWxsb2NfRGlkQWxsb2MoTFBNQUxMT0MgdGhpcyxMUFZPSUQgcHYpIHsKLQlkcHJpbnRmX3JlbGF5KHN0ZGRlYiwiSU1hbGxvYyglcCktPkRpZEFsbG9jKCVwKVxuIix0aGlzLHB2KTsKLQlyZXR1cm4gKExQSU5UMzIpMHhmZmZmZmZmZjsKK0lOVDE2IFdJTkFQSSBJTWFsbG9jMTZfRGlkQWxsb2MoTFBNQUxMT0MxNiB0aGlzLExQVk9JRCBwdikgeworCWRwcmludGZfaW5mbyhyZWxheSwiSU1hbGxvYzE2KCVwKS0+RGlkQWxsb2MoJXApXG4iLHRoaXMscHYpOworCXJldHVybiAoSU5UMTYpLTE7CiB9Ci1zdGF0aWMgTFBWT0lEIFdJTkFQSSBJTWFsbG9jX0hlYXBNaW5pbWl6ZShMUE1BTExPQyB0aGlzKSB7Ci0JZHByaW50Zl9yZWxheShzdGRkZWIsIklNYWxsb2MoJXApLT5IZWFwTWluaW1pemUoKVxuIix0aGlzKTsKK0xQVk9JRCBXSU5BUEkgSU1hbGxvYzE2X0hlYXBNaW5pbWl6ZShMUE1BTExPQzE2IHRoaXMpIHsKKwlkcHJpbnRmX2luZm8ocmVsYXksIklNYWxsb2MxNiglcCktPkhlYXBNaW5pbWl6ZSgpXG4iLHRoaXMpOwogCXJldHVybiBOVUxMOwogfQogCi1zdGF0aWMgSU1hbGxvY19WVGFibGUgVlRfSU1hbGxvYyA9IHsKLQlJTWFsbG9jX1F1ZXJ5SW50ZXJmYWNlLAotCUlNYWxsb2NfQWRkUmVmLAotCUlNYWxsb2NfUmVsZWFzZSwKLQlJTWFsbG9jX0FsbG9jLAotCUlNYWxsb2NfUmVhbGxvYywKLQlJTWFsbG9jX0ZyZWUsCi0JSU1hbGxvY19HZXRTaXplLAotCUlNYWxsb2NfRGlkQWxsb2MsCi0JSU1hbGxvY19IZWFwTWluaW1pemUsCitzdGF0aWMgSU1hbGxvYzE2X1ZUYWJsZSBtdnQxNiA9IHsKKwlJTWFsbG9jMTZfUXVlcnlJbnRlcmZhY2UsCisJSU1hbGxvYzE2X0FkZFJlZiwKKwlJTWFsbG9jMTZfUmVsZWFzZSwKKwlJTWFsbG9jMTZfQWxsb2MsCisJSU1hbGxvYzE2X1JlYWxsb2MsCisJSU1hbGxvYzE2X0ZyZWUsCisJSU1hbGxvYzE2X0dldFNpemUsCisJSU1hbGxvYzE2X0RpZEFsbG9jLAorCUlNYWxsb2MxNl9IZWFwTWluaW1pemUsCit9Oworc3RhdGljIElNYWxsb2MxNl9WVGFibGUgKm1zZWd2dDE2ID0gTlVMTDsKKworTFBNQUxMT0MxNgorSU1hbGxvYzE2X0NvbnN0cnVjdG9yKCkgeworCUxQTUFMTE9DMTYJdGhpczsKKworCXRoaXMgPSAoTFBNQUxMT0MxNilTRUdQVFJfTkVXKElNYWxsb2MxNik7CisJaWYgKF9fd2luZWxpYikgeworCQl0aGlzLT5scHZ0YmwgPSAmbXZ0MTY7CisJfSBlbHNlIHsKKwkJSE1PRFVMRTE2CWhjb21wID0gR2V0TW9kdWxlSGFuZGxlMTYoIkNPTVBPQkoiKTsKKwkJaWYgKCFtc2VndnQxNikgeworCQkJbXNlZ3Z0MTYgPSBTRUdQVFJfTkVXKElNYWxsb2MxNl9WVGFibGUpOworI2RlZmluZSBGTih4KSB0aGlzLT5scHZ0YmwtPmZuIyN4ID0gKHZvaWQqKVdJTjMyX0dldFByb2NBZGRyZXNzMTYoaGNvbXAsIklNYWxsb2MxNl8iI3gpO2Fzc2VydCh0aGlzLT5scHZ0YmwtPmZuIyN4KTsKKwkJCUZOKFF1ZXJ5SW50ZXJmYWNlKQorCQkJRk4oQWRkUmVmKQorCQkJRk4oUmVsZWFzZSkKKwkJCUZOKEFsbG9jKQorCQkJRk4oUmVhbGxvYykKKwkJCUZOKEZyZWUpCisJCQlGTihHZXRTaXplKQorCQkJRk4oRGlkQWxsb2MpCisJCQlGTihIZWFwTWluaW1pemUpCisJCQltc2VndnQxNiA9IChMUE1BTExPQzE2X1ZUQUJMRSlTRUdQVFJfR0VUKG1zZWd2dDE2KTsKKyN1bmRlZiBGTgorCQl9CisJCXRoaXMtPmxwdnRibCA9IG1zZWd2dDE2OworCX0KKwl0aGlzLT5yZWYgPSAxOworCS8qIEZJWE1FOiBpbXBsZW1lbnQgbXVsdGlwbGUgaGVhcHMgKi8KKwl0aGlzLT5oZWFwID0gR2xvYmFsQWxsb2MxNihHTUVNX01PVkVBQkxFLDY0MDAwKTsKKwlMb2NhbEluaXQodGhpcy0+aGVhcCwwLDY0MDAwKTsKKwlyZXR1cm4gKExQTUFMTE9DMTYpU0VHUFRSX0dFVCh0aGlzKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIElNYWxsb2MzMgorICovCitzdGF0aWMgVUxPTkcgV0lOQVBJIElNYWxsb2MzMl9BZGRSZWYoTFBNQUxMT0MzMiB0aGlzKSB7CisJZHByaW50Zl9pbmZvKHJlbGF5LCJJTWFsbG9jMzIoJXApLT5BZGRSZWYoKVxuIix0aGlzKTsKKwlyZXR1cm4gMTsgLyogY2Fubm90IGJlIGZyZWVkICovCit9CisKK3N0YXRpYyBVTE9ORyBXSU5BUEkgSU1hbGxvYzMyX1JlbGVhc2UoTFBNQUxMT0MzMiB0aGlzKSB7CisJZHByaW50Zl9pbmZvKHJlbGF5LCJJTWFsbG9jMzIoJXApLT5SZWxlYXNlKClcbiIsdGhpcyk7CisJcmV0dXJuIDE7IC8qIGNhbm5vdCBiZSBmcmVlZCAqLworfQorCitzdGF0aWMgSFJFU1VMVCBXSU5BUEkgSU1hbGxvYzMyX1F1ZXJ5SW50ZXJmYWNlKExQTUFMTE9DMzIgdGhpcyxSRUZJSUQgcmVmaWlkLExQVk9JRCAqb2JqKSB7CisJY2hhcgl4cmVmaWlkWzUwXTsKKworCVdJTkVfU3RyaW5nRnJvbUNMU0lEKChMUENMU0lEKXJlZmlpZCx4cmVmaWlkKTsKKwlkcHJpbnRmX2luZm8ocmVsYXksIklNYWxsb2MzMiglcCktPlF1ZXJ5SW50ZXJmYWNlKCVzLCVwKVxuIix0aGlzLHhyZWZpaWQsb2JqKTsKKwlpZiAoCSFtZW1jbXAoJklJRF9JVW5rbm93bixyZWZpaWQsc2l6ZW9mKElJRF9JVW5rbm93bikpIHx8CisJCSFtZW1jbXAoJklJRF9JTWFsbG9jLHJlZmlpZCxzaXplb2YoSUlEX0lNYWxsb2MpKQorCSkgeworCQkqb2JqID0gdGhpczsKKwkJcmV0dXJuIDA7CisJfQorCXJldHVybiBPTEVfRV9FTlVNX05PTU9SRTsgCit9CisKK3N0YXRpYyBMUFZPSUQgV0lOQVBJIElNYWxsb2MzMl9BbGxvYyhMUE1BTExPQzMyIHRoaXMsRFdPUkQgY2IpIHsKKwlkcHJpbnRmX2luZm8ocmVsYXksIklNYWxsb2MzMiglcCktPkFsbG9jKCVsZClcbiIsdGhpcyxjYik7CisJcmV0dXJuIEhlYXBBbGxvYyhHZXRQcm9jZXNzSGVhcCgpLDAsY2IpOworfQorCitzdGF0aWMgTFBWT0lEIFdJTkFQSSBJTWFsbG9jMzJfUmVhbGxvYyhMUE1BTExPQzMyIHRoaXMsTFBWT0lEIHB2LERXT1JEIGNiKSB7CisJZHByaW50Zl9pbmZvKHJlbGF5LCJJTWFsbG9jMzIoJXApLT5SZWFsbG9jKCVwLCVsZClcbiIsdGhpcyxwdixjYik7CisJcmV0dXJuIEhlYXBSZUFsbG9jKEdldFByb2Nlc3NIZWFwKCksMCxwdixjYik7Cit9CitzdGF0aWMgVk9JRCBXSU5BUEkgSU1hbGxvYzMyX0ZyZWUoTFBNQUxMT0MzMiB0aGlzLExQVk9JRCBwdikgeworCWRwcmludGZfaW5mbyhyZWxheSwiSU1hbGxvYzMyKCVwKS0+RnJlZSglcClcbiIsdGhpcyxwdik7CisJSGVhcEZyZWUoR2V0UHJvY2Vzc0hlYXAoKSwwLHB2KTsKK30KKworc3RhdGljIERXT1JEIFdJTkFQSSBJTWFsbG9jMzJfR2V0U2l6ZShMUE1BTExPQzMyIHRoaXMsTFBWT0lEIHB2KSB7CisJZHByaW50Zl9pbmZvKHJlbGF5LCJJTWFsbG9jMzIoJXApLT5HZXRTaXplKCVwKVxuIix0aGlzLHB2KTsKKwlyZXR1cm4gSGVhcFNpemUoR2V0UHJvY2Vzc0hlYXAoKSwwLHB2KTsKK30KKworc3RhdGljIElOVDMyIFdJTkFQSSBJTWFsbG9jMzJfRGlkQWxsb2MoTFBNQUxMT0MzMiB0aGlzLExQVk9JRCBwdikgeworCWRwcmludGZfaW5mbyhyZWxheSwiSU1hbGxvYzMyKCVwKS0+RGlkQWxsb2MoJXApXG4iLHRoaXMscHYpOworCXJldHVybiAtMTsKK30KK3N0YXRpYyBMUFZPSUQgV0lOQVBJIElNYWxsb2MzMl9IZWFwTWluaW1pemUoTFBNQUxMT0MzMiB0aGlzKSB7CisJZHByaW50Zl9pbmZvKHJlbGF5LCJJTWFsbG9jMzIoJXApLT5IZWFwTWluaW1pemUoKVxuIix0aGlzKTsKKwlyZXR1cm4gTlVMTDsKK30KKworc3RhdGljIElNYWxsb2MzMl9WVGFibGUgVlRfSU1hbGxvYzMyID0geworCUlNYWxsb2MzMl9RdWVyeUludGVyZmFjZSwKKwlJTWFsbG9jMzJfQWRkUmVmLAorCUlNYWxsb2MzMl9SZWxlYXNlLAorCUlNYWxsb2MzMl9BbGxvYywKKwlJTWFsbG9jMzJfUmVhbGxvYywKKwlJTWFsbG9jMzJfRnJlZSwKKwlJTWFsbG9jMzJfR2V0U2l6ZSwKKwlJTWFsbG9jMzJfRGlkQWxsb2MsCisJSU1hbGxvYzMyX0hlYXBNaW5pbWl6ZSwKIH07CiAKLUxQTUFMTE9DCi1JTWFsbG9jX0NvbnN0cnVjdG9yKCkgewotCUxQTUFMTE9DCXRoaXM7CitMUE1BTExPQzMyCitJTWFsbG9jMzJfQ29uc3RydWN0b3IoKSB7CisJTFBNQUxMT0MzMgl0aGlzOwogCi0JZnByaW50ZihzdGRlcnIsImNsb25pbmcgSU1hbGxvY1xuIik7Ci0JdGhpcyA9IChMUE1BTExPQylIZWFwQWxsb2MoR2V0UHJvY2Vzc0hlYXAoKSwwLHNpemVvZihJTWFsbG9jKSk7Ci0JdGhpcy0+bHB2dGJsID0gJlZUX0lNYWxsb2M7CisJdGhpcyA9IChMUE1BTExPQzMyKUhlYXBBbGxvYyhHZXRQcm9jZXNzSGVhcCgpLDAsc2l6ZW9mKElNYWxsb2MzMikpOworCXRoaXMtPmxwdnRibCA9ICZWVF9JTWFsbG9jMzI7CiAJdGhpcy0+cmVmID0gMTsKIAlyZXR1cm4gdGhpczsKIH0KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBBUEkgRnVuY3Rpb25zCisgKi8KK0JPT0wzMiBXSU5BUEkgSXNWYWxpZEludGVyZmFjZTMyKExQVU5LTk9XTiBwdW5rKSB7CisJcmV0dXJuICEoCisJCUlzQmFkUmVhZFB0cjMyKHB1bmssNCkJCQkJCXx8CisJCUlzQmFkUmVhZFB0cjMyKHB1bmstPmxwdnRibCw0KQkJCQl8fAorCQlJc0JhZFJlYWRQdHIzMihwdW5rLT5scHZ0YmwtPmZuUXVlcnlJbnRlcmZhY2UsOSkJfHwKKwkJSXNCYWRDb2RlUHRyMzIocHVuay0+bHB2dGJsLT5mblF1ZXJ5SW50ZXJmYWNlKQorCSk7Cit9CmRpZmYgLS1naXQgYS9vbGUvb2xlMi5jIGIvb2xlL29sZTIuYwppbmRleCA1NjViMGE2Li44MTcxYWM0IDEwMDY0NAotLS0gYS9vbGUvb2xlMi5jCisrKyBiL29sZS9vbGUyLmMKQEAgLTksNyArOSw3IEBACiAKICNpbmNsdWRlICJ3aW5kb3dzLmgiCiAjaW5jbHVkZSAib2xlMi5oIgotI2luY2x1ZGUgInN0ZGRlYnVnLmgiCisjaW5jbHVkZSAicHJvY2Vzcy5oIgogI2luY2x1ZGUgImRlYnVnLmgiCiAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgpAQCAtMTcsNyArMTcsNyBAQAogICovCiBEV09SRCBXSU5BUEkgT2xlQnVpbGRWZXJzaW9uKCkKIHsKLSAgICBkcHJpbnRmX29sZShzdGRkZWIsIk9sZUJ1aWxkVmVyc2lvbigpXG4iKTsKKyAgICBkcHJpbnRmX2luZm8ob2xlLCJPbGVCdWlsZFZlcnNpb24oKVxuIik7CiAgICAgcmV0dXJuIChybW08PDE2KStydXA7CiB9CiAKQEAgLTI2LDggKzI2LDEyIEBACiAgKi8KIEhSRVNVTFQgV0lOQVBJIE9sZUluaXRpYWxpemUoTFBWT0lEIHJlc2VydmVkKQogewotICAgIGRwcmludGZfb2xlKHN0ZG5pbXAsIk9sZUluaXRpYWxpemVcbiIpOwotCXJldHVybiBTX09LOworICAgIGRwcmludGZfZml4bWUob2xlLCJPbGVJbml0aWFsaXplIC0gc3R1YlxuIik7CisgICAgcmV0dXJuIFNfT0s7Cit9CisKK0RXT1JEIFdJTkFQSSBDb0dldEN1cnJlbnRQcm9jZXNzKCkgeworCXJldHVybiBQUk9DRVNTX0N1cnJlbnQoKTsKIH0KIAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCkBAIC0zNSw3ICszOSw3IEBACiAgKi8KIHZvaWQgV0lOQVBJIE9sZVVuaW5pdGlhbGl6ZSh2b2lkKQogewotICAgIGRwcmludGZfb2xlKHN0ZG5pbXAsIk9sZVVuaW5pdGlhbGl6ZSgpXG4iKTsKKyAgICBkcHJpbnRmX2ZpeG1lKG9sZSwiT2xlVW5pbml0aWFsaXplKCkgLSBzdHViXG4iKTsKIH0KIAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCkBAIC01Myw5ICs1NywxNyBAQAogICAgIExQTUVTU0FHRUZJTFRFUiBscE1lc3NhZ2VGaWx0ZXIsCS8qIFBvaW50ZXIgdG8gaW50ZXJmYWNlICovCiAgICAgTFBNRVNTQUdFRklMVEVSICpscGxwTWVzc2FnZUZpbHRlcgkvKiBJbmRpcmVjdCBwb2ludGVyIHRvIHByaW9yIGluc3RhbmNlIGlmIG5vbi1OVUxMICovCiApIHsKLSAgICBkcHJpbnRmX29sZShzdGRuaW1wLCJDb1JlZ2lzdGVyTWVzc2FnZUZpbHRlcigpXG4iKTsKKyAgICBkcHJpbnRmX2ZpeG1lKG9sZSwiQ29SZWdpc3Rlck1lc3NhZ2VGaWx0ZXIoKSAtIHN0dWJcbiIpOwogICAgIGlmIChscGxwTWVzc2FnZUZpbHRlcikgewogCSpscGxwTWVzc2FnZUZpbHRlciA9IE5VTEw7CiAgICAgfQogICAgIHJldHVybiBTX09LOwogfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqICAgICAgICAgICBPbGVJbml0aWFsaXplV09XIChPTEUzMi4yNykKKyAqLworSFJFU1VMVCBXSU5BUEkgT2xlSW5pdGlhbGl6ZVdPVyhEV09SRCB4KSB7CisgICAgICAgIGZwcmludGYoc3RkZXJyLCJPbGVJbml0aWFsaXplV09XKDB4JTA4bHgpLHN0dWIhXG4iLHgpOworICAgICAgICByZXR1cm4gMDsKK30KZGlmZiAtLWdpdCBhL29sZS9vbGUyZGlzcC5jIGIvb2xlL29sZTJkaXNwLmMKaW5kZXggNDA1Y2U2Ni4uZTA3NTM4ZiAxMDA2NDQKLS0tIGEvb2xlL29sZTJkaXNwLmMKKysrIGIvb2xlL29sZTJkaXNwLmMKQEAgLTEwLDcgKzEwLDYgQEAKICNpbmNsdWRlICJpbnRlcmZhY2VzLmgiCiAjaW5jbHVkZSAiaGVhcC5oIgogI2luY2x1ZGUgImxkdC5oIgotI2luY2x1ZGUgInN0ZGRlYnVnLmgiCiAjaW5jbHVkZSAiZGVidWcuaCIKIAogLyogVGhpcyBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgQlNUUiBBUEkgaXMgMTYtYml0IG9ubHkuIEl0CkBAIC0xMDQsNyArMTAzLDcgQEAKIAlJVW5rbm93biAqIHB1bmssUkVGQ0xTSUQgcmNsc2lkLERXT1JEIGR3RmxhZ3MsIERXT1JEICogcGR3UmVnaXN0ZXIKICkgewogCWNoYXIJYnVmWzgwXTsKLQlTdHJpbmdGcm9tQ0xTSUQocmNsc2lkLGJ1Zik7CisJV0lORV9TdHJpbmdGcm9tQ0xTSUQocmNsc2lkLGJ1Zik7CiAJZnByaW50ZihzdGRlcnIsIlJlZ2lzdGVyQWN0aXZlT2JqZWN0KCVwLCVzLDB4JTA4bHgsJXApLHN0dWJcbiIscHVuayxidWYsZHdGbGFncyxwZHdSZWdpc3Rlcik7CiAJcmV0dXJuIDA7CiB9CmRpZmYgLS1naXQgYS9vbGUvb2xlMm5scy5jIGIvb2xlL29sZTJubHMuYwppbmRleCA0Nzc5MjdiLi5iNjFjNzhkIDEwMDY0NAotLS0gYS9vbGUvb2xlMm5scy5jCisrKyBiL29sZS9vbGUybmxzLmMKQEAgLTIsMTAgKzIsMTIgQEAKICAqCU9MRTJOTFMgbGlicmFyeQogICoKICAqCUNvcHlyaWdodCAxOTk1CU1hcnRpbiB2b24gTG9ld2lzCisgKiAgICAgIENvcHlyaWdodCAxOTk4ICBEYXZpZCBMZWUgTGFtYmVydAogICovCiAKICNpbmNsdWRlIDxzdHJpbmcuaD4KICNpbmNsdWRlIDxjdHlwZS5oPgorI2luY2x1ZGUgPHN0ZGlvLmg+CiAjaW5jbHVkZSA8c3RkbGliLmg+CiAjaW5jbHVkZSAid2luZG93cy5oIgogI2luY2x1ZGUgImhlYXAuaCIKQEAgLTE0LDcgKzE2LDYgQEAKICNpbmNsdWRlICJ3aW5ubHMuaCIKICNpbmNsdWRlICJ3aW5yZWcuaCIKICNpbmNsdWRlICJ3aW5lcnJvci5oIgotI2luY2x1ZGUgInN0ZGRlYnVnLmgiCiAjaW5jbHVkZSAiZGVidWcuaCIKIAogLyogTG9jYWxlIG5hbWUgdG8gaWQgbWFwLiB1c2VkIGJ5IEVudW1TeXN0ZW1Mb2NhbGVzLCBHZXRMb2NhbEluZm9BIApAQCAtMjYxLDcgKzI2Miw3IEBACiAJY2hhcgkqcmV0U3RyaW5nOwogCWludAlmb3VuZCxpOwogCi0JZHByaW50Zl9vbGUoc3RkZGViLCJHZXRMb2NhbGVJbmZvMzJBKCU4bFgsJThsWCwlcCwlNFgpXG4iLAorCWRwcmludGZfaW5mbyhvbGUsIkdldExvY2FsZUluZm8zMkEoJThsWCwlOGxYLCVwLCU0WClcbiIsCiAJCQlsY2lkLExDVHlwZSxidWYsbGVuKTsKIAogCUxDVHlwZSAmPSB+KExPQ0FMRV9OT1VTRVJPVkVSUklERXxMT0NBTEVfVVNFX0NQX0FDUCk7CkBAIC01MzAsMTMgKzUzMSwxMyBAQAogTE9DVkFMKExPQ0FMRV9JTEFOR1VBR0UsIjkiKQogTE9DVkFMKExPQ0FMRV9TTEFOR1VBR0UsIkVuZ2xpc2giKQogTE9DVkFMKExPQ0FMRV9TRU5HTEFOR1VBR0UsIkVuZ2xpc2giKQotTE9DVkFMKExPQ0FMRV9TQUJCUkVWTEFOR05BTUUsImVudSIpCitMT0NWQUwoTE9DQUxFX1NBQkJSRVZMQU5HTkFNRSwiZW4iKQogTE9DVkFMKExPQ0FMRV9TTkFUSVZFTEFOR05BTUUsIkVuZ2xpc2giKQogTE9DVkFMKExPQ0FMRV9JQ09VTlRSWSwiMTEiKQotTE9DVkFMKExPQ0FMRV9TQ09VTlRSWSwiRGV1dHNjaGxhbmQiKQotTE9DVkFMKExPQ0FMRV9TRU5HQ09VTlRSWSwiRGV1dHNjaGxhbmQiKQotTE9DVkFMKExPQ0FMRV9TQUJCUkVWQ1RSWU5BTUUsIkRlIikKLUxPQ1ZBTChMT0NBTEVfU05BVElWRUNUUllOQU1FLCJEZXV0c2NobGFuZCIpCitMT0NWQUwoTE9DQUxFX1NDT1VOVFJZLCJVbml0ZWQgU3RhdGVzIikKK0xPQ1ZBTChMT0NBTEVfU0VOR0NPVU5UUlksIlVuaXRlZCBTdGF0ZXMiKQorTE9DVkFMKExPQ0FMRV9TQUJCUkVWQ1RSWU5BTUUsIlVTIikKK0xPQ1ZBTChMT0NBTEVfU05BVElWRUNUUllOQU1FLCJVbml0ZWQgU3RhdGVzIikKIExPQ1ZBTChMT0NBTEVfSURFRkFVTFRMQU5HVUFHRSwiOSIpCiBMT0NWQUwoTE9DQUxFX0lERUZBVUxUQ09VTlRSWSwiNDkiKQogTE9DVkFMKExPQ0FMRV9JREVGQVVMVENPREVQQUdFLCI0MzciKQpAQCAtNTQ1LDggKzU0Niw4IEBACiAqLwogTE9DVkFMKExPQ0FMRV9TTElTVCwiOyIpCiBMT0NWQUwoTE9DQUxFX0lNRUFTVVJFLCIwIikKLUxPQ1ZBTChMT0NBTEVfU0RFQ0lNQUwsIiwiKQotTE9DVkFMKExPQ0FMRV9TVEhPVVNBTkQsIi4iKQorTE9DVkFMKExPQ0FMRV9TREVDSU1BTCwiLiIpCitMT0NWQUwoTE9DQUxFX1NUSE9VU0FORCwiLCIpCiBMT0NWQUwoTE9DQUxFX1NHUk9VUElORywgIjM7MCIpCiBMT0NWQUwoTE9DQUxFX0lESUdJVFMsIjIiKQogTE9DVkFMKExPQ0FMRV9JTFpFUk8sIjEiKQpAQCAtNTY2LDcgKzU2Nyw3IEBACiBMT0NWQUwoTE9DQUxFX0lORUdDVVJSLCI4IikKIExPQ1ZBTChMT0NBTEVfU0RBVEUsIi4iKQogTE9DVkFMKExPQ0FMRV9TVElNRSwiOiIpCi1MT0NWQUwoTE9DQUxFX1NTSE9SVERBVEUsImRkLk1NLnl5eXkiKQorTE9DVkFMKExPQ0FMRV9TU0hPUlREQVRFLCJNTS9kZC95eSIpCiBMT0NWQUwoTE9DQUxFX1NMT05HREFURSwiZGRkLCBkLiBNTU1NIHl5eXkiKQogTE9DVkFMKExPQ0FMRV9TVElNRUZPUk1BVCwgImg6bW06c3MgdHQiKQogTE9DVkFMKExPQ0FMRV9JREFURSwiMSIpCkBAIC01OTEsNDkgKzU5Miw0OSBAQAogTE9DVkFMKExPQ0FMRV9JRklSU1REQVlPRldFRUspCiBMT0NWQUwoTE9DQUxFX0lGSVJTVFdFRUtPRllFQVIpCiAqLwotTE9DVkFMKExPQ0FMRV9TREFZTkFNRTEsIk1vbnRhZyIpCi1MT0NWQUwoTE9DQUxFX1NEQVlOQU1FMiwiRGllbnN0YWciKQotTE9DVkFMKExPQ0FMRV9TREFZTkFNRTMsIk1pdHR3b2NoIikKLUxPQ1ZBTChMT0NBTEVfU0RBWU5BTUU0LCJEb25uZXJzdGFnIikKLUxPQ1ZBTChMT0NBTEVfU0RBWU5BTUU1LCJGcmVpdGFnIikKLUxPQ1ZBTChMT0NBTEVfU0RBWU5BTUU2LCJTb25uYWJlbmQiKQotTE9DVkFMKExPQ0FMRV9TREFZTkFNRTcsIlNvbm50YWciKQotTE9DVkFMKExPQ0FMRV9TQUJCUkVWREFZTkFNRTEsIk1vIikKLUxPQ1ZBTChMT0NBTEVfU0FCQlJFVkRBWU5BTUUyLCJEaSIpCi1MT0NWQUwoTE9DQUxFX1NBQkJSRVZEQVlOQU1FMywiTWkiKQotTE9DVkFMKExPQ0FMRV9TQUJCUkVWREFZTkFNRTQsIkRvIikKLUxPQ1ZBTChMT0NBTEVfU0FCQlJFVkRBWU5BTUU1LCJGciIpCi1MT0NWQUwoTE9DQUxFX1NBQkJSRVZEQVlOQU1FNiwiU2EiKQotTE9DVkFMKExPQ0FMRV9TQUJCUkVWREFZTkFNRTcsIlNvIikKLUxPQ1ZBTChMT0NBTEVfU01PTlRITkFNRTEsIkphbnVhciIpCi1MT0NWQUwoTE9DQUxFX1NNT05USE5BTUUyLCJGZWJydWFyIikKLUxPQ1ZBTChMT0NBTEVfU01PTlRITkFNRTMsIk3kcnoiKQorTE9DVkFMKExPQ0FMRV9TREFZTkFNRTEsIk1vbmRheSIpCitMT0NWQUwoTE9DQUxFX1NEQVlOQU1FMiwiVHVlc2RheSIpCitMT0NWQUwoTE9DQUxFX1NEQVlOQU1FMywiV2VkbmVzZGF5IikKK0xPQ1ZBTChMT0NBTEVfU0RBWU5BTUU0LCJUaHVyc2RheSIpCitMT0NWQUwoTE9DQUxFX1NEQVlOQU1FNSwiRnJpZGF5IikKK0xPQ1ZBTChMT0NBTEVfU0RBWU5BTUU2LCJTYXR1cmRheSIpCitMT0NWQUwoTE9DQUxFX1NEQVlOQU1FNywiU3VuZGF5IikKK0xPQ1ZBTChMT0NBTEVfU0FCQlJFVkRBWU5BTUUxLCJNb24iKQorTE9DVkFMKExPQ0FMRV9TQUJCUkVWREFZTkFNRTIsIlR1ZSIpCitMT0NWQUwoTE9DQUxFX1NBQkJSRVZEQVlOQU1FMywiV2VkIikKK0xPQ1ZBTChMT0NBTEVfU0FCQlJFVkRBWU5BTUU0LCJUaHUiKQorTE9DVkFMKExPQ0FMRV9TQUJCUkVWREFZTkFNRTUsIkZyaSIpCitMT0NWQUwoTE9DQUxFX1NBQkJSRVZEQVlOQU1FNiwiU2F0IikKK0xPQ1ZBTChMT0NBTEVfU0FCQlJFVkRBWU5BTUU3LCJTdW4iKQorTE9DVkFMKExPQ0FMRV9TTU9OVEhOQU1FMSwiSmFudWFyeSIpCitMT0NWQUwoTE9DQUxFX1NNT05USE5BTUUyLCJGZWJydWFyeSIpCitMT0NWQUwoTE9DQUxFX1NNT05USE5BTUUzLCJNYXJjaCIpCiBMT0NWQUwoTE9DQUxFX1NNT05USE5BTUU0LCJBcHJpbCIpCi1MT0NWQUwoTE9DQUxFX1NNT05USE5BTUU1LCJNYWkiKQotTE9DVkFMKExPQ0FMRV9TTU9OVEhOQU1FNiwiSnVuaSIpCi1MT0NWQUwoTE9DQUxFX1NNT05USE5BTUU3LCJKdWxpIikKK0xPQ1ZBTChMT0NBTEVfU01PTlRITkFNRTUsIk1heSIpCitMT0NWQUwoTE9DQUxFX1NNT05USE5BTUU2LCJKdW5lIikKK0xPQ1ZBTChMT0NBTEVfU01PTlRITkFNRTcsIkp1bHkiKQogTE9DVkFMKExPQ0FMRV9TTU9OVEhOQU1FOCwiQXVndXN0IikKIExPQ1ZBTChMT0NBTEVfU01PTlRITkFNRTksIlNlcHRlbWJlciIpCi1MT0NWQUwoTE9DQUxFX1NNT05USE5BTUUxMCwiT2t0b2JlciIpCitMT0NWQUwoTE9DQUxFX1NNT05USE5BTUUxMCwiT2N0b2JlciIpCiBMT0NWQUwoTE9DQUxFX1NNT05USE5BTUUxMSwiTm92ZW1iZXIiKQotTE9DVkFMKExPQ0FMRV9TTU9OVEhOQU1FMTIsIkRlemVtYmVyIikKK0xPQ1ZBTChMT0NBTEVfU01PTlRITkFNRTEyLCJEZWNlbWJlciIpCiBMT0NWQUwoTE9DQUxFX1NNT05USE5BTUUxMywiIikKIExPQ1ZBTChMT0NBTEVfU0FCQlJFVk1PTlRITkFNRTEsIkphbiIpCiBMT0NWQUwoTE9DQUxFX1NBQkJSRVZNT05USE5BTUUyLCJGZWIiKQotTE9DVkFMKExPQ0FMRV9TQUJCUkVWTU9OVEhOQU1FMywiTeRyIikKK0xPQ1ZBTChMT0NBTEVfU0FCQlJFVk1PTlRITkFNRTMsIk1hciIpCiBMT0NWQUwoTE9DQUxFX1NBQkJSRVZNT05USE5BTUU0LCJBcHIiKQotTE9DVkFMKExPQ0FMRV9TQUJCUkVWTU9OVEhOQU1FNSwiTWFpIikKK0xPQ1ZBTChMT0NBTEVfU0FCQlJFVk1PTlRITkFNRTUsIk1heSIpCiBMT0NWQUwoTE9DQUxFX1NBQkJSRVZNT05USE5BTUU2LCJKdW4iKQogTE9DVkFMKExPQ0FMRV9TQUJCUkVWTU9OVEhOQU1FNywiSnVsIikKIExPQ1ZBTChMT0NBTEVfU0FCQlJFVk1PTlRITkFNRTgsIkF1ZyIpCiBMT0NWQUwoTE9DQUxFX1NBQkJSRVZNT05USE5BTUU5LCJTZXAiKQotTE9DVkFMKExPQ0FMRV9TQUJCUkVWTU9OVEhOQU1FMTAsIk9rdCIpCitMT0NWQUwoTE9DQUxFX1NBQkJSRVZNT05USE5BTUUxMCwiT2N0IikKIExPQ1ZBTChMT0NBTEVfU0FCQlJFVk1PTlRITkFNRTExLCJOb3YiKQotTE9DVkFMKExPQ0FMRV9TQUJCUkVWTU9OVEhOQU1FMTIsIkRleiIpCitMT0NWQUwoTE9DQUxFX1NBQkJSRVZNT05USE5BTUUxMiwiRGVjIikKIExPQ1ZBTChMT0NBTEVfU0FCQlJFVk1PTlRITkFNRTEzLCIiKQorTE9DVkFMKExPQ0FMRV9TUE9TSVRJVkVTSUdOLCIiKQorTE9DVkFMKExPQ0FMRV9TTkVHQVRJVkVTSUdOLCItIikKIC8qCi1MT0NWQUwoTE9DQUxFX1NQT1NJVElWRVNJR04pCi1MT0NWQUwoTE9DQUxFX1NORUdBVElWRVNJR04pCiBMT0NWQUwoTE9DQUxFX0lQT1NTSUdOUE9TTikKIExPQ1ZBTChMT0NBTEVfSU5FR1NJR05QT1NOKQogTE9DVkFMKExPQ0FMRV9JUE9TU1lNUFJFQ0VERVMpCkBAIC0xOTA4LDcgKzE5MDksNyBAQAogCVdDSEFSCWJ1ZmZlclsyMDBdOwogCUhLRVkJeGhrZXk7CiAKLQlkcHJpbnRmX3dpbjMyKHN0ZGRlYiwiRW51bVN5c3RlbUxvY2FsZXMzMlcoJXAsJTA4bHgpXG4iLAorCWRwcmludGZfaW5mbyh3aW4zMiwiRW51bVN5c3RlbUxvY2FsZXMzMlcoJXAsJTA4bHgpXG4iLAogICAgICAgICAgICAgICAgICAgICAgIGxwZm5Mb2NhbGVFbnVtLGZsYWdzICk7CiAJLyogc2VlIGlmIHdlIGNhbiByZXVzZSB0aGUgV2luOTUgcmVnaXN0cnkgZW50cmllcy4uLi4gKi8KIAlpZiAoRVJST1JfU1VDQ0VTUz09UmVnT3BlbktleTMyQShIS0VZX0xPQ0FMX01BQ0hJTkUsIlxcU3lzdGVtXFxDdXJyZW50Q29udHJvbFNldFxcY29udHJvbFxcTmxzXFxMb2NhbGVcXCIsJnhoa2V5KSkgewpAQCAtMTk1MSw3ICsxOTUyLDcgQEAKIAlDSEFSCWJ1ZmZlclsyMDBdOwogCUhLRVkJeGhrZXk7CiAKLQlkcHJpbnRmX3dpbjMyKHN0ZGRlYiwiRW51bVN5c3RlbUxvY2FsZXMzMkEoJXAsJTA4bHgpXG4iLAorCWRwcmludGZfaW5mbyh3aW4zMiwiRW51bVN5c3RlbUxvY2FsZXMzMkEoJXAsJTA4bHgpXG4iLAogCQlscGZuTG9jYWxlRW51bSxmbGFncwogCSk7CiAJaWYgKEVSUk9SX1NVQ0NFU1M9PVJlZ09wZW5LZXkzMkEoSEtFWV9MT0NBTF9NQUNISU5FLCJcXFN5c3RlbVxcQ3VycmVudENvbnRyb2xTZXRcXGNvbnRyb2xcXE5sc1xcTG9jYWxlXFwiLCZ4aGtleSkpIHsKQEAgLTIwODEsNyArMjA4Miw3IEBACiAJaW50CWk7CiAJY2hhcgkqYnVmOwogCi0JZHByaW50Zl92ZXIoc3RkZGViLCJWZXJMYW5ndWFnZU5hbWUoJWQsJXAsJWQpXG4iLGxhbmdpZCxsYW5nbmFtZSxsYW5nbmFtZWxlbik7CisJZHByaW50Zl9pbmZvKHZlciwiVmVyTGFuZ3VhZ2VOYW1lKCVkLCVwLCVkKVxuIixsYW5naWQsbGFuZ25hbWUsbGFuZ25hbWVsZW4pOwogCS8qIEZpcnN0LCBjaGVjayBcU3lzdGVtXEN1cnJlbnRDb250cm9sU2V0XGNvbnRyb2xcTmxzXExvY2FsZVw8bGFuZ2lkPgogCSAqIGZyb20gdGhlIHJlZ2lzdHJ5LiAKIAkgKi8KQEAgLTIxNDAsNyArMjE0MSw3IEBACiApIHsKIAlpbnQJaSxsZW47CiAKLQlkcHJpbnRmX3N0cmluZyhzdGRlcnIsIkxDTWFwU3RyaW5nQSgweCUwNGx4LDB4JTA4bHgsJXMsJWQsJXAsJWQpXG4iLAorCWRwcmludGZfaW5mbyhzdHJpbmcsIkxDTWFwU3RyaW5nQSgweCUwNGx4LDB4JTA4bHgsJXMsJWQsJXAsJWQpXG4iLAogCQlsY2lkLG1hcGZsYWdzLHNyY3N0cixzcmNsZW4sZHN0c3RyLGRzdGxlbik7CiAJaWYgKCFkc3RsZW4gfHwgIWRzdHN0cikgewogCQlkc3RzdHIgPSAoTFBTVFIpc3Jjc3RyOwpAQCAtMjE3OCw3ICsyMTc5LDcgQEAKICkgewogCWludAlpLGxlbjsKIAotCWRwcmludGZfc3RyaW5nKHN0ZGVyciwiTENNYXBTdHJpbmdXKDB4JTA0bHgsMHglMDhseCwlcCwlZCwlcCwlZClcbiIsCisJZHByaW50Zl9pbmZvKHN0cmluZywiTENNYXBTdHJpbmdXKDB4JTA0bHgsMHglMDhseCwlcCwlZCwlcCwlZClcbiIsCiAJCWxjaWQsbWFwZmxhZ3Msc3Jjc3RyLHNyY2xlbixkc3RzdHIsZHN0bGVuCiAJKTsKIAlpZiAoIWRzdGxlbiB8fCAhZHN0c3RyKSB7CkBAIC0yMjA5LDIzICsyMjEwLDI1MyBAQAogCXJldHVybiBsZW47CiB9CiAKKy8qIEZJWE1FOiB0aGVzZSBzaG91bGRuJ3QgYmUgbmVlZGVkICovCisKK3N0YXRpYyBjaGFyICphbnlfbG9jYWxlX2RheXNbXSA9IAoreyJTdW4iLCAiTW9uIiwgIlR1ZSIsICJXZWQiLCAiVGh1IiwgIkZyaSIsICJTYXQifTsKKworc3RhdGljIGNoYXIgKmFueV9sb2NhbGVfbW9udGhzW10gPQoreyJ6ZXJvIiwgIkphbiIsICJGZWIiLCAiTWFyIiwgIkFwciIsICJNYXkiLCAiSnVuIiwgCisgICAgICAgICAiSnVsIiwgIkF1ZyIsICJTZXAiLCAiT2N0IiwgIk5vdiIsICJEZWMifTsKKwordHlwZWRlZiBzdHJ1Y3QgeworICAgIGludCBpbnBvczsgICAvKiBwbGFjZSBpbiB0aGUgaW5wdXQgYnVmZmVyICovCisgICAgaW50IG91dHBvczsgIC8qIHBsYWNlIGluIHRoZSBvdXRwdXQgYnVmZmVyICovCisgICAgaW50IGNvdW50OyAgIAorICAgIGludCBpbnF1b3RlOyAKKyAgICBjaGFyIHR5cGU7CisgIH0gUEFSU0lOR19TVEFURTsKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgorICogIEdldERhdGVGb3JtYXQoKQorCisgIFRoaXMgZnVuY3Rpb24gdXNlcyBmb3JtYXQgdG8gZm9ybWF0IHRoZSBkYXRlLCAgb3IsICBpZiBmb3JtYXQKKyAgaXMgTlVMTCwgdXNlcyB0aGUgZGVmYXVsdCBmb3IgdGhlIGxvY2FsZS4gIGZvcm1hdCBpcyBhIHN0cmluZworICBvZiBsaXRlcmFsIGZpZWxkcyBhbmQgY2hhcmFjdGVycyBhcyBmb2xsb3dzOgorCisgIGQgICAgc2luZ2xlLWRpZ2l0IChubyBsZWFkaW5nIHplcm8pIGRheSAob2YgbW9udGgpCisgIGRkICAgdHdvLWRpZ2l0IGRheSAob2YgbW9udGgpCisgIGRkZCAgc2hvcnQgZGF5LW9mLXdlZWsgbmFtZQorICBkZGRkIGxvbmcgZGF5LW9mLXdlZWsgbmFtZQorICBNICAgIHNpbmdsZS1kaWdpdCBtb250aAorICBNTSAgIHR3by1kaWdpdCBtb250aAorICBNTU0gIHNob3J0IG1vbnRoIG5hbWUKKyAgTU1NTSBmdWxsIG1vbnRoIG5hbWUKKyAgeSAgICB0d28tZGlnaXQgeWVhciwgbm8gbGVhZGluZyAwCisgIHl5ICAgdHdvLWRpZ2l0IHllYXIKKyAgeXl5eSBmb3VyLWRpZ2l0IHllYXIKKyAgZ2cgICBlcmEgc3RyaW5nCisKKyAqICoqKioqKioqKioqKioqKioqKioqKioqLwogCiBJTlQzMiBXSU5BUEkgR2V0RGF0ZUZvcm1hdDMyQShMQ0lEIGxvY2FsZSxEV09SRCBmbGFncyxMUFNZU1RFTVRJTUUgeHRpbWUsCi0JCQkgICAgICBMUENTVFIgZm9ybWF0LCBMUFNUUiBkYXRlLElOVDMyIGRhdGVsZW4KLSkgewotCWZwcmludGYoc3RkZXJyLCJHZXREYXRlRm9ybWF0KDB4JTA0bHgsMHglMDhseCwlcCwlcywlcCwlZCksIHN0dWJcbiIsCi0JCWxvY2FsZSxmbGFncyx4dGltZSxmb3JtYXQsZGF0ZSxkYXRlbGVuCi0JKTsKLQlsc3RyY3B5bjMyQShkYXRlLCIxLjQuMTk5NyIsZGF0ZWxlbik7Ci0JcmV0dXJuIHN0cmxlbigiMS40LjE5OTciKTsKKwkJCSAgICAgIExQQ1NUUiBmb3JtYXQsIExQU1RSIGRhdGUsSU5UMzIgZGF0ZWxlbikgCit7CisgIFBBUlNJTkdfU1RBVEUgc3RhdGU7ICAgCisgIGNoYXIgYnVmWzQwXTsKKyAgaW50IGJ1ZmxlbjsKKyAgTFBDU1RSIHRoaXNmb3JtYXQ7CisKKyAgZHByaW50Zl9pbmZvKG9sZSwiR2V0RGF0ZUZvcm1hdCgweCUwNGx4LDB4JTA4bHgsJXAsJXMsJXAsJWQpXG4iLAorCSAgICAgIGxvY2FsZSxmbGFncyx4dGltZSxmb3JtYXQsZGF0ZSxkYXRlbGVuKTsKKworICAvKiBGSVhNRTogR2V0IHRoZSBkZWZhdWx0IGZvciB0aGlzIGxvY2FsZSAqLworICBpZiAoZm9ybWF0KSB7CisgICAgdGhpc2Zvcm1hdCA9IGZvcm1hdDsKKyAgfSBlbHNlIHsKKyAgICB0aGlzZm9ybWF0ID0gInl5eXktTU0tZGQgKGRkZCkgIjsKKyAgfTsKKworICAKKyAgLyogaW5pdGlhbGl6ZSBzdGF0ZSB2YXJpYWJsZXMgKi8KKyAgc3RhdGUuaW5wb3MgPSBzdGF0ZS5vdXRwb3MgPSAwOworICBzdGF0ZS5jb3VudCA9IHN0YXRlLmlucXVvdGUgPSAwOworICBzdGF0ZS50eXBlID0gJ1wwJzsKKyAgLyogaW5pdGlhbGlzZSBvdXRwdXQgYnVmZmVyICovCisgIGRhdGVbMF0gPSAnXDAnOworICAgICAgCisgIGZvciAoc3RhdGUuaW5wb3MgPSAwOyB0aGlzZm9ybWF0W3N0YXRlLmlucG9zXSA7IHN0YXRlLmlucG9zKyspIHsKKyAgICAgICBpZiAoc3RhdGUuaW5xdW90ZSkgeworCSAgICBpZiAodGhpc2Zvcm1hdFtzdGF0ZS5pbnBvc10gPT0gJ1wnJykgeworCQkgc3RhdGUuaW5xdW90ZSA9IDA7CisJCSBjb250aW51ZTsKKwkgICAgfSBlbHNlIHsKKwkJIGRhdGVbc3RhdGUub3V0cG9zKytdID0gdGhpc2Zvcm1hdFtzdGF0ZS5pbnBvc107CisJICAgIH07CSAgICAKKyAgICAgICB9IGVsc2UgaWYgKCAoc3RhdGUuY291bnQgJiYgKHRoaXNmb3JtYXRbc3RhdGUuaW5wb3NdICE9IHN0YXRlLnR5cGUpKSAKKwkJICAgfHwgc3RhdGUuY291bnQgPT0gNCAKKwkJICAgfHwgKHN0YXRlLmNvdW50ID09IDIgJiYgc3RhdGUudHlwZSA9PSAnZycgKSApIAorICAgICAgIHsKKwkgICAgLyogZW5kIG9mIGEgZm9ybWF0LXR5cGUgc3RyaW5nICovCisJICAgIGlmICAgICAgICAgKHN0YXRlLnR5cGUgPT0gJ2QnKSB7CisJCSBpZiAgICAgICAgKHN0YXRlLmNvdW50ID09IDEpIHsKKwkJICAgICAgc3ByaW50ZihidWYsICIlZCIsIHh0aW1lLT53RGF5KTsKKwkJIH0gZWxzZSBpZiAoc3RhdGUuY291bnQgPT0gMikgeworCQkgICAgICBzcHJpbnRmKGJ1ZiwgIiUwMmQiLCB4dGltZS0+d0RheSk7CisJCSB9IGVsc2UgaWYgKHN0YXRlLmNvdW50ID09IDMpIHsKKwkJICAgICAgLyogZGF5IG9mIHdlZWssIHNob3J0ICovCisJCSAgICAgIC8qIEZJWE1FOiBUaGlzIGlzIHRoZSB3YXkgdG8gZG8gaXQgZXZlcnl3aGVyZSAqLworCQkgICAgICBpZiAobG9jYWxlKSB7CisJCQkgICAKKwkJCSAgIEdldExvY2FsZUluZm8zMkEobG9jYWxlLCAKKwkJCQkJICAgIExPQ0FMRV9TQUJCUkVWREFZTkFNRTEgCisJCQkJCSAgICArIHh0aW1lLT53RGF5T2ZXZWVrIC0gMSwKKwkJCQkJICAgIGJ1Ziwgc2l6ZW9mKGJ1ZikpOworCQkgICAgICB9IGVsc2UgeworCQkJICAgc3RyY3B5KGJ1ZiwgCisJCQkJICBhbnlfbG9jYWxlX2RheXNbeHRpbWUtPndEYXlPZldlZWsgLTFdKTsKKwkJICAgICAgfTsKKwkJIH0gZWxzZSBpZiAoc3RhdGUuY291bnQgPT0gNCkgeworCQkgICAgICAvKiBkYXkgb2Ygd2VlaywgbG9uZyAqLworCisJCSAgICAgIC8qIEZJWE1FOiBnZXQgdGhlIGRheXMgZnJvbSB0aGUgbG9jYWxlICovCisJCSAgICAgIC8qIEZJWE1FOiB0aGVzZSBzaG91bGQgYmUgbG9uZyBkYXlzICovCisJCSAgICAgIHNwcmludGYoYnVmLCAiJS4qcyIsIChpbnQpIHNpemVvZihidWYpLAorCQkJICAgICAgYW55X2xvY2FsZV9kYXlzW3h0aW1lLT53RGF5T2ZXZWVrXSk7CisJCSB9IGVsc2UgeworCQkgICAgICBkcHJpbnRmX2luZm8ob2xlLCAKKwkJCQkgICJHZXREYXRlRm9ybWF0KCk6IHVuYmVrYW5udCBmb3JtYXQsIFwKK2M9JWMsIG49JWRcbiIsCisJCQkJICBzdGF0ZS50eXBlLCBzdGF0ZS5jb3VudCk7CisJCSB9OworCSAgICB9IGVsc2UgaWYgKHN0YXRlLnR5cGUgPT0gJ00nKSB7CisJCSBpZiAgICAgICAgKHN0YXRlLmNvdW50ID09IDEpIHsKKwkJICAgICAgc3ByaW50ZihidWYsICIlZCIsIHh0aW1lLT53TW9udGgpOworCQkgfSBlbHNlIGlmIChzdGF0ZS5jb3VudCA9PSAyKSB7CisJCSAgICAgIHNwcmludGYoYnVmLCAiJTAyZCIsIHh0aW1lLT53TW9udGgpOworCQkgfSBlbHNlIGlmIChzdGF0ZS5jb3VudCA9PSAzKSB7CisJCSAgICAgIC8qIEZJWE1FOiBnZXQgdGhlIG1vbnRoLW5hbWUgZnJvbSB0aGUgbG9jYWxlICovCisJCSAgICAgIHNwcmludGYoYnVmLCAiJS4qcyIsIChpbnQpIHNpemVvZihidWYpLAorCQkJICAgICAgYW55X2xvY2FsZV9tb250aHNbeHRpbWUtPndNb250aF0pOworCQkgfSBlbHNlIGlmIChzdGF0ZS5jb3VudCA9PSA0KSB7CisJCSAgICAgIC8qIEZJWE1FOiBnZXQgdGhlIG1vbnRoLW5hbWUgZnJvbSB0aGUgbG9jYWxlICovCisJCSAgICAgIC8qIEZJWE1FOiBzaG91bGQgcmV0dXJuIGEgbG9uZyBtb250aCAqLworCQkgICAgICBzcHJpbnRmKGJ1ZiwgIiUuKnMiLCAoaW50KSBzaXplb2YoYnVmKSwgCisJCQkgICAgICBhbnlfbG9jYWxlX21vbnRoc1t4dGltZS0+d01vbnRoXSk7CisJCSB9IGVsc2UgeworCQkgICAgICBkcHJpbnRmX2luZm8ob2xlLCAKKwkJCSAgIkdldERhdGVGb3JtYXQoKTogdW5iZWthbm50IGZvcm1hdCwgYz0lYywgbj0lZFxuIiwKKwkJCQkgIHN0YXRlLnR5cGUsIHN0YXRlLmNvdW50KTsKKwkJIH07CisJICAgIH0gZWxzZSBpZiAoc3RhdGUudHlwZSA9PSAneScpIHsKKwkJIGlmICAgICAgICAoc3RhdGUuY291bnQgPT0gMSkgeworCQkgICAgICBzcHJpbnRmKGJ1ZiwgIiVkIiwgeHRpbWUtPndZZWFyICUgMTAwKTsKKwkJIH0gZWxzZSBpZiAoc3RhdGUuY291bnQgPT0gMikgeworCQkgICAgICBzcHJpbnRmKGJ1ZiwgIjAyJWQiLCB4dGltZS0+d1llYXIgJSAxMDApOworCQkgfSBlbHNlIGlmIChzdGF0ZS5jb3VudCA9PSA0KSB7CisJCSAgICAgIHNwcmludGYoYnVmLCAiJWQiLCB4dGltZS0+d1llYXIpOworCQkgfSBlbHNlIHsKKwkJICAgICAgZHByaW50Zl9pbmZvKG9sZSwgCisJCQkgIkdldERhdGVGb3JtYXQoKTogdW5iZWthbm50IGZvcm1hdCwgYz0lYywgbj0lZFxuIiwKKwkJCQkgIHN0YXRlLnR5cGUsIHN0YXRlLmNvdW50KTsKKwkJIH07CisJICAgIH0gZWxzZSBpZiAoc3RhdGUudHlwZSA9PSAnZycpIHsKKwkJIGlmICAgICAgICAoc3RhdGUuY291bnQgPT0gMikgeworCQkgICAgICAvKiBGSVhNRTogR2V0IGVyYSBmcm9tIHRoZSBsb2NhbGUgKi8KKwkJICAgICAgc3RyY3B5KGJ1ZiwgIkFEIChDRSkiKTsKKwkJIH0gZWxzZSB7CisJCSAgICAgIGRwcmludGZfaW5mbyhvbGUsIAorCQkJICJHZXREYXRlRm9ybWF0KCk6IHVuYmVrYW5udCBmb3JtYXQsIGM9JWMsIG49JWQiLAorCQkJCSAgc3RhdGUudHlwZSwgc3RhdGUuY291bnQpOworCQkgfTsKKwkgICAgfSBlbHNlIHsKKwkJIGRwcmludGZfaW5mbyhvbGUsIAorCQkgICAgICJHZXREYXRlRm9ybWF0KCk6IHVuYmVrYW5udCBmb3JtYXQsIGM9JWMsIG49JWRcbiIsCisJCQkgICAgIHN0YXRlLnR5cGUsIHN0YXRlLmNvdW50KTsKKwkgICAgfTsKKwkgICAgYnVmbGVuID0gc3RybGVuKGJ1Zik7CisKKwkgICAgLyogd2UgbmVlZCB0byBjaGVjayB0aGUgbmV4dCBjaGFyIGFnYWluLCBvbmUKKwkgICAgICAgd2F5IG9yIGFub3RoZXIgKi8KKwkgICAgc3RhdGUuaW5wb3MtLTsKKwkgICAgCisgICAgICAgICAgICAvKiBub3csIGFkZCBidWYgdG8gdGhlIG91dHB1dCBidWZmZXIgKi8KKwkgICAgaWYgKHN0YXRlLm91dHBvcyArIGJ1ZmxlbiA8IGRhdGVsZW4pIHsKKwkJIGRhdGVbc3RhdGUub3V0cG9zXSA9ICdcMCc7IC8qIGZvciBzdHJjYXQgdG8gaG9vayBvbiAqLworCQkgc3RyY2F0KGRhdGUsIGJ1Zik7CisJCSBzdGF0ZS5vdXRwb3MgKz0gYnVmbGVuOworCSAgICB9IGVsc2UgeworCQkgZGF0ZVtzdGF0ZS5vdXRwb3NdID0gJ1wwJzsKKwkJIHN0cm5jYXQoZGF0ZSwgYnVmLCBkYXRlbGVuIC0gc3RhdGUub3V0cG9zIC0gMSk7CisJCSBkYXRlW2RhdGVsZW4gLSAxXSA9ICdcMCc7CisJCSBTZXRMYXN0RXJyb3IoRVJST1JfSU5TVUZGSUNJRU5UX0JVRkZFUik7CisJCSByZXR1cm4gMDsKKwkgICAgfTsKKworCSAgICAvKiByZXNldCBvdGhlciB2YXJpYWJsZXMgKi8KKwkgICAgc3RhdGUuY291bnQgPSAwOworCSAgICBzdGF0ZS50eXBlID0gJ1wwJzsKKworCSAgICAvKiBlbmQgb2YgY29kZSBmb3IgcHJpbnRpbmcgZm9ybWF0LXN0cmluZ3MgKi8KKyAgICAgICB9IGVsc2UgaWYgKHN0YXRlLmNvdW50KSB7CisJICAgIC8qIGFuZCBjaGFyIGlzIG9mIHNhbWUgdHlwZSAoc2VlIGFib3ZlKSAqLworCSAgICBzdGF0ZS5jb3VudCArPSAxOzsKKyAgICAgICB9IGVsc2UgaWYgKHN0cmNocigieU1kZyIsIHRoaXNmb3JtYXRbc3RhdGUuaW5wb3NdKSkgeworCSAgICBzdGF0ZS50eXBlID0gdGhpc2Zvcm1hdFtzdGF0ZS5pbnBvc107CisJICAgIHN0YXRlLmNvdW50ID0gMTsKKyAgICAgICB9IGVsc2UgaWYgKHRoaXNmb3JtYXRbc3RhdGUuaW5wb3NdID09ICdcJycpIHsKKwkgICAgc3RhdGUuaW5xdW90ZSA9IDE7CisgICAgICAgfSBlbHNlIHsKKwkgICAgZGF0ZVtzdGF0ZS5vdXRwb3MrK10gPSB0aGlzZm9ybWF0W3N0YXRlLmlucG9zXTsKKyAgICAgICB9OworICAgICBpZiAoc3RhdGUub3V0cG9zID49IGRhdGVsZW4pIHsKKyAgICAgICBkYXRlW2RhdGVsZW4gLSAxXSA9ICdcMCc7CisgICAgICAgU2V0TGFzdEVycm9yKEVSUk9SX0lOU1VGRklDSUVOVF9CVUZGRVIpOworICAgICAgIHJldHVybiAwOworICAgICB9OworICAgfTsKKworICBzdGF0ZS5vdXRwb3MrKzsKKyAgaWYgKHN0YXRlLm91dHBvcyA+PSBkYXRlbGVuIC0gMSkgeworICAgICAgIHN0YXRlLm91dHBvcyA9IGRhdGVsZW4gLSAxOworICB9OworCisgIGRhdGVbc3RhdGUub3V0cG9zXSA9ICdcMCc7CisKKyAgIGRwcmludGZfaW5mbyhvbGUsIAorCSAgICAgICAiR2V0RGF0ZUZvcm1hdDMyQSgpIHJldHVybmluZyAlZCwgd2l0aCBkYXRhPSVzXG4iLAorCSAgICAgICBzdGF0ZS5vdXRwb3MsIGRhdGUpOworICAgcmV0dXJuIHN0YXRlLm91dHBvczsKIH0KIAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgorICogR2V0VGltZUZvcm1hdCgpIAorCisgRm9ybWF0cyBkYXRlIGFjY29yZGluZyB0byBmb3JtYXQsICBvciBsb2NhbGUgZGVmYXVsdCBpZiBmb3JtYXQgaXMgTlVMTC4KKyBUaGUgZm9ybWF0IGNvbnNpc3RzIG9mIGxpdGVyYWwgY2hhcmFjdGVycyBhbmQgZmllbGRzIGFzIGZvbGxvd3M6CisKKyBoICBob3VycyB3aXRoIG5vIGxlYWRpbmcgemVybyAoMTItaG91cikKKyBoaCBob3VycyB3aXRoIGZ1bGwgdHdvIGRpZ2l0cworIEggIGhvdXJzIHdpdGggbm8gbGVhZGluZyB6ZXJvICgyNC1ob3VyKQorIEhIIGhvdXJzIHdpdGggZnVsbCB0d28gZGlnaXRzCisgbSAgbWludXRlcyB3aXRoIG5vIGxlYWRpbmcgemVybworIG1tIG1pbnV0ZXMgd2l0aCBmdWxsIHR3byBkaWdpdHMKKyBzICBzZWNvbmRzIHdpdGggbm8gbGVhZGluZyB6ZXJvCisgc3Mgc2Vjb25kcyB3aXRoIGZ1bGwgdHdvIGRpZ2l0cworIHQgIHRpbWUgbWFya2VyIChBIG9yIFApCisgdHQgdGltZSBtYXJrZXIgKEFNLCBQTSkKKworICovCisKIElOVDMyIFdJTkFQSSBHZXRUaW1lRm9ybWF0MzJBKExDSUQgbG9jYWxlLERXT1JEIGZsYWdzLExQU1lTVEVNVElNRSB4dGltZSwKIAkJCSAgICAgIExQQ1NUUiBmb3JtYXQsIExQU1RSIHRpbWVzdHIsSU5UMzIgdGltZWxlbgogKSB7Ci0JZnByaW50ZihzdGRlcnIsIkdldERhdGVGb3JtYXQoMHglMDRseCwweCUwOGx4LCVwLCVzLCVwLCVkKSwgc3R1YlxuIiwKKyAgIGRwcmludGZfaW5mbyhvbGUsIkdldFRpbWVGb3JtYXQoMHglMDRseCwweCUwOGx4LCVwLCVzLCVwLCVkKSwgc3R1YlxuIiwKIAkJbG9jYWxlLGZsYWdzLHh0aW1lLGZvcm1hdCx0aW1lc3RyLHRpbWVsZW4KIAkpOworICAgCisgICAvKiBGSVhNRTogaW1wbGVtZW50IHRoaXMgb25lLiAgUGVyaGFwcyBhIGNvbW1vbiBjb2RlYmFzZT8gKi8KKworCisKKworCiAJbHN0cmNweW4zMkEodGltZXN0ciwiMDA6MDA6NDIiLHRpbWVsZW4pOwogCXJldHVybiBzdHJsZW4oIjAwOjAwOjQyIik7CiB9CisKKworCisKZGlmZiAtLWdpdCBhL29sZS9vbGVjbGkuYyBiL29sZS9vbGVjbGkuYwppbmRleCBhMjE4MjEzLi5iYzYzZWYxIDEwMDY0NAotLS0gYS9vbGUvb2xlY2xpLmMKKysrIGIvb2xlL29sZWNsaS5jCkBAIC0xMCw3ICsxMCw2IEBACiAjaW5jbHVkZSAid2luZG93cy5oIgogI2luY2x1ZGUgIm9sZS5oIgogI2luY2x1ZGUgImdkaS5oIgotI2luY2x1ZGUgInN0ZGRlYnVnLmgiCiAjaW5jbHVkZSAiZGVidWcuaCIKIAogZXh0ZXJuIExPTkcJT0xFX2N1cnJlbnRfaGFuZGxlOwpAQCAtMTExLDcgKzExMCw3IEBACiAgKi8KIEJPT0wxNiBXSU5BUEkgT2xlSXNEY01ldGEoSERDMTYgaGRjKQogewotCWRwcmludGZfb2xlKHN0ZGRlYiwiT2xlSXNEQ01ldGEoJTA0eClcbiIsaGRjKTsKKwlkcHJpbnRmX2luZm8ob2xlLCJPbGVJc0RDTWV0YSglMDR4KVxuIixoZGMpOwogCXJldHVybiBHRElfR2V0T2JqUHRyKCBoZGMsIE1FVEFGSUxFX0RDX01BR0lDICkgIT0gMDsKIH0KIApkaWZmIC0tZ2l0IGEvb2xlL29sZXN2ci5jIGIvb2xlL29sZXN2ci5jCmluZGV4IGFkNjhlYjEuLjE4NjQ3NWUgMTAwNjQ0Ci0tLSBhL29sZS9vbGVzdnIuYworKysgYi9vbGUvb2xlc3ZyLmMKQEAgLTksNyArOSw2IEBACiAKICNpbmNsdWRlICJ3aW5kb3dzLmgiCiAjaW5jbHVkZSAib2xlLmgiCi0jaW5jbHVkZSAic3RkZGVidWcuaCIKICNpbmNsdWRlICJkZWJ1Zy5oIgogCiBMT05HCU9MRV9jdXJyZW50X2hhbmRsZTsKQEAgLTIxLDcgKzIwLDcgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTEhTRVJWRVIgKmhSZXQsIEhJTlNUQU5DRTE2IGhTZXJ2ZXIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9MRV9TRVJWRVJfVVNFIHVzZSApCiB7Ci0gICAgZHByaW50Zl9vbGUoc3RkbmltcCwiT2xlUmVnaXN0ZXJTZXJ2ZXI6JXNcbiIsbmFtZSk7CisgICAgZHByaW50Zl9maXhtZShvbGUsIk9sZVJlZ2lzdGVyU2VydmVyOiVzIC0gc3R1YlxuIixuYW1lKTsKICAgICAqaFJldD0rK09MRV9jdXJyZW50X2hhbmRsZTsKICAgICAvKiByZXR1cm4gT0xFX0VSUk9SX01FTU9SWSwgT0xFX0VSUk9SX1BST1RFQ1RfT05MWSBpZiB5b3Ugd2FudCBpdCBmYWlsKi8KICAgICByZXR1cm4gT0xFX09LOwpAQCAtNzQsNyArNzMsOCBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMUE9MRVNFUlZFUkRPQyBkb2N1bWVudCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTEhTRVJWRVJET0MgKmhSZXQpCiB7Ci0gICAgZHByaW50Zl9vbGUoc3RkbmltcCwiT2xlUmVnaXN0ZXJTZXJ2ZXJEb2M6JWxkLCVzXG4iLCBoU2VydmVyLCBkb2NuYW1lKTsKKyAgICBkcHJpbnRmX2ZpeG1lKG9sZSwiT2xlUmVnaXN0ZXJTZXJ2ZXJEb2M6JWxkLCVzIC0gc3R1YlxuIiwgCisJCWhTZXJ2ZXIsIGRvY25hbWUpOwogICAgICpoUmV0PSsrT0xFX2N1cnJlbnRfaGFuZGxlOwogICAgIHJldHVybiBPTEVfT0s7CiB9CkBAIC04NCw3ICs4NCw3IEBACiAgKi8KIE9MRVNUQVRVUyBXSU5BUEkgT2xlUmV2b2tlU2VydmVyRG9jMTYoTEhTRVJWRVJET0MgaFNlcnZlckRvYykKIHsKLSAgICBkcHJpbnRmX29sZShzdGRuaW1wLCJPbGVSZXZva2VTZXJ2ZXJEb2M6JWxkXG4iLGhTZXJ2ZXJEb2MpOworICAgIGRwcmludGZfZml4bWUob2xlLCJPbGVSZXZva2VTZXJ2ZXJEb2M6JWxkICAtIHN0dWJcbiIsaFNlcnZlckRvYyk7CiAgICAgcmV0dXJuIE9MRV9PSzsKIH0KIApAQCAtMTAyLDcgKzEwMiw3IEBACiAgKi8KIE9MRVNUQVRVUyBXSU5BUEkgT2xlUmV2b2tlU2VydmVyKExIU0VSVkVSIGhTZXJ2ZXIpCiB7Ci0gICAgZHByaW50Zl9vbGUoc3RkbmltcCwiT2xlUmV2b2tlU2VydmVyOiVsZFxuIixoU2VydmVyKTsKKyAgICBkcHJpbnRmX2ZpeG1lKG9sZSwiT2xlUmV2b2tlU2VydmVyOiVsZCAtIHN0dWJcbiIsaFNlcnZlcik7CiAgICAgcmV0dXJuIE9MRV9PSzsKIH0KIApkaWZmIC0tZ2l0IGEvb2xlL3N0b3JhZ2UuYyBiL29sZS9zdG9yYWdlLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDZkNjdhOAotLS0gL2Rldi9udWxsCisrKyBiL29sZS9zdG9yYWdlLmMKQEAgLTAsMCArMSwxNTk1IEBACisvKiBDb21wb3VuZCBTdG9yYWdlCisgKgorICogSW1wbGVtZW50ZWQgdXNpbmcgdGhlIGRvY3VtZW50YXRpb24gb2YgdGhlIExBT0xBIHByb2plY3QgYXQKKyAqIDxVUkw6aHR0cDovL3d3d3dicy5jcy50dS1iZXJsaW4uZGUvfnNjaHdhcnR6L3BtaC9pbmRleC5odG1sPgorICogKFRoYW5rcyB0byBNYXJ0aW4gU2Nod2FydHogPHNjaHdhcnR6QGNzLnR1LWJlcmxpbi5kZT4pCisgKgorICogQ29weXJpZ2h0IDE5OTggTWFyY3VzIE1laXNzbmVyCisgKi8KKworI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8YXNzZXJ0Lmg+CisjaW5jbHVkZSA8dGltZS5oPgorI2luY2x1ZGUgPHN0cmluZy5oPgorI2luY2x1ZGUgIndpbmRvd3MuaCIKKyNpbmNsdWRlICJ3aW5lcnJvci5oIgorI2luY2x1ZGUgImZpbGUuaCIKKyNpbmNsdWRlICJvbGUuaCIKKyNpbmNsdWRlICJvbGUyLmgiCisjaW5jbHVkZSAiY29tcG9iai5oIgorI2luY2x1ZGUgImludGVyZmFjZXMuaCIKKyNpbmNsdWRlICJzdG9yYWdlLmgiCisjaW5jbHVkZSAiaGVhcC5oIgorI2luY2x1ZGUgIm1vZHVsZS5oIgorI2luY2x1ZGUgImxkdC5oIgorI2luY2x1ZGUgImRlYnVnLmgiCisjaW5jbHVkZSAiZGVidWdzdHIuaCIKKworc3RhdGljIGNvbnN0IEJZVEUgU1RPUkFHRV9tYWdpY1s4XSAgID17MHhkMCwweGNmLDB4MTEsMHhlMCwweGExLDB4YjEsMHgxYSwweGUxfTsKK3N0YXRpYyBjb25zdCBCWVRFIFNUT1JBR0Vfbm90bWFnaWNbOF09ezB4MGUsMHgxMSwweGZjLDB4MGQsMHhkMCwweGNmLDB4MTEsMHhlMH07CitzdGF0aWMgY29uc3QgQllURSBTVE9SQUdFX29sZG1hZ2ljWzhdPXsweGQwLDB4Y2YsMHgxMSwweGUwLDB4MGUsMHgxMSwweGZjLDB4MGR9OworCisjZGVmaW5lIEJJR1NJWkUJCTUxMgorI2RlZmluZSBTTUFMTFNJWkUJCTY0CisKKyNkZWZpbmUgU01BTExCTE9DS1NfUEVSX0JJR0JMT0NLCShCSUdTSVpFL1NNQUxMU0laRSkKKworI2RlZmluZSBSRUFEX0hFQURFUglhc3NlcnQoU1RPUkFHRV9nZXRfYmlnX2Jsb2NrKGhmLC0xLChMUEJZVEUpJnN0aCkpO2Fzc2VydCghbWVtY21wKFNUT1JBR0VfbWFnaWMsc3RoLm1hZ2ljLHNpemVvZihTVE9SQUdFX21hZ2ljKSkpOworc3RhdGljIElTdG9yYWdlMTZfVlRhYmxlIHN0dnQxNjsKK3N0YXRpYyBJU3RvcmFnZTE2X1ZUYWJsZSAqc2Vnc3R2dDE2ID0gTlVMTDsKK3N0YXRpYyBJU3RvcmFnZTMyX1ZUYWJsZSBzdHZ0MzI7CitzdGF0aWMgSVN0cmVhbTE2X1ZUYWJsZSBzdHJ2dDE2Oworc3RhdGljIElTdHJlYW0xNl9WVGFibGUgKnNlZ3N0cnZ0MTYgPSBOVUxMOworc3RhdGljIElTdHJlYW0zMl9WVGFibGUgc3RydnQzMjsKKworVUxPTkcgV0lOQVBJIElTdG9yYWdlMTZfQWRkUmVmKExQU1RPUkFHRTE2IHRoaXMpOworc3RhdGljIHZvaWQgX2NyZWF0ZV9pc3RvcmFnZTE2KExQU1RPUkFHRTE2ICpzdGcpOworc3RhdGljIHZvaWQgX2NyZWF0ZV9pc3RyZWFtMTYoTFBTVFJFQU0xNiAqc3RyKTsKKworI2RlZmluZSBJTVBMRU1FTlRFRCAxCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIFJlYWRpbmcgT0xFIGNvbXBvdW5kIHN0b3JhZ2UKKyAqLworc3RhdGljIEJPT0wzMgorU1RPUkFHRV9nZXRfYmlnX2Jsb2NrKEhGSUxFMzIgaGYsaW50IG4sQllURSAqYmxvY2spIHsKKwlhc3NlcnQobj49LTEpOworCWlmICgtMT09X2xsc2VlazMyKGhmLChuKzEpKkJJR1NJWkUsU0VFS19TRVQpKSB7CisJCWZwcmludGYoc3RkZXJyLCJTVE9SQUdFX2dldF9iaWdfYmxvY2s6IHNlZWsgZmFpbGVkICglbGQpXG4iLEdldExhc3RFcnJvcigpKTsKKwkJcmV0dXJuIEZBTFNFOworCX0KKwlhc3NlcnQoKG4rMSkqQklHU0laRT09X2xsc2VlazMyKGhmLDAsU0VFS19DVVIpKTsKKwlpZiAoQklHU0laRSE9X2xyZWFkMzIoaGYsYmxvY2ssQklHU0laRSkpIHsKKwkJZnByaW50ZihzdGRlcnIsIlNUT1JBR0VfZ2V0X2JpZ19ibG9jayglZCk6IHJlYWQgZGlkbid0ICglbGQpXG4iLG4sR2V0TGFzdEVycm9yKCkpOworCQlhc3NlcnQoMCk7CisJCXJldHVybiBGQUxTRTsKKwl9CisJcmV0dXJuIFRSVUU7Cit9CisKK3N0YXRpYyBCT09MMzIKK1NUT1JBR0VfcHV0X2JpZ19ibG9jayhIRklMRTMyIGhmLGludCBuLEJZVEUgKmJsb2NrKSB7CisJYXNzZXJ0KG4+PS0xKTsKKwlpZiAoLTE9PV9sbHNlZWszMihoZiwobisxKSpCSUdTSVpFLFNFRUtfU0VUKSkgeworCQlmcHJpbnRmKHN0ZGVyciwiU1RPUkFHRV9wdXRfYmlnX2Jsb2NrOiBzZWVrIGZhaWxlZCAoJWxkKVxuIixHZXRMYXN0RXJyb3IoKSk7CisJCXJldHVybiBGQUxTRTsKKwl9CisJYXNzZXJ0KChuKzEpKkJJR1NJWkU9PV9sbHNlZWszMihoZiwwLFNFRUtfQ1VSKSk7CisJaWYgKEJJR1NJWkUhPV9sd3JpdGUzMihoZixibG9jayxCSUdTSVpFKSkgeworCQlmcHJpbnRmKHN0ZGVyciwiU1RPUkFHRV9wdXRfYmlnX2Jsb2NrOiB3cml0ZSBmYWlsZWQgKCVsZClcbiIsR2V0TGFzdEVycm9yKCkpOworCQlyZXR1cm4gRkFMU0U7CisJfQorCXJldHVybiBUUlVFOworfQorCitzdGF0aWMgaW50CitTVE9SQUdFX2dldF9uZXh0X2JpZ19ibG9ja25yKEhGSUxFMzIgaGYsaW50IGJsb2NrbnIpIHsKKwlJTlQzMgliYnNbQklHU0laRS9zaXplb2YoSU5UMzIpXTsKKwlzdHJ1Y3QJc3RvcmFnZV9oZWFkZXIJc3RoOworCisJUkVBRF9IRUFERVI7CisJCisJYXNzZXJ0KGJsb2NrbnI+Pjc8c3RoLm51bV9vZl9iYmRfYmxvY2tzKTsKKwlpZiAoc3RoLmJiZF9saXN0W2Jsb2NrbnI+PjddPT0weGZmZmZmZmZmKQorCQlyZXR1cm4gLTU7CisJaWYgKCFTVE9SQUdFX2dldF9iaWdfYmxvY2soaGYsc3RoLmJiZF9saXN0W2Jsb2NrbnI+PjddLChMUEJZVEUpYmJzKSkKKwkJcmV0dXJuIC01OworCWFzc2VydChiYnNbYmxvY2tuciYweDdmXSE9U1RPUkFHRV9DSEFJTkVOVFJZX0ZSRUUpOworCXJldHVybiBiYnNbYmxvY2tuciYweDdmXTsKK30KKworc3RhdGljIGludAorU1RPUkFHRV9nZXRfbnRoX25leHRfYmlnX2Jsb2NrbnIoSEZJTEUzMiBoZixpbnQgYmxvY2tucixpbnQgbnIpIHsKKwlJTlQzMgliYnNbQklHU0laRS9zaXplb2YoSU5UMzIpXTsKKwlpbnQJbGFzdGJsb2NrID0gLTE7CisJc3RydWN0IHN0b3JhZ2VfaGVhZGVyIHN0aDsKKworCVJFQURfSEVBREVSOworCQorCWFzc2VydChibG9ja25yPj0wKTsKKwl3aGlsZSAobnItLSkgeworCQlhc3NlcnQoKGJsb2NrbnI+PjcpPHN0aC5udW1fb2ZfYmJkX2Jsb2Nrcyk7CisJCWFzc2VydChzdGguYmJkX2xpc3RbYmxvY2tucj4+N10hPTB4ZmZmZmZmZmYpOworCisJCS8qIHNpbXBsZSBjYWNoaW5nLi4uICovCisJCWlmIChsYXN0YmxvY2shPXN0aC5iYmRfbGlzdFtibG9ja25yPj43XSkgeworCQkJYXNzZXJ0KFNUT1JBR0VfZ2V0X2JpZ19ibG9jayhoZixzdGguYmJkX2xpc3RbYmxvY2tucj4+N10sKExQQllURSliYnMpKTsKKwkJCWxhc3RibG9jayA9IHN0aC5iYmRfbGlzdFtibG9ja25yPj43XTsKKwkJfQorCQlibG9ja25yID0gYmJzW2Jsb2NrbnImMHg3Zl07CisJfQorCXJldHVybiBibG9ja25yOworfQorCisKK3N0YXRpYyBCT09MMzIKK1NUT1JBR0VfZ2V0X3Jvb3RfcHBzX2VudHJ5KEhGSUxFMzIgaGYsc3RydWN0IHN0b3JhZ2VfcHBzX2VudHJ5ICpwc3RkZSkgeworCWludAlibG9ja25yLGk7CisJQllURQlibG9ja1tCSUdTSVpFXTsKKwlzdHJ1Y3Qgc3RvcmFnZV9wcHNfZW50cnkJKnN0ZGU9KHN0cnVjdCBzdG9yYWdlX3Bwc19lbnRyeSopYmxvY2s7CisJc3RydWN0IHN0b3JhZ2VfaGVhZGVyIHN0aDsKKworCVJFQURfSEVBREVSOworCWJsb2NrbnIgPSBzdGgucm9vdF9zdGFydGJsb2NrOworCXdoaWxlIChibG9ja25yPj0wKSB7CisJCWFzc2VydChTVE9SQUdFX2dldF9iaWdfYmxvY2soaGYsYmxvY2tucixibG9jaykpOworCQlmb3IgKGk9MDtpPDQ7aSsrKSB7CisJCQlpZiAoIXN0ZGVbaV0ucHBzX3NpemVvZm5hbWUpCisJCQkJY29udGludWU7CisJCQlpZiAoc3RkZVtpXS5wcHNfdHlwZT09NSkgeworCQkJCSpwc3RkZT1zdGRlW2ldOworCQkJCXJldHVybiBUUlVFOworCQkJfQorCQl9CisJCWJsb2NrbnI9U1RPUkFHRV9nZXRfbmV4dF9iaWdfYmxvY2tucihoZixibG9ja25yKTsKKwl9CisJcmV0dXJuIEZBTFNFOworfQorCitzdGF0aWMgQk9PTDMyCitTVE9SQUdFX2dldF9zbWFsbF9ibG9jayhIRklMRTMyIGhmLGludCBibG9ja25yLEJZVEUgKnNibG9jaykgeworCUJZVEUJCQkJYmxvY2tbQklHU0laRV07CisJaW50CQkJCWJpZ2Jsb2NrbnI7CisJc3RydWN0IHN0b3JhZ2VfcHBzX2VudHJ5CXJvb3Q7CisKKwlhc3NlcnQoYmxvY2tucj49MCk7CisJYXNzZXJ0KFNUT1JBR0VfZ2V0X3Jvb3RfcHBzX2VudHJ5KGhmLCZyb290KSk7CisJYmlnYmxvY2tuciA9IFNUT1JBR0VfZ2V0X250aF9uZXh0X2JpZ19ibG9ja25yKGhmLHJvb3QucHBzX3NiLGJsb2NrbnIvU01BTExCTE9DS1NfUEVSX0JJR0JMT0NLKTsKKwlhc3NlcnQoYmlnYmxvY2tucj49MCk7CisJYXNzZXJ0KFNUT1JBR0VfZ2V0X2JpZ19ibG9jayhoZixiaWdibG9ja25yLGJsb2NrKSk7CisKKwltZW1jcHkoc2Jsb2NrLCgoTFBCWVRFKWJsb2NrKStTTUFMTFNJWkUqKGJsb2NrbnImKFNNQUxMQkxPQ0tTX1BFUl9CSUdCTE9DSy0xKSksU01BTExTSVpFKTsKKwlyZXR1cm4gVFJVRTsKK30KKworc3RhdGljIEJPT0wzMgorU1RPUkFHRV9wdXRfc21hbGxfYmxvY2soSEZJTEUzMiBoZixpbnQgYmxvY2tucixCWVRFICpzYmxvY2spIHsKKwlCWVRFCQkJCWJsb2NrW0JJR1NJWkVdOworCWludAkJCQliaWdibG9ja25yOworCXN0cnVjdCBzdG9yYWdlX3Bwc19lbnRyeQlyb290OworCisJYXNzZXJ0KGJsb2NrbnI+PTApOworCisJYXNzZXJ0KFNUT1JBR0VfZ2V0X3Jvb3RfcHBzX2VudHJ5KGhmLCZyb290KSk7CisJYmlnYmxvY2tuciA9IFNUT1JBR0VfZ2V0X250aF9uZXh0X2JpZ19ibG9ja25yKGhmLHJvb3QucHBzX3NiLGJsb2NrbnIvU01BTExCTE9DS1NfUEVSX0JJR0JMT0NLKTsKKwlhc3NlcnQoYmlnYmxvY2tucj49MCk7CisJYXNzZXJ0KFNUT1JBR0VfZ2V0X2JpZ19ibG9jayhoZixiaWdibG9ja25yLGJsb2NrKSk7CisKKwltZW1jcHkoKChMUEJZVEUpYmxvY2spK1NNQUxMU0laRSooYmxvY2tuciYoU01BTExCTE9DS1NfUEVSX0JJR0JMT0NLLTEpKSxzYmxvY2ssU01BTExTSVpFKTsKKwlhc3NlcnQoU1RPUkFHRV9wdXRfYmlnX2Jsb2NrKGhmLGJpZ2Jsb2NrbnIsYmxvY2spKTsKKwlyZXR1cm4gVFJVRTsKK30KKworCitzdGF0aWMgaW50CitTVE9SQUdFX2dldF9uZXh0X3NtYWxsX2Jsb2NrbnIoSEZJTEUzMiBoZixpbnQgYmxvY2tucikgeworCUJZVEUJCQkJYmxvY2tbQklHU0laRV07CisJTFBJTlQzMgkJCQlzYmQgPSAoTFBJTlQzMilibG9jazsKKwlpbnQJCQkJYmlnYmxvY2tucjsKKwlzdHJ1Y3Qgc3RvcmFnZV9oZWFkZXIJCXN0aDsKKworCVJFQURfSEVBREVSOworCWFzc2VydChibG9ja25yPj0wKTsKKwliaWdibG9ja25yID0gU1RPUkFHRV9nZXRfbnRoX25leHRfYmlnX2Jsb2NrbnIoaGYsc3RoLnNiZF9zdGFydGJsb2NrLGJsb2NrbnIvMTI4KTsKKwlhc3NlcnQoYmlnYmxvY2tucj49MCk7CisJYXNzZXJ0KFNUT1JBR0VfZ2V0X2JpZ19ibG9jayhoZixiaWdibG9ja25yLGJsb2NrKSk7CisJYXNzZXJ0KHNiZFtibG9ja25yICYgMTI3XSE9U1RPUkFHRV9DSEFJTkVOVFJZX0ZSRUUpOworCXJldHVybiBzYmRbYmxvY2tuciAmICgxMjgtMSldOworfQorCitzdGF0aWMgaW50CitTVE9SQUdFX2dldF9udGhfbmV4dF9zbWFsbF9ibG9ja25yKEhGSUxFMzIgaGYsaW50IGJsb2NrbnIsaW50IG5yKSB7CisJaW50CWxhc3RibG9ja25yOworCUJZVEUJYmxvY2tbQklHU0laRV07CisJTFBJTlQzMglzYmQgPSAoTFBJTlQzMilibG9jazsKKwlzdHJ1Y3Qgc3RvcmFnZV9oZWFkZXIgc3RoOworCisJUkVBRF9IRUFERVI7CisJbGFzdGJsb2NrbnI9LTE7CisJYXNzZXJ0KGJsb2NrbnI+PTApOworCXdoaWxlICgobnItLSkgJiYgKGJsb2NrbnI+PTApKSB7CisJCWlmIChsYXN0YmxvY2tuci8xMjghPWJsb2NrbnIvMTI4KSB7CisJCQlpbnQJYmlnYmxvY2tucjsKKwkJCWJpZ2Jsb2NrbnIgPSBTVE9SQUdFX2dldF9udGhfbmV4dF9iaWdfYmxvY2tucihoZixzdGguc2JkX3N0YXJ0YmxvY2ssYmxvY2tuci8xMjgpOworCQkJYXNzZXJ0KGJpZ2Jsb2NrbnI+PTApOworCQkJYXNzZXJ0KFNUT1JBR0VfZ2V0X2JpZ19ibG9jayhoZixiaWdibG9ja25yLGJsb2NrKSk7CisJCQlsYXN0YmxvY2tuciA9IGJsb2NrbnI7CisJCX0KKwkJYXNzZXJ0KGxhc3RibG9ja25yPj0wKTsKKwkJbGFzdGJsb2NrbnI9YmxvY2tucjsKKwkJYmxvY2tucj1zYmRbYmxvY2tuciAmICgxMjgtMSldOworCQlhc3NlcnQoYmxvY2tuciE9U1RPUkFHRV9DSEFJTkVOVFJZX0ZSRUUpOworCX0KKwlyZXR1cm4gYmxvY2tucjsKK30KKworc3RhdGljIGludAorU1RPUkFHRV9nZXRfcHBzX2VudHJ5KEhGSUxFMzIgaGYsaW50IG4sc3RydWN0IHN0b3JhZ2VfcHBzX2VudHJ5ICpwc3RkZSkgeworCWludAlibG9ja25yOworCUJZVEUJYmxvY2tbQklHU0laRV07CisJc3RydWN0IHN0b3JhZ2VfcHBzX2VudHJ5ICpzdGRlID0gKHN0cnVjdCBzdG9yYWdlX3Bwc19lbnRyeSopKCgoTFBCWVRFKWJsb2NrKSsxMjgqKG4mMykpOworCXN0cnVjdCBzdG9yYWdlX2hlYWRlciBzdGg7CisKKwlSRUFEX0hFQURFUjsKKwkvKiB3ZSBoYXZlIDQgcHBzIGVudHJpZXMgcGVyIGJpZyBibG9jayAqLworCWJsb2NrbnIgPSBTVE9SQUdFX2dldF9udGhfbmV4dF9iaWdfYmxvY2tucihoZixzdGgucm9vdF9zdGFydGJsb2NrLG4vNCk7CisJYXNzZXJ0KGJsb2NrbnI+PTApOworCWFzc2VydChTVE9SQUdFX2dldF9iaWdfYmxvY2soaGYsYmxvY2tucixibG9jaykpOworCisJKnBzdGRlPSpzdGRlOworCXJldHVybiAxOworfQorCitzdGF0aWMgaW50CitTVE9SQUdFX3B1dF9wcHNfZW50cnkoSEZJTEUzMiBoZixpbnQgbixzdHJ1Y3Qgc3RvcmFnZV9wcHNfZW50cnkgKnBzdGRlKSB7CisJaW50CWJsb2NrbnI7CisJQllURQlibG9ja1tCSUdTSVpFXTsKKwlzdHJ1Y3Qgc3RvcmFnZV9wcHNfZW50cnkgKnN0ZGUgPSAoc3RydWN0IHN0b3JhZ2VfcHBzX2VudHJ5KikoKChMUEJZVEUpYmxvY2spKzEyOCoobiYzKSk7CisJc3RydWN0IHN0b3JhZ2VfaGVhZGVyIHN0aDsKKworCVJFQURfSEVBREVSOworCisJLyogd2UgaGF2ZSA0IHBwcyBlbnRyaWVzIHBlciBiaWcgYmxvY2sgKi8KKwlibG9ja25yID0gU1RPUkFHRV9nZXRfbnRoX25leHRfYmlnX2Jsb2NrbnIoaGYsc3RoLnJvb3Rfc3RhcnRibG9jayxuLzQpOworCWFzc2VydChibG9ja25yPj0wKTsKKwlhc3NlcnQoU1RPUkFHRV9nZXRfYmlnX2Jsb2NrKGhmLGJsb2NrbnIsYmxvY2spKTsKKwkqc3RkZT0qcHN0ZGU7CisJYXNzZXJ0KFNUT1JBR0VfcHV0X2JpZ19ibG9jayhoZixibG9ja25yLGJsb2NrKSk7CisJcmV0dXJuIDE7Cit9CisKK3N0YXRpYyBpbnQKK1NUT1JBR0VfbG9va19mb3JfbmFtZWRfcHBzKEhGSUxFMzIgaGYsaW50IG4sTFBPTEVTVFIzMiBuYW1lKSB7CisJc3RydWN0IHN0b3JhZ2VfcHBzX2VudHJ5CXN0ZGU7CisJaW50CQkJCXJldDsKKworCWlmIChuPT0tMSkKKwkJcmV0dXJuIC0xOworCWlmICgxIT1TVE9SQUdFX2dldF9wcHNfZW50cnkoaGYsbiwmc3RkZSkpCisJCXJldHVybiAtMTsKKworCWlmICghbHN0cmNtcDMyVyhuYW1lLHN0ZGUucHBzX3Jhd25hbWUpKQorCQlyZXR1cm4gbjsKKwlpZiAoc3RkZS5wcHNfcHJldiAhPSAtMSkgeworCQlyZXQ9U1RPUkFHRV9sb29rX2Zvcl9uYW1lZF9wcHMoaGYsc3RkZS5wcHNfcHJldixuYW1lKTsKKwkJaWYgKHJldCE9LTEpCisJCQlyZXR1cm4gcmV0OworCX0KKwlpZiAoc3RkZS5wcHNfbmV4dCAhPSAtMSkgeworCQlyZXQ9U1RPUkFHRV9sb29rX2Zvcl9uYW1lZF9wcHMoaGYsc3RkZS5wcHNfbmV4dCxuYW1lKTsKKwkJaWYgKHJldCE9LTEpCisJCQlyZXR1cm4gcmV0OworCX0KKwlyZXR1cm4gLTE7Cit9CisKK3N0YXRpYyB2b2lkCitTVE9SQUdFX2R1bXBfcHBzX2VudHJ5KHN0cnVjdCBzdG9yYWdlX3Bwc19lbnRyeSAqc3RkZSkgeworCWNoYXIJbmFtZVszM10seGd1aWRbNTBdOworCisJV0lORV9TdHJpbmdGcm9tQ0xTSUQoJihzdGRlLT5wcHNfZ3VpZCkseGd1aWQpOworCisJbHN0cmNweVd0b0EobmFtZSxzdGRlLT5wcHNfcmF3bmFtZSk7CisJaWYgKCFzdGRlLT5wcHNfc2l6ZW9mbmFtZSkKKwkJcmV0dXJuOworCWZwcmludGYoc3RkZXJyLCJuYW1lOiAlc1xuIixuYW1lKTsKKwlmcHJpbnRmKHN0ZGVyciwidHlwZTogJWRcbiIsc3RkZS0+cHBzX3R5cGUpOworCWZwcmludGYoc3RkZXJyLCJwcmV2IHBwczogJWxkXG4iLHN0ZGUtPnBwc19wcmV2KTsKKwlmcHJpbnRmKHN0ZGVyciwibmV4dCBwcHM6ICVsZFxuIixzdGRlLT5wcHNfbmV4dCk7CisJZnByaW50ZihzdGRlcnIsImRpciBwcHM6ICVsZFxuIixzdGRlLT5wcHNfZGlyKTsKKwlmcHJpbnRmKHN0ZGVyciwiZ3VpZDogJXNcbiIseGd1aWQpOworCWlmIChzdGRlLT5wcHNfdHlwZSAhPTIpIHsKKwkJdGltZV90CXQ7CisKKwkJdCA9IERPU0ZTX0ZpbGVUaW1lVG9Vbml4VGltZSgmKHN0ZGUtPnBwc19mdDEpLE5VTEwpOworCQlmcHJpbnRmKHN0ZGVyciwidHMxOiAlc1xuIixjdGltZSgmdCkpOworCQl0ID0gRE9TRlNfRmlsZVRpbWVUb1VuaXhUaW1lKCYoc3RkZS0+cHBzX2Z0MiksTlVMTCk7CisJCWZwcmludGYoc3RkZXJyLCJ0czI6ICVzXG4iLGN0aW1lKCZ0KSk7CisJfQorCWZwcmludGYoc3RkZXJyLCJzdGFydGJsb2NrOiAlbGRcbiIsc3RkZS0+cHBzX3NiKTsKKwlmcHJpbnRmKHN0ZGVyciwic2l6ZTogJWxkXG4iLHN0ZGUtPnBwc19zaXplKTsKK30KKworc3RhdGljIEJPT0wzMiAKK1NUT1JBR0VfaW5pdF9zdG9yYWdlKEhGSUxFMzIgaGYpIHsKKwlCWVRFCWJsb2NrW0JJR1NJWkVdOworCUxQRFdPUkQJYmJzOworCXN0cnVjdCBzdG9yYWdlX2hlYWRlciAqc3RoOworCXN0cnVjdCBzdG9yYWdlX3Bwc19lbnRyeSAqc3RkZTsKKworCWFzc2VydCgtMSE9X2xsc2VlazMyKGhmLDAsU0VFS19TRVQpKTsKKwkvKiBibG9jayAtMSBpcyB0aGUgc3RvcmFnZSBoZWFkZXIgKi8KKwlzdGggPSAoc3RydWN0IHN0b3JhZ2VfaGVhZGVyKilibG9jazsKKwltZW1jcHkoc3RoLT5tYWdpYyxTVE9SQUdFX21hZ2ljLDgpOworCW1lbXNldChzdGgtPnVua25vd24xLDAsc2l6ZW9mKHN0aC0+dW5rbm93bjEpKTsKKwltZW1zZXQoc3RoLT51bmtub3duMiwwLHNpemVvZihzdGgtPnVua25vd24yKSk7CisJbWVtc2V0KHN0aC0+dW5rbm93bjMsMCxzaXplb2Yoc3RoLT51bmtub3duMykpOworCXN0aC0+bnVtX29mX2JiZF9ibG9ja3MJPSAxOworCXN0aC0+cm9vdF9zdGFydGJsb2NrCT0gMTsKKwlzdGgtPnNiZF9zdGFydGJsb2NrCT0gMHhmZmZmZmZmZjsKKwltZW1zZXQoc3RoLT5iYmRfbGlzdCwweGZmLHNpemVvZihzdGgtPmJiZF9saXN0KSk7CisJc3RoLT5iYmRfbGlzdFswXQk9IDA7CisJYXNzZXJ0KEJJR1NJWkU9PV9sd3JpdGUzMihoZixibG9jayxCSUdTSVpFKSk7CisJLyogYmxvY2sgMCBpcyB0aGUgYmlnIGJsb2NrIGRpcmVjdG9yeSAqLworCWJicz0oTFBEV09SRClibG9jazsKKwltZW1zZXQoYmxvY2ssMHhmZixzaXplb2YoYmxvY2spKTsgLyogbWFyayBhbGwgYmxvY2tzIGFzIGZyZWUgKi8KKwliYnNbMF09U1RPUkFHRV9DSEFJTkVOVFJZX0VORE9GQ0hBSU47IC8qIGZvciB0aGlzIGJsb2NrICovCisJYmJzWzFdPVNUT1JBR0VfQ0hBSU5FTlRSWV9FTkRPRkNIQUlOOyAvKiBmb3IgZGlyZWN0b3J5IGVudHJ5ICovCisJYXNzZXJ0KEJJR1NJWkU9PV9sd3JpdGUzMihoZixibG9jayxCSUdTSVpFKSk7CisJLyogYmxvY2sgMSBpcyB0aGUgcm9vdCBkaXJlY3RvcnkgZW50cnkgKi8KKwltZW1zZXQoYmxvY2ssMHgwMCxzaXplb2YoYmxvY2spKTsKKwlzdGRlID0gKHN0cnVjdCBzdG9yYWdlX3Bwc19lbnRyeSopYmxvY2s7CisJbHN0cmNweUF0b1coc3RkZS0+cHBzX3Jhd25hbWUsIlJvb3RFbnRyeSIpOworCXN0ZGUtPnBwc19zaXplb2ZuYW1lCT0gbHN0cmxlbjMyVyhzdGRlLT5wcHNfcmF3bmFtZSkqMisyOworCXN0ZGUtPnBwc190eXBlCQk9IDU7CisJc3RkZS0+cHBzX2RpcgkJPSAtMTsKKwlzdGRlLT5wcHNfbmV4dAkJPSAtMTsKKwlzdGRlLT5wcHNfcHJldgkJPSAtMTsKKwlzdGRlLT5wcHNfc2IJCT0gMHhmZmZmZmZmZjsKKwlzdGRlLT5wcHNfc2l6ZQkJPSAwOworCWFzc2VydChCSUdTSVpFPT1fbHdyaXRlMzIoaGYsYmxvY2ssQklHU0laRSkpOworCXJldHVybiBUUlVFOworfQorCitzdGF0aWMgQk9PTDMyCitTVE9SQUdFX3NldF9iaWdfY2hhaW4oSEZJTEUzMiBoZixpbnQgYmxvY2tucixJTlQzMiB0eXBlKSB7CisJQllURQlibG9ja1tCSUdTSVpFXTsKKwlMUElOVDMyCWJiZCA9IChMUElOVDMyKWJsb2NrOworCWludAluZXh0YmxvY2tucixiaWdibG9ja25yOworCXN0cnVjdCBzdG9yYWdlX2hlYWRlciBzdGg7CisKKwlSRUFEX0hFQURFUjsKKwlhc3NlcnQoYmxvY2tuciE9dHlwZSk7CisJd2hpbGUgKGJsb2NrbnI+PTApIHsKKwkJYmlnYmxvY2tuciA9IHN0aC5iYmRfbGlzdFtibG9ja25yLzEyOF07CisJCWFzc2VydChiaWdibG9ja25yPj0wKTsKKwkJYXNzZXJ0KFNUT1JBR0VfZ2V0X2JpZ19ibG9jayhoZixiaWdibG9ja25yLGJsb2NrKSk7CisKKwkJbmV4dGJsb2NrbnIgPSBiYmRbYmxvY2tuciYoMTI4LTEpXTsKKwkJYmJkW2Jsb2NrbnImKDEyOC0xKV0gPSB0eXBlOworCQlpZiAodHlwZT49MCkKKwkJCXJldHVybiBUUlVFOworCQlhc3NlcnQoU1RPUkFHRV9wdXRfYmlnX2Jsb2NrKGhmLGJpZ2Jsb2NrbnIsYmxvY2spKTsKKwkJdHlwZSA9IFNUT1JBR0VfQ0hBSU5FTlRSWV9GUkVFOworCQlibG9ja25yID0gbmV4dGJsb2NrbnI7CisJfQorCXJldHVybiBUUlVFOworfQorCitzdGF0aWMgQk9PTDMyCitTVE9SQUdFX3NldF9zbWFsbF9jaGFpbihIRklMRTMyIGhmLGludCBibG9ja25yLElOVDMyIHR5cGUpIHsKKwlCWVRFCWJsb2NrW0JJR1NJWkVdOworCUxQSU5UMzIJc2JkID0gKExQSU5UMzIpYmxvY2s7CisJaW50CWxhc3RibG9ja25yLG5leHRzbWFsbGJsb2NrbnIsYmlnYmxvY2tucjsKKwlzdHJ1Y3Qgc3RvcmFnZV9oZWFkZXIgc3RoOworCisJUkVBRF9IRUFERVI7CisKKwlhc3NlcnQoYmxvY2tuciE9dHlwZSk7CisJbGFzdGJsb2NrbnI9LTEyOTtiaWdibG9ja25yPS0yOworCXdoaWxlIChibG9ja25yPj0wKSB7CisJCS8qIGNhY2hlIGJsb2NrIC4uLiAqLworCQlpZiAobGFzdGJsb2NrbnIvMTI4IT1ibG9ja25yLzEyOCkgeworCQkJYmlnYmxvY2tuciA9IFNUT1JBR0VfZ2V0X250aF9uZXh0X2JpZ19ibG9ja25yKGhmLHN0aC5zYmRfc3RhcnRibG9jayxibG9ja25yLzEyOCk7CisJCQlhc3NlcnQoYmlnYmxvY2tucj49MCk7CisJCQlhc3NlcnQoU1RPUkFHRV9nZXRfYmlnX2Jsb2NrKGhmLGJpZ2Jsb2NrbnIsYmxvY2spKTsKKwkJfQorCQlsYXN0YmxvY2tuciA9IGJsb2NrbnI7CisJCW5leHRzbWFsbGJsb2NrbnIgPSBzYmRbYmxvY2tuciYoMTI4LTEpXTsKKwkJc2JkW2Jsb2NrbnImKDEyOC0xKV0gPSB0eXBlOworCQlhc3NlcnQoU1RPUkFHRV9wdXRfYmlnX2Jsb2NrKGhmLGJpZ2Jsb2NrbnIsYmxvY2spKTsKKwkJaWYgKHR5cGU+PTApCisJCQlyZXR1cm4gVFJVRTsKKwkJdHlwZSA9IFNUT1JBR0VfQ0hBSU5FTlRSWV9GUkVFOworCQlibG9ja25yID0gbmV4dHNtYWxsYmxvY2tucjsKKwl9CisJcmV0dXJuIFRSVUU7Cit9CisKK3N0YXRpYyBpbnQgCitTVE9SQUdFX2dldF9mcmVlX2JpZ19ibG9ja25yKEhGSUxFMzIgaGYpIHsKKwlCWVRFCWJsb2NrW0JJR1NJWkVdOworCUxQSU5UMzIJc2JkID0gKExQSU5UMzIpYmxvY2s7CisJaW50CWxhc3RiaWdibG9ja25yLGksY3VyYmxvY2ssYmlnYmxvY2tucjsKKwlzdHJ1Y3Qgc3RvcmFnZV9oZWFkZXIgc3RoOworCisJUkVBRF9IRUFERVI7CisJY3VyYmxvY2sJPSAwOworCWxhc3RiaWdibG9ja25yCT0gLTE7CisJYmlnYmxvY2tucgk9IHN0aC5iYmRfbGlzdFtjdXJibG9ja107CisJd2hpbGUgKGN1cmJsb2NrPHN0aC5udW1fb2ZfYmJkX2Jsb2NrcykgeworCQlhc3NlcnQoYmlnYmxvY2tucj49MCk7CisJCWFzc2VydChTVE9SQUdFX2dldF9iaWdfYmxvY2soaGYsYmlnYmxvY2tucixibG9jaykpOworCQlmb3IgKGk9MDtpPDEyODtpKyspCisJCQlpZiAoc2JkW2ldPT1TVE9SQUdFX0NIQUlORU5UUllfRlJFRSkgeworCQkJCXNiZFtpXSA9IFNUT1JBR0VfQ0hBSU5FTlRSWV9FTkRPRkNIQUlOOworCQkJCWFzc2VydChTVE9SQUdFX3B1dF9iaWdfYmxvY2soaGYsYmlnYmxvY2tucixibG9jaykpOworCQkJCW1lbXNldChibG9jaywweDQyLHNpemVvZihibG9jaykpOworCQkJCWFzc2VydChTVE9SQUdFX3B1dF9iaWdfYmxvY2soaGYsaStjdXJibG9jayoxMjgsYmxvY2spKTsKKwkJCQlyZXR1cm4gaStjdXJibG9jayoxMjg7CisJCQl9CisJCWxhc3RiaWdibG9ja25yID0gYmlnYmxvY2tucjsKKwkJYmlnYmxvY2tuciA9IHN0aC5iYmRfbGlzdFsrK2N1cmJsb2NrXTsKKwl9CisJYmlnYmxvY2tuciA9IGN1cmJsb2NrKjEyODsKKwkvKiBzaW5jZSB3ZSBoYXZlIG1hcmtlZCBhbGwgYmxvY2tzIGZyb20gMCB1cCB0byBjdXJibG9jayoxMjgtMSAKKwkgKiB0aGUgbmV4dCBmcmVlIG9uZSBpcyBjdXJibG9jayoxMjgsIHdoZXJlIHdlIGhhcHBpbHkgcHV0IG91ciAKKwkgKiBuZXh0IGxhcmdlIGJsb2NrIGRlcG90LgorCSAqLworCW1lbXNldChibG9jaywweGZmLHNpemVvZihibG9jaykpOworCS8qIG1hcmsgdGhlIGJsb2NrIGFsbG9jYXRlZCBhbmQgcmV0dXJuZWQgYnkgdGhpcyBmdW5jdGlvbiAqLworCXNiZFsxXSA9IFNUT1JBR0VfQ0hBSU5FTlRSWV9FTkRPRkNIQUlOOworCWFzc2VydChTVE9SQUdFX3B1dF9iaWdfYmxvY2soaGYsYmlnYmxvY2tucixibG9jaykpOworCisJLyogaWYgd2UgaGFkIGEgYmJkIGJsb2NrIGFscmVhZHkgKG1vc3RsaWtlbHkpIHdlIG5lZWQKKwkgKiB0byBsaW5rIHRoZSBuZXcgb25lIGludG8gdGhlIGNoYWluIAorCSAqLworCWlmIChsYXN0YmlnYmxvY2tuciE9LTEpCisJCWFzc2VydChTVE9SQUdFX3NldF9iaWdfY2hhaW4oaGYsbGFzdGJpZ2Jsb2NrbnIsYmlnYmxvY2tucikpOworCXN0aC5iYmRfbGlzdFtjdXJibG9ja109YmlnYmxvY2tucjsKKwlzdGgubnVtX29mX2JiZF9ibG9ja3MrKzsKKwlhc3NlcnQoc3RoLm51bV9vZl9iYmRfYmxvY2tzPT1jdXJibG9jaysxKTsKKwlhc3NlcnQoU1RPUkFHRV9wdXRfYmlnX2Jsb2NrKGhmLC0xLChMUEJZVEUpJnN0aCkpOworCisJLyogU2V0IHRoZSBlbmQgb2YgdGhlIGNoYWluIGZvciB0aGUgYmlnYmxvY2tkZXBvdHMgKi8KKwlhc3NlcnQoU1RPUkFHRV9zZXRfYmlnX2NoYWluKGhmLGJpZ2Jsb2NrbnIsU1RPUkFHRV9DSEFJTkVOVFJZX0VORE9GQ0hBSU4pKTsKKwkvKiBhZGQgMSwgZm9yIHRoZSBmaXJzdCBlbnRyeSBpcyB1c2VkIGZvciB0aGUgYWRkaXRpb25hbCBiaWcgYmxvY2sgCisJICogZGVwb3QuIChtZWFucyB3ZSBhbHJlYWR5IHVzZWQgYmlnYmxvY2tucikgKi8KKwltZW1zZXQoYmxvY2ssMHg0MixzaXplb2YoYmxvY2spKTsKKwkvKiBhbGxvY2F0ZSB0aGlzIGJsb2NrIChmaWxsZWQgd2l0aCAweDQyKSAqLworCWFzc2VydChTVE9SQUdFX3B1dF9iaWdfYmxvY2soaGYsYmlnYmxvY2tucisxLGJsb2NrKSk7CisJcmV0dXJuIGJpZ2Jsb2NrbnIrMTsKK30KKworCitzdGF0aWMgaW50IAorU1RPUkFHRV9nZXRfZnJlZV9zbWFsbF9ibG9ja25yKEhGSUxFMzIgaGYpIHsKKwlCWVRFCWJsb2NrW0JJR1NJWkVdOworCUxQSU5UMzIJc2JkID0gKExQSU5UMzIpYmxvY2s7CisJaW50CWxhc3RiaWdibG9ja25yLG5ld2Jsb2NrbnIsaSxjdXJibG9jayxiaWdibG9ja25yOworCXN0cnVjdCBzdG9yYWdlX3Bwc19lbnRyeQlyb290OworCXN0cnVjdCBzdG9yYWdlX2hlYWRlciBzdGg7CisKKwlSRUFEX0hFQURFUjsKKwliaWdibG9ja25yCT0gc3RoLnNiZF9zdGFydGJsb2NrOworCWN1cmJsb2NrCT0gMDsKKwlsYXN0YmlnYmxvY2tucgk9IC0xOworCW5ld2Jsb2NrbnIJPSAtMTsKKwl3aGlsZSAoYmlnYmxvY2tucj49MCkgeworCQlpZiAoIVNUT1JBR0VfZ2V0X2JpZ19ibG9jayhoZixiaWdibG9ja25yLGJsb2NrKSkKKwkJCXJldHVybiAtMTsKKwkJZm9yIChpPTA7aTwxMjg7aSsrKQorCQkJaWYgKHNiZFtpXT09U1RPUkFHRV9DSEFJTkVOVFJZX0ZSRUUpIHsKKwkJCQlzYmRbaV09U1RPUkFHRV9DSEFJTkVOVFJZX0VORE9GQ0hBSU47CisJCQkJbmV3YmxvY2tuciA9IGkrY3VyYmxvY2sqMTI4OworCQkJCWJyZWFrOworCQkJfQorCQlpZiAoaSE9MTI4KQorCQkJYnJlYWs7CisJCWxhc3RiaWdibG9ja25yID0gYmlnYmxvY2tucjsKKwkJYmlnYmxvY2tuciA9IFNUT1JBR0VfZ2V0X25leHRfYmlnX2Jsb2NrbnIoaGYsYmlnYmxvY2tucik7CisJCWN1cmJsb2NrKys7CisJfQorCWlmIChuZXdibG9ja25yPT0tMSkgeworCQliaWdibG9ja25yID0gU1RPUkFHRV9nZXRfZnJlZV9iaWdfYmxvY2tucihoZik7CisJCWlmIChiaWdibG9ja25yPDApCisJCQlyZXR1cm4gLTE7CisJCVJFQURfSEVBREVSOworCQltZW1zZXQoYmxvY2ssMHhmZixzaXplb2YoYmxvY2spKTsKKwkJc2JkWzBdPVNUT1JBR0VfQ0hBSU5FTlRSWV9FTkRPRkNIQUlOOworCQlpZiAoIVNUT1JBR0VfcHV0X2JpZ19ibG9jayhoZixiaWdibG9ja25yLGJsb2NrKSkKKwkJCXJldHVybiAtMTsKKwkJaWYgKGxhc3RiaWdibG9ja25yPT0tMSkgeworCQkJc3RoLnNiZF9zdGFydGJsb2NrID0gYmlnYmxvY2tucjsKKwkJCWlmICghU1RPUkFHRV9wdXRfYmlnX2Jsb2NrKGhmLC0xLChMUEJZVEUpJnN0aCkpIC8qIG5lZWQgdG8gd3JpdGUgaXQgKi8KKwkJCQlyZXR1cm4gLTE7CisJCX0gZWxzZSB7CisJCQlpZiAoIVNUT1JBR0Vfc2V0X2JpZ19jaGFpbihoZixsYXN0YmlnYmxvY2tucixiaWdibG9ja25yKSkKKwkJCQlyZXR1cm4gLTE7CisJCX0KKwkJaWYgKCFTVE9SQUdFX3NldF9iaWdfY2hhaW4oaGYsYmlnYmxvY2tucixTVE9SQUdFX0NIQUlORU5UUllfRU5ET0ZDSEFJTikpCisJCQlyZXR1cm4gLTE7CisJCW5ld2Jsb2NrbnIgPSBjdXJibG9jayoxMjg7CisJfQorCS8qIGFsbG9jYXRlIGVub3VnaCBiaWcgYmxvY2tzIGZvciBzdG9yaW5nIHRoZSBhbGxvY2F0ZWQgc21hbGwgYmxvY2sgKi8KKwlpZiAoIVNUT1JBR0VfZ2V0X3Jvb3RfcHBzX2VudHJ5KGhmLCZyb290KSkKKwkJcmV0dXJuIC0xOworCWlmIChyb290LnBwc19zYj09LTEpCisJCWxhc3RiaWdibG9ja25yCT0gLTE7CisJZWxzZQorCQlsYXN0YmlnYmxvY2tucgk9IFNUT1JBR0VfZ2V0X250aF9uZXh0X2JpZ19ibG9ja25yKGhmLHJvb3QucHBzX3NiLChyb290LnBwc19zaXplLTEpL0JJR1NJWkUpOworCXdoaWxlIChyb290LnBwc19zaXplIDwgKG5ld2Jsb2NrbnIqU01BTExTSVpFK1NNQUxMU0laRS0xKSkgeworCQkvKiB3ZSBuZWVkIHRvIGFsbG9jYXRlIG1vcmUgc3R1ZmYgKi8KKwkJYmlnYmxvY2tuciA9IFNUT1JBR0VfZ2V0X2ZyZWVfYmlnX2Jsb2NrbnIoaGYpOworCQlpZiAoYmlnYmxvY2tucjwwKQorCQkJcmV0dXJuIC0xOworCQlSRUFEX0hFQURFUjsKKwkJaWYgKHJvb3QucHBzX3NiPT0tMSkgeworCQkJcm9vdC5wcHNfc2IJID0gYmlnYmxvY2tucjsKKwkJCXJvb3QucHBzX3NpemUJKz0gQklHU0laRTsKKwkJfSBlbHNlIHsKKwkJCWlmICghU1RPUkFHRV9zZXRfYmlnX2NoYWluKGhmLGxhc3RiaWdibG9ja25yLGJpZ2Jsb2NrbnIpKQorCQkJCXJldHVybiAtMTsKKwkJCXJvb3QucHBzX3NpemUJKz0gQklHU0laRTsKKwkJfQorCQlsYXN0YmlnYmxvY2tuciA9IGJpZ2Jsb2NrbnI7CisJfQorCWlmICghU1RPUkFHRV9zZXRfYmlnX2NoYWluKGhmLGxhc3RiaWdibG9ja25yLFNUT1JBR0VfQ0hBSU5FTlRSWV9FTkRPRkNIQUlOKSkKKwkJcmV0dXJuIC0xOworCWlmICghU1RPUkFHRV9wdXRfcHBzX2VudHJ5KGhmLDAsJnJvb3QpKQorCQlyZXR1cm4gLTE7CisJcmV0dXJuIG5ld2Jsb2NrbnI7Cit9CisKK3N0YXRpYyBpbnQKK1NUT1JBR0VfZ2V0X2ZyZWVfcHBzX2VudHJ5KEhGSUxFMzIgaGYpIHsKKwlpbnQJYmxvY2tucixpLGN1cmJsb2NrLGxhc3RibG9ja25yOworCUJZVEUJYmxvY2tbQklHU0laRV07CisJc3RydWN0IHN0b3JhZ2VfcHBzX2VudHJ5ICpzdGRlID0gKHN0cnVjdCBzdG9yYWdlX3Bwc19lbnRyeSopYmxvY2s7CisJc3RydWN0IHN0b3JhZ2VfaGVhZGVyIHN0aDsKKworCVJFQURfSEVBREVSOworCWJsb2NrbnIgPSBzdGgucm9vdF9zdGFydGJsb2NrOworCWFzc2VydChibG9ja25yPj0wKTsKKwljdXJibG9jaz0wOworCXdoaWxlIChibG9ja25yPj0wKSB7CisJCWlmICghU1RPUkFHRV9nZXRfYmlnX2Jsb2NrKGhmLGJsb2NrbnIsYmxvY2spKQorCQkJcmV0dXJuIC0xOworCQlmb3IgKGk9MDtpPDQ7aSsrKSAKKwkJCWlmIChzdGRlW2ldLnBwc19zaXplb2ZuYW1lPT0wKSAvKiBmcmVlICovCisJCQkJcmV0dXJuIGN1cmJsb2NrKjQraTsKKwkJbGFzdGJsb2NrbnIgPSBibG9ja25yOworCQlibG9ja25yID0gU1RPUkFHRV9nZXRfbmV4dF9iaWdfYmxvY2tucihoZixibG9ja25yKTsKKwkJY3VyYmxvY2srKzsKKwl9CisJYXNzZXJ0KGJsb2NrbnI9PVNUT1JBR0VfQ0hBSU5FTlRSWV9FTkRPRkNIQUlOKTsKKwlibG9ja25yID0gU1RPUkFHRV9nZXRfZnJlZV9iaWdfYmxvY2tucihoZik7CisJLyogc3RoIGludmFsaWRhdGVkICovCisJaWYgKGJsb2NrbnI8MCkKKwkJcmV0dXJuIC0xOworCQorCWlmICghU1RPUkFHRV9zZXRfYmlnX2NoYWluKGhmLGxhc3RibG9ja25yLGJsb2NrbnIpKQorCQlyZXR1cm4gLTE7CisJaWYgKCFTVE9SQUdFX3NldF9iaWdfY2hhaW4oaGYsYmxvY2tucixTVE9SQUdFX0NIQUlORU5UUllfRU5ET0ZDSEFJTikpCisJCXJldHVybiAtMTsKKwltZW1zZXQoYmxvY2ssMCxzaXplb2YoYmxvY2spKTsKKwlTVE9SQUdFX3B1dF9iaWdfYmxvY2soaGYsYmxvY2tucixibG9jayk7CisJcmV0dXJuIGN1cmJsb2NrKjQ7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCQlJU3RyZWFtCisgKi8KK0hSRVNVTFQgV0lOQVBJIElTdHJlYW0xNl9RdWVyeUludGVyZmFjZSgKKwlMUFNUUkVBTTE2IHRoaXMsUkVGSUlEIHJlZmlpZCxMUFZPSUQgKm9iagorKSB7CisJY2hhciAgICB4cmVmaWlkWzUwXTsKKworCVdJTkVfU3RyaW5nRnJvbUNMU0lEKChMUENMU0lEKXJlZmlpZCx4cmVmaWlkKTsKKwlkcHJpbnRmX2luZm8ocmVsYXksIklTdHJlYW0xNiglcCktPlF1ZXJ5SW50ZXJmYWNlKCVzLCVwKVxuIix0aGlzLHhyZWZpaWQsb2JqKTsKKwlpZiAoIW1lbWNtcCgmSUlEX0lVbmtub3duLHJlZmlpZCxzaXplb2YoSUlEX0lVbmtub3duKSkpIHsKKwkJKm9iaiA9IHRoaXM7CisJCXJldHVybiAwOworCX0KKwlyZXR1cm4gT0xFX0VfRU5VTV9OT01PUkU7CisJCit9CisKK1VMT05HIFdJTkFQSSBJU3RyZWFtMTZfQWRkUmVmKExQU1RSRUFNMTYgdGhpcykgeworCXJldHVybiArKyh0aGlzLT5yZWYpOworfQorCitVTE9ORyBXSU5BUEkgSVN0cmVhbTE2X1JlbGVhc2UoTFBTVFJFQU0xNiB0aGlzKSB7CisJRmx1c2hGaWxlQnVmZmVycyh0aGlzLT5oZik7CisJdGhpcy0+cmVmLS07CisJaWYgKCF0aGlzLT5yZWYpIHsKKwkJQ2xvc2VIYW5kbGUodGhpcy0+aGYpOworCQlTRUdQVFJfRlJFRSh0aGlzKTsKKwkJcmV0dXJuIDA7CisJfQorCXJldHVybiB0aGlzLT5yZWY7Cit9CisKKy8qIEZJWE1FOiBub3QgaGFuZGxpbmcgNjQgYml0ICovCitIUkVTVUxUIFdJTkFQSSBJU3RyZWFtMTZfU2VlaygKKwlMUFNUUkVBTTE2IHRoaXMsTEFSR0VfSU5URUdFUiBvZmZzZXQsRFdPUkQgd2hlbmNlLFVMQVJHRV9JTlRFR0VSICpuZXdwb3MKKykgeworCWRwcmludGZfaW5mbyhyZWxheSwiSVN0cmVhbTE2KCVwKS0+U2VlayhbJWxkLiVsZF0sJWxkLCVwKVxuIix0aGlzLG9mZnNldC5IaWdoUGFydCxvZmZzZXQuTG93UGFydCx3aGVuY2UsbmV3cG9zKTsKKworCXN3aXRjaCAod2hlbmNlKSB7CisJLyogdW5peCBTRUVLX3h4IHNob3VsZCBiZSB0aGUgc2FtZSBhcyB3aW45NSBvbmVzICovCisJY2FzZSBTRUVLX1NFVDoKKwkJLyogb2Zmc2V0IG11c3QgYmUgPT0wICg8MCBpcyBpbnZhbGlkLCBhbmQgPjAgY2Fubm90IGJlIGhhbmRsZWQKKwkJICogcmlnaHQgbm93LgorCQkgKi8KKwkJYXNzZXJ0KG9mZnNldC5IaWdoUGFydD09MCk7CisJCXRoaXMtPm9mZnNldC5IaWdoUGFydCA9IG9mZnNldC5IaWdoUGFydDsKKwkJdGhpcy0+b2Zmc2V0Lkxvd1BhcnQgPSBvZmZzZXQuTG93UGFydDsKKwkJYnJlYWs7CisJY2FzZSBTRUVLX0NVUjoKKwkJaWYgKG9mZnNldC5IaWdoUGFydCA8IDApIHsKKwkJCS8qIEZJWE1FOiBpcyB0aGlzIG5lZ2F0aW9uIGNvcnJlY3QgPyAqLworCQkJb2Zmc2V0LkhpZ2hQYXJ0ID0gLW9mZnNldC5IaWdoUGFydDsKKwkJCW9mZnNldC5Mb3dQYXJ0ID0gKDB4ZmZmZmZmZmYgXiBvZmZzZXQuTG93UGFydCkrMTsKKworCQkJYXNzZXJ0KG9mZnNldC5IaWdoUGFydD09MCk7CisJCQlhc3NlcnQodGhpcy0+b2Zmc2V0Lkxvd1BhcnQgPj0gb2Zmc2V0Lkxvd1BhcnQpOworCQkJdGhpcy0+b2Zmc2V0Lkxvd1BhcnQgLT0gb2Zmc2V0Lkxvd1BhcnQ7CisJCX0gZWxzZSB7CisJCQlhc3NlcnQob2Zmc2V0LkhpZ2hQYXJ0PT0wKTsKKwkJCXRoaXMtPm9mZnNldC5Mb3dQYXJ0Kz0gb2Zmc2V0Lkxvd1BhcnQ7CisJCX0KKwkJYnJlYWs7CisJY2FzZSBTRUVLX0VORDoKKwkJYXNzZXJ0KG9mZnNldC5IaWdoUGFydD09MCk7CisJCXRoaXMtPm9mZnNldC5Mb3dQYXJ0ID0gdGhpcy0+c3RkZS5wcHNfc2l6ZS1vZmZzZXQuTG93UGFydDsKKwkJYnJlYWs7CisJfQorCWlmICh0aGlzLT5vZmZzZXQuTG93UGFydD50aGlzLT5zdGRlLnBwc19zaXplKQorCQl0aGlzLT5vZmZzZXQuTG93UGFydD10aGlzLT5zdGRlLnBwc19zaXplOworCWlmIChuZXdwb3MpICpuZXdwb3MgPSB0aGlzLT5vZmZzZXQ7CisJcmV0dXJuIE9MRV9PSzsKK30KKworSFJFU1VMVCBXSU5BUEkgSVN0cmVhbTE2X1JlYWQoCisgICAgICAgIExQU1RSRUFNMTYgdGhpcyx2b2lkICAqcHYsVUxPTkcgY2IsVUxPTkcgICpwY2JSZWFkCispIHsKKwlCWVRFCWJsb2NrW0JJR1NJWkVdOworCVVMT05HCSpieXRlc3JlYWQ9cGNiUmVhZCx4eHJlYWQ7CisJaW50CWJsb2NrbnI7CisKKwlkcHJpbnRmX2luZm8ocmVsYXksIklTdHJlYW0xNiglcCktPlJlYWQoJXAsJWxkLCVwKVxuIix0aGlzLHB2LGNiLHBjYlJlYWQpOworCWlmICghcGNiUmVhZCkgYnl0ZXNyZWFkPSZ4eHJlYWQ7CisJKmJ5dGVzcmVhZCA9IDA7CisKKwlpZiAoY2I+dGhpcy0+c3RkZS5wcHNfc2l6ZS10aGlzLT5vZmZzZXQuTG93UGFydCkKKwkJY2I9dGhpcy0+c3RkZS5wcHNfc2l6ZS10aGlzLT5vZmZzZXQuTG93UGFydDsKKwlpZiAodGhpcy0+c3RkZS5wcHNfc2l6ZSA8IDB4MTAwMCkgeworCQkvKiB1c2Ugc21hbGwgYmxvY2sgcmVhZGVyICovCisJCWJsb2NrbnIgPSBTVE9SQUdFX2dldF9udGhfbmV4dF9zbWFsbF9ibG9ja25yKHRoaXMtPmhmLHRoaXMtPnN0ZGUucHBzX3NiLHRoaXMtPm9mZnNldC5Mb3dQYXJ0L1NNQUxMU0laRSk7CisJCXdoaWxlIChjYikgeworCQkJaW50CWNjOworCisJCQlpZiAoIVNUT1JBR0VfZ2V0X3NtYWxsX2Jsb2NrKHRoaXMtPmhmLGJsb2NrbnIsYmxvY2spKSB7CisJCQkJZnByaW50ZihzdGRlcnIsInNtYWxsIGJsb2NrIHJlYWQgZmFpbGVkISEhIVxuIik7CisJCQkJcmV0dXJuIEVfRkFJTDsKKwkJCX0KKwkJCWNjID0gY2I7IAorCQkJaWYgKGNjPlNNQUxMU0laRS0odGhpcy0+b2Zmc2V0Lkxvd1BhcnQmKFNNQUxMU0laRS0xKSkpCisJCQkJY2M9U01BTExTSVpFLSh0aGlzLT5vZmZzZXQuTG93UGFydCYoU01BTExTSVpFLTEpKTsKKwkJCW1lbWNweSgoTFBCWVRFKXB2LGJsb2NrKyh0aGlzLT5vZmZzZXQuTG93UGFydCYoU01BTExTSVpFLTEpKSxjYyk7CisJCQl0aGlzLT5vZmZzZXQuTG93UGFydCs9Y2M7CisJCQkoTFBCWVRFKXB2Kz1jYzsKKwkJCSpieXRlc3JlYWQrPWNjOworCQkJY2ItPWNjOworCQkJYmxvY2tuciA9IFNUT1JBR0VfZ2V0X25leHRfc21hbGxfYmxvY2tucih0aGlzLT5oZixibG9ja25yKTsKKwkJfQorCX0gZWxzZSB7CisJCS8qIHVzZSBiaWcgYmxvY2sgcmVhZGVyICovCisJCWJsb2NrbnIgPSBTVE9SQUdFX2dldF9udGhfbmV4dF9iaWdfYmxvY2tucih0aGlzLT5oZix0aGlzLT5zdGRlLnBwc19zYix0aGlzLT5vZmZzZXQuTG93UGFydC9CSUdTSVpFKTsKKwkJd2hpbGUgKGNiKSB7CisJCQlpbnQJY2M7CisKKwkJCWlmICghU1RPUkFHRV9nZXRfYmlnX2Jsb2NrKHRoaXMtPmhmLGJsb2NrbnIsYmxvY2spKSB7CisJCQkJZnByaW50ZihzdGRlcnIsImJpZyBibG9jayByZWFkIGZhaWxlZCEhISFcbiIpOworCQkJCXJldHVybiBFX0ZBSUw7CisJCQl9CisJCQljYyA9IGNiOyAKKwkJCWlmIChjYz5CSUdTSVpFLSh0aGlzLT5vZmZzZXQuTG93UGFydCYoQklHU0laRS0xKSkpCisJCQkJY2M9QklHU0laRS0odGhpcy0+b2Zmc2V0Lkxvd1BhcnQmKEJJR1NJWkUtMSkpOworCQkJbWVtY3B5KChMUEJZVEUpcHYsYmxvY2srKHRoaXMtPm9mZnNldC5Mb3dQYXJ0JihCSUdTSVpFLTEpKSxjYyk7CisJCQl0aGlzLT5vZmZzZXQuTG93UGFydCs9Y2M7CisJCQkoTFBCWVRFKXB2Kz1jYzsKKwkJCSpieXRlc3JlYWQrPWNjOworCQkJY2ItPWNjOworCQkJYmxvY2tucj1TVE9SQUdFX2dldF9uZXh0X2JpZ19ibG9ja25yKHRoaXMtPmhmLGJsb2NrbnIpOworCQl9CisJfQorCXJldHVybiBPTEVfT0s7Cit9CisKK0hSRVNVTFQgV0lOQVBJIElTdHJlYW0xNl9Xcml0ZSgKKyAgICAgICAgTFBTVFJFQU0xNiB0aGlzLGNvbnN0IHZvaWQgKnB2LFVMT05HIGNiLFVMT05HICpwY2JXcml0ZQorKSB7CisJQllURQlibG9ja1tCSUdTSVpFXTsKKwlVTE9ORwkqYnl0ZXN3cml0dGVuPXBjYldyaXRlLHh4d3JpdHRlbjsKKwlpbnQJb2xkc2l6ZSxuZXdzaXplLGksY3Vyb2Zmc2V0PTAsbGFzdGJsb2NrbnIsYmxvY2tucixjYzsKKwlIRklMRTMyCWhmID0gdGhpcy0+aGY7CisKKwlpZiAoIXBjYldyaXRlKSBieXRlc3dyaXR0ZW49Jnh4d3JpdHRlbjsKKwkqYnl0ZXN3cml0dGVuID0gMDsKKworCWRwcmludGZfaW5mbyhyZWxheSwiSVN0cmVhbTE2KCVwKS0+V3JpdGUoJXAsJWxkLCVwKVxuIix0aGlzLHB2LGNiLHBjYldyaXRlKTsKKwkvKiBkbyB3ZSBuZWVkIHRvIGp1bmsgc29tZSBibG9ja3M/ICovCisJbmV3c2l6ZQk9IHRoaXMtPm9mZnNldC5Mb3dQYXJ0K2NiOworCW9sZHNpemUJPSB0aGlzLT5zdGRlLnBwc19zaXplOworCWlmIChuZXdzaXplIDwgb2xkc2l6ZSkgeworCQlpZiAob2xkc2l6ZSA8IDB4MTAwMCkgeworCQkJLyogb25seSBzbWFsbCBibG9ja3MgKi8KKwkJCWJsb2NrbnI9U1RPUkFHRV9nZXRfbnRoX25leHRfc21hbGxfYmxvY2tucihoZix0aGlzLT5zdGRlLnBwc19zYixuZXdzaXplL1NNQUxMU0laRSk7CisKKwkJCWFzc2VydChibG9ja25yPj0wKTsKKworCQkJLyogd2lsbCBzZXQgdGhlIHJlc3Qgb2YgdGhlIGNoYWluIHRvICdmcmVlJyAqLworCQkJaWYgKCFTVE9SQUdFX3NldF9zbWFsbF9jaGFpbihoZixibG9ja25yLFNUT1JBR0VfQ0hBSU5FTlRSWV9FTkRPRkNIQUlOKSkKKwkJCQlyZXR1cm4gRV9GQUlMOworCQl9IGVsc2UgeworCQkJaWYgKG5ld3NpemUgPj0gMHgxMDAwKSB7CisJCQkJYmxvY2tucj1TVE9SQUdFX2dldF9udGhfbmV4dF9iaWdfYmxvY2tucihoZix0aGlzLT5zdGRlLnBwc19zYixuZXdzaXplL0JJR1NJWkUpOworCQkJCWFzc2VydChibG9ja25yPj0wKTsKKworCQkJCS8qIHdpbGwgc2V0IHRoZSByZXN0IG9mIHRoZSBjaGFpbiB0byAnZnJlZScgKi8KKwkJCQlpZiAoIVNUT1JBR0Vfc2V0X2JpZ19jaGFpbihoZixibG9ja25yLFNUT1JBR0VfQ0hBSU5FTlRSWV9FTkRPRkNIQUlOKSkKKwkJCQkJcmV0dXJuIEVfRkFJTDsKKwkJCX0gZWxzZSB7CisJCQkJLyogTWlncmF0ZSBsYXJnZSBibG9ja3MgdG8gc21hbGwgYmxvY2tzIAorCQkJCSAqICh3ZSBqdXN0IG1pZ3JhdGUgbmV3c2l6ZSBieXRlcykKKwkJCQkgKi8KKwkJCQlMUEJZVEUJY3VyZGF0YSxkYXRhID0gSGVhcEFsbG9jKEdldFByb2Nlc3NIZWFwKCksMCxuZXdzaXplK0JJR1NJWkUpOworCQkJCWNjCT0gbmV3c2l6ZTsKKwkJCQlibG9ja25yID0gdGhpcy0+c3RkZS5wcHNfc2I7CisJCQkJY3VyZGF0YSA9IGRhdGE7CisJCQkJd2hpbGUgKGNjPjApIHsKKwkJCQkJaWYgKCFTVE9SQUdFX2dldF9iaWdfYmxvY2soaGYsYmxvY2tucixjdXJkYXRhKSkgeworCQkJCQkJSGVhcEZyZWUoR2V0UHJvY2Vzc0hlYXAoKSwwLGRhdGEpOworCQkJCQkJcmV0dXJuIEVfRkFJTDsKKwkJCQkJfQorCQkJCQljdXJkYXRhCSs9IEJJR1NJWkU7CisJCQkJCWNjCS09IEJJR1NJWkU7CisJCQkJCWJsb2NrbnIJID0gU1RPUkFHRV9nZXRfbmV4dF9iaWdfYmxvY2tucihoZixibG9ja25yKTsKKwkJCQl9CisJCQkJLyogZnJlZXMgY29tcGxldGUgY2hhaW4gZm9yIHRoaXMgc3RyZWFtICovCisJCQkJaWYgKCFTVE9SQUdFX3NldF9iaWdfY2hhaW4oaGYsdGhpcy0+c3RkZS5wcHNfc2IsU1RPUkFHRV9DSEFJTkVOVFJZX0ZSRUUpKQorCQkJCQlyZXR1cm4gRV9GQUlMOworCQkJCWN1cmRhdGEJPSBkYXRhOworCQkJCWJsb2NrbnIgPSB0aGlzLT5zdGRlLnBwc19zYiA9IFNUT1JBR0VfZ2V0X2ZyZWVfc21hbGxfYmxvY2tucihoZik7CisJCQkJaWYgKGJsb2NrbnI8MCkKKwkJCQkJcmV0dXJuIEVfRkFJTDsKKwkJCQljYwk9IG5ld3NpemU7CisJCQkJd2hpbGUgKGNjPjApIHsKKwkJCQkJaWYgKCFTVE9SQUdFX3B1dF9zbWFsbF9ibG9jayhoZixibG9ja25yLGN1cmRhdGEpKQorCQkJCQkJcmV0dXJuIEVfRkFJTDsKKwkJCQkJY2MJLT0gU01BTExTSVpFOworCQkJCQlpZiAoY2M8PTApIHsKKwkJCQkJCWlmICghU1RPUkFHRV9zZXRfc21hbGxfY2hhaW4oaGYsYmxvY2tucixTVE9SQUdFX0NIQUlORU5UUllfRU5ET0ZDSEFJTikpCisJCQkJCQkJcmV0dXJuIEVfRkFJTDsKKwkJCQkJCWJyZWFrOworCQkJCQl9IGVsc2UgeworCQkJCQkJaW50IG5ld2Jsb2NrbnIgPSBTVE9SQUdFX2dldF9mcmVlX3NtYWxsX2Jsb2NrbnIoaGYpOworCQkJCQkJaWYgKG5ld2Jsb2NrbnI8MCkKKwkJCQkJCQlyZXR1cm4gRV9GQUlMOworCQkJCQkJaWYgKCFTVE9SQUdFX3NldF9zbWFsbF9jaGFpbihoZixibG9ja25yLG5ld2Jsb2NrbnIpKQorCQkJCQkJCXJldHVybiBFX0ZBSUw7CisJCQkJCQlibG9ja25yID0gbmV3YmxvY2tucjsKKwkJCQkJfQorCQkJCQljdXJkYXRhCSs9IFNNQUxMU0laRTsKKwkJCQl9CisJCQkJSGVhcEZyZWUoR2V0UHJvY2Vzc0hlYXAoKSwwLGRhdGEpOworCQkJfQorCQl9CisJCXRoaXMtPnN0ZGUucHBzX3NpemUgPSBuZXdzaXplOworCX0KKworCWlmIChuZXdzaXplID4gb2xkc2l6ZSkgeworCQlpZiAob2xkc2l6ZSA+PSAweDEwMDApIHsKKwkJCS8qIHNob3VsZCByZXR1cm4gdGhlIGJsb2NrIHJpZ2h0IGJlZm9yZSB0aGUgJ2VuZG9mY2hhaW4nICovCisJCQlibG9ja25yID0gU1RPUkFHRV9nZXRfbnRoX25leHRfYmlnX2Jsb2NrbnIoaGYsdGhpcy0+c3RkZS5wcHNfc2IsdGhpcy0+c3RkZS5wcHNfc2l6ZS9CSUdTSVpFKTsKKwkJCWFzc2VydChibG9ja25yPj0wKTsKKwkJCWxhc3RibG9ja25yCT0gYmxvY2tucjsKKwkJCWZvciAoaT1vbGRzaXplL0JJR1NJWkU7aTxuZXdzaXplL0JJR1NJWkU7aSsrKSB7CisJCQkJYmxvY2tuciA9IFNUT1JBR0VfZ2V0X2ZyZWVfYmlnX2Jsb2NrbnIoaGYpOworCQkJCWlmIChibG9ja25yPDApCisJCQkJCXJldHVybiBFX0ZBSUw7CisJCQkJaWYgKCFTVE9SQUdFX3NldF9iaWdfY2hhaW4oaGYsbGFzdGJsb2NrbnIsYmxvY2tucikpCisJCQkJCXJldHVybiBFX0ZBSUw7CisJCQkJbGFzdGJsb2NrbnIgPSBibG9ja25yOworCQkJfQorCQkJaWYgKCFTVE9SQUdFX3NldF9iaWdfY2hhaW4oaGYsYmxvY2tucixTVE9SQUdFX0NIQUlORU5UUllfRU5ET0ZDSEFJTikpCisJCQkJcmV0dXJuIEVfRkFJTDsKKwkJfSBlbHNlIHsKKwkJCWlmIChuZXdzaXplIDwgMHgxMDAwKSB7CisJCQkJLyogZmluZCBzdGFydGJsb2NrICovCisJCQkJaWYgKCFvbGRzaXplKQorCQkJCQl0aGlzLT5zdGRlLnBwc19zYiA9IGJsb2NrbnIgPSBTVE9SQUdFX2dldF9mcmVlX3NtYWxsX2Jsb2NrbnIoaGYpOworCQkJCWVsc2UKKwkJCQkJYmxvY2tuciA9IFNUT1JBR0VfZ2V0X250aF9uZXh0X3NtYWxsX2Jsb2NrbnIoaGYsdGhpcy0+c3RkZS5wcHNfc2IsdGhpcy0+c3RkZS5wcHNfc2l6ZS9TTUFMTFNJWkUpOworCQkJCWlmIChibG9ja25yPDApCisJCQkJCXJldHVybiBFX0ZBSUw7CisKKwkJCQkvKiBhbGxvY2F0ZSByZXF1aXJlZCBuZXcgc21hbGwgYmxvY2tzICovCisJCQkJbGFzdGJsb2NrbnIgPSBibG9ja25yOworCQkJCWZvciAoaT1vbGRzaXplL1NNQUxMU0laRTtpPG5ld3NpemUvU01BTExTSVpFO2krKykgeworCQkJCQlibG9ja25yID0gU1RPUkFHRV9nZXRfZnJlZV9zbWFsbF9ibG9ja25yKGhmKTsKKwkJCQkJaWYgKGJsb2NrbnI8MCkKKwkJCQkJCXJldHVybiBFX0ZBSUw7CisJCQkJCWlmICghU1RPUkFHRV9zZXRfc21hbGxfY2hhaW4oaGYsbGFzdGJsb2NrbnIsYmxvY2tucikpCisJCQkJCQlyZXR1cm4gRV9GQUlMOworCQkJCQlsYXN0YmxvY2tuciA9IGJsb2NrbnI7CisJCQkJfQorCQkJCS8qIGFuZCB0ZXJtaW5hdGUgdGhlIGNoYWluICovCisJCQkJaWYgKCFTVE9SQUdFX3NldF9zbWFsbF9jaGFpbihoZixsYXN0YmxvY2tucixTVE9SQUdFX0NIQUlORU5UUllfRU5ET0ZDSEFJTikpCisJCQkJCXJldHVybiBFX0ZBSUw7CisJCQl9IGVsc2UgeworCQkJCWlmICghb2xkc2l6ZSkgeworCQkJCQkvKiBubyBzaW5nbGUgYmxvY2sgYWxsb2NhdGVkIHlldCAqLworCQkJCQlibG9ja25yPVNUT1JBR0VfZ2V0X2ZyZWVfYmlnX2Jsb2NrbnIoaGYpOworCQkJCQlpZiAoYmxvY2tucjwwKQorCQkJCQkJcmV0dXJuIEVfRkFJTDsKKwkJCQkJdGhpcy0+c3RkZS5wcHNfc2IgPSBibG9ja25yOworCQkJCX0gZWxzZSB7CisJCQkJCS8qIE1pZ3JhdGUgc21hbGwgYmxvY2tzIHRvIGJpZyBibG9ja3MgKi8KKwkJCQkJTFBCWVRFCWN1cmRhdGEsZGF0YSA9IEhlYXBBbGxvYyhHZXRQcm9jZXNzSGVhcCgpLDAsb2xkc2l6ZStCSUdTSVpFKTsKKwkJCQkJY2MJPSBvbGRzaXplOworCQkJCQlibG9ja25yID0gdGhpcy0+c3RkZS5wcHNfc2I7CisJCQkJCWN1cmRhdGEgPSBkYXRhOworCQkJCQkvKiBzbHVycCBpbiAqLworCQkJCQl3aGlsZSAoY2M+MCkgeworCQkJCQkJaWYgKCFTVE9SQUdFX2dldF9zbWFsbF9ibG9jayhoZixibG9ja25yLGN1cmRhdGEpKSB7CisJCQkJCQkJSGVhcEZyZWUoR2V0UHJvY2Vzc0hlYXAoKSwwLGRhdGEpOworCQkJCQkJCXJldHVybiBFX0ZBSUw7CisJCQkJCQl9CisJCQkJCQljdXJkYXRhCSs9IFNNQUxMU0laRTsKKwkJCQkJCWNjCS09IFNNQUxMU0laRTsKKwkJCQkJCWJsb2NrbnIJID0gU1RPUkFHRV9nZXRfbmV4dF9zbWFsbF9ibG9ja25yKGhmLGJsb2NrbnIpOworCQkJCQl9CisJCQkJCS8qIGZyZWUgc21hbGwgYmxvY2sgY2hhaW4gKi8KKwkJCQkJaWYgKCFTVE9SQUdFX3NldF9zbWFsbF9jaGFpbihoZix0aGlzLT5zdGRlLnBwc19zYixTVE9SQUdFX0NIQUlORU5UUllfRlJFRSkpCisJCQkJCQlyZXR1cm4gRV9GQUlMOworCQkJCQljdXJkYXRhCT0gZGF0YTsKKwkJCQkJYmxvY2tuciA9IHRoaXMtPnN0ZGUucHBzX3NiID0gU1RPUkFHRV9nZXRfZnJlZV9iaWdfYmxvY2tucihoZik7CisJCQkJCWlmIChibG9ja25yPDApCisJCQkJCQlyZXR1cm4gRV9GQUlMOworCQkJCQkvKiBwdXQgdGhlIGRhdGEgaW50byB0aGUgYmlnIGJsb2NrcyAqLworCQkJCQljYwk9IHRoaXMtPnN0ZGUucHBzX3NpemU7CisJCQkJCXdoaWxlIChjYz4wKSB7CisJCQkJCQlpZiAoIVNUT1JBR0VfcHV0X2JpZ19ibG9jayhoZixibG9ja25yLGN1cmRhdGEpKQorCQkJCQkJCXJldHVybiBFX0ZBSUw7CisJCQkJCQljYwktPSBCSUdTSVpFOworCQkJCQkJaWYgKGNjPD0wKSB7CisJCQkJCQkJaWYgKCFTVE9SQUdFX3NldF9iaWdfY2hhaW4oaGYsYmxvY2tucixTVE9SQUdFX0NIQUlORU5UUllfRU5ET0ZDSEFJTikpCisJCQkJCQkJCXJldHVybiBFX0ZBSUw7CisJCQkJCQkJYnJlYWs7CisJCQkJCQl9IGVsc2UgeworCQkJCQkJCWludCBuZXdibG9ja25yID0gU1RPUkFHRV9nZXRfZnJlZV9iaWdfYmxvY2tucihoZik7CisJCQkJCQkJaWYgKG5ld2Jsb2NrbnI8MCkKKwkJCQkJCQkJcmV0dXJuIEVfRkFJTDsKKwkJCQkJCQlpZiAoIVNUT1JBR0Vfc2V0X2JpZ19jaGFpbihoZixibG9ja25yLG5ld2Jsb2NrbnIpKQorCQkJCQkJCQlyZXR1cm4gRV9GQUlMOworCQkJCQkJCWJsb2NrbnIgPSBuZXdibG9ja25yOworCQkJCQkJfQorCQkJCQkJY3VyZGF0YQkrPSBCSUdTSVpFOworCQkJCQl9CisJCQkJCUhlYXBGcmVlKEdldFByb2Nlc3NIZWFwKCksMCxkYXRhKTsKKwkJCQl9CisJCQkJLyogZ2VuZXJhdGUgYmlnIGJsb2NrcyB0byBmaXQgdGhlIG5ldyBkYXRhICovCisJCQkJbGFzdGJsb2NrbnIJPSBibG9ja25yOworCQkJCWZvciAoaT1vbGRzaXplL0JJR1NJWkU7aTxuZXdzaXplL0JJR1NJWkU7aSsrKSB7CisJCQkJCWJsb2NrbnIgPSBTVE9SQUdFX2dldF9mcmVlX2JpZ19ibG9ja25yKGhmKTsKKwkJCQkJaWYgKGJsb2NrbnI8MCkKKwkJCQkJCXJldHVybiBFX0ZBSUw7CisJCQkJCWlmICghU1RPUkFHRV9zZXRfYmlnX2NoYWluKGhmLGxhc3RibG9ja25yLGJsb2NrbnIpKQorCQkJCQkJcmV0dXJuIEVfRkFJTDsKKwkJCQkJbGFzdGJsb2NrbnIgPSBibG9ja25yOworCQkJCX0KKwkJCQkvKiB0ZXJtaW5hdGUgY2hhaW4gKi8KKwkJCQlpZiAoIVNUT1JBR0Vfc2V0X2JpZ19jaGFpbihoZixsYXN0YmxvY2tucixTVE9SQUdFX0NIQUlORU5UUllfRU5ET0ZDSEFJTikpCisJCQkJCXJldHVybiBFX0ZBSUw7CisJCQl9CisJCX0KKwkJdGhpcy0+c3RkZS5wcHNfc2l6ZSA9IG5ld3NpemU7CisJfQorCisJLyogVGhlcmUgYXJlIGp1c3Qgc29tZSBjYXNlcyB3aGVyZSB3ZSBkaWRuJ3QgbW9kaWZ5IGl0LCB3ZSB3cml0ZSBpdCBvdXQKKwkgKiBldmVyeXRpbWUKKwkgKi8KKwlpZiAoIVNUT1JBR0VfcHV0X3Bwc19lbnRyeShoZix0aGlzLT5wcHNlbnQsJih0aGlzLT5zdGRlKSkpCisJCXJldHVybiBFX0ZBSUw7CisKKwkvKiBmaW5hbGx5IHRoZSB3cml0ZSBwYXNzICovCisJaWYgKHRoaXMtPnN0ZGUucHBzX3NpemUgPCAweDEwMDApIHsKKwkJYmxvY2tuciA9IFNUT1JBR0VfZ2V0X250aF9uZXh0X3NtYWxsX2Jsb2NrbnIoaGYsdGhpcy0+c3RkZS5wcHNfc2IsdGhpcy0+b2Zmc2V0Lkxvd1BhcnQvU01BTExTSVpFKTsKKwkJYXNzZXJ0KGJsb2NrbnI+PTApOworCQl3aGlsZSAoY2I+MCkgeworCQkJLyogd2UgZW5zdXJlZCB0aGF0IGl0IGlzIGFsbG9jYXRlZCBhYm92ZSAqLworCQkJYXNzZXJ0KGJsb2NrbnI+PTApOworCQkJLyogUmVhZCBvbGQgYmxvY2sgZXZlcnl0aW1lLCBzaW5jZSB3ZSBjYW4gaGF2ZQorCQkJICogb3ZlcmxhcHBpbmcgZGF0YSBhdCBTVEFSVCBhbmQgRU5EIG9mIHRoZSB3cml0ZQorCQkJICovCisJCQlpZiAoIVNUT1JBR0VfZ2V0X3NtYWxsX2Jsb2NrKGhmLGJsb2NrbnIsYmxvY2spKQorCQkJCXJldHVybiBFX0ZBSUw7CisKKwkJCWNjID0gU01BTExTSVpFLSh0aGlzLT5vZmZzZXQuTG93UGFydCYoU01BTExTSVpFLTEpKTsKKwkJCWlmIChjYz5jYikKKwkJCQljYz1jYjsKKwkJCW1lbWNweSgJKChMUEJZVEUpYmxvY2spKyh0aGlzLT5vZmZzZXQuTG93UGFydCYoU01BTExTSVpFLTEpKSwKKwkJCQkoTFBCWVRFKShwditjdXJvZmZzZXQpLAorCQkJCWNjCisJCQkpOworCQkJaWYgKCFTVE9SQUdFX3B1dF9zbWFsbF9ibG9jayhoZixibG9ja25yLGJsb2NrKSkKKwkJCQlyZXR1cm4gRV9GQUlMOworCQkJY2IJCQktPSBjYzsKKwkJCWN1cm9mZnNldAkJKz0gY2M7CisJCQkoTFBCWVRFKXB2CQkrPSBjYzsKKwkJCXRoaXMtPm9mZnNldC5Mb3dQYXJ0CSs9IGNjOworCQkJKmJ5dGVzd3JpdHRlbgkJKz0gY2M7CisJCQlibG9ja25yID0gU1RPUkFHRV9nZXRfbmV4dF9zbWFsbF9ibG9ja25yKGhmLGJsb2NrbnIpOworCQl9CisJfSBlbHNlIHsKKwkJYmxvY2tuciA9IFNUT1JBR0VfZ2V0X250aF9uZXh0X2JpZ19ibG9ja25yKGhmLHRoaXMtPnN0ZGUucHBzX3NiLHRoaXMtPm9mZnNldC5Mb3dQYXJ0L0JJR1NJWkUpOworCQlhc3NlcnQoYmxvY2tucj49MCk7CisJCXdoaWxlIChjYj4wKSB7CisJCQkvKiB3ZSBlbnN1cmVkIHRoYXQgaXQgaXMgYWxsb2NhdGVkIGFib3ZlLCBzbyBpdCBiZXR0ZXIgaXMgKi8KKwkJCWFzc2VydChibG9ja25yPj0wKTsKKwkJCS8qIHJlYWQgb2xkIGJsb2NrIGV2ZXJ5dGltZSwgc2luY2Ugd2UgY2FuIGhhdmUKKwkJCSAqIG92ZXJsYXBwaW5nIGRhdGEgYXQgU1RBUlQgYW5kIEVORCBvZiB0aGUgd3JpdGUKKwkJCSAqLworCQkJaWYgKCFTVE9SQUdFX2dldF9iaWdfYmxvY2soaGYsYmxvY2tucixibG9jaykpCisJCQkJcmV0dXJuIEVfRkFJTDsKKworCQkJY2MgPSBCSUdTSVpFLSh0aGlzLT5vZmZzZXQuTG93UGFydCYoQklHU0laRS0xKSk7CisJCQlpZiAoY2M+Y2IpCisJCQkJY2M9Y2I7CisJCQltZW1jcHkoCSgoTFBCWVRFKWJsb2NrKSsodGhpcy0+b2Zmc2V0Lkxvd1BhcnQmKEJJR1NJWkUtMSkpLAorCQkJCShMUEJZVEUpKHB2K2N1cm9mZnNldCksCisJCQkJY2MKKwkJCSk7CisJCQlpZiAoIVNUT1JBR0VfcHV0X2JpZ19ibG9jayhoZixibG9ja25yLGJsb2NrKSkKKwkJCQlyZXR1cm4gRV9GQUlMOworCQkJY2IJCQktPSBjYzsKKwkJCWN1cm9mZnNldAkJKz0gY2M7CisJCQkoTFBCWVRFKXB2CQkrPSBjYzsKKwkJCXRoaXMtPm9mZnNldC5Mb3dQYXJ0CSs9IGNjOworCQkJKmJ5dGVzd3JpdHRlbgkJKz0gY2M7CisJCQlibG9ja25yID0gU1RPUkFHRV9nZXRfbmV4dF9iaWdfYmxvY2tucihoZixibG9ja25yKTsKKwkJfQorCX0KKwlyZXR1cm4gT0xFX09LOworfQorCitzdGF0aWMgdm9pZCBfY3JlYXRlX2lzdHJlYW0xNihMUFNUUkVBTTE2ICpzdHIpIHsKKwlMUFNUUkVBTTE2CWxwc3Q7CisKKwlpZiAoIXN0cnZ0MTYuZm5RdWVyeUludGVyZmFjZSkgeworCQlITU9EVUxFMTYJd3AgPSBHZXRNb2R1bGVIYW5kbGUxNigiU1RPUkFHRSIpOworCQlpZiAod3A+PTMyKSB7CisjZGVmaW5lIFZURU5UKHgpICBzdHJ2dDE2LmZuIyN4ID0gKHZvaWQqKVdJTjMyX0dldFByb2NBZGRyZXNzMTYod3AsIklTdHJlYW0xNl8iI3gpOworCQkJVlRFTlQoUXVlcnlJbnRlcmZhY2UpCisJCQlWVEVOVChBZGRSZWYpCisJCQlWVEVOVChSZWxlYXNlKQorCQkJVlRFTlQoUmVhZCkKKwkJCVZURU5UKFdyaXRlKQorCQkJVlRFTlQoU2VlaykKKwkJCVZURU5UKFNldFNpemUpCisJCQlWVEVOVChDb3B5VG8pCisJCQlWVEVOVChDb21taXQpCisJCQlWVEVOVChSZXZlcnQpCisJCQlWVEVOVChMb2NrUmVnaW9uKQorCQkJVlRFTlQoVW5sb2NrUmVnaW9uKQorCQkJVlRFTlQoU3RhdCkKKwkJCVZURU5UKENsb25lKQorI3VuZGVmIFZURU5UCisJCQlzZWdzdHJ2dDE2ID0gU0VHUFRSX05FVyhJU3RyZWFtMTZfVlRhYmxlKTsKKwkJCW1lbWNweShzZWdzdHJ2dDE2LCZzdHJ2dDE2LHNpemVvZihzdHJ2dDE2KSk7CisJCQlzZWdzdHJ2dDE2ID0gKExQU1RSRUFNMTZfVlRBQkxFKVNFR1BUUl9HRVQoc2Vnc3RydnQxNik7CisJCX0gZWxzZSB7CisjZGVmaW5lIFZURU5UKHgpIHN0cnZ0MTYuZm4jI3ggPSBJU3RyZWFtMTZfIyN4OworCQkJVlRFTlQoUXVlcnlJbnRlcmZhY2UpCisJCQlWVEVOVChBZGRSZWYpCisJCQlWVEVOVChSZWxlYXNlKQorCQkJVlRFTlQoUmVhZCkKKwkJCVZURU5UKFdyaXRlKQorCQkJVlRFTlQoU2VlaykKKwkvKgorCQkJVlRFTlQoQ29weVRvKQorCQkJVlRFTlQoQ29tbWl0KQorCQkJVlRFTlQoU2V0U2l6ZSkKKwkJCVZURU5UKFJldmVydCkKKwkJCVZURU5UKExvY2tSZWdpb24pCisJCQlWVEVOVChVbmxvY2tSZWdpb24pCisJCQlWVEVOVChTdGF0KQorCQkJVlRFTlQoQ2xvbmUpCisJKi8KKyN1bmRlZiBWVEVOVAorCQkJc2Vnc3RydnQxNiA9ICZzdHJ2dDE2OworCQl9CisJfQorCWxwc3QgPSBTRUdQVFJfTkVXKElTdHJlYW0xNik7CisJbHBzdC0+bHB2dGJsCT0gc2Vnc3RydnQxNjsKKwlscHN0LT5yZWYJPSAxOworCWxwc3QtPnRoaXNwdHIJPSBTRUdQVFJfR0VUKGxwc3QpOworCSpzdHIgPSAodm9pZCopbHBzdC0+dGhpc3B0cjsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgkJCUlTdHJlYW0zMgorICovCitIUkVTVUxUIFdJTkFQSSBJU3RyZWFtMzJfUXVlcnlJbnRlcmZhY2UoCisJTFBTVFJFQU0zMiB0aGlzLFJFRklJRCByZWZpaWQsTFBWT0lEICpvYmoKKykgeworCWNoYXIgICAgeHJlZmlpZFs1MF07CisKKwlXSU5FX1N0cmluZ0Zyb21DTFNJRCgoTFBDTFNJRClyZWZpaWQseHJlZmlpZCk7CisJZHByaW50Zl9pbmZvKHJlbGF5LCJJU3RyZWFtMTYoJXApLT5RdWVyeUludGVyZmFjZSglcywlcClcbiIsdGhpcyx4cmVmaWlkLG9iaik7CisJaWYgKCFtZW1jbXAoJklJRF9JVW5rbm93bixyZWZpaWQsc2l6ZW9mKElJRF9JVW5rbm93bikpKSB7CisJCSpvYmogPSB0aGlzOworCQlyZXR1cm4gMDsKKwl9CisJcmV0dXJuIE9MRV9FX0VOVU1fTk9NT1JFOworCQorfQorCitVTE9ORyBXSU5BUEkgSVN0cmVhbTMyX0FkZFJlZihMUFNUUkVBTTMyIHRoaXMpIHsKKwlyZXR1cm4gKysodGhpcy0+cmVmKTsKK30KKworVUxPTkcgV0lOQVBJIElTdHJlYW0zMl9SZWxlYXNlKExQU1RSRUFNMzIgdGhpcykgeworCUZsdXNoRmlsZUJ1ZmZlcnModGhpcy0+aGYpOworCXRoaXMtPnJlZi0tOworCWlmICghdGhpcy0+cmVmKSB7CisJCUNsb3NlSGFuZGxlKHRoaXMtPmhmKTsKKwkJU0VHUFRSX0ZSRUUodGhpcyk7CisJCXJldHVybiAwOworCX0KKwlyZXR1cm4gdGhpcy0+cmVmOworfQorCitzdGF0aWMgSVN0cmVhbTMyX1ZUYWJsZSBzdHJ2dDMyID0geworCUlTdHJlYW0zMl9RdWVyeUludGVyZmFjZSwKKwlJU3RyZWFtMzJfQWRkUmVmLAorCUlTdHJlYW0zMl9SZWxlYXNlLAorCSh2b2lkKik0LAorCSh2b2lkKik1LAorCSh2b2lkKik2LAorCSh2b2lkKik3LAorCSh2b2lkKik4LAorCSh2b2lkKik5LAorCSh2b2lkKikxMCwKKwkodm9pZCopMTEsCit9OworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgkJSVN0b3JhZ2UKKyAqLworSFJFU1VMVCBXSU5BUEkgSVN0b3JhZ2UxNl9RdWVyeUludGVyZmFjZSgKKwlMUFNUT1JBR0UxNiB0aGlzLFJFRklJRCByZWZpaWQsTFBWT0lEICpvYmoKKykgeworCWNoYXIgICAgeHJlZmlpZFs1MF07CisKKwlXSU5FX1N0cmluZ0Zyb21DTFNJRCgoTFBDTFNJRClyZWZpaWQseHJlZmlpZCk7CisJZHByaW50Zl9pbmZvKHJlbGF5LCJJU3RvcmFnZTE2KCVwKS0+UXVlcnlJbnRlcmZhY2UoJXMsJXApXG4iLHRoaXMseHJlZmlpZCxvYmopOworCisJaWYgKCFtZW1jbXAoJklJRF9JVW5rbm93bixyZWZpaWQsc2l6ZW9mKElJRF9JVW5rbm93bikpKSB7CisJCSpvYmogPSB0aGlzOworCQlyZXR1cm4gMDsKKwl9CisJcmV0dXJuIE9MRV9FX0VOVU1fTk9NT1JFOworfQorCitVTE9ORyBXSU5BUEkgSVN0b3JhZ2UxNl9BZGRSZWYoTFBTVE9SQUdFMTYgdGhpcykgeworCXJldHVybiArKyh0aGlzLT5yZWYpOworfQorCitVTE9ORyBXSU5BUEkgSVN0b3JhZ2UxNl9SZWxlYXNlKExQU1RPUkFHRTE2IHRoaXMpIHsKKwl0aGlzLT5yZWYtLTsKKwlpZiAodGhpcy0+cmVmKQorCQlyZXR1cm4gdGhpcy0+cmVmOworCVNFR1BUUl9GUkVFKHRoaXMpOworCXJldHVybiAwOworfQorCitIUkVTVUxUIFdJTkFQSSBJU3RvcmFnZTE2X1N0YXQoCisgICAgICAgIExQU1RPUkFHRTE2IHRoaXMsU1RBVFNURyAqcHN0YXRzdGcsIERXT1JEIGdyZlN0YXRGbGFnCispIHsKKwlmcHJpbnRmKHN0ZGVyciwiSVN0b3JhZ2UxNiglcCktPlN0YXQoJXAsMHglMDhseClcbiIsCisJCXRoaXMscHN0YXRzdGcsZ3JmU3RhdEZsYWcKKwkpOworCXBzdGF0c3RnLT5wd2NzTmFtZT1TRUdQVFJfR0VUKFNFR1BUUl9TVFJEVVBfV3RvQSh0aGlzLT5zdGRlLnBwc19yYXduYW1lKSk7CisJcHN0YXRzdGctPnR5cGUgPSB0aGlzLT5zdGRlLnBwc190eXBlOworCXBzdGF0c3RnLT5jYlNpemUuTG93UGFydCA9IHRoaXMtPnN0ZGUucHBzX3NpemU7CisJcHN0YXRzdGctPm10aW1lID0gdGhpcy0+c3RkZS5wcHNfZnQxOyAvKiBGSVhNRSAqLworCXBzdGF0c3RnLT5hdGltZSA9IHRoaXMtPnN0ZGUucHBzX2Z0MjsgLyogRklYTUUgKi8KKwlwc3RhdHN0Zy0+Y3RpbWUgPSB0aGlzLT5zdGRlLnBwc19mdDI7IC8qIEZJWE1FICovCisJcHN0YXRzdGctPmdyZk1vZGUJPSAwOyAvKiBGSVhNRSAqLworCXBzdGF0c3RnLT5ncmZMb2Nrc1N1cHBvcnRlZCA9IDA7IC8qIEZJWE1FICovCisJcHN0YXRzdGctPmNsc2lkCQk9IHRoaXMtPnN0ZGUucHBzX2d1aWQ7CisJcHN0YXRzdGctPmdyZlN0YXRlQml0cwk9IDA7IC8qIEZJWE1FICovCisJcHN0YXRzdGctPnJlc2VydmVkCT0gMDsKKwlyZXR1cm4gT0xFX09LOworfQorCitIUkVTVUxUIFdJTkFQSSBJU3RvcmFnZTE2X0NvbW1pdCgKKyAgICAgICAgTFBTVE9SQUdFMTYgdGhpcyxEV09SRCBjb21taXRmbGFncworKSB7CisJZnByaW50ZihzdGRlcnIsIklTdG9yYWdlMTYoJXApLT5Db21taXQoMHglMDhseCksU1RVQiFcbiIsCisJCXRoaXMsY29tbWl0ZmxhZ3MKKwkpOworCXJldHVybiBPTEVfT0s7Cit9CisKK0hSRVNVTFQgV0lOQVBJIElTdG9yYWdlMTZfQ29weVRvKExQU1RPUkFHRTE2IHRoaXMsRFdPUkQgY2lpZEV4Y2x1ZGUsY29uc3QgSUlEICpyZ2lpZEV4Y2x1ZGUsU05CMTYgU05CMTZFeGNsdWRlLElTdG9yYWdlMTYgKnBzdGdEZXN0KSB7CisJY2hhcgl4Z3VpZFs1MF07CisKKwlpZiAocmdpaWRFeGNsdWRlKQorCQlXSU5FX1N0cmluZ0Zyb21DTFNJRChyZ2lpZEV4Y2x1ZGUseGd1aWQpOworCWVsc2UKKwkJc3RyY3B5KHhndWlkLCI8bm8gZ3VpZD4iKTsKKwlmcHJpbnRmKHN0ZGVyciwiSVN0b3JhZ2UxNiglcCktPkNvcHlUbygweCUwOGx4LCVzLCVwLCVwKSxzdHViIVxuIiwKKwkJdGhpcyxjaWlkRXhjbHVkZSx4Z3VpZCxTTkIxNkV4Y2x1ZGUscHN0Z0Rlc3QKKwkpOworCXJldHVybiBPTEVfT0s7Cit9CisKKworCitIUkVTVUxUIFdJTkFQSSBJU3RvcmFnZTE2X0NyZWF0ZVN0b3JhZ2UoCisJTFBTVE9SQUdFMTYgdGhpcyxMUENPTEVTVFIxNiBwd2NzTmFtZSxEV09SRCBncmZNb2RlLERXT1JEIGR3U3RnRm9ybWF0LERXT1JEIHJlc2VydmVkMiwgSVN0b3JhZ2UxNiAqKnBwc3RnCispIHsKKwlMUFNUT1JBR0UxNglscHN0ZzsKKwlpbnQJCXBwc2VudCx4OworCXN0cnVjdCBzdG9yYWdlX3Bwc19lbnRyeQlzdGRlOworCXN0cnVjdCBzdG9yYWdlX2hlYWRlciBzdGg7CisJSEZJTEUzMgkJaGY9dGhpcy0+aGY7CisKKwlSRUFEX0hFQURFUjsKKworCWZwcmludGYoc3RkZXJyLCJJU3RvcmFnZTE2KCVwKS0+Q3JlYXRlU3RvcmFnZSglcywweCUwOGx4LDB4JTA4bHgsMHglMDhseCwlcClcbiIsCisJCXRoaXMscHdjc05hbWUsZ3JmTW9kZSxkd1N0Z0Zvcm1hdCxyZXNlcnZlZDIscHBzdGcKKwkpOworCWlmIChncmZNb2RlICYgU1RHTV9UUkFOU0FDVEVEKQorCQlmcHJpbnRmKHN0ZGVyciwiSVN0b3JhZ2U6OkNyZWF0ZVN0b3JhZ2U6V2UgZG8gbm90IHN1cHBvcnQgdHJhbnNhY3RlZCBDb21wb3VuZCBTdG9yYWdlLiBVc2luZyBkaXJlY3QgbW9kZS5cbiIpOworCV9jcmVhdGVfaXN0b3JhZ2UxNihwcHN0Zyk7CisJbHBzdGcgPSAoTFBTVE9SQUdFMTYpUFRSX1NFR19UT19MSU4oKnBwc3RnKTsKKwlscHN0Zy0+aGYJCT0gdGhpcy0+aGY7CisKKwlwcHNlbnQ9U1RPUkFHRV9nZXRfZnJlZV9wcHNfZW50cnkobHBzdGctPmhmKTsKKwlpZiAocHBzZW50PDApCisJCXJldHVybiBFX0ZBSUw7CisJc3RkZT10aGlzLT5zdGRlOworCWlmIChzdGRlLnBwc19kaXI9PS0xKSB7CisJCXN0ZGUucHBzX2RpciA9IHBwc2VudDsKKwkJeCA9IHRoaXMtPnBwc2VudDsKKwl9IGVsc2UgeworCQkvKiBGSVhNRTogdXNlIHByZXYgY2hhaW4gdG9vID8gKi8KKwkJeD1zdGRlLnBwc19kaXI7CisJCWlmICgxIT1TVE9SQUdFX2dldF9wcHNfZW50cnkobHBzdGctPmhmLHgsJnN0ZGUpKQorCQkJcmV0dXJuIEVfRkFJTDsKKwkJd2hpbGUgKHN0ZGUucHBzX25leHQhPS0xKSB7CisJCQl4PXN0ZGUucHBzX25leHQ7CisJCQlpZiAoMSE9U1RPUkFHRV9nZXRfcHBzX2VudHJ5KGxwc3RnLT5oZix4LCZzdGRlKSkKKwkJCQlyZXR1cm4gRV9GQUlMOworCQl9CisJCXN0ZGUucHBzX25leHQgPSBwcHNlbnQ7CisJfQorCWFzc2VydChTVE9SQUdFX3B1dF9wcHNfZW50cnkobHBzdGctPmhmLHgsJnN0ZGUpKTsKKwlhc3NlcnQoMT09U1RPUkFHRV9nZXRfcHBzX2VudHJ5KGxwc3RnLT5oZixwcHNlbnQsJihscHN0Zy0+c3RkZSkpKTsKKwlsc3RyY3B5QXRvVyhscHN0Zy0+c3RkZS5wcHNfcmF3bmFtZSxwd2NzTmFtZSk7CisJbHBzdGctPnN0ZGUucHBzX3NpemVvZm5hbWUgPSBsc3RybGVuMzJBKHB3Y3NOYW1lKSoyKzI7CisJbHBzdGctPnN0ZGUucHBzX25leHQJPSAtMTsKKwlscHN0Zy0+c3RkZS5wcHNfcHJldgk9IC0xOworCWxwc3RnLT5zdGRlLnBwc19kaXIJPSAtMTsKKwlscHN0Zy0+c3RkZS5wcHNfc2IJPSAtMTsKKwlscHN0Zy0+c3RkZS5wcHNfc2l6ZQk9ICAwOworCWxwc3RnLT5zdGRlLnBwc190eXBlCT0gIDE7CisJbHBzdGctPnBwc2VudAkJPSBwcHNlbnQ7CisJLyogRklYTUU6IHRpbWVzdGFtcHM/ICovCisJaWYgKCFTVE9SQUdFX3B1dF9wcHNfZW50cnkobHBzdGctPmhmLHBwc2VudCwmKGxwc3RnLT5zdGRlKSkpCisJCXJldHVybiBFX0ZBSUw7CisJcmV0dXJuIE9MRV9PSzsKK30KKworSFJFU1VMVCBXSU5BUEkgSVN0b3JhZ2UxNl9DcmVhdGVTdHJlYW0oCisJTFBTVE9SQUdFMTYgdGhpcyxMUENPTEVTVFIxNiBwd2NzTmFtZSxEV09SRCBncmZNb2RlLERXT1JEIHJlc2VydmVkMSxEV09SRCByZXNlcnZlZDIsIElTdHJlYW0xNiAqKnBwc3RtCispIHsKKwlMUFNUUkVBTTE2CWxwc3RyOworCWludAkJcHBzZW50LHg7CisJc3RydWN0IHN0b3JhZ2VfcHBzX2VudHJ5CXN0ZGU7CisKKwlmcHJpbnRmKHN0ZGVyciwiSVN0b3JhZ2UxNiglcCktPkNyZWF0ZVN0cmVhbSglcywweCUwOGx4LDB4JTA4bHgsMHglMDhseCwlcClcbiIsCisJCXRoaXMscHdjc05hbWUsZ3JmTW9kZSxyZXNlcnZlZDEscmVzZXJ2ZWQyLHBwc3RtCisJKTsKKwlpZiAoZ3JmTW9kZSAmIFNUR01fVFJBTlNBQ1RFRCkKKwkJZnByaW50ZihzdGRlcnIsIklTdG9yYWdlOjpDcmVhdGVTdHJlYW06V2UgZG8gbm90IHN1cHBvcnQgdHJhbnNhY3RlZCBDb21wb3VuZCBTdG9yYWdlLiBVc2luZyBkaXJlY3QgbW9kZS5cbiIpOworCV9jcmVhdGVfaXN0cmVhbTE2KHBwc3RtKTsKKwlscHN0ciA9IChMUFNUUkVBTTE2KVBUUl9TRUdfVE9fTElOKCpwcHN0bSk7CisJbHBzdHItPmhmCQk9IEZJTEVfRHVwKHRoaXMtPmhmKTsKKwlscHN0ci0+b2Zmc2V0Lkxvd1BhcnQJPSAwOworCWxwc3RyLT5vZmZzZXQuSGlnaFBhcnQJPSAwOworCisJcHBzZW50PVNUT1JBR0VfZ2V0X2ZyZWVfcHBzX2VudHJ5KGxwc3RyLT5oZik7CisJaWYgKHBwc2VudDwwKQorCQlyZXR1cm4gRV9GQUlMOworCXN0ZGU9dGhpcy0+c3RkZTsKKwlpZiAoc3RkZS5wcHNfbmV4dD09LTEpCisJCXg9dGhpcy0+cHBzZW50OworCWVsc2UKKwkJd2hpbGUgKHN0ZGUucHBzX25leHQhPS0xKSB7CisJCQl4PXN0ZGUucHBzX25leHQ7CisJCQlpZiAoMSE9U1RPUkFHRV9nZXRfcHBzX2VudHJ5KGxwc3RyLT5oZix4LCZzdGRlKSkKKwkJCQlyZXR1cm4gRV9GQUlMOworCQl9CisJc3RkZS5wcHNfbmV4dCA9IHBwc2VudDsKKwlhc3NlcnQoU1RPUkFHRV9wdXRfcHBzX2VudHJ5KGxwc3RyLT5oZix4LCZzdGRlKSk7CisJYXNzZXJ0KDE9PVNUT1JBR0VfZ2V0X3Bwc19lbnRyeShscHN0ci0+aGYscHBzZW50LCYobHBzdHItPnN0ZGUpKSk7CisJbHN0cmNweUF0b1cobHBzdHItPnN0ZGUucHBzX3Jhd25hbWUscHdjc05hbWUpOworCWxwc3RyLT5zdGRlLnBwc19zaXplb2ZuYW1lID0gbHN0cmxlbjMyQShwd2NzTmFtZSkqMisyOworCWxwc3RyLT5zdGRlLnBwc19uZXh0CT0gLTE7CisJbHBzdHItPnN0ZGUucHBzX3ByZXYJPSAtMTsKKwlscHN0ci0+c3RkZS5wcHNfZGlyCT0gLTE7CisJbHBzdHItPnN0ZGUucHBzX3NiCT0gLTE7CisJbHBzdHItPnN0ZGUucHBzX3NpemUJPSAgMDsKKwlscHN0ci0+c3RkZS5wcHNfdHlwZQk9ICAyOworCWxwc3RyLT5wcHNlbnQJCT0gcHBzZW50OworCS8qIEZJWE1FOiB0aW1lc3RhbXBzPyAqLworCWlmICghU1RPUkFHRV9wdXRfcHBzX2VudHJ5KGxwc3RyLT5oZixwcHNlbnQsJihscHN0ci0+c3RkZSkpKQorCQlyZXR1cm4gRV9GQUlMOworCXJldHVybiBPTEVfT0s7Cit9CisKK0hSRVNVTFQgV0lOQVBJIElTdG9yYWdlMTZfT3BlblN0b3JhZ2UoCisJTFBTVE9SQUdFMTYgdGhpcyxMUENPTEVTVFIxNiBwd2NzTmFtZSwgSVN0b3JhZ2UxNiAqcHN0Z1ByaW8sIERXT1JEIGdyZk1vZGUsIFNOQjE2IHNuYkV4Y2x1ZGUsIERXT1JEIHJlc2VydmVkLCBJU3RvcmFnZTE2ICoqcHBzdGcKKykgeworCUxQU1RSRUFNMTYJbHBzdGc7CisJV0NIQVIJCW5hbWVbMzNdOworCWludAkJbmV3cHBzOworCisJZHByaW50Zl9pbmZvKHJlbGF5LCJJU3RvcmFnZTE2KCVwKS0+T3BlblN0b3JhZ2UoJXMsJXAsMHglMDhseCwlcCwweCUwOGx4LCVwKVxuIiwKKwkJdGhpcyxwd2NzTmFtZSxwc3RnUHJpbyxncmZNb2RlLHNuYkV4Y2x1ZGUscmVzZXJ2ZWQscHBzdGcKKwkpOworCWlmIChncmZNb2RlICYgU1RHTV9UUkFOU0FDVEVEKQorCQlmcHJpbnRmKHN0ZGVyciwiSVN0b3JhZ2U6Ok9wZW5TdG9yYWdlOldlIGRvIG5vdCBzdXBwb3J0IHRyYW5zYWN0ZWQgQ29tcG91bmQgU3RvcmFnZS4gVXNpbmcgZGlyZWN0IG1vZGUuXG4iKTsKKwlfY3JlYXRlX2lzdG9yYWdlMTYocHBzdGcpOworCWxwc3RnID0gKExQU1RSRUFNMTYpUFRSX1NFR19UT19MSU4oKnBwc3RnKTsKKwlscHN0Zy0+aGYgPSBGSUxFX0R1cCh0aGlzLT5oZik7CisJbHN0cmNweUF0b1cobmFtZSxwd2NzTmFtZSk7CisJbmV3cHBzID0gU1RPUkFHRV9sb29rX2Zvcl9uYW1lZF9wcHMobHBzdGctPmhmLHRoaXMtPnN0ZGUucHBzX2RpcixuYW1lKTsKKwlpZiAobmV3cHBzPT0tMSkgeworCQlJU3RyZWFtMTZfUmVsZWFzZShscHN0Zyk7CisJCXJldHVybiBFX0ZBSUw7CisJfQorCisJaWYgKDEhPVNUT1JBR0VfZ2V0X3Bwc19lbnRyeShscHN0Zy0+aGYsbmV3cHBzLCYobHBzdGctPnN0ZGUpKSkgeworCQlJU3RyZWFtMTZfUmVsZWFzZShscHN0Zyk7CisJCXJldHVybiBFX0ZBSUw7CisJfQorCWxwc3RnLT5wcHNlbnQJCT0gbmV3cHBzOworCXJldHVybiBPTEVfT0s7Cit9CisKK0hSRVNVTFQgV0lOQVBJIElTdG9yYWdlMTZfT3BlblN0cmVhbSgKKwlMUFNUT1JBR0UxNiB0aGlzLExQQ09MRVNUUjE2IHB3Y3NOYW1lLCB2b2lkICpyZXNlcnZlZDEsIERXT1JEIGdyZk1vZGUsIERXT1JEIHJlc2VydmVkMiwgSVN0cmVhbTE2ICoqcHBzdG0KKykgeworCUxQU1RSRUFNMTYJbHBzdHI7CisJV0NIQVIJCW5hbWVbMzNdOworCWludAkJbmV3cHBzOworCisJZHByaW50Zl9pbmZvKHJlbGF5LCJJU3RvcmFnZTE2KCVwKS0+T3BlblN0cmVhbSglcywlcCwweCUwOGx4LDB4JTA4bHgsJXApXG4iLAorCQl0aGlzLHB3Y3NOYW1lLHJlc2VydmVkMSxncmZNb2RlLHJlc2VydmVkMixwcHN0bQorCSk7CisJaWYgKGdyZk1vZGUgJiBTVEdNX1RSQU5TQUNURUQpCisJCWZwcmludGYoc3RkZXJyLCJJU3RvcmFnZTo6T3BlblN0cmVhbTpXZSBkbyBub3Qgc3VwcG9ydCB0cmFuc2FjdGVkIENvbXBvdW5kIFN0b3JhZ2UuIFVzaW5nIGRpcmVjdCBtb2RlLlxuIik7CisJX2NyZWF0ZV9pc3RyZWFtMTYocHBzdG0pOworCWxwc3RyID0gKExQU1RSRUFNMTYpUFRSX1NFR19UT19MSU4oKnBwc3RtKTsKKwlscHN0ci0+aGYgPSBGSUxFX0R1cCh0aGlzLT5oZik7CisJbHN0cmNweUF0b1cobmFtZSxwd2NzTmFtZSk7CisJbmV3cHBzID0gU1RPUkFHRV9sb29rX2Zvcl9uYW1lZF9wcHMobHBzdHItPmhmLHRoaXMtPnN0ZGUucHBzX2RpcixuYW1lKTsKKwlpZiAobmV3cHBzPT0tMSkgeworCQlJU3RyZWFtMTZfUmVsZWFzZShscHN0cik7CisJCXJldHVybiBFX0ZBSUw7CisJfQorCisJaWYgKDEhPVNUT1JBR0VfZ2V0X3Bwc19lbnRyeShscHN0ci0+aGYsbmV3cHBzLCYobHBzdHItPnN0ZGUpKSkgeworCQlJU3RyZWFtMTZfUmVsZWFzZShscHN0cik7CisJCXJldHVybiBFX0ZBSUw7CisJfQorCWxwc3RyLT5vZmZzZXQuTG93UGFydAk9IDA7CisJbHBzdHItPm9mZnNldC5IaWdoUGFydAk9IDA7CisJbHBzdHItPnBwc2VudAkJPSBuZXdwcHM7CisJcmV0dXJuIE9MRV9PSzsKK30KKworc3RhdGljIHZvaWQgX2NyZWF0ZV9pc3RvcmFnZTE2KExQU1RPUkFHRTE2ICpzdGcpIHsKKwlMUFNUT1JBR0UxNglscHN0OworCisJaWYgKCFzdHZ0MTYuZm5RdWVyeUludGVyZmFjZSkgeworCQlITU9EVUxFMTYJd3AgPSBHZXRNb2R1bGVIYW5kbGUxNigiU1RPUkFHRSIpOworCQlpZiAod3A+PTMyKSB7CisjZGVmaW5lIFZURU5UKHgpICBzdHZ0MTYuZm4jI3ggPSAodm9pZCopV0lOMzJfR2V0UHJvY0FkZHJlc3MxNih3cCwiSVN0b3JhZ2UxNl8iI3gpOworCQkJVlRFTlQoUXVlcnlJbnRlcmZhY2UpCisJCQlWVEVOVChBZGRSZWYpCisJCQlWVEVOVChSZWxlYXNlKQorCQkJVlRFTlQoQ3JlYXRlU3RyZWFtKQorCQkJVlRFTlQoT3BlblN0cmVhbSkKKwkJCVZURU5UKENyZWF0ZVN0b3JhZ2UpCisJCQlWVEVOVChPcGVuU3RvcmFnZSkKKwkJCVZURU5UKENvcHlUbykKKwkJCVZURU5UKE1vdmVFbGVtZW50VG8pCisJCQlWVEVOVChDb21taXQpCisJCQlWVEVOVChSZXZlcnQpCisJCQlWVEVOVChFbnVtRWxlbWVudHMpCisJCQlWVEVOVChEZXN0cm95RWxlbWVudCkKKwkJCVZURU5UKFJlbmFtZUVsZW1lbnQpCisJCQlWVEVOVChTZXRFbGVtZW50VGltZXMpCisJCQlWVEVOVChTZXRDbGFzcykKKwkJCVZURU5UKFNldFN0YXRlQml0cykKKwkJCVZURU5UKFN0YXQpCisjdW5kZWYgVlRFTlQKKwkJCXNlZ3N0dnQxNiA9IFNFR1BUUl9ORVcoSVN0b3JhZ2UxNl9WVGFibGUpOworCQkJbWVtY3B5KHNlZ3N0dnQxNiwmc3R2dDE2LHNpemVvZihzdHZ0MTYpKTsKKwkJCXNlZ3N0dnQxNiA9IChMUFNUT1JBR0UxNl9WVEFCTEUpU0VHUFRSX0dFVChzZWdzdHZ0MTYpOworCQl9IGVsc2UgeworI2RlZmluZSBWVEVOVCh4KSBzdHZ0MTYuZm4jI3ggPSBJU3RvcmFnZTE2XyMjeDsKKwkJCVZURU5UKFF1ZXJ5SW50ZXJmYWNlKQorCQkJVlRFTlQoQWRkUmVmKQorCQkJVlRFTlQoUmVsZWFzZSkKKwkJCVZURU5UKENyZWF0ZVN0cmVhbSkKKwkJCVZURU5UKE9wZW5TdHJlYW0pCisJCQlWVEVOVChDcmVhdGVTdG9yYWdlKQorCQkJVlRFTlQoT3BlblN0b3JhZ2UpCisJCQlWVEVOVChDb3B5VG8pCisJCQlWVEVOVChDb21taXQpCisJLyogIG5vdCAoeWV0KSBpbXBsZW1lbnRlZCAuLi4KKwkJCVZURU5UKE1vdmVFbGVtZW50VG8pCisJCQlWVEVOVChSZXZlcnQpCisJCQlWVEVOVChFbnVtRWxlbWVudHMpCisJCQlWVEVOVChEZXN0cm95RWxlbWVudCkKKwkJCVZURU5UKFJlbmFtZUVsZW1lbnQpCisJCQlWVEVOVChTZXRFbGVtZW50VGltZXMpCisJCQlWVEVOVChTZXRDbGFzcykKKwkJCVZURU5UKFNldFN0YXRlQml0cykKKwkJCVZURU5UKFN0YXQpCisJKi8KKyN1bmRlZiBWVEVOVAorCQkJc2Vnc3R2dDE2ID0gJnN0dnQxNjsKKwkJfQorCX0KKwlscHN0ID0gU0VHUFRSX05FVyhJU3RvcmFnZTE2KTsKKwlscHN0LT5scHZ0YmwJPSBzZWdzdHZ0MTY7CisJbHBzdC0+cmVmCT0gMTsKKwlscHN0LT50aGlzcHRyCT0gU0VHUFRSX0dFVChscHN0KTsKKwkqc3RnID0gKHZvaWQqKWxwc3QtPnRoaXNwdHI7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCQlJU3RvcmFnZTMyCisgKi8KK0hSRVNVTFQgV0lOQVBJIElTdG9yYWdlMzJfUXVlcnlJbnRlcmZhY2UoCisJTFBTVE9SQUdFMzIgdGhpcyxSRUZJSUQgcmVmaWlkLExQVk9JRCAqb2JqCispIHsKKwljaGFyICAgIHhyZWZpaWRbNTBdOworCisJV0lORV9TdHJpbmdGcm9tQ0xTSUQoKExQQ0xTSUQpcmVmaWlkLHhyZWZpaWQpOworCWRwcmludGZfaW5mbyhyZWxheSwiSVN0b3JhZ2UzMiglcCktPlF1ZXJ5SW50ZXJmYWNlKCVzLCVwKVxuIix0aGlzLHhyZWZpaWQsb2JqKTsKKworCWlmICghbWVtY21wKCZJSURfSVVua25vd24scmVmaWlkLHNpemVvZihJSURfSVVua25vd24pKSkgeworCQkqb2JqID0gdGhpczsKKwkJcmV0dXJuIDA7CisJfQorCXJldHVybiBPTEVfRV9FTlVNX05PTU9SRTsKK30KKworVUxPTkcgV0lOQVBJIElTdG9yYWdlMzJfQWRkUmVmKExQU1RPUkFHRTMyIHRoaXMpIHsKKwlyZXR1cm4gKysodGhpcy0+cmVmKTsKK30KKworVUxPTkcgV0lOQVBJIElTdG9yYWdlMzJfUmVsZWFzZShMUFNUT1JBR0UzMiB0aGlzKSB7CisJdGhpcy0+cmVmLS07CisJaWYgKHRoaXMtPnJlZikKKwkJcmV0dXJuIHRoaXMtPnJlZjsKKwlIZWFwRnJlZShHZXRQcm9jZXNzSGVhcCgpLDAsdGhpcyk7CisJcmV0dXJuIDA7Cit9CisKK0hSRVNVTFQgV0lOQVBJIElTdG9yYWdlMzJfQ3JlYXRlU3RyZWFtKAorCUxQU1RPUkFHRTMyIHRoaXMsTFBDT0xFU1RSMzIgcHdjc05hbWUsRFdPUkQgZ3JmTW9kZSxEV09SRCByZXNlcnZlZDEsRFdPUkQgcmVzZXJ2ZWQyLCBJU3RyZWFtMzIgKipwcHN0bQorKSB7CisJZnByaW50ZihzdGRlcnIsIklTdG9yYWdlMzIoJXApLT5DcmVhdGVTdHJlYW0oJXAsMHglMDhseCwweCUwOGx4LDB4JTA4bHgsJXApXG4iLAorCQl0aGlzLHB3Y3NOYW1lLGdyZk1vZGUscmVzZXJ2ZWQxLHJlc2VydmVkMixwcHN0bQorCSk7CisJKnBwc3RtID0gKElTdHJlYW0zMiopSGVhcEFsbG9jKEdldFByb2Nlc3NIZWFwKCksMCxzaXplb2YoSVN0cmVhbTMyKSk7CisJKCpwcHN0bSktPmxwdnRibD0gJnN0cnZ0MzI7CisJKCpwcHN0bSktPnJlZgk9IDE7CisKKwlyZXR1cm4gT0xFX09LOworfQorCitIUkVTVUxUIFdJTkFQSSBJU3RvcmFnZTMyX09wZW5TdHJlYW0oCisJTFBTVE9SQUdFMzIgdGhpcyxMUENPTEVTVFIzMiBwd2NzTmFtZSwgdm9pZCAqcmVzZXJ2ZWQxLCBEV09SRCBncmZNb2RlLCBEV09SRCByZXNlcnZlZDIsIElTdHJlYW0zMiAqKnBwc3RtCispIHsKKwlmcHJpbnRmKHN0ZGVyciwiSVN0b3JhZ2UzMiglcCktPk9wZW5TdHJlYW0oJXAsJXAsMHglMDhseCwweCUwOGx4LCVwKVxuIiwKKwkJdGhpcyxwd2NzTmFtZSxyZXNlcnZlZDEsZ3JmTW9kZSxyZXNlcnZlZDIscHBzdG0KKwkpOworCSpwcHN0bSA9IChJU3RyZWFtMzIqKUhlYXBBbGxvYyhHZXRQcm9jZXNzSGVhcCgpLDAsc2l6ZW9mKElTdHJlYW0zMikpOworCSgqcHBzdG0pLT5scHZ0Ymw9ICZzdHJ2dDMyOworCSgqcHBzdG0pLT5yZWYJPSAxOworCXJldHVybiBPTEVfT0s7Cit9CisKK3N0YXRpYyBJU3RvcmFnZTMyX1ZUYWJsZSBzdHZ0MzIgPSB7CisJSVN0b3JhZ2UzMl9RdWVyeUludGVyZmFjZSwKKwlJU3RvcmFnZTMyX0FkZFJlZiwKKwlJU3RvcmFnZTMyX1JlbGVhc2UsCisJSVN0b3JhZ2UzMl9DcmVhdGVTdHJlYW0sCisJSVN0b3JhZ2UzMl9PcGVuU3RyZWFtLAorCSh2b2lkKik2LAorCSh2b2lkKik3LAorCSh2b2lkKik4LAorCSh2b2lkKik5LAorCSh2b2lkKikxMCwKKwkodm9pZCopMTEsCisJKHZvaWQqKTEyLAorCSh2b2lkKikxMywKKwkodm9pZCopMTQsCisJKHZvaWQqKTE1LAorfTsKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoJU3RvcmFnZSBBUEkgZnVuY3Rpb25zCisgKi8KKworT0xFU1RBVFVTIFdJTkFQSSBTdGdDcmVhdGVEb2NGaWxlMTYoCisJTFBDT0xFU1RSMTYgcHdjc05hbWUsRFdPUkQgZ3JmTW9kZSxEV09SRCByZXNlcnZlZCxJU3RvcmFnZTE2ICoqcHBzdGdPcGVuCispIHsKKwlIRklMRTMyCQloZjsKKwlpbnQJCWkscmV0OworCUxQU1RPUkFHRTE2CWxwc3RnOworCXN0cnVjdCBzdG9yYWdlX3Bwc19lbnRyeQlzdGRlOworCisJZnByaW50ZihzdGRlcnIsIlN0Z0NyZWF0ZURvY2ZpbGUoJXMsMHglMDhseCwweCUwOGx4LCVwKVxuIiwKKwkJcHdjc05hbWUsZ3JmTW9kZSxyZXNlcnZlZCxwcHN0Z09wZW4KKwkpOworCV9jcmVhdGVfaXN0b3JhZ2UxNihwcHN0Z09wZW4pOworCWhmID0gQ3JlYXRlRmlsZTMyQShwd2NzTmFtZSxHRU5FUklDX1JFQUR8R0VORVJJQ19XUklURSwwLE5VTEwsQ1JFQVRFX05FVywwLDApOworCWlmIChoZj09SU5WQUxJRF9IQU5ETEVfVkFMVUUzMikgeworCQlmcHJpbnRmKHN0ZGVyciwiY291bGRuJ3Qgb3BlbiBmaWxlIGZvciBzdG9yYWdlOiVsZFxuIixHZXRMYXN0RXJyb3IoKSk7CisJCXJldHVybiBFX0ZBSUw7CisJfQorCWxwc3RnID0gKExQU1RPUkFHRTE2KVBUUl9TRUdfVE9fTElOKCpwcHN0Z09wZW4pOworCWxwc3RnLT5oZiA9IGhmOworCS8qIEZJWE1FOiBjaGVjayBmb3IgZXhpc3RhbmNlIGJlZm9yZSBvdmVyd3JpdGluZz8gKi8KKwlpZiAoIVNUT1JBR0VfaW5pdF9zdG9yYWdlKGhmKSkgeworCQlDbG9zZUhhbmRsZShoZik7CisJCXJldHVybiBFX0ZBSUw7CisJfQorCWk9MDtyZXQ9MDsKKwl3aGlsZSAoIXJldCkgeyAvKiBuZWl0aGVyIDEgbm9yIDwwICovCisJCXJldD1TVE9SQUdFX2dldF9wcHNfZW50cnkoaGYsaSwmc3RkZSk7CisJCWlmICgocmV0PT0xKSAmJiAoc3RkZS5wcHNfdHlwZT09NSkpIHsKKwkJCWxwc3RnLT5zdGRlCT0gc3RkZTsKKwkJCWxwc3RnLT5wcHNlbnQJPSBpOworCQkJYnJlYWs7CisJCX0KKwkJaSsrOworCX0KKwlpZiAocmV0IT0xKSB7CisJCUlTdG9yYWdlMTZfUmVsZWFzZShscHN0Zyk7IC8qIHdpbGwgcmVtb3ZlIGl0ICovCisJCXJldHVybiBFX0ZBSUw7CisJfQorCXJldHVybiBPTEVfT0s7Cit9CisKK09MRVNUQVRVUyBXSU5BUEkgU3RnQ3JlYXRlRG9jRmlsZTMyKAorCUxQQ09MRVNUUjMyIHB3Y3NOYW1lLERXT1JEIGdyZk1vZGUsRFdPUkQgcmVzZXJ2ZWQsSVN0b3JhZ2UzMiAqKnBwc3RnT3BlbgorKSB7CisJZnByaW50ZihzdGRlcnIsIlN0Z0NyZWF0ZURvY2ZpbGUoJXAsMHglMDhseCwweCUwOGx4LCVwKVxuIiwKKwkJcHdjc05hbWUsZ3JmTW9kZSxyZXNlcnZlZCxwcHN0Z09wZW4KKwkpOworCSpwcHN0Z09wZW4gPSAoSVN0b3JhZ2UzMiopSGVhcEFsbG9jKEdldFByb2Nlc3NIZWFwKCksMCxzaXplb2YoSVN0b3JhZ2UzMikpOworCSgqcHBzdGdPcGVuKS0+cmVmID0gMTsKKwkoKnBwc3RnT3BlbiktPmxwdnRibCA9ICZzdHZ0MzI7CisJcmV0dXJuIE9MRV9PSzsKK30KKworT0xFU1RBVFVTIFdJTkFQSSBTdGdJc1N0b3JhZ2VGaWxlMTYoTFBDT0xFU1RSMTYgZm4pIHsKKwlIRklMRTMyCQloZjsKKwlPRlNUUlVDVAlvZnM7CisJQllURQkJbWFnaWNbMjRdOworCisJZnByaW50ZihzdGRlcnIsIlN0Z0lzU3RvcmFnZUZpbGUoJXMpIixmbik7CisJaGYgPSBPcGVuRmlsZTMyKGZuLCZvZnMsT0ZfU0hBUkVfREVOWV9OT05FKTsKKwlpZiAoaGY9PUhGSUxFX0VSUk9SMzIpCisJCXJldHVybiBTVEdfRV9GSUxFTk9URk9VTkQ7CisJaWYgKDI0IT1fbHJlYWQzMihoZixtYWdpYywyNCkpIHsKKwkJZnByaW50ZihzdGRlcnIsIiB0b28gc2hvcnRcbiIpOworCQlfbGNsb3NlMzIoaGYpOworCQlyZXR1cm4gU19GQUxTRTsKKwl9CisJaWYgKCFtZW1jbXAobWFnaWMsU1RPUkFHRV9tYWdpYyw4KSkgeworCQlmcHJpbnRmKHN0ZGVyciwiIC0+IFlFU1xuIik7CisJCV9sY2xvc2UzMihoZik7CisJCXJldHVybiBTX09LOworCX0KKwlpZiAoIW1lbWNtcChtYWdpYyxTVE9SQUdFX25vdG1hZ2ljLDgpKSB7CisJCWZwcmludGYoc3RkZXJyLCIgLT4gTk9cbiIpOworCQlfbGNsb3NlMzIoaGYpOworCQlyZXR1cm4gU19GQUxTRTsKKwl9CisJaWYgKCFtZW1jbXAobWFnaWMsU1RPUkFHRV9vbGRtYWdpYyw4KSkgeworCQlmcHJpbnRmKHN0ZGVyciwiIC0+IG9sZCBmb3JtYXRcbiIpOworCQlfbGNsb3NlMzIoaGYpOworCQlyZXR1cm4gU1RHX0VfT0xERk9STUFUOworCX0KKwlmcHJpbnRmKHN0ZGVyciwiIC0+IEludmFsaWQgaGVhZGVyLlxuIik7CisJX2xjbG9zZTMyKGhmKTsKKwlyZXR1cm4gU1RHX0VfSU5WQUxJREhFQURFUjsKK30KKworT0xFU1RBVFVTIFdJTkFQSSBTdGdJc1N0b3JhZ2VGaWxlMzIoTFBDT0xFU1RSMzIgZm4pIHsKKwlMUE9MRVNUUjE2CXhmbiA9IEhFQVBfc3RyZHVwV3RvQShHZXRQcm9jZXNzSGVhcCgpLDAsZm4pOworCU9MRVNUQVRVUwlyZXQgPSBTdGdJc1N0b3JhZ2VGaWxlMTYoeGZuKTsKKworCUhlYXBGcmVlKEdldFByb2Nlc3NIZWFwKCksMCx4Zm4pOworCXJldHVybiByZXQ7Cit9CisKKworCitPTEVTVEFUVVMgV0lOQVBJIFN0Z09wZW5TdG9yYWdlMTYoCisJY29uc3QgT0xFQ0hBUjE2ICogcHdjc05hbWUsSVN0b3JhZ2UxNiAqcHN0Z1ByaW9yaXR5LERXT1JEIGdyZk1vZGUsCisJU05CMTYgc25iRXhjbHVkZSxEV09SRCByZXNlcnZlZCwgSVN0b3JhZ2UxNiAqKnBwc3RnT3BlbgorKSB7CisJSEZJTEUzMgkJaGY7CisJaW50CQlyZXQsaTsKKwlMUFNUT1JBR0UxNglscHN0ZzsKKwlzdHJ1Y3Qgc3RvcmFnZV9wcHNfZW50cnkJc3RkZTsKKworCWZwcmludGYoc3RkZXJyLCJTdGdPcGVuU3RvcmFnZSglcywlcCwweCUwOGx4LCVwLCVsZCwlcClcbiIsCisJCXB3Y3NOYW1lLHBzdGdQcmlvcml0eSxncmZNb2RlLHNuYkV4Y2x1ZGUscmVzZXJ2ZWQscHBzdGdPcGVuCisJKTsKKwlfY3JlYXRlX2lzdG9yYWdlMTYocHBzdGdPcGVuKTsKKwloZiA9IENyZWF0ZUZpbGUzMkEocHdjc05hbWUsR0VORVJJQ19SRUFELDAsTlVMTCwwLDAsMCk7CisJaWYgKGhmPT1JTlZBTElEX0hBTkRMRV9WQUxVRTMyKSB7CisJCWZwcmludGYoc3RkZXJyLCJjb3VsZG4ndCBvcGVuIGZpbGUgZm9yIHN0b3JhZ2VcbiIpOworCQlyZXR1cm4gRV9GQUlMOworCX0KKwlscHN0ZyA9IChMUFNUT1JBR0UxNilQVFJfU0VHX1RPX0xJTigqcHBzdGdPcGVuKTsKKwlscHN0Zy0+aGYgPSBoZjsKKworCWk9MDtyZXQ9MDsKKwl3aGlsZSAoIXJldCkgeyAvKiBuZWl0aGVyIDEgbm9yIDwwICovCisJCXJldD1TVE9SQUdFX2dldF9wcHNfZW50cnkoaGYsaSwmc3RkZSk7CisJCWlmICgocmV0PT0xKSAmJiAoc3RkZS5wcHNfdHlwZT09NSkpIHsKKwkJCWxwc3RnLT5zdGRlPXN0ZGU7CisJCQlicmVhazsKKwkJfQorCQlpKys7CisJfQorCWlmIChyZXQhPTEpIHsKKwkJSVN0b3JhZ2UxNl9SZWxlYXNlKGxwc3RnKTsgLyogd2lsbCByZW1vdmUgaXQgKi8KKwkJcmV0dXJuIEVfRkFJTDsKKwl9CisJcmV0dXJuIE9MRV9PSzsKKwkKK30KKworT0xFU1RBVFVTIFdJTkFQSSBTdGdPcGVuU3RvcmFnZTMyKAorCWNvbnN0IE9MRUNIQVIzMiAqIHB3Y3NOYW1lLElTdG9yYWdlMzIgKnBzdGdQcmlvcml0eSxEV09SRCBncmZNb2RlLAorCVNOQjMyIHNuYkV4Y2x1ZGUsRFdPUkQgcmVzZXJ2ZWQsIElTdG9yYWdlMzIgKipwcHN0Z09wZW4KKykgeworCWZwcmludGYoc3RkZXJyLCJTdGdPcGVuU3RvcmFnZTMyKCVwLCVwLDB4JTA4bHgsJXAsJWxkLCVwKSxzdHViIVxuIiwKKwkJcHdjc05hbWUscHN0Z1ByaW9yaXR5LGdyZk1vZGUsc25iRXhjbHVkZSxyZXNlcnZlZCxwcHN0Z09wZW4KKwkpOworCSpwcHN0Z09wZW4gPSAoSVN0b3JhZ2UzMiopSGVhcEFsbG9jKEdldFByb2Nlc3NIZWFwKCksMCxzaXplb2YoSVN0b3JhZ2UzMikpOworCSgqcHBzdGdPcGVuKS0+cmVmID0gMTsKKwkoKnBwc3RnT3BlbiktPmxwdnRibCA9ICZzdHZ0MzI7CisJcmV0dXJuIE9MRV9PSzsKK30KZGlmZiAtLWdpdCBhL3Byb2dyYW1zL01ha2VmaWxlLmluIGIvcHJvZ3JhbXMvTWFrZWZpbGUuaW4KaW5kZXggMmYyZTgzOS4uNjUzYzdmMyAxMDA2NDQKLS0tIGEvcHJvZ3JhbXMvTWFrZWZpbGUuaW4KKysrIGIvcHJvZ3JhbXMvTWFrZWZpbGUuaW4KQEAgLTEsNiArMSw4IEBACiBTVUJESVJTID0gXAorCWNsb2NrIFwKIAlub3RlcGFkIFwKIAlwcm9nbWFuIFwKKwl2aWV3IFwKIAl3aW5oZWxwIFwKIAl3aW52ZXIKIApkaWZmIC0tZ2l0IGEvcHJvZ3JhbXMvY2xvY2svQ2hhbmdlTG9nIGIvcHJvZ3JhbXMvY2xvY2svQ2hhbmdlTG9nCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmNlMTBiNGYKLS0tIC9kZXYvbnVsbAorKysgYi9wcm9ncmFtcy9jbG9jay9DaGFuZ2VMb2cKQEAgLTAsMCArMSwxNCBAQAorVHVlIEZlYiAyNCAyMzoyNjo0MCAxOTk4ICBLYXJsIEJhY2tzdHL2bSA8a2FybF9iQGdlb2NpdGllcy5jb20+CisgICAgICAgKiBbbGFuZ3VhZ2UuY10gW2xhbmd1YWdlLmhdIE5FVworCSBNb3ZlZCBsYW5ndWFnZSBzdHVmZiBoZXJlLgorICAgICAgICogW21haW4uY10gW3dpbmNsb2NrLmNdIFtjbG9jay5yY10KKwkgTWFkZSB0aGUgY2xvY2sgYXBwZWFyIGluIHRoZSBjZW50ZXIuCisJIEZpeGVkIHByb2JsZW1zIHdpdGggbWVudWVzLgorCitNb24gRmViIDIzIDE5OjU5OjI3IDE5OTggIE1hcmNlbCBCYXVyIDxtYmF1ckBnMjYuZXRoei5jaD4KKyAgICAgICAqIFtDaGFuZ2VMb2ddIFtEZS5yY10gW0VuLnJjXSBbU3cucmNdIFtjbG9jay5yY10KKyAgICAgICAgIFtsaWNlbnNlLmNdIFtsaWNlbnNlLmhdIFtMaWNlbnNlX0VuLmNdCisgICAgICAgICBbUkVBRE1FXSBbVE9ET10KKyAgICAgICAgIFttYWluLmNdIFttYWluLmhdIFt3aW5jbG9jay5jXSBbd2luY2xvY2suaF0KKworCSBPcmlnaW5hbHMgYnkgTWFyY2VsIEJhdXIKZGlmZiAtLWdpdCBhL3Byb2dyYW1zL2Nsb2NrL0RlLnJjIGIvcHJvZ3JhbXMvY2xvY2svRGUucmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYWIxMzcxZQotLS0gL2Rldi9udWxsCisrKyBiL3Byb2dyYW1zL2Nsb2NrL0RlLnJjCkBAIC0wLDAgKzEsMzMgQEAKKy8qCisgKiBDbG9jayAoR2VybWFuIHJlc291cmNlcykKKyAqCisgKiBDb3B5cmlnaHQgMTk5NyBNYXJjZWwgQmF1ciA8bWJhdXJAZzI2LmV0aHouY2g+CisgKgorICovCisKKyNkZWZpbmUgTEFOR1VBR0VfSUQgICAgICAgICAgICAgICAgICBEZQorI2RlZmluZSBMQU5HVUFHRV9OVU1CRVIgICAgICAgICAgICAgIDIKKyNkZWZpbmUgTEFOR1VBR0VfTUVOVV9JVEVNICAgICAgICAgICAiJkRldXRzY2giCisKKy8qIE1lbnUgKi8KKworI2RlZmluZSBNRU5VX1BST1BFUlRJRVMgICAgICAgICAgICAgICImRWluc3RlbGx1bmdlbiIKKyNkZWZpbmUgTUVOVV9BTkFMT0cgICAgICAgICAgICAgICAgICAiQW5hJmxvZyIKKyNkZWZpbmUgTUVOVV9ESUdJVEFMICAgICAgICAgICAgICAgICAiRGlnaSZ0YWwiCisjZGVmaW5lIE1FTlVfRk9OVCAgICAgICAgICAgICAgICAgICAgIlNjaHJpZnQmYXJ0Li4uIgorI2RlZmluZSBNRU5VX1dJVEhPVVRfVElUTEUgICAgICAgICAgICImT2huZSBUaXRlbGxlaXN0ZSIKKyNkZWZpbmUgTUVOVV9PTl9UT1AgICAgICAgICAgICAgICAgICAiJkltbWVyIGltIFZvcmRlcmdydW5kIgorI2RlZmluZSBNRU5VX1NFQ09ORFMgICAgICAgICAgICAgICAgICImU2VrdW5kZW4iCisjZGVmaW5lIE1FTlVfREFURSAgICAgICAgICAgICAgICAgICAgIiZEYXR1bSIKKworI2RlZmluZSBNRU5VX0xBTkdVQUdFICAgICAgICAgICAgICAgICImU3ByYWNoZSIKKworI2RlZmluZSBNRU5VX0lORk8gICAgICAgICAgICAgICAgICAgICJJbmYmby4uLiIKKyNkZWZpbmUgTUVOVV9JTkZPX0xJQ0VOU0UgICAgICAgICAgICAiJkxpemVueiIKKyNkZWZpbmUgTUVOVV9JTkZPX05PX1dBUlJBTlRZICAgICAgICAiJktFSU5FIEdBUkFOVElFIgorI2RlZmluZSBNRU5VX0lORk9fQUJPVVRfV0lORSAgICAgICAgICIm3GJlciBVaHIuLi4iCisKKy8qIFN0cmluZ3MgKi8KKyNkZWZpbmUgU1RSSU5HX0NMT0NLICAgICAgICAgICAgICAgICAiVWhyIgorCisjaW5jbHVkZSAiY2xvY2sucmMiCmRpZmYgLS1naXQgYS9wcm9ncmFtcy9jbG9jay9Fbi5yYyBiL3Byb2dyYW1zL2Nsb2NrL0VuLnJjCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjMzMzBjZjcKLS0tIC9kZXYvbnVsbAorKysgYi9wcm9ncmFtcy9jbG9jay9Fbi5yYwpAQCAtMCwwICsxLDM0IEBACisvKgorICogQ2xvY2sgKEVuZ2xpc2ggcmVzb3VyY2VzKQorICoKKyAqIENvcHlyaWdodCAxOTk4IE1hcmNlbCBCYXVyIDxtYmF1ckBnMjYuZXRoei5jaD4KKyAqIEZJWE1FOiBXZWFrIHRyYW5zbGF0aW9uICEKKyAqLworCisjZGVmaW5lIExBTkdVQUdFX0lEICAgICAgICAgICAgICAgICAgRW4KKyNkZWZpbmUgTEFOR1VBR0VfTlVNQkVSICAgICAgICAgICAgICAwCisjZGVmaW5lIExBTkdVQUdFX01FTlVfSVRFTSAgICAgICAgICAgIiZFbmdsaXNoIgorCisvKiBNZW51ICovCisKKyNkZWZpbmUgTUVOVV9QUk9QRVJUSUVTICAgICAgICAgICAgICAiJlByb3BlcnRpZXMiCisjZGVmaW5lIE1FTlVfQU5BTE9HICAgICAgICAgICAgICAgICAgIkFuYSZsb2ciCisjZGVmaW5lIE1FTlVfRElHSVRBTCAgICAgICAgICAgICAgICAgIkRpZ2kmdGFsIgorI2RlZmluZSBNRU5VX0ZPTlQgICAgICAgICAgICAgICAgICAgICImRm9udC4uLiIKKyNkZWZpbmUgTUVOVV9XSVRIT1VUX1RJVExFICAgICAgICAgICAiJldpdGhvdXQgVGl0bGViYXIiCisjZGVmaW5lIE1FTlVfT05fVE9QICAgICAgICAgICAgICAgICAgIiZBbHdheXMgb24gVG9wIgorI2RlZmluZSBNRU5VX1NFQ09ORFMgICAgICAgICAgICAgICAgICImU2Vjb25kcyIKKyNkZWZpbmUgTUVOVV9EQVRFICAgICAgICAgICAgICAgICAgICAiJkRhdGUiCisKKyNkZWZpbmUgTUVOVV9MQU5HVUFHRSAgICAgICAgICAgICAgICAiJkxhbmd1YWdlIgorCisjZGVmaW5lIE1FTlVfSU5GTyAgICAgICAgICAgICAgICAgICAgIkluZiZvLi4uIgorI2RlZmluZSBNRU5VX0lORk9fTElDRU5TRSAgICAgICAgICAgICImTGljZW5zZSIKKyNkZWZpbmUgTUVOVV9JTkZPX05PX1dBUlJBTlRZICAgICAgICAiJk5PIFdBUlJBTlRZIgorI2RlZmluZSBNRU5VX0lORk9fQUJPVVRfV0lORSAgICAgICAgICImQWJvdXQgQ2xvY2suLi4iCisKKy8qIFN0cmluZ3MgKi8KKyNkZWZpbmUgU1RSSU5HX0NMT0NLICAgICAgICAgICAgICAgICAiQ2xvY2siCisKKworI2luY2x1ZGUgImNsb2NrLnJjIgpkaWZmIC0tZ2l0IGEvcHJvZ3JhbXMvY2xvY2svTGljZW5zZV9Fbi5jIGIvcHJvZ3JhbXMvY2xvY2svTGljZW5zZV9Fbi5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmJlYzY2ZDkKLS0tIC9kZXYvbnVsbAorKysgYi9wcm9ncmFtcy9jbG9jay9MaWNlbnNlX0VuLmMKQEAgLTAsMCArMSw0OCBAQAorI2luY2x1ZGUgIndpbmRvd3MuaCIKKyNpbmNsdWRlICJsaWNlbnNlLmgiCisKK3N0YXRpYyBDSEFSIExpY2Vuc2VDYXB0aW9uX0VuW10gPSAiTElDRU5TRSI7CitzdGF0aWMgQ0hBUiBMaWNlbnNlX0VuW10gPSAiXAorWW91IG1heSB3aXRob3V0IGNoYXJnZSwgcm95YWx0eSBvciBvdGhlciBwYXltZW50LCBjb3B5IGFuZFwKKyBkaXN0cmlidXRlIGNvcGllcyBvZiB0aGlzIHdvcmsgYW5kIGRlcml2YXRpdmUgd29ya3Mgb2YgdGhpcyB3b3JrXAorIGluIHNvdXJjZSBvciBiaW5hcnkgZm9ybSBwcm92aWRlZCB0aGF0OiAoMSlcCisgeW91IGFwcHJvcHJpYXRlbHkgcHVibGlzaCBvbiBlYWNoIGNvcHkgYW4gYXBwcm9wcmlhdGUgY29weXJpZ2h0XAorIG5vdGljZTsgKDIpIGZhaXRoZnVsbHkgcmVwcm9kdWNlIGFsbCBwcmlvciBjb3B5cmlnaHQgbm90aWNlc1wKKyBpbmNsdWRlZCBpbiB0aGUgb3JpZ2luYWwgd29yayAoeW91IG1heSBhbHNvIGFkZCB5b3VyIG93blwKKyBjb3B5cmlnaHQgbm90aWNlKTsgYW5kICgzKSBhZ3JlZSB0byBpbmRlbW5pZnkgYW5kIGhvbGQgYWxsIHByaW9yXAorIGF1dGhvcnMsIGNvcHlyaWdodCBob2xkZXJzIGFuZCBsaWNlbnNvcnMgb2YgdGhlIHdvcmsgaGFybWxlc3NcCisgZnJvbSBhbmQgYWdhaW5zdCBhbGwgZGFtYWdlcyBhcmlzaW5nIGZyb20gdXNlIG9mIHRoZSB3b3JrLlwKK1xuXAorWW91IG1heSBkaXN0cmlidXRlIHNvdXJjZXMgb2YgZGVyaXZhdGl2ZSB3b3JrcyBvZiB0aGUgd29ya1wKKyBwcm92aWRlZCB0aGF0ICgxKSAoYSkgYWxsIHNvdXJjZSBmaWxlcyBvZiB0aGUgb3JpZ2luYWwgd29yayB0aGF0XAorIGhhdmUgYmVlbiBtb2RpZmllZCwgKGIpIGFsbCBzb3VyY2UgZmlsZXMgb2YgdGhlIGRlcml2YXRpdmUgd29ya1wKKyB0aGF0IGNvbnRhaW4gYW55IHBhcnR5IG9mIHRoZSBvcmlnaW5hbCB3b3JrLCBhbmQgKGMpIGFsbCBzb3VyY2VcCisgZmlsZXMgb2YgdGhlIGRlcml2YXRpdmUgd29yayB0aGF0IGFyZSBuZWNlc3NhcnkgdG8gY29tcGlsZSwgbGlua1wKKyBhbmQgcnVuIHRoZSBkZXJpdmF0aXZlIHdvcmsgd2l0aG91dCB1bnJlc29sdmVkIGV4dGVybmFsIGNhbGxzIGFuZFwKKyB3aXRoIHRoZSBzYW1lIGZ1bmN0aW9uYWxpdHkgb2YgdGhlIG9yaWdpbmFsIHdvcmsgKFwiTmVjZXNzYXJ5XAorIFNvdXJjZXNcIikgY2FycnkgYSBwcm9taW5lbnQgbm90aWNlIGV4cGxhaW5pbmcgdGhlIG5hdHVyZSBhbmQgZGF0ZVwKKyBvZiB0aGUgbW9kaWZpY2F0aW9uIGFuZC9vciBjcmVhdGlvbi4gIFlvdSBhcmUgZW5jb3VyYWdlZCB0byBtYWtlXAorIHRoZSBOZWNlc3NhcnkgU291cmNlcyBhdmFpbGFibGUgdW5kZXIgdGhpcyBsaWNlbnNlIGluIG9yZGVyIHRvXAorIGZ1cnRoZXIgdGhlIGRldmVsb3BtZW50IGFuZCBhY2NlcHRhbmNlIG9mIHRoZSB3b3JrLlwKK1xuXAorRVhDRVBUIEFTIE9USEVSV0lTRSBSRVNUUklDVEVEIEJZIExBVywgVEhJUyBXT1JLIElTIFBST1ZJREVEXAorIFdJVEhPVVQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTIE9GIEFOWSBLSU5ELCBJTkNMVURJTkdcCisgQlVUIE5PVCBMSU1JVEVEIFRPLCBBTlkgSU1QTElFRCBXQVJSQU5USUVTIE9GIEZJVE5FU1MgRk9SIEFcCisgUEFSVElDVUxBUiBQVVJQT1NFLCBNRVJDSEFOVEFCSUxJVFkgT1IgVElUTEUuICBFWENFUFQgQVNcCisgT1RIRVJXSVNFIFBST1ZJREVEIEJZIExBVywgTk8gQVVUSE9SLCBDT1BZUklHSFQgSE9MREVSIE9SXAorIExJQ0VOU09SIFNIQUxMIEJFIExJQUJMRSBUTyBZT1UgRk9SIERBTUFHRVMgT0YgQU5ZIEtJTkQsIEVWRU4gSUZcCisgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0VTLiI7CisKK3N0YXRpYyBDSEFSIE5vV2FycmFudHlDYXB0aW9uX0VuW10gPSAiTk8gV0FSUkFOVFkiOworc3RhdGljIENIQVIgTm9XYXJyYW50eV9FbltdID0gIlwKK0VYQ0VQVCBBUyBPVEhFUldJU0UgUkVTVFJJQ1RFRCBCWSBMQVcsIFRISVMgV09SSyBJUyBQUk9WSURFRFwKKyBXSVRIT1VUIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUyBPRiBBTlkgS0lORCwgSU5DTFVESU5HXAorIEJVVCBOT1QgTElNSVRFRCBUTywgQU5ZIElNUExJRUQgV0FSUkFOVElFUyBPRiBGSVRORVNTIEZPUiBBXAorIFBBUlRJQ1VMQVIgUFVSUE9TRSwgTUVSQ0hBTlRBQklMSVRZIE9SIFRJVExFLiAgRVhDRVBUIEFTXAorIE9USEVSV0lTRSBQUk9WSURFRCBCWSBMQVcsIE5PIEFVVEhPUiwgQ09QWVJJR0hUIEhPTERFUiBPUlwKKyBMSUNFTlNPUiBTSEFMTCBCRSBMSUFCTEUgVE8gWU9VIEZPUiBEQU1BR0VTIE9GIEFOWSBLSU5ELCBFVkVOIElGXAorIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFUy4iOworCitMSUNFTlNFIFdpbmVMaWNlbnNlX0VuID0ge0xpY2Vuc2VfRW4sIExpY2Vuc2VDYXB0aW9uX0VuLAorCQkJICBOb1dhcnJhbnR5X0VuLCBOb1dhcnJhbnR5Q2FwdGlvbl9Fbn07CisKZGlmZiAtLWdpdCBhL3Byb2dyYW1zL2Nsb2NrL01ha2VmaWxlLmluIGIvcHJvZ3JhbXMvY2xvY2svTWFrZWZpbGUuaW4KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDZiMzdkMQotLS0gL2Rldi9udWxsCisrKyBiL3Byb2dyYW1zL2Nsb2NrL01ha2VmaWxlLmluCkBAIC0wLDAgKzEsNDcgQEAKK0RFRlMgICAgICA9IC1EV0lORUxJQgorVE9QU1JDRElSID0gQHRvcF9zcmNkaXJACitUT1BPQkpESVIgPSAuLi8uLgorU1JDRElSICAgID0gQHNyY2RpckAKK1ZQQVRIICAgICA9IEBzcmNkaXJACitNT0RVTEUgICAgPSBub25lCitQUk9HUkFNUyAgPSBjbG9jaworQUxMX0xJQlMgID0gJChXSU5FTElCKSAkKFhfTElCUykgJChYUE1fTElCKSAkKFhMSUIpICQoTElCUykKK1JDRkxBR1MgICA9IC13MzIgLWgKKworTEFOR1VBR0VTICAgPSBFbiBEZSBTdworTElDRU5TRUxBTkcgPSBFbgorCitNT1NUU1JDUyA9IFwKKwlsYW5ndWFnZS5jIFwKKwlsaWNlbnNlLmMgXAorCXdpbmNsb2NrLmMgXAorCW1haW4uYworCisjIFNvbWUgc3RyaW5ncyBuZWVkIGFkZHJlc3NlcyA+PSAweDEwMDAwCitTVFJJTkdTUkNTID0gXAorCSQoTElDRU5TRUxBTkc6JT1MaWNlbnNlXyUuYykKKworUkNfU1JDUyA9ICQoTEFOR1VBR0VTOiU9JS5yYykKKworQ19TUkNTID0gJChNT1NUU1JDUykgJChTVFJJTkdTUkNTKQorCitNT1NUT0JKUyA9ICQoTU9TVFNSQ1M6LmM9Lm8pCitTVFJJTkdPQkpTID0gJChTVFJJTkdTUkNTOi5jPS5vKSAkKFJDX1NSQ1M6LnJjPS5vKQorCithbGw6IGNoZWNrX3dpbmVyYyAkKFBST0dSQU1TKQorCitkZXBlbmQ6OiAkKFJDX1NSQ1M6LnJjPS5oKQorCitATUFLRV9SVUxFU0AKKworY2xvY2s6ICQoTU9TVE9CSlMpICQoU1RSSU5HT0JKUykKKwkkKENDKSAtbyBjbG9jayAkKE1PU1RPQkpTKSAkKExET1BUSU9OUykgJChBTExfTElCUykgJChTVFJJTkdPQkpTKQorCitpbnN0YWxsOiBkdW1teQorCSQoSU5TVEFMTF9QUk9HUkFNKSBjbG9jayAkKGJpbmRpcikvY2xvY2sKKworJChSQ19TUkNTOi5yYz0uYykgJChSQ19TUkNTOi5yYz0uaCk6ICQoV0lORVJDKQorCitkdW1teToKKworIyMjIERlcGVuZGVuY2llczoKZGlmZiAtLWdpdCBhL3Byb2dyYW1zL2Nsb2NrL1JFQURNRSBiL3Byb2dyYW1zL2Nsb2NrL1JFQURNRQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40MGNjMDQ4Ci0tLSAvZGV2L251bGwKKysrIGIvcHJvZ3JhbXMvY2xvY2svUkVBRE1FCkBAIC0wLDAgKzEsMTggQEAKKworIENsb2NrIGZvciBXaW5lCisgPT09PT09PT09PT09PT0KKyAKKyBUaGlzIGlzIGEgZmlyc3QgYXR0ZW1wdCB0byByZWFsaXplIGEgZGVza3RvcCBjbG9jayBmb3IgV2luZSBhcyBkb25lIGluIAorIFdpbmRvd3MuIEl0J2EgYW4gZWFybHkgcmVsZWFzZSBhbmQgbW9zdCBvZiB0aGUgY29kZSBpcyBzdGlsbCBicm9rZW4uCisKKyBQbGVhc2Ugc2VlIGZpbGUgVE9ETyBmb3IgdGhpbmdzIHRvIGRvIGFuZCBrZWVwIHRoZSBmaWxlIENoYW5nZUxvZworIHVwIHRvIGRhdGUuCisKKyBDb2RlIGlzIGN1cnJlbnRseSB1bmRlciBoZWF2eSBjb25zdHJ1Y3Rpb24uIE5lYXJseSBhbGwgZmlsZXMgd2lsbCAKKyBjaGFuZ2UgdW50aWwgbmV4dCByZWxlYXNlLiBZb3UgY2FuIHNwZWVkIHVwIGRldmVsb3BtZW50IG9mIGNsb2NrCisgaWYgeW91IHNlbmQgcGF0Y2hlcyBhbmQgYWRkaXRpb25zIGRpcmVjdGx5IHRvIG15IHBlcnNvbmFsIGVtYWlsIAorIGFkZHJlc3MgPG1iYXVyQGcyNi5ldGh6LmNoPi4KKworIEkgYWxzbyB0cnkgdG8gcmVhZCBuZXdzOmNvbXAuZW11bGF0b3JzLm1zLXdpbmRvd3Mud2luZSBmcmVxdWVudGx5LCAKKyBzbyBJIGNhbiBhbHNvIGludGVncmF0ZSBwYXRjaGVzIHBvc3RlZCB2aWEgdXNlbmV0LgorCmRpZmYgLS1naXQgYS9wcm9ncmFtcy9jbG9jay9Tdy5yYyBiL3Byb2dyYW1zL2Nsb2NrL1N3LnJjCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjllNThjYzkKLS0tIC9kZXYvbnVsbAorKysgYi9wcm9ncmFtcy9jbG9jay9Tdy5yYwpAQCAtMCwwICsxLDMzIEBACisvKgorICogQ2xvY2sgKFN3ZWRpc2ggcmVzb3VyY2VzKQorICoKKyAqIENvcHlyaWdodCAxOTk4IE1hcmNlbCBCYXVyIDxtYmF1ckBnMjYuZXRoei5jaD4KKyAqIFRyYW5zbGF0ZWQgaW50byBzd2VkaXNoIGJ5IEthcmwgQmFja3N0cvZtIDxrYXJsX2JAZ2VvY2l0aWVzLmNvbT4gCisgKi8KKworI2RlZmluZSBMQU5HVUFHRV9JRCAgICAgICAgICAgICAgICAgIFN3CisjZGVmaW5lIExBTkdVQUdFX05VTUJFUiAgICAgICAgICAgICAgMWQKKyNkZWZpbmUgTEFOR1VBR0VfTUVOVV9JVEVNICAgICAgICAgICAiJlN2ZW5za2EiCisKKy8qIE1lbnUgKi8KKworI2RlZmluZSBNRU5VX1BST1BFUlRJRVMgICAgICAgICAgICAgICImRWdlbnNrYXBlciIKKyNkZWZpbmUgTUVOVV9BTkFMT0cgICAgICAgICAgICAgICAgICAiQW5hJmxvZyIKKyNkZWZpbmUgTUVOVV9ESUdJVEFMICAgICAgICAgICAgICAgICAiRGlnaSZ0YWwiCisjZGVmaW5lIE1FTlVfRk9OVCAgICAgICAgICAgICAgICAgICAgIiZGb250Li4uIgorI2RlZmluZSBNRU5VX1dJVEhPVVRfVElUTEUgICAgICAgICAgICImVXRhbiBUaXRsZWJhciIKKyNkZWZpbmUgTUVOVV9PTl9UT1AgICAgICAgICAgICAgICAgICAiJkFsbHRpZCD2dmVyc3QiCisjZGVmaW5lIE1FTlVfU0VDT05EUyAgICAgICAgICAgICAgICAgIiZTZWt1bmRlciIKKyNkZWZpbmUgTUVOVV9EQVRFICAgICAgICAgICAgICAgICAgICAiJkRhdHVtIgorCisjZGVmaW5lIE1FTlVfTEFOR1VBR0UgICAgICAgICAgICAgICAgIiZTcHLlayIKKworI2RlZmluZSBNRU5VX0lORk8gICAgICAgICAgICAgICAgICAgICJJbmYmby4uLiIKKyNkZWZpbmUgTUVOVV9JTkZPX0xJQ0VOU0UgICAgICAgICAgICAiJkxpY2VucyIKKyNkZWZpbmUgTUVOVV9JTkZPX05PX1dBUlJBTlRZICAgICAgICAiJklOR0VOIEdBUkFOVEkiCisjZGVmaW5lIE1FTlVfSU5GT19BQk9VVF9XSU5FICAgICAgICAgIiZPbSBLbG9ja2FuLi4uIgorCisvKiBTdHJpbmdzICovCisjZGVmaW5lIFNUUklOR19DTE9DSyAgICAgICAgICAgICAgICAgIktsb2NrYW4iCisKKyNpbmNsdWRlICJjbG9jay5yYyIKZGlmZiAtLWdpdCBhL3Byb2dyYW1zL2Nsb2NrL1RPRE8gYi9wcm9ncmFtcy9jbG9jay9UT0RPCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjdkMTVkMWEKLS0tIC9kZXYvbnVsbAorKysgYi9wcm9ncmFtcy9jbG9jay9UT0RPCkBAIC0wLDAgKzEsMzYgQEAKKworU29tZSBpZGVhcyBmb3IgaW1wcm92ZW1lbnRzOgorPT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCistIEFkZCBGb250IFNlbGVjdGlvbiBEaWFsb2cgKHNob3VsZCBiZSBDb21tRGxnKS4KKworLSBNYWtlICJXaXRob3V0IFRpdGxlYmFyIiwgRG91YmxlLWNsaWNraW5nIHRoZSBjbG9jayBzaG91bGQgcmV2ZWFsIHRoZSBjYXB0aW9uCisgIGFnYWluLgorCistIE1vdmUgdGhlICJXaXRob3V0IFRpdGxlYmFyIiBpbnRvIHRoZSBTeXN0ZW0gTWVudSAoYXMgaW4gV2luZG93cykKKworLSBJbXBsZW1lbnQgYSAiZGlnaXRhbCBjbG9jayIKKworLSBGb250IEhhbmRsaW5nIG9mIERpZ2l0YWwgQ2xvY2suCisKKy0gTWFrZSBkaXN0aW5jdGlvbiBiZXR3ZWVuIGFuYWxvZyBjbG9jayBhbmQgZGlnaXRhbCBjbG9jayBhY2NvcmRpbmcgdG8KKyAgR2xvYmFscy5iQW5hbG9nIHNldHRpbmcgLyBDTF9BTkFMT0cgbWVudSBldmVudC4KKworLSBJbXBsZW1lbnQgRGF0ZSAoV2luZG93IGNhcHRpb24pLCBidXQgbWluZCB0aGUgZGlmZmVyZW50IGxhbmd1YWdlcy4KKworLSBNYWtlIGRpc3RpbmN0aW9uIGJldHdlZW4gRGF0ZSAvIG5vIERhdGUgYWNjb3JkaW5nIHRvCisgIEdsb2JhbHMuYkRhdGUgc2V0dGluZyAvIENMX0RBVEUgbWVudSBldmVudC4KKworLSBJbXBsZW1lbnQgVGltZXIgTWVjaGFuaXNtIGluc3RlYWQgUG9sbGluZy4KKyAgQ2xvY2sgZG9lcyBub3QgcnVuIGlmIG1lbnUgaXMgYmVpbmcgc2VsZWN0ZWQgKD8pLgorCistIEZpeCBDbG9jayBCYWNrZ3JvdW5kIChzb21ldGltZXMgZGVzdHJveWVkKS4KKyAgKCBUaGlzIGlzIGJlY2F1c2UgdGhlIG9sZCAiSGFuZHMiIGFyZSByZW1vdmVkIG9uZSBtb3JlIHRpbWUgKQorCistIEZpeCBFbmdsaXNoIHRyYW5zbGF0aW9uIGJ5IGNvbXBhcmluZyBzdHJpbmdzIGZyb20gYW4gb3JpZ2luYWwgRW5nbGlzaAorICBXaW5kb3dzIENsb2NrIGFwcGxpY2F0aW9uIChJIG9ubHkgaGF2ZSBhIEdlcm1hbiB2ZXJzaW9uKS4KKworLSBBZGQgbmV3IC5yYyByZXNvdXJjZXMgZm9yIGFsbCBsYW5ndWFnZXMgeW91IGtub3cuCisKKworUGxlYXNlIGRvbid0IGZvcmdldCBhIENoYW5nZUxvZyBlbnRyeS4KZGlmZiAtLWdpdCBhL3Byb2dyYW1zL2Nsb2NrL2Nsb2NrLnJjIGIvcHJvZ3JhbXMvY2xvY2svY2xvY2sucmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMmQ3OWVhNQotLS0gL2Rldi9udWxsCisrKyBiL3Byb2dyYW1zL2Nsb2NrL2Nsb2NrLnJjCkBAIC0wLDAgKzEsNjAgQEAKKy8qCisgKiBDbG9jayAoY2xvY2sucmMpCisgKgorICogQ29weXJpZ2h0IDE5OTggTWFyY2VsIEJhdXIgPG1iYXVyQGcyNi5ldGh6LmNoPgorICovCisKKyNpbmNsdWRlICJtYWluLmgiCisgCisjZGVmaW5lIENPTkNBVChhLCBiKSBDT05DQVQxKGEsIGIpCisjZGVmaW5lIENPTkNBVDEoYSwgYikgYSMjYgorCisvKiBNYWluIE1lbnUgKi8KKworQ09OQ0FUKE1FTlVfLCBMQU5HVUFHRV9JRCkgTUVOVQoreworIFBPUFVQIE1FTlVfUFJPUEVSVElFUyB7CisgICBNRU5VSVRFTSBNRU5VX0FOQUxPRywgICAgICAgICAgICAgICAgQ0xfQU5BTE9HCisgICBNRU5VSVRFTSBNRU5VX0RJR0lUQUwsICAgICAgICAgICAgICAgQ0xfRElHSVRBTAorICAgTUVOVUlURU0gU0VQQVJBVE9SCisgICBNRU5VSVRFTSBNRU5VX0ZPTlQsICAgICAgICAgICAgICAgICAgQ0xfRk9OVAorICAgTUVOVUlURU0gU0VQQVJBVE9SCisgICBNRU5VSVRFTSBNRU5VX1dJVEhPVVRfVElUTEUsICAgICAgICAgQ0xfV0lUSE9VVF9USVRMRQorICAgTUVOVUlURU0gU0VQQVJBVE9SCisgICBNRU5VSVRFTSBNRU5VX1NFQ09ORFMsICAgICAgICAgICAgICAgQ0xfU0VDT05EUworICAgTUVOVUlURU0gTUVOVV9EQVRFLCAgICAgICAgICAgICAgICAgIENMX0RBVEUKKyAgIE1FTlVJVEVNIFNFUEFSQVRPUgorICAgTUVOVUlURU0gTUVOVV9PTl9UT1AsICAgICAgICAgICAgICAgIENMX09OX1RPUAorICAgfQorICAgUE9QVVAgTUVOVV9MQU5HVUFHRSB7CisgICAgIC8qIER1bW15IGl0ZW0sIHdpbGwgYmUgcmVtb3ZlZCAqLworICAgICBNRU5VSVRFTSBTRVBBUkFUT1IKKyAgIH0KKyAgIAorICAgUE9QVVAgTUVOVV9JTkZPIHsKKyAgICAgIE1FTlVJVEVNIE1FTlVfSU5GT19MSUNFTlNFLCAgICAgICBDTF9JTkZPX0xJQ0VOU0UKKyAgICAgIE1FTlVJVEVNIE1FTlVfSU5GT19OT19XQVJSQU5UWSwgICBDTF9JTkZPX05PX1dBUlJBTlRZCisgICAgICBNRU5VSVRFTSBNRU5VX0lORk9fQUJPVVRfV0lORSwgICAgQ0xfSU5GT19BQk9VVF9XSU5FCisgICB9CisgCit9CisKKy8qIFN0cmluZ3MgKi8KKworI2RlZmluZSBBRERTVFJJTkcoc3RyKSBBRERTVFJJTkcxKExBTkdVQUdFX05VTUJFUiwgSURTXyAjIyBzdHIpIFNUUklOR18gIyMgc3RyCisjZGVmaW5lIEFERFNUUklORzEobGFuZ251bSwgaWRzKSBBRERTVFJJTkcyKGxhbmdudW0sIGlkcykKKyNkZWZpbmUgQUREU1RSSU5HMihsYW5nbnVtLCBpZHMpIDB4ICMjIGxhbmdudW0gIyMgaWRzCisKKyNkZWZpbmUgU1RSSU5HSUZZKHN0cikgU1RSSU5HSUZZMShzdHIpCisjZGVmaW5lIFNUUklOR0lGWTEoc3RyKSAjc3RyCisKKyNkZWZpbmUgU1RSSU5HX0xBTkdVQUdFX0lEICAgICAgICBTVFJJTkdJRlkoTEFOR1VBR0VfSUQpCisjZGVmaW5lIFNUUklOR19MQU5HVUFHRV9NRU5VX0lURU0gTEFOR1VBR0VfTUVOVV9JVEVNCisKKworU1RSSU5HVEFCTEUKK3sKK0FERFNUUklORyhMQU5HVUFHRV9JRCkKK0FERFNUUklORyhMQU5HVUFHRV9NRU5VX0lURU0pCitBRERTVFJJTkcoQ0xPQ0spCit9CmRpZmYgLS1naXQgYS9wcm9ncmFtcy9jbG9jay9sYW5ndWFnZS5jIGIvcHJvZ3JhbXMvY2xvY2svbGFuZ3VhZ2UuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zMDc0ZjBkCi0tLSAvZGV2L251bGwKKysrIGIvcHJvZ3JhbXMvY2xvY2svbGFuZ3VhZ2UuYwpAQCAtMCwwICsxLDE0NiBAQAorLyoKKyAqIENsb2NrCisgKgorICogQ29weXJpZ2h0IDE5OTggTWFyY2VsIEJhdXIgPG1iYXVyQGcyNi5ldGh6LmNoPgorICogQ29weXJpZ2h0IDE5OTggS2FybCBCYWNrc3Ry9m0gPGthcmxfYkBnZW9jaXRpZXMuY29tPgorICovCisKKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgIndpbmRvd3MuaCIKKyNpbmNsdWRlICJtYWluLmgiCisjaW5jbHVkZSAibGFuZ3VhZ2UuaCIKKyNpZmRlZiBXSU5FTElCCisjaW5jbHVkZSAib3B0aW9ucy5oIgorI2VuZGlmCisKK0NIQVIgU1RSSU5HX01FTlVfWHhbXSAgICAgID0gIk1FTlVfWHgiOworCitzdGF0aWMgQk9PTCBMQU5HVUFHRV9Mb2FkU3RyaW5nT3RoZXJMYW5ndWFnZShVSU5UIG51bSwgVUlOVCBpZHMsIExQU1RSIHN0ciwgVUlOVCBsZW4pCit7CisgIGlkcyAtPSBHbG9iYWxzLndTdHJpbmdUYWJsZU9mZnNldDsKKyAgaWRzICs9IG51bSAqIDB4MTAwOworICByZXR1cm4oTG9hZFN0cmluZyhHbG9iYWxzLmhJbnN0YW5jZSwgaWRzLCBzdHIsIGxlbikpOworfTsKKworVk9JRCBMQU5HVUFHRV9TZWxlY3RMYW5ndWFnZUJ5TmFtZShMUENTVFIgbGFuZykKK3sKKyAgSU5UIGk7CisgIENIQVIgbmV3bGFuZ1szXTsKKworICBmb3IgKGkgPSAwOyBpIDw9IE1BWF9MQU5HVUFHRV9OVU1CRVI7IGkrKykKKyAgICBpZiAoTEFOR1VBR0VfTG9hZFN0cmluZ090aGVyTGFuZ3VhZ2UoaSwgSURTX0xBTkdVQUdFX0lELCBuZXdsYW5nLCBzaXplb2YobmV3bGFuZykpICYmCisJIWxzdHJjbXAobGFuZywgbmV3bGFuZykpCisgICAgICB7CisgICAgICAgIExBTkdVQUdFX1NlbGVjdExhbmd1YWdlQnlOdW1iZXIoaSk7CisJcmV0dXJuOworICAgICAgfQorCisgIC8qIEZhbGxiYWNrICovCisgICAgZm9yIChpID0gMDsgaSA8PSBNQVhfTEFOR1VBR0VfTlVNQkVSOyBpKyspCisgICAgaWYgKExBTkdVQUdFX0xvYWRTdHJpbmdPdGhlckxhbmd1YWdlKGksIElEU19MQU5HVUFHRV9JRCwgbmV3bGFuZywgc2l6ZW9mKG5ld2xhbmcpKSkKKyAgICAgIHsKKwlMQU5HVUFHRV9TZWxlY3RMYW5ndWFnZUJ5TnVtYmVyKGkpOworCXJldHVybjsKKyAgICAgIH0KKworICBNZXNzYWdlQm94KEdsb2JhbHMuaE1haW5XbmQsICJObyBsYW5ndWFnZSBmb3VuZCIsICJGQVRBTCBFUlJPUiIsIE1CX09LKTsKKyAgUG9zdFF1aXRNZXNzYWdlKDEpOworfQorCitWT0lEIExBTkdVQUdFX1NlbGVjdExhbmd1YWdlQnlOdW1iZXIoVUlOVCBudW0pCit7CisgIElOVCAgICBpOworICBDSEFSICAgbGFuZ1szXTsKKyAgQ0hBUiAgIGNhcHRpb25bTUFYX1NUUklOR19MRU5dOworICBDSEFSICAgaXRlbVtNQVhfU1RSSU5HX0xFTl07CisgIEhNRU5VICBoTWFpbk1lbnU7CisKKyAgLyogU2VsZWN0IHN0cmluZyB0YWJsZSAqLworICBHbG9iYWxzLndTdHJpbmdUYWJsZU9mZnNldCA9IG51bSAqIDB4MTAwOworCisgIC8qIEdldCBMYW5ndWFnZSBpZCAqLworICBMb2FkU3RyaW5nKEdsb2JhbHMuaEluc3RhbmNlLCBJRFNfTEFOR1VBR0VfSUQsIGxhbmcsIHNpemVvZihsYW5nKSk7CisgIEdsb2JhbHMubHBzekxhbmd1YWdlID0gbGFuZzsKKyAgcHJpbnRmKCIgR2xvYmFscy5scHN6TGFuZ3VhZ2U6ICVzXG4iLCBHbG9iYWxzLmxwc3pMYW5ndWFnZSk7CisKKyAgLyogU2V0IGZyYW1lIGNhcHRpb24gKi8KKyAgTG9hZFN0cmluZyhHbG9iYWxzLmhJbnN0YW5jZSwgSURTX0NMT0NLLCBjYXB0aW9uLCBzaXplb2YoY2FwdGlvbikpOworICBTZXRXaW5kb3dUZXh0KEdsb2JhbHMuaE1haW5XbmQsIGNhcHRpb24pOworCisgIC8qIENoYW5nZSBSZXNvdXJjZSBuYW1lcyAqLworICBsc3RyY3B5bihTVFJJTkdfTUVOVV9YeCAgICArIHNpemVvZihTVFJJTkdfTUVOVV9YeCkgICAgLSAzLCBsYW5nLCAzKTsKKworICAvKiBDcmVhdGUgbWVudSAqLworICBoTWFpbk1lbnUgPSBMb2FkTWVudShHbG9iYWxzLmhJbnN0YW5jZSwgU1RSSU5HX01FTlVfWHgpOworICAgIEdsb2JhbHMuaFByb3BlcnRpZXNNZW51ICAgICA9IEdldFN1Yk1lbnUoaE1haW5NZW51LCAwKTsKKyAgICBHbG9iYWxzLmhMYW5ndWFnZU1lbnUgCT0gR2V0U3ViTWVudShoTWFpbk1lbnUsIDEpOworICAgIEdsb2JhbHMuaEluZm9NZW51ICAgICAJPSBHZXRTdWJNZW51KGhNYWluTWVudSwgMik7CisKKyAgLyogUmVtb3ZlIGR1bW15IGl0ZW0gKi8KKyAgUmVtb3ZlTWVudShHbG9iYWxzLmhMYW5ndWFnZU1lbnUsIDAsIE1GX0JZUE9TSVRJT04pOworICAvKiBBZGQgbGFuZ3VhZ2UgaXRlbXMgKi8KKyAgZm9yIChpID0gMDsgaSA8PSBNQVhfTEFOR1VBR0VfTlVNQkVSOyBpKyspCisgICAgaWYgKExBTkdVQUdFX0xvYWRTdHJpbmdPdGhlckxhbmd1YWdlKGksIElEU19MQU5HVUFHRV9NRU5VX0lURU0sIGl0ZW0sIHNpemVvZihpdGVtKSkpCisgICAgICBBcHBlbmRNZW51KEdsb2JhbHMuaExhbmd1YWdlTWVudSwgTUZfU1RSSU5HIHwgTUZfQllDT01NQU5ELAorCQkgQ0xfRklSU1RfTEFOR1VBR0UgKyBpLCBpdGVtKTsKKworICBTZXRNZW51KEdsb2JhbHMuaE1haW5XbmQsIGhNYWluTWVudSk7CisKKyAgLyogRGVzdHJveSBvbGQgbWVudSAqLworICBpZiAoR2xvYmFscy5oTWFpbk1lbnUpIERlc3Ryb3lNZW51KEdsb2JhbHMuaE1haW5NZW51KTsKKyAgR2xvYmFscy5oTWFpbk1lbnUgPSBoTWFpbk1lbnU7CisKKyNpZmRlZiBXSU5FTElCCisgIC8qIFVwZGF0ZSBzeXN0ZW0gbWVudXMgKi8KKyAgZm9yIChpID0gMDsgTGFuZ3VhZ2VzW2ldLm5hbWUgJiYgbHN0cmNtcChsYW5nLCBMYW5ndWFnZXNbaV0ubmFtZSk7KSBpKys7CisgIGlmIChMYW5ndWFnZXNbaV0ubmFtZSkgT3B0aW9ucy5sYW5ndWFnZSA9IGk7CisKKyNlbmRpZgorCisvKiBTcGVjaWZpYyBmb3IgY2xvY2sgKi8KK2lmKEdsb2JhbHMuYkFuYWxvZyA9PSBUUlVFKSB7CisJQ2hlY2tNZW51SXRlbShHbG9iYWxzLmhQcm9wZXJ0aWVzTWVudSwgQ0xfQU5BTE9HLCBcCisgICAgICAgICAgICAgICAgICAgICAgIE1GX0JZQ09NTUFORCB8IE1GX0NIRUNLRUQpOworICAgICAgICBDaGVja01lbnVJdGVtKEdsb2JhbHMuaFByb3BlcnRpZXNNZW51LCBDTF9ESUdJVEFMLCBcCisgICAgICAgICAgICAgICAgICAgICAgIE1GX0JZQ09NTUFORCB8IE1GX1VOQ0hFQ0tFRCk7Cit9CitlbHNlIHsKKwlDaGVja01lbnVJdGVtKEdsb2JhbHMuaFByb3BlcnRpZXNNZW51LCBDTF9BTkFMT0csIFwKKyAgICAgICAgICAgICAgICAgICAgICAgTUZfQllDT01NQU5EIHwgTUZfVU5DSEVDS0VEKTsKKyAgICAgICAgQ2hlY2tNZW51SXRlbShHbG9iYWxzLmhQcm9wZXJ0aWVzTWVudSwgQ0xfRElHSVRBTCwgXAorICAgICAgICAgICAgICAgICAgICAgICBNRl9CWUNPTU1BTkQgfCBNRl9DSEVDS0VEKTsKK30KKwlDaGVja01lbnVJdGVtKEdsb2JhbHMuaFByb3BlcnRpZXNNZW51LCBDTF9XSVRIT1VUX1RJVExFLCBNRl9CWUNPTU1BTkQgfCBcCisJICAgICAgICAgICAgICAgICAgICAgKEdsb2JhbHMuYldpdGhvdXRUaXRsZSA/IE1GX0NIRUNLRUQgOiBNRl9VTkNIRUNLRUQpKTsKKwlDaGVja01lbnVJdGVtKEdsb2JhbHMuaFByb3BlcnRpZXNNZW51LCBDTF9PTl9UT1AsIE1GX0JZQ09NTUFORCB8IFwKKwkgICAgICAgICAgICAgICAgICAgICAoR2xvYmFscy5iQWx3YXlzT25Ub3AgPyBNRl9DSEVDS0VEIDogTUZfVU5DSEVDS0VEKSk7CisJQ2hlY2tNZW51SXRlbShHbG9iYWxzLmhQcm9wZXJ0aWVzTWVudSwgQ0xfU0VDT05EUywgTUZfQllDT01NQU5EIHwgXAorCSAgICAgICAgICAgICAgICAgICAgIChHbG9iYWxzLmJTZWNvbmRzID8gTUZfQ0hFQ0tFRCA6IE1GX1VOQ0hFQ0tFRCkpOworCUNoZWNrTWVudUl0ZW0oR2xvYmFscy5oUHJvcGVydGllc01lbnUsIENMX0RBVEUsIE1GX0JZQ09NTUFORCB8IFwKKwkgICAgICAgICAgICAgICAgICAgICAoR2xvYmFscy5iRGF0ZSA/IE1GX0NIRUNLRUQgOiBNRl9VTkNIRUNLRUQpKTsKK30KKworVk9JRCBMQU5HVUFHRV9EZWZhdWx0TGFuZ3VhZ2VIYW5kbGUoV1BBUkFNIHdQYXJhbSkKK3sKKyAgaWYgKCh3UGFyYW0gPj1DTF9GSVJTVF9MQU5HVUFHRSkgJiYgKHdQYXJhbTw9Q0xfTEFTVF9MQU5HVUFHRSkpCisgICAgICAgICAgTEFOR1VBR0VfU2VsZWN0TGFuZ3VhZ2VCeU51bWJlcih3UGFyYW0gLSBDTF9GSVJTVF9MQU5HVUFHRSk7CisgICAgIGVsc2UgcHJpbnRmKCJVbmltcGxlbWVudGVkIG1lbnUgY29tbWFuZCAlaVxuIiwgd1BhcmFtKTsKK30KKworVk9JRCBMQU5HVUFHRV9Jbml0TGFuZ3VhZ2UoVk9JRCkKK3sKKyAgI2lmZGVmIFdJTkVMSUIKKyAgIEdsb2JhbHMubHBzekxhbmd1YWdlID0gTGFuZ3VhZ2VzW09wdGlvbnMubGFuZ3VhZ2VdLm5hbWU7CisgICNlbHNlCisgIENIQVIgYnVmZmVyW01BWF9QQVRITkFNRV9MRU5dLCAqcDsKKworICAgIFBST0ZJTEVfR2V0V2luZUluaVN0cmluZygicHJvZ3JhbXMiLCAibGFuZ3VhZ2UiLCAibGFuZ3VhZ2UiLCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnVmZmVyLCBzaXplb2YoYnVmZmVyKSk7CisgIEdsb2JhbHMubHBzekxhbmd1YWdlID0gcCA9IExvY2FsTG9jayhMb2NhbEFsbG9jKExNRU1fRklYRUQsIGxzdHJsZW4oYnVmZmVyKSkpOworICBobWVtY3B5KHAsIGJ1ZmZlciwgMSArIGxzdHJsZW4oYnVmZmVyKSk7CisgICNlbmRpZgorfQorCisvKiBMb2NhbCBWYXJpYWJsZXM6ICAgICovCisvKiBjLWZpbGUtc3R5bGU6ICJHTlUiICovCisvKiBFbmQ6ICAgICAgICAgICAgICAgICovCmRpZmYgLS1naXQgYS9wcm9ncmFtcy9jbG9jay9sYW5ndWFnZS5oIGIvcHJvZ3JhbXMvY2xvY2svbGFuZ3VhZ2UuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43MGE3NDUyCi0tLSAvZGV2L251bGwKKysrIGIvcHJvZ3JhbXMvY2xvY2svbGFuZ3VhZ2UuaApAQCAtMCwwICsxLDE1IEBACisvKgorICogQ2xvY2sKKyAqCisgKiBDb3B5cmlnaHQgMTk5OCBNYXJjZWwgQmF1ciA8bWJhdXJAZzI2LmV0aHouY2g+CisgKiBDb3B5cmlnaHQgMTk5OCBLYXJsIEJhY2tzdHL2bSA8a2FybF9iQGdlb2NpdGllcy5jb20+CisgKi8KKworVk9JRCBMQU5HVUFHRV9TZWxlY3RMYW5ndWFnZUJ5TnVtYmVyKFVJTlQgbnVtKTsKK1ZPSUQgTEFOR1VBR0VfU2VsZWN0TGFuZ3VhZ2VCeU5hbWUoTFBDU1RSIGxhbmcpOworVk9JRCBMQU5HVUFHRV9EZWZhdWx0TGFuZ3VhZ2VIYW5kbGUoV1BBUkFNIHdQYXJhbSk7CitWT0lEIExBTkdVQUdFX0luaXRMYW5ndWFnZShWT0lEKTsKKworLyogTG9jYWwgVmFyaWFibGVzOiAgICAqLworLyogYy1maWxlLXN0eWxlOiAiR05VIiAqLworLyogRW5kOiAgICAgICAgICAgICAgICAqLwpkaWZmIC0tZ2l0IGEvcHJvZ3JhbXMvY2xvY2svbGljZW5zZS5jIGIvcHJvZ3JhbXMvY2xvY2svbGljZW5zZS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjA5NWRhNTcKLS0tIC9kZXYvbnVsbAorKysgYi9wcm9ncmFtcy9jbG9jay9saWNlbnNlLmMKQEAgLTAsMCArMSw1MiBAQAorLyoKKyAqIENsb2NrIChsaWNlbnNlLmMpCisgKgorICogQ29weXJpZ2h0IDE5OTggYnkgTWFyY2VsIEJhdXIgPG1iYXVyQGcyNi5ldGh6LmNoPgorICogQWRhcHRlZCBmcm9tIFByb2dyYW0gTWFuYWdlciAoT3JpZ2luYWwgYnkgVWxyaWNoIFNjaG1pZWQpCisgKi8KKworI2luY2x1ZGUgIndpbmRvd3MuaCIKKyNpbmNsdWRlICJsaWNlbnNlLmgiCisKK3N0YXRpYyBMSUNFTlNFKiBTZWxlY3RMYW5ndWFnZShMUENTVFIgTGFuZ3VhZ2UpCit7CisvKgorICBpZiAoIWxzdHJjbXAoTGFuZ3VhZ2UsICJDYSIpKSByZXR1cm4oJldpbmVMaWNlbnNlX0NhKTsKKyAgaWYgKCFsc3RyY21wKExhbmd1YWdlLCAiQ3oiKSkgcmV0dXJuKCZXaW5lTGljZW5zZV9Deik7CisgIGlmICghbHN0cmNtcChMYW5ndWFnZSwgIkRhIikpIHJldHVybigmV2luZUxpY2Vuc2VfRGEpOworICBpZiAoIWxzdHJjbXAoTGFuZ3VhZ2UsICJEZSIpKSByZXR1cm4oJldpbmVMaWNlbnNlX0RlKTsKKyAgaWYgKCFsc3RyY21wKExhbmd1YWdlLCAiRW4iKSkgcmV0dXJuKCZXaW5lTGljZW5zZV9Fbik7CisgIGlmICghbHN0cmNtcChMYW5ndWFnZSwgIkVvIikpIHJldHVybigmV2luZUxpY2Vuc2VfRW8pOworICBpZiAoIWxzdHJjbXAoTGFuZ3VhZ2UsICJFcyIpKSByZXR1cm4oJldpbmVMaWNlbnNlX0VzKTsKKyAgaWYgKCFsc3RyY21wKExhbmd1YWdlLCAiRmkiKSkgcmV0dXJuKCZXaW5lTGljZW5zZV9GaSk7CisgIGlmICghbHN0cmNtcChMYW5ndWFnZSwgIkZyIikpIHJldHVybigmV2luZUxpY2Vuc2VfRnIpOworICBpZiAoIWxzdHJjbXAoTGFuZ3VhZ2UsICJIdSIpKSByZXR1cm4oJldpbmVMaWNlbnNlX0h1KTsKKyAgaWYgKCFsc3RyY21wKExhbmd1YWdlLCAiSXQiKSkgcmV0dXJuKCZXaW5lTGljZW5zZV9JdCk7CisgIGlmICghbHN0cmNtcChMYW5nYXVnZSwgIktvIikpIHJldHVybigmV2luZUxpY2Vuc2VfS28pOworICBpZiAoIWxzdHJjbXAoTGFuZ3VhZ2UsICJObyIpKSByZXR1cm4oJldpbmVMaWNlbnNlX05vKTsKKyAgaWYgKCFsc3RyY21wKExhbmd1YWdlLCAiUGwiKSkgcmV0dXJuKCZXaW5lTGljZW5zZV9QbCk7CisgIGlmICghbHN0cmNtcChMYW5ndWFnZSwgIlBvIikpIHJldHVybigmV2luZUxpY2Vuc2VfUG8pOworICBpZiAoIWxzdHJjbXAoTGFuZ3VhZ2UsICJTdyIpKSByZXR1cm4oJldpbmVMaWNlbnNlX1N3KTsgCisgIGlmICghbHN0cmNtcChMYW5ndWFnZSwgIlZhIikpIHJldHVybigmV2luZUxpY2Vuc2VfVmEpOworKi8KKyAgcmV0dXJuKCZXaW5lTGljZW5zZV9Fbik7Cit9CisKKworVk9JRCBXaW5lTGljZW5zZShIV05EIFduZCwgTFBDU1RSIExhbmd1YWdlKQoreworICBMSUNFTlNFICpMaWNlbnNlID0gU2VsZWN0TGFuZ3VhZ2UoTGFuZ3VhZ2UpOworCisgIE1lc3NhZ2VCb3goV25kLCBMaWNlbnNlLT5MaWNlbnNlLCBMaWNlbnNlLT5MaWNlbnNlQ2FwdGlvbiwKKyAgICAgICAgICAgICBNQl9JQ09OSU5GT1JNQVRJT04gfCBNQl9PSyk7Cit9CisKKworVk9JRCBXaW5lV2FycmFudHkoSFdORCBXbmQsIExQQ1NUUiBMYW5ndWFnZSkKK3sKKyAgTElDRU5TRSAqTGljZW5zZSA9IFNlbGVjdExhbmd1YWdlKExhbmd1YWdlKTsKKworICBNZXNzYWdlQm94KFduZCwgTGljZW5zZS0+V2FycmFudHksIExpY2Vuc2UtPldhcnJhbnR5Q2FwdGlvbiwKKyAgICAgICAgICAgICBNQl9JQ09ORVhDTEFNQVRJT04gfCBNQl9PSyk7Cit9CisKZGlmZiAtLWdpdCBhL3Byb2dyYW1zL2Nsb2NrL2xpY2Vuc2UuaCBiL3Byb2dyYW1zL2Nsb2NrL2xpY2Vuc2UuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kZTFkNDAzCi0tLSAvZGV2L251bGwKKysrIGIvcHJvZ3JhbXMvY2xvY2svbGljZW5zZS5oCkBAIC0wLDAgKzEsNDggQEAKKy8qCisgKiBDbG9jayAobGljZW5zZS5oKQorICoKKyAqIENvcHlyaWdodCAxOTk4IGJ5IE1hcmNlbCBCYXVyIDxtYmF1ckBnMjYuZXRoei5jaD4KKyAqIEFkYXB0ZWQgZnJvbSBQcm9ncmFtIE1hbmFnZXIgKE9yaWdpbmFsIGJ5IFVscmljaCBTY2htaWVkKQorICovCisKKworLyogZnVuY3Rpb24gcHJvdG90eXBlcyAqLworIAorVk9JRCBXaW5lTGljZW5zZShIV05EIGhXbmQsIExQQ1NUUiBscHN6TGFuZ3VhZ2UpOworVk9JRCBXaW5lV2FycmFudHkoSFdORCBoV25kLCBMUENTVFIgbGFuZ3VhZ2UpOworCisKKy8qIHR5cGVkZWZzICovCisKK3R5cGVkZWYgc3RydWN0Cit7CisgIExQQ1NUUiBMaWNlbnNlLCBMaWNlbnNlQ2FwdGlvbjsKKyAgTFBDU1RSIFdhcnJhbnR5LCBXYXJyYW50eUNhcHRpb247Cit9IExJQ0VOU0U7CisKKworLyogZXh0ZXJuYWwgcmVmZXJlbmNlcyAqLworCisvKiAKK2V4dGVybiBMSUNFTlNFIFdpbmVMaWNlbnNlX0NhOworZXh0ZXJuIExJQ0VOU0UgV2luZUxpY2Vuc2VfQ3o7CitleHRlcm4gTElDRU5TRSBXaW5lTGljZW5zZV9EYTsKK2V4dGVybiBMSUNFTlNFIFdpbmVMaWNlbnNlX0RlOworKi8KKworZXh0ZXJuIExJQ0VOU0UgV2luZUxpY2Vuc2VfRW47CisKKy8qCitleHRlcm4gTElDRU5TRSBXaW5lTGljZW5zZV9FbzsKK2V4dGVybiBMSUNFTlNFIFdpbmVMaWNlbnNlX0VzOworZXh0ZXJuIExJQ0VOU0UgV2luZUxpY2Vuc2VfRmk7CitleHRlcm4gTElDRU5TRSBXaW5lTGljZW5zZV9GcjsKK2V4dGVybiBMSUNFTlNFIFdpbmVMaWNlbnNlX0h1OworZXh0ZXJuIExJQ0VOU0UgV2luZUxpY2Vuc2VfSXQ7CitleHRlcm4gTElDRU5TRSBXaW5lTGljZW5zZV9LbzsKK2V4dGVybiBMSUNFTlNFIFdpbmVMaWNlbnNlX05vOworZXh0ZXJuIExJQ0VOU0UgV2luZUxpY2Vuc2VfUGw7CitleHRlcm4gTElDRU5TRSBXaW5lTGljZW5zZV9QbzsKK2V4dGVybiBMSUNFTlNFIFdpbmVMaWNlbnNlX1N3OworZXh0ZXJuIExJQ0VOU0UgV2luZUxpY2Vuc2VfVmE7CisqLwpkaWZmIC0tZ2l0IGEvcHJvZ3JhbXMvY2xvY2svbWFpbi5jIGIvcHJvZ3JhbXMvY2xvY2svbWFpbi5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjMzYmE2NDMKLS0tIC9kZXYvbnVsbAorKysgYi9wcm9ncmFtcy9jbG9jay9tYWluLmMKQEAgLTAsMCArMSwyNjUgQEAKKy8qCisgKiBDbG9jaworICoKKyAqIENvcHlyaWdodCAxOTk4IE1hcmNlbCBCYXVyIDxtYmF1ckBnMjYuZXRoei5jaD4KKyAqCisgKiBDbG9jayBpcyBwYXJ0aWFsbHkgYmFzZWQgb24KKyAqIC0gUHJvZ3JhbSBNYW5hZ2VyIGJ5IFVscmljaCBTY2htaWVkCisgKiAtIHJvbGV4LmMgYnkgSmltIFBldGVyc29uCisgKgorICovCisKKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgIndpbmRvd3MuaCIKKyNpbmNsdWRlICJtYWluLmgiCisjaW5jbHVkZSAibGljZW5zZS5oIgorI2luY2x1ZGUgInZlcnNpb24uaCIKKyNpbmNsdWRlICJsYW5ndWFnZS5oIgorI2luY2x1ZGUgIndpbmNsb2NrLmgiCisvLyAjaW5jbHVkZSAiY29tbWRsZy5oIgorCisjaWZkZWYgV0lORUxJQgorICAgI2luY2x1ZGUgIm9wdGlvbnMuaCIKKyAgICNpbmNsdWRlICJyZXNvdXJjZS5oIgorICAgI2luY2x1ZGUgInNoZWxsLmgiCisgICB2b2lkIExJQldJTkVfUmVnaXN0ZXJfRGUoKTsKKyAgIHZvaWQgTElCV0lORV9SZWdpc3Rlcl9FbigpOworICAgdm9pZCBMSUJXSU5FX1JlZ2lzdGVyX1N3KCk7CisjZW5kaWYKKworQ0xPQ0tfR0xPQkFMUyBHbG9iYWxzOworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCisgKiAgICAgICAgICAgQ0xPQ0tfTWVudUNvbW1hbmQKKyAqCisgKiAgQWxsIGhhbmRsaW5nIG9mIG1haW4gbWVudSBldmVudHMKKyAqLworCitpbnQgQ0xPQ0tfTWVudUNvbW1hbmQgKFdQQVJBTSB3UGFyYW0pCit7ICAKKyAgIHN3aXRjaCAod1BhcmFtKSB7CisgICAgIGNhc2UgQ0xfQU5BTE9HOiB7CisgICAgICAgICBHbG9iYWxzLmJBbmFsb2cgPSBUUlVFOworCSBDaGVja01lbnVJdGVtKEdsb2JhbHMuaFByb3BlcnRpZXNNZW51LCBDTF9BTkFMT0csIFwKKwkgICAgICAgICAgICAgICBNRl9CWUNPTU1BTkQgfCBNRl9DSEVDS0VEKTsKKwkgQ2hlY2tNZW51SXRlbShHbG9iYWxzLmhQcm9wZXJ0aWVzTWVudSwgQ0xfRElHSVRBTCwgXAorCSAgICAgICAgICAgICAgIE1GX0JZQ09NTUFORCB8IE1GX1VOQ0hFQ0tFRCk7CisJIGJyZWFrOwkgICAgIAorICAgICAgIH0gCisgICAgIGNhc2UgQ0xfRElHSVRBTDogeworICAgICAgICAgR2xvYmFscy5iQW5hbG9nID0gRkFMU0U7CisJIENoZWNrTWVudUl0ZW0oR2xvYmFscy5oUHJvcGVydGllc01lbnUsIENMX0FOQUxPRywgXAorCSAgICAgICAgICAgICAgIE1GX0JZQ09NTUFORCB8IE1GX1VOQ0hFQ0tFRCk7CisJIENoZWNrTWVudUl0ZW0oR2xvYmFscy5oUHJvcGVydGllc01lbnUsIENMX0RJR0lUQUwsIFwKKwkgICAgICAgICAgICAgICBNRl9CWUNPTU1BTkQgfCBNRl9DSEVDS0VEKTsKKwkgYnJlYWs7CSAgICAgICAKKyAgICAgICB9CisgICAgIGNhc2UgQ0xfRk9OVDoKKyAgICAgICBwcmludGYoIkZPTlQ6Iik7CisvKglDSE9PU0VGT05UIGZvbnRsOworCWZvbnRsLmxTdHJ1Y3RTaXplCT0gMDsKKyAgICAgICAgZm9udGwuaHduZE93bmVyCQk9IEdsb2JhbHMuaE1haW5XbmQ7CisgICAgICAgIGZvbnRsLmhEQwkJPSBOVUxMOworICAgICAgICBmb250bC5scExvZ0ZvbnQgIAk9IDA7CisgICAgICAgIGZvbnRsLmlQb2ludFNpemUJICAgCT0gMDsKKyAgICAgICAgZm9udGwuRmxhZ3MJCT0gMDsKKyAgICAgICAgZm9udGwucmdiQ29sb3JzCQk9IDA7CisgICAgICAgIGZvbnRsLmxDdXN0RGF0YQkJPSAwOworICAgICAgICBmb250bC5scGZuSG9vawkJPSAwOworICAgICAgICBmb250bC5scFRlbXBsYXRlTmFtZQk9IDA7CisgICAgICAgIGZvbnRsLmhJbnN0YW5jZQkJPSBHbG9iYWxzLmhJbnN0YW5jZTsKKyAgICAgICAgZm9udGwubHBzelN0eWxlCQk9IDA7CisgICAgICAgIGZvbnRsLm5Gb250VHlwZQkJPSAwOworICAgICAgICBmb250bC5uU2l6ZU1pbgkJPSAwOworICAgICAgICBmb250bC5uU2l6ZU1heAkJPSAxMDA7CisKKwlpZiAoQ2hvb3NlRm9udCgmZm9udCkpOyAKKyovCisgICAgICAgYnJlYWs7CisgICAgIGNhc2UgQ0xfV0lUSE9VVF9USVRMRToKKyAgICAgICBHbG9iYWxzLmJXaXRob3V0VGl0bGUgPSAhR2xvYmFscy5iV2l0aG91dFRpdGxlOworICAgICAgIENoZWNrTWVudUl0ZW0oR2xvYmFscy5oUHJvcGVydGllc01lbnUsIENMX1dJVEhPVVRfVElUTEUsIE1GX0JZQ09NTUFORCB8IFwKKyAgICAgICAgICAgICAgICAgICAgIChHbG9iYWxzLmJXaXRob3V0VGl0bGUgPyBNRl9DSEVDS0VEIDogTUZfVU5DSEVDS0VEKSk7CisgICAgICAgcHJpbnRmKCJOTyBUSVRMRToiKTsKKyAgICAgICBicmVhazsKKyAgICAgY2FzZSBDTF9PTl9UT1A6CisgICAgICAgR2xvYmFscy5iQWx3YXlzT25Ub3AgPSAhR2xvYmFscy5iQWx3YXlzT25Ub3A7CisgICAgICAgQ2hlY2tNZW51SXRlbShHbG9iYWxzLmhQcm9wZXJ0aWVzTWVudSwgQ0xfT05fVE9QLCBNRl9CWUNPTU1BTkQgfCBcCisgICAgICAgICAgICAgICAgICAgICAoR2xvYmFscy5iQWx3YXlzT25Ub3AgPyBNRl9DSEVDS0VEIDogTUZfVU5DSEVDS0VEKSk7CisgICAgICAgYnJlYWs7CisgICAgIGNhc2UgQ0xfU0VDT05EUzoKKyAgICAgICBHbG9iYWxzLmJTZWNvbmRzID0gIUdsb2JhbHMuYlNlY29uZHM7CisgICAgICAgQ2hlY2tNZW51SXRlbShHbG9iYWxzLmhQcm9wZXJ0aWVzTWVudSwgQ0xfU0VDT05EUywgTUZfQllDT01NQU5EIHwgXAorICAgICAgICAgICAgICAgICAgICAgKEdsb2JhbHMuYlNlY29uZHMgPyBNRl9DSEVDS0VEIDogTUZfVU5DSEVDS0VEKSk7CisgICAgICAgYnJlYWs7CisgICAgIGNhc2UgQ0xfREFURToKKyAgICAgICBHbG9iYWxzLmJEYXRlID0gIUdsb2JhbHMuYkRhdGU7CisgICAgICAgQ2hlY2tNZW51SXRlbShHbG9iYWxzLmhQcm9wZXJ0aWVzTWVudSwgQ0xfREFURSwgTUZfQllDT01NQU5EIHwgXAorICAgICAgICAgICAgICAgICAgICAgKEdsb2JhbHMuYkRhdGUgPyBNRl9DSEVDS0VEIDogTUZfVU5DSEVDS0VEKSk7CisgICAgICAgYnJlYWs7CisgICAgIGNhc2UgQ0xfSU5GT19MSUNFTlNFOgorICAgICAgIFdpbmVMaWNlbnNlKEdsb2JhbHMuaE1haW5XbmQsIEdsb2JhbHMubHBzekxhbmd1YWdlKTsKKyAgICAgICBicmVhazsKKyAgICAgY2FzZSBDTF9JTkZPX05PX1dBUlJBTlRZOgorICAgICAgIFdpbmVXYXJyYW50eShHbG9iYWxzLmhNYWluV25kLCBHbG9iYWxzLmxwc3pMYW5ndWFnZSk7CisgICAgICAgYnJlYWs7CisgICAgIGNhc2UgQ0xfSU5GT19BQk9VVF9XSU5FOgorICAgICAgIFNoZWxsQWJvdXQoR2xvYmFscy5oTWFpblduZCwgIkNsb2NrIiwgIkNsb2NrXG4iIFdJTkVfUkVMRUFTRV9JTkZPLCAwKTsKKyAgICAgYnJlYWs7CisgICAgIC8vIEhhbmRsZSBsYW5ndWFnZXMKKyAgICAgZGVmYXVsdDoKKyAgICAgICBMQU5HVUFHRV9EZWZhdWx0TGFuZ3VhZ2VIYW5kbGUod1BhcmFtKTsgCisgICB9CisgICByZXR1cm4gMDsKK30KKworCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoKKyAqICAgICAgICAgICBDTE9DS19XbmRQcm9jCisgKi8KKworTFJFU1VMVCBDTE9DS19XbmRQcm9jIChIV05EIGhXbmQsIFVJTlQgbXNnLCBXUEFSQU0gd1BhcmFtLCBMUEFSQU0gbFBhcmFtKQoreworICAgIFBBSU5UU1RSVUNUIHBzOworICAgIEhEQyBjb250ZXh0OworCisgICAgc3dpdGNoIChtc2cpIHsKKworICAgICAgIGNhc2UgV01fQ1JFQVRFOgorICAgICAgICBwcmludGYoIldNX0NSRUFURVxuIik7CisgICAJYnJlYWs7CisKKyAgICAgICAgY2FzZSBXTV9SQlVUVE9OVVA6CisJICBwcmludGYoIldNX1JCVVRUT05VUFxuIik7CisJYnJlYWs7CisKKwljYXNlIFdNX1BBSU5UOgorCSAgcHJpbnRmKCJXTV9QQUlOVFxuIik7CisJICBjb250ZXh0ID0gQmVnaW5QYWludChoV25kLCAmcHMpOworCSAgaWYoR2xvYmFscy5iQW5hbG9nKSB7CisJICAgIERyYXdGYWNlKGNvbnRleHQpOworCSAgICBJZGxlKGNvbnRleHQpOworCSAgfQorCSAgZWxzZSB7CisKKwkgIH0KKyAgICAgICAgICBFbmRQYWludChoV25kLCAmcHMpOworICAgCWJyZWFrOworCisgICAgICAgY2FzZSBXTV9TSVpFOgorICAgICAgICAgIHByaW50ZigiV01fU0laRVxuIik7CisJICBHbG9iYWxzLk1heFggPSBMT1dPUkQobFBhcmFtKTsKKwkgIEdsb2JhbHMuTWF4WSA9IEhJV09SRChsUGFyYW0pOworCSAgYnJlYWs7CisJICAKKyAgICAgICBjYXNlIFdNX0NPTU1BTkQ6CisgICAgICAgICAgQ0xPQ0tfTWVudUNvbW1hbmQod1BhcmFtKTsKKyAgICAgICAgICBicmVhazsKKworICAgICAgIGNhc2UgV01fREVTVFJPWToKKyAgICAgICAgICBwcmludGYoIldNX0RFU1RST1lcbiIpOworICAgICAgICAgIFBvc3RRdWl0TWVzc2FnZSAoMCk7CisgICAgICAgICAgYnJlYWs7CisKKyAgICAgICBkZWZhdWx0OgorICAgICAgICAgIHJldHVybiBEZWZXaW5kb3dQcm9jIChoV25kLCBtc2csIHdQYXJhbSwgbFBhcmFtKTsKKyAgICB9CisgICAgcmV0dXJuIDBsOworfQorCisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgorICogICAgICAgICAgIFdpbk1haW4KKyAqLworCit2b2lkIER1bXBHbG9iYWxzKHZvaWQpIHsKKworICAgIHByaW50ZigiRHVtcEdsb2JhbHMoKVxuIik7CisgICAgcHJpbnRmKCIgR2xvYmFscy5scHN6SW5pRmlsZTogJXNcbiIsIEdsb2JhbHMubHBzekluaUZpbGUpOyAKKyAgICBwcmludGYoIiBHbG9iYWxzLmxwc3pJY29GaWxlOiAlc1xuIiwgR2xvYmFscy5scHN6SWNvRmlsZSk7CisgICAgcHJpbnRmKCJHbG9iYWxzLmxwc3pMYW5ndWFnZTogJXNcbiIsIEdsb2JhbHMubHBzekxhbmd1YWdlKTsKKyAgICBwcmludGYoIiAgIEdsb2JhbHMuaEluc3RhbmNlOiAlaVxuIiwgR2xvYmFscy5oSW5zdGFuY2UpOworICAgIHByaW50ZigiICAgR2xvYmFscy5oTWFpbk1lbnU6ICVpXG4iLCBHbG9iYWxzLmhNYWluTWVudSk7CisgICAgCit9CisgCitpbnQgUEFTQ0FMIFdpbk1haW4gKEhBTkRMRSBoSW5zdGFuY2UsIEhBTkRMRSBwcmV2LCBMUFNUUiBjbWRsaW5lLCBpbnQgc2hvdykKK3sKKyAgICBNU0cgICAgICBtc2c7CisgICAgV05EQ0xBU1MgY2xhc3M7CisgICAgY2hhciBjbGFzc05hbWVbXSA9ICJDTENsYXNzIjsgIC8qIFRvIG1ha2Ugc3VyZSBjbGFzc05hbWUgPj0gMHgxMDAwMCAqLworICAgIGNoYXIgd2luTmFtZVtdICAgPSAiQ2xvY2siOworCisgICAgI2lmIGRlZmluZWQoV0lORUxJQikgJiYgIWRlZmluZWQoSEFWRV9XSU5FX0NPTlNUUlVDVE9SKQorICAgICAgLyogUmVnaXN0ZXIgcmVzb3VyY2VzICovCisgICAgICBMSUJXSU5FX1JlZ2lzdGVyX0RlKCk7CisgICAgICBMSUJXSU5FX1JlZ2lzdGVyX0VuKCk7CisgICAgICBMSUJXSU5FX1JlZ2lzdGVyX1N3KCk7CisgICAgI2VuZGlmCisKKyAgICBwcmludGYoIldpbk1haW4oKVxuIik7CisgICAgCisgICAgLyogU2V0dXAgR2xvYmFscyAqLworCisgICAgR2xvYmFscy5iQW5hbG9nCSAgPSBUUlVFOworICAgIEdsb2JhbHMuYlNlY29uZHMgICAgICA9IFRSVUU7CisgICAgR2xvYmFscy5scHN6SW5pRmlsZSAgID0gImNsb2NrLmluaSI7CisgICAgR2xvYmFscy5scHN6SWNvRmlsZSAgID0gImNsb2NrLmljbyI7CisKKyAgLyogU2VsZWN0IExhbmd1YWdlICovCisgICAgTEFOR1VBR0VfSW5pdExhbmd1YWdlKCk7CisKKyAgICBHbG9iYWxzLmhJbnN0YW5jZSAgICAgPSBoSW5zdGFuY2U7CisgICAgR2xvYmFscy5oTWFpbkljb24gICAgID0gRXh0cmFjdEljb24oR2xvYmFscy5oSW5zdGFuY2UsIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdsb2JhbHMubHBzekljb0ZpbGUsIDApOworICAgIGlmICghR2xvYmFscy5oTWFpbkljb24pIEdsb2JhbHMuaE1haW5JY29uID0gCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTG9hZEljb24oMCwgTUFLRUlOVFJFU09VUkNFKERFRkFVTFRJQ09OKSk7CisKKyAgICBEdW1wR2xvYmFscygpOwkJCQkgIAorCQkJCSAgCisgICAgaWYgKCFwcmV2KXsKKwljbGFzcy5zdHlsZSAgICAgICAgID0gQ1NfSFJFRFJBVyB8IENTX1ZSRURSQVc7CisJY2xhc3MubHBmblduZFByb2MgICA9IENMT0NLX1duZFByb2M7CisJY2xhc3MuY2JDbHNFeHRyYSAgICA9IDA7CisJY2xhc3MuY2JXbmRFeHRyYSAgICA9IDA7CisJY2xhc3MuaEluc3RhbmNlICAgICA9IEdsb2JhbHMuaEluc3RhbmNlOworCWNsYXNzLmhJY29uICAgICAgICAgPSBMb2FkSWNvbiAoMCwgSURJX0FQUExJQ0FUSU9OKTsKKwljbGFzcy5oQ3Vyc29yICAgICAgID0gTG9hZEN1cnNvciAoMCwgSURDX0FSUk9XKTsKKwljbGFzcy5oYnJCYWNrZ3JvdW5kID0gR2V0U3RvY2tPYmplY3QgKEdSQVlfQlJVU0gpOworCWNsYXNzLmxwc3pNZW51TmFtZSAgPSAiXDAiOworCWNsYXNzLmxwc3pDbGFzc05hbWUgPSAoU0VHUFRSKWNsYXNzTmFtZTsKKyAgICB9CisgICAgaWYgKCFSZWdpc3RlckNsYXNzICgmY2xhc3MpKQorCXJldHVybiBGQUxTRTsKKworICAgIEdsb2JhbHMuaE1haW5XbmQgPSBDcmVhdGVXaW5kb3cgKGNsYXNzTmFtZSwgd2luTmFtZSwgV1NfT1ZFUkxBUFBFRFdJTkRPVywKKwkJCUNXX1VTRURFRkFVTFQsIDAsIENXX1VTRURFRkFVTFQsIEdsb2JhbHMuTWF4WCwgR2xvYmFscy5NYXhZLCAKKwkJCUxvYWRNZW51KEdsb2JhbHMuaEluc3RhbmNlLCBTVFJJTkdfTUVOVV9YeCksCisJCQlHbG9iYWxzLmhJbnN0YW5jZSwgMCk7CisJCQkKKyAgICBMQU5HVUFHRV9TZWxlY3RMYW5ndWFnZUJ5TmFtZShHbG9iYWxzLmxwc3pMYW5ndWFnZSk7CisgICAgU2V0TWVudShHbG9iYWxzLmhNYWluV25kLCBHbG9iYWxzLmhNYWluTWVudSk7CisgICAgU2hvd1dpbmRvdyAoR2xvYmFscy5oTWFpblduZCwgc2hvdyk7CisgICAgVXBkYXRlV2luZG93IChHbG9iYWxzLmhNYWluV25kKTsKKworICAgIHdoaWxlIChUUlVFKSB7CisgICAgICBTbGVlcCgxKTsKKyAgICAgIGlmIChQZWVrTWVzc2FnZSgmbXNnLCAwLCAwLCAwLCBQTV9SRU1PVkUpKSB7CisgICAgICAgIGlmIChtc2cubWVzc2FnZSA9PSBXTV9RVUlUKSByZXR1cm4gbXNnLndQYXJhbTsKKwlUcmFuc2xhdGVNZXNzYWdlKCZtc2cpOworCURpc3BhdGNoTWVzc2FnZSgmbXNnKTsKKwlJZGxlKE5VTEwpOworICAgICAgfQorICAgICAgZWxzZSBJZGxlKE5VTEwpOworICAgIH0KKworICAgIC8vIFdlIHdpbGwgbmV2ZXIgcmVhY2ggdGhlIGZvbGxvd2luZyBzdGF0ZW1lbnQgISAgCisgICAgcmV0dXJuIDA7ICAgIAorfQorCisKZGlmZiAtLWdpdCBhL3Byb2dyYW1zL2Nsb2NrL21haW4uaCBiL3Byb2dyYW1zL2Nsb2NrL21haW4uaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42Mzc0MWM5Ci0tLSAvZGV2L251bGwKKysrIGIvcHJvZ3JhbXMvY2xvY2svbWFpbi5oCkBAIC0wLDAgKzEsODQgQEAKKy8qCisgKiBDbG9jayAobWFpbi5oKQorICoKKyAqIENvcHlyaWdodCAxOTk4IE1hcmNlbCBCYXVyIDxtYmF1ckBnMjYuZXRoei5jaD4KKyAqLworCisjZGVmaW5lIE1BWF9TVFJJTkdfTEVOICAgICAgMjU1CisjZGVmaW5lIE1BWF9QQVRITkFNRV9MRU4gICAgMTAyNAorI2RlZmluZSBNQVhfTEFOR1VBR0VfTlVNQkVSIChDTF9MQVNUX0xBTkdVQUdFIC0gQ0xfRklSU1RfTEFOR1VBR0UpCisKKyNkZWZpbmUgSEVMUEZJTEUgICAgImNsb2NrLmhscCIKKyNkZWZpbmUgREVGQVVMVElDT04gT0lDX1dJTkVJQ09OCisKKy8qIGhpZGUgdGhlIGZvbGxvd2luZyBmcm9tIHdpbmVyYyAqLworI2lmbmRlZiBSQ19JTlZPS0VECisKK3R5cGVkZWYgc3RydWN0Cit7CisgIEhBTkRMRSAgaEluc3RhbmNlOworICBIV05EICAgIGhNYWluV25kOworICBISUNPTiAgIGhNYWluSWNvbjsKKyAgSElDT04gICBoRGVmYXVsdEljb247CisgIEhNRU5VICAgaE1haW5NZW51OworICBITUVOVSAgIGhQcm9wZXJ0aWVzTWVudTsKKyAgSE1FTlUgICBoTGFuZ3VhZ2VNZW51OworICBITUVOVSAgIGhJbmZvTWVudTsKKyAgTFBDU1RSICBscHN6SW5pRmlsZTsKKyAgTFBDU1RSICBscHN6SWNvRmlsZTsKKyAgTFBDU1RSICBscHN6TGFuZ3VhZ2U7CisgIFVJTlQgICAgd1N0cmluZ1RhYmxlT2Zmc2V0OworCisgIEJPT0wgICAgYkFuYWxvZzsKKyAgQk9PTCAgICBiQWx3YXlzT25Ub3A7CisgIEJPT0wgICAgYldpdGhvdXRUaXRsZTsKKyAgQk9PTCAgICBiU2Vjb25kczsKKyAgQk9PTCAgICBiRGF0ZTsgIAorCisgIGludCAgICAgTWF4WDsKKyAgaW50ICAgICBNYXhZOworfSBDTE9DS19HTE9CQUxTOworCitleHRlcm4gQ0xPQ0tfR0xPQkFMUyBHbG9iYWxzOworCisvKiBmdW5jdGlvbiBwcm90b3R5cGVzICovCitWT0lEIE1BSU5fU2VsZWN0TGFuZ3VhZ2VCeU5hbWUoTFBDU1RSKTsKK1ZPSUQgTUFJTl9TZWxlY3RMYW5ndWFnZUJ5TnVtYmVyKFVJTlQpOworCisvKiBjbGFzcyBuYW1lcyAqLworCisvKiBSZXNvdXJjZSBuYW1lcyAqLworZXh0ZXJuIENIQVIgU1RSSU5HX01FTlVfWHhbXTsKKworICAgI2RlZmluZSBTVFJJTkdJRChpZCkgKDB4IyNpZCArIEdsb2JhbHMud1N0cmluZ1RhYmxlT2Zmc2V0KQorICAgCisjZWxzZSAgLyogUkNfSU5WT0tFRCAqLworCisgICAjZGVmaW5lIFNUUklOR0lEKGlkKSBpZAorICAgCisjZW5kaWYKKworLyogc3RyaW5nIHRhYmxlIGluZGV4ICovCisjZGVmaW5lIElEU19MQU5HVUFHRV9JRCAgICAgICAgICAgICAgICBTVFJJTkdJRCgwMCkKKyNkZWZpbmUgSURTX0xBTkdVQUdFX01FTlVfSVRFTSAgICAgICAgIFNUUklOR0lEKDAxKQorI2RlZmluZSBJRFNfQ0xPQ0sgICAgICAgICAgICAgICAgICAgICAgU1RSSU5HSUQoMDIpCisKKy8qIG1haW4gbWVudSAqLworCisjZGVmaW5lIENMX0FOQUxPRyAgICAgICAgICAgICAgICAxMDAKKyNkZWZpbmUgQ0xfRElHSVRBTCAgICAgICAgICAgICAgIDEwMQorI2RlZmluZSBDTF9GT05UICAgICAgICAgICAgICAgICAgMTAyCisjZGVmaW5lIENMX1dJVEhPVVRfVElUTEUgICAgICAgICAxMDMKKyNkZWZpbmUgQ0xfT05fVE9QICAgICAgICAgICAgICAgIDEwNAorI2RlZmluZSBDTF9TRUNPTkRTICAgICAgICAgICAgICAgMTA1CisjZGVmaW5lIENMX0RBVEUgICAgICAgICAgICAgICAgICAxMDYKKworI2RlZmluZSBDTF9MQU5HVUFHRSAgICAgICAgICAgICAgMTA4CisKKyNkZWZpbmUgQ0xfSU5GTyAgICAgICAgICAgICAgICAgIDE4NgorI2RlZmluZSBDTF9JTkZPX0xJQ0VOU0UgICAgICAgICAgMTg3CisjZGVmaW5lIENMX0lORk9fTk9fV0FSUkFOVFkgICAgICAxODgKKyNkZWZpbmUgQ0xfSU5GT19BQk9VVF9XSU5FICAgICAgIDE4OQorCisjZGVmaW5lIENMX0ZJUlNUX0xBTkdVQUdFICAgICAgICAxMDkKKyNkZWZpbmUgQ0xfTEFTVF9MQU5HVUFHRSAgICAgICAgIDE4NQpkaWZmIC0tZ2l0IGEvcHJvZ3JhbXMvY2xvY2svd2luY2xvY2suYyBiL3Byb2dyYW1zL2Nsb2NrL3dpbmNsb2NrLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNGU3YWY1ZgotLS0gL2Rldi9udWxsCisrKyBiL3Byb2dyYW1zL2Nsb2NrL3dpbmNsb2NrLmMKQEAgLTAsMCArMSwyMDYgQEAKKy8qIAorICogIENsb2NrICh3aW5jbG9jay5jKQorICoKKyAqICBDb3B5cmlnaHQgMTk5OCBieSBNYXJjZWwgQmF1ciA8bWJhdXJAZzI2LmV0aHouY2g+CisgKgorICogIFRoaXMgZmlsZSBpcyBiYXNlZCBvbiAgcm9sZXguYyAgYnkgSmltIFBldGVyc29uLgorICoKKyAqICBJIGp1c3QgbWFuYWdlZCB0byBtb3ZlIHRoZSByZWxldmFudCBwYXJ0cyBpbnRvIHRoZSBDbG9jayBhcHBsaWNhdGlvbgorICogIGFuZCBtYWRlIGl0IGxvb2sgbGlrZSB0aGUgb3JpZ2luYWwgV2luZG93cyBvbmUuIFlvdSBjYW4gZmluZCB0aGUgb3JpZ2luYWwKKyAqICByb2xleC5jIGluIHRoZSB3aW5lIC9saWJ0ZXN0IGRpcmVjdG9yeS4KKyAqCisgKiAgT3JpZ2luYWwgZmlsZSBoZWFkZXI6CisgKiAgPgorICogID4gcm9sZXguYzogV2luZG93cyBjbG9jayBhcHBsaWNhdGlvbiBmb3IgV0lORSAoYnkgSmltIFBldGVyc29uKSAgICAKKyAqICA+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKyAqICA+IFRoaXMgaXMgYSB0cmFuc2xhdGlvbiBvZiBhIFR1cmJvIFBhc2NhbCBPV0wgYXBwbGljYXRpb24gSSBtYWRlICAgCisgKiAgPiBvbmNlLCBzbyBpdCdzIGEgbGl0dGxlIGZsYWt5ICh0b25zIG9mIGdsb2JhbHMsIGZ1bmN0aW9ucyB0aGF0ICAgIAorICogID4gY291bGQgaGF2ZSBiZWVuIGluLWxpbmVkLCBldGMuKS4gIFRoZSBzb3VyY2UgY29kZSBzaG91bGQgZWFzaWx5ICAKKyAqICA+IGNvbXBpbGUgd2l0aCBhIHN0YW5kYXJkIFdpbjMyIEMgY29tcGlsZXIuICAgICAgICAgICAgICAgICAgICAgICAgCisgKiAgPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisgKiAgPiBUbyB0cnkgaXQgb3V0LCB0eXBlICdtYWtlIHJvbGV4Jy4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisgKiAgPgorICoKKyAqLworCisjaW5jbHVkZSA8bWF0aC5oPgorI2luY2x1ZGUgPHN0cmluZy5oPgorI2luY2x1ZGUgIndpbmNsb2NrLmgiCisjaW5jbHVkZSAid2luZG93cy5oIgorI2luY2x1ZGUgIm1haW4uaCIKKworQ09MT1JSRUYgRmFjZUNvbG9yID0gUkdCKDE5MiwxOTIsMTkyKTsKK0NPTE9SUkVGIEhhbmRDb2xvciA9IFJHQigwLDAsMCk7CitDT0xPUlJFRiBFdGNoQ29sb3IgPSBSR0IoMCwwLDApOworCitmbG9hdCBQaT0zLjE0MTU5MjY7CisKK0hhbmREYXRhIE9sZFNlY29uZCxPbGRIb3VyLE9sZE1pbnV0ZTsKKworaW50IE1pZGRsZVgodm9pZCkgeworICBpbnQgWCwgZGlmZjsKKworICBYICAgID0gKEdsb2JhbHMuTWF4WC8yKTsgIAorICBkaWZmID0gKEdsb2JhbHMuTWF4WC1HbG9iYWxzLk1heFkpOworICBpZiAoZGlmZj4wKSB7IFggPSAoWC0oZGlmZi8yKSk7IH0KKyAgcmV0dXJuIFg7Cit9CisKK2ludCBNaWRkbGVZKHZvaWQpIHsKKyAgaW50IFksIGRpZmY7CisgIAorICBZICAgID0gKEdsb2JhbHMuTWF4WS8yKTsKKyAgZGlmZiA9IChHbG9iYWxzLk1heFgtR2xvYmFscy5NYXhZKTsKKyAgaWYgKGRpZmY8MCkgeyBZID0gWSsoZGlmZi8yKTsgfQorICByZXR1cm4gWTsKK30KKwordm9pZCBEcmF3RmFjZShIREMgZGMpCit7CisgIGludCBNaWRYLCBNaWRZLCB0LCBEaWZmWCwgRGlmZlk7CisgIAorICBNaWRYID0gTWlkZGxlWCgpOworICBNaWRZID0gTWlkZGxlWSgpOworICBEaWZmWCA9IChHbG9iYWxzLk1heFgtTWlkWCoyKS8yOworICBEaWZmWSA9IChHbG9iYWxzLk1heFktTWlkWSoyKS8yOworCisgIFNlbGVjdE9iamVjdChkYyxDcmVhdGVTb2xpZEJydXNoKEZhY2VDb2xvcikpOworICBTZWxlY3RPYmplY3QoZGMsQ3JlYXRlUGVuKFBTX1NPTElELDEsRXRjaENvbG9yKSk7CisgIEVsbGlwc2UoZGMsRGlmZlgsRGlmZlksMipNaWRYK0RpZmZYLDIqTWlkWStEaWZmWSk7CisKKyAgZm9yKHQ9MDsgdDwxMjsgdCsrKQorICB7CisgICAgTW92ZVRvRXgoZGMsKE1pZFgrRGlmZlgpK3Npbih0KlBpLzYpKjAuOSpNaWRYLChNaWRZK0RpZmZZKS1jb3ModCpQaS82KSowLjkqTWlkWSxOVUxMKTsKKyAgICBMaW5lVG8oZGMsKE1pZFkrRGlmZlgpK3Npbih0KlBpLzYpKjAuOCpNaWRYLChNaWRZK0RpZmZZKS1jb3ModCpQaS82KSowLjgqTWlkWSk7CisgIH0KKyAgaWYoR2xvYmFscy5NYXhYPjY0ICYmIEdsb2JhbHMuTWF4WT42NCkKKyAgICBmb3IodD0wOyB0PDYwOyB0KyspCisgICAgICBTZXRQaXhlbChkYywoTWlkWCtEaWZmWCkrc2luKHQqUGkvMzApKjAuOSpNaWRYLChNaWRZK0RpZmZZKS1jb3ModCpQaS8zMCkqMC45Kk1pZFkKKwkgICAgICAgLEV0Y2hDb2xvcik7CisgIERlbGV0ZU9iamVjdChTZWxlY3RPYmplY3QoZGMsR2V0U3RvY2tPYmplY3QoTlVMTF9CUlVTSCkpKTsKKyAgRGVsZXRlT2JqZWN0KFNlbGVjdE9iamVjdChkYyxHZXRTdG9ja09iamVjdChOVUxMX1BFTikpKTsKKyAgbWVtc2V0KCZPbGRTZWNvbmQsMCxzaXplb2YoT2xkU2Vjb25kKSk7CisgIG1lbXNldCgmT2xkTWludXRlLDAsc2l6ZW9mKE9sZE1pbnV0ZSkpOworICBtZW1zZXQoJk9sZEhvdXIsMCxzaXplb2YoT2xkSG91cikpOworfQorCit2b2lkIERyYXdIb3VySGFuZChIREMgZGMpCit7CisgIE1vdmVUb0V4KGRjLCBPbGRIb3VyLlN0YXJ0WCwgT2xkSG91ci5TdGFydFksIE5VTEwpOworICBMaW5lVG8oZGMsIE9sZEhvdXIuRW5kWCwgT2xkSG91ci5FbmRZKTsKK30KKwordm9pZCBEcmF3TWludXRlSGFuZChIREMgZGMpCit7CisgIE1vdmVUb0V4KGRjLCBPbGRNaW51dGUuU3RhcnRYLCBPbGRNaW51dGUuU3RhcnRZLCBOVUxMKTsKKyAgTGluZVRvKGRjLCBPbGRNaW51dGUuRW5kWCwgT2xkTWludXRlLkVuZFkpOworfQorCit2b2lkIERyYXdTZWNvbmRIYW5kKEhEQyBkYykKK3sKKyAgICBNb3ZlVG9FeChkYywgT2xkU2Vjb25kLlN0YXJ0WCwgT2xkU2Vjb25kLlN0YXJ0WSwgTlVMTCk7CisgICAgTGluZVRvKGRjLCBPbGRTZWNvbmQuRW5kWCwgT2xkU2Vjb25kLkVuZFkpOworfQorCitCT09MIFVwZGF0ZUhvdXJIYW5kKEhEQyBkYyxpbnQgTWlkWCxpbnQgTWlkWSxpbnQgWEV4dCxpbnQgWUV4dCxXT1JEIFBvcykKK3sKKyAgaW50IFN4LCBTeSwgRXgsIEV5OworICBCT09MIHJ2OworCisgIHJ2ID0gRkFMU0U7CisgIFN4ID0gTWlkWDsgU3kgPSBNaWRZOworICBFeCA9IE1pZFgrc2luKFBvcypQaS82MDAwKSpYRXh0OworICBFeSA9IE1pZFktY29zKFBvcypQaS82MDAwKSpZRXh0OworICBydiA9ICggU3ghPU9sZEhvdXIuU3RhcnRYIHx8IEV4IT1PbGRIb3VyLkVuZFggfHwgCisJIFN5IT1PbGRIb3VyLlN0YXJ0WSB8fCBFeSE9T2xkSG91ci5FbmRZICk7CisgIGlmIChHbG9iYWxzLmJBbmFsb2cgJiYgcnYpRHJhd0hvdXJIYW5kKGRjKTsKKyAgT2xkSG91ci5TdGFydFggPSBTeDsgT2xkSG91ci5FbmRYID0gRXg7CisgIE9sZEhvdXIuU3RhcnRZID0gU3k7IE9sZEhvdXIuRW5kWSA9IEV5OworICByZXR1cm4gcnY7Cit9CisKK0JPT0wgVXBkYXRlTWludXRlSGFuZChIREMgZGMsaW50IE1pZFgsaW50IE1pZFksaW50IFhFeHQsaW50IFlFeHQsV09SRCBQb3MpCit7CisgIGludCBTeCwgU3ksIEV4LCBFeTsKKyAgQk9PTCBydjsKKworICBydiA9IEZBTFNFOworICBTeCA9IE1pZFg7IFN5ID0gTWlkWTsKKyAgRXggPSBNaWRYK3NpbihQb3MqUGkvMzAwMDApKlhFeHQ7CisgIEV5ID0gTWlkWS1jb3MoUG9zKlBpLzMwMDAwKSpZRXh0OworICBydiA9ICggU3ghPU9sZE1pbnV0ZS5TdGFydFggfHwgRXghPU9sZE1pbnV0ZS5FbmRYIHx8CisJIFN5IT1PbGRNaW51dGUuU3RhcnRZIHx8IEV5IT1PbGRNaW51dGUuRW5kWSApOworICBpZiAoR2xvYmFscy5iQW5hbG9nICYmIHJ2KURyYXdNaW51dGVIYW5kKGRjKTsKKyAgT2xkTWludXRlLlN0YXJ0WCA9IFN4OyBPbGRNaW51dGUuRW5kWCA9IEV4OworICBPbGRNaW51dGUuU3RhcnRZID0gU3k7IE9sZE1pbnV0ZS5FbmRZID0gRXk7CisgIHJldHVybiBydjsKK30KKworQk9PTCBVcGRhdGVTZWNvbmRIYW5kKEhEQyBkYyxpbnQgTWlkWCxpbnQgTWlkWSxpbnQgWEV4dCxpbnQgWUV4dCxXT1JEIFBvcykKK3sKKyAgaW50IFN4LCBTeSwgRXgsIEV5OworICBCT09MIHJ2OworCisgIHJ2ID0gRkFMU0U7CisgIAorICBpZiAoR2xvYmFscy5iU2Vjb25kcykgeworICAgIFN4ID0gTWlkWDsgU3kgPSBNaWRZOworICAgIEV4ID0gTWlkWCtzaW4oUG9zKlBpLzMwMDApKlhFeHQ7CisgICAgRXkgPSBNaWRZLWNvcyhQb3MqUGkvMzAwMCkqWUV4dDsKKyAgICBydiA9ICggU3ghPU9sZFNlY29uZC5TdGFydFggfHwgRXghPU9sZFNlY29uZC5FbmRYIHx8CisgIAkgU3khPU9sZFNlY29uZC5TdGFydFkgfHwgRXkhPU9sZFNlY29uZC5FbmRZICk7CisgICAgaWYgKEdsb2JhbHMuYkFuYWxvZyAmJiBydilEcmF3U2Vjb25kSGFuZChkYyk7CisgICAgT2xkU2Vjb25kLlN0YXJ0WCA9IFN4OyBPbGRTZWNvbmQuRW5kWCA9IEV4OworICAgIE9sZFNlY29uZC5TdGFydFkgPSBTeTsgT2xkU2Vjb25kLkVuZFkgPSBFeTsKKyAgfQorICAKKyAgcmV0dXJuIHJ2OworfQorCit2b2lkIElkbGUoSERDIGlkYykKK3sKKyAgU1lTVEVNVElNRSBzdDsKKyAgV09SRCBILCBNLCBTLCBGOworICBpbnQgTWlkWCwgTWlkWSwgRGlmZlgsIERpZmZZOworICBIREMgZGM7CisgIEJPT0wgUmVkcmF3OworCisgIGlmKGlkYykKKyAgICBkYz1pZGM7CisgIGVsc2UKKyAgICBkYz1HZXREQyhHbG9iYWxzLmhNYWluV25kKTsKKyAgaWYoIWRjKXJldHVybjsKKworICBHZXRMb2NhbFRpbWUoJnN0KTsKKyAgSCA9IHN0LndIb3VyOworICBNID0gc3Qud01pbnV0ZTsKKyAgUyA9IHN0LndTZWNvbmQ7CisgIEYgPSBzdC53TWlsbGlzZWNvbmRzIC8gMTA7CisgIEYgPSBGICsgUyoxMDA7CisgIE0gPSBNKjEwMDArRi82OworICBIID0gSCoxMDAwK00vNjA7CisgIE1pZFggPSBNaWRkbGVYKCk7CisgIE1pZFkgPSBNaWRkbGVZKCk7CisgIERpZmZYID0gKEdsb2JhbHMuTWF4WC1NaWRYKjIpLzI7CisgIERpZmZZID0gKEdsb2JhbHMuTWF4WS1NaWRZKjIpLzI7CisKKyAgU2VsZWN0T2JqZWN0KGRjLENyZWF0ZVBlbihQU19TT0xJRCwxLEZhY2VDb2xvcikpOworICBSZWRyYXcgPSBGQUxTRTsKKyAgaWYoVXBkYXRlSG91ckhhbmQoZGMsTWlkWCtEaWZmWCxNaWRZK0RpZmZZLE1pZFgqMC41LE1pZFkqMC41LEgpKSBSZWRyYXcgPSBUUlVFOworICBpZihVcGRhdGVNaW51dGVIYW5kKGRjLE1pZFgrRGlmZlgsTWlkWStEaWZmWSxNaWRYKjAuNjUsTWlkWSowLjY1LE0pKSBSZWRyYXcgPSBUUlVFOworICBpZihVcGRhdGVTZWNvbmRIYW5kKGRjLE1pZFgrRGlmZlgsTWlkWStEaWZmWSxNaWRYKjAuNzksTWlkWSowLjc5LEYpKSBSZWRyYXcgPSBUUlVFOworICBpZiAoR2xvYmFscy5iQW5hbG9nKQorICB7CisgIERlbGV0ZU9iamVjdChTZWxlY3RPYmplY3QoZGMsQ3JlYXRlUGVuKFBTX1NPTElELDEsSGFuZENvbG9yKSkpOworICAgIGlmKFJlZHJhdykKKyAgICB7CisgICAgICBEcmF3U2Vjb25kSGFuZChkYyk7CisgICAgICBEcmF3TWludXRlSGFuZChkYyk7CisgICAgICBEcmF3SG91ckhhbmQoZGMpOworICAgIH0KKyAgRGVsZXRlT2JqZWN0KFNlbGVjdE9iamVjdChkYyxHZXRTdG9ja09iamVjdChOVUxMX1BFTikpKTsgCisgIH0KKyAgaWYoIWlkYykgUmVsZWFzZURDKEdsb2JhbHMuaE1haW5XbmQsZGMpOworfQorCisvLyAgICBjbGFzcy5oYnJCYWNrZ3JvdW5kID0gKEhCUlVTSCkoQ09MT1JfQkFDS0dST1VORCArIDEpOwpkaWZmIC0tZ2l0IGEvcHJvZ3JhbXMvY2xvY2svd2luY2xvY2suaCBiL3Byb2dyYW1zL2Nsb2NrL3dpbmNsb2NrLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYmJlYjczZAotLS0gL2Rldi9udWxsCisrKyBiL3Byb2dyYW1zL2Nsb2NrL3dpbmNsb2NrLmgKQEAgLTAsMCArMSwzMCBAQAorLyogCisgKiAgQ2xvY2sgKHdpbmNsb2NrLmgpCisgKgorICogIENvcHlyaWdodCAxOTk4IGJ5IE1hcmNlbCBCYXVyIDxtYmF1ckBnMjYuZXRoei5jaD4KKyAqICBUaGlzIGZpbGUgaXMgZXNzZW50aWFsbHkgcm9sZXguYyBieSBKaW0gUGV0ZXJzb24uCisgKiAgUGxlYXNlIHNlZSBteSB3aW5jbG9jay5jIGFuZC9vciBoaXMgcm9sZXguYyBmb3IgcmVmZXJlbmNlcy4KKyAqCisgKi8KKworICNpbmNsdWRlIDx3aW5kb3dzLmg+CisgCit0eXBlZGVmIHN0cnVjdAoreworICBpbnQgU3RhcnRYLFN0YXJ0WSxFbmRYLEVuZFk7Cit9IEhhbmREYXRhOworCisvKiBmdW5jdGlvbiBwcm90b3R5cGVzICovCisKKwordm9pZCBEcmF3RmFjZShIREMgZGMpOworCisKK3ZvaWQgRHJhd0hvdXJIYW5kKEhEQyBkYyk7Cit2b2lkIERyYXdNaW51dGVIYW5kKEhEQyBkYyk7Cit2b2lkIERyYXdTZWNvbmRIYW5kKEhEQyBkYyk7CitCT09MIFVwZGF0ZUhvdXJIYW5kKEhEQyBkYyxpbnQgTWlkWCxpbnQgTWlkWSxpbnQgWEV4dCxpbnQgWUV4dCxXT1JEIFBvcyk7CitCT09MIFVwZGF0ZU1pbnV0ZUhhbmQoSERDIGRjLGludCBNaWRYLGludCBNaWRZLGludCBYRXh0LGludCBZRXh0LFdPUkQgUG9zKTsKK0JPT0wgVXBkYXRlU2Vjb25kSGFuZChIREMgZGMsaW50IE1pZFgsaW50IE1pZFksaW50IFhFeHQsaW50IFlFeHQsV09SRCBQb3MpOwordm9pZCBJZGxlKEhEQyBpZGMpOworCmRpZmYgLS1naXQgYS9wcm9ncmFtcy92aWV3L01ha2VmaWxlLmluIGIvcHJvZ3JhbXMvdmlldy9NYWtlZmlsZS5pbgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41ZWZkOWY5Ci0tLSAvZGV2L251bGwKKysrIGIvcHJvZ3JhbXMvdmlldy9NYWtlZmlsZS5pbgpAQCAtMCwwICsxLDMyIEBACitERUZTICAgICAgPSAtRFdJTkVMSUIKK1RPUFNSQ0RJUiA9IEB0b3Bfc3JjZGlyQAorVE9QT0JKRElSID0gLi4vLi4KK1NSQ0RJUiAgICA9IEBzcmNkaXJACitWUEFUSCAgICAgPSBAc3JjZGlyQAorTU9EVUxFICAgID0gbm9uZQorUFJPR1JBTVMgID0gdmlldworQUxMX0xJQlMgID0gJChXSU5FTElCKSAkKFhfTElCUykgJChYUE1fTElCKSAkKFhMSUIpICQoTElCUykKK1JDRkxBR1MgICA9IC13MzIgLWgKKworQ19TUkNTID0gXAorCWluaXQuYyBcCisJdmlldy5jIFwKKwl3aW5tYWluLmMKKworYWxsOiBjaGVja193aW5lcmMgJChQUk9HUkFNUykKKworZGVwZW5kOjogJChSQ19TUkNTOi5yYz0uaCkKKworQE1BS0VfUlVMRVNACisKK3ZpZXc6ICQoT0JKUykKKwkkKENDKSAtbyB2aWV3ICQoT0JKUykgJChMRE9QVElPTlMpICQoQUxMX0xJQlMpCisKK2luc3RhbGw6IGR1bW15CisJJChJTlNUQUxMX1BST0dSQU0pIHZpZXcgJChiaW5kaXIpL3ZpZXcKKworJChSQ19TUkNTOi5yYz0uYykgJChSQ19TUkNTOi5yYz0uaCk6ICQoV0lORVJDKQorCitkdW1teToKKworIyMjIERlcGVuZGVuY2llczoKZGlmZiAtLWdpdCBhL3Byb2dyYW1zL3ZpZXcvZ2xvYmFscy5oIGIvcHJvZ3JhbXMvdmlldy9nbG9iYWxzLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDBhMjdjMQotLS0gL2Rldi9udWxsCisrKyBiL3Byb2dyYW1zL3ZpZXcvZ2xvYmFscy5oCkBAIC0wLDAgKzEsMjkgQEAKKy8qICBBZGQgZ2xvYmFsIGZ1bmN0aW9uIHByb3RvdHlwZXMgaGVyZSAqLworCitCT09MIEluaXRBcHBsaWNhdGlvbihISU5TVEFOQ0UpOworQk9PTCBJbml0SW5zdGFuY2UoSElOU1RBTkNFLCBpbnQpOworQk9PTCBDZW50ZXJXaW5kb3coSFdORCwgSFdORCk7CisKKy8qIEFkZCBuZXcgY2FsbGJhY2sgZnVuY3Rpb24gcHJvdG90eXBlcyBoZXJlICAqLworCitMUkVTVUxUIENBTExCQUNLIFduZFByb2MoSFdORCwgVUlOVCwgV1BBUkFNLCBMUEFSQU0pOworCisvKiBHbG9iYWwgdmFyaWFibGUgZGVjbGFyYXRpb25zICovCisKK2V4dGVybiBISU5TVEFOQ0UgaEluc3Q7ICAgICAgICAgIC8qIFRoZSBjdXJyZW50IGluc3RhbmNlIGhhbmRsZSAqLworZXh0ZXJuIGNoYXIgICAgICBzekFwcE5hbWVbXTsgICAgLyogVGhlIG5hbWUgb2YgdGhpcyBhcHBsaWNhdGlvbiAqLworZXh0ZXJuIGNoYXIgICAgICBzelRpdGxlW107ICAgICAgLyogVGhlIHRpdGxlIGJhciB0ZXh0ICovCisKK3R5cGVkZWYgc3RydWN0Cit7CisJRFdPUkQJa2V5OworCUhBTkRMRQlobWY7CisJUkVDVAliYm94OworCVdPUkQJaW5jaDsKKwlEV09SRAlyZXNlcnZlZDsKKwlXT1JECWNoZWNrc3VtOworfSBBUE1GSUxFSEVBREVSOworCisjZGVmaW5lIEFQTUhFQURFUl9LRVkJMHg5QUM2Q0REN2wKKworCmRpZmYgLS1naXQgYS9wcm9ncmFtcy92aWV3L2luaXQuYyBiL3Byb2dyYW1zL3ZpZXcvaW5pdC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmVlYWExNDkKLS0tIC9kZXYvbnVsbAorKysgYi9wcm9ncmFtcy92aWV3L2luaXQuYwpAQCAtMCwwICsxLDg0IEBACisjaW5jbHVkZSA8d2luZG93cy5oPgorI2luY2x1ZGUgImdsb2JhbHMuaCIKKyNpbmNsdWRlICJyZXNvdXJjZS5oIgorCisvKiBnbG9iYWwgdmFyaWFibGVzICovCisKK0hJTlNUQU5DRSBoSW5zdDsKK2NoYXIgc3pBcHBOYW1lWzldOworY2hhciBzelRpdGxlWzQwXTsKKworQk9PTCBJbml0QXBwbGljYXRpb24oSElOU1RBTkNFIGhJbnN0YW5jZSkKK3sKKyAgV05EQ0xBU1NFWCB3YzsKKworICAvKiBMb2FkIHRoZSBhcHBsaWNhdGlvbiBuYW1lIGFuZCBkZXNjcmlwdGlvbiBzdHJpbmdzICovCisgIAorICBMb2FkU3RyaW5nKGhJbnN0YW5jZSwgSURTX0FQUE5BTUUsIHN6QXBwTmFtZSwgc2l6ZW9mKHN6QXBwTmFtZSkpOworICBMb2FkU3RyaW5nKGhJbnN0YW5jZSwgSURTX0RFU0NSSVBUSU9OLCBzelRpdGxlLCBzaXplb2Yoc3pUaXRsZSkpOworCisgIC8qIEZpbGwgaW4gd2luZG93IGNsYXNzIHN0cnVjdHVyZSB3aXRoIHBhcmFtZXRlcnMgdGhhdCBkZXNjcmliZSB0aGUKKyAgICAgbWFpbiB3aW5kb3cgKi8KKworICB3Yy5jYlNpemUgPSBzaXplb2YoV05EQ0xBU1NFWCk7CisKKyAgLyogTG9hZCBzbWFsbCBpY29uIGltYWdlICovCisgIHdjLmhJY29uU20gPSBMb2FkSW1hZ2UoaEluc3RhbmNlLAkJCisJCQkgTUFLRUlOVFJFU09VUkNFKElESV9BUFBJQ09OKSwKKwkJCSBJTUFHRV9JQ09OLAorCQkJIDE2LCAxNiwKKwkJCSAwKTsKKworICB3Yy5zdHlsZSAgICAgICAgID0gQ1NfSFJFRFJBVyB8IENTX1ZSRURSQVc7ICAgICAgICAgICAgIC8qIENsYXNzIHN0eWxlKHMpICovCisgIHdjLmxwZm5XbmRQcm9jICAgPSAoV05EUFJPQylXbmRQcm9jOyAgICAgICAgICAgICAgICAgIC8qIFdpbmRvdyBQcm9jZWR1cmUgKi8KKyAgd2MuY2JDbHNFeHRyYSAgICA9IDA7ICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBObyBwZXItY2xhc3MgZXh0cmEgZGF0YSAqLworICB3Yy5jYlduZEV4dHJhICAgID0gMDsgICAgICAgICAgICAgICAgICAgICAgICAgLyogTm8gcGVyLXdpbmRvdyBleHRyYSBkYXRhICovCisgIHdjLmhJbnN0YW5jZSAgICAgPSBoSW5zdGFuY2U7ICAgICAgICAgICAgICAgICAgICAgIC8qIE93bmVyIG9mIHRoaXMgY2xhc3MgKi8KKyAgd2MuaEljb24gICAgICAgICA9IExvYWRJY29uKGhJbnN0YW5jZSwgc3pBcHBOYW1lKTsgIC8qIEljb24gbmFtZSBmcm9tIC5yYyAqLworICB3Yy5oQ3Vyc29yICAgICAgID0gTG9hZEN1cnNvcihOVUxMLCBJRENfQVJST1cpOyAgICAgICAgICAgICAgICAgLyogQ3Vyc29yICovCisgIHdjLmhickJhY2tncm91bmQgPSAoSEJSVVNIKShDT0xPUl9XSU5ET1cgKyAxKTsgICAgICAgICAgIC8qIERlZmF1bHQgY29sb3IgKi8KKyAgd2MubHBzek1lbnVOYW1lICA9IHN6QXBwTmFtZTsgICAgICAgICAgICAgICAgICAgICAgIC8qIE1lbnUgbmFtZSBmcm9tIC5yYyAqLworICB3Yy5scHN6Q2xhc3NOYW1lID0gc3pBcHBOYW1lOyAgICAgICAgICAgICAgICAgICAgICAvKiBOYW1lIHRvIHJlZ2lzdGVyIGFzICovCisKKyAgLyogUmVnaXN0ZXIgdGhlIHdpbmRvdyBjbGFzcyBhbmQgcmV0dXJuIEZBTFNFIGlmIHVuc3VjY2VzZnVsICovCisKKyAgaWYgKCFSZWdpc3RlckNsYXNzRXgoJndjKSkKKyAgICB7CisgICAgICBpZiAoIVJlZ2lzdGVyQ2xhc3MoKExQV05EQ0xBU1MpJndjLnN0eWxlKSkKKwlyZXR1cm4gRkFMU0U7CisgICAgfQorCisgIC8qIENhbGwgbW9kdWxlIHNwZWNpZmljIGluaXRpYWxpemF0aW9uIGZ1bmN0aW9ucyBoZXJlICovCisKKyAgcmV0dXJuIFRSVUU7Cit9CisKK0JPT0wgSW5pdEluc3RhbmNlKEhJTlNUQU5DRSBoSW5zdGFuY2UsIGludCBuQ21kU2hvdykKK3sKKyAgICBIV05EIGh3bmQ7IAorCisgICAgLyogU2F2ZSB0aGUgaW5zdGFuY2UgaGFuZGxlIGluIGEgZ2xvYmFsIHZhcmlhYmxlIGZvciBsYXRlciB1c2UgKi8KKyAgICBoSW5zdCA9IGhJbnN0YW5jZTsKKworICAgIC8qIENyZWF0ZSBtYWluIHdpbmRvdyAqLworICAgIGh3bmQgPSBDcmVhdGVXaW5kb3coc3pBcHBOYW1lLCAgICAgICAgICAgLyogU2VlIFJlZ2lzdGVyQ2xhc3MoKSBjYWxsICovCisgICAgICAgICAgICAgICAgICAgICAgICBzelRpdGxlLCAgICAgICAgICAgICAvKiB3aW5kb3cgdGl0bGUgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgIFdTX09WRVJMQVBQRURXSU5ET1csIC8qIFdpbmRvdyBzdHlsZSAqLworICAgICAgICAgICAgICAgICAgICAgICAgQ1dfVVNFREVGQVVMVCwgMCwgICAgLyogcG9zaXRpb25pbmcgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgIENXX1VTRURFRkFVTFQsIDAsICAgIC8qIHNpemUgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgIE5VTEwsICAgICAgICAgICAgICAgIC8qIE92ZXJsYXBwZWQgaGFzIG5vIHBhcmVudCAqLworICAgICAgICAgICAgICAgICAgICAgICAgTlVMTCwgICAgICAgICAgICAgICAgLyogVXNlIHRoZSB3aW5kb3cgY2xhc3MgbWVudSAqLworICAgICAgICAgICAgICAgICAgICAgICAgaEluc3RhbmNlLCAgICAgICAgICAgCisgICAgICAgICAgICAgICAgICAgICAgICBOVUxMKTsgICAgICAgICAgICAgICAKKyAgICAKKyAgICBpZiAoIWh3bmQpCisgICAgICAgIHJldHVybiBGQUxTRTsKKworICAgIC8qIENhbGwgbW9kdWxlIHNwZWNpZmljIGluc3RhbmNlIGluaXRpYWxpemF0aW9uIGZ1bmN0aW9ucyBoZXJlICovCisKKyAgICAvKiBzaG93IHRoZSB3aW5kb3csIGFuZCBwYWludCBpdCBmb3IgdGhlIGZpcnN0IHRpbWUgKi8KKyAgICBTaG93V2luZG93KGh3bmQsIG5DbWRTaG93KTsKKyAgICBVcGRhdGVXaW5kb3coaHduZCk7CisKKyAgICByZXR1cm4gVFJVRTsKK30KZGlmZiAtLWdpdCBhL3Byb2dyYW1zL3ZpZXcvbGNjbWFrZWZpbGUgYi9wcm9ncmFtcy92aWV3L2xjY21ha2VmaWxlCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmRiZDE5YWUKLS0tIC9kZXYvbnVsbAorKysgYi9wcm9ncmFtcy92aWV3L2xjY21ha2VmaWxlCkBAIC0wLDAgKzEsMTkgQEAKKworV0lORSA9IC4uLy4uL3dpbmUKK0xDQ0lOQyA9IGM6XFxsY2NcXGluY2x1ZGUKK09CSlMgPSB2aWV3Lm9iaiBpbml0Lm9iaiB3aW5tYWluLm9iaiAKK1JFUyA9IHZpZXdyYy5yZXMKKworLlNVRkZJWEVTOiAucmMgLm9iaiAucmVzCisKKy5jLm9iajoKKwkkKFdJTkUpICJsY2MgLUkkKExDQ0lOQykgJDwiCisKKy5yYy5yZXM6CisJJChXSU5FKSAibHJjICQ8IgorCit2aWV3LmV4ZTogJChPQkpTKSAkKFJFUykKKwkkKFdJTkUpICJsY2NsbmsgJChPQkpTKSAkKFJFUykiCisKK2NsZWFuOgorCXJtICouZXhlICoub2JqICoucmVzCmRpZmYgLS1naXQgYS9wcm9ncmFtcy92aWV3L3Jlc291cmNlLmggYi9wcm9ncmFtcy92aWV3L3Jlc291cmNlLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMGZmMmI1YwotLS0gL2Rldi9udWxsCisrKyBiL3Byb2dyYW1zL3ZpZXcvcmVzb3VyY2UuaApAQCAtMCwwICsxLDEwIEBACisjZGVmaW5lIElEU19BUFBOQU1FICAgICAgICAgICAgICAgICAgICAgMQorI2RlZmluZSBJRFNfREVTQ1JJUFRJT04gICAgICAgICAgICAgICAgIDIKKyNkZWZpbmUgSURJX0FQUElDT04gICAgICAgICAgICAgICAgICAgICAxMDEKKyNkZWZpbmUgSURNX0VYSVQgICAgICAgICAgICAgICAgICAgICAgICAxMDAwCisjZGVmaW5lIElETV9IRUxMTyAgICAgICAgICAgICAgICAgICAgICAgNTAxCisjZGVmaW5lIElETV9PUEVOICAgICAgICAgICAgICAgICAgICAgICAgNTAyCisjZGVmaW5lIElETV9MRUZUICAgICAgICAgICAgICAgICAgICAgICAgNjAxCisjZGVmaW5lIElETV9SSUdIVCAgICAgICAgICAgICAgICAgICAgICAgNjAyCisjZGVmaW5lIElETV9VUCAgICAgICAgICAgICAgICAgICAgICAgICAgNjAzCisjZGVmaW5lIElETV9ET1dOICAgICAgICAgICAgICAgICAgICAgICAgNjA0CmRpZmYgLS1naXQgYS9wcm9ncmFtcy92aWV3L3ZpZXcuYyBiL3Byb2dyYW1zL3ZpZXcvdmlldy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjUyZmI5OWEKLS0tIC9kZXYvbnVsbAorKysgYi9wcm9ncmFtcy92aWV3L3ZpZXcuYwpAQCAtMCwwICsxLDE5MyBAQAorI2luY2x1ZGUgPHdpbmRvd3MuaD4KKworLyogCisjaW5jbHVkZSA8d2luZG93c3guaD4KKyAgIFdpbmUgZG9lc24ndCBoYXZlIHdpbmRvd3N4LmgsIHNvIHdlIHVzZSB0aGlzCisqLworI2RlZmluZSAgICAgICBHRVRfV01fQ09NTUFORF9JRCh3cCxscCkgICAgICAgIExPV09SRCh3cCkKKworLyogV2luZSBzZWVtcyB0byBuZWVkIHRoaXMgKi8KKyNpbmNsdWRlIDxjb21tZGxnLmg+CisKKyNpbmNsdWRlICJnbG9iYWxzLmgiICAgICAgICAKKyNpbmNsdWRlICJyZXNvdXJjZS5oIgorCitCT09MIEZpbGVJc1BsYWNlYWJsZSggTFBDU1RSIHN6RmlsZU5hbWUgKTsKK0hNRVRBRklMRSBHZXRQbGFjZWFibGVNZXRhRmlsZSggTFBDU1RSIHN6RmlsZU5hbWUgKTsKKworI2RlZmluZSBGTl9MRU5HVEggODAKKworSE1FVEFGSUxFIGhtZjsKK2ludCBkZWx0YXggPSAwLCBkZWx0YXkgPSAwOworaW50IHdpZHRoID0gMCwgaGVpZ2h0ID0gMDsKK0JPT0wgaXNBbGR1czsKKworQk9PTCBGaWxlT3BlbihIV05EIGhXbmQsIGNoYXIgKmZuKQoreworICBPUEVORklMRU5BTUUgb2ZuID0geyBzaXplb2YoT1BFTkZJTEVOQU1FKSwKKwkJICAgICAgIDAsIE5VTEwsICJNZXRhZmlsZXNcMCoud21mXDAiLCBOVUxMLCAwLCAwLCBOVUxMLCAKKwkJICAgICAgIEZOX0xFTkdUSCwgTlVMTCwgMCwgTlVMTCwgTlVMTCwgT0ZOX0NSRUFURVBST01QVCB8CisJCSAgICAgICBPRk5fU0hPV0hFTFAsIDAsIDAsIE5VTEwsIDAsIE5VTEwgfTsKKyAgb2ZuLmh3bmRPd25lciA9IGhXbmQ7CisgIG9mbi5scHN0ckZpbGUgPSBmbjsKKyAgcmV0dXJuIEdldE9wZW5GaWxlTmFtZSgmb2ZuKTsKK30KKworCitMUkVTVUxUIENBTExCQUNLIFduZFByb2MoSFdORCBod25kLAorICAgICAgICAgICAgICAgICAgICAgICAgIFVJTlQgdU1lc3NhZ2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgV1BBUkFNIHdwYXJhbSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBMUEFSQU0gbHBhcmFtKQoreworICBzd2l0Y2ggKHVNZXNzYWdlKQorICAgIHsKKyAgICBjYXNlIFdNX1BBSU5UOiAKKyAgICAgIHsKKwlQQUlOVFNUUlVDVCBwczsgCisJQmVnaW5QYWludChod25kLCAmcHMpOworCVNldE1hcE1vZGUocHMuaGRjLCBNTV9BTklTT1RST1BJQyk7CisJU2V0Vmlld3BvcnRFeHQocHMuaGRjLCB3aWR0aCwgaGVpZ2h0KTsKKwlTZXRWaWV3cG9ydE9yZ0V4KHBzLmhkYywgZGVsdGF4LCBkZWx0YXksIE5VTEwpOworCWlmKGhtZikgUGxheU1ldGFGaWxlKHBzLmhkYywgaG1mKTsKKwlFbmRQYWludChod25kLCAmcHMpOworCisgICAgICB9CisgICAgICBicmVhazsKKworICAgIGNhc2UgV01fQ09NTUFORDogLyogbWVzc2FnZTogY29tbWFuZCBmcm9tIGFwcGxpY2F0aW9uIG1lbnUgKi8KKyAgICAgIHN3aXRjaCAoR0VUX1dNX0NPTU1BTkRfSUQod3BhcmFtLGxwYXJhbSkpCisJeworCWNhc2UgSURNX0hFTExPOgorCSAgTWVzc2FnZUJveCggaHduZCAsICJIZWxsbyB0aGVyZSB3b3JsZCEiLCAiSGVsbG8iLCBNQl9PSyk7CisJICBicmVhazsKKworCWNhc2UgSURNX09QRU46CisJICB7CisJICAgIGNoYXIgZmlsZW5hbWVbRk5fTEVOR1RIXTsKKwkgICAgaWYgKEZpbGVPcGVuKGh3bmQsIGZpbGVuYW1lKSkgeworCSAgICAgIGlzQWxkdXMgPSBGaWxlSXNQbGFjZWFibGUoZmlsZW5hbWUpOworCSAgICAgIGlmIChpc0FsZHVzKSB7CisjaWYgMAorCQlobWYgPSBHZXRQbGFjZWFibGVNZXRhRmlsZShmaWxlbmFtZSk7CisjZWxzZQorCQlNZXNzYWdlQm94KGh3bmQsICJUaGlzIGlzIGFuIEFsZHVzIHBsYWNlYWJsZSBtZXRhZmlsZTogSSBjYW4ndCBkZWFsIHdpdGggdGhvc2UhIiwKKwkJCSAgICJBbGR1cyIsIE1CX09LKTsKKyNlbmRpZgorCSAgICAgIH0gZWxzZSB7CisJCVJFQ1QgcjsKKwkJaG1mID0gR2V0TWV0YUZpbGUoZmlsZW5hbWUpOworCQlHZXRDbGllbnRSZWN0KGh3bmQsICZyKTsKKwkJd2lkdGggPSByLnJpZ2h0IC0gci5sZWZ0OworCQloZWlnaHQgPSByLmJvdHRvbSAtIHIudG9wOworCSAgICAgIH0KKwkgICAgICBJbnZhbGlkYXRlUmVjdCggaHduZCwgTlVMTCwgVFJVRSApOworCSAgICB9CisJICB9CisJICBicmVhazsKKwkgIAorCWNhc2UgSURNX0xFRlQ6CisJICBkZWx0YXggKz0gMTAwOworCSAgSW52YWxpZGF0ZVJlY3QoIGh3bmQsIE5VTEwsIFRSVUUgKTsKKwkgIGJyZWFrOworCWNhc2UgSURNX1JJR0hUOgorCSAgZGVsdGF4IC09IDEwMDsKKwkgIEludmFsaWRhdGVSZWN0KCBod25kLCBOVUxMLCBUUlVFICk7CisJICBicmVhazsKKwljYXNlIElETV9VUDoKKwkgIGRlbHRheSArPSAxMDA7CisJICBJbnZhbGlkYXRlUmVjdCggaHduZCwgTlVMTCwgVFJVRSApOworCSAgYnJlYWs7CisJY2FzZSBJRE1fRE9XTjoKKwkgIGRlbHRheSAtPSAxMDA7CisJICBJbnZhbGlkYXRlUmVjdCggaHduZCwgTlVMTCwgVFJVRSApOworCSAgYnJlYWs7CisKKwljYXNlIElETV9FWElUOgorCSAgRGVzdHJveVdpbmRvdyhod25kKTsKKwkgIGJyZWFrOworCisJZGVmYXVsdDoKKwkgIHJldHVybiBEZWZXaW5kb3dQcm9jKGh3bmQsIHVNZXNzYWdlLCB3cGFyYW0sIGxwYXJhbSk7CisJfQorICAgICAgYnJlYWs7CisKKyAgICBjYXNlIFdNX0RFU1RST1k6ICAvKiBtZXNzYWdlOiB3aW5kb3cgYmVpbmcgZGVzdHJveWVkICovCisgICAgICBQb3N0UXVpdE1lc3NhZ2UoMCk7CisgICAgICBicmVhazsKKworICAgIGRlZmF1bHQ6ICAgICAgICAgIC8qIFBhc3NlcyBpdCBvbiBpZiB1bnByb2NjZXNzZWQgKi8KKyAgICAgIHJldHVybiBEZWZXaW5kb3dQcm9jKGh3bmQsIHVNZXNzYWdlLCB3cGFyYW0sIGxwYXJhbSk7CisgICAgfQorICAgIHJldHVybiAwOworfQorCitCT09MIEZpbGVJc1BsYWNlYWJsZSggTFBDU1RSIHN6RmlsZU5hbWUgKQoreworICBIRklMRQkJaEluRmlsZTsKKyAgT0ZTVFJVQ1QJCWlub2Y7CisgIEFQTUZJTEVIRUFERVIJYXBtaDsKKworICBpZiggKGhJbkZpbGUgPSBPcGVuRmlsZSggc3pGaWxlTmFtZSwgJmlub2YsIE9GX1JFQUQgKSApID09IEhGSUxFX0VSUk9SICkKKyAgICByZXR1cm4gRkFMU0U7CisKKyAgaWYoIF9scmVhZCggaEluRmlsZSwgJmFwbWgsIHNpemVvZihBUE1GSUxFSEVBREVSKSApIAorICAgICAgIT0gc2l6ZW9mKEFQTUZJTEVIRUFERVIpICkKKyAgICB7CisgICAgICBfbGNsb3NlKCBoSW5GaWxlICk7CisgICAgICByZXR1cm4gRkFMU0U7CisgICAgfQorICBfbGNsb3NlKCBoSW5GaWxlICk7CisKKyAgLyogSXMgaXQgcGxhY2VhYmxlPyAqLworICByZXR1cm4gKGFwbWgua2V5ID09IEFQTUhFQURFUl9LRVkpOworfQorCisvKiB0aGlzIGNvZGUgZG9lc24ndCB3b3JrICovCitITUVUQUZJTEUgR2V0UGxhY2VhYmxlTWV0YUZpbGUoIExQQ1NUUiBzekZpbGVOYW1lICkKK3sKKyAgSEFORExFIGhEYXRhOworICBMUFNUUglscERhdGE7CisgIE1FVEFIRUFERVIgbWZIZWFkZXI7CisgIEFQTUZJTEVIRUFERVIJQVBNSGVhZGVyOworICBITUVUQUZJTEUgaG1mID0gTlVMTDsKKyAgSEZJTEUJZmg7CisgIE9GU1RSVUNUIGlub2Y7CisKKyAgaWYoIChmaCA9IE9wZW5GaWxlKCBzekZpbGVOYW1lLCAmaW5vZiwgT0ZfUkVBRCApICkgPT0gSEZJTEVfRVJST1IgKSByZXR1cm4gTlVMTDsKKyAgX2xsc2VlayhmaCwgMCwgMCk7CisgIGlmICghX2xyZWFkKGZoLCAoTFBTVFIpJkFQTUhlYWRlciwgc2l6ZW9mKEFQTUZJTEVIRUFERVIpKSkgcmV0dXJuIE5VTEw7CisgIF9sbHNlZWsoZmgsIHNpemVvZihBUE1GSUxFSEVBREVSKSwgMCk7CisgIGlmICghX2xyZWFkKGZoLCAoTFBTVFIpJm1mSGVhZGVyLCBzaXplb2YoTUVUQUhFQURFUikpKSByZXR1cm4gTlVMTDsKKworICAvKiBzb21laG93IG10U2l6ZSBpcyBiZWluZyBzd2FwcGVkICovCisKKyAgaWYgKCEoaERhdGEgPSBHbG9iYWxBbGxvYyhHSE5ELCAobWZIZWFkZXIubXRTaXplICogMkwpKSkpIHJldHVybiBOVUxMOworCisgIGlmICghKGxwRGF0YSA9IEdsb2JhbExvY2soaERhdGEpKSkKKyAgeworICAgIEdsb2JhbEZyZWUoaERhdGEpOworICAgIHJldHVybiBOVUxMOworICB9CisKKyAgX2xsc2VlayhmaCwgc2l6ZW9mKEFQTUZJTEVIRUFERVIpLCAwKTsKKyAgaWYgKCFfbHJlYWQoZmgsIGxwRGF0YSwgKFVJTlQpKG1mSGVhZGVyLm10U2l6ZSAqIDJMKSkpCisgIHsKKyAgICBHbG9iYWxVbmxvY2soaERhdGEpOworICAgIEdsb2JhbEZyZWUoaERhdGEpOworICAgIHJldHVybiBOVUxMOworICB9CisgIF9sY2xvc2UoZmgpOworICBHbG9iYWxVbmxvY2soaERhdGEpOworCisgIGlmICghKGhtZiA9IChITUVUQUZJTEUpIFNldE1ldGFGaWxlQml0cyhoRGF0YSkpKSByZXR1cm4gTlVMTDsKKworICAKKyAgd2lkdGggPSBBUE1IZWFkZXIuYmJveC5yaWdodCAtIEFQTUhlYWRlci5iYm94LmxlZnQ7CisgIGhlaWdodCA9IEFQTUhlYWRlci5iYm94LmJvdHRvbSAtIEFQTUhlYWRlci5iYm94LnRvcDsKKyAgZGVsdGF4ID0gMDsKKyAgZGVsdGF5ID0gMCA7CisgIHJldHVybiBobWY7Cit9CisKKworCmRpZmYgLS1naXQgYS9wcm9ncmFtcy92aWV3L3ZpZXdyYy5yYyBiL3Byb2dyYW1zL3ZpZXcvdmlld3JjLnJjCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmM0OTM5NTAKLS0tIC9kZXYvbnVsbAorKysgYi9wcm9ncmFtcy92aWV3L3ZpZXdyYy5yYwpAQCAtMCwwICsxLDYwIEBACisjaW5jbHVkZSAicmVzb3VyY2UuaCIKKworLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKy8vCisvLyBJY29uCisvLworCisvKklESV9BUFBJQ09OICAgICAgICAgICAgIElDT04gICAgRElTQ0FSREFCTEUgICAgICJ2aWV3LmljbyIqLworCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworLy8KKy8vIE1lbnUKKy8vCisKK1ZJRVcgTUVOVQorQkVHSU4KKyAgICBQT1BVUCAiJkZpbGUiCisgICAgQkVHSU4KKwlNRU5VSVRFTSAiJk9wZW4iLAkJCUlETV9PUEVOCisgICAgICAgIE1FTlVJVEVNICJFJnhpdCIsICAgICAgICAgICAgICAgICAgICAgICBJRE1fRVhJVAorICAgIEVORAorICAgIFBPUFVQICImUGFuIgorICAgIEJFR0lOCisgICAgICBNRU5VSVRFTSAiJkxlZnQiLAkJCQlJRE1fTEVGVAorICAgICAgTUVOVUlURU0gIiZSaWdodCIsCQkJSURNX1JJR0hUCisgICAgICBNRU5VSVRFTSAiJlVwIiwJCQkJSURNX1VQCisgICAgICBNRU5VSVRFTSAiJkRvd24iLAkJCQlJRE1fRE9XTgorICAgIEVORAorICAgIFBPUFVQICImSW5mbyIKKyAgICBCRUdJTgorCU1FTlVJVEVNICImSGVsbG8iLAkJCUlETV9IRUxMTworICAgIEVORAorRU5ECisKKworLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKy8vCisvLyBBY2NlbGVyYXRvcgorLy8KKworVklFVyBBQ0NFTEVSQVRPUlMgCitCRUdJTgorICAgICJRIiwgICAgICAgICAgICBJRE1fRVhJVCwgICAgICAgICAgICAgICAgQ09OVFJPTAorRU5ECisKKworCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworLy8KKy8vIFN0cmluZyBUYWJsZQorLy8KKworU1RSSU5HVEFCTEUgRElTQ0FSREFCTEUKK0JFR0lOCisgICAgSURTX0FQUE5BTUUgICAgICAgICAgICAgIlZpZXciCisgICAgSURTX0RFU0NSSVBUSU9OICAgICAgICAgIlJlZ3VsYXIgTWV0YWZpbGUgVmlld2VyIgorRU5ECisKKworCmRpZmYgLS1naXQgYS9wcm9ncmFtcy92aWV3L3dpbm1haW4uYyBiL3Byb2dyYW1zL3ZpZXcvd2lubWFpbi5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjcwZTRiOGMKLS0tIC9kZXYvbnVsbAorKysgYi9wcm9ncmFtcy92aWV3L3dpbm1haW4uYwpAQCAtMCwwICsxLDQ5IEBACisjaW5jbHVkZSA8d2luZG93cy5oPiAgICAgICAgICAgIC8qIHJlcXVpcmVkIGZvciBhbGwgV2luZG93cyBhcHBsaWNhdGlvbnMgKi8gCisjaW5jbHVkZSAiZ2xvYmFscy5oIiAgICAgICAgICAgIC8qIHByb3RvdHlwZXMgc3BlY2lmaWMgdG8gdGhpcyBhcHBsaWNhdGlvbiAqLworCisKK2ludCBBUElFTlRSWSBXaW5NYWluKEhJTlNUQU5DRSBoSW5zdGFuY2UsCisgICAgICAgICAgICAgICAgICAgICBISU5TVEFOQ0UgaFByZXZJbnN0YW5jZSwgCisgICAgICAgICAgICAgICAgICAgICBMUFNUUiAgICAgbHBDbWRMaW5lLCAKKyAgICAgICAgICAgICAgICAgICAgIGludCAgICAgICBuQ21kU2hvdykKK3sKKyAgICBNU0cgbXNnOworICAgIEhBTkRMRSBoQWNjZWxUYWJsZTsKKyAgICAKKyAgICAvKiBPdGhlciBpbnN0YW5jZXMgb2YgYXBwIHJ1bm5pbmc/ICovCisgICAgaWYgKCFoUHJldkluc3RhbmNlKQorICAgIHsKKyAgICAgIC8qIHN0dWZmIHRvIGJlIGRvbmUgb25jZSAqLworICAgICAgaWYgKCFJbml0QXBwbGljYXRpb24oaEluc3RhbmNlKSkKKyAgICAgIHsKKwlyZXR1cm4gRkFMU0U7ICAgICAgICAgICAgICAvKiBleGl0ICovIAorICAgICAgfQorICAgIH0KKworICAgIC8qIHN0dWZmIHRvIGJlIGRvbmUgZXZlcnkgdGltZSAqLworICAgIGlmICghSW5pdEluc3RhbmNlKGhJbnN0YW5jZSwgbkNtZFNob3cpKQorICAgIHsKKyAgICAgIHJldHVybiBGQUxTRTsKKyAgICB9CisKKyAgICBoQWNjZWxUYWJsZSA9IExvYWRBY2NlbGVyYXRvcnMoaEluc3RhbmNlLCBzekFwcE5hbWUpOworCisgICAgLyogTWFpbiBsb29wICovCisgICAgLyogQWNxdWlyZSBhbmQgZGlzcGF0Y2ggbWVzc2FnZXMgdW50aWwgYSBXTV9RVUlUIG1lc3NhZ2UgaXMgcmVjZWl2ZWQgKi8KKyAgICB3aGlsZSAoR2V0TWVzc2FnZSgmbXNnLCBOVUxMLCAwLCAwKSkKKyAgICB7CisgICAgICAvKiBBZGQgb3RoZXIgVHJhbnNsYXRpb24gZnVuY3Rpb25zIChmb3IgbW9kZWxlc3MgZGlhbG9ncworCSBhbmQvb3IgTURJIHdpbmRvd3MpIGhlcmUuICovCisKKyAgICAgIGlmICghVHJhbnNsYXRlQWNjZWxlcmF0b3IobXNnLmh3bmQsIGhBY2NlbFRhYmxlLCAmbXNnKSkKKyAgICAgICAgeworICAgICAgICAgICAgVHJhbnNsYXRlTWVzc2FnZSgmbXNnKTsKKyAgICAgICAgICAgIERpc3BhdGNoTWVzc2FnZSgmbXNnKTsgCisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKiBBZGQgbW9kdWxlIHNwZWNpZmljIGluc3RhbmNlIGZyZWUvZGVsZXRlIGZ1bmN0aW9ucyBoZXJlICovCisKKyAgICAvKiBSZXR1cm5zIHRoZSB2YWx1ZSBmcm9tIFBvc3RRdWl0TWVzc2FnZSAqLworICAgIHJldHVybiBtc2cud1BhcmFtOworfQpkaWZmIC0tZ2l0IGEvcHJvZ3JhbXMvd2luaGVscC9tYWNyby5sZXgubCBiL3Byb2dyYW1zL3dpbmhlbHAvbWFjcm8ubGV4LmwKaW5kZXggZjBkMTQ5OC4uMGU2ODIzZCAxMDA2NDQKLS0tIGEvcHJvZ3JhbXMvd2luaGVscC9tYWNyby5sZXgubAorKysgYi9wcm9ncmFtcy93aW5oZWxwL21hY3JvLmxleC5sCkBAIC0yMSw5OCArMjEsOTggQEAKICNkZWZpbmUgWVlfTk9fVU5QVVQKICV9CiAlJQotQWJvdXQJCQl5eWx2YWwgPSBNQUNST19BYm91dDsJCQlyZXR1cm4gVk9JRF9GVU5DVElPTl9WT0lEOwotQWRkQWNjZWxlcmF0b3J8QUEJeXlsdmFsID0gTUFDUk9fQWRkQWNjZWxlcmF0b3I7CQlyZXR1cm4gVk9JRF9GVU5DVElPTl8yVUlOVF9TVFJJTkc7Ci1BTGlua3xBTAkJeXlsdmFsID0gTUFDUk9fQUxpbms7CQkJcmV0dXJuIFZPSURfRlVOQ1RJT05fU1RSSU5HX1VJTlRfU1RSSU5HOwotQW5ub3RhdGUJCXl5bHZhbCA9IE1BQ1JPX0Fubm90YXRlOwkJcmV0dXJuIFZPSURfRlVOQ1RJT05fVk9JRDsKLUFwcGVuZEl0ZW0JCXl5bHZhbCA9IE1BQ1JPX0FwcGVuZEl0ZW07CQlyZXR1cm4gVk9JRF9GVU5DVElPTl80U1RSSU5HOwotQmFjawkJCXl5bHZhbCA9IE1BQ1JPX0JhY2s7CQkJcmV0dXJuIFZPSURfRlVOQ1RJT05fVk9JRDsKLUJhY2tGbHVzaHxCRgkJeXlsdmFsID0gTUFDUk9fQmFja0ZsdXNoOwkJcmV0dXJuIFZPSURfRlVOQ1RJT05fVk9JRDsKLUJvb2ttYXJrRGVmaW5lCQl5eWx2YWwgPSBNQUNST19Cb29rbWFya0RlZmluZTsJCXJldHVybiBWT0lEX0ZVTkNUSU9OX1ZPSUQ7Ci1Cb29rbWFya01vcmUJCXl5bHZhbCA9IE1BQ1JPX0Jvb2ttYXJrTW9yZTsJCXJldHVybiBWT0lEX0ZVTkNUSU9OX1ZPSUQ7Ci1Ccm93c2VCdXR0b25zCQl5eWx2YWwgPSBNQUNST19Ccm93c2VCdXR0b25zOwkJcmV0dXJuIFZPSURfRlVOQ1RJT05fVk9JRDsKLUNoYW5nZUJ1dHRvbkJpbmRpbmd8Q0JCCXl5bHZhbCA9IE1BQ1JPX0NoYW5nZUJ1dHRvbkJpbmRpbmc7CXJldHVybiBWT0lEX0ZVTkNUSU9OXzJTVFJJTkc7Ci1DaGFuZ2VFbmFibGV8Q0UJCXl5bHZhbCA9IE1BQ1JPX0NoYW5nZUVuYWJsZTsJCXJldHVybiBWT0lEX0ZVTkNUSU9OXzJTVFJJTkc7Ci1DaGFuZ2VJdGVtQmluZGluZ3xDSUIJeXlsdmFsID0gTUFDUk9fQ2hhbmdlSXRlbUJpbmRpbmc7CXJldHVybiBWT0lEX0ZVTkNUSU9OXzJTVFJJTkc7Ci1DaGVja0l0ZW18Q0kJCXl5bHZhbCA9IE1BQ1JPX0NoZWNrSXRlbTsJCXJldHVybiBWT0lEX0ZVTkNUSU9OX1NUUklORzsKLUNsb3NlU2Vjb25kYXJ5c3xDUwl5eWx2YWwgPSBNQUNST19DbG9zZVNlY29uZGFyeXM7CQlyZXR1cm4gVk9JRF9GVU5DVElPTl9WT0lEOwotQ2xvc2VXaW5kb3d8Q1cJCXl5bHZhbCA9IE1BQ1JPX0Nsb3NlV2luZG93OwkJcmV0dXJuIFZPSURfRlVOQ1RJT05fU1RSSU5HOwotQ29tcGFyZQkJCXl5bHZhbCA9IE1BQ1JPX0NvbXBhcmU7CQkJcmV0dXJuIFZPSURfRlVOQ1RJT05fU1RSSU5HOwotQ29udGVudHMJCXl5bHZhbCA9IE1BQ1JPX0NvbnRlbnRzOwkJcmV0dXJuIFZPSURfRlVOQ1RJT05fVk9JRDsKLUNvbnRyb2xQYW5lbAkJeXlsdmFsID0gTUFDUk9fQ29udHJvbFBhbmVsOwkJcmV0dXJuIFZPSURfRlVOQ1RJT05fMlNUUklOR19VSU5UOwotQ29weURpYWxvZwkJeXlsdmFsID0gTUFDUk9fQ29weURpYWxvZzsJCXJldHVybiBWT0lEX0ZVTkNUSU9OX1ZPSUQ7Ci1Db3B5VG9waWN8Q1QJCXl5bHZhbCA9IE1BQ1JPX0NvcHlUb3BpYzsJCXJldHVybiBWT0lEX0ZVTkNUSU9OX1ZPSUQ7Ci1DcmVhdGVCdXR0b258Q0IJCXl5bHZhbCA9IE1BQ1JPX0NyZWF0ZUJ1dHRvbjsJCXJldHVybiBWT0lEX0ZVTkNUSU9OXzNTVFJJTkc7Ci1EZWxldGVJdGVtCQl5eWx2YWwgPSBNQUNST19EZWxldGVJdGVtOwkJcmV0dXJuIFZPSURfRlVOQ1RJT05fU1RSSU5HOwotRGVsZXRlTWFyawkJeXlsdmFsID0gTUFDUk9fRGVsZXRlTWFyazsJCXJldHVybiBWT0lEX0ZVTkNUSU9OX1NUUklORzsKLURlc3Ryb3lCdXR0b24JCXl5bHZhbCA9IE1BQ1JPX0Rlc3Ryb3lCdXR0b247CQlyZXR1cm4gVk9JRF9GVU5DVElPTl9TVFJJTkc7Ci1EaXNhYmxlQnV0dG9ufERCCXl5bHZhbCA9IE1BQ1JPX0Rpc2FibGVCdXR0b247CQlyZXR1cm4gVk9JRF9GVU5DVElPTl9TVFJJTkc7Ci1EaXNhYmxlSXRlbXxESQkJeXlsdmFsID0gTUFDUk9fRGlzYWJsZUl0ZW07CQlyZXR1cm4gVk9JRF9GVU5DVElPTl9TVFJJTkc7Ci1FbmFibGVCdXR0b258RUIJCXl5bHZhbCA9IE1BQ1JPX0VuYWJsZUJ1dHRvbjsJCXJldHVybiBWT0lEX0ZVTkNUSU9OX1NUUklORzsKLUVuYWJsZUl0ZW18RUkJCXl5bHZhbCA9IE1BQ1JPX0VuYWJsZUl0ZW07CQlyZXR1cm4gVk9JRF9GVU5DVElPTl9TVFJJTkc7Ci1FbmRNUHJpbnQJCXl5bHZhbCA9IE1BQ1JPX0VuZE1QcmludDsJCXJldHVybiBWT0lEX0ZVTkNUSU9OX1ZPSUQ7Ci1FeGVjRmlsZXxFRgkJeXlsdmFsID0gTUFDUk9fRXhlY0ZpbGU7CQlyZXR1cm4gVk9JRF9GVU5DVElPTl8yU1RSSU5HX1VJTlRfU1RSSU5HOwotRXhlY1Byb2dyYW18RVAJCXl5bHZhbCA9IE1BQ1JPX0V4ZWNQcm9ncmFtOwkJcmV0dXJuIFZPSURfRlVOQ1RJT05fU1RSSU5HX1VJTlQ7Ci1FeGl0CQkJeXlsdmFsID0gTUFDUk9fRXhpdDsJCQlyZXR1cm4gVk9JRF9GVU5DVElPTl9WT0lEOwotRXh0QWJsZUl0ZW0JCXl5bHZhbCA9IE1BQ1JPX0V4dEFibGVJdGVtOwkJcmV0dXJuIFZPSURfRlVOQ1RJT05fU1RSSU5HX1VJTlQ7Ci1FeHRJbnNlcnRJdGVtCQl5eWx2YWwgPSBNQUNST19FeHRJbnNlcnRJdGVtOwkJcmV0dXJuIFZPSURfRlVOQ1RJT05fNFNUUklOR18yVUlOVDsKLUV4dEluc2VydE1lbnUJCXl5bHZhbCA9IE1BQ1JPX0V4dEluc2VydE1lbnU7CQlyZXR1cm4gVk9JRF9GVU5DVElPTl8zU1RSSU5HXzJVSU5UOwotRmlsZUV4aXN0fEZFCQl5eWx2YWwgPSBNQUNST19GaWxlRXhpc3Q7CQlyZXR1cm4gQk9PTF9GVU5DVElPTl9TVFJJTkc7Ci1GaWxlT3BlbnxGTwkJeXlsdmFsID0gTUFDUk9fRmlsZU9wZW47CQlyZXR1cm4gVk9JRF9GVU5DVElPTl9WT0lEOwotRmluZAkJCXl5bHZhbCA9IE1BQ1JPX0ZpbmQ7CQkJcmV0dXJuIFZPSURfRlVOQ1RJT05fVk9JRDsKLUZpbmRlcnxGRAkJeXlsdmFsID0gTUFDUk9fRmluZGVyOwkJCXJldHVybiBWT0lEX0ZVTkNUSU9OX1ZPSUQ7Ci1GbG9hdGluZ01lbnUJCXl5bHZhbCA9IE1BQ1JPX0Zsb2F0aW5nTWVudTsJCXJldHVybiBWT0lEX0ZVTkNUSU9OX1ZPSUQ7Ci1GbHVzaHxGSAkJeXlsdmFsID0gTUFDUk9fRmx1c2g7CQkJcmV0dXJuIFZPSURfRlVOQ1RJT05fVk9JRDsKLUZvY3VzV2luZG93CQl5eWx2YWwgPSBNQUNST19Gb2N1c1dpbmRvdzsJCXJldHVybiBWT0lEX0ZVTkNUSU9OX1NUUklORzsKLUdlbmVyYXRlCQl5eWx2YWwgPSBNQUNST19HZW5lcmF0ZTsJCXJldHVybiBWT0lEX0ZVTkNUSU9OX1NUUklOR19XUEFSQU1fTFBBUkFNOwotR290b01hcmsJCXl5bHZhbCA9IE1BQ1JPX0dvdG9NYXJrOwkJcmV0dXJuIFZPSURfRlVOQ1RJT05fU1RSSU5HOwotSGVscE9uCQkJeXlsdmFsID0gTUFDUk9fSGVscE9uOwkJCXJldHVybiBWT0lEX0ZVTkNUSU9OX1ZPSUQ7Ci1IZWxwT25Ub3AJCXl5bHZhbCA9IE1BQ1JPX0hlbHBPblRvcDsJCXJldHVybiBWT0lEX0ZVTkNUSU9OX1ZPSUQ7Ci1IaXN0b3J5CQkJeXlsdmFsID0gTUFDUk9fSGlzdG9yeTsJCQlyZXR1cm4gVk9JRF9GVU5DVElPTl9WT0lEOworQWJvdXQJCQl5eWx2YWwgPSAoWVlTVFlQRSlNQUNST19BYm91dDsJCQlyZXR1cm4gVk9JRF9GVU5DVElPTl9WT0lEOworQWRkQWNjZWxlcmF0b3J8QUEJeXlsdmFsID0gKFlZU1RZUEUpTUFDUk9fQWRkQWNjZWxlcmF0b3I7CQlyZXR1cm4gVk9JRF9GVU5DVElPTl8yVUlOVF9TVFJJTkc7CitBTGlua3xBTAkJeXlsdmFsID0gKFlZU1RZUEUpTUFDUk9fQUxpbms7CQkJcmV0dXJuIFZPSURfRlVOQ1RJT05fU1RSSU5HX1VJTlRfU1RSSU5HOworQW5ub3RhdGUJCXl5bHZhbCA9IChZWVNUWVBFKU1BQ1JPX0Fubm90YXRlOwkJcmV0dXJuIFZPSURfRlVOQ1RJT05fVk9JRDsKK0FwcGVuZEl0ZW0JCXl5bHZhbCA9IChZWVNUWVBFKU1BQ1JPX0FwcGVuZEl0ZW07CQlyZXR1cm4gVk9JRF9GVU5DVElPTl80U1RSSU5HOworQmFjawkJCXl5bHZhbCA9IChZWVNUWVBFKU1BQ1JPX0JhY2s7CQkJcmV0dXJuIFZPSURfRlVOQ1RJT05fVk9JRDsKK0JhY2tGbHVzaHxCRgkJeXlsdmFsID0gKFlZU1RZUEUpTUFDUk9fQmFja0ZsdXNoOwkJcmV0dXJuIFZPSURfRlVOQ1RJT05fVk9JRDsKK0Jvb2ttYXJrRGVmaW5lCQl5eWx2YWwgPSAoWVlTVFlQRSlNQUNST19Cb29rbWFya0RlZmluZTsJCXJldHVybiBWT0lEX0ZVTkNUSU9OX1ZPSUQ7CitCb29rbWFya01vcmUJCXl5bHZhbCA9IChZWVNUWVBFKU1BQ1JPX0Jvb2ttYXJrTW9yZTsJCXJldHVybiBWT0lEX0ZVTkNUSU9OX1ZPSUQ7CitCcm93c2VCdXR0b25zCQl5eWx2YWwgPSAoWVlTVFlQRSlNQUNST19Ccm93c2VCdXR0b25zOwkJcmV0dXJuIFZPSURfRlVOQ1RJT05fVk9JRDsKK0NoYW5nZUJ1dHRvbkJpbmRpbmd8Q0JCCXl5bHZhbCA9IChZWVNUWVBFKU1BQ1JPX0NoYW5nZUJ1dHRvbkJpbmRpbmc7CXJldHVybiBWT0lEX0ZVTkNUSU9OXzJTVFJJTkc7CitDaGFuZ2VFbmFibGV8Q0UJCXl5bHZhbCA9IChZWVNUWVBFKU1BQ1JPX0NoYW5nZUVuYWJsZTsJCXJldHVybiBWT0lEX0ZVTkNUSU9OXzJTVFJJTkc7CitDaGFuZ2VJdGVtQmluZGluZ3xDSUIJeXlsdmFsID0gKFlZU1RZUEUpTUFDUk9fQ2hhbmdlSXRlbUJpbmRpbmc7CXJldHVybiBWT0lEX0ZVTkNUSU9OXzJTVFJJTkc7CitDaGVja0l0ZW18Q0kJCXl5bHZhbCA9IChZWVNUWVBFKU1BQ1JPX0NoZWNrSXRlbTsJCXJldHVybiBWT0lEX0ZVTkNUSU9OX1NUUklORzsKK0Nsb3NlU2Vjb25kYXJ5c3xDUwl5eWx2YWwgPSAoWVlTVFlQRSlNQUNST19DbG9zZVNlY29uZGFyeXM7CQlyZXR1cm4gVk9JRF9GVU5DVElPTl9WT0lEOworQ2xvc2VXaW5kb3d8Q1cJCXl5bHZhbCA9IChZWVNUWVBFKU1BQ1JPX0Nsb3NlV2luZG93OwkJcmV0dXJuIFZPSURfRlVOQ1RJT05fU1RSSU5HOworQ29tcGFyZQkJCXl5bHZhbCA9IChZWVNUWVBFKU1BQ1JPX0NvbXBhcmU7CQkJcmV0dXJuIFZPSURfRlVOQ1RJT05fU1RSSU5HOworQ29udGVudHMJCXl5bHZhbCA9IChZWVNUWVBFKU1BQ1JPX0NvbnRlbnRzOwkJcmV0dXJuIFZPSURfRlVOQ1RJT05fVk9JRDsKK0NvbnRyb2xQYW5lbAkJeXlsdmFsID0gKFlZU1RZUEUpTUFDUk9fQ29udHJvbFBhbmVsOwkJcmV0dXJuIFZPSURfRlVOQ1RJT05fMlNUUklOR19VSU5UOworQ29weURpYWxvZwkJeXlsdmFsID0gKFlZU1RZUEUpTUFDUk9fQ29weURpYWxvZzsJCXJldHVybiBWT0lEX0ZVTkNUSU9OX1ZPSUQ7CitDb3B5VG9waWN8Q1QJCXl5bHZhbCA9IChZWVNUWVBFKU1BQ1JPX0NvcHlUb3BpYzsJCXJldHVybiBWT0lEX0ZVTkNUSU9OX1ZPSUQ7CitDcmVhdGVCdXR0b258Q0IJCXl5bHZhbCA9IChZWVNUWVBFKU1BQ1JPX0NyZWF0ZUJ1dHRvbjsJCXJldHVybiBWT0lEX0ZVTkNUSU9OXzNTVFJJTkc7CitEZWxldGVJdGVtCQl5eWx2YWwgPSAoWVlTVFlQRSlNQUNST19EZWxldGVJdGVtOwkJcmV0dXJuIFZPSURfRlVOQ1RJT05fU1RSSU5HOworRGVsZXRlTWFyawkJeXlsdmFsID0gKFlZU1RZUEUpTUFDUk9fRGVsZXRlTWFyazsJCXJldHVybiBWT0lEX0ZVTkNUSU9OX1NUUklORzsKK0Rlc3Ryb3lCdXR0b24JCXl5bHZhbCA9IChZWVNUWVBFKU1BQ1JPX0Rlc3Ryb3lCdXR0b247CQlyZXR1cm4gVk9JRF9GVU5DVElPTl9TVFJJTkc7CitEaXNhYmxlQnV0dG9ufERCCXl5bHZhbCA9IChZWVNUWVBFKU1BQ1JPX0Rpc2FibGVCdXR0b247CQlyZXR1cm4gVk9JRF9GVU5DVElPTl9TVFJJTkc7CitEaXNhYmxlSXRlbXxESQkJeXlsdmFsID0gKFlZU1RZUEUpTUFDUk9fRGlzYWJsZUl0ZW07CQlyZXR1cm4gVk9JRF9GVU5DVElPTl9TVFJJTkc7CitFbmFibGVCdXR0b258RUIJCXl5bHZhbCA9IChZWVNUWVBFKU1BQ1JPX0VuYWJsZUJ1dHRvbjsJCXJldHVybiBWT0lEX0ZVTkNUSU9OX1NUUklORzsKK0VuYWJsZUl0ZW18RUkJCXl5bHZhbCA9IChZWVNUWVBFKU1BQ1JPX0VuYWJsZUl0ZW07CQlyZXR1cm4gVk9JRF9GVU5DVElPTl9TVFJJTkc7CitFbmRNUHJpbnQJCXl5bHZhbCA9IChZWVNUWVBFKU1BQ1JPX0VuZE1QcmludDsJCXJldHVybiBWT0lEX0ZVTkNUSU9OX1ZPSUQ7CitFeGVjRmlsZXxFRgkJeXlsdmFsID0gKFlZU1RZUEUpTUFDUk9fRXhlY0ZpbGU7CQlyZXR1cm4gVk9JRF9GVU5DVElPTl8yU1RSSU5HX1VJTlRfU1RSSU5HOworRXhlY1Byb2dyYW18RVAJCXl5bHZhbCA9IChZWVNUWVBFKU1BQ1JPX0V4ZWNQcm9ncmFtOwkJcmV0dXJuIFZPSURfRlVOQ1RJT05fU1RSSU5HX1VJTlQ7CitFeGl0CQkJeXlsdmFsID0gKFlZU1RZUEUpTUFDUk9fRXhpdDsJCQlyZXR1cm4gVk9JRF9GVU5DVElPTl9WT0lEOworRXh0QWJsZUl0ZW0JCXl5bHZhbCA9IChZWVNUWVBFKU1BQ1JPX0V4dEFibGVJdGVtOwkJcmV0dXJuIFZPSURfRlVOQ1RJT05fU1RSSU5HX1VJTlQ7CitFeHRJbnNlcnRJdGVtCQl5eWx2YWwgPSAoWVlTVFlQRSlNQUNST19FeHRJbnNlcnRJdGVtOwkJcmV0dXJuIFZPSURfRlVOQ1RJT05fNFNUUklOR18yVUlOVDsKK0V4dEluc2VydE1lbnUJCXl5bHZhbCA9IChZWVNUWVBFKU1BQ1JPX0V4dEluc2VydE1lbnU7CQlyZXR1cm4gVk9JRF9GVU5DVElPTl8zU1RSSU5HXzJVSU5UOworRmlsZUV4aXN0fEZFCQl5eWx2YWwgPSAoWVlTVFlQRSlNQUNST19GaWxlRXhpc3Q7CQlyZXR1cm4gQk9PTF9GVU5DVElPTl9TVFJJTkc7CitGaWxlT3BlbnxGTwkJeXlsdmFsID0gKFlZU1RZUEUpTUFDUk9fRmlsZU9wZW47CQlyZXR1cm4gVk9JRF9GVU5DVElPTl9WT0lEOworRmluZAkJCXl5bHZhbCA9IChZWVNUWVBFKU1BQ1JPX0ZpbmQ7CQkJcmV0dXJuIFZPSURfRlVOQ1RJT05fVk9JRDsKK0ZpbmRlcnxGRAkJeXlsdmFsID0gKFlZU1RZUEUpTUFDUk9fRmluZGVyOwkJCXJldHVybiBWT0lEX0ZVTkNUSU9OX1ZPSUQ7CitGbG9hdGluZ01lbnUJCXl5bHZhbCA9IChZWVNUWVBFKU1BQ1JPX0Zsb2F0aW5nTWVudTsJCXJldHVybiBWT0lEX0ZVTkNUSU9OX1ZPSUQ7CitGbHVzaHxGSAkJeXlsdmFsID0gKFlZU1RZUEUpTUFDUk9fRmx1c2g7CQkJcmV0dXJuIFZPSURfRlVOQ1RJT05fVk9JRDsKK0ZvY3VzV2luZG93CQl5eWx2YWwgPSAoWVlTVFlQRSlNQUNST19Gb2N1c1dpbmRvdzsJCXJldHVybiBWT0lEX0ZVTkNUSU9OX1NUUklORzsKK0dlbmVyYXRlCQl5eWx2YWwgPSAoWVlTVFlQRSlNQUNST19HZW5lcmF0ZTsJCXJldHVybiBWT0lEX0ZVTkNUSU9OX1NUUklOR19XUEFSQU1fTFBBUkFNOworR290b01hcmsJCXl5bHZhbCA9IChZWVNUWVBFKU1BQ1JPX0dvdG9NYXJrOwkJcmV0dXJuIFZPSURfRlVOQ1RJT05fU1RSSU5HOworSGVscE9uCQkJeXlsdmFsID0gKFlZU1RZUEUpTUFDUk9fSGVscE9uOwkJCXJldHVybiBWT0lEX0ZVTkNUSU9OX1ZPSUQ7CitIZWxwT25Ub3AJCXl5bHZhbCA9IChZWVNUWVBFKU1BQ1JPX0hlbHBPblRvcDsJCXJldHVybiBWT0lEX0ZVTkNUSU9OX1ZPSUQ7CitIaXN0b3J5CQkJeXlsdmFsID0gKFlZU1RZUEUpTUFDUk9fSGlzdG9yeTsJCQlyZXR1cm4gVk9JRF9GVU5DVElPTl9WT0lEOwogSWZUaGVufElGCQkJCQkJCXJldHVybiBJRl9USEVOOwogSWZUaGVuRWxzZXxJRQkJCQkJCQlyZXR1cm4gSUZfVEhFTl9FTFNFOwotSW5pdE1QcmludAkJeXlsdmFsID0gTUFDUk9fSW5pdE1QcmludDsJCXJldHVybiBCT09MX0ZVTkNUSU9OX1ZPSUQ7Ci1JbnNlcnRJdGVtCQl5eWx2YWwgPSBNQUNST19JbnNlcnRJdGVtOwkJcmV0dXJuIFZPSURfRlVOQ1RJT05fNFNUUklOR19VSU5UOwotSW5zZXJ0TWVudQkJeXlsdmFsID0gTUFDUk9fSW5zZXJ0TWVudTsJCXJldHVybiBWT0lEX0ZVTkNUSU9OXzJTVFJJTkdfVUlOVDsKLUlzQm9vawkJCXl5bHZhbCA9IE1BQ1JPX0lzQm9vazsJCQlyZXR1cm4gQk9PTF9GVU5DVElPTl9WT0lEOwotSXNNYXJrCQkJeXlsdmFsID0gTUFDUk9fSXNNYXJrOwkJCXJldHVybiBCT09MX0ZVTkNUSU9OX1NUUklORzsKLUlzTm90TWFya3xOTQkJeXlsdmFsID0gTUFDUk9fSXNOb3RNYXJrOwkJcmV0dXJuIEJPT0xfRlVOQ1RJT05fU1RSSU5HOwotSnVtcENvbnRlbnRzCQl5eWx2YWwgPSBNQUNST19KdW1wQ29udGVudHM7CQlyZXR1cm4gVk9JRF9GVU5DVElPTl9GSUxFX1dJTjsKLUp1bXBDb250ZXh0fEpDCQl5eWx2YWwgPSBNQUNST19KdW1wQ29udGV4dDsJCXJldHVybiBWT0lEX0ZVTkNUSU9OX0ZJTEVfV0lOX1VJTlQ7Ci1KdW1wSGFzaHxKSAkJeXlsdmFsID0gTUFDUk9fSnVtcEhhc2g7CQlyZXR1cm4gVk9JRF9GVU5DVElPTl9GSUxFX1dJTl9VSU5UOwotSnVtcEhlbHBPbgkJeXlsdmFsID0gTUFDUk9fSnVtcEhlbHBPbjsJCXJldHVybiBWT0lEX0ZVTkNUSU9OX1ZPSUQ7Ci1KdW1wSUR8SkkJCXl5bHZhbCA9IE1BQ1JPX0p1bXBJRDsJCQlyZXR1cm4gVk9JRF9GVU5DVElPTl9GSUxFX1dJTl9TVFJJTkc7Ci1KdW1wS2V5d29yZHxKSwkJeXlsdmFsID0gTUFDUk9fSnVtcEtleXdvcmQ7CQlyZXR1cm4gVk9JRF9GVU5DVElPTl9GSUxFX1dJTl9TVFJJTkc7Ci1LTGlua3xLTAkJeXlsdmFsID0gTUFDUk9fS0xpbms7CQkJcmV0dXJuIFZPSURfRlVOQ1RJT05fU1RSSU5HX1VJTlRfMlNUUklORzsKLU1lbnV8TVUJCQl5eWx2YWwgPSBNQUNST19NZW51OwkJCXJldHVybiBWT0lEX0ZVTkNUSU9OX1ZPSUQ7Ci1NUHJpbnRIYXNoCQl5eWx2YWwgPSBNQUNST19NUHJpbnRIYXNoOwkJcmV0dXJuIFZPSURfRlVOQ1RJT05fVUlOVDsKLU1QcmludElECQl5eWx2YWwgPSBNQUNST19NUHJpbnRJRDsJCXJldHVybiBWT0lEX0ZVTkNUSU9OX1NUUklORzsKLU5leHQJCQl5eWx2YWwgPSBNQUNST19OZXh0OwkJCXJldHVybiBWT0lEX0ZVTkNUSU9OX1ZPSUQ7Ci1Ob1Nob3cJCQl5eWx2YWwgPSBNQUNST19Ob1Nob3c7CQkJcmV0dXJuIFZPSURfRlVOQ1RJT05fVk9JRDsKK0luaXRNUHJpbnQJCXl5bHZhbCA9IChZWVNUWVBFKU1BQ1JPX0luaXRNUHJpbnQ7CQlyZXR1cm4gQk9PTF9GVU5DVElPTl9WT0lEOworSW5zZXJ0SXRlbQkJeXlsdmFsID0gKFlZU1RZUEUpTUFDUk9fSW5zZXJ0SXRlbTsJCXJldHVybiBWT0lEX0ZVTkNUSU9OXzRTVFJJTkdfVUlOVDsKK0luc2VydE1lbnUJCXl5bHZhbCA9IChZWVNUWVBFKU1BQ1JPX0luc2VydE1lbnU7CQlyZXR1cm4gVk9JRF9GVU5DVElPTl8yU1RSSU5HX1VJTlQ7CitJc0Jvb2sJCQl5eWx2YWwgPSAoWVlTVFlQRSlNQUNST19Jc0Jvb2s7CQkJcmV0dXJuIEJPT0xfRlVOQ1RJT05fVk9JRDsKK0lzTWFyawkJCXl5bHZhbCA9IChZWVNUWVBFKU1BQ1JPX0lzTWFyazsJCQlyZXR1cm4gQk9PTF9GVU5DVElPTl9TVFJJTkc7CitJc05vdE1hcmt8Tk0JCXl5bHZhbCA9IChZWVNUWVBFKU1BQ1JPX0lzTm90TWFyazsJCXJldHVybiBCT09MX0ZVTkNUSU9OX1NUUklORzsKK0p1bXBDb250ZW50cwkJeXlsdmFsID0gKFlZU1RZUEUpTUFDUk9fSnVtcENvbnRlbnRzOwkJcmV0dXJuIFZPSURfRlVOQ1RJT05fRklMRV9XSU47CitKdW1wQ29udGV4dHxKQwkJeXlsdmFsID0gKFlZU1RZUEUpTUFDUk9fSnVtcENvbnRleHQ7CQlyZXR1cm4gVk9JRF9GVU5DVElPTl9GSUxFX1dJTl9VSU5UOworSnVtcEhhc2h8SkgJCXl5bHZhbCA9IChZWVNUWVBFKU1BQ1JPX0p1bXBIYXNoOwkJcmV0dXJuIFZPSURfRlVOQ1RJT05fRklMRV9XSU5fVUlOVDsKK0p1bXBIZWxwT24JCXl5bHZhbCA9IChZWVNUWVBFKU1BQ1JPX0p1bXBIZWxwT247CQlyZXR1cm4gVk9JRF9GVU5DVElPTl9WT0lEOworSnVtcElEfEpJCQl5eWx2YWwgPSAoWVlTVFlQRSlNQUNST19KdW1wSUQ7CQkJcmV0dXJuIFZPSURfRlVOQ1RJT05fRklMRV9XSU5fU1RSSU5HOworSnVtcEtleXdvcmR8SksJCXl5bHZhbCA9IChZWVNUWVBFKU1BQ1JPX0p1bXBLZXl3b3JkOwkJcmV0dXJuIFZPSURfRlVOQ1RJT05fRklMRV9XSU5fU1RSSU5HOworS0xpbmt8S0wJCXl5bHZhbCA9IChZWVNUWVBFKU1BQ1JPX0tMaW5rOwkJCXJldHVybiBWT0lEX0ZVTkNUSU9OX1NUUklOR19VSU5UXzJTVFJJTkc7CitNZW51fE1VCQkJeXlsdmFsID0gKFlZU1RZUEUpTUFDUk9fTWVudTsJCQlyZXR1cm4gVk9JRF9GVU5DVElPTl9WT0lEOworTVByaW50SGFzaAkJeXlsdmFsID0gKFlZU1RZUEUpTUFDUk9fTVByaW50SGFzaDsJCXJldHVybiBWT0lEX0ZVTkNUSU9OX1VJTlQ7CitNUHJpbnRJRAkJeXlsdmFsID0gKFlZU1RZUEUpTUFDUk9fTVByaW50SUQ7CQlyZXR1cm4gVk9JRF9GVU5DVElPTl9TVFJJTkc7CitOZXh0CQkJeXlsdmFsID0gKFlZU1RZUEUpTUFDUk9fTmV4dDsJCQlyZXR1cm4gVk9JRF9GVU5DVElPTl9WT0lEOworTm9TaG93CQkJeXlsdmFsID0gKFlZU1RZUEUpTUFDUk9fTm9TaG93OwkJCXJldHVybiBWT0lEX0ZVTkNUSU9OX1ZPSUQ7CiBOb3QJCQkJCQkJCXJldHVybiBOT1Q7Ci1Qb3B1cENvbnRleHR8UEMJCXl5bHZhbCA9IE1BQ1JPX1BvcHVwQ29udGV4dDsJCXJldHVybiBWT0lEX0ZVTkNUSU9OX1NUUklOR19VSU5UOwotUG9wdXBIYXNoCQl5eWx2YWwgPSBNQUNST19Qb3B1cEhhc2g7CQlyZXR1cm4gVk9JRF9GVU5DVElPTl9TVFJJTkdfVUlOVDsKLVBvcHVwSWR8UEkJCXl5bHZhbCA9IE1BQ1JPX1BvcHVwSWQ7CQkJcmV0dXJuIFZPSURfRlVOQ1RJT05fMlNUUklORzsKLVBvc2l0aW9uV2luZG93fFBXCXl5bHZhbCA9IE1BQ1JPX1Bvc2l0aW9uV2luZG93OwkJcmV0dXJuIFZPSURfRlVOQ1RJT05fMklOVF8zVUlOVF9TVFJJTkc7Ci1QcmV2CQkJeXlsdmFsID0gTUFDUk9fUHJldjsJCQlyZXR1cm4gVk9JRF9GVU5DVElPTl9WT0lEOwotUHJpbnQJCQl5eWx2YWwgPSBNQUNST19QcmludDsJCQlyZXR1cm4gVk9JRF9GVU5DVElPTl9WT0lEOwotUHJpbnRlclNldHVwCQl5eWx2YWwgPSBNQUNST19QcmludGVyU2V0dXA7CQlyZXR1cm4gVk9JRF9GVU5DVElPTl9WT0lEOwotUmVnaXN0ZXJSb3V0aW5lfFJSCXl5bHZhbCA9IE1BQ1JPX1JlZ2lzdGVyUm91dGluZTsJCXJldHVybiBWT0lEX0ZVTkNUSU9OXzNTVFJJTkc7Ci1SZW1vdmVBY2NlbGVyYXRvcnxSQQl5eWx2YWwgPSBNQUNST19SZW1vdmVBY2NlbGVyYXRvcjsJcmV0dXJuIFZPSURfRlVOQ1RJT05fMlVJTlQ7Ci1SZXNldE1lbnUJCXl5bHZhbCA9IE1BQ1JPX1Jlc2V0TWVudTsJCXJldHVybiBWT0lEX0ZVTkNUSU9OX1ZPSUQ7Ci1TYXZlTWFyawkJeXlsdmFsID0gTUFDUk9fU2F2ZU1hcms7CQlyZXR1cm4gVk9JRF9GVU5DVElPTl9TVFJJTkc7Ci1TZWFyY2gJCQl5eWx2YWwgPSBNQUNST19TZWFyY2g7CQkJcmV0dXJuIFZPSURfRlVOQ1RJT05fVk9JRDsKLVNldENvbnRlbnRzCQl5eWx2YWwgPSBNQUNST19TZXRDb250ZW50czsJCXJldHVybiBWT0lEX0ZVTkNUSU9OX1NUUklOR19VSU5UOwotU2V0SGVscE9uRmlsZQkJeXlsdmFsID0gTUFDUk9fU2V0SGVscE9uRmlsZTsJCXJldHVybiBWT0lEX0ZVTkNUSU9OX1NUUklORzsKLVNldFBvcHVwQ29sb3J8U1BDCXl5bHZhbCA9IE1BQ1JPX1NldFBvcHVwQ29sb3I7CQlyZXR1cm4gVk9JRF9GVU5DVElPTl8zVUlOVDsKLVNoZWxsRXhlY3V0ZXxTRQkJeXlsdmFsID0gTUFDUk9fU2hlbGxFeGVjdXRlOwkJcmV0dXJuIFZPSURfRlVOQ1RJT05fMlNUUklOR18yVUlOVF8yU1RSSU5HOwotU2hvcnRDdXR8U0gJCXl5bHZhbCA9IE1BQ1JPX1Nob3J0Q3V0OwkJcmV0dXJuIFZPSURfRlVOQ1RJT05fMlNUUklOR19XUEFSQU1fTFBBUkFNX1NUUklORzsKLVRDYXJkCQkJeXlsdmFsID0gTUFDUk9fVENhcmQ7CQkJcmV0dXJuIFZPSURfRlVOQ1RJT05fVUlOVDsKLVRlc3QJCQl5eWx2YWwgPSBNQUNST19UZXN0OwkJCXJldHVybiBWT0lEX0ZVTkNUSU9OX1VJTlQ7Ci1UZXN0QUxpbmsJCXl5bHZhbCA9IE1BQ1JPX1Rlc3RBTGluazsJCXJldHVybiBCT09MX0ZVTkNUSU9OX1NUUklORzsKLVRlc3RLTGluawkJeXlsdmFsID0gTUFDUk9fVGVzdEtMaW5rOwkJcmV0dXJuIEJPT0xfRlVOQ1RJT05fU1RSSU5HOwotVW5jaGVja0l0ZW18VUkJCXl5bHZhbCA9IE1BQ1JPX1VuY2hlY2tJdGVtOwkJcmV0dXJuIFZPSURfRlVOQ1RJT05fU1RSSU5HOwotVXBkYXRlV2luZG93fFVXCQl5eWx2YWwgPSBNQUNST19VcGRhdGVXaW5kb3c7CQlyZXR1cm4gVk9JRF9GVU5DVElPTl8yU1RSSU5HOworUG9wdXBDb250ZXh0fFBDCQl5eWx2YWwgPSAoWVlTVFlQRSlNQUNST19Qb3B1cENvbnRleHQ7CQlyZXR1cm4gVk9JRF9GVU5DVElPTl9TVFJJTkdfVUlOVDsKK1BvcHVwSGFzaAkJeXlsdmFsID0gKFlZU1RZUEUpTUFDUk9fUG9wdXBIYXNoOwkJcmV0dXJuIFZPSURfRlVOQ1RJT05fU1RSSU5HX1VJTlQ7CitQb3B1cElkfFBJCQl5eWx2YWwgPSAoWVlTVFlQRSlNQUNST19Qb3B1cElkOwkJCXJldHVybiBWT0lEX0ZVTkNUSU9OXzJTVFJJTkc7CitQb3NpdGlvbldpbmRvd3xQVwl5eWx2YWwgPSAoWVlTVFlQRSlNQUNST19Qb3NpdGlvbldpbmRvdzsJCXJldHVybiBWT0lEX0ZVTkNUSU9OXzJJTlRfM1VJTlRfU1RSSU5HOworUHJldgkJCXl5bHZhbCA9IChZWVNUWVBFKU1BQ1JPX1ByZXY7CQkJcmV0dXJuIFZPSURfRlVOQ1RJT05fVk9JRDsKK1ByaW50CQkJeXlsdmFsID0gKFlZU1RZUEUpTUFDUk9fUHJpbnQ7CQkJcmV0dXJuIFZPSURfRlVOQ1RJT05fVk9JRDsKK1ByaW50ZXJTZXR1cAkJeXlsdmFsID0gKFlZU1RZUEUpTUFDUk9fUHJpbnRlclNldHVwOwkJcmV0dXJuIFZPSURfRlVOQ1RJT05fVk9JRDsKK1JlZ2lzdGVyUm91dGluZXxSUgl5eWx2YWwgPSAoWVlTVFlQRSlNQUNST19SZWdpc3RlclJvdXRpbmU7CQlyZXR1cm4gVk9JRF9GVU5DVElPTl8zU1RSSU5HOworUmVtb3ZlQWNjZWxlcmF0b3J8UkEJeXlsdmFsID0gKFlZU1RZUEUpTUFDUk9fUmVtb3ZlQWNjZWxlcmF0b3I7CXJldHVybiBWT0lEX0ZVTkNUSU9OXzJVSU5UOworUmVzZXRNZW51CQl5eWx2YWwgPSAoWVlTVFlQRSlNQUNST19SZXNldE1lbnU7CQlyZXR1cm4gVk9JRF9GVU5DVElPTl9WT0lEOworU2F2ZU1hcmsJCXl5bHZhbCA9IChZWVNUWVBFKU1BQ1JPX1NhdmVNYXJrOwkJcmV0dXJuIFZPSURfRlVOQ1RJT05fU1RSSU5HOworU2VhcmNoCQkJeXlsdmFsID0gKFlZU1RZUEUpTUFDUk9fU2VhcmNoOwkJCXJldHVybiBWT0lEX0ZVTkNUSU9OX1ZPSUQ7CitTZXRDb250ZW50cwkJeXlsdmFsID0gKFlZU1RZUEUpTUFDUk9fU2V0Q29udGVudHM7CQlyZXR1cm4gVk9JRF9GVU5DVElPTl9TVFJJTkdfVUlOVDsKK1NldEhlbHBPbkZpbGUJCXl5bHZhbCA9IChZWVNUWVBFKU1BQ1JPX1NldEhlbHBPbkZpbGU7CQlyZXR1cm4gVk9JRF9GVU5DVElPTl9TVFJJTkc7CitTZXRQb3B1cENvbG9yfFNQQwl5eWx2YWwgPSAoWVlTVFlQRSlNQUNST19TZXRQb3B1cENvbG9yOwkJcmV0dXJuIFZPSURfRlVOQ1RJT05fM1VJTlQ7CitTaGVsbEV4ZWN1dGV8U0UJCXl5bHZhbCA9IChZWVNUWVBFKU1BQ1JPX1NoZWxsRXhlY3V0ZTsJCXJldHVybiBWT0lEX0ZVTkNUSU9OXzJTVFJJTkdfMlVJTlRfMlNUUklORzsKK1Nob3J0Q3V0fFNICQl5eWx2YWwgPSAoWVlTVFlQRSlNQUNST19TaG9ydEN1dDsJCXJldHVybiBWT0lEX0ZVTkNUSU9OXzJTVFJJTkdfV1BBUkFNX0xQQVJBTV9TVFJJTkc7CitUQ2FyZAkJCXl5bHZhbCA9IChZWVNUWVBFKU1BQ1JPX1RDYXJkOwkJCXJldHVybiBWT0lEX0ZVTkNUSU9OX1VJTlQ7CitUZXN0CQkJeXlsdmFsID0gKFlZU1RZUEUpTUFDUk9fVGVzdDsJCQlyZXR1cm4gVk9JRF9GVU5DVElPTl9VSU5UOworVGVzdEFMaW5rCQl5eWx2YWwgPSAoWVlTVFlQRSlNQUNST19UZXN0QUxpbms7CQlyZXR1cm4gQk9PTF9GVU5DVElPTl9TVFJJTkc7CitUZXN0S0xpbmsJCXl5bHZhbCA9IChZWVNUWVBFKU1BQ1JPX1Rlc3RLTGluazsJCXJldHVybiBCT09MX0ZVTkNUSU9OX1NUUklORzsKK1VuY2hlY2tJdGVtfFVJCQl5eWx2YWwgPSAoWVlTVFlQRSlNQUNST19VbmNoZWNrSXRlbTsJCXJldHVybiBWT0lEX0ZVTkNUSU9OX1NUUklORzsKK1VwZGF0ZVdpbmRvd3xVVwkJeXlsdmFsID0gKFlZU1RZUEUpTUFDUk9fVXBkYXRlV2luZG93OwkJcmV0dXJuIFZPSURfRlVOQ1RJT05fMlNUUklORzsKIAogWy0rXT9bMC05XSsJCXl5bHZhbC5pbnRlZ2VyID0gc3RydG9sKHl5dGV4dCwgTlVMTCwgMTApOwlyZXR1cm4gSU5URUdFUjsKIFstK10/MFt4WF1bMC05YS1mXSsJeXlsdmFsLmludGVnZXIgPSBzdHJ0b2woeXl0ZXh0LCBOVUxMLCAxNik7CXJldHVybiBJTlRFR0VSOwpAQCAtMTI0LDcgKzEyNCw3IEBACiAJCQkgICAgICBoU3RyaW5nQnVmZmVyID0gR2xvYmFsQWxsb2MoR01FTV9GSVhFRCwgc3RybGVuKG1hY3JvcHRyKSk7CiAJCQkgICAgICBzdHJwdHIgPSBHbG9iYWxMb2NrKGhTdHJpbmdCdWZmZXIpOwogCQkJICAgIH0KLQkJCSAgeXlsdmFsID0gc3RycHRyOworCQkJICB5eWx2YWwgPSAoWVlTVFlQRSlzdHJwdHI7CiAJCQkgIEJFR0lOICh5eXRleHRbMF0gPT0gJ2AnID8gcXVvdGUgOiBkcXVvdGUpOwogCQkJfQogCmRpZmYgLS1naXQgYS9yZWxheTMyL2FkdmFwaTMyLnNwZWMgYi9yZWxheTMyL2FkdmFwaTMyLnNwZWMKaW5kZXggYTUzYTk1NS4uN2MyZWRjYyAxMDA2NDQKLS0tIGEvcmVsYXkzMi9hZHZhcGkzMi5zcGVjCisrKyBiL3JlbGF5MzIvYWR2YXBpMzIuc3BlYwpAQCAtMjAxLDMgKzIwMSw2NyBAQAogMDE5NyBzdGRjYWxsIFN0YXJ0U2VydmljZUN0cmxEaXNwYXRjaGVyVyhwdHIpIFN0YXJ0U2VydmljZUN0cmxEaXNwYXRjaGVyMzJXCiAwMTk4IHN0dWIgU3RhcnRTZXJ2aWNlVwogMDE5OSBzdHViIFVubG9ja1NlcnZpY2VEYXRhYmFzZQorMDIwMCBzdHViIExzYU9wZW5Qb2xpY3kKKzAyMDEgc3R1YiBMc2FMb29rdXBTaWRzCiswMjAyIHN0dWIgTHNhRnJlZU1lbW9yeQorMDIwMyBzdHViIExzYVF1ZXJ5SW5mb3JtYXRpb25Qb2xpY3kKKzAyMDQgc3R1YiBMc2FDbG9zZQorMDIwNSBzdHViIExzYVNldEluZm9ybWF0aW9uUG9saWN5CiswMjA2IHN0dWIgTHNhTG9va3VwTmFtZXMKKzAyMDcgc3R1YiBTeXN0ZW1GdW5jdGlvbjAwMQorMDIwOCBzdHViIFN5c3RlbUZ1bmN0aW9uMDAyCiswMjA5IHN0dWIgU3lzdGVtRnVuY3Rpb24wMDMKKzAyMTAgc3R1YiBTeXN0ZW1GdW5jdGlvbjAwNAorMDIxMSBzdHViIFN5c3RlbUZ1bmN0aW9uMDA1CiswMjEyIHN0dWIgU3lzdGVtRnVuY3Rpb24wMDYKKzAyMTMgc3R1YiBTeXN0ZW1GdW5jdGlvbjAwNworMDIxNCBzdHViIFN5c3RlbUZ1bmN0aW9uMDA4CiswMjE1IHN0dWIgU3lzdGVtRnVuY3Rpb24wMDkKKzAyMTYgc3R1YiBTeXN0ZW1GdW5jdGlvbjAxMAorMDIxNyBzdHViIFN5c3RlbUZ1bmN0aW9uMDExCiswMjE4IHN0dWIgU3lzdGVtRnVuY3Rpb24wMTIKKzAyMTkgc3R1YiBTeXN0ZW1GdW5jdGlvbjAxMworMDIyMCBzdHViIFN5c3RlbUZ1bmN0aW9uMDE0CiswMjIxIHN0dWIgU3lzdGVtRnVuY3Rpb24wMTUKKzAyMjIgc3R1YiBTeXN0ZW1GdW5jdGlvbjAxNgorMDIyMyBzdHViIFN5c3RlbUZ1bmN0aW9uMDE3CiswMjI0IHN0dWIgU3lzdGVtRnVuY3Rpb24wMTgKKzAyMjUgc3R1YiBTeXN0ZW1GdW5jdGlvbjAxOQorMDIyNiBzdHViIFN5c3RlbUZ1bmN0aW9uMDIwCiswMjI3IHN0dWIgU3lzdGVtRnVuY3Rpb24wMjEKKzAyMjggc3R1YiBTeXN0ZW1GdW5jdGlvbjAyMgorMDIyOSBzdHViIFN5c3RlbUZ1bmN0aW9uMDIzCiswMjMwIHN0dWIgU3lzdGVtRnVuY3Rpb24wMjQKKzAyMzEgc3R1YiBTeXN0ZW1GdW5jdGlvbjAyNQorMDIzMiBzdHViIFN5c3RlbUZ1bmN0aW9uMDI2CiswMjMzIHN0dWIgU3lzdGVtRnVuY3Rpb24wMjcKKzAyMzQgc3R1YiBTeXN0ZW1GdW5jdGlvbjAyOAorMDIzNSBzdHViIFN5c3RlbUZ1bmN0aW9uMDI5CiswMjM2IHN0dWIgU3lzdGVtRnVuY3Rpb24wMzAKKzAyMzcgc3R1YiBMc2FRdWVyeUluZm9UcnVzdGVkRG9tYWluCiswMjM4IHN0dWIgTHNhUXVlcnlTZWNyZXQKKzAyMzkgc3R1YiBMc2FDcmVhdGVTZWNyZXQKKzAyNDAgc3R1YiBMc2FPcGVuU2VjcmV0CiswMjQxIHN0dWIgTHNhQ3JlYXRlVHJ1c3RlZERvbWFpbgorMDI0MiBzdHViIExzYU9wZW5UcnVzdGVkRG9tYWluCiswMjQzIHN0dWIgTHNhU2V0U2VjcmV0CiswMjQ0IHN0dWIgTHNhUXVlcnlTZWNyZXQKKzAyNDUgc3R1YiBMc2FDcmVhdGVBY2NvdW50CiswMjQ2IHN0dWIgTHNhQWRkUHJpdmlsZWdlc1RvQWNjb3VudAorMDI0NyBzdHViIExzYVJlbW92ZVByaXZpbGVnZXNGcm9tQWNjb3VudAorMDI0OCBzdHViIExzYURlbGV0ZQorMDI0OSBzdHViIExzYVNldFN5c3RlbUFjY2Vzc0FjY291bnQKKzAyNTAgc3R1YiBMc2FFbnVtZXJhdGVQcml2aWxlZ2VzT2ZBY2NvdW50CiswMjUxIHN0dWIgTHNhRW51bWVyYXRlQWNjb3VudHMKKzAyNTIgc3R1YiBMc2FPcGVuVHJ1c3RlZERvbWFpbgorMDI1MyBzdHViIExzYUdldFN5c3RlbUFjY2Vzc0FjY291bnQKKzAyNTQgc3R1YiBMc2FTZXRJbmZvcm1hdGlvblRydXN0ZWREb21haW4KKzAyNTUgc3R1YiBMc2FFbnVtZXJhdGVUcnVzdGVkRG9tYWlucworMDI1NiBzdHViIExzYU9wZW5BY2NvdW50CiswMjU3IHN0dWIgTHNhRW51bWVyYXRlUHJpdmlsZWdlcworMDI1OCBzdHViIExzYUxvb2t1cFByaXZpbGVnZURpc3BsYXlOYW1lCiswMjU5IHN0dWIgTHNhSUNMb29rdXBOYW1lcworMDI2MCBzdHViIEVsZlJlZ2lzdGVyRXZlbnRTb3VyY2VXCiswMjYxIHN0dWIgRWxmUmVwb3J0RXZlbnRXCiswMjYyIHN0dWIgRWxmRGVyZWdpc3RlckV2ZW50U291cmNlCiswMjYzIHN0dWIgRWxmRGVyZWdpc3RlckV2ZW50U291cmNlVwpkaWZmIC0tZ2l0IGEvcmVsYXkzMi9idWlsdGluMzIuYyBiL3JlbGF5MzIvYnVpbHRpbjMyLmMKaW5kZXggYzFjNzgwMy4uZDEyNDA5MyAxMDA2NDQKLS0tIGEvcmVsYXkzMi9idWlsdGluMzIuYworKysgYi9yZWxheTMyL2J1aWx0aW4zMi5jCkBAIC0xMSw3ICsxMSw2IEBACiAjaW5jbHVkZSAibW9kdWxlLmgiCiAjaW5jbHVkZSAidGFzay5oIgogI2luY2x1ZGUgInByb2Nlc3MuaCIKLSNpbmNsdWRlICJzdGRkZWJ1Zy5oIgogI2luY2x1ZGUgImRlYnVnLmgiCiAKIHR5cGVkZWYgc3RydWN0CkBAIC03Myw3ICs3Miw3IEBACiAgICAgeyAmQ09NQ1RMMzJfRGVzY3JpcHRvciwgTlVMTCwgRkFMU0UgfSwKICAgICB7ICZDT01ETEczMl9EZXNjcmlwdG9yLCBOVUxMLCBUUlVFICB9LAogICAgIHsgJkNSVERMTF9EZXNjcmlwdG9yLCAgIE5VTEwsIFRSVUUgIH0sCi0gICAgeyAmRENJTUFOMzJfRGVzY3JpcHRvciwgTlVMTCwgVFJVRSAgfSwKKyAgICB7ICZEQ0lNQU4zMl9EZXNjcmlwdG9yLCBOVUxMLCBGQUxTRSB9LAogICAgIHsgJkREUkFXX0Rlc2NyaXB0b3IsICAgIE5VTEwsIFRSVUUgIH0sCiAgICAgeyAmRElOUFVUX0Rlc2NyaXB0b3IsICAgTlVMTCwgVFJVRSAgfSwKICAgICB7ICZEUExBWV9EZXNjcmlwdG9yLCAgICBOVUxMLCBUUlVFICB9LApAQCAtODIsMTkgKzgxLDE5IEBACiAgICAgeyAmS0VSTkVMMzJfRGVzY3JpcHRvciwgTlVMTCwgVFJVRSAgfSwKICAgICB7ICZMWjMyX0Rlc2NyaXB0b3IsICAgICBOVUxMLCBUUlVFICB9LAogICAgIHsgJk1QUl9EZXNjcmlwdG9yLCAgICAgIE5VTEwsIFRSVUUgIH0sCi0gICAgeyAmTVNWRlczMl9EZXNjcmlwdG9yLCAgTlVMTCwgVFJVRSAgfSwKKyAgICB7ICZNU1ZGVzMyX0Rlc2NyaXB0b3IsICBOVUxMLCBGQUxTRSB9LAogICAgIHsgJk5URExMX0Rlc2NyaXB0b3IsICAgIE5VTEwsIFRSVUUgIH0sCiAgICAgeyAmT0xFMzJfRGVzY3JpcHRvciwgICAgTlVMTCwgRkFMU0UgfSwKICAgICB7ICZPTEVDTEkzMl9EZXNjcmlwdG9yLCBOVUxMLCBGQUxTRSB9LAogICAgIHsgJk9MRVNWUjMyX0Rlc2NyaXB0b3IsIE5VTEwsIEZBTFNFIH0sCiAgICAgeyAmU0hFTEwzMl9EZXNjcmlwdG9yLCAgTlVMTCwgVFJVRSAgfSwKLSAgICB7ICZUQVBJMzJfRGVzY3JpcHRvciwgICBOVUxMLCBUUlVFICB9LAorICAgIHsgJlRBUEkzMl9EZXNjcmlwdG9yLCAgIE5VTEwsIEZBTFNFIH0sCiAgICAgeyAmVVNFUjMyX0Rlc2NyaXB0b3IsICAgTlVMTCwgVFJVRSAgfSwKICAgICB7ICZWRVJTSU9OX0Rlc2NyaXB0b3IsICBOVUxMLCBUUlVFICB9LAogICAgIHsgJlczMlNLUk5MX0Rlc2NyaXB0b3IsIE5VTEwsIFRSVUUgIH0sCiAgICAgeyAmV0lOTU1fRGVzY3JpcHRvciwgICAgTlVMTCwgVFJVRSAgfSwKICAgICB7ICZXSU5TUE9PTF9EZXNjcmlwdG9yLCBOVUxMLCBUUlVFICB9LAotICAgIHsgJldPVzMyX0Rlc2NyaXB0b3IsICAgIE5VTEwsIFRSVUUgIH0sCisgICAgeyAmV09XMzJfRGVzY3JpcHRvciwgICAgTlVMTCwgRkFMU0UgfSwKICAgICB7ICZXU09DSzMyX0Rlc2NyaXB0b3IsICBOVUxMLCBUUlVFICB9LAogICAgIC8qIExhc3QgZW50cnkgKi8KICAgICB7IE5VTEwsIE5VTEwsIEZBTFNFIH0KQEAgLTEzNyw3ICsxMzYsNyBAQAogICAgICAgICAgICAgKyBkbGwtPmRlc2NyLT5uYl9uYW1lcyAqIHNpemVvZihMUFNUUikKICAgICAgICAgICAgICsgZGxsLT5kZXNjci0+bmJfcmVnX2Z1bmNzICogc2l6ZW9mKFJFR19FTlRSWV9QT0lOVCkpOwogI2lmZGVmIF9faTM4Nl9fCi0gICAgaWYgKGRlYnVnZ2luZ19yZWxheSkKKyAgICBpZiAoZGVidWdnaW5nX2luZm8ocmVsYXkpKQogICAgICAgICBzaXplICs9IGRsbC0+ZGVzY3ItPm5iX2Z1bmNzICogc2l6ZW9mKERFQlVHX0VOVFJZX1BPSU5UKTsKICNlbmRpZgogICAgIGFkZHIgID0gVmlydHVhbEFsbG9jKCBOVUxMLCBzaXplLCBNRU1fQ09NTUlULCBQQUdFX0VYRUNVVEVfUkVBRFdSSVRFICk7CkBAIC0yMDIsNyArMjAxLDcgQEAKICAgICBzdHJjcHkoIHNlYy0+TmFtZSwgIi5jb2RlIiApOwogICAgIHNlYy0+U2l6ZU9mUmF3RGF0YSA9IGRsbC0+ZGVzY3ItPm5iX3JlZ19mdW5jcyAqIHNpemVvZihSRUdfRU5UUllfUE9JTlQpOwogI2lmZGVmIF9faTM4Nl9fCi0gICAgaWYgKGRlYnVnZ2luZ19yZWxheSkKKyAgICBpZiAoZGVidWdnaW5nX2luZm8ocmVsYXkpKQogICAgICAgICBzZWMtPlNpemVPZlJhd0RhdGEgKz0gZGxsLT5kZXNjci0+bmJfZnVuY3MgKiBzaXplb2YoREVCVUdfRU5UUllfUE9JTlQpOwogI2VuZGlmCiAgICAgc2VjLT5NaXNjLlZpcnR1YWxTaXplID0gc2VjLT5TaXplT2ZSYXdEYXRhOwpAQCAtMjIzLDcgKzIyMiw3IEBACiAKICAgICAvKiBCdWlsZCB0aGUgZnVuY3MgdGFibGUgKi8KIAotICAgIGlmIChkZWJ1Z2dpbmdfcmVsYXkpIGRsbC0+ZGJnX2Z1bmNzID0gZGVidWc7CisgICAgaWYgKGRlYnVnZ2luZ19pbmZvKHJlbGF5KSkgZGxsLT5kYmdfZnVuY3MgPSBkZWJ1ZzsKICAgICBmb3IgKGkgPSAwOyBpIDwgZGxsLT5kZXNjci0+bmJfZnVuY3M7IGkrKywgZnVuY3MrKywgZGVidWcrKykKICAgICB7CiAgICAgICAgIEJZVEUgYXJncyA9IGRsbC0+ZGVzY3ItPmFyZ3NbaV07CkBAIC0yMzcsNyArMjM2LDcgQEAKICAgICAgICAgICAgIHJlZ3MtPmptcCAgICAgICAgID0gMHhlOTsKICAgICAgICAgICAgIHJlZ3MtPmNhbGwzMl9yZWdzID0gKERXT1JEKUNBTEwzMl9SZWdzIC0gKERXT1JEKSZyZWdzLT5ub3A7CiAgICAgICAgICAgICByZWdzLT5ub3AgICAgICAgICA9IDB4OTA5MDsKLSAgICAgICAgICAgIGlmIChkZWJ1Z2dpbmdfcmVsYXkpCisgICAgICAgICAgICBpZiAoZGVidWdnaW5nX2luZm8ocmVsYXkpKQogICAgICAgICAgICAgewogICAgICAgICAgICAgICAgIGRlYnVnLT5jYWxsICAgICAgID0gMHhlODsKICAgICAgICAgICAgICAgICBkZWJ1Zy0+Y2FsbGZyb20zMiA9IChEV09SRClyZWdzIC0gKERXT1JEKSZkZWJ1Zy0+cmV0OwpAQCAtMjUyLDcgKzI1MSw3IEBACiAgICAgICAgICAgICAqZnVuY3MgPSAoTFBWT0lEKSgoQllURSAqKWRsbC0+ZGVzY3ItPmZ1bmN0aW9uc1tpXSAtIGFkZHIpOwogICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgIGRlZmF1bHQ6ICAvKiBub3JtYWwgZnVuY3Rpb24gKHN0ZGNhbGwgb3IgY2RlY2wpICovCi0gICAgICAgICAgICBpZiAoZGVidWdnaW5nX3JlbGF5KQorICAgICAgICAgICAgaWYgKGRlYnVnZ2luZ19pbmZvKHJlbGF5KSkKICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICBkZWJ1Zy0+Y2FsbCAgICAgICA9IDB4ZTg7CiAgICAgICAgICAgICAgICAgZGVidWctPmNhbGxmcm9tMzIgPSAoRFdPUkQpUkVMQVlfQ2FsbEZyb20zMiAtCmRpZmYgLS1naXQgYS9yZWxheTMyL2NydGRsbC5zcGVjIGIvcmVsYXkzMi9jcnRkbGwuc3BlYwppbmRleCBmMWM4OTcyLi5iODBlOWZjIDEwMDY0NAotLS0gYS9yZWxheTMyL2NydGRsbC5zcGVjCisrKyBiL3JlbGF5MzIvY3J0ZGxsLnNwZWMKQEAgLTUyLDcgKzUyLDcgQEAKICA0OCBzdHViIF9jYWJzCiAgNDkgY2RlY2wgX2NleGl0KGxvbmcpIENSVERMTF9fY2V4aXQKICA1MCBzdHViIF9jZ2V0cwotIDUxIGNkZWNsIF9jaGRpcihwdHIpIENSVERMTF9fY2hkaXIKKyA1MSBjZGVjbCBfY2hkaXIoc3RyKSBDUlRETExfX2NoZGlyCiAgNTIgY2RlY2wgX2NoZHJpdmUobG9uZykgQ1JURExMX19jaGRyaXZlCiAgNTMgc3R1YiBfY2hnc2lnbgogIDU0IHN0dWIgX2NobW9kCkBAIC0xMTUsNyArMTE1LDcgQEAKIDExMSBzdHViIF9mc3RhdAogMTEyIHN0dWIgX2Z0aW1lCiAxMTMgY2RlY2wgX2Z0b2woZG91YmxlKSBDUlRETExfX2Z0b2wKLTExNCBjZGVjbCBfZnVsbHBhdGgocHRyIHB0ciBsb25nKSBDUlRETExfX2Z1bGxwYXRoCisxMTQgY2RlY2wgX2Z1bGxwYXRoKHB0ciBzdHIgbG9uZykgQ1JURExMX19mdWxscGF0aAogMTE1IHN0dWIgX2Z1dGltZQogMTE2IHN0dWIgX2djdnQKIDExNyBzdHViIF9nZXRfb3NmaGFuZGxlCkBAIC0xOTgsMTUgKzE5OCwxNSBAQAogMTk0IHN0dWIgX21iY3RvdXBwZXIKIDE5NSBzdHViIF9tYmN0eXBlCiAxOTYgc3R1YiBfbWJzYnR5cGUKLTE5NyBjZGVjbCBfbWJzY2F0KHB0ciBwdHIpIENSVERMTF9fbWJzY2F0CisxOTcgY2RlY2wgX21ic2NhdChzdHIgc3RyKSBDUlRETExfX21ic2NhdAogMTk4IHN0dWIgX21ic2NocgogMTk5IHN0dWIgX21ic2NtcAotMjAwIGNkZWNsIF9tYnNjcHkocHRyIHB0cikgQ1JURExMX19tYnNjcHkKKzIwMCBjZGVjbCBfbWJzY3B5KHB0ciBzdHIpIENSVERMTF9fbWJzY3B5CiAyMDEgc3R1YiBfbWJzY3NwbgogMjAyIHN0dWIgX21ic2RlYwogMjAzIHN0dWIgX21ic2R1cAotMjA0IGNkZWNsIF9tYnNpY21wKHB0ciBwdHIpIENSVERMTF9fbWJzaWNtcAotMjA1IGNkZWNsIF9tYnNpbmMocHRyKSBDUlRETExfX21ic2luYworMjA0IGNkZWNsIF9tYnNpY21wKHN0ciBzdHIpIENSVERMTF9fbWJzaWNtcAorMjA1IGNkZWNsIF9tYnNpbmMoc3RyKSBDUlRETExfX21ic2luYwogMjA2IHN0dWIgX21ic2xlbgogMjA3IHN0dWIgX21ic2x3cgogMjA4IHN0dWIgX21ic25iY2F0CkBAIC0yMzUsMTIgKzIzNSwxMiBAQAogMjMxIHN0dWIgX21ic3VwcgogMjMyIHN0dWIgX21lbWNjcHkKIDIzMyBzdHViIF9tZW1pY21wCi0yMzQgY2RlY2wgX21rZGlyKHB0cikgQ1JURExMX19ta2RpcgorMjM0IGNkZWNsIF9ta2RpcihzdHIpIENSVERMTF9fbWtkaXIKIDIzNSBzdHViIF9ta3RlbXAKIDIzNiBzdHViIF9tc2l6ZQogMjM3IHN0dWIgX25leHRhZnRlcgogMjM4IHN0dWIgX29uZXhpdAotMjM5IGNkZWNsIF9vcGVuKHB0ciBsb25nKSBDUlRETExfX29wZW4KKzIzOSBjZGVjbCBfb3BlbihzdHIgbG9uZykgQ1JURExMX19vcGVuCiAyNDAgY2RlY2wgX29wZW5fb3NmaGFuZGxlKGxvbmcgbG9uZykgQ1JURExMX19vcGVuX29zZmhhbmRsZQogMjQxIGV4dGVybiBfb3NtYWpvcl9kbGwgQ1JURExMX29zbWFqb3JfZGxsCiAyNDIgZXh0ZXJuIF9vc21pbm9yX2RsbCBDUlRETExfb3NtaW5vcl9kbGwKQEAgLTI4MCwzMyArMjgwLDMzIEBACiAyNzYgc3R1YiBfc3Bhd252ZQogMjc3IHN0dWIgX3NwYXdudnAKIDI3OCBzdHViIF9zcGF3bnZwZQotMjc5IGNkZWNsIF9zcGxpdHBhdGggKHB0ciBwdHIgcHRyIHB0ciBwdHIpIENSVERMTF9fc3BsaXRwYXRoCi0yODAgY2RlY2wgX3N0YXQgKHB0ciBwdHIpIENSVERMTF9fc3RhdAorMjc5IGNkZWNsIF9zcGxpdHBhdGggKHN0ciBwdHIgcHRyIHB0ciBwdHIpIENSVERMTF9fc3BsaXRwYXRoCisyODAgY2RlY2wgX3N0YXQgKHN0ciBwdHIpIENSVERMTF9fc3RhdAogMjgxIHN0dWIgX3N0YXR1c2ZwCi0yODIgY2RlY2wgX3N0cmNtcGkocHRyIHB0cikgQ1JURExMX19zdHJjbXBpCisyODIgY2RlY2wgX3N0cmNtcGkoc3RyIHN0cikgQ1JURExMX19zdHJjbXBpCiAyODMgc3R1YiBfc3RyZGF0ZQogMjg0IHN0dWIgX3N0cmRlYwotMjg1IGNkZWNsIF9zdHJkdXAocHRyKSBDUlRETExfX3N0cmR1cAorMjg1IGNkZWNsIF9zdHJkdXAoc3RyKSBDUlRETExfX3N0cmR1cAogMjg2IHN0dWIgX3N0cmVycm9yCi0yODcgY2RlY2wgX3N0cmljbXAocHRyIHB0cikgQ1JURExMX19zdHJjbXBpCisyODcgY2RlY2wgX3N0cmljbXAoc3RyIHN0cikgQ1JURExMX19zdHJjbXBpCiAyODggc3R1YiBfc3RyaWNvbGwKIDI4OSBzdHViIF9zdHJpbmMKLTI5MCBjZGVjbCBfc3RybHdyKHB0cikgQ1JURExMX19zdHJsd3IKKzI5MCBjZGVjbCBfc3RybHdyKHN0cikgQ1JURExMX19zdHJsd3IKIDI5MSBzdHViIF9zdHJuY250CiAyOTIgc3R1YiBfc3RybmV4dGMKLTI5MyBjZGVjbCBfc3RybmljbXAocHRyIHB0ciBsb25nKSBDUlRETExfX3N0cm5pY21wCisyOTMgY2RlY2wgX3N0cm5pY21wKHN0ciBzdHIgbG9uZykgQ1JURExMX19zdHJuaWNtcAogMjk0IHN0dWIgX3N0cm5pbmMKIDI5NSBzdHViIF9zdHJuc2V0CiAyOTYgc3R1YiBfc3RycmV2CiAyOTcgc3R1YiBfc3Ryc2V0CiAyOTggc3R1YiBfc3Ryc3BucAogMjk5IHN0dWIgX3N0cnRpbWUKLTMwMCBjZGVjbCBfc3RydXByKHB0cikgQ1JURExMX19zdHJ1cHIKKzMwMCBjZGVjbCBfc3RydXByKHN0cikgQ1JURExMX19zdHJ1cHIKIDMwMSBzdHViIF9zd2FiCiAzMDIgc3R1YiBfc3lzX2Vycmxpc3QKIDMwMyBzdHViIF9zeXNfbmVycl9kbGwKIDMwNCBzdHViIF90ZWxsCi0zMDUgY2RlY2wgX3RlbXBuYW0ocHRyIHB0cikgQ1JURExMX190ZW1wbmFtCiszMDUgY2RlY2wgX3RlbXBuYW0oc3RyIHB0cikgQ1JURExMX190ZW1wbmFtCiAzMDYgc3R1YiBfdGltZXpvbmVfZGxsCiAzMDcgc3R1YiBfdG9sb3dlcgogMzA4IHN0dWIgX3RvdXBwZXIKQEAgLTMxNiwyMCArMzE2LDIwIEBACiAzMTIgc3R1YiBfdWx0b3cKIDMxMyBzdHViIF91bWFzawogMzE0IHN0dWIgX3VuZ2V0Y2gKLTMxNSBjZGVjbCBfdW5saW5rKHB0cikgQ1JURExMX191bmxpbmsKKzMxNSBjZGVjbCBfdW5saW5rKHN0cikgQ1JURExMX191bmxpbmsKIDMxNiBzdHViIF91bmxvYWRkbGwKIDMxNyBzdHViIF91dGltZQogMzE4IHN0dWIgX3ZzbnByaW50ZgogMzE5IHN0dWIgX3ZzbndwcmludGYKIDMyMCBzdHViIF93Y3NkdXAKLTMyMSBjZGVjbCBfd2NzaWNtcChwdHIgcHRyKSBDUlRETExfX3djc2ljbXAKLTMyMiBjZGVjbCBfd2NzaWNvbGwocHRyIHB0cikgQ1JURExMX193Y3NpY29sbAotMzIzIGNkZWNsIF93Y3Nsd3IocHRyKSBDUlRETExfX3djc2x3cgotMzI0IGNkZWNsIF93Y3NuaWNtcChwdHIgcHRyIGxvbmcpIENSVERMTF9fd2NzbmljbXAKKzMyMSBjZGVjbCBfd2NzaWNtcCh3c3RyIHdzdHIpIENSVERMTF9fd2NzaWNtcAorMzIyIGNkZWNsIF93Y3NpY29sbCh3c3RyIHdzdHIpIENSVERMTF9fd2NzaWNvbGwKKzMyMyBjZGVjbCBfd2NzbHdyKHdzdHIpIENSVERMTF9fd2NzbHdyCiszMjQgY2RlY2wgX3djc25pY21wKHdzdHIgd3N0ciBsb25nKSBDUlRETExfX3djc25pY21wCiAzMjUgc3R1YiBfd2NzbnNldAotMzI2IGNkZWNsIF93Y3NyZXYocHRyKSBDUlRETExfX3djc3JldgorMzI2IGNkZWNsIF93Y3NyZXYod3N0cikgQ1JURExMX193Y3NyZXYKIDMyNyBzdHViIF93Y3NzZXQKLTMyOCBjZGVjbCBfd2NzdXByKHB0cikgQ1JURExMX193Y3N1cHIKKzMyOCBjZGVjbCBfd2NzdXByKHdzdHIpIENSVERMTF9fd2NzdXByCiAzMjkgZXh0ZXJuIF93aW5tYWpvcl9kbGwgQ1JURExMX3dpbm1ham9yX2RsbAogMzMwIGV4dGVybiBfd2lubWlub3JfZGxsIENSVERMTF93aW5taW5vcl9kbGwKIDMzMSBleHRlcm4gX3dpbnZlcl9kbGwgQ1JURExMX3dpbnZlcl9kbGwKQEAgLTM0Nyw5ICszNDcsOSBAQAogMzQzIGNkZWNsIGF0YW4oZG91YmxlKSBhdGFuCiAzNDQgY2RlY2wgYXRhbjIoZG91YmxlIGRvdWJsZSkgYXRhbjIKIDM0NSBjZGVjbCBhdGV4aXQocHRyKSBDUlRETExfYXRleGl0Ci0zNDYgY2RlY2wgYXRvZihwdHIpIGF0b2YKLTM0NyBjZGVjbCBhdG9pKHB0cikgYXRvaQotMzQ4IGNkZWNsIGF0b2wocHRyKSBhdG9sCiszNDYgY2RlY2wgYXRvZihzdHIpIGF0b2YKKzM0NyBjZGVjbCBhdG9pKHN0cikgYXRvaQorMzQ4IGNkZWNsIGF0b2woc3RyKSBhdG9sCiAzNDkgc3R1YiBic2VhcmNoCiAzNTAgY2RlY2wgY2FsbG9jKGxvbmcgbG9uZykgQ1JURExMX2NhbGxvYwogMzUxIHN0dWIgY2VpbApAQCAtMzczLDEwICszNzMsMTAgQEAKIDM2OSBzdHViIGZnZXR3YwogMzcwIGNkZWNsIGZsb29yKGRvdWJsZSkgZmxvb3IKIDM3MSBjZGVjbCBmbW9kKGRvdWJsZSBkb3VibGUpIGZtb2QKLTM3MiBjZGVjbCBmb3BlbihwdHIgcHRyKSBDUlRETExfZm9wZW4KKzM3MiBjZGVjbCBmb3BlbihzdHIgc3RyKSBDUlRETExfZm9wZW4KIDM3MyB2YXJhcmdzIGZwcmludGYoKSBDUlRETExfZnByaW50ZgogMzc0IGNkZWNsIGZwdXRjKGxvbmcgcHRyKSBDUlRETExfZnB1dGMKLTM3NSBjZGVjbCBmcHV0cyhwdHIgcHRyKSBDUlRETExfZnB1dHMKKzM3NSBjZGVjbCBmcHV0cyhzdHIgcHRyKSBDUlRETExfZnB1dHMKIDM3NiBzdHViIGZwdXR3YwogMzc3IGNkZWNsIGZyZWFkKHB0ciBsb25nIGxvbmcgcHRyKSBDUlRETExfZnJlYWQKIDM3OCBjZGVjbCBmcmVlKHB0cikgQ1JURExMX2ZyZWUKQEAgLTQyOSw4ICs0MjksOCBAQAogNDI1IGNkZWNsIGxvZzEwKGRvdWJsZSkgbG9nMTAKIDQyNiBjZGVjbCBsb25nam1wKHB0ciBsb25nKSBDUlRETExfbG9uZ2ptcAogNDI3IGNkZWNsIG1hbGxvYyhwdHIpIENSVERMTF9tYWxsb2MKLTQyOCBjZGVjbCBtYmxlbihwdHIgbG9uZykgQ1JURExMX21ibGVuCi00MjkgY2RlY2wgbWJzdG93Y3MocHRyIHB0ciBsb25nKSBDUlRETExfbWJzdG93Y3MKKzQyOCBjZGVjbCBtYmxlbihzdHIgbG9uZykgQ1JURExMX21ibGVuCis0MjkgY2RlY2wgbWJzdG93Y3MocHRyIHN0ciBsb25nKSBDUlRETExfbWJzdG93Y3MKIDQzMCBjZGVjbCBtYnRvd2MocHRyIHB0ciBsb25nKSBDUlRETExfbWJ0b3djCiA0MzEgY2RlY2wgbWVtY2hyKHB0ciBsb25nIGxvbmcpIG1lbWNocgogNDMyIGNkZWNsIG1lbWNtcChwdHIgcHRyIGxvbmcpIG1lbWNtcApAQCAtNDQ0LDcgKzQ0NCw3IEBACiA0NDAgdmFyYXJncyBwcmludGYoKSBwcmludGYKIDQ0MSBjZGVjbCBwdXRjKGxvbmcgcHRyKSBDUlRETExfcHV0YwogNDQyIGNkZWNsIHB1dGNoYXIobG9uZykgQ1JURExMX3B1dGNoYXIKLTQ0MyBjZGVjbCBwdXRzKHB0cikgQ1JURExMX3B1dHMKKzQ0MyBjZGVjbCBwdXRzKHN0cikgQ1JURExMX3B1dHMKIDQ0NCBjZGVjbCBxc29ydChwdHIgbG9uZyBsb25nIHB0cikgcXNvcnQKIDQ0NSBzdHViIHJhaXNlCiA0NDYgY2RlY2wgcmFuZCgpIENSVERMTF9yYW5kCkBAIC00NjMsNjIgKzQ2Myw2MiBAQAogNDU5IGNkZWNsIHNxcnQoZG91YmxlKSBzcXJ0CiA0NjAgY2RlY2wgc3JhbmQobG9uZykgQ1JURExMX3NyYW5kCiA0NjEgdmFyYXJncyBzc2NhbmYoKSBzc2NhbmYKLTQ2MiBjZGVjbCBzdHJjYXQocHRyIHB0cikgc3RyY2F0Ci00NjMgY2RlY2wgc3RyY2hyKHB0ciBsb25nKSBzdHJjaHIKLTQ2NCBjZGVjbCBzdHJjbXAocHRyIHB0cikgc3RyY21wCi00NjUgY2RlY2wgc3RyY29sbChwdHIgcHRyKSBzdHJjb2xsCi00NjYgY2RlY2wgc3RyY3B5KHB0ciBwdHIpIHN0cmNweQotNDY3IGNkZWNsIHN0cmNzcG4ocHRyIHB0cikgc3RyY3NwbgorNDYyIGNkZWNsIHN0cmNhdChzdHIgc3RyKSBzdHJjYXQKKzQ2MyBjZGVjbCBzdHJjaHIoc3RyIGxvbmcpIHN0cmNocgorNDY0IGNkZWNsIHN0cmNtcChzdHIgc3RyKSBzdHJjbXAKKzQ2NSBjZGVjbCBzdHJjb2xsKHN0ciBzdHIpIHN0cmNvbGwKKzQ2NiBjZGVjbCBzdHJjcHkocHRyIHN0cikgc3RyY3B5Cis0NjcgY2RlY2wgc3RyY3NwbihzdHIgc3RyKSBzdHJjc3BuCiA0Njggc3R1YiBzdHJlcnJvcgotNDY5IGNkZWNsIHN0cmZ0aW1lKHB0ciBsb25nIHB0ciBwdHIpIHN0cmZ0aW1lCi00NzAgY2RlY2wgc3RybGVuKHB0cikgc3RybGVuCi00NzEgY2RlY2wgc3RybmNhdChwdHIgcHRyIGxvbmcpIHN0cm5jYXQKLTQ3MiBjZGVjbCBzdHJuY21wKHB0ciBwdHIgbG9uZykgc3RybmNtcAotNDczIGNkZWNsIHN0cm5jcHkocHRyIHB0ciBsb25nKSBzdHJuY3B5Ci00NzQgY2RlY2wgc3RycGJyayhwdHIgcHRyKSBzdHJwYnJrCi00NzUgY2RlY2wgc3RycmNocihwdHIgbG9uZykgc3RycmNocgotNDc2IGNkZWNsIHN0cnNwbihwdHIgcHRyKSBzdHJzcG4KLTQ3NyBjZGVjbCBzdHJzdHIocHRyIHB0cikgc3Ryc3RyCi00NzggY2RlY2wgc3RydG9kKHB0ciBwdHIpIHN0cnRvZAotNDc5IGNkZWNsIHN0cnRvayhwdHIgcHRyKSBzdHJ0b2sKLTQ4MCBjZGVjbCBzdHJ0b2wocHRyIHB0ciBsb25nKSBzdHJ0b2wKLTQ4MSBjZGVjbCBzdHJ0b3VsKHB0ciBwdHIgbG9uZykgc3RydG91bAotNDgyIGNkZWNsIHN0cnhmcm0ocHRyIHB0ciBsb25nKSBzdHJ4ZnJtCis0NjkgY2RlY2wgc3RyZnRpbWUocHRyIGxvbmcgc3RyIHB0cikgc3RyZnRpbWUKKzQ3MCBjZGVjbCBzdHJsZW4oc3RyKSBzdHJsZW4KKzQ3MSBjZGVjbCBzdHJuY2F0KHN0ciBzdHIgbG9uZykgc3RybmNhdAorNDcyIGNkZWNsIHN0cm5jbXAoc3RyIHN0ciBsb25nKSBzdHJuY21wCis0NzMgY2RlY2wgc3RybmNweShwdHIgc3RyIGxvbmcpIHN0cm5jcHkKKzQ3NCBjZGVjbCBzdHJwYnJrKHN0ciBzdHIpIHN0cnBicmsKKzQ3NSBjZGVjbCBzdHJyY2hyKHN0ciBsb25nKSBzdHJyY2hyCis0NzYgY2RlY2wgc3Ryc3BuKHN0ciBzdHIpIHN0cnNwbgorNDc3IGNkZWNsIHN0cnN0cihzdHIgc3RyKSBzdHJzdHIKKzQ3OCBjZGVjbCBzdHJ0b2Qoc3RyIHB0cikgc3RydG9kCis0NzkgY2RlY2wgc3RydG9rKHN0ciBzdHIpIHN0cnRvaworNDgwIGNkZWNsIHN0cnRvbChzdHIgcHRyIGxvbmcpIHN0cnRvbAorNDgxIGNkZWNsIHN0cnRvdWwoc3RyIHB0ciBsb25nKSBzdHJ0b3VsCis0ODIgY2RlY2wgc3RyeGZybShwdHIgc3RyIGxvbmcpIHN0cnhmcm0KIDQ4MyB2YXJhcmdzIHN3cHJpbnRmKCkgd3NwcmludGYzMlcKIDQ4NCBzdHViIHN3c2NhbmYKLTQ4NSBjZGVjbCBzeXN0ZW0ocHRyKSBDUlRETExfc3lzdGVtCis0ODUgY2RlY2wgc3lzdGVtKHN0cikgQ1JURExMX3N5c3RlbQogNDg2IGNkZWNsIHRhbihkb3VibGUpIHRhbgogNDg3IGNkZWNsIHRhbmgoZG91YmxlKSB0YW5oCiA0ODggY2RlY2wgdGltZShwdHIpIENSVERMTF90aW1lCiA0ODkgc3R1YiB0bXBmaWxlCi00OTAgY2RlY2wgdG1wbmFtKHB0cikgQ1JURExMX3RtcG5hbQorNDkwIGNkZWNsIHRtcG5hbShzdHIpIENSVERMTF90bXBuYW0KIDQ5MSBjZGVjbCB0b2xvd2VyKGxvbmcpIHRvbG93ZXIKIDQ5MiBjZGVjbCB0b3VwcGVyKGxvbmcpIHRvdXBwZXIKIDQ5MyBzdHViIHRvd2xvd2VyCiA0OTQgY2RlY2wgdG93dXBwZXIobG9uZykgQ1JURExMX3Rvd3VwcGVyCiA0OTUgc3R1YiB1bmdldGMKIDQ5NiBzdHViIHVuZ2V0d2MKLTQ5NyBjZGVjbCB2ZnByaW50ZihwdHIgcHRyIHB0cikgQ1JURExMX3ZmcHJpbnRmCis0OTcgY2RlY2wgdmZwcmludGYocHRyIHN0ciBwdHIpIENSVERMTF92ZnByaW50ZgogNDk4IHN0dWIgdmZ3cHJpbnRmCiA0OTkgc3R1YiB2cHJpbnRmCi01MDAgY2RlY2wgdnNwcmludGYocHRyIHB0ciBwdHIpIENSVERMTF92c3ByaW50ZgotNTAxIGNkZWNsIHZzd3ByaW50ZihwdHIgcHRyIHB0cikgQ1JURExMX3Zzd3ByaW50ZgorNTAwIGNkZWNsIHZzcHJpbnRmKHB0ciBzdHIgcHRyKSBDUlRETExfdnNwcmludGYKKzUwMSBjZGVjbCB2c3dwcmludGYocHRyIHdzdHIgcHRyKSBDUlRETExfdnN3cHJpbnRmCiA1MDIgc3R1YiB2d3ByaW50ZgotNTAzIGNkZWNsIHdjc2NhdChwdHIgcHRyKSBDUlRETExfd2NzY2F0Ci01MDQgY2RlY2wgd2NzY2hyKHB0ciBsb25nKSBDUlRETExfd2NzY2hyCi01MDUgY2RlY2wgd2NzY21wKHB0ciBwdHIpIENSVERMTF93Y3NjbXAKLTUwNiBjZGVjbCB3Y3Njb2xsKHB0ciBwdHIpIENSVERMTF93Y3Njb2xsCi01MDcgY2RlY2wgd2NzY3B5KHB0ciBwdHIpIENSVERMTF93Y3NjcHkKLTUwOCBjZGVjbCB3Y3Njc3BuKHB0ciBwdHIpIENSVERMTF93Y3Njc3BuCis1MDMgY2RlY2wgd2NzY2F0KHdzdHIgd3N0cikgQ1JURExMX3djc2NhdAorNTA0IGNkZWNsIHdjc2Nocih3c3RyIGxvbmcpIENSVERMTF93Y3NjaHIKKzUwNSBjZGVjbCB3Y3NjbXAod3N0ciB3c3RyKSBDUlRETExfd2NzY21wCis1MDYgY2RlY2wgd2NzY29sbCh3c3RyIHdzdHIpIENSVERMTF93Y3Njb2xsCis1MDcgY2RlY2wgd2NzY3B5KHB0ciB3c3RyKSBDUlRETExfd2NzY3B5Cis1MDggY2RlY2wgd2NzY3Nwbih3c3RyIHdzdHIpIENSVERMTF93Y3Njc3BuCiA1MDkgc3R1YiB3Y3NmdGltZQotNTEwIGNkZWNsIHdjc2xlbihwdHIpIENSVERMTF93Y3NsZW4KLTUxMSBjZGVjbCB3Y3NuY2F0KHB0ciBwdHIgbG9uZykgQ1JURExMX3djc25jYXQKLTUxMiBjZGVjbCB3Y3NuY21wKHB0ciBwdHIgbG9uZykgQ1JURExMX3djc25jbXAKLTUxMyBjZGVjbCB3Y3NuY3B5KHB0ciBwdHIgbG9uZykgQ1JURExMX3djc25jcHkKKzUxMCBjZGVjbCB3Y3NsZW4od3N0cikgQ1JURExMX3djc2xlbgorNTExIGNkZWNsIHdjc25jYXQod3N0ciB3c3RyIGxvbmcpIENSVERMTF93Y3NuY2F0Cis1MTIgY2RlY2wgd2NzbmNtcCh3c3RyIHdzdHIgbG9uZykgQ1JURExMX3djc25jbXAKKzUxMyBjZGVjbCB3Y3NuY3B5KHB0ciB3c3RyIGxvbmcpIENSVERMTF93Y3NuY3B5CiA1MTQgc3R1YiB3Y3NwYnJrCi01MTUgY2RlY2wgd2NzcmNocihwdHIgbG9uZykgQ1JURExMX3djc3JjaHIKLTUxNiBjZGVjbCB3Y3NzcG4ocHRyIHB0cikgQ1JURExMX3djc3NwbgotNTE3IGNkZWNsIHdjc3N0cihwdHIgcHRyKSBDUlRETExfd2Nzc3RyCis1MTUgY2RlY2wgd2NzcmNocih3c3RyIGxvbmcpIENSVERMTF93Y3NyY2hyCis1MTYgY2RlY2wgd2Nzc3BuKHdzdHIgd3N0cikgQ1JURExMX3djc3NwbgorNTE3IGNkZWNsIHdjc3N0cih3c3RyIHdzdHIpIENSVERMTF93Y3NzdHIKIDUxOCBzdHViIHdjc3RvZAogNTE5IHN0dWIgd2NzdG9rCiA1MjAgc3R1YiB3Y3N0b2wKZGlmZiAtLWdpdCBhL3JlbGF5MzIvZGlucHV0LnNwZWMgYi9yZWxheTMyL2RpbnB1dC5zcGVjCmluZGV4IDIzYmE2ZTkuLjVkMmU5ZTEgMTAwNjQ0Ci0tLSBhL3JlbGF5MzIvZGlucHV0LnNwZWMKKysrIGIvcmVsYXkzMi9kaW5wdXQuc3BlYwpAQCAtNyw0ICs3LDMgQEAKIDMgc3R1YiBEbGxHZXRDbGFzc09iamVjdAogNCBzdHViIERsbFJlZ2lzdGVyU2VydmVyCiA1IHN0dWIgRGxsVW5yZWdpc3RlclNlcnZlcgotCmRpZmYgLS1naXQgYS9yZWxheTMyL2tlcm5lbDMyLnNwZWMgYi9yZWxheTMyL2tlcm5lbDMyLnNwZWMKaW5kZXggMGIxMGUwZS4uNWRhNDg2YyAxMDA2NDQKLS0tIGEvcmVsYXkzMi9rZXJuZWwzMi5zcGVjCisrKyBiL3JlbGF5MzIva2VybmVsMzIuc3BlYwpAQCAtNTMsNyArNTMsNyBAQAogIDYxIHN0ZGNhbGwgV09XR2xvYmFsVW5sb2NrMTYobG9uZykgR2xvYmFsVW5sb2NrMTYKICA2MiBzdGRjYWxsIFdPV0dsb2JhbEZyZWUxNihsb25nKSBHbG9iYWxGcmVlMTYKICA2MyBzdGRjYWxsIFdPV0dsb2JhbEFsbG9jTG9jazE2KGxvbmcgbG9uZyBwdHIpIFdPV0dsb2JhbEFsbG9jTG9jazE2Ci0gNjQgc3R1YiBXT1dHbG9iYWxVbmxvY2tGcmVlMTYKKyA2NCBzdGRjYWxsIFdPV0dsb2JhbFVubG9ja0ZyZWUxNihsb25nKSBXT1dHbG9iYWxVbmxvY2tGcmVlMTYKICA2NSBzdHViIFdPV0dsb2JhbExvY2tTaXplMTYKICA2NiBzdHViIFdPV1lpZWxkMTYKICA2NyBzdHViIFdPV0RpcmVjdGVkWWllbGQxNgpAQCAtMjQ5LDcgKzI0OSw3IEBACiAyNTggc3RkY2FsbCBGaW5kUmVzb3VyY2VXKGxvbmcgd3N0ciB3c3RyKSBGaW5kUmVzb3VyY2UzMlcKIDI1OSBzdGRjYWxsIEZsdXNoQ29uc29sZUlucHV0QnVmZmVyKGxvbmcpIEZsdXNoQ29uc29sZUlucHV0QnVmZmVyCiAyNjAgc3RkY2FsbCBGbHVzaEZpbGVCdWZmZXJzKGxvbmcpIEZsdXNoRmlsZUJ1ZmZlcnMKLTI2MSBzdHViIEZsdXNoSW5zdHJ1Y3Rpb25DYWNoZQorMjYxIHN0ZGNhbGwgRmx1c2hJbnN0cnVjdGlvbkNhY2hlKGxvbmcgbG9uZyBsb25nKSBGbHVzaEluc3RydWN0aW9uQ2FjaGUKIDI2MiBzdGRjYWxsIEZsdXNoVmlld09mRmlsZShwdHIgbG9uZykgRmx1c2hWaWV3T2ZGaWxlCiAyNjMgc3R1YiBGb2xkU3RyaW5nQQogMjY0IHN0dWIgRm9sZFN0cmluZ1cKZGlmZiAtLWdpdCBhL3JlbGF5MzIvbXByLnNwZWMgYi9yZWxheTMyL21wci5zcGVjCmluZGV4IGMxOTc3YjQuLmM3ZjBmZDEgMTAwNjQ0Ci0tLSBhL3JlbGF5MzIvbXByLnNwZWMKKysrIGIvcmVsYXkzMi9tcHIuc3BlYwpAQCAtODMsMyArODMsOCBAQAogMDEwMiBzdHViIFdOZXRWZXJpZnlQYXNzd29yZFcgCiAjYWRkaXRpb25zCiAwMTAzIHN0dWIgV05ldFJlc3RvcmVDb25uZWN0aW9uCiswMTA0IHN0dWIgV05ldExvZ29uTm90aWZ5CiswMTA1IHN0dWIgV05ldFBhc3N3b3JkQ2hhbmdlTm90aWZ5CiswMTA2IHN0dWIgV05ldEdldFByb3BlcnR5VGV4dEEKKzAxMDcgc3R1YiBXTmV0UHJvcGVydHlEaWFsb2dBCiswMTA4IHN0dWIgV05ldEdldERpcmVjdG9yeVR5cGVBCmRpZmYgLS1naXQgYS9yZWxheTMyL250ZGxsLnNwZWMgYi9yZWxheTMyL250ZGxsLnNwZWMKaW5kZXggNTMxZWY4MC4uNGU2YmFkNiAxMDA2NDQKLS0tIGEvcmVsYXkzMi9udGRsbC5zcGVjCisrKyBiL3JlbGF5MzIvbnRkbGwuc3BlYwpAQCAtODcyLDIxICs4NzIsMjEgQEAKIDg2OSBzdHViIF9zbnByaW50ZgogODcwIHN0dWIgX3Nud3ByaW50ZgogODcxIHN0dWIgX3NwbGl0cGF0aAotODcyIGNkZWNsIF9zdHJjbXBpKHB0ciBwdHIpIENSVERMTF9fc3RyY21waQotODczIGNkZWNsIF9zdHJpY21wKHB0ciBwdHIpIENSVERMTF9fc3RyY21waQorODcyIGNkZWNsIF9zdHJjbXBpKHN0ciBzdHIpIENSVERMTF9fc3RyY21waQorODczIGNkZWNsIF9zdHJpY21wKHN0ciBzdHIpIENSVERMTF9fc3RyY21waQogODc0IHN0dWIgX3N0cmx3cgotODc1IGNkZWNsIF9zdHJuaWNtcChwdHIgcHRyIGxvbmcpIENSVERMTF9fc3RybmljbXAKLTg3NiBjZGVjbCBfc3RydXByKHB0cikgQ1JURExMX19zdHJ1cHIKKzg3NSBjZGVjbCBfc3RybmljbXAoc3RyIHN0ciBsb25nKSBDUlRETExfX3N0cm5pY21wCis4NzYgY2RlY2wgX3N0cnVwcihzdHIpIENSVERMTF9fc3RydXByCiA4Nzcgc3R1YiBfdWx0b2EKIDg3OCBzdHViIF92c25wcmludGYKLTg3OSBjZGVjbCBfd2NzaWNtcChwdHIgcHRyKSBDUlRETExfX3djc2ljbXAKLTg4MCBjZGVjbCBfd2NzbHdyKHB0cikgQ1JURExMX193Y3Nsd3IKLTg4MSBjZGVjbCBfd2NzbmljbXAocHRyIHB0ciBsb25nKSBDUlRETExfX3djc25pY21wCi04ODIgY2RlY2wgX3djc3VwcihwdHIpIENSVERMTF9fd2NzdXByCis4NzkgY2RlY2wgX3djc2ljbXAod3N0ciB3c3RyKSBDUlRETExfX3djc2ljbXAKKzg4MCBjZGVjbCBfd2NzbHdyKHdzdHIpIENSVERMTF9fd2NzbHdyCis4ODEgY2RlY2wgX3djc25pY21wKHdzdHIgd3N0ciBsb25nKSBDUlRETExfX3djc25pY21wCis4ODIgY2RlY2wgX3djc3Vwcih3c3RyKSBDUlRETExfX3djc3VwcgogODgzIHN0dWIgYWJzCiA4ODQgc3R1YiBhdGFuCi04ODUgY2RlY2wgYXRvaShwdHIpIGF0b2kKLTg4NiBjZGVjbCBhdG9sKHB0cikgYXRvbAorODg1IGNkZWNsIGF0b2koc3RyKSBhdG9pCis4ODYgY2RlY2wgYXRvbChzdHIpIGF0b2wKIDg4NyBzdHViIGNlaWwKIDg4OCBzdHViIGNvcwogODg5IHN0dWIgZmFicwpAQCAtOTE0LDM5ICs5MTQsMzkgQEAKIDkxMSB2YXJhcmdzIHNwcmludGYoKSB3c3ByaW50ZjMyQQogOTEyIHN0dWIgc3FydAogOTEzIHZhcmFyZ3Mgc3NjYW5mKCkgc3NjYW5mCi05MTQgY2RlY2wgc3RyY2F0KHB0ciBwdHIpIHN0cmNhdAotOTE1IGNkZWNsIHN0cmNocihwdHIgbG9uZykgc3RyY2hyCi05MTYgY2RlY2wgc3RyY21wKHB0ciBwdHIpIHN0cmNtcAotOTE3IGNkZWNsIHN0cmNweShwdHIgcHRyKSBzdHJjcHkKLTkxOCBjZGVjbCBzdHJjc3BuKHB0ciBwdHIpIHN0cmNzcG4KLTkxOSBjZGVjbCBzdHJsZW4ocHRyKSBzdHJsZW4KLTkyMCBjZGVjbCBzdHJuY2F0KHB0ciBwdHIgbG9uZykgc3RybmNhdAotOTIxIGNkZWNsIHN0cm5jbXAocHRyIHB0ciBsb25nKSBzdHJuY21wCi05MjIgY2RlY2wgc3RybmNweShwdHIgcHRyIGxvbmcpIHN0cm5jcHkKLTkyMyBjZGVjbCBzdHJwYnJrKHB0ciBwdHIgbG9uZykgc3RycGJyawotOTI0IGNkZWNsIHN0cnJjaHIocHRyIGxvbmcpIHN0cnJjaHIKLTkyNSBjZGVjbCBzdHJzcG4ocHRyIHB0cikgc3Ryc3BuCi05MjYgY2RlY2wgc3Ryc3RyKHB0ciBwdHIpIHN0cnN0cgorOTE0IGNkZWNsIHN0cmNhdChzdHIgc3RyKSBzdHJjYXQKKzkxNSBjZGVjbCBzdHJjaHIoc3RyIGxvbmcpIHN0cmNocgorOTE2IGNkZWNsIHN0cmNtcChzdHIgc3RyKSBzdHJjbXAKKzkxNyBjZGVjbCBzdHJjcHkocHRyIHN0cikgc3RyY3B5Cis5MTggY2RlY2wgc3RyY3NwbihzdHIgc3RyKSBzdHJjc3BuCis5MTkgY2RlY2wgc3RybGVuKHN0cikgc3RybGVuCis5MjAgY2RlY2wgc3RybmNhdChzdHIgc3RyIGxvbmcpIHN0cm5jYXQKKzkyMSBjZGVjbCBzdHJuY21wKHN0ciBzdHIgbG9uZykgc3RybmNtcAorOTIyIGNkZWNsIHN0cm5jcHkocHRyIHN0ciBsb25nKSBzdHJuY3B5Cis5MjMgY2RlY2wgc3RycGJyayhzdHIgc3RyIGxvbmcpIHN0cnBicmsKKzkyNCBjZGVjbCBzdHJyY2hyKHN0ciBsb25nKSBzdHJyY2hyCis5MjUgY2RlY2wgc3Ryc3BuKHN0ciBzdHIpIHN0cnNwbgorOTI2IGNkZWNsIHN0cnN0cihzdHIgc3RyKSBzdHJzdHIKIDkyNyB2YXJhcmdzIHN3cHJpbnRmKCkgd3NwcmludGYzMlcKIDkyOCBzdHViIHRhbgogOTI5IGNkZWNsIHRvbG93ZXIobG9uZykgdG9sb3dlcgogOTMwIGNkZWNsIHRvdXBwZXIobG9uZykgdG91cHBlcgogOTMxIHN0dWIgdG93bG93ZXIKIDkzMiBzdHViIHRvd3VwcGVyCi05MzMgY2RlY2wgdnNwcmludGYocHRyIHB0ciBwdHIpIENSVERMTF92c3ByaW50ZgotOTM0IGNkZWNsIHdjc2NhdChwdHIgcHRyKSBDUlRETExfd2NzY2F0Ci05MzUgY2RlY2wgd2NzY2hyKHB0ciBsb25nKSBDUlRETExfd2NzY2hyCis5MzMgY2RlY2wgdnNwcmludGYocHRyIHN0ciBwdHIpIENSVERMTF92c3ByaW50ZgorOTM0IGNkZWNsIHdjc2NhdCh3c3RyIHdzdHIpIENSVERMTF93Y3NjYXQKKzkzNSBjZGVjbCB3Y3NjaHIod3N0ciBsb25nKSBDUlRETExfd2NzY2hyCiA5MzYgc3R1YiB3Y3NjbXAKLTkzNyBjZGVjbCB3Y3NjcHkocHRyIHB0cikgQ1JURExMX3djc2NweQorOTM3IGNkZWNsIHdjc2NweShwdHIgd3N0cikgQ1JURExMX3djc2NweQogOTM4IHN0dWIgd2NzY3NwbgotOTM5IGNkZWNsIHdjc2xlbihwdHIpIENSVERMTF93Y3NsZW4KKzkzOSBjZGVjbCB3Y3NsZW4od3N0cikgQ1JURExMX3djc2xlbgogOTQwIHN0dWIgd2NzbmNhdAogOTQxIHN0dWIgd2NzbmNtcAotOTQyIGNkZWNsIHdjc25jcHkocHRyIHB0ciBsb25nKSBDUlRETExfd2NzbmNweQorOTQyIGNkZWNsIHdjc25jcHkocHRyIHdzdHIgbG9uZykgQ1JURExMX3djc25jcHkKIDk0MyBzdHViIHdjc3BicmsKLTk0NCBjZGVjbCB3Y3NyY2hyKHB0ciBsb25nKSBDUlRETExfd2NzcmNocgotOTQ1IHN0dWIgd2Nzc3BuCi05NDYgY2RlY2wgd2Nzc3RyKHB0ciBwdHIpIENSVERMTF93Y3NzdHIKKzk0NCBjZGVjbCB3Y3NyY2hyKHdzdHIgbG9uZykgQ1JURExMX3djc3JjaHIKKzk0NSBjZGVjbCB3Y3NzcG4od3N0ciB3c3RyKSBDUlRETExfd2Nzc3BuCis5NDYgY2RlY2wgd2Nzc3RyKHdzdHIgd3N0cikgQ1JURExMX3djc3N0cgogOTQ3IHN0dWIgd2NzdG9rCiA5NDggc3R1YiB3Y3N0b2wKIDk0OSBjZGVjbCB3Y3N0b21icyhwdHIgcHRyIGxvbmcpIENSVERMTF93Y3N0b21icwpkaWZmIC0tZ2l0IGEvcmVsYXkzMi9vbGUzMi5zcGVjIGIvcmVsYXkzMi9vbGUzMi5zcGVjCmluZGV4IDE1NDdmNGMuLjlmY2QzYjMgMTAwNjQ0Ci0tLSBhL3JlbGF5MzIvb2xlMzIuc3BlYworKysgYi9yZWxheTMyL29sZTMyLnNwZWMKQEAgLTIsOCArMiw4IEBACiB0eXBlCXdpbjMyCiAKICAgMSBzdHViIEJpbmRNb25pa2VyCi0gIDIgc3R1YiBDTFNJREZyb21Qcm9nSUQKLSAgMyBzdGRjYWxsIENMU0lERnJvbVN0cmluZyhzdHIgcHRyKSBDTFNJREZyb21TdHJpbmcKKyAgMiBzdGRjYWxsIENMU0lERnJvbVByb2dJRCh3c3RyIHB0cikgQ0xTSURGcm9tUHJvZ0lEMzIKKyAgMyBzdGRjYWxsIENMU0lERnJvbVN0cmluZyh3c3RyIHB0cikgQ0xTSURGcm9tU3RyaW5nMzIKICAgNCBzdGRjYWxsIENvQnVpbGRWZXJzaW9uKCkgQ29CdWlsZFZlcnNpb24KICAgNSBzdHViIENvQ3JlYXRlRnJlZVRocmVhZGVkTWFyc2hhbGVyCiAgIDYgc3R1YiBDb0NyZWF0ZUd1aWQKQEAgLTE4LDE2ICsxOCwxNiBAQAogIDE1IHN0dWIgQ29HZXRDYWxsZXJUSUQKICAxNiBzdHViIENvR2V0Q2xhc3NPYmplY3QKICAxNyBzdHViIENvR2V0Q3VycmVudExvZ2ljYWxUaHJlYWRJZAotIDE4IHN0dWIgQ29HZXRDdXJyZW50UHJvY2VzcworIDE4IHN0ZGNhbGwgQ29HZXRDdXJyZW50UHJvY2VzcygpIENvR2V0Q3VycmVudFByb2Nlc3MKICAxOSBzdHViIENvR2V0SW50ZXJmYWNlQW5kUmVsZWFzZVN0cmVhbQotIDIwIHN0ZGNhbGwgQ29HZXRNYWxsb2MobG9uZyBwdHIpIENvR2V0TWFsbG9jCisgMjAgc3RkY2FsbCBDb0dldE1hbGxvYyhsb25nIHB0cikgQ29HZXRNYWxsb2MzMgogIDIxIHN0dWIgQ29HZXRNYXJzaGFsU2l6ZU1heAogIDIyIHN0dWIgQ29HZXRQU0Nsc2lkCiAgMjMgc3R1YiBDb0dldFN0YW5kYXJkTWFyc2hhbAogIDI0IHN0dWIgQ29HZXRTdGF0ZQogIDI1IHN0dWIgQ29HZXRUcmVhdEFzQ2xhc3MKLSAyNiBzdGRjYWxsIENvSW5pdGlhbGl6ZShsb25nKSBDb0luaXRpYWxpemUKLSAyNyBzdHViIENvSW5pdGlhbGl6ZVdPVworIDI2IHN0ZGNhbGwgQ29Jbml0aWFsaXplKGxvbmcpIENvSW5pdGlhbGl6ZTMyCisgMjcgc3RkY2FsbCBDb0luaXRpYWxpemVXT1cobG9uZyBsb25nKSBDb0luaXRpYWxpemVXT1cKICAyOCBzdHViIENvSXNIYW5kbGVyQ29ubmVjdGVkCiAgMjkgc3R1YiBDb0lzT2xlMUNsYXNzCiAgMzAgc3R1YiBDb0xvYWRMaWJyYXJ5CkBAIC0zNiwxNSArMzYsMTUgQEAKICAzMyBzdHViIENvTWFyc2hhbEludGVyVGhyZWFkSW50ZXJmYWNlSW5TdHJlYW0KICAzNCBzdHViIENvTWFyc2hhbEludGVyZmFjZQogIDM1IHN0dWIgQ29RdWVyeVJlbGVhc2VPYmplY3QKLSAzNiBzdHViIENvUmVnaXN0ZXJDbGFzc09iamVjdAorIDM2IHN0ZGNhbGwgQ29SZWdpc3RlckNsYXNzT2JqZWN0KHB0ciBwdHIgbG9uZyBsb25nIHB0cikgQ29SZWdpc3RlckNsYXNzT2JqZWN0MzIKICAzNyBzdHViIENvUmVnaXN0ZXJNYWxsb2NTcHkKICAzOCBzdGRjYWxsIENvUmVnaXN0ZXJNZXNzYWdlRmlsdGVyKHB0ciBwdHIpIENvUmVnaXN0ZXJNZXNzYWdlRmlsdGVyMzIKICAzOSBzdHViIENvUmVsZWFzZU1hcnNoYWxEYXRhCiAgNDAgc3R1YiBDb1Jldm9rZUNsYXNzT2JqZWN0CiAgNDEgc3R1YiBDb1Jldm9rZU1hbGxvY1NweQogIDQyIHN0dWIgQ29TZXRTdGF0ZQotIDQzIHN0dWIgQ29UYXNrTWVtQWxsb2MKLSA0NCBzdHViIENvVGFza01lbUZyZWUKKyA0MyBzdGRjYWxsIENvVGFza01lbUFsbG9jKGxvbmcpIENvVGFza01lbUFsbG9jCisgNDQgc3RkY2FsbCBDb1Rhc2tNZW1GcmVlKHB0cikgQ29UYXNrTWVtRnJlZQogIDQ1IHN0dWIgQ29UYXNrTWVtUmVhbGxvYwogIDQ2IHN0dWIgQ29UcmVhdEFzQ2xhc3MKICA0NyBzdGRjYWxsIENvVW5pbml0aWFsaXplKCkgQ29Vbml0aWFsaXplCkBAIC03OCwxMyArNzgsMTMgQEAKICA3NSBzdHViIElzQWNjZWxlcmF0b3IKICA3NiBzdHViIElzRXF1YWxHVUlECiAgNzcgc3R1YiBJc1ZhbGlkSWlkCi0gNzggc3R1YiBJc1ZhbGlkSW50ZXJmYWNlCisgNzggc3RkY2FsbCBJc1ZhbGlkSW50ZXJmYWNlKHB0cikgSXNWYWxpZEludGVyZmFjZTMyCiAgNzkgc3R1YiBJc1ZhbGlkUHRySW4KICA4MCBzdHViIElzVmFsaWRQdHJPdXQKICA4MSBzdHViIE1rUGFyc2VEaXNwbGF5TmFtZQogIDgyIHN0dWIgTW9uaWtlckNvbW1vblByZWZpeFdpdGgKICA4MyBzdHViIE1vbmlrZXJSZWxhdGl2ZVBhdGhUbwotIDg0IHN0dWIgT2xlQnVpbGRWZXJzaW9uCisgODQgc3RkY2FsbCBPbGVCdWlsZFZlcnNpb24oKSBPbGVCdWlsZFZlcnNpb24KICA4NSBzdHViIE9sZUNvbnZlcnRJU3RvcmFnZVRvT0xFU1RSRUFNCiAgODYgc3R1YiBPbGVDb252ZXJ0SVN0b3JhZ2VUb09MRVNUUkVBTUV4CiAgODcgc3R1YiBPbGVDb252ZXJ0T0xFU1RSRUFNVG9JU3RvcmFnZQpAQCAtMTA5LDcgKzEwOSw3IEBACiAxMDYgc3R1YiBPbGVHZXRJY29uT2ZDbGFzcwogMTA3IHN0dWIgT2xlR2V0SWNvbk9mRmlsZQogMTA4IHN0ZGNhbGwgT2xlSW5pdGlhbGl6ZShwdHIpIE9sZUluaXRpYWxpemUKLTEwOSBzdHViIE9sZUluaXRpYWxpemVXT1cKKzEwOSBzdGRjYWxsIE9sZUluaXRpYWxpemVXT1cobG9uZykgT2xlSW5pdGlhbGl6ZVdPVwogMTEwIHN0dWIgT2xlSXNDdXJyZW50Q2xpcGJvYXJkCiAxMTEgc3R1YiBPbGVJc1J1bm5pbmcKIDExMiBzdHViIE9sZUxvYWQKQEAgLTE0NCwxNCArMTQ0LDE0IEBACiAxNDEgc3R1YiBSZXZva2VEcmFnRHJvcAogMTQyIHN0dWIgU2V0Q29udmVydFN0ZwogMTQzIHN0dWIgU2V0RG9jdW1lbnRCaXRTdGcKLTE0NCBzdHViIFN0Z0NyZWF0ZURvY2ZpbGUKKzE0NCBzdGRjYWxsIFN0Z0NyZWF0ZURvY2ZpbGUod3N0ciBsb25nIGxvbmcgcHRyKSBTdGdDcmVhdGVEb2NGaWxlMzIKIDE0NSBzdHViIFN0Z0NyZWF0ZURvY2ZpbGVPbklMb2NrQnl0ZXMKLTE0NiBzdHViIFN0Z0lzU3RvcmFnZUZpbGUKKzE0NiBzdGRjYWxsIFN0Z0lzU3RvcmFnZUZpbGUod3N0cikgU3RnSXNTdG9yYWdlRmlsZTMyCiAxNDcgc3R1YiBTdGdJc1N0b3JhZ2VJTG9ja0J5dGVzCi0xNDggc3R1YiBTdGdPcGVuU3RvcmFnZQorMTQ4IHN0ZGNhbGwgU3RnT3BlblN0b3JhZ2Uod3N0ciBwdHIgbG9uZyBwdHIgbG9uZyBwdHIpIFN0Z09wZW5TdG9yYWdlMzIKIDE0OSBzdHViIFN0Z09wZW5TdG9yYWdlT25JTG9ja0J5dGVzCiAxNTAgc3R1YiBTdGdTZXRUaW1lcwotMTUxIHN0ZGNhbGwgU3RyaW5nRnJvbUNMU0lEKHB0ciBwdHIpIFN0cmluZ0Zyb21DTFNJRAorMTUxIHN0ZGNhbGwgU3RyaW5nRnJvbUNMU0lEKHB0ciBwdHIpIFN0cmluZ0Zyb21DTFNJRDMyCiAxNTIgc3R1YiBTdHJpbmdGcm9tR1VJRDIKIDE1MyBzdHViIFN0cmluZ0Zyb21JSUQKIDE1NCBzdHViIFV0Q29udmVydER2dGQxNnRvRHZ0ZDMyCmRpZmYgLS1naXQgYS9yZWxheTMyL3JlbGF5Mzg2LmMgYi9yZWxheTMyL3JlbGF5Mzg2LmMKaW5kZXggMWI1ZjcwNi4uNzM0YzJhNSAxMDA2NDQKLS0tIGEvcmVsYXkzMi9yZWxheTM4Ni5jCisrKyBiL3JlbGF5MzIvcmVsYXkzODYuYwpAQCAtMTEsNyArMTEsNiBAQAogI2luY2x1ZGUgIndpbmRvd3MuaCIKICNpbmNsdWRlICJidWlsdGluMzIuaCIKICNpbmNsdWRlICJzZWxlY3RvcnMuaCIKLSNpbmNsdWRlICJzdGRkZWJ1Zy5oIgogI2luY2x1ZGUgImRlYnVnLmgiCiAKIHN0YXRpYyB2b2lkIF9kdW1wc3RyKHVuc2lnbmVkIGNoYXIgKnMpIHsKQEAgLTU0LDcgKzUzLDcgQEAKICAgICBCWVRFICpyZWxheV9hZGRyID0gKEJZVEUgKilhcmdzWy0xXTsKICAgICBXT1JEIG5iX2FyZ3MgPSAqKFdPUkQgKikocmVsYXlfYWRkciArIDEpIC8gc2l6ZW9mKGludCk7CiAKLSAgICBhc3NlcnQoZGVidWdnaW5nX3JlbGF5KTsKKyAgICBhc3NlcnQoZGVidWdnaW5nX2luZm8ocmVsYXkpKTsKICAgICBmdW5jID0gKEZBUlBST0MzMilCVUlMVElOMzJfR2V0RW50cnlQb2ludCggYnVmZmVyLCByZWxheV9hZGRyIC0gNSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnR5cGVtYXNrICk7CiAgICAgcHJpbnRmKCAiQ2FsbCAlcygiLCBidWZmZXIgKTsKQEAgLTE3NSw3ICsxNzQsNyBAQAogICogU3RhY2sgbGF5b3V0OgogICogIC4uLiAgICAgIC4uLgogICogKGVzcCsyMTYpIHJldF9hZGRyCi0gKiAoZXNwKzIxMikgcmV0dXJuIHRvIHJlbGF5IGRlYnVnZ2luZyBjb2RlIChvbmx5IHdoZW4gZGVidWdnaW5nX3JlbGF5KQorICogKGVzcCsyMTIpIHJldHVybiB0byByZWxheSBkZWJ1Z2dpbmcgY29kZSAob25seSB3aGVuIGRlYnVnZ2luZyhyZWxheSkpCiAgKiAoZXNwKzIwOCkgZW50cnkgcG9pbnQgdG8gY2FsbAogICogKGVzcCs0KSAgIENPTlRFWFQKICAqIChlc3ApICAgICByZXR1cm4gYWRkciB0byByZWxheSBjb2RlCkBAIC0xODQsNyArMTgzLDcgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQgKENBTExCQUNLICplbnRyeV9wb2ludCkoQ09OVEVYVCAqKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJZVEUgKnJlbGF5X2FkZHIsIGludCByZXRfYWRkciApCiB7Ci0gICAgaWYgKCFkZWJ1Z2dpbmdfcmVsYXkpCisgICAgaWYgKCFkZWJ1Z2dpbmdfaW5mbyhyZWxheSkpCiAgICAgewogICAgICAgICAvKiBTaW1wbHkgY2FsbCB0aGUgZW50cnkgcG9pbnQgKi8KICAgICAgICAgZW50cnlfcG9pbnQoICZjb250ZXh0ICk7CmRpZmYgLS1naXQgYS9yZWxheTMyL3VzZXIzMi5zcGVjIGIvcmVsYXkzMi91c2VyMzIuc3BlYwppbmRleCBkYzRmMDFhLi5hYzM5OTQyIDEwMDY0NAotLS0gYS9yZWxheTMyL3VzZXIzMi5zcGVjCisrKyBiL3JlbGF5MzIvdXNlcjMyLnNwZWMKQEAgLTU5NSw3ICs1OTUsNyBAQAogNTg5IHN0dWIgQ2hhbmdlRGlzcGxheVNldHRpbmdzQQogNTkwIHN0dWIgQ2hhbmdlRGlzcGxheVNldHRpbmdzVwogNTkxIHN0dWIgRW51bURlc2t0b3BXaW5kb3dzCi01OTIgc3R1YiBFbnVtRGlzcGxheVNldHRpbmdzQQorNTkyIHN0ZGNhbGwgRW51bURpc3BsYXlTZXR0aW5nc0Eoc3RyIGxvbmcgcHRyKSBFbnVtRGlzcGxheVNldHRpbmdzMzJBCiA1OTMgc3R1YiBFbnVtRGlzcGxheVNldHRpbmdzVwogNTk0IHN0dWIgR2V0V2luZG93UmduCiA1OTUgc3R1YiBNYXBWaXJ0dWFsS2V5RXhXCmRpZmYgLS1naXQgYS9yZWxheTMyL3dvdzMyLnNwZWMgYi9yZWxheTMyL3dvdzMyLnNwZWMKaW5kZXggNWZmNDY5Mi4uOWI1YmFjZSAxMDA2NDQKLS0tIGEvcmVsYXkzMi93b3czMi5zcGVjCisrKyBiL3JlbGF5MzIvd293MzIuc3BlYwpAQCAtMTQsNyArMTQsNyBAQAogIDExIHN0dWIgICAgV09XR2xvYmFsTG9jazE2CiAgMTIgc3R1YiAgICBXT1dHbG9iYWxMb2NrU2l6ZTE2CiAgMTMgc3R1YiAgICBXT1dHbG9iYWxVbmxvY2sxNgotIDE0IHN0dWIgICAgV09XR2xvYmFsVW5sb2NrRnJlZTE2CisgMTQgc3RkY2FsbCBXT1dHbG9iYWxVbmxvY2tGcmVlMTYobG9uZykgV09XR2xvYmFsVW5sb2NrRnJlZTE2CiAgMTUgc3R1YiAgICBXT1dIYW5kbGUxNgogIDE2IHN0ZGNhbGwgV09XSGFuZGxlMzIobG9uZyBsb25nKSBXT1dIYW5kbGUzMgogIDE3IHN0dWIgICAgV09XWWllbGQxNgpkaWZmIC0tZ2l0IGEvc2NoZWR1bGVyL2NyaXRzZWN0aW9uLmMgYi9zY2hlZHVsZXIvY3JpdHNlY3Rpb24uYwppbmRleCBjOTdjMjk1Li45YzkyMzUxIDEwMDY0NAotLS0gYS9zY2hlZHVsZXIvY3JpdHNlY3Rpb24uYworKysgYi9zY2hlZHVsZXIvY3JpdHNlY3Rpb24uYwpAQCAtNTAsNiArNTAsOCBAQAogICAgIENSSVRfU0VDVElPTl9TYXRpc2ZpZWQsICAgIC8qIHNhdGlzZmllZCAqLwogICAgIENSSVRfU0VDVElPTl9BZGRXYWl0LCAgICAgIC8qIGFkZF93YWl0ICovCiAgICAgQ1JJVF9TRUNUSU9OX1JlbW92ZVdhaXQsICAgLyogcmVtb3ZlX3dhaXQgKi8KKyAgICBOVUxMLCAgICAgICAgICAgICAgICAgICAgICAvKiByZWFkICovCisgICAgTlVMTCwgICAgICAgICAgICAgICAgICAgICAgLyogd3JpdGUgKi8KICAgICBDUklUX1NFQ1RJT05fRGVzdHJveSAgICAgICAvKiBkZXN0cm95ICovCiB9OwogCmRpZmYgLS1naXQgYS9zY2hlZHVsZXIvZXZlbnQuYyBiL3NjaGVkdWxlci9ldmVudC5jCmluZGV4IGZkZWJiZTguLjljZjUwNWMgMTAwNjQ0Ci0tLSBhL3NjaGVkdWxlci9ldmVudC5jCisrKyBiL3NjaGVkdWxlci9ldmVudC5jCkBAIC0zMiw2ICszMiw4IEBACiAgICAgRVZFTlRfU2F0aXNmaWVkLCAgICAvKiBzYXRpc2ZpZWQgKi8KICAgICBFVkVOVF9BZGRXYWl0LCAgICAgIC8qIGFkZF93YWl0ICovCiAgICAgRVZFTlRfUmVtb3ZlV2FpdCwgICAvKiByZW1vdmVfd2FpdCAqLworICAgIE5VTEwsICAgICAgICAgICAgICAgLyogcmVhZCAqLworICAgIE5VTEwsICAgICAgICAgICAgICAgLyogd3JpdGUgKi8KICAgICBFVkVOVF9EZXN0cm95ICAgICAgIC8qIGRlc3Ryb3kgKi8KIH07CiAKZGlmZiAtLWdpdCBhL3NjaGVkdWxlci9rMzJvYmouYyBiL3NjaGVkdWxlci9rMzJvYmouYwppbmRleCBjOWZhZDcxLi4zMDcxN2ZiIDEwMDY0NAotLS0gYS9zY2hlZHVsZXIvazMyb2JqLmMKKysrIGIvc2NoZWR1bGVyL2szMm9iai5jCkBAIC0yOCw2ICsyOCw4IEBACiAgICAgTlVMTCwgICAgLyogc2F0aXNmaWVkICovCiAgICAgTlVMTCwgICAgLyogYWRkX3dhaXQgKi8KICAgICBOVUxMLCAgICAvKiByZW1vdmVfd2FpdCAqLworICAgIE5VTEwsICAgIC8qIHJlYWQgKi8KKyAgICBOVUxMLCAgICAvKiB3cml0ZSAqLwogICAgIE5VTEwgICAgIC8qIGRlc3Ryb3kgKi8KIH07CiAKZGlmZiAtLWdpdCBhL3NjaGVkdWxlci9tdXRleC5jIGIvc2NoZWR1bGVyL211dGV4LmMKaW5kZXggYjA4Mjk3Ni4uYWU2OTQ5OCAxMDA2NDQKLS0tIGEvc2NoZWR1bGVyL211dGV4LmMKKysrIGIvc2NoZWR1bGVyL211dGV4LmMKQEAgLTM1LDYgKzM1LDggQEAKICAgICBNVVRFWF9TYXRpc2ZpZWQsICAgLyogc2F0aXNmaWVkICovCiAgICAgTVVURVhfQWRkV2FpdCwgICAgIC8qIGFkZF93YWl0ICovCiAgICAgTVVURVhfUmVtb3ZlV2FpdCwgIC8qIHJlbW92ZV93YWl0ICovCisgICAgTlVMTCwgICAgICAgICAgICAgIC8qIHJlYWQgKi8KKyAgICBOVUxMLCAgICAgICAgICAgICAgLyogd3JpdGUgKi8KICAgICBNVVRFWF9EZXN0cm95ICAgICAgLyogZGVzdHJveSAqLwogfTsKIApkaWZmIC0tZ2l0IGEvc2NoZWR1bGVyL3Byb2Nlc3MuYyBiL3NjaGVkdWxlci9wcm9jZXNzLmMKaW5kZXggODRhNmJmMjQuLjI3ZDg3NjUgMTAwNjQ0Ci0tLSBhL3NjaGVkdWxlci9wcm9jZXNzLmMKKysrIGIvc2NoZWR1bGVyL3Byb2Nlc3MuYwpAQCAtMzMsNiArMzMsOCBAQAogICAgIFBST0NFU1NfU2F0aXNmaWVkLCAgIC8qIHNhdGlzZmllZCAqLwogICAgIFBST0NFU1NfQWRkV2FpdCwgICAgIC8qIGFkZF93YWl0ICovCiAgICAgUFJPQ0VTU19SZW1vdmVXYWl0LCAgLyogcmVtb3ZlX3dhaXQgKi8KKyAgICBOVUxMLCAgICAgICAgICAgICAgICAvKiByZWFkICovCisgICAgTlVMTCwgICAgICAgICAgICAgICAgLyogd3JpdGUgKi8KICAgICBQUk9DRVNTX0Rlc3Ryb3kgICAgICAvKiBkZXN0cm95ICovCiB9OwogCkBAIC0yMDMsNiArMjA1LDcgQEAKIEJPT0wzMiBQUk9DRVNTX0luaXQodm9pZCkKIHsKICAgICBleHRlcm4gQk9PTDMyIFZJUlRVQUxfSW5pdCh2b2lkKTsKKyAgICBleHRlcm4gQk9PTDMyIFRIUkVBRF9Jbml0RG9uZTsKICAgICBQREIzMiAqcGRiOwogICAgIFRIREIgKnRoZGI7CiAKQEAgLTIxNyw2ICsyMjAsNyBAQAogICAgIGlmICghKHBkYiA9IFBST0NFU1NfQ3JlYXRlUERCKCBOVUxMICkpKSByZXR1cm4gRkFMU0U7CiAgICAgaWYgKCEodGhkYiA9IFRIUkVBRF9DcmVhdGUoIHBkYiwgMCwgTlVMTCwgTlVMTCApKSkgcmV0dXJuIEZBTFNFOwogICAgIFNFVF9DVVJfVEhSRUFEKCB0aGRiICk7CisgICAgVEhSRUFEX0luaXREb25lID0gVFJVRTsKIAogICAgIHJldHVybiBUUlVFOwogfQpAQCAtMzExLDkgKzMxNSwyOSBAQAogICAgIHJldHVybiBLMzJPQkpfT1BTKCBwZGItPmV2ZW50ICktPnJlbW92ZV93YWl0KCBwZGItPmV2ZW50LCB0aHJlYWRfaWQgKTsKIH0KIAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgkJUFJPQ0VTU19DbG9zZU9iakhhbmRsZXMKKyAqCisgKgljbG9zZXMgYWxsIGhhbmRsZXMgdGhhdCByZWZlcmVuY2UgInB0ciIKKyAqIG5vdGU6IG5lZWQgdG8gYWRkIDEgdG8gdGhlIGFycmF5IGVudHJ5IHRvIGdldCB0byB3aGF0CisgKiBDbG9zZUhhbmRsZSBleHBlY3RzICh0aGVyZSBpcyBubyB6ZXJvIGhhbmRsZSkKKyAqLwordm9pZCBQUk9DRVNTX0Nsb3NlT2JqSGFuZGxlcyhQREIzMiAqcGRiLCBLMzJPQkogKnB0cikKK3sKKwlIQU5ETEUzMiBoYW5kbGU7CisKKwlhc3NlcnQoIHBkYi0+aGVhZGVyLnR5cGUgPT0gSzMyT0JKX1BST0NFU1MgKTsKKworCS8qIENsb3NlIGFsbCBoYW5kbGVzIHRoYXQgaGF2ZSBhIHBvaW50ZXIgdG8gcHRyICovCisJZm9yIChoYW5kbGUgPSAwOyBoYW5kbGUgPCBwZGItPmhhbmRsZV90YWJsZS0+Y291bnQ7IGhhbmRsZSsrKQorCQlpZiAocGRiLT5oYW5kbGVfdGFibGUtPmVudHJpZXNbaGFuZGxlXS5wdHIgPT0gcHRyKSAKKwkJCUNsb3NlSGFuZGxlKCBoYW5kbGUrMSApOworfQogCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICAqICAgICAgICAgICBQUk9DRVNTX0Rlc3Ryb3kKKyAqIG5vdGU6IG5lZWQgdG8gYWRkIDEgdG8gdGhlIGFycmF5IGVudHJ5IHRvIGdldCB0byB3aGF0CisgKiBDbG9zZUhhbmRsZSBleHBlY3RzICh0aGVyZSBpcyBubyB6ZXJvIGhhbmRsZSkKICAqLwogc3RhdGljIHZvaWQgUFJPQ0VTU19EZXN0cm95KCBLMzJPQkogKnB0ciApCiB7CkBAIC0zMjMsNyArMzQ3LDcgQEAKIAogICAgIC8qIENsb3NlIGFsbCBoYW5kbGVzICovCiAgICAgZm9yIChoYW5kbGUgPSAwOyBoYW5kbGUgPCBwZGItPmhhbmRsZV90YWJsZS0+Y291bnQ7IGhhbmRsZSsrKQotICAgICAgICBpZiAocGRiLT5oYW5kbGVfdGFibGUtPmVudHJpZXNbaGFuZGxlXS5wdHIpIENsb3NlSGFuZGxlKCBoYW5kbGUgKTsKKyAgICAgICAgaWYgKHBkYi0+aGFuZGxlX3RhYmxlLT5lbnRyaWVzW2hhbmRsZV0ucHRyKSBDbG9zZUhhbmRsZSggaGFuZGxlKzEgKTsKIAogICAgIC8qIEZyZWUgZXZlcnl0aGluZyAqLwogCkBAIC0zNDMsNiArMzY3LDcgQEAKICAgICAvKiBGSVhNRTogc2hvdWxkIGtpbGwgYWxsIHJ1bm5pbmcgdGhyZWFkcyBvZiB0aGlzIHByb2Nlc3MgKi8KICAgICBwZGItPmV4aXRfY29kZSA9IHN0YXR1czsKICAgICBFVkVOVF9TZXQoIHBkYi0+ZXZlbnQgKTsKKyAgICBpZiAocGRiLT5jb25zb2xlKSBGcmVlQ29uc29sZSgpOwogICAgIFNZU1RFTV9VTkxPQ0soKTsKIAogICAgIF9fUkVTVE9SRV9FUzsgIC8qIE5lY2Vzc2FyeSBmb3IgUGlldHJlaydzIHNob3dzZWggZXhhbXBsZSBwcm9ncmFtICovCmRpZmYgLS1naXQgYS9zY2hlZHVsZXIvc2VtYXBob3JlLmMgYi9zY2hlZHVsZXIvc2VtYXBob3JlLmMKaW5kZXggMTkxNjBmZC4uMzYxYmYxZiAxMDA2NDQKLS0tIGEvc2NoZWR1bGVyL3NlbWFwaG9yZS5jCisrKyBiL3NjaGVkdWxlci9zZW1hcGhvcmUuYwpAQCAtMzIsNiArMzIsOCBAQAogICAgIFNFTUFQSE9SRV9TYXRpc2ZpZWQsICAgLyogc2F0aXNmaWVkICovCiAgICAgU0VNQVBIT1JFX0FkZFdhaXQsICAgICAvKiBhZGRfd2FpdCAqLwogICAgIFNFTUFQSE9SRV9SZW1vdmVXYWl0LCAgLyogcmVtb3ZlX3dhaXQgKi8KKyAgICBOVUxMLCAgICAgICAgICAgICAgICAgIC8qIHJlYWQgKi8KKyAgICBOVUxMLCAgICAgICAgICAgICAgICAgIC8qIHdyaXRlICovCiAgICAgU0VNQVBIT1JFX0Rlc3Ryb3kgICAgICAvKiBkZXN0cm95ICovCiB9OwogCmRpZmYgLS1naXQgYS9zY2hlZHVsZXIvc3luY2hyby5jIGIvc2NoZWR1bGVyL3N5bmNocm8uYwppbmRleCA0MTk1ZmMyLi44MDU2YzRhIDEwMDY0NAotLS0gYS9zY2hlZHVsZXIvc3luY2hyby5jCisrKyBiL3NjaGVkdWxlci9zeW5jaHJvLmMKQEAgLTE0LDcgKzE0LDYgQEAKICNpbmNsdWRlICJwcm9jZXNzLmgiCiAjaW5jbHVkZSAidGhyZWFkLmgiCiAjaW5jbHVkZSAid2luZXJyb3IuaCIKLSNpbmNsdWRlICJzdGRkZWJ1Zy5oIgogI2luY2x1ZGUgImRlYnVnLmgiCiAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgpAQCAtMTQ2LDcgKzE0NSw3IEBACiAKICAgICAvKiBOb3cgd2FpdCBmb3IgaXQgKi8KIAotICAgIGRwcmludGZfd2luMzIoIHN0ZGRlYiwgIlNZTkM6IHN0YXJ0aW5nIHdhaXQgKCVwICUwNHgpXG4iLAorICAgIGRwcmludGZfaW5mbyh3aW4zMiwgIlNZTkM6IHN0YXJ0aW5nIHdhaXQgKCVwICUwNHgpXG4iLAogICAgICAgICAgICAgICAgICAgIFRIUkVBRF9DdXJyZW50KCksIFRIUkVBRF9DdXJyZW50KCktPnRlYl9zZWwgKTsKIAogICAgIHNpZ3Byb2NtYXNrKCBTSUdfU0VUTUFTSywgTlVMTCwgJnNldCApOwpAQCAtMTgyLDcgKzE4MSw3IEBACiAgICAgLyogR3JhYiB0aGUgc3lzdGVtIGxvY2sgYWdhaW4gKi8KIAogICAgIHdoaWxlIChjb3VudC0tKSBTWVNURU1fTE9DSygpOwotICAgIGRwcmludGZfd2luMzIoIHN0ZGRlYiwgIlNZTkM6IHdhaXQgZmluaXNoZWQgKCVwICUwNHgpXG4iLAorICAgIGRwcmludGZfaW5mbyh3aW4zMiwgIlNZTkM6IHdhaXQgZmluaXNoZWQgKCVwICUwNHgpXG4iLAogICAgICAgICAgICAgICAgICAgIFRIUkVBRF9DdXJyZW50KCksIFRIUkVBRF9DdXJyZW50KCktPnRlYl9zZWwgKTsKIAogICAgIC8qIFJlbW92ZSBvdXJzZWx2ZXMgZnJvbSB0aGUgbGlzdHMgKi8KQEAgLTI0NSw3ICsyNDQsNyBAQAogICAgICAgICBUSERCICp0aGRiID0gZW50cnktPnRocmVhZDsKICAgICAgICAgaWYgKFNZTkNfQ2hlY2tDb25kaXRpb24oICZ0aGRiLT53YWl0X3N0cnVjdCwgVEhEQl9UT19USFJFQURfSUQodGhkYikgKSkKICAgICAgICAgewotICAgICAgICAgICAgZHByaW50Zl93aW4zMiggc3RkZGViLCAiU1lOQzogd2FraW5nIHVwICUwNHhcbiIsIHRoZGItPnRlYl9zZWwgKTsKKyAgICAgICAgICAgIGRwcmludGZfaW5mbyh3aW4zMiwgIlNZTkM6IHdha2luZyB1cCAlMDR4XG4iLCB0aGRiLT50ZWJfc2VsICk7CiAgICAgICAgICAgICBraWxsKCB0aGRiLT51bml4X3BpZCwgU0lHVVNSMSApOwogICAgICAgICAgICAgaWYgKCEtLW1heCkgYnJlYWs7CiAgICAgICAgIH0KZGlmZiAtLWdpdCBhL3NjaGVkdWxlci9zeXNkZXBzLmMgYi9zY2hlZHVsZXIvc3lzZGVwcy5jCmluZGV4IGUwMjA5NTMuLmIxYTdjNTYgMTAwNjQ0Ci0tLSBhL3NjaGVkdWxlci9zeXNkZXBzLmMKKysrIGIvc2NoZWR1bGVyL3N5c2RlcHMuYwpAQCAtMTcsMTMgKzE3LDggQEAKICNpbmNsdWRlICJ0aHJlYWQuaCIKICNpbmNsdWRlICJ3aW5iYXNlLmgiCiAKLS8qIEZJWE1FOiBYIGxpYnMgY29tcGlsZWQgdy9vIC1EX1JFRU5UUkFOVCBzaG91bGQgYmUgZGV0ZWN0ZWQgYnkgYXV0b2NvbmYuICovCi0jZGVmaW5lIE5PX1JFRU5UUkFOVF9YMTEKLQotI2lmZGVmIE5PX1JFRU5UUkFOVF9YMTEKIC8qIFhsaWIgY3JpdGljYWwgc2VjdGlvbiAoRklYTUU6IGRvZXMgbm90IGJlbG9uZyBoZXJlKSAqLwogQ1JJVElDQUxfU0VDVElPTiBYMTFEUlZfQ3JpdFNlY3Rpb24gPSB7IDAsIH07Ci0jZW5kaWYKIAogI2lmZGVmIF9fbGludXhfXwogIyBpZmRlZiBIQVZFX1NDSEVEX0gKQEAgLTEyMywyNCArMTE4LDE5IEBACiAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgKiAgICAgICAgICAgTnRDdXJyZW50VGViICAgKE5URExMLjg5KQorICoKKyAqIFRoaXMgd2lsbCBjcmFzaCBhbmQgYnVybiBpZiBjYWxsZWQgYmVmb3JlIHRocmVhZGluZyBpcyBpbml0aWFsaXplZAogICovCiBURUIgKiBXSU5BUEkgTnRDdXJyZW50VGViKHZvaWQpCiB7CiAjaWZkZWYgX19pMzg2X18KICAgICBURUIgKnRlYjsKLSAgICBXT1JEIGRzLCBmczsKIAotICAgIC8qIENoZWNrIGlmIHdlIGhhdmUgYSBjdXJyZW50IHRocmVhZCAqLwotICAgIEdFVF9GUyggZnMgKTsKLSAgICBpZiAoIWZzKSByZXR1cm4gTlVMTDsKLSAgICBHRVRfRFMoIGRzICk7Ci0gICAgaWYgKGZzID09IGRzKSByZXR1cm4gTlVMTDsgLyogRklYTUU6IHNob3VsZCBiZSBhbiBhc3NlcnQgKi8KICAgICAvKiBHZXQgdGhlIFRFQiBzZWxmLXBvaW50ZXIgKi8KICAgICBfX2FzbV9fKCAiLmJ5dGUgMHg2NFxuXHRtb3ZsICglMSksJTAiCiAgICAgICAgICAgICAgOiAiPXIiICh0ZWIpIDogInIiICgmKChURUIgKikwKS0+c2VsZikgKTsKICAgICByZXR1cm4gdGViOwogI2Vsc2UKLSAgICBpZiAoIXBDdXJyZW50VGhyZWFkKSByZXR1cm4gTlVMTDsKICAgICByZXR1cm4gJnBDdXJyZW50VGhyZWFkLT50ZWI7CiAjZW5kaWYgIC8qIF9faTM4Nl9fICovCiB9CmRpZmYgLS1naXQgYS9zY2hlZHVsZXIvdGhyZWFkLmMgYi9zY2hlZHVsZXIvdGhyZWFkLmMKaW5kZXggMDIzZjkzZC4uZmRmYjM0YiAxMDA2NDQKLS0tIGEvc2NoZWR1bGVyL3RocmVhZC5jCisrKyBiL3NjaGVkdWxlci90aHJlYWQuYwpAQCAtMTYsNyArMTYsNiBAQAogI2luY2x1ZGUgIm1pc2NlbXUuaCIKICNpbmNsdWRlICJ3aW5udC5oIgogI2luY2x1ZGUgImRlYnVnLmgiCi0jaW5jbHVkZSAic3RkZGVidWcuaCIKIAogI2lmbmRlZiBfX2kzODZfXwogVEhEQiAqcEN1cnJlbnRUaHJlYWQ7CkBAIC0zNCwxMSArMzMsMTYgQEAKICAgICBUSFJFQURfU2F0aXNmaWVkLCAgIC8qIHNhdGlzZmllZCAqLwogICAgIFRIUkVBRF9BZGRXYWl0LCAgICAgLyogYWRkX3dhaXQgKi8KICAgICBUSFJFQURfUmVtb3ZlV2FpdCwgIC8qIHJlbW92ZV93YWl0ICovCisgICAgTlVMTCwgICAgICAgICAgICAgICAvKiByZWFkICovCisgICAgTlVMTCwgICAgICAgICAgICAgICAvKiB3cml0ZSAqLwogICAgIFRIUkVBRF9EZXN0cm95ICAgICAgLyogZGVzdHJveSAqLwogfTsKIAogCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKy8qIElzIHRocmVhZGluZyBjb2RlIGluaXRpYWxpemVkPyAqLworQk9PTDMyIFRIUkVBRF9Jbml0RG9uZSA9IEZBTFNFOworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogICogICAgICAgICAgIFRIUkVBRF9HZXRQdHIKICAqCiAgKiBSZXR1cm4gYSBwb2ludGVyIHRvIGEgdGhyZWFkIG9iamVjdC4gVGhlIG9iamVjdCBjb3VudCBtdXN0IGJlIGRlY3JlbWVudGVkCkBAIC02NSw5ICs2OSw4IEBACiAgKi8KIFRIREIgKlRIUkVBRF9DdXJyZW50KHZvaWQpCiB7Ci0gICAgVEVCICp0ZWIgPSBOdEN1cnJlbnRUZWIoKTsKLSAgICBpZiAoIXRlYikgcmV0dXJuIE5VTEw7Ci0gICAgcmV0dXJuIChUSERCICopKChjaGFyICopdGViIC0gKGludCkmKChUSERCICopMCktPnRlYik7CisgICAgaWYgKCFUSFJFQURfSW5pdERvbmUpIHJldHVybiBOVUxMOworICAgIHJldHVybiAoVEhEQiAqKSgoY2hhciAqKU50Q3VycmVudFRlYigpIC0gKGludCkmKChUSERCICopMCktPnRlYik7CiB9CiAKIApAQCAtMTQzLDYgKzE0Niw3IEBACiAgICAgdGhkYi0+dGViLnN0YWNrX3NlbCAgID0gMDsgLyogRklYTUUgKi8KICAgICB0aGRiLT50ZWIuc2VsZiAgICAgICAgPSAmdGhkYi0+dGViOwogICAgIHRoZGItPnRlYi50bHNfcHRyICAgICA9IHRoZGItPnRsc19hcnJheTsKKyAgICB0aGRiLT50ZWIucHJvY2VzcyAgICAgPSBwZGI7CiAgICAgdGhkYi0+d2FpdF9saXN0ICAgICAgID0gJnRoZGItPndhaXRfc3RydWN0OwogICAgIHRoZGItPmV4aXRfY29kZSAgICAgICA9IDB4MTAzOyAvKiBTVElMTF9BQ1RJVkUgKi8KICAgICB0aGRiLT5lbnRyeV9wb2ludCAgICAgPSBzdGFydF9hZGRyOwpAQCAtMTUwLDcgKzE1NCwxOCBAQAogCiAgICAgLyogQWxsb2NhdGUgdGhlIHN0YWNrICovCiAKLSAgICBpZiAoIXN0YWNrX3NpemUpIHN0YWNrX3NpemUgPSAxMDI0ICogMTAyNDsgIC8qIGRlZmF1bHQgc2l6ZSA9IDFNYiAqLworICAgIC8qIEZJWE1FOgorICAgICAqIElmIHN0YWNrc2l6ZSBzbWFsbGVyIHRoYW4gMSBNQiwgYWxsb2NhdGUgMU1CIAorICAgICAqIChvbmUgcHJvZ3JhbSB3YW50ZWQgb25seSAxMCBrQiwgd2hpY2ggaXMgcmVjb21tZW5kYWJsZSwgYnV0IHNvbWUgV0lORQorICAgICAqICBmdW5jdGlvbnMsIG5vdGVhYmx5IGluIHRoZSBmaWxlcyBzdWJkaXIsIHB1c2ggSFVHRSBzdHJ1Y3R1cmVzIGFuZAorICAgICAqICBhcnJheXMgb24gdGhlIHN0YWNrLiBUaGV5IHByb2JhYmx5IHNob3VsZG4ndC4pCisgICAgICogSWYgc3RhY2tzaXplIGxhcmdlciB0aGFuIDE2IE1CLCB3YXJuIHRoZSB1c2VyLiAoV2UgY291bGQgc2hyaW5rIHRoZSBzdGFjaworICAgICAqIGJ1dCB0aGlzIGNvdWxkIGdpdmUgbW9yZSBvciBsZXNzIHVuZXhwbGFpbmFibGUgY3Jhc2hlcy4pCisgICAgICovCisgICAgaWYgKHN0YWNrX3NpemU8MTAyNCoxMDI0KQorICAgIAlzdGFja19zaXplID0gMTAyNCAqIDEwMjQ7CisgICAgaWYgKHN0YWNrX3NpemUgPj0gMTYqMTAyNCoxMDI0KQorICAgIAlmcHJpbnRmKHN0ZGVyciwiV2FybmluZzpUaHJlYWQgc3RhY2sgc2l6ZSBpcyAlbGQgTUIuXG4iLHN0YWNrX3NpemUvMTAyNC8xMDI0KTsKICAgICB0aGRiLT5zdGFja19iYXNlID0gVmlydHVhbEFsbG9jKCBOVUxMLCBzdGFja19zaXplLCBNRU1fQ09NTUlULAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBBR0VfRVhFQ1VURV9SRUFEV1JJVEUgKTsKICAgICBpZiAoIXRoZGItPnN0YWNrX2Jhc2UpIGdvdG8gZXJyb3I7CkBAIC0zNzcsMTIgKzM5MiwxMSBAQAogCiAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiAgICAgICAgICAgVGxzQWxsb2MgICAoS0VSTkVMMzIuNTMwKQorICogICAgICAgICAgIFRIUkVBRF9UbHNBbGxvYwogICovCi1EV09SRCBXSU5BUEkgVGxzQWxsb2Modm9pZCkKK0RXT1JEIFRIUkVBRF9UbHNBbGxvYyhUSERCICp0aHJlYWQpCiB7CiAgICAgRFdPUkQgaSwgbWFzaywgcmV0ID0gMDsKLSAgICBUSERCICp0aHJlYWQgPSBUSFJFQURfQ3VycmVudCgpOwogICAgIERXT1JEICpiaXRzID0gdGhyZWFkLT5wcm9jZXNzLT50bHNfYml0czsKICAgICBFbnRlckNyaXRpY2FsU2VjdGlvbiggJnRocmVhZC0+cHJvY2Vzcy0+Y3JpdF9zZWN0aW9uICk7CiAgICAgaWYgKCpiaXRzID09IDB4ZmZmZmZmZmYpCkBAIC00MDIsNiArNDE2LDE0IEBACiAgICAgcmV0dXJuIHJldCArIGk7CiB9CiAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiAgICAgICAgICAgVGxzQWxsb2MgICAoS0VSTkVMMzIuNTMwKQorICovCitEV09SRCBXSU5BUEkgVGxzQWxsb2Modm9pZCkKK3sKKyAgICByZXR1cm4gVEhSRUFEX1Rsc0FsbG9jKFRIUkVBRF9DdXJyZW50KCkpOworfQorCiAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgKiAgICAgICAgICAgVGxzRnJlZSAgIChLRVJORUwzMi41MzEpCmRpZmYgLS1naXQgYS90b29scy9idWlsZC5jIGIvdG9vbHMvYnVpbGQuYwppbmRleCAzNDk5NWQyLi4xNTRmNjc5IDEwMDY0NAotLS0gYS90b29scy9idWlsZC5jCisrKyBiL3Rvb2xzL2J1aWxkLmMKQEAgLTEzMDgsMTYgKzEzMDgsMjEgQEAKIHN0YXRpYyBpbnQgVHJhbnNmZXJBcmdzMTZUbzMyKCBGSUxFICpvdXRmaWxlLCBjaGFyICphcmdzLCBpbnQgdXNlY2RlY2wgKQogewogICAgIGludCBpLCBwb3MxNiwgcG9zMzI7CisgICAgY2hhciAqeGFyZ3M7CiAKICAgICAvKiBDb3B5IHRoZSBhcmd1bWVudHMgKi8KIAogICAgIHBvczE2ID0gNjsgIC8qIHNraXAgYnAgYW5kIHJldHVybiBhZGRyZXNzICovCiAgICAgcG9zMzIgPSB1c2VjZGVjbCA/IC0oc3RybGVuKGFyZ3MpICogNCkgOiAwOworICAgIHhhcmdzID0gdXNlY2RlY2wgPyBhcmdzOmFyZ3Mrc3RybGVuKGFyZ3MpOwogCiAgICAgZm9yIChpID0gc3RybGVuKGFyZ3MpOyBpID4gMDsgaS0tKQogICAgIHsKLSAgICAgICAgaWYgKCF1c2VjZGVjbCkgcG9zMzIgLT0gNDsKLSAgICAgICAgc3dpdGNoKGFyZ3NbaS0xXSkKKyAgICAgICAgaWYgKCF1c2VjZGVjbCkgeworICAgICAgICAgICAgcG9zMzIgLT0gNDsKKyAgICAgICAgICAgIHhhcmdzLS07CisgICAgICAgIH0KKyAgICAgICAgc3dpdGNoKCp4YXJncykKICAgICAgICAgewogICAgICAgICBjYXNlICd3JzogIC8qIHdvcmQgKi8KICAgICAgICAgICAgIGZwcmludGYoIG91dGZpbGUsICJcdG1vdnp3bCAlZCglJWVicCksJSVlYXhcbiIsIHBvczE2ICk7CkBAIC0xMzUzLDkgKzEzNTgsMTIgQEAKICAgICAgICAgICAgIGJyZWFrOwogCiAgICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgICBmcHJpbnRmKCBzdGRlcnIsICJVbmtub3duIGFyZyB0eXBlICclYydcbiIsIGFyZ3NbaS0xXSApOworICAgICAgICAgICAgZnByaW50Ziggc3RkZXJyLCAiVW5rbm93biBhcmcgdHlwZSAnJWMnXG4iLCAqeGFyZ3MgKTsKICAgICAgICAgfQotICAgICAgICBpZiAodXNlY2RlY2wpIHBvczMyICs9IDQ7CisgICAgICAgIGlmICh1c2VjZGVjbCkgeworICAgICAgICAgICAgcG9zMzIgKz0gNDsKKyAgICAgICAgICAgIHhhcmdzKys7CisgICAgICAgIH0KICAgICB9CiAKICAgICByZXR1cm4gcG9zMTYgLSA2OyAgLyogUmV0dXJuIHRoZSBzaXplIG9mIHRoZSAxNi1iaXQgYXJncyAqLwpAQCAtMjA4Nyw3ICsyMDk1LDcgQEAKICAqCiAgKiBTdGFjayBsYXlvdXQ6CiAgKiAgIC4uLiAgICAgLi4uCi0gKiAoZXNwKzIwOCkgcmV0IGFkZHIgKG9yIHJlbGF5IGFkZHIgd2hlbiBkZWJ1Z2dpbmdfcmVsYXkgaXMgb24pCisgKiAoZXNwKzIwOCkgcmV0IGFkZHIgKG9yIHJlbGF5IGFkZHIgd2hlbiBkZWJ1Z2dpbmcocmVsYXkpIGlzIG9uKQogICogKGVzcCsyMDQpIGVudHJ5IHBvaW50CiAgKiAoZXNwKzApICAgQ09OVEVYVCBzdHJ1Y3QKICAqLwpkaWZmIC0tZ2l0IGEvdG9vbHMvZmluZF9kZWJ1Z19jaGFubmVscyBiL3Rvb2xzL2ZpbmRfZGVidWdfY2hhbm5lbHMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzljNTY2NgotLS0gL2Rldi9udWxsCisrKyBiL3Rvb2xzL2ZpbmRfZGVidWdfY2hhbm5lbHMKQEAgLTAsMCArMSw0MSBAQAorIyEvYmluL2Jhc2gKKyMKKyMgVGhpcyBzY3JpcHQgc2NhbnMgdGhlIHdob2xlIHNvdXJjZSBjb2RlIGZvciBzeW1ib2xzIG9mIHRoZSBmb3JtIAorIyAnZHByaW50Zl94eHgoeXl5JyB3aGVyZSB5eXkgaXMgYSBDIGlkZW50aWZpZXIgYW5kIG91dHB1dHMsIG9uIHRoZQorIyBzdGFuZGFyZCBvdXRwdXQgYSBzb3J0ZWQgbGlzdCBvZiB0aGUgaWRlbnRpZmllcnMgZm91bmQgaW4gdGhlIC5jIAorIyBmaWxlcy4gRWFjaCBpZGVudGlmaWVyIGlzIHJlcG9ydGVkIG9uY2UuIEhlYWRlciBmaWxlcyBhcmUgbm90CisjIHNjYW5uZWQuCisjCisjIFRoZSBzY3JpcHQgY2FuIGJlIGdpdmVuIGFuIGFyZ3VtZW50IHRoYXQgc3BlY2lmeSB0aGUgZmlsZXMgdG8gYmUKKyMgc2VhcmNoZWQgYWNjb3JkaW5nIHRvIHRoZSBmb2xsb3dpbmcgc2NoZW1lOgorIyAgICAtIGlmIHRoZSBhcmd1bWVudCBkb2VzIG5vdCBjb250YWluIGEgc2xhc2ggKC8pLCB0aGUgc2NyaXB0CisjICAgICAgd2lsbCBzZWFyY2ggdGhlIHRyZWUgcm9vdGVkIGluIHRoZSBjdXJyZW50IGRpcmVjdG9yeSBmb3IKKyMgICAgICBmaWxlcyB0aGF0IG1hdGNoIHRoYXQgZGVzY3JpcHRpb24uIFlvdSBjYW4gYWxzbyBwYXNzCisjICAgICAgd2lsZGNhcmQgYXJndW1lbnRzLCBidXQgcmVtZW1iZXIgdG8gcXVvdGUgdGhlbSB0byBwcmV2ZW50CisjICAgICAgZXhwYW5zaW9uIGJ5IHRoZSBzaGVsbAorIyAgICAtIGlmIHRoZSBhcmd1bWVudCBkb2VzIGNvbnRhaW4gYSBzbGFzaCwgb25seSB0aGF0IGZpbGUgaXMKKyMgICAgICBzZWFyY2hlZAorIyAgICAtIGlmIG5vIGFyZ3VtZW50IGlzIGdpdmVuLCB0aGUgYXJndW1lbnQgZGVmYXVsdHMgdG8gIiouYyIKKyMgICAgICB0aGF0IGlzLCBhbGwgQyBmaWxlcyBhcmUgc2VhcmNoZWQuCisjICAgIC0gaWYgbW9yZSB0aGFuIGEgYXJndW1lbnQgaXMgZ2l2ZW4sIG9ubHkgdGhlIGxpc3RlZCBmaWxlcyBhcmUKKyMgICAgICBzZWFyY2hlZC4gTm90ZSB0aGF0IGluIHRoaXMgY2FzZSwgdGhlIHNjcmlwdCB3aWxsIG5vdAorIyAgICAgIGF0dGVtcHQgdG8gZmluZCB0aGVtIGluIHNvbWUgc3ViZGlyZWN0b3JpZXMsIGJ1dCByYXRoZXIKKyMgICAgICBpdCB3aWxsIHRyeSB0byBvcGVuIHRoZW0gaW4gdGhlIGN1cnJlbnQgZGlyZWN0b3J5LgorIyBUaHVzLCBpZiB5b3Ugd2FudCB0byBkaXNhYmxlIHRoZSBhdXRvbWF0aWMgc2VhcmNoaW5nIHdoZW4gdGhlIGZpbGUKKyMgbmFtZSBkb2VzIG5vdCBjb250YWluIGEgLywgZWl0aGVyIHByZWZpeCB0aGUgZmlsZW5hbWUgd2l0aCAuLworIyBvciBhZGQgL2Rldi9udWxsIGFzIGFub3RoZXIgYXJndW1lbnQuCisjCisjIERpbWl0cmllIE8uIFBhdW4gPGRpbWlAY3MudG9yb250by5lZHU+CisjCisKK2Nhc2UgIiQjIiBpbgorICAgIDAgfCAxKSAgZmlsZXM9JHsxOi0nKi5jJ30KKwkgICAgaWYgWyAke2ZpbGVzIyovfSA9ICIkZmlsZXMiIF07IHRoZW4KKwkJZmlsZXM9JChmaW5kIC4gLW5hbWUgIiRmaWxlcyIgLXByaW50KQorCSAgICBmaTs7CisgICAgKiAgICApICBmaWxlcz0iJEAiOzsKK2VzYWMKKworZ3JlcCAtaCBkcHJpbnRmXyAkZmlsZXMgL2Rldi9udWxsIHwgXAorICAgIHNlZCAncy8uKmRwcmludGZfW0EtWmEtejAtOV9dXCsgKiggKlwoW0EtWmEtejAtOV9dKlwpLiovXDEvZycgfCBcCisgICAgc29ydCB8IHVuaXEKZGlmZiAtLWdpdCBhL3Rvb2xzL2ZudDJiZGYuYyBiL3Rvb2xzL2ZudDJiZGYuYwppbmRleCA4MDUzN2JlLi5mNjc4ZTg1IDEwMDY0NAotLS0gYS90b29scy9mbnQyYmRmLmMKKysrIGIvdG9vbHMvZm50MmJkZi5jCkBAIC04MSw3ICs4MSw4IEBACiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICB9Ci0JY2FzZShkZlN0cmluZyk6CisJCWNhc2UoZGZTdHJpbmcpOgorCQkJYnJlYWs7CiAgICAgICAgIH0gCiAgICAgcmV0dXJuIHJldF92YWw7CiB9CmRpZmYgLS1naXQgYS90b29scy9tYWtlX1gxMXdyYXBwZXJzIGIvdG9vbHMvbWFrZV9YMTF3cmFwcGVycwppbmRleCAwZjJkYjBiLi4wOGI0NzBjIDEwMDc1NQotLS0gYS90b29scy9tYWtlX1gxMXdyYXBwZXJzCisrKyBiL3Rvb2xzL21ha2VfWDExd3JhcHBlcnMKQEAgLTc4LDcgKzc4LDYgQEAKIAogJHgxMV9pbmNsI2luY2x1ZGUgPFgxMS8kZXh0ZW5zaW9uc19kaXIkbmFtZS5oPgogI2luY2x1ZGUgIngxMWRydi5oIgotI2luY2x1ZGUgInN0ZGRlYnVnLmgiCiAjaW5jbHVkZSAiZGVidWcuaCIKIEVORAogCkBAIC0yMTIsMTMgKzIxMSwxMyBAQAogIyAgICBwcmludCBPVVRIICIjZGVmaW5lICRmbl9uYW1lIFRTJGZuX25hbWVcbiI7CiAgICAgcHJpbnQgT1VUQyAie1xuIjsKICAgICBwcmludCBPVVRDICIgICRyZXN1bHRkZWNsO1xuIiBpZiAkcmVzdWx0ZGVjbDsKLSAgICBwcmludCBPVVRDICIgIGRwcmludGZfeDExKHN0ZGRlYiwgXCJDYWxsICRmbl9uYW1lXFxuXCIpO1xuIjsKKyAgICBwcmludCBPVVRDICIgIGRwcmludGZfaW5mbyh4MTEsIFwiQ2FsbCAkZm5fbmFtZVxcblwiKTtcbiI7CiAgICAgcHJpbnQgT1VUQyAiICBFbnRlckNyaXRpY2FsU2VjdGlvbiggJlgxMURSVl9Dcml0U2VjdGlvbiApO1xuIjsKICAgICBwcmludCBPVVRDICIgICI7CiAgICAgcHJpbnQgT1VUQyAiciA9ICIgaWYgJHJlc3VsdGRlY2w7CiAgICAgcHJpbnQgT1VUQyAiJGZuX25hbWUoJGFjdHVhbHMpO1xuIjsKICAgICBwcmludCBPVVRDICIgIExlYXZlQ3JpdGljYWxTZWN0aW9uKCAmWDExRFJWX0NyaXRTZWN0aW9uICk7XG4iOwotICAgIHByaW50IE9VVEMgIiAgZHByaW50Zl94MTEoc3RkZGViLCBcIlJldCAkZm5fbmFtZVxcblwiKTtcbiI7CisgICAgcHJpbnQgT1VUQyAiICBkcHJpbnRmX2luZm8oeDExLCBcIlJldCAkZm5fbmFtZVxcblwiKTtcbiI7CiAgICAgcHJpbnQgT1VUQyAiICByZXR1cm4gcjtcbiIgaWYgJHJlc3VsdGRlY2w7CiAgICAgcHJpbnQgT1VUQyAifVxuIjsKICAgICAkd2FudHskZm5fbmFtZX0gPSAyOwpkaWZmIC0tZ2l0IGEvdG9vbHMvbWFrZV9kZWJ1ZyBiL3Rvb2xzL21ha2VfZGVidWcKaW5kZXggZDgzNmYzYi4uNjc0NTFmNiAxMDA3NTUKLS0tIGEvdG9vbHMvbWFrZV9kZWJ1ZworKysgYi90b29scy9tYWtlX2RlYnVnCkBAIC0xLDE2NCArMSw3NSBAQAotIyEvYmluL3NoCisjIS9iaW4vYmFzaAogIwotIyBUaGlzIHNjcmlwdCBzY2FucyB0aGUgd2hvbGUgc291cmNlIGNvZGUgZm9yIHN5bWJvbHMgb2YgdGhlIGZvcm0gZHByaW50Zl94eHgsCi0jIGdlbmVyYXRlcyB0aGUgbmVjZXNzYXJ5IG1hY3JvIGRlZmluaXRpb25zIGFuZCBwdXRzIHRoZW0gaW50byB0aGUgZmlsZXMKLSMgaW5jbHVkZS9zdGRkZWJ1Zy5oIGFuZCBpbmNsdWRlL2RlYnVnLmggLiBUaGlzIHNjcmlwdCBtdXN0IGJlIHN0YXJ0ZWQgd2l0aCAKLSMgY3dkID0gcm9vdGRpciBvZiB0aGUgV2luZS1kaXN0cmlidXRpb24uCisjIFRoaXMgc2NyaXB0IGdlbmVyYXRlcyB0aGUgcmVxdWlyZWQgZmlsZXMgZm9yIHN1cHBvcnRpbmcgdGhlIGRlYnVnCisjIGNoYW5uZWxzIHVzZWQgdGhyb3VnaHQgdGhlIGNvZGUuCisjIFRoZSBnZW5lcmF0ZWQgZmlsZXMgYXJlIAorIyAgIGluY2x1ZGUvZGVidWdkZWZzLmgKKyMgICBpbmNsdWRlL2RlYnVnLmgKKyMgVGhlIHNjcmlwdCBtdXN0IGJlIHJ1biBpbiB0aGUgcm9vdCBkaXJlY3Rvcnkgb2YgdGhlIHByb2plY3QuCiAjCi0jIE1pY2hhZWwgUGF0cmEgIDxtaWNreUBtYXJpZS5waHlzaWsudHUtYmVybGluLmRlPgorIyBEaW1pdHJpZSBPLiBQYXVuIDxkaW1pQGNzLnRvcm9udG8uZWR1PgogIwotREVCVUdfSD1pbmNsdWRlL2RlYnVnLmgKLVNURERFQlVHX0g9aW5jbHVkZS9zdGRkZWJ1Zy5oCitERUJVR19IPSJpbmNsdWRlL2RlYnVnLmgiCitERUJVR19ERUZTX0g9ImluY2x1ZGUvZGVidWdkZWZzLmgiCiAKLW12ICRERUJVR19IICRERUJVR19ILm9sZAotbXYgJFNURERFQlVHX0ggJFNURERFQlVHX0gub2xkCitERUJVR19DSEFOTkVMUz0iJCggdG9vbHMvZmluZF9kZWJ1Z19jaGFubmVscyApIgogCi0jIEJ1aWxkIHRoZSBsaXN0IG9mIGRlYnVnIGlkZW50aWZpZXJzCi1ncmVwIC1oIGRwcmludGZfIGBmaW5kIC4gLW5hbWUgJyouYycgLXByaW50YCB8IFwKLSAgICBzZWQgJ3MvLipkcHJpbnRmX1woW0EtWmEtejAtOV9dKlwpLiovXDEvZycgfCBzb3J0IHwgdW5pcSA+IHRlbXAuJCQKLQotIyBCdWlsZCBkZWJ1Zy5oCi0KLXNlZCAnL15cL1wqIERvIG5vdCByZW1vdmUgdGhpcyBsaW5lIG9yIGNoYW5nZSBhbnl0aGluZyBiZWxvdyB0aGlzIGxpbmUgXCpcLy9xJ1wKLSAgICAgIDwkREVCVUdfSC5vbGQgPiRERUJVR19ICi1jYXQgPDwrK0VPRisrID4+ICRERUJVR19ICi0KLSNpZmRlZiBERUJVR19OT05FX0VYVAotKytFT0YrKwotCi1jYXQgdGVtcC4kJCB8IHRyIGEteiBBLVogfAogewotd2hpbGUgcmVhZCB4Ci1kbwotCWVjaG8gIiN1bmRlZiBERUJVR18keCIgPj4gJERFQlVHX0gKLWRvbmUKLX0KKyAgICBjYXQgPDxFT0YKKy8qIERvIG5vdCBtb2RpZnkgdGhpcyBmaWxlIC0tIGl0IGlzIGF1dG9tYXRpY2FsbHkgZ2VuZXJhdGVkISAqLwogCi1jYXQgPDwrK0VPRisrID4+JERFQlVHX0gKKyNpZm5kZWYgX19ERUJVR1RPT0xTX0gKKyNpbmNsdWRlICJkZWJ1Z3Rvb2xzLmgiCiAjZW5kaWYKIAotI2lmZGVmIERFQlVHX0FMTF9FWFQKLSsrRU9GKysKLQotY2F0IHRlbXAuJCQgfCB0ciBhLXogQS1aIHwKLXsKLXdoaWxlIHJlYWQgeAotZG8KLQllY2hvICIjZGVmaW5lIERFQlVHXyR4IiA+PiAkREVCVUdfSAotZG9uZQotfQotCi1jYXQgPDwrK0VPRisrID4+JERFQlVHX0gKLSNlbmRpZgotCi0jaWZkZWYgREVCVUdfUlVOVElNRQotI2lmZGVmIERFQlVHX0RFRklORV9WQVJJQUJMRVMKLXNob3J0IGRlYnVnX21zZ19lbmFibGVkW109ewotKytFT0YrKwotCi1jYXQgdGVtcC4kJCB8IHRyIGEteiBBLVogfAotewotd2hpbGUgcmVhZCB4Ci1kbwotCWNhdCA8PCsrRU9GKysgPj4kREVCVUdfSAotI2lmZGVmIERFQlVHXyR4Ci0gICAgMSwKLSNlbHNlCi0gICAgMCwKLSNlbmRpZgotKytFT0YrKwotCi1kb25lCi19Ci0KLWNhdCA8PCsrRU9GKysgPj4kREVCVUdfSAotICAgIDAKLX07Ci0jZWxzZQotZXh0ZXJuIHNob3J0IGRlYnVnX21zZ19lbmFibGVkW107Ci0jZW5kaWYKLSNlbmRpZgotCi0rK0VPRisrCi0KLWk9MAotY2F0IHRlbXAuJCQgfAotewotd2hpbGUgcmVhZCB4IAotZG8KLQl5PWBlY2hvICR4IHwgdHIgYS16IEEtWmAKLQljYXQgPDwrK0VPRisrID4+JERFQlVHX0gKLSNpZmRlZiBERUJVR19SVU5USU1FCi0jZGVmaW5lIGRwcmludGZfJHggaWYoIWRlYnVnX21zZ19lbmFibGVkWyRpXSkgOyBlbHNlIGZwcmludGYKLSNkZWZpbmUgZGVidWdnaW5nXyR4IGRlYnVnX21zZ19lbmFibGVkWyRpXQotI2Vsc2UKLSNpZmRlZiBERUJVR18keQotI2RlZmluZSBkcHJpbnRmXyR4IGZwcmludGYKLSNkZWZpbmUgZGVidWdnaW5nXyR4IDEKLSNlbHNlCi0jZGVmaW5lIGRwcmludGZfJHggd2hpbGUoMCkgZnByaW50ZgotI2RlZmluZSBkZWJ1Z2dpbmdfJHggMAotI2VuZGlmCi0jZW5kaWYKLQotKytFT0YrKworRU9GCisgICAgaT0wCisgICAgZm9yIGNoIGluICRERUJVR19DSEFOTkVMUworICAgIGRvCisJZWNobyAiI2RlZmluZSBkYmNoXyR7Y2h9ICRpIgogCWxldCBpPSRpKzEKLWRvbmUKLX0KKyAgICBkb25lCit9ID4gJERFQlVHX0gKIAotY2F0IDw8KytFT0YrKyA+PiRERUJVR19ICisjIE5vdywgb24gdGhlIGxhc3Qgc3RlcCwgd2UgcHJvY2VlZCB0byBjb25zdHJ1Y3QKKyMgdGhlIGRlZmluaXRpb25zIHRvIGJlIHVzZWQgYnkgdGhlIG1haW4gZnVuY3Rpb24uCisjIFRoZXNlIHdpbGwgYmUgc3RvcmVkIGluIGluY2x1ZGUvZGVidWdkZWZzLmgKK3sKKyAgICBjYXQgPDxFT0YKKy8qIERvIG5vdCBtb2RpZnkgdGhpcyBmaWxlIC0tIGl0IGlzIGF1dG9tYXRpY2FsbHkgZ2VuZXJhdGVkISAqLwogCisjaWZuZGVmIF9fREVCVUdUT09MU19ICisjaW5jbHVkZSAiZGVidWd0b29scy5oIgorI2VuZGlmCisKKyNkZWZpbmUgREVCVUdfQ0hBTk5FTF9DT1VOVCAkaQogI2lmZGVmIERFQlVHX1JVTlRJTUUKLSNpZmRlZiBERUJVR19ERUZJTkVfVkFSSUFCTEVTCi1zdGF0aWMgY2hhciAqZGVidWdfbXNnX25hbWVbXSA9IHsKLSsrRU9GKysKK3Nob3J0IGRlYnVnX21zZ19lbmFibGVkW11bREVCVUdfQ0xBU1NfQ09VTlRdID0geworRU9GCiAKLWNhdCB0ZW1wLiQkIHwgCi17Ci13aGlsZSByZWFkIHgKLWRvCi0JZWNobyAiICAgIFwiJHhcIiwiID4+ICRERUJVR19ICi1kb25lCi19CisgICAgZm9yIGNoIGluICRERUJVR19DSEFOTkVMUworICAgIGRvCisJZWNobyAiezEsIDEsIDAsIDB9LCIKKyAgICBkb25lCisgICAgZWNobyAnfTsnCiAKLWNhdCA8PCsrRU9GKysgPj4kREVCVUdfSAotICAgICIiCi19OwotI2VuZGlmCi0jZW5kaWYKLSsrRU9GKysKKyAgICBlY2hvICdjb25zdCBjaGFyKiBkZWJ1Z19jaF9uYW1lW10gPSB7JworICAgIGZvciBjaCBpbiAkREVCVUdfQ0hBTk5FTFMKKyAgICBkbworCWVjaG8gIlwiJHtjaH1cIiwiCisgICAgZG9uZQorICAgIGVjaG8gJ307JworICAgIAorICAgIGNhdCA8PEVPRgogCi0jIEJ1aWxkIHN0ZGRlYnVnLmgKK2NvbnN0IGNoYXIqIGRlYnVnX2NsX25hbWVbXSA9Cit7ICJmaXhtZSIsICJlcnIiLCAid2FybiIsICJpbmZvIiB9OwogCi1zZWQgJy9eXC9cKiBEbyBub3QgcmVtb3ZlIHRoaXMgbGluZSBvciBjaGFuZ2UgYW55dGhpbmcgYmVsb3cgdGhpcyBsaW5lIFwqXC8vcSdcCi0gICAgICA8JFNURERFQlVHX0gub2xkID4kU1REREVCVUdfSAorI2VuZGlmIC8qREVCVUdfUlVOVElNRSovCiAKLWNhdCA8PCsrRU9GKysgPj4kU1REREVCVUdfSAorLyogZW5kIG9mIGF1dG9tYXRpY2FsbHkgZ2VuZXJhdGVkIGRlYnVnLmggKi8KK0VPRgogCi0jaWZkZWYgREVCVUdfTk9ORQotKytFT0YrKworfSA+ICRERUJVR19ERUZTX0gKIAotY2F0IHRlbXAuJCQgfCB0ciBhLXogQS1aIHwKLXsKLXdoaWxlIHJlYWQgeAotZG8KLQllY2hvICIjdW5kZWYgREVCVUdfJHgiID4+ICRTVERERUJVR19ICi1kb25lCi19CiAKLWNhdCA8PCsrRU9GKysgPj4kU1REREVCVUdfSAotI2VuZGlmCi0KLSNpZmRlZiBERUJVR19BTEwKLSsrRU9GKysKLQotY2F0IHRlbXAuJCQgfCB0ciBhLXogQS1aIHwKLXsKLXdoaWxlIHJlYWQgeAotZG8KLQllY2hvICIjZGVmaW5lIERFQlVHXyR4IiA+PiAkU1REREVCVUdfSAotZG9uZQotfQotZWNobyAiI2VuZGlmIiA+PiAkU1REREVCVUdfSAotCi1ybSB0ZW1wLiQkICRERUJVR19ILm9sZCAkU1REREVCVUdfSC5vbGQKZGlmZiAtLWdpdCBhL3RzeDExL3RzX3hsaWIuYyBiL3RzeDExL3RzX3hsaWIuYwppbmRleCA3NjVlNTJkLi5kODFjYmRmIDEwMDY0NAotLS0gYS90c3gxMS90c194bGliLmMKKysrIGIvdHN4MTEvdHNfeGxpYi5jCkBAIC02LDEyNTggKzYsMTI1NyBAQAogCiAjaW5jbHVkZSA8WDExL1hsaWIuaD4KICNpbmNsdWRlICJ4MTFkcnYuaCIKLSNpbmNsdWRlICJzdGRkZWJ1Zy5oIgogI2luY2x1ZGUgImRlYnVnLmgiCiAKIFhGb250U3RydWN0ICogVFNYTG9hZFF1ZXJ5Rm9udChEaXNwbGF5KiBhMCwgY29uc3QgIGNoYXIqIGExKQogewogICBYRm9udFN0cnVjdCAqIHI7Ci0gIGRwcmludGZfeDExKHN0ZGRlYiwgIkNhbGwgWExvYWRRdWVyeUZvbnRcbiIpOworICBkcHJpbnRmX2luZm8oeDExLCAiQ2FsbCBYTG9hZFF1ZXJ5Rm9udFxuIik7CiAgIEVudGVyQ3JpdGljYWxTZWN0aW9uKCAmWDExRFJWX0NyaXRTZWN0aW9uICk7CiAgIHIgPSBYTG9hZFF1ZXJ5Rm9udChhMCwgYTEpOwogICBMZWF2ZUNyaXRpY2FsU2VjdGlvbiggJlgxMURSVl9Dcml0U2VjdGlvbiApOwotICBkcHJpbnRmX3gxMShzdGRkZWIsICJSZXQgWExvYWRRdWVyeUZvbnRcbiIpOworICBkcHJpbnRmX2luZm8oeDExLCAiUmV0IFhMb2FkUXVlcnlGb250XG4iKTsKICAgcmV0dXJuIHI7CiB9CiAKIFhNb2RpZmllcktleW1hcAkqIFRTWEdldE1vZGlmaWVyTWFwcGluZyhEaXNwbGF5KiBhMCkKIHsKICAgWE1vZGlmaWVyS2V5bWFwCSogcjsKLSAgZHByaW50Zl94MTEoc3RkZGViLCAiQ2FsbCBYR2V0TW9kaWZpZXJNYXBwaW5nXG4iKTsKKyAgZHByaW50Zl9pbmZvKHgxMSwgIkNhbGwgWEdldE1vZGlmaWVyTWFwcGluZ1xuIik7CiAgIEVudGVyQ3JpdGljYWxTZWN0aW9uKCAmWDExRFJWX0NyaXRTZWN0aW9uICk7CiAgIHIgPSBYR2V0TW9kaWZpZXJNYXBwaW5nKGEwKTsKICAgTGVhdmVDcml0aWNhbFNlY3Rpb24oICZYMTFEUlZfQ3JpdFNlY3Rpb24gKTsKLSAgZHByaW50Zl94MTEoc3RkZGViLCAiUmV0IFhHZXRNb2RpZmllck1hcHBpbmdcbiIpOworICBkcHJpbnRmX2luZm8oeDExLCAiUmV0IFhHZXRNb2RpZmllck1hcHBpbmdcbiIpOwogICByZXR1cm4gcjsKIH0KIAogWEltYWdlICogVFNYQ3JlYXRlSW1hZ2UoRGlzcGxheSogYTAsIFZpc3VhbCogYTEsIHVuc2lnbmVkIGludCBhMiwgaW50IGEzLCBpbnQgYTQsIGNoYXIqIGE1LCB1bnNpZ25lZCBpbnQgYTYsIHVuc2lnbmVkIGludCBhNywgaW50IGE4LCBpbnQgYTkpCiB7CiAgIFhJbWFnZSAqIHI7Ci0gIGRwcmludGZfeDExKHN0ZGRlYiwgIkNhbGwgWENyZWF0ZUltYWdlXG4iKTsKKyAgZHByaW50Zl9pbmZvKHgxMSwgIkNhbGwgWENyZWF0ZUltYWdlXG4iKTsKICAgRW50ZXJDcml0aWNhbFNlY3Rpb24oICZYMTFEUlZfQ3JpdFNlY3Rpb24gKTsKICAgciA9IFhDcmVhdGVJbWFnZShhMCwgYTEsIGEyLCBhMywgYTQsIGE1LCBhNiwgYTcsIGE4LCBhOSk7CiAgIExlYXZlQ3JpdGljYWxTZWN0aW9uKCAmWDExRFJWX0NyaXRTZWN0aW9uICk7Ci0gIGRwcmludGZfeDExKHN0ZGRlYiwgIlJldCBYQ3JlYXRlSW1hZ2VcbiIpOworICBkcHJpbnRmX2luZm8oeDExLCAiUmV0IFhDcmVhdGVJbWFnZVxuIik7CiAgIHJldHVybiByOwogfQogCiBYSW1hZ2UgKiBUU1hHZXRJbWFnZShEaXNwbGF5KiBhMCwgRHJhd2FibGUgYTEsIGludCBhMiwgaW50IGEzLCB1bnNpZ25lZCBpbnQgYTQsIHVuc2lnbmVkIGludCBhNSwgdW5zaWduZWQgbG9uZyBhNiwgaW50IGE3KQogewogICBYSW1hZ2UgKiByOwotICBkcHJpbnRmX3gxMShzdGRkZWIsICJDYWxsIFhHZXRJbWFnZVxuIik7CisgIGRwcmludGZfaW5mbyh4MTEsICJDYWxsIFhHZXRJbWFnZVxuIik7CiAgIEVudGVyQ3JpdGljYWxTZWN0aW9uKCAmWDExRFJWX0NyaXRTZWN0aW9uICk7CiAgIHIgPSBYR2V0SW1hZ2UoYTAsIGExLCBhMiwgYTMsIGE0LCBhNSwgYTYsIGE3KTsKICAgTGVhdmVDcml0aWNhbFNlY3Rpb24oICZYMTFEUlZfQ3JpdFNlY3Rpb24gKTsKLSAgZHByaW50Zl94MTEoc3RkZGViLCAiUmV0IFhHZXRJbWFnZVxuIik7CisgIGRwcmludGZfaW5mbyh4MTEsICJSZXQgWEdldEltYWdlXG4iKTsKICAgcmV0dXJuIHI7CiB9CiAKIERpc3BsYXkgKiBUU1hPcGVuRGlzcGxheShjb25zdCAgY2hhciogYTApCiB7CiAgIERpc3BsYXkgKiByOwotICBkcHJpbnRmX3gxMShzdGRkZWIsICJDYWxsIFhPcGVuRGlzcGxheVxuIik7CisgIGRwcmludGZfaW5mbyh4MTEsICJDYWxsIFhPcGVuRGlzcGxheVxuIik7CiAgIEVudGVyQ3JpdGljYWxTZWN0aW9uKCAmWDExRFJWX0NyaXRTZWN0aW9uICk7CiAgIHIgPSBYT3BlbkRpc3BsYXkoYTApOwogICBMZWF2ZUNyaXRpY2FsU2VjdGlvbiggJlgxMURSVl9Dcml0U2VjdGlvbiApOwotICBkcHJpbnRmX3gxMShzdGRkZWIsICJSZXQgWE9wZW5EaXNwbGF5XG4iKTsKKyAgZHByaW50Zl9pbmZvKHgxMSwgIlJldCBYT3BlbkRpc3BsYXlcbiIpOwogICByZXR1cm4gcjsKIH0KIAogdm9pZCAgVFNYcm1Jbml0aWFsaXplKHZvaWQpCiB7Ci0gIGRwcmludGZfeDExKHN0ZGRlYiwgIkNhbGwgWHJtSW5pdGlhbGl6ZVxuIik7CisgIGRwcmludGZfaW5mbyh4MTEsICJDYWxsIFhybUluaXRpYWxpemVcbiIpOwogICBFbnRlckNyaXRpY2FsU2VjdGlvbiggJlgxMURSVl9Dcml0U2VjdGlvbiApOwogICBYcm1Jbml0aWFsaXplKCk7CiAgIExlYXZlQ3JpdGljYWxTZWN0aW9uKCAmWDExRFJWX0NyaXRTZWN0aW9uICk7Ci0gIGRwcmludGZfeDExKHN0ZGRlYiwgIlJldCBYcm1Jbml0aWFsaXplXG4iKTsKKyAgZHByaW50Zl9pbmZvKHgxMSwgIlJldCBYcm1Jbml0aWFsaXplXG4iKTsKIH0KIAogY2hhciAqIFRTWEdldEF0b21OYW1lKERpc3BsYXkqIGEwLCBBdG9tIGExKQogewogICBjaGFyICogcjsKLSAgZHByaW50Zl94MTEoc3RkZGViLCAiQ2FsbCBYR2V0QXRvbU5hbWVcbiIpOworICBkcHJpbnRmX2luZm8oeDExLCAiQ2FsbCBYR2V0QXRvbU5hbWVcbiIpOwogICBFbnRlckNyaXRpY2FsU2VjdGlvbiggJlgxMURSVl9Dcml0U2VjdGlvbiApOwogICByID0gWEdldEF0b21OYW1lKGEwLCBhMSk7CiAgIExlYXZlQ3JpdGljYWxTZWN0aW9uKCAmWDExRFJWX0NyaXRTZWN0aW9uICk7Ci0gIGRwcmludGZfeDExKHN0ZGRlYiwgIlJldCBYR2V0QXRvbU5hbWVcbiIpOworICBkcHJpbnRmX2luZm8oeDExLCAiUmV0IFhHZXRBdG9tTmFtZVxuIik7CiAgIHJldHVybiByOwogfQogCiBjaGFyICogVFNYS2V5c3ltVG9TdHJpbmcoS2V5U3ltIGEwKQogewogICBjaGFyICogcjsKLSAgZHByaW50Zl94MTEoc3RkZGViLCAiQ2FsbCBYS2V5c3ltVG9TdHJpbmdcbiIpOworICBkcHJpbnRmX2luZm8oeDExLCAiQ2FsbCBYS2V5c3ltVG9TdHJpbmdcbiIpOwogICBFbnRlckNyaXRpY2FsU2VjdGlvbiggJlgxMURSVl9Dcml0U2VjdGlvbiApOwogICByID0gWEtleXN5bVRvU3RyaW5nKGEwKTsKICAgTGVhdmVDcml0aWNhbFNlY3Rpb24oICZYMTFEUlZfQ3JpdFNlY3Rpb24gKTsKLSAgZHByaW50Zl94MTEoc3RkZGViLCAiUmV0IFhLZXlzeW1Ub1N0cmluZ1xuIik7CisgIGRwcmludGZfaW5mbyh4MTEsICJSZXQgWEtleXN5bVRvU3RyaW5nXG4iKTsKICAgcmV0dXJuIHI7CiB9CiAKIEF0b20gIFRTWEludGVybkF0b20oRGlzcGxheSogYTAsIGNvbnN0ICBjaGFyKiBhMSwgaW50IGEyKQogewogICBBdG9tICByOwotICBkcHJpbnRmX3gxMShzdGRkZWIsICJDYWxsIFhJbnRlcm5BdG9tXG4iKTsKKyAgZHByaW50Zl9pbmZvKHgxMSwgIkNhbGwgWEludGVybkF0b21cbiIpOwogICBFbnRlckNyaXRpY2FsU2VjdGlvbiggJlgxMURSVl9Dcml0U2VjdGlvbiApOwogICByID0gWEludGVybkF0b20oYTAsIGExLCBhMik7CiAgIExlYXZlQ3JpdGljYWxTZWN0aW9uKCAmWDExRFJWX0NyaXRTZWN0aW9uICk7Ci0gIGRwcmludGZfeDExKHN0ZGRlYiwgIlJldCBYSW50ZXJuQXRvbVxuIik7CisgIGRwcmludGZfaW5mbyh4MTEsICJSZXQgWEludGVybkF0b21cbiIpOwogICByZXR1cm4gcjsKIH0KIAogQ29sb3JtYXAgIFRTWENyZWF0ZUNvbG9ybWFwKERpc3BsYXkqIGEwLCBXaW5kb3cgYTEsIFZpc3VhbCogYTIsIGludCBhMykKIHsKICAgQ29sb3JtYXAgIHI7Ci0gIGRwcmludGZfeDExKHN0ZGRlYiwgIkNhbGwgWENyZWF0ZUNvbG9ybWFwXG4iKTsKKyAgZHByaW50Zl9pbmZvKHgxMSwgIkNhbGwgWENyZWF0ZUNvbG9ybWFwXG4iKTsKICAgRW50ZXJDcml0aWNhbFNlY3Rpb24oICZYMTFEUlZfQ3JpdFNlY3Rpb24gKTsKICAgciA9IFhDcmVhdGVDb2xvcm1hcChhMCwgYTEsIGEyLCBhMyk7CiAgIExlYXZlQ3JpdGljYWxTZWN0aW9uKCAmWDExRFJWX0NyaXRTZWN0aW9uICk7Ci0gIGRwcmludGZfeDExKHN0ZGRlYiwgIlJldCBYQ3JlYXRlQ29sb3JtYXBcbiIpOworICBkcHJpbnRmX2luZm8oeDExLCAiUmV0IFhDcmVhdGVDb2xvcm1hcFxuIik7CiAgIHJldHVybiByOwogfQogCiBDdXJzb3IgIFRTWENyZWF0ZVBpeG1hcEN1cnNvcihEaXNwbGF5KiBhMCwgUGl4bWFwIGExLCBQaXhtYXAgYTIsIFhDb2xvciogYTMsIFhDb2xvciogYTQsIHVuc2lnbmVkIGludCBhNSwgdW5zaWduZWQgaW50IGE2KQogewogICBDdXJzb3IgIHI7Ci0gIGRwcmludGZfeDExKHN0ZGRlYiwgIkNhbGwgWENyZWF0ZVBpeG1hcEN1cnNvclxuIik7CisgIGRwcmludGZfaW5mbyh4MTEsICJDYWxsIFhDcmVhdGVQaXhtYXBDdXJzb3JcbiIpOwogICBFbnRlckNyaXRpY2FsU2VjdGlvbiggJlgxMURSVl9Dcml0U2VjdGlvbiApOwogICByID0gWENyZWF0ZVBpeG1hcEN1cnNvcihhMCwgYTEsIGEyLCBhMywgYTQsIGE1LCBhNik7CiAgIExlYXZlQ3JpdGljYWxTZWN0aW9uKCAmWDExRFJWX0NyaXRTZWN0aW9uICk7Ci0gIGRwcmludGZfeDExKHN0ZGRlYiwgIlJldCBYQ3JlYXRlUGl4bWFwQ3Vyc29yXG4iKTsKKyAgZHByaW50Zl9pbmZvKHgxMSwgIlJldCBYQ3JlYXRlUGl4bWFwQ3Vyc29yXG4iKTsKICAgcmV0dXJuIHI7CiB9CiAKIEN1cnNvciAgVFNYQ3JlYXRlRm9udEN1cnNvcihEaXNwbGF5KiBhMCwgdW5zaWduZWQgaW50IGExKQogewogICBDdXJzb3IgIHI7Ci0gIGRwcmludGZfeDExKHN0ZGRlYiwgIkNhbGwgWENyZWF0ZUZvbnRDdXJzb3JcbiIpOworICBkcHJpbnRmX2luZm8oeDExLCAiQ2FsbCBYQ3JlYXRlRm9udEN1cnNvclxuIik7CiAgIEVudGVyQ3JpdGljYWxTZWN0aW9uKCAmWDExRFJWX0NyaXRTZWN0aW9uICk7CiAgIHIgPSBYQ3JlYXRlRm9udEN1cnNvcihhMCwgYTEpOwogICBMZWF2ZUNyaXRpY2FsU2VjdGlvbiggJlgxMURSVl9Dcml0U2VjdGlvbiApOwotICBkcHJpbnRmX3gxMShzdGRkZWIsICJSZXQgWENyZWF0ZUZvbnRDdXJzb3JcbiIpOworICBkcHJpbnRmX2luZm8oeDExLCAiUmV0IFhDcmVhdGVGb250Q3Vyc29yXG4iKTsKICAgcmV0dXJuIHI7CiB9CiAKIEdDICBUU1hDcmVhdGVHQyhEaXNwbGF5KiBhMCwgRHJhd2FibGUgYTEsIHVuc2lnbmVkIGxvbmcgYTIsIFhHQ1ZhbHVlcyogYTMpCiB7CiAgIEdDICByOwotICBkcHJpbnRmX3gxMShzdGRkZWIsICJDYWxsIFhDcmVhdGVHQ1xuIik7CisgIGRwcmludGZfaW5mbyh4MTEsICJDYWxsIFhDcmVhdGVHQ1xuIik7CiAgIEVudGVyQ3JpdGljYWxTZWN0aW9uKCAmWDExRFJWX0NyaXRTZWN0aW9uICk7CiAgIHIgPSBYQ3JlYXRlR0MoYTAsIGExLCBhMiwgYTMpOwogICBMZWF2ZUNyaXRpY2FsU2VjdGlvbiggJlgxMURSVl9Dcml0U2VjdGlvbiApOwotICBkcHJpbnRmX3gxMShzdGRkZWIsICJSZXQgWENyZWF0ZUdDXG4iKTsKKyAgZHByaW50Zl9pbmZvKHgxMSwgIlJldCBYQ3JlYXRlR0NcbiIpOwogICByZXR1cm4gcjsKIH0KIAogUGl4bWFwICBUU1hDcmVhdGVQaXhtYXAoRGlzcGxheSogYTAsIERyYXdhYmxlIGExLCB1bnNpZ25lZCBpbnQgYTIsIHVuc2lnbmVkIGludCBhMywgdW5zaWduZWQgaW50IGE0KQogewogICBQaXhtYXAgIHI7Ci0gIGRwcmludGZfeDExKHN0ZGRlYiwgIkNhbGwgWENyZWF0ZVBpeG1hcFxuIik7CisgIGRwcmludGZfaW5mbyh4MTEsICJDYWxsIFhDcmVhdGVQaXhtYXBcbiIpOwogICBFbnRlckNyaXRpY2FsU2VjdGlvbiggJlgxMURSVl9Dcml0U2VjdGlvbiApOwogICByID0gWENyZWF0ZVBpeG1hcChhMCwgYTEsIGEyLCBhMywgYTQpOwogICBMZWF2ZUNyaXRpY2FsU2VjdGlvbiggJlgxMURSVl9Dcml0U2VjdGlvbiApOwotICBkcHJpbnRmX3gxMShzdGRkZWIsICJSZXQgWENyZWF0ZVBpeG1hcFxuIik7CisgIGRwcmludGZfaW5mbyh4MTEsICJSZXQgWENyZWF0ZVBpeG1hcFxuIik7CiAgIHJldHVybiByOwogfQogCiBQaXhtYXAgIFRTWENyZWF0ZUJpdG1hcEZyb21EYXRhKERpc3BsYXkqIGEwLCBEcmF3YWJsZSBhMSwgY29uc3QgIGNoYXIqIGEyLCB1bnNpZ25lZCBpbnQgYTMsIHVuc2lnbmVkIGludCBhNCkKIHsKICAgUGl4bWFwICByOwotICBkcHJpbnRmX3gxMShzdGRkZWIsICJDYWxsIFhDcmVhdGVCaXRtYXBGcm9tRGF0YVxuIik7CisgIGRwcmludGZfaW5mbyh4MTEsICJDYWxsIFhDcmVhdGVCaXRtYXBGcm9tRGF0YVxuIik7CiAgIEVudGVyQ3JpdGljYWxTZWN0aW9uKCAmWDExRFJWX0NyaXRTZWN0aW9uICk7CiAgIHIgPSBYQ3JlYXRlQml0bWFwRnJvbURhdGEoYTAsIGExLCBhMiwgYTMsIGE0KTsKICAgTGVhdmVDcml0aWNhbFNlY3Rpb24oICZYMTFEUlZfQ3JpdFNlY3Rpb24gKTsKLSAgZHByaW50Zl94MTEoc3RkZGViLCAiUmV0IFhDcmVhdGVCaXRtYXBGcm9tRGF0YVxuIik7CisgIGRwcmludGZfaW5mbyh4MTEsICJSZXQgWENyZWF0ZUJpdG1hcEZyb21EYXRhXG4iKTsKICAgcmV0dXJuIHI7CiB9CiAKIFdpbmRvdyAgVFNYR2V0U2VsZWN0aW9uT3duZXIoRGlzcGxheSogYTAsIEF0b20gYTEpCiB7CiAgIFdpbmRvdyAgcjsKLSAgZHByaW50Zl94MTEoc3RkZGViLCAiQ2FsbCBYR2V0U2VsZWN0aW9uT3duZXJcbiIpOworICBkcHJpbnRmX2luZm8oeDExLCAiQ2FsbCBYR2V0U2VsZWN0aW9uT3duZXJcbiIpOwogICBFbnRlckNyaXRpY2FsU2VjdGlvbiggJlgxMURSVl9Dcml0U2VjdGlvbiApOwogICByID0gWEdldFNlbGVjdGlvbk93bmVyKGEwLCBhMSk7CiAgIExlYXZlQ3JpdGljYWxTZWN0aW9uKCAmWDExRFJWX0NyaXRTZWN0aW9uICk7Ci0gIGRwcmludGZfeDExKHN0ZGRlYiwgIlJldCBYR2V0U2VsZWN0aW9uT3duZXJcbiIpOworICBkcHJpbnRmX2luZm8oeDExLCAiUmV0IFhHZXRTZWxlY3Rpb25Pd25lclxuIik7CiAgIHJldHVybiByOwogfQogCiBXaW5kb3cgIFRTWENyZWF0ZVdpbmRvdyhEaXNwbGF5KiBhMCwgV2luZG93IGExLCBpbnQgYTIsIGludCBhMywgdW5zaWduZWQgaW50IGE0LCB1bnNpZ25lZCBpbnQgYTUsIHVuc2lnbmVkIGludCBhNiwgaW50IGE3LCB1bnNpZ25lZCBpbnQgYTgsIFZpc3VhbCogYTksIHVuc2lnbmVkIGxvbmcgYTEwLCBYU2V0V2luZG93QXR0cmlidXRlcyogYTExKQogewogICBXaW5kb3cgIHI7Ci0gIGRwcmludGZfeDExKHN0ZGRlYiwgIkNhbGwgWENyZWF0ZVdpbmRvd1xuIik7CisgIGRwcmludGZfaW5mbyh4MTEsICJDYWxsIFhDcmVhdGVXaW5kb3dcbiIpOwogICBFbnRlckNyaXRpY2FsU2VjdGlvbiggJlgxMURSVl9Dcml0U2VjdGlvbiApOwogICByID0gWENyZWF0ZVdpbmRvdyhhMCwgYTEsIGEyLCBhMywgYTQsIGE1LCBhNiwgYTcsIGE4LCBhOSwgYTEwLCBhMTEpOwogICBMZWF2ZUNyaXRpY2FsU2VjdGlvbiggJlgxMURSVl9Dcml0U2VjdGlvbiApOwotICBkcHJpbnRmX3gxMShzdGRkZWIsICJSZXQgWENyZWF0ZVdpbmRvd1xuIik7CisgIGRwcmludGZfaW5mbyh4MTEsICJSZXQgWENyZWF0ZVdpbmRvd1xuIik7CiAgIHJldHVybiByOwogfQogCiBjaGFyICoqIFRTWExpc3RGb250cyhEaXNwbGF5KiBhMCwgY29uc3QgIGNoYXIqIGExLCBpbnQgYTIsIGludCogYTMpCiB7CiAgIGNoYXIgKiogcjsKLSAgZHByaW50Zl94MTEoc3RkZGViLCAiQ2FsbCBYTGlzdEZvbnRzXG4iKTsKKyAgZHByaW50Zl9pbmZvKHgxMSwgIkNhbGwgWExpc3RGb250c1xuIik7CiAgIEVudGVyQ3JpdGljYWxTZWN0aW9uKCAmWDExRFJWX0NyaXRTZWN0aW9uICk7CiAgIHIgPSBYTGlzdEZvbnRzKGEwLCBhMSwgYTIsIGEzKTsKICAgTGVhdmVDcml0aWNhbFNlY3Rpb24oICZYMTFEUlZfQ3JpdFNlY3Rpb24gKTsKLSAgZHByaW50Zl94MTEoc3RkZGViLCAiUmV0IFhMaXN0Rm9udHNcbiIpOworICBkcHJpbnRmX2luZm8oeDExLCAiUmV0IFhMaXN0Rm9udHNcbiIpOwogICByZXR1cm4gcjsKIH0KIAogS2V5U3ltICBUU1hLZXljb2RlVG9LZXlzeW0oRGlzcGxheSogYTAsIHVuc2lnbmVkIGludCBhMSwgaW50IGEyKQogewogICBLZXlTeW0gIHI7Ci0gIGRwcmludGZfeDExKHN0ZGRlYiwgIkNhbGwgWEtleWNvZGVUb0tleXN5bVxuIik7CisgIGRwcmludGZfaW5mbyh4MTEsICJDYWxsIFhLZXljb2RlVG9LZXlzeW1cbiIpOwogICBFbnRlckNyaXRpY2FsU2VjdGlvbiggJlgxMURSVl9Dcml0U2VjdGlvbiApOwogICByID0gWEtleWNvZGVUb0tleXN5bShhMCwgYTEsIGEyKTsKICAgTGVhdmVDcml0aWNhbFNlY3Rpb24oICZYMTFEUlZfQ3JpdFNlY3Rpb24gKTsKLSAgZHByaW50Zl94MTEoc3RkZGViLCAiUmV0IFhLZXljb2RlVG9LZXlzeW1cbiIpOworICBkcHJpbnRmX2luZm8oeDExLCAiUmV0IFhLZXljb2RlVG9LZXlzeW1cbiIpOwogICByZXR1cm4gcjsKIH0KIAogS2V5U3ltICBUU1hMb29rdXBLZXlzeW0oWEtleUV2ZW50KiBhMCwgaW50IGExKQogewogICBLZXlTeW0gIHI7Ci0gIGRwcmludGZfeDExKHN0ZGRlYiwgIkNhbGwgWExvb2t1cEtleXN5bVxuIik7CisgIGRwcmludGZfaW5mbyh4MTEsICJDYWxsIFhMb29rdXBLZXlzeW1cbiIpOwogICBFbnRlckNyaXRpY2FsU2VjdGlvbiggJlgxMURSVl9Dcml0U2VjdGlvbiApOwogICByID0gWExvb2t1cEtleXN5bShhMCwgYTEpOwogICBMZWF2ZUNyaXRpY2FsU2VjdGlvbiggJlgxMURSVl9Dcml0U2VjdGlvbiApOwotICBkcHJpbnRmX3gxMShzdGRkZWIsICJSZXQgWExvb2t1cEtleXN5bVxuIik7CisgIGRwcmludGZfaW5mbyh4MTEsICJSZXQgWExvb2t1cEtleXN5bVxuIik7CiAgIHJldHVybiByOwogfQogCiBLZXlTeW0gKiBUU1hHZXRLZXlib2FyZE1hcHBpbmcoRGlzcGxheSogYTAsIHVuc2lnbmVkIGludCBhMSwgaW50IGEyLCBpbnQqIGEzKQogewogICBLZXlTeW0gKiByOwotICBkcHJpbnRmX3gxMShzdGRkZWIsICJDYWxsIFhHZXRLZXlib2FyZE1hcHBpbmdcbiIpOworICBkcHJpbnRmX2luZm8oeDExLCAiQ2FsbCBYR2V0S2V5Ym9hcmRNYXBwaW5nXG4iKTsKICAgRW50ZXJDcml0aWNhbFNlY3Rpb24oICZYMTFEUlZfQ3JpdFNlY3Rpb24gKTsKICAgciA9IFhHZXRLZXlib2FyZE1hcHBpbmcoYTAsIGExLCBhMiwgYTMpOwogICBMZWF2ZUNyaXRpY2FsU2VjdGlvbiggJlgxMURSVl9Dcml0U2VjdGlvbiApOwotICBkcHJpbnRmX3gxMShzdGRkZWIsICJSZXQgWEdldEtleWJvYXJkTWFwcGluZ1xuIik7CisgIGRwcmludGZfaW5mbyh4MTEsICJSZXQgWEdldEtleWJvYXJkTWFwcGluZ1xuIik7CiAgIHJldHVybiByOwogfQogCiBjaGFyICogVFNYUmVzb3VyY2VNYW5hZ2VyU3RyaW5nKERpc3BsYXkqIGEwKQogewogICBjaGFyICogcjsKLSAgZHByaW50Zl94MTEoc3RkZGViLCAiQ2FsbCBYUmVzb3VyY2VNYW5hZ2VyU3RyaW5nXG4iKTsKKyAgZHByaW50Zl9pbmZvKHgxMSwgIkNhbGwgWFJlc291cmNlTWFuYWdlclN0cmluZ1xuIik7CiAgIEVudGVyQ3JpdGljYWxTZWN0aW9uKCAmWDExRFJWX0NyaXRTZWN0aW9uICk7CiAgIHIgPSBYUmVzb3VyY2VNYW5hZ2VyU3RyaW5nKGEwKTsKICAgTGVhdmVDcml0aWNhbFNlY3Rpb24oICZYMTFEUlZfQ3JpdFNlY3Rpb24gKTsKLSAgZHByaW50Zl94MTEoc3RkZGViLCAiUmV0IFhSZXNvdXJjZU1hbmFnZXJTdHJpbmdcbiIpOworICBkcHJpbnRmX2luZm8oeDExLCAiUmV0IFhSZXNvdXJjZU1hbmFnZXJTdHJpbmdcbiIpOwogICByZXR1cm4gcjsKIH0KIAogaW50ICAgVFNYSW5pdFRocmVhZHModm9pZCkKIHsKICAgaW50ICAgcjsKLSAgZHByaW50Zl94MTEoc3RkZGViLCAiQ2FsbCBYSW5pdFRocmVhZHNcbiIpOworICBkcHJpbnRmX2luZm8oeDExLCAiQ2FsbCBYSW5pdFRocmVhZHNcbiIpOwogICBFbnRlckNyaXRpY2FsU2VjdGlvbiggJlgxMURSVl9Dcml0U2VjdGlvbiApOwogICByID0gWEluaXRUaHJlYWRzKCk7CiAgIExlYXZlQ3JpdGljYWxTZWN0aW9uKCAmWDExRFJWX0NyaXRTZWN0aW9uICk7Ci0gIGRwcmludGZfeDExKHN0ZGRlYiwgIlJldCBYSW5pdFRocmVhZHNcbiIpOworICBkcHJpbnRmX2luZm8oeDExLCAiUmV0IFhJbml0VGhyZWFkc1xuIik7CiAgIHJldHVybiByOwogfQogCiBpbnQgKiBUU1hMaXN0RGVwdGhzKERpc3BsYXkqIGEwLCBpbnQgYTEsIGludCogYTIpCiB7CiAgIGludCAqIHI7Ci0gIGRwcmludGZfeDExKHN0ZGRlYiwgIkNhbGwgWExpc3REZXB0aHNcbiIpOworICBkcHJpbnRmX2luZm8oeDExLCAiQ2FsbCBYTGlzdERlcHRoc1xuIik7CiAgIEVudGVyQ3JpdGljYWxTZWN0aW9uKCAmWDExRFJWX0NyaXRTZWN0aW9uICk7CiAgIHIgPSBYTGlzdERlcHRocyhhMCwgYTEsIGEyKTsKICAgTGVhdmVDcml0aWNhbFNlY3Rpb24oICZYMTFEUlZfQ3JpdFNlY3Rpb24gKTsKLSAgZHByaW50Zl94MTEoc3RkZGViLCAiUmV0IFhMaXN0RGVwdGhzXG4iKTsKKyAgZHByaW50Zl9pbmZvKHgxMSwgIlJldCBYTGlzdERlcHRoc1xuIik7CiAgIHJldHVybiByOwogfQogCiBpbnQgICBUU1hSZWNvbmZpZ3VyZVdNV2luZG93KERpc3BsYXkqIGEwLCBXaW5kb3cgYTEsIGludCBhMiwgdW5zaWduZWQgaW50IGEzLCBYV2luZG93Q2hhbmdlcyogYTQpCiB7CiAgIGludCAgIHI7Ci0gIGRwcmludGZfeDExKHN0ZGRlYiwgIkNhbGwgWFJlY29uZmlndXJlV01XaW5kb3dcbiIpOworICBkcHJpbnRmX2luZm8oeDExLCAiQ2FsbCBYUmVjb25maWd1cmVXTVdpbmRvd1xuIik7CiAgIEVudGVyQ3JpdGljYWxTZWN0aW9uKCAmWDExRFJWX0NyaXRTZWN0aW9uICk7CiAgIHIgPSBYUmVjb25maWd1cmVXTVdpbmRvdyhhMCwgYTEsIGEyLCBhMywgYTQpOwogICBMZWF2ZUNyaXRpY2FsU2VjdGlvbiggJlgxMURSVl9Dcml0U2VjdGlvbiApOwotICBkcHJpbnRmX3gxMShzdGRkZWIsICJSZXQgWFJlY29uZmlndXJlV01XaW5kb3dcbiIpOworICBkcHJpbnRmX2luZm8oeDExLCAiUmV0IFhSZWNvbmZpZ3VyZVdNV2luZG93XG4iKTsKICAgcmV0dXJuIHI7CiB9CiAKIGludCAgIFRTWFNldFdNUHJvdG9jb2xzKERpc3BsYXkqIGEwLCBXaW5kb3cgYTEsIEF0b20qIGEyLCBpbnQgYTMpCiB7CiAgIGludCAgIHI7Ci0gIGRwcmludGZfeDExKHN0ZGRlYiwgIkNhbGwgWFNldFdNUHJvdG9jb2xzXG4iKTsKKyAgZHByaW50Zl9pbmZvKHgxMSwgIkNhbGwgWFNldFdNUHJvdG9jb2xzXG4iKTsKICAgRW50ZXJDcml0aWNhbFNlY3Rpb24oICZYMTFEUlZfQ3JpdFNlY3Rpb24gKTsKICAgciA9IFhTZXRXTVByb3RvY29scyhhMCwgYTEsIGEyLCBhMyk7CiAgIExlYXZlQ3JpdGljYWxTZWN0aW9uKCAmWDExRFJWX0NyaXRTZWN0aW9uICk7Ci0gIGRwcmludGZfeDExKHN0ZGRlYiwgIlJldCBYU2V0V01Qcm90b2NvbHNcbiIpOworICBkcHJpbnRmX2luZm8oeDExLCAiUmV0IFhTZXRXTVByb3RvY29sc1xuIik7CiAgIHJldHVybiByOwogfQogCiBpbnQgIFRTWFNldFRyYW5zaWVudEZvckhpbnQoRGlzcGxheSogYTAsIFdpbmRvdyBhMSwgV2luZG93IGEyKQogewogICBpbnQgIHI7Ci0gIGRwcmludGZfeDExKHN0ZGRlYiwgIkNhbGwgWFNldFRyYW5zaWVudEZvckhpbnRcbiIpOworICBkcHJpbnRmX2luZm8oeDExLCAiQ2FsbCBYU2V0VHJhbnNpZW50Rm9ySGludFxuIik7CiAgIEVudGVyQ3JpdGljYWxTZWN0aW9uKCAmWDExRFJWX0NyaXRTZWN0aW9uICk7CiAgIHIgPSBYU2V0VHJhbnNpZW50Rm9ySGludChhMCwgYTEsIGEyKTsKICAgTGVhdmVDcml0aWNhbFNlY3Rpb24oICZYMTFEUlZfQ3JpdFNlY3Rpb24gKTsKLSAgZHByaW50Zl94MTEoc3RkZGViLCAiUmV0IFhTZXRUcmFuc2llbnRGb3JIaW50XG4iKTsKKyAgZHByaW50Zl9pbmZvKHgxMSwgIlJldCBYU2V0VHJhbnNpZW50Rm9ySGludFxuIik7CiAgIHJldHVybiByOwogfQogCiBpbnQgIFRTWEFjdGl2YXRlU2NyZWVuU2F2ZXIoRGlzcGxheSogYTApCiB7CiAgIGludCAgcjsKLSAgZHByaW50Zl94MTEoc3RkZGViLCAiQ2FsbCBYQWN0aXZhdGVTY3JlZW5TYXZlclxuIik7CisgIGRwcmludGZfaW5mbyh4MTEsICJDYWxsIFhBY3RpdmF0ZVNjcmVlblNhdmVyXG4iKTsKICAgRW50ZXJDcml0aWNhbFNlY3Rpb24oICZYMTFEUlZfQ3JpdFNlY3Rpb24gKTsKICAgciA9IFhBY3RpdmF0ZVNjcmVlblNhdmVyKGEwKTsKICAgTGVhdmVDcml0aWNhbFNlY3Rpb24oICZYMTFEUlZfQ3JpdFNlY3Rpb24gKTsKLSAgZHByaW50Zl94MTEoc3RkZGViLCAiUmV0IFhBY3RpdmF0ZVNjcmVlblNhdmVyXG4iKTsKKyAgZHByaW50Zl9pbmZvKHgxMSwgIlJldCBYQWN0aXZhdGVTY3JlZW5TYXZlclxuIik7CiAgIHJldHVybiByOwogfQogCiBpbnQgICBUU1hBbGxvY0NvbG9yKERpc3BsYXkqIGEwLCBDb2xvcm1hcCBhMSwgWENvbG9yKiBhMikKIHsKICAgaW50ICAgcjsKLSAgZHByaW50Zl94MTEoc3RkZGViLCAiQ2FsbCBYQWxsb2NDb2xvclxuIik7CisgIGRwcmludGZfaW5mbyh4MTEsICJDYWxsIFhBbGxvY0NvbG9yXG4iKTsKICAgRW50ZXJDcml0aWNhbFNlY3Rpb24oICZYMTFEUlZfQ3JpdFNlY3Rpb24gKTsKICAgciA9IFhBbGxvY0NvbG9yKGEwLCBhMSwgYTIpOwogICBMZWF2ZUNyaXRpY2FsU2VjdGlvbiggJlgxMURSVl9Dcml0U2VjdGlvbiApOwotICBkcHJpbnRmX3gxMShzdGRkZWIsICJSZXQgWEFsbG9jQ29sb3JcbiIpOworICBkcHJpbnRmX2luZm8oeDExLCAiUmV0IFhBbGxvY0NvbG9yXG4iKTsKICAgcmV0dXJuIHI7CiB9CiAKIGludCAgIFRTWEFsbG9jQ29sb3JDZWxscyhEaXNwbGF5KiBhMCwgQ29sb3JtYXAgYTEsIGludCBhMiwgdW5zaWduZWQgbG9uZyogYTMsIHVuc2lnbmVkIGludCBhNCwgdW5zaWduZWQgbG9uZyogYTUsIHVuc2lnbmVkIGludCBhNikKIHsKICAgaW50ICAgcjsKLSAgZHByaW50Zl94MTEoc3RkZGViLCAiQ2FsbCBYQWxsb2NDb2xvckNlbGxzXG4iKTsKKyAgZHByaW50Zl9pbmZvKHgxMSwgIkNhbGwgWEFsbG9jQ29sb3JDZWxsc1xuIik7CiAgIEVudGVyQ3JpdGljYWxTZWN0aW9uKCAmWDExRFJWX0NyaXRTZWN0aW9uICk7CiAgIHIgPSBYQWxsb2NDb2xvckNlbGxzKGEwLCBhMSwgYTIsIGEzLCBhNCwgYTUsIGE2KTsKICAgTGVhdmVDcml0aWNhbFNlY3Rpb24oICZYMTFEUlZfQ3JpdFNlY3Rpb24gKTsKLSAgZHByaW50Zl94MTEoc3RkZGViLCAiUmV0IFhBbGxvY0NvbG9yQ2VsbHNcbiIpOworICBkcHJpbnRmX2luZm8oeDExLCAiUmV0IFhBbGxvY0NvbG9yQ2VsbHNcbiIpOwogICByZXR1cm4gcjsKIH0KIAogaW50ICBUU1hCZWxsKERpc3BsYXkqIGEwLCBpbnQgYTEpCiB7CiAgIGludCAgcjsKLSAgZHByaW50Zl94MTEoc3RkZGViLCAiQ2FsbCBYQmVsbFxuIik7CisgIGRwcmludGZfaW5mbyh4MTEsICJDYWxsIFhCZWxsXG4iKTsKICAgRW50ZXJDcml0aWNhbFNlY3Rpb24oICZYMTFEUlZfQ3JpdFNlY3Rpb24gKTsKICAgciA9IFhCZWxsKGEwLCBhMSk7CiAgIExlYXZlQ3JpdGljYWxTZWN0aW9uKCAmWDExRFJWX0NyaXRTZWN0aW9uICk7Ci0gIGRwcmludGZfeDExKHN0ZGRlYiwgIlJldCBYQmVsbFxuIik7CisgIGRwcmludGZfaW5mbyh4MTEsICJSZXQgWEJlbGxcbiIpOwogICByZXR1cm4gcjsKIH0KIAogaW50ICBUU1hDaGFuZ2VHQyhEaXNwbGF5KiBhMCwgR0MgYTEsIHVuc2lnbmVkIGxvbmcgYTIsIFhHQ1ZhbHVlcyogYTMpCiB7CiAgIGludCAgcjsKLSAgZHByaW50Zl94MTEoc3RkZGViLCAiQ2FsbCBYQ2hhbmdlR0NcbiIpOworICBkcHJpbnRmX2luZm8oeDExLCAiQ2FsbCBYQ2hhbmdlR0NcbiIpOwogICBFbnRlckNyaXRpY2FsU2VjdGlvbiggJlgxMURSVl9Dcml0U2VjdGlvbiApOwogICByID0gWENoYW5nZUdDKGEwLCBhMSwgYTIsIGEzKTsKICAgTGVhdmVDcml0aWNhbFNlY3Rpb24oICZYMTFEUlZfQ3JpdFNlY3Rpb24gKTsKLSAgZHByaW50Zl94MTEoc3RkZGViLCAiUmV0IFhDaGFuZ2VHQ1xuIik7CisgIGRwcmludGZfaW5mbyh4MTEsICJSZXQgWENoYW5nZUdDXG4iKTsKICAgcmV0dXJuIHI7CiB9CiAKIGludCAgVFNYQ2hhbmdlS2V5Ym9hcmRDb250cm9sKERpc3BsYXkqIGEwLCB1bnNpZ25lZCBsb25nIGExLCBYS2V5Ym9hcmRDb250cm9sKiBhMikKIHsKICAgaW50ICByOwotICBkcHJpbnRmX3gxMShzdGRkZWIsICJDYWxsIFhDaGFuZ2VLZXlib2FyZENvbnRyb2xcbiIpOworICBkcHJpbnRmX2luZm8oeDExLCAiQ2FsbCBYQ2hhbmdlS2V5Ym9hcmRDb250cm9sXG4iKTsKICAgRW50ZXJDcml0aWNhbFNlY3Rpb24oICZYMTFEUlZfQ3JpdFNlY3Rpb24gKTsKICAgciA9IFhDaGFuZ2VLZXlib2FyZENvbnRyb2woYTAsIGExLCBhMik7CiAgIExlYXZlQ3JpdGljYWxTZWN0aW9uKCAmWDExRFJWX0NyaXRTZWN0aW9uICk7Ci0gIGRwcmludGZfeDExKHN0ZGRlYiwgIlJldCBYQ2hhbmdlS2V5Ym9hcmRDb250cm9sXG4iKTsKKyAgZHByaW50Zl9pbmZvKHgxMSwgIlJldCBYQ2hhbmdlS2V5Ym9hcmRDb250cm9sXG4iKTsKICAgcmV0dXJuIHI7CiB9CiAKIGludCAgVFNYQ2hhbmdlUHJvcGVydHkoRGlzcGxheSogYTAsIFdpbmRvdyBhMSwgQXRvbSBhMiwgQXRvbSBhMywgaW50IGE0LCBpbnQgYTUsIGNvbnN0ICB1bnNpZ25lZCBjaGFyKiBhNiwgaW50IGE3KQogewogICBpbnQgIHI7Ci0gIGRwcmludGZfeDExKHN0ZGRlYiwgIkNhbGwgWENoYW5nZVByb3BlcnR5XG4iKTsKKyAgZHByaW50Zl9pbmZvKHgxMSwgIkNhbGwgWENoYW5nZVByb3BlcnR5XG4iKTsKICAgRW50ZXJDcml0aWNhbFNlY3Rpb24oICZYMTFEUlZfQ3JpdFNlY3Rpb24gKTsKICAgciA9IFhDaGFuZ2VQcm9wZXJ0eShhMCwgYTEsIGEyLCBhMywgYTQsIGE1LCBhNiwgYTcpOwogICBMZWF2ZUNyaXRpY2FsU2VjdGlvbiggJlgxMURSVl9Dcml0U2VjdGlvbiApOwotICBkcHJpbnRmX3gxMShzdGRkZWIsICJSZXQgWENoYW5nZVByb3BlcnR5XG4iKTsKKyAgZHByaW50Zl9pbmZvKHgxMSwgIlJldCBYQ2hhbmdlUHJvcGVydHlcbiIpOwogICByZXR1cm4gcjsKIH0KIAogaW50ICBUU1hDaGFuZ2VXaW5kb3dBdHRyaWJ1dGVzKERpc3BsYXkqIGEwLCBXaW5kb3cgYTEsIHVuc2lnbmVkIGxvbmcgYTIsIFhTZXRXaW5kb3dBdHRyaWJ1dGVzKiBhMykKIHsKICAgaW50ICByOwotICBkcHJpbnRmX3gxMShzdGRkZWIsICJDYWxsIFhDaGFuZ2VXaW5kb3dBdHRyaWJ1dGVzXG4iKTsKKyAgZHByaW50Zl9pbmZvKHgxMSwgIkNhbGwgWENoYW5nZVdpbmRvd0F0dHJpYnV0ZXNcbiIpOwogICBFbnRlckNyaXRpY2FsU2VjdGlvbiggJlgxMURSVl9Dcml0U2VjdGlvbiApOwogICByID0gWENoYW5nZVdpbmRvd0F0dHJpYnV0ZXMoYTAsIGExLCBhMiwgYTMpOwogICBMZWF2ZUNyaXRpY2FsU2VjdGlvbiggJlgxMURSVl9Dcml0U2VjdGlvbiApOwotICBkcHJpbnRmX3gxMShzdGRkZWIsICJSZXQgWENoYW5nZVdpbmRvd0F0dHJpYnV0ZXNcbiIpOworICBkcHJpbnRmX2luZm8oeDExLCAiUmV0IFhDaGFuZ2VXaW5kb3dBdHRyaWJ1dGVzXG4iKTsKICAgcmV0dXJuIHI7CiB9CiAKIGludCAgIFRTWENoZWNrVHlwZWRXaW5kb3dFdmVudChEaXNwbGF5KiBhMCwgV2luZG93IGExLCBpbnQgYTIsIFhFdmVudCogYTMpCiB7CiAgIGludCAgIHI7Ci0gIGRwcmludGZfeDExKHN0ZGRlYiwgIkNhbGwgWENoZWNrVHlwZWRXaW5kb3dFdmVudFxuIik7CisgIGRwcmludGZfaW5mbyh4MTEsICJDYWxsIFhDaGVja1R5cGVkV2luZG93RXZlbnRcbiIpOwogICBFbnRlckNyaXRpY2FsU2VjdGlvbiggJlgxMURSVl9Dcml0U2VjdGlvbiApOwogICByID0gWENoZWNrVHlwZWRXaW5kb3dFdmVudChhMCwgYTEsIGEyLCBhMyk7CiAgIExlYXZlQ3JpdGljYWxTZWN0aW9uKCAmWDExRFJWX0NyaXRTZWN0aW9uICk7Ci0gIGRwcmludGZfeDExKHN0ZGRlYiwgIlJldCBYQ2hlY2tUeXBlZFdpbmRvd0V2ZW50XG4iKTsKKyAgZHByaW50Zl9pbmZvKHgxMSwgIlJldCBYQ2hlY2tUeXBlZFdpbmRvd0V2ZW50XG4iKTsKICAgcmV0dXJuIHI7CiB9CiAKIGludCAgIFRTWENoZWNrV2luZG93RXZlbnQoRGlzcGxheSogYTAsIFdpbmRvdyBhMSwgbG9uZyBhMiwgWEV2ZW50KiBhMykKIHsKICAgaW50ICAgcjsKLSAgZHByaW50Zl94MTEoc3RkZGViLCAiQ2FsbCBYQ2hlY2tXaW5kb3dFdmVudFxuIik7CisgIGRwcmludGZfaW5mbyh4MTEsICJDYWxsIFhDaGVja1dpbmRvd0V2ZW50XG4iKTsKICAgRW50ZXJDcml0aWNhbFNlY3Rpb24oICZYMTFEUlZfQ3JpdFNlY3Rpb24gKTsKICAgciA9IFhDaGVja1dpbmRvd0V2ZW50KGEwLCBhMSwgYTIsIGEzKTsKICAgTGVhdmVDcml0aWNhbFNlY3Rpb24oICZYMTFEUlZfQ3JpdFNlY3Rpb24gKTsKLSAgZHByaW50Zl94MTEoc3RkZGViLCAiUmV0IFhDaGVja1dpbmRvd0V2ZW50XG4iKTsKKyAgZHByaW50Zl9pbmZvKHgxMSwgIlJldCBYQ2hlY2tXaW5kb3dFdmVudFxuIik7CiAgIHJldHVybiByOwogfQogCiBpbnQgIFRTWENvbnZlcnRTZWxlY3Rpb24oRGlzcGxheSogYTAsIEF0b20gYTEsIEF0b20gYTIsIEF0b20gYTMsIFdpbmRvdyBhNCwgVGltZSBhNSkKIHsKICAgaW50ICByOwotICBkcHJpbnRmX3gxMShzdGRkZWIsICJDYWxsIFhDb252ZXJ0U2VsZWN0aW9uXG4iKTsKKyAgZHByaW50Zl9pbmZvKHgxMSwgIkNhbGwgWENvbnZlcnRTZWxlY3Rpb25cbiIpOwogICBFbnRlckNyaXRpY2FsU2VjdGlvbiggJlgxMURSVl9Dcml0U2VjdGlvbiApOwogICByID0gWENvbnZlcnRTZWxlY3Rpb24oYTAsIGExLCBhMiwgYTMsIGE0LCBhNSk7CiAgIExlYXZlQ3JpdGljYWxTZWN0aW9uKCAmWDExRFJWX0NyaXRTZWN0aW9uICk7Ci0gIGRwcmludGZfeDExKHN0ZGRlYiwgIlJldCBYQ29udmVydFNlbGVjdGlvblxuIik7CisgIGRwcmludGZfaW5mbyh4MTEsICJSZXQgWENvbnZlcnRTZWxlY3Rpb25cbiIpOwogICByZXR1cm4gcjsKIH0KIAogaW50ICBUU1hDb3B5QXJlYShEaXNwbGF5KiBhMCwgRHJhd2FibGUgYTEsIERyYXdhYmxlIGEyLCBHQyBhMywgaW50IGE0LCBpbnQgYTUsIHVuc2lnbmVkIGludCBhNiwgdW5zaWduZWQgaW50IGE3LCBpbnQgYTgsIGludCBhOSkKIHsKICAgaW50ICByOwotICBkcHJpbnRmX3gxMShzdGRkZWIsICJDYWxsIFhDb3B5QXJlYVxuIik7CisgIGRwcmludGZfaW5mbyh4MTEsICJDYWxsIFhDb3B5QXJlYVxuIik7CiAgIEVudGVyQ3JpdGljYWxTZWN0aW9uKCAmWDExRFJWX0NyaXRTZWN0aW9uICk7CiAgIHIgPSBYQ29weUFyZWEoYTAsIGExLCBhMiwgYTMsIGE0LCBhNSwgYTYsIGE3LCBhOCwgYTkpOwogICBMZWF2ZUNyaXRpY2FsU2VjdGlvbiggJlgxMURSVl9Dcml0U2VjdGlvbiApOwotICBkcHJpbnRmX3gxMShzdGRkZWIsICJSZXQgWENvcHlBcmVhXG4iKTsKKyAgZHByaW50Zl9pbmZvKHgxMSwgIlJldCBYQ29weUFyZWFcbiIpOwogICByZXR1cm4gcjsKIH0KIAogaW50ICBUU1hDb3B5UGxhbmUoRGlzcGxheSogYTAsIERyYXdhYmxlIGExLCBEcmF3YWJsZSBhMiwgR0MgYTMsIGludCBhNCwgaW50IGE1LCB1bnNpZ25lZCBpbnQgYTYsIHVuc2lnbmVkIGludCBhNywgaW50IGE4LCBpbnQgYTksIHVuc2lnbmVkIGxvbmcgYTEwKQogewogICBpbnQgIHI7Ci0gIGRwcmludGZfeDExKHN0ZGRlYiwgIkNhbGwgWENvcHlQbGFuZVxuIik7CisgIGRwcmludGZfaW5mbyh4MTEsICJDYWxsIFhDb3B5UGxhbmVcbiIpOwogICBFbnRlckNyaXRpY2FsU2VjdGlvbiggJlgxMURSVl9Dcml0U2VjdGlvbiApOwogICByID0gWENvcHlQbGFuZShhMCwgYTEsIGEyLCBhMywgYTQsIGE1LCBhNiwgYTcsIGE4LCBhOSwgYTEwKTsKICAgTGVhdmVDcml0aWNhbFNlY3Rpb24oICZYMTFEUlZfQ3JpdFNlY3Rpb24gKTsKLSAgZHByaW50Zl94MTEoc3RkZGViLCAiUmV0IFhDb3B5UGxhbmVcbiIpOworICBkcHJpbnRmX2luZm8oeDExLCAiUmV0IFhDb3B5UGxhbmVcbiIpOwogICByZXR1cm4gcjsKIH0KIAogaW50ICBUU1hEZWZpbmVDdXJzb3IoRGlzcGxheSogYTAsIFdpbmRvdyBhMSwgQ3Vyc29yIGEyKQogewogICBpbnQgIHI7Ci0gIGRwcmludGZfeDExKHN0ZGRlYiwgIkNhbGwgWERlZmluZUN1cnNvclxuIik7CisgIGRwcmludGZfaW5mbyh4MTEsICJDYWxsIFhEZWZpbmVDdXJzb3JcbiIpOwogICBFbnRlckNyaXRpY2FsU2VjdGlvbiggJlgxMURSVl9Dcml0U2VjdGlvbiApOwogICByID0gWERlZmluZUN1cnNvcihhMCwgYTEsIGEyKTsKICAgTGVhdmVDcml0aWNhbFNlY3Rpb24oICZYMTFEUlZfQ3JpdFNlY3Rpb24gKTsKLSAgZHByaW50Zl94MTEoc3RkZGViLCAiUmV0IFhEZWZpbmVDdXJzb3JcbiIpOworICBkcHJpbnRmX2luZm8oeDExLCAiUmV0IFhEZWZpbmVDdXJzb3JcbiIpOwogICByZXR1cm4gcjsKIH0KIAogaW50ICBUU1hEZXN0cm95V2luZG93KERpc3BsYXkqIGEwLCBXaW5kb3cgYTEpCiB7CiAgIGludCAgcjsKLSAgZHByaW50Zl94MTEoc3RkZGViLCAiQ2FsbCBYRGVzdHJveVdpbmRvd1xuIik7CisgIGRwcmludGZfaW5mbyh4MTEsICJDYWxsIFhEZXN0cm95V2luZG93XG4iKTsKICAgRW50ZXJDcml0aWNhbFNlY3Rpb24oICZYMTFEUlZfQ3JpdFNlY3Rpb24gKTsKICAgciA9IFhEZXN0cm95V2luZG93KGEwLCBhMSk7CiAgIExlYXZlQ3JpdGljYWxTZWN0aW9uKCAmWDExRFJWX0NyaXRTZWN0aW9uICk7Ci0gIGRwcmludGZfeDExKHN0ZGRlYiwgIlJldCBYRGVzdHJveVdpbmRvd1xuIik7CisgIGRwcmludGZfaW5mbyh4MTEsICJSZXQgWERlc3Ryb3lXaW5kb3dcbiIpOwogICByZXR1cm4gcjsKIH0KIAogaW50ICBUU1hEaXNwbGF5S2V5Y29kZXMoRGlzcGxheSogYTAsIGludCogYTEsIGludCogYTIpCiB7CiAgIGludCAgcjsKLSAgZHByaW50Zl94MTEoc3RkZGViLCAiQ2FsbCBYRGlzcGxheUtleWNvZGVzXG4iKTsKKyAgZHByaW50Zl9pbmZvKHgxMSwgIkNhbGwgWERpc3BsYXlLZXljb2Rlc1xuIik7CiAgIEVudGVyQ3JpdGljYWxTZWN0aW9uKCAmWDExRFJWX0NyaXRTZWN0aW9uICk7CiAgIHIgPSBYRGlzcGxheUtleWNvZGVzKGEwLCBhMSwgYTIpOwogICBMZWF2ZUNyaXRpY2FsU2VjdGlvbiggJlgxMURSVl9Dcml0U2VjdGlvbiApOwotICBkcHJpbnRmX3gxMShzdGRkZWIsICJSZXQgWERpc3BsYXlLZXljb2Rlc1xuIik7CisgIGRwcmludGZfaW5mbyh4MTEsICJSZXQgWERpc3BsYXlLZXljb2Rlc1xuIik7CiAgIHJldHVybiByOwogfQogCiBpbnQgIFRTWERyYXdBcmMoRGlzcGxheSogYTAsIERyYXdhYmxlIGExLCBHQyBhMiwgaW50IGEzLCBpbnQgYTQsIHVuc2lnbmVkIGludCBhNSwgdW5zaWduZWQgaW50IGE2LCBpbnQgYTcsIGludCBhOCkKIHsKICAgaW50ICByOwotICBkcHJpbnRmX3gxMShzdGRkZWIsICJDYWxsIFhEcmF3QXJjXG4iKTsKKyAgZHByaW50Zl9pbmZvKHgxMSwgIkNhbGwgWERyYXdBcmNcbiIpOwogICBFbnRlckNyaXRpY2FsU2VjdGlvbiggJlgxMURSVl9Dcml0U2VjdGlvbiApOwogICByID0gWERyYXdBcmMoYTAsIGExLCBhMiwgYTMsIGE0LCBhNSwgYTYsIGE3LCBhOCk7CiAgIExlYXZlQ3JpdGljYWxTZWN0aW9uKCAmWDExRFJWX0NyaXRTZWN0aW9uICk7Ci0gIGRwcmludGZfeDExKHN0ZGRlYiwgIlJldCBYRHJhd0FyY1xuIik7CisgIGRwcmludGZfaW5mbyh4MTEsICJSZXQgWERyYXdBcmNcbiIpOwogICByZXR1cm4gcjsKIH0KIAogaW50ICBUU1hEcmF3TGluZShEaXNwbGF5KiBhMCwgRHJhd2FibGUgYTEsIEdDIGEyLCBpbnQgYTMsIGludCBhNCwgaW50IGE1LCBpbnQgYTYpCiB7CiAgIGludCAgcjsKLSAgZHByaW50Zl94MTEoc3RkZGViLCAiQ2FsbCBYRHJhd0xpbmVcbiIpOworICBkcHJpbnRmX2luZm8oeDExLCAiQ2FsbCBYRHJhd0xpbmVcbiIpOwogICBFbnRlckNyaXRpY2FsU2VjdGlvbiggJlgxMURSVl9Dcml0U2VjdGlvbiApOwogICByID0gWERyYXdMaW5lKGEwLCBhMSwgYTIsIGEzLCBhNCwgYTUsIGE2KTsKICAgTGVhdmVDcml0aWNhbFNlY3Rpb24oICZYMTFEUlZfQ3JpdFNlY3Rpb24gKTsKLSAgZHByaW50Zl94MTEoc3RkZGViLCAiUmV0IFhEcmF3TGluZVxuIik7CisgIGRwcmludGZfaW5mbyh4MTEsICJSZXQgWERyYXdMaW5lXG4iKTsKICAgcmV0dXJuIHI7CiB9CiAKIGludCAgVFNYRHJhd0xpbmVzKERpc3BsYXkqIGEwLCBEcmF3YWJsZSBhMSwgR0MgYTIsIFhQb2ludCogYTMsIGludCBhNCwgaW50IGE1KQogewogICBpbnQgIHI7Ci0gIGRwcmludGZfeDExKHN0ZGRlYiwgIkNhbGwgWERyYXdMaW5lc1xuIik7CisgIGRwcmludGZfaW5mbyh4MTEsICJDYWxsIFhEcmF3TGluZXNcbiIpOwogICBFbnRlckNyaXRpY2FsU2VjdGlvbiggJlgxMURSVl9Dcml0U2VjdGlvbiApOwogICByID0gWERyYXdMaW5lcyhhMCwgYTEsIGEyLCBhMywgYTQsIGE1KTsKICAgTGVhdmVDcml0aWNhbFNlY3Rpb24oICZYMTFEUlZfQ3JpdFNlY3Rpb24gKTsKLSAgZHByaW50Zl94MTEoc3RkZGViLCAiUmV0IFhEcmF3TGluZXNcbiIpOworICBkcHJpbnRmX2luZm8oeDExLCAiUmV0IFhEcmF3TGluZXNcbiIpOwogICByZXR1cm4gcjsKIH0KIAogaW50ICBUU1hEcmF3UG9pbnQoRGlzcGxheSogYTAsIERyYXdhYmxlIGExLCBHQyBhMiwgaW50IGEzLCBpbnQgYTQpCiB7CiAgIGludCAgcjsKLSAgZHByaW50Zl94MTEoc3RkZGViLCAiQ2FsbCBYRHJhd1BvaW50XG4iKTsKKyAgZHByaW50Zl9pbmZvKHgxMSwgIkNhbGwgWERyYXdQb2ludFxuIik7CiAgIEVudGVyQ3JpdGljYWxTZWN0aW9uKCAmWDExRFJWX0NyaXRTZWN0aW9uICk7CiAgIHIgPSBYRHJhd1BvaW50KGEwLCBhMSwgYTIsIGEzLCBhNCk7CiAgIExlYXZlQ3JpdGljYWxTZWN0aW9uKCAmWDExRFJWX0NyaXRTZWN0aW9uICk7Ci0gIGRwcmludGZfeDExKHN0ZGRlYiwgIlJldCBYRHJhd1BvaW50XG4iKTsKKyAgZHByaW50Zl9pbmZvKHgxMSwgIlJldCBYRHJhd1BvaW50XG4iKTsKICAgcmV0dXJuIHI7CiB9CiAKIGludCAgVFNYRHJhd1JlY3RhbmdsZShEaXNwbGF5KiBhMCwgRHJhd2FibGUgYTEsIEdDIGEyLCBpbnQgYTMsIGludCBhNCwgdW5zaWduZWQgaW50IGE1LCB1bnNpZ25lZCBpbnQgYTYpCiB7CiAgIGludCAgcjsKLSAgZHByaW50Zl94MTEoc3RkZGViLCAiQ2FsbCBYRHJhd1JlY3RhbmdsZVxuIik7CisgIGRwcmludGZfaW5mbyh4MTEsICJDYWxsIFhEcmF3UmVjdGFuZ2xlXG4iKTsKICAgRW50ZXJDcml0aWNhbFNlY3Rpb24oICZYMTFEUlZfQ3JpdFNlY3Rpb24gKTsKICAgciA9IFhEcmF3UmVjdGFuZ2xlKGEwLCBhMSwgYTIsIGEzLCBhNCwgYTUsIGE2KTsKICAgTGVhdmVDcml0aWNhbFNlY3Rpb24oICZYMTFEUlZfQ3JpdFNlY3Rpb24gKTsKLSAgZHByaW50Zl94MTEoc3RkZGViLCAiUmV0IFhEcmF3UmVjdGFuZ2xlXG4iKTsKKyAgZHByaW50Zl9pbmZvKHgxMSwgIlJldCBYRHJhd1JlY3RhbmdsZVxuIik7CiAgIHJldHVybiByOwogfQogCiBpbnQgIFRTWERyYXdTZWdtZW50cyhEaXNwbGF5KiBhMCwgRHJhd2FibGUgYTEsIEdDIGEyLCBYU2VnbWVudCogYTMsIGludCBhNCkKIHsKICAgaW50ICByOwotICBkcHJpbnRmX3gxMShzdGRkZWIsICJDYWxsIFhEcmF3U2VnbWVudHNcbiIpOworICBkcHJpbnRmX2luZm8oeDExLCAiQ2FsbCBYRHJhd1NlZ21lbnRzXG4iKTsKICAgRW50ZXJDcml0aWNhbFNlY3Rpb24oICZYMTFEUlZfQ3JpdFNlY3Rpb24gKTsKICAgciA9IFhEcmF3U2VnbWVudHMoYTAsIGExLCBhMiwgYTMsIGE0KTsKICAgTGVhdmVDcml0aWNhbFNlY3Rpb24oICZYMTFEUlZfQ3JpdFNlY3Rpb24gKTsKLSAgZHByaW50Zl94MTEoc3RkZGViLCAiUmV0IFhEcmF3U2VnbWVudHNcbiIpOworICBkcHJpbnRmX2luZm8oeDExLCAiUmV0IFhEcmF3U2VnbWVudHNcbiIpOwogICByZXR1cm4gcjsKIH0KIAogaW50ICBUU1hEcmF3U3RyaW5nKERpc3BsYXkqIGEwLCBEcmF3YWJsZSBhMSwgR0MgYTIsIGludCBhMywgaW50IGE0LCBjb25zdCAgY2hhciogYTUsIGludCBhNikKIHsKICAgaW50ICByOwotICBkcHJpbnRmX3gxMShzdGRkZWIsICJDYWxsIFhEcmF3U3RyaW5nXG4iKTsKKyAgZHByaW50Zl9pbmZvKHgxMSwgIkNhbGwgWERyYXdTdHJpbmdcbiIpOwogICBFbnRlckNyaXRpY2FsU2VjdGlvbiggJlgxMURSVl9Dcml0U2VjdGlvbiApOwogICByID0gWERyYXdTdHJpbmcoYTAsIGExLCBhMiwgYTMsIGE0LCBhNSwgYTYpOwogICBMZWF2ZUNyaXRpY2FsU2VjdGlvbiggJlgxMURSVl9Dcml0U2VjdGlvbiApOwotICBkcHJpbnRmX3gxMShzdGRkZWIsICJSZXQgWERyYXdTdHJpbmdcbiIpOworICBkcHJpbnRmX2luZm8oeDExLCAiUmV0IFhEcmF3U3RyaW5nXG4iKTsKICAgcmV0dXJuIHI7CiB9CiAKIGludCAgVFNYRHJhd1RleHQoRGlzcGxheSogYTAsIERyYXdhYmxlIGExLCBHQyBhMiwgaW50IGEzLCBpbnQgYTQsIFhUZXh0SXRlbSogYTUsIGludCBhNikKIHsKICAgaW50ICByOwotICBkcHJpbnRmX3gxMShzdGRkZWIsICJDYWxsIFhEcmF3VGV4dFxuIik7CisgIGRwcmludGZfaW5mbyh4MTEsICJDYWxsIFhEcmF3VGV4dFxuIik7CiAgIEVudGVyQ3JpdGljYWxTZWN0aW9uKCAmWDExRFJWX0NyaXRTZWN0aW9uICk7CiAgIHIgPSBYRHJhd1RleHQoYTAsIGExLCBhMiwgYTMsIGE0LCBhNSwgYTYpOwogICBMZWF2ZUNyaXRpY2FsU2VjdGlvbiggJlgxMURSVl9Dcml0U2VjdGlvbiApOwotICBkcHJpbnRmX3gxMShzdGRkZWIsICJSZXQgWERyYXdUZXh0XG4iKTsKKyAgZHByaW50Zl9pbmZvKHgxMSwgIlJldCBYRHJhd1RleHRcbiIpOwogICByZXR1cm4gcjsKIH0KIAogaW50ICBUU1hGaWxsQXJjKERpc3BsYXkqIGEwLCBEcmF3YWJsZSBhMSwgR0MgYTIsIGludCBhMywgaW50IGE0LCB1bnNpZ25lZCBpbnQgYTUsIHVuc2lnbmVkIGludCBhNiwgaW50IGE3LCBpbnQgYTgpCiB7CiAgIGludCAgcjsKLSAgZHByaW50Zl94MTEoc3RkZGViLCAiQ2FsbCBYRmlsbEFyY1xuIik7CisgIGRwcmludGZfaW5mbyh4MTEsICJDYWxsIFhGaWxsQXJjXG4iKTsKICAgRW50ZXJDcml0aWNhbFNlY3Rpb24oICZYMTFEUlZfQ3JpdFNlY3Rpb24gKTsKICAgciA9IFhGaWxsQXJjKGEwLCBhMSwgYTIsIGEzLCBhNCwgYTUsIGE2LCBhNywgYTgpOwogICBMZWF2ZUNyaXRpY2FsU2VjdGlvbiggJlgxMURSVl9Dcml0U2VjdGlvbiApOwotICBkcHJpbnRmX3gxMShzdGRkZWIsICJSZXQgWEZpbGxBcmNcbiIpOworICBkcHJpbnRmX2luZm8oeDExLCAiUmV0IFhGaWxsQXJjXG4iKTsKICAgcmV0dXJuIHI7CiB9CiAKIGludCAgVFNYRmlsbFBvbHlnb24oRGlzcGxheSogYTAsIERyYXdhYmxlIGExLCBHQyBhMiwgWFBvaW50KiBhMywgaW50IGE0LCBpbnQgYTUsIGludCBhNikKIHsKICAgaW50ICByOwotICBkcHJpbnRmX3gxMShzdGRkZWIsICJDYWxsIFhGaWxsUG9seWdvblxuIik7CisgIGRwcmludGZfaW5mbyh4MTEsICJDYWxsIFhGaWxsUG9seWdvblxuIik7CiAgIEVudGVyQ3JpdGljYWxTZWN0aW9uKCAmWDExRFJWX0NyaXRTZWN0aW9uICk7CiAgIHIgPSBYRmlsbFBvbHlnb24oYTAsIGExLCBhMiwgYTMsIGE0LCBhNSwgYTYpOwogICBMZWF2ZUNyaXRpY2FsU2VjdGlvbiggJlgxMURSVl9Dcml0U2VjdGlvbiApOwotICBkcHJpbnRmX3gxMShzdGRkZWIsICJSZXQgWEZpbGxQb2x5Z29uXG4iKTsKKyAgZHByaW50Zl9pbmZvKHgxMSwgIlJldCBYRmlsbFBvbHlnb25cbiIpOwogICByZXR1cm4gcjsKIH0KIAogaW50ICBUU1hGaWxsUmVjdGFuZ2xlKERpc3BsYXkqIGEwLCBEcmF3YWJsZSBhMSwgR0MgYTIsIGludCBhMywgaW50IGE0LCB1bnNpZ25lZCBpbnQgYTUsIHVuc2lnbmVkIGludCBhNikKIHsKICAgaW50ICByOwotICBkcHJpbnRmX3gxMShzdGRkZWIsICJDYWxsIFhGaWxsUmVjdGFuZ2xlXG4iKTsKKyAgZHByaW50Zl9pbmZvKHgxMSwgIkNhbGwgWEZpbGxSZWN0YW5nbGVcbiIpOwogICBFbnRlckNyaXRpY2FsU2VjdGlvbiggJlgxMURSVl9Dcml0U2VjdGlvbiApOwogICByID0gWEZpbGxSZWN0YW5nbGUoYTAsIGExLCBhMiwgYTMsIGE0LCBhNSwgYTYpOwogICBMZWF2ZUNyaXRpY2FsU2VjdGlvbiggJlgxMURSVl9Dcml0U2VjdGlvbiApOwotICBkcHJpbnRmX3gxMShzdGRkZWIsICJSZXQgWEZpbGxSZWN0YW5nbGVcbiIpOworICBkcHJpbnRmX2luZm8oeDExLCAiUmV0IFhGaWxsUmVjdGFuZ2xlXG4iKTsKICAgcmV0dXJuIHI7CiB9CiAKIGludCAgVFNYRmx1c2goRGlzcGxheSogYTApCiB7CiAgIGludCAgcjsKLSAgZHByaW50Zl94MTEoc3RkZGViLCAiQ2FsbCBYRmx1c2hcbiIpOworICBkcHJpbnRmX2luZm8oeDExLCAiQ2FsbCBYRmx1c2hcbiIpOwogICBFbnRlckNyaXRpY2FsU2VjdGlvbiggJlgxMURSVl9Dcml0U2VjdGlvbiApOwogICByID0gWEZsdXNoKGEwKTsKICAgTGVhdmVDcml0aWNhbFNlY3Rpb24oICZYMTFEUlZfQ3JpdFNlY3Rpb24gKTsKLSAgZHByaW50Zl94MTEoc3RkZGViLCAiUmV0IFhGbHVzaFxuIik7CisgIGRwcmludGZfaW5mbyh4MTEsICJSZXQgWEZsdXNoXG4iKTsKICAgcmV0dXJuIHI7CiB9CiAKIGludCAgVFNYRnJlZSh2b2lkKiBhMCkKIHsKICAgaW50ICByOwotICBkcHJpbnRmX3gxMShzdGRkZWIsICJDYWxsIFhGcmVlXG4iKTsKKyAgZHByaW50Zl9pbmZvKHgxMSwgIkNhbGwgWEZyZWVcbiIpOwogICBFbnRlckNyaXRpY2FsU2VjdGlvbiggJlgxMURSVl9Dcml0U2VjdGlvbiApOwogICByID0gWEZyZWUoYTApOwogICBMZWF2ZUNyaXRpY2FsU2VjdGlvbiggJlgxMURSVl9Dcml0U2VjdGlvbiApOwotICBkcHJpbnRmX3gxMShzdGRkZWIsICJSZXQgWEZyZWVcbiIpOworICBkcHJpbnRmX2luZm8oeDExLCAiUmV0IFhGcmVlXG4iKTsKICAgcmV0dXJuIHI7CiB9CiAKIGludCAgVFNYRnJlZUNvbG9ybWFwKERpc3BsYXkqIGEwLCBDb2xvcm1hcCBhMSkKIHsKICAgaW50ICByOwotICBkcHJpbnRmX3gxMShzdGRkZWIsICJDYWxsIFhGcmVlQ29sb3JtYXBcbiIpOworICBkcHJpbnRmX2luZm8oeDExLCAiQ2FsbCBYRnJlZUNvbG9ybWFwXG4iKTsKICAgRW50ZXJDcml0aWNhbFNlY3Rpb24oICZYMTFEUlZfQ3JpdFNlY3Rpb24gKTsKICAgciA9IFhGcmVlQ29sb3JtYXAoYTAsIGExKTsKICAgTGVhdmVDcml0aWNhbFNlY3Rpb24oICZYMTFEUlZfQ3JpdFNlY3Rpb24gKTsKLSAgZHByaW50Zl94MTEoc3RkZGViLCAiUmV0IFhGcmVlQ29sb3JtYXBcbiIpOworICBkcHJpbnRmX2luZm8oeDExLCAiUmV0IFhGcmVlQ29sb3JtYXBcbiIpOwogICByZXR1cm4gcjsKIH0KIAogaW50ICBUU1hGcmVlQ29sb3JzKERpc3BsYXkqIGEwLCBDb2xvcm1hcCBhMSwgdW5zaWduZWQgbG9uZyogYTIsIGludCBhMywgdW5zaWduZWQgbG9uZyBhNCkKIHsKICAgaW50ICByOwotICBkcHJpbnRmX3gxMShzdGRkZWIsICJDYWxsIFhGcmVlQ29sb3JzXG4iKTsKKyAgZHByaW50Zl9pbmZvKHgxMSwgIkNhbGwgWEZyZWVDb2xvcnNcbiIpOwogICBFbnRlckNyaXRpY2FsU2VjdGlvbiggJlgxMURSVl9Dcml0U2VjdGlvbiApOwogICByID0gWEZyZWVDb2xvcnMoYTAsIGExLCBhMiwgYTMsIGE0KTsKICAgTGVhdmVDcml0aWNhbFNlY3Rpb24oICZYMTFEUlZfQ3JpdFNlY3Rpb24gKTsKLSAgZHByaW50Zl94MTEoc3RkZGViLCAiUmV0IFhGcmVlQ29sb3JzXG4iKTsKKyAgZHByaW50Zl9pbmZvKHgxMSwgIlJldCBYRnJlZUNvbG9yc1xuIik7CiAgIHJldHVybiByOwogfQogCiBpbnQgIFRTWEZyZWVDdXJzb3IoRGlzcGxheSogYTAsIEN1cnNvciBhMSkKIHsKICAgaW50ICByOwotICBkcHJpbnRmX3gxMShzdGRkZWIsICJDYWxsIFhGcmVlQ3Vyc29yXG4iKTsKKyAgZHByaW50Zl9pbmZvKHgxMSwgIkNhbGwgWEZyZWVDdXJzb3JcbiIpOwogICBFbnRlckNyaXRpY2FsU2VjdGlvbiggJlgxMURSVl9Dcml0U2VjdGlvbiApOwogICByID0gWEZyZWVDdXJzb3IoYTAsIGExKTsKICAgTGVhdmVDcml0aWNhbFNlY3Rpb24oICZYMTFEUlZfQ3JpdFNlY3Rpb24gKTsKLSAgZHByaW50Zl94MTEoc3RkZGViLCAiUmV0IFhGcmVlQ3Vyc29yXG4iKTsKKyAgZHByaW50Zl9pbmZvKHgxMSwgIlJldCBYRnJlZUN1cnNvclxuIik7CiAgIHJldHVybiByOwogfQogCiBpbnQgIFRTWEZyZWVGb250KERpc3BsYXkqIGEwLCBYRm9udFN0cnVjdCogYTEpCiB7CiAgIGludCAgcjsKLSAgZHByaW50Zl94MTEoc3RkZGViLCAiQ2FsbCBYRnJlZUZvbnRcbiIpOworICBkcHJpbnRmX2luZm8oeDExLCAiQ2FsbCBYRnJlZUZvbnRcbiIpOwogICBFbnRlckNyaXRpY2FsU2VjdGlvbiggJlgxMURSVl9Dcml0U2VjdGlvbiApOwogICByID0gWEZyZWVGb250KGEwLCBhMSk7CiAgIExlYXZlQ3JpdGljYWxTZWN0aW9uKCAmWDExRFJWX0NyaXRTZWN0aW9uICk7Ci0gIGRwcmludGZfeDExKHN0ZGRlYiwgIlJldCBYRnJlZUZvbnRcbiIpOworICBkcHJpbnRmX2luZm8oeDExLCAiUmV0IFhGcmVlRm9udFxuIik7CiAgIHJldHVybiByOwogfQogCiBpbnQgIFRTWEZyZWVGb250TmFtZXMoY2hhcioqIGEwKQogewogICBpbnQgIHI7Ci0gIGRwcmludGZfeDExKHN0ZGRlYiwgIkNhbGwgWEZyZWVGb250TmFtZXNcbiIpOworICBkcHJpbnRmX2luZm8oeDExLCAiQ2FsbCBYRnJlZUZvbnROYW1lc1xuIik7CiAgIEVudGVyQ3JpdGljYWxTZWN0aW9uKCAmWDExRFJWX0NyaXRTZWN0aW9uICk7CiAgIHIgPSBYRnJlZUZvbnROYW1lcyhhMCk7CiAgIExlYXZlQ3JpdGljYWxTZWN0aW9uKCAmWDExRFJWX0NyaXRTZWN0aW9uICk7Ci0gIGRwcmludGZfeDExKHN0ZGRlYiwgIlJldCBYRnJlZUZvbnROYW1lc1xuIik7CisgIGRwcmludGZfaW5mbyh4MTEsICJSZXQgWEZyZWVGb250TmFtZXNcbiIpOwogICByZXR1cm4gcjsKIH0KIAogaW50ICBUU1hGcmVlR0MoRGlzcGxheSogYTAsIEdDIGExKQogewogICBpbnQgIHI7Ci0gIGRwcmludGZfeDExKHN0ZGRlYiwgIkNhbGwgWEZyZWVHQ1xuIik7CisgIGRwcmludGZfaW5mbyh4MTEsICJDYWxsIFhGcmVlR0NcbiIpOwogICBFbnRlckNyaXRpY2FsU2VjdGlvbiggJlgxMURSVl9Dcml0U2VjdGlvbiApOwogICByID0gWEZyZWVHQyhhMCwgYTEpOwogICBMZWF2ZUNyaXRpY2FsU2VjdGlvbiggJlgxMURSVl9Dcml0U2VjdGlvbiApOwotICBkcHJpbnRmX3gxMShzdGRkZWIsICJSZXQgWEZyZWVHQ1xuIik7CisgIGRwcmludGZfaW5mbyh4MTEsICJSZXQgWEZyZWVHQ1xuIik7CiAgIHJldHVybiByOwogfQogCiBpbnQgIFRTWEZyZWVNb2RpZmllcm1hcChYTW9kaWZpZXJLZXltYXAqIGEwKQogewogICBpbnQgIHI7Ci0gIGRwcmludGZfeDExKHN0ZGRlYiwgIkNhbGwgWEZyZWVNb2RpZmllcm1hcFxuIik7CisgIGRwcmludGZfaW5mbyh4MTEsICJDYWxsIFhGcmVlTW9kaWZpZXJtYXBcbiIpOwogICBFbnRlckNyaXRpY2FsU2VjdGlvbiggJlgxMURSVl9Dcml0U2VjdGlvbiApOwogICByID0gWEZyZWVNb2RpZmllcm1hcChhMCk7CiAgIExlYXZlQ3JpdGljYWxTZWN0aW9uKCAmWDExRFJWX0NyaXRTZWN0aW9uICk7Ci0gIGRwcmludGZfeDExKHN0ZGRlYiwgIlJldCBYRnJlZU1vZGlmaWVybWFwXG4iKTsKKyAgZHByaW50Zl9pbmZvKHgxMSwgIlJldCBYRnJlZU1vZGlmaWVybWFwXG4iKTsKICAgcmV0dXJuIHI7CiB9CiAKIGludCAgVFNYRnJlZVBpeG1hcChEaXNwbGF5KiBhMCwgUGl4bWFwIGExKQogewogICBpbnQgIHI7Ci0gIGRwcmludGZfeDExKHN0ZGRlYiwgIkNhbGwgWEZyZWVQaXhtYXBcbiIpOworICBkcHJpbnRmX2luZm8oeDExLCAiQ2FsbCBYRnJlZVBpeG1hcFxuIik7CiAgIEVudGVyQ3JpdGljYWxTZWN0aW9uKCAmWDExRFJWX0NyaXRTZWN0aW9uICk7CiAgIHIgPSBYRnJlZVBpeG1hcChhMCwgYTEpOwogICBMZWF2ZUNyaXRpY2FsU2VjdGlvbiggJlgxMURSVl9Dcml0U2VjdGlvbiApOwotICBkcHJpbnRmX3gxMShzdGRkZWIsICJSZXQgWEZyZWVQaXhtYXBcbiIpOworICBkcHJpbnRmX2luZm8oeDExLCAiUmV0IFhGcmVlUGl4bWFwXG4iKTsKICAgcmV0dXJuIHI7CiB9CiAKIGludCAgIFRTWEdldEZvbnRQcm9wZXJ0eShYRm9udFN0cnVjdCogYTAsIEF0b20gYTEsIHVuc2lnbmVkIGxvbmcqIGEyKQogewogICBpbnQgICByOwotICBkcHJpbnRmX3gxMShzdGRkZWIsICJDYWxsIFhHZXRGb250UHJvcGVydHlcbiIpOworICBkcHJpbnRmX2luZm8oeDExLCAiQ2FsbCBYR2V0Rm9udFByb3BlcnR5XG4iKTsKICAgRW50ZXJDcml0aWNhbFNlY3Rpb24oICZYMTFEUlZfQ3JpdFNlY3Rpb24gKTsKICAgciA9IFhHZXRGb250UHJvcGVydHkoYTAsIGExLCBhMik7CiAgIExlYXZlQ3JpdGljYWxTZWN0aW9uKCAmWDExRFJWX0NyaXRTZWN0aW9uICk7Ci0gIGRwcmludGZfeDExKHN0ZGRlYiwgIlJldCBYR2V0Rm9udFByb3BlcnR5XG4iKTsKKyAgZHByaW50Zl9pbmZvKHgxMSwgIlJldCBYR2V0Rm9udFByb3BlcnR5XG4iKTsKICAgcmV0dXJuIHI7CiB9CiAKIGludCAgIFRTWEdldEdlb21ldHJ5KERpc3BsYXkqIGEwLCBEcmF3YWJsZSBhMSwgV2luZG93KiBhMiwgaW50KiBhMywgaW50KiBhNCwgdW5zaWduZWQgaW50KiBhNSwgdW5zaWduZWQgaW50KiBhNiwgdW5zaWduZWQgaW50KiBhNywgdW5zaWduZWQgaW50KiBhOCkKIHsKICAgaW50ICAgcjsKLSAgZHByaW50Zl94MTEoc3RkZGViLCAiQ2FsbCBYR2V0R2VvbWV0cnlcbiIpOworICBkcHJpbnRmX2luZm8oeDExLCAiQ2FsbCBYR2V0R2VvbWV0cnlcbiIpOwogICBFbnRlckNyaXRpY2FsU2VjdGlvbiggJlgxMURSVl9Dcml0U2VjdGlvbiApOwogICByID0gWEdldEdlb21ldHJ5KGEwLCBhMSwgYTIsIGEzLCBhNCwgYTUsIGE2LCBhNywgYTgpOwogICBMZWF2ZUNyaXRpY2FsU2VjdGlvbiggJlgxMURSVl9Dcml0U2VjdGlvbiApOwotICBkcHJpbnRmX3gxMShzdGRkZWIsICJSZXQgWEdldEdlb21ldHJ5XG4iKTsKKyAgZHByaW50Zl9pbmZvKHgxMSwgIlJldCBYR2V0R2VvbWV0cnlcbiIpOwogICByZXR1cm4gcjsKIH0KIAogaW50ICBUU1hHZXRJbnB1dEZvY3VzKERpc3BsYXkqIGEwLCBXaW5kb3cqIGExLCBpbnQqIGEyKQogewogICBpbnQgIHI7Ci0gIGRwcmludGZfeDExKHN0ZGRlYiwgIkNhbGwgWEdldElucHV0Rm9jdXNcbiIpOworICBkcHJpbnRmX2luZm8oeDExLCAiQ2FsbCBYR2V0SW5wdXRGb2N1c1xuIik7CiAgIEVudGVyQ3JpdGljYWxTZWN0aW9uKCAmWDExRFJWX0NyaXRTZWN0aW9uICk7CiAgIHIgPSBYR2V0SW5wdXRGb2N1cyhhMCwgYTEsIGEyKTsKICAgTGVhdmVDcml0aWNhbFNlY3Rpb24oICZYMTFEUlZfQ3JpdFNlY3Rpb24gKTsKLSAgZHByaW50Zl94MTEoc3RkZGViLCAiUmV0IFhHZXRJbnB1dEZvY3VzXG4iKTsKKyAgZHByaW50Zl9pbmZvKHgxMSwgIlJldCBYR2V0SW5wdXRGb2N1c1xuIik7CiAgIHJldHVybiByOwogfQogCiBpbnQgIFRTWEdldEtleWJvYXJkQ29udHJvbChEaXNwbGF5KiBhMCwgWEtleWJvYXJkU3RhdGUqIGExKQogewogICBpbnQgIHI7Ci0gIGRwcmludGZfeDExKHN0ZGRlYiwgIkNhbGwgWEdldEtleWJvYXJkQ29udHJvbFxuIik7CisgIGRwcmludGZfaW5mbyh4MTEsICJDYWxsIFhHZXRLZXlib2FyZENvbnRyb2xcbiIpOwogICBFbnRlckNyaXRpY2FsU2VjdGlvbiggJlgxMURSVl9Dcml0U2VjdGlvbiApOwogICByID0gWEdldEtleWJvYXJkQ29udHJvbChhMCwgYTEpOwogICBMZWF2ZUNyaXRpY2FsU2VjdGlvbiggJlgxMURSVl9Dcml0U2VjdGlvbiApOwotICBkcHJpbnRmX3gxMShzdGRkZWIsICJSZXQgWEdldEtleWJvYXJkQ29udHJvbFxuIik7CisgIGRwcmludGZfaW5mbyh4MTEsICJSZXQgWEdldEtleWJvYXJkQ29udHJvbFxuIik7CiAgIHJldHVybiByOwogfQogCiBpbnQgIFRTWEdldFNjcmVlblNhdmVyKERpc3BsYXkqIGEwLCBpbnQqIGExLCBpbnQqIGEyLCBpbnQqIGEzLCBpbnQqIGE0KQogewogICBpbnQgIHI7Ci0gIGRwcmludGZfeDExKHN0ZGRlYiwgIkNhbGwgWEdldFNjcmVlblNhdmVyXG4iKTsKKyAgZHByaW50Zl9pbmZvKHgxMSwgIkNhbGwgWEdldFNjcmVlblNhdmVyXG4iKTsKICAgRW50ZXJDcml0aWNhbFNlY3Rpb24oICZYMTFEUlZfQ3JpdFNlY3Rpb24gKTsKICAgciA9IFhHZXRTY3JlZW5TYXZlcihhMCwgYTEsIGEyLCBhMywgYTQpOwogICBMZWF2ZUNyaXRpY2FsU2VjdGlvbiggJlgxMURSVl9Dcml0U2VjdGlvbiApOwotICBkcHJpbnRmX3gxMShzdGRkZWIsICJSZXQgWEdldFNjcmVlblNhdmVyXG4iKTsKKyAgZHByaW50Zl9pbmZvKHgxMSwgIlJldCBYR2V0U2NyZWVuU2F2ZXJcbiIpOwogICByZXR1cm4gcjsKIH0KIAogaW50ICBUU1hHZXRXaW5kb3dQcm9wZXJ0eShEaXNwbGF5KiBhMCwgV2luZG93IGExLCBBdG9tIGEyLCBsb25nIGEzLCBsb25nIGE0LCBpbnQgYTUsIEF0b20gYTYsIEF0b20qIGE3LCBpbnQqIGE4LCB1bnNpZ25lZCBsb25nKiBhOSwgdW5zaWduZWQgbG9uZyogYTEwLCB1bnNpZ25lZCBjaGFyKiogYTExKQogewogICBpbnQgIHI7Ci0gIGRwcmludGZfeDExKHN0ZGRlYiwgIkNhbGwgWEdldFdpbmRvd1Byb3BlcnR5XG4iKTsKKyAgZHByaW50Zl9pbmZvKHgxMSwgIkNhbGwgWEdldFdpbmRvd1Byb3BlcnR5XG4iKTsKICAgRW50ZXJDcml0aWNhbFNlY3Rpb24oICZYMTFEUlZfQ3JpdFNlY3Rpb24gKTsKICAgciA9IFhHZXRXaW5kb3dQcm9wZXJ0eShhMCwgYTEsIGEyLCBhMywgYTQsIGE1LCBhNiwgYTcsIGE4LCBhOSwgYTEwLCBhMTEpOwogICBMZWF2ZUNyaXRpY2FsU2VjdGlvbiggJlgxMURSVl9Dcml0U2VjdGlvbiApOwotICBkcHJpbnRmX3gxMShzdGRkZWIsICJSZXQgWEdldFdpbmRvd1Byb3BlcnR5XG4iKTsKKyAgZHByaW50Zl9pbmZvKHgxMSwgIlJldCBYR2V0V2luZG93UHJvcGVydHlcbiIpOwogICByZXR1cm4gcjsKIH0KIAogaW50ICAgVFNYR2V0V2luZG93QXR0cmlidXRlcyhEaXNwbGF5KiBhMCwgV2luZG93IGExLCBYV2luZG93QXR0cmlidXRlcyogYTIpCiB7CiAgIGludCAgIHI7Ci0gIGRwcmludGZfeDExKHN0ZGRlYiwgIkNhbGwgWEdldFdpbmRvd0F0dHJpYnV0ZXNcbiIpOworICBkcHJpbnRmX2luZm8oeDExLCAiQ2FsbCBYR2V0V2luZG93QXR0cmlidXRlc1xuIik7CiAgIEVudGVyQ3JpdGljYWxTZWN0aW9uKCAmWDExRFJWX0NyaXRTZWN0aW9uICk7CiAgIHIgPSBYR2V0V2luZG93QXR0cmlidXRlcyhhMCwgYTEsIGEyKTsKICAgTGVhdmVDcml0aWNhbFNlY3Rpb24oICZYMTFEUlZfQ3JpdFNlY3Rpb24gKTsKLSAgZHByaW50Zl94MTEoc3RkZGViLCAiUmV0IFhHZXRXaW5kb3dBdHRyaWJ1dGVzXG4iKTsKKyAgZHByaW50Zl9pbmZvKHgxMSwgIlJldCBYR2V0V2luZG93QXR0cmlidXRlc1xuIik7CiAgIHJldHVybiByOwogfQogCiBpbnQgIFRTWEdyYWJQb2ludGVyKERpc3BsYXkqIGEwLCBXaW5kb3cgYTEsIGludCBhMiwgdW5zaWduZWQgaW50IGEzLCBpbnQgYTQsIGludCBhNSwgV2luZG93IGE2LCBDdXJzb3IgYTcsIFRpbWUgYTgpCiB7CiAgIGludCAgcjsKLSAgZHByaW50Zl94MTEoc3RkZGViLCAiQ2FsbCBYR3JhYlBvaW50ZXJcbiIpOworICBkcHJpbnRmX2luZm8oeDExLCAiQ2FsbCBYR3JhYlBvaW50ZXJcbiIpOwogICBFbnRlckNyaXRpY2FsU2VjdGlvbiggJlgxMURSVl9Dcml0U2VjdGlvbiApOwogICByID0gWEdyYWJQb2ludGVyKGEwLCBhMSwgYTIsIGEzLCBhNCwgYTUsIGE2LCBhNywgYTgpOwogICBMZWF2ZUNyaXRpY2FsU2VjdGlvbiggJlgxMURSVl9Dcml0U2VjdGlvbiApOwotICBkcHJpbnRmX3gxMShzdGRkZWIsICJSZXQgWEdyYWJQb2ludGVyXG4iKTsKKyAgZHByaW50Zl9pbmZvKHgxMSwgIlJldCBYR3JhYlBvaW50ZXJcbiIpOwogICByZXR1cm4gcjsKIH0KIAogaW50ICBUU1hHcmFiU2VydmVyKERpc3BsYXkqIGEwKQogewogICBpbnQgIHI7Ci0gIGRwcmludGZfeDExKHN0ZGRlYiwgIkNhbGwgWEdyYWJTZXJ2ZXJcbiIpOworICBkcHJpbnRmX2luZm8oeDExLCAiQ2FsbCBYR3JhYlNlcnZlclxuIik7CiAgIEVudGVyQ3JpdGljYWxTZWN0aW9uKCAmWDExRFJWX0NyaXRTZWN0aW9uICk7CiAgIHIgPSBYR3JhYlNlcnZlcihhMCk7CiAgIExlYXZlQ3JpdGljYWxTZWN0aW9uKCAmWDExRFJWX0NyaXRTZWN0aW9uICk7Ci0gIGRwcmludGZfeDExKHN0ZGRlYiwgIlJldCBYR3JhYlNlcnZlclxuIik7CisgIGRwcmludGZfaW5mbyh4MTEsICJSZXQgWEdyYWJTZXJ2ZXJcbiIpOwogICByZXR1cm4gcjsKIH0KIAogaW50ICBUU1hJbnN0YWxsQ29sb3JtYXAoRGlzcGxheSogYTAsIENvbG9ybWFwIGExKQogewogICBpbnQgIHI7Ci0gIGRwcmludGZfeDExKHN0ZGRlYiwgIkNhbGwgWEluc3RhbGxDb2xvcm1hcFxuIik7CisgIGRwcmludGZfaW5mbyh4MTEsICJDYWxsIFhJbnN0YWxsQ29sb3JtYXBcbiIpOwogICBFbnRlckNyaXRpY2FsU2VjdGlvbiggJlgxMURSVl9Dcml0U2VjdGlvbiApOwogICByID0gWEluc3RhbGxDb2xvcm1hcChhMCwgYTEpOwogICBMZWF2ZUNyaXRpY2FsU2VjdGlvbiggJlgxMURSVl9Dcml0U2VjdGlvbiApOwotICBkcHJpbnRmX3gxMShzdGRkZWIsICJSZXQgWEluc3RhbGxDb2xvcm1hcFxuIik7CisgIGRwcmludGZfaW5mbyh4MTEsICJSZXQgWEluc3RhbGxDb2xvcm1hcFxuIik7CiAgIHJldHVybiByOwogfQogCiBLZXlDb2RlICBUU1hLZXlzeW1Ub0tleWNvZGUoRGlzcGxheSogYTAsIEtleVN5bSBhMSkKIHsKICAgS2V5Q29kZSAgcjsKLSAgZHByaW50Zl94MTEoc3RkZGViLCAiQ2FsbCBYS2V5c3ltVG9LZXljb2RlXG4iKTsKKyAgZHByaW50Zl9pbmZvKHgxMSwgIkNhbGwgWEtleXN5bVRvS2V5Y29kZVxuIik7CiAgIEVudGVyQ3JpdGljYWxTZWN0aW9uKCAmWDExRFJWX0NyaXRTZWN0aW9uICk7CiAgIHIgPSBYS2V5c3ltVG9LZXljb2RlKGEwLCBhMSk7CiAgIExlYXZlQ3JpdGljYWxTZWN0aW9uKCAmWDExRFJWX0NyaXRTZWN0aW9uICk7Ci0gIGRwcmludGZfeDExKHN0ZGRlYiwgIlJldCBYS2V5c3ltVG9LZXljb2RlXG4iKTsKKyAgZHByaW50Zl9pbmZvKHgxMSwgIlJldCBYS2V5c3ltVG9LZXljb2RlXG4iKTsKICAgcmV0dXJuIHI7CiB9CiAKIGludCAgVFNYTWFwV2luZG93KERpc3BsYXkqIGEwLCBXaW5kb3cgYTEpCiB7CiAgIGludCAgcjsKLSAgZHByaW50Zl94MTEoc3RkZGViLCAiQ2FsbCBYTWFwV2luZG93XG4iKTsKKyAgZHByaW50Zl9pbmZvKHgxMSwgIkNhbGwgWE1hcFdpbmRvd1xuIik7CiAgIEVudGVyQ3JpdGljYWxTZWN0aW9uKCAmWDExRFJWX0NyaXRTZWN0aW9uICk7CiAgIHIgPSBYTWFwV2luZG93KGEwLCBhMSk7CiAgIExlYXZlQ3JpdGljYWxTZWN0aW9uKCAmWDExRFJWX0NyaXRTZWN0aW9uICk7Ci0gIGRwcmludGZfeDExKHN0ZGRlYiwgIlJldCBYTWFwV2luZG93XG4iKTsKKyAgZHByaW50Zl9pbmZvKHgxMSwgIlJldCBYTWFwV2luZG93XG4iKTsKICAgcmV0dXJuIHI7CiB9CiAKIGludCAgVFNYTmV4dEV2ZW50KERpc3BsYXkqIGEwLCBYRXZlbnQqIGExKQogewogICBpbnQgIHI7Ci0gIGRwcmludGZfeDExKHN0ZGRlYiwgIkNhbGwgWE5leHRFdmVudFxuIik7CisgIGRwcmludGZfaW5mbyh4MTEsICJDYWxsIFhOZXh0RXZlbnRcbiIpOwogICBFbnRlckNyaXRpY2FsU2VjdGlvbiggJlgxMURSVl9Dcml0U2VjdGlvbiApOwogICByID0gWE5leHRFdmVudChhMCwgYTEpOwogICBMZWF2ZUNyaXRpY2FsU2VjdGlvbiggJlgxMURSVl9Dcml0U2VjdGlvbiApOwotICBkcHJpbnRmX3gxMShzdGRkZWIsICJSZXQgWE5leHRFdmVudFxuIik7CisgIGRwcmludGZfaW5mbyh4MTEsICJSZXQgWE5leHRFdmVudFxuIik7CiAgIHJldHVybiByOwogfQogCiBpbnQgIFRTWFBhcnNlR2VvbWV0cnkoY29uc3QgIGNoYXIqIGEwLCBpbnQqIGExLCBpbnQqIGEyLCB1bnNpZ25lZCBpbnQqIGEzLCB1bnNpZ25lZCBpbnQqIGE0KQogewogICBpbnQgIHI7Ci0gIGRwcmludGZfeDExKHN0ZGRlYiwgIkNhbGwgWFBhcnNlR2VvbWV0cnlcbiIpOworICBkcHJpbnRmX2luZm8oeDExLCAiQ2FsbCBYUGFyc2VHZW9tZXRyeVxuIik7CiAgIEVudGVyQ3JpdGljYWxTZWN0aW9uKCAmWDExRFJWX0NyaXRTZWN0aW9uICk7CiAgIHIgPSBYUGFyc2VHZW9tZXRyeShhMCwgYTEsIGEyLCBhMywgYTQpOwogICBMZWF2ZUNyaXRpY2FsU2VjdGlvbiggJlgxMURSVl9Dcml0U2VjdGlvbiApOwotICBkcHJpbnRmX3gxMShzdGRkZWIsICJSZXQgWFBhcnNlR2VvbWV0cnlcbiIpOworICBkcHJpbnRmX2luZm8oeDExLCAiUmV0IFhQYXJzZUdlb21ldHJ5XG4iKTsKICAgcmV0dXJuIHI7CiB9CiAKIGludCAgVFNYUGVuZGluZyhEaXNwbGF5KiBhMCkKIHsKICAgaW50ICByOwotICBkcHJpbnRmX3gxMShzdGRkZWIsICJDYWxsIFhQZW5kaW5nXG4iKTsKKyAgZHByaW50Zl9pbmZvKHgxMSwgIkNhbGwgWFBlbmRpbmdcbiIpOwogICBFbnRlckNyaXRpY2FsU2VjdGlvbiggJlgxMURSVl9Dcml0U2VjdGlvbiApOwogICByID0gWFBlbmRpbmcoYTApOwogICBMZWF2ZUNyaXRpY2FsU2VjdGlvbiggJlgxMURSVl9Dcml0U2VjdGlvbiApOwotICBkcHJpbnRmX3gxMShzdGRkZWIsICJSZXQgWFBlbmRpbmdcbiIpOworICBkcHJpbnRmX2luZm8oeDExLCAiUmV0IFhQZW5kaW5nXG4iKTsKICAgcmV0dXJuIHI7CiB9CiAKIGludCAgVFNYUHV0QmFja0V2ZW50KERpc3BsYXkqIGEwLCBYRXZlbnQqIGExKQogewogICBpbnQgIHI7Ci0gIGRwcmludGZfeDExKHN0ZGRlYiwgIkNhbGwgWFB1dEJhY2tFdmVudFxuIik7CisgIGRwcmludGZfaW5mbyh4MTEsICJDYWxsIFhQdXRCYWNrRXZlbnRcbiIpOwogICBFbnRlckNyaXRpY2FsU2VjdGlvbiggJlgxMURSVl9Dcml0U2VjdGlvbiApOwogICByID0gWFB1dEJhY2tFdmVudChhMCwgYTEpOwogICBMZWF2ZUNyaXRpY2FsU2VjdGlvbiggJlgxMURSVl9Dcml0U2VjdGlvbiApOwotICBkcHJpbnRmX3gxMShzdGRkZWIsICJSZXQgWFB1dEJhY2tFdmVudFxuIik7CisgIGRwcmludGZfaW5mbyh4MTEsICJSZXQgWFB1dEJhY2tFdmVudFxuIik7CiAgIHJldHVybiByOwogfQogCiBpbnQgIFRTWFB1dEltYWdlKERpc3BsYXkqIGEwLCBEcmF3YWJsZSBhMSwgR0MgYTIsIFhJbWFnZSogYTMsIGludCBhNCwgaW50IGE1LCBpbnQgYTYsIGludCBhNywgdW5zaWduZWQgaW50IGE4LCB1bnNpZ25lZCBpbnQgYTkpCiB7CiAgIGludCAgcjsKLSAgZHByaW50Zl94MTEoc3RkZGViLCAiQ2FsbCBYUHV0SW1hZ2VcbiIpOworICBkcHJpbnRmX2luZm8oeDExLCAiQ2FsbCBYUHV0SW1hZ2VcbiIpOwogICBFbnRlckNyaXRpY2FsU2VjdGlvbiggJlgxMURSVl9Dcml0U2VjdGlvbiApOwogICByID0gWFB1dEltYWdlKGEwLCBhMSwgYTIsIGEzLCBhNCwgYTUsIGE2LCBhNywgYTgsIGE5KTsKICAgTGVhdmVDcml0aWNhbFNlY3Rpb24oICZYMTFEUlZfQ3JpdFNlY3Rpb24gKTsKLSAgZHByaW50Zl94MTEoc3RkZGViLCAiUmV0IFhQdXRJbWFnZVxuIik7CisgIGRwcmludGZfaW5mbyh4MTEsICJSZXQgWFB1dEltYWdlXG4iKTsKICAgcmV0dXJuIHI7CiB9CiAKIGludCAgVFNYUXVlcnlDb2xvcihEaXNwbGF5KiBhMCwgQ29sb3JtYXAgYTEsIFhDb2xvciogYTIpCiB7CiAgIGludCAgcjsKLSAgZHByaW50Zl94MTEoc3RkZGViLCAiQ2FsbCBYUXVlcnlDb2xvclxuIik7CisgIGRwcmludGZfaW5mbyh4MTEsICJDYWxsIFhRdWVyeUNvbG9yXG4iKTsKICAgRW50ZXJDcml0aWNhbFNlY3Rpb24oICZYMTFEUlZfQ3JpdFNlY3Rpb24gKTsKICAgciA9IFhRdWVyeUNvbG9yKGEwLCBhMSwgYTIpOwogICBMZWF2ZUNyaXRpY2FsU2VjdGlvbiggJlgxMURSVl9Dcml0U2VjdGlvbiApOwotICBkcHJpbnRmX3gxMShzdGRkZWIsICJSZXQgWFF1ZXJ5Q29sb3JcbiIpOworICBkcHJpbnRmX2luZm8oeDExLCAiUmV0IFhRdWVyeUNvbG9yXG4iKTsKICAgcmV0dXJuIHI7CiB9CiAKIGludCAgIFRTWFF1ZXJ5UG9pbnRlcihEaXNwbGF5KiBhMCwgV2luZG93IGExLCBXaW5kb3cqIGEyLCBXaW5kb3cqIGEzLCBpbnQqIGE0LCBpbnQqIGE1LCBpbnQqIGE2LCBpbnQqIGE3LCB1bnNpZ25lZCBpbnQqIGE4KQogewogICBpbnQgICByOwotICBkcHJpbnRmX3gxMShzdGRkZWIsICJDYWxsIFhRdWVyeVBvaW50ZXJcbiIpOworICBkcHJpbnRmX2luZm8oeDExLCAiQ2FsbCBYUXVlcnlQb2ludGVyXG4iKTsKICAgRW50ZXJDcml0aWNhbFNlY3Rpb24oICZYMTFEUlZfQ3JpdFNlY3Rpb24gKTsKICAgciA9IFhRdWVyeVBvaW50ZXIoYTAsIGExLCBhMiwgYTMsIGE0LCBhNSwgYTYsIGE3LCBhOCk7CiAgIExlYXZlQ3JpdGljYWxTZWN0aW9uKCAmWDExRFJWX0NyaXRTZWN0aW9uICk7Ci0gIGRwcmludGZfeDExKHN0ZGRlYiwgIlJldCBYUXVlcnlQb2ludGVyXG4iKTsKKyAgZHByaW50Zl9pbmZvKHgxMSwgIlJldCBYUXVlcnlQb2ludGVyXG4iKTsKICAgcmV0dXJuIHI7CiB9CiAKIGludCAgIFRTWFF1ZXJ5VHJlZShEaXNwbGF5KiBhMCwgV2luZG93IGExLCBXaW5kb3cqIGEyLCBXaW5kb3cqIGEzLCBXaW5kb3cqKiBhNCwgdW5zaWduZWQgaW50KiBhNSkKIHsKICAgaW50ICAgcjsKLSAgZHByaW50Zl94MTEoc3RkZGViLCAiQ2FsbCBYUXVlcnlUcmVlXG4iKTsKKyAgZHByaW50Zl9pbmZvKHgxMSwgIkNhbGwgWFF1ZXJ5VHJlZVxuIik7CiAgIEVudGVyQ3JpdGljYWxTZWN0aW9uKCAmWDExRFJWX0NyaXRTZWN0aW9uICk7CiAgIHIgPSBYUXVlcnlUcmVlKGEwLCBhMSwgYTIsIGEzLCBhNCwgYTUpOwogICBMZWF2ZUNyaXRpY2FsU2VjdGlvbiggJlgxMURSVl9Dcml0U2VjdGlvbiApOwotICBkcHJpbnRmX3gxMShzdGRkZWIsICJSZXQgWFF1ZXJ5VHJlZVxuIik7CisgIGRwcmludGZfaW5mbyh4MTEsICJSZXQgWFF1ZXJ5VHJlZVxuIik7CiAgIHJldHVybiByOwogfQogCiBpbnQgIFRTWFJlc2V0U2NyZWVuU2F2ZXIoRGlzcGxheSogYTApCiB7CiAgIGludCAgcjsKLSAgZHByaW50Zl94MTEoc3RkZGViLCAiQ2FsbCBYUmVzZXRTY3JlZW5TYXZlclxuIik7CisgIGRwcmludGZfaW5mbyh4MTEsICJDYWxsIFhSZXNldFNjcmVlblNhdmVyXG4iKTsKICAgRW50ZXJDcml0aWNhbFNlY3Rpb24oICZYMTFEUlZfQ3JpdFNlY3Rpb24gKTsKICAgciA9IFhSZXNldFNjcmVlblNhdmVyKGEwKTsKICAgTGVhdmVDcml0aWNhbFNlY3Rpb24oICZYMTFEUlZfQ3JpdFNlY3Rpb24gKTsKLSAgZHByaW50Zl94MTEoc3RkZGViLCAiUmV0IFhSZXNldFNjcmVlblNhdmVyXG4iKTsKKyAgZHByaW50Zl9pbmZvKHgxMSwgIlJldCBYUmVzZXRTY3JlZW5TYXZlclxuIik7CiAgIHJldHVybiByOwogfQogCiBpbnQgIFRTWFJlc3RhY2tXaW5kb3dzKERpc3BsYXkqIGEwLCBXaW5kb3cqIGExLCBpbnQgYTIpCiB7CiAgIGludCAgcjsKLSAgZHByaW50Zl94MTEoc3RkZGViLCAiQ2FsbCBYUmVzdGFja1dpbmRvd3NcbiIpOworICBkcHJpbnRmX2luZm8oeDExLCAiQ2FsbCBYUmVzdGFja1dpbmRvd3NcbiIpOwogICBFbnRlckNyaXRpY2FsU2VjdGlvbiggJlgxMURSVl9Dcml0U2VjdGlvbiApOwogICByID0gWFJlc3RhY2tXaW5kb3dzKGEwLCBhMSwgYTIpOwogICBMZWF2ZUNyaXRpY2FsU2VjdGlvbiggJlgxMURSVl9Dcml0U2VjdGlvbiApOwotICBkcHJpbnRmX3gxMShzdGRkZWIsICJSZXQgWFJlc3RhY2tXaW5kb3dzXG4iKTsKKyAgZHByaW50Zl9pbmZvKHgxMSwgIlJldCBYUmVzdGFja1dpbmRvd3NcbiIpOwogICByZXR1cm4gcjsKIH0KIAogaW50ICAgVFNYU2VuZEV2ZW50KERpc3BsYXkqIGEwLCBXaW5kb3cgYTEsIGludCBhMiwgbG9uZyBhMywgWEV2ZW50KiBhNCkKIHsKICAgaW50ICAgcjsKLSAgZHByaW50Zl94MTEoc3RkZGViLCAiQ2FsbCBYU2VuZEV2ZW50XG4iKTsKKyAgZHByaW50Zl9pbmZvKHgxMSwgIkNhbGwgWFNlbmRFdmVudFxuIik7CiAgIEVudGVyQ3JpdGljYWxTZWN0aW9uKCAmWDExRFJWX0NyaXRTZWN0aW9uICk7CiAgIHIgPSBYU2VuZEV2ZW50KGEwLCBhMSwgYTIsIGEzLCBhNCk7CiAgIExlYXZlQ3JpdGljYWxTZWN0aW9uKCAmWDExRFJWX0NyaXRTZWN0aW9uICk7Ci0gIGRwcmludGZfeDExKHN0ZGRlYiwgIlJldCBYU2VuZEV2ZW50XG4iKTsKKyAgZHByaW50Zl9pbmZvKHgxMSwgIlJldCBYU2VuZEV2ZW50XG4iKTsKICAgcmV0dXJuIHI7CiB9CiAKIGludCAgVFNYU2V0QXJjTW9kZShEaXNwbGF5KiBhMCwgR0MgYTEsIGludCBhMikKIHsKICAgaW50ICByOwotICBkcHJpbnRmX3gxMShzdGRkZWIsICJDYWxsIFhTZXRBcmNNb2RlXG4iKTsKKyAgZHByaW50Zl9pbmZvKHgxMSwgIkNhbGwgWFNldEFyY01vZGVcbiIpOwogICBFbnRlckNyaXRpY2FsU2VjdGlvbiggJlgxMURSVl9Dcml0U2VjdGlvbiApOwogICByID0gWFNldEFyY01vZGUoYTAsIGExLCBhMik7CiAgIExlYXZlQ3JpdGljYWxTZWN0aW9uKCAmWDExRFJWX0NyaXRTZWN0aW9uICk7Ci0gIGRwcmludGZfeDExKHN0ZGRlYiwgIlJldCBYU2V0QXJjTW9kZVxuIik7CisgIGRwcmludGZfaW5mbyh4MTEsICJSZXQgWFNldEFyY01vZGVcbiIpOwogICByZXR1cm4gcjsKIH0KIAogaW50ICBUU1hTZXRCYWNrZ3JvdW5kKERpc3BsYXkqIGEwLCBHQyBhMSwgdW5zaWduZWQgbG9uZyBhMikKIHsKICAgaW50ICByOwotICBkcHJpbnRmX3gxMShzdGRkZWIsICJDYWxsIFhTZXRCYWNrZ3JvdW5kXG4iKTsKKyAgZHByaW50Zl9pbmZvKHgxMSwgIkNhbGwgWFNldEJhY2tncm91bmRcbiIpOwogICBFbnRlckNyaXRpY2FsU2VjdGlvbiggJlgxMURSVl9Dcml0U2VjdGlvbiApOwogICByID0gWFNldEJhY2tncm91bmQoYTAsIGExLCBhMik7CiAgIExlYXZlQ3JpdGljYWxTZWN0aW9uKCAmWDExRFJWX0NyaXRTZWN0aW9uICk7Ci0gIGRwcmludGZfeDExKHN0ZGRlYiwgIlJldCBYU2V0QmFja2dyb3VuZFxuIik7CisgIGRwcmludGZfaW5mbyh4MTEsICJSZXQgWFNldEJhY2tncm91bmRcbiIpOwogICByZXR1cm4gcjsKIH0KIAogaW50ICBUU1hTZXRDbGlwTWFzayhEaXNwbGF5KiBhMCwgR0MgYTEsIFBpeG1hcCBhMikKIHsKICAgaW50ICByOwotICBkcHJpbnRmX3gxMShzdGRkZWIsICJDYWxsIFhTZXRDbGlwTWFza1xuIik7CisgIGRwcmludGZfaW5mbyh4MTEsICJDYWxsIFhTZXRDbGlwTWFza1xuIik7CiAgIEVudGVyQ3JpdGljYWxTZWN0aW9uKCAmWDExRFJWX0NyaXRTZWN0aW9uICk7CiAgIHIgPSBYU2V0Q2xpcE1hc2soYTAsIGExLCBhMik7CiAgIExlYXZlQ3JpdGljYWxTZWN0aW9uKCAmWDExRFJWX0NyaXRTZWN0aW9uICk7Ci0gIGRwcmludGZfeDExKHN0ZGRlYiwgIlJldCBYU2V0Q2xpcE1hc2tcbiIpOworICBkcHJpbnRmX2luZm8oeDExLCAiUmV0IFhTZXRDbGlwTWFza1xuIik7CiAgIHJldHVybiByOwogfQogCiBpbnQgIFRTWFNldENsaXBPcmlnaW4oRGlzcGxheSogYTAsIEdDIGExLCBpbnQgYTIsIGludCBhMykKIHsKICAgaW50ICByOwotICBkcHJpbnRmX3gxMShzdGRkZWIsICJDYWxsIFhTZXRDbGlwT3JpZ2luXG4iKTsKKyAgZHByaW50Zl9pbmZvKHgxMSwgIkNhbGwgWFNldENsaXBPcmlnaW5cbiIpOwogICBFbnRlckNyaXRpY2FsU2VjdGlvbiggJlgxMURSVl9Dcml0U2VjdGlvbiApOwogICByID0gWFNldENsaXBPcmlnaW4oYTAsIGExLCBhMiwgYTMpOwogICBMZWF2ZUNyaXRpY2FsU2VjdGlvbiggJlgxMURSVl9Dcml0U2VjdGlvbiApOwotICBkcHJpbnRmX3gxMShzdGRkZWIsICJSZXQgWFNldENsaXBPcmlnaW5cbiIpOworICBkcHJpbnRmX2luZm8oeDExLCAiUmV0IFhTZXRDbGlwT3JpZ2luXG4iKTsKICAgcmV0dXJuIHI7CiB9CiAKIGludCAgVFNYU2V0Q2xpcFJlY3RhbmdsZXMoRGlzcGxheSogYTAsIEdDIGExLCBpbnQgYTIsIGludCBhMywgWFJlY3RhbmdsZSogYTQsIGludCBhNSwgaW50IGE2KQogewogICBpbnQgIHI7Ci0gIGRwcmludGZfeDExKHN0ZGRlYiwgIkNhbGwgWFNldENsaXBSZWN0YW5nbGVzXG4iKTsKKyAgZHByaW50Zl9pbmZvKHgxMSwgIkNhbGwgWFNldENsaXBSZWN0YW5nbGVzXG4iKTsKICAgRW50ZXJDcml0aWNhbFNlY3Rpb24oICZYMTFEUlZfQ3JpdFNlY3Rpb24gKTsKICAgciA9IFhTZXRDbGlwUmVjdGFuZ2xlcyhhMCwgYTEsIGEyLCBhMywgYTQsIGE1LCBhNik7CiAgIExlYXZlQ3JpdGljYWxTZWN0aW9uKCAmWDExRFJWX0NyaXRTZWN0aW9uICk7Ci0gIGRwcmludGZfeDExKHN0ZGRlYiwgIlJldCBYU2V0Q2xpcFJlY3RhbmdsZXNcbiIpOworICBkcHJpbnRmX2luZm8oeDExLCAiUmV0IFhTZXRDbGlwUmVjdGFuZ2xlc1xuIik7CiAgIHJldHVybiByOwogfQogCiBpbnQgIFRTWFNldERhc2hlcyhEaXNwbGF5KiBhMCwgR0MgYTEsIGludCBhMiwgY29uc3QgIGNoYXIqIGEzLCBpbnQgYTQpCiB7CiAgIGludCAgcjsKLSAgZHByaW50Zl94MTEoc3RkZGViLCAiQ2FsbCBYU2V0RGFzaGVzXG4iKTsKKyAgZHByaW50Zl9pbmZvKHgxMSwgIkNhbGwgWFNldERhc2hlc1xuIik7CiAgIEVudGVyQ3JpdGljYWxTZWN0aW9uKCAmWDExRFJWX0NyaXRTZWN0aW9uICk7CiAgIHIgPSBYU2V0RGFzaGVzKGEwLCBhMSwgYTIsIGEzLCBhNCk7CiAgIExlYXZlQ3JpdGljYWxTZWN0aW9uKCAmWDExRFJWX0NyaXRTZWN0aW9uICk7Ci0gIGRwcmludGZfeDExKHN0ZGRlYiwgIlJldCBYU2V0RGFzaGVzXG4iKTsKKyAgZHByaW50Zl9pbmZvKHgxMSwgIlJldCBYU2V0RGFzaGVzXG4iKTsKICAgcmV0dXJuIHI7CiB9CiAKIGludCAgVFNYU2V0RmlsbFN0eWxlKERpc3BsYXkqIGEwLCBHQyBhMSwgaW50IGEyKQogewogICBpbnQgIHI7Ci0gIGRwcmludGZfeDExKHN0ZGRlYiwgIkNhbGwgWFNldEZpbGxTdHlsZVxuIik7CisgIGRwcmludGZfaW5mbyh4MTEsICJDYWxsIFhTZXRGaWxsU3R5bGVcbiIpOwogICBFbnRlckNyaXRpY2FsU2VjdGlvbiggJlgxMURSVl9Dcml0U2VjdGlvbiApOwogICByID0gWFNldEZpbGxTdHlsZShhMCwgYTEsIGEyKTsKICAgTGVhdmVDcml0aWNhbFNlY3Rpb24oICZYMTFEUlZfQ3JpdFNlY3Rpb24gKTsKLSAgZHByaW50Zl94MTEoc3RkZGViLCAiUmV0IFhTZXRGaWxsU3R5bGVcbiIpOworICBkcHJpbnRmX2luZm8oeDExLCAiUmV0IFhTZXRGaWxsU3R5bGVcbiIpOwogICByZXR1cm4gcjsKIH0KIAogaW50ICBUU1hTZXRGb3JlZ3JvdW5kKERpc3BsYXkqIGEwLCBHQyBhMSwgdW5zaWduZWQgbG9uZyBhMikKIHsKICAgaW50ICByOwotICBkcHJpbnRmX3gxMShzdGRkZWIsICJDYWxsIFhTZXRGb3JlZ3JvdW5kXG4iKTsKKyAgZHByaW50Zl9pbmZvKHgxMSwgIkNhbGwgWFNldEZvcmVncm91bmRcbiIpOwogICBFbnRlckNyaXRpY2FsU2VjdGlvbiggJlgxMURSVl9Dcml0U2VjdGlvbiApOwogICByID0gWFNldEZvcmVncm91bmQoYTAsIGExLCBhMik7CiAgIExlYXZlQ3JpdGljYWxTZWN0aW9uKCAmWDExRFJWX0NyaXRTZWN0aW9uICk7Ci0gIGRwcmludGZfeDExKHN0ZGRlYiwgIlJldCBYU2V0Rm9yZWdyb3VuZFxuIik7CisgIGRwcmludGZfaW5mbyh4MTEsICJSZXQgWFNldEZvcmVncm91bmRcbiIpOwogICByZXR1cm4gcjsKIH0KIAogaW50ICBUU1hTZXRGdW5jdGlvbihEaXNwbGF5KiBhMCwgR0MgYTEsIGludCBhMikKIHsKICAgaW50ICByOwotICBkcHJpbnRmX3gxMShzdGRkZWIsICJDYWxsIFhTZXRGdW5jdGlvblxuIik7CisgIGRwcmludGZfaW5mbyh4MTEsICJDYWxsIFhTZXRGdW5jdGlvblxuIik7CiAgIEVudGVyQ3JpdGljYWxTZWN0aW9uKCAmWDExRFJWX0NyaXRTZWN0aW9uICk7CiAgIHIgPSBYU2V0RnVuY3Rpb24oYTAsIGExLCBhMik7CiAgIExlYXZlQ3JpdGljYWxTZWN0aW9uKCAmWDExRFJWX0NyaXRTZWN0aW9uICk7Ci0gIGRwcmludGZfeDExKHN0ZGRlYiwgIlJldCBYU2V0RnVuY3Rpb25cbiIpOworICBkcHJpbnRmX2luZm8oeDExLCAiUmV0IFhTZXRGdW5jdGlvblxuIik7CiAgIHJldHVybiByOwogfQogCiBpbnQgIFRTWFNldEdyYXBoaWNzRXhwb3N1cmVzKERpc3BsYXkqIGEwLCBHQyBhMSwgaW50IGEyKQogewogICBpbnQgIHI7Ci0gIGRwcmludGZfeDExKHN0ZGRlYiwgIkNhbGwgWFNldEdyYXBoaWNzRXhwb3N1cmVzXG4iKTsKKyAgZHByaW50Zl9pbmZvKHgxMSwgIkNhbGwgWFNldEdyYXBoaWNzRXhwb3N1cmVzXG4iKTsKICAgRW50ZXJDcml0aWNhbFNlY3Rpb24oICZYMTFEUlZfQ3JpdFNlY3Rpb24gKTsKICAgciA9IFhTZXRHcmFwaGljc0V4cG9zdXJlcyhhMCwgYTEsIGEyKTsKICAgTGVhdmVDcml0aWNhbFNlY3Rpb24oICZYMTFEUlZfQ3JpdFNlY3Rpb24gKTsKLSAgZHByaW50Zl94MTEoc3RkZGViLCAiUmV0IFhTZXRHcmFwaGljc0V4cG9zdXJlc1xuIik7CisgIGRwcmludGZfaW5mbyh4MTEsICJSZXQgWFNldEdyYXBoaWNzRXhwb3N1cmVzXG4iKTsKICAgcmV0dXJuIHI7CiB9CiAKIGludCAgVFNYU2V0SWNvbk5hbWUoRGlzcGxheSogYTAsIFdpbmRvdyBhMSwgY29uc3QgIGNoYXIqIGEyKQogewogICBpbnQgIHI7Ci0gIGRwcmludGZfeDExKHN0ZGRlYiwgIkNhbGwgWFNldEljb25OYW1lXG4iKTsKKyAgZHByaW50Zl9pbmZvKHgxMSwgIkNhbGwgWFNldEljb25OYW1lXG4iKTsKICAgRW50ZXJDcml0aWNhbFNlY3Rpb24oICZYMTFEUlZfQ3JpdFNlY3Rpb24gKTsKICAgciA9IFhTZXRJY29uTmFtZShhMCwgYTEsIGEyKTsKICAgTGVhdmVDcml0aWNhbFNlY3Rpb24oICZYMTFEUlZfQ3JpdFNlY3Rpb24gKTsKLSAgZHByaW50Zl94MTEoc3RkZGViLCAiUmV0IFhTZXRJY29uTmFtZVxuIik7CisgIGRwcmludGZfaW5mbyh4MTEsICJSZXQgWFNldEljb25OYW1lXG4iKTsKICAgcmV0dXJuIHI7CiB9CiAKIGludCAgVFNYU2V0SW5wdXRGb2N1cyhEaXNwbGF5KiBhMCwgV2luZG93IGExLCBpbnQgYTIsIFRpbWUgYTMpCiB7CiAgIGludCAgcjsKLSAgZHByaW50Zl94MTEoc3RkZGViLCAiQ2FsbCBYU2V0SW5wdXRGb2N1c1xuIik7CisgIGRwcmludGZfaW5mbyh4MTEsICJDYWxsIFhTZXRJbnB1dEZvY3VzXG4iKTsKICAgRW50ZXJDcml0aWNhbFNlY3Rpb24oICZYMTFEUlZfQ3JpdFNlY3Rpb24gKTsKICAgciA9IFhTZXRJbnB1dEZvY3VzKGEwLCBhMSwgYTIsIGEzKTsKICAgTGVhdmVDcml0aWNhbFNlY3Rpb24oICZYMTFEUlZfQ3JpdFNlY3Rpb24gKTsKLSAgZHByaW50Zl94MTEoc3RkZGViLCAiUmV0IFhTZXRJbnB1dEZvY3VzXG4iKTsKKyAgZHByaW50Zl9pbmZvKHgxMSwgIlJldCBYU2V0SW5wdXRGb2N1c1xuIik7CiAgIHJldHVybiByOwogfQogCiBpbnQgIFRTWFNldExpbmVBdHRyaWJ1dGVzKERpc3BsYXkqIGEwLCBHQyBhMSwgdW5zaWduZWQgaW50IGEyLCBpbnQgYTMsIGludCBhNCwgaW50IGE1KQogewogICBpbnQgIHI7Ci0gIGRwcmludGZfeDExKHN0ZGRlYiwgIkNhbGwgWFNldExpbmVBdHRyaWJ1dGVzXG4iKTsKKyAgZHByaW50Zl9pbmZvKHgxMSwgIkNhbGwgWFNldExpbmVBdHRyaWJ1dGVzXG4iKTsKICAgRW50ZXJDcml0aWNhbFNlY3Rpb24oICZYMTFEUlZfQ3JpdFNlY3Rpb24gKTsKICAgciA9IFhTZXRMaW5lQXR0cmlidXRlcyhhMCwgYTEsIGEyLCBhMywgYTQsIGE1KTsKICAgTGVhdmVDcml0aWNhbFNlY3Rpb24oICZYMTFEUlZfQ3JpdFNlY3Rpb24gKTsKLSAgZHByaW50Zl94MTEoc3RkZGViLCAiUmV0IFhTZXRMaW5lQXR0cmlidXRlc1xuIik7CisgIGRwcmludGZfaW5mbyh4MTEsICJSZXQgWFNldExpbmVBdHRyaWJ1dGVzXG4iKTsKICAgcmV0dXJuIHI7CiB9CiAKIGludCAgVFNYU2V0U2NyZWVuU2F2ZXIoRGlzcGxheSogYTAsIGludCBhMSwgaW50IGEyLCBpbnQgYTMsIGludCBhNCkKIHsKICAgaW50ICByOwotICBkcHJpbnRmX3gxMShzdGRkZWIsICJDYWxsIFhTZXRTY3JlZW5TYXZlclxuIik7CisgIGRwcmludGZfaW5mbyh4MTEsICJDYWxsIFhTZXRTY3JlZW5TYXZlclxuIik7CiAgIEVudGVyQ3JpdGljYWxTZWN0aW9uKCAmWDExRFJWX0NyaXRTZWN0aW9uICk7CiAgIHIgPSBYU2V0U2NyZWVuU2F2ZXIoYTAsIGExLCBhMiwgYTMsIGE0KTsKICAgTGVhdmVDcml0aWNhbFNlY3Rpb24oICZYMTFEUlZfQ3JpdFNlY3Rpb24gKTsKLSAgZHByaW50Zl94MTEoc3RkZGViLCAiUmV0IFhTZXRTY3JlZW5TYXZlclxuIik7CisgIGRwcmludGZfaW5mbyh4MTEsICJSZXQgWFNldFNjcmVlblNhdmVyXG4iKTsKICAgcmV0dXJuIHI7CiB9CiAKIGludCAgVFNYU2V0U2VsZWN0aW9uT3duZXIoRGlzcGxheSogYTAsIEF0b20gYTEsIFdpbmRvdyBhMiwgVGltZSBhMykKIHsKICAgaW50ICByOwotICBkcHJpbnRmX3gxMShzdGRkZWIsICJDYWxsIFhTZXRTZWxlY3Rpb25Pd25lclxuIik7CisgIGRwcmludGZfaW5mbyh4MTEsICJDYWxsIFhTZXRTZWxlY3Rpb25Pd25lclxuIik7CiAgIEVudGVyQ3JpdGljYWxTZWN0aW9uKCAmWDExRFJWX0NyaXRTZWN0aW9uICk7CiAgIHIgPSBYU2V0U2VsZWN0aW9uT3duZXIoYTAsIGExLCBhMiwgYTMpOwogICBMZWF2ZUNyaXRpY2FsU2VjdGlvbiggJlgxMURSVl9Dcml0U2VjdGlvbiApOwotICBkcHJpbnRmX3gxMShzdGRkZWIsICJSZXQgWFNldFNlbGVjdGlvbk93bmVyXG4iKTsKKyAgZHByaW50Zl9pbmZvKHgxMSwgIlJldCBYU2V0U2VsZWN0aW9uT3duZXJcbiIpOwogICByZXR1cm4gcjsKIH0KIAogaW50ICBUU1hTZXRTdWJ3aW5kb3dNb2RlKERpc3BsYXkqIGEwLCBHQyBhMSwgaW50IGEyKQogewogICBpbnQgIHI7Ci0gIGRwcmludGZfeDExKHN0ZGRlYiwgIkNhbGwgWFNldFN1YndpbmRvd01vZGVcbiIpOworICBkcHJpbnRmX2luZm8oeDExLCAiQ2FsbCBYU2V0U3Vid2luZG93TW9kZVxuIik7CiAgIEVudGVyQ3JpdGljYWxTZWN0aW9uKCAmWDExRFJWX0NyaXRTZWN0aW9uICk7CiAgIHIgPSBYU2V0U3Vid2luZG93TW9kZShhMCwgYTEsIGEyKTsKICAgTGVhdmVDcml0aWNhbFNlY3Rpb24oICZYMTFEUlZfQ3JpdFNlY3Rpb24gKTsKLSAgZHByaW50Zl94MTEoc3RkZGViLCAiUmV0IFhTZXRTdWJ3aW5kb3dNb2RlXG4iKTsKKyAgZHByaW50Zl9pbmZvKHgxMSwgIlJldCBYU2V0U3Vid2luZG93TW9kZVxuIik7CiAgIHJldHVybiByOwogfQogCiBpbnQgIFRTWFN0b3JlQ29sb3IoRGlzcGxheSogYTAsIENvbG9ybWFwIGExLCBYQ29sb3IqIGEyKQogewogICBpbnQgIHI7Ci0gIGRwcmludGZfeDExKHN0ZGRlYiwgIkNhbGwgWFN0b3JlQ29sb3JcbiIpOworICBkcHJpbnRmX2luZm8oeDExLCAiQ2FsbCBYU3RvcmVDb2xvclxuIik7CiAgIEVudGVyQ3JpdGljYWxTZWN0aW9uKCAmWDExRFJWX0NyaXRTZWN0aW9uICk7CiAgIHIgPSBYU3RvcmVDb2xvcihhMCwgYTEsIGEyKTsKICAgTGVhdmVDcml0aWNhbFNlY3Rpb24oICZYMTFEUlZfQ3JpdFNlY3Rpb24gKTsKLSAgZHByaW50Zl94MTEoc3RkZGViLCAiUmV0IFhTdG9yZUNvbG9yXG4iKTsKKyAgZHByaW50Zl9pbmZvKHgxMSwgIlJldCBYU3RvcmVDb2xvclxuIik7CiAgIHJldHVybiByOwogfQogCiBpbnQgIFRTWFN0b3JlTmFtZShEaXNwbGF5KiBhMCwgV2luZG93IGExLCBjb25zdCAgY2hhciogYTIpCiB7CiAgIGludCAgcjsKLSAgZHByaW50Zl94MTEoc3RkZGViLCAiQ2FsbCBYU3RvcmVOYW1lXG4iKTsKKyAgZHByaW50Zl9pbmZvKHgxMSwgIkNhbGwgWFN0b3JlTmFtZVxuIik7CiAgIEVudGVyQ3JpdGljYWxTZWN0aW9uKCAmWDExRFJWX0NyaXRTZWN0aW9uICk7CiAgIHIgPSBYU3RvcmVOYW1lKGEwLCBhMSwgYTIpOwogICBMZWF2ZUNyaXRpY2FsU2VjdGlvbiggJlgxMURSVl9Dcml0U2VjdGlvbiApOwotICBkcHJpbnRmX3gxMShzdGRkZWIsICJSZXQgWFN0b3JlTmFtZVxuIik7CisgIGRwcmludGZfaW5mbyh4MTEsICJSZXQgWFN0b3JlTmFtZVxuIik7CiAgIHJldHVybiByOwogfQogCiBpbnQgIFRTWFN5bmMoRGlzcGxheSogYTAsIGludCBhMSkKIHsKICAgaW50ICByOwotICBkcHJpbnRmX3gxMShzdGRkZWIsICJDYWxsIFhTeW5jXG4iKTsKKyAgZHByaW50Zl9pbmZvKHgxMSwgIkNhbGwgWFN5bmNcbiIpOwogICBFbnRlckNyaXRpY2FsU2VjdGlvbiggJlgxMURSVl9Dcml0U2VjdGlvbiApOwogICByID0gWFN5bmMoYTAsIGExKTsKICAgTGVhdmVDcml0aWNhbFNlY3Rpb24oICZYMTFEUlZfQ3JpdFNlY3Rpb24gKTsKLSAgZHByaW50Zl94MTEoc3RkZGViLCAiUmV0IFhTeW5jXG4iKTsKKyAgZHByaW50Zl9pbmZvKHgxMSwgIlJldCBYU3luY1xuIik7CiAgIHJldHVybiByOwogfQogCiBpbnQgIFRTWFRleHRFeHRlbnRzKFhGb250U3RydWN0KiBhMCwgY29uc3QgIGNoYXIqIGExLCBpbnQgYTIsIGludCogYTMsIGludCogYTQsIGludCogYTUsIFhDaGFyU3RydWN0KiBhNikKIHsKICAgaW50ICByOwotICBkcHJpbnRmX3gxMShzdGRkZWIsICJDYWxsIFhUZXh0RXh0ZW50c1xuIik7CisgIGRwcmludGZfaW5mbyh4MTEsICJDYWxsIFhUZXh0RXh0ZW50c1xuIik7CiAgIEVudGVyQ3JpdGljYWxTZWN0aW9uKCAmWDExRFJWX0NyaXRTZWN0aW9uICk7CiAgIHIgPSBYVGV4dEV4dGVudHMoYTAsIGExLCBhMiwgYTMsIGE0LCBhNSwgYTYpOwogICBMZWF2ZUNyaXRpY2FsU2VjdGlvbiggJlgxMURSVl9Dcml0U2VjdGlvbiApOwotICBkcHJpbnRmX3gxMShzdGRkZWIsICJSZXQgWFRleHRFeHRlbnRzXG4iKTsKKyAgZHByaW50Zl9pbmZvKHgxMSwgIlJldCBYVGV4dEV4dGVudHNcbiIpOwogICByZXR1cm4gcjsKIH0KIAogaW50ICBUU1hUZXh0V2lkdGgoWEZvbnRTdHJ1Y3QqIGEwLCBjb25zdCAgY2hhciogYTEsIGludCBhMikKIHsKICAgaW50ICByOwotICBkcHJpbnRmX3gxMShzdGRkZWIsICJDYWxsIFhUZXh0V2lkdGhcbiIpOworICBkcHJpbnRmX2luZm8oeDExLCAiQ2FsbCBYVGV4dFdpZHRoXG4iKTsKICAgRW50ZXJDcml0aWNhbFNlY3Rpb24oICZYMTFEUlZfQ3JpdFNlY3Rpb24gKTsKICAgciA9IFhUZXh0V2lkdGgoYTAsIGExLCBhMik7CiAgIExlYXZlQ3JpdGljYWxTZWN0aW9uKCAmWDExRFJWX0NyaXRTZWN0aW9uICk7Ci0gIGRwcmludGZfeDExKHN0ZGRlYiwgIlJldCBYVGV4dFdpZHRoXG4iKTsKKyAgZHByaW50Zl9pbmZvKHgxMSwgIlJldCBYVGV4dFdpZHRoXG4iKTsKICAgcmV0dXJuIHI7CiB9CiAKIGludCAgVFNYVW5ncmFiUG9pbnRlcihEaXNwbGF5KiBhMCwgVGltZSBhMSkKIHsKICAgaW50ICByOwotICBkcHJpbnRmX3gxMShzdGRkZWIsICJDYWxsIFhVbmdyYWJQb2ludGVyXG4iKTsKKyAgZHByaW50Zl9pbmZvKHgxMSwgIkNhbGwgWFVuZ3JhYlBvaW50ZXJcbiIpOwogICBFbnRlckNyaXRpY2FsU2VjdGlvbiggJlgxMURSVl9Dcml0U2VjdGlvbiApOwogICByID0gWFVuZ3JhYlBvaW50ZXIoYTAsIGExKTsKICAgTGVhdmVDcml0aWNhbFNlY3Rpb24oICZYMTFEUlZfQ3JpdFNlY3Rpb24gKTsKLSAgZHByaW50Zl94MTEoc3RkZGViLCAiUmV0IFhVbmdyYWJQb2ludGVyXG4iKTsKKyAgZHByaW50Zl9pbmZvKHgxMSwgIlJldCBYVW5ncmFiUG9pbnRlclxuIik7CiAgIHJldHVybiByOwogfQogCiBpbnQgIFRTWFVuZ3JhYlNlcnZlcihEaXNwbGF5KiBhMCkKIHsKICAgaW50ICByOwotICBkcHJpbnRmX3gxMShzdGRkZWIsICJDYWxsIFhVbmdyYWJTZXJ2ZXJcbiIpOworICBkcHJpbnRmX2luZm8oeDExLCAiQ2FsbCBYVW5ncmFiU2VydmVyXG4iKTsKICAgRW50ZXJDcml0aWNhbFNlY3Rpb24oICZYMTFEUlZfQ3JpdFNlY3Rpb24gKTsKICAgciA9IFhVbmdyYWJTZXJ2ZXIoYTApOwogICBMZWF2ZUNyaXRpY2FsU2VjdGlvbiggJlgxMURSVl9Dcml0U2VjdGlvbiApOwotICBkcHJpbnRmX3gxMShzdGRkZWIsICJSZXQgWFVuZ3JhYlNlcnZlclxuIik7CisgIGRwcmludGZfaW5mbyh4MTEsICJSZXQgWFVuZ3JhYlNlcnZlclxuIik7CiAgIHJldHVybiByOwogfQogCiBpbnQgIFRTWFVuaW5zdGFsbENvbG9ybWFwKERpc3BsYXkqIGEwLCBDb2xvcm1hcCBhMSkKIHsKICAgaW50ICByOwotICBkcHJpbnRmX3gxMShzdGRkZWIsICJDYWxsIFhVbmluc3RhbGxDb2xvcm1hcFxuIik7CisgIGRwcmludGZfaW5mbyh4MTEsICJDYWxsIFhVbmluc3RhbGxDb2xvcm1hcFxuIik7CiAgIEVudGVyQ3JpdGljYWxTZWN0aW9uKCAmWDExRFJWX0NyaXRTZWN0aW9uICk7CiAgIHIgPSBYVW5pbnN0YWxsQ29sb3JtYXAoYTAsIGExKTsKICAgTGVhdmVDcml0aWNhbFNlY3Rpb24oICZYMTFEUlZfQ3JpdFNlY3Rpb24gKTsKLSAgZHByaW50Zl94MTEoc3RkZGViLCAiUmV0IFhVbmluc3RhbGxDb2xvcm1hcFxuIik7CisgIGRwcmludGZfaW5mbyh4MTEsICJSZXQgWFVuaW5zdGFsbENvbG9ybWFwXG4iKTsKICAgcmV0dXJuIHI7CiB9CiAKIGludCAgVFNYVW5tYXBXaW5kb3coRGlzcGxheSogYTAsIFdpbmRvdyBhMSkKIHsKICAgaW50ICByOwotICBkcHJpbnRmX3gxMShzdGRkZWIsICJDYWxsIFhVbm1hcFdpbmRvd1xuIik7CisgIGRwcmludGZfaW5mbyh4MTEsICJDYWxsIFhVbm1hcFdpbmRvd1xuIik7CiAgIEVudGVyQ3JpdGljYWxTZWN0aW9uKCAmWDExRFJWX0NyaXRTZWN0aW9uICk7CiAgIHIgPSBYVW5tYXBXaW5kb3coYTAsIGExKTsKICAgTGVhdmVDcml0aWNhbFNlY3Rpb24oICZYMTFEUlZfQ3JpdFNlY3Rpb24gKTsKLSAgZHByaW50Zl94MTEoc3RkZGViLCAiUmV0IFhVbm1hcFdpbmRvd1xuIik7CisgIGRwcmludGZfaW5mbyh4MTEsICJSZXQgWFVubWFwV2luZG93XG4iKTsKICAgcmV0dXJuIHI7CiB9CiAKIGludCAgVFNYV2FycFBvaW50ZXIoRGlzcGxheSogYTAsIFdpbmRvdyBhMSwgV2luZG93IGEyLCBpbnQgYTMsIGludCBhNCwgdW5zaWduZWQgaW50IGE1LCB1bnNpZ25lZCBpbnQgYTYsIGludCBhNywgaW50IGE4KQogewogICBpbnQgIHI7Ci0gIGRwcmludGZfeDExKHN0ZGRlYiwgIkNhbGwgWFdhcnBQb2ludGVyXG4iKTsKKyAgZHByaW50Zl9pbmZvKHgxMSwgIkNhbGwgWFdhcnBQb2ludGVyXG4iKTsKICAgRW50ZXJDcml0aWNhbFNlY3Rpb24oICZYMTFEUlZfQ3JpdFNlY3Rpb24gKTsKICAgciA9IFhXYXJwUG9pbnRlcihhMCwgYTEsIGEyLCBhMywgYTQsIGE1LCBhNiwgYTcsIGE4KTsKICAgTGVhdmVDcml0aWNhbFNlY3Rpb24oICZYMTFEUlZfQ3JpdFNlY3Rpb24gKTsKLSAgZHByaW50Zl94MTEoc3RkZGViLCAiUmV0IFhXYXJwUG9pbnRlclxuIik7CisgIGRwcmludGZfaW5mbyh4MTEsICJSZXQgWFdhcnBQb2ludGVyXG4iKTsKICAgcmV0dXJuIHI7CiB9CiAKIGludCAoKlRTWFN5bmNocm9uaXplKERpc3BsYXkgKmEwLCBCb29sIGExKSkoRGlzcGxheSAqKQogewogICBpbnQgKCpyKShEaXNwbGF5ICopOwotICBkcHJpbnRmX3gxMShzdGRkZWIsICJDYWxsIFhTeW5jaHJvbml6ZVxuIik7CisgIGRwcmludGZfaW5mbyh4MTEsICJDYWxsIFhTeW5jaHJvbml6ZVxuIik7CiAgIEVudGVyQ3JpdGljYWxTZWN0aW9uKCAmWDExRFJWX0NyaXRTZWN0aW9uICk7CiAgIHIgPSBYU3luY2hyb25pemUoYTAsIGExKTsKICAgTGVhdmVDcml0aWNhbFNlY3Rpb24oICZYMTFEUlZfQ3JpdFNlY3Rpb24gKTsKLSAgZHByaW50Zl94MTEoc3RkZGViLCAiUmV0IFhTeW5jaHJvbml6ZVxuIik7CisgIGRwcmludGZfaW5mbyh4MTEsICJSZXQgWFN5bmNocm9uaXplXG4iKTsKICAgcmV0dXJuIHI7CiB9CiAKQEAgLTEyNjUsOSArMTI2NCw5IEBACiAKIHZvaWQgVFNfWEluaXRJbWFnZUZ1bmNQdHJzKFhJbWFnZSAqYTApCiB7Ci0gIGRwcmludGZfeDExKHN0ZGRlYiwgIkNhbGwgX1hJbml0SW1hZ2VGdW5jUHRyc1xuIik7CisgIGRwcmludGZfaW5mbyh4MTEsICJDYWxsIF9YSW5pdEltYWdlRnVuY1B0cnNcbiIpOwogICBFbnRlckNyaXRpY2FsU2VjdGlvbiggJlgxMURSVl9Dcml0U2VjdGlvbiApOwogICBfWEluaXRJbWFnZUZ1bmNQdHJzKGEwKTsKICAgTGVhdmVDcml0aWNhbFNlY3Rpb24oICZYMTFEUlZfQ3JpdFNlY3Rpb24gKTsKLSAgZHByaW50Zl94MTEoc3RkZGViLCAiUmV0IF9YSW5pdEltYWdlRnVuY1B0cnNcbiIpOworICBkcHJpbnRmX2luZm8oeDExLCAiUmV0IF9YSW5pdEltYWdlRnVuY1B0cnNcbiIpOwogfQpkaWZmIC0tZ2l0IGEvdHN4MTEvdHNfeHBtLmMgYi90c3gxMS90c194cG0uYwppbmRleCAyNmIyZGM5Li45ZWY2ZDljIDEwMDY0NAotLS0gYS90c3gxMS90c194cG0uYworKysgYi90c3gxMS90c194cG0uYwpAQCAtNiwyNyArNiwyNiBAQAogCiAjaW5jbHVkZSA8WDExL3hwbS5oPgogI2luY2x1ZGUgIngxMWRydi5oIgotI2luY2x1ZGUgInN0ZGRlYnVnLmgiCiAjaW5jbHVkZSAiZGVidWcuaCIKIAogaW50IFRTWHBtQ3JlYXRlUGl4bWFwRnJvbURhdGEoRGlzcGxheSAqYTAsIERyYXdhYmxlIGExLCBjaGFyICoqYTIsIFBpeG1hcCAqYTMsIFBpeG1hcCAqYTQsIFhwbUF0dHJpYnV0ZXMgKmE1KQogewogICBpbnQgcjsKLSAgZHByaW50Zl94MTEoc3RkZGViLCAiQ2FsbCBYcG1DcmVhdGVQaXhtYXBGcm9tRGF0YVxuIik7CisgIGRwcmludGZfaW5mbyh4MTEsICJDYWxsIFhwbUNyZWF0ZVBpeG1hcEZyb21EYXRhXG4iKTsKICAgRW50ZXJDcml0aWNhbFNlY3Rpb24oICZYMTFEUlZfQ3JpdFNlY3Rpb24gKTsKICAgciA9IFhwbUNyZWF0ZVBpeG1hcEZyb21EYXRhKGEwLCBhMSwgYTIsIGEzLCBhNCwgYTUpOwogICBMZWF2ZUNyaXRpY2FsU2VjdGlvbiggJlgxMURSVl9Dcml0U2VjdGlvbiApOwotICBkcHJpbnRmX3gxMShzdGRkZWIsICJSZXQgWHBtQ3JlYXRlUGl4bWFwRnJvbURhdGFcbiIpOworICBkcHJpbnRmX2luZm8oeDExLCAiUmV0IFhwbUNyZWF0ZVBpeG1hcEZyb21EYXRhXG4iKTsKICAgcmV0dXJuIHI7CiB9CiAKIGludCBUU1hwbUF0dHJpYnV0ZXNTaXplKHZvaWQpCiB7CiAgIGludCByOwotICBkcHJpbnRmX3gxMShzdGRkZWIsICJDYWxsIFhwbUF0dHJpYnV0ZXNTaXplXG4iKTsKKyAgZHByaW50Zl9pbmZvKHgxMSwgIkNhbGwgWHBtQXR0cmlidXRlc1NpemVcbiIpOwogICBFbnRlckNyaXRpY2FsU2VjdGlvbiggJlgxMURSVl9Dcml0U2VjdGlvbiApOwogICByID0gWHBtQXR0cmlidXRlc1NpemUoKTsKICAgTGVhdmVDcml0aWNhbFNlY3Rpb24oICZYMTFEUlZfQ3JpdFNlY3Rpb24gKTsKLSAgZHByaW50Zl94MTEoc3RkZGViLCAiUmV0IFhwbUF0dHJpYnV0ZXNTaXplXG4iKTsKKyAgZHByaW50Zl9pbmZvKHgxMSwgIlJldCBYcG1BdHRyaWJ1dGVzU2l6ZVxuIik7CiAgIHJldHVybiByOwogfQpkaWZmIC0tZ2l0IGEvdHN4MTEvdHNfeHJlc291cmNlLmMgYi90c3gxMS90c194cmVzb3VyY2UuYwppbmRleCA0ZWRhODk5Li5iMjcyYjFlIDEwMDY0NAotLS0gYS90c3gxMS90c194cmVzb3VyY2UuYworKysgYi90c3gxMS90c194cmVzb3VyY2UuYwpAQCAtNyw2NyArNyw2NiBAQAogI2luY2x1ZGUgPFgxMS9YbGliLmg+CiAjaW5jbHVkZSA8WDExL1hyZXNvdXJjZS5oPgogI2luY2x1ZGUgIngxMWRydi5oIgotI2luY2x1ZGUgInN0ZGRlYnVnLmgiCiAjaW5jbHVkZSAiZGVidWcuaCIKIAogWHJtUXVhcmsgIFRTWHJtVW5pcXVlUXVhcmsodm9pZCkKIHsKICAgWHJtUXVhcmsgIHI7Ci0gIGRwcmludGZfeDExKHN0ZGRlYiwgIkNhbGwgWHJtVW5pcXVlUXVhcmtcbiIpOworICBkcHJpbnRmX2luZm8oeDExLCAiQ2FsbCBYcm1VbmlxdWVRdWFya1xuIik7CiAgIEVudGVyQ3JpdGljYWxTZWN0aW9uKCAmWDExRFJWX0NyaXRTZWN0aW9uICk7CiAgIHIgPSBYcm1VbmlxdWVRdWFyaygpOwogICBMZWF2ZUNyaXRpY2FsU2VjdGlvbiggJlgxMURSVl9Dcml0U2VjdGlvbiApOwotICBkcHJpbnRmX3gxMShzdGRkZWIsICJSZXQgWHJtVW5pcXVlUXVhcmtcbiIpOworICBkcHJpbnRmX2luZm8oeDExLCAiUmV0IFhybVVuaXF1ZVF1YXJrXG4iKTsKICAgcmV0dXJuIHI7CiB9CiAKIGludCAgIFRTWHJtR2V0UmVzb3VyY2UoWHJtRGF0YWJhc2UgYTAsIGNvbnN0ICBjaGFyKiBhMSwgY29uc3QgIGNoYXIqIGEyLCBjaGFyKiogYTMsIFhybVZhbHVlKiBhNCkKIHsKICAgaW50ICAgcjsKLSAgZHByaW50Zl94MTEoc3RkZGViLCAiQ2FsbCBYcm1HZXRSZXNvdXJjZVxuIik7CisgIGRwcmludGZfaW5mbyh4MTEsICJDYWxsIFhybUdldFJlc291cmNlXG4iKTsKICAgRW50ZXJDcml0aWNhbFNlY3Rpb24oICZYMTFEUlZfQ3JpdFNlY3Rpb24gKTsKICAgciA9IFhybUdldFJlc291cmNlKGEwLCBhMSwgYTIsIGEzLCBhNCk7CiAgIExlYXZlQ3JpdGljYWxTZWN0aW9uKCAmWDExRFJWX0NyaXRTZWN0aW9uICk7Ci0gIGRwcmludGZfeDExKHN0ZGRlYiwgIlJldCBYcm1HZXRSZXNvdXJjZVxuIik7CisgIGRwcmludGZfaW5mbyh4MTEsICJSZXQgWHJtR2V0UmVzb3VyY2VcbiIpOwogICByZXR1cm4gcjsKIH0KIAogWHJtRGF0YWJhc2UgIFRTWHJtR2V0RmlsZURhdGFiYXNlKGNvbnN0ICBjaGFyKiBhMCkKIHsKICAgWHJtRGF0YWJhc2UgIHI7Ci0gIGRwcmludGZfeDExKHN0ZGRlYiwgIkNhbGwgWHJtR2V0RmlsZURhdGFiYXNlXG4iKTsKKyAgZHByaW50Zl9pbmZvKHgxMSwgIkNhbGwgWHJtR2V0RmlsZURhdGFiYXNlXG4iKTsKICAgRW50ZXJDcml0aWNhbFNlY3Rpb24oICZYMTFEUlZfQ3JpdFNlY3Rpb24gKTsKICAgciA9IFhybUdldEZpbGVEYXRhYmFzZShhMCk7CiAgIExlYXZlQ3JpdGljYWxTZWN0aW9uKCAmWDExRFJWX0NyaXRTZWN0aW9uICk7Ci0gIGRwcmludGZfeDExKHN0ZGRlYiwgIlJldCBYcm1HZXRGaWxlRGF0YWJhc2VcbiIpOworICBkcHJpbnRmX2luZm8oeDExLCAiUmV0IFhybUdldEZpbGVEYXRhYmFzZVxuIik7CiAgIHJldHVybiByOwogfQogCiBYcm1EYXRhYmFzZSAgVFNYcm1HZXRTdHJpbmdEYXRhYmFzZShjb25zdCAgY2hhciogYTApCiB7CiAgIFhybURhdGFiYXNlICByOwotICBkcHJpbnRmX3gxMShzdGRkZWIsICJDYWxsIFhybUdldFN0cmluZ0RhdGFiYXNlXG4iKTsKKyAgZHByaW50Zl9pbmZvKHgxMSwgIkNhbGwgWHJtR2V0U3RyaW5nRGF0YWJhc2VcbiIpOwogICBFbnRlckNyaXRpY2FsU2VjdGlvbiggJlgxMURSVl9Dcml0U2VjdGlvbiApOwogICByID0gWHJtR2V0U3RyaW5nRGF0YWJhc2UoYTApOwogICBMZWF2ZUNyaXRpY2FsU2VjdGlvbiggJlgxMURSVl9Dcml0U2VjdGlvbiApOwotICBkcHJpbnRmX3gxMShzdGRkZWIsICJSZXQgWHJtR2V0U3RyaW5nRGF0YWJhc2VcbiIpOworICBkcHJpbnRmX2luZm8oeDExLCAiUmV0IFhybUdldFN0cmluZ0RhdGFiYXNlXG4iKTsKICAgcmV0dXJuIHI7CiB9CiAKIHZvaWQgIFRTWHJtTWVyZ2VEYXRhYmFzZXMoWHJtRGF0YWJhc2UgYTAsIFhybURhdGFiYXNlKiBhMSkKIHsKLSAgZHByaW50Zl94MTEoc3RkZGViLCAiQ2FsbCBYcm1NZXJnZURhdGFiYXNlc1xuIik7CisgIGRwcmludGZfaW5mbyh4MTEsICJDYWxsIFhybU1lcmdlRGF0YWJhc2VzXG4iKTsKICAgRW50ZXJDcml0aWNhbFNlY3Rpb24oICZYMTFEUlZfQ3JpdFNlY3Rpb24gKTsKICAgWHJtTWVyZ2VEYXRhYmFzZXMoYTAsIGExKTsKICAgTGVhdmVDcml0aWNhbFNlY3Rpb24oICZYMTFEUlZfQ3JpdFNlY3Rpb24gKTsKLSAgZHByaW50Zl94MTEoc3RkZGViLCAiUmV0IFhybU1lcmdlRGF0YWJhc2VzXG4iKTsKKyAgZHByaW50Zl9pbmZvKHgxMSwgIlJldCBYcm1NZXJnZURhdGFiYXNlc1xuIik7CiB9CiAKIHZvaWQgIFRTWHJtUGFyc2VDb21tYW5kKFhybURhdGFiYXNlKiBhMCwgWHJtT3B0aW9uRGVzY0xpc3QgYTEsIGludCBhMiwgY29uc3QgIGNoYXIqIGEzLCBpbnQqIGE0LCBjaGFyKiogYTUpCiB7Ci0gIGRwcmludGZfeDExKHN0ZGRlYiwgIkNhbGwgWHJtUGFyc2VDb21tYW5kXG4iKTsKKyAgZHByaW50Zl9pbmZvKHgxMSwgIkNhbGwgWHJtUGFyc2VDb21tYW5kXG4iKTsKICAgRW50ZXJDcml0aWNhbFNlY3Rpb24oICZYMTFEUlZfQ3JpdFNlY3Rpb24gKTsKICAgWHJtUGFyc2VDb21tYW5kKGEwLCBhMSwgYTIsIGEzLCBhNCwgYTUpOwogICBMZWF2ZUNyaXRpY2FsU2VjdGlvbiggJlgxMURSVl9Dcml0U2VjdGlvbiApOwotICBkcHJpbnRmX3gxMShzdGRkZWIsICJSZXQgWHJtUGFyc2VDb21tYW5kXG4iKTsKKyAgZHByaW50Zl9pbmZvKHgxMSwgIlJldCBYcm1QYXJzZUNvbW1hbmRcbiIpOwogfQpkaWZmIC0tZ2l0IGEvdHN4MTEvdHNfeHNobS5jIGIvdHN4MTEvdHNfeHNobS5jCmluZGV4IGZmNWVlNjAuLjk4OTJmOGYgMTAwNjQ0Ci0tLSBhL3RzeDExL3RzX3hzaG0uYworKysgYi90c3gxMS90c194c2htLmMKQEAgLTcsNDkgKzcsNDggQEAKICNpbmNsdWRlIDxYMTEvWGxpYi5oPgogI2luY2x1ZGUgPFgxMS9leHRlbnNpb25zL1hTaG0uaD4KICNpbmNsdWRlICJ4MTFkcnYuaCIKLSNpbmNsdWRlICJzdGRkZWJ1Zy5oIgogI2luY2x1ZGUgImRlYnVnLmgiCiAKIEJvb2wgVFNYU2htUXVlcnlFeHRlbnNpb24oRGlzcGxheSAqYTApCiB7CiAgIEJvb2wgcjsKLSAgZHByaW50Zl94MTEoc3RkZGViLCAiQ2FsbCBYU2htUXVlcnlFeHRlbnNpb25cbiIpOworICBkcHJpbnRmX2luZm8oeDExLCAiQ2FsbCBYU2htUXVlcnlFeHRlbnNpb25cbiIpOwogICBFbnRlckNyaXRpY2FsU2VjdGlvbiggJlgxMURSVl9Dcml0U2VjdGlvbiApOwogICByID0gWFNobVF1ZXJ5RXh0ZW5zaW9uKGEwKTsKICAgTGVhdmVDcml0aWNhbFNlY3Rpb24oICZYMTFEUlZfQ3JpdFNlY3Rpb24gKTsKLSAgZHByaW50Zl94MTEoc3RkZGViLCAiUmV0IFhTaG1RdWVyeUV4dGVuc2lvblxuIik7CisgIGRwcmludGZfaW5mbyh4MTEsICJSZXQgWFNobVF1ZXJ5RXh0ZW5zaW9uXG4iKTsKICAgcmV0dXJuIHI7CiB9CiAKIGludCBUU1hTaG1QaXhtYXBGb3JtYXQoRGlzcGxheSAqYTApCiB7CiAgIGludCByOwotICBkcHJpbnRmX3gxMShzdGRkZWIsICJDYWxsIFhTaG1QaXhtYXBGb3JtYXRcbiIpOworICBkcHJpbnRmX2luZm8oeDExLCAiQ2FsbCBYU2htUGl4bWFwRm9ybWF0XG4iKTsKICAgRW50ZXJDcml0aWNhbFNlY3Rpb24oICZYMTFEUlZfQ3JpdFNlY3Rpb24gKTsKICAgciA9IFhTaG1QaXhtYXBGb3JtYXQoYTApOwogICBMZWF2ZUNyaXRpY2FsU2VjdGlvbiggJlgxMURSVl9Dcml0U2VjdGlvbiApOwotICBkcHJpbnRmX3gxMShzdGRkZWIsICJSZXQgWFNobVBpeG1hcEZvcm1hdFxuIik7CisgIGRwcmludGZfaW5mbyh4MTEsICJSZXQgWFNobVBpeG1hcEZvcm1hdFxuIik7CiAgIHJldHVybiByOwogfQogCiBTdGF0dXMgVFNYU2htRGV0YWNoKERpc3BsYXkgKmEwLCBYU2htU2VnbWVudEluZm8gKmExKQogewogICBTdGF0dXMgcjsKLSAgZHByaW50Zl94MTEoc3RkZGViLCAiQ2FsbCBYU2htRGV0YWNoXG4iKTsKKyAgZHByaW50Zl9pbmZvKHgxMSwgIkNhbGwgWFNobURldGFjaFxuIik7CiAgIEVudGVyQ3JpdGljYWxTZWN0aW9uKCAmWDExRFJWX0NyaXRTZWN0aW9uICk7CiAgIHIgPSBYU2htRGV0YWNoKGEwLCBhMSk7CiAgIExlYXZlQ3JpdGljYWxTZWN0aW9uKCAmWDExRFJWX0NyaXRTZWN0aW9uICk7Ci0gIGRwcmludGZfeDExKHN0ZGRlYiwgIlJldCBYU2htRGV0YWNoXG4iKTsKKyAgZHByaW50Zl9pbmZvKHgxMSwgIlJldCBYU2htRGV0YWNoXG4iKTsKICAgcmV0dXJuIHI7CiB9CiAKIFN0YXR1cyBUU1hTaG1BdHRhY2goRGlzcGxheSAqYTAsIFhTaG1TZWdtZW50SW5mbyAqYTEpCiB7CiAgIFN0YXR1cyByOwotICBkcHJpbnRmX3gxMShzdGRkZWIsICJDYWxsIFhTaG1BdHRhY2hcbiIpOworICBkcHJpbnRmX2luZm8oeDExLCAiQ2FsbCBYU2htQXR0YWNoXG4iKTsKICAgRW50ZXJDcml0aWNhbFNlY3Rpb24oICZYMTFEUlZfQ3JpdFNlY3Rpb24gKTsKICAgciA9IFhTaG1BdHRhY2goYTAsIGExKTsKICAgTGVhdmVDcml0aWNhbFNlY3Rpb24oICZYMTFEUlZfQ3JpdFNlY3Rpb24gKTsKLSAgZHByaW50Zl94MTEoc3RkZGViLCAiUmV0IFhTaG1BdHRhY2hcbiIpOworICBkcHJpbnRmX2luZm8oeDExLCAiUmV0IFhTaG1BdHRhY2hcbiIpOwogICByZXR1cm4gcjsKIH0KZGlmZiAtLWdpdCBhL3RzeDExL3RzX3h1dGlsLmMgYi90c3gxMS90c194dXRpbC5jCmluZGV4IGNkNDk5YmIuLmFiNDQ3NTEgMTAwNjQ0Ci0tLSBhL3RzeDExL3RzX3h1dGlsLmMKKysrIGIvdHN4MTEvdHNfeHV0aWwuYwpAQCAtOCwzNTMgKzgsMzUyIEBACiAjaW5jbHVkZSA8WDExL1hyZXNvdXJjZS5oPgogI2luY2x1ZGUgPFgxMS9YdXRpbC5oPgogI2luY2x1ZGUgIngxMWRydi5oIgotI2luY2x1ZGUgInN0ZGRlYnVnLmgiCiAjaW5jbHVkZSAiZGVidWcuaCIKIAogWENsYXNzSGludCAqIFRTWEFsbG9jQ2xhc3NIaW50KHZvaWQpCiB7CiAgIFhDbGFzc0hpbnQgKiByOwotICBkcHJpbnRmX3gxMShzdGRkZWIsICJDYWxsIFhBbGxvY0NsYXNzSGludFxuIik7CisgIGRwcmludGZfaW5mbyh4MTEsICJDYWxsIFhBbGxvY0NsYXNzSGludFxuIik7CiAgIEVudGVyQ3JpdGljYWxTZWN0aW9uKCAmWDExRFJWX0NyaXRTZWN0aW9uICk7CiAgIHIgPSBYQWxsb2NDbGFzc0hpbnQoKTsKICAgTGVhdmVDcml0aWNhbFNlY3Rpb24oICZYMTFEUlZfQ3JpdFNlY3Rpb24gKTsKLSAgZHByaW50Zl94MTEoc3RkZGViLCAiUmV0IFhBbGxvY0NsYXNzSGludFxuIik7CisgIGRwcmludGZfaW5mbyh4MTEsICJSZXQgWEFsbG9jQ2xhc3NIaW50XG4iKTsKICAgcmV0dXJuIHI7CiB9CiAKIFhTaXplSGludHMgKiBUU1hBbGxvY1NpemVIaW50cyh2b2lkKQogewogICBYU2l6ZUhpbnRzICogcjsKLSAgZHByaW50Zl94MTEoc3RkZGViLCAiQ2FsbCBYQWxsb2NTaXplSGludHNcbiIpOworICBkcHJpbnRmX2luZm8oeDExLCAiQ2FsbCBYQWxsb2NTaXplSGludHNcbiIpOwogICBFbnRlckNyaXRpY2FsU2VjdGlvbiggJlgxMURSVl9Dcml0U2VjdGlvbiApOwogICByID0gWEFsbG9jU2l6ZUhpbnRzKCk7CiAgIExlYXZlQ3JpdGljYWxTZWN0aW9uKCAmWDExRFJWX0NyaXRTZWN0aW9uICk7Ci0gIGRwcmludGZfeDExKHN0ZGRlYiwgIlJldCBYQWxsb2NTaXplSGludHNcbiIpOworICBkcHJpbnRmX2luZm8oeDExLCAiUmV0IFhBbGxvY1NpemVIaW50c1xuIik7CiAgIHJldHVybiByOwogfQogCiBYV01IaW50cyAqIFRTWEFsbG9jV01IaW50cyh2b2lkKQogewogICBYV01IaW50cyAqIHI7Ci0gIGRwcmludGZfeDExKHN0ZGRlYiwgIkNhbGwgWEFsbG9jV01IaW50c1xuIik7CisgIGRwcmludGZfaW5mbyh4MTEsICJDYWxsIFhBbGxvY1dNSGludHNcbiIpOwogICBFbnRlckNyaXRpY2FsU2VjdGlvbiggJlgxMURSVl9Dcml0U2VjdGlvbiApOwogICByID0gWEFsbG9jV01IaW50cygpOwogICBMZWF2ZUNyaXRpY2FsU2VjdGlvbiggJlgxMURSVl9Dcml0U2VjdGlvbiApOwotICBkcHJpbnRmX3gxMShzdGRkZWIsICJSZXQgWEFsbG9jV01IaW50c1xuIik7CisgIGRwcmludGZfaW5mbyh4MTEsICJSZXQgWEFsbG9jV01IaW50c1xuIik7CiAgIHJldHVybiByOwogfQogCiBpbnQgIFRTWENsaXBCb3goUmVnaW9uIGEwLCBYUmVjdGFuZ2xlKiBhMSkKIHsKICAgaW50ICByOwotICBkcHJpbnRmX3gxMShzdGRkZWIsICJDYWxsIFhDbGlwQm94XG4iKTsKKyAgZHByaW50Zl9pbmZvKHgxMSwgIkNhbGwgWENsaXBCb3hcbiIpOwogICBFbnRlckNyaXRpY2FsU2VjdGlvbiggJlgxMURSVl9Dcml0U2VjdGlvbiApOwogICByID0gWENsaXBCb3goYTAsIGExKTsKICAgTGVhdmVDcml0aWNhbFNlY3Rpb24oICZYMTFEUlZfQ3JpdFNlY3Rpb24gKTsKLSAgZHByaW50Zl94MTEoc3RkZGViLCAiUmV0IFhDbGlwQm94XG4iKTsKKyAgZHByaW50Zl9pbmZvKHgxMSwgIlJldCBYQ2xpcEJveFxuIik7CiAgIHJldHVybiByOwogfQogCiBSZWdpb24gIFRTWENyZWF0ZVJlZ2lvbih2b2lkKQogewogICBSZWdpb24gIHI7Ci0gIGRwcmludGZfeDExKHN0ZGRlYiwgIkNhbGwgWENyZWF0ZVJlZ2lvblxuIik7CisgIGRwcmludGZfaW5mbyh4MTEsICJDYWxsIFhDcmVhdGVSZWdpb25cbiIpOwogICBFbnRlckNyaXRpY2FsU2VjdGlvbiggJlgxMURSVl9Dcml0U2VjdGlvbiApOwogICByID0gWENyZWF0ZVJlZ2lvbigpOwogICBMZWF2ZUNyaXRpY2FsU2VjdGlvbiggJlgxMURSVl9Dcml0U2VjdGlvbiApOwotICBkcHJpbnRmX3gxMShzdGRkZWIsICJSZXQgWENyZWF0ZVJlZ2lvblxuIik7CisgIGRwcmludGZfaW5mbyh4MTEsICJSZXQgWENyZWF0ZVJlZ2lvblxuIik7CiAgIHJldHVybiByOwogfQogCiBpbnQgIFRTWERlbGV0ZUNvbnRleHQoRGlzcGxheSogYTAsIFhJRCBhMSwgWENvbnRleHQgYTIpCiB7CiAgIGludCAgcjsKLSAgZHByaW50Zl94MTEoc3RkZGViLCAiQ2FsbCBYRGVsZXRlQ29udGV4dFxuIik7CisgIGRwcmludGZfaW5mbyh4MTEsICJDYWxsIFhEZWxldGVDb250ZXh0XG4iKTsKICAgRW50ZXJDcml0aWNhbFNlY3Rpb24oICZYMTFEUlZfQ3JpdFNlY3Rpb24gKTsKICAgciA9IFhEZWxldGVDb250ZXh0KGEwLCBhMSwgYTIpOwogICBMZWF2ZUNyaXRpY2FsU2VjdGlvbiggJlgxMURSVl9Dcml0U2VjdGlvbiApOwotICBkcHJpbnRmX3gxMShzdGRkZWIsICJSZXQgWERlbGV0ZUNvbnRleHRcbiIpOworICBkcHJpbnRmX2luZm8oeDExLCAiUmV0IFhEZWxldGVDb250ZXh0XG4iKTsKICAgcmV0dXJuIHI7CiB9CiAKIGludCAgVFNYRGVzdHJveVJlZ2lvbihSZWdpb24gYTApCiB7CiAgIGludCAgcjsKLSAgZHByaW50Zl94MTEoc3RkZGViLCAiQ2FsbCBYRGVzdHJveVJlZ2lvblxuIik7CisgIGRwcmludGZfaW5mbyh4MTEsICJDYWxsIFhEZXN0cm95UmVnaW9uXG4iKTsKICAgRW50ZXJDcml0aWNhbFNlY3Rpb24oICZYMTFEUlZfQ3JpdFNlY3Rpb24gKTsKICAgciA9IFhEZXN0cm95UmVnaW9uKGEwKTsKICAgTGVhdmVDcml0aWNhbFNlY3Rpb24oICZYMTFEUlZfQ3JpdFNlY3Rpb24gKTsKLSAgZHByaW50Zl94MTEoc3RkZGViLCAiUmV0IFhEZXN0cm95UmVnaW9uXG4iKTsKKyAgZHByaW50Zl9pbmZvKHgxMSwgIlJldCBYRGVzdHJveVJlZ2lvblxuIik7CiAgIHJldHVybiByOwogfQogCiBpbnQgIFRTWEVtcHR5UmVnaW9uKFJlZ2lvbiBhMCkKIHsKICAgaW50ICByOwotICBkcHJpbnRmX3gxMShzdGRkZWIsICJDYWxsIFhFbXB0eVJlZ2lvblxuIik7CisgIGRwcmludGZfaW5mbyh4MTEsICJDYWxsIFhFbXB0eVJlZ2lvblxuIik7CiAgIEVudGVyQ3JpdGljYWxTZWN0aW9uKCAmWDExRFJWX0NyaXRTZWN0aW9uICk7CiAgIHIgPSBYRW1wdHlSZWdpb24oYTApOwogICBMZWF2ZUNyaXRpY2FsU2VjdGlvbiggJlgxMURSVl9Dcml0U2VjdGlvbiApOwotICBkcHJpbnRmX3gxMShzdGRkZWIsICJSZXQgWEVtcHR5UmVnaW9uXG4iKTsKKyAgZHByaW50Zl9pbmZvKHgxMSwgIlJldCBYRW1wdHlSZWdpb25cbiIpOwogICByZXR1cm4gcjsKIH0KIAogaW50ICBUU1hFcXVhbFJlZ2lvbihSZWdpb24gYTAsIFJlZ2lvbiBhMSkKIHsKICAgaW50ICByOwotICBkcHJpbnRmX3gxMShzdGRkZWIsICJDYWxsIFhFcXVhbFJlZ2lvblxuIik7CisgIGRwcmludGZfaW5mbyh4MTEsICJDYWxsIFhFcXVhbFJlZ2lvblxuIik7CiAgIEVudGVyQ3JpdGljYWxTZWN0aW9uKCAmWDExRFJWX0NyaXRTZWN0aW9uICk7CiAgIHIgPSBYRXF1YWxSZWdpb24oYTAsIGExKTsKICAgTGVhdmVDcml0aWNhbFNlY3Rpb24oICZYMTFEUlZfQ3JpdFNlY3Rpb24gKTsKLSAgZHByaW50Zl94MTEoc3RkZGViLCAiUmV0IFhFcXVhbFJlZ2lvblxuIik7CisgIGRwcmludGZfaW5mbyh4MTEsICJSZXQgWEVxdWFsUmVnaW9uXG4iKTsKICAgcmV0dXJuIHI7CiB9CiAKIGludCAgVFNYRmluZENvbnRleHQoRGlzcGxheSogYTAsIFhJRCBhMSwgWENvbnRleHQgYTIsIFhQb2ludGVyKiBhMykKIHsKICAgaW50ICByOwotICBkcHJpbnRmX3gxMShzdGRkZWIsICJDYWxsIFhGaW5kQ29udGV4dFxuIik7CisgIGRwcmludGZfaW5mbyh4MTEsICJDYWxsIFhGaW5kQ29udGV4dFxuIik7CiAgIEVudGVyQ3JpdGljYWxTZWN0aW9uKCAmWDExRFJWX0NyaXRTZWN0aW9uICk7CiAgIHIgPSBYRmluZENvbnRleHQoYTAsIGExLCBhMiwgYTMpOwogICBMZWF2ZUNyaXRpY2FsU2VjdGlvbiggJlgxMURSVl9Dcml0U2VjdGlvbiApOwotICBkcHJpbnRmX3gxMShzdGRkZWIsICJSZXQgWEZpbmRDb250ZXh0XG4iKTsKKyAgZHByaW50Zl9pbmZvKHgxMSwgIlJldCBYRmluZENvbnRleHRcbiIpOwogICByZXR1cm4gcjsKIH0KIAogWFZpc3VhbEluZm8gKiBUU1hHZXRWaXN1YWxJbmZvKERpc3BsYXkqIGEwLCBsb25nIGExLCBYVmlzdWFsSW5mbyogYTIsIGludCogYTMpCiB7CiAgIFhWaXN1YWxJbmZvICogcjsKLSAgZHByaW50Zl94MTEoc3RkZGViLCAiQ2FsbCBYR2V0VmlzdWFsSW5mb1xuIik7CisgIGRwcmludGZfaW5mbyh4MTEsICJDYWxsIFhHZXRWaXN1YWxJbmZvXG4iKTsKICAgRW50ZXJDcml0aWNhbFNlY3Rpb24oICZYMTFEUlZfQ3JpdFNlY3Rpb24gKTsKICAgciA9IFhHZXRWaXN1YWxJbmZvKGEwLCBhMSwgYTIsIGEzKTsKICAgTGVhdmVDcml0aWNhbFNlY3Rpb24oICZYMTFEUlZfQ3JpdFNlY3Rpb24gKTsKLSAgZHByaW50Zl94MTEoc3RkZGViLCAiUmV0IFhHZXRWaXN1YWxJbmZvXG4iKTsKKyAgZHByaW50Zl9pbmZvKHgxMSwgIlJldCBYR2V0VmlzdWFsSW5mb1xuIik7CiAgIHJldHVybiByOwogfQogCiBpbnQgICBUU1hHZXRXTVNpemVIaW50cyhEaXNwbGF5KiBhMCwgV2luZG93IGExLCBYU2l6ZUhpbnRzKiBhMiwgbG9uZyogYTMsIEF0b20gYTQpCiB7CiAgIGludCAgIHI7Ci0gIGRwcmludGZfeDExKHN0ZGRlYiwgIkNhbGwgWEdldFdNU2l6ZUhpbnRzXG4iKTsKKyAgZHByaW50Zl9pbmZvKHgxMSwgIkNhbGwgWEdldFdNU2l6ZUhpbnRzXG4iKTsKICAgRW50ZXJDcml0aWNhbFNlY3Rpb24oICZYMTFEUlZfQ3JpdFNlY3Rpb24gKTsKICAgciA9IFhHZXRXTVNpemVIaW50cyhhMCwgYTEsIGEyLCBhMywgYTQpOwogICBMZWF2ZUNyaXRpY2FsU2VjdGlvbiggJlgxMURSVl9Dcml0U2VjdGlvbiApOwotICBkcHJpbnRmX3gxMShzdGRkZWIsICJSZXQgWEdldFdNU2l6ZUhpbnRzXG4iKTsKKyAgZHByaW50Zl9pbmZvKHgxMSwgIlJldCBYR2V0V01TaXplSGludHNcbiIpOwogICByZXR1cm4gcjsKIH0KIAogaW50ICBUU1hJbnRlcnNlY3RSZWdpb24oUmVnaW9uIGEwLCBSZWdpb24gYTEsIFJlZ2lvbiBhMikKIHsKICAgaW50ICByOwotICBkcHJpbnRmX3gxMShzdGRkZWIsICJDYWxsIFhJbnRlcnNlY3RSZWdpb25cbiIpOworICBkcHJpbnRmX2luZm8oeDExLCAiQ2FsbCBYSW50ZXJzZWN0UmVnaW9uXG4iKTsKICAgRW50ZXJDcml0aWNhbFNlY3Rpb24oICZYMTFEUlZfQ3JpdFNlY3Rpb24gKTsKICAgciA9IFhJbnRlcnNlY3RSZWdpb24oYTAsIGExLCBhMik7CiAgIExlYXZlQ3JpdGljYWxTZWN0aW9uKCAmWDExRFJWX0NyaXRTZWN0aW9uICk7Ci0gIGRwcmludGZfeDExKHN0ZGRlYiwgIlJldCBYSW50ZXJzZWN0UmVnaW9uXG4iKTsKKyAgZHByaW50Zl9pbmZvKHgxMSwgIlJldCBYSW50ZXJzZWN0UmVnaW9uXG4iKTsKICAgcmV0dXJuIHI7CiB9CiAKIGludCAgVFNYTG9va3VwU3RyaW5nKFhLZXlFdmVudCogYTAsIGNoYXIqIGExLCBpbnQgYTIsIEtleVN5bSogYTMsIFhDb21wb3NlU3RhdHVzKiBhNCkKIHsKICAgaW50ICByOwotICBkcHJpbnRmX3gxMShzdGRkZWIsICJDYWxsIFhMb29rdXBTdHJpbmdcbiIpOworICBkcHJpbnRmX2luZm8oeDExLCAiQ2FsbCBYTG9va3VwU3RyaW5nXG4iKTsKICAgRW50ZXJDcml0aWNhbFNlY3Rpb24oICZYMTFEUlZfQ3JpdFNlY3Rpb24gKTsKICAgciA9IFhMb29rdXBTdHJpbmcoYTAsIGExLCBhMiwgYTMsIGE0KTsKICAgTGVhdmVDcml0aWNhbFNlY3Rpb24oICZYMTFEUlZfQ3JpdFNlY3Rpb24gKTsKLSAgZHByaW50Zl94MTEoc3RkZGViLCAiUmV0IFhMb29rdXBTdHJpbmdcbiIpOworICBkcHJpbnRmX2luZm8oeDExLCAiUmV0IFhMb29rdXBTdHJpbmdcbiIpOwogICByZXR1cm4gcjsKIH0KIAogaW50ICBUU1hPZmZzZXRSZWdpb24oUmVnaW9uIGEwLCBpbnQgYTEsIGludCBhMikKIHsKICAgaW50ICByOwotICBkcHJpbnRmX3gxMShzdGRkZWIsICJDYWxsIFhPZmZzZXRSZWdpb25cbiIpOworICBkcHJpbnRmX2luZm8oeDExLCAiQ2FsbCBYT2Zmc2V0UmVnaW9uXG4iKTsKICAgRW50ZXJDcml0aWNhbFNlY3Rpb24oICZYMTFEUlZfQ3JpdFNlY3Rpb24gKTsKICAgciA9IFhPZmZzZXRSZWdpb24oYTAsIGExLCBhMik7CiAgIExlYXZlQ3JpdGljYWxTZWN0aW9uKCAmWDExRFJWX0NyaXRTZWN0aW9uICk7Ci0gIGRwcmludGZfeDExKHN0ZGRlYiwgIlJldCBYT2Zmc2V0UmVnaW9uXG4iKTsKKyAgZHByaW50Zl9pbmZvKHgxMSwgIlJldCBYT2Zmc2V0UmVnaW9uXG4iKTsKICAgcmV0dXJuIHI7CiB9CiAKIGludCAgIFRTWFBvaW50SW5SZWdpb24oUmVnaW9uIGEwLCBpbnQgYTEsIGludCBhMikKIHsKICAgaW50ICAgcjsKLSAgZHByaW50Zl94MTEoc3RkZGViLCAiQ2FsbCBYUG9pbnRJblJlZ2lvblxuIik7CisgIGRwcmludGZfaW5mbyh4MTEsICJDYWxsIFhQb2ludEluUmVnaW9uXG4iKTsKICAgRW50ZXJDcml0aWNhbFNlY3Rpb24oICZYMTFEUlZfQ3JpdFNlY3Rpb24gKTsKICAgciA9IFhQb2ludEluUmVnaW9uKGEwLCBhMSwgYTIpOwogICBMZWF2ZUNyaXRpY2FsU2VjdGlvbiggJlgxMURSVl9Dcml0U2VjdGlvbiApOwotICBkcHJpbnRmX3gxMShzdGRkZWIsICJSZXQgWFBvaW50SW5SZWdpb25cbiIpOworICBkcHJpbnRmX2luZm8oeDExLCAiUmV0IFhQb2ludEluUmVnaW9uXG4iKTsKICAgcmV0dXJuIHI7CiB9CiAKIFJlZ2lvbiAgVFNYUG9seWdvblJlZ2lvbihYUG9pbnQqIGEwLCBpbnQgYTEsIGludCBhMikKIHsKICAgUmVnaW9uICByOwotICBkcHJpbnRmX3gxMShzdGRkZWIsICJDYWxsIFhQb2x5Z29uUmVnaW9uXG4iKTsKKyAgZHByaW50Zl9pbmZvKHgxMSwgIkNhbGwgWFBvbHlnb25SZWdpb25cbiIpOwogICBFbnRlckNyaXRpY2FsU2VjdGlvbiggJlgxMURSVl9Dcml0U2VjdGlvbiApOwogICByID0gWFBvbHlnb25SZWdpb24oYTAsIGExLCBhMik7CiAgIExlYXZlQ3JpdGljYWxTZWN0aW9uKCAmWDExRFJWX0NyaXRTZWN0aW9uICk7Ci0gIGRwcmludGZfeDExKHN0ZGRlYiwgIlJldCBYUG9seWdvblJlZ2lvblxuIik7CisgIGRwcmludGZfaW5mbyh4MTEsICJSZXQgWFBvbHlnb25SZWdpb25cbiIpOwogICByZXR1cm4gcjsKIH0KIAogaW50ICBUU1hSZWN0SW5SZWdpb24oUmVnaW9uIGEwLCBpbnQgYTEsIGludCBhMiwgdW5zaWduZWQgaW50IGEzLCB1bnNpZ25lZCBpbnQgYTQpCiB7CiAgIGludCAgcjsKLSAgZHByaW50Zl94MTEoc3RkZGViLCAiQ2FsbCBYUmVjdEluUmVnaW9uXG4iKTsKKyAgZHByaW50Zl9pbmZvKHgxMSwgIkNhbGwgWFJlY3RJblJlZ2lvblxuIik7CiAgIEVudGVyQ3JpdGljYWxTZWN0aW9uKCAmWDExRFJWX0NyaXRTZWN0aW9uICk7CiAgIHIgPSBYUmVjdEluUmVnaW9uKGEwLCBhMSwgYTIsIGEzLCBhNCk7CiAgIExlYXZlQ3JpdGljYWxTZWN0aW9uKCAmWDExRFJWX0NyaXRTZWN0aW9uICk7Ci0gIGRwcmludGZfeDExKHN0ZGRlYiwgIlJldCBYUmVjdEluUmVnaW9uXG4iKTsKKyAgZHByaW50Zl9pbmZvKHgxMSwgIlJldCBYUmVjdEluUmVnaW9uXG4iKTsKICAgcmV0dXJuIHI7CiB9CiAKIGludCAgVFNYU2F2ZUNvbnRleHQoRGlzcGxheSogYTAsIFhJRCBhMSwgWENvbnRleHQgYTIsIGNvbnN0ICBjaGFyKiBhMykKIHsKICAgaW50ICByOwotICBkcHJpbnRmX3gxMShzdGRkZWIsICJDYWxsIFhTYXZlQ29udGV4dFxuIik7CisgIGRwcmludGZfaW5mbyh4MTEsICJDYWxsIFhTYXZlQ29udGV4dFxuIik7CiAgIEVudGVyQ3JpdGljYWxTZWN0aW9uKCAmWDExRFJWX0NyaXRTZWN0aW9uICk7CiAgIHIgPSBYU2F2ZUNvbnRleHQoYTAsIGExLCBhMiwgYTMpOwogICBMZWF2ZUNyaXRpY2FsU2VjdGlvbiggJlgxMURSVl9Dcml0U2VjdGlvbiApOwotICBkcHJpbnRmX3gxMShzdGRkZWIsICJSZXQgWFNhdmVDb250ZXh0XG4iKTsKKyAgZHByaW50Zl9pbmZvKHgxMSwgIlJldCBYU2F2ZUNvbnRleHRcbiIpOwogICByZXR1cm4gcjsKIH0KIAogdm9pZCAgVFNYU2V0V01Qcm9wZXJ0aWVzKERpc3BsYXkqIGEwLCBXaW5kb3cgYTEsIFhUZXh0UHJvcGVydHkqIGEyLCBYVGV4dFByb3BlcnR5KiBhMywgY2hhcioqIGE0LCBpbnQgYTUsIFhTaXplSGludHMqIGE2LCBYV01IaW50cyogYTcsIFhDbGFzc0hpbnQqIGE4KQogewotICBkcHJpbnRmX3gxMShzdGRkZWIsICJDYWxsIFhTZXRXTVByb3BlcnRpZXNcbiIpOworICBkcHJpbnRmX2luZm8oeDExLCAiQ2FsbCBYU2V0V01Qcm9wZXJ0aWVzXG4iKTsKICAgRW50ZXJDcml0aWNhbFNlY3Rpb24oICZYMTFEUlZfQ3JpdFNlY3Rpb24gKTsKICAgWFNldFdNUHJvcGVydGllcyhhMCwgYTEsIGEyLCBhMywgYTQsIGE1LCBhNiwgYTcsIGE4KTsKICAgTGVhdmVDcml0aWNhbFNlY3Rpb24oICZYMTFEUlZfQ3JpdFNlY3Rpb24gKTsKLSAgZHByaW50Zl94MTEoc3RkZGViLCAiUmV0IFhTZXRXTVByb3BlcnRpZXNcbiIpOworICBkcHJpbnRmX2luZm8oeDExLCAiUmV0IFhTZXRXTVByb3BlcnRpZXNcbiIpOwogfQogCiB2b2lkICBUU1hTZXRXTVNpemVIaW50cyhEaXNwbGF5KiBhMCwgV2luZG93IGExLCBYU2l6ZUhpbnRzKiBhMiwgQXRvbSBhMykKIHsKLSAgZHByaW50Zl94MTEoc3RkZGViLCAiQ2FsbCBYU2V0V01TaXplSGludHNcbiIpOworICBkcHJpbnRmX2luZm8oeDExLCAiQ2FsbCBYU2V0V01TaXplSGludHNcbiIpOwogICBFbnRlckNyaXRpY2FsU2VjdGlvbiggJlgxMURSVl9Dcml0U2VjdGlvbiApOwogICBYU2V0V01TaXplSGludHMoYTAsIGExLCBhMiwgYTMpOwogICBMZWF2ZUNyaXRpY2FsU2VjdGlvbiggJlgxMURSVl9Dcml0U2VjdGlvbiApOwotICBkcHJpbnRmX3gxMShzdGRkZWIsICJSZXQgWFNldFdNU2l6ZUhpbnRzXG4iKTsKKyAgZHByaW50Zl9pbmZvKHgxMSwgIlJldCBYU2V0V01TaXplSGludHNcbiIpOwogfQogCiBpbnQgIFRTWFNldFJlZ2lvbihEaXNwbGF5KiBhMCwgR0MgYTEsIFJlZ2lvbiBhMikKIHsKICAgaW50ICByOwotICBkcHJpbnRmX3gxMShzdGRkZWIsICJDYWxsIFhTZXRSZWdpb25cbiIpOworICBkcHJpbnRmX2luZm8oeDExLCAiQ2FsbCBYU2V0UmVnaW9uXG4iKTsKICAgRW50ZXJDcml0aWNhbFNlY3Rpb24oICZYMTFEUlZfQ3JpdFNlY3Rpb24gKTsKICAgciA9IFhTZXRSZWdpb24oYTAsIGExLCBhMik7CiAgIExlYXZlQ3JpdGljYWxTZWN0aW9uKCAmWDExRFJWX0NyaXRTZWN0aW9uICk7Ci0gIGRwcmludGZfeDExKHN0ZGRlYiwgIlJldCBYU2V0UmVnaW9uXG4iKTsKKyAgZHByaW50Zl9pbmZvKHgxMSwgIlJldCBYU2V0UmVnaW9uXG4iKTsKICAgcmV0dXJuIHI7CiB9CiAKIGludCAgVFNYU2hyaW5rUmVnaW9uKFJlZ2lvbiBhMCwgaW50IGExLCBpbnQgYTIpCiB7CiAgIGludCAgcjsKLSAgZHByaW50Zl94MTEoc3RkZGViLCAiQ2FsbCBYU2hyaW5rUmVnaW9uXG4iKTsKKyAgZHByaW50Zl9pbmZvKHgxMSwgIkNhbGwgWFNocmlua1JlZ2lvblxuIik7CiAgIEVudGVyQ3JpdGljYWxTZWN0aW9uKCAmWDExRFJWX0NyaXRTZWN0aW9uICk7CiAgIHIgPSBYU2hyaW5rUmVnaW9uKGEwLCBhMSwgYTIpOwogICBMZWF2ZUNyaXRpY2FsU2VjdGlvbiggJlgxMURSVl9Dcml0U2VjdGlvbiApOwotICBkcHJpbnRmX3gxMShzdGRkZWIsICJSZXQgWFNocmlua1JlZ2lvblxuIik7CisgIGRwcmludGZfaW5mbyh4MTEsICJSZXQgWFNocmlua1JlZ2lvblxuIik7CiAgIHJldHVybiByOwogfQogCiBpbnQgICBUU1hTdHJpbmdMaXN0VG9UZXh0UHJvcGVydHkoY2hhcioqIGEwLCBpbnQgYTEsIFhUZXh0UHJvcGVydHkqIGEyKQogewogICBpbnQgICByOwotICBkcHJpbnRmX3gxMShzdGRkZWIsICJDYWxsIFhTdHJpbmdMaXN0VG9UZXh0UHJvcGVydHlcbiIpOworICBkcHJpbnRmX2luZm8oeDExLCAiQ2FsbCBYU3RyaW5nTGlzdFRvVGV4dFByb3BlcnR5XG4iKTsKICAgRW50ZXJDcml0aWNhbFNlY3Rpb24oICZYMTFEUlZfQ3JpdFNlY3Rpb24gKTsKICAgciA9IFhTdHJpbmdMaXN0VG9UZXh0UHJvcGVydHkoYTAsIGExLCBhMik7CiAgIExlYXZlQ3JpdGljYWxTZWN0aW9uKCAmWDExRFJWX0NyaXRTZWN0aW9uICk7Ci0gIGRwcmludGZfeDExKHN0ZGRlYiwgIlJldCBYU3RyaW5nTGlzdFRvVGV4dFByb3BlcnR5XG4iKTsKKyAgZHByaW50Zl9pbmZvKHgxMSwgIlJldCBYU3RyaW5nTGlzdFRvVGV4dFByb3BlcnR5XG4iKTsKICAgcmV0dXJuIHI7CiB9CiAKIGludCAgVFNYU3VidHJhY3RSZWdpb24oUmVnaW9uIGEwLCBSZWdpb24gYTEsIFJlZ2lvbiBhMikKIHsKICAgaW50ICByOwotICBkcHJpbnRmX3gxMShzdGRkZWIsICJDYWxsIFhTdWJ0cmFjdFJlZ2lvblxuIik7CisgIGRwcmludGZfaW5mbyh4MTEsICJDYWxsIFhTdWJ0cmFjdFJlZ2lvblxuIik7CiAgIEVudGVyQ3JpdGljYWxTZWN0aW9uKCAmWDExRFJWX0NyaXRTZWN0aW9uICk7CiAgIHIgPSBYU3VidHJhY3RSZWdpb24oYTAsIGExLCBhMik7CiAgIExlYXZlQ3JpdGljYWxTZWN0aW9uKCAmWDExRFJWX0NyaXRTZWN0aW9uICk7Ci0gIGRwcmludGZfeDExKHN0ZGRlYiwgIlJldCBYU3VidHJhY3RSZWdpb25cbiIpOworICBkcHJpbnRmX2luZm8oeDExLCAiUmV0IFhTdWJ0cmFjdFJlZ2lvblxuIik7CiAgIHJldHVybiByOwogfQogCiBpbnQgIFRTWFVuaW9uUmVjdFdpdGhSZWdpb24oWFJlY3RhbmdsZSogYTAsIFJlZ2lvbiBhMSwgUmVnaW9uIGEyKQogewogICBpbnQgIHI7Ci0gIGRwcmludGZfeDExKHN0ZGRlYiwgIkNhbGwgWFVuaW9uUmVjdFdpdGhSZWdpb25cbiIpOworICBkcHJpbnRmX2luZm8oeDExLCAiQ2FsbCBYVW5pb25SZWN0V2l0aFJlZ2lvblxuIik7CiAgIEVudGVyQ3JpdGljYWxTZWN0aW9uKCAmWDExRFJWX0NyaXRTZWN0aW9uICk7CiAgIHIgPSBYVW5pb25SZWN0V2l0aFJlZ2lvbihhMCwgYTEsIGEyKTsKICAgTGVhdmVDcml0aWNhbFNlY3Rpb24oICZYMTFEUlZfQ3JpdFNlY3Rpb24gKTsKLSAgZHByaW50Zl94MTEoc3RkZGViLCAiUmV0IFhVbmlvblJlY3RXaXRoUmVnaW9uXG4iKTsKKyAgZHByaW50Zl9pbmZvKHgxMSwgIlJldCBYVW5pb25SZWN0V2l0aFJlZ2lvblxuIik7CiAgIHJldHVybiByOwogfQogCiBpbnQgIFRTWFVuaW9uUmVnaW9uKFJlZ2lvbiBhMCwgUmVnaW9uIGExLCBSZWdpb24gYTIpCiB7CiAgIGludCAgcjsKLSAgZHByaW50Zl94MTEoc3RkZGViLCAiQ2FsbCBYVW5pb25SZWdpb25cbiIpOworICBkcHJpbnRmX2luZm8oeDExLCAiQ2FsbCBYVW5pb25SZWdpb25cbiIpOwogICBFbnRlckNyaXRpY2FsU2VjdGlvbiggJlgxMURSVl9Dcml0U2VjdGlvbiApOwogICByID0gWFVuaW9uUmVnaW9uKGEwLCBhMSwgYTIpOwogICBMZWF2ZUNyaXRpY2FsU2VjdGlvbiggJlgxMURSVl9Dcml0U2VjdGlvbiApOwotICBkcHJpbnRmX3gxMShzdGRkZWIsICJSZXQgWFVuaW9uUmVnaW9uXG4iKTsKKyAgZHByaW50Zl9pbmZvKHgxMSwgIlJldCBYVW5pb25SZWdpb25cbiIpOwogICByZXR1cm4gcjsKIH0KIAogaW50ICBUU1hYb3JSZWdpb24oUmVnaW9uIGEwLCBSZWdpb24gYTEsIFJlZ2lvbiBhMikKIHsKICAgaW50ICByOwotICBkcHJpbnRmX3gxMShzdGRkZWIsICJDYWxsIFhYb3JSZWdpb25cbiIpOworICBkcHJpbnRmX2luZm8oeDExLCAiQ2FsbCBYWG9yUmVnaW9uXG4iKTsKICAgRW50ZXJDcml0aWNhbFNlY3Rpb24oICZYMTFEUlZfQ3JpdFNlY3Rpb24gKTsKICAgciA9IFhYb3JSZWdpb24oYTAsIGExLCBhMik7CiAgIExlYXZlQ3JpdGljYWxTZWN0aW9uKCAmWDExRFJWX0NyaXRTZWN0aW9uICk7Ci0gIGRwcmludGZfeDExKHN0ZGRlYiwgIlJldCBYWG9yUmVnaW9uXG4iKTsKKyAgZHByaW50Zl9pbmZvKHgxMSwgIlJldCBYWG9yUmVnaW9uXG4iKTsKICAgcmV0dXJuIHI7CiB9CiAKIGludCBUU1hEZXN0cm95SW1hZ2Uoc3RydWN0IF9YSW1hZ2UgKmEwKQogewogICBpbnQgcjsKLSAgZHByaW50Zl94MTEoc3RkZGViLCAiQ2FsbCBYRGVzdHJveUltYWdlXG4iKTsKKyAgZHByaW50Zl9pbmZvKHgxMSwgIkNhbGwgWERlc3Ryb3lJbWFnZVxuIik7CiAgIEVudGVyQ3JpdGljYWxTZWN0aW9uKCAmWDExRFJWX0NyaXRTZWN0aW9uICk7CiAgIHIgPSBYRGVzdHJveUltYWdlKGEwKTsKICAgTGVhdmVDcml0aWNhbFNlY3Rpb24oICZYMTFEUlZfQ3JpdFNlY3Rpb24gKTsKLSAgZHByaW50Zl94MTEoc3RkZGViLCAiUmV0IFhEZXN0cm95SW1hZ2VcbiIpOworICBkcHJpbnRmX2luZm8oeDExLCAiUmV0IFhEZXN0cm95SW1hZ2VcbiIpOwogICByZXR1cm4gcjsKIH0KIAogc3RydWN0IF9YSW1hZ2UgKiBUU1hTdWJJbWFnZShzdHJ1Y3QgX1hJbWFnZSAqYTAsIGludCBhMSwgaW50IGEyLCB1bnNpZ25lZCBpbnQgYTMsIHVuc2lnbmVkIGludCBhNCkKIHsKICAgc3RydWN0IF9YSW1hZ2UgKiByOwotICBkcHJpbnRmX3gxMShzdGRkZWIsICJDYWxsIFhTdWJJbWFnZVxuIik7CisgIGRwcmludGZfaW5mbyh4MTEsICJDYWxsIFhTdWJJbWFnZVxuIik7CiAgIEVudGVyQ3JpdGljYWxTZWN0aW9uKCAmWDExRFJWX0NyaXRTZWN0aW9uICk7CiAgIHIgPSBYU3ViSW1hZ2UoYTAsIGExLCBhMiwgYTMsIGE0KTsKICAgTGVhdmVDcml0aWNhbFNlY3Rpb24oICZYMTFEUlZfQ3JpdFNlY3Rpb24gKTsKLSAgZHByaW50Zl94MTEoc3RkZGViLCAiUmV0IFhTdWJJbWFnZVxuIik7CisgIGRwcmludGZfaW5mbyh4MTEsICJSZXQgWFN1YkltYWdlXG4iKTsKICAgcmV0dXJuIHI7CiB9CiAKIGludCBUU1hBZGRQaXhlbChzdHJ1Y3QgX1hJbWFnZSAqYTAsIGxvbmcgYTEpCiB7CiAgIGludCByOwotICBkcHJpbnRmX3gxMShzdGRkZWIsICJDYWxsIFhBZGRQaXhlbFxuIik7CisgIGRwcmludGZfaW5mbyh4MTEsICJDYWxsIFhBZGRQaXhlbFxuIik7CiAgIEVudGVyQ3JpdGljYWxTZWN0aW9uKCAmWDExRFJWX0NyaXRTZWN0aW9uICk7CiAgIHIgPSBYQWRkUGl4ZWwoYTAsIGExKTsKICAgTGVhdmVDcml0aWNhbFNlY3Rpb24oICZYMTFEUlZfQ3JpdFNlY3Rpb24gKTsKLSAgZHByaW50Zl94MTEoc3RkZGViLCAiUmV0IFhBZGRQaXhlbFxuIik7CisgIGRwcmludGZfaW5mbyh4MTEsICJSZXQgWEFkZFBpeGVsXG4iKTsKICAgcmV0dXJuIHI7CiB9CiAKIFhDb250ZXh0IFRTWFVuaXF1ZUNvbnRleHQodm9pZCkKIHsKICAgWENvbnRleHQgcjsKLSAgZHByaW50Zl94MTEoc3RkZGViLCAiQ2FsbCBYVW5pcXVlQ29udGV4dFxuIik7CisgIGRwcmludGZfaW5mbyh4MTEsICJDYWxsIFhVbmlxdWVDb250ZXh0XG4iKTsKICAgRW50ZXJDcml0aWNhbFNlY3Rpb24oICZYMTFEUlZfQ3JpdFNlY3Rpb24gKTsKICAgciA9IFhVbmlxdWVDb250ZXh0KCk7CiAgIExlYXZlQ3JpdGljYWxTZWN0aW9uKCAmWDExRFJWX0NyaXRTZWN0aW9uICk7Ci0gIGRwcmludGZfeDExKHN0ZGRlYiwgIlJldCBYVW5pcXVlQ29udGV4dFxuIik7CisgIGRwcmludGZfaW5mbyh4MTEsICJSZXQgWFVuaXF1ZUNvbnRleHRcbiIpOwogICByZXR1cm4gcjsKIH0KZGlmZiAtLWdpdCBhL3dpbjMyL2FkdmFwaS5jIGIvd2luMzIvYWR2YXBpLmMKaW5kZXggNTQwNGY0MS4uNTBjYWU1MyAxMDA2NDQKLS0tIGEvd2luMzIvYWR2YXBpLmMKKysrIGIvd2luMzIvYWR2YXBpLmMKQEAgLTExLDcgKzExLDYgQEAKICNpbmNsdWRlICJ3aW5lcnJvci5oIgogI2luY2x1ZGUgInNoZWxsLmgiCiAjaW5jbHVkZSAiaGVhcC5oIgotI2luY2x1ZGUgInN0ZGRlYnVnLmgiCiAjaW5jbHVkZSAiZGVidWcuaCIKIAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCmRpZmYgLS1naXQgYS93aW4zMi9jb2RlX3BhZ2UuYyBiL3dpbjMyL2NvZGVfcGFnZS5jCmluZGV4IDI3NzEwNjEuLmJjZDgwY2UgMTAwNjQ0Ci0tLSBhL3dpbjMyL2NvZGVfcGFnZS5jCisrKyBiL3dpbjMyL2NvZGVfcGFnZS5jCkBAIC0xMCw3ICsxMCw2IEBACiAjaW5jbHVkZSAid2luZXJyb3IuaCIKICNpbmNsdWRlICJ3aW5ubHMuaCIKICNpbmNsdWRlICJoZWFwLmgiCi0jaW5jbHVkZSAic3RkZGVidWcuaCIKICNpbmNsdWRlICJkZWJ1Zy5oIgogCiAKQEAgLTg1LDkgKzg0LDkgQEAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogICogICAgICAgICAgICAgIE11bHRpQnl0ZVRvV2lkZUNoYXIgICAgICAgICAgICAgICAgKEtFUk5FTDMyLjM5MikKICAqLwotaW50IFdJTkFQSSBNdWx0aUJ5dGVUb1dpZGVDaGFyKFVJTlQzMiBwYWdlLCBEV09SRCBmbGFncywKLQkJCSAgICAgICBjb25zdCBjaGFyICpzcmMsIGludCBzcmNsZW4sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgV0NIQVIgKmRzdCwgaW50IGRzdGxlbikKK0lOVDMyIFdJTkFQSSBNdWx0aUJ5dGVUb1dpZGVDaGFyKFVJTlQzMiBwYWdlLCBEV09SRCBmbGFncywKKwkJCSAgICAgICAgIExQQ1NUUiBzcmMsIElOVDMyIHNyY2xlbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExQV1NUUiBkc3QsIElOVDMyIGRzdGxlbikKIHsKICAgICBpbnQgcmV0OwogCkBAIC0xMTEsOCArMTEwLDkgQEAKICAgICByZXR1cm4gcmV0OwogfQogCi1pbnQgV0lOQVBJIFdpZGVDaGFyVG9NdWx0aUJ5dGUoVUlOVDMyIHBhZ2UsIERXT1JEIGZsYWdzLCBXQ0hBUiAqc3JjLCBpbnQgc3JjbGVuLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNoYXIgKmRzdCwgaW50IGRzdGxlbiwgY2hhciogZGVmY2hhciwgQk9PTDMyICp1c2VkKQorSU5UMzIgV0lOQVBJIFdpZGVDaGFyVG9NdWx0aUJ5dGUoVUlOVDMyIHBhZ2UsIERXT1JEIGZsYWdzLCBMUENXU1RSIHNyYywKKwkJCQkgSU5UMzIgc3JjbGVuLExQU1RSIGRzdCwgSU5UMzIgZHN0bGVuLAorCQkJCSBMUENTVFIgZGVmY2hhciwgQk9PTDMyICp1c2VkKQogewogICAgIGludCBjb3VudCA9IDA7CiAgICAgaW50IGVvcyA9IDA7CkBAIC0yMDcsNyArMjA3LDcgQEAKICAqLwogQk9PTDMyIFdJTkFQSSBFbnVtU3lzdGVtQ29kZVBhZ2VzMzJBKENPREVQQUdFX0VOVU1QUk9DMzJBIGxwZm5Db2RlUGFnZUVudW0sRFdPUkQgZmxhZ3MpCiB7Ci0JZHByaW50Zl93aW4zMihzdGRkZWIsIkVudW1TeXN0ZW1Db2RlUGFnZXMzMkEoJXAsJTA4bHgpXG4iLAorCWRwcmludGZfaW5mbyh3aW4zMiwiRW51bVN5c3RlbUNvZGVQYWdlczMyQSglcCwlMDhseClcbiIsCiAJCWxwZm5Db2RlUGFnZUVudW0sZmxhZ3MKIAkpOwogCWxwZm5Db2RlUGFnZUVudW0oIjQzNyIpOwpAQCAtMjIxLDcgKzIyMSw3IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERXT1JEIGZsYWdzKQogewogICAgIFdDSEFSCSpjcDsKLSAgICBkcHJpbnRmX3dpbjMyKHN0ZGRlYiwiRW51bVN5c3RlbUNvZGVQYWdlczMyVyglcCwlMDhseClcbiIsCisgICAgZHByaW50Zl9pbmZvKHdpbjMyLCJFbnVtU3lzdGVtQ29kZVBhZ2VzMzJXKCVwLCUwOGx4KVxuIiwKICAgICAgICAgICAgICAgICAgIGxwZm5Db2RlUGFnZUVudW0sZmxhZ3MgKTsKIAogICAgIGNwID0gSEVBUF9zdHJkdXBBdG9XKCBHZXRQcm9jZXNzSGVhcCgpLCAwLCAiNDM3IiApOwpkaWZmIC0tZ2l0IGEvd2luMzIvY29uc29sZS5jIGIvd2luMzIvY29uc29sZS5jCmluZGV4IDIzOTZmMzQuLmQyZjEzYjUgMTAwNjQ0Ci0tLSBhL3dpbjMyL2NvbnNvbGUuYworKysgYi93aW4zMi9jb25zb2xlLmMKQEAgLTksNyArOSw2IEBACiAjaW5jbHVkZSA8c3RkaW8uaD4KICNpbmNsdWRlIDxzdGRsaWIuaD4KICNpbmNsdWRlIDx1bmlzdGQuaD4KLSNpbmNsdWRlIDxwdHkuaD4KICNpbmNsdWRlIDx0ZXJtaW9zLmg+CiAjaW5jbHVkZSA8c3lzL2lvY3RsLmg+CiAjaW5jbHVkZSA8c3lzL3R5cGVzLmg+CkBAIC0yNSw3ICsyNCw2IEBACiAjaW5jbHVkZSAid2luZXJyb3IuaCIKICNpbmNsdWRlICJ3aW5jb24uaCIKICNpbmNsdWRlICJoZWFwLmgiCi0jaW5jbHVkZSAic3RkZGVidWcuaCIKICNpbmNsdWRlICJkZWJ1Zy5oIgogCiBzdGF0aWMgQ09OU09MRV9TQ1JFRU5fQlVGRkVSX0lORk8gZHVtbXlpbmZvID0KQEAgLTM5LDIzICszNywyNiBAQAogCiAvKiBUaGUgY29uc29sZSAtLSBJIGNob3NlIHRvIGtlZXAgdGhlIG1hc3RlciBhbmQgc2xhdmUKICAqIChVTklYKSBmaWxlIGRlc2NyaXB0b3JzIGFyb3VuZCBpbiBjYXNlIHRoZXkgYXJlIG5lZWRlZCBmb3IKLSAqIGlvY3RscyBsYXRlci4gIFRoZSBwaWQgaXMgbmVlZGVkIHRvIGRldHJveSB0aGUgeHRlcm0gaWYgbmVlZGVkLgorICogaW9jdGxzIGxhdGVyLiAgVGhlIHBpZCBpcyBuZWVkZWQgdG8gZGVzdHJveSB0aGUgeHRlcm0gb24gY2xvc2UKICAqLwogdHlwZWRlZiBzdHJ1Y3QgX0NPTlNPTEUgewogCUszMk9CSiAgaGVhZGVyOwogCWludAltYXN0ZXI7CQkJLyogeHRlcm0gc2lkZSBvZiBwdHkgKi8KIAlpbnQJc2xhdmU7CQkJLyogd2luZSBzaWRlIG9mIHB0eSAqLwogCWludAlwaWQ7CQkJLyogeHRlcm0ncyBwaWQsIC0xIGlmIG5vIHh0ZXJtICovCi0JaW50CWZsYWdzOwkJCS8qIENPTlNPTEVfU1RBUlRFRF9GUk9NICovCi0gICAgICAgIEszMk9CSiAqZmlsZV9pbjsgICAgICAgICAgICAgICAgLyogY29uc29sZSBpbnB1dCAqLwotICAgICAgICBLMzJPQkogKmZpbGVfb3V0OyAgICAgICAgICAgICAgIC8qIGNvbnNvbGUgb3V0cHV0ICovCi0gICAgICAgIEszMk9CSiAqZmlsZV9lcnI7ICAgICAgICAgICAgICAgLyogY29uc29sZSBlcnJvciAqLwogfSBDT05TT0xFOwogCi0jZGVmaW5lIENPTlNPTEVfU1RBUlRFRF9GUk9NICAoMHgxKQkvKiBGSVhNRTogdGhpcyBpcyBsYW1lLCBpdCBzaG91bGQgaGF2ZSAKLQkJCQkJICAgc29tZXRoaW5nIHRvIGRvIHdpdGggc2hhcmluZy4uLiAqLwogCiBzdGF0aWMgdm9pZCBDT05TT0xFX0Rlc3Ryb3koIEszMk9CSiAqb2JqICk7CitzdGF0aWMgQk9PTDMyIENPTlNPTEVfV3JpdGUoSzMyT0JKICpwdHIsIExQQ1ZPSUQgbHBCdWZmZXIsIAorCQkJICAgIERXT1JEIG5OdW1iZXJPZkNoYXJzLCAgTFBEV09SRCBscE51bWJlck9mQ2hhcnMsIAorCQkJICAgIExQT1ZFUkxBUFBFRCBscE92ZXJsYXBwZWQpOworc3RhdGljIEJPT0wzMiBDT05TT0xFX1JlYWQoSzMyT0JKICpwdHIsIExQVk9JRCBscEJ1ZmZlciwgCisJCQkgICBEV09SRCBuTnVtYmVyT2ZDaGFycywgTFBEV09SRCBscE51bWJlck9mQ2hhcnMsIAorCQkJICAgTFBPVkVSTEFQUEVEIGxwT3ZlcmxhcHBlZCk7CitzdGF0aWMgaW50IHdpbmVfb3BlbnB0eShpbnQgKm1hc3RlciwgaW50ICpzbGF2ZSwgY2hhciAqbmFtZSwgCisJCSAgICAgc3RydWN0IHRlcm1pb3MgKnRlcm0sIHN0cnVjdCB3aW5zaXplICp3aW5zaXplKTsKK3N0YXRpYyBCT09MMzIgd2luZV9jcmVhdGVDb25zb2xlKGludCAqbWFzdGVyLCBpbnQgKnNsYXZlLCBpbnQgKnBpZCk7CiAKIGNvbnN0IEszMk9CSl9PUFMgQ09OU09MRV9PcHMgPQogewpAQCAtNjMsMTMgKzY0LDEyIEBACiAJTlVMTCwJCQkvKiBzYXRpc2ZpZWQgKi8KIAlOVUxMLAkJCS8qIGFkZF93YWl0ICovCiAJTlVMTCwJCQkvKiByZW1vdmVfd2FpdCAqLworCUNPTlNPTEVfUmVhZCwJCS8qIHJlYWQgKi8KKwlDT05TT0xFX1dyaXRlLAkJLyogd3JpdGUgKi8KIAlDT05TT0xFX0Rlc3Ryb3kJCS8qIGRlc3Ryb3kgKi8KIH07CiAKIAotc3RhdGljIGludCB3aW5lX29wZW5wdHkoaW50ICptYXN0ZXIsIGludCAqc2xhdmUsIGNoYXIgKm5hbWUsIAotCQkgICAgIHN0cnVjdCB0ZXJtaW9zICp0ZXJtLCBzdHJ1Y3Qgd2luc2l6ZSAqd2luc2l6ZSk7Ci0KIAogCiBzdGF0aWMgdm9pZCBDT05TT0xFX0Rlc3Ryb3koSzMyT0JKICpvYmopCkBAIC04NCwxMCArODQsNTUgQEAKIAkJa2lsbChjb25zb2xlLT5waWQsIFNJR1RFUk0pOwogCX0KIAlIZWFwRnJlZShTeXN0ZW1IZWFwLCAwLCBjb25zb2xlKTsKLQogfQogCiAKKy8qIGxwT3ZlcmxhcHBlZCBpcyBpZ25vcmVkICovCitzdGF0aWMgQk9PTDMyIENPTlNPTEVfUmVhZChLMzJPQkogKnB0ciwgTFBWT0lEIGxwQnVmZmVyLCBEV09SRCBuTnVtYmVyT2ZDaGFycywKKwkJCUxQRFdPUkQgbHBOdW1iZXJPZkNoYXJzLCBMUE9WRVJMQVBQRUQgbHBPdmVybGFwcGVkKQoreworCUNPTlNPTEUgKmNvbnNvbGUgPSAoQ09OU09MRSAqKXB0cjsKKwlpbnQgcmVzdWx0OworCisJZHByaW50Zl9pbmZvKGNvbnNvbGUsICJDT05TT0xFX1JlYWQ6ICVwICVwICVsZFxuIiwgcHRyLCBscEJ1ZmZlciwKKwkJICAgICAgbk51bWJlck9mQ2hhcnMpOworCisJKmxwTnVtYmVyT2ZDaGFycyA9IDA7IAorCisJaWYgKChyZXN1bHQgPSByZWFkKGNvbnNvbGUtPnNsYXZlLCBscEJ1ZmZlciwgbk51bWJlck9mQ2hhcnMpKSA9PSAtMSkgeworCQlGSUxFX1NldERvc0Vycm9yKCk7CisJCXJldHVybiBGQUxTRTsKKwl9CisJKmxwTnVtYmVyT2ZDaGFycyA9IHJlc3VsdDsKKwlyZXR1cm4gVFJVRTsKK30KKworLyogbHBPdmVybGFwcGVkIGlzIGlnbm9yZWQgKi8KK3N0YXRpYyBCT09MMzIgQ09OU09MRV9Xcml0ZShLMzJPQkogKnB0ciwgTFBDVk9JRCBscEJ1ZmZlciwgCisJCQkgICAgRFdPUkQgbk51bWJlck9mQ2hhcnMsCisJCQkgICAgTFBEV09SRCBscE51bWJlck9mQ2hhcnMsIExQT1ZFUkxBUFBFRCBscE92ZXJsYXBwZWQpCit7CisJQ09OU09MRSAqY29uc29sZSA9IChDT05TT0xFICopcHRyOworCWludCByZXN1bHQ7CisKKwlkcHJpbnRmX2luZm8oY29uc29sZSwgIkNPTlNPTEVfV3JpdGU6ICVwICVwICVsZFxuIiwgcHRyLCBscEJ1ZmZlciwKKwkJICAgICAgbk51bWJlck9mQ2hhcnMpOworCisJKmxwTnVtYmVyT2ZDaGFycyA9IDA7IAorCisJLyogRklYTUU6IHRoZXJlIHdhcyBhIGxvb3AgaGVyZSBiZWZvcmUsIHdoeT8/PyAqLworCisJaWYgKChyZXN1bHQgPSB3cml0ZShjb25zb2xlLT5zbGF2ZSwgbHBCdWZmZXIsIG5OdW1iZXJPZkNoYXJzKSkgPT0gLTEpIHsKKwkJRklMRV9TZXREb3NFcnJvcigpOworCQlyZXR1cm4gRkFMU0U7CisJfQorCSpscE51bWJlck9mQ2hhcnMgPSByZXN1bHQ7CisJcmV0dXJuIFRSVUU7Cit9CisKKworCisKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogICogICAgICAgICAgIFNldENvbnNvbGVDdHJsSGFuZGxlciAgICAgICAgICAgICAgIChLRVJORUwzMi40NTkpCiAgKi8KQEAgLTE2NCw5ICsyMDksOCBAQAogCQlyZXR1cm4gRkFMU0U7CiAJfQogCi0gICAgICAgIGlmIChjb25zb2xlLT5maWxlX2luKSBLMzJPQkpfRGVjQ291bnQoIGNvbnNvbGUtPmZpbGVfaW4gKTsKLSAgICAgICAgaWYgKGNvbnNvbGUtPmZpbGVfb3V0KSBLMzJPQkpfRGVjQ291bnQoIGNvbnNvbGUtPmZpbGVfb3V0ICk7Ci0gICAgICAgIGlmIChjb25zb2xlLT5maWxlX2VycikgSzMyT0JKX0RlY0NvdW50KCBjb25zb2xlLT5maWxlX2VyciApOworCVBST0NFU1NfQ2xvc2VPYmpIYW5kbGVzKHBkYiwgJmNvbnNvbGUtPmhlYWRlcik7CisKIAlLMzJPQkpfRGVjQ291bnQoICZjb25zb2xlLT5oZWFkZXIgKTsKIAlwZGItPmNvbnNvbGUgPSBOVUxMOwogCVNZU1RFTV9VTkxPQ0soKTsKQEAgLTI2NCw2ICszMDgsMjQgQEAKIAogfQogCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCQlDT05TT0xFX0dldENvbnNvbGVIYW5kbGUKKyAqCSByZXR1cm5zIGEgMTYtYml0IHN0eWxlIGNvbnNvbGUgaGFuZGxlCisgKiBub3RlOiBvbmx5IGNhbGxlZCBmcm9tIF9sb3BlbgorICovCitIRklMRTMyIENPTlNPTEVfR2V0Q29uc29sZUhhbmRsZShWT0lEKQoreworCVBEQjMyICpwZGIgPSBQUk9DRVNTX0N1cnJlbnQoKTsKKwlIRklMRTMyIGhhbmRsZSA9IEhGSUxFX0VSUk9SMzI7CisKKwlTWVNURU1fTE9DSygpOworCWlmIChwZGItPmNvbnNvbGUgIT0gTlVMTCkgeworCQlDT05TT0xFICpjb25zb2xlID0gKENPTlNPTEUgKilwZGItPmNvbnNvbGU7CisJCWhhbmRsZSA9IChIRklMRTMyKUhBTkRMRV9BbGxvYygmY29uc29sZS0+aGVhZGVyLCAwLCBUUlVFKTsKKwl9CisJU1lTVEVNX1VOTE9DSygpOworCXJldHVybiBoYW5kbGU7Cit9CiAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogICogICAgICAgICAgICBBbGxvY0NvbnNvbGUgKEtFUk5FTDMyLjEwMykKQEAgLTI4NywxMyArMzQ5LDggQEAKIAogCWNvbnNvbGUgPSAoQ09OU09MRSAqKXBkYi0+Y29uc29sZTsKIAotCS8qIHdlIG9ubHkgd2FudCB0byBiZSBhYmxlIHRvIG9wZW4gYSBjb25zb2xlIGlmIHRoZSBwcm9jZXNzIGRvZXNuJ3QgaGF2ZSBvbmUKLQkgKiBub3cgb3Igd2UgZ290IHRoZSBvbmUgd2UgaGF2ZSBmcm9tIG91ciBwYXJlbnQKLQkgKiAgLSBpbnZhbGlkIGhhbmRsZSBjb21lcyBmcm9tIHdoZW4gdGhlIGNvbnNvbGUgd2FzIGNsb3NlZCB2aWEgRnJlZUNvbnNvbGUoKQotCSAqICAtIENPTlNPTEVfU1RBUlRFRF9GUk9NIGlzIHdoZW4gdGhpcyBwcm9jZXNzIGluaGVyaXRzIGl0cyBjb25zb2xlIGZyb20KLQkgKiAgICBpdHMgcGFyZW50Ci0JICovCi0JaWYgKGNvbnNvbGUgJiYgKGNvbnNvbGUtPmZsYWdzICYgQ09OU09MRV9TVEFSVEVEX0ZST00pID09IDApIHsKKwkvKiBkb24ndCBjcmVhdGUgYSBjb25zb2xlIGlmIHdlIGFscmVhZHkgaGF2ZSBvbmUgKi8KKwlpZiAoY29uc29sZSAhPSBOVUxMKSB7CiAJCVNldExhc3RFcnJvcihFUlJPUl9BQ0NFU1NfREVOSUVEKTsKIAkJU1lTVEVNX1VOTE9DSygpOwogCQlyZXR1cm4gRkFMU0U7CkBAIC0zMDgsOSArMzY1LDYgQEAKICAgICAgICAgY29uc29sZS0+aGVhZGVyLnR5cGUgICAgID0gSzMyT0JKX0NPTlNPTEU7CiAgICAgICAgIGNvbnNvbGUtPmhlYWRlci5yZWZjb3VudCA9IDE7CiAgICAgICAgIGNvbnNvbGUtPnBpZCAgICAgICAgICAgICA9IC0xOwotICAgICAgICBjb25zb2xlLT5maWxlX2luICAgICAgICAgPSBOVUxMOwotICAgICAgICBjb25zb2xlLT5maWxlX291dCAgICAgICAgPSBOVUxMOwotICAgICAgICBjb25zb2xlLT5maWxlX2VyciAgICAgICAgPSBOVUxMOwogCiAJaWYgKHdpbmVfY3JlYXRlQ29uc29sZSgmbWFzdGVyLCAmc2xhdmUsICZwaWQpID09IEZBTFNFKSB7CiAJCUszMk9CSl9EZWNDb3VudCgmY29uc29sZS0+aGVhZGVyKTsKQEAgLTMyMiwyNiArMzc2LDI0IEBACiAgICAgICAgIGNvbnNvbGUtPm1hc3RlciA9IG1hc3RlcjsKIAljb25zb2xlLT5zbGF2ZSA9IHNsYXZlOwogCWNvbnNvbGUtPnBpZCA9IHBpZDsKLQljb25zb2xlLT5mbGFncyA9IDA7CiAKLQlpZiAoKGhJbiA9IEZJTEVfRHVwVW5peEhhbmRsZShzbGF2ZSkpID09IElOVkFMSURfSEFORExFX1ZBTFVFMzIpCisJaWYgKChoSW4gPSBIQU5ETEVfQWxsb2MoJmNvbnNvbGUtPmhlYWRlciwgMCwgVFJVRSkpID09IElOVkFMSURfSEFORExFX1ZBTFVFMzIpCiAgICAgICAgIHsKICAgICAgICAgICAgIEszMk9CSl9EZWNDb3VudCgmY29uc29sZS0+aGVhZGVyKTsKICAgICAgICAgICAgIFNZU1RFTV9VTkxPQ0soKTsKICAgICAgICAgICAgIHJldHVybiBGQUxTRTsKIAl9Ci0JRklMRV9TZXRGaWxlVHlwZShoSW4sIEZJTEVfVFlQRV9DSEFSKTsKIAotCWlmICgoaE91dCA9IEZJTEVfRHVwVW5peEhhbmRsZShzbGF2ZSkpID09IElOVkFMSURfSEFORExFX1ZBTFVFMzIpCisJaWYgKChoT3V0ID0gSEFORExFX0FsbG9jKCZjb25zb2xlLT5oZWFkZXIsIDAsIFRSVUUpKSA9PSBJTlZBTElEX0hBTkRMRV9WQUxVRTMyKQogICAgICAgICB7CiAgICAgICAgICAgICBDbG9zZUhhbmRsZShoSW4pOwogICAgICAgICAgICAgSzMyT0JKX0RlY0NvdW50KCZjb25zb2xlLT5oZWFkZXIpOwogICAgICAgICAgICAgU1lTVEVNX1VOTE9DSygpOwogICAgICAgICAgICAgcmV0dXJuIEZBTFNFOwogCX0KLQlGSUxFX1NldEZpbGVUeXBlKGhPdXQsIEZJTEVfVFlQRV9DSEFSKTsKIAotCWlmICgoaEVyciA9IEZJTEVfRHVwVW5peEhhbmRsZShzbGF2ZSkpID09IElOVkFMSURfSEFORExFX1ZBTFVFMzIpCisKKwlpZiAoKGhFcnIgPSBIQU5ETEVfQWxsb2MoJmNvbnNvbGUtPmhlYWRlciwgMCwgVFJVRSkpID09IElOVkFMSURfSEFORExFX1ZBTFVFMzIpCiAgICAgICAgIHsKICAgICAgICAgICAgIENsb3NlSGFuZGxlKGhJbik7CiAgICAgICAgICAgICBDbG9zZUhhbmRsZShoT3V0KTsKQEAgLTM0OSwxMSArNDAxLDYgQEAKICAgICAgICAgICAgIFNZU1RFTV9VTkxPQ0soKTsKICAgICAgICAgICAgIHJldHVybiBGQUxTRTsKIAl9Ci0JRklMRV9TZXRGaWxlVHlwZShoRXJyLCBGSUxFX1RZUEVfQ0hBUik7Ci0KLSAgICAgICAgY29uc29sZS0+ZmlsZV9pbiA9IEhBTkRMRV9HZXRPYmpQdHIoIGhJbiwgSzMyT0JKX0ZJTEUsIDAgLypGSVhNRSovICk7Ci0gICAgICAgIGNvbnNvbGUtPmZpbGVfb3V0ID0gSEFORExFX0dldE9ialB0ciggaEluLCBLMzJPQkpfRklMRSwgMCAvKkZJWE1FKi8gKTsKLSAgICAgICAgY29uc29sZS0+ZmlsZV9lcnIgPSBIQU5ETEVfR2V0T2JqUHRyKCBoSW4sIEszMk9CSl9GSUxFLCAwIC8qRklYTUUqLyApOwogCiAJLyogYXNzb2NpYXRlIHRoaXMgY29uc29sZSB3aXRoIHRoZSBwcm9jZXNzICovCiAgICAgICAgIGlmIChwZGItPmNvbnNvbGUpIEszMk9CSl9EZWNDb3VudCggcGRiLT5jb25zb2xlICk7CkBAIC00MzYsMTggKzQ4Myw2IEBACiAJLyogRklYTUU6IHNob3VsZCBJIGNoZWNrIGlmIHRoaXMgaXMgYSBjb25zb2xlIGhhbmRsZT8gKi8KIAlyZXR1cm4gV3JpdGVGaWxlKGhDb25zb2xlT3V0cHV0LCBscEJ1ZmZlciwgbk51bWJlck9mQ2hhcnNUb1dyaXRlLAogCQkJIGxwTnVtYmVyT2ZDaGFyc1dyaXR0ZW4sIE5VTEwpOwotCi0jaWZkZWYgT0xECi0JKmxwTnVtYmVyT2ZDaGFyc1dyaXR0ZW4gPSBmcHJpbnRmKENPTlNPTEVfY29uc29sZS5jb25JTywgIiUuKnMiLAotCQkJCQkgICAoaW50KW5OdW1iZXJPZkNoYXJzVG9Xcml0ZSwKLQkJCQkJICAgKExQU1RSKWxwQnVmZmVyICk7Ci0JaWYgKGZlcnJvcihDT05TT0xFX2NvbnNvbGUuY29uSU8pIHsKLQkJY2xlYXJlcnIoKTsKLQkJcmV0dXJuIEZBTFNFOwotCX0KLQotCXJldHVybiBUUlVFOwotI2VuZGlmCiB9CiAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgpAQCAtNDc2LDIwICs1MTEsNiBAQAogCXJldHVybiBXcml0ZUZpbGUoaENvbnNvbGVPdXRwdXQsIGxwQnVmZmVyLCBuTnVtYmVyT2ZDaGFyc1RvV3JpdGUsCiAJCQkgbHBOdW1iZXJPZkNoYXJzV3JpdHRlbiwgTlVMTCk7CiAKLQotI2lmZGVmIE9MRAotCUxQU1RSIGJ1ZiA9ICBIRUFQX3N0cmR1cFd0b0EoIEdldFByb2Nlc3NIZWFwKCksIDAsIGxwQnVmZmVyICk7Ci0JKmxwTnVtYmVyT2ZDaGFyc1dyaXR0ZW4gPSBmcHJpbnRmKENPTlNPTEVfY29uc29sZS5jb25JTywgIiUuKnMiLAotCQkJCQkgIChpbnQpbk51bWJlck9mQ2hhcnNUb1dyaXRlLCBidWYgKTsKLQlIZWFwRnJlZSggR2V0UHJvY2Vzc0hlYXAoKSwgMCwgYnVmICk7Ci0KLQlpZiAoZmVycm9yKENPTlNPTEVfY29uc29sZS5jb25JTykgewotCQljbGVhcmVycigpOwotCQlyZXR1cm4gRkFMU0U7Ci0JfQotCi0JcmV0dXJuIFRSVUU7Ci0jZW5kaWYKIH0KIAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCmRpZmYgLS1naXQgYS93aW4zMi9lbnZpcm9ubWVudC5jIGIvd2luMzIvZW52aXJvbm1lbnQuYwppbmRleCAwNjgwZDFlLi43MGMyNTNhIDEwMDY0NAotLS0gYS93aW4zMi9lbnZpcm9ubWVudC5jCisrKyBiL3dpbjMyL2Vudmlyb25tZW50LmMKQEAgLTExLDcgKzExLDYgQEAKICNpbmNsdWRlICJ3aW5lcnJvci5oIgogI2luY2x1ZGUgIm1vZHVsZS5oIgogI2luY2x1ZGUgInRhc2suaCIKLSNpbmNsdWRlICJzdGRkZWJ1Zy5oIgogI2luY2x1ZGUgImRlYnVnLmgiCiAjaW5jbHVkZSAicHJvY2Vzcy5oIiAgLyogZm9yIFBST0NFU1NfQ3VycmVudCgpICovCiAKZGlmZiAtLWdpdCBhL3dpbjMyL2Vycm9yLmMgYi93aW4zMi9lcnJvci5jCmluZGV4IDYyYzU1YmYuLjM5ZDI4MzIgMTAwNjQ0Ci0tLSBhL3dpbjMyL2Vycm9yLmMKKysrIGIvd2luMzIvZXJyb3IuYwpAQCAtOCw3ICs4LDYgQEAKICNpbmNsdWRlIDxlcnJuby5oPgogI2luY2x1ZGUgIndpbmRvd3MuaCIKICNpbmNsdWRlICJ3aW5lcnJvci5oIgotI2luY2x1ZGUgInN0ZGRlYnVnLmgiCiAjaW5jbHVkZSAiZGVidWcuaCIKIAogLyogVGhlIGVycm5vX3hsYXRfdGFibGUgY29udGFpbnMgdGhlIGVycm5vLXRvLVdpbjMyIGVycm9yCmRpZmYgLS1naXQgYS93aW4zMi9leGNlcHQuYyBiL3dpbjMyL2V4Y2VwdC5jCmluZGV4IDBmZWFlODguLjA4Y2M3MGQgMTAwNjQ0Ci0tLSBhL3dpbjMyL2V4Y2VwdC5jCisrKyBiL3dpbjMyL2V4Y2VwdC5jCkBAIC0zOCw3ICszOCw2IEBACiAjaW5jbHVkZSAibGR0LmgiCiAjaW5jbHVkZSAicHJvY2Vzcy5oIgogI2luY2x1ZGUgInRocmVhZC5oIgotI2luY2x1ZGUgInN0ZGRlYnVnLmgiCiAjaW5jbHVkZSAiZGVidWcuaCIKICNpbmNsdWRlICJleGNlcHQuaCIKIApAQCAtODIsNyArODEsNyBAQAogICAgICAgICAgIChURUJfRVhDRVBUSU9OX0ZSQU1FKHBjb250ZXh0KSAhPSAoKHZvaWQgKikweGZmZmZmZmZmKSkgJiYKICAgICAgICAgICAoVEVCX0VYQ0VQVElPTl9GUkFNRShwY29udGV4dCkgIT0gcEVuZEZyYW1lKSkKICAgIHsKLSAgICAgICBkcHJpbnRmX3dpbjMyKCBzdGRkZWIsICJjYWxsaW5nIGV4Y2VwdGlvbiBoYW5kbGVyIGF0IDB4JXhcbiIsCisgICAgICAgZHByaW50Zl9pbmZvKHdpbjMyLCAiY2FsbGluZyBleGNlcHRpb24gaGFuZGxlciBhdCAweCV4XG4iLAogICAgICAgICAgICAgICAgICAgICAgIChpbnQpVEVCX0VYQ0VQVElPTl9GUkFNRShwY29udGV4dCktPkhhbmRsZXIgKTsKIAogICAgICAgIGRpc3BhdGNoPTA7ICAgICAgIApAQCAtOTAsNyArODksNyBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVEVCX0VYQ0VQVElPTl9GUkFNRShwY29udGV4dCksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwY29udGV4dCwgJmRpc3BhdGNoKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgZHByaW50Zl93aW4zMihzdGRkZWIsImV4Y2VwdGlvbiBoYW5kbGVyIHJldHVybnMgMHgleCwgZGlzcGF0Y2g9MHgleFxuIiwKKyAgICAgICBkcHJpbnRmX2luZm8od2luMzIsImV4Y2VwdGlvbiBoYW5kbGVyIHJldHVybnMgMHgleCwgZGlzcGF0Y2g9MHgleFxuIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHZhbCwgKGludCkgZGlzcGF0Y2gpOwogICAKICAgICAgICBpZiAoCShyZXR2YWwgPT0gRXhjZXB0aW9uQ29sbGlkZWRVbndpbmQpICYmCkBAIC0xNTAsMTQgKzE0OSwxNCBAQAogICAgIAogICAgIHdoaWxlKChwZnJhbWUhPU5VTEwpJiYocGZyYW1lIT0oKHZvaWQgKikweEZGRkZGRkZGKSkpCiAgICAgewotICAgICAgIGRwcmludGZfd2luMzIoc3RkZGViLCJjYWxsaW5nIGV4Y2VwdGlvbiBoYW5kbGVyIGF0IDB4JXhcbiIsCisgICAgICAgZHByaW50Zl9pbmZvKHdpbjMyLCJjYWxsaW5nIGV4Y2VwdGlvbiBoYW5kbGVyIGF0IDB4JXhcbiIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoaW50KSBwZnJhbWUtPkhhbmRsZXIpOwogICAgICAgIGRpc3BhdGNoPTA7ICAKLSAgICAgICBkcHJpbnRmX3JlbGF5KHN0ZGRlYiwiQ2FsbFRvMzIoZXhjZXB0PSVwLHJlY29yZD0lcCxmcmFtZT0lcCxjb250ZXh0PSVwLGRpc3BhdGNoPSVwKVxuIiwKKyAgICAgICBkcHJpbnRmX2luZm8ocmVsYXksIkNhbGxUbzMyKGV4Y2VwdD0lcCxyZWNvcmQ9JXAsZnJhbWU9JXAsY29udGV4dD0lcCxkaXNwYXRjaD0lcClcbiIsCiAgICAgICAgICAgICAgICAgICAgICBwZnJhbWUtPkhhbmRsZXIsICZyZWNvcmQsIHBmcmFtZSwgcGNvbnRleHQsICZkaXNwYXRjaCApOwogICAgICAgIHJldHZhbD1wZnJhbWUtPkhhbmRsZXIoJnJlY29yZCxwZnJhbWUscGNvbnRleHQsJmRpc3BhdGNoKTsKICAKLSAgICAgICBkcHJpbnRmX3dpbjMyKHN0ZGRlYiwiZXhjZXB0aW9uIGhhbmRsZXIgcmV0dXJucyAweCV4LCBkaXNwYXRjaD0weCV4XG4iLAorICAgICAgIGRwcmludGZfaW5mbyh3aW4zMiwiZXhjZXB0aW9uIGhhbmRsZXIgcmV0dXJucyAweCV4LCBkaXNwYXRjaD0weCV4XG4iLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dmFsLCAoaW50KSBkaXNwYXRjaCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICBpZihyZXR2YWw9PUV4Y2VwdGlvbkNvbnRpbnVlRXhlY3V0aW9uKQpAQCAtMTY4LDcgKzE2Nyw3IEBACiAgICBpZiAocmV0dmFsIT1FeGNlcHRpb25Db250aW51ZUV4ZWN1dGlvbikKICAgIHsgICAgCiAgICAgICAgLyogRklYTUU6IHdoYXQgc2hvdWxkIHdlIGRvIGhlcmU/ICovCi0gICAgICAgZHByaW50Zl93aW4zMihzdGRkZWIsIm5vIGhhbmRsZXIgd2FudGVkIHRvIGhhbmRsZSB0aGUgZXhjZXB0aW9uLCBleGl0aW5nXG4iKTsKKyAgICAgICBkcHJpbnRmX2luZm8od2luMzIsIm5vIGhhbmRsZXIgd2FudGVkIHRvIGhhbmRsZSB0aGUgZXhjZXB0aW9uLCBleGl0aW5nXG4iKTsKICAgICAgICBFeGl0UHJvY2Vzcyhkd0V4Y2VwdGlvbkNvZGUpOyAvKiB3aGF0IHN0YXR1cyBzaG91bGQgYmUgdXNlZCBoZXJlID8gKi8KICAgIH0KIH0KZGlmZiAtLWdpdCBhL3dpbjMyL2ZpbGUuYyBiL3dpbjMyL2ZpbGUuYwppbmRleCBmNjM0ZGNlLi44NWVhMDFmIDEwMDY0NAotLS0gYS93aW4zMi9maWxlLmMKKysrIGIvd2luMzIvZmlsZS5jCkBAIC0xOCw5ICsxOCw4IEBACiAjaW5jbHVkZSAid2luYmFzZS5oIgogI2luY2x1ZGUgIndpbmVycm9yLmgiCiAjaW5jbHVkZSAiZmlsZS5oIgorI2luY2x1ZGUgInByb2Nlc3MuaCIKICNpbmNsdWRlICJoZWFwLmgiCi0jaW5jbHVkZSAic3RkZGVidWcuaCIKLSNkZWZpbmUgREVCVUdfV0lOMzIKICNpbmNsdWRlICJkZWJ1Zy5oIgogCiBEV09SRCBFcnJub1RvTGFzdEVycm9yKGludCBlcnJub19udW0pOwpAQCAtMzEsMzggKzMwLDQ0IEBACiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICAqICAgICAgICAgICAgIFdyaXRlRmlsZSAgICAgICAgICAgICAgIChLRVJORUwzMi41NzgpCiAgKi8KLUJPT0wzMiBXSU5BUEkgV3JpdGVGaWxlKEhGSUxFMzIgaEZpbGUsIExQVk9JRCBscEJ1ZmZlciwgRFdPUkQgbnVtYmVyT2ZCeXRlc1RvV3JpdGUsCitCT09MMzIgV0lOQVBJIFdyaXRlRmlsZShIQU5ETEUzMiBoRmlsZSwgTFBDVk9JRCBscEJ1ZmZlciwgCisJCQlEV09SRCBudW1iZXJPZkJ5dGVzVG9Xcml0ZSwKICAgICAgICAgICAgICAgICAgICAgICAgIExQRFdPUkQgbnVtYmVyT2ZCeXRlc1dyaXR0ZW4sIExQT1ZFUkxBUFBFRCBscE92ZXJsYXBwZWQpCiB7Ci0gICAgTE9ORwlyZXM7Ci0KLSAgICByZXMgPSBfbHdyaXRlMzIoaEZpbGUsbHBCdWZmZXIsbnVtYmVyT2ZCeXRlc1RvV3JpdGUpOwotICAgIGlmIChyZXM9PS0xKSB7Ci0gICAgCVNldExhc3RFcnJvcihFcnJub1RvTGFzdEVycm9yKGVycm5vKSk7Ci0gICAgCXJldHVybiBGQUxTRTsKLSAgICB9Ci0gICAgaWYobnVtYmVyT2ZCeXRlc1dyaXR0ZW4pCi0gICAgICAgICpudW1iZXJPZkJ5dGVzV3JpdHRlbiA9IHJlczsKLSAgICByZXR1cm4gVFJVRTsKKwlLMzJPQkogKmlvcHRyOworCUJPT0wzMiBzdGF0dXMgPSBGQUxTRTsKKwkKKwlkcHJpbnRmX2luZm8oZmlsZSwgIldyaXRlRmlsZTogJWQgJXAgJWxkXG4iLCBoRmlsZSwgbHBCdWZmZXIsIAorCQkgICAgICBudW1iZXJPZkJ5dGVzVG9Xcml0ZSk7CisJCisJaWYgKCEoaW9wdHIgPSBIQU5ETEVfR2V0T2JqUHRyKCBoRmlsZSwgSzMyT0JKX1VOS05PV04sIDAgKSkpIAorCQlyZXR1cm4gSEZJTEVfRVJST1IzMjsKKyAgICAgICAgaWYgKEszMk9CSl9PUFMoaW9wdHIpLT53cml0ZSkKKyAgICAgICAgICAgIHN0YXR1cyA9IEszMk9CSl9PUFMoaW9wdHIpLT53cml0ZShpb3B0ciwgbHBCdWZmZXIsIG51bWJlck9mQnl0ZXNUb1dyaXRlLCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBudW1iZXJPZkJ5dGVzV3JpdHRlbiwgbHBPdmVybGFwcGVkKTsKKwlLMzJPQkpfRGVjQ291bnQoIGlvcHRyICk7CisJcmV0dXJuIHN0YXR1czsKIH0KIAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgKiAgICAgICAgICAgICAgUmVhZEZpbGUgICAgICAgICAgICAgICAgKEtFUk5FTDMyLjQyOCkKICAqLwotQk9PTDMyIFdJTkFQSSBSZWFkRmlsZShIRklMRTMyIGhGaWxlLCBMUFZPSUQgbHBCdWZmZXIsIERXT1JEIG51bXRvcmVhZCwKLSAgICAgICAgICAgICAgICAgICAgICAgTFBEV09SRCBudW1yZWFkLCBMUE9WRVJMQVBQRUQgbHBPdmVybGFwcGVkKQorQk9PTDMyIFdJTkFQSSBSZWFkRmlsZShIQU5ETEUzMiBoRmlsZSwgTFBWT0lEIGxwQnVmZmVyLCBEV09SRCBudW1iZXJPZkJ5dGVzVG9SZWFkLAorICAgICAgICAgICAgICAgICAgICAgICBMUERXT1JEIG51bWJlck9mQnl0ZXNSZWFkLCBMUE9WRVJMQVBQRUQgbHBPdmVybGFwcGVkKQogewotICAgIGludCBhY3R1YWxfcmVhZDsKLQotICAgIGFjdHVhbF9yZWFkID0gX2xyZWFkMzIoaEZpbGUsbHBCdWZmZXIsbnVtdG9yZWFkKTsKLSAgICBpZihhY3R1YWxfcmVhZCA9PSAtMSkgewotICAgICAgICBTZXRMYXN0RXJyb3IoRXJybm9Ub0xhc3RFcnJvcihlcnJubykpOwotICAgICAgICByZXR1cm4gRkFMU0U7Ci0gICAgfQotICAgIGlmKG51bXJlYWQpCi0gICAgICAgICpudW1yZWFkID0gYWN0dWFsX3JlYWQ7Ci0KLSAgICByZXR1cm4gVFJVRTsKKwlLMzJPQkogKmlvcHRyOworCUJPT0wzMiBzdGF0dXMgPSBGQUxTRTsKKwkKKwlkcHJpbnRmX2luZm8oZmlsZSwgIlJlYWRGaWxlOiAlZCAlcCAlbGRcbiIsIGhGaWxlLCBscEJ1ZmZlciwgCisJCSAgICAgIG51bWJlck9mQnl0ZXNUb1JlYWQpOworCQorCWlmICghKGlvcHRyID0gSEFORExFX0dldE9ialB0ciggaEZpbGUsIEszMk9CSl9VTktOT1dOLCAwICkpKSAKKwkJcmV0dXJuIEhGSUxFX0VSUk9SMzI7CisgICAgICAgIGlmIChLMzJPQkpfT1BTKGlvcHRyKS0+cmVhZCkKKyAgICAgICAgICAgIHN0YXR1cyA9IEszMk9CSl9PUFMoaW9wdHIpLT5yZWFkKGlvcHRyLCBscEJ1ZmZlciwgbnVtYmVyT2ZCeXRlc1RvUmVhZCwgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBudW1iZXJPZkJ5dGVzUmVhZCwgbHBPdmVybGFwcGVkKTsKKwlLMzJPQkpfRGVjQ291bnQoIGlvcHRyICk7CisJcmV0dXJuIHN0YXR1czsKIH0KIAogCkBAIC0xMDcsNyArMTEyLDcgQEAKICAgICBjcmVhdGVfZmxhZ3MgPSBUcmFuc2xhdGVDcmVhdGlvbkZsYWdzKGNyZWF0aW9uKTsKIAogICAgIGlmKHRlbXBsYXRlKQotICAgICAgICBkcHJpbnRmX2ZpbGUoc3RkZGViLCAiQ3JlYXRlRmlsZTogdGVtcGxhdGUgaGFuZGxlcyBub3Qgc3VwcG9ydGVkLlxuIik7CisgICAgICAgIGRwcmludGZfZml4bWUoZmlsZSwgIkNyZWF0ZUZpbGU6IHRlbXBsYXRlIGhhbmRsZXMgbm90IHN1cHBvcnRlZC5cbiIpOwogCiAgICAgLyogSWYgdGhlIG5hbWUgc3RhcnRzIHdpdGggJ1xcPycgb3IgJ1xcLicsIGlnbm9yZSB0aGUgZmlyc3QgMyBjaGFycy4KICAgICAgKi8KQEAgLTExOCw3ICsxMjMsNyBAQAogICAgICAqLwogICAgIGlmKCFzdHJuY21wKGZpbGVuYW1lLCAiXFxcXCIsIDIpKQogICAgIHsKLSAgICAgICAgZHByaW50Zl9maWxlKHN0ZGRlYiwgIkNyZWF0ZUZpbGU6IFVOQyBuYW1lcyBub3Qgc3VwcG9ydGVkLlxuIik7CisgICAgICAgIGRwcmludGZfZml4bWUoZmlsZSwgIkNyZWF0ZUZpbGU6IFVOQyBuYW1lcyBub3Qgc3VwcG9ydGVkLlxuIik7CiAgICAgICAgIFNldExhc3RFcnJvcihFUlJPUl9DQUxMX05PVF9JTVBMRU1FTlRFRCk7CiAgICAgICAgIHJldHVybiBIRklMRV9FUlJPUjMyOwogICAgIH0KQEAgLTIyMCw3ICsyMjUsNyBAQAogICAgIGlmICghRE9TRlNfR2V0RnVsbE5hbWUoIGxwRmlsZU5hbWUsIFRSVUUsICZmdWxsX25hbWUgKSkKICAgICAgICAgcmV0dXJuIEZBTFNFOwogCi0gICAgZHByaW50Zl9maWxlKHN0ZGRlYiwiU2V0RmlsZUF0dHJpYnV0ZXMoJXMsJWx4KVxuIixscEZpbGVOYW1lLGF0dHJpYnV0ZXMpOworICAgIGRwcmludGZfaW5mbyhmaWxlLCJTZXRGaWxlQXR0cmlidXRlcyglcywlbHgpXG4iLGxwRmlsZU5hbWUsYXR0cmlidXRlcyk7CiAgICAgaWYgKGF0dHJpYnV0ZXMgJiBGSUxFX0FUVFJJQlVURV9OT1JNQUwpIHsKICAgICAgIGF0dHJpYnV0ZXMgJj0gfkZJTEVfQVRUUklCVVRFX05PUk1BTDsKICAgICAgIGlmIChhdHRyaWJ1dGVzKQpkaWZmIC0tZ2l0IGEvd2luMzIvaW5pdC5jIGIvd2luMzIvaW5pdC5jCmluZGV4IDUwYTQ0Y2QuLjE0NzJjYzAgMTAwNjQ0Ci0tLSBhL3dpbjMyL2luaXQuYworKysgYi93aW4zMi9pbml0LmMKQEAgLTEzLDcgKzEzLDYgQEAKICNpbmNsdWRlICJleGNlcHQuaCIKICNpbmNsdWRlICJoZWFwLmgiCiAjaW5jbHVkZSAidGFzay5oIgotI2luY2x1ZGUgInN0ZGRlYnVnLmgiCiAjaW5jbHVkZSAiZGVidWcuaCIKICAgCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKQEAgLTgzLDYgKzgyLDcgQEAKICAgY2hhciAqbmFtZTsKIAogICBuYW1lPWdldGxvZ2luKCk7CisgIGlmICghbmFtZSkgbmFtZT1jdXNlcmlkKE5VTEwpOwogICBsZW4gPSBuYW1lID8gc3RybGVuKG5hbWUpIDogMDsKICAgaWYgKCFsZW4gfHwgIWxwU2l6ZSB8fCBsZW4gPiAqbHBTaXplKSB7CiAgICAgaWYgKGxwc3pOYW1lKSAqbHBzek5hbWUgPSAwOwpkaWZmIC0tZ2l0IGEvd2luMzIva2VybmVsMzIuYyBiL3dpbjMyL2tlcm5lbDMyLmMKaW5kZXggYTIyYzc3NS4uYjFkZDk0MiAxMDA2NDQKLS0tIGEvd2luMzIva2VybmVsMzIuYworKysgYi93aW4zMi9rZXJuZWwzMi5jCkBAIC0xLDcgKzEsNyBAQAogLyoKICAqIEtFUk5FTDMyIHRodW5rcyBhbmQgb3RoZXIgdW5kb2N1bWVudGVkIHN0dWZmCiAgKgotICogQ29weXJpZ2h0IDE5OTcgTWFyY3VzIE1laXNzbmVyCisgKiBDb3B5cmlnaHQgMTk5Ny0xOTk4IE1hcmN1cyBNZWlzc25lcgogICovCiAKICNpbmNsdWRlIDxzdGRpby5oPgpAQCAtMTQsMTAgKzE0LDEwIEBACiAjaW5jbHVkZSAibW9kdWxlLmgiCiAjaW5jbHVkZSAicHJvY2Vzcy5oIgogI2luY2x1ZGUgInN0YWNrZnJhbWUuaCIKKyNpbmNsdWRlICJoZWFwLmgiCiAjaW5jbHVkZSAic2VsZWN0b3JzLmgiCiAjaW5jbHVkZSAidGFzay5oIgogI2luY2x1ZGUgIndpbi5oIgotI2luY2x1ZGUgInN0ZGRlYnVnLmgiCiAjaW5jbHVkZSAiZGVidWcuaCIKIAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCkBAIC0xMDMsMTYgKzEwMywxNiBAQAogCVNFR1BUUgkJdGhrYnVmOwogCXN0cnVjdAl0aHVua3N0cnVjdAkqdGhzMTY7CiAKLQlkcHJpbnRmX3RodW5rKHN0ZGRlYiwiVGh1bmtDb25uZWN0MzIoPHN0cnVjdD4sJXMsJXMsJXMsJXgsJWx4KVxuIiwKKwlkcHJpbnRmX2luZm8odGh1bmssIlRodW5rQ29ubmVjdDMyKDxzdHJ1Y3Q+LCVzLCVzLCVzLCV4LCVseClcbiIsCiAJCXRodW5rZnVuMTYsbW9kdWxlMzIsbW9kdWxlMTYsaG1vZDMyLGRsbGluaXRhcmcxCiAJKTsKLQlkcHJpbnRmX3RodW5rKHN0ZGRlYiwiCW1hZ2ljID0gJWMlYyVjJWNcbiIsCisJZHByaW50Zl9pbmZvKHRodW5rLCIJbWFnaWMgPSAlYyVjJWMlY1xuIiwKIAkJdGhzLT5tYWdpY1swXSwKIAkJdGhzLT5tYWdpY1sxXSwKIAkJdGhzLT5tYWdpY1syXSwKIAkJdGhzLT5tYWdpY1szXQogCSk7Ci0JZHByaW50Zl90aHVuayhzdGRkZWIsIglsZW5ndGggPSAlbHhcbiIsdGhzLT5sZW5ndGgpOworCWRwcmludGZfaW5mbyh0aHVuaywiCWxlbmd0aCA9ICVseFxuIix0aHMtPmxlbmd0aCk7CiAJaWYgKGxzdHJuY21wMzJBKHRocy0+bWFnaWMsIlNMMDEiLDQpJiZsc3RybmNtcDMyQSh0aHMtPm1hZ2ljLCJMUzAxIiw0KSkKIAkJcmV0dXJuIDA7CiAJaG1tPUxvYWRNb2R1bGUxNihtb2R1bGUxNixOVUxMKTsKQEAgLTEzMCw3ICsxMzAsNyBAQAogCQkJcmV0dXJuIDA7CiAJCXRocy0+eDBDID0gKERXT1JEKXRoczE2OwogCi0JCWRwcmludGZfdGh1bmsoc3RkZGViLCIJdGhzMTYgbWFnaWMgaXMgMHglMDhseFxuIiwqKERXT1JEKil0aHMxNi0+bWFnaWMpOworCQlkcHJpbnRmX2luZm8odGh1bmssIgl0aHMxNiBtYWdpYyBpcyAweCUwOGx4XG4iLCooRFdPUkQqKXRoczE2LT5tYWdpYyk7CiAJCWlmICgqKChEV09SRCopdGhzMTYtPm1hZ2ljKSAhPSAweDAwMDAzMDRDKQogCQkJcmV0dXJuIDA7CiAJCWlmICghKihXT1JEKikoKChMUEJZVEUpdGhzMTYpKzB4MTIpKQpAQCAtMTg3LDkgKzE4Nyw5IEBACiBEV09SRCBXSU5BUEkgV09XQ2FsbGJhY2sxNihGQVJQUk9DMTYgZnByb2MsRFdPUkQgYXJnKQogewogCURXT1JECXJldDsKLQlkcHJpbnRmX3RodW5rKHN0ZGRlYiwiV09XQ2FsbGJhY2sxNiglcCwweCUwOGx4KSAiLGZwcm9jLGFyZyk7CisJZHByaW50Zl9pbmZvKHRodW5rLCJXT1dDYWxsYmFjazE2KCVwLDB4JTA4bHgpLi4uXG4iLGZwcm9jLGFyZyk7CiAJcmV0ID0gIENhbGxiYWNrcy0+Q2FsbFdPV0NhbGxiYWNrUHJvYyhmcHJvYyxhcmcpOwotCWRwcmludGZfdGh1bmsoc3RkZGViLCIuLi4gcmV0dXJucyAlbGRcbiIscmV0KTsKKwlkcHJpbnRmX2luZm8odGh1bmssIi4uLiByZXR1cm5zICVsZFxuIixyZXQpOwogCXJldHVybiByZXQ7CiB9CiAKQEAgLTIxMiw3ICsyMTIsNyBAQAogewogCUhNT0RVTEUzMglobW9kID0gTG9hZExpYnJhcnkxNigic3lzdGh1bmsuZGxsIik7CiAKLQlkcHJpbnRmX3RodW5rKHN0ZGRlYiwgIl9LRVJORUwzMl81Mjogc3lzdGh1bmsuZGxsIG1vZHVsZSAlZFxuIiwgaG1vZCk7CisJZHByaW50Zl9pbmZvKHRodW5rLCAiX0tFUk5FTDMyXzUyOiBzeXN0aHVuay5kbGwgbW9kdWxlICVkXG4iLCBobW9kKTsKIAkKIAlpZiAoaG1vZDw9MzIpCiAJCXJldHVybiAwOwpAQCAtMjU2LDcgKzI1Niw3IEBACiAJCXJldHVybiAwOwogCSooRFdPUkQqKXRodW5rID0gYWRkclsxXTsKIAotCWRwcmludGZfdGh1bmsoc3RkZGViLCAiX0tFUk5FTDMyXzQzOiBsb2FkZWQgbW9kdWxlICVkLCBmdW5jICVzICglZCkgQCAlcCAoJXApLCByZXR1cm5pbmcgJXBcbiIsCisJZHByaW50Zl9pbmZvKHRodW5rLCAiX0tFUk5FTDMyXzQzOiBsb2FkZWQgbW9kdWxlICVkLCBmdW5jICVzICglZCkgQCAlcCAoJXApLCByZXR1cm5pbmcgJXBcbiIsCiAJCSAgICAgIGhtb2QsIEhJV09SRCh0aGtidWYpPT0wID8gIjxvcmRpbmFsPiIgOiB0aGtidWYsIChpbnQpdGhrYnVmLCAodm9pZCopc2VnYWRkciwgYWRkciwgKHZvaWQqKWFkZHJbMV0pOwogCiAJcmV0dXJuIGFkZHJbMV07CkBAIC0yNzcsMTEgKzI3NywxMSBAQAogICAgICAgICBEV09SRCByZXQsc3RhY2tzaXplOwogCVRIREIgKnRoZGIgPSBUSFJFQURfQ3VycmVudCgpOwogCi0JZHByaW50Zl90aHVuayhzdGRkZWIsIktFUk5FTDMyXzQ1KCUlZWF4PTB4JTA4bHgoJSVjeD0weCUwNGx4LCUlZWR4PTB4JTA4bHgpKVxuIiwKKwlkcHJpbnRmX2luZm8odGh1bmssIktFUk5FTDMyXzQ1KCUlZWF4PTB4JTA4bHgoJSVjeD0weCUwNGx4LCUlZWR4PTB4JTA4bHgpKVxuIiwKIAkJKERXT1JEKUVBWF9yZWcoY29udGV4dCksKERXT1JEKUNYX3JlZyhjb250ZXh0KSwoRFdPUkQpRURYX3JlZyhjb250ZXh0KQogCSk7CiAJc3RhY2tzaXplID0gRUJQX3JlZyhjb250ZXh0KS1FU1BfcmVnKGNvbnRleHQpOwotCWRwcmludGZfdGh1bmsoc3RkZGViLCIJc3RhY2tzaXplID0gJWxkXG4iLHN0YWNrc2l6ZSk7CisJZHByaW50Zl9pbmZvKHRodW5rLCIJc3RhY2tzaXplID0gJWxkXG4iLHN0YWNrc2l6ZSk7CiAKIAltZW1jcHkoJmNvbnRleHQxNixjb250ZXh0LHNpemVvZihjb250ZXh0MTYpKTsKIApAQCAtMjk0LDcgKzI5NCw3IEBACiAJcmV0ID0gQ2FsbGJhY2tzLT5DYWxsUmVnaXN0ZXJMb25nUHJvYygmY29udGV4dDE2LDApOwogCVNUQUNLMTZfUE9QKCB0aGRiLCBzdGFja3NpemUgKTsKIAotCWRwcmludGZfdGh1bmsoc3RkZGViLCIuIHJldHVybmVkICUwOGx4XG4iLHJldCk7CisJZHByaW50Zl9pbmZvKHRodW5rLCIuIHJldHVybmVkICUwOGx4XG4iLHJldCk7CiAJRUFYX3JlZyhjb250ZXh0KSAJID0gcmV0OwogfQogCkBAIC0zMTIsMTIgKzMxMiwxMiBAQAogCURXT1JECXJldCxzdGFja3NpemU7CiAJVEhEQiAqdGhkYiA9IFRIUkVBRF9DdXJyZW50KCk7CiAKLQlkcHJpbnRmX3RodW5rKHN0ZGRlYiwiX0tFUk5FTDMyXzQwKEVEWD0weCUwOGx4KVxuIiwKKwlkcHJpbnRmX2luZm8odGh1bmssIl9LRVJORUwzMl80MChFRFg9MHglMDhseClcbiIsCiAJCUVEWF9yZWcoY29udGV4dCkKIAkpOwogCXN0YWNrc2l6ZSA9IEVCUF9yZWcoY29udGV4dCktRVNQX3JlZyhjb250ZXh0KTsKLQlkcHJpbnRmX3RodW5rKHN0ZGRlYiwiCXN0YWNrc2l6ZSA9ICVsZFxuIixzdGFja3NpemUpOwotCWRwcmludGZfdGh1bmsoc3RkZGViLCJvbiB0b3Agb2Ygc3RhY2s6IDB4JTA0eFxuIiwqKFdPUkQqKUVTUF9yZWcoY29udGV4dCkpOworCWRwcmludGZfaW5mbyh0aHVuaywiCXN0YWNrc2l6ZSA9ICVsZFxuIixzdGFja3NpemUpOworCWRwcmludGZfaW5mbyh0aHVuaywib24gdG9wIG9mIHN0YWNrOiAweCUwNHhcbiIsKihXT1JEKilFU1BfcmVnKGNvbnRleHQpKTsKIAogCW1lbWNweSgmY29udGV4dDE2LGNvbnRleHQsc2l6ZW9mKGNvbnRleHQxNikpOwogCkBAIC0zMjksNyArMzI5LDcgQEAKIAlyZXQgPSBDYWxsYmFja3MtPkNhbGxSZWdpc3RlclNob3J0UHJvYygmY29udGV4dDE2LDApOwogCVNUQUNLMTZfUE9QKCB0aGRiLCBzdGFja3NpemUgKTsKIAotCWRwcmludGZfdGh1bmsoc3RkZGViLCIuIHJldHVybmVkICUwOGx4XG4iLHJldCk7CisJZHByaW50Zl9pbmZvKHRodW5rLCIuIHJldHVybmVkICUwOGx4XG4iLHJldCk7CiAJRUFYX3JlZyhjb250ZXh0KSAJID0gcmV0OwogfQogCkBAIC00MDQsNyArNDA0LDcgQEAKIAlpZiAoSElXT1JEKGFkZHIyKSkKIAkJKihEV09SRCopdGh1bmsgPSAoRFdPUkQpYWRkcjI7CiAKLQlkcHJpbnRmX3RodW5rKHN0ZGRlYiwgIl9LRVJORUwzMl80MTogbG9hZGVkIG1vZHVsZSAlZCwgZnVuYyAlcyglZCkgQCAlcCAoJXApLCByZXR1cm5pbmcgJXBcbiIsCisJZHByaW50Zl9pbmZvKHRodW5rLCAiX0tFUk5FTDMyXzQxOiBsb2FkZWQgbW9kdWxlICVkLCBmdW5jICVzKCVkKSBAICVwICglcCksIHJldHVybmluZyAlcFxuIiwKIAkJICAgICAgaG1vZCwgSElXT1JEKHRoa2J1Zik9PTAgPyAiPG9yZGluYWw+IiA6IHRoa2J1ZiwgKGludCl0aGtidWYsICh2b2lkKilzZWdhZGRyLCBhZGRyLCBhZGRyMik7CiAKIAlyZXR1cm4gYWRkcjI7CkBAIC00MTksNyArNDE5LDcgQEAKICAqLwogVk9JRCBXSU5BUEkgX0tFUk5FTDMyXzkwKENPTlRFWFQgKmNvbnRleHQpCiB7Ci0JZHByaW50Zl90aHVuayhzdGRkZWIsICJfS0VSTkVMMzJfOTA6IFFUIFRodW5rIHByaW1pbmc7IGNvbnRleHQgJXBcbiIsIGNvbnRleHQpOworCWRwcmludGZfaW5mbyh0aHVuaywgIl9LRVJORUwzMl85MDogUVQgVGh1bmsgcHJpbWluZzsgY29udGV4dCAlcFxuIiwgY29udGV4dCk7CiAJCiAJX3dyaXRlX3F0dGh1bmsoKExQQllURSlFQVhfcmVnKGNvbnRleHQpLCooRFdPUkQqKShFQVhfcmVnKGNvbnRleHQpK0VEWF9yZWcoY29udGV4dCkpKTsKIAkvKiB3ZSBqdXN0IGNhbGwgdGhlIHJlYWwgUVRfVGh1bmsgcmlnaHQgbm93IApAQCAtNDYxLDcgKzQ2MSw3IEBACiAJfQogCSooRFdPUkQqKVBUUl9TRUdfVE9fTElOKGFkZHJbMV0pID0gKERXT1JEKXRodW5rOwogCi0JZHByaW50Zl90aHVuayhzdGRkZWIsICJfS0VSTkVMMzJfNDY6IGxvYWRlZCBtb2R1bGUgJWQsIGZ1bmMgJXMoJWQpIEAgJXAgKCVwKVxuIiwKKwlkcHJpbnRmX2luZm8odGh1bmssICJfS0VSTkVMMzJfNDY6IGxvYWRlZCBtb2R1bGUgJWQsIGZ1bmMgJXMoJWQpIEAgJXAgKCVwKVxuIiwKIAkJICAgICAgaG1vZCwgSElXT1JEKHRoa2J1Zik9PTAgPyAiPG9yZGluYWw+IiA6IHRoa2J1ZiwgKGludCl0aGtidWYsICh2b2lkKilzZWdhZGRyLCBhZGRyKTsKIH0KIApAQCAtNDczLDcgKzQ3Myw3IEBACiAgKi8KIEJPT0wzMiBXSU5BUEkgX0tFUk5FTDMyXzg3KCkKIHsKLSAgICBkcHJpbnRmX3RodW5rKHN0ZGRlYiwgIl9LRVJORUwzMl84NzogWWVzLCB0aHVua2luZyBpcyBpbml0aWFsaXplZFxuIik7CisgICAgZHByaW50Zl9pbmZvKHRodW5rLCAiX0tFUk5FTDMyXzg3OiBZZXMsIHRodW5raW5nIGlzIGluaXRpYWxpemVkXG4iKTsKICAgICByZXR1cm4gVFJVRTsKIH0KIApAQCAtNDkwLDkgKzQ5MCwxMyBAQAogICAgIERXT1JEIGkscmV0OwogICAgIERXT1JEICphcmdzID0gKChEV09SRCAqKSZmdW4pICsgMTsKIAotICAgIGRwcmludGZfdGh1bmsoc3RkZGViLCJLRVJORUwzMl84OCglbGQsMHglMDhseCwlcCxbICIsbnIsZmxhZ3MsZnVuKTsKLSAgICBmb3IgKGk9MDtpPG5yLzQ7aSsrKSB7IGRwcmludGZfdGh1bmsoc3RkZGViLCIweCUwOGx4LCIsYXJnc1tpXSk7IH0KLSAgICBkcHJpbnRmX3RodW5rKHN0ZGRlYiwiXSlcbiIpOworICAgIGlmKGRlYnVnZ2luZ19pbmZvKHRodW5rKSl7CisgICAgICBkYmdfZGVjbF9zdHIodGh1bmssIDI1Nik7CisgICAgICBmb3IgKGk9MDtpPG5yLzQ7aSsrKSAKKwlkc3ByaW50Zih0aHVuaywiMHglMDhseCwiLGFyZ3NbaV0pOworICAgICAgZHByaW50Zl9pbmZvKHRodW5rLCJLRVJORUwzMl84OCglbGQsMHglMDhseCwlcCxbJXNdKVxuIiwKKwkJICAgIG5yLGZsYWdzLGZ1bixkYmdfc3RyKHRodW5rKSk7CisgICAgfQogICAgIHN3aXRjaCAobnIpIHsKICAgICBjYXNlIDA6CXJldCA9IGZ1bigpOwogCQlicmVhazsKQEAgLTUyNiw3ICs1MzAsNyBAQAogCWJyZWFrOwogCiAgICAgfQotICAgIGRwcmludGZfdGh1bmsoc3RkZGViLCIgcmV0dXJuaW5nICVsZCAuLi5cbiIscmV0KTsKKyAgICBkcHJpbnRmX2luZm8odGh1bmssIiByZXR1cm5pbmcgJWxkIC4uLlxuIixyZXQpOwogICAgIHJldHVybiByZXQ7CiB9CiAKQEAgLTYyNCw2ICs2MjgsMTUgQEAKIH0KIAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIAkJS0VSTkVMXzQ3MQkJKEtFUk5FTCkKKyAqIFNlZW1zIHRvIHJldHVybiB0aGUgdW5jcnlwdGVkIGN1cnJlbnQgcHJvY2VzcyBwb2ludGVyLiBbTm90IDEwMCUgc3VyZV0uCisgKi8KK0xQVk9JRCBXSU5BUEkKK19LRVJORUxfNDcxKCkgeworCXJldHVybiBQUk9DRVNTX0N1cnJlbnQoKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICAqIAkJS0VSTkVMXzQ3MgkJKEtFUk5FTCkKICAqIHNvbWV0aGluZyBsaWtlIEdldEN1cnJlbnRoSW5zdGFuY2UuCiAgKi8KZGlmZiAtLWdpdCBhL3dpbjMyL25ld2Zucy5jIGIvd2luMzIvbmV3Zm5zLmMKaW5kZXggYmM0MGU0OS4uZmQzZTY0NiAxMDA2NDQKLS0tIGEvd2luMzIvbmV3Zm5zLmMKKysrIGIvd2luMzIvbmV3Zm5zLmMKQEAgLTEzLDcgKzEzLDYgQEAKICNpbmNsdWRlICJ3aW5kb3dzLmgiCiAjaW5jbHVkZSAid2lubnQuaCIKICNpbmNsdWRlICJ3aW5lcnJvci5oIgotI2luY2x1ZGUgInN0ZGRlYnVnLmgiCiAjaW5jbHVkZSAiZGVidWcuaCIKIAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKQEAgLTkxLDMgKzkwLDExIEBACiAJcmV0dXJuIEZBTFNFOwogCiB9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgkJRmx1c2hJbnN0cnVjdGlvbkNhY2hlIChLRVJORUwzMi4yNjEpCisgKi8KK0JPT0wzMiBXSU5BUEkgRmx1c2hJbnN0cnVjdGlvbkNhY2hlKERXT1JEIHgsRFdPUkQgeSxEV09SRCB6KSB7CisJZnByaW50ZihzdGRlcnIsIkZsdXNoSW5zdHJ1Y3Rpb25DYWNoZSgweCUwOGx4LDB4JTA4bHgsMHglMDhseClcbiIseCx5LHopOworCXJldHVybiBUUlVFOworfQpkaWZmIC0tZ2l0IGEvd2luMzIvb3JkaW5hbHMuYyBiL3dpbjMyL29yZGluYWxzLmMKaW5kZXggYTI3ZmRkNS4uNmFjMTU1YiAxMDA2NDQKLS0tIGEvd2luMzIvb3JkaW5hbHMuYworKysgYi93aW4zMi9vcmRpbmFscy5jCkBAIC0xNSw5ICsxNSw5IEBACiAjaW5jbHVkZSAibW9kdWxlLmgiCiAjaW5jbHVkZSAiY2FsbGJhY2suaCIKICNpbmNsdWRlICJkZWJ1Zy5oIgotI2luY2x1ZGUgInN0ZGRlYnVnLmgiCiAKIHN0YXRpYyBDUklUSUNBTF9TRUNUSU9OIFdpbjE2TXV0ZXg7CitzdGF0aWMgU0VHUFRSIHNlZ1dpbjE2TXV0ZXggPSBOVUxMOwogCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICAqICAgICAgICAgICBHZXRQV2luTG9jayAgICAoS0VSTkVMMzIpCkBAIC0xMzIsMyArMTMyLDE5IEBACiAJZnByaW50ZihzdGRlcnIsIktFUk5FTDMyXzk4KDB4JTA4bHgpLHN0dWJcbiIseCk7CiAJcmV0dXJuIDE7CiB9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCQlLRVJORUxfNDQ5CQkoS0VSTkVMLjQ0OSkKKyAqIFRoaXMgcmV0dXJucyBhIHNlZ21lbnRlZCBzdGF0aWMgcG9pbnRlciB0byBhIGxpbmVhciBwb2ludGVyIHRvIGEgY3JpdGljYWwKKyAqIHNlY3Rpb24gaW4ga2VybmVsMzIgYWRkcmVzcyBzcGFjZS4gVGhpcyBpcyBtb3N0IGxpa2VseSB0aGUgV2luMTYgTG9jaywKKyAqIGJ1dCBJIGFtIG5vdCBzdXJlLgorICovCitTRUdQVFIgV0lOQVBJIEtFUk5FTF80NDkodm9pZCkgeyAKKwlpZiAoIXNlZ1dpbjE2TXV0ZXgpIHsKKwkJTFBEV09SRAl3MTZtID0gU0VHUFRSX0FMTE9DKDQpOworCQkKKwkJKncxNm0gPSAoRFdPUkQpJldpbjE2TXV0ZXg7CisJCXNlZ1dpbjE2TXV0ZXggPSBTRUdQVFJfR0VUKHcxNm0pOworCX0KKwlyZXR1cm4gc2VnV2luMTZNdXRleDsKK30KZGlmZiAtLWdpdCBhL3dpbjMyL3Byb2Nlc3MuYyBiL3dpbjMyL3Byb2Nlc3MuYwppbmRleCA0NTk4ODNmLi5jNDU3MWFiIDEwMDY0NAotLS0gYS93aW4zMi9wcm9jZXNzLmMKKysrIGIvd2luMzIvcHJvY2Vzcy5jCkBAIC0xNSw3ICsxNSw2IEBACiAjaW5jbHVkZSAicHJvY2Vzcy5oIgogI2luY2x1ZGUgInBlX2ltYWdlLmgiCiAjaW5jbHVkZSAiZmlsZS5oIgotI2luY2x1ZGUgInN0ZGRlYnVnLmgiCiAjaW5jbHVkZSAiZGVidWcuaCIKIAogCkBAIC01MSw3ICs1MCw3IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFBEV09SRCBscFByb2Nlc3NBZmZpbml0eU1hc2ssCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFBEV09SRCBscFN5c3RlbUFmZmluaXR5TWFzaykKIHsKLQlkcHJpbnRmX3Rhc2soc3RkZGViLCJHZXRQcm9jZXNzQWZmaW5pdHlNYXNrKCV4LCVseCwlbHgpXG4iLAorCWRwcmludGZfaW5mbyh0YXNrLCJHZXRQcm9jZXNzQWZmaW5pdHlNYXNrKCV4LCVseCwlbHgpXG4iLAogCQloUHJvY2VzcywobHBQcm9jZXNzQWZmaW5pdHlNYXNrPypscFByb2Nlc3NBZmZpbml0eU1hc2s6MCksCiAJCShscFN5c3RlbUFmZmluaXR5TWFzaz8qbHBTeXN0ZW1BZmZpbml0eU1hc2s6MCkpOwogCS8qIEl0IGlzIGRlZmluaXRlbHkgaW1wb3J0YW50IGZvciBhIHByb2Nlc3MgdG8ga25vdyBvbiB3aGF0IHByb2Nlc3NvcgpkaWZmIC0tZ2l0IGEvd2luMzIvc2VjdXJpdHkuYyBiL3dpbjMyL3NlY3VyaXR5LmMKaW5kZXggNjUxNmViNy4uOTFmYzZjMCAxMDA2NDQKLS0tIGEvd2luMzIvc2VjdXJpdHkuYworKysgYi93aW4zMi9zZWN1cml0eS5jCkBAIC01LDcgKzUsNiBAQAogI2luY2x1ZGUgIndpbmRvd3MuaCIKICNpbmNsdWRlICJ3aW5lcnJvci5oIgogI2luY2x1ZGUgIm50ZGxsLmgiCi0jaW5jbHVkZSAic3RkZGVidWcuaCIKICNpbmNsdWRlICJkZWJ1Zy5oIgogCiBCT09MMzIgV0lOQVBJIElzVmFsaWRTaWQgKExQU0lEIHBTaWQpOwpkaWZmIC0tZ2l0IGEvd2luMzIvc3RydWN0MzIuYyBiL3dpbjMyL3N0cnVjdDMyLmMKaW5kZXggZjA2MzFlMC4uMTliN2EzNiAxMDA2NDQKLS0tIGEvd2luMzIvc3RydWN0MzIuYworKysgYi93aW4zMi9zdHJ1Y3QzMi5jCkBAIC04LDcgKzgsNiBAQAogI2luY2x1ZGUgIndpbmRvd3MuaCIKICNpbmNsdWRlICJ3aW5lcnJvci5oIgogI2luY2x1ZGUgInN0cnVjdDMyLmgiCi0jaW5jbHVkZSAic3RkZGVidWcuaCIKICNpbmNsdWRlICJkZWJ1Zy5oIgogCiB2b2lkIFNUUlVDVDMyX01TRzE2dG8zMihjb25zdCBNU0cxNiAqbXNnMTYsTVNHMzIgKm1zZzMyKQpkaWZmIC0tZ2l0IGEvd2luMzIvdGhyZWFkLmMgYi93aW4zMi90aHJlYWQuYwppbmRleCA3YWQ2NTg1Li5lM2Q4ZTcxIDEwMDY0NAotLS0gYS93aW4zMi90aHJlYWQuYworKysgYi93aW4zMi90aHJlYWQuYwpAQCAtMTEsNyArMTEsNiBAQAogI2luY2x1ZGUgIndpbmRvd3MuaCIKICNpbmNsdWRlICJ3aW5iYXNlLmgiCiAjaW5jbHVkZSAid2luZXJyb3IuaCIKLSNpbmNsdWRlICJzdGRkZWJ1Zy5oIgogI2luY2x1ZGUgImRlYnVnLmgiCiAKIApkaWZmIC0tZ2l0IGEvd2luMzIvdGltZS5jIGIvd2luMzIvdGltZS5jCmluZGV4IDY3YzNjYjUuLjMzM2FiN2YgMTAwNjQ0Ci0tLSBhL3dpbjMyL3RpbWUuYworKysgYi93aW4zMi90aW1lLmMKQEAgLTEwLDcgKzEwLDYgQEAKICNpbmNsdWRlIDx1bmlzdGQuaD4KICNpbmNsdWRlICJ3aW5kb3dzLmgiCiAjaW5jbHVkZSAid2luZXJyb3IuaCIKLSNpbmNsdWRlICJzdGRkZWJ1Zy5oIgogI2luY2x1ZGUgImRlYnVnLmgiCiAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgpkaWZmIC0tZ2l0IGEvd2luMzIvdXNlcjMyLmMgYi93aW4zMi91c2VyMzIuYwppbmRleCBkYWViOGM5Li44NmVlMzdmIDEwMDY0NAotLS0gYS93aW4zMi91c2VyMzIuYworKysgYi93aW4zMi91c2VyMzIuYwpAQCAtMTYsNyArMTYsNiBAQAogI2luY2x1ZGUgInN0cnVjdDMyLmgiCiAjaW5jbHVkZSAid2luLmgiCiAjaW5jbHVkZSAiZGVidWcuaCIKLSNpbmNsdWRlICJzdGRkZWJ1Zy5oIgogCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICAqICAgICAgICAgIEdldE1lc3NhZ2UzMkEgICAoVVNFUjMyLjI2OSkKZGlmZiAtLWdpdCBhL3dpbmRvd3MvY2FyZXQuYyBiL3dpbmRvd3MvY2FyZXQuYwppbmRleCAzMTVjZTcyLi41MGUzMjZiIDEwMDY0NAotLS0gYS93aW5kb3dzL2NhcmV0LmMKKysrIGIvd2luZG93cy9jYXJldC5jCkBAIC03LDggKzcsNiBAQAogCiAjaW5jbHVkZSAid2luZG93cy5oIgogI2luY2x1ZGUgIm1vZHVsZS5oIgotI2luY2x1ZGUgInN0ZGRlYnVnLmgiCi0vKiAjZGVmaW5lIERFQlVHX0NBUkVUICovCiAjaW5jbHVkZSAiZGVidWcuaCIKIAogdHlwZWRlZiBzdHJ1Y3QKQEAgLTc5LDcgKzc3LDcgQEAKICAqLwogc3RhdGljIFZPSUQgQ0FSRVRfQ2FsbGJhY2soIEhXTkQzMiBod25kLCBVSU5UMzIgbXNnLCBVSU5UMzIgaWQsIERXT1JEIGN0aW1lKQogewotICAgIGRwcmludGZfY2FyZXQoc3RkZGViLCJDQVJFVF9DYWxsYmFjazogaHduZD0lMDR4LCB0aW1lcmlkPSVkLCBjYXJldD0lZFxuIiwKKyAgICBkcHJpbnRmX2luZm8oY2FyZXQsIkNBUkVUX0NhbGxiYWNrOiBod25kPSUwNHgsIHRpbWVyaWQ9JWQsIGNhcmV0PSVkXG4iLAogICAgICAgICAgICAgICAgICAgaHduZCwgaWQsIENhcmV0Lm9uKTsKICAgICBDQVJFVF9EaXNwbGF5Q2FyZXQoQ0FSRVRfVE9HR0xFKTsKIH0KQEAgLTEzOCw3ICsxMzYsNyBAQAogQk9PTDMyIFdJTkFQSSBDcmVhdGVDYXJldDMyKCBIV05EMzIgaHduZCwgSEJJVE1BUDMyIGJpdG1hcCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSU5UMzIgd2lkdGgsIElOVDMyIGhlaWdodCApCiB7Ci0gICAgZHByaW50Zl9jYXJldChzdGRkZWIsIkNyZWF0ZUNhcmV0OiBod25kPSUwNHhcbiIsIGh3bmQpOworICAgIGRwcmludGZfaW5mbyhjYXJldCwiQ3JlYXRlQ2FyZXQ6IGh3bmQ9JTA0eFxuIiwgaHduZCk7CiAKICAgICBpZiAoIWh3bmQpIHJldHVybiBGQUxTRTsKIApAQCAtMTkwLDcgKzE4OCw3IEBACiB7CiAgICAgaWYgKCFDYXJldC5od25kKSByZXR1cm4gRkFMU0U7CiAKLSAgICBkcHJpbnRmX2NhcmV0KHN0ZGRlYiwiRGVzdHJveUNhcmV0OiBod25kPSUwNHgsIHRpbWVyaWQ9JWRcbiIsCisgICAgZHByaW50Zl9pbmZvKGNhcmV0LCJEZXN0cm95Q2FyZXQ6IGh3bmQ9JTA0eCwgdGltZXJpZD0lZFxuIiwKIAkJQ2FyZXQuaHduZCwgQ2FyZXQudGltZXJpZCk7CiAKICAgICBDQVJFVF9LaWxsVGltZXIoKTsKQEAgLTIxOCw3ICsyMTYsNyBAQAogICAgIGlmICghQ2FyZXQuaHduZCkgcmV0dXJuIEZBTFNFOwogICAgIGlmICgoeCA9PSBDYXJldC54KSAmJiAoeSA9PSBDYXJldC55KSkgcmV0dXJuIFRSVUU7CiAKLSAgICBkcHJpbnRmX2NhcmV0KHN0ZGRlYiwiU2V0Q2FyZXRQb3M6IHg9JWQsIHk9JWRcbiIsIHgsIHkpOworICAgIGRwcmludGZfaW5mbyhjYXJldCwiU2V0Q2FyZXRQb3M6IHg9JWQsIHk9JWRcbiIsIHgsIHkpOwogCiAgICAgQ0FSRVRfS2lsbFRpbWVyKCk7CiAgICAgQ0FSRVRfRGlzcGxheUNhcmV0KENBUkVUX09GRik7CkBAIC0yNTAsNyArMjQ4LDcgQEAKICAgICBpZiAoIUNhcmV0Lmh3bmQpIHJldHVybiBGQUxTRTsKICAgICBpZiAoaHduZCAmJiAoQ2FyZXQuaHduZCAhPSBod25kKSkgcmV0dXJuIEZBTFNFOwogCi0gICAgZHByaW50Zl9jYXJldChzdGRkZWIsIkhpZGVDYXJldDogaHduZD0lMDR4LCBoaWRkZW49JWRcbiIsCisgICAgZHByaW50Zl9pbmZvKGNhcmV0LCJIaWRlQ2FyZXQ6IGh3bmQ9JTA0eCwgaGlkZGVuPSVkXG4iLAogICAgICAgICAgICAgICAgICAgaHduZCwgQ2FyZXQuaGlkZGVuKTsKIAogICAgIENBUkVUX0tpbGxUaW1lcigpOwpAQCAtMjc3LDcgKzI3NSw3IEBACiAgICAgaWYgKCFDYXJldC5od25kKSByZXR1cm4gRkFMU0U7CiAgICAgaWYgKGh3bmQgJiYgKENhcmV0Lmh3bmQgIT0gaHduZCkpIHJldHVybiBGQUxTRTsKIAotICAgIGRwcmludGZfY2FyZXQoc3RkZGViLCJTaG93Q2FyZXQ6IGh3bmQ9JTA0eCwgaGlkZGVuPSVkXG4iLAorICAgIGRwcmludGZfaW5mbyhjYXJldCwiU2hvd0NhcmV0OiBod25kPSUwNHgsIGhpZGRlbj0lZFxuIiwKIAkJaHduZCwgQ2FyZXQuaGlkZGVuKTsKIAogICAgIGlmIChDYXJldC5oaWRkZW4pCkBAIC0zMDgsNyArMzA2LDcgQEAKIHsKICAgICBpZiAoIUNhcmV0Lmh3bmQpIHJldHVybiBGQUxTRTsKIAotICAgIGRwcmludGZfY2FyZXQoc3RkZGViLCJTZXRDYXJldEJsaW5rVGltZTogaHduZD0lMDR4LCBtc2Vjcz0lZFxuIiwKKyAgICBkcHJpbnRmX2luZm8oY2FyZXQsIlNldENhcmV0QmxpbmtUaW1lOiBod25kPSUwNHgsIG1zZWNzPSVkXG4iLAogCQlDYXJldC5od25kLCBtc2Vjcyk7CiAKICAgICBDYXJldC50aW1lb3V0ID0gbXNlY3M7CkBAIC0zNDIsNyArMzQwLDcgQEAKIHsKICAgICBpZiAoIUNhcmV0Lmh3bmQgfHwgIXB0KSByZXR1cm47CiAKLSAgICBkcHJpbnRmX2NhcmV0KHN0ZGRlYiwiR2V0Q2FyZXRQb3M6IGh3bmQ9JTA0eCwgcHQ9JXAsIHg9JWQsIHk9JWRcbiIsCisgICAgZHByaW50Zl9pbmZvKGNhcmV0LCJHZXRDYXJldFBvczogaHduZD0lMDR4LCBwdD0lcCwgeD0lZCwgeT0lZFxuIiwKICAgICAgICAgICAgICAgICAgIENhcmV0Lmh3bmQsIHB0LCBDYXJldC54LCBDYXJldC55KTsKICAgICBwdC0+eCA9IChJTlQxNilDYXJldC54OwogICAgIHB0LT55ID0gKElOVDE2KUNhcmV0Lnk7CmRpZmYgLS1naXQgYS93aW5kb3dzL2NsYXNzLmMgYi93aW5kb3dzL2NsYXNzLmMKaW5kZXggY2EzNDlmMC4uZjkzNTVjOCAxMDA2NDQKLS0tIGEvd2luZG93cy9jbGFzcy5jCisrKyBiL3dpbmRvd3MvY2xhc3MuYwpAQCAtMTksNyArMTksNiBAQAogI2luY2x1ZGUgImxkdC5oIgogI2luY2x1ZGUgInRvb2xoZWxwLmgiCiAjaW5jbHVkZSAid2lucHJvYy5oIgotI2luY2x1ZGUgInN0ZGRlYnVnLmgiCiAjaW5jbHVkZSAiZGVidWcuaCIKIAogCkBAIC0zMTgsNyArMzE3LDcgQEAKICAgICAgICAgcmV0dXJuIDA7CiAgICAgfQogCi0gICAgZHByaW50Zl9jbGFzcyggc3RkZGViLCAiUmVnaXN0ZXJDbGFzczE2OiBhdG9tPSUwNHggd25kcHJvYz0lMDhseCBoaW5zdD0lMDR4CisgICAgZHByaW50Zl9pbmZvKGNsYXNzLCAiUmVnaXN0ZXJDbGFzczE2OiBhdG9tPSUwNHggd25kcHJvYz0lMDhseCBoaW5zdD0lMDR4CiBiZz0lMDR4IHN0eWxlPSUwOHggY2xzRXh0PSVkIHdpbkV4dD0lZCBjbGFzcz0lcCBuYW1lPSclcydcbiIsCiAgICAgICAgICAgICAgICAgICAgYXRvbSwgKERXT1JEKXdjLT5scGZuV25kUHJvYywgaEluc3RhbmNlLAogICAgICAgICAgICAgICAgICAgIHdjLT5oYnJCYWNrZ3JvdW5kLCB3Yy0+c3R5bGUsIHdjLT5jYkNsc0V4dHJhLApAQCAtMzU1LDcgKzM1NCw3IEBACiAgICAgICAgIHJldHVybiAwOwogICAgIH0KIAotICAgIGRwcmludGZfY2xhc3MoIHN0ZGRlYiwgIlJlZ2lzdGVyQ2xhc3MzMkE6IGF0b209JTA0eCB3bmRwcm9jPSUwOGx4CisgICAgZHByaW50Zl9pbmZvKGNsYXNzLCAiUmVnaXN0ZXJDbGFzczMyQTogYXRvbT0lMDR4IHduZHByb2M9JTA4bHgKIGhpbnN0PSUwNHggYmc9JTA0eCBzdHlsZT0lMDh4IGNsc0V4dD0lZCB3aW5FeHQ9JWQgY2xhc3M9JXAgbmFtZT0nJXMnXG4iLAogICAgICAgICAgICAgICAgICAgIGF0b20sIChEV09SRCl3Yy0+bHBmblduZFByb2MsIHdjLT5oSW5zdGFuY2UsCiAgICAgICAgICAgICAgICAgICAgd2MtPmhickJhY2tncm91bmQsIHdjLT5zdHlsZSwgd2MtPmNiQ2xzRXh0cmEsCkBAIC0zODksNyArMzg4LDcgQEAKICAgICAgICAgcmV0dXJuIDA7CiAgICAgfQogCi0gICAgZHByaW50Zl9jbGFzcyggc3RkZGViLCAiUmVnaXN0ZXJDbGFzczMyVzogYXRvbT0lMDR4IHduZHByb2M9JTA4bHggaGluc3Q9JTA0eCBiZz0lMDR4IHN0eWxlPSUwOHggY2xzRXh0PSVkIHdpbkV4dD0lZCBjbGFzcz0lcFxuIiwKKyAgICBkcHJpbnRmX2luZm8oY2xhc3MsICJSZWdpc3RlckNsYXNzMzJXOiBhdG9tPSUwNHggd25kcHJvYz0lMDhseCBoaW5zdD0lMDR4IGJnPSUwNHggc3R5bGU9JTA4eCBjbHNFeHQ9JWQgd2luRXh0PSVkIGNsYXNzPSVwXG4iLAogICAgICAgICAgICAgICAgICAgIGF0b20sIChEV09SRCl3Yy0+bHBmblduZFByb2MsIHdjLT5oSW5zdGFuY2UsCiAgICAgICAgICAgICAgICAgICAgd2MtPmhickJhY2tncm91bmQsIHdjLT5zdHlsZSwgd2MtPmNiQ2xzRXh0cmEsCiAgICAgICAgICAgICAgICAgICAgd2MtPmNiV25kRXh0cmEsIGNsYXNzUHRyICk7CkBAIC00MjEsNyArNDIwLDcgQEAKICAgICAgICAgcmV0dXJuIDA7CiAgICAgfQogCi0gICAgZHByaW50Zl9jbGFzcyggc3RkZGViLCAiUmVnaXN0ZXJDbGFzc0V4MTY6IGF0b209JTA0eCB3bmRwcm9jPSUwOGx4IGhpbnN0PSUwNHggYmc9JTA0eCBzdHlsZT0lMDh4IGNsc0V4dD0lZCB3aW5FeHQ9JWQgY2xhc3M9JXBcbiIsCisgICAgZHByaW50Zl9pbmZvKGNsYXNzLCAiUmVnaXN0ZXJDbGFzc0V4MTY6IGF0b209JTA0eCB3bmRwcm9jPSUwOGx4IGhpbnN0PSUwNHggYmc9JTA0eCBzdHlsZT0lMDh4IGNsc0V4dD0lZCB3aW5FeHQ9JWQgY2xhc3M9JXBcbiIsCiAgICAgICAgICAgICAgICAgICAgYXRvbSwgKERXT1JEKXdjLT5scGZuV25kUHJvYywgaEluc3RhbmNlLAogICAgICAgICAgICAgICAgICAgIHdjLT5oYnJCYWNrZ3JvdW5kLCB3Yy0+c3R5bGUsIHdjLT5jYkNsc0V4dHJhLAogICAgICAgICAgICAgICAgICAgIHdjLT5jYlduZEV4dHJhLCBjbGFzc1B0ciApOwpAQCAtNDU1LDcgKzQ1NCw3IEBACiAgICAgICAgIHJldHVybiAwOwogICAgIH0KIAotICAgIGRwcmludGZfY2xhc3MoIHN0ZGRlYiwgIlJlZ2lzdGVyQ2xhc3NFeDMyQTogYXRvbT0lMDR4IHduZHByb2M9JTA4bHggaGluc3Q9JTA0eCBiZz0lMDR4IHN0eWxlPSUwOHggY2xzRXh0PSVkIHdpbkV4dD0lZCBjbGFzcz0lcFxuIiwKKyAgICBkcHJpbnRmX2luZm8oY2xhc3MsICJSZWdpc3RlckNsYXNzRXgzMkE6IGF0b209JTA0eCB3bmRwcm9jPSUwOGx4IGhpbnN0PSUwNHggYmc9JTA0eCBzdHlsZT0lMDh4IGNsc0V4dD0lZCB3aW5FeHQ9JWQgY2xhc3M9JXBcbiIsCiAgICAgICAgICAgICAgICAgICAgYXRvbSwgKERXT1JEKXdjLT5scGZuV25kUHJvYywgd2MtPmhJbnN0YW5jZSwKICAgICAgICAgICAgICAgICAgICB3Yy0+aGJyQmFja2dyb3VuZCwgd2MtPnN0eWxlLCB3Yy0+Y2JDbHNFeHRyYSwKICAgICAgICAgICAgICAgICAgICB3Yy0+Y2JXbmRFeHRyYSwgY2xhc3NQdHIgKTsKQEAgLTQ4Nyw3ICs0ODYsNyBAQAogICAgICAgICByZXR1cm4gMDsKICAgICB9CiAKLSAgICBkcHJpbnRmX2NsYXNzKCBzdGRkZWIsICJSZWdpc3RlckNsYXNzRXgzMlc6IGF0b209JTA0eCB3bmRwcm9jPSUwOGx4IGhpbnN0PSUwNHggYmc9JTA0eCBzdHlsZT0lMDh4IGNsc0V4dD0lZCB3aW5FeHQ9JWQgY2xhc3M9JXBcbiIsCisgICAgZHByaW50Zl9pbmZvKGNsYXNzLCAiUmVnaXN0ZXJDbGFzc0V4MzJXOiBhdG9tPSUwNHggd25kcHJvYz0lMDhseCBoaW5zdD0lMDR4IGJnPSUwNHggc3R5bGU9JTA4eCBjbHNFeHQ9JWQgd2luRXh0PSVkIGNsYXNzPSVwXG4iLAogICAgICAgICAgICAgICAgICAgIGF0b20sIChEV09SRCl3Yy0+bHBmblduZFByb2MsIHdjLT5oSW5zdGFuY2UsCiAgICAgICAgICAgICAgICAgICAgd2MtPmhickJhY2tncm91bmQsIHdjLT5zdHlsZSwgd2MtPmNiQ2xzRXh0cmEsCiAgICAgICAgICAgICAgICAgICAgd2MtPmNiV25kRXh0cmEsIGNsYXNzUHRyICk7CmRpZmYgLS1naXQgYS93aW5kb3dzL2NsaXBib2FyZC5jIGIvd2luZG93cy9jbGlwYm9hcmQuYwppbmRleCBjYTk3ODM3Li4zOTNiZWQ1IDEwMDY0NAotLS0gYS93aW5kb3dzL2NsaXBib2FyZC5jCisrKyBiL3dpbmRvd3MvY2xpcGJvYXJkLmMKQEAgLTIxLDcgKzIxLDYgQEAKICNpbmNsdWRlICJtZXNzYWdlLmgiCiAjaW5jbHVkZSAiY2xpcGJvYXJkLmgiCiAjaW5jbHVkZSAieG1hbGxvYy5oIgotI2luY2x1ZGUgInN0ZGRlYnVnLmgiCiAjaW5jbHVkZSAiZGVidWcuaCIKIAogI2RlZmluZSAgQ0ZfUkVHRk9STUFUQkFTRSAJMHhDMDAwCkBAIC05Myw3ICs5Miw3IEBACiAgKi8KIHN0YXRpYyB2b2lkIENMSVBCT0FSRF9DaGVja1NlbGVjdGlvbihXTkQqIHBXbmQpCiB7Ci0gICAgZHByaW50Zl9jbGlwYm9hcmQoc3RkZGViLCJcdGNoZWNraW5nICUwOHhcbiIsICh1bnNpZ25lZClwV25kLT53aW5kb3cpOworICAgIGRwcmludGZfaW5mbyhjbGlwYm9hcmQsIlx0Y2hlY2tpbmcgJTA4eFxuIiwgKHVuc2lnbmVkKXBXbmQtPndpbmRvdyk7CiAKICAgICBpZiggc2VsZWN0aW9uQWNxdWlyZWQgJiYgc2VsZWN0aW9uV2luZG93ICE9IE5vbmUgJiYKICAgICAgICAgcFduZC0+d2luZG93ID09IHNlbGVjdGlvbldpbmRvdyApCkBAIC0xMDcsNyArMTA2LDcgQEAKICAgICAgICAgICAgICBpZiggcFduZC0+cGFyZW50LT5jaGlsZCAhPSBwV25kICkgCiAgICAgICAgICAgICAgICAgIHNlbGVjdGlvbldpbmRvdyA9IHBXbmQtPnBhcmVudC0+Y2hpbGQtPndpbmRvdzsKIAotCWRwcmludGZfY2xpcGJvYXJkKHN0ZGRlYiwiXHRzd2l0Y2hpbmcgc2VsZWN0aW9uIGZyb20gJTA4eCB0byAlMDh4XG4iLCAKKwlkcHJpbnRmX2luZm8oY2xpcGJvYXJkLCJcdHN3aXRjaGluZyBzZWxlY3Rpb24gZnJvbSAlMDh4IHRvICUwOHhcbiIsIAogICAgICAgICAgICAgICAgICAgICAodW5zaWduZWQpc2VsZWN0aW9uUHJldldpbmRvdywgKHVuc2lnbmVkKXNlbGVjdGlvbldpbmRvdyk7CiAKIAlpZiggc2VsZWN0aW9uV2luZG93ICE9IE5vbmUgKQpAQCAtMTQ3LDcgKzE0Niw3IEBACiB7CiAgICAgTFBDTElQRk9STUFUIGxwRm9ybWF0ID0gQ2xpcEZvcm1hdHM7CiAKLSAgICBkcHJpbnRmX2NsaXBib2FyZChzdGRkZWIsIkRpc093bjogY2xpcGJvYXJkIG93bmVyID0gJTA0eCwgc2VsZWN0aW9uID0gJTA4eFxuIiwgCisgICAgZHByaW50Zl9pbmZvKGNsaXBib2FyZCwiRGlzT3duOiBjbGlwYm9hcmQgb3duZXIgPSAlMDR4LCBzZWxlY3Rpb24gPSAlMDh4XG4iLCAKIAkJCQloV25kQ2xpcE93bmVyLCAodW5zaWduZWQpc2VsZWN0aW9uV2luZG93KTsKIAogICAgIGlmKCBwV25kLT5od25kU2VsZiA9PSBoV25kQ2xpcE93bmVyKQpAQCAtMTYwLDcgKzE1OSw3IEBACiAJewogCSAgICBpZiggbHBGb3JtYXQtPndEYXRhUHJlc2VudCAmJiAhbHBGb3JtYXQtPmhEYXRhICkKIAkgICAgewotCQlkcHJpbnRmX2NsaXBib2FyZCggc3RkZGViLCJcdGRhdGEgbWlzc2luZyBmb3IgY2xpcGJvYXJkIGZvcm1hdCAlaVxuIiwgCisJCWRwcmludGZfaW5mbyhjbGlwYm9hcmQsIlx0ZGF0YSBtaXNzaW5nIGZvciBjbGlwYm9hcmQgZm9ybWF0ICVpXG4iLCAKIAkJCQkgICBscEZvcm1hdC0+d0Zvcm1hdElEKTsgCiAJCWxwRm9ybWF0LT53RGF0YVByZXNlbnQgPSAwOwogCSAgICB9CkBAIC0yMDUsNyArMjA0LDcgQEAKIAogICAgIGlmKCAhaFduZCApIHJldHVybiBGQUxTRTsKIAotICAgIGRwcmludGZfY2xpcGJvYXJkKHN0ZGRlYiwiUmVxdWVzdGluZyBzZWxlY3Rpb24uLi5cbiIpOworICAgIGRwcmludGZfaW5mbyhjbGlwYm9hcmQsIlJlcXVlc3Rpbmcgc2VsZWN0aW9uLi4uXG4iKTsKIAogICAvKiByZXF1ZXN0IGRhdGEgdHlwZSBYQV9TVFJJTkcsIGxhdGVyCiAgICAqIENMSVBCT0FSRF9SZWFkU2VsZWN0aW9uKCkgd2lsbCBiZSBpbnZva2VkIApAQCAtMjI1LDcgKzIyNCw3IEBACiAgICAgd2hpbGUoc2VsZWN0aW9uV2FpdCkgRVZFTlRfV2FpdE5ldEV2ZW50KCBUUlVFLCBGQUxTRSApOwogCiAgIC8qIHdlIHRyZWF0IFVuaXggdGV4dCBhcyBDRl9PRU1URVhUICovCi0gICAgZHByaW50Zl9jbGlwYm9hcmQoc3RkZGViLCJcdGdvdCBDRl9PRU1URVhUID0gJWlcbiIsIAorICAgIGRwcmludGZfaW5mbyhjbGlwYm9hcmQsIlx0Z290IENGX09FTVRFWFQgPSAlaVxuIiwgCiAJCSAgICAgIENsaXBGb3JtYXRzW0NGX09FTVRFWFQtMV0ud0RhdGFQcmVzZW50KTsKIAogICAgIHJldHVybiAoQk9PTDMyKUNsaXBGb3JtYXRzW0NGX09FTVRFWFQtMV0ud0RhdGFQcmVzZW50OwpAQCAtMjY3LDcgKzI2Niw3IEBACiB7CiAgICAgQk9PTDMyIGJSZXQ7CiAKLSAgICBkcHJpbnRmX2NsaXBib2FyZChzdGRkZWIsIk9wZW5DbGlwYm9hcmQoJTA0eCkgPSAiLCBoV25kKTsKKyAgICBkcHJpbnRmX2luZm8oY2xpcGJvYXJkLCJPcGVuQ2xpcGJvYXJkKCUwNHgpLi4uXG4iLCBoV25kKTsKIAogICAgIGlmICghaHFDbGlwTG9jaykKICAgICB7CkBAIC0yNzgsNyArMjc3LDcgQEAKICAgICB9CiAgICAgZWxzZSBiUmV0ID0gRkFMU0U7CiAKLSAgICBkcHJpbnRmX2NsaXBib2FyZChzdGRkZWIsIiVpXG4iLCBiUmV0KTsKKyAgICBkcHJpbnRmX2luZm8oY2xpcGJvYXJkLCIgICByZXR1cm5pbmcgJWlcbiIsIGJSZXQpOwogICAgIHJldHVybiBiUmV0OwogfQogCkBAIC0yOTcsNyArMjk2LDcgQEAKICAqLwogQk9PTDMyIFdJTkFQSSBDbG9zZUNsaXBib2FyZDMyKHZvaWQpCiB7Ci0gICAgZHByaW50Zl9jbGlwYm9hcmQoc3RkZGViLCJDbG9zZUNsaXBib2FyZCgpOyAhXG4iKTsKKyAgICBkcHJpbnRmX2luZm8oY2xpcGJvYXJkLCJDbG9zZUNsaXBib2FyZCgpOyAhXG4iKTsKIAogICAgIGlmIChocUNsaXBMb2NrID09IEdldFRhc2tRdWV1ZSgwKSkKICAgICB7CkBAIC0zMjcsNyArMzI2LDcgQEAKIHsKICAgICBMUENMSVBGT1JNQVQgbHBGb3JtYXQgPSBDbGlwRm9ybWF0czsgCiAKLSAgICBkcHJpbnRmX2NsaXBib2FyZChzdGRkZWIsIkVtcHR5Q2xpcGJvYXJkKClcbiIpOworICAgIGRwcmludGZfaW5mbyhjbGlwYm9hcmQsIkVtcHR5Q2xpcGJvYXJkKClcbiIpOwogCiAgICAgaWYgKGhxQ2xpcExvY2sgIT0gR2V0VGFza1F1ZXVlKDApKSByZXR1cm4gRkFMU0U7CiAKQEAgLTM1Miw3ICszNTEsNyBAQAogCXNlbGVjdGlvblByZXZXaW5kb3cgCT0gc2VsZWN0aW9uV2luZG93OwogCXNlbGVjdGlvbldpbmRvdyAJPSBOb25lOwogCi0JZHByaW50Zl9jbGlwYm9hcmQoc3RkZGViLCAiXHRnaXZpbmcgdXAgc2VsZWN0aW9uIChzcHcgPSAlMDh4KVxuIiwgCisJZHByaW50Zl9pbmZvKGNsaXBib2FyZCwgIlx0Z2l2aW5nIHVwIHNlbGVjdGlvbiAoc3B3ID0gJTA4eClcbiIsIAogCQkJCSAJKHVuc2lnbmVkKXNlbGVjdGlvblByZXZXaW5kb3cpOwogCiAJVFNYU2V0U2VsZWN0aW9uT3duZXIoZGlzcGxheSwgWEFfUFJJTUFSWSwgTm9uZSwgQ3VycmVudFRpbWUpOwpAQCAtMzg3LDcgKzM4Niw3IEBACiAgICAgTFBDTElQRk9STUFUIGxwRm9ybWF0ID0gX19sb29rdXBfZm9ybWF0KCBDbGlwRm9ybWF0cywgd0Zvcm1hdCApOwogICAgIFdpbmRvdyAgICAgICBvd25lcjsKIAotICAgIGRwcmludGZfY2xpcGJvYXJkKHN0ZGRlYiwKKyAgICBkcHJpbnRmX2luZm8oY2xpcGJvYXJkLAogCQkiU2V0Q2xpcGJvYXJkRGF0YSglMDRYLCAlMDR4KSAhXG4iLCB3Rm9ybWF0LCBoRGF0YSk7CiAKICAgICAvKiBOT1RFOiBJZiB0aGUgaERhdGEgaXMgemVybyBhbmQgY3VycmVudCBvd25lciBkb2Vzbid0IG1hdGNoCkBAIC00MTIsNyArNDExLDcgQEAKIAkgICAgc2VsZWN0aW9uQWNxdWlyZWQgPSBUcnVlOwogCSAgICBzZWxlY3Rpb25XaW5kb3cgPSBvd25lcjsKIAotCSAgICBkcHJpbnRmX2NsaXBib2FyZChzdGRkZWIsIkdyYWJiZWQgWCBzZWxlY3Rpb24sIG93bmVyPSglMDh4KVxuIiwgCisJICAgIGRwcmludGZfaW5mbyhjbGlwYm9hcmQsIkdyYWJiZWQgWCBzZWxlY3Rpb24sIG93bmVyPSglMDh4KVxuIiwgCiAJCQkJCQkodW5zaWduZWQpIG93bmVyKTsKIAl9CiAgICAgfQpAQCAtNDYwLDcgKzQ1OSw3IEBACiAgICAgICAgICAgICAgICAgICAgICAoV1BBUkFNMTYpbHBGb3JtYXQtPndGb3JtYXRJRCwwTCk7CiAgICBlbHNlCiAgICB7Ci0gICAgICAgZHByaW50Zl9jbGlwYm9hcmQoc3RkZGViLCJcdGhXbmRDbGlwT3duZXIgKCUwNHgpIGlzIGxvc3QhXG4iLCAKKyAgICAgICBkcHJpbnRmX3dhcm4oY2xpcGJvYXJkLCAiXHRoV25kQ2xpcE93bmVyICglMDR4KSBpcyBsb3N0IVxuIiwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhXbmRDbGlwT3duZXIpOwogICAgICAgIGhXbmRDbGlwT3duZXIgPSAwOyBscEZvcm1hdC0+d0RhdGFQcmVzZW50ID0gMDsKICAgICAgICByZXR1cm4gRkFMU0U7CkBAIC00ODAsNyArNDc5LDcgQEAKICAgICBMUFNUUiAgbHBzdHJUOwogCiAgICAgaWYoICFscHN0clMgKSByZXR1cm4gRkFMU0U7Ci0gICAgZHByaW50Zl9jbGlwYm9hcmQoc3RkZGViLCJcdGNvbnZlcnRpbmcgZnJvbSAnJXMnIHRvICclcycsICVpIGNoYXJzXG4iLAorICAgIGRwcmludGZfaW5mbyhjbGlwYm9hcmQsIlx0Y29udmVydGluZyBmcm9tICclcycgdG8gJyVzJywgJWkgY2hhcnNcbiIsCiAJCQkgICAJICAgICAgbHBTb3VyY2UtPk5hbWUsIGxwVGFyZ2V0LT5OYW1lLCBzaXplKTsKIAogICAgIGxwVGFyZ2V0LT5oRGF0YSA9IEdsb2JhbEFsbG9jMTYoR01FTV9aRVJPSU5JVCwgc2l6ZSk7IApAQCAtNDkyLDcgKzQ5MSw3IEBACiAJICAgIENoYXJUb09lbUJ1ZmYzMkEobHBzdHJTLCBscHN0clQsIHNpemUpOwogCWVsc2UKIAkgICAgT2VtVG9DaGFyQnVmZjMyQShscHN0clMsIGxwc3RyVCwgc2l6ZSk7Ci0JZHByaW50Zl9jbGlwYm9hcmQoc3RkZGViLCJcdGdvdCAlc1xuIiwgbHBzdHJUKTsKKwlkcHJpbnRmX2luZm8oY2xpcGJvYXJkLCJcdGdvdCAlc1xuIiwgbHBzdHJUKTsKIAlyZXR1cm4gVFJVRTsKICAgICB9CiAKQEAgLTUxMCw3ICs1MDksNyBAQAogCiAgICAgaWYgKGhxQ2xpcExvY2sgIT0gR2V0VGFza1F1ZXVlKDApKSByZXR1cm4gMDsKIAotICAgIGRwcmludGZfY2xpcGJvYXJkKHN0ZGRlYiwiR2V0Q2xpcGJvYXJkRGF0YSglMDRYKVxuIiwgd0Zvcm1hdCk7CisgICAgZHByaW50Zl9pbmZvKGNsaXBib2FyZCwiR2V0Q2xpcGJvYXJkRGF0YSglMDRYKVxuIiwgd0Zvcm1hdCk7CiAKICAgICBpZiggd0Zvcm1hdCA9PSBDRl9URVhUICYmICFscFJlbmRlcltDRl9URVhULTFdLndEYXRhUHJlc2VudCAKIAkJCSAgICYmICBscFJlbmRlcltDRl9PRU1URVhULTFdLndEYXRhUHJlc2VudCApCkBAIC01MTgsNyArNTE3LDcgQEAKIAlscFJlbmRlciA9ICZDbGlwRm9ybWF0c1tDRl9PRU1URVhULTFdOwogCWxwVXBkYXRlID0gJkNsaXBGb3JtYXRzW0NGX1RFWFQtMV07CiAKLQlkcHJpbnRmX2NsaXBib2FyZChzdGRkZWIsIlx0T0VNVEVYVCAtPiBURVhUXG4iKTsKKwlkcHJpbnRmX2luZm8oY2xpcGJvYXJkLCJcdE9FTVRFWFQgLT4gVEVYVFxuIik7CiAgICAgfQogICAgIGVsc2UgaWYoIHdGb3JtYXQgPT0gQ0ZfT0VNVEVYVCAmJiAhbHBSZW5kZXJbQ0ZfT0VNVEVYVC0xXS53RGF0YVByZXNlbnQKIAkJCQkgICAmJiAgbHBSZW5kZXJbQ0ZfVEVYVC0xXS53RGF0YVByZXNlbnQgKQpAQCAtNTI2LDcgKzUyNSw3IEBACiAgICAgICAgIGxwUmVuZGVyID0gJkNsaXBGb3JtYXRzW0NGX1RFWFQtMV07CiAJbHBVcGRhdGUgPSAmQ2xpcEZvcm1hdHNbQ0ZfT0VNVEVYVC0xXTsKIAkKLQlkcHJpbnRmX2NsaXBib2FyZChzdGRkZWIsIlx0VEVYVCAtPiBPRU1URVhUXG4iKTsKKwlkcHJpbnRmX2luZm8oY2xpcGJvYXJkLCJcdFRFWFQgLT4gT0VNVEVYVFxuIik7CiAgICAgfQogICAgIGVsc2UKICAgICB7CkBAIC01MzgsNyArNTM3LDcgQEAKICAgICBpZiggbHBVcGRhdGUgIT0gbHBSZW5kZXIgJiYgIWxwVXBkYXRlLT5oRGF0YSApIAogCUNMSVBCT0FSRF9SZW5kZXJUZXh0KGxwVXBkYXRlLCBscFJlbmRlcik7CiAKLSAgICBkcHJpbnRmX2NsaXBib2FyZChzdGRkZWIsIlx0cmV0dXJuaW5nICUwNHggKHR5cGUgJWkpXG4iLCAKKyAgICBkcHJpbnRmX2luZm8oY2xpcGJvYXJkLCJcdHJldHVybmluZyAlMDR4ICh0eXBlICVpKVxuIiwgCiAJCQkgICAgICBscFVwZGF0ZS0+aERhdGEsIGxwVXBkYXRlLT53Rm9ybWF0SUQpOwogICAgIHJldHVybiBscFVwZGF0ZS0+aERhdGE7CiB9CkBAIC01NzAsNyArNTY5LDcgQEAKICAgICBJTlQzMiBGb3JtYXRDb3VudCA9IDA7CiAgICAgTFBDTElQRk9STUFUIGxwRm9ybWF0ID0gQ2xpcEZvcm1hdHM7IAogCi0gICAgZHByaW50Zl9jbGlwYm9hcmQoc3RkZGViLCJDb3VudENsaXBib2FyZEZvcm1hdHMoKVxuIik7CisgICAgZHByaW50Zl9pbmZvKGNsaXBib2FyZCwiQ291bnRDbGlwYm9hcmRGb3JtYXRzKClcbiIpOwogCiAgICAgaWYoICFzZWxlY3Rpb25BY3F1aXJlZCApIENMSVBCT0FSRF9SZXF1ZXN0WFNlbGVjdGlvbigpOwogCkBAIC01ODIsMTMgKzU4MSwxMyBAQAogCWlmIChscEZvcm1hdCA9PSBOVUxMKSBicmVhazsKIAlpZiAobHBGb3JtYXQtPndEYXRhUHJlc2VudCkgCiAJewotICAgICAgICAgICAgZHByaW50Zl9jbGlwYm9hcmQoc3RkZGViLCAiXHRkYXRhIGZvdW5kIGZvciBmb3JtYXQgJWlcbiIsIGxwRm9ybWF0LT53Rm9ybWF0SUQpOworICAgICAgICAgICAgZHByaW50Zl9pbmZvKGNsaXBib2FyZCwgIlx0ZGF0YSBmb3VuZCBmb3IgZm9ybWF0ICVpXG4iLCBscEZvcm1hdC0+d0Zvcm1hdElEKTsKIAkgICAgRm9ybWF0Q291bnQrKzsKIAl9CiAJbHBGb3JtYXQgPSBscEZvcm1hdC0+TmV4dEZvcm1hdDsKICAgICB9CiAKLSAgICBkcHJpbnRmX2NsaXBib2FyZChzdGRkZWIsIlx0dG90YWwgJWRcbiIsIEZvcm1hdENvdW50KTsKKyAgICBkcHJpbnRmX2luZm8oY2xpcGJvYXJkLCJcdHRvdGFsICVkXG4iLCBGb3JtYXRDb3VudCk7CiAgICAgcmV0dXJuIEZvcm1hdENvdW50OwogfQogCkBAIC02MDksNyArNjA4LDcgQEAKIHsKICAgICBMUENMSVBGT1JNQVQgbHBGb3JtYXQgPSBDbGlwRm9ybWF0czsgCiAKLSAgICBkcHJpbnRmX2NsaXBib2FyZChzdGRkZWIsIkVudW1DbGlwYm9hcmRGb3JtYXRzKCUwNFgpXG4iLCB3Rm9ybWF0KTsKKyAgICBkcHJpbnRmX2luZm8oY2xpcGJvYXJkLCJFbnVtQ2xpcGJvYXJkRm9ybWF0cyglMDRYKVxuIiwgd0Zvcm1hdCk7CiAKICAgICBpZiggaHFDbGlwTG9jayAhPSBHZXRUYXNrUXVldWUoMCkgKSByZXR1cm4gMDsKIApAQCAtNjUyLDcgKzY1MSw3IEBACiAKICAgICBpZiAoRm9ybWF0TmFtZSA9PSBOVUxMKSByZXR1cm4gMDsKIAotICAgIGRwcmludGZfY2xpcGJvYXJkKHN0ZGRlYiwiUmVnaXN0ZXJDbGlwYm9hcmRGb3JtYXQoJyVzJykgIVxuIiwgRm9ybWF0TmFtZSk7CisgICAgZHByaW50Zl9pbmZvKGNsaXBib2FyZCwiUmVnaXN0ZXJDbGlwYm9hcmRGb3JtYXQoJyVzJykgIVxuIiwgRm9ybWF0TmFtZSk7CiAKICAgICAvKiB3YWxrIGZvcm1hdCBjaGFpbiB0byBzZWUgaWYgaXQncyBhbHJlYWR5IHJlZ2lzdGVyZWQgKi8KIApAQCAtNzI1LDEzICs3MjQsMTMgQEAKIHsKICAgICBMUENMSVBGT1JNQVQgbHBGb3JtYXQgPSBfX2xvb2t1cF9mb3JtYXQoIENsaXBGb3JtYXRzLCB3Rm9ybWF0ICk7CiAKLSAgICBkcHJpbnRmX2NsaXBib2FyZChzdGRkZWIsCisgICAgZHByaW50Zl9pbmZvKGNsaXBib2FyZCwKIAkiR2V0Q2xpcGJvYXJkRm9ybWF0TmFtZSglMDRYLCAlcCwgJWQpICFcbiIsIHdGb3JtYXQsIHJldFN0ciwgbWF4bGVuKTsKIAogICAgIGlmIChscEZvcm1hdCA9PSBOVUxMIHx8IGxwRm9ybWF0LT5OYW1lID09IE5VTEwgfHwgCiAJbHBGb3JtYXQtPndGb3JtYXRJRCA8IENGX1JFR0ZPUk1BVEJBU0UpIHJldHVybiAwOwogCi0gICAgZHByaW50Zl9jbGlwYm9hcmQoc3RkZGViLAorICAgIGRwcmludGZfaW5mbyhjbGlwYm9hcmQsCiAJCSJHZXRDbGlwYm9hcmRGb3JtYXQgLy8gTmFtZT0nJXMnICFcbiIsIGxwRm9ybWF0LT5OYW1lKTsKIAogICAgIGxzdHJjcHluMzJBKCByZXRTdHIsIGxwRm9ybWF0LT5OYW1lLCBtYXhsZW4gKTsKQEAgLTc2OCw3ICs3NjcsNyBAQAogewogICAgIEhXTkQzMiBod25kUHJldiA9IGhXbmRWaWV3ZXI7CiAKLSAgICBkcHJpbnRmX2NsaXBib2FyZChzdGRkZWIsIlNldENsaXBib2FyZFZpZXdlciglMDR4KTogcmV0dXJuaW5nICUwNHhcbiIsIGhXbmQsIGh3bmRQcmV2KTsKKyAgICBkcHJpbnRmX2luZm8oY2xpcGJvYXJkLCJTZXRDbGlwYm9hcmRWaWV3ZXIoJTA0eCk6IHJldHVybmluZyAlMDR4XG4iLCBoV25kLCBod25kUHJldik7CiAKICAgICBoV25kVmlld2VyID0gaFduZDsKICAgICByZXR1cm4gaHduZFByZXY7CkBAIC04MDgsMTMgKzgwNywxNCBAQAogewogICAgIEJPT0wzMiBiUmV0ID0gMDsKIAotICAgIGRwcmludGZfY2xpcGJvYXJkKHN0ZG5pbXAsICJDaGFuZ2VDbGlwYm9hcmRDaGFpbiglMDR4LCAlMDR4KVxuIiwgaFduZCwgaFduZE5leHQpOworICAgIGRwcmludGZfZml4bWUoY2xpcGJvYXJkLCAiQ2hhbmdlQ2xpcGJvYXJkQ2hhaW4oJTA0eCwgJTA0eCkgLSBzdHViP1xuIiwgCisJCSAgICAgIGhXbmQsIGhXbmROZXh0KTsKIAogICAgIGlmKCBoV25kVmlld2VyICkKIAliUmV0ID0gIVNlbmRNZXNzYWdlMTYoIGhXbmRWaWV3ZXIsIFdNX0NIQU5HRUNCQ0hBSU4sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChXUEFSQU0xNiloV25kLCAoTFBBUkFNKWhXbmROZXh0KTsgICAKICAgICBlbHNlCi0JZHByaW50Zl9jbGlwYm9hcmQoc3RkZGViLCJDaGFuZ2VDbGlwYm9hcmRDaGFpbjogaFduZFZpZXdlciBpcyBsb3N0XG4iKTsKKwlkcHJpbnRmX3dhcm4oY2xpcGJvYXJkLCAiQ2hhbmdlQ2xpcGJvYXJkQ2hhaW46IGhXbmRWaWV3ZXIgaXMgbG9zdFxuIik7CiAKICAgICBpZiggaFduZCA9PSBoV25kVmlld2VyICkgaFduZFZpZXdlciA9IGhXbmROZXh0OwogCkBAIC04MzcsNyArODM3LDcgQEAKICAqLwogQk9PTDMyIFdJTkFQSSBJc0NsaXBib2FyZEZvcm1hdEF2YWlsYWJsZTMyKCBVSU5UMzIgd0Zvcm1hdCApCiB7Ci0gICAgZHByaW50Zl9jbGlwYm9hcmQoc3RkZGViLCJJc0NsaXBib2FyZEZvcm1hdEF2YWlsYWJsZSglMDRYKSAhXG4iLCB3Rm9ybWF0KTsKKyAgICBkcHJpbnRmX2luZm8oY2xpcGJvYXJkLCJJc0NsaXBib2FyZEZvcm1hdEF2YWlsYWJsZSglMDRYKSAhXG4iLCB3Rm9ybWF0KTsKIAogICAgIGlmKCAod0Zvcm1hdCA9PSBDRl9URVhUIHx8IHdGb3JtYXQgPT0gQ0ZfT0VNVEVYVCkgJiYKICAgICAgICAgIXNlbGVjdGlvbkFjcXVpcmVkICkgQ0xJUEJPQVJEX1JlcXVlc3RYU2VsZWN0aW9uKCk7CkBAIC05MDcsNyArOTA3LDcgQEAKICAgICBIQU5ETEUxNiAJIGhUZXh0ID0gMDsKICAgICBMUENMSVBGT1JNQVQgbHBGb3JtYXQgPSBDbGlwRm9ybWF0czsgCiAKLSAgICBkcHJpbnRmX2NsaXBib2FyZChzdGRkZWIsIlJlYWRTZWxlY3Rpb24gY2FsbGJhY2tcbiIpOworICAgIGRwcmludGZfaW5mbyhjbGlwYm9hcmQsIlJlYWRTZWxlY3Rpb24gY2FsbGJhY2tcbiIpOwogCiAgICAgaWYocHJvcCAhPSBOb25lKQogICAgIHsKQEAgLTkxNiwxNiArOTE2LDE2IEBACiAJdW5zaWduZWQgbG9uZyAJbml0ZW1zLHJlbWFpbjsKIAl1bnNpZ25lZCBjaGFyKgl2YWw9TlVMTDsKIAotICAgICAgICBkcHJpbnRmX2NsaXBib2FyZChzdGRkZWIsIlx0Z290IHByb3BlcnR5ICVzXG4iLFRTWEdldEF0b21OYW1lKGRpc3BsYXkscHJvcCkpOworICAgICAgICBkcHJpbnRmX2luZm8oY2xpcGJvYXJkLCJcdGdvdCBwcm9wZXJ0eSAlc1xuIixUU1hHZXRBdG9tTmFtZShkaXNwbGF5LHByb3ApKTsKIAogICAgICAgICAvKiBUT0RPOiBQcm9wZXJ0aWVzIGxvbmdlciB0aGFuIDY0SyAqLwogCiAJaWYoVFNYR2V0V2luZG93UHJvcGVydHkoZGlzcGxheSx3LHByb3AsMCwweDNGRkYsVHJ1ZSxYQV9TVFJJTkcsCiAJICAgICZhdHlwZSwgJmFmb3JtYXQsICZuaXRlbXMsICZyZW1haW4sICZ2YWwpICE9IFN1Y2Nlc3MpCi0JICAgIGRwcmludGZfY2xpcGJvYXJkKHN0ZGRlYiwiXHRjb3VsZG4ndCByZWFkIHByb3BlcnR5XG4iKTsKKwkgICAgZHByaW50Zl93YXJuKGNsaXBib2FyZCwgIlx0Y291bGRuJ3QgcmVhZCBwcm9wZXJ0eVxuIik7CiAJZWxzZQogCXsKLSAgICAgICAgICAgZHByaW50Zl9jbGlwYm9hcmQoc3RkZGViLCJcdFR5cGUgJXMsRm9ybWF0ICVkLG5pdGVtcyAlbGQsdmFsdWUgJXNcbiIsCisgICAgICAgICAgIGRwcmludGZfaW5mbyhjbGlwYm9hcmQsIlx0VHlwZSAlcyxGb3JtYXQgJWQsbml0ZW1zICVsZCx2YWx1ZSAlc1xuIiwKIAkJICAgICAgICAgICAgIFRTWEdldEF0b21OYW1lKGRpc3BsYXksYXR5cGUpLGFmb3JtYXQsbml0ZW1zLHZhbCk7CiAKIAkgICBpZihhdHlwZSA9PSBYQV9TVFJJTkcgJiYgYWZvcm1hdCA9PSA4KQpAQCAtOTMzLDcgKzkzMyw3IEBACiAJICAgICAgaW50IAlpLGlubGNvdW50ID0gMDsKIAkgICAgICBjaGFyKglscHN0cjsKIAotCSAgICAgIGRwcmludGZfY2xpcGJvYXJkKHN0ZGRlYiwiXHRzZWxlY3Rpb24gaXMgJyVzJ1xuIix2YWwpOworCSAgICAgIGRwcmludGZfaW5mbyhjbGlwYm9hcmQsIlx0c2VsZWN0aW9uIGlzICclcydcbiIsdmFsKTsKIAogCSAgICAgIGZvcihpPTA7IGkgPD0gbml0ZW1zOyBpKyspCiAJCSAgaWYoIHZhbFtpXSA9PSAnXG4nICkgaW5sY291bnQrKzsKQEAgLTk4NSw3ICs5ODUsNyBAQAogICAgICAqIHNlbGVjdGlvblByZXZXaW5kb3cgaXMgbm9uemVybyBpZiBDaGVja1NlbGVjdGlvbigpIHdhcyBjYWxsZWQuIAogICAgICAqLwogCi0gICAgZHByaW50Zl9jbGlwYm9hcmQoc3RkZGViLCJcdGV2ZW50LT53aW5kb3cgPSAlMDh4IChzdyA9ICUwOHgsIHNwdz0lMDh4KVxuIiwgCisgICAgZHByaW50Zl9pbmZvKGNsaXBib2FyZCwiXHRldmVudC0+d2luZG93ID0gJTA4eCAoc3cgPSAlMDh4LCBzcHc9JTA4eClcbiIsIAogCSAgKHVuc2lnbmVkKXcsICh1bnNpZ25lZClzZWxlY3Rpb25XaW5kb3csICh1bnNpZ25lZClzZWxlY3Rpb25QcmV2V2luZG93ICk7CiAKICAgICBpZiggc2VsZWN0aW9uQWNxdWlyZWQgKQpkaWZmIC0tZ2l0IGEvd2luZG93cy9kY2UuYyBiL3dpbmRvd3MvZGNlLmMKaW5kZXggOWZmNjBjNS4uMjFkMTA4MCAxMDA2NDQKLS0tIGEvd2luZG93cy9kY2UuYworKysgYi93aW5kb3dzL2RjZS5jCkBAIC0yNSw4ICsyNSw2IEBACiAjaW5jbHVkZSAicmVnaW9uLmgiCiAjaW5jbHVkZSAiaGVhcC5oIgogI2luY2x1ZGUgInN5c21ldHJpY3MuaCIKLSNpbmNsdWRlICJzdGRkZWJ1Zy5oIgotLyogI2RlZmluZSBERUJVR19EQyAqLwogI2luY2x1ZGUgImRlYnVnLmgiCiAKICNkZWZpbmUgTkJfRENFICAgIDUgIC8qIE51bWJlciBvZiBEQ0VzIGNyZWF0ZWQgYXQgc3RhcnR1cCAqLwpAQCAtMTc0LDcgKzE3Miw3IEBACiAKICAgICBkY2UtPmhDbGlwUmduID0gMDsKIAotICAgIGRwcmludGZfZGMoc3RkZGViLCJcdHJlc3RvcmluZyBWaXNSZ25cbiIpOworICAgIGRwcmludGZfaW5mbyhkYywiXHRyZXN0b3JpbmcgVmlzUmduXG4iKTsKIAogICAgIFJlc3RvcmVWaXNSZ24oZGNlLT5oREMpOwogfQpAQCAtMjI4LDEwICsyMjYsMTEgQEAKICAgICB7CiAJRENFICpkY2U7CiAKLQlkcHJpbnRmX2RjKHN0ZGRlYiwiSW52YWxpZGF0ZURDRTogc2NvcGUgaHduZCA9ICUwNHgsICglaSwlaSAtICVpLCVpKVxuIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICB3bmRTY29wZS0+aHduZFNlbGYsIHBSZWN0VXBkYXRlLT5sZWZ0LHBSZWN0VXBkYXRlLT50b3AsCi0JCQkJICAgICAgICBwUmVjdFVwZGF0ZS0+cmlnaHQscFJlY3RVcGRhdGUtPmJvdHRvbSk7Ci0JaWYoIGRlYnVnZ2luZ19kYyApIERDRV9EdW1wQ2FjaGUoKTsKKwlkcHJpbnRmX2luZm8oZGMsIkludmFsaWRhdGVEQ0U6IHNjb3BlIGh3bmQgPSAlMDR4LCAoJWksJWkgLSAlaSwlaSlcbiIsCisJCSAgICAgd25kU2NvcGUtPmh3bmRTZWxmLCBwUmVjdFVwZGF0ZS0+bGVmdCxwUmVjdFVwZGF0ZS0+dG9wLAorCQkgICAgIHBSZWN0VXBkYXRlLT5yaWdodCxwUmVjdFVwZGF0ZS0+Ym90dG9tKTsKKwlpZihkZWJ1Z2dpbmdfaW5mbyhkYykpIAorCSAgRENFX0R1bXBDYWNoZSgpOwogCiAgCS8qIHdhbGsgYWxsIERDRXMgYW5kIGZpeHVwIG5vbi1lbXB0eSBlbnRyaWVzICovCiAKQEAgLTI2OCw3ICsyNjcsNyBAQAogCQkJCXsKIAkJCQkgICAgLyogRG9uJ3QgYm90aGVyIHdpdGggdmlzaWJsZSByZWdpb25zIG9mIHVudXNlZCBEQ0VzICovCiAKLQkJCQkgICAgZHByaW50Zl9kYyhzdGRkZWIsIlx0cHVyZ2VkICUwOHggZGNlIFslMDR4XVxuIiwgCisJCQkJICAgIGRwcmludGZfaW5mbyhkYywiXHRwdXJnZWQgJTA4eCBkY2UgWyUwNHhdXG4iLCAKIAkJCQkJCSh1bnNpZ25lZClkY2UsIHduZEN1cnJlbnQtPmh3bmRTZWxmKTsKIAogCQkJCSAgICBkY2UtPmh3bmRDdXJyZW50ID0gMDsKQEAgLTI3OSw3ICsyNzgsNyBAQAogCQkJCXsKIAkJCQkgICAgLyogU2V0IGRpcnR5IGJpdHMgaW4gdGhlIGhEQyBhbmQgRENFIHN0cnVjdHMgKi8KIAotCQkJCSAgICBkcHJpbnRmX2RjKHN0ZGRlYiwiXHRmaXhlZCB1cCAlMDh4IGRjZSBbJTA0eF1cbiIsIAorCQkJCSAgICBkcHJpbnRmX2luZm8oZGMsIlx0Zml4ZWQgdXAgJTA4eCBkY2UgWyUwNHhdXG4iLCAKIAkJCQkJCSh1bnNpZ25lZClkY2UsIHduZEN1cnJlbnQtPmh3bmRTZWxmKTsKIAogCQkJCSAgICBkY2UtPkRDWGZsYWdzIHw9IERDWF9EQ0VESVJUWTsKQEAgLTYwNiw3ICs2MDUsNyBAQAogICAgIEJPT0wzMgliVXBkYXRlVmlzUmduID0gVFJVRTsKICAgICBCT09MMzIJYlVwZGF0ZUNsaXBPcmlnaW4gPSBGQUxTRTsKIAotICAgIGRwcmludGZfZGMoc3RkZGViLCJHZXREQ0V4OiBod25kICUwNHgsIGhyZ25DbGlwICUwNHgsIGZsYWdzICUwOHhcbiIsIAorICAgIGRwcmludGZfaW5mbyhkYywiR2V0RENFeDogaHduZCAlMDR4LCBocmduQ2xpcCAlMDR4LCBmbGFncyAlMDh4XG4iLCAKIAkJCQlod25kLCBocmduQ2xpcCwgKHVuc2lnbmVkKWZsYWdzKTsKICAgICAKICAgICBpZiAoISh3bmRQdHIgPSBXSU5fRmluZFduZFB0ciggaHduZCApKSkgcmV0dXJuIDA7CkBAIC02ODUsNyArNjg0LDcgQEAKIAkJICAgKChkY2UtPkRDWGZsYWdzICYgKERDWF9DTElQU0lCTElOR1MgfCBEQ1hfQ0xJUENISUxEUkVOIHwKIAkJCQkgICAgICBEQ1hfQ0FDSEUgfCBEQ1hfV0lORE9XIHwgRENYX1BBUkVOVENMSVApKSA9PSBkY3hGbGFncykpCiAJCXsKLQkJICAgIGRwcmludGZfZGMoc3RkZGViLCJcdGZvdW5kIHZhbGlkICUwOHggZGNlIFslMDR4XSwgZmxhZ3MgJTA4eFxuIiwgCisJCSAgICBkcHJpbnRmX2luZm8oZGMsIlx0Zm91bmQgdmFsaWQgJTA4eCBkY2UgWyUwNHhdLCBmbGFncyAlMDh4XG4iLCAKIAkJCQkJKHVuc2lnbmVkKWRjZSwgaHduZCwgKHVuc2lnbmVkKWRjeEZsYWdzICk7CiAJCSAgICBiVXBkYXRlVmlzUmduID0gRkFMU0U7IAogCQkgICAgYlVwZGF0ZUNsaXBPcmlnaW4gPSBUUlVFOwpAQCAtNzAwLDcgKzY5OSw3IEBACiAgICAgICAgIGRjZSA9ICh3bmRQdHItPmNsYXNzLT5zdHlsZSAmIENTX09XTkRDKSA/IHduZFB0ci0+ZGNlIDogd25kUHRyLT5jbGFzcy0+ZGNlOwogCWlmKCBkY2UtPmh3bmRDdXJyZW50ID09IGh3bmQgKQogCXsKLQkgICAgZHByaW50Zl9kYyhzdGRkZWIsIlx0c2tpcHBpbmcgaFZpc1JnbiB1cGRhdGVcbiIpOworCSAgICBkcHJpbnRmX2luZm8oZGMsIlx0c2tpcHBpbmcgaFZpc1JnbiB1cGRhdGVcbiIpOwogCSAgICBiVXBkYXRlVmlzUmduID0gRkFMU0U7IC8qIHVwZGF0ZWQgYXV0b21hdGljYWxseSwgdmlhIERDSG9vaygpICovCiAKIAkgICAgaWYoIChkY2UtPkRDWGZsYWdzICYgKERDWF9FWENMVURFUkdOIHwgRENYX0lOVEVSU0VDVFJHTikpICYmCkBAIC03MzQsNyArNzMzLDcgQEAKICAgICBEQ0VfU2V0RHJhd2FibGUoIHduZFB0ciwgZGMsIGZsYWdzLCBiVXBkYXRlQ2xpcE9yaWdpbiApOwogICAgIGlmKCBiVXBkYXRlVmlzUmduICkKICAgICB7Ci0JZHByaW50Zl9kYyhzdGRkZWIsInVwZGF0aW5nIHZpc3JnbiBmb3IgJTA4eCBkY2UsIGh3bmQgWyUwNHhdXG4iLCAodW5zaWduZWQpZGNlLCBod25kKTsKKwlkcHJpbnRmX2luZm8oZGMsInVwZGF0aW5nIHZpc3JnbiBmb3IgJTA4eCBkY2UsIGh3bmQgWyUwNHhdXG4iLCAodW5zaWduZWQpZGNlLCBod25kKTsKIAogCWlmIChmbGFncyAmIERDWF9QQVJFTlRDTElQKQogICAgICAgICB7CkBAIC03NzAsNyArNzY5LDcgQEAKIAlTZWxlY3RWaXNSZ24oIGhkYywgaHJnblZpc2libGUgKTsKICAgICB9CiAgICAgZWxzZQotCWRwcmludGZfZGMoc3RkZGViLCJubyB2aXNyZ24gdXBkYXRlICUwOHggZGNlLCBod25kIFslMDR4XVxuIiwgKHVuc2lnbmVkKWRjZSwgaHduZCk7CisJZHByaW50Zl9pbmZvKGRjLCJubyB2aXNyZ24gdXBkYXRlICUwOHggZGNlLCBod25kIFslMDR4XVxuIiwgKHVuc2lnbmVkKWRjZSwgaHduZCk7CiAKICAgICAvKiBhcHBseSBhZGRpdGlvbmFsIHJlZ2lvbiBvcGVyYXRpb24gKGlmIGFueSkgKi8KIApAQCAtNzgxLDcgKzc4MCw3IEBACiAJZGNlLT5EQ1hmbGFncyB8PSBmbGFncyAmIChEQ1hfS0VFUENMSVBSR04gfCBEQ1hfSU5URVJTRUNUUkdOIHwgRENYX0VYQ0xVREVSR04pOwogCWRjZS0+aENsaXBSZ24gPSBocmduQ2xpcDsKIAotCWRwcmludGZfZGMoc3RkZGViLCAiXHRzYXZlZCBWaXNSZ24sIGNsaXBSZ24gPSAlMDR4XG4iLCBocmduQ2xpcCk7CisJZHByaW50Zl9pbmZvKGRjLCAiXHRzYXZlZCBWaXNSZ24sIGNsaXBSZ24gPSAlMDR4XG4iLCBocmduQ2xpcCk7CiAKIAlTYXZlVmlzUmduKCBoZGMgKTsKICAgICAgICAgQ29tYmluZVJnbjMyKCBocmduVmlzaWJsZSwgSW5xdWlyZVZpc1JnbiggaGRjICksIGhyZ25DbGlwLApAQCAtNzkxLDcgKzc5MCw3IEBACiAKICAgICBpZiggaHJnblZpc2libGUgKSBEZWxldGVPYmplY3QzMiggaHJnblZpc2libGUgKTsKIAotICAgIGRwcmludGZfZGMoc3RkZGViLCAiR2V0RENFeCglMDR4LCUwNHgsMHglbHgpOiByZXR1cm5pbmcgJTA0eFxuIiwgCisgICAgZHByaW50Zl9pbmZvKGRjLCAiR2V0RENFeCglMDR4LCUwNHgsMHglbHgpOiByZXR1cm5pbmcgJTA0eFxuIiwgCiAJICAgICAgIGh3bmQsIGhyZ25DbGlwLCBmbGFncywgaGRjKTsKICAgICByZXR1cm4gaGRjOwogfQpAQCAtODUzLDcgKzg1Miw3IEBACiB7CiAgICAgRENFICogZGNlID0gZmlyc3REQ0U7CiAgICAgCi0gICAgZHByaW50Zl9kYyhzdGRkZWIsICJSZWxlYXNlREM6ICUwNHggJTA0eFxuIiwgaHduZCwgaGRjICk7CisgICAgZHByaW50Zl9pbmZvKGRjLCAiUmVsZWFzZURDOiAlMDR4ICUwNHhcbiIsIGh3bmQsIGhkYyApOwogICAgICAgICAKICAgICB3aGlsZSAoZGNlICYmIChkY2UtPmhEQyAhPSBoZGMpKSBkY2UgPSBkY2UtPm5leHQ7CiAKQEAgLTg3Myw3ICs4NzIsNyBAQAogICAgIEhSR04zMiBoVmlzUmduOwogICAgIERDRSAqZGNlID0gZmlyc3REQ0U7OwogCi0gICAgZHByaW50Zl9kYyhzdGRkZWIsIkRDSG9vazogaERDID0gJTA0eCwgJWlcbiIsIGhEQywgY29kZSk7CisgICAgZHByaW50Zl9pbmZvKGRjLCJEQ0hvb2s6IGhEQyA9ICUwNHgsICVpXG4iLCBoREMsIGNvZGUpOwogCiAgICAgd2hpbGUgKGRjZSAmJiAoZGNlLT5oREMgIT0gaERDKSkgZGNlID0gZGNlLT5uZXh0OwogICAgIGlmICghZGNlKSByZXR1cm4gMDsKQEAgLTg5Miw3ICs4OTEsNyBAQAogCSAgICAgICBTZXRIb29rRmxhZ3MoaERDLCBEQ0hGX1ZBTElEQVRFVklTUkdOKTsKIAkgICAgICAgaFZpc1JnbiA9IERDRV9HZXRWaXNSZ24oZGNlLT5od25kQ3VycmVudCwgZGNlLT5EQ1hmbGFncyk7CiAKLQkgICAgICAgZHByaW50Zl9kYyhzdGRkZWIsIlx0YXBwbHlpbmcgc2F2ZWQgY2xpcFJnblxuIik7CisJICAgICAgIGRwcmludGZfaW5mbyhkYywiXHRhcHBseWluZyBzYXZlZCBjbGlwUmduXG4iKTsKICAgCiAJICAgICAgIC8qIGNsaXAgdGhpcyByZWdpb24gd2l0aCBzYXZlZCBjbGlwcGluZyByZWdpb24gKi8KIApAQCAtOTEyLDcgKzkxMSw3IEBACiAJICAgICAgIERlbGV0ZU9iamVjdDMyKCBoVmlzUmduICk7CiAJICAgfQogICAgICAgICAgICBlbHNlIC8qIG5vbi1mYXRhbCBidXQgc2hvdWxkbid0IGhhcHBlbiAqLwotCSAgICAgZHByaW50Zl9kYyhzdGRkZWIsIkRDSG9vazogREMgaXMgbm90IGluIHVzZSFcbiIpOworCSAgICAgZHByaW50Zl93YXJuKGRjLCAiRENIb29rOiBEQyBpcyBub3QgaW4gdXNlIVxuIik7CiAJICAgYnJlYWs7CiAKICAgICAgIGNhc2UgRENIQ19ERUxFVEVEQzogLyogRklYTUU6ID8/ICovCmRpZmYgLS1naXQgYS93aW5kb3dzL2RlZnduZC5jIGIvd2luZG93cy9kZWZ3bmQuYwppbmRleCAzY2I1N2I4Li5jYzNlYzY0IDEwMDY0NAotLS0gYS93aW5kb3dzL2RlZnduZC5jCisrKyBiL3dpbmRvd3MvZGVmd25kLmMKQEAgLTE0LDcgKzE0LDYgQEAKICNpbmNsdWRlICJ3aW5wb3MuaCIKICNpbmNsdWRlICJkY2UuaCIKICNpbmNsdWRlICJzeXNtZXRyaWNzLmgiCi0jaW5jbHVkZSAic3RkZGVidWcuaCIKICNpbmNsdWRlICJkZWJ1Zy5oIgogI2luY2x1ZGUgInNweS5oIgogCkBAIC05OCw3ICs5Nyw3IEBACiB7CiAgICAgQk9PTDMyIGJWaXNpYmxlID0gd25kUHRyLT5kd1N0eWxlICYgV1NfVklTSUJMRTsKIAotZHByaW50Zl93aW4oc3RkZGViLCJTZXRSZWRyYXc6ICUwNHggJWlcbiIsIHduZFB0ci0+aHduZFNlbGYsICh3UGFyYW0hPTApICk7CitkcHJpbnRmX2luZm8od2luLCJTZXRSZWRyYXc6ICUwNHggJWlcbiIsIHduZFB0ci0+aHduZFNlbGYsICh3UGFyYW0hPTApICk7CiAKICAgICBpZiggd1BhcmFtICkKICAgICB7CkBAIC0xODUsNyArMTg0LDcgQEAKIAkJCVNZU01FVFJJQ1NfQ1hJQ09OKS8yOwogCSAgICAgICAgaW50IHkgPSAod25kUHRyLT5yZWN0V2luZG93LmJvdHRvbSAtIHduZFB0ci0+cmVjdFdpbmRvdy50b3AgLQogCQkJU1lTTUVUUklDU19DWUlDT04pLzI7Ci0JCWRwcmludGZfd2luKHN0ZGRlYiwiUGFpbnRpbmcgY2xhc3MgaWNvbjogdmlzIHJlY3Q9KCVpLCVpIC0gJWksJWkpXG4iLAorCQlkcHJpbnRmX2luZm8od2luLCJQYWludGluZyBjbGFzcyBpY29uOiB2aXMgcmVjdD0oJWksJWkgLSAlaSwlaSlcbiIsCiAJCXBzLnJjUGFpbnQubGVmdCwgcHMucmNQYWludC50b3AsIHBzLnJjUGFpbnQucmlnaHQsIHBzLnJjUGFpbnQuYm90dG9tICk7CiAJICAgICAgICBEcmF3SWNvbjMyKCBoZGMsIHgsIHksIHduZFB0ci0+Y2xhc3MtPmhJY29uICk7CiAJICAgICAgfQpkaWZmIC0tZ2l0IGEvd2luZG93cy9kaWFsb2cuYyBiL3dpbmRvd3MvZGlhbG9nLmMKaW5kZXggNTlkZGFlNi4uMmUyYzg1ZiAxMDA2NDQKLS0tIGEvd2luZG93cy9kaWFsb2cuYworKysgYi93aW5kb3dzL2RpYWxvZy5jCkBAIC0yMSw3ICsyMSw2IEBACiAjaW5jbHVkZSAid2lucHJvYy5oIgogI2luY2x1ZGUgIm1lc3NhZ2UuaCIKICNpbmNsdWRlICJzeXNtZXRyaWNzLmgiCi0jaW5jbHVkZSAic3RkZGVidWcuaCIKICNpbmNsdWRlICJkZWJ1Zy5oIgogCiAKQEAgLTg0LDcgKzgzLDcgQEAKICAgICBpZiAoISh0bS50bVBpdGNoQW5kRmFtaWx5ICYgVE1QRl9GSVhFRF9QSVRDSCkpCiAgICAgICAgIHhCYXNlVW5pdCA9IHhCYXNlVW5pdCAqIDUgLyA0OwogCi0gICAgZHByaW50Zl9kaWFsb2coIHN0ZGRlYiwgIkRJQUxPR19Jbml0OiBiYXNlIHVuaXRzID0gJWQsJWRcbiIsCisgICAgZHByaW50Zl9pbmZvKGRpYWxvZywgIkRJQUxPR19Jbml0OiBiYXNlIHVuaXRzID0gJWQsJWRcbiIsCiAgICAgICAgICAgICAgICAgICAgIHhCYXNlVW5pdCwgeUJhc2VVbml0ICk7CiAgICAgcmV0dXJuIFRSVUU7CiB9CkBAIC0xNDcsMTIgKzE0NiwxMiBAQAogICAgIHAgKz0gKnAgKyAxOwogCiAgICAgaWYoaW50X2lkKQotICAgICAgZHByaW50Zl9kaWFsb2coIHN0ZGRlYiwiICAgJXMgJTA0eCAlZCwgJWQsICVkLCAlZCwgJWQsICUwOGx4LCAlMDhseFxuIiwgCisgICAgICBkcHJpbnRmX2luZm8oZGlhbG9nLCIgICAlcyAlMDR4ICVkLCAlZCwgJWQsICVkLCAlZCwgJTA4bHgsICUwOGx4XG4iLCAKIAkJICAgICAgaW5mby0+Y2xhc3NOYW1lLCAgTE9XT1JEKGluZm8tPndpbmRvd05hbWUpLAogCQkgICAgICBpbmZvLT5pZCwgaW5mby0+eCwgaW5mby0+eSwgaW5mby0+Y3gsIGluZm8tPmN5LAogCQkgICAgICBpbmZvLT5zdHlsZSwgKERXT1JEKWluZm8tPmRhdGEpOwogICAgIGVsc2UKLSAgICAgIGRwcmludGZfZGlhbG9nKCBzdGRkZWIsIiAgICVzICclcycgJWQsICVkLCAlZCwgJWQsICVkLCAlMDhseCwgJTA4bHhcbiIsIAorICAgICAgZHByaW50Zl9pbmZvKGRpYWxvZywiICAgJXMgJyVzJyAlZCwgJWQsICVkLCAlZCwgJWQsICUwOGx4LCAlMDhseFxuIiwgCiAJCSAgICAgIGluZm8tPmNsYXNzTmFtZSwgIGluZm8tPndpbmRvd05hbWUsCiAJCSAgICAgIGluZm8tPmlkLCBpbmZvLT54LCBpbmZvLT55LCBpbmZvLT5jeCwgaW5mby0+Y3ksCiAJCSAgICAgIGluZm8tPnN0eWxlLCAoRFdPUkQpaW5mby0+ZGF0YSk7CkBAIC0yMjIsMTIgKzIyMSwxMiBAQAogICAgIHArKzsKIAogICAgIGlmKGludF9pZCkKLSAgICAgIGRwcmludGZfZGlhbG9nKCBzdGRkZWIsIiAgICVwICUwNHggJWQsICVkLCAlZCwgJWQsICVkLCAlMDhseCwgJTA4bHgsICUwOGx4XG4iLCAKKyAgICAgIGRwcmludGZfaW5mbyhkaWFsb2csIiAgICVwICUwNHggJWQsICVkLCAlZCwgJWQsICVkLCAlMDhseCwgJTA4bHgsICUwOGx4XG4iLCAKIAkJICAgICAgaW5mby0+Y2xhc3NOYW1lLCBMT1dPUkQoaW5mby0+d2luZG93TmFtZSksCiAJCSAgICAgIGluZm8tPmlkLCBpbmZvLT54LCBpbmZvLT55LCBpbmZvLT5jeCwgaW5mby0+Y3ksCiAJCSAgICAgIGluZm8tPnN0eWxlLCBpbmZvLT5leFN0eWxlLCAoRFdPUkQpaW5mby0+ZGF0YSk7CiAgICAgZWxzZQotICAgICAgZHByaW50Zl9kaWFsb2coIHN0ZGRlYiwiICAgJXAgJyVwJyAlZCwgJWQsICVkLCAlZCwgJWQsICUwOGx4LCAlMDhseCwgJTA4bHhcbiIsIAorICAgICAgZHByaW50Zl9pbmZvKGRpYWxvZywiICAgJXAgJyVwJyAlZCwgJWQsICVkLCAlZCwgJWQsICUwOGx4LCAlMDhseCwgJTA4bHhcbiIsIAogCQkgICAgICBpbmZvLT5jbGFzc05hbWUsIGluZm8tPndpbmRvd05hbWUsCiAJCSAgICAgIGluZm8tPmlkLCBpbmZvLT54LCBpbmZvLT55LCBpbmZvLT5jeCwgaW5mby0+Y3ksCiAJCSAgICAgIGluZm8tPnN0eWxlLCBpbmZvLT5leFN0eWxlLCAoRFdPUkQpaW5mby0+ZGF0YSk7CkBAIC0yNDksNyArMjQ4LDcgQEAKICAgICBETEdfQ09OVFJPTF9JTkZPIGluZm87CiAgICAgSFdORDMyIGh3bmRDdHJsLCBod25kRGVmQnV0dG9uID0gMDsKIAotICAgIGRwcmludGZfZGlhbG9nKHN0ZGRlYiwgIiBCRUdJTlxuIiApOworICAgIGRwcmludGZfaW5mbyhkaWFsb2csICIgQkVHSU5cbiIgKTsKICAgICB3aGlsZSAoaXRlbXMtLSkKICAgICB7CiAgICAgICAgIGlmICghd2luMzIpCkBAIC0zMTMsNyArMzEyLDcgQEAKICAgICAgICAgICAgIGRsZ0luZm8tPmlkUmVzdWx0ID0gR2V0V2luZG93V29yZDMyKCBod25kQ3RybCwgR1dXX0lEICk7CiAgICAgICAgIH0KICAgICB9ICAgIAotICAgIGRwcmludGZfZGlhbG9nKHN0ZGRlYiwgIiBFTkRcbiIgKTsKKyAgICBkcHJpbnRmX2luZm8oZGlhbG9nLCAiIEVORFxuIiApOwogICAgIHJldHVybiBUUlVFOwogfQogCkBAIC0zMzMsOSArMzMyLDkgQEAKICAgICByZXN1bHQtPnkgICAgICAgPSBHRVRfV09SRChwKTsgIHAgKz0gc2l6ZW9mKFdPUkQpOwogICAgIHJlc3VsdC0+Y3ggICAgICA9IEdFVF9XT1JEKHApOyAgcCArPSBzaXplb2YoV09SRCk7CiAgICAgcmVzdWx0LT5jeSAgICAgID0gR0VUX1dPUkQocCk7ICBwICs9IHNpemVvZihXT1JEKTsKLSAgICBkcHJpbnRmX2RpYWxvZyggc3RkZGViLCAiRElBTE9HICVkLCAlZCwgJWQsICVkXG4iLAorICAgIGRwcmludGZfaW5mbyhkaWFsb2csICJESUFMT0cgJWQsICVkLCAlZCwgJWRcbiIsCiAgICAgICAgICAgICAgICAgICAgIHJlc3VsdC0+eCwgcmVzdWx0LT55LCByZXN1bHQtPmN4LCByZXN1bHQtPmN5ICk7Ci0gICAgZHByaW50Zl9kaWFsb2coIHN0ZGRlYiwgIiBTVFlMRSAlMDhseFxuIiwgcmVzdWx0LT5zdHlsZSApOworICAgIGRwcmludGZfaW5mbyhkaWFsb2csICIgU1RZTEUgJTA4bHhcbiIsIHJlc3VsdC0+c3R5bGUgKTsKIAogICAgIC8qIEdldCB0aGUgbWVudSBuYW1lICovCiAKQEAgLTM0OCwxMSArMzQ3LDExIEBACiAgICAgY2FzZSAweGZmOgogICAgICAgICByZXN1bHQtPm1lbnVOYW1lID0gKExQQ1NUUikoVUlOVDMyKUdFVF9XT1JEKCBwICsgMSApOwogICAgICAgICBwICs9IDM7Ci0JZHByaW50Zl9kaWFsb2coc3RkZGViLCAiIE1FTlUgJTA0eFxuIiwgTE9XT1JEKHJlc3VsdC0+bWVudU5hbWUpICk7CisJZHByaW50Zl9pbmZvKGRpYWxvZywgIiBNRU5VICUwNHhcbiIsIExPV09SRChyZXN1bHQtPm1lbnVOYW1lKSApOwogICAgICAgICBicmVhazsKICAgICBkZWZhdWx0OgogICAgICAgICByZXN1bHQtPm1lbnVOYW1lID0gcDsKLSAgICAgICAgZHByaW50Zl9kaWFsb2coIHN0ZGRlYiwgIiBNRU5VICclcydcbiIsIHAgKTsKKyAgICAgICAgZHByaW50Zl9pbmZvKGRpYWxvZywgIiBNRU5VICclcydcbiIsIHAgKTsKICAgICAgICAgcCArPSBzdHJsZW4ocCkgKyAxOwogICAgICAgICBicmVhazsKICAgICB9CkBAIC0zNjIsNyArMzYxLDcgQEAKICAgICBpZiAoKnApCiAgICAgewogICAgICAgICByZXN1bHQtPmNsYXNzTmFtZSA9IHA7Ci0gICAgICAgIGRwcmludGZfZGlhbG9nKCBzdGRkZWIsICIgQ0xBU1MgJyVzJ1xuIiwgcmVzdWx0LT5jbGFzc05hbWUgKTsKKyAgICAgICAgZHByaW50Zl9pbmZvKGRpYWxvZywgIiBDTEFTUyAnJXMnXG4iLCByZXN1bHQtPmNsYXNzTmFtZSApOwogICAgIH0KICAgICBlbHNlIHJlc3VsdC0+Y2xhc3NOYW1lID0gRElBTE9HX0NMQVNTX0FUT007CiAgICAgcCArPSBzdHJsZW4ocCkgKyAxOwpAQCAtMzcxLDcgKzM3MCw3IEBACiAKICAgICByZXN1bHQtPmNhcHRpb24gPSBwOwogICAgIHAgKz0gc3RybGVuKHApICsgMTsKLSAgICBkcHJpbnRmX2RpYWxvZyggc3RkZGViLCAiIENBUFRJT04gJyVzJ1xuIiwgcmVzdWx0LT5jYXB0aW9uICk7CisgICAgZHByaW50Zl9pbmZvKGRpYWxvZywgIiBDQVBUSU9OICclcydcbiIsIHJlc3VsdC0+Y2FwdGlvbiApOwogCiAgICAgLyogR2V0IHRoZSBmb250IG5hbWUgKi8KIApAQCAtMzgxLDcgKzM4MCw3IEBACiAgICAgICAgIHAgKz0gc2l6ZW9mKFdPUkQpOwogCXJlc3VsdC0+ZmFjZU5hbWUgPSBwOwogICAgICAgICBwICs9IHN0cmxlbihwKSArIDE7Ci0JZHByaW50Zl9kaWFsb2coIHN0ZGRlYiwgIiBGT05UICVkLCclcydcbiIsCisJZHByaW50Zl9pbmZvKGRpYWxvZywgIiBGT05UICVkLCclcydcbiIsCiAgICAgICAgICAgICAgICAgICAgICAgICByZXN1bHQtPnBvaW50U2l6ZSwgcmVzdWx0LT5mYWNlTmFtZSApOwogICAgIH0KICAgICByZXR1cm4gcDsKQEAgLTQwNSwxMCArNDA0LDEwIEBACiAgICAgcmVzdWx0LT55ICAgICAgID0gR0VUX1dPUkQocCk7IHArKzsKICAgICByZXN1bHQtPmN4ICAgICAgPSBHRVRfV09SRChwKTsgcCsrOwogICAgIHJlc3VsdC0+Y3kgICAgICA9IEdFVF9XT1JEKHApOyBwKys7Ci0gICAgZHByaW50Zl9kaWFsb2coIHN0ZGRlYiwgIkRJQUxPRyAlZCwgJWQsICVkLCAlZFxuIiwKKyAgICBkcHJpbnRmX2luZm8oZGlhbG9nLCAiRElBTE9HICVkLCAlZCwgJWQsICVkXG4iLAogICAgICAgICAgICAgICAgICAgICByZXN1bHQtPngsIHJlc3VsdC0+eSwgcmVzdWx0LT5jeCwgcmVzdWx0LT5jeSApOwotICAgIGRwcmludGZfZGlhbG9nKCBzdGRkZWIsICIgU1RZTEUgJTA4bHhcbiIsIHJlc3VsdC0+c3R5bGUgKTsKLSAgICBkcHJpbnRmX2RpYWxvZyggc3RkZGViLCAiIEVYU1RZTEUgJTA4bHhcbiIsIHJlc3VsdC0+ZXhTdHlsZSApOworICAgIGRwcmludGZfaW5mbyhkaWFsb2csICIgU1RZTEUgJTA4bHhcbiIsIHJlc3VsdC0+c3R5bGUgKTsKKyAgICBkcHJpbnRmX2luZm8oZGlhbG9nLCAiIEVYU1RZTEUgJTA4bHhcbiIsIHJlc3VsdC0+ZXhTdHlsZSApOwogCiAgICAgLyogR2V0IHRoZSBtZW51IG5hbWUgKi8KIApAQCAtNDIxLDExICs0MjAsMTEgQEAKICAgICBjYXNlIDB4ZmZmZjoKICAgICAgICAgcmVzdWx0LT5tZW51TmFtZSA9IChMUENTVFIpKFVJTlQzMilHRVRfV09SRCggcCArIDEgKTsKICAgICAgICAgcCArPSAyOwotCWRwcmludGZfZGlhbG9nKHN0ZGRlYiwgIiBNRU5VICUwNHhcbiIsIExPV09SRChyZXN1bHQtPm1lbnVOYW1lKSApOworCWRwcmludGZfaW5mbyhkaWFsb2csICIgTUVOVSAlMDR4XG4iLCBMT1dPUkQocmVzdWx0LT5tZW51TmFtZSkgKTsKICAgICAgICAgYnJlYWs7CiAgICAgZGVmYXVsdDoKICAgICAgICAgcmVzdWx0LT5tZW51TmFtZSA9IChMUENTVFIpcDsKLSAgICAgICAgZHByaW50Zl9kaWFsb2coIHN0ZGRlYiwgIiBNRU5VICclcCdcbiIsIHAgKTsKKyAgICAgICAgZHByaW50Zl9pbmZvKGRpYWxvZywgIiBNRU5VICclcCdcbiIsIHAgKTsKICAgICAgICAgcCArPSBsc3RybGVuMzJXKCAoTFBDV1NUUilwICkgKyAxOwogICAgICAgICBicmVhazsKICAgICB9CkBAIC00NDEsMTEgKzQ0MCwxMSBAQAogICAgIGNhc2UgMHhmZmZmOgogICAgICAgICByZXN1bHQtPmNsYXNzTmFtZSA9IChMUENTVFIpKFVJTlQzMilHRVRfV09SRCggcCArIDEgKTsKICAgICAgICAgcCArPSAyOwotCWRwcmludGZfZGlhbG9nKHN0ZGRlYiwgIiBDTEFTUyAlMDR4XG4iLCBMT1dPUkQocmVzdWx0LT5jbGFzc05hbWUpICk7CisJZHByaW50Zl9pbmZvKGRpYWxvZywgIiBDTEFTUyAlMDR4XG4iLCBMT1dPUkQocmVzdWx0LT5jbGFzc05hbWUpICk7CiAgICAgICAgIGJyZWFrOwogICAgIGRlZmF1bHQ6CiAgICAgICAgIHJlc3VsdC0+Y2xhc3NOYW1lID0gKExQQ1NUUilwOwotICAgICAgICBkcHJpbnRmX2RpYWxvZyggc3RkZGViLCAiIENMQVNTICclcCdcbiIsIHAgKTsKKyAgICAgICAgZHByaW50Zl9pbmZvKGRpYWxvZywgIiBDTEFTUyAnJXAnXG4iLCBwICk7CiAgICAgICAgIHAgKz0gbHN0cmxlbjMyVyggKExQQ1dTVFIpcCApICsgMTsKICAgICAgICAgYnJlYWs7CiAgICAgfQpAQCAtNDU0LDcgKzQ1Myw3IEBACiAKICAgICByZXN1bHQtPmNhcHRpb24gPSAoTFBDU1RSKXA7CiAgICAgcCArPSBsc3RybGVuMzJXKCAoTFBDV1NUUilwICkgKyAxOwotICAgIGRwcmludGZfZGlhbG9nKCBzdGRkZWIsICIgQ0FQVElPTiAnJXAnXG4iLCByZXN1bHQtPmNhcHRpb24gKTsKKyAgICBkcHJpbnRmX2luZm8oZGlhbG9nLCAiIENBUFRJT04gJyVwJ1xuIiwgcmVzdWx0LT5jYXB0aW9uICk7CiAKICAgICAvKiBHZXQgdGhlIGZvbnQgbmFtZSAqLwogCkBAIC00NjQsNyArNDYzLDcgQEAKICAgICAgICAgcCsrOwogCXJlc3VsdC0+ZmFjZU5hbWUgPSAoTFBDU1RSKXA7CiAgICAgICAgIHAgKz0gbHN0cmxlbjMyVyggKExQQ1dTVFIpcCApICsgMTsKLQlkcHJpbnRmX2RpYWxvZyggc3RkZGViLCAiIEZPTlQgJWQsJyVwJ1xuIiwKKwlkcHJpbnRmX2luZm8oZGlhbG9nLCAiIEZPTlQgJWQsJyVwJ1xuIiwKICAgICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdC0+cG9pbnRTaXplLCByZXN1bHQtPmZhY2VOYW1lICk7CiAgICAgfQogICAgIC8qIEZpcnN0IGNvbnRyb2wgaXMgb24gZHdvcmQgYm91bmRhcnkgKi8KQEAgLTY2Nyw3ICs2NjYsNyBAQAogICAgIEhHTE9CQUwxNiBobWVtOwogICAgIExQQ1ZPSUQgZGF0YTsKIAotICAgIGRwcmludGZfZGlhbG9nKHN0ZGRlYiwgIkNyZWF0ZURpYWxvZ1BhcmFtMTY6ICUwNHgsJTA4bHgsJTA0eCwlMDhseCwlbGRcbiIsCisgICAgZHByaW50Zl9pbmZvKGRpYWxvZywgIkNyZWF0ZURpYWxvZ1BhcmFtMTY6ICUwNHgsJTA4bHgsJTA0eCwlMDhseCwlbGRcbiIsCiAgICAgICAgICAgICAgICAgICAgaEluc3QsIChEV09SRClkbGdUZW1wbGF0ZSwgb3duZXIsIChEV09SRClkbGdQcm9jLCBwYXJhbSApOwogCiAgICAgaWYgKCEoaFJzcmMgPSBGaW5kUmVzb3VyY2UxNiggaEluc3QsIGRsZ1RlbXBsYXRlLCBSVF9ESUFMT0cgKSkpIHJldHVybiAwOwpAQCAtOTE1LDcgKzkxNCw3IEBACiAgICAgV05EICogd25kUHRyID0gV0lOX0ZpbmRXbmRQdHIoIGh3bmQgKTsKICAgICBESUFMT0dJTkZPICogZGxnSW5mbyA9IChESUFMT0dJTkZPICopd25kUHRyLT53RXh0cmE7CiAKLSAgICBkcHJpbnRmX2RpYWxvZyhzdGRkZWIsICJFbmREaWFsb2c6ICUwNHggJWRcbiIsIGh3bmQsIHJldHZhbCApOworICAgIGRwcmludGZfaW5mbyhkaWFsb2csICJFbmREaWFsb2c6ICUwNHggJWRcbiIsIGh3bmQsIHJldHZhbCApOwogCiAgICAgaWYoIGRsZ0luZm8gKQogICAgIHsKQEAgLTE1NTcsNyArMTU1Niw3IEBACiAgICAgQk9PTDMyIHJldDsKICAgICBIV05EMzIgbGlzdGJveCA9IEdldERsZ0l0ZW0zMiggaHduZCwgaWQgKTsKIAotICAgIGRwcmludGZfZGlhbG9nKCBzdGRkZWIsICJEbGdEaXJTZWxlY3Q6ICUwNHggJyVzJyAlZFxuIiwgaHduZCwgc3RyLCBpZCApOworICAgIGRwcmludGZfaW5mbyhkaWFsb2csICJEbGdEaXJTZWxlY3Q6ICUwNHggJyVzJyAlZFxuIiwgaHduZCwgc3RyLCBpZCApOwogICAgIGlmICghbGlzdGJveCkgcmV0dXJuIEZBTFNFOwogICAgIGlmICh3aW4zMikKICAgICB7CkBAIC0xNjA2LDcgKzE2MDUsNyBAQAogICAgIGlmICh1bmljb2RlKSBsc3RyY3B5bkF0b1coIChMUFdTVFIpc3RyLCBwdHIsIGxlbiApOwogICAgIGVsc2UgbHN0cmNweW4zMkEoIHN0ciwgcHRyLCBsZW4gKTsKICAgICBTRUdQVFJfRlJFRSggYnVmZmVyICk7Ci0gICAgZHByaW50Zl9kaWFsb2coIHN0ZGRlYiwgIlJldHVybmluZyAlZCAnJXMnXG4iLCByZXQsIHN0ciApOworICAgIGRwcmludGZfaW5mbyhkaWFsb2csICJSZXR1cm5pbmcgJWQgJyVzJ1xuIiwgcmV0LCBzdHIgKTsKICAgICByZXR1cm4gcmV0OwogfQogCkBAIC0xNjI3LDcgKzE2MjYsNyBAQAogICAgICgoYXR0cmliICYgRERMX1BPU1RNU0dTKSA/IFBvc3RNZXNzYWdlMzJBKCBod25kLCBtc2csIHdwYXJhbSwgbHBhcmFtICkgXAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6IFNlbmRNZXNzYWdlMzJBKCBod25kLCBtc2csIHdwYXJhbSwgbHBhcmFtICkpCiAKLSAgICBkcHJpbnRmX2RpYWxvZyggc3RkZGViLCAiRGxnRGlyTGlzdDogJTA0eCAnJXMnICVkICVkICUwNHhcbiIsCisgICAgZHByaW50Zl9pbmZvKGRpYWxvZywgIkRsZ0Rpckxpc3Q6ICUwNHggJyVzJyAlZCAlZCAlMDR4XG4iLAogICAgICAgICAgICAgICAgICAgICBoRGxnLCBzcGVjID8gc3BlYyA6ICJOVUxMIiwgaWRMQm94LCBpZFN0YXRpYywgYXR0cmliICk7CiAKICAgICBpZiAoc3BlYyAmJiBzcGVjWzBdICYmIChzcGVjWzFdID09ICc6JykpCkBAIC0xNjU5LDcgKzE2NTgsNyBAQAogICAgICAgICB9CiAgICAgfQogCi0gICAgZHByaW50Zl9kaWFsb2coIHN0ZGRlYiwgIkxpc3RCb3hEaXJlY3Rvcnk6IHBhdGg9JWM6XFwlcyBtYXNrPSVzXG4iLAorICAgIGRwcmludGZfaW5mbyhkaWFsb2csICJMaXN0Qm94RGlyZWN0b3J5OiBwYXRoPSVjOlxcJXMgbWFzaz0lc1xuIiwKICAgICAgICAgICAgICAgICAgICAgJ0EnICsgZHJpdmUsIERSSVZFX0dldERvc0N3ZChkcml2ZSksIHNwZWMgKTsKIAogICAgIGlmIChpZExCb3ggJiYgKChod25kID0gR2V0RGxnSXRlbTMyKCBoRGxnLCBpZExCb3ggKSkgIT0gMCkpCmRpZmYgLS1naXQgYS93aW5kb3dzL2RpbnB1dC5jIGIvd2luZG93cy9kaW5wdXQuYwppbmRleCA1ZjUxMGNkLi4xMDE0MzVmIDEwMDY0NAotLS0gYS93aW5kb3dzL2RpbnB1dC5jCisrKyBiL3dpbmRvd3MvZGlucHV0LmMKQEAgLTUsOSArNSwxMyBAQAogLyogU3RhdHVzOgogICoKICAqIC0gVG9tYiBSYWlkZXIgMiBEZW1vOgotICogICBEb2Vzbid0IGFjY2VwdCBpbnB1dCB5ZXQuIEFsdGhvdWdoIEkgYW0gc3VyZSBJJ3ZlIGRvbmUgZXZlcnl0aGluZyByaWdodC4uLgorICogICBQbGF5YWJsZSB1c2luZyBrZXlib2FyZCBvbmx5LgogICogLSBXaW5nQ29tbWFuZGVyIFByb3BoZWN5IERlbW86Ci0gKiAgIGRpdG8uCisgKiAgIERvZXNuJ3QgZ2V0IElucHV0IEZvY3VzLgorICogCisgKiBGSVhNRTogVGhlIGtleWJvYXJkIGhhbmRsaW5nIG5lZWRzIHRvIChhbmQgd2lsbCkgYmUgbWVyZ2VkIGludG8ga2V5Ym9hcmQuYworICoJICAoVGhlIGN1cnJlbnQgaW1wbGVtZW50YXRpb24gaXMgY3VycmVudGx5IG9ubHkgYSBwcm9vZiBvZiBjb25jZXB0IGFuZAorICoJICAgYW4gdXR0ZXIgbWVzcy4pCiAgKi8KIAogI2luY2x1ZGUgImNvbmZpZy5oIgpAQCAtMjgsOSArMzIsMTEgQEAKICNpbmNsdWRlICJoZWFwLmgiCiAjaW5jbHVkZSAid2luLmgiCiAjaW5jbHVkZSAiZGlucHV0LmgiCi0jaW5jbHVkZSAic3RkZGVidWcuaCIKICNpbmNsdWRlICJkZWJ1Zy5oIgogCitleHRlcm4gQllURSBJbnB1dEtleVN0YXRlVGFibGVbMjU2XTsKK2V4dGVybiBCWVRFIHZrZXkyc2NvZGVbNTEyXTsKKwogc3RhdGljIElEaXJlY3RJbnB1dEFfVlRhYmxlIGRkaWF2dDsKIHN0YXRpYyBJRGlyZWN0SW5wdXREZXZpY2VBX1ZUYWJsZSBTeXNLZXlib2FyZEF2dDsKIHN0YXRpYyBJRGlyZWN0SW5wdXREZXZpY2VBX1ZUYWJsZSBTeXNNb3VzZUF2dDsKQEAgLTczLDEzICs3OSwxNCBAQAogKSB7CiAJY2hhcgl4YnVmWzUwXTsKIAkKLQlTdHJpbmdGcm9tQ0xTSUQocmd1aWQseGJ1Zik7CisJV0lORV9TdHJpbmdGcm9tQ0xTSUQocmd1aWQseGJ1Zik7CiAJZnByaW50ZihzdGRlcnIsIklEaXJlY3RJbnB1dEEoJXApLT5DcmVhdGVEZXZpY2UoJXMsJXAsJXApLHN0dWIhXG4iLHRoaXMseGJ1ZixwZGV2LHB1bmspOwogCWlmICghbWVtY21wKCZHVUlEX1N5c0tleWJvYXJkLHJndWlkLHNpemVvZihHVUlEX1N5c0tleWJvYXJkKSkpIHsKLQkJKnBkZXYgPSBIZWFwQWxsb2MoR2V0UHJvY2Vzc0hlYXAoKSxIRUFQX1pFUk9fTUVNT1JZLHNpemVvZihJRGlyZWN0SW5wdXREZXZpY2UzMkEpKTsKKwkJKnBkZXYgPSBIZWFwQWxsb2MoR2V0UHJvY2Vzc0hlYXAoKSxIRUFQX1pFUk9fTUVNT1JZLHNpemVvZihTeXNLZXlib2FyZDMyQSkpOwogCQkoKnBkZXYpLT5yZWYgPSAxOwogCQkoKnBkZXYpLT5scHZ0YmwgPSAmU3lzS2V5Ym9hcmRBdnQ7CiAJCW1lbWNweSgmKCgqcGRldiktPmd1aWQpLHJndWlkLHNpemVvZigqcmd1aWQpKTsKKwkJbWVtc2V0KCgoTFBTWVNLRVlCT0FSRDMyQSkoKnBkZXYpKS0+a2V5c3RhdGUsMCwyNTYpOwogCQlyZXR1cm4gMDsKIAl9CiAJaWYgKCFtZW1jbXAoJkdVSURfU3lzTW91c2Uscmd1aWQsc2l6ZW9mKEdVSURfU3lzTW91c2UpKSkgewpAQCAtOTcsNyArMTA0LDcgQEAKICkgewogCWNoYXIJeGJ1Zls1MF07CiAKLQlTdHJpbmdGcm9tQ0xTSUQocmlpZCx4YnVmKTsKKwlXSU5FX1N0cmluZ0Zyb21DTFNJRChyaWlkLHhidWYpOwogCWZwcmludGYoc3RkZXJyLCJJRGlyZWN0SW5wdXRBKCVwKS0+UXVlcnlJbnRlcmZhY2UoJXMsJXApXG4iLHRoaXMseGJ1ZixwcG9iaik7CiAJaWYgKCFtZW1jbXAoJklJRF9JVW5rbm93bixyaWlkLHNpemVvZigqcmlpZCkpKSB7CiAJCXRoaXMtPmxwdnRibC0+Zm5BZGRSZWYodGhpcyk7CkBAIC0xMTIsNiArMTE5LDEyIEBACiAJcmV0dXJuIEVfRkFJTDsKIH0KIAorc3RhdGljIEhSRVNVTFQgV0lOQVBJIElEaXJlY3RJbnB1dEFfSW5pdGlhbGl6ZSgKKwlMUERJUkVDVElOUFVUMzJBIHRoaXMsSElOU1RBTkNFMzIgaGluc3QsRFdPUkQgeAorKSB7CisJcmV0dXJuIERJRVJSX0FMUkVBRFlJTklUSUFMSVpFRDsKK30KKwogc3RhdGljIElEaXJlY3RJbnB1dEFfVlRhYmxlIGRkaWF2dD0gewogCUlEaXJlY3RJbnB1dEFfUXVlcnlJbnRlcmZhY2UsCiAJSURpcmVjdElucHV0QV9BZGRSZWYsCkBAIC0xMjAsNyArMTMzLDcgQEAKIAlJRGlyZWN0SW5wdXRBX0VudW1EZXZpY2VzLAogCSh2b2lkKik2LAogCSh2b2lkKik3LAotCSh2b2lkKik4CisJSURpcmVjdElucHV0QV9Jbml0aWFsaXplCiB9OwogCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCkBAIC0xNDMsNyArMTU2LDcgQEAKIAkJY2hhcgl4YnVmWzUwXTsKIAogCQlpZiAoZGYtPnJnb2RmW2ldLnBndWlkKQotCQkJU3RyaW5nRnJvbUNMU0lEKGRmLT5yZ29kZltpXS5wZ3VpZCx4YnVmKTsKKwkJCVdJTkVfU3RyaW5nRnJvbUNMU0lEKGRmLT5yZ29kZltpXS5wZ3VpZCx4YnVmKTsKIAkJZWxzZQogCQkJc3RyY3B5KHhidWYsIjxubyBndWlkPiIpOwogCQlmcHJpbnRmKHN0ZGVyciwiZGYucmdvZGZbJWRdLmd1aWQgJXNcbiIsaSx4YnVmKTsKQEAgLTE2OCwxMCArMTgxLDIzIEBACiAJY2hhcgl4YnVmWzUwXTsKIAogCWlmIChISVdPUkQocmd1aWQpKQotCQlTdHJpbmdGcm9tQ0xTSUQocmd1aWQseGJ1Zik7CisJCVdJTkVfU3RyaW5nRnJvbUNMU0lEKHJndWlkLHhidWYpOwogCWVsc2UKLQkJc3RyY3B5KHhidWYsIjxubyBndWlkPiIpOworCQlzcHJpbnRmKHhidWYsIjxzcGVjaWFsIGd1aWQgJWxkPiIsKERXT1JEKXJndWlkKTsKIAlmcHJpbnRmKHN0ZGVyciwiSURpcmVjdElucHV0RGV2aWNlQSglcCktPlNldFByb3BlcnR5KCVzLCVwKVxuIix0aGlzLHhidWYscGgpOworCWlmICghSElXT1JEKHJndWlkKSkgeworCQlzd2l0Y2ggKChEV09SRClyZ3VpZCkgeworCQljYXNlIERJUFJPUF9CVUZGRVJTSVpFOiB7CisJCQlMUENESVBST1BEV09SRAlwZCA9IChMUENESVBST1BEV09SRClwaDsKKworCQkJZnByaW50ZihzdGRlcnIsIglidWZmZXJzaXplID0gJWxkXG4iLHBkLT5kd0RhdGEpOworCQkJYnJlYWs7CisJCX0KKwkJZGVmYXVsdDoKKwkJCWZwcmludGYoc3RkZXJyLCIJdW5rbm93biB0eXBlICVsZFxuIiwoRFdPUkQpcmd1aWQpOworCQkJYnJlYWs7CisJCX0KKwl9CiAJcmV0dXJuIDA7CiB9CiAKQEAgLTE4MywxNSArMjA5LDE0IEBACiB9CiAKIHN0YXRpYyBIUkVTVUxUIFdJTkFQSSBJRGlyZWN0SW5wdXREZXZpY2VBX0dldERldmljZURhdGEoCi0JTFBESVJFQ1RJTlBVVERFVklDRTMyQSB0aGlzLERXT1JEIHgsTFBESURFVklDRU9CSkVDVERBVEEgZG9kLAotCUxQRFdPUkQgeSxEV09SRCB6CisJTFBESVJFQ1RJTlBVVERFVklDRTMyQSB0aGlzLERXT1JEIGRvZHNpemUsTFBESURFVklDRU9CSkVDVERBVEEgZG9kLAorCUxQRFdPUkQgZW50cmllcyxEV09SRCBmbGFncwogKSB7Ci0vKgotCWZwcmludGYoc3RkZXJyLCJJRGlyZWN0SW5wdXREZXZpY2VBKCVwKS0+R2V0RGV2aWNlRGF0YSgweCUwOGx4LCVwLCVwLDB4JTA4bHgpXG4iLHRoaXMseCxkb2QseSx6KTsKLSAqLworLyoJZnByaW50ZihzdGRlcnIsIklEaXJlY3RJbnB1dERldmljZUEoJXApLT5HZXREZXZpY2VEYXRhKCVsZCwlcCwlcCgweCUwOGx4KSwweCUwOGx4KVxuIix0aGlzLGRvZHNpemUsZG9kLGVudHJpZXMsKmVudHJpZXMsZmxhZ3MpOyovCiAJcmV0dXJuIDA7CiB9CiAKKwogc3RhdGljIEhSRVNVTFQgV0lOQVBJIElEaXJlY3RJbnB1dERldmljZUFfQWNxdWlyZShMUERJUkVDVElOUFVUREVWSUNFMzJBIHRoaXMpIHsKIAlmcHJpbnRmKHN0ZGVyciwiSURpcmVjdElucHV0RGV2aWNlQSglcCktPkFxdWlyZSgpXG4iLHRoaXMpOwogCXJldHVybiAwOwpAQCAtMjEwLDI5ICsyMzUsMTAwIEBACiAJcmV0dXJuIDA7CiB9CiAKK3N0YXRpYyBIUkVTVUxUIFdJTkFQSSBTeXNLZXlib2FyZEFfU2V0UHJvcGVydHkoCisJTFBESVJFQ1RJTlBVVERFVklDRTMyQSB0aGlzLFJFRkdVSUQgcmd1aWQsTFBDRElQUk9QSEVBREVSIHBoCispIHsKKwlMUFNZU0tFWUJPQVJEMzJBCWt0aGlzID0gKExQU1lTS0VZQk9BUkQzMkEpdGhpczsKKwljaGFyCQkJeGJ1Zls1MF07CiAKLWV4dGVybiBCWVRFIElucHV0S2V5U3RhdGVUYWJsZVsyNTZdOwotZXh0ZXJuIEJZVEUgdmtleTJzY29kZVs1MTJdOworCWlmIChISVdPUkQocmd1aWQpKQorCQlXSU5FX1N0cmluZ0Zyb21DTFNJRChyZ3VpZCx4YnVmKTsKKwllbHNlCisJCXNwcmludGYoeGJ1ZiwiPHNwZWNpYWwgZ3VpZCAlbGQ+IiwoRFdPUkQpcmd1aWQpOworCWZwcmludGYoc3RkZXJyLCJTeXNLZXlib2FyZEEoJXApLT5TZXRQcm9wZXJ0eSglcywlcClcbiIsdGhpcyx4YnVmLHBoKTsKKwlmcHJpbnRmKHN0ZGVyciwiCXNpemUgaXMgJWxkLCBoZWFkZXJzaXplIGlzICVsZCxvYmogaXMgJWxkLGhvdyBpcyAlbGRcbiIscGgtPmR3U2l6ZSxwaC0+ZHdIZWFkZXJTaXplLHBoLT5kd09iaixwaC0+ZHdIb3cpOworCWlmICghSElXT1JEKHJndWlkKSkgeworCQlzd2l0Y2ggKChEV09SRClyZ3VpZCkgeworCQljYXNlIERJUFJPUF9CVUZGRVJTSVpFOiB7CisJCQlMUENESVBST1BEV09SRAlwZCA9IChMUENESVBST1BEV09SRClwaDsKKworCQkJZnByaW50ZihzdGRlcnIsIglidWZmZXJzaXplID0gJWxkXG4iLHBkLT5kd0RhdGEpOworCQkJYnJlYWs7CisJCX0KKwkJZGVmYXVsdDoKKwkJCWZwcmludGYoc3RkZXJyLCIJdW5rbm93biB0eXBlICVsZFxuIiwoRFdPUkQpcmd1aWQpOworCQkJYnJlYWs7CisJCX0KKwl9CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBIUkVTVUxUIFdJTkFQSSBTeXNLZXlib2FyZEFfR2V0RGV2aWNlU3RhdGUoCisJTFBESVJFQ1RJTlBVVERFVklDRTMyQSB0aGlzLERXT1JEIGxlbixMUFZPSUQgcHRyCispIHsKKwlpZiAobGVuPT0yNTYpIHsKKwkJaW50CWk7CisKKwkJbWVtc2V0KHB0ciwwLDI1Nik7CisJCWZvciAoaT0wO2k8MjU2O2krKykKKwkJCWlmIChJbnB1dEtleVN0YXRlVGFibGVbaV0mMHg4MCkgeworCQkJCSgoTFBCWVRFKXB0cilbdmtleTJzY29kZVtpXSAgICAgXT0weDgwOworCQkJCSgoTFBCWVRFKXB0cilbdmtleTJzY29kZVtpXXwweDgwXT0weDgwOworCQkJfQorCQlyZXR1cm4gMDsKKwl9CisJZnByaW50ZihzdGRlcnIsIndob29wcywgU3lzS2V5Ym9hcmRBX0dldERldmljZVN0YXRlIGdvdCBsZW4gJWxkP1xuIixsZW4pOworCXJldHVybiAwOworfQorCitzdGF0aWMgSFJFU1VMVCBXSU5BUEkgU3lzS2V5Ym9hcmRBX0dldERldmljZURhdGEoCisJTFBESVJFQ1RJTlBVVERFVklDRTMyQSB0aGlzLERXT1JEIGRvZHNpemUsTFBESURFVklDRU9CSkVDVERBVEEgZG9kLAorCUxQRFdPUkQgZW50cmllcyxEV09SRCBmbGFncworKSB7CisJaW50CQkJaSxuLHhlbnRyaWVzOworCUxQU1lTS0VZQk9BUkQzMkEJa3RoaXMgPSAoTFBTWVNLRVlCT0FSRDMyQSl0aGlzOworCisvKglmcHJpbnRmKHN0ZGVyciwiU3lzS2V5Ym9hcmRBKCVwKS0+R2V0RGV2aWNlRGF0YSglbGQsJXAsJXAoJWxkKSwweCUwOGx4KVxuIix0aGlzLGRvZHNpemUsZG9kLGVudHJpZXMsZW50cmllcz8qZW50cmllczowLGZsYWdzKTsqLworCWlmIChlbnRyaWVzKQorCQl4ZW50cmllcyA9ICplbnRyaWVzOyAKKwllbHNlCisJCXhlbnRyaWVzID0gMTsKKworCWZvciAobj1pPTA7KGk8MjU2KSAmJiAobjwqZW50cmllcyk7aSsrKSB7CisJCWlmIChrdGhpcy0+a2V5c3RhdGVbaV0gPT0gKElucHV0S2V5U3RhdGVUYWJsZVtpXSYweDgwKSkKKwkJCWNvbnRpbnVlOworCQlpZiAoZG9kKSB7CisJCQkvKiBhZGQgYW4gZW50cnkgKi8KKwkJCWRvZFtuXS5kd09mcwkJPSB2a2V5MnNjb2RlW2ldOworCQkJZG9kW25dLmR3RGF0YQkJPSBJbnB1dEtleVN0YXRlVGFibGVbaV0mMHg4MDsKKwkJCWRvZFtuXS5kd1RpbWVTdGFtcAk9IDA7IC8qIHVtbSAqLworCQkJZG9kW25dLmR3U2VxdWVuY2UJPSAwOyAvKiB1bW0gKi8KKwkJCW4rKzsKKwkJfQorCQlpZiAoIShmbGFncyAmIERJR0REX1BFRUspKQorCQkJa3RoaXMtPmtleXN0YXRlW2ldID0gSW5wdXRLZXlTdGF0ZVRhYmxlW2ldJjB4ODA7CisJfQorCSplbnRyaWVzID0gbjsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIEhSRVNVTFQgV0lOQVBJIFN5c0tleWJvYXJkQV9BY3F1aXJlKExQRElSRUNUSU5QVVRERVZJQ0UzMkEgdGhpcykgeworCWZwcmludGYoc3RkZXJyLCJTeXNLZXlib2FyZEEoJXApLT5BcXVpcmUoKVxuIix0aGlzKTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIEhSRVNVTFQgV0lOQVBJIFN5c0tleWJvYXJkQV9VbmFjcXVpcmUoTFBESVJFQ1RJTlBVVERFVklDRTMyQSB0aGlzKSB7CisJZnByaW50ZihzdGRlcnIsIlN5c0tleWJvYXJkQSglcCktPlVuYXF1aXJlKClcbiIsdGhpcyk7CisJcmV0dXJuIDA7Cit9CisKIAogc3RhdGljIEhSRVNVTFQgV0lOQVBJIElEaXJlY3RJbnB1dERldmljZUFfR2V0RGV2aWNlU3RhdGUoCiAJTFBESVJFQ1RJTlBVVERFVklDRTMyQSB0aGlzLERXT1JEIGxlbixMUFZPSUQgcHRyCiApIHsKLS8qCiAJZnByaW50ZihzdGRlcnIsIklEaXJlY3RJbnB1dERldmljZUEoJXApLT5HZXREZXZpY2VTdGF0ZSgweCUwOGx4LCVwKVxuIiwKIAkJdGhpcyxsZW4scHRyCiAJKTsKLSAqLwotCWlmIChsZW49PTI1Nikgey8qICYmIHRoaXNfaXNfYV9rZXlib2FyZCAqLwotCQlpbnQJaTsKLQotCQltZW1zZXQocHRyLDAsMjU2KTsKLQkJZm9yIChpPTA7aTwyNTY7aSsrKSB7Ci0JCQlpZiAoSW5wdXRLZXlTdGF0ZVRhYmxlW2ldJjB4ODApCi0JCQkJZnByaW50ZihzdGRlcnIsIlZLRVkgJWQgcHJlc3NlZCAoRElLIDB4JTAyeFxuIixpLHZrZXkyc2NvZGVbaV0pOwotCQkJKChMUEJZVEUpcHRyKVtpXT12a2V5MnNjb2RlW0lucHV0S2V5U3RhdGVUYWJsZVtpXV0mMHg4MDsKLQkJfQotCQlyZXR1cm4gMDsKLQl9CiAJcmV0dXJuIDA7CiB9CiAKQEAgLTI0MSw3ICszMzcsNyBAQAogKSB7CiAJY2hhcgl4YnVmWzUwXTsKIAotCVN0cmluZ0Zyb21DTFNJRChyaWlkLHhidWYpOworCVdJTkVfU3RyaW5nRnJvbUNMU0lEKHJpaWQseGJ1Zik7CiAJZnByaW50ZihzdGRlcnIsIklEaXJlY3RJbnB1dEEoJXApLT5RdWVyeUludGVyZmFjZSglcywlcClcbiIsdGhpcyx4YnVmLHBwb2JqKTsKIAlpZiAoIW1lbWNtcCgmSUlEX0lVbmtub3duLHJpaWQsc2l6ZW9mKCpyaWlkKSkpIHsKIAkJdGhpcy0+bHB2dGJsLT5mbkFkZFJlZih0aGlzKTsKQEAgLTI2MywxMSArMzU5LDExIEBACiAJKHZvaWQqKTQsCiAJKHZvaWQqKTUsCiAJKHZvaWQqKTYsCi0JSURpcmVjdElucHV0RGV2aWNlQV9TZXRQcm9wZXJ0eSwKLQlJRGlyZWN0SW5wdXREZXZpY2VBX0FjcXVpcmUsCi0JSURpcmVjdElucHV0RGV2aWNlQV9VbmFjcXVpcmUsCi0JSURpcmVjdElucHV0RGV2aWNlQV9HZXREZXZpY2VTdGF0ZSwKLQlJRGlyZWN0SW5wdXREZXZpY2VBX0dldERldmljZURhdGEsCisJU3lzS2V5Ym9hcmRBX1NldFByb3BlcnR5LAorCVN5c0tleWJvYXJkQV9BY3F1aXJlLAorCVN5c0tleWJvYXJkQV9VbmFjcXVpcmUsCisJU3lzS2V5Ym9hcmRBX0dldERldmljZVN0YXRlLAorCVN5c0tleWJvYXJkQV9HZXREZXZpY2VEYXRhLAogCUlEaXJlY3RJbnB1dERldmljZUFfU2V0RGF0YUZvcm1hdCwKIAlJRGlyZWN0SW5wdXREZXZpY2VBX1NldEV2ZW50Tm90aWZpY2F0aW9uLAogCUlEaXJlY3RJbnB1dERldmljZUFfU2V0Q29vcGVyYXRpdmVMZXZlbCwKZGlmZiAtLWdpdCBhL3dpbmRvd3MvZHJpdmVyLmMgYi93aW5kb3dzL2RyaXZlci5jCmluZGV4IGRiYzg1MzEuLjg1ZWVmZTMgMTAwNjQ0Ci0tLSBhL3dpbmRvd3MvZHJpdmVyLmMKKysrIGIvd2luZG93cy9kcml2ZXIuYwpAQCAtMTAsNyArMTAsNiBAQAogI2luY2x1ZGUgImNhbGxiYWNrLmgiCiAjaW5jbHVkZSAiZHJpdmVyLmgiCiAjaW5jbHVkZSAibW9kdWxlLmgiCi0jaW5jbHVkZSAic3RkZGVidWcuaCIKICNpbmNsdWRlICJkZWJ1Zy5oIgogCiBMUERSSVZFUklURU0gbHBEcnZJdGVtTGlzdCA9IE5VTEw7CkBAIC0zMiwxMiArMzEsMTIgQEAKICAgICBwdHIgPSBzdHI7CiAgICAgd2hpbGUgKGxzdHJsZW4zMkEoIHB0ciApICE9IDApCiAgICAgewotCWRwcmludGZfZHJpdmVyKCBzdGRkZWIsICJMb2FkU3RhcnR1cERyaXZlcnMgLy8gc3RyPSclcydcbiIsIHB0ciApOworCWRwcmludGZfaW5mbyhkcml2ZXIsICJMb2FkU3RhcnR1cERyaXZlcnMgLy8gc3RyPSclcydcbiIsIHB0ciApOwogCWhEcnYgPSBPcGVuRHJpdmVyKCBwdHIsICJkcml2ZXJzIiwgMEwgKTsKLQlkcHJpbnRmX2RyaXZlciggc3RkZGViLCAiTG9hZFN0YXJ0dXBEcml2ZXJzIC8vIGhEcnY9JTA0eFxuIiwgaERydiApOworCWRwcmludGZfaW5mbyhkcml2ZXIsICJMb2FkU3RhcnR1cERyaXZlcnMgLy8gaERydj0lMDR4XG4iLCBoRHJ2ICk7CiAJcHRyICs9IGxzdHJsZW4zMkEocHRyKSArIDE7CiAgICAgfQotICAgIGRwcmludGZfZHJpdmVyKCBzdGRkZWIsICJMb2FkU3RhcnR1cERyaXZlcnMgLy8gZW5kIG9mIGxpc3QgIVxuIiApOworICAgIGRwcmludGZfaW5mbyhkcml2ZXIsICJMb2FkU3RhcnR1cERyaXZlcnMgLy8gZW5kIG9mIGxpc3QgIVxuIiApOwogCiAgICAgcmV0dXJuOwogfQpAQCAtNTEsNyArNTAsNyBAQAogICAgIExQRFJJVkVSSVRFTSBscGRydjsKICAgICBMUkVTVUxUIHJldHZhbDsKIAotICAgIGRwcmludGZfZHJpdmVyKCBzdGRkZWIsICJTZW5kRHJpdmVyTWVzc2FnZSglMDR4LCAlMDRYLCAlMDhsWCwgJTA4bFgpXG4iLAorICAgIGRwcmludGZfaW5mbyhkcml2ZXIsICJTZW5kRHJpdmVyTWVzc2FnZSglMDR4LCAlMDRYLCAlMDhsWCwgJTA4bFgpXG4iLAogCQkgICAgaERyaXZlciwgbXNnLCBsUGFyYW0xLCBsUGFyYW0yICk7CiAKICAgICBscGRydiA9IChMUERSSVZFUklURU0pR2xvYmFsTG9jazE2KCBoRHJpdmVyICk7CkBAIC02NCw3ICs2Myw3IEBACiAgICAgcmV0dmFsID0gQ2FsbGJhY2tzLT5DYWxsRHJpdmVyUHJvYyggbHBkcnYtPmxwRHJ2UHJvYywgMEwgLyogRklYTUUgKi8sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaERyaXZlciwgbXNnLCBsUGFyYW0xLCBsUGFyYW0yICk7CiAKLSAgICBkcHJpbnRmX2RyaXZlciggc3RkZGViLCAiU2VuZERyaXZlck1lc3NhZ2UgLy8gcmV0dmFsID0gJWxkXG4iLCByZXR2YWwgKTsKKyAgICBkcHJpbnRmX2luZm8oZHJpdmVyLCAiU2VuZERyaXZlck1lc3NhZ2UgLy8gcmV0dmFsID0gJWxkXG4iLCByZXR2YWwgKTsKIAogICAgIEdsb2JhbFVubG9jazE2KCBoRHJpdmVyICk7CiAgICAgcmV0dXJuIHJldHZhbDsKQEAgLTgwLDEzICs3OSwxMyBAQAogICAgIGNoYXIgRHJ2TmFtZVsxMjhdOwogICAgIFdPUkQgb3JkaW5hbDsKIAotICAgIGRwcmludGZfZHJpdmVyKCBzdGRkZWIsIk9wZW5Ecml2ZXIoJyVzJywgJyVzJywgJTA4bFgpO1xuIiwKKyAgICBkcHJpbnRmX2luZm8oZHJpdmVyLCJPcGVuRHJpdmVyKCclcycsICclcycsICUwOGxYKTtcbiIsCiAJCSAgICBscERyaXZlck5hbWUsIGxwU2VjdGlvbk5hbWUsIGxQYXJhbSApOwogCiAgICAgaWYgKGxwU2VjdGlvbk5hbWUgPT0gTlVMTCkgbHBTZWN0aW9uTmFtZSA9ICJkcml2ZXJzIjsKICAgICBHZXRQcml2YXRlUHJvZmlsZVN0cmluZzMyQSggbHBTZWN0aW9uTmFtZSwgbHBEcml2ZXJOYW1lLCAiIiwgRHJ2TmFtZSwKIAkJCSAgICAgc2l6ZW9mKERydk5hbWUpLCAiU1lTVEVNLklOSSIgKTsKLSAgICBkcHJpbnRmX2RyaXZlciggc3RkZGViLCJPcGVuRHJpdmVyIC8vIERydk5hbWU9JyVzJ1xuIiwgRHJ2TmFtZSApOworICAgIGRwcmludGZfaW5mbyhkcml2ZXIsIk9wZW5Ecml2ZXIgLy8gRHJ2TmFtZT0nJXMnXG4iLCBEcnZOYW1lICk7CiAgICAgaWYgKGxzdHJsZW4zMkEoRHJ2TmFtZSkgPCAxKSByZXR1cm4gMDsKIAogICAgIGxwZHJ2ID0gbHBEcnZJdGVtTGlzdDsKQEAgLTE0Nyw3ICsxNDYsNyBAQAogICAgIFNlbmREcml2ZXJNZXNzYWdlKCBoRHJ2ciwgRFJWX0VOQUJMRSwgMEwsIGxQYXJhbSApOwogICAgIFNlbmREcml2ZXJNZXNzYWdlKCBoRHJ2ciwgRFJWX09QRU4sIDBMLCBsUGFyYW0gKTsKIAotICAgIGRwcmludGZfZHJpdmVyKCBzdGRkZWIsICJPcGVuRHJpdmVyIC8vIGhEcnZyPSUwNHggbG9hZGVkICFcbiIsIGhEcnZyICk7CisgICAgZHByaW50Zl9pbmZvKGRyaXZlciwgIk9wZW5Ecml2ZXIgLy8gaERydnI9JTA0eCBsb2FkZWQgIVxuIiwgaERydnIgKTsKICAgICByZXR1cm4gaERydnI7CiB9CiAKQEAgLTE1OCw3ICsxNTcsNyBAQAogewogICAgIExQRFJJVkVSSVRFTSBscGRydjsKIAotICAgIGRwcmludGZfZHJpdmVyKCBzdGRkZWIsICJDbG9zZURyaXZlciglMDR4LCAlMDhsWCwgJTA4bFgpO1xuIiwKKyAgICBkcHJpbnRmX2luZm8oZHJpdmVyLCAiQ2xvc2VEcml2ZXIoJTA0eCwgJTA4bFgsICUwOGxYKTtcbiIsCiAJCSAgICBoRHJ2ciwgbFBhcmFtMSwgbFBhcmFtMiApOwogCiAgICAgbHBkcnYgPSAoTFBEUklWRVJJVEVNKUdsb2JhbExvY2sxNiggaERydnIgKTsKQEAgLTE4Miw3ICsxODEsNyBAQAogCSAgICBHbG9iYWxGcmVlMTYoIGhEcnZyICk7CiAJfQogCi0gICAgICAgIGRwcmludGZfZHJpdmVyKCBzdGRkZWIsICJDbG9zZURyaXZlciAvLyBoRHJ2cj0lMDR4IGNsb3NlZCAhXG4iLAorICAgICAgICBkcHJpbnRmX2luZm8oZHJpdmVyLCAiQ2xvc2VEcml2ZXIgLy8gaERydnI9JTA0eCBjbG9zZWQgIVxuIiwKIAkJICAgICAgICBoRHJ2ciApOwogCXJldHVybiBUUlVFOwogICAgIH0KQEAgLTE5Nyw3ICsxOTYsNyBAQAogICAgIExQRFJJVkVSSVRFTSBscGRydjsKICAgICBITU9EVUxFMTYgaE1vZHVsZSA9IDA7CiAKLSAgICBkcHJpbnRmX2RyaXZlciggc3RkZGViLCAiR2V0RHJpdmVyTW9kdWxlSGFuZGxlKCUwNHgpO1xuIiwgaERydnIpOworICAgIGRwcmludGZfaW5mbyhkcml2ZXIsICJHZXREcml2ZXJNb2R1bGVIYW5kbGUoJTA0eCk7XG4iLCBoRHJ2cik7CiAKICAgICBscGRydiA9IChMUERSSVZFUklURU0pR2xvYmFsTG9jazE2KCBoRHJ2ciApOwogICAgIGlmIChscGRydiAhPSBOVUxMICYmIGxwZHJ2LT5kaXMuaERyaXZlciA9PSBoRHJ2cikKQEAgLTI1Myw3ICsyNTIsNyBAQAogewogICAgIExQRFJJVkVSSVRFTSBscGRydjsKIAotICAgIGRwcmludGZfZHJpdmVyKCBzdGRkZWIsICJHZXREcml2ZXJJbmZvKCUwNHgsICVwKTtcbiIsIGhEcnZyLCBscERydkluZm8gKTsKKyAgICBkcHJpbnRmX2luZm8oZHJpdmVyLCAiR2V0RHJpdmVySW5mbyglMDR4LCAlcCk7XG4iLCBoRHJ2ciwgbHBEcnZJbmZvICk7CiAKICAgICBpZiAobHBEcnZJbmZvID09IE5VTEwpIHJldHVybiBGQUxTRTsKIApAQCAtMjczLDE3ICsyNzIsMTcgQEAKICAgICBMUERSSVZFUklURU0gbHBkcnY7CiAgICAgSERSVlIxNiBoUmV0RHJ2ID0gMDsKIAotICAgIGRwcmludGZfZHJpdmVyKCBzdGRkZWIsICJHZXROZXh0RHJpdmVyKCUwNHgsICUwOGxYKTtcbiIsIGhEcnZyLCBkd0ZsYWdzICk7CisgICAgZHByaW50Zl9pbmZvKGRyaXZlciwgIkdldE5leHREcml2ZXIoJTA0eCwgJTA4bFgpO1xuIiwgaERydnIsIGR3RmxhZ3MgKTsKIAogICAgIGlmIChoRHJ2ciA9PSAwKQogICAgIHsKIAlpZiAobHBEcnZJdGVtTGlzdCA9PSBOVUxMKQogCXsKLQkgICAgZHByaW50Zl9kcml2ZXIoc3RkZGViLCAiR2V0TmV4dERyaXZlciAvLyBkcml2ZXJzIGxpc3QgZW1wdHkgIVxuIik7CisJICAgIGRwcmludGZfaW5mbyhkcml2ZXIsICJHZXROZXh0RHJpdmVyIC8vIGRyaXZlcnMgbGlzdCBlbXB0eSAhXG4iKTsKIAkgICAgTG9hZFN0YXJ0dXBEcml2ZXJzKCk7CiAJICAgIGlmIChscERydkl0ZW1MaXN0ID09IE5VTEwpIHJldHVybiAwOwogCX0KLQlkcHJpbnRmX2RyaXZlciggc3RkZGViLCJHZXROZXh0RHJpdmVyIC8vIHJldHVybiBmaXJzdCAlMDR4ICFcbiIsCisJZHByaW50Zl9pbmZvKGRyaXZlciwiR2V0TmV4dERyaXZlciAvLyByZXR1cm4gZmlyc3QgJTA0eCAhXG4iLAogCQkgICAgICAgIGxwRHJ2SXRlbUxpc3QtPmRpcy5oRHJpdmVyICk7CiAJcmV0dXJuIGxwRHJ2SXRlbUxpc3QtPmRpcy5oRHJpdmVyOwogICAgIH0KQEAgLTMwNCw2ICszMDMsNiBAQAogCUdsb2JhbFVubG9jazE2KCBoRHJ2ciApOwogICAgIH0KIAotICAgIGRwcmludGZfZHJpdmVyKCBzdGRkZWIsICJHZXROZXh0RHJpdmVyIC8vIHJldHVybiAlMDR4ICFcbiIsIGhSZXREcnYgKTsKKyAgICBkcHJpbnRmX2luZm8oZHJpdmVyLCAiR2V0TmV4dERyaXZlciAvLyByZXR1cm4gJTA0eCAhXG4iLCBoUmV0RHJ2ICk7CiAgICAgcmV0dXJuIGhSZXREcnY7CiB9CmRpZmYgLS1naXQgYS93aW5kb3dzL2V2ZW50LmMgYi93aW5kb3dzL2V2ZW50LmMKaW5kZXggODRiYzI3MS4uMDM1MGYxNCAxMDA2NDQKLS0tIGEvd2luZG93cy9ldmVudC5jCisrKyBiL3dpbmRvd3MvZXZlbnQuYwpAQCAtMzcsNyArMzcsNiBAQAogI2luY2x1ZGUgImRyaXZlLmgiCiAjaW5jbHVkZSAic2hlbGwuaCIKICNpbmNsdWRlICJrZXlib2FyZC5oIgotI2luY2x1ZGUgInN0ZGRlYnVnLmgiCiAjaW5jbHVkZSAiZGVidWcuaCIKICNpbmNsdWRlICJkZGVfcHJvYy5oIgogCkBAIC0xNTUsNyArMTU0LDcgQEAKICAgICAgICAgICAgICAgICAgICAgICAoY2hhciAqKikmcFduZCApICE9IDApCiAgICAgICAgIHJldHVybjsgIC8qIE5vdCBmb3IgYSByZWdpc3RlcmVkIHdpbmRvdyAqLwogCi0gICAgZHByaW50Zl9ldmVudCggc3RkZGViLCAiR290IGV2ZW50ICVzIGZvciBod25kICUwNHhcbiIsCisgICAgZHByaW50Zl9pbmZvKGV2ZW50LCAiR290IGV2ZW50ICVzIGZvciBod25kICUwNHhcbiIsCiAgICAgICAgICAgICAgICAgICAgZXZlbnRfbmFtZXNbZXZlbnQtPnR5cGVdLCBwV25kLT5od25kU2VsZiApOwogCiAgICAgc3dpdGNoKGV2ZW50LT50eXBlKQpAQCAtMjQ5LDcgKzI0OCw3IEBACiAJYnJlYWs7CiAKICAgICBkZWZhdWx0OiAgICAKLQlkcHJpbnRmX2V2ZW50KHN0ZGRlYiwgIlVucHJvY2Vzc2VkIGV2ZW50ICVzIGZvciBod25kICUwNHhcbiIsCisJZHByaW50Zl93YXJuKGV2ZW50LCAiVW5wcm9jZXNzZWQgZXZlbnQgJXMgZm9yIGh3bmQgJTA0eFxuIiwKIAkgICAgICAgIGV2ZW50X25hbWVzW2V2ZW50LT50eXBlXSwgcFduZC0+aHduZFNlbGYgKTsKIAlicmVhazsKICAgICB9CkBAIC01MTAsNyArNTA5LDcgQEAKICAgICAgICAgVFNYUXVlcnlUcmVlKCBkaXNwbGF5LCB3LCAmcm9vdCwgJnBhcmVudCwgJmNoaWxkcmVuLCAmdG90YWwgKTsKICAgICAgICAgaWYoIGNoaWxkcmVuICkgVFNYRnJlZSggY2hpbGRyZW4gKTsKICAgICB9IHdoaWxlKCBwYXJlbnQgJiYgcGFyZW50ICE9IGFuY2VzdG9yICk7Ci0gICAgZHByaW50Zl9ldmVudCggc3RkZGViLCAiXHQlMDh4IC0+ICUwOHhcbiIsICh1bnNpZ25lZClwcmV2LCAodW5zaWduZWQpdyApOworICAgIGRwcmludGZfaW5mbyhldmVudCwgIlx0JTA4eCAtPiAlMDh4XG4iLCAodW5zaWduZWQpcHJldiwgKHVuc2lnbmVkKXcgKTsKICAgICByZXR1cm4gKCBwYXJlbnQgKSA/IHcgOiAwIDsKIH0KIApAQCAtOTMyLDcgKzkzMSw3IEBACiAgICAgfQogCiAgICAgaWYocnByb3AgPT0gTm9uZSkgCi0gICAgICAgZHByaW50Zl9ldmVudChzdGRkZWIsIlJlcXVlc3QgZm9yICVzIGlnbm9yZWRcbiIsIFRTWEdldEF0b21OYW1lKGRpc3BsYXksZXZlbnQtPnRhcmdldCkpOworICAgICAgIGRwcmludGZfaW5mbyhldmVudCwiUmVxdWVzdCBmb3IgJXMgaWdub3JlZFxuIiwgVFNYR2V0QXRvbU5hbWUoZGlzcGxheSxldmVudC0+dGFyZ2V0KSk7CiAKICAgICByZXN1bHQudHlwZSA9IFNlbGVjdGlvbk5vdGlmeTsKICAgICByZXN1bHQuZGlzcGxheSA9IGRpc3BsYXk7CkBAIC05NTUsNyArOTU0LDcgQEAKICAgICBpZiAoZXZlbnQtPnRhcmdldCAhPSBYQV9TVFJJTkcpIENMSVBCT0FSRF9SZWFkU2VsZWN0aW9uKCAwLCBOb25lICk7CiAgICAgZWxzZSBDTElQQk9BUkRfUmVhZFNlbGVjdGlvbiggZXZlbnQtPnJlcXVlc3RvciwgZXZlbnQtPnByb3BlcnR5ICk7CiAKLSAgICBkcHJpbnRmX2NsaXBib2FyZChzdGRkZWIsIlx0U2VsZWN0aW9uTm90aWZ5IGRvbmUhXG4iKTsKKyAgICBkcHJpbnRmX2luZm8oY2xpcGJvYXJkLCJcdFNlbGVjdGlvbk5vdGlmeSBkb25lIVxuIik7CiB9CiAKIApAQCAtMTA4Nyw3ICsxMDg2LDcgQEAKIAkgIH0gLyogV1NfRVhfQUNDRVBURklMRVMgKi8KICAgICAgICB9IC8qIGRuZFByb3RvY29sICovCiAgICAgICAgZWxzZQotCSAgZHByaW50Zl9ldmVudCggc3RkZGViLCAidW5yZWNvZ25pemVkIENsaWVudE1lc3NhZ2VcbiIgKTsKKwkgIGRwcmludGZfaW5mbyhldmVudCwgInVucmVjb2duaXplZCBDbGllbnRNZXNzYWdlXG4iICk7CiAgICAgfQogfQogCkBAIC0xMTQ1LDcgKzExNDQsNyBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgR3JhYk1vZGVBc3luYywgR3JhYk1vZGVBc3luYywKICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5vbmUsIE5vbmUsIEN1cnJlbnRUaW1lICkgPT0gR3JhYlN1Y2Nlc3MpICkKIAl7Ci0gICAgICAgICAgICBkcHJpbnRmX3dpbihzdGRkZWIsICJTZXRDYXB0dXJlKDB4JTA0eClcbiIsIGh3bmQgKTsKKyAgICAgICAgICAgIGRwcmludGZfaW5mbyh3aW4sICJTZXRDYXB0dXJlKDB4JTA0eClcbiIsIGh3bmQgKTsKICAgICAgICAgICAgIGNhcHR1cmVXbmQgICA9IGh3bmQ7CiAJICAgIGNhcHR1cmVIVCAgICA9IGh0OwogICAgICAgICB9CkBAIC0xMTkxLDcgKzExOTAsNyBAQAogICovCiB2b2lkIFdJTkFQSSBSZWxlYXNlQ2FwdHVyZSh2b2lkKQogewotICAgIGRwcmludGZfd2luKHN0ZGRlYiwgIlJlbGVhc2VDYXB0dXJlKCkgWyUwNHhdXG4iLCBjYXB0dXJlV25kICk7CisgICAgZHByaW50Zl9pbmZvKHdpbiwgIlJlbGVhc2VDYXB0dXJlKCkgWyUwNHhdXG4iLCBjYXB0dXJlV25kICk7CiAgICAgaWYoIGNhcHR1cmVXbmQgKSBFVkVOVF9DYXB0dXJlKCAwLCAwICk7CiB9CiAKQEAgLTEyNzEsNyArMTI3MCw3IEBACiBCT09MMTYgV0lOQVBJIEVuYWJsZUhhcmR3YXJlSW5wdXQoQk9PTDE2IGJFbmFibGUpCiB7CiAgIEJPT0wxNiBiT2xkU3RhdGUgPSBJbnB1dEVuYWJsZWQ7Ci0gIGRwcmludGZfZXZlbnQoc3RkbmltcCwiRW5hYmxlSGFyZHdhcmVJbnB1dCglZCk7XG4iLCBiRW5hYmxlKTsKKyAgZHByaW50Zl9maXhtZShldmVudCwiRW5hYmxlSGFyZHdhcmVJbnB1dCglZCkgLSBzdHViXG4iLCBiRW5hYmxlKTsKICAgSW5wdXRFbmFibGVkID0gYkVuYWJsZTsKICAgcmV0dXJuIGJPbGRTdGF0ZTsKIH0KZGlmZiAtLWdpdCBhL3dpbmRvd3MvaG9vay5jIGIvd2luZG93cy9ob29rLmMKaW5kZXggZWJmMjBjNi4uY2ZmOGQxYSAxMDA2NDQKLS0tIGEvd2luZG93cy9ob29rLmMKKysrIGIvd2luZG93cy9ob29rLmMKQEAgLTIxLDcgKzIxLDYgQEAKICNpbmNsdWRlICJoZWFwLmgiCiAjaW5jbHVkZSAic3RydWN0MzIuaCIKICNpbmNsdWRlICJ3aW5wcm9jLmgiCi0jaW5jbHVkZSAic3RkZGVidWcuaCIKICNpbmNsdWRlICJkZWJ1Zy5oIgogCiAjcHJhZ21hIHBhY2soMSkKQEAgLTg0OCw3ICs4NDcsNyBAQAogCiAgICAgaWYgKChpZCA8IFdIX01JTkhPT0spIHx8IChpZCA+IFdIX01BWEhPT0spKSByZXR1cm4gMDsKIAotICAgIGRwcmludGZfaG9vayggc3RkZGViLCAiU2V0dGluZyBob29rICVkOiAlMDh4ICUwNHggJTA0eFxuIiwKKyAgICBkcHJpbnRmX2luZm8oaG9vaywgIlNldHRpbmcgaG9vayAlZDogJTA4eCAlMDR4ICUwNHhcbiIsCiAgICAgICAgICAgICAgICAgICBpZCwgKFVJTlQzMilwcm9jLCBoSW5zdCwgaFRhc2sgKTsKIAogICAgIGlmICghaEluc3QgJiYgKHR5cGUhPUhPT0tfV0lOMTYpKQpAQCAtODg2LDcgKzg4NSw3IEBACiAgICAgICAgIGRhdGEtPm5leHQgPSBIT09LX3N5c3RlbUhvb2tzW2lkIC0gV0hfTUlOSE9PS107CiAgICAgICAgIEhPT0tfc3lzdGVtSG9va3NbaWQgLSBXSF9NSU5IT09LXSA9IGhhbmRsZTsKICAgICB9Ci0gICAgZHByaW50Zl9ob29rKCBzdGRkZWIsICJTZXR0aW5nIGhvb2sgJWQ6IHJldD0lMDR4IFtuZXh0PSUwNHhdXG4iLCAKKyAgICBkcHJpbnRmX2luZm8oaG9vaywgIlNldHRpbmcgaG9vayAlZDogcmV0PSUwNHggW25leHQ9JTA0eF1cbiIsIAogCQkJICAgaWQsIGhhbmRsZSwgZGF0YS0+bmV4dCApOwogICAgIHJldHVybiBoYW5kbGU7CiB9CkBAIC05MDIsMTMgKzkwMSwxMyBAQAogICAgIEhPT0tEQVRBICpkYXRhOwogICAgIEhBTkRMRTE2ICpwcmV2SG9vazsKIAotICAgIGRwcmludGZfaG9vayggc3RkZGViLCAiUmVtb3ZpbmcgaG9vayAlMDR4XG4iLCBob29rICk7CisgICAgZHByaW50Zl9pbmZvKGhvb2ssICJSZW1vdmluZyBob29rICUwNHhcbiIsIGhvb2sgKTsKIAogICAgIGlmICghKGRhdGEgPSAoSE9PS0RBVEEgKilVU0VSX0hFQVBfTElOX0FERFIoaG9vaykpKSByZXR1cm4gRkFMU0U7CiAgICAgaWYgKGRhdGEtPmZsYWdzICYgSE9PS19JTlVTRSkKICAgICB7CiAgICAgICAgIC8qIE1hcmsgaXQgZm9yIGRlbGV0aW9uIGxhdGVyIG9uICovCi0gICAgICAgIGRwcmludGZfaG9vayggc3RkZGViLCAiSG9vayBzdGlsbCBydW5uaW5nLCBkZWxldGlvbiBkZWxheWVkXG4iICk7CisgICAgICAgIGRwcmludGZfd2Fybihob29rLCAiSG9vayBzdGlsbCBydW5uaW5nLCBkZWxldGlvbiBkZWxheWVkXG4iICk7CiAgICAgICAgIGRhdGEtPnByb2MgPSAoSE9PS1BST0MzMikwOwogICAgICAgICByZXR1cm4gVFJVRTsKICAgICB9CkBAIC05ODIsMTIgKzk4MSwxMiBAQAogICAgIHF1ZXVlLT5oQ3VySG9vayA9IGhvb2s7CiAgICAgZGF0YS0+ZmxhZ3MgfD0gSE9PS19JTlVTRTsKIAotICAgIGRwcmludGZfaG9vayggc3RkZGViLCAiQ2FsbGluZyBob29rICUwNHg6ICVkICUwOHggJTA4bHhcbiIsCisgICAgZHByaW50Zl9pbmZvKGhvb2ssICJDYWxsaW5nIGhvb2sgJTA0eDogJWQgJTA4eCAlMDhseFxuIiwKICAgICAgICAgICAgICAgICAgIGhvb2ssIGNvZGUsIHdQYXJhbSwgbFBhcmFtICk7CiAKICAgICByZXQgPSBkYXRhLT5wcm9jKGNvZGUsIHdQYXJhbSwgbFBhcmFtKTsKIAotICAgIGRwcmludGZfaG9vayggc3RkZGViLCAiUmV0IGhvb2sgJTA0eCA9ICUwOGx4XG4iLCBob29rLCByZXQgKTsKKyAgICBkcHJpbnRmX2luZm8oaG9vaywgIlJldCBob29rICUwNHggPSAlMDhseFxuIiwgaG9vaywgcmV0ICk7CiAKICAgICBkYXRhLT5mbGFncyAmPSB+SE9PS19JTlVTRTsKICAgICBxdWV1ZS0+aEN1ckhvb2sgPSBwcmV2SG9vazsKQEAgLTEyNzUsNyArMTI3NCw3IEBACiB7CiAgICAgSEFORExFMTYgaG9vayA9IEhPT0tfR2V0SG9vayggaWQgLCBHZXRUYXNrUXVldWUoMCkgKTsKIAotICAgIGRwcmludGZfaG9vayggc3RkZGViLCAiVW5ob29rV2luZG93c0hvb2s6ICVkICUwOGx4XG4iLCBpZCwgKERXT1JEKXByb2MgKTsKKyAgICBkcHJpbnRmX2luZm8oaG9vaywgIlVuaG9va1dpbmRvd3NIb29rOiAlZCAlMDhseFxuIiwgaWQsIChEV09SRClwcm9jICk7CiAKICAgICB3aGlsZSAoaG9vaykKICAgICB7CkBAIC0xMjk1LDcgKzEyOTQsNyBAQAogewogICAgIEhBTkRMRTE2IGhvb2sgPSBIT09LX0dldEhvb2soIGlkICwgR2V0VGFza1F1ZXVlKDApICk7CiAKLSAgICBkcHJpbnRmX2hvb2soIHN0ZGRlYiwgIlVuaG9va1dpbmRvd3NIb29rOiAlZCAlMDhseFxuIiwgaWQsIChEV09SRClwcm9jICk7CisgICAgZHByaW50Zl9pbmZvKGhvb2ssICJVbmhvb2tXaW5kb3dzSG9vazogJWQgJTA4bHhcbiIsIGlkLCAoRFdPUkQpcHJvYyApOwogCiAgICAgd2hpbGUgKGhvb2spCiAgICAgewpkaWZmIC0tZ2l0IGEvd2luZG93cy9rZXlib2FyZC5jIGIvd2luZG93cy9rZXlib2FyZC5jCmluZGV4IGI5OTY1NmQuLjkwMTg5ZmMgMTAwNjQ0Ci0tLSBhL3dpbmRvd3Mva2V5Ym9hcmQuYworKysgYi93aW5kb3dzL2tleWJvYXJkLmMKQEAgLTIzLDggKzIzLDYgQEAKICNpbmNsdWRlICJoZWFwLmgiCiAjaW5jbHVkZSAia2V5Ym9hcmQuaCIKICNpbmNsdWRlICJtZXNzYWdlLmgiCi0jaW5jbHVkZSAic3RkZGVidWcuaCIKLS8qICNkZWZpbmUgREVCVUdfS0VZQk9BUkQgKi8KICNpbmNsdWRlICJkZWJ1Zy5oIgogI2luY2x1ZGUgInN0cnVjdDMyLmgiCiAKQEAgLTE5MSwxMiArMTg5LDEyIEBACiAgICAgICAgICAgICAgICAgICAgIGlmIChUU1hLZXljb2RlVG9LZXlzeW0oZGlzcGxheSwgKmtjcCwgaykgPT0gWEtfTW9kZV9zd2l0Y2gpCiAJCSAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICBBbHRHck1hc2sgPSAxIDw8IGk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBkcHJpbnRmX2tleShzdGRkZWIsICJBbHRHck1hc2sgaXMgJXhcbiIsIEFsdEdyTWFzayk7CisgICAgICAgICAgICAgICAgICAgICAgICBkcHJpbnRmX2luZm8oa2V5LCAiQWx0R3JNYXNrIGlzICV4XG4iLCBBbHRHck1hc2spOwogCQkgICAgfQogICAgICAgICAgICAgICAgICAgICBlbHNlIGlmIChUU1hLZXljb2RlVG9LZXlzeW0oZGlzcGxheSwgKmtjcCwgaykgPT0gWEtfTnVtX0xvY2spCiAJCSAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICBOdW1Mb2NrTWFzayA9IDEgPDwgaTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGRwcmludGZfa2V5KHN0ZGRlYiwgIk51bUxvY2tNYXNrIGlzICV4XG4iLCBOdW1Mb2NrTWFzayk7CisgICAgICAgICAgICAgICAgICAgICAgICBkcHJpbnRmX2luZm8oa2V5LCAiTnVtTG9ja01hc2sgaXMgJXhcbiIsIE51bUxvY2tNYXNrKTsKIAkJICAgIH0KICAgICAgICAgICAgIH0KICAgICB9CkBAIC0yODMsMTAgKzI4MSwxMiBAQAogCiAgICAgICAgICAgICAgICAgdmtleSA9IE9FTXZrZXk7CiAJCSAgCi0gICAgICAgICAgICAgICAgaWYgKGRlYnVnZ2luZ19rZXlib2FyZCkKKyAgICAgICAgICAgICAgICBpZiAoZGVidWdnaW5nX2luZm8oa2V5Ym9hcmQpKQogICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgZnByaW50ZihzdGRkZWIsIk9FTSBzcGVjaWZpYyB2aXJ0dWFsIGtleSAlWCBhc3NpZ25lZCB0byBrZXljb2RlICVYIDpcbiAoIgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICxPRU12a2V5LGUyLmtleWNvZGUpOworCQkgICAgZGJnX2RlY2xfc3RyKGtleWJvYXJkLCAxMDI0KTsKKworICAgICAgICAgICAgICAgICAgICBkcHJpbnRmX2luZm8oa2V5Ym9hcmQsICJPRU0gc3BlY2lmaWMgdmlydHVhbCBrZXkgJVggYXNzaWduZWQiCisJCQkJICJ0byBrZXljb2RlICVYIDpcbiIsIE9FTXZrZXksIGUyLmtleWNvZGUpOwogICAgICAgICAgICAgICAgICAgICBmb3IgKGkgPSAwOyBpIDwga2V5c3ltc19wZXJfa2V5Y29kZTsgaSArPSAxKQogICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICBjaGFyCSprc25hbWU7CkBAIC0yOTUsOSArMjk1LDkgQEAKICAgICAgICAgICAgICAgICAgICAgICAgIGtzbmFtZSA9IFRTWEtleXN5bVRvU3RyaW5nKGtleXN5bSk7CiAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIWtzbmFtZSkKIAkJCSAgICBrc25hbWUgPSAiTm9TeW1ib2wiOwotICAgICAgICAgICAgICAgICAgICAgICAgZnByaW50ZihzdGRkZWIsICIlbFggKCVzKSAiLCBrZXlzeW0sIGtzbmFtZSk7CisgICAgICAgICAgICAgICAgICAgICAgICBkc3ByaW50ZihrZXlib2FyZCwgIiVsWCAoJXMpICIsIGtleXN5bSwga3NuYW1lKTsKICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBmcHJpbnRmKHN0ZGRlYiwgIilcbiIpOworICAgICAgICAgICAgICAgICAgICBkcHJpbnRmX2luZm8oa2V5Ym9hcmQsICIoJXMpXG4iLCBkYmdfc3RyKGtleWJvYXJkKSk7CiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgfQogICAgICAgICB9CkBAIC0zMTgsMTQgKzMxOCwxNCBAQAogICAgICAgIGRvbid0IHRyZWF0IGl0LiBJdCdzIGZyb20gdGhlIHNhbWUga2V5IHByZXNzLiBUaGVuIHRoZSBzdGF0ZSBnb2VzIHRvIE9OLgogICAgICAgIEFuZCBmcm9tIHRoZXJlLCBhICdyZWxlYXNlJyBldmVudCB3aWxsIHN3aXRjaCBvZmYgdGhlIHRvZ2dsZSBrZXkuICovCiAgICAgKlN0YXRlPUZBTFNFOwotICAgIGRwcmludGZfa2V5Ym9hcmQoc3RkZGViLCJJTlRFUk0gOiBkb25cJ3QgdHJlYXQgcmVsZWFzZSBvZiB0b2dnbGUga2V5LiBJbnB1dEtleVN0YXRlVGFibGVbJSN4XSA9ICUjeFxuIix2a2V5LElucHV0S2V5U3RhdGVUYWJsZVt2a2V5XSk7CisgICAgZHByaW50Zl9pbmZvKGtleWJvYXJkLCJJTlRFUk0gOiBkb25cJ3QgdHJlYXQgcmVsZWFzZSBvZiB0b2dnbGUga2V5LiBJbnB1dEtleVN0YXRlVGFibGVbJSN4XSA9ICUjeFxuIix2a2V5LElucHV0S2V5U3RhdGVUYWJsZVt2a2V5XSk7CiAgIH0gZWxzZQogICAgIHsKIAlpZiAoIElucHV0S2V5U3RhdGVUYWJsZVt2a2V5XSAmIDB4MSApIC8qIGl0IHdhcyBPTiAqLwogCSAgewogCSAgICBpZiAoRXZ0eXBlIT1LZXlQcmVzcykKIAkgICAgICB7Ci0JCWRwcmludGZfa2V5Ym9hcmQoc3RkZGViLCJPTiArIEtleVJlbGVhc2UgPT4gZ2VuZXJhdGluZyBET1dOIGFuZCBVUCBtZXNzYWdlcy5cbiIpOworCQlkcHJpbnRmX2luZm8oa2V5Ym9hcmQsIk9OICsgS2V5UmVsZWFzZSA9PiBnZW5lcmF0aW5nIERPV04gYW5kIFVQIG1lc3NhZ2VzLlxuIik7CiAJCWxvY2Fsa2V5bHAubHAxLnByZXZpb3VzID0gMDsgLyogPyAqLwogCQlsb2NhbGtleWxwLmxwMS50cmFuc2l0aW9uID0gMDsKIAkJaGFyZHdhcmVfZXZlbnQoIFdNX0tFWURPV04sIHZrZXksIGxvY2Fsa2V5bHAubHAyLApAQCAtMzM5LDcgKzMzOSw3IEBACiAJZWxzZSAvKiBpdCB3YXMgT0ZGICovCiAJICBpZiAoRXZ0eXBlPT1LZXlQcmVzcykKIAkgICAgewotCSAgICAgIGRwcmludGZfa2V5Ym9hcmQoc3RkZGViLCJPRkYgKyBLZXlwcmVzcyA9PiBnZW5lcmF0aW5nIERPV04gYW5kIFVQIG1lc3NhZ2VzLlxuIik7CisJICAgICAgZHByaW50Zl9pbmZvKGtleWJvYXJkLCJPRkYgKyBLZXlwcmVzcyA9PiBnZW5lcmF0aW5nIERPV04gYW5kIFVQIG1lc3NhZ2VzLlxuIik7CiAJICAgICAgaGFyZHdhcmVfZXZlbnQoIFdNX0tFWURPV04sIHZrZXksIGxvY2Fsa2V5bHAubHAyLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXZlbnRfeCwgZXZlbnRfeSwgZXZlbnRfdGltZSwgMCApOwogCSAgICAgIGxvY2Fsa2V5bHAubHAxLnByZXZpb3VzID0gMTsKQEAgLTM3MiwxNSArMzcyLDE1IEBACiAgICAgSU5UMzIgZXZlbnRfeSA9IHBXbmQtPnJlY3RXaW5kb3cudG9wICsgZXZlbnQtPnk7CiAgICAgRFdPUkQgZXZlbnRfdGltZSA9IGV2ZW50LT50aW1lIC0gTVNHX1dpbmVTdGFydFRpY2tzOwogCi0gICAgZHByaW50Zl9rZXkoc3RkZGViLCAiRVZFTlRfa2V5IDogc3RhdGUgPSAlWFxuIiwgZXZlbnQtPnN0YXRlKTsKKyAgICBkcHJpbnRmX2luZm8oa2V5LCAiRVZFTlRfa2V5IDogc3RhdGUgPSAlWFxuIiwgZXZlbnQtPnN0YXRlKTsKICAgICBpZiAoa2V5c3ltID09IFhLX01vZGVfc3dpdGNoKQogCXsKLQlkcHJpbnRmX2tleShzdGRkZWIsICJBbHQgR3Iga2V5IGV2ZW50IHJlY2VpdmVkXG4iKTsKKwlkcHJpbnRmX2luZm8oa2V5LCAiQWx0IEdyIGtleSBldmVudCByZWNlaXZlZFxuIik7CiAJZXZlbnQtPmtleWNvZGUgPSBUU1hLZXlzeW1Ub0tleWNvZGUoZXZlbnQtPmRpc3BsYXksIFhLX0NvbnRyb2xfTCk7Ci0JZHByaW50Zl9rZXkoc3RkZGViLCAiQ29udHJvbF9MIGlzIGtleWNvZGUgMHgleFxuIiwgZXZlbnQtPmtleWNvZGUpOworCWRwcmludGZfaW5mbyhrZXksICJDb250cm9sX0wgaXMga2V5Y29kZSAweCV4XG4iLCBldmVudC0+a2V5Y29kZSk7CiAJS0VZQk9BUkRfSGFuZGxlRXZlbnQoIHBXbmQsIGV2ZW50ICk7CiAJZXZlbnQtPmtleWNvZGUgPSBUU1hLZXlzeW1Ub0tleWNvZGUoZXZlbnQtPmRpc3BsYXksIFhLX0FsdF9MKTsKLQlkcHJpbnRmX2tleShzdGRkZWIsICJBbHRfTCBpcyBrZXljb2RlIDB4JXhcbiIsIGV2ZW50LT5rZXljb2RlKTsKKwlkcHJpbnRmX2luZm8oa2V5LCAiQWx0X0wgaXMga2V5Y29kZSAweCV4XG4iLCBldmVudC0+a2V5Y29kZSk7CiAJZm9yY2VfZXh0ZW5kZWQgPSBUUlVFOwogCUtFWUJPQVJEX0hhbmRsZUV2ZW50KCBwV25kLCBldmVudCApOwogCWZvcmNlX2V4dGVuZGVkID0gRkFMU0U7CkBAIC0zODgsMjIgKzM4OCwyMSBAQAogCX0KIAogICAgIFN0clthc2NpaV9jaGFyc10gPSAnXDAnOwotICAgIGlmIChkZWJ1Z2dpbmdfa2V5KQotCXsKKyAgICBpZiAoZGVidWdnaW5nX2luZm8oa2V5KSl7CiAJY2hhcgkqa3NuYW1lOwogCiAJa3NuYW1lID0gVFNYS2V5c3ltVG9TdHJpbmcoa2V5c3ltKTsKIAlpZiAoIWtzbmFtZSkKLQkgICAga3NuYW1lID0gIk5vIE5hbWUiOwotCWZwcmludGYoc3RkZGViLCAiJXMgOiBrZXlzeW09JWxYICglcyksIGFzY2lpIGNoYXJzPSV1IC8gJVggLyAnJXMnXG4iLCAKLSAgICAgICAgICAgICAgICAoZXZlbnQtPnR5cGUgPT0gS2V5UHJlc3MpID8gIktleVByZXNzIiA6ICJLZXlSZWxlYXNlIiwKLSAgICAgICAgICAgICAgICBrZXlzeW0sIGtzbmFtZSwgYXNjaWlfY2hhcnMsIFN0clswXSAmIDB4ZmYsIFN0cik7Ci0JfQorCSAga3NuYW1lID0gIk5vIE5hbWUiOworCWRwcmludGZfaW5mbyhrZXksICIlcyA6IGtleXN5bT0lbFggKCVzKSwgYXNjaWkgY2hhcnM9JXUgLyAlWCAvICclcydcbiIsIAorCQkgICAgIChldmVudC0+dHlwZSA9PSBLZXlQcmVzcykgPyAiS2V5UHJlc3MiIDogIktleVJlbGVhc2UiLAorCQkgICAgIGtleXN5bSwga3NuYW1lLCBhc2NpaV9jaGFycywgU3RyWzBdICYgMHhmZiwgU3RyKTsKKyAgICB9CiAKICAgICB2a2V5ID0gRVZFTlRfZXZlbnRfdG9fdmtleShldmVudCk7CiAgICAgaWYgKGZvcmNlX2V4dGVuZGVkKSB2a2V5IHw9IDB4MTAwOwogCi0gICAgZHByaW50Zl9rZXkoc3RkZGViLCAia2V5Y29kZSAweCV4IGNvbnZlcnRlZCB0byB2a2V5IDB4JXhcbiIsCisgICAgZHByaW50Zl9pbmZvKGtleSwgImtleWNvZGUgMHgleCBjb252ZXJ0ZWQgdG8gdmtleSAweCV4XG4iLAogCQkgICAgZXZlbnQtPmtleWNvZGUsIHZrZXkpOwogCiAgICBpZiAodmtleSkKQEAgLTQyNCwxMCArNDIzLDEwIEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXZlbnRfdGltZSwga2V5bHApOwogICAgICAgYnJlYWs7CiAgICAgY2FzZSBWS19DQVBJVEFMOgotICAgICAgZHByaW50Zl9rZXlib2FyZChzdGRkZWIsIkNhcHMgTG9jayBldmVudC4gKHR5cGUgJWQpLiBTdGF0ZSBiZWZvcmUgOiAlIy4yeFxuIixldmVudC0+dHlwZSxJbnB1dEtleVN0YXRlVGFibGVbdmtleV0pOworICAgICAgZHByaW50Zl9pbmZvKGtleWJvYXJkLCJDYXBzIExvY2sgZXZlbnQuICh0eXBlICVkKS4gU3RhdGUgYmVmb3JlIDogJSMuMnhcbiIsZXZlbnQtPnR5cGUsSW5wdXRLZXlTdGF0ZVRhYmxlW3ZrZXldKTsKICAgICAgIEtFWUJPQVJEX0dlbmVyYXRlTXNnKCBWS19DQVBJVEFMLCBldmVudC0+dHlwZSwgZXZlbnRfeCwgZXZlbnRfeSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBldmVudF90aW1lLCBrZXlscCApOyAKLSAgICAgIGRwcmludGZfa2V5Ym9hcmQoc3RkZGViLCJTdGF0ZSBhZnRlciA6ICUjLjJ4XG4iLElucHV0S2V5U3RhdGVUYWJsZVt2a2V5XSk7CisgICAgICBkcHJpbnRmX2luZm8oa2V5Ym9hcmQsIlN0YXRlIGFmdGVyIDogJSMuMnhcbiIsSW5wdXRLZXlTdGF0ZVRhYmxlW3ZrZXldKTsKICAgICAgIGJyZWFrOwogICAgIGRlZmF1bHQ6CiAgICAgICB7CkBAIC00NTgsNyArNDU3LDcgQEAKIAkJCSAgICAgIChJbnB1dEtleVN0YXRlVGFibGVbVktfTUVOVV0gJiAweDgwKSkgPyAxIDogMDsKIAlpZiAoIShJbnB1dEtleVN0YXRlVGFibGVbVktfTlVNTE9DS10gJiAweDAxKSAhPSAhKGV2ZW50LT5zdGF0ZSAmIE51bUxvY2tNYXNrKSkKIAkgIHsgCi0JICAgIGRwcmludGZfa2V5Ym9hcmQoc3RkZGViLCJBZGp1c3RpbmcgTnVtTG9jayBzdGF0ZS4gXG4iKTsKKwkgICAgZHByaW50Zl9pbmZvKGtleWJvYXJkLCJBZGp1c3RpbmcgTnVtTG9jayBzdGF0ZS4gXG4iKTsKIAkgICAgS0VZQk9BUkRfR2VuZXJhdGVNc2coIFZLX05VTUxPQ0ssIEtleVByZXNzLCBldmVudF94LCBldmVudF95LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV2ZW50X3RpbWUsIGtleWxwICk7CiAJICAgIEtFWUJPQVJEX0dlbmVyYXRlTXNnKCBWS19OVU1MT0NLLCBLZXlSZWxlYXNlLCBldmVudF94LCBldmVudF95LApAQCAtNDY2LDIwICs0NjUsMjAgQEAKIAkgIH0KIAlpZiAoIShJbnB1dEtleVN0YXRlVGFibGVbVktfQ0FQSVRBTF0gJiAweDAxKSAhPSAhKGV2ZW50LT5zdGF0ZSAmIExvY2tNYXNrKSkKIAkgIHsKLQkgICAgZHByaW50Zl9rZXlib2FyZChzdGRkZWIsIkFkanVzdGluZyBDYXBzIExvY2sgc3RhdGUuIFN0YXRlIGJlZm9yZSAlIy4yeCBcbiIsSW5wdXRLZXlTdGF0ZVRhYmxlW1ZLX0NBUElUQUxdKTsKKwkgICAgZHByaW50Zl9pbmZvKGtleWJvYXJkLCJBZGp1c3RpbmcgQ2FwcyBMb2NrIHN0YXRlLiBTdGF0ZSBiZWZvcmUgJSMuMnggXG4iLElucHV0S2V5U3RhdGVUYWJsZVtWS19DQVBJVEFMXSk7CiAJICAgIEtFWUJPQVJEX0dlbmVyYXRlTXNnKCBWS19DQVBJVEFMLCBLZXlQcmVzcywgZXZlbnRfeCwgZXZlbnRfeSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBldmVudF90aW1lLCBrZXlscCApOwogCSAgICBLRVlCT0FSRF9HZW5lcmF0ZU1zZyggVktfQ0FQSVRBTCwgS2V5UmVsZWFzZSwgZXZlbnRfeCwgZXZlbnRfeSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBldmVudF90aW1lLCBrZXlscCApOwotCSAgICBkcHJpbnRmX2tleWJvYXJkKHN0ZGRlYiwiU3RhdGUgYWZ0ZXIgJSMuMnggXG4iLElucHV0S2V5U3RhdGVUYWJsZVtWS19DQVBJVEFMXSk7CisJICAgIGRwcmludGZfaW5mbyhrZXlib2FyZCwiU3RhdGUgYWZ0ZXIgJSMuMnggXG4iLElucHV0S2V5U3RhdGVUYWJsZVtWS19DQVBJVEFMXSk7CiAJICB9CiAJLyogRW5kIG9mIGludGVybWVkaWFyeSBzdGF0ZXMuICovCiAJTnVtU3RhdGUgPSBGQUxTRTsKIAlDYXBzU3RhdGUgPSBGQUxTRTsKIAotCWRwcmludGZfa2V5KHN0ZGRlYiwiICAgICAgICAgICAgd1BhcmFtPSUwNFgsIGxQYXJhbT0lMDhsWFxuIiwgCisJZHByaW50Zl9pbmZvKGtleSwiICAgICAgICAgICAgd1BhcmFtPSUwNFgsIGxQYXJhbT0lMDhsWFxuIiwgCiAJCSAgICB2a2V5LCBrZXlscC5scDIgKTsKLQlkcHJpbnRmX2tleShzdGRkZWIsIiAgICAgICAgICAgIElucHV0S2V5U3RhdGU9JVhcbiIsCisJZHByaW50Zl9pbmZvKGtleSwiICAgICAgICAgICAgSW5wdXRLZXlTdGF0ZT0lWFxuIiwKIAkJICAgIElucHV0S2V5U3RhdGVUYWJsZVt2a2V5XSk7CiAKIAloYXJkd2FyZV9ldmVudCggbWVzc2FnZSwgdmtleSwga2V5bHAubHAyLApAQCAtNTI1LDcgKzUyNCw3IEBACiAJICAgIHJldHZhbCA9ICggKFdPUkQpKFF1ZXVlS2V5U3RhdGVUYWJsZVt2a2V5XSAmIDB4ODApIDw8IDggKSB8CiAJCSAgICAgICAoV09SRCkoUXVldWVLZXlTdGF0ZVRhYmxlW3ZrZXldICYgMHgwMSk7CiAJfQotICAgIGRwcmludGZfa2V5KHN0ZGRlYiwgIkdldEtleVN0YXRlKDB4JXgpIC0+ICV4XG4iLCB2a2V5LCByZXR2YWwpOworICAgIGRwcmludGZfaW5mbyhrZXksICJHZXRLZXlTdGF0ZSgweCV4KSAtPiAleFxuIiwgdmtleSwgcmV0dmFsKTsKICAgICByZXR1cm4gcmV0dmFsOwogfQogCkBAIC01MzcsNyArNTM2LDcgQEAKICAqLwogVk9JRCBXSU5BUEkgR2V0S2V5Ym9hcmRTdGF0ZShMUEJZVEUgbHBLZXlTdGF0ZSkKIHsKLSAgICBkcHJpbnRmX2tleShzdGRkZWIsICJHZXRLZXlib2FyZFN0YXRlKClcbiIpOworICAgIGRwcmludGZfaW5mbyhrZXksICJHZXRLZXlib2FyZFN0YXRlKClcbiIpOwogICAgIGlmIChscEtleVN0YXRlICE9IE5VTEwpIHsKIAlRdWV1ZUtleVN0YXRlVGFibGVbVktfTEJVVFRPTl0gPSBNb3VzZUJ1dHRvbnNTdGF0ZXNbMF0gPyAweDgwIDogMDsKIAlRdWV1ZUtleVN0YXRlVGFibGVbVktfTUJVVFRPTl0gPSBNb3VzZUJ1dHRvbnNTdGF0ZXNbMV0gPyAweDgwIDogMDsKQEAgLTU1MSw3ICs1NTAsNyBAQAogICovCiBWT0lEIFdJTkFQSSBTZXRLZXlib2FyZFN0YXRlKExQQllURSBscEtleVN0YXRlKQogewotICAgIGRwcmludGZfa2V5KHN0ZGRlYiwgIlNldEtleWJvYXJkU3RhdGUoKVxuIik7CisgICAgZHByaW50Zl9pbmZvKGtleSwgIlNldEtleWJvYXJkU3RhdGUoKVxuIik7CiAgICAgaWYgKGxwS2V5U3RhdGUgIT0gTlVMTCkgewogCW1lbWNweShRdWV1ZUtleVN0YXRlVGFibGUsIGxwS2V5U3RhdGUsIDI1Nik7CiAJTW91c2VCdXR0b25zU3RhdGVzWzBdID0gKFF1ZXVlS2V5U3RhdGVUYWJsZVtWS19MQlVUVE9OXSAhPSAwKTsKQEAgLTYwMCw3ICs1OTksNyBAQAogICAgIG1lbXNldCggQXN5bmNNb3VzZUJ1dHRvbnNTdGF0ZXMsIDAsIHNpemVvZihBc3luY01vdXNlQnV0dG9uc1N0YXRlcykgKTsKICAgICBtZW1zZXQoIEFzeW5jS2V5U3RhdGVUYWJsZSwgMCwgc2l6ZW9mKEFzeW5jS2V5U3RhdGVUYWJsZSkgKTsKIAotICAgIGRwcmludGZfa2V5KHN0ZGRlYiwgIkdldEFzeW5jS2V5U3RhdGUoJXgpIC0+ICV4XG4iLCBuS2V5LCByZXR2YWwpOworICAgIGRwcmludGZfaW5mbyhrZXksICJHZXRBc3luY0tleVN0YXRlKCV4KSAtPiAleFxuIiwgbktleSwgcmV0dmFsKTsKICAgICByZXR1cm4gcmV0dmFsOwogfQogCkBAIC02MzUsMTMgKzYzNCwxNCBAQAogICAgIAlpZiAobXNnLT5tZXNzYWdlID09IFdNX0NIQVIpIHsKICAgICAgICAgaWYgKCAhKGZWaXJ0ICYgRkFMVCkgJiYgIShmVmlydCAmIEZWSVJUS0VZKSApCiAgICAgICAgIHsKLSAgIAkgIGRwcmludGZfYWNjZWwoc3RkZGViLCJmb3VuZCBhY2NlbCBmb3IgV01fQ0hBUjogKCclYycpIixtc2ctPndQYXJhbSYweGZmKTsKKyAgIAkgIGRwcmludGZfaW5mbyhhY2NlbCwiZm91bmQgYWNjZWwgZm9yIFdNX0NIQVI6ICgnJWMnKVxuIiwKKwkJCW1zZy0+d1BhcmFtJjB4ZmYpOwogICAgCSAgc2VuZG1zZz1UUlVFOwogICAgCX0gIAogICAgICAgfSBlbHNlIHsKICAgICAgICBpZihmVmlydCAmIEZWSVJUS0VZKSB7CiAJSU5UMzIgbWFzayA9IDA7Ci0gICAgICAgIGRwcmludGZfYWNjZWwoc3RkZGViLCJmb3VuZCBhY2NlbCBmb3IgdmlydF9rZXkgJTA0eCAoc2NhbiAlMDR4KSIsCisgICAgICAgIGRwcmludGZfaW5mbyhhY2NlbCwiZm91bmQgYWNjZWwgZm9yIHZpcnRfa2V5ICUwNHggKHNjYW4gJTA0eClcbiIsCiAgIAkgICAgICAgICAgICAgICAgICAgICAgIG1zZy0+d1BhcmFtLDB4ZmYgJiBISVdPUkQobXNnLT5sUGFyYW0pKTsgICAgICAgICAgICAgICAgCiAJaWYoR2V0S2V5U3RhdGUzMihWS19TSElGVCkgJiAweDgwMDApIG1hc2sgfD0gRlNISUZUOwogCWlmKEdldEtleVN0YXRlMzIoVktfQ09OVFJPTCkgJiAweDgwMDApIG1hc2sgfD0gRkNPTlRST0w7CkBAIC02NDksNyArNjQ5LDcgQEAKIAlpZihtYXNrID09IChmVmlydCAmIChGU0hJRlQgfCBGQ09OVFJPTCB8IEZBTFQpKSkKICAgICAgICAgICBzZW5kbXNnPVRSVUU7CQkJICAgIAogICAgICAgICBlbHNlCi0gICAgICAgICAgZHByaW50Zl9hY2NlbChzdGRkZWIsIiwgYnV0IGluY29ycmVjdCBTSElGVC9DVFJML0FMVC1zdGF0ZVxuIik7CisgICAgICAgICAgZHByaW50Zl9pbmZvKGFjY2VsLCIsIGJ1dCBpbmNvcnJlY3QgU0hJRlQvQ1RSTC9BTFQtc3RhdGVcbiIpOwogICAgICAgIH0KICAgICAgICBlbHNlCiAgICAgICAgewpAQCAtNjU3LDcgKzY1Nyw3IEBACiAgICAgICAgICB7CiAgICAgICAgICAgIGlmICgoZlZpcnQgJiBGQUxUKSAmJiAobXNnLT5sUGFyYW0gJiAweDIwMDAwMDAwKSkKICAgICAgICAgICAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIF5eIEFMVCBwcmVzc2VkICovCi0JICAgIGRwcmludGZfYWNjZWwoc3RkZGViLCJmb3VuZCBhY2NlbCBmb3IgQWx0LSVjIiwgbXNnLT53UGFyYW0mMHhmZik7CisJICAgIGRwcmludGZfaW5mbyhhY2NlbCwiZm91bmQgYWNjZWwgZm9yIEFsdC0lY1xuIiwgbXNnLT53UGFyYW0mMHhmZik7CiAJICAgIHNlbmRtc2c9VFJVRTsJICAgIAogCSAgIH0gCiAgICAgICAgICB9IApAQCAtNzE0LDcgKzcxNCw3IEBACiAgICAgICAgICAgfQogICAgICAgICAgIGlmICggbWVzZz09V01fQ09NTUFORCB8fCBtZXNnPT1XTV9TWVNDT01NQU5EICkKICAgICAgICAgICB7Ci0gICAgICAgICAgICAgIGRwcmludGZfYWNjZWwoc3RkZGViLCIsIHNlbmRpbmcgJXMsIHdQYXJhbT0lMHhcbiIsCisgICAgICAgICAgICAgIGRwcmludGZfaW5mbyhhY2NlbCwiLCBzZW5kaW5nICVzLCB3UGFyYW09JTB4XG4iLAogICAgICAgICAgICAgICAgICAgbWVzZz09V01fQ09NTUFORCA/ICJXTV9DT01NQU5EIiA6ICJXTV9TWVNDT01NQU5EIiwKICAgICAgICAgICAgICAgICAgIGNtZCk7CiAJICAgICAgU2VuZE1lc3NhZ2UzMkEoaFduZCwgbWVzZywgY21kLCAweDAwMDEwMDAwTCk7CkBAIC03MzAsNyArNzMwLDkgQEAKIAkgICAgKiAgICM1OiBpdCdzIGEgbWVudSBvcHRpb24sIGJ1dCB3aW5kb3cgaXMgaWNvbmljCiAJICAgICogICAjNjogaXQncyBhIG1lbnUgb3B0aW9uLCBidXQgZGlzYWJsZWQKIAkgICAgKi8KLQkgICAgZHByaW50Zl9hY2NlbChzdGRkZWIsIiwgYnV0IHdvbid0IHNlbmQgV01fe1NZU31DT01NQU5ELCByZWFzb24gaXMgIyVkXG4iLG1lc2cpOworCSAgICBkcHJpbnRmX2luZm8oYWNjZWwsIiwgYnV0IHdvbid0IHNlbmQgV01fe1NZU31DT01NQU5ELCByZWFzb24gaXMgIyVkXG4iLG1lc2cpOworCSAgICBpZihtZXNnPT0wKQorCSAgICAgIGRwcmludGZfZXJyKGFjY2VsLCAiIHVua25vd24gcmVhc29uIC0gcGxlYXNlIHJlcG9ydCEiKTsKIAkgIH0gICAgICAgICAgCiAgICAgICAgICAgcmV0dXJuIFRSVUU7ICAgICAgICAgCiAgICAgICB9CkBAIC03NTAsNyArNzUyLDcgQEAKIAltc2ctPm1lc3NhZ2UgIT0gV01fU1lTS0VZVVAgJiYKICAgICAJbXNnLT5tZXNzYWdlICE9IFdNX0NIQVIpIHJldHVybiAwOwogCi0gICAgZHByaW50Zl9hY2NlbChzdGRkZWIsICJUcmFuc2xhdGVBY2NlbGVyYXRvcnMgaEFjY2VsPSUwNHgsIGhXbmQ9JTA0eCxcCisgICAgZHByaW50Zl9pbmZvKGFjY2VsLCAiVHJhbnNsYXRlQWNjZWxlcmF0b3JzIGhBY2NlbD0lMDR4LCBoV25kPSUwNHgsXAogbXNnLT5od25kPSUwNHgsIG1zZy0+bWVzc2FnZT0lMDR4XG4iLCBoQWNjZWwsaFduZCxtc2ctPmh3bmQsbXNnLT5tZXNzYWdlKTsKIAogICAgIGZvciAoaSA9IDA7IGxwQWNjZWxUYmxbaV0ua2V5IDsgaSsrKQpAQCAtNzczLDcgKzc3NSw3IEBACiAJbXNnLT5tZXNzYWdlICE9IFdNX1NZU0tFWVVQICYmCiAgICAgCW1zZy0+bWVzc2FnZSAhPSBXTV9DSEFSKSByZXR1cm4gMDsKIAotICAgIGRwcmludGZfYWNjZWwoc3RkZGViLCAiVHJhbnNsYXRlQWNjZWxlcmF0b3JzIGhBY2NlbD0lMDR4LCBoV25kPSUwNHgsXAorICAgIGRwcmludGZfaW5mbyhhY2NlbCwgIlRyYW5zbGF0ZUFjY2VsZXJhdG9ycyBoQWNjZWw9JTA0eCwgaFduZD0lMDR4LFwKIG1zZy0+aHduZD0lMDR4LCBtc2ctPm1lc3NhZ2U9JTA0eFxuIiwgaEFjY2VsLGhXbmQsbXNnLT5od25kLG1zZy0+bWVzc2FnZSk7CiAgICAgU1RSVUNUMzJfTVNHMTZ0bzMyKG1zZywmbXNnMzIpOwogCkBAIC03OTEsNyArNzkzLDcgQEAKICAqLwogRFdPUkQgV0lOQVBJIE9lbUtleVNjYW4oV09SRCB3T2VtQ2hhcikKIHsKLSAgICBkcHJpbnRmX2tleWJvYXJkKHN0ZGRlYiwiKk9lbUtleVNjYW4gKCVkKVxuIix3T2VtQ2hhcik7CisgICAgZHByaW50Zl9pbmZvKGtleWJvYXJkLCIqT2VtS2V5U2NhbiAoJWQpXG4iLHdPZW1DaGFyKTsKIAogICAgIHJldHVybiB3T2VtQ2hhcjsKIH0KQEAgLTgzMSw4ICs4MzMsOCBAQAogCSAga2V5Y29kZSA9IFRTWEtleXN5bVRvS2V5Y29kZShkaXNwbGF5LCBrZXlzeW0gfCAweEZFMDApOwogCX0KIAotCWRwcmludGZfa2V5Ym9hcmQoc3RkZGViLCJWa0tleVNjYW4gJyVjJyglI2x4LCAlbHUpIDogZ290IGtleWNvZGUgJSMuMnggIiwKLQkgICAgY0NoYXIsa2V5c3ltLGtleXN5bSxrZXljb2RlKTsKKwlkcHJpbnRmX2luZm8oa2V5Ym9hcmQsIlZrS2V5U2NhbiAnJWMnKCUjbHgsICVsdSk6IGdvdCBrZXljb2RlICUjLjJ4XG4iLAorCQkJIGNDaGFyLGtleXN5bSxrZXlzeW0sa2V5Y29kZSk7CiAJCiAJaWYgKGtleWNvZGUpCiAJICB7CkBAIC04NTQsNyArODU2LDcgQEAKIAkgICAgICBpbmRleCA6ID8gICAgIGFkZHMgMHgwNzAwIChjdHJsK2FsdCtzaGlmdCAodXNlZD8pKQogCSAgICAgKi8KIAkgIH0KLQlkcHJpbnRmX2tleWJvYXJkKHN0ZGRlYiwiIC4uLiByZXR1cm5pbmcgJSMuMnhcbiIsIGtleWMydmtleVtrZXljb2RlXStoaWdoYnl0ZSk7CisJZHByaW50Zl9pbmZvKGtleWJvYXJkLCIgLi4uIHJldHVybmluZyAlIy4yeFxuIiwga2V5YzJ2a2V5W2tleWNvZGVdK2hpZ2hieXRlKTsKIAlyZXR1cm4ga2V5YzJ2a2V5W2tleWNvZGVdK2hpZ2hieXRlOyAgIC8qIGtleWNvZGUgLT4gKGtleWMydmtleSkgdmtleSAqLwogfQogCkBAIC04ODcsNyArODg5LDcgQEAKICAqLwogSU5UMzIgV0lOQVBJIEdldEtleWJvYXJkVHlwZTMyKElOVDMyIG5UeXBlRmxhZykKIHsKLSAgZHByaW50Zl9rZXlib2FyZChzdGRkZWIsIkdldEtleWJvYXJkVHlwZSglZClcbiIsblR5cGVGbGFnKTsKKyAgZHByaW50Zl9pbmZvKGtleWJvYXJkLCJHZXRLZXlib2FyZFR5cGUoJWQpXG4iLG5UeXBlRmxhZyk7CiAgIHN3aXRjaChuVHlwZUZsYWcpCiAgICAgewogICAgIGNhc2UgMDogICAgICAvKiBLZXlib2FyZCB0eXBlICovCkBAIC05MjgsOSArOTMwLDEwIEBACiAgKi8KIFVJTlQxNiBXSU5BUEkgTWFwVmlydHVhbEtleTE2KFVJTlQxNiB3Q29kZSwgVUlOVDE2IHdNYXBUeXBlKQogewotI2RlZmluZSByZXR1cm5NVksodmFsdWUpIHsgZHByaW50Zl9rZXlib2FyZChzdGRkZWIsInJldHVybmluZyAweCV4LlxuIix2YWx1ZSk7IHJldHVybiB2YWx1ZTsgfQorI2RlZmluZSByZXR1cm5NVksodmFsdWUpIHsgZHByaW50Zl9pbmZvKGtleWJvYXJkLCJyZXR1cm5pbmcgMHgleC5cbiIsdmFsdWUpOyByZXR1cm4gdmFsdWU7IH0KIAotCWRwcmludGZfa2V5Ym9hcmQoc3RkZGViLCJNYXBWaXJ0dWFsS2V5IHdDb2RlPTB4JXggd01hcFR5cGU9JWQgLi4uICIsd0NvZGUsd01hcFR5cGUpOworCWRwcmludGZfaW5mbyhrZXlib2FyZCwiTWFwVmlydHVhbEtleSB3Q29kZT0weCV4IHdNYXBUeXBlPSVkIC4uLiBcbiIsCisJCQkgd0NvZGUsd01hcFR5cGUpOwogCXN3aXRjaCh3TWFwVHlwZSkgewogCQljYXNlIDA6CXsgLyogdmtleS1jb2RlIHRvIHNjYW4tY29kZSAqLwogCQkJLyogbGV0J3MgZG8gdmtleSAtPiBrZXljb2RlIC0+IHNjYW4gKi8KQEAgLTk3NCw3ICs5NzcsNyBAQAogICovCiBJTlQxNiBXSU5BUEkgR2V0S0JDb2RlUGFnZTE2KHZvaWQpCiB7Ci0gICAgZHByaW50Zl9rZXlib2FyZChzdGRkZWIsIkdldEtCQ29kZVBhZ2UoKVxuIik7CisgICAgZHByaW50Zl9pbmZvKGtleWJvYXJkLCJHZXRLQkNvZGVQYWdlKClcbiIpOwogICAgIHJldHVybiA4NTA7CiB9CiAKQEAgLTk4NCw3ICs5ODcsNyBAQAogICovCiBVSU5UMzIgV0lOQVBJIEdldEtCQ29kZVBhZ2UzMih2b2lkKQogewotICAgIGRwcmludGZfa2V5Ym9hcmQoc3RkZGViLCJHZXRLYkNvZGVQYWdlKClcbiIpOworICAgIGRwcmludGZfaW5mbyhrZXlib2FyZCwiR2V0S2JDb2RlUGFnZSgpXG4iKTsKICAgICByZXR1cm4gODUwOwogfQogCkBAIC0xMDE3LDcgKzEwMjAsNyBAQAogewogICAvKglpbnQgaTsgKi8KIAkKLSAgICAJZHByaW50Zl9rZXlib2FyZChzdGRkZWIsIkdldEtleU5hbWVUZXh0KCVsZCw8cHRyPiwlZClcbiIsbFBhcmFtLG5TaXplKTsKKyAgICAJZHByaW50Zl9pbmZvKGtleWJvYXJkLCJHZXRLZXlOYW1lVGV4dCglbGQsPHB0cj4sJWQpXG4iLGxQYXJhbSxuU2l6ZSk7CiAKIAlsUGFyYW0gPj49IDE2OwogCWxQYXJhbSAmPSAweGZmOwpAQCAtMTA2NSw3ICsxMDY4LDcgQEAKIAkgIHsKIAkgICAgaWYgKChlLmtleWNvZGUpICYmICgodmlydEtleTwweDEwKSB8fCAodmlydEtleT4weDEyKSkpIAogCQkvKiBpdCdzIG5vcm1hbCB0byBoYXZlIDIgc2hpZnQsIGNvbnRyb2wsIGFuZCBhbHQgISAqLwotCQlkcHJpbnRmX2tleWJvYXJkKHN0ZGRlYiwiVG9Bc2NpaSA6IFRoZSBrZXljb2RlcyAlZCBhbmQgJWQgYXJlIG1hdGNoaW5nIHRoZSBzYW1lIHZrZXkgJSNYXG4iLAorCQlkcHJpbnRmX2luZm8oa2V5Ym9hcmQsIlRvQXNjaWkgOiBUaGUga2V5Y29kZXMgJWQgYW5kICVkIGFyZSBtYXRjaGluZyB0aGUgc2FtZSB2a2V5ICUjWFxuIiwKIAkJCQkgZS5rZXljb2RlLGtleWMsdmlydEtleSk7CiAJICAgIGUua2V5Y29kZSA9IGtleWM7CiAJICB9CkBAIC0xMDg1LDcgKzEwODgsNyBAQAogICAgIGUuc3RhdGUgPSAwOwogICAgIGlmIChscEtleVN0YXRlW1ZLX1NISUZUXSAmIDB4ODApCiAJZS5zdGF0ZSB8PSBTaGlmdE1hc2s7Ci0gICAgZHByaW50Zl9rZXlib2FyZChzdGRkZWIsIlRvQXNjaWkgOiBscEtleVN0YXRlWzB4MTQoVktfQ0FQSVRBTCldPSUjeFxuIixscEtleVN0YXRlW1ZLX0NBUElUQUxdKTsKKyAgICBkcHJpbnRmX2luZm8oa2V5Ym9hcmQsIlRvQXNjaWkgOiBscEtleVN0YXRlWzB4MTQoVktfQ0FQSVRBTCldPSUjeFxuIixscEtleVN0YXRlW1ZLX0NBUElUQUxdKTsKICAgICBpZiAobHBLZXlTdGF0ZVtWS19DQVBJVEFMXSAmIDB4MDEpCiAJZS5zdGF0ZSB8PSBMb2NrTWFzazsKICAgICBpZiAobHBLZXlTdGF0ZVtWS19DT05UUk9MXSAmIDB4ODApCkBAIC0xMDk1LDcgKzEwOTgsNyBAQAogCSAgICBlLnN0YXRlIHw9IENvbnRyb2xNYXNrOwogICAgIGlmIChscEtleVN0YXRlW1ZLX05VTUxPQ0tdICYgMHgwMSkKIAllLnN0YXRlIHw9IE51bUxvY2tNYXNrOwotICAgIGRwcmludGZfa2V5KHN0ZGRlYiwgIlRvQXNjaWkoJTA0WCwgJTA0WCkgOiBmYWtlZCBzdGF0ZSA9ICVYXG4iLAorICAgIGRwcmludGZfaW5mbyhrZXksICJUb0FzY2lpKCUwNFgsICUwNFgpIDogZmFrZWQgc3RhdGUgPSAlWFxuIiwKIAkJdmlydEtleSwgc2NhbkNvZGUsIGUuc3RhdGUpOwogICAgIHJldCA9IFRTWExvb2t1cFN0cmluZygmZSwgKExQVk9JRClscENoYXIsIDIsICZrZXlzeW0sICZjcyk7CiAgICAgaWYgKHJldCA9PSAwKQpAQCAtMTIwOSw3ICsxMjEyLDcgQEAKIAkJfQogCSAgICB9CiAJfQotICAgIGRwcmludGZfa2V5KHN0ZGRlYiwgIlRvQXNjaWkgYWJvdXQgdG8gcmV0dXJuICVkIHdpdGggY2hhciAleFxuIiwKKyAgICBkcHJpbnRmX2luZm8oa2V5LCAiVG9Bc2NpaSBhYm91dCB0byByZXR1cm4gJWQgd2l0aCBjaGFyICV4XG4iLAogCQlyZXQsICooY2hhciopbHBDaGFyKTsKICAgICByZXR1cm4gcmV0OwogfQpkaWZmIC0tZ2l0IGEvd2luZG93cy9tZGkuYyBiL3dpbmRvd3MvbWRpLmMKaW5kZXggZTIwNDlmZC4uNmJhZTY3NCAxMDA2NDQKLS0tIGEvd2luZG93cy9tZGkuYworKysgYi93aW5kb3dzL21kaS5jCkBAIC0yNiw3ICsyNiw2IEBACiAjaW5jbHVkZSAicmVzb3VyY2UuaCIKICNpbmNsdWRlICJzdHJ1Y3QzMi5oIgogI2luY2x1ZGUgInN5c21ldHJpY3MuaCIKLSNpbmNsdWRlICJzdGRkZWJ1Zy5oIgogI2luY2x1ZGUgImRlYnVnLmgiCiAKICNkZWZpbmUgTURJRl9ORUVEVVBEQVRFCQkweDAwMDEKQEAgLTExMyw3ICsxMTIsNyBAQAogCXduZFB0ciA9IFdJTl9GaW5kV25kUHRyKE1ESV9HZXRDaGlsZEJ5SUQoY2xpZW50V25kLGluZGV4KSk7CiAJaWYoICF3bmRQdHIgKQogCXsKLQkgICAgICBkcHJpbnRmX21kaShzdGRkZWIsIk1ESU1lbnVEZWxldGVJdGVtOiBubyB3aW5kb3cgZm9yIGlkPSVpXG4iLGluZGV4KTsKKwkgICAgICBkcHJpbnRmX2luZm8obWRpLCJNRElNZW51RGVsZXRlSXRlbTogbm8gd2luZG93IGZvciBpZD0laVxuIixpbmRleCk7CiAJICAgICAgY29udGludWU7CiAJfQogICAgIApAQCAtMTk1LDcgKzE5NCw3IEBACiAgICAgSFdORDMyIGh3bmRGcmFtZSA9IEdldFBhcmVudDMyKGh3bmQpOwogICAgIEhNRU5VMzIgb2xkRnJhbWVNZW51ID0gR2V0TWVudTMyKGh3bmRGcmFtZSk7CiAKLSAgICBkcHJpbnRmX21kaShzdGRkZWIsICJXTV9NRElTRVRNRU5VOiAlMDR4ICUwNHggJTA0eFxuIiwKKyAgICBkcHJpbnRmX2luZm8obWRpLCAiV01fTURJU0VUTUVOVTogJTA0eCAlMDR4ICUwNHhcbiIsCiAgICAgICAgICAgICAgICAgaHduZCwgaG1lbnVGcmFtZSwgaG1lbnVXaW5kb3cpOwogCiAgICAgY2kgPSAoTURJQ0xJRU5USU5GTyAqKSB3LT53RXh0cmE7CkBAIC0yNjUsNyArMjY0LDcgQEAKICAgICBXT1JECSAgICAgd0lEbWVudSA9IGNpLT5pZEZpcnN0Q2hpbGQgKyBjaS0+bkFjdGl2ZUNoaWxkcmVuOwogICAgIGNoYXIJICAgICBscHN0ckRlZltdPSJqdW5rISI7CiAKLSAgICBkcHJpbnRmX21kaShzdGRuaW1wLCJNRElDcmVhdGVDaGlsZDogb3JpZ2luICVpLCVpIC0gZGltICVpLCVpLCBzdHlsZSAlMDh4XG4iLCAKKyAgICBkcHJpbnRmX2luZm8obWRpLCAiTURJQ3JlYXRlQ2hpbGQ6IG9yaWdpbiAlaSwlaSAtIGRpbSAlaSwlaSwgc3R5bGUgJTA4eFxuIiwgCiAgICAgICAgICAgICAgICAgY3MtPngsIGNzLT55LCBjcy0+Y3gsIGNzLT5jeSwgKHVuc2lnbmVkKWNzLT5zdHlsZSk7ICAgIAogICAgIC8qIGNhbGN1bGF0ZSBwbGFjZW1lbnQgKi8KICAgICBNRElfQ2FsY0RlZmF1bHRDaGlsZFBvcyh3LCBjaS0+blRvdGFsQ3JlYXRlZCsrLCBwb3MsIDApOwpAQCAtMzU0LDcgKzM1Myw3IEBACiAgICAgICAgICAgICAgICAgTURJX1VwZGF0ZUZyYW1lVGV4dCggdy0+cGFyZW50LCBjaS0+c2VsZiwgTURJX1JFUEFJTlRGUkFNRSwgTlVMTCApOyAKIAkgICAgfQogCX0KLSAgICAgICAgZHByaW50Zl9tZGkoc3RkZGViLCAiTURJQ3JlYXRlQ2hpbGQ6IGNyZWF0ZWQgY2hpbGQgLSAlMDR4XG4iLGh3bmQpOworICAgICAgICBkcHJpbnRmX2luZm8obWRpLCAiTURJQ3JlYXRlQ2hpbGQ6IGNyZWF0ZWQgY2hpbGQgLSAlMDR4XG4iLGh3bmQpOwogICAgIH0KICAgICBlbHNlCiAgICAgewpAQCAtMzg5LDcgKzM4OCw3IEBACiAgICAgbHBNaW5NYXgtPnB0TWF4UG9zaXRpb24ueCA9IHJlY3QubGVmdDsKICAgICBscE1pbk1heC0+cHRNYXhQb3NpdGlvbi55ID0gcmVjdC50b3A7IAogCi0gICAgZHByaW50Zl9tZGkoc3RkZGViLCJcdENoaWxkTWluTWF4SW5mbzogbWF4IHJlY3QgKCVpLCVpIC0gJWksICVpKVxuIiwgCisgICAgZHByaW50Zl9pbmZvKG1kaSwiXHRDaGlsZE1pbk1heEluZm86IG1heCByZWN0ICglaSwlaSAtICVpLCAlaSlcbiIsIAogICAgICAgICAgICAgICAgICAgICAgICAgcmVjdC5sZWZ0LHJlY3QudG9wLHJlY3QucmlnaHQscmVjdC5ib3R0b20pOwogfQogCkBAIC00MTEsNyArNDEwLDcgQEAKICAKICAgICBjaSA9IChNRElDTElFTlRJTkZPICopIHctPndFeHRyYTsKIAotICAgIGRwcmludGZfbWRpKHN0ZGRlYiwgIk1ESV9Td2l0Y2hBY3RpdmVDaGlsZDogZnJvbSAlMDR4LCB0byAlMDR4XG4iLGNoaWxkSHduZCxod25kVG8pOworICAgIGRwcmludGZfaW5mbyhtZGksICJNRElfU3dpdGNoQWN0aXZlQ2hpbGQ6IGZyb20gJTA0eCwgdG8gJTA0eFxuIixjaGlsZEh3bmQsaHduZFRvKTsKIAogICAgIGlmICggIWh3bmRUbyApIHJldHVybjsgLyogbm8gd2luZG93IHRvIHN3aXRjaCB0byAqLwogCkBAIC00NzEsNyArNDcwLDcgQEAKIAkKICAgICAgICAgY2ktPm5BY3RpdmVDaGlsZHJlbi0tOwogCi0gICAgICAgIGRwcmludGZfbWRpKHN0ZGRlYiwiTURJRGVzdHJveUNoaWxkOiBjaGlsZCBkZXN0cm95ZWQgLSAlMDR4XG4iLGNoaWxkKTsKKyAgICAgICAgZHByaW50Zl9pbmZvKG1kaSwiTURJRGVzdHJveUNoaWxkOiBjaGlsZCBkZXN0cm95ZWQgLSAlMDR4XG4iLGNoaWxkKTsKIAogICAgICAgICBpZiAoZmxhZ0Rlc3Ryb3kpCiAJewpAQCAtNTAyLDcgKzUwMSw3IEBACiAgICAgaWYoIHduZFB0ciApCiAgICAgICAgIGlmKCB3bmRQdHItPmR3U3R5bGUgJiBXU19ESVNBQkxFRCApIHJldHVybiAwTDsKIAotICAgIGRwcmludGZfbWRpKHN0ZGRlYiwiTURJX0NoaWxkQWN0aXZhdGU6ICUwNHhcbiIsIGhXbmRDaGlsZCk7CisgICAgZHByaW50Zl9pbmZvKG1kaSwiTURJX0NoaWxkQWN0aXZhdGU6ICUwNHhcbiIsIGhXbmRDaGlsZCk7CiAKICAgICBpZiggR2V0QWN0aXZlV2luZG93MzIoKSA9PSBjbGllbnRQdHItPnBhcmVudC0+aHduZFNlbGYgKQogICAgICAgICBpc0FjdGl2ZUZyYW1lV25kID0gVFJVRTsKQEAgLTYyNiw3ICs2MjUsNyBAQAogCSAgICAvKiB3YWxrIHRoZSBsaXN0IGFuZCBtb3ZlIHdpbmRvd3MgKi8KIAkgICAgd2hpbGUgKCAqcHBXbmQgKQogCSAgICB7Ci0JCWRwcmludGZfbWRpKHN0ZGRlYiwgIk1ESUNhc2NhZGU6IG1vdmUgJTA0eCB0byAoJWQsJWQpIHNpemUgWyVkLCVkXVxuIiwgCisJCWRwcmludGZfaW5mbyhtZGksICJNRElDYXNjYWRlOiBtb3ZlICUwNHggdG8gKCVkLCVkKSBzaXplIFslZCwlZF1cbiIsIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICgqcHBXbmQpLT5od25kU2VsZiwgcG9zWzBdLngsIHBvc1swXS55LCBwb3NbMV0ueCwgcG9zWzFdLnkpOwogCiAJCU1ESV9DYWxjRGVmYXVsdENoaWxkUG9zKGNsaWVudFduZCwgbisrLCBwb3MsIGRlbHRhKTsKQEAgLTY2MCw3ICs2NTksNyBAQAogICAgIHBwV25kID0gV0lOX0J1aWxkV2luQXJyYXkod25kQ2xpZW50LCBCV0FfU0tJUEhJRERFTiB8IEJXQV9TS0lQT1dORUQgfCBCV0FfU0tJUElDT05JQyB8CiAJICAgICgod1BhcmFtICYgTURJVElMRV9TS0lQRElTQUJMRUQpPyBCV0FfU0tJUERJU0FCTEVEIDogMCksICZ0b3RhbCApOwogCi0gICAgZHByaW50Zl9tZGkoc3RkZGViLCJNRElUaWxlOiAldSB3aW5kb3dzIHRvIHRpbGVcbiIsIHRvdGFsKTsKKyAgICBkcHJpbnRmX2luZm8obWRpLCJNRElUaWxlOiAldSB3aW5kb3dzIHRvIHRpbGVcbiIsIHRvdGFsKTsKIAogICAgIGlmKCBwcFduZCApCiAgICAgewpAQCAtNzI5LDcgKzcyOCw3IEBACiAgICAgV05EKgljaGlsZCA9IFdJTl9GaW5kV25kUHRyKGhDaGlsZCk7CiAgICAgSE1FTlUzMiAgCWhTeXNQb3B1cCA9IDA7CiAKLSAgICBkcHJpbnRmX21kaShzdGRkZWIsIk1ESV9BdWdtZW50RnJhbWVNZW51OiBmcmFtZSAlcCxjaGlsZCAlMDR4XG4iLGZyYW1lLGhDaGlsZCk7CisgICAgZHByaW50Zl9pbmZvKG1kaSwiTURJX0F1Z21lbnRGcmFtZU1lbnU6IGZyYW1lICVwLGNoaWxkICUwNHhcbiIsZnJhbWUsaENoaWxkKTsKIAogICAgIGlmKCAhZnJhbWUtPndJRG1lbnUgfHwgIWNoaWxkLT5oU3lzTWVudSApIHJldHVybiAwOyAKIApAQCAtNzM4LDcgKzczNyw4IEBACiAgICAgaWYgKCEoaFN5c1BvcHVwID0gTG9hZE1lbnVJbmRpcmVjdDMyQShTWVNSRVNfR2V0UmVzUHRyKFNZU1JFU19NRU5VX1NZU01FTlUpKSkpCiAJcmV0dXJuIDA7CiAgCi0gICAgZHByaW50Zl9tZGkoc3RkZGViLCJcdFx0Z290IHBvcHVwICUwNHhcbiBpbiBzeXNtZW51ICUwNHgiLGhTeXNQb3B1cCxjaGlsZC0+aFN5c01lbnUpOworICAgIGRwcmludGZfaW5mbyhtZGksIlx0Z290IHBvcHVwICUwNHggaW4gc3lzbWVudSAlMDR4XG4iLCAKKwkJaFN5c1BvcHVwLCBjaGlsZC0+aFN5c01lbnUpOwogIAogICAgIGlmKCAhSW5zZXJ0TWVudTMyQShmcmFtZS0+d0lEbWVudSwwLE1GX0JZUE9TSVRJT04gfCBNRl9CSVRNQVAgfCBNRl9QT1BVUCwKICAgICAgICAgICAgICAgICAgICAgaFN5c1BvcHVwLCAoTFBTVFIpKERXT1JEKWhCbXBDbG9zZSApKQpAQCAtNzcxLDcgKzc3MSw3IEBACiB7CiAgICAgSU5UMzIgbkl0ZW1zID0gR2V0TWVudUl0ZW1Db3VudDMyKGZyYW1lV25kLT53SURtZW51KSAtIDE7CiAKLSAgICBkcHJpbnRmX21kaShzdGRkZWIsIk1ESV9SZXN0b3JlRnJhbWVNZW51OiBmb3IgY2hpbGQgJTA0eFxuIixoQ2hpbGQpOworICAgIGRwcmludGZfaW5mbyhtZGksIk1ESV9SZXN0b3JlRnJhbWVNZW51OiBmb3IgY2hpbGQgJTA0eFxuIixoQ2hpbGQpOwogCiAgICAgaWYoIEdldE1lbnVJdGVtSUQzMihmcmFtZVduZC0+d0lEbWVudSxuSXRlbXMpICE9IFNDX1JFU1RPUkUgKQogCXJldHVybiAwOyAKQEAgLTc5OCw3ICs3OTgsNyBAQAogICAgIFdORCogICBjbGllbnRXbmQgPSBXSU5fRmluZFduZFB0cihoQ2xpZW50KTsKICAgICBNRElDTElFTlRJTkZPICpjaSA9IChNRElDTElFTlRJTkZPICopIGNsaWVudFduZC0+d0V4dHJhOwogCi0gICAgZHByaW50Zl9tZGkoc3RkZGViLCAiTURJOiByZXBhaW50ICVpLCBmcmFtZVRleHQgJXNcbiIsIHJlcGFpbnQsIChscFRpdGxlKT9scFRpdGxlOiJOVUxMIik7CisgICAgZHByaW50Zl9pbmZvKG1kaSwgIk1ESTogcmVwYWludCAlaSwgZnJhbWVUZXh0ICVzXG4iLCByZXBhaW50LCAobHBUaXRsZSk/bHBUaXRsZToiTlVMTCIpOwogCiAgICAgaWYgKCFjbGllbnRXbmQpCiAgICAgICAgICAgIHJldHVybjsKQEAgLTkyNSw3ICs5MjUsNyBAQAogCU5DX0hhbmRsZU5DQ2FsY1NpemUoIHcsICZyZWN0ICk7CiAJdy0+cmVjdENsaWVudCA9IHJlY3Q7CiAKLQlkcHJpbnRmX21kaShzdGRkZWIsIk1ESTogQ2xpZW50IGNyZWF0ZWQgLSBod25kID0gJTA0eCwgaWRGaXJzdCA9ICV1XG4iLAorCWRwcmludGZfaW5mbyhtZGksIk1ESTogQ2xpZW50IGNyZWF0ZWQgLSBod25kID0gJTA0eCwgaWRGaXJzdCA9ICV1XG4iLAogCQkJICAgaHduZCwgY2ktPmlkRmlyc3RDaGlsZCApOwogCiAJcmV0dXJuIDA7CkBAIC0xMDE3LDcgKzEwMTcsNyBAQAogICAgICAgICAgICAgUE9JTlQxNiAgcHQgPSBNQUtFUE9JTlQxNihsUGFyYW0pOwogICAgICAgICAgICAgSFdORDE2IGNoaWxkID0gQ2hpbGRXaW5kb3dGcm9tUG9pbnQxNihod25kLCBwdCk7CiAKLQkgICAgZHByaW50Zl9tZGkoc3RkZGViLCJNRElDbGllbnQ6IG5vdGlmaWNhdGlvbiBmcm9tICUwNHggKCVpLCVpKVxuIixjaGlsZCxwdC54LHB0LnkpOworCSAgICBkcHJpbnRmX2luZm8obWRpLCJNRElDbGllbnQ6IG5vdGlmaWNhdGlvbiBmcm9tICUwNHggKCVpLCVpKVxuIixjaGlsZCxwdC54LHB0LnkpOwogCiAgICAgICAgICAgICBpZiggY2hpbGQgJiYgY2hpbGQgIT0gaHduZCAmJiBjaGlsZCAhPSBjaS0+aHduZEFjdGl2ZUNoaWxkICkKICAgICAgICAgICAgICAgICBTZXRXaW5kb3dQb3MzMihjaGlsZCwgMCwwLDAsMCwwLCBTV1BfTk9TSVpFIHwgU1dQX05PTU9WRSApOwpAQCAtMTI2NSw3ICsxMjY1LDcgQEAKIAlyZXR1cm4gMDsKIAogICAgICAgY2FzZSBXTV9OQ1BBSU5UOgotCWRwcmludGZfbWRpKHN0ZGRlYiwiRGVmTURJQ2hpbGRQcm9jOiBXTV9OQ1BBSU5UIGZvciAlMDR4LCBhY3RpdmUgJTA0eFxuIiwKKwlkcHJpbnRmX2luZm8obWRpLCJEZWZNRElDaGlsZFByb2M6IFdNX05DUEFJTlQgZm9yICUwNHgsIGFjdGl2ZSAlMDR4XG4iLAogCQkJCQkgICAgIGh3bmQsIGNpLT5od25kQWN0aXZlQ2hpbGQgKTsKIAlicmVhazsKIApAQCAtMTMzMiw3ICsxMzMyLDcgQEAKIAkgICAgICAgIFNlbmRNZXNzYWdlMTYoIGhNYXhDaGlsZCwgV01fU0VUUkVEUkFXLCBUUlVFLCAwTCApOwogCSAgICB9CiAKLQkgICAgZHByaW50Zl9tZGkoc3RkZGViLCJcdE1ESTogbWF4aW1pemluZyBjaGlsZCAlMDR4XG4iLCBod25kICk7CisJICAgIGRwcmludGZfaW5mbyhtZGksIlx0TURJOiBtYXhpbWl6aW5nIGNoaWxkICUwNHhcbiIsIGh3bmQgKTsKIAogCSAgICBjaS0+aHduZENoaWxkTWF4aW1pemVkID0gaHduZDsgLyogISEhICovCiAKQEAgLTE1MjMsNyArMTUyMyw3IEBACiAJCSAgICBkZWZhdWx0OgogCQkJIHJldHVybiAwOwogCQl9Ci0JICAgICAgICBkcHJpbnRmX21kaShzdGRkZWIsIlRyYW5zbGF0ZU1ESVN5c0FjY2VsOiB3UGFyYW0gPSAlMDR4XG4iLCB3UGFyYW0pOworCSAgICAgICAgZHByaW50Zl9pbmZvKG1kaSwiVHJhbnNsYXRlTURJU3lzQWNjZWw6IHdQYXJhbSA9ICUwNHhcbiIsIHdQYXJhbSk7CiAJICAgICAgICBTZW5kTWVzc2FnZTE2KCBjaS0+aHduZEFjdGl2ZUNoaWxkLCBXTV9TWVNDT01NQU5ELCAKIAkJCQkJd1BhcmFtLCAoTFBBUkFNKW1zZy0+d1BhcmFtKTsKIAkgICAgICAgIHJldHVybiAxOwpkaWZmIC0tZ2l0IGEvd2luZG93cy9tZXNzYWdlLmMgYi93aW5kb3dzL21lc3NhZ2UuYwppbmRleCA1YWMyNDA3Li42YjYyN2EwIDEwMDY0NAotLS0gYS93aW5kb3dzL21lc3NhZ2UuYworKysgYi93aW5kb3dzL21lc3NhZ2UuYwpAQCAtMjQsOCArMjQsNiBAQAogI2luY2x1ZGUgInF1ZXVlLmgiCiAjaW5jbHVkZSAid2lucHJvYy5oIgogI2luY2x1ZGUgIm9wdGlvbnMuaCIKLSNpbmNsdWRlICJzdGRkZWJ1Zy5oIgotLyogI2RlZmluZSBERUJVR19NU0cgKi8KICNpbmNsdWRlICJkZWJ1Zy5oIgogCiAjZGVmaW5lIFdNX05DTU9VU0VGSVJTVCAgICAgICAgIFdNX05DTU9VU0VNT1ZFCkBAIC0zNTcsNyArMzU1LDcgQEAKICAgdG1wTXNnID0gU0VHUFRSX05FVyhFVkVOVE1TRzE2KTsKICAgd3RpbWU9SE9PS19DYWxsSG9va3MxNiggV0hfSk9VUk5BTFBMQVlCQUNLLCBIQ19HRVRORVhULCAwLAogCQkJICAoTFBBUkFNKVNFR1BUUl9HRVQodG1wTXNnKSk7Ci0gIC8qICBkcHJpbnRmX21zZyhzdGRkZWIsIlBsYXliYWNrIHdhaXQgdGltZSA9JWxkXG4iLHd0aW1lKTsgKi8KKyAgLyogIGRwcmludGZfaW5mbyhtc2csIlBsYXliYWNrIHdhaXQgdGltZSA9JWxkXG4iLHd0aW1lKTsgKi8KICAgaWYgKHd0aW1lPD0wKQogICB7CiAgICB3dGltZT0wOwpAQCAtNTk4LDEyICs1OTYsMTIgQEAKICAgICBpZiAoSXNUYXNrTG9ja2VkKCkgfHwgIUlzV2luZG93MzIoaHduZCkpIHJldHVybiAwOwogCiAgICAgZGVidWdTTVJMKz00OwotICAgIGRwcmludGZfc2VuZG1zZyhzdGRkZWIsIiUqc1NNOiAlcyBbJTA0eF0gKCUwNHggLT4gJTA0eClcbiIsIAorICAgIGRwcmludGZfaW5mbyhzZW5kbXNnLCIlKnNTTTogJXMgWyUwNHhdICglMDR4IC0+ICUwNHgpXG4iLCAKIAkJICAgIHByZXZTTVJMLCAiIiwgU1BZX0dldE1zZ05hbWUobXNnKSwgbXNnLCBxdWV1ZS0+c2VsZiwgaERlc3RRdWV1ZSApOwogCiAgICAgaWYoICEocXVldWUtPndha2VCaXRzICYgUVNfU01QQVJBTVNGUkVFKSApCiAgICAgewotICAgICAgZHByaW50Zl9zZW5kbXNnKHN0ZGRlYiwiXHRJbnRlcnRhc2sgU2VuZE1lc3NhZ2U6IHNsZWVwaW5nIHNpbmNlIHVucmVwbGllZCBTZW5kTWVzc2FnZSBwZW5kaW5nXG4iKTsKKyAgICAgIGRwcmludGZfaW5mbyhzZW5kbXNnLCJcdEludGVydGFzayBTZW5kTWVzc2FnZTogc2xlZXBpbmcgc2luY2UgdW5yZXBsaWVkIFNlbmRNZXNzYWdlIHBlbmRpbmdcbiIpOwogICAgICAgcXVldWUtPmNoYW5nZUJpdHMgJj0gflFTX1NNUEFSQU1TRlJFRTsKICAgICAgIFFVRVVFX1dhaXRCaXRzKCBRU19TTVBBUkFNU0ZSRUUgKTsKICAgICB9CkBAIC02MjEsNyArNjE5LDcgQEAKICAgICBxdWV1ZS0+d2FrZUJpdHMgJj0gflFTX1NNUEFSQU1TRlJFRTsKICAgICBxdWV1ZS0+ZmxhZ3MgPSAocXVldWUtPmZsYWdzICYgfihRVUVVRV9TTV9XSU4zMnxRVUVVRV9TTV9VTklDT0RFKSkgfCBmbGFnczsKIAotICAgIGRwcmludGZfc2VuZG1zZyhzdGRkZWIsIiUqc3NtOiBzbVJlc3VsdEluaXQgPSAlMDh4XG4iLCBwcmV2U01STCwgIiIsICh1bnNpZ25lZCkmcUN0cmwpOworICAgIGRwcmludGZfaW5mbyhzZW5kbXNnLCIlKnNzbTogc21SZXN1bHRJbml0ID0gJTA4eFxuIiwgcHJldlNNUkwsICIiLCAodW5zaWduZWQpJnFDdHJsKTsKIAogICAgIHF1ZXVlLT5zbVJlc3VsdEluaXQgPSAmcUN0cmw7CiAKQEAgLTYzNiwxMSArNjM0LDExIEBACiAgICAgICAgIHF1ZXVlLT5jaGFuZ2VCaXRzICY9IH5RU19TTVJFU1VMVDsKICAgICAgICAgRGlyZWN0ZWRZaWVsZCggZGVzdFEtPmhUYXNrICk7CiAgICAgICAgIFFVRVVFX1dhaXRCaXRzKCBRU19TTVJFU1VMVCApOwotCWRwcmludGZfc2VuZG1zZyhzdGRkZWIsIlx0c206IGhhdmUgcmVzdWx0IVxuIik7CisJZHByaW50Zl9pbmZvKHNlbmRtc2csIlx0c206IGhhdmUgcmVzdWx0IVxuIik7CiAgICAgICB9CiAgICAgICAvKiBnb3Qgc29tZXRoaW5nICovCiAKLSAgICAgIGRwcmludGZfc2VuZG1zZyhzdGRkZWIsIiUqc3NtOiBzbVJlc3VsdCA9ICUwOHhcbiIsIHByZXZTTVJMLCAiIiwgKHVuc2lnbmVkKXF1ZXVlLT5zbVJlc3VsdCApOworICAgICAgZHByaW50Zl9pbmZvKHNlbmRtc2csIiUqc3NtOiBzbVJlc3VsdCA9ICUwOHhcbiIsIHByZXZTTVJMLCAiIiwgKHVuc2lnbmVkKXF1ZXVlLT5zbVJlc3VsdCApOwogCiAgICAgICBpZiAocXVldWUtPnNtUmVzdWx0KSB7IC8qIEZJWE1FLCBzbVJlc3VsdCBzaG91bGQgYWx3YXlzIGJlIHNldCAqLwogICAgICAgICBxdWV1ZS0+c21SZXN1bHQtPmxSZXN1bHQgPSBxdWV1ZS0+U2VuZE1lc3NhZ2VSZXR1cm47CkBAIC02NDksMTEgKzY0NywxMSBAQAogICAgICAgcXVldWUtPndha2VCaXRzICY9IH5RU19TTVJFU1VMVDsKIAogICAgICAgaWYoIHF1ZXVlLT5zbVJlc3VsdCAhPSAmcUN0cmwgKQotCSAgZHByaW50Zl9zZW5kbXNnKHN0ZGRlYiwiJSpzc206IHdlaXJkIHNjZW5lcyBpbnNpZGUgdGhlIGdvbGRtaW5lIVxuIiwgcHJldlNNUkwsICIiKTsKKwkgIGRwcmludGZfZXJyKHNlbmRtc2csICIlKnNzbTogd2VpcmQgc2NlbmVzIGluc2lkZSB0aGUgZ29sZG1pbmUhXG4iLCBwcmV2U01STCwgIiIpOwogICAgIH0KICAgICBxdWV1ZS0+c21SZXN1bHRJbml0ID0gTlVMTDsKICAgICAKLSAgICBkcHJpbnRmX3NlbmRtc2coc3RkZGViLCIlKnNTTTogWyUwNHhdIHJldHVybmluZyAlMDhseFxuIiwgcHJldlNNUkwsICIiLCBtc2csIHFDdHJsLmxSZXN1bHQpOworICAgIGRwcmludGZfaW5mbyhzZW5kbXNnLCIlKnNTTTogWyUwNHhdIHJldHVybmluZyAlMDhseFxuIiwgcHJldlNNUkwsICIiLCBtc2csIHFDdHJsLmxSZXN1bHQpOwogICAgIGRlYnVnU01STC09NDsKIAogICAgIHJldHVybiBxQ3RybC5sUmVzdWx0OwpAQCAtNjcwLDExICs2NjgsMTEgQEAKIAogICAgIGlmICghKHF1ZXVlID0gKE1FU1NBR0VRVUVVRSopR2xvYmFsTG9jazE2KCBHZXRUYXNrUXVldWUoMCkgKSkpIHJldHVybjsKIAotICAgIGRwcmludGZfbXNnKHN0ZGRlYiwiUmVwbHlNZXNzYWdlLCBxdWV1ZSAlMDR4XG4iLCBxdWV1ZS0+c2VsZik7CisgICAgZHByaW50Zl9pbmZvKG1zZywiUmVwbHlNZXNzYWdlLCBxdWV1ZSAlMDR4XG4iLCBxdWV1ZS0+c2VsZik7CiAKICAgICB3aGlsZSggKHNlbmRlclEgPSAoTUVTU0FHRVFVRVVFKilHbG9iYWxMb2NrMTYoIHF1ZXVlLT5JblNlbmRNZXNzYWdlSGFuZGxlKSkpCiAgICAgewotICAgICAgZHByaW50Zl9tc2coc3RkZGViLCJcdHJwbTogcmVwbHlpbmcgdG8gJTA0eCAoJTA0eCAtPiAlMDR4KVxuIiwKKyAgICAgIGRwcmludGZfaW5mbyhtc2csIlx0cnBtOiByZXBseWluZyB0byAlMDR4ICglMDR4IC0+ICUwNHgpXG4iLAogICAgICAgICAgICAgICAgICAgICAgICAgICBxdWV1ZS0+bXNnLCBxdWV1ZS0+c2VsZiwgc2VuZGVyUS0+c2VsZik7CiAKICAgICAgIGlmKCBxdWV1ZS0+d2FrZUJpdHMgJiBRU19TRU5ETUVTU0FHRSApCkBAIC02ODYsMTAgKzY4NCwxMCBAQAogICAgICAgaWYoIShzZW5kZXJRLT53YWtlQml0cyAmIFFTX1NNUkVTVUxUKSApIGJyZWFrOwogICAgICAgT2xkWWllbGQoKTsKICAgICB9IAotICAgIGlmKCAhc2VuZGVyUSApIHsgZHByaW50Zl9tc2coc3RkZGViLCJcdHJwbTogZG9uZVxuIik7IHJldHVybjsgfQorICAgIGlmKCAhc2VuZGVyUSApIHsgZHByaW50Zl9pbmZvKG1zZywiXHRycG06IGRvbmVcbiIpOyByZXR1cm47IH0KIAogICAgIHNlbmRlclEtPlNlbmRNZXNzYWdlUmV0dXJuID0gcmVzdWx0OwotICAgIGRwcmludGZfbXNnKHN0ZGRlYiwiXHRycG06IHNtUmVzdWx0ID0gJTA4eCwgcmVzdWx0ID0gJTA4bHhcbiIsIAorICAgIGRwcmludGZfaW5mbyhtc2csIlx0cnBtOiBzbVJlc3VsdCA9ICUwOHgsIHJlc3VsdCA9ICUwOGx4XG4iLCAKIAkJCSh1bnNpZ25lZClxdWV1ZS0+c21SZXN1bHRDdXJyZW50LCByZXN1bHQgKTsKIAogICAgIHNlbmRlclEtPnNtUmVzdWx0ID0gcXVldWUtPnNtUmVzdWx0Q3VycmVudDsKQEAgLTkzOSw3ICs5MzcsNyBAQAogICAgIE1TR19QZWVrTWVzc2FnZSggbHBtc2csCiAgICAgICAgICAgICAgICAgICAgICBod25kLCBmaXJzdCwgbGFzdCwgUE1fUkVNT1ZFLCBGQUxTRSApOwogCi0gICAgZHByaW50Zl9tc2coc3RkZGViLCJtZXNzYWdlICUwNHgsIGh3bmQgJTA0eCwgZmlsdGVyKCUwNHggLSAlMDR4KVxuIiwgbHBtc2ctPm1lc3NhZ2UsCisgICAgZHByaW50Zl9pbmZvKG1zZywibWVzc2FnZSAlMDR4LCBod25kICUwNHgsIGZpbHRlciglMDR4IC0gJTA0eClcbiIsIGxwbXNnLT5tZXNzYWdlLAogCQkgICAgIAkJCQkgICAgICAgICAgICAgICAgIGh3bmQsIGZpcnN0LCBsYXN0ICk7CiAgICAgSE9PS19DYWxsSG9va3MxNiggV0hfR0VUTUVTU0FHRSwgSENfQUNUSU9OLCAwLCAoTFBBUkFNKW1zZyApOwogICAgIHJldHVybiAobHBtc2ctPm1lc3NhZ2UgIT0gV01fUVVJVCk7CkBAIC05NzAsMTcgKzk2OCwxNyBAQAogICAgIAogICAgIGlmIChod25kID09IEhXTkRfQlJPQURDQVNUKQogICAgIHsKLSAgICAgICAgZHByaW50Zl9tc2coc3RkZGViLCJQb3N0TWVzc2FnZSAvLyBIV05EX0JST0FEQ0FTVCAhXG4iKTsKKyAgICAgICAgZHByaW50Zl9pbmZvKG1zZywiUG9zdE1lc3NhZ2UgLy8gSFdORF9CUk9BRENBU1QgIVxuIik7CiAgICAgICAgIGZvciAod25kUHRyID0gV0lOX0dldERlc2t0b3AoKS0+Y2hpbGQ7IHduZFB0cjsgd25kUHRyID0gd25kUHRyLT5uZXh0KQogICAgICAgICB7CiAgICAgICAgICAgICBpZiAod25kUHRyLT5kd1N0eWxlICYgV1NfUE9QVVAgfHwgd25kUHRyLT5kd1N0eWxlICYgV1NfQ0FQVElPTikKICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBkcHJpbnRmX21zZyhzdGRkZWIsIkJST0FEQ0FTVCBNZXNzYWdlIHRvIGhXbmQ9JTA0eCBtPSUwNFggdz0lMDRYIGw9JTA4bFggIVxuIiwKKyAgICAgICAgICAgICAgICBkcHJpbnRmX2luZm8obXNnLCJCUk9BRENBU1QgTWVzc2FnZSB0byBoV25kPSUwNHggbT0lMDRYIHc9JTA0WCBsPSUwOGxYICFcbiIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd25kUHRyLT5od25kU2VsZiwgbWVzc2FnZSwgd1BhcmFtLCBsUGFyYW0pOwogICAgICAgICAgICAgICAgIFBvc3RNZXNzYWdlMTYoIHduZFB0ci0+aHduZFNlbGYsIG1lc3NhZ2UsIHdQYXJhbSwgbFBhcmFtICk7CiAgICAgICAgICAgICB9CiAgICAgICAgIH0KLSAgICAgICAgZHByaW50Zl9tc2coc3RkZGViLCJQb3N0TWVzc2FnZSAvLyBFbmQgb2YgSFdORF9CUk9BRENBU1QgIVxuIik7CisgICAgICAgIGRwcmludGZfaW5mbyhtc2csIlBvc3RNZXNzYWdlIC8vIEVuZCBvZiBIV05EX0JST0FEQ0FTVCAhXG4iKTsKICAgICAgICAgcmV0dXJuIFRSVUU7CiAgICAgfQogCkBAIC0xMDUzLDIwICsxMDUxLDIwIEBACiAgICAgewogICAgICAgICBpZiAoIShsaXN0ID0gV0lOX0J1aWxkV2luQXJyYXkoIFdJTl9HZXREZXNrdG9wKCksIDAsIE5VTEwgKSkpCiAgICAgICAgICAgICByZXR1cm4gVFJVRTsKLSAgICAgICAgZHByaW50Zl9tc2coc3RkZGViLCJTZW5kTWVzc2FnZSAvLyBIV05EX0JST0FEQ0FTVCAhXG4iKTsKKyAgICAgICAgZHByaW50Zl9pbmZvKG1zZywiU2VuZE1lc3NhZ2UgLy8gSFdORF9CUk9BRENBU1QgIVxuIik7CiAgICAgICAgIGZvciAocHBXbmQgPSBsaXN0OyAqcHBXbmQ7IHBwV25kKyspCiAgICAgICAgIHsKICAgICAgICAgICAgIHduZFB0ciA9ICpwcFduZDsKICAgICAgICAgICAgIGlmICghSXNXaW5kb3czMih3bmRQdHItPmh3bmRTZWxmKSkgY29udGludWU7CiAgICAgICAgICAgICBpZiAod25kUHRyLT5kd1N0eWxlICYgV1NfUE9QVVAgfHwgd25kUHRyLT5kd1N0eWxlICYgV1NfQ0FQVElPTikKICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBkcHJpbnRmX21zZyhzdGRkZWIsIkJST0FEQ0FTVCBNZXNzYWdlIHRvIGhXbmQ9JTA0eCBtPSUwNFggdz0lMDRsWCBsPSUwOGxYICFcbiIsCisgICAgICAgICAgICAgICAgZHByaW50Zl9pbmZvKG1zZywiQlJPQURDQVNUIE1lc3NhZ2UgdG8gaFduZD0lMDR4IG09JTA0WCB3PSUwNGxYIGw9JTA4bFggIVxuIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3bmRQdHItPmh3bmRTZWxmLCBtc2csIChEV09SRCl3UGFyYW0sIGxQYXJhbSk7CiAgICAgICAgICAgICAgICAgU2VuZE1lc3NhZ2UxNiggd25kUHRyLT5od25kU2VsZiwgbXNnLCB3UGFyYW0sIGxQYXJhbSApOwogICAgICAgICAgICAgfQogICAgICAgICB9CiAgICAgICAgIEhlYXBGcmVlKCBTeXN0ZW1IZWFwLCAwLCBsaXN0ICk7Ci0gICAgICAgIGRwcmludGZfbXNnKHN0ZGRlYiwiU2VuZE1lc3NhZ2UgLy8gRW5kIG9mIEhXTkRfQlJPQURDQVNUICFcbiIpOworICAgICAgICBkcHJpbnRmX2luZm8obXNnLCJTZW5kTWVzc2FnZSAvLyBFbmQgb2YgSFdORF9CUk9BRENBU1QgIVxuIik7CiAgICAgICAgIHJldHVybiBUUlVFOwogICAgIH0KIApAQCAtMTQyNCwxNSArMTQyMiwxNiBAQAogICAgIHN0YXRpYyBpbnQgZGVhZF9jaGFyOwogICAgIEJZVEUgd3BbMl07CiAgICAgCi0gICAgaWYgKChkZWJ1Z2dpbmdfbXNnICYmIG1lc3NhZ2UgIT0gV01fTU9VU0VNT1ZFICYmIG1lc3NhZ2UgIT0gV01fVElNRVIpCi0gICAgICAgIHx8IChkZWJ1Z2dpbmdfa2V5Ci0gICAgICAgICAgICAmJiBtZXNzYWdlID49IFdNX0tFWUZJUlNUICYmIG1lc3NhZ2UgPD0gV01fS0VZTEFTVCkpCi0gICAgICAgIGZwcmludGYoc3RkZGViLCAiVHJhbnNsYXRlTWVzc2FnZSglcywgJTA0WCwgJTA4bFgpXG4iLAotCQlTUFlfR2V0TXNnTmFtZShtZXNzYWdlKSwgd1BhcmFtLCBsUGFyYW0gKTsKKyAgICBpZiAobWVzc2FnZSAhPSBXTV9NT1VTRU1PVkUgJiYgbWVzc2FnZSAhPSBXTV9USU1FUikKKyAgICAgICAgZHByaW50Zl9pbmZvKG1zZywgIlRyYW5zbGF0ZU1lc3NhZ2UoJXMsICUwNFgsICUwOGxYKVxuIiwKKwkJICAgICBTUFlfR2V0TXNnTmFtZShtZXNzYWdlKSwgd1BhcmFtLCBsUGFyYW0gKTsKKyAgICBpZihtZXNzYWdlID49IFdNX0tFWUZJUlNUICYmIG1lc3NhZ2UgPD0gV01fS0VZTEFTVCkKKyAgICAgICAgZHByaW50Zl9pbmZvKGtleSwgIlRyYW5zbGF0ZU1lc3NhZ2UoJXMsICUwNFgsICUwOGxYKVxuIiwKKwkJICAgICBTUFlfR2V0TXNnTmFtZShtZXNzYWdlKSwgd1BhcmFtLCBsUGFyYW0gKTsKIAogICAgIGlmICgobWVzc2FnZSAhPSBXTV9LRVlET1dOKSAmJiAobWVzc2FnZSAhPSBXTV9TWVNLRVlET1dOKSkgcmV0dXJuIEZBTFNFOwogCi0gICAgZHByaW50Zl9rZXkoIHN0ZGRlYiwgIlRyYW5zbGF0aW5nIGtleSAlMDRYLCBzY2FuY29kZSAlMDRYXG4iLAorICAgIGRwcmludGZfaW5mbyhrZXksICJUcmFuc2xhdGluZyBrZXkgJTA0WCwgc2NhbmNvZGUgJTA0WFxuIiwKICAgICAgICAgICAgICAgICAgd1BhcmFtLCBISVdPUkQobFBhcmFtKSApOwogCiAgICAgLyogRklYTUUgOiBzaG91bGQgaGFuZGxlIFRvQXNjaWkgeWllbGRpbmcgMiAqLwpAQCAtMTQ2MywxNCArMTQ2MiwxNCBAQAogICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgIGRlYWRfY2hhciA9IDA7CiAgICAgICAgIH0KLSAgICAgICAgZHByaW50Zl9rZXkoc3RkZGViLCAiMSAtPiBQb3N0TWVzc2FnZSglcylcbiIsIFNQWV9HZXRNc2dOYW1lKG1lc3NhZ2UpKTsKKyAgICAgICAgZHByaW50Zl9pbmZvKGtleSwgIjEgLT4gUG9zdE1lc3NhZ2UoJXMpXG4iLCBTUFlfR2V0TXNnTmFtZShtZXNzYWdlKSk7CiAgICAgICAgIFBvc3RNZXNzYWdlMTYoIGh3bmQsIG1lc3NhZ2UsIHdwWzBdLCBsUGFyYW0gKTsKICAgICAgICAgcmV0dXJuIFRSVUU7CiAKICAgICBjYXNlIC0xIDoKICAgICAgICAgbWVzc2FnZSA9IChtZXNzYWdlID09IFdNX0tFWURPV04pID8gV01fREVBRENIQVIgOiBXTV9TWVNERUFEQ0hBUjsKICAgICAgICAgZGVhZF9jaGFyID0gd3BbMF07Ci0gICAgICAgIGRwcmludGZfa2V5KCBzdGRkZWIsICItMSAtPiBQb3N0TWVzc2FnZSglcylcbiIsCisgICAgICAgIGRwcmludGZfaW5mbyhrZXksICItMSAtPiBQb3N0TWVzc2FnZSglcylcbiIsCiAgICAgICAgICAgICAgICAgICAgICBTUFlfR2V0TXNnTmFtZShtZXNzYWdlKSk7CiAgICAgICAgIFBvc3RNZXNzYWdlMTYoIGh3bmQsIG1lc3NhZ2UsIHdwWzBdLCBsUGFyYW0gKTsKICAgICAgICAgcmV0dXJuIFRSVUU7CkBAIC0xNjQzLDcgKzE2NDIsNyBAQAogICovCiBXT1JEIFdJTkFQSSBSZWdpc3RlcldpbmRvd01lc3NhZ2UxNiggU0VHUFRSIHN0ciApCiB7Ci0gICAgZHByaW50Zl9tc2coc3RkZGViLCAiUmVnaXN0ZXJXaW5kb3dNZXNzYWdlMTY6ICUwOGx4XG4iLCAoRFdPUkQpc3RyICk7CisgICAgZHByaW50Zl9pbmZvKG1zZywgIlJlZ2lzdGVyV2luZG93TWVzc2FnZTE2OiAlMDhseFxuIiwgKERXT1JEKXN0ciApOwogICAgIHJldHVybiBHbG9iYWxBZGRBdG9tMTYoIHN0ciApOwogfQogCkBAIC0xNjUzLDcgKzE2NTIsNyBAQAogICovCiBXT1JEIFdJTkFQSSBSZWdpc3RlcldpbmRvd01lc3NhZ2UzMkEoIExQQ1NUUiBzdHIgKQogewotICAgIGRwcmludGZfbXNnKHN0ZGRlYiwgIlJlZ2lzdGVyV2luZG93TWVzc2FnZTMyQTogJXNcbiIsIHN0ciApOworICAgIGRwcmludGZfaW5mbyhtc2csICJSZWdpc3RlcldpbmRvd01lc3NhZ2UzMkE6ICVzXG4iLCBzdHIgKTsKICAgICByZXR1cm4gR2xvYmFsQWRkQXRvbTMyQSggc3RyICk7CiB9CiAKQEAgLTE2NjMsNyArMTY2Miw3IEBACiAgKi8KIFdPUkQgV0lOQVBJIFJlZ2lzdGVyV2luZG93TWVzc2FnZTMyVyggTFBDV1NUUiBzdHIgKQogewotICAgIGRwcmludGZfbXNnKHN0ZGRlYiwgIlJlZ2lzdGVyV2luZG93TWVzc2FnZTMyVzogJXBcbiIsIHN0ciApOworICAgIGRwcmludGZfaW5mbyhtc2csICJSZWdpc3RlcldpbmRvd01lc3NhZ2UzMlc6ICVwXG4iLCBzdHIgKTsKICAgICByZXR1cm4gR2xvYmFsQWRkQXRvbTMyVyggc3RyICk7CiB9CiAKZGlmZiAtLWdpdCBhL3dpbmRvd3Mvbm9uY2xpZW50LmMgYi93aW5kb3dzL25vbmNsaWVudC5jCmluZGV4IDE0NWRlZDAuLjAzZWJlNTEgMTAwNjQ0Ci0tLSBhL3dpbmRvd3Mvbm9uY2xpZW50LmMKKysrIGIvd2luZG93cy9ub25jbGllbnQuYwpAQCAtMjEsNyArMjEsNiBAQAogI2luY2x1ZGUgImdyYXBoaWNzLmgiCiAjaW5jbHVkZSAicXVldWUuaCIKICNpbmNsdWRlICJzZWxlY3RvcnMuaCIKLSNpbmNsdWRlICJzdGRkZWJ1Zy5oIgogI2luY2x1ZGUgInR3ZWFrLmgiCiAjaW5jbHVkZSAiZGVidWcuaCIKICNpbmNsdWRlICJvcHRpb25zLmgiCkBAIC0yMDIsNyArMjAxLDcgQEAKICAgICBleFN0eWxlICY9IFdTX0VYX0RMR01PREFMRlJBTUU7CiAgICAgaWYgKGV4U3R5bGUgJiBXU19FWF9ETEdNT0RBTEZSQU1FKSBzdHlsZSAmPSB+V1NfVEhJQ0tGUkFNRTsKIAotICAgIGRwcmludGZfbm9uY2xpZW50KHN0ZGRlYiwgIkFkanVzdFdpbmRvd1JlY3RFeDogKCVkLCVkKS0oJWQsJWQpICUwOGx4ICVkICUwOGx4XG4iLAorICAgIGRwcmludGZfaW5mbyhub25jbGllbnQsICJBZGp1c3RXaW5kb3dSZWN0RXg6ICglZCwlZCktKCVkLCVkKSAlMDhseCAlZCAlMDhseFxuIiwKICAgICAgICAgICAgICAgICAgICAgICByZWN0LT5sZWZ0LCByZWN0LT50b3AsIHJlY3QtPnJpZ2h0LCByZWN0LT5ib3R0b20sCiAgICAgICAgICAgICAgICAgICAgICAgc3R5bGUsIG1lbnUsIGV4U3R5bGUgKTsKIApAQCAtMjU2LDcgKzI1NSw3IEBACiAJd2luUmVjdC0+Ym90dG9tIC09IHRtcFJlY3QuYm90dG9tOwogCiAJaWYgKEhBU19NRU5VKHBXbmQpKSB7Ci0JICAgIGRwcmludGZfbm9uY2xpZW50KCBzdGRkZWIsICJOQ19IYW5kbGVOQ0NhbGNTaXplOiBDYWxsaW5nICIKKwkgICAgZHByaW50Zl9pbmZvKG5vbmNsaWVudCwgIk5DX0hhbmRsZU5DQ2FsY1NpemU6IENhbGxpbmcgIgogCQkJICAgICAgICJHZXRNZW51QmFySGVpZ2h0IHdpdGggSFdORCAweCV4LCB3aWR0aCAlZCwgIgogCQkJICAgICAgICJhdCAoJWQsICVkKS5cbiIsIHBXbmQtPmh3bmRTZWxmLAogCQkJICAgICAgIHdpblJlY3QtPnJpZ2h0IC0gd2luUmVjdC0+bGVmdCwKQEAgLTMyMyw3ICszMjIsNyBAQAogICAgIFdORCAqd25kUHRyID0gV0lOX0ZpbmRXbmRQdHIoIGh3bmQgKTsKICAgICBpZiAoIXduZFB0cikgcmV0dXJuIEhURVJST1I7CiAKLSAgICBkcHJpbnRmX25vbmNsaWVudChzdGRkZWIsICJOQ19IYW5kbGVOQ0hpdFRlc3Q6IGh3bmQ9JTA0eCBwdD0lZCwlZFxuIiwKKyAgICBkcHJpbnRmX2luZm8obm9uY2xpZW50LCAiTkNfSGFuZGxlTkNIaXRUZXN0OiBod25kPSUwNHggcHQ9JWQsJWRcbiIsCiAJCSAgICAgIGh3bmQsIHB0LngsIHB0LnkgKTsKIAogICAgIEdldFdpbmRvd1JlY3QxNiggaHduZCwgJnJlY3QgKTsKQEAgLTEwMTMsNyArMTAxMiw3IEBACiAKICAgICBhY3RpdmUgID0gd25kUHRyLT5mbGFncyAmIFdJTl9OQ0FDVElWQVRFRDsKIAotICAgIGRwcmludGZfbm9uY2xpZW50KHN0ZGRlYiwgIk5DX0RvTkNQYWludDogJTA0eCAlZFxuIiwgaHduZCwgYWN0aXZlICk7CisgICAgZHByaW50Zl9pbmZvKG5vbmNsaWVudCwgIk5DX0RvTkNQYWludDogJTA0eCAlZFxuIiwgaHduZCwgYWN0aXZlICk7CiAKICAgICBpZiAoIShoZGMgPSBHZXREQ0V4MzIoIGh3bmQsIDAsIERDWF9VU0VTVFlMRSB8IERDWF9XSU5ET1cgKSkpIHJldHVybjsKIApAQCAtMTEyMCw3ICsxMTE5LDcgQEAKIAogICAgIGFjdGl2ZSAgPSB3bmRQdHItPmZsYWdzICYgV0lOX05DQUNUSVZBVEVEOwogCi0gICAgZHByaW50Zl9ub25jbGllbnQoc3RkZGViLCAiTkNfRG9OQ1BhaW50OTU6ICUwNHggJWRcbiIsIGh3bmQsIGFjdGl2ZSApOworICAgIGRwcmludGZfaW5mbyhub25jbGllbnQsICJOQ19Eb05DUGFpbnQ5NTogJTA0eCAlZFxuIiwgaHduZCwgYWN0aXZlICk7CiAKICAgICBpZiAoIShoZGMgPSBHZXREQ0V4MzIoIGh3bmQsIDAsIERDWF9VU0VTVFlMRSB8IERDWF9XSU5ET1cgKSkpIHJldHVybjsKIApAQCAtMTE3MywxNCArMTE3MiwxNCBAQAogCXIuYm90dG9tID0gcmVjdC50b3AgKyBzeXNNZXRyaWNzW1NNX0NZTUVOVV0gLSBzeXNNZXRyaWNzW1NNX0NZQk9SREVSXTsKIAlyLnRvcCAtPSBzeXNNZXRyaWNzW1NNX0NZQk9SREVSXTsKIAkKLQlkcHJpbnRmX25vbmNsaWVudChzdGRkZWIsICJEb05DUGFpbnQ5NTogQ2FsbGluZyBEcmF3TWVudUJhciB3aXRoICIKKwlkcHJpbnRmX2luZm8obm9uY2xpZW50LCAiRG9OQ1BhaW50OTU6IENhbGxpbmcgRHJhd01lbnVCYXIgd2l0aCAiCiAJCQkgICJyZWN0ICglZCwgJWQpLSglZCwgJWQpXG4iLCByLmxlZnQsIHIudG9wLAogCQkJICByLnJpZ2h0LCByLmJvdHRvbSk7CiAKIAlyZWN0LnRvcCArPSBNRU5VX0RyYXdNZW51QmFyKCBoZGMsICZyLCBod25kLCBzdXBwcmVzc19tZW51cGFpbnQgKTsKICAgICB9CiAKLSAgICBkcHJpbnRmX25vbmNsaWVudCggc3RkZGViLCAiQWZ0ZXIgTWVudUJhciwgcmVjdCBpcyAoJWQsICVkKS0oJWQsICVkKS5cbiIsCisgICAgZHByaW50Zl9pbmZvKG5vbmNsaWVudCwgIkFmdGVyIE1lbnVCYXIsIHJlY3QgaXMgKCVkLCAlZCktKCVkLCAlZCkuXG4iLAogCQkgICAgICAgcmVjdC5sZWZ0LCByZWN0LnRvcCwgcmVjdC5yaWdodCwgcmVjdC5ib3R0b20gKTsKIAogICAgIC8qIERyYXcgdGhlIGlubmVyIGZyYW1lcyAqLwpAQCAtMTg4Miw3ICsxODgxLDcgQEAKICAgICBQT0lOVDMyIHB0MzI7CiAgICAgVUlOVDE2IHVDb21tYW5kID0gd1BhcmFtICYgMHhGRkYwOwogCi0gICAgZHByaW50Zl9ub25jbGllbnQoc3RkZGViLCAiSGFuZGxpbmcgV01fU1lTQ09NTUFORCAleCAlZCwlZFxuIiwgCisgICAgZHByaW50Zl9pbmZvKG5vbmNsaWVudCwgIkhhbmRsaW5nIFdNX1NZU0NPTU1BTkQgJXggJWQsJWRcbiIsIAogCQkgICAgICB3UGFyYW0sIHB0LngsIHB0LnkgKTsKIAogICAgIGlmICh3bmRQdHItPmR3U3R5bGUgJiBXU19DSElMRCAmJiB1Q29tbWFuZCAhPSBTQ19LRVlNRU5VICkKZGlmZiAtLWdpdCBhL3dpbmRvd3MvcGFpbnRpbmcuYyBiL3dpbmRvd3MvcGFpbnRpbmcuYwppbmRleCA5YmFiYTU4Li4yMGM4YjEyIDEwMDY0NAotLS0gYS93aW5kb3dzL3BhaW50aW5nLmMKKysrIGIvd2luZG93cy9wYWludGluZy5jCkBAIC0xNCw4ICsxNCw2IEBACiAjaW5jbHVkZSAiZ2RpLmgiCiAjaW5jbHVkZSAiZGNlLmgiCiAjaW5jbHVkZSAiaGVhcC5oIgotI2luY2x1ZGUgInN0ZGRlYnVnLmgiCi0vKiAjZGVmaW5lIERFQlVHX1dJTiAqLwogI2luY2x1ZGUgImRlYnVnLmgiCiAKICAgLyogTGFzdCBDVExDT0xPUiBpZCAqLwpAQCAtMzAsNyArMjgsNyBAQAogICAgIFBPSU5UMTYgcHQgPSB7MCwgMH07IAogICAgIEhSR04zMiBoQ2xpcCA9IDE7CiAKLSAgICBkcHJpbnRmX25vbmNsaWVudChzdGRkZWIsIk5DVXBkYXRlOiBod25kICUwNHgsIGhyZ25VcGRhdGUgJTA0eFxuIiwgCisgICAgZHByaW50Zl9pbmZvKG5vbmNsaWVudCwiTkNVcGRhdGU6IGh3bmQgJTA0eCwgaHJnblVwZGF0ZSAlMDR4XG4iLCAKICAgICAgICAgICAgICAgICAgICAgICB3bmQtPmh3bmRTZWxmLCB3bmQtPmhyZ25VcGRhdGUgKTsKIAogICAgIC8qIGRlc2t0b3Agd2luZG93IGRvZXNuJ3QgaGF2ZSBub25jbGllbnQgYXJlYSAqLwpAQCAtMTEyLDcgKzExMCw3IEBACiAKICAgICBIaWRlQ2FyZXQzMiggaHduZCApOwogCi0gICAgZHByaW50Zl93aW4oc3RkZGViLCJocmduVXBkYXRlID0gJTA0eCwgIiwgaHJnblVwZGF0ZSk7CisgICAgZHByaW50Zl9pbmZvKHdpbiwiaHJnblVwZGF0ZSA9ICUwNHgsIFxuIiwgaHJnblVwZGF0ZSk7CiAKICAgICAvKiBXaGVuIGJJY29uIGlzIFRSVUUgaHJnblVwZGF0ZSBpcyBhdXRvbWF0aWNhbGx5IGluIHdpbmRvdyBjb29yZGluYXRlcwogICAgICAqIChiZWNhdXNlIHJlY3RDbGllbnQgPT0gcmVjdFdpbmRvdyBmb3IgV1NfTUlOSU1JWkUgd2luZG93cykuCkBAIC0xMzMsNyArMTMxLDcgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGJJY29uID8gRENYX1dJTkRPVyA6IDApICk7CiAgICAgfQogCi0gICAgZHByaW50Zl93aW4oc3RkZGViLCJoZGMgPSAlMDR4XG4iLCBscHMtPmhkYyk7CisgICAgZHByaW50Zl9pbmZvKHdpbiwiaGRjID0gJTA0eFxuIiwgbHBzLT5oZGMpOwogCiAgICAgaWYgKCFscHMtPmhkYykKICAgICB7CkBAIC0xNDMsNyArMTQxLDcgQEAKIAogICAgIEdldFJnbkJveDE2KCBJbnF1aXJlVmlzUmduKGxwcy0+aGRjKSwgJmxwcy0+cmNQYWludCApOwogCi1kcHJpbnRmX3dpbihzdGRkZWIsImJveCA9ICglaSwlaSAtICVpLCVpKVxuIiwgbHBzLT5yY1BhaW50LmxlZnQsIGxwcy0+cmNQYWludC50b3AsCitkcHJpbnRmX2luZm8od2luLCJib3ggPSAoJWksJWkgLSAlaSwlaSlcbiIsIGxwcy0+cmNQYWludC5sZWZ0LCBscHMtPnJjUGFpbnQudG9wLAogCQkgICAgbHBzLT5yY1BhaW50LnJpZ2h0LCBscHMtPnJjUGFpbnQuYm90dG9tICk7CiAKICAgICBEUHRvTFAxNiggbHBzLT5oZGMsIChMUFBPSU5UMTYpJmxwcy0+cmNQYWludCwgMiApOwpAQCAtMjk3LDEzICsyOTUsMTMgQEAKICAgICBiSWNvbiA9ICh3bmRQdHItPmR3U3R5bGUgJiBXU19NSU5JTUlaRSAmJiB3bmRQdHItPmNsYXNzLT5oSWNvbik7CiAgICAgaWYgKHJlY3RVcGRhdGUpCiAgICAgewotICAgICAgICBkcHJpbnRmX3dpbihzdGRkZWIsICJSZWRyYXdXaW5kb3c6ICUwNHggJWQsJWQtJWQsJWQgJTA0eCBmbGFncz0lMDR4XG4iLAorICAgICAgICBkcHJpbnRmX2luZm8od2luLCAiUmVkcmF3V2luZG93OiAlMDR4ICVkLCVkLSVkLCVkICUwNHggZmxhZ3M9JTA0eFxuIiwKICAgICAgICAgICAgICAgICAgICAgaHduZCwgcmVjdFVwZGF0ZS0+bGVmdCwgcmVjdFVwZGF0ZS0+dG9wLAogICAgICAgICAgICAgICAgICAgICByZWN0VXBkYXRlLT5yaWdodCwgcmVjdFVwZGF0ZS0+Ym90dG9tLCBocmduVXBkYXRlLCBmbGFncyApOwogICAgIH0KICAgICBlbHNlCiAgICAgewotICAgICAgICBkcHJpbnRmX3dpbihzdGRkZWIsICJSZWRyYXdXaW5kb3c6ICUwNHggTlVMTCAlMDR4IGZsYWdzPSUwNHhcbiIsCisgICAgICAgIGRwcmludGZfaW5mbyh3aW4sICJSZWRyYXdXaW5kb3c6ICUwNHggTlVMTCAlMDR4IGZsYWdzPSUwNHhcbiIsCiAgICAgICAgICAgICAgICAgICAgICBod25kLCBocmduVXBkYXRlLCBmbGFncyk7CiAgICAgfQogCmRpZmYgLS1naXQgYS93aW5kb3dzL3Byb3BlcnR5LmMgYi93aW5kb3dzL3Byb3BlcnR5LmMKaW5kZXggYzQ0Zjg3MS4uMjIxMDQ4YyAxMDA2NDQKLS0tIGEvd2luZG93cy9wcm9wZXJ0eS5jCisrKyBiL3dpbmRvd3MvcHJvcGVydHkuYwpAQCAtNyw3ICs3LDYgQEAKICNpbmNsdWRlIDxzdHJpbmcuaD4KICNpbmNsdWRlICJ3aW4uaCIKICNpbmNsdWRlICJoZWFwLmgiCi0jaW5jbHVkZSAic3RkZGVidWcuaCIKICNpbmNsdWRlICJkZWJ1Zy5oIgogCiAKQEAgLTc0LDEwICs3MywxMCBAQAogICAgIFBST1BFUlRZICpwcm9wID0gUFJPUF9GaW5kUHJvcCggaHduZCwgc3RyICk7CiAKICAgICBpZiAoSElXT1JEKHN0cikpCi0gICAgICAgIGRwcmludGZfcHJvcCggc3RkZGViLCAiR2V0UHJvcCglMDh4LCclcycpOiByZXR1cm5pbmcgJTA4eFxuIiwKKyAgICAgICAgZHByaW50Zl9pbmZvKHByb3AsICJHZXRQcm9wKCUwOHgsJyVzJyk6IHJldHVybmluZyAlMDh4XG4iLAogICAgICAgICAgICAgICAgICAgICAgIGh3bmQsIHN0ciwgcHJvcCA/IHByb3AtPmhhbmRsZSA6IDAgKTsKICAgICBlbHNlCi0gICAgICAgIGRwcmludGZfcHJvcCggc3RkZGViLCAiR2V0UHJvcCglMDh4LCMlMDR4KTogcmV0dXJuaW5nICUwOHhcbiIsCisgICAgICAgIGRwcmludGZfaW5mbyhwcm9wLCAiR2V0UHJvcCglMDh4LCMlMDR4KTogcmV0dXJuaW5nICUwOHhcbiIsCiAgICAgICAgICAgICAgICAgICAgICAgaHduZCwgTE9XT1JEKHN0ciksIHByb3AgPyBwcm9wLT5oYW5kbGUgOiAwICk7CiAKICAgICByZXR1cm4gcHJvcCA/IHByb3AtPmhhbmRsZSA6IDA7CkBAIC0xMTcsOSArMTE2LDkgQEAKICAgICBQUk9QRVJUWSAqcHJvcDsKIAogICAgIGlmIChISVdPUkQoc3RyKSkKLSAgICAgICAgZHByaW50Zl9wcm9wKCBzdGRkZWIsICJTZXRQcm9wOiAlMDR4ICclcycgJTA4eFxuIiwgaHduZCwgc3RyLCBoYW5kbGUgKTsKKyAgICAgICAgZHByaW50Zl9pbmZvKHByb3AsICJTZXRQcm9wOiAlMDR4ICclcycgJTA4eFxuIiwgaHduZCwgc3RyLCBoYW5kbGUgKTsKICAgICBlbHNlCi0gICAgICAgIGRwcmludGZfcHJvcCggc3RkZGViLCAiU2V0UHJvcDogJTA0eCAjJTA0eCAlMDh4XG4iLAorICAgICAgICBkcHJpbnRmX2luZm8ocHJvcCwgIlNldFByb3A6ICUwNHggIyUwNHggJTA4eFxuIiwKICAgICAgICAgICAgICAgICAgICAgICBod25kLCBMT1dPUkQoc3RyKSwgaGFuZGxlICk7CiAKICAgICBpZiAoIShwcm9wID0gUFJPUF9GaW5kUHJvcCggaHduZCwgc3RyICkpKQpAQCAtMTc4LDkgKzE3Nyw5IEBACiAgICAgV05EICpwV25kID0gV0lOX0ZpbmRXbmRQdHIoIGh3bmQgKTsKIAogICAgIGlmIChISVdPUkQoc3RyKSkKLSAgICAgIGRwcmludGZfcHJvcCggc3RkZGViLCAiUmVtb3ZlUHJvcDogJTA0eCAnJXMnXG4iLCBod25kLCBzdHIgKTsKKyAgICAgIGRwcmludGZfaW5mbyhwcm9wLCAiUmVtb3ZlUHJvcDogJTA0eCAnJXMnXG4iLCBod25kLCBzdHIgKTsKICAgICBlbHNlCi0gICAgICBkcHJpbnRmX3Byb3AoIHN0ZGRlYiwgIlJlbW92ZVByb3A6ICUwNHggIyUwNHhcbiIsIGh3bmQsIExPV09SRChzdHIpKTsKKyAgICAgIGRwcmludGZfaW5mbyhwcm9wLCAiUmVtb3ZlUHJvcDogJTA0eCAjJTA0eFxuIiwgaHduZCwgTE9XT1JEKHN0cikpOwogCiAKICAgICBpZiAoIXBXbmQpIHJldHVybiBOVUxMOwpAQCAtMjYzLDcgKzI2Miw3IEBACiAgICAgV05EICpwV25kOwogICAgIElOVDE2IHJldCA9IC0xOwogCi0gICAgZHByaW50Zl9wcm9wKCBzdGRkZWIsICJFbnVtUHJvcHM6ICUwNHggJTA4eFxuIiwgaHduZCwgKFVJTlQzMilmdW5jICk7CisgICAgZHByaW50Zl9pbmZvKHByb3AsICJFbnVtUHJvcHM6ICUwNHggJTA4eFxuIiwgaHduZCwgKFVJTlQzMilmdW5jICk7CiAgICAgaWYgKCEocFduZCA9IFdJTl9GaW5kV25kUHRyKCBod25kICkpKSByZXR1cm4gLTE7CiAgICAgZm9yIChwcm9wID0gcFduZC0+cFByb3A7IChwcm9wKTsgcHJvcCA9IG5leHQpCiAgICAgewpAQCAtMjcxLDcgKzI3MCw3IEBACiAgICAgICAgIC8qIGZ1bmN0aW9uIHJlbW92ZXMgdGhlIGN1cnJlbnQgcHJvcGVydHkuICAgICovCiAgICAgICAgIG5leHQgPSBwcm9wLT5uZXh0OwogCi0gICAgICAgIGRwcmludGZfcHJvcCggc3RkZGViLCAiICBDYWxsYmFjazogaGFuZGxlPSUwOHggc3RyPSclcydcbiIsCisgICAgICAgIGRwcmludGZfaW5mbyhwcm9wLCAiICBDYWxsYmFjazogaGFuZGxlPSUwOHggc3RyPSclcydcbiIsCiAgICAgICAgICAgICAgICAgICAgICAgcHJvcC0+aGFuZGxlLCBwcm9wLT5zdHJpbmcgKTsKICAgICAgICAgcmV0ID0gZnVuYyggaHduZCwgU0VHUFRSX0dFVChwcm9wLT5zdHJpbmcpLCBwcm9wLT5oYW5kbGUgKTsKICAgICAgICAgaWYgKCFyZXQpIGJyZWFrOwpAQCAtMzA3LDcgKzMwNiw3IEBACiAgICAgV05EICpwV25kOwogICAgIElOVDMyIHJldCA9IC0xOwogCi0gICAgZHByaW50Zl9wcm9wKCBzdGRkZWIsICJFbnVtUHJvcHNFeDMyQTogJTA0eCAlMDh4ICUwOGx4XG4iLAorICAgIGRwcmludGZfaW5mbyhwcm9wLCAiRW51bVByb3BzRXgzMkE6ICUwNHggJTA4eCAlMDhseFxuIiwKICAgICAgICAgICAgICAgICAgIGh3bmQsIChVSU5UMzIpZnVuYywgbFBhcmFtICk7CiAgICAgaWYgKCEocFduZCA9IFdJTl9GaW5kV25kUHRyKCBod25kICkpKSByZXR1cm4gLTE7CiAgICAgZm9yIChwcm9wID0gcFduZC0+cFByb3A7IChwcm9wKTsgcHJvcCA9IG5leHQpCkBAIC0zMTYsNyArMzE1LDcgQEAKICAgICAgICAgLyogZnVuY3Rpb24gcmVtb3ZlcyB0aGUgY3VycmVudCBwcm9wZXJ0eS4gICAgKi8KICAgICAgICAgbmV4dCA9IHByb3AtPm5leHQ7CiAKLSAgICAgICAgZHByaW50Zl9wcm9wKCBzdGRkZWIsICIgIENhbGxiYWNrOiBoYW5kbGU9JTA4eCBzdHI9JyVzJ1xuIiwKKyAgICAgICAgZHByaW50Zl9pbmZvKHByb3AsICIgIENhbGxiYWNrOiBoYW5kbGU9JTA4eCBzdHI9JyVzJ1xuIiwKICAgICAgICAgICAgICAgICAgICAgICBwcm9wLT5oYW5kbGUsIHByb3AtPnN0cmluZyApOwogICAgICAgICByZXQgPSBmdW5jKCBod25kLCBwcm9wLT5zdHJpbmcsIHByb3AtPmhhbmRsZSwgbFBhcmFtICk7CiAgICAgICAgIGlmICghcmV0KSBicmVhazsKQEAgLTMzNCw3ICszMzMsNyBAQAogICAgIFdORCAqcFduZDsKICAgICBJTlQzMiByZXQgPSAtMTsKIAotICAgIGRwcmludGZfcHJvcCggc3RkZGViLCAiRW51bVByb3BzRXgzMlc6ICUwNHggJTA4eCAlMDhseFxuIiwKKyAgICBkcHJpbnRmX2luZm8ocHJvcCwgIkVudW1Qcm9wc0V4MzJXOiAlMDR4ICUwOHggJTA4bHhcbiIsCiAgICAgICAgICAgICAgICAgICBod25kLCAoVUlOVDMyKWZ1bmMsIGxQYXJhbSApOwogICAgIGlmICghKHBXbmQgPSBXSU5fRmluZFduZFB0ciggaHduZCApKSkgcmV0dXJuIC0xOwogICAgIGZvciAocHJvcCA9IHBXbmQtPnBQcm9wOyAocHJvcCk7IHByb3AgPSBuZXh0KQpAQCAtMzQzLDcgKzM0Miw3IEBACiAgICAgICAgIC8qIGZ1bmN0aW9uIHJlbW92ZXMgdGhlIGN1cnJlbnQgcHJvcGVydHkuICAgICovCiAgICAgICAgIG5leHQgPSBwcm9wLT5uZXh0OwogCi0gICAgICAgIGRwcmludGZfcHJvcCggc3RkZGViLCAiICBDYWxsYmFjazogaGFuZGxlPSUwOHggc3RyPSclcydcbiIsCisgICAgICAgIGRwcmludGZfaW5mbyhwcm9wLCAiICBDYWxsYmFjazogaGFuZGxlPSUwOHggc3RyPSclcydcbiIsCiAgICAgICAgICAgICAgICAgICAgICAgcHJvcC0+aGFuZGxlLCBwcm9wLT5zdHJpbmcgKTsKICAgICAgICAgaWYgKEhJV09SRChwcm9wLT5zdHJpbmcpKQogICAgICAgICB7CmRpZmYgLS1naXQgYS93aW5kb3dzL3F1ZXVlLmMgYi93aW5kb3dzL3F1ZXVlLmMKaW5kZXggZjIzNTQyZi4uZDMwNTMzNCAxMDA2NDQKLS0tIGEvd2luZG93cy9xdWV1ZS5jCisrKyBiL3dpbmRvd3MvcXVldWUuYwpAQCAtMTUsNyArMTUsNiBAQAogI2luY2x1ZGUgImhvb2suaCIKICNpbmNsdWRlICJ0aHJlYWQuaCIKICNpbmNsdWRlICJwcm9jZXNzLmgiCi0jaW5jbHVkZSAic3RkZGVidWcuaCIKICNpbmNsdWRlICJkZWJ1Zy5oIgogCiAjZGVmaW5lIE1BWF9RVUVVRV9TSVpFICAgMTIwICAvKiBNYXguIHNpemUgb2YgYSBtZXNzYWdlIHF1ZXVlICovCkBAIC0xMjMsNyArMTIyLDcgQEAKICAgICBpbnQgcXVldWVTaXplOwogICAgIFREQiAqcFRhc2sgPSAoVERCICopR2xvYmFsTG9jazE2KCBHZXRDdXJyZW50VGFzaygpICk7CiAKLSAgICBkcHJpbnRmX21zZyhzdGRkZWIsIkNyZWF0aW5nIG1lc3NhZ2UgcXVldWUuLi5cbiIpOworICAgIGRwcmludGZfaW5mbyhtc2csIkNyZWF0aW5nIG1lc3NhZ2UgcXVldWUuLi5cbiIpOwogCiAgICAgcXVldWVTaXplID0gc2l6ZW9mKE1FU1NBR0VRVUVVRSkgKyBzaXplICogc2l6ZW9mKFFNU0cpOwogICAgIGlmICghKGhRdWV1ZSA9IEdsb2JhbEFsbG9jMTYoIEdNRU1fRklYRUQgfCBHTUVNX1pFUk9JTklULCBxdWV1ZVNpemUgKSkpCkBAIC0xNTMsMTEgKzE1MiwxMSBAQAogICAgIEhRVUVVRTE2ICBzZW5kZXJROwogICAgIEhRVUVVRTE2ICpwUHJldjsKIAotICAgIGRwcmludGZfbXNnKHN0ZGRlYiwiRGVsZXRpbmcgbWVzc2FnZSBxdWV1ZSAlMDR4XG4iLCBoUXVldWUpOworICAgIGRwcmludGZfaW5mbyhtc2csIkRlbGV0aW5nIG1lc3NhZ2UgcXVldWUgJTA0eFxuIiwgaFF1ZXVlKTsKIAogICAgIGlmICghaFF1ZXVlIHx8ICFtc2dRdWV1ZSkKICAgICB7Ci0JZHByaW50Zl9tc2coc3RkZGViLCJEZWxldGVNc2dRdWV1ZTogaW52YWxpZCBhcmd1bWVudC5cbiIpOworCWRwcmludGZfd2Fybihtc2csICJEZWxldGVNc2dRdWV1ZTogaW52YWxpZCBhcmd1bWVudC5cbiIpOwogCXJldHVybiAwOwogICAgIH0KICAgICBpZiggcEN1cnNvclF1ZXVlID09IG1zZ1F1ZXVlICkgcEN1cnNvclF1ZXVlID0gTlVMTDsKQEAgLTIyNCw3ICsyMjMsNyBAQAogICovCiB2b2lkIFFVRVVFX1NldFdha2VCaXQoIE1FU1NBR0VRVUVVRSAqcXVldWUsIFdPUkQgYml0ICkKIHsKLSAgICBkcHJpbnRmX21zZyhzdGRkZWIsIlNldFdha2VCaXQ6IHF1ZXVlID0gJTA0eCAod209JTA0eCksIGJpdCA9ICUwNHhcbiIsIAorICAgIGRwcmludGZfaW5mbyhtc2csIlNldFdha2VCaXQ6IHF1ZXVlID0gJTA0eCAod209JTA0eCksIGJpdCA9ICUwNHhcbiIsIAogCSAgICAgICAgICAgICAgICBxdWV1ZS0+c2VsZiwgcXVldWUtPndha2VNYXNrLCBiaXQgKTsKIAogICAgIGlmIChiaXQgJiBRU19NT1VTRSkgcE1vdXNlUXVldWUgPSBxdWV1ZTsKQEAgLTI1OCw3ICsyNTcsNyBAQAogewogICAgIE1FU1NBR0VRVUVVRSAqcXVldWU7CiAKLSAgICBkcHJpbnRmX21zZyhzdGRkZWIsIldhaXRCaXRzOiBxICUwNHggd2FpdGluZyBmb3IgJTA0eFxuIiwgR2V0VGFza1F1ZXVlKDApLCBiaXRzKTsKKyAgICBkcHJpbnRmX2luZm8obXNnLCJXYWl0Qml0czogcSAlMDR4IHdhaXRpbmcgZm9yICUwNHhcbiIsIEdldFRhc2tRdWV1ZSgwKSwgYml0cyk7CiAKICAgICBmb3IgKDs7KQogICAgIHsKQEAgLTI4Miw3ICsyODEsNyBAQAogICAgICAgICBxdWV1ZS0+d2FrZU1hc2sgPSBiaXRzIHwgUVNfU0VORE1FU1NBR0U7CiAJaWYocXVldWUtPmNoYW5nZUJpdHMgJiBiaXRzKSBjb250aW51ZTsKIAkKLQlkcHJpbnRmX21zZyhzdGRkZWIsIndiOiAoJTA0eCkgd2FrZU1hc2sgaXMgJTA0eCwgd2FpdGluZ1xuIiwgcXVldWUtPnNlbGYsIHF1ZXVlLT53YWtlTWFzayk7CisJZHByaW50Zl9pbmZvKG1zZywid2I6ICglMDR4KSB3YWtlTWFzayBpcyAlMDR4LCB3YWl0aW5nXG4iLCBxdWV1ZS0+c2VsZiwgcXVldWUtPndha2VNYXNrKTsKIAogICAgICAgICBXYWl0RXZlbnQoIDAgKTsKICAgICB9CkBAIC0zMDEsMTAgKzMwMCwxMCBAQAogICAgIFFTTUNUUkwqICAgICAgcHJldkN0cmxQdHIgPSBOVUxMOwogICAgIExSRVNVTFQgICAgICAgcmVzdWx0ID0gMDsKIAotICAgIGRwcmludGZfbXNnKHN0ZGRlYiwgIlJlY2VpdmVNZXNzYWdlLCBxdWV1ZSAlMDR4XG4iLCBxdWV1ZS0+c2VsZiApOworICAgIGRwcmludGZfaW5mbyhtc2csICJSZWNlaXZlTWVzc2FnZSwgcXVldWUgJTA0eFxuIiwgcXVldWUtPnNlbGYgKTsKICAgICBpZiAoIShxdWV1ZS0+d2FrZUJpdHMgJiBRU19TRU5ETUVTU0FHRSkgfHwKICAgICAgICAgIShzZW5kZXJRID0gKE1FU1NBR0VRVUVVRSopR2xvYmFsTG9jazE2KCBxdWV1ZS0+aFNlbmRpbmdUYXNrKSkpIAotCXsgZHByaW50Zl9tc2coc3RkZGViLCJcdHJjbTogbm90aGluZyB0byBkb1xuIik7IHJldHVybjsgfQorCXsgZHByaW50Zl9pbmZvKG1zZywiXHRyY206IG5vdGhpbmcgdG8gZG9cbiIpOyByZXR1cm47IH0KIAogICAgIGlmKCAhc2VuZGVyUS0+aFByZXZTZW5kaW5nVGFzayApCiAgICAgewpAQCAtMzIxLDExICszMjAsMTEgQEAKICAgICBxdWV1ZS0+c21SZXN1bHRDdXJyZW50ICAgICA9IHNlbmRlclEtPnNtUmVzdWx0SW5pdDsKICAgICBxdWV1ZS0+aFNlbmRpbmdUYXNrCSAgICAgICA9IHNlbmRlclEtPmhQcmV2U2VuZGluZ1Rhc2s7CiAKLSAgICBkcHJpbnRmX21zZyhzdGRkZWIsICJcdHJjbTogc21SZXN1bHRDdXJyZW50ID0gJTA4eCwgcHJldkN0cmwgPSAlMDh4XG4iLCAKKyAgICBkcHJpbnRmX2luZm8obXNnLCAiXHRyY206IHNtUmVzdWx0Q3VycmVudCA9ICUwOHgsIHByZXZDdHJsID0gJTA4eFxuIiwgCiAJCQkJKHVuc2lnbmVkKXF1ZXVlLT5zbVJlc3VsdEN1cnJlbnQsICh1bnNpZ25lZClwcmV2Q3RybFB0ciApOwogICAgIFFVRVVFX1NldFdha2VCaXQoIHNlbmRlclEsIFFTX1NNUEFSQU1TRlJFRSApOwogCi0gICAgZHByaW50Zl9tc2coc3RkZGViLCAiXHRyY206IGNhbGxpbmcgd25kcHJvYyAtICUwNHggJTA0eCAlMDR4JTA0eCAlMDh4XG4iLAorICAgIGRwcmludGZfaW5mbyhtc2csICJcdHJjbTogY2FsbGluZyB3bmRwcm9jIC0gJTA0eCAlMDR4ICUwNHglMDR4ICUwOHhcbiIsCiAgICAgICAgICAgICAgICAgc2VuZGVyUS0+aFduZCwgc2VuZGVyUS0+bXNnLCBzZW5kZXJRLT53UGFyYW1IaWdoLAogICAgICAgICAgICAgICAgIHNlbmRlclEtPndQYXJhbSwgKHVuc2lnbmVkKXNlbmRlclEtPmxQYXJhbSApOwogCkBAIC0zMzgsNyArMzM3LDcgQEAKICAgICAgICAgaWYgKHNlbmRlclEtPmZsYWdzICYgUVVFVUVfU01fV0lOMzIpCiAgICAgICAgIHsKICAgICAgICAgICAgIFdQQVJBTTMyIHdQYXJhbSA9IE1BS0VMT05HKCBzZW5kZXJRLT53UGFyYW0sIHNlbmRlclEtPndQYXJhbUhpZ2ggKTsKLSAgICAgICAgICAgIGRwcmludGZfbXNnKHN0ZGRlYiwgIlx0cmNtOiBtc2cgaXMgV2luMzJcbiIgKTsKKyAgICAgICAgICAgIGRwcmludGZfaW5mbyhtc2csICJcdHJjbTogbXNnIGlzIFdpbjMyXG4iICk7CiAgICAgICAgICAgICBpZiAoc2VuZGVyUS0+ZmxhZ3MgJiBRVUVVRV9TTV9VTklDT0RFKQogICAgICAgICAgICAgICAgIHJlc3VsdCA9IENhbGxXaW5kb3dQcm9jMzJXKCB3bmRQdHItPndpbnByb2MsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbmRlclEtPmhXbmQsIHNlbmRlclEtPm1zZywKQEAgLTM1NCw5ICszNTMsOSBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VuZGVyUS0+d1BhcmFtLCBzZW5kZXJRLT5sUGFyYW0gKTsKIAogICAgICAgICBxdWV1ZS0+R2V0TWVzc2FnZUV4dHJhSW5mb1ZhbCA9IGV4dHJhSW5mbzsgIC8qIFJlc3RvcmUgZXh0cmEgaW5mbyAqLwotCWRwcmludGZfbXNnKHN0ZGRlYiwiXHRyY206IHJlc3VsdCA9ICAlMDh4XG4iLCAodW5zaWduZWQpcmVzdWx0ICk7CisJZHByaW50Zl9pbmZvKG1zZywiXHRyY206IHJlc3VsdCA9ICAlMDh4XG4iLCAodW5zaWduZWQpcmVzdWx0ICk7CiAgICAgfQotICAgIGVsc2UgZHByaW50Zl9tc2coc3RkZGViLCJcdHJjbTogYmFkIGhXbmRcbiIpOworICAgIGVsc2UgZHByaW50Zl93YXJuKG1zZywgIlx0cmNtOiBiYWQgaFduZFxuIik7CiAKICAgICAvKiBSZXR1cm4gdGhlIHJlc3VsdCB0byB0aGUgc2VuZGVyIHRhc2sgKi8KICAgICBSZXBseU1lc3NhZ2UxNiggcmVzdWx0ICk7CkBAIC0zNjQsNyArMzYzLDcgQEAKICAgICBxdWV1ZS0+SW5TZW5kTWVzc2FnZUhhbmRsZSA9IHByZXZTZW5kZXI7CiAgICAgcXVldWUtPnNtUmVzdWx0Q3VycmVudCAgICAgPSBwcmV2Q3RybFB0cjsKIAotICAgIGRwcmludGZfbXNnKHN0ZGRlYiwiUmVjZWl2ZU1lc3NhZ2U6IGRvbmUhXG4iKTsKKyAgICBkcHJpbnRmX2luZm8obXNnLCJSZWNlaXZlTWVzc2FnZTogZG9uZSFcbiIpOwogfQogCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKQEAgLTQ0OCw3ICs0NDcsNyBAQAogewogICAgIGludCBpLCBwb3MgPSBtc2dRdWV1ZS0+bmV4dE1lc3NhZ2U7CiAKLSAgICBkcHJpbnRmX21zZyhzdGRkZWIsIlFVRVVFX0ZpbmRNc2c6IGh3bmQ9JTA0eCBwb3M9JWRcbiIsIGh3bmQsIHBvcyApOworICAgIGRwcmludGZfaW5mbyhtc2csIlFVRVVFX0ZpbmRNc2c6IGh3bmQ9JTA0eCBwb3M9JWRcbiIsIGh3bmQsIHBvcyApOwogCiAgICAgaWYgKCFtc2dRdWV1ZS0+bXNnQ291bnQpIHJldHVybiAtMTsKICAgICBpZiAoIWh3bmQgJiYgIWZpcnN0ICYmICFsYXN0KSByZXR1cm4gcG9zOwpAQCAtNTM5LDcgKzUzOCw3IEBACiAgICAgICB9CiAgICAgICBpZiggIXF1ZXVlICkKICAgICAgIHsgCi0gICAgICAgIGRwcmludGZfbXNnKHN0ZGRlYiwiV2FrZVNvbWVvbmU6IGNvdWxkbid0IGZpbmQgcXVldWVcbiIpOyAKKyAgICAgICAgZHByaW50Zl93YXJuKG1zZywgIldha2VTb21lb25lOiBjb3VsZG4ndCBmaW5kIHF1ZXVlXG4iKTsgCiAgICAgICAgIHJldHVybjsgCiAgICAgICB9CiAgICAgfQpAQCAtNzM1LDEzICs3MzQsMTMgQEAKICAgICBIUVVFVUUxNiBoUXVldWUsIGhOZXdRdWV1ZTsKICAgICBNRVNTQUdFUVVFVUUgKnF1ZXVlUHRyOwogCi0gICAgZHByaW50Zl9tc2coc3RkZGViLCJTZXRNZXNzYWdlUXVldWU6IHRhc2sgJTA0eCBzaXplICVpXG4iLCBHZXRDdXJyZW50VGFzaygpLCBzaXplKTsgCisgICAgZHByaW50Zl9pbmZvKG1zZywiU2V0TWVzc2FnZVF1ZXVlOiB0YXNrICUwNHggc2l6ZSAlaVxuIiwgR2V0Q3VycmVudFRhc2soKSwgc2l6ZSk7IAogCiAgICAgaWYgKChzaXplID4gTUFYX1FVRVVFX1NJWkUpIHx8IChzaXplIDw9IDApKSByZXR1cm4gVFJVRTsKIAogICAgIGlmKCAhKGhOZXdRdWV1ZSA9IFFVRVVFX0NyZWF0ZU1zZ1F1ZXVlKCBzaXplICkpKSAKICAgICB7Ci0JZHByaW50Zl9tc2coc3RkZGViLCJTZXRNZXNzYWdlUXVldWU6IGZhaWxlZCFcbiIpOworCWRwcmludGZfd2Fybihtc2csICJTZXRNZXNzYWdlUXVldWU6IGZhaWxlZCFcbiIpOwogCXJldHVybiBGQUxTRTsKICAgICB9CiAgICAgcXVldWVQdHIgPSAoTUVTU0FHRVFVRVVFICopR2xvYmFsTG9jazE2KCBoTmV3UXVldWUgKTsKZGlmZiAtLWdpdCBhL3dpbmRvd3Mvc2Nyb2xsLmMgYi93aW5kb3dzL3Njcm9sbC5jCmluZGV4IDZiN2U4NjYuLmM2NTZkNTcgMTAwNjQ0Ci0tLSBhL3dpbmRvd3Mvc2Nyb2xsLmMKKysrIGIvd2luZG93cy9zY3JvbGwuYwpAQCAtMTYsNyArMTYsNiBAQAogI2luY2x1ZGUgInJlZ2lvbi5oIgogI2luY2x1ZGUgImdyYXBoaWNzLmgiCiAjaW5jbHVkZSAic3lzbWV0cmljcy5oIgotI2luY2x1ZGUgInN0ZGRlYnVnLmgiCiAjaW5jbHVkZSAiZGVidWcuaCIKIAogZXh0ZXJuIEhXTkQzMiBDQVJFVF9HZXRId25kKCk7CQkJLyogd2luZG93cy9jYXJldC5jICovCkBAIC01MSw3ICs1MCw3IEBACiAgICAgSFdORDMyIAloQ2FyZXRXbmQgPSBDQVJFVF9HZXRId25kKCk7CiAgICAgV05EKgl3bmRTY3JvbGwgPSBXSU5fRmluZFduZFB0ciggaHduZCApOwogCi0gICAgZHByaW50Zl9zY3JvbGwoc3RkZGViLCJTY3JvbGxXaW5kb3c6IGh3bmQ9JTA0eCwgZHg9JWQsIGR5PSVkLCBscFJlY3QgPSVwIGNsaXBSZWN0PSVpLCVpLCVpLCVpXG4iLCAKKyAgICBkcHJpbnRmX2luZm8oc2Nyb2xsLCJTY3JvbGxXaW5kb3c6IGh3bmQ9JTA0eCwgZHg9JWQsIGR5PSVkLCBscFJlY3QgPSVwIGNsaXBSZWN0PSVpLCVpLCVpLCVpXG4iLCAKICAgICAgICAgICAgICAgICAgICBod25kLCBkeCwgZHksIHJlY3QsCiAgICAgICAgICAgICAgICAgICAgY2xpcFJlY3QgPyBjbGlwUmVjdC0+bGVmdCA6IDAsCiAgICAgICAgICAgICAgICAgICAgY2xpcFJlY3QgPyBjbGlwUmVjdC0+dG9wIDogMCwKQEAgLTE1Nyw3ICsxNTYsNyBAQAogICAgIElOVDMyICBsZHgsIGxkeTsKICAgICBEQyAqZGMgPSAoREMgKilHRElfR2V0T2JqUHRyKGhkYywgRENfTUFHSUMpOwogCi0gICAgZHByaW50Zl9zY3JvbGwoc3RkZGViLCJTY3JvbGxEQzogJTA0eCAlZCwlZCBocmduVXBkYXRlPSUwNHggcmNVcGRhdGUgPSAlcCBjbGlwcmMgPSAoJWQsJWQtJWQsJWQpLCByYz0oJWQsJWQtJWQsJWQpXG4iLAorICAgIGRwcmludGZfaW5mbyhzY3JvbGwsIlNjcm9sbERDOiAlMDR4ICVkLCVkIGhyZ25VcGRhdGU9JTA0eCByY1VwZGF0ZSA9ICVwIGNsaXByYyA9ICglZCwlZC0lZCwlZCksIHJjPSglZCwlZC0lZCwlZClcbiIsCiAgICAgICAgICAgICAgICAgICAgKEhEQzE2KWhkYywgZHgsIGR5LCBocmduVXBkYXRlLCByY1VwZGF0ZSwgCiAJCSAgIHByTENsaXAgPyBwckxDbGlwLT5sZWZ0IDogMCwgcHJMQ2xpcCA/IHByTENsaXAtPnRvcCA6IDAsIHByTENsaXAgPyBwckxDbGlwLT5yaWdodCA6IDAsIHByTENsaXAgPyBwckxDbGlwLT5ib3R0b20gOiAwLAogCQkgICByYyA/IHJjLT5sZWZ0IDogMCwgcmMgPyByYy0+dG9wIDogMCwgcmMgPyByYy0+cmlnaHQgOiAwLCByYyA/IHJjLT5ib3R0b20gOiAwICk7CkBAIC0zNzQsNyArMzczLDcgQEAKIAlCT09MMzIgIGJVcGRhdGUgPSAocmNVcGRhdGUgfHwgaHJnblVwZGF0ZSB8fCBmbGFncyAmIChTV19JTlZBTElEQVRFIHwgU1dfRVJBU0UpKTsKIAlIUkdOMzIgIGhyZ25DbGlwID0gQ3JlYXRlUmVjdFJnbkluZGlyZWN0MzIoJmNsaXByYyk7CiAKLWRwcmludGZfc2Nyb2xsKHN0ZGRlYiwiU2Nyb2xsV2luZG93RXg6ICUwNHgsICVkLCVkIGhyZ25VcGRhdGU9JTA0eCByY1VwZGF0ZSA9ICVwIFwKK2RwcmludGZfaW5mbyhzY3JvbGwsIlNjcm9sbFdpbmRvd0V4OiAlMDR4LCAlZCwlZCBocmduVXBkYXRlPSUwNHggcmNVcGRhdGUgPSAlcCBcCiBjbGlwcmMgPSAoJWQsJWQtJWQsJWQpLCByYz0oJWQsJWQtJWQsJWQpICUwNHhcbiIsICAgICAgICAgICAgIAogKEhXTkQxNilod25kLCBkeCwgZHksIGhyZ25VcGRhdGUsIHJjVXBkYXRlLAogY2xpcFJlY3Q/Y2xpcFJlY3QtPmxlZnQ6MCwgY2xpcFJlY3Q/Y2xpcFJlY3QtPnRvcDowLCBjbGlwUmVjdD9jbGlwUmVjdC0+cmlnaHQ6MCwgY2xpcFJlY3Q/Y2xpcFJlY3QtPmJvdHRvbTowLApkaWZmIC0tZ2l0IGEvd2luZG93cy90aW1lci5jIGIvd2luZG93cy90aW1lci5jCmluZGV4IGEyOGEzNzUuLjQ1MjQ1NzMgMTAwNjQ0Ci0tLSBhL3dpbmRvd3MvdGltZXIuYworKysgYi93aW5kb3dzL3RpbWVyLmMKQEAgLTcsOCArNyw2IEBACiAjaW5jbHVkZSAid2luZG93cy5oIgogI2luY2x1ZGUgInF1ZXVlLmgiCiAjaW5jbHVkZSAid2lucHJvYy5oIgotI2luY2x1ZGUgInN0ZGRlYnVnLmgiCi0vKiAjZGVmaW5lIERFQlVHX1RJTUVSICovCiAjaW5jbHVkZSAiZGVidWcuaCIKIAogCkBAIC0yMDIsNyArMjAwLDcgQEAKICAgICBpZiAoIXBUaW1lciB8fCAocFRpbWVyLT5leHBpcmVzID4gY3VyVGltZSkpIHJldHVybiBGQUxTRTsgLyogTm8gdGltZXIgKi8KICAgICBpZiAocmVtb3ZlKQlUSU1FUl9SZXN0YXJ0VGltZXIoIHBUaW1lciwgY3VyVGltZSApOyAgLyogUmVzdGFydCBpdCAqLwogCi0gICAgZHByaW50Zl90aW1lciggc3RkZGViLCAiVGltZXIgZXhwaXJlZDogJTA0eCwgJTA0eCwgJTA0eCwgJTA4bHhcbiIsIAorICAgIGRwcmludGZfaW5mbyh0aW1lciwgIlRpbWVyIGV4cGlyZWQ6ICUwNHgsICUwNHgsICUwNHgsICUwOGx4XG4iLCAKIAkJICAgcFRpbWVyLT5od25kLCBwVGltZXItPm1zZywgcFRpbWVyLT5pZCwgKERXT1JEKXBUaW1lci0+cHJvYyk7CiAKICAgICAgIC8qIEJ1aWxkIHRoZSBtZXNzYWdlICovCkBAIC0yNjQsNyArMjYyLDcgQEAKICAgICBwVGltZXItPmV4cGlyZXMgPSBHZXRUaWNrQ291bnQoKSArIHRpbWVvdXQ7CiAgICAgcFRpbWVyLT5wcm9jICAgID0gKEhXSU5ET1dQUk9DKTA7CiAgICAgaWYgKHByb2MpIFdJTlBST0NfU2V0UHJvYyggJnBUaW1lci0+cHJvYywgcHJvYywgdHlwZSwgV0lOX1BST0NfVElNRVIgKTsKLSAgICBkcHJpbnRmX3RpbWVyKCBzdGRkZWIsICJUaW1lciBhZGRlZDogJXAsICUwNHgsICUwNHgsICUwNHgsICUwOGx4XG4iLCAKKyAgICBkcHJpbnRmX2luZm8odGltZXIsICJUaW1lciBhZGRlZDogJXAsICUwNHgsICUwNHgsICUwNHgsICUwOGx4XG4iLCAKIAkJICAgcFRpbWVyLCBwVGltZXItPmh3bmQsIHBUaW1lci0+bXNnLCBwVGltZXItPmlkLAogICAgICAgICAgICAgICAgICAgIChEV09SRClwVGltZXItPnByb2MgKTsKICAgICBUSU1FUl9JbnNlcnRUaW1lciggcFRpbWVyICk7CkBAIC0zMDQsNyArMzAyLDcgQEAKIFVJTlQxNiBXSU5BUEkgU2V0VGltZXIxNiggSFdORDE2IGh3bmQsIFVJTlQxNiBpZCwgVUlOVDE2IHRpbWVvdXQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgIFRJTUVSUFJPQzE2IHByb2MgKQogewotICAgIGRwcmludGZfdGltZXIoIHN0ZGRlYiwgIlNldFRpbWVyMTY6ICUwNHggJWQgJWQgJTA4bHhcbiIsCisgICAgZHByaW50Zl9pbmZvKHRpbWVyLCAiU2V0VGltZXIxNjogJTA0eCAlZCAlZCAlMDhseFxuIiwKICAgICAgICAgICAgICAgICAgICBod25kLCBpZCwgdGltZW91dCwgKExPTkcpcHJvYyApOwogICAgIHJldHVybiBUSU1FUl9TZXRUaW1lciggaHduZCwgaWQsIHRpbWVvdXQsIChXTkRQUk9DMTYpcHJvYywKICAgICAgICAgICAgICAgICAgICAgICAgICAgIFdJTl9QUk9DXzE2LCBGQUxTRSApOwpAQCAtMzE3LDcgKzMxNSw3IEBACiBVSU5UMzIgV0lOQVBJIFNldFRpbWVyMzIoIEhXTkQzMiBod25kLCBVSU5UMzIgaWQsIFVJTlQzMiB0aW1lb3V0LAogICAgICAgICAgICAgICAgICAgICAgICAgICBUSU1FUlBST0MzMiBwcm9jICkKIHsKLSAgICBkcHJpbnRmX3RpbWVyKCBzdGRkZWIsICJTZXRUaW1lcjMyOiAlMDR4ICVkICVkICUwOGx4XG4iLAorICAgIGRwcmludGZfaW5mbyh0aW1lciwgIlNldFRpbWVyMzI6ICUwNHggJWQgJWQgJTA4bHhcbiIsCiAgICAgICAgICAgICAgICAgICAgaHduZCwgaWQsIHRpbWVvdXQsIChMT05HKXByb2MgKTsKICAgICByZXR1cm4gVElNRVJfU2V0VGltZXIoIGh3bmQsIGlkLCB0aW1lb3V0LCAoV05EUFJPQzE2KXByb2MsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBXSU5fUFJPQ18zMkEsIEZBTFNFICk7CkBAIC0zMzAsNyArMzI4LDcgQEAKIFVJTlQxNiBXSU5BUEkgU2V0U3lzdGVtVGltZXIxNiggSFdORDE2IGh3bmQsIFVJTlQxNiBpZCwgVUlOVDE2IHRpbWVvdXQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRJTUVSUFJPQzE2IHByb2MgKQogewotICAgIGRwcmludGZfdGltZXIoIHN0ZGRlYiwgIlNldFN5c3RlbVRpbWVyMTY6ICUwNHggJWQgJWQgJTA4bHhcbiIsIAorICAgIGRwcmludGZfaW5mbyh0aW1lciwgIlNldFN5c3RlbVRpbWVyMTY6ICUwNHggJWQgJWQgJTA4bHhcbiIsIAogICAgICAgICAgICAgICAgICAgIGh3bmQsIGlkLCB0aW1lb3V0LCAoTE9ORylwcm9jICk7CiAgICAgcmV0dXJuIFRJTUVSX1NldFRpbWVyKCBod25kLCBpZCwgdGltZW91dCwgKFdORFBST0MxNilwcm9jLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgV0lOX1BST0NfMTYsIFRSVUUgKTsKQEAgLTM0Myw3ICszNDEsNyBAQAogVUlOVDMyIFdJTkFQSSBTZXRTeXN0ZW1UaW1lcjMyKCBIV05EMzIgaHduZCwgVUlOVDMyIGlkLCBVSU5UMzIgdGltZW91dCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVElNRVJQUk9DMzIgcHJvYyApCiB7Ci0gICAgZHByaW50Zl90aW1lciggc3RkZGViLCAiU2V0U3lzdGVtVGltZXIzMjogJTA0eCAlZCAlZCAlMDhseFxuIiwgCisgICAgZHByaW50Zl9pbmZvKHRpbWVyLCAiU2V0U3lzdGVtVGltZXIzMjogJTA0eCAlZCAlZCAlMDhseFxuIiwgCiAgICAgICAgICAgICAgICAgICAgaHduZCwgaWQsIHRpbWVvdXQsIChMT05HKXByb2MgKTsKICAgICByZXR1cm4gVElNRVJfU2V0VGltZXIoIGh3bmQsIGlkLCB0aW1lb3V0LCAoV05EUFJPQzE2KXByb2MsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBXSU5fUFJPQ18zMkEsIFRSVUUgKTsKQEAgLTM1NSw3ICszNTMsNyBAQAogICovCiBCT09MMTYgV0lOQVBJIEtpbGxUaW1lcjE2KCBIV05EMTYgaHduZCwgVUlOVDE2IGlkICkKIHsKLSAgICBkcHJpbnRmX3RpbWVyKHN0ZGRlYiwgIktpbGxUaW1lcjE2OiAlMDR4ICVkXG4iLCBod25kLCBpZCApOworICAgIGRwcmludGZfaW5mbyh0aW1lciwgIktpbGxUaW1lcjE2OiAlMDR4ICVkXG4iLCBod25kLCBpZCApOwogICAgIHJldHVybiBUSU1FUl9LaWxsVGltZXIoIGh3bmQsIGlkLCBGQUxTRSApOwogfQogCkBAIC0zNjUsNyArMzYzLDcgQEAKICAqLwogQk9PTDMyIFdJTkFQSSBLaWxsVGltZXIzMiggSFdORDMyIGh3bmQsIFVJTlQzMiBpZCApCiB7Ci0gICAgZHByaW50Zl90aW1lcihzdGRkZWIsICJLaWxsVGltZXIzMjogJTA0eCAlZFxuIiwgaHduZCwgaWQgKTsKKyAgICBkcHJpbnRmX2luZm8odGltZXIsICJLaWxsVGltZXIzMjogJTA0eCAlZFxuIiwgaHduZCwgaWQgKTsKICAgICByZXR1cm4gVElNRVJfS2lsbFRpbWVyKCBod25kLCBpZCwgRkFMU0UgKTsKIH0KIApAQCAtMzc1LDcgKzM3Myw3IEBACiAgKi8KIEJPT0wxNiBXSU5BUEkgS2lsbFN5c3RlbVRpbWVyMTYoIEhXTkQxNiBod25kLCBVSU5UMTYgaWQgKQogewotICAgIGRwcmludGZfdGltZXIoIHN0ZGRlYiwgIktpbGxTeXN0ZW1UaW1lcjE2OiAlMDR4ICVkXG4iLCBod25kLCBpZCApOworICAgIGRwcmludGZfaW5mbyh0aW1lciwgIktpbGxTeXN0ZW1UaW1lcjE2OiAlMDR4ICVkXG4iLCBod25kLCBpZCApOwogICAgIHJldHVybiBUSU1FUl9LaWxsVGltZXIoIGh3bmQsIGlkLCBUUlVFICk7CiB9CiAKQEAgLTM4NSw2ICszODMsNiBAQAogICovCiBCT09MMzIgV0lOQVBJIEtpbGxTeXN0ZW1UaW1lcjMyKCBIV05EMzIgaHduZCwgVUlOVDMyIGlkICkKIHsKLSAgICBkcHJpbnRmX3RpbWVyKCBzdGRkZWIsICJLaWxsU3lzdGVtVGltZXIzMjogJTA0eCAlZFxuIiwgaHduZCwgaWQgKTsKKyAgICBkcHJpbnRmX2luZm8odGltZXIsICJLaWxsU3lzdGVtVGltZXIzMjogJTA0eCAlZFxuIiwgaHduZCwgaWQgKTsKICAgICByZXR1cm4gVElNRVJfS2lsbFRpbWVyKCBod25kLCBpZCwgVFJVRSApOwogfQpkaWZmIC0tZ2l0IGEvd2luZG93cy91c2VyLmMgYi93aW5kb3dzL3VzZXIuYwppbmRleCA4ZmFmOTFiLi5mN2FlYTAxIDEwMDY0NAotLS0gYS93aW5kb3dzL3VzZXIuYworKysgYi93aW5kb3dzL3VzZXIuYwpAQCAtMzAwLDYgKzMwMCwyMCBAQAogICAgIHJldHVybiBGQUxTRTsKIH0KIAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiAgICAgICAgICAgRW51bURpc3BsYXlTZXR0aW5nc0EgICAoVVNFUjMyLjU5MikKKyAqLworQk9PTDMyIFdJTkFQSSBFbnVtRGlzcGxheVNldHRpbmdzMzJBKExQQ1NUUiBuYW1lLERXT1JEIG4sTFBERVZNT0RFMzJBIGRldm1vZGUpIHsKKwlmcHJpbnRmKHN0ZGVyciwiRW51bURpc3BsYXlTZXR0aW5nczMyQSglcywlbGQsJXApXG4iLG5hbWUsbixkZXZtb2RlKTsKKwlpZiAobj09MCkgeworCQlkZXZtb2RlLT5kbUJpdHNQZXJQZWwgPSBEZWZhdWx0RGVwdGhPZlNjcmVlbihzY3JlZW4pOworCQlkZXZtb2RlLT5kbVBlbHNIZWlnaHQgPSBzY3JlZW5IZWlnaHQ7CisJCWRldm1vZGUtPmRtUGVsc1dpZHRoID0gc2NyZWVuV2lkdGg7CisJCXJldHVybiBUUlVFOworCX0KKwlyZXR1cm4gRkFMU0U7Cit9CisKIAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgKiAgICAgICAgICAgU2V0RXZlbnRIb29rICAgKFVTRVIuMzIxKQpkaWZmIC0tZ2l0IGEvd2luZG93cy93aW4uYyBiL3dpbmRvd3Mvd2luLmMKaW5kZXggNzRiNTVlYS4uZDQzMWI1MSAxMDA2NDQKLS0tIGEvd2luZG93cy93aW4uYworKysgYi93aW5kb3dzL3dpbi5jCkBAIC0zMCwxMCArMzAsOCBAQAogI2luY2x1ZGUgImNsaXBib2FyZC5oIgogI2luY2x1ZGUgIndpbnByb2MuaCIKICNpbmNsdWRlICJ0aHJlYWQuaCIKLSNpbmNsdWRlICJzdGRkZWJ1Zy5oIgotLyogI2RlZmluZSBERUJVR19XSU4gICovIAotLyogI2RlZmluZSBERUJVR19NRU5VICovCiAjaW5jbHVkZSAiZGVidWcuaCIKKyNpbmNsdWRlICJkZWJ1Z3N0ci5oIgogCiAvKiBEZXNrdG9wIHdpbmRvdyAqLwogc3RhdGljIFdORCAqcFduZERlc2t0b3AgPSBOVUxMOwpAQCAtMjM3LDcgKzIzNSw3IEBACiAgICAgewogICAgICAgICBpZiAoIShwV25kLT5kd1N0eWxlICYgV1NfVklTSUJMRSkpCiAgICAgICAgIHsKLSAgICAgICAgICAgIGRwcmludGZfd2luKCBzdGRkZWIsICJGaW5kV2luVG9SZXBhaW50OiBza2lwcGluZyB3aW5kb3cgJTA0eFxuIiwKKyAgICAgICAgICAgIGRwcmludGZfaW5mbyh3aW4sICJGaW5kV2luVG9SZXBhaW50OiBza2lwcGluZyB3aW5kb3cgJTA0eFxuIiwKICAgICAgICAgICAgICAgICAgICAgICAgICBwV25kLT5od25kU2VsZiApOwogICAgICAgICAgICAgY29udGludWU7CiAgICAgICAgIH0KQEAgLTI2MCw3ICsyNTgsNyBAQAogICAgICAgICBwV25kID0gcFduZC0+bmV4dDsKICAgICB9CiAgICAgaWYgKHBXbmQpIGh3bmRSZXQgPSBwV25kLT5od25kU2VsZjsKLSAgICBkcHJpbnRmX3dpbihzdGRkZWIsIkZpbmRXaW5Ub1JlcGFpbnQ6IGZvdW5kICUwNHhcbiIsaHduZFJldCk7CisgICAgZHByaW50Zl9pbmZvKHdpbiwiRmluZFdpblRvUmVwYWludDogZm91bmQgJTA0eFxuIixod25kUmV0KTsKICAgICByZXR1cm4gaHduZFJldDsKIH0KIApAQCAtMjc1LDcgKzI3Myw3IEBACiAgICAgSFdORDMyIGh3bmQgPSB3bmRQdHItPmh3bmRTZWxmOwogICAgIFdORCAqcFduZDsKIAotICAgIGRwcmludGZfd2luKCBzdGRkZWIsICJXSU5fRGVzdHJveVdpbmRvdzogJTA0eFxuIiwgd25kUHRyLT5od25kU2VsZiApOworICAgIGRwcmludGZfaW5mbyh3aW4sICJXSU5fRGVzdHJveVdpbmRvdzogJTA0eFxuIiwgd25kUHRyLT5od25kU2VsZiApOwogCiAjaWZkZWYgQ09ORklHX0lQQwogICAgIGlmIChtYWluX2Jsb2NrKQpAQCAtNDA1LDcgKzQwMyw3IEBACiAgICAgQ0xBU1MgKmNsYXNzOwogICAgIEhXTkQzMiBod25kRGVza3RvcDsKIAotICAgIGRwcmludGZfd2luKHN0ZGRlYiwiQ3JlYXRpbmcgZGVza3RvcCB3aW5kb3dcbiIpOworICAgIGRwcmludGZfaW5mbyh3aW4sIkNyZWF0aW5nIGRlc2t0b3Agd2luZG93XG4iKTsKIAogICAgIGlmICghSUNPTlRJVExFX0luaXQoKSB8fAogCSFXSU5QT1NfQ3JlYXRlSW50ZXJuYWxQb3NBdG9tKCkgfHwKQEAgLTQ2OSwxNCArNDY3LDEwIEBACiAgICAgUE9JTlQzMiBtYXhTaXplLCBtYXhQb3MsIG1pblRyYWNrLCBtYXhUcmFjazsKICAgICBMUkVTVUxUIChXSU5BUEkgKmxvY2FsU2VuZDMyKShIV05EMzIsIFVJTlQzMiwgV1BBUkFNMzIsIExQQVJBTSk7CiAKLSAgICBkcHJpbnRmX3dpbiggc3RkZGViLCAiQ3JlYXRlV2luZG93RXg6ICIgKTsKLSAgICBpZiAoSElXT1JEKGNzLT5scHN6TmFtZSkpIGRwcmludGZfd2luKCBzdGRkZWIsICInJXMnICIsIGNzLT5scHN6TmFtZSApOwotICAgIGVsc2UgZHByaW50Zl93aW4oIHN0ZGRlYiwgIiMlMDR4ICIsIExPV09SRChjcy0+bHBzek5hbWUpICk7Ci0gICAgaWYgKEhJV09SRChjcy0+bHBzekNsYXNzKSkgZHByaW50Zl93aW4oIHN0ZGRlYiwgIiclcycgIiwgY3MtPmxwc3pDbGFzcyApOwotICAgIGVsc2UgZHByaW50Zl93aW4oIHN0ZGRlYiwgIiMlMDR4ICIsIExPV09SRChjcy0+bHBzekNsYXNzKSApOwotCi0gICAgZHByaW50Zl93aW4oIHN0ZGRlYiwgIiUwOGx4ICUwOGx4ICVkLCVkICVkeCVkICUwNHggJTA0eCAlMDh4ICVwXG4iLAotCQkgY3MtPmR3RXhTdHlsZSwgY3MtPnN0eWxlLCBjcy0+eCwgY3MtPnksIGNzLT5jeCwgY3MtPmN5LAorICAgIGRwcmludGZfaW5mbyh3aW4sICJDcmVhdGVXaW5kb3dFeDogJXMgJXMgJTA4bHggJTA4bHggJWQsJWQgJWR4JWQgIgorCQkgIiUwNHggJTA0eCAlMDh4ICVwXG4iLCBkZWJ1Z3Jlcyhjcy0+bHBzek5hbWUpLCAKKwkJIGRlYnVncmVzKGNzLT5scHN6Q2xhc3MpLCBjcy0+ZHdFeFN0eWxlLCAKKwkJIGNzLT5zdHlsZSwgY3MtPngsIGNzLT55LCBjcy0+Y3gsIGNzLT5jeSwKIAkJIGNzLT5od25kUGFyZW50LCBjcy0+aE1lbnUsIGNzLT5oSW5zdGFuY2UsIGNzLT5scENyZWF0ZVBhcmFtcyk7CiAKICAgICAvKiBGaW5kIHRoZSBwYXJlbnQgd2luZG93ICovCkBAIC01MjEsNyArNTE1LDcgQEAKICAgICBpZiAoIShod25kID0gVVNFUl9IRUFQX0FMTE9DKCBzaXplb2YoKnduZFB0cikgKyBjbGFzc1B0ci0+Y2JXbmRFeHRyYQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0gc2l6ZW9mKHduZFB0ci0+d0V4dHJhKSApKSkKICAgICB7Ci0JZHByaW50Zl93aW4oIHN0ZGRlYiwgIkNyZWF0ZVdpbmRvd0V4OiBvdXQgb2YgbWVtb3J5XG4iICk7CisJZHByaW50Zl9pbmZvKHdpbiwgIkNyZWF0ZVdpbmRvd0V4OiBvdXQgb2YgbWVtb3J5XG4iICk7CiAJcmV0dXJuIDA7CiAgICAgfQogCkBAIC01ODAsNyArNTc0LDcgQEAKIAljYnRjLmh3bmRJbnNlcnRBZnRlciA9IGh3bmRMaW5rQWZ0ZXI7CiAJaWYgKCBIT09LX0NhbGxIb29rczMyQShXSF9DQlQsIEhDQlRfQ1JFQVRFV05ELCBod25kLCAoTFBBUkFNKSZjYnRjKSApCiAJewotCSAgICBkcHJpbnRmX3dpbihzdGRkZWIsICJDcmVhdGVXaW5kb3dFeDogQ0JULWhvb2sgcmV0dXJuZWQgMFxuIik7CisJICAgIGRwcmludGZfaW5mbyh3aW4sICJDcmVhdGVXaW5kb3dFeDogQ0JULWhvb2sgcmV0dXJuZWQgMFxuIik7CiAJICAgIFVTRVJfSEVBUF9GUkVFKCBod25kICk7CiAJICAgIHJldHVybiAwOwogCX0KQEAgLTcxMSw5ICs3MDUsMTEgQEAKICAgICAgICAgICAgICAgICAgICAgICAgTG9hZE1lbnUoY3MtPmhJbnN0YW5jZSwoU0VHUFRSKWNsYXNzUHRyLT5tZW51TmFtZUEpOwogI2Vsc2UKIAkgICAgU0VHUFRSIG1lbnVOYW1lID0gKFNFR1BUUilHZXRDbGFzc0xvbmcxNiggaHduZCwgR0NMX01FTlVOQU1FICk7Ci0JICAgIGlmIChISVdPUkQoY3MtPmhJbnN0YW5jZSkpCisJICAgIC8qIGhJbnN0YW5jZSBpcyBzdGlsbCAxNi1iaXQgaW4gOTgwMjE1IHdpbmVsaWIgKi8KKwkgICAgaWYgKEhJV09SRChjcy0+aEluc3RhbmNlKSB8fCBfX3dpbmVsaWIpCiAJICAgIAljcy0+aE1lbnUgPSBMb2FkTWVudTMyQShjcy0+aEluc3RhbmNlLFBUUl9TRUdfVE9fTElOKG1lbnVOYW1lKSk7CiAJICAgIGVsc2UKKwkgICAgICAvKiBkb2Vzbid0IHdvcmsgZm9yIHdpbmVsaWIsIHNpbmNlIHJlc291cmNlcyBhcmUgdW5pY29kZSAqLwogCSAgICAJY3MtPmhNZW51ID0gTG9hZE1lbnUxNihjcy0+aEluc3RhbmNlLG1lbnVOYW1lKTsKICNlbmRpZgogICAgICAgICB9CkBAIC03ODAsMTQgKzc3NiwxNCBAQAogICAgICAgICAgICAgaWYgKCEod25kUHRyLT5kd1N0eWxlICYgV1NfQ0hJTEQpICYmICF3bmRQdHItPm93bmVyKQogICAgICAgICAgICAgICAgIEhPT0tfQ2FsbEhvb2tzMTYoIFdIX1NIRUxMLCBIU0hFTExfV0lORE9XQ1JFQVRFRCwgaHduZCwgMCApOwogCi0gICAgICAgICAgICBkcHJpbnRmX3dpbihzdGRkZWIsICJDcmVhdGVXaW5kb3dFeDogY3JlYXRlZCB3aW5kb3cgJTA0eFxuIiwgaHduZCk7CisgICAgICAgICAgICBkcHJpbnRmX2luZm8od2luLCAiQ3JlYXRlV2luZG93RXg6IGNyZWF0ZWQgd2luZG93ICUwNHhcbiIsIGh3bmQpOwogICAgICAgICAgICAgcmV0dXJuIGh3bmQ7CiAgICAgICAgIH0KICAgICB9CiAKICAgICAvKiBBYm9ydCB3aW5kb3cgY3JlYXRpb24gKi8KIAotICAgIGRwcmludGZfd2luKHN0ZGRlYiwiQ3JlYXRlV2luZG93RXg6IGFib3J0ZWQgYnkgV01feHhDUkVBVEUhXG4iKTsKKyAgICBkcHJpbnRmX3dhcm4od2luLCAiQ3JlYXRlV2luZG93RXg6IGFib3J0ZWQgYnkgV01feHhDUkVBVEUhXG4iKTsKICAgICBXSU5fVW5saW5rV2luZG93KCBod25kICk7CiAgICAgV0lOX0Rlc3Ryb3lXaW5kb3coIHduZFB0ciApOwogICAgIHJldHVybiAwOwpAQCAtODUxLDcgKzg0Nyw3IEBACiAKIAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiAgICAgICAgICAgQ3JlYXRlV2luZG93RXgzMkEgICAoVVNFUjMyLjgyKQorICogICAgICAgICAgIENyZWF0ZVdpbmRvd0V4MzJBICAgKFVTRVIzMi44MykKICAqLwogSFdORDMyIFdJTkFQSSBDcmVhdGVXaW5kb3dFeDMyQSggRFdPUkQgZXhTdHlsZSwgTFBDU1RSIGNsYXNzTmFtZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExQQ1NUUiB3aW5kb3dOYW1lLCBEV09SRCBzdHlsZSwgSU5UMzIgeCwKQEAgLTg5MSw3ICs4ODcsNyBAQAogCiAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogICAgICAgICAgIENyZWF0ZVdpbmRvd0V4MzJXICAgKFVTRVIzMi44MykKKyAqICAgICAgICAgICBDcmVhdGVXaW5kb3dFeDMyVyAgIChVU0VSMzIuODQpCiAgKi8KIEhXTkQzMiBXSU5BUEkgQ3JlYXRlV2luZG93RXgzMlcoIERXT1JEIGV4U3R5bGUsIExQQ1dTVFIgY2xhc3NOYW1lLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFBDV1NUUiB3aW5kb3dOYW1lLCBEV09SRCBzdHlsZSwgSU5UMzIgeCwKQEAgLTk2OSw3ICs5NjUsNyBAQAogCVdJTl9DaGVja0ZvY3VzKHBXbmQpOwogICAgIH0KICAgICBlbHNlCi0JZHByaW50Zl93aW4oc3RkZGViLCJcdGRlc3Ryb3llZCBpdHNlbGYgd2hpbGUgaW4gV01fREVTVFJPWSFcbiIpOworCWRwcmludGZfd2Fybih3aW4sICJcdGRlc3Ryb3llZCBpdHNlbGYgd2hpbGUgaW4gV01fREVTVFJPWSFcbiIpOwogfQogCiAKQEAgLTk4MywxMyArOTc5LDEzIEBACiAKIAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiAgICAgICAgICAgRGVzdHJveVdpbmRvdzMyICAgKFVTRVIzMi4xMzQpCisgKiAgICAgICAgICAgRGVzdHJveVdpbmRvdzMyICAgKFVTRVIzMi4xMzUpCiAgKi8KIEJPT0wzMiBXSU5BUEkgRGVzdHJveVdpbmRvdzMyKCBIV05EMzIgaHduZCApCiB7CiAgICAgV05EICogd25kUHRyOwogCi0gICAgZHByaW50Zl93aW4oc3RkZGViLCAiRGVzdHJveVdpbmRvdyglMDR4KVxuIiwgaHduZCk7CisgICAgZHByaW50Zl9pbmZvKHdpbiwgIkRlc3Ryb3lXaW5kb3coJTA0eClcbiIsIGh3bmQpOwogICAgIAogICAgICAgLyogSW5pdGlhbGl6YXRpb24gKi8KIApAQCAtMTA4NSw3ICsxMDgxLDcgQEAKIAogIAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiAgICAgICAgICAgQ2xvc2VXaW5kb3czMiAgIChVU0VSMzIuNTUpCisgKiAgICAgICAgICAgQ2xvc2VXaW5kb3czMiAgIChVU0VSMzIuNTYpCiAgKi8KIEJPT0wzMiBXSU5BUEkgQ2xvc2VXaW5kb3czMiggSFdORDMyIGh3bmQgKQogewpAQCAtMTEwNiw3ICsxMTAyLDcgQEAKIAogCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqICAgICAgICAgICBPcGVuSWNvbjMyICAgKFVTRVIzMi40MDkpCisgKiAgICAgICAgICAgT3Blbkljb24zMiAgIChVU0VSMzIuNDEwKQogICovCiBCT09MMzIgV0lOQVBJIE9wZW5JY29uMzIoIEhXTkQzMiBod25kICkKIHsKQEAgLTExOTIsNyArMTE4OCw3IEBACiB7CiAgICAgQVRPTSBhdG9tID0gMDsKIAotICAgIGRwcmludGZfd2luKHN0ZGRlYiwgIkZpbmRXaW5kb3dFeDE2OiAlMDR4ICUwNHggJyVzJyAnJXMnXG4iLCBwYXJlbnQsCisgICAgZHByaW50Zl9pbmZvKHdpbiwgIkZpbmRXaW5kb3dFeDE2OiAlMDR4ICUwNHggJyVzJyAnJXMnXG4iLCBwYXJlbnQsCiAJCWNoaWxkLCBISVdPUkQoY2xhc3NOYW1lKT8oY2hhciAqKVBUUl9TRUdfVE9fTElOKGNsYXNzTmFtZSk6IiIsCiAJCXRpdGxlID8gdGl0bGUgOiAiIik7CiAKQEAgLTEyMDcsNyArMTIwMyw3IEBACiAKIAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiAgICAgICAgICAgRmluZFdpbmRvdzMyQSAgIChVU0VSMzIuMTk3KQorICogICAgICAgICAgIEZpbmRXaW5kb3czMkEgICAoVVNFUjMyLjE5OCkKICAqLwogSFdORDMyIFdJTkFQSSBGaW5kV2luZG93MzJBKCBMUENTVFIgY2xhc3NOYW1lLCBMUENTVFIgdGl0bGUgKQogewpAQCAtMTIxNiw3ICsxMjEyLDcgQEAKIAogCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqICAgICAgICAgICBGaW5kV2luZG93RXgzMkEgICAoVVNFUjMyLjE5OCkKKyAqICAgICAgICAgICBGaW5kV2luZG93RXgzMkEgICAoVVNFUjMyLjE5OSkKICAqLwogSFdORDMyIFdJTkFQSSBGaW5kV2luZG93RXgzMkEoIEhXTkQzMiBwYXJlbnQsIEhXTkQzMiBjaGlsZCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMUENTVFIgY2xhc3NOYW1lLCBMUENTVFIgdGl0bGUgKQpAQCAtMTIzNCw3ICsxMjMwLDcgQEAKIAogCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqICAgICAgICAgICBGaW5kV2luZG93RXgzMlcgICAoVVNFUjMyLjE5OSkKKyAqICAgICAgICAgICBGaW5kV2luZG93RXgzMlcgICAoVVNFUjMyLjIwMCkKICAqLwogSFdORDMyIFdJTkFQSSBGaW5kV2luZG93RXgzMlcoIEhXTkQzMiBwYXJlbnQsIEhXTkQzMiBjaGlsZCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMUENXU1RSIGNsYXNzTmFtZSwgTFBDV1NUUiB0aXRsZSApCkBAIC0xMjU3LDcgKzEyNTMsNyBAQAogCiAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogICAgICAgICAgIEZpbmRXaW5kb3czMlcgICAoVVNFUjMyLjIwMCkKKyAqICAgICAgICAgICBGaW5kV2luZG93MzJXICAgKFVTRVIzMi4yMDEpCiAgKi8KIEhXTkQzMiBXSU5BUEkgRmluZFdpbmRvdzMyVyggTFBDV1NUUiBjbGFzc05hbWUsIExQQ1dTVFIgdGl0bGUgKQogewpAQCAtMTI4NCw3ICsxMjgwLDcgQEAKIAogCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogICAgICAgICAgIEdldERlc2t0b3BXaW5kb3czMiAgIChVU0VSMzIuMjMxKQorICogICAgICAgICAgIEdldERlc2t0b3BXaW5kb3czMiAgIChVU0VSMzIuMjMyKQogICovCiBIV05EMzIgV0lOQVBJIEdldERlc2t0b3BXaW5kb3czMih2b2lkKQogewpAQCAtMTMxNCw3ICsxMzEwLDcgQEAKIAogCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogICAgICAgICAgIEVuYWJsZVdpbmRvdzMyICAgKFVTRVIzMi4xNzEpCisgKiAgICAgICAgICAgRW5hYmxlV2luZG93MzIgICAoVVNFUjMyLjE3MikKICAqLwogQk9PTDMyIFdJTkFQSSBFbmFibGVXaW5kb3czMiggSFdORDMyIGh3bmQsIEJPT0wzMiBlbmFibGUgKQogewpAQCAtMTM1Myw3ICsxMzQ5LDcgQEAKIAogCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqICAgICAgICAgICBJc1dpbmRvd0VuYWJsZWQzMiAgIChVU0VSMzIuMzQ4KQorICogICAgICAgICAgIElzV2luZG93RW5hYmxlZDMyICAgKFVTRVIzMi4zNDkpCiAgKi8gCiBCT09MMzIgV0lOQVBJIElzV2luZG93RW5hYmxlZDMyKEhXTkQzMiBoV25kKQogewpAQCAtMTM2NSw3ICsxMzYxLDcgQEAKIAogCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqICAgICAgICAgICBJc1dpbmRvd1VuaWNvZGUgICAoVVNFUjMyLjM0OSkKKyAqICAgICAgICAgICBJc1dpbmRvd1VuaWNvZGUgICAoVVNFUjMyLjM1MCkKICAqLwogQk9PTDMyIFdJTkFQSSBJc1dpbmRvd1VuaWNvZGUoIEhXTkQzMiBod25kICkKIHsKQEAgLTEzODYsNyArMTM4Miw3IEBACiAKIAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCSAgICAgR2V0V2luZG93V29yZDMyICAgIChVU0VSMzIuMzEzKQorICoJICAgICBHZXRXaW5kb3dXb3JkMzIgICAgKFVTRVIzMi4zMTQpCiAgKi8KIFdPUkQgV0lOQVBJIEdldFdpbmRvd1dvcmQzMiggSFdORDMyIGh3bmQsIElOVDMyIG9mZnNldCApCiB7CkBAIC0xNDQwLDcgKzE0MzYsNyBAQAogCiAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgkgICAgIFNldFdpbmRvd1dvcmQzMiAgICAoVVNFUjMyLjUyMykKKyAqCSAgICAgU2V0V2luZG93V29yZDMyICAgIChVU0VSMzIuNTI0KQogICovCiBXT1JEIFdJTkFQSSBTZXRXaW5kb3dXb3JkMzIoIEhXTkQzMiBod25kLCBJTlQzMiBvZmZzZXQsIFdPUkQgbmV3dmFsICkKIHsKQEAgLTE1ODQsNyArMTU4MCw3IEBACiAKIAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCSAgICAgR2V0V2luZG93TG9uZzMyQSAgICAoVVNFUjMyLjMwNCkKKyAqCSAgICAgR2V0V2luZG93TG9uZzMyQSAgICAoVVNFUjMyLjMwNSkKICAqLwogTE9ORyBXSU5BUEkgR2V0V2luZG93TG9uZzMyQSggSFdORDMyIGh3bmQsIElOVDMyIG9mZnNldCApCiB7CkBAIC0xNTkzLDcgKzE1ODksNyBAQAogCiAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgkgICAgIEdldFdpbmRvd0xvbmczMlcgICAgKFVTRVIzMi4zMDUpCisgKgkgICAgIEdldFdpbmRvd0xvbmczMlcgICAgKFVTRVIzMi4zMDYpCiAgKi8KIExPTkcgV0lOQVBJIEdldFdpbmRvd0xvbmczMlcoIEhXTkQzMiBod25kLCBJTlQzMiBvZmZzZXQgKQogewpAQCAtMTYxMSw3ICsxNjA3LDcgQEAKIAogCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoJICAgICBTZXRXaW5kb3dMb25nMzJBICAgIChVU0VSMzIuNTE2KQorICoJICAgICBTZXRXaW5kb3dMb25nMzJBICAgIChVU0VSMzIuNTE3KQogICovCiBMT05HIFdJTkFQSSBTZXRXaW5kb3dMb25nMzJBKCBIV05EMzIgaHduZCwgSU5UMzIgb2Zmc2V0LCBMT05HIG5ld3ZhbCApCiB7CkBAIC0xNjIwLDcgKzE2MTYsNyBAQAogCiAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgkgICAgIFNldFdpbmRvd0xvbmczMlcgICAgKFVTRVIzMi41MTcpCisgKgkgICAgIFNldFdpbmRvd0xvbmczMlcgICAgKFVTRVIzMi41MTgpCiAgKi8KIExPTkcgV0lOQVBJIFNldFdpbmRvd0xvbmczMlcoIEhXTkQzMiBod25kLCBJTlQzMiBvZmZzZXQsIExPTkcgbmV3dmFsICkKIHsKQEAgLTE2MzgsNyArMTYzNCw3IEBACiAKIAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCSAgICAgR2V0V2luZG93VGV4dDMyQSAgICAoVVNFUjMyLjMwOCkKKyAqCSAgICAgR2V0V2luZG93VGV4dDMyQSAgICAoVVNFUjMyLjMwOSkKICAqLwogSU5UMzIgV0lOQVBJIEdldFdpbmRvd1RleHQzMkEoIEhXTkQzMiBod25kLCBMUFNUUiBscFN0cmluZywgSU5UMzIgbk1heENvdW50ICkKIHsKQEAgLTE2NDgsNyArMTY0NCw3IEBACiAKIAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCSAgICAgR2V0V2luZG93VGV4dDMyVyAgICAoVVNFUjMyLjMxMSkKKyAqCSAgICAgR2V0V2luZG93VGV4dDMyVyAgICAoVVNFUjMyLjMxMikKICAqLwogSU5UMzIgV0lOQVBJIEdldFdpbmRvd1RleHQzMlcoIEhXTkQzMiBod25kLCBMUFdTVFIgbHBTdHJpbmcsIElOVDMyIG5NYXhDb3VudCApCiB7CkBAIC0xNjc2LDcgKzE2NzIsNyBAQAogCiAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgkgICAgIFNldFdpbmRvd1RleHQzMlcgICAgKFVTRVIzMi41MjIpCisgKgkgICAgIFNldFdpbmRvd1RleHQzMlcgICAgKFVTRVIzMi41MjMpCiAgKi8KIHZvaWQgV0lOQVBJIFNldFdpbmRvd1RleHQzMlcoIEhXTkQzMiBod25kLCBMUENXU1RSIGxwU3RyaW5nICkKIHsKQEAgLTE2OTQsNyArMTY5MCw3IEBACiAKIAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqICAgICAgICAgR2V0V2luZG93VGV4dExlbmd0aDMyQSAgIChVU0VSMzIuMzA5KQorICogICAgICAgICBHZXRXaW5kb3dUZXh0TGVuZ3RoMzJBICAgKFVTRVIzMi4zMTApCiAgKi8KIElOVDMyIFdJTkFQSSBHZXRXaW5kb3dUZXh0TGVuZ3RoMzJBKCBIV05EMzIgaHduZCApCiB7CkBAIC0xNzAyLDcgKzE2OTgsNyBAQAogfQogCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogICAgICAgICBHZXRXaW5kb3dUZXh0TGVuZ3RoMzJXICAgKFVTRVIzMi4zMDkpCisgKiAgICAgICAgIEdldFdpbmRvd1RleHRMZW5ndGgzMlcgICAoVVNFUjMyLjMxMSkKICAqLwogSU5UMzIgV0lOQVBJIEdldFdpbmRvd1RleHRMZW5ndGgzMlcoIEhXTkQzMiBod25kICkKIHsKQEAgLTE3MjAsNyArMTcxNiw3IEBACiAKIAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqICAgICAgICAgSXNXaW5kb3czMiAgIChVU0VSMzIuMzQ3KQorICogICAgICAgICBJc1dpbmRvdzMyICAgKFVTRVIzMi4zNDgpCiAgKi8KIEJPT0wzMiBXSU5BUEkgSXNXaW5kb3czMiggSFdORDMyIGh3bmQgKQogewpAQCAtMTczOSw3ICsxNzM1LDcgQEAKIAogCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqICAgICAgICAgR2V0UGFyZW50MzIgICAoVVNFUjMyLjI3NykKKyAqICAgICAgICAgR2V0UGFyZW50MzIgICAoVVNFUjMyLjI3OCkKICAqLwogSFdORDMyIFdJTkFQSSBHZXRQYXJlbnQzMiggSFdORDMyIGh3bmQgKQogewpAQCAtMTc4Miw3ICsxNzc4LDcgQEAKIAogCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqICAgICAgICAgU2V0UGFyZW50MzIgICAoVVNFUjMyLjQ5NCkKKyAqICAgICAgICAgU2V0UGFyZW50MzIgICAoVVNFUjMyLjQ5NSkKICAqLwogSFdORDMyIFdJTkFQSSBTZXRQYXJlbnQzMiggSFdORDMyIGh3bmRDaGlsZCwgSFdORDMyIGh3bmROZXdQYXJlbnQgKQogewpAQCAtMTg0MSw3ICsxODM3LDcgQEAKIAogCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogICAgICAgICBJc0NoaWxkMzIgICAgKFVTRVIzMi4zMzgpCisgKiAgICAgICAgIElzQ2hpbGQzMiAgICAoVVNFUjMyLjMzOSkKICAqLwogQk9PTDMyIFdJTkFQSSBJc0NoaWxkMzIoIEhXTkQzMiBwYXJlbnQsIEhXTkQzMiBjaGlsZCApCiB7CkBAIC0xODY1LDcgKzE4NjEsNyBAQAogCiAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogICAgICAgICAgIElzV2luZG93VmlzaWJsZTMyICAgKFVTRVIzMi4zNTApCisgKiAgICAgICAgICAgSXNXaW5kb3dWaXNpYmxlMzIgICAoVVNFUjMyLjM1MSkKICAqLwogQk9PTDMyIFdJTkFQSSBJc1dpbmRvd1Zpc2libGUzMiggSFdORDMyIGh3bmQgKQogewpAQCAtMTkyOCw3ICsxOTI0LDcgQEAKIAogCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogICAgICAgICBHZXRXaW5kb3czMiAgICAoVVNFUjMyLjMwMSkKKyAqICAgICAgICAgR2V0V2luZG93MzIgICAgKFVTRVIzMi4zMDIpCiAgKi8KIEhXTkQzMiBXSU5BUEkgR2V0V2luZG93MzIoIEhXTkQzMiBod25kLCBXT1JEIHJlbCApCiB7CkBAIC0xOTg5LDcgKzE5ODUsNyBAQAogCiAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiAgICAgICAgIFNob3dPd25lZFBvcHVwczMyICAoVVNFUjMyLjUzMCkKKyAqICAgICAgICAgU2hvd093bmVkUG9wdXBzMzIgIChVU0VSMzIuNTMxKQogICovCiBCT09MMzIgV0lOQVBJIFNob3dPd25lZFBvcHVwczMyKCBIV05EMzIgb3duZXIsIEJPT0wzMiBmU2hvdyApCiB7CkBAIC0yMDE0LDcgKzIwMTAsNyBAQAogfQogCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogICAgICAgICBHZXRMYXN0QWN0aXZlUG9wdXAzMiAgIChVU0VSMzIuMjU1KQorICogICAgICAgICBHZXRMYXN0QWN0aXZlUG9wdXAzMiAgIChVU0VSMzIuMjU2KQogICovCiBIV05EMzIgV0lOQVBJIEdldExhc3RBY3RpdmVQb3B1cDMyKCBIV05EMzIgaHduZCApCiB7CkBAIC0yMTA1LDcgKzIxMDEsNyBAQAogCiAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiAgICAgICAgICAgRW51bVdpbmRvd3MzMiAgIChVU0VSMzIuMTkyKQorICogICAgICAgICAgIEVudW1XaW5kb3dzMzIgICAoVVNFUjMyLjE5MykKICAqLwogQk9PTDMyIFdJTkFQSSBFbnVtV2luZG93czMyKCBXTkRFTlVNUFJPQzMyIGxwRW51bUZ1bmMsIExQQVJBTSBsUGFyYW0gKQogewpAQCAtMjE0Miw3ICsyMTM4LDcgQEAKIAogCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogICAgICAgICAgIEVudW1UaHJlYWRXaW5kb3dzICAgKFVTRVIzMi4xODkpCisgKiAgICAgICAgICAgRW51bVRocmVhZFdpbmRvd3MgICAoVVNFUjMyLjE5MCkKICAqLwogQk9PTDMyIFdJTkFQSSBFbnVtVGhyZWFkV2luZG93cyggRFdPUkQgaWQsIFdOREVOVU1QUk9DMzIgZnVuYywgTFBBUkFNIGxQYXJhbSApCiB7CkBAIC0yMTk2LDcgKzIxOTIsNyBAQAogCiAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiAgICAgICAgICAgRW51bUNoaWxkV2luZG93czMyICAgKFVTRVIzMi4xNzcpCisgKiAgICAgICAgICAgRW51bUNoaWxkV2luZG93czMyICAgKFVTRVIzMi4xNzgpCiAgKi8KIEJPT0wzMiBXSU5BUEkgRW51bUNoaWxkV2luZG93czMyKCBIV05EMzIgcGFyZW50LCBXTkRFTlVNUFJPQzMyIGZ1bmMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFBBUkFNIGxQYXJhbSApCkBAIC0yMjE2LDcgKzIyMTIsNyBAQAogCiAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiAgICAgICAgICAgQW55UG9wdXAzMiAgIChVU0VSMzIuMykKKyAqICAgICAgICAgICBBbnlQb3B1cDMyICAgKFVTRVIzMi40KQogICovCiBCT09MMzIgV0lOQVBJIEFueVBvcHVwMzIodm9pZCkKIHsKQEAgLTIyMzcsMTMgKzIyMzMsMTMgQEAKIAogCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogICAgICAgICAgICBGbGFzaFdpbmRvdzMyICAgKFVTRVIzMi4yMDEpCisgKiAgICAgICAgICAgIEZsYXNoV2luZG93MzIgICAoVVNFUjMyLjIwMikKICAqLwogQk9PTDMyIFdJTkFQSSBGbGFzaFdpbmRvdzMyKCBIV05EMzIgaFduZCwgQk9PTDMyIGJJbnZlcnQgKQogewogICAgIFdORCAqd25kUHRyID0gV0lOX0ZpbmRXbmRQdHIoaFduZCk7CiAKLSAgICBkcHJpbnRmX3dpbihzdGRkZWIsIkZsYXNoV2luZG93OiAlMDR4XG4iLCBoV25kKTsKKyAgICBkcHJpbnRmX2luZm8od2luLCJGbGFzaFdpbmRvdzogJTA0eFxuIiwgaFduZCk7CiAKICAgICBpZiAoIXduZFB0cikgcmV0dXJuIEZBTFNFOwogCkBAIC0yMjg2LDcgKzIyODIsNyBAQAogewogICAgIEhXTkQzMiBoV25kT2xkTW9kYWwgPSBod25kU3lzTW9kYWw7CiAgICAgaHduZFN5c01vZGFsID0gaFduZDsKLSAgICBkcHJpbnRmX3dpbihzdGRuaW1wLCJFTVBUWSBTVFVCICEhIFNldFN5c01vZGFsV2luZG93KCUwNHgpICFcbiIsIGhXbmQpOworICAgIGRwcmludGZfZml4bWUod2luLCAiRU1QVFkgU1RVQiAhISBTZXRTeXNNb2RhbFdpbmRvdyglMDR4KSAhXG4iLCBoV25kKTsKICAgICByZXR1cm4gaFduZE9sZE1vZGFsOwogfQogCkBAIC0yMzQ0LDcgKzIzNDAsNyBAQAogCiAJIGlmKHB0clduZCkKICAgICAgICAgIHsKLQkgICAgZHByaW50Zl9tc2coc3RkZGViLCJEcmFnUXVlcnlVcGRhdGU6IGh3bmQgPSAlMDR4LCAlZCAlZCAtICVkICVkXG4iLAorCSAgICBkcHJpbnRmX2luZm8obXNnLCJEcmFnUXVlcnlVcGRhdGU6IGh3bmQgPSAlMDR4LCAlZCAlZCAtICVkICVkXG4iLAogICAgICAgICAgICAgICAgICAgICAgICAgcHRyV25kLT5od25kU2VsZiwgcHRyV25kLT5yZWN0V2luZG93LmxlZnQsIHB0clduZC0+cmVjdFdpbmRvdy50b3AsCiAJCQlwdHJXbmQtPnJlY3RXaW5kb3cucmlnaHQsIHB0clduZC0+cmVjdFdpbmRvdy5ib3R0b20gKTsKICAgICAgICAgICAgIGlmKCAhKHB0clduZC0+ZHdTdHlsZSAmIFdTX0RJU0FCTEVEKSApCkBAIC0yMzgzLDcgKzIzNzksNyBAQAogfQogCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogICAgICAgICAgICAgRHJhZ0RldGVjdDMyICAgKFVTRVIzMi4xNTApCisgKiAgICAgICAgICAgICBEcmFnRGV0ZWN0MzIgICAoVVNFUjMyLjE1MSkKICAqLwogQk9PTDMyIFdJTkFQSSBEcmFnRGV0ZWN0MzIoIEhXTkQzMiBoV25kLCBQT0lOVDMyIHB0ICkKIHsKQEAgLTI0ODMsNyArMjQ3OSw3IEBACiAJbHBEcmFnSW5mby0+cHQgPSBtc2cucHQ7CiAKIAkvKiB1cGRhdGUgRFJBR0lORk8gc3RydWN0ICovCi0JZHByaW50Zl9tc2coc3RkZGViLCJkcmFnOiBscERJLT5oU2NvcGUgPSAlMDR4XG4iLGxwRHJhZ0luZm8tPmhTY29wZSk7CisJZHByaW50Zl9pbmZvKG1zZywiZHJhZzogbHBESS0+aFNjb3BlID0gJTA0eFxuIixscERyYWdJbmZvLT5oU2NvcGUpOwogCiAJaWYoIERSQUdfUXVlcnlVcGRhdGUoaHduZFNjb3BlLCBzcERyYWdJbmZvLCBGQUxTRSkgPiAwICkKIAkgICAgaEN1cnJlbnRDdXJzb3IgPSBoQ3Vyc29yOwpkaWZmIC0tZ2l0IGEvd2luZG93cy93aW5wb3MuYyBiL3dpbmRvd3Mvd2lucG9zLmMKaW5kZXggMWMxYmRkNC4uNTNiNGVkNSAxMDA2NDQKLS0tIGEvd2luZG93cy93aW5wb3MuYworKysgYi93aW5kb3dzL3dpbnBvcy5jCkBAIC0yMCw4ICsyMCw2IEBACiAjaW5jbHVkZSAid2lucG9zLmgiCiAjaW5jbHVkZSAiZGNlLmgiCiAjaW5jbHVkZSAibm9uY2xpZW50LmgiCi0jaW5jbHVkZSAic3RkZGVidWcuaCIKLS8qICNkZWZpbmUgREVCVUdfV0lOICovCiAjaW5jbHVkZSAiZGVidWcuaCIKIAogI2RlZmluZSBIQVNfRExHRlJBTUUoc3R5bGUsZXhTdHlsZSkgXApAQCAtODcsNyArODUsNyBAQAogICAgIGlmKCBod25kID09IGh3bmRBY3RpdmUgKQogICAgIHsKIAlod25kQWN0aXZlID0gMDsgCi0JZHByaW50Zl93aW4oc3RkZGViLCJcdGF0dGVtcHQgdG8gYWN0aXZhdGUgZGVzdHJveWVkIHdpbmRvdyFcbiIpOworCWRwcmludGZfd2Fybih3aW4sICJcdGF0dGVtcHQgdG8gYWN0aXZhdGUgZGVzdHJveWVkIHdpbmRvdyFcbiIpOwogICAgIH0KIAogICAgIGlmKCBscFBvcyApCkBAIC03MjUsNyArNzIzLDcgQEAKIHsgICAgCiAgICAgaW50IGZsYWdzID0gU1dQX05PWk9SREVSIHwgU1dQX05PQUNUSVZBVEU7CiAgICAgaWYgKCFyZXBhaW50KSBmbGFncyB8PSBTV1BfTk9SRURSQVc7Ci0gICAgZHByaW50Zl93aW4oc3RkZGViLCAiTW92ZVdpbmRvdzogJTA0eCAlZCwlZCAlZHglZCAlZFxuIiwgCisgICAgZHByaW50Zl9pbmZvKHdpbiwgIk1vdmVXaW5kb3c6ICUwNHggJWQsJWQgJWR4JWQgJWRcbiIsIAogCSAgICBod25kLCB4LCB5LCBjeCwgY3ksIHJlcGFpbnQgKTsKICAgICByZXR1cm4gU2V0V2luZG93UG9zMzIoIGh3bmQsIDAsIHgsIHksIGN4LCBjeSwgZmxhZ3MgKTsKIH0KQEAgLTc5MSw3ICs3ODksNyBAQAogICAgIHsKIAlIV05EMTYgaFduZCA9IGxwUG9zLT5od25kSWNvblRpdGxlOwogCi0JZHByaW50Zl93aW4oc3RkZGViLCJTaG93SWNvblRpdGxlOiAweCUwNHggJWlcbiIsIHBXbmQtPmh3bmRTZWxmLCAoYlNob3cgIT0gMCkgKTsKKwlkcHJpbnRmX2luZm8od2luLCJTaG93SWNvblRpdGxlOiAweCUwNHggJWlcbiIsIHBXbmQtPmh3bmRTZWxmLCAoYlNob3cgIT0gMCkgKTsKIAogCWlmKCAhaFduZCApCiAJICAgIGxwUG9zLT5od25kSWNvblRpdGxlID0gaFduZCA9IElDT05USVRMRV9DcmVhdGUoIHBXbmQgKTsKQEAgLTg2OCw3ICs4NjYsNyBAQAogCiAgICAgICAvKiBTb21lIHNhbml0eSBjaGVja3MgKi8KIAotICAgIGRwcmludGZfd2luKHN0ZGRlYiwiR2V0TWluTWF4SW5mbzogJWQgJWQgLyAlZCAlZCAvICVkICVkIC8gJWQgJWRcbiIsCisgICAgZHByaW50Zl9pbmZvKHdpbiwiR2V0TWluTWF4SW5mbzogJWQgJWQgLyAlZCAlZCAvICVkICVkIC8gJWQgJWRcbiIsCiAgICAgICAgICAgICAgICAgICAgICAgTWluTWF4LnB0TWF4U2l6ZS54LCBNaW5NYXgucHRNYXhTaXplLnksCiAgICAgICAgICAgICAgICAgICAgICAgTWluTWF4LnB0TWF4UG9zaXRpb24ueCwgTWluTWF4LnB0TWF4UG9zaXRpb24ueSwKICAgICAgICAgICAgICAgICAgICAgICBNaW5NYXgucHRNYXhUcmFja1NpemUueCwgTWluTWF4LnB0TWF4VHJhY2tTaXplLnksCkBAIC04OTksNyArODk3LDcgQEAKICAgICBMUElOVEVSTkFMUE9TIGxwUG9zID0gV0lOUE9TX0luaXRJbnRlcm5hbFBvcyggd25kUHRyLCBzaXplLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmd25kUHRyLT5yZWN0V2luZG93ICk7CiAKLSAgICBkcHJpbnRmX3dpbihzdGRkZWIsIk1pbk1heGltaXplOiAweCUwNHggJXVcbiIsIHduZFB0ci0+aHduZFNlbGYsIGNtZCApOworICAgIGRwcmludGZfaW5mbyh3aW4sIk1pbk1heGltaXplOiAweCUwNHggJXVcbiIsIHduZFB0ci0+aHduZFNlbGYsIGNtZCApOwogCiAgICAgaWYgKGxwUG9zICYmICFIT09LX0NhbGxIb29rczE2KFdIX0NCVCwgSENCVF9NSU5NQVgsIHduZFB0ci0+aHduZFNlbGYsIGNtZCkpCiAgICAgewpAQCAtOTk3LDcgKzk5NSw3IEBACiAKICAgICBpZiAoIXduZFB0cikgcmV0dXJuIEZBTFNFOwogCi0gICAgZHByaW50Zl93aW4oc3RkZGViLCJTaG93V2luZG93OiBod25kPSUwNHgsIGNtZD0lZFxuIiwgaHduZCwgY21kKTsKKyAgICBkcHJpbnRmX2luZm8od2luLCJTaG93V2luZG93OiBod25kPSUwNHgsIGNtZD0lZFxuIiwgaHduZCwgY21kKTsKIAogICAgIHdhc1Zpc2libGUgPSAod25kUHRyLT5kd1N0eWxlICYgV1NfVklTSUJMRSkgIT0gMDsKIApAQCAtMTM3NSw3ICsxMzczLDcgQEAKICAgICBpZiggKHduZFRlbXAgPSBXSU5fRmluZFduZFB0cihod25kQWN0aXZlKSkgKQogCXdJY29uaXplZCA9IEhJV09SRCh3bmRUZW1wLT5kd1N0eWxlICYgV1NfTUlOSU1JWkUpOwogICAgIGVsc2UKLQlkcHJpbnRmX3dpbihzdGRkZWIsIldJTlBPU19BY3RpdmF0ZVdpbmRvdzogbm8gY3VycmVudCBhY3RpdmUgd2luZG93LlxuIik7CisJZHByaW50Zl9pbmZvKHdpbiwiV0lOUE9TX0FjdGl2YXRlV2luZG93OiBubyBjdXJyZW50IGFjdGl2ZSB3aW5kb3cuXG4iKTsKIAogICAgIC8qIGNhbGwgQ0JUIGhvb2sgY2hhaW4gKi8KICAgICBpZiAoKGNidFN0cnVjdCA9IFNFR1BUUl9ORVcoQ0JUQUNUSVZBVEVTVFJVQ1QxNikpKQpAQCAtMTYxNyw3ICsxNjE1LDcgQEAKICAgICB9CiAgICAgcmVzdWx0ID0gU2VuZE1lc3NhZ2UzMkEoIGh3bmQsIFdNX05DQ0FMQ1NJWkUsIGNhbGNWYWxpZFJlY3QsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChMUEFSQU0pJnBhcmFtcyApOwotICAgIGRwcmludGZfd2luKCBzdGRkZWIsICJXSU5QT1NfU2VuZE5DQ2FsY1NpemU6ICVkLCVkLSVkLCVkXG4iLAorICAgIGRwcmludGZfaW5mbyh3aW4sICJXSU5QT1NfU2VuZE5DQ2FsY1NpemU6ICVkLCVkLSVkLCVkXG4iLAogICAgICAgICAgICAgICAgICBwYXJhbXMucmdyY1swXS5sZWZ0LCBwYXJhbXMucmdyY1swXS50b3AsCiAgICAgICAgICAgICAgICAgIHBhcmFtcy5yZ3JjWzBdLnJpZ2h0LCBwYXJhbXMucmdyY1swXS5ib3R0b20gKTsKICAgICAqbmV3Q2xpZW50UmVjdCA9IHBhcmFtcy5yZ3JjWzBdOwpAQCAtMTgxNyw3ICsxODE1LDcgQEAKICBIUkdOMzIgZGlydHlSZ24gPSBDcmVhdGVSZWN0UmduMzIoMCwwLDAsMCk7CiAgaW50ICBvdGhlciwgbXk7CiAKLSBkcHJpbnRmX3dpbihzdGRkZWIsImNsZWFuaW5nIHVwLi4ubmV3IHduZD0oJWkgJWktJWkgJWkpIG9sZCB3bmQ9KCVpICVpLSVpICVpKVxuXAorIGRwcmludGZfaW5mbyh3aW4sImNsZWFuaW5nIHVwLi4ubmV3IHduZD0oJWkgJWktJWkgJWkpIG9sZCB3bmQ9KCVpICVpLSVpICVpKVxuXAogXHRcdG5ldyBjbGllbnQ9KCVpICVpLSVpICVpKSBvbGQgY2xpZW50PSglaSAlaS0laSAlaSlcbiIsCiAgICAgICAgICAgICAgV25kLT5yZWN0V2luZG93LmxlZnQsIFduZC0+cmVjdFdpbmRvdy50b3AsCiAgICAgICAgICAgICAgV25kLT5yZWN0V2luZG93LnJpZ2h0LCBXbmQtPnJlY3RXaW5kb3cuYm90dG9tLApAQCAtMjA1Nyw3ICsyMDU1LDcgQEAKICAgICBpbnQgCXJlc3VsdCA9IDA7CiAgICAgVUlOVDMyIAl1RmxhZ3MgPSAwOwogCi0gICAgZHByaW50Zl93aW4oc3RkZGViLCJTZXRXaW5kb3dQb3M6IGh3bmQgJTA0eCwgKCVpLCVpKS0oJWksJWkpIGZsYWdzICUwOHhcbiIsIAorICAgIGRwcmludGZfaW5mbyh3aW4sIlNldFdpbmRvd1BvczogaHduZCAlMDR4LCAoJWksJWkpLSglaSwlaSkgZmxhZ3MgJTA4eFxuIiwgCiAJCQkJCQkgaHduZCwgeCwgeSwgeCtjeCwgeStjeSwgZmxhZ3MpOyAgCiAgICAgICAvKiBDaGVjayB3aW5kb3cgaGFuZGxlICovCiAKQEAgLTIxOTIsMTQgKzIxOTAsMTYgQEAKIAogICAgICAgICAgLyogRklYTUU6IFdWUl9BTElHTnh4eCAqLwogCi0gICAgICAgICBpZiggbmV3Q2xpZW50UmVjdC5sZWZ0ICE9IHduZFB0ci0+cmVjdENsaWVudC5sZWZ0IHx8Ci0gICAgICAgICAgICAgbmV3Q2xpZW50UmVjdC50b3AgIT0gd25kUHRyLT5yZWN0Q2xpZW50LnRvcCApCisgICAgICAgICBpZiggISh3aW5wb3MuZmxhZ3MgJiBTV1BfTk9NT1ZFKSAmJgorCSAgICAgKG5ld0NsaWVudFJlY3QubGVmdCAhPSB3bmRQdHItPnJlY3RDbGllbnQubGVmdCB8fAorCSAgICAgIG5ld0NsaWVudFJlY3QudG9wICE9IHduZFB0ci0+cmVjdENsaWVudC50b3ApICkKICAgICAgICAgICAgICB3aW5wb3MuZmxhZ3MgJj0gflNXUF9OT0NMSUVOVE1PVkU7CiAKLSAgICAgICAgIGlmKCAobmV3Q2xpZW50UmVjdC5yaWdodCAtIG5ld0NsaWVudFJlY3QubGVmdCAhPQotICAgICAgICAgICAgICB3bmRQdHItPnJlY3RDbGllbnQucmlnaHQgLSB3bmRQdHItPnJlY3RDbGllbnQubGVmdCkgfHwKLQkgICAgIChuZXdDbGllbnRSZWN0LmJvdHRvbSAtIG5ld0NsaWVudFJlY3QudG9wICE9Ci0JICAgICAgd25kUHRyLT5yZWN0Q2xpZW50LmJvdHRvbSAtIHduZFB0ci0+cmVjdENsaWVudC50b3ApICkKKyAgICAgICAgIGlmKCAhKHdpbnBvcy5mbGFncyAmIFNXUF9OT1NJWkUpICYmCisJICAgICAoKG5ld0NsaWVudFJlY3QucmlnaHQgLSBuZXdDbGllbnRSZWN0LmxlZnQgIT0KKwkgICAgICAgd25kUHRyLT5yZWN0Q2xpZW50LnJpZ2h0IC0gd25kUHRyLT5yZWN0Q2xpZW50LmxlZnQpIHx8CisJICAgICAgKG5ld0NsaWVudFJlY3QuYm90dG9tIC0gbmV3Q2xpZW50UmVjdC50b3AgIT0KKwkgICAgICAgd25kUHRyLT5yZWN0Q2xpZW50LmJvdHRvbSAtIHduZFB0ci0+cmVjdENsaWVudC50b3ApKSApCiAJICAgICB3aW5wb3MuZmxhZ3MgJj0gflNXUF9OT0NMSUVOVFNJWkU7CiAgICAgfQogICAgIGVsc2UKQEAgLTIzOTgsNyArMjM5OCw3IEBACiAKICAgICAgIC8qIEFuZCBsYXN0LCBzZW5kIHRoZSBXTV9XSU5ET1dQT1NDSEFOR0VEIG1lc3NhZ2UgKi8KIAotICAgIGRwcmludGZfd2luKHN0ZGRlYiwiXHRzdGF0dXMgZmxhZ3MgPSAlMDR4XG4iLCB3aW5wb3MuZmxhZ3MgJiBTV1BfQUdHX1NUQVRVU0ZMQUdTKTsKKyAgICBkcHJpbnRmX2luZm8od2luLCJcdHN0YXR1cyBmbGFncyA9ICUwNHhcbiIsIHdpbnBvcy5mbGFncyAmIFNXUF9BR0dfU1RBVFVTRkxBR1MpOwogCiAgICAgaWYgKCAoKHdpbnBvcy5mbGFncyAmIFNXUF9BR0dfU1RBVFVTRkxBR1MpICE9IFNXUF9BR0dfTk9QT1NDSEFOR0UpICYmIAogCSAhKHdpbnBvcy5mbGFncyAmIFNXUF9OT1NFTkRDSEFOR0lORykpCmRpZmYgLS1naXQgYS93aW5kb3dzL3dpbnByb2MuYyBiL3dpbmRvd3Mvd2lucHJvYy5jCmluZGV4IDE0MDJiNmMuLjE0NzRhNzcgMTAwNjQ0Ci0tLSBhL3dpbmRvd3Mvd2lucHJvYy5jCisrKyBiL3dpbmRvd3Mvd2lucHJvYy5jCkBAIC0xMyw3ICsxMyw2IEBACiAjaW5jbHVkZSAic3RydWN0MzIuaCIKICNpbmNsdWRlICJ3aW4uaCIKICNpbmNsdWRlICJ3aW5wcm9jLmgiCi0jaW5jbHVkZSAic3RkZGVidWcuaCIKICNpbmNsdWRlICJkZWJ1Zy5oIgogCiAvKiBXaW5kb3cgcHJvY2VkdXJlIDE2LXRvLTMyLWJpdCB0aHVuaywKQEAgLTExNSw3ICsxMTQsNyBAQAogc3RhdGljIExSRVNVTFQgV0lOUFJPQ19DYWxsV25kUHJvYzMyKCBXTkRQUk9DMzIgcHJvYywgSFdORDMyIGh3bmQsIFVJTlQzMiBtc2csCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFdQQVJBTTMyIHdQYXJhbSwgTFBBUkFNIGxQYXJhbSApCiB7Ci0gICAgZHByaW50Zl9yZWxheSggc3RkZGViLCAiQ2FsbFRvMzIod25kcHJvYz0lcCxod25kPSUwOHgsbXNnPSUwOHgsd3A9JTA4eCxscD0lMDhseClcbiIsCisgICAgZHByaW50Zl9pbmZvKHJlbGF5LCAiQ2FsbFRvMzIod25kcHJvYz0lcCxod25kPSUwOHgsbXNnPSUwOHgsd3A9JTA4eCxscD0lMDhseClcbiIsCiAgICAgICAgICAgICAgICAgICAgcHJvYywgaHduZCwgbXNnLCB3UGFyYW0sIGxQYXJhbSApOwogICAgIHJldHVybiBwcm9jKCBod25kLCBtc2csIHdQYXJhbSwgbFBhcmFtICk7CiB9CkBAIC0yMjUsNyArMjI0LDcgQEAKICAgICAgICAgcHJvYy0+dXNlciAgPSB1c2VyOwogICAgIH0KICAgICBwcm9jLT5uZXh0ICA9IE5VTEw7Ci0gICAgZHByaW50Zl93aW4oIHN0ZGRlYiwgIldJTlBST0NfQWxsb2NXaW5Qcm9jKCUwOHgsJWQpOiByZXR1cm5pbmcgJTA4eFxuIiwKKyAgICBkcHJpbnRmX2luZm8od2luLCAiV0lOUFJPQ19BbGxvY1dpblByb2MoJTA4eCwlZCk6IHJldHVybmluZyAlMDh4XG4iLAogICAgICAgICAgICAgICAgICAoVUlOVDMyKWZ1bmMsIHR5cGUsIChVSU5UMzIpcHJvYyApOwogICAgIHJldHVybiBwcm9jOwogfQpAQCAtMzQwLDcgKzMzOSw3IEBACiAKICAgICAvKiBBZGQgdGhlIHdpbiBwcm9jIGF0IHRoZSBoZWFkIG9mIHRoZSBsaXN0ICovCiAKLSAgICBkcHJpbnRmX3dpbiggc3RkZGViLCAiV0lOUFJPQ19TZXRQcm9jKCUwOHgsJTA4eCwlZCk6IHJlcz0lMDh4XG4iLAorICAgIGRwcmludGZfaW5mbyh3aW4sICJXSU5QUk9DX1NldFByb2MoJTA4eCwlMDh4LCVkKTogcmVzPSUwOHhcbiIsCiAgICAgICAgICAgICAgICAgIChVSU5UMzIpKnBGaXJzdCwgKFVJTlQzMilmdW5jLCB0eXBlLCAoVUlOVDMyKXByb2MgKTsKICAgICBwcm9jLT5uZXh0ICA9ICooV0lORE9XUFJPQyAqKilwRmlyc3Q7CiAgICAgKihXSU5ET1dQUk9DICoqKXBGaXJzdCA9IHByb2M7CkBAIC0zNTksNyArMzU4LDcgQEAKICAgICB7CiAgICAgICAgIFdJTkRPV1BST0MgKm5leHQgPSAoKFdJTkRPV1BST0MgKilwcm9jKS0+bmV4dDsKICAgICAgICAgaWYgKCgoV0lORE9XUFJPQyAqKXByb2MpLT51c2VyICE9IHVzZXIpIGJyZWFrOwotICAgICAgICBkcHJpbnRmX3dpbiggc3RkZGViLCAiV0lOUFJPQ19GcmVlUHJvYzogZnJlZWluZyAlMDh4XG4iLCAoVUlOVDMyKXByb2MpOworICAgICAgICBkcHJpbnRmX2luZm8od2luLCAiV0lOUFJPQ19GcmVlUHJvYzogZnJlZWluZyAlMDh4XG4iLCAoVUlOVDMyKXByb2MpOwogICAgICAgICBIZWFwRnJlZSggV2luUHJvY0hlYXAsIDAsIHByb2MgKTsKICAgICAgICAgcHJvYyA9IG5leHQ7CiAgICAgfQo=