ZGlmZiAtLWdpdCBhL0FOTk9VTkNFIGIvQU5OT1VOQ0UKaW5kZXggZTIyZDE1My4uMGUxNDBkNSAxMDA2NDQKLS0tIGEvQU5OT1VOQ0UKKysrIGIvQU5OT1VOQ0UKQEAgLTEsMTUgKzEsMTIgQEAKLVRoaXMgaXMgcmVsZWFzZSA5NzA5MTQgb2YgV2luZSwgdGhlIE1TIFdpbmRvd3MgZW11bGF0b3IuICBUaGlzIGlzIHN0aWxsIGEKK1RoaXMgaXMgcmVsZWFzZSA5NzA5Mjggb2YgV2luZSwgdGhlIE1TIFdpbmRvd3MgZW11bGF0b3IuICBUaGlzIGlzIHN0aWxsIGEKIGRldmVsb3BlcidzIG9ubHkgcmVsZWFzZS4gIFRoZXJlIGFyZSBtYW55IGJ1Z3MgYW5kIG1hbnkgdW5pbXBsZW1lbnRlZCBBUEkKIGZlYXR1cmVzLiAgTW9zdCBhcHBsaWNhdGlvbnMgc3RpbGwgZG8gbm90IHdvcmsgY29ycmVjdGx5LgogCiBQYXRjaGVzIHNob3VsZCBiZSBzdWJtaXR0ZWQgdG8gImp1bGxpYXJkQGxyYy5lcGZsLmNoIi4gIFBsZWFzZSBkb24ndAogZm9yZ2V0IHRvIGluY2x1ZGUgYSBDaGFuZ2VMb2cgZW50cnkuCiAKLVdIQVQnUyBORVcgd2l0aCBXaW5lLTk3MDkxNDogKHNlZSBDaGFuZ2VMb2cgZm9yIGRldGFpbHMpCi0JLSBCZXR0ZXIgcmVzb3VyY2UgaGFuZGxpbmcuCi0JLSBOZXcgUHJvZ3Jlc3MgY29udHJvbC4KLQktIEltcHJvdmVkIFBFIG1vZHVsZSBzdXBwb3J0LgotCS0gTWFueSByZWxheSBjb2RlIGNoYW5nZXMuCitXSEFUJ1MgTkVXIHdpdGggV2luZS05NzA5Mjg6IChzZWUgQ2hhbmdlTG9nIGZvciBkZXRhaWxzKQorCS0gTW9yZSByZWxheSBjb2RlIGNoYW5nZXMuCiAJLSBMb3RzIG9mIGJ1ZyBmaXhlcy4KIAogU2VlIHRoZSBSRUFETUUgZmlsZSBpbiB0aGUgZGlzdHJpYnV0aW9uIGZvciBpbnN0YWxsYXRpb24gaW5zdHJ1Y3Rpb25zLgpAQCAtMTgsMTAgKzE1LDEwIEBACiB0aGUgcmVsZWFzZSBpcyBhdmFpbGFibGUgYXQgdGhlIGZ0cCBzaXRlcy4gIFRoZSBzb3VyY2VzIHdpbGwgYmUgYXZhaWxhYmxlCiBmcm9tIHRoZSBmb2xsb3dpbmcgbG9jYXRpb25zOgogCi0gIGZ0cDovL3N1bnNpdGUudW5jLmVkdS9wdWIvTGludXgvQUxQSEEvd2luZS9kZXZlbG9wbWVudC9XaW5lLTk3MDkxNC50YXIuZ3oKLSAgZnRwOi8vdHN4LTExLm1pdC5lZHUvcHViL2xpbnV4L0FMUEhBL1dpbmUvZGV2ZWxvcG1lbnQvV2luZS05NzA5MTQudGFyLmd6Ci0gIGZ0cDovL2Z0cC5pbmZvbWFnaWMuY29tL3B1Yi9taXJyb3JzL2xpbnV4L3dpbmUvZGV2ZWxvcG1lbnQvV2luZS05NzA5MTQudGFyLmd6Ci0gIGZ0cDovL2Z0cC5wcm9nc29jLnV0cy5lZHUuYXUvcHViL1dpbmUvZGV2ZWxvcG1lbnQvV2luZS05NzA5MTQudGFyLmd6CisgIGZ0cDovL3N1bnNpdGUudW5jLmVkdS9wdWIvTGludXgvQUxQSEEvd2luZS9kZXZlbG9wbWVudC9XaW5lLTk3MDkyOC50YXIuZ3oKKyAgZnRwOi8vdHN4LTExLm1pdC5lZHUvcHViL2xpbnV4L0FMUEhBL1dpbmUvZGV2ZWxvcG1lbnQvV2luZS05NzA5MjgudGFyLmd6CisgIGZ0cDovL2Z0cC5pbmZvbWFnaWMuY29tL3B1Yi9taXJyb3JzL2xpbnV4L3dpbmUvZGV2ZWxvcG1lbnQvV2luZS05NzA5MjgudGFyLmd6CisgIGZ0cDovL2Z0cC5wcm9nc29jLnV0cy5lZHUuYXUvcHViL1dpbmUvZGV2ZWxvcG1lbnQvV2luZS05NzA5MjgudGFyLmd6CiAKIEl0IHNob3VsZCBhbHNvIGJlIGF2YWlsYWJsZSBmcm9tIGFueSBzaXRlIHRoYXQgbWlycm9ycyB0c3gtMTEgb3Igc3Vuc2l0ZS4KIApkaWZmIC0tZ2l0IGEvQlVHUyBiL0JVR1MKaW5kZXggMTNhNWZmZC4uMGIzZjJjNiAxMDA2NDQKLS0tIGEvQlVHUworKysgYi9CVUdTCkBAIC05LDkgKzksNiBAQAogCiBHZW5lcmFsOgogCi0gKiBMb2FkQWNjZWxlcmF0b3JzKCkgbXVzdCBub3QgY3JlYXRlIGFueSBvYmplY3RzIGFwYXJ0Ci0gICBmcm9tIGxvYWRpbmcgdGhlIHJlc291cmNlLgotCiAgKiBDYXRjaC9UaHJvdygpIGRvIG5vdCBzYXZlIFNJIGFuZCBESSByZWdpc3RlcnMgKHF1aXRlIGZhdGFsKS4KIAogICogV2UgbmVlZCB0byBkbyBJbnNlcnRNZW51SXRlbTMyW0FXXSBhbmQgdGhlbiBjb2RlIG1vc3Qgb2YgdGhlIG90aGVyCmRpZmYgLS1naXQgYS9DaGFuZ2VMb2cgYi9DaGFuZ2VMb2cKaW5kZXggYjllNzc1ZS4uNWM3ODU1ZSAxMDA2NDQKLS0tIGEvQ2hhbmdlTG9nCisrKyBiL0NoYW5nZUxvZwpAQCAtMSw0ICsxLDcwIEBACiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCitTYXQgU2VwIDI3IDEyOjM2OjU2IDE5OTcgIEFsZXhhbmRyZSBKdWxsaWFyZCAgPGp1bGxpYXJkQGxyYy5lcGZsLmNoPgorCisJKiBbaWYxNjMyL3JlbGF5LmNdCisJTWFkZSBDYXRjaCBhbmQgVGhyb3cgYWxzbyBzYXZlICVzaSBhbmQgJWRpICh1bnRlc3RlZCkuCisKKwkqIFttZW1vcnkvc2VsZWN0b3IuY10KKwlBZGRlZCBjaGVjayBmb3IgJWZzIGFuZCAlZ3MgaW4gU0VMRUNUT1JfRnJlZUJsb2NrLgorCisJKiBbcmMvd2luZXJjLmNdCisJR2VuZXJhdGVkIGZpbGVzIG5vIGxvbmdlciBkZXBlbmQgb24gV2luZSBpbmNsdWRlcy4KKwlNYWRlIC5oIGdlbmVyYXRpb24gb3B0aW9uYWwuCisKKwkqIFt0b29scy9idWlsZC5jXSBbbG9hZGVyL3Rhc2suY10KKwlBZGRlZCBDQUxMMzJfSW5pdCBmdW5jdGlvbi4KKwlBZGRlZCBwb3NzaWJpbGl0eSB0byBwYXNzIGFyZ3VtZW50cyB3aGVuIHVzaW5nIENBTExUTzE2X3JlZ3NfLgorCTMyLWJpdCBzdGFjayBwb2ludGVyIGlzIG5vdyBzYXZlZCBvbiB0aGUgMTYtYml0IHN0YWNrLCBpbnN0ZWFkIG9mCisJdXNpbmcgSUYxNjMyX1NhdmVkMzJfZXNwLgorCVJlbW92ZWQgQ2FsbFRvMzIgY2FsbGJhY2tzLgorCisJKiBbdG9vbHMvbWFrZWRlcC5jXSBbKi9NYWtlZmlsZS5pbl0KKwlBZGRlZCBzdXBwb3J0IGZvciBkaXJlY3RseSBnZW5lcmF0aW5nIGRlcGVuZGVuY2llcyBmb3IgLnksIC5sIGFuZAorCS5yYyBmaWxlcy4gTW9kaWZpZWQgdGhlIG1ha2VmaWxlcyB0byB1c2UgdGhpcyBmZWF0dXJlLgorCisJKiBbd2luZG93cy93aW5wcm9jLmNdIFtpZjE2MzIvdGh1bmsuY10KKwlVc2UgQ0FMTFRPMTZfcmVncyB0byBjYWxsIHdpbmRvdyBwcm9jZWR1cmVzLgorCitUaHUgU2VwIDI1IDEyOjE4OjU3IDE5OTcgIEtyaXN0aWFuIE5pZWxzZW4gPGtyaXN0aWFuLm5pZWxzZW5Acmlzb2UuZGs+CisKKwkqIFtpZjE2MzIva2VybmVsLnNwZWNdCisJQ2hhbmdlZCBlbnRyeSBmb3IgU3dpdGNoU3RhY2tCYWNrIHRvIHJlbW92ZSBhcmd1bWVudHMgZnJvbSBzdGFjaworCXVwb24gcmV0dXJuIChhcmd1bWVudHMgbGVmdCBvdmVyIGZyb20gcHJldmlvdXMgU3dpdGNoU3RhY2tUbygpKS4KKwlCb3JsYW5kIEMrKyA0LjAgbm93IGNvbXBpbGVzICJIZWxsbyBXb3JsZCIgKGJ1dCBjcmFzaGVzIGFmdGVyCisJb3V0cHV0dGluZyB0aGUgLmV4ZSkuCisKK1dlZCBTZXAgMjQgMTM6NTQ6NDQgMTk5NyAgTWFyY3VzIE1laXNzbmVyIDxtc21laXNzbkBjaXAuaW5mb3JtYXRpay51bmktZXJsYW5nZW4uZGU+CisKKwkqIFtmaWxlcy9kaXJlY3RvcnkuY10KKwlTZWFyY2hQYXRoIG1pZ2h0IGdldCBOVUxMIGJ1ZmZlciAoZW1wdHkgTFJVIGxpc3QgaW4gd29yZHBhZCkuCisKKwkqIFttZW1vcnkvc2VsZWN0b3IuY10KKwlBZGRlZCBTVW5NYXBMUyouCisKKwkqIFtsb2FkZXIvcGVfaW1hZ2UuY10KKwlCZSBhYmxlIHRvIHJ1biBleGVjdXRlYWJsZXMgZnJvbSBub24gbW1hcCgpYmxlIGZpbGVzeXN0ZW1zLgorCVBFX0xvYWRMaWJyYXJ5IGFkZHMgbGlicmFyeXMgbG9hZGVkIGJ5IGFub3RoZXIgcHJvY2VzcyB0bworCWl0cyBvd24gbW9kcmVmIGxpc3QgdG9vLgorCisJKiBbd2luZG93cy9rZXlib2FyZC5jXVtpbmNsdWRlL2FjY2VsLmhdW2xvYWRlci9yZXNvdXJjZS5jXQorCUZpeGVkIGFjY2VsZXJhdG9yIGxlYWthZ2UsIHVzZSBTREsgZGVmaW5lcy9uYW1lcy4KKworCSogW2dyYXBoaWNzL2Vudi5jXVttaXNjL21haW4uY10KKwlTZXQvR2V0RW52aXJvbmVtbnQgaGF2ZSBub3RoaW5nIHRvIGRvIHdpdGggZW52aXJvbm1lbnQgdmFycywKKwlidXQgd2l0aCBQcmludGVyIEVudmlyb25tZW50LgorCisJKiBbZ3JhcGhpY3MvZXNjYXBlLmNdCisJRXNjYXBlMzI6IG1hcCBhcmdzIGJhY2sgdG8gc2VnbWVudGVkIHBvaW50ZXJzLgorCisJKiBbd2luZG93cy93aW4uY10KKwlXU19QT1BVUHxXU19DSElMRCB3aW5kb3dzIGRvbid0IG5lZWQgYSBwYXJlbnQgd2luZG93IChTREspLgorCitUdWUgU2VwIDE2IDE0OjQwOjE2IDE5OTcgIFJvYmVydCBXaWxoZWxtICA8cm9iZXJ0QHBoeXNpb2wubWVkLnR1LW11ZW5jaGVuLmRlPgorCisJKiBbaWYxNjMyL2NydGRsbC5zcGVjXSBbbWlzYy9jcnRkbGwuY10KKwlBZGRlZCBzaWduYWwoKS4KKworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogVGh1IFNlcCAxMSAxODoyNDo1NiAxOTk3ICBQaGlsaXBwZSBEZSBNdXl0ZXIgIDxwaGRtQGluZm8udWNsLmFjLmJlPgogCiAJKiBbb2JqZWN0cy9kYy5jXQpkaWZmIC0tZ2l0IGEvTWFrZS5ydWxlcy5pbiBiL01ha2UucnVsZXMuaW4KaW5kZXggZjYzNzMwNy4uZDMxZDdkZiAxMDA2NDQKLS0tIGEvTWFrZS5ydWxlcy5pbgorKysgYi9NYWtlLnJ1bGVzLmluCkBAIC02LDkgKzYsMTAgQEAKICMgU1JDRElSICAgICAgIDogc291cmNlIGRpcmVjdG9yeSBmb3IgdGhpcyBtb2R1bGUKICMgTU9EVUxFICAgICAgIDogbmFtZSBvZiB0aGUgbW9kdWxlIGJlaW5nIGJ1aWx0CiAjIENfU1JDUyAgICAgICA6IEMgc291cmNlcyBmb3IgdGhlIG1vZHVsZSAob3B0aW9uYWwpCi0jIEdFTl9DX1NSQ1MgICA6IGdlbmVyYXRlZCBDIHNvdXJjZXMgKG9wdGlvbmFsKQogIyBBU01fU1JDUyAgICAgOiBhc3NlbWJseSBzb3VyY2VzIChvcHRpb25hbCkKICMgR0VOX0FTTV9TUkNTIDogZ2VuZXJhdGVkIGFzc2VtYmx5IHNvdXJjZXMgKG9wdGlvbmFsKQorIyBSQ19TUkNTICAgICAgOiByZXNvdXJjZSBzb3VyY2UgZmlsZXMgKG9wdGlvbmFsKQorIyBFWFRSQV9TUkNTICAgOiBleHRyYSBzb3VyY2UgZmlsZXMgZm9yIG1ha2UgZGVwZW5kIChvcHRpb25hbCkKICMgRVhUUkFfT0JKUyAgIDogZXh0cmEgb2JqZWN0IGZpbGVzIChvcHRpb25hbCkKIAogIyBGaXJzdCBzb21lIHVzZWZ1bCBkZWZpbml0aW9ucwpAQCAtNTYsOCArNTcsOCBAQAogbWFuZXh0ICAgICAgICAgID0gLjEKIGluY2x1ZGVkaXIgICAgICA9IEBpbmNsdWRlZGlyQC93aW5lCiAKLU9CSlMgPSAkKEdFTl9DX1NSQ1M6LmM9Lm8pICQoQ19TUkNTOi5jPS5vKSBcCi0gICAgICAgJChHRU5fQVNNX1NSQ1M6LnM9Lm8pICQoQVNNX1NSQ1M6LlM9Lm8pICQoRVhUUkFfT0JKUykKK09CSlMgPSAkKENfU1JDUzouYz0ubykgJChHRU5fQVNNX1NSQ1M6LnM9Lm8pICQoQVNNX1NSQ1M6LlM9Lm8pIFwKKyAgICAgICAkKFJDX1NSQ1M6LnJjPS5vKSAkKEVYVFJBX09CSlMpCiAKICMgSW1wbGljaXQgcnVsZXMKIApAQCAtMTEwLDExICsxMTEsMTEgQEAKIAogIyBNaXNjLiBydWxlcwogCi1kZXBlbmQ6OiAkKE1BS0VERVApICQoQ19TUkNTKSAkKEdFTl9DX1NSQ1MpCi0JJChNQUtFREVQKSAkKERJVklOQ0wpIC1DLiAkKEdFTl9DX1NSQ1MpIC1DJChTUkNESVIpICQoQ19TUkNTKQorZGVwZW5kOjogJChNQUtFREVQKSAkKENfU1JDUykgJChSQ19TUkNTKSAkKEVYVFJBX1NSQ1MpCisJJChNQUtFREVQKSAkKERJVklOQ0wpIC1DJChTUkNESVIpICQoQ19TUkNTKSAkKFJDX1NSQ1MpICQoRVhUUkFfU1JDUykKIAogY2xlYW46OgotCSQoUk0pICoubyBcIypcIyAqfiAqLmJhayAqLm9yaWcgKi5yZWogKi5mbGMgd2luZXJjdG1wLmMgY29yZSAkKEdFTl9DX1NSQ1MpICQoR0VOX0NfU1JDUzouYz0uaCkgJChHRU5fQVNNX1NSQ1MpICQoUFJPR1JBTVMpCisJJChSTSkgKi5vIFwjKlwjICp+ICouYmFrICoub3JpZyAqLnJlaiAqLmZsYyB3aW5lcmN0bXAuYyB5LnRhYi5jIHkudGFiLmggbGV4Lnl5LmMgY29yZSAkKEdFTl9BU01fU1JDUykgJChSQ19TUkNTOi5yYz0uYykgJChSQ19TUkNTOi5yYz0uaCkgJChQUk9HUkFNUykKIAogZHVtbXk6CiAKZGlmZiAtLWdpdCBhL2NvbnRyb2xzL2NvbWJvLmMgYi9jb250cm9scy9jb21iby5jCmluZGV4IDNjMzU5MGYuLjI2OTAzZmEgMTAwNjQ0Ci0tLSBhL2NvbnRyb2xzL2NvbWJvLmMKKysrIGIvY29udHJvbHMvY29tYm8uYwpAQCAtOTAyLDYgKzkwMiw3IEBACiAJICAgY2FzZSBMQk5fS0lMTEZPQ1VTOgogCQkvKiBub3RoaW5nIHRvIGRvIGhlcmUgc2luY2UgQ29tYm9MQm94IGFsd2F5cyByZXNldHMgdGhlIGZvY3VzIHRvIGl0cwogCQkgKiBjb21iby9lZGl0IGNvdW50ZXJwYXJ0ICovCisJCSBicmVhazsKICAgICAgICB9CiAgICB9CiAgICByZXR1cm4gMDsKZGlmZiAtLWdpdCBhL2NvbnRyb2xzL2Rlc2t0b3AuYyBiL2NvbnRyb2xzL2Rlc2t0b3AuYwppbmRleCBiMTY1MWYyLi5mZDI5NjNjIDEwMDY0NAotLS0gYS9jb250cm9scy9kZXNrdG9wLmMKKysrIGIvY29udHJvbHMvZGVza3RvcC5jCkBAIC0zMiwxNyArMzIsMTggQEAKICAgICBpZiAoKGZpbGUgPSBfbG9wZW4zMiggZmlsZW5hbWUsIE9GX1JFQUQgKSkgPT0gSEZJTEVfRVJST1IzMikKICAgICB7CiAgICAgICAgIFVJTlQzMiBsZW4gPSBHZXRXaW5kb3dzRGlyZWN0b3J5MzJBKCBOVUxMLCAwICk7Ci0gICAgICAgIGlmICghKGJ1ZmZlciA9IEhlYXBBbGxvYyggU3lzdGVtSGVhcCwgMCwgbGVuICsgc3RybGVuKGZpbGVuYW1lKSArIDIgKSkpCisgICAgICAgIGlmICghKGJ1ZmZlciA9IEhlYXBBbGxvYyggR2V0UHJvY2Vzc0hlYXAoKSwgMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZW4gKyBzdHJsZW4oZmlsZW5hbWUpICsgMiApKSkKICAgICAgICAgICAgIHJldHVybiAwOwogICAgICAgICBHZXRXaW5kb3dzRGlyZWN0b3J5MzJBKCBidWZmZXIsIGxlbiArIDEgKTsKICAgICAgICAgc3RyY2F0KCBidWZmZXIsICJcXCIgKTsKICAgICAgICAgc3RyY2F0KCBidWZmZXIsIGZpbGVuYW1lICk7CiAgICAgICAgIGZpbGUgPSBfbG9wZW4zMiggYnVmZmVyLCBPRl9SRUFEICk7Ci0gICAgICAgIEhlYXBGcmVlKCBTeXN0ZW1IZWFwLCAwLCBidWZmZXIgKTsKKyAgICAgICAgSGVhcEZyZWUoIEdldFByb2Nlc3NIZWFwKCksIDAsIGJ1ZmZlciApOwogICAgIH0KICAgICBpZiAoZmlsZSA9PSBIRklMRV9FUlJPUjMyKSByZXR1cm4gMDsKICAgICBzaXplID0gX2xsc2VlazMyKCBmaWxlLCAwLCAyICk7Ci0gICAgaWYgKCEoYnVmZmVyID0gSGVhcEFsbG9jKCBTeXN0ZW1IZWFwLCAwLCBzaXplICkpKQorICAgIGlmICghKGJ1ZmZlciA9IEhlYXBBbGxvYyggR2V0UHJvY2Vzc0hlYXAoKSwgMCwgc2l6ZSApKSkKICAgICB7CiAJX2xjbG9zZTMyKCBmaWxlICk7CiAJcmV0dXJuIDA7CkBAIC01NiwxMyArNTcsMTMgQEAKICAgICAgIC8qIENoZWNrIGhlYWRlciBjb250ZW50ICovCiAgICAgaWYgKChmaWxlSGVhZGVyLT5iZlR5cGUgIT0gMHg0ZDQyKSB8fCAoc2l6ZSA8IGZpbGVIZWFkZXItPmJmU2l6ZSkpCiAgICAgewotCUhlYXBGcmVlKCBTeXN0ZW1IZWFwLCAwLCBidWZmZXIgKTsKKwlIZWFwRnJlZSggR2V0UHJvY2Vzc0hlYXAoKSwgMCwgYnVmZmVyICk7CiAJcmV0dXJuIDA7CiAgICAgfQogICAgIGhiaXRtYXAgPSBDcmVhdGVESUJpdG1hcDMyKCBoZGMsICZiaXRtYXBJbmZvLT5ibWlIZWFkZXIsIENCTV9JTklULAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBidWZmZXIgKyBmaWxlSGVhZGVyLT5iZk9mZkJpdHMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJpdG1hcEluZm8sIERJQl9SR0JfQ09MT1JTICk7Ci0gICAgSGVhcEZyZWUoIFN5c3RlbUhlYXAsIDAsIGJ1ZmZlciApOworICAgIEhlYXBGcmVlKCBHZXRQcm9jZXNzSGVhcCgpLCAwLCBidWZmZXIgKTsKICAgICByZXR1cm4gaGJpdG1hcDsKIH0KIApkaWZmIC0tZ2l0IGEvY29udHJvbHMvbGlzdGJveC5jIGIvY29udHJvbHMvbGlzdGJveC5jCmluZGV4IDEzMDhlODEuLjE2NWY0ODMgMTAwNjQ0Ci0tLSBhL2NvbnRyb2xzL2xpc3Rib3guYworKysgYi9jb250cm9scy9saXN0Ym94LmMKQEAgLTQ4NCwxNCArNDg0LDE3IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgInJlY3Q9JWQsJWQtJWQsJWRcbiIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgd25kLT5od25kU2VsZiwgaW5kZXgsIGl0ZW0gPyBpdGVtLT5zdHIgOiAiIiwgYWN0aW9uLAogICAgICAgICAgICAgICAgICAgICAgICAgIHJlY3QtPmxlZnQsIHJlY3QtPnRvcCwgcmVjdC0+cmlnaHQsIHJlY3QtPmJvdHRvbSApOwotICAgICAgICAvKiBGSVhNRTogY2hlY2sgTEJTX1VTRVRBQlNUT1BTIHN0eWxlICovCi0gICAgICAgIGlmIChpdGVtKQotICAgICAgICAgICAgRXh0VGV4dE91dDMyQSggaGRjLCByZWN0LT5sZWZ0ICsgMSwgcmVjdC0+dG9wICsgMSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIEVUT19PUEFRVUUgfCBFVE9fQ0xJUFBFRCwgcmVjdCwgaXRlbS0+c3RyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RybGVuKGl0ZW0tPnN0ciksIE5VTEwgKTsKLSAgICAgICAgZWxzZQorICAgICAgICBpZiAoIWl0ZW0pCiAgICAgICAgICAgICBFeHRUZXh0T3V0MzJBKCBoZGMsIHJlY3QtPmxlZnQgKyAxLCByZWN0LT50b3AgKyAxLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgRVRPX09QQVFVRSB8IEVUT19DTElQUEVELCByZWN0LCBOVUxMLCAwLCBOVUxMICk7CisgICAgICAgIGVsc2UgaWYgKCEoZGVzY3ItPnN0eWxlICYgTEJTX1VTRVRBQlNUT1BTKSkgCisJICAgIEV4dFRleHRPdXQzMkEoIGhkYywgcmVjdC0+bGVmdCArIDEsIHJlY3QtPnRvcCArIDEsCisJCQkgICBFVE9fT1BBUVVFIHwgRVRPX0NMSVBQRUQsIHJlY3QsIGl0ZW0tPnN0ciwKKwkJCSAgIHN0cmxlbihpdGVtLT5zdHIpLCBOVUxMICk7CisgICAgICAgIGVsc2UKKwkgICAgVGFiYmVkVGV4dE91dDMyQSggaGRjLCByZWN0LT5sZWZ0ICsgMSAsIHJlY3QtPnRvcCArIDEsCisJCQkgICAgICBpdGVtLT5zdHIsIHN0cmxlbihpdGVtLT5zdHIpLCAKKwkJCSAgICAgIGRlc2NyLT5uYl90YWJzLCBkZXNjci0+dGFicywgMCk7CiAgICAgICAgIGlmIChpdGVtICYmIGl0ZW0tPnNlbGVjdGVkKQogICAgICAgICB7CiAgICAgICAgICAgICBTZXRCa0NvbG9yMzIoIGhkYywgb2xkQmsgKTsKQEAgLTU5NSw3ICs1OTgsMTIgQEAKICAgICB7CiAgICAgICAgIElOVDMyIGk7CiAgICAgICAgIExQSU5UMTYgcCA9IChMUElOVDE2KXRhYnM7Ci0gICAgICAgIGZvciAoaSA9IDA7IGkgPCBkZXNjci0+bmJfdGFiczsgaSsrKSBkZXNjci0+dGFic1tpXSA9ICpwKys7CisgICAgICAgIGRwcmludGZfbGlzdGJveCggc3RkZGViLCAiTGlzdGJveCAlMDR4OiBzZXR0YWJzdG9wcyAiLCB3bmQtPmh3bmRTZWxmKTsKKyAgICAgICAgZm9yIChpID0gMDsgaSA8IGRlc2NyLT5uYl90YWJzOyBpKyspIHsKKyAgICAgICAgICAgIGRlc2NyLT50YWJzW2ldID0gKnArKzw8MTsgLyogRklYTUUgKi8KKyAgICAgICAgICAgIGRwcmludGZfbGlzdGJveCggc3RkZGViLCAiJWhkICIsIGRlc2NyLT50YWJzW2ldKTsKKwl9CisJZHByaW50Zl9saXN0Ym94KCBzdGRkZWIsICJcbiIpOwogICAgIH0KICAgICBlbHNlIG1lbWNweSggZGVzY3ItPnRhYnMsIHRhYnMsIGRlc2NyLT5uYl90YWJzICogc2l6ZW9mKElOVDMyKSApOwogICAgIC8qIEZJWE1FOiByZXBhaW50IHRoZSB3aW5kb3c/ICovCmRpZmYgLS1naXQgYS9jb250cm9scy9tZW51LmMgYi9jb250cm9scy9tZW51LmMKaW5kZXggOWUwOGQzMS4uNjgyNDIzZiAxMDA2NDQKLS0tIGEvY29udHJvbHMvbWVudS5jCisrKyBiL2NvbnRyb2xzL21lbnUuYwpAQCAtMzUzMyw5ICszNTMzLDkgQEAKICAgICBpZiAoIW5hbWUpIHJldHVybiAwOwogICAgIAogICAgIC8qIGNoZWNrIGZvciBXaW4zMiBtb2R1bGUgKi8KLSAgICBpbnN0YW5jZSA9IE1PRFVMRV9IQU5ETEV0b0hNT0RVTEUxNiggaW5zdGFuY2UgKTsKLSAgICBpZiAoTU9EVUxFX0dldFB0cihpbnN0YW5jZSktPmZsYWdzICYgTkVfRkZMQUdTX1dJTjMyKQorICAgIGlmIChISVdPUkQoaW5zdGFuY2UpKQogICAgICAgICByZXR1cm4gTG9hZE1lbnUzMkEoaW5zdGFuY2UsUFRSX1NFR19UT19MSU4obmFtZSkpOworICAgIGluc3RhbmNlID0gR2V0RXhlUHRyKCBpbnN0YW5jZSApOwogCiAgICAgaWYgKCEoaFJzcmMgPSBGaW5kUmVzb3VyY2UxNiggaW5zdGFuY2UsIG5hbWUsIFJUX01FTlUgKSkpIHJldHVybiAwOwogICAgIGlmICghKGhhbmRsZSA9IExvYWRSZXNvdXJjZTE2KCBpbnN0YW5jZSwgaFJzcmMgKSkpIHJldHVybiAwOwpkaWZmIC0tZ2l0IGEvZGVidWdnZXIvTWFrZWZpbGUuaW4gYi9kZWJ1Z2dlci9NYWtlZmlsZS5pbgppbmRleCAyYWI3MmQxLi45YjAxNDE0IDEwMDY0NAotLS0gYS9kZWJ1Z2dlci9NYWtlZmlsZS5pbgorKysgYi9kZWJ1Z2dlci9NYWtlZmlsZS5pbgpAQCAtMjEsMTIgKzIxLDEzIEBACiAJc3RhY2suYyBcCiAJdHlwZXMuYwogCi1HRU5fQ19TUkNTID0gXAotCXkudGFiLmMgXAotCWxleC55eS5jCitFWFRSQV9TUkNTID0gZGJnLnkgZGVidWcubAorRVhUUkFfT0JKUyA9IHkudGFiLm8gbGV4Lnl5Lm8KIAogYWxsOiAkKE1PRFVMRSkubwogCitkZXBlbmQ6OiB5LnRhYi5oCisKICMKICMgVGhpcyBpcyBhIHNwZWNpYWwgdGVzdCBwcm9ncmFtIHRoYXQgaGVscHMgZGVidWcgdGhlIGludGVybmFsIGRlYnVnZ2VyLgogIwpAQCAtNDEsNCArNDIsNyBAQAogbGV4Lnl5LmM6IGRlYnVnLmwKIAkkKExFWCkgLTggLUkgJChTUkNESVIpL2RlYnVnLmwKIAorY2xlYW46OgorCSQoUk0pIHkudGFiLmMgeS50YWIuaCBsZXgueXkuYworCiAjIyMgRGVwZW5kZW5jaWVzOgpkaWZmIC0tZ2l0IGEvZGVidWdnZXIvc3RhYnMuYyBiL2RlYnVnZ2VyL3N0YWJzLmMKaW5kZXggMGZlOGU0MS4uOThiY2MzOCAxMDA2NDQKLS0tIGEvZGVidWdnZXIvc3RhYnMuYworKysgYi9kZWJ1Z2dlci9zdGFicy5jCkBAIC0xMDk4LDExICsxMDk4LDE1IEBACiAJc3RyY2F0KGZuLCIvIik7CiAJc3RyY2F0KGZuLGZpbGVuYW1lKTsKIAlpZiAoKHJ0biA9IERFQlVHX1Byb2Nlc3NFbGZPYmplY3QoZm4sbG9hZF9vZmZzZXQpKSkgeworCQlmcmVlKGZuKTsKICAgICAgIAkJZnJlZShwYXRocyk7CiAJCWdvdG8gbGVhdmU7CiAJfQotCXMgPSB0KzE7CisJZnJlZShmbik7CisJaWYgKHQpIHMgPSB0KzE7CiAgICAgICB9CisgICAgICBpZiAoIXMgfHwgISpzKQorICAgICAgCWZwcmludGYoc3RkZXJyLCIgJXMgbm90IGZvdW5kIixmaWxlbmFtZSk7CiAgICAgICBmcmVlKHBhdGhzKTsKICAgICAgIGdvdG8gbGVhdmU7CiAgICAgfQpkaWZmIC0tZ2l0IGEvZmlsZXMvZGlyZWN0b3J5LmMgYi9maWxlcy9kaXJlY3RvcnkuYwppbmRleCBiYTZhMmFhLi4wZjQ1ZmE5IDEwMDY0NAotLS0gYS9maWxlcy9kaXJlY3RvcnkuYworKysgYi9maWxlcy9kaXJlY3RvcnkuYwpAQCAtNTk2LDkgKzU5NiwxMiBAQAogICAgIHJlcyA9IGZ1bGxfbmFtZS5sb25nX25hbWUgKwogICAgICAgICAgICAgICBzdHJsZW4oRFJJVkVfR2V0Um9vdCggZnVsbF9uYW1lLnNob3J0X25hbWVbMF0gLSAnQScgKSk7CiAgICAgd2hpbGUgKCpyZXMgPT0gJy8nKSByZXMrKzsKLSAgICBpZiAoYnVmbGVuID4gMykgbHN0cmNweW4zMkEoIGJ1ZmZlciArIDMsIHJlcywgYnVmbGVuIC0gMyApOwotICAgIGZvciAocCA9IGJ1ZmZlcjsgKnA7IHArKykgaWYgKCpwID09ICcvJykgKnAgPSAnXFwnOwotICAgIGlmIChsYXN0cGFydCkgKmxhc3RwYXJ0ID0gc3RycmNociggYnVmZmVyLCAnXFwnICkgKyAxOworICAgIGlmIChidWZsZW4pCisgICAgeworICAgICAgICBpZiAoYnVmbGVuID4gMykgbHN0cmNweW4zMkEoIGJ1ZmZlciArIDMsIHJlcywgYnVmbGVuIC0gMyApOworICAgICAgICBmb3IgKHAgPSBidWZmZXI7ICpwOyBwKyspIGlmICgqcCA9PSAnLycpICpwID0gJ1xcJzsKKyAgICAgICAgaWYgKGxhc3RwYXJ0KSAqbGFzdHBhcnQgPSBzdHJyY2hyKCBidWZmZXIsICdcXCcgKSArIDE7CisgICAgfQogICAgIHJldHVybiAqcmVzID8gc3RybGVuKHJlcykgKyAyIDogMzsKIH0KIApAQCAtNjI2LDEyICs2MjksMTUgQEAKICAgICByZXMgPSBmdWxsX25hbWUubG9uZ19uYW1lICsKICAgICAgICAgICAgICAgc3RybGVuKERSSVZFX0dldFJvb3QoIGZ1bGxfbmFtZS5zaG9ydF9uYW1lWzBdIC0gJ0EnICkpOwogICAgIHdoaWxlICgqcmVzID09ICcvJykgcmVzKys7Ci0gICAgaWYgKGJ1ZmxlbiA+IDMpIGxzdHJjcHluQXRvVyggYnVmZmVyICsgMywgcmVzICsgMSwgYnVmbGVuIC0gMyApOwotICAgIGZvciAocCA9IGJ1ZmZlcjsgKnA7IHArKykgaWYgKCpwID09ICcvJykgKnAgPSAnXFwnOwotICAgIGlmIChsYXN0cGFydCkKKyAgICBpZiAoYnVmbGVuKQogICAgIHsKLSAgICAgICAgZm9yIChwID0gKmxhc3RwYXJ0ID0gYnVmZmVyOyAqcDsgcCsrKQotICAgICAgICAgICAgaWYgKCpwID09ICdcXCcpICpsYXN0cGFydCA9IHAgKyAxOworICAgICAgICBpZiAoYnVmbGVuID4gMykgbHN0cmNweW5BdG9XKCBidWZmZXIgKyAzLCByZXMgKyAxLCBidWZsZW4gLSAzICk7CisgICAgICAgIGZvciAocCA9IGJ1ZmZlcjsgKnA7IHArKykgaWYgKCpwID09ICcvJykgKnAgPSAnXFwnOworICAgICAgICBpZiAobGFzdHBhcnQpCisgICAgICAgIHsKKyAgICAgICAgICAgIGZvciAocCA9ICpsYXN0cGFydCA9IGJ1ZmZlcjsgKnA7IHArKykKKyAgICAgICAgICAgICAgICBpZiAoKnAgPT0gJ1xcJykgKmxhc3RwYXJ0ID0gcCArIDE7CisgICAgICAgIH0KICAgICB9CiAgICAgcmV0dXJuICpyZXMgPyBzdHJsZW4ocmVzKSArIDIgOiAzOwogfQpkaWZmIC0tZ2l0IGEvZ3JhcGhpY3MvTWFrZWZpbGUuaW4gYi9ncmFwaGljcy9NYWtlZmlsZS5pbgppbmRleCA5OGY5MzM4Li45Y2FiNDExIDEwMDY0NAotLS0gYS9ncmFwaGljcy9NYWtlZmlsZS5pbgorKysgYi9ncmFwaGljcy9NYWtlZmlsZS5pbgpAQCAtOCw2ICs4LDcgQEAKIENfU1JDUyA9IFwKIAliaXRibHQuYyBcCiAJZHJpdmVyLmMgXAorCWVudi5jIFwKIAllc2NhcGUuYyBcCiAJZm9udGVuZ2luZS5jIFwKIAltYXBwaW5nLmMgXApkaWZmIC0tZ2l0IGEvZ3JhcGhpY3MvZW52LmMgYi9ncmFwaGljcy9lbnYuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45ZTI4NGQ3Ci0tLSAvZGV2L251bGwKKysrIGIvZ3JhcGhpY3MvZW52LmMKQEAgLTAsMCArMSw4NCBAQAorLyogCisgKiBEcml2ZXIgRW52aXJvbm1lbnQgZnVuY3Rpb25zCisgKgorICogTm90ZTogVGhpcyBoYXMgTk9USElORyB0byBkbyB3aXRoIHRoZSB0YXNrL3Byb2Nlc3MgZW52aXJvbm1lbnQhCisgKgorICogQ29weXJpZ2h0IDE5OTcgTWFyY3VzIE1laXNzbmVyCisgKi8KKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgIndpbmRvd3MuaCIKKyNpbmNsdWRlICJnZGkuaCIKKyNpbmNsdWRlICJkZWJ1Zy5oIgorI2luY2x1ZGUgInN0ZGRlYnVnLmgiCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogICAgICAgICAgIEdldEVudmlyb25tZW50ICAgKEdESS4xMzQpCisgKi8KK0lOVDE2IFdJTkFQSSBHZXRFbnZpcm9ubWVudChMUENTVFIgbHBQb3J0TmFtZSwgTFBERVZNT0RFMTYgbHBkZXYsIFVJTlQxNiBuTWF4U2l6KQoreworICAgIGZwcmludGYoc3RkZGViLCAiR2V0RW52aXJvbm1lbnQoJyVzJywnJXAnLCVkKSxcbiIsCisJCWxwUG9ydE5hbWUsIGxwZGV2LCBuTWF4U2l6KTsKKyAgICByZXR1cm4gMDsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiAgICAgICAgICBTZXRFbnZpcm9ubWVudCAgIChHREkuMTMyKQorICovCitJTlQxNiBXSU5BUEkgU2V0RW52aXJvbm1lbnQoTFBDU1RSIGxwUG9ydE5hbWUsIExQREVWTU9ERTE2IGxwZGV2LCBVSU5UMTYgbkNvdW50KQoreworICAgIGZwcmludGYoc3RkZGViLCAiU2V0RW52aXJvbm1lbnQoJyVzJywgJyVwJywgJWQpICFcbiIsIAorCQlscFBvcnROYW1lLCBscGRldiwgbkNvdW50KTsKKyAgICBmcHJpbnRmKHN0ZGVyciwKKyAgICAJIlx0ZGV2bW9kZTpcbiIKKyAgICAJIlx0bmFtZSA9ICVzXG4iCisJIlx0ZG1TcGVjVmVyc2lvbiA9ICVkXG4iCisJIlx0ZG1Ecml2ZXJWZXJzaW9uID0gJWRcbiIKKwkiXHRkbVNpemUgPSAlZFxuIgorCSJcdGRtRHJpdmVyRXh0cmEgPSAlZFxuIgorCSJcdGRtRmllbGRzID0gJWxkXG4iCisJIlx0ZG1PcmllbnRhdGlvbiA9ICVkXG4iCisJIlx0ZG1QYXBlclNpemUgPSAlZFxuIgorCSJcdGRtUGFwZXJMZW5ndGggPSAlZFxuIgorCSJcdGRtUGFwZXJXaWR0aCA9ICVkXG4iCisJIlx0ZG1TY2FsZSA9ICVkXG4iCisJIlx0ZG1Db3BpZXMgPSAlZFxuIgorCSJcdGRtRGVmYXVsdFNvdXJjZSA9ICVkXG4iCisJIlx0ZG1QcmludFF1YWxpdHkgPSAlZFxuIgorCSJcdGRtQ29sb3IgPSAlZFxuIgorCSJcdGRtRHVwbGV4ID0gJWRcbiIKKwkiXHRkbVlSZXNvbHV0aW9uID0gJWRcbiIKKwkiXHRkbVRUT3B0aW9uID0gJWRcbiIKKwkiXHRkbUNvbGxhdGUgPSAlZFxuIgorCSJcdGRtRkJpdHNQZXJQZWwgPSAlZFxuIgorCSJcdGRtUGVsc1dpZHRoID0gJWxkXG4iCisJIlx0ZG1QZWxzSGVpZ2h0ID0gJWxkXG4iCisJIlx0ZG1EaXNwbGF5RmxhZ3MgPSAlbGRcbiIKKwkiXHRkbURpc3BsYXlGcmVxdWVuY3kgPSAlbGRcbiIsCisJCisgICAgCWxwZGV2LT5kbURldmljZU5hbWUsCisgICAgCWxwZGV2LT5kbVNwZWNWZXJzaW9uLAorICAgIAlscGRldi0+ZG1Ecml2ZXJWZXJzaW9uLAorICAgIAlscGRldi0+ZG1TaXplLAorICAgIAlscGRldi0+ZG1Ecml2ZXJFeHRyYSwKKyAgICAJbHBkZXYtPmRtRmllbGRzLAorICAgIAlscGRldi0+ZG1PcmllbnRhdGlvbiwKKyAgICAJbHBkZXYtPmRtUGFwZXJTaXplLAorICAgIAlscGRldi0+ZG1QYXBlckxlbmd0aCwKKyAgICAJbHBkZXYtPmRtUGFwZXJXaWR0aCwKKyAgICAJbHBkZXYtPmRtU2NhbGUsCisgICAgCWxwZGV2LT5kbUNvcGllcywKKyAgICAJbHBkZXYtPmRtRGVmYXVsdFNvdXJjZSwKKyAgICAJbHBkZXYtPmRtUHJpbnRRdWFsaXR5LAorICAgIAlscGRldi0+ZG1Db2xvciwKKyAgICAJbHBkZXYtPmRtRHVwbGV4LAorICAgIAlscGRldi0+ZG1ZUmVzb2x1dGlvbiwKKyAgICAJbHBkZXYtPmRtVFRPcHRpb24sCisgICAgCWxwZGV2LT5kbUNvbGxhdGUsCisgICAgCWxwZGV2LT5kbUJpdHNQZXJQZWwsCisgICAgCWxwZGV2LT5kbVBlbHNXaWR0aCwKKyAgICAJbHBkZXYtPmRtUGVsc0hlaWdodCwKKyAgICAJbHBkZXYtPmRtRGlzcGxheUZsYWdzLAorICAgIAlscGRldi0+ZG1EaXNwbGF5RnJlcXVlbmN5CisgICApOworICAgIHJldHVybiAwOworfQpkaWZmIC0tZ2l0IGEvZ3JhcGhpY3MvZXNjYXBlLmMgYi9ncmFwaGljcy9lc2NhcGUuYwppbmRleCBiNjBiOWE4Li4xMjRmN2U3IDEwMDY0NAotLS0gYS9ncmFwaGljcy9lc2NhcGUuYworKysgYi9ncmFwaGljcy9lc2NhcGUuYwpAQCAtNyw2ICs3LDggQEAKICNpbmNsdWRlIDxzdGRpby5oPgogI2luY2x1ZGUgIndpbmRvd3MuaCIKICNpbmNsdWRlICJnZGkuaCIKKyNpbmNsdWRlICJoZWFwLmgiCisjaW5jbHVkZSAibGR0LmgiCiAjaW5jbHVkZSAiZGMuaCIKIAogSU5UMTYgV0lOQVBJIEVzY2FwZTE2KCBIREMxNiBoZGMsIElOVDE2IG5Fc2NhcGUsIElOVDE2IGNiSW5wdXQsCkBAIC0yMCwxMyArMjIsNTYgQEAKIElOVDMyIFdJTkFQSSBFc2NhcGUzMiggSERDMzIgaGRjLCBJTlQzMiBuRXNjYXBlLCBJTlQzMiBjYklucHV0LAogICAgICAgICAgICAgICAgICAgICAgICBMUFZPSUQgbHBzekluRGF0YSwgTFBWT0lEIGxwdk91dERhdGEgKQogewotICAgIERDICogZGMgPSBEQ19HZXREQ1B0ciggaGRjICk7CisgICAgREMJCSpkYyA9IERDX0dldERDUHRyKCBoZGMgKTsKKyAgICBTRUdQVFIJc2VnaW4sc2Vnb3V0OworICAgIElOVDMyCXJldDsKKwogICAgIGlmICghZGMgfHwgIWRjLT5mdW5jcy0+cEVzY2FwZSkgcmV0dXJuIDA7CisgICAgc2VnaW4JPSAoU0VHUFRSKWxwc3pJbkRhdGE7CisgICAgc2Vnb3V0CT0gKFNFR1BUUilscHZPdXREYXRhOwogICAgIHN3aXRjaCAobkVzY2FwZSkgewotICAgIGNhc2UgR0VUU0NBTElOR0ZBQ1RPUjoKLSAgICAgICAgIHJldHVybiAxOwotICAgIAkKKyAgICAJLyogRXNjYXBlKGhkYyxRVUVSWUVTQ1NVUFBPUlQsTFBJTlQzMixOVUxMKSAqLworICAgIGNhc2UgUVVFUllFU0NTVVBQT1JUOiB7CisgICAgCUxQSU5UMTYgeCA9IChMUElOVDE2KVNFR1BUUl9ORVcoSU5UMTYpOworCSp4ID0gKihJTlQzMiopbHBzekluRGF0YTsKKwlzZWdpbiA9IFNFR1BUUl9HRVQoeCk7CisJYnJlYWs7CiAgICAgfQotICAgIHJldHVybiBkYy0+ZnVuY3MtPnBFc2NhcGUoIGRjLCBuRXNjYXBlLCBjYklucHV0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChTRUdQVFIpbHBzekluRGF0YSwgKFNFR1BUUilscHZPdXREYXRhICk7CisKKyAgICAJLyogRXNjYXBlKGhkYyxHRVRTQ0FMSU5HRkFDVE9SLE5VTEwsTFBQT0lOVDMyKSAqLworICAgIAkvKiBFc2NhcGUoaGRjLEdFVFBIWVNQQUdFU0laRSxOVUxMLExQUE9JTlQzMikgKi8KKyAgICAJLyogRXNjYXBlKGhkYyxHRVRQUklOVElOR09GRlNFVCxOVUxMLExQUE9JTlQzMikgKi8KKworICAgIGNhc2UgR0VUU0NBTElOR0ZBQ1RPUjoKKyAgICBjYXNlIEdFVFBIWVNQQUdFU0laRToKKyAgICBjYXNlIEdFVFBSSU5USU5HT0ZGU0VUOgorCXNlZ291dCA9IFNFR1BUUl9HRVQoU0VHUFRSX05FVyhQT0lOVDE2KSk7CisJYnJlYWs7CisgICAgfQorICAgIHJldCA9IGRjLT5mdW5jcy0+cEVzY2FwZSggZGMsIG5Fc2NhcGUsIGNiSW5wdXQsIHNlZ2luLCBzZWdvdXQgKTsKKyAgICBzd2l0Y2gobkVzY2FwZSkgeworICAgIGNhc2UgUVVFUllFU0NTVVBQT1JUOgorICAgIAlpZiAocmV0KQorCQlmcHJpbnRmKHN0ZGVyciwidGFyZ2V0IERDIGltcGxlbWVudHMgRXNjYXBlICVkXG4iLG5Fc2NhcGUpOworICAgIAlTRUdQVFJfRlJFRShQVFJfU0VHX1RPX0xJTihzZWdpbikpOworCWJyZWFrOworICAgIGNhc2UgR0VUU0NBTElOR0ZBQ1RPUjoKKyAgICBjYXNlIEdFVFBSSU5USU5HT0ZGU0VUOgorICAgIGNhc2UgR0VUUEhZU1BBR0VTSVpFOiB7CisgICAgCUxQUE9JTlQxNiB4ID0gKExQUE9JTlQxNilQVFJfU0VHX1RPX0xJTihzZWdvdXQpOworCUNPTlZfUE9JTlQxNlRPMzIoeCwoTFBQT0lOVDMyKWxwdk91dERhdGEpOworCVNFR1BUUl9GUkVFKHgpOworCWJyZWFrOworICAgIH0KKyAgICBkZWZhdWx0OgorICAgIAlicmVhazsKKyAgICB9CisgICAgcmV0dXJuIHJldDsKK30KKworSU5UMzIgV0lOQVBJIEV4dEVzY2FwZTMyKEhEQzMyIGhkYyxJTlQzMiBuRXNjYXBlLElOVDMyIGNiSW5wdXQsTFBDU1RSIHgsSU5UMzIgY2JPdXRwdXQsTFBTVFIgb3V0KSB7CisJZnByaW50ZihzdGRlcnIsIkV4dEVzY2FwZTMyKDB4JTA0eCwweCV4LCVkLCVzLCVkLCVwKSxzdHViIVxuIiwKKwkJaGRjLG5Fc2NhcGUsY2JJbnB1dCx4LGNiT3V0cHV0LG91dAorCSk7CisJcmV0dXJuIDE7CiB9CmRpZmYgLS1naXQgYS9ncmFwaGljcy9mb250ZW5naW5lLmMgYi9ncmFwaGljcy9mb250ZW5naW5lLmMKaW5kZXggMTY3NjgzNi4uNWExMThhYyAxMDA2NDQKLS0tIGEvZ3JhcGhpY3MvZm9udGVuZ2luZS5jCisrKyBiL2dyYXBoaWNzL2ZvbnRlbmdpbmUuYwpAQCAtMTAsNyArMTAsNyBAQAogLyogR0RJIDMwMCAqLwogV09SRCBXSU5BUEkgRW5naW5lRW51bWVyYXRlRm9udChMUFNUUiBmb250bmFtZSwgRkFSUFJPQzE2IHByb2MsIERXT1JEIGRhdGEgKQogewotICAgIGZwcmludGYoc3RkZXJyLCJFbmdpbmVFbnVtZXJhdGVGb250KCVzLCVwLCVkKSxzdHViXG4iLGZvbnRuYW1lLHByb2MsZGF0YSk7CisgICAgZnByaW50ZihzdGRlcnIsIkVuZ2luZUVudW1lcmF0ZUZvbnQoJXMsJXAsJWx4KSxzdHViXG4iLGZvbnRuYW1lLHByb2MsZGF0YSk7CiAgICAgcmV0dXJuIDA7CiB9CiAjaWZkZWYgTk9UREVGCmRpZmYgLS1naXQgYS9ncmFwaGljcy94MTFkcnYvdGV4dC5jIGIvZ3JhcGhpY3MveDExZHJ2L3RleHQuYwppbmRleCAwYjkwZDYyLi5kN2MyOGNmIDEwMDY0NAotLS0gYS9ncmFwaGljcy94MTFkcnYvdGV4dC5jCisrKyBiL2dyYXBoaWNzL3gxMWRydi90ZXh0LmMKQEAgLTI3OSw2ICsyNzksMTAgQEAKIAkJICAgZGMtPncuRENPcmdYICsgeCArIGluZm8ud2lkdGgsIGRjLT53LkRDT3JnWSArIHkgLSBsaW5lQXNjZW50ICk7CiAgICAgfQogCi0gICAgaWYgKGZsYWdzICYgRVRPX0NMSVBQRUQpIFNlbGVjdENsaXBSZ24zMiggZGMtPmhTZWxmLCBoUmduQ2xpcCApOworICAgIGlmIChmbGFncyAmIEVUT19DTElQUEVEKSAKKyAgICB7CisgICAgICBTZWxlY3RDbGlwUmduMzIoIGRjLT5oU2VsZiwgaFJnbkNsaXAgKTsKKyAgICAgIERlbGV0ZU9iamVjdDMyKCBoUmduQ2xpcCApOworICAgIH0KICAgICByZXR1cm4gVFJVRTsKIH0KZGlmZiAtLWdpdCBhL2lmMTYzMi9NYWtlZmlsZS5pbiBiL2lmMTYzMi9NYWtlZmlsZS5pbgppbmRleCAyMGRmNjQ3Li5lOWJiNDE2IDEwMDY0NAotLS0gYS9pZjE2MzIvTWFrZWZpbGUuaW4KKysrIGIvaWYxNjMyL01ha2VmaWxlLmluCkBAIC02NSw4ICs2NSw3IEBACiAJJChTUEVDX0ZJTEVTKSBcCiAJY2FsbGZyb20xNi5zIFwKIAljYWxsZnJvbTMyLnMgXAotCWNhbGx0bzE2LnMgXAotCWNhbGx0bzMyLnMgXAorCWNhbGx0bzE2LnMKIAogLlNVRkZJWEVTOiAuc3BlYwogCkBAIC04OCw3ICs4Nyw0IEBACiBjYWxsdG8xNi5zOiAkKFRPUFNSQ0RJUikvaW5jbHVkZS9jYWxsYmFjay5oICQoQlVJTEQpCiAJJChCVUlMRCkgLW8gJEAgLWNhbGx0bzE2IGBjYXQgJChUT1BTUkNESVIpL2luY2x1ZGUvY2FsbGJhY2suaCB8IGdyZXAgImV4dGVybi4qQ2FsbFRvMTZfIiB8IHNlZCAncy8uKkNhbGxUbzE2X1woLipcKSguKi9cMS8nIHwgc29ydCB8IHVuaXFgCiAKLWNhbGx0bzMyLnM6ICQoVE9QU1JDRElSKS9pbmNsdWRlL2NhbGxiYWNrLmggJChCVUlMRCkKLQkkKEJVSUxEKSAtbyAkQCAtY2FsbHRvMzIgYGNhdCAkKFRPUFNSQ0RJUikvaW5jbHVkZS9jYWxsYmFjay5oIHwgZ3JlcCAiZXh0ZXJuLipDYWxsVG8zMl8iIHwgc2VkICdzLy4qQ2FsbFRvMzJfXCguKlwpKC4qL1wxLycgfCBzb3J0IHwgdW5pcWAKLQogIyMjIERlcGVuZGVuY2llczoKZGlmZiAtLWdpdCBhL2lmMTYzMi9jcnRkbGwuc3BlYyBiL2lmMTYzMi9jcnRkbGwuc3BlYwppbmRleCA5OTNiYjFkLi5kYTYyNmY1IDEwMDY0NAotLS0gYS9pZjE2MzIvY3J0ZGxsLnNwZWMKKysrIGIvaWYxNjMyL2NydGRsbC5zcGVjCkBAIC00NTYsNyArNDU2LDcgQEAKIDQ1MiBjZGVjbCBzZXRidWYocHRyIHB0cikgQ1JURExMX3NldGJ1ZgogNDUzIGNkZWNsIHNldGxvY2FsZShsb25nIHB0cikgQ1JURExMX3NldGxvY2FsZQogNDU0IHN0dWIgc2V0dmJ1ZgotNDU1IHN0dWIgc2lnbmFsCis0NTUgY2RlY2wgc2lnbmFsKGxvbmcgcHRyKSBDUlRETExfc2lnbmFsCiA0NTYgY2RlY2wgc2luKGRvdWJsZSkgc2luCiA0NTcgY2RlY2wgc2luaChkb3VibGUpIHNpbmgKIDQ1OCB2YXJhcmdzIHNwcmludGYoKSB3c3ByaW50ZjMyQQpkaWZmIC0tZ2l0IGEvaWYxNjMyL2dkaTMyLnNwZWMgYi9pZjE2MzIvZ2RpMzIuc3BlYwppbmRleCAyYmFlYWUyLi4xMzgwY2RiIDEwMDY0NAotLS0gYS9pZjE2MzIvZ2RpMzIuc3BlYworKysgYi9pZjE2MzIvZ2RpMzIuc3BlYwpAQCAtOTksNyArOTksNyBAQAogIDkyIHN0ZGNhbGwgRXhjbHVkZUNsaXBSZWN0KGxvbmcgbG9uZyBsb25nIGxvbmcgbG9uZykgRXhjbHVkZUNsaXBSZWN0MzIKICA5MyBzdHViIEV4dENyZWF0ZVBlbgogIDk0IHN0dWIgRXh0Q3JlYXRlUmVnaW9uCi0gOTUgc3R1YiBFeHRFc2NhcGUKKyA5NSBzdGRjYWxsIEV4dEVzY2FwZShsb25nIGxvbmcgbG9uZyBwdHIgbG9uZyBwdHIpIEV4dEVzY2FwZTMyCiAgOTYgc3RkY2FsbCBFeHRGbG9vZEZpbGwobG9uZyBsb25nIGxvbmcgbG9uZyBsb25nKSBFeHRGbG9vZEZpbGwzMgogIDk3IHN0dWIgRXh0U2VsZWN0Q2xpcFJnbgogIDk4IHN0ZGNhbGwgRXh0VGV4dE91dEEobG9uZyBsb25nIGxvbmcgbG9uZyBwdHIgcHRyIGxvbmcgcHRyKSBFeHRUZXh0T3V0MzJBCmRpZmYgLS1naXQgYS9pZjE2MzIva2VybmVsLnNwZWMgYi9pZjE2MzIva2VybmVsLnNwZWMKaW5kZXggZGY2ZjJlNy4uNjQ2ZTUyYSAxMDA2NDQKLS0tIGEvaWYxNjMyL2tlcm5lbC5zcGVjCisrKyBiL2lmMTYzMi9rZXJuZWwuc3BlYwpAQCAtNTIsOCArNTIsOCBAQAogNTIgIHBhc2NhbDE2IEZyZWVQcm9jSW5zdGFuY2Uoc2VncHRyKSBGcmVlUHJvY0luc3RhbmNlMTYKIDUzICBzdHViIENhbGxQcm9jSW5zdGFuY2UKIDU0ICBwYXNjYWwxNiBHZXRJbnN0YW5jZURhdGEod29yZCB3b3JkIHdvcmQpIEdldEluc3RhbmNlRGF0YQotNTUgIHBhc2NhbDE2IENhdGNoKHB0cikgQ2F0Y2ggCi01NiAgcGFzY2FsMTYgVGhyb3cocHRyIHdvcmQpIFRocm93Cis1NSAgcmVnaXN0ZXIgQ2F0Y2goc2VncHRyKSBDYXRjaCAKKzU2ICByZWdpc3RlciBUaHJvdyhzZWdwdHIgd29yZCkgVGhyb3cKIDU3ICBwYXNjYWwxNiBHZXRQcm9maWxlSW50KHN0ciBzdHIgc193b3JkKSBHZXRQcm9maWxlSW50MTYKIDU4ICBwYXNjYWwxNiBHZXRQcm9maWxlU3RyaW5nKHN0ciBzdHIgc3RyIHB0ciB3b3JkKSBHZXRQcm9maWxlU3RyaW5nMTYKIDU5ICBwYXNjYWwxNiBXcml0ZVByb2ZpbGVTdHJpbmcoc3RyIHN0ciBzdHIpIFdyaXRlUHJvZmlsZVN0cmluZzE2CkBAIC0xMDYsNyArMTA2LDcgQEAKIDEwNiBwYXNjYWwgU2V0U3dhcEFyZWFTaXplKHdvcmQpIFNldFN3YXBBcmVhU2l6ZQogMTA3IHBhc2NhbDE2IFNldEVycm9yTW9kZSh3b3JkKSBTZXRFcnJvck1vZGUxNgogMTA4IHBhc2NhbDE2IFN3aXRjaFN0YWNrVG8od29yZCB3b3JkIHdvcmQpIFN3aXRjaFN0YWNrVG8KLTEwOSByZWdpc3RlciBTd2l0Y2hTdGFja0JhY2soKSBTd2l0Y2hTdGFja0JhY2sKKzEwOSByZWdpc3RlciBTd2l0Y2hTdGFja0JhY2sod29yZCB3b3JkIHdvcmQpIFN3aXRjaFN0YWNrQmFjawogMTEwIHBhc2NhbDE2IFBhdGNoQ29kZUhhbmRsZSh3b3JkKSBQYXRjaENvZGVIYW5kbGUKIDExMSBwYXNjYWwgICBHbG9iYWxXaXJlKHdvcmQpIEdsb2JhbFdpcmUxNgogMTEyIHBhc2NhbDE2IEdsb2JhbFVuV2lyZSh3b3JkKSBHbG9iYWxVbldpcmUxNgpAQCAtMjc2LDggKzI3Niw4IEBACiAzNTUgcGFzY2FsMTYgR2V0V2luRGVidWdJbmZvKHB0ciB3b3JkKSBHZXRXaW5EZWJ1Z0luZm8KIDM1NiBwYXNjYWwxNiBTZXRXaW5EZWJ1Z0luZm8ocHRyKSBTZXRXaW5EZWJ1Z0luZm8KIDM1NyBzdHViIEtFUk5FTF8zNTcKLTM1OCBzdHViIEtFUk5FTF8zNTgKLTM1OSBzdHViIEtFUk5FTF8zNTkKKzM1OCBwYXNjYWwgS0VSTkVMXzM1OChsb25nKSBfS0VSTkVMXzM1OAorMzU5IHBhc2NhbCBLRVJORUxfMzU5KGxvbmcpIF9LRVJORUxfMzU5CiAzNjAgc3R1YiBPcGVuRmlsZUV4CiAjMzYxIFBJR0xFVF8zNjEKIDQwMyBwYXNjYWwxNiBGYXJTZXRPd25lcih3b3JkIHdvcmQpIEZhclNldE93bmVyCkBAIC0zMTAsNyArMzEwLDcgQEAKIDQ1NCBzdHViIEtFUk5FTF80NTQKIDQ1NSBzdHViIEtFUk5FTF80NTUKIDQ3MSBzdHViIEtFUk5FTF80NzEKLTQ3MiBzdHViIEtFUk5FTF80NzIKKzQ3MiByZWdpc3RlciBLRVJORUxfNDcyKCkgX0tFUk5FTF80NzIKIDQ3MyBzdHViIEtFUk5FTF80NzMKIDQ4MiBzdHViIEtFUk5FTF80ODIKIDQ4NSBzdHViIEtFUk5FTF80ODUKQEAgLTMzOSw2ICszMzksNiBAQAogNjIxIHN0dWIgS0VSTkVMXzYyMQogNjI3IHN0dWIgSXNCYWRGbGF0UmVhZFdyaXRlUHRyCiA2MzAgc3R1YiBLRVJORUxfNjMwCi02MzEgc3R1YiBGVU5DMDA0CSMgc2hlbGwgaG9vaworNjMxIHBhc2NhbCBGVU5DMDA0KHdvcmQgd29yZCBsb25nKSBGVU5DMDA0CSMgc2hlbGwgaG9vawogNjUxIHN0dWIgS0VSTkVMXzY1MQogNzAwIHBhc2NhbCBLRVJORUxfNzAwKCkgc3R1Yl9LRVJORUxfNzAwCmRpZmYgLS1naXQgYS9pZjE2MzIva2VybmVsMzIuc3BlYyBiL2lmMTYzMi9rZXJuZWwzMi5zcGVjCmluZGV4IDNiNjI0M2EuLjg0YTI2NWMgMTAwNjQ0Ci0tLSBhL2lmMTYzMi9rZXJuZWwzMi5zcGVjCisrKyBiL2lmMTYzMi9rZXJuZWwzMi5zcGVjCkBAIC00MCw3ICs0MCw3IEBACiAgCiAgNTAgc3RkY2FsbCBBZGRBdG9tQShwdHIpIEFkZEF0b20zMkEKIAotIDUyIHJlZ2lzdGVyIF9LRVJORUwzMl81Mihsb25nKSBfS0VSTkVMMzJfNTIKKyA1MiBzdGRjYWxsIF9LRVJORUwzMl81MigpIF9LRVJORUwzMl81MgogCiAjIFdPVyBjYWxscwogIDU0IHN0ZGNhbGwgV09XQ2FsbGJhY2sxNihsb25nIGxvbmcpIFdPV0NhbGxiYWNrMTYKQEAgLTg1LDE1ICs4NSwxNSBAQAogIDkzIHN0ZGNhbGwgR0VUUFdJTjE2TE9DSyhwdHIpIEdldFBXaW5Mb2NrCiAgOTcgc3R1YiBFTlRFUlNZU0xFVkVMCiAgOTggc3R1YiBMRUFWRVNZU0xFVkVMCi0gOTkgc3R1YiBfS0VSTkVMMzJfOTgKLTEwMCBzdHViIF9LRVJORUwzMl85OQorIDk5IHN0ZGNhbGwgX0tFUk5FTDMyXzk4KGxvbmcpIF9LRVJORUwzMl85OAorMTAwIHN0ZGNhbGwgX0tFUk5FTDMyXzk5KGxvbmcgbG9uZyBsb25nKSBfS0VSTkVMMzJfOTkKIDEwMSBzdHViIF9LRVJORUwzMl8xMDAKIAogCiAxMDIgc3RkY2FsbCBBZGRBdG9tVyhwdHIpIEFkZEF0b20zMlcKIDEwMyBzdHViIEFsbG9jQ29uc29sZQogMTA0IHN0dWIgQWxsb2NMU0NhbGxiYWNrCi0xMDUgc3R1YiBBbGxvY1NMQ2FsbGJhY2sKKzEwNSBzdGRjYWxsIEFsbG9jU0xDYWxsYmFjayhwdHIgcHRyKSBBbGxvY1NMQ2FsbGJhY2sKIDEwNiBzdGRjYWxsIEFyZUZpbGVBcGlzQU5TSSgpIEFyZUZpbGVBcGlzQU5TSQogMTA3IHN0dWIgQmFja3VwUmVhZAogMTA4IHN0dWIgQmFja3VwU2VlawpAQCAtMjYyLDcgKzI2Miw3IEBACiAyNzIgc3R1YiBGcmVlTGlicmFyeUFuZEV4aXRUaHJlYWQKIDI3MSBzdGRjYWxsIEZyZWVMaWJyYXJ5KGxvbmcpIEZyZWVMaWJyYXJ5MzIKIDI3MyBzdGRjYWxsIEZyZWVSZXNvdXJjZShsb25nKSBGcmVlUmVzb3VyY2UzMgotMjc0IHN0dWIgRnJlZVNMQ2FsbGJhY2sKKzI3NCBzdGRjYWxsIEZyZWVTTENhbGxiYWNrKGxvbmcpIEZyZWVTTENhbGxiYWNrCiAyNzUgc3R1YiBHZW5lcmF0ZUNvbnNvbGVDdHJsRXZlbnQKIDI3NiBzdGRjYWxsIEdldEFDUCgpIEdldEFDUAogMjc3IHN0ZGNhbGwgR2V0QXRvbU5hbWVBKGxvbmcgcHRyIGxvbmcpIEdldEF0b21OYW1lMzJBCkBAIC01OTEsMTUgKzU5MSwxNSBAQAogNjAwIHJlZ2lzdGVyIFNNYXBMU19JUF9FQlBfNDAoKSBTTWFwTFNfSVBfRUJQXzQwCiA2MDEgcmVnaXN0ZXIgU01hcExTX0lQX0VCUF84KCkgU01hcExTX0lQX0VCUF84CiA2MDIgc3R1YiBTVW5NYXBMUwotNjAzIHN0dWIgU1VuTWFwTFNfSVBfRUJQXzEyCi02MDQgc3R1YiBTVW5NYXBMU19JUF9FQlBfMTYKLTYwNSBzdHViIFNVbk1hcExTX0lQX0VCUF8yMAotNjA2IHN0dWIgU1VuTWFwTFNfSVBfRUJQXzI0Ci02MDcgc3R1YiBTVW5NYXBMU19JUF9FQlBfMjgKLTYwOCBzdHViIFNVbk1hcExTX0lQX0VCUF8zMgotNjA5IHN0dWIgU1VuTWFwTFNfSVBfRUJQXzM2Ci02MTAgc3R1YiBTVW5NYXBMU19JUF9FQlBfNDAKLTYxMSBzdHViIFNVbk1hcExTX0lQX0VCUF84Cis2MDMgcmVnaXN0ZXIgU1VuTWFwTFNfSVBfRUJQXzEyKCkgU1VuTWFwTFNfSVBfRUJQXzEyCis2MDQgcmVnaXN0ZXIgU1VuTWFwTFNfSVBfRUJQXzE2KCkgU1VuTWFwTFNfSVBfRUJQXzE2Cis2MDUgcmVnaXN0ZXIgU1VuTWFwTFNfSVBfRUJQXzIwKCkgU1VuTWFwTFNfSVBfRUJQXzIwCis2MDYgcmVnaXN0ZXIgU1VuTWFwTFNfSVBfRUJQXzI0KCkgU1VuTWFwTFNfSVBfRUJQXzI0Cis2MDcgcmVnaXN0ZXIgU1VuTWFwTFNfSVBfRUJQXzI4KCkgU1VuTWFwTFNfSVBfRUJQXzI4Cis2MDggcmVnaXN0ZXIgU1VuTWFwTFNfSVBfRUJQXzMyKCkgU1VuTWFwTFNfSVBfRUJQXzMyCis2MDkgcmVnaXN0ZXIgU1VuTWFwTFNfSVBfRUJQXzM2KCkgU1VuTWFwTFNfSVBfRUJQXzM2Cis2MTAgcmVnaXN0ZXIgU1VuTWFwTFNfSVBfRUJQXzQwKCkgU1VuTWFwTFNfSVBfRUJQXzQwCis2MTEgcmVnaXN0ZXIgU1VuTWFwTFNfSVBfRUJQXzgoKSBTVW5NYXBMU19JUF9FQlBfOAogNjEyIHN0dWIgU2Nyb2xsQ29uc29sZVNjcmVlbkJ1ZmZlckEKIDYxMyBzdHViIFNjcm9sbENvbnNvbGVTY3JlZW5CdWZmZXJXCiA2MTQgc3RkY2FsbCBTZWFyY2hQYXRoQShwdHIgcHRyIHB0ciBsb25nIHB0ciBwdHIpIFNlYXJjaFBhdGgzMkEKQEAgLTY2OSw3ICs2NjksNyBAQAogNjc4IHN0ZGNhbGwgU2l6ZW9mUmVzb3VyY2UobG9uZyBsb25nKSBTaXplb2ZSZXNvdXJjZTMyCiA2Nzkgc3RkY2FsbCBTbGVlcChsb25nKSBTbGVlcAogNjgwIHN0dWIgU2xlZXBFeAotNjgxIHN0dWIgU3VzcGVuZFRocmVhZAorNjgxIHN0ZGNhbGwgU3VzcGVuZFRocmVhZChsb25nKSBTdXNwZW5kVGhyZWFkCiA2ODIgc3RkY2FsbCBTeXN0ZW1UaW1lVG9GaWxlVGltZShwdHIgcHRyKSBTeXN0ZW1UaW1lVG9GaWxlVGltZQogNjgzIHN0dWIgU3lzdGVtVGltZVRvVHpTcGVjaWZpY0xvY2FsVGltZQogNjg0IHN0dWIgVGVybWluYXRlUHJvY2VzcwpAQCAtNzA5LDcgKzcwOSw3IEBACiA3MTggc3RkY2FsbCBWaXJ0dWFsVW5sb2NrKHB0ciBsb25nKSBWaXJ0dWFsVW5sb2NrCiA3MTkgc3R1YiBXYWl0Q29tbUV2ZW50CiA3MjAgc3R1YiBXYWl0Rm9yRGVidWdFdmVudAotNzIxIHN0dWIgV2FpdEZvck11bHRpcGxlT2JqZWN0cworNzIxIHN0ZGNhbGwgV2FpdEZvck11bHRpcGxlT2JqZWN0cyhsb25nIHB0ciBsb25nIGxvbmcpIFdhaXRGb3JNdWx0aXBsZU9iamVjdHMKIDcyMiBzdHViIFdhaXRGb3JNdWx0aXBsZU9iamVjdHNFeAogNzIzIHN0ZGNhbGwgV2FpdEZvclNpbmdsZU9iamVjdChsb25nIGxvbmcpIFdhaXRGb3JTaW5nbGVPYmplY3QKIDcyNCBzdGRjYWxsIFdhaXRGb3JTaW5nbGVPYmplY3RFeChsb25nIGxvbmcgbG9uZykgV2FpdEZvclNpbmdsZU9iamVjdEV4CmRpZmYgLS1naXQgYS9pZjE2MzIvbW1zeXN0ZW0uc3BlYyBiL2lmMTYzMi9tbXN5c3RlbS5zcGVjCmluZGV4IDY4YjNhNjAuLmYyM2RmNTcgMTAwNjQ0Ci0tLSBhL2lmMTYzMi9tbXN5c3RlbS5zcGVjCisrKyBiL2lmMTYzMi9tbXN5c3RlbS5zcGVjCkBAIC0yMiw3ICsyMiw3IEBACiAyMDEgICAgcGFzY2FsICBNSURJT1VUR0VUTlVNREVWUygpIG1pZGlPdXRHZXROdW1EZXZzCiAyMDIgICAgcGFzY2FsICBNSURJT1VUR0VUREVWQ0FQUyh3b3JkIHNlZ3B0ciB3b3JkKSBtaWRpT3V0R2V0RGV2Q2FwcwogMjAzICAgIHBhc2NhbCAgTUlESU9VVEdFVEVSUk9SVEVYVCh3b3JkIHB0ciB3b3JkKSBtaWRpT3V0R2V0RXJyb3JUZXh0Ci0yMDQgICAgcGFzY2FsICBNSURJT1VUT1BFTihwdHIgd29yZCBwdHIgbG9uZyBsb25nIGxvbmcpIG1pZGlPdXRPcGVuCisyMDQgICAgcGFzY2FsICBNSURJT1VUT1BFTihwdHIgd29yZCBwdHIgbG9uZyBsb25nKSBtaWRpT3V0T3BlbgogMjA1ICAgIHBhc2NhbCAgTUlESU9VVENMT1NFKHdvcmQpIG1pZGlPdXRDbG9zZQogMjA2ICAgIHBhc2NhbCAgTUlESU9VVFBSRVBBUkVIRUFERVIod29yZCBzZWdwdHIgd29yZCkgbWlkaU91dFByZXBhcmVIZWFkZXIKIDIwNyAgICBwYXNjYWwgIE1JRElPVVRVTlBSRVBBUkVIRUFERVIod29yZCBzZWdwdHIgd29yZCkgbWlkaU91dFVucHJlcGFyZUhlYWRlcgpAQCAtMTIwLDcgKzEyMCw3IEBACiAxMjE4ICAgcGFzY2FsICBNTUlPRkxVU0god29yZCB3b3JkKSBtbWlvRmx1c2gKIDEyMTkgICBwYXNjYWwgIE1NSU9BRFZBTkNFKHdvcmQgcHRyIHdvcmQpIG1taW9BZHZhbmNlCiAxMjIwICAgcGFzY2FsICBNTUlPU1RSSU5HVE9GT1VSQ0MocHRyIHdvcmQpIG1taW9TdHJpbmdUb0ZPVVJDQwotMTIyMSAgIHBhc2NhbCAgTU1JT0lOU1RBTExJT1BST0MobG9uZyBwdHIgbG9uZykgbW1pb0luc3RhbGxJT1Byb2MKKzEyMjEgICBwYXNjYWwgIE1NSU9JTlNUQUxMSU9QUk9DKGxvbmcgcHRyIGxvbmcpIG1taW9JbnN0YWxsSU9Qcm9jMTYKIDEyMjIgICBwYXNjYWwgIE1NSU9TRU5ETUVTU0FHRSh3b3JkIHdvcmQgbG9uZyBsb25nKSBtbWlvU2VuZE1lc3NhZ2UKIDEyMjMgICBwYXNjYWwgIE1NSU9ERVNDRU5EKHdvcmQgcHRyIHB0ciB3b3JkKSBtbWlvRGVzY2VuZAogMTIyNCAgIHBhc2NhbCAgTU1JT0FTQ0VORCh3b3JkIHB0ciB3b3JkKSBtbWlvQXNjZW5kCmRpZmYgLS1naXQgYS9pZjE2MzIvcmVsYXkuYyBiL2lmMTYzMi9yZWxheS5jCmluZGV4IDZhZDdjMzIuLjA5YTgzYzIgMTAwNjQ0Ci0tLSBhL2lmMTYzMi9yZWxheS5jCisrKyBiL2lmMTYzMi9yZWxheS5jCkBAIC0xMSw3ICsxMSw2IEBACiAjaW5jbHVkZSAibW9kdWxlLmgiCiAjaW5jbHVkZSAic3RhY2tmcmFtZS5oIgogI2luY2x1ZGUgInRhc2suaCIKLSNpbmNsdWRlICJjYWxsYmFjay5oIgogI2luY2x1ZGUgInhtYWxsb2MuaCIKICNpbmNsdWRlICJzdGRkZWJ1Zy5oIgogLyogI2RlZmluZSBERUJVR19SRUxBWSAqLwpAQCAtMzUsNyArMzQsNiBAQAogCiAgICAgZXh0ZXJuIHZvaWQgQ0FMTFRPMTZfU3RhcnQoKSwgQ0FMTFRPMTZfRW5kKCk7CiAgICAgZXh0ZXJuIHZvaWQgQ0FMTFRPMTZfUmV0X3dvcmQoKSwgQ0FMTFRPMTZfUmV0X2xvbmcoKTsKLSAgICBleHRlcm4gaW50IENBTExUTzMyX0xhcmdlU3RhY2soKTsKICAgICBleHRlcm4gRFdPUkQgQ0FMTFRPMTZfUmV0QWRkcl93b3JkLCBDQUxMVE8xNl9SZXRBZGRyX2xvbmc7CiAKICAgICBjb2Rlc2VsID0gR0xPQkFMX0NyZWF0ZUJsb2NrKCBHTUVNX0ZJWEVELCAodm9pZCAqKUNBTExUTzE2X1N0YXJ0LApAQCAtNTAsMTAgKzQ4LDYgQEAKICAgICBDQUxMVE8xNl9SZXRBZGRyX2xvbmc9TUFLRUxPTkcoIChpbnQpQ0FMTFRPMTZfUmV0X2xvbmctKGludClDQUxMVE8xNl9TdGFydCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvZGVzZWwgKTsKIAotICAgIC8qIFNldCB0aGUgQ2FsbExhcmdlU3RhY2sgZnVuY3Rpb24gcG9pbnRlciAqLwotCi0gICAgSUYxNjMyX0NhbGxMYXJnZVN0YWNrID0gQ0FMTFRPMzJfTGFyZ2VTdGFjazsKLQogICAgIC8qIEluaXRpYWxpemUgdGh1bmtpbmcgKi8KIAogICAgIHJldHVybiBUSFVOS19Jbml0KCk7CkBAIC0xNjMsNyArMTU3LDcgQEAKICAgICAgICAgYnJlYWs7CiAgICAgY2FzZSAyOiAvKiByZWdzICovCiAgICAgICAgIHByaW50ZiggInJldHZhbD1ub25lIHJldD0lMDR4OiUwNHggZHM9JTA0eFxuIiwKLSAgICAgICAgICAgICAgICBmcmFtZS0+Y3MsIGZyYW1lLT5pcCwgZnJhbWUtPmRzICk7CisgICAgICAgICAgICAgICAgKFdPUkQpQ1NfcmVnKGNvbnRleHQpLCBJUF9yZWcoY29udGV4dCksIChXT1JEKURTX3JlZyhjb250ZXh0KSk7CiAgICAgICAgIHByaW50ZiggIiAgICAgQVg9JTA0eCBCWD0lMDR4IENYPSUwNHggRFg9JTA0eCBTST0lMDR4IERJPSUwNHggRVM9JTA0eCBFRkw9JTA4bHhcbiIsCiAgICAgICAgICAgICAgICAgQVhfcmVnKGNvbnRleHQpLCBCWF9yZWcoY29udGV4dCksIENYX3JlZyhjb250ZXh0KSwKICAgICAgICAgICAgICAgICBEWF9yZWcoY29udGV4dCksIFNJX3JlZyhjb250ZXh0KSwgRElfcmVnKGNvbnRleHQpLApAQCAtMTk3LDggKzE5MSw4IEBACiAgKiBhcyAnc3R1YicgaW4gdGhlIHNwZWMgZmlsZSkuCiAgKiAoVGhlIGFyZ3MgYXJlIHRoZSBzYW1lIHRoYW4gZm9yIFJFTEFZX0RlYnVnQ2FsbEZyb20zMikuCiAgKi8KLXZvaWQgUkVMQVlfVW5pbXBsZW1lbnRlZDMyKCBpbnQgbmJfYXJncywgdm9pZCAqcmVsYXlfYWRkciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkICplbnRyeV9wb2ludCwgaW50IGVicCwgaW50IHJldF9hZGRyICkKK3ZvaWQgUkVMQVlfVW5pbXBsZW1lbnRlZDMyKCB2b2lkICpyZWxheV9hZGRyLCB2b2lkICplbnRyeV9wb2ludCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgZWJwLCBpbnQgcmV0X2FkZHIgKQogewogICAgIGZwcmludGYoIHN0ZGVyciwgIk5vIGhhbmRsZXIgZm9yIFdpbjMyIHJvdXRpbmUgJXMgKGNhbGxlZCBmcm9tICUwOHgpXG4iLAogICAgICAgICAgICAgIEJVSUxUSU5fR2V0RW50cnlQb2ludDMyKCByZWxheV9hZGRyICksIHJldF9hZGRyICk7CkBAIC0yMjIsOSArMjE2LDEzIEBACiAKICAgICBpZiAobmJfYXJncyA9PSAtMSkgIC8qIFJlZ2lzdGVyIGZ1bmN0aW9uICovCiAgICAgewotICAgICAgICBDT05URVhUICpjb250ZXh0ID0gKihDT05URVhUICoqKXN0YWNrOwotICAgICAgICBwcmludGYoICJDYWxsVG8xNihmdW5jPSUwNGx4OiUwNHgsZHM9JTA0bHgpXG4iLAorICAgICAgICBDT05URVhUICpjb250ZXh0ID0gKENPTlRFWFQgKilzdGFja1swXTsKKyAgICAgICAgV09SRCAqc3RhY2sxNiA9IChXT1JEICopQ1VSUkVOVF9TVEFDSzE2IC0gMiAvKiBmb3Igc2F2ZWQgJSVlc3AgKi87CisgICAgICAgIHByaW50ZiggIkNhbGxUbzE2KGZ1bmM9JTA0bHg6JTA0eCxkcz0lMDRseCIsCiAgICAgICAgICAgICAgICAgQ1NfcmVnKGNvbnRleHQpLCBJUF9yZWcoY29udGV4dCksIERTX3JlZyhjb250ZXh0KSApOworICAgICAgICBuYl9hcmdzID0gLXN0YWNrWzFdIC8gc2l6ZW9mKFdPUkQpOworICAgICAgICB3aGlsZSAobmJfYXJncy0tKSBwcmludGYoICIsMHglMDR4IiwgKigtLXN0YWNrMTYpICk7CisgICAgICAgIHByaW50ZiggIilcbiIgKTsKICAgICAgICAgcHJpbnRmKCAiICAgICBBWD0lMDR4IEJYPSUwNHggQ1g9JTA0eCBEWD0lMDR4IFNJPSUwNHggREk9JTA0eCBCUD0lMDR4IEVTPSUwNHhcbiIsCiAgICAgICAgICAgICAgICAgQVhfcmVnKGNvbnRleHQpLCBCWF9yZWcoY29udGV4dCksIENYX3JlZyhjb250ZXh0KSwKICAgICAgICAgICAgICAgICBEWF9yZWcoY29udGV4dCksIFNJX3JlZyhjb250ZXh0KSwgRElfcmVnKGNvbnRleHQpLApAQCAtMjMzLDcgKzIzMSw4IEBACiAgICAgZWxzZQogICAgIHsKICAgICAgICAgcHJpbnRmKCAiQ2FsbFRvMTYoZnVuYz0lMDR4OiUwNHgsZHM9JTA0eCIsCi0gICAgICAgICAgICAgICAgSElXT1JEKHN0YWNrWzBdKSwgTE9XT1JEKHN0YWNrWzBdKSwgQ1VSUkVOVF9EUyApOworICAgICAgICAgICAgICAgIEhJV09SRChzdGFja1swXSksIExPV09SRChzdGFja1swXSksCisgICAgICAgICAgICAgICAgU0VMRUNUT1JPRihJRjE2MzJfU2F2ZWQxNl9zc19zcCkgKTsKICAgICAgICAgc3RhY2srKzsKICAgICAgICAgd2hpbGUgKG5iX2FyZ3MtLSkgcHJpbnRmKCAiLDB4JTA0eCIsICpzdGFjaysrICk7CiAgICAgICAgIHByaW50ZiggIilcbiIgKTsKQEAgLTMxMiwyOCArMzExLDE2IEBACiB9CiAKIAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiAgICAgICAgICAgUkVMQVlfRGVidWdDYWxsVG8zMgotICovCi12b2lkIFJFTEFZX0RlYnVnQ2FsbFRvMzIoIHVuc2lnbmVkIGludCBmdW5jLCBpbnQgbmJhcmdzLCB1bnNpZ25lZCBpbnQgYXJnMSAgKQotewotICAgIHVuc2lnbmVkIGludCAqYXJncHRyOwotCi0gICAgaWYgKCFkZWJ1Z2dpbmdfcmVsYXkpIHJldHVybjsKLQotICAgIHByaW50ZiggIkNhbGxUbzMyKGZ1bmM9JTA4eCIsIGZ1bmMgKTsKLSAgICBmb3IgKGFyZ3B0ciA9ICZhcmcxOyBuYmFyZ3M7IG5iYXJncy0tLCBhcmdwdHIrKykKLSAgICAgICAgcHJpbnRmKCAiLCUwOHgiLCAqYXJncHRyICk7Ci0gICAgcHJpbnRmKCAiKVxuIiApOwotfQotCi0KIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgKgkgICAgIENhdGNoICAgIChLRVJORUwuNTUpCisgKgorICogUmVhbCBwcm90b3R5cGUgaXM6CisgKiAgIElOVDE2IFdJTkFQSSBDYXRjaCggTFBDQVRDSEJVRiBscGJ1ZiApOwogICovCi1JTlQxNiBXSU5BUEkgQ2F0Y2goIExQQ0FUQ0hCVUYgbHBidWYgKQordm9pZCBXSU5BUEkgQ2F0Y2goIENPTlRFWFQgKmNvbnRleHQgKQogewogICAgIFNUQUNLMTZGUkFNRSAqcEZyYW1lID0gQ1VSUkVOVF9TVEFDSzE2OworICAgIExQQ0FUQ0hCVUYgbHBidWYgPSAoTFBDQVRDSEJVRilQVFJfU0VHX1RPX0xJTigqKFNFR1BUUiAqKXBGcmFtZS0+YXJncyk7CiAKICAgICAvKiBOb3RlOiB3ZSBkb24ndCBzYXZlIHRoZSBjdXJyZW50IHNzLCBhcyB0aGUgY2F0Y2ggYnVmZmVyIGlzICovCiAgICAgLyogb25seSA5IHdvcmRzIGxvbmcuIEhvcGVmdWxseSBubyBvbmUgd2lsbCBoYXZlIHRoZSBzaWxseSAgICAqLwpAQCAtMzUwLDM5ICszMzcsNDQgQEAKICAgICAgKiBscGJ1Zls3XSA9IHVudXNlZAogICAgICAqIGxwYnVmWzhdID0gc3MKICAgICAgKi8KLSAgICAvKiBGSVhNRTogd2UgbmVlZCB0byBzYXZlICVzaSBhbmQgJWRpICovCiAKLSAgICBscGJ1ZlswXSA9IHBGcmFtZS0+aXA7Ci0gICAgbHBidWZbMV0gPSBwRnJhbWUtPmNzOworICAgIGxwYnVmWzBdID0gSVBfcmVnKGNvbnRleHQpOworICAgIGxwYnVmWzFdID0gQ1NfcmVnKGNvbnRleHQpOwogICAgIGxwYnVmWzJdID0gTE9XT1JEKHBGcmFtZS0+c2F2ZWRfc3Nfc3ApOwotICAgIGxwYnVmWzNdID0gcEZyYW1lLT5icDsKLSAgICBscGJ1Zls0XSA9IExPV09SRChJRjE2MzJfU2F2ZWQzMl9lc3ApOwotICAgIGxwYnVmWzVdID0gSElXT1JEKElGMTYzMl9TYXZlZDMyX2VzcCk7Ci0gICAgbHBidWZbNl0gPSBwRnJhbWUtPmRzOworICAgIGxwYnVmWzNdID0gQlBfcmVnKGNvbnRleHQpOworICAgIGxwYnVmWzRdID0gU0lfcmVnKGNvbnRleHQpOworICAgIGxwYnVmWzVdID0gRElfcmVnKGNvbnRleHQpOworICAgIGxwYnVmWzZdID0gRFNfcmVnKGNvbnRleHQpOwogICAgIGxwYnVmWzddID0gT0ZGU0VUT0YoSUYxNjMyX1NhdmVkMTZfc3Nfc3ApOwogICAgIGxwYnVmWzhdID0gSElXT1JEKHBGcmFtZS0+c2F2ZWRfc3Nfc3ApOwotICAgIHJldHVybiAwOworICAgIEFYX3JlZyhjb250ZXh0KSA9IDA7ICAvKiBSZXR1cm4gMCAqLwogfQogCiAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgKgkgICAgIFRocm93ICAgIChLRVJORUwuNTYpCisgKgorICogUmVhbCBwcm90b3R5cGUgaXM6CisgKiAgIElOVDE2IFdJTkFQSSBUaHJvdyggTFBDQVRDSEJVRiBscGJ1ZiwgSU5UMTYgcmV0dmFsICk7CiAgKi8KLUlOVDE2IFdJTkFQSSBUaHJvdyggTFBDQVRDSEJVRiBscGJ1ZiwgSU5UMTYgcmV0dmFsICkKK3ZvaWQgV0lOQVBJIFRocm93KCBDT05URVhUICpjb250ZXh0ICkKIHsKLSAgICBTVEFDSzE2RlJBTUUgKnBGcmFtZTsKLSAgICBXT1JEIGVzID0gQ1VSUkVOVF9TVEFDSzE2LT5lczsKKyAgICBTVEFDSzE2RlJBTUUgKnBGcmFtZSA9IENVUlJFTlRfU1RBQ0sxNjsKKyAgICBMUENBVENIQlVGIGxwYnVmID0gKExQQ0FUQ0hCVUYpUFRSX1NFR19UT19MSU4oKihTRUdQVFIgKikmcEZyYW1lLT5hcmdzWzFdKTsKKyAgICBXT1JEIHJldHZhbCA9IHBGcmFtZS0+YXJnc1swXTsKIAogICAgIElGMTYzMl9TYXZlZDE2X3NzX3NwID0gTUFLRUxPTkcoIGxwYnVmWzddIC0gc2l6ZW9mKFdPUkQpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEhJV09SRChJRjE2MzJfU2F2ZWQxNl9zc19zcCkgKTsKLSAgICBJRjE2MzJfU2F2ZWQzMl9lc3AgPSBNQUtFTE9ORyggbHBidWZbNF0sIGxwYnVmWzVdICk7CiAgICAgcEZyYW1lID0gQ1VSUkVOVF9TVEFDSzE2OwogICAgIHBGcmFtZS0+c2F2ZWRfc3Nfc3AgPSBNQUtFTE9ORyggbHBidWZbMl0sIGxwYnVmWzhdICk7Ci0gICAgcEZyYW1lLT5kcyAgICAgICAgICA9IGxwYnVmWzZdOwotICAgIHBGcmFtZS0+YnAgICAgICAgICAgPSBscGJ1ZlszXTsKLSAgICBwRnJhbWUtPmlwICAgICAgICAgID0gbHBidWZbMF07Ci0gICAgcEZyYW1lLT5jcyAgICAgICAgICA9IGxwYnVmWzFdOwotICAgIHBGcmFtZS0+ZXMgICAgICAgICAgPSBlczsKKyAgICBJUF9yZWcoY29udGV4dCkgPSBscGJ1ZlswXTsKKyAgICBDU19yZWcoY29udGV4dCkgPSBscGJ1ZlsxXTsKKyAgICBCUF9yZWcoY29udGV4dCkgPSBscGJ1ZlszXTsKKyAgICBTSV9yZWcoY29udGV4dCkgPSBscGJ1Zls0XTsKKyAgICBESV9yZWcoY29udGV4dCkgPSBscGJ1Zls1XTsKKyAgICBEU19yZWcoY29udGV4dCkgPSBscGJ1Zls2XTsKKyAgICBBWF9yZWcoY29udGV4dCkgPSByZXR2YWw7CisKICAgICBpZiAoZGVidWdnaW5nX3JlbGF5KSAgLyogTWFrZSBzdXJlIHdlIGhhdmUgYSB2YWxpZCBlbnRyeSBwb2ludCBhZGRyZXNzICovCiAgICAgewogICAgICAgICBzdGF0aWMgRkFSUFJPQzE2IGVudHJ5UG9pbnQgPSBOVUxMOwpAQCAtMzkzLDEzICszODUsMTIgQEAKICAgICAgICAgcEZyYW1lLT5lbnRyeV9jcyA9IFNFTEVDVE9ST0YoZW50cnlQb2ludCk7CiAgICAgICAgIHBGcmFtZS0+ZW50cnlfaXAgPSBPRkZTRVRPRihlbnRyeVBvaW50KTsKICAgICB9Ci0gICAgcmV0dXJuIHJldHZhbDsKIH0KIAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCSAgICAgQ2FsbFByb2MzMlcgICAgKEtFUk5FTC41NikKKyAqCSAgICAgQ2FsbFByb2MzMlcgICAgKEtFUk5FTC41MTcpCiAgKi8KLURXT1JEIC8qV0lOQVBJKi8gV0lOMTZfQ2FsbFByb2MzMlcoKQorRFdPUkQgV0lOQVBJIFdJTjE2X0NhbGxQcm9jMzJXKCkKIHsKIAlEV09SRCAqd2luX3N0YWNrID0gKERXT1JEICopQ1VSUkVOVF9TVEFDSzE2LT5hcmdzOwogCURXT1JECW5yb2ZhcmdzID0gd2luX3N0YWNrWzBdOwpAQCAtNDIyLDIxICs0MTMsMjEgQEAKIAl9CiAJZnByaW50ZihzdGRlcnIsIl0pIC0gIik7CiAJc3dpdGNoIChucm9mYXJncykgewotCWNhc2UgMDogcmV0ID0gQ2FsbFRvMzJfMChwcm9jMzIpOworCWNhc2UgMDogcmV0ID0gcHJvYzMyKCk7CiAJCWJyZWFrOwotCWNhc2UgMToJcmV0ID0gQ2FsbFRvMzJfMShwcm9jMzIsYXJnc1swXSk7CisJY2FzZSAxOglyZXQgPSBwcm9jMzIoYXJnc1swXSk7CiAJCWJyZWFrOwotCWNhc2UgMjoJcmV0ID0gQ2FsbFRvMzJfMihwcm9jMzIsYXJnc1swXSxhcmdzWzFdKTsKKwljYXNlIDI6CXJldCA9IHByb2MzMihhcmdzWzBdLGFyZ3NbMV0pOwogCQlicmVhazsKLQljYXNlIDM6CXJldCA9IENhbGxUbzMyXzMocHJvYzMyLGFyZ3NbMF0sYXJnc1sxXSxhcmdzWzJdKTsKKwljYXNlIDM6CXJldCA9IHByb2MzMihhcmdzWzBdLGFyZ3NbMV0sYXJnc1syXSk7CiAJCWJyZWFrOwotCWNhc2UgNDoJcmV0ID0gQ2FsbFRvMzJfNChwcm9jMzIsYXJnc1swXSxhcmdzWzFdLGFyZ3NbMl0sYXJnc1szXSk7CisJY2FzZSA0OglyZXQgPSBwcm9jMzIoYXJnc1swXSxhcmdzWzFdLGFyZ3NbMl0sYXJnc1szXSk7CiAJCWJyZWFrOwotCWNhc2UgNToJcmV0ID0gQ2FsbFRvMzJfNShwcm9jMzIsYXJnc1swXSxhcmdzWzFdLGFyZ3NbMl0sYXJnc1szXSxhcmdzWzRdKTsKKwljYXNlIDU6CXJldCA9IHByb2MzMihhcmdzWzBdLGFyZ3NbMV0sYXJnc1syXSxhcmdzWzNdLGFyZ3NbNF0pOwogCQlicmVhazsKLQljYXNlIDY6CXJldCA9IENhbGxUbzMyXzYocHJvYzMyLGFyZ3NbMF0sYXJnc1sxXSxhcmdzWzJdLGFyZ3NbM10sYXJnc1s0XSxhcmdzWzVdKTsKKwljYXNlIDY6CXJldCA9IHByb2MzMihhcmdzWzBdLGFyZ3NbMV0sYXJnc1syXSxhcmdzWzNdLGFyZ3NbNF0sYXJnc1s1XSk7CiAJCWJyZWFrOwotCWNhc2UgNzoJcmV0ID0gQ2FsbFRvMzJfNyhwcm9jMzIsYXJnc1swXSxhcmdzWzFdLGFyZ3NbMl0sYXJnc1szXSxhcmdzWzRdLGFyZ3NbNV0sYXJnc1s2XSk7CisJY2FzZSA3OglyZXQgPSBwcm9jMzIoYXJnc1swXSxhcmdzWzFdLGFyZ3NbMl0sYXJnc1szXSxhcmdzWzRdLGFyZ3NbNV0sYXJnc1s2XSk7CiAJCWJyZWFrOwogCWRlZmF1bHQ6CiAJCS8qIEZJWE1FOiBzaG91bGQgZ28gdXAgdG8gMzIgIGFyZ3VtZW50cyAqLwpkaWZmIC0tZ2l0IGEvaWYxNjMyL3NpZ25hbC5jIGIvaWYxNjMyL3NpZ25hbC5jCmluZGV4IDA2ODkwZGIuLmQ1ODEwZDEgMTAwNjQ0Ci0tLSBhL2lmMTYzMi9zaWduYWwuYworKysgYi9pZjE2MzIvc2lnbmFsLmMKQEAgLTM1LDE3ICszNSwxNCBAQAogLyogU2lnbmFsIGhhbmRsZXIgZGVjbGFyYXRpb24gKi8KIAogI2lmZGVmIGxpbnV4Ci0jZGVmaW5lIEhBTkRMRVJfREVGKG5hbWUpIHZvaWQgbmFtZSAoaW50IHNpZ25hbCwgU0lHQ09OVEVYVCBjb250ZXh0X3N0cnVjdCkKLSNkZWZpbmUgSEFORExFUl9QUk9MT0cgU0lHQ09OVEVYVCAqY29udGV4dCA9ICZjb250ZXh0X3N0cnVjdDsgewotI2RlZmluZSBIQU5ETEVSX0VQSUxPRyB9CisjIGRlZmluZSBIQU5ETEVSX0RFRihuYW1lKSB2b2lkIG5hbWUgKGludCBzaWduYWwsIFNJR0NPTlRFWFQgY29udGV4dCkKKyMgZGVmaW5lIEhBTkRMRVJfQ09OVEVYVCAoJmNvbnRleHQpCiAjZWxpZiBkZWZpbmVkKF9fc3ZyNF9fKSB8fCBkZWZpbmVkKF9TQ09fRFMpCi0jZGVmaW5lIEhBTkRMRVJfREVGKG5hbWUpIHZvaWQgbmFtZSAoaW50IHNpZ25hbCwgdm9pZCAqc2lnaW5mbywgU0lHQ09OVEVYVCAqY29udGV4dCkKLSNkZWZpbmUgSEFORExFUl9QUk9MT0cgIC8qIG5vdGhpbmcgKi8KLSNkZWZpbmUgSEFORExFUl9FUElMT0cgIC8qIG5vdGhpbmcgKi8KKyMgZGVmaW5lIEhBTkRMRVJfREVGKG5hbWUpIHZvaWQgbmFtZShpbnQgc2lnbmFsLCB2b2lkICpzaWdpbmZvLCBTSUdDT05URVhUICpjb250ZXh0KQorIyBkZWZpbmUgSEFORExFUl9DT05URVhUIGNvbnRleHQKICNlbHNlCi0jZGVmaW5lIEhBTkRMRVJfREVGKG5hbWUpIHZvaWQgbmFtZSAoaW50IHNpZ25hbCwgaW50IGNvZGUsIFNJR0NPTlRFWFQgKmNvbnRleHQpCi0jZGVmaW5lIEhBTkRMRVJfUFJPTE9HICAvKiBub3RoaW5nICovCi0jZGVmaW5lIEhBTkRMRVJfRVBJTE9HICAvKiBub3RoaW5nICovCisjIGRlZmluZSBIQU5ETEVSX0RFRihuYW1lKSB2b2lkIG5hbWUoaW50IHNpZ25hbCwgaW50IGNvZGUsIFNJR0NPTlRFWFQgKmNvbnRleHQpCisjIGRlZmluZSBIQU5ETEVSX0NPTlRFWFQgY29udGV4dAogI2VuZGlmCiAKIGV4dGVybiB2b2lkIFNJR05BTF9TZXRIYW5kbGVyKCBpbnQgc2lnLCB2b2lkICgqZnVuYykoKSwgaW50IGZsYWdzICk7CkBAIC01OSwxMCArNTYsOSBAQAogICovCiBzdGF0aWMgSEFORExFUl9ERUYoU0lHTkFMX2JyZWFrKQogewotICAgIEhBTkRMRVJfUFJPTE9HOwotICAgIGlmIChPcHRpb25zLmRlYnVnKSB3aW5lX2RlYnVnKCBzaWduYWwsIGNvbnRleHQgKTsgIC8qIEVudGVyIG91ciBkZWJ1Z2dlciAqLworICAgIGlmIChPcHRpb25zLmRlYnVnKQorICAgICAgICB3aW5lX2RlYnVnKCBzaWduYWwsIEhBTkRMRVJfQ09OVEVYVCApOyAgLyogRW50ZXIgb3VyIGRlYnVnZ2VyICovCiAgICAgZWxzZSBleGl0KDApOwotICAgIEhBTkRMRVJfRVBJTE9HOwogfQogCiAKQEAgLTczLDkgKzY5LDcgQEAKICAqLwogc3RhdGljIEhBTkRMRVJfREVGKFNJR05BTF90cmFwKQogewotICBIQU5ETEVSX1BST0xPRzsKLSAgd2luZV9kZWJ1Zyggc2lnbmFsLCBjb250ZXh0ICk7ICAvKiBFbnRlciBvdXIgZGVidWdnZXIgKi8KLSAgSEFORExFUl9FUElMT0c7CisgICAgd2luZV9kZWJ1Zyggc2lnbmFsLCBIQU5ETEVSX0NPTlRFWFQgKTsgIC8qIEVudGVyIG91ciBkZWJ1Z2dlciAqLwogfQogCiAKQEAgLTg2LDIxICs4MCwxOCBAQAogICovCiBzdGF0aWMgSEFORExFUl9ERUYoU0lHTkFMX2ZhdWx0KQogewotICAgIEhBTkRMRVJfUFJPTE9HOwotICAgIGlmIChDU19zaWcoY29udGV4dCkgPT0gV0lORV9DT0RFX1NFTEVDVE9SKQorICAgIGlmIChDU19zaWcoSEFORExFUl9DT05URVhUKSA9PSBXSU5FX0NPREVfU0VMRUNUT1IpCiAgICAgewotICAgICAgICBmcHJpbnRmKCBzdGRlcnIsICJTZWdtZW50YXRpb24gZmF1bHQgaW4gV2luZSBwcm9ncmFtICglMDR4OiUwOGx4KS4iCi0gICAgICAgICAgICAgICAgICAgICAgICAgIiAgUGxlYXNlIGRlYnVnLlxuIiwKLSAgICAgICAgICAgICAgICAgKHVuc2lnbmVkIHNob3J0KSBDU19zaWcoY29udGV4dCksIEVJUF9zaWcoY29udGV4dCkpOworICAgICAgICBmcHJpbnRmKCBzdGRlcnIsICJTZWdtZW50YXRpb24gZmF1bHQgaW4gMzItYml0IGNvZGUgKDB4JTA4bHgpLlxuIiwKKyAgICAgICAgICAgICAgICAgRUlQX3NpZyhIQU5ETEVSX0NPTlRFWFQpICk7CiAgICAgfQogICAgIGVsc2UKICAgICB7Ci0gICAgICAgIGlmIChJTlNUUl9FbXVsYXRlSW5zdHJ1Y3Rpb24oIGNvbnRleHQgKSkgcmV0dXJuOwotICAgICAgICBmcHJpbnRmKCBzdGRlcnIsICJTZWdtZW50YXRpb24gZmF1bHQgaW4gV2luZG93cyBwcm9ncmFtICUwNHg6JTA4bHguXG4iLAotICAgICAgICAgICAgICAgICAodW5zaWduZWQgc2hvcnQpIENTX3NpZyhjb250ZXh0KSwgRUlQX3NpZyhjb250ZXh0KSApOworICAgICAgICBpZiAoSU5TVFJfRW11bGF0ZUluc3RydWN0aW9uKCBIQU5ETEVSX0NPTlRFWFQgKSkgcmV0dXJuOworICAgICAgICBmcHJpbnRmKCBzdGRlcnIsICJTZWdtZW50YXRpb24gZmF1bHQgaW4gMTYtYml0IGNvZGUgKCUwNHg6JTA0bHgpLlxuIiwKKyAgICAgICAgICAgICAgICAgKFdPUkQpQ1Nfc2lnKEhBTkRMRVJfQ09OVEVYVCksIEVJUF9zaWcoSEFORExFUl9DT05URVhUKSApOwogICAgIH0KLSAgICB3aW5lX2RlYnVnKCBzaWduYWwsIGNvbnRleHQgKTsKLSAgICBIQU5ETEVSX0VQSUxPRzsKKyAgICB3aW5lX2RlYnVnKCBzaWduYWwsIEhBTkRMRVJfQ09OVEVYVCApOwogfQogCiAKQEAgLTIwNSwxMiArMTk2LDEwIEBACiAgKi8KIHN0YXRpYyBIQU5ETEVSX0RFRihTSUdOQUxfdGljaykKIHsKLSAgICBIQU5ETEVSX1BST0xPRwogICAgIENPTlRFWFQgbnRfY29udGV4dDsKLSAgICBTSUdOQUxfU2V0U2lnQ29udGV4dCggY29udGV4dCwgJm50X2NvbnRleHQgKTsKKyAgICBTSUdOQUxfU2V0U2lnQ29udGV4dCggSEFORExFUl9DT05URVhULCAmbnRfY29udGV4dCApOwogICAgIGlmIChUSFJFQURfU3dpdGNoVGhyZWFkKCAmbnRfY29udGV4dCApKQotICAgICAgICBTSUdOQUxfR2V0U2lnQ29udGV4dCggY29udGV4dCwgJm50X2NvbnRleHQgKTsKLSAgICBIQU5ETEVSX0VQSUxPRworICAgICAgICBTSUdOQUxfR2V0U2lnQ29udGV4dCggSEFORExFUl9DT05URVhULCAmbnRfY29udGV4dCApOwogfQogCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgpkaWZmIC0tZ2l0IGEvaWYxNjMyL3RodW5rLmMgYi9pZjE2MzIvdGh1bmsuYwppbmRleCA5MDFhOWJiLi4yZGExYTNkIDEwMDY0NAotLS0gYS9pZjE2MzIvdGh1bmsuYworKysgYi9pZjE2MzIvdGh1bmsuYwpAQCAtMTUsNyArMTUsMTAgQEAKICNpbmNsdWRlICJtb2R1bGUuaCIKICNpbmNsdWRlICJ3aW5wcm9jLmgiCiAjaW5jbHVkZSAic3RhY2tmcmFtZS5oIgorI2luY2x1ZGUgInNlbGVjdG9ycy5oIgorI2luY2x1ZGUgInRhc2suaCIKICNpbmNsdWRlICJleGNlcHQuaCIKKyNpbmNsdWRlICJ3aW4uaCIKICNpbmNsdWRlICJzdGRkZWJ1Zy5oIgogI2luY2x1ZGUgImRlYnVnLmgiCiAKQEAgLTExNywyMCArMTIwLDQ0IEBACiBzdGF0aWMgTFJFU1VMVCBUSFVOS19DYWxsV25kUHJvYzE2KCBXTkRQUk9DMTYgcHJvYywgSFdORDE2IGh3bmQsIFVJTlQxNiBtc2csCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBXUEFSQU0xNiB3UGFyYW0sIExQQVJBTSBsUGFyYW0gKQogeworICAgIENPTlRFWFQgY29udGV4dDsKKyAgICBMUkVTVUxUIHJldDsKKyAgICBXT1JEICphcmdzOworICAgIFdORCAqd25kUHRyID0gV0lOX0ZpbmRXbmRQdHIoIGh3bmQgKTsKKyAgICBEV09SRCBvZmZzZXQgPSAwOworCisgICAgLyogV2luZG93IHByb2NlZHVyZXMgd2FudCBheCA9IGhJbnN0YW5jZSwgZHMgPSBlcyA9IHNzICovCisKKyAgICBEU19yZWcoJmNvbnRleHQpICA9IFNFTEVDVE9ST0YoSUYxNjMyX1NhdmVkMTZfc3Nfc3ApOworICAgIEVTX3JlZygmY29udGV4dCkgID0gRFNfcmVnKCZjb250ZXh0KTsKKyAgICBFQVhfcmVnKCZjb250ZXh0KSA9IHduZFB0ciA/IHduZFB0ci0+aEluc3RhbmNlIDogRFNfcmVnKCZjb250ZXh0KTsKKyAgICBDU19yZWcoJmNvbnRleHQpICA9IFNFTEVDVE9ST0YocHJvYyk7CisgICAgRUlQX3JlZygmY29udGV4dCkgPSBPRkZTRVRPRihwcm9jKTsKKyAgICBFQlBfcmVnKCZjb250ZXh0KSA9IE9GRlNFVE9GKElGMTYzMl9TYXZlZDE2X3NzX3NwKQorICAgICAgICAgICAgICAgICAgICAgICAgKyAoV09SRCkmKChTVEFDSzE2RlJBTUUqKTApLT5icDsKKwogICAgIGlmICgoKG1zZyA9PSBXTV9DUkVBVEUpIHx8IChtc2cgPT0gV01fTkNDUkVBVEUpKSAmJiBsUGFyYW0pCiAgICAgewotICAgICAgICBDUkVBVEVTVFJVQ1QxNiAqY3MgPSAoQ1JFQVRFU1RSVUNUMTYgKilQVFJfU0VHX1RPX0xJTihsUGFyYW0pOwogICAgICAgICAvKiBCdWlsZCB0aGUgQ1JFQVRFU1RSVUNUIG9uIHRoZSAxNi1iaXQgc3RhY2suICovCiAgICAgICAgIC8qIFRoaXMgaXMgcmVhbGx5IHVnbHksIGJ1dCBzb21lIHByb2dyYW1zIChub3RhYmx5IHRoZSAqLwogICAgICAgICAvKiAiVW5kb2N1bWVudGVkIFdpbmRvd3MiIGV4YW1wbGVzKSB3YW50IGl0IHRoYXQgd2F5LiAgKi8KLSAgICAgICAgcmV0dXJuIENhbGxUbzE2X3duZHBfbGxsbGxsbHdsd3d3bCggKEZBUlBST0MxNilwcm9jLAotICAgICAgICAgICAgICAgICAgICAgICAgIGNzLT5kd0V4U3R5bGUsIGNzLT5scHN6Q2xhc3MsIGNzLT5scHN6TmFtZSwgY3MtPnN0eWxlLAotICAgICAgICAgICAgICAgICAgICAgICAgIE1BS0VMT05HKCBjcy0+eSwgY3MtPnggKSwgTUFLRUxPTkcoIGNzLT5jeSwgY3MtPmN4ICksCi0gICAgICAgICAgICAgICAgICAgICAgICAgTUFLRUxPTkcoIGNzLT5oTWVudSwgY3MtPmh3bmRQYXJlbnQgKSwgY3MtPmhJbnN0YW5jZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAoTE9ORyljcy0+bHBDcmVhdGVQYXJhbXMsIGh3bmQsIG1zZywgd1BhcmFtLAotICAgICAgICAgICAgICAgICAgICAgICAgIElGMTYzMl9TYXZlZDE2X3NzX3NwIC0gc2l6ZW9mKENSRUFURVNUUlVDVDE2KSApOworICAgICAgICBDUkVBVEVTVFJVQ1QxNiAqY3MgPSAoQ1JFQVRFU1RSVUNUMTYgKilQVFJfU0VHX1RPX0xJTihsUGFyYW0pOworICAgICAgICBvZmZzZXQgPSBzaXplb2YoKmNzKTsKKyAgICAgICAgbWVtY3B5KCAoY2hhciAqKUNVUlJFTlRfU1RBQ0sxNiAtIG9mZnNldCwgY3MsIG9mZnNldCApOworICAgICAgICBJRjE2MzJfU2F2ZWQxNl9zc19zcCAtPSBvZmZzZXQ7CisgICAgICAgIGxQYXJhbSA9IElGMTYzMl9TYXZlZDE2X3NzX3NwOwogICAgIH0KLSAgICByZXR1cm4gQ2FsbFRvMTZfd25kcF93d3dsKCAoRkFSUFJPQzE2KXByb2MsIGh3bmQsIG1zZywgd1BhcmFtLCBsUGFyYW0gKTsKKyAgICBhcmdzID0gKFdPUkQgKilDVVJSRU5UX1NUQUNLMTYgLSA3OworICAgIGFyZ3NbMF0gPSBMT1dPUkQobFBhcmFtKTsKKyAgICBhcmdzWzFdID0gSElXT1JEKGxQYXJhbSk7CisgICAgYXJnc1syXSA9IHdQYXJhbTsKKyAgICBhcmdzWzNdID0gbXNnOworICAgIGFyZ3NbNF0gPSBod25kOworICAgIC8qIGFyZ3NbNV0gYW5kIGFyZ3NbNl0gYXJlIHVzZWQgYnkgcmVsYXkgY29kZSB0byBzdG9yZSB0aGUgc3RhY2sgcG9pbnRlciAqLworCisgICAgcmV0ID0gQ2FsbFRvMTZfcmVnc18oICZjb250ZXh0LCAtKDUgKiBzaXplb2YoV09SRCkpICk7CisgICAgSUYxNjMyX1NhdmVkMTZfc3Nfc3AgKz0gb2Zmc2V0OworICAgIHJldHVybiByZXQ7CiB9CiAKIApAQCAtNjA4LDcgKzYzNSw2IEBACiAgKgkJc3A6CQogICoJCQogICovCi1leHRlcm4gRFdPUkQgSUYxNjMyX1NhdmVkMTZfc3Nfc3A7CiBWT0lEIFdJTkFQSSBRVF9UaHVuayhDT05URVhUICpjb250ZXh0KQogewogCUNPTlRFWFQJY29udGV4dDE2OwpAQCAtNjIxLDE5ICs2NDcsMTYgQEAKIAkpOwogCW1lbWNweSgmY29udGV4dDE2LGNvbnRleHQsc2l6ZW9mKGNvbnRleHQxNikpOwogCi0JY3Vyc3RhY2sgPSBQVFJfU0VHX1RPX0xJTihJRjE2MzJfU2F2ZWQxNl9zc19zcCk7Ci0JbWVtY3B5KGN1cnN0YWNrLTB4NDAsKExQQllURSlFQlBfcmVnKGNvbnRleHQpLDB4NDApOworCWN1cnN0YWNrID0gKExQQllURSlDVVJSRU5UX1NUQUNLMTY7CisJbWVtY3B5KGN1cnN0YWNrLTB4NDQsKExQQllURSlFQlBfcmVnKGNvbnRleHQpLDB4NDApOwogCUVCUF9yZWcoJmNvbnRleHQxNikJID0gTE9XT1JEKElGMTYzMl9TYXZlZDE2X3NzX3NwKS0weDQwOwotCUlGMTYzMl9TYXZlZDE2X3NzX3NwCS09IDB4M2M7Ci0KIAlDU19yZWcoJmNvbnRleHQxNikJID0gSElXT1JEKEVEWF9yZWcoY29udGV4dCkpOwogCUlQX3JlZygmY29udGV4dDE2KQkgPSBMT1dPUkQoRURYX3JlZyhjb250ZXh0KSk7CiAjaWZuZGVmIFdJTkVMSUIKLQlyZXQgPSBDYWxsVG8xNl9yZWdzXygmY29udGV4dDE2KTsKKwlyZXQgPSBDYWxsVG8xNl9yZWdzXygmY29udGV4dDE2LC0weDQwKTsKICNlbmRpZgogCWZwcmludGYoc3RkZXJyLCIuIHJldHVybmVkICUwOGx4XG4iLHJldCk7CiAJRUFYX3JlZyhjb250ZXh0KSAJID0gcmV0OwotCUlGMTYzMl9TYXZlZDE2X3NzX3NwCSs9IDB4M2M7CiB9CiAKIApAQCAtNjUxLDE3ICs2NzQsMjMgQEAKIAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgKiAgICAgICAgICAgX0tFUk5FTDMyXzUyICAgIChLRVJORUwzMi41MikKLSAqIEZJWE1FOiB3aGF0IGRvZXMgaXQgcmVhbGx5IGRvPworICogUmV0dXJucyBhIHBvaW50ZXIgdG8gVGhrQnVmIGluIHRoZSAxNmJpdCBsaWJyYXJ5IFNZU1RIVU5LLkRMTC4KICAqLwotVk9JRCBXSU5BUEkgX0tFUk5FTDMyXzUyKERXT1JEIGFyZzEsQ09OVEVYVCAqcmVncykKK0xQVk9JRCBXSU5BUEkgX0tFUk5FTDMyXzUyKCkKIHsKLQlmcHJpbnRmKHN0ZGVyciwiX0tFUk5FMzJfNTIoYXJnMT0lMDhseCwlMDhseClcbiIsYXJnMSxFRElfcmVnKHJlZ3MpKTsKKwlITU9EVUxFMzIJaG1vZCA9IExvYWRMaWJyYXJ5MTYoInN5c3RodW5rLmRsbCIpOworCURXT1JECQlyZXQ7CiAKLQlFQVhfcmVnKHJlZ3MpID0gKERXT1JEKVdJTjMyX0dldFByb2NBZGRyZXNzMTYoRURJX3JlZyhyZWdzKSwiVGhrQnVmIik7CisJZnByaW50ZihzdGRlcnIsIl9LRVJORTMyXzUyKClcbiIpOworCWlmIChobW9kPD0zMikKKwkJcmV0dXJuIDA7CiAKLQlmcHJpbnRmKHN0ZGVyciwiCUdldFByb2NBZGRyZXNzMTYoXCJUaGtCdWZcIikgcmV0dXJucyAlMDhseFxuIiwKLQkJCUVBWF9yZWcocmVncykKKwlyZXQgPSAoRFdPUkQpV0lOMzJfR2V0UHJvY0FkZHJlc3MxNihobW9kLCJUaGtCdWYiKTsKKworCWZwcmludGYoc3RkZXJyLCIJR2V0UHJvY0FkZHJlc3MxNigweCUwNHgsXCJUaGtCdWZcIikgcmV0dXJucyAlMDhseFxuIiwKKwkJCWhtb2QscmV0CiAJKTsKKwlyZXR1cm4gUFRSX1NFR19UT19MSU4ocmV0KTsKIH0KIAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCkBAIC02NzQsNyArNzAzLDcgQEAKICAqIFRoZSBwb2ludGVyIHB0ciBpcyB3cml0dGVuIGludG8gdGhlIGZpcnN0IERXT1JEIG9mICd0aHVuaycuCiAgKiAocHJvYmFibHkgY29ycmVjdCBpbXBsZW1lbnRlZCkKICAqLwotQk9PTDMyIFdJTkFQSSBfS0VSTkVMMzJfNDMoTFBEV09SRCB0aHVuayxMUENTVFIgdGhrYnVmLERXT1JEIGxlbiwKK0RXT1JEIFdJTkFQSSBfS0VSTkVMMzJfNDMoTFBEV09SRCB0aHVuayxMUENTVFIgdGhrYnVmLERXT1JEIGxlbiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIExQQ1NUUiBkbGwxNixMUENTVFIgZGxsMzIpCiB7CiAJSElOU1RBTkNFMTYJaG1vZDsKQEAgLTY4NiwxNyArNzE1LDE3IEBACiAJaG1vZCA9IExvYWRMaWJyYXJ5MTYoZGxsMTYpOwogCWlmIChobW9kPDMyKSB7CiAJCWZwcmludGYoc3RkZXJyLCItPmZhaWxlZCB0byBsb2FkIDE2Yml0IERMTCAlcywgZXJyb3IgJWRcbiIsZGxsMTYsaG1vZCk7Ci0JCXJldHVybiBOVUxMOworCQlyZXR1cm4gMDsKIAl9CiAJc2VnYWRkciA9IChEV09SRClXSU4zMl9HZXRQcm9jQWRkcmVzczE2KGhtb2QsKExQU1RSKXRoa2J1Zik7CiAJaWYgKCFzZWdhZGRyKSB7CiAJCWZwcmludGYoc3RkZXJyLCItPm5vICVzIGV4cG9ydGVkIGZyb20gJXMhXG4iLHRoa2J1ZixkbGwxNik7Ci0JCXJldHVybiBOVUxMOworCQlyZXR1cm4gMDsKIAl9CiAJYWRkciA9IChMUERXT1JEKVBUUl9TRUdfVE9fTElOKHNlZ2FkZHIpOwogCWlmIChhZGRyWzBdICE9IGxlbikgewogCQlmcHJpbnRmKHN0ZGVyciwiLT50aGtidWYgbGVuZ3RoIG1pc21hdGNoPyAlbGQgdnMgJWxkXG4iLGxlbixhZGRyWzBdKTsKLQkJcmV0dXJuIE5VTEw7CisJCXJldHVybiAwOwogCX0KIAlpZiAoIWFkZHJbMV0pCiAJCXJldHVybiAwOwpAQCAtNzI2LDEyICs3NTUsMTAgQEAKIAogCW1lbWNweSgmY29udGV4dDE2LGNvbnRleHQsc2l6ZW9mKGNvbnRleHQxNikpOwogCi0JY3Vyc3RhY2sgPSBQVFJfU0VHX1RPX0xJTihJRjE2MzJfU2F2ZWQxNl9zc19zcCk7Ci0JbWVtY3B5KGN1cnN0YWNrLXN0YWNrc2l6ZSwoTFBCWVRFKUVCUF9yZWcoY29udGV4dCksc3RhY2tzaXplKTsKKwljdXJzdGFjayA9IChMUEJZVEUpQ1VSUkVOVF9TVEFDSzE2OworCW1lbWNweShjdXJzdGFjay1zdGFja3NpemUtNCwoTFBCWVRFKUVCUF9yZWcoY29udGV4dCksc3RhY2tzaXplKTsKIAlmcHJpbnRmKHN0ZGVyciwiSUYxNjMyX1NhdmVkMTZfc3Nfc3AgaXMgMHglMDhseFxuIixJRjE2MzJfU2F2ZWQxNl9zc19zcCk7CiAJRUJQX3JlZygmY29udGV4dDE2KQkgPSBMT1dPUkQoSUYxNjMyX1NhdmVkMTZfc3Nfc3ApLXN0YWNrc2l6ZTsKLQlJRjE2MzJfU2F2ZWQxNl9zc19zcAktPSBzdGFja3NpemU7Ci0KIAlESV9yZWcoJmNvbnRleHQxNikJID0gQ1hfcmVnKGNvbnRleHQpOwogCUNTX3JlZygmY29udGV4dDE2KQkgPSBISVdPUkQoRUFYX3JlZyhjb250ZXh0KSk7CiAJSVBfcmVnKCZjb250ZXh0MTYpCSA9IExPV09SRChFQVhfcmVnKGNvbnRleHQpKTsKQEAgLTczOSwxMiArNzY2LDEwIEBACiAJICogbmVlZGVkCiAJICovCiAjaWZuZGVmIFdJTkVMSUIKLQlyZXQgPSBDYWxsVG8xNl9yZWdzXygmY29udGV4dDE2KTsKKwlyZXQgPSBDYWxsVG8xNl9yZWdzXygmY29udGV4dDE2LC1zdGFja3NpemUpOwogI2VuZGlmCiAJZnByaW50ZihzdGRlcnIsIi4gcmV0dXJuZWQgJTA4bHhcbiIscmV0KTsKIAlFQVhfcmVnKGNvbnRleHQpIAkgPSByZXQ7Ci0JSUYxNjMyX1NhdmVkMTZfc3Nfc3AJKz0gc3RhY2tzaXplOwotCiB9CiAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgpAQCAtOTA1LDMzICs5MzAsMzIgQEAKICAgICBmcHJpbnRmKHN0ZGVyciwiS0VSTkVMMzJfODgoJWxkLDB4JTA4bHgsJXAsWyAiLG5yLGZsYWdzLGZ1bik7CiAgICAgZm9yIChpPTA7aTxuci80O2krKykgZnByaW50ZihzdGRlcnIsIjB4JTA4bHgsIixhcmdzW2ldKTsKICAgICBmcHJpbnRmKHN0ZGVyciwiXSkiKTsKLSNpZm5kZWYgV0lORUxJQgogICAgIHN3aXRjaCAobnIpIHsKLSAgICBjYXNlIDA6CXJldCA9IENhbGxUbzMyXzAoZnVuKTsKKyAgICBjYXNlIDA6CXJldCA9IGZ1bigpOwogCQlicmVhazsKLSAgICBjYXNlIDQ6CXJldCA9IENhbGxUbzMyXzEoZnVuLGFyZ3NbMF0pOworICAgIGNhc2UgNDoJcmV0ID0gZnVuKGFyZ3NbMF0pOwogCQlicmVhazsKLSAgICBjYXNlIDg6CXJldCA9IENhbGxUbzMyXzIoZnVuLGFyZ3NbMF0sYXJnc1sxXSk7CisgICAgY2FzZSA4OglyZXQgPSBmdW4oYXJnc1swXSxhcmdzWzFdKTsKIAkJYnJlYWs7Ci0gICAgY2FzZSAxMjoJcmV0ID0gQ2FsbFRvMzJfMyhmdW4sYXJnc1swXSxhcmdzWzFdLGFyZ3NbMl0pOworICAgIGNhc2UgMTI6CXJldCA9IGZ1bihhcmdzWzBdLGFyZ3NbMV0sYXJnc1syXSk7CiAJCWJyZWFrOwotICAgIGNhc2UgMTY6CXJldCA9IENhbGxUbzMyXzQoZnVuLGFyZ3NbMF0sYXJnc1sxXSxhcmdzWzJdLGFyZ3NbM10pOworICAgIGNhc2UgMTY6CXJldCA9IGZ1bihhcmdzWzBdLGFyZ3NbMV0sYXJnc1syXSxhcmdzWzNdKTsKIAkJYnJlYWs7Ci0gICAgY2FzZSAyMDoJcmV0ID0gQ2FsbFRvMzJfNShmdW4sYXJnc1swXSxhcmdzWzFdLGFyZ3NbMl0sYXJnc1szXSxhcmdzWzRdKTsKKyAgICBjYXNlIDIwOglyZXQgPSBmdW4oYXJnc1swXSxhcmdzWzFdLGFyZ3NbMl0sYXJnc1szXSxhcmdzWzRdKTsKIAkJYnJlYWs7Ci0gICAgY2FzZSAyNDoJcmV0ID0gQ2FsbFRvMzJfNihmdW4sYXJnc1swXSxhcmdzWzFdLGFyZ3NbMl0sYXJnc1szXSxhcmdzWzRdLGFyZ3NbNV0pOworICAgIGNhc2UgMjQ6CXJldCA9IGZ1bihhcmdzWzBdLGFyZ3NbMV0sYXJnc1syXSxhcmdzWzNdLGFyZ3NbNF0sYXJnc1s1XSk7CiAJCWJyZWFrOwotICAgIGNhc2UgMjg6CXJldCA9IENhbGxUbzMyXzcoZnVuLGFyZ3NbMF0sYXJnc1sxXSxhcmdzWzJdLGFyZ3NbM10sYXJnc1s0XSxhcmdzWzVdLGFyZ3NbNl0pOworICAgIGNhc2UgMjg6CXJldCA9IGZ1bihhcmdzWzBdLGFyZ3NbMV0sYXJnc1syXSxhcmdzWzNdLGFyZ3NbNF0sYXJnc1s1XSxhcmdzWzZdKTsKIAkJYnJlYWs7Ci0gICAgY2FzZSAzMjoJcmV0ID0gQ2FsbFRvMzJfOChmdW4sYXJnc1swXSxhcmdzWzFdLGFyZ3NbMl0sYXJnc1szXSxhcmdzWzRdLGFyZ3NbNV0sYXJnc1s2XSxhcmdzWzddKTsKKyAgICBjYXNlIDMyOglyZXQgPSBmdW4oYXJnc1swXSxhcmdzWzFdLGFyZ3NbMl0sYXJnc1szXSxhcmdzWzRdLGFyZ3NbNV0sYXJnc1s2XSxhcmdzWzddKTsKIAkJYnJlYWs7Ci0gICAgY2FzZSAzNjoJcmV0ID0gQ2FsbFRvMzJfOShmdW4sYXJnc1swXSxhcmdzWzFdLGFyZ3NbMl0sYXJnc1szXSxhcmdzWzRdLGFyZ3NbNV0sYXJnc1s2XSxhcmdzWzddLGFyZ3NbOF0pOworICAgIGNhc2UgMzY6CXJldCA9IGZ1bihhcmdzWzBdLGFyZ3NbMV0sYXJnc1syXSxhcmdzWzNdLGFyZ3NbNF0sYXJnc1s1XSxhcmdzWzZdLGFyZ3NbN10sYXJnc1s4XSk7CiAJCWJyZWFrOwotICAgIGNhc2UgNDA6CXJldCA9IENhbGxUbzMyXzEwKGZ1bixhcmdzWzBdLGFyZ3NbMV0sYXJnc1syXSxhcmdzWzNdLGFyZ3NbNF0sYXJnc1s1XSxhcmdzWzZdLGFyZ3NbN10sYXJnc1s4XSxhcmdzWzldKTsKKyAgICBjYXNlIDQwOglyZXQgPSBmdW4oYXJnc1swXSxhcmdzWzFdLGFyZ3NbMl0sYXJnc1szXSxhcmdzWzRdLGFyZ3NbNV0sYXJnc1s2XSxhcmdzWzddLGFyZ3NbOF0sYXJnc1s5XSk7CiAJCWJyZWFrOwotICAgIGNhc2UgNDQ6CXJldCA9IENhbGxUbzMyXzExKGZ1bixhcmdzWzBdLGFyZ3NbMV0sYXJnc1syXSxhcmdzWzNdLGFyZ3NbNF0sYXJnc1s1XSxhcmdzWzZdLGFyZ3NbN10sYXJnc1s4XSxhcmdzWzldLGFyZ3NbMTBdKTsKKyAgICBjYXNlIDQ0OglyZXQgPSBmdW4oYXJnc1swXSxhcmdzWzFdLGFyZ3NbMl0sYXJnc1szXSxhcmdzWzRdLGFyZ3NbNV0sYXJnc1s2XSxhcmdzWzddLGFyZ3NbOF0sYXJnc1s5XSxhcmdzWzEwXSk7CiAJCWJyZWFrOwotICAgIGNhc2UgNDg6CXJldCA9IENhbGxUbzMyXzEyKGZ1bixhcmdzWzBdLGFyZ3NbMV0sYXJnc1syXSxhcmdzWzNdLGFyZ3NbNF0sYXJnc1s1XSxhcmdzWzZdLGFyZ3NbN10sYXJnc1s4XSxhcmdzWzldLGFyZ3NbMTBdLGFyZ3NbMTFdKTsKKyAgICBjYXNlIDQ4OglyZXQgPSBmdW4oYXJnc1swXSxhcmdzWzFdLGFyZ3NbMl0sYXJnc1szXSxhcmdzWzRdLGFyZ3NbNV0sYXJnc1s2XSxhcmdzWzddLGFyZ3NbOF0sYXJnc1s5XSxhcmdzWzEwXSxhcmdzWzExXSk7CiAJCWJyZWFrOwogICAgIGRlZmF1bHQ6CiAJZnByaW50ZihzdGRlcnIsIiAgICB1bnN1cHBvcnRlZCBuciBvZiBhcmd1bWVudHMsICVsZFxuIixucik7CkBAIC05MzksNyArOTYzLDYgQEAKIAlicmVhazsKIAogICAgIH0KLSNlbmRpZgogICAgIGZwcmludGYoc3RkZXJyLCIgcmV0dXJuaW5nICVsZCAuLi5cbiIscmV0KTsKICAgICByZXR1cm4gcmV0OwogfQpAQCAtOTUzLDMgKzk3NiwxMDcgQEAKICAgICBmcHJpbnRmKHN0ZGVyciwiS0VSTkVMXzYxOSgweCUwNHgsMHglMDhseCwweCUwOGx4KVxuIix4LHkseik7CiAgICAgcmV0dXJuIHg7CiB9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgkJCUFsbG9jU0xDYWxsYmFjawkJKEtFUk5FTDMyKQorICoKKyAqIFdpbjk1IHVzZXMgc29tZSBzdHJ1Y3RjaGFpbnMgZm9yIGNhbGxiYWNrcy4gSXQgYWxsb2NhdGVzIHRoZW0KKyAqIGluIGJsb2NrcyBvZiAxMDAgZW50cmllcywgc2l6ZSAzMiBieXRlcyBlYWNoLCBsYXlvdXQ6CisgKiBibG9ja3N0YXJ0OgorICogCTA6CVBUUgluZXh0YmxvY2tzdGFydAorICoJNDoJZW50cnkJKmZpcnN0OworICoJODoJV09SRAlzZWwgKCBzdGFydCBwb2ludHMgdG8gYmxvY2tzdGFydCkKKyAqCUE6CVdPUkQJdW5rbm93bgorICogMTAweGVudHJ5OgorICoJMDAuLjE3OgkJQ29kZQorICoJMTg6CVBEQgkqb3duaW5nX3Byb2Nlc3M7CisgKgkxQzoJUFRSCWJsb2Nrc3RhcnQKKyAqCisgKiBXZSBpZ25vcmUgdGhpcyBmb3Igbm93LiAoSnVzdCBhIG5vdGUgZm9yIGZ1cnRoZXIgZGV2ZWxvcGVycykKKyAqIEZJWE1FOiB1c2UgdGhpcyBtZXRob2QsIHNvIHdlIGRvbid0IHdhc3RlIHNlbGVjdG9ycy4uLgorICoKKyAqIEZvbGxvd2luZyBjb2RlIGlzIHRoZW4gZ2VuZXJhdGVkIGJ5IEFsbG9jU0xDYWxsYmFjay4gVGhlIGNvZGUgaXMgMTYgYml0LCBzbworICogdGhlIDB4NjYgcHJlZml4IHN3aXRjaGVzIGZyb20gd29yZC0+bG9uZyByZWdpc3RlcnMuCisgKgorICoJNjY1QQkJcG9wCWVkeCAKKyAqCTY2Njh4IGFyZzIgeCAJcHVzaGwJPGFyZzI+CisgKgk2NjUyCQlwdXNoCWVkeAorICoJRUF4IGFyZzEgeAlqbXBmCTxhcmcxPgorICoKKyAqIHJldHVybnMgdGhlIHN0YXJ0YWRkcmVzcyBvZiB0aGlzIHRodW5rLgorICoKKyAqIE5vdGUsIHRoYXQgdGhleSBsb29rIHZlcnkgc2ltaWxhaXIgdG8gdGhlIG9uZXMgYWxsb2NhdGVzIGJ5IFRIVU5LX0FsbG9jLgorICovCitEV09SRCBXSU5BUEkKK0FsbG9jU0xDYWxsYmFjayhEV09SRCBmaW5hbGl6ZXIsRFdPUkQgY2FsbGJhY2spIHsKKwlMUEJZVEUJeCx0aHVuayA9IEhlYXBBbGxvYyggR2V0UHJvY2Vzc0hlYXAoKSwgMCwgMzIgKTsKKwlXT1JECXNlbDsKKworCXg9dGh1bms7CisJKngrKz0weDY2Oyp4Kys9MHg1YTsJCQkJLyogcG9wbCBlZHggKi8KKwkqeCsrPTB4NjY7KngrKz0weDY4OyooRFdPUkQqKXg9ZmluYWxpemVyO3grPTQ7CS8qIHB1c2hsIGZpbmFsaXplciAqLworCSp4Kys9MHg2NjsqeCsrPTB4NTI7CQkJCS8qIHB1c2hsIGVkeCAqLworCSp4Kys9MHhlYTsqKERXT1JEKil4PWNhbGxiYWNrO3grPTQ7CQkvKiBqbXBmIGNhbGxiYWNrICovCisKKwkqKERXT1JEKikodGh1bmsrMTgpID0gR2V0Q3VycmVudFByb2Nlc3NJZCgpOworCisJc2VsID0gU0VMRUNUT1JfQWxsb2NCbG9jayggdGh1bmsgLCAzMiwgU0VHTUVOVF9DT0RFLCBGQUxTRSwgRkFMU0UgKTsKKwlyZXR1cm4gKHNlbDw8MTYpfDA7Cit9CisKK3ZvaWQgV0lOQVBJCitGcmVlU0xDYWxsYmFjayhEV09SRCB4KSB7CisJZnByaW50ZihzdGRlcnIsIkZyZWVTTENhbGxiYWNrKDB4JTA4bHgpXG4iLHgpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogCQlLRVJORUxfMzU4CQkoS0VSTkVMKQorICogQWxsb2NhdGVzIGEgY29kZSBzZWdtZW50IHdoaWNoIHN0YXJ0cyBhdCB0aGUgYWRkcmVzcyBwYXNzZWQgaW4geC4gbGltaXQKKyAqIDB4ZmZmZmYsIGFuZCByZXR1cm5zIHRoZSBwb2ludGVyIHRvIHRoZSBzdGFydC4KKyAqLworRFdPUkQgV0lOQVBJCitfS0VSTkVMXzM1OChEV09SRCB4KSB7CisJV09SRAlzZWw7CisKKwlmcHJpbnRmKHN0ZGVyciwiX0tFUk5FTF8zNTgoMHglMDhseCksc3R1YlxuIix4KTsKKwlpZiAoIUhJV09SRCh4KSkKKwkJcmV0dXJuIHg7CisKKwlzZWwgPSBTRUxFQ1RPUl9BbGxvY0Jsb2NrKCBQVFJfU0VHX1RPX0xJTih4KSAsIDB4ZmZmZiwgU0VHTUVOVF9DT0RFLCBGQUxTRSwgRkFMU0UgKTsKKwlyZXR1cm4gKHNlbDw8MTYpfCgweDAwMDApOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogCQlLRVJORUxfMzU5CQkoS0VSTkVMKQorICogRnJlZXMgdGhlIGNvZGUgc2VnbWVudCBvZiB0aGUgcGFzc2VkIGxpbmVhciBwb2ludGVyIChUaGlzIGhhcyB1c3VhbGx5CisgKiBiZWVuIGFsbG9jYXRlZCBieSBfS0VSTkVMXzM1OCkuCisgKi8KK1ZPSUQgV0lOQVBJCitfS0VSTkVMXzM1OShEV09SRCB4KSB7CisJRFdPUkQJc2F2ZWRzc3NwOworCisJZnByaW50ZihzdGRlcnIsIl9LRVJORUxfMzU5KDB4JTA4bHgpLHN0dWJcbiIseCk7CisJaWYgKChISVdPUkQoeCkgJiA3KSE9NykKKwkJcmV0dXJuOworCXNhdmVkc3NzcCA9IElGMTYzMl9TYXZlZDE2X3NzX3NwO0lGMTYzMl9TYXZlZDE2X3NzX3NwID0gMDsKKwlTRUxFQ1RPUl9GcmVlQmxvY2soeD4+MTYsMSk7CisJSUYxNjMyX1NhdmVkMTZfc3Nfc3AgPSBzYXZlZHNzc3A7CisJcmV0dXJuOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogCQlLRVJORUxfNDcyCQkoS0VSTkVMKQorICogc29tZXRoaW5nIGxpa2UgR2V0Q3VycmVudGhJbnN0YW5jZS4KKyAqLworVk9JRCBXSU5BUEkKK19LRVJORUxfNDcyKENPTlRFWFQgKmNvbnRleHQpIHsKKwlmcHJpbnRmKHN0ZGVyciwiX0tFUk5FTF80NzIoMHglMDhseCksc3R1YlxuIixFQVhfcmVnKGNvbnRleHQpKTsKKwlpZiAoIUVBWF9yZWcoY29udGV4dCkpIHsKKwkJVERCICpwVGFzayA9IChUREIqKUdsb2JhbExvY2sxNihHZXRDdXJyZW50VGFzaygpKTsKKwkJQVhfcmVnKGNvbnRleHQpPXBUYXNrLT5oSW5zdGFuY2U7CisJCXJldHVybjsKKwl9CisJaWYgKCFISVdPUkQoRUFYX3JlZyhjb250ZXh0KSkpCisJCXJldHVybjsgLyogcmV0dXJucyB0aGUgcGFzc2VkIHZhbHVlICovCisJLyogaG1tIC4uLiBmaXhtZSAqLworfQpkaWZmIC0tZ2l0IGEvaWYxNjMyL3dpbm1tLnNwZWMgYi9pZjE2MzIvd2lubW0uc3BlYwppbmRleCAzZWU5MTNmLi5iYTM4NjM1IDEwMDY0NAotLS0gYS9pZjE2MzIvd2lubW0uc3BlYworKysgYi9pZjE2MzIvd2lubW0uc3BlYwpAQCAtMSw3ICsxLDcgQEAKIG5hbWUgd2lubW0KIHR5cGUgd2luMzIKIAotMDAwMSBzdHViIFBsYXlTb3VuZEEKKzAwMDEgc3RkY2FsbCBQbGF5U291bmRBKHB0ciBsb25nIGxvbmcpIFBsYXlTb3VuZDMyQQogMDAwNCBzdHViIENsb3NlRHJpdmVyCiAwMDA1IHN0dWIgRGVmRHJpdmVyUHJvYwogMDAwNiBzdHViIERyaXZlckNhbGxiYWNrCkBAIC0xNiw3ICsxNiw3IEBACiAwMDE1IHN0dWIgT3BlbkRyaXZlcgogMDAxNiBzdHViIE9wZW5Ecml2ZXJBCiAwMDE3IHN0dWIgUGxheVNvdW5kCi0wMDE4IHN0dWIgUGxheVNvdW5kVworMDAxOCBzdGRjYWxsIFBsYXlTb3VuZFcocHRyIGxvbmcgbG9uZykgUGxheVNvdW5kMzJXCiAwMDE5IHN0dWIgU2VuZERyaXZlck1lc3NhZ2UKIDAwMjAgc3R1YiBhdXhHZXREZXZDYXBzQQogMDAyMSBzdHViIGF1eEdldERldkNhcHNXCkBAIC0xMTgsNyArMTE4LDcgQEAKIDAxMTcgc3R1YiBtbWlvRmx1c2gKIDAxMTggc3R1YiBtbWlvR2V0SW5mbwogMDExOSBzdHViIG1taW9JbnN0YWxsSU9Qcm9jMTYKLTAxMjAgc3R1YiBtbWlvSW5zdGFsbElPUHJvY0EKKzAxMjAgc3RkY2FsbCBtbWlvSW5zdGFsbElPUHJvY0EobG9uZyBwdHIgbG9uZykgbW1pb0luc3RhbGxJT1Byb2MzMkEKIDAxMjEgc3R1YiBtbWlvSW5zdGFsbElPUHJvY1cKIDAxMjIgc3R1YiBtbWlvT3BlbkEKIDAxMjMgc3R1YiBtbWlvT3BlblcKZGlmZiAtLWdpdCBhL2luY2x1ZGUvYWNjZWwuaCBiL2luY2x1ZGUvYWNjZWwuaAppbmRleCA3YzNhZDk1Li5lOWIzYmU4IDEwMDY0NAotLS0gYS9pbmNsdWRlL2FjY2VsLmgKKysrIGIvaW5jbHVkZS9hY2NlbC5oCkBAIC0xLDggKzEsNyBAQAogLyoKICAqIHN0cnVjdHVyZSBkZWZpbml0aW9ucyBmb3IgQUNDRUxFUkFUT1JTCiAgKgotICogQ29weXJpZ2h0ICBNYXJ0aW4gQXlvdHRlLCAxOTk0Ci0gKgorICogdGFrZW4gc3RyYWlnaHQgZnJvbSBXaW4zMiBTREsgaW5jbHVkZXMKICAqLwogCiAjaWZuZGVmIF9fV0lORV9BQ0NFTF9ICkBAIC0xMCwyMSArOSwyOCBAQAogCiAjaW5jbHVkZSAid2luZG93cy5oIgogCi10eXBlZGVmIHN0cnVjdCB7Ci0JV09SRAkJd0V2ZW50OwotCVdPUkQJCXdJRHZhbDsKLQlCWVRFCQl0eXBlOwotCX0gQUNDRUxFTlRSWSwgKkxQQUNDRUxFTlRSWTsKKyNwcmFnbWEgcGFjaygxKQogCi10eXBlZGVmIHN0cnVjdCB7Ci0JV09SRAkJd0NvdW50OwotCUFDQ0VMRU5UUlkgCXRibFsxXTsKLQl9IEFDQ0VMSEVBREVSLCAqTFBBQ0NFTEhFQURFUjsKKyNkZWZpbmUJRlZJUlRLRVkJVFJVRSAgICAgICAgICAvKiBBc3N1bWVkIHRvIGJlID09IFRSVUUgKi8KKyNkZWZpbmUJRk5PSU5WRVJUCTB4MDIKKyNkZWZpbmUJRlNISUZUCQkweDA0CisjZGVmaW5lCUZDT05UUk9MCTB4MDgKKyNkZWZpbmUJRkFMVAkJMHgxMAogCi0jZGVmaW5lIFZJUlRLRVlfQUNDRUwJMHgwMQotI2RlZmluZSBTSElGVF9BQ0NFTAkweDA0Ci0jZGVmaW5lIENPTlRST0xfQUNDRUwJMHgwOAotI2RlZmluZSBBTFRfQUNDRUwgICAgICAgMHgxMAotI2RlZmluZSBTWVNURU1fQUNDRUwJMHg4MAordHlwZWRlZiBzdHJ1Y3QgdGFnQUNDRUwxNiB7CisJQllURQlmVmlydDsJCS8qIEFsc28gY2FsbGVkIHRoZSBmbGFncyBmaWVsZCAqLworCVdPUkQJa2V5OworCVdPUkQJY21kOworfSBBQ0NFTDE2LCAqTFBBQ0NFTDE2OworCit0eXBlZGVmIHN0cnVjdCB0YWdBQ0NFTDMyIHsKKwlCWVRFCWZWaXJ0OwkJLyogQWxzbyBjYWxsZWQgdGhlIGZsYWdzIGZpZWxkICovCisJQllURQlwYWQwOworCVdPUkQJa2V5OworCVdPUkQJY21kOworCVdPUkQJcGFkMTsKK30gQUNDRUwzMiwgKkxQQUNDRUwzMjsKKworI3ByYWdtYSBwYWNrKDQpCiAKICNlbmRpZiAgLyogX19XSU5FX0FDQ0VMX0ggKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvY2FsbGJhY2suaCBiL2luY2x1ZGUvY2FsbGJhY2suaAppbmRleCA5YmQ5MDQ5Li40MGJmNzgyIDEwMDY0NAotLS0gYS9pbmNsdWRlL2NhbGxiYWNrLmgKKysrIGIvaW5jbHVkZS9jYWxsYmFjay5oCkBAIC0yMiw3ICsyMiw3IEBACiAKICNpZm5kZWYgV0lORUxJQgogCi1leHRlcm4gTE9ORyBDQUxMQkFDSyBDYWxsVG8xNl9yZWdzXyAgICAgKGNvbnN0IENPTlRFWFQgKmNvbnRleHQpOworZXh0ZXJuIExPTkcgQ0FMTEJBQ0sgQ2FsbFRvMTZfcmVnc18gICAgIChjb25zdCBDT05URVhUICpjb250ZXh0LCBJTlQzMiBvZmZzZXQpOwogZXh0ZXJuIFdPUkQgQ0FMTEJBQ0sgQ2FsbFRvMTZfd29yZF8gICAgIChGQVJQUk9DMTYpOwogZXh0ZXJuIFdPUkQgQ0FMTEJBQ0sgQ2FsbFRvMTZfd29yZF93ICAgIChGQVJQUk9DMTYsV09SRCk7CiBleHRlcm4gTE9ORyBDQUxMQkFDSyBDYWxsVG8xNl9sb25nX2wgICAgKEZBUlBST0MxNixMT05HKTsKQEAgLTM2LDE2ICszNiwxMiBAQAogZXh0ZXJuIFdPUkQgQ0FMTEJBQ0sgQ2FsbFRvMTZfd29yZF9sbHdsIChGQVJQUk9DMTYsTE9ORyxMT05HLFdPUkQsTE9ORyk7CiBleHRlcm4gV09SRCBDQUxMQkFDSyBDYWxsVG8xNl93b3JkX2x3bGwgKEZBUlBST0MxNixMT05HLFdPUkQsTE9ORyxMT05HKTsKIGV4dGVybiBMT05HIENBTExCQUNLIENhbGxUbzE2X2xvbmdfd3d3bCAoRkFSUFJPQzE2LFdPUkQsV09SRCxXT1JELExPTkcpOwotZXh0ZXJuIExPTkcgQ0FMTEJBQ0sgQ2FsbFRvMTZfd25kcF93d3dsIChGQVJQUk9DMTYsV09SRCxXT1JELFdPUkQsTE9ORyk7CiBleHRlcm4gV09SRCBDQUxMQkFDSyBDYWxsVG8xNl93b3JkX2x3d3cgKEZBUlBST0MxNixMT05HLFdPUkQsV09SRCxXT1JEKTsKIGV4dGVybiBXT1JEIENBTExCQUNLIENhbGxUbzE2X3dvcmRfd3dsbCAoRkFSUFJPQzE2LFdPUkQsV09SRCxMT05HLExPTkcpOwogZXh0ZXJuIFdPUkQgQ0FMTEJBQ0sgQ2FsbFRvMTZfd29yZF93bGx3bChGQVJQUk9DMTYsV09SRCxMT05HLExPTkcsV09SRCxMT05HKTsKIGV4dGVybiBMT05HIENBTExCQUNLIENhbGxUbzE2X2xvbmdfbHd3bGwoRkFSUFJPQzE2LExPTkcsV09SRCxXT1JELExPTkcsTE9ORyk7CiBleHRlcm4gV09SRCBDQUxMQkFDSyBDYWxsVG8xNl93b3JkX3d3bGxsKEZBUlBST0MxNixXT1JELFdPUkQsTE9ORyxMT05HLExPTkcpOwogZXh0ZXJuIFdPUkQgQ0FMTEJBQ0sgQ2FsbFRvMTZfd29yZF93d3d3dyhGQVJQUk9DMTYsV09SRCxXT1JELFdPUkQsV09SRCxXT1JEKTsKLWV4dGVybiBMT05HIENBTExCQUNLIENhbGxUbzE2X3duZHBfbGxsbGxsbHdsd3d3bChGQVJQUk9DMTYsTE9ORyxMT05HLExPTkcsTE9ORywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMT05HLExPTkcsTE9ORyxXT1JELExPTkcsV09SRCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBXT1JELFdPUkQsTE9ORyk7CiBleHRlcm4gV09SRCBDQUxMQkFDSyBDYWxsVG8xNl93b3JkX2x3bGxsKEZBUlBST0MxNixMT05HLFdPUkQsTE9ORyxMT05HLExPTkcpOwogZXh0ZXJuIFdPUkQgQ0FMTEJBQ0sgQ2FsbFRvMTZfd29yZF9sbGxsIChGQVJQUk9DMTYsTE9ORyxMT05HLExPTkcsTE9ORyk7CiBleHRlcm4gTE9ORyBDQUxMQkFDSyBDYWxsVG8xNl9sb25nX2x3bGxsKEZBUlBST0MxNixMT05HLFdPUkQsTE9ORyxMT05HLExPTkcpOwpAQCAtNjQsMjUgKzYwLDYgQEAKICNkZWZpbmUgQ2FsbFdvcmRCcmVha1Byb2MxNiggZnVuYywgbHBjaCwgaWNoQ3VycmVudCwgY2NoLCBjb2RlICkgXAogICAgIENhbGxUbzE2X3dvcmRfbHd3dyggZnVuYywgbHBjaCwgaWNoQ3VycmVudCwgY2NoLCBjb2RlICkKIAotCi0vKiBMaXN0IG9mIHRoZSAzMi1iaXQgY2FsbGJhY2sgZnVuY3Rpb25zLiBUaGlzIGxpc3QgaXMgdXNlZCAgKi8KLS8qIGJ5IHRoZSBidWlsZCBwcm9ncmFtIHRvIGdlbmVyYXRlIHRoZSBmaWxlIGlmMTYzMi9jYWxsdG8zMi5TICovCi0KLWV4dGVybiBMT05HIENBTExCQUNLIENhbGxUbzMyXzAoIEZBUlBST0MzMiApOwotZXh0ZXJuIExPTkcgQ0FMTEJBQ0sgQ2FsbFRvMzJfMSggRkFSUFJPQzMyLCBEV09SRCApOwotZXh0ZXJuIExPTkcgQ0FMTEJBQ0sgQ2FsbFRvMzJfMiggRkFSUFJPQzMyLCBEV09SRCwgRFdPUkQgKTsKLWV4dGVybiBMT05HIENBTExCQUNLIENhbGxUbzMyXzMoIEZBUlBST0MzMiwgRFdPUkQsIERXT1JELCBEV09SRCApOwotZXh0ZXJuIExPTkcgQ0FMTEJBQ0sgQ2FsbFRvMzJfNCggRkFSUFJPQzMyLCBEV09SRCwgRFdPUkQsIERXT1JELCBEV09SRCApOwotZXh0ZXJuIExPTkcgQ0FMTEJBQ0sgQ2FsbFRvMzJfNSggRkFSUFJPQzMyLCBEV09SRCwgRFdPUkQsIERXT1JELCBEV09SRCwgRFdPUkQgKTsKLWV4dGVybiBMT05HIENBTExCQUNLIENhbGxUbzMyXzYoIEZBUlBST0MzMiwgRFdPUkQsIERXT1JELCBEV09SRCwgRFdPUkQsIERXT1JELCBEV09SRCApOwotZXh0ZXJuIExPTkcgQ0FMTEJBQ0sgQ2FsbFRvMzJfNyggRkFSUFJPQzMyLCBEV09SRCwgRFdPUkQsIERXT1JELCBEV09SRCwgRFdPUkQsIERXT1JELCBEV09SRCApOwotZXh0ZXJuIExPTkcgQ0FMTEJBQ0sgQ2FsbFRvMzJfOCggRkFSUFJPQzMyLCBEV09SRCwgRFdPUkQsIERXT1JELCBEV09SRCwgRFdPUkQsIERXT1JELCBEV09SRCwgRFdPUkQgKTsKLWV4dGVybiBMT05HIENBTExCQUNLIENhbGxUbzMyXzkoIEZBUlBST0MzMiwgRFdPUkQsIERXT1JELCBEV09SRCwgRFdPUkQsIERXT1JELCBEV09SRCwgRFdPUkQsIERXT1JELCBEV09SRCApOwotZXh0ZXJuIExPTkcgQ0FMTEJBQ0sgQ2FsbFRvMzJfMTAoIEZBUlBST0MzMiwgRFdPUkQsIERXT1JELCBEV09SRCwgRFdPUkQsIERXT1JELCBEV09SRCwgRFdPUkQsIERXT1JELCBEV09SRCwgRFdPUkQgKTsKLWV4dGVybiBMT05HIENBTExCQUNLIENhbGxUbzMyXzExKCBGQVJQUk9DMzIsIERXT1JELCBEV09SRCwgRFdPUkQsIERXT1JELCBEV09SRCwgRFdPUkQsIERXT1JELCBEV09SRCwgRFdPUkQsIERXT1JELCBEV09SRCApOwotZXh0ZXJuIExPTkcgQ0FMTEJBQ0sgQ2FsbFRvMzJfMTIoIEZBUlBST0MzMiwgRFdPUkQsIERXT1JELCBEV09SRCwgRFdPUkQsIERXT1JELCBEV09SRCwgRFdPUkQsIERXT1JELCBEV09SRCwgRFdPUkQsIERXT1JELCBEV09SRCApOwotZXh0ZXJuIExPTkcgQ0FMTEJBQ0sgQ2FsbFRvMzJfMTMoIEZBUlBST0MzMiwgRFdPUkQsIERXT1JELCBEV09SRCwgRFdPUkQsIERXT1JELCBEV09SRCwgRFdPUkQsIERXT1JELCBEV09SRCwgRFdPUkQsIERXT1JELCBEV09SRCwgRFdPUkQgKTsKLQogI2Vsc2UgIC8qIFdJTkVMSUIgKi8KIAogI2RlZmluZSBDYWxsRHJpdmVyUHJvYyggZnVuYywgZHdJZCwgbXNnLCBoZHJ2ciwgbHBhcmFtMSwgbHBhcmFtMiApIFwKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbW1zeXN0ZW0uaCBiL2luY2x1ZGUvbW1zeXN0ZW0uaAppbmRleCA0NzM1MjAyLi5kMmY1YzE2IDEwMDY0NAotLS0gYS9pbmNsdWRlL21tc3lzdGVtLmgKKysrIGIvaW5jbHVkZS9tbXN5c3RlbS5oCkBAIC0xMzEsNiArMTMxLDkgQEAKIAogV09SRCBXSU5BUEkgbW1zeXN0ZW1HZXRWZXJzaW9uKHZvaWQpOwogQk9PTDE2IFdJTkFQSSBzbmRQbGF5U291bmQoTFBDU1RSIGxwc3pTb3VuZE5hbWUsIFVJTlQxNiB1RmxhZ3MpOworQk9PTDMyIFdJTkFQSSBQbGF5U291bmQzMkEoTFBDU1RSIHBzelNvdW5kLCBITU9EVUxFMzIgaG1vZCwgRFdPUkQgZmR3U291bmQpOworQk9PTDMyIFdJTkFQSSBQbGF5U291bmQzMlcoTFBDV1NUUiBwc3pTb3VuZCwgSE1PRFVMRTMyIGhtb2QsIERXT1JEIGZkd1NvdW5kKTsKKyNkZWZpbmUgUGxheVNvdW5kIFdJTkVMSUJfTkFNRV9BVyhQbGF5U291bmQpCiAKICNkZWZpbmUgU05EX1NZTkMgICAgICAgICAgICAweDAwMDAgIC8qIHBsYXkgc3luY2hyb25vdXNseSAoZGVmYXVsdCkgKi8KICNkZWZpbmUgU05EX0FTWU5DICAgICAgICAgICAweDAwMDEgIC8qIHBsYXkgYXN5bmNocm9ub3VzbHkgKi8KQEAgLTEzOSw2ICsxNDIsMTIgQEAKICNkZWZpbmUgU05EX0xPT1AgICAgICAgICAgICAweDAwMDggIC8qIGxvb3AgdGhlIHNvdW5kIHVudGlsIG5leHQgc25kUGxheVNvdW5kICovCiAjZGVmaW5lIFNORF9OT1NUT1AgICAgICAgICAgMHgwMDEwICAvKiBkb24ndCBzdG9wIGFueSBjdXJyZW50bHkgcGxheWluZyBzb3VuZCAqLwogCisjZGVmaW5lIFNORF9OT1dBSVQJMHgwMDAwMjAwMEwgLyogZG9uJ3Qgd2FpdCBpZiB0aGUgZHJpdmVyIGlzIGJ1c3kgKi8KKyNkZWZpbmUgU05EX0FMSUFTICAgICAgIDB4MDAwMTAwMDBMIC8qIG5hbWUgaXMgYSByZWdpc3RyeSBhbGlhcyAqLworI2RlZmluZSBTTkRfQUxJQVNfSUQJMHgwMDExMDAwMEwgLyogYWxpYXMgaXMgYSBwcmVkZWZpbmVkIElEICovCisjZGVmaW5lIFNORF9GSUxFTkFNRSAgICAweDAwMDIwMDAwTCAvKiBuYW1lIGlzIGZpbGUgbmFtZSAqLworI2RlZmluZSBTTkRfUkVTT1VSQ0UgICAgMHgwMDA0MDAwNEwgLyogbmFtZSBpcyByZXNvdXJjZSBuYW1lIG9yIGF0b20gKi8KKwogLyogd2F2ZWZvcm0gYXVkaW8gZXJyb3IgcmV0dXJuIHZhbHVlcyAqLwogI2RlZmluZSBXQVZFUlJfQkFERk9STUFUICAgICAgKFdBVkVSUl9CQVNFICsgMCkgICAgLyogdW5zdXBwb3J0ZWQgd2F2ZSBmb3JtYXQgKi8KICNkZWZpbmUgV0FWRVJSX1NUSUxMUExBWUlORyAgIChXQVZFUlJfQkFTRSArIDEpICAgIC8qIHN0aWxsIHNvbWV0aGluZyBwbGF5aW5nICovCkBAIC01MjcsMTMgKzUzNiwxNiBAQAogI2RlZmluZSBDRlNFUENIQVIgICAgICAgJysnICAgICAgICAgICAgIC8qIGNvbXBvdW5kIGZpbGUgbmFtZSBzZXBhcmF0b3IgY2hhci4gKi8KIAogdHlwZWRlZiBEV09SRCAgICAgICAgICAgRk9VUkNDOyAgICAgICAgIC8qIGEgZm91ciBjaGFyYWN0ZXIgY29kZSAqLwotdHlwZWRlZiBMT05HIChDQUxMQkFDSyAqTFBNTUlPUFJPQykoTFBTVFIgbHBtbWlvaW5mbywgVUlOVDE2IHVNZXNzYWdlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFBBUkFNIGxQYXJhbTEsIExQQVJBTSBsUGFyYW0yKTsKK3R5cGVkZWYgTE9ORyAoQ0FMTEJBQ0sgKkxQTU1JT1BST0MxNikoTFBTVFIgbHBtbWlvaW5mbywgVUlOVDE2IHVNZXNzYWdlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMUEFSQU0gbFBhcmFtMSwgTFBBUkFNIGxQYXJhbTIpOwordHlwZWRlZiBMT05HIChDQUxMQkFDSyAqTFBNTUlPUFJPQzMyKShMUFNUUiBscG1taW9pbmZvLCBVSU5UMzIgdU1lc3NhZ2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExQQVJBTSBsUGFyYW0xLCBMUEFSQU0gbFBhcmFtMik7CitERUNMX1dJTkVMSUJfVFlQRShMUE1NSU9QUk9DKTsKIAogdHlwZWRlZiBzdHJ1Y3QgewogICAgICAgICBEV09SRCAgICAgICAgICAgZHdGbGFnczsgICAgICAgIC8qIGdlbmVyYWwgc3RhdHVzIGZsYWdzICovCiAgICAgICAgIEZPVVJDQyAgICAgICAgICBmY2NJT1Byb2M7ICAgICAgLyogcG9pbnRlciB0byBJL08gcHJvY2VkdXJlICovCi0gICAgICAgIExQTU1JT1BST0MgICAgICBwSU9Qcm9jOyAgICAgICAgLyogcG9pbnRlciB0byBJL08gcHJvY2VkdXJlICovCisgICAgICAgIExQTU1JT1BST0MxNiAgICBwSU9Qcm9jOyAgICAgICAgLyogcG9pbnRlciB0byBJL08gcHJvY2VkdXJlICovCiAgICAgICAgIFVJTlQxNiAgICAgICAgICAgIHdFcnJvclJldDsgICAgICAvKiBwbGFjZSBmb3IgZXJyb3IgdG8gYmUgcmV0dXJuZWQgKi8KICAgICAgICAgSFRBU0sxNiAgICAgICAgIGh0YXNrOyAgICAgICAgICAvKiBhbHRlcm5hdGUgbG9jYWwgdGFzayAqLwogICAgICAgICAvKiBmaWVsZHMgbWFpbnRhaW5lZCBieSBNTUlPIGZ1bmN0aW9ucyBkdXJpbmcgYnVmZmVyZWQgSS9PICovCkBAIC02MjMsOSArNjM1LDEyIEBACiAgICAgICAgICAgICAgICAgKCAoRFdPUkQpKEJZVEUpKGNoMCkgfCAoIChEV09SRCkoQllURSkoY2gxKSA8PCA4ICkgfCAgICBcCiAgICAgICAgICAgICAgICAgKCAoRFdPUkQpKEJZVEUpKGNoMikgPDwgMTYgKSB8ICggKERXT1JEKShCWVRFKShjaDMpIDw8IDI0ICkgKQogCitMUE1NSU9QUk9DMTYgV0lOQVBJIG1taW9JbnN0YWxsSU9Qcm9jMTYoRk9VUkNDLExQTU1JT1BST0MxNixEV09SRCk7CitMUE1NSU9QUk9DMzIgV0lOQVBJIG1taW9JbnN0YWxsSU9Qcm9jMzJBKEZPVVJDQyxMUE1NSU9QUk9DMzIsRFdPUkQpOworTFBNTUlPUFJPQzMyIFdJTkFQSSBtbWlvSW5zdGFsbElPUHJvYzMyVyhGT1VSQ0MsTFBNTUlPUFJPQzMyLERXT1JEKTsKKyNkZWZpbmUgICAgICBtbWlvSW5zdGFsbElPUHJvIFdJTkVMSUJfTkFNRV9BVyhtbWlvSW5zdGFsbElPUHJvYykKKwogRk9VUkNDIFdJTkFQSSBtbWlvU3RyaW5nVG9GT1VSQ0MoTFBDU1RSIHN6LCBVSU5UMTYgdUZsYWdzKTsKLUxQTU1JT1BST0MgV0lOQVBJIG1taW9JbnN0YWxsSU9Qcm9jKEZPVVJDQyBmY2NJT1Byb2MsIExQTU1JT1BST0MgcElPUHJvYywKLSAgICBEV09SRCBkd0ZsYWdzKTsKIEhNTUlPMTYgV0lOQVBJIG1taW9PcGVuKExQU1RSIHN6RmlsZU5hbWUsIE1NSU9JTkZPICogbHBtbWlvaW5mbywKICAgICBEV09SRCBkd09wZW5GbGFncyk7CiAKZGlmZiAtLWdpdCBhL2luY2x1ZGUvcmVzb3VyY2UuaCBiL2luY2x1ZGUvcmVzb3VyY2UuaAppbmRleCA1MGJkNjBhLi40ZjFjZDI2IDEwMDY0NAotLS0gYS9pbmNsdWRlL3Jlc291cmNlLmgKKysrIGIvaW5jbHVkZS9yZXNvdXJjZS5oCkBAIC00Miw2ICs0Miw3IEBACiAjZGVmaW5lIEhBVkVfV0lORV9DT05TVFJVQ1RPUgogI2Vsc2UKICNkZWZpbmUgV0lORV9DT05TVFJVQ1RPUgorI3VuZGVmIEhBVkVfV0lORV9DT05TVFJVQ1RPUgogI2VuZGlmCiAKIHR5cGVkZWYgSEdMT0JBTDE2IChDQUxMQkFDSyAqUkVTT1VSQ0VIQU5ETEVSMTYpKEhHTE9CQUwxNiwgSE1PRFVMRTE2LCBIUlNSQzE2ICk7CmRpZmYgLS1naXQgYS9pbmNsdWRlL3N0YWNrZnJhbWUuaCBiL2luY2x1ZGUvc3RhY2tmcmFtZS5oCmluZGV4IDA5Y2RiODUuLmYxYjUxM2EgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvc3RhY2tmcmFtZS5oCisrKyBiL2luY2x1ZGUvc3RhY2tmcmFtZS5oCkBAIC0xNSwzMyArMTUsMzIgQEAKICAgLyogMTYtYml0IHN0YWNrIGxheW91dCBhZnRlciBDYWxsRnJvbTE2KCkgKi8KIHR5cGVkZWYgc3RydWN0CiB7Ci0gICAgRFdPUkQgICBzYXZlZF9zc19zcDsgICAgICAgICAgICAgLyogc2F2ZWQgcHJldmlvdXMgMTYtYml0IHN0YWNrICovCi0gICAgRFdPUkQgICBlYnA7ICAgICAgICAgICAgICAgICAgICAgLyogZnVsbCAzMi1iaXQgY29udGVudCBvZiBlYnAgKi8KLSAgICBXT1JEICAgIGVudHJ5X2lwOyAgICAgICAgICAgICAgICAvKiBpcCBvZiBlbnRyeSBwb2ludCAqLwotICAgIFdPUkQgICAgZHM7ICAgICAgICAgICAgICAgICAgICAgIC8qIGRzICovCi0gICAgV09SRCAgICBlbnRyeV9jczsgICAgICAgICAgICAgICAgLyogY3Mgb2YgZW50cnkgcG9pbnQgKi8KLSAgICBXT1JEICAgIGVzOyAgICAgICAgICAgICAgICAgICAgICAvKiBlcyAqLwotICAgIERXT1JEICAgZW50cnlfcG9pbnQgV0lORV9QQUNLRUQ7IC8qIDMyLWJpdCBlbnRyeSBwb2ludCB0byBjYWxsICovCi0gICAgV09SRCAgICBicDsgICAgICAgICAgICAgICAgICAgICAgLyogMTYtYml0IGJwICovCi0gICAgV09SRCAgICBpcDsgICAgICAgICAgICAgICAgICAgICAgLyogcmV0dXJuIGFkZHJlc3MgKi8KLSAgICBXT1JEICAgIGNzOwotICAgIFdPUkQgICAgYXJnc1sxXTsgICAgICAgICAgICAgICAgIC8qIGFyZ3VtZW50cyB0byBBUEkgZnVuY3Rpb24gKi8KKyAgICBEV09SRCAgIHNhdmVkX3NzX3NwOyAgICAvKiAwMCBzYXZlZCBwcmV2aW91cyAxNi1iaXQgc3RhY2sgKi8KKyAgICBEV09SRCAgIGVicDsgICAgICAgICAgICAvKiAwNCBmdWxsIDMyLWJpdCBjb250ZW50IG9mIGVicCAqLworICAgIFdPUkQgICAgZW50cnlfaXA7ICAgICAgIC8qIDA4IGlwIG9mIGVudHJ5IHBvaW50ICovCisgICAgV09SRCAgICBkczsgICAgICAgICAgICAgLyogMGEgZHMgKi8KKyAgICBXT1JEICAgIGVudHJ5X2NzOyAgICAgICAvKiAwYyBjcyBvZiBlbnRyeSBwb2ludCAqLworICAgIFdPUkQgICAgZXM7ICAgICAgICAgICAgIC8qIDBlIGVzICovCisgICAgRFdPUkQgICBlbnRyeV9wb2ludDsgICAgLyogMTAgMzItYml0IGVudHJ5IHBvaW50IHRvIGNhbGwgKi8KKyAgICBXT1JEICAgIGJwOyAgICAgICAgICAgICAvKiAxNCAxNi1iaXQgYnAgKi8KKyAgICBXT1JEICAgIGlwOyAgICAgICAgICAgICAvKiAxNiByZXR1cm4gYWRkcmVzcyAqLworICAgIFdPUkQgICAgY3M7ICAgICAgICAgICAgIC8qIDE4ICovCisgICAgV09SRCAgICBhcmdzWzFdOyAgICAgICAgLyogMWEgYXJndW1lbnRzIHRvIEFQSSBmdW5jdGlvbiAqLwogfSBTVEFDSzE2RlJBTUU7CiAKICAgLyogMzItYml0IHN0YWNrIGxheW91dCBhZnRlciBDYWxsVG8xNigpICovCiB0eXBlZGVmIHN0cnVjdAogewotICAgIERXT1JEICAgc2F2ZWRfZXNwOyAgICAgIC8qIHNhdmVkIHByZXZpb3VzIDMyLWJpdCBzdGFjayAqLwotICAgIERXT1JEICAgZWRpOyAgICAgICAgICAgIC8qIHNhdmVkIHJlZ2lzdGVycyAqLwotICAgIERXT1JEICAgZXNpOwotICAgIERXT1JEICAgZWR4OwotICAgIERXT1JEICAgZWN4OwotICAgIERXT1JEICAgZWJ4OwotICAgIERXT1JEICAgcmVzdG9yZV9hZGRyOyAgIC8qIHJldHVybiBhZGRyZXNzIGZvciByZXN0b3JpbmcgY29kZSBzZWxlY3RvciAqLwotICAgIERXT1JEICAgY29kZXNlbGVjdG9yOyAgIC8qIGNvZGUgc2VsZWN0b3IgdG8gcmVzdG9yZSAqLwotICAgIERXT1JEICAgZWJwOyAgICAgICAgICAgIC8qIHNhdmVkIDMyLWJpdCBmcmFtZSBwb2ludGVyICovCi0gICAgRFdPUkQgICByZXRhZGRyOyAgICAgICAgLyogYWN0dWFsIHJldHVybiBhZGRyZXNzICovCi0gICAgRFdPUkQgICBhcmdzWzFdOyAgICAgICAgLyogYXJndW1lbnRzIHRvIDE2LWJpdCBmdW5jdGlvbiAqLworICAgIERXT1JEICAgZWRpOyAgICAgICAgICAgIC8qIDAwIHNhdmVkIHJlZ2lzdGVycyAqLworICAgIERXT1JEICAgZXNpOyAgICAgICAgICAgIC8qIDA0ICovCisgICAgRFdPUkQgICBlZHg7ICAgICAgICAgICAgLyogMDggKi8KKyAgICBEV09SRCAgIGVjeDsgICAgICAgICAgICAvKiAwYyAqLworICAgIERXT1JEICAgZWJ4OyAgICAgICAgICAgIC8qIDEwICovCisgICAgRFdPUkQgICByZXN0b3JlX2FkZHI7ICAgLyogMTQgcmV0dXJuIGFkZHJlc3MgZm9yIHJlc3RvcmluZyBjb2RlIHNlbGVjdG9yICovCisgICAgRFdPUkQgICBjb2Rlc2VsZWN0b3I7ICAgLyogMTggY29kZSBzZWxlY3RvciB0byByZXN0b3JlICovCisgICAgRFdPUkQgICBlYnA7ICAgICAgICAgICAgLyogMWMgc2F2ZWQgMzItYml0IGZyYW1lIHBvaW50ZXIgKi8KKyAgICBEV09SRCAgIHJldGFkZHI7ICAgICAgICAvKiAyMCBhY3R1YWwgcmV0dXJuIGFkZHJlc3MgKi8KKyAgICBEV09SRCAgIGFyZ3NbMV07ICAgICAgICAvKiAyNCBhcmd1bWVudHMgdG8gMTYtYml0IGZ1bmN0aW9uICovCiB9IFNUQUNLMzJGUkFNRTsKIAogI3ByYWdtYSBwYWNrKDQpCmRpZmYgLS1naXQgYS9pbmNsdWRlL3Rhc2suaCBiL2luY2x1ZGUvdGFzay5oCmluZGV4IDFmZTBhMmMuLmVmNTQxMzUgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvdGFzay5oCisrKyBiL2luY2x1ZGUvdGFzay5oCkBAIC02OCw3ICs2OCw3IEBACiAgICAgV09SRCAgICAgIHVudXNlZDE7ICAgICAgICAgICAgICAgICAgICAvKiAwYSAqLwogICAgIEhUQVNLMTYgICBoU2VsZjsgICAgICAgICAgICAgICAgICAgICAgLyogMGMgU2VsZWN0b3Igb2YgdGhpcyBUREIgKi8KICAgICBIQU5ETEUxNiAgaFByZXZJbnN0YW5jZTsgICAgICAgICAgICAgIC8qIDBlIFByZXZpb3VzIGluc3RhbmNlIG9mIG1vZHVsZSAqLwotICAgIERXT1JEICAgICBlc3A7ICAgICAgICAgICAgICAgICAgICAgICAgLyogMTAgMzItYml0IHN0YWNrIHBvaW50ZXIgKi8KKyAgICBEV09SRCAgICAgdW51c2VkMjsgICAgICAgICAgICAgICAgICAgIC8qIDEwICovCiAgICAgV09SRCAgICAgIGN0cmx3b3JkODA4NzsgICAgICAgICAgICAgICAvKiAxNCA4MHg4NyBjb250cm9sIHdvcmQgKi8KICAgICBXT1JEICAgICAgZmxhZ3M7ICAgICAgICAgICAgICAgICAgICAgIC8qIDE2IFRhc2sgZmxhZ3MgKi8KICAgICBVSU5UMTYgICAgZXJyb3JfbW9kZTsgICAgICAgICAgICAgICAgIC8qIDE4IEVycm9yIG1vZGUgKHNlZSBTZXRFcnJvck1vZGUpKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvd2luZG93cy5oIGIvaW5jbHVkZS93aW5kb3dzLmgKaW5kZXggZTJhZmQ0NS4uNWNkOWUxMSAxMDA2NDQKLS0tIGEvaW5jbHVkZS93aW5kb3dzLmgKKysrIGIvaW5jbHVkZS93aW5kb3dzLmgKQEAgLTUyMTAsNiArNTIxMCwzMiBAQAogCVVJTlQzMgl1aUxlbmd0aERyYXduOwogfSBEUkFXVEVYVFBBUkFNUywqTFBEUkFXVEVYVFBBUkFNUzsKIAorLyogaWZkZWYgX3g4Nl8gLi4uICovCit0eXBlZGVmIHN0cnVjdCBfTERUX0VOVFJZIHsKKyAgICBXT1JECUxpbWl0TG93OworICAgIFdPUkQJQmFzZUxvdzsKKyAgICB1bmlvbiB7CisJc3RydWN0IHsKKwkgICAgQllURQlCYXNlTWlkOworCSAgICBCWVRFCUZsYWdzMTsvKkRlY2xhcmUgYXMgYnl0ZXMgdG8gYXZvaWQgYWxpZ25tZW50IHByb2JsZW1zICovCisJICAgIEJZVEUJRmxhZ3MyOyAKKwkgICAgQllURQlCYXNlSGk7CisJfSBCeXRlczsKKwlzdHJ1Y3QgeworCSAgICBEV09SRAlCYXNlTWlkCQk6IDg7CisJICAgIERXT1JECVR5cGUJCTogNTsKKwkgICAgRFdPUkQJRHBsCQk6IDI7CisJICAgIERXT1JECVByZXMJCTogMTsKKwkgICAgRFdPUkQJTGltaXRIaQkJOiA0OworCSAgICBEV09SRAlTeXMJCTogMTsKKwkgICAgRFdPUkQJUmVzZXJ2ZWRfMAk6IDE7CisJICAgIERXT1JECURlZmF1bHRfQmlnCTogMTsKKwkgICAgRFdPUkQJR3JhbnVsYXJpdHkJOiAxOworCSAgICBEV09SRAlCYXNlSGkJCTogODsKKwl9IEJpdHM7CisgICAgfSBIaWdoV29yZDsKK30gTERUX0VOVFJZLCAqTFBMRFRfRU5UUlk7CisKICNwcmFnbWEgcGFjayg0KQogCiAvKiBEZWNsYXJhdGlvbnMgZm9yIGZ1bmN0aW9ucyB0aGF0IGV4aXN0IG9ubHkgaW4gV2luMTYgKi8KQEAgLTUyMTksNyArNTI0NSw2IEBACiBXT1JEICAgICAgICBXSU5BUEkgQWxsb2NTZWxlY3RvcihXT1JEKTsKIFdPUkQgICAgICAgIFdJTkFQSSBBbGxvY1NlbGVjdG9yQXJyYXkoV09SRCk7CiBWT0lEICAgICAgICBXSU5BUEkgQ2FsY0NoaWxkU2Nyb2xsKEhXTkQxNixXT1JEKTsKLUlOVDE2ICAgICAgIFdJTkFQSSBDYXRjaChMUENBVENIQlVGKTsKIFZPSUQgICAgICAgIFdJTkFQSSBDYXNjYWRlQ2hpbGRXaW5kb3dzKEhXTkQxNixXT1JEKTsKIElOVDE2ICAgICAgIFdJTkFQSSBDbG9zZUNvbW0oSU5UMTYpOwogSEdMT0JBTDE2ICAgV0lOQVBJIENyZWF0ZUN1cnNvckljb25JbmRpcmVjdChISU5TVEFOQ0UxNixDVVJTT1JJQ09OSU5GTyosCkBAIC01MjYxLDcgKzUyODYsNyBAQAogSERDMTYgICAgICAgV0lOQVBJIEdldERDU3RhdGUoSERDMTYpOwogSFdORDE2ICAgICAgV0lOQVBJIEdldERlc2t0b3BId25kKHZvaWQpOwogU0VHUFRSICAgICAgV0lOQVBJIEdldERPU0Vudmlyb25tZW50KHZvaWQpOwotSU5UMTYgICAgICAgV0lOQVBJIEdldEVudmlyb25tZW50KExQQ1NUUixMUFNUUixVSU5UMTYpOworSU5UMTYgICAgICAgV0lOQVBJIEdldEVudmlyb25tZW50KExQQ1NUUixMUERFVk1PREUxNixVSU5UMTYpOwogSE1PRFVMRTE2ICAgV0lOQVBJIEdldEV4ZVB0cihIQU5ETEUxNik7CiBXT1JEICAgICAgICBXSU5BUEkgR2V0RXhlVmVyc2lvbih2b2lkKTsKIFdPUkQgICAgICAgIFdJTkFQSSBHZXRFeHBXaW5WZXIoSE1PRFVMRTE2KTsKQEAgLTUzNDEsNyArNTM2Niw3IEBACiBEV09SRCAgICAgICBXSU5BUEkgU2V0RENPcmcoSERDMTYsSU5UMTYsSU5UMTYpOwogVk9JRCAgICAgICAgV0lOQVBJIFNldERDU3RhdGUoSERDMTYsSERDMTYpOwogQk9PTDE2ICAgICAgV0lOQVBJIFNldERlc2tQYXR0ZXJuKHZvaWQpOwotSU5UMTYgICAgICAgV0lOQVBJIFNldEVudmlyb25tZW50KExQQ1NUUixMUENTVFIsVUlOVDE2KTsKK0lOVDE2ICAgICAgIFdJTkFQSSBTZXRFbnZpcm9ubWVudChMUENTVFIsTFBERVZNT0RFMTYsVUlOVDE2KTsKIFdPUkQgICAgICAgIFdJTkFQSSBTZXRIb29rRmxhZ3MoSERDMTYsV09SRCk7CiBITUVUQUZJTEUxNiBXSU5BUEkgU2V0TWV0YUZpbGVCaXRzKEhHTE9CQUwxNik7CiBWT0lEICAgICAgICBXSU5BUEkgU2V0UHJpb3JpdHkoSFRBU0sxNixJTlQxNik7CkBAIC01MzU5LDcgKzUzODQsNiBAQAogVk9JRCAgICAgICAgV0lOQVBJIFN3aXRjaFN0YWNrQmFjayh2b2lkKTsKIFZPSUQgICAgICAgIFdJTkFQSSBTd2l0Y2hTdGFja1RvKFdPUkQsV09SRCxXT1JEKTsKIFZPSUQgICAgICAgIFdJTkFQSSBUaWxlQ2hpbGRXaW5kb3dzKEhXTkQxNixXT1JEKTsKLUlOVDE2ICAgICAgIFdJTkFQSSBUaHJvdyhMUENBVENIQlVGLElOVDE2KTsKIElOVDE2ICAgICAgIFdJTkFQSSBVbmdldENvbW1DaGFyKElOVDE2LENIQVIpOwogVk9JRCAgICAgICAgV0lOQVBJIFVzZXJZaWVsZCh2b2lkKTsKIEJPT0wxNiAgICAgIFdJTkFQSSBXYWl0RXZlbnQoSFRBU0sxNik7CkBAIC01NDkwLDYgKzU1MTQsNyBAQAogI2RlZmluZSAgICAgR2V0VGV4dEV4dGVudEV4UG9pbnQgV0lORUxJQl9OQU1FX0FXKEdldFRleHRFeHRlbnRFeFBvaW50KQogTENJRCAgICAgICAgV0lOQVBJIEdldFRocmVhZExvY2FsZSgpOwogSU5UMzIgICAgICAgV0lOQVBJIEdldFRocmVhZFByaW9yaXR5KEhBTkRMRTMyKTsKK0JPT0wzMiAgICAgIFdJTkFQSSBHZXRUaHJlYWRTZWxlY3RvckVudHJ5KEhBTkRMRTMyLERXT1JELExQTERUX0VOVFJZKTsKIEJPT0wzMiAgICAgIFdJTkFQSSBHZXRVc2VyTmFtZTMyQShMUFNUUixMUERXT1JEKTsKIEJPT0wzMiAgICAgIFdJTkFQSSBHZXRVc2VyTmFtZTMyVyhMUFdTVFIsTFBEV09SRCk7CiAjZGVmaW5lICAgICBHZXRVc2VyTmFtZSBXSU5FTElCX05BTUVfQVcoR2V0VXNlck5hbWUpCmRpZmYgLS1naXQgYS9pbmNsdWRlL3dpbm50LmggYi9pbmNsdWRlL3dpbm50LmgKaW5kZXggNjY2NDUyNy4uYTIzZGYxNCAxMDA2NDQKLS0tIGEvaW5jbHVkZS93aW5udC5oCisrKyBiL2luY2x1ZGUvd2lubnQuaApAQCAtMTM5LDMyICsxMzksNiBAQAogCiAjZW5kaWYgIC8qIF9fV0lORV9fICovCiAKLS8qIGlmZGVmIF94ODZfIC4uLiAqLwotdHlwZWRlZiBzdHJ1Y3QgX0xEVF9FTlRSWSB7Ci0gICAgV09SRAlMaW1pdExvdzsKLSAgICBXT1JECUJhc2VMb3c7Ci0gICAgdW5pb24gewotCXN0cnVjdCB7Ci0JICAgIEJZVEUJQmFzZU1pZDsKLQkgICAgQllURQlGbGFnczE7LypEZWNsYXJlIGFzIGJ5dGVzIHRvIGF2b2lkIGFsaWdubWVudCBwcm9ibGVtcyAqLwotCSAgICBCWVRFCUZsYWdzMjsgCi0JICAgIEJZVEUJQmFzZUhpOwotCX0gQnl0ZXM7Ci0Jc3RydWN0IHsKLQkgICAgRFdPUkQJQmFzZU1pZAkJOiA4OwotCSAgICBEV09SRAlUeXBlCQk6IDU7Ci0JICAgIERXT1JECURwbAkJOiAyOwotCSAgICBEV09SRAlQcmVzCQk6IDE7Ci0JICAgIERXT1JECUxpbWl0SGkJCTogNDsKLQkgICAgRFdPUkQJU3lzCQk6IDE7Ci0JICAgIERXT1JECVJlc2VydmVkXzAJOiAxOwotCSAgICBEV09SRAlEZWZhdWx0X0JpZwk6IDE7Ci0JICAgIERXT1JECUdyYW51bGFyaXR5CTogMTsKLQkgICAgRFdPUkQJQmFzZUhpCQk6IDg7Ci0JfSBCaXRzOwotICAgIH0gSGlnaFdvcmQ7Ci19IExEVF9FTlRSWSwgKkxQTERUX0VOVFJZOwotCiAvKgogICogRXhjZXB0aW9uIGNvZGVzCiAgKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvd2luc29jay5oIGIvaW5jbHVkZS93aW5zb2NrLmgKaW5kZXggY2ZkMWNlNS4uODQxODdlZiAxMDA2NDQKLS0tIGEvaW5jbHVkZS93aW5zb2NrLmgKKysrIGIvaW5jbHVkZS93aW5zb2NrLmgKQEAgLTE3Niw3ICsxNzYsNyBAQAogI2RlZmluZSBXU19TT19MSU5HRVIgICAgICAgMHgwMDgwICAgICAgICAgIC8qIGxpbmdlciBvbiBjbG9zZSBpZiBkYXRhIHByZXNlbnQgKi8KICNkZWZpbmUgV1NfU09fT09CSU5MSU5FICAgIDB4MDEwMCAgICAgICAgICAvKiBsZWF2ZSByZWNlaXZlZCBPT0IgZGF0YSBpbiBsaW5lICovCiAKLSNkZWZpbmUgV1NfU09fRE9OVExJTkdFUiAgIChVSU5UMTYpKH5XU19TT19MSU5HRVIpCisjZGVmaW5lIFdTX1NPX0RPTlRMSU5HRVIgICAoVUlOVDMyKSh+V1NfU09fTElOR0VSKQogCiAvKgogICogQWRkaXRpb25hbCBvcHRpb25zLgpAQCAtMjM1LDcgKzIzNSw3IEBACiAjZGVmaW5lIFdTX0ZEX0NPTk5FQ1QgICAgICAweDAwMTAKICNkZWZpbmUgV1NfRkRfQ0xPU0UgICAgICAgIDB4MDAyMAogCi0jZGVmaW5lIFdTX0ZEX05PTkJMT0NLCSAgIDB4MTAwMDAwMDAJLyogaW50ZXJuYWwgcGVyLXNvY2tldCBmbGFncyAqLworI2RlZmluZSBXU19GRF9MSVNURU5JTkcJICAgMHgxMDAwMDAwMAkvKiBpbnRlcm5hbCBwZXItc29ja2V0IGZsYWdzICovCiAjZGVmaW5lIFdTX0ZEX0lOQUNUSVZFCSAgIDB4MjAwMDAwMDAKICNkZWZpbmUgV1NfRkRfQ09OTkVDVEVECSAgIDB4NDAwMDAwMDAKICNkZWZpbmUgV1NfRkRfUkFXCSAgIDB4ODAwMDAwMDAKZGlmZiAtLWdpdCBhL2xpYnRlc3QvTWFrZWZpbGUuaW4gYi9saWJ0ZXN0L01ha2VmaWxlLmluCmluZGV4IGU5Zjc3MmEuLjNhODUxMDkgMTAwNjQ0Ci0tLSBhL2xpYnRlc3QvTWFrZWZpbGUuaW4KKysrIGIvbGlidGVzdC9NYWtlZmlsZS5pbgpAQCAtMyw2ICszLDcgQEAKIFNSQ0RJUiAgICA9IEBzcmNkaXJACiBWUEFUSCAgICAgPSBAc3JjZGlyQAogTU9EVUxFICAgID0gbm9uZQorUkNGTEFHUyAgID0gLXcxNiAtaAogUFJPR1JBTVMgID0gZXhwYW5kIGhlbGxvIGhlbGxvMiBoZWxsbzMgaGVsbG80IG5ldyByb2xleAogQUxMX0xJQlMgID0gJChXSU5FTElCKSAkKFhfTElCUykgJChYUE1fTElCKSAkKFhMSUIpICQoTERMSUJTKQogCkBAIC0xNSwxMyArMTYsMTcgQEAKIAluZXcuYyBcCiAJcm9sZXguYwogCi1HRU5fQ19TUkNTID0gXAotCWhlbGxvM3Jlcy5jCitSQ19TUkNTID0gXAorCWhlbGxvM3Jlcy5yYwogCiBhbGw6IGNoZWNrX3dpbmVyYyAkKFBST0dSQU1TKQogCitkZXBlbmQ6OiAkKFJDX1NSQ1M6LnJjPS5oKQorCiBATUFLRV9SVUxFU0AKIAorJChSQ19TUkNTOi5yYz0uYykgJChSQ19TUkNTOi5yYz0uaCk6ICQoV0lORVJDKQorCiBleHBhbmQ6IGV4cGFuZC5vCiAJJChDQykgLW8gZXhwYW5kIGV4cGFuZC5vICQoTERPUFRJT05TKSAkKEFMTF9MSUJTKQogCkBAIC00Myw2ICs0OCw0IEBACiByb2xleDogcm9sZXgubwogCSQoQ0MpIC1vIHJvbGV4IHJvbGV4Lm8gJChMRE9QVElPTlMpICQoQUxMX0xJQlMpCiAKLWhlbGxvM3Jlcy5jIGhlbGxvM3Jlcy5oOiAkKFdJTkVSQykKLQogIyMjIERlcGVuZGVuY2llczoKZGlmZiAtLWdpdCBhL2xpYnRlc3QvaGVsbG8zcmVzLnJjIGIvbGlidGVzdC9oZWxsbzNyZXMucmMKaW5kZXggNWY1NDA4Yy4uYzBkZmUwYSAxMDA2NDQKLS0tIGEvbGlidGVzdC9oZWxsbzNyZXMucmMKKysrIGIvbGlidGVzdC9oZWxsbzNyZXMucmMKQEAgLTI0LDcgKzI0LDMgQEAKIAlDT05UUk9MICIiLCAxMDYsICJMSVNUQk9YIiwgTEJTX1NUQU5EQVJEIHwgTEJTX0RJU0FCTEVOT1NDUk9MTCB8IFdTX0NISUxEIHwgV1NfVklTSUJMRSB8IFdTX1RBQlNUT1AsIDg2LCAyMywgODYsIDg1CiAjZW5kaWYKIEVORAotCi0KLUJJVERFTU8gQklUTUFQICIuLi9yYy93aW5lbG9nby5ibXAiCi0KZGlmZiAtLWdpdCBhL2xvYWRlci9tYWluLmMgYi9sb2FkZXIvbWFpbi5jCmluZGV4IGIzZTRmOGIuLjk0NGZmYjcgMTAwNjQ0Ci0tLSBhL2xvYWRlci9tYWluLmMKKysrIGIvbG9hZGVyL21haW4uYwpAQCAtMjMsNiArMjMsNyBAQAogI2luY2x1ZGUgInF1ZXVlLmgiCiAjaW5jbHVkZSAic3lzY29sb3IuaCIKICNpbmNsdWRlICJzeXNtZXRyaWNzLmgiCisjaW5jbHVkZSAiY2FsbGJhY2suaCIKICNpbmNsdWRlICJmaWxlLmgiCiAjaW5jbHVkZSAiZ2RpLmgiCiAjaW5jbHVkZSAiaGVhcC5oIgpAQCAtMTgwLDEwICsxODEsMTEgQEAKIGludCBtYWluKGludCBhcmdjLCBjaGFyICphcmd2W10gKQogewogICAgIGV4dGVybiBCT09MMzIgTUFJTl9XaW5lSW5pdCggaW50ICphcmdjLCBjaGFyICphcmd2W10gKTsKKyAgICBleHRlcm4gdm9pZCAqQ0FMTDMyX0luaXQodm9pZCk7CiAgICAgZXh0ZXJuIGNoYXIgKiBERUJVR19hcmd2MDsKIAogICAgIGludCBpLGxvYWRlZDsKLSAgICBISU5TVEFOQ0UxNiBoYW5kbGU7CisgICAgSElOU1RBTkNFMzIgaGFuZGxlOwogCiAgICAgX193aW5lbGliID0gMDsgIC8qIEZpcnN0IG9mIGFsbCwgY2xlYXIgdGhlIFdpbmVsaWIgZmxhZyAqLwogCkBAIC0xOTYsNiArMTk4LDEwIEBACiAgICAgaWYgKCFNQUlOX1dpbmVJbml0KCAmYXJnYywgYXJndiApKSByZXR1cm4gMTsKICAgICBpZiAoIU1BSU5fSW5pdCgpKSByZXR1cm4gMTsKIAorICAgIC8qIEluaXRpYWxpemUgQ0FMTDMyIHJvdXRpbmVzICovCisgICAgLyogVGhpcyBuZWVkcyB0byBiZSBkb25lIGp1c3QgYmVmb3JlIHRhc2stc3dpdGNoaW5nIHN0YXJ0cyAqLworICAgIElGMTYzMl9DYWxsTGFyZ2VTdGFjayA9IChpbnQgKCopKGludCAoKmZ1bmMpKCksIHZvaWQgKmFyZykpQ0FMTDMyX0luaXQoKTsKKwogICAgIGxvYWRlZD0wOwogICAgIGZvciAoaSA9IDE7IGkgPCBhcmdjOyBpKyspCiAgICAgewpkaWZmIC0tZ2l0IGEvbG9hZGVyL21vZHVsZS5jIGIvbG9hZGVyL21vZHVsZS5jCmluZGV4IGM0MGQyNDAuLmQxY2MyYjUgMTAwNjQ0Ci0tLSBhL2xvYWRlci9tb2R1bGUuYworKysgYi9sb2FkZXIvbW9kdWxlLmMKQEAgLTYzOSw3ICs2MzksOSBAQAogICAgICAgICAgICAgICAgICAgbmVfaGVhZGVyLnJuYW1lX3RhYl9vZmZzZXQgLSBuZV9oZWFkZXIucmVzb3VyY2VfdGFiX29mZnNldCwKICAgICAgICAgICAgICAgICAgIHBEYXRhICkpIHJldHVybiAoSE1PRFVMRTMyKTExOyAgLyogaW52YWxpZCBleGUgKi8KICAgICAgICAgcERhdGEgKz0gbmVfaGVhZGVyLnJuYW1lX3RhYl9vZmZzZXQgLSBuZV9oZWFkZXIucmVzb3VyY2VfdGFiX29mZnNldDsKKyNpZm5kZWYgV0lORUxJQgogCU5FX0luaXRSZXNvdXJjZUhhbmRsZXIoIGhNb2R1bGUgKTsKKyNlbmRpZgogICAgIH0KICAgICBlbHNlIHBNb2R1bGUtPnJlc190YWJsZSA9IDA7ICAvKiBObyByZXNvdXJjZSB0YWJsZSAqLwogCkBAIC0xMjE5LDcgKzEyMjEsNiBAQAogCWlmIChwTW9kdWxlLT5mbGFncyAmIE5FX0ZGTEFHU19TRUxGTE9BRCkKIAl7CiAgICAgICAgICAgICAgICAgSEZJTEUzMiBoZjsKLSAgICAgICAgICAgICAgICBIR0xPQkFMMTYgaEluaXRpYWxTdGFjazMyID0gMDsKIAkJLyogSGFuZGxlIHNlbGYgbG9hZGluZyBtb2R1bGVzICovCiAJCVNFR1RBQkxFRU5UUlkgKiBwU2VnVGFibGUgPSAoU0VHVEFCTEVFTlRSWSAqKSBORV9TRUdfVEFCTEUocE1vZHVsZSk7CiAJCVNFTEZMT0FESEVBREVSICpzZWxmbG9hZGhlYWRlcjsKQEAgLTEyNTksNDQgKzEyNjAsMTQgQEAKICAgICAgICAgICAgICAgICBzdGFjazE2VG9wLT5pcCA9IDA7CiAgICAgICAgICAgICAgICAgc3RhY2sxNlRvcC0+Y3MgPSAwOwogCi0JCWlmICghSUYxNjMyX1NhdmVkMzJfZXNwKQotICAgICAgICAgICAgICAgIHsKLQkJICBTVEFDSzMyRlJBTUUqIGZyYW1lMzI7Ci0JCSAgY2hhciAqc3RhY2szMlRvcDsKLQkJICAvKiBTZXR1cCBhbiBpbml0aWFsIDMyIGJpdCBzdGFjayBmcmFtZSAqLwotCQkgIGhJbml0aWFsU3RhY2szMiA9IEdMT0JBTF9BbGxvYyggR01FTV9GSVhFRCwgMHgxMDAwMCwKLQkJCQkJCSAgaE1vZHVsZSwgRkFMU0UsIEZBTFNFLCAKLQkJCQkJCSAgRkFMU0UgKTsKLQotCQkgIC8qIENyZWF0ZSB0aGUgMzItYml0IHN0YWNrIGZyYW1lICovCi0JCSAgCi0JCSAgc3RhY2szMlRvcCA9IChjaGFyKilHbG9iYWxMb2NrMTYoaEluaXRpYWxTdGFjazMyKSArIAotCQkgICAgMHgxMDAwMDsKLQkJICBmcmFtZTMyID0gKFNUQUNLMzJGUkFNRSAqKXN0YWNrMzJUb3AgLSAxOwotCQkgIGZyYW1lMzItPnNhdmVkX2VzcCA9IChEV09SRClzdGFjazMyVG9wOwotCQkgIGZyYW1lMzItPmVkaSA9IDA7Ci0JCSAgZnJhbWUzMi0+ZXNpID0gMDsKLQkJICBmcmFtZTMyLT5lZHggPSAwOwotCQkgIGZyYW1lMzItPmVjeCA9IDA7Ci0JCSAgZnJhbWUzMi0+ZWJ4ID0gMDsKLQkJICBmcmFtZTMyLT5lYnAgPSAwOwotCQkgIGZyYW1lMzItPnJlc3RvcmVfYWRkciA9IDA7Ci0JCSAgZnJhbWUzMi0+cmV0YWRkciAgICAgID0gMDsKLQkJICBmcmFtZTMyLT5jb2Rlc2VsZWN0b3IgPSBXSU5FX0NPREVfU0VMRUNUT1I7Ci0JCSAgLyogcFRhc2stPmVzcCA9IChEV09SRClmcmFtZTMyOyAqLwotCQl9CiAgICAgICAgICAgICAgICAgaGYgPSBGSUxFX0R1cFVuaXhIYW5kbGUoIE1PRFVMRV9PcGVuRmlsZSggaE1vZHVsZSApICk7CiAJCUNhbGxUbzE2X3dvcmRfd3coIHNlbGZsb2FkaGVhZGVyLT5Cb290QXBwLCBoTW9kdWxlLCBoZiApOwogICAgICAgICAgICAgICAgIF9sY2xvc2UzMihoZik7CiAJCS8qIHNvbWUgQm9vdEFwcCBwcm9jcyBvdmVyd3JpdGUgdGhlIHNlbGVjdG9yIG9mIGRncm91cCAqLwogCQlwU2VnVGFibGVbcE1vZHVsZS0+ZGdyb3VwIC0gMV0uc2VsZWN0b3IgPSBzYXZlZF9kZ3JvdXA7CiAJCUlGMTYzMl9TYXZlZDE2X3NzX3NwID0gb2xkc3RhY2s7Ci0JCWZvciAoaSA9IDI7IGkgPD0gcE1vZHVsZS0+c2VnX2NvdW50OyBpKyspIE5FX0xvYWRTZWdtZW50KCBoTW9kdWxlLCBpICk7Ci0JCWlmIChoSW5pdGlhbFN0YWNrMzIpCi0gICAgICAgICAgICAgICAgewotCQkgIEdsb2JhbEZyZWUxNihoSW5pdGlhbFN0YWNrMzIpOwotCQkgIGhJbml0aWFsU3RhY2szMiA9IDA7Ci0JCX0KKwkJZm9yIChpID0gMjsgaSA8PSBwTW9kdWxlLT5zZWdfY291bnQ7IGkrKykKKyAgICAgICAgICAgICAgICAgICAgTkVfTG9hZFNlZ21lbnQoIGhNb2R1bGUsIGkgKTsKIAl9IAogCWVsc2UKICAgICAgICAgewpAQCAtMTYzOCw3ICsxNjA5LDcgQEAKICAgICAgICAgcmV0dXJuIDI7ICAvKiBGaWxlIG5vdCBmb3VuZCAqLwogICAgIGlmICghKGNtZFNob3dIYW5kbGUgPSBHbG9iYWxBbGxvYzE2KCAwLCAyICogc2l6ZW9mKFdPUkQpICkpKQogICAgICAgICByZXR1cm4gODsgIC8qIE91dCBvZiBtZW1vcnkgKi8KLSAgICBpZiAoIShjbWRMaW5lSGFuZGxlID0gR2xvYmFsQWxsb2MxNiggMCwgMTAyNCApKSkKKyAgICBpZiAoIShjbWRMaW5lSGFuZGxlID0gR2xvYmFsQWxsb2MxNiggMCwgMjU2ICkpKQogICAgIHsKICAgICAgICAgR2xvYmFsRnJlZTE2KCBjbWRTaG93SGFuZGxlICk7CiAgICAgICAgIHJldHVybiA4OyAgLyogT3V0IG9mIG1lbW9yeSAqLwpAQCAtMTY4MywxMSArMTY1NCwxMSBAQAogCX0KIAogCWlmICgqcCkKLQkgICAgbHN0cmNweW4zMkEoIGNtZGxpbmUgKyAxLCBwICsgMSwgMTAyMyApOworCSAgICBsc3RyY3B5bjMyQSggY21kbGluZSArIDEsIHAgKyAxLCAyNTUgKTsKIAllbHNlCiAJICAgIGNtZGxpbmVbMV0gPSAnXDAnOwogCi0JY21kbGluZVswXSA9IHN0cmxlbiggY21kbGluZSArIDEgKSArIDE7CisJY21kbGluZVswXSA9IHN0cmxlbiggY21kbGluZSArIDEgKTsKIAkqcCA9ICdcMCc7CiAKIAkvKiBOb3cgbG9hZCB0aGUgZXhlY3V0YWJsZSBmaWxlICovCmRpZmYgLS1naXQgYS9sb2FkZXIvbmVfaW1hZ2UuYyBiL2xvYWRlci9uZV9pbWFnZS5jCmluZGV4IGUxNjMxZTkuLjQ4ZGY2NWYgMTAwNjQ0Ci0tLSBhL2xvYWRlci9uZV9pbWFnZS5jCisrKyBiL2xvYWRlci9uZV9pbWFnZS5jCkBAIC01MjAsNyArNTIwLDcgQEAKICAgICBkcHJpbnRmX2RsbCggc3RkZGViLCAiQ2FsbGluZyBMaWJNYWluLCBjczppcD0lMDRseDolMDR4IGRzPSUwNGx4IGRpPSUwNHggY3g9JTA0eFxuIiwgCiAgICAgICAgICAgICAgICAgIENTX3JlZygmY29udGV4dCksIElQX3JlZygmY29udGV4dCksIERTX3JlZygmY29udGV4dCksCiAgICAgICAgICAgICAgICAgIERJX3JlZygmY29udGV4dCksIENYX3JlZygmY29udGV4dCkgKTsKLSAgICBDYWxsVG8xNl9yZWdzXyggJmNvbnRleHQgKTsKKyAgICBDYWxsVG8xNl9yZWdzXyggJmNvbnRleHQsIDAgKTsKICAgICByZXR1cm4gVFJVRTsKIH0KIApkaWZmIC0tZ2l0IGEvbG9hZGVyL3BlX2ltYWdlLmMgYi9sb2FkZXIvcGVfaW1hZ2UuYwppbmRleCA0MTUwOTRmLi5mNTM1NzViIDEwMDY0NAotLS0gYS9sb2FkZXIvcGVfaW1hZ2UuYworKysgYi9sb2FkZXIvcGVfaW1hZ2UuYwpAQCAtMSw0ICsxLDMgQEAKLSNpZm5kZWYgV0lORUxJQgogLyogCiAgKiAgQ29weXJpZ2h0CTE5OTQJRXJpYyBZb3VuZGFsZSAmIEVyaWsgQm9zCiAgKiAgQ29weXJpZ2h0CTE5OTUJTWFydGluIHZvbiBM9ndpcwpAQCAtMTIsNiArMTEsNyBAQAogICovCiAKICNpbmNsdWRlIDxjdHlwZS5oPgorI2luY2x1ZGUgPGVycm5vLmg+CiAjaW5jbHVkZSA8c3RkaW8uaD4KICNpbmNsdWRlIDxzdGRsaWIuaD4KICNpbmNsdWRlIDxzdHJpbmcuaD4KQEAgLTMzLDggKzMzLDEwIEBACiAjaW5jbHVkZSAib3B0aW9ucy5oIgogI2luY2x1ZGUgInN0ZGRlYnVnLmgiCiAjaW5jbHVkZSAiZGVidWcuaCIKLSNpbmNsdWRlICJkZWJ1Z2dlci5oIgogI2luY2x1ZGUgInhtYWxsb2MuaCIKKyNpZm5kZWYgV0lORUxJQgorI2luY2x1ZGUgImRlYnVnZ2VyLmgiCisjZW5kaWYKIAogc3RhdGljIHZvaWQgUEVfSW5pdERMTChQRV9NT0RSRUYqIG1vZHJlZiwgRFdPUkQgdHlwZSwgTFBWT0lEIGxwUmVzZXJ2ZWQpOwogCkBAIC00Myw2ICs0NSw3IEBACiAKIHZvaWQgZHVtcF9leHBvcnRzKElNQUdFX0VYUE9SVF9ESVJFQ1RPUlkgKiBwZV9leHBvcnRzLCB1bnNpZ25lZCBpbnQgbG9hZF9hZGRyKQogeyAKKyNpZm5kZWYgV0lORUxJQgogICBjaGFyCQkqTW9kdWxlOwogICBpbnQJCWk7CiAgIHVfc2hvcnQJKm9yZGluYWw7CkBAIC04MSw2ICs4NCw3IEBACiAgICAgICB9CiAgICAgICBERUJVR19BZGRTeW1ib2woYnVmZmVyLCZkYWRkciwgTlVMTCwgU1lNX1dJTjMyIHwgU1lNX0ZVTkMpOwogICB9CisjZW5kaWYKIH0KIAogLyogTG9vayB1cCB0aGUgc3BlY2lmaWVkIGZ1bmN0aW9uIG9yIG9yZGluYWwgaW4gdGhlIGV4cG9ydGxpc3Q6CkBAIC00MjgsMTEgKzQzMiw4IEBACiBzdGF0aWMgUEVfTU9EVUxFICpQRV9Mb2FkSW1hZ2UoIGludCBmZCApCiB7CiAJc3RydWN0IHBlX2RhdGEJCSpwZTsKLQlEQkdfQUREUgkJZGFkZHI7CiAJc3RydWN0IHN0YXQJCXN0YnVmOwogCi0JZGFkZHIuc2VnPTA7Ci0JZGFkZHIudHlwZSA9IE5VTEw7CiAJaWYgKC0xPT1mc3RhdChmZCwmc3RidWYpKSB7CiAJCXBlcnJvcigiUEVfTG9hZEltYWdlOmZzdGF0Iik7CiAJCXJldHVybiBOVUxMOwpAQCAtNDQzLDkgKzQ0NCwzMyBAQAogCS8qIG1hcCB0aGUgUEUgaW1hZ2Ugc29tZXdoZXJlICovCiAJcGUtPm1hcHBlZGRsbCA9IChITU9EVUxFMzIpbW1hcChOVUxMLHN0YnVmLnN0X3NpemUsUFJPVF9SRUFELE1BUF9TSEFSRUQsZmQsMCk7CiAJaWYgKCFwZS0+bWFwcGVkZGxsIHx8IHBlLT5tYXBwZWRkbGw9PS0xKSB7Ci0JCXBlcnJvcigiUEVfTG9hZEltYWdlOm1tYXAiKTsKLQkJZnJlZShwZSk7Ci0JCXJldHVybiBOVUxMOworCQlpZiAoZXJybm89PUVOT0VYRUMpIHsKKwkJCWludAlyZXM9MCxjdXJyZWFkID0gMDsKKworCQkJbHNlZWsoZmQsMCxTRUVLX1NFVCk7CisJCQkvKiBsaW51eDogc29tZSBmaWxlc3lzdGVtcyBkb24ndCBzdXBwb3J0IG1tYXAgKHNhbWJhLAorCQkJICogbnRmcyBhcHBhcmVudGx5KSBzbyB3ZSBoYXZlIHRvIHJlYWQgdGhlIGltYWdlIHRoZQorCQkJICogaGFyZCB3YXkKKwkJCSAqLworCQkJcGUtPm1hcHBlZGRsbCA9IHhtYWxsb2Moc3RidWYuc3Rfc2l6ZSk7CisJCQl3aGlsZSAoY3VycmVhZCA8IHN0YnVmLnN0X3NpemUpIHsKKwkJCQlyZXMgPSByZWFkKGZkLHBlLT5tYXBwZWRkbGwrY3VycmVhZCxzdGJ1Zi5zdF9zaXplLWN1cnJlYWQpOworCQkJCWlmIChyZXM8PTApIAorCQkJCQlicmVhazsKKwkJCQljdXJyZWFkKz1yZXM7CisJCQl9CisJCQlpZiAocmVzID09IC0xKSB7CisJCQkJcGVycm9yKCJQRV9Mb2FkSW1hZ2U6bW1hcCBjb21wYXQgcmVhZCIpOworCQkJCWZyZWUocGUtPm1hcHBlZGRsbCk7CisJCQkJZnJlZShwZSk7CisJCQkJcmV0dXJuIE5VTEw7CisJCQl9CisKKwkJfSBlbHNlIHsKKwkJCXBlcnJvcigiUEVfTG9hZEltYWdlOm1tYXAiKTsKKwkJCWZyZWUocGUpOworCQkJcmV0dXJuIE5VTEw7CisJCX0KIAl9CiAJLyogbGluayBQRSBoZWFkZXIgKi8KIAlwZS0+cGVfaGVhZGVyID0gKElNQUdFX05UX0hFQURFUlMqKShwZS0+bWFwcGVkZGxsKygoKElNQUdFX0RPU19IRUFERVIqKXBlLT5tYXBwZWRkbGwpLT5lX2xmYW5ldykpOwpAQCAtNDk5LDcgKzUyNCw2IEBACiAJaW50CQkJbG9hZF9hZGRyOwogCUlNQUdFX0RBVEFfRElSRUNUT1JZCWRpcjsKIAljaGFyCQkJYnVmZmVyWzIwMF07Ci0JREJHX0FERFIJCWRhZGRyOwogCWNoYXIJCQkqbW9kbmFtZTsKIAlpbnQJCQl2bWFfc2l6ZTsKIAkKQEAgLTYwNCw2ICs2MjgsNyBAQAogCQlwZW0tPnBlX3JlbG9jID0gKHZvaWQgKikgUlZBKGRpci5WaXJ0dWFsQWRkcmVzcyk7CiAJfQogCisjaWZuZGVmIFdJTkVMSUIKIAlpZihwZS0+cGVfaGVhZGVyLT5PcHRpb25hbEhlYWRlci5EYXRhRGlyZWN0b3J5CiAJCVtJTUFHRV9ESVJFQ1RPUllfRU5UUllfREVCVUddLlNpemUpCiAJICB7CkBAIC02MTEsNiArNjM2LDcgQEAKIAkJCXBlLT5wZV9oZWFkZXItPk9wdGlvbmFsSGVhZGVyLkRhdGFEaXJlY3RvcnlbSU1BR0VfRElSRUNUT1JZX0VOVFJZX0RFQlVHXS5WaXJ0dWFsQWRkcmVzcywKIAkJCXBlLT5wZV9oZWFkZXItPk9wdGlvbmFsSGVhZGVyLkRhdGFEaXJlY3RvcnlbSU1BR0VfRElSRUNUT1JZX0VOVFJZX0RFQlVHXS5TaXplKTsKIAkgIH0KKyNlbmRpZgogCiAJaWYocGUtPnBlX2hlYWRlci0+T3B0aW9uYWxIZWFkZXIuRGF0YURpcmVjdG9yeQogCQlbSU1BR0VfRElSRUNUT1JZX0VOVFJZX0NPUFlSSUdIVF0uU2l6ZSkKQEAgLTY1NywxOSArNjgzLDI0IEBACiAJCQkqcz0nXDAnOwogCX0KIAotCS8qIGFkZCBzdGFydCBvZiBzZWN0aW9ucyBhcyBkZWJ1Z3N5bWJvbHMgKi8KLQlmb3IoaT0wO2k8cGUtPnBlX2hlYWRlci0+RmlsZUhlYWRlci5OdW1iZXJPZlNlY3Rpb25zO2krKykgeworI2lmbmRlZiBXSU5FTElCCisgICAgICAgIHsKKyAgICAgICAgICAgIERCR19BRERSIGRhZGRyID0geyBOVUxMLCAwLCAwIH07CisgICAgICAgICAgICAvKiBhZGQgc3RhcnQgb2Ygc2VjdGlvbnMgYXMgZGVidWdzeW1ib2xzICovCisgICAgICAgICAgICBmb3IoaT0wO2k8cGUtPnBlX2hlYWRlci0+RmlsZUhlYWRlci5OdW1iZXJPZlNlY3Rpb25zO2krKykgewogCQlzcHJpbnRmKGJ1ZmZlciwiJXNfJXMiLG1vZG5hbWUscGUtPnBlX3NlZ1tpXS5OYW1lKTsKIAkJZGFkZHIub2ZmPSBSVkEocGUtPnBlX3NlZ1tpXS5WaXJ0dWFsQWRkcmVzcyk7CiAJCURFQlVHX0FkZFN5bWJvbChidWZmZXIsJmRhZGRyLCBOVUxMLCBTWU1fV0lOMzIgfCBTWU1fRlVOQyk7Ci0JfQotCS8qIGFkZCBlbnRyeSBwb2ludCAqLwotCXNwcmludGYoYnVmZmVyLCIlc19FbnRyeVBvaW50Iixtb2RuYW1lKTsKLQlkYWRkci5vZmY9UlZBKHBlLT5wZV9oZWFkZXItPk9wdGlvbmFsSGVhZGVyLkFkZHJlc3NPZkVudHJ5UG9pbnQpOwotCURFQlVHX0FkZFN5bWJvbChidWZmZXIsJmRhZGRyLCBOVUxMLCBTWU1fV0lOMzIgfCBTWU1fRlVOQyk7Ci0JLyogYWRkIHN0YXJ0IG9mIERMTCAqLwotCWRhZGRyLm9mZj1sb2FkX2FkZHI7Ci0JREVCVUdfQWRkU3ltYm9sKG1vZG5hbWUsJmRhZGRyLCBOVUxMLCBTWU1fV0lOMzIgfCBTWU1fRlVOQyk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICAvKiBhZGQgZW50cnkgcG9pbnQgKi8KKyAgICAgICAgICAgIHNwcmludGYoYnVmZmVyLCIlc19FbnRyeVBvaW50Iixtb2RuYW1lKTsKKyAgICAgICAgICAgIGRhZGRyLm9mZj1SVkEocGUtPnBlX2hlYWRlci0+T3B0aW9uYWxIZWFkZXIuQWRkcmVzc09mRW50cnlQb2ludCk7CisgICAgICAgICAgICBERUJVR19BZGRTeW1ib2woYnVmZmVyLCZkYWRkciwgTlVMTCwgU1lNX1dJTjMyIHwgU1lNX0ZVTkMpOworICAgICAgICAgICAgLyogYWRkIHN0YXJ0IG9mIERMTCAqLworICAgICAgICAgICAgZGFkZHIub2ZmPWxvYWRfYWRkcjsKKyAgICAgICAgICAgIERFQlVHX0FkZFN5bWJvbChtb2RuYW1lLCZkYWRkciwgTlVMTCwgU1lNX1dJTjMyIHwgU1lNX0ZVTkMpOworICAgICAgICB9CisjZW5kaWYKIH0KIAogSElOU1RBTkNFMTYgTU9EVUxFX0NyZWF0ZUluc3RhbmNlKEhNT0RVTEUxNiBoTW9kdWxlLExPQURQQVJBTVMgKnBhcmFtcyk7CkBAIC02ODIsMzYgKzcxMyw0NyBAQAogCU9GU1RSVUNUCW9mczsKIAlITU9EVUxFMzIJaE1vZHVsZTsKIAlORV9NT0RVTEUJKnBNb2R1bGU7CisJUEVfTU9EUkVGCSpwZW07CiAKLQlpZiAoKGhNb2R1bGUgPSBNT0RVTEVfRmluZE1vZHVsZSggbmFtZSApKSkKLQkJcmV0dXJuIGhNb2R1bGU7CisJaWYgKChoTW9kdWxlID0gTU9EVUxFX0ZpbmRNb2R1bGUoIG5hbWUgKSkpIHsKKwkJLyogdGhlIC5ETEwgaXMgZWl0aGVyIGxvYWRlZCBvciBpbnRlcm5hbCAqLworCQloTW9kdWxlID0gTU9EVUxFX0hBTkRMRXRvSE1PRFVMRTMyKGhNb2R1bGUpOworCQlpZiAoIUhJV09SRChoTW9kdWxlKSkgLyogaW50ZXJuYWwgKG9yIGJhZCkgKi8KKwkJCXJldHVybiBoTW9kdWxlOworCQkvKiBjaGVjayBpZiB0aGlzIG1vZHVsZSBpcyBhbHJlYWR5IG1hcHBlZCAqLworCQlwZW0gCT0gKChQREIzMiopR2V0Q3VycmVudFByb2Nlc3NJZCgpKS0+bW9kcmVmX2xpc3Q7CisJCXdoaWxlIChwZW0pIHsKKwkJCWlmIChwZW0tPnBlX21vZHVsZS0+bWFwcGVkZGxsID09IGhNb2R1bGUpCisJCQkJcmV0dXJuIGhNb2R1bGU7CisJCQlwZW0gPSBwZW0tPm5leHQ7CisJCX0KKwkJcE1vZHVsZSA9IE1PRFVMRV9HZXRQdHIoaE1vZHVsZSk7CisJfSBlbHNlIHsKIAotCS8qIHRyeSB0byBsb2FkIGJ1aWx0aW4sIGVuYWJsZWQgbW9kdWxlcyBmaXJzdCAqLwotCWlmICgoaE1vZHVsZSA9IEJVSUxUSU5fTG9hZE1vZHVsZSggbmFtZSwgRkFMU0UgKSkpCi0JCXJldHVybiBoTW9kdWxlOworCQkvKiB0cnkgdG8gbG9hZCBidWlsdGluLCBlbmFibGVkIG1vZHVsZXMgZmlyc3QgKi8KKwkJaWYgKChoTW9kdWxlID0gQlVJTFRJTl9Mb2FkTW9kdWxlKCBuYW1lLCBGQUxTRSApKSkKKwkJCXJldHVybiBoTW9kdWxlOwogCi0JLyogdHJ5IHRvIG9wZW4gdGhlIHNwZWNpZmllZCBmaWxlICovCi0JaWYgKEhGSUxFX0VSUk9SMzI9PShoRmlsZT1PcGVuRmlsZTMyKG5hbWUsJm9mcyxPRl9SRUFEKSkpIHsKLQkJLyogTm93IHRyeSB0aGUgYnVpbHQtaW4gZXZlbiBpZiBkaXNhYmxlZCAqLwotCQlpZiAoKGhNb2R1bGUgPSBCVUlMVElOX0xvYWRNb2R1bGUoIG5hbWUsIFRSVUUgKSkpIHsKLQkJCWZwcmludGYoIHN0ZGVyciwgIldhcm5pbmc6IGNvdWxkIG5vdCBsb2FkIFdpbmRvd3MgRExMICclcycsIHVzaW5nIGJ1aWx0LWluIG1vZHVsZS5cbiIsIG5hbWUgKTsKKwkJLyogdHJ5IHRvIG9wZW4gdGhlIHNwZWNpZmllZCBmaWxlICovCisJCWlmIChIRklMRV9FUlJPUjMyPT0oaEZpbGU9T3BlbkZpbGUzMihuYW1lLCZvZnMsT0ZfUkVBRCkpKSB7CisJCQkvKiBOb3cgdHJ5IHRoZSBidWlsdC1pbiBldmVuIGlmIGRpc2FibGVkICovCisJCQlpZiAoKGhNb2R1bGUgPSBCVUlMVElOX0xvYWRNb2R1bGUoIG5hbWUsIFRSVUUgKSkpIHsKKwkJCQlmcHJpbnRmKCBzdGRlcnIsICJXYXJuaW5nOiBjb3VsZCBub3QgbG9hZCBXaW5kb3dzIERMTCAnJXMnLCB1c2luZyBidWlsdC1pbiBtb2R1bGUuXG4iLCBuYW1lICk7CisJCQkJcmV0dXJuIGhNb2R1bGU7CisJCQl9CisJCQlyZXR1cm4gMTsKKwkJfQorCQlpZiAoKGhNb2R1bGUgPSBNT0RVTEVfQ3JlYXRlRHVtbXlNb2R1bGUoICZvZnMgKSkgPCAzMikgeworCQkJX2xjbG9zZTMyKGhGaWxlKTsKIAkJCXJldHVybiBoTW9kdWxlOwogCQl9Ci0JCXJldHVybiAxOwotCX0KLQlpZiAoKGhNb2R1bGUgPSBNT0RVTEVfQ3JlYXRlRHVtbXlNb2R1bGUoICZvZnMgKSkgPCAzMikgeworCQlwTW9kdWxlCQk9IChORV9NT0RVTEUgKilHbG9iYWxMb2NrMTYoIGhNb2R1bGUgKTsKKwkJcE1vZHVsZS0+ZmxhZ3MJPSBORV9GRkxBR1NfV0lOMzI7CisJCXBNb2R1bGUtPnBlX21vZHVsZSA9IFBFX0xvYWRJbWFnZSggRklMRV9HZXRVbml4SGFuZGxlKGhGaWxlKSApOwogCQlfbGNsb3NlMzIoaEZpbGUpOwotCQlyZXR1cm4gaE1vZHVsZTsKKwkJaWYgKCFwTW9kdWxlLT5wZV9tb2R1bGUpCisJCQlyZXR1cm4gMjE7CiAJfQotCi0JcE1vZHVsZQkJPSAoTkVfTU9EVUxFICopR2xvYmFsTG9jazE2KCBoTW9kdWxlICk7Ci0JcE1vZHVsZS0+ZmxhZ3MJPSBORV9GRkxBR1NfV0lOMzI7Ci0KLQkvKiBGSVhNRTogY2hlY2sgaWYgcGUgaW1hZ2UgbG9hZGVkIGFscmVhZHkgLi4uICovCi0JcE1vZHVsZS0+cGVfbW9kdWxlID0gUEVfTG9hZEltYWdlKCBGSUxFX0dldFVuaXhIYW5kbGUoaEZpbGUpICk7Ci0JX2xjbG9zZTMyKGhGaWxlKTsKLQlpZiAoIXBNb2R1bGUtPnBlX21vZHVsZSkKLQkJcmV0dXJuIDIxOwogCS8qIHJlY3Vyc2UgKi8KIAlQRV9NYXBJbWFnZShwTW9kdWxlLT5wZV9tb2R1bGUsKFBEQjMyKilHZXRDdXJyZW50UHJvY2Vzc0lkKCksJm9mcyxmbGFncyk7CiAJcmV0dXJuIHBNb2R1bGUtPnBlX21vZHVsZS0+bWFwcGVkZGxsOwpAQCAtODY0LDQgKzkwNiwzIEBACiAJcmV0dXJuIFRSVUU7CiB9CiAKLSNlbmRpZiAvKiBXSU5FTElCICovCmRpZmYgLS1naXQgYS9sb2FkZXIvcGVfcmVzb3VyY2UuYyBiL2xvYWRlci9wZV9yZXNvdXJjZS5jCmluZGV4IDliOGFlN2UuLjExZWUwMDMgMTAwNjQ0Ci0tLSBhL2xvYWRlci9wZV9yZXNvdXJjZS5jCisrKyBiL2xvYWRlci9wZV9yZXNvdXJjZS5jCkBAIC0xLDQgKzEsMyBAQAotI2lmbmRlZiBXSU5FTElCCiAvKgogICogUEUgKFBvcnRhYmxlIEV4ZWN1dGUpIEZpbGUgUmVzb3VyY2VzCiAgKgpAQCAtMTQ5LDQ4ICsxNDgsMTIgQEAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgKgkgICAgUEVfU2l6ZW9mUmVzb3VyY2UzMgogICovCi12b2lkCi1fY2hlY2tfcHRyKERXT1JEIHgsRFdPUkQgc3RhcnQsTFBEV09SRCBsYXN0bWF4KSB7Ci0JaWYgKCh4PnN0YXJ0KSAmJiAoeDwqbGFzdG1heCkpCi0JCSpsYXN0bWF4PXg7Ci19Ci0KLXN0YXRpYyB2b2lkCi13YWxrX3Jlc2RpcihEV09SRCBsb2FkYWRkcixEV09SRCByb290cmVzZGlyLERXT1JEIHhyZXMsRFdPUkQgZGF0YSxEV09SRCBsdmwsTFBEV09SRCBtYXgpewotICAgIExQSU1BR0VfUkVTT1VSQ0VfRElSRUNUT1JZCQlyZXNkaXI7Ci0gICAgTFBJTUFHRV9SRVNPVVJDRV9EQVRBX0VOVFJZCQlkYXRhZW50OwotICAgIExQSU1BR0VfUkVTT1VSQ0VfRElSRUNUT1JZX0VOVFJZCWV0OwotICAgIGludAlpOwotCi0gICAgaWYgKGx2bD09MykgewotICAgIAlkYXRhZW50ID0gKExQSU1BR0VfUkVTT1VSQ0VfREFUQV9FTlRSWSkocm9vdHJlc2Rpcit4cmVzKTsKLQlfY2hlY2tfcHRyKGxvYWRhZGRyK2RhdGFlbnQtPk9mZnNldFRvRGF0YSxkYXRhLG1heCk7Ci0JcmV0dXJuOwotICAgIH0KLSAgICByZXNkaXIgPSAoTFBJTUFHRV9SRVNPVVJDRV9ESVJFQ1RPUlkpKHJvb3RyZXNkaXIreHJlcyk7Ci0gICAgZXQgPShMUElNQUdFX1JFU09VUkNFX0RJUkVDVE9SWV9FTlRSWSkoKExQQllURSlyZXNkaXIrc2l6ZW9mKElNQUdFX1JFU09VUkNFX0RJUkVDVE9SWSkpOwotICAgIGZvciAoaT0wO2k8cmVzZGlyLT5OdW1iZXJPZk5hbWVkRW50cmllcytyZXNkaXItPk51bWJlck9mSWRFbnRyaWVzO2krKykKLQl3YWxrX3Jlc2Rpcihsb2FkYWRkcixyb290cmVzZGlyLChsdmw9PTIpP2V0W2ldLnUyLk9mZnNldFRvRGF0YTpldFtpXS51Mi5zLk9mZnNldFRvRGlyZWN0b3J5LGRhdGEsbHZsKzEsbWF4KTsKLX0KLQogRFdPUkQgUEVfU2l6ZW9mUmVzb3VyY2UzMiggSElOU1RBTkNFMzIgaE1vZHVsZSwgSEFORExFMzIgaFJzcmMgKQogewotICAgIFBFX01PRFJFRgkqcGVtID0gSE1PRFVMRTMydG9QRV9NT0RSRUYoaE1vZHVsZSk7Ci0gICAgRFdPUkQJbWF4LGRhdGE7Ci0gICAgSU1BR0VfREFUQV9ESVJFQ1RPUlkJZGlyOwotCi0gICAgaWYgKCFwZW0gfHwgIXBlbS0+cGVfcmVzb3VyY2UpCi0gICAgCXJldHVybiAwOwotICAgIGlmICghaFJzcmMpIHJldHVybiAwOwotCi0gICAgbWF4PShEV09SRCktMTsKLSAgICBkaXI9cGVtLT5wZV9tb2R1bGUtPnBlX2hlYWRlci0+T3B0aW9uYWxIZWFkZXIuRGF0YURpcmVjdG9yeVtJTUFHRV9ESVJFQ1RPUllfRU5UUllfUkVTT1VSQ0VdOwotICAgIGlmKGRpci5TaXplKQotICAgIAltYXg9KERXT1JEKXBlbS0+cGVfcmVzb3VyY2UrZGlyLlNpemU7Ci0KLSAgICBkYXRhPSgoRFdPUkQpcGVtLT5sb2FkX2FkZHIrKChMUElNQUdFX1JFU09VUkNFX0RBVEFfRU5UUlkpaFJzcmMpLT5PZmZzZXRUb0RhdGEpOwotICAgIHdhbGtfcmVzZGlyKHBlbS0+bG9hZF9hZGRyLChEV09SRClwZW0tPnBlX3Jlc291cmNlLDAsZGF0YSwwLCZtYXgpOwotICAgIHJldHVybiBtYXgtZGF0YTsKKyAgICAvKiB3ZSBkb24ndCBuZWVkIGhNb2R1bGUgKi8KKyAgICBpZiAoIWhSc3JjKQorICAgCSByZXR1cm4gMDsKKyAgICByZXR1cm4gKChMUElNQUdFX1JFU09VUkNFX0RBVEFfRU5UUlkpaFJzcmMpLT5TaXplOwogfQogCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgpAQCAtNDE5LDQgKzM4MiwzIEBACiAgICAgfQogICAgIHJldHVybiByZXQ7CiB9Ci0jZW5kaWYKZGlmZiAtLWdpdCBhL2xvYWRlci9yZXNvdXJjZS5jIGIvbG9hZGVyL3Jlc291cmNlLmMKaW5kZXggMjY1NDM5Ni4uMjNiYTZiNiAxMDA2NDQKLS0tIGEvbG9hZGVyL3Jlc291cmNlLmMKKysrIGIvbG9hZGVyL3Jlc291cmNlLmMKQEAgLTQxNiwxOCArNDE2LDEwIEBACiAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgKgkJCUxvYWRBY2NlbGVyYXRvcnMxNglbVVNFUi4xNzddCi0gKgotICogRklYTUU6IHRoaXMgY29kZSBsZWFrcyBtZW1vcnkgYmVjYXVzZSBIQUNDRUwgbXVzdCBiZSBhIHJlc3VsdCBvZiBMb2FkUmVzb3VyY2UoKQotICogICAgICAgIChzZWUgVFdJTiBmb3IgaGludHMpLgogICovCiBIQUNDRUwxNiBXSU5BUEkgTG9hZEFjY2VsZXJhdG9yczE2KEhJTlNUQU5DRTE2IGluc3RhbmNlLCBTRUdQVFIgbHBUYWJsZU5hbWUpCiB7Ci0gICAgSEFDQ0VMMTYgCWhBY2NlbDsKLSAgICBIR0xPQkFMMTYgCXJzY19tZW07Ci0gICAgSFJTUkMxNiBoUnNyYzsKLSAgICBCWVRFIAkqbHA7Ci0gICAgQUNDRUxIRUFERVIJKmxwQWNjZWxUYmw7Ci0gICAgaW50IAlpLCBuOworICAgIEhSU1JDMTYJaFJzcmM7CiAKICAgICBpZiAoSElXT1JEKGxwVGFibGVOYW1lKSkKICAgICAgICAgZHByaW50Zl9hY2NlbCggc3RkZGViLCAiTG9hZEFjY2VsZXJhdG9yczogJTA0eCAnJXMnXG4iLApAQCAtNDM4LDMwICs0MzAsNyBAQAogCiAgICAgaWYgKCEoaFJzcmMgPSBGaW5kUmVzb3VyY2UxNiggaW5zdGFuY2UsIGxwVGFibGVOYW1lLCBSVF9BQ0NFTEVSQVRPUiApKSkKICAgICAgIHJldHVybiAwOwotICAgIGlmICghKHJzY19tZW0gPSBMb2FkUmVzb3VyY2UxNiggaW5zdGFuY2UsIGhSc3JjICkpKSByZXR1cm4gMDsKLQotICAgIGxwID0gKEJZVEUgKilMb2NrUmVzb3VyY2UxNihyc2NfbWVtKTsKLSAgICBuID0gU2l6ZW9mUmVzb3VyY2UxNihpbnN0YW5jZSxoUnNyYykvc2l6ZW9mKEFDQ0VMRU5UUlkpOwotICAgIGhBY2NlbCA9IEdsb2JhbEFsbG9jMTYoR01FTV9NT1ZFQUJMRSwgCi0gICAgCXNpemVvZihBQ0NFTEhFQURFUikgKyAobiArIDEpKnNpemVvZihBQ0NFTEVOVFJZKSk7Ci0gICAgbHBBY2NlbFRibCA9IChMUEFDQ0VMSEVBREVSKUdsb2JhbExvY2sxNihoQWNjZWwpOwotICAgIGxwQWNjZWxUYmwtPndDb3VudCA9IDA7Ci0gICAgZm9yIChpID0gMDsgaSA8IG47IGkrKykgewotCWxwQWNjZWxUYmwtPnRibFtpXS50eXBlID0gKihscCsrKTsKLQlscEFjY2VsVGJsLT50YmxbaV0ud0V2ZW50ID0gKigoV09SRCAqKWxwKTsKLQlscCArPSAyOwotCWxwQWNjZWxUYmwtPnRibFtpXS53SUR2YWwgPSAqKChXT1JEICopbHApOwotCWxwICs9IDI7Ci0gICAgCWlmIChscEFjY2VsVGJsLT50YmxbaV0ud0V2ZW50ID09IDApIGJyZWFrOwotCWRwcmludGZfYWNjZWwoc3RkZGViLAotCQkiQWNjZWxlcmF0b3IgIyV1IC8gZXZlbnQ9JTA0WCBpZD0lMDRYIHR5cGU9JTAyWCBcbiIsIAotCQlpLCBscEFjY2VsVGJsLT50YmxbaV0ud0V2ZW50LCBscEFjY2VsVGJsLT50YmxbaV0ud0lEdmFsLCAKLQkJbHBBY2NlbFRibC0+dGJsW2ldLnR5cGUpOwotCWxwQWNjZWxUYmwtPndDb3VudCsrOwotIAl9Ci0gICAgR2xvYmFsVW5sb2NrMTYoaEFjY2VsKTsKLSAgICBGcmVlUmVzb3VyY2UxNiggcnNjX21lbSApOwotICAgIHJldHVybiBoQWNjZWw7CisgICAgcmV0dXJuIExvYWRSZXNvdXJjZTE2KGluc3RhbmNlLGhSc3JjKTsKIH0KIAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKQEAgLTQ3NSwxMiArNDQ0LDcgQEAKICAqLwogSEFDQ0VMMzIgV0lOQVBJIExvYWRBY2NlbGVyYXRvcnMzMlcoSElOU1RBTkNFMzIgaW5zdGFuY2UsTFBDV1NUUiBscFRhYmxlTmFtZSkKIHsKLSAgICBIQUNDRUwzMiAJaEFjY2VsOwotICAgIEhHTE9CQUwzMiAJcnNjX21lbTsKICAgICBIUlNSQzMyIGhSc3JjOwotICAgIEJZVEUgCSpscDsKLSAgICBBQ0NFTEhFQURFUgkqbHBBY2NlbFRibDsKLSAgICBpbnQgCWksIG47CiAKICAgICBpZiAoSElXT1JEKGxwVGFibGVOYW1lKSkKICAgICAgICAgZHByaW50Zl9hY2NlbCggc3RkZGViLCAiTG9hZEFjY2VsZXJhdG9yczogJTA0eCAnJXMnXG4iLApAQCAtNDkyLDMxICs0NTYsNyBAQAogICAgIGlmICghKGhSc3JjID0gRmluZFJlc291cmNlMzJXKCBpbnN0YW5jZSwgbHBUYWJsZU5hbWUsIAogCQkoTFBDV1NUUilSVF9BQ0NFTEVSQVRPUiApKSkKICAgICAgIHJldHVybiAwOwotICAgIGlmICghKHJzY19tZW0gPSBMb2FkUmVzb3VyY2UzMiggaW5zdGFuY2UsIGhSc3JjICkpKSByZXR1cm4gMDsKLQotICAgIGxwID0gKEJZVEUgKilMb2NrUmVzb3VyY2UzMihyc2NfbWVtKTsKLSAgICBuID0gU2l6ZW9mUmVzb3VyY2UzMihpbnN0YW5jZSxoUnNyYykvc2l6ZW9mKEFDQ0VMRU5UUlkpOwotICAgIGhBY2NlbCA9IEdsb2JhbEFsbG9jMTYoR01FTV9NT1ZFQUJMRSwgCi0gICAgCXNpemVvZihBQ0NFTEhFQURFUikgKyAobiArIDEpKnNpemVvZihBQ0NFTEVOVFJZKSk7Ci0gICAgbHBBY2NlbFRibCA9IChMUEFDQ0VMSEVBREVSKUdsb2JhbExvY2sxNihoQWNjZWwpOwotICAgIGxwQWNjZWxUYmwtPndDb3VudCA9IDA7Ci0gICAgZm9yIChpID0gMDsgaSA8IG47IGkrKykgewotCWxwQWNjZWxUYmwtPnRibFtpXS50eXBlID0gKmxwOwotCWxwICs9IDI7Ci0JbHBBY2NlbFRibC0+dGJsW2ldLndFdmVudCA9ICooKFdPUkQgKilscCk7Ci0JbHAgKz0gMjsKLQlscEFjY2VsVGJsLT50YmxbaV0ud0lEdmFsID0gKigoV09SRCAqKWxwKTsKLQlscCArPSA0OwotICAgIAlpZiAobHBBY2NlbFRibC0+dGJsW2ldLndFdmVudCA9PSAwKSBicmVhazsKLQlkcHJpbnRmX2FjY2VsKHN0ZGRlYiwKLQkJIkFjY2VsZXJhdG9yICMldSAvIGV2ZW50PSUwNFggaWQ9JTA0WCB0eXBlPSUwMlggXG4iLCAKLQkJaSwgbHBBY2NlbFRibC0+dGJsW2ldLndFdmVudCwgbHBBY2NlbFRibC0+dGJsW2ldLndJRHZhbCwgCi0JCWxwQWNjZWxUYmwtPnRibFtpXS50eXBlKTsKLQlscEFjY2VsVGJsLT53Q291bnQrKzsKLSAJfQotICAgIEdsb2JhbFVubG9jazE2KGhBY2NlbCk7Ci0gICAgRnJlZVJlc291cmNlMzIocnNjX21lbSk7Ci0gICAgcmV0dXJuIGhBY2NlbDsKKyAgICByZXR1cm4gTG9hZFJlc291cmNlMzIoIGluc3RhbmNlLCBoUnNyYyApOwogfQogCiBIQUNDRUwzMiBXSU5BUEkgTG9hZEFjY2VsZXJhdG9yczMyQShISU5TVEFOQ0UzMiBpbnN0YW5jZSxMUENTVFIgbHBUYWJsZU5hbWUpCkBAIC03NTksNyArNjk5LDcgQEAKICAgICByZXR1cm4gcmV0dmFsOwogfQogCi0KKyNpZm5kZWYgV0lORUxJQgogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICAqCVNldFJlc291cmNlSGFuZGxlcgkoS0VSTkVMLjQzKQogICovCkBAIC03ODQsNyArNzI0LDYgQEAKICAgICByZXR1cm4gTlVMTDsKIH0KIAotI2lmbmRlZiBXSU5FTElCCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogICoJRW51bVJlc291cmNlVHlwZXNBCShLRVJORUwzMi45MCkKICAqLwpkaWZmIC0tZ2l0IGEvbG9hZGVyL3Rhc2suYyBiL2xvYWRlci90YXNrLmMKaW5kZXggMzI2Njk3Ni4uMGRjZjZhNiAxMDA2NDQKLS0tIGEvbG9hZGVyL3Rhc2suYworKysgYi9sb2FkZXIvdGFzay5jCkBAIC00NywxMiArNDcsNiBAQAogICAvKiBTYXZlZCAxNi1iaXQgc3RhY2sgZm9yIGN1cnJlbnQgcHJvY2VzcyAoV2luMTYgb25seSkgKi8KIERXT1JEIElGMTYzMl9TYXZlZDE2X3NzX3NwID0gMDsKIAotICAvKiBTYXZlZCAzMi1iaXQgc3RhY2sgZm9yIGN1cnJlbnQgcHJvY2VzcyAoV2luMTYgb25seSkgKi8KLURXT1JEIElGMTYzMl9TYXZlZDMyX2VzcCA9IDA7Ci0KLSAgLyogT3JpZ2luYWwgVW5peCBzdGFjayAqLwotRFdPUkQgSUYxNjMyX09yaWdpbmFsMzJfZXNwID0gMDsKLQogICAvKiBQb2ludGVyIHRvIGZ1bmN0aW9uIHRvIHN3aXRjaCB0byBhIGxhcmdlciBzdGFjayAqLwogaW50ICgqSUYxNjMyX0NhbGxMYXJnZVN0YWNrKSggaW50ICgqZnVuYykoKSwgdm9pZCAqYXJnICkgPSBOVUxMOwogCkBAIC00MTIsNyArNDA2LDcgQEAKICAgICAgICAgICAgICAgICAgICAgICBTRUxFQ1RPUk9GKElGMTYzMl9TYXZlZDE2X3NzX3NwKSwKICAgICAgICAgICAgICAgICAgICAgICBPRkZTRVRPRihJRjE2MzJfU2F2ZWQxNl9zc19zcCkgKTsKIAotICAgICAgICBDYWxsVG8xNl9yZWdzXyggJmNvbnRleHQgKTsKKyAgICAgICAgQ2FsbFRvMTZfcmVnc18oICZjb250ZXh0LCAwICk7CiAgICAgICAgIC8qIFRoaXMgc2hvdWxkIG5ldmVyIHJldHVybiAqLwogICAgICAgICBmcHJpbnRmKCBzdGRlcnIsICJUQVNLX0NhbGxUb1N0YXJ0OiBNYWluIHByb2dyYW0gcmV0dXJuZWQhXG4iICk7CiAgICAgICAgIFRBU0tfS2lsbEN1cnJlbnRUYXNrKCAxICk7CkBAIC00MzYsNyArNDMwLDcgQEAKICAgICBTRUdUQUJMRUVOVFJZICpwU2VnVGFibGU7CiAgICAgTFBTVFIgbmFtZTsKICAgICBjaGFyIGZpbGVuYW1lWzI1Nl07Ci0gICAgY2hhciAqc3RhY2sxNlRvcCwgKnN0YWNrMzJUb3A7CisgICAgY2hhciAqc3RhY2szMlRvcDsKICAgICBTVEFDSzE2RlJBTUUgKmZyYW1lMTY7CiAgICAgU1RBQ0szMkZSQU1FICpmcmFtZTMyOwogI2lmbmRlZiBXSU5FTElCMzIKQEAgLTU3NSw3ICs1NjksNiBAQAogCiAgICAgc3RhY2szMlRvcCA9IChjaGFyKilwVGFzay0+dGhkYi0+dGViLnN0YWNrX3RvcDsKICAgICBmcmFtZTMyID0gKFNUQUNLMzJGUkFNRSAqKXN0YWNrMzJUb3AgLSAxOwotICAgIGZyYW1lMzItPnNhdmVkX2VzcCA9IChEV09SRClzdGFjazMyVG9wOwogICAgIGZyYW1lMzItPmVkaSA9IDA7CiAgICAgZnJhbWUzMi0+ZXNpID0gMDsKICAgICBmcmFtZTMyLT5lZHggPSAwOwpAQCAtNTg3LDE1ICs1ODAsMTQgQEAKICAgICBmcmFtZTMyLT5yZXRhZGRyID0gKERXT1JEKVRBU0tfQ2FsbFRvU3RhcnQ7CiAgICAgZnJhbWUzMi0+Y29kZXNlbGVjdG9yID0gV0lORV9DT0RFX1NFTEVDVE9SOwogI2VuZGlmCi0gICAgcFRhc2stPmVzcCA9IChEV09SRClmcmFtZTMyOwogCi0gICAgICAvKiBDcmVhdGUgdGhlIDE2LWJpdCBzdGFjayBmcmFtZSAqLworICAgIC8qIENyZWF0ZSB0aGUgMTYtYml0IHN0YWNrIGZyYW1lICovCiAKICAgICBwVGFzay0+c3Nfc3AgPSBQVFJfU0VHX09GRl9UT19TRUdQVFIoIGhJbnN0YW5jZSwKICAgICAgICAgICAgICAgICAgICAgICAgICgocE1vZHVsZS0+c3AgIT0gMCkgPyBwTW9kdWxlLT5zcCA6CiAgICAgICAgICAgICAgICAgcFNlZ1RhYmxlW3BNb2R1bGUtPnNzLTFdLm1pbnNpemUgKyBwTW9kdWxlLT5zdGFja19zaXplKSAmIH4xICk7Ci0gICAgc3RhY2sxNlRvcCA9IChjaGFyICopUFRSX1NFR19UT19MSU4oIHBUYXNrLT5zc19zcCApOwotICAgIGZyYW1lMTYgPSAoU1RBQ0sxNkZSQU1FICopc3RhY2sxNlRvcCAtIDE7CisgICAgcFRhc2stPnNzX3NwIC09IHNpemVvZihEV09SRCk7ICAvKiBUbyBzdG9yZSBzYXZlZCAlJWVzcCAqLworICAgIGZyYW1lMTYgPSAoU1RBQ0sxNkZSQU1FICopUFRSX1NFR19UT19MSU4oIHBUYXNrLT5zc19zcCApIC0gMTsKICAgICBmcmFtZTE2LT5zYXZlZF9zc19zcCA9IDA7CiAgICAgZnJhbWUxNi0+ZWJwID0gMDsKICAgICBmcmFtZTE2LT5kcyA9IGZyYW1lMTYtPmVzID0gcFRhc2stPmhJbnN0YW5jZTsKQEAgLTYwMyw2ICs1OTUsOCBAQAogICAgIGZyYW1lMTYtPmVudHJ5X2lwID0gT0ZGU0VUT0YoVEFTS19SZXNjaGVkdWxlUHJvYykgKyAxNDsKICAgICBmcmFtZTE2LT5lbnRyeV9jcyA9IFNFTEVDVE9ST0YoVEFTS19SZXNjaGVkdWxlUHJvYyk7CiAgICAgZnJhbWUxNi0+YnAgPSAwOworICAgIGZyYW1lMTYtPmFyZ3NbMF0gPSBMT1dPUkQoZnJhbWUzMik7CisgICAgZnJhbWUxNi0+YXJnc1sxXSA9IEhJV09SRChmcmFtZTMyKTsKICNpZm5kZWYgV0lORUxJQgogICAgIGZyYW1lMTYtPmlwID0gTE9XT1JEKCBDQUxMVE8xNl9SZXRBZGRyX3dvcmQgKTsKICAgICBmcmFtZTE2LT5jcyA9IEhJV09SRCggQ0FMTFRPMTZfUmV0QWRkcl93b3JkICk7CkBAIC02MzEsNyArNjI1LDggQEAKICAgICAgICAgfQogICAgICAgICBlbHNlCiAgICAgICAgIHsKLSAgICAgICAgICAgIERCR19BRERSIGFkZHIgPSB7IE5VTEwsIHBTZWdUYWJsZVtwTW9kdWxlLT5jcy0xXS5zZWxlY3RvciwgcE1vZHVsZS0+aXAgfTsKKyAgICAgICAgICAgIERCR19BRERSIGFkZHIgPSB7IE5VTEwsIHBTZWdUYWJsZVtwTW9kdWxlLT5jcy0xXS5zZWxlY3RvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBNb2R1bGUtPmlwIH07CiAgICAgICAgICAgICBmcHJpbnRmKCBzdGRlcnIsICJXaW4xNiB0YXNrICclcyc6ICIsIG5hbWUgKTsKICAgICAgICAgICAgIERFQlVHX0FkZEJyZWFrcG9pbnQoICZhZGRyICk7CiAgICAgICAgIH0KQEAgLTgyNCwxNCArODE5LDkgQEAKICAgICBkcHJpbnRmX3Rhc2soIHN0ZGRlYiwgIlN3aXRjaGluZyB0byB0YXNrICUwNHggKCUuOHMpXG4iLAogICAgICAgICAgICAgICAgICAgaFRhc2ssIHBOZXdUYXNrLT5tb2R1bGVfbmFtZSApOwogCi0gICAgICAvKiBTYXZlIHRoZSBzdGFja3Mgb2YgdGhlIHByZXZpb3VzIHRhc2sgKGlmIGFueSkgKi8KKyAgICAgIC8qIFNhdmUgdGhlIHN0YWNrIG9mIHRoZSBwcmV2aW91cyB0YXNrIChpZiBhbnkpICovCiAKLSAgICBpZiAocE9sZFRhc2spCi0gICAgewotICAgICAgICBwT2xkVGFzay0+c3Nfc3AgPSBJRjE2MzJfU2F2ZWQxNl9zc19zcDsKLSAgICAgICAgcE9sZFRhc2stPmVzcCAgID0gSUYxNjMyX1NhdmVkMzJfZXNwOwotICAgIH0KLSAgICBlbHNlIElGMTYzMl9PcmlnaW5hbDMyX2VzcCA9IElGMTYzMl9TYXZlZDMyX2VzcDsKKyAgICBpZiAocE9sZFRhc2spIHBPbGRUYXNrLT5zc19zcCA9IElGMTYzMl9TYXZlZDE2X3NzX3NwOwogCiAgICAgIC8qIE1ha2UgdGhlIHRhc2sgdGhlIGxhc3QgaW4gdGhlIGxpbmtlZCBsaXN0IChyb3VuZC1yb2JpbiBzY2hlZHVsaW5nKSAqLwogCkBAIC04NDAsMTMgKzgzMCwxMiBAQAogICAgIFRBU0tfTGlua1Rhc2soIGhUYXNrICk7CiAgICAgcE5ld1Rhc2stPnByaW9yaXR5LS07CiAKLSAgICAgIC8qIFN3aXRjaCB0byB0aGUgbmV3IHN0YWNrICovCisgICAgLyogU3dpdGNoIHRvIHRoZSBuZXcgc3RhY2sgKi8KIAogICAgIGhDdXJyZW50VGFzayA9IGhUYXNrOwogICAgIHBDdXJyZW50VGhyZWFkID0gcE5ld1Rhc2stPnRoZGI7CiAgICAgcEN1cnJlbnRQcm9jZXNzID0gcEN1cnJlbnRUaHJlYWQtPnByb2Nlc3M7CiAgICAgSUYxNjMyX1NhdmVkMTZfc3Nfc3AgPSBwTmV3VGFzay0+c3Nfc3A7Ci0gICAgSUYxNjMyX1NhdmVkMzJfZXNwICAgPSBwTmV3VGFzay0+ZXNwOwogfQogCiAKQEAgLTEwNTEsMTMgKzEwNDAsMTMgQEAKICAgICBUREIgKnBDdXJUYXNrID0gKFREQiAqKUdsb2JhbExvY2sxNiggaEN1cnJlbnRUYXNrICk7CiAgICAgTUVTU0FHRVFVRVVFICpxdWV1ZSA9IChNRVNTQUdFUVVFVUUgKilHbG9iYWxMb2NrMTYoIHBDdXJUYXNrLT5oUXVldWUgKTsKICAgICAvKiBIYW5kbGUgc2VudCBtZXNzYWdlcyAqLwotICAgIGlmIChxdWV1ZSAmJiAocXVldWUtPndha2VCaXRzICYgUVNfU0VORE1FU1NBR0UpKQorICAgIHdoaWxlIChxdWV1ZSAmJiAocXVldWUtPndha2VCaXRzICYgUVNfU0VORE1FU1NBR0UpKQogICAgICAgICBRVUVVRV9SZWNlaXZlTWVzc2FnZSggcXVldWUgKTsKIAogICAgIE9sZFlpZWxkKCk7CiAKICAgICBxdWV1ZSA9IChNRVNTQUdFUVVFVUUgKilHbG9iYWxMb2NrMTYoIHBDdXJUYXNrLT5oUXVldWUgKTsKLSAgICBpZiAocXVldWUgJiYgKHF1ZXVlLT53YWtlQml0cyAmIFFTX1NFTkRNRVNTQUdFKSkKKyAgICB3aGlsZSAocXVldWUgJiYgKHF1ZXVlLT53YWtlQml0cyAmIFFTX1NFTkRNRVNTQUdFKSkKICAgICAgICAgUVVFVUVfUmVjZWl2ZU1lc3NhZ2UoIHF1ZXVlICk7CiB9CiAKQEAgLTExOTEsNyArMTE4MCw3IEBACiAKICAgICAvKiBTd2l0Y2ggdG8gdGhlIG5ldyBzdGFjayAqLwogCi0gICAgSUYxNjMyX1NhdmVkMTZfc3Nfc3AgPSBwVGFzay0+c3Nfc3AgPSBQVFJfU0VHX09GRl9UT19TRUdQVFIoIHNlZywKKyAgICBJRjE2MzJfU2F2ZWQxNl9zc19zcCA9IFBUUl9TRUdfT0ZGX1RPX1NFR1BUUiggc2VnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwdHIgLSBzaXplb2YoU1RBQ0sxNkZSQU1FKSApOwogICAgIG5ld0ZyYW1lID0gQ1VSUkVOVF9TVEFDSzE2OwogCkBAIC0xMjMwLDE4ICsxMjE5LDE4IEBACiAKICAgICAvKiBTd2l0Y2ggYmFjayB0byB0aGUgb2xkIHN0YWNrICovCiAKLSAgICBJRjE2MzJfU2F2ZWQxNl9zc19zcCA9IHBUYXNrLT5zc19zcCA9IHBEYXRhLT5vbGRfc3Nfc3A7CisgICAgSUYxNjMyX1NhdmVkMTZfc3Nfc3AgPSBwRGF0YS0+b2xkX3NzX3NwOwogICAgIHBEYXRhLT5vbGRfc3Nfc3AgPSAwOwogCiAgICAgLyogQnVpbGQgYSBzdGFjayBmcmFtZSBmb3IgdGhlIHJldHVybiAqLwogCiAgICAgbmV3RnJhbWUgPSBDVVJSRU5UX1NUQUNLMTY7CiAgICAgbmV3RnJhbWUtPnNhdmVkX3NzX3NwID0gb2xkRnJhbWUtPnNhdmVkX3NzX3NwOwotICAgIG5ld0ZyYW1lLT5lbnRyeV9pcCAgICA9IG9sZEZyYW1lLT5lbnRyeV9pcDsKLSAgICBuZXdGcmFtZS0+ZW50cnlfY3MgICAgPSBvbGRGcmFtZS0+ZW50cnlfY3M7Ci0gICAgbmV3RnJhbWUtPmJwICAgICAgICAgID0gb2xkRnJhbWUtPmJwOwotICAgIG5ld0ZyYW1lLT5pcCAgICAgICAgICA9IG9sZEZyYW1lLT5pcDsKLSAgICBuZXdGcmFtZS0+Y3MgICAgICAgICAgPSBvbGRGcmFtZS0+Y3M7CisgICAgaWYgKGRlYnVnZ2luZ19yZWxheSkKKyAgICB7CisgICAgICAgIG5ld0ZyYW1lLT5lbnRyeV9pcCA9IG9sZEZyYW1lLT5lbnRyeV9pcDsKKyAgICAgICAgbmV3RnJhbWUtPmVudHJ5X2NzID0gb2xkRnJhbWUtPmVudHJ5X2NzOworICAgIH0KIH0KIAogCmRpZmYgLS1naXQgYS9tZW1vcnkvZ2xvYmFsLmMgYi9tZW1vcnkvZ2xvYmFsLmMKaW5kZXggY2UxMWVkMi4uNmEyYjg2YiAxMDA2NDQKLS0tIGEvbWVtb3J5L2dsb2JhbC5jCisrKyBiL21lbW9yeS9nbG9iYWwuYwpAQCAtMzk1LDcgKzM5NSw3IEBACiAgKi8KIEhHTE9CQUwxNiBXSU5BUEkgR2xvYmFsRnJlZTE2KCBIR0xPQkFMMTYgaGFuZGxlICkKIHsKLSAgICB2b2lkICpwdHIgPSBHbG9iYWxMb2NrMTYoIGhhbmRsZSApOworICAgIHZvaWQgKnB0ciA9ICh2b2lkICopR0VUX0FSRU5BX1BUUihoYW5kbGUpLT5iYXNlOwogCiAgICAgZHByaW50Zl9nbG9iYWwoIHN0ZGRlYiwgIkdsb2JhbEZyZWUxNjogJTA0eFxuIiwgaGFuZGxlICk7CiAgICAgaWYgKCFHTE9CQUxfRnJlZUJsb2NrKCBoYW5kbGUgKSkgcmV0dXJuIGhhbmRsZTsgIC8qIGZhaWxlZCAqLwpAQCAtNDI2LDYgKzQyNiw3IEBACiAjZW5kaWYgIC8qIENPTkZJR19JUEMgKi8KIAogCWlmICghR0VUX0FSRU5BX1BUUihoYW5kbGUpLT5iYXNlKSByZXR1cm4gKFNFR1BUUikwOworICAgICAgICBHRVRfQVJFTkFfUFRSKGhhbmRsZSktPmxvY2tDb3VudCsrOwogCXJldHVybiBQVFJfU0VHX09GRl9UT19TRUdQVFIoIEdsb2JhbEhhbmRsZVRvU2VsKGhhbmRsZSksIDAgKTsKIAkvKiBGSVhNRTogcHV0IHNlZ21lbnQgdmFsdWUgaW4gQ1ggYXMgd2VsbCAqLwogICAgIH0KQEAgLTQ0MSw2ICs0NDIsNyBAQAogTFBWT0lEIFdJTkFQSSBHbG9iYWxMb2NrMTYoIEhHTE9CQUwxNiBoYW5kbGUgKQogewogICAgIGlmICghaGFuZGxlKSByZXR1cm4gMDsKKyAgICBHRVRfQVJFTkFfUFRSKGhhbmRsZSktPmxvY2tDb3VudCsrOwogI2lmZGVmIENPTkZJR19JUEMKICAgICBpZiAoaXNfZGRlX2hhbmRsZShoYW5kbGUpKSByZXR1cm4gRERFX0F0dGFjaEhhbmRsZShoYW5kbGUsIE5VTEwpOwogI2VuZGlmCkBAIC00NTMsOCArNDU1LDEwIEBACiAgKi8KIEJPT0wxNiBXSU5BUEkgR2xvYmFsVW5sb2NrMTYoIEhHTE9CQUwxNiBoYW5kbGUgKQogeworICAgIEdMT0JBTEFSRU5BICpwQXJlbmEgPSBHRVRfQVJFTkFfUFRSKGhhbmRsZSk7CiAgICAgZHByaW50Zl9nbG9iYWwoIHN0ZGRlYiwgIkdsb2JhbFVubG9jazE2OiAlMDR4XG4iLCBoYW5kbGUgKTsKLSAgICByZXR1cm4gMDsKKyAgICBpZiAocEFyZW5hLT5sb2NrQ291bnQpIHBBcmVuYS0+bG9ja0NvdW50LS07CisgICAgcmV0dXJuIHBBcmVuYS0+bG9ja0NvdW50OwogfQogCiAKQEAgLTU1OCw3ICs1NjIsNyBAQAogICovCiBCT09MMTYgV0lOQVBJIEdsb2JhbFVuV2lyZTE2KCBIR0xPQkFMMTYgaGFuZGxlICkKIHsKLSAgICByZXR1cm4gR2xvYmFsVW5sb2NrMTYoIGhhbmRsZSApOworICAgIHJldHVybiAhR2xvYmFsVW5sb2NrMTYoIGhhbmRsZSApOwogfQogCiAKZGlmZiAtLWdpdCBhL21lbW9yeS9sb2NhbC5jIGIvbWVtb3J5L2xvY2FsLmMKaW5kZXggYzAwNjJkYy4uNWE3NWQxZSAxMDA2NDQKLS0tIGEvbWVtb3J5L2xvY2FsLmMKKysrIGIvbWVtb3J5L2xvY2FsLmMKQEAgLTEyMzYsNyArMTIzNiw3IEBACiAgICAgaWYgKCFobWVtKQogICAgIHsKICAgICAgICAgLyogUmVtb3ZlIHRoZSBibG9jayBmcm9tIHRoZSBoZWFwIGFuZCB0cnkgYWdhaW4gKi8KLSAgICAgICAgTFBTVFIgYnVmZmVyID0gSGVhcEFsbG9jKCBTeXN0ZW1IZWFwLCAwLCBvbGRzaXplICk7CisgICAgICAgIExQU1RSIGJ1ZmZlciA9IEhlYXBBbGxvYyggR2V0UHJvY2Vzc0hlYXAoKSwgMCwgb2xkc2l6ZSApOwogICAgICAgICBpZiAoIWJ1ZmZlcikgcmV0dXJuIDA7CiAgICAgICAgIG1lbWNweSggYnVmZmVyLCBwdHIgKyBhcmVuYSArIEFSRU5BX0hFQURFUl9TSVpFLCBvbGRzaXplICk7CiAgICAgICAgIExPQ0FMX0ZyZWVBcmVuYSggZHMsIGFyZW5hICk7CkBAIC0xMjQ1LDE0ICsxMjQ1LDE0IEBACiAgICAgICAgICAgICBpZiAoIShobWVtID0gTE9DQUxfR2V0QmxvY2soIGRzLCBvbGRzaXplLCBmbGFncyApKSkKICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICBmcHJpbnRmKCBzdGRlcnIsICJMb2NhbFJlYWxsb2M6IGNhbid0IHJlc3RvcmUgc2F2ZWQgYmxvY2tcbiIgKTsKLSAgICAgICAgICAgICAgICBIZWFwRnJlZSggU3lzdGVtSGVhcCwgMCwgYnVmZmVyICk7CisgICAgICAgICAgICAgICAgSGVhcEZyZWUoIEdldFByb2Nlc3NIZWFwKCksIDAsIGJ1ZmZlciApOwogICAgICAgICAgICAgICAgIHJldHVybiAwOwogICAgICAgICAgICAgfQogICAgICAgICAgICAgc2l6ZSA9IG9sZHNpemU7CiAgICAgICAgIH0KICAgICAgICAgcHRyID0gUFRSX1NFR19PRkZfVE9fTElOKCBkcywgMCApOyAgLyogUmVsb2FkIHB0ciAqLwogICAgICAgICBtZW1jcHkoIHB0ciArIGhtZW0sIGJ1ZmZlciwgb2xkc2l6ZSApOwotICAgICAgICBIZWFwRnJlZSggU3lzdGVtSGVhcCwgMCwgYnVmZmVyICk7CisgICAgICAgIEhlYXBGcmVlKCBHZXRQcm9jZXNzSGVhcCgpLCAwLCBidWZmZXIgKTsKICAgICB9CiAgICAgZWxzZQogICAgIHsKZGlmZiAtLWdpdCBhL21lbW9yeS9zZWxlY3Rvci5jIGIvbWVtb3J5L3NlbGVjdG9yLmMKaW5kZXggNDIxY2Q5OS4uYmY0ZjgyOSAxMDA2NDQKLS0tIGEvbWVtb3J5L3NlbGVjdG9yLmMKKysrIGIvbWVtb3J5L3NlbGVjdG9yLmMKQEAgLTEzOCw2ICsxMzgsMjUgQEAKICAgICBkcHJpbnRmX3NlbGVjdG9yKCBzdGRkZWIsICJTRUxFQ1RPUl9GcmVlQmxvY2soJTA0eCwlZClcbiIsIHNlbCwgY291bnQgKTsKICAgICBzZWwgJj0gfihfX0FISU5DUiAtIDEpOyAgLyogY2xlYXIgYm90dG9tIGJpdHMgb2Ygc2VsZWN0b3IgKi8KICAgICBuZXh0c2VsID0gc2VsICsgKGNvdW50IDw8IF9fQUhTSElGVCk7CisKKyNpZmRlZiBfX2kzODZfXworICAgIHsKKyAgICAgICAgLyogQ2hlY2sgaWYgd2UgYXJlIGZyZWVpbmcgY3VycmVudCAlZnMgb3IgJWdzIHNlbGVjdG9yICovCisKKyAgICAgICAgV09SRCBmcywgZ3M7CisKKyAgICAgICAgX19hc21fXygibW92dyAlJWZzLCV3MCI6Ij1yIiAoZnMpKTsKKyAgICAgICAgaWYgKChmcyA+PSBzZWwpICYmIChmcyA8IG5leHRzZWwpKQorICAgICAgICB7CisgICAgICAgICAgICBmcHJpbnRmKCBzdGRlcnIsICJTRUxFQ1RPUl9GcmVlQmxvY2s6IGZyZWVpbmcgJSVmcyBzZWxlY3RvciAoJTA0eCksIG5vdCBnb29kLlxuIiwgZnMgKTsKKyAgICAgICAgICAgIF9fYXNtX18oIm1vdncgJXcwLCUlZnMiOjoiciIgKDApKTsKKyAgICAgICAgfQorICAgICAgICBfX2FzbV9fKCJtb3Z3ICUlZ3MsJXcwIjoiPXIiIChncykpOworICAgICAgICBpZiAoKGdzID49IHNlbCkgJiYgKGdzIDwgbmV4dHNlbCkpCisgICAgICAgICAgICBfX2FzbV9fKCJtb3Z3ICV3MCwlJWdzIjo6InIiICgwKSk7CisgICAgfQorI2VuZGlmICAvKiBfX2kzODZfXyAqLworCiAgICAgbWVtc2V0KCAmZW50cnksIDAsIHNpemVvZihlbnRyeSkgKTsgIC8qIGNsZWFyIHRoZSBMRFQgZW50cmllcyAqLwogICAgIGZvciAoaSA9IFNFTEVDVE9SX1RPX0VOVFJZKHNlbCk7IGNvdW50OyBpKyssIGNvdW50LS0pCiAgICAgewpAQCAtNTYzLDcgKzU4Miw3IEBACiB2b2lkIFdJTkFQSSBTTWFwTFNfSVBfRUJQXzM2KENPTlRFWFQgKmNvbnRleHQpIHt4X1NNYXBMU19JUF9FQlBfeChjb250ZXh0LDM2KTt9CiB2b2lkIFdJTkFQSSBTTWFwTFNfSVBfRUJQXzQwKENPTlRFWFQgKmNvbnRleHQpIHt4X1NNYXBMU19JUF9FQlBfeChjb250ZXh0LDQwKTt9CiAKLXZvaWQgV0lOQVBJIFNNYXBMUyhDT05URVhUICpjb250ZXh0LGludCBhcmdvZmYpCit2b2lkIFdJTkFQSSBTTWFwTFMoQ09OVEVYVCAqY29udGV4dCkKIHsKICAgICBpZiAoRUFYX3JlZyhjb250ZXh0KT49MHgxMDAwMCkgewogCUVBWF9yZWcoY29udGV4dCkgPSBNYXBMUygoTFBWT0lEKUVBWF9yZWcoY29udGV4dCkpOwpAQCAtNTczLDYgKzU5MiwyOCBAQAogICAgIH0KIH0KIAordm9pZCBXSU5BUEkgU1VuTWFwTFMoQ09OVEVYVCAqY29udGV4dCkKK3sKKyAgICBpZiAoRUFYX3JlZyhjb250ZXh0KT49MHgxMDAwMCkKKwlVbk1hcExTKChTRUdQVFIpRUFYX3JlZyhjb250ZXh0KSk7Cit9CisKK3N0YXRpYyB2b2lkCit4X1NVbk1hcExTX0lQX0VCUF94KENPTlRFWFQgKmNvbnRleHQsaW50IGFyZ29mZikgeworCWlmICgqKERXT1JEKikoRUJQX3JlZyhjb250ZXh0KSthcmdvZmYpKQorCQlVbk1hcExTKCooRFdPUkQqKShFQlBfcmVnKGNvbnRleHQpK2FyZ29mZikpOworCSooRFdPUkQqKShFQlBfcmVnKGNvbnRleHQpK2FyZ29mZik9MDsKK30KK3ZvaWQgV0lOQVBJIFNVbk1hcExTX0lQX0VCUF84KENPTlRFWFQgKmNvbnRleHQpIHsgeF9TVW5NYXBMU19JUF9FQlBfeChjb250ZXh0LDEyKTsgfQordm9pZCBXSU5BUEkgU1VuTWFwTFNfSVBfRUJQXzEyKENPTlRFWFQgKmNvbnRleHQpIHsgeF9TVW5NYXBMU19JUF9FQlBfeChjb250ZXh0LDEyKTsgfQordm9pZCBXSU5BUEkgU1VuTWFwTFNfSVBfRUJQXzE2KENPTlRFWFQgKmNvbnRleHQpIHsgeF9TVW5NYXBMU19JUF9FQlBfeChjb250ZXh0LDE2KTsgfQordm9pZCBXSU5BUEkgU1VuTWFwTFNfSVBfRUJQXzIwKENPTlRFWFQgKmNvbnRleHQpIHsgeF9TVW5NYXBMU19JUF9FQlBfeChjb250ZXh0LDIwKTsgfQordm9pZCBXSU5BUEkgU1VuTWFwTFNfSVBfRUJQXzI0KENPTlRFWFQgKmNvbnRleHQpIHsgeF9TVW5NYXBMU19JUF9FQlBfeChjb250ZXh0LDI0KTsgfQordm9pZCBXSU5BUEkgU1VuTWFwTFNfSVBfRUJQXzI4KENPTlRFWFQgKmNvbnRleHQpIHsgeF9TVW5NYXBMU19JUF9FQlBfeChjb250ZXh0LDI4KTsgfQordm9pZCBXSU5BUEkgU1VuTWFwTFNfSVBfRUJQXzMyKENPTlRFWFQgKmNvbnRleHQpIHsgeF9TVW5NYXBMU19JUF9FQlBfeChjb250ZXh0LDMyKTsgfQordm9pZCBXSU5BUEkgU1VuTWFwTFNfSVBfRUJQXzM2KENPTlRFWFQgKmNvbnRleHQpIHsgeF9TVW5NYXBMU19JUF9FQlBfeChjb250ZXh0LDM2KTsgfQordm9pZCBXSU5BUEkgU1VuTWFwTFNfSVBfRUJQXzQwKENPTlRFWFQgKmNvbnRleHQpIHsgeF9TVW5NYXBMU19JUF9FQlBfeChjb250ZXh0LDQwKTsgfQorCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogICogICAgICAgICAgIFdPV0dldFZETVBvaW50ZXIJKEtFUk5FTDMyLjU1KQogICogR2V0IGxpbmVhciBmcm9tIHNlZ21lbnRlZCBwb2ludGVyLiAoTVNETiBsaWIpCmRpZmYgLS1naXQgYS9tZW1vcnkvc3RyaW5nLmMgYi9tZW1vcnkvc3RyaW5nLmMKaW5kZXggNjAxOTRhMy4uODhiNzJjNCAxMDA2NDQKLS0tIGEvbWVtb3J5L3N0cmluZy5jCisrKyBiL21lbW9yeS9zdHJpbmcuYwpAQCAtMjgxLDcgKzI4MSw3IEBACiAgICAgZHByaW50Zl9zdHJpbmcoc3RkZGViLCJzdHJjcHluICclcycgZm9yICVkIGNoYXJzXG4iLAogCQkgKHNyYyk/c3JjOiJOVUxMIixuKTsKICAgICB3aGlsZSAoKG4tLSA+IDEpICYmICpzcmMpICpwKysgPSAqc3JjKys7Ci0gICAgKnAgPSAwOworICAgIGlmIChuID49IDApICpwID0gMDsKICAgICByZXR1cm4gZHN0OwogfQogCkBAIC0yOTMsNyArMjkzLDcgQEAKIHsKICAgICBMUFdTVFIgcCA9IGRzdDsKICAgICB3aGlsZSAoKG4tLSA+IDEpICYmICpzcmMpICpwKysgPSAqc3JjKys7Ci0gICAgKnAgPSAwOworICAgIGlmIChuID49IDApICpwID0gMDsKICAgICByZXR1cm4gZHN0OwogfQogCkBAIC00MjEsNyArNDIxLDcgQEAKIHsKICAgICBMUFdTVFIgcCA9IGRzdDsKICAgICB3aGlsZSAoKG4tLSA+IDEpICYmICpzcmMpICpwKysgPSAoV0NIQVIpKHVuc2lnbmVkIGNoYXIpKnNyYysrOwotICAgICpwID0gMDsKKyAgICBpZiAobiA+PSAwKSAqcCA9IDA7CiAgICAgcmV0dXJuIGRzdDsKIH0KIApAQCAtNDMzLDcgKzQzMyw3IEBACiB7CiAgICAgTFBTVFIgcCA9IGRzdDsKICAgICB3aGlsZSAoKG4tLSA+IDEpICYmICpzcmMpICpwKysgPSAoQ0hBUikqc3JjKys7Ci0gICAgKnAgPSAwOworICAgIGlmIChuID49IDApICpwID0gMDsKICAgICByZXR1cm4gZHN0OwogfQogCkBAIC01NjAsOSArNTYwLDEwIEBACiAgKi8KIEJPT0wzMiBXSU5BUEkgT2VtVG9DaGFyMzJBKCBMUENTVFIgcywgTFBTVFIgZCApCiB7CisgICAgTFBTVFIgb2xkZCA9IGQ7CiAgICAgZHByaW50Zl9zdHJpbmcoc3RkZGViLCJPZW1Ub0NoYXIgJyVzJ1xuIiwgKHMpP3M6Ik5VTEwiKTsKICAgICB3aGlsZSAoKCpkKysgPSBPRU1fVE9fQU5TSSgqcysrKSkpOwotICAgIGRwcmludGZfc3RyaW5nKHN0ZGRlYiwiIHRvICclcydcbiIsIChkKT9kOiJOVUxMIik7CisgICAgZHByaW50Zl9zdHJpbmcoc3RkZGViLCIgdG8gJyVzJ1xuIiwgb2xkZCk7CiAgICAgcmV0dXJuIFRSVUU7CiB9CiAKZGlmZiAtLWdpdCBhL21pc2MvY29tbS5jIGIvbWlzYy9jb21tLmMKaW5kZXggMjJlMTZjOS4uNWRjMDYyMSAxMDA2NDQKLS0tIGEvbWlzYy9jb21tLmMKKysrIGIvbWlzYy9jb21tLmMKQEAgLTgzNyw3ICs4MzcsNyBAQAogICAgICAgICBzdG9sICs9IG1zcjsgICAgCiAJcmVwaWQgPSBpb2N0bChmZCxUSU9DTUdFVCwmbXN0YXQpOwogCWRwcmludGZfY29tbShzdGRkZWIsCi0JIiBpb2N0bCAgJWQsIG1zciAleCBhdCAlbHggJWx4XG4iLHJlcGlkLG1zdGF0LHN0b2wsdW5rbm93blthY3RdKTsKKwkiIGlvY3RsICAlZCwgbXNyICV4IGF0ICVwICVwXG4iLHJlcGlkLG1zdGF0LHN0b2wsdW5rbm93blthY3RdKTsKIAlpZiAoKG1zdGF0JlRJT0NNX0NBUikpIHsqc3RvbCB8PSAweDgwO30KIAkgICAgIGVsc2UgeypzdG9sICY9MHg3Zjt9CiAJZHByaW50Zl9jb21tKHN0ZGRlYiwiIG1vZGVtIGRjZCBjb25zdHJ1Y3QgJXhcbiIsKnN0b2wpOwpkaWZmIC0tZ2l0IGEvbWlzYy9jcnRkbGwuYyBiL21pc2MvY3J0ZGxsLmMKaW5kZXggN2JhN2QwNy4uZTkwZGIxMCAxMDA2NDQKLS0tIGEvbWlzYy9jcnRkbGwuYworKysgYi9taXNjL2NydGRsbC5jCkBAIC0xNDUzLDMgKzE0NTMsMTMgQEAKICAgICB3c25wcmludGYzMkEoYnVmLGJ1ZmxlbiwiJWQiLHgpOwogICAgIHJldHVybiBidWY7CiB9CisKK3R5cGVkZWYgVk9JRCAoKnNpZ19oYW5kbGVyX3R5cGUpKFZPSUQpOworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiAgICAgICAgICAgICAgICAgIHNpZ25hbCAgICAgICAgICAgKENSVERMTC40NTUpCisgKi8KK1ZPSUQgX19jZGVjbCBDUlRETExfc2lnbmFsKGludCBzaWcsIHNpZ19oYW5kbGVyX3R5cGUgcHRyKQoreworICAgIGRwcmludGZfY3J0ZGxsKHN0ZGRlYiwiQ1JURExMX3NpZ25hbCAlZCAlcDogU1RVQiFcbiIsc2lnLHB0cik7Cit9CmRpZmYgLS1naXQgYS9taXNjL2x6ZXhwYW5kLmMgYi9taXNjL2x6ZXhwYW5kLmMKaW5kZXggYmEyYjAyZC4uMTc1NGQ2MiAxMDA2NDQKLS0tIGEvbWlzYy9semV4cGFuZC5jCisrKyBiL21pc2MvbHpleHBhbmQuYwpAQCAtNDc4LDcgKzQ3OCw3IEBACiAJTE9ORwlsZW47CiAjZGVmaW5lIEJVRkxFTgkxMDAwCiAJQllURQlidWZbQlVGTEVOXTsKLQlJTlQzMgkoKnhyZWFkKShIRklMRTMyLExQVk9JRCxVSU5UMzIpOworCUlOVDMyCVdJTkFQSSAoKnhyZWFkKShIRklMRTMyLExQVk9JRCxVSU5UMzIpOwogCiAJZHByaW50Zl9maWxlKHN0ZGRlYiwiTFpDb3B5KCVkLCVkKVxuIixzcmMsZGVzdCk7CiAJZm9yIChpPTA7aTxucm9mbHpzdGF0ZXM7aSsrKQpkaWZmIC0tZ2l0IGEvbWlzYy9tYWluLmMgYi9taXNjL21haW4uYwppbmRleCBjMTU4OTQxLi5kMjY3ZTBhIDEwMDY0NAotLS0gYS9taXNjL21haW4uYworKysgYi9taXNjL21haW4uYwpAQCAtMTk3LDcgKzE5Nyw3IEBACiAKIC8qIERlZmF1bHQgdmVyc2lvbiBpcyB0aGUgc2FtZSBhcyAtd2ludmVyIHdpbjMxICovCiBzdGF0aWMgTE9ORyBnZXRWZXJzaW9uMTYgPSBNQUtFTE9ORyggV0lOVkVSU0lPTiwgMHgwNjE2ICk7IC8qIERPUyA2LjIyICovCi1zdGF0aWMgTE9ORyBnZXRWZXJzaW9uMzIgPSBNQUtFTE9ORyggNCwgMHgxNjA2ICk7IC8qIERPUyA2LjIyICovCitzdGF0aWMgTE9ORyBnZXRWZXJzaW9uMzIgPSBNQUtFTE9ORyggV0lOVkVSU0lPTiwgMHg4MDAwICk7CiBzdGF0aWMgT1NWRVJTSU9OSU5GTzMyQSBnZXRWZXJzaW9uRXggPSB7IHNpemVvZihPU1ZFUlNJT05JTkZPMzJBKSwgMywgMTAsIDAsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZFUl9QTEFURk9STV9XSU4zMnMsICJXaW4zMnMgMS4zIiB9OwogCkBAIC04MjQsNyArODI0LDcgQEAKIAogCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqICAgICAgR2V0VmVyc2lvbjMyCisgKiAgICAgIEdldFZlcnNpb24zMiAgIChLRVJORUwzMi40MjcpCiAgKi8KIExPTkcgV0lOQVBJIEdldFZlcnNpb24zMih2b2lkKQogewpAQCAtOTA4LDEwMCArOTA4LDYgQEAKIH0KIAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiAgICAgICAgICBTZXRFbnZpcm9ubWVudCAgIChHREkuMTMyKQotICovCi1JTlQxNiBXSU5BUEkgU2V0RW52aXJvbm1lbnQoTFBDU1RSIGxwUG9ydE5hbWUsIExQQ1NUUiBscEVudmlyb24sIFVJTlQxNiBuQ291bnQpCi17Ci0gICAgTFBFTlZFTlRSWQlscE5ld0VudjsKLSAgICBMUEVOVkVOVFJZCWxwRW52ID0gbHBFbnZMaXN0OwotICAgIGRwcmludGZfZW52KHN0ZGRlYiwgIlNldEVudmlyb25tZW50KCclcycsICclcycsICVkKSAhXG4iLCAKLQkJbHBQb3J0TmFtZSwgbHBFbnZpcm9uLCBuQ291bnQpOwotICAgIGlmIChscFBvcnROYW1lID09IE5VTEwpIHJldHVybiAtMTsKLSAgICB3aGlsZSAobHBFbnYgIT0gTlVMTCkgewotCWlmIChscEVudi0+TmFtZSAhPSBOVUxMICYmIHN0cmNtcChscEVudi0+TmFtZSwgbHBQb3J0TmFtZSkgPT0gMCkgewotCSAgICBpZiAobkNvdW50ID09IDAgfHwgbHBFbnZpcm9uID09IE5VTEwpIHsKLQkJaWYgKGxwRW52LT5QcmV2ICE9IE5VTEwpIGxwRW52LT5QcmV2LT5OZXh0ID0gbHBFbnYtPk5leHQ7Ci0JCWlmIChscEVudi0+TmV4dCAhPSBOVUxMKSBscEVudi0+TmV4dC0+UHJldiA9IGxwRW52LT5QcmV2OwotCQlmcmVlKGxwRW52LT5WYWx1ZSk7Ci0JCWZyZWUobHBFbnYtPk5hbWUpOwotCQlmcmVlKGxwRW52KTsKLQkJZHByaW50Zl9lbnYoc3RkZGViLCAiU2V0RW52aXJvbm1lbnQoKSAvLyBlbnRyeSBkZWxldGVkICFcbiIpOwotCQlyZXR1cm4gLTE7Ci0JICAgIH0KLQkgICAgZnJlZShscEVudi0+VmFsdWUpOwotCSAgICBscEVudi0+VmFsdWUgPSBtYWxsb2MobkNvdW50KTsKLQkgICAgaWYgKGxwRW52LT5WYWx1ZSA9PSBOVUxMKSB7Ci0JCWRwcmludGZfZW52KHN0ZGRlYiwgIlNldEVudmlyb25tZW50KCkgLy8gRXJyb3IgYWxsb2NhdGluZyBlbnRyeSB2YWx1ZSAhXG4iKTsKLQkJcmV0dXJuIDA7Ci0JICAgIH0KLQkgICAgbWVtY3B5KGxwRW52LT5WYWx1ZSwgbHBFbnZpcm9uLCBuQ291bnQpOwotCSAgICBscEVudi0+d1NpemUgPSBuQ291bnQ7Ci0JICAgIGRwcmludGZfZW52KHN0ZGRlYiwgIlNldEVudmlyb25tZW50KCkgLy8gZW50cnkgbW9kaWZpZWQgIVxuIik7Ci0JICAgIHJldHVybiBuQ291bnQ7Ci0JfQotCWlmIChscEVudi0+TmV4dCA9PSBOVUxMKSBicmVhazsKLQlscEVudiA9IGxwRW52LT5OZXh0OwotICAgIH0KLSAgICBpZiAobkNvdW50ID09IDAgfHwgbHBFbnZpcm9uID09IE5VTEwpIHJldHVybiAtMTsKLSAgICBkcHJpbnRmX2VudihzdGRkZWIsICJTZXRFbnZpcm9ubWVudCgpIC8vIG5ldyBlbnRyeSAhXG4iKTsKLSAgICBscE5ld0VudiA9IG1hbGxvYyhzaXplb2YoRU5WRU5UUlkpKTsKLSAgICBpZiAobHBOZXdFbnYgPT0gTlVMTCkgewotCWRwcmludGZfZW52KHN0ZGRlYiwgIlNldEVudmlyb25tZW50KCkgLy8gRXJyb3IgYWxsb2NhdGluZyBuZXcgZW50cnkgIVxuIik7Ci0JcmV0dXJuIDA7Ci0gICAgfQotICAgIGlmIChscEVudkxpc3QgPT0gTlVMTCkgewotCWxwRW52TGlzdCA9IGxwTmV3RW52OwotCWxwTmV3RW52LT5QcmV2ID0gTlVMTDsKLSAgICB9Ci0gICAgZWxzZSAKLSAgICB7Ci0JbHBFbnYtPk5leHQgPSBscE5ld0VudjsKLQlscE5ld0Vudi0+UHJldiA9IGxwRW52OwotICAgIH0KLSAgICBscE5ld0Vudi0+TmV4dCA9IE5VTEw7Ci0gICAgbHBOZXdFbnYtPk5hbWUgPSBtYWxsb2Moc3RybGVuKGxwUG9ydE5hbWUpICsgMSk7Ci0gICAgaWYgKGxwTmV3RW52LT5OYW1lID09IE5VTEwpIHsKLQlkcHJpbnRmX2VudihzdGRkZWIsICJTZXRFbnZpcm9ubWVudCgpIC8vIEVycm9yIGFsbG9jYXRpbmcgZW50cnkgbmFtZSAhXG4iKTsKLQlyZXR1cm4gMDsKLSAgICB9Ci0gICAgc3RyY3B5KGxwTmV3RW52LT5OYW1lLCBscFBvcnROYW1lKTsKLSAgICBscE5ld0Vudi0+VmFsdWUgPSBtYWxsb2MobkNvdW50KTsKLSAgICBpZiAobHBOZXdFbnYtPlZhbHVlID09IE5VTEwpIHsKLQlkcHJpbnRmX2VudihzdGRkZWIsICJTZXRFbnZpcm9ubWVudCgpIC8vIEVycm9yIGFsbG9jYXRpbmcgZW50cnkgdmFsdWUgIVxuIik7Ci0JcmV0dXJuIDA7Ci0gICAgfQotICAgIG1lbWNweShscE5ld0Vudi0+VmFsdWUsIGxwRW52aXJvbiwgbkNvdW50KTsKLSAgICBscE5ld0Vudi0+d1NpemUgPSBuQ291bnQ7Ci0gICAgcmV0dXJuIG5Db3VudDsKLX0KLQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqICAgICAgICAgICBHZXRFbnZpcm9ubWVudCAgIChHREkuMTM0KQotICovCi1JTlQxNiBXSU5BUEkgR2V0RW52aXJvbm1lbnQoTFBDU1RSIGxwUG9ydE5hbWUsIExQU1RSIGxwRW52aXJvbiwgVUlOVDE2IG5NYXhTaXopCi17Ci0gICAgV09SRCAgICAgICBuQ291bnQ7Ci0gICAgTFBFTlZFTlRSWSBscEVudiA9IGxwRW52TGlzdDsKLQotICAgIGRwcmludGZfZW52KHN0ZGRlYiwgIkdldEVudmlyb25tZW50KCclcycsICclcycsICVkKSAhXG4iLAotCQlscFBvcnROYW1lLCBscEVudmlyb24sIG5NYXhTaXopOwotICAgIHdoaWxlIChscEVudiAhPSBOVUxMKSB7Ci0JaWYgKGxwRW52LT5OYW1lICE9IE5VTEwgJiYgc3RyY21wKGxwRW52LT5OYW1lLCBscFBvcnROYW1lKSA9PSAwKSB7Ci0JICAgIGlmKCBscEVudmlyb24gPT0gTlVMTCApIHJldHVybiBscEVudi0+d1NpemU7Ci0JICAgIG5Db3VudCA9IE1JTihuTWF4U2l6LCBscEVudi0+d1NpemUpOwotICAgICAgICAgICAgbWVtY3B5KGxwRW52aXJvbiwgbHBFbnYtPlZhbHVlLCBuQ291bnQpOwotCSAgICBkcHJpbnRmX2VudihzdGRkZWIsICJHZXRFbnZpcm9ubWVudCgpIC8vIGZvdW5kICclcycgIVxuIiwgbHBFbnYtPlZhbHVlKTsKLQkgICAgcmV0dXJuIG5Db3VudDsKLQl9Ci0JbHBFbnYgPSBscEVudi0+TmV4dDsKLSAgICB9Ci0gICAgZHByaW50Zl9lbnYoc3RkZGViLCAiR2V0RW52aXJvbm1lbnQoKSAvLyBub3QgZm91bmQgIVxuIik7Ci0gICAgcmV0dXJuIDA7Ci19Ci0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgKglHZXRUaW1lclJlc29sdXRpb24gKFVTRVIuMTQpCiAgKi8KIExPTkcgV0lOQVBJIEdldFRpbWVyUmVzb2x1dGlvbih2b2lkKQpkaWZmIC0tZ2l0IGEvbWlzYy9vbGUybmxzLmMgYi9taXNjL29sZTJubHMuYwppbmRleCA1ZmQ5MjRlLi5lODljMGM2IDEwMDY0NAotLS0gYS9taXNjL29sZTJubHMuYworKysgYi9taXNjL29sZTJubHMuYwpAQCAtMjA3NCw4ICsyMDc0LDggQEAKIAlpZiAoIWRzdGxlbiB8fCAhZHN0c3RyKSB7CiAJCWRzdHN0ciA9IHNyY3N0cjsKIAl9Ci0JaWYgKCFzcmNsZW4pIHNyY2xlbiA9IHN0cmxlbihzcmNzdHIpOwotCWlmICghZHN0bGVuKSBkc3RsZW4gPSBzdHJsZW4oZHN0c3RyKTsKKwlpZiAoIXNyY2xlbikgc3JjbGVuID0gbHN0cmxlbjMyVyhzcmNzdHIpOworCWlmICghZHN0bGVuKSBkc3RsZW4gPSBsc3RybGVuMzJXKGRzdHN0cik7CiAJbGVuID0gZHN0bGVuOwogCWlmIChzcmNsZW4gPCBsZW4pCiAJCWxlbiA9IHNyY2xlbjsKZGlmZiAtLWdpdCBhL21pc2Mvc2hlbGwuYyBiL21pc2Mvc2hlbGwuYwppbmRleCA2M2U2MThhLi5jNzAxYzcyIDEwMDY0NAotLS0gYS9taXNjL3NoZWxsLmMKKysrIGIvbWlzYy9zaGVsbC5jCkBAIC00Niw4ICs0Niw4IEBACiAKICNwcmFnbWEgcGFjayg0KQogCi1leHRlcm4gSElDT04xNiAgIExvYWRJY29uSGFuZGxlciggSEdMT0JBTDE2IGhSZXNvdXJjZSwgQk9PTDE2IGJOZXcgKTsKLWV4dGVybiBXT1JEIAkgR2V0SWNvbklEKCBIR0xPQkFMMTYgaFJlc291cmNlLCBEV09SRCByZXNUeXBlICk7CitleHRlcm4gSElDT04xNiAgIFdJTkFQSSBMb2FkSWNvbkhhbmRsZXIoIEhHTE9CQUwxNiBoUmVzb3VyY2UsIEJPT0wxNiBiTmV3ICk7CitleHRlcm4gV09SRCAJIFdJTkFQSSBHZXRJY29uSUQoIEhHTE9CQUwxNiBoUmVzb3VyY2UsIERXT1JEIHJlc1R5cGUgKTsKIAogc3RhdGljIGNvbnN0IGNoYXIqCWxwc3RyTXNnV25kQ3JlYXRlZCA9ICJPVEhFUldJTkRPV0NSRUFURUQiOwogc3RhdGljIGNvbnN0IGNoYXIqCWxwc3RyTXNnV25kRGVzdHJveWVkID0gIk9USEVSV0lORE9XREVTVFJPWUVEIjsKQEAgLTkzNSw2ICs5MzUsMTIgQEAKICAgICByZXR1cm4gQ2FsbE5leHRIb29rRXgxNiggV0hfU0hFTEwsIGNvZGUsIHdQYXJhbSwgbFBhcmFtICk7CiB9CiAKK0xSRVNVTFQgV0lOQVBJIEZVTkMwMDQoSU5UMTYgY29kZSwgV1BBUkFNMTYgd1BhcmFtLCBMUEFSQU0gbFBhcmFtKQoreworCWZwcmludGYoc3RkZXJyLCJGVU5DMDA0KCVkLCVkLCVsZCksU1RVQiFcbiIsY29kZSx3UGFyYW0sbFBhcmFtKTsKKwlyZXR1cm4gU2hlbGxIb29rUHJvYyhjb2RlLHdQYXJhbSxsUGFyYW0pOworfQorCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogICoJCQkJUmVnaXN0ZXJTaGVsbEhvb2sJW1NIRUxMLjEwMl0KICAqLwpkaWZmIC0tZ2l0IGEvbWlzYy9zcHkuYyBiL21pc2Mvc3B5LmMKaW5kZXggNTZjZWJmZS4uNDUyNGYzZSAxMDA2NDQKLS0tIGEvbWlzYy9zcHkuYworKysgYi9taXNjL3NweS5jCkBAIC03NjUsNiArNzY1LDggQEAKICAgICBpbnQgaTsKICAgICBjaGFyIGJ1ZmZlclsxMDI0XTsKIAorICAgIGlmICghZGVidWdnaW5nX21lc3NhZ2UpIHJldHVybiBUUlVFOworCiAgICAgUFJPRklMRV9HZXRXaW5lSW5pU3RyaW5nKCAiU3B5IiwgIkluY2x1ZGUiLCAiIiwgYnVmZmVyLCBzaXplb2YoYnVmZmVyKSApOwogICAgIGlmIChidWZmZXJbMF0gJiYgc3RyY21wKCBidWZmZXIsICJJTkNMVURFQUxMIiApKQogICAgIHsKZGlmZiAtLWdpdCBhL21pc2Mvd2luc29jay5jIGIvbWlzYy93aW5zb2NrLmMKaW5kZXggYmVjMDE2Yy4uYzRkOGQzZCAxMDA2NDQKLS0tIGEvbWlzYy93aW5zb2NrLmMKKysrIGIvbWlzYy93aW5zb2NrLmMKQEAgLTQzLDYgKzQzLDcgQEAKICNpbmNsdWRlICJzdGRkZWJ1Zy5oIgogI2luY2x1ZGUgImRlYnVnLmgiCiAKKyNkZWZpbmUgREVCVUdfU09DS0FERFIgMAogI2RlZmluZSBkdW1wX3NvY2thZGRyKGEpIFwKICAgICAgICAgZnByaW50ZihzdGRlcnIsICJzb2NrYWRkcl9pbjogZmFtaWx5ICVkLCBhZGRyZXNzICVzLCBwb3J0ICVkXG4iLCBcCiAgICAgICAgICAgICAgICAgICAgICAgICAoKHN0cnVjdCBzb2NrYWRkcl9pbiAqKWEpLT5zaW5fZmFtaWx5LCBcCkBAIC0xNDcsMTYgKzE0OCwxNiBAQAogICAgIHJldHVybiBOVUxMOwogfQogCi1zdGF0aWMgdm9pZCBmZF9zZXRfbm9ybWFsaXplKGZkX3NldCogZmRzLCBMUFdTSU5GTyBwd3NpLCB3c19mZF9zZXQqIHdzLCBpbnQqIGhpZ2hmZCkKK3N0YXRpYyBmZF9zZXQqIGZkX3NldF9pbXBvcnQoIGZkX3NldCogZmRzLCBMUFdTSU5GTyBwd3NpLCB3c19mZF9zZXQqIHdzLCBpbnQqIGhpZ2hmZCApCiB7Ci0gICAgLyogdHJhbnNsYXRlIFdpbnNvY2sgZmQgc2V0IGludG8gdGhlIG5vcm1hbCBmZCBzZXQgKi8KKyAgICAvKiB0cmFuc2xhdGUgV2luc29jayBmZCBzZXQgaW50byBsb2NhbCBmZCBzZXQgKi8KIAotICAgIEZEX1pFUk8oZmRzKTsKICAgICBpZiggd3MgKSAKICAgICB7IAogCWludCAJaTsKIAl3c19zb2NrZXQqICBwd3M7CiAKKwlGRF9aRVJPKGZkcyk7CiAJZm9yKCBpID0gMDsgaSA8ICh3cy0+ZmRfY291bnQpIDsgaSsrICkgCiAJewogCSAgICBwd3MgPSAod3Nfc29ja2V0KilXU19IQU5ETEUyUFRSKHdzLT5mZF9hcnJheVtpXSk7CkBAIC0xNjYsMjkgKzE2NywyOCBAQAogCQlGRF9TRVQocHdzLT5mZCwgZmRzKTsgCiAJICAgIH0KIAl9CisJcmV0dXJuIGZkczsKICAgICB9CisgICAgcmV0dXJuIE5VTEw7CiB9CiAKLS8qCi0gKiBOb3RlIHdlaXJkbmVzcyBoZXJlOiBzb2NrZXRzIHdpdGggZXJyb3JzIGJlbG9uZyBpbiBleGNlcHRmZHMsIGJ1dAotICogYXJlIGdpdmVuIHRvIHVzIGluIHJlYWRmZHMgb3Igd3JpdGVmZHMsIHNvIG1vdmUgdGhlbSB0byBleGNlcHRmZHMgaWYKLSAqIHRoZXJlIGlzIGFuIGVycm9yLiBOb3RlIHRoYXQgdGhpcyBtZWFucyB0aGF0IGV4Y2VwdGZkcyBtYXkgaGF2ZSBteXN0ZXJpb3VzCi0gKiBzb2NrZXRzIHNldCBpbiBpdCB0aGF0IHRoZSBwcm9ncmFtIG5ldmVyIGFza2VkIGZvci4KLSAqLwotCiBfX2lubGluZV9fIHN0YXRpYyBpbnQgc29ja19lcnJvcl9wKGludCBzKQogewogICAgIHVuc2lnbmVkIGludCBvcHR2YWwsIG9wdGxlbjsKIAogICAgIG9wdGxlbiA9IHNpemVvZihvcHR2YWwpOwogICAgIGdldHNvY2tvcHQocywgU09MX1NPQ0tFVCwgU09fRVJST1IsICZvcHR2YWwsICZvcHRsZW4pOwotICAgIGlmIChvcHR2YWwpIGRwcmludGZfd2luc29jayhzdGRkZWIsICJlcnJvcjogJWRcbiIsIG9wdHZhbCk7CisgICAgaWYgKG9wdHZhbCkgZHByaW50Zl93aW5zb2NrKHN0ZGRlYiwgIlx0WyVpXSBlcnJvcjogJWRcbiIsIHMsIG9wdHZhbCk7CiAgICAgcmV0dXJuIG9wdHZhbCAhPSAwOwogfQogCi1zdGF0aWMgdm9pZCBmZF9zZXRfdXBkYXRlKExQV1NJTkZPIHB3c2ksIGZkX3NldCogZmRzLCB3c19mZF9zZXQqIHdzLAotCQkJICBmZF9zZXQgKmVycm9yZmRzKQorc3RhdGljIGludCBmZF9zZXRfZXhwb3J0KCBMUFdTSU5GTyBwd3NpLCBmZF9zZXQqIGZkcywgZmRfc2V0KiBleGNlcHRmZHMsIHdzX2ZkX3NldCogd3MgKQogeworICAgIGludCBudW1fZXJyID0gMDsKKworICAgIC8qIHRyYW5zbGF0ZSBsb2NhbCBmZCBzZXQgaW50byBXaW5zb2NrIGZkIHNldCwgYWRkaW5nCisgICAgICogZXJyb3JzIHRvIGV4Y2VwdGZkcyAob25seSBpZiBhcHAgcmVxdWVzdGVkIGl0KSAqLworCiAgICAgaWYoIHdzICkKICAgICB7CiAJaW50IGksIGosIGNvdW50ID0gd3MtPmZkX2NvdW50OwpAQCAtMjAwLDkgKzIwMCwxMSBAQAogCiAJICAgIGlmKCBfY2hlY2tfd3MocHdzaSwgcHdzKSAmJiBGRF9JU1NFVChmZCwgZmRzKSApCiAJICAgIHsKLQkJLyogaWYgZXJyb3IsIG1vdmUgdG8gZXJyb3JmZHMgKi8KLQkJaWYgKGVycm9yZmRzICYmIChGRF9JU1NFVChmZCwgZXJyb3JmZHMpIHx8IHNvY2tfZXJyb3JfcChmZCkpKQotCQkgICAgRkRfU0VUKGZkLCBlcnJvcmZkcyk7CisJCWlmICggZXhjZXB0ZmRzICYmIHNvY2tfZXJyb3JfcChmZCkgKQorCQl7CisJCSAgICBGRF9TRVQoZmQsIGV4Y2VwdGZkcyk7CisJCSAgICBudW1fZXJyKys7CisJCX0KIAkJZWxzZQogCQkgICAgd3MtPmZkX2FycmF5W2orK10gPSB3cy0+ZmRfYXJyYXlbaV07CiAJICAgIH0KQEAgLTIxMCw3ICsyMTIsNyBAQAogCXdzLT5mZF9jb3VudCA9IGo7CiAJZHByaW50Zl93aW5zb2NrKHN0ZGRlYiwgIlxuIik7CiAgICAgfQotICAgIHJldHVybjsKKyAgICByZXR1cm4gbnVtX2VycjsKIH0KIAogSEFORExFMTYgX193c19nZXRoYW5kbGUoIHZvaWQqIHB0ciApCkBAIC01MjAsOSArNTIyLDkgQEAKIFNPQ0tFVDE2IFdJTkFQSSBXSU5TT0NLX2FjY2VwdDE2KFNPQ0tFVDE2IHMsIHN0cnVjdCBzb2NrYWRkciogYWRkciwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElOVDE2KiBhZGRybGVuMTYgKQogewotICAgIElOVDMyIGFkZHJsZW4zMiA9ICphZGRybGVuMTY7CisgICAgSU5UMzIgYWRkcmxlbjMyID0gYWRkcmxlbjE2ID8gKmFkZHJsZW4xNiA6IDA7CiAgICAgU09DS0VUMzIgcmV0U29ja2V0ID0gV0lOU09DS19hY2NlcHQzMiggcywgYWRkciwgJmFkZHJsZW4zMiApOwotICAgKmFkZHJsZW4xNiA9IChJTlQxNilhZGRybGVuMzI7CisgICAgaWYoIGFkZHJsZW4xNiApICphZGRybGVuMTYgPSAoSU5UMTYpYWRkcmxlbjMyOwogICAgIHJldHVybiAoU09DS0VUMTYpcmV0U29ja2V0OwogfQogCkBAIC01MzYsNyArNTM4LDcgQEAKIAogICAgIGRwcmludGZfd2luc29jayhzdGRkZWIsICJXU19CSU5EKCUwOHgpOiBzb2NrZXQgJTA0eCwgcHRyICU4eCwgbGVuZ3RoICVkXG4iLCAKIAkJCSAgICh1bnNpZ25lZClwd3NpLCBzLCAoaW50KSBuYW1lLCBuYW1lbGVuKTsKLSNpZiAwCisjaWYgREVCVUdfU09DS0FERFIKICAgICBkdW1wX3NvY2thZGRyKG5hbWUpOwogI2VuZGlmCiAKQEAgLTYxNCw3ICs2MTYsNyBAQAogCiAgIGRwcmludGZfd2luc29jayhzdGRkZWIsICJXU19DT05ORUNUKCUwOHgpOiBzb2NrZXQgJTA0eCwgcHRyICU4eCwgbGVuZ3RoICVkXG4iLCAKIAkJCSAgICh1bnNpZ25lZClwd3NpLCBzLCAoaW50KSBuYW1lLCBuYW1lbGVuKTsKLSNpZiAwCisjaWYgREVCVUdfU09DS0FERFIKICAgZHVtcF9zb2NrYWRkcihuYW1lKTsKICNlbmRpZgogCkBAIC02MjIsOSArNjI0LDEzIEBACiAgIHsKICAgICBpZiAoY29ubmVjdChwd3MtPmZkLCBuYW1lLCBuYW1lbGVuKSA9PSAwKSAKICAgICB7IAotCXB3cy0+ZmxhZ3MgJj0gfihXU19GRF9JTkFDVElWRSB8IFdTX0ZEX0NPTk5FQ1QpOwotCWlmKCBwd3MtPnBzb3AgJiYgcHdzLT5mbGFncyAmIFdTX0ZEX0NPTk5FQ1QgKQorCWlmKCBwd3MtPnBzb3AgJiYgKHB3cy0+ZmxhZ3MgJiBXU19GRF9DT05ORUNUKSApCiAJeworCSAgICAvKiBhcHBsaWNhdGlvbiBkaWQgQXN5bmNTZWxlY3QoKSBidXQgdGhlbiB3ZW50CisJICAgICAqIGFoZWFkIGFuZCBjYWxsZWQgY29ubmVjdCgpIHdpdGhvdXQgd2FpdGluZyBmb3IgCisJICAgICAqIG5vdGlmaWNhdGlvbi4KKwkgICAgICovCisKIAkgICAgaWYoICEocHdzLT5mbGFncyAmIFdTX0ZEX0NPTk5FQ1RFRCkgKQogCSAgICB7CiAJCWlmKCBwd3MtPmZsYWdzICYgKFdTX0ZEX1JFQUQgfCBXU19GRF9DTE9TRSkgKQpAQCAtNjM4LDYgKzY0NCw3IEBACiAJCXB3cy0+ZmxhZ3MgfD0gV1NfRkRfQ09OTkVDVEVEOwogCSAgICB9CiAJfQorCXB3cy0+ZmxhZ3MgJj0gfihXU19GRF9JTkFDVElWRSB8IFdTX0ZEX0NPTk5FQ1QpOwogICAgICAgICByZXR1cm4gMDsgCiAgICAgfQogICAgIHB3c2ktPmVyciA9IChlcnJubyA9PSBFSU5QUk9HUkVTUykgPyBXU0FFV09VTERCTE9DSyA6IHdzYUVycm5vKCk7CkBAIC02ODIsNyArNjg5LDcgQEAKICAgICBJTlQzMiBuYW1lbGVuMzIgPSAqbmFtZWxlbjE2OwogICAgIElOVDMyIHJldFZhbCA9IFdJTlNPQ0tfZ2V0cGVlcm5hbWUzMiggcywgbmFtZSwgJm5hbWVsZW4zMiApOwogCi0jaWYgMAorI2lmIERFQlVHX1NPQ0tBRERSCiAgICAgZHVtcF9zb2NrYWRkcihuYW1lKTsKICNlbmRpZgogCkBAIC03MTYsOSArNzIzLDIwIEBACiBJTlQxNiBXSU5BUEkgV0lOU09DS19nZXRzb2NrbmFtZTE2KFNPQ0tFVDE2IHMsIHN0cnVjdCBzb2NrYWRkciAqbmFtZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSU5UMTYgKm5hbWVsZW4xNikKIHsKLSAgICBJTlQzMiBuYW1lbGVuMzIgPSAqbmFtZWxlbjE2OwotICAgIElOVDMyIHJldFZhbCA9IFdJTlNPQ0tfZ2V0c29ja25hbWUzMiggcywgbmFtZSwgJm5hbWVsZW4zMiApOwotICAgKm5hbWVsZW4xNiA9IG5hbWVsZW4zMjsKKyAgICBJTlQzMiByZXRWYWw7CisKKyAgICBpZiggbmFtZWxlbjE2ICkKKyAgICB7CisgICAgICAgIElOVDMyIG5hbWVsZW4zMiA9ICpuYW1lbGVuMTY7CisgICAgICAgIHJldFZhbCA9IFdJTlNPQ0tfZ2V0c29ja25hbWUzMiggcywgbmFtZSwgJm5hbWVsZW4zMiApOworICAgICAgICpuYW1lbGVuMTYgPSBuYW1lbGVuMzI7CisKKyNpZiBERUJVR19TT0NLQUREUgorICAgIGR1bXBfc29ja2FkZHIobmFtZSk7CisjZW5kaWYKKworICAgIH0KKyAgICBlbHNlIHJldFZhbCA9IFNPQ0tFVF9FUlJPUjsKICAgICByZXR1cm4gKElOVDE2KXJldFZhbDsKIH0KIApAQCAtNzUwLDkgKzc2OCwxMiBAQAogSU5UMTYgV0lOQVBJIFdJTlNPQ0tfZ2V0c29ja29wdDE2KFNPQ0tFVDE2IHMsIElOVDE2IGxldmVsLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElOVDE2IG9wdG5hbWUsIGNoYXIgKm9wdHZhbCwgSU5UMTYgKm9wdGxlbikKIHsKLSAgICBJTlQzMiBvcHRsZW4zMiA9ICpvcHRsZW47Ci0gICAgSU5UMzIgcmV0VmFsID0gV0lOU09DS19nZXRzb2Nrb3B0MzIoIHMsIGxldmVsLCBvcHRuYW1lLCBvcHR2YWwsICZvcHRsZW4zMiApOwotICAgKm9wdGxlbiA9IG9wdGxlbjMyOworICAgIElOVDMyIG9wdGxlbjMyOworICAgIElOVDMyICpwID0gJm9wdGxlbjMyOworICAgIElOVDMyIHJldFZhbDsKKyAgICBpZiggb3B0bGVuICkgb3B0bGVuMzIgPSAqb3B0bGVuOyBlbHNlIHAgPSBOVUxMOworICAgIHJldFZhbCA9IFdJTlNPQ0tfZ2V0c29ja29wdDMyKCBzLCBsZXZlbCwgb3B0bmFtZSwgb3B0dmFsLCBwICk7CisgICAgaWYoIG9wdGxlbiApICpvcHRsZW4gPSBvcHRsZW4zMjsKICAgICByZXR1cm4gKElOVDE2KXJldFZhbDsKIH0KIApAQCAtODgzLDYgKzkwNCw3IEBACiAJICAgIGludCAgZmRfZmxhZ3MgPSBmY250bChwd3MtPmZkLCBGX0dFVEZMLCAwKTsKIAkgICAgaWYoICEoZmRfZmxhZ3MgJiBPX05PTkJMT0NLKSApIHB3cy0+ZmxhZ3MgfD0gV1NfRkRfQUNDRVBUOwogCX0KKwllbHNlIGlmKCAhKHB3cy0+ZmxhZ3MgJiBXU19GRF9DT05ORUNURUQpICkgcHdzLT5mbGFncyB8PSBXU19GRF9MSVNURU5JTkc7CiAKIAlpZiAobGlzdGVuKHB3cy0+ZmQsIGJhY2tsb2cpID09IDApIHJldHVybiAwOwogCXB3c2ktPmVyciA9IHdzYUVycm5vKCk7CkBAIC05NDksNiArOTcxLDExIEBACiAKICAgICBkcHJpbnRmX3dpbnNvY2soc3RkZGViLCAiV1NfUkVDVkZST00oJTA4eCk6IHNvY2tldCAlMDR4LCBwdHIgJTA4eCwgbGVuICVkLCBmbGFncyAlZCIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICh1bnNpZ25lZClwd3NpLCBzLCAodW5zaWduZWQpYnVmLCBsZW4sIGZsYWdzKTsKKyNpZiBERUJVR19TT0NLQUREUgorICAgIGlmKCBmcm9tICkgZHVtcF9zb2NrYWRkcihmcm9tKTsKKyAgICBlbHNlIGZwcmludGYoc3RkZXJyLCAiXHRmcm9tID0gTlVMTFxuIik7CisjZW5kaWYKKwogICAgIGlmKCBfY2hlY2tfd3MocHdzaSwgcHdzKSApCiAgICAgewogCWludCBsZW5ndGg7CkBAIC05NzUsOSArMTAwMiwxMyBAQAogSU5UMTYgV0lOQVBJIFdJTlNPQ0tfcmVjdmZyb20xNihTT0NLRVQxNiBzLCBjaGFyICpidWYsIElOVDE2IGxlbiwgSU5UMTYgZmxhZ3MsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cnVjdCBzb2NrYWRkciAqZnJvbSwgSU5UMTYgKmZyb21sZW4xNikKIHsKLSAgICBJTlQzMiBmcm9tbGVuMzIgPSAqZnJvbWxlbjE2OwotICAgIElOVDMyIHJldFZhbCA9IFdJTlNPQ0tfcmVjdmZyb20zMiggcywgYnVmLCBsZW4sIGZsYWdzLCBmcm9tLCAmZnJvbWxlbjMyICk7Ci0gICAqZnJvbWxlbjE2ID0gZnJvbWxlbjMyOworICAgIElOVDMyIGZyb21sZW4zMjsKKyAgICBJTlQzMiAqcCA9ICZmcm9tbGVuMzI7CisgICAgSU5UMzIgcmV0VmFsOworCisgICAgaWYoIGZyb21sZW4xNiApIGZyb21sZW4zMiA9ICpmcm9tbGVuMTY7IGVsc2UgcCA9IE5VTEw7CisgICAgcmV0VmFsID0gV0lOU09DS19yZWN2ZnJvbTMyKCBzLCBidWYsIGxlbiwgZmxhZ3MsIGZyb20sIHAgKTsKKyAgICBpZiggZnJvbWxlbjE2ICkgKmZyb21sZW4xNiA9IGZyb21sZW4zMjsKICAgICByZXR1cm4gKElOVDE2KXJldFZhbDsKIH0KIApAQCAtOTg4LDUwICsxMDE5LDQ2IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3c19mZF9zZXQgKndzX3dyaXRlZmRzLCB3c19mZF9zZXQgKndzX2V4Y2VwdGZkcywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cnVjdCB0aW1ldmFsICp0aW1lb3V0KQogewotICBMUFdTSU5GTyAgICAgIHB3c2kgPSB3c2lfZmluZChHZXRDdXJyZW50VGFzaygpKTsKKyAgICBMUFdTSU5GTyAgICAgIHB3c2kgPSB3c2lfZmluZChHZXRDdXJyZW50VGFzaygpKTsKIAkKLSAgZHByaW50Zl93aW5zb2NrKHN0ZGRlYiwgIldTX1NFTEVDVCglMDh4KTogbmZkcyAlZCAoaWdub3JlZCksIHJlYWQgJTh4LCB3cml0ZSAlOHgsIGV4Y3AgJTh4XG4iLCAKLSAgKHVuc2lnbmVkKSBwd3NpLCBuZmRzLCAodW5zaWduZWQpIHdzX3JlYWRmZHMsICh1bnNpZ25lZCkgd3Nfd3JpdGVmZHMsICh1bnNpZ25lZCkgd3NfZXhjZXB0ZmRzKTsKKyAgICBkcHJpbnRmX3dpbnNvY2soc3RkZGViLCAiV1NfU0VMRUNUKCUwOHgpOiBuZmRzICVkIChpZ25vcmVkKSwgcmVhZCAlOHgsIHdyaXRlICU4eCwgZXhjcCAlOHhcbiIsIAorICAgICh1bnNpZ25lZCkgcHdzaSwgbmZkcywgKHVuc2lnbmVkKSB3c19yZWFkZmRzLCAodW5zaWduZWQpIHdzX3dyaXRlZmRzLCAodW5zaWduZWQpIHdzX2V4Y2VwdGZkcyk7CiAKLSAgaWYoIHB3c2kgKQotICB7Ci0gICAgIGludCAgICAgICAgIGhpZ2hmZCA9IDA7Ci0gICAgIGZkX3NldCAgICAgIHJlYWRmZHMsIHdyaXRlZmRzLCBleGNlcHRmZHMsIGVycm9yZmRzOworICAgIGlmKCBwd3NpICkKKyAgICB7CisJaW50ICAgICAgICAgaGlnaGZkID0gMDsKKwlmZF9zZXQgICAgICByZWFkZmRzLCB3cml0ZWZkcywgZXhjZXB0ZmRzOworCWZkX3NldCAgICAgKnBfcmVhZCwgKnBfd3JpdGUsICpwX2V4Y2VwdDsKIAotICAgICBmZF9zZXRfbm9ybWFsaXplKCZyZWFkZmRzLCBwd3NpLCB3c19yZWFkZmRzLCAmaGlnaGZkKTsKLSAgICAgZmRfc2V0X25vcm1hbGl6ZSgmd3JpdGVmZHMsIHB3c2ksIHdzX3dyaXRlZmRzLCAmaGlnaGZkKTsKLSAgICAgZmRfc2V0X25vcm1hbGl6ZSgmZXhjZXB0ZmRzLCBwd3NpLCB3c19leGNlcHRmZHMsICZoaWdoZmQpOwotICAgICBGRF9aRVJPKCZlcnJvcmZkcyk7CisJcF9yZWFkID0gZmRfc2V0X2ltcG9ydCgmcmVhZGZkcywgcHdzaSwgd3NfcmVhZGZkcywgJmhpZ2hmZCk7CisJcF93cml0ZSA9IGZkX3NldF9pbXBvcnQoJndyaXRlZmRzLCBwd3NpLCB3c193cml0ZWZkcywgJmhpZ2hmZCk7CisJcF9leGNlcHQgPSBmZF9zZXRfaW1wb3J0KCZleGNlcHRmZHMsIHB3c2ksIHdzX2V4Y2VwdGZkcywgJmhpZ2hmZCk7CiAKLSAgICAgaWYoIChoaWdoZmQgPSBzZWxlY3QoaGlnaGZkICsgMSwgJnJlYWRmZHMsICZ3cml0ZWZkcywgJmV4Y2VwdGZkcywgdGltZW91dCkpID49IDAgKQotICAgICB7Ci0JICBpZiggaGlnaGZkICkKLQkgIHsKLQkgICAgZmRfc2V0X3VwZGF0ZShwd3NpLCAmcmVhZGZkcywgd3NfcmVhZGZkcywgJmVycm9yZmRzKTsKLQkgICAgZmRfc2V0X3VwZGF0ZShwd3NpLCAmd3JpdGVmZHMsIHdzX3dyaXRlZmRzLCAmZXJyb3JmZHMpOwotCi0JICAgIC8qIHVwZGF0ZSBleGNlcHRpb24gc2V0IChzZWUgIndlaXJkbmVzcyIgY29tbWVudCBpbiB0aGUKLQkgICAgICogYmVnaW5uaW5nIG9mIHRoZSBmaWxlKS4gKi8KLQotCSAgICBpZiAod3NfZXhjZXB0ZmRzKQorCWlmKCAoaGlnaGZkID0gc2VsZWN0KGhpZ2hmZCArIDEsIHBfcmVhZCwgcF93cml0ZSwgcF9leGNlcHQsIHRpbWVvdXQpKSA+PSAwICkKKwl7CisJICAgIGlmKCBoaWdoZmQgKQogCSAgICB7Ci0JCWludCBpLCBqLCBjb3VudCA9IHdzX2V4Y2VwdGZkcy0+ZmRfY291bnQ7CisJCWZkX3NldF9leHBvcnQocHdzaSwgJnJlYWRmZHMsIHBfZXhjZXB0LCB3c19yZWFkZmRzKTsKKwkJZmRfc2V0X2V4cG9ydChwd3NpLCAmd3JpdGVmZHMsIHBfZXhjZXB0LCB3c193cml0ZWZkcyk7CiAKLQkJZm9yIChpID0gaiA9IDA7IGkgPCBjb3VudDsgaSsrKQorCQlpZiAocF9leGNlcHQgJiYgd3NfZXhjZXB0ZmRzKQogCQl7Ci0JCSAgICB3c19zb2NrZXQgKnB3cyA9ICh3c19zb2NrZXQgKilXU19IQU5ETEUyUFRSKHdzX2V4Y2VwdGZkcy0+ZmRfYXJyYXlbaV0pOwotCQkgICAgaWYoIF9jaGVja193cyhwd3NpLCBwd3MpICYmIAotCQkJKEZEX0lTU0VUKHB3cy0+ZmQsICZleGNlcHRmZHMpIHx8IEZEX0lTU0VUKHB3cy0+ZmQsICZlcnJvcmZkcykpICkKLQkJCXdzX2V4Y2VwdGZkcy0+ZmRfYXJyYXlbaisrXSA9IHdzX2V4Y2VwdGZkcy0+ZmRfYXJyYXlbaV07CisJCSAgICBpbnQgaSwgaiwgY291bnQgPSB3c19leGNlcHRmZHMtPmZkX2NvdW50OworCisJCSAgICBmb3IgKGkgPSBqID0gMDsgaSA8IGNvdW50OyBpKyspCisJCSAgICB7CisJCQl3c19zb2NrZXQgKnB3cyA9ICh3c19zb2NrZXQgKilXU19IQU5ETEUyUFRSKHdzX2V4Y2VwdGZkcy0+ZmRfYXJyYXlbaV0pOworCQkJaWYoIF9jaGVja193cyhwd3NpLCBwd3MpICYmIEZEX0lTU0VUKHB3cy0+ZmQsICZleGNlcHRmZHMpICkKKwkJCSAgICB3c19leGNlcHRmZHMtPmZkX2FycmF5W2orK10gPSB3c19leGNlcHRmZHMtPmZkX2FycmF5W2ldOworCQkgICAgfQorCQkgICAgd3NfZXhjZXB0ZmRzLT5mZF9jb3VudCA9IGo7CiAJCX0KLQkJd3NfZXhjZXB0ZmRzLT5mZF9jb3VudCA9IGo7CiAJICAgIH0KLQkgIH0KLQkgIHJldHVybiBoaWdoZmQ7IAotICAgICB9Ci0gICAgIHB3c2ktPmVyciA9IHdzYUVycm5vKCk7Ci0gIH0gCi0gIHJldHVybiBTT0NLRVRfRVJST1I7CisJICAgIHJldHVybiBoaWdoZmQ7IAorCX0KKyAgICAgICAgcHdzaS0+ZXJyID0gd3NhRXJybm8oKTsKKyAgICB9IAorICAgIHJldHVybiBTT0NLRVRfRVJST1I7CiB9CiAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgpAQCAtMTE0Niw2ICsxMTczLDcgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaGFyICpvcHR2YWwsIElOVDE2IG9wdGxlbikKIHsKICAgICBJTlQzMiBsaW5nZXIzMlsyXTsKKyAgICBpZiggIW9wdHZhbCApIHJldHVybiBTT0NLRVRfRVJST1I7CiAgICAgaWYoIG9wdG5hbWUgPT0gU09fTElOR0VSICkKICAgICB7CiAJSU5UMTYqIHB0ciA9IChJTlQxNiopb3B0dmFsOwpAQCAtMTE5NSw3ICsxMjIzLDcgQEAKIAl7CiAJICAgIGlmKCBob3cgPiAxICkgCiAJICAgIHsKLQkJcHdzLT5mbGFncyAmPSB+V1NfRkRfQ09OTkVDVEVEOworCQlwd3MtPmZsYWdzICY9IH4oV1NfRkRfQ09OTkVDVEVEIHwgV1NfRkRfTElTVEVOSU5HKTsKIAkJcHdzLT5mbGFncyB8PSBXU19GRF9JTkFDVElWRTsKIAkgICAgfQogCSAgICByZXR1cm4gMDsKQEAgLTE3ODAsMTAgKzE4MDgsMTQgQEAKIAogCSAgICBudW1fcGVuZGluZy0tOwogCi0JICAgIGlmKCBmbGFncyAmIFdTX0ZEX0FDQ0VQVCApCi0JICAgIHsKLQkJLyogbGlzdGVuaW5nIHNvY2tldCAqLworCSAgICAvKiBOb3cgZmlndXJlIG91dCB3aGF0IGtpbmQgb2YgZXZlbnQgd2UndmUgZ290LiBUaGUgd29yc3QgcHJvYmxlbQorCSAgICAgKiB3ZSBoYXZlIHRvIGNvbnRlbmQgd2l0aCBpcyB0aGF0IHNvbWUgb3V0IG9mIGNvbnRyb2wgYXBwbGljYXRpb25zIAorCSAgICAgKiByZWFsbHkgd2FudCB0byB1c2UgbXV0dWFsbHkgZXhjbHVzaXZlIEFzeW5jU2VsZWN0KCkgZmxhZ3MgYWxsIGF0CisJICAgICAqIHRoZSBzYW1lIHRpbWUuCisJICAgICAqLwogCisJICAgIGlmKChmbGFncyAmIFdTX0ZEX0FDQ0VQVCkgJiYgKGZsYWdzICYgV1NfRkRfTElTVEVOSU5HKSkKKwkgICAgewogCQlGRF9DTFIoIGZkLCAmaW9fc2V0W0VWRU5UX0lPX1dSSVRFXSApOwogCQlpZiggciApCiAJCXsKQEAgLTE4MDcsOCArMTgzOSwxMiBAQAogCiAJCSAgICBpZiggZmxhZ3MgJiAoV1NfRkRfUkVBRCB8IFdTX0ZEX0NMT1NFKSkKIAkJCUZEX1NFVCggZmQsICZpb19zZXRbRVZFTlRfSU9fUkVBRF0gKTsKLQkJICAgIGlmKCBmbGFncyAmIFdTX0ZEX1dSSVRFICkgRkRfU0VUKCBmZCwgJmlvX3NldFtFVkVOVF9JT19XUklURV0gKTsKLQkJICAgIGVsc2UgRkRfQ0xSKCBmZCwgJmlvX3NldFtFVkVOVF9JT19XUklURV0gKTsKKwkJICAgIGVsc2UgCisJCQlGRF9DTFIoIGZkLCAmaW9fc2V0W0VWRU5UX0lPX1JFQURdICk7CisJCSAgICBpZiggZmxhZ3MgJiBXU19GRF9XUklURSApIAorCQkJRkRfU0VUKCBmZCwgJmlvX3NldFtFVkVOVF9JT19XUklURV0gKTsKKwkJICAgIGVsc2UgCisJCQlGRF9DTFIoIGZkLCAmaW9fc2V0W0VWRU5UX0lPX1dSSVRFXSApOwogCQkgICAgYlBvc3QgPSBUUlVFOwogCQl9CiAJCWVsc2UgaWYoIHIgKQpAQCAtMTgzOCw2ICsxODc0LDggQEAKIAkJICAgIGlmKCBQb3N0TWVzc2FnZTE2KCBwc29wLT5oV25kLCBwc29wLT51TXNnLCAoV1BBUkFNMTYpV1NfUFRSMkhBTkRMRShwc29wLT5wd3MpLCAKIAkJCSAgICAgICAgICAgICAgKExQQVJBTSlXU0FNQUtFU0VMRUNUUkVQTFkoIFdTX0ZEX1dSSVRFLCAwICkgKSApCiAJCSAgICB7CisJCQlkcHJpbnRmX3dpbnNvY2soc3RkZGViLCAiXHQgICAgaHduZCAlMDR4IC0gJTA0eCwgJTA4eFxuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHNvcC0+aFduZCwgcHNvcC0+dU1zZywgKHVuc2lnbmVkKU1BS0VMT05HKFdTX0ZEX1dSSVRFLCAwKSApOwogCQkJRkRfQ0xSKCBmZCwgJmlvX3NldFtFVkVOVF9JT19XUklURV0gKTsKIAkJCW51bV9wb3N0ZWQrKzsKIAkJICAgIH0KQEAgLTE4OTgsNiArMTkzNiw4IEBACiAKIAkgICAgaWYoIGJQb3N0ICkKIAkgICAgeworCQlkcHJpbnRmX3dpbnNvY2soc3RkZGViLCAiXHQgICAgaHduZCAlMDR4IC0gJTA0eCwgJTA4eFxuIiwgCisJCQkJcHNvcC0+aFduZCwgcHNvcC0+dU1zZywgKHVuc2lnbmVkKWR3RXZlbnQgKTsKIAkJUG9zdE1lc3NhZ2UxNiggcHNvcC0+aFduZCwgcHNvcC0+dU1zZywgCiAJCQkgICAgICAoV1BBUkFNMTYpV1NfUFRSMkhBTkRMRShwc29wLT5wd3MpLCAoTFBBUkFNKWR3RXZlbnQgKTsKIAkJYlBvc3QgPSBGQUxTRTsKQEAgLTIwNTMsNyArMjA5Myw4IEBACiAKICAgZHByaW50Zl93aW5zb2NrKHN0ZGRlYiwgIldTX1NldEJsb2NraW5nSG9vazE2KCUwOHgpOiBob29rICUwOHhcbiIsIAogCQkJICAodW5zaWduZWQpcHdzaSwgKHVuc2lnbmVkKSBscEJsb2NrRnVuYyk7Ci0gIGlmKCBwd3NpICkgeyAKKyAgaWYoIHB3c2kgKSAKKyAgeyAKICAgICAgIHByZXYgPSAoRkFSUFJPQzE2KXB3c2ktPmJsb2NraW5nX2hvb2s7IAogICAgICAgcHdzaS0+YmxvY2tpbmdfaG9vayA9IChEV09SRClscEJsb2NrRnVuYzsgCiAgICAgICBwd3NpLT5mbGFncyAmPSB+V1NJX0JMT0NLSU5HSE9PSzMyOwpkaWZmIC0tZ2l0IGEvbWlzYy93aW5zb2NrX2Rucy5jIGIvbWlzYy93aW5zb2NrX2Rucy5jCmluZGV4IDgwNDI0ODkuLjE3M2Y2YmIgMTAwNjQ0Ci0tLSBhL21pc2Mvd2luc29ja19kbnMuYworKysgYi9taXNjL3dpbnNvY2tfZG5zLmMKQEAgLTE2Nyw3ICsxNjcsOSBAQAogICAgICAgd3NfYXN5bmNfb3AqCXAgPSBfX2FzeW5jX29wX2xpc3Q7CiAgICAgICBfX2FzeW5jX29wX2xpc3QtPnByZXYgPSBwX2FvcDsKIAotICAgICAgLyogdHJhdmVyc2UgdGhlIGxpc3QgYW5kIHJlYXAgZGVhZCBvcHMgKi8KKyAgICAgIC8qIHRyYXZlcnNlIHRoZSBsaXN0IGFuZCByZXRpcmUgZGVhZCBvcHMgY3JlYXRlZAorICAgICAgICogYnkgdGhlIHNpZ25hbCBoYW5kbGVyIChzZWUgYmVsb3cpLiAqLworCiAgICAgICB3aGlsZSggcCApCiAgICAgICB7CiAJICBpZiggcC0+ZmxhZ3MgJiBXU01TR19ERUFEX0FPUCApCkBAIC0yMTMsNyArMjE1LDcgQEAKICAqIGxpbmtfYXN5bmNfb3AvdW5saW5rX2FzeW5jX29wIGFsbG93IHRvIGluc3RhbGwgZ2VuZXJpYwogICogYXN5bmMgSU8gaGFuZGxlcnMgKHByb3ZpZGVkIHRoYXQgYW9wX2NvbnRyb2wgZnVuY3Rpb24gaXMgZGVmaW5lZCkuCiAgKgotICogTm90ZTogQXN5bmNHZXRYYnlZIGV4cGlsaWNpdGx5IHJhaXNlIGl0LgorICogTm90ZTogcGlwZS1iYXNlZCBoYW5kbGVycyBtdXN0IHJhaXNlIGV4cGxpY2l0IFNJR0lPIHdpdGgga2lsbCgyKS4KICAqLwogCiB2b2lkIFdJTlNPQ0tfc2lnaW8oaW50IHNpZ25hbCkKQEAgLTIzMyw3ICsyMzUsMTEgQEAKICAgICAgIGlmKCBGRF9JU1NFVChwX2FvcC0+ZmRbMF0sICZjaGVja19zZXQpICkKICAgICAgICAgICBpZiggcF9hb3AtPmFvcF9jb250cm9sKHBfYW9wLCBBT1BfSU8pID09IEFPUF9DT05UUk9MX1JFTU9WRSApCiAJICB7Ci0JICAgICAgcF9hb3AtPmZsYWdzID0gV1NNU0dfREVBRF9BT1A7ICAvKiBjYW4ndCBmcmVlIGluc2lkZSB0aGUgc2lnbmFsICovCisJICAgICAvKiBOT1RFOiBtZW1vcnkgbWFuYWdlbWVudCBpcyBzaWduYWwtdW5zYWZlLCB0aGVyZWZvcmUKKwkgICAgICAqIHdlIGNhbiBvbmx5IHNldCBhIGZsYWcgdG8gcmVtb3ZlIHRoaXMgcF9hb3AgbGF0ZXIgb24uCisJICAgICAgKi8KKworCSAgICAgIHBfYW9wLT5mbGFncyA9IFdTTVNHX0RFQURfQU9QOwogCSAgICAgIGNsb3NlKHBfYW9wLT5mZFswXSk7CiAJICAgICAgRkRfQ0xSKHBfYW9wLT5mZFswXSwmX19hc3luY19pb19mZHNldCk7CiAJICAgICAgaWYoIHBfYW9wLT5mZFswXSA9PSBfX2FzeW5jX2lvX21heF9mZCApCmRpZmYgLS1naXQgYS9tc2Rvcy9kcG1pLmMgYi9tc2Rvcy9kcG1pLmMKaW5kZXggYWU3YTg1Mi4uMTg5YTk5YiAxMDA2NDQKLS0tIGEvbXNkb3MvZHBtaS5jCisrKyBiL21zZG9zL2RwbWkuYwpAQCAtMzgxLDggKzM4MSw5IEBACiAgICAgICAgICAgICBicmVhazsKICAgICAgICAgfQogICAgIGNhc2UgMHgwNTAxOiAgLyogQWxsb2NhdGUgbWVtb3J5IGJsb2NrICovCi0gICAgICAgIGlmICghKHB0ciA9IChCWVRFICopSGVhcEFsbG9jKCBTeXN0ZW1IZWFwLCAwLE1BS0VMT05HKCBDWF9yZWcoY29udGV4dCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJYX3JlZyhjb250ZXh0KSApKSkpCisgICAgICAgIGlmICghKHB0ciA9IChCWVRFICopSGVhcEFsbG9jKCBHZXRQcm9jZXNzSGVhcCgpLCAwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTUFLRUxPTkcoIENYX3JlZyhjb250ZXh0KSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCWF9yZWcoY29udGV4dCkgKSkpKQogICAgICAgICB7CiAgICAgICAgICAgICBBWF9yZWcoY29udGV4dCkgPSAweDgwMTI7ICAvKiBsaW5lYXIgbWVtb3J5IG5vdCBhdmFpbGFibGUgKi8KICAgICAgICAgICAgIFNFVF9DRkxBRyhjb250ZXh0KTsKQEAgLTM5NSwxMiArMzk2LDEyIEBACiAgICAgICAgIGJyZWFrOwogCiAgICAgY2FzZSAweDA1MDI6ICAvKiBGcmVlIG1lbW9yeSBibG9jayAqLwotICAgICAgICBIZWFwRnJlZSggU3lzdGVtSGVhcCwgMCwKKyAgICAgICAgSGVhcEZyZWUoIEdldFByb2Nlc3NIZWFwKCksIDAsCiAgICAgICAgICAgICAgICAgICAodm9pZCAqKU1BS0VMT05HKCBESV9yZWcoY29udGV4dCksIFNJX3JlZyhjb250ZXh0KSApICk7CiAgICAgICAgIGJyZWFrOwogCiAgICAgY2FzZSAweDA1MDM6ICAvKiBSZXNpemUgbWVtb3J5IGJsb2NrICovCi0gICAgICAgIGlmICghKHB0ciA9IChCWVRFICopSGVhcFJlQWxsb2MoIFN5c3RlbUhlYXAsIDAsCisgICAgICAgIGlmICghKHB0ciA9IChCWVRFICopSGVhcFJlQWxsb2MoIEdldFByb2Nlc3NIZWFwKCksIDAsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAodm9pZCAqKU1BS0VMT05HKERJX3JlZyhjb250ZXh0KSxTSV9yZWcoY29udGV4dCkpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNQUtFTE9ORyhDWF9yZWcoY29udGV4dCksQlhfcmVnKGNvbnRleHQpKSkpKQogICAgICAgICB7CmRpZmYgLS1naXQgYS9tc2Rvcy9pbnQyMS5jIGIvbXNkb3MvaW50MjEuYwppbmRleCA4YmNiOTUwLi45NGFiNWVkIDEwMDY0NAotLS0gYS9tc2Rvcy9pbnQyMS5jCisrKyBiL21zZG9zL2ludDIxLmMKQEAgLTY3Nyw3ICs2NzcsOCBAQAogICAgIGRyaXZlID0gRE9TX0dFVF9EUklWRSggcEZDQi0+ZHJpdmUgKTsKICAgICByb290ID0gRFJJVkVfR2V0Um9vdCggZHJpdmUgKTsKICAgICBjd2QgID0gRFJJVkVfR2V0VW5peEN3ZCggZHJpdmUgKTsKLSAgICBwRkNCLT51bml4UGF0aCA9IEhlYXBBbGxvYyggU3lzdGVtSGVhcCwgMCwgc3RybGVuKHJvb3QpK3N0cmxlbihjd2QpKzIgKTsKKyAgICBwRkNCLT51bml4UGF0aCA9IEhlYXBBbGxvYyggR2V0UHJvY2Vzc0hlYXAoKSwgMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RybGVuKHJvb3QpK3N0cmxlbihjd2QpKzIgKTsKICAgICBpZiAoIXBGQ0ItPnVuaXhQYXRoKSByZXR1cm4gMDsKICAgICBzdHJjcHkoIHBGQ0ItPnVuaXhQYXRoLCByb290ICk7CiAgICAgc3RyY2F0KCBwRkNCLT51bml4UGF0aCwgIi8iICk7CkBAIC03MTIsNyArNzEzLDcgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBET1NfR0VUX0RSSVZFKCBwRkNCLT5kcml2ZSApLCBhdHRyLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBGQ0ItPmNvdW50LCAmZW50cnkgKSkpCiAgICAgewotICAgICAgICBIZWFwRnJlZSggU3lzdGVtSGVhcCwgMCwgcEZDQi0+dW5peFBhdGggKTsKKyAgICAgICAgSGVhcEZyZWUoIEdldFByb2Nlc3NIZWFwKCksIDAsIHBGQ0ItPnVuaXhQYXRoICk7CiAgICAgICAgIHBGQ0ItPnVuaXhQYXRoID0gTlVMTDsKICAgICAgICAgcmV0dXJuIDA7CiAgICAgfQpAQCAtOTU5LDcgKzk2MCw4IEBACiAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgCiAgICAgY2FzZSAweDMwOiAvKiBHRVQgRE9TIFZFUlNJT04gKi8KLSAgICAgICAgQVhfcmVnKGNvbnRleHQpID0gSElXT1JEKEdldFZlcnNpb24xNigpKTsKKyAgICAgICAgQVhfcmVnKGNvbnRleHQpID0gKEhJV09SRChHZXRWZXJzaW9uMTYoKSkgPj4gOCkgfAorICAgICAgICAgICAgICAgICAgICAgICAgICAoSElXT1JEKEdldFZlcnNpb24xNigpKSA8PCA4KTsKICAgICAgICAgQlhfcmVnKGNvbnRleHQpID0gMHgwMDEyOyAgICAgLyogMHgxMjM0NTYgaXMgV2luZSdzIHNlcmlhbCAjICovCiAgICAgICAgIENYX3JlZyhjb250ZXh0KSA9IDB4MzQ1NjsKICAgICAgICAgYnJlYWs7CkBAIC05OTIsNyArOTk0LDggQEAKIAkJYnJlYWs7CiAJCQkJCiAJICAgICAgY2FzZSAweDA2OiAvKiBHRVQgVFJVRSBWRVJTSU9OIE5VTUJFUiAqLwotCQlCWF9yZWcoY29udGV4dCkgPSBISVdPUkQoR2V0VmVyc2lvbjE2KCkpOworCQlCWF9yZWcoY29udGV4dCkgPSAoSElXT1JEKEdldFZlcnNpb24xNigpID4+IDgpKSB8CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKEhJV09SRChHZXRWZXJzaW9uMTYoKSA8PCA4KSk7CiAJCURYX3JlZyhjb250ZXh0KSA9IDB4MDA7CiAJCWJyZWFrOwogCmRpZmYgLS1naXQgYS9tc2Rvcy92eGQuYyBiL21zZG9zL3Z4ZC5jCmluZGV4IGRjNTFlNzkuLjY0Mzk2N2YgMTAwNjQ0Ci0tLSBhL21zZG9zL3Z4ZC5jCisrKyBiL21zZG9zL3Z4ZC5jCkBAIC0yNCw3ICsyNCw3IEBACiAKIHN0YXRpYyBXT1JEIFZYRF9XaW5WZXJzaW9uKHZvaWQpCiB7Ci0gICAgV09SRCB2ZXJzaW9uID0gR2V0VmVyc2lvbjE2KCk7CisgICAgV09SRCB2ZXJzaW9uID0gTE9XT1JEKEdldFZlcnNpb24xNigpKTsKICAgICByZXR1cm4gKHZlcnNpb24gPj4gOCkgfCAodmVyc2lvbiA8PCA4KTsKIH0KIApkaWZmIC0tZ2l0IGEvbXVsdGltZWRpYS9tbXN5c3RlbS5jIGIvbXVsdGltZWRpYS9tbXN5c3RlbS5jCmluZGV4IDA2Yjk3NDMuLjBiNTZmYjMgMTAwNjQ0Ci0tLSBhL211bHRpbWVkaWEvbW1zeXN0ZW0uYworKysgYi9tdWx0aW1lZGlhL21tc3lzdGVtLmMKQEAgLTEwNiw2ICsxMDYsMzYgQEAKIH0KIAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisqIAkJCQlQbGF5U291bmRBCQlbV0lOTU0uMV0KKyovCitCT09MMzIgV0lOQVBJIFBsYXlTb3VuZDMyQShMUENTVFIgcHN6U291bmQsIEhNT0RVTEUzMiBobW9kLCBEV09SRCBmZHdTb3VuZCkKK3sKKyAgZHByaW50Zl9tbXN5cyhzdGRkZWIsICJQbGF5U291bmRBOiBwc3pTb3VuZD0nJXMnIGhtb2Q9JTA0WCBmZHdTb3VuZD0lMDhsWFxuIiwKKwkJcHN6U291bmQsIGhtb2QsIGZkd1NvdW5kKTsKKyAgaWYoaG1vZCAhPSAwIHx8ICEoZmR3U291bmQgJiBTTkRfRklMRU5BTUUpKSB7CisgICAgZnByaW50ZihzdGRlcnIsICJQbGF5U291bmRBOiBvbmx5IGRpc2sgc291bmQgZmlsZXMgYXJlIHN1cHBvcnRlZFxuIik7CisgICAgcmV0dXJuIEZBTFNFOworICB9IGVsc2UgeworICAgIEJPT0wxNiBiU291bmQ7CisgICAgYlNvdW5kID0gc25kUGxheVNvdW5kKHBzelNvdW5kLCAoVUlOVDE2KSBmZHdTb3VuZCk7CisgICAgcmV0dXJuIChCT09MMzIpIGJTb3VuZDsKKyAgfQorfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyogCQkJCVBsYXlTb3VuZFcJCVtXSU5NTS4xOF0KKyovCitCT09MMzIgV0lOQVBJIFBsYXlTb3VuZDMyVyhMUENXU1RSIHBzelNvdW5kLCBITU9EVUxFMzIgaG1vZCwgRFdPUkQgZmR3U291bmQpCit7CisgIExQU1RSIHBzelNvdW5kQSA9IHhtYWxsb2MoKGxzdHJsZW4zMlcocHN6U291bmQpKzEpKnNpemVvZihXQ0hBUikpOworICBCT09MMzIgYlNvdW5kOworICBsc3RyY3B5V3RvQShwc3pTb3VuZEEsIHBzelNvdW5kKTsKKyAgYlNvdW5kID0gUGxheVNvdW5kMzJBKHBzelNvdW5kQSwgaG1vZCwgZmR3U291bmQpOworICBmcmVlKHBzelNvdW5kQSk7CisgIHJldHVybiBiU291bmQ7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKiAJCQkJc25kUGxheVNvdW5kCQlbTU1TWVNURU0uMl0KICovCiBCT09MMTYgV0lOQVBJIHNuZFBsYXlTb3VuZChMUENTVFIgbHBzelNvdW5kTmFtZSwgVUlOVDE2IHVGbGFncykKQEAgLTIyNzgsMTYgKzIzMDgsMzEgQEAKIH0KIAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qIAkJCQltbWlvSW5zdGFsbElPUHJvYwlbTU1TWVNURU0uMTIyMV0KKyogCQkJCW1taW9JbnN0YWxsSU9Qcm9jMTYJW01NU1lTVEVNLjEyMjFdCiAqLwotTFBNTUlPUFJPQyBXSU5BUEkgbW1pb0luc3RhbGxJT1Byb2MoRk9VUkNDIGZjY0lPUHJvYywgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMUE1NSU9QUk9DIHBJT1Byb2MsIERXT1JEIGR3RmxhZ3MpCitMUE1NSU9QUk9DMTYgV0lOQVBJIG1taW9JbnN0YWxsSU9Qcm9jMTYoRk9VUkNDIGZjY0lPUHJvYywgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFBNTUlPUFJPQzE2IHBJT1Byb2MsIERXT1JEIGR3RmxhZ3MpCiB7CiAJZHByaW50Zl9tbWlvKHN0ZGRlYiwgIm1taW9JbnN0YWxsSU9Qcm9jIC8vIGVtcHR5IHN0dWIgXG4iKTsKIAlyZXR1cm4gMDsKIH0KIAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiAJCQkJbW1pb0luc3RhbGxJT1Byb2MzMkEgICBbV0lOTU0uMTIwXQorICovCitMUE1NSU9QUk9DMzIgV0lOQVBJIG1taW9JbnN0YWxsSU9Qcm9jMzJBKEZPVVJDQyBmY2NJT1Byb2MsIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMUE1NSU9QUk9DMzIgcElPUHJvYywgRFdPUkQgZHdGbGFncykKK3sKKwlkcHJpbnRmX21taW8oc3RkZGViLCAibW1pb0luc3RhbGxJT1Byb2NBICglYyVjJWMlYywlcCwweCUwOGx4KS8vIGVtcHR5IHN0dWIgXG4iLAorICAgICAgICAgICAgICAgICAgICAgKGNoYXIpKChmY2NJT1Byb2MmMHhmZjAwMDAwMCk+PjI0KSwKKyAgICAgICAgICAgICAgICAgICAgIChjaGFyKSgoZmNjSU9Qcm9jJjB4MDBmZjAwMDApPj4xNiksCisgICAgICAgICAgICAgICAgICAgICAoY2hhcikoKGZjY0lPUHJvYyYweDAwMDBmZjAwKT4+IDgpLAorICAgICAgICAgICAgICAgICAgICAgKGNoYXIpKGZjY0lPUHJvYyYweDAwMDAwMGZmKSwKKyAgICAgICAgICAgICAgICAgICAgIHBJT1Byb2MsIGR3RmxhZ3MgKTsKKwlyZXR1cm4gMDsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqIAkJCQltbWlvU2VuZE1lc3NhZ2UJCVtNTVNZU1RFTS4xMjIyXQogKi8KIExSRVNVTFQgV0lOQVBJIG1taW9TZW5kTWVzc2FnZShITU1JTzE2IGhtbWlvLCBVSU5UMTYgdU1lc3NhZ2UsCmRpZmYgLS1naXQgYS9vYmplY3RzL2ZvbnQuYyBiL29iamVjdHMvZm9udC5jCmluZGV4IDk0MTg4MWEuLjU0MDRkMmEgMTAwNjQ0Ci0tLSBhL29iamVjdHMvZm9udC5jCisrKyBiL29iamVjdHMvZm9udC5jCkBAIC04NzIsNyArODcyLDcgQEAKIAogICAgIGlmKCBmaXJzdENoYXIgIT0gbGFzdENoYXIgKQogICAgIHsKLQlMUElOVDMyCWJ1ZjMyID0gKExQSU5UMzIpSGVhcEFsbG9jKFN5c3RlbUhlYXAsIDAsCisJTFBJTlQzMglidWYzMiA9IChMUElOVDMyKUhlYXBBbGxvYyhHZXRQcm9jZXNzSGVhcCgpLCAwLAogCQkJCSBzaXplb2YoSU5UMzIpKigxICsgKGxhc3RDaGFyIC0gZmlyc3RDaGFyKSkpOwogCWlmKCBidWYzMiApCiAJewpAQCAtODg1LDcgKzg4NSw3IEBACiAJCWZvciAoaSA9IGZpcnN0Q2hhcjsgaSA8PSBsYXN0Q2hhcjsgaSsrKQogCQkgICAgKmJ1ZmZlcisrID0gKmJ1ZjMyKys7CiAJICAgIH0KLQkgICAgSGVhcEZyZWUoU3lzdGVtSGVhcCwgMCwgb2J1ZjMyKTsKKwkgICAgSGVhcEZyZWUoR2V0UHJvY2Vzc0hlYXAoKSwgMCwgb2J1ZjMyKTsKIAl9CiAgICAgfQogICAgIGVsc2UgLyogaGFwcGVucyBxdWl0ZSBvZnRlbiB0byB3YXJyYW50IGEgc3BlY2lhbCB0cmVhdG1lbnQgKi8KZGlmZiAtLWdpdCBhL3Byb2dyYW1zL3Byb2dtYW4vTWFrZWZpbGUuaW4gYi9wcm9ncmFtcy9wcm9nbWFuL01ha2VmaWxlLmluCmluZGV4IGE1ZDg2ZjYuLmEwOWY4NmQgMTAwNjQ0Ci0tLSBhL3Byb2dyYW1zL3Byb2dtYW4vTWFrZWZpbGUuaW4KKysrIGIvcHJvZ3JhbXMvcHJvZ21hbi9NYWtlZmlsZS5pbgpAQCAtNiw3ICs2LDcgQEAKIFBST0dSQU1TICA9IHByb2dtYW4KIEFMTF9MSUJTICA9ICQoV0lORUxJQikgJChYX0xJQlMpICQoWFBNX0xJQikgJChYTElCKSAkKExETElCUykKIERFRlMgICAgICA9IC1JJChTUkNESVIpCi1SQ0ZMQUdTICAgPSAtdzMyCitSQ0ZMQUdTICAgPSAtdzMyIC1oCiAKIExBTkdVQUdFUyAgID0gRW4gRGEgRGUgRnIgRmkgS28gSHUgSXQgVmEKIExJQ0VOU0VMQU5HID0gRW4KQEAgLTM3LDE3ICszNywxOSBAQAogCXN0cmluZy5jIFwKIAkkKExJQ0VOU0VMQU5HOiU9TGljZW5zZV8lLmMpCiAKLUdFTl9DX1NSQ1MgPSBcCi0JYWNjZWwuYyBcCi0JJChMQU5HVUFHRVM6JT0lLmMpIFwKK1JDX1NSQ1MgPSBcCisJYWNjZWwucmMgXAorCSQoTEFOR1VBR0VTOiU9JS5yYykKIAogQ19TUkNTID0gJChNT1NUU1JDUykgJChTVFJJTkdTUkNTKQogCiBNT1NUT0JKUyA9ICQoTU9TVFNSQ1M6LmM9Lm8pCi1TVFJJTkdPQkpTID0gJChTVFJJTkdTUkNTOi5jPS5vKSAkKEdFTl9DX1NSQ1M6LmM9Lm8pCitTVFJJTkdPQkpTID0gJChTVFJJTkdTUkNTOi5jPS5vKSAkKFJDX1NSQ1M6LnJjPS5vKQogCiBhbGw6IGNoZWNrX3dpbmVyYyAkKFBST0dSQU1TKQogCitkZXBlbmQ6OiAkKFJDX1NSQ1M6LnJjPS5oKQorCiBATUFLRV9SVUxFU0AKIAogcHJvZ21hbjogJChNT1NUT0JKUykgJChTVFJJTkdPQkpTKQpAQCAtNTYsOSArNTgsNyBAQAogaW5zdGFsbDogZHVtbXkKIAkkKElOU1RBTExfUFJPR1JBTSkgcHJvZ21hbiAkKGJpbmRpcikvcHJvZ21hbgogCi1hY2NlbC5jIGFjY2VsLmg6ICQoV0lORVJDKSBYeC5yYwotCi0kKExBTkdVQUdFUzolPSUuYykgJChMQU5HVUFHRVM6JT0lLmgpOiAkKFdJTkVSQykgWHgucmMKKyQoUkNfU1JDUzoucmM9LmMpICQoUkNfU1JDUzoucmM9LmgpOiAkKFdJTkVSQykKIAogZHVtbXk6CiAKZGlmZiAtLWdpdCBhL3Byb2dyYW1zL3dpbmhlbHAvTWFrZWZpbGUuaW4gYi9wcm9ncmFtcy93aW5oZWxwL01ha2VmaWxlLmluCmluZGV4IDcxN2RmZTEuLjIyYjYwNWEgMTAwNjQ0Ci0tLSBhL3Byb2dyYW1zL3dpbmhlbHAvTWFrZWZpbGUuaW4KKysrIGIvcHJvZ3JhbXMvd2luaGVscC9NYWtlZmlsZS5pbgpAQCAtNSw3ICs1LDcgQEAKIE1PRFVMRSAgICA9IG5vbmUKIFBST0dSQU1TICA9IHdpbmhlbHAgaGxwMnNnbWwKIEFMTF9MSUJTICA9ICQoV0lORUxJQikgJChYX0xJQlMpICQoWFBNX0xJQikgJChYTElCKSAkKExETElCUykKLVJDRkxBR1MgICA9IC13MzIKK1JDRkxBR1MgICA9IC13MzIgLWgKIAogTEFOR1VBR0VTICAgPSBFbiBEYSBEZSBGciBGaSBLbyBIdSBJdCBWYQogCkBAIC0yOCwyMSArMjgsMjIgQEAKIAltYWNyby5jCiAKICMgU29tZSBzdHJpbmdzIG5lZWQgYWRkcmVzc2VzID49IDB4MTAwMDAKLVNUUklOR1NSQ1MgPSBcCi0Jc3RyaW5nLmMKK1NUUklOR1NSQ1MgPSBzdHJpbmcuYwogCi1HRU5fQ19TUkNTID0gXAotCXkudGFiLmMgXAotCWxleC55eS5jIFwKLQkkKExBTkdVQUdFUzolPSUuYykKK0VYVFJBX1NSQ1MgPSBtYWNyby55YWNjLnkgbWFjcm8ubGV4LmwKK0VYVFJBX09CSlMgPSB5LnRhYi5vIGxleC55eS5vCisKK1JDX1NSQ1MgPSAkKExBTkdVQUdFUzolPSUucmMpCiAKIENfU1JDUyA9ICQoTU9TVFNSQ1MpICQoU1RSSU5HU1JDUykKIAogTU9TVE9CSlMgPSAkKE1PU1RTUkNTOi5jPS5vKQotU1RSSU5HT0JKUyA9ICQoU1RSSU5HU1JDUzouYz0ubykgJChHRU5fQ19TUkNTOi5jPS5vKQorU1RSSU5HT0JKUyA9ICQoU1RSSU5HU1JDUzouYz0ubykgJChSQ19TUkNTOi5yYz0ubykKIAogYWxsOiBjaGVja193aW5lcmMgJChQUk9HUkFNUykKIAorZGVwZW5kOjogJChSQ19TUkNTOi5yYz0uaCkgeS50YWIuaAorCiBATUFLRV9SVUxFU0AKIAogIyBTb21lIHN0cmluZ3MgbmVlZCBhZGRyZXNzZXMgPj0gMHgxMDAwMApAQCAtNjIsNyArNjMsNyBAQAogbGV4Lnl5LmM6IG1hY3JvLmxleC5sCiAJJChMRVgpIC04IC1pICQoU1JDRElSKS9tYWNyby5sZXgubAogCi0kKExBTkdVQUdFUzolPSUuYykgJChMQU5HVUFHRVM6JT0lLmgpOiAkKFdJTkVSQykgWHgucmMKKyQoUkNfU1JDUzoucmM9LmMpICQoUkNfU1JDUzoucmM9LmgpOiAkKFdJTkVSQykKIAogZHVtbXk6CiAKZGlmZiAtLWdpdCBhL3JjL01ha2VmaWxlLmluIGIvcmMvTWFrZWZpbGUuaW4KaW5kZXggNTVjNmI5ZS4uMTMzMDZmOCAxMDA2NDQKLS0tIGEvcmMvTWFrZWZpbGUuaW4KKysrIGIvcmMvTWFrZWZpbGUuaW4KQEAgLTcsMTAgKzcsMTMgQEAKIE1PRFVMRSAgICA9IG5vbmUKIAogQ19TUkNTICAgICA9IHdpbmVyYy5jCi1HRU5fQ19TUkNTID0geS50YWIuYyBsZXgueXkuYworRVhUUkFfU1JDUyA9IHBhcnNlci55IHBhcnNlci5sCitFWFRSQV9PQkpTID0geS50YWIubyBsZXgueXkubwogCiBhbGw6ICQoUFJPR1JBTVMpCiAKK2RlcGVuZDo6IHkudGFiLmgKKwogQE1BS0VfUlVMRVNACiAKICQoUFJPR1JBTVMpOiAkKE9CSlMpCmRpZmYgLS1naXQgYS9yYy93aW5lcmMuYyBiL3JjL3dpbmVyYy5jCmluZGV4IDY2ZjdlZmUuLmVhOGFhNjUgMTAwNjQ0Ci0tLSBhL3JjL3dpbmVyYy5jCisrKyBiL3JjL3dpbmVyYy5jCkBAIC0xOSw2ICsxOSw3IEBACiAJIiAgIC1iICAgICAgICAgICAgQ3JlYXRlIGEgQyBhcnJheSBmcm9tIGEgYmluYXJ5IC5yZXMgZmlsZVxuIgogICAgICAgICAiICAgLWMgICAgICAgICAgICBBZGQgJ2NvbnN0JyBwcmVmaXggdG8gQyBjb25zdGFudHNcbiIKIAkiICAgLWQgICAgICAgICAgICBPdXRwdXQgZGVidWdnaW5nIGluZm9ybWF0aW9uXG4iCisgICAgICAgICIgICAtaCAgICAgICAgICAgIEFsc28gZ2VuZXJhdGUgYSAuaCBmaWxlXG4iCiAJIiAgIC1wIHByZWZpeCAgICAgR2l2ZSBhIHByZWZpeCBmb3IgdGhlIGdlbmVyYXRlZCBuYW1lc1xuIgogCSIgICAtdiAgICAgICAgICAgIFNob3cgZWFjaCByZXNvdXJjZSBhcyBpdCBpcyBwcm9jZXNzZWRcbiIKIAkiICAgLW8gZmlsZSAgICAgICBPdXRwdXQgdG8gZmlsZS5jIGFuZCBmaWxlLmhcbiIKQEAgLTI5LDggKzMwLDcgQEAKIGludCB3aW4zMj0xOwogaW50IHZlcmJvc2UsY29uc3RhbnQ7CiBnZW5fcmVzKiBnX3N0YXJ0OwotRklMRSAqaGVhZGVyLCpjb2RlOwotY2hhciBobmFtZVsyNTZdLHNuYW1lWzI1Nl07CitzdGF0aWMgRklMRSAqaGVhZGVyID0gTlVMTCwgKmNvZGUgPSBOVUxMOwogCiBpbnQgdHJhbnNmb3JtX2JpbmFyeV9maWxlKHZvaWQpOwogaW50IHl5cGFyc2Uodm9pZCk7CkBAIC01Myw5ICs1MywxMCBAQAogeyAgCiAJZXh0ZXJuIGludCB5eWRlYnVnOwogCWV4dGVybiBjaGFyKiBvcHRhcmc7Ci0JaW50IG9wdGMsbG9zZSxyZXQsYmluYXJ5OwotCWxvc2U9YmluYXJ5PTA7Ci0Jd2hpbGUoKG9wdGM9Z2V0b3B0KGFyZ2MsYXJndiwiYmNkcDp2bzp3OiIpKSE9RU9GKQorCWludCBvcHRjLGxvc2UgPSAwLCByZXQsIGJpbmFyeSA9IDAsIG91dHB1dF9oZWFkZXIgPSAwOworICAgICAgICBjaGFyIG91dHB1dF9uYW1lWzI1Nl07CisKKwl3aGlsZSgob3B0Yz1nZXRvcHQoYXJnYyxhcmd2LCJiY2RocDp2bzp3OiIpKSE9RU9GKQogCQlzd2l0Y2gob3B0YykKIAkJewogCQkJLyogYmlzb24gd2lsbCBwcmludCBzdGF0ZSB0cmFuc2l0aW9ucyBvbiBzdGRlcnIgKi8KQEAgLTY1LDEyICs2NiwxMyBAQAogCQkJCQkgc2V0YnVmKHN0ZG91dCwwKTsKIAkJCQkJIHNldGJ1ZihzdGRlcnIsMCk7CiAJCQkJCWJyZWFrOworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAnaCc6b3V0cHV0X2hlYWRlcj0xOyBicmVhazsKIAkJCWNhc2UgJ3AnOnByZWZpeD1zdHJkdXAob3B0YXJnKTsgYnJlYWs7CiAJCQljYXNlICdjJzpjb25zdGFudD0xO2JyZWFrOwogCQkJY2FzZSAndic6dmVyYm9zZT0xOwogCQkJCQkgc2V0YnVmKHN0ZGVyciwwKTsKIAkJCQkJYnJlYWs7Ci0JCQljYXNlICdvJzpzZXRfb3V0X2ZpbGUob3B0YXJnKTticmVhazsKKwkJCWNhc2UgJ28nOnNwcmludGYob3V0cHV0X25hbWUsIiVzLmMiLG9wdGFyZyk7IGJyZWFrOwogCQkJY2FzZSAndyc6aWYoIXN0cmNtcChvcHRhcmcsIjE2Iikpd2luMzI9MDsKIAkJCQkgZWxzZSBpZighc3RyY21wKG9wdGFyZywiMzIiKSl3aW4zMj0xOwogCQkJCSBlbHNlIGxvc2UrKzsKQEAgLTc4LDI5ICs4MCwzMCBAQAogCQkJZGVmYXVsdDogbG9zZSsrO2JyZWFrOwogCQl9CiAJaWYobG9zZSlyZXR1cm4gZnByaW50ZihzdGRlcnIsdXNhZ2UpLDE7Ci0JaWYoIWhlYWRlciloZWFkZXI9c3Rkb3V0OwotCWlmKCFjb2RlKWNvZGU9c3Rkb3V0OworCisgICAgICAgIGlmIChvdXRwdXRfbmFtZVswXSkKKyAgICAgICAgeworICAgICAgICAgICAgY29kZSA9IGZvcGVuKCBvdXRwdXRfbmFtZSwgInciICk7CisgICAgICAgICAgICBpZiAob3V0cHV0X2hlYWRlcikKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBvdXRwdXRfbmFtZVtzdHJsZW4ob3V0cHV0X25hbWUpLTFdID0gJ2gnOworICAgICAgICAgICAgICAgIGhlYWRlciA9IGZvcGVuKCBvdXRwdXRfbmFtZSwgInciICk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgaWYgKCFjb2RlKSBjb2RlID0gc3Rkb3V0OwogCWlmKGJpbmFyeSkKIAkJcmV0PXRyYW5zZm9ybV9iaW5hcnlfZmlsZSgpOwogCWVsc2UKIAkJcmV0PXl5cGFyc2UoKTsKLQlmY2xvc2UoaGVhZGVyKTsKKwlpZiAoaGVhZGVyKSBmY2xvc2UoaGVhZGVyKTsKIAlmY2xvc2UoY29kZSk7CiAJcmV0dXJuIHJldDsKIH0KIAotdm9pZCBzZXRfb3V0X2ZpbGUoY2hhciAqcHJlZml4KQotewotCXNwcmludGYoc25hbWUsIiVzLmMiLHByZWZpeCk7Ci0JY29kZT1mb3BlbihzbmFtZSwidyIpOwotCXNwcmludGYoaG5hbWUsIiVzLmgiLHByZWZpeCk7Ci0JaGVhZGVyPWZvcGVuKGhuYW1lLCJ3Iik7Ci19Ci0KIGludCB0cmFuc2Zvcm1fYmluYXJ5X2ZpbGUoKQogewogCWludCBpLGM7Ci0JZnByaW50ZihoZWFkZXIsIiNkZWZpbmUgQVBQTElDQVRJT05fSEFTX1JFU09VUkNFUyAxXG4iKTsKKwlpZiAoaGVhZGVyKSBmcHJpbnRmKGhlYWRlciwiI2RlZmluZSBBUFBMSUNBVElPTl9IQVNfUkVTT1VSQ0VTIDFcbiIpOwogCWZwcmludGYoY29kZSwiY2hhciBfQXBwbGljYXRpb25fcmVzb3VyY2VzW109eyIpOwogCWZvcihpPTA7O2krKykKIAl7CkBAIC03NjcsMjUgKzc3MCw0MCBAQAogCiAgICAgdG9wPWFkZF9zdHJpbmdfdGFibGUodG9wKTsKIAotICAgIGZwcmludGYoIGhlYWRlciwgIi8qICVzXG4iCi0gICAgICAgICAgICAgICAgICAgICAiICogVGhpcyBmaWxlIGlzIGF1dG9tYXRpY2FsbHkgZ2VuZXJhdGVkLiBEbyBub3QgZWRpdCFcbiIKLSAgICAgICAgICAgICAgICAgICAgICIgKi9cblxuIgotICAgICAgICAgICAgICAgICAgICAgIiNpbmNsdWRlIFwicmVzb3VyY2UuaFwiXG4iLCBobmFtZSApOworICAgIC8qIEdlbmVyYXRlIHRoZSBoZWFkZXIgKi8KIAotICAgIC8qIERlY2xhcmUgdGhlIHJlc291cmNlcyAqLworICAgIGlmIChoZWFkZXIpCisgICAgeworICAgICAgICBmcHJpbnRmKCBoZWFkZXIsCisgICAgICAgICAgICAgICAgICIvKlxuIgorICAgICAgICAgICAgICAgICAiICogVGhpcyBmaWxlIGlzIGF1dG9tYXRpY2FsbHkgZ2VuZXJhdGVkLiBEbyBub3QgZWRpdCFcbiIKKyAgICAgICAgICAgICAgICAgIiAqL1xuXG4iCisgICAgICAgICAgICAgICAgICIjaWZuZGVmIF9fJXNfSFxuIgorICAgICAgICAgICAgICAgICAiI2RlZmluZSBfXyVzX0hcblxuIgorICAgICAgICAgICAgICAgICAic3RydWN0IHJlc291cmNlO1xuXG4iLAorICAgICAgICAgICAgICAgICBwcmVmaXgsIHByZWZpeCApOwogCi0gICAgZm9yIChpdD10b3A7aXQ7aXQ9aXQtPm5leHQpCi0gICAgICAgIGZwcmludGYoIGhlYWRlciwiZXh0ZXJuICVzc3RydWN0IHJlc291cmNlICVzO1xuIiwKLSAgICAgICAgICAgICAgICAgSVNDT05TVEFOVCwgZ2V0X3Jlc291cmNlX25hbWUoaXQpICk7Ci0gICAgZnByaW50ZiggaGVhZGVyLCJcbmV4dGVybiAlc3N0cnVjdCByZXNvdXJjZSAqICVzJXNfVGFibGVbXTtcbiIsCi0gICAgICAgICAgICAgSVNDT05TVEFOVCwgSVNDT05TVEFOVCwgcHJlZml4ICk7CisgICAgICAgIC8qIERlY2xhcmUgdGhlIHJlc291cmNlcyAqLworICAgICAgICBmb3IgKGl0PXRvcDtpdDtpdD1pdC0+bmV4dCkKKyAgICAgICAgICAgIGZwcmludGYoIGhlYWRlciwiZXh0ZXJuICVzc3RydWN0IHJlc291cmNlICVzO1xuIiwKKyAgICAgICAgICAgICAgICAgICAgIElTQ09OU1RBTlQsIGdldF9yZXNvdXJjZV9uYW1lKGl0KSApOworICAgICAgICBmcHJpbnRmKCBoZWFkZXIsIlxuZXh0ZXJuICVzc3RydWN0IHJlc291cmNlICogJXMlc19UYWJsZVtdO1xuXG4iLAorICAgICAgICAgICAgICAgICBJU0NPTlNUQU5ULCBJU0NPTlNUQU5ULCBwcmVmaXggKTsKKyAgICAgICAgZnByaW50ZiggaGVhZGVyLCAiI2VuZGlmICAvKiBfXyVzX0ggKi9cbiIsIHByZWZpeCApOworICAgIH0KIAogICAgIC8qIFByaW50IHRoZSByZXNvdXJjZXMgYnl0ZXMgKi8KIAotICAgIGZwcmludGYoIGNvZGUsICIvKiAlc1xuIgorICAgIGZwcmludGYoIGNvZGUsICIvKlxuIgogICAgICAgICAgICAgICAgICAgICIgKiBUaGlzIGZpbGUgaXMgYXV0b21hdGljYWxseSBnZW5lcmF0ZWQuIERvIG5vdCBlZGl0IVxuIgogICAgICAgICAgICAgICAgICAgICIgKi9cblxuIgotICAgICAgICAgICAgICAgICAgICIjaW5jbHVkZSBcIiVzXCJcbiIsIHNuYW1lLCBobmFtZSApOworICAgICAgICAgICAgICAgICAgICJzdHJ1Y3QgcmVzb3VyY2Uge1xuIgorICAgICAgICAgICAgICAgICAgICJcdGludCBpZDtcbiIKKyAgICAgICAgICAgICAgICAgICAiXHRpbnQgdHlwZTtcbiIKKyAgICAgICAgICAgICAgICAgICAiXHRjb25zdCBjaGFyICpuYW1lO1xuIgorICAgICAgICAgICAgICAgICAgICJcdGNvbnN0IHVuc2lnbmVkIGNoYXIqIGJ5dGVzO1xuIgorICAgICAgICAgICAgICAgICAgICJcdHVuc2lnbmVkIHNpemU7XG4iCisgICAgICAgICAgICAgICAgICAgIn07XG5cbiIgKTsKIAogICAgIGZvcihpdD10b3A7aXQ7aXQ9aXQtPm5leHQpCiAgICAgewpAQCAtODY3LDIzICs4ODUsMjQgQEAKIAkgICAgSVNDT05TVEFOVCwgSVNDT05TVEFOVCwgcHJlZml4KTsKICAgICBmb3IgKGl0PXRvcDtpdDtpdD1pdC0+bmV4dCkKICAgICAgICAgZnByaW50ZiggY29kZSwgIiAgJiVzLFxuIiwgZ2V0X3Jlc291cmNlX25hbWUoaXQpICk7Ci0gICAgZnByaW50ZiggY29kZSwgIiAgMFxufTtcbiIgKTsKKyAgICBmcHJpbnRmKCBjb2RlLCAiICAwXG59O1xuXG5cbiIgKTsKIAotICAgICAgICAvKiBQZXJmb3JtIGF1dG9yZWdpc3RyYXRpb24gKi8KLSAgICAgICAgZnByaW50ZiggY29kZSwgCi0gICAgICAgICAgICAgICAgIiNpZmRlZiBXSU5FTElCXG4iCi0gICAgICAgICAgICAgICAgInN0YXRpYyB2b2lkIERvSXQoKSBXSU5FX0NPTlNUUlVDVE9SO1xuIgotICAgICAgICAgICAgICAgICJzdGF0aWMgdm9pZCBEb0l0KClcbiIKLSAgICAgICAgICAgICAgICAie1xuIgotICAgICAgICAgICAgICAgICJcdExJQlJFU19SZWdpc3RlclJlc291cmNlcyglc19UYWJsZSk7XG4iCi0gICAgICAgICAgICAgICAgIn1cblxuIgotICAgICAgICAgICAgICAgICIjaWZuZGVmIEhBVkVfV0lORV9DT05TVFJVQ1RPUlxuIgotICAgICAgICAgICAgICAgICJ2b2lkIExJQldJTkVfUmVnaXN0ZXJfJXMoKXtcbiIKLSAgICAgICAgICAgICAgICAiXHREb0l0KCk7XG4iCi0gICAgICAgICAgICAgICAgIn1cbiIKLSAgICAgICAgICAgICAgICAiI2VuZGlmXG4iCi0gICAgICAgICAgICAgICAgIiNlbmRpZiAvKldJTkVMSUIqL1xuIgotICAgICAgICAgICAgICAgICxwcmVmaXgscHJlZml4KTsKKyAgICAvKiBQZXJmb3JtIGF1dG9yZWdpc3RyYXRpb24gKi8KKyAgICBmcHJpbnRmKCBjb2RlLCAKKyAgICAgICAgICAgICAiI2lmbmRlZiBfX1dJTkVfX1xuIgorICAgICAgICAgICAgICIjaWYgZGVmaW5lZChfX0dOVUNfXykgJiYgKF9fR05VQ19fID09IDIpICYmIChfX0dOVUNfTUlOT1JfXyA+PSA3KVxuIgorICAgICAgICAgICAgICJzdGF0aWMgdm9pZCBEb0l0KHZvaWQpIF9fYXR0cmlidXRlX18oKGNvbnN0cnVjdG9yKSk7XG4iCisgICAgICAgICAgICAgIiNlbHNlXG4iCisgICAgICAgICAgICAgInN0YXRpYyB2b2lkIERvSXQodm9pZCk7XG4iCisgICAgICAgICAgICAgInZvaWQgTElCV0lORV9SZWdpc3Rlcl8lcyh2b2lkKSB7IERvSXQoKTsgfVxuIgorICAgICAgICAgICAgICIjZW5kaWZcbiIKKyAgICAgICAgICAgICAic3RhdGljIHZvaWQgRG9JdCh2b2lkKVxuIgorICAgICAgICAgICAgICJ7XG4iCisgICAgICAgICAgICAgIlx0ZXh0ZXJuIHZvaWQgTElCUkVTX1JlZ2lzdGVyUmVzb3VyY2VzKGNvbnN0IHN0cnVjdCByZXNvdXJjZSogY29uc3QgKiBSZXMpO1xuIgorICAgICAgICAgICAgICJcdExJQlJFU19SZWdpc3RlclJlc291cmNlcyglc19UYWJsZSk7XG4iCisgICAgICAgICAgICAgIn1cblxuIgorICAgICAgICAgICAgICIjZW5kaWYgLyogX19XSU5FX18gKi9cbiIKKyAgICAgICAgICAgICAscHJlZml4LHByZWZpeCk7CiB9CiAKIGdlbl9yZXMqIG1ha2VfZm9udChnZW5fcmVzKiByZXMpCmRpZmYgLS1naXQgYS9yZXNvdXJjZXMvTWFrZWZpbGUuaW4gYi9yZXNvdXJjZXMvTWFrZWZpbGUuaW4KaW5kZXggMWQzNzU1Yy4uNDMwMTJlNSAxMDA2NDQKLS0tIGEvcmVzb3VyY2VzL01ha2VmaWxlLmluCisrKyBiL3Jlc291cmNlcy9NYWtlZmlsZS5pbgpAQCAtNiwyOSArNiwyOCBAQAogTU9EVUxFICAgID0gcmVzb3VyY2VzCiBSQ0ZMQUdTICAgPSAtdzMyCiAKLVNZU1JFU19TUkNTID0gXAotCXN5c3Jlc19Dei5jIFwKLQlzeXNyZXNfRGEuYyBcCi0Jc3lzcmVzX0RlLmMgXAotCXN5c3Jlc19Fbi5jIFwKLQlzeXNyZXNfRW8uYyBcCi0Jc3lzcmVzX0VzLmMgXAotCXN5c3Jlc19GaS5jIFwKLQlzeXNyZXNfRnIuYyBcCi0Jc3lzcmVzX0h1LmMgXAotCXN5c3Jlc19JdC5jIFwKLQlzeXNyZXNfS28uYyBcCi0Jc3lzcmVzX05vLmMgXAotCXN5c3Jlc19QbC5jIFwKLQlzeXNyZXNfUG8uYworUkNfU1JDUyA9IFwKKwlzeXNyZXNfQ3oucmMgXAorCXN5c3Jlc19EYS5yYyBcCisJc3lzcmVzX0RlLnJjIFwKKwlzeXNyZXNfRW4ucmMgXAorCXN5c3Jlc19Fby5yYyBcCisJc3lzcmVzX0VzLnJjIFwKKwlzeXNyZXNfRmkucmMgXAorCXN5c3Jlc19Gci5yYyBcCisJc3lzcmVzX0h1LnJjIFwKKwlzeXNyZXNfSXQucmMgXAorCXN5c3Jlc19Lby5yYyBcCisJc3lzcmVzX05vLnJjIFwKKwlzeXNyZXNfUGwucmMgXAorCXN5c3Jlc19Qby5yYwogCiBDX1NSQ1MgPSBzeXNyZXMuYwotR0VOX0NfU1JDUyA9ICQoU1lTUkVTX1NSQ1MpCiAKIGFsbDogY2hlY2tfd2luZXJjICQoTU9EVUxFKS5vCiAKIEBNQUtFX1JVTEVTQAogCi0kKFNZU1JFU19TUkNTKTogJChXSU5FUkMpCiskKFJDX1NSQ1M6LnJjPS5jKTogJChXSU5FUkMpCiAKICMjIyBEZXBlbmRlbmNpZXM6CmRpZmYgLS1naXQgYS9yZXNvdXJjZXMvc3lzcmVzLmMgYi9yZXNvdXJjZXMvc3lzcmVzLmMKaW5kZXggMzZhMGFkOC4uOTNlMTA1NyAxMDA2NDQKLS0tIGEvcmVzb3VyY2VzL3N5c3Jlcy5jCisrKyBiL3Jlc291cmNlcy9zeXNyZXMuYwpAQCAtOSwyMCArOSwyMCBAQAogI2luY2x1ZGUgIm9wdGlvbnMuaCIKICNpbmNsdWRlICJyZXNvdXJjZS5oIgogCi0jaW5jbHVkZSAic3lzcmVzX0VuLmgiCi0jaW5jbHVkZSAic3lzcmVzX0VzLmgiCi0jaW5jbHVkZSAic3lzcmVzX0RlLmgiCi0jaW5jbHVkZSAic3lzcmVzX05vLmgiCi0jaW5jbHVkZSAic3lzcmVzX0ZyLmgiCi0jaW5jbHVkZSAic3lzcmVzX0ZpLmgiCi0jaW5jbHVkZSAic3lzcmVzX0RhLmgiCi0jaW5jbHVkZSAic3lzcmVzX0N6LmgiCi0jaW5jbHVkZSAic3lzcmVzX0VvLmgiCi0jaW5jbHVkZSAic3lzcmVzX0l0LmgiCi0jaW5jbHVkZSAic3lzcmVzX0tvLmgiCi0jaW5jbHVkZSAic3lzcmVzX0h1LmgiCi0jaW5jbHVkZSAic3lzcmVzX1BsLmgiCi0jaW5jbHVkZSAic3lzcmVzX1BvLmgiCitleHRlcm4gY29uc3Qgc3RydWN0IHJlc291cmNlICogY29uc3Qgc3lzcmVzX0VuX1RhYmxlW107CitleHRlcm4gY29uc3Qgc3RydWN0IHJlc291cmNlICogY29uc3Qgc3lzcmVzX0VzX1RhYmxlW107CitleHRlcm4gY29uc3Qgc3RydWN0IHJlc291cmNlICogY29uc3Qgc3lzcmVzX0RlX1RhYmxlW107CitleHRlcm4gY29uc3Qgc3RydWN0IHJlc291cmNlICogY29uc3Qgc3lzcmVzX05vX1RhYmxlW107CitleHRlcm4gY29uc3Qgc3RydWN0IHJlc291cmNlICogY29uc3Qgc3lzcmVzX0ZyX1RhYmxlW107CitleHRlcm4gY29uc3Qgc3RydWN0IHJlc291cmNlICogY29uc3Qgc3lzcmVzX0ZpX1RhYmxlW107CitleHRlcm4gY29uc3Qgc3RydWN0IHJlc291cmNlICogY29uc3Qgc3lzcmVzX0RhX1RhYmxlW107CitleHRlcm4gY29uc3Qgc3RydWN0IHJlc291cmNlICogY29uc3Qgc3lzcmVzX0N6X1RhYmxlW107CitleHRlcm4gY29uc3Qgc3RydWN0IHJlc291cmNlICogY29uc3Qgc3lzcmVzX0VvX1RhYmxlW107CitleHRlcm4gY29uc3Qgc3RydWN0IHJlc291cmNlICogY29uc3Qgc3lzcmVzX0l0X1RhYmxlW107CitleHRlcm4gY29uc3Qgc3RydWN0IHJlc291cmNlICogY29uc3Qgc3lzcmVzX0tvX1RhYmxlW107CitleHRlcm4gY29uc3Qgc3RydWN0IHJlc291cmNlICogY29uc3Qgc3lzcmVzX0h1X1RhYmxlW107CitleHRlcm4gY29uc3Qgc3RydWN0IHJlc291cmNlICogY29uc3Qgc3lzcmVzX1BsX1RhYmxlW107CitleHRlcm4gY29uc3Qgc3RydWN0IHJlc291cmNlICogY29uc3Qgc3lzcmVzX1BvX1RhYmxlW107CiAKIHN0YXRpYyBjb25zdCBzdHJ1Y3QgcmVzb3VyY2UgKiBjb25zdCAqIFNZU1JFU19SZXNvdXJjZXNbXSA9CiB7CmRpZmYgLS1naXQgYS9zY2hlZHVsZXIvdGhyZWFkLmMgYi9zY2hlZHVsZXIvdGhyZWFkLmMKaW5kZXggYzM1MGFlZS4uOTkwZWI3NiAxMDA2NDQKLS0tIGEvc2NoZWR1bGVyL3RocmVhZC5jCisrKyBiL3NjaGVkdWxlci90aHJlYWQuYwpAQCAtNDA2LDMgKzQwNiwxMSBAQAogICAgIHJldHVybiBUUlVFOwogfQogCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogICAgICAgICAgIFN1c3BlbmRUaHJlYWQgICAoS0VSTkVMMzIpCisgKi8KK0JPT0wzMiBXSU5BUEkgU3VzcGVuZFRocmVhZChEV09SRCB0aHJlYWRpZCkKK3sKKyAgICBmcHJpbnRmKHN0ZG5pbXAsIlN1c3BlbmRUaHJlYWQoMHglMDhseCksIFNUVUIhXG4iLHRocmVhZGlkKTsKKyAgICByZXR1cm4gVFJVRTsKK30KZGlmZiAtLWdpdCBhL3Rvb2xzL2J1aWxkLmMgYi90b29scy9idWlsZC5jCmluZGV4IDE4MDMyNzIuLjRkYzc5NjIgMTAwNjQ0Ci0tLSBhL3Rvb2xzL2J1aWxkLmMKKysrIGIvdG9vbHMvYnVpbGQuYwpAQCAtMTYsNiArMTYsNyBAQAogI2luY2x1ZGUgIm1vZHVsZS5oIgogI2luY2x1ZGUgIm5lZXhlLmgiCiAjaW5jbHVkZSAic2VsZWN0b3JzLmgiCisjaW5jbHVkZSAic3RhY2tmcmFtZS5oIgogCiAjaWZkZWYgTkVFRF9VTkRFUlNDT1JFX1BSRUZJWAogIyBkZWZpbmUgUFJFRklYICJfIgpAQCAtMTQ4LDggKzE0OSwxMSBAQAogCiBzdGF0aWMgaW50IGRlYnVnZ2luZyA9IDE7CiAKKyAgLyogT2Zmc2V0IG9mIGEgc3RydWN0dXJlIGZpZWxkIHJlbGF0aXZlIHRvIHRoZSBzdGFydCBvZiB0aGUgc3RydWN0ICovCisjZGVmaW5lIFNUUlVDVE9GRlNFVCh0eXBlLGZpZWxkKSAoKGludCkmKCh0eXBlICopMCktPmZpZWxkKQorCiAgIC8qIE9mZnNldCBvZiByZWdpc3RlciByZWxhdGl2ZSB0byB0aGUgc3RhcnQgb2YgdGhlIENPTlRFWFQgc3RydWN0ICovCi0jZGVmaW5lIENPTlRFWFRPRkZTRVQocmVnKSAoKGludCkmKChDT05URVhUICopMCktPnJlZykKKyNkZWZpbmUgQ09OVEVYVE9GRlNFVChyZWcpICBTVFJVQ1RPRkZTRVQoQ09OVEVYVCxyZWcpCiAKIHN0YXRpYyB2b2lkICp4bWFsbG9jIChzaXplX3Qgc2l6ZSkKIHsKQEAgLTE0MTQsNyArMTQxOCwxMCBAQAogICogZnVuY3Rpb25zIHRoYXQgbmVlZCBhIGxhcmdlIHN0YWNrLCBsaWtlIFggYml0bWFwcyBmdW5jdGlvbnMuCiAgKgogICogVGhlIGdlbmVyYXRlZCBmdW5jdGlvbiBoYXMgdGhlIGZvbGxvd2luZyBwcm90b3R5cGU6Ci0gKiAgIGludCBDQUxMVE8zMl9MYXJnZVN0YWNrKCBpbnQgKCpmdW5jKSgpLCB2b2lkICphcmcgKTsKKyAqICAgaW50IHh4eCggaW50ICgqZnVuYykoKSwgdm9pZCAqYXJnICk7CisgKgorICogVGhlIHBvaW50ZXIgdG8gdGhlIGZ1bmN0aW9uIGNhbiBiZSByZXRyaWV2ZWQgYnkgY2FsbGluZyBDQUxMMzJfSW5pdCwKKyAqIHdoaWNoIGFsc28gdGFrZXMgY2FyZSBvZiBzYXZpbmcgdGhlIGN1cnJlbnQgMzItYml0IHN0YWNrIHBvaW50ZXIuCiAgKgogICogU3RhY2sgbGF5b3V0OgogICogICAuLi4gICAgIC4uLgpAQCAtMTQyNSwyNyArMTQzMiwzNSBAQAogICovCiBzdGF0aWMgdm9pZCBCdWlsZENhbGwzMkxhcmdlU3RhY2soIEZJTEUgKm91dGZpbGUgKQogeworICAgIC8qIEluaXRpYWxpemF0aW9uIGZ1bmN0aW9uICovCisKKyAgICBmcHJpbnRmKCBvdXRmaWxlLCAiXG5cdC5hbGlnbiA0XG4iICk7CisjaWZkZWYgVVNFX1NUQUJTCisgICAgZnByaW50Ziggb3V0ZmlsZSwgIi5zdGFicyBcIkNBTEwzMl9Jbml0OkYxXCIsMzYsMCwwLCIgUFJFRklYICJDQUxMMzJfSW5pdFxuIik7CisjZW5kaWYKKyAgICBmcHJpbnRmKCBvdXRmaWxlLCAiXHQuZ2xvYmwgIiBQUkVGSVggIkNBTEwzMl9Jbml0XG4iICk7CisgICAgZnByaW50Ziggb3V0ZmlsZSwgUFJFRklYICJDQUxMMzJfSW5pdDpcbiIgKTsKKyAgICBmcHJpbnRmKCBvdXRmaWxlLCAiXHRsZWFsIC0yNTYoJSVlc3ApLCUlZWF4XG4iICk7CisgICAgZnByaW50Ziggb3V0ZmlsZSwgIlx0bW92bCAlJWVheCxDQUxMMzJfT3JpZ2luYWwzMl9lc3BcbiIgKTsKKyAgICBmcHJpbnRmKCBvdXRmaWxlLCAiXHRtb3ZsICRDQUxMMzJfTGFyZ2VTdGFjaywlJWVheFxuIiApOworICAgIGZwcmludGYoIG91dGZpbGUsICJcdHJldFxuIiApOworCiAgICAgLyogRnVuY3Rpb24gaGVhZGVyICovCiAKICAgICBmcHJpbnRmKCBvdXRmaWxlLCAiXG5cdC5hbGlnbiA0XG4iICk7CiAjaWZkZWYgVVNFX1NUQUJTCi0gICAgZnByaW50Ziggb3V0ZmlsZSwgIi5zdGFicyBcIkNBTExUTzMyX0xhcmdlU3RhY2s6RjFcIiwzNiwwLDAsIiBQUkVGSVggIkNBTExUTzMyX0xhcmdlU3RhY2tcbiIpOworICAgIGZwcmludGYoIG91dGZpbGUsICIuc3RhYnMgXCJDQUxMMzJfTGFyZ2VTdGFjazpGMVwiLDM2LDAsMCxDQUxMMzJfTGFyZ2VTdGFja1xuIik7CiAjZW5kaWYKLSAgICBmcHJpbnRmKCBvdXRmaWxlLCAiXHQuZ2xvYmwgIiBQUkVGSVggIkNBTExUTzMyX0xhcmdlU3RhY2tcbiIgKTsKLSAgICBmcHJpbnRmKCBvdXRmaWxlLCBQUkVGSVggIkNBTExUTzMyX0xhcmdlU3RhY2s6XG4iICk7CisgICAgZnByaW50Ziggb3V0ZmlsZSwgIkNBTEwzMl9MYXJnZVN0YWNrOlxuIiApOwogICAgIAogICAgIC8qIEVudHJ5IGNvZGUgKi8KIAogICAgIGZwcmludGYoIG91dGZpbGUsICJcdHB1c2hsICUlZWJwXG4iICk7CiAgICAgZnByaW50Ziggb3V0ZmlsZSwgIlx0bW92bCAlJWVzcCwlJWVicFxuIiApOwogCi0gICAgLyogUmV0cmlldmUgdGhlIG9yaWdpbmFsIDMyLWJpdCBzdGFjayBwb2ludGVyIGFuZCBzd2l0Y2ggdG8gaXQgaWYgYW55ICovCisgICAgLyogU3dpdGNoIHRvIHRoZSBvcmlnaW5hbCAzMi1iaXQgc3RhY2sgcG9pbnRlciAqLwogCi0gICAgZnByaW50Ziggb3V0ZmlsZSwgIlx0bW92bCAiIFBSRUZJWCAiSUYxNjMyX09yaWdpbmFsMzJfZXNwLCAlJWVheFxuIiApOwotICAgIGZwcmludGYoIG91dGZpbGUsICJcdG9ybCAlJWVheCwlJWVheFxuIiApOwotICAgIGZwcmludGYoIG91dGZpbGUsICJcdGplIG5vX29yaWdfZXNwXG4iICk7Ci0gICAgZnByaW50Ziggb3V0ZmlsZSwgIlx0bW92bCAlJWVheCwlJWVzcFxuIiApOwotICAgIGZwcmludGYoIG91dGZpbGUsICJub19vcmlnX2VzcDpcbiIgKTsKKyAgICBmcHJpbnRmKCBvdXRmaWxlLCAiXHRtb3ZsIENBTEwzMl9PcmlnaW5hbDMyX2VzcCwgJSVlc3BcbiIgKTsKIAogICAgIC8qIFRyYW5zZmVyIHRoZSBhcmd1bWVudCBhbmQgY2FsbCB0aGUgZnVuY3Rpb24gKi8KIApAQCAtMTQ1Nyw2ICsxNDcyLDEyIEBACiAgICAgZnByaW50Ziggb3V0ZmlsZSwgIlx0bW92bCAlJWVicCwlJWVzcFxuIiApOwogICAgIGZwcmludGYoIG91dGZpbGUsICJcdHBvcGwgJSVlYnBcbiIgKTsKICAgICBmcHJpbnRmKCBvdXRmaWxlLCAiXHRyZXRcbiIgKTsKKworICAgIC8qIERhdGEgKi8KKworICAgIGZwcmludGYoIG91dGZpbGUsICJcdC5kYXRhXG4iICk7CisgICAgZnByaW50Ziggb3V0ZmlsZSwgIkNBTEwzMl9PcmlnaW5hbDMyX2VzcDpcdC5sb25nIDBcbiIgKTsKKyAgICBmcHJpbnRmKCBvdXRmaWxlLCAiXHQudGV4dFxuIiApOwogfQogCiAKQEAgLTE0ODIsNyArMTUwMyw3IEBACiAKICAgICAvKiBHZXQgdGhlIDMyLWJpdCBzdGFjayBwb2ludGVyICovCiAKLSAgICBmcHJpbnRmKCBvdXRmaWxlLCAiXHRtb3ZsICIgUFJFRklYICJJRjE2MzJfU2F2ZWQzMl9lc3AsJSVlYnhcbiIgKTsKKyAgICBmcHJpbnRmKCBvdXRmaWxlLCAiXHRtb3ZsICIgUFJFRklYICJDQUxMVE8xNl9TYXZlZDMyX2VzcCwlJWVieFxuIiApOwogCiAgICAgLyogQ29weSB0aGUgYXJndW1lbnRzICovCiAKQEAgLTE1NTMsNyArMTU3NCw3IEBACiAKICAgICAvKiBHZXQgdGhlIDMyLWJpdCBzdGFjayBwb2ludGVyICovCiAKLSAgICBmcHJpbnRmKCBvdXRmaWxlLCAiXHRtb3ZsICIgUFJFRklYICJJRjE2MzJfU2F2ZWQzMl9lc3AsJSVlYnhcbiIgKTsKKyAgICBmcHJpbnRmKCBvdXRmaWxlLCAiXHRtb3ZsICIgUFJFRklYICJDQUxMVE8xNl9TYXZlZDMyX2VzcCwlJWVieFxuIiApOwogCiAgICAgLyogU3RvcmUgdGhlIHJlZ2lzdGVycyAqLwogCkBAIC0xNjA3LDE3ICsxNjI4LDE4IEBACiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogICogICAgICAgICBSZXN0b3JlQ29udGV4dDE2CiAgKgotICogUmVzdG9yZSB0aGUgcmVnaXN0ZXJzIGZyb20gdGhlIGNvbnRleHQgc3RydWN0dXJlCisgKiBSZXN0b3JlIHRoZSByZWdpc3RlcnMgZnJvbSB0aGUgY29udGV4dCBzdHJ1Y3R1cmUuCisgKiAlZWR4IG11c3QgcG9pbnQgdG8gdGhlIDMyLWJpdCBzdGFjayB0b3AuCiAgKi8KIHN0YXRpYyB2b2lkIFJlc3RvcmVDb250ZXh0MTYoIEZJTEUgKm91dGZpbGUgKQogewogICAgIC8qIEdldCB0aGUgMzItYml0IHN0YWNrIHBvaW50ZXIgKi8KIAotICAgIGZwcmludGYoIG91dGZpbGUsICJcdG1vdmwgIiBQUkVGSVggIklGMTYzMl9TYXZlZDMyX2VzcCwlJWVieFxuIiApOworICAgIGZwcmludGYoIG91dGZpbGUsICJcdG1vdmwgJSVlZHgsJSVlYnhcbiIgKTsKIAogICAgIC8qIFJlbW92ZSBldmVyeXRoaW5nIHVwIHRvIHRoZSByZXR1cm4gYWRkcmVzcyBmcm9tIHRoZSAxNi1iaXQgc3RhY2sgKi8KIAotICAgIGZwcmludGYoIG91dGZpbGUsICJcdGFkZGwgJDE4LCUlZXNwXG4iICk7CisgICAgZnByaW50Ziggb3V0ZmlsZSwgIlx0YWRkbCAkMjIsJSVlc3BcbiIgKTsKIAogICAgIC8qIFJlc3RvcmUgdGhlIHJlZ2lzdGVycyAqLwogCkBAIC0xNjMxLDYgKzE2NTMsMTAgQEAKICAgICAgICAgICAgICBDT05URVhUT0ZGU0VUKEVkaSkgLSBzaXplb2YoQ09OVEVYVCkgKTsKICAgICBmcHJpbnRmKCBvdXRmaWxlLCAiXHRtb3ZsICVkKCUlZWJ4KSwlJWVicFxuIiwKICAgICAgICAgICAgICBDT05URVhUT0ZGU0VUKEVicCkgLSBzaXplb2YoQ09OVEVYVCkgKTsKKyAgICBmcHJpbnRmKCBvdXRmaWxlLCAiXHRwdXNodyAlZCglJWVieClcbiIsICAvKiBQdXNoIG5ldyBjcyAqLworICAgICAgICAgICAgIENPTlRFWFRPRkZTRVQoU2VnQ3MpIC0gc2l6ZW9mKENPTlRFWFQpICk7CisgICAgZnByaW50Ziggb3V0ZmlsZSwgIlx0cHVzaHcgJWQoJSVlYngpXG4iLCAgLyogUHVzaCBuZXcgaXAgKi8KKyAgICAgICAgICAgICBDT05URVhUT0ZGU0VUKEVpcCkgLSBzaXplb2YoQ09OVEVYVCkgKTsKICAgICBmcHJpbnRmKCBvdXRmaWxlLCAiXHRwdXNodyAlZCglJWVieClcbiIsICAvKiBQdXNoIG5ldyBkcyAqLwogICAgICAgICAgICAgIENPTlRFWFRPRkZTRVQoU2VnRHMpIC0gc2l6ZW9mKENPTlRFWFQpICk7CiAgICAgZnByaW50Ziggb3V0ZmlsZSwgIlx0cHVzaHcgJWQoJSVlYngpXG4iLCAgLyogUHVzaCBuZXcgZXMgKi8KQEAgLTE3NDksNyArMTc3NSw3IEBACiAKICAgICAvKiBTd2l0Y2ggdG8gdGhlIDMyLWJpdCBzdGFjayAqLwogCi0gICAgZnByaW50Ziggb3V0ZmlsZSwgIlx0bW92bCAiIFBSRUZJWCAiSUYxNjMyX1NhdmVkMzJfZXNwLCUlZWJwXG4iICk7CisgICAgZnByaW50Ziggb3V0ZmlsZSwgIlx0bW92bCAiIFBSRUZJWCAiQ0FMTFRPMTZfU2F2ZWQzMl9lc3AsJSVlYnBcbiIgKTsKICAgICBmcHJpbnRmKCBvdXRmaWxlLCAiXHRwdXNodyAlJWRzXG4iICk7CiAgICAgZnByaW50Ziggb3V0ZmlsZSwgIlx0cG9wdyAlJXNzXG4iICk7CiAgICAgZnByaW50Ziggb3V0ZmlsZSwgIlx0bGVhbCAtJWQoJSVlYnApLCUlZXNwXG4iLApAQCAtMTc1OSw3ICsxNzg1LDcgQEAKIAogICAgIC8qIFNldHVwICVlYnAgdG8gcG9pbnQgdG8gdGhlIHByZXZpb3VzIHN0YWNrIGZyYW1lIChidWlsdCBieSBDYWxsVG8xNikgKi8KIAotICAgIGZwcmludGYoIG91dGZpbGUsICJcdGFkZGwgJDMyLCUlZWJwXG4iICk7CisgICAgZnByaW50Ziggb3V0ZmlsZSwgIlx0YWRkbCAkJWQsJSVlYnBcbiIsIFNUUlVDVE9GRlNFVChTVEFDSzMyRlJBTUUsZWJwKSApOwogCiAgICAgLyogUHJpbnQgdGhlIGRlYnVnIGluZm9ybWF0aW9uIGJlZm9yZSB0aGUgY2FsbCAqLwogCkBAIC0xNzk3LDEyICsxODIzLDExIEBACiAgICAgICAgIGZwcmludGYoIG91dGZpbGUsICJcdHBvcGwgJSVlYXhcbiIgKTsKICAgICB9CiAKLSNpZiAwCiAgICAgLyogUmVzdG9yZSB0aGUgdmFsdWUgb2YgdGhlIHNhdmVkIDMyLWJpdCBzdGFjayBwb2ludGVyICovCiAKLSAgICBmcHJpbnRmKCBvdXRmaWxlLCAiXHRsZWFsIC0zMiglJWVicCksJSVlZHhcbiIgKTsKLSAgICBmcHJpbnRmKCBvdXRmaWxlLCAibW92bCAlJWVkeCwiIFBSRUZJWCAiSUYxNjMyX1NhdmVkMzJfZXNwXG4iICk7Ci0jZW5kaWYKKyAgICBmcHJpbnRmKCBvdXRmaWxlLCAiXHRsZWFsIC0lZCglJWVicCksJSVlZHhcbiIsCisgICAgICAgICAgICAgU1RSVUNUT0ZGU0VUKFNUQUNLMzJGUkFNRSxlYnApICk7CisgICAgZnByaW50Ziggb3V0ZmlsZSwgIm1vdmwgJSVlZHgsIiBQUkVGSVggIkNBTExUTzE2X1NhdmVkMzJfZXNwXG4iICk7CiAKICAgICAvKiBSZXN0b3JlIHRoZSAxNi1iaXQgc3RhY2sgKi8KIApAQCAtMTg5NiwxOSArMTkyMSwxNiBAQAogICogUHJvdG90eXBlcyBmb3IgdGhlIENhbGxUbzE2IGZ1bmN0aW9uczoKICAqICAgZXh0ZXJuIFdJTkFQSSBXT1JEIENhbGxUbzE2X3dvcmRfeHh4KCBGQVJQUk9DMTYgZnVuYywgYXJncy4uLiApOwogICogICBleHRlcm4gV0lOQVBJIExPTkcgQ2FsbFRvMTZfbG9uZ194eHgoIEZBUlBST0MxNiBmdW5jLCBhcmdzLi4uICk7Ci0gKiAgIGV4dGVybiBXSU5BUEkgTE9ORyBDYWxsVG8xNl93bmRwX3h4eCggRkFSUFJPQzE2IGZ1bmMsIGFyZ3MuLi4gKTsKICAqICAgZXh0ZXJuIFdJTkFQSSB2b2lkIENhbGxUbzE2X3JlZ3NfKCBjb25zdCBDT05URVhUICpjb250ZXh0ICk7CiAgKi8KIHN0YXRpYyB2b2lkIEJ1aWxkQ2FsbFRvMTZGdW5jKCBGSUxFICpvdXRmaWxlLCBjaGFyICpwcm9maWxlICkKIHsKLSAgICBpbnQgd2luZG93X3Byb2MgPSAwOwogICAgIGludCBzaG9ydF9yZXQgPSAwOwogICAgIGludCByZWdfZnVuYyA9IDA7CiAgICAgY2hhciAqYXJncyA9IHByb2ZpbGUgKyA1OwogCiAgICAgaWYgKCFzdHJuY21wKCAid29yZF8iLCBwcm9maWxlLCA1ICkpIHNob3J0X3JldCA9IDE7Ci0gICAgZWxzZSBpZiAoIXN0cm5jbXAoICJyZWdzXyIsIHByb2ZpbGUsIDUgKSkgcmVnX2Z1bmMgPSBzaG9ydF9yZXQgPSAxOwotICAgIGVsc2UgaWYgKCFzdHJuY21wKCAid25kcF8iLCBwcm9maWxlLCA1ICkpIHdpbmRvd19wcm9jID0gMTsKKyAgICBlbHNlIGlmICghc3RybmNtcCggInJlZ3NfIiwgcHJvZmlsZSwgNSApKSByZWdfZnVuYyA9IDE7CiAgICAgZWxzZSBpZiAoc3RybmNtcCggImxvbmdfIiwgcHJvZmlsZSwgNSApKQogICAgIHsKICAgICAgICAgZnByaW50Ziggc3RkZXJyLCAiSW52YWxpZCBmdW5jdGlvbiBuYW1lICclcycsIGlnbm9yZWRcbiIsIHByb2ZpbGUgKTsKQEAgLTE5NjAsOCArMTk4Miw3IEBACiAKICAgICAvKiBTYXZlIHRoZSAzMi1iaXQgc3RhY2sgKi8KIAotICAgIGZwcmludGYoIG91dGZpbGUsICJcdHB1c2hsICIgUFJFRklYICJJRjE2MzJfU2F2ZWQzMl9lc3BcbiIgKTsKLSAgICBmcHJpbnRmKCBvdXRmaWxlLCAiXHRtb3ZsICUlZXNwLCIgUFJFRklYICJJRjE2MzJfU2F2ZWQzMl9lc3BcbiIgKTsKKyAgICBmcHJpbnRmKCBvdXRmaWxlLCAiXHRtb3ZsICUlZXNwLCIgUFJFRklYICJDQUxMVE8xNl9TYXZlZDMyX2VzcFxuIiApOwogICAgIGZwcmludGYoIG91dGZpbGUsICJcdG1vdmwgJSVlYnAsJSVlYnhcbiIgKTsKIAogICAgIC8qIFByaW50IGRlYnVnZ2luZyBpbmZvICovCkBAIC0xOTY5LDcgKzE5OTAsNyBAQAogICAgIGlmIChkZWJ1Z2dpbmcpCiAgICAgewogICAgICAgICAvKiBQdXNoIHRoZSBhZGRyZXNzIG9mIHRoZSBmaXJzdCBhcmd1bWVudCAqLwotICAgICAgICBmcHJpbnRmKCBvdXRmaWxlLCAiXHRsZWFsIDgoJSVlYngpLCUlZWF4XG4iICk7CisgICAgICAgIGZwcmludGYoIG91dGZpbGUsICJcdGxlYWwgOCglJWVicCksJSVlYXhcbiIgKTsKICAgICAgICAgZnByaW50Ziggb3V0ZmlsZSwgIlx0cHVzaGwgJCVkXG4iLCByZWdfZnVuYyA/IC0xIDogc3RybGVuKGFyZ3MpICk7CiAgICAgICAgIGZwcmludGYoIG91dGZpbGUsICJcdHB1c2hsICUlZWF4XG4iICk7CiAgICAgICAgIGZwcmludGYoIG91dGZpbGUsICJcdGNhbGwgIiBQUkVGSVggIlJFTEFZX0RlYnVnQ2FsbFRvMTZcbiIgKTsKQEAgLTE5NzcsMTkgKzE5OTgsMjQgQEAKICAgICAgICAgZnByaW50Ziggb3V0ZmlsZSwgIlx0cG9wbCAlJWVheFxuIiApOwogICAgIH0KIAotICAgIC8qIFN3aXRjaCB0byB0aGUgMTYtYml0IHN0YWNrICovCi0KLSNpZmRlZiBfX3N2cjRfXwotICAgIGZwcmludGYoIG91dGZpbGUsIlx0ZGF0YTE2XG4iKTsKLSNlbmRpZgotICAgIGZwcmludGYoIG91dGZpbGUsICJcdG1vdncgIiBQUkVGSVggIklGMTYzMl9TYXZlZDE2X3NzX3NwKzIsJSVzc1xuIiApOwotICAgIGZwcmludGYoIG91dGZpbGUsICJcdG1vdncgIiBQUkVGSVggIklGMTYzMl9TYXZlZDE2X3NzX3NwLCUlc3BcbiIgKTsKLQotICAgIC8qIFRyYW5zZmVyIHRoZSBhcmd1bWVudHMgKi8KLQogICAgIGlmIChyZWdfZnVuYykKICAgICB7CisgICAgICAgIC8qIFN3aXRjaCB0byB0aGUgMTYtYml0IHN0YWNrLCBzYXZpbmcgdGhlIGN1cnJlbnQgJSVlc3AsICovCisgICAgICAgIC8qIGFuZCBhZGRpbmcgdGhlIHNwZWNpZmllZCBvZmZzZXQgdG8gdGhlIG5ldyBzcCAqLworICAgICAgICBmcHJpbnRmKCBvdXRmaWxlLCAiXHRtb3Z6d2wgIiBQUkVGSVggIklGMTYzMl9TYXZlZDE2X3NzX3NwLCUlZWR4XG4iICk7CisgICAgICAgIGZwcmludGYoIG91dGZpbGUsICJcdGxlYWwgLTQoJSVlZHgpLCUlZWR4XG4iICk7CisgICAgICAgIGZwcmludGYoIG91dGZpbGUsICJcdG1vdmwgMTIoJSVlYngpLCUlZWF4XG4iICk7IC8qIEdldCB0aGUgb2Zmc2V0ICovCisgICAgICAgIGZwcmludGYoIG91dGZpbGUsICJcdGFkZGwgJSVlZHgsJSVlYXhcbiIgKTsKKyNpZmRlZiBfX3N2cjRfXworICAgICAgICBmcHJpbnRmKCBvdXRmaWxlLCJcdGRhdGExNlxuIik7CisjZW5kaWYKKyAgICAgICAgZnByaW50Ziggb3V0ZmlsZSwgIlx0bW92dyAiIFBSRUZJWCAiSUYxNjMyX1NhdmVkMTZfc3Nfc3ArMiwlJXNzXG4iICk7CisgICAgICAgIGZwcmludGYoIG91dGZpbGUsICJcdHhjaGdsICUlZXNwLCUlZWF4XG4iICk7CisgICAgICAgIGZwcmludGYoIG91dGZpbGUsICJcdC5ieXRlIDB4MzZcbiIgLyogJXNzOiAqLyApOworICAgICAgICBmcHJpbnRmKCBvdXRmaWxlLCAiXHRtb3ZsICUlZWF4LDAoJSVlZHgpXG4iICk7CisKICAgICAgICAgLyogR2V0IHRoZSByZWdpc3RlcnMuIGVieCBpcyBoYW5kbGVkIGxhdGVyIG9uLiAqLworCiAgICAgICAgIGZwcmludGYoIG91dGZpbGUsICJcdG1vdmwgOCglJWVieCksJSVlYnhcbiIgKTsKICAgICAgICAgZnByaW50Ziggb3V0ZmlsZSwgIlx0bW92bCAlZCglJWVieCksJSVlYXhcbiIsIENPTlRFWFRPRkZTRVQoU2VnRXMpICk7CiAgICAgICAgIGZwcmludGYoIG91dGZpbGUsICJcdG1vdncgJSVheCwlJWVzXG4iICk7CkBAIC0xOTk5LDE0ICsyMDI1LDQyIEBACiAgICAgICAgIGZwcmludGYoIG91dGZpbGUsICJcdG1vdmwgJWQoJSVlYngpLCUlZWR4XG4iLCBDT05URVhUT0ZGU0VUKEVkeCkgKTsKICAgICAgICAgZnByaW50Ziggb3V0ZmlsZSwgIlx0bW92bCAlZCglJWVieCksJSVlc2lcbiIsIENPTlRFWFRPRkZTRVQoRXNpKSApOwogICAgICAgICBmcHJpbnRmKCBvdXRmaWxlLCAiXHRtb3ZsICVkKCUlZWJ4KSwlJWVkaVxuIiwgQ09OVEVYVE9GRlNFVChFZGkpICk7CisKKyAgICAgICAgLyogUHVzaCB0aGUgcmV0dXJuIGFkZHJlc3MgKi8KKworICAgICAgICBmcHJpbnRmKCBvdXRmaWxlLCAiXHRwdXNobCAiIFBSRUZJWCAiQ0FMTFRPMTZfUmV0QWRkcl9sb25nXG4iICk7CisKKyAgICAgICAgLyogUHVzaCB0aGUgY2FsbGVkIHJvdXRpbmUgYWRkcmVzcyAqLworCisgICAgICAgIGZwcmludGYoIG91dGZpbGUsICJcdHB1c2h3ICVkKCUlZWJ4KVxuIiwgQ09OVEVYVE9GRlNFVChTZWdDcykgKTsKKyAgICAgICAgZnByaW50Ziggb3V0ZmlsZSwgIlx0cHVzaHcgJWQoJSVlYngpXG4iLCBDT05URVhUT0ZGU0VUKEVpcCkgKTsKKworICAgICAgICAvKiBHZXQgdGhlIDE2LWJpdCBkcyAqLworCisgICAgICAgIGZwcmludGYoIG91dGZpbGUsICJcdHB1c2h3ICVkKCUlZWJ4KVxuIiwgQ09OVEVYVE9GRlNFVChTZWdEcykgKTsKKyAgICAgICAgLyogR2V0IGVieCBmcm9tIHRoZSAzMi1iaXQgc3RhY2sgKi8KKyAgICAgICAgZnByaW50Ziggb3V0ZmlsZSwgIlx0bW92bCAlZCglJWVieCksJSVlYnhcbiIsIENPTlRFWFRPRkZTRVQoRWJ4KSApOworICAgICAgICBmcHJpbnRmKCBvdXRmaWxlLCAiXHRwb3B3ICUlZHNcbiIgKTsKICAgICB9CiAgICAgZWxzZSAgLyogbm90IGEgcmVnaXN0ZXIgZnVuY3Rpb24gKi8KICAgICB7CiAgICAgICAgIGludCBwb3MgPSAxMjsgIC8qIGZpcnN0IGFyZ3VtZW50IHBvc2l0aW9uICovCiAKKyAgICAgICAgLyogU3dpdGNoIHRvIHRoZSAxNi1iaXQgc3RhY2ssIHNhdmluZyB0aGUgY3VycmVudCAlJWVzcCAqLworICAgICAgICBmcHJpbnRmKCBvdXRmaWxlLCAiXHRtb3ZsICUlZXNwLCUlZWF4XG4iICk7CisjaWZkZWYgX19zdnI0X18KKyAgICAgICAgZnByaW50Ziggb3V0ZmlsZSwiXHRkYXRhMTZcbiIpOworI2VuZGlmCisgICAgICAgIGZwcmludGYoIG91dGZpbGUsICJcdG1vdncgIiBQUkVGSVggIklGMTYzMl9TYXZlZDE2X3NzX3NwKzIsJSVzc1xuIiApOworICAgICAgICBmcHJpbnRmKCBvdXRmaWxlLCAiXHRtb3Z3ICIgUFJFRklYICJJRjE2MzJfU2F2ZWQxNl9zc19zcCwlJXNwXG4iICk7CisgICAgICAgIGZwcmludGYoIG91dGZpbGUsICJcdHB1c2hsICUlZWF4XG4iICk7CisKICAgICAgICAgLyogTWFrZSAlYnAgcG9pbnQgdG8gdGhlIHByZXZpb3VzIHN0YWNrZnJhbWUgKGJ1aWx0IGJ5IENhbGxGcm9tMTYpICovCiAgICAgICAgIGZwcmludGYoIG91dGZpbGUsICJcdG1vdnp3bCAlJXNwLCUlZWJwXG4iICk7Ci0gICAgICAgIGZwcmludGYoIG91dGZpbGUsICJcdGFkZHcgJDIwLCUlYnBcbiIgKTsKKyAgICAgICAgZnByaW50Ziggb3V0ZmlsZSwgIlx0bGVhbCAlZCglJWVicCksJSVlYnBcbiIsCisgICAgICAgICAgICAgICAgIFNUUlVDVE9GRlNFVChTVEFDSzE2RlJBTUUsYnApICsgNCAvKiBmb3Igc2F2ZWQgJSVlc3AgKi8gKTsKKworICAgICAgICAvKiBUcmFuc2ZlciB0aGUgYXJndW1lbnRzICovCiAKICAgICAgICAgd2hpbGUgKCphcmdzKQogICAgICAgICB7CkBAIC0yMDI0LDQyICsyMDc4LDIxIEBACiAgICAgICAgICAgICB9CiAgICAgICAgICAgICBwb3MgKz0gNDsKICAgICAgICAgfQotICAgIH0KIAotICAgIC8qIFB1c2ggdGhlIHJldHVybiBhZGRyZXNzICovCisgICAgICAgIC8qIFB1c2ggdGhlIHJldHVybiBhZGRyZXNzICovCiAKLSAgICBmcHJpbnRmKCBvdXRmaWxlLCAiXHRwdXNobCAiIFBSRUZJWCAiQ0FMTFRPMTZfUmV0QWRkcl8lc1xuIiwKLSAgICAgICAgICAgICBzaG9ydF9yZXQgPyAid29yZCIgOiAibG9uZyIgKTsKKyAgICAgICAgZnByaW50Ziggb3V0ZmlsZSwgIlx0cHVzaGwgIiBQUkVGSVggIkNBTExUTzE2X1JldEFkZHJfJXNcbiIsCisgICAgICAgICAgICAgICAgIHNob3J0X3JldCA/ICJ3b3JkIiA6ICJsb25nIiApOwogCi0gICAgaWYgKHJlZ19mdW5jKQotICAgIHsKLSAgICAgICAgLyogUHVzaCB0aGUgY2FsbGVkIHJvdXRpbmUgYWRkcmVzcyAqLwotCi0gICAgICAgIGZwcmludGYoIG91dGZpbGUsICJcdHB1c2h3ICVkKCUlZWJ4KVxuIiwgQ09OVEVYVE9GRlNFVChTZWdDcykgKTsKLSAgICAgICAgZnByaW50Ziggb3V0ZmlsZSwgIlx0cHVzaHcgJWQoJSVlYngpXG4iLCBDT05URVhUT0ZGU0VUKEVpcCkgKTsKLQotICAgICAgICAvKiBHZXQgdGhlIDE2LWJpdCBkcyAqLwotCi0gICAgICAgIGZwcmludGYoIG91dGZpbGUsICJcdHB1c2h3ICVkKCUlZWJ4KVxuIiwgQ09OVEVYVE9GRlNFVChTZWdEcykgKTsKLSAgICAgICAgLyogR2V0IGVieCBmcm9tIHRoZSAzMi1iaXQgc3RhY2sgKi8KLSAgICAgICAgZnByaW50Ziggb3V0ZmlsZSwgIlx0bW92bCAlZCglJWVieCksJSVlYnhcbiIsIENPTlRFWFRPRkZTRVQoRWJ4KSApOwotICAgICAgICBmcHJpbnRmKCBvdXRmaWxlLCAiXHRwb3B3ICUlZHNcbiIgKTsKLSAgICB9Ci0gICAgZWxzZQotICAgIHsKICAgICAgICAgLyogUHVzaCB0aGUgY2FsbGVkIHJvdXRpbmUgYWRkcmVzcyAqLwogCiAgICAgICAgIGZwcmludGYoIG91dGZpbGUsICJcdHB1c2hsIDgoJSVlYngpXG4iICk7CiAKLQlpZiggd2luZG93X3Byb2MgKQotCXsKLQkgICAgLyogc2V0IGF4IHRvIGhJbnN0YW5jZSBhbmQgaW5pdGlhbGl6ZSBlcyBhbmQgZHMgdG8gc3MgKi8KKyAgICAgICAgLyogU2V0ICVkcyBhbmQgJWVzIChhbmQgJWF4IGp1c3QgaW4gY2FzZSkgZXF1YWwgdG8gJXNzICovCiAKLQkgICAgZnByaW50Ziggb3V0ZmlsZSwgIlx0bW92dyAtMTAoJSVlYnApLCUlYXhcbiIgKTsKLQkgICAgZnByaW50Ziggb3V0ZmlsZSwgIlx0bW92dyAlJXNzLCAlJWN4XG4iICk7Ci0JICAgIGZwcmludGYoIG91dGZpbGUsICJcdG1vdncgJSVjeCwgJSVkc1xuIiApOwotCSAgICBmcHJpbnRmKCBvdXRmaWxlLCAiXHRtb3Z3ICUlY3gsICUlZXNcbiIgKTsKLQl9CisgICAgICAgIGZwcmludGYoIG91dGZpbGUsICJcdG1vdncgJSVzcywlJWF4XG4iICk7CisgICAgICAgIGZwcmludGYoIG91dGZpbGUsICJcdG1vdncgJSVheCwlJWRzXG4iICk7CisgICAgICAgIGZwcmludGYoIG91dGZpbGUsICJcdG1vdncgJSVheCwlJWVzXG4iICk7CiAgICAgfQogCiAgICAgLyogSnVtcCB0byB0aGUgY2FsbGVkIHJvdXRpbmUgKi8KQEAgLTIwODksNiArMjEyMiw3IEBACiAKICAgICAvKiBSZXN0b3JlIDMyLWJpdCBzZWdtZW50IHJlZ2lzdGVycyAqLwogCisgICAgZnByaW50Ziggb3V0ZmlsZSwgIlx0cG9wbCAlJWVjeFxuIiApOyAgLyogR2V0IHRoZSBzYXZlZCAlJWVzcCAqLwogICAgIGZwcmludGYoIG91dGZpbGUsICJcdG1vdncgJDB4JTA0eCwlJWJ4XG4iLCBXSU5FX0RBVEFfU0VMRUNUT1IgKTsKICNpZmRlZiBfX3N2cjRfXwogICAgIGZwcmludGYoIG91dGZpbGUsICJcdGRhdGExNlxuIik7CkBAIC0yMDk4LDE1ICsyMTMyLDE0IEBACiAgICAgZnByaW50Ziggb3V0ZmlsZSwgIlx0ZGF0YTE2XG4iKTsKICNlbmRpZgogICAgIGZwcmludGYoIG91dGZpbGUsICJcdG1vdncgJSVieCwlJWVzXG4iICk7CisKKyAgICAvKiBSZXN0b3JlIHRoZSAzMi1iaXQgc3RhY2sgKi8KKwogI2lmZGVmIF9fc3ZyNF9fCiAgICAgZnByaW50Ziggb3V0ZmlsZSwgIlx0ZGF0YTE2XG4iKTsKICNlbmRpZgogICAgIGZwcmludGYoIG91dGZpbGUsICJcdG1vdncgJSVieCwlJXNzXG4iICk7Ci0KLSAgICAvKiBSZXN0b3JlIHRoZSAzMi1iaXQgc3RhY2sgKi8KLQotICAgIGZwcmludGYoIG91dGZpbGUsICJcdG1vdmwgIiBQUkVGSVggIklGMTYzMl9TYXZlZDMyX2VzcCwlJWVzcFxuIiApOwotICAgIGZwcmludGYoIG91dGZpbGUsICJcdHBvcGwgIiBQUkVGSVggIklGMTYzMl9TYXZlZDMyX2VzcFxuIiApOworICAgIGZwcmludGYoIG91dGZpbGUsICJcdG1vdmwgJSVlY3gsJSVlc3BcbiIgKTsKIAogICAgIC8qIFJlc3RvcmUgdGhlIDMyLWJpdCByZWdpc3RlcnMgKi8KIApAQCAtMjExOCw3ICsyMTUxLDYgQEAKIAogICAgIC8qIFJldHVybiB0byBjYWxsZXIgKi8KIAotLyogICAgZnByaW50Ziggb3V0ZmlsZSwgIlx0cG9wbCAlJWVicFxuIiApOyovCiAgICAgZnByaW50Ziggb3V0ZmlsZSwgIlx0bHJldFxuIiApOwogCiAgICAgLyogRGVjbGFyZSB0aGUgcmV0dXJuIGFkZHJlc3MgdmFyaWFibGVzICovCkBAIC0yMTI2LDggKzIxNTgsMTAgQEAKICAgICBmcHJpbnRmKCBvdXRmaWxlLCAiXHQuZGF0YVxuIiApOwogICAgIGZwcmludGYoIG91dGZpbGUsICJcdC5nbG9ibCAiIFBSRUZJWCAiQ0FMTFRPMTZfUmV0QWRkcl93b3JkXG4iICk7CiAgICAgZnByaW50Ziggb3V0ZmlsZSwgIlx0Lmdsb2JsICIgUFJFRklYICJDQUxMVE8xNl9SZXRBZGRyX2xvbmdcbiIgKTsKKyAgICBmcHJpbnRmKCBvdXRmaWxlLCAiXHQuZ2xvYmwgIiBQUkVGSVggIkNBTExUTzE2X1NhdmVkMzJfZXNwXG4iICk7CiAgICAgZnByaW50Ziggb3V0ZmlsZSwgUFJFRklYICJDQUxMVE8xNl9SZXRBZGRyX3dvcmQ6XHQubG9uZyAwXG4iICk7CiAgICAgZnByaW50Ziggb3V0ZmlsZSwgUFJFRklYICJDQUxMVE8xNl9SZXRBZGRyX2xvbmc6XHQubG9uZyAwXG4iICk7CisgICAgZnByaW50Ziggb3V0ZmlsZSwgUFJFRklYICJDQUxMVE8xNl9TYXZlZDMyX2VzcDpcdC5sb25nIDBcbiIgKTsKICAgICBmcHJpbnRmKCBvdXRmaWxlLCAiXHQudGV4dFxuIiApOwogfQogCkBAIC0yMzA0LDEzICsyMzM4LDYgQEAKICAgICAgICAgZm9yIChpID0gYXJnczsgaSA+IDA7IGktLSkKICAgICAgICAgICAgIGZwcmludGYoIG91dGZpbGUsICJcdHB1c2hsICVkKCUlZWJwKVxuIiwgNCAqIGkgKyA0ICk7CiAgICAgfQotICAgIGVsc2UgaWYgKCFyZWdfZnVuYykKLSAgICB7Ci0gICAgICAgIC8qIFB1c2ggdGhlIGFkZHJlc3Mgb2YgdGhlIGFyZ3VtZW50cy4gVGhlIGNhbGxlZCBmdW5jdGlvbiB3aWxsICovCi0gICAgICAgIC8qIGlnbm9yZSB0aGlzIGlmIGl0IHJlYWxseSB0YWtlcyBubyBhcmd1bWVudHMuICovCi0gICAgICAgIGZwcmludGYoIG91dGZpbGUsICJcdGxlYWwgOCglJWVicCksJSVlYXhcbiIgKTsKLSAgICAgICAgZnByaW50Ziggb3V0ZmlsZSwgIlx0cHVzaGwgJSVlYXhcbiIgKTsKLSAgICB9CiAKICNpZiAwCiAgICAgLyogU2V0ICVlcyA9ICVkcyAqLwpAQCAtMjM2MSw3MSArMjM4OCw2IEBACiAKIAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqICAgICAgICAgQnVpbGRDYWxsVG8zMkZ1bmMKLSAqCi0gKiBCdWlsZCBhIFdpbmUtdG8tMzItYml0IGNhbGxiYWNrIGZ1bmN0aW9uLgotICoKLSAqIFN0YWNrIGZyYW1lIG9mIHRoZSBjYWxsYmFjayBmdW5jdGlvbjoKLSAqICAuLi4gICAgICAuLi4KLSAqIChlYnArMTYpIGFyZzIKLSAqIChlYnArMTIpIGFyZzEKLSAqIChlYnArOCkgIGZ1bmMgdG8gY2FsbAotICogKGVicCs0KSAgcmV0dXJuIGFkZHJlc3MKLSAqIChlYnApICAgIHByZXZpb3VzIGVicAotICoKLSAqIFByb3RvdHlwZSBmb3IgdGhlIENhbGxUbzMyIGZ1bmN0aW9uczoKLSAqICAgZXh0ZXJuIExPTkcgQ2FsbFRvMzJfbm4oIEZBUlBST0MzMiBmdW5jLCBhcmdzLi4uICk7Ci0gKi8KLXN0YXRpYyB2b2lkIEJ1aWxkQ2FsbFRvMzJGdW5jKCBGSUxFICpvdXRmaWxlLCBpbnQgYXJncyApCi17Ci0gICAgLyogRnVuY3Rpb24gaGVhZGVyICovCi0KLSAgICBmcHJpbnRmKCBvdXRmaWxlLCAiXG5cdC5hbGlnbiA0XG4iICk7Ci0jaWZkZWYgVVNFX1NUQUJTCi0gICAgZnByaW50Ziggb3V0ZmlsZSwgIi5zdGFicyBcIkNhbGxUbzMyXyVkOkYxXCIsMzYsMCwwLCIgUFJFRklYICJDYWxsVG8zMl8lZFxuIiwgCi0JICAgICBhcmdzLCBhcmdzKTsKLSNlbmRpZgotICAgIGZwcmludGYoIG91dGZpbGUsICJcdC5nbG9ibCAiIFBSRUZJWCAiQ2FsbFRvMzJfJWRcbiIsIGFyZ3MgKTsKLSAgICBmcHJpbnRmKCBvdXRmaWxlLCBQUkVGSVggIkNhbGxUbzMyXyVkOlxuIiwgYXJncyApOwotCi0gICAgLyogRW50cnkgY29kZSAqLwotCi0gICAgZnByaW50Ziggb3V0ZmlsZSwgIlx0cHVzaGwgJSVlYnBcbiIgKTsKLSAgICBmcHJpbnRmKCBvdXRmaWxlLCAiXHRtb3ZsICUlZXNwLCUlZWJwXG4iICk7Ci0KLSAgICAvKiBUcmFuc2ZlciBhcmd1bWVudHMgKi8KLQotICAgIGlmIChhcmdzKQotICAgIHsKLSAgICAgICAgaW50IGk7Ci0gICAgICAgIGZvciAoaSA9IGFyZ3M7IGkgPiAwOyBpLS0pCi0gICAgICAgICAgICBmcHJpbnRmKCBvdXRmaWxlLCAiXHRwdXNobCAlZCglJWVicClcbiIsIDQgKiBpICsgOCApOwotICAgIH0KLQotICAgIC8qIFByaW50IHRoZSBkZWJ1Z2dpbmcgb3V0cHV0ICovCi0KLSAgICBpZiAoZGVidWdnaW5nKQotICAgIHsKLSAgICAgICAgZnByaW50Ziggb3V0ZmlsZSwgIlx0cHVzaGwgJCVkXG4iLCBhcmdzICk7Ci0gICAgICAgIGZwcmludGYoIG91dGZpbGUsICJcdHB1c2hsIDgoJSVlYnApXG4iICk7Ci0gICAgICAgIGZwcmludGYoIG91dGZpbGUsICJcdGNhbGwgIiBQUkVGSVggIlJFTEFZX0RlYnVnQ2FsbFRvMzJcbiIgKTsKLSAgICAgICAgZnByaW50Ziggb3V0ZmlsZSwgIlx0YWRkbCAkOCwlJWVzcFxuIiApOwotICAgIH0KLQotICAgIC8qIENhbGwgdGhlIGZ1bmN0aW9uICovCi0KLSAgICBmcHJpbnRmKCBvdXRmaWxlLCAiXHRjYWxsIDgoJSVlYnApXG4iICk7Ci0KLSAgICAvKiBSZXR1cm4gdG8gV2luZSAqLwotCi0gICAgZnByaW50Ziggb3V0ZmlsZSwgIlx0bW92bCAlJWVicCwlJWVzcFxuIiApOwotICAgIGZwcmludGYoIG91dGZpbGUsICJcdHBvcGwgJSVlYnBcbiIgKTsKLSAgICBpZiAoYXJncykgZnByaW50Ziggb3V0ZmlsZSwgIlx0cmV0ICQlZFxuIiwgYXJncyApOwotICAgIGVsc2UgZnByaW50Ziggb3V0ZmlsZSwgIlx0cmV0XG4iICk7Ci19Ci0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICAqICAgICAgICAgQnVpbGRTcGVjCiAgKgogICogQnVpbGQgdGhlIHNwZWMgZmlsZXMKQEAgLTI1ODMsNjEgKzI1NDUsMTAgQEAKIAogICAgIGZvciAoaSA9IDI7IGkgPCBhcmdjOyBpKyspIEJ1aWxkQ2FsbEZyb20zMkZ1bmMoIG91dGZpbGUsIGFyZ3ZbaV0gKTsKIAotI2lmZGVmIFVTRV9TVEFCUwotICAgIGZwcmludGYoIG91dGZpbGUsICJcdC50ZXh0XG4iKTsKLSAgICBmcHJpbnRmKCBvdXRmaWxlLCAiXHQuc3RhYnMgXCJcIiwxMDAsMCwwLC5MZXRleHRcbiIpOwotICAgIGZwcmludGYoIG91dGZpbGUsICIuTGV0ZXh0OlxuIik7Ci0jZW5kaWYKLQotICAgIHJldHVybiAwOwotfQotCi0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiAgICAgICAgIEJ1aWxkQ2FsbFRvMzIKLSAqCi0gKiBCdWlsZCB0aGUgV2luZS10by0zMi1iaXQgY2FsbGJhY2tzCi0gKi8KLXN0YXRpYyBpbnQgQnVpbGRDYWxsVG8zMiggRklMRSAqb3V0ZmlsZSwgY2hhciAqIG91dG5hbWUsIAotCQkJICBpbnQgYXJnYywgY2hhciAqYXJndltdICkKLXsKLSAgICBjaGFyIGJ1ZmZlclsxMDI0XTsKLSAgICBpbnQgaTsKLQotICAgIC8qIEZpbGUgaGVhZGVyICovCi0KLSAgICBmcHJpbnRmKCBvdXRmaWxlLCAiLyogRmlsZSBnZW5lcmF0ZWQgYXV0b21hdGljYWxseS4gRG8gbm90IGVkaXQhICovXG5cbiIgKTsKLSAgICBmcHJpbnRmKCBvdXRmaWxlLCAiXHQudGV4dFxuIiApOwotCi0gICAgLyoKLSAgICAgKiBUaHJvdyBpbiBhIGNvdXBsZSBvZiBzdGFicy4gIFRoZSBpbnRlcm5hbCBkZWJ1Z2dlciBkb2Vzbid0IHJlYWxseQotICAgICAqIGNhcmUgYWJvdXQgdHJ5aW5nIHRvIHN0ZXAgdGhyb3VnaCB0aGlzIGNyYXAsIGJ1dCB3ZSB1c2UgdGhlIGZpbGUKLSAgICAgKiBuYW1lcyBhcyBhbiBpbmRpY2F0aW9uIHRoYXQgd2Ugc2hvdWxkIGp1c3Qgc3RlcCB0aHJvdWdoIGl0IHRvIHdoYXRldmVyCi0gICAgICogaXMgb24gdGhlIG90aGVyIHNpZGUuCi0gICAgICovCi0jaWZkZWYgVVNFX1NUQUJTCi0gICAgZnByaW50Ziggb3V0ZmlsZSwgIlx0LmZpbGVcdFwiJXNcIlxuIiwgb3V0bmFtZSApOwotICAgIGdldGN3ZChidWZmZXIsIHNpemVvZihidWZmZXIpKTsKLQotICAgIC8qCi0gICAgICogVGhlIHN0YWJzIGhlbHAgdGhlIGludGVybmFsIGRlYnVnZ2VyIGFzIHRoZXkgYXJlIGFuIGluZGljYXRpb24gdGhhdCBpdAotICAgICAqIGlzIHNlbnNpYmxlIHRvIHN0ZXAgaW50byBhIHRodW5rL3RyYW1wb2xpbmUuCi0gICAgICovCi0gICAgZnByaW50Ziggb3V0ZmlsZSwgIi5zdGFicyBcIiVzL1wiLDEwMCwwLDAsQ29kZV9TdGFydFxuIiwgYnVmZmVyKTsKLSAgICBmcHJpbnRmKCBvdXRmaWxlLCAiLnN0YWJzIFwiJXNcIiwxMDAsMCwwLENvZGVfU3RhcnRcbiIsIG91dG5hbWUpOwotICAgIGZwcmludGYoIG91dGZpbGUsICJcdC50ZXh0XG4iICk7Ci0gICAgZnByaW50Ziggb3V0ZmlsZSwgIlx0LmFsaWduIDRcbiIgKTsKLSAgICBmcHJpbnRmKCBvdXRmaWxlLCAiQ29kZV9TdGFydDpcblxuIiApOwotI2VuZGlmCi0KICAgICAvKiBCdWlsZCB0aGUgMzItYml0IGxhcmdlIHN0YWNrIGNhbGxiYWNrICovCiAKICAgICBCdWlsZENhbGwzMkxhcmdlU3RhY2soIG91dGZpbGUgKTsKIAotICAgIC8qIEJ1aWxkIHRoZSBjYWxsYmFjayBmdW5jdGlvbnMgKi8KLQotICAgIGZvciAoaSA9IDI7IGkgPCBhcmdjOyBpKyspIEJ1aWxkQ2FsbFRvMzJGdW5jKCBvdXRmaWxlLCBhdG9pKGFyZ3ZbaV0pICk7Ci0KICNpZmRlZiBVU0VfU1RBQlMKICAgICBmcHJpbnRmKCBvdXRmaWxlLCAiXHQudGV4dFxuIik7CiAgICAgZnByaW50Ziggb3V0ZmlsZSwgIlx0LnN0YWJzIFwiXCIsMTAwLDAsMCwuTGV0ZXh0XG4iKTsKQEAgLTI2NTMsMTEgKzI1NjQsMTEgQEAKICAqLwogc3RhdGljIHZvaWQgdXNhZ2Uodm9pZCkKIHsKLSAgICBmcHJpbnRmKHN0ZGVyciwgInVzYWdlOiBidWlsZCBbLW8gb3V0ZmlsZV0gLXNwZWMgU1BFQ05BTUVTXG4iCi0gICAgICAgICAgICAgICAgICAgICIgICAgICAgYnVpbGQgWy1vIG91dGZpbGVdIC1jYWxsZnJvbTE2IEZVTkNUSU9OX1BST0ZJTEVTXG4iCi0gICAgICAgICAgICAgICAgICAgICIgICAgICAgYnVpbGQgWy1vIG91dGZpbGVdIC1jYWxsdG8xNiBGVU5DVElPTl9QUk9GSUxFU1xuIgotICAgICAgICAgICAgICAgICAgICAiICAgICAgIGJ1aWxkIFstbyBvdXRmaWxlXSAtY2FsbGZyb20zMiBGVU5DVElPTl9QUk9GSUxFU1xuIgotICAgICAgICAgICAgICAgICAgICAiICAgICAgIGJ1aWxkIFstbyBvdXRmaWxlXSAtY2FsbHRvMzIgRlVOQ1RJT05fUFJPRklMRVNcbiIpOworICAgIGZwcmludGYoIHN0ZGVyciwKKyAgICAgICAgICAgICAidXNhZ2U6IGJ1aWxkIFstbyBvdXRmaWxlXSAtc3BlYyBTUEVDTkFNRVNcbiIKKyAgICAgICAgICAgICAiICAgICAgIGJ1aWxkIFstbyBvdXRmaWxlXSAtY2FsbGZyb20xNiBGVU5DVElPTl9QUk9GSUxFU1xuIgorICAgICAgICAgICAgICIgICAgICAgYnVpbGQgWy1vIG91dGZpbGVdIC1jYWxsdG8xNiBGVU5DVElPTl9QUk9GSUxFU1xuIgorICAgICAgICAgICAgICIgICAgICAgYnVpbGQgWy1vIG91dGZpbGVdIC1jYWxsZnJvbTMyIEZVTkNUSU9OX1BST0ZJTEVTXG4iICk7CiAgICAgZXhpdCgxKTsKIH0KIApAQCAtMjY5NCw4ICsyNjA1LDYgQEAKICAgICAgICAgcmVzID0gQnVpbGRDYWxsVG8xNiggb3V0ZmlsZSwgb3V0bmFtZSwgYXJnYywgYXJndiApOwogICAgIGVsc2UgaWYgKCFzdHJjbXAoIGFyZ3ZbMV0sICItY2FsbGZyb20zMiIgKSkKICAgICAgICAgcmVzID0gQnVpbGRDYWxsRnJvbTMyKCBvdXRmaWxlLCBvdXRuYW1lLCBhcmdjLCBhcmd2ICk7Ci0gICAgZWxzZSBpZiAoIXN0cmNtcCggYXJndlsxXSwgIi1jYWxsdG8zMiIgKSkKLSAgICAgICAgcmVzID0gQnVpbGRDYWxsVG8zMiggb3V0ZmlsZSwgb3V0bmFtZSwgYXJnYywgYXJndiApOwogICAgIGVsc2UKICAgICB7CiAgICAgICAgIGZjbG9zZSggb3V0ZmlsZSApOwpkaWZmIC0tZ2l0IGEvdG9vbHMvbWFrZWRlcC5jIGIvdG9vbHMvbWFrZWRlcC5jCmluZGV4IDk1MTFmODAuLjJiYjY1NTIgMTAwNjQ0Ci0tLSBhL3Rvb2xzL21ha2VkZXAuYworKysgYi90b29scy9tYWtlZGVwLmMKQEAgLTI1Nyw2ICsyNTcsNDMgQEAKIAogCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogICAgICAgICBvdXRwdXRfc3JjCisgKi8KK3N0YXRpYyB2b2lkIG91dHB1dF9zcmMoIEZJTEUgKmZpbGUsIElOQ0xfRklMRSAqcEZpbGUsIGludCAqY29sdW1uICkKK3sKKyAgICBjaGFyICpuYW1lID0gc3RycmNociggcEZpbGUtPm5hbWUsICcvJyApOworICAgIGNoYXIgKm9iaiA9IHhzdHJkdXAoIG5hbWUgPyBuYW1lICsgMSA6IHBGaWxlLT5uYW1lICk7CisgICAgY2hhciAqZXh0ID0gc3RycmNociggb2JqLCAnLicgKTsKKyAgICBpZiAoZXh0KQorICAgIHsKKyAgICAgICAgaWYgKCFzdHJjbXAoIGV4dCwgIi55IiApKSAgLyogeWFjYyBmaWxlICovCisgICAgICAgIHsKKyAgICAgICAgICAgIGZwcmludGYoIGZpbGUsICJ5LnRhYi5vOiAuL3kudGFiLmMiICk7CisgICAgICAgICAgICAqY29sdW1uICs9IDE4OworICAgICAgICB9CisgICAgICAgIGVsc2UgaWYgKCFzdHJjbXAoIGV4dCwgIi5sIiApKSAgLyogbGV4IGZpbGUgKi8KKyAgICAgICAgeworICAgICAgICAgICAgZnByaW50ZiggZmlsZSwgImxleC55eS5vOiAuL2xleC55eS5jIiApOworICAgICAgICAgICAgKmNvbHVtbiArPSAyMDsKKyAgICAgICAgfQorICAgICAgICBlbHNlIGlmICghc3RyY21wKCBleHQsICIucmMiICkpICAvKiByZXNvdXJjZSBmaWxlICovCisgICAgICAgIHsKKyAgICAgICAgICAgICpleHQgPSAnXDAnOworICAgICAgICAgICAgZnByaW50ZiggZmlsZSwgIiVzLmMgJXMuaDogJXMiLCBvYmosIG9iaiwgcEZpbGUtPmZpbGVuYW1lICk7CisgICAgICAgICAgICAqY29sdW1uICs9IDIgKiBzdHJsZW4ob2JqKSArIHN0cmxlbihwRmlsZS0+ZmlsZW5hbWUpICsgNzsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIHN0cmNweSggZXh0LCAiLm8iICk7CisgICAgICAgICAgICBmcHJpbnRmKCBmaWxlLCAiJXM6ICVzIiwgb2JqLCBwRmlsZS0+ZmlsZW5hbWUgKTsKKyAgICAgICAgICAgICpjb2x1bW4gKz0gc3RybGVuKG9iaikgKyBzdHJsZW4ocEZpbGUtPmZpbGVuYW1lKSArIDI7CisgICAgICAgIH0KKyAgICB9CisgICAgZnJlZSggb2JqICk7Cit9CisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICAqICAgICAgICAgb3V0cHV0X2RlcGVuZGVuY2llcwogICovCiBzdGF0aWMgdm9pZCBvdXRwdXRfZGVwZW5kZW5jaWVzKHZvaWQpCkBAIC0yODMsMTMgKzMyMCw4IEBACiAgICAgfQogICAgIGZvciggcEZpbGUgPSBmaXJzdFNyYzsgcEZpbGU7IHBGaWxlID0gcEZpbGUtPm5leHQpCiAgICAgewotICAgICAgICBjaGFyICpuYW1lID0gc3RycmNociggcEZpbGUtPm5hbWUsICcvJyApOwotICAgICAgICBjaGFyICpvYmogPSB4c3RyZHVwKCBuYW1lID8gbmFtZSArIDEgOiBwRmlsZS0+bmFtZSApOwotICAgICAgICBjaGFyICpleHQgPSBzdHJyY2hyKCBvYmosICcuJyApOwotICAgICAgICBpZiAoZXh0KSBzdHJjcHkoIGV4dCwgIi5vIiApOwotICAgICAgICBmcHJpbnRmKCBmaWxlLCAiJXM6ICVzIiwgb2JqLCBwRmlsZS0+ZmlsZW5hbWUgKTsKLSAgICAgICAgY29sdW1uID0gc3RybGVuKG9iaikgKyBzdHJsZW4ocEZpbGUtPmZpbGVuYW1lKSArIDI7Ci0gICAgICAgIGZyZWUoIG9iaiApOworICAgICAgICBjb2x1bW4gPSAwOworICAgICAgICBvdXRwdXRfc3JjKCBmaWxlLCBwRmlsZSwgJmNvbHVtbiApOwogICAgICAgICBmb3IgKGkgPSAwOyBpIDwgTUFYX0lOQ0xVREVTOyBpKyspCiAgICAgICAgICAgICBpZiAocEZpbGUtPmZpbGVzW2ldKSBvdXRwdXRfaW5jbHVkZSggZmlsZSwgcEZpbGUtPmZpbGVzW2ldLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBGaWxlLCAmY29sdW1uICk7CmRpZmYgLS1naXQgYS93aW4zMi9jb2RlX3BhZ2UuYyBiL3dpbjMyL2NvZGVfcGFnZS5jCmluZGV4IDdhMTA2MTguLjgyY2FmNzIgMTAwNjQ0Ci0tLSBhL3dpbjMyL2NvZGVfcGFnZS5jCisrKyBiL3dpbjMyL2NvZGVfcGFnZS5jCkBAIC04OSwxMiArODksMTIgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBXQ0hBUiAqZHN0LCBpbnQgZHN0bGVuKQogewogICAgIGlmIChzcmNsZW4gPT0gLTEpCi0gICAJIHNyY2xlbiA9IGxzdHJsZW4zMkEoc3JjKTsKKyAgIAkgc3JjbGVuID0gbHN0cmxlbjMyQShzcmMpKzE7CiAgICAgaWYgKCFkc3QpCiAgICAgICAgICByZXR1cm4gc3JjbGVuKjI7CiAKICAgICBsc3RyY3B5bkF0b1coZHN0LHNyYyxzcmNsZW4pOyAvKiBGSVhNRSAqLwotICAgIHJldHVybiBzcmNsZW4qMjsKKyAgICByZXR1cm4gc3JjbGVuKjItMjsKIH0KIAogaW50IFdJTkFQSSBXaWRlQ2hhclRvTXVsdGlCeXRlKFVJTlQzMiBwYWdlLCBEV09SRCBmbGFncywgV0NIQVIgKnNyYywgaW50IHNyY2xlbiwKZGlmZiAtLWdpdCBhL3dpbjMyL29yZGluYWxzLmMgYi93aW4zMi9vcmRpbmFscy5jCmluZGV4IDI4ZjA5OGYuLjU3NmQyNWIgMTAwNjQ0Ci0tLSBhL3dpbjMyL29yZGluYWxzLmMKKysrIGIvd2luMzIvb3JkaW5hbHMuYwpAQCAtMzQsMTAgKzM0LDkgQEAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgKiAgICAgICAgICAgX0tFUk5FTDMyXzg4CiAgKi8KLURXT1JEIFdJTkFQSSBXT1czMl8xKERXT1JEIHgsRFdPUkQgeSkKK0JPT0wzMiBXSU5BUEkgV09XMzJfMShTRUdQVFIgc2VncHRyLExQTERUX0VOVFJZIGxkdGVudCkKIHsKLSAgICBmcHJpbnRmKHN0ZGVyciwiV09XMzJfMSgweCUwOGx4LDB4JTA4bHgpLCBzdHViIVxuIix4LHkpOwotICAgIHJldHVybiAwOworICAgIHJldHVybiBHZXRUaHJlYWRTZWxlY3RvckVudHJ5KEdldEN1cnJlbnRUaHJlYWRJZCgpLHNlZ3B0cj4+MTYsbGR0ZW50KTsKIH0KIAogCkBAIC0xMjksMyArMTI4LDEzIEBACiAJZnByaW50ZihzdGRlcnIsIktFUk5FTDMyXzM0KCksIFNUVUIgcmV0dXJuaW5nIDBcbiIpOwogCXJldHVybiAwOwogfQorCitCT09MMzIgV0lOQVBJIF9LRVJORUwzMl85OShIQU5ETEUzMiB0aHJlYWRpZCxEV09SRCBleGl0Y29kZSxEV09SRCB4KSB7CisJZnByaW50ZihzdGRlcnIsIktFUk5FTDMyXzk5KCVkLCVsZCwweCUwOGx4KSxzdHViXG4iLHRocmVhZGlkLGV4aXRjb2RlLHgpOworCXJldHVybiBUUlVFOworfQorCitEV09SRCBXSU5BUEkgX0tFUk5FTDMyXzk4KERXT1JEIHgpIHsKKwlmcHJpbnRmKHN0ZGVyciwiS0VSTkVMMzJfOTgoMHglMDhseCksc3R1YlxuIix4KTsKKwlyZXR1cm4gMTsKK30KZGlmZiAtLWdpdCBhL3dpbjMyL3Byb2Nlc3MuYyBiL3dpbjMyL3Byb2Nlc3MuYwppbmRleCA2ODIwMjY5Li41YjI2YTUyIDEwMDY0NAotLS0gYS93aW4zMi9wcm9jZXNzLmMKKysrIGIvd2luMzIvcHJvY2Vzcy5jCkBAIC0zMzksOSArMzM5LDggQEAKIAlyZXR1cm4gMDsKIH0KIAotCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqICAgICAgICAgICBXYWl0Rm9yTXVsdGlwbGVPYmplY3RzICAgIChVU0VSMzIuMzk5KQorICogICAgICAgICAgIE1zZ1dhaXRGb3JNdWx0aXBsZU9iamVjdHMgICAgKFVTRVIzMi4zOTkpCiAgKi8KIERXT1JEIFdJTkFQSSBNc2dXYWl0Rm9yTXVsdGlwbGVPYmplY3RzKAogCURXT1JEIG5Db3VudCxIQU5ETEUzMiAqcEhhbmRsZXMsQk9PTDMyIGZXYWl0QWxsLERXT1JEIGR3TWlsbGlzZWNvbmRzLApAQCAtMzU0LDYgKzM1MywxNiBAQAogCWZwcmludGYoc3RkZXJyLCJdLCVkLCVsZCwweCUwOGx4KVxuIixmV2FpdEFsbCxkd01pbGxpc2Vjb25kcyxkd1dha2VNYXNrKTsKIAlyZXR1cm4gMDsKIH0KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiAgICAgICAgICAgV2FpdEZvck11bHRpcGxlT2JqZWN0cyAgICAoS0VSTkVMMzIpCisgKi8KK0RXT1JEIFdJTkFQSSBXYWl0Rm9yTXVsdGlwbGVPYmplY3RzKAorCURXT1JEIG5Db3VudCxIQU5ETEUzMiAqcEhhbmRsZXMsQk9PTDMyIGZXYWl0QWxsLERXT1JEIGR3TWlsbGlzZWNvbmRzCispIHsKKwlyZXR1cm4gTXNnV2FpdEZvck11bHRpcGxlT2JqZWN0cyhuQ291bnQscEhhbmRsZXMsZldhaXRBbGwsZHdNaWxsaXNlY29uZHMsMCk7Cit9CisKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogICogICAgICAgICAgIER1cGxpY2F0ZUhhbmRsZSAgICAoS0VSTkVMMzIuNzgpCiAgKi8KZGlmZiAtLWdpdCBhL3dpbmRvd3MvZGlhbG9nLmMgYi93aW5kb3dzL2RpYWxvZy5jCmluZGV4IDMxY2Q4ODAuLmI1NmY2ODQgMTAwNjQ0Ci0tLSBhL3dpbmRvd3MvZGlhbG9nLmMKKysrIGIvd2luZG93cy9kaWFsb2cuYwpAQCAtNTAyLDEwICs1MDIsMTYgQEAKICAgICB7CiAgICAgICAgICAgLyogVGhlIGZvbnQgaGVpZ2h0IG11c3QgYmUgbmVnYXRpdmUgYXMgaXQgaXMgYSBwb2ludCBzaXplICovCiAgICAgICAgICAgLyogKHNlZSBDcmVhdGVGb250KCkgZG9jdW1lbnRhdGlvbiBpbiB0aGUgV2luZG93cyBTREspLiAgICovCi0JaEZvbnQgPSBDcmVhdGVGb250MTYoIC10ZW1wbGF0ZS5wb2ludFNpemUsIDAsIDAsIDAsIEZXX0RPTlRDQVJFLAorCWlmICh3aW4zMlRlbXBsYXRlKQorCSAgICBoRm9udCA9IENyZWF0ZUZvbnQxNiggLXRlbXBsYXRlLnBvaW50U2l6ZSwgMCwgMCwgMCwgRldfRE9OVENBUkUsCiAJCQkgICAgRkFMU0UsIEZBTFNFLCBGQUxTRSwgREVGQVVMVF9DSEFSU0VULCAwLCAwLAogCQkJICAgIFBST09GX1FVQUxJVFksIEZGX0RPTlRDQVJFLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRlbXBsYXRlLmZhY2VOYW1lICk7ICAvKiBGSVhNRTogd2luMzIgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB0ZW1wbGF0ZS5mYWNlTmFtZSApOworCWVsc2UKKwkgICAgaEZvbnQgPSBDcmVhdGVGb250MzJXKCAtdGVtcGxhdGUucG9pbnRTaXplLCAwLCAwLCAwLCBGV19ET05UQ0FSRSwKKwkJCSAgICBGQUxTRSwgRkFMU0UsIEZBTFNFLCBERUZBVUxUX0NIQVJTRVQsIDAsIDAsCisJCQkgICAgUFJPT0ZfUVVBTElUWSwgRkZfRE9OVENBUkUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGVtcGxhdGUuZmFjZU5hbWUgKTsKIAlpZiAoaEZvbnQpCiAJewogCSAgICBURVhUTUVUUklDMTYgdG07CkBAIC01NjIsMTcgKzU2OCwxOCBAQAogICAgICAgICB9CiAgICAgfQogCi0gICAgaWYgKHByb2NUeXBlICE9IFdJTl9QUk9DXzE2KQorICAgIGlmIChwcm9jVHlwZSA9PSBXSU5fUFJPQ18xNikKKyAgICAgICAgaHduZCA9IENyZWF0ZVdpbmRvd0V4MTYodGVtcGxhdGUuZXhTdHlsZSwgdGVtcGxhdGUuY2xhc3NOYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0ZW1wbGF0ZS5jYXB0aW9uLCB0ZW1wbGF0ZS5zdHlsZSAmIH5XU19WSVNJQkxFLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWN0LmxlZnQsIHJlY3QudG9wLCByZWN0LnJpZ2h0LCByZWN0LmJvdHRvbSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3duZXIsIGhNZW51LCBoSW5zdCwgTlVMTCApOworICAgIGVsc2UKICAgICAgICAgaHduZCA9IENyZWF0ZVdpbmRvd0V4MzJXKHRlbXBsYXRlLmV4U3R5bGUsIChMUENXU1RSKXRlbXBsYXRlLmNsYXNzTmFtZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChMUENXU1RSKXRlbXBsYXRlLmNhcHRpb24sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0ZW1wbGF0ZS5zdHlsZSAmIH5XU19WSVNJQkxFLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVjdC5sZWZ0LCByZWN0LnRvcCwgcmVjdC5yaWdodCwgcmVjdC5ib3R0b20sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvd25lciwgaE1lbnUsIGhJbnN0LCBOVUxMICk7Ci0gICAgZWxzZQotICAgICAgICBod25kID0gQ3JlYXRlV2luZG93RXgzMkEodGVtcGxhdGUuZXhTdHlsZSwgdGVtcGxhdGUuY2xhc3NOYW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0ZW1wbGF0ZS5jYXB0aW9uLCB0ZW1wbGF0ZS5zdHlsZSAmIH5XU19WSVNJQkxFLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWN0LmxlZnQsIHJlY3QudG9wLCByZWN0LnJpZ2h0LCByZWN0LmJvdHRvbSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3duZXIsIGhNZW51LCBoSW5zdCwgTlVMTCApOworCQogICAgIGlmICghaHduZCkKICAgICB7CiAJaWYgKGhGb250KSBEZWxldGVPYmplY3QzMiggaEZvbnQgKTsKZGlmZiAtLWdpdCBhL3dpbmRvd3MvZXZlbnQuYyBiL3dpbmRvd3MvZXZlbnQuYwppbmRleCBjODQzZWM5Li5jYjZkY2I4IDEwMDY0NAotLS0gYS93aW5kb3dzL2V2ZW50LmMKKysrIGIvd2luZG93cy9ldmVudC5jCkBAIC03NzUsNiArNzc1LDcgQEAKIAkvKiBGaWxsIFdJTkRPV1BPUyBzdHJ1Y3QgKi8KIAl3aW5wb3MuZmxhZ3MgPSBTV1BfTk9BQ1RJVkFURSB8IFNXUF9OT1pPUkRFUjsKIAl3aW5wb3MuaHduZCA9IGh3bmQ7CisgICAgICAgIC8qIEZJWE1FOiBwb3NpdGlvbiBzaG91bGQgYmUgcmVsYXRpdmUgdG8gcm9vdCB3aW5kb3cgKi8KIAl3aW5wb3MueCA9IGV2ZW50LT54OwogCXdpbnBvcy55ID0gZXZlbnQtPnk7CiAJd2lucG9zLmN4ID0gZXZlbnQtPndpZHRoOwpkaWZmIC0tZ2l0IGEvd2luZG93cy9ob29rLmMgYi93aW5kb3dzL2hvb2suYwppbmRleCA1NWU1Nzg1Li41OTRkZDFhIDEwMDY0NAotLS0gYS93aW5kb3dzL2hvb2suYworKysgYi93aW5kb3dzL2hvb2suYwpAQCAtMTcsNyArMTcsNiBAQAogI2luY2x1ZGUgIndpbmRvd3MuaCIKICNpbmNsdWRlICJob29rLmgiCiAjaW5jbHVkZSAicXVldWUuaCIKLSNpbmNsdWRlICJzdGFja2ZyYW1lLmgiCiAjaW5jbHVkZSAidXNlci5oIgogI2luY2x1ZGUgImhlYXAuaCIKICNpbmNsdWRlICJzdHJ1Y3QzMi5oIgpAQCAtNjk2LDcgKzY5NSw3IEBACiAJfQogCWVsc2UKIAkgIGxwY2J0Y3dXLT5scGNzLT5scHN6Q2xhc3MgPSAoTFBDV1NUUilscGNidGN3QS0+bHBjcy0+bHBzekNsYXNzOwotCSpwbFBhcmFtID0gbHBjYnRjd1c7CisJKnBsUGFyYW0gPSAoTFBBUkFNKWxwY2J0Y3dXOwogICAgIH0KICAgICByZXR1cm47CiB9CkBAIC03NTAsNyArNzQ5LDcgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxwY2J0Y3dXLT5scGNzLT5scHN6Q2xhc3MgKTsKIAllbHNlCiAJICBscGNidGN3QS0+bHBjcy0+bHBzekNsYXNzID0gKExQU1RSKWxwY2J0Y3dXLT5scGNzLT5scHN6Q2xhc3M7Ci0JKnBsUGFyYW0gPSBscGNidGN3QTsKKwkqcGxQYXJhbSA9IChMUEFSQU0pbHBjYnRjd0E7CiAgICAgfQogICAgIHJldHVybjsKIH0KQEAgLTk2Myw3ICs5NjIsNiBAQAogICAgIEhBTkRMRTE2IHByZXZIb29rOwogICAgIEhPT0tEQVRBICpkYXRhID0gKEhPT0tEQVRBICopVVNFUl9IRUFQX0xJTl9BRERSKGhvb2spOwogICAgIExSRVNVTFQgcmV0OwotICAgIFdPUkQgb2xkX2RzOwogCiAgICAgV1BBUkFNMzIgd1BhcmFtT3JpZyA9IHdQYXJhbTsKICAgICBMUEFSQU0gbFBhcmFtT3JpZyA9IGxQYXJhbTsKQEAgLTk4NiwxMSArOTg0LDcgQEAKICAgICBkcHJpbnRmX2hvb2soIHN0ZGRlYiwgIkNhbGxpbmcgaG9vayAlMDR4OiAlZCAlMDh4ICUwOGx4XG4iLAogICAgICAgICAgICAgICAgICAgaG9vaywgY29kZSwgd1BhcmFtLCBsUGFyYW0gKTsKIAotICAgIC8qIFNldCBEUyA9IFNTIHRvIGNhbGwgaG9vayBwcm9jZWR1cmUgKi8KLSAgICBvbGRfZHMgPSBDVVJSRU5UX0RTOwotICAgIENVUlJFTlRfRFMgPSBTRUxFQ1RPUk9GKElGMTYzMl9TYXZlZDE2X3NzX3NwKTsKICAgICByZXQgPSBkYXRhLT5wcm9jKGNvZGUsIHdQYXJhbSwgbFBhcmFtKTsKLSAgICBDVVJSRU5UX0RTID0gb2xkX2RzOwogCiAgICAgZHByaW50Zl9ob29rKCBzdGRkZWIsICJSZXQgaG9vayAlMDR4ID0gJTA4bHhcbiIsIGhvb2ssIHJldCApOwogCmRpZmYgLS1naXQgYS93aW5kb3dzL2tleWJvYXJkLmMgYi93aW5kb3dzL2tleWJvYXJkLmMKaW5kZXggOTQyMTczNy4uMjI5ZWY1OSAxMDA2NDQKLS0tIGEvd2luZG93cy9rZXlib2FyZC5jCisrKyBiL3dpbmRvd3Mva2V5Ym9hcmQuYwpAQCAtNjAwLDYzICs2MDAsMzMgQEAKICAgICByZXR1cm4gR2V0QXN5bmNLZXlTdGF0ZTMyKG5LZXkpOwogfQogCi0KLQogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCQkJVHJhbnNsYXRlQWNjZWxlcmF0b3IgCVtVU0VSLjE3OF0KKyAqCQkJVHJhbnNsYXRlQWNjZWxlcmF0b3IgCVtVU0VSLjE3OF1bVVNFUjMyLjU1MS4uXQogICoKICAqIEZJWE1FOiBzaG91bGQgc2VuZCBzb21lIFdNX0lOSVRNRU5VIG9yL2FuZCBXTV9JTklUTUVOVVBPUFVQICAtbWVzc2FnZXMKICAqLwotSU5UMzIgV0lOQVBJIFRyYW5zbGF0ZUFjY2VsZXJhdG9yMzIoSFdORDMyIGhXbmQsIEhBQ0NFTDMyIGhBY2NlbCwgTFBNU0czMiBtc2cpCitzdGF0aWMgQk9PTDMyIEtCRF90cmFuc2xhdGVfYWNjZWxlcmF0b3IoSFdORDMyIGhXbmQsTFBNU0czMiBtc2csCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQllURSBmVmlydCxXT1JEIGtleSxXT1JEIGNtZCkKIHsKLSAgICBNU0cxNgltc2cxNjsKKyAgICBCT09MMzIJc2VuZG1zZyA9IEZBTFNFOwogCi0gICAgU1RSVUNUMzJfTVNHMzJ0bzE2KG1zZywmbXNnMTYpOwotICAgIHJldHVybiBUcmFuc2xhdGVBY2NlbGVyYXRvcjE2KGhXbmQsaEFjY2VsLCZtc2cxNik7Ci19Ci0JCi1JTlQxNiBXSU5BUEkgVHJhbnNsYXRlQWNjZWxlcmF0b3IxNihIV05EMTYgaFduZCwgSEFDQ0VMMTYgaEFjY2VsLCBMUE1TRzE2IG1zZykKLXsKLSAgICBBQ0NFTEhFQURFUgkqbHBBY2NlbFRibDsKLSAgICBpbnQgCWk7Ci0gICAgQk9PTDMyIHNlbmRtc2c7Ci0gICAgCi0gICAgaWYgKGhBY2NlbCA9PSAwIHx8IG1zZyA9PSBOVUxMKSByZXR1cm4gMDsKLSAgICBpZiAobXNnLT5tZXNzYWdlICE9IFdNX0tFWURPV04gJiYKLSAgICAJbXNnLT5tZXNzYWdlICE9IFdNX0tFWVVQICYmCi0JbXNnLT5tZXNzYWdlICE9IFdNX1NZU0tFWURPV04gJiYKLQltc2ctPm1lc3NhZ2UgIT0gV01fU1lTS0VZVVAgJiYKLSAgICAJbXNnLT5tZXNzYWdlICE9IFdNX0NIQVIpIHJldHVybiAwOwotCi0gICAgZHByaW50Zl9hY2NlbChzdGRkZWIsICJUcmFuc2xhdGVBY2NlbGVyYXRvcnMgaEFjY2VsPSUwNHgsIGhXbmQ9JTA0eCxcCi1tc2ctPmh3bmQ9JTA0eCwgbXNnLT5tZXNzYWdlPSUwNHhcbiIsIGhBY2NlbCxoV25kLG1zZy0+aHduZCxtc2ctPm1lc3NhZ2UpOwotCi0gICAgbHBBY2NlbFRibCA9IChMUEFDQ0VMSEVBREVSKUdsb2JhbExvY2sxNihoQWNjZWwpOwotICAgIGZvciAoc2VuZG1zZz0gaSA9IDA7IGkgPCBscEFjY2VsVGJsLT53Q291bnQ7IGkrKykgCisgICAgaWYobXNnLT53UGFyYW0gPT0ga2V5KSAKICAgICB7Ci0gICAgIGlmKG1zZy0+d1BhcmFtID09IGxwQWNjZWxUYmwtPnRibFtpXS53RXZlbnQpIAotICAgICB7Ci0gICAgICBpZiAobXNnLT5tZXNzYWdlID09IFdNX0NIQVIpIAotICAgICAgewotICAgICAgICBpZiAoICEobHBBY2NlbFRibC0+dGJsW2ldLnR5cGUgJiBBTFRfQUNDRUwpICYmIAotICAgICAgICAgICAgICEobHBBY2NlbFRibC0+dGJsW2ldLnR5cGUgJiBWSVJUS0VZX0FDQ0VMKSApCisgICAgCWlmIChtc2ctPm1lc3NhZ2UgPT0gV01fQ0hBUikgeworICAgICAgICBpZiAoICEoZlZpcnQgJiBGQUxUKSAmJiAhKGZWaXJ0ICYgRlZJUlRLRVkpICkKICAgICAgICAgewogICAgCSAgZHByaW50Zl9hY2NlbChzdGRkZWIsImZvdW5kIGFjY2VsIGZvciBXTV9DSEFSOiAoJyVjJykiLG1zZy0+d1BhcmFtJjB4ZmYpOwogICAgCSAgc2VuZG1zZz1UUlVFOwogICAgCX0gIAotICAgICAgfQotICAgICAgZWxzZQotICAgICAgewotICAgICAgIGlmKGxwQWNjZWxUYmwtPnRibFtpXS50eXBlICYgVklSVEtFWV9BQ0NFTCkgCi0gICAgICAgeworICAgICAgfSBlbHNlIHsKKyAgICAgICBpZihmVmlydCAmIEZWSVJUS0VZKSB7CiAJSU5UMzIgbWFzayA9IDA7CiAgICAgICAgIGRwcmludGZfYWNjZWwoc3RkZGViLCJmb3VuZCBhY2NlbCBmb3IgdmlydF9rZXkgJTA0eCAoc2NhbiAlMDR4KSIsCiAgIAkgICAgICAgICAgICAgICAgICAgICAgIG1zZy0+d1BhcmFtLDB4ZmYgJiBISVdPUkQobXNnLT5sUGFyYW0pKTsgICAgICAgICAgICAgICAgCi0JaWYoR2V0S2V5U3RhdGUzMihWS19TSElGVCkgJiAweDgwMDApIG1hc2sgfD0gU0hJRlRfQUNDRUw7Ci0JaWYoR2V0S2V5U3RhdGUzMihWS19DT05UUk9MKSAmIDB4ODAwMCkgbWFzayB8PSBDT05UUk9MX0FDQ0VMOwotCWlmKEdldEtleVN0YXRlMzIoVktfTUVOVSkgJiAweDgwMDApIG1hc2sgfD0gQUxUX0FDQ0VMOwotCWlmKG1hc2sgPT0gKGxwQWNjZWxUYmwtPnRibFtpXS50eXBlICYKLQkJCSAgICAoU0hJRlRfQUNDRUwgfCBDT05UUk9MX0FDQ0VMIHwgQUxUX0FDQ0VMKSkpCisJaWYoR2V0S2V5U3RhdGUzMihWS19TSElGVCkgJiAweDgwMDApIG1hc2sgfD0gRlNISUZUOworCWlmKEdldEtleVN0YXRlMzIoVktfQ09OVFJPTCkgJiAweDgwMDApIG1hc2sgfD0gRkNPTlRST0w7CisJaWYoR2V0S2V5U3RhdGUzMihWS19NRU5VKSAmIDB4ODAwMCkgbWFzayB8PSBGQUxUOworCWlmKG1hc2sgPT0gKGZWaXJ0ICYgKEZTSElGVCB8IEZDT05UUk9MIHwgRkFMVCkpKQogICAgICAgICAgIHNlbmRtc2c9VFJVRTsJCQkgICAgCiAgICAgICAgIGVsc2UKICAgICAgICAgICBkcHJpbnRmX2FjY2VsKHN0ZGRlYiwiLCBidXQgaW5jb3JyZWN0IFNISUZUL0NUUkwvQUxULXN0YXRlXG4iKTsKQEAgLTY2NSw3ICs2MzUsNyBAQAogICAgICAgIHsKICAgICAgICAgIGlmICghKG1zZy0+bFBhcmFtICYgMHgwMTAwMDAwMCkpICAvKiBubyBzcGVjaWFsX2tleSAqLwogICAgICAgICAgewotICAgICAgICAgICBpZiAoKGxwQWNjZWxUYmwtPnRibFtpXS50eXBlICYgQUxUX0FDQ0VMKSAmJiAobXNnLT5sUGFyYW0gJiAweDIwMDAwMDAwKSkKKyAgICAgICAgICAgaWYgKChmVmlydCAmIEZBTFQpICYmIChtc2ctPmxQYXJhbSAmIDB4MjAwMDAwMDApKQogICAgICAgICAgICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogXl4gQUxUIHByZXNzZWQgKi8KIAkgICAgZHByaW50Zl9hY2NlbChzdGRkZWIsImZvdW5kIGFjY2VsIGZvciBBbHQtJWMiLCBtc2ctPndQYXJhbSYweGZmKTsKIAkgICAgc2VuZG1zZz1UUlVFOwkgICAgCkBAIC02ODIsMTAgKzY1MiwxMCBAQAogICAgICAgICBpZiAobXNnLT5tZXNzYWdlID09IFdNX0tFWVVQIHx8IG1zZy0+bWVzc2FnZSA9PSBXTV9TWVNLRVlVUCkKICAgICAgICAgICBtZXNnPTE7CiAgICAgICAgIGVsc2UgCi0gICAgICAgICBpZiAoR2V0Q2FwdHVyZTE2KCkpCisgICAgICAgICBpZiAoR2V0Q2FwdHVyZTMyKCkpCiAgICAgICAgICAgIG1lc2c9MjsKICAgICAgICAgIGVsc2UKLSAgICAgICAgICBpZiAoIUlzV2luZG93RW5hYmxlZDE2KGhXbmQpKQorICAgICAgICAgIGlmICghSXNXaW5kb3dFbmFibGVkMzIoaFduZCkpCiAgICAgICAgICAgICBtZXNnPTM7CiAgICAgICAgICAgZWxzZQogICAgICAgICAgIHsKQEAgLTY5Myw5ICs2NjMsOSBAQAogCiAgICAgICAgICAgICBoTWVudSA9ICh3bmRQdHItPmR3U3R5bGUgJiBXU19DSElMRCkgPyAwIDogKEhNRU5VMzIpd25kUHRyLT53SURtZW51OwogCSAgICBpU3lzU3RhdCA9ICh3bmRQdHItPmhTeXNNZW51KSA/IEdldE1lbnVTdGF0ZTMyKEdldFN1Yk1lbnUxNih3bmRQdHItPmhTeXNNZW51LCAwKSwKLQkJCQkJICAgIGxwQWNjZWxUYmwtPnRibFtpXS53SUR2YWwsIE1GX0JZQ09NTUFORCkgOiAtMSA7CisJCQkJCSAgICBjbWQsIE1GX0JZQ09NTUFORCkgOiAtMSA7CiAJICAgIGlTdGF0ID0gKGhNZW51KSA/IEdldE1lbnVTdGF0ZTMyKGhNZW51LAotCQkJCQkgICAgbHBBY2NlbFRibC0+dGJsW2ldLndJRHZhbCwgTUZfQllDT01NQU5EKSA6IC0xIDsKKwkJCQkJICAgIGNtZCwgTUZfQllDT01NQU5EKSA6IC0xIDsKIAogICAgICAgICAgICAgaWYgKGlTeXNTdGF0IT0tMSkKICAgICAgICAgICAgIHsKQEAgLTcyNiw4ICs2OTYsOCBAQAogICAgICAgICAgIHsKICAgICAgICAgICAgICAgZHByaW50Zl9hY2NlbChzdGRkZWIsIiwgc2VuZGluZyAlcywgd1BhcmFtPSUweFxuIiwKICAgICAgICAgICAgICAgICAgIG1lc2c9PVdNX0NPTU1BTkQgPyAiV01fQ09NTUFORCIgOiAiV01fU1lTQ09NTUFORCIsCi0gICAgICAgICAgICAgICAgICBscEFjY2VsVGJsLT50YmxbaV0ud0lEdmFsKTsKLQkgICAgICBTZW5kTWVzc2FnZTE2KGhXbmQsIG1lc2csIGxwQWNjZWxUYmwtPnRibFtpXS53SUR2YWwsMHgwMDAxMDAwMEwpOworICAgICAgICAgICAgICAgICAgY21kKTsKKwkgICAgICBTZW5kTWVzc2FnZTMyQShoV25kLCBtZXNnLCBjbWQsIDB4MDAwMTAwMDBMKTsKIAkgIH0KIAkgIGVsc2UKIAkgIHsKQEAgLTc0MiwxMiArNzEyLDU2IEBACiAJICAgICovCiAJICAgIGRwcmludGZfYWNjZWwoc3RkZGViLCIsIGJ1dCB3b24ndCBzZW5kIFdNX3tTWVN9Q09NTUFORCwgcmVhc29uIGlzICMlZFxuIixtZXNnKTsKIAkgIH0gICAgICAgICAgCi0gICAgICAgICAgR2xvYmFsVW5sb2NrMTYoaEFjY2VsKTsKLSAgICAgICAgICByZXR1cm4gMTsgICAgICAgICAKKyAgICAgICAgICByZXR1cm4gVFJVRTsgICAgICAgICAKICAgICAgIH0KLSAgICAgfQogICAgIH0KLSAgICBHbG9iYWxVbmxvY2sxNihoQWNjZWwpOworICAgIHJldHVybiBGQUxTRTsKK30KKworSU5UMzIgV0lOQVBJIFRyYW5zbGF0ZUFjY2VsZXJhdG9yMzIoSFdORDMyIGhXbmQsIEhBQ0NFTDMyIGhBY2NlbCwgTFBNU0czMiBtc2cpCit7CisgICAgTFBBQ0NFTDMyCWxwQWNjZWxUYmwgPSAoTFBBQ0NFTDMyKUxvY2tSZXNvdXJjZTMyKGhBY2NlbCk7CisgICAgaW50IAlpOworICAgIAorICAgIGlmIChoQWNjZWwgPT0gMCB8fCBtc2cgPT0gTlVMTCkgcmV0dXJuIDA7CisgICAgaWYgKG1zZy0+bWVzc2FnZSAhPSBXTV9LRVlET1dOICYmCisgICAgCW1zZy0+bWVzc2FnZSAhPSBXTV9LRVlVUCAmJgorCW1zZy0+bWVzc2FnZSAhPSBXTV9TWVNLRVlET1dOICYmCisJbXNnLT5tZXNzYWdlICE9IFdNX1NZU0tFWVVQICYmCisgICAgCW1zZy0+bWVzc2FnZSAhPSBXTV9DSEFSKSByZXR1cm4gMDsKKworICAgIGRwcmludGZfYWNjZWwoc3RkZGViLCAiVHJhbnNsYXRlQWNjZWxlcmF0b3JzIGhBY2NlbD0lMDR4LCBoV25kPSUwNHgsXAorbXNnLT5od25kPSUwNHgsIG1zZy0+bWVzc2FnZT0lMDR4XG4iLCBoQWNjZWwsaFduZCxtc2ctPmh3bmQsbXNnLT5tZXNzYWdlKTsKKworICAgIGZvciAoaSA9IDA7IGxwQWNjZWxUYmxbaV0ua2V5IDsgaSsrKQorICAgIAlpZiAoS0JEX3RyYW5zbGF0ZV9hY2NlbGVyYXRvcihoV25kLG1zZyxscEFjY2VsVGJsW2ldLmZWaXJ0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBscEFjY2VsVGJsW2ldLmtleSxscEFjY2VsVGJsW2ldLmNtZCkpCisJCXJldHVybiAxOworICAgIHJldHVybiAwOworfQorCQorSU5UMTYgV0lOQVBJIFRyYW5zbGF0ZUFjY2VsZXJhdG9yMTYoSFdORDE2IGhXbmQsIEhBQ0NFTDE2IGhBY2NlbCwgTFBNU0cxNiBtc2cpCit7CisgICAgTFBBQ0NFTDE2CWxwQWNjZWxUYmwgPSAoTFBBQ0NFTDE2KUxvY2tSZXNvdXJjZTE2KGhBY2NlbCk7CisgICAgaW50IAlpOworICAgIE1TRzMyCW1zZzMyOworICAgIAorICAgIGlmIChoQWNjZWwgPT0gMCB8fCBtc2cgPT0gTlVMTCkgcmV0dXJuIDA7CisgICAgaWYgKG1zZy0+bWVzc2FnZSAhPSBXTV9LRVlET1dOICYmCisgICAgCW1zZy0+bWVzc2FnZSAhPSBXTV9LRVlVUCAmJgorCW1zZy0+bWVzc2FnZSAhPSBXTV9TWVNLRVlET1dOICYmCisJbXNnLT5tZXNzYWdlICE9IFdNX1NZU0tFWVVQICYmCisgICAgCW1zZy0+bWVzc2FnZSAhPSBXTV9DSEFSKSByZXR1cm4gMDsKKworICAgIGRwcmludGZfYWNjZWwoc3RkZGViLCAiVHJhbnNsYXRlQWNjZWxlcmF0b3JzIGhBY2NlbD0lMDR4LCBoV25kPSUwNHgsXAorbXNnLT5od25kPSUwNHgsIG1zZy0+bWVzc2FnZT0lMDR4XG4iLCBoQWNjZWwsaFduZCxtc2ctPmh3bmQsbXNnLT5tZXNzYWdlKTsKKyAgICBTVFJVQ1QzMl9NU0cxNnRvMzIobXNnLCZtc2czMik7CisKKworICAgIGZvciAoaT0wO2xwQWNjZWxUYmxbaV0ua2V5O2krKykgCisgICAgCWlmIChLQkRfdHJhbnNsYXRlX2FjY2VsZXJhdG9yKGhXbmQsJm1zZzMyLGxwQWNjZWxUYmxbaV0uZlZpcnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxwQWNjZWxUYmxbaV0ua2V5LGxwQWNjZWxUYmxbaV0uY21kKSkKKwkJcmV0dXJuIDE7CiAgICAgcmV0dXJuIDA7CiB9CiAKZGlmZiAtLWdpdCBhL3dpbmRvd3Mvc3lzY29sb3IuYyBiL3dpbmRvd3Mvc3lzY29sb3IuYwppbmRleCBlNzIyZGFhLi5mYzFmYjlkIDEwMDY0NAotLS0gYS93aW5kb3dzL3N5c2NvbG9yLmMKKysrIGIvd2luZG93cy9zeXNjb2xvci5jCkBAIC0yMTAsNyArMjEwLDYgQEAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgKiAgICAgICAgICAgICBTZXRTeXNDb2xvcnMxNiAgIChVU0VSLjE4MSkKICAqLwotLyogRklYTUUgLS0gY2hlY2sgcmV0dXJuIHR5cGUgYW5kIGluc2VydCBjb21tZW50IGlmIGNvcnJlY3QuICAqLwogVk9JRCBXSU5BUEkgU2V0U3lzQ29sb3JzMTYoIElOVDE2IG5DaGFuZ2VzLCBjb25zdCBJTlQxNiAqbHBTeXNDb2xvciwKIAkJCSAgICBjb25zdCBDT0xPUlJFRiAqbHBDb2xvclZhbHVlcyApCiB7CmRpZmYgLS1naXQgYS93aW5kb3dzL3VzZXIuYyBiL3dpbmRvd3MvdXNlci5jCmluZGV4IDkwZTc1NjcuLmRkYTFhMjggMTAwNjQ0Ci0tLSBhL3dpbmRvd3MvdXNlci5jCisrKyBiL3dpbmRvd3MvdXNlci5jCkBAIC0yMyw4ICsyMyw2IEBACiAKIFdPUkQgVVNFUl9IZWFwU2VsID0gMDsKIAotZXh0ZXJuIEhHTE9CQUwxNiBMb2FkRElCQ3Vyc29ySGFuZGxlciggSEdMT0JBTDE2LCBISU5TVEFOQ0UxNiwgSFJTUkMxNiApOwotZXh0ZXJuIEhHTE9CQUwxNiBMb2FkRElCSWNvbkhhbmRsZXIoIEhHTE9CQUwxNiwgSElOU1RBTkNFMTYsIEhSU1JDMTYgKTsKIGV4dGVybiBCT09MMzIgTUVOVV9QYXRjaFJlc2lkZW50UG9wdXAoIEhRVUVVRTE2LCBXTkQqICk7CiBleHRlcm4gdm9pZCBRVUVVRV9GbHVzaE1lc3NhZ2VzKEhRVUVVRTE2KTsKIApkaWZmIC0tZ2l0IGEvd2luZG93cy93aW4uYyBiL3dpbmRvd3Mvd2luLmMKaW5kZXggMjJkOGVhZi4uMzJjOWYyZiAxMDA2NDQKLS0tIGEvd2luZG93cy93aW4uYworKysgYi93aW5kb3dzL3dpbi5jCkBAIC00NjgsNyArNDY4LDcgQEAKICAgICBpZiAoSElXT1JEKGNzLT5scHN6Q2xhc3MpKSBkcHJpbnRmX3dpbiggc3RkZGViLCAiJyVzJyAiLCBjcy0+bHBzekNsYXNzICk7CiAgICAgZWxzZSBkcHJpbnRmX3dpbiggc3RkZGViLCAiIyUwNHggIiwgTE9XT1JEKGNzLT5scHN6Q2xhc3MpICk7CiAKLSAgICBkcHJpbnRmX3dpbiggc3RkZGViLCAiJTA4bHggJTA4bHggJWQsJWQgJWR4JWQgJTA0eCAlMDR4ICUwNHggJXBcbiIsCisgICAgZHByaW50Zl93aW4oIHN0ZGRlYiwgIiUwOGx4ICUwOGx4ICVkLCVkICVkeCVkICUwNHggJTA0eCAlMDh4ICVwXG4iLAogCQkgY3MtPmR3RXhTdHlsZSwgY3MtPnN0eWxlLCBjcy0+eCwgY3MtPnksIGNzLT5jeCwgY3MtPmN5LAogCQkgY3MtPmh3bmRQYXJlbnQsIGNzLT5oTWVudSwgY3MtPmhJbnN0YW5jZSwgY3MtPmxwQ3JlYXRlUGFyYW1zKTsKIApAQCAtNDgyLDExICs0ODIsOSBAQAogICAgICAgICAgICAgZnByaW50Ziggc3RkZXJyLCAiQ3JlYXRlV2luZG93RXg6IGJhZCBwYXJlbnQgJTA0eFxuIiwgY3MtPmh3bmRQYXJlbnQgKTsKIAkgICAgcmV0dXJuIDA7CiAJfQotICAgIH0KLSAgICBlbHNlIGlmIChjcy0+c3R5bGUgJiBXU19DSElMRCkKLSAgICB7CisgICAgfSBlbHNlIGlmICgoY3MtPnN0eWxlICYgV1NfQ0hJTEQpICYmICEoY3MtPnN0eWxlICYgV1NfUE9QVVApKSB7CiAgICAgICAgIGZwcmludGYoIHN0ZGVyciwgIkNyZWF0ZVdpbmRvd0V4OiBubyBwYXJlbnQgZm9yIGNoaWxkIHdpbmRvd1xuIiApOwotICAgICAgICByZXR1cm4gMDsgIC8qIFdTX0NISUxEIG5lZWRzIGEgcGFyZW50ICovCisgICAgICAgIHJldHVybiAwOyAgLyogV1NfQ0hJTEQgbmVlZHMgYSBwYXJlbnQsIGJ1dCBXU19QT1BVUCBkb2Vzbid0ICovCiAgICAgfQogCiAgICAgLyogRmluZCB0aGUgd2luZG93IGNsYXNzICovCkBAIC01MjYsNyArNTI0LDcgQEAKICAgICB3bmRQdHItPm5leHQgID0gTlVMTDsKICAgICB3bmRQdHItPmNoaWxkID0gTlVMTDsKIAotICAgIGlmIChjcy0+c3R5bGUgJiBXU19DSElMRCkKKyAgICBpZiAoKGNzLT5zdHlsZSAmIFdTX0NISUxEKSAmJiBjcy0+aHduZFBhcmVudCkKICAgICB7CiAgICAgICAgIHduZFB0ci0+cGFyZW50ID0gV0lOX0ZpbmRXbmRQdHIoIGNzLT5od25kUGFyZW50ICk7CiAgICAgICAgIHduZFB0ci0+b3duZXIgID0gTlVMTDsKZGlmZiAtLWdpdCBhL3dpbmRvd3Mvd2lucHJvYy5jIGIvd2luZG93cy93aW5wcm9jLmMKaW5kZXggMjY3MDI5ZS4uZGRiNWJlMSAxMDA2NDQKLS0tIGEvd2luZG93cy93aW5wcm9jLmMKKysrIGIvd2luZG93cy93aW5wcm9jLmMKQEAgLTksNyArOSw2IEBACiAjaW5jbHVkZSAid2luZG93cy5oIgogI2luY2x1ZGUgImhlYXAuaCIKICNpbmNsdWRlICJzZWxlY3RvcnMuaCIKLSNpbmNsdWRlICJzdGFja2ZyYW1lLmgiCiAjaW5jbHVkZSAic3RydWN0MzIuaCIKICNpbmNsdWRlICJ3aW4uaCIKICNpbmNsdWRlICJ3aW5wcm9jLmgiCkBAIC0xNzc5LDE3ICsxNzc4LDEzIEBACiB7CiAgICAgVUlOVDE2IG1zZzE2OwogICAgIE1TR1BBUkFNMTYgbXAxNjsKLSAgICBXTkQgKnduZFB0ciA9IFdJTl9GaW5kV25kUHRyKCBod25kICk7Ci0gICAgV09SRCBkcyA9IENVUlJFTlRfRFM7CiAKICAgICBtcDE2LmxQYXJhbSA9IGxQYXJhbTsKICAgICBpZiAoV0lOUFJPQ19NYXBNc2czMkFUbzE2KCBtc2csIHdQYXJhbSwgCiAJCQkgICAgICAmbXNnMTYsICZtcDE2LndQYXJhbSwgJm1wMTYubFBhcmFtICkgPT0gLTEpCiAgICAgICAgIHJldHVybiAwOwotICAgIGlmICh3bmRQdHIpIENVUlJFTlRfRFMgPSB3bmRQdHItPmhJbnN0YW5jZTsKICAgICBtcDE2LmxSZXN1bHQgPSBXSU5QUk9DX0NhbGxXbmRQcm9jMTZQdHIoIGZ1bmMsIGh3bmQsIG1zZzE2LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbXAxNi53UGFyYW0sIG1wMTYubFBhcmFtICk7Ci0gICAgQ1VSUkVOVF9EUyA9IGRzOwogICAgIFdJTlBST0NfVW5tYXBNc2czMkFUbzE2KCBtc2csIHdQYXJhbSwgbFBhcmFtLCAmbXAxNiApOwogICAgIHJldHVybiBtcDE2LmxSZXN1bHQ7CiB9CkBAIC0xODA2LDE2ICsxODAxLDEyIEBACiB7CiAgICAgVUlOVDE2IG1zZzE2OwogICAgIE1TR1BBUkFNMTYgbXAxNjsKLSAgICBXTkQgKnduZFB0ciA9IFdJTl9GaW5kV25kUHRyKCBod25kICk7Ci0gICAgV09SRCBkcyA9IENVUlJFTlRfRFM7CiAKICAgICBtcDE2LmxQYXJhbSA9IGxQYXJhbTsKICAgICBpZiAoV0lOUFJPQ19NYXBNc2czMldUbzE2KCBtc2csIHdQYXJhbSwgJm1zZzE2LCAmbXAxNi53UGFyYW0sICZtcDE2LmxQYXJhbSApID09IC0xKQogICAgICAgICByZXR1cm4gMDsKLSAgICBpZiAod25kUHRyKSBDVVJSRU5UX0RTID0gd25kUHRyLT5oSW5zdGFuY2U7CiAgICAgbXAxNi5sUmVzdWx0ID0gV0lOUFJPQ19DYWxsV25kUHJvYzE2UHRyKCBmdW5jLCBod25kLCBtc2cxNiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1wMTYud1BhcmFtLCBtcDE2LmxQYXJhbSApOwotICAgIENVUlJFTlRfRFMgPSBkczsKICAgICBXSU5QUk9DX1VubWFwTXNnMzJXVG8xNiggbXNnLCB3UGFyYW0sIGxQYXJhbSwgJm1wMTYgKTsKICAgICByZXR1cm4gbXAxNi5sUmVzdWx0OwogfQpAQCAtMTgyNyw0MSArMTgxOCwyMiBAQAogTFJFU1VMVCBXSU5BUEkgQ2FsbFdpbmRvd1Byb2MxNiggV05EUFJPQzE2IGZ1bmMsIEhXTkQxNiBod25kLCBVSU5UMTYgbXNnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgV1BBUkFNMTYgd1BhcmFtLCBMUEFSQU0gbFBhcmFtICkKIHsKLSAgICBMUkVTVUxUIHJlc3VsdDsKLSAgICBXTkQgKnduZFB0cjsKLSAgICBXT1JEIGRzOwogICAgIFdJTkRPV1BST0MgKnByb2MgPSBXSU5QUk9DX0dldFB0ciggZnVuYyApOwogCiAgICAgaWYgKCFwcm9jKQotICAgIHsKLSAgICAgICAgZHMgPSBDVVJSRU5UX0RTOwotICAgICAgICB3bmRQdHIgPSBXSU5fRmluZFduZFB0ciggaHduZCApOwotICAgICAgICBpZiAod25kUHRyKSBDVVJSRU5UX0RTID0gd25kUHRyLT5oSW5zdGFuY2U7Ci0gICAgICAgIHJlc3VsdCA9IFdJTlBST0NfQ2FsbFduZFByb2MxNlB0ciggZnVuYywgaHduZCwgbXNnLCB3UGFyYW0sIGxQYXJhbSApOwotICAgICAgICBDVVJSRU5UX0RTID0gZHM7Ci0gICAgICAgIHJldHVybiByZXN1bHQ7Ci0gICAgfQorICAgICAgICByZXR1cm4gV0lOUFJPQ19DYWxsV25kUHJvYzE2UHRyKCBmdW5jLCBod25kLCBtc2csIHdQYXJhbSwgbFBhcmFtICk7CisKICNpZiB0ZXN0aW5nCi0gICAgd25kUHRyID0gV0lOX0ZpbmRXbmRQdHIoIGh3bmQgKTsKLSAgICBpZiAod25kUHRyKSBDVVJSRU5UX0RTID0gd25kUHRyLT5oSW5zdGFuY2U7Ci0gICAgcmVzdWx0ID0gV0lOUFJPQ19DYWxsV25kUHJvYzE2UHRyKCBXSU5QUk9DX0dldFByb2MoIChIV0lORE9XUFJPQylwcm9jLCBXSU5fUFJPQ18xNiksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBod25kLCBtc2csIHdQYXJhbSwgbFBhcmFtICk7Ci0gICAgQ1VSUkVOVF9EUyA9IGRzOwotICAgIHJldHVybiByZXN1bHQ7CisgICAgZnVuYyA9IFdJTlBST0NfR2V0UHJvYyggKEhXSU5ET1dQUk9DKXByb2MsIFdJTl9QUk9DXzE2ICk7CisgICAgcmV0dXJuIFdJTlBST0NfQ2FsbFduZFByb2MxNlB0ciggZnVuYywgaHduZCwgbXNnLCB3UGFyYW0sIGxQYXJhbSApOwogI2VuZGlmCiAgICAgCiAgICAgc3dpdGNoKHByb2MtPnR5cGUpCiAgICAgewogICAgIGNhc2UgV0lOX1BST0NfMTY6CiAgICAgICAgIGlmICghcHJvYy0+dGh1bmsudF9mcm9tMzIucHJvYykgcmV0dXJuIDA7Ci0gICAgICAgIGRzID0gQ1VSUkVOVF9EUzsKLSAgICAgICAgd25kUHRyID0gV0lOX0ZpbmRXbmRQdHIoIGh3bmQgKTsKLSAgICAgICAgaWYgKHduZFB0cikgQ1VSUkVOVF9EUyA9IHduZFB0ci0+aEluc3RhbmNlOwotICAgICAgICByZXN1bHQgPSBXSU5QUk9DX0NhbGxXbmRQcm9jMTZQdHIoIHByb2MtPnRodW5rLnRfZnJvbTMyLnByb2MsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaHduZCwgbXNnLCB3UGFyYW0sIGxQYXJhbSApOwotICAgICAgICBDVVJSRU5UX0RTID0gZHM7Ci0gICAgICAgIHJldHVybiByZXN1bHQ7Ci0KKyAgICAgICAgcmV0dXJuIFdJTlBST0NfQ2FsbFduZFByb2MxNlB0ciggcHJvYy0+dGh1bmsudF9mcm9tMzIucHJvYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaHduZCwgbXNnLCB3UGFyYW0sIGxQYXJhbSApOwogICAgIGNhc2UgV0lOX1BST0NfMzJBOgogICAgICAgICBpZiAoIXByb2MtPnRodW5rLnRfZnJvbTE2LnByb2MpIHJldHVybiAwOwogICAgICAgICByZXR1cm4gV0lOUFJPQ19DYWxsUHJvYzE2VG8zMkEoIGh3bmQsIG1zZywgd1BhcmFtLCBsUGFyYW0sCg==