ZGlmZiAtLWdpdCBhL2V4eW5vczQvQW5kcm9pZC5tayBiL2V4eW5vczQvQW5kcm9pZC5tawpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zYzk5ZjFhCi0tLSAvZGV2L251bGwKKysrIGIvZXh5bm9zNC9BbmRyb2lkLm1rCkBAIC0wLDAgKzEsMjMgQEAKKyMgQ29weXJpZ2h0IChDKSAyMDEyIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyMKKyMgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisjIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyMgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisjCisjICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisjCisjIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyMgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisjIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyMgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisKK2lmZXEgKCQoVEFSR0VUX0JPQVJEX1BMQVRGT1JNKSxleHlub3M0KQorCitCT0FSRF9IQUxfUEFUSCA6PSBoYXJkd2FyZS9zYW1zdW5nL2V4eW5vczQvaGFsCitCT0FSRF9ITU1fUEFUSCA6PSBoYXJkd2FyZS9zYW1zdW5nL2V4eW5vczQvbXVsdGltZWRpYQorCitpbmNsdWRlICQoQk9BUkRfSEFMX1BBVEgpL0FuZHJvaWQubWsKK2luY2x1ZGUgJChCT0FSRF9ITU1fUEFUSCkvQW5kcm9pZC5taworCitlbmRpZgpkaWZmIC0tZ2l0IGEvZXh5bm9zNC9oYWwvQW5kcm9pZC5tayBiL2V4eW5vczQvaGFsL0FuZHJvaWQubWsKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZWRiN2E0YQotLS0gL2Rldi9udWxsCisrKyBiL2V4eW5vczQvaGFsL0FuZHJvaWQubWsKQEAgLTAsMCArMSw0IEBACitpZmVxICgkKFRBUkdFVF9CT0FSRF9QTEFURk9STSksZXh5bm9zNCkKK2V4eW5vczRfZGlycyA6PSBsaWJmaW1nIGxpYmh3Y29udmVydGVyIGxpYmxpZ2h0cyBsaWJzNXBqcGVnIGxpYnNlbnNvcnMgbGlic3djb252ZXJ0ZXIgbGlidW1wCitpbmNsdWRlICQoY2FsbCBhbGwtbmFtZWQtc3ViZGlyLW1ha2VmaWxlcywkKGV4eW5vczRfZGlycykpCitlbmRpZgpkaWZmIC0tZ2l0IGEvZXh5bm9zNC9oYWwvaW5jbHVkZS9FeGlmLmggYi9leHlub3M0L2hhbC9pbmNsdWRlL0V4aWYuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43MWUyMjQxCi0tLSAvZGV2L251bGwKKysrIGIvZXh5bm9zNC9oYWwvaW5jbHVkZS9FeGlmLmgKQEAgLTAsMCArMSwyMzEgQEAKKy8qCisgKiBDb3B5cmlnaHQgU2Ftc3VuZyBFbGVjdHJvbmljcyBDby4sTFRELgorICogQ29weXJpZ2h0IChDKSAyMDEwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworI2lmbmRlZiBBTkRST0lEX0hBUkRXQVJFX0VYSUZfSAorI2RlZmluZSBBTkRST0lEX0hBUkRXQVJFX0VYSUZfSAorCisjaW5jbHVkZSA8bWF0aC5oPgorCisjZGVmaW5lIEVYSUZfTE9HMih4KSAgICAgICAgICAgICAgICAgICAgKGxvZygoZG91YmxlKSh4KSkgLyBsb2coMi4wKSkKKyNkZWZpbmUgQVBFWF9GTlVNX1RPX0FQRVJUVVJFKHgpICAgICAgICAoKGludCkoRVhJRl9MT0cyKChkb3VibGUpKHgpKSAqIDIgKyAwLjUpKQorI2RlZmluZSBBUEVYX0VYUE9TVVJFX1RPX1NIVVRURVIoeCkgICAgICgoeCkgPj0gMSA/ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChpbnQpKC0oRVhJRl9MT0cyKChkb3VibGUpKHgpKSArIDAuNSkpIDogICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChpbnQpKC0oRVhJRl9MT0cyKChkb3VibGUpKHgpKSAtIDAuNSkpKQorI2RlZmluZSBBUEVYX0lTT19UT19GSUxNU0VOU0lUSVZJVFkoeCkgICgoaW50KShFWElGX0xPRzIoKHgpIC8gMy4xMjUpICsgMC41KSkKKworI2RlZmluZSBOVU1fU0laRSAgICAgICAgICAgICAgICAgICAgMgorI2RlZmluZSBJRkRfU0laRSAgICAgICAgICAgICAgICAgICAgMTIKKyNkZWZpbmUgT0ZGU0VUX1NJWkUgICAgICAgICAgICAgICAgIDQKKworI2RlZmluZSBOVU1fMFRIX0lGRF9USUZGICAgICAgICAgICAgMTAKKyNkZWZpbmUgTlVNXzBUSF9JRkRfRVhJRiAgICAgICAgICAgIDIyCisjZGVmaW5lIE5VTV8wVEhfSUZEX0dQUyAgICAgICAgICAgICAxMAorI2RlZmluZSBOVU1fMVRIX0lGRF9USUZGICAgICAgICAgICAgOQorCisvKiBUeXBlICovCisjZGVmaW5lIEVYSUZfVFlQRV9CWVRFICAgICAgICAgICAgICAxCisjZGVmaW5lIEVYSUZfVFlQRV9BU0NJSSAgICAgICAgICAgICAyCisjZGVmaW5lIEVYSUZfVFlQRV9TSE9SVCAgICAgICAgICAgICAzCisjZGVmaW5lIEVYSUZfVFlQRV9MT05HICAgICAgICAgICAgICA0CisjZGVmaW5lIEVYSUZfVFlQRV9SQVRJT05BTCAgICAgICAgICA1CisjZGVmaW5lIEVYSUZfVFlQRV9VTkRFRklORUQgICAgICAgICA3CisjZGVmaW5lIEVYSUZfVFlQRV9TTE9ORyAgICAgICAgICAgICA5CisjZGVmaW5lIEVYSUZfVFlQRV9TUkFUSU9OQUwgICAgICAgICAxMAorCisjZGVmaW5lIEVYSUZfRklMRV9TSVpFICAgICAgICAgICAgICAyODgwMAorCisvKiAwdGggSUZEIFRJRkYgVGFncyAqLworI2RlZmluZSBFWElGX1RBR19JTUFHRV9XSURUSCAgICAgICAgICAgICAgICAgICAgMHgwMTAwCisjZGVmaW5lIEVYSUZfVEFHX0lNQUdFX0hFSUdIVCAgICAgICAgICAgICAgICAgICAweDAxMDEKKyNkZWZpbmUgRVhJRl9UQUdfTUFLRSAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDEwZgorI2RlZmluZSBFWElGX1RBR19NT0RFTCAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMTEwCisjZGVmaW5lIEVYSUZfVEFHX09SSUVOVEFUSU9OICAgICAgICAgICAgICAgICAgICAweDAxMTIKKyNkZWZpbmUgRVhJRl9UQUdfU09GVFdBUkUgICAgICAgICAgICAgICAgICAgICAgIDB4MDEzMQorI2RlZmluZSBFWElGX1RBR19EQVRFX1RJTUUgICAgICAgICAgICAgICAgICAgICAgMHgwMTMyCisjZGVmaW5lIEVYSUZfVEFHX1lDQkNSX1BPU0lUSU9OSU5HICAgICAgICAgICAgICAweDAyMTMKKyNkZWZpbmUgRVhJRl9UQUdfRVhJRl9JRkRfUE9JTlRFUiAgICAgICAgICAgICAgIDB4ODc2OQorI2RlZmluZSBFWElGX1RBR19HUFNfSUZEX1BPSU5URVIgICAgICAgICAgICAgICAgMHg4ODI1CisKKy8qIDB0aCBJRkQgRXhpZiBQcml2YXRlIFRhZ3MgKi8KKyNkZWZpbmUgRVhJRl9UQUdfRVhQT1NVUkVfVElNRSAgICAgICAgICAgICAgICAgIDB4ODI5QQorI2RlZmluZSBFWElGX1RBR19GTlVNQkVSICAgICAgICAgICAgICAgICAgICAgICAgMHg4MjlECisjZGVmaW5lIEVYSUZfVEFHX0VYUE9TVVJFX1BST0dSQU0gICAgICAgICAgICAgICAweDg4MjIKKyNkZWZpbmUgRVhJRl9UQUdfSVNPX1NQRUVEX1JBVElORyAgICAgICAgICAgICAgIDB4ODgyNworI2RlZmluZSBFWElGX1RBR19FWElGX1ZFUlNJT04gICAgICAgICAgICAgICAgICAgMHg5MDAwCisjZGVmaW5lIEVYSUZfVEFHX0RBVEVfVElNRV9PUkcgICAgICAgICAgICAgICAgICAweDkwMDMKKyNkZWZpbmUgRVhJRl9UQUdfREFURV9USU1FX0RJR0lUSVpFICAgICAgICAgICAgIDB4OTAwNAorI2RlZmluZSBFWElGX1RBR19TSFVUVEVSX1NQRUVEICAgICAgICAgICAgICAgICAgMHg5MjAxCisjZGVmaW5lIEVYSUZfVEFHX0FQRVJUVVJFICAgICAgICAgICAgICAgICAgICAgICAweDkyMDIKKyNkZWZpbmUgRVhJRl9UQUdfQlJJR0hUTkVTUyAgICAgICAgICAgICAgICAgICAgIDB4OTIwMworI2RlZmluZSBFWElGX1RBR19FWFBPU1VSRV9CSUFTICAgICAgICAgICAgICAgICAgMHg5MjA0CisjZGVmaW5lIEVYSUZfVEFHX01BWF9BUEVSVFVSRSAgICAgICAgICAgICAgICAgICAweDkyMDUKKyNkZWZpbmUgRVhJRl9UQUdfTUVURVJJTkdfTU9ERSAgICAgICAgICAgICAgICAgIDB4OTIwNworI2RlZmluZSBFWElGX1RBR19GTEFTSCAgICAgICAgICAgICAgICAgICAgICAgICAgMHg5MjA5CisjZGVmaW5lIEVYSUZfVEFHX0ZPQ0FMX0xFTkdUSCAgICAgICAgICAgICAgICAgICAweDkyMEEKKyNkZWZpbmUgRVhJRl9UQUdfVVNFUl9DT01NRU5UICAgICAgICAgICAgICAgICAgIDB4OTI4NgorI2RlZmluZSBFWElGX1RBR19DT0xPUl9TUEFDRSAgICAgICAgICAgICAgICAgICAgMHhBMDAxCisjZGVmaW5lIEVYSUZfVEFHX1BJWEVMX1hfRElNRU5TSU9OICAgICAgICAgICAgICAweEEwMDIKKyNkZWZpbmUgRVhJRl9UQUdfUElYRUxfWV9ESU1FTlNJT04gICAgICAgICAgICAgIDB4QTAwMworI2RlZmluZSBFWElGX1RBR19FWFBPU1VSRV9NT0RFICAgICAgICAgICAgICAgICAgMHhBNDAyCisjZGVmaW5lIEVYSUZfVEFHX1dISVRFX0JBTEFOQ0UgICAgICAgICAgICAgICAgICAweEE0MDMKKyNkZWZpbmUgRVhJRl9UQUdfU0NFTkNFX0NBUFRVUkVfVFlQRSAgICAgICAgICAgIDB4QTQwNgorCisvKiAwdGggSUZEIEdQUyBJbmZvIFRhZ3MgKi8KKyNkZWZpbmUgRVhJRl9UQUdfR1BTX1ZFUlNJT05fSUQgICAgICAgICAgICAgICAgIDB4MDAwMAorI2RlZmluZSBFWElGX1RBR19HUFNfTEFUSVRVREVfUkVGICAgICAgICAgICAgICAgMHgwMDAxCisjZGVmaW5lIEVYSUZfVEFHX0dQU19MQVRJVFVERSAgICAgICAgICAgICAgICAgICAweDAwMDIKKyNkZWZpbmUgRVhJRl9UQUdfR1BTX0xPTkdJVFVERV9SRUYgICAgICAgICAgICAgIDB4MDAwMworI2RlZmluZSBFWElGX1RBR19HUFNfTE9OR0lUVURFICAgICAgICAgICAgICAgICAgMHgwMDA0CisjZGVmaW5lIEVYSUZfVEFHX0dQU19BTFRJVFVERV9SRUYgICAgICAgICAgICAgICAweDAwMDUKKyNkZWZpbmUgRVhJRl9UQUdfR1BTX0FMVElUVURFICAgICAgICAgICAgICAgICAgIDB4MDAwNgorI2RlZmluZSBFWElGX1RBR19HUFNfVElNRVNUQU1QICAgICAgICAgICAgICAgICAgMHgwMDA3CisjZGVmaW5lIEVYSUZfVEFHX0dQU19QUk9DRVNTSU5HX01FVEhPRCAgICAgICAgICAweDAwMUIKKyNkZWZpbmUgRVhJRl9UQUdfR1BTX0RBVEVTVEFNUCAgICAgICAgICAgICAgICAgIDB4MDAxRAorCisvKiAxdGggSUZEIFRJRkYgVGFncyAqLworI2RlZmluZSBFWElGX1RBR19DT01QUkVTU0lPTl9TQ0hFTUUgICAgICAgICAgICAgMHgwMTAzCisjZGVmaW5lIEVYSUZfVEFHX1hfUkVTT0xVVElPTiAgICAgICAgICAgICAgICAgICAweDAxMUEKKyNkZWZpbmUgRVhJRl9UQUdfWV9SRVNPTFVUSU9OICAgICAgICAgICAgICAgICAgIDB4MDExQgorI2RlZmluZSBFWElGX1RBR19SRVNPTFVUSU9OX1VOSVQgICAgICAgICAgICAgICAgMHgwMTI4CisjZGVmaW5lIEVYSUZfVEFHX0pQRUdfSU5URVJDSEFOR0VfRk9STUFUICAgICAgICAweDAyMDEKKyNkZWZpbmUgRVhJRl9UQUdfSlBFR19JTlRFUkNIQU5HRV9GT1JNQVRfTEVOICAgIDB4MDIwMgorCit0eXBlZGVmIGVudW0geworICAgIEVYSUZfT1JJRU5UQVRJT05fVVAgICAgID0gMSwKKyAgICBFWElGX09SSUVOVEFUSU9OXzkwICAgICA9IDYsCisgICAgRVhJRl9PUklFTlRBVElPTl8xODAgICAgPSAzLAorICAgIEVYSUZfT1JJRU5UQVRJT05fMjcwICAgID0gOCwKK30gRXhpZk9yaWVudGF0aW9uVHlwZTsKKwordHlwZWRlZiBlbnVtIHsKKyAgICBFWElGX1NDRU5FX1NUQU5EQVJELAorICAgIEVYSUZfU0NFTkVfTEFORFNDQVBFLAorICAgIEVYSUZfU0NFTkVfUE9SVFJBSVQsCisgICAgRVhJRl9TQ0VORV9OSUdIVCwKK30gQ2FtRXhpZlNjZW5lQ2FwdHVyZVR5cGU7CisKK3R5cGVkZWYgZW51bSB7CisgICAgRVhJRl9NRVRFUklOR19VTktOT1dOLAorICAgIEVYSUZfTUVURVJJTkdfQVZFUkFHRSwKKyAgICBFWElGX01FVEVSSU5HX0NFTlRFUiwKKyAgICBFWElGX01FVEVSSU5HX1NQT1QsCisgICAgRVhJRl9NRVRFUklOR19NVUxUSVNQT1QsCisgICAgRVhJRl9NRVRFUklOR19QQVRURVJOLAorICAgIEVYSUZfTUVURVJJTkdfUEFSVElBTCwKKyAgICBFWElGX01FVEVSSU5HX09USEVSICAgICA9IDI1NSwKK30gQ2FtRXhpZk1ldGVyaW5nTW9kZVR5cGU7CisKK3R5cGVkZWYgZW51bSB7CisgICAgRVhJRl9FWFBPU1VSRV9BVVRPLAorICAgIEVYSUZfRVhQT1NVUkVfTUFOVUFMLAorICAgIEVYSUZfRVhQT1NVUkVfQVVUT19CUkFDS0VULAorfSBDYW1FeGlmRXhwb3N1cmVNb2RlVHlwZTsKKwordHlwZWRlZiBlbnVtIHsKKyAgICBFWElGX1dCX0FVVE8sCisgICAgRVhJRl9XQl9NQU5VQUwsCit9IENhbUV4aWZXaGl0ZUJhbGFuY2VUeXBlOworCisvKiBWYWx1ZXMgKi8KKyNkZWZpbmUgRVhJRl9ERUZfTUFLRVIgICAgICAgICAgIlNBTVNVTkciCisjZGVmaW5lIEVYSUZfREVGX01PREVMICAgICAgICAgICJTQU1TVU5HIgorI2RlZmluZSBFWElGX0RFRl9TT0ZUV0FSRSAgICAgICAiU0FNU1VORyIKKyNkZWZpbmUgRVhJRl9ERUZfRVhJRl9WRVJTSU9OICAgIjAyMjAiCisjZGVmaW5lIEVYSUZfREVGX1VTRVJDT01NRU5UUyAgICJVc2VyIGNvbW1lbnRzIgorCisjZGVmaW5lIEVYSUZfREVGX1lDQkNSX1BPU0lUSU9OSU5HICAxICAgLyogY2VudGVyZWQgKi8KKyNkZWZpbmUgRVhJRl9ERUZfRk5VTUJFUl9OVU0gICAgICAgIDI2ICAvKiAyLjYgKi8KKyNkZWZpbmUgRVhJRl9ERUZfRk5VTUJFUl9ERU4gICAgICAgIDEwCisjZGVmaW5lIEVYSUZfREVGX0VYUE9TVVJFX1BST0dSQU0gICAzICAgLyogYXBlcnR1cmUgcHJpb3JpdHkgKi8KKyNkZWZpbmUgRVhJRl9ERUZfRk9DQUxfTEVOX05VTSAgICAgIDI3OCAvKiAyLjc4bW0gKi8KKyNkZWZpbmUgRVhJRl9ERUZfRk9DQUxfTEVOX0RFTiAgICAgIDEwMAorI2RlZmluZSBFWElGX0RFRl9GTEFTSCAgICAgICAgICAgICAgMCAgIC8qIE86IG9mZiwgMTogb24qLworI2RlZmluZSBFWElGX0RFRl9DT0xPUl9TUEFDRSAgICAgICAgMQorI2RlZmluZSBFWElGX0RFRl9FWFBPU1VSRV9NT0RFICAgICAgRVhJRl9FWFBPU1VSRV9BVVRPCisjZGVmaW5lIEVYSUZfREVGX0FQRVhfREVOICAgICAgICAgICAxMAorCisjZGVmaW5lIEVYSUZfREVGX0NPTVBSRVNTSU9OICAgICAgICA2CisjZGVmaW5lIEVYSUZfREVGX1JFU09MVVRJT05fTlVNICAgICA3MgorI2RlZmluZSBFWElGX0RFRl9SRVNPTFVUSU9OX0RFTiAgICAgMQorI2RlZmluZSBFWElGX0RFRl9SRVNPTFVUSU9OX1VOSVQgICAgMiAgIC8qIGluY2hlcyAqLworCit0eXBlZGVmIHN0cnVjdCB7CisgICAgdWludDMyX3QgbnVtOworICAgIHVpbnQzMl90IGRlbjsKK30gcmF0aW9uYWxfdDsKKwordHlwZWRlZiBzdHJ1Y3QgeworICAgIGludDMyX3QgbnVtOworICAgIGludDMyX3QgZGVuOworfSBzcmF0aW9uYWxfdDsKKwordHlwZWRlZiBzdHJ1Y3QgeworICAgIGJvb2wgZW5hYmxlR3BzOworICAgIGJvb2wgZW5hYmxlVGh1bWI7CisKKyAgICB1bnNpZ25lZCBjaGFyIG1ha2VyWzMyXTsKKyAgICB1bnNpZ25lZCBjaGFyIG1vZGVsWzMyXTsKKyAgICB1bnNpZ25lZCBjaGFyIHNvZnR3YXJlWzMyXTsKKyAgICB1bnNpZ25lZCBjaGFyIGV4aWZfdmVyc2lvbls0XTsKKyAgICB1bnNpZ25lZCBjaGFyIGRhdGVfdGltZVsyMF07CisgICAgdW5zaWduZWQgY2hhciB1c2VyX2NvbW1lbnRbMTUwXTsKKworICAgIHVpbnQzMl90IHdpZHRoOworICAgIHVpbnQzMl90IGhlaWdodDsKKyAgICB1aW50MzJfdCB3aWR0aFRodW1iOworICAgIHVpbnQzMl90IGhlaWdodFRodW1iOworCisgICAgdWludDE2X3Qgb3JpZW50YXRpb247CisgICAgdWludDE2X3QgeWNiY3JfcG9zaXRpb25pbmc7CisgICAgdWludDE2X3QgZXhwb3N1cmVfcHJvZ3JhbTsKKyAgICB1aW50MTZfdCBpc29fc3BlZWRfcmF0aW5nOworICAgIHVpbnQxNl90IG1ldGVyaW5nX21vZGU7CisgICAgdWludDE2X3QgZmxhc2g7CisgICAgdWludDE2X3QgY29sb3Jfc3BhY2U7CisgICAgdWludDE2X3QgZXhwb3N1cmVfbW9kZTsKKyAgICB1aW50MTZfdCB3aGl0ZV9iYWxhbmNlOworICAgIHVpbnQxNl90IHNjZW5lX2NhcHR1cmVfdHlwZTsKKworICAgIHJhdGlvbmFsX3QgZXhwb3N1cmVfdGltZTsKKyAgICByYXRpb25hbF90IGZudW1iZXI7CisgICAgcmF0aW9uYWxfdCBhcGVydHVyZTsKKyAgICByYXRpb25hbF90IG1heF9hcGVydHVyZTsKKyAgICByYXRpb25hbF90IGZvY2FsX2xlbmd0aDsKKworICAgIHNyYXRpb25hbF90IHNodXR0ZXJfc3BlZWQ7CisgICAgc3JhdGlvbmFsX3QgYnJpZ2h0bmVzczsKKyAgICBzcmF0aW9uYWxfdCBleHBvc3VyZV9iaWFzOworCisgICAgdW5zaWduZWQgY2hhciBncHNfbGF0aXR1ZGVfcmVmWzJdOworICAgIHVuc2lnbmVkIGNoYXIgZ3BzX2xvbmdpdHVkZV9yZWZbMl07CisKKyAgICB1aW50OF90IGdwc192ZXJzaW9uX2lkWzRdOworICAgIHVpbnQ4X3QgZ3BzX2FsdGl0dWRlX3JlZjsKKworICAgIHJhdGlvbmFsX3QgZ3BzX2xhdGl0dWRlWzNdOworICAgIHJhdGlvbmFsX3QgZ3BzX2xvbmdpdHVkZVszXTsKKyAgICByYXRpb25hbF90IGdwc19hbHRpdHVkZTsKKyAgICByYXRpb25hbF90IGdwc190aW1lc3RhbXBbM107CisgICAgdW5zaWduZWQgY2hhciBncHNfZGF0ZXN0YW1wWzExXTsKKyAgICB1bnNpZ25lZCBjaGFyIGdwc19wcm9jZXNzaW5nX21ldGhvZFsxMDBdOworCisgICAgcmF0aW9uYWxfdCB4X3Jlc29sdXRpb247CisgICAgcmF0aW9uYWxfdCB5X3Jlc29sdXRpb247CisgICAgdWludDE2X3QgcmVzb2x1dGlvbl91bml0OworICAgIHVpbnQxNl90IGNvbXByZXNzaW9uX3NjaGVtZTsKK30gZXhpZl9hdHRyaWJ1dGVfdDsKKworI2VuZGlmIC8qIEFORFJPSURfSEFSRFdBUkVfRVhJRl9IICovCmRpZmYgLS1naXQgYS9leHlub3M0L2hhbC9pbmNsdWRlL1NlY0J1ZmZlci5oIGIvZXh5bm9zNC9oYWwvaW5jbHVkZS9TZWNCdWZmZXIuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iOGE0MWRmCi0tLSAvZGV2L251bGwKKysrIGIvZXh5bm9zNC9oYWwvaW5jbHVkZS9TZWNCdWZmZXIuaApAQCAtMCwwICsxLDE1OCBAQAorLyoKKyAqIENvcHlyaWdodEAgU2Ftc3VuZyBFbGVjdHJvbmljcyBDby4gTFRECisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorKi8KKworLyohCisgKiBcZmlsZSAgICAgIFNlY0J1ZmZlci5oCisgKiBcYnJpZWYgICAgIGhlYWRlciBmaWxlIGZvciBTZWNCdWZmZXIKKyAqIFxhdXRob3IgICAgU2FuZ3dvbywgUGFyayhzdzU3NzEucGFya0BzYW1zdW5nLmNvbSkKKyAqIFxkYXRlICAgICAgMjAxMS8wNi8wMgorICoKKyAqIDxiPlJldmlzaW9uIEhpc3Rvcnk6IDwvYj4KKyAqIC0gMjAxMC8wNi8wMyA6IFNhbmd3b28sIFBhcmsoc3c1NzcxLnBhcmtAc2Ftc3VuZy5jb20pIFxuCisgKiAgIEluaXRpYWwgdmVyc2lvbgorICoKKyAqLworCisvKioKKyAqIEBwYWdlIFNlY0J1ZmZlcgorICoKKyAqIEBzZWN0aW9uIEludHJvZHVjdGlvbgorICogU2VjQnVmZmVyIGlzIGNvbW1vbiBzdHJ1Y3QgZm9yIGJ1ZmZlcgorICoKKyAqIEBzZWN0aW9uIENvcHlyaWdodAorICogIENvcHlyaWdodCAoYykgMjAwOC0yMDExIFNhbXN1bmcgRWxlY3Ryb25pY3MgQ28uLCBMdGQuQWxsIHJpZ2h0cyByZXNlcnZlZC4gXG4KKyAqICBQcm9wcmlldGFyeSBhbmQgQ29uZmlkZW50aWFsCisgKgorICogQGltYWdlIGh0bWwgc2Ftc3VuZy5wbmcKKyAqLworCisjaWZuZGVmIF9fU0VDX0JVRkZFUl9IX18KKyNkZWZpbmUgX19TRUNfQlVGRkVSX0hfXworCisjaW5jbHVkZSA8c3lzL3R5cGVzLmg+CisKKy8vISBCdWZmZXIgaW5mb3JtYXRpb24KK3N0cnVjdCBTZWNCdWZmZXIKK3sKK3B1YmxpYzoKKyAgICAvLyEgQnVmZmVyIHR5cGUKKyAgICBlbnVtIEJVRkZFUl9UWVBFCisgICAgeworICAgICAgICBCVUZGRVJfVFlQRV9CQVNFICAgICA9IDAsCisgICAgICAgIEJVRkZFUl9UWVBFX1ZJUlQgICAgID0gMSwgICAgICAvLyE8IHZpcnR1YWwgYWRkcmVzcworICAgICAgICBCVUZGRVJfVFlQRV9QSFlTICAgICA9IDEgPDwgMSwgLy8hPCBwaHlzaWNhbCBhZGRyZXNzCisgICAgICAgIEJVRkZFUl9UWVBFX1JFU0VSVkVEID0gMSA8PCAyLCAvLyE8IHJlc2VydmVkIHR5cGUKKyAgICAgICAgQlVGRkVSX1RZUEVfTUFYLAorICAgIH07CisKKyAgICAvLyEgQnVmZmVyIHZpcnR1YWwgYWRkcmVzcworICAgIHVuaW9uIHsKKyAgICAgICAgY2hhciAqcDsgICAgICAgLy8hIHNpbmdsZSBhZGRyZXNzLgorICAgICAgICBjaGFyICpleHRQWzNdOyAvLyEgWSBDYiBDci4KKyAgICB9IHZpcnQ7CisKKyAgICAvLyEgQnVmZmVyIHBoeXNpY2FsIGFkZHJlc3MKKyAgICB1bmlvbiB7CisgICAgICAgIHVuc2lnbmVkIGludCBwOyAgICAgICAvLyEgc2luZ2xlIGFkZHJlc3MuCisgICAgICAgIHVuc2lnbmVkIGludCBleHRQWzNdOyAvLyEgWSBDYiBDci4KKyAgICB9IHBoeXM7CisKKyAgICAvLyEgQnVmZmVyIHJlc2VydmVkIGlkCisgICAgdW5pb24geworICAgICAgICB1bnNpZ25lZCBpbnQgcDsgICAgICAgLy8hIFxuCisgICAgICAgIHVuc2lnbmVkIGludCBleHRQWzNdOyAvLyEgXG4KKyAgICB9IHJlc2VydmVkOworCisgICAgLy8hIEJ1ZmZlciBzaXplCisgICAgdW5pb24geworICAgICAgICB1bnNpZ25lZCBpbnQgczsKKyAgICAgICAgdW5zaWduZWQgaW50IGV4dFNbM107CisgICAgfSBzaXplOworCisgICAgLy8hIENvbnN0cnVjdG9yCisgICAgU2VjQnVmZmVyKCkKKyAgICB7CisgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgMzsgaSsrKSB7CisgICAgICAgICAgICB2aXJ0LiAgICBleHRQW2ldID0gTlVMTDsKKyAgICAgICAgICAgIHBoeXMuICAgIGV4dFBbaV0gPSAwOworICAgICAgICAgICAgcmVzZXJ2ZWQuZXh0UFtpXSA9IDA7CisgICAgICAgICAgICBzaXplLiAgICBleHRTW2ldID0gMDsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8vISBDb25zdHJ1Y3RvcgorICAgIFNlY0J1ZmZlcihjb25zdCBTZWNCdWZmZXIgKm90aGVyKQorICAgIHsKKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCAzOyBpKyspIHsKKyAgICAgICAgICAgIHZpcnQuICAgIGV4dFBbaV0gPSBvdGhlci0+dmlydC5leHRQW2ldOworICAgICAgICAgICAgcGh5cy4gICAgZXh0UFtpXSA9IG90aGVyLT5waHlzLmV4dFBbaV07CisgICAgICAgICAgICByZXNlcnZlZC5leHRQW2ldID0gb3RoZXItPnJlc2VydmVkLmV4dFBbaV07CisgICAgICAgICAgICBzaXplLiAgICBleHRTW2ldID0gb3RoZXItPnNpemUuZXh0U1tpXTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8vISBPcGVyYXRvcig9KSBvdmVycmlkZQorICAgIFNlY0J1ZmZlciYgb3BlcmF0b3IgPShjb25zdCBTZWNCdWZmZXIgJm90aGVyKQorICAgIHsKKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCAzOyBpKyspIHsKKyAgICAgICAgICAgIHZpcnQuICAgIGV4dFBbaV0gPSBvdGhlci52aXJ0LmV4dFBbaV07CisgICAgICAgICAgICBwaHlzLiAgICBleHRQW2ldID0gb3RoZXIucGh5cy5leHRQW2ldOworICAgICAgICAgICAgcmVzZXJ2ZWQuZXh0UFtpXSA9IG90aGVyLnJlc2VydmVkLmV4dFBbaV07CisgICAgICAgICAgICBzaXplLiAgICBleHRTW2ldID0gb3RoZXIuc2l6ZS5leHRTW2ldOworICAgICAgICB9CisgICAgICAgIHJldHVybiAqdGhpczsKKyAgICB9CisKKyAgICAvLyEgT3BlcmF0b3IoPT0pIG92ZXJyaWRlCisgICAgYm9vbCBvcGVyYXRvciA9PShjb25zdCBTZWNCdWZmZXIgJm90aGVyKSBjb25zdAorICAgIHsKKyAgICAgICAgcmV0dXJuICggICB2aXJ0LiAgICBleHRQWzBdID09IG90aGVyLnZpcnQuZXh0UFswXQorICAgICAgICAgICAgICAgICYmIHZpcnQuICAgIGV4dFBbMV0gPT0gb3RoZXIudmlydC5leHRQWzFdCisgICAgICAgICAgICAgICAgJiYgdmlydC4gICAgZXh0UFsyXSA9PSBvdGhlci52aXJ0LmV4dFBbMl0KKyAgICAgICAgICAgICAgICAmJiBwaHlzLiAgICBleHRQWzBdID09IG90aGVyLnBoeXMuZXh0UFswXQorICAgICAgICAgICAgICAgICYmIHBoeXMuICAgIGV4dFBbMV0gPT0gb3RoZXIucGh5cy5leHRQWzFdCisgICAgICAgICAgICAgICAgJiYgcGh5cy4gICAgZXh0UFsyXSA9PSBvdGhlci5waHlzLmV4dFBbMl0KKyAgICAgICAgICAgICAgICAmJiByZXNlcnZlZC5leHRQWzBdID09IG90aGVyLnJlc2VydmVkLmV4dFBbMF0KKyAgICAgICAgICAgICAgICAmJiByZXNlcnZlZC5leHRQWzFdID09IG90aGVyLnJlc2VydmVkLmV4dFBbMV0KKyAgICAgICAgICAgICAgICAmJiByZXNlcnZlZC5leHRQWzJdID09IG90aGVyLnJlc2VydmVkLmV4dFBbMl0KKyAgICAgICAgICAgICAgICAmJiBzaXplLiAgICBleHRTWzBdID09IG90aGVyLnNpemUuZXh0U1swXQorICAgICAgICAgICAgICAgICYmIHNpemUuICAgIGV4dFNbMV0gPT0gb3RoZXIuc2l6ZS5leHRTWzFdCisgICAgICAgICAgICAgICAgJiYgc2l6ZS4gICAgZXh0U1syXSA9PSBvdGhlci5zaXplLmV4dFNbMl0pOworICAgIH0KKworICAgIC8vISBPcGVyYXRvcighPSkgb3ZlcnJpZGUKKyAgICBib29sIG9wZXJhdG9yICE9KGNvbnN0IFNlY0J1ZmZlciAmb3RoZXIpIGNvbnN0CisgICAgeworICAgICAgICAvLyB1c2Ugb3BlcmF0b3IoPT0pCisgICAgICAgIHJldHVybiAhKCp0aGlzID09IG90aGVyKTsKKyAgICB9CisKKyAgICAvLyEgR2V0IEJ1ZmZlciB0eXBlCisgICAgc3RhdGljIGludCBCVUZGRVJfVFlQRShTZWNCdWZmZXIgKmJ1ZikKKyAgICB7CisgICAgICAgIGludCB0eXBlID0gQlVGRkVSX1RZUEVfQkFTRTsKKyAgICAgICAgaWYgKGJ1Zi0+dmlydC5wKQorICAgICAgICAgICAgdHlwZSB8PSBCVUZGRVJfVFlQRV9WSVJUOworICAgICAgICBpZiAoYnVmLT5waHlzLnApCisgICAgICAgICAgICB0eXBlIHw9IEJVRkZFUl9UWVBFX1BIWVM7CisgICAgICAgIGlmIChidWYtPnJlc2VydmVkLnApCisgICAgICAgICAgICB0eXBlIHw9IEJVRkZFUl9UWVBFX1JFU0VSVkVEOworCisgICAgICAgIHJldHVybiB0eXBlOworICAgIH0KK307CisKKyNlbmRpZiAvL19fU0VDX0JVRkZFUl9IX18KZGlmZiAtLWdpdCBhL2V4eW5vczQvaGFsL2luY2x1ZGUvU2VjRmltYy5oIGIvZXh5bm9zNC9oYWwvaW5jbHVkZS9TZWNGaW1jLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjE1ODVjMgotLS0gL2Rldi9udWxsCisrKyBiL2V4eW5vczQvaGFsL2luY2x1ZGUvU2VjRmltYy5oCkBAIC0wLDAgKzEsMTkwIEBACisvKgorICogQ29weXJpZ2h0QCBTYW1zdW5nIEVsZWN0cm9uaWNzIENvLiBMVEQKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworLyohCisgKiBcZmlsZSAgICAgIFNlY0ZpbWMuaAorICogXGJyaWVmICAgICBoZWFkZXIgZmlsZSBmb3IgRmltYyBIQUwgTU9EVUxFCisgKiBcYXV0aG9yICAgIEh5dW5reXVuZywgS2ltKGhrMzEwLmtpbUBzYW1zdW5nLmNvbSkKKyAqIFxkYXRlICAgICAgMjAxMC8xMC8xMworICoKKyAqIDxiPlJldmlzaW9uIEhpc3Rvcnk6IDwvYj4KKyAqIC0gMjAxMC8xMC8xMyA6IEh5dW5reXVuZywgS2ltKGhrMzEwLmtpbUBzYW1zdW5nLmNvbSkgXG4KKyAqICAgSW5pdGlhbCB2ZXJzaW9uCisgKgorICogLSAyMDExLzExLzE1IDogU3VubWksIExlZShjYXJyb3RzbS5sZWVAc2Ftc3VuZy5jb20pIFxuCisgKiAgIEFkanVzdCBWNEwyIGFyY2hpdGVjdHVyZSBcbgorICovCisKKyNpZm5kZWYgX19TRUNfRklNQ19IX18KKyNkZWZpbmUgX19TRUNfRklNQ19IX18KKworI2lmZGVmIF9fY3BsdXNwbHVzCitleHRlcm4gIkMiIHsKKyNlbmRpZgorCisjaW5jbHVkZSA8bGludXgvZmIuaD4KKworI2luY2x1ZGUgPHN0ZGludC5oPgorI2luY2x1ZGUgPHN0cmluZy5oPgorI2luY2x1ZGUgPHVuaXN0ZC5oPgorI2luY2x1ZGUgPGVycm5vLmg+CisjaW5jbHVkZSA8ZmNudGwuaD4KKyNpbmNsdWRlIDxhc20vc2l6ZXMuaD4KKworI2luY2x1ZGUgPHN5cy9pb2N0bC5oPgorI2luY2x1ZGUgPHN5cy90eXBlcy5oPgorI2luY2x1ZGUgPHN5cy9wb2xsLmg+CisjaW5jbHVkZSA8c3lzL21tYW4uaD4KKyNpbmNsdWRlIDxoYXJkd2FyZS9oYXJkd2FyZS5oPgorCisjaW5jbHVkZSAidXRpbHMvVGltZXJzLmgiCisKKyNpZmRlZiBCT0FSRF9VU0VfVjRMMgorI2luY2x1ZGUgInM1cF9maW1jX3Y0bDIuaCIKKyNpbmNsdWRlICJzZWNfdXRpbHNfdjRsMi5oIgorI2Vsc2UKKyNpbmNsdWRlICJzNXBfZmltYy5oIgorI2luY2x1ZGUgInNlY191dGlscy5oIgorI2VuZGlmCisjaW5jbHVkZSAic2VjX2Zvcm1hdC5oIgorCisjaW5jbHVkZSAiU2VjQnVmZmVyLmgiCisjaW5jbHVkZSAiU2VjUmVjdC5oIgorCisjZGVmaW5lIFBGWF9OT0RFX0ZJTUMgICAgICAgICIvZGV2L3ZpZGVvIgorI2RlZmluZSBNQVhfRFNUX0JVRkZFUlMgICAgICgzKQorI2RlZmluZSBNQVhfU1JDX0JVRkZFUlMgICAgICgxKQorI2RlZmluZSBNQVhfUExBTkVTICAgICAgICAgICgzKQorCisjaWZkZWYgX19jcGx1c3BsdXMKK30KKworY2xhc3MgU2VjRmltYworeworcHVibGljOgorICAgIGVudW0gREVWIHsKKyAgICAgICAgREVWXzAgPSAwLAorICAgICAgICBERVZfMSwKKyAgICAgICAgREVWXzIsCisgICAgICAgIERFVl8zLAorICAgICAgICBERVZfTUFYLAorICAgIH07CisKKyAgICBlbnVtIE1PREUgeworICAgICAgICBNT0RFX05PTkUgPSAwLAorICAgICAgICBNT0RFX1NJTkdMRV9CVUYsCisgICAgICAgIE1PREVfTVVMVElfQlVGLAorICAgICAgICBNT0RFX0RNQV9BVVRPLAorICAgICAgICBNT0RFX01BWCwKKyAgICB9OworCitwcml2YXRlOgorICAgIGJvb2wgICAgICAgICAgICAgICAgICAgICAgICBtRmxhZ0NyZWF0ZTsKKyAgICBpbnQgICAgICAgICAgICAgICAgICAgICAgICAgbURldjsKKyAgICBpbnQgICAgICAgICAgICAgICAgICAgICAgICAgbUZpbWNNb2RlOworICAgIGludCAgICAgICAgICAgICAgICAgICAgICAgICBtTnVtT2ZCdWY7CisKKyAgICBpbnQgICAgICAgICAgICAgICAgICAgICAgICAgbVJlYWxEZXY7CisgICAgaW50ICAgICAgICAgICAgICAgICAgICAgICAgIG1GZDsKKyAgICBpbnQgICAgICAgICAgICAgICAgICAgICAgICAgbUh3VmVyc2lvbjsKKyAgICBpbnQgICAgICAgICAgICAgICAgICAgICAgICAgbVJvdFZhbDsKKyAgICBib29sICAgICAgICAgICAgICAgICAgICAgICAgbUZsYWdHbG9iYWxBbHBoYTsKKyAgICBpbnQgICAgICAgICAgICAgICAgICAgICAgICAgbUdsb2JhbEFscGhhOworICAgIGJvb2wgICAgICAgICAgICAgICAgICAgICAgICBtRmxhZ0xvY2FsQWxwaGE7CisgICAgYm9vbCAgICAgICAgICAgICAgICAgICAgICAgIG1GbGFnQ29sb3JLZXk7CisgICAgaW50ICAgICAgICAgICAgICAgICAgICAgICAgIG1Db2xvcktleTsKKyAgICBib29sICAgICAgICAgICAgICAgICAgICAgICAgbUZsYWdTZXRTcmNQYXJhbTsKKyAgICBib29sICAgICAgICAgICAgICAgICAgICAgICAgbUZsYWdTZXREc3RQYXJhbTsKKyAgICBib29sICAgICAgICAgICAgICAgICAgICAgICAgbUZsYWdTdHJlYW1PbjsKKworICAgIHM1cF9maW1jX3QgICAgICAgICAgICAgICAgICBtUzVwRmltYzsKKyAgICBzdHJ1Y3QgdjRsMl9jYXBhYmlsaXR5ICAgICAgbUZpbWNDYXA7CisKKyAgICBTZWNCdWZmZXIgICAgICAgICAgICAgICAgICAgbVNyY0J1ZmZlcjsKKyAgICBTZWNCdWZmZXIgICAgICAgICAgICAgICAgICAgbURzdEJ1ZmZlcltNQVhfRFNUX0JVRkZFUlNdOworCitwdWJsaWM6CisgICAgU2VjRmltYygpOworICAgIHZpcnR1YWwgflNlY0ZpbWMoKTsKKworICAgIHZpcnR1YWwgYm9vbCBjcmVhdGUoZW51bSBERVYgZGV2LCBlbnVtIE1PREUgbW9kZSwgaW50IG51bU9mQnVmKTsKKyAgICB2aXJ0dWFsIGJvb2wgZGVzdHJveSh2b2lkKTsKKyAgICBib29sIGZsYWdDcmVhdGUodm9pZCk7CisKKyAgICBpbnQgIGdldEZkKHZvaWQpOworCisgICAgU2VjQnVmZmVyICogZ2V0TWVtQWRkcihpbnQgaW5kZXggPSAwKTsKKworICAgIGludCAgZ2V0SFdWZXJzaW9uKHZvaWQpOworCisgICAgdmlydHVhbCBib29sIHNldFNyY1BhcmFtcyh1bnNpZ25lZCBpbnQgd2lkdGgsIHVuc2lnbmVkIGludCBoZWlnaHQsCisgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgaW50IGNyb3BYLCB1bnNpZ25lZCBpbnQgY3JvcFksCisgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgaW50ICpjcm9wV2lkdGgsIHVuc2lnbmVkIGludCAqY3JvcEhlaWdodCwKKyAgICAgICAgICAgICAgICAgICAgICBpbnQgY29sb3JGb3JtYXQsCisgICAgICAgICAgICAgICAgICAgICAgYm9vbCBmb3JjZUNoYW5nZSA9IHRydWUpOworCisgICAgdmlydHVhbCBib29sIGdldFNyY1BhcmFtcyh1bnNpZ25lZCBpbnQgKndpZHRoLCB1bnNpZ25lZCBpbnQgKmhlaWdodCwKKyAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBpbnQgKmNyb3BYLCB1bnNpZ25lZCBpbnQgKmNyb3BZLAorICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGludCAqY3JvcFdpZHRoLCB1bnNpZ25lZCBpbnQgKmNyb3BIZWlnaHQsCisgICAgICAgICAgICAgICAgICAgICAgaW50ICpjb2xvckZvcm1hdCk7CisKKyAgICB2aXJ0dWFsIGJvb2wgc2V0U3JjQWRkcih1bnNpZ25lZCBpbnQgcGh5c1lBZGRyLAorICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBpbnQgcGh5c0NiQWRkciA9IDAsCisgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGludCBwaHlzQ3JBZGRyID0gMCwKKyAgICAgICAgICAgICAgICAgICAgaW50IGNvbG9yRm9ybWF0ID0gMCk7CisKKyAgICB2aXJ0dWFsIGJvb2wgc2V0RHN0UGFyYW1zKHVuc2lnbmVkIGludCB3aWR0aCwgdW5zaWduZWQgaW50IGhlaWdodCwKKyAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBpbnQgY3JvcFgsIHVuc2lnbmVkIGludCBjcm9wWSwKKyAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBpbnQgKmNyb3BXaWR0aCwgdW5zaWduZWQgaW50ICpjcm9wSGVpZ2h0LAorICAgICAgICAgICAgICAgICAgICAgIGludCBjb2xvckZvcm1hdCwKKyAgICAgICAgICAgICAgICAgICAgICBib29sIGZvcmNlQ2hhbmdlID0gdHJ1ZSk7CisKKyAgICB2aXJ0dWFsIGJvb2wgZ2V0RHN0UGFyYW1zKHVuc2lnbmVkIGludCAqd2lkdGgsIHVuc2lnbmVkIGludCAqaGVpZ2h0LAorICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGludCAqY3JvcFgsIHVuc2lnbmVkIGludCAqY3JvcFksCisgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgaW50ICpjcm9wV2lkdGgsIHVuc2lnbmVkIGludCAqY3JvcEhlaWdodCwKKyAgICAgICAgICAgICAgICAgICAgICBpbnQgKmNvbG9yRm9ybWF0KTsKKworICAgIHZpcnR1YWwgYm9vbCBzZXREc3RBZGRyKHVuc2lnbmVkIGludCBwaHlzWUFkZHIsIHVuc2lnbmVkIGludCBwaHlzQ2JBZGRyID0gMCwgdW5zaWduZWQgaW50IHBoeXNDckFkZHIgPSAwLCBpbnQgYnVmX2luZGV4ID0gMCk7CisKKyAgICB2aXJ0dWFsIGJvb2wgc2V0Um90VmFsKHVuc2lnbmVkIGludCByb3RWYWwpOworICAgIHZpcnR1YWwgYm9vbCBzZXRHbG9iYWxBbHBoYShib29sIGVuYWJsZSA9IHRydWUsIGludCBhbHBoYSA9IDB4ZmYpOworICAgIHZpcnR1YWwgYm9vbCBzZXRMb2NhbEFscGhhKGJvb2wgZW5hYmxlKTsKKyAgICB2aXJ0dWFsIGJvb2wgc2V0Q29sb3JLZXkoYm9vbCBlbmFibGUgPSB0cnVlLCBpbnQgY29sb3JLZXkgPSAweGZmKTsKKworICAgIHZpcnR1YWwgYm9vbCBkcmF3KGludCBzcmNfaW5kZXgsIGludCBkc3RfaW5kZXgpOworCitwcml2YXRlOgorICAgIGJvb2wgbV9zdHJlYW1Pbih2b2lkKTsKKyAgICBib29sIG1fY2hlY2tTcmNTaXplKHVuc2lnbmVkIGludCB3aWR0aCwgdW5zaWduZWQgaW50IGhlaWdodCwKKyAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGludCBjcm9wWCwgdW5zaWduZWQgaW50IGNyb3BZLAorICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgaW50ICpjcm9wV2lkdGgsIHVuc2lnbmVkIGludCAqY3JvcEhlaWdodCwKKyAgICAgICAgICAgICAgICAgICAgICAgIGludCBjb2xvckZvcm1hdCwKKyAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgZm9yY2VDaGFuZ2UgPSBmYWxzZSk7CisKKyAgICBib29sIG1fY2hlY2tEc3RTaXplKHVuc2lnbmVkIGludCB3aWR0aCwgdW5zaWduZWQgaW50IGhlaWdodCwKKyAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGludCBjcm9wWCwgdW5zaWduZWQgaW50IGNyb3BZLAorICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgaW50ICpjcm9wV2lkdGgsIHVuc2lnbmVkIGludCAqY3JvcEhlaWdodCwKKyAgICAgICAgICAgICAgICAgICAgICAgIGludCBjb2xvckZvcm1hdCwKKyAgICAgICAgICAgICAgICAgICAgICAgIGludCByb3RWYWwsCisgICAgICAgICAgICAgICAgICAgICAgICBib29sIGZvcmNlQ2hhbmdlID0gZmFsc2UpOworICAgIGludCAgbV93aWR0aE9mRmltYyhpbnQgdjRsMkNvbG9yRm9ybWF0LCBpbnQgd2lkdGgpOworICAgIGludCAgbV9oZWlnaHRPZkZpbWMoaW50IHY0bDJDb2xvckZvcm1hdCwgaW50IGhlaWdodCk7CisgICAgaW50ICBtX2dldFl1dkJwcCh1bnNpZ25lZCBpbnQgZm10KTsKKyAgICBpbnQgIG1fZ2V0WXV2UGxhbmVzKHVuc2lnbmVkIGludCBmbXQpOworfTsKKyNlbmRpZgorCisjZW5kaWYgLy9fX1NFQ19GSU1DX0hfXwpkaWZmIC0tZ2l0IGEvZXh5bm9zNC9oYWwvaW5jbHVkZS9TZWNIZG1pLmggYi9leHlub3M0L2hhbC9pbmNsdWRlL1NlY0hkbWkuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42N2MzMzc4Ci0tLSAvZGV2L251bGwKKysrIGIvZXh5bm9zNC9oYWwvaW5jbHVkZS9TZWNIZG1pLmgKQEAgLTAsMCArMSwyMjAgQEAKKy8qCisgKiBDb3B5cmlnaHRAIFNhbXN1bmcgRWxlY3Ryb25pY3MgQ28uIExURAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyoqCisqKiBAYXV0aG9yIFNhbmd3b28sIFBhcmsoc3c1NzcxLnBhcmtAc2Ftc3VuZy5jb20pCisqKiBAZGF0ZSAgIDIwMTAtMDktMTAKKyoqCisqLworCisjaWZuZGVmIF9fU0VDX0hETUlfSF9fCisjZGVmaW5lIF9fU0VDX0hETUlfSF9fCisKKyNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KKyNpbmNsdWRlIDxzeXMvc3RhdC5oPgorI2luY2x1ZGUgPHN5cy9pb2N0bC5oPgorI2luY2x1ZGUgPHN5cy9tbWFuLmg+CisjaW5jbHVkZSA8ZmNudGwuaD4KKyNpbmNsdWRlIDxjdHlwZS5oPgorI2luY2x1ZGUgPHVuaXN0ZC5oPgorI2luY2x1ZGUgPHN0cmluZy5oPgorI2luY2x1ZGUgPGVycm5vLmg+CisjaW5jbHVkZSA8c2lnbmFsLmg+CisjaW5jbHVkZSA8cHRocmVhZC5oPgorCisjaWZkZWYgQk9BUkRfVVNFX1Y0TDIKKyNpbmNsdWRlICJzNXBfdHZvdXRfdjRsMi5oIgorI2Vsc2UKKyNpbmNsdWRlICJzNXBfdHZvdXQuaCIKKyNlbmRpZgorI2lmIGRlZmluZWQoQk9BUkRfVVNFU19GSU1HQVBJKQorI2luY2x1ZGUgInNlY19nMmQuaCIKKyNlbmRpZgorI2luY2x1ZGUgInMzY19sY2QuaCIKKyNpbmNsdWRlICJTZWNCdWZmZXIuaCIKKyNpbmNsdWRlICJTZWNGaW1jLmgiCisKKyNpbmNsdWRlICIuLi9saWJoZG1pL2xpYnNGb3JoZG1pL2xpYmVkaWQvbGliZWRpZC5oIgorI2luY2x1ZGUgIi4uL2xpYmhkbWkvbGlic0ZvcmhkbWkvbGliY2VjL2xpYmNlYy5oIgorCisjaW5jbHVkZSAiLi4vbGliaGRtaS9TZWNIZG1pL1NlY0hkbWlDb21tb24uaCIKKyNpbmNsdWRlICIuLi9saWJoZG1pL1NlY0hkbWkvU2VjSGRtaVY0TDJVdGlscy5oIgorCisjaWYgZGVmaW5lZChCT0FSRF9VU0VTX0ZJTUdBUEkpCisjaW5jbHVkZSAiRmltZ0FwaS5oIgorI2VuZGlmCisKKyNpbmNsdWRlIDxsaW51eC9mYi5oPgorCisjaW5jbHVkZSA8aGFyZHdhcmUvaGFyZHdhcmUuaD4KKworI2luY2x1ZGUgPHV0aWxzL3RocmVhZHMuaD4KKworCituYW1lc3BhY2UgYW5kcm9pZCB7CisKK2NsYXNzIFNlY0hkbWk6IHZpcnR1YWwgcHVibGljIFJlZkJhc2UKK3sKK3B1YmxpYyA6CisgICAgZW51bSBIRE1JX0xBWUVSIHsKKyAgICAgICAgSERNSV9MQVlFUl9CQVNFICAgPSAwLAorICAgICAgICBIRE1JX0xBWUVSX1ZJREVPLAorICAgICAgICBIRE1JX0xBWUVSX0dSQVBISUNfMCwKKyAgICAgICAgSERNSV9MQVlFUl9HUkFQSElDXzEsCisgICAgICAgIEhETUlfTEFZRVJfTUFYLAorICAgIH07CisKK3ByaXZhdGUgOgorICAgIGNsYXNzIENFQ1RocmVhZDogcHVibGljIFRocmVhZAorICAgIHsKKyAgICAgICAgcHVibGljOgorICAgICAgICAgICAgYm9vbCAgICAgICAgICAgICAgICBtRmxhZ1J1bm5pbmc7CisKKyAgICAgICAgcHJpdmF0ZToKKyAgICAgICAgICAgIHNwPFNlY0hkbWk+ICAgICAgICAgbVNlY0hkbWk7CisgICAgICAgICAgICBNdXRleCAgICAgICAgICAgICAgIG1UaHJlYWRMb29wTG9jazsKKyAgICAgICAgICAgIE11dGV4ICAgICAgICAgICAgICAgbVRocmVhZENvbnRyb2xMb2NrOworICAgICAgICAgICAgdmlydHVhbCBib29sICAgICAgICB0aHJlYWRMb29wKCk7CisgICAgICAgICAgICBlbnVtIENFQ0RldmljZVR5cGUgIG1EZXZ0eXBlOworICAgICAgICAgICAgaW50ICAgICAgICAgICAgICAgICBtTGFkZHI7CisgICAgICAgICAgICBpbnQgICAgICAgICAgICAgICAgIG1QYWRkcjsKKworICAgICAgICBwdWJsaWM6CisgICAgICAgICAgICBDRUNUaHJlYWQoc3A8U2VjSGRtaT4gc2VjSGRtaSkKKyAgICAgICAgICAgICAgICA6VGhyZWFkKGZhbHNlKSwKKyAgICAgICAgICAgICAgICBtRmxhZ1J1bm5pbmcoZmFsc2UpLAorICAgICAgICAgICAgICAgIG1TZWNIZG1pKHNlY0hkbWkpLAorICAgICAgICAgICAgICAgIG1EZXZ0eXBlKENFQ19ERVZJQ0VfUExBWUVSKSwKKyAgICAgICAgICAgICAgICBtTGFkZHIoMCksCisgICAgICAgICAgICAgICAgbVBhZGRyKDApeworICAgICAgICAgICAgfTsKKyAgICAgICAgICAgIHZpcnR1YWwgfkNFQ1RocmVhZCgpOworCisgICAgICAgICAgICBib29sIHN0YXJ0KCk7CisgICAgICAgICAgICBib29sIHN0b3AoKTsKKworICAgIH07CisKKyAgICBNdXRleCAgICAgICAgbUxvY2s7CisKKyAgICBzcDxDRUNUaHJlYWQ+ICAgICAgICAgICAgICAgbUNFQ1RocmVhZDsKKworICAgIGJvb2wgICAgICAgICBtRmxhZ0NyZWF0ZTsKKyAgICBib29sICAgICAgICAgbUZsYWdDb25uZWN0ZWQ7CisgICAgYm9vbCAgICAgICAgIG1GbGFnTGF5ZXJFbmFibGVbSERNSV9MQVlFUl9NQVhdOworICAgIGJvb2wgICAgICAgICBtRmxhZ0hkbWlTdGFydFtIRE1JX0xBWUVSX01BWF07CisKKyAgICBpbnQgICAgICAgICAgbVNyY1dpZHRoW0hETUlfTEFZRVJfTUFYXTsKKyAgICBpbnQgICAgICAgICAgbVNyY0hlaWdodFtIRE1JX0xBWUVSX01BWF07CisgICAgaW50ICAgICAgICAgIG1TcmNDb2xvckZvcm1hdFtIRE1JX0xBWUVSX01BWF07CisgICAgaW50ICAgICAgICAgIG1IZG1pUmVzb2x1dGlvbldpZHRoW0hETUlfTEFZRVJfTUFYXTsKKyAgICBpbnQgICAgICAgICAgbUhkbWlSZXNvbHV0aW9uSGVpZ2h0W0hETUlfTEFZRVJfTUFYXTsKKworICAgIGludCAgICAgICAgICBtSGRtaURzdFdpZHRoOworICAgIGludCAgICAgICAgICBtSGRtaURzdEhlaWdodDsKKworICAgIHVuc2lnbmVkIGludCBtSGRtaVNyY1lBZGRyOworICAgIHVuc2lnbmVkIGludCBtSGRtaVNyY0NiQ3JBZGRyOworCisgICAgaW50ICAgICAgICAgIG1IZG1pT3V0cHV0TW9kZTsKKyAgICB1bnNpZ25lZCBpbnQgbUhkbWlSZXNvbHV0aW9uVmFsdWU7CisKKyAgICB1bnNpZ25lZCBpbnQgbUhkbWlQcmVzZXRJZDsKKyAgICB2NGwyX3N0ZF9pZCAgbUhkbWlTdGRJZDsKKyAgICB1bnNpZ25lZCBpbnQgbUNvbXBvc2l0ZVN0ZDsKKworICAgIGJvb2wgICAgICAgICBtSGRjcE1vZGU7CisgICAgaW50ICAgICAgICAgIG1BdWRpb01vZGU7CisgICAgdW5zaWduZWQgaW50IG1VSVJvdFZhbDsKKyAgICB1bnNpZ25lZCBpbnQgbUcyRFVJUm90VmFsOworCisgICAgaW50ICAgICAgICAgIG1DdXJyZW50SGRtaU91dHB1dE1vZGU7CisgICAgdW5zaWduZWQgaW50IG1DdXJyZW50SGRtaVJlc29sdXRpb25WYWx1ZTsKKyAgICBib29sICAgICAgICAgbUN1cnJlbnRIZGNwTW9kZTsKKyAgICBpbnQgICAgICAgICAgbUN1cnJlbnRBdWRpb01vZGU7CisgICAgYm9vbCAgICAgICAgIG1IZG1pSW5mb0NoYW5nZTsKKworICAgIGludCAgICAgICAgICBtRmltY0RzdENvbG9yRm9ybWF0OworCisgICAgU2VjQnVmZmVyICAgIG1GaW1jUmVzZXJ2ZWRNZW1bSERNSV9GSU1DX09VVFBVVF9CVUZfTlVNXTsKKyAgICB1bnNpZ25lZCBpbnQgbUZpbWNDdXJyZW50T3V0QnVmSW5kZXg7CisgICAgU2VjRmltYyAgICAgIG1TZWNGaW1jOworCisgICAgdW5zaWduZWQgaW50IG1IZG1pUmVzb2x1dGlvblZhbHVlTGlzdFsxNF07CisgICAgaW50ICAgICAgICAgIG1IZG1pU2l6ZU9mUmVzb2x1dGlvblZhbHVlTGlzdDsKKworICAgIFNlY0J1ZmZlciAgICBtTWl4ZXJCdWZmZXJbSERNSV9MQVlFUl9NQVhdW01BWF9CVUZGRVJTX01JWEVSXTsKKworICAgIHZvaWQgICAgICAgICAqbUZCYWRkcjsKKyAgICB1bnNpZ25lZCBpbnQgbUZCc2l6ZTsKKyAgICBpbnQgICAgICAgICAgbUZCaW9uZmQ7CisgICAgaW50ICAgICAgICAgIG1IZG1pRmRbSERNSV9MQVlFUl9NQVhdOworCisgICAgaW50ICAgICAgICAgIG1Ec3RXaWR0aFtIRE1JX0xBWUVSX01BWF07CisgICAgaW50ICAgICAgICAgIG1Ec3RIZWlnaHRbSERNSV9MQVlFUl9NQVhdOworICAgIGludCAgICAgICAgICBtUHJldkRzdFdpZHRoW0hETUlfTEFZRVJfTUFYXTsKKyAgICBpbnQgICAgICAgICAgbVByZXZEc3RIZWlnaHRbSERNSV9MQVlFUl9NQVhdOworCisgICAgaW50ICAgICAgICAgIG1EZWZhdWx0RkJGZDsKKyAgICBpbnQgICAgICAgICAgbURpc3BsYXlXaWR0aDsKKyAgICBpbnQgICAgICAgICAgbURpc3BsYXlIZWlnaHQ7CisKKyAgICBzdHJ1Y3QgdjRsMl9yZWN0IG1Ec3RSZWN0OworCitwdWJsaWMgOgorCisgICAgU2VjSGRtaSgpOworICAgIHZpcnR1YWwgflNlY0hkbWkoKTsKKyAgICBib29sICAgICAgICBjcmVhdGUoaW50IHdpZHRoLCBpbnQgaGVpZ2h0KTsKKyAgICBib29sICAgICAgICBkZXN0cm95KHZvaWQpOworICAgIGlubGluZSBib29sIGZsYWdDcmVhdGUodm9pZCkgeyByZXR1cm4gbUZsYWdDcmVhdGU7IH0KKworICAgIGJvb2wgICAgICAgIGNvbm5lY3Qodm9pZCk7CisgICAgYm9vbCAgICAgICAgZGlzY29ubmVjdCh2b2lkKTsKKworICAgIGJvb2wgICAgICAgIGZsYWdDb25uZWN0ZWQodm9pZCk7CisKKyAgICBib29sICAgICAgICBmbHVzaChpbnQgc3JjVywgaW50IHNyY0gsIGludCBzcmNDb2xvckZvcm1hdCwKKyAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGludCBzcmNZQWRkciwgdW5zaWduZWQgaW50IHNyY0NiQWRkciwgdW5zaWduZWQgaW50IHNyY0NyQWRkciwKKyAgICAgICAgICAgICAgICAgICAgICAgIGludCBkc3RYLCBpbnQgZHN0WSwKKyAgICAgICAgICAgICAgICAgICAgICAgIGludCBoZG1pTGF5ZXIsCisgICAgICAgICAgICAgICAgICAgICAgICBpbnQgbnVtX29mX2h3Y19sYXllcik7CisKKwlib29sICAgICAgICBjbGVhcihpbnQgaGRtaUxheWVyKTsKKworICAgIGJvb2wgICAgICAgIHNldEhkbWlPdXRwdXRNb2RlKGludCBoZG1pT3V0cHV0TW9kZSwgYm9vbCBmb3JjZVJ1biA9IGZhbHNlKTsKKyAgICBib29sICAgICAgICBzZXRIZG1pUmVzb2x1dGlvbih1bnNpZ25lZCBpbnQgaGRtaVJlc29sdXRpb25WYWx1ZSwgYm9vbCBmb3JjZVJ1biA9IGZhbHNlKTsKKyAgICBib29sICAgICAgICBzZXRIZGNwTW9kZShib29sIGhkY3BNb2RlLCBib29sIGZvcmNlUnVuID0gZmFsc2UpOworICAgIGJvb2wgICAgICAgIHNldFVJUm90YXRpb24odW5zaWduZWQgaW50IHJvdFZhbCwgdW5zaWduZWQgaW50IGh3Y0xheWVyKTsKKyAgICBib29sICAgICAgICBzZXREaXNwbGF5U2l6ZShpbnQgd2lkdGgsIGludCBoZWlnaHQpOworCitwcml2YXRlOgorCisgICAgYm9vbCAgICAgICAgbV9yZXNldChpbnQgdywgaW50IGgsIGludCBjb2xvckZvcm1hdCwgaW50IGhkbWlMYXllciwgaW50IGh3Y0xheWVyKTsKKyAgICBib29sICAgICAgICBtX3N0YXJ0SGRtaShpbnQgaGRtaUxheWVyLCB1bnNpZ25lZCBpbnQgbnVtX29mX3BsYW5lKTsKKyAgICBib29sICAgICAgICBtX3N0YXJ0SGRtaShpbnQgaGRtaUxheWVyKTsKKyAgICBib29sICAgICAgICBtX3N0b3BIZG1pKGludCBoZG1pTGF5ZXIpOworICAgIGJvb2wgICAgICAgIG1fc2V0SGRtaU91dHB1dE1vZGUoaW50IGhkbWlPdXRwdXRNb2RlKTsKKyAgICBib29sICAgICAgICBtX3NldEhkbWlSZXNvbHV0aW9uKHVuc2lnbmVkIGludCBoZG1pUmVzb2x1dGlvblZhbHVlKTsKKyAgICBib29sICAgICAgICBtX3NldENvbXBvc2l0ZVJlc29sdXRpb24odW5zaWduZWQgaW50IGNvbXBvc2l0ZVN0ZElkKTsKKyAgICBib29sICAgICAgICBtX3NldEhkY3BNb2RlKGJvb2wgaGRjcE1vZGUpOworICAgIGJvb2wgICAgICAgIG1fc2V0QXVkaW9Nb2RlKGludCBhdWRpb01vZGUpOworCisgICAgaW50ICAgICAgICAgbV9yZXNvbHV0aW9uVmFsdWVJbmRleCh1bnNpZ25lZCBpbnQgUmVzb2x1dGlvblZhbHVlKTsKKyAgICBib29sICAgICAgICBtX2ZsYWdIV0Nvbm5lY3RlZCh2b2lkKTsKK307CisKK307IC8vIG5hbWVzcGFjZSBhbmRyb2lkCisKKyNlbmRpZiAvL19fU0VDX0hETUlfSF9fCmRpZmYgLS1naXQgYS9leHlub3M0L2hhbC9pbmNsdWRlL1NlY1JlY3QuaCBiL2V4eW5vczQvaGFsL2luY2x1ZGUvU2VjUmVjdC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjExNjBhMGIKLS0tIC9kZXYvbnVsbAorKysgYi9leHlub3M0L2hhbC9pbmNsdWRlL1NlY1JlY3QuaApAQCAtMCwwICsxLDE3MiBAQAorLyoKKyAqIENvcHlyaWdodEAgU2Ftc3VuZyBFbGVjdHJvbmljcyBDby4gTFRECisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorKi8KKworLyohCisgKiBcZmlsZSAgICAgIFNlY1JlY3QuaAorICogXGJyaWVmICAgICBoZWFkZXIgZmlsZSBmb3IgU2VjUmVjdAorICogXGF1dGhvciAgICBTYW5nd29vLCBQYXJrKHN3NTc3MS5wYXJrQHNhbXN1bmcuY29tKQorICogXGRhdGUgICAgICAyMDExLzA2LzAyCisgKgorICogPGI+UmV2aXNpb24gSGlzdG9yeTogPC9iPgorICogLSAyMDEwLzA2LzAzIDogU2FuZ3dvbywgUGFyayhzdzU3NzEucGFya0BzYW1zdW5nLmNvbSkgXG4KKyAqICAgSW5pdGlhbCB2ZXJzaW9uCisgKgorICovCisKKy8qKgorICogQHBhZ2UgU2VjUmVjdAorICoKKyAqIEBzZWN0aW9uIEludHJvZHVjdGlvbgorICogU2V0UmVjdCBpcyBjb21tb24gc3RydWN0IGZvciByZWN0YW5nbGUKKyAqCisgKiBAc2VjdGlvbiBDb3B5cmlnaHQKKyAqICBDb3B5cmlnaHQgKGMpIDIwMDgtMjAxMSBTYW1zdW5nIEVsZWN0cm9uaWNzIENvLiwgTHRkLkFsbCByaWdodHMgcmVzZXJ2ZWQuIFxuCisgKiAgUHJvcHJpZXRhcnkgYW5kIENvbmZpZGVudGlhbAorICoKKyAqIEBpbWFnZSBodG1sIHNhbXN1bmcucG5nCisgKi8KKworI2lmbmRlZiBfX1NFQ19SRUNUX0hfXworI2RlZmluZSBfX1NFQ19SRUNUX0hfXworCisvLyEgUmVjdGFuZ2xlIGluZm9ybWF0aW9uCitzdHJ1Y3QgU2VjUmVjdAoreworICAgIGludCB4OyAgICAgICAgICAgLy8hPCB4IHBvcworICAgIGludCB5OyAgICAgICAgICAgLy8hPCB5IHBvcworICAgIGludCB3OyAgICAgICAgICAgLy8hPCB3aWR0aAorICAgIGludCBoOyAgICAgICAgICAgLy8hPCBoZWlnaHQKKyAgICBpbnQgZnVsbFc7ICAgICAgIC8vITwgZnVsbCB3aWR0aCBvZiBpbWFnZQorICAgIGludCBmdWxsSDsgICAgICAgLy8hPCBmdWxsIGhlaWdodCBvZiBpbWFnZQorICAgIGludCBjb2xvckZvcm1hdDsgLy8hPCBWNEwyX1BJWF9GTVRfWFhYCisKKyAgICAvLyEgQ29uc3RydWN0b3IKKyAgICBTZWNSZWN0KGludCBfeF8gPSAwLAorICAgICAgICAgICAgaW50IF95XyA9IDAsCisgICAgICAgICAgICBpbnQgX3dfID0gMCwKKyAgICAgICAgICAgIGludCBfaF8gPSAwLAorICAgICAgICAgICAgaW50IF9mdWxsV18gPSAwLAorICAgICAgICAgICAgaW50IF9mdWxsSF8gPSAwLAorICAgICAgICAgICAgaW50IF9jb2xvckZvcm1hdF8gPSAwKQorICAgIHsKKyAgICAgICAgeCA9IF94XzsKKyAgICAgICAgeSA9IF95XzsKKyAgICAgICAgdyA9IF93XzsKKyAgICAgICAgaCA9IF9oXzsKKyAgICAgICAgZnVsbFcgPSBfZnVsbFdfOworICAgICAgICBmdWxsSCA9IF9mdWxsSF87CisgICAgICAgIGNvbG9yRm9ybWF0ID0gX2NvbG9yRm9ybWF0XzsKKyAgICB9CisKKyAgICAvLyEgQ29uc3RydWN0b3IKKyAgICBTZWNSZWN0KGNvbnN0IFNlY1JlY3QgKm90aGVyKQorICAgIHsKKyAgICAgICAgeCAgICAgICAgICAgPSBvdGhlci0+eDsKKyAgICAgICAgeSAgICAgICAgICAgPSBvdGhlci0+eTsKKyAgICAgICAgdyAgICAgICAgICAgPSBvdGhlci0+dzsKKyAgICAgICAgaCAgICAgICAgICAgPSBvdGhlci0+aDsKKyAgICAgICAgZnVsbFcgICAgICAgPSBvdGhlci0+ZnVsbFc7CisgICAgICAgIGZ1bGxIICAgICAgID0gb3RoZXItPmZ1bGxIOworICAgICAgICBjb2xvckZvcm1hdCA9IG90aGVyLT5jb2xvckZvcm1hdDsKKyAgICB9CisKKyAgICAvLyEgT3BlcmF0b3IoPSkgb3ZlcnJpZGUKKyAgICBTZWNSZWN0JiBvcGVyYXRvciA9KGNvbnN0IFNlY1JlY3QgJm90aGVyKQorICAgIHsKKyAgICAgICAgeCAgICAgICAgICAgPSBvdGhlci54OworICAgICAgICB5ICAgICAgICAgICA9IG90aGVyLnk7CisgICAgICAgIHcgICAgICAgICAgID0gb3RoZXIudzsKKyAgICAgICAgaCAgICAgICAgICAgPSBvdGhlci5oOworICAgICAgICBmdWxsVyAgICAgICA9IG90aGVyLmZ1bGxXOworICAgICAgICBmdWxsSCAgICAgICA9IG90aGVyLmZ1bGxIOworICAgICAgICBjb2xvckZvcm1hdCA9IG90aGVyLmNvbG9yRm9ybWF0OworICAgICAgICByZXR1cm4gKnRoaXM7CisgICAgfQorCisgICAgLy8hIE9wZXJhdG9yKD09KSBvdmVycmlkZQorICAgIGJvb2wgb3BlcmF0b3IgPT0oY29uc3QgU2VjUmVjdCAmb3RoZXIpIGNvbnN0CisgICAgeworICAgICAgICByZXR1cm4gKCAgIHggICAgICAgICAgID09IG90aGVyLngKKyAgICAgICAgICAgICAgICAmJiB5ICAgICAgICAgICA9PSBvdGhlci55CisgICAgICAgICAgICAgICAgJiYgdyAgICAgICAgICAgPT0gb3RoZXIudworICAgICAgICAgICAgICAgICYmIGggICAgICAgICAgID09IG90aGVyLmgKKyAgICAgICAgICAgICAgICAmJiBmdWxsVyAgICAgICA9PSBvdGhlci5mdWxsVworICAgICAgICAgICAgICAgICYmIGZ1bGxIICAgICAgID09IG90aGVyLmZ1bGxICisgICAgICAgICAgICAgICAgJiYgY29sb3JGb3JtYXQgPT0gb3RoZXIuY29sb3JGb3JtYXQpOworICAgIH0KKworICAgIC8vISBPcGVyYXRvcighPSkgb3ZlcnJpZGUKKyAgICBib29sIG9wZXJhdG9yICE9KGNvbnN0IFNlY1JlY3QgJm90aGVyKSBjb25zdAorICAgIHsKKyAgICAgICAgLy8gdXNlIG9wZXJhdG9yKD09KQorICAgICAgICByZXR1cm4gISgqdGhpcyA9PSBvdGhlcik7CisgICAgfQorfTsKKworLy8hIENsaXAgaW5mb3JtYXRpb24KK3N0cnVjdCBTZWNSZWN0MgoreworICAgIGludCB4MTsgLy8hPCBMZWZ0ICAgKFRoZSB4LWNvb3JkaW5hdGUgdmFsdWUgb2YgdXBwZXItbGVmdCBjb3JuZXIpCisgICAgaW50IHkxOyAvLyE8IFRvcCAgICAoVGhlIHktY29vcmRpbmF0ZSB2YWx1ZSBvZiB1cHBlci1sZWZ0IGNvcm5lcikKKyAgICBpbnQgeDI7IC8vITwgUmlnaHQgIChUaGUgeC1jb29yZGluYXRlIHZhbHVlIG9mIGxvd2VyLXJpZ2h0IGNvcm5lcikKKyAgICBpbnQgeTI7IC8vITwgQm90dG9tIChUaGUgeS1jb29yZGluYXRlIHZhbHVlIG9mIGxvd2VyLXJpZ2h0IGNvcm5lcikKKworICAgIC8vISBDb25zdHJ1Y3RvcgorICAgIFNlY1JlY3QyKGludCBfeDFfID0gMCwgaW50IF95MV8gPSAwLCBpbnQgX3gyXyA9IDAsIGludCBfeTJfID0gMCkKKyAgICB7CisgICAgICAgIHgxID0gX3gxXzsKKyAgICAgICAgeTEgPSBfeTFfOworICAgICAgICB4MiA9IF94Ml87CisgICAgICAgIHkyID0gX3kyXzsKKyAgICB9CisKKyAgICAvLyEgQ29uc3RydWN0b3IKKyAgICBTZWNSZWN0Mihjb25zdCBTZWNSZWN0MiAqb3RoZXIpCisgICAgeworICAgICAgICB4MSA9IG90aGVyLT54MTsKKyAgICAgICAgeTEgPSBvdGhlci0+eTE7CisgICAgICAgIHgyID0gb3RoZXItPngyOworICAgICAgICB5MiA9IG90aGVyLT55MjsKKyAgICB9CisKKyAgICAvLyEgT3BlcmF0b3IoPSkgb3ZlcnJpZGUKKyAgICBTZWNSZWN0MiYgb3BlcmF0b3IgPShjb25zdCBTZWNSZWN0MiAmb3RoZXIpCisgICAgeworICAgICAgICB4MSA9IG90aGVyLngxOworICAgICAgICB5MSA9IG90aGVyLnkxOworICAgICAgICB4MiA9IG90aGVyLngyOworICAgICAgICB5MiA9IG90aGVyLnkyOworICAgICAgICByZXR1cm4gKnRoaXM7CisgICAgfQorCisgICAgLy8hIE9wZXJhdG9yKD09KSBvdmVycmlkZQorICAgIGJvb2wgb3BlcmF0b3IgPT0oY29uc3QgU2VjUmVjdDIgJm90aGVyKSBjb25zdAorICAgIHsKKyAgICAgICAgcmV0dXJuICggICB4MSAgICAgICAgICAgPT0gb3RoZXIueDEKKyAgICAgICAgICAgICAgICAmJiB5MSAgICAgICAgICAgPT0gb3RoZXIueTEKKyAgICAgICAgICAgICAgICAmJiB4MiAgICAgICAgICAgPT0gb3RoZXIueDIKKyAgICAgICAgICAgICAgICAmJiB5MiAgICAgICAgICAgPT0gb3RoZXIueTIpOworICAgIH0KKworICAgIC8vISBPcGVyYXRvcighPSkgb3ZlcnJpZGUKKyAgICBib29sIG9wZXJhdG9yICE9KGNvbnN0IFNlY1JlY3QyICZvdGhlcikgY29uc3QKKyAgICB7CisgICAgICAgIC8vIHVzZSBvcGVyYXRvcig9PSkKKyAgICAgICAgcmV0dXJuICEoKnRoaXMgPT0gb3RoZXIpOworICAgIH0KK307CisKKyNlbmRpZiAvL19fU0VDX1JFQ1RfSF9fCmRpZmYgLS1naXQgYS9leHlub3M0L2hhbC9pbmNsdWRlL2F1ZGlvLmggYi9leHlub3M0L2hhbC9pbmNsdWRlL2F1ZGlvLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTI3NWRiMwotLS0gL2Rldi9udWxsCisrKyBiL2V4eW5vczQvaGFsL2luY2x1ZGUvYXVkaW8uaApAQCAtMCwwICsxLDM2MyBAQAorLyoKKyAqIENvcHlyaWdodEAgU2Ftc3VuZyBFbGVjdHJvbmljcyBDby4gTFRECisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpZm5kZWYgX0FVRElPX0hfCisjZGVmaW5lIF9BVURJT19IXworCisjaWZkZWYgX19jcGx1c3BsdXMKK2V4dGVybiAiQyIgeworI2VuZGlmCisKKyNpZm5kZWYgX19IRE1JX0FVRElPX0hETUlBVURJT1BPUlRfXworI2RlZmluZSBfX0hETUlfQVVESU9fSERNSUFVRElPUE9SVF9fCisvKioKKyAqIEBlbnVtIEhETUlBdWRpb1BvcnQKKyAqIEF2YWlsYWJsZSBhdWRpbyBpbnB1dHMgb24gSERNSSBIVyBtb2R1bGUuCisgKi8KK2VudW0gSERNSUF1ZGlvUG9ydCB7CisgICAgLyoqIEkyUyBpbnB1dCBwb3J0ICovCisgICAgSTJTX1BPUlQsCisgICAgLyoqIFNQRElGIGlucHV0IHBvcnQgKi8KKyAgICBTUERJRl9QT1JULAorICAgIC8qKiBEU0QgaW5wdXQgcG9ydCAqLworICAgIERTRF9QT1JULAorfTsKKyNlbmRpZiAvKiBfX0hETUlfQVVESU9fSERNSUFVRElPUE9SVF9fICovCisKKyNpZm5kZWYgX19IRE1JX0FVRElPX0FVRElPRk9STUFUX18KKyNkZWZpbmUgX19IRE1JX0FVRElPX0FVRElPRk9STUFUX18KKy8qKgorICogQGVudW0gQXVkaW9Gb3JtYXQKKyAqIFRoZSBlbmNvZGluZyBmb3JtYXQgb2YgYXVkaW8gc3RyZWFtCisgKi8KK2VudW0gQXVkaW9Gb3JtYXQgeworICAgIC8qKiBMUENNIGVuY29kaW5nIGZvcm1hdCAqLworICAgIExQQ01fRk9STUFUID0gMSwKKyAgICAvKiogQUMzIGVuY29kaW5nIGZvcm1hdCAqLworICAgIEFDM19GT1JNQVQsCisgICAgLyoqIE1QRUcxIGVuY29kaW5nIGZvcm1hdCAqLworICAgIE1QRUcxX0ZPUk1BVCwKKyAgICAvKiogTVAzIGVuY29kaW5nIGZvcm1hdCAqLworICAgIE1QM19GT1JNQVQsCisgICAgLyoqIE1QRUcyIGVuY29kaW5nIGZvcm1hdCAqLworICAgIE1QRUcyX0ZPUk1BVCwKKyAgICAvKiogQUFDIGVuY29kaW5nIGZvcm1hdCAqLworICAgIEFBQ19GT1JNQVQsCisgICAgLyoqIERUUyBlbmNvZGluZyBmb3JtYXQgKi8KKyAgICBEVFNfRk9STUFULAorICAgIC8qKiBBVFJBQyBlbmNvZGluZyBmb3JtYXQgKi8KKyAgICBBVFJBQ19GT1JNQVQsCisgICAgLyoqIERTRCBlbmNvZGluZyBmb3JtYXQgKi8KKyAgICBEU0RfRk9STUFULAorICAgIC8qKiBEb2xieSBEaWdpdGFsKyBlbmNvZGluZyBmb3JtYXQgKi8KKyAgICBEb2xieV9EaWdpdGFsX1BsdXNfRk9STUFULAorICAgIC8qKiBEVFMgSEQgZW5jb2RpbmcgZm9ybWF0ICovCisgICAgRFRTX0hEX0ZPUk1BVCwKKyAgICAvKiogTUFUIGVuY29kaW5nIGZvcm1hdCAqLworICAgIE1BVF9GT1JNQVQsCisgICAgLyoqIERTVCBlbmNvZGluZyBmb3JtYXQgKi8KKyAgICBEU1RfRk9STUFULAorICAgIC8qKiBXQU1fUHJvIGVuY29kaW5nIGZvcm1hdCAqLworICAgIFdBTV9Qcm9fRk9STUFUCit9OworI2VuZGlmIC8qIF9fSERNSV9BVURJT19BVURJT0ZPUk1BVF9fICovCisKKyNpZm5kZWYgX19IRE1JX0FVRElPX0xQQ01XT1JETEVOR1RIX18KKyNkZWZpbmUgX19IRE1JX0FVRElPX0xQQ01XT1JETEVOR1RIX18KKy8qKgorICogQGVudW0gTFBDTV9Xb3JkTGVuCisgKiBXb3JkIGxlbmd0aCBvZiBMUENNIGF1ZGlvIHN0cmVhbS4KKyAqLworZW51bSBMUENNX1dvcmRMZW4geworICAgIC8qKiAxNmJpdCB3b3JkIGxlbmd0aCAqLworICAgIFdPUkRfMTYgPSAwLAorICAgIC8qKiAxN2JpdCB3b3JkIGxlbmd0aCAqLworICAgIFdPUkRfMTcsCisgICAgLyoqIDE4Yml0IHdvcmQgbGVuZ3RoICovCisgICAgV09SRF8xOCwKKyAgICAvKiogMTliaXQgd29yZCBsZW5ndGggKi8KKyAgICBXT1JEXzE5LAorICAgIC8qKiAyMGJpdCB3b3JkIGxlbmd0aCAqLworICAgIFdPUkRfMjAsCisgICAgLyoqIDIxYml0IHdvcmQgbGVuZ3RoICovCisgICAgV09SRF8yMSwKKyAgICAvKiogMjJiaXQgd29yZCBsZW5ndGggKi8KKyAgICBXT1JEXzIyLAorICAgIC8qKiAyM2JpdCB3b3JkIGxlbmd0aCAqLworICAgIFdPUkRfMjMsCisgICAgLyoqIDI0Yml0IHdvcmQgbGVuZ3RoICovCisgICAgV09SRF8yNAorfTsKKyNlbmRpZiAvKiBfX0hETUlfQVVESU9fTFBDTVdPUkRMRU5HVEhfXyAqLworCisjaWZuZGVmIF9fSERNSV9BVURJT19TQU1QTElOR0ZSRVFVRU5DWV9fCisjZGVmaW5lIF9fSERNSV9BVURJT19TQU1QTElOR0ZSRVFVRU5DWV9fCisvKioKKyAqIEBlbnVtIFNhbXBsaW5nRnJlcQorICogU2FtcGxpbmcgZnJlcXVlbmN5IG9mIGF1ZGlvIHN0cmVhbS4KKyAqLworZW51bSBTYW1wbGluZ0ZyZXEgeworICAgIC8qKiAzMktIeiBzYW1wbGluZyBmcmVxdWVuY3kgKi8KKyAgICBTRl8zMktIWiA9IDAsCisgICAgLyoqIDQ0LjFLSHogc2FtcGxpbmcgZnJlcXVlbmN5ICovCisgICAgU0ZfNDRLSFosCisgICAgLyoqIDQ4S0h6IHNhbXBsaW5nIGZyZXF1ZW5jeSAqLworICAgIFNGXzQ4S0haLAorICAgIC8qKiA4OC4yS0h6IHNhbXBsaW5nIGZyZXF1ZW5jeSAqLworICAgIFNGXzg4S0haLAorICAgIC8qKiA5NktIeiBzYW1wbGluZyBmcmVxdWVuY3kgKi8KKyAgICBTRl85NktIWiwKKyAgICAvKiogMTc2LjRLSHogc2FtcGxpbmcgZnJlcXVlbmN5ICovCisgICAgU0ZfMTc2S0haLAorICAgIC8qKiAxOTJLSHogc2FtcGxpbmcgZnJlcXVlbmN5ICovCisgICAgU0ZfMTkyS0haCit9OworI2VuZGlmIC8qIF9fSERNSV9BVURJT19TQU1QTElOR0ZSRVFVRU5DWV9fICovCisKKyNpZm5kZWYgX19IRE1JX0FVRElPX0NIQU5ORUxOVU1CRVJfXworI2RlZmluZSBfX0hETUlfQVVESU9fQ0hBTk5FTE5VTUJFUl9fCisvKioKKyAqIEBlbnVtIENoYW5uZWxOdW0KKyAqIENoYW5uZWwgbnVtYmVyIG9mIGF1ZGlvIHN0cmVhbS4KKyAqLworZW51bSBDaGFubmVsTnVtIHsKKyAgICAvKiogMiBjaGFubmVsIGF1ZGlvIHN0cmVhbSAqLworICAgIENIXzIgPSAyLAorICAgIC8qKiAzIGNoYW5uZWwgYXVkaW8gc3RyZWFtICovCisgICAgQ0hfMywKKyAgICAvKiogNCBjaGFubmVsIGF1ZGlvIHN0cmVhbSAqLworICAgIENIXzQsCisgICAgLyoqIDUgY2hhbm5lbCBhdWRpbyBzdHJlYW0gKi8KKyAgICBDSF81LAorICAgIC8qKiA2IGNoYW5uZWwgYXVkaW8gc3RyZWFtICovCisgICAgQ0hfNiwKKyAgICAvKiogNyBjaGFubmVsIGF1ZGlvIHN0cmVhbSAqLworICAgIENIXzcsCisgICAgLyoqIDggY2hhbm5lbCBhdWRpbyBzdHJlYW0gKi8KKyAgICBDSF84LAorfTsKKyNlbmRpZiAvKiBfX0hETUlfQVVESU9fQ0hBTk5FTE5VTUJFUl9fICovCisKKyNpZm5kZWYgX19IRE1JX0FVRElPX0FVRElPU0FNUExFUEFDS0VUVFlQRV9fCisjZGVmaW5lIF9fSERNSV9BVURJT19BVURJT1NBTVBMRVBBQ0tFVFRZUEVfXworLyoqCisgKiBAZW51bSBIRE1JQVNQVHlwZQorICogVHlwZSBvZiBIRE1JIGF1ZGlvIHNhbXBsZSBwYWNrZXQKKyAqLworZW51bSBIRE1JQVNQVHlwZSB7CisgICAgLyoqIEF1ZGlvIFNhbXBsZSBQYWNrZXQgVHlwZSAqLworICAgIEhETUlfQVNQLAorICAgIC8qKiBPbmUgQml0IEF1ZGlvIFBhY2tldCBUeXBlICovCisgICAgSERNSV9EU0QsCisgICAgLyoqIEhpZ2ggQml0IFJhdGUgUGFja2V0IFR5cGUgKi8KKyAgICBIRE1JX0hCUiwKKyAgICAvKiogRFNUIFBhY2tldCBUeXBlICovCisgICAgSERNSV9EU1QKK307CisjZW5kaWYgLyogX19IRE1JX0FVRElEX0FVRElPU0FNUExFUEFDS0VUVFlQRV9fICovCisKKyNpZm5kZWYgX19IRE1JX0FVRElPX0kyU19DVVZfQVVESU9fQ09ESU5HX1RZUEVfXworI2RlZmluZSBfX0hETUlfQVVESU9fSTJTX0NVVl9BVURJT19DT0RJTkdfVFlQRV9fCisvKioKKyAqIEBlbnVtIENVVkF1ZGlvQ29kaW5nCisgKiBBdWRpbyBjb2RpbmcgdHlwZSBpbmZvcm1hdGlvbiBmb3IgQ1VWIGZpZWxkcy4KKyAqLworZW51bSBDVVZBdWRpb0NvZGluZyB7CisgICAgLyoqIExpbmVhciBQQ00gY29kaW5nIHR5cGUgKi8KKyAgICBDVVZfTFBDTSwKKyAgICAvKiogTm9uLWxpbmVhciBQQ00gY29kaW5nIHR5cGUgKi8KKyAgICBDVVZfTkxQQ00KK307CisjZW5kaWYgLyogX19IRE1JX0FVRElPX0kyU19DVVZfQVVESU9fQ09ESU5HX1RZUEVfXyAqLworCisjaWZuZGVmIF9fSERNSV9BVURJT19TUERJRl9BVURJT19DT0RJTkdfVFlQRV9fCisjZGVmaW5lIF9fSERNSV9BVURJT19TUERJRl9BVURJT19DT0RJTkdfVFlQRV9fCisvKioKKyAqIEBlbnVtIFNQRElGQXVkaW9Db2RpbmcKKyAqIEF1ZGlvIGNvZGluZyB0eXBlIGluZm9ybWF0aW9uIGZvciBTUERJRiBpbnB1dCBwb3J0LgorICovCitlbnVtIFNQRElGQXVkaW9Db2RpbmcgeworICAgIC8qKiBMaW5lYXIgUENNIGNvZGluZyB0eXBlICovCisgICAgU1BESUZfTFBDTSwKKyAgICAvKiogTm9uLWxpbmVhciBQQ00gY29kaW5nIHR5cGUgKi8KKyAgICBTUERJRl9OTFBDTQorfTsKKyNlbmRpZiAvKiBfX0hETUlfQVVESU9fU1BESUZfQVVESU9fQ09ESU5HX1RZUEVfXyAqLworCisjaWZuZGVmIF9fSERNSV9BVURJT19JMlNfQ1VWX0NIQU5ORUxfTlVNQkVSX18KKyNkZWZpbmUgX19IRE1JX0FVRElPX0kyU19DVVZfQ0hBTk5FTF9OVU1CRVJfXworLyoqCisgKiBAZW51bSBDVVZDaGFubmVsTnVtYmVyCisgKiBDaGFubmVsIG51bWJlciBpbmZvcm1hdGlvbiBmb3IgQ1VWIGZpZWxkcy4KKyAqLworZW51bSBDVVZDaGFubmVsTnVtYmVyIHsKKyAgICAvKiogVW5rbm93biBjaGFubmVsIGF1ZGlvIHN0cmVhbSAqLworICAgIENVVl9DSF9VTkRFRklORUQgPSAwLAorICAgIC8qKiAxIGNoYW5uZWwgYXVkaW8gc3RyZWFtICovCisgICAgQ1VWX0NIXzAxLAorICAgIC8qKiAyIGNoYW5uZWwgYXVkaW8gc3RyZWFtICovCisgICAgQ1VWX0NIXzAyLAorICAgIC8qKiAzIGNoYW5uZWwgYXVkaW8gc3RyZWFtICovCisgICAgQ1VWX0NIXzAzLAorICAgIC8qKiA0IGNoYW5uZWwgYXVkaW8gc3RyZWFtICovCisgICAgQ1VWX0NIXzA0LAorICAgIC8qKiA1IGNoYW5uZWwgYXVkaW8gc3RyZWFtICovCisgICAgQ1VWX0NIXzA1LAorICAgIC8qKiA2IGNoYW5uZWwgYXVkaW8gc3RyZWFtICovCisgICAgQ1VWX0NIXzA2LAorICAgIC8qKiA3IGNoYW5uZWwgYXVkaW8gc3RyZWFtICovCisgICAgQ1VWX0NIXzA3LAorICAgIC8qKiA4IGNoYW5uZWwgYXVkaW8gc3RyZWFtICovCisgICAgQ1VWX0NIXzA4LAorICAgIC8qKiA5IGNoYW5uZWwgYXVkaW8gc3RyZWFtICovCisgICAgQ1VWX0NIXzA5LAorICAgIC8qKiAxMCBjaGFubmVsIGF1ZGlvIHN0cmVhbSAqLworICAgIENVVl9DSF8xMCwKKyAgICAvKiogMTEgY2hhbm5lbCBhdWRpbyBzdHJlYW0gKi8KKyAgICBDVVZfQ0hfMTEsCisgICAgLyoqIDEyIGNoYW5uZWwgYXVkaW8gc3RyZWFtICovCisgICAgQ1VWX0NIXzEyLAorICAgIC8qKiAxMyBjaGFubmVsIGF1ZGlvIHN0cmVhbSAqLworICAgIENVVl9DSF8xMywKKyAgICAvKiogMTQgY2hhbm5lbCBhdWRpbyBzdHJlYW0gKi8KKyAgICBDVVZfQ0hfMTQsCisgICAgLyoqIDE1IGNoYW5uZWwgYXVkaW8gc3RyZWFtICovCisgICAgQ1VWX0NIXzE1LAorfTsKKyNlbmRpZiAvKiBfX0hETUlfQVVESU9fSTJTX0NVVl9DSEFOTkVMX05VTUJFUl9fICovCisKKyNpZm5kZWYgX19IRE1JX0FVRElPX0kyU19DVVZfV09SRF9MRU5HVEhfXworI2RlZmluZSBfX0hETUlfQVVESU9fSTJTX0NVVl9XT1JEX0xFTkdUSF9fCisvKioKKyAqIEBlbnVtIENVVldvcmRMZW5ndGgKKyAqIFdvcmQgbGVuZ3RoIGluZm9ybWF0aW9uIG9mIExQQ00gYXVkaW8gc3RyZWFtIGZvciBDVVYgZmllbGRzLgorICovCitlbnVtIENVVldvcmRMZW5ndGggeworICAgIC8qKiBNYXggd29yZCBsZW5ndGggaXMgMjAgYml0cywgbnVtYmVyIG9mIHZhbGlkIGJpdHMgaXMgbm90IGRlZmluZWQgKi8KKyAgICBDVVZfV0xfMjBfTk9UX0RFRklORUQsCisgICAgLyoqIE1heCB3b3JkIGxlbmd0aCBpcyAyMCBiaXRzLCAxNiBiaXRzIGFyZSB2YWxpZCAqLworICAgIENVVl9XTF8yMF8xNiwKKyAgICAvKiogTWF4IHdvcmQgbGVuZ3RoIGlzIDIwIGJpdHMsIDE4IGJpdHMgYXJlIHZhbGlkICovCisgICAgQ1VWX1dMXzIwXzE4LAorICAgIC8qKiBNYXggd29yZCBsZW5ndGggaXMgMjAgYml0cywgMTkgYml0cyBhcmUgdmFsaWQgKi8KKyAgICBDVVZfV0xfMjBfMTksCisgICAgLyoqIE1heCB3b3JkIGxlbmd0aCBpcyAyMCBiaXRzLCAyMCBiaXRzIGFyZSB2YWxpZCAqLworICAgIENVVl9XTF8yMF8yMCwKKyAgICAvKiogTWF4IHdvcmQgbGVuZ3RoIGlzIDIwIGJpdHMsIDE3IGJpdHMgYXJlIHZhbGlkICovCisgICAgQ1VWX1dMXzIwXzE3LAorICAgIC8qKiBNYXggd29yZCBsZW5ndGggaXMgMjQgYml0cywgbnVtYmVyIG9mIHZhbGlkIGJpdHMgaXMgbm90IGRlZmluZWQgKi8KKyAgICBDVVZfV0xfMjRfTk9UX0RFRklORUQsCisgICAgLyoqIE1heCB3b3JkIGxlbmd0aCBpcyAyNCBiaXRzLCAyMCBiaXRzIGFyZSB2YWxpZCAqLworICAgIENVVl9XTF8yNF8yMCwKKyAgICAvKiogTWF4IHdvcmQgbGVuZ3RoIGlzIDI0IGJpdHMsIDIyIGJpdHMgYXJlIHZhbGlkICovCisgICAgQ1VWX1dMXzI0XzIyLAorICAgIC8qKiBNYXggd29yZCBsZW5ndGggaXMgMjQgYml0cywgMjMgYml0cyBhcmUgdmFsaWQgKi8KKyAgICBDVVZfV0xfMjRfMjMsCisgICAgLyoqIE1heCB3b3JkIGxlbmd0aCBpcyAyNCBiaXRzLCAyNCBiaXRzIGFyZSB2YWxpZCAqLworICAgIENVVl9XTF8yNF8yNCwKKyAgICAvKiogTWF4IHdvcmQgbGVuZ3RoIGlzIDI0IGJpdHMsIDIxIGJpdHMgYXJlIHZhbGlkICovCisgICAgQ1VWX1dMXzI0XzIxLAorfTsKKyNlbmRpZiAvKiBfX0hETUlfQVVESU9fSTJTX0NVVl9XT1JEX0xFTkdUSF9fICovCisKKyNpZm5kZWYgX19IRE1JX0FVRElPX0kyU19CSVRTX1BFUl9DSEFOTkVMX18KKyNkZWZpbmUgX19IRE1JX0FVRElPX0kyU19CSVRTX1BFUl9DSEFOTkVMX18KKworLyoqCisgKiBAZW51bSBJMlNCaXRzUGVyQ2hhbm5lbAorICogU2VyaWFsIGRhdGEgYml0IHBlciBjaGFubmVsIGluIEkyUyBhdWRpbyBzdHJlYW0uCisgKi8KK2VudW0gSTJTQml0c1BlckNoYW5uZWwgeworICAgIC8qKiAxNiBiaXRzIHBlciBjaGFubmVsICovCisgICAgSTJTX0JQQ18xNiwKKyAgICAvKiogMjAgYml0cyBwZXIgY2hhbm5lbCAqLworICAgIEkyU19CUENfMjAsCisgICAgLyoqIDI0IGJpdHMgcGVyIGNoYW5uZWwgKi8KKyAgICBJMlNfQlBDXzI0Cit9OworCisjZW5kaWYgLyogX19IRE1JX0FVRElPX0kyU19CSVRTX1BFUl9DSEFOTkVMX18gKi8KKworI2lmbmRlZiBfX0hETUlfQVVESU9fSTJTX0RBVEFfRk9STUFUX18KKyNkZWZpbmUgX19IRE1JX0FVRElPX0kyU19EQVRBX0ZPUk1BVF9fCisKKy8qKgorICogQGVudW0gSTJTRGF0YUZvcm1hdAorICogRm9yYW10IG9mIGRhdGEgaW4gSTJTIGF1ZGlvIHN0cmVhbS4KKyAqLworZW51bSBJMlNEYXRhRm9ybWF0IHsKKyAgICAvKiogQmFzaWMgZm9ybWF0ICovCisgICAgSTJTX0JBU0lDLAorICAgIC8qKiBMZWZ0IGp1c3RpZmllZCBmb3JtYXQgKi8KKyAgICBJMlNfTEVGVF9KVVNUSUZJRUQsCisgICAgLyoqIFJpZ2h0IGp1c3RpZmllZCBmb3JtYXQgKi8KKyAgICBJMlNfUklHSFRfSlVTVElGSUVECit9OworCisjZW5kaWYgLyogX19IRE1JX0FVRElPX0kyU19EQVRBX0ZPUk1BVF9fICovCisKKyNpZm5kZWYgX19IRE1JX0FVRElPX0kyU19DTE9DS19QRVJfRlJBTUVfXworI2RlZmluZSBfX0hETUlfQVVESU9fSTJTX0NMT0NLX1BFUl9GUkFNRV9fCisKKy8qKgorICogQGVudW0gSTJTQ2xvY2tQZXJGcmFtZQorICogQml0IGNsb2NrIHBlciBGcmFtZSBpbiBJMlMgYXVkaW8gc3RyZWFtLgorICovCitlbnVtIEkyU0Nsb2NrUGVyRnJhbWUgeworICAgIC8qKiAzMiBjbG9jayBwZXIgRnJhbWUgKi8KKyAgICBJMlNfMzJGUywKKyAgICAvKiogNDggY2xvY2sgcGVyIEZyYW1lICovCisgICAgSTJTXzQ4RlMsCisgICAgLyoqIDY0IGNsb2NrIHBlciBGcmFtZSAqLworICAgIEkyU182NEZTCit9OworCisjZW5kaWYgLyogX19IRE1JX0FVRElPX0kyU19DTE9DS19QRVJfRlJBTUVfXyAqLworCisjaWZuZGVmIF9fSERNSV9BVURJT19JMlNfUEFSQU1FVEVSX18KKyNkZWZpbmUgX19IRE1JX0FVRElPX0kyU19QQVJBTUVURVJfXworCisvLyEgU3RydWN0dXJlIGZvciBJMlMgYXVkaW8gc3RyZWFtCitzdHJ1Y3QgSTJTUGFyYW1ldGVyIHsKKyAgICBlbnVtIEkyU0JpdHNQZXJDaGFubmVsIGJwYzsKKyAgICBlbnVtIEkyU0RhdGFGb3JtYXQgZm9ybWF0OworICAgIGVudW0gSTJTQ2xvY2tQZXJGcmFtZSBjbGs7Cit9OworI2VuZGlmIC8qIF9fSERNSV9BVURJT19JMlNfUEFSQU1FVEVSX18gKi8KKworLy8hIFN0cnVjdHVyZSBmb3IgSERNSSBhdWRpbyBpbnB1dAorc3RydWN0IEhETUlBdWRpb1BhcmFtZXRlciB7CisgICAgLyoqIElucHV0IGF1ZGlvIHBvcnQgdG8gSERNSSBIVyAqLworICAgIGVudW0gSERNSUF1ZGlvUG9ydCBpbnB1dFBvcnQ7CisgICAgLyoqIE91dHB1dCBQYWNrZXQgdHlwZSAqKi8KKyAgICBlbnVtIEhETUlBU1BUeXBlIG91dFBhY2tldDsKKyAgICAvKiogRW5jb2RpbmcgZm9ybWF0ICovCisgICAgZW51bSBBdWRpb0Zvcm1hdCBmb3JtYXRDb2RlOworICAgIC8qKiBDaGFubmVsIG51bWJlciAqLworICAgIGVudW0gQ2hhbm5lbE51bSBjaGFubmVsTnVtOworICAgIC8qKiBTYW1wbGluZyBmcmVxdWVuY3kgKi8KKyAgICBlbnVtIFNhbXBsaW5nRnJlcSBzYW1wbGVGcmVxOworICAgIC8qKiBXb3JkIGxlbmd0aC4gVGhpcyBpcyBhdmFsaWFibGUgb25seSBpZiBMUENNIGVuY29kaW5nIGZvcm1hdCAqLworICAgIGVudW0gTFBDTV9Xb3JkTGVuIHdvcmRMZW5ndGg7CisgICAgLyoqIHN0cnVjdHVyZSBmb3IgSTJTIGF1ZGlvIHN0cmVhbSAqLworICAgIHN0cnVjdCBJMlNQYXJhbWV0ZXIgaTJzUGFyYW07Cit9OworCisjaWZkZWYgX19jcGx1c3BsdXMKK30KKyNlbmRpZgorCisjZW5kaWYgLy8gX0FVRElPX0hfCmRpZmYgLS1naXQgYS9leHlub3M0L2hhbC9pbmNsdWRlL2V4eW5vc19tZW0uaCBiL2V4eW5vczQvaGFsL2luY2x1ZGUvZXh5bm9zX21lbS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmE2NWYwMzAKLS0tIC9kZXYvbnVsbAorKysgYi9leHlub3M0L2hhbC9pbmNsdWRlL2V4eW5vc19tZW0uaApAQCAtMCwwICsxLDI4IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDA4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKyNpZm5kZWYgX19JTkNMVURFX0VYWU5PU19NRU1fSAorI2RlZmluZSBfX0lOQ0xVREVfRVhZTk9TX01FTV9IIF9fRklMRV9fCisKKy8qIElPQ1RMIGNvbW1hbmRzICovCisjZGVmaW5lIEVYWU5PU19NRU1fU0VUX0NBQ0hFQUJMRQlfSU9XKCdNJywgMjAwLCBib29sKQorI2RlZmluZSBFWFlOT1NfTUVNX1BBRERSX0NBQ0hFX0ZMVVNICV9JT1coJ00nLCAyMDEsIHN0cnVjdCBleHlub3NfbWVtX2ZsdXNoX3JhbmdlKQorCitzdHJ1Y3QgZXh5bm9zX21lbV9mbHVzaF9yYW5nZSB7CisJZG1hX2FkZHJfdAlzdGFydDsKKwlzaXplX3QJCWxlbmd0aDsKK307CisKKyNlbmRpZiAvKiBfX0lOQ0xVREVfRVhZTk9TX01FTV9IICovCmRpZmYgLS1naXQgYS9leHlub3M0L2hhbC9pbmNsdWRlL2dyYWxsb2NfcHJpdi5oIGIvZXh5bm9zNC9oYWwvaW5jbHVkZS9ncmFsbG9jX3ByaXYuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45ZjMzNDZhCi0tLSAvZGV2L251bGwKKysrIGIvZXh5bm9zNC9oYWwvaW5jbHVkZS9ncmFsbG9jX3ByaXYuaApAQCAtMCwwICsxLDE3MiBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxMCBBUk0gTGltaXRlZC4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMDggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaWZuZGVmIEdSQUxMT0NfUFJJVl9IXworI2RlZmluZSBHUkFMTE9DX1BSSVZfSF8KKworI2luY2x1ZGUgPHN0ZGludC5oPgorI2luY2x1ZGUgPHB0aHJlYWQuaD4KKyNpbmNsdWRlIDxlcnJuby5oPgorI2luY2x1ZGUgPGxpbnV4L2ZiLmg+CisKKyNpbmNsdWRlIDxoYXJkd2FyZS9ncmFsbG9jLmg+CisjaW5jbHVkZSA8Y3V0aWxzL25hdGl2ZV9oYW5kbGUuaD4KKworI2luY2x1ZGUgPHVtcC91bXAuaD4KKworI2RlZmluZSBHUkFMTE9DX0FSTV9VTVBfTU9EVUxFIDEKKworc3RydWN0IHByaXZhdGVfaGFuZGxlX3Q7CisKK3N0cnVjdCBwcml2YXRlX21vZHVsZV90Cit7CisJZ3JhbGxvY19tb2R1bGVfdCBiYXNlOworCisJcHJpdmF0ZV9oYW5kbGVfdCogZnJhbWVidWZmZXI7CisJdWludDMyX3QgZmxhZ3M7CisJdWludDMyX3QgbnVtQnVmZmVyczsKKwl1aW50MzJfdCBidWZmZXJNYXNrOworCXB0aHJlYWRfbXV0ZXhfdCBsb2NrOworCWJ1ZmZlcl9oYW5kbGVfdCBjdXJyZW50QnVmZmVyOworCisJc3RydWN0IGZiX3Zhcl9zY3JlZW5pbmZvIGluZm87CisJc3RydWN0IGZiX2ZpeF9zY3JlZW5pbmZvIGZpbmZvOworCWZsb2F0IHhkcGk7CisJZmxvYXQgeWRwaTsKKwlmbG9hdCBmcHM7CisKKwllbnVtCisJeworCQkvLyBmbGFnIHRvIGluZGljYXRlIHdlJ2xsIHBvc3QgdGhpcyBidWZmZXIKKwkJUFJJVl9VU0FHRV9MT0NLRURfRk9SX1BPU1QgPSAweDgwMDAwMDAwCisJfTsKK307CisKKyNpZmRlZiBfX2NwbHVzcGx1cworc3RydWN0IHByaXZhdGVfaGFuZGxlX3QgOiBwdWJsaWMgbmF0aXZlX2hhbmRsZQoreworI2Vsc2UKK3N0cnVjdCBwcml2YXRlX2hhbmRsZV90Cit7CisJc3RydWN0IG5hdGl2ZV9oYW5kbGUgbmF0aXZlSGFuZGxlOworI2VuZGlmCisKKwllbnVtCisJeworCQlQUklWX0ZMQUdTX0ZSQU1FQlVGRkVSID0gMHgwMDAwMDAwMSwKKwkJUFJJVl9GTEFHU19VU0VTX1VNUCAgICA9IDB4MDAwMDAwMDIsCisJfTsKKworCWVudW0KKwl7CisJCUxPQ0tfU1RBVEVfV1JJVEUgICAgID0gICAxPDwzMSwKKwkJTE9DS19TVEFURV9NQVBQRUQgICAgPSAgIDE8PDMwLAorCQlMT0NLX1NUQVRFX1JFQURfTUFTSyA9ICAgMHgzRkZGRkZGRgorCX07CisKKwkvLyBpbnRzCisJaW50ICAgICBtYWdpYzsKKwlpbnQgICAgIGZsYWdzOworCWludCAgICAgc2l6ZTsKKwlpbnQgICAgIGJhc2U7CisJaW50ICAgICBsb2NrU3RhdGU7CisJaW50ICAgICB3cml0ZU93bmVyOworCWludCAgICAgcGlkOworCisgICAgLy8gRm9sbG93aW5nIG1lbWJlcnMgYXJlIGZvciBVTVAgbWVtb3J5IG9ubHkKKwlpbnQgICAgIHVtcF9pZDsKKwlpbnQgICAgIHVtcF9tZW1faGFuZGxlOworCisJLy8gRm9sbG93aW5nIG1lbWJlcnMgaXMgZm9yIGZyYW1lYnVmZmVyIG9ubHkKKwlpbnQgICAgIGZkOworCWludCAgICAgb2Zmc2V0OworCisKKyNpZmRlZiBfX2NwbHVzcGx1cworCXN0YXRpYyBjb25zdCBpbnQgc051bUludHMgPSAxMTsKKwlzdGF0aWMgY29uc3QgaW50IHNOdW1GZHMgPSAwOworCXN0YXRpYyBjb25zdCBpbnQgc01hZ2ljID0gMHgzMTQxNTkyOworCisJcHJpdmF0ZV9oYW5kbGVfdChpbnQgZmxhZ3MsIGludCBzaXplLCBpbnQgYmFzZSwgaW50IGxvY2tfc3RhdGUsIHVtcF9zZWN1cmVfaWQgc2VjdXJlX2lkLCB1bXBfaGFuZGxlIGhhbmRsZSk6CisJCW1hZ2ljKHNNYWdpYyksCisJCWZsYWdzKGZsYWdzKSwKKwkJc2l6ZShzaXplKSwKKwkJYmFzZShiYXNlKSwKKwkJbG9ja1N0YXRlKGxvY2tfc3RhdGUpLAorCQl3cml0ZU93bmVyKDApLAorCQlwaWQoZ2V0cGlkKCkpLAorCQl1bXBfaWQoKGludClzZWN1cmVfaWQpLAorCQl1bXBfbWVtX2hhbmRsZSgoaW50KWhhbmRsZSksCisJCWZkKDApLAorCQlvZmZzZXQoMCkKKwl7CisJCXZlcnNpb24gPSBzaXplb2YobmF0aXZlX2hhbmRsZSk7CisJCW51bUZkcyA9IHNOdW1GZHM7CisJCW51bUludHMgPSBzTnVtSW50czsKKwl9CisKKwlwcml2YXRlX2hhbmRsZV90KGludCBmbGFncywgaW50IHNpemUsIGludCBiYXNlLCBpbnQgbG9ja19zdGF0ZSwgaW50IGZiX2ZpbGUsIGludCBmYl9vZmZzZXQpOgorCQltYWdpYyhzTWFnaWMpLAorCQlmbGFncyhmbGFncyksCisJCXNpemUoc2l6ZSksCisJCWJhc2UoYmFzZSksCisJCWxvY2tTdGF0ZShsb2NrX3N0YXRlKSwKKwkJd3JpdGVPd25lcigwKSwKKwkJcGlkKGdldHBpZCgpKSwKKwkJdW1wX2lkKChpbnQpVU1QX0lOVkFMSURfU0VDVVJFX0lEKSwKKwkJdW1wX21lbV9oYW5kbGUoKGludClVTVBfSU5WQUxJRF9NRU1PUllfSEFORExFKSwKKwkJZmQoZmJfZmlsZSksCisJCW9mZnNldChmYl9vZmZzZXQpCisJeworCQl2ZXJzaW9uID0gc2l6ZW9mKG5hdGl2ZV9oYW5kbGUpOworCQludW1GZHMgPSBzTnVtRmRzOworCQludW1JbnRzID0gc051bUludHM7CisJfQorCisJfnByaXZhdGVfaGFuZGxlX3QoKQorCXsKKwkJbWFnaWMgPSAwOworCX0KKworCWJvb2wgdXNlc1BoeXNpY2FsbHlDb250aWd1b3VzTWVtb3J5KCkKKwl7CisJCXJldHVybiAoZmxhZ3MgJiBQUklWX0ZMQUdTX0ZSQU1FQlVGRkVSKSA/IHRydWUgOiBmYWxzZTsKKwl9CisKKwlzdGF0aWMgaW50IHZhbGlkYXRlKGNvbnN0IG5hdGl2ZV9oYW5kbGUqIGgpCisJeworCQljb25zdCBwcml2YXRlX2hhbmRsZV90KiBobmQgPSAoY29uc3QgcHJpdmF0ZV9oYW5kbGVfdCopaDsKKwkJaWYgKCFoIHx8IGgtPnZlcnNpb24gIT0gc2l6ZW9mKG5hdGl2ZV9oYW5kbGUpIHx8IGgtPm51bUludHMgIT0gc051bUludHMgfHwgaC0+bnVtRmRzICE9IHNOdW1GZHMgfHwgaG5kLT5tYWdpYyAhPSBzTWFnaWMpCisJCXsKKwkJCXJldHVybiAtRUlOVkFMOworCQl9CisJCXJldHVybiAwOworCX0KKworCXN0YXRpYyBwcml2YXRlX2hhbmRsZV90KiBkeW5hbWljQ2FzdChjb25zdCBuYXRpdmVfaGFuZGxlKiBpbikKKwl7CisJCWlmICh2YWxpZGF0ZShpbikgPT0gMCkKKwkJeworCQkJcmV0dXJuIChwcml2YXRlX2hhbmRsZV90KikgaW47CisJCX0KKwkJcmV0dXJuIE5VTEw7CisJfQorI2VuZGlmCit9OworCisjZW5kaWYgLyogR1JBTExPQ19QUklWX0hfICovCmRpZmYgLS1naXQgYS9leHlub3M0L2hhbC9pbmNsdWRlL2kyYy1kZXYuaCBiL2V4eW5vczQvaGFsL2luY2x1ZGUvaTJjLWRldi5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmE3YTM1YTcKLS0tIC9kZXYvbnVsbAorKysgYi9leHlub3M0L2hhbC9pbmNsdWRlL2kyYy1kZXYuaApAQCAtMCwwICsxLDc0IEBACisvKgorICAgIGkyYy1kZXYuaCAtIGkyYy1idXMgZHJpdmVyLCBjaGFyIGRldmljZSBpbnRlcmZhY2UKKworICAgIENvcHlyaWdodCAoQykgMTk5NS05NyBTaW1vbiBHLiBWb2dsCisgICAgQ29weXJpZ2h0IChDKSAxOTk4LTk5IEZyb2RvIExvb2lqYWFyZCA8ZnJvZG9sQGRkcy5ubD4KKworICAgIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgICAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAgICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICAgIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisKKyAgICBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAgICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAgICBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCisgICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAgICBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICAgIEZvdW5kYXRpb24sIEluYy4sIDY3NSBNYXNzIEF2ZSwgQ2FtYnJpZGdlLCBNQSAwMjEzOSwgVVNBLgorKi8KKworI2lmbmRlZiBfTElOVVhfSTJDX0RFVl9ICisjZGVmaW5lIF9MSU5VWF9JMkNfREVWX0gKKworI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+CisjaW5jbHVkZSA8bGludXgvY29tcGlsZXIuaD4KKworLyogL2Rldi9pMmMtWCBpb2N0bCBjb21tYW5kcy4gIFRoZSBpb2N0bCdzIHBhcmFtZXRlciBpcyBhbHdheXMgYW4KKyAqIHVuc2lnbmVkIGxvbmcsIGV4Y2VwdCBmb3I6CisgKiAgLSBJMkNfRlVOQ1MsIHRha2VzIHBvaW50ZXIgdG8gYW4gdW5zaWduZWQgbG9uZworICogIC0gSTJDX1JEV1IsIHRha2VzIHBvaW50ZXIgdG8gc3RydWN0IGkyY19yZHdyX2lvY3RsX2RhdGEKKyAqICAtIEkyQ19TTUJVUywgdGFrZXMgcG9pbnRlciB0byBzdHJ1Y3QgaTJjX3NtYnVzX2lvY3RsX2RhdGEKKyAqLworI2RlZmluZSBJMkNfUkVUUklFUyAweDA3MDEgIC8qIG51bWJlciBvZiB0aW1lcyBhIGRldmljZSBhZGRyZXNzIHNob3VsZAorICAgICAgICAgICAgICAgICAgIGJlIHBvbGxlZCB3aGVuIG5vdCBhY2tub3dsZWRnaW5nICovCisjZGVmaW5lIEkyQ19USU1FT1VUIDB4MDcwMiAgLyogc2V0IHRpbWVvdXQgaW4gdW5pdHMgb2YgMTAgbXMgKi8KKworLyogTk9URTogU2xhdmUgYWRkcmVzcyBpcyA3IG9yIDEwIGJpdHMsIGJ1dCAxMC1iaXQgYWRkcmVzc2VzCisgKiBhcmUgTk9UIHN1cHBvcnRlZCEgKGR1ZSB0byBjb2RlIGJyb2tlbm5lc3MpCisgKi8KKyNkZWZpbmUgSTJDX1NMQVZFICAgMHgwNzAzICAvKiBVc2UgdGhpcyBzbGF2ZSBhZGRyZXNzICovCisjZGVmaW5lIEkyQ19TTEFWRV9GT1JDRSAweDA3MDYgIC8qIFVzZSB0aGlzIHNsYXZlIGFkZHJlc3MsIGV2ZW4gaWYgaXQKKyAgICAgICAgICAgICAgICAgICBpcyBhbHJlYWR5IGluIHVzZSBieSBhIGRyaXZlciEgKi8KKyNkZWZpbmUgSTJDX1RFTkJJVCAgMHgwNzA0ICAvKiAwIGZvciA3IGJpdCBhZGRycywgIT0gMCBmb3IgMTAgYml0ICovCisKKyNkZWZpbmUgSTJDX0ZVTkNTICAgMHgwNzA1ICAvKiBHZXQgdGhlIGFkYXB0ZXIgZnVuY3Rpb25hbGl0eSBtYXNrICovCisKKyNkZWZpbmUgSTJDX1JEV1IgICAgMHgwNzA3ICAvKiBDb21iaW5lZCBSL1cgdHJhbnNmZXIgKG9uZSBTVE9QIG9ubHkpICovCisKKyNkZWZpbmUgSTJDX1BFQyAgICAgMHgwNzA4ICAvKiAhPSAwIHRvIHVzZSBQRUMgd2l0aCBTTUJ1cyAqLworI2RlZmluZSBJMkNfU01CVVMgICAweDA3MjAgIC8qIFNNQnVzIHRyYW5zZmVyICovCisKKworLyogVGhpcyBpcyB0aGUgc3RydWN0dXJlIGFzIHVzZWQgaW4gdGhlIEkyQ19TTUJVUyBpb2N0bCBjYWxsICovCitzdHJ1Y3QgaTJjX3NtYnVzX2lvY3RsX2RhdGEgeworICAgIF9fdTggcmVhZF93cml0ZTsKKyAgICBfX3U4IGNvbW1hbmQ7CisgICAgX191MzIgc2l6ZTsKKyAgICB1bmlvbiBpMmNfc21idXNfZGF0YSBfX3VzZXIgKmRhdGE7Cit9OworCisvKiBUaGlzIGlzIHRoZSBzdHJ1Y3R1cmUgYXMgdXNlZCBpbiB0aGUgSTJDX1JEV1IgaW9jdGwgY2FsbCAqLworc3RydWN0IGkyY19yZHdyX2lvY3RsX2RhdGEgeworICAgIHN0cnVjdCBpMmNfbXNnIF9fdXNlciAqbXNnczsgICAgLyogcG9pbnRlcnMgdG8gaTJjX21zZ3MgKi8KKyAgICBfX3UzMiBubXNnczsgICAgICAgICAgICAvKiBudW1iZXIgb2YgaTJjX21zZ3MgKi8KK307CisKKyNkZWZpbmUgIEkyQ19SRFJXX0lPQ1RMX01BWF9NU0dTICAgIDQyCisKKyNpZmRlZiBfX0tFUk5FTF9fCisjZGVmaW5lIEkyQ19NQUpPUiAgIDg5ICAgICAgLyogRGV2aWNlIG1ham9yIG51bWJlciAgICAgICovCisjZW5kaWYKKworI2VuZGlmIC8qIF9MSU5VWF9JMkNfREVWX0ggKi8KZGlmZiAtLWdpdCBhL2V4eW5vczQvaGFsL2luY2x1ZGUvaW9uLmggYi9leHlub3M0L2hhbC9pbmNsdWRlL2lvbi5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmRiYjg4OTYKLS0tIC9kZXYvbnVsbAorKysgYi9leHlub3M0L2hhbC9pbmNsdWRlL2lvbi5oCkBAIC0wLDAgKzEsMTQ0IEBACisjaWZuZGVmIF9MSUJfSU9OX0hfCisjZGVmaW5lIF9MSUJfSU9OX0hfCisKKyNpbmNsdWRlIDx1bmlzdGQuaD4gLyogc2l6ZV90ICovCisKKyNkZWZpbmUgSU9OX0hFQVBfU1lTVEVNX01BU0sJCSgxIDw8IDApCisjZGVmaW5lIElPTl9IRUFQX1NZU1RFTV9DT05USUdfTUFTSwkoMSA8PCAxKQorI2RlZmluZSBJT05fSEVBUF9FWFlOT1NfTUFTSwkJKDEgPDwgNCkKKyNkZWZpbmUgSU9OX0hFQVBfRVhZTk9TX0NPTlRJR19NQVNLCSgxIDw8IDUpCisKKy8qIElPTl9NU1lOQ19GTEFHUworICogdmFsdWVzIG9mIEBmbGFncyBwYXJhbWV0ZXIgdG8gaW9uX21zeW5jKCkKKyAqCisgKiBJTVNZTkNfREVWX1RPX1JFQUQ6IERldmljZSBvbmx5IHJlYWRzIHRoZSBidWZmZXIKKyAqIElNU1lOQ19ERVZfVE9fV1JJVEU6IERldmljZSBtYXkgd3JpdGVzIHRvIHRoZSBidWZmZXIKKyAqIElNU1lOQ19ERVZfVE9fUlc6IERldmljZSByZWFkcyBhbmQgd3JpdGVzIHRvIHRoZSBidWZmZXIKKyAqCisgKiBJTVNZTkNfU1lOQ19GT1JfREVWOiBpb25fbXN5bmMoKSBmb3IgZGV2aWNlIHRvIGFjY2VzcyB0aGUgYnVmZmVyCisgKiBJTVNZTkNfU1lOQ19GT1JfQ1BVOiBpb25fbXN5bmMoKSBmb3IgQ1BVIHRvIGFjY2VzcyB0aGUgYnVmZmVyIGFmdGVyIGRldmljZQorICogICAgICAgICAgICAgICAgICAgICAgaGFzIGFjY2Vzc2VkIGl0LgorICoKKyAqIFRoZSB2YWx1ZXMgbXVzdCBiZSBPUmVkIHdpdGggb25lIG9mIElNU1lOQ19ERVZfKiBhbmQgb25lIG9mIElNU1lOQ19TWU5DXyouCisgKiBPdGhlcndpc2UsIGlvbl9tc3luYygpIHdpbGwgbm90IGVmZmVjdC4KKyAqLworZW51bSBJT05fTVNZTkNfRkxBR1MgeworCUlNU1lOQ19ERVZfVE9fUkVBRCA9IDAsCisJSU1TWU5DX0RFVl9UT19XUklURSA9IDEsCisJSU1TWU5DX0RFVl9UT19SVyA9IDIsCisJSU1TWU5DX1NZTkNfRk9SX0RFViA9IDB4MTAwMDAsCisJSU1TWU5DX1NZTkNfRk9SX0NQVSA9IDB4MjAwMDAsCit9OworCisjaWZkZWYgX19jcGx1c3BsdXMKK2V4dGVybiAiQyIgeworI2VuZGlmCisKKy8qIGlvbl9jbGllbnQKKyAqIEFuIElPTiBjbGllbnQgaXMgYW4gb2JqZWN0IG9yIGFuIGVudGl0eSB0aGF0IG5lZWRzIHRvIHVzZSB0aGUgc2VydmljZSBvZgorICogSU9OIGFuZCBoYXMgdW5pcXVlIGFkZHJlc3Mgc3BhY2UuIGlvbl9jbGllbnQgaXMgYW4gaWRlbnRpZmllciBvZiBhbiBJT04KKyAqIGNsaWVudCBhbmQgaXQgcmVwcmVzZW50cyB0aGUgSU9OIGNsaWVudC4KKyAqIEFsbCBvcGVyYXRpb25zIG9uIElPTiBuZWVkcyBhIHZhbGlkIGlvbl9jbGllbnQgdmFsdWUgYW5kIGl0IGNhbiBiZSBvYnRhaW5lZAorICogYnkgaW9uX2NsaWVudF9jcmVhdGUoKS4KKyAqLwordHlwZWRlZiBpbnQgaW9uX2NsaWVudDsKKworLyogaW9uX2J1ZmZlcgorICogQW4gaWRlbnRpZmllciBvZiBhIGJ1ZmZlciBhbGxvY2F0ZWQgZnJvbSBJT04uIFlvdSBtdXN0IG9idGFpbiB0byBhY2Nlc3MKKyAqIGEgYnVmZmVyIGFsbG9jYXRlZCBmcm9tIElPTi4gSWYgeW91IGhhdmUgYW4gZWZmZWN0aXZlIGlvbl9idWZmZXIsIHlvdSBoYXZlCisgKiB0aHJlZSBvcHRpb25zIHRvIHdvcmsgd2l0aCBpdC4KKyAqIC0gVG8gYWNjZXNzICB0aGUgYnVmZmVyLCB5b3UgY2FuIHJlcXVlc3QgYW4gYWRkcmVzcyAodXNlciB2aXJ0dWFsIGFkZHJlc3MpCisgKiAgIG9mIHRoZSBidWZmZXIgd2l0aCBpb25fbWFwKCkuCisgKiAtIFRvIHBhc3MgdGhlIGJ1ZmZlciB0byB0aGUga2VybmVsLCB5b3UgY2FuIHBhc3MgdGhlIGlvbl9idWZmZXIgdG8gdGhlCisgKiAgIGtlcm5lbCBkcml2ZXIgZGlyZWN0bHksIGlmIHRoZSBrZXJuZWwgZHJpdmVyIGNhbiB3b3JrIHdpdGggSU9OLgorICogLSBUbyBwYXNzIHRoZSBidWZmZXIgdG8gb3RoZXIgcHJvY2Vzc2VzLCB5b3UgY2FuIHBhc3MgdGhlIGlvbl9idWZmZXIgdG8KKyAqICAgb3RoZXIgcHJvY2Vzc2VzIHRocm91Z2ggUlBDIG1hY2hhbmlzbSBzdWNoIGFzIHNvY2tldCBjb21tdW5pY2F0aW9uIG9yCisgKiAgIEFuZHJvaWQgQmluZGVyIGJlY2F1c2UgaW9uX2J1ZmZlciBpcyBhY3R1YWxseSBhbiBvcGVuIGZpbGUgZGVzY3JpcG90b3IKKyAqICAgb2YgdGhlIGN1cnJlbnQgcHJvY2Vzcy4KKyAqLwordHlwZWRlZiBpbnQgaW9uX2J1ZmZlcjsKKworLyogaW9uX2NsaWVudF9jcmVhdGUoKQorICogQFJFVFVSTjogbmV3IGlvbl9jbGllbnQuCisgKiAgICAgICAgICBuZXRhdGl2ZSB2YWx1ZSBpZiBjcmVhdGluZyBuZXcgaW9uX2NsaWVudCBpcyBmYWlsZWQuCisgKgorICogQSBjYWxsIHRvIGlvbl9jbGllbnRfY3JlYXRlKCkgbXVzdCBiZSBwYWlyZWQgd2l0aCBpb25fY2xpZW50X2Rlc3Ryb3koKSwKKyAqIHN5bW1ldHJpY2FsbHkuIGlvbl9jbGllbnRfZGVzdHJveSgpIG5lZWRzIGEgdmFsaWQgaW9uX2NsaWVudCB0aGF0CisgKiBpcyByZXR1cm5lZCBieSBpb25fY2xpZW50X2NyZWF0ZSgpLgorICovCitpb25fY2xpZW50IGlvbl9jbGllbnRfY3JlYXRlKHZvaWQpOworCisvKiBpb25fY2xpZW50X2Rlc3Ryb3koKQorICogQGNsaWVudDogQW4gaW9uX2NsaWVudCB2YWx1ZSB0byByZW1vdmUuCisgKi8KK3ZvaWQgaW9uX2NsaWVudF9kZXN0cm95KGlvbl9jbGllbnQgY2xpZW50KTsKKworLyogaW9uX2FsbG9jKCkgLSBBbGxvY2F0ZXMgbmV3IGJ1ZmZlciBmcm9tIElPTi4KKyAqIEBjbGllbnQ6IEEgdmFsaWQgaW9uX2NsaWVudCB2YWx1ZSByZXR1cm5lZCBieSBpb25fY2xpZW50X2NyZWF0ZSgpLgorICogQGxlbjogU2l6ZSBvZiBhIGJ1ZmZlciByZXF1aXJlZCBpbiBieXRlcy4KKyAqIEBhbGlnbjogQWxpZ25tZW50IHJlcXVpcmVtZW50cyBvZiBAbGVuIGFuZCB0aGUgc3RhcnQgYWRkcmVzcyBvZiB0aGUgYWxsb2NhdGVkCisgKiAgICAgICAgIGJ1ZmZlci4gSWYgdGhlIEBsZW4gaXMgbm90IGFsaWduZWQgYnkgQGFsaWduLCBJT04gYWxsb2NhdGVzIGEgYnVmZmVyCisgKiAgICAgICAgIHRoYXQgaXMgYWxpZ25lZCBieSBAYWxpZ24gYW5kIHRoZSBzaXplIG9mIHRoZSBidWZmZXIgd2lsbCBiZSBsYXJnZXIKKyAqICAgICAgICAgdGhhbiBAbGVuLgorICogQGZsYWdzOiBBZGRpdGlvbmFsIHJlcXVpcmVtZW50cyBhYm91dCBidWZmZXIuIElPTl9IRUFQX1NZU1RFTV9DT05USUdfTUFTSworICogICAgICAgICBmb3IgYWxsb2NhdGluZyBwaHlzaWNhbGx5IGNvbnRpZ3VvdXMgYnVmZmVyIGFuZCBJT05fSEVBUF9TWVNURU1fTUFTSworICogICAgICAgICBmb3IgdmlydHVhbGx5IGNvbnRpZ3VvdXMgYnVmZmVyLiBZb3UgY2FuIGNvbWJpbmUgdGhvc2UgZmxhZ3Mgb3IKKyAqICAgICAgICAgc2ltcGx5IGdpdmUgLTEoMHhGRkZGRkZGRikgaWYgeW91IGRvIG5vdCBjYXJlIGFib3V0IHRoZSBjb250aWd1b3V0eQorICogICAgICAgICBvZiB0aGUgYnVmZmVyLgorICogQFJFVFVSTjogQW4gaW9uX2J1ZmZlciB0aGF0IHJlcHJlc2VudHMgdGhlIGJ1ZmZlciBhbGxvY2F0ZWQuIEl0IGlzIG9ubHkKKyAqICAgICAgICAgIHVuaXF1ZSBpbiB0aGUgY29udGV4dCBvZiB0aGUgZ2l2ZW4gY2xpZW50LCBAY2xpZW50LgorICogICAgICAgICAgLWVycm9yIGlmIHRoZSBhbGxvY2F0aW9uIGZhaWxlZC4KKyAqICAgICAgICAgIFNlZSB0aGUgZGVzY3JpcHRpb24gb2YgaW9uX2J1ZmZlciBhYm92ZSBmb3IgZGV0YWlsZWQgaW5mb3JtYXRpb24uCisgKi8KK2lvbl9idWZmZXIgaW9uX2FsbG9jKGlvbl9jbGllbnQgY2xpZW50LCBzaXplX3QgbGVuLCBzaXplX3QgYWxpZ24sCisJCSAgICAgdW5zaWduZWQgaW50IGZsYWdzKTsKKworLyogaW9uX2ZyZWUoKSAtIEZyZWVzIGFuIGV4aXN0aW5nIGJ1ZmZlciB0aGF0IGlzIGFsbG9jYXRlZCBieSBJT04KKyAqIEBidWZmZXI6IEFuIGlvbl9idWZmZXIgb2YgdGhlIGJ1ZmZlciB0byBiZSByZWxlYXNlZC4KKyAqLwordm9pZCBpb25fZnJlZShpb25fYnVmZmVyIGJ1ZmZlcik7CisKKy8qIGlvbl9tYXAoKSAtIE9idGFpbnMgYSB2aXJ0dWFsIGFkZHJlc3Mgb2YgdGhlIGJ1ZmZlciBpZGVudGllZCBieSBAYnVmZmVyCisgKiBAYnVmZmVyOiBUaGUgYnVmZmVyIHRvIG1hcC4gVGhlIHZpcnR1YWwgYWRkcmVzcyByZXR1cm5lZCBpcyBhbGxvY2F0ZWQgYnkgdGhlCisgKiAgICAgICAgICBrZXJuZWwuCisgKiBAbGVuOiBUaGUgc2l6ZSBvZiB0aGUgYnVmZmVyIHRvIG1hcC4gVGhpcyBtdXN0IG5vdCBleGNlZWQgdGhlIHNpemUgb2YgdGhlCisgKiAgICAgICBidWZmZXIgcmVwcmVzZW50ZWQgYnkgQGZkX2J1Zi4gVGh1cyB5b3UgbmVlZCB0byBrbm93IHRoZSBzaXplIG9mIGl0CisgKiAgICAgICBiZWZvcmUgY2FsbGluZyB0aGlzIGZ1bmN0aW9uLiBJZiBAbGVuIGlzIGxlc3MgdGhhbiB0aGUgc2l6ZSBvZiB0aGUKKyAqICAgICAgIGJ1ZmZlciwgdGhpcyBmdW5jdGlvbiBqdXN0IG1hcCBqdXN0IHRoZSBzaXplIHJlcXVlc3RlZCAoQGxlbikgbm90IHRoZQorICogICAgICAgZW50aXJlIGJ1ZmZlci4KKyAqIEBvZmZzZXQ6IEhvdyBtYW55IHBhZ2VzIHdpbGwgYmUgaWdub3JlZCB3aGlsZSBtYXBwaW5nLkBvZmZzZXQgbnVtYmVyIG9mCisgKiAgICAgICBwYWdlcyBmcm9tIHRoZSBzdGFydCBvZiB0aGUgYnVmZmVyIHdpbGwgbm90IGJlIG1hcHBlZC4KKyAqIEBSRVRVUk46IFRoZSBzdGFydCB2aXJ0dWFsIGFkZHJlcyBtYXBwZWQuCisgKiAgICAgICAgICBNQVBfRkFJTEVEIGlmIG1hcHBpbmcgZmFpbHMuCisgKgorICogTm90ZSB0aGF0IEBsZW4gKyAoQG9mZnNldCAqIFBBR0VfU0laRSkgbXVzdCBub3QgZXhjZWVkIHRoZSBzaXplIG9mIHRoZQorICogYnVmZmVyLgorICovCit2b2lkICppb25fbWFwKGlvbl9idWZmZXIgYnVmZmVyLCBzaXplX3QgbGVuLCBvZmZfdCBvZmZzZXQpOworCisvKiBpb25fdW5tYXAoKSAtIEZyZWVzIHRoZSBidWZmZXIgbWFwcGVkIGJ5IGlvbl9tYXAoKQorICogQGFkZHI6IFRoZSBhZGRyZXNzIHJldHVybmVkIGJ5IGlvbl9tYXAoKS4KKyAqIEBsZW46IFRoZSBzaXplIG9mIHRoZSBidWZmZXIgbWFwcGVkIGJ5IGlvbl9tYXAoKS4KKyAqIEBSRVRVUk46IDAgb24gc3VjY2VzcywgYW5kIC0xIG9uIGZhaWx1cmUuCisgKiAgICAgICAgICBlcnJubyBpcyBhbHNvIHNldCBvbiBmYWlsdXJlLgorICovCitpbnQgaW9uX3VubWFwKHZvaWQgKmFkZHIsIHNpemVfdCBsZW4pOworCisvKiBpb25fbXN5bmMoKSAtIE1ha2VzIHN1cmUgdGhhdCBkYXRhIGluIHRoZSBidWZmZXIgYXJlIHZpc2libGUgdG8gSC9XIHBlcmkuCisgKiBAY2xpZW50OiBBIHZhbGlkIGlvbl9jbGllbnQgdmFsdWUgcmV0dXJuZWQgYnkgaW9uX2NsaWVudF9jcmVhdGUoKS4KKyAqIEBidWZmZXI6IFRoZSBidWZmZXIgdG8gcGVyZm9ybSBpb25fbXN5bmMoKS4KKyAqIEBmbGFnczogRGlyZWN0aW9uIG9mIGFjY2VzcyBvZiBIL1cgcGVyaSBhbmQgQ1BVLiBTZWUgdGhlIGRlc2NyaXB0aW9uIG9mCisgKiAgICAgICAgIElPTl9NU1lOQ19GTEFHUy4KKyAqIEBzaXplOiBTaXplIHRvIGlvbl9tc3luYygpIGluIGJ5dGVzLgorICogQG9mZnNldDogV2hlcmUgaW9uX21zeW5jKCkgc3RhcnQgaW4gQGJ1ZmZlciwgc2l6ZSBpbiBieXRlcy4KKyAqIEBSRVRVUk46IDAgaWYgc3VjY2Vzc2Z1bC4gLWVycm9yLCBvdGhlcndpc2UuCisgKgorICogTm90ZSB0aGF0IEBvZmZzZXQgKyBAc2l6ZSBtdXN0IG5vdCBleGNlZWQgdGhlIHNpemUgb2YgQGJ1ZmZlci4KKyAqLworaW50IGlvbl9tc3luYyhpb25fY2xpZW50IGNsaWVudCwgaW9uX2J1ZmZlciBidWZmZXIsIGxvbmcgZmxhZ3MsCisJCXNpemVfdCBzaXplLCBvZmZfdCBvZmZzZXQpOworCisjaWZkZWYgX19jcGx1c3BsdXMKK30KKyNlbmRpZgorI2VuZGlmIC8qIF9MSUJfSU9OX0hfICovCmRpZmYgLS1naXQgYS9leHlub3M0L2hhbC9pbmNsdWRlL2pwZWdfYXBpLmggYi9leHlub3M0L2hhbC9pbmNsdWRlL2pwZWdfYXBpLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjI2ODVlMQotLS0gL2Rldi9udWxsCisrKyBiL2V4eW5vczQvaGFsL2luY2x1ZGUvanBlZ19hcGkuaApAQCAtMCwwICsxLDEyMSBAQAorI2lmbmRlZiBfX0pQRUdfQVBJX0hfXworI2RlZmluZSBfX0pQRUdfQVBJX0hfXworCisjZGVmaW5lIEpQRUdfRFJJVkVSX05BTUUgICAgICAgICIvZGV2L3M1cC1qcGVnIgorCisjZGVmaW5lIE1BWF9KUEVHX1dJRFRIICAgICAgICAgIDMyNjQKKyNkZWZpbmUgTUFYX0pQRUdfSEVJR0hUICAgICAgICAgMjQ0OAorCisjZGVmaW5lIE1BWF9KUEVHX1JFUyAgICAgICAgICAgIChNQVhfSlBFR19XSURUSCAqIE1BWF9KUEVHX0hFSUdIVCkKKworI2RlZmluZSBKUEVHX1NUUkVBTV9CVUZfU0laRSAgICBNQVhfSlBFR19SRVMKKyNkZWZpbmUgSlBFR19GUkFNRV9CVUZfU0laRSAgICAgKE1BWF9KUEVHX1JFUyAqIDMpCisKKyNkZWZpbmUgSlBFR19UT1RBTF9CVUZfU0laRSAgICAgKEpQRUdfU1RSRUFNX0JVRl9TSVpFICsgSlBFR19GUkFNRV9CVUZfU0laRSkKKworI2RlZmluZSBKUEVHX0lPQ1RMX01BR0lDICAgICdKJworCisjZGVmaW5lIElPQ1RMX0pQRUdfREVDX0VYRSAgICAgICAgICAgICAgX0lPKEpQRUdfSU9DVExfTUFHSUMsIDEpCisjZGVmaW5lIElPQ1RMX0pQRUdfRU5DX0VYRSAgICAgICAgICAgICAgX0lPKEpQRUdfSU9DVExfTUFHSUMsIDIpCisjZGVmaW5lIElPQ1RMX0dFVF9ERUNfSU5fQlVGICAgICAgICAgICAgX0lPKEpQRUdfSU9DVExfTUFHSUMsIDMpCisjZGVmaW5lIElPQ1RMX0dFVF9ERUNfT1VUX0JVRiAgICAgICAgICAgX0lPKEpQRUdfSU9DVExfTUFHSUMsIDQpCisjZGVmaW5lIElPQ1RMX0dFVF9FTkNfSU5fQlVGICAgICAgICAgICAgX0lPKEpQRUdfSU9DVExfTUFHSUMsIDUpCisjZGVmaW5lIElPQ1RMX0dFVF9FTkNfT1VUX0JVRiAgICAgICAgICAgX0lPKEpQRUdfSU9DVExfTUFHSUMsIDYpCisjZGVmaW5lIElPQ1RMX1NFVF9ERUNfUEFSQU0gICAgICAgICAgICAgX0lPKEpQRUdfSU9DVExfTUFHSUMsIDcpCisjZGVmaW5lIElPQ1RMX1NFVF9FTkNfUEFSQU0gICAgICAgICAgICAgX0lPKEpQRUdfSU9DVExfTUFHSUMsIDgpCisKK2VudW0ganBlZ19yZXRfdHlwZXsKKyAgICBKUEVHX0ZBSUwsCisgICAgSlBFR19PSywKKyAgICBKUEVHX0VOQ09ERV9GQUlMLAorICAgIEpQRUdfRU5DT0RFX09LLAorICAgIEpQRUdfREVDT0RFX0ZBSUwsCisgICAgSlBFR19ERUNPREVfT0ssCisgICAgSlBFR19PVVRfT0ZfTUVNT1JZLAorICAgIEpQRUdfVU5LTk9XTl9FUlJPUgorfTsKKworZW51bSBqcGVnX2ltZ19xdWFsaXR5X2xldmVsIHsKKyAgICBRVUFMSVRZX0xFVkVMXzEgPSAwLCAgICAgLyogaGlnaCAqLworICAgIFFVQUxJVFlfTEVWRUxfMiwKKyAgICBRVUFMSVRZX0xFVkVMXzMsCisgICAgUVVBTElUWV9MRVZFTF80LCAgICAgICAgIC8qIGxvdyAqLworfTsKKworLyogcmF3IGRhdGEgaW1hZ2UgZm9ybWF0ICovCitlbnVtIGpwZWdfZnJhbWVfZm9ybWF0IHsKKyAgICBZVVZfNDIyLCAgICAvKiBkZWNvZGUgb3V0cHV0LCBlbmNvZGUgaW5wdXQgKi8KKyAgICBZVVZfNDIwLCAgICAvKiBkZWNvZGUgb3V0cHV0LCBlbmNvZGUgb3V0cHV0ICovCisgICAgUkdCXzU2NSwgICAgLyogZW5jb2RlIGlucHV0ICovCit9OworCisvKiBqcGVnIGRhdGEgZm9ybWF0ICovCitlbnVtIGpwZWdfc3RyZWFtX2Zvcm1hdCB7CisgICAgSlBFR180MjIsICAgIC8qIGRlY29kZSBpbnB1dCwgZW5jb2RlIG91dHB1dCAqLworICAgIEpQRUdfNDIwLCAgICAvKiBkZWNvZGUgaW5wdXQsIGVuY29kZSBvdXRwdXQgKi8KKyAgICBKUEVHXzQ0NCwgICAgLyogZGVjb2RlIGlucHV0Ki8KKyAgICBKUEVHX0dSQVksICAgIC8qIGRlY29kZSBpbnB1dCovCisgICAgSlBFR19SRVNFUlZFRCwKK307CisKK2VudW0ganBlZ190ZXN0X21vZGUgeworICAgIGVuY29kZV9tb2RlLAorICAgIGRlY29kZV9tb2RlLAorfTsKKworc3RydWN0IGpwZWdfZGVjX3BhcmFtIHsKKyAgICB1bnNpZ25lZCBpbnQgd2lkdGg7CisgICAgdW5zaWduZWQgaW50IGhlaWdodDsKKyAgICB1bnNpZ25lZCBpbnQgc2l6ZTsKKyAgICBlbnVtIGpwZWdfc3RyZWFtX2Zvcm1hdCBpbl9mbXQ7CisgICAgZW51bSBqcGVnX2ZyYW1lX2Zvcm1hdCBvdXRfZm10OworfTsKKworc3RydWN0IGpwZWdfZW5jX3BhcmFtIHsKKyAgICB1bnNpZ25lZCBpbnQgd2lkdGg7CisgICAgdW5zaWduZWQgaW50IGhlaWdodDsKKyAgICB1bnNpZ25lZCBpbnQgc2l6ZTsKKyAgICBlbnVtIGpwZWdfZnJhbWVfZm9ybWF0IGluX2ZtdDsKKyAgICBlbnVtIGpwZWdfc3RyZWFtX2Zvcm1hdCBvdXRfZm10OworICAgIGVudW0ganBlZ19pbWdfcXVhbGl0eV9sZXZlbCBxdWFsaXR5OworfTsKKworc3RydWN0IGpwZWdfYXJnc3sKKyAgICBjaGFyICAgICAgICAgICAgICAgICAgICAgKmluX2J1ZjsKKyAgICB1bnNpZ25lZCBpbnQgICAgICAgICAgICAgaW5fY29va2llOworICAgIHVuc2lnbmVkIGludCAgICAgICAgICAgICBpbl9idWZfc2l6ZTsKKyAgICBjaGFyICAgICAgICAgICAgICAgICAgICAgKm91dF9idWY7CisgICAgdW5zaWduZWQgaW50ICAgICAgICAgICAgIG91dF9jb29raWU7CisgICAgdW5zaWduZWQgaW50ICAgICAgICAgICAgIG91dF9idWZfc2l6ZTsKKyAgICBjaGFyICAgICAgICAgICAgICAgICAgICAgKm1tYXBwZWRfYWRkcjsKKyAgICBzdHJ1Y3QganBlZ19kZWNfcGFyYW0gICAgKmRlY19wYXJhbTsKKyAgICBzdHJ1Y3QganBlZ19lbmNfcGFyYW0gICAgKmVuY19wYXJhbTsKK307CisKK3N0cnVjdCBqcGVnX2xpYiB7CisgICAgaW50ICBqcGVnX2ZkOworICAgIHN0cnVjdCBqcGVnX2FyZ3MgYXJnczsKK307CisKKyNpZmRlZiBfX2NwbHVzcGx1cworZXh0ZXJuICJDIiB7CisjZW5kaWYKK2ludCBhcGlfanBlZ19kZWNvZGVfaW5pdCgpOworaW50IGFwaV9qcGVnX2VuY29kZV9pbml0KCk7CitpbnQgYXBpX2pwZWdfZGVjb2RlX2RlaW5pdChpbnQgZGV2X2ZkKTsKK2ludCBhcGlfanBlZ19lbmNvZGVfZGVpbml0KGludCBkZXZfZmQpOwordm9pZCAqYXBpX2pwZWdfZ2V0X2RlY29kZV9pbl9idWYoaW50IGRldl9mZCwgdW5zaWduZWQgaW50IHNpemUpOwordm9pZCAqYXBpX2pwZWdfZ2V0X2VuY29kZV9pbl9idWYoaW50IGRldl9mZCwgdW5zaWduZWQgaW50IHNpemUpOwordm9pZCAqYXBpX2pwZWdfZ2V0X2RlY29kZV9vdXRfYnVmKGludCBkZXZfZmQpOwordm9pZCAqYXBpX2pwZWdfZ2V0X2VuY29kZV9vdXRfYnVmKGludCBkZXZfZmQpOwordm9pZCBhcGlfanBlZ19zZXRfZGVjb2RlX3BhcmFtKHN0cnVjdCBqcGVnX2RlY19wYXJhbSAqcGFyYW0pOwordm9pZCBhcGlfanBlZ19zZXRfZW5jb2RlX3BhcmFtKHN0cnVjdCBqcGVnX2VuY19wYXJhbSAqcGFyYW0pOworZW51bSBqcGVnX3JldF90eXBlIGFwaV9qcGVnX2RlY29kZV9leGUoaW50IGRldl9mZCwKKyAgICAgICAgICAgICAgICAgICAgc3RydWN0IGpwZWdfZGVjX3BhcmFtICpkZWNfcGFyYW0pOworZW51bSBqcGVnX3JldF90eXBlIGFwaV9qcGVnX2VuY29kZV9leGUoaW50IGRldl9mZCwKKyAgICAgICAgICAgICAgICAgICAgc3RydWN0IGpwZWdfZW5jX3BhcmFtICplbmNfcGFyYW0pOworI2lmZGVmIF9fY3BsdXNwbHVzCit9CisjZW5kaWYKKworI2VuZGlmLy9fX0pQRUdfQVBJX0hfXwpkaWZmIC0tZ2l0IGEvZXh5bm9zNC9oYWwvaW5jbHVkZS9qcGVnX2hhbC5oIGIvZXh5bm9zNC9oYWwvaW5jbHVkZS9qcGVnX2hhbC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjVjNTU1OTIKLS0tIC9kZXYvbnVsbAorKysgYi9leHlub3M0L2hhbC9pbmNsdWRlL2pwZWdfaGFsLmgKQEAgLTAsMCArMSwxMzcgQEAKKy8qCisgKiBDb3B5cmlnaHRAIFNhbXN1bmcgRWxlY3Ryb25pY3MgQ28uIExURAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaW5jbHVkZSAidmlkZW9kZXYyLmgiCisKKyNkZWZpbmUgSlBFR19ERUNfTk9ERSAgICAgICAgIi9kZXYvdmlkZW8xMSIKKyNkZWZpbmUgSlBFR19FTkNfTk9ERSAgICAgICAgIi9kZXYvdmlkZW8xMiIKKworI2RlZmluZSBKUEVHX01BWF9QTEFORV9DTlQgICAgICAgICAgMworI2RlZmluZSBKUEVHX0RFQ19PVVRfQllURV9BTElHTiAgICAgOAorCisvLyNkZWZpbmUgSlBFR19QRVJGX01FQVMKKworI2lmZGVmIEpQRUdfUEVSRl9NRUFTCisjZGVmaW5lIEpQRUdfUEVSRl9ERUZJTkUobikgXAorICAgIHN0cnVjdCB0aW1ldmFsIHRpbWVfc3RhcnRfIyNuLCB0aW1lX3N0b3BfIyNuOyB1bnNpZ25lZCBsb25nIGxvZ190aW1lXyMjbiA9IDA7CisKKyNkZWZpbmUgSlBFR19QRVJGX1NUQVJUKG4pIFwKKyAgICBnZXR0aW1lb2ZkYXkoJnRpbWVfc3RhcnRfIyNuLCBOVUxMKTsKKworI2RlZmluZSBKUEVHX1BFUkZfRU5EKG4pIFwKKyAgICBnZXR0aW1lb2ZkYXkoJnRpbWVfc3RvcF8jI24sIE5VTEwpOyBsb2dfdGltZV8jI24gPSBtZWFzdXJlX3RpbWUoJnRpbWVfc3RhcnRfIyNuLCAmdGltZV9zdG9wXyMjbik7CisKKyNkZWZpbmUgSlBFR19QRVJGKG4pIFwKKyAgICBsb2dfdGltZV8jI24KKyNlbHNlCisjZGVmaW5lIEpQRUdfUEVSRl9ERUZJTkUobikKKyNkZWZpbmUgSlBFR19QRVJGX1NUQVJUKG4pCisjZGVmaW5lIEpQRUdfUEVSRl9FTkQobikKKyNkZWZpbmUgSlBFR19QRVJGKG4pCisjZW5kaWYKKworZW51bSBqcGVnX3JldF90eXBlIHsKKyAgICBKUEVHX0ZBSUwsCisgICAgSlBFR19PSywKKyAgICBKUEVHX0VOQ09ERV9GQUlMLAorICAgIEpQRUdfRU5DT0RFX09LLAorICAgIEpQRUdfREVDT0RFX0ZBSUwsCisgICAgSlBFR19ERUNPREVfT0ssCisgICAgSlBFR19PVVRfT0ZfTUVNT1JZLAorICAgIEpQRUdfVU5LTk9XTl9FUlJPUgorfTsKKworZW51bSBqcGVnX3F1YWxpdHlfbGV2ZWwgeworICAgIFFVQUxJVFlfTEVWRUxfMSA9IDAsICAgIC8qIGhpZ2ggKi8KKyAgICBRVUFMSVRZX0xFVkVMXzIsCisgICAgUVVBTElUWV9MRVZFTF8zLAorICAgIFFVQUxJVFlfTEVWRUxfNCwgICAgICAgIC8qIGxvdyAqLworfTsKKworZW51bSBqcGVnX21vZGUgeworICAgIEpQRUdfRU5DT0RFLAorICAgIEpQRUdfREVDT0RFCit9OworCitzdHJ1Y3QganBlZ19idWYgeworICAgIGludCAgICAgbnVtX3BsYW5lczsKKyAgICB2b2lkICAgICpzdGFydFtKUEVHX01BWF9QTEFORV9DTlRdOworICAgIGludCAgICAgbGVuZ3RoW0pQRUdfTUFYX1BMQU5FX0NOVF07CisgICAgZW51bSAgICB2NGwyX21lbW9yeSAgICBtZW1vcnk7CisgICAgZW51bSAgICB2NGwyX2J1Zl90eXBlICBidWZfdHlwZTsgICAgLy8gQ2FsbGVyIG5lZWQgbm90IHNldCB0aGlzCit9OworCitzdHJ1Y3QganBlZ19idWZfaW5mbyB7CisgICAgaW50ICAgICAgICAgICAgICAgICBudW1fcGxhbmVzOworICAgIGVudW0gdjRsMl9tZW1vcnkgICAgbWVtb3J5OworICAgIGVudW0gdjRsMl9idWZfdHlwZSAgYnVmX3R5cGU7CisgICAgaW50ICAgICAgICAgICAgICAgICByZXNlcnZlZFs0XTsKK307CisKK3N0cnVjdCBqcGVnX3BpeGZtdCB7CisgICAgaW50IGluX2ZtdDsKKyAgICBpbnQgb3V0X2ZtdDsKKyAgICBpbnQgcmVzZXJ2ZWRbNF07Cit9OworCitzdHJ1Y3QganBlZ19jb25maWcgeworICAgIGVudW0ganBlZ19tb2RlICAgICAgICAgICAgICBtb2RlOworICAgIGVudW0ganBlZ19xdWFsaXR5X2xldmVsICAgICBlbmNfcXVhbDsgLy8gZm9yIGVuY29kaW5nCisKKyAgICBpbnQgICAgICAgICAgICAgICAgICAgICAgICAgd2lkdGg7CisgICAgaW50ICAgICAgICAgICAgICAgICAgICAgICAgIGhlaWdodDsKKworICAgIGludCAgICAgICAgICAgICAgICAgICAgICAgICBudW1fcGxhbmVzOworCisgICAgaW50ICAgICAgICAgICAgICAgICAgICAgICAgIHNjYWxlZF93aWR0aDsgLy8gMS8yLCAxLzQgc2NhbGluZyBmb3IgZGVjb2RpbmcKKyAgICBpbnQgICAgICAgICAgICAgICAgICAgICAgICAgc2NhbGVkX2hlaWdodDsgLy8gMS8yLCAxLzQgc2NhbGluZyBmb3IgZGVjb2RpbmcKKworICAgIGludCAgICAgICAgICAgICAgICAgICAgICAgICBzaXplSnBlZzsKKworICAgIHVuaW9uIHsKKyAgICAgICAgc3RydWN0IGpwZWdfcGl4Zm10IGVuY19mbXQ7CisgICAgICAgIHN0cnVjdCBqcGVnX3BpeGZtdCBkZWNfZm10OworICAgIH0gcGl4OworCisgICAgaW50ICAgICAgICAgICAgICAgICAgICAgICAgIHJlc2VydmVkWzhdOworfTsKKworI2lmZGVmIF9fY3BsdXNwbHVzCitleHRlcm4gIkMiIHsKKyNlbmRpZgoraW50IGpwZWdoYWxfZGVjX2luaXQoKTsKK2ludCBqcGVnaGFsX2VuY19pbml0KCk7CisKK2ludCBqcGVnaGFsX2RlY19zZXRjb25maWcoaW50IGZkLCBzdHJ1Y3QganBlZ19jb25maWcgKmNvbmZpZyk7CitpbnQganBlZ2hhbF9lbmNfc2V0Y29uZmlnKGludCBmZCwgc3RydWN0IGpwZWdfY29uZmlnICpjb25maWcpOworaW50IGpwZWdoYWxfZGVjX2dldGNvbmZpZyhpbnQgZmQsIHN0cnVjdCBqcGVnX2NvbmZpZyAqY29uZmlnKTsKK2ludCBqcGVnaGFsX2VuY19nZXRjb25maWcoaW50IGZkLCBzdHJ1Y3QganBlZ19jb25maWcgKmNvbmZpZyk7CisKK2ludCBqcGVnaGFsX3NldF9pbmJ1ZihpbnQgZmQsIHN0cnVjdCBqcGVnX2J1ZiAqYnVmKTsKK2ludCBqcGVnaGFsX3NldF9vdXRidWYoaW50IGZkLCBzdHJ1Y3QganBlZ19idWYgKmJ1Zik7CisKK2ludCBqcGVnaGFsX2RlY19leGUoaW50IGZkLCBzdHJ1Y3QganBlZ19idWYgKmluX2J1Ziwgc3RydWN0IGpwZWdfYnVmICpvdXRfYnVmKTsKK2ludCBqcGVnaGFsX2VuY19leGUoaW50IGZkLCBzdHJ1Y3QganBlZ19idWYgKmluX2J1Ziwgc3RydWN0IGpwZWdfYnVmICpvdXRfYnVmKTsKKworaW50IGpwZWdoYWxfZGVpbml0KGludCBmZCwgc3RydWN0IGpwZWdfYnVmICppbl9idWYsIHN0cnVjdCBqcGVnX2J1ZiAqb3V0X2J1Zik7CisKK2ludCBqcGVnaGFsX3NfY3RybChpbnQgZmQsIGludCBjaWQsIGludCB2YWx1ZSk7CitpbnQganBlZ2hhbF9nX2N0cmwoaW50IGZkLCBpbnQgaWQpOworCit1bnNpZ25lZCBsb25nIG1lYXN1cmVfdGltZShzdHJ1Y3QgdGltZXZhbCAqc3RhcnQsIHN0cnVjdCB0aW1ldmFsICpzdG9wKTsKKyNpZmRlZiBfX2NwbHVzcGx1cworfQorI2VuZGlmCmRpZmYgLS1naXQgYS9leHlub3M0L2hhbC9pbmNsdWRlL3MzY19sY2QuaCBiL2V4eW5vczQvaGFsL2luY2x1ZGUvczNjX2xjZC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjdmMmRlYzcKLS0tIC9kZXYvbnVsbAorKysgYi9leHlub3M0L2hhbC9pbmNsdWRlL3MzY19sY2QuaApAQCAtMCwwICsxLDg2IEBACisvKgorICogQ29weXJpZ2h0QCBTYW1zdW5nIEVsZWN0cm9uaWNzIENvLiBMVEQKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2lmbmRlZiBfUzNDRkJfTENEXworI2RlZmluZSBfUzNDRkJfTENEXworCisvKgorICogUyBUIFIgVSBDIFQgVSBSIEUgUyAgRiBPIFIgIEMgVSBTIFQgTyBNICBJIE8gQyBUIEwgUworICoKKyovCitzdHJ1Y3QgczNjZmJfdXNlcl93aW5kb3cgeworICAgIGludCB4OworICAgIGludCB5OworfTsKKworc3RydWN0IHMzY2ZiX3VzZXJfcGxhbmVfYWxwaGEgeworICAgIGludCAgICAgICAgICAgICBjaGFubmVsOworICAgIHVuc2lnbmVkIGNoYXIgICByZWQ7CisgICAgdW5zaWduZWQgY2hhciAgIGdyZWVuOworICAgIHVuc2lnbmVkIGNoYXIgICBibHVlOworfTsKKworc3RydWN0IHMzY2ZiX3VzZXJfY2hyb21hIHsKKyAgICBpbnQgICAgICAgICAgICAgZW5hYmxlZDsKKyAgICB1bnNpZ25lZCBjaGFyICAgcmVkOworICAgIHVuc2lnbmVkIGNoYXIgICBncmVlbjsKKyAgICB1bnNpZ25lZCBjaGFyICAgYmx1ZTsKK307CisKK3R5cGVkZWYgc3RydWN0IHsKKyAgICB1bnNpZ25lZCBpbnQgcGh5X3N0YXJ0X2FkZHI7CisgICAgdW5zaWduZWQgaW50IHhyZXM7ICAgICAgLyogdmlzaWJsZSByZXNvbHV0aW9uKi8KKyAgICB1bnNpZ25lZCBpbnQgeXJlczsKKyAgICB1bnNpZ25lZCBpbnQgeHJlc192aXJ0dWFsOyAgLyogdmlydHVhbCByZXNvbHV0aW9uKi8KKyAgICB1bnNpZ25lZCBpbnQgeXJlc192aXJ0dWFsOworICAgIHVuc2lnbmVkIGludCB4b2Zmc2V0OyAgIC8qIG9mZnNldCBmcm9tIHZpcnR1YWwgdG8gdmlzaWJsZSAqLworICAgIHVuc2lnbmVkIGludCB5b2Zmc2V0OyAgIC8qIHJlc29sdXRpb24gICAqLworICAgIHVuc2lnbmVkIGludCBsY2Rfb2Zmc2V0X3g7CisgICAgdW5zaWduZWQgaW50IGxjZF9vZmZzZXRfeTsKK30gczNjX2ZiX25leHRfaW5mb190OworCisjaWZkZWYgQk9BUkRfVVNFX1Y0TDJfSU9OCitzdHJ1Y3QgczNjX2ZiX3VzZXJfaW9uX2NsaWVudCB7CisgICAgaW50IGZkOworICAgIGludCBvZmZzZXQ7Cit9OworI2VuZGlmCisKKy8qCisgKiBDIFUgUyBUIE8gTSAgSSBPIEMgVCBMIFMKKyAqCisqLworCisjZGVmaW5lIFMzQ0ZCX1dJTl9QT1NJVElPTiAgICAgICAgICBfSU9XICgnRicsIDIwMywgc3RydWN0IHMzY2ZiX3VzZXJfd2luZG93KQorI2RlZmluZSBTM0NGQl9XSU5fU0VUX1BMQU5FX0FMUEhBICAgX0lPVyAoJ0YnLCAyMDQsIHN0cnVjdCBzM2NmYl91c2VyX3BsYW5lX2FscGhhKQorI2RlZmluZSBTM0NGQl9XSU5fU0VUX0NIUk9NQSAgICAgICAgX0lPVyAoJ0YnLCAyMDUsIHN0cnVjdCBzM2NmYl91c2VyX2Nocm9tYSkKKyNkZWZpbmUgUzNDRkJfU0VUX1ZTWU5DX0lOVCAgICAgICAgIF9JT1cgKCdGJywgMjA2LCB1bnNpZ25lZCBpbnQpCisjZGVmaW5lIFMzQ0ZCX1NFVF9TVVNQRU5EX0ZJRk8gICAgICBfSU9XICgnRicsIDMwMCwgdW5zaWduZWQgbG9uZykKKyNkZWZpbmUgUzNDRkJfU0VUX1JFU1VNRV9GSUZPICAgICAgIF9JT1cgKCdGJywgMzAxLCB1bnNpZ25lZCBsb25nKQorI2RlZmluZSBTM0NGQl9HRVRfTENEX1dJRFRIICAgICAgICAgX0lPUiAoJ0YnLCAzMDIsIGludCkKKyNkZWZpbmUgUzNDRkJfR0VUX0xDRF9IRUlHSFQgICAgICAgIF9JT1IgKCdGJywgMzAzLCBpbnQpCisjZGVmaW5lIFMzQ0ZCX0dFVF9GQl9QSFlfQUREUiAgICAgICBfSU9SICgnRicsIDMxMCwgdW5zaWduZWQgaW50KQorI2RlZmluZSBTM0NfRkJfR0VUX0NVUlJfRkJfSU5GTyAgICAgX0lPUiAoJ0YnLCAzMDUsIHMzY19mYl9uZXh0X2luZm9fdCkKKyNkZWZpbmUgUzNDRkJfR0VUX0lPTl9VU0VSX0hBTkRMRSAgIF9JT1dSKCdGJywgMjA4LCBzdHJ1Y3QgczNjX2ZiX3VzZXJfaW9uX2NsaWVudCkKKworLyoqKioqKioqKioqKioqKioqIExDRCBmcmFtZSBidWZmZXIgKioqKioqKioqKioqKioqKiovCisjZGVmaW5lIEZCMF9OQU1FICAgICIvZGV2L2ZiMCIKKyNkZWZpbmUgRkIxX05BTUUgICAgIi9kZXYvZmIxIgorI2RlZmluZSBGQjJfTkFNRSAgICAiL2Rldi9mYjIiCisjZGVmaW5lIEZCM19OQU1FICAgICIvZGV2L2ZiMyIKKyNkZWZpbmUgRkI0X05BTUUgICAgIi9kZXYvZmI0IgorCisjZW5kaWYKZGlmZiAtLWdpdCBhL2V4eW5vczQvaGFsL2luY2x1ZGUvczNjX21lbS5oIGIvZXh5bm9zNC9oYWwvaW5jbHVkZS9zM2NfbWVtLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZGQ0Y2JkYgotLS0gL2Rldi9udWxsCisrKyBiL2V4eW5vczQvaGFsL2luY2x1ZGUvczNjX21lbS5oCkBAIC0wLDAgKzEsNDggQEAKKy8qCisgKiBDb3B5cmlnaHRAIFNhbXN1bmcgRWxlY3Ryb25pY3MgQ28uIExURAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaWZuZGVmIF9TM0NfTUVNX0NPTU1PTl9IXworI2RlZmluZSBfUzNDX01FTV9DT01NT05fSF8KKworI2RlZmluZSBNRU1fSU9DVExfTUFHSUMgICAgICAgICAnTScKKworI2RlZmluZSBTM0NfTUVNX0FMTE9DICAgICAgICAgICBfSU9XUihNRU1fSU9DVExfTUFHSUMsIDMxMCwgc3RydWN0IHMzY19tZW1fYWxsb2MpCisjZGVmaW5lIFMzQ19NRU1fRlJFRSAgICAgICAgICAgIF9JT1dSKE1FTV9JT0NUTF9NQUdJQywgMzExLCBzdHJ1Y3QgczNjX21lbV9hbGxvYykKKworI2RlZmluZSBTM0NfTUVNX1NIQVJFX0FMTE9DICAgICBfSU9XUihNRU1fSU9DVExfTUFHSUMsIDMxNCwgc3RydWN0IHMzY19tZW1fYWxsb2MpCisjZGVmaW5lIFMzQ19NRU1fU0hBUkVfRlJFRSAgICAgIF9JT1dSKE1FTV9JT0NUTF9NQUdJQywgMzE1LCBzdHJ1Y3QgczNjX21lbV9hbGxvYykKKworI2RlZmluZSBTM0NfTUVNX0NBQ0hFQUJMRV9BTExPQyAgICAgX0lPV1IoTUVNX0lPQ1RMX01BR0lDLCAzMTYsIHN0cnVjdCBzM2NfbWVtX2FsbG9jKQorI2RlZmluZSBTM0NfTUVNX0NBQ0hFQUJMRV9TSEFSRV9BTExPQyAgIF9JT1dSKE1FTV9JT0NUTF9NQUdJQywgMzE3LCBzdHJ1Y3QgczNjX21lbV9hbGxvYykKKworI2RlZmluZSBTM0NfTUVNX0NBQ0hFX0ZMVVNIICAgICBfSU9XUihNRU1fSU9DVExfTUFHSUMsIDMxOCwgc3RydWN0IHMzY19tZW1fYWxsb2MpCisjZGVmaW5lIFMzQ19NRU1fQ0FDSEVfSU5WQUwgICAgIF9JT1dSKE1FTV9JT0NUTF9NQUdJQywgMzE5LCBzdHJ1Y3QgczNjX21lbV9hbGxvYykKKyNkZWZpbmUgUzNDX01FTV9DQUNIRV9DTEVBTiAgICAgX0lPV1IoTUVNX0lPQ1RMX01BR0lDLCAzMjAsIHN0cnVjdCBzM2NfbWVtX2FsbG9jKQorCitzdHJ1Y3QgczNjX21lbV9hbGxvYyB7CisgICAgaW50ICAgICBzaXplOworICAgIHVuc2lnbmVkIGludCAgICB2aXJfYWRkcjsKKyAgICB1bnNpZ25lZCBpbnQgICAgcGh5X2FkZHI7Cit9OworCitzdHJ1Y3QgczNjX21lbV9kbWFfcGFyYW0geworICAgIGludCAgICAgc2l6ZTsKKyAgICB1bnNpZ25lZCBpbnQgICAgc3JjX2FkZHI7CisgICAgdW5zaWduZWQgaW50ICAgIGRzdF9hZGRyOworICAgIGludCAgICAgY2ZnOworfTsKKworI2VuZGlmIC8vIF9TM0NfTUVNX0NPTU1PTl9IXwpkaWZmIC0tZ2l0IGEvZXh5bm9zNC9oYWwvaW5jbHVkZS9zNXBfZmltYy5oIGIvZXh5bm9zNC9oYWwvaW5jbHVkZS9zNXBfZmltYy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmI4MTNlNjkKLS0tIC9kZXYvbnVsbAorKysgYi9leHlub3M0L2hhbC9pbmNsdWRlL3M1cF9maW1jLmgKQEAgLTAsMCArMSwxNjIgQEAKKy8qIENvcHlyaWdodChjKSAyMDExIFNhbXN1bmcgRWxlY3Ryb25pY3MgQ28sIEx0ZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgYXMKKyAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICoKKyAqIEFsdGVybmF0aXZlbHksIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyovCisKKyNpZm5kZWYgX1M1UF9GSU1DX0hfCisjZGVmaW5lIF9TNVBfRklNQ19IXworCisjaW5jbHVkZSA8bGludXgvdmlkZW9kZXYyLmg+CisjaW5jbHVkZSAiU2VjQnVmZmVyLmgiCisvKgorICogRyBFIE4gRSBSIEEgTCBTCisgKgorKi8KKyNkZWZpbmUgTUlOKHgsIHkpICAgICAgICgoeCA8IHkpID8geCA6IHkpCisKKy8qCisgKiBQIEkgWCBFIEwgICBGIE8gUiBNIEEgVCAgIEcgVSBJIEQgRQorICoKKyAqIFRoZSAneCcgbWVhbnMgJ0RPIE5PVCBDQVJFJworICogVGhlICcqJyBtZWFucyAnRklNQyBTUEVDSUZJQycKKyAqIEZvciBzb21lIGZpbWMgZm9ybWF0cywgd2UgY291bGRuJ3QgZmluZCBlcXVpdmFsZW50IGZvcm1hdCBpbiB0aGUgVjRMMiBGT1VSQ0MuCisgKgorICogRklNQyBUWVBFICAgIFBMQU5FUyAgT1JERVIgICAgICAgVjRMMl9QSVhfRk1UCisgKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqIFJHQjU2NSAgIHggICB4ICAgICAgIFY0TDJfUElYX0ZNVF9SR0I1NjUKKyAqIFJHQjg4OCAgIHggICB4ICAgICAgIFY0TDJfUElYX0ZNVF9SR0IyNAorICogWVVWNDIwICAgMiAgIExTQl9DQkNSICAgIFY0TDJfUElYX0ZNVF9OVjEyCisgKiBZVVY0MjAgICAyICAgTFNCX0NSQ0IgICAgVjRMMl9QSVhfRk1UX05WMjEKKyAqIFlVVjQyMCAgIDIgICBNU0JfQ0JDUiAgICBWNEwyX1BJWF9GTVRfTlYyMVgqCisgKiBZVVY0MjAgICAyICAgTVNCX0NSQ0IgICAgVjRMMl9QSVhfRk1UX05WMTJYKgorICogWVVWNDIwICAgMyAgIHggICAgICAgVjRMMl9QSVhfRk1UX1lVVjQyMAorICogWVVWNDIyICAgMSAgIFlDQllDUiAgICAgIFY0TDJfUElYX0ZNVF9ZVVlWCisgKiBZVVY0MjIgICAxICAgWUNSWUNCICAgICAgVjRMMl9QSVhfRk1UX1lWWVUKKyAqIFlVVjQyMiAgIDEgICBDQllDUlkgICAgICBWNEwyX1BJWF9GTVRfVVlWWQorICogWVVWNDIyICAgMSAgIENSWUNCWSAgICAgIFY0TDJfUElYX0ZNVF9WWVVZKgorICogWVVWNDIyICAgMiAgIExTQl9DQkNSICAgIFY0TDJfUElYX0ZNVF9OVjE2KgorICogWVVWNDIyICAgMiAgIExTQl9DUkNCICAgIFY0TDJfUElYX0ZNVF9OVjYxKgorICogWVVWNDIyICAgMiAgIE1TQl9DQkNSICAgIFY0TDJfUElYX0ZNVF9OVjE2WCoKKyAqIFlVVjQyMiAgIDIgICBNU0JfQ1JDQiAgICBWNEwyX1BJWF9GTVRfTlY2MVgqCisgKiBZVVY0MjIgICAzICAgeCAgICAgICBWNEwyX1BJWF9GTVRfWVVWNDIyUAorICoKKyovCisKKy8qCisgKiBWIDQgTCAyICAgRiBJIE0gQyAgIEUgWCBUIEUgTiBTIEkgTyBOIFMKKyAqCisqLworI2RlZmluZSBWNEwyX1BJWF9GTVRfWVZZVSAgICAgICB2NGwyX2ZvdXJjYygnWScsICdWJywgJ1knLCAnVScpCisKKy8qIEZPVVJDQyBmb3IgRklNQyBzcGVjaWZpYyAqLworI2RlZmluZSBWNEwyX1BJWF9GTVRfTlYxMlggICAgICB2NGwyX2ZvdXJjYygnTicsICcxJywgJzInLCAnWCcpCisjZGVmaW5lIFY0TDJfUElYX0ZNVF9OVjIxWCAgICAgIHY0bDJfZm91cmNjKCdOJywgJzInLCAnMScsICdYJykKKyNkZWZpbmUgVjRMMl9QSVhfRk1UX1ZZVVkgICAgICAgdjRsMl9mb3VyY2MoJ1YnLCAnWScsICdVJywgJ1knKQorI2RlZmluZSBWNEwyX1BJWF9GTVRfTlYxNiAgICAgICB2NGwyX2ZvdXJjYygnTicsICdWJywgJzEnLCAnNicpCisjZGVmaW5lIFY0TDJfUElYX0ZNVF9OVjYxICAgICAgIHY0bDJfZm91cmNjKCdOJywgJ1YnLCAnNicsICcxJykKKyNkZWZpbmUgVjRMMl9QSVhfRk1UX05WMTZYICAgICAgdjRsMl9mb3VyY2MoJ04nLCAnMScsICc2JywgJ1gnKQorI2RlZmluZSBWNEwyX1BJWF9GTVRfTlY2MVggICAgICB2NGwyX2ZvdXJjYygnTicsICc2JywgJzEnLCAnWCcpCisKKyNkZWZpbmUgVjRMMl9QSVhfRk1UX05WMTJUICAgICAgdjRsMl9mb3VyY2MoJ1QnLCAnVicsICcxJywgJzInKSAvKiAxMiAgWS9DYkNyIDQ6MjowIDY0eDMyIG1hY3JvYmxvY2tzICovCisKKy8qIENJRCBleHRlbnNpb25zICovCisjZGVmaW5lIFY0TDJfQ0lEX1JPVEFUSU9OICAgICAgIChWNEwyX0NJRF9QUklWQVRFX0JBU0UgKyAwKQorI2RlZmluZSBWNEwyX0NJRF9PVkxZX01PREUgICAgICAgICAgICAgIChWNEwyX0NJRF9QUklWQVRFX0JBU0UgKyA5KQorI2RlZmluZSBWNEwyX0NJRF9EU1RfSU5GTyAgICAgICAoVjRMMl9DSURfUFJJVkFURV9CQVNFICsgMTApCisjZGVmaW5lIFY0TDJfQ0lEX0dFVF9QSFlfU1JDX1lBRERSICAoVjRMMl9DSURfUFJJVkFURV9CQVNFICsgMTIpCisjZGVmaW5lIFY0TDJfQ0lEX0dFVF9QSFlfU1JDX0NBRERSICAoVjRMMl9DSURfUFJJVkFURV9CQVNFICsgMTMpCisjZGVmaW5lIFY0TDJfQ0lEX1JFU0VSVkVEX01FTV9CQVNFX0FERFIgKFY0TDJfQ0lEX1BSSVZBVEVfQkFTRSArIDIwKQorI2RlZmluZSBWNEwyX0NJRF9GSU1DX1ZFUlNJT04gICAgICAgKFY0TDJfQ0lEX1BSSVZBVEVfQkFTRSArIDIxKQorCisvKgorICogVSBTIEUgUiAgIEQgRSBGIEkgTiBFIEQgICBUIFkgUCBFIFMKKyAqCisqLworI2RlZmluZSBGSU1DMV9SRVNFUlZFRF9TSVpFIDMyNzY4CisKK2VudW0gZmltY19vdmVybGF5X21vZGUgeworICAgIEZJTUNfT1ZMWV9OT1RfRklYRUQgICAgICAgPSAweDAsICAgIC8qIE92ZXJsYXkgbW9kZSBpc24ndCBmaXhlZC4gKi8KKyAgICBGSU1DX09WTFlfRklGTyAgICAgICAgICAgID0gMHgxLCAgICAvKiBOb24tZGVzdHJ1Y3RpdmUgT3ZlcmxheSB3aXRoIEZJRk8gKi8KKyAgICBGSU1DX09WTFlfRE1BX0FVVE8gICAgICAgID0gMHgyLCAgICAvKiBOb24tZGVzdHJ1Y3RpdmUgT3ZlcmxheSB3aXRoIERNQSAqLworICAgIEZJTUNfT1ZMWV9ETUFfTUFOVUFMICAgICAgPSAweDMsICAgIC8qIE5vbi1kZXN0cnVjdGl2ZSBPdmVybGF5IHdpdGggRE1BICovCisgICAgRklNQ19PVkxZX05PTkVfU0lOR0xFX0JVRiA9IDB4NCwgICAgLyogRGVzdHJ1Y3RpdmUgT3ZlcmxheSB3aXRoIERNQSBzaW5nbGUgZGVzdGluYXRpb24gYnVmZmVyICovCisgICAgRklNQ19PVkxZX05PTkVfTVVMVElfQlVGICA9IDB4NSwgICAgLyogRGVzdHJ1Y3RpdmUgT3ZlcmxheSB3aXRoIERNQSBtdWx0aXBsZSBkc3RpbmF0aW9uIGJ1ZmZlciAqLworfTsKKwordHlwZWRlZiB1bnNpZ25lZCBpbnQgZG1hX2FkZHJfdDsKKworc3RydWN0IGZpbWNfYnVmIHsKKyAgICBkbWFfYWRkcl90ICBiYXNlWzNdOworICAgIHNpemVfdCAgICAgIGxlbmd0aFszXTsKK307CisKK3N0cnVjdCBmaW1jX2J1ZmZlciB7CisgICAgdm9pZCAgICAqdmlydF9hZGRyOworICAgIHZvaWQgICAgKnBoeXNfYWRkcjsKKyAgICBzaXplX3QgIGxlbmd0aDsKK307CisKK3N0cnVjdCB5dXZfZm10X2xpc3QgeworICAgIGNvbnN0IGNoYXIgICAgICAqbmFtZTsKKyAgICBjb25zdCBjaGFyICAgICAgKmRlc2M7CisgICAgdW5zaWduZWQgaW50ICAgIGZtdDsKKyAgICBpbnQgICAgICAgICAgICAgYnBwOworICAgIGludCAgICAgICAgICAgICBwbGFuZXM7Cit9OworCitzdHJ1Y3QgaW1nX29mZnNldCB7CisgICAgaW50IHlfaDsKKyAgICBpbnQgeV92OworICAgIGludCBjYl9oOworICAgIGludCBjYl92OworICAgIGludCBjcl9oOworICAgIGludCBjcl92OworfTsKKworLy8tLS0tLS0tLS0tLS0gU1RSVUNUIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS8vCisKK3R5cGVkZWYgc3RydWN0Cit7CisgICAgdW5zaWduZWQgaW50IGZ1bGxfd2lkdGg7ICAgICAgICAgICAgLy8gU291cmNlIEltYWdlIEZ1bGwgV2lkdGggKFZpcnR1YWwgc2NyZWVuIHNpemUpCisgICAgdW5zaWduZWQgaW50IGZ1bGxfaGVpZ2h0OyAgICAgICAgICAgLy8gU291cmNlIEltYWdlIEZ1bGwgSGVpZ2h0IChWaXJ0dWFsIHNjcmVlbiBzaXplKQorICAgIHVuc2lnbmVkIGludCBzdGFydF94OyAgICAgICAgICAgICAgIC8vIFNvdXJjZSBJbWFnZSBTdGFydCB3aWR0aCBvZmZzZXQKKyAgICB1bnNpZ25lZCBpbnQgc3RhcnRfeTsgICAgICAgICAgICAgICAvLyBTb3VyY2UgSW1hZ2UgU3RhcnQgaGVpZ2h0IG9mZnNldAorICAgIHVuc2lnbmVkIGludCB3aWR0aDsgICAgICAgICAgICAgICAgIC8vIFNvdXJjZSBJbWFnZSBXaWR0aAorICAgIHVuc2lnbmVkIGludCBoZWlnaHQ7ICAgICAgICAgICAgICAgIC8vIFNvdXJjZSBJbWFnZSBIZWlnaHQKKyAgICB1bnNpZ25lZCBpbnQgYnVmX2FkZHJfcGh5X3JnYl95OyAgICAvLyBCYXNlIEFkZHJlc3Mgb2YgdGhlIFNvdXJjZSBJbWFnZSAoUkdCIG9yIFkpOiBQaHlzaWNhbCBBZGRyZXNzCisgICAgdW5zaWduZWQgaW50IGJ1Zl9hZGRyX3BoeV9jYjsgICAgICAgLy8gQmFzZSBBZGRyZXNzIG9mIHRoZSBTb3VyY2UgSW1hZ2UgKENCIENvbXBvbmVudCkgOiBQaHlzaWNhbCBBZGRyZXNzCisgICAgdW5zaWduZWQgaW50IGJ1Zl9hZGRyX3BoeV9jcjsgICAgICAgLy8gQmFzZSBBZGRyZXNzIG9mIHRoZSBTb3VyY2UgSW1hZ2UgKENSIENvbXBvbmVudCkgOiBQaHlzaWNhbCBBZGRyZXNzCisgICAgdW5zaWduZWQgaW50IGNvbG9yX3NwYWNlOyAgICAgICAgICAgLy8gQ29sb3IgU3BhY2Ugb2YgdGhlIFNvdXJjZSBJbWFnZQorfSBzNXBfZmltY19pbWdfaW5mbzsKKwordHlwZWRlZiBzdHJ1Y3QKK3sKKyAgICBzNXBfZmltY19pbWdfaW5mbyAgIHNyYzsKKyAgICBzNXBfZmltY19pbWdfaW5mbyAgIGRzdDsKK30gczVwX2ZpbWNfcGFyYW1zX3Q7CisKK3R5cGVkZWYgc3RydWN0IF9zNXBfZmltY190IHsKKyAgICBpbnQgICAgICAgICAgICAgICAgZGV2X2ZkOworICAgIHN0cnVjdCBmaW1jX2J1ZmZlciAgb3V0X2J1ZjsKKworICAgIHM1cF9maW1jX3BhcmFtc190ICAgcGFyYW1zOworCisgICAgaW50ICAgICAgICAgICAgICAgICB1c2VfZXh0X291dF9tZW07CisgICAgdW5zaWduZWQgaW50ICAgICAgICBod192ZXI7Cit9czVwX2ZpbWNfdDsKKworI2VuZGlmCmRpZmYgLS1naXQgYS9leHlub3M0L2hhbC9pbmNsdWRlL3M1cF9maW1jX3Y0bDIuaCBiL2V4eW5vczQvaGFsL2luY2x1ZGUvczVwX2ZpbWNfdjRsMi5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjM1Yjg0YTAKLS0tIC9kZXYvbnVsbAorKysgYi9leHlub3M0L2hhbC9pbmNsdWRlL3M1cF9maW1jX3Y0bDIuaApAQCAtMCwwICsxLDE2NCBAQAorLyogQ29weXJpZ2h0KGMpIDIwMTEgU2Ftc3VuZyBFbGVjdHJvbmljcyBDbywgTHRkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBhcworICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisgKgorICogQWx0ZXJuYXRpdmVseSwgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorKi8KKworI2lmbmRlZiBfUzVQX0ZJTUNfSF8KKyNkZWZpbmUgX1M1UF9GSU1DX0hfCisKKyNpbmNsdWRlICJ2aWRlb2RldjIuaCIKKyNpbmNsdWRlICJTZWNCdWZmZXIuaCIKKworLyoKKyAqIEcgRSBOIEUgUiBBIEwgUworICoKKyovCisKKy8qCisgKiBQIEkgWCBFIEwgICBGIE8gUiBNIEEgVCAgIEcgVSBJIEQgRQorICoKKyAqIFRoZSAneCcgbWVhbnMgJ0RPIE5PVCBDQVJFJworICogVGhlICcqJyBtZWFucyAnRklNQyBTUEVDSUZJQycKKyAqIEZvciBzb21lIGZpbWMgZm9ybWF0cywgd2UgY291bGRuJ3QgZmluZCBlcXVpdmFsZW50IGZvcm1hdCBpbiB0aGUgVjRMMiBGT1VSQ0MuCisgKgorICogRklNQyBUWVBFICAgIFBMQU5FUyAgT1JERVIgICAgICAgVjRMMl9QSVhfRk1UCisgKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqIFJHQjU2NSAgIHggICB4ICAgICAgIFY0TDJfUElYX0ZNVF9SR0I1NjUKKyAqIFJHQjg4OCAgIHggICB4ICAgICAgIFY0TDJfUElYX0ZNVF9SR0IyNAorICogWVVWNDIwICAgMiAgIExTQl9DQkNSICAgIFY0TDJfUElYX0ZNVF9OVjEyCisgKiBZVVY0MjAgICAyICAgTFNCX0NSQ0IgICAgVjRMMl9QSVhfRk1UX05WMjEKKyAqIFlVVjQyMCAgIDIgICBNU0JfQ0JDUiAgICBWNEwyX1BJWF9GTVRfTlYyMVgqCisgKiBZVVY0MjAgICAyICAgTVNCX0NSQ0IgICAgVjRMMl9QSVhfRk1UX05WMTJYKgorICogWVVWNDIwICAgMyAgIHggICAgICAgVjRMMl9QSVhfRk1UX1lVVjQyMAorICogWVVWNDIyICAgMSAgIFlDQllDUiAgICAgIFY0TDJfUElYX0ZNVF9ZVVlWCisgKiBZVVY0MjIgICAxICAgWUNSWUNCICAgICAgVjRMMl9QSVhfRk1UX1lWWVUKKyAqIFlVVjQyMiAgIDEgICBDQllDUlkgICAgICBWNEwyX1BJWF9GTVRfVVlWWQorICogWVVWNDIyICAgMSAgIENSWUNCWSAgICAgIFY0TDJfUElYX0ZNVF9WWVVZKgorICogWVVWNDIyICAgMiAgIExTQl9DQkNSICAgIFY0TDJfUElYX0ZNVF9OVjE2KgorICogWVVWNDIyICAgMiAgIExTQl9DUkNCICAgIFY0TDJfUElYX0ZNVF9OVjYxKgorICogWVVWNDIyICAgMiAgIE1TQl9DQkNSICAgIFY0TDJfUElYX0ZNVF9OVjE2WCoKKyAqIFlVVjQyMiAgIDIgICBNU0JfQ1JDQiAgICBWNEwyX1BJWF9GTVRfTlY2MVgqCisgKiBZVVY0MjIgICAzICAgeCAgICAgICBWNEwyX1BJWF9GTVRfWVVWNDIyUAorICoKKyovCisKKy8qCisgKiBWIDQgTCAyICAgRiBJIE0gQyAgIEUgWCBUIEUgTiBTIEkgTyBOIFMKKyAqCisqLworI2RlZmluZSBWNEwyX1BJWF9GTVRfWVZZVSAgICAgICB2NGwyX2ZvdXJjYygnWScsICdWJywgJ1knLCAnVScpCisKKy8qIEZPVVJDQyBmb3IgRklNQyBzcGVjaWZpYyAqLworI2RlZmluZSBWNEwyX1BJWF9GTVRfTlYxMlggICAgICB2NGwyX2ZvdXJjYygnTicsICcxJywgJzInLCAnWCcpCisjZGVmaW5lIFY0TDJfUElYX0ZNVF9OVjIxWCAgICAgIHY0bDJfZm91cmNjKCdOJywgJzInLCAnMScsICdYJykKKyNkZWZpbmUgVjRMMl9QSVhfRk1UX1ZZVVkgICAgICAgdjRsMl9mb3VyY2MoJ1YnLCAnWScsICdVJywgJ1knKQorI2RlZmluZSBWNEwyX1BJWF9GTVRfTlYxNiAgICAgICB2NGwyX2ZvdXJjYygnTicsICdWJywgJzEnLCAnNicpCisjZGVmaW5lIFY0TDJfUElYX0ZNVF9OVjYxICAgICAgIHY0bDJfZm91cmNjKCdOJywgJ1YnLCAnNicsICcxJykKKyNkZWZpbmUgVjRMMl9QSVhfRk1UX05WMTZYICAgICAgdjRsMl9mb3VyY2MoJ04nLCAnMScsICc2JywgJ1gnKQorI2RlZmluZSBWNEwyX1BJWF9GTVRfTlY2MVggICAgICB2NGwyX2ZvdXJjYygnTicsICc2JywgJzEnLCAnWCcpCisKKyNkZWZpbmUgVjRMMl9QSVhfRk1UX05WMTJUICAgICAgdjRsMl9mb3VyY2MoJ1QnLCAnVicsICcxJywgJzInKSAvKiAxMiAgWS9DYkNyIDQ6MjowIDY0eDMyIG1hY3JvYmxvY2tzICovCisKKy8qIENJRCBleHRlbnNpb25zICovCisjZGVmaW5lIFY0TDJfQ0lEX1JPVEFUSU9OICAgICAgIChWNEwyX0NJRF9QUklWQVRFX0JBU0UgKyAwKQorI2RlZmluZSBWNEwyX0NJRF9PVkxZX01PREUgICAgICAgICAgICAgIChWNEwyX0NJRF9QUklWQVRFX0JBU0UgKyA5KQorI2RlZmluZSBWNEwyX0NJRF9EU1RfSU5GTyAgICAgICAoVjRMMl9DSURfUFJJVkFURV9CQVNFICsgMTApCisjZGVmaW5lIFY0TDJfQ0lEX0dFVF9QSFlfU1JDX1lBRERSICAoVjRMMl9DSURfUFJJVkFURV9CQVNFICsgMTIpCisjZGVmaW5lIFY0TDJfQ0lEX0dFVF9QSFlfU1JDX0NBRERSICAoVjRMMl9DSURfUFJJVkFURV9CQVNFICsgMTMpCisjZGVmaW5lIFY0TDJfQ0lEX1JFU0VSVkVEX01FTV9CQVNFX0FERFIgKFY0TDJfQ0lEX1BSSVZBVEVfQkFTRSArIDIwKQorI2RlZmluZSBWNEwyX0NJRF9GSU1DX1ZFUlNJT04gICAgICAgKFY0TDJfQ0lEX1BSSVZBVEVfQkFTRSArIDIxKQorCisvKgorICogVSBTIEUgUiAgIEQgRSBGIEkgTiBFIEQgICBUIFkgUCBFIFMKKyAqCisqLworI2RlZmluZSBGSU1DMV9SRVNFUlZFRF9TSVpFIDMyNzY4CisKK2VudW0gZmltY19vdmVybGF5X21vZGUgeworICAgIEZJTUNfT1ZMWV9OT1RfRklYRUQgICAgICAgPSAweDAsICAgIC8qIE92ZXJsYXkgbW9kZSBpc24ndCBmaXhlZC4gKi8KKyAgICBGSU1DX09WTFlfRklGTyAgICAgICAgICAgID0gMHgxLCAgICAvKiBOb24tZGVzdHJ1Y3RpdmUgT3ZlcmxheSB3aXRoIEZJRk8gKi8KKyAgICBGSU1DX09WTFlfRE1BX0FVVE8gICAgICAgID0gMHgyLCAgICAvKiBOb24tZGVzdHJ1Y3RpdmUgT3ZlcmxheSB3aXRoIERNQSAqLworICAgIEZJTUNfT1ZMWV9ETUFfTUFOVUFMICAgICAgPSAweDMsICAgIC8qIE5vbi1kZXN0cnVjdGl2ZSBPdmVybGF5IHdpdGggRE1BICovCisgICAgRklNQ19PVkxZX05PTkVfU0lOR0xFX0JVRiA9IDB4NCwgICAgLyogRGVzdHJ1Y3RpdmUgT3ZlcmxheSB3aXRoIERNQSBzaW5nbGUgZGVzdGluYXRpb24gYnVmZmVyICovCisgICAgRklNQ19PVkxZX05PTkVfTVVMVElfQlVGICA9IDB4NSwgICAgLyogRGVzdHJ1Y3RpdmUgT3ZlcmxheSB3aXRoIERNQSBtdWx0aXBsZSBkc3RpbmF0aW9uIGJ1ZmZlciAqLworfTsKKwordHlwZWRlZiB1bnNpZ25lZCBpbnQgZG1hX2FkZHJfdDsKKworc3RydWN0IGZpbWNfYnVmIHsKKyAgICBkbWFfYWRkcl90ICBiYXNlWzNdOworICAgIHNpemVfdCAgICAgIHNpemVbM107CisgICAgaW50ICAgICAgICAgcGxhbmVzOworfTsKKworc3RydWN0IGZpbWNfYnVmZmVyIHsKKyAgICB2b2lkICAgICp2aXJ0X2FkZHI7CisgICAgdm9pZCAgICAqcGh5c19hZGRyOworICAgIHNpemVfdCAgbGVuZ3RoOworfTsKKworc3RydWN0IHl1dl9mbXRfbGlzdCB7CisgICAgY29uc3QgY2hhciAgICAgICpuYW1lOworICAgIGNvbnN0IGNoYXIgICAgICAqZGVzYzsKKyAgICB1bnNpZ25lZCBpbnQgICAgZm10OworICAgIGludCAgICAgICAgICAgICBicHA7CisgICAgaW50ICAgICAgICAgICAgIHBsYW5lczsKK307CisKK3N0cnVjdCBpbWdfb2Zmc2V0IHsKKyAgICBpbnQgeV9oOworICAgIGludCB5X3Y7CisgICAgaW50IGNiX2g7CisgICAgaW50IGNiX3Y7CisgICAgaW50IGNyX2g7CisgICAgaW50IGNyX3Y7Cit9OworCisvLy0tLS0tLS0tLS0tLSBTVFJVQ1QgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLy8KKwordHlwZWRlZiBzdHJ1Y3QKK3sKKyAgICB1bnNpZ25lZCBpbnQgZnVsbF93aWR0aDsgICAgICAgICAgICAvLyBTb3VyY2UgSW1hZ2UgRnVsbCBXaWR0aCAoVmlydHVhbCBzY3JlZW4gc2l6ZSkKKyAgICB1bnNpZ25lZCBpbnQgZnVsbF9oZWlnaHQ7ICAgICAgICAgICAvLyBTb3VyY2UgSW1hZ2UgRnVsbCBIZWlnaHQgKFZpcnR1YWwgc2NyZWVuIHNpemUpCisgICAgdW5zaWduZWQgaW50IHN0YXJ0X3g7ICAgICAgICAgICAgICAgLy8gU291cmNlIEltYWdlIFN0YXJ0IHdpZHRoIG9mZnNldAorICAgIHVuc2lnbmVkIGludCBzdGFydF95OyAgICAgICAgICAgICAgIC8vIFNvdXJjZSBJbWFnZSBTdGFydCBoZWlnaHQgb2Zmc2V0CisgICAgdW5zaWduZWQgaW50IHdpZHRoOyAgICAgICAgICAgICAgICAgLy8gU291cmNlIEltYWdlIFdpZHRoCisgICAgdW5zaWduZWQgaW50IGhlaWdodDsgICAgICAgICAgICAgICAgLy8gU291cmNlIEltYWdlIEhlaWdodAorICAgIHVuc2lnbmVkIGludCBidWZfYWRkcl9waHlfcmdiX3k7ICAgIC8vIEJhc2UgQWRkcmVzcyBvZiB0aGUgU291cmNlIEltYWdlIChSR0Igb3IgWSk6IFBoeXNpY2FsIEFkZHJlc3MKKyAgICB1bnNpZ25lZCBpbnQgYnVmX2FkZHJfcGh5X2NiOyAgICAgICAvLyBCYXNlIEFkZHJlc3Mgb2YgdGhlIFNvdXJjZSBJbWFnZSAoQ0IgQ29tcG9uZW50KSA6IFBoeXNpY2FsIEFkZHJlc3MKKyAgICB1bnNpZ25lZCBpbnQgYnVmX2FkZHJfcGh5X2NyOyAgICAgICAvLyBCYXNlIEFkZHJlc3Mgb2YgdGhlIFNvdXJjZSBJbWFnZSAoQ1IgQ29tcG9uZW50KSA6IFBoeXNpY2FsIEFkZHJlc3MKKyAgICB1bnNpZ25lZCBpbnQgY29sb3Jfc3BhY2U7ICAgICAgICAgICAvLyBDb2xvciBTcGFjZSBvZiB0aGUgU291cmNlIEltYWdlCisgICAgdW5zaWduZWQgaW50IHBsYW5lczsgICAgICAgICAgICAgICAgLy8gbnVtYmVyIG9mIHBsYW5lcyBmb3IgdGhlIEltYWdlCit9IHM1cF9maW1jX2ltZ19pbmZvOworCit0eXBlZGVmIHN0cnVjdAoreworICAgIHM1cF9maW1jX2ltZ19pbmZvICAgc3JjOworICAgIHM1cF9maW1jX2ltZ19pbmZvICAgZHN0OworfSBzNXBfZmltY19wYXJhbXNfdDsKKwordHlwZWRlZiBzdHJ1Y3QgX3M1cF9maW1jX3QgeworICAgIGludCAgICAgICAgICAgICAgICAgZGV2X2ZkOworICAgIHN0cnVjdCBmaW1jX2J1ZmZlciAgb3V0X2J1ZjsKKworICAgIHM1cF9maW1jX3BhcmFtc190ICAgcGFyYW1zOworCisgICAgaW50ICAgICAgICAgICAgICAgICB1c2VfZXh0X291dF9tZW07CisgICAgdW5zaWduZWQgaW50ICAgICAgICBod192ZXI7Cit9IHM1cF9maW1jX3Q7CisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvZXh5bm9zNC9oYWwvaW5jbHVkZS9zNXBfdHZvdXQuaCBiL2V4eW5vczQvaGFsL2luY2x1ZGUvczVwX3R2b3V0LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjIyOTVkMgotLS0gL2Rldi9udWxsCisrKyBiL2V4eW5vczQvaGFsL2luY2x1ZGUvczVwX3R2b3V0LmgKQEAgLTAsMCArMSwxOTggQEAKKy8qCisgKiBDb3B5cmlnaHRAIFNhbXN1bmcgRWxlY3Ryb25pY3MgQ28uIExURAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaWZuZGVmIF9fUzVQX1RWT1VUX0hfXworI2RlZmluZSBfX1M1UF9UVk9VVF9IX18KKworI2luY2x1ZGUgPGxpbnV4L2ZiLmg+CisjaW5jbHVkZSAidmlkZW9kZXYyLmgiCisKKyNpZmRlZiBfX2NwbHVzcGx1cworZXh0ZXJuICJDIiB7CisjZW5kaWYKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIERlZmluZQorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKiBUVk9VVCBjb250cm9sICovCisjaWZkZWYgU0FNU1VOR19FWFlOT1M0MjEwCisjZGVmaW5lIFRWT1VUX0RFViAgICIvZGV2L3ZpZGVvMTQiCisjZWxzZQorI2RlZmluZSBUVk9VVF9ERVYgICAiL2Rldi92aWRlbzE2IgorI2VuZGlmCisjZGVmaW5lIEhQRF9ERVYgICAgICAgICAiL2Rldi9IUEQiCisKKy8qIC0tLS0tLS0tLS0tLS0gT3V0cHV0IC0tLS0tLS0tLS0tLS0tLS0tKi8KKy8qIHR5cGUgKi8KKyNkZWZpbmUgVjRMMl9PVVRQVVRfVFlQRV9NU0RNQSAgICAgICAgICA0CisjZGVmaW5lIFY0TDJfT1VUUFVUX1RZUEVfQ09NUE9TSVRFICAgICAgNQorI2RlZmluZSBWNEwyX09VVFBVVF9UWVBFX1NWSURFTyAgICAgICAgIDYKKyNkZWZpbmUgVjRMMl9PVVRQVVRfVFlQRV9ZUEJQUl9JTkVSTEFDRUQgICAgNworI2RlZmluZSBWNEwyX09VVFBVVF9UWVBFX1lQQlBSX1BST0dSRVNTSVZFICA4CisjZGVmaW5lIFY0TDJfT1VUUFVUX1RZUEVfUkdCX1BST0dSRVNTSVZFICAgIDkKKyNkZWZpbmUgVjRMMl9PVVRQVVRfVFlQRV9ESUdJVEFMICAgICAgICAxMAorI2RlZmluZSBWNEwyX09VVFBVVF9UWVBFX0hETUkgICAgICAgICAgIFY0TDJfT1VUUFVUX1RZUEVfRElHSVRBTAorI2RlZmluZSBWNEwyX09VVFBVVF9UWVBFX0hETUlfUkdCICAgICAgIDExCisjZGVmaW5lIFY0TDJfT1VUUFVUX1RZUEVfRFZJICAgICAgICAgICAgMTIKKworLyogLS0tLS0tLS0tLS0tLSBTVEQgLS0tLS0tLS0tLS0tLS0tLS0tLSovCisjZGVmaW5lIFY0TDJfU1REX1BBTF9CREdISVwKKyAoVjRMMl9TVERfUEFMX0J8VjRMMl9TVERfUEFMX0R8VjRMMl9TVERfUEFMX0d8VjRMMl9TVERfUEFMX0h8VjRMMl9TVERfUEFMX0kpCisKKyNkZWZpbmUgVjRMMl9TVERfNDgwUF82MF8xNl85ICAgICAgICAgICAoKHY0bDJfc3RkX2lkKTB4MDQwMDAwMDApCisjZGVmaW5lIFY0TDJfU1REXzQ4MFBfNjBfNF8zICAgICAgICAgICAgKCh2NGwyX3N0ZF9pZCkweDA1MDAwMDAwKQorI2RlZmluZSBWNEwyX1NURF81NzZQXzUwXzE2XzkgICAgICAgICAgICgodjRsMl9zdGRfaWQpMHgwNjAwMDAwMCkKKyNkZWZpbmUgVjRMMl9TVERfNTc2UF81MF80XzMgICAgICAgICAgICAoKHY0bDJfc3RkX2lkKTB4MDcwMDAwMDApCisjZGVmaW5lIFY0TDJfU1REXzcyMFBfNjAgICAgICAgICAgICAgICAgKCh2NGwyX3N0ZF9pZCkweDA4MDAwMDAwKQorI2RlZmluZSBWNEwyX1NURF83MjBQXzUwICAgICAgICAgICAgICAgICgodjRsMl9zdGRfaWQpMHgwOTAwMDAwMCkKKyNkZWZpbmUgVjRMMl9TVERfMTA4MFBfNjAgICAgICAgICAgICAgICAoKHY0bDJfc3RkX2lkKTB4MGEwMDAwMDApCisjZGVmaW5lIFY0TDJfU1REXzEwODBQXzUwICAgICAgICAgICAgICAgKCh2NGwyX3N0ZF9pZCkweDBiMDAwMDAwKQorI2RlZmluZSBWNEwyX1NURF8xMDgwSV82MCAgICAgICAgICAgICAgICgodjRsMl9zdGRfaWQpMHgwYzAwMDAwMCkKKyNkZWZpbmUgVjRMMl9TVERfMTA4MElfNTAgICAgICAgICAgICAgICAoKHY0bDJfc3RkX2lkKTB4MGQwMDAwMDApCisjZGVmaW5lIFY0TDJfU1REXzQ4MFBfNTkgICAgICAgICAgICAgICAgKCh2NGwyX3N0ZF9pZCkweDBlMDAwMDAwKQorI2RlZmluZSBWNEwyX1NURF83MjBQXzU5ICAgICAgICAgICAgICAgICgodjRsMl9zdGRfaWQpMHgwZjAwMDAwMCkKKyNkZWZpbmUgVjRMMl9TVERfMTA4MElfNTkgICAgICAgICAgICAgICAoKHY0bDJfc3RkX2lkKTB4MTAwMDAwMDApCisjZGVmaW5lIFY0TDJfU1REXzEwODBQXzU5ICAgICAgICAgICAgICAgKCh2NGwyX3N0ZF9pZCkweDExMDAwMDAwKQorI2RlZmluZSBWNEwyX1NURF8xMDgwUF8zMCAgICAgICAgICAgICAgICgodjRsMl9zdGRfaWQpMHgxMjAwMDAwMCkKKyNkZWZpbmUgVjRMMl9TVERfVFZPVVRfNzIwUF82MF9TQlNfSEFMRiAoKHY0bDJfc3RkX2lkKTB4MTMwMDAwMDApCisjZGVmaW5lIFY0TDJfU1REX1RWT1VUXzcyMFBfNTlfU0JTX0hBTEYgKCh2NGwyX3N0ZF9pZCkweDE0MDAwMDAwKQorI2RlZmluZSBWNEwyX1NURF9UVk9VVF83MjBQXzUwX1RCICAgICAgICgodjRsMl9zdGRfaWQpMHgxNTAwMDAwMCkKKyNkZWZpbmUgVjRMMl9TVERfVFZPVVRfMTA4MFBfMjRfVEIgICAgICAoKHY0bDJfc3RkX2lkKTB4MTYwMDAwMDApCisjZGVmaW5lIFY0TDJfU1REX1RWT1VUXzEwODBQXzIzX1RCICAgICAgKCh2NGwyX3N0ZF9pZCkweDE3MDAwMDAwKQorCisvKiBUVk9VVCB2aWRlbyAqLworI2lmZGVmIFNBTVNVTkdfRVhZTk9TNDIxMAorI2RlZmluZSBUVk9VVF9ERVZfViAiL2Rldi92aWRlbzIxIgorI2Vsc2UKKyNkZWZpbmUgVFZPVVRfREVWX1YgIi9kZXYvdmlkZW8yMCIKKyNlbmRpZgorCisvKiAtLS0tLS0tLS0tLS0tIElucHV0IC0tLS0tLS0tLS0tLS0tLS0tLSovCisvKiB0eXBlICovCisjZGVmaW5lIFY0TDJfSU5QVVRfVFlQRV9NU0RNQSAgICAgICAgICAgMworI2RlZmluZSBWNEwyX0lOUFVUX1RZUEVfRklGTyAgICAgICAgICAgIDQKKworLyogVFZPVVQgdmlkZW8gKi8KKyNkZWZpbmUgUEZYX05PREVfRkIgIi9kZXYvZ3JhcGhpY3MvZmIiCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBzdHJ1Y3R1cmVzCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworLyogVFZPVVQgKi8KK3N0cnVjdCB2NGwyX3ZpZF9vdmVybGF5X3NyYyB7CisgICAgdm9pZCAgICAgICAgICAgICpiYXNlX3k7CisgICAgdm9pZCAgICAgICAgICAgICpiYXNlX2M7CisgICAgc3RydWN0IHY0bDJfcGl4X2Zvcm1hdCAgcGl4X2ZtdDsKK307CisKK3N0cnVjdCB2NGwyX3dpbmRvd19zNXBfdHZvdXQgeworICAgIF9fdTMyICAgICAgIGNhcGFiaWxpdHk7CisgICAgX191MzIgICAgICAgZmxhZ3M7CisgICAgX191MzIgICAgICAgcHJpb3JpdHk7CisgICAgc3RydWN0IHY0bDJfd2luZG93ICB3aW47Cit9OworCitzdHJ1Y3QgdjRsMl9waXhfZm9ybWF0X3M1cF90dm91dCB7CisgICAgdm9pZCAqYmFzZV95OworICAgIHZvaWQgKmJhc2VfYzsKKyAgICBfX3UzMiBzcmNfaW1nX2VuZGlhbjsKKyAgICBzdHJ1Y3QgdjRsMl9waXhfZm9ybWF0ICBwaXhfZm10OworfTsKKworc3RydWN0IHZpZF9vdmVybGF5X3BhcmFtIHsKKyAgICBzdHJ1Y3QgdjRsMl92aWRfb3ZlcmxheV9zcmMgICAgIHNyYzsKKyAgICBzdHJ1Y3QgdjRsMl9yZWN0ICAgICAgICAgICAgICAgIHNyY19jcm9wOworICAgIHN0cnVjdCB2NGwyX2ZyYW1lYnVmZmVyICAgICAgICAgZHN0OworICAgIHN0cnVjdCB2NGwyX3dpbmRvdyAgICAgICAgICAgICAgZHN0X3dpbjsKK307CisKK3N0cnVjdCB0dm91dF9wYXJhbSB7CisgICAgc3RydWN0IHY0bDJfcGl4X2Zvcm1hdF9zNXBfdHZvdXQgICAgdHZvdXRfc3JjOworICAgIHN0cnVjdCB2NGwyX3dpbmRvd19zNXBfdHZvdXQgICAgICAgIHR2b3V0X3JlY3Q7CisgICAgc3RydWN0IHY0bDJfcmVjdCAgICAgICAgICAgICAgICAgICAgdHZvdXRfZHN0OworfTsKKworc3RydWN0IG92ZXJsYXlfcGFyYW0geworICAgIHN0cnVjdCB2NGwyX2ZyYW1lYnVmZmVyICAgICAgICAgb3ZlcmxheV9mcmFtZTsKKyAgICBzdHJ1Y3QgdjRsMl93aW5kb3dfczVwX3R2b3V0ICAgIG92ZXJsYXlfcmVjdDsKKyAgICBzdHJ1Y3QgdjRsMl9yZWN0ICAgICAgICAgICAgICAgIG92ZXJsYXlfZHN0OworfTsKKworLyogRkIgKi8KK3N0cnVjdCBzNXB0dmZiX3VzZXJfd2luZG93IHsKKyAgICBpbnQgeDsKKyAgICBpbnQgeTsKK307CisKK3N0cnVjdCBzNXB0dmZiX3VzZXJfcGxhbmVfYWxwaGEgeworICAgIGludCBjaGFubmVsOworICAgIHVuc2lnbmVkIGNoYXIgYWxwaGE7Cit9OworCitzdHJ1Y3QgczVwdHZmYl91c2VyX2Nocm9tYSB7CisgICAgaW50IGVuYWJsZWQ7CisgICAgdW5zaWduZWQgY2hhciByZWQ7CisgICAgdW5zaWduZWQgY2hhciBncmVlbjsKKyAgICB1bnNpZ25lZCBjaGFyIGJsdWU7Cit9OworCitlbnVtIHM1cHR2ZmJfdmVyX3NjYWxpbmdfdCB7CisgICAgVkVSVElDQUxfWDEsCisgICAgVkVSVElDQUxfWDIsCit9OworCitlbnVtIHM1cHR2ZmJfaG9yX3NjYWxpbmdfdCB7CisgICAgSE9SSVpPTlRBTF9YMSwKKyAgICBIT1JJWk9OVEFMX1gyLAorfTsKKworc3RydWN0IHM1cHR2ZmJfdXNlcl9zY2FsaW5nIHsKKyAgICBlbnVtIHM1cHR2ZmJfdmVyX3NjYWxpbmdfdCB2ZXI7CisgICAgZW51bSBzNXB0dmZiX2hvcl9zY2FsaW5nX3QgaG9yOworfTsKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIGN1c3RvbSBpb2N0bHMKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisjZGVmaW5lIFZJRElPQ19TX0JBU0VBRERSICAgICAgICBfSU9SKCdWJywgODMsIGludCkKKworI2RlZmluZSBWSURJT0NfSERDUF9FTkFCTEUgX0lPV1IoJ1YnLCAxMDAsIHVuc2lnbmVkIGludCkKKyNkZWZpbmUgVklESU9DX0hEQ1BfU1RBVFVTIF9JT1IoJ1YnLCAxMDEsIHVuc2lnbmVkIGludCkKKyNkZWZpbmUgVklESU9DX0hEQ1BfUFJPVF9TVEFUVVMgX0lPUignVicsIDEwMiwgdW5zaWduZWQgaW50KQorCisjZGVmaW5lIFZJRElPQ19JTklUX0FVRElPIF9JT1IoJ1YnLCAxMDMsIHVuc2lnbmVkIGludCkKKyNkZWZpbmUgVklESU9DX0FWX01VVEUgX0lPUignVicsIDEwNCwgdW5zaWduZWQgaW50KQorI2RlZmluZSBWSURJT0NfR19BVk1VVEUgX0lPUignVicsIDEwNSwgdW5zaWduZWQgaW50KQorI2RlZmluZSBIUERfR0VUX1NUQVRFIF9JT1IoJ0gnLCAxMDAsIHVuc2lnbmVkIGludCkKKworI2RlZmluZSBTNVBUVkZCX1dJTl9QT1NJVElPTiBfSU9XKCdGJywgMjEzLCBzdHJ1Y3QgczVwdHZmYl91c2VyX3dpbmRvdykKKyNkZWZpbmUgUzVQVFZGQl9XSU5fU0VUX1BMQU5FX0FMUEhBIF9JT1coJ0YnLCAyMTQsIHN0cnVjdCBzNXB0dmZiX3VzZXJfcGxhbmVfYWxwaGEpCisjZGVmaW5lIFM1UFRWRkJfV0lOX1NFVF9DSFJPTUEgX0lPVygnRicsIDIxNSwgc3RydWN0IHM1cHR2ZmJfdXNlcl9jaHJvbWEpCisKKyNkZWZpbmUgUzVQVFZGQl9TRVRfVlNZTkNfSU5UIF9JT1coJ0YnLCAyMTYsIHVuc2lnbmVkIGludCkKKyNkZWZpbmUgUzVQVFZGQl9XQUlURk9SVlNZTkMgX0lPKCdGJywgMzIpCisjZGVmaW5lIFM1UFRWRkJfV0lOX1NFVF9BRERSIF9JT1coJ0YnLCAyMTksIHVuc2lnbmVkIGludCkKKyNkZWZpbmUgUzVQVFZGQl9TRVRfV0lOX09OIF9JT1coJ0YnLCAyMjAsIHVuc2lnbmVkIGludCkKKyNkZWZpbmUgUzVQVFZGQl9TRVRfV0lOX09GRiBfSU9XKCdGJywgMjIxLCB1bnNpZ25lZCBpbnQpCisjZGVmaW5lIFM1UFRWRkJfU0NBTElORyBfSU9XKCdGJywgMjIyLCBzdHJ1Y3QgczVwdHZmYl91c2VyX3NjYWxpbmcpCisKKyNpZmRlZiBfX2NwbHVzcGx1cworfQorI2VuZGlmCisKKyNlbmRpZiAvKiBfX1M1UF9UVk9VVF9IX18gKi8KZGlmZiAtLWdpdCBhL2V4eW5vczQvaGFsL2luY2x1ZGUvczVwX3R2b3V0X3Y0bDIuaCBiL2V4eW5vczQvaGFsL2luY2x1ZGUvczVwX3R2b3V0X3Y0bDIuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xNmY3OGIxCi0tLSAvZGV2L251bGwKKysrIGIvZXh5bm9zNC9oYWwvaW5jbHVkZS9zNXBfdHZvdXRfdjRsMi5oCkBAIC0wLDAgKzEsMTkwIEBACisvKgorICogQ29weXJpZ2h0QCBTYW1zdW5nIEVsZWN0cm9uaWNzIENvLiBMVEQKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2lmbmRlZiBfX1M1UF9UVk9VVF9IX18KKyNkZWZpbmUgX19TNVBfVFZPVVRfSF9fCisKKyNpbmNsdWRlIDxsaW51eC9mYi5oPgorCisjaW5jbHVkZSAidmlkZW9kZXYyLmgiCisKKyNpZmRlZiBfX2NwbHVzcGx1cworZXh0ZXJuICJDIiB7CisjZW5kaWYKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIERlZmluZQorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKiBUVk9VVCBjb250cm9sICovCisjZGVmaW5lIFBGWF9OT0RFX0ZCICAgICAiL2Rldi9ncmFwaGljcy9mYiIKKworI2RlZmluZSBUVk9VVF9ERVZfViAgICAgIi9kZXYvdmlkZW8yMCIKKyNkZWZpbmUgVFZPVVRfREVWX0cwICAgICIvZGV2L3ZpZGVvMTYiCisjZGVmaW5lIFRWT1VUX0RFVl9HMSAgICAiL2Rldi92aWRlbzE3IgorCisjZGVmaW5lIEhQRF9ERVYgICAgICAgICAiL2Rldi9IUEQiCisKKy8qIC0tLS0tLS0tLS0tLS0gT3V0cHV0IC0tLS0tLS0tLS0tLS0tLS0tKi8KKy8qIHR5cGUgKi8KKyNkZWZpbmUgVjRMMl9PVVRQVVRfVFlQRV9NU0RNQSAgICAgICAgICA0CisjZGVmaW5lIFY0TDJfT1VUUFVUX1RZUEVfQ09NUE9TSVRFICAgICAgNQorI2RlZmluZSBWNEwyX09VVFBVVF9UWVBFX1NWSURFTyAgICAgICAgIDYKKyNkZWZpbmUgVjRMMl9PVVRQVVRfVFlQRV9ZUEJQUl9JTkVSTEFDRUQgICAgNworI2RlZmluZSBWNEwyX09VVFBVVF9UWVBFX1lQQlBSX1BST0dSRVNTSVZFICA4CisjZGVmaW5lIFY0TDJfT1VUUFVUX1RZUEVfUkdCX1BST0dSRVNTSVZFICAgIDkKKyNkZWZpbmUgVjRMMl9PVVRQVVRfVFlQRV9ESUdJVEFMICAgICAgICAxMAorI2RlZmluZSBWNEwyX09VVFBVVF9UWVBFX0hETUkgICAgICAgICAgIFY0TDJfT1VUUFVUX1RZUEVfRElHSVRBTAorI2RlZmluZSBWNEwyX09VVFBVVF9UWVBFX0hETUlfUkdCICAgICAgIDExCisjZGVmaW5lIFY0TDJfT1VUUFVUX1RZUEVfRFZJICAgICAgICAgICAgMTIKKworLyogLS0tLS0tLS0tLS0tLSBTVEQgLS0tLS0tLS0tLS0tLS0tLS0tLSovCisjZGVmaW5lIFY0TDJfU1REX1BBTF9CREdISVwKKyAoVjRMMl9TVERfUEFMX0J8VjRMMl9TVERfUEFMX0R8VjRMMl9TVERfUEFMX0d8VjRMMl9TVERfUEFMX0h8VjRMMl9TVERfUEFMX0kpCisKKyNkZWZpbmUgVjRMMl9TVERfNDgwUF82MF8xNl85ICAgICAgICAgICAoKHY0bDJfc3RkX2lkKTB4MDQwMDAwMDApCisjZGVmaW5lIFY0TDJfU1REXzQ4MFBfNjBfNF8zICAgICAgICAgICAgKCh2NGwyX3N0ZF9pZCkweDA1MDAwMDAwKQorI2RlZmluZSBWNEwyX1NURF81NzZQXzUwXzE2XzkgICAgICAgICAgICgodjRsMl9zdGRfaWQpMHgwNjAwMDAwMCkKKyNkZWZpbmUgVjRMMl9TVERfNTc2UF81MF80XzMgICAgICAgICAgICAoKHY0bDJfc3RkX2lkKTB4MDcwMDAwMDApCisjZGVmaW5lIFY0TDJfU1REXzcyMFBfNjAgICAgICAgICAgICAgICAgKCh2NGwyX3N0ZF9pZCkweDA4MDAwMDAwKQorI2RlZmluZSBWNEwyX1NURF83MjBQXzUwICAgICAgICAgICAgICAgICgodjRsMl9zdGRfaWQpMHgwOTAwMDAwMCkKKyNkZWZpbmUgVjRMMl9TVERfMTA4MFBfNjAgICAgICAgICAgICAgICAoKHY0bDJfc3RkX2lkKTB4MGEwMDAwMDApCisjZGVmaW5lIFY0TDJfU1REXzEwODBQXzUwICAgICAgICAgICAgICAgKCh2NGwyX3N0ZF9pZCkweDBiMDAwMDAwKQorI2RlZmluZSBWNEwyX1NURF8xMDgwSV82MCAgICAgICAgICAgICAgICgodjRsMl9zdGRfaWQpMHgwYzAwMDAwMCkKKyNkZWZpbmUgVjRMMl9TVERfMTA4MElfNTAgICAgICAgICAgICAgICAoKHY0bDJfc3RkX2lkKTB4MGQwMDAwMDApCisjZGVmaW5lIFY0TDJfU1REXzQ4MFBfNTkgICAgICAgICAgICAgICAgKCh2NGwyX3N0ZF9pZCkweDBlMDAwMDAwKQorI2RlZmluZSBWNEwyX1NURF83MjBQXzU5ICAgICAgICAgICAgICAgICgodjRsMl9zdGRfaWQpMHgwZjAwMDAwMCkKKyNkZWZpbmUgVjRMMl9TVERfMTA4MElfNTkgICAgICAgICAgICAgICAoKHY0bDJfc3RkX2lkKTB4MTAwMDAwMDApCisjZGVmaW5lIFY0TDJfU1REXzEwODBQXzU5ICAgICAgICAgICAgICAgKCh2NGwyX3N0ZF9pZCkweDExMDAwMDAwKQorI2RlZmluZSBWNEwyX1NURF8xMDgwUF8zMCAgICAgICAgICAgICAgICgodjRsMl9zdGRfaWQpMHgxMjAwMDAwMCkKKyNkZWZpbmUgVjRMMl9TVERfVFZPVVRfNzIwUF82MF9TQlNfSEFMRiAoKHY0bDJfc3RkX2lkKTB4MTMwMDAwMDApCisjZGVmaW5lIFY0TDJfU1REX1RWT1VUXzcyMFBfNTlfU0JTX0hBTEYgKCh2NGwyX3N0ZF9pZCkweDE0MDAwMDAwKQorI2RlZmluZSBWNEwyX1NURF9UVk9VVF83MjBQXzUwX1RCICAgICAgICgodjRsMl9zdGRfaWQpMHgxNTAwMDAwMCkKKyNkZWZpbmUgVjRMMl9TVERfVFZPVVRfMTA4MFBfMjRfVEIgICAgICAoKHY0bDJfc3RkX2lkKTB4MTYwMDAwMDApCisjZGVmaW5lIFY0TDJfU1REX1RWT1VUXzEwODBQXzIzX1RCICAgICAgKCh2NGwyX3N0ZF9pZCkweDE3MDAwMDAwKQorCisvKiAtLS0tLS0tLS0tLS0tIElucHV0IC0tLS0tLS0tLS0tLS0tLS0tLSovCisvKiB0eXBlICovCisjZGVmaW5lIFY0TDJfSU5QVVRfVFlQRV9NU0RNQSAgICAgICAgICAgMworI2RlZmluZSBWNEwyX0lOUFVUX1RZUEVfRklGTyAgICAgICAgICAgIDQKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIHN0cnVjdHVyZXMKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisvKiBUVk9VVCAqLworc3RydWN0IHY0bDJfdmlkX292ZXJsYXlfc3JjIHsKKyAgICB2b2lkICAgICAgICAgICAgKmJhc2VfeTsKKyAgICB2b2lkICAgICAgICAgICAgKmJhc2VfYzsKKyAgICBzdHJ1Y3QgdjRsMl9waXhfZm9ybWF0ICBwaXhfZm10OworfTsKKworc3RydWN0IHY0bDJfd2luZG93X3M1cF90dm91dCB7CisgICAgX191MzIgICAgICAgY2FwYWJpbGl0eTsKKyAgICBfX3UzMiAgICAgICBmbGFnczsKKyAgICBfX3UzMiAgICAgICBwcmlvcml0eTsKKyAgICBzdHJ1Y3QgdjRsMl93aW5kb3cgIHdpbjsKK307CisKK3N0cnVjdCB2NGwyX3BpeF9mb3JtYXRfczVwX3R2b3V0IHsKKyAgICB2b2lkICpiYXNlX3k7CisgICAgdm9pZCAqYmFzZV9jOworICAgIF9fdTMyIHNyY19pbWdfZW5kaWFuOworICAgIHN0cnVjdCB2NGwyX3BpeF9mb3JtYXQgIHBpeF9mbXQ7Cit9OworCitzdHJ1Y3QgdmlkX292ZXJsYXlfcGFyYW0geworICAgIHN0cnVjdCB2NGwyX3ZpZF9vdmVybGF5X3NyYyAgICAgc3JjOworICAgIHN0cnVjdCB2NGwyX3JlY3QgICAgICAgICAgICAgICAgc3JjX2Nyb3A7CisgICAgc3RydWN0IHY0bDJfZnJhbWVidWZmZXIgICAgICAgICBkc3Q7CisgICAgc3RydWN0IHY0bDJfd2luZG93ICAgICAgICAgICAgICBkc3Rfd2luOworfTsKKworc3RydWN0IHR2b3V0X3BhcmFtIHsKKyAgICBzdHJ1Y3QgdjRsMl9waXhfZm9ybWF0X3M1cF90dm91dCAgICB0dm91dF9zcmM7CisgICAgc3RydWN0IHY0bDJfd2luZG93X3M1cF90dm91dCAgICAgICAgdHZvdXRfcmVjdDsKKyAgICBzdHJ1Y3QgdjRsMl9yZWN0ICAgICAgICAgICAgICAgICAgICB0dm91dF9kc3Q7Cit9OworCitzdHJ1Y3Qgb3ZlcmxheV9wYXJhbSB7CisgICAgc3RydWN0IHY0bDJfZnJhbWVidWZmZXIgICAgICAgICBvdmVybGF5X2ZyYW1lOworICAgIHN0cnVjdCB2NGwyX3dpbmRvd19zNXBfdHZvdXQgICAgb3ZlcmxheV9yZWN0OworICAgIHN0cnVjdCB2NGwyX3JlY3QgICAgICAgICAgICAgICAgb3ZlcmxheV9kc3Q7Cit9OworCisvKiBGQiAqLworc3RydWN0IHM1cHR2ZmJfdXNlcl93aW5kb3cgeworICAgIGludCB4OworICAgIGludCB5OworfTsKKworc3RydWN0IHM1cHR2ZmJfdXNlcl9wbGFuZV9hbHBoYSB7CisgICAgaW50IGNoYW5uZWw7CisgICAgdW5zaWduZWQgY2hhciBhbHBoYTsKK307CisKK3N0cnVjdCBzNXB0dmZiX3VzZXJfY2hyb21hIHsKKyAgICBpbnQgZW5hYmxlZDsKKyAgICB1bnNpZ25lZCBjaGFyIHJlZDsKKyAgICB1bnNpZ25lZCBjaGFyIGdyZWVuOworICAgIHVuc2lnbmVkIGNoYXIgYmx1ZTsKK307CisKK2VudW0gczVwdHZmYl92ZXJfc2NhbGluZ190IHsKKyAgICBWRVJUSUNBTF9YMSwKKyAgICBWRVJUSUNBTF9YMiwKK307CisKK2VudW0gczVwdHZmYl9ob3Jfc2NhbGluZ190IHsKKyAgICBIT1JJWk9OVEFMX1gxLAorICAgIEhPUklaT05UQUxfWDIsCit9OworCitzdHJ1Y3QgczVwdHZmYl91c2VyX3NjYWxpbmcgeworICAgIGVudW0gczVwdHZmYl92ZXJfc2NhbGluZ190IHZlcjsKKyAgICBlbnVtIHM1cHR2ZmJfaG9yX3NjYWxpbmdfdCBob3I7Cit9OworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogY3VzdG9tIGlvY3RscworICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyNkZWZpbmUgVklESU9DX1NfQkFTRUFERFIgICAgICAgIF9JT1IoJ1YnLCA4MywgaW50KQorCisjZGVmaW5lIFZJRElPQ19IRENQX0VOQUJMRSBfSU9XUignVicsIDEwMCwgdW5zaWduZWQgaW50KQorI2RlZmluZSBWSURJT0NfSERDUF9TVEFUVVMgX0lPUignVicsIDEwMSwgdW5zaWduZWQgaW50KQorI2RlZmluZSBWSURJT0NfSERDUF9QUk9UX1NUQVRVUyBfSU9SKCdWJywgMTAyLCB1bnNpZ25lZCBpbnQpCisKKyNkZWZpbmUgVklESU9DX0lOSVRfQVVESU8gX0lPUignVicsIDEwMywgdW5zaWduZWQgaW50KQorI2RlZmluZSBWSURJT0NfQVZfTVVURSBfSU9SKCdWJywgMTA0LCB1bnNpZ25lZCBpbnQpCisjZGVmaW5lIFZJRElPQ19HX0FWTVVURSBfSU9SKCdWJywgMTA1LCB1bnNpZ25lZCBpbnQpCisjZGVmaW5lIEhQRF9HRVRfU1RBVEUgX0lPUignSCcsIDEwMCwgdW5zaWduZWQgaW50KQorCisjZGVmaW5lIFM1UFRWRkJfV0lOX1BPU0lUSU9OIF9JT1coJ0YnLCAyMTMsIHN0cnVjdCBzNXB0dmZiX3VzZXJfd2luZG93KQorI2RlZmluZSBTNVBUVkZCX1dJTl9TRVRfUExBTkVfQUxQSEEgX0lPVygnRicsIDIxNCwgc3RydWN0IHM1cHR2ZmJfdXNlcl9wbGFuZV9hbHBoYSkKKyNkZWZpbmUgUzVQVFZGQl9XSU5fU0VUX0NIUk9NQSBfSU9XKCdGJywgMjE1LCBzdHJ1Y3QgczVwdHZmYl91c2VyX2Nocm9tYSkKKworI2RlZmluZSBTNVBUVkZCX1NFVF9WU1lOQ19JTlQgX0lPVygnRicsIDIxNiwgdW5zaWduZWQgaW50KQorI2RlZmluZSBTNVBUVkZCX1dBSVRGT1JWU1lOQyBfSU8oJ0YnLCAzMikKKyNkZWZpbmUgUzVQVFZGQl9XSU5fU0VUX0FERFIgX0lPVygnRicsIDIxOSwgdW5zaWduZWQgaW50KQorI2RlZmluZSBTNVBUVkZCX1NFVF9XSU5fT04gX0lPVygnRicsIDIyMCwgdW5zaWduZWQgaW50KQorI2RlZmluZSBTNVBUVkZCX1NFVF9XSU5fT0ZGIF9JT1coJ0YnLCAyMjEsIHVuc2lnbmVkIGludCkKKyNkZWZpbmUgUzVQVFZGQl9TQ0FMSU5HIF9JT1coJ0YnLCAyMjIsIHN0cnVjdCBzNXB0dmZiX3VzZXJfc2NhbGluZykKKworI2lmZGVmIF9fY3BsdXNwbHVzCit9CisjZW5kaWYKKworI2VuZGlmIC8qIF9fUzVQX1RWT1VUX0hfXyAqLwpkaWZmIC0tZ2l0IGEvZXh5bm9zNC9oYWwvaW5jbHVkZS9zZWNfZm9ybWF0LmggYi9leHlub3M0L2hhbC9pbmNsdWRlL3NlY19mb3JtYXQuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44NzIyYjQ1Ci0tLSAvZGV2L251bGwKKysrIGIvZXh5bm9zNC9oYWwvaW5jbHVkZS9zZWNfZm9ybWF0LmgKQEAgLTAsMCArMSw0NiBAQAorLyoKKyAqIENvcHlyaWdodEAgU2Ftc3VuZyBFbGVjdHJvbmljcyBDby4gTFRECisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorKi8KKworI2lmbmRlZiBfU0VDX0ZPUk1BVF9IXworI2RlZmluZSBfU0VDX0ZPUk1BVF9IXworCisvKiBlbnVtIHJlbGF0ZWQgdG8gcGl4ZWwgZm9ybWF0ICovCisKK2VudW0geworICAgIEhBTF9QSVhFTF9GT1JNQVRfWUNiQ3JfNDIyX1AgICAgICAgICA9IDB4MTAwLAorICAgIEhBTF9QSVhFTF9GT1JNQVRfWUNiQ3JfNDIwX1AgICAgICAgICA9IDB4MTAxLAorICAgIEhBTF9QSVhFTF9GT1JNQVRfWUNiQ3JfNDIwX0kgICAgICAgICA9IDB4MTAyLAorICAgIEhBTF9QSVhFTF9GT1JNQVRfQ2JZQ3JZXzQyMl9JICAgICAgICA9IDB4MTAzLAorICAgIEhBTF9QSVhFTF9GT1JNQVRfQ2JZQ3JZXzQyMF9JICAgICAgICA9IDB4MTA0LAorICAgIEhBTF9QSVhFTF9GT1JNQVRfWUNiQ3JfNDIwX1NQICAgICAgICA9IDB4MTA1LAorICAgIEhBTF9QSVhFTF9GT1JNQVRfWUNyQ2JfNDIyX1NQICAgICAgICA9IDB4MTA2LAorICAgIEhBTF9QSVhFTF9GT1JNQVRfWUNiQ3JfNDIwX1NQX1RJTEVEICA9IDB4MTA3LAorICAgIEhBTF9QSVhFTF9GT1JNQVRfQVJHQjg4OCAgICAgICAgICAgICA9IDB4MTA4LAorICAgIC8vIHN1cHBvcnQgY3VzdG9tIGZvcm1hdCBmb3IgemVybyBjb3B5CisgICAgSEFMX1BJWEVMX0ZPUk1BVF9DVVNUT01fWUNiQ3JfNDIwX1NQID0gMHgxMTAsCisgICAgSEFMX1BJWEVMX0ZPUk1BVF9DVVNUT01fWUNyQ2JfNDIwX1NQID0gMHgxMTEsCisgICAgSEFMX1BJWEVMX0ZPUk1BVF9DVVNUT01fWUNiQ3JfNDIwX1NQX1RJTEVEID0gMHgxMTIsCisgICAgSEFMX1BJWEVMX0ZPUk1BVF9DVVNUT01fWUNiQ3JfNDIyX1NQID0gMHgxMTMsCisgICAgSEFMX1BJWEVMX0ZPUk1BVF9DVVNUT01fWUNyQ2JfNDIyX1NQID0gMHgxMTQsCisgICAgSEFMX1BJWEVMX0ZPUk1BVF9DVVNUT01fWUNiQ3JfNDIyX0kgPSAweDExNSwKKyAgICBIQUxfUElYRUxfRk9STUFUX0NVU1RPTV9ZQ3JDYl80MjJfSSA9IDB4MTE2LAorICAgIEhBTF9QSVhFTF9GT1JNQVRfQ1VTVE9NX0NiWUNyWV80MjJfSSA9IDB4MTE3LAorICAgIEhBTF9QSVhFTF9GT1JNQVRfQ1VTVE9NX0NyWUNiWV80MjJfSSA9IDB4MTE4LAorICAgIEhBTF9QSVhFTF9GT1JNQVRfQ1VTVE9NX0NiWUNyXzQyMl9JICA9IDB4MTFCLAorICAgIEhBTF9QSVhFTF9GT1JNQVRfQ1VTVE9NX01BWAorfTsKKworI2VuZGlmCmRpZmYgLS1naXQgYS9leHlub3M0L2hhbC9pbmNsdWRlL3NlY19nMmQuaCBiL2V4eW5vczQvaGFsL2luY2x1ZGUvc2VjX2cyZC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjc3MmNiZjgKLS0tIC9kZXYvbnVsbAorKysgYi9leHlub3M0L2hhbC9pbmNsdWRlL3NlY19nMmQuaApAQCAtMCwwICsxLDI1MSBAQAorLyoKKyAqIENvcHlyaWdodEAgU2Ftc3VuZyBFbGVjdHJvbmljcyBDby4gTFRECisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpZm5kZWYgX1NFQ19HMkRfRFJJVkVSX0hfCisjZGVmaW5lIF9TRUNfRzJEX0RSSVZFUl9IXwordHlwZWRlZiB1bnNpZ25lZCBjaGFyICB1ODsKK3R5cGVkZWYgdW5zaWduZWQgc2hvcnQgdTE2OwordHlwZWRlZiB1bnNpZ25lZCBsb25nICB1MzI7CisKKyNkZWZpbmUgU0VDX0cyRF9ERVZfTkFNRSAgICAgICAgIi9kZXYvZmltZzJkIgorCisjZGVmaW5lIEcyRF9JT0NUTF9NQUdJQyAnRycKKworI2RlZmluZSBHMkRfQkxJVCAgICAgICAgICAgICAgICAgICAgX0lPKEcyRF9JT0NUTF9NQUdJQywwKQorI2RlZmluZSBHMkRfR0VUX1ZFUlNJT04gICAgICAgICAgICAgX0lPKEcyRF9JT0NUTF9NQUdJQywxKQorI2RlZmluZSBHMkRfR0VUX01FTU9SWSAgICAgICAgICAgICAgX0lPUihHMkRfSU9DVExfTUFHSUMsMiwgdW5zaWduZWQgaW50KQorI2RlZmluZSBHMkRfR0VUX01FTU9SWV9TSVpFICAgICAgICAgX0lPUihHMkRfSU9DVExfTUFHSUMsMywgdW5zaWduZWQgaW50KQorI2RlZmluZSBHMkRfRE1BX0NBQ0hFX0NMRUFOICAgICAgICAgX0lPV1IoRzJEX0lPQ1RMX01BR0lDLDQsIHN0cnVjdCBnMmRfZG1hX2luZm8pCisjZGVmaW5lIEcyRF9ETUFfQ0FDSEVfRkxVU0ggICAgICAgICBfSU9XUihHMkRfSU9DVExfTUFHSUMsNSwgc3RydWN0IGcyZF9kbWFfaW5mbykKKyNkZWZpbmUgRzJEX1NZTkMgICAgICAgICAgICAgICAgICAgIF9JTyhHMkRfSU9DVExfTUFHSUMsNikKKyNkZWZpbmUgRzJEX1JFU0VUICAgICAgICAgICAgICAgICAgIF9JTyhHMkRfSU9DVExfTUFHSUMsNykKKworI2RlZmluZSBHMkRfTUFYX1dJRFRIICAgKDIwNDgpCisjZGVmaW5lIEcyRF9NQVhfSEVJR0hUICAoMjA0OCkKKworI2RlZmluZSBHMkRfQUxQSEFfVkFMVUVfTUFYICgyNTUpCisKKyNkZWZpbmUgRzJEX1BPTExJTkcgKDE8PDApCisjZGVmaW5lIEcyRF9JTlRFUlJVUFQgKDA8PDApCisjZGVmaW5lIEcyRF9DQUNIRV9PUCAoMTw8MSkKKyNkZWZpbmUgRzJEX05PTkVfSU5WQUxJREFURSAoMDw8MSkKKyNkZWZpbmUgRzJEX0hZQlJJRF9NT0RFICgxPDwyKQorCit0eXBlZGVmIGVudW0geworICAgIEcyRF9ST1RfMCA9IDAsCisgICAgRzJEX1JPVF85MCwKKyAgICBHMkRfUk9UXzE4MCwKKyAgICBHMkRfUk9UXzI3MCwKKyAgICBHMkRfUk9UX1hfRkxJUCwKKyAgICBHMkRfUk9UX1lfRkxJUAorfSBHMkRfUk9UX0RFRzsKKwordHlwZWRlZiBlbnVtIHsKKyAgICBHMkRfQUxQSEFfQkxFTkRJTkdfTUlOICAgID0gMCwgICAvLyB3aG9sbHkgdHJhbnNwYXJlbnQKKyAgICBHMkRfQUxQSEFfQkxFTkRJTkdfTUFYICAgID0gMjU1LCAvLyAyNTUKKyAgICBHMkRfQUxQSEFfQkxFTkRJTkdfT1BBUVVFID0gMjU2LCAvLyBvcGFxdWUKK30gRzJEX0FMUEhBX0JMRU5ESU5HX01PREU7CisKK3R5cGVkZWYgZW51bSB7CisgICAgRzJEX0NPTE9SS0VZX05PTkUgPSAwLAorICAgIEcyRF9DT0xPUktFWV9TUkNfT04sCisgICAgRzJEX0NPTE9SS0VZX0RTVF9PTiwKKyAgICBHMkRfQ09MT1JLRVlfU1JDX0RTVF9PTiwKK30gRzJEX0NPTE9SS0VZX01PREU7CisKK3R5cGVkZWYgZW51bSB7CisgICAgRzJEX0JMVUVfU0NSRUVOX05PTkUgPSAwLAorICAgIEcyRF9CTFVFX1NDUkVFTl9UUkFOU1BBUkVOVCwKKyAgICBHMkRfQkxVRV9TQ1JFRU5fV0lUSF9DT0xPUiwKK30gRzJEX0JMVUVfU0NSRUVOX01PREU7CisKK3R5cGVkZWYgZW51bSB7CisgICAgRzJEX1JPUF9TUkMgPSAwLAorICAgIEcyRF9ST1BfRFNULAorICAgIEcyRF9ST1BfU1JDX0FORF9EU1QsCisgICAgRzJEX1JPUF9TUkNfT1JfRFNULAorICAgIEcyRF9ST1BfM1JEX09QUk5ELAorICAgIEcyRF9ST1BfU1JDX0FORF8zUkRfT1BSTkQsCisgICAgRzJEX1JPUF9TUkNfT1JfM1JEX09QUk5ELAorICAgIEcyRF9ST1BfU1JDX1hPUl8zUkRfT1BSTkQsCisgICAgRzJEX1JPUF9EU1RfT1JfM1JELAorfSBHMkRfUk9QX1RZUEU7CisKK3R5cGVkZWYgZW51bSB7CisgICAgRzJEX1RISVJEX09QX05PTkUgPSAwLAorICAgIEcyRF9USElSRF9PUF9QQVRURVJOLAorICAgIEcyRF9USElSRF9PUF9GRywKKyAgICBHMkRfVEhJUkRfT1BfQkcKK30gRzJEX1RISVJEX09QX01PREU7CisKK3R5cGVkZWYgZW51bSB7CisgICAgRzJEX0JMQUNLID0gMCwKKyAgICBHMkRfUkVELAorICAgIEcyRF9HUkVFTiwKKyAgICBHMkRfQkxVRSwKKyAgICBHMkRfV0hJVEUsCisgICAgRzJEX1lFTExPVywKKyAgICBHMkRfQ1lBTiwKKyAgICBHMkRfTUFHRU5UQQorfSBHMkRfQ09MT1I7CisKK3R5cGVkZWYgZW51bSB7CisgICAgRzJEX1JHQl81NjUgPSAoKDA8PDQpfDIpLAorCisgICAgRzJEX0FCR1JfODg4OCA9ICgoMjw8NCl8MSksCisgICAgRzJEX0JHUkFfODg4OCA9ICgoMzw8NCl8MSksCisgICAgRzJEX0FSR0JfODg4OCA9ICgoMDw8NCl8MSksCisgICAgRzJEX1JHQkFfODg4OCA9ICgoMTw8NCl8MSksCisKKyAgICBHMkRfWEJHUl84ODg4ID0gKCgyPDw0KXwwKSwKKyAgICBHMkRfQkdSWF84ODg4ID0gKCgzPDw0KXwwKSwKKyAgICBHMkRfWFJHQl84ODg4ID0gKCgwPDw0KXwwKSwKKyAgICBHMkRfUkdCWF84ODg4ID0gKCgxPDw0KXwwKSwKKworICAgIEcyRF9BQkdSXzE1NTUgPSAoKDI8PDQpfDQpLAorICAgIEcyRF9CR1JBXzU1NTEgPSAoKDM8PDQpfDQpLAorICAgIEcyRF9BUkdCXzE1NTUgPSAoKDA8PDQpfDQpLAorICAgIEcyRF9SR0JBXzU1NTEgPSAoKDE8PDQpfDQpLAorCisgICAgRzJEX1hCR1JfMTU1NSA9ICgoMjw8NCl8MyksCisgICAgRzJEX0JHUlhfNTU1MSA9ICgoMzw8NCl8MyksCisgICAgRzJEX1hSR0JfMTU1NSA9ICgoMDw8NCl8MyksCisgICAgRzJEX1JHQlhfNTU1MSA9ICgoMTw8NCl8MyksCisKKyAgICBHMkRfQUJHUl80NDQ0ID0gKCgyPDw0KXw2KSwKKyAgICBHMkRfQkdSQV80NDQ0ID0gKCgzPDw0KXw2KSwKKyAgICBHMkRfQVJHQl80NDQ0ID0gKCgwPDw0KXw2KSwKKyAgICBHMkRfUkdCQV80NDQ0ID0gKCgxPDw0KXw2KSwKKworICAgIEcyRF9YQkdSXzQ0NDQgPSAoKDI8PDQpfDUpLAorICAgIEcyRF9CR1JYXzQ0NDQgPSAoKDM8PDQpfDUpLAorICAgIEcyRF9YUkdCXzQ0NDQgPSAoKDA8PDQpfDUpLAorICAgIEcyRF9SR0JYXzQ0NDQgPSAoKDE8PDQpfDUpLAorCisgICAgRzJEX1BBQ0tFRF9CR1JfODg4ID0gKCgyPDw0KXw3KSwKKyAgICBHMkRfUEFDS0VEX1JHQl84ODggPSAoKDA8PDQpfDcpLAorCisgICAgRzJEX01BWF9DT0xPUl9TUEFDRQorfSBHMkRfQ09MT1JfU1BBQ0U7CisKK3R5cGVkZWYgZW51bSB7CisgICAgRzJEX0NsZWFyX01vZGUsICAgIC8vITwgWzAsIDBdCisgICAgRzJEX1NyY19Nb2RlLCAgICAgIC8vITwgW1NhLCBTY10KKyAgICBHMkRfRHN0X01vZGUsICAgICAgLy8hPCBbRGEsIERjXQorICAgIEcyRF9TcmNPdmVyX01vZGUsICAvLyE8IFtTYSArIERhIC0gU2EqRGEsIFJjID0gU2MgKyAoMSAtIFNhKSpEY10KKyAgICBHMkRfRHN0T3Zlcl9Nb2RlLCAgLy8hPCBbU2EgKyBEYSAtIFNhKkRhLCBSYyA9IERjICsgKDEgLSBEYSkqU2NdCisgICAgRzJEX1NyY0luX01vZGUsICAgIC8vITwgW1NhICogRGEsIFNjICogRGFdCisgICAgRzJEX0RzdEluX01vZGUsICAgIC8vITwgW1NhICogRGEsIFNhICogRGNdCisgICAgRzJEX1NyY091dF9Nb2RlLCAgIC8vITwgW1NhICogKDEgLSBEYSksIFNjICogKDEgLSBEYSldCisgICAgRzJEX0RzdE91dF9Nb2RlLCAgIC8vITwgW0RhICogKDEgLSBTYSksIERjICogKDEgLSBTYSldCisgICAgRzJEX1NyY0FUb3BfTW9kZSwgIC8vITwgW0RhLCBTYyAqIERhICsgKDEgLSBTYSkgKiBEY10KKyAgICBHMkRfRHN0QVRvcF9Nb2RlLCAgLy8hPCBbU2EsIFNhICogRGMgKyBTYyAqICgxIC0gRGEpXQorICAgIEcyRF9Yb3JfTW9kZSwgICAgICAvLyE8IFtTYSArIERhIC0gMiAqIFNhICogRGEsIFNjICogKDEgLSBEYSkgKyAoMSAtIFNhKSAqIERjXQorCisgICAgLy8gdGhlc2UgbW9kZXMgYXJlIGRlZmluZWQgaW4gdGhlIFNWRyBDb21wb3NpdGluZyBzdGFuZGFyZAorICAgIC8vIGh0dHA6Ly93d3cudzMub3JnL1RSLzIwMDkvV0QtU1ZHQ29tcG9zaXRpbmctMjAwOTA0MzAvCisgICAgRzJEX1BsdXNfTW9kZSwKKyAgICBHMkRfTXVsdGlwbHlfTW9kZSwKKyAgICBHMkRfU2NyZWVuX01vZGUsCisgICAgRzJEX092ZXJsYXlfTW9kZSwKKyAgICBHMkRfRGFya2VuX01vZGUsCisgICAgRzJEX0xpZ2h0ZW5fTW9kZSwKKyAgICBHMkRfQ29sb3JEb2RnZV9Nb2RlLAorICAgIEcyRF9Db2xvckJ1cm5fTW9kZSwKKyAgICBHMkRfSGFyZExpZ2h0X01vZGUsCisgICAgRzJEX1NvZnRMaWdodF9Nb2RlLAorICAgIEcyRF9EaWZmZXJlbmNlX01vZGUsCisgICAgRzJEX0V4Y2x1c2lvbl9Nb2RlLAorCisgICAga0xhc3RNb2RlID0gRzJEX0V4Y2x1c2lvbl9Nb2RlCit9IEcyRF9QT1JUVEVSRFVGRl9NT0RFOworCit0eXBlZGVmIGVudW0geworICAgICAgIEcyRF9NRU1PUllfS0VSTkVMLAorICAgICAgIEcyRF9NRU1PUllfVVNFUgorfSBHMkRfTUVNT1JZX1RZUEU7CisKK3R5cGVkZWYgc3RydWN0IHsKKyAgICBpbnQgICAgeDsKKyAgICBpbnQgICAgeTsKKyAgICB1bnNpZ25lZCBpbnQgICAgdzsKKyAgICB1bnNpZ25lZCBpbnQgICAgaDsKKyAgICB1bnNpZ25lZCBpbnQgICAgZnVsbF93OworICAgIHVuc2lnbmVkIGludCAgICBmdWxsX2g7CisgICAgaW50ICAgICAgICAgICAgIGNvbG9yX2Zvcm1hdDsKKyAgICB1bnNpZ25lZCBpbnQgICAgYnl0ZXNfcGVyX3BpeGVsOworICAgIHVuc2lnbmVkIGNoYXIgKiBhZGRyOworfSBnMmRfcmVjdDsKKwordHlwZWRlZiBzdHJ1Y3QgeworICAgIHVuc2lnbmVkIGludCAgICByb3RhdGVfdmFsOworICAgIHVuc2lnbmVkIGludCAgICBhbHBoYV92YWw7CisKKyAgICB1bnNpZ25lZCBpbnQgICAgYmx1ZV9zY3JlZW5fbW9kZTsgICAgIC8vdHJ1ZSA6IGVuYWJsZSwgZmFsc2UgOiBkaXNhYmxlCisgICAgdW5zaWduZWQgaW50ICAgIGNvbG9yX2tleV92YWw7ICAgICAgICAvL3NjcmVlbiBjb2xvciB2YWx1ZQorICAgIHVuc2lnbmVkIGludCAgICBjb2xvcl9zd2l0Y2hfdmFsOyAgICAgLy9vbmUgY29sb3IKKworICAgIHVuc2lnbmVkIGludCAgICBzcmNfY29sb3I7ICAgICAgICAgICAgLy8gd2hlbiBzZXQgb25lIGNvbG9yIG9uIFNSQworCisgICAgdW5zaWduZWQgaW50ICAgIHRoaXJkX29wX21vZGU7CisgICAgdW5zaWduZWQgaW50ICAgIHJvcF9tb2RlOworICAgIHVuc2lnbmVkIGludCAgICBtYXNrX21vZGU7CisgICAgdW5zaWduZWQgaW50ICAgIHJlbmRlcl9tb2RlOworICAgIHVuc2lnbmVkIGludCAgICBwb3R0ZXJkdWZmX21vZGU7CisgICAgICAgIHVuc2lnbmVkIGludCAgICBtZW1vcnlfdHlwZTsKK30gZzJkX2ZsYWc7CisKK3R5cGVkZWYgc3RydWN0IHsKKyAgICB1bnNpZ25lZCBpbnQgICAgdDsKKyAgICB1bnNpZ25lZCBpbnQgICAgYjsKKyAgICB1bnNpZ25lZCBpbnQgICAgbDsKKyAgICB1bnNpZ25lZCBpbnQgICAgcjsKK30gZzJkX2NsaXA7CisKK3R5cGVkZWYgc3RydWN0IHsKKyAgICBnMmRfcmVjdCBzcmNfcmVjdDsKKyAgICBnMmRfcmVjdCBkc3RfcmVjdDsKKyAgICBnMmRfY2xpcCBjbGlwOworICAgIGcyZF9mbGFnIGZsYWc7Cit9IGcyZF9wYXJhbXM7CisKK3N0cnVjdCBnMmRfZG1hX2luZm8geworICAgIHVuc2lnbmVkIGxvbmcgYWRkcjsKKyAgICB1bnNpZ25lZCBpbnQgIHNpemU7Cit9OworCit0eXBlZGVmIHN0cnVjdCBfc2VjX2cyZF90IHsKKyAgICBpbnQgZGV2X2ZkOworICAgIGcyZF9wYXJhbXMgIHBhcmFtczsKK31zZWNfZzJkX3Q7CisKK3R5cGVkZWYgc3RydWN0IF9fczVwX3JlY3QgeworICAgIHVpbnQzMl90IHg7CisgICAgdWludDMyX3QgeTsKKyAgICB1aW50MzJfdCB3OworICAgIHVpbnQzMl90IGg7Cit9IF9fczVwX3JlY3Q7CisKK3R5cGVkZWYgc3RydWN0IF9fczVwX2ltZyB7CisgICAgdWludDMyX3Qgd2lkdGg7CisgICAgdWludDMyX3QgaGVpZ2h0OworICAgIHVpbnQzMl90IGZvcm1hdDsKKyAgICB1aW50MzJfdCBvZmZzZXQ7CisgICAgdWludDMyX3QgYmFzZTsKKyAgICBpbnQgbWVtb3J5X2lkOworfSBfX3M1cF9pbWc7CisKKyNlbmRpZiAvKl9TRUNfRzJEX0RSSVZFUl9IXyovCmRpZmYgLS1naXQgYS9leHlub3M0L2hhbC9pbmNsdWRlL3NlY191dGlscy5oIGIvZXh5bm9zNC9oYWwvaW5jbHVkZS9zZWNfdXRpbHMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41NTgwOGY0Ci0tLSAvZGV2L251bGwKKysrIGIvZXh5bm9zNC9oYWwvaW5jbHVkZS9zZWNfdXRpbHMuaApAQCAtMCwwICsxLDI5OCBAQAorLyoKKyAqIENvcHlyaWdodEAgU2Ftc3VuZyBFbGVjdHJvbmljcyBDby4gTFRECisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorKi8KKworI2lmbmRlZiBfX1NBTVNVTkdfU1lTTFNJX1NFQ19DT01NT05fSF9fCisjZGVmaW5lIF9fU0FNU1VOR19TWVNMU0lfU0VDX0NPTU1PTl9IX18KKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0vLworLy8gSW5jbHVkZQorLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0vLworCisjaW5jbHVkZSA8aGFyZHdhcmUvaGFyZHdhcmUuaD4KKyNpbmNsdWRlICJzZWNfZm9ybWF0LmgiCisKKyNpZmRlZiBfX2NwbHVzcGx1cworZXh0ZXJuICJDIiB7CisjZW5kaWYKKworI2luY2x1ZGUgPGxpbnV4L3ZpZGVvZGV2Mi5oPgorI2luY2x1ZGUgInZpZGVvZGV2Ml9zYW1zdW5nLmgiCisKKyNpZmRlZiBfX2NwbHVzcGx1cworfQorI2VuZGlmCisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLy8KKy8vIENvbW1vbiBzdHJ1Y3R1cmUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8KKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLy8KK3N0cnVjdCBBRERSUyB7CisgICAgdW5zaWduZWQgaW50IGFkZHJfeTsKKyAgICB1bnNpZ25lZCBpbnQgYWRkcl9jYmNyOworICAgIHVuc2lnbmVkIGludCBidWZfaWR4OworICAgIHVuc2lnbmVkIGludCByZXNlcnZlZDsKK307CisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLy8KKy8vIENvbW1vbiBmdW5jdGlvbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8KKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLy8KK2lubGluZSBpbnQgSEFMX1BJWEVMX0ZPUk1BVF8yX1Y0TDJfUElYKGludCBIQUxfUElYRUxfRk9STUFUKQoreworICAgIGludCBWNEwyX1BJWCA9IC0xOworCisgICAgc3dpdGNoIChIQUxfUElYRUxfRk9STUFUKSB7CisgICAgY2FzZSBIQUxfUElYRUxfRk9STUFUX1JHQkFfODg4ODoKKyAgICBjYXNlIEhBTF9QSVhFTF9GT1JNQVRfUkdCWF84ODg4OgorICAgICAgICBWNEwyX1BJWCA9IFY0TDJfUElYX0ZNVF9SR0IzMjsKKyAgICAgICAgYnJlYWs7CisKKyAgICBjYXNlIEhBTF9QSVhFTF9GT1JNQVRfUkdCXzg4ODoKKyAgICAgICAgVjRMMl9QSVggPSBWNEwyX1BJWF9GTVRfUkdCMjQ7CisgICAgICAgIGJyZWFrOworCisgICAgY2FzZSBIQUxfUElYRUxfRk9STUFUX1JHQl81NjU6CisgICAgICAgIFY0TDJfUElYID0gVjRMMl9QSVhfRk1UX1JHQjU2NTsKKyAgICAgICAgYnJlYWs7CisKKyAgICBjYXNlIEhBTF9QSVhFTF9GT1JNQVRfQkdSQV84ODg4OgorICAgICAgICBWNEwyX1BJWCA9IFY0TDJfUElYX0ZNVF9SR0IzMjsKKyAgICAgICAgYnJlYWs7CisKKyAgICBjYXNlIEhBTF9QSVhFTF9GT1JNQVRfUkdCQV81NTUxOgorICAgICAgICBWNEwyX1BJWCA9IFY0TDJfUElYX0ZNVF9SR0I1NTVYOworICAgICAgICBicmVhazsKKworICAgIGNhc2UgSEFMX1BJWEVMX0ZPUk1BVF9SR0JBXzQ0NDQ6CisgICAgICAgIFY0TDJfUElYID0gVjRMMl9QSVhfRk1UX1JHQjQ0NDsKKyAgICAgICAgYnJlYWs7CisKKyAgICBjYXNlIEhBTF9QSVhFTF9GT1JNQVRfWVYxMjoKKyAgICBjYXNlIEhBTF9QSVhFTF9GT1JNQVRfWUNiQ3JfNDIwX1A6CisgICAgICAgIFY0TDJfUElYID0gVjRMMl9QSVhfRk1UX1lVVjQyMDsKKyAgICAgICAgYnJlYWs7CisKKyAgICBjYXNlIEhBTF9QSVhFTF9GT1JNQVRfWUNiQ3JfNDIyX1NQOgorICAgIGNhc2UgSEFMX1BJWEVMX0ZPUk1BVF9DVVNUT01fWUNiQ3JfNDIyX1NQOgorICAgICAgICBWNEwyX1BJWCA9IFY0TDJfUElYX0ZNVF9OVjYxOworICAgICAgICBicmVhazsKKworICAgIGNhc2UgSEFMX1BJWEVMX0ZPUk1BVF9ZQ2JDcl80MjBfU1A6CisgICAgY2FzZSBIQUxfUElYRUxfRk9STUFUX0NVU1RPTV9ZQ2JDcl80MjBfU1A6CisgICAgICAgIFY0TDJfUElYID0gVjRMMl9QSVhfRk1UX05WMTI7CisgICAgICAgIGJyZWFrOworCisgICAgY2FzZSBIQUxfUElYRUxfRk9STUFUX1lDYkNyXzQyMl9JOgorICAgIGNhc2UgSEFMX1BJWEVMX0ZPUk1BVF9DVVNUT01fWUNiQ3JfNDIyX0k6CisgICAgICAgIFY0TDJfUElYID0gVjRMMl9QSVhfRk1UX1lVWVY7CisgICAgICAgIGJyZWFrOworCisgICAgY2FzZSBIQUxfUElYRUxfRk9STUFUX1lDYkNyXzQyMl9QOgorICAgICAgICBWNEwyX1BJWCA9IFY0TDJfUElYX0ZNVF9ZVVY0MjJQOworICAgICAgICBicmVhazsKKworICAgIGNhc2UgSEFMX1BJWEVMX0ZPUk1BVF9DYllDcllfNDIyX0k6CisgICAgY2FzZSBIQUxfUElYRUxfRk9STUFUX0NVU1RPTV9DYllDcllfNDIyX0k6CisgICAgICAgIFY0TDJfUElYID0gVjRMMl9QSVhfRk1UX1VZVlk7CisgICAgICAgIGJyZWFrOworCisgICAgY2FzZSBIQUxfUElYRUxfRk9STUFUX1lDckNiXzQyMl9TUDoKKyAgICBjYXNlIEhBTF9QSVhFTF9GT1JNQVRfQ1VTVE9NX1lDckNiXzQyMl9TUDoKKyAgICAgICAgVjRMMl9QSVggPSBWNEwyX1BJWF9GTVRfTlYxNjsKKyAgICAgICAgYnJlYWs7CisKKyAgICBjYXNlIEhBTF9QSVhFTF9GT1JNQVRfWUNyQ2JfNDIwX1NQOgorICAgIGNhc2UgSEFMX1BJWEVMX0ZPUk1BVF9DVVNUT01fWUNyQ2JfNDIwX1NQOgorICAgICAgICBWNEwyX1BJWCA9IFY0TDJfUElYX0ZNVF9OVjIxOworICAgICAgICBicmVhazsKKworICAgIGNhc2UgSEFMX1BJWEVMX0ZPUk1BVF9DVVNUT01fWUNiQ3JfNDIwX1NQX1RJTEVEOgorICAgICAgICBWNEwyX1BJWCA9IFY0TDJfUElYX0ZNVF9OVjEyVDsKKyAgICAgICAgYnJlYWs7CisKKyAgIGNhc2UgSEFMX1BJWEVMX0ZPUk1BVF9DVVNUT01fWUNyQ2JfNDIyX0k6CisgICAgICAgIFY0TDJfUElYID0gVjRMMl9QSVhfRk1UX1lWWVU7CisgICAgICAgIGJyZWFrOworCisgICBjYXNlIEhBTF9QSVhFTF9GT1JNQVRfQ1VTVE9NX0NyWUNiWV80MjJfSToKKyAgICAgICAgVjRMMl9QSVggPSBWNEwyX1BJWF9GTVRfVllVWTsKKyAgICAgICAgYnJlYWs7CisKKyAgICBkZWZhdWx0OgorICAgICAgICBMT0dFKCIlczo6dW5tYXRjaGVkIEhBTF9QSVhFTF9GT1JNQVQgY29sb3Jfc3BhY2UoMHgleClcbiIsCisgICAgICAgICAgICAgICAgX19mdW5jX18sIEhBTF9QSVhFTF9GT1JNQVQpOworICAgICAgICBicmVhazsKKyAgICB9CisKKyAgICByZXR1cm4gVjRMMl9QSVg7Cit9CisKK2lubGluZSBpbnQgVjRMMl9QSVhfMl9IQUxfUElYRUxfRk9STUFUKGludCBWNEwyX1BJWCkKK3sKKyAgICBpbnQgSEFMX1BJWEVMX0ZPUk1BVCA9IC0xOworCisgICAgc3dpdGNoIChWNEwyX1BJWCkgeworICAgIGNhc2UgVjRMMl9QSVhfRk1UX1JHQjMyOgorICAgICAgICBIQUxfUElYRUxfRk9STUFUID0gSEFMX1BJWEVMX0ZPUk1BVF9SR0JBXzg4ODg7CisgICAgICAgIGJyZWFrOworCisgICAgY2FzZSBWNEwyX1BJWF9GTVRfUkdCMjQ6CisgICAgICAgIEhBTF9QSVhFTF9GT1JNQVQgPSBIQUxfUElYRUxfRk9STUFUX1JHQl84ODg7CisgICAgICAgIGJyZWFrOworCisgICAgY2FzZSBWNEwyX1BJWF9GTVRfUkdCNTY1OgorICAgICAgICBIQUxfUElYRUxfRk9STUFUID0gSEFMX1BJWEVMX0ZPUk1BVF9SR0JfNTY1OworICAgICAgICBicmVhazsKKworICAgIGNhc2UgVjRMMl9QSVhfRk1UX0JHUjMyOgorICAgICAgICBIQUxfUElYRUxfRk9STUFUID0gSEFMX1BJWEVMX0ZPUk1BVF9CR1JBXzg4ODg7CisgICAgICAgIGJyZWFrOworCisgICAgY2FzZSBWNEwyX1BJWF9GTVRfUkdCNTU1WDoKKyAgICAgICAgSEFMX1BJWEVMX0ZPUk1BVCA9IEhBTF9QSVhFTF9GT1JNQVRfUkdCQV81NTUxOworICAgICAgICBicmVhazsKKworICAgIGNhc2UgVjRMMl9QSVhfRk1UX1JHQjQ0NDoKKyAgICAgICAgSEFMX1BJWEVMX0ZPUk1BVCA9IEhBTF9QSVhFTF9GT1JNQVRfUkdCQV80NDQ0OworICAgICAgICBicmVhazsKKworICAgIGNhc2UgVjRMMl9QSVhfRk1UX1lVVjQyMDoKKyAgICAgICAgSEFMX1BJWEVMX0ZPUk1BVCA9IEhBTF9QSVhFTF9GT1JNQVRfWUNiQ3JfNDIwX1A7CisgICAgICAgIGJyZWFrOworCisgICAgY2FzZSBWNEwyX1BJWF9GTVRfTlYxNjoKKyAgICAgICAgSEFMX1BJWEVMX0ZPUk1BVCA9IEhBTF9QSVhFTF9GT1JNQVRfQ1VTVE9NX1lDckNiXzQyMl9TUDsKKyAgICAgICAgYnJlYWs7CisKKyAgICBjYXNlIFY0TDJfUElYX0ZNVF9OVjEyOgorICAgICAgICBIQUxfUElYRUxfRk9STUFUID0gSEFMX1BJWEVMX0ZPUk1BVF9DVVNUT01fWUNiQ3JfNDIwX1NQOworICAgICAgICBicmVhazsKKworICAgIGNhc2UgVjRMMl9QSVhfRk1UX1lVWVY6CisgICAgICAgIEhBTF9QSVhFTF9GT1JNQVQgPSBIQUxfUElYRUxfRk9STUFUX0NVU1RPTV9ZQ2JDcl80MjJfSTsKKyAgICAgICAgYnJlYWs7CisKKyAgICBjYXNlIFY0TDJfUElYX0ZNVF9ZVVY0MjJQOgorICAgICAgICBIQUxfUElYRUxfRk9STUFUID0gSEFMX1BJWEVMX0ZPUk1BVF9ZQ2JDcl80MjJfUDsKKyAgICAgICAgYnJlYWs7CisKKyAgICBjYXNlIFY0TDJfUElYX0ZNVF9VWVZZOgorICAgICAgICBIQUxfUElYRUxfRk9STUFUID0gSEFMX1BJWEVMX0ZPUk1BVF9DVVNUT01fQ2JZQ3JZXzQyMl9JOworICAgICAgICBicmVhazsKKworICAgIGNhc2UgVjRMMl9QSVhfRk1UX05WMjE6CisgICAgICAgIEhBTF9QSVhFTF9GT1JNQVQgPSBIQUxfUElYRUxfRk9STUFUX0NVU1RPTV9ZQ3JDYl80MjBfU1A7CisgICAgICAgIGJyZWFrOworCisgICAgY2FzZSBWNEwyX1BJWF9GTVRfTlYxMlQ6CisgICAgICAgIEhBTF9QSVhFTF9GT1JNQVQgPSBIQUxfUElYRUxfRk9STUFUX0NVU1RPTV9ZQ2JDcl80MjBfU1BfVElMRUQ7CisgICAgICAgIGJyZWFrOworCisgICAgY2FzZSBWNEwyX1BJWF9GTVRfTlY2MToKKyAgICAgICAgSEFMX1BJWEVMX0ZPUk1BVCA9IEhBTF9QSVhFTF9GT1JNQVRfQ1VTVE9NX1lDYkNyXzQyMl9TUDsKKyAgICAgICAgYnJlYWs7CisKKyAgICBjYXNlIFY0TDJfUElYX0ZNVF9ZVllVOgorICAgICAgICBIQUxfUElYRUxfRk9STUFUID0gSEFMX1BJWEVMX0ZPUk1BVF9DVVNUT01fWUNyQ2JfNDIyX0k7CisgICAgICAgIGJyZWFrOworCisgICAgY2FzZSBWNEwyX1BJWF9GTVRfVllVWToKKyAgICAgICAgSEFMX1BJWEVMX0ZPUk1BVCA9IEhBTF9QSVhFTF9GT1JNQVRfQ1VTVE9NX0NyWUNiWV80MjJfSTsKKyAgICAgICAgYnJlYWs7CisKKyAgICBkZWZhdWx0OgorICAgICAgICBMT0dFKCIlczo6dW5tYXRjaGVkIFY0TDJfUElYIGNvbG9yX3NwYWNlKCVkKVxuIiwKKyAgICAgICAgICAgICAgICBfX2Z1bmNfXywgVjRMMl9QSVgpOworICAgICAgICBicmVhazsKKyAgICB9CisKKyAgICByZXR1cm4gSEFMX1BJWEVMX0ZPUk1BVDsKK30KKworI2RlZmluZSBBTElHTl9UT18zMkIoeCkgICAoKCgoeCkgKyAoMSA8PCAgNSkgLSAxKSA+PiAgNSkgPDwgIDUpCisjZGVmaW5lIEFMSUdOX1RPXzEyOEIoeCkgICgoKCh4KSArICgxIDw8ICA3KSAtIDEpID4+ICA3KSA8PCAgNykKKyNkZWZpbmUgQUxJR05fVE9fOEtCKHgpICAgKCgoKHgpICsgKDEgPDwgMTMpIC0gMSkgPj4gMTMpIDw8IDEzKQorCisjZGVmaW5lIEdFVF8zMkJQUF9GUkFNRV9TSVpFKHcsIGgpICAoKCh3KSAqIChoKSkgPDwgMikKKyNkZWZpbmUgR0VUXzI0QlBQX0ZSQU1FX1NJWkUodywgaCkgICgoKHcpICogKGgpKSAqIDMpCisjZGVmaW5lIEdFVF8xNkJQUF9GUkFNRV9TSVpFKHcsIGgpICAoKCh3KSAqIChoKSkgPDwgMSkKKworaW5saW5lIHVuc2lnbmVkIGludCBGUkFNRV9TSVpFKGludCBIQUxfUElYRUxfRk9STUFULCBpbnQgdywgaW50IGgpCit7CisgICAgdW5zaWduZWQgaW50IGZyYW1lX3NpemUgPSAwOworICAgIHVuc2lnbmVkIGludCBzaXplICAgICAgID0gMDsKKworICAgIHN3aXRjaCAoSEFMX1BJWEVMX0ZPUk1BVCkgeworICAgIC8vIDE2YnBwCisgICAgY2FzZSBIQUxfUElYRUxfRk9STUFUX1JHQl81NjU6CisgICAgY2FzZSBIQUxfUElYRUxfRk9STUFUX1JHQkFfNTU1MToKKyAgICBjYXNlIEhBTF9QSVhFTF9GT1JNQVRfUkdCQV80NDQ0OgorICAgICAgICBmcmFtZV9zaXplID0gR0VUXzE2QlBQX0ZSQU1FX1NJWkUodywgaCk7CisgICAgICAgIGJyZWFrOworCisgICAgLy8gMjRicHAKKyAgICBjYXNlIEhBTF9QSVhFTF9GT1JNQVRfUkdCXzg4ODoKKyAgICAgICAgZnJhbWVfc2l6ZSA9IEdFVF8yNEJQUF9GUkFNRV9TSVpFKHcsIGgpOworICAgICAgICBicmVhazsKKworICAgIC8vIDMyYnBwCisgICAgY2FzZSBIQUxfUElYRUxfRk9STUFUX1JHQkFfODg4ODoKKyAgICBjYXNlIEhBTF9QSVhFTF9GT1JNQVRfQkdSQV84ODg4OgorICAgIGNhc2UgSEFMX1BJWEVMX0ZPUk1BVF9SR0JYXzg4ODg6CisgICAgICAgIGZyYW1lX3NpemUgPSBHRVRfMzJCUFBfRlJBTUVfU0laRSh3LCBoKTsKKyAgICAgICAgYnJlYWs7CisKKyAgICAvLyAxMmJwcAorICAgIGNhc2UgSEFMX1BJWEVMX0ZPUk1BVF9ZVjEyOgorICAgIGNhc2UgSEFMX1BJWEVMX0ZPUk1BVF9ZQ3JDYl80MjBfU1A6CisgICAgY2FzZSBIQUxfUElYRUxfRk9STUFUX1lDYkNyXzQyMF9QOgorICAgIGNhc2UgSEFMX1BJWEVMX0ZPUk1BVF9ZQ2JDcl80MjBfSToKKyAgICBjYXNlIEhBTF9QSVhFTF9GT1JNQVRfQ2JZQ3JZXzQyMF9JOgorICAgIGNhc2UgSEFMX1BJWEVMX0ZPUk1BVF9ZQ2JDcl80MjBfU1A6CisgICAgY2FzZSBIQUxfUElYRUxfRk9STUFUX0NVU1RPTV9ZQ2JDcl80MjBfU1A6CisgICAgY2FzZSBIQUxfUElYRUxfRk9STUFUX0NVU1RPTV9ZQ3JDYl80MjBfU1A6CisgICAgICAgIHNpemUgPSB3ICogaDsKKyAgICAgICAgZnJhbWVfc2l6ZSA9IHNpemUgKyAoKHNpemUgPj4gMikgPDwgMSk7CisgICAgICAgIGJyZWFrOworCisgICAgY2FzZSBIQUxfUElYRUxfRk9STUFUX0NVU1RPTV9ZQ2JDcl80MjBfU1BfVElMRUQ6CisgICAgICAgIGZyYW1lX3NpemUgPSAgIEFMSUdOX1RPXzhLQihBTElHTl9UT18xMjhCKHcpICogQUxJR05fVE9fMzJCKGgpKQorICAgICAgICAgICAgICAgICAgICAgKyBBTElHTl9UT184S0IoQUxJR05fVE9fMTI4Qih3KSAqIEFMSUdOX1RPXzMyQihoID4+IDEpKTsKKyAgICAgICAgYnJlYWs7CisKKyAgICAvLyAxNmJwcAorICAgIGNhc2UgSEFMX1BJWEVMX0ZPUk1BVF9ZQ2JDcl80MjJfU1A6CisgICAgY2FzZSBIQUxfUElYRUxfRk9STUFUX1lDYkNyXzQyMl9JOgorICAgIGNhc2UgSEFMX1BJWEVMX0ZPUk1BVF9ZQ2JDcl80MjJfUDoKKyAgICBjYXNlIEhBTF9QSVhFTF9GT1JNQVRfQ2JZQ3JZXzQyMl9JOgorICAgIGNhc2UgSEFMX1BJWEVMX0ZPUk1BVF9ZQ3JDYl80MjJfU1A6CisgICAgY2FzZSBIQUxfUElYRUxfRk9STUFUX0NVU1RPTV9ZQ2JDcl80MjJfU1A6CisgICAgY2FzZSBIQUxfUElYRUxfRk9STUFUX0NVU1RPTV9ZQ3JDYl80MjJfU1A6CisgICAgY2FzZSBIQUxfUElYRUxfRk9STUFUX0NVU1RPTV9ZQ2JDcl80MjJfSToKKyAgICBjYXNlIEhBTF9QSVhFTF9GT1JNQVRfQ1VTVE9NX1lDckNiXzQyMl9JOgorICAgIGNhc2UgSEFMX1BJWEVMX0ZPUk1BVF9DVVNUT01fQ2JZQ3JZXzQyMl9JOgorICAgIGNhc2UgSEFMX1BJWEVMX0ZPUk1BVF9DVVNUT01fQ3JZQ2JZXzQyMl9JOgorICAgICAgICBmcmFtZV9zaXplID0gR0VUXzE2QlBQX0ZSQU1FX1NJWkUodywgaCk7CisgICAgICAgIGJyZWFrOworCisgICAgZGVmYXVsdDoKKyAgICAgICAgTE9HRCgiJXM6Om5vIG1hdGNoaW5nIHNvdXJjZSBjb2xvcmZvcm1hdCgweCV4KSwgdyglZCksIGgoJWQpIGZhaWxcbiIsCisgICAgICAgICAgICAgICAgX19mdW5jX18sIEhBTF9QSVhFTF9GT1JNQVQsIHcsIGgpOworICAgICAgICBicmVhazsKKyAgICB9CisKKyAgICByZXR1cm4gZnJhbWVfc2l6ZTsKK30KKworI2VuZGlmIC8vX19TQU1TVU5HX1NZU0xTSV9TRUNfQ09NTU9OX0hfXwpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2V4eW5vczQvaGFsL2luY2x1ZGUvc2VjX3V0aWxzX3Y0bDIuaCBiL2V4eW5vczQvaGFsL2luY2x1ZGUvc2VjX3V0aWxzX3Y0bDIuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zYWE3YzM1Ci0tLSAvZGV2L251bGwKKysrIGIvZXh5bm9zNC9oYWwvaW5jbHVkZS9zZWNfdXRpbHNfdjRsMi5oCkBAIC0wLDAgKzEsMzI3IEBACisvKgorICogQ29weXJpZ2h0QCBTYW1zdW5nIEVsZWN0cm9uaWNzIENvLiBMVEQKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisqLworCisvKgorICogZmlsZSBzZWNfdXRpbHNfdjRsMi5oCisgKiBicmllZiBoZWFkZXIgZmlsZSBmb3Igc2VjX3V0aWxzX3Y0bDIuaAorICogYXV0aG9yIFNhbmd3b28sIFBhcmsoc3c1NzcxLnBhcmtAc2Ftc3VuZy5jb20pCisgKiBkYXRlIDIwMTEvMDYvMDIKKyAqCisgKiBSZXZpc2lvbiBIaXN0b3J5OgorICogLSAyMDEwLzA2LzAzIDogU2FuZ3dvbywgUGFyayhzdzU3NzEucGFya0BzYW1zdW5nLmNvbSkKKyAqIEluaXRpYWwgdmVyc2lvbgorICoKKyAqIC0gMjAxMS8xMi8wNyA6IEplb25naGVlLCBLaW0oamhoaGgua2ltQHNhbXN1bmcuY29tKQorICogdXNlIFY0TDJfUElYX0ZNVF9OVjEyTSBhcyBIQUxfUElYRUxfRk9STUFUX1lDYkNyXzQyMF9TUCwgSEFMX1BJWEVMX0ZPUk1BVF9DVVNUT01fWUNiQ3JfNDIwX1NQCisgKgorICogLSAyMDExLzEyLzA3IDogSHllb25teWVvbmcgQ2hvaSggaHllb24uY2hvaUBzYW1zdW5nLmNvbSkKKyAqIEFkZCBWNEwyX1BJWF9GTVRfWVZVNDIwTQorICoKKyAqLworCisKKyNpZm5kZWYgX19TQU1TVU5HX1NZU0xTSV9TRUNfQ09NTU9OX0hfXworI2RlZmluZSBfX1NBTVNVTkdfU1lTTFNJX1NFQ19DT01NT05fSF9fCisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLy8KKy8vIEluY2x1ZGUKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLy8KKworI2luY2x1ZGUgPGhhcmR3YXJlL2hhcmR3YXJlLmg+CisjaW5jbHVkZSAic2VjX2Zvcm1hdC5oIgorCisjaWZkZWYgX19jcGx1c3BsdXMKK2V4dGVybiAiQyIgeworI2VuZGlmCisKKyNpbmNsdWRlICJ2aWRlb2RldjIuaCIKKworI2lmZGVmIF9fY3BsdXNwbHVzCit9CisjZW5kaWYKKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0vLworLy8gQ29tbW9uIHN0cnVjdHVyZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0vLworc3RydWN0IEFERFJTIHsKKyAgICB1bnNpZ25lZCBpbnQgYWRkcl95OworICAgIHVuc2lnbmVkIGludCBhZGRyX2NiY3I7CisgICAgdW5zaWduZWQgaW50IGJ1Zl9pZHg7CisgICAgdW5zaWduZWQgaW50IHJlc2VydmVkOworfTsKKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0vLworLy8gQ29tbW9uIGZ1bmN0aW9uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0vLworaW5saW5lIGludCBIQUxfUElYRUxfRk9STUFUXzJfVjRMMl9QSVgoaW50IEhBTF9QSVhFTF9GT1JNQVQpCit7CisgICAgaW50IFY0TDJfUElYID0gLTE7CisKKyAgICBzd2l0Y2ggKEhBTF9QSVhFTF9GT1JNQVQpIHsKKyAgICBjYXNlIEhBTF9QSVhFTF9GT1JNQVRfUkdCQV84ODg4OgorICAgIGNhc2UgSEFMX1BJWEVMX0ZPUk1BVF9SR0JYXzg4ODg6CisgICAgICAgIFY0TDJfUElYID0gVjRMMl9QSVhfRk1UX1JHQjMyOworICAgICAgICBicmVhazsKKworICAgIGNhc2UgSEFMX1BJWEVMX0ZPUk1BVF9SR0JfODg4OgorICAgICAgICBWNEwyX1BJWCA9IFY0TDJfUElYX0ZNVF9SR0IyNDsKKyAgICAgICAgYnJlYWs7CisKKyAgICBjYXNlIEhBTF9QSVhFTF9GT1JNQVRfUkdCXzU2NToKKyAgICAgICAgVjRMMl9QSVggPSBWNEwyX1BJWF9GTVRfUkdCNTY1OworICAgICAgICBicmVhazsKKworICAgIGNhc2UgSEFMX1BJWEVMX0ZPUk1BVF9CR1JBXzg4ODg6CisjaWYgZGVmaW5lZChCT0FSRF9VU0VfVjRMMikKKyAgICAgICAgVjRMMl9QSVggPSBWNEwyX1BJWF9GTVRfQkdSMzI7CisjZWxzZQorICAgICAgICBWNEwyX1BJWCA9IFY0TDJfUElYX0ZNVF9SR0IzMjsKKyNlbmRpZgorICAgICAgICBicmVhazsKKworICAgIGNhc2UgSEFMX1BJWEVMX0ZPUk1BVF9SR0JBXzU1NTE6CisgICAgICAgIFY0TDJfUElYID0gVjRMMl9QSVhfRk1UX1JHQjU1NVg7CisgICAgICAgIGJyZWFrOworCisgICAgY2FzZSBIQUxfUElYRUxfRk9STUFUX1JHQkFfNDQ0NDoKKyAgICAgICAgVjRMMl9QSVggPSBWNEwyX1BJWF9GTVRfUkdCNDQ0OworICAgICAgICBicmVhazsKKworICAgIGNhc2UgSEFMX1BJWEVMX0ZPUk1BVF9ZVjEyOgorICAgIGNhc2UgSEFMX1BJWEVMX0ZPUk1BVF9ZQ2JDcl80MjBfUDoKKyAgICAgICAgVjRMMl9QSVggPSBWNEwyX1BJWF9GTVRfWVVWNDIwTTsKKyAgICAgICAgYnJlYWs7CisKKyAgICBjYXNlIEhBTF9QSVhFTF9GT1JNQVRfWUNiQ3JfNDIyX1NQOgorICAgIGNhc2UgSEFMX1BJWEVMX0ZPUk1BVF9DVVNUT01fWUNiQ3JfNDIyX1NQOgorICAgICAgICBWNEwyX1BJWCA9IFY0TDJfUElYX0ZNVF9OVjYxOworICAgICAgICBicmVhazsKKworICAgIGNhc2UgSEFMX1BJWEVMX0ZPUk1BVF9ZQ2JDcl80MjBfU1A6CisgICAgY2FzZSBIQUxfUElYRUxfRk9STUFUX0NVU1RPTV9ZQ2JDcl80MjBfU1A6CisgICAgICAgIFY0TDJfUElYID0gVjRMMl9QSVhfRk1UX05WMTJNOworICAgICAgICBicmVhazsKKworICAgIGNhc2UgSEFMX1BJWEVMX0ZPUk1BVF9ZQ2JDcl80MjJfSToKKyAgICBjYXNlIEhBTF9QSVhFTF9GT1JNQVRfQ1VTVE9NX1lDYkNyXzQyMl9JOgorICAgICAgICBWNEwyX1BJWCA9IFY0TDJfUElYX0ZNVF9ZVVlWOworICAgICAgICBicmVhazsKKworICAgIGNhc2UgSEFMX1BJWEVMX0ZPUk1BVF9ZQ2JDcl80MjJfUDoKKyAgICAgICAgVjRMMl9QSVggPSBWNEwyX1BJWF9GTVRfWVVWNDIyUDsKKyAgICAgICAgYnJlYWs7CisKKyAgICBjYXNlIEhBTF9QSVhFTF9GT1JNQVRfQ2JZQ3JZXzQyMl9JOgorICAgIGNhc2UgSEFMX1BJWEVMX0ZPUk1BVF9DVVNUT01fQ2JZQ3JZXzQyMl9JOgorICAgICAgICBWNEwyX1BJWCA9IFY0TDJfUElYX0ZNVF9VWVZZOworICAgICAgICBicmVhazsKKworICAgIGNhc2UgSEFMX1BJWEVMX0ZPUk1BVF9ZQ3JDYl80MjJfU1A6CisgICAgY2FzZSBIQUxfUElYRUxfRk9STUFUX0NVU1RPTV9ZQ3JDYl80MjJfU1A6CisgICAgICAgIFY0TDJfUElYID0gVjRMMl9QSVhfRk1UX05WMTY7CisgICAgICAgIGJyZWFrOworCisgICAgY2FzZSBIQUxfUElYRUxfRk9STUFUX1lDckNiXzQyMF9TUDoKKyAgICBjYXNlIEhBTF9QSVhFTF9GT1JNQVRfQ1VTVE9NX1lDckNiXzQyMF9TUDoKKyAgICAgICAgVjRMMl9QSVggPSBWNEwyX1BJWF9GTVRfTlYyMTsKKyAgICAgICAgYnJlYWs7CisKKyAgICBjYXNlIEhBTF9QSVhFTF9GT1JNQVRfQ1VTVE9NX1lDYkNyXzQyMF9TUF9USUxFRDoKKyAgICAgICAgVjRMMl9QSVggPSBWNEwyX1BJWF9GTVRfTlYxMk1UOworICAgICAgICBicmVhazsKKworICAgY2FzZSBIQUxfUElYRUxfRk9STUFUX0NVU1RPTV9ZQ3JDYl80MjJfSToKKyAgICAgICAgVjRMMl9QSVggPSBWNEwyX1BJWF9GTVRfWVZZVTsKKyAgICAgICAgYnJlYWs7CisKKyAgIGNhc2UgSEFMX1BJWEVMX0ZPUk1BVF9DVVNUT01fQ3JZQ2JZXzQyMl9JOgorICAgICAgICBWNEwyX1BJWCA9IFY0TDJfUElYX0ZNVF9WWVVZOworICAgICAgICBicmVhazsKKworICAgIGRlZmF1bHQ6CisgICAgICAgIExPR0UoIiVzOjp1bm1hdGNoZWQgSEFMX1BJWEVMX0ZPUk1BVCBjb2xvcl9zcGFjZSgweCV4KVxuIiwKKyAgICAgICAgICAgICAgICBfX2Z1bmNfXywgSEFMX1BJWEVMX0ZPUk1BVCk7CisgICAgICAgIGJyZWFrOworICAgIH0KKworICAgIHJldHVybiBWNEwyX1BJWDsKK30KKworaW5saW5lIGludCBWNEwyX1BJWF8yX0hBTF9QSVhFTF9GT1JNQVQoaW50IFY0TDJfUElYKQoreworICAgIGludCBIQUxfUElYRUxfRk9STUFUID0gLTE7CisKKyAgICBzd2l0Y2ggKFY0TDJfUElYKSB7CisgICAgY2FzZSBWNEwyX1BJWF9GTVRfUkdCMzI6CisgICAgICAgIEhBTF9QSVhFTF9GT1JNQVQgPSBIQUxfUElYRUxfRk9STUFUX1JHQkFfODg4ODsKKyAgICAgICAgYnJlYWs7CisKKyAgICBjYXNlIFY0TDJfUElYX0ZNVF9SR0IyNDoKKyAgICAgICAgSEFMX1BJWEVMX0ZPUk1BVCA9IEhBTF9QSVhFTF9GT1JNQVRfUkdCXzg4ODsKKyAgICAgICAgYnJlYWs7CisKKyAgICBjYXNlIFY0TDJfUElYX0ZNVF9SR0I1NjU6CisgICAgICAgIEhBTF9QSVhFTF9GT1JNQVQgPSBIQUxfUElYRUxfRk9STUFUX1JHQl81NjU7CisgICAgICAgIGJyZWFrOworCisgICAgY2FzZSBWNEwyX1BJWF9GTVRfQkdSMzI6CisgICAgICAgIEhBTF9QSVhFTF9GT1JNQVQgPSBIQUxfUElYRUxfRk9STUFUX0JHUkFfODg4ODsKKyAgICAgICAgYnJlYWs7CisKKyAgICBjYXNlIFY0TDJfUElYX0ZNVF9SR0I1NTVYOgorICAgICAgICBIQUxfUElYRUxfRk9STUFUID0gSEFMX1BJWEVMX0ZPUk1BVF9SR0JBXzU1NTE7CisgICAgICAgIGJyZWFrOworCisgICAgY2FzZSBWNEwyX1BJWF9GTVRfUkdCNDQ0OgorICAgICAgICBIQUxfUElYRUxfRk9STUFUID0gSEFMX1BJWEVMX0ZPUk1BVF9SR0JBXzQ0NDQ7CisgICAgICAgIGJyZWFrOworCisgICAgY2FzZSBWNEwyX1BJWF9GTVRfWVVWNDIwOgorICAgIGNhc2UgVjRMMl9QSVhfRk1UX1lVVjQyME06CisgICAgICAgIEhBTF9QSVhFTF9GT1JNQVQgPSBIQUxfUElYRUxfRk9STUFUX1lDYkNyXzQyMF9QOworICAgICAgICBicmVhazsKKworICAgIGNhc2UgVjRMMl9QSVhfRk1UX1lWVTQyMDoKKyAgICBjYXNlIFY0TDJfUElYX0ZNVF9ZVlU0MjBNOgorICAgICAgICAgSEFMX1BJWEVMX0ZPUk1BVCA9IEhBTF9QSVhFTF9GT1JNQVRfWVYxMjsKKyAgICAgICAgIGJyZWFrOworCisgICAgY2FzZSBWNEwyX1BJWF9GTVRfTlYxNjoKKyAgICAgICAgSEFMX1BJWEVMX0ZPUk1BVCA9IEhBTF9QSVhFTF9GT1JNQVRfQ1VTVE9NX1lDckNiXzQyMl9TUDsKKyAgICAgICAgYnJlYWs7CisKKyAgICBjYXNlIFY0TDJfUElYX0ZNVF9OVjEyOgorICAgICAgICBIQUxfUElYRUxfRk9STUFUID0gSEFMX1BJWEVMX0ZPUk1BVF9DVVNUT01fWUNiQ3JfNDIwX1NQOworICAgICAgICBicmVhazsKKworICAgIGNhc2UgVjRMMl9QSVhfRk1UX1lVWVY6CisgICAgICAgIEhBTF9QSVhFTF9GT1JNQVQgPSBIQUxfUElYRUxfRk9STUFUX0NVU1RPTV9ZQ2JDcl80MjJfSTsKKyAgICAgICAgYnJlYWs7CisKKyAgICBjYXNlIFY0TDJfUElYX0ZNVF9ZVVY0MjJQOgorICAgICAgICBIQUxfUElYRUxfRk9STUFUID0gSEFMX1BJWEVMX0ZPUk1BVF9ZQ2JDcl80MjJfUDsKKyAgICAgICAgYnJlYWs7CisKKyAgICBjYXNlIFY0TDJfUElYX0ZNVF9VWVZZOgorICAgICAgICBIQUxfUElYRUxfRk9STUFUID0gSEFMX1BJWEVMX0ZPUk1BVF9DVVNUT01fQ2JZQ3JZXzQyMl9JOworICAgICAgICBicmVhazsKKworICAgIGNhc2UgVjRMMl9QSVhfRk1UX05WMjE6CisgICAgICAgIEhBTF9QSVhFTF9GT1JNQVQgPSBIQUxfUElYRUxfRk9STUFUX0NVU1RPTV9ZQ3JDYl80MjBfU1A7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgVjRMMl9QSVhfRk1UX05WMTJNVDoKKworICAgICAgICBIQUxfUElYRUxfRk9STUFUID0gSEFMX1BJWEVMX0ZPUk1BVF9DVVNUT01fWUNiQ3JfNDIwX1NQX1RJTEVEOworICAgICAgICBicmVhazsKKworICAgIGNhc2UgVjRMMl9QSVhfRk1UX05WNjE6CisgICAgICAgIEhBTF9QSVhFTF9GT1JNQVQgPSBIQUxfUElYRUxfRk9STUFUX0NVU1RPTV9ZQ2JDcl80MjJfU1A7CisgICAgICAgIGJyZWFrOworCisgICAgY2FzZSBWNEwyX1BJWF9GTVRfWVZZVToKKyAgICAgICAgSEFMX1BJWEVMX0ZPUk1BVCA9IEhBTF9QSVhFTF9GT1JNQVRfQ1VTVE9NX1lDckNiXzQyMl9JOworICAgICAgICBicmVhazsKKworICAgIGNhc2UgVjRMMl9QSVhfRk1UX1ZZVVk6CisgICAgICAgIEhBTF9QSVhFTF9GT1JNQVQgPSBIQUxfUElYRUxfRk9STUFUX0NVU1RPTV9DcllDYllfNDIyX0k7CisgICAgICAgIGJyZWFrOworCisgICAgZGVmYXVsdDoKKyAgICAgICAgTE9HRSgiJXM6OnVubWF0Y2hlZCBWNEwyX1BJWCBjb2xvcl9zcGFjZSglZClcbiIsCisgICAgICAgICAgICAgICAgX19mdW5jX18sIFY0TDJfUElYKTsKKyAgICAgICAgYnJlYWs7CisgICAgfQorCisgICAgcmV0dXJuIEhBTF9QSVhFTF9GT1JNQVQ7Cit9CisKKyNkZWZpbmUgQUxJR05fVE9fMzJCKHgpICAgKCgoKHgpICsgKDEgPDwgIDUpIC0gMSkgPj4gIDUpIDw8ICA1KQorI2RlZmluZSBBTElHTl9UT18xMjhCKHgpICAoKCgoeCkgKyAoMSA8PCAgNykgLSAxKSA+PiAgNykgPDwgIDcpCisjZGVmaW5lIEFMSUdOX1RPXzhLQih4KSAgICgoKCh4KSArICgxIDw8IDEzKSAtIDEpID4+IDEzKSA8PCAxMykKKyNkZWZpbmUgQUxJR04oeCwgYSkgICAgICAgKCgoeCkgKyAoYSkgLSAxKSAmIH4oKGEpIC0gMSkpCisKKyNkZWZpbmUgR0VUXzMyQlBQX0ZSQU1FX1NJWkUodywgaCkgICgoKHcpICogKGgpKSA8PCAyKQorI2RlZmluZSBHRVRfMjRCUFBfRlJBTUVfU0laRSh3LCBoKSAgKCgodykgKiAoaCkpICogMykKKyNkZWZpbmUgR0VUXzE2QlBQX0ZSQU1FX1NJWkUodywgaCkgICgoKHcpICogKGgpKSA8PCAxKQorCitpbmxpbmUgdW5zaWduZWQgaW50IEZSQU1FX1NJWkUoaW50IEhBTF9QSVhFTF9GT1JNQVQsIGludCB3LCBpbnQgaCkKK3sKKyAgICB1bnNpZ25lZCBpbnQgZnJhbWVfc2l6ZSA9IDA7CisgICAgdW5zaWduZWQgaW50IHNpemUgICAgICAgPSAwOworCisgICAgc3dpdGNoIChIQUxfUElYRUxfRk9STUFUKSB7CisgICAgLy8gMTZicHAKKyAgICBjYXNlIEhBTF9QSVhFTF9GT1JNQVRfUkdCXzU2NToKKyAgICBjYXNlIEhBTF9QSVhFTF9GT1JNQVRfUkdCQV81NTUxOgorICAgIGNhc2UgSEFMX1BJWEVMX0ZPUk1BVF9SR0JBXzQ0NDQ6CisgICAgICAgIGZyYW1lX3NpemUgPSBHRVRfMTZCUFBfRlJBTUVfU0laRSh3LCBoKTsKKyAgICAgICAgYnJlYWs7CisKKyAgICAvLyAyNGJwcAorICAgIGNhc2UgSEFMX1BJWEVMX0ZPUk1BVF9SR0JfODg4OgorICAgICAgICBmcmFtZV9zaXplID0gR0VUXzI0QlBQX0ZSQU1FX1NJWkUodywgaCk7CisgICAgICAgIGJyZWFrOworCisgICAgLy8gMzJicHAKKyAgICBjYXNlIEhBTF9QSVhFTF9GT1JNQVRfUkdCQV84ODg4OgorICAgIGNhc2UgSEFMX1BJWEVMX0ZPUk1BVF9CR1JBXzg4ODg6CisgICAgY2FzZSBIQUxfUElYRUxfRk9STUFUX1JHQlhfODg4ODoKKyAgICAgICAgZnJhbWVfc2l6ZSA9IEdFVF8zMkJQUF9GUkFNRV9TSVpFKHcsIGgpOworICAgICAgICBicmVhazsKKworICAgIC8vIDEyYnBwCisgICAgY2FzZSBIQUxfUElYRUxfRk9STUFUX1lWMTI6CisgICAgY2FzZSBIQUxfUElYRUxfRk9STUFUX1lDckNiXzQyMF9TUDoKKyAgICBjYXNlIEhBTF9QSVhFTF9GT1JNQVRfWUNiQ3JfNDIwX1A6CisgICAgY2FzZSBIQUxfUElYRUxfRk9STUFUX1lDYkNyXzQyMF9JOgorICAgIGNhc2UgSEFMX1BJWEVMX0ZPUk1BVF9DYllDcllfNDIwX0k6CisgICAgY2FzZSBIQUxfUElYRUxfRk9STUFUX1lDYkNyXzQyMF9TUDoKKyAgICBjYXNlIEhBTF9QSVhFTF9GT1JNQVRfQ1VTVE9NX1lDYkNyXzQyMF9TUDoKKyAgICBjYXNlIEhBTF9QSVhFTF9GT1JNQVRfQ1VTVE9NX1lDckNiXzQyMF9TUDoKKyAgICAgICAgc2l6ZSA9IHcgKiBoOworICAgICAgICBmcmFtZV9zaXplID0gc2l6ZSArICgoc2l6ZSA+PiAyKSA8PCAxKTsKKyAgICAgICAgYnJlYWs7CisKKyAgICBjYXNlIEhBTF9QSVhFTF9GT1JNQVRfQ1VTVE9NX1lDYkNyXzQyMF9TUF9USUxFRDoKKyAgICAgICAgZnJhbWVfc2l6ZSA9ICAgQUxJR05fVE9fOEtCKEFMSUdOX1RPXzEyOEIodykgKiBBTElHTl9UT18zMkIoaCkpCisgICAgICAgICAgICAgICAgICAgICArIEFMSUdOX1RPXzhLQihBTElHTl9UT18xMjhCKHcpICogQUxJR05fVE9fMzJCKGggPj4gMSkpOworICAgICAgICBicmVhazsKKworICAgIC8vIDE2YnBwCisgICAgY2FzZSBIQUxfUElYRUxfRk9STUFUX1lDYkNyXzQyMl9TUDoKKyAgICBjYXNlIEhBTF9QSVhFTF9GT1JNQVRfWUNiQ3JfNDIyX0k6CisgICAgY2FzZSBIQUxfUElYRUxfRk9STUFUX1lDYkNyXzQyMl9QOgorICAgIGNhc2UgSEFMX1BJWEVMX0ZPUk1BVF9DYllDcllfNDIyX0k6CisgICAgY2FzZSBIQUxfUElYRUxfRk9STUFUX1lDckNiXzQyMl9TUDoKKyAgICBjYXNlIEhBTF9QSVhFTF9GT1JNQVRfQ1VTVE9NX1lDYkNyXzQyMl9TUDoKKyAgICBjYXNlIEhBTF9QSVhFTF9GT1JNQVRfQ1VTVE9NX1lDckNiXzQyMl9TUDoKKyAgICBjYXNlIEhBTF9QSVhFTF9GT1JNQVRfQ1VTVE9NX1lDYkNyXzQyMl9JOgorICAgIGNhc2UgSEFMX1BJWEVMX0ZPUk1BVF9DVVNUT01fWUNyQ2JfNDIyX0k6CisgICAgY2FzZSBIQUxfUElYRUxfRk9STUFUX0NVU1RPTV9DYllDcllfNDIyX0k6CisgICAgY2FzZSBIQUxfUElYRUxfRk9STUFUX0NVU1RPTV9DcllDYllfNDIyX0k6CisgICAgICAgIGZyYW1lX3NpemUgPSBHRVRfMTZCUFBfRlJBTUVfU0laRSh3LCBoKTsKKyAgICAgICAgYnJlYWs7CisKKyAgICBkZWZhdWx0OgorICAgICAgICBMT0dEKCIlczo6bm8gbWF0Y2hpbmcgc291cmNlIGNvbG9yZm9ybWF0KDB4JXgpLCB3KCVkKSwgaCglZCkgZmFpbFxuIiwKKyAgICAgICAgICAgICAgICBfX2Z1bmNfXywgSEFMX1BJWEVMX0ZPUk1BVCwgdywgaCk7CisgICAgICAgIGJyZWFrOworICAgIH0KKworICAgIHJldHVybiBmcmFtZV9zaXplOworfQorCisjZW5kaWYgLy9fX1NBTVNVTkdfU1lTTFNJX1NFQ19DT01NT05fSF9fCmRpZmYgLS1naXQgYS9leHlub3M0L2hhbC9pbmNsdWRlL3N3Y29udmVydGVyLmggYi9leHlub3M0L2hhbC9pbmNsdWRlL3N3Y29udmVydGVyLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZWIyZWFlMwotLS0gL2Rldi9udWxsCisrKyBiL2V4eW5vczQvaGFsL2luY2x1ZGUvc3djb252ZXJ0ZXIuaApAQCAtMCwwICsxLDQ2MiBAQAorLyoKKyAqCisgKiBDb3B5cmlnaHQgMjAxMiBTYW1zdW5nIEVsZWN0cm9uaWNzIFMuTFNJIENvLiBMVEQKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworLyoKKyAqIEBmaWxlICAgIHN3Y29udmVydGVyLmgKKyAqIEBicmllZiAgIFNFQ19PTVggc3BlY2lmaWMgZGVmaW5lLiBJdCBzdXBwb3J0IE1GQyA1LnggdGlsZWQuCisgKiAgIE5WMTJUKHRpbGVkKSBsYXlvdXQ6CisgKiAgIEVhY2ggZWxlbWVudCBpcyBub3QgcGl4ZWwuIEl0IGlzIDY0eDMyIHBpeGVsIGJsb2NrLgorICogICB1diBwaXhlbCBibG9jayBpcyBpbnRlcmxlYXZlZCBhcyB1IHYgdSB2IHUgdiAuLi4KKyAqICAgeTEgICAgeTIgICAgeTcgICAgeTggICAgeTkgICAgeTEwICAgeTE1ICAgeTE2CisgKiAgIHkzICAgIHk0ICAgIHk1ICAgIHk2ICAgIHkxMSAgIHkxMiAgIHkxMyAgIHkxNAorICogICB5MTcgICB5MTggICB5MjMgICB5MjQgICB5MjUgICB5MjYgICB5MzEgICB5MzIKKyAqICAgeTE5ICAgeTIwICAgeTIxICAgeTIyICAgeTI3ICAgeTI4ICAgeTI5ICAgeTMwCisgKiAgIHV2MSAgIHV2MiAgIHV2NyAgIHV2OCAgIHV2OSAgIHV2MTAgIHV2MTUgIHV2MTYKKyAqICAgdXYzICAgdXY0ICAgdXY1ICAgdXY2ICAgdXYxMSAgdXYxMiAgdXYxMyAgdXYxNAorICogICBZVVY0MjBQbGFuYXIobGluZWFyKSBsYXlvdXQ6CisgKiAgIEVhY2ggZWxlbWVudCBpcyBub3QgcGl4ZWwuIEl0IGlzIDY0eDMyIHBpeGVsIGJsb2NrLgorICogICB5MSAgICB5MiAgICB5MyAgICB5NCAgICB5NSAgICB5NiAgICB5NyAgICB5OAorICogICB5OSAgICB5MTAgICB5MTEgICB5MTIgICB5MTMgICB5MTQgICB5MTUgICB5MTYKKyAqICAgeTE3ICAgeTE4ICAgeTE5ICAgeTIwICAgeTIxICAgeTIyICAgeTIzICAgeTI0CisgKiAgIHkyNSAgIHkyNiAgIHkyNyAgIHkyOCAgIHkyOSAgIHkzMCAgIHkzMSAgIHkzMgorICogICB1MSAgICB1MiAgICB1MyAgICB1NCAgICB1NSAgICB1NiAgICB1NyAgICB1OAorICogICB2MSAgICB2MiAgICB2MyAgICB2NCAgICB2NSAgICB2NiAgICB2NyAgICB2OAorICogICBZVVY0MjBTZW1pcGxhbmFyKGxpbmVhcikgbGF5b3V0OgorICogICBFYWNoIGVsZW1lbnQgaXMgbm90IHBpeGVsLiBJdCBpcyA2NHgzMiBwaXhlbCBibG9jay4KKyAqICAgdXYgcGl4ZWwgYmxvY2sgaXMgaW50ZXJsZWF2ZWQgYXMgdSB2IHUgdiB1IHYgLi4uCisgKiAgIHkxICAgIHkyICAgIHkzICAgIHk0ICAgIHk1ICAgIHk2ICAgIHk3ICAgIHk4CisgKiAgIHk5ICAgIHkxMCAgIHkxMSAgIHkxMiAgIHkxMyAgIHkxNCAgIHkxNSAgIHkxNgorICogICB5MTcgICB5MTggICB5MTkgICB5MjAgICB5MjEgICB5MjIgICB5MjMgICB5MjQKKyAqICAgeTI1ICAgeTI2ICAgeTI3ICAgeTI4ICAgeTI5ICAgeTMwICAgeTMxICAgeTMyCisgKiAgIHV2MSAgIHV2MiAgIHV2MyAgIHV2NCAgIHV2NSAgIHV2NiAgIHV2NyAgIHV2OAorICogICB1djkgICB1djEwICB1djExICB1djEyICB1djEzICB1djE0ICB1djE1ICB1djE2CisgKiBAYXV0aG9yICBTaGluV29uIExlZSAoc2hpbndvbi5sZWVAc2Ftc3VuZy5jb20pCisgKiBAdmVyc2lvbiAxLjAKKyAqIEBoaXN0b3J5CisgKiAgIDIwMTIuMDIuMDEgOiBDcmVhdGUKKyAqLworCisjaWZuZGVmIFNXX0NPTlZFUlRPUl9IXworI2RlZmluZSBTV19DT05WRVJUT1JfSF8KKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisvKiBGb3JtYXQgQ29udmVyc2lvbiBBUEkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworLyoKKyAqIERlLWludGVybGVhdmVzIHNyYyB0byBkZXN0MSwgZGVzdDIKKyAqCisgKiBAcGFyYW0gZGVzdDEKKyAqICAgQWRkcmVzcyBvZiBkZS1pbnRlcmxlYXZlZCBkYXRhW291dF0KKyAqCisgKiBAcGFyYW0gZGVzdDIKKyAqICAgQWRkcmVzcyBvZiBkZS1pbnRlcmxlYXZlZCBkYXRhW291dF0KKyAqCisgKiBAcGFyYW0gc3JjCisgKiAgIEFkZHJlc3Mgb2YgaW50ZXJsZWF2ZWQgZGF0YVtpbl0KKyAqCisgKiBAcGFyYW0gc3JjX3NpemUKKyAqICAgU2l6ZSBvZiBpbnRlcmxlYXZlZCBkYXRhW2luXQorICovCit2b2lkIGNzY19kZWludGVybGVhdmVfbWVtY3B5KAorICAgIHVuc2lnbmVkIGNoYXIgKmRlc3QxLAorICAgIHVuc2lnbmVkIGNoYXIgKmRlc3QyLAorICAgIHVuc2lnbmVkIGNoYXIgKnNyYywKKyAgICB1bnNpZ25lZCBpbnQgc3JjX3NpemUpOworCisvKgorICogSW50ZXJsZWF2ZXMgc3JjMSwgc3JjMiB0byBkZXN0CisgKgorICogQHBhcmFtIGRlc3QKKyAqICAgQWRkcmVzcyBvZiBpbnRlcmxlYXZlZCBkYXRhW291dF0KKyAqCisgKiBAcGFyYW0gc3JjMQorICogICBBZGRyZXNzIG9mIGRlLWludGVybGVhdmVkIGRhdGFbaW5dCisgKgorICogQHBhcmFtIHNyYzIKKyAqICAgQWRkcmVzcyBvZiBkZS1pbnRlcmxlYXZlZCBkYXRhW2luXQorICoKKyAqIEBwYXJhbSBzcmNfc2l6ZQorICogICBTaXplIG9mIGRlLWludGVybGVhdmVkIGRhdGFbaW5dCisgKi8KK3ZvaWQgY3NjX2ludGVybGVhdmVfbWVtY3B5KAorICAgIHVuc2lnbmVkIGNoYXIgKmRlc3QsCisgICAgdW5zaWduZWQgY2hhciAqc3JjMSwKKyAgICB1bnNpZ25lZCBjaGFyICpzcmMyLAorICAgIHVuc2lnbmVkIGludCBzcmNfc2l6ZSk7CisKKy8qIEMgQ29kZSAqLworLyoKKyAqIENvbnZlcnRzIHRpbGVkIGRhdGEgdG8gbGluZWFyCisgKiAxLiB5IG9mIG52MTJ0IHRvIHkgb2YgeXV2NDIwcAorICogMi4geSBvZiBudjEydCB0byB5IG9mIHl1djQyMHMKKyAqCisgKiBAcGFyYW0gZHN0CisgKiAgIHkgYWRkcmVzcyBvZiB5dXY0MjBbb3V0XQorICoKKyAqIEBwYXJhbSBzcmMKKyAqICAgeSBhZGRyZXNzIG9mIG52MTJ0W2luXQorICoKKyAqIEBwYXJhbSB5dXY0MjBfd2lkdGgKKyAqICAgcmVhbCB3aWR0aCBvZiB5dXY0MjBbaW5dCisgKiAgIGl0IHNob3VsZCBiZSBldmVuCisgKgorICogQHBhcmFtIHl1djQyMF9oZWlnaHQKKyAqICAgcmVhbCBoZWlnaHQgb2YgeXV2NDIwW2luXQorICogICBpdCBzaG91bGQgYmUgZXZlbi4KKyAqCisgKi8KK3ZvaWQgY3NjX3RpbGVkX3RvX2xpbmVhcl95KAorICAgIHVuc2lnbmVkIGNoYXIgKnlfZHN0LAorICAgIHVuc2lnbmVkIGNoYXIgKnlfc3JjLAorICAgIHVuc2lnbmVkIGludCB3aWR0aCwKKyAgICB1bnNpZ25lZCBpbnQgaGVpZ2h0KTsKKworLyoKKyAqIENvbnZlcnRzIHRpbGVkIGRhdGEgdG8gbGluZWFyCisgKiAxLiB1diBvZiBudjEydCB0byB5IG9mIHl1djQyMHMKKyAqCisgKiBAcGFyYW0gZHN0CisgKiAgIHV2IGFkZHJlc3Mgb2YgeXV2NDIwc1tvdXRdCisgKgorICogQHBhcmFtIHNyYworICogICB1diBhZGRyZXNzIG9mIG52MTJ0W2luXQorICoKKyAqIEBwYXJhbSB5dXY0MjBfd2lkdGgKKyAqICAgcmVhbCB3aWR0aCBvZiB5dXY0MjBzW2luXQorICoKKyAqIEBwYXJhbSB5dXY0MjBfaGVpZ2h0CisgKiAgIHJlYWwgaGVpZ2h0IG9mIHl1djQyMHNbaW5dCisgKgorICovCit2b2lkIGNzY190aWxlZF90b19saW5lYXJfdXYoCisgICAgdW5zaWduZWQgY2hhciAqdXZfZHN0LAorICAgIHVuc2lnbmVkIGNoYXIgKnV2X3NyYywKKyAgICB1bnNpZ25lZCBpbnQgd2lkdGgsCisgICAgdW5zaWduZWQgaW50IGhlaWdodCk7CisKKy8qCisgKiBDb252ZXJ0cyB0aWxlZCBkYXRhIHRvIGxpbmVhcgorICogMS4gdXYgb2YgbnQxMnQgdG8gdXYgb2YgeXV2NDIwcAorICoKKyAqIEBwYXJhbSB1X2RzdAorICogICB1IGFkZHJlc3Mgb2YgeXV2NDIwcFtvdXRdCisgKgorICogQHBhcmFtIHZfZHN0CisgKiAgIHYgYWRkcmVzcyBvZiB5dXY0MjBwW291dF0KKyAqCisgKiBAcGFyYW0gdXZfc3JjCisgKiAgIHV2IGFkZHJlc3Mgb2YgbnQxMnRbaW5dCisgKgorICogQHBhcmFtIHl1djQyMF93aWR0aAorICogICByZWFsIHdpZHRoIG9mIHl1djQyMHBbaW5dCisgKgorICogQHBhcmFtIHl1djQyMF9oZWlnaHQKKyAqICAgcmVhbCBoZWlnaHQgb2YgeXV2NDIwcFtpbl0KKyAqLwordm9pZCBjc2NfdGlsZWRfdG9fbGluZWFyX3V2X2RlaW50ZXJsZWF2ZSgKKyAgICB1bnNpZ25lZCBjaGFyICp1X2RzdCwKKyAgICB1bnNpZ25lZCBjaGFyICp2X2RzdCwKKyAgICB1bnNpZ25lZCBjaGFyICp1dl9zcmMsCisgICAgdW5zaWduZWQgaW50IHdpZHRoLAorICAgIHVuc2lnbmVkIGludCBoZWlnaHQpOworCisvKgorICogQ29udmVydHMgbGluZWFyIGRhdGEgdG8gdGlsZWQKKyAqIDEuIHkgb2YgeXV2NDIwIHRvIHkgb2YgbnYxMnQKKyAqCisgKiBAcGFyYW0gZHN0CisgKiAgIHkgYWRkcmVzcyBvZiBudjEydFtvdXRdCisgKgorICogQHBhcmFtIHNyYworICogICB5IGFkZHJlc3Mgb2YgeXV2NDIwW2luXQorICoKKyAqIEBwYXJhbSB5dXY0MjBfd2lkdGgKKyAqICAgcmVhbCB3aWR0aCBvZiB5dXY0MjBbaW5dCisgKiAgIGl0IHNob3VsZCBiZSBldmVuCisgKgorICogQHBhcmFtIHl1djQyMF9oZWlnaHQKKyAqICAgcmVhbCBoZWlnaHQgb2YgeXV2NDIwW2luXQorICogICBpdCBzaG91bGQgYmUgZXZlbi4KKyAqCisgKi8KK3ZvaWQgY3NjX2xpbmVhcl90b190aWxlZF95KAorICAgIHVuc2lnbmVkIGNoYXIgKnlfZHN0LAorICAgIHVuc2lnbmVkIGNoYXIgKnlfc3JjLAorICAgIHVuc2lnbmVkIGludCB3aWR0aCwKKyAgICB1bnNpZ25lZCBpbnQgaGVpZ2h0KTsKKworLyoKKyAqIENvbnZlcnRzIGFuZCBpbnRlcmxlYXZlcyBsaW5lYXIgZGF0YSB0byB0aWxlZAorICogMS4gdXYgb2YgbnYxMnQgdG8gdXYgb2YgeXV2NDIwCisgKgorICogQHBhcmFtIGRzdAorICogICB1diBhZGRyZXNzIG9mIG52MTJ0W291dF0KKyAqCisgKiBAcGFyYW0gc3JjCisgKiAgIHUgYWRkcmVzcyBvZiB5dXY0MjBbaW5dCisgKgorICogQHBhcmFtIHNyYworICogICB2IGFkZHJlc3Mgb2YgeXV2NDIwW2luXQorICoKKyAqIEBwYXJhbSB5dXY0MjBfd2lkdGgKKyAqICAgcmVhbCB3aWR0aCBvZiB5dXY0MjBbaW5dCisgKgorICogQHBhcmFtIHl1djQyMF9oZWlnaHQKKyAqICAgcmVhbCBoZWlnaHQgb2YgeXV2NDIwW2luXQorICoKKyAqLwordm9pZCBjc2NfbGluZWFyX3RvX3RpbGVkX3V2KAorICAgIHVuc2lnbmVkIGNoYXIgKnV2X2RzdCwKKyAgICB1bnNpZ25lZCBjaGFyICp1X3NyYywKKyAgICB1bnNpZ25lZCBjaGFyICp2X3NyYywKKyAgICB1bnNpZ25lZCBpbnQgd2lkdGgsCisgICAgdW5zaWduZWQgaW50IGhlaWdodCk7CisKKy8qCisgKiBDb252ZXJ0cyB0aWxlZCBkYXRhIHRvIGxpbmVhciBmb3IgbWZjIDYueAorICogMS4gWSBvZiBOVjEyVCB0byBZIG9mIFlVVjQyMFAKKyAqIDIuIFkgb2YgTlYxMlQgdG8gWSBvZiBZVVY0MjBTCisgKgorICogQHBhcmFtIGRzdAorICogICBZIGFkZHJlc3Mgb2YgWVVWNDIwW291dF0KKyAqCisgKiBAcGFyYW0gc3JjCisgKiAgIFkgYWRkcmVzcyBvZiBOVjEyVFtpbl0KKyAqCisgKiBAcGFyYW0geXV2NDIwX3dpZHRoCisgKiAgIHJlYWwgd2lkdGggb2YgWVVWNDIwW2luXQorICoKKyAqIEBwYXJhbSB5dXY0MjBfaGVpZ2h0CisgKiAgIFk6IHJlYWwgaGVpZ2h0IG9mIFlVVjQyMFtpbl0KKyAqCisgKi8KK3ZvaWQgY3NjX3RpbGVkX3RvX2xpbmVhcl95X25lb24oCisgICAgdW5zaWduZWQgY2hhciAqeV9kc3QsCisgICAgdW5zaWduZWQgY2hhciAqeV9zcmMsCisgICAgdW5zaWduZWQgaW50IHdpZHRoLAorICAgIHVuc2lnbmVkIGludCBoZWlnaHQpOworCisvKgorICogQ29udmVydHMgdGlsZWQgZGF0YSB0byBsaW5lYXIgZm9yIG1mYyA2LngKKyAqIDEuIFVWIG9mIE5WMTJUIHRvIFkgb2YgWVVWNDIwUworICoKKyAqIEBwYXJhbSB1X2RzdAorICogICBVViBwbGFuZSBhZGRyZXNzIG9mIFlVVjQyMFBbb3V0XQorICoKKyAqIEBwYXJhbSBudjEydF9zcmMKKyAqICAgWSBvciBVViBwbGFuZSBhZGRyZXNzIG9mIE5WMTJUW2luXQorICoKKyAqIEBwYXJhbSB5dXY0MjBfd2lkdGgKKyAqICAgcmVhbCB3aWR0aCBvZiBZVVY0MjBbaW5dCisgKgorICogQHBhcmFtIHl1djQyMF9oZWlnaHQKKyAqICAgKHJlYWwgaGVpZ2h0KS8yIG9mIFlVVjQyMFtpbl0KKyAqLwordm9pZCBjc2NfdGlsZWRfdG9fbGluZWFyX3V2X25lb24oCisgICAgdW5zaWduZWQgY2hhciAqdXZfZHN0LAorICAgIHVuc2lnbmVkIGNoYXIgKnV2X3NyYywKKyAgICB1bnNpZ25lZCBpbnQgd2lkdGgsCisgICAgdW5zaWduZWQgaW50IGhlaWdodCk7CisKKy8qCisgKiBDb252ZXJ0cyB0aWxlZCBkYXRhIHRvIGxpbmVhciBmb3IgbWZjIDYueAorICogRGVpbnRlcmxlYXZlIHNyYyB0byB1X2RzdCwgdl9kc3QKKyAqIDEuIFVWIG9mIE5WMTJUIHRvIFkgb2YgWVVWNDIwUAorICoKKyAqIEBwYXJhbSB1X2RzdAorICogICBVIHBsYW5lIGFkZHJlc3Mgb2YgWVVWNDIwUFtvdXRdCisgKgorICogQHBhcmFtIHZfZHN0CisgKiAgIFYgcGxhbmUgYWRkcmVzcyBvZiBZVVY0MjBQW291dF0KKyAqCisgKiBAcGFyYW0gbnYxMnRfc3JjCisgKiAgIFkgb3IgVVYgcGxhbmUgYWRkcmVzcyBvZiBOVjEyVFtpbl0KKyAqCisgKiBAcGFyYW0geXV2NDIwX3dpZHRoCisgKiAgIHJlYWwgd2lkdGggb2YgWVVWNDIwW2luXQorICoKKyAqIEBwYXJhbSB5dXY0MjBfaGVpZ2h0CisgKiAgIChyZWFsIGhlaWdodCkvMiBvZiBZVVY0MjBbaW5dCisgKi8KK3ZvaWQgY3NjX3RpbGVkX3RvX2xpbmVhcl91dl9kZWludGVybGVhdmVfbmVvbigKKyAgICB1bnNpZ25lZCBjaGFyICp1X2RzdCwKKyAgICB1bnNpZ25lZCBjaGFyICp2X2RzdCwKKyAgICB1bnNpZ25lZCBjaGFyICp1dl9zcmMsCisgICAgdW5zaWduZWQgaW50IHdpZHRoLAorICAgIHVuc2lnbmVkIGludCBoZWlnaHQpOworCisvKgorICogQ29udmVydHMgbGluZWFyIGRhdGEgdG8gdGlsZWQKKyAqIDEuIHkgb2YgeXV2NDIwIHRvIHkgb2YgbnYxMnQKKyAqCisgKiBAcGFyYW0gZHN0CisgKiAgIHkgYWRkcmVzcyBvZiBudjEydFtvdXRdCisgKgorICogQHBhcmFtIHNyYworICogICB5IGFkZHJlc3Mgb2YgeXV2NDIwW2luXQorICoKKyAqIEBwYXJhbSB5dXY0MjBfd2lkdGgKKyAqICAgcmVhbCB3aWR0aCBvZiB5dXY0MjBbaW5dCisgKiAgIGl0IHNob3VsZCBiZSBldmVuCisgKgorICogQHBhcmFtIHl1djQyMF9oZWlnaHQKKyAqICAgcmVhbCBoZWlnaHQgb2YgeXV2NDIwW2luXQorICogICBpdCBzaG91bGQgYmUgZXZlbi4KKyAqCisgKi8KK3ZvaWQgY3NjX2xpbmVhcl90b190aWxlZF95X25lb24oCisgICAgdW5zaWduZWQgY2hhciAqeV9kc3QsCisgICAgdW5zaWduZWQgY2hhciAqeV9zcmMsCisgICAgdW5zaWduZWQgaW50IHdpZHRoLAorICAgIHVuc2lnbmVkIGludCBoZWlnaHQpOworCisvKgorICogQ29udmVydHMgYW5kIGludGVybGVhdmVzIGxpbmVhciBkYXRhIHRvIHRpbGVkCisgKiAxLiB1diBvZiBudjEydCB0byB1diBvZiB5dXY0MjAKKyAqCisgKiBAcGFyYW0gZHN0CisgKiAgIHV2IGFkZHJlc3Mgb2YgbnYxMnRbb3V0XQorICoKKyAqIEBwYXJhbSBzcmMKKyAqICAgdSBhZGRyZXNzIG9mIHl1djQyMFtpbl0KKyAqCisgKiBAcGFyYW0gc3JjCisgKiAgIHYgYWRkcmVzcyBvZiB5dXY0MjBbaW5dCisgKgorICogQHBhcmFtIHl1djQyMF93aWR0aAorICogICByZWFsIHdpZHRoIG9mIHl1djQyMFtpbl0KKyAqCisgKiBAcGFyYW0geXV2NDIwX2hlaWdodAorICogICByZWFsIGhlaWdodCBvZiB5dXY0MjBbaW5dCisgKgorICovCit2b2lkIGNzY19saW5lYXJfdG9fdGlsZWRfdXZfbmVvbigKKyAgICB1bnNpZ25lZCBjaGFyICp1dl9kc3QsCisgICAgdW5zaWduZWQgY2hhciAqdV9zcmMsCisgICAgdW5zaWduZWQgY2hhciAqdl9zcmMsCisgICAgdW5zaWduZWQgaW50IHdpZHRoLAorICAgIHVuc2lnbmVkIGludCBoZWlnaHQpOworCisvKgorICogQ29udmVydHMgUkdCNTY1IHRvIFlVVjQyMFAKKyAqCisgKiBAcGFyYW0geV9kc3QKKyAqICAgWSBwbGFuZSBhZGRyZXNzIG9mIFlVVjQyMFBbb3V0XQorICoKKyAqIEBwYXJhbSB1X2RzdAorICogICBVIHBsYW5lIGFkZHJlc3Mgb2YgWVVWNDIwUFtvdXRdCisgKgorICogQHBhcmFtIHZfZHN0CisgKiAgIFYgcGxhbmUgYWRkcmVzcyBvZiBZVVY0MjBQW291dF0KKyAqCisgKiBAcGFyYW0gcmdiX3NyYworICogICBBZGRyZXNzIG9mIFJHQjU2NVtpbl0KKyAqCisgKiBAcGFyYW0gd2lkdGgKKyAqICAgV2lkdGggb2YgUkdCNTY1W2luXQorICoKKyAqIEBwYXJhbSBoZWlnaHQKKyAqICAgSGVpZ2h0IG9mIFJHQjU2NVtpbl0KKyAqLwordm9pZCBjc2NfUkdCNTY1X3RvX1lVVjQyMFAoCisgICAgdW5zaWduZWQgY2hhciAqeV9kc3QsCisgICAgdW5zaWduZWQgY2hhciAqdV9kc3QsCisgICAgdW5zaWduZWQgY2hhciAqdl9kc3QsCisgICAgdW5zaWduZWQgY2hhciAqcmdiX3NyYywKKyAgICB1bnNpZ25lZCBpbnQgd2lkdGgsCisgICAgdW5zaWduZWQgaW50IGhlaWdodCk7CisKKy8qCisgKiBDb252ZXJ0cyBSR0I1NjUgdG8gWVVWNDIwUworICoKKyAqIEBwYXJhbSB5X2RzdAorICogICBZIHBsYW5lIGFkZHJlc3Mgb2YgWVVWNDIwU1tvdXRdCisgKgorICogQHBhcmFtIHV2X2RzdAorICogICBVViBwbGFuZSBhZGRyZXNzIG9mIFlVVjQyMFNbb3V0XQorICoKKyAqIEBwYXJhbSByZ2Jfc3JjCisgKiAgIEFkZHJlc3Mgb2YgUkdCNTY1W2luXQorICoKKyAqIEBwYXJhbSB3aWR0aAorICogICBXaWR0aCBvZiBSR0I1NjVbaW5dCisgKgorICogQHBhcmFtIGhlaWdodAorICogICBIZWlnaHQgb2YgUkdCNTY1W2luXQorICovCit2b2lkIGNzY19SR0I1NjVfdG9fWVVWNDIwU1AoCisgICAgdW5zaWduZWQgY2hhciAqeV9kc3QsCisgICAgdW5zaWduZWQgY2hhciAqdXZfZHN0LAorICAgIHVuc2lnbmVkIGNoYXIgKnJnYl9zcmMsCisgICAgdW5zaWduZWQgaW50IHdpZHRoLAorICAgIHVuc2lnbmVkIGludCBoZWlnaHQpOworCisvKgorICogQ29udmVydHMgQVJHQjg4ODggdG8gWVVWNDIwUAorICoKKyAqIEBwYXJhbSB5X2RzdAorICogICBZIHBsYW5lIGFkZHJlc3Mgb2YgWVVWNDIwUFtvdXRdCisgKgorICogQHBhcmFtIHVfZHN0CisgKiAgIFUgcGxhbmUgYWRkcmVzcyBvZiBZVVY0MjBQW291dF0KKyAqCisgKiBAcGFyYW0gdl9kc3QKKyAqICAgViBwbGFuZSBhZGRyZXNzIG9mIFlVVjQyMFBbb3V0XQorICoKKyAqIEBwYXJhbSByZ2Jfc3JjCisgKiAgIEFkZHJlc3Mgb2YgQVJHQjg4ODhbaW5dCisgKgorICogQHBhcmFtIHdpZHRoCisgKiAgIFdpZHRoIG9mIEFSR0I4ODg4W2luXQorICoKKyAqIEBwYXJhbSBoZWlnaHQKKyAqICAgSGVpZ2h0IG9mIEFSR0I4ODg4W2luXQorICovCit2b2lkIGNzY19BUkdCODg4OF90b19ZVVY0MjBQKAorICAgIHVuc2lnbmVkIGNoYXIgKnlfZHN0LAorICAgIHVuc2lnbmVkIGNoYXIgKnVfZHN0LAorICAgIHVuc2lnbmVkIGNoYXIgKnZfZHN0LAorICAgIHVuc2lnbmVkIGNoYXIgKnJnYl9zcmMsCisgICAgdW5zaWduZWQgaW50IHdpZHRoLAorICAgIHVuc2lnbmVkIGludCBoZWlnaHQpOworCisvKgorICogQ29udmVydHMgQVJHQjg4OCB0byBZVVY0MjBTUAorICoKKyAqIEBwYXJhbSB5X2RzdAorICogICBZIHBsYW5lIGFkZHJlc3Mgb2YgWVVWNDIwU1Bbb3V0XQorICoKKyAqIEBwYXJhbSB1dl9kc3QKKyAqICAgVVYgcGxhbmUgYWRkcmVzcyBvZiBZVVY0MjBTUFtvdXRdCisgKgorICogQHBhcmFtIHJnYl9zcmMKKyAqICAgQWRkcmVzcyBvZiBBUkdCODg4OFtpbl0KKyAqCisgKiBAcGFyYW0gd2lkdGgKKyAqICAgV2lkdGggb2YgQVJHQjg4ODhbaW5dCisgKgorICogQHBhcmFtIGhlaWdodAorICogICBIZWlnaHQgb2YgQVJHQjg4ODhbaW5dCisgKi8KK3ZvaWQgY3NjX0FSR0I4ODg4X3RvX1lVVjQyMFNQKAorICAgIHVuc2lnbmVkIGNoYXIgKnlfZHN0LAorICAgIHVuc2lnbmVkIGNoYXIgKnV2X2RzdCwKKyAgICB1bnNpZ25lZCBjaGFyICpyZ2Jfc3JjLAorICAgIHVuc2lnbmVkIGludCB3aWR0aCwKKyAgICB1bnNpZ25lZCBpbnQgaGVpZ2h0KTsKKworI2VuZGlmIC8qQ09MT1JfU1BBQ0VfQ09OVkVSVE9SX0hfKi8KZGlmZiAtLWdpdCBhL2V4eW5vczQvaGFsL2luY2x1ZGUvdmlkZW8uaCBiL2V4eW5vczQvaGFsL2luY2x1ZGUvdmlkZW8uaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wNTY1Yjg1Ci0tLSAvZGV2L251bGwKKysrIGIvZXh5bm9zNC9oYWwvaW5jbHVkZS92aWRlby5oCkBAIC0wLDAgKzEsMzYzIEBACisjaWZuZGVmIF9WSURFT19IXworI2RlZmluZSBfVklERU9fSF8KKworI2lmZGVmIF9fY3BsdXNwbHVzCitleHRlcm4gIkMiIHsKKyNlbmRpZgorCisjaWZuZGVmIF9fSERNSV9WSURFT19WSURFT0ZPUk1BVF9fCisjZGVmaW5lIF9fSERNSV9WSURFT19WSURFT0ZPUk1BVF9fCisvKioKKyAqIEBlbnVtIFZpZGVvRm9ybWF0CisgKiBWaWRlbyBmb3JtYXQKKyAqLworZW51bSBWaWRlb0Zvcm1hdCB7CisgICAgLyoqIDY0MHg0ODBwXEA2MEh6ICovCisgICAgdjY0MHg0ODBwXzYwSHogPSAwLAorICAgIC8qKiA3MjB4NDgwcFxANjBIeiAqLworICAgIHY3MjB4NDgwcF82MEh6LAorICAgIC8qKiAxMjgweDcwMHBcQDYwSHogKi8KKyAgICB2MTI4MHg3MjBwXzYwSHosCisgICAgLyoqIDE5MjB4MTA4MGlcQDYwSHogKi8KKyAgICB2MTkyMHgxMDgwaV82MEh6LAorICAgIC8qKiA3MjB4NDgwaVxANjBIeiAqLworICAgIHY3MjB4NDgwaV82MEh6LAorICAgIC8qKiA3MjB4MjQwcFxANjBIeiAqLworICAgIHY3MjB4MjQwcF82MEh6LAorICAgIC8qKiAyODgweDQ4MGlcQDYwSHogKi8KKyAgICB2Mjg4MHg0ODBpXzYwSHosCisgICAgLyoqIDI4ODB4MjQwcFxANjBIeiAqLworICAgIHYyODgweDI0MHBfNjBIeiwKKyAgICAvKiogMTQ0MHg0ODBwXEA2MEh6ICovCisgICAgdjE0NDB4NDgwcF82MEh6LAorICAgIC8qKiAxOTIweDEwODBwXEA2MEh6ICovCisgICAgdjE5MjB4MTA4MHBfNjBIeiwKKyAgICAvKiogNzIweDU3NnBcQDYwSHogKi8KKyAgICB2NzIweDU3NnBfNTBIeiwKKyAgICAvKiogMTI4MHg3MjBwXEA1MEh6ICovCisgICAgdjEyODB4NzIwcF81MEh6LAorICAgIC8qKiAxOTIweDEwODBpXEA1MEh6IChWIHRvdGFsID0gMTEyNSkgKi8KKyAgICB2MTkyMHgxMDgwaV81MEh6LAorICAgIC8qKiA3MjB4NTc2aVxANTBIeiAqLworICAgIHY3MjB4NTc2aV81MEh6LAorICAgIC8qKiA3MjB4Mjg4cFxANTBIeiAqLworICAgIHY3MjB4Mjg4cF81MEh6LAorICAgIC8qKiAyODgweDU3NmlcQDUwSHogKi8KKyAgICB2Mjg4MHg1NzZpXzUwSHosCisgICAgLyoqIDI4ODB4Mjg4cFxANTBIeiAqLworICAgIHYyODgweDI4OHBfNTBIeiwKKyAgICAvKiogMTQ0MHg1NzZwXEA1MEh6ICovCisgICAgdjE0NDB4NTc2cF81MEh6LAorICAgIC8qKiAxOTIweDEwODBwXEA1MEh6ICovCisgICAgdjE5MjB4MTA4MHBfNTBIeiwKKyAgICAvKiogMTkyMHgxMDgwcFxAMjRIeiAqLworICAgIHYxOTIweDEwODBwXzI0SHosCisgICAgLyoqIDE5MjB4MTA4MHBcQDI1SHogKi8KKyAgICB2MTkyMHgxMDgwcF8yNUh6LAorICAgIC8qKiAxOTIweDEwODBwXEAzMEh6ICovCisgICAgdjE5MjB4MTA4MHBfMzBIeiwKKyAgICAvKiogMjg4MHg0ODBwXEA2MEh6ICovCisgICAgdjI4ODB4NDgwcF82MEh6LAorICAgIC8qKiAyODgweDU3NnBcQDYwSHogKi8KKyAgICB2Mjg4MHg1NzZwXzUwSHosCisgICAgLyoqIDE5MjB4MTA4MGlcQDUwSHogKFYgdG90YWwgPSAxMjUwKSAqLworICAgIHYxOTIweDEwODBpXzUwSHpfMTI1MCwKKyAgICAvKiogMTkyMHgxMDgwaVxAMTAwSHogKi8KKyAgICB2MTkyMHgxMDgwaV8xMDBIeiwKKyAgICAvKiogMTI4MHg3MjBwXEAxMDBIeiAqLworICAgIHYxMjgweDcyMHBfMTAwSHosCisgICAgLyoqIDcyMHg1NzZwXEAxMDBIeiAqLworICAgIHY3MjB4NTc2cF8xMDBIeiwKKyAgICAvKiogNzIweDU3NmlcQDEwMEh6ICovCisgICAgdjcyMHg1NzZpXzEwMEh6LAorICAgIC8qKiAxOTIweDEwODBpXEAxMjBIeiAqLworICAgIHYxOTIweDEwODBpXzEyMEh6LAorICAgIC8qKiAxMjgweDcyMHBcQDEyMEh6ICovCisgICAgdjEyODB4NzIwcF8xMjBIeiwKKyAgICAvKiogNzIweDQ4MHBcQDEyMEh6ICovCisgICAgdjcyMHg0ODBwXzEyMEh6LAorICAgIC8qKiA3MjB4NDgwaVxAMTIwSHogKi8KKyAgICB2NzIweDQ4MGlfMTIwSHosCisgICAgLyoqIDcyMHg1NzZwXEAyMDBIeiAqLworICAgIHY3MjB4NTc2cF8yMDBIeiwKKyAgICAvKiogNzIweDU3NmlcQDIwMEh6ICovCisgICAgdjcyMHg1NzZpXzIwMEh6LAorICAgIC8qKiA3MjB4NDgwcFxAMjQwSHogKi8KKyAgICB2NzIweDQ4MHBfMjQwSHosCisgICAgLyoqIDcyMHg0ODBpXEAyNDBIeiAqLworICAgIHY3MjB4NDgwaV8yNDBIeiwKKyAgICAvKiogMTI4MHg3MjBwXEAyNEh6ICovCisgICAgdjEyODB4NzIwcF8yNEh6LAorICAgIC8qKiAxMjgweDcyMHBcQDI1SHogKi8KKyAgICB2MTI4MHg3MjBwXzI1SHosCisgICAgLyoqIDEyODB4NzIwcFxAMzBIeiAqLworICAgIHYxMjgweDcyMHBfMzBIeiwKKyAgICAvKiogMTkyMHgxMDgwcFxAMTIwSHogKi8KKyAgICB2MTkyMHgxMDgwcF8xMjBIeiwKKyAgICAvKiogMTkyMHgxMDgwcFxAMTAwSHogKi8KKyAgICB2MTkyMHgxMDgwcF8xMDBIeiwKKyAgICAvKiogNEt4MktcQDMwSHogICAgICovCisgICAgdjRLeDJLXzMwSHosCit9OworI2VuZGlmIC8qIF9fSERNSV9WSURFT19WSURFT0ZPUk1BVF9fICovCisjaWZuZGVmIF9fSERNSV9WSURFT19DT0xPUlNQQUNFX18KKyNkZWZpbmUgX19IRE1JX1ZJREVPX0NPTE9SU1BBQ0VfXworLyoqCisgKiBAZW51bSBDb2xvclNwYWNlCisgKiBDb2xvciBzcGFjZSBvZiB2aWRlbyBzdHJlYW0uCisgKi8KK2VudW0gQ29sb3JTcGFjZSB7CisgICAgLyoqIFJHQiBjb2xvciBzcGFjZSAqLworICAgIEhETUlfQ1NfUkdCLAorICAgIC8qKiBZQ2JDciA0OjQ6NCBjb2xvciBzcGFjZSAqLworICAgIEhETUlfQ1NfWUNCQ1I0NDQsCisgICAgLyoqIFlDYkNyIDQ6MjoyIGNvbG9yIHNwYWNlICovCisgICAgSERNSV9DU19ZQ0JDUjQyMgorfTsKKyNlbmRpZiAvKiBfX0hETUlfVklERU9fQ09MT1JTUEFDRV9fICovCisKKyNpZm5kZWYgX19IRE1JX1ZJREVPX0NPTE9SREVQVEhfXworI2RlZmluZSBfX0hETUlfVklERU9fQ09MT1JERVBUSF9fCisvKioKKyAqIEBlbnVtIENvbG9yRGVwdGgKKyAqIENvbG9yIGRlcHRoIHBlciBwaXhlbCBvZiB2aWRlbyBzdHJlYW0KKyAqLworZW51bSBDb2xvckRlcHRoIHsKKyAgICAvKiogMzYgYml0IGNvbG9yIGRlcHRoIHBlciBwaXhlbCAqLworICAgIEhETUlfQ0RfMzYsCisgICAgLyoqIDMwIGJpdCBjb2xvciBkZXB0aCBwZXIgcGl4ZWwgKi8KKyAgICBIRE1JX0NEXzMwLAorICAgIC8qKiAyNCBiaXQgY29sb3IgZGVwdGggcGVyIHBpeGVsICovCisgICAgSERNSV9DRF8yNAorfTsKKyNlbmRpZiAvKiBfX0hETUlfVklERU9fQ09MT1JERVBUSF9fICovCisKKyNpZm5kZWYgX19IRE1JX1ZJREVPX0hETUlNT0RFX18KKyNkZWZpbmUgX19IRE1JX1ZJREVPX0hETUlNT0RFX18KKy8qKgorICogQGVudW0gSERNSU1vZGUKKyAqIFN5c3RlbSBtb2RlCisgKi8KK2VudW0gSERNSU1vZGUgeworICAgIC8qKiBEVkkgbW9kZSAqLworICAgIERWSSA9IDAsCisgICAgLyoqIEhETUkgbW9kZSAqLworICAgIEhETUkKK307CisjZW5kaWYgLyogX19IRE1JX1ZJREVPX0hETUlNT0RFX18gKi8KKworI2lmbmRlZiBfX0hETUlfVklERU9fUElYRUxMSU1JVF9fCisjZGVmaW5lIF9fSERNSV9WSURFT19QSVhFTExJTUlUX18KKy8qKgorICogQGVudW0gUGl4ZWxMaW1pdAorICogUGl4ZWwgbGltaXRhdGlvbiBvZiB2aWRlbyBzdHJlYW0KKyAqLworZW51bSBQaXhlbExpbWl0IHsKKyAgICAvKiogRnVsbCByYW5nZSAqLworICAgIEhETUlfRlVMTF9SQU5HRSwKKyAgICAvKiogTGltaXQgcmFuZ2UgZm9yIFJHQiBjb2xvciBzcGFjZSAqLworICAgIEhETUlfUkdCX0xJTUlUX1JBTkdFLAorICAgIC8qKiBMaW1pdCByYW5nZSBmb3IgWUNiQ3IgY29sb3Igc3BhY2UgKi8KKyAgICBIRE1JX1lDQkNSX0xJTUlUX1JBTkdFCit9OworI2VuZGlmIC8qIF9fSERNSV9WSURFT19QSVhFTExJTUlUX18gKi8KKworI2lmbmRlZiBfX0hETUlfVklERU9fQ09MT1JJTUVUUllfXworI2RlZmluZSBfX0hETUlfVklERU9fQ09MT1JJTUVUUllfXworLyoqCisgKiBAZW51bSBIRE1JQ29sb3JpbWV0cnkKKyAqIENvbG9yaW1ldHJ5IG9mIHZpZGVvIHN0cmVhbQorICovCitlbnVtIEhETUlDb2xvcmltZXRyeSB7CisgICAgLyoqIENvbG9yaW1ldHJ5IGlzIG5vdCBkZWZpbmVkICovCisgICAgSERNSV9DT0xPUklNRVRSWV9OT19EQVRBLAorICAgIC8qKiBJVFU2MDEgY29sb3JpbWV0cnkgKi8KKyAgICBIRE1JX0NPTE9SSU1FVFJZX0lUVTYwMSwKKyAgICAvKiogSVRVNzA5IGNvbG9yaW1ldHJ5ICovCisgICAgSERNSV9DT0xPUklNRVRSWV9JVFU3MDksCisgICAgLyoqIEV4dGVuZGVkIElUVTYwMSBjb2xvcmltZXRyeSAqLworICAgIEhETUlfQ09MT1JJTUVUUllfRVhURU5ERURfeHZZQ0M2MDEsCisgICAgLyoqIEV4dGVuZGVkIElUVTcwOSBjb2xvcmltZXRyeSAqLworICAgIEhETUlfQ09MT1JJTUVUUllfRVhURU5ERURfeHZZQ0M3MDkKK307CisjZW5kaWYgLyogX19IRE1JX1ZJREVPX0NPTE9SSU1FVFJZX18gKi8KKworI2lmbmRlZiBfX0hETUlfVklERU9fUElYRUxBU1BFQ1RSQVRJT19fCisjZGVmaW5lIF9fSERNSV9WSURFT19QSVhFTEFTUEVDVFJBVElPX18KKy8qKgorICogQGVudW0gUGl4ZWxBc3BlY3RSYXRpbworICogUGl4ZWwgYXNwZWN0IHJhdGlvIG9mIHZpZGVvIHN0cmVhbQorICovCitlbnVtIFBpeGVsQXNwZWN0UmF0aW8geworICAgIC8qKiBhcyBwaWN1dHJlIHBpeGVsIHJhdGlvICovCisgICAgSERNSV9QSVhFTF9SQVRJT19BU19QSUNUVVJFLAorICAgIC8qKiA0OjMgcGl4ZWwgcmF0aW8gKi8KKyAgICBIRE1JX1BJWEVMX1JBVElPXzRfMywKKyAgICAvKiogMTY6OSBwaXhlbCByYXRpbyAqLworICAgIEhETUlfUElYRUxfUkFUSU9fMTZfOQorfTsKKyNlbmRpZiAvKiBfX0hETUlfVklERU9fUElYRUxBU1BFQ1RSQVRJT19fICovCisKKyNpZm5kZWYgX19IRE1JX1ZJREVPX1BJWEVMRlJFUVVFTkNZX18KKyNkZWZpbmUgX19IRE1JX1ZJREVPX1BJWEVMRlJFUVVFTkNZX18KKy8qKgorICogQGVudW0gUGl4ZWxGcmVxCisgKiBQaXhlbCBGcmVxdWVuY3kKKyAqLworZW51bSBQaXhlbEZyZXEgeworICAgIC8qKiAyNS4yIE1IeiBwaXhlbCBmcmVxdWVuY3kgKi8KKyAgICBQSVhFTF9GUkVRXzI1XzIwMCA9IDI1MjAsCisgICAgLyoqIDI1LjE3NSBNSHogcGl4ZWwgZnJlcXVlbmN5ICovCisgICAgUElYRUxfRlJFUV8yNV8xNzUgPSAyNTE3LAorICAgIC8qKiAyNyBNSHogcGl4ZWwgZnJlcXVlbmN5ICovCisgICAgUElYRUxfRlJFUV8yNyA9IDI3MDAsCisgICAgLyoqIDI3LjAyNyBNSHogcGl4ZWwgZnJlcXVlbmN5ICovCisgICAgUElYRUxfRlJFUV8yN18wMjcgPSAyNzAyLAorICAgIC8qKiA1NCBNSHogcGl4ZWwgZnJlcXVlbmN5ICovCisgICAgUElYRUxfRlJFUV81NCA9IDU0MDAsCisgICAgLyoqIDU0LjA1NCBNSHogcGl4ZWwgZnJlcXVlbmN5ICovCisgICAgUElYRUxfRlJFUV81NF8wNTQgPSA1NDA1LAorICAgIC8qKiA3NC4yNSBNSHogcGl4ZWwgZnJlcXVlbmN5ICovCisgICAgUElYRUxfRlJFUV83NF8yNTAgPSA3NDI1LAorICAgIC8qKiA3NC4xNzYgTUh6IHBpeGVsIGZyZXF1ZW5jeSAqLworICAgIFBJWEVMX0ZSRVFfNzRfMTc2ID0gNzQxNywKKyAgICAvKiogMTQ4LjUgTUh6IHBpeGVsIGZyZXF1ZW5jeSAqLworICAgIFBJWEVMX0ZSRVFfMTQ4XzUwMCA9IDE0ODUwLAorICAgIC8qKiAxNDguMzUyIE1IeiBwaXhlbCBmcmVxdWVuY3kgKi8KKyAgICBQSVhFTF9GUkVRXzE0OF8zNTIgPSAxNDgzNSwKKyAgICAvKiogMTA4LjEwOCBNSHogcGl4ZWwgZnJlcXVlbmN5ICovCisgICAgUElYRUxfRlJFUV8xMDhfMTA4ID0gMTA4MTAsCisgICAgLyoqIDcyIE1IeiBwaXhlbCBmcmVxdWVuY3kgKi8KKyAgICBQSVhFTF9GUkVRXzcyID0gNzIwMCwKKyAgICAvKiogMjUgTUh6IHBpeGVsIGZyZXF1ZW5jeSAqLworICAgIFBJWEVMX0ZSRVFfMjUgPSAyNTAwLAorICAgIC8qKiA2NSBNSHogcGl4ZWwgZnJlcXVlbmN5ICovCisgICAgUElYRUxfRlJFUV82NSA9IDY1MDAsCisgICAgLyoqIDEwOCBNSHogcGl4ZWwgZnJlcXVlbmN5ICovCisgICAgUElYRUxfRlJFUV8xMDggPSAxMDgwMCwKKyAgICAvKiogMTYyIE1IeiBwaXhlbCBmcmVxdWVuY3kgKi8KKyAgICBQSVhFTF9GUkVRXzE2MiA9IDE2MjAwLAorICAgIC8qKiA1OS40IE1IeiBwaXhlbCBmcmVxdWVuY3kgKi8KKyAgICBQSVhFTF9GUkVRXzU5XzQwMCA9IDU5NDAsCit9OworI2VuZGlmIC8qIF9fSERNSV9WSURFT19QSVhFTEZSRVFVRU5DWV9fICovCisKKyNpZm5kZWYgX19IRE1JX1BIWV9QSVhFTEZSRVFVRU5DWV9fCisjZGVmaW5lIF9fSERNSV9QSFlfUElYRUxGUkVRVUVOQ1lfXworCisvKioKKyAqIEBlbnVtIFBIWUZyZXEKKyAqIFBIWSBGcmVxdWVuY3kKKyAqLworZW51bSBQSFlGcmVxIHsKKyAgICAvKiogTm90IHN1cHBvcnRlZCAqLworICAgIFBIWV9GUkVRX05PVF9TVVBQT1JURUQgPSAtMSwKKyAgICAvKiogMjUuMiBNSHogcGl4ZWwgZnJlcXVlbmN5ICovCisgICAgUEhZX0ZSRVFfMjVfMjAwID0gMCwKKyAgICAvKiogMjUuMTc1IE1IeiBwaXhlbCBmcmVxdWVuY3kgKi8KKyAgICBQSFlfRlJFUV8yNV8xNzUsCisgICAgLyoqIDI3IE1IeiBwaXhlbCBmcmVxdWVuY3kgKi8KKyAgICBQSFlfRlJFUV8yNywKKyAgICAvKiogMjcuMDI3IE1IeiBwaXhlbCBmcmVxdWVuY3kgKi8KKyAgICBQSFlfRlJFUV8yN18wMjcsCisgICAgLyoqIDU0IE1IeiBwaXhlbCBmcmVxdWVuY3kgKi8KKyAgICBQSFlfRlJFUV81NCwKKyAgICAvKiogNTQuMDU0IE1IeiBwaXhlbCBmcmVxdWVuY3kgKi8KKyAgICBQSFlfRlJFUV81NF8wNTQsCisgICAgLyoqIDc0LjI1IE1IeiBwaXhlbCBmcmVxdWVuY3kgKi8KKyAgICBQSFlfRlJFUV83NF8yNTAsCisgICAgLyoqIDc0LjE3NiBNSHogcGl4ZWwgZnJlcXVlbmN5ICovCisgICAgUEhZX0ZSRVFfNzRfMTc2LAorICAgIC8qKiAxNDguNSBNSHogcGl4ZWwgZnJlcXVlbmN5ICovCisgICAgUEhZX0ZSRVFfMTQ4XzUwMCwKKyAgICAvKiogMTQ4LjM1MiBNSHogcGl4ZWwgZnJlcXVlbmN5ICovCisgICAgUEhZX0ZSRVFfMTQ4XzM1MiwKKyAgICAvKiogMTA4LjEwOCBNSHogcGl4ZWwgZnJlcXVlbmN5ICovCisgICAgUEhZX0ZSRVFfMTA4XzEwOCwKKyAgICAvKiogNzIgTUh6IHBpeGVsIGZyZXF1ZW5jeSAqLworICAgIFBIWV9GUkVRXzcyLAorICAgIC8qKiAyNSBNSHogcGl4ZWwgZnJlcXVlbmN5ICovCisgICAgUEhZX0ZSRVFfMjUsCisgICAgLyoqIDY1IE1IeiBwaXhlbCBmcmVxdWVuY3kgKi8KKyAgICBQSFlfRlJFUV82NSwKKyAgICAvKiogMTA4IE1IeiBwaXhlbCBmcmVxdWVuY3kgKi8KKyAgICBQSFlfRlJFUV8xMDgsCisgICAgLyoqIDE2MiBNSHogcGl4ZWwgZnJlcXVlbmN5ICovCisgICAgUEhZX0ZSRVFfMTYyLAorICAgIC8qKiA1OS40IE1IeiBwaXhlbCBmcmVxdWVuY3kgKi8KKyAgICBQSFlfRlJFUV81OV80MDAsCit9OworCisjZW5kaWYgLyogX19IRE1JX1BIWV9QSVhFTEZSRVFVRU5DWV9fICovCisKKyNpZm5kZWYgX19IRE1JX1ZJREVPX1NPVVJDRV9fCisjZGVmaW5lIF9fSERNSV9WSURFT19TT1VSQ0VfXworLyoqCisgKiBAZW51bSBIRE1JVmlkZW9Tb3VyY2UKKyAqIFR5cGUgb2YgdmlkZW8gc291cmNlLgorICovCitlbnVtIEhETUlWaWRlb1NvdXJjZSB7CisgICAgLyoqIEludGVybmFsIFZpZGVvIFNvdXJjZSAqLworICAgIEhETUlfU09VUkNFX0lOVEVSTkFMLAorICAgIC8qKiBFeHRlcm5hbCBWaWRlbyBTb3VyY2UgKi8KKyAgICBIRE1JX1NPVVJDRV9FWFRFUk5BTCwKK307CisjZW5kaWYgLyogX19IRE1JX1ZJREVPX1NPVVJDRV9fICovCisKKyNpZm5kZWYgX19IRE1JXzNEX1ZJREVPX1NUUlVDVFVSRV9fCisjZGVmaW5lIF9fSERNSV8zRF9WSURFT19TVFJVQ1RVUkVfXworLyoqCisgKiBAZW51bSBIRE1JM0RWaWRlb1N0cnVjdHVyZQorICogVHlwZSBvZiAzRCBWaWRlbyBTdHJ1Y3R1cmUKKyAqLworZW51bSBIRE1JM0RWaWRlb1N0cnVjdHVyZSB7CisgICAgLyoqIDJEIFZpZGVvIEZvcm1hdCAgKi8KKyAgICBIRE1JXzJEX1ZJREVPX0ZPUk1BVCA9IC0xLAorICAgIC8qKiAzRCBGcmFtZSBQYWNraW5nIFN0cnVjdHVyZSAqLworICAgIEhETUlfM0RfRlBfRk9STUFUID0gMCwKKyAgICAvKiogM0QgRmllbGQgQWx0ZXJuYXRpdmUgU3RydWN0dXJlICAqLworICAgIEhETUlfM0RfRkFfRk9STUFULAorICAgIC8qKiAzRCBMaW5lIEFsdGVybmF0aXZlIFN0cnVjdHVyZSAqLworICAgIEhETUlfM0RfTEFfRk9STUFULAorICAgIC8qKiBTaWRlLWJ5LVNpZGUoRnVsbClTdHJ1Y3R1cmUgKi8KKyAgICBIRE1JXzNEX1NTRl9GT1JNQVQsCisgICAgLyoqIDNEIEwrRGVwdGggU3RydWN0dXJlICovCisgICAgSERNSV8zRF9MRF9GT1JNQVQsCisgICAgLyoqIDNEIEwrRGVwdGgrR3JhcGhpY3MgU3RydWN0dXJlICovCisgICAgSERNSV8zRF9MREdGWF9GT1JNQVQsCisgICAgLyoqIDNEIFRvcC1hbmQtQm90dG9tIFN0cnVjdHVyZSAqLworICAgIEhETUlfM0RfVEJfRk9STUFULAorICAgIC8qKiBIRE1JIFZJQyBTdHJ1Y3R1cmUgKGV4LiA0S3gySykgKi8KKyAgICBIRE1JX1ZJQ19GT1JNQVQsCisgICAgLyoqIFNpZGUtYnktU2lkZShIYWxmKVN0cnVjdHVyZSAqLworICAgIEhETUlfM0RfU1NIX0ZPUk1BVCwKK307CisjZW5kaWYgLyogX19IRE1JXzNEX1ZJREVPX1NUUlVDVFVSRV9fICovCisKKyNpZm5kZWYgX19IRE1JX1ZJREVPX1BBUkFNRVRFUl9fCisjZGVmaW5lIF9fSERNSV9WSURFT19QQVJBTUVURVJfXworLy8hIFN0cnVjdHVyZSBmb3IgSERNSSB2aWRlbworc3RydWN0IEhETUlWaWRlb1BhcmFtZXRlciB7CisgICAgLyoqIFZpZGVvIGludGVyZmFjZSAqLworICAgIGVudW0gSERNSU1vZGUgbW9kZTsKKyAgICAvKiogVmlkZW8gZm9ybWF0ICovCisgICAgZW51bSBWaWRlb0Zvcm1hdCByZXNvbHV0aW9uOworICAgIC8qKiBDb2xvciBzcGFjZSAqLworICAgIGVudW0gQ29sb3JTcGFjZSBjb2xvclNwYWNlOworICAgIC8qKiBDb2xvciBkZXB0aCAqLworICAgIGVudW0gQ29sb3JEZXB0aCBjb2xvckRlcHRoOworICAgIC8qKiBDb2xvcmltZXRyeSAqLworICAgIGVudW0gSERNSUNvbG9yaW1ldHJ5IGNvbG9yaW1ldHJ5OworICAgIC8qKiBQaXhlbCBhc3BlY3QgcmF0aW8gKi8KKyAgICBlbnVtIFBpeGVsQXNwZWN0UmF0aW8gcGl4ZWxBc3BlY3RSYXRpbzsKKyAgICAvKiogVmlkZW8gU291cmNlICovCisgICAgZW51bSBIRE1JVmlkZW9Tb3VyY2UgdmlkZW9TcmM7CisgICAgLyoqIDNEIFZpZGVvIFN0cnVjdHVyZSAqLworICAgIGVudW0gSERNSTNEVmlkZW9TdHJ1Y3R1cmUgaGRtaV8zZF9mb3JtYXQ7Cit9OworI2VuZGlmIC8qIF9fSERNSV9WSURFT19QQVJBTUVURVJfXyovCisKKyNpZmRlZiBfX2NwbHVzcGx1cworfQorI2VuZGlmCisjZW5kaWYgLyogX1ZJREVPX0hfICovCmRpZmYgLS1naXQgYS9leHlub3M0L2hhbC9pbmNsdWRlL3ZpZGVvZGV2Mi5oIGIvZXh5bm9zNC9oYWwvaW5jbHVkZS92aWRlb2RldjIuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40OGIzMDgxCi0tLSAvZGV2L251bGwKKysrIGIvZXh5bm9zNC9oYWwvaW5jbHVkZS92aWRlb2RldjIuaApAQCAtMCwwICsxLDIyMjcgQEAKKy8qCisgKiAgVmlkZW8gZm9yIExpbnV4IFR3byBoZWFkZXIgZmlsZQorICoKKyAqICBDb3B5cmlnaHQgKEMpIDE5OTktMjAwNyB0aGUgY29udHJpYnV0b3JzCisgKgorICogIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICogIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogIEFsdGVybmF0aXZlbHkgeW91IGNhbiByZWRpc3RyaWJ1dGUgdGhpcyBmaWxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUKKyAqICBCU0QgbGljZW5zZSBhcyBzdGF0ZWQgYmVsb3c6CisgKgorICogIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogIGFyZSBtZXQ6CisgKiAgMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAgMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4KKyAqICAgICB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCisgKiAgICAgZGlzdHJpYnV0aW9uLgorICogIDMuIFRoZSBuYW1lcyBvZiBpdHMgY29udHJpYnV0b3JzIG1heSBub3QgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUKKyAqICAgICBwcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4KKyAqICAgICBwZXJtaXNzaW9uLgorICoKKyAqICBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTCisgKiAgIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QKKyAqICBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IKKyAqICBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVAorICogIE9XTkVSIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAorICogIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRAorICogIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IKKyAqICBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GCisgKiAgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcKKyAqICBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMKKyAqICBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKyAqCisgKglIZWFkZXIgZmlsZSBmb3IgdjRsIG9yIFY0TDIgZHJpdmVycyBhbmQgYXBwbGljYXRpb25zCisgKiB3aXRoIHB1YmxpYyBBUEkuCisgKiBBbGwga2VybmVsLXNwZWNpZmljIHN0dWZmIHdlcmUgbW92ZWQgdG8gbWVkaWEvdjRsMi1kZXYuaCwgc28KKyAqIG5vICNpZiBfX0tFUk5FTCB0ZXN0cyBhcmUgYWxsb3dlZCBoZXJlCisgKgorICoJU2VlIGh0dHA6Ly9saW51eHR2Lm9yZyBmb3IgbW9yZSBpbmZvCisgKgorICoJQXV0aG9yOiBCaWxsIERpcmtzIDxiaWxsQHRoZWRpcmtzLm9yZz4KKyAqCQlKdXN0aW4gU2Nob2VtYW4KKyAqICAgICAgICAgICAgICBIYW5zIFZlcmt1aWwgPGh2ZXJrdWlsQHhzNGFsbC5ubD4KKyAqCQlldCBhbC4KKyAqLworI2lmbmRlZiBfX0xJTlVYX1ZJREVPREVWMl9ICisjZGVmaW5lIF9fTElOVVhfVklERU9ERVYyX0gKKworI2lmZGVmIF9fS0VSTkVMX18KKyNpbmNsdWRlIDxsaW51eC90aW1lLmg+ICAgICAvKiBuZWVkIHN0cnVjdCB0aW1ldmFsICovCisjZWxzZQorI2luY2x1ZGUgPHN5cy90aW1lLmg+CisjZW5kaWYKKyNpbmNsdWRlIDxsaW51eC9jb21waWxlci5oPgorI2luY2x1ZGUgPGxpbnV4L2lvY3RsLmg+CisjaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KKworLyoKKyAqIENvbW1vbiBzdHVmZiBmb3IgYm90aCBWNEwxIGFuZCBWNEwyCisgKiBNb3ZlZCBmcm9tIHZpZGVvZGV2LmgKKyAqLworI2RlZmluZSBWSURFT19NQVhfRlJBTUUgICAgICAgICAgICAgICAzMgorI2RlZmluZSBWSURFT19NQVhfUExBTkVTICAgICAgICAgICAgICAgOAorCisjaWZuZGVmIF9fS0VSTkVMX18KKworLyogVGhlc2UgZGVmaW5lcyBhcmUgVjRMMSBzcGVjaWZpYyBhbmQgc2hvdWxkIG5vdCBiZSB1c2VkIHdpdGggdGhlIFY0TDIgQVBJIQorICAgVGhleSB3aWxsIGJlIHJlbW92ZWQgZnJvbSB0aGlzIGhlYWRlciBpbiB0aGUgZnV0dXJlLiAqLworCisjZGVmaW5lIFZJRF9UWVBFX0NBUFRVUkUJMQkvKiBDYW4gY2FwdHVyZSAqLworI2RlZmluZSBWSURfVFlQRV9UVU5FUgkJMgkvKiBDYW4gdHVuZSAqLworI2RlZmluZSBWSURfVFlQRV9URUxFVEVYVAk0CS8qIERvZXMgdGVsZXRleHQgKi8KKyNkZWZpbmUgVklEX1RZUEVfT1ZFUkxBWQk4CS8qIE92ZXJsYXkgb250byBmcmFtZSBidWZmZXIgKi8KKyNkZWZpbmUgVklEX1RZUEVfQ0hST01BS0VZCTE2CS8qIE92ZXJsYXkgYnkgY2hyb21ha2V5ICovCisjZGVmaW5lIFZJRF9UWVBFX0NMSVBQSU5HCTMyCS8qIENhbiBjbGlwICovCisjZGVmaW5lIFZJRF9UWVBFX0ZSQU1FUkFNCTY0CS8qIFVzZXMgdGhlIGZyYW1lIGJ1ZmZlciBtZW1vcnkgKi8KKyNkZWZpbmUgVklEX1RZUEVfU0NBTEVTCQkxMjgJLyogU2NhbGFibGUgKi8KKyNkZWZpbmUgVklEX1RZUEVfTU9OT0NIUk9NRQkyNTYJLyogTW9ub2Nocm9tZSBvbmx5ICovCisjZGVmaW5lIFZJRF9UWVBFX1NVQkNBUFRVUkUJNTEyCS8qIENhbiBjYXB0dXJlIHN1YmFyZWFzIG9mIHRoZSBpbWFnZSAqLworI2RlZmluZSBWSURfVFlQRV9NUEVHX0RFQ09ERVIJMTAyNAkvKiBDYW4gZGVjb2RlIE1QRUcgc3RyZWFtcyAqLworI2RlZmluZSBWSURfVFlQRV9NUEVHX0VOQ09ERVIJMjA0OAkvKiBDYW4gZW5jb2RlIE1QRUcgc3RyZWFtcyAqLworI2RlZmluZSBWSURfVFlQRV9NSlBFR19ERUNPREVSCTQwOTYJLyogQ2FuIGRlY29kZSBNSlBFRyBzdHJlYW1zICovCisjZGVmaW5lIFZJRF9UWVBFX01KUEVHX0VOQ09ERVIJODE5MgkvKiBDYW4gZW5jb2RlIE1KUEVHIHN0cmVhbXMgKi8KKyNlbmRpZgorCisvKgorICoJTSBJIFMgQyBFIEwgTCBBIE4gRSBPIFUgUworICovCisKKy8qICBGb3VyLWNoYXJhY3Rlci1jb2RlIChGT1VSQ0MpICovCisjZGVmaW5lIHY0bDJfZm91cmNjKGEsIGIsIGMsIGQpXAorCSgoX191MzIpKGEpIHwgKChfX3UzMikoYikgPDwgOCkgfCAoKF9fdTMyKShjKSA8PCAxNikgfCAoKF9fdTMyKShkKSA8PCAyNCkpCisKKy8qCisgKglFIE4gVSBNIFMKKyAqLworZW51bSB2NGwyX2ZpZWxkIHsKKwlWNEwyX0ZJRUxEX0FOWSAgICAgICAgICAgPSAwLCAvKiBkcml2ZXIgY2FuIGNob29zZSBmcm9tIG5vbmUsCisJCQkJCSB0b3AsIGJvdHRvbSwgaW50ZXJsYWNlZAorCQkJCQkgZGVwZW5kaW5nIG9uIHdoYXRldmVyIGl0IHRoaW5rcworCQkJCQkgaXMgYXBwcm94aW1hdGUgLi4uICovCisJVjRMMl9GSUVMRF9OT05FICAgICAgICAgID0gMSwgLyogdGhpcyBkZXZpY2UgaGFzIG5vIGZpZWxkcyAuLi4gKi8KKwlWNEwyX0ZJRUxEX1RPUCAgICAgICAgICAgPSAyLCAvKiB0b3AgZmllbGQgb25seSAqLworCVY0TDJfRklFTERfQk9UVE9NICAgICAgICA9IDMsIC8qIGJvdHRvbSBmaWVsZCBvbmx5ICovCisJVjRMMl9GSUVMRF9JTlRFUkxBQ0VEICAgID0gNCwgLyogYm90aCBmaWVsZHMgaW50ZXJsYWNlZCAqLworCVY0TDJfRklFTERfU0VRX1RCICAgICAgICA9IDUsIC8qIGJvdGggZmllbGRzIHNlcXVlbnRpYWwgaW50byBvbmUKKwkJCQkJIGJ1ZmZlciwgdG9wLWJvdHRvbSBvcmRlciAqLworCVY0TDJfRklFTERfU0VRX0JUICAgICAgICA9IDYsIC8qIHNhbWUgYXMgYWJvdmUgKyBib3R0b20tdG9wIG9yZGVyICovCisJVjRMMl9GSUVMRF9BTFRFUk5BVEUgICAgID0gNywgLyogYm90aCBmaWVsZHMgYWx0ZXJuYXRpbmcgaW50bworCQkJCQkgc2VwYXJhdGUgYnVmZmVycyAqLworCVY0TDJfRklFTERfSU5URVJMQUNFRF9UQiA9IDgsIC8qIGJvdGggZmllbGRzIGludGVybGFjZWQsIHRvcCBmaWVsZAorCQkJCQkgZmlyc3QgYW5kIHRoZSB0b3AgZmllbGQgaXMKKwkJCQkJIHRyYW5zbWl0dGVkIGZpcnN0ICovCisJVjRMMl9GSUVMRF9JTlRFUkxBQ0VEX0JUID0gOSwgLyogYm90aCBmaWVsZHMgaW50ZXJsYWNlZCwgdG9wIGZpZWxkCisJCQkJCSBmaXJzdCBhbmQgdGhlIGJvdHRvbSBmaWVsZCBpcworCQkJCQkgdHJhbnNtaXR0ZWQgZmlyc3QgKi8KK307CisjZGVmaW5lIFY0TDJfRklFTERfSEFTX1RPUChmaWVsZCkJXAorCSgoZmllbGQpID09IFY0TDJfRklFTERfVE9QIAl8fFwKKwkgKGZpZWxkKSA9PSBWNEwyX0ZJRUxEX0lOVEVSTEFDRUQgfHxcCisJIChmaWVsZCkgPT0gVjRMMl9GSUVMRF9JTlRFUkxBQ0VEX1RCIHx8XAorCSAoZmllbGQpID09IFY0TDJfRklFTERfSU5URVJMQUNFRF9CVCB8fFwKKwkgKGZpZWxkKSA9PSBWNEwyX0ZJRUxEX1NFUV9UQgl8fFwKKwkgKGZpZWxkKSA9PSBWNEwyX0ZJRUxEX1NFUV9CVCkKKyNkZWZpbmUgVjRMMl9GSUVMRF9IQVNfQk9UVE9NKGZpZWxkKQlcCisJKChmaWVsZCkgPT0gVjRMMl9GSUVMRF9CT1RUT00gCXx8XAorCSAoZmllbGQpID09IFY0TDJfRklFTERfSU5URVJMQUNFRCB8fFwKKwkgKGZpZWxkKSA9PSBWNEwyX0ZJRUxEX0lOVEVSTEFDRURfVEIgfHxcCisJIChmaWVsZCkgPT0gVjRMMl9GSUVMRF9JTlRFUkxBQ0VEX0JUIHx8XAorCSAoZmllbGQpID09IFY0TDJfRklFTERfU0VRX1RCCXx8XAorCSAoZmllbGQpID09IFY0TDJfRklFTERfU0VRX0JUKQorI2RlZmluZSBWNEwyX0ZJRUxEX0hBU19CT1RIKGZpZWxkKQlcCisJKChmaWVsZCkgPT0gVjRMMl9GSUVMRF9JTlRFUkxBQ0VEIHx8XAorCSAoZmllbGQpID09IFY0TDJfRklFTERfSU5URVJMQUNFRF9UQiB8fFwKKwkgKGZpZWxkKSA9PSBWNEwyX0ZJRUxEX0lOVEVSTEFDRURfQlQgfHxcCisJIChmaWVsZCkgPT0gVjRMMl9GSUVMRF9TRVFfVEIgfHxcCisJIChmaWVsZCkgPT0gVjRMMl9GSUVMRF9TRVFfQlQpCisKK2VudW0gdjRsMl9idWZfdHlwZSB7CisJVjRMMl9CVUZfVFlQRV9WSURFT19DQVBUVVJFICAgICAgICA9IDEsCisJVjRMMl9CVUZfVFlQRV9WSURFT19PVVRQVVQgICAgICAgICA9IDIsCisJVjRMMl9CVUZfVFlQRV9WSURFT19PVkVSTEFZICAgICAgICA9IDMsCisJVjRMMl9CVUZfVFlQRV9WQklfQ0FQVFVSRSAgICAgICAgICA9IDQsCisJVjRMMl9CVUZfVFlQRV9WQklfT1VUUFVUICAgICAgICAgICA9IDUsCisJVjRMMl9CVUZfVFlQRV9TTElDRURfVkJJX0NBUFRVUkUgICA9IDYsCisJVjRMMl9CVUZfVFlQRV9TTElDRURfVkJJX09VVFBVVCAgICA9IDcsCisjaWYgMQorCS8qIEV4cGVyaW1lbnRhbCAqLworCVY0TDJfQlVGX1RZUEVfVklERU9fT1VUUFVUX09WRVJMQVkgPSA4LAorI2VuZGlmCisJVjRMMl9CVUZfVFlQRV9WSURFT19DQVBUVVJFX01QTEFORSA9IDksCisJVjRMMl9CVUZfVFlQRV9WSURFT19PVVRQVVRfTVBMQU5FICA9IDEwLAorCVY0TDJfQlVGX1RZUEVfUFJJVkFURSAgICAgICAgICAgICAgPSAweDgwLAorfTsKKworI2RlZmluZSBWNEwyX1RZUEVfSVNfTVVMVElQTEFOQVIodHlwZSkJCQlcCisJKCh0eXBlKSA9PSBWNEwyX0JVRl9UWVBFX1ZJREVPX0NBUFRVUkVfTVBMQU5FCVwKKwkgfHwgKHR5cGUpID09IFY0TDJfQlVGX1RZUEVfVklERU9fT1VUUFVUX01QTEFORSkKKworI2RlZmluZSBWNEwyX1RZUEVfSVNfT1VUUFVUKHR5cGUpCQkJCVwKKwkoKHR5cGUpID09IFY0TDJfQlVGX1RZUEVfVklERU9fT1VUUFVUCQkJXAorCSB8fCAodHlwZSkgPT0gVjRMMl9CVUZfVFlQRV9WSURFT19PVVRQVVRfTVBMQU5FCQlcCisJIHx8ICh0eXBlKSA9PSBWNEwyX0JVRl9UWVBFX1ZJREVPX09WRVJMQVkJCVwKKwkgfHwgKHR5cGUpID09IFY0TDJfQlVGX1RZUEVfVklERU9fT1VUUFVUX09WRVJMQVkJXAorCSB8fCAodHlwZSkgPT0gVjRMMl9CVUZfVFlQRV9WQklfT1VUUFVUCQkJXAorCSB8fCAodHlwZSkgPT0gVjRMMl9CVUZfVFlQRV9TTElDRURfVkJJX09VVFBVVCkKKworZW51bSB2NGwyX3R1bmVyX3R5cGUgeworCVY0TDJfVFVORVJfUkFESU8JICAgICA9IDEsCisJVjRMMl9UVU5FUl9BTkFMT0dfVFYJICAgICA9IDIsCisJVjRMMl9UVU5FUl9ESUdJVEFMX1RWCSAgICAgPSAzLAorfTsKKworZW51bSB2NGwyX21lbW9yeSB7CisJVjRMMl9NRU1PUllfTU1BUCAgICAgICAgICAgICA9IDEsCisJVjRMMl9NRU1PUllfVVNFUlBUUiAgICAgICAgICA9IDIsCisJVjRMMl9NRU1PUllfT1ZFUkxBWSAgICAgICAgICA9IDMsCit9OworCisvKiBzZWUgYWxzbyBodHRwOi8vdmVrdG9yLnRoZW9yZW0uY2EvZ3JhcGhpY3MveWNiY3IvICovCitlbnVtIHY0bDJfY29sb3JzcGFjZSB7CisJLyogSVRVLVIgNjAxIC0tIGJyb2FkY2FzdCBOVFNDL1BBTCAqLworCVY0TDJfQ09MT1JTUEFDRV9TTVBURTE3ME0gICAgID0gMSwKKworCS8qIDExMjUtTGluZSAoVVMpIEhEVFYgKi8KKwlWNEwyX0NPTE9SU1BBQ0VfU01QVEUyNDBNICAgICA9IDIsCisKKwkvKiBIRCBhbmQgbW9kZXJuIGNhcHR1cmVzLiAqLworCVY0TDJfQ09MT1JTUEFDRV9SRUM3MDkgICAgICAgID0gMywKKworCS8qIGJyb2tlbiBCVDg3OCBleHRlbnRzICg2MDEsIGx1bWEgcmFuZ2UgMTYtMjUzIGluc3RlYWQgb2YgMTYtMjM1KSAqLworCVY0TDJfQ09MT1JTUEFDRV9CVDg3OCAgICAgICAgID0gNCwKKworCS8qIFRoZXNlIHNob3VsZCBiZSB1c2VmdWwuICBBc3N1bWUgNjAxIGV4dGVudHMuICovCisJVjRMMl9DT0xPUlNQQUNFXzQ3MF9TWVNURU1fTSAgPSA1LAorCVY0TDJfQ09MT1JTUEFDRV80NzBfU1lTVEVNX0JHID0gNiwKKworCS8qIEkga25vdyB0aGVyZSB3aWxsIGJlIGNhbWVyYXMgdGhhdCBzZW5kIHRoaXMuICBTbywgdGhpcyBpcworCSAqIHVuc3BlY2lmaWVkIGNocm9tYXRpY2l0aWVzIGFuZCBmdWxsIDAtMjU1IG9uIGVhY2ggb2YgdGhlCisJICogWSdDYkNyIGNvbXBvbmVudHMKKwkgKi8KKwlWNEwyX0NPTE9SU1BBQ0VfSlBFRyAgICAgICAgICA9IDcsCisKKwkvKiBGb3IgUkdCIGNvbG91cnNwYWNlcywgdGhpcyBpcyBwcm9iYWJseSBhIGdvb2Qgc3RhcnQuICovCisJVjRMMl9DT0xPUlNQQUNFX1NSR0IgICAgICAgICAgPSA4LAorfTsKKworZW51bSB2NGwyX3ByaW9yaXR5IHsKKwlWNEwyX1BSSU9SSVRZX1VOU0VUICAgICAgID0gMCwgIC8qIG5vdCBpbml0aWFsaXplZCAqLworCVY0TDJfUFJJT1JJVFlfQkFDS0dST1VORCAgPSAxLAorCVY0TDJfUFJJT1JJVFlfSU5URVJBQ1RJVkUgPSAyLAorCVY0TDJfUFJJT1JJVFlfUkVDT1JEICAgICAgPSAzLAorCVY0TDJfUFJJT1JJVFlfREVGQVVMVCAgICAgPSBWNEwyX1BSSU9SSVRZX0lOVEVSQUNUSVZFLAorfTsKKworc3RydWN0IHY0bDJfcmVjdCB7CisJX19zMzIgICBsZWZ0OworCV9fczMyICAgdG9wOworCV9fczMyICAgd2lkdGg7CisJX19zMzIgICBoZWlnaHQ7Cit9OworCitzdHJ1Y3QgdjRsMl9mcmFjdCB7CisJX191MzIgICBudW1lcmF0b3I7CisJX191MzIgICBkZW5vbWluYXRvcjsKK307CisKKy8qCisgKglEIFIgSSBWIEUgUiAgIEMgQSBQIEEgQiBJIEwgSSBUIEkgRSBTCisgKi8KK3N0cnVjdCB2NGwyX2NhcGFiaWxpdHkgeworCV9fdTgJZHJpdmVyWzE2XTsJLyogaS5lLiAiYnR0diIgKi8KKwlfX3U4CWNhcmRbMzJdOwkvKiBpLmUuICJIYXVwcGF1Z2UgV2luVFYiICovCisJX191OAlidXNfaW5mb1szMl07CS8qICJQQ0k6IiArIHBjaV9uYW1lKHBjaV9kZXYpICovCisJX191MzIgICB2ZXJzaW9uOyAgICAgICAgLyogc2hvdWxkIHVzZSBLRVJORUxfVkVSU0lPTigpICovCisJX191MzIJY2FwYWJpbGl0aWVzOwkvKiBEZXZpY2UgY2FwYWJpbGl0aWVzICovCisJX191MzIJcmVzZXJ2ZWRbNF07Cit9OworCisvKiBWYWx1ZXMgZm9yICdjYXBhYmlsaXRpZXMnIGZpZWxkICovCisjZGVmaW5lIFY0TDJfQ0FQX1ZJREVPX0NBUFRVUkUJCTB4MDAwMDAwMDEgIC8qIElzIGEgdmlkZW8gY2FwdHVyZSBkZXZpY2UgKi8KKyNkZWZpbmUgVjRMMl9DQVBfVklERU9fT1VUUFVUCQkweDAwMDAwMDAyICAvKiBJcyBhIHZpZGVvIG91dHB1dCBkZXZpY2UgKi8KKyNkZWZpbmUgVjRMMl9DQVBfVklERU9fT1ZFUkxBWQkJMHgwMDAwMDAwNCAgLyogQ2FuIGRvIHZpZGVvIG92ZXJsYXkgKi8KKyNkZWZpbmUgVjRMMl9DQVBfVkJJX0NBUFRVUkUJCTB4MDAwMDAwMTAgIC8qIElzIGEgcmF3IFZCSSBjYXB0dXJlIGRldmljZSAqLworI2RlZmluZSBWNEwyX0NBUF9WQklfT1VUUFVUCQkweDAwMDAwMDIwICAvKiBJcyBhIHJhdyBWQkkgb3V0cHV0IGRldmljZSAqLworI2RlZmluZSBWNEwyX0NBUF9TTElDRURfVkJJX0NBUFRVUkUJMHgwMDAwMDA0MCAgLyogSXMgYSBzbGljZWQgVkJJIGNhcHR1cmUgZGV2aWNlICovCisjZGVmaW5lIFY0TDJfQ0FQX1NMSUNFRF9WQklfT1VUUFVUCTB4MDAwMDAwODAgIC8qIElzIGEgc2xpY2VkIFZCSSBvdXRwdXQgZGV2aWNlICovCisjZGVmaW5lIFY0TDJfQ0FQX1JEU19DQVBUVVJFCQkweDAwMDAwMTAwICAvKiBSRFMgZGF0YSBjYXB0dXJlICovCisjZGVmaW5lIFY0TDJfQ0FQX1ZJREVPX09VVFBVVF9PVkVSTEFZCTB4MDAwMDAyMDAgIC8qIENhbiBkbyB2aWRlbyBvdXRwdXQgb3ZlcmxheSAqLworI2RlZmluZSBWNEwyX0NBUF9IV19GUkVRX1NFRUsJCTB4MDAwMDA0MDAgIC8qIENhbiBkbyBoYXJkd2FyZSBmcmVxdWVuY3kgc2VlayAgKi8KKyNkZWZpbmUgVjRMMl9DQVBfUkRTX09VVFBVVAkJMHgwMDAwMDgwMCAgLyogSXMgYW4gUkRTIGVuY29kZXIgKi8KKworLyogSXMgYSB2aWRlbyBjYXB0dXJlIGRldmljZSB0aGF0IHN1cHBvcnRzIG11bHRpcGxhbmFyIGZvcm1hdHMgKi8KKyNkZWZpbmUgVjRMMl9DQVBfVklERU9fQ0FQVFVSRV9NUExBTkUJMHgwMDAwMTAwMAorLyogSXMgYSB2aWRlbyBvdXRwdXQgZGV2aWNlIHRoYXQgc3VwcG9ydHMgbXVsdGlwbGFuYXIgZm9ybWF0cyAqLworI2RlZmluZSBWNEwyX0NBUF9WSURFT19PVVRQVVRfTVBMQU5FCTB4MDAwMDIwMDAKKworI2RlZmluZSBWNEwyX0NBUF9UVU5FUgkJCTB4MDAwMTAwMDAgIC8qIGhhcyBhIHR1bmVyICovCisjZGVmaW5lIFY0TDJfQ0FQX0FVRElPCQkJMHgwMDAyMDAwMCAgLyogaGFzIGF1ZGlvIHN1cHBvcnQgKi8KKyNkZWZpbmUgVjRMMl9DQVBfUkFESU8JCQkweDAwMDQwMDAwICAvKiBpcyBhIHJhZGlvIGRldmljZSAqLworI2RlZmluZSBWNEwyX0NBUF9NT0RVTEFUT1IJCTB4MDAwODAwMDAgIC8qIGhhcyBhIG1vZHVsYXRvciAqLworCisjZGVmaW5lIFY0TDJfQ0FQX1JFQURXUklURSAgICAgICAgICAgICAgMHgwMTAwMDAwMCAgLyogcmVhZC93cml0ZSBzeXN0ZW1jYWxscyAqLworI2RlZmluZSBWNEwyX0NBUF9BU1lOQ0lPICAgICAgICAgICAgICAgIDB4MDIwMDAwMDAgIC8qIGFzeW5jIEkvTyAqLworI2RlZmluZSBWNEwyX0NBUF9TVFJFQU1JTkcgICAgICAgICAgICAgIDB4MDQwMDAwMDAgIC8qIHN0cmVhbWluZyBJL08gaW9jdGxzICovCisKKy8qCisgKglWIEkgRCBFIE8gICBJIE0gQSBHIEUgICBGIE8gUiBNIEEgVAorICovCitzdHJ1Y3QgdjRsMl9waXhfZm9ybWF0IHsKKwlfX3UzMiAgICAgICAgIAkJd2lkdGg7CisJX191MzIJCQloZWlnaHQ7CisJX191MzIJCQlwaXhlbGZvcm1hdDsKKwllbnVtIHY0bDJfZmllbGQgIAlmaWVsZDsKKwlfX3UzMiAgICAgICAgICAgIAlieXRlc3BlcmxpbmU7CS8qIGZvciBwYWRkaW5nLCB6ZXJvIGlmIHVudXNlZCAqLworCV9fdTMyICAgICAgICAgIAkJc2l6ZWltYWdlOworCWVudW0gdjRsMl9jb2xvcnNwYWNlCWNvbG9yc3BhY2U7CisJX191MzIJCQlwcml2OwkJLyogcHJpdmF0ZSBkYXRhLCBkZXBlbmRzIG9uIHBpeGVsZm9ybWF0ICovCit9OworCisvKiAgICAgIFBpeGVsIGZvcm1hdCAgICAgICAgIEZPVVJDQyAgICAgICAgICAgICAgICAgICAgICAgICAgZGVwdGggIERlc2NyaXB0aW9uICAqLworCisvKiBSR0IgZm9ybWF0cyAqLworI2RlZmluZSBWNEwyX1BJWF9GTVRfUkdCMzMyICB2NGwyX2ZvdXJjYygnUicsICdHJywgJ0InLCAnMScpIC8qICA4ICBSR0ItMy0zLTIgICAgICovCisjZGVmaW5lIFY0TDJfUElYX0ZNVF9SR0I0NDQgIHY0bDJfZm91cmNjKCdSJywgJzQnLCAnNCcsICc0JykgLyogMTYgIHh4eHhycnJyIGdnZ2diYmJiICovCisjZGVmaW5lIFY0TDJfUElYX0ZNVF9SR0I1NTUgIHY0bDJfZm91cmNjKCdSJywgJ0cnLCAnQicsICdPJykgLyogMTYgIFJHQi01LTUtNSAgICAgKi8KKyNkZWZpbmUgVjRMMl9QSVhfRk1UX1JHQjU2NSAgdjRsMl9mb3VyY2MoJ1InLCAnRycsICdCJywgJ1AnKSAvKiAxNiAgUkdCLTUtNi01ICAgICAqLworI2RlZmluZSBWNEwyX1BJWF9GTVRfUkdCNTU1WCB2NGwyX2ZvdXJjYygnUicsICdHJywgJ0InLCAnUScpIC8qIDE2ICBSR0ItNS01LTUgQkUgICovCisjZGVmaW5lIFY0TDJfUElYX0ZNVF9SR0I1NjVYIHY0bDJfZm91cmNjKCdSJywgJ0cnLCAnQicsICdSJykgLyogMTYgIFJHQi01LTYtNSBCRSAgKi8KKyNkZWZpbmUgVjRMMl9QSVhfRk1UX0JHUjY2NiAgdjRsMl9mb3VyY2MoJ0InLCAnRycsICdSJywgJ0gnKSAvKiAxOCAgQkdSLTYtNi02CSAgKi8KKyNkZWZpbmUgVjRMMl9QSVhfRk1UX0JHUjI0ICAgdjRsMl9mb3VyY2MoJ0InLCAnRycsICdSJywgJzMnKSAvKiAyNCAgQkdSLTgtOC04ICAgICAqLworI2RlZmluZSBWNEwyX1BJWF9GTVRfUkdCMjQgICB2NGwyX2ZvdXJjYygnUicsICdHJywgJ0InLCAnMycpIC8qIDI0ICBSR0ItOC04LTggICAgICovCisjZGVmaW5lIFY0TDJfUElYX0ZNVF9CR1IzMiAgIHY0bDJfZm91cmNjKCdCJywgJ0cnLCAnUicsICc0JykgLyogMzIgIEJHUi04LTgtOC04ICAgKi8KKyNkZWZpbmUgVjRMMl9QSVhfRk1UX1JHQjMyICAgdjRsMl9mb3VyY2MoJ1InLCAnRycsICdCJywgJzQnKSAvKiAzMiAgUkdCLTgtOC04LTggICAqLworCisvKiBHcmV5IGZvcm1hdHMgKi8KKyNkZWZpbmUgVjRMMl9QSVhfRk1UX0dSRVkgICAgdjRsMl9mb3VyY2MoJ0cnLCAnUicsICdFJywgJ1knKSAvKiAgOCAgR3JleXNjYWxlICAgICAqLworI2RlZmluZSBWNEwyX1BJWF9GTVRfWTQgICAgICB2NGwyX2ZvdXJjYygnWScsICcwJywgJzQnLCAnICcpIC8qICA0ICBHcmV5c2NhbGUgICAgICovCisjZGVmaW5lIFY0TDJfUElYX0ZNVF9ZNiAgICAgIHY0bDJfZm91cmNjKCdZJywgJzAnLCAnNicsICcgJykgLyogIDYgIEdyZXlzY2FsZSAgICAgKi8KKyNkZWZpbmUgVjRMMl9QSVhfRk1UX1kxMCAgICAgdjRsMl9mb3VyY2MoJ1knLCAnMScsICcwJywgJyAnKSAvKiAxMCAgR3JleXNjYWxlICAgICAqLworI2RlZmluZSBWNEwyX1BJWF9GTVRfWTEyICAgICB2NGwyX2ZvdXJjYygnWScsICcxJywgJzInLCAnICcpIC8qIDEyICBHcmV5c2NhbGUgICAgICovCisjZGVmaW5lIFY0TDJfUElYX0ZNVF9ZMTYgICAgIHY0bDJfZm91cmNjKCdZJywgJzEnLCAnNicsICcgJykgLyogMTYgIEdyZXlzY2FsZSAgICAgKi8KKworLyogR3JleSBiaXQtcGFja2VkIGZvcm1hdHMgKi8KKyNkZWZpbmUgVjRMMl9QSVhfRk1UX1kxMEJQQUNLICAgIHY0bDJfZm91cmNjKCdZJywgJzEnLCAnMCcsICdCJykgLyogMTAgIEdyZXlzY2FsZSBiaXQtcGFja2VkICovCisKKy8qIFBhbGV0dGUgZm9ybWF0cyAqLworI2RlZmluZSBWNEwyX1BJWF9GTVRfUEFMOCAgICB2NGwyX2ZvdXJjYygnUCcsICdBJywgJ0wnLCAnOCcpIC8qICA4ICA4LWJpdCBwYWxldHRlICovCisKKy8qIEx1bWluYW5jZStDaHJvbWluYW5jZSBmb3JtYXRzICovCisjZGVmaW5lIFY0TDJfUElYX0ZNVF9ZVlU0MTAgIHY0bDJfZm91cmNjKCdZJywgJ1YnLCAnVScsICc5JykgLyogIDkgIFlWVSA0OjE6MCAgICAgKi8KKyNkZWZpbmUgVjRMMl9QSVhfRk1UX1lWVTQyMCAgdjRsMl9mb3VyY2MoJ1knLCAnVicsICcxJywgJzInKSAvKiAxMiAgWVZVIDQ6MjowICAgICAqLworI2RlZmluZSBWNEwyX1BJWF9GTVRfWVVZViAgICB2NGwyX2ZvdXJjYygnWScsICdVJywgJ1knLCAnVicpIC8qIDE2ICBZVVYgNDoyOjIgICAgICovCisjZGVmaW5lIFY0TDJfUElYX0ZNVF9ZWVVWICAgIHY0bDJfZm91cmNjKCdZJywgJ1knLCAnVScsICdWJykgLyogMTYgIFlVViA0OjI6MiAgICAgKi8KKyNkZWZpbmUgVjRMMl9QSVhfRk1UX1lWWVUgICAgdjRsMl9mb3VyY2MoJ1knLCAnVicsICdZJywgJ1UnKSAvKiAxNiBZVlUgNDoyOjIgKi8KKyNkZWZpbmUgVjRMMl9QSVhfRk1UX1VZVlkgICAgdjRsMl9mb3VyY2MoJ1UnLCAnWScsICdWJywgJ1knKSAvKiAxNiAgWVVWIDQ6MjoyICAgICAqLworI2RlZmluZSBWNEwyX1BJWF9GTVRfVllVWSAgICB2NGwyX2ZvdXJjYygnVicsICdZJywgJ1UnLCAnWScpIC8qIDE2ICBZVVYgNDoyOjIgICAgICovCisjZGVmaW5lIFY0TDJfUElYX0ZNVF9ZVVY0MjJQIHY0bDJfZm91cmNjKCc0JywgJzInLCAnMicsICdQJykgLyogMTYgIFlWVTQyMiBwbGFuYXIgKi8KKyNkZWZpbmUgVjRMMl9QSVhfRk1UX1lVVjQxMVAgdjRsMl9mb3VyY2MoJzQnLCAnMScsICcxJywgJ1AnKSAvKiAxNiAgWVZVNDExIHBsYW5hciAqLworI2RlZmluZSBWNEwyX1BJWF9GTVRfWTQxUCAgICB2NGwyX2ZvdXJjYygnWScsICc0JywgJzEnLCAnUCcpIC8qIDEyICBZVVYgNDoxOjEgICAgICovCisjZGVmaW5lIFY0TDJfUElYX0ZNVF9ZVVY0NDQgIHY0bDJfZm91cmNjKCdZJywgJzQnLCAnNCcsICc0JykgLyogMTYgIHh4eHh5eXl5IHV1dXV2dnZ2ICovCisjZGVmaW5lIFY0TDJfUElYX0ZNVF9ZVVY1NTUgIHY0bDJfZm91cmNjKCdZJywgJ1UnLCAnVicsICdPJykgLyogMTYgIFlVVi01LTUtNSAgICAgKi8KKyNkZWZpbmUgVjRMMl9QSVhfRk1UX1lVVjU2NSAgdjRsMl9mb3VyY2MoJ1knLCAnVScsICdWJywgJ1AnKSAvKiAxNiAgWVVWLTUtNi01ICAgICAqLworI2RlZmluZSBWNEwyX1BJWF9GTVRfWVVWMzIgICB2NGwyX2ZvdXJjYygnWScsICdVJywgJ1YnLCAnNCcpIC8qIDMyICBZVVYtOC04LTgtOCAgICovCisjZGVmaW5lIFY0TDJfUElYX0ZNVF9ZVVY0MTAgIHY0bDJfZm91cmNjKCdZJywgJ1UnLCAnVicsICc5JykgLyogIDkgIFlVViA0OjE6MCAgICAgKi8KKyNkZWZpbmUgVjRMMl9QSVhfRk1UX1lVVjQyMCAgdjRsMl9mb3VyY2MoJ1knLCAnVScsICcxJywgJzInKSAvKiAxMiAgWVVWIDQ6MjowICAgICAqLworI2RlZmluZSBWNEwyX1BJWF9GTVRfSEkyNDAgICB2NGwyX2ZvdXJjYygnSCcsICdJJywgJzInLCAnNCcpIC8qICA4ICA4LWJpdCBjb2xvciAgICovCisjZGVmaW5lIFY0TDJfUElYX0ZNVF9ITTEyICAgIHY0bDJfZm91cmNjKCdIJywgJ00nLCAnMScsICcyJykgLyogIDggIFlVViA0OjI6MCAxNngxNiBtYWNyb2Jsb2NrcyAqLworI2RlZmluZSBWNEwyX1BJWF9GTVRfTTQyMCAgICB2NGwyX2ZvdXJjYygnTScsICc0JywgJzInLCAnMCcpIC8qIDEyICBZVVYgNDoyOjAgMiBsaW5lcyB5LCAxIGxpbmUgdXYgaW50ZXJsZWF2ZWQgKi8KKworLyogdHdvIHBsYW5lcyAtLSBvbmUgWSwgb25lIENyICsgQ2IgaW50ZXJsZWF2ZWQgICovCisjZGVmaW5lIFY0TDJfUElYX0ZNVF9OVjEyICAgIHY0bDJfZm91cmNjKCdOJywgJ1YnLCAnMScsICcyJykgLyogMTIgIFkvQ2JDciA0OjI6MCAgKi8KKyNkZWZpbmUgVjRMMl9QSVhfRk1UX05WMjEgICAgdjRsMl9mb3VyY2MoJ04nLCAnVicsICcyJywgJzEnKSAvKiAxMiAgWS9DckNiIDQ6MjowICAqLworI2RlZmluZSBWNEwyX1BJWF9GTVRfTlYxNiAgICB2NGwyX2ZvdXJjYygnTicsICdWJywgJzEnLCAnNicpIC8qIDE2ICBZL0NiQ3IgNDoyOjIgICovCisjZGVmaW5lIFY0TDJfUElYX0ZNVF9OVjYxICAgIHY0bDJfZm91cmNjKCdOJywgJ1YnLCAnNicsICcxJykgLyogMTYgIFkvQ3JDYiA0OjI6MiAgKi8KKworLyogdHdvIG5vbiBjb250aWd1b3VzIHBsYW5lcyAtIG9uZSBZLCBvbmUgQ3IgKyBDYiBpbnRlcmxlYXZlZCAgKi8KKyNkZWZpbmUgVjRMMl9QSVhfRk1UX05WMTJNICAgICAgICB2NGwyX2ZvdXJjYygnTicsICdNJywgJzEnLCAnMicpIC8qIDEyICBZL0NiQ3IgNDoyOjAgICovCisjZGVmaW5lIFY0TDJfUElYX0ZNVF9OVjIxTSAgICAgICAgdjRsMl9mb3VyY2MoJ04nLCAnTScsICcyJywgJzEnKSAvKiAyMSAgWS9DckNiIDQ6MjowICAqLworI2RlZmluZSBWNEwyX1BJWF9GTVRfTlYxMk1UICAgICAgIHY0bDJfZm91cmNjKCdUJywgJ00nLCAnMScsICcyJykgLyogMTIgIFkvQ2JDciA0OjI6MCA2NHgzMiBtYWNyb2Jsb2NrcyAqLworI2RlZmluZSBWNEwyX1BJWF9GTVRfTlYxMk1UXzE2WDE2IHY0bDJfZm91cmNjKCdWJywgJ00nLCAnMScsICcyJykgLyogMTIgIFkvQ2JDciA0OjI6MCAxNngxNiBtYWNyb2Jsb2NrcyAqLworCisvKiB0aHJlZSBub24gY29udGlndW91cyBwbGFuZXMgLSBZLCBDYiwgQ3IgKi8KKyNkZWZpbmUgVjRMMl9QSVhfRk1UX1lVVjQyME0gdjRsMl9mb3VyY2MoJ1knLCAnVScsICdWJywgJ00nKSAvKiAxMiAgWVVWNDIwIHBsYW5hciAqLworI2RlZmluZSBWNEwyX1BJWF9GTVRfWVZVNDIwTSB2NGwyX2ZvdXJjYygnWScsICdWJywgJ1UnLCAnTScpIC8qIDEyICBZVlU0MjAgcGxhbmFyICovCisKKy8qIEJheWVyIGZvcm1hdHMgLSBzZWUgaHR0cDovL3d3dy5zaWxpY29uaW1hZ2luZy5jb20vUkdCJTIwQmF5ZXIuaHRtICovCisjZGVmaW5lIFY0TDJfUElYX0ZNVF9TQkdHUjggIHY0bDJfZm91cmNjKCdCJywgJ0EnLCAnOCcsICcxJykgLyogIDggIEJHQkcuLiBHUkdSLi4gKi8KKyNkZWZpbmUgVjRMMl9QSVhfRk1UX1NHQlJHOCAgdjRsMl9mb3VyY2MoJ0cnLCAnQicsICdSJywgJ0cnKSAvKiAgOCAgR0JHQi4uIFJHUkcuLiAqLworI2RlZmluZSBWNEwyX1BJWF9GTVRfU0dSQkc4ICB2NGwyX2ZvdXJjYygnRycsICdSJywgJ0InLCAnRycpIC8qICA4ICBHUkdSLi4gQkdCRy4uICovCisjZGVmaW5lIFY0TDJfUElYX0ZNVF9TUkdHQjggIHY0bDJfZm91cmNjKCdSJywgJ0cnLCAnRycsICdCJykgLyogIDggIFJHUkcuLiBHQkdCLi4gKi8KKyNkZWZpbmUgVjRMMl9QSVhfRk1UX1NCR0dSMTAgdjRsMl9mb3VyY2MoJ0InLCAnRycsICcxJywgJzAnKSAvKiAxMCAgQkdCRy4uIEdSR1IuLiAqLworI2RlZmluZSBWNEwyX1BJWF9GTVRfU0dCUkcxMCB2NGwyX2ZvdXJjYygnRycsICdCJywgJzEnLCAnMCcpIC8qIDEwICBHQkdCLi4gUkdSRy4uICovCisjZGVmaW5lIFY0TDJfUElYX0ZNVF9TR1JCRzEwIHY0bDJfZm91cmNjKCdCJywgJ0EnLCAnMScsICcwJykgLyogMTAgIEdSR1IuLiBCR0JHLi4gKi8KKyNkZWZpbmUgVjRMMl9QSVhfRk1UX1NSR0dCMTAgdjRsMl9mb3VyY2MoJ1InLCAnRycsICcxJywgJzAnKSAvKiAxMCAgUkdSRy4uIEdCR0IuLiAqLworI2RlZmluZSBWNEwyX1BJWF9GTVRfU0JHR1IxMiB2NGwyX2ZvdXJjYygnQicsICdHJywgJzEnLCAnMicpIC8qIDEyICBCR0JHLi4gR1JHUi4uICovCisjZGVmaW5lIFY0TDJfUElYX0ZNVF9TR0JSRzEyIHY0bDJfZm91cmNjKCdHJywgJ0InLCAnMScsICcyJykgLyogMTIgIEdCR0IuLiBSR1JHLi4gKi8KKyNkZWZpbmUgVjRMMl9QSVhfRk1UX1NHUkJHMTIgdjRsMl9mb3VyY2MoJ0InLCAnQScsICcxJywgJzInKSAvKiAxMiAgR1JHUi4uIEJHQkcuLiAqLworI2RlZmluZSBWNEwyX1BJWF9GTVRfU1JHR0IxMiB2NGwyX2ZvdXJjYygnUicsICdHJywgJzEnLCAnMicpIC8qIDEyICBSR1JHLi4gR0JHQi4uICovCisJLyogMTBiaXQgcmF3IGJheWVyIERQQ00gY29tcHJlc3NlZCB0byA4IGJpdHMgKi8KKyNkZWZpbmUgVjRMMl9QSVhfRk1UX1NHUkJHMTBEUENNOCB2NGwyX2ZvdXJjYygnQicsICdEJywgJzEnLCAnMCcpCisJLyoKKwkgKiAxMGJpdCByYXcgYmF5ZXIsIGV4cGFuZGVkIHRvIDE2IGJpdHMKKwkgKiB4eHh4cnJycnJycnJycnh4eHhnZ2dnZ2dnZ2dnIHh4eHhnZ2dnZ2dnZ2dneHh4eGJiYmJiYmJiYmIuLi4KKwkgKi8KKyNkZWZpbmUgVjRMMl9QSVhfRk1UX1NCR0dSMTYgdjRsMl9mb3VyY2MoJ0InLCAnWScsICdSJywgJzInKSAvKiAxNiAgQkdCRy4uIEdSR1IuLiAqLworCisvKiBjb21wcmVzc2VkIGZvcm1hdHMgKi8KKyNkZWZpbmUgVjRMMl9QSVhfRk1UX01KUEVHICAgIHY0bDJfZm91cmNjKCdNJywgJ0onLCAnUCcsICdHJykgLyogTW90aW9uLUpQRUcgICAqLworI2RlZmluZSBWNEwyX1BJWF9GTVRfSlBFRyAgICAgdjRsMl9mb3VyY2MoJ0onLCAnUCcsICdFJywgJ0cnKSAvKiBKRklGIEpQRUcgICAgICovCisjZGVmaW5lIFY0TDJfUElYX0ZNVF9EViAgICAgICB2NGwyX2ZvdXJjYygnZCcsICd2JywgJ3MnLCAnZCcpIC8qIDEzOTQgICAgICAgICAgKi8KKyNkZWZpbmUgVjRMMl9QSVhfRk1UX01QRUcgICAgIHY0bDJfZm91cmNjKCdNJywgJ1AnLCAnRScsICdHJykgLyogTVBFRy0xLzIvNCAgICAqLworCisKKyNkZWZpbmUgVjRMMl9QSVhfRk1UX0gyNjQgICAgIHY0bDJfZm91cmNjKCdIJywgJzInLCAnNicsICc0JykgLyogSDI2NCAgICAqLworI2RlZmluZSBWNEwyX1BJWF9GTVRfSDI2MyAgICAgdjRsMl9mb3VyY2MoJ0gnLCAnMicsICc2JywgJzMnKSAvKiBIMjYzICAgICovCisjZGVmaW5lIFY0TDJfUElYX0ZNVF9NUEVHMTIgICB2NGwyX2ZvdXJjYygnTScsICdQJywgJzEnLCAnMicpIC8qIE1QRUctMS8yICAqLworI2RlZmluZSBWNEwyX1BJWF9GTVRfTVBFRzQgICAgdjRsMl9mb3VyY2MoJ00nLCAnUCcsICdHJywgJzQnKSAvKiBNUEVHLTQgICovCisjZGVmaW5lIFY0TDJfUElYX0ZNVF9GSU1WICAgICB2NGwyX2ZvdXJjYygnRicsICdJJywgJ00nLCAnVicpIC8qIEZJTVYgICovCisjZGVmaW5lIFY0TDJfUElYX0ZNVF9GSU1WMSAgICB2NGwyX2ZvdXJjYygnRicsICdJJywgJ00nLCAnMScpIC8qIEZJTVYxICovCisjZGVmaW5lIFY0TDJfUElYX0ZNVF9GSU1WMiAgICB2NGwyX2ZvdXJjYygnRicsICdJJywgJ00nLCAnMicpIC8qIEZJTVYyICovCisjZGVmaW5lIFY0TDJfUElYX0ZNVF9GSU1WMyAgICB2NGwyX2ZvdXJjYygnRicsICdJJywgJ00nLCAnMycpIC8qIEZJTVYzICovCisjZGVmaW5lIFY0TDJfUElYX0ZNVF9GSU1WNCAgICB2NGwyX2ZvdXJjYygnRicsICdJJywgJ00nLCAnNCcpIC8qIEZJTVY0ICovCisjZGVmaW5lIFY0TDJfUElYX0ZNVF9YVklEICAgICB2NGwyX2ZvdXJjYygnWCcsICdWJywgJ0knLCAnRCcpIC8qIFh2aWQgKi8KKyNkZWZpbmUgVjRMMl9QSVhfRk1UX1ZDMSAgICAgIHY0bDJfZm91cmNjKCdWJywgJ0MnLCAnMScsICdBJykgLyogVkMtMSAqLworI2RlZmluZSBWNEwyX1BJWF9GTVRfVkMxX1JDViAgICAgIHY0bDJfZm91cmNjKCdWJywgJ0MnLCAnMScsICdSJykgLyogVkMtMSBSQ1YgKi8KKyNkZWZpbmUgVjRMMl9QSVhfRk1UX1ZQOCAgICAgIHY0bDJfZm91cmNjKCdWJywgJ1AnLCAnOCcsICcwJykgLyogVlA4ICovCisKKworLyogIFZlbmRvci1zcGVjaWZpYyBmb3JtYXRzICAgKi8KKyNkZWZpbmUgVjRMMl9QSVhfRk1UX0NQSUExICAgIHY0bDJfZm91cmNjKCdDJywgJ1AnLCAnSScsICdBJykgLyogY3BpYTEgWVVWICovCisjZGVmaW5lIFY0TDJfUElYX0ZNVF9XTlZBICAgICB2NGwyX2ZvdXJjYygnVycsICdOJywgJ1YnLCAnQScpIC8qIFdpbm5vdiBodyBjb21wcmVzcyAqLworI2RlZmluZSBWNEwyX1BJWF9GTVRfU045QzEwWCAgdjRsMl9mb3VyY2MoJ1MnLCAnOScsICcxJywgJzAnKSAvKiBTTjlDMTB4IGNvbXByZXNzaW9uICovCisjZGVmaW5lIFY0TDJfUElYX0ZNVF9TTjlDMjBYX0k0MjAgdjRsMl9mb3VyY2MoJ1MnLCAnOScsICcyJywgJzAnKSAvKiBTTjlDMjB4IFlVViA0OjI6MCAqLworI2RlZmluZSBWNEwyX1BJWF9GTVRfUFdDMSAgICAgdjRsMl9mb3VyY2MoJ1AnLCAnVycsICdDJywgJzEnKSAvKiBwd2Mgb2xkZXIgd2ViY2FtICovCisjZGVmaW5lIFY0TDJfUElYX0ZNVF9QV0MyICAgICB2NGwyX2ZvdXJjYygnUCcsICdXJywgJ0MnLCAnMicpIC8qIHB3YyBuZXdlciB3ZWJjYW0gKi8KKyNkZWZpbmUgVjRMMl9QSVhfRk1UX0VUNjFYMjUxIHY0bDJfZm91cmNjKCdFJywgJzYnLCAnMicsICc1JykgLyogRVQ2MVgyNTEgY29tcHJlc3Npb24gKi8KKyNkZWZpbmUgVjRMMl9QSVhfRk1UX1NQQ0E1MDEgIHY0bDJfZm91cmNjKCdTJywgJzUnLCAnMCcsICcxJykgLyogWVVZViBwZXIgbGluZSAqLworI2RlZmluZSBWNEwyX1BJWF9GTVRfU1BDQTUwNSAgdjRsMl9mb3VyY2MoJ1MnLCAnNScsICcwJywgJzUnKSAvKiBZWVVWIHBlciBsaW5lICovCisjZGVmaW5lIFY0TDJfUElYX0ZNVF9TUENBNTA4ICB2NGwyX2ZvdXJjYygnUycsICc1JywgJzAnLCAnOCcpIC8qIFlVVlkgcGVyIGxpbmUgKi8KKyNkZWZpbmUgVjRMMl9QSVhfRk1UX1NQQ0E1NjEgIHY0bDJfZm91cmNjKCdTJywgJzUnLCAnNicsICcxJykgLyogY29tcHJlc3NlZCBHQlJHIGJheWVyICovCisjZGVmaW5lIFY0TDJfUElYX0ZNVF9QQUMyMDcgICB2NGwyX2ZvdXJjYygnUCcsICcyJywgJzAnLCAnNycpIC8qIGNvbXByZXNzZWQgQkdHUiBiYXllciAqLworI2RlZmluZSBWNEwyX1BJWF9GTVRfTVI5NzMxMEEgdjRsMl9mb3VyY2MoJ00nLCAnMycsICcxJywgJzAnKSAvKiBjb21wcmVzc2VkIEJHR1IgYmF5ZXIgKi8KKyNkZWZpbmUgVjRMMl9QSVhfRk1UX1NOOUMyMDI4IHY0bDJfZm91cmNjKCdTJywgJ08nLCAnTicsICdYJykgLyogY29tcHJlc3NlZCBHQlJHIGJheWVyICovCisjZGVmaW5lIFY0TDJfUElYX0ZNVF9TUTkwNUMgICB2NGwyX2ZvdXJjYygnOScsICcwJywgJzUnLCAnQycpIC8qIGNvbXByZXNzZWQgUkdHQiBiYXllciAqLworI2RlZmluZSBWNEwyX1BJWF9GTVRfUEpQRyAgICAgdjRsMl9mb3VyY2MoJ1AnLCAnSicsICdQJywgJ0cnKSAvKiBQaXhhcnQgNzN4eCBKUEVHICovCisjZGVmaW5lIFY0TDJfUElYX0ZNVF9PVjUxMSAgICB2NGwyX2ZvdXJjYygnTycsICc1JywgJzEnLCAnMScpIC8qIG92NTExIEpQRUcgKi8KKyNkZWZpbmUgVjRMMl9QSVhfRk1UX09WNTE4ICAgIHY0bDJfZm91cmNjKCdPJywgJzUnLCAnMScsICc4JykgLyogb3Y1MTggSlBFRyAqLworI2RlZmluZSBWNEwyX1BJWF9GTVRfU1RWMDY4MCAgdjRsMl9mb3VyY2MoJ1MnLCAnNicsICc4JywgJzAnKSAvKiBzdHYwNjgwIGJheWVyICovCisjZGVmaW5lIFY0TDJfUElYX0ZNVF9UTTYwMDAgICB2NGwyX2ZvdXJjYygnVCcsICdNJywgJzYnLCAnMCcpIC8qIHRtNTYwMC90bTYweDAgKi8KKyNkZWZpbmUgVjRMMl9QSVhfRk1UX0NJVF9ZWVZZVVkgdjRsMl9mb3VyY2MoJ0MnLCAnSScsICdUJywgJ1YnKSAvKiBvbmUgbGluZSBvZiBZIHRoZW4gMSBsaW5lIG9mIFZZVVkgKi8KKyNkZWZpbmUgVjRMMl9QSVhfRk1UX0tPTklDQTQyMCAgdjRsMl9mb3VyY2MoJ0snLCAnTycsICdOJywgJ0knKSAvKiBZVVY0MjAgcGxhbmFyIGluIGJsb2NrcyBvZiAyNTYgcGl4ZWxzICovCisjZGVmaW5lIFY0TDJfUElYX0ZNVF9KUEdMCXY0bDJfZm91cmNjKCdKJywgJ1AnLCAnRycsICdMJykgLyogSlBFRy1MaXRlICovCisKKyNkZWZpbmUgVjRMMl9QSVhfRk1UX0pQRUdfNDQ0ICAgICB2NGwyX2ZvdXJjYygnSicsICdQJywgJ0cnLCAnNCcpIC8qIHl1djQ0NCBvZiBKRklGIEpQRUcgICAgICovCisjZGVmaW5lIFY0TDJfUElYX0ZNVF9KUEVHXzQyMiAgICAgdjRsMl9mb3VyY2MoJ0onLCAnUCcsICdHJywgJzInKSAvKiB5dXY0MjIgb2YgSkZJRiBKUEVHICAgICAqLworI2RlZmluZSBWNEwyX1BJWF9GTVRfSlBFR180MjAgICAgIHY0bDJfZm91cmNjKCdKJywgJ1AnLCAnRycsICcwJykgLyogeXV2NDIwIG9mIEpGSUYgSlBFRyAgICAgKi8KKyNkZWZpbmUgVjRMMl9QSVhfRk1UX0pQRUdfR1JBWSAgICAgdjRsMl9mb3VyY2MoJ0onLCAnUCcsICdHJywgJ0cnKSAvKiBncmV5IG9mIEpGSUYgSlBFRyAgICAgKi8KKyNkZWZpbmUgVjRMMl9QSVhfRk1UX1lVVjQ0NF8yUCAgdjRsMl9mb3VyY2MoJ1knLCAnVScsICcyJywgJ1AnKSAvKiAxNiAgeHh4eHl5eXkgdXV1dXZ2dnYgKi8KKyNkZWZpbmUgVjRMMl9QSVhfRk1UX1lWVTQ0NF8yUCAgdjRsMl9mb3VyY2MoJ1knLCAnVicsICcyJywgJ1AnKSAvKiAxNiAgeHh4eHl5eXkgdXV1dXZ2dnYgKi8KKyNkZWZpbmUgVjRMMl9QSVhfRk1UX1lVVjQ0NF8zUCAgdjRsMl9mb3VyY2MoJ1knLCAnVScsICczJywgJ1AnKSAvKiAxNiAgeHh4eHl5eXkgdXV1dXZ2dnYgKi8KKy8qCisgKglGIE8gUiBNIEEgVCAgIEUgTiBVIE0gRSBSIEEgVCBJIE8gTgorICovCitzdHJ1Y3QgdjRsMl9mbXRkZXNjIHsKKwlfX3UzMgkJICAgIGluZGV4OyAgICAgICAgICAgICAvKiBGb3JtYXQgbnVtYmVyICAgICAgKi8KKwllbnVtIHY0bDJfYnVmX3R5cGUgIHR5cGU7ICAgICAgICAgICAgICAvKiBidWZmZXIgdHlwZSAgICAgICAgKi8KKwlfX3UzMiAgICAgICAgICAgICAgIGZsYWdzOworCV9fdTgJCSAgICBkZXNjcmlwdGlvblszMl07ICAgLyogRGVzY3JpcHRpb24gc3RyaW5nICovCisJX191MzIJCSAgICBwaXhlbGZvcm1hdDsgICAgICAgLyogRm9ybWF0IGZvdXJjYyAgICAgICovCisJX191MzIJCSAgICByZXNlcnZlZFs0XTsKK307CisKKyNkZWZpbmUgVjRMMl9GTVRfRkxBR19DT01QUkVTU0VEIDB4MDAwMQorI2RlZmluZSBWNEwyX0ZNVF9GTEFHX0VNVUxBVEVEICAgMHgwMDAyCisKKyNpZiAxCisJLyogRXhwZXJpbWVudGFsIEZyYW1lIFNpemUgYW5kIGZyYW1lIHJhdGUgZW51bWVyYXRpb24gKi8KKy8qCisgKglGIFIgQSBNIEUgICBTIEkgWiBFICAgRSBOIFUgTSBFIFIgQSBUIEkgTyBOCisgKi8KK2VudW0gdjRsMl9mcm1zaXpldHlwZXMgeworCVY0TDJfRlJNU0laRV9UWVBFX0RJU0NSRVRFCT0gMSwKKwlWNEwyX0ZSTVNJWkVfVFlQRV9DT05USU5VT1VTCT0gMiwKKwlWNEwyX0ZSTVNJWkVfVFlQRV9TVEVQV0lTRQk9IDMsCit9OworCitzdHJ1Y3QgdjRsMl9mcm1zaXplX2Rpc2NyZXRlIHsKKwlfX3UzMgkJCXdpZHRoOwkJLyogRnJhbWUgd2lkdGggW3BpeGVsXSAqLworCV9fdTMyCQkJaGVpZ2h0OwkJLyogRnJhbWUgaGVpZ2h0IFtwaXhlbF0gKi8KK307CisKK3N0cnVjdCB2NGwyX2ZybXNpemVfc3RlcHdpc2UgeworCV9fdTMyCQkJbWluX3dpZHRoOwkvKiBNaW5pbXVtIGZyYW1lIHdpZHRoIFtwaXhlbF0gKi8KKwlfX3UzMgkJCW1heF93aWR0aDsJLyogTWF4aW11bSBmcmFtZSB3aWR0aCBbcGl4ZWxdICovCisJX191MzIJCQlzdGVwX3dpZHRoOwkvKiBGcmFtZSB3aWR0aCBzdGVwIHNpemUgW3BpeGVsXSAqLworCV9fdTMyCQkJbWluX2hlaWdodDsJLyogTWluaW11bSBmcmFtZSBoZWlnaHQgW3BpeGVsXSAqLworCV9fdTMyCQkJbWF4X2hlaWdodDsJLyogTWF4aW11bSBmcmFtZSBoZWlnaHQgW3BpeGVsXSAqLworCV9fdTMyCQkJc3RlcF9oZWlnaHQ7CS8qIEZyYW1lIGhlaWdodCBzdGVwIHNpemUgW3BpeGVsXSAqLworfTsKKworc3RydWN0IHY0bDJfZnJtc2l6ZWVudW0geworCV9fdTMyCQkJaW5kZXg7CQkvKiBGcmFtZSBzaXplIG51bWJlciAqLworCV9fdTMyCQkJcGl4ZWxfZm9ybWF0OwkvKiBQaXhlbCBmb3JtYXQgKi8KKwlfX3UzMgkJCXR5cGU7CQkvKiBGcmFtZSBzaXplIHR5cGUgdGhlIGRldmljZSBzdXBwb3J0cy4gKi8KKworCXVuaW9uIHsJCQkJCS8qIEZyYW1lIHNpemUgKi8KKwkJc3RydWN0IHY0bDJfZnJtc2l6ZV9kaXNjcmV0ZQlkaXNjcmV0ZTsKKwkJc3RydWN0IHY0bDJfZnJtc2l6ZV9zdGVwd2lzZQlzdGVwd2lzZTsKKwl9OworCisJX191MzIgICByZXNlcnZlZFsyXTsJCQkvKiBSZXNlcnZlZCBzcGFjZSBmb3IgZnV0dXJlIHVzZSAqLworfTsKKworLyoKKyAqCUYgUiBBIE0gRSAgIFIgQSBUIEUgICBFIE4gVSBNIEUgUiBBIFQgSSBPIE4KKyAqLworZW51bSB2NGwyX2ZybWl2YWx0eXBlcyB7CisJVjRMMl9GUk1JVkFMX1RZUEVfRElTQ1JFVEUJPSAxLAorCVY0TDJfRlJNSVZBTF9UWVBFX0NPTlRJTlVPVVMJPSAyLAorCVY0TDJfRlJNSVZBTF9UWVBFX1NURVBXSVNFCT0gMywKK307CisKK3N0cnVjdCB2NGwyX2ZybWl2YWxfc3RlcHdpc2UgeworCXN0cnVjdCB2NGwyX2ZyYWN0CW1pbjsJCS8qIE1pbmltdW0gZnJhbWUgaW50ZXJ2YWwgW3NdICovCisJc3RydWN0IHY0bDJfZnJhY3QJbWF4OwkJLyogTWF4aW11bSBmcmFtZSBpbnRlcnZhbCBbc10gKi8KKwlzdHJ1Y3QgdjRsMl9mcmFjdAlzdGVwOwkJLyogRnJhbWUgaW50ZXJ2YWwgc3RlcCBzaXplIFtzXSAqLworfTsKKworc3RydWN0IHY0bDJfZnJtaXZhbGVudW0geworCV9fdTMyCQkJaW5kZXg7CQkvKiBGcmFtZSBmb3JtYXQgaW5kZXggKi8KKwlfX3UzMgkJCXBpeGVsX2Zvcm1hdDsJLyogUGl4ZWwgZm9ybWF0ICovCisJX191MzIJCQl3aWR0aDsJCS8qIEZyYW1lIHdpZHRoICovCisJX191MzIJCQloZWlnaHQ7CQkvKiBGcmFtZSBoZWlnaHQgKi8KKwlfX3UzMgkJCXR5cGU7CQkvKiBGcmFtZSBpbnRlcnZhbCB0eXBlIHRoZSBkZXZpY2Ugc3VwcG9ydHMuICovCisKKwl1bmlvbiB7CQkJCQkvKiBGcmFtZSBpbnRlcnZhbCAqLworCQlzdHJ1Y3QgdjRsMl9mcmFjdAkJZGlzY3JldGU7CisJCXN0cnVjdCB2NGwyX2ZybWl2YWxfc3RlcHdpc2UJc3RlcHdpc2U7CisJfTsKKworCV9fdTMyCXJlc2VydmVkWzJdOwkJCS8qIFJlc2VydmVkIHNwYWNlIGZvciBmdXR1cmUgdXNlICovCit9OworI2VuZGlmCisKKy8qCisgKglUIEkgTSBFIEMgTyBEIEUKKyAqLworc3RydWN0IHY0bDJfdGltZWNvZGUgeworCV9fdTMyCXR5cGU7CisJX191MzIJZmxhZ3M7CisJX191OAlmcmFtZXM7CisJX191OAlzZWNvbmRzOworCV9fdTgJbWludXRlczsKKwlfX3U4CWhvdXJzOworCV9fdTgJdXNlcmJpdHNbNF07Cit9OworCisvKiAgVHlwZSAgKi8KKyNkZWZpbmUgVjRMMl9UQ19UWVBFXzI0RlBTCQkxCisjZGVmaW5lIFY0TDJfVENfVFlQRV8yNUZQUwkJMgorI2RlZmluZSBWNEwyX1RDX1RZUEVfMzBGUFMJCTMKKyNkZWZpbmUgVjRMMl9UQ19UWVBFXzUwRlBTCQk0CisjZGVmaW5lIFY0TDJfVENfVFlQRV82MEZQUwkJNQorCisvKiAgRmxhZ3MgICovCisjZGVmaW5lIFY0TDJfVENfRkxBR19EUk9QRlJBTUUJCTB4MDAwMSAvKiAiZHJvcC1mcmFtZSIgbW9kZSAqLworI2RlZmluZSBWNEwyX1RDX0ZMQUdfQ09MT1JGUkFNRQkJMHgwMDAyCisjZGVmaW5lIFY0TDJfVENfVVNFUkJJVFNfZmllbGQJCTB4MDAwQworI2RlZmluZSBWNEwyX1RDX1VTRVJCSVRTX1VTRVJERUZJTkVECTB4MDAwMAorI2RlZmluZSBWNEwyX1RDX1VTRVJCSVRTXzhCSVRDSEFSUwkweDAwMDgKKy8qIFRoZSBhYm92ZSBpcyBiYXNlZCBvbiBTTVBURSB0aW1lY29kZXMgKi8KKworc3RydWN0IHY0bDJfanBlZ2NvbXByZXNzaW9uIHsKKwlpbnQgcXVhbGl0eTsKKworCWludCAgQVBQbjsgICAgICAgICAgICAgIC8qIE51bWJlciBvZiBBUFAgc2VnbWVudCB0byBiZSB3cml0dGVuLAorCQkJCSAqIG11c3QgYmUgMC4uMTUgKi8KKwlpbnQgIEFQUF9sZW47ICAgICAgICAgICAvKiBMZW5ndGggb2YgZGF0YSBpbiBKUEVHIEFQUG4gc2VnbWVudCAqLworCWNoYXIgQVBQX2RhdGFbNjBdOyAgICAgIC8qIERhdGEgaW4gdGhlIEpQRUcgQVBQbiBzZWdtZW50LiAqLworCisJaW50ICBDT01fbGVuOyAgICAgICAgICAgLyogTGVuZ3RoIG9mIGRhdGEgaW4gSlBFRyBDT00gc2VnbWVudCAqLworCWNoYXIgQ09NX2RhdGFbNjBdOyAgICAgIC8qIERhdGEgaW4gSlBFRyBDT00gc2VnbWVudCAqLworCisJX191MzIganBlZ19tYXJrZXJzOyAgICAgLyogV2hpY2ggbWFya2VycyBzaG91bGQgZ28gaW50byB0aGUgSlBFRworCQkJCSAqIG91dHB1dC4gVW5sZXNzIHlvdSBleGFjdGx5IGtub3cgd2hhdAorCQkJCSAqIHlvdSBkbywgbGVhdmUgdGhlbSB1bnRvdWNoZWQuCisJCQkJICogSW5sdWRpbmcgbGVzcyBtYXJrZXJzIHdpbGwgbWFrZSB0aGUKKwkJCQkgKiByZXN1bHRpbmcgY29kZSBzbWFsbGVyLCBidXQgdGhlcmUgd2lsbAorCQkJCSAqIGJlIGZld2VyIGFwcGxpY2F0aW9ucyB3aGljaCBjYW4gcmVhZCBpdC4KKwkJCQkgKiBUaGUgcHJlc2VuY2Ugb2YgdGhlIEFQUCBhbmQgQ09NIG1hcmtlcgorCQkJCSAqIGlzIGluZmx1ZW5jZWQgYnkgQVBQX2xlbiBhbmQgQ09NX2xlbgorCQkJCSAqIE9OTFksIG5vdCBieSB0aGlzIHByb3BlcnR5ISAqLworCisjZGVmaW5lIFY0TDJfSlBFR19NQVJLRVJfREhUICgxPDwzKSAgICAvKiBEZWZpbmUgSHVmZm1hbiBUYWJsZXMgKi8KKyNkZWZpbmUgVjRMMl9KUEVHX01BUktFUl9EUVQgKDE8PDQpICAgIC8qIERlZmluZSBRdWFudGl6YXRpb24gVGFibGVzICovCisjZGVmaW5lIFY0TDJfSlBFR19NQVJLRVJfRFJJICgxPDw1KSAgICAvKiBEZWZpbmUgUmVzdGFydCBJbnRlcnZhbCAqLworI2RlZmluZSBWNEwyX0pQRUdfTUFSS0VSX0NPTSAoMTw8NikgICAgLyogQ29tbWVudCBzZWdtZW50ICovCisjZGVmaW5lIFY0TDJfSlBFR19NQVJLRVJfQVBQICgxPDw3KSAgICAvKiBBcHAgc2VnbWVudCwgZHJpdmVyIHdpbGwKKwkJCQkJKiBhbGx3YXlzIHVzZSBBUFAwICovCit9OworCisvKgorICoJTSBFIE0gTyBSIFkgLSBNIEEgUCBQIEkgTiBHICAgQiBVIEYgRiBFIFIgUworICovCitzdHJ1Y3QgdjRsMl9yZXF1ZXN0YnVmZmVycyB7CisJX191MzIJCQljb3VudDsKKwllbnVtIHY0bDJfYnVmX3R5cGUgICAgICB0eXBlOworCWVudW0gdjRsMl9tZW1vcnkgICAgICAgIG1lbW9yeTsKKwlfX3UzMgkJCXJlc2VydmVkWzJdOworfTsKKworLyoqCisgKiBzdHJ1Y3QgdjRsMl9wbGFuZSAtIHBsYW5lIGluZm8gZm9yIG11bHRpLXBsYW5hciBidWZmZXJzCisgKiBAYnl0ZXN1c2VkOgkJbnVtYmVyIG9mIGJ5dGVzIG9jY3VwaWVkIGJ5IGRhdGEgaW4gdGhlIHBsYW5lIChwYXlsb2FkKQorICogQGxlbmd0aDoJCXNpemUgb2YgdGhpcyBwbGFuZSAoTk9UIHRoZSBwYXlsb2FkKSBpbiBieXRlcworICogQG1lbV9vZmZzZXQ6CQl3aGVuIG1lbW9yeSBpbiB0aGUgYXNzb2NpYXRlZCBzdHJ1Y3QgdjRsMl9idWZmZXIgaXMKKyAqCQkJVjRMMl9NRU1PUllfTU1BUCwgZXF1YWxzIHRoZSBvZmZzZXQgZnJvbSB0aGUgc3RhcnQgb2YKKyAqCQkJdGhlIGRldmljZSBtZW1vcnkgZm9yIHRoaXMgcGxhbmUgKG9yIGlzIGEgImNvb2tpZSIgdGhhdAorICoJCQlzaG91bGQgYmUgcGFzc2VkIHRvIG1tYXAoKSBjYWxsZWQgb24gdGhlIHZpZGVvIG5vZGUpCisgKiBAdXNlcnB0cjoJCXdoZW4gbWVtb3J5IGlzIFY0TDJfTUVNT1JZX1VTRVJQVFIsIGEgdXNlcnNwYWNlIHBvaW50ZXIKKyAqCQkJcG9pbnRpbmcgdG8gdGhpcyBwbGFuZQorICogQGRhdGFfb2Zmc2V0OglvZmZzZXQgaW4gdGhlIHBsYW5lIHRvIHRoZSBzdGFydCBvZiBkYXRhOyB1c3VhbGx5IDAsCisgKgkJCXVubGVzcyB0aGVyZSBpcyBhIGhlYWRlciBpbiBmcm9udCBvZiB0aGUgZGF0YQorICoKKyAqIE11bHRpLXBsYW5hciBidWZmZXJzIGNvbnNpc3Qgb2Ygb25lIG9yIG1vcmUgcGxhbmVzLCBlLmcuIGFuIFlDYkNyIGJ1ZmZlcgorICogd2l0aCB0d28gcGxhbmVzIGNhbiBoYXZlIG9uZSBwbGFuZSBmb3IgWSwgYW5kIGFub3RoZXIgZm9yIGludGVybGVhdmVkIENiQ3IKKyAqIGNvbXBvbmVudHMuIEVhY2ggcGxhbmUgY2FuIHJlc2lkZSBpbiBhIHNlcGFyYXRlIG1lbW9yeSBidWZmZXIsIG9yIGV2ZW4gaW4KKyAqIGEgY29tcGxldGVseSBzZXBhcmF0ZSBtZW1vcnkgbm9kZSAoZS5nLiBpbiBlbWJlZGRlZCBkZXZpY2VzKS4KKyAqLworc3RydWN0IHY0bDJfcGxhbmUgeworCV9fdTMyCQkJYnl0ZXN1c2VkOworCV9fdTMyCQkJbGVuZ3RoOworCXVuaW9uIHsKKwkJX191MzIJCW1lbV9vZmZzZXQ7CisJCXVuc2lnbmVkIGxvbmcJdXNlcnB0cjsKKwl9IG07CisJX191MzIJCQlkYXRhX29mZnNldDsKKwl2b2lkCQkJKmNvb2tpZTsKKwl2b2lkCQkJKnNoYXJlOworCV9fdTMyCQkJcmVzZXJ2ZWRbOV07Cit9OworCisvKioKKyAqIHN0cnVjdCB2NGwyX2J1ZmZlciAtIHZpZGVvIGJ1ZmZlciBpbmZvCisgKiBAaW5kZXg6CWlkIG51bWJlciBvZiB0aGUgYnVmZmVyCisgKiBAdHlwZToJYnVmZmVyIHR5cGUgKHR5cGUgPT0gKl9NUExBTkUgZm9yIG11bHRpcGxhbmFyIGJ1ZmZlcnMpCisgKiBAYnl0ZXN1c2VkOgludW1iZXIgb2YgYnl0ZXMgb2NjdXBpZWQgYnkgZGF0YSBpbiB0aGUgYnVmZmVyIChwYXlsb2FkKTsKKyAqCQl1bnVzZWQgKHNldCB0byAwKSBmb3IgbXVsdGlwbGFuYXIgYnVmZmVycworICogQGZsYWdzOglidWZmZXIgaW5mb3JtYXRpb25hbCBmbGFncworICogQGZpZWxkOglmaWVsZCBvcmRlciBvZiB0aGUgaW1hZ2UgaW4gdGhlIGJ1ZmZlcgorICogQHRpbWVzdGFtcDoJZnJhbWUgdGltZXN0YW1wCisgKiBAdGltZWNvZGU6CWZyYW1lIHRpbWVjb2RlCisgKiBAc2VxdWVuY2U6CXNlcXVlbmNlIGNvdW50IG9mIHRoaXMgZnJhbWUKKyAqIEBtZW1vcnk6CXRoZSBtZXRob2QsIGluIHdoaWNoIHRoZSBhY3R1YWwgdmlkZW8gZGF0YSBpcyBwYXNzZWQKKyAqIEBvZmZzZXQ6CWZvciBub24tbXVsdGlwbGFuYXIgYnVmZmVycyB3aXRoIG1lbW9yeSA9PSBWNEwyX01FTU9SWV9NTUFQOworICoJCW9mZnNldCBmcm9tIHRoZSBzdGFydCBvZiB0aGUgZGV2aWNlIG1lbW9yeSBmb3IgdGhpcyBwbGFuZSwKKyAqCQkob3IgYSAiY29va2llIiB0aGF0IHNob3VsZCBiZSBwYXNzZWQgdG8gbW1hcCgpIGFzIG9mZnNldCkKKyAqIEB1c2VycHRyOglmb3Igbm9uLW11bHRpcGxhbmFyIGJ1ZmZlcnMgd2l0aCBtZW1vcnkgPT0gVjRMMl9NRU1PUllfVVNFUlBUUjsKKyAqCQlhIHVzZXJzcGFjZSBwb2ludGVyIHBvaW50aW5nIHRvIHRoaXMgYnVmZmVyCisgKiBAcGxhbmVzOglmb3IgbXVsdGlwbGFuYXIgYnVmZmVyczsgdXNlcnNwYWNlIHBvaW50ZXIgdG8gdGhlIGFycmF5IG9mIHBsYW5lCisgKgkJaW5mbyBzdHJ1Y3RzIGZvciB0aGlzIGJ1ZmZlcgorICogQGxlbmd0aDoJc2l6ZSBpbiBieXRlcyBvZiB0aGUgYnVmZmVyIChOT1QgaXRzIHBheWxvYWQpIGZvciBzaW5nbGUtcGxhbmUKKyAqCQlidWZmZXJzICh3aGVuIHR5cGUgIT0gKl9NUExBTkUpOyBudW1iZXIgb2YgZWxlbWVudHMgaW4gdGhlCisgKgkJcGxhbmVzIGFycmF5IGZvciBtdWx0aS1wbGFuZSBidWZmZXJzCisgKiBAaW5wdXQ6CWlucHV0IG51bWJlciBmcm9tIHdoaWNoIHRoZSB2aWRlbyBkYXRhIGhhcyBoYXMgYmVlbiBjYXB0dXJlZAorICoKKyAqIENvbnRhaW5zIGRhdGEgZXhjaGFuZ2VkIGJ5IGFwcGxpY2F0aW9uIGFuZCBkcml2ZXIgdXNpbmcgb25lIG9mIHRoZSBTdHJlYW1pbmcKKyAqIEkvTyBtZXRob2RzLgorICovCitzdHJ1Y3QgdjRsMl9idWZmZXIgeworCV9fdTMyCQkJaW5kZXg7CisJZW51bSB2NGwyX2J1Zl90eXBlICAgICAgdHlwZTsKKwlfX3UzMgkJCWJ5dGVzdXNlZDsKKwlfX3UzMgkJCWZsYWdzOworCWVudW0gdjRsMl9maWVsZAkJZmllbGQ7CisJc3RydWN0IHRpbWV2YWwJCXRpbWVzdGFtcDsKKwlzdHJ1Y3QgdjRsMl90aW1lY29kZQl0aW1lY29kZTsKKwlfX3UzMgkJCXNlcXVlbmNlOworCisJLyogbWVtb3J5IGxvY2F0aW9uICovCisJZW51bSB2NGwyX21lbW9yeSAgICAgICAgbWVtb3J5OworCXVuaW9uIHsKKwkJX191MzIgICAgICAgICAgIG9mZnNldDsKKwkJdW5zaWduZWQgbG9uZyAgIHVzZXJwdHI7CisJCXN0cnVjdCB2NGwyX3BsYW5lICpwbGFuZXM7CisJfSBtOworCV9fdTMyCQkJbGVuZ3RoOworCV9fdTMyCQkJaW5wdXQ7CisJX191MzIJCQlyZXNlcnZlZDsKK307CisKKy8qICBGbGFncyBmb3IgJ2ZsYWdzJyBmaWVsZCAqLworI2RlZmluZSBWNEwyX0JVRl9GTEFHX01BUFBFRAkweDAwMDEgIC8qIEJ1ZmZlciBpcyBtYXBwZWQgKGZsYWcpICovCisjZGVmaW5lIFY0TDJfQlVGX0ZMQUdfUVVFVUVECTB4MDAwMgkvKiBCdWZmZXIgaXMgcXVldWVkIGZvciBwcm9jZXNzaW5nICovCisjZGVmaW5lIFY0TDJfQlVGX0ZMQUdfRE9ORQkweDAwMDQJLyogQnVmZmVyIGlzIHJlYWR5ICovCisjZGVmaW5lIFY0TDJfQlVGX0ZMQUdfS0VZRlJBTUUJMHgwMDA4CS8qIEltYWdlIGlzIGEga2V5ZnJhbWUgKEktZnJhbWUpICovCisjZGVmaW5lIFY0TDJfQlVGX0ZMQUdfUEZSQU1FCTB4MDAxMAkvKiBJbWFnZSBpcyBhIFAtZnJhbWUgKi8KKyNkZWZpbmUgVjRMMl9CVUZfRkxBR19CRlJBTUUJMHgwMDIwCS8qIEltYWdlIGlzIGEgQi1mcmFtZSAqLworLyogQnVmZmVyIGlzIHJlYWR5LCBidXQgdGhlIGRhdGEgY29udGFpbmVkIHdpdGhpbiBpcyBjb3JydXB0ZWQuICovCisjZGVmaW5lIFY0TDJfQlVGX0ZMQUdfRVJST1IJMHgwMDQwCisjZGVmaW5lIFY0TDJfQlVGX0ZMQUdfVElNRUNPREUJMHgwMTAwCS8qIHRpbWVjb2RlIGZpZWxkIGlzIHZhbGlkICovCisjZGVmaW5lIFY0TDJfQlVGX0ZMQUdfSU5QVVQgICAgIDB4MDIwMCAgLyogaW5wdXQgZmllbGQgaXMgdmFsaWQgKi8KKworLyoKKyAqCU8gViBFIFIgTCBBIFkgICBQIFIgRSBWIEkgRSBXCisgKi8KK3N0cnVjdCB2NGwyX2ZyYW1lYnVmZmVyIHsKKwlfX3UzMgkJCWNhcGFiaWxpdHk7CisJX191MzIJCQlmbGFnczsKKy8qIEZJWE1FOiBpbiB0aGVvcnkgd2Ugc2hvdWxkIHBhc3Mgc29tZXRoaW5nIGxpa2UgUENJIGRldmljZSArIG1lbW9yeQorICogcmVnaW9uICsgb2Zmc2V0IGluc3RlYWQgb2Ygc29tZSBwaHlzaWNhbCBhZGRyZXNzICovCisJdm9pZCAgICAgICAgICAgICAgICAgICAgKmJhc2U7CisJc3RydWN0IHY0bDJfcGl4X2Zvcm1hdAlmbXQ7Cit9OworLyogIEZsYWdzIGZvciB0aGUgJ2NhcGFiaWxpdHknIGZpZWxkLiBSZWFkIG9ubHkgKi8KKyNkZWZpbmUgVjRMMl9GQlVGX0NBUF9FWFRFUk5PVkVSTEFZCTB4MDAwMQorI2RlZmluZSBWNEwyX0ZCVUZfQ0FQX0NIUk9NQUtFWQkJMHgwMDAyCisjZGVmaW5lIFY0TDJfRkJVRl9DQVBfTElTVF9DTElQUElORyAgICAgMHgwMDA0CisjZGVmaW5lIFY0TDJfRkJVRl9DQVBfQklUTUFQX0NMSVBQSU5HCTB4MDAwOAorI2RlZmluZSBWNEwyX0ZCVUZfQ0FQX0xPQ0FMX0FMUEhBCTB4MDAxMAorI2RlZmluZSBWNEwyX0ZCVUZfQ0FQX0dMT0JBTF9BTFBIQQkweDAwMjAKKyNkZWZpbmUgVjRMMl9GQlVGX0NBUF9MT0NBTF9JTlZfQUxQSEEJMHgwMDQwCisjZGVmaW5lIFY0TDJfRkJVRl9DQVBfU1JDX0NIUk9NQUtFWQkweDAwODAKKy8qICBGbGFncyBmb3IgdGhlICdmbGFncycgZmllbGQuICovCisjZGVmaW5lIFY0TDJfRkJVRl9GTEFHX1BSSU1BUlkJCTB4MDAwMQorI2RlZmluZSBWNEwyX0ZCVUZfRkxBR19PVkVSTEFZCQkweDAwMDIKKyNkZWZpbmUgVjRMMl9GQlVGX0ZMQUdfQ0hST01BS0VZCTB4MDAwNAorI2RlZmluZSBWNEwyX0ZCVUZfRkxBR19MT0NBTF9BTFBIQQkweDAwMDgKKyNkZWZpbmUgVjRMMl9GQlVGX0ZMQUdfR0xPQkFMX0FMUEhBCTB4MDAxMAorI2RlZmluZSBWNEwyX0ZCVUZfRkxBR19MT0NBTF9JTlZfQUxQSEEJMHgwMDIwCisjZGVmaW5lIFY0TDJfRkJVRl9GTEFHX1NSQ19DSFJPTUFLRVkJMHgwMDQwCisKK3N0cnVjdCB2NGwyX2NsaXAgeworCXN0cnVjdCB2NGwyX3JlY3QgICAgICAgIGM7CisJc3RydWN0IHY0bDJfY2xpcAlfX3VzZXIgKm5leHQ7Cit9OworCitzdHJ1Y3QgdjRsMl93aW5kb3cgeworCXN0cnVjdCB2NGwyX3JlY3QgICAgICAgIHc7CisJZW51bSB2NGwyX2ZpZWxkICAJZmllbGQ7CisJX191MzIJCQljaHJvbWFrZXk7CisJc3RydWN0IHY0bDJfY2xpcAlfX3VzZXIgKmNsaXBzOworCV9fdTMyCQkJY2xpcGNvdW50OworCXZvaWQJCQlfX3VzZXIgKmJpdG1hcDsKKwlfX3U4ICAgICAgICAgICAgICAgICAgICBnbG9iYWxfYWxwaGE7Cit9OworCisvKgorICoJQyBBIFAgVCBVIFIgRSAgIFAgQSBSIEEgTSBFIFQgRSBSIFMKKyAqLworc3RydWN0IHY0bDJfY2FwdHVyZXBhcm0geworCV9fdTMyCQkgICBjYXBhYmlsaXR5OwkgIC8qICBTdXBwb3J0ZWQgbW9kZXMgKi8KKwlfX3UzMgkJICAgY2FwdHVyZW1vZGU7CSAgLyogIEN1cnJlbnQgbW9kZSAqLworCXN0cnVjdCB2NGwyX2ZyYWN0ICB0aW1lcGVyZnJhbWU7ICAvKiAgVGltZSBwZXIgZnJhbWUgaW4gLjF1cyB1bml0cyAqLworCV9fdTMyCQkgICBleHRlbmRlZG1vZGU7ICAvKiAgRHJpdmVyLXNwZWNpZmljIGV4dGVuc2lvbnMgKi8KKwlfX3UzMiAgICAgICAgICAgICAgcmVhZGJ1ZmZlcnM7ICAgLyogICMgb2YgYnVmZmVycyBmb3IgcmVhZCAqLworCV9fdTMyCQkgICByZXNlcnZlZFs0XTsKK307CisKKy8qICBGbGFncyBmb3IgJ2NhcGFiaWxpdHknIGFuZCAnY2FwdHVyZW1vZGUnIGZpZWxkcyAqLworI2RlZmluZSBWNEwyX01PREVfSElHSFFVQUxJVFkJMHgwMDAxCS8qICBIaWdoIHF1YWxpdHkgaW1hZ2luZyBtb2RlICovCisjZGVmaW5lIFY0TDJfQ0FQX1RJTUVQRVJGUkFNRQkweDEwMDAJLyogIHRpbWVwZXJmcmFtZSBmaWVsZCBpcyBzdXBwb3J0ZWQgKi8KKworc3RydWN0IHY0bDJfb3V0cHV0cGFybSB7CisJX191MzIJCSAgIGNhcGFiaWxpdHk7CSAvKiAgU3VwcG9ydGVkIG1vZGVzICovCisJX191MzIJCSAgIG91dHB1dG1vZGU7CSAvKiAgQ3VycmVudCBtb2RlICovCisJc3RydWN0IHY0bDJfZnJhY3QgIHRpbWVwZXJmcmFtZTsgLyogIFRpbWUgcGVyIGZyYW1lIGluIHNlY29uZHMgKi8KKwlfX3UzMgkJICAgZXh0ZW5kZWRtb2RlOyAvKiAgRHJpdmVyLXNwZWNpZmljIGV4dGVuc2lvbnMgKi8KKwlfX3UzMiAgICAgICAgICAgICAgd3JpdGVidWZmZXJzOyAvKiAgIyBvZiBidWZmZXJzIGZvciB3cml0ZSAqLworCV9fdTMyCQkgICByZXNlcnZlZFs0XTsKK307CisKKy8qCisgKglJIE4gUCBVIFQgICBJIE0gQSBHIEUgICBDIFIgTyBQIFAgSSBOIEcKKyAqLworc3RydWN0IHY0bDJfY3JvcGNhcCB7CisJZW51bSB2NGwyX2J1Zl90eXBlICAgICAgdHlwZTsKKwlzdHJ1Y3QgdjRsMl9yZWN0ICAgICAgICBib3VuZHM7CisJc3RydWN0IHY0bDJfcmVjdCAgICAgICAgZGVmcmVjdDsKKwlzdHJ1Y3QgdjRsMl9mcmFjdCAgICAgICBwaXhlbGFzcGVjdDsKK307CisKK3N0cnVjdCB2NGwyX2Nyb3AgeworCWVudW0gdjRsMl9idWZfdHlwZSAgICAgIHR5cGU7CisJc3RydWN0IHY0bDJfcmVjdCAgICAgICAgYzsKK307CisKKy8qCisgKiAgICAgIEEgTiBBIEwgTyBHICAgViBJIEQgRSBPICAgUyBUIEEgTiBEIEEgUiBECisgKi8KKwordHlwZWRlZiBfX3U2NCB2NGwyX3N0ZF9pZDsKKworLyogb25lIGJpdCBmb3IgZWFjaCAqLworI2RlZmluZSBWNEwyX1NURF9QQUxfQiAgICAgICAgICAoKHY0bDJfc3RkX2lkKTB4MDAwMDAwMDEpCisjZGVmaW5lIFY0TDJfU1REX1BBTF9CMSAgICAgICAgICgodjRsMl9zdGRfaWQpMHgwMDAwMDAwMikKKyNkZWZpbmUgVjRMMl9TVERfUEFMX0cgICAgICAgICAgKCh2NGwyX3N0ZF9pZCkweDAwMDAwMDA0KQorI2RlZmluZSBWNEwyX1NURF9QQUxfSCAgICAgICAgICAoKHY0bDJfc3RkX2lkKTB4MDAwMDAwMDgpCisjZGVmaW5lIFY0TDJfU1REX1BBTF9JICAgICAgICAgICgodjRsMl9zdGRfaWQpMHgwMDAwMDAxMCkKKyNkZWZpbmUgVjRMMl9TVERfUEFMX0QgICAgICAgICAgKCh2NGwyX3N0ZF9pZCkweDAwMDAwMDIwKQorI2RlZmluZSBWNEwyX1NURF9QQUxfRDEgICAgICAgICAoKHY0bDJfc3RkX2lkKTB4MDAwMDAwNDApCisjZGVmaW5lIFY0TDJfU1REX1BBTF9LICAgICAgICAgICgodjRsMl9zdGRfaWQpMHgwMDAwMDA4MCkKKworI2RlZmluZSBWNEwyX1NURF9QQUxfTSAgICAgICAgICAoKHY0bDJfc3RkX2lkKTB4MDAwMDAxMDApCisjZGVmaW5lIFY0TDJfU1REX1BBTF9OICAgICAgICAgICgodjRsMl9zdGRfaWQpMHgwMDAwMDIwMCkKKyNkZWZpbmUgVjRMMl9TVERfUEFMX05jICAgICAgICAgKCh2NGwyX3N0ZF9pZCkweDAwMDAwNDAwKQorI2RlZmluZSBWNEwyX1NURF9QQUxfNjAgICAgICAgICAoKHY0bDJfc3RkX2lkKTB4MDAwMDA4MDApCisKKyNkZWZpbmUgVjRMMl9TVERfTlRTQ19NICAgICAgICAgKCh2NGwyX3N0ZF9pZCkweDAwMDAxMDAwKQorI2RlZmluZSBWNEwyX1NURF9OVFNDX01fSlAgICAgICAoKHY0bDJfc3RkX2lkKTB4MDAwMDIwMDApCisjZGVmaW5lIFY0TDJfU1REX05UU0NfNDQzICAgICAgICgodjRsMl9zdGRfaWQpMHgwMDAwNDAwMCkKKyNkZWZpbmUgVjRMMl9TVERfTlRTQ19NX0tSICAgICAgKCh2NGwyX3N0ZF9pZCkweDAwMDA4MDAwKQorCisjZGVmaW5lIFY0TDJfU1REX1NFQ0FNX0IgICAgICAgICgodjRsMl9zdGRfaWQpMHgwMDAxMDAwMCkKKyNkZWZpbmUgVjRMMl9TVERfU0VDQU1fRCAgICAgICAgKCh2NGwyX3N0ZF9pZCkweDAwMDIwMDAwKQorI2RlZmluZSBWNEwyX1NURF9TRUNBTV9HICAgICAgICAoKHY0bDJfc3RkX2lkKTB4MDAwNDAwMDApCisjZGVmaW5lIFY0TDJfU1REX1NFQ0FNX0ggICAgICAgICgodjRsMl9zdGRfaWQpMHgwMDA4MDAwMCkKKyNkZWZpbmUgVjRMMl9TVERfU0VDQU1fSyAgICAgICAgKCh2NGwyX3N0ZF9pZCkweDAwMTAwMDAwKQorI2RlZmluZSBWNEwyX1NURF9TRUNBTV9LMSAgICAgICAoKHY0bDJfc3RkX2lkKTB4MDAyMDAwMDApCisjZGVmaW5lIFY0TDJfU1REX1NFQ0FNX0wgICAgICAgICgodjRsMl9zdGRfaWQpMHgwMDQwMDAwMCkKKyNkZWZpbmUgVjRMMl9TVERfU0VDQU1fTEMgICAgICAgKCh2NGwyX3N0ZF9pZCkweDAwODAwMDAwKQorCisvKiBBVFNDL0hEVFYgKi8KKyNkZWZpbmUgVjRMMl9TVERfQVRTQ184X1ZTQiAgICAgKCh2NGwyX3N0ZF9pZCkweDAxMDAwMDAwKQorI2RlZmluZSBWNEwyX1NURF9BVFNDXzE2X1ZTQiAgICAoKHY0bDJfc3RkX2lkKTB4MDIwMDAwMDApCisKKy8qIEZJWE1FOgorICAgQWx0aG91Z2ggc3RkX2lkIGlzIDY0IGJpdHMsIHRoZXJlIGlzIGFuIGlzc3VlIG9uIFBQQzMyIGFyY2hpdGVjdHVyZSB0aGF0CisgICBtYWtlcyBzd2l0Y2goX191NjQpIHRvIGJyZWFrLiBTbywgdGhlcmUncyBhIGhhY2sgb24gdjRsMi1jb21tb24uYyByb3VuZGluZworICAgdGhpcyB2YWx1ZSB0byAzMiBiaXRzLgorICAgQXMsIGN1cnJlbnRseSwgdGhlIG1heCB2YWx1ZSBpcyBmb3IgVjRMMl9TVERfQVRTQ18xNl9WU0IgKDMwIGJpdHMgd2lkZSksCisgICBpdCBzaG91bGQgd29yayBmaW5lLiBIb3dldmVyLCBpZiBuZWVkZWQgdG8gYWRkIG1vcmUgdGhhbiB0d28gc3RhbmRhcmRzLAorICAgdjRsMi1jb21tb24uYyBzaG91bGQgYmUgZml4ZWQuCisgKi8KKworLyogc29tZSBtZXJnZWQgc3RhbmRhcmRzICovCisjZGVmaW5lIFY0TDJfU1REX01OCShWNEwyX1NURF9QQUxfTXxWNEwyX1NURF9QQUxfTnxWNEwyX1NURF9QQUxfTmN8VjRMMl9TVERfTlRTQykKKyNkZWZpbmUgVjRMMl9TVERfQgkoVjRMMl9TVERfUEFMX0J8VjRMMl9TVERfUEFMX0IxfFY0TDJfU1REX1NFQ0FNX0IpCisjZGVmaW5lIFY0TDJfU1REX0dICShWNEwyX1NURF9QQUxfR3xWNEwyX1NURF9QQUxfSHxWNEwyX1NURF9TRUNBTV9HfFY0TDJfU1REX1NFQ0FNX0gpCisjZGVmaW5lIFY0TDJfU1REX0RLCShWNEwyX1NURF9QQUxfREt8VjRMMl9TVERfU0VDQU1fREspCisKKy8qIHNvbWUgY29tbW9uIG5lZWRlZCBzdHVmZiAqLworI2RlZmluZSBWNEwyX1NURF9QQUxfQkcJCShWNEwyX1NURF9QQUxfQgkJfFwKKwkJCQkgVjRMMl9TVERfUEFMX0IxCXxcCisJCQkJIFY0TDJfU1REX1BBTF9HKQorI2RlZmluZSBWNEwyX1NURF9QQUxfREsJCShWNEwyX1NURF9QQUxfRAkJfFwKKwkJCQkgVjRMMl9TVERfUEFMX0QxCXxcCisJCQkJIFY0TDJfU1REX1BBTF9LKQorI2RlZmluZSBWNEwyX1NURF9QQUwJCShWNEwyX1NURF9QQUxfQkcJfFwKKwkJCQkgVjRMMl9TVERfUEFMX0RLCXxcCisJCQkJIFY0TDJfU1REX1BBTF9ICQl8XAorCQkJCSBWNEwyX1NURF9QQUxfSSkKKyNkZWZpbmUgVjRMMl9TVERfTlRTQyAgICAgICAgICAgKFY0TDJfU1REX05UU0NfTQl8XAorCQkJCSBWNEwyX1NURF9OVFNDX01fSlAgICAgIHxcCisJCQkJIFY0TDJfU1REX05UU0NfTV9LUikKKyNkZWZpbmUgVjRMMl9TVERfU0VDQU1fREsgICAgICAJKFY0TDJfU1REX1NFQ0FNX0QJfFwKKwkJCQkgVjRMMl9TVERfU0VDQU1fSwl8XAorCQkJCSBWNEwyX1NURF9TRUNBTV9LMSkKKyNkZWZpbmUgVjRMMl9TVERfU0VDQU0JCShWNEwyX1NURF9TRUNBTV9CCXxcCisJCQkJIFY0TDJfU1REX1NFQ0FNX0cJfFwKKwkJCQkgVjRMMl9TVERfU0VDQU1fSAl8XAorCQkJCSBWNEwyX1NURF9TRUNBTV9ESwl8XAorCQkJCSBWNEwyX1NURF9TRUNBTV9MICAgICAgIHxcCisJCQkJIFY0TDJfU1REX1NFQ0FNX0xDKQorCisjZGVmaW5lIFY0TDJfU1REXzUyNV82MAkJKFY0TDJfU1REX1BBTF9NCQl8XAorCQkJCSBWNEwyX1NURF9QQUxfNjAJfFwKKwkJCQkgVjRMMl9TVERfTlRTQwkJfFwKKwkJCQkgVjRMMl9TVERfTlRTQ180NDMpCisjZGVmaW5lIFY0TDJfU1REXzYyNV81MAkJKFY0TDJfU1REX1BBTAkJfFwKKwkJCQkgVjRMMl9TVERfUEFMX04JCXxcCisJCQkJIFY0TDJfU1REX1BBTF9OYwl8XAorCQkJCSBWNEwyX1NURF9TRUNBTSkKKyNkZWZpbmUgVjRMMl9TVERfQVRTQyAgICAgICAgICAgKFY0TDJfU1REX0FUU0NfOF9WU0IgICAgfFwKKwkJCQkgVjRMMl9TVERfQVRTQ18xNl9WU0IpCisKKyNkZWZpbmUgVjRMMl9TVERfVU5LTk9XTiAgICAgICAgMAorI2RlZmluZSBWNEwyX1NURF9BTEwgICAgICAgICAgICAoVjRMMl9TVERfNTI1XzYwCXxcCisJCQkJIFY0TDJfU1REXzYyNV81MCkKKworc3RydWN0IHY0bDJfc3RhbmRhcmQgeworCV9fdTMyCQkgICAgIGluZGV4OworCXY0bDJfc3RkX2lkICAgICAgICAgIGlkOworCV9fdTgJCSAgICAgbmFtZVsyNF07CisJc3RydWN0IHY0bDJfZnJhY3QgICAgZnJhbWVwZXJpb2Q7IC8qIEZyYW1lcywgbm90IGZpZWxkcyAqLworCV9fdTMyCQkgICAgIGZyYW1lbGluZXM7CisJX191MzIJCSAgICAgcmVzZXJ2ZWRbNF07Cit9OworCisvKgorICoJViBJIEQgRSBPCVQgSSBNIEkgTiBHIFMJRCBWCVAgUiBFIFMgRSBUCisgKi8KK3N0cnVjdCB2NGwyX2R2X3ByZXNldCB7CisJX191MzIJcHJlc2V0OworCV9fdTMyCXJlc2VydmVkWzRdOworfTsKKworLyoKKyAqCUQgVglQIFIgRSBTIEUgVCBTCUUgTiBVIE0gRSBSIEEgVCBJIE8gTgorICovCitzdHJ1Y3QgdjRsMl9kdl9lbnVtX3ByZXNldCB7CisJX191MzIJaW5kZXg7CisJX191MzIJcHJlc2V0OworCV9fdTgJbmFtZVszMl07IC8qIE5hbWUgb2YgdGhlIHByZXNldCB0aW1pbmcgKi8KKwlfX3UzMgl3aWR0aDsKKwlfX3UzMgloZWlnaHQ7CisJX191MzIJcmVzZXJ2ZWRbNF07Cit9OworCisvKgorICogCUQgVglQIFIgRSBTIEUgVAlWIEEgTCBVIEUgUworICovCisjZGVmaW5lCQlWNEwyX0RWX0lOVkFMSUQJCTAKKyNkZWZpbmUJCVY0TDJfRFZfNDgwUDU5Xzk0CTEgLyogQlQuMTM2MiAqLworI2RlZmluZQkJVjRMMl9EVl81NzZQNTAJCTIgLyogQlQuMTM2MiAqLworI2RlZmluZQkJVjRMMl9EVl83MjBQMjQJCTMgLyogU01QVEUgMjk2TSAqLworI2RlZmluZQkJVjRMMl9EVl83MjBQMjUJCTQgLyogU01QVEUgMjk2TSAqLworI2RlZmluZQkJVjRMMl9EVl83MjBQMzAJCTUgLyogU01QVEUgMjk2TSAqLworI2RlZmluZQkJVjRMMl9EVl83MjBQNTAJCTYgLyogU01QVEUgMjk2TSAqLworI2RlZmluZQkJVjRMMl9EVl83MjBQNTlfOTQJNyAvKiBTTVBURSAyNzRNICovCisjZGVmaW5lCQlWNEwyX0RWXzcyMFA2MAkJOCAvKiBTTVBURSAyNzRNLzI5Nk0gKi8KKyNkZWZpbmUJCVY0TDJfRFZfMTA4MEkyOV85Nwk5IC8qIEJULjExMjAvIFNNUFRFIDI3NE0gKi8KKyNkZWZpbmUJCVY0TDJfRFZfMTA4MEkzMAkJMTAgLyogQlQuMTEyMC8gU01QVEUgMjc0TSAqLworI2RlZmluZQkJVjRMMl9EVl8xMDgwSTI1CQkxMSAvKiBCVC4xMTIwICovCisjZGVmaW5lCQlWNEwyX0RWXzEwODBJNTAJCTEyIC8qIFNNUFRFIDI5Nk0gKi8KKyNkZWZpbmUJCVY0TDJfRFZfMTA4MEk2MAkJMTMgLyogU01QVEUgMjk2TSAqLworI2RlZmluZQkJVjRMMl9EVl8xMDgwUDI0CQkxNCAvKiBTTVBURSAyOTZNICovCisjZGVmaW5lCQlWNEwyX0RWXzEwODBQMjUJCTE1IC8qIFNNUFRFIDI5Nk0gKi8KKyNkZWZpbmUJCVY0TDJfRFZfMTA4MFAzMAkJMTYgLyogU01QVEUgMjk2TSAqLworI2RlZmluZQkJVjRMMl9EVl8xMDgwUDUwCQkxNyAvKiBCVC4xMTIwICovCisjZGVmaW5lCQlWNEwyX0RWXzEwODBQNjAJCTE4IC8qIEJULjExMjAgKi8KKworI2RlZmluZQkJVjRMMl9EVl80ODBQNjAJCQkxOQorI2RlZmluZQkJVjRMMl9EVl8xMDgwSTU5Xzk0CQkyMAorI2RlZmluZQkJVjRMMl9EVl8xMDgwUDU5Xzk0CQkyMQorCisjZGVmaW5lCQlWNEwyX0RWXzcyMFA2MF9GUAkJMjIKKyNkZWZpbmUJCVY0TDJfRFZfNzIwUDYwX1NCX0hBTEYJCTIzCisjZGVmaW5lCQlWNEwyX0RWXzcyMFA2MF9UQgkJMjQKKyNkZWZpbmUJCVY0TDJfRFZfNzIwUDU5Xzk0X0ZQCQkyNQorI2RlZmluZQkJVjRMMl9EVl83MjBQNTlfOTRfU0JfSEFMRgkyNgorI2RlZmluZQkJVjRMMl9EVl83MjBQNTlfOTRfVEIJCTI3CisjZGVmaW5lCQlWNEwyX0RWXzcyMFA1MF9GUAkJMjgKKyNkZWZpbmUJCVY0TDJfRFZfNzIwUDUwX1NCX0hBTEYJCTI5CisjZGVmaW5lCQlWNEwyX0RWXzcyMFA1MF9UQgkJMzAKKyNkZWZpbmUJCVY0TDJfRFZfMTA4MFAyNF9GUAkJMzEKKyNkZWZpbmUJCVY0TDJfRFZfMTA4MFAyNF9TQl9IQUxGCQkzMgorI2RlZmluZQkJVjRMMl9EVl8xMDgwUDI0X1RCCQkzMworI2RlZmluZQkJVjRMMl9EVl8xMDgwUDIzXzk4X0ZQCQkzNAorI2RlZmluZQkJVjRMMl9EVl8xMDgwUDIzXzk4X1NCX0hBTEYJMzUKKyNkZWZpbmUJCVY0TDJfRFZfMTA4MFAyM185OF9UQgkJMzYKKyNkZWZpbmUJCVY0TDJfRFZfMTA4MEk2MF9TQl9IQUxGCQkzNworI2RlZmluZQkJVjRMMl9EVl8xMDgwSTU5Xzk0X1NCX0hBTEYJMzgKKyNkZWZpbmUJCVY0TDJfRFZfMTA4MEk1MF9TQl9IQUxGCQkzOQorI2RlZmluZQkJVjRMMl9EVl8xMDgwUDYwX1NCX0hBTEYJCTQwCisjZGVmaW5lCQlWNEwyX0RWXzEwODBQNjBfVEIJCTQxCisjZGVmaW5lCQlWNEwyX0RWXzEwODBQMzBfRlAJCTQyCisjZGVmaW5lCQlWNEwyX0RWXzEwODBQMzBfU0JfSEFMRgkJNDMKKyNkZWZpbmUJCVY0TDJfRFZfMTA4MFAzMF9UQgkJNDQKKworLyoKKyAqCUQgViAJQiBUCVQgSSBNIEkgTiBHIFMKKyAqLworCisvKiBCVC42NTYvQlQuMTEyMCB0aW1pbmcgZGF0YSAqLworc3RydWN0IHY0bDJfYnRfdGltaW5ncyB7CisJX191MzIJd2lkdGg7CQkvKiB3aWR0aCBpbiBwaXhlbHMgKi8KKwlfX3UzMgloZWlnaHQ7CQkvKiBoZWlnaHQgaW4gbGluZXMgKi8KKwlfX3UzMglpbnRlcmxhY2VkOwkvKiBJbnRlcmxhY2VkIG9yIHByb2dyZXNzaXZlICovCisJX191MzIJcG9sYXJpdGllczsJLyogUG9zaXRpdmUgb3IgbmVnYXRpdmUgcG9sYXJpdHkgKi8KKwlfX3U2NAlwaXhlbGNsb2NrOwkvKiBQaXhlbCBjbG9jayBpbiBIWi4gRXguIDc0LjI1TUh6LT43NDI1MDAwMCAqLworCV9fdTMyCWhmcm9udHBvcmNoOwkvKiBIb3JpenBvbnRhbCBmcm9udCBwb3JjaCBpbiBwaXhlbHMgKi8KKwlfX3UzMgloc3luYzsJCS8qIEhvcml6b250YWwgU3luYyBsZW5ndGggaW4gcGl4ZWxzICovCisJX191MzIJaGJhY2twb3JjaDsJLyogSG9yaXpvbnRhbCBiYWNrIHBvcmNoIGluIHBpeGVscyAqLworCV9fdTMyCXZmcm9udHBvcmNoOwkvKiBWZXJ0aWNhbCBmcm9udCBwb3JjaCBpbiBwaXhlbHMgKi8KKwlfX3UzMgl2c3luYzsJCS8qIFZlcnRpY2FsIFN5bmMgbGVuZ3RoIGluIGxpbmVzICovCisJX191MzIJdmJhY2twb3JjaDsJLyogVmVydGljYWwgYmFjayBwb3JjaCBpbiBsaW5lcyAqLworCV9fdTMyCWlsX3Zmcm9udHBvcmNoOwkvKiBWZXJ0aWNhbCBmcm9udCBwb3JjaCBmb3IgYm90dG9tIGZpZWxkIG9mCisJCQkJICogaW50ZXJsYWNlZCBmaWVsZCBmb3JtYXRzCisJCQkJICovCisJX191MzIJaWxfdnN5bmM7CS8qIFZlcnRpY2FsIHN5bmMgbGVuZ3RoIGZvciBib3R0b20gZmllbGQgb2YKKwkJCQkgKiBpbnRlcmxhY2VkIGZpZWxkIGZvcm1hdHMKKwkJCQkgKi8KKwlfX3UzMglpbF92YmFja3BvcmNoOwkvKiBWZXJ0aWNhbCBiYWNrIHBvcmNoIGZvciBib3R0b20gZmllbGQgb2YKKwkJCQkgKiBpbnRlcmxhY2VkIGZpZWxkIGZvcm1hdHMKKwkJCQkgKi8KKwlfX3UzMglyZXNlcnZlZFsxNl07Cit9IF9fYXR0cmlidXRlX18gKChwYWNrZWQpKTsKKworLyogSW50ZXJsYWNlZCBvciBwcm9ncmVzc2l2ZSBmb3JtYXQgKi8KKyNkZWZpbmUJVjRMMl9EVl9QUk9HUkVTU0lWRQkwCisjZGVmaW5lCVY0TDJfRFZfSU5URVJMQUNFRAkxCisKKy8qIFBvbGFyaXRpZXMuIElmIGJpdCBpcyBub3Qgc2V0LCBpdCBpcyBhc3N1bWVkIHRvIGJlIG5lZ2F0aXZlIHBvbGFyaXR5ICovCisjZGVmaW5lIFY0TDJfRFZfVlNZTkNfUE9TX1BPTAkweDAwMDAwMDAxCisjZGVmaW5lIFY0TDJfRFZfSFNZTkNfUE9TX1BPTAkweDAwMDAwMDAyCisKKworLyogRFYgdGltaW5ncyAqLworc3RydWN0IHY0bDJfZHZfdGltaW5ncyB7CisJX191MzIgdHlwZTsKKwl1bmlvbiB7CisJCXN0cnVjdCB2NGwyX2J0X3RpbWluZ3MJYnQ7CisJCV9fdTMyCXJlc2VydmVkWzMyXTsKKwl9OworfSBfX2F0dHJpYnV0ZV9fICgocGFja2VkKSk7CisKKy8qIFZhbHVlcyBmb3IgdGhlIHR5cGUgZmllbGQgKi8KKyNkZWZpbmUgVjRMMl9EVl9CVF82NTZfMTEyMAkwCS8qIEJULjY1Ni8xMTIwIHRpbWluZyB0eXBlICovCisKKy8qCisgKglWIEkgRCBFIE8gICBJIE4gUCBVIFQgUworICovCitzdHJ1Y3QgdjRsMl9pbnB1dCB7CisJX191MzIJICAgICBpbmRleDsJCS8qICBXaGljaCBpbnB1dCAqLworCV9fdTgJICAgICBuYW1lWzMyXTsJCS8qICBMYWJlbCAqLworCV9fdTMyCSAgICAgdHlwZTsJCS8qICBUeXBlIG9mIGlucHV0ICovCisJX191MzIJICAgICBhdWRpb3NldDsJCS8qICBBc3NvY2lhdGVkIGF1ZGlvcyAoYml0ZmllbGQpICovCisJX191MzIgICAgICAgIHR1bmVyOyAgICAgICAgICAgICAvKiAgQXNzb2NpYXRlZCB0dW5lciAqLworCXY0bDJfc3RkX2lkICBzdGQ7CisJX191MzIJICAgICBzdGF0dXM7CisJX191MzIJICAgICBjYXBhYmlsaXRpZXM7CisJX191MzIJICAgICByZXNlcnZlZFszXTsKK307CisKKy8qICBWYWx1ZXMgZm9yIHRoZSAndHlwZScgZmllbGQgKi8KKyNkZWZpbmUgVjRMMl9JTlBVVF9UWVBFX1RVTkVSCQkxCisjZGVmaW5lIFY0TDJfSU5QVVRfVFlQRV9DQU1FUkEJCTIKKworLyogZmllbGQgJ3N0YXR1cycgLSBnZW5lcmFsICovCisjZGVmaW5lIFY0TDJfSU5fU1RfTk9fUE9XRVIgICAgMHgwMDAwMDAwMSAgLyogQXR0YWNoZWQgZGV2aWNlIGlzIG9mZiAqLworI2RlZmluZSBWNEwyX0lOX1NUX05PX1NJR05BTCAgIDB4MDAwMDAwMDIKKyNkZWZpbmUgVjRMMl9JTl9TVF9OT19DT0xPUiAgICAweDAwMDAwMDA0CisKKy8qIGZpZWxkICdzdGF0dXMnIC0gc2Vuc29yIG9yaWVudGF0aW9uICovCisvKiBJZiBzZW5zb3IgaXMgbW91bnRlZCB1cHNpZGUgZG93biBzZXQgYm90aCBiaXRzICovCisjZGVmaW5lIFY0TDJfSU5fU1RfSEZMSVAgICAgICAgMHgwMDAwMDAxMCAvKiBGcmFtZXMgYXJlIGZsaXBwZWQgaG9yaXpvbnRhbGx5ICovCisjZGVmaW5lIFY0TDJfSU5fU1RfVkZMSVAgICAgICAgMHgwMDAwMDAyMCAvKiBGcmFtZXMgYXJlIGZsaXBwZWQgdmVydGljYWxseSAqLworCisvKiBmaWVsZCAnc3RhdHVzJyAtIGFuYWxvZyAqLworI2RlZmluZSBWNEwyX0lOX1NUX05PX0hfTE9DSyAgIDB4MDAwMDAxMDAgIC8qIE5vIGhvcml6b250YWwgc3luYyBsb2NrICovCisjZGVmaW5lIFY0TDJfSU5fU1RfQ09MT1JfS0lMTCAgMHgwMDAwMDIwMCAgLyogQ29sb3Iga2lsbGVyIGlzIGFjdGl2ZSAqLworCisvKiBmaWVsZCAnc3RhdHVzJyAtIGRpZ2l0YWwgKi8KKyNkZWZpbmUgVjRMMl9JTl9TVF9OT19TWU5DICAgICAweDAwMDEwMDAwICAvKiBObyBzeW5jaHJvbml6YXRpb24gbG9jayAqLworI2RlZmluZSBWNEwyX0lOX1NUX05PX0VRVSAgICAgIDB4MDAwMjAwMDAgIC8qIE5vIGVxdWFsaXplciBsb2NrICovCisjZGVmaW5lIFY0TDJfSU5fU1RfTk9fQ0FSUklFUiAgMHgwMDA0MDAwMCAgLyogQ2FycmllciByZWNvdmVyeSBmYWlsZWQgKi8KKworLyogZmllbGQgJ3N0YXR1cycgLSBWQ1IgYW5kIHNldC10b3AgYm94ICovCisjZGVmaW5lIFY0TDJfSU5fU1RfTUFDUk9WSVNJT04gMHgwMTAwMDAwMCAgLyogTWFjcm92aXNpb24gZGV0ZWN0ZWQgKi8KKyNkZWZpbmUgVjRMMl9JTl9TVF9OT19BQ0NFU1MgICAweDAyMDAwMDAwICAvKiBDb25kaXRpb25hbCBhY2Nlc3MgZGVuaWVkICovCisjZGVmaW5lIFY0TDJfSU5fU1RfVlRSICAgICAgICAgMHgwNDAwMDAwMCAgLyogVlRSIHRpbWUgY29uc3RhbnQgKi8KKworLyogY2FwYWJpbGl0aWVzIGZsYWdzICovCisjZGVmaW5lIFY0TDJfSU5fQ0FQX1BSRVNFVFMJCTB4MDAwMDAwMDEgLyogU3VwcG9ydHMgU19EVl9QUkVTRVQgKi8KKyNkZWZpbmUgVjRMMl9JTl9DQVBfQ1VTVE9NX1RJTUlOR1MJMHgwMDAwMDAwMiAvKiBTdXBwb3J0cyBTX0RWX1RJTUlOR1MgKi8KKyNkZWZpbmUgVjRMMl9JTl9DQVBfU1RECQkJMHgwMDAwMDAwNCAvKiBTdXBwb3J0cyBTX1NURCAqLworCisvKgorICoJViBJIEQgRSBPICAgTyBVIFQgUCBVIFQgUworICovCitzdHJ1Y3QgdjRsMl9vdXRwdXQgeworCV9fdTMyCSAgICAgaW5kZXg7CQkvKiAgV2hpY2ggb3V0cHV0ICovCisJX191OAkgICAgIG5hbWVbMzJdOwkJLyogIExhYmVsICovCisJX191MzIJICAgICB0eXBlOwkJLyogIFR5cGUgb2Ygb3V0cHV0ICovCisJX191MzIJICAgICBhdWRpb3NldDsJCS8qICBBc3NvY2lhdGVkIGF1ZGlvcyAoYml0ZmllbGQpICovCisJX191MzIJICAgICBtb2R1bGF0b3I7ICAgICAgICAgLyogIEFzc29jaWF0ZWQgbW9kdWxhdG9yICovCisJdjRsMl9zdGRfaWQgIHN0ZDsKKwlfX3UzMgkgICAgIGNhcGFiaWxpdGllczsKKwlfX3UzMgkgICAgIHJlc2VydmVkWzNdOworfTsKKy8qICBWYWx1ZXMgZm9yIHRoZSAndHlwZScgZmllbGQgKi8KKyNkZWZpbmUgVjRMMl9PVVRQVVRfVFlQRV9NT0RVTEFUT1IJCTEKKyNkZWZpbmUgVjRMMl9PVVRQVVRfVFlQRV9BTkFMT0cJCQkyCisjZGVmaW5lIFY0TDJfT1VUUFVUX1RZUEVfQU5BTE9HVkdBT1ZFUkxBWQkzCisKKy8qIGNhcGFiaWxpdGllcyBmbGFncyAqLworI2RlZmluZSBWNEwyX09VVF9DQVBfUFJFU0VUUwkJMHgwMDAwMDAwMSAvKiBTdXBwb3J0cyBTX0RWX1BSRVNFVCAqLworI2RlZmluZSBWNEwyX09VVF9DQVBfQ1VTVE9NX1RJTUlOR1MJMHgwMDAwMDAwMiAvKiBTdXBwb3J0cyBTX0RWX1RJTUlOR1MgKi8KKyNkZWZpbmUgVjRMMl9PVVRfQ0FQX1NURAkJMHgwMDAwMDAwNCAvKiBTdXBwb3J0cyBTX1NURCAqLworCisvKgorICoJQyBPIE4gVCBSIE8gTCBTCisgKi8KK3N0cnVjdCB2NGwyX2NvbnRyb2wgeworCV9fdTMyCQkgICAgIGlkOworCV9fczMyCQkgICAgIHZhbHVlOworfTsKKworc3RydWN0IHY0bDJfZXh0X2NvbnRyb2wgeworCV9fdTMyIGlkOworCV9fdTMyIHNpemU7CisJX191MzIgcmVzZXJ2ZWQyWzFdOworCXVuaW9uIHsKKwkJX19zMzIgdmFsdWU7CisJCV9fczY0IHZhbHVlNjQ7CisJCWNoYXIgKnN0cmluZzsKKwl9OworfSBfX2F0dHJpYnV0ZV9fICgocGFja2VkKSk7CisKK3N0cnVjdCB2NGwyX2V4dF9jb250cm9scyB7CisJX191MzIgY3RybF9jbGFzczsKKwlfX3UzMiBjb3VudDsKKwlfX3UzMiBlcnJvcl9pZHg7CisJX191MzIgcmVzZXJ2ZWRbMl07CisJc3RydWN0IHY0bDJfZXh0X2NvbnRyb2wgKmNvbnRyb2xzOworfTsKKworLyogIFZhbHVlcyBmb3IgY3RybF9jbGFzcyBmaWVsZCAqLworI2RlZmluZSBWNEwyX0NUUkxfQ0xBU1NfVVNFUiAweDAwOTgwMDAwCS8qIE9sZC1zdHlsZSAndXNlcicgY29udHJvbHMgKi8KKyNkZWZpbmUgVjRMMl9DVFJMX0NMQVNTX01QRUcgMHgwMDk5MDAwMAkvKiBNUEVHLWNvbXByZXNzaW9uIGNvbnRyb2xzICovCisjZGVmaW5lIFY0TDJfQ1RSTF9DTEFTU19DQU1FUkEgMHgwMDlhMDAwMAkvKiBDYW1lcmEgY2xhc3MgY29udHJvbHMgKi8KKyNkZWZpbmUgVjRMMl9DVFJMX0NMQVNTX0ZNX1RYIDB4MDA5YjAwMDAJLyogRk0gTW9kdWxhdG9yIGNvbnRyb2wgY2xhc3MgKi8KKyNkZWZpbmUgVjRMMl9DVFJMX0NMQVNTX0NPREVDIDB4MDA5YzAwMDAJLyogQ29kZWMgY29udHJvbCBjbGFzcyAqLworCisjZGVmaW5lIFY0TDJfQ1RSTF9JRF9NQVNLICAgICAgCSAgKDB4MGZmZmZmZmYpCisjZGVmaW5lIFY0TDJfQ1RSTF9JRDJDTEFTUyhpZCkgICAgKChpZCkgJiAweDBmZmYwMDAwVUwpCisjZGVmaW5lIFY0TDJfQ1RSTF9EUklWRVJfUFJJVihpZCkgKCgoaWQpICYgMHhmZmZmKSA+PSAweDEwMDApCisKK2VudW0gdjRsMl9jdHJsX3R5cGUgeworCVY0TDJfQ1RSTF9UWVBFX0lOVEVHRVIJICAgICA9IDEsCisJVjRMMl9DVFJMX1RZUEVfQk9PTEVBTgkgICAgID0gMiwKKwlWNEwyX0NUUkxfVFlQRV9NRU5VCSAgICAgPSAzLAorCVY0TDJfQ1RSTF9UWVBFX0JVVFRPTgkgICAgID0gNCwKKwlWNEwyX0NUUkxfVFlQRV9JTlRFR0VSNjQgICAgID0gNSwKKwlWNEwyX0NUUkxfVFlQRV9DVFJMX0NMQVNTICAgID0gNiwKKwlWNEwyX0NUUkxfVFlQRV9TVFJJTkcgICAgICAgID0gNywKK307CisKKy8qICBVc2VkIGluIHRoZSBWSURJT0NfUVVFUllDVFJMIGlvY3RsIGZvciBxdWVyeWluZyBjb250cm9scyAqLworc3RydWN0IHY0bDJfcXVlcnljdHJsIHsKKwlfX3UzMgkJICAgICBpZDsKKwllbnVtIHY0bDJfY3RybF90eXBlICB0eXBlOworCV9fdTgJCSAgICAgbmFtZVszMl07CS8qIFdoYXRldmVyICovCisJX19zMzIJCSAgICAgbWluaW11bTsJLyogTm90ZSBzaWduZWRuZXNzICovCisJX19zMzIJCSAgICAgbWF4aW11bTsKKwlfX3MzMgkJICAgICBzdGVwOworCV9fczMyCQkgICAgIGRlZmF1bHRfdmFsdWU7CisJX191MzIgICAgICAgICAgICAgICAgZmxhZ3M7CisJX191MzIJCSAgICAgcmVzZXJ2ZWRbMl07Cit9OworCisvKiAgVXNlZCBpbiB0aGUgVklESU9DX1FVRVJZTUVOVSBpb2N0bCBmb3IgcXVlcnlpbmcgbWVudSBpdGVtcyAqLworc3RydWN0IHY0bDJfcXVlcnltZW51IHsKKwlfX3UzMgkJaWQ7CisJX191MzIJCWluZGV4OworCV9fdTgJCW5hbWVbMzJdOwkvKiBXaGF0ZXZlciAqLworCV9fdTMyCQlyZXNlcnZlZDsKK307CisKKy8qICBDb250cm9sIGZsYWdzICAqLworI2RlZmluZSBWNEwyX0NUUkxfRkxBR19ESVNBQkxFRAkJMHgwMDAxCisjZGVmaW5lIFY0TDJfQ1RSTF9GTEFHX0dSQUJCRUQJCTB4MDAwMgorI2RlZmluZSBWNEwyX0NUUkxfRkxBR19SRUFEX09OTFkgCTB4MDAwNAorI2RlZmluZSBWNEwyX0NUUkxfRkxBR19VUERBVEUgCQkweDAwMDgKKyNkZWZpbmUgVjRMMl9DVFJMX0ZMQUdfSU5BQ1RJVkUgCTB4MDAxMAorI2RlZmluZSBWNEwyX0NUUkxfRkxBR19TTElERVIgCQkweDAwMjAKKyNkZWZpbmUgVjRMMl9DVFJMX0ZMQUdfV1JJVEVfT05MWSAJMHgwMDQwCisKKy8qICBRdWVyeSBmbGFnLCB0byBiZSBPUmVkIHdpdGggdGhlIGNvbnRyb2wgSUQgKi8KKyNkZWZpbmUgVjRMMl9DVFJMX0ZMQUdfTkVYVF9DVFJMCTB4ODAwMDAwMDAKKworLyogIFVzZXItY2xhc3MgY29udHJvbCBJRHMgZGVmaW5lZCBieSBWNEwyICovCisjZGVmaW5lIFY0TDJfQ0lEX0JBU0UJCQkoVjRMMl9DVFJMX0NMQVNTX1VTRVIgfCAweDkwMCkKKyNkZWZpbmUgVjRMMl9DSURfVVNFUl9CQVNFIAkJVjRMMl9DSURfQkFTRQorLyogIElEcyByZXNlcnZlZCBmb3IgZHJpdmVyIHNwZWNpZmljIGNvbnRyb2xzICovCisjZGVmaW5lIFY0TDJfQ0lEX1BSSVZBVEVfQkFTRQkJMHgwODAwMDAwMAorCisjZGVmaW5lIFY0TDJfQ0lEX1VTRVJfQ0xBU1MgCQkoVjRMMl9DVFJMX0NMQVNTX1VTRVIgfCAxKQorI2RlZmluZSBWNEwyX0NJRF9CUklHSFRORVNTCQkoVjRMMl9DSURfQkFTRSswKQorI2RlZmluZSBWNEwyX0NJRF9DT05UUkFTVAkJKFY0TDJfQ0lEX0JBU0UrMSkKKyNkZWZpbmUgVjRMMl9DSURfU0FUVVJBVElPTgkJKFY0TDJfQ0lEX0JBU0UrMikKKyNkZWZpbmUgVjRMMl9DSURfSFVFCQkJKFY0TDJfQ0lEX0JBU0UrMykKKyNkZWZpbmUgVjRMMl9DSURfQVVESU9fVk9MVU1FCQkoVjRMMl9DSURfQkFTRSs1KQorI2RlZmluZSBWNEwyX0NJRF9BVURJT19CQUxBTkNFCQkoVjRMMl9DSURfQkFTRSs2KQorI2RlZmluZSBWNEwyX0NJRF9BVURJT19CQVNTCQkoVjRMMl9DSURfQkFTRSs3KQorI2RlZmluZSBWNEwyX0NJRF9BVURJT19UUkVCTEUJCShWNEwyX0NJRF9CQVNFKzgpCisjZGVmaW5lIFY0TDJfQ0lEX0FVRElPX01VVEUJCShWNEwyX0NJRF9CQVNFKzkpCisjZGVmaW5lIFY0TDJfQ0lEX0FVRElPX0xPVURORVNTCQkoVjRMMl9DSURfQkFTRSsxMCkKKyNkZWZpbmUgVjRMMl9DSURfQkxBQ0tfTEVWRUwJCShWNEwyX0NJRF9CQVNFKzExKSAvKiBEZXByZWNhdGVkICovCisjZGVmaW5lIFY0TDJfQ0lEX0FVVE9fV0hJVEVfQkFMQU5DRQkoVjRMMl9DSURfQkFTRSsxMikKKyNkZWZpbmUgVjRMMl9DSURfRE9fV0hJVEVfQkFMQU5DRQkoVjRMMl9DSURfQkFTRSsxMykKKyNkZWZpbmUgVjRMMl9DSURfUkVEX0JBTEFOQ0UJCShWNEwyX0NJRF9CQVNFKzE0KQorI2RlZmluZSBWNEwyX0NJRF9CTFVFX0JBTEFOQ0UJCShWNEwyX0NJRF9CQVNFKzE1KQorI2RlZmluZSBWNEwyX0NJRF9HQU1NQQkJCShWNEwyX0NJRF9CQVNFKzE2KQorI2RlZmluZSBWNEwyX0NJRF9XSElURU5FU1MJCShWNEwyX0NJRF9HQU1NQSkgLyogRGVwcmVjYXRlZCAqLworI2RlZmluZSBWNEwyX0NJRF9FWFBPU1VSRQkJKFY0TDJfQ0lEX0JBU0UrMTcpCisjZGVmaW5lIFY0TDJfQ0lEX0FVVE9HQUlOCQkoVjRMMl9DSURfQkFTRSsxOCkKKyNkZWZpbmUgVjRMMl9DSURfR0FJTgkJCShWNEwyX0NJRF9CQVNFKzE5KQorI2RlZmluZSBWNEwyX0NJRF9IRkxJUAkJCShWNEwyX0NJRF9CQVNFKzIwKQorI2RlZmluZSBWNEwyX0NJRF9WRkxJUAkJCShWNEwyX0NJRF9CQVNFKzIxKQorCisvKiBEZXByZWNhdGVkOyB1c2UgVjRMMl9DSURfUEFOX1JFU0VUIGFuZCBWNEwyX0NJRF9USUxUX1JFU0VUICovCisjZGVmaW5lIFY0TDJfQ0lEX0hDRU5URVIJCShWNEwyX0NJRF9CQVNFKzIyKQorI2RlZmluZSBWNEwyX0NJRF9WQ0VOVEVSCQkoVjRMMl9DSURfQkFTRSsyMykKKworI2RlZmluZSBWNEwyX0NJRF9QT1dFUl9MSU5FX0ZSRVFVRU5DWQkoVjRMMl9DSURfQkFTRSsyNCkKK2VudW0gdjRsMl9wb3dlcl9saW5lX2ZyZXF1ZW5jeSB7CisJVjRMMl9DSURfUE9XRVJfTElORV9GUkVRVUVOQ1lfRElTQUJMRUQJPSAwLAorCVY0TDJfQ0lEX1BPV0VSX0xJTkVfRlJFUVVFTkNZXzUwSFoJPSAxLAorCVY0TDJfQ0lEX1BPV0VSX0xJTkVfRlJFUVVFTkNZXzYwSFoJPSAyLAorfTsKKyNkZWZpbmUgVjRMMl9DSURfSFVFX0FVVE8JCQkoVjRMMl9DSURfQkFTRSsyNSkKKyNkZWZpbmUgVjRMMl9DSURfV0hJVEVfQkFMQU5DRV9URU1QRVJBVFVSRQkoVjRMMl9DSURfQkFTRSsyNikKKyNkZWZpbmUgVjRMMl9DSURfU0hBUlBORVNTCQkJKFY0TDJfQ0lEX0JBU0UrMjcpCisjZGVmaW5lIFY0TDJfQ0lEX0JBQ0tMSUdIVF9DT01QRU5TQVRJT04gCShWNEwyX0NJRF9CQVNFKzI4KQorI2RlZmluZSBWNEwyX0NJRF9DSFJPTUFfQUdDICAgICAgICAgICAgICAgICAgICAgKFY0TDJfQ0lEX0JBU0UrMjkpCisjZGVmaW5lIFY0TDJfQ0lEX0NPTE9SX0tJTExFUiAgICAgICAgICAgICAgICAgICAoVjRMMl9DSURfQkFTRSszMCkKKyNkZWZpbmUgVjRMMl9DSURfQ09MT1JGWAkJCShWNEwyX0NJRF9CQVNFKzMxKQorZW51bSB2NGwyX2NvbG9yZnggeworCVY0TDJfQ09MT1JGWF9OT05FCT0gMCwKKwlWNEwyX0NPTE9SRlhfQlcJCT0gMSwKKwlWNEwyX0NPTE9SRlhfU0VQSUEJPSAyLAorCVY0TDJfQ09MT1JGWF9ORUdBVElWRSA9IDMsCisJVjRMMl9DT0xPUkZYX0VNQk9TUyA9IDQsCisJVjRMMl9DT0xPUkZYX1NLRVRDSCA9IDUsCisJVjRMMl9DT0xPUkZYX1NLWV9CTFVFID0gNiwKKwlWNEwyX0NPTE9SRlhfR1JBU1NfR1JFRU4gPSA3LAorCVY0TDJfQ09MT1JGWF9TS0lOX1dISVRFTiA9IDgsCisJVjRMMl9DT0xPUkZYX1ZJVklEID0gOSwKK307CisjZGVmaW5lIFY0TDJfQ0lEX0FVVE9CUklHSFRORVNTCQkJKFY0TDJfQ0lEX0JBU0UrMzIpCisjZGVmaW5lIFY0TDJfQ0lEX0JBTkRfU1RPUF9GSUxURVIJCShWNEwyX0NJRF9CQVNFKzMzKQorCisjZGVmaW5lIFY0TDJfQ0lEX1JPVEFURQkJCQkoVjRMMl9DSURfQkFTRSszNCkKKyNkZWZpbmUgVjRMMl9DSURfQkdfQ09MT1IJCQkoVjRMMl9DSURfQkFTRSszNSkKKworI2RlZmluZSBWNEwyX0NJRF9DSFJPTUFfR0FJTiAgICAgICAgICAgICAgICAgICAgKFY0TDJfQ0lEX0JBU0UrMzYpCisKKyNkZWZpbmUgVjRMMl9DSURfSUxMVU1JTkFUT1JTXzEJCQkoVjRMMl9DSURfQkFTRSszNykKKyNkZWZpbmUgVjRMMl9DSURfSUxMVU1JTkFUT1JTXzIJCQkoVjRMMl9DSURfQkFTRSszOCkKKworLyoKKyAqIFRoaXMgaXMgY3VzdG9tIENJRAorICovCisvKiBmb3IgcmdiIGFscGhhIGZ1bmN0aW9uICovCisjZGVmaW5lIFY0TDJfQ0lEX0dMT0JBTF9BTFBIQQkJCShWNEwyX0NJRF9CQVNFKzM5KQorCisvKiBjYWNoZWFibGUgY29uZmlndXJhdGlvbiAqLworI2RlZmluZSBWNEwyX0NJRF9DQUNIRUFCTEUJCQkoVjRMMl9DSURfQkFTRSs0MCkKKworLyoganBlZyBjYXB0dXJlZCBzaXplICovCisjZGVmaW5lIFY0TDJfQ0lEX0NBTV9KUEVHX01FTVNJWkUJCShWNEwyX0NJRF9CQVNFKzQxKQorI2RlZmluZSBWNEwyX0NJRF9DQU1fSlBFR19FTkNPREVEU0laRQkJKFY0TDJfQ0lEX0JBU0UrNDIpCisKKyNkZWZpbmUgVjRMMl9DSURfU0VUX1NIQVJFQUJMRQkJCShWNEwyX0NJRF9CQVNFKzQzKQorCisvKiBUViBjb25maWd1cmF0aW9uICovCisjZGVmaW5lIFY0TDJfQ0lEX1RWX0xBWUVSX0JMRU5EX0VOQUJMRQkJKFY0TDJfQ0lEX0JBU0UrNDQpCisjZGVmaW5lIFY0TDJfQ0lEX1RWX0xBWUVSX0JMRU5EX0FMUEhBCQkoVjRMMl9DSURfQkFTRSs0NSkKKyNkZWZpbmUgVjRMMl9DSURfVFZfUElYRUxfQkxFTkRfRU5BQkxFCQkoVjRMMl9DSURfQkFTRSs0NikKKyNkZWZpbmUgVjRMMl9DSURfVFZfQ0hST01BX0VOQUJMRQkJKFY0TDJfQ0lEX0JBU0UrNDcpCisjZGVmaW5lIFY0TDJfQ0lEX1RWX0NIUk9NQV9WQUxVRQkJKFY0TDJfQ0lEX0JBU0UrNDgpCisjZGVmaW5lIFY0TDJfQ0lEX1RWX0hQRF9TVEFUVVMJCQkoVjRMMl9DSURfQkFTRSs0OSkKKworLyogbGFzdCBDSUQgKyAxICovCisjZGVmaW5lIFY0TDJfQ0lEX0xBU1RQMQkJCQkoVjRMMl9DSURfQkFTRSs1MCkKKworLyogIE1QRUctY2xhc3MgY29udHJvbCBJRHMgZGVmaW5lZCBieSBWNEwyICovCisjZGVmaW5lIFY0TDJfQ0lEX01QRUdfQkFTRSAJCQkoVjRMMl9DVFJMX0NMQVNTX01QRUcgfCAweDkwMCkKKyNkZWZpbmUgVjRMMl9DSURfTVBFR19DTEFTUyAJCQkoVjRMMl9DVFJMX0NMQVNTX01QRUcgfCAxKQorCisvKiAgTVBFRyBzdHJlYW1zICovCisjZGVmaW5lIFY0TDJfQ0lEX01QRUdfU1RSRUFNX1RZUEUgCQkoVjRMMl9DSURfTVBFR19CQVNFKzApCitlbnVtIHY0bDJfbXBlZ19zdHJlYW1fdHlwZSB7CisJVjRMMl9NUEVHX1NUUkVBTV9UWVBFX01QRUcyX1BTICAgPSAwLCAvKiBNUEVHLTIgcHJvZ3JhbSBzdHJlYW0gKi8KKwlWNEwyX01QRUdfU1RSRUFNX1RZUEVfTVBFRzJfVFMgICA9IDEsIC8qIE1QRUctMiB0cmFuc3BvcnQgc3RyZWFtICovCisJVjRMMl9NUEVHX1NUUkVBTV9UWVBFX01QRUcxX1NTICAgPSAyLCAvKiBNUEVHLTEgc3lzdGVtIHN0cmVhbSAqLworCVY0TDJfTVBFR19TVFJFQU1fVFlQRV9NUEVHMl9EVkQgID0gMywgLyogTVBFRy0yIERWRC1jb21wYXRpYmxlIHN0cmVhbSAqLworCVY0TDJfTVBFR19TVFJFQU1fVFlQRV9NUEVHMV9WQ0QgID0gNCwgLyogTVBFRy0xIFZDRC1jb21wYXRpYmxlIHN0cmVhbSAqLworCVY0TDJfTVBFR19TVFJFQU1fVFlQRV9NUEVHMl9TVkNEID0gNSwgLyogTVBFRy0yIFNWQ0QtY29tcGF0aWJsZSBzdHJlYW0gKi8KK307CisjZGVmaW5lIFY0TDJfQ0lEX01QRUdfU1RSRUFNX1BJRF9QTVQgCQkoVjRMMl9DSURfTVBFR19CQVNFKzEpCisjZGVmaW5lIFY0TDJfQ0lEX01QRUdfU1RSRUFNX1BJRF9BVURJTyAJCShWNEwyX0NJRF9NUEVHX0JBU0UrMikKKyNkZWZpbmUgVjRMMl9DSURfTVBFR19TVFJFQU1fUElEX1ZJREVPIAkJKFY0TDJfQ0lEX01QRUdfQkFTRSszKQorI2RlZmluZSBWNEwyX0NJRF9NUEVHX1NUUkVBTV9QSURfUENSIAkJKFY0TDJfQ0lEX01QRUdfQkFTRSs0KQorI2RlZmluZSBWNEwyX0NJRF9NUEVHX1NUUkVBTV9QRVNfSURfQVVESU8gCShWNEwyX0NJRF9NUEVHX0JBU0UrNSkKKyNkZWZpbmUgVjRMMl9DSURfTVBFR19TVFJFQU1fUEVTX0lEX1ZJREVPIAkoVjRMMl9DSURfTVBFR19CQVNFKzYpCisjZGVmaW5lIFY0TDJfQ0lEX01QRUdfU1RSRUFNX1ZCSV9GTVQgCQkoVjRMMl9DSURfTVBFR19CQVNFKzcpCitlbnVtIHY0bDJfbXBlZ19zdHJlYW1fdmJpX2ZtdCB7CisJVjRMMl9NUEVHX1NUUkVBTV9WQklfRk1UX05PTkUgPSAwLCAgLyogTm8gVkJJIGluIHRoZSBNUEVHIHN0cmVhbSAqLworCVY0TDJfTVBFR19TVFJFQU1fVkJJX0ZNVF9JVlRWID0gMSwgIC8qIFZCSSBpbiBwcml2YXRlIHBhY2tldHMsIElWVFYgZm9ybWF0ICovCit9OworCisvKiAgTVBFRyBhdWRpbyAqLworI2RlZmluZSBWNEwyX0NJRF9NUEVHX0FVRElPX1NBTVBMSU5HX0ZSRVEgCShWNEwyX0NJRF9NUEVHX0JBU0UrMTAwKQorZW51bSB2NGwyX21wZWdfYXVkaW9fc2FtcGxpbmdfZnJlcSB7CisJVjRMMl9NUEVHX0FVRElPX1NBTVBMSU5HX0ZSRVFfNDQxMDAgPSAwLAorCVY0TDJfTVBFR19BVURJT19TQU1QTElOR19GUkVRXzQ4MDAwID0gMSwKKwlWNEwyX01QRUdfQVVESU9fU0FNUExJTkdfRlJFUV8zMjAwMCA9IDIsCit9OworI2RlZmluZSBWNEwyX0NJRF9NUEVHX0FVRElPX0VOQ09ESU5HIAkJKFY0TDJfQ0lEX01QRUdfQkFTRSsxMDEpCitlbnVtIHY0bDJfbXBlZ19hdWRpb19lbmNvZGluZyB7CisJVjRMMl9NUEVHX0FVRElPX0VOQ09ESU5HX0xBWUVSXzEgPSAwLAorCVY0TDJfTVBFR19BVURJT19FTkNPRElOR19MQVlFUl8yID0gMSwKKwlWNEwyX01QRUdfQVVESU9fRU5DT0RJTkdfTEFZRVJfMyA9IDIsCisJVjRMMl9NUEVHX0FVRElPX0VOQ09ESU5HX0FBQyAgICAgPSAzLAorCVY0TDJfTVBFR19BVURJT19FTkNPRElOR19BQzMgICAgID0gNCwKK307CisjZGVmaW5lIFY0TDJfQ0lEX01QRUdfQVVESU9fTDFfQklUUkFURSAJCShWNEwyX0NJRF9NUEVHX0JBU0UrMTAyKQorZW51bSB2NGwyX21wZWdfYXVkaW9fbDFfYml0cmF0ZSB7CisJVjRMMl9NUEVHX0FVRElPX0wxX0JJVFJBVEVfMzJLICA9IDAsCisJVjRMMl9NUEVHX0FVRElPX0wxX0JJVFJBVEVfNjRLICA9IDEsCisJVjRMMl9NUEVHX0FVRElPX0wxX0JJVFJBVEVfOTZLICA9IDIsCisJVjRMMl9NUEVHX0FVRElPX0wxX0JJVFJBVEVfMTI4SyA9IDMsCisJVjRMMl9NUEVHX0FVRElPX0wxX0JJVFJBVEVfMTYwSyA9IDQsCisJVjRMMl9NUEVHX0FVRElPX0wxX0JJVFJBVEVfMTkySyA9IDUsCisJVjRMMl9NUEVHX0FVRElPX0wxX0JJVFJBVEVfMjI0SyA9IDYsCisJVjRMMl9NUEVHX0FVRElPX0wxX0JJVFJBVEVfMjU2SyA9IDcsCisJVjRMMl9NUEVHX0FVRElPX0wxX0JJVFJBVEVfMjg4SyA9IDgsCisJVjRMMl9NUEVHX0FVRElPX0wxX0JJVFJBVEVfMzIwSyA9IDksCisJVjRMMl9NUEVHX0FVRElPX0wxX0JJVFJBVEVfMzUySyA9IDEwLAorCVY0TDJfTVBFR19BVURJT19MMV9CSVRSQVRFXzM4NEsgPSAxMSwKKwlWNEwyX01QRUdfQVVESU9fTDFfQklUUkFURV80MTZLID0gMTIsCisJVjRMMl9NUEVHX0FVRElPX0wxX0JJVFJBVEVfNDQ4SyA9IDEzLAorfTsKKyNkZWZpbmUgVjRMMl9DSURfTVBFR19BVURJT19MMl9CSVRSQVRFIAkJKFY0TDJfQ0lEX01QRUdfQkFTRSsxMDMpCitlbnVtIHY0bDJfbXBlZ19hdWRpb19sMl9iaXRyYXRlIHsKKwlWNEwyX01QRUdfQVVESU9fTDJfQklUUkFURV8zMksgID0gMCwKKwlWNEwyX01QRUdfQVVESU9fTDJfQklUUkFURV80OEsgID0gMSwKKwlWNEwyX01QRUdfQVVESU9fTDJfQklUUkFURV81NksgID0gMiwKKwlWNEwyX01QRUdfQVVESU9fTDJfQklUUkFURV82NEsgID0gMywKKwlWNEwyX01QRUdfQVVESU9fTDJfQklUUkFURV84MEsgID0gNCwKKwlWNEwyX01QRUdfQVVESU9fTDJfQklUUkFURV85NksgID0gNSwKKwlWNEwyX01QRUdfQVVESU9fTDJfQklUUkFURV8xMTJLID0gNiwKKwlWNEwyX01QRUdfQVVESU9fTDJfQklUUkFURV8xMjhLID0gNywKKwlWNEwyX01QRUdfQVVESU9fTDJfQklUUkFURV8xNjBLID0gOCwKKwlWNEwyX01QRUdfQVVESU9fTDJfQklUUkFURV8xOTJLID0gOSwKKwlWNEwyX01QRUdfQVVESU9fTDJfQklUUkFURV8yMjRLID0gMTAsCisJVjRMMl9NUEVHX0FVRElPX0wyX0JJVFJBVEVfMjU2SyA9IDExLAorCVY0TDJfTVBFR19BVURJT19MMl9CSVRSQVRFXzMyMEsgPSAxMiwKKwlWNEwyX01QRUdfQVVESU9fTDJfQklUUkFURV8zODRLID0gMTMsCit9OworI2RlZmluZSBWNEwyX0NJRF9NUEVHX0FVRElPX0wzX0JJVFJBVEUgCQkoVjRMMl9DSURfTVBFR19CQVNFKzEwNCkKK2VudW0gdjRsMl9tcGVnX2F1ZGlvX2wzX2JpdHJhdGUgeworCVY0TDJfTVBFR19BVURJT19MM19CSVRSQVRFXzMySyAgPSAwLAorCVY0TDJfTVBFR19BVURJT19MM19CSVRSQVRFXzQwSyAgPSAxLAorCVY0TDJfTVBFR19BVURJT19MM19CSVRSQVRFXzQ4SyAgPSAyLAorCVY0TDJfTVBFR19BVURJT19MM19CSVRSQVRFXzU2SyAgPSAzLAorCVY0TDJfTVBFR19BVURJT19MM19CSVRSQVRFXzY0SyAgPSA0LAorCVY0TDJfTVBFR19BVURJT19MM19CSVRSQVRFXzgwSyAgPSA1LAorCVY0TDJfTVBFR19BVURJT19MM19CSVRSQVRFXzk2SyAgPSA2LAorCVY0TDJfTVBFR19BVURJT19MM19CSVRSQVRFXzExMksgPSA3LAorCVY0TDJfTVBFR19BVURJT19MM19CSVRSQVRFXzEyOEsgPSA4LAorCVY0TDJfTVBFR19BVURJT19MM19CSVRSQVRFXzE2MEsgPSA5LAorCVY0TDJfTVBFR19BVURJT19MM19CSVRSQVRFXzE5MksgPSAxMCwKKwlWNEwyX01QRUdfQVVESU9fTDNfQklUUkFURV8yMjRLID0gMTEsCisJVjRMMl9NUEVHX0FVRElPX0wzX0JJVFJBVEVfMjU2SyA9IDEyLAorCVY0TDJfTVBFR19BVURJT19MM19CSVRSQVRFXzMyMEsgPSAxMywKK307CisjZGVmaW5lIFY0TDJfQ0lEX01QRUdfQVVESU9fTU9ERSAJCShWNEwyX0NJRF9NUEVHX0JBU0UrMTA1KQorZW51bSB2NGwyX21wZWdfYXVkaW9fbW9kZSB7CisJVjRMMl9NUEVHX0FVRElPX01PREVfU1RFUkVPICAgICAgID0gMCwKKwlWNEwyX01QRUdfQVVESU9fTU9ERV9KT0lOVF9TVEVSRU8gPSAxLAorCVY0TDJfTVBFR19BVURJT19NT0RFX0RVQUwgICAgICAgICA9IDIsCisJVjRMMl9NUEVHX0FVRElPX01PREVfTU9OTyAgICAgICAgID0gMywKK307CisjZGVmaW5lIFY0TDJfQ0lEX01QRUdfQVVESU9fTU9ERV9FWFRFTlNJT04gCShWNEwyX0NJRF9NUEVHX0JBU0UrMTA2KQorZW51bSB2NGwyX21wZWdfYXVkaW9fbW9kZV9leHRlbnNpb24geworCVY0TDJfTVBFR19BVURJT19NT0RFX0VYVEVOU0lPTl9CT1VORF80ICA9IDAsCisJVjRMMl9NUEVHX0FVRElPX01PREVfRVhURU5TSU9OX0JPVU5EXzggID0gMSwKKwlWNEwyX01QRUdfQVVESU9fTU9ERV9FWFRFTlNJT05fQk9VTkRfMTIgPSAyLAorCVY0TDJfTVBFR19BVURJT19NT0RFX0VYVEVOU0lPTl9CT1VORF8xNiA9IDMsCit9OworI2RlZmluZSBWNEwyX0NJRF9NUEVHX0FVRElPX0VNUEhBU0lTIAkJKFY0TDJfQ0lEX01QRUdfQkFTRSsxMDcpCitlbnVtIHY0bDJfbXBlZ19hdWRpb19lbXBoYXNpcyB7CisJVjRMMl9NUEVHX0FVRElPX0VNUEhBU0lTX05PTkUgICAgICAgICA9IDAsCisJVjRMMl9NUEVHX0FVRElPX0VNUEhBU0lTXzUwX0RJVl8xNV91UyA9IDEsCisJVjRMMl9NUEVHX0FVRElPX0VNUEhBU0lTX0NDSVRUX0oxNyAgICA9IDIsCit9OworI2RlZmluZSBWNEwyX0NJRF9NUEVHX0FVRElPX0NSQyAJCShWNEwyX0NJRF9NUEVHX0JBU0UrMTA4KQorZW51bSB2NGwyX21wZWdfYXVkaW9fY3JjIHsKKwlWNEwyX01QRUdfQVVESU9fQ1JDX05PTkUgID0gMCwKKwlWNEwyX01QRUdfQVVESU9fQ1JDX0NSQzE2ID0gMSwKK307CisjZGVmaW5lIFY0TDJfQ0lEX01QRUdfQVVESU9fTVVURSAJCShWNEwyX0NJRF9NUEVHX0JBU0UrMTA5KQorI2RlZmluZSBWNEwyX0NJRF9NUEVHX0FVRElPX0FBQ19CSVRSQVRFCQkoVjRMMl9DSURfTVBFR19CQVNFKzExMCkKKyNkZWZpbmUgVjRMMl9DSURfTVBFR19BVURJT19BQzNfQklUUkFURQkJKFY0TDJfQ0lEX01QRUdfQkFTRSsxMTEpCitlbnVtIHY0bDJfbXBlZ19hdWRpb19hYzNfYml0cmF0ZSB7CisJVjRMMl9NUEVHX0FVRElPX0FDM19CSVRSQVRFXzMySyAgPSAwLAorCVY0TDJfTVBFR19BVURJT19BQzNfQklUUkFURV80MEsgID0gMSwKKwlWNEwyX01QRUdfQVVESU9fQUMzX0JJVFJBVEVfNDhLICA9IDIsCisJVjRMMl9NUEVHX0FVRElPX0FDM19CSVRSQVRFXzU2SyAgPSAzLAorCVY0TDJfTVBFR19BVURJT19BQzNfQklUUkFURV82NEsgID0gNCwKKwlWNEwyX01QRUdfQVVESU9fQUMzX0JJVFJBVEVfODBLICA9IDUsCisJVjRMMl9NUEVHX0FVRElPX0FDM19CSVRSQVRFXzk2SyAgPSA2LAorCVY0TDJfTVBFR19BVURJT19BQzNfQklUUkFURV8xMTJLID0gNywKKwlWNEwyX01QRUdfQVVESU9fQUMzX0JJVFJBVEVfMTI4SyA9IDgsCisJVjRMMl9NUEVHX0FVRElPX0FDM19CSVRSQVRFXzE2MEsgPSA5LAorCVY0TDJfTVBFR19BVURJT19BQzNfQklUUkFURV8xOTJLID0gMTAsCisJVjRMMl9NUEVHX0FVRElPX0FDM19CSVRSQVRFXzIyNEsgPSAxMSwKKwlWNEwyX01QRUdfQVVESU9fQUMzX0JJVFJBVEVfMjU2SyA9IDEyLAorCVY0TDJfTVBFR19BVURJT19BQzNfQklUUkFURV8zMjBLID0gMTMsCisJVjRMMl9NUEVHX0FVRElPX0FDM19CSVRSQVRFXzM4NEsgPSAxNCwKKwlWNEwyX01QRUdfQVVESU9fQUMzX0JJVFJBVEVfNDQ4SyA9IDE1LAorCVY0TDJfTVBFR19BVURJT19BQzNfQklUUkFURV81MTJLID0gMTYsCisJVjRMMl9NUEVHX0FVRElPX0FDM19CSVRSQVRFXzU3NksgPSAxNywKKwlWNEwyX01QRUdfQVVESU9fQUMzX0JJVFJBVEVfNjQwSyA9IDE4LAorfTsKKworLyogIE1QRUcgdmlkZW8gKi8KKyNkZWZpbmUgVjRMMl9DSURfTVBFR19WSURFT19FTkNPRElORyAJCShWNEwyX0NJRF9NUEVHX0JBU0UrMjAwKQorZW51bSB2NGwyX21wZWdfdmlkZW9fZW5jb2RpbmcgeworCVY0TDJfTVBFR19WSURFT19FTkNPRElOR19NUEVHXzEgICAgID0gMCwKKwlWNEwyX01QRUdfVklERU9fRU5DT0RJTkdfTVBFR18yICAgICA9IDEsCisJVjRMMl9NUEVHX1ZJREVPX0VOQ09ESU5HX01QRUdfNF9BVkMgPSAyLAorfTsKKyNkZWZpbmUgVjRMMl9DSURfTVBFR19WSURFT19BU1BFQ1QgCQkoVjRMMl9DSURfTVBFR19CQVNFKzIwMSkKK2VudW0gdjRsMl9tcGVnX3ZpZGVvX2FzcGVjdCB7CisJVjRMMl9NUEVHX1ZJREVPX0FTUEVDVF8xeDEgICAgID0gMCwKKwlWNEwyX01QRUdfVklERU9fQVNQRUNUXzR4MyAgICAgPSAxLAorCVY0TDJfTVBFR19WSURFT19BU1BFQ1RfMTZ4OSAgICA9IDIsCisJVjRMMl9NUEVHX1ZJREVPX0FTUEVDVF8yMjF4MTAwID0gMywKK307CisjZGVmaW5lIFY0TDJfQ0lEX01QRUdfVklERU9fQl9GUkFNRVMgCQkoVjRMMl9DSURfTVBFR19CQVNFKzIwMikKKyNkZWZpbmUgVjRMMl9DSURfTVBFR19WSURFT19HT1BfU0laRSAJCShWNEwyX0NJRF9NUEVHX0JBU0UrMjAzKQorI2RlZmluZSBWNEwyX0NJRF9NUEVHX1ZJREVPX0dPUF9DTE9TVVJFIAkoVjRMMl9DSURfTVBFR19CQVNFKzIwNCkKKyNkZWZpbmUgVjRMMl9DSURfTVBFR19WSURFT19QVUxMRE9XTiAJCShWNEwyX0NJRF9NUEVHX0JBU0UrMjA1KQorI2RlZmluZSBWNEwyX0NJRF9NUEVHX1ZJREVPX0JJVFJBVEVfTU9ERSAJKFY0TDJfQ0lEX01QRUdfQkFTRSsyMDYpCitlbnVtIHY0bDJfbXBlZ192aWRlb19iaXRyYXRlX21vZGUgeworCVY0TDJfTVBFR19WSURFT19CSVRSQVRFX01PREVfVkJSID0gMCwKKwlWNEwyX01QRUdfVklERU9fQklUUkFURV9NT0RFX0NCUiA9IDEsCit9OworI2RlZmluZSBWNEwyX0NJRF9NUEVHX1ZJREVPX0JJVFJBVEUgCQkoVjRMMl9DSURfTVBFR19CQVNFKzIwNykKKyNkZWZpbmUgVjRMMl9DSURfTVBFR19WSURFT19CSVRSQVRFX1BFQUsgCShWNEwyX0NJRF9NUEVHX0JBU0UrMjA4KQorI2RlZmluZSBWNEwyX0NJRF9NUEVHX1ZJREVPX1RFTVBPUkFMX0RFQ0lNQVRJT04gKFY0TDJfQ0lEX01QRUdfQkFTRSsyMDkpCisjZGVmaW5lIFY0TDJfQ0lEX01QRUdfVklERU9fTVVURSAJCShWNEwyX0NJRF9NUEVHX0JBU0UrMjEwKQorI2RlZmluZSBWNEwyX0NJRF9NUEVHX1ZJREVPX01VVEVfWVVWIAkJKFY0TDJfQ0lEX01QRUdfQkFTRSsyMTEpCisKKy8qICBNUEVHLWNsYXNzIGNvbnRyb2wgSURzIHNwZWNpZmljIHRvIHRoZSBDWDIzNDF4IGRyaXZlciBhcyBkZWZpbmVkIGJ5IFY0TDIgKi8KKyNkZWZpbmUgVjRMMl9DSURfTVBFR19DWDIzNDFYX0JBU0UgCQkJCShWNEwyX0NUUkxfQ0xBU1NfTVBFRyB8IDB4MTAwMCkKKyNkZWZpbmUgVjRMMl9DSURfTVBFR19DWDIzNDFYX1ZJREVPX1NQQVRJQUxfRklMVEVSX01PREUgCShWNEwyX0NJRF9NUEVHX0NYMjM0MVhfQkFTRSswKQorZW51bSB2NGwyX21wZWdfY3gyMzQxeF92aWRlb19zcGF0aWFsX2ZpbHRlcl9tb2RlIHsKKwlWNEwyX01QRUdfQ1gyMzQxWF9WSURFT19TUEFUSUFMX0ZJTFRFUl9NT0RFX01BTlVBTCA9IDAsCisJVjRMMl9NUEVHX0NYMjM0MVhfVklERU9fU1BBVElBTF9GSUxURVJfTU9ERV9BVVRPICAgPSAxLAorfTsKKyNkZWZpbmUgVjRMMl9DSURfTVBFR19DWDIzNDFYX1ZJREVPX1NQQVRJQUxfRklMVEVSIAkJKFY0TDJfQ0lEX01QRUdfQ1gyMzQxWF9CQVNFKzEpCisjZGVmaW5lIFY0TDJfQ0lEX01QRUdfQ1gyMzQxWF9WSURFT19MVU1BX1NQQVRJQUxfRklMVEVSX1RZUEUgCShWNEwyX0NJRF9NUEVHX0NYMjM0MVhfQkFTRSsyKQorZW51bSB2NGwyX21wZWdfY3gyMzQxeF92aWRlb19sdW1hX3NwYXRpYWxfZmlsdGVyX3R5cGUgeworCVY0TDJfTVBFR19DWDIzNDFYX1ZJREVPX0xVTUFfU1BBVElBTF9GSUxURVJfVFlQRV9PRkYgICAgICAgICAgICAgICAgICA9IDAsCisJVjRMMl9NUEVHX0NYMjM0MVhfVklERU9fTFVNQV9TUEFUSUFMX0ZJTFRFUl9UWVBFXzFEX0hPUiAgICAgICAgICAgICAgID0gMSwKKwlWNEwyX01QRUdfQ1gyMzQxWF9WSURFT19MVU1BX1NQQVRJQUxfRklMVEVSX1RZUEVfMURfVkVSVCAgICAgICAgICAgICAgPSAyLAorCVY0TDJfTVBFR19DWDIzNDFYX1ZJREVPX0xVTUFfU1BBVElBTF9GSUxURVJfVFlQRV8yRF9IVl9TRVBBUkFCTEUgICAgICA9IDMsCisJVjRMMl9NUEVHX0NYMjM0MVhfVklERU9fTFVNQV9TUEFUSUFMX0ZJTFRFUl9UWVBFXzJEX1NZTV9OT05fU0VQQVJBQkxFID0gNCwKK307CisjZGVmaW5lIFY0TDJfQ0lEX01QRUdfQ1gyMzQxWF9WSURFT19DSFJPTUFfU1BBVElBTF9GSUxURVJfVFlQRSAJKFY0TDJfQ0lEX01QRUdfQ1gyMzQxWF9CQVNFKzMpCitlbnVtIHY0bDJfbXBlZ19jeDIzNDF4X3ZpZGVvX2Nocm9tYV9zcGF0aWFsX2ZpbHRlcl90eXBlIHsKKwlWNEwyX01QRUdfQ1gyMzQxWF9WSURFT19DSFJPTUFfU1BBVElBTF9GSUxURVJfVFlQRV9PRkYgICAgPSAwLAorCVY0TDJfTVBFR19DWDIzNDFYX1ZJREVPX0NIUk9NQV9TUEFUSUFMX0ZJTFRFUl9UWVBFXzFEX0hPUiA9IDEsCit9OworI2RlZmluZSBWNEwyX0NJRF9NUEVHX0NYMjM0MVhfVklERU9fVEVNUE9SQUxfRklMVEVSX01PREUgCShWNEwyX0NJRF9NUEVHX0NYMjM0MVhfQkFTRSs0KQorZW51bSB2NGwyX21wZWdfY3gyMzQxeF92aWRlb190ZW1wb3JhbF9maWx0ZXJfbW9kZSB7CisJVjRMMl9NUEVHX0NYMjM0MVhfVklERU9fVEVNUE9SQUxfRklMVEVSX01PREVfTUFOVUFMID0gMCwKKwlWNEwyX01QRUdfQ1gyMzQxWF9WSURFT19URU1QT1JBTF9GSUxURVJfTU9ERV9BVVRPICAgPSAxLAorfTsKKyNkZWZpbmUgVjRMMl9DSURfTVBFR19DWDIzNDFYX1ZJREVPX1RFTVBPUkFMX0ZJTFRFUiAJCShWNEwyX0NJRF9NUEVHX0NYMjM0MVhfQkFTRSs1KQorI2RlZmluZSBWNEwyX0NJRF9NUEVHX0NYMjM0MVhfVklERU9fTUVESUFOX0ZJTFRFUl9UWVBFIAkJKFY0TDJfQ0lEX01QRUdfQ1gyMzQxWF9CQVNFKzYpCitlbnVtIHY0bDJfbXBlZ19jeDIzNDF4X3ZpZGVvX21lZGlhbl9maWx0ZXJfdHlwZSB7CisJVjRMMl9NUEVHX0NYMjM0MVhfVklERU9fTUVESUFOX0ZJTFRFUl9UWVBFX09GRiAgICAgID0gMCwKKwlWNEwyX01QRUdfQ1gyMzQxWF9WSURFT19NRURJQU5fRklMVEVSX1RZUEVfSE9SICAgICAgPSAxLAorCVY0TDJfTVBFR19DWDIzNDFYX1ZJREVPX01FRElBTl9GSUxURVJfVFlQRV9WRVJUICAgICA9IDIsCisJVjRMMl9NUEVHX0NYMjM0MVhfVklERU9fTUVESUFOX0ZJTFRFUl9UWVBFX0hPUl9WRVJUID0gMywKKwlWNEwyX01QRUdfQ1gyMzQxWF9WSURFT19NRURJQU5fRklMVEVSX1RZUEVfRElBRyAgICAgPSA0LAorfTsKKyNkZWZpbmUgVjRMMl9DSURfTVBFR19DWDIzNDFYX1ZJREVPX0xVTUFfTUVESUFOX0ZJTFRFUl9CT1RUT00gCShWNEwyX0NJRF9NUEVHX0NYMjM0MVhfQkFTRSs3KQorI2RlZmluZSBWNEwyX0NJRF9NUEVHX0NYMjM0MVhfVklERU9fTFVNQV9NRURJQU5fRklMVEVSX1RPUCAJKFY0TDJfQ0lEX01QRUdfQ1gyMzQxWF9CQVNFKzgpCisjZGVmaW5lIFY0TDJfQ0lEX01QRUdfQ1gyMzQxWF9WSURFT19DSFJPTUFfTUVESUFOX0ZJTFRFUl9CT1RUT00JKFY0TDJfQ0lEX01QRUdfQ1gyMzQxWF9CQVNFKzkpCisjZGVmaW5lIFY0TDJfQ0lEX01QRUdfQ1gyMzQxWF9WSURFT19DSFJPTUFfTUVESUFOX0ZJTFRFUl9UT1AgCShWNEwyX0NJRF9NUEVHX0NYMjM0MVhfQkFTRSsxMCkKKyNkZWZpbmUgVjRMMl9DSURfTVBFR19DWDIzNDFYX1NUUkVBTV9JTlNFUlRfTkFWX1BBQ0tFVFMgCShWNEwyX0NJRF9NUEVHX0NYMjM0MVhfQkFTRSsxMSkKKworLyogRm9yIGNvZGVjcyAqLworCisjZGVmaW5lIFY0TDJfQ0lEX0NPREVDX0JBU0UgCQkJKFY0TDJfQ1RSTF9DTEFTU19DT0RFQyB8IDB4OTAwKQorI2RlZmluZSBWNEwyX0NJRF9DT0RFQ19DTEFTUyAJCQkoVjRMMl9DVFJMX0NMQVNTX0NPREVDIHwgMSkKKworLyogQ29kZWMgY2xhc3MgY29udHJvbCBJRHMgc3BlY2lmaWMgdG8gdGhlIE1GQzVYIGRyaXZlciAqLworI2RlZmluZSBWNEwyX0NJRF9DT0RFQ19NRkM1WF9CQVNFCQkoVjRMMl9DVFJMX0NMQVNTX0NPREVDIHwgMHgxMDAwKQorCisvKiBGb3IgYm90aCBkZWNvZGluZyBhbmQgZW5jb2RpbmcgKi8KKworLyogRm9yIGRlY29kaW5nICovCisKKyNkZWZpbmUgVjRMMl9DSURfQ09ERUNfTE9PUF9GSUxURVJfTVBFRzRfRU5BQkxFCShWNEwyX0NJRF9DT0RFQ19CQVNFICsgMTEwKQorI2RlZmluZSBWNEwyX0NJRF9DT0RFQ19ESVNQTEFZX0RFTEFZCQkoVjRMMl9DSURfQ09ERUNfQkFTRSArIDEzNykKKyNkZWZpbmUgVjRMMl9DSURfQ09ERUNfUkVRX05VTV9CVUZTCQkoVjRMMl9DSURfQ09ERUNfQkFTRSArIDE0MCkKKyNkZWZpbmUgVjRMMl9DSURfQ09ERUNfU0xJQ0VfSU5URVJGQUNFCQkoVjRMMl9DSURfQ09ERUNfQkFTRSArIDE0MSkKKyNkZWZpbmUgVjRMMl9DSURfQ09ERUNfUEFDS0VEX1BCCQkoVjRMMl9DSURfQ09ERUNfQkFTRSArIDE0MikKKyNkZWZpbmUgVjRMMl9DSURfQ09ERUNfRlJBTUVfVEFHCQkoVjRMMl9DSURfQ09ERUNfQkFTRSArIDE0MykKKyNkZWZpbmUgVjRMMl9DSURfQ09ERUNfQ1JDX0VOQUJMRQkJKFY0TDJfQ0lEX0NPREVDX0JBU0UgKyAxNDQpCisjZGVmaW5lIFY0TDJfQ0lEX0NPREVDX0NSQ19EQVRBX0xVTUEJCShWNEwyX0NJRF9DT0RFQ19CQVNFICsgMTQ1KQorI2RlZmluZSBWNEwyX0NJRF9DT0RFQ19DUkNfREFUQV9DSFJPTUEJCShWNEwyX0NJRF9DT0RFQ19CQVNFICsgMTQ2KQorI2RlZmluZSBWNEwyX0NJRF9DT0RFQ19DUkNfREFUQV9MVU1BX0JPVAkoVjRMMl9DSURfQ09ERUNfQkFTRSArIDE0NykKKyNkZWZpbmUgVjRMMl9DSURfQ09ERUNfQ1JDX0RBVEFfQ0hST01BX0JPVAkoVjRMMl9DSURfQ09ERUNfQkFTRSArIDE0OCkKKyNkZWZpbmUgVjRMMl9DSURfQ09ERUNfQ1JDX0dFTkVSQVRFRAkJKFY0TDJfQ0lEX0NPREVDX0JBU0UgKyAxNDkpCisjZGVmaW5lIFY0TDJfQ0lEX0NPREVDX0ZSQU1FX1RZUEUJCShWNEwyX0NJRF9DT0RFQ19CQVNFICsgMTU0KQorI2RlZmluZSBWNEwyX0NJRF9DT0RFQ19DSEVDS19TVEFURQkJKFY0TDJfQ0lEX0NPREVDX0JBU0UgKyAxNTUpCisjZGVmaW5lIFY0TDJfQ0lEX0NPREVDX0RJU1BMQVlfU1RBVFVTCQkoVjRMMl9DSURfQ09ERUNfQkFTRSArIDE1NikKKyNkZWZpbmUgVjRMMl9DSURfQ09ERUNfRlJBTUVfUEFDS19TRUlfUEFSU0UJKFY0TDJfQ0lEX0NPREVDX0JBU0UgKyAxNTcpCisjZGVmaW5lIFY0TDJfQ0lEX0NPREVDX0ZSQU1FX1BBQ0tfU0VJX0FWQUlMCShWNEwyX0NJRF9DT0RFQ19CQVNFICsgMTU4KQorI2RlZmluZSBWNEwyX0NJRF9DT0RFQ19GUkFNRV9QQUNLX0FSUkdNRU5UX0lECShWNEwyX0NJRF9DT0RFQ19CQVNFICsgMTU5KQorI2RlZmluZSBWNEwyX0NJRF9DT0RFQ19GUkFNRV9QQUNLX1NFSV9JTkZPCShWNEwyX0NJRF9DT0RFQ19CQVNFICsgMTYwKQorI2RlZmluZSBWNEwyX0NJRF9DT0RFQ19GUkFNRV9QQUNLX0dSSURfUE9TCShWNEwyX0NJRF9DT0RFQ19CQVNFICsgMTYxKQorCisvKiBGb3IgZW5jb2RpbmcgKi8KKyNkZWZpbmUgVjRMMl9DSURfQ09ERUNfTE9PUF9GSUxURVJfSDI2NAkJKFY0TDJfQ0lEX0NPREVDX0JBU0UgKyA5KQorZW51bSB2NGwyX2NpZF9jb2RlY19sb29wX2ZpbHRlcl9oMjY0IHsKKwlWNEwyX0NJRF9DT0RFQ19MT09QX0ZJTFRFUl9IMjY0X0VOQUJMRSA9IDAsCisJVjRMMl9DSURfQ09ERUNfTE9PUF9GSUxURVJfSDI2NF9ESVNBQkxFID0gMSwKKwlWNEwyX0NJRF9DT0RFQ19MT09QX0ZJTFRFUl9IMjY0X0RJU0FCTEVfQVRfQk9VTkRBUlkgPSAyLAorfTsKKworI2RlZmluZSBWNEwyX0NJRF9DT0RFQ19GUkFNRV9JTlNFUlRJT04JCShWNEwyX0NJRF9DT0RFQ19CQVNFICsgMTApCitlbnVtIHY0bDJfY2lkX2NvZGVjX2ZyYW1lX2luc2VydGlvbiB7CisJVjRMMl9DSURfQ09ERUNfRlJBTUVfSU5TRVJUX05PTkUgPSAweDAsCisJVjRMMl9DSURfQ09ERUNfRlJBTUVfSU5TRVJUX0lfRlJBTUUgPSAweDEsCisJVjRMMl9DSURfQ09ERUNfRlJBTUVfSU5TRVJUX05PVF9DT0RFRCA9IDB4MiwKK307CisKKyNkZWZpbmUgVjRMMl9DSURfQ09ERUNfRU5DT0RFRF9MVU1BX0FERFIJKFY0TDJfQ0lEX0NPREVDX0JBU0UgKyAxMSkKKyNkZWZpbmUgVjRMMl9DSURfQ09ERUNfRU5DT0RFRF9DSFJPTUFfQUREUgkoVjRMMl9DSURfQ09ERUNfQkFTRSArIDEyKQorCisjZGVmaW5lIFY0TDJfQ0lEX0NPREVDX0VOQ09ERURfSV9QRVJJT0RfQ0gJVjRMMl9DSURfQ09ERUNfTUZDNVhfRU5DX0dPUF9TSVpFCisjZGVmaW5lIFY0TDJfQ0lEX0NPREVDX0VOQ09ERURfRlJBTUVfUkFURV9DSCAJVjRMMl9DSURfQ09ERUNfTUZDNVhfRU5DX0gyNjRfUkNfRlJBTUVfUkFURQorI2RlZmluZSBWNEwyX0NJRF9DT0RFQ19FTkNPREVEX0JJVF9SQVRFX0NIIAlWNEwyX0NJRF9DT0RFQ19NRkM1WF9FTkNfUkNfQklUX1JBVEUKKworI2RlZmluZSBWNEwyX0NJRF9DT0RFQ19GUkFNRV9QQUNLX1NFSV9HRU4JKFY0TDJfQ0lEX0NPREVDX0JBU0UgKyAxMykKKyNkZWZpbmUgVjRMMl9DSURfQ09ERUNfRlJBTUVfUEFDS19GUk0wX0ZMQUcJKFY0TDJfQ0lEX0NPREVDX0JBU0UgKyAxNCkKK2VudW0gdjRsMl9jb2RlY19tZmM1eF9lbmNfZmxhZyB7CisJVjRMMl9DT0RFQ19NRkM1WF9FTkNfRkxBR19ESVNBQkxFID0gMCwKKwlWNEwyX0NPREVDX01GQzVYX0VOQ19GTEFHX0VOQUJMRSA9IDEsCit9OworI2RlZmluZSBWNEwyX0NJRF9DT0RFQ19GUkFNRV9QQUNLX0FSUkdNRU5UX1RZUEUJKFY0TDJfQ0lEX0NPREVDX0JBU0UgKyAxNSkKK2VudW0gdjRsMl9jb2RlY19tZmM1eF9lbmNfZnJhbWVfcGFja19hcnJnbWVudF90eXBlIHsKKwlWNEwyX0NPREVDX01GQzVYX0VOQ19GUkFNRV9QQUNLX1NJREVfQllfU0lERSA9IDAsCisJVjRMMl9DT0RFQ19NRkM1WF9FTkNfRlJBTUVfUEFDS19UT1BfQU5EX0JPVCA9IDEsCisJVjRMMl9DT0RFQ19NRkM1WF9FTkNfRlJBTUVfUEFDS19UTVBfSU5URVIgPSAyLAorfTsKKworLyogY29tbW9uICovCitlbnVtIHY0bDJfY29kZWNfbWZjNXhfZW5jX3N3aXRjaCB7CisJVjRMMl9DT0RFQ19NRkM1WF9FTkNfU1dfRElTQUJMRQk9IDAsCisJVjRMMl9DT0RFQ19NRkM1WF9FTkNfU1dfRU5BQkxFCT0gMSwKK307CitlbnVtIHY0bDJfY29kZWNfbWZjNXhfZW5jX3N3aXRjaF9pbnYgeworCVY0TDJfQ09ERUNfTUZDNVhfRU5DX1NXX0lOVl9FTkFCTEUJPSAwLAorCVY0TDJfQ09ERUNfTUZDNVhfRU5DX1NXX0lOVl9ESVNBQkxFCT0gMSwKK307CisjZGVmaW5lIFY0TDJfQ0lEX0NPREVDX01GQzVYX0VOQ19HT1BfU0laRQkJKFY0TDJfQ0lEX0NPREVDX01GQzVYX0JBU0UrMzAwKQorI2RlZmluZSBWNEwyX0NJRF9DT0RFQ19NRkM1WF9FTkNfTVVMVElfU0xJQ0VfTU9ERQkoVjRMMl9DSURfQ09ERUNfTUZDNVhfQkFTRSszMDEpCitlbnVtIHY0bDJfY29kZWNfbWZjNXhfZW5jX211bHRpX3NsaWNlX21vZGUgeworCVY0TDJfQ09ERUNfTUZDNVhfRU5DX01VTFRJX1NMSUNFX01PREVfRElTQUJMRQkJPSAwLAorCVY0TDJfQ09ERUNfTUZDNVhfRU5DX01VTFRJX1NMSUNFX01PREVfTUFDUk9CTE9DS19DT1VOVAk9IDEsCisJVjRMMl9DT0RFQ19NRkM1WF9FTkNfTVVMVElfU0xJQ0VfTU9ERV9CSVRfQ09VTlQJCT0gMywKK307CisjZGVmaW5lIFY0TDJfQ0lEX0NPREVDX01GQzVYX0VOQ19NVUxUSV9TTElDRV9NQgkJKFY0TDJfQ0lEX0NPREVDX01GQzVYX0JBU0UrMzAyKQorI2RlZmluZSBWNEwyX0NJRF9DT0RFQ19NRkM1WF9FTkNfTVVMVElfU0xJQ0VfQklUCShWNEwyX0NJRF9DT0RFQ19NRkM1WF9CQVNFKzMwMykKKyNkZWZpbmUgVjRMMl9DSURfQ09ERUNfTUZDNVhfRU5DX0lOVFJBX1JFRlJFU0hfTUIJKFY0TDJfQ0lEX0NPREVDX01GQzVYX0JBU0UrMzA0KQorI2RlZmluZSBWNEwyX0NJRF9DT0RFQ19NRkM1WF9FTkNfUEFEX0NUUkxfRU5BQkxFCShWNEwyX0NJRF9DT0RFQ19NRkM1WF9CQVNFKzMwNSkKKyNkZWZpbmUgVjRMMl9DSURfQ09ERUNfTUZDNVhfRU5DX1BBRF9MVU1BX1ZBTFVFCQkoVjRMMl9DSURfQ09ERUNfTUZDNVhfQkFTRSszMDYpCisjZGVmaW5lIFY0TDJfQ0lEX0NPREVDX01GQzVYX0VOQ19QQURfQ0JfVkFMVUUJCShWNEwyX0NJRF9DT0RFQ19NRkM1WF9CQVNFKzMwNykKKyNkZWZpbmUgVjRMMl9DSURfQ09ERUNfTUZDNVhfRU5DX1BBRF9DUl9WQUxVRQkJKFY0TDJfQ0lEX0NPREVDX01GQzVYX0JBU0UrMzA4KQorI2RlZmluZSBWNEwyX0NJRF9DT0RFQ19NRkM1WF9FTkNfUkNfRlJBTUVfRU5BQkxFCShWNEwyX0NJRF9DT0RFQ19NRkM1WF9CQVNFKzMwOSkKKyNkZWZpbmUgVjRMMl9DSURfQ09ERUNfTUZDNVhfRU5DX1JDX0JJVF9SQVRFCQkoVjRMMl9DSURfQ09ERUNfTUZDNVhfQkFTRSszMTApCisjZGVmaW5lIFY0TDJfQ0lEX0NPREVDX01GQzVYX0VOQ19SQ19SRUFDVElPTl9DT0VGRgkoVjRMMl9DSURfQ09ERUNfTUZDNVhfQkFTRSszMTEpCisjZGVmaW5lIFY0TDJfQ0lEX0NPREVDX01GQzVYX0VOQ19TVFJFQU1fU0laRQkJKFY0TDJfQ0lEX0NPREVDX01GQzVYX0JBU0UrMzEyKQorI2RlZmluZSBWNEwyX0NJRF9DT0RFQ19NRkM1WF9FTkNfRlJBTUVfQ09VTlQJCShWNEwyX0NJRF9DT0RFQ19NRkM1WF9CQVNFKzMxMykKKyNkZWZpbmUgVjRMMl9DSURfQ09ERUNfTUZDNVhfRU5DX0ZSQU1FX1RZUEUJCShWNEwyX0NJRF9DT0RFQ19NRkM1WF9CQVNFKzMxNCkKK2VudW0gdjRsMl9jb2RlY19tZmM1eF9lbmNfZnJhbWVfdHlwZSB7CisJVjRMMl9DT0RFQ19NRkM1WF9FTkNfRlJBTUVfVFlQRV9OT1RfQ09ERUQJPSAwLAorCVY0TDJfQ09ERUNfTUZDNVhfRU5DX0ZSQU1FX1RZUEVfSV9GUkFNRQkJPSAxLAorCVY0TDJfQ09ERUNfTUZDNVhfRU5DX0ZSQU1FX1RZUEVfUF9GUkFNRQkJPSAyLAorCVY0TDJfQ09ERUNfTUZDNVhfRU5DX0ZSQU1FX1RZUEVfQl9GUkFNRQkJPSAzLAorCVY0TDJfQ09ERUNfTUZDNVhfRU5DX0ZSQU1FX1RZUEVfU0tJUFBFRAkJPSA0LAorCVY0TDJfQ09ERUNfTUZDNVhfRU5DX0ZSQU1FX1RZUEVfT1RIRVJTCQk9IDUsCit9OworI2RlZmluZSBWNEwyX0NJRF9DT0RFQ19NRkM1WF9FTkNfRk9SQ0VfRlJBTUVfVFlQRQkoVjRMMl9DSURfQ09ERUNfTUZDNVhfQkFTRSszMTUpCitlbnVtIHY0bDJfY29kZWNfbWZjNXhfZW5jX2ZvcmNlX2ZyYW1lX3R5cGUgeworCVY0TDJfQ09ERUNfTUZDNVhfRU5DX0ZPUkNFX0ZSQU1FX1RZUEVfSV9GUkFNRQk9IDEsCisJVjRMMl9DT0RFQ19NRkM1WF9FTkNfRk9SQ0VfRlJBTUVfVFlQRV9OT1RfQ09ERUQJPSAyLAorfTsKKyNkZWZpbmUgVjRMMl9DSURfQ09ERUNfTUZDNVhfRU5DX1ZCVl9CVUZfU0laRQkJKFY0TDJfQ0lEX0NPREVDX01GQzVYX0JBU0UrMzE2KQorI2RlZmluZSBWNEwyX0NJRF9DT0RFQ19NRkM1WF9FTkNfU0VRX0hEUl9NT0RFCQkoVjRMMl9DSURfQ09ERUNfTUZDNVhfQkFTRSszMTcpCitlbnVtIHY0bDJfY29kZWNfbWZjNXhfZW5jX3NlcV9oZHJfbW9kZSB7CisJVjRMMl9DT0RFQ19NRkM1WF9FTkNfU0VRX0hEUl9NT0RFX1NFUQkJPSAwLAorCVY0TDJfQ09ERUNfTUZDNVhfRU5DX1NFUV9IRFJfTU9ERV9TRVFfRlJBTUUJPSAxLAorfTsKKyNkZWZpbmUgVjRMMl9DSURfQ09ERUNfTUZDNVhfRU5DX0ZSQU1FX1NLSVBfTU9ERQkoVjRMMl9DSURfQ09ERUNfTUZDNVhfQkFTRSszMTgpCitlbnVtIHY0bDJfY29kZWNfbWZjNXhfZW5jX2ZyYW1lX3NraXBfbW9kZSB7CisJVjRMMl9DT0RFQ19NRkM1WF9FTkNfRlJBTUVfU0tJUF9NT0RFX0RJU0FCTEUJCT0gMCwKKwlWNEwyX0NPREVDX01GQzVYX0VOQ19GUkFNRV9TS0lQX01PREVfTEVWRUwJCT0gMSwKKwlWNEwyX0NPREVDX01GQzVYX0VOQ19GUkFNRV9TS0lQX01PREVfVkJWX0JVRl9TSVpFCT0gMiwKK307CisjZGVmaW5lIFY0TDJfQ0lEX0NPREVDX01GQzVYX0VOQ19SQ19GSVhFRF9UQVJHRVRfQklUCShWNEwyX0NJRF9DT0RFQ19NRkM1WF9CQVNFKzMxOSkKKyNkZWZpbmUgVjRMMl9DSURfQ09ERUNfTUZDNVhfRU5DX0ZSQU1FX0RFTFRBCQkoVjRMMl9DSURfQ09ERUNfTUZDNVhfQkFTRSszMjApCisKKy8qIGNvZGVjIHNwZWNpZmljICovCisjZGVmaW5lIFY0TDJfQ0lEX0NPREVDX01GQzVYX0VOQ19IMjY0X0JfRlJBTUVTCQkoVjRMMl9DSURfQ09ERUNfTUZDNVhfQkFTRSs0MDApCisjZGVmaW5lIFY0TDJfQ0lEX0NPREVDX01GQzVYX0VOQ19IMjY0X1BST0ZJTEUJCShWNEwyX0NJRF9DT0RFQ19NRkM1WF9CQVNFKzQwMSkKK2VudW0gdjRsMl9jb2RlY19tZmM1eF9lbmNfaDI2NF9wcm9maWxlIHsKKwlWNEwyX0NPREVDX01GQzVYX0VOQ19IMjY0X1BST0ZJTEVfTUFJTgkJPSAwLAorCVY0TDJfQ09ERUNfTUZDNVhfRU5DX0gyNjRfUFJPRklMRV9ISUdICQk9IDEsCisJVjRMMl9DT0RFQ19NRkM1WF9FTkNfSDI2NF9QUk9GSUxFX0JBU0VMSU5FCT0gMiwKK307CisjZGVmaW5lIFY0TDJfQ0lEX0NPREVDX01GQzVYX0VOQ19IMjY0X0xFVkVMCQkoVjRMMl9DSURfQ09ERUNfTUZDNVhfQkFTRSs0MDIpCisjZGVmaW5lIFY0TDJfQ0lEX0NPREVDX01GQzVYX0VOQ19IMjY0X0lOVEVSTEFDRQkJKFY0TDJfQ0lEX0NPREVDX01GQzVYX0JBU0UrNDAzKQorI2RlZmluZSBWNEwyX0NJRF9DT0RFQ19NRkM1WF9FTkNfSDI2NF9MT09QX0ZJTFRFUl9NT0RFCShWNEwyX0NJRF9DT0RFQ19NRkM1WF9CQVNFKzQwNCkKK2VudW0gdjRsMl9jb2RlY19tZmM1eF9lbmNfaDI2NF9sb29wX2ZpbHRlciB7CisJVjRMMl9DT0RFQ19NRkM1WF9FTkNfSDI2NF9MT09QX0ZJTFRFUl9FTkFCTEUJCQk9IDAsCisJVjRMMl9DT0RFQ19NRkM1WF9FTkNfSDI2NF9MT09QX0ZJTFRFUl9ESVNBQkxFCQkJPSAxLAorCVY0TDJfQ09ERUNfTUZDNVhfRU5DX0gyNjRfTE9PUF9GSUxURVJfRElTQUJMRV9BVF9CT1VOREFSWQk9IDIsCit9OworI2RlZmluZSBWNEwyX0NJRF9DT0RFQ19NRkM1WF9FTkNfSDI2NF9MT09QX0ZJTFRFUl9BTFBIQQkoVjRMMl9DSURfQ09ERUNfTUZDNVhfQkFTRSs0MDUpCisjZGVmaW5lIFY0TDJfQ0lEX0NPREVDX01GQzVYX0VOQ19IMjY0X0xPT1BfRklMVEVSX0JFVEEJKFY0TDJfQ0lEX0NPREVDX01GQzVYX0JBU0UrNDA2KQorI2RlZmluZSBWNEwyX0NJRF9DT0RFQ19NRkM1WF9FTkNfSDI2NF9FTlRST1BZX01PREUJKFY0TDJfQ0lEX0NPREVDX01GQzVYX0JBU0UrNDA3KQorZW51bSB2NGwyX2NvZGVjX21mYzV4X2VuY19oMjY0X2VudHJvcHlfbW9kZSB7CisJVjRMMl9DT0RFQ19NRkM1WF9FTkNfSDI2NF9FTlRST1BZX01PREVfQ0FWTEMJPSAwLAorCVY0TDJfQ09ERUNfTUZDNVhfRU5DX0gyNjRfRU5UUk9QWV9NT0RFX0NBQkFDCT0gMSwKK307CisjZGVmaW5lIFY0TDJfQ0lEX0NPREVDX01GQzVYX0VOQ19IMjY0X01BWF9SRUZfUElDCShWNEwyX0NJRF9DT0RFQ19NRkM1WF9CQVNFKzQwOCkKKyNkZWZpbmUgVjRMMl9DSURfQ09ERUNfTUZDNVhfRU5DX0gyNjRfTlVNX1JFRl9QSUNfNFAJKFY0TDJfQ0lEX0NPREVDX01GQzVYX0JBU0UrNDA5KQorI2RlZmluZSBWNEwyX0NJRF9DT0RFQ19NRkM1WF9FTkNfSDI2NF84WDhfVFJBTlNGT1JNCShWNEwyX0NJRF9DT0RFQ19NRkM1WF9CQVNFKzQxMCkKKyNkZWZpbmUgVjRMMl9DSURfQ09ERUNfTUZDNVhfRU5DX0gyNjRfUkNfTUJfRU5BQkxFCShWNEwyX0NJRF9DT0RFQ19NRkM1WF9CQVNFKzQxMSkKKyNkZWZpbmUgVjRMMl9DSURfQ09ERUNfTUZDNVhfRU5DX0gyNjRfUkNfRlJBTUVfUkFURQkoVjRMMl9DSURfQ09ERUNfTUZDNVhfQkFTRSs0MTIpCisjZGVmaW5lIFY0TDJfQ0lEX0NPREVDX01GQzVYX0VOQ19IMjY0X1JDX0ZSQU1FX1FQCShWNEwyX0NJRF9DT0RFQ19NRkM1WF9CQVNFKzQxMykKKyNkZWZpbmUgVjRMMl9DSURfQ09ERUNfTUZDNVhfRU5DX0gyNjRfUkNfTUlOX1FQCQkoVjRMMl9DSURfQ09ERUNfTUZDNVhfQkFTRSs0MTQpCisjZGVmaW5lIFY0TDJfQ0lEX0NPREVDX01GQzVYX0VOQ19IMjY0X1JDX01BWF9RUAkJKFY0TDJfQ0lEX0NPREVDX01GQzVYX0JBU0UrNDE1KQorI2RlZmluZSBWNEwyX0NJRF9DT0RFQ19NRkM1WF9FTkNfSDI2NF9SQ19NQl9EQVJLCShWNEwyX0NJRF9DT0RFQ19NRkM1WF9CQVNFKzQxNikKKyNkZWZpbmUgVjRMMl9DSURfQ09ERUNfTUZDNVhfRU5DX0gyNjRfUkNfTUJfU01PT1RICShWNEwyX0NJRF9DT0RFQ19NRkM1WF9CQVNFKzQxNykKKyNkZWZpbmUgVjRMMl9DSURfQ09ERUNfTUZDNVhfRU5DX0gyNjRfUkNfTUJfU1RBVElDCShWNEwyX0NJRF9DT0RFQ19NRkM1WF9CQVNFKzQxOCkKKyNkZWZpbmUgVjRMMl9DSURfQ09ERUNfTUZDNVhfRU5DX0gyNjRfUkNfTUJfQUNUSVZJVFkJKFY0TDJfQ0lEX0NPREVDX01GQzVYX0JBU0UrNDE5KQorI2RlZmluZSBWNEwyX0NJRF9DT0RFQ19NRkM1WF9FTkNfSDI2NF9SQ19QX0ZSQU1FX1FQCShWNEwyX0NJRF9DT0RFQ19NRkM1WF9CQVNFKzQyMCkKKyNkZWZpbmUgVjRMMl9DSURfQ09ERUNfTUZDNVhfRU5DX0gyNjRfUkNfQl9GUkFNRV9RUAkoVjRMMl9DSURfQ09ERUNfTUZDNVhfQkFTRSs0MjEpCisjZGVmaW5lIFY0TDJfQ0lEX0NPREVDX01GQzVYX0VOQ19IMjY0X0FSX1ZVSV9FTkFCTEUJKFY0TDJfQ0lEX0NPREVDX01GQzVYX0JBU0UrNDIyKQorI2RlZmluZSBWNEwyX0NJRF9DT0RFQ19NRkM1WF9FTkNfSDI2NF9BUl9WVUlfSURDCShWNEwyX0NJRF9DT0RFQ19NRkM1WF9CQVNFKzQyMykKKyNkZWZpbmUgVjRMMl9DSURfQ09ERUNfTUZDNVhfRU5DX0gyNjRfRVhUX1NBUl9XSURUSAkoVjRMMl9DSURfQ09ERUNfTUZDNVhfQkFTRSs0MjQpCisjZGVmaW5lIFY0TDJfQ0lEX0NPREVDX01GQzVYX0VOQ19IMjY0X0VYVF9TQVJfSEVJR0hUCShWNEwyX0NJRF9DT0RFQ19NRkM1WF9CQVNFKzQyNSkKKyNkZWZpbmUgVjRMMl9DSURfQ09ERUNfTUZDNVhfRU5DX0gyNjRfT1BFTl9HT1AJCShWNEwyX0NJRF9DT0RFQ19NRkM1WF9CQVNFKzQyNikKKyNkZWZpbmUgVjRMMl9DSURfQ09ERUNfTUZDNVhfRU5DX0gyNjRfSV9QRVJJT0QJCShWNEwyX0NJRF9DT0RFQ19NRkM1WF9CQVNFKzQyNykKKyNkZWZpbmUgVjRMMl9DSURfQ09ERUNfTUZDNVhfRU5DX0gyNjRfSElFUl9QX0VOQUJMRQkoVjRMMl9DSURfQ09ERUNfTUZDNVhfQkFTRSs0MjgpCisjZGVmaW5lIFY0TDJfQ0lEX0NPREVDX01GQzVYX0VOQ19IMjY0X0xBWUVSMF9RUAkJKFY0TDJfQ0lEX0NPREVDX01GQzVYX0JBU0UrNDI5KQorI2RlZmluZSBWNEwyX0NJRF9DT0RFQ19NRkM1WF9FTkNfSDI2NF9MQVlFUjFfUVAJCShWNEwyX0NJRF9DT0RFQ19NRkM1WF9CQVNFKzQzMCkKKyNkZWZpbmUgVjRMMl9DSURfQ09ERUNfTUZDNVhfRU5DX0gyNjRfTEFZRVIyX1FQCQkoVjRMMl9DSURfQ09ERUNfTUZDNVhfQkFTRSs0MzEpCisKKyNkZWZpbmUgVjRMMl9DSURfQ09ERUNfTUZDNVhfRU5DX01QRUc0X0JfRlJBTUVTCQkoVjRMMl9DSURfQ09ERUNfTUZDNVhfQkFTRSs0NDApCisjZGVmaW5lIFY0TDJfQ0lEX0NPREVDX01GQzVYX0VOQ19NUEVHNF9QUk9GSUxFCQkoVjRMMl9DSURfQ09ERUNfTUZDNVhfQkFTRSs0NDEpCitlbnVtIHY0bDJfY29kZWNfbWZjNXhfZW5jX21wZWc0X3Byb2ZpbGUgeworCVY0TDJfQ09ERUNfTUZDNVhfRU5DX01QRUc0X1BST0ZJTEVfU0lNUExFCQk9IDAsCisJVjRMMl9DT0RFQ19NRkM1WF9FTkNfTVBFRzRfUFJPRklMRV9BRFZBTkNFRF9TSU1QTEUJPSAxLAorfTsKKyNkZWZpbmUgVjRMMl9DSURfQ09ERUNfTUZDNVhfRU5DX01QRUc0X0xFVkVMCQkoVjRMMl9DSURfQ09ERUNfTUZDNVhfQkFTRSs0NDIpCisjZGVmaW5lIFY0TDJfQ0lEX0NPREVDX01GQzVYX0VOQ19NUEVHNF9SQ19GUkFNRV9RUAkoVjRMMl9DSURfQ09ERUNfTUZDNVhfQkFTRSs0NDMpCisjZGVmaW5lIFY0TDJfQ0lEX0NPREVDX01GQzVYX0VOQ19NUEVHNF9SQ19NSU5fUVAJKFY0TDJfQ0lEX0NPREVDX01GQzVYX0JBU0UrNDQ0KQorI2RlZmluZSBWNEwyX0NJRF9DT0RFQ19NRkM1WF9FTkNfTVBFRzRfUkNfTUFYX1FQCShWNEwyX0NJRF9DT0RFQ19NRkM1WF9CQVNFKzQ0NSkKKyNkZWZpbmUgVjRMMl9DSURfQ09ERUNfTUZDNVhfRU5DX01QRUc0X1FVQVJURVJfUElYRUwJKFY0TDJfQ0lEX0NPREVDX01GQzVYX0JBU0UrNDQ2KQorI2RlZmluZSBWNEwyX0NJRF9DT0RFQ19NRkM1WF9FTkNfTVBFRzRfUkNfUF9GUkFNRV9RUAkoVjRMMl9DSURfQ09ERUNfTUZDNVhfQkFTRSs0NDcpCisjZGVmaW5lIFY0TDJfQ0lEX0NPREVDX01GQzVYX0VOQ19NUEVHNF9SQ19CX0ZSQU1FX1FQCShWNEwyX0NJRF9DT0RFQ19NRkM1WF9CQVNFKzQ0OCkKKyNkZWZpbmUgVjRMMl9DSURfQ09ERUNfTUZDNVhfRU5DX01QRUc0X1ZPUF9USU1FX1JFUwkoVjRMMl9DSURfQ09ERUNfTUZDNVhfQkFTRSs0NDkpCisjZGVmaW5lIFY0TDJfQ0lEX0NPREVDX01GQzVYX0VOQ19NUEVHNF9WT1BfRlJNX0RFTFRBCShWNEwyX0NJRF9DT0RFQ19NRkM1WF9CQVNFKzQ1MCkKKyNkZWZpbmUgVjRMMl9DSURfQ09ERUNfTUZDNVhfRU5DX01QRUc0X1JDX01CX0VOQUJMRQkoVjRMMl9DSURfQ09ERUNfTUZDNVhfQkFTRSs0NTEpCisKKyNkZWZpbmUgVjRMMl9DSURfQ09ERUNfTUZDNVhfRU5DX0gyNjNfUkNfRlJBTUVfUkFURQkoVjRMMl9DSURfQ09ERUNfTUZDNVhfQkFTRSs0NjApCisjZGVmaW5lIFY0TDJfQ0lEX0NPREVDX01GQzVYX0VOQ19IMjYzX1JDX0ZSQU1FX1FQCShWNEwyX0NJRF9DT0RFQ19NRkM1WF9CQVNFKzQ2MSkKKyNkZWZpbmUgVjRMMl9DSURfQ09ERUNfTUZDNVhfRU5DX0gyNjNfUkNfTUlOX1FQCQkoVjRMMl9DSURfQ09ERUNfTUZDNVhfQkFTRSs0NjIpCisjZGVmaW5lIFY0TDJfQ0lEX0NPREVDX01GQzVYX0VOQ19IMjYzX1JDX01BWF9RUAkJKFY0TDJfQ0lEX0NPREVDX01GQzVYX0JBU0UrNDYzKQorI2RlZmluZSBWNEwyX0NJRF9DT0RFQ19NRkM1WF9FTkNfSDI2M19SQ19QX0ZSQU1FX1FQCShWNEwyX0NJRF9DT0RFQ19NRkM1WF9CQVNFKzQ2NCkKKyNkZWZpbmUgVjRMMl9DSURfQ09ERUNfTUZDNVhfRU5DX0gyNjNfUkNfTUJfRU5BQkxFCShWNEwyX0NJRF9DT0RFQ19NRkM1WF9CQVNFKzQ2NSkKKworLyogIENhbWVyYSBjbGFzcyBjb250cm9sIElEcyAqLworI2RlZmluZSBWNEwyX0NJRF9DQU1FUkFfQ0xBU1NfQkFTRSAJKFY0TDJfQ1RSTF9DTEFTU19DQU1FUkEgfCAweDkwMCkKKyNkZWZpbmUgVjRMMl9DSURfQ0FNRVJBX0NMQVNTIAkJKFY0TDJfQ1RSTF9DTEFTU19DQU1FUkEgfCAxKQorCisjZGVmaW5lIFY0TDJfQ0lEX0VYUE9TVVJFX0FVVE8JCQkoVjRMMl9DSURfQ0FNRVJBX0NMQVNTX0JBU0UrMSkKK2VudW0gIHY0bDJfZXhwb3N1cmVfYXV0b190eXBlIHsKKwlWNEwyX0VYUE9TVVJFX0FVVE8gPSAwLAorCVY0TDJfRVhQT1NVUkVfTUFOVUFMID0gMSwKKwlWNEwyX0VYUE9TVVJFX1NIVVRURVJfUFJJT1JJVFkgPSAyLAorCVY0TDJfRVhQT1NVUkVfQVBFUlRVUkVfUFJJT1JJVFkgPSAzCit9OworI2RlZmluZSBWNEwyX0NJRF9FWFBPU1VSRV9BQlNPTFVURQkJKFY0TDJfQ0lEX0NBTUVSQV9DTEFTU19CQVNFKzIpCisjZGVmaW5lIFY0TDJfQ0lEX0VYUE9TVVJFX0FVVE9fUFJJT1JJVFkJCShWNEwyX0NJRF9DQU1FUkFfQ0xBU1NfQkFTRSszKQorCisjZGVmaW5lIFY0TDJfQ0lEX1BBTl9SRUxBVElWRQkJCShWNEwyX0NJRF9DQU1FUkFfQ0xBU1NfQkFTRSs0KQorI2RlZmluZSBWNEwyX0NJRF9USUxUX1JFTEFUSVZFCQkJKFY0TDJfQ0lEX0NBTUVSQV9DTEFTU19CQVNFKzUpCisjZGVmaW5lIFY0TDJfQ0lEX1BBTl9SRVNFVAkJCShWNEwyX0NJRF9DQU1FUkFfQ0xBU1NfQkFTRSs2KQorI2RlZmluZSBWNEwyX0NJRF9USUxUX1JFU0VUCQkJKFY0TDJfQ0lEX0NBTUVSQV9DTEFTU19CQVNFKzcpCisKKyNkZWZpbmUgVjRMMl9DSURfUEFOX0FCU09MVVRFCQkJKFY0TDJfQ0lEX0NBTUVSQV9DTEFTU19CQVNFKzgpCisjZGVmaW5lIFY0TDJfQ0lEX1RJTFRfQUJTT0xVVEUJCQkoVjRMMl9DSURfQ0FNRVJBX0NMQVNTX0JBU0UrOSkKKworI2RlZmluZSBWNEwyX0NJRF9GT0NVU19BQlNPTFVURQkJCShWNEwyX0NJRF9DQU1FUkFfQ0xBU1NfQkFTRSsxMCkKKyNkZWZpbmUgVjRMMl9DSURfRk9DVVNfUkVMQVRJVkUJCQkoVjRMMl9DSURfQ0FNRVJBX0NMQVNTX0JBU0UrMTEpCisjZGVmaW5lIFY0TDJfQ0lEX0ZPQ1VTX0FVVE8JCQkoVjRMMl9DSURfQ0FNRVJBX0NMQVNTX0JBU0UrMTIpCisKKyNkZWZpbmUgVjRMMl9DSURfWk9PTV9BQlNPTFVURQkJCShWNEwyX0NJRF9DQU1FUkFfQ0xBU1NfQkFTRSsxMykKKyNkZWZpbmUgVjRMMl9DSURfWk9PTV9SRUxBVElWRQkJCShWNEwyX0NJRF9DQU1FUkFfQ0xBU1NfQkFTRSsxNCkKKyNkZWZpbmUgVjRMMl9DSURfWk9PTV9DT05USU5VT1VTCQkoVjRMMl9DSURfQ0FNRVJBX0NMQVNTX0JBU0UrMTUpCisKKyNkZWZpbmUgVjRMMl9DSURfUFJJVkFDWQkJCShWNEwyX0NJRF9DQU1FUkFfQ0xBU1NfQkFTRSsxNikKKworI2RlZmluZSBWNEwyX0NJRF9JUklTX0FCU09MVVRFCQkJKFY0TDJfQ0lEX0NBTUVSQV9DTEFTU19CQVNFKzE3KQorI2RlZmluZSBWNEwyX0NJRF9JUklTX1JFTEFUSVZFCQkJKFY0TDJfQ0lEX0NBTUVSQV9DTEFTU19CQVNFKzE4KQorCisvKiBGTSBNb2R1bGF0b3IgY2xhc3MgY29udHJvbCBJRHMgKi8KKyNkZWZpbmUgVjRMMl9DSURfRk1fVFhfQ0xBU1NfQkFTRQkJKFY0TDJfQ1RSTF9DTEFTU19GTV9UWCB8IDB4OTAwKQorI2RlZmluZSBWNEwyX0NJRF9GTV9UWF9DTEFTUwkJCShWNEwyX0NUUkxfQ0xBU1NfRk1fVFggfCAxKQorCisjZGVmaW5lIFY0TDJfQ0lEX1JEU19UWF9ERVZJQVRJT04JCShWNEwyX0NJRF9GTV9UWF9DTEFTU19CQVNFICsgMSkKKyNkZWZpbmUgVjRMMl9DSURfUkRTX1RYX1BJCQkJKFY0TDJfQ0lEX0ZNX1RYX0NMQVNTX0JBU0UgKyAyKQorI2RlZmluZSBWNEwyX0NJRF9SRFNfVFhfUFRZCQkJKFY0TDJfQ0lEX0ZNX1RYX0NMQVNTX0JBU0UgKyAzKQorI2RlZmluZSBWNEwyX0NJRF9SRFNfVFhfUFNfTkFNRQkJCShWNEwyX0NJRF9GTV9UWF9DTEFTU19CQVNFICsgNSkKKyNkZWZpbmUgVjRMMl9DSURfUkRTX1RYX1JBRElPX1RFWFQJCShWNEwyX0NJRF9GTV9UWF9DTEFTU19CQVNFICsgNikKKworI2RlZmluZSBWNEwyX0NJRF9BVURJT19MSU1JVEVSX0VOQUJMRUQJCShWNEwyX0NJRF9GTV9UWF9DTEFTU19CQVNFICsgNjQpCisjZGVmaW5lIFY0TDJfQ0lEX0FVRElPX0xJTUlURVJfUkVMRUFTRV9USU1FCShWNEwyX0NJRF9GTV9UWF9DTEFTU19CQVNFICsgNjUpCisjZGVmaW5lIFY0TDJfQ0lEX0FVRElPX0xJTUlURVJfREVWSUFUSU9OCShWNEwyX0NJRF9GTV9UWF9DTEFTU19CQVNFICsgNjYpCisKKyNkZWZpbmUgVjRMMl9DSURfQVVESU9fQ09NUFJFU1NJT05fRU5BQkxFRAkoVjRMMl9DSURfRk1fVFhfQ0xBU1NfQkFTRSArIDgwKQorI2RlZmluZSBWNEwyX0NJRF9BVURJT19DT01QUkVTU0lPTl9HQUlOCQkoVjRMMl9DSURfRk1fVFhfQ0xBU1NfQkFTRSArIDgxKQorI2RlZmluZSBWNEwyX0NJRF9BVURJT19DT01QUkVTU0lPTl9USFJFU0hPTEQJKFY0TDJfQ0lEX0ZNX1RYX0NMQVNTX0JBU0UgKyA4MikKKyNkZWZpbmUgVjRMMl9DSURfQVVESU9fQ09NUFJFU1NJT05fQVRUQUNLX1RJTUUJKFY0TDJfQ0lEX0ZNX1RYX0NMQVNTX0JBU0UgKyA4MykKKyNkZWZpbmUgVjRMMl9DSURfQVVESU9fQ09NUFJFU1NJT05fUkVMRUFTRV9USU1FCShWNEwyX0NJRF9GTV9UWF9DTEFTU19CQVNFICsgODQpCisKKyNkZWZpbmUgVjRMMl9DSURfUElMT1RfVE9ORV9FTkFCTEVECQkoVjRMMl9DSURfRk1fVFhfQ0xBU1NfQkFTRSArIDk2KQorI2RlZmluZSBWNEwyX0NJRF9QSUxPVF9UT05FX0RFVklBVElPTgkJKFY0TDJfQ0lEX0ZNX1RYX0NMQVNTX0JBU0UgKyA5NykKKyNkZWZpbmUgVjRMMl9DSURfUElMT1RfVE9ORV9GUkVRVUVOQ1kJCShWNEwyX0NJRF9GTV9UWF9DTEFTU19CQVNFICsgOTgpCisKKyNkZWZpbmUgVjRMMl9DSURfVFVORV9QUkVFTVBIQVNJUwkJKFY0TDJfQ0lEX0ZNX1RYX0NMQVNTX0JBU0UgKyAxMTIpCitlbnVtIHY0bDJfcHJlZW1waGFzaXMgeworCVY0TDJfUFJFRU1QSEFTSVNfRElTQUJMRUQJPSAwLAorCVY0TDJfUFJFRU1QSEFTSVNfNTBfdVMJCT0gMSwKKwlWNEwyX1BSRUVNUEhBU0lTXzc1X3VTCQk9IDIsCit9OworI2RlZmluZSBWNEwyX0NJRF9UVU5FX1BPV0VSX0xFVkVMCQkoVjRMMl9DSURfRk1fVFhfQ0xBU1NfQkFTRSArIDExMykKKyNkZWZpbmUgVjRMMl9DSURfVFVORV9BTlRFTk5BX0NBUEFDSVRPUgkJKFY0TDJfQ0lEX0ZNX1RYX0NMQVNTX0JBU0UgKyAxMTQpCisKKy8qCisgKglUIFUgTiBJIE4gRworICovCitzdHJ1Y3QgdjRsMl90dW5lciB7CisJX191MzIgICAgICAgICAgICAgICAgICAgaW5kZXg7CisJX191OAkJCW5hbWVbMzJdOworCWVudW0gdjRsMl90dW5lcl90eXBlICAgIHR5cGU7CisJX191MzIJCQljYXBhYmlsaXR5OworCV9fdTMyCQkJcmFuZ2Vsb3c7CisJX191MzIJCQlyYW5nZWhpZ2g7CisJX191MzIJCQlyeHN1YmNoYW5zOworCV9fdTMyCQkJYXVkbW9kZTsKKwlfX3MzMgkJCXNpZ25hbDsKKwlfX3MzMgkJCWFmYzsKKwlfX3UzMgkJCXJlc2VydmVkWzRdOworfTsKKworc3RydWN0IHY0bDJfbW9kdWxhdG9yIHsKKwlfX3UzMgkJCWluZGV4OworCV9fdTgJCQluYW1lWzMyXTsKKwlfX3UzMgkJCWNhcGFiaWxpdHk7CisJX191MzIJCQlyYW5nZWxvdzsKKwlfX3UzMgkJCXJhbmdlaGlnaDsKKwlfX3UzMgkJCXR4c3ViY2hhbnM7CisJX191MzIJCQlyZXNlcnZlZFs0XTsKK307CisKKy8qICBGbGFncyBmb3IgdGhlICdjYXBhYmlsaXR5JyBmaWVsZCAqLworI2RlZmluZSBWNEwyX1RVTkVSX0NBUF9MT1cJCTB4MDAwMQorI2RlZmluZSBWNEwyX1RVTkVSX0NBUF9OT1JNCQkweDAwMDIKKyNkZWZpbmUgVjRMMl9UVU5FUl9DQVBfU1RFUkVPCQkweDAwMTAKKyNkZWZpbmUgVjRMMl9UVU5FUl9DQVBfTEFORzIJCTB4MDAyMAorI2RlZmluZSBWNEwyX1RVTkVSX0NBUF9TQVAJCTB4MDAyMAorI2RlZmluZSBWNEwyX1RVTkVSX0NBUF9MQU5HMQkJMHgwMDQwCisjZGVmaW5lIFY0TDJfVFVORVJfQ0FQX1JEUwkJMHgwMDgwCisjZGVmaW5lIFY0TDJfVFVORVJfQ0FQX1JEU19CTE9DS19JTwkweDAxMDAKKyNkZWZpbmUgVjRMMl9UVU5FUl9DQVBfUkRTX0NPTlRST0xTCTB4MDIwMAorCisvKiAgRmxhZ3MgZm9yIHRoZSAncnhzdWJjaGFucycgZmllbGQgKi8KKyNkZWZpbmUgVjRMMl9UVU5FUl9TVUJfTU9OTwkJMHgwMDAxCisjZGVmaW5lIFY0TDJfVFVORVJfU1VCX1NURVJFTwkJMHgwMDAyCisjZGVmaW5lIFY0TDJfVFVORVJfU1VCX0xBTkcyCQkweDAwMDQKKyNkZWZpbmUgVjRMMl9UVU5FUl9TVUJfU0FQCQkweDAwMDQKKyNkZWZpbmUgVjRMMl9UVU5FUl9TVUJfTEFORzEJCTB4MDAwOAorI2RlZmluZSBWNEwyX1RVTkVSX1NVQl9SRFMJCTB4MDAxMAorCisvKiAgVmFsdWVzIGZvciB0aGUgJ2F1ZG1vZGUnIGZpZWxkICovCisjZGVmaW5lIFY0TDJfVFVORVJfTU9ERV9NT05PCQkweDAwMDAKKyNkZWZpbmUgVjRMMl9UVU5FUl9NT0RFX1NURVJFTwkJMHgwMDAxCisjZGVmaW5lIFY0TDJfVFVORVJfTU9ERV9MQU5HMgkJMHgwMDAyCisjZGVmaW5lIFY0TDJfVFVORVJfTU9ERV9TQVAJCTB4MDAwMgorI2RlZmluZSBWNEwyX1RVTkVSX01PREVfTEFORzEJCTB4MDAwMworI2RlZmluZSBWNEwyX1RVTkVSX01PREVfTEFORzFfTEFORzIJMHgwMDA0CisKK3N0cnVjdCB2NGwyX2ZyZXF1ZW5jeSB7CisJX191MzIJCSAgICAgIHR1bmVyOworCWVudW0gdjRsMl90dW5lcl90eXBlICB0eXBlOworCV9fdTMyCQkgICAgICBmcmVxdWVuY3k7CisJX191MzIJCSAgICAgIHJlc2VydmVkWzhdOworfTsKKworc3RydWN0IHY0bDJfaHdfZnJlcV9zZWVrIHsKKwlfX3UzMgkJICAgICAgdHVuZXI7CisJZW51bSB2NGwyX3R1bmVyX3R5cGUgIHR5cGU7CisJX191MzIJCSAgICAgIHNlZWtfdXB3YXJkOworCV9fdTMyCQkgICAgICB3cmFwX2Fyb3VuZDsKKwlfX3UzMgkJICAgICAgc3BhY2luZzsKKwlfX3UzMgkJICAgICAgcmVzZXJ2ZWRbN107Cit9OworCisvKgorICoJUiBEIFMKKyAqLworCitzdHJ1Y3QgdjRsMl9yZHNfZGF0YSB7CisJX191OCAJbHNiOworCV9fdTggCW1zYjsKKwlfX3U4IAlibG9jazsKK30gX19hdHRyaWJ1dGVfXyAoKHBhY2tlZCkpOworCisjZGVmaW5lIFY0TDJfUkRTX0JMT0NLX01TSyAJIDB4NworI2RlZmluZSBWNEwyX1JEU19CTE9DS19BIAkgMAorI2RlZmluZSBWNEwyX1JEU19CTE9DS19CIAkgMQorI2RlZmluZSBWNEwyX1JEU19CTE9DS19DIAkgMgorI2RlZmluZSBWNEwyX1JEU19CTE9DS19EIAkgMworI2RlZmluZSBWNEwyX1JEU19CTE9DS19DX0FMVCAJIDQKKyNkZWZpbmUgVjRMMl9SRFNfQkxPQ0tfSU5WQUxJRCAJIDcKKworI2RlZmluZSBWNEwyX1JEU19CTE9DS19DT1JSRUNURUQgMHg0MAorI2RlZmluZSBWNEwyX1JEU19CTE9DS19FUlJPUiAJIDB4ODAKKworLyoKKyAqCUEgVSBEIEkgTworICovCitzdHJ1Y3QgdjRsMl9hdWRpbyB7CisJX191MzIJaW5kZXg7CisJX191OAluYW1lWzMyXTsKKwlfX3UzMgljYXBhYmlsaXR5OworCV9fdTMyCW1vZGU7CisJX191MzIJcmVzZXJ2ZWRbMl07Cit9OworCisvKiAgRmxhZ3MgZm9yIHRoZSAnY2FwYWJpbGl0eScgZmllbGQgKi8KKyNkZWZpbmUgVjRMMl9BVURDQVBfU1RFUkVPCQkweDAwMDAxCisjZGVmaW5lIFY0TDJfQVVEQ0FQX0FWTAkJCTB4MDAwMDIKKworLyogIEZsYWdzIGZvciB0aGUgJ21vZGUnIGZpZWxkICovCisjZGVmaW5lIFY0TDJfQVVETU9ERV9BVkwJCTB4MDAwMDEKKworc3RydWN0IHY0bDJfYXVkaW9vdXQgeworCV9fdTMyCWluZGV4OworCV9fdTgJbmFtZVszMl07CisJX191MzIJY2FwYWJpbGl0eTsKKwlfX3UzMgltb2RlOworCV9fdTMyCXJlc2VydmVkWzJdOworfTsKKworLyoKKyAqCU0gUCBFIEcgICBTIEUgUiBWIEkgQyBFIFMKKyAqCisgKglOT1RFOiBFWFBFUklNRU5UQUwgQVBJCisgKi8KKyNpZiAxCisjZGVmaW5lIFY0TDJfRU5DX0lEWF9GUkFNRV9JICAgICgwKQorI2RlZmluZSBWNEwyX0VOQ19JRFhfRlJBTUVfUCAgICAoMSkKKyNkZWZpbmUgVjRMMl9FTkNfSURYX0ZSQU1FX0IgICAgKDIpCisjZGVmaW5lIFY0TDJfRU5DX0lEWF9GUkFNRV9NQVNLICgweGYpCisKK3N0cnVjdCB2NGwyX2VuY19pZHhfZW50cnkgeworCV9fdTY0IG9mZnNldDsKKwlfX3U2NCBwdHM7CisJX191MzIgbGVuZ3RoOworCV9fdTMyIGZsYWdzOworCV9fdTMyIHJlc2VydmVkWzJdOworfTsKKworI2RlZmluZSBWNEwyX0VOQ19JRFhfRU5UUklFUyAoNjQpCitzdHJ1Y3QgdjRsMl9lbmNfaWR4IHsKKwlfX3UzMiBlbnRyaWVzOworCV9fdTMyIGVudHJpZXNfY2FwOworCV9fdTMyIHJlc2VydmVkWzRdOworCXN0cnVjdCB2NGwyX2VuY19pZHhfZW50cnkgZW50cnlbVjRMMl9FTkNfSURYX0VOVFJJRVNdOworfTsKKworCisjZGVmaW5lIFY0TDJfRU5DX0NNRF9TVEFSVCAgICAgICgwKQorI2RlZmluZSBWNEwyX0VOQ19DTURfU1RPUCAgICAgICAoMSkKKyNkZWZpbmUgVjRMMl9FTkNfQ01EX1BBVVNFICAgICAgKDIpCisjZGVmaW5lIFY0TDJfRU5DX0NNRF9SRVNVTUUgICAgICgzKQorCisvKiBGbGFncyBmb3IgVjRMMl9FTkNfQ01EX1NUT1AgKi8KKyNkZWZpbmUgVjRMMl9FTkNfQ01EX1NUT1BfQVRfR09QX0VORCAgICAoMSA8PCAwKQorCitzdHJ1Y3QgdjRsMl9lbmNvZGVyX2NtZCB7CisJX191MzIgY21kOworCV9fdTMyIGZsYWdzOworCXVuaW9uIHsKKwkJc3RydWN0IHsKKwkJCV9fdTMyIGRhdGFbOF07CisJCX0gcmF3OworCX07Cit9OworCisjZW5kaWYKKworCisvKgorICoJRCBBIFQgQSAgIFMgRSBSIFYgSSBDIEUgUyAgICggViBCIEkgKQorICoKKyAqCURhdGEgc2VydmljZXMgQVBJIGJ5IE1pY2hhZWwgU2NoaW1laworICovCisKKy8qIFJhdyBWQkkgKi8KK3N0cnVjdCB2NGwyX3ZiaV9mb3JtYXQgeworCV9fdTMyCXNhbXBsaW5nX3JhdGU7CQkvKiBpbiAxIEh6ICovCisJX191MzIJb2Zmc2V0OworCV9fdTMyCXNhbXBsZXNfcGVyX2xpbmU7CisJX191MzIJc2FtcGxlX2Zvcm1hdDsJCS8qIFY0TDJfUElYX0ZNVF8qICovCisJX19zMzIJc3RhcnRbMl07CisJX191MzIJY291bnRbMl07CisJX191MzIJZmxhZ3M7CQkJLyogVjRMMl9WQklfKiAqLworCV9fdTMyCXJlc2VydmVkWzJdOwkJLyogbXVzdCBiZSB6ZXJvICovCit9OworCisvKiAgVkJJIGZsYWdzICAqLworI2RlZmluZSBWNEwyX1ZCSV9VTlNZTkMJCSgxIDw8IDApCisjZGVmaW5lIFY0TDJfVkJJX0lOVEVSTEFDRUQJKDEgPDwgMSkKKworLyogU2xpY2VkIFZCSQorICoKKyAqICAgIFRoaXMgaW1wbGVtZW50cyBpcyBhIHByb3Bvc2FsIFY0TDIgQVBJIHRvIGFsbG93IFNMSUNFRCBWQkkKKyAqIHJlcXVpcmVkIGZvciBzb21lIGhhcmR3YXJlIGVuY29kZXJzLiBJdCBzaG91bGQgY2hhbmdlIHdpdGhvdXQKKyAqIG5vdGljZSBpbiB0aGUgZGVmaW5pdGl2ZSBpbXBsZW1lbnRhdGlvbi4KKyAqLworCitzdHJ1Y3QgdjRsMl9zbGljZWRfdmJpX2Zvcm1hdCB7CisJX191MTYgICBzZXJ2aWNlX3NldDsKKwkvKiBzZXJ2aWNlX2xpbmVzWzBdWy4uLl0gc3BlY2lmaWVzIGxpbmVzIDAtMjMgKDEtMjMgdXNlZCkgb2YgdGhlIGZpcnN0IGZpZWxkCisJICAgc2VydmljZV9saW5lc1sxXVsuLi5dIHNwZWNpZmllcyBsaW5lcyAwLTIzICgxLTIzIHVzZWQpIG9mIHRoZSBzZWNvbmQgZmllbGQKKwkJCQkgKGVxdWFscyBmcmFtZSBsaW5lcyAzMTMtMzM2IGZvciA2MjUgbGluZSB2aWRlbworCQkJCSAgc3RhbmRhcmRzLCAyNjMtMjg2IGZvciA1MjUgbGluZSBzdGFuZGFyZHMpICovCisJX191MTYgICBzZXJ2aWNlX2xpbmVzWzJdWzI0XTsKKwlfX3UzMiAgIGlvX3NpemU7CisJX191MzIgICByZXNlcnZlZFsyXTsgICAgICAgICAgICAvKiBtdXN0IGJlIHplcm8gKi8KK307CisKKy8qIFRlbGV0ZXh0IFdvcmxkIFN5c3RlbSBUZWxldGV4dAorICAgKFdTVCksIGRlZmluZWQgb24gSVRVLVIgQlQuNjUzLTIgKi8KKyNkZWZpbmUgVjRMMl9TTElDRURfVEVMRVRFWFRfQiAgICAgICAgICAoMHgwMDAxKQorLyogVmlkZW8gUHJvZ3JhbSBTeXN0ZW0sIGRlZmluZWQgb24gRVRTIDMwMCAyMzEqLworI2RlZmluZSBWNEwyX1NMSUNFRF9WUFMgICAgICAgICAgICAgICAgICgweDA0MDApCisvKiBDbG9zZWQgQ2FwdGlvbiwgZGVmaW5lZCBvbiBFSUEtNjA4ICovCisjZGVmaW5lIFY0TDJfU0xJQ0VEX0NBUFRJT05fNTI1ICAgICAgICAgKDB4MTAwMCkKKy8qIFdpZGUgU2NyZWVuIFN5c3RlbSwgZGVmaW5lZCBvbiBJVFUtUiBCVDExMTkuMSAqLworI2RlZmluZSBWNEwyX1NMSUNFRF9XU1NfNjI1ICAgICAgICAgICAgICgweDQwMDApCisKKyNkZWZpbmUgVjRMMl9TTElDRURfVkJJXzUyNSAgICAgICAgICAgICAoVjRMMl9TTElDRURfQ0FQVElPTl81MjUpCisjZGVmaW5lIFY0TDJfU0xJQ0VEX1ZCSV82MjUgICAgICAgICAgICAgKFY0TDJfU0xJQ0VEX1RFTEVURVhUX0IgfCBWNEwyX1NMSUNFRF9WUFMgfCBWNEwyX1NMSUNFRF9XU1NfNjI1KQorCitzdHJ1Y3QgdjRsMl9zbGljZWRfdmJpX2NhcCB7CisJX191MTYgICBzZXJ2aWNlX3NldDsKKwkvKiBzZXJ2aWNlX2xpbmVzWzBdWy4uLl0gc3BlY2lmaWVzIGxpbmVzIDAtMjMgKDEtMjMgdXNlZCkgb2YgdGhlIGZpcnN0IGZpZWxkCisJICAgc2VydmljZV9saW5lc1sxXVsuLi5dIHNwZWNpZmllcyBsaW5lcyAwLTIzICgxLTIzIHVzZWQpIG9mIHRoZSBzZWNvbmQgZmllbGQKKwkJCQkgKGVxdWFscyBmcmFtZSBsaW5lcyAzMTMtMzM2IGZvciA2MjUgbGluZSB2aWRlbworCQkJCSAgc3RhbmRhcmRzLCAyNjMtMjg2IGZvciA1MjUgbGluZSBzdGFuZGFyZHMpICovCisJX191MTYgICBzZXJ2aWNlX2xpbmVzWzJdWzI0XTsKKwllbnVtIHY0bDJfYnVmX3R5cGUgdHlwZTsKKwlfX3UzMiAgIHJlc2VydmVkWzNdOyAgICAvKiBtdXN0IGJlIDAgKi8KK307CisKK3N0cnVjdCB2NGwyX3NsaWNlZF92YmlfZGF0YSB7CisJX191MzIgICBpZDsKKwlfX3UzMiAgIGZpZWxkOyAgICAgICAgICAvKiAwOiBmaXJzdCBmaWVsZCwgMTogc2Vjb25kIGZpZWxkICovCisJX191MzIgICBsaW5lOyAgICAgICAgICAgLyogMS0yMyAqLworCV9fdTMyICAgcmVzZXJ2ZWQ7ICAgICAgIC8qIG11c3QgYmUgMCAqLworCV9fdTggICAgZGF0YVs0OF07Cit9OworCisvKgorICogU2xpY2VkIFZCSSBkYXRhIGluc2VydGVkIGludG8gTVBFRyBTdHJlYW1zCisgKi8KKworLyoKKyAqIFY0TDJfTVBFR19TVFJFQU1fVkJJX0ZNVF9JVlRWOgorICoKKyAqIFN0cnVjdHVyZSBvZiBwYXlsb2FkIGNvbnRhaW5lZCBpbiBhbiBNUEVHIDIgUHJpdmF0ZSBTdHJlYW0gMSBQRVMgUGFja2V0IGluIGFuCisgKiBNUEVHLTIgUHJvZ3JhbSBQYWNrIHRoYXQgY29udGFpbnMgVjRMMl9NUEVHX1NUUkVBTV9WQklfRk1UX0lWVFYgU2xpY2VkIFZCSQorICogZGF0YQorICoKKyAqIE5vdGUsIHRoZSBNUEVHLTIgUHJvZ3JhbSBQYWNrIGFuZCBQcml2YXRlIFN0cmVhbSAxIFBFUyBwYWNrZXQgaGVhZGVyCisgKiBkZWZpbml0aW9ucyBhcmUgbm90IGluY2x1ZGVkIGhlcmUuICBTZWUgdGhlIE1QRUctMiBzcGVjaWZpY2F0aW9ucyBmb3IgZGV0YWlscworICogb24gdGhlc2UgaGVhZGVycy4KKyAqLworCisvKiBMaW5lIHR5cGUgSURzICovCisjZGVmaW5lIFY0TDJfTVBFR19WQklfSVZUVl9URUxFVEVYVF9CICAgICAoMSkKKyNkZWZpbmUgVjRMMl9NUEVHX1ZCSV9JVlRWX0NBUFRJT05fNTI1ICAgICg0KQorI2RlZmluZSBWNEwyX01QRUdfVkJJX0lWVFZfV1NTXzYyNSAgICAgICAgKDUpCisjZGVmaW5lIFY0TDJfTVBFR19WQklfSVZUVl9WUFMgICAgICAgICAgICAoNykKKworc3RydWN0IHY0bDJfbXBlZ192YmlfaXR2MF9saW5lIHsKKwlfX3U4IGlkOwkvKiBPbmUgb2YgVjRMMl9NUEVHX1ZCSV9JVlRWXyogYWJvdmUgKi8KKwlfX3U4IGRhdGFbNDJdOwkvKiBTbGljZWQgVkJJIGRhdGEgZm9yIHRoZSBsaW5lICovCit9IF9fYXR0cmlidXRlX18gKChwYWNrZWQpKTsKKworc3RydWN0IHY0bDJfbXBlZ192YmlfaXR2MCB7CisJX19sZTMyIGxpbmVtYXNrWzJdOyAvKiBCaXRtYXNrcyBvZiBWQkkgc2VydmljZSBsaW5lcyBwcmVzZW50ICovCisJc3RydWN0IHY0bDJfbXBlZ192YmlfaXR2MF9saW5lIGxpbmVbMzVdOworfSBfX2F0dHJpYnV0ZV9fICgocGFja2VkKSk7CisKK3N0cnVjdCB2NGwyX21wZWdfdmJpX0lUVjAgeworCXN0cnVjdCB2NGwyX21wZWdfdmJpX2l0djBfbGluZSBsaW5lWzM2XTsKK30gX19hdHRyaWJ1dGVfXyAoKHBhY2tlZCkpOworCisjZGVmaW5lIFY0TDJfTVBFR19WQklfSVZUVl9NQUdJQzAJIml0djAiCisjZGVmaW5lIFY0TDJfTVBFR19WQklfSVZUVl9NQUdJQzEJIklUVjAiCisKK3N0cnVjdCB2NGwyX21wZWdfdmJpX2ZtdF9pdnR2IHsKKwlfX3U4IG1hZ2ljWzRdOworCXVuaW9uIHsKKwkJc3RydWN0IHY0bDJfbXBlZ192YmlfaXR2MCBpdHYwOworCQlzdHJ1Y3QgdjRsMl9tcGVnX3ZiaV9JVFYwIElUVjA7CisJfTsKK30gX19hdHRyaWJ1dGVfXyAoKHBhY2tlZCkpOworCisvKgorICoJQSBHIEcgUiBFIEcgQSBUIEUgICBTIFQgUiBVIEMgVCBVIFIgRSBTCisgKi8KKworLyoqCisgKiBzdHJ1Y3QgdjRsMl9wbGFuZV9waXhfZm9ybWF0IC0gYWRkaXRpb25hbCwgcGVyLXBsYW5lIGZvcm1hdCBkZWZpbml0aW9uCisgKiBAc2l6ZWltYWdlOgkJbWF4aW11bSBzaXplIGluIGJ5dGVzIHJlcXVpcmVkIGZvciBkYXRhLCBmb3Igd2hpY2gKKyAqCQkJdGhpcyBwbGFuZSB3aWxsIGJlIHVzZWQKKyAqIEBieXRlc3BlcmxpbmU6CWRpc3RhbmNlIGluIGJ5dGVzIGJldHdlZW4gdGhlIGxlZnRtb3N0IHBpeGVscyBpbiB0d28KKyAqCQkJYWRqYWNlbnQgbGluZXMKKyAqLworc3RydWN0IHY0bDJfcGxhbmVfcGl4X2Zvcm1hdCB7CisJX191MzIJCXNpemVpbWFnZTsKKwlfX3UxNgkJYnl0ZXNwZXJsaW5lOworCV9fdTE2CQlyZXNlcnZlZFs3XTsKK30gX19hdHRyaWJ1dGVfXyAoKHBhY2tlZCkpOworCisvKioKKyAqIHN0cnVjdCB2NGwyX3BpeF9mb3JtYXRfbXBsYW5lIC0gbXVsdGlwbGFuYXIgZm9ybWF0IGRlZmluaXRpb24KKyAqIEB3aWR0aDoJCWltYWdlIHdpZHRoIGluIHBpeGVscworICogQGhlaWdodDoJCWltYWdlIGhlaWdodCBpbiBwaXhlbHMKKyAqIEBwaXhlbGZvcm1hdDoJbGl0dGxlIGVuZGlhbiBmb3VyIGNoYXJhY3RlciBjb2RlIChmb3VyY2MpCisgKiBAZmllbGQ6CQlmaWVsZCBvcmRlciAoZm9yIGludGVybGFjZWQgdmlkZW8pCisgKiBAY29sb3JzcGFjZToJCXN1cHBsZW1lbnRhbCB0byBwaXhlbGZvcm1hdAorICogQHBsYW5lX2ZtdDoJCXBlci1wbGFuZSBpbmZvcm1hdGlvbgorICogQG51bV9wbGFuZXM6CQludW1iZXIgb2YgcGxhbmVzIGZvciB0aGlzIGZvcm1hdAorICovCitzdHJ1Y3QgdjRsMl9waXhfZm9ybWF0X21wbGFuZSB7CisJX191MzIJCQkJd2lkdGg7CisJX191MzIJCQkJaGVpZ2h0OworCV9fdTMyCQkJCXBpeGVsZm9ybWF0OworCWVudW0gdjRsMl9maWVsZAkJCWZpZWxkOworCWVudW0gdjRsMl9jb2xvcnNwYWNlCQljb2xvcnNwYWNlOworCisJc3RydWN0IHY0bDJfcGxhbmVfcGl4X2Zvcm1hdAlwbGFuZV9mbXRbVklERU9fTUFYX1BMQU5FU107CisJX191OAkJCQludW1fcGxhbmVzOworCV9fdTgJCQkJcmVzZXJ2ZWRbMTFdOworfSBfX2F0dHJpYnV0ZV9fICgocGFja2VkKSk7CisKKy8qKgorICogc3RydWN0IHY0bDJfZm9ybWF0IC0gc3RyZWFtIGRhdGEgZm9ybWF0CisgKiBAdHlwZToJdHlwZSBvZiB0aGUgZGF0YSBzdHJlYW0KKyAqIEBwaXg6CWRlZmluaXRpb24gb2YgYW4gaW1hZ2UgZm9ybWF0CisgKiBAcGl4X21wOglkZWZpbml0aW9uIG9mIGEgbXVsdGlwbGFuYXIgaW1hZ2UgZm9ybWF0CisgKiBAd2luOglkZWZpbml0aW9uIG9mIGFuIG92ZXJsYWlkIGltYWdlCisgKiBAdmJpOglyYXcgVkJJIGNhcHR1cmUgb3Igb3V0cHV0IHBhcmFtZXRlcnMKKyAqIEBzbGljZWQ6CXNsaWNlZCBWQkkgY2FwdHVyZSBvciBvdXRwdXQgcGFyYW1ldGVycworICogQHJhd19kYXRhOglwbGFjZWhvbGRlciBmb3IgZnV0dXJlIGV4dGVuc2lvbnMgYW5kIGN1c3RvbSBmb3JtYXRzCisgKi8KK3N0cnVjdCB2NGwyX2Zvcm1hdCB7CisJZW51bSB2NGwyX2J1Zl90eXBlIHR5cGU7CisJdW5pb24geworCQlzdHJ1Y3QgdjRsMl9waXhfZm9ybWF0CQlwaXg7ICAgICAvKiBWNEwyX0JVRl9UWVBFX1ZJREVPX0NBUFRVUkUgKi8KKwkJc3RydWN0IHY0bDJfcGl4X2Zvcm1hdF9tcGxhbmUJcGl4X21wOyAgLyogVjRMMl9CVUZfVFlQRV9WSURFT19DQVBUVVJFX01QTEFORSAqLworCQlzdHJ1Y3QgdjRsMl93aW5kb3cJCXdpbjsgICAgIC8qIFY0TDJfQlVGX1RZUEVfVklERU9fT1ZFUkxBWSAqLworCQlzdHJ1Y3QgdjRsMl92YmlfZm9ybWF0CQl2Ymk7ICAgICAvKiBWNEwyX0JVRl9UWVBFX1ZCSV9DQVBUVVJFICovCisJCXN0cnVjdCB2NGwyX3NsaWNlZF92YmlfZm9ybWF0CXNsaWNlZDsgIC8qIFY0TDJfQlVGX1RZUEVfU0xJQ0VEX1ZCSV9DQVBUVVJFICovCisJCV9fdTgJcmF3X2RhdGFbMjAwXTsgICAgICAgICAgICAgICAgICAgLyogdXNlci1kZWZpbmVkICovCisJfSBmbXQ7Cit9OworCisvKglTdHJlYW0gdHlwZS1kZXBlbmRlbnQgcGFyYW1ldGVycworICovCitzdHJ1Y3QgdjRsMl9zdHJlYW1wYXJtIHsKKwllbnVtIHY0bDJfYnVmX3R5cGUgdHlwZTsKKwl1bmlvbiB7CisJCXN0cnVjdCB2NGwyX2NhcHR1cmVwYXJtCWNhcHR1cmU7CisJCXN0cnVjdCB2NGwyX291dHB1dHBhcm0Jb3V0cHV0OworCQlfX3U4CXJhd19kYXRhWzIwMF07ICAvKiB1c2VyLWRlZmluZWQgKi8KKwl9IHBhcm07Cit9OworCisvKgorICoJRSBWIEUgTiBUIFMKKyAqLworCisjZGVmaW5lIFY0TDJfRVZFTlRfQUxMCQkJCTAKKyNkZWZpbmUgVjRMMl9FVkVOVF9WU1lOQwkJCTEKKyNkZWZpbmUgVjRMMl9FVkVOVF9FT1MJCQkJMgorI2RlZmluZSBWNEwyX0VWRU5UX1BSSVZBVEVfU1RBUlQJCTB4MDgwMDAwMDAKKworLyogUGF5bG9hZCBmb3IgVjRMMl9FVkVOVF9WU1lOQyAqLworc3RydWN0IHY0bDJfZXZlbnRfdnN5bmMgeworCS8qIENhbiBiZSBWNEwyX0ZJRUxEX0FOWSwgX05PTkUsIF9UT1Agb3IgX0JPVFRPTSAqLworCV9fdTggZmllbGQ7Cit9IF9fYXR0cmlidXRlX18gKChwYWNrZWQpKTsKKworc3RydWN0IHY0bDJfZXZlbnQgeworCV9fdTMyCQkJCXR5cGU7CisJdW5pb24geworCQlzdHJ1Y3QgdjRsMl9ldmVudF92c3luYyB2c3luYzsKKwkJX191OAkJCWRhdGFbNjRdOworCX0gdTsKKwlfX3UzMgkJCQlwZW5kaW5nOworCV9fdTMyCQkJCXNlcXVlbmNlOworCXN0cnVjdCB0aW1lc3BlYwkJCXRpbWVzdGFtcDsKKwlfX3UzMgkJCQlyZXNlcnZlZFs5XTsKK307CisKK3N0cnVjdCB2NGwyX2V2ZW50X3N1YnNjcmlwdGlvbiB7CisJX191MzIJCQkJdHlwZTsKKwlfX3UzMgkJCQlyZXNlcnZlZFs3XTsKK307CisKKy8qCisgKglBIEQgViBBIE4gQyBFIEQgICBEIEUgQiBVIEcgRyBJIE4gRworICoKKyAqCU5PVEU6IEVYUEVSSU1FTlRBTCBBUEksIE5FVkVSIFJFTFkgT04gVEhJUyBJTiBBUFBMSUNBVElPTlMhCisgKglGT1IgREVCVUdHSU5HLCBURVNUSU5HIEFORCBJTlRFUk5BTCBVU0UgT05MWSEKKyAqLworCisvKiBWSURJT0NfREJHX0dfUkVHSVNURVIgYW5kIFZJRElPQ19EQkdfU19SRUdJU1RFUiAqLworCisjZGVmaW5lIFY0TDJfQ0hJUF9NQVRDSF9IT1NUICAgICAgIDAgIC8qIE1hdGNoIGFnYWluc3QgY2hpcCBJRCBvbiBob3N0ICgwIGZvciB0aGUgaG9zdCkgKi8KKyNkZWZpbmUgVjRMMl9DSElQX01BVENIX0kyQ19EUklWRVIgMSAgLyogTWF0Y2ggYWdhaW5zdCBJMkMgZHJpdmVyIG5hbWUgKi8KKyNkZWZpbmUgVjRMMl9DSElQX01BVENIX0kyQ19BRERSICAgMiAgLyogTWF0Y2ggYWdhaW5zdCBJMkMgNy1iaXQgYWRkcmVzcyAqLworI2RlZmluZSBWNEwyX0NISVBfTUFUQ0hfQUM5NyAgICAgICAzICAvKiBNYXRjaCBhZ2FpbnN0IGFuY2lsaWFyeSBBQzk3IGNoaXAgKi8KKworc3RydWN0IHY0bDJfZGJnX21hdGNoIHsKKwlfX3UzMiB0eXBlOyAvKiBNYXRjaCB0eXBlICovCisJdW5pb24geyAgICAgLyogTWF0Y2ggdGhpcyBjaGlwLCBtZWFuaW5nIGRldGVybWluZWQgYnkgdHlwZSAqLworCQlfX3UzMiBhZGRyOworCQljaGFyIG5hbWVbMzJdOworCX07Cit9IF9fYXR0cmlidXRlX18gKChwYWNrZWQpKTsKKworc3RydWN0IHY0bDJfZGJnX3JlZ2lzdGVyIHsKKwlzdHJ1Y3QgdjRsMl9kYmdfbWF0Y2ggbWF0Y2g7CisJX191MzIgc2l6ZTsJLyogcmVnaXN0ZXIgc2l6ZSBpbiBieXRlcyAqLworCV9fdTY0IHJlZzsKKwlfX3U2NCB2YWw7Cit9IF9fYXR0cmlidXRlX18gKChwYWNrZWQpKTsKKworLyogVklESU9DX0RCR19HX0NISVBfSURFTlQgKi8KK3N0cnVjdCB2NGwyX2RiZ19jaGlwX2lkZW50IHsKKwlzdHJ1Y3QgdjRsMl9kYmdfbWF0Y2ggbWF0Y2g7CisJX191MzIgaWRlbnQ7ICAgICAgIC8qIGNoaXAgaWRlbnRpZmllciBhcyBzcGVjaWZpZWQgaW4gPG1lZGlhL3Y0bDItY2hpcC1pZGVudC5oPiAqLworCV9fdTMyIHJldmlzaW9uOyAgICAvKiBjaGlwIHJldmlzaW9uLCBjaGlwIHNwZWNpZmljICovCit9IF9fYXR0cmlidXRlX18gKChwYWNrZWQpKTsKKworLyoKKyAqCUkgTyBDIFQgTCAgIEMgTyBEIEUgUyAgIEYgTyBSICAgViBJIEQgRSBPICAgRCBFIFYgSSBDIEUgUworICoKKyAqLworI2RlZmluZSBWSURJT0NfUVVFUllDQVAJCSBfSU9SKCdWJywgIDAsIHN0cnVjdCB2NGwyX2NhcGFiaWxpdHkpCisjZGVmaW5lIFZJRElPQ19SRVNFUlZFRAkJICBfSU8oJ1YnLCAgMSkKKyNkZWZpbmUgVklESU9DX0VOVU1fRk1UICAgICAgICAgX0lPV1IoJ1YnLCAgMiwgc3RydWN0IHY0bDJfZm10ZGVzYykKKyNkZWZpbmUgVklESU9DX0dfRk1UCQlfSU9XUignVicsICA0LCBzdHJ1Y3QgdjRsMl9mb3JtYXQpCisjZGVmaW5lIFZJRElPQ19TX0ZNVAkJX0lPV1IoJ1YnLCAgNSwgc3RydWN0IHY0bDJfZm9ybWF0KQorI2RlZmluZSBWSURJT0NfUkVRQlVGUwkJX0lPV1IoJ1YnLCAgOCwgc3RydWN0IHY0bDJfcmVxdWVzdGJ1ZmZlcnMpCisjZGVmaW5lIFZJRElPQ19RVUVSWUJVRgkJX0lPV1IoJ1YnLCAgOSwgc3RydWN0IHY0bDJfYnVmZmVyKQorI2RlZmluZSBWSURJT0NfR19GQlVGCQkgX0lPUignVicsIDEwLCBzdHJ1Y3QgdjRsMl9mcmFtZWJ1ZmZlcikKKyNkZWZpbmUgVklESU9DX1NfRkJVRgkJIF9JT1coJ1YnLCAxMSwgc3RydWN0IHY0bDJfZnJhbWVidWZmZXIpCisjZGVmaW5lIFZJRElPQ19PVkVSTEFZCQkgX0lPVygnVicsIDE0LCBpbnQpCisjZGVmaW5lIFZJRElPQ19RQlVGCQlfSU9XUignVicsIDE1LCBzdHJ1Y3QgdjRsMl9idWZmZXIpCisjZGVmaW5lIFZJRElPQ19EUUJVRgkJX0lPV1IoJ1YnLCAxNywgc3RydWN0IHY0bDJfYnVmZmVyKQorI2RlZmluZSBWSURJT0NfU1RSRUFNT04JCSBfSU9XKCdWJywgMTgsIGludCkKKyNkZWZpbmUgVklESU9DX1NUUkVBTU9GRgkgX0lPVygnVicsIDE5LCBpbnQpCisjZGVmaW5lIFZJRElPQ19HX1BBUk0JCV9JT1dSKCdWJywgMjEsIHN0cnVjdCB2NGwyX3N0cmVhbXBhcm0pCisjZGVmaW5lIFZJRElPQ19TX1BBUk0JCV9JT1dSKCdWJywgMjIsIHN0cnVjdCB2NGwyX3N0cmVhbXBhcm0pCisjZGVmaW5lIFZJRElPQ19HX1NURAkJIF9JT1IoJ1YnLCAyMywgdjRsMl9zdGRfaWQpCisjZGVmaW5lIFZJRElPQ19TX1NURAkJIF9JT1coJ1YnLCAyNCwgdjRsMl9zdGRfaWQpCisjZGVmaW5lIFZJRElPQ19FTlVNU1RECQlfSU9XUignVicsIDI1LCBzdHJ1Y3QgdjRsMl9zdGFuZGFyZCkKKyNkZWZpbmUgVklESU9DX0VOVU1JTlBVVAlfSU9XUignVicsIDI2LCBzdHJ1Y3QgdjRsMl9pbnB1dCkKKyNkZWZpbmUgVklESU9DX0dfQ1RSTAkJX0lPV1IoJ1YnLCAyNywgc3RydWN0IHY0bDJfY29udHJvbCkKKyNkZWZpbmUgVklESU9DX1NfQ1RSTAkJX0lPV1IoJ1YnLCAyOCwgc3RydWN0IHY0bDJfY29udHJvbCkKKyNkZWZpbmUgVklESU9DX0dfVFVORVIJCV9JT1dSKCdWJywgMjksIHN0cnVjdCB2NGwyX3R1bmVyKQorI2RlZmluZSBWSURJT0NfU19UVU5FUgkJIF9JT1coJ1YnLCAzMCwgc3RydWN0IHY0bDJfdHVuZXIpCisjZGVmaW5lIFZJRElPQ19HX0FVRElPCQkgX0lPUignVicsIDMzLCBzdHJ1Y3QgdjRsMl9hdWRpbykKKyNkZWZpbmUgVklESU9DX1NfQVVESU8JCSBfSU9XKCdWJywgMzQsIHN0cnVjdCB2NGwyX2F1ZGlvKQorI2RlZmluZSBWSURJT0NfUVVFUllDVFJMCV9JT1dSKCdWJywgMzYsIHN0cnVjdCB2NGwyX3F1ZXJ5Y3RybCkKKyNkZWZpbmUgVklESU9DX1FVRVJZTUVOVQlfSU9XUignVicsIDM3LCBzdHJ1Y3QgdjRsMl9xdWVyeW1lbnUpCisjZGVmaW5lIFZJRElPQ19HX0lOUFVUCQkgX0lPUignVicsIDM4LCBpbnQpCisjZGVmaW5lIFZJRElPQ19TX0lOUFVUCQlfSU9XUignVicsIDM5LCBpbnQpCisjZGVmaW5lIFZJRElPQ19HX09VVFBVVAkJIF9JT1IoJ1YnLCA0NiwgaW50KQorI2RlZmluZSBWSURJT0NfU19PVVRQVVQJCV9JT1dSKCdWJywgNDcsIGludCkKKyNkZWZpbmUgVklESU9DX0VOVU1PVVRQVVQJX0lPV1IoJ1YnLCA0OCwgc3RydWN0IHY0bDJfb3V0cHV0KQorI2RlZmluZSBWSURJT0NfR19BVURPVVQJCSBfSU9SKCdWJywgNDksIHN0cnVjdCB2NGwyX2F1ZGlvb3V0KQorI2RlZmluZSBWSURJT0NfU19BVURPVVQJCSBfSU9XKCdWJywgNTAsIHN0cnVjdCB2NGwyX2F1ZGlvb3V0KQorI2RlZmluZSBWSURJT0NfR19NT0RVTEFUT1IJX0lPV1IoJ1YnLCA1NCwgc3RydWN0IHY0bDJfbW9kdWxhdG9yKQorI2RlZmluZSBWSURJT0NfU19NT0RVTEFUT1IJIF9JT1coJ1YnLCA1NSwgc3RydWN0IHY0bDJfbW9kdWxhdG9yKQorI2RlZmluZSBWSURJT0NfR19GUkVRVUVOQ1kJX0lPV1IoJ1YnLCA1Niwgc3RydWN0IHY0bDJfZnJlcXVlbmN5KQorI2RlZmluZSBWSURJT0NfU19GUkVRVUVOQ1kJIF9JT1coJ1YnLCA1Nywgc3RydWN0IHY0bDJfZnJlcXVlbmN5KQorI2RlZmluZSBWSURJT0NfQ1JPUENBUAkJX0lPV1IoJ1YnLCA1OCwgc3RydWN0IHY0bDJfY3JvcGNhcCkKKyNkZWZpbmUgVklESU9DX0dfQ1JPUAkJX0lPV1IoJ1YnLCA1OSwgc3RydWN0IHY0bDJfY3JvcCkKKyNkZWZpbmUgVklESU9DX1NfQ1JPUAkJIF9JT1coJ1YnLCA2MCwgc3RydWN0IHY0bDJfY3JvcCkKKyNkZWZpbmUgVklESU9DX0dfSlBFR0NPTVAJIF9JT1IoJ1YnLCA2MSwgc3RydWN0IHY0bDJfanBlZ2NvbXByZXNzaW9uKQorI2RlZmluZSBWSURJT0NfU19KUEVHQ09NUAkgX0lPVygnVicsIDYyLCBzdHJ1Y3QgdjRsMl9qcGVnY29tcHJlc3Npb24pCisjZGVmaW5lIFZJRElPQ19RVUVSWVNURCAgICAgIAkgX0lPUignVicsIDYzLCB2NGwyX3N0ZF9pZCkKKyNkZWZpbmUgVklESU9DX1RSWV9GTVQgICAgICAJX0lPV1IoJ1YnLCA2NCwgc3RydWN0IHY0bDJfZm9ybWF0KQorI2RlZmluZSBWSURJT0NfRU5VTUFVRElPCV9JT1dSKCdWJywgNjUsIHN0cnVjdCB2NGwyX2F1ZGlvKQorI2RlZmluZSBWSURJT0NfRU5VTUFVRE9VVAlfSU9XUignVicsIDY2LCBzdHJ1Y3QgdjRsMl9hdWRpb291dCkKKyNkZWZpbmUgVklESU9DX0dfUFJJT1JJVFkgICAgICAgIF9JT1IoJ1YnLCA2NywgZW51bSB2NGwyX3ByaW9yaXR5KQorI2RlZmluZSBWSURJT0NfU19QUklPUklUWSAgICAgICAgX0lPVygnVicsIDY4LCBlbnVtIHY0bDJfcHJpb3JpdHkpCisjZGVmaW5lIFZJRElPQ19HX1NMSUNFRF9WQklfQ0FQIF9JT1dSKCdWJywgNjksIHN0cnVjdCB2NGwyX3NsaWNlZF92YmlfY2FwKQorI2RlZmluZSBWSURJT0NfTE9HX1NUQVRVUyAgICAgICAgIF9JTygnVicsIDcwKQorI2RlZmluZSBWSURJT0NfR19FWFRfQ1RSTFMJX0lPV1IoJ1YnLCA3MSwgc3RydWN0IHY0bDJfZXh0X2NvbnRyb2xzKQorI2RlZmluZSBWSURJT0NfU19FWFRfQ1RSTFMJX0lPV1IoJ1YnLCA3Miwgc3RydWN0IHY0bDJfZXh0X2NvbnRyb2xzKQorI2RlZmluZSBWSURJT0NfVFJZX0VYVF9DVFJMUwlfSU9XUignVicsIDczLCBzdHJ1Y3QgdjRsMl9leHRfY29udHJvbHMpCisjaWYgMQorI2RlZmluZSBWSURJT0NfRU5VTV9GUkFNRVNJWkVTCV9JT1dSKCdWJywgNzQsIHN0cnVjdCB2NGwyX2ZybXNpemVlbnVtKQorI2RlZmluZSBWSURJT0NfRU5VTV9GUkFNRUlOVEVSVkFMUyBfSU9XUignVicsIDc1LCBzdHJ1Y3QgdjRsMl9mcm1pdmFsZW51bSkKKyNkZWZpbmUgVklESU9DX0dfRU5DX0lOREVYICAgICAgIF9JT1IoJ1YnLCA3Niwgc3RydWN0IHY0bDJfZW5jX2lkeCkKKyNkZWZpbmUgVklESU9DX0VOQ09ERVJfQ01EICAgICAgX0lPV1IoJ1YnLCA3Nywgc3RydWN0IHY0bDJfZW5jb2Rlcl9jbWQpCisjZGVmaW5lIFZJRElPQ19UUllfRU5DT0RFUl9DTUQgIF9JT1dSKCdWJywgNzgsIHN0cnVjdCB2NGwyX2VuY29kZXJfY21kKQorI2VuZGlmCisKKyNpZiAxCisvKiBFeHBlcmltZW50YWwsIG1lYW50IGZvciBkZWJ1Z2dpbmcsIHRlc3RpbmcgYW5kIGludGVybmFsIHVzZS4KKyAgIE9ubHkgaW1wbGVtZW50ZWQgaWYgQ09ORklHX1ZJREVPX0FEVl9ERUJVRyBpcyBkZWZpbmVkLgorICAgWW91IG11c3QgYmUgcm9vdCB0byB1c2UgdGhlc2UgaW9jdGxzLiBOZXZlciB1c2UgdGhlc2UgaW4gYXBwbGljYXRpb25zISAqLworI2RlZmluZQlWSURJT0NfREJHX1NfUkVHSVNURVIgCSBfSU9XKCdWJywgNzksIHN0cnVjdCB2NGwyX2RiZ19yZWdpc3RlcikKKyNkZWZpbmUJVklESU9DX0RCR19HX1JFR0lTVEVSIAlfSU9XUignVicsIDgwLCBzdHJ1Y3QgdjRsMl9kYmdfcmVnaXN0ZXIpCisKKy8qIEV4cGVyaW1lbnRhbCwgbWVhbnQgZm9yIGRlYnVnZ2luZywgdGVzdGluZyBhbmQgaW50ZXJuYWwgdXNlLgorICAgTmV2ZXIgdXNlIHRoaXMgaW9jdGwgaW4gYXBwbGljYXRpb25zISAqLworI2RlZmluZSBWSURJT0NfREJHX0dfQ0hJUF9JREVOVCBfSU9XUignVicsIDgxLCBzdHJ1Y3QgdjRsMl9kYmdfY2hpcF9pZGVudCkKKyNlbmRpZgorCisjZGVmaW5lIFZJRElPQ19TX0hXX0ZSRVFfU0VFSwkgX0lPVygnVicsIDgyLCBzdHJ1Y3QgdjRsMl9od19mcmVxX3NlZWspCisjZGVmaW5lCVZJRElPQ19FTlVNX0RWX1BSRVNFVFMJX0lPV1IoJ1YnLCA4Mywgc3RydWN0IHY0bDJfZHZfZW51bV9wcmVzZXQpCisjZGVmaW5lCVZJRElPQ19TX0RWX1BSRVNFVAlfSU9XUignVicsIDg0LCBzdHJ1Y3QgdjRsMl9kdl9wcmVzZXQpCisjZGVmaW5lCVZJRElPQ19HX0RWX1BSRVNFVAlfSU9XUignVicsIDg1LCBzdHJ1Y3QgdjRsMl9kdl9wcmVzZXQpCisjZGVmaW5lCVZJRElPQ19RVUVSWV9EVl9QUkVTRVQJX0lPUignVicsICA4Niwgc3RydWN0IHY0bDJfZHZfcHJlc2V0KQorI2RlZmluZQlWSURJT0NfU19EVl9USU1JTkdTCV9JT1dSKCdWJywgODcsIHN0cnVjdCB2NGwyX2R2X3RpbWluZ3MpCisjZGVmaW5lCVZJRElPQ19HX0RWX1RJTUlOR1MJX0lPV1IoJ1YnLCA4OCwgc3RydWN0IHY0bDJfZHZfdGltaW5ncykKKyNkZWZpbmUJVklESU9DX0RRRVZFTlQJCSBfSU9SKCdWJywgODksIHN0cnVjdCB2NGwyX2V2ZW50KQorI2RlZmluZQlWSURJT0NfU1VCU0NSSUJFX0VWRU5UCSBfSU9XKCdWJywgOTAsIHN0cnVjdCB2NGwyX2V2ZW50X3N1YnNjcmlwdGlvbikKKyNkZWZpbmUJVklESU9DX1VOU1VCU0NSSUJFX0VWRU5UIF9JT1coJ1YnLCA5MSwgc3RydWN0IHY0bDJfZXZlbnRfc3Vic2NyaXB0aW9uKQorCisvKiBSZW1pbmRlcjogd2hlbiBhZGRpbmcgbmV3IGlvY3RscyBwbGVhc2UgYWRkIHN1cHBvcnQgZm9yIHRoZW0gdG8KKyAgIGRyaXZlcnMvbWVkaWEvdmlkZW8vdjRsMi1jb21wYXQtaW9jdGwzMi5jIGFzIHdlbGwhICovCisKKyNkZWZpbmUgQkFTRV9WSURJT0NfUFJJVkFURQkxOTIJCS8qIDE5Mi0yNTUgYXJlIHByaXZhdGUgKi8KKworI2VuZGlmIC8qIF9fTElOVVhfVklERU9ERVYyX0ggKi8KZGlmZiAtLWdpdCBhL2V4eW5vczQvaGFsL2luY2x1ZGUvdmlkZW9kZXYyX3NhbXN1bmcuaCBiL2V4eW5vczQvaGFsL2luY2x1ZGUvdmlkZW9kZXYyX3NhbXN1bmcuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40MWY4MzM4Ci0tLSAvZGV2L251bGwKKysrIGIvZXh5bm9zNC9oYWwvaW5jbHVkZS92aWRlb2RldjJfc2Ftc3VuZy5oCkBAIC0wLDAgKzEsMTExNSBAQAorLyoKKyAqIFZpZGVvIGZvciBMaW51eCBUd28gaGVhZGVyIGZpbGUgZm9yIHNhbXN1bmcKKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMDksIERvbmdzb28gTmF0aGFuaWVsIEtpbTxkb25nc29vNDUua2ltQHNhbXN1bmcuY29tPgorICoKKyAqIFRoaXMgaGVhZGVyIGZpbGUgY29udGFpbnMgc2V2ZXJhbCB2NGwyIEFQSXMgdG8gYmUgcHJvcG9zZWQgdG8gdjRsMgorICogY29tbXVuaXR5IGFuZCB1bnRpbCBiZWluIGFjY2VwdGVkLCB3aWxsIGJlIHVzZWQgcmVzdHJpY3RseSBpbiBTYW1zdW5nJ3MKKyAqIGNhbWVyYSBpbnRlcmZhY2UgZHJpdmVyIEZJTUMuCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBBbHRlcm5hdGl2ZWx5LCBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2lmbmRlZiBfX0xJTlVYX1ZJREVPREVWMl9TQU1TVU5HX0gKKyNkZWZpbmUgX19MSU5VWF9WSURFT0RFVjJfU0FNU1VOR19ICisKKy8qIFZhbHVlcyBmb3IgJ2NhcGFiaWxpdGllcycgZmllbGQgKi8KKy8qIE9iamVjdCBkZXRlY3Rpb24gZGV2aWNlICovCisjZGVmaW5lIFY0TDJfQ0FQX09CSl9SRUNPR05JVElPTiAgICAweDEwMDAwMDAwCisvKiBzdHJvYmUgY29udHJvbCAqLworI2RlZmluZSBWNEwyX0NBUF9TVFJPQkUgICAgICAgICAweDIwMDAwMDAwCisKKyNkZWZpbmUgVjRMMl9DSURfRk9DVVNfTU9ERSAgICAgKFY0TDJfQ0lEX0NBTUVSQV9DTEFTU19CQVNFKzE3KQorLyogRm9jdXMgTWV0aG9kcyAqLworZW51bSB2NGwyX2ZvY3VzX21vZGUgeworICAgIFY0TDJfRk9DVVNfTU9ERV9BVVRPICAgICAgICA9IDAsCisgICAgVjRMMl9GT0NVU19NT0RFX01BQ1JPICAgICAgID0gMSwKKyAgICBWNEwyX0ZPQ1VTX01PREVfTUFOVUFMICAgICAgPSAyLAorICAgIFY0TDJfRk9DVVNfTU9ERV9MQVNUUCAgICAgICA9IDIsCit9OworCisjZGVmaW5lIFY0TDJfQ0lEX1pPT01fTU9ERSAgICAgIChWNEwyX0NJRF9DQU1FUkFfQ0xBU1NfQkFTRSsxOCkKKy8qIFpvb20gTWV0aG9kcyAqLworZW51bSB2NGwyX3pvb21fbW9kZSB7CisgICAgVjRMMl9aT09NX01PREVfQ09OVElOVU9VUyAgID0gMCwKKyAgICBWNEwyX1pPT01fTU9ERV9PUFRJQ0FMICAgICAgPSAxLAorICAgIFY0TDJfWk9PTV9NT0RFX0RJR0lUQUwgICAgICA9IDIsCisgICAgVjRMMl9aT09NX01PREVfTEFTVFAgICAgICAgID0gMiwKK307CisKKy8qIEV4cG9zdXJlIE1ldGhvZHMgKi8KKyNkZWZpbmUgVjRMMl9DSURfUEhPVE9NRVRSWSAgICAgKFY0TDJfQ0lEX0NBTUVSQV9DTEFTU19CQVNFKzE5KQorZW51bSB2NGwyX3Bob3RvbWV0cnlfbW9kZSB7CisgICAgVjRMMl9QSE9UT01FVFJZX01VTFRJU0VHICAgID0gMCwgLypNdWx0aSBTZWdtZW50Ki8KKyAgICBWNEwyX1BIT1RPTUVUUllfQ1dBICAgICA9IDEsIC8qQ2VudHJlIFdlaWdodGVkIEF2ZXJhZ2UqLworICAgIFY0TDJfUEhPVE9NRVRSWV9TUE9UICAgICAgICA9IDIsCisgICAgVjRMMl9QSE9UT01FVFJZX0FGU1BPVCAgICAgID0gMywgLypTcG90IG1ldGVyaW5nIG9uIGZvY3VzZWQgcG9pbnQqLworICAgIFY0TDJfUEhPVE9NRVRSWV9MQVNUUCAgICAgICA9IFY0TDJfUEhPVE9NRVRSWV9BRlNQT1QsCit9OworCisvKiBNYW51YWwgZXhwb3N1cmUgY29udHJvbCBpdGVtcyBtZW51IHR5cGU6IGlyaXMsIHNodXR0ZXIsIGlzbyAqLworI2RlZmluZSBWNEwyX0NJRF9DQU1fQVBFUlRVUkUgICAoVjRMMl9DSURfQ0FNRVJBX0NMQVNTX0JBU0UrMjApCisjZGVmaW5lIFY0TDJfQ0lEX0NBTV9TSFVUVEVSICAgIChWNEwyX0NJRF9DQU1FUkFfQ0xBU1NfQkFTRSsyMSkKKyNkZWZpbmUgVjRMMl9DSURfQ0FNX0lTTyAgICAoVjRMMl9DSURfQ0FNRVJBX0NMQVNTX0JBU0UrMjIpCisKKy8qIEZvbGxvd2luZyBDSURzIGFyZSBtZW51IHR5cGUgKi8KKyNkZWZpbmUgVjRMMl9DSURfU0NFTkVNT0RFICAoVjRMMl9DSURfQ0FNRVJBX0NMQVNTX0JBU0UrMjMpCisjZGVmaW5lIFY0TDJfQ0lEX0NBTV9TVEFCSUxJWkUgIChWNEwyX0NJRF9DQU1FUkFfQ0xBU1NfQkFTRSsyNCkKKyNkZWZpbmUgVjRMMl9DSURfQ0FNX01VTFRJU0hPVCAgKFY0TDJfQ0lEX0NBTUVSQV9DTEFTU19CQVNFKzI1KQorCisvKiBDb250cm9sIGR5bmFtaWMgcmFuZ2UgKi8KKyNkZWZpbmUgVjRMMl9DSURfQ0FNX0RSICAgICAoVjRMMl9DSURfQ0FNRVJBX0NMQVNTX0JBU0UrMjYpCisKKy8qIFdoaXRlIGJhbGFuY2UgcHJlc2V0IGNvbnRyb2wgKi8KKyNkZWZpbmUgVjRMMl9DSURfV0hJVEVfQkFMQU5DRV9QUkVTRVQgICAoVjRMMl9DSURfQ0FNRVJBX0NMQVNTX0JBU0UrMjcpCisKKy8qIENJRCBleHRlbnNpb25zICovCisjZGVmaW5lIFY0TDJfQ0lEX1JPVEFUSU9OICAgICAgIChWNEwyX0NJRF9QUklWQVRFX0JBU0UgKyAwKQorI2RlZmluZSBWNEwyX0NJRF9QQUREUl9ZICAgICAgICAoVjRMMl9DSURfUFJJVkFURV9CQVNFICsgMSkKKyNkZWZpbmUgVjRMMl9DSURfUEFERFJfQ0IgICAgICAgKFY0TDJfQ0lEX1BSSVZBVEVfQkFTRSArIDIpCisjZGVmaW5lIFY0TDJfQ0lEX1BBRERSX0NSICAgICAgIChWNEwyX0NJRF9QUklWQVRFX0JBU0UgKyAzKQorI2RlZmluZSBWNEwyX0NJRF9QQUREUl9DQkNSICAgICAoVjRMMl9DSURfUFJJVkFURV9CQVNFICsgNCkKKyNkZWZpbmUgVjRMMl9DSURfT1ZFUkxBWV9BVVRPICAgICAgIChWNEwyX0NJRF9QUklWQVRFX0JBU0UgKyA1KQorI2RlZmluZSBWNEwyX0NJRF9PVkVSTEFZX1ZBRERSMCAgICAgKFY0TDJfQ0lEX1BSSVZBVEVfQkFTRSArIDYpCisjZGVmaW5lIFY0TDJfQ0lEX09WRVJMQVlfVkFERFIxICAgICAoVjRMMl9DSURfUFJJVkFURV9CQVNFICsgNykKKyNkZWZpbmUgVjRMMl9DSURfT1ZFUkxBWV9WQUREUjIgICAgIChWNEwyX0NJRF9QUklWQVRFX0JBU0UgKyA4KQorI2RlZmluZSBWNEwyX0NJRF9PVkxZX01PREUgICAgICAoVjRMMl9DSURfUFJJVkFURV9CQVNFICsgOSkKKyNkZWZpbmUgVjRMMl9DSURfRFNUX0lORk8gICAgICAgKFY0TDJfQ0lEX1BSSVZBVEVfQkFTRSArIDEwKQorLyogVU1QIHNlY3VyZSBpZCBjb250cm9sICovCisjZGVmaW5lIFY0TDJfQ0lEX0dFVF9VTVBfU0VDVVJFX0lEICAoVjRMMl9DSURfUFJJVkFURV9CQVNFICsgMTEpCisjZGVmaW5lIFY0TDJfQ0lEX0lNQUdFX0VGRkVDVF9GTiAgICAoVjRMMl9DSURfUFJJVkFURV9CQVNFICsgMTYpCisjZGVmaW5lIFY0TDJfQ0lEX0lNQUdFX0VGRkVDVF9BUFBMWSAoVjRMMl9DSURfUFJJVkFURV9CQVNFICsgMTcpCisjZGVmaW5lIFY0TDJfQ0lEX0lNQUdFX0VGRkVDVF9DQiAgICAoVjRMMl9DSURfUFJJVkFURV9CQVNFICsgMTgpCisjZGVmaW5lIFY0TDJfQ0lEX0lNQUdFX0VGRkVDVF9DUiAgICAoVjRMMl9DSURfUFJJVkFURV9CQVNFICsgMTkpCisjZGVmaW5lIFY0TDJfQ0lEX1JFU0VSVkVEX01FTV9CQVNFX0FERFIgKFY0TDJfQ0lEX1BSSVZBVEVfQkFTRSArIDIwKQorI2RlZmluZSBWNEwyX0NJRF9GSU1DX1ZFUlNJT04gICAgICAgKFY0TDJfQ0lEX1BSSVZBVEVfQkFTRSArIDIxKQorCisjZGVmaW5lIFY0TDJfQ0lEX1NUUkVBTV9QQVVTRSAgICAgICAgICAgKFY0TDJfQ0lEX1BSSVZBVEVfQkFTRSArIDUzKQorCisvKiBDSUQgRXh0ZW5zaW9ucyBmb3IgY2FtZXJhIHNlbnNvciBvcGVyYXRpb25zICovCisjZGVmaW5lIFY0TDJfQ0lEX0NBTV9QUkVWSUVXX09OT0ZGICAgICAgKFY0TDJfQ0lEX1BSSVZBVEVfQkFTRSArIDY0KQorI2RlZmluZSBWNEwyX0NJRF9DQU1fQ0FQVFVSRSAgICAgICAgICAgIChWNEwyX0NJRF9QUklWQVRFX0JBU0UgKyA2NSkKKyNkZWZpbmUgVjRMMl9DSURfQ0FNX0pQRUdfTUVNU0laRSAgICAgICAoVjRMMl9DSURfUFJJVkFURV9CQVNFICsgNjYpCisKKyNkZWZpbmUgVjRMMl9DSURfQ0FNX0RBVEVfSU5GT19ZRUFSICAgICAgICAgICAgIChWNEwyX0NJRF9QUklWQVRFX0JBU0UgKyAxNCkKKyNkZWZpbmUgVjRMMl9DSURfQ0FNX0RBVEVfSU5GT19NT05USCAgICAgICAgICAgIChWNEwyX0NJRF9QUklWQVRFX0JBU0UgKyAxNSkKKyNkZWZpbmUgVjRMMl9DSURfQ0FNX0RBVEVfSU5GT19EQVRFICAgICAgICAgICAgIChWNEwyX0NJRF9QUklWQVRFX0JBU0UgKyAyMikKKyNkZWZpbmUgVjRMMl9DSURfQ0FNX1NFTlNPUl9WRVIgICAgICAgICAgICAgICAgIChWNEwyX0NJRF9QUklWQVRFX0JBU0UgKyAyMykKKyNkZWZpbmUgVjRMMl9DSURfQ0FNX0ZXX01JTk9SX1ZFUiAgICAgICAgICAgICAgIChWNEwyX0NJRF9QUklWQVRFX0JBU0UgKyAyNCkKKyNkZWZpbmUgVjRMMl9DSURfQ0FNX0ZXX01BSk9SX1ZFUiAgICAgICAgICAgICAgIChWNEwyX0NJRF9QUklWQVRFX0JBU0UgKyAyNSkKKyNkZWZpbmUgVjRMMl9DSURfQ0FNX1BSTV9NSU5PUl9WRVIgICAgICAgICAgICAgIChWNEwyX0NJRF9QUklWQVRFX0JBU0UgKyAyNikKKyNkZWZpbmUgVjRMMl9DSURfQ0FNX1BSTV9NQUpPUl9WRVIgICAgICAgICAgICAgIChWNEwyX0NJRF9QUklWQVRFX0JBU0UgKyAyNykKKyNkZWZpbmUgVjRMMl9DSURfQ0FNX0ZXX1ZFUiAgICAgICAgICAgICAgICAgICAgIChWNEwyX0NJRF9QUklWQVRFX0JBU0UgKyAyOCkKKyNkZWZpbmUgVjRMMl9DSURfQ0FNX1NFVF9GV19BRERSICAgICAgICAgICAgICAgIChWNEwyX0NJRF9QUklWQVRFX0JBU0UgKyAyOSkKKyNkZWZpbmUgVjRMMl9DSURfQ0FNX1NFVF9GV19TSVpFICAgICAgICAgICAgICAgIChWNEwyX0NJRF9QUklWQVRFX0JBU0UgKyAzMCkKKyNkZWZpbmUgVjRMMl9DSURfQ0FNX1VQREFURV9GVyAgKFY0TDJfQ0lEX1BSSVZBVEVfQkFTRSArIDMxKQorI2RlZmluZSBWNEwyX0NJRF9DQU1fSlBFR19NQUlOX1NJWkUgICAgIChWNEwyX0NJRF9QUklWQVRFX0JBU0UgKyAzMikKKyNkZWZpbmUgVjRMMl9DSURfQ0FNX0pQRUdfTUFJTl9PRkZTRVQgICAgICAgKFY0TDJfQ0lEX1BSSVZBVEVfQkFTRSArIDMzKQorI2RlZmluZSBWNEwyX0NJRF9DQU1fSlBFR19USFVNQl9TSVpFICAgICAgICAoVjRMMl9DSURfUFJJVkFURV9CQVNFICsgMzQpCisjZGVmaW5lIFY0TDJfQ0lEX0NBTV9KUEVHX1RIVU1CX09GRlNFVCAgICAgIChWNEwyX0NJRF9QUklWQVRFX0JBU0UgKyAzNSkKKyNkZWZpbmUgVjRMMl9DSURfQ0FNX0pQRUdfUE9TVFZJRVdfT0ZGU0VUICAgKFY0TDJfQ0lEX1BSSVZBVEVfQkFTRSArIDM2KQorI2RlZmluZSBWNEwyX0NJRF9DQU1fSlBFR19RVUFMSVRZICAgKFY0TDJfQ0lEX1BSSVZBVEVfQkFTRSArIDM3KQorI2RlZmluZSBWNEwyX0NJRF9DQU1fU0VOU09SX01BS0VSICAgKFY0TDJfQ0lEX1BSSVZBVEVfQkFTRSArIDM4KQorI2RlZmluZSBWNEwyX0NJRF9DQU1fU0VOU09SX09QVElDQUwgKFY0TDJfQ0lEX1BSSVZBVEVfQkFTRSArIDM5KQorI2RlZmluZSBWNEwyX0NJRF9DQU1fQUZfVkVSX0xPVyAgICAgKFY0TDJfQ0lEX1BSSVZBVEVfQkFTRSArIDQwKQorI2RlZmluZSBWNEwyX0NJRF9DQU1fQUZfVkVSX0hJR0ggICAgKFY0TDJfQ0lEX1BSSVZBVEVfQkFTRSArIDQxKQorI2RlZmluZSBWNEwyX0NJRF9DQU1fR0FNTUFfUkdfTE9XICAgKFY0TDJfQ0lEX1BSSVZBVEVfQkFTRSArIDQyKQorI2RlZmluZSBWNEwyX0NJRF9DQU1fR0FNTUFfUkdfSElHSCAgKFY0TDJfQ0lEX1BSSVZBVEVfQkFTRSArIDQzKQorI2RlZmluZSBWNEwyX0NJRF9DQU1fR0FNTUFfQkdfTE9XICAgKFY0TDJfQ0lEX1BSSVZBVEVfQkFTRSArIDQ0KQorI2RlZmluZSBWNEwyX0NJRF9DQU1fR0FNTUFfQkdfSElHSCAgKFY0TDJfQ0lEX1BSSVZBVEVfQkFTRSArIDQ1KQorI2RlZmluZSBWNEwyX0NJRF9DQU1fRFVNUF9GVyAgICAgICAgKFY0TDJfQ0lEX1BSSVZBVEVfQkFTRSArIDQ2KQorI2RlZmluZSBWNEwyX0NJRF9DQU1fR0VUX0RVTVBfU0laRSAgKFY0TDJfQ0lEX1BSSVZBVEVfQkFTRSArIDQ3KQorI2RlZmluZSBWNEwyX0NJRF9DQU1FUkFfVlRfTU9ERSAgICAgICAgIChWNEwyX0NJRF9QUklWQVRFX0JBU0UgKyA0OCkKKyNkZWZpbmUgVjRMMl9DSURfQ0FNRVJBX1ZHQV9CTFVSICAgIChWNEwyX0NJRF9QUklWQVRFX0JBU0UgKyA0OSkKKyNkZWZpbmUgVjRMMl9DSURfQ0FNRVJBX0NBUFRVUkUgICAgIChWNEwyX0NJRF9QUklWQVRFX0JBU0UgKyA1MCkKKworI2RlZmluZSBWNEwyX0NJRF9NQUlOX1NXX0RBVEVfSU5GT19ZRUFSICAgICAoVjRMMl9DSURfUFJJVkFURV9CQVNFICsgNTQpCisjZGVmaW5lIFY0TDJfQ0lEX01BSU5fU1dfREFURV9JTkZPX01PTlRIICAgIChWNEwyX0NJRF9QUklWQVRFX0JBU0UgKyA1NSkKKyNkZWZpbmUgVjRMMl9DSURfTUFJTl9TV19EQVRFX0lORk9fREFURSAgICAgKFY0TDJfQ0lEX1BSSVZBVEVfQkFTRSArIDU2KQorI2RlZmluZSBWNEwyX0NJRF9NQUlOX1NXX0ZXX01JTk9SX1ZFUiAgICAgICAoVjRMMl9DSURfUFJJVkFURV9CQVNFICsgNTcpCisjZGVmaW5lIFY0TDJfQ0lEX01BSU5fU1dfRldfTUFKT1JfVkVSICAgICAgIChWNEwyX0NJRF9QUklWQVRFX0JBU0UgKyA1OCkKKyNkZWZpbmUgVjRMMl9DSURfTUFJTl9TV19QUk1fTUlOT1JfVkVSICAgICAgKFY0TDJfQ0lEX1BSSVZBVEVfQkFTRSArIDU5KQorI2RlZmluZSBWNEwyX0NJRF9NQUlOX1NXX1BSTV9NQUpPUl9WRVIgICAgICAoVjRMMl9DSURfUFJJVkFURV9CQVNFICsgNjApCisKKy8qIFNMSU0gSVMgY29udHJvbCAqLworI2RlZmluZSBWNEwyX0NJRF9GSU1DX0lTX0JBU0UgICAgICAgICAgICAgICAoVjRMMl9DVFJMX0NMQVNTX0NBTUVSQSB8IDB4MTAwMCkKKworI2RlZmluZSBWNEwyX0NJRF9JU19MT0FEX0ZXICAgICAgICAgICAgICAgICAoVjRMMl9DSURfRklNQ19JU19CQVNFICsgMTApCisjZGVmaW5lIFY0TDJfQ0lEX0lTX0lOSVRfUEFSQU0gICAgICAgICAgICAgIChWNEwyX0NJRF9GSU1DX0lTX0JBU0UgKyAxMSkKKyNkZWZpbmUgVjRMMl9DSURfSVNfUkVTRVRpICAgICAgICAgICAgICAgICAgKFY0TDJfQ0lEX0ZJTUNfSVNfQkFTRSArIDEyKQorI2RlZmluZSBWNEwyX0NJRF9JU19TX1BPV0VSICAgICAgICAgICAgICAgICAoVjRMMl9DSURfRklNQ19JU19CQVNFICsgMTMpCitlbnVtIGlzX3NldF9wb3dlciB7CisgICAgSVNfUE9XRVJfT0ZGLAorICAgIElTX1BPV0VSX09OCit9OworCisjZGVmaW5lIFY0TDJfQ0lEX0lTX1NfU1RSRUFNICAgICAgICAgICAgICAgIChWNEwyX0NJRF9GSU1DX0lTX0JBU0UgKyAxNCkKK2VudW0gaXNfc2V0X3N0cmVhbSB7CisgICAgSVNfRElTQUJMRV9TVFJFQU0sCisgICAgSVNfRU5BQkxFX1NUUkVBTQorfTsKKworI2RlZmluZSBWNEwyX0NJRF9JU19TX1NDRU5BUklPX01PREUgICAgICAgICAoVjRMMl9DSURfRklNQ19JU19CQVNFICsgMTUpCisjZGVmaW5lIFY0TDJfQ0lEX0lTX1NfRk9STUFUX1NDRU5BUklPICAgICAgIChWNEwyX0NJRF9GSU1DX0lTX0JBU0UgKyAxNikKK2VudW0gc2NlbmFyaW9fbW9kZSB7CisgICAgSVNfTU9ERV9QUkVWSUVXX1NUSUxMLAorICAgIElTX01PREVfUFJFVklFV19WSURFTywKKyAgICBJU19NT0RFX0NBUFRVUkVfU1RJTEwsCisgICAgSVNfTU9ERV9DQVBUVVJFX1ZJREVPLAorICAgIElTX01PREVfTUFYCit9OworCisvKiBnbG9iYWwgKi8KKyNkZWZpbmUgVjRMMl9DSURfSVNfQ0FNRVJBX1NIT1RfTU9ERV9OT1JNQUwgICAgICAoVjRMMl9DSURfRklNQ19JU19CQVNFICsgMTAxKQorLyogdmFsdWUgOiAxIDogc2luZ2xlIHNob3QgLCA+PTIgOiBjb250aW51b3VzIHNob3QgKi8KKworI2RlZmluZSBWNEwyX0NJRF9JU19DQU1FUkFfU0VOU09SX05VTSAgICAgICAoVjRMMl9DSURfRklNQ19JU19CQVNFICsgMjAxKQorCisjZGVmaW5lIFY0TDJfQ0lEX0lTX0NBTUVSQV9GT0NVU19NT0RFICAgICAgIChWNEwyX0NJRF9GSU1DX0lTX0JBU0UgKyA0MDEpCitlbnVtIGlzX2ZvY3VzX21vZGUgeworICAgIElTX0ZPQ1VTX01PREVfQVVUTywKKyAgICBJU19GT0NVU19NT0RFX01BQ1JPLAorICAgIElTX0ZPQ1VTX01PREVfSU5GSU5JVFksCisgICAgSVNfRk9DVVNfTU9ERV9DT05USU5VT1VTLAorICAgIElTX0ZPQ1VTX01PREVfVE9VQ0gsCisgICAgSVNfRk9DVVNfTU9ERV9GQUNFREVURUNULAorICAgIElTX0ZPQ1VTX01PREVfTUFYLAorfTsKKworI2RlZmluZSBWNEwyX0NJRF9JU19DQU1FUkFfRkxBU0hfTU9ERSAgICAgICAgKFY0TDJfQ0lEX0ZJTUNfSVNfQkFTRSArIDQwMikKK2VudW0gaXNfZmxhc2hfbW9kZSB7CisgICAgSVNfRkxBU0hfTU9ERV9PRkYsCisgICAgSVNfRkxBU0hfTU9ERV9BVVRPLAorICAgIElTX0ZMQVNIX01PREVfQVVUT19SRURFWUUsCisgICAgSVNfRkxBU0hfTU9ERV9PTiwKKyAgICBJU19GTEFTSF9NT0RFX1RPUkNILAorICAgIElTX0ZMQVNIX01PREVfTUFYCit9OworCisjZGVmaW5lIFY0TDJfQ0lEX0lTX0NBTUVSQV9BV0JfTU9ERSAgICAgICAgKFY0TDJfQ0lEX0ZJTUNfSVNfQkFTRSArIDQwMykKK2VudW0gaXNfYXdiX21vZGUgeworICAgIElTX0FXQl9BVVRPLAorICAgIElTX0FXQl9EQVlMSUdIVCwKKyAgICBJU19BV0JfQ0xPVURZLAorICAgIElTX0FXQl9UVU5HU1RFTiwKKyAgICBJU19BV0JfRkxVT1JFU0NFTlQsCisgICAgSVNfQVdCX01BWAorfTsKKworI2RlZmluZSBWNEwyX0NJRF9JU19DQU1FUkFfSU1BR0VfRUZGRUNUICAgICAgICAoVjRMMl9DSURfRklNQ19JU19CQVNFICsgNDA0KQorZW51bSBpc19pbWFnZV9lZmZlY3QgeworICAgIElTX0lNQUdFX0VGRkVDVF9ESVNBQkxFLAorICAgIElTX0lNQUdFX0VGRkVDVF9NT05PQ0hST01FLAorICAgIElTX0lNQUdFX0VGRkVDVF9ORUdBVElWRV9NT05PLAorICAgIElTX0lNQUdFX0VGRkVDVF9ORUdBVElWRV9DT0xPUiwKKyAgICBJU19JTUFHRV9FRkZFQ1RfU0VQSUEsCisgICAgSVNfSU1BR0VfRUZGRUNUX1NFUElBX0NCLAorICAgIElTX0lNQUdFX0VGRkVDVF9TRVBJQV9DUiwKKyAgICBJU19JTUFHRV9FRkZFQ1RfTkVHQVRJVkUsCisgICAgSVNfSU1BR0VfRUZGRUNUX0FSVEZSRUVaRSwKKyAgICBJU19JTUFHRV9FRkZFQ1RfRU1CT1NTSU5HLAorICAgIElTX0lNQUdFX0VGRkVDVF9TSUxIT1VFVFRFLAorICAgIElTX0lNQUdFX0VGRkVDVF9NQVgKK307CisKKyNkZWZpbmUgVjRMMl9DSURfSVNfQ0FNRVJBX0lTTyAgICAgICAgICAgIChWNEwyX0NJRF9GSU1DX0lTX0JBU0UgKyA0MDUpCitlbnVtIGlzX2lzbyB7CisgICAgSVNfSVNPX0FVVE8sCisgICAgSVNfSVNPXzUwLAorICAgIElTX0lTT18xMDAsCisgICAgSVNfSVNPXzIwMCwKKyAgICBJU19JU09fNDAwLAorICAgIElTX0lTT184MDAsCisgICAgSVNfSVNPXzE2MDAsCisgICAgSVNfSVNPX01BWAorfTsKKworI2RlZmluZSBWNEwyX0NJRF9JU19DQU1FUkFfQ09OVFJBU1QgICAgICAgIChWNEwyX0NJRF9GSU1DX0lTX0JBU0UgKyA0MDYpCitlbnVtIGlzX2NvbnRyYXN0IHsKKyAgICBJU19DT05UUkFTVF9BVVRPLAorICAgIElTX0NPTlRSQVNUX01JTlVTXzIsCisgICAgSVNfQ09OVFJBU1RfTUlOVVNfMSwKKyAgICBJU19DT05UUkFTVF9ERUZBVUxULAorICAgIElTX0NPTlRSQVNUX1BMVVNfMSwKKyAgICBJU19DT05UUkFTVF9QTFVTXzIsCisgICAgSVNfQ09OVFJBU1RfTUFYCit9OworCisjZGVmaW5lIFY0TDJfQ0lEX0lTX0NBTUVSQV9TQVRVUkFUSU9OICAgICAgICAoVjRMMl9DSURfRklNQ19JU19CQVNFICsgNDA3KQorZW51bSBpc19zYXR1cmF0aW9uIHsKKyAgICBJU19TQVRVUkFUSU9OX01JTlVTXzIsCisgICAgSVNfU0FUVVJBVElPTl9NSU5VU18xLAorICAgIElTX1NBVFVSQVRJT05fREVGQVVMVCwKKyAgICBJU19TQVRVUkFUSU9OX1BMVVNfMSwKKyAgICBJU19TQVRVUkFUSU9OX1BMVVNfMiwKKyAgICBJU19TQVRVUkFUSU9OX01BWAorfTsKKworI2RlZmluZSBWNEwyX0NJRF9JU19DQU1FUkFfU0hBUlBORVNTICAgICAgICAoVjRMMl9DSURfRklNQ19JU19CQVNFICsgNDA4KQorZW51bSBpc19zaGFycG5lc3MgeworICAgIElTX1NIQVJQTkVTU19NSU5VU18yLAorICAgIElTX1NIQVJQTkVTU19NSU5VU18xLAorICAgIElTX1NIQVJQTkVTU19ERUZBVUxULAorICAgIElTX1NIQVJQTkVTU19QTFVTXzEsCisgICAgSVNfU0hBUlBORVNTX1BMVVNfMiwKKyAgICBJU19TSEFSUE5FU1NfTUFYCit9OworCisjZGVmaW5lIFY0TDJfQ0lEX0lTX0NBTUVSQV9FWFBPU1VSRSAgICAgICAgKFY0TDJfQ0lEX0ZJTUNfSVNfQkFTRSArIDQwOSkKK2VudW0gaXNfZXhwb3N1cmUgeworICAgIElTX0VYUE9TVVJFX01JTlVTXzQsCisgICAgSVNfRVhQT1NVUkVfTUlOVVNfMywKKyAgICBJU19FWFBPU1VSRV9NSU5VU18yLAorICAgIElTX0VYUE9TVVJFX01JTlVTXzEsCisgICAgSVNfRVhQT1NVUkVfREVGQVVMVCwKKyAgICBJU19FWFBPU1VSRV9QTFVTXzEsCisgICAgSVNfRVhQT1NVUkVfUExVU18yLAorICAgIElTX0VYUE9TVVJFX1BMVVNfMywKKyAgICBJU19FWFBPU1VSRV9QTFVTXzQsCisgICAgSVNfRVhQT1NVUkVfTUFYCit9OworCisjZGVmaW5lIFY0TDJfQ0lEX0lTX0NBTUVSQV9CUklHSFRORVNTICAgICAgICAoVjRMMl9DSURfRklNQ19JU19CQVNFICsgNDEwKQorZW51bSBpc19icmlnaHRuZXNzIHsKKyAgICBJU19CUklHSFRORVNTX01JTlVTXzIsCisgICAgSVNfQlJJR0hUTkVTU19NSU5VU18xLAorICAgIElTX0JSSUdIVE5FU1NfREVGQVVMVCwKKyAgICBJU19CUklHSFRORVNTX1BMVVNfMSwKKyAgICBJU19CUklHSFRORVNTX1BMVVNfMiwKKyAgICBJU19CUklHSFRORVNTX01BWAorfTsKKworI2RlZmluZSBWNEwyX0NJRF9JU19DQU1FUkFfSFVFICAgICAgICAgICAgKFY0TDJfQ0lEX0ZJTUNfSVNfQkFTRSArIDQxMSkKK2VudW0gaXNfaHVlIHsKKyAgICBJU19IVUVfTUlOVVNfMiwKKyAgICBJU19IVUVfTUlOVVNfMSwKKyAgICBJU19IVUVfREVGQVVMVCwKKyAgICBJU19IVUVfUExVU18xLAorICAgIElTX0hVRV9QTFVTXzIsCisgICAgSVNfSFVFX01BWAorfTsKKworI2RlZmluZSBWNEwyX0NJRF9JU19DQU1FUkFfTUVURVJJTkcgICAgICAgIChWNEwyX0NJRF9GSU1DX0lTX0JBU0UgKyA0MTIpCitlbnVtIGlzX21ldGVyaW5nIHsKKyAgICBJU19NRVRFUklOR19DRU5URVIsCisgICAgSVNfTUVURVJJTkdfU1BPVCwKKyAgICBJU19NRVRFUklOR19NQVRSSVgsCisgICAgSVNfTUVURVJJTkdfTUFYCit9OworI2RlZmluZSBWNEwyX0NJRF9JU19DQU1FUkFfTUVURVJJTkdfUE9TSVRJT05fWCAgKFY0TDJfQ0lEX0ZJTUNfSVNfQkFTRSArIDUwMCkKKyNkZWZpbmUgVjRMMl9DSURfSVNfQ0FNRVJBX01FVEVSSU5HX1BPU0lUSU9OX1kgIChWNEwyX0NJRF9GSU1DX0lTX0JBU0UgKyA1MDEpCisjZGVmaW5lIFY0TDJfQ0lEX0lTX0NBTUVSQV9NRVRFUklOR19XSU5ET1dfWCAgICAoVjRMMl9DSURfRklNQ19JU19CQVNFICsgNTAyKQorI2RlZmluZSBWNEwyX0NJRF9JU19DQU1FUkFfTUVURVJJTkdfV0lORE9XX1kgICAgKFY0TDJfQ0lEX0ZJTUNfSVNfQkFTRSArIDUwMykKKworI2RlZmluZSBWNEwyX0NJRF9JU19DQU1FUkFfQUZDX01PREUgICAgICAgIChWNEwyX0NJRF9GSU1DX0lTX0JBU0UgKyA0MTMpCitlbnVtIGlzX2FmY19tb2RlIHsKKyAgICBJU19BRkNfRElTQUJMRSwKKyAgICBJU19BRkNfQVVUTywKKyAgICBJU19BRkNfTUFOVUFMXzUwSFosCisgICAgSVNfQUZDX01BTlVBTF82MEhaLAorICAgIElTX0FGQ19NQVgKK307CisKKyNkZWZpbmUgVjRMMl9DSURfSVNfRkRfR0VUX0ZBQ0VfQ09VTlQgICAgICAgICAgICAgICAoVjRMMl9DSURfRklNQ19JU19CQVNFICsgNjAwKQorI2RlZmluZSBWNEwyX0NJRF9JU19GRF9HRVRfRkFDRV9GUkFNRV9OVU1CRVIgICAgICAgIChWNEwyX0NJRF9GSU1DX0lTX0JBU0UgKyA2MDEpCisjZGVmaW5lIFY0TDJfQ0lEX0lTX0ZEX0dFVF9GQUNFX0NPTkZJREVOQ0UgICAgICAgICAgKFY0TDJfQ0lEX0ZJTUNfSVNfQkFTRSArIDYwMikKKyNkZWZpbmUgVjRMMl9DSURfSVNfRkRfR0VUX0ZBQ0VfU01JTEVfTEVWRUwgICAgICAgICAoVjRMMl9DSURfRklNQ19JU19CQVNFICsgNjAzKQorI2RlZmluZSBWNEwyX0NJRF9JU19GRF9HRVRfRkFDRV9CTElOS19MRVZFTCAgICAgICAgIChWNEwyX0NJRF9GSU1DX0lTX0JBU0UgKyA2MDQpCisjZGVmaW5lIFY0TDJfQ0lEX0lTX0ZEX0dFVF9GQUNFX1RPUExFRlRfWCAgICAgICAgICAgKFY0TDJfQ0lEX0ZJTUNfSVNfQkFTRSArIDYwNSkKKyNkZWZpbmUgVjRMMl9DSURfSVNfRkRfR0VUX0ZBQ0VfVE9QTEVGVF9ZICAgICAgICAgICAoVjRMMl9DSURfRklNQ19JU19CQVNFICsgNjA2KQorI2RlZmluZSBWNEwyX0NJRF9JU19GRF9HRVRfRkFDRV9CT1RUT01SSUdIVF9YICAgICAgIChWNEwyX0NJRF9GSU1DX0lTX0JBU0UgKyA2MDcpCisjZGVmaW5lIFY0TDJfQ0lEX0lTX0ZEX0dFVF9GQUNFX0JPVFRPTVJJR0hUX1kgICAgICAgKFY0TDJfQ0lEX0ZJTUNfSVNfQkFTRSArIDYwOCkKKyNkZWZpbmUgVjRMMl9DSURfSVNfRkRfR0VUX0xFRlRfRVlFX1RPUExFRlRfWCAgICAgICAoVjRMMl9DSURfRklNQ19JU19CQVNFICsgNjA5KQorI2RlZmluZSBWNEwyX0NJRF9JU19GRF9HRVRfTEVGVF9FWUVfVE9QTEVGVF9ZICAgICAgIChWNEwyX0NJRF9GSU1DX0lTX0JBU0UgKyA2MTApCisjZGVmaW5lIFY0TDJfQ0lEX0lTX0ZEX0dFVF9MRUZUX0VZRV9CT1RUT01SSUdIVF9YICAgKFY0TDJfQ0lEX0ZJTUNfSVNfQkFTRSArIDYxMSkKKyNkZWZpbmUgVjRMMl9DSURfSVNfRkRfR0VUX0xFRlRfRVlFX0JPVFRPTVJJR0hUX1kgICAoVjRMMl9DSURfRklNQ19JU19CQVNFICsgNjEyKQorI2RlZmluZSBWNEwyX0NJRF9JU19GRF9HRVRfUklHSFRfRVlFX1RPUExFRlRfWCAgICAgIChWNEwyX0NJRF9GSU1DX0lTX0JBU0UgKyA2MTMpCisjZGVmaW5lIFY0TDJfQ0lEX0lTX0ZEX0dFVF9SSUdIVF9FWUVfVE9QTEVGVF9ZICAgICAgKFY0TDJfQ0lEX0ZJTUNfSVNfQkFTRSArIDYxNCkKKyNkZWZpbmUgVjRMMl9DSURfSVNfRkRfR0VUX1JJR0hUX0VZRV9CT1RUT01SSUdIVF9YICAoVjRMMl9DSURfRklNQ19JU19CQVNFICsgNjE1KQorI2RlZmluZSBWNEwyX0NJRF9JU19GRF9HRVRfUklHSFRfRVlFX0JPVFRPTVJJR0hUX1kgIChWNEwyX0NJRF9GSU1DX0lTX0JBU0UgKyA2MTYpCisjZGVmaW5lIFY0TDJfQ0lEX0lTX0ZEX0dFVF9NT1VUSF9UT1BMRUZUX1ggICAgICAgICAgKFY0TDJfQ0lEX0ZJTUNfSVNfQkFTRSArIDYxNykKKyNkZWZpbmUgVjRMMl9DSURfSVNfRkRfR0VUX01PVVRIX1RPUExFRlRfWSAgICAgICAgICAoVjRMMl9DSURfRklNQ19JU19CQVNFICsgNjE4KQorI2RlZmluZSBWNEwyX0NJRF9JU19GRF9HRVRfTU9VVEhfQk9UVE9NUklHSFRfWCAgICAgIChWNEwyX0NJRF9GSU1DX0lTX0JBU0UgKyA2MTkpCisjZGVmaW5lIFY0TDJfQ0lEX0lTX0ZEX0dFVF9NT1VUSF9CT1RUT01SSUdIVF9ZICAgICAgKFY0TDJfQ0lEX0ZJTUNfSVNfQkFTRSArIDYyMCkKKyNkZWZpbmUgVjRMMl9DSURfSVNfRkRfR0VUX0FOR0xFICAgICAgICAgICAgICAgICAgICAoVjRMMl9DSURfRklNQ19JU19CQVNFICsgNjIxKQorI2RlZmluZSBWNEwyX0NJRF9JU19GRF9HRVRfTkVYVCAgICAgICAgICAgICAgICAgICAgIChWNEwyX0NJRF9GSU1DX0lTX0JBU0UgKyA2MjIpCisjZGVmaW5lIFY0TDJfQ0lEX0lTX0ZEX0dFVF9EQVRBICAgICAgICAgICAgICAgICAgICAgKFY0TDJfQ0lEX0ZJTUNfSVNfQkFTRSArIDYyMykKKworI2RlZmluZSBWNEwyX0NJRF9JU19GRF9TRVRfTUFYX0ZBQ0VfTlVNQkVSICAgICAgICAgIChWNEwyX0NJRF9GSU1DX0lTX0JBU0UgKyA2NTApCisjZGVmaW5lIFY0TDJfQ0lEX0lTX0ZEX1NFVF9ST0xMX0FOR0xFICAgICAgICAgICAgICAgKFY0TDJfQ0lEX0ZJTUNfSVNfQkFTRSArIDY1MSkKK2VudW0gaXNfZmRfcm9sbF9hbmdsZSB7CisgICAgLyogMCwgNDUsIDAsIC00NSAqLworICAgIElTX0ZEX1JPTExfQU5HTEVfQkFTSUMgPSAwLAorICAgIC8qIDAsIDMwLCAwLCAtMzAsIDAsIDQ1LCAwLCAtNDUgKi8KKyAgICBJU19GRF9ST0xMX0FOR0xFX1BSRUNJU0VfQkFTSUMgPSAxLAorICAgIC8qIDAsIDkwLCAwLCAtOTAgKi8KKyAgICBJU19GRF9ST0xMX0FOR0xFX1NJREVTID0gMiwKKyAgICAvKiAwLCA5MCwgMCwgLTkwIDAsIDQ1LCAwLCAtNDUgKi8KKyAgICBJU19GRF9ST0xMX0FOR0xFX1BSRUNJU0VfU0lERVMgPSAzLAorICAgIC8qIDAsIDkwLCAwLCAtOTAsIDAsIDE4MCAqLworICAgIElTX0ZEX1JPTExfQU5HTEVfRlVMTCA9IDQsCisgICAgLyogMCwgOTAsIDAsIC05MCwgMCwgMTgwLCAwLCAxMzUsIDAsIC0xMzUgKi8KKyAgICBJU19GRF9ST0xMX0FOR0xFX1BSRUNJU0VfRlVMTCA9IDUsCit9OworCisjZGVmaW5lIFY0TDJfQ0lEX0lTX0ZEX1NFVF9ZQVdfQU5HTEUgICAgICAgICAgICAoVjRMMl9DSURfRklNQ19JU19CQVNFICsgNjUyKQorZW51bSBpc19mZF95YXdfYW5nbGUgeworICAgIElTX0ZEX1lBV19BTkdMRV8wICAgID0gMCwKKyAgICBJU19GRF9ZQVdfQU5HTEVfNDUgICAgPSAxLAorICAgIElTX0ZEX1lBV19BTkdMRV85MCAgICA9IDIsCisgICAgSVNfRkRfWUFXX0FOR0xFXzQ1XzkwICAgID0gMywKK307CisKKyNkZWZpbmUgVjRMMl9DSURfSVNfRkRfU0VUX1NNSUxFX01PREUgICAgICAgICAgIChWNEwyX0NJRF9GSU1DX0lTX0JBU0UgKyA2NTMpCitlbnVtIGlzX2ZkX3NtaWxlX21vZGUgeworICAgIElTX0ZEX1NNSUxFX01PREVfRElTQUJMRSAgICA9IDAsCisgICAgSVNfRkRfU01JTEVfTU9ERV9FTkFCTEUgICAgICAgID0gMSwKK307CisKKyNkZWZpbmUgVjRMMl9DSURfSVNfRkRfU0VUX0JMSU5LX01PREUgICAgICAgICAgIChWNEwyX0NJRF9GSU1DX0lTX0JBU0UgKyA2NTQpCitlbnVtIGlzX2ZkX2JsaW5rX21vZGUgeworICAgIElTX0ZEX0JMSU5LX01PREVfRElTQUJMRSAgICA9IDAsCisgICAgSVNfRkRfQkxJTktfTU9ERV9FTkFCTEUgICAgICAgID0gMSwKK307CisKKyNkZWZpbmUgVjRMMl9DSURfSVNfRkRfU0VUX0VZRV9ERVRFQ1RfTU9ERSAgICAgIChWNEwyX0NJRF9GSU1DX0lTX0JBU0UgKyA2NTUpCitlbnVtIGlzX2ZkX2V5ZV9kZXRlY3RfbW9kZSB7CisgICAgSVNfRkRfRVlFX0RFVEVDVF9ESVNBQkxFICAgID0gMCwKKyAgICBJU19GRF9FWUVfREVURUNUX0VOQUJMRSAgICAgICAgPSAxLAorfTsKKworI2RlZmluZSBWNEwyX0NJRF9JU19GRF9TRVRfTU9VVEhfREVURUNUX01PREUgICAgKFY0TDJfQ0lEX0ZJTUNfSVNfQkFTRSArIDY1NikKK2VudW0gaXNfZmRfbW91dGhfZGV0ZWN0X21vZGUgeworICAgIElTX0ZEX01PVVRIX0RFVEVDVF9ESVNBQkxFICAgID0gMCwKKyAgICBJU19GRF9NT1VUSF9ERVRFQ1RfRU5BQkxFICAgID0gMSwKK307CisKKyNkZWZpbmUgVjRMMl9DSURfSVNfRkRfU0VUX09SSUVOVEFUSU9OX01PREUgICAgIChWNEwyX0NJRF9GSU1DX0lTX0JBU0UgKyA2NTcpCitlbnVtIGlzX2ZkX29yaWVudGF0aW9uX21vZGUgeworICAgIElTX0ZEX09SSUVOVEFUSU9OX0RJU0FCTEUgICAgPSAwLAorICAgIElTX0ZEX09SSUVOVEFUSU9OX0VOQUJMRSAgICA9IDEsCit9OworCisjZGVmaW5lIFY0TDJfQ0lEX0lTX0ZEX1NFVF9PUklFTlRBVElPTiAgICAgICAgICAoVjRMMl9DSURfRklNQ19JU19CQVNFICsgNjU4KQorI2RlZmluZSBWNEwyX0NJRF9JU19GRF9TRVRfREFUQV9BRERSRVNTICAgICAgICAgKFY0TDJfQ0lEX0ZJTUNfSVNfQkFTRSArIDY1OSkKKworI2RlZmluZSBWNEwyX0NJRF9JU19TRVRfSVNQICAgICAgICAgICAgKFY0TDJfQ0lEX0ZJTUNfSVNfQkFTRSArIDQ0MCkKK2VudW0gaXNfaXNwX2J5cGFzc19tb2RlIHsKKyAgICBJU19JU1BfQllQQVNTX0RJU0FCTEUsCisgICAgSVNfSVNQX0JZUEFTU19FTkFCTEUsCisgICAgSVNfSVNQX0JZUEFTU19NQVgKK307CisKKyNkZWZpbmUgVjRMMl9DSURfSVNfU0VUX0RSQyAgICAgICAgICAgIChWNEwyX0NJRF9GSU1DX0lTX0JBU0UgKyA0NDEpCitlbnVtIGlzX2RyY19ieXBhc3NfbW9kZSB7CisgICAgSVNfRFJDX0JZUEFTU19ESVNBQkxFLAorICAgIElTX0RSQ19CWVBBU1NfRU5BQkxFLAorICAgIElTX0RSQ19CWVBBU1NfTUFYCit9OworCisjZGVmaW5lIFY0TDJfQ0lEX0lTX1NFVF9GRCAgICAgICAgICAgIChWNEwyX0NJRF9GSU1DX0lTX0JBU0UgKyA0NDIpCitlbnVtIGlzX2ZkX2J5cGFzc19tb2RlIHsKKyAgICBJU19GRF9CWVBBU1NfRElTQUJMRSwKKyAgICBJU19GRF9CWVBBU1NfRU5BQkxFLAorICAgIElTX0ZEX0JZUEFTU19NQVgKK307CisKKyNkZWZpbmUgVjRMMl9DSURfSVNfU0VUX09EQyAgICAgICAgICAgIChWNEwyX0NJRF9GSU1DX0lTX0JBU0UgKyA0NDMpCitlbnVtIGlzX29kY19ieXBhc3NfbW9kZSB7CisgICAgSVNfT0RDX0JZUEFTU19ESVNBQkxFLAorICAgIElTX09EQ19CWVBBU1NfRU5BQkxFLAorICAgIElTX09EQ19CWVBBU1NfTUFYCit9OworCisjZGVmaW5lIFY0TDJfQ0lEX0lTX1NFVF9ESVMgICAgICAgICAgICAoVjRMMl9DSURfRklNQ19JU19CQVNFICsgNDQ0KQorZW51bSBpc19kaXNfYnlwYXNzX21vZGUgeworICAgIElTX0RJU19CWVBBU1NfRElTQUJMRSwKKyAgICBJU19ESVNfQllQQVNTX0VOQUJMRSwKKyAgICBJU19ESVNfQllQQVNTX01BWAorfTsKKworI2RlZmluZSBWNEwyX0NJRF9JU19TRVRfM0ROUiAgICAgICAgICAgIChWNEwyX0NJRF9GSU1DX0lTX0JBU0UgKyA0NDUpCitlbnVtIGlzX3RkbnJfYnlwYXNzX21vZGUgeworICAgIElTX1RETlJfQllQQVNTX0RJU0FCTEUsCisgICAgSVNfVEROUl9CWVBBU1NfRU5BQkxFLAorICAgIElTX1RETlJfQllQQVNTX01BWAorfTsKKworI2RlZmluZSBWNEwyX0NJRF9JU19TRVRfU0NBTEVSQyAgICAgICAgICAgIChWNEwyX0NJRF9GSU1DX0lTX0JBU0UgKyA0NDYpCitlbnVtIGlzX3NjYWxlcmNfYnlwYXNzX21vZGUgeworICAgIElTX1NDQUxFUkNfQllQQVNTX0RJU0FCTEUsCisgICAgSVNfU0NBTEVSQ19CWVBBU1NfRU5BQkxFLAorICAgIElTX1NDQUxFUkNfQllQQVNTX01BWAorfTsKKworI2RlZmluZSBWNEwyX0NJRF9JU19TRVRfU0NBTEVSUCAgICAgICAgICAgIChWNEwyX0NJRF9GSU1DX0lTX0JBU0UgKyA0NDYpCitlbnVtIGlzX3NjYWxlcnBfYnlwYXNzX21vZGUgeworICAgIElTX1NDQUxFUlBfQllQQVNTX0RJU0FCTEUsCisgICAgSVNfU0NBTEVSUF9CWVBBU1NfRU5BQkxFLAorICAgIElTX1NDQUxFUlBfQllQQVNTX01BWAorfTsKKworI2RlZmluZSBWNEwyX0NJRF9JU19ST1RBVElPTl9NT0RFICAgICAgICAoVjRMMl9DSURfRklNQ19JU19CQVNFICsgNDUwKQorZW51bSBpc19yb3RhdGlvbl9tb2RlIHsKKyAgICBJU19ST1RBVElPTl8wLAorICAgIElTX1JPVEFUSU9OXzkwLAorICAgIElTX1JPVEFUSU9OXzE4MCwKKyAgICBJU19ST1RBVElPTl8yNzAsCisgICAgSVNfUk9UQVRJT05fTUFYCit9OworCisjZGVmaW5lIFY0TDJfQ0lEX0lTXzNETlJfMVNUX0ZSQU1FX01PREUgICAgICAgIChWNEwyX0NJRF9GSU1DX0lTX0JBU0UgKyA0NTEpCitlbnVtIGlzX3RkbnJfMXN0X2ZyYW1lX21vZGUgeworICAgIElTX1RETlJfMVNUX0ZSQU1FX05PUFJPQ0VTU0lORywKKyAgICBJU19URE5SXzFTVF9GUkFNRV8yRE5SLAorICAgIElTX1RETlJfTUFYCit9OworCisjZGVmaW5lIFY0TDJfQ0lEX0lTX0NBTUVSQV9PQkpFQ1RfUE9TSVRJT05fWCAgICAoVjRMMl9DSURfRklNQ19JU19CQVNFICsgNDUyKQorI2RlZmluZSBWNEwyX0NJRF9JU19DQU1FUkFfT0JKRUNUX1BPU0lUSU9OX1kgICAgKFY0TDJfQ0lEX0ZJTUNfSVNfQkFTRSArIDQ1MykKKyNkZWZpbmUgVjRMMl9DSURfSVNfQ0FNRVJBX1dJTkRPV19TSVpFX1ggICAgICAgIChWNEwyX0NJRF9GSU1DX0lTX0JBU0UgKyA0NTQpCisjZGVmaW5lIFY0TDJfQ0lEX0lTX0NBTUVSQV9XSU5ET1dfU0laRV9ZICAgICAgICAoVjRMMl9DSURfRklNQ19JU19CQVNFICsgNDU1KQorCisjZGVmaW5lIFY0TDJfQ0lEX0lTX0NBTUVSQV9FWElGX0VYUFRJTUUgICAgICAgICAoVjRMMl9DSURfRklNQ19JU19CQVNFICsgNDU2KQorI2RlZmluZSBWNEwyX0NJRF9JU19DQU1FUkFfRVhJRl9GTEFTSCAgICAgICAgICAgKFY0TDJfQ0lEX0ZJTUNfSVNfQkFTRSArIDQ1NykKKyNkZWZpbmUgVjRMMl9DSURfSVNfQ0FNRVJBX0VYSUZfSVNPICAgICAgICAgICAgIChWNEwyX0NJRF9GSU1DX0lTX0JBU0UgKyA0NTgpCisjZGVmaW5lIFY0TDJfQ0lEX0lTX0NBTUVSQV9FWElGX1NIVVRURVJTUEVFRCAgICAoVjRMMl9DSURfRklNQ19JU19CQVNFICsgNDU5KQorI2RlZmluZSBWNEwyX0NJRF9JU19DQU1FUkFfRVhJRl9CUklHSFRORVNTICAgICAgKFY0TDJfQ0lEX0ZJTUNfSVNfQkFTRSArIDQ2MCkKKworI2RlZmluZSBWNEwyX0NJRF9JU19DQU1FUkFfSVNQX1NFTF9JTlBVVCAgICAgICAgKFY0TDJfQ0lEX0ZJTUNfSVNfQkFTRSArIDQ2MSkKK2VudW0gaXNfaXNwX3NlbF9pbnB1dCB7CisgICAgSVNfSVNQX0lOUFVUX09URiwKKyAgICBJU19JU1BfSU5QVVRfRE1BMSwKKyAgICBJU19JU1BfSU5QVVRfRE1BMiwKKyAgICBJU19JU1BfSU5QVVRfRE1BMTIsCisgICAgSVNfSVNQX0lOUFVUX01BWAorfTsKKworI2RlZmluZSBWNEwyX0NJRF9JU19DQU1FUkFfSVNQX1NFTF9PVVRQVVQgICAgKFY0TDJfQ0lEX0ZJTUNfSVNfQkFTRSArIDQ2MikKK2VudW0gaXNfaXNwX3NlbF9vdXRwdXQgeworICAgIElTX0lTUF9PVVRQVVRfT1RGLAorICAgIElTX0lTUF9PVVRQVVRfRE1BMSwKKyAgICBJU19JU1BfT1VUUFVUX0RNQTIsCisgICAgSVNfSVNQX09VVFBVVF9ETUExMiwKKyAgICBJU19JU1BfT1VUUFVUX09URl9ETUExLAorICAgIElTX0lTUF9PVVRQVVRfT1RGX0RNQTIsCisgICAgSVNfSVNQX09VVFBVVF9PVEZfRE1BMTIsCisgICAgSVNfSVNQX09VVFBVVF9NQVgKK307CisKKyNkZWZpbmUgVjRMMl9DSURfSVNfQ0FNRVJBX0RSQ19TRUxfSU5QVVQgICAgKFY0TDJfQ0lEX0ZJTUNfSVNfQkFTRSArIDQ2MykKK2VudW0gaXNfZHJjX3NlbF9pbnB1dCB7CisgICAgSVNfRFJDX0lOUFVUX09URiwKKyAgICBJU19EUkNfSU5QVVRfRE1BLAorICAgIElTX0RSQ19JTlBVVF9NQVgKK307CisKKyNkZWZpbmUgVjRMMl9DSURfSVNfQ0FNRVJBX0ZEX1NFTF9JTlBVVCAgICAgICAgKFY0TDJfQ0lEX0ZJTUNfSVNfQkFTRSArIDQ2NCkKK2VudW0gaXNfZmRfc2VsX2lucHV0IHsKKyAgICBJU19GRF9JTlBVVF9PVEYsCisgICAgSVNfRkRfSU5QVVRfRE1BLAorICAgIElTX0ZEX0lOUFVUX01BWAorfTsKKworI2RlZmluZSBWNEwyX0NJRF9JU19DQU1FUkFfSU5JVF9XSURUSCAgICAgICAgKFY0TDJfQ0lEX0ZJTUNfSVNfQkFTRSArIDQ2NSkKKyNkZWZpbmUgVjRMMl9DSURfSVNfQ0FNRVJBX0lOSVRfSEVJR0hUICAgICAgIChWNEwyX0NJRF9GSU1DX0lTX0JBU0UgKyA0NjYpCisKKyNkZWZpbmUgVjRMMl9DSURfSVNfQ01EX0lTUCAgICAgICAgICAgIChWNEwyX0NJRF9GSU1DX0lTX0JBU0UgKyA0NjcpCitlbnVtIGlzX2lzcF9jbWRfbW9kZSB7CisgICAgSVNfSVNQX0NPTU1BTkRfU1RPUCwKKyAgICBJU19JU1BfQ09NTUFORF9TVEFSVCwKKyAgICBJU19JU1BfQ09NTUFORF9NQVgKK307CisKKyNkZWZpbmUgVjRMMl9DSURfSVNfQ01EX0RSQyAgICAgICAgICAgIChWNEwyX0NJRF9GSU1DX0lTX0JBU0UgKyA0NjgpCitlbnVtIGlzX2RyY19jbWRfbW9kZSB7CisgICAgSVNfRFJDX0NPTU1BTkRfU1RPUCwKKyAgICBJU19EUkNfQ09NTUFORF9TVEFSVCwKKyAgICBJU19EUkNfQ09NTUFORF9NQVgKK307CisKKyNkZWZpbmUgVjRMMl9DSURfSVNfQ01EX0ZEICAgICAgICAgICAgKFY0TDJfQ0lEX0ZJTUNfSVNfQkFTRSArIDQ2OSkKK2VudW0gaXNfZmRfY21kX21vZGUgeworICAgIElTX0ZEX0NPTU1BTkRfU1RPUCwKKyAgICBJU19GRF9DT01NQU5EX1NUQVJULAorICAgIElTX0ZEX0NPTU1BTkRfTUFYCit9OworCisjZGVmaW5lIFY0TDJfQ0lEX0lTX0NNRF9PREMgICAgICAgICAgICAoVjRMMl9DSURfRklNQ19JU19CQVNFICsgNDcwKQorZW51bSBpc19vZGNfY21kX21vZGUgeworICAgIElTX09EQ19DT01NQU5EX1NUT1AsCisgICAgSVNfT0RDX0NPTU1BTkRfU1RBUlQsCisgICAgSVNfT0RDX0NPTU1BTkRfTUFYCit9OworCisjZGVmaW5lIFY0TDJfQ0lEX0lTX0NNRF9ESVMgICAgICAgICAgICAoVjRMMl9DSURfRklNQ19JU19CQVNFICsgNDcxKQorZW51bSBpc19kaXNfY21kX21vZGUgeworICAgIElTX0RJU19DT01NQU5EX1NUT1AsCisgICAgSVNfRElTX0NPTU1BTkRfU1RBUlQsCisgICAgSVNfRElTX0NPTU1BTkRfTUFYCit9OworCisjZGVmaW5lIFY0TDJfQ0lEX0lTX0NNRF9URE5SICAgICAgICAgICAoVjRMMl9DSURfRklNQ19JU19CQVNFICsgNDcyKQorZW51bSBpc190ZG5yX2NtZF9tb2RlIHsKKyAgICBJU19URE5SX0NPTU1BTkRfU1RPUCwKKyAgICBJU19URE5SX0NPTU1BTkRfU1RBUlQsCisgICAgSVNfVEROUl9DT01NQU5EX01BWAorfTsKKworI2RlZmluZSBWNEwyX0NJRF9JU19DTURfU0NBTEVSQyAgICAgICAgKFY0TDJfQ0lEX0ZJTUNfSVNfQkFTRSArIDQ3MykKK2VudW0gaXNfc2NhbGVyY19jbWRfbW9kZSB7CisgICAgSVNfU0NBTEVSQ19DT01NQU5EX1NUT1AsCisgICAgSVNfU0NBTEVSQ19DT01NQU5EX1NUQVJULAorICAgIElTX1NDQUxFUkNfQ09NTUFORF9NQVgKK307CisKKyNkZWZpbmUgVjRMMl9DSURfSVNfQ01EX1NDQUxFUlAgICAgICAgIChWNEwyX0NJRF9GSU1DX0lTX0JBU0UgKyA0NzQpCitlbnVtIGlzX3NjYWxlcnBfY21kX21vZGUgeworICAgIElTX1NDQUxFUlBfQ09NTUFORF9TVE9QLAorICAgIElTX1NDQUxFUlBfQ09NTUFORF9TVEFSVCwKKyAgICBJU19TQ0FMRVJQX0NPTU1BTkRfTUFYCit9OworCisjZGVmaW5lIFY0TDJfQ0lEX0lTX0dFVF9TRU5TT1JfT0ZGU0VUX1ggICAgICAgIChWNEwyX0NJRF9GSU1DX0lTX0JBU0UgKyA0ODApCisjZGVmaW5lIFY0TDJfQ0lEX0lTX0dFVF9TRU5TT1JfT0ZGU0VUX1kgICAgICAgIChWNEwyX0NJRF9GSU1DX0lTX0JBU0UgKyA0ODEpCisjZGVmaW5lIFY0TDJfQ0lEX0lTX0dFVF9TRU5TT1JfV0lEVEggICAgICAgICAgIChWNEwyX0NJRF9GSU1DX0lTX0JBU0UgKyA0ODIpCisjZGVmaW5lIFY0TDJfQ0lEX0lTX0dFVF9TRU5TT1JfSEVJR0hUICAgICAgICAgIChWNEwyX0NJRF9GSU1DX0lTX0JBU0UgKyA0ODMpCisKKyNkZWZpbmUgVjRMMl9DSURfSVNfR0VUX0ZSQU1FX1ZBTElEICAgICAgICAgICAgKFY0TDJfQ0lEX0ZJTUNfSVNfQkFTRSArIDQ4NCkKKyNkZWZpbmUgVjRMMl9DSURfSVNfU0VUX0ZSQU1FX1ZBTElEICAgICAgICAgICAgKFY0TDJfQ0lEX0ZJTUNfSVNfQkFTRSArIDQ4NSkKKyNkZWZpbmUgVjRMMl9DSURfSVNfR0VUX0ZSQU1FX0JBRE1BUksgICAgICAgICAgKFY0TDJfQ0lEX0ZJTUNfSVNfQkFTRSArIDQ4NikKKyNkZWZpbmUgVjRMMl9DSURfSVNfU0VUX0ZSQU1FX0JBRE1BUksgICAgICAgICAgKFY0TDJfQ0lEX0ZJTUNfSVNfQkFTRSArIDQ4NykKKyNkZWZpbmUgVjRMMl9DSURfSVNfR0VUX0ZSQU1FX0NBUFRVUkVEICAgICAgICAgKFY0TDJfQ0lEX0ZJTUNfSVNfQkFTRSArIDQ4OCkKKyNkZWZpbmUgVjRMMl9DSURfSVNfU0VUX0ZSQU1FX0NBUFRVUkVEICAgICAgICAgKFY0TDJfQ0lEX0ZJTUNfSVNfQkFTRSArIDQ4OSkKKyNkZWZpbmUgVjRMMl9DSURfSVNfU0VUX0ZSQU1FX05VTUJFUiAgICAgICAgICAgKFY0TDJfQ0lEX0ZJTUNfSVNfQkFTRSArIDQ5MCkKKyNkZWZpbmUgVjRMMl9DSURfSVNfR0VUX0ZSQU1FX05VTUJFUiAgICAgICAgICAgKFY0TDJfQ0lEX0ZJTUNfSVNfQkFTRSArIDQ5MSkKKyNkZWZpbmUgVjRMMl9DSURfSVNfQ0xFQVJfRlJBTUVfTlVNQkVSICAgICAgICAgKFY0TDJfQ0lEX0ZJTUNfSVNfQkFTRSArIDQ5MikKKyNkZWZpbmUgVjRMMl9DSURfSVNfR0VUX0xPU1RFRF9GUkFNRV9OVU1CRVIgICAgKFY0TDJfQ0lEX0ZJTUNfSVNfQkFTRSArIDQ5MykKKyNkZWZpbmUgVjRMMl9DSURfSVNfSVNQX0RNQV9CVUZGRVJfTlVNICAgICAgICAgKFY0TDJfQ0lEX0ZJTUNfSVNfQkFTRSArIDQ5NCkKKyNkZWZpbmUgVjRMMl9DSURfSVNfSVNQX0RNQV9CVUZGRVJfQUREUkVTUyAgICAgKFY0TDJfQ0lEX0ZJTUNfSVNfQkFTRSArIDQ5NSkKKworI2RlZmluZSBWNEwyX0NJRF9JU19aT09NX1NUQVRFICAgICAgICAgICAgICAgICAoVjRMMl9DSURfRklNQ19JU19CQVNFICsgNjYwKQorI2RlZmluZSBWNEwyX0NJRF9JU19aT09NX01BWF9MRVZFTCAgICAgICAgICAgICAoVjRMMl9DSURfRklNQ19JU19CQVNFICsgNjYxKQorI2RlZmluZSBWNEwyX0NJRF9JU19aT09NICAgICAgICAgICAgICAgICAgICAgICAoVjRMMl9DSURfRklNQ19JU19CQVNFICsgNjYyKQorI2RlZmluZSBWNEwyX0NJRF9JU19GV19ERUJVR19SRUdJT05fQUREUiAgICAgICAoVjRMMl9DSURfRklNQ19JU19CQVNFICsgNjYzKQorCitlbnVtIHY0bDJfYmx1ciB7CisgICAgQkxVUl9MRVZFTF8wID0gMCwKKyAgICBCTFVSX0xFVkVMXzEsCisgICAgQkxVUl9MRVZFTF8yLAorICAgIEJMVVJfTEVWRUxfMywKKyAgICBCTFVSX0xFVkVMX01BWCwKK307CisKKyNpZiAxCisjZGVmaW5lIFY0TDJfQ0lEX0NBTUVSQV9TQ0VORV9NT0RFICAgICAgKFY0TDJfQ0lEX1BSSVZBVEVfQkFTRSs3MCkKK2VudW0gdjRsMl9zY2VuZV9tb2RlIHsKKyAgICBTQ0VORV9NT0RFX0JBU0UsCisgICAgU0NFTkVfTU9ERV9OT05FLAorICAgIFNDRU5FX01PREVfUE9SVFJBSVQsCisgICAgU0NFTkVfTU9ERV9OSUdIVFNIT1QsCisgICAgU0NFTkVfTU9ERV9CQUNLX0xJR0hULAorICAgIFNDRU5FX01PREVfTEFORFNDQVBFLAorICAgIFNDRU5FX01PREVfU1BPUlRTLAorICAgIFNDRU5FX01PREVfUEFSVFlfSU5ET09SLAorICAgIFNDRU5FX01PREVfQkVBQ0hfU05PVywKKyAgICBTQ0VORV9NT0RFX1NVTlNFVCwKKyAgICBTQ0VORV9NT0RFX0RVU1RfREFXTiwKKyAgICBTQ0VORV9NT0RFX0ZBTExfQ09MT1IsCisgICAgU0NFTkVfTU9ERV9GSVJFV09SS1MsCisgICAgU0NFTkVfTU9ERV9URVhULAorICAgIFNDRU5FX01PREVfQ0FORExFX0xJR0hULAorICAgIFNDRU5FX01PREVfTUFYLAorfTsKKworI2RlZmluZSBWNEwyX0NJRF9DQU1FUkFfRkxBU0hfTU9ERSAgICAgIChWNEwyX0NJRF9QUklWQVRFX0JBU0UrNzEpCitlbnVtIHY0bDJfZmxhc2hfbW9kZSB7CisgICAgRkxBU0hfTU9ERV9CQVNFLAorICAgIEZMQVNIX01PREVfT0ZGLAorICAgIEZMQVNIX01PREVfQVVUTywKKyAgICBGTEFTSF9NT0RFX09OLAorICAgIEZMQVNIX01PREVfVE9SQ0gsCisgICAgRkxBU0hfTU9ERV9NQVgsCit9OworCisjZGVmaW5lIFY0TDJfQ0lEX0NBTUVSQV9CUklHSFRORVNTICAgICAgKFY0TDJfQ0lEX1BSSVZBVEVfQkFTRSs3MikKK2VudW0gdjRsMl9ldl9tb2RlIHsKKyAgICBFVl9NSU5VU180ICA9IC00LAorICAgIEVWX01JTlVTXzMgID0gLTMsCisgICAgRVZfTUlOVVNfMiAgPSAtMiwKKyAgICBFVl9NSU5VU18xICA9IC0xLAorICAgIEVWX0RFRkFVTFQgID0gMCwKKyAgICBFVl9QTFVTXzEgICA9IDEsCisgICAgRVZfUExVU18yICAgPSAyLAorICAgIEVWX1BMVVNfMyAgID0gMywKKyAgICBFVl9QTFVTXzQgICA9IDQsCisgICAgRVZfTUFYLAorfTsKKworI2RlZmluZSBWNEwyX0NJRF9DQU1FUkFfV0hJVEVfQkFMQU5DRSAgIChWNEwyX0NJRF9QUklWQVRFX0JBU0UrNzMpCitlbnVtIHY0bDJfd2JfbW9kZSB7CisgICAgV0hJVEVfQkFMQU5DRV9CQVNFID0gMCwKKyAgICBXSElURV9CQUxBTkNFX0FVVE8sCisgICAgV0hJVEVfQkFMQU5DRV9TVU5OWSwKKyAgICBXSElURV9CQUxBTkNFX0NMT1VEWSwKKyAgICBXSElURV9CQUxBTkNFX1RVTkdTVEVOLAorICAgIFdISVRFX0JBTEFOQ0VfRkxVT1JFU0NFTlQsCisgICAgV0hJVEVfQkFMQU5DRV9NQVgsCit9OworCisjZGVmaW5lIFY0TDJfQ0lEX0NBTUVSQV9FRkZFQ1QgICAgICAgICAgKFY0TDJfQ0lEX1BSSVZBVEVfQkFTRSs3NCkKK2VudW0gdjRsMl9lZmZlY3RfbW9kZSB7CisgICAgSU1BR0VfRUZGRUNUX0JBU0UgPSAwLAorICAgIElNQUdFX0VGRkVDVF9OT05FLAorICAgIElNQUdFX0VGRkVDVF9CTlcsCisgICAgSU1BR0VfRUZGRUNUX1NFUElBLAorICAgIElNQUdFX0VGRkVDVF9BUVVBLAorICAgIElNQUdFX0VGRkVDVF9BTlRJUVVFLAorICAgIElNQUdFX0VGRkVDVF9ORUdBVElWRSwKKyAgICBJTUFHRV9FRkZFQ1RfU0hBUlBFTiwKKyAgICBJTUFHRV9FRkZFQ1RfTUFYLAorfTsKKworI2RlZmluZSBWNEwyX0NJRF9DQU1FUkFfSVNPICAgICAgICAgICAgIChWNEwyX0NJRF9QUklWQVRFX0JBU0UrNzUpCitlbnVtIHY0bDJfaXNvX21vZGUgeworICAgIElTT19BVVRPID0gMCwKKyAgICBJU09fNTAsCisgICAgSVNPXzEwMCwKKyAgICBJU09fMjAwLAorICAgIElTT180MDAsCisgICAgSVNPXzgwMCwKKyAgICBJU09fMTYwMCwKKyAgICBJU09fU1BPUlRTLAorICAgIElTT19OSUdIVCwKKyAgICBJU09fTU9WSUUsCisgICAgSVNPX01BWCwKK307CisKKyNkZWZpbmUgVjRMMl9DSURfQ0FNRVJBX01FVEVSSU5HICAgICAgICAgICAgKFY0TDJfQ0lEX1BSSVZBVEVfQkFTRSs3NikKK2VudW0gdjRsMl9tZXRlcmluZ19tb2RlIHsKKyAgICBNRVRFUklOR19CQVNFID0gMCwKKyAgICBNRVRFUklOR19NQVRSSVgsCisgICAgTUVURVJJTkdfQ0VOVEVSLAorICAgIE1FVEVSSU5HX1NQT1QsCisgICAgTUVURVJJTkdfTUFYLAorfTsKKworI2RlZmluZSBWNEwyX0NJRF9DQU1FUkFfQ09OVFJBU1QgICAgICAgICAgICAoVjRMMl9DSURfUFJJVkFURV9CQVNFKzc3KQorZW51bSB2NGwyX2NvbnRyYXN0X21vZGUgeworICAgIENPTlRSQVNUX01JTlVTXzIgPSAwLAorICAgIENPTlRSQVNUX01JTlVTXzEsCisgICAgQ09OVFJBU1RfREVGQVVMVCwKKyAgICBDT05UUkFTVF9QTFVTXzEsCisgICAgQ09OVFJBU1RfUExVU18yLAorICAgIENPTlRSQVNUX01BWCwKK307CisKKyNkZWZpbmUgVjRMMl9DSURfQ0FNRVJBX1NBVFVSQVRJT04gICAgICAoVjRMMl9DSURfUFJJVkFURV9CQVNFKzc4KQorZW51bSB2NGwyX3NhdHVyYXRpb25fbW9kZSB7CisgICAgU0FUVVJBVElPTl9NSU5VU18yID0gMCwKKyAgICBTQVRVUkFUSU9OX01JTlVTXzEsCisgICAgU0FUVVJBVElPTl9ERUZBVUxULAorICAgIFNBVFVSQVRJT05fUExVU18xLAorICAgIFNBVFVSQVRJT05fUExVU18yLAorICAgIFNBVFVSQVRJT05fTUFYLAorfTsKKworI2RlZmluZSBWNEwyX0NJRF9DQU1FUkFfU0hBUlBORVNTICAgICAgIChWNEwyX0NJRF9QUklWQVRFX0JBU0UrNzkpCitlbnVtIHY0bDJfc2hhcnBuZXNzX21vZGUgeworICAgIFNIQVJQTkVTU19NSU5VU18yID0gMCwKKyAgICBTSEFSUE5FU1NfTUlOVVNfMSwKKyAgICBTSEFSUE5FU1NfREVGQVVMVCwKKyAgICBTSEFSUE5FU1NfUExVU18xLAorICAgIFNIQVJQTkVTU19QTFVTXzIsCisgICAgU0hBUlBORVNTX01BWCwKK307CisKKyNkZWZpbmUgVjRMMl9DSURfQ0FNRVJBX1dEUiAgICAgICAgICAgICAoVjRMMl9DSURfUFJJVkFURV9CQVNFKzgwKQorZW51bSB2NGwyX3dkcl9tb2RlIHsKKyAgICBXRFJfT0ZGLAorICAgIFdEUl9PTiwKKyAgICBXRFJfTUFYLAorfTsKKworI2RlZmluZSBWNEwyX0NJRF9DQU1FUkFfQU5USV9TSEFLRSAgICAgIChWNEwyX0NJRF9QUklWQVRFX0JBU0UrODEpCitlbnVtIHY0bDJfYW50aV9zaGFrZV9tb2RlIHsKKyAgICBBTlRJX1NIQUtFX09GRiwKKyAgICBBTlRJX1NIQUtFX1NUSUxMX09OLAorICAgIEFOVElfU0hBS0VfTU9WSUVfT04sCisgICAgQU5USV9TSEFLRV9NQVgsCit9OworCisjZGVmaW5lIFY0TDJfQ0lEX0NBTUVSQV9UT1VDSF9BRl9TVEFSVF9TVE9QICAgICAoVjRMMl9DSURfUFJJVkFURV9CQVNFKzgyKQorZW51bSB2NGwyX3RvdWNoX2FmIHsKKyAgICBUT1VDSF9BRl9TVE9QID0gMCwKKyAgICBUT1VDSF9BRl9TVEFSVCwKKyAgICBUT1VDSF9BRl9NQVgsCit9OworCisjZGVmaW5lIFY0TDJfQ0lEX0NBTUVSQV9TTUFSVF9BVVRPICAgICAgKFY0TDJfQ0lEX1BSSVZBVEVfQkFTRSs4MykKK2VudW0gdjRsMl9zbWFydF9hdXRvIHsKKyAgICBTTUFSVF9BVVRPX09GRiA9IDAsCisgICAgU01BUlRfQVVUT19PTiwKKyAgICBTTUFSVF9BVVRPX01BWCwKK307CisKKyNkZWZpbmUgVjRMMl9DSURfQ0FNRVJBX1ZJTlRBR0VfTU9ERSAgICAgICAgKFY0TDJfQ0lEX1BSSVZBVEVfQkFTRSs4NCkKK2VudW0gdjRsMl92aW50YWdlX21vZGUgeworICAgIFZJTlRBR0VfTU9ERV9CQVNFLAorICAgIFZJTlRBR0VfTU9ERV9PRkYsCisgICAgVklOVEFHRV9NT0RFX05PUk1BTCwKKyAgICBWSU5UQUdFX01PREVfV0FSTSwKKyAgICBWSU5UQUdFX01PREVfQ09PTCwKKyAgICBWSU5UQUdFX01PREVfQk5XLAorICAgIFZJTlRBR0VfTU9ERV9NQVgsCit9OworCisjZGVmaW5lIFY0TDJfQ0lEX0NBTUVSQV9KUEVHX1FVQUxJVFkgICAgICAgIChWNEwyX0NJRF9QUklWQVRFX0JBU0UrODUpCisjZGVmaW5lIFY0TDJfQ0lEX0NBTUVSQV9HUFNfTEFUSVRVREUgICAgICAgIChWNEwyX0NJRF9DQU1FUkFfQ0xBU1NfQkFTRSArIDMwKS8vKFY0TDJfQ0lEX1BSSVZBVEVfQkFTRSs4NikKKyNkZWZpbmUgVjRMMl9DSURfQ0FNRVJBX0dQU19MT05HSVRVREUgICAoVjRMMl9DSURfQ0FNRVJBX0NMQVNTX0JBU0UgKyAzMSkvLyhWNEwyX0NJRF9QUklWQVRFX0JBU0UrODcpCisjZGVmaW5lIFY0TDJfQ0lEX0NBTUVSQV9HUFNfVElNRVNUQU1QICAgKFY0TDJfQ0lEX0NBTUVSQV9DTEFTU19CQVNFICsgMzIpLy8oVjRMMl9DSURfUFJJVkFURV9CQVNFKzg4KQorI2RlZmluZSBWNEwyX0NJRF9DQU1FUkFfR1BTX0FMVElUVURFICAgICAgICAoVjRMMl9DSURfQ0FNRVJBX0NMQVNTX0JBU0UgKyAzMykvLyhWNEwyX0NJRF9QUklWQVRFX0JBU0UrODkpCisjZGVmaW5lIFY0TDJfQ0lEX0NBTUVSQV9FWElGX1RJTUVfSU5GTyAgKFY0TDJfQ0lEX0NBTUVSQV9DTEFTU19CQVNFICsgMzQpCisjZGVmaW5lIFY0TDJfQ0lEX0NBTUVSQV9HUFNfUFJPQ0VTU0lOR01FVEhPRCAgICAgICAgICAgICAgICAgICAgIChWNEwyX0NJRF9DQU1FUkFfQ0xBU1NfQkFTRSszNSkKKyNkZWZpbmUgVjRMMl9DSURfQ0FNRVJBX1pPT00gICAgICAgICAgICAgICAgKFY0TDJfQ0lEX1BSSVZBVEVfQkFTRSs5MCkKK2VudW0gdjRsMl96b29tX2xldmVsIHsKKyAgICBaT09NX0xFVkVMXzAgPSAwLAorICAgIFpPT01fTEVWRUxfMSwKKyAgICBaT09NX0xFVkVMXzIsCisgICAgWk9PTV9MRVZFTF8zLAorICAgIFpPT01fTEVWRUxfNCwKKyAgICBaT09NX0xFVkVMXzUsCisgICAgWk9PTV9MRVZFTF82LAorICAgIFpPT01fTEVWRUxfNywKKyAgICBaT09NX0xFVkVMXzgsCisgICAgWk9PTV9MRVZFTF85LAorICAgIFpPT01fTEVWRUxfMTAsCisgICAgWk9PTV9MRVZFTF8xMSwKKyAgICBaT09NX0xFVkVMXzEyLAorICAgIFpPT01fTEVWRUxfTUFYID0gMzEsCit9OworCisjZGVmaW5lIFY0TDJfQ0lEX0NBTUVSQV9GQUNFX0RFVEVDVElPTiAgICAgIChWNEwyX0NJRF9QUklWQVRFX0JBU0UrOTEpCitlbnVtIHY0bDJfZmFjZV9kZXRlY3Rpb24geworICAgIEZBQ0VfREVURUNUSU9OX09GRiA9IDAsCisgICAgRkFDRV9ERVRFQ1RJT05fT04sCisgICAgRkFDRV9ERVRFQ1RJT05fTk9MSU5FLAorICAgIEZBQ0VfREVURUNUSU9OX09OX0JFQVVUWSwKKyAgICBGQUNFX0RFVEVDVElPTl9NQVgsCit9OworCisjZGVmaW5lIFY0TDJfQ0lEX0NBTUVSQV9TTUFSVF9BVVRPX1NUQVRVUyAgICAgICAoVjRMMl9DSURfUFJJVkFURV9CQVNFKzkyKQorZW51bSB2NGwyX3NtYXJ0X2F1dG9fc3RhdHVzIHsKKyAgICBTTUFSVF9BVVRPX1NUQVRVU19BVVRPID0gMCwKKyAgICBTTUFSVF9BVVRPX1NUQVRVU19MQU5EU0NBUEUsCisgICAgU01BUlRfQVVUT19TVEFUVVNfUE9SVFJBSVQsCisgICAgU01BUlRfQVVUT19TVEFUVVNfTUFDUk8sCisgICAgU01BUlRfQVVUT19TVEFUVVNfTklHSFQsCisgICAgU01BUlRfQVVUT19TVEFUVVNfUE9SVFJBSVRfTklHSFQsCisgICAgU01BUlRfQVVUT19TVEFUVVNfQkFDS0xJVCwKKyAgICBTTUFSVF9BVVRPX1NUQVRVU19QT1JUUkFJVF9CQUNLTElULAorICAgIFNNQVJUX0FVVE9fU1RBVFVTX0FOVElTSEFLRSwKKyAgICBTTUFSVF9BVVRPX1NUQVRVU19QT1JUUkFJVF9BTlRJU0hBS0UsCisgICAgU01BUlRfQVVUT19TVEFUVVNfTUFYLAorfTsKKworI2RlZmluZSBWNEwyX0NJRF9DQU1FUkFfU0VUX0FVVE9fRk9DVVMgICAgICAoVjRMMl9DSURfUFJJVkFURV9CQVNFKzkzKQorZW51bSB2NGwyX2F1dG9fZm9jdXMgeworICAgIEFVVE9fRk9DVVNfT0ZGID0gMCwKKyAgICBBVVRPX0ZPQ1VTX09OLAorICAgIEFVVE9fRk9DVVNfTUFYLAorfTsKKworI2RlZmluZSBWNEwyX0NJRF9DQU1FUkFfQkVBVVRZX1NIT1QgICAgIChWNEwyX0NJRF9QUklWQVRFX0JBU0UrOTQpCitlbnVtIHY0bDJfYmVhdXR5X3Nob3QgeworICAgIEJFQVVUWV9TSE9UX09GRiA9IDAsCisgICAgQkVBVVRZX1NIT1RfT04sCisgICAgQkVBVVRZX1NIT1RfTUFYLAorfTsKKworI2RlZmluZSBWNEwyX0NJRF9DQU1FUkFfQUVBV0JfTE9DS19VTkxPQ0sgICAgICAgKFY0TDJfQ0lEX1BSSVZBVEVfQkFTRSs5NSkKK2VudW0gdjRsMl9hZV9hd2JfbG9ja3VubG9jayB7CisgICAgQUVfVU5MT0NLX0FXQl9VTkxPQ0sgPSAwLAorICAgIEFFX0xPQ0tfQVdCX1VOTE9DSywKKyAgICBBRV9VTkxPQ0tfQVdCX0xPQ0ssCisgICAgQUVfTE9DS19BV0JfTE9DSywKKyAgICBBRV9BV0JfTUFYCit9OworCisjZGVmaW5lIFY0TDJfQ0lEX0NBTUVSQV9GQUNFREVURUNUX0xPQ0tVTkxPQ0sgICAoVjRMMl9DSURfUFJJVkFURV9CQVNFKzk2KQorZW51bSB2NGwyX2ZhY2VfbG9jayB7CisgICAgRkFDRV9MT0NLX09GRiA9IDAsCisgICAgRkFDRV9MT0NLX09OLAorICAgIEZJUlNUX0ZBQ0VfVFJBQ0tJTkcsCisgICAgRkFDRV9MT0NLX01BWCwKK307CisKKyNkZWZpbmUgVjRMMl9DSURfQ0FNRVJBX09CSkVDVF9QT1NJVElPTl9YICAgKFY0TDJfQ0lEX1BSSVZBVEVfQkFTRSs5NykKKyNkZWZpbmUgVjRMMl9DSURfQ0FNRVJBX09CSkVDVF9QT1NJVElPTl9ZICAgKFY0TDJfQ0lEX1BSSVZBVEVfQkFTRSs5OCkKKyNkZWZpbmUgVjRMMl9DSURfQ0FNRVJBX0ZPQ1VTX01PREUgICAgICAoVjRMMl9DSURfUFJJVkFURV9CQVNFKzk5KQorZW51bSB2NGwyX2ZvY3VzbW9kZSB7CisgICAgRk9DVVNfTU9ERV9BVVRPID0gMCwKKyAgICBGT0NVU19NT0RFX01BQ1JPLAorICAgIEZPQ1VTX01PREVfRkFDRURFVEVDVCwKKyAgICBGT0NVU19NT0RFX0lORklOSVRZLAorICAgIEZPQ1VTX01PREVfQ09OVElOT1VTLAorICAgIEZPQ1VTX01PREVfVE9VQ0gsCisgICAgRk9DVVNfTU9ERV9NQVgsCisgICAgRk9DVVNfTU9ERV9ERUZBVUxUID0gKDEgPDwgOCksCit9OworCisjZGVmaW5lIFY0TDJfQ0lEX0NBTUVSQV9PQkpfVFJBQ0tJTkdfU1RBVFVTIChWNEwyX0NJRF9QUklWQVRFX0JBU0UrMTAwKQorZW51bSB2NGwyX29ial90cmFja2luZ19zdGF0dXMgeworICAgIE9CSkVDVF9UUkFDS0lOR19TVEFUVVNfQkFTRSwKKyAgICBPQkpFQ1RfVFJBQ0tJTkdfU1RBVFVTX1BST0dSRVNTSU5HLAorICAgIE9CSkVDVF9UUkFDS0lOR19TVEFUVVNfU1VDQ0VTUywKKyAgICBPQkpFQ1RfVFJBQ0tJTkdfU1RBVFVTX0ZBSUwsCisgICAgT0JKRUNUX1RSQUNLSU5HX1NUQVRVU19NSVNTSU5HLAorICAgIE9CSkVDVF9UUkFDS0lOR19TVEFUVVNfTUFYLAorfTsKKworI2RlZmluZSBWNEwyX0NJRF9DQU1FUkFfT0JKX1RSQUNLSU5HX1NUQVJUX1NUT1AgKFY0TDJfQ0lEX1BSSVZBVEVfQkFTRSsxMDEpCitlbnVtIHY0bDJfb3Rfc3RhcnRfc3RvcCB7CisgICAgT1RfU1RPUCA9IDAsCisgICAgT1RfU1RBUlQsCisgICAgT1RfTUFYLAorfTsKKworI2RlZmluZSBWNEwyX0NJRF9DQU1FUkFfQ0FGX1NUQVJUX1NUT1AgIChWNEwyX0NJRF9QUklWQVRFX0JBU0UrMTAyKQorZW51bSB2NGwyX2NhZl9zdGFydF9zdG9wIHsKKyAgICBDQUZfU1RPUCA9IDAsCisgICAgQ0FGX1NUQVJULAorICAgIENBRl9NQVgsCit9OworCisjZGVmaW5lIFY0TDJfQ0lEX0NBTUVSQV9BVVRPX0ZPQ1VTX1JFU1VMVCAgICAgICAgICAgKFY0TDJfQ0lEX1BSSVZBVEVfQkFTRSsxMDMpCisjZGVmaW5lIFY0TDJfQ0lEX0NBTUVSQV9GUkFNRV9SQVRFICAgICAgICAgIChWNEwyX0NJRF9QUklWQVRFX0JBU0UrMTA0KQorZW51bSB2NGwyX2ZyYW1lX3JhdGUgeworICAgIEZSQU1FX1JBVEVfQVVUTyA9IDAsCisgICAgRlJBTUVfUkFURV83ID0gNywKKyAgICBGUkFNRV9SQVRFXzE1ID0gMTUsCisgICAgRlJBTUVfUkFURV8zMCA9IDMwLAorICAgIEZSQU1FX1JBVEVfNjAgPSA2MCwKKyAgICBGUkFNRV9SQVRFXzEyMCA9IDEyMCwKKyAgICBGUkFNRV9SQVRFX01BWAorfTsKKworI2RlZmluZSBWNEwyX0NJRF9DQU1FUkFfQU5USV9CQU5ESU5HICAgICAgICAgICAgICAgICAgICAoVjRMMl9DSURfUFJJVkFURV9CQVNFKzEwNSkKK2VudW0gdjRsMl9hbnRpX2JhbmRpbmcgeworICAgIEFOVElfQkFORElOR19BVVRPID0gMCwKKyAgICBBTlRJX0JBTkRJTkdfNTBIWiA9IDEsCisgICAgQU5USV9CQU5ESU5HXzYwSFogPSAyLAorICAgIEFOVElfQkFORElOR19PRkYgPSAzLAorfTsKKworI2RlZmluZSBWNEwyX0NJRF9DQU1FUkFfU0VUX0dBTU1BICAgKFY0TDJfQ0lEX1BSSVZBVEVfQkFTRSsxMDYpCitlbnVtIHY0bDJfZ2FtbWFfbW9kZSB7CisgICAgR0FNTUFfT0ZGID0gMCwKKyAgICBHQU1NQV9PTiA9IDEsCisgICAgR0FNTUFfTUFYLAorfTsKKworI2RlZmluZSBWNEwyX0NJRF9DQU1FUkFfU0VUX1NMT1dfQUUgKFY0TDJfQ0lEX1BSSVZBVEVfQkFTRSsxMDcpCitlbnVtIHY0bDJfc2xvd19hZV9tb2RlIHsKKyAgICBTTE9XX0FFX09GRiwKKyAgICBTTE9XX0FFX09OLAorICAgIFNMT1dfQUVfTUFYLAorfTsKKworI2RlZmluZSBWNEwyX0NJRF9DQU1FUkFfQkFUQ0hfUkVGTEVDVElPTiAgICAgICAgICAgICAgICAgICAgKFY0TDJfQ0lEX1BSSVZBVEVfQkFTRSsxMDgpCisjZGVmaW5lIFY0TDJfQ0lEX0NBTUVSQV9FWElGX09SSUVOVEFUSU9OICAgICAgICAgICAgICAgICAgICAoVjRMMl9DSURfUFJJVkFURV9CQVNFKzEwOSkKKworI2RlZmluZSBWNEwyX0NJRF9DQU1FUkFfUkVTRVQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKFY0TDJfQ0lEX1BSSVZBVEVfQkFTRSsxMTEpIC8vczFfY2FtZXJhIFsgRGVmZW5zZSBwcm9jZXNzIGJ5IEVTRCBpbnB1dCBdCisjZGVmaW5lIFY0TDJfQ0lEX0NBTUVSQV9DSEVDS19EQVRBTElORSAgICAgICAgICAgICAgICAgICAgICAoVjRMMl9DSURfUFJJVkFURV9CQVNFKzExMikKKyNkZWZpbmUgVjRMMl9DSURfQ0FNRVJBX0NIRUNLX0RBVEFMSU5FX1NUT1AgICAgICAgICAgICAgICAgIChWNEwyX0NJRF9QUklWQVRFX0JBU0UrMTEzKQorCisjZW5kaWYKKworI2lmIGRlZmluZWQoQ09ORklHX0FSSUVTX05UVCkgLy8gTW9kaWZ5IE5UVFMxCisjZGVmaW5lIFY0TDJfQ0lEX0NBTUVSQV9BRV9BV0JfRElTQUJMRV9MT0NLICAgICAgICAgICAgICAgICAoVjRMMl9DSURfUFJJVkFURV9CQVNFKzExNCkKKyNlbmRpZgorI2RlZmluZSBWNEwyX0NJRF9DQU1FUkFfVEhVTUJOQUlMX05VTEwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKFY0TDJfQ0lEX1BSSVZBVEVfQkFTRSsxMTUpCisjZGVmaW5lIFY0TDJfQ0lEX0NBTUVSQV9TRU5TT1JfTU9ERSAgICAgICAgICAgICAgICAgKFY0TDJfQ0lEX1BSSVZBVEVfQkFTRSsxMTYpCisKKyNkZWZpbmUgVjRMMl9DSURfQ0FNRVJBX0VYSUZfRVhQVElNRSAgICAgICAgICAgICAgICAoVjRMMl9DSURfUFJJVkFURV9CQVNFKzExNykKKyNkZWZpbmUgVjRMMl9DSURfQ0FNRVJBX0VYSUZfRkxBU0ggICAgICAgICAgICAgICAgICAoVjRMMl9DSURfUFJJVkFURV9CQVNFKzExOCkKKyNkZWZpbmUgVjRMMl9DSURfQ0FNRVJBX0VYSUZfSVNPICAgICAgICAgICAgICAgICAgICAoVjRMMl9DSURfUFJJVkFURV9CQVNFKzExOSkKKyNkZWZpbmUgVjRMMl9DSURfQ0FNRVJBX0VYSUZfVFYgICAgICAgICAgICAgICAgICAgICAoVjRMMl9DSURfUFJJVkFURV9CQVNFKzEyMCkKKyNkZWZpbmUgVjRMMl9DSURfQ0FNRVJBX0VYSUZfQlYgICAgICAgICAgICAgICAgICAgICAoVjRMMl9DSURfUFJJVkFURV9CQVNFKzEyMSkKKyNkZWZpbmUgVjRMMl9DSURfQ0FNRVJBX0VYSUZfRUJWICAgICAgICAgICAgICAgICAgICAoVjRMMl9DSURfUFJJVkFURV9CQVNFKzEyMikKKworI2RlZmluZSBWNEwyX0NJRF9DQU1FUkFfQlVTRlJFUV9MT0NLICAgICAgICAgICAgICAgIChWNEwyX0NJRF9QUklWQVRFX0JBU0UrMTI1KQorI2RlZmluZSBWNEwyX0NJRF9DQU1FUkFfQlVTRlJFUV9VTkxPQ0sgICAgICAgICAgICAgIChWNEwyX0NJRF9QUklWQVRFX0JBU0UrMTI2KQorCisvKiAgICAgIFBpeGVsIGZvcm1hdCBGT1VSQ0MgZGVwdGggIERlc2NyaXB0aW9uICAqLworLyogMTIgIFkvQ2JDciA0OjI6MCA2NHgzMiBtYWNyb2Jsb2NrcyAqLworI2RlZmluZSBWNEwyX1BJWF9GTVRfTlYxMlQgICAgdjRsMl9mb3VyY2MoJ1QnLCAnVicsICcxJywgJzInKQorCisvKgorICogICogVjRMMiBleHRlbnRpb24gZm9yIGRpZ2l0YWwgY2FtZXJhCisgKiAgICovCisvKiBTdHJvYmUgZmxhc2ggbGlnaHQgKi8KK2VudW0gdjRsMl9zdHJvYmVfY29udHJvbCB7CisgICAgLyogdHVybiBvZmYgdGhlIGZsYXNoIGxpZ2h0ICovCisgICAgVjRMMl9TVFJPQkVfQ09OVFJPTF9PRkYgICAgID0gMCwKKyAgICAvKiB0dXJuIG9uIHRoZSBmbGFzaCBsaWdodCAqLworICAgIFY0TDJfU1RST0JFX0NPTlRST0xfT04gICAgICA9IDEsCisgICAgLyogYWN0IGd1aWRlIGxpZ2h0IGJlZm9yZSBzcGxhc2ggKi8KKyAgICBWNEwyX1NUUk9CRV9DT05UUk9MX0FGR1VJREUgPSAyLAorICAgIC8qIGNoYXJnZSB0aGUgZmxhc2ggbGlnaHQgKi8KKyAgICBWNEwyX1NUUk9CRV9DT05UUk9MX0NIQVJHRSAgPSAzLAorfTsKKworZW51bSB2NGwyX3N0cm9iZV9jb25mIHsKKyAgICBWNEwyX1NUUk9CRV9PRkYgICAgICAgICA9IDAsICAgIC8qIEFsd2F5cyBvZmYgKi8KKyAgICBWNEwyX1NUUk9CRV9PTiAgICAgICAgICA9IDEsICAgIC8qIEFsd2F5cyBzcGxhc2hlcyAqLworICAgIC8qIEF1dG8gY29udHJvbCBwcmVzZXRzICovCisgICAgVjRMMl9TVFJPQkVfQVVUTyAgICAgICAgPSAyLAorICAgIFY0TDJfU1RST0JFX1JFREVZRV9SRURVQ1RJT04gICAgPSAzLAorICAgIFY0TDJfU1RST0JFX1NMT1dfU1lOQyAgICAgICA9IDQsCisgICAgVjRMMl9TVFJPQkVfRlJPTlRfQ1VSVEFJTiAgID0gNSwKKyAgICBWNEwyX1NUUk9CRV9SRUFSX0NVUlRBSU4gICAgPSA2LAorICAgIC8qIEV4dHJhIG1hbnVhbCBjb250cm9sIHByZXNldHMgKi8KKyAgICAvKiBrZWVwIHR1cm5lZCBvbiB1bnRpbCB0dXJuaW5nIG9mZiAqLworICAgIFY0TDJfU1RST0JFX1BFUk1BTkVOVCAgICAgICA9IDcsCisgICAgVjRMMl9TVFJPQkVfRVhURVJOQUwgICAgICAgID0gOCwKK307CisKK2VudW0gdjRsMl9zdHJvYmVfc3RhdHVzIHsKKyAgICBWNEwyX1NUUk9CRV9TVEFUVVNfT0ZGICAgICAgPSAwLAorICAgIC8qIHdoaWxlIHByb2Nlc3NpbmcgY29uZmlndXJhdGlvbnMgKi8KKyAgICBWNEwyX1NUUk9CRV9TVEFUVVNfQlVTWSAgICAgPSAxLAorICAgIFY0TDJfU1RST0JFX1NUQVRVU19FUlIgICAgICA9IDIsCisgICAgVjRMMl9TVFJPQkVfU1RBVFVTX0NIQVJHSU5HID0gMywKKyAgICBWNEwyX1NUUk9CRV9TVEFUVVNfQ0hBUkdFRCAgPSA0LAorfTsKKworLyogY2FwYWJpbGl0aWVzIGZpZWxkICovCisvKiBObyBzdHJvYmUgc3VwcG9ydGVkICovCisjZGVmaW5lIFY0TDJfU1RST0JFX0NBUF9OT05FICAgICAgICAweDAwMDAKKy8qIEFsd2F5cyBmbGFzaCBvZmYgbW9kZSAqLworI2RlZmluZSBWNEwyX1NUUk9CRV9DQVBfT0ZGICAgICAweDAwMDEKKy8qIEFsd2F5cyB1c2UgZmxhc2ggbGlnaHQgbW9kZSAqLworI2RlZmluZSBWNEwyX1NUUk9CRV9DQVBfT04gICAgICAweDAwMDIKKy8qIEZsYXNobGlnaHQgd29ya3MgYXV0b21hdGljICovCisjZGVmaW5lIFY0TDJfU1RST0JFX0NBUF9BVVRPICAgICAgICAweDAwMDQKKy8qIFJlZC1leWUgcmVkdWN0aW9uICovCisjZGVmaW5lIFY0TDJfU1RST0JFX0NBUF9SRURFWUUgICAgICAweDAwMDgKKy8qIFNsb3cgc3luYyAqLworI2RlZmluZSBWNEwyX1NUUk9CRV9DQVBfU0xPV1NZTkMgICAgMHgwMDEwCisvKiBGcm9udCBjdXJ0YWluICovCisjZGVmaW5lIFY0TDJfU1RST0JFX0NBUF9GUk9OVF9DVVJUQUlOICAgMHgwMDIwCisvKiBSZWFyIGN1cnRhaW4gKi8KKyNkZWZpbmUgVjRMMl9TVFJPQkVfQ0FQX1JFQVJfQ1VSVEFJTiAgICAweDAwNDAKKy8qIGtlZXAgdHVybmVkIG9uIHVudGlsIHR1cm5pbmcgb2ZmICovCisjZGVmaW5lIFY0TDJfU1RST0JFX0NBUF9QRVJNQU5FTlQgICAweDAwODAKKy8qIHVzZSBleHRlcm5hbCBzdHJvYmUgKi8KKyNkZWZpbmUgVjRMMl9TVFJPQkVfQ0FQX0VYVEVSTkFMICAgIDB4MDEwMAorCisvKiBTZXQgbW9kZSBhbmQgR2V0IHN0YXR1cyAqLworc3RydWN0IHY0bDJfc3Ryb2JlIHsKKyAgICAvKiBvZmYvb24vY2hhcmdlOjAvMS8yICovCisgICAgZW51bSAgICB2NGwyX3N0cm9iZV9jb250cm9sIGNvbnRyb2w7CisgICAgLyogc3VwcG9ydGVkIHN0cm9iZSBjYXBhYmlsaXRpZXMgKi8KKyAgICBfX3UzMiAgIGNhcGFiaWxpdGllczsKKyAgICBlbnVtICAgIHY0bDJfc3Ryb2JlX2NvbmYgbW9kZTsKKyAgICBlbnVtICAgIHY0bDJfc3Ryb2JlX3N0YXR1cyBzdGF0dXM7ICAvKiByZWFkIG9ubHkgKi8KKyAgICAvKiBkZWZhdWx0IGlzIDAgYW5kIHJhbmdlIG9mIHZhbHVlIHZhcmllcyBmcm9tIGVhY2ggbW9kZWxzICovCisgICAgX191MzIgICBmbGFzaF9ldjsKKyAgICBfX3UzMiAgIHJlc2VydmVkWzRdOworfTsKKworI2RlZmluZSBWSURJT0NfU19TVFJPQkUgICAgIF9JT1dSKCdWJywgODMsIHN0cnVjdCB2NGwyX3N0cm9iZSkKKyNkZWZpbmUgVklESU9DX0dfU1RST0JFICAgICBfSU9SKCdWJywgODQsIHN0cnVjdCB2NGwyX3N0cm9iZSkKKworLyogT2JqZWN0IHJlY29nbml0aW9uIGFuZCBjb2xsYXRlcmFsIGFjdGlvbnMgKi8KK2VudW0gdjRsMl9yZWNvZ19tb2RlIHsKKyAgICBWNEwyX1JFQ09HTklUSU9OX01PREVfT0ZGICAgPSAwLAorICAgIFY0TDJfUkVDT0dOSVRJT05fTU9ERV9PTiAgICA9IDEsCisgICAgVjRMMl9SRUNPR05JVElPTl9NT0RFX0xPQ0sgID0gMiwKK307CisKK2VudW0gdjRsMl9yZWNvZ19hY3Rpb24geworICAgIFY0TDJfUkVDT0dOSVRJT05fQUNUSU9OX05PTkUgICAgPSAwLCAgICAvKiBvbmx5IHJlY29nbml0aW9uICovCisgICAgVjRMMl9SRUNPR05JVElPTl9BQ1RJT05fQkxJTksgICA9IDEsICAgIC8qIENhcHR1cmUgb24gYmxpbmtpbmcgKi8KKyAgICBWNEwyX1JFQ09HTklUSU9OX0FDVElPTl9TTUlMRSAgID0gMiwgICAgLyogQ2FwdHVyZSBvbiBzbWlsaW5nICovCit9OworCitlbnVtIHY0bDJfcmVjb2dfcGF0dGVybiB7CisgICAgVjRMMl9SRUNPR19QQVRURVJOX0ZBQ0UgICAgID0gMCwgLyogRmFjZSAqLworICAgIFY0TDJfUkVDT0dfUEFUVEVSTl9IVU1BTiAgICA9IDEsIC8qIEh1bWFuICovCisgICAgVjRMMl9SRUNPR19QQVRURVJOX0NIQVIgICAgID0gMiwgLyogQ2hhcmFjdGVyICovCit9OworCitzdHJ1Y3QgdjRsMl9yZWNvZ19yZWN0IHsKKyAgICBlbnVtICAgIHY0bDJfcmVjb2dfcGF0dGVybiAgcDsgIC8qIGRldGVjdGVkIHBhdHRlcm4gKi8KKyAgICBzdHJ1Y3QgIHY0bDJfcmVjdCAgbzsgICAvKiBkZXRlY3RlZCBhcmVhICovCisgICAgX191MzIgICByZXNlcnZlZFs0XTsKK307CisKK3N0cnVjdCB2NGwyX3JlY29nX2RhdGEgeworICAgIF9fdTggICAgZGV0ZWN0X2NudDsgICAgIC8qIGRldGVjdGVkIG9iamVjdCBjb3VudGVyICovCisgICAgc3RydWN0ICB2NGwyX3JlY3QgICBvOyAgLyogZGV0ZWN0ZWQgYXJlYSAqLworICAgIF9fdTMyICAgcmVzZXJ2ZWRbNF07Cit9OworCitzdHJ1Y3QgdjRsMl9yZWNvZ25pdGlvbiB7CisgICAgZW51bSB2NGwyX3JlY29nX21vZGUgICAgbW9kZTsKKworICAgIC8qIFdoaWNoIHBhdHRlcm4gdG8gZGV0ZWN0ICovCisgICAgZW51bSB2NGwyX3JlY29nX3BhdHRlcm4gIHBhdHRlcm47CisKKyAgICAvKiBIb3cgbWFueSBvYmplY3QgdG8gZGV0ZWN0ICovCisgICAgX191OCAgICBvYmpfbnVtOworCisgICAgLyogc2VsZWN0IGRldGVjdGVkIG9iamVjdCAqLworICAgIF9fdTMyICAgZGV0ZWN0X2lkeDsKKworICAgIC8qIHJlYWQgb25seSA6R2V0IG9iamVjdCBjb29yZGluYXRpb24gKi8KKyAgICBzdHJ1Y3QgdjRsMl9yZWNvZ19kYXRhICBkYXRhOworCisgICAgZW51bSB2NGwyX3JlY29nX2FjdGlvbiAgYWN0aW9uOworICAgIF9fdTMyICAgcmVzZXJ2ZWRbNF07Cit9OworCisjZGVmaW5lIFZJRElPQ19TX1JFQ09HTklUSU9OICAgIF9JT1dSKCdWJywgODUsIHN0cnVjdCB2NGwyX3JlY29nbml0aW9uKQorI2RlZmluZSBWSURJT0NfR19SRUNPR05JVElPTiAgICBfSU9SKCdWJywgODYsIHN0cnVjdCB2NGwyX3JlY29nbml0aW9uKQorCisvKiBXZSB1c2UgdGhpcyBzdHJ1Y3QgYXMgdGhlIHY0bDJfc3RyZWFtcGFybSByYXdfZGF0YSBmb3IKKyAqIFZJRElPQ19HX1BBUk0gYW5kIFZJRElPQ19TX1BBUk0KKyAqLworc3RydWN0IHNlY19jYW1fcGFybSB7CisgICAgc3RydWN0IHY0bDJfY2FwdHVyZXBhcm0gY2FwdHVyZTsKKyAgICBpbnQgY29udHJhc3Q7CisgICAgaW50IGVmZmVjdHM7CisgICAgaW50IGJyaWdodG5lc3M7CisgICAgaW50IGV4cG9zdXJlOworICAgIGludCBmbGFzaF9tb2RlOworICAgIGludCBmb2N1c19tb2RlOworICAgIGludCBhZWF3Yl9tb2RlOworICAgIGludCBpc287CisgICAgaW50IG1ldGVyaW5nOworICAgIGludCBzYXR1cmF0aW9uOworICAgIGludCBzY2VuZV9tb2RlOworICAgIGludCBzaGFycG5lc3M7CisgICAgaW50IGh1ZTsKKyAgICBpbnQgd2hpdGVfYmFsYW5jZTsKKyAgICBpbnQgYW50aV9iYW5kaW5nOworfTsKKworI2VuZGlmIC8qIF9fTElOVVhfVklERU9ERVYyX1NBTVNVTkdfSCAqLwpkaWZmIC0tZ2l0IGEvZXh5bm9zNC9oYWwvbGliZmltZy9BbmRyb2lkLm1rIGIvZXh5bm9zNC9oYWwvbGliZmltZy9BbmRyb2lkLm1rCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjBkNjA3ZTIKLS0tIC9kZXYvbnVsbAorKysgYi9leHlub3M0L2hhbC9saWJmaW1nL0FuZHJvaWQubWsKQEAgLTAsMCArMSwxOCBAQAorTE9DQUxfUEFUSDo9ICQoY2FsbCBteS1kaXIpCitpbmNsdWRlICQoQ0xFQVJfVkFSUykKKworTE9DQUxfQ19JTkNMVURFUyArPSBcCisgICAgJChCT0FSRF9IQUxfUEFUSCkvaW5jbHVkZSBcCisKK0xPQ0FMX1NSQ19GSUxFUyA6PSBcCisJRmltZ0FwaS5jcHAgICBcCisJRmltZ0MyMTAuY3BwCisKK0xPQ0FMX1NIQVJFRF9MSUJSQVJJRVM6PSBsaWJsb2cgbGlidXRpbHMgbGliYmluZGVyCisKK0xPQ0FMX01PRFVMRV9UQUdTIDo9IGVuZworTE9DQUxfTU9EVUxFIDo9IGxpYmZpbWcKKworTE9DQUxfUFJFTElOS19NT0RVTEUgOj0gZmFsc2UKKworaW5jbHVkZSAkKEJVSUxEX1NIQVJFRF9MSUJSQVJZKQpkaWZmIC0tZ2l0IGEvZXh5bm9zNC9oYWwvbGliZmltZy9GaW1nQXBpLmNwcCBiL2V4eW5vczQvaGFsL2xpYmZpbWcvRmltZ0FwaS5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjRjNTg5MAotLS0gL2Rldi9udWxsCisrKyBiL2V4eW5vczQvaGFsL2xpYmZpbWcvRmltZ0FwaS5jcHAKQEAgLTAsMCArMSwyNDUgQEAKKy8qCisqKgorKiogQ29weXJpZ2h0IDIwMDkgU2Ftc3VuZyBFbGVjdHJvbmljcyBDbywgTHRkLgorKioKKyoqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworKiogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorKiogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisqKgorKiogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorKioKKyoqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyoqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisqKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyoqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyoqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorKioKKyoqCisqLworCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKy8vIGluY2x1ZGUKKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworI2RlZmluZSBMT0dfTkRFQlVHIDAKKyNkZWZpbmUgTE9HX1RBRyAiRmltZ0FwaSIKKyNpbmNsdWRlIDx1dGlscy9Mb2cuaD4KKworI2luY2x1ZGUgIkZpbWdBcGkuaCIKKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0vLworLy8gR2xvYmFsIEZ1bmN0aW9uCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS8vCisjaWZuZGVmIFJFQUxfREVCVUcKKyAgICB2b2lkIFZPSURfRlVOQyhjb25zdCBjaGFyKiBmb3JtYXQsIC4uLikKKyAgICB7fQorI2VuZGlmCisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLy8KKy8vIEZpbWdBcGkKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLy8KKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0vLworLy8gTWV0aG9kIEZ1bmN0aW9uIEltcGxlbWVudGF0aW9uCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS8vCisKK0ZpbWdBcGk6OkZpbWdBcGkoKQoreworICAgIG1fZmxhZ0NyZWF0ZSA9IGZhbHNlOworfQorCitGaW1nQXBpOjp+RmltZ0FwaSgpCit7CisgICAgaWYobV9mbGFnQ3JlYXRlID09IHRydWUpCisgICAgICAgIFBSSU5UKCIlczo6dGhpcyBpcyBub3QgRGVzdHJveWVkIGZhaWwgXG4iLCBfX2Z1bmNfXyk7Cit9CisKK2Jvb2wgRmltZ0FwaTo6Q3JlYXRlKHZvaWQpCit7CisgICAgYm9vbCByZXQgPSBmYWxzZTsKKworICAgIGlmKHRfTG9jaygpID09IGZhbHNlKSB7CisgICAgICAgIFBSSU5UKCIlczo6dF9Mb2NrKCkgZmFpbCBcbiIsIF9fZnVuY19fKTsKKyAgICAgICAgZ290byBDUkVBVEVfRE9ORTsKKyAgICB9CisKKyAgICBpZihtX2ZsYWdDcmVhdGUgPT0gdHJ1ZSkgeworICAgICAgICBQUklOVCgiJXM6OkFscmVhZHkgQ3JlYXRlZCBmYWlsIFxuIiwgX19mdW5jX18pOworICAgICAgICBnb3RvIENSRUFURV9ET05FOworICAgIH0KKworICAgIGlmKHRfQ3JlYXRlKCkgPT0gZmFsc2UpIHsKKyAgICAgICAgUFJJTlQoIiVzOjp0X0NyZWF0ZSgpIGZhaWwgXG4iLCBfX2Z1bmNfXyk7CisgICAgICAgIGdvdG8gQ1JFQVRFX0RPTkU7CisgICAgfQorCisgICAgbV9mbGFnQ3JlYXRlID0gdHJ1ZTsKKworICAgIHJldCA9IHRydWU7CisKK0NSRUFURV9ET05FIDoKKworICAgIHRfVW5Mb2NrKCk7CisKKyAgICByZXR1cm4gcmV0OworfQorCitib29sIEZpbWdBcGk6OkRlc3Ryb3kodm9pZCkKK3sKKyAgICBib29sIHJldCA9IGZhbHNlOworCisgICAgaWYodF9Mb2NrKCkgPT0gZmFsc2UpIHsKKyAgICAgICAgUFJJTlQoIiVzOjp0X0xvY2soKSBmYWlsIFxuIiwgX19mdW5jX18pOworICAgICAgICBnb3RvIERFU1RST1lfRE9ORTsKKyAgICB9CisKKyAgICBpZihtX2ZsYWdDcmVhdGUgPT0gZmFsc2UpIHsKKyAgICAgICAgUFJJTlQoIiVzOjpBbHJlYWR5IERlc3Ryb3llZCBmYWlsIFxuIiwgX19mdW5jX18pOworICAgICAgICBnb3RvIERFU1RST1lfRE9ORTsKKyAgICB9CisKKyAgICBpZih0X0Rlc3Ryb3koKSA9PSBmYWxzZSkgeworICAgICAgICBQUklOVCgiJXM6OnRfRGVzdHJveSgpIGZhaWwgXG4iLCBfX2Z1bmNfXyk7CisgICAgICAgIGdvdG8gREVTVFJPWV9ET05FOworICAgIH0KKworICAgIG1fZmxhZ0NyZWF0ZSA9IGZhbHNlOworCisgICAgcmV0ID0gdHJ1ZTsKKworREVTVFJPWV9ET05FIDoKKworICAgIHRfVW5Mb2NrKCk7CisKKyAgICByZXR1cm4gcmV0OworfQorCitib29sIEZpbWdBcGk6OlN0cmV0Y2goRmltZ1JlY3QgKiBzcmMsIEZpbWdSZWN0ICogZHN0LCBGaW1nQ2xpcCAqY2xpcCwgRmltZ0ZsYWcgKiBmbGFnKQoreworICAgIGJvb2wgcmV0ID0gZmFsc2U7CisKKyAgICBpZih0X0xvY2soKSA9PSBmYWxzZSkgeworICAgICAgICBQUklOVCgiJXM6OnRfTG9jaygpIGZhaWwgXG4iLCBfX2Z1bmNfXyk7CisgICAgICAgIGdvdG8gU1RSRVRDSF9ET05FOworICAgIH0KKworICAgIGlmKG1fZmxhZ0NyZWF0ZSA9PSBmYWxzZSkgeworICAgICAgICBQUklOVCgiJXM6OlRoaXMgaXMgbm90IENyZWF0ZWQgZmFpbCBcbiIsIF9fZnVuY19fKTsKKyAgICAgICAgZ290byBTVFJFVENIX0RPTkU7CisgICAgfQorCisgICAgaWYodF9TdHJldGNoKHNyYywgZHN0LCBjbGlwLCBmbGFnKSA9PSBmYWxzZSkgeworICAgICAgICBnb3RvIFNUUkVUQ0hfRE9ORTsKKyAgICB9CisKKyAgICByZXQgPSB0cnVlOworCitTVFJFVENIX0RPTkUgOgorCisgICAgdF9VbkxvY2soKTsKKworICAgIHJldHVybiByZXQ7Cit9CisKK2Jvb2wgRmltZ0FwaTo6U3luYyh2b2lkKQoreworICAgIGJvb2wgcmV0ID0gZmFsc2U7CisKKyAgICBpZihtX2ZsYWdDcmVhdGUgPT0gZmFsc2UpIHsKKyAgICAgICAgUFJJTlQoIiVzOjpUaGlzIGlzIG5vdCBDcmVhdGVkIGZhaWwgXG4iLCBfX2Z1bmNfXyk7CisgICAgICAgIGdvdG8gU1lOQ19ET05FOworICAgIH0KKworICAgIGlmKHRfU3luYygpID09IGZhbHNlKSB7CisgICAgICAgIGdvdG8gU1lOQ19ET05FOworICAgIH0KKworICAgIHJldCA9IHRydWU7CisKK1NZTkNfRE9ORSA6CisKKyAgICByZXR1cm4gcmV0OworfQorCitib29sIEZpbWdBcGk6OnRfQ3JlYXRlKHZvaWQpCit7CisgICAgUFJJTlQoIiVzOjpUaGlzIGlzIGVtcHR5IHZpcnR1YWwgZnVuY3Rpb24gZmFpbFxuIiwgX19mdW5jX18pOworICAgIHJldHVybiBmYWxzZTsKK30KKworYm9vbCBGaW1nQXBpOjp0X0Rlc3Ryb3kodm9pZCkKK3sKKyAgICBQUklOVCgiJXM6OlRoaXMgaXMgZW1wdHkgdmlydHVhbCBmdW5jdGlvbiBmYWlsXG4iLCBfX2Z1bmNfXyk7CisgICAgcmV0dXJuIGZhbHNlOworfQorCitib29sIEZpbWdBcGk6OnRfU3RyZXRjaChGaW1nUmVjdCAqIHNyYywgRmltZ1JlY3QgKiBkc3QsIEZpbWdDbGlwICogY2xpcCwgRmltZ0ZsYWcgKiBmbGFnKQoreworICAgIFBSSU5UKCIlczo6VGhpcyBpcyBlbXB0eSB2aXJ0dWFsIGZ1bmN0aW9uIGZhaWxcbiIsIF9fZnVuY19fKTsKKyAgICByZXR1cm4gZmFsc2U7Cit9CisKK2Jvb2wgRmltZ0FwaTo6dF9TeW5jKHZvaWQpCit7CisgICAgUFJJTlQoIiVzOjpUaGlzIGlzIGVtcHR5IHZpcnR1YWwgZnVuY3Rpb24gZmFpbFxuIiwgX19mdW5jX18pOworICAgIHJldHVybiBmYWxzZTsKK30KKworYm9vbCBGaW1nQXBpOjp0X0xvY2sodm9pZCkKK3sKKyAgICBQUklOVCgiJXM6OlRoaXMgaXMgZW1wdHkgdmlydHVhbCBmdW5jdGlvbiBmYWlsXG4iLCBfX2Z1bmNfXyk7CisgICAgcmV0dXJuIGZhbHNlOworfQorCitib29sIEZpbWdBcGk6OnRfVW5Mb2NrKHZvaWQpCit7CisgICAgUFJJTlQoIiVzOjpUaGlzIGlzIGVtcHR5IHZpcnR1YWwgZnVuY3Rpb24gZmFpbFxuIiwgX19mdW5jX18pOworICAgIHJldHVybiBmYWxzZTsKK30KKworCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS8vCisvLyBleHRlcm4gZnVuY3Rpb24KKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLy8KK2V4dGVybiAiQyIgaW50IHN0cmV0Y2hGaW1nQXBpKEZpbWdSZWN0ICogc3JjLCBGaW1nUmVjdCAqIGRzdCwgRmltZ0NsaXAgKiBjbGlwLCBGaW1nRmxhZyAqIGZsYWcpCit7CisgICAgRmltZ0FwaSAqIGZpbWdBcGkgPSBjcmVhdGVGaW1nQXBpKCk7CisKKyAgICBpZihmaW1nQXBpID09IE5VTEwpIHsKKyAgICAgICAgUFJJTlQoIiVzOjpjcmVhdGVGaW1nQXBpKCkgZmFpbCBcbiIsIF9fZnVuY19fKTsKKyAgICAgICAgcmV0dXJuIC0xOworICAgIH0KKworICAgIGlmKGZpbWdBcGktPlN0cmV0Y2goc3JjLCBkc3QsIGNsaXAsIGZsYWcpID09IGZhbHNlKSB7CisgICAgICAgIGlmKGZpbWdBcGkgIT0gTlVMTCkKKyAgICAgICAgICAgIGRlc3Ryb3lGaW1nQXBpKGZpbWdBcGkpOworCisgICAgICAgIHJldHVybiAtMTsKKyAgICB9CisKKyAgICBpZihmaW1nQXBpICE9IE5VTEwpCisgICAgICAgIGRlc3Ryb3lGaW1nQXBpKGZpbWdBcGkpOworCisgICAgcmV0dXJuIDA7Cit9CisKK2V4dGVybiAiQyIgaW50IFN5bmNGaW1nQXBpKHZvaWQpCit7CisgICAgRmltZ0FwaSAqIGZpbWdBcGkgPSBjcmVhdGVGaW1nQXBpKCk7CisgICAgaWYoZmltZ0FwaSA9PSBOVUxMKSB7CisgICAgICAgIFBSSU5UKCIlczo6Y3JlYXRlRmltZ0FwaSgpIGZhaWwgXG4iLCBfX2Z1bmNfXyk7CisgICAgICAgIHJldHVybiAtMTsKKyAgICB9CisKKyAgICBpZihmaW1nQXBpLT5TeW5jKCkgPT0gZmFsc2UpIHsKKyAgICAgICAgaWYoZmltZ0FwaSAhPSBOVUxMKQorICAgICAgICAgICAgZGVzdHJveUZpbWdBcGkoZmltZ0FwaSk7CisKKyAgICAgICAgcmV0dXJuIC0xOworICAgIH0KKworICAgIGlmKGZpbWdBcGkgIT0gTlVMTCkKKyAgICAgICAgZGVzdHJveUZpbWdBcGkoZmltZ0FwaSk7CisKKyAgICByZXR1cm4gMDsKK30KKwpkaWZmIC0tZ2l0IGEvZXh5bm9zNC9oYWwvbGliZmltZy9GaW1nQXBpLmggYi9leHlub3M0L2hhbC9saWJmaW1nL0ZpbWdBcGkuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zZGFhYzNkCi0tLSAvZGV2L251bGwKKysrIGIvZXh5bm9zNC9oYWwvbGliZmltZy9GaW1nQXBpLmgKQEAgLTAsMCArMSwxODYgQEAKKy8qCisqKgorKiogQ29weXJpZ2h0IDIwMDkgU2Ftc3VuZyBFbGVjdHJvbmljcyBDbywgTHRkLgorKiogQ29weXJpZ2h0IDIwMDgsIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyoqCisqKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyoqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyoqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorKioKKyoqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyoqCisqKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisqKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorKiogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisqKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisqKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyoqCisqKgorKi8KKworI2lmbmRlZiBGSU1HX0FQSV9ICisjZGVmaW5lIEZJTUdfQVBJX0gKKworI2luY2x1ZGUgPHV0aWxzL0xvZy5oPgorCisjaW5jbHVkZSAiLi4vaW5jbHVkZS9zZWNfZzJkLmgiCisvLyNpbmNsdWRlIDxzZWNfZzJkLmg+CisjZGVmaW5lIFJFQUxfREVCVUcKKyNkZWZpbmUgQU5EUk9JRF9MT0cKKworI2lmIGRlZmluZWQoUkVBTF9ERUJVRykKKyNpZmRlZiBBTkRST0lEX0xPRworICAgICNkZWZpbmUgUFJJTlQgIExPR0UKKyAgICAjZGVmaW5lIFBSSU5URCBMT0dECisjZWxzZQorICAgICNkZWZpbmUgUFJJTlQgIHByaW50ZgorICAgICNkZWZpbmUgUFJJTlREIHByaW50ZgorI2VuZGlmCisjZWxzZQorICAgIHZvaWQgVk9JRF9GVU5DKGNvbnN0IGNoYXIqIGZvcm1hdCwgLi4uKTsKKworICAgICNkZWZpbmUgUFJJTlQgIFZPSURfRlVOQworICAgICNkZWZpbmUgUFJJTlREIFZPSURfRlVOQworI2VuZGlmCisKK3R5cGVkZWYgZzJkX3JlY3QgRmltZ1JlY3Q7Cit0eXBlZGVmIGcyZF9mbGFnIEZpbWdGbGFnOwordHlwZWRlZiBnMmRfY2xpcCBGaW1nQ2xpcDsKKworI2lmZGVmIF9fY3BsdXNwbHVzCitjbGFzcyBGaW1nQXBpCit7CitwdWJsaWM6CisjZW5kaWYKKyAgICBlbnVtIENPTE9SX0ZPUk1BVCB7CisgICAgICAgIENPTE9SX0ZPUk1BVF9CQVNFID0gMCwKKworICAgICAgICBDT0xPUl9GT1JNQVRfUkdCXzU2NSAgID0gRzJEX1JHQl81NjUsCisKKyAgICAgICAgQ09MT1JfRk9STUFUX1JHQkFfODg4OCA9IEcyRF9SR0JBXzg4ODgsCisgICAgICAgIENPTE9SX0ZPUk1BVF9BUkdCXzg4ODggPSBHMkRfQVJHQl84ODg4LAorICAgICAgICBDT0xPUl9GT1JNQVRfQkdSQV84ODg4ID0gRzJEX0JHUkFfODg4OCwKKyAgICAgICAgQ09MT1JfRk9STUFUX0FCR1JfODg4OCA9IEcyRF9BQkdSXzg4ODgsCisKKyAgICAgICAgQ09MT1JfRk9STUFUX1JHQlhfODg4OCA9IEcyRF9SR0JYXzg4ODgsCisgICAgICAgIENPTE9SX0ZPUk1BVF9YUkdCXzg4ODggPSBHMkRfWFJHQl84ODg4LAorICAgICAgICBDT0xPUl9GT1JNQVRfQkdSWF84ODg4ID0gRzJEX0JHUlhfODg4OCwKKyAgICAgICAgQ09MT1JfRk9STUFUX1hCR1JfODg4OCA9IEcyRF9YQkdSXzg4ODgsCisKKyAgICAgICAgQ09MT1JfRk9STUFUX1JHQkFfNTU1MSA9IEcyRF9SR0JBXzU1NTEsCisgICAgICAgIENPTE9SX0ZPUk1BVF9BUkdCXzE1NTUgPSBHMkRfQVJHQl8xNTU1LAorICAgICAgICBDT0xPUl9GT1JNQVRfQkdSQV81NTUxID0gRzJEX0JHUkFfNTU1MSwKKyAgICAgICAgQ09MT1JfRk9STUFUX0FCR1JfMTU1NSA9IEcyRF9BQkdSXzE1NTUsCisKKyAgICAgICAgQ09MT1JfRk9STUFUX1JHQlhfNTU1MSA9IEcyRF9SR0JYXzU1NTEsCisgICAgICAgIENPTE9SX0ZPUk1BVF9YUkdCXzE1NTUgPSBHMkRfWFJHQl8xNTU1LAorICAgICAgICBDT0xPUl9GT1JNQVRfQkdSWF81NTUxID0gRzJEX0JHUlhfNTU1MSwKKyAgICAgICAgQ09MT1JfRk9STUFUX1hCR1JfMTU1NSA9IEcyRF9YQkdSXzE1NTUsCisKKyAgICAgICAgQ09MT1JfRk9STUFUX1JHQkFfNDQ0NCA9IEcyRF9SR0JBXzQ0NDQsCisgICAgICAgIENPTE9SX0ZPUk1BVF9BUkdCXzQ0NDQgPSBHMkRfQVJHQl80NDQ0LAorICAgICAgICBDT0xPUl9GT1JNQVRfQkdSQV80NDQ0ID0gRzJEX0JHUkFfNDQ0NCwKKyAgICAgICAgQ09MT1JfRk9STUFUX0FCR1JfNDQ0NCA9IEcyRF9BQkdSXzQ0NDQsCisKKyAgICAgICAgQ09MT1JfRk9STUFUX1JHQlhfNDQ0NCA9IEcyRF9SR0JYXzQ0NDQsCisgICAgICAgIENPTE9SX0ZPUk1BVF9YUkdCXzQ0NDQgPSBHMkRfWFJHQl80NDQ0LAorICAgICAgICBDT0xPUl9GT1JNQVRfQkdSWF80NDQ0ID0gRzJEX0JHUlhfNDQ0NCwKKyAgICAgICAgQ09MT1JfRk9STUFUX1hCR1JfNDQ0NCA9IEcyRF9YQkdSXzQ0NDQsCisKKyAgICAgICAgQ09MT1JfRk9STUFUX1BBQ0tFRF9SR0JfODg4ID0gRzJEX1BBQ0tFRF9SR0JfODg4LAorICAgICAgICBDT0xPUl9GT1JNQVRfUEFDS0VEX0JHUl84ODggPSBHMkRfUEFDS0VEX0JHUl84ODgsCisgICAgICAgIENPTE9SX0ZPUk1BVF9ZVVZfNDIwU1AsCisgICAgICAgIENPTE9SX0ZPUk1BVF9ZVVZfNDIwUCwKKyAgICAgICAgQ09MT1JfRk9STUFUX1lVVl80MjBJLAorICAgICAgICBDT0xPUl9GT1JNQVRfWVVWXzQyMlNQLAorICAgICAgICBDT0xPUl9GT1JNQVRfWVVWXzQyMlAsCisgICAgICAgIENPTE9SX0ZPUk1BVF9ZVVZfNDIySSwKKyAgICAgICAgQ09MT1JfRk9STUFUX1lVWVYsCisKKyAgICAgICAgQ09MT1JfRk9STUFUX01BWCwKKyAgICB9OworCisgICAgZW51bSBST1RBVEUgeworICAgICAgICBST1RBVEVfQkFTRSAgID0gMCwKKyAgICAgICAgUk9UQVRFXzAgICAgICA9IEcyRF9ST1RfMCwKKyAgICAgICAgUk9UQVRFXzkwICAgICA9IEcyRF9ST1RfOTAsCisgICAgICAgIFJPVEFURV8xODAgICAgPSBHMkRfUk9UXzE4MCwKKyAgICAgICAgUk9UQVRFXzI3MCAgICA9IEcyRF9ST1RfMjcwLAorICAgICAgICBST1RBVEVfWF9GTElQID0gRzJEX1JPVF9YX0ZMSVAsCisgICAgICAgIFJPVEFURV9ZX0ZMSVAgPSBHMkRfUk9UX1lfRkxJUCwKKyAgICAgICAgUk9UQVRFX01BWCwKKyAgICB9OworCisgICAgZW51bSBBTFBIQV9WQUxVRSB7CisgICAgICAgIEFMUEhBX01JTiAgICA9IEcyRF9BTFBIQV9CTEVORElOR19NSU4sIC8vIHdob2xseSB0cmFuc3BhcmVudAorICAgICAgICBBTFBIQV9NQVggICAgPSBHMkRfQUxQSEFfQkxFTkRJTkdfTUFYLCAvLyAyNTUKKyAgICAgICAgQUxQSEFfT1BBUVVFID0gRzJEX0FMUEhBX0JMRU5ESU5HX09QQVFVRSwgLy8gb3BhcXVlCisgICAgfTsKKworICAgIGVudW0gRElUSEVSIHsKKyAgICAgICAgRElUSEVSX0JBU0UgICA9IDAsCisgICAgICAgIERJVEhFUl9PRkYgICAgPSAwLAorICAgICAgICBESVRIRVJfT04gICAgID0gMSwKKyAgICAgICAgRElUSEVSX01BWCwKKyAgICB9OworI2lmZGVmIF9fY3BsdXNwbHVzCitwcml2YXRlIDoKKyAgICBib29sICAgIG1fZmxhZ0NyZWF0ZTsKKworcHJvdGVjdGVkIDoKKyAgICBGaW1nQXBpKCk7CisgICAgRmltZ0FwaShjb25zdCBGaW1nQXBpJiByaHMpIHt9CisgICAgdmlydHVhbCB+RmltZ0FwaSgpOworCitwdWJsaWM6CisgICAgYm9vbCAgICAgICAgQ3JlYXRlKHZvaWQpOworICAgIGJvb2wgICAgICAgIERlc3Ryb3kodm9pZCk7CisgICAgaW5saW5lIGJvb2wgRmxhZ0NyZWF0ZSh2b2lkKSB7IHJldHVybiBtX2ZsYWdDcmVhdGU7IH0KKyAgICBib29sICAgICAgICBTdHJldGNoKEZpbWdSZWN0ICogc3JjLCBGaW1nUmVjdCAqIGRzdCwgRmltZ0NsaXAgKiBjbGlwLCBGaW1nRmxhZyAqIGZsYWcpOworICAgIGJvb2wJICAgIFN5bmModm9pZCk7CisKK3Byb3RlY3RlZDoKKyAgICB2aXJ0dWFsIGJvb2wgdF9DcmVhdGUodm9pZCk7CisgICAgdmlydHVhbCBib29sIHRfRGVzdHJveSh2b2lkKTsKKyAgICB2aXJ0dWFsIGJvb2wgdF9TdHJldGNoKEZpbWdSZWN0ICogc3JjLCBGaW1nUmVjdCAqIGRzdCwgRmltZ0NsaXAgKiBjbGlwLCBGaW1nRmxhZyAqIGZsYWcpOworICAgIHZpcnR1YWwgYm9vbCB0X1N5bmModm9pZCk7CisgICAgdmlydHVhbCBib29sIHRfTG9jayh2b2lkKTsKKyAgICB2aXJ0dWFsIGJvb2wgdF9VbkxvY2sodm9pZCk7CisKK307CisjZW5kaWYKKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqIHVzZXIgYXBpIGV4dGVybiBmdW5jdGlvbgorICotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqIHVzYWdlIDEKKyAqIEZpbWdBcGkgKiBwID0gY3JlYXRlRmltZ0FwaSgpOworICogcC0+U3RyZXRjaCgpCisgKiBkZXN0cm95RmltZ0FwaShwKTsKKyAqCisgKiB1c2FnZSAyCisgKiBzdHJldGNoRmltZ0FwaShzcmMsIGRzdCwgY2xpcCwgZmxhZyk7CisgKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworI2lmZGVmIF9fY3BsdXNwbHVzCitleHRlcm4gIkMiCisjZW5kaWYKK3N0cnVjdCBGaW1nQXBpICogY3JlYXRlRmltZ0FwaSgpOworCisjaWZkZWYgX19jcGx1c3BsdXMKK2V4dGVybiAiQyIKKyNlbmRpZgordm9pZCAgICAgICAgICAgICBkZXN0cm95RmltZ0FwaShGaW1nQXBpICogcHRyRmltZ0FwaSk7CisKKyNpZmRlZiBfX2NwbHVzcGx1cworZXh0ZXJuICJDIgorI2VuZGlmCitpbnQgICAgICAgICAgICAgIHN0cmV0Y2hGaW1nQXBpKEZpbWdSZWN0ICogc3JjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGaW1nUmVjdCAqIGRzdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRmltZ0NsaXAgKiBjbGlwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGaW1nRmxhZyAqIGZsYWcpOworI2lmZGVmIF9fY3BsdXNwbHVzCitleHRlcm4gIkMiCisjZW5kaWYKK2ludCAgICAgICAgICAgICAgU3luY0ZpbWdBcGkodm9pZCk7CisKKyNlbmRpZiAvL0ZJTUdfQVBJX0gKZGlmZiAtLWdpdCBhL2V4eW5vczQvaGFsL2xpYmZpbWcvRmltZ0MyMTAuY3BwIGIvZXh5bm9zNC9oYWwvbGliZmltZy9GaW1nQzIxMC5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTI5YWNhZQotLS0gL2Rldi9udWxsCisrKyBiL2V4eW5vczQvaGFsL2xpYmZpbWcvRmltZ0MyMTAuY3BwCkBAIC0wLDAgKzEsNDc4IEBACisvKgorKioKKyoqIENvcHlyaWdodCAyMDA5IFNhbXN1bmcgRWxlY3Ryb25pY3MgQ28sIEx0ZC4KKyoqCisqKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyoqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyoqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorKioKKyoqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyoqCisqKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisqKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorKiogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisqKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisqKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyoqCisqKgorKi8KKworLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisvLyBpbmNsdWRlCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKyNkZWZpbmUgTE9HX05ERUJVRyAwCisjZGVmaW5lIExPR19UQUcgIkZpbWdDMjEwIgorI2luY2x1ZGUgPHV0aWxzL0xvZy5oPgorCisjaW5jbHVkZSAiRmltZ0MyMTAuaCIKKworbmFtZXNwYWNlIGFuZHJvaWQKK3sKKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0vLworLy8gRmltZ0MyMTAKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLy8KKworTXV0ZXggICAgICBGaW1nQzIxMDo6bV9pbnN0YW5jZUxvY2s7CitpbnQgICAgICAgIEZpbWdDMjEwOjptX2N1ckZpbWdDMjEwSW5kZXggPSAwOworaW50ICAgICAgICBGaW1nQzIxMDo6bV9udW1PZkluc3RhbmNlICAgID0gMDsKK0ZpbWdBcGkgKiAgRmltZ0MyMTA6Om1fcHRyRmltZ0FwaUxpc3RbTlVNQkVSX0ZJTUdfTElTVF0gPSB7TlVMTCwgfTsKKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0vLworCitGaW1nQzIxMDo6RmltZ0MyMTAoKQorICAgICAgICAgOiBtX2cyZEZkKDApLAorICAgICAgICAgICBtX2cyZFZpcnRBZGRyKE5VTEwpLAorICAgICAgICAgICBtX2cyZFNpemUoMCksCisgICAgICAgICAgIG1fZzJkU3JjVmlydEFkZHIoTlVMTCksCisgICAgICAgICAgIG1fZzJkU3JjU2l6ZSgwKSwKKyAgICAgICAgICAgbV9nMmREc3RWaXJ0QWRkcihOVUxMKSwKKyAgICAgICAgICAgbV9nMmREc3RTaXplKDApCit7CisgICAgbV9sb2NrID0gbmV3IE11dGV4KE11dGV4OjpTSEFSRUQsICJGaW1nQzIxMCIpOworfQorCitGaW1nQzIxMDo6fkZpbWdDMjEwKCkKK3sKKyAgICBkZWxldGUgbV9sb2NrOworfQorCitGaW1nQXBpICogRmltZ0MyMTA6OkNyZWF0ZUluc3RhbmNlKCkKK3sKKyAgICBNdXRleDo6QXV0b2xvY2sgYXV0b2xvY2sobV9pbnN0YW5jZUxvY2spOworCisgICAgRmltZ0FwaSAqIHB0ckZpbWcgPSBOVUxMOworCisgICAgLy8gVXNpbmcgTGlzdCBsaWtlIFJpbmdCdWZmZXIuLi4KKyAgICBmb3IoaW50IGkgPSBtX2N1ckZpbWdDMjEwSW5kZXg7IGkgPCBOVU1CRVJfRklNR19MSVNUOyBpKyspIHsKKyAgICAgICAgaWYobV9wdHJGaW1nQXBpTGlzdFtpXSA9PSBOVUxMKQorICAgICAgICAgICAgbV9wdHJGaW1nQXBpTGlzdFtpXSA9IG5ldyBGaW1nQzIxMDsKKworICAgICAgICBpZihtX3B0ckZpbWdBcGlMaXN0W2ldLT5GbGFnQ3JlYXRlKCkgPT0gZmFsc2UpIHsKKyAgICAgICAgICAgIGlmKG1fcHRyRmltZ0FwaUxpc3RbaV0tPkNyZWF0ZSgpID09IGZhbHNlKSB7CisgICAgICAgICAgICAgICAgUFJJTlQoIiVzOjpDcmVhdGUoJWQpIGZhaWxcbiIsIF9fZnVuY19fLCBpKTsKKyAgICAgICAgICAgICAgICBnb3RvIENyZWF0ZUluc3RhbmNlX0VuZDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICBtX251bU9mSW5zdGFuY2UrKzsKKyAgICAgICAgfQorCisgICAgICAgIGlmKGkgPCBOVU1CRVJfRklNR19MSVNUIC0gMSkKKyAgICAgICAgICAgIG1fY3VyRmltZ0MyMTBJbmRleCA9IGkgKyAxOworICAgICAgICBlbHNlCisgICAgICAgICAgICBtX2N1ckZpbWdDMjEwSW5kZXggPSAwOworCisgICAgICAgIHB0ckZpbWcgPSBtX3B0ckZpbWdBcGlMaXN0W2ldOworICAgICAgICBnb3RvIENyZWF0ZUluc3RhbmNlX0VuZDsKKyAgICB9CisKK0NyZWF0ZUluc3RhbmNlX0VuZCA6CisKKyAgICByZXR1cm4gcHRyRmltZzsKK30KKwordm9pZCBGaW1nQzIxMDo6RGVzdHJveUluc3RhbmNlKEZpbWdBcGkgKiBwdHJGaW1nQXBpKQoreworICAgIE11dGV4OjpBdXRvbG9jayBhdXRvbG9jayhtX2luc3RhbmNlTG9jayk7CisKKyAgICBmb3IoaW50IGkgPSAwOyBpIDwgTlVNQkVSX0ZJTUdfTElTVDsgaSsrKSB7CisgICAgICAgIGlmKG1fcHRyRmltZ0FwaUxpc3RbaV0gIT0gTlVMTAorICAgICAgICAgICAmJiBtX3B0ckZpbWdBcGlMaXN0W2ldID09IHB0ckZpbWdBcGkpIHsKKyAgICAgICAgICAgIGlmKG1fcHRyRmltZ0FwaUxpc3RbaV0tPkZsYWdDcmVhdGUoKSA9PSB0cnVlCisgICAgICAgICAgICAgICAmJiBtX3B0ckZpbWdBcGlMaXN0W2ldLT5EZXN0cm95KCkgPT0gZmFsc2UpIHsKKyAgICAgICAgICAgICAgICBQUklOVCgiJXM6OkRlc3Ryb3koKSBmYWlsXG4iLCBfX2Z1bmNfXyk7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIEZpbWdDMjEwICogdGVtcEZpbWdDMjEwID0gIChGaW1nQzIxMCAqKW1fcHRyRmltZ0FwaUxpc3RbaV07CisgICAgICAgICAgICAgICAgZGVsZXRlIHRlbXBGaW1nQzIxMDsKKyAgICAgICAgICAgICAgICBtX3B0ckZpbWdBcGlMaXN0W2ldID0gTlVMTDsKKworICAgICAgICAgICAgICAgIG1fbnVtT2ZJbnN0YW5jZS0tOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgIH0KK30KKwordm9pZCBGaW1nQzIxMDo6RGVzdHJveUFsbEluc3RhbmNlKHZvaWQpCit7CisgICAgTXV0ZXg6OkF1dG9sb2NrIGF1dG9sb2NrKG1faW5zdGFuY2VMb2NrKTsKKworICAgIGZvcihpbnQgaSA9IDA7IGkgPCBOVU1CRVJfRklNR19MSVNUOyBpKyspIHsKKyAgICAgICAgaWYobV9wdHJGaW1nQXBpTGlzdFtpXSAhPSBOVUxMKSB7CisgICAgICAgICAgICBpZihtX3B0ckZpbWdBcGlMaXN0W2ldLT5GbGFnQ3JlYXRlKCkgPT0gdHJ1ZQorICAgICAgICAgICAgICAgJiYgbV9wdHJGaW1nQXBpTGlzdFtpXS0+RGVzdHJveSgpID09IGZhbHNlKSB7CisgICAgICAgICAgICAgICAgICAgIFBSSU5UKCIlczo6RGVzdHJveSgpIGZhaWxcbiIsIF9fZnVuY19fKTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgRmltZ0MyMTAgKiB0ZW1wRmltZ0MyMTAgPSAgKEZpbWdDMjEwICopbV9wdHJGaW1nQXBpTGlzdFtpXTsKKyAgICAgICAgICAgICAgICBkZWxldGUgdGVtcEZpbWdDMjEwOworICAgICAgICAgICAgICAgIG1fcHRyRmltZ0FwaUxpc3RbaV0gPSBOVUxMOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorfQorCisKK2Jvb2wgRmltZ0MyMTA6OnRfQ3JlYXRlKHZvaWQpCit7CisgICAgYm9vbCByZXQgPSB0cnVlOworCisgICAgaWYobV9DcmVhdGVHMkQoKSA9PSBmYWxzZSkgeworICAgICAgICBQUklOVCgiJXM6Om1fQ3JlYXRlRzJEKCkgZmFpbCBcbiIsIF9fZnVuY19fKTsKKworICAgICAgICBpZihtX0Rlc3Ryb3lHMkQoKSA9PSBmYWxzZSkKKyAgICAgICAgICAgIFBSSU5UKCIlczo6bV9EZXN0cm95RzJEKCkgZmFpbCBcbiIsIF9fZnVuY19fKTsKKworICAgICAgICByZXQgPSBmYWxzZTsKKyAgICB9CisKKyAgICByZXR1cm4gcmV0OworfQorCitib29sIEZpbWdDMjEwOjp0X0Rlc3Ryb3kodm9pZCkKK3sKKyAgICBib29sIHJldCA9IHRydWU7CisKKyAgICBpZihtX0Rlc3Ryb3lHMkQoKSA9PSBmYWxzZSkgeworICAgICAgICBQUklOVCgiJXM6Om1fRGVzdHJveUcyRCgpIGZhaWwgXG4iLCBfX2Z1bmNfXyk7CisgICAgICAgIHJldCA9IGZhbHNlOworICAgIH0KKworICAgIHJldHVybiByZXQ7Cit9CisKK2Jvb2wgRmltZ0MyMTA6OnRfU3RyZXRjaChGaW1nUmVjdCAqIHNyYywgRmltZ1JlY3QgKiBkc3QsIEZpbWdDbGlwICogY2xpcCwgRmltZ0ZsYWcgKiBmbGFnKQoreworICAgICNpZmRlZiBDSEVDS19GSU1HQzIxMF9QRVJGT1JNQU5DRQorICAgICAgICAjZGVmaW5lICAgTlVNX09GX1NURVAgKDEwKQorICAgICAgICBTdG9wV2F0Y2ggICAgc3RvcFdhdGNoKCJDSEVDS19GSU1HQzIxMF9QRVJGT1JNQU5DRSIpOworICAgICAgICBjb25zdCBjaGFyICogc3RvcFdhdGNoTmFtZVtOVU1fT0ZfU1RFUF07CisgICAgICAgIG5zZWNzX3QgICAgICBzdG9wV2F0Y2hUaW1lW05VTV9PRl9TVEVQXTsKKyAgICAgICAgaW50ICAgICAgICAgIHN0b3BXYXRjaEluZGV4ID0gMDsKKyAgICAjZW5kaWYgLy8gQ0hFQ0tfRklNR0MyMTBfUEVSRk9STUFOQ0UKKworICAgIGlmKG1fRG9HMkQoc3JjLCBkc3QsIGNsaXAsIGZsYWcpID09IGZhbHNlKSB7CisgICAgICAgIGdvdG8gU1RSRVRDSF9GQUlMOworICAgIH0KKworI2lmZGVmIEcyRF9OT05FX0JMT0NLSU5HX01PREUKKyAgICBpZihtX1BvbGxHMkQoJm1fZzJkUG9sbCkgPT0gZmFsc2UpCisgICAgeworICAgICAgICBQUklOVCgiJXM6Om1fUG9sbEcyRCgpIGZhaWxcbiIsIF9fZnVuY19fKTsKKyAgICAgICAgZ290byBTVFJFVENIX0ZBSUw7CisgICAgfQorI2VuZGlmCisKKyAgICAjaWZkZWYgQ0hFQ0tfRklNR0MyMTBfUEVSRk9STUFOQ0UKKyAgICAgICAgbV9QcmludEZpbWdDMjEwUGVyZm9ybWFuY2Uoc3JjLCBkc3QsIHN0b3BXYXRjaEluZGV4LCBzdG9wV2F0Y2hOYW1lLCBzdG9wV2F0Y2hUaW1lKTsKKyAgICAjZW5kaWYgLy8gQ0hFQ0tfRklNR0MyMTBfUEVSRk9STUFOQ0UKKworICAgIHJldHVybiB0cnVlOworCitTVFJFVENIX0ZBSUw6CisgICAgcmV0dXJuIGZhbHNlOworCit9CisKK2Jvb2wgRmltZ0MyMTA6OnRfU3luYyh2b2lkKQoreworI2lmIDAKKyAgICBpZihpb2N0bChtX2cyZEZkLCBHMkRfU1lOQykgPCAwKSB7CisgICAgICAgIFBSSU5UKCIlczo6RzJEX1N5bmMgZmFpbFxuIiwgX19mdW5jX18pOworICAgICAgICBnb3RvIFNZTkNfRkFJTDsKKyAgICB9CisjZWxzZQorICAgIGlmKG1fUG9sbEcyRCgmbV9nMmRQb2xsKSA9PSBmYWxzZSkKKyAgICB7CisgICAgICAgIFBSSU5UKCIlczo6bV9Qb2xsRzJEKCkgZmFpbFxuIiwgX19mdW5jX18pOworICAgICAgICBnb3RvIFNZTkNfRkFJTDsKKyAgICB9CisjZW5kaWYKKyAgICByZXR1cm4gdHJ1ZTsKKworU1lOQ19GQUlMOgorICAgIHJldHVybiBmYWxzZTsKKworfQorCitib29sIEZpbWdDMjEwOjp0X0xvY2sodm9pZCkKK3sKKyAgICBtX2xvY2stPmxvY2soKTsKKyAgICByZXR1cm4gdHJ1ZTsKK30KKworYm9vbCBGaW1nQzIxMDo6dF9VbkxvY2sodm9pZCkKK3sKKyAgICBtX2xvY2stPnVubG9jaygpOworICAgIHJldHVybiB0cnVlOworfQorCitib29sIEZpbWdDMjEwOjptX0NyZWF0ZUcyRCh2b2lkKQoreworICAgIHZvaWQgKiBtbWFwX2Jhc2U7CisKKyAgICBpZihtX2cyZEZkICE9IDApIHsKKyAgICAgICAgUFJJTlQoIiVzOjptX2cyZEZkKCVkKSBpcyBub3QgMCBmYWlsXG4iLCBfX2Z1bmNfXywgbV9nMmRGZCk7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKyNpZmRlZiBHMkRfTk9ORV9CTE9DS0lOR19NT0RFCisgICAgbV9nMmRGZCA9IG9wZW4oU0VDX0cyRF9ERVZfTkFNRSwgT19SRFdSIHwgT19OT05CTE9DSyk7CisjZWxzZQorICAgIG1fZzJkRmQgPSBvcGVuKFNFQ19HMkRfREVWX05BTUUsIE9fUkRXUik7CisjZW5kaWYKKyAgICBpZihtX2cyZEZkIDwgMCkgeworICAgICAgICBQUklOVCgiJXM6Om9wZW4oJXMpIGZhaWwoJXMpXG4iLCBfX2Z1bmNfXywgU0VDX0cyRF9ERVZfTkFNRSwgc3RyZXJyb3IoZXJybm8pKTsKKyAgICAgICAgbV9nMmRGZCA9IDA7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgICBtZW1zZXQoJm1fZzJkUG9sbCwgMCwgc2l6ZW9mKG1fZzJkUG9sbCkpOworICAgIG1fZzJkUG9sbC5mZCAgICAgPSBtX2cyZEZkOworICAgIG1fZzJkUG9sbC5ldmVudHMgPSBQT0xMT1VUIHwgUE9MTEVSUjsKKworICAgIHJldHVybiB0cnVlOworfQorCitib29sIEZpbWdDMjEwOjptX0Rlc3Ryb3lHMkQodm9pZCkKK3sKKyAgICBpZihtX2cyZFZpcnRBZGRyICE9IE5VTEwpIHsKKyAgICAgICAgbXVubWFwKG1fZzJkVmlydEFkZHIsIG1fZzJkU2l6ZSk7CisgICAgICAgIG1fZzJkVmlydEFkZHIgPSBOVUxMOworICAgICAgICBtX2cyZFNpemUgPSAwOworICAgIH0KKworICAgIGlmKDAgPCBtX2cyZEZkKSB7CisgICAgICAgIGNsb3NlKG1fZzJkRmQpOworICAgIH0KKyAgICBtX2cyZEZkID0gMDsKKworICAgIHJldHVybiB0cnVlOworfQorCisvL2Jvb2wgRmltZ0MyMTA6Om1fRG9HMkQoRmltZ1JlY3QgKiBzcmMsIEZpbWdSZWN0ICogZHN0LCBpbnQgcm90YXRlVmFsdWUsIGludCBhbHBoYVZhbHVlLCBpbnQgY29sb3JLZXkpCitib29sIEZpbWdDMjEwOjptX0RvRzJEKEZpbWdSZWN0ICogc3JjLCBGaW1nUmVjdCAqIGRzdCwgRmltZ0NsaXAgKiBjbGlwLCBGaW1nRmxhZyAqIGZsYWcpCit7CisgICAgZzJkX3BhcmFtcyBwYXJhbXM7CisKKyAgICBtZW1jcHkoJnBhcmFtcy5zcmNfcmVjdCwgc3JjLCBzaXplb2YoRmltZ1JlY3QpKTsKKyAgICBtZW1jcHkoJnBhcmFtcy5kc3RfcmVjdCwgZHN0LCBzaXplb2YoRmltZ1JlY3QpKTsKKyAgICBtZW1jcHkoJnBhcmFtcy5jbGlwLCBjbGlwLCBzaXplb2YoRmltZ0NsaXApKTsKKyAgICBtZW1jcHkoJnBhcmFtcy5mbGFnLCBmbGFnLCBzaXplb2YoRmltZ0ZsYWcpKTsKKworICAgIGlmKGlvY3RsKG1fZzJkRmQsIEcyRF9CTElULCAmcGFyYW1zKSA8IDApIHsKKyAgICAgICAgI2lmIDAKKyAgICAgICAgeworICAgICAgICAgICAgUFJJTlQoIi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuIik7CisgICAgICAgICAgICBQUklOVCgic3JjLmNvbG9yX2Zvcm1hdCA6ICVkIFxuIiwgc3JjLT5jb2xvcl9mb3JtYXQpOworICAgICAgICAgICAgUFJJTlQoInNyYy5mdWxsX3cgICAgICAgOiAlZCBcbiIsIHNyYy0+ZnVsbF93KTsKKyAgICAgICAgICAgIFBSSU5UKCJzcmMuZnVsbF9oICAgICAgIDogJWQgXG4iLCBzcmMtPmZ1bGxfaCk7CisgICAgICAgICAgICBQUklOVCgic3JjLnggICAgICAgICAgICA6ICVkIFxuIiwgc3JjLT54KTsKKyAgICAgICAgICAgIFBSSU5UKCJzcmMueSAgICAgICAgICAgIDogJWQgXG4iLCBzcmMtPnkpOworICAgICAgICAgICAgUFJJTlQoInNyYy53ICAgICAgICAgICAgOiAlZCBcbiIsIHNyYy0+dyk7CisgICAgICAgICAgICBQUklOVCgic3JjLmggICAgICAgICAgICA6ICVkIFxuIiwgc3JjLT5oKTsKKworICAgICAgICAgICAgUFJJTlQoImRzdC5jb2xvcl9mb3JtYXQgOiAlZCBcbiIsIGRzdC0+Y29sb3JfZm9ybWF0KTsKKyAgICAgICAgICAgIFBSSU5UKCJkc3QuZnVsbF93ICAgICAgIDogJWQgXG4iLCBkc3QtPmZ1bGxfdyk7CisgICAgICAgICAgICBQUklOVCgiZHN0LmZ1bGxfaCAgICAgICA6ICVkIFxuIiwgZHN0LT5mdWxsX2gpOworICAgICAgICAgICAgUFJJTlQoImRzdC54ICAgICAgICAgICAgOiAlZCBcbiIsIGRzdC0+eCk7CisgICAgICAgICAgICBQUklOVCgiZHN0LnkgICAgICAgICAgICA6ICVkIFxuIiwgZHN0LT55KTsKKyAgICAgICAgICAgIFBSSU5UKCJkc3QudyAgICAgICAgICAgIDogJWQgXG4iLCBkc3QtPncpOworICAgICAgICAgICAgUFJJTlQoImRzdC5oICAgICAgICAgICAgOiAlZCBcbiIsIGRzdC0+aCk7CisKKyAgICAgICAgICAgIFBSSU5UKCJmbGFnLnJvdGF0ZV92YWwgIDogJWQgXG4iLCBmbGFnLT5yb3RhdGVfdmFsKTsKKyAgICAgICAgICAgIFBSSU5UKCJmbGFnLmFscGhhX3ZhbCAgIDogJWQoJWQpIFxuIiwgZmxhZy0+YWxwaGFfdmFsKTsKKyAgICAgICAgICAgIFBSSU5UKCJmbGFnLmNvbG9yX2tleV9tb2RlICA6ICVkKCVkKSBcbiIsIGZsYWctPmNvbG9yX2tleV9tb2RlLCBmbGFnLT5jb2xvcl9rZXlfdmFsKTsKKyAgICAgICAgICAgIFBSSU5UKCItLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiIpOworICAgICAgICB9CisgICAgICAgICNlbmRpZgorCisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgICByZXR1cm4gdHJ1ZTsKK30KKworaW5saW5lIGJvb2wgRmltZ0MyMTA6Om1fUG9sbEcyRChzdHJ1Y3QgcG9sbGZkICogZXZlbnRzKQoreworICAgICNkZWZpbmUgRzJEX1BPTExfVElNRSAoMTAwMCkKKworICAgIGludCByZXQ7CisKKyAgICByZXQgPSBwb2xsKGV2ZW50cywgMSwgRzJEX1BPTExfVElNRSk7CisKKyAgICBpZiAocmV0IDwgMCkgeworICAgICAgICBpZihpb2N0bChtX2cyZEZkLCBHMkRfUkVTRVQpIDwgMCkgeworCSAgICAgUFJJTlQoIiVzOjpHMkRfUkVTRVQgZmFpbFxuIiwgX19mdW5jX18pOworICAgICAgICB9CisgICAgICAgIFBSSU5UKCIlczo6cG9sbCBmYWlsIFxuIiwgX19mdW5jX18pOworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorICAgIGVsc2UgaWYgKHJldCA9PSAwKSB7CisgICAgICAgIGlmKGlvY3RsKG1fZzJkRmQsIEcyRF9SRVNFVCkgPCAwKSB7CisJICAgICBQUklOVCgiJXM6OkcyRF9SRVNFVCBmYWlsXG4iLCBfX2Z1bmNfXyk7CisgICAgICAgIH0KKyAgICAgICAgUFJJTlQoIiVzOjpObyBkYXRhIGluICVkIG1pbGxpIHNlY3MuLlxuIiwgX19mdW5jX18sIEcyRF9QT0xMX1RJTUUpOworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgICAgcmV0dXJuIHRydWU7Cit9CisKK2lubGluZSBib29sIEZpbWdDMjEwOjptX0NsZWFuRzJEKHVuc2lnbmVkIGludCB2aXJ0QWRkciwgdW5zaWduZWQgaW50IHNpemUpCit7CisgICAgZzJkX2RtYV9pbmZvIGRtYV9pbmZvID0geyB2aXJ0QWRkciwgc2l6ZSB9OworCisgICAgaWYoaW9jdGwobV9nMmRGZCwgRzJEX0RNQV9DQUNIRV9DTEVBTiwgJmRtYV9pbmZvKSA8IDApIHsKKyAgICAgICAgUFJJTlQoIiVzOjpHMkRfRE1BX0NBQ0hFX0NMRUFOKCVkLCAlZCkgZmFpbFxuIiwgX19mdW5jX18sIHZpcnRBZGRyLCBzaXplKTsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKyAgICByZXR1cm4gdHJ1ZTsKK30KKworaW5saW5lIGJvb2wgRmltZ0MyMTA6Om1fRmx1c2hHMkQgICh1bnNpZ25lZCBpbnQgdmlydEFkZHIsIHVuc2lnbmVkIGludCBzaXplKQoreworICAgIGcyZF9kbWFfaW5mbyBkbWFfaW5mbyA9IHsgdmlydEFkZHIsIHNpemUgfTsKKworICAgIGlmKGlvY3RsKG1fZzJkRmQsIEcyRF9ETUFfQ0FDSEVfRkxVU0gsICZkbWFfaW5mbykgPCAwKSB7CisgICAgICAgIFBSSU5UKCIlczo6RzJEX0RNQV9DQUNIRV9GTFVTSCglZCwgJWQpIGZhaWxcbiIsIF9fZnVuY19fLCB2aXJ0QWRkciwgc2l6ZSk7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisgICAgcmV0dXJuIHRydWU7Cit9CisKK2lubGluZSBpbnQgRmltZ0MyMTA6Om1fUm90YXRlVmFsdWVGaW1nQXBpMkZpbWdIdyhpbnQgcm90YXRlVmFsdWUpCit7CisgICAgc3dpdGNoIChyb3RhdGVWYWx1ZSkgeworICAgIGNhc2UgUk9UQVRFXzA6ICAgICAgcmV0dXJuIEcyRF9ST1RfMDsKKyAgICBjYXNlIFJPVEFURV85MDogICAgIHJldHVybiBHMkRfUk9UXzkwOworICAgIGNhc2UgUk9UQVRFXzE4MDogICAgcmV0dXJuIEcyRF9ST1RfMTgwOworICAgIGNhc2UgUk9UQVRFXzI3MDogICAgcmV0dXJuIEcyRF9ST1RfMjcwOworICAgIGNhc2UgUk9UQVRFX1hfRkxJUDogcmV0dXJuIEcyRF9ST1RfWF9GTElQOworICAgIGNhc2UgUk9UQVRFX1lfRkxJUDogcmV0dXJuIEcyRF9ST1RfWV9GTElQOworICAgIH0KKworICAgIHJldHVybiAtMTsKK30KKworCisjaWZkZWYgQ0hFQ0tfRklNR0MyMTBfUEVSRk9STUFOQ0UKK3ZvaWQgRmltZ0MyMTA6Om1fUHJpbnRGaW1nQzIxMFBlcmZvcm1hbmNlKEZpbWdSZWN0ICogICBzcmMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGaW1nUmVjdCAqICAgZHN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ICAgICAgICAgIHN0b3BXYXRjaEluZGV4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAqIHN0b3BXYXRjaE5hbWVbXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5zZWNzX3QgICAgICBzdG9wV2F0Y2hUaW1lW10pCit7CisgICAgY2hhciAqIHNyY0NvbG9yRm9ybWF0ID0gIlVOS05PV19DT0xPUl9GT1JNQVQiOworICAgIGNoYXIgKiBkc3RDb2xvckZvcm1hdCA9ICJVTktOT1dfQ09MT1JfRk9STUFUIjsKKworICAgIHN3aXRjaChzcmMtPmNvbG9yX2Zvcm1hdCkKKyAgICB7CisgICAgY2FzZSBDT0xPUl9GT1JNQVRfUkdCXzU2NSAgIDoKKyAgICAgICAgc3JjQ29sb3JGb3JtYXQgPSAiUkdCXzU2NSI7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgQ09MT1JfRk9STUFUX1JHQkFfODg4OCA6CisgICAgICAgIHNyY0NvbG9yRm9ybWF0ID0gIlJHQkFfODg4OCI7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgQ09MT1JfRk9STUFUX1JHQlhfODg4OCA6CisgICAgICAgIHNyY0NvbG9yRm9ybWF0ID0gIlJHQlhfODg4OCI7CisgICAgICAgIGJyZWFrOworICAgIGRlZmF1bHQgOgorICAgICAgICBzcmNDb2xvckZvcm1hdCA9ICJVTktOT1dfQ09MT1JfRk9STUFUIjsKKyAgICAgICAgYnJlYWs7CisgICAgfQorCisgICAgc3dpdGNoKGRzdC0+Y29sb3JfZm9ybWF0KQorICAgIHsKKyAgICBjYXNlIENPTE9SX0ZPUk1BVF9SR0JfNTY1ICAgOgorICAgICAgICBkc3RDb2xvckZvcm1hdCA9ICJSR0JfNTY1IjsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBDT0xPUl9GT1JNQVRfUkdCQV84ODg4IDoKKyAgICAgICAgZHN0Q29sb3JGb3JtYXQgPSAiUkdCQV84ODg4IjsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBDT0xPUl9GT1JNQVRfUkdCWF84ODg4IDoKKyAgICAgICAgZHN0Q29sb3JGb3JtYXQgPSAiUkdCWF84ODg4IjsKKyAgICAgICAgYnJlYWs7CisgICAgZGVmYXVsdCA6CisgICAgICAgIGRzdENvbG9yRm9ybWF0ID0gIlVOS05PV19DT0xPUl9GT1JNQVQiOworICAgICAgICBicmVhazsKKyAgICB9CisKKworI2lmZGVmIENIRUNLX0ZJTUdDMjEwX0NSSVRJQ0FMX1BFUkZPUk1BTkNFCisjZWxzZQorICAgIFBSSU5UKCI9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuIik7CisgICAgUFJJTlQoInNyY1slM2QsICUzZCB8ICUxMHNdIC0+IGRzdFslM2QsICUzZCB8ICUxMHNdXG4iLAorICAgICAgICAgIHNyYy0+dywgc3JjLT5oLCBzcmNDb2xvckZvcm1hdCwKKyAgICAgICAgICBkc3QtPncsIGRzdC0+aCwgZHN0Q29sb3JGb3JtYXQpOworI2VuZGlmCisKKyAgICBuc2Vjc190IHRvdGFsVGltZSA9IHN0b3BXYXRjaFRpbWVbc3RvcFdhdGNoSW5kZXggLSAxXTsKKworICAgIGZvcihpbnQgaSA9IDAgOyBpIDwgc3RvcFdhdGNoSW5kZXg7IGkrKykgeworICAgICAgICBuc2Vjc190IHNlY3Rpb25UaW1lOworCisgICAgICAgIGlmKGkgIT0gMCkKKyAgICAgICAgICAgIHNlY3Rpb25UaW1lID0gc3RvcFdhdGNoVGltZVtpXSAtIHN0b3BXYXRjaFRpbWVbaS0xXTsKKyAgICAgICAgZWxzZQorICAgICAgICAgICAgc2VjdGlvblRpbWUgPSBzdG9wV2F0Y2hUaW1lW2ldOworCisjaWZkZWYgQ0hFQ0tfRklNR0MyMTBfQ1JJVElDQUxfUEVSRk9STUFOQ0UKKyAgICAgICAgaWYoMTUwMCA8IChzZWN0aW9uVGltZSAvIDEwMDApKSAvLyBjaGVjayAxLjUgbWlsbGUgc2Vjb25kLi4KKyNlbmRpZgorICAgICAgICB7CisgICAgICAgICAgICBQUklOVCgiPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiIpOworICAgICAgICAgICAgUFJJTlQoInNyY1slM2QsICUzZCB8ICUxMHNdIC0+IGRzdFslM2QsICUzZCB8ICUxMHNdXG4iLAorICAgICAgICAgICAgICAgICAgIHNyYy0+dywgc3JjLT5oLCBzcmNDb2xvckZvcm1hdCwKKyAgICAgICAgICAgICAgICAgICBkc3QtPncsIGRzdC0+aCwgZHN0Q29sb3JGb3JtYXQpOworCisgICAgICAgICAgICBQUklOVCgiJTIwcyA6ICU1bGxkIG1zZWMoJTUuMmYgJSUpXG4iLAorICAgICAgICAgICAgICBzdG9wV2F0Y2hOYW1lW2ldLAorICAgICAgICAgICAgICBzZWN0aW9uVGltZSAvIDEwMDAsCisgICAgICAgICAgICAgICgoZmxvYXQpc2VjdGlvblRpbWUgLyAoZmxvYXQpdG90YWxUaW1lKSAqIDEwMC4wZik7CisgICAgICAgIH0KKyAgICB9CisKK30KKyNlbmRpZiAvLyBDSEVDS19GSU1HQzIxMF9QRVJGT1JNQU5DRQorCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS8vCisvLyBleHRlcm4gZnVuY3Rpb24KKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLy8KK2V4dGVybiAiQyIgc3RydWN0IEZpbWdBcGkgKiBjcmVhdGVGaW1nQXBpKCkKK3sKKyAgICBpZiAoZmltZ0FwaUF1dG9GcmVlVGhyZWFkID09IDApCisgICAgICAgIGZpbWdBcGlBdXRvRnJlZVRocmVhZCA9IG5ldyBGaW1nQXBpQXV0b0ZyZWVUaHJlYWQoKTsKKyAgICBlbHNlCisgICAgICAgIGZpbWdBcGlBdXRvRnJlZVRocmVhZC0+U2V0T25lTW9yZVNsZWVwKCk7CisKKyAgICByZXR1cm4gRmltZ0MyMTA6OkNyZWF0ZUluc3RhbmNlKCk7Cit9CisKK2V4dGVybiAiQyIgdm9pZCBkZXN0cm95RmltZ0FwaShGaW1nQXBpICogcHRyRmltZ0FwaSkKK3sKKyAgICAvLyBEb250JyBjYWxsIERlc3Ryb3RJbnN0YW5jZS4uCisgICAgLy8gcmV0dXJuIEZpbWdDMjEwOjpEZXN0cm95SW5zdGFuY2UocHRyRmltZ0FwaSk7Cit9CisKK307IC8vIG5hbWVzcGFjZSBhbmRyb2lkCmRpZmYgLS1naXQgYS9leHlub3M0L2hhbC9saWJmaW1nL0ZpbWdDMjEwLmggYi9leHlub3M0L2hhbC9saWJmaW1nL0ZpbWdDMjEwLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uN2FhOWE5YQotLS0gL2Rldi9udWxsCisrKyBiL2V4eW5vczQvaGFsL2xpYmZpbWcvRmltZ0MyMTAuaApAQCAtMCwwICsxLDE5NyBAQAorLyoKKyoqCisqKiBDb3B5cmlnaHQgMjAwOCwgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorKiogQ29weXJpZ2h0IDIwMDkgU2Ftc3VuZyBFbGVjdHJvbmljcyBDbywgTHRkLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorKioKKyoqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworKiogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorKiogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisqKgorKiogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorKioKKyoqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyoqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisqKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyoqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyoqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorKioKKyoqCisqLworCisjaWZuZGVmIEZJTUdfQzIxMF9ICisjZGVmaW5lIEZJTUdfQzIxMF9ICisKKworI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8c3RyaW5nLmg+CisjaW5jbHVkZSA8c3RkbGliLmg+CisKKyNpbmNsdWRlIDxmY250bC5oPgorI2luY2x1ZGUgPHVuaXN0ZC5oPgorI2luY2x1ZGUgPGVycm5vLmg+CisjaW5jbHVkZSA8c2lnbmFsLmg+CisjaW5jbHVkZSA8c3lzL21tYW4uaD4KKyNpbmNsdWRlIDxzeXMvdGltZS5oPgorI2luY2x1ZGUgPHN5cy9pb2N0bC5oPgorI2luY2x1ZGUgPHN5cy9wb2xsLmg+CisjaW5jbHVkZSA8c3lzL3N0YXQuaD4KKworI2luY2x1ZGUgPGxpbnV4L2FuZHJvaWRfcG1lbS5oPgorI2luY2x1ZGUgPHV0aWxzL3RocmVhZHMuaD4KKyNpbmNsdWRlIDx1dGlscy9TdG9wV2F0Y2guaD4KKworI2luY2x1ZGUgIkZpbWdBcGkuaCIKKy8vI2luY2x1ZGUgIkZpbWdNZW0uaCIKKworI2luY2x1ZGUgInNlY19nMmQuaCIKKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS8vCisKK25hbWVzcGFjZSBhbmRyb2lkCit7CisKKy8vI2RlZmluZSBDSEVDS19GSU1HQzIxMF9QRVJGT1JNQU5DRQorLy8jZGVmaW5lIENIRUNLX0ZJTUdDMjEwX0NSSVRJQ0FMX1BFUkZPUk1BTkNFCisjZGVmaW5lIE5VTUJFUl9GSU1HX0xJU1QgICAgICAgICAgICgxKSAgLy8ga2Nvb2xzdyA6IGJlY2F1c2Ugb2YgcG1lbQorLy8jZGVmaW5lIEcyRF9OT05FX0JMT0NLSU5HX01PREUgICAgICAgIC8vIE5vdCBzdXBwb3J0ZWQgeWV0LiBiZWNhdXNlIG9mIHN5c01NVSBQYWdlIGZhdWx0CisjZGVmaW5lIEdFVF9SRUNUX1NJWkUocmVjdCkgICAgICAgICgocmVjdC0+ZnVsbF93KSAqIChyZWN0LT5oKSAqIChyZWN0LT5ieXRlc19wZXJfcGl4ZWwpKQorI2RlZmluZSBHRVRfUkVBTF9TSVpFKHJlY3QpICAgICAgICAoKHJlY3QtPmZ1bGxfdykgKiAocmVjdC0+aCkgKiAocmVjdC0+Ynl0ZXNfcGVyX3BpeGVsKSkKKyNkZWZpbmUgR0VUX1NUQVJUX0FERFIocmVjdCkgICAgICAgIChyZWN0LT52aXJ0X2FkZHIgKyAoKHJlY3QtPnkgKiByZWN0LT5mdWxsX3cpICogcmVjdC0+Ynl0ZXNfcGVyX3BpeGVsKSkKKworCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS8vCisvLyBjbGFzcyBGaW1nQzIxMCA6IHB1YmxpYyBGaW1nQmFzZQorLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0vLworY2xhc3MgRmltZ0MyMTAgOiBwdWJsaWMgRmltZ0FwaQoreworcHJpdmF0ZSA6CisgICAgaW50ICAgICAgICAgICAgICBtX2cyZEZkOworCisgICAgdW5zaWduZWQgY2hhciAqICBtX2cyZFZpcnRBZGRyOworICAgIHVuc2lnbmVkIGludCAgICAgbV9nMmRTaXplOworICAgIHVuc2lnbmVkIGNoYXIgKiAgbV9nMmRTcmNWaXJ0QWRkcjsKKyAgICB1bnNpZ25lZCBpbnQgICAgIG1fZzJkU3JjU2l6ZTsKKyAgICB1bnNpZ25lZCBjaGFyICogIG1fZzJkRHN0VmlydEFkZHI7CisgICAgdW5zaWduZWQgaW50ICAgICBtX2cyZERzdFNpemU7CisgICAgc3RydWN0IHBvbGxmZCAgICBtX2cyZFBvbGw7CisKKyAgICBNdXRleCAqICAgICAgICAgIG1fbG9jazsKKworICAgIHN0YXRpYyBNdXRleCAgICAgbV9pbnN0YW5jZUxvY2s7CisgICAgc3RhdGljIGludCAgICAgICBtX2N1ckZpbWdDMjEwSW5kZXg7CisgICAgc3RhdGljIGludCAgICAgICBtX251bU9mSW5zdGFuY2U7CisKKyAgICBzdGF0aWMgRmltZ0FwaSAqIG1fcHRyRmltZ0FwaUxpc3RbTlVNQkVSX0ZJTUdfTElTVF07CisKKworcHJvdGVjdGVkIDoKKyAgICBGaW1nQzIxMCgpOworICAgIHZpcnR1YWwgfkZpbWdDMjEwKCk7CisKK3B1YmxpYzoKKyAgICBzdGF0aWMgRmltZ0FwaSAqIENyZWF0ZUluc3RhbmNlKCk7CisgICAgc3RhdGljIHZvaWQgICAgICBEZXN0cm95SW5zdGFuY2UoRmltZ0FwaSAqIHB0ckZpbWdBcGkpOworICAgIHN0YXRpYyB2b2lkICAgICAgRGVzdHJveUFsbEluc3RhbmNlKHZvaWQpOworCitwcm90ZWN0ZWQ6CisgICAgdmlydHVhbCBib29sICAgICB0X0NyZWF0ZSh2b2lkKTsKKyAgICB2aXJ0dWFsIGJvb2wgICAgIHRfRGVzdHJveSh2b2lkKTsKKyAgICB2aXJ0dWFsIGJvb2wgICAgIHRfU3RyZXRjaChGaW1nUmVjdCAqIHNyYywgRmltZ1JlY3QgKiBkc3QsIEZpbWdDbGlwICogY2xpcCwgRmltZ0ZsYWcgKiBmbGFnKTsKKyAgICB2aXJ0dWFsIGJvb2wgICAgIHRfU3luYyh2b2lkKTsKKyAgICB2aXJ0dWFsIGJvb2wgICAgIHRfTG9jayh2b2lkKTsKKyAgICB2aXJ0dWFsIGJvb2wgICAgIHRfVW5Mb2NrKHZvaWQpOworCitwcml2YXRlOgorICAgIGJvb2wgICAgICAgICAgICAgbV9DcmVhdGVHMkQodm9pZCk7CisgICAgYm9vbCAgICAgICAgICAgICBtX0Rlc3Ryb3lHMkQodm9pZCk7CisgICAgYm9vbCAgICAgICAgICAgICBTZXRDbGlwUmVjdGwoRmltZ1JlY3QgKiBkc3QsIEZpbWdDbGlwICogY2xpcCwgRmltZ0NsaXAgKiBjbGlwVGVtcE1pZFJlY3QpOworCisgICAgYm9vbCAgICAgICAgICAgICBtX0RvRzJEKEZpbWdSZWN0ICogc3JjLCBGaW1nUmVjdCAqIGRzdCwgRmltZ0NsaXAgKiBjbGlwLCBGaW1nRmxhZyAqIGZsYWcpOworCisgICAgaW5saW5lIGJvb2wgICAgICBtX1BvbGxHMkQoc3RydWN0IHBvbGxmZCAqIGV2ZW50cyk7CisKKyAgICBpbmxpbmUgYm9vbCAgICAgIG1fQ2xlYW5HMkQgICh1bnNpZ25lZCBpbnQgYWRkciwgdW5zaWduZWQgaW50IHNpemUpOworICAgIGlubGluZSBib29sICAgICAgbV9GbHVzaEcyRCAgKHVuc2lnbmVkIGludCBhZGRyLCB1bnNpZ25lZCBpbnQgc2l6ZSk7CisKKyAgICBpbmxpbmUgaW50ICAgICAgIG1fQ29sb3JGb3JtYXRGaW1nQXBpMkZpbWdIdyhpbnQgY29sb3JGb3JtYXQpOworICAgIGlubGluZSBpbnQgICAgICAgbV9Sb3RhdGVWYWx1ZUZpbWdBcGkyRmltZ0h3KGludCByb3RhdGVWYWx1ZSk7CisKKyAgICAjaWZkZWYgQ0hFQ0tfRklNR0MyMTBfUEVSRk9STUFOQ0UKKyAgICB2b2lkICAgICAgICAgICAgIG1fUHJpbnRGaW1nQzIxMFBlcmZvcm1hbmNlKEZpbWdSZWN0ICogICBzcmMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGaW1nUmVjdCAqICAgZHN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ICAgICAgICAgIHN0b3BXYXRjaEluZGV4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAqIHN0b3BXYXRjaE5hbWVbXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5zZWNzX3QgICAgICBzdG9wV2F0Y2hUaW1lW10pOworICAgICNlbmRpZiAvLyBDSEVDS19GSU1HQzIxMF9QRVJGT1JNQU5DRQorfTsKKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0vLworLy8gY2xhc3MgRmltZ0FwaUF1dG9GcmVlVGhyZWFkIDogcHVibGljIFRocmVhZAorLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0vLworY2xhc3MgRmltZ0FwaUF1dG9GcmVlVGhyZWFkOworCitzdGF0aWMgc3A8RmltZ0FwaUF1dG9GcmVlVGhyZWFkPiBmaW1nQXBpQXV0b0ZyZWVUaHJlYWQgPSAwOworCitjbGFzcyBGaW1nQXBpQXV0b0ZyZWVUaHJlYWQgOiBwdWJsaWMgVGhyZWFkCit7CisgICAgcHJpdmF0ZToKKyAgICAgICAgYm9vbCAgICAgIG1PbmVNb3JlU2xlZXA7CisgICAgICAgIGJvb2wgICAgICBtRGVzdHJveWVkOworCisgICAgcHVibGljOgorICAgICAgICBGaW1nQXBpQXV0b0ZyZWVUaHJlYWQodm9pZCk6CisgICAgICAgICAgICAgICAgICAgIC8vVGhyZWFkKHRydWUpLAorICAgICAgICAgICAgICAgICAgICBUaHJlYWQoZmFsc2UpLAorICAgICAgICAgICAgICAgICAgICBtT25lTW9yZVNsZWVwKHRydWUpLAorICAgICAgICAgICAgICAgICAgICBtRGVzdHJveWVkKGZhbHNlKQorICAgICAgICAgICAgICAgICAgICB7IH0KKyAgICAgICAgfkZpbWdBcGlBdXRvRnJlZVRocmVhZCh2b2lkKQorICAgICAgICB7CisgICAgICAgICAgICBpZihtRGVzdHJveWVkID09IGZhbHNlKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIEZpbWdDMjEwOjpEZXN0cm95QWxsSW5zdGFuY2UoKTsKKyAgICAgICAgICAgICAgICBtRGVzdHJveWVkID0gdHJ1ZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIHZpcnR1YWwgdm9pZCBvbkZpcnN0UmVmKCkKKyAgICAgICAgeworICAgICAgICAgICAgcnVuKCJGaW1nQXBpQXV0b0ZyZWVUaHJlYWQiLCBQUklPUklUWV9CQUNLR1JPVU5EKTsKKyAgICAgICAgfQorCisgICAgICAgIHZpcnR1YWwgYm9vbCB0aHJlYWRMb29wKCkKKyAgICAgICAgeworICAgICAgICAgICAgLy8jZGVmaW5lIFNMRUVQX1RJTUUgKDEwMDAwMDAwKSAvLyAxMCBzZWMKKyAgICAgICAgICAgICNkZWZpbmUgU0xFRVBfVElNRSAoMzAwMDAwMCkgLy8gMyBzZWMKKyAgICAgICAgICAgIC8vI2RlZmluZSBTTEVFUF9USU1FICgxMDAwMDAwKSAvLyAxIHNlYworCisgICAgICAgICAgICBpZihtT25lTW9yZVNsZWVwID09IHRydWUpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgbU9uZU1vcmVTbGVlcCA9IGZhbHNlOworICAgICAgICAgICAgICAgIHVzbGVlcChTTEVFUF9USU1FKTsKKworICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmKG1EZXN0cm95ZWQgPT0gZmFsc2UpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBGaW1nQzIxMDo6RGVzdHJveUFsbEluc3RhbmNlKCk7CisgICAgICAgICAgICAgICAgICAgIG1EZXN0cm95ZWQgPSB0cnVlOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGZpbWdBcGlBdXRvRnJlZVRocmVhZCA9IDA7CisKKyAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICB2b2lkIFNldE9uZU1vcmVTbGVlcCh2b2lkKQorICAgICAgICB7CisgICAgICAgICAgICBtT25lTW9yZVNsZWVwID0gdHJ1ZTsKKyAgICAgICAgfQorfTsKKworfTsgLy8gbmFtZXNwYWNlIGFuZHJvaWQKKworI2VuZGlmIC8vIEZJTUdfQzIxMF9ICmRpZmYgLS1naXQgYS9leHlub3M0L2hhbC9saWJod2NvbnZlcnRlci9BbmRyb2lkLm1rIGIvZXh5bm9zNC9oYWwvbGliaHdjb252ZXJ0ZXIvQW5kcm9pZC5tawpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lY2RhMDNiCi0tLSAvZGV2L251bGwKKysrIGIvZXh5bm9zNC9oYWwvbGliaHdjb252ZXJ0ZXIvQW5kcm9pZC5tawpAQCAtMCwwICsxLDMwIEBACisjIENvcHlyaWdodCAoQykgMjAwOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisjCisjIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworIyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisjIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorIworIyAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorIworIyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisjIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisjIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorIyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisjIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorCitMT0NBTF9QQVRIOj0gJChjYWxsIG15LWRpcikKK2luY2x1ZGUgJChDTEVBUl9WQVJTKQorCitMT0NBTF9QUkVMSU5LX01PRFVMRSA6PSBmYWxzZQorTE9DQUxfU0hBUkVEX0xJQlJBUklFUyA6PSBsaWJsb2cgbGlidXRpbHMgbGliY3V0aWxzIGxpYmZpbWMKKworTE9DQUxfU1JDX0ZJTEVTIDo9IEhhcmR3YXJlQ29udmVydGVyLmNwcAorCitMT0NBTF9DX0lOQ0xVREVTIDo9IFwKKwkkKFRPUCkvJChCT0FSRF9IQUxfUEFUSCkvaW5jbHVkZSBcCisJJChUT1ApLyQoQk9BUkRfSE1NX1BBVEgpL29wZW5tYXgvc2VjX29teC9pbmNsdWRlL2tocm9ub3MgXAorCSQoVE9QKS8kKEJPQVJEX0hNTV9QQVRIKS9vcGVubWF4L3NlY19vbXgvaW5jbHVkZS9zZWMKKworTE9DQUxfTU9EVUxFX1RBR1MgOj0gZW5nCitMT0NBTF9NT0RVTEUgOj0gbGliaHdjb252ZXJ0ZXIKK2luY2x1ZGUgJChCVUlMRF9TSEFSRURfTElCUkFSWSkKZGlmZiAtLWdpdCBhL2V4eW5vczQvaGFsL2xpYmh3Y29udmVydGVyL0hhcmR3YXJlQ29udmVydGVyLmNwcCBiL2V4eW5vczQvaGFsL2xpYmh3Y29udmVydGVyL0hhcmR3YXJlQ29udmVydGVyLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zYTY2NzY3Ci0tLSAvZGV2L251bGwKKysrIGIvZXh5bm9zNC9oYWwvbGliaHdjb252ZXJ0ZXIvSGFyZHdhcmVDb252ZXJ0ZXIuY3BwCkBAIC0wLDAgKzEsMTQzIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDA5IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2luY2x1ZGUgPHV0aWxzL0xvZy5oPgorCisjaW5jbHVkZSAiU0VDX09NWF9EZWYuaCIKKyNpbmNsdWRlICJTZWNGaW1jLmgiCisjaW5jbHVkZSAiSGFyZHdhcmVDb252ZXJ0ZXIuaCIKKworSGFyZHdhcmVDb252ZXJ0ZXI6OkhhcmR3YXJlQ29udmVydGVyKCkKK3sKKyAgICBTZWNGaW1jKiBoYW5kbGVfZmltYyA9IG5ldyBTZWNGaW1jKCk7CisgICAgbVNlY0ZpbWMgPSAodm9pZCAqKWhhbmRsZV9maW1jOworCisgICAgaWYgKGhhbmRsZV9maW1jLT5jcmVhdGUoU2VjRmltYzo6REVWXzIsIFNlY0ZpbWM6Ok1PREVfTVVMVElfQlVGLCAxKSA9PSBmYWxzZSkKKyAgICAgICAgYkhXY29udmVydF9mbGFnID0gMDsKKyAgICBlbHNlCisgICAgICAgIGJIV2NvbnZlcnRfZmxhZyA9IDE7Cit9CisKK0hhcmR3YXJlQ29udmVydGVyOjp+SGFyZHdhcmVDb252ZXJ0ZXIoKQoreworICAgIFNlY0ZpbWMqIGhhbmRsZV9maW1jID0gKFNlY0ZpbWMqKW1TZWNGaW1jOworICAgIGhhbmRsZV9maW1jLT5kZXN0cm95KCk7CisgICAgZGVsZXRlIG1TZWNGaW1jOworfQorCitib29sIEhhcmR3YXJlQ29udmVydGVyOjpjb252ZXJ0KAorICAgIHZvaWQgKiBzcmNfYWRkciwKKyAgICB2b2lkICpkc3RfYWRkciwKKyAgICBPTVhfQ09MT1JfRk9STUFUVFlQRSBzcmNfZm9ybWF0LAorICAgIGludDMyX3Qgd2lkdGgsCisgICAgaW50MzJfdCBoZWlnaHQsCisgICAgT01YX0NPTE9SX0ZPUk1BVFRZUEUgZHN0X2Zvcm1hdCkKK3sKKyAgICBTZWNGaW1jKiBoYW5kbGVfZmltYyA9IChTZWNGaW1jKiltU2VjRmltYzsKKworICAgIGludCByb3RhdGVfdmFsdWUgPSAwOworICAgIHVuc2lnbmVkIGludCBzcmNfY3JvcF94ID0gMDsKKyAgICB1bnNpZ25lZCBpbnQgc3JjX2Nyb3BfeSA9IDA7CisgICAgdW5zaWduZWQgaW50IHNyY19jcm9wX3dpZHRoID0gd2lkdGg7CisgICAgdW5zaWduZWQgaW50IHNyY19jcm9wX2hlaWdodCA9IGhlaWdodDsKKworICAgIHVuc2lnbmVkIGludCBkc3RfY3JvcF94ID0gMDsKKyAgICB1bnNpZ25lZCBpbnQgZHN0X2Nyb3BfeSA9IDA7CisgICAgdW5zaWduZWQgaW50IGRzdF9jcm9wX3dpZHRoID0gd2lkdGg7CisgICAgdW5zaWduZWQgaW50IGRzdF9jcm9wX2hlaWdodCA9IGhlaWdodDsKKworICAgIHZvaWQgKipzcmNfYWRkcl9hcnJheSA9ICh2b2lkICoqKXNyY19hZGRyOworICAgIHZvaWQgKipkc3RfYWRkcl9hcnJheSA9ICh2b2lkICoqKWRzdF9hZGRyOworCisgICAgdW5zaWduZWQgaW50IHNyY19oYXJfZm9ybWF0ID0gT01YdG9IYXJQaXhlbEZvbXJhdChzcmNfZm9ybWF0KTsKKyAgICB1bnNpZ25lZCBpbnQgZHN0X2hhcl9mb3JtYXQgPSBPTVh0b0hhclBpeGVsRm9tcmF0KGRzdF9mb3JtYXQpOworCisgICAgLy8gc2V0IHBvc3QgcHJvY2Vzc29yIGNvbmZpZ3VyYXRpb24KKyAgICBpZiAoIWhhbmRsZV9maW1jLT5zZXRTcmNQYXJhbXMod2lkdGgsIGhlaWdodCwgc3JjX2Nyb3BfeCwgc3JjX2Nyb3BfeSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnNyY19jcm9wX3dpZHRoLCAmc3JjX2Nyb3BfaGVpZ2h0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzcmNfaGFyX2Zvcm1hdCkpIHsKKyAgICAgICAgTE9HRSgiJXM6OiBzZXRTcmNQYXJtcygpIGZhaWxlZCIsIF9fZnVuY19fKTsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICAgIGlmICghaGFuZGxlX2ZpbWMtPnNldFNyY0FkZHIoKHVuc2lnbmVkIGludClzcmNfYWRkcl9hcnJheVswXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICh1bnNpZ25lZCBpbnQpc3JjX2FkZHJfYXJyYXlbMV0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAodW5zaWduZWQgaW50KXNyY19hZGRyX2FycmF5WzFdLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3JjX2hhcl9mb3JtYXQpKSB7CisgICAgICAgIExPR0UoIiVzOjogc2V0U3JjUGh5QWRkcigpIGZhaWxlZCIsIF9fZnVuY19fKTsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICAgIGlmICghaGFuZGxlX2ZpbWMtPnNldFJvdFZhbChyb3RhdGVfdmFsdWUpKSB7CisgICAgICAgIExPR0UoIiVzOjogc2V0Um90VmFsKCkgZmFpbGVkIiwgX19mdW5jX18pOworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgICAgaWYgKCFoYW5kbGVfZmltYy0+c2V0RHN0UGFyYW1zKHdpZHRoLCBoZWlnaHQsIGRzdF9jcm9wX3gsIGRzdF9jcm9wX3ksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZkc3RfY3JvcF93aWR0aCwgJmRzdF9jcm9wX2hlaWdodCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZHN0X2hhcl9mb3JtYXQpKSB7CisgICAgICAgIExPR0UoIiVzOjogc2V0RHN0UGFyYW1zKCkgZmFpbGVkIiwgX19mdW5jX18pOworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgICAgc3dpdGNoIChkc3RfZm9ybWF0KSB7CisgICAgY2FzZSBPTVhfQ09MT1JfRm9ybWF0WVVWNDIwU2VtaVBsYW5hcjoKKyAgICAgICAgaWYgKCFoYW5kbGVfZmltYy0+c2V0RHN0QWRkcigodW5zaWduZWQgaW50KShkc3RfYWRkcl9hcnJheVswXSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHVuc2lnbmVkIGludCkoZHN0X2FkZHJfYXJyYXlbMV0pLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICh1bnNpZ25lZCBpbnQpKGRzdF9hZGRyX2FycmF5WzFdKSkpIHsKKyAgICAgICAgICAgIExPR0UoIiVzOjogc2V0RHN0UGh5QWRkcigpIGZhaWxlZCIsIF9fZnVuY19fKTsKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgfQorICAgICAgICBicmVhazsKKyAgICBjYXNlIE9NWF9DT0xPUl9Gb3JtYXRZVVY0MjBQbGFuYXI6CisgICAgZGVmYXVsdDoKKyAgICAgICAgaWYgKCFoYW5kbGVfZmltYy0+c2V0RHN0QWRkcigodW5zaWduZWQgaW50KShkc3RfYWRkcl9hcnJheVswXSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHVuc2lnbmVkIGludCkoZHN0X2FkZHJfYXJyYXlbMV0pLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICh1bnNpZ25lZCBpbnQpKGRzdF9hZGRyX2FycmF5WzJdKSkpIHsKKyAgICAgICAgICAgIExPR0UoIiVzOjogc2V0RHN0UGh5QWRkcigpIGZhaWxlZCIsIF9fZnVuY19fKTsKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgfQorICAgICAgICBicmVhazsKKyAgICB9CisKKyAgICBpZiAoIWhhbmRsZV9maW1jLT5kcmF3KDAsIDApKSB7CisgICAgICAgIExPR0UoIiVzOjogaGFuZGxlT25lU2hvdCgpIGZhaWxlZCIsIF9fZnVuY19fKTsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICAgIHJldHVybiB0cnVlOworfQorCit1bnNpZ25lZCBpbnQgSGFyZHdhcmVDb252ZXJ0ZXI6Ok9NWHRvSGFyUGl4ZWxGb21yYXQoT01YX0NPTE9SX0ZPUk1BVFRZUEUgb214X2Zvcm1hdCkKK3sKKyAgICB1bnNpZ25lZCBpbnQgaGFsX2Zvcm1hdCA9IDA7CisKKyAgICBzd2l0Y2ggKG9teF9mb3JtYXQpIHsKKyAgICBjYXNlIE9NWF9DT0xPUl9Gb3JtYXRZVVY0MjBQbGFuYXI6CisgICAgICAgIGhhbF9mb3JtYXQgPSBIQUxfUElYRUxfRk9STUFUX1lDYkNyXzQyMF9QOworICAgICAgICBicmVhazsKKyAgICBjYXNlIE9NWF9DT0xPUl9Gb3JtYXRZVVY0MjBTZW1pUGxhbmFyOgorICAgICAgICBoYWxfZm9ybWF0ID0gSEFMX1BJWEVMX0ZPUk1BVF9ZQ2JDcl80MjBfU1A7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgT01YX1NFQ19DT0xPUl9Gb3JtYXROVjEyVFBoeXNpY2FsQWRkcmVzczoKKyAgICAgICAgaGFsX2Zvcm1hdCA9IEhBTF9QSVhFTF9GT1JNQVRfQ1VTVE9NX1lDYkNyXzQyMF9TUF9USUxFRDsKKyAgICAgICAgYnJlYWs7CisgICAgZGVmYXVsdDoKKyAgICAgICAgaGFsX2Zvcm1hdCA9IEhBTF9QSVhFTF9GT1JNQVRfWUNiQ3JfNDIwX1A7CisgICAgICAgIGJyZWFrOworICAgIH0KKyAgICByZXR1cm4gaGFsX2Zvcm1hdDsKK30KZGlmZiAtLWdpdCBhL2V4eW5vczQvaGFsL2xpYmh3Y29udmVydGVyL0hhcmR3YXJlQ29udmVydGVyLmggYi9leHlub3M0L2hhbC9saWJod2NvbnZlcnRlci9IYXJkd2FyZUNvbnZlcnRlci5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjU1MjBmYjYKLS0tIC9kZXYvbnVsbAorKysgYi9leHlub3M0L2hhbC9saWJod2NvbnZlcnRlci9IYXJkd2FyZUNvbnZlcnRlci5oCkBAIC0wLDAgKzEsNDIgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMDkgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaWZuZGVmIEhBUkRXQVJFX0NPTlZFUlRFUl9IXworCisjZGVmaW5lIEhBUkRXQVJFX0NPTlZFUlRFUl9IXworCisjaW5jbHVkZSA8T01YX1ZpZGVvLmg+CisKK2NsYXNzIEhhcmR3YXJlQ29udmVydGVyIHsKK3B1YmxpYzoKKyAgICBIYXJkd2FyZUNvbnZlcnRlcigpOworICAgIH5IYXJkd2FyZUNvbnZlcnRlcigpOworICAgIGJvb2wgY29udmVydCgKKyAgICAgICAgdm9pZCAqIHNyY19hZGRyLAorICAgICAgICB2b2lkICogZHN0X2FkZHIsCisgICAgICAgIE9NWF9DT0xPUl9GT1JNQVRUWVBFIHNyY19mb3JtYXQsCisgICAgICAgIGludDMyX3Qgd2lkdGgsCisgICAgICAgIGludDMyX3QgaGVpZ2h0LAorICAgICAgICBPTVhfQ09MT1JfRk9STUFUVFlQRSBkc3RfZm9ybWF0KTsKKyAgICBib29sIGJIV2NvbnZlcnRfZmxhZzsKK3ByaXZhdGU6CisgICAgdm9pZCAqbVNlY0ZpbWM7CisgICAgdW5zaWduZWQgaW50IE9NWHRvSGFyUGl4ZWxGb21yYXQoT01YX0NPTE9SX0ZPUk1BVFRZUEUgb214X2Zvcm1hdCk7Cit9OworCit2b2lkIHRlc3RfZnVuY3Rpb24oKTsKKworI2VuZGlmICAvLyBIQVJEV0FSRV9DT05WRVJURVJfSF8KZGlmZiAtLWdpdCBhL2V4eW5vczQvaGFsL2xpYmxpZ2h0cy9BbmRyb2lkLm1rIGIvZXh5bm9zNC9oYWwvbGlibGlnaHRzL0FuZHJvaWQubWsKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTk1YmQwMgotLS0gL2Rldi9udWxsCisrKyBiL2V4eW5vczQvaGFsL2xpYmxpZ2h0cy9BbmRyb2lkLm1rCkBAIC0wLDAgKzEsMzMgQEAKKyMgQ29weXJpZ2h0IChDKSAyMDExIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyMgQ29weXJpZ2h0IChDKSAyMDExIFRoZSBDeWFub2dlbk1vZCBQcm9qZWN0CisjCisjIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworIyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisjIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorIworIyAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorIworIyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisjIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisjIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorIyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisjIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorCitMT0NBTF9QQVRIOj0gJChjYWxsIG15LWRpcikKKyMgSEFMIG1vZHVsZSBpbXBsZW1lbmF0aW9uLCBub3QgcHJlbGlua2VkIGFuZCBzdG9yZWQgaW4KKyMgaHcvPENPUFlQSVhfSEFSRFdBUkVfTU9EVUxFX0lEPi48cm8uYm9hcmQucGxhdGZvcm0+LnNvCitpbmNsdWRlICQoQ0xFQVJfVkFSUykKKworTE9DQUxfU1JDX0ZJTEVTIDo9IGxpZ2h0cy5jCisKK0xPQ0FMX1BSRUxJTktfTU9EVUxFIDo9IGZhbHNlCitMT0NBTF9NT0RVTEVfUEFUSCA6PSAkKFRBUkdFVF9PVVRfU0hBUkVEX0xJQlJBUklFUykvaHcKKworTE9DQUxfU0hBUkVEX0xJQlJBUklFUyA6PSBsaWJsb2cKKworTE9DQUxfTU9EVUxFIDo9IGxpZ2h0cy4kKFRBUkdFVF9CT0FSRF9QTEFURk9STSkgIAorCitMT0NBTF9NT0RVTEVfVEFHUyA6PSBvcHRpb25hbAorCitpbmNsdWRlICQoQlVJTERfU0hBUkVEX0xJQlJBUlkpCisKZGlmZiAtLWdpdCBhL2V4eW5vczQvaGFsL2xpYmxpZ2h0cy9OT1RJQ0UgYi9leHlub3M0L2hhbC9saWJsaWdodHMvTk9USUNFCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmY5MjE1OTMKLS0tIC9kZXYvbnVsbAorKysgYi9leHlub3M0L2hhbC9saWJsaWdodHMvTk9USUNFCkBAIC0wLDAgKzEsMTkwIEBACisKKyAgIENvcHlyaWdodCAoQykgMjAwOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisKKyAgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorCisgICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKworCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBcGFjaGUgTGljZW5zZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgVmVyc2lvbiAyLjAsIEphbnVhcnkgMjAwNAorICAgICAgICAgICAgICAgICAgICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzLworCisgICBURVJNUyBBTkQgQ09ORElUSU9OUyBGT1IgVVNFLCBSRVBST0RVQ1RJT04sIEFORCBESVNUUklCVVRJT04KKworICAgMS4gRGVmaW5pdGlvbnMuCisKKyAgICAgICJMaWNlbnNlIiBzaGFsbCBtZWFuIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBmb3IgdXNlLCByZXByb2R1Y3Rpb24sCisgICAgICBhbmQgZGlzdHJpYnV0aW9uIGFzIGRlZmluZWQgYnkgU2VjdGlvbnMgMSB0aHJvdWdoIDkgb2YgdGhpcyBkb2N1bWVudC4KKworICAgICAgIkxpY2Vuc29yIiBzaGFsbCBtZWFuIHRoZSBjb3B5cmlnaHQgb3duZXIgb3IgZW50aXR5IGF1dGhvcml6ZWQgYnkKKyAgICAgIHRoZSBjb3B5cmlnaHQgb3duZXIgdGhhdCBpcyBncmFudGluZyB0aGUgTGljZW5zZS4KKworICAgICAgIkxlZ2FsIEVudGl0eSIgc2hhbGwgbWVhbiB0aGUgdW5pb24gb2YgdGhlIGFjdGluZyBlbnRpdHkgYW5kIGFsbAorICAgICAgb3RoZXIgZW50aXRpZXMgdGhhdCBjb250cm9sLCBhcmUgY29udHJvbGxlZCBieSwgb3IgYXJlIHVuZGVyIGNvbW1vbgorICAgICAgY29udHJvbCB3aXRoIHRoYXQgZW50aXR5LiBGb3IgdGhlIHB1cnBvc2VzIG9mIHRoaXMgZGVmaW5pdGlvbiwKKyAgICAgICJjb250cm9sIiBtZWFucyAoaSkgdGhlIHBvd2VyLCBkaXJlY3Qgb3IgaW5kaXJlY3QsIHRvIGNhdXNlIHRoZQorICAgICAgZGlyZWN0aW9uIG9yIG1hbmFnZW1lbnQgb2Ygc3VjaCBlbnRpdHksIHdoZXRoZXIgYnkgY29udHJhY3Qgb3IKKyAgICAgIG90aGVyd2lzZSwgb3IgKGlpKSBvd25lcnNoaXAgb2YgZmlmdHkgcGVyY2VudCAoNTAlKSBvciBtb3JlIG9mIHRoZQorICAgICAgb3V0c3RhbmRpbmcgc2hhcmVzLCBvciAoaWlpKSBiZW5lZmljaWFsIG93bmVyc2hpcCBvZiBzdWNoIGVudGl0eS4KKworICAgICAgIllvdSIgKG9yICJZb3VyIikgc2hhbGwgbWVhbiBhbiBpbmRpdmlkdWFsIG9yIExlZ2FsIEVudGl0eQorICAgICAgZXhlcmNpc2luZyBwZXJtaXNzaW9ucyBncmFudGVkIGJ5IHRoaXMgTGljZW5zZS4KKworICAgICAgIlNvdXJjZSIgZm9ybSBzaGFsbCBtZWFuIHRoZSBwcmVmZXJyZWQgZm9ybSBmb3IgbWFraW5nIG1vZGlmaWNhdGlvbnMsCisgICAgICBpbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvIHNvZnR3YXJlIHNvdXJjZSBjb2RlLCBkb2N1bWVudGF0aW9uCisgICAgICBzb3VyY2UsIGFuZCBjb25maWd1cmF0aW9uIGZpbGVzLgorCisgICAgICAiT2JqZWN0IiBmb3JtIHNoYWxsIG1lYW4gYW55IGZvcm0gcmVzdWx0aW5nIGZyb20gbWVjaGFuaWNhbAorICAgICAgdHJhbnNmb3JtYXRpb24gb3IgdHJhbnNsYXRpb24gb2YgYSBTb3VyY2UgZm9ybSwgaW5jbHVkaW5nIGJ1dAorICAgICAgbm90IGxpbWl0ZWQgdG8gY29tcGlsZWQgb2JqZWN0IGNvZGUsIGdlbmVyYXRlZCBkb2N1bWVudGF0aW9uLAorICAgICAgYW5kIGNvbnZlcnNpb25zIHRvIG90aGVyIG1lZGlhIHR5cGVzLgorCisgICAgICAiV29yayIgc2hhbGwgbWVhbiB0aGUgd29yayBvZiBhdXRob3JzaGlwLCB3aGV0aGVyIGluIFNvdXJjZSBvcgorICAgICAgT2JqZWN0IGZvcm0sIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSBMaWNlbnNlLCBhcyBpbmRpY2F0ZWQgYnkgYQorICAgICAgY29weXJpZ2h0IG5vdGljZSB0aGF0IGlzIGluY2x1ZGVkIGluIG9yIGF0dGFjaGVkIHRvIHRoZSB3b3JrCisgICAgICAoYW4gZXhhbXBsZSBpcyBwcm92aWRlZCBpbiB0aGUgQXBwZW5kaXggYmVsb3cpLgorCisgICAgICAiRGVyaXZhdGl2ZSBXb3JrcyIgc2hhbGwgbWVhbiBhbnkgd29yaywgd2hldGhlciBpbiBTb3VyY2Ugb3IgT2JqZWN0CisgICAgICBmb3JtLCB0aGF0IGlzIGJhc2VkIG9uIChvciBkZXJpdmVkIGZyb20pIHRoZSBXb3JrIGFuZCBmb3Igd2hpY2ggdGhlCisgICAgICBlZGl0b3JpYWwgcmV2aXNpb25zLCBhbm5vdGF0aW9ucywgZWxhYm9yYXRpb25zLCBvciBvdGhlciBtb2RpZmljYXRpb25zCisgICAgICByZXByZXNlbnQsIGFzIGEgd2hvbGUsIGFuIG9yaWdpbmFsIHdvcmsgb2YgYXV0aG9yc2hpcC4gRm9yIHRoZSBwdXJwb3NlcworICAgICAgb2YgdGhpcyBMaWNlbnNlLCBEZXJpdmF0aXZlIFdvcmtzIHNoYWxsIG5vdCBpbmNsdWRlIHdvcmtzIHRoYXQgcmVtYWluCisgICAgICBzZXBhcmFibGUgZnJvbSwgb3IgbWVyZWx5IGxpbmsgKG9yIGJpbmQgYnkgbmFtZSkgdG8gdGhlIGludGVyZmFjZXMgb2YsCisgICAgICB0aGUgV29yayBhbmQgRGVyaXZhdGl2ZSBXb3JrcyB0aGVyZW9mLgorCisgICAgICAiQ29udHJpYnV0aW9uIiBzaGFsbCBtZWFuIGFueSB3b3JrIG9mIGF1dGhvcnNoaXAsIGluY2x1ZGluZworICAgICAgdGhlIG9yaWdpbmFsIHZlcnNpb24gb2YgdGhlIFdvcmsgYW5kIGFueSBtb2RpZmljYXRpb25zIG9yIGFkZGl0aW9ucworICAgICAgdG8gdGhhdCBXb3JrIG9yIERlcml2YXRpdmUgV29ya3MgdGhlcmVvZiwgdGhhdCBpcyBpbnRlbnRpb25hbGx5CisgICAgICBzdWJtaXR0ZWQgdG8gTGljZW5zb3IgZm9yIGluY2x1c2lvbiBpbiB0aGUgV29yayBieSB0aGUgY29weXJpZ2h0IG93bmVyCisgICAgICBvciBieSBhbiBpbmRpdmlkdWFsIG9yIExlZ2FsIEVudGl0eSBhdXRob3JpemVkIHRvIHN1Ym1pdCBvbiBiZWhhbGYgb2YKKyAgICAgIHRoZSBjb3B5cmlnaHQgb3duZXIuIEZvciB0aGUgcHVycG9zZXMgb2YgdGhpcyBkZWZpbml0aW9uLCAic3VibWl0dGVkIgorICAgICAgbWVhbnMgYW55IGZvcm0gb2YgZWxlY3Ryb25pYywgdmVyYmFsLCBvciB3cml0dGVuIGNvbW11bmljYXRpb24gc2VudAorICAgICAgdG8gdGhlIExpY2Vuc29yIG9yIGl0cyByZXByZXNlbnRhdGl2ZXMsIGluY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8KKyAgICAgIGNvbW11bmljYXRpb24gb24gZWxlY3Ryb25pYyBtYWlsaW5nIGxpc3RzLCBzb3VyY2UgY29kZSBjb250cm9sIHN5c3RlbXMsCisgICAgICBhbmQgaXNzdWUgdHJhY2tpbmcgc3lzdGVtcyB0aGF0IGFyZSBtYW5hZ2VkIGJ5LCBvciBvbiBiZWhhbGYgb2YsIHRoZQorICAgICAgTGljZW5zb3IgZm9yIHRoZSBwdXJwb3NlIG9mIGRpc2N1c3NpbmcgYW5kIGltcHJvdmluZyB0aGUgV29yaywgYnV0CisgICAgICBleGNsdWRpbmcgY29tbXVuaWNhdGlvbiB0aGF0IGlzIGNvbnNwaWN1b3VzbHkgbWFya2VkIG9yIG90aGVyd2lzZQorICAgICAgZGVzaWduYXRlZCBpbiB3cml0aW5nIGJ5IHRoZSBjb3B5cmlnaHQgb3duZXIgYXMgIk5vdCBhIENvbnRyaWJ1dGlvbi4iCisKKyAgICAgICJDb250cmlidXRvciIgc2hhbGwgbWVhbiBMaWNlbnNvciBhbmQgYW55IGluZGl2aWR1YWwgb3IgTGVnYWwgRW50aXR5CisgICAgICBvbiBiZWhhbGYgb2Ygd2hvbSBhIENvbnRyaWJ1dGlvbiBoYXMgYmVlbiByZWNlaXZlZCBieSBMaWNlbnNvciBhbmQKKyAgICAgIHN1YnNlcXVlbnRseSBpbmNvcnBvcmF0ZWQgd2l0aGluIHRoZSBXb3JrLgorCisgICAyLiBHcmFudCBvZiBDb3B5cmlnaHQgTGljZW5zZS4gU3ViamVjdCB0byB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YKKyAgICAgIHRoaXMgTGljZW5zZSwgZWFjaCBDb250cmlidXRvciBoZXJlYnkgZ3JhbnRzIHRvIFlvdSBhIHBlcnBldHVhbCwKKyAgICAgIHdvcmxkd2lkZSwgbm9uLWV4Y2x1c2l2ZSwgbm8tY2hhcmdlLCByb3lhbHR5LWZyZWUsIGlycmV2b2NhYmxlCisgICAgICBjb3B5cmlnaHQgbGljZW5zZSB0byByZXByb2R1Y2UsIHByZXBhcmUgRGVyaXZhdGl2ZSBXb3JrcyBvZiwKKyAgICAgIHB1YmxpY2x5IGRpc3BsYXksIHB1YmxpY2x5IHBlcmZvcm0sIHN1YmxpY2Vuc2UsIGFuZCBkaXN0cmlidXRlIHRoZQorICAgICAgV29yayBhbmQgc3VjaCBEZXJpdmF0aXZlIFdvcmtzIGluIFNvdXJjZSBvciBPYmplY3QgZm9ybS4KKworICAgMy4gR3JhbnQgb2YgUGF0ZW50IExpY2Vuc2UuIFN1YmplY3QgdG8gdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mCisgICAgICB0aGlzIExpY2Vuc2UsIGVhY2ggQ29udHJpYnV0b3IgaGVyZWJ5IGdyYW50cyB0byBZb3UgYSBwZXJwZXR1YWwsCisgICAgICB3b3JsZHdpZGUsIG5vbi1leGNsdXNpdmUsIG5vLWNoYXJnZSwgcm95YWx0eS1mcmVlLCBpcnJldm9jYWJsZQorICAgICAgKGV4Y2VwdCBhcyBzdGF0ZWQgaW4gdGhpcyBzZWN0aW9uKSBwYXRlbnQgbGljZW5zZSB0byBtYWtlLCBoYXZlIG1hZGUsCisgICAgICB1c2UsIG9mZmVyIHRvIHNlbGwsIHNlbGwsIGltcG9ydCwgYW5kIG90aGVyd2lzZSB0cmFuc2ZlciB0aGUgV29yaywKKyAgICAgIHdoZXJlIHN1Y2ggbGljZW5zZSBhcHBsaWVzIG9ubHkgdG8gdGhvc2UgcGF0ZW50IGNsYWltcyBsaWNlbnNhYmxlCisgICAgICBieSBzdWNoIENvbnRyaWJ1dG9yIHRoYXQgYXJlIG5lY2Vzc2FyaWx5IGluZnJpbmdlZCBieSB0aGVpcgorICAgICAgQ29udHJpYnV0aW9uKHMpIGFsb25lIG9yIGJ5IGNvbWJpbmF0aW9uIG9mIHRoZWlyIENvbnRyaWJ1dGlvbihzKQorICAgICAgd2l0aCB0aGUgV29yayB0byB3aGljaCBzdWNoIENvbnRyaWJ1dGlvbihzKSB3YXMgc3VibWl0dGVkLiBJZiBZb3UKKyAgICAgIGluc3RpdHV0ZSBwYXRlbnQgbGl0aWdhdGlvbiBhZ2FpbnN0IGFueSBlbnRpdHkgKGluY2x1ZGluZyBhCisgICAgICBjcm9zcy1jbGFpbSBvciBjb3VudGVyY2xhaW0gaW4gYSBsYXdzdWl0KSBhbGxlZ2luZyB0aGF0IHRoZSBXb3JrCisgICAgICBvciBhIENvbnRyaWJ1dGlvbiBpbmNvcnBvcmF0ZWQgd2l0aGluIHRoZSBXb3JrIGNvbnN0aXR1dGVzIGRpcmVjdAorICAgICAgb3IgY29udHJpYnV0b3J5IHBhdGVudCBpbmZyaW5nZW1lbnQsIHRoZW4gYW55IHBhdGVudCBsaWNlbnNlcworICAgICAgZ3JhbnRlZCB0byBZb3UgdW5kZXIgdGhpcyBMaWNlbnNlIGZvciB0aGF0IFdvcmsgc2hhbGwgdGVybWluYXRlCisgICAgICBhcyBvZiB0aGUgZGF0ZSBzdWNoIGxpdGlnYXRpb24gaXMgZmlsZWQuCisKKyAgIDQuIFJlZGlzdHJpYnV0aW9uLiBZb3UgbWF5IHJlcHJvZHVjZSBhbmQgZGlzdHJpYnV0ZSBjb3BpZXMgb2YgdGhlCisgICAgICBXb3JrIG9yIERlcml2YXRpdmUgV29ya3MgdGhlcmVvZiBpbiBhbnkgbWVkaXVtLCB3aXRoIG9yIHdpdGhvdXQKKyAgICAgIG1vZGlmaWNhdGlvbnMsIGFuZCBpbiBTb3VyY2Ugb3IgT2JqZWN0IGZvcm0sIHByb3ZpZGVkIHRoYXQgWW91CisgICAgICBtZWV0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoKKworICAgICAgKGEpIFlvdSBtdXN0IGdpdmUgYW55IG90aGVyIHJlY2lwaWVudHMgb2YgdGhlIFdvcmsgb3IKKyAgICAgICAgICBEZXJpdmF0aXZlIFdvcmtzIGEgY29weSBvZiB0aGlzIExpY2Vuc2U7IGFuZAorCisgICAgICAoYikgWW91IG11c3QgY2F1c2UgYW55IG1vZGlmaWVkIGZpbGVzIHRvIGNhcnJ5IHByb21pbmVudCBub3RpY2VzCisgICAgICAgICAgc3RhdGluZyB0aGF0IFlvdSBjaGFuZ2VkIHRoZSBmaWxlczsgYW5kCisKKyAgICAgIChjKSBZb3UgbXVzdCByZXRhaW4sIGluIHRoZSBTb3VyY2UgZm9ybSBvZiBhbnkgRGVyaXZhdGl2ZSBXb3JrcworICAgICAgICAgIHRoYXQgWW91IGRpc3RyaWJ1dGUsIGFsbCBjb3B5cmlnaHQsIHBhdGVudCwgdHJhZGVtYXJrLCBhbmQKKyAgICAgICAgICBhdHRyaWJ1dGlvbiBub3RpY2VzIGZyb20gdGhlIFNvdXJjZSBmb3JtIG9mIHRoZSBXb3JrLAorICAgICAgICAgIGV4Y2x1ZGluZyB0aG9zZSBub3RpY2VzIHRoYXQgZG8gbm90IHBlcnRhaW4gdG8gYW55IHBhcnQgb2YKKyAgICAgICAgICB0aGUgRGVyaXZhdGl2ZSBXb3JrczsgYW5kCisKKyAgICAgIChkKSBJZiB0aGUgV29yayBpbmNsdWRlcyBhICJOT1RJQ0UiIHRleHQgZmlsZSBhcyBwYXJ0IG9mIGl0cworICAgICAgICAgIGRpc3RyaWJ1dGlvbiwgdGhlbiBhbnkgRGVyaXZhdGl2ZSBXb3JrcyB0aGF0IFlvdSBkaXN0cmlidXRlIG11c3QKKyAgICAgICAgICBpbmNsdWRlIGEgcmVhZGFibGUgY29weSBvZiB0aGUgYXR0cmlidXRpb24gbm90aWNlcyBjb250YWluZWQKKyAgICAgICAgICB3aXRoaW4gc3VjaCBOT1RJQ0UgZmlsZSwgZXhjbHVkaW5nIHRob3NlIG5vdGljZXMgdGhhdCBkbyBub3QKKyAgICAgICAgICBwZXJ0YWluIHRvIGFueSBwYXJ0IG9mIHRoZSBEZXJpdmF0aXZlIFdvcmtzLCBpbiBhdCBsZWFzdCBvbmUKKyAgICAgICAgICBvZiB0aGUgZm9sbG93aW5nIHBsYWNlczogd2l0aGluIGEgTk9USUNFIHRleHQgZmlsZSBkaXN0cmlidXRlZAorICAgICAgICAgIGFzIHBhcnQgb2YgdGhlIERlcml2YXRpdmUgV29ya3M7IHdpdGhpbiB0aGUgU291cmNlIGZvcm0gb3IKKyAgICAgICAgICBkb2N1bWVudGF0aW9uLCBpZiBwcm92aWRlZCBhbG9uZyB3aXRoIHRoZSBEZXJpdmF0aXZlIFdvcmtzOyBvciwKKyAgICAgICAgICB3aXRoaW4gYSBkaXNwbGF5IGdlbmVyYXRlZCBieSB0aGUgRGVyaXZhdGl2ZSBXb3JrcywgaWYgYW5kCisgICAgICAgICAgd2hlcmV2ZXIgc3VjaCB0aGlyZC1wYXJ0eSBub3RpY2VzIG5vcm1hbGx5IGFwcGVhci4gVGhlIGNvbnRlbnRzCisgICAgICAgICAgb2YgdGhlIE5PVElDRSBmaWxlIGFyZSBmb3IgaW5mb3JtYXRpb25hbCBwdXJwb3NlcyBvbmx5IGFuZAorICAgICAgICAgIGRvIG5vdCBtb2RpZnkgdGhlIExpY2Vuc2UuIFlvdSBtYXkgYWRkIFlvdXIgb3duIGF0dHJpYnV0aW9uCisgICAgICAgICAgbm90aWNlcyB3aXRoaW4gRGVyaXZhdGl2ZSBXb3JrcyB0aGF0IFlvdSBkaXN0cmlidXRlLCBhbG9uZ3NpZGUKKyAgICAgICAgICBvciBhcyBhbiBhZGRlbmR1bSB0byB0aGUgTk9USUNFIHRleHQgZnJvbSB0aGUgV29yaywgcHJvdmlkZWQKKyAgICAgICAgICB0aGF0IHN1Y2ggYWRkaXRpb25hbCBhdHRyaWJ1dGlvbiBub3RpY2VzIGNhbm5vdCBiZSBjb25zdHJ1ZWQKKyAgICAgICAgICBhcyBtb2RpZnlpbmcgdGhlIExpY2Vuc2UuCisKKyAgICAgIFlvdSBtYXkgYWRkIFlvdXIgb3duIGNvcHlyaWdodCBzdGF0ZW1lbnQgdG8gWW91ciBtb2RpZmljYXRpb25zIGFuZAorICAgICAgbWF5IHByb3ZpZGUgYWRkaXRpb25hbCBvciBkaWZmZXJlbnQgbGljZW5zZSB0ZXJtcyBhbmQgY29uZGl0aW9ucworICAgICAgZm9yIHVzZSwgcmVwcm9kdWN0aW9uLCBvciBkaXN0cmlidXRpb24gb2YgWW91ciBtb2RpZmljYXRpb25zLCBvcgorICAgICAgZm9yIGFueSBzdWNoIERlcml2YXRpdmUgV29ya3MgYXMgYSB3aG9sZSwgcHJvdmlkZWQgWW91ciB1c2UsCisgICAgICByZXByb2R1Y3Rpb24sIGFuZCBkaXN0cmlidXRpb24gb2YgdGhlIFdvcmsgb3RoZXJ3aXNlIGNvbXBsaWVzIHdpdGgKKyAgICAgIHRoZSBjb25kaXRpb25zIHN0YXRlZCBpbiB0aGlzIExpY2Vuc2UuCisKKyAgIDUuIFN1Ym1pc3Npb24gb2YgQ29udHJpYnV0aW9ucy4gVW5sZXNzIFlvdSBleHBsaWNpdGx5IHN0YXRlIG90aGVyd2lzZSwKKyAgICAgIGFueSBDb250cmlidXRpb24gaW50ZW50aW9uYWxseSBzdWJtaXR0ZWQgZm9yIGluY2x1c2lvbiBpbiB0aGUgV29yaworICAgICAgYnkgWW91IHRvIHRoZSBMaWNlbnNvciBzaGFsbCBiZSB1bmRlciB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YKKyAgICAgIHRoaXMgTGljZW5zZSwgd2l0aG91dCBhbnkgYWRkaXRpb25hbCB0ZXJtcyBvciBjb25kaXRpb25zLgorICAgICAgTm90d2l0aHN0YW5kaW5nIHRoZSBhYm92ZSwgbm90aGluZyBoZXJlaW4gc2hhbGwgc3VwZXJzZWRlIG9yIG1vZGlmeQorICAgICAgdGhlIHRlcm1zIG9mIGFueSBzZXBhcmF0ZSBsaWNlbnNlIGFncmVlbWVudCB5b3UgbWF5IGhhdmUgZXhlY3V0ZWQKKyAgICAgIHdpdGggTGljZW5zb3IgcmVnYXJkaW5nIHN1Y2ggQ29udHJpYnV0aW9ucy4KKworICAgNi4gVHJhZGVtYXJrcy4gVGhpcyBMaWNlbnNlIGRvZXMgbm90IGdyYW50IHBlcm1pc3Npb24gdG8gdXNlIHRoZSB0cmFkZQorICAgICAgbmFtZXMsIHRyYWRlbWFya3MsIHNlcnZpY2UgbWFya3MsIG9yIHByb2R1Y3QgbmFtZXMgb2YgdGhlIExpY2Vuc29yLAorICAgICAgZXhjZXB0IGFzIHJlcXVpcmVkIGZvciByZWFzb25hYmxlIGFuZCBjdXN0b21hcnkgdXNlIGluIGRlc2NyaWJpbmcgdGhlCisgICAgICBvcmlnaW4gb2YgdGhlIFdvcmsgYW5kIHJlcHJvZHVjaW5nIHRoZSBjb250ZW50IG9mIHRoZSBOT1RJQ0UgZmlsZS4KKworICAgNy4gRGlzY2xhaW1lciBvZiBXYXJyYW50eS4gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yCisgICAgICBhZ3JlZWQgdG8gaW4gd3JpdGluZywgTGljZW5zb3IgcHJvdmlkZXMgdGhlIFdvcmsgKGFuZCBlYWNoCisgICAgICBDb250cmlidXRvciBwcm92aWRlcyBpdHMgQ29udHJpYnV0aW9ucykgb24gYW4gIkFTIElTIiBCQVNJUywKKyAgICAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvcgorICAgICAgaW1wbGllZCwgaW5jbHVkaW5nLCB3aXRob3V0IGxpbWl0YXRpb24sIGFueSB3YXJyYW50aWVzIG9yIGNvbmRpdGlvbnMKKyAgICAgIG9mIFRJVExFLCBOT04tSU5GUklOR0VNRU5ULCBNRVJDSEFOVEFCSUxJVFksIG9yIEZJVE5FU1MgRk9SIEEKKyAgICAgIFBBUlRJQ1VMQVIgUFVSUE9TRS4gWW91IGFyZSBzb2xlbHkgcmVzcG9uc2libGUgZm9yIGRldGVybWluaW5nIHRoZQorICAgICAgYXBwcm9wcmlhdGVuZXNzIG9mIHVzaW5nIG9yIHJlZGlzdHJpYnV0aW5nIHRoZSBXb3JrIGFuZCBhc3N1bWUgYW55CisgICAgICByaXNrcyBhc3NvY2lhdGVkIHdpdGggWW91ciBleGVyY2lzZSBvZiBwZXJtaXNzaW9ucyB1bmRlciB0aGlzIExpY2Vuc2UuCisKKyAgIDguIExpbWl0YXRpb24gb2YgTGlhYmlsaXR5LiBJbiBubyBldmVudCBhbmQgdW5kZXIgbm8gbGVnYWwgdGhlb3J5LAorICAgICAgd2hldGhlciBpbiB0b3J0IChpbmNsdWRpbmcgbmVnbGlnZW5jZSksIGNvbnRyYWN0LCBvciBvdGhlcndpc2UsCisgICAgICB1bmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgKHN1Y2ggYXMgZGVsaWJlcmF0ZSBhbmQgZ3Jvc3NseQorICAgICAgbmVnbGlnZW50IGFjdHMpIG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzaGFsbCBhbnkgQ29udHJpYnV0b3IgYmUKKyAgICAgIGxpYWJsZSB0byBZb3UgZm9yIGRhbWFnZXMsIGluY2x1ZGluZyBhbnkgZGlyZWN0LCBpbmRpcmVjdCwgc3BlY2lhbCwKKyAgICAgIGluY2lkZW50YWwsIG9yIGNvbnNlcXVlbnRpYWwgZGFtYWdlcyBvZiBhbnkgY2hhcmFjdGVyIGFyaXNpbmcgYXMgYQorICAgICAgcmVzdWx0IG9mIHRoaXMgTGljZW5zZSBvciBvdXQgb2YgdGhlIHVzZSBvciBpbmFiaWxpdHkgdG8gdXNlIHRoZQorICAgICAgV29yayAoaW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0byBkYW1hZ2VzIGZvciBsb3NzIG9mIGdvb2R3aWxsLAorICAgICAgd29yayBzdG9wcGFnZSwgY29tcHV0ZXIgZmFpbHVyZSBvciBtYWxmdW5jdGlvbiwgb3IgYW55IGFuZCBhbGwKKyAgICAgIG90aGVyIGNvbW1lcmNpYWwgZGFtYWdlcyBvciBsb3NzZXMpLCBldmVuIGlmIHN1Y2ggQ29udHJpYnV0b3IKKyAgICAgIGhhcyBiZWVuIGFkdmlzZWQgb2YgdGhlIHBvc3NpYmlsaXR5IG9mIHN1Y2ggZGFtYWdlcy4KKworICAgOS4gQWNjZXB0aW5nIFdhcnJhbnR5IG9yIEFkZGl0aW9uYWwgTGlhYmlsaXR5LiBXaGlsZSByZWRpc3RyaWJ1dGluZworICAgICAgdGhlIFdvcmsgb3IgRGVyaXZhdGl2ZSBXb3JrcyB0aGVyZW9mLCBZb3UgbWF5IGNob29zZSB0byBvZmZlciwKKyAgICAgIGFuZCBjaGFyZ2UgYSBmZWUgZm9yLCBhY2NlcHRhbmNlIG9mIHN1cHBvcnQsIHdhcnJhbnR5LCBpbmRlbW5pdHksCisgICAgICBvciBvdGhlciBsaWFiaWxpdHkgb2JsaWdhdGlvbnMgYW5kL29yIHJpZ2h0cyBjb25zaXN0ZW50IHdpdGggdGhpcworICAgICAgTGljZW5zZS4gSG93ZXZlciwgaW4gYWNjZXB0aW5nIHN1Y2ggb2JsaWdhdGlvbnMsIFlvdSBtYXkgYWN0IG9ubHkKKyAgICAgIG9uIFlvdXIgb3duIGJlaGFsZiBhbmQgb24gWW91ciBzb2xlIHJlc3BvbnNpYmlsaXR5LCBub3Qgb24gYmVoYWxmCisgICAgICBvZiBhbnkgb3RoZXIgQ29udHJpYnV0b3IsIGFuZCBvbmx5IGlmIFlvdSBhZ3JlZSB0byBpbmRlbW5pZnksCisgICAgICBkZWZlbmQsIGFuZCBob2xkIGVhY2ggQ29udHJpYnV0b3IgaGFybWxlc3MgZm9yIGFueSBsaWFiaWxpdHkKKyAgICAgIGluY3VycmVkIGJ5LCBvciBjbGFpbXMgYXNzZXJ0ZWQgYWdhaW5zdCwgc3VjaCBDb250cmlidXRvciBieSByZWFzb24KKyAgICAgIG9mIHlvdXIgYWNjZXB0aW5nIGFueSBzdWNoIHdhcnJhbnR5IG9yIGFkZGl0aW9uYWwgbGlhYmlsaXR5LgorCisgICBFTkQgT0YgVEVSTVMgQU5EIENPTkRJVElPTlMKKwpkaWZmIC0tZ2l0IGEvZXh5bm9zNC9oYWwvbGlibGlnaHRzL2xpZ2h0cy5jIGIvZXh5bm9zNC9oYWwvbGlibGlnaHRzL2xpZ2h0cy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjA2YmI1ZjgKLS0tIC9kZXYvbnVsbAorKysgYi9leHlub3M0L2hhbC9saWJsaWdodHMvbGlnaHRzLmMKQEAgLTAsMCArMSwyNDAgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTEgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICogQ29weXJpZ2h0IChDKSAyMDExIFRoZSBDeWFub2dlbk1vZCBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKworI2RlZmluZSBMT0dfVEFHICJsaWdodHMiCisjZGVmaW5lIExPR19OREVCVUcgMAorCisjaW5jbHVkZSA8Y3V0aWxzL2xvZy5oPgorCisjaW5jbHVkZSA8c3RkaW50Lmg+CisjaW5jbHVkZSA8c3RyaW5nLmg+CisjaW5jbHVkZSA8dW5pc3RkLmg+CisjaW5jbHVkZSA8ZXJybm8uaD4KKyNpbmNsdWRlIDxmY250bC5oPgorI2luY2x1ZGUgPHB0aHJlYWQuaD4KKworI2luY2x1ZGUgPHN5cy9pb2N0bC5oPgorI2luY2x1ZGUgPHN5cy90eXBlcy5oPgorCisjaW5jbHVkZSA8aGFyZHdhcmUvbGlnaHRzLmg+CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK3N0YXRpYyBwdGhyZWFkX29uY2VfdCBnX2luaXQgPSBQVEhSRUFEX09OQ0VfSU5JVDsKK3N0YXRpYyBwdGhyZWFkX211dGV4X3QgZ19sb2NrID0gUFRIUkVBRF9NVVRFWF9JTklUSUFMSVpFUjsKK3N0YXRpYyBpbnQgZ19lbmFibGVfdG91Y2hsaWdodCA9IC0xOworCitjaGFyIGNvbnN0KmNvbnN0IFBBTkVMX0ZJTEUKKyAgICAgICAgPSAiL3N5cy9jbGFzcy9iYWNrbGlnaHQvcGFuZWwvYnJpZ2h0bmVzcyI7CisKK2NoYXIgY29uc3QqY29uc3QgQlVUVE9OX1BPV0VSCisgICAgICAgID0gIi9zeXMvY2xhc3Mvc2VjL3NlY190b3VjaGtleS9lbmFibGVfZGlzYWJsZSI7CisKK2NoYXIgY29uc3QqY29uc3QgQlVUVE9OX0ZJTEUKKyAgICAgICAgPSAiL3N5cy9jbGFzcy9zZWMvc2VjX3RvdWNoa2V5L2JyaWdodG5lc3MiOworCit2b2lkIGluaXRfZ2xvYmFscyh2b2lkKQoreworICAgIC8vIGluaXQgdGhlIG11dGV4CisgICAgcHRocmVhZF9tdXRleF9pbml0KCZnX2xvY2ssIE5VTEwpOworfQorCit2b2lkCitsb2FkX3NldHRpbmdzKCkKK3sKKyAgICBGSUxFKiBmcCA9IGZvcGVuKCIvZGF0YS8uZGlzYWJsZV90b3VjaGxpZ2h0IiwgInIiKTsKKyAgICBpZiAoIWZwKSB7CisgICAgICAgIGdfZW5hYmxlX3RvdWNobGlnaHQgPSAxOworICAgIH0gZWxzZSB7CisgICAgICAgIGdfZW5hYmxlX3RvdWNobGlnaHQgPSAoaW50KShmZ2V0YyhmcCkpOworICAgICAgICBpZiAoZ19lbmFibGVfdG91Y2hsaWdodCA9PSAnMScpCisgICAgICAgICAgICBnX2VuYWJsZV90b3VjaGxpZ2h0ID0gMTsKKyAgICAgICAgZWxzZQorICAgICAgICAgICAgZ19lbmFibGVfdG91Y2hsaWdodCA9IDA7CisKKyAgICAgICAgZmNsb3NlKGZwKTsKKyAgICB9Cit9CisKK3N0YXRpYyBpbnQKK3dyaXRlX2ludChjaGFyIGNvbnN0KiBwYXRoLCBpbnQgdmFsdWUpCit7CisgICAgaW50IGZkOworICAgIHN0YXRpYyBpbnQgYWxyZWFkeV93YXJuZWQgPSAwOworCisgICAgZmQgPSBvcGVuKHBhdGgsIE9fUkRXUik7CisgICAgaWYgKGZkID49IDApIHsKKyAgICAgICAgY2hhciBidWZmZXJbMjBdOworICAgICAgICBpbnQgYnl0ZXMgPSBzcHJpbnRmKGJ1ZmZlciwgIiVkXG4iLCB2YWx1ZSk7CisgICAgICAgIGludCBhbXQgPSB3cml0ZShmZCwgYnVmZmVyLCBieXRlcyk7CisgICAgICAgIGNsb3NlKGZkKTsKKyAgICAgICAgcmV0dXJuIGFtdCA9PSAtMSA/IC1lcnJubyA6IDA7CisgICAgfSBlbHNlIHsKKyAgICAgICAgaWYgKGFscmVhZHlfd2FybmVkID09IDApIHsKKyAgICAgICAgICAgIExPR0UoIndyaXRlX2ludCBmYWlsZWQgdG8gb3BlbiAlc1xuIiwgcGF0aCk7CisgICAgICAgICAgICBhbHJlYWR5X3dhcm5lZCA9IDE7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIC1lcnJubzsKKyAgICB9Cit9CisKK3N0YXRpYyBpbnQKK2lzX2xpdChzdHJ1Y3QgbGlnaHRfc3RhdGVfdCBjb25zdCogc3RhdGUpCit7CisgICAgcmV0dXJuIHN0YXRlLT5jb2xvciAmIDB4MDBmZmZmZmY7Cit9CisKK3N0YXRpYyBpbnQKK3JnYl90b19icmlnaHRuZXNzKHN0cnVjdCBsaWdodF9zdGF0ZV90IGNvbnN0KiBzdGF0ZSkKK3sKKyAgICBpbnQgY29sb3IgPSBzdGF0ZS0+Y29sb3IgJiAweDAwZmZmZmZmOworICAgIHJldHVybiAoKDc3KigoY29sb3I+PjE2KSYweDAwZmYpKQorICAgICAgICAgICAgKyAoMTUwKigoY29sb3I+PjgpJjB4MDBmZikpICsgKDI5Kihjb2xvciYweDAwZmYpKSkgPj4gODsKK30KKworc3RhdGljIGludAorc2V0X2xpZ2h0X2JhY2tsaWdodChzdHJ1Y3QgbGlnaHRfZGV2aWNlX3QqIGRldiwKKyAgICAgICAgc3RydWN0IGxpZ2h0X3N0YXRlX3QgY29uc3QqIHN0YXRlKQoreworICAgICAgICBsb2FkX3NldHRpbmdzKCk7CisKKyAgICBpbnQgZXJyID0gMDsKKyAgICBpbnQgYnJpZ2h0bmVzcyA9IHJnYl90b19icmlnaHRuZXNzKHN0YXRlKTsKKworICAgIHB0aHJlYWRfbXV0ZXhfbG9jaygmZ19sb2NrKTsKKyAgICBlcnIgPSB3cml0ZV9pbnQoUEFORUxfRklMRSwgYnJpZ2h0bmVzcyk7CisKKyAgICBpZiAoZ19lbmFibGVfdG91Y2hsaWdodCA9PSAtMSB8fCBnX2VuYWJsZV90b3VjaGxpZ2h0ID4gMCkKKyAgICAgICAgZXJyID0gd3JpdGVfaW50KEJVVFRPTl9GSUxFLCBicmlnaHRuZXNzID4gMCA/IDEgOiAwKTsKKworICAgIHB0aHJlYWRfbXV0ZXhfdW5sb2NrKCZnX2xvY2spOworCisgICAgcmV0dXJuIGVycjsKK30KKworc3RhdGljIGludAorc2V0X2xpZ2h0X2tleWJvYXJkKHN0cnVjdCBsaWdodF9kZXZpY2VfdCogZGV2LAorICAgICAgICBzdHJ1Y3QgbGlnaHRfc3RhdGVfdCBjb25zdCogc3RhdGUpCit7CisgICAgcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQKK3NldF9saWdodF9idXR0b25zKHN0cnVjdCBsaWdodF9kZXZpY2VfdCogZGV2LAorICAgICAgICBzdHJ1Y3QgbGlnaHRfc3RhdGVfdCBjb25zdCogc3RhdGUpCit7CisgICAgaW50IGVyciA9IDA7CisgICAgaW50IG9uID0gaXNfbGl0KHN0YXRlKTsKKworICAgIHB0aHJlYWRfbXV0ZXhfbG9jaygmZ19sb2NrKTsKKyAgICBMT0dEKCJzZXRfbGlnaHRfYnV0dG9uIG9uPSVkXG4iLCBvbiA/IDEgOiAwKTsKKyAgICBlcnIgPSB3cml0ZV9pbnQoQlVUVE9OX0ZJTEUsIG9uID8gMTowKTsKKyAgICBwdGhyZWFkX211dGV4X3VubG9jaygmZ19sb2NrKTsKKworICAgIHJldHVybiBlcnI7Cit9CisKK3N0YXRpYyBpbnQKK3NldF9saWdodF9iYXR0ZXJ5KHN0cnVjdCBsaWdodF9kZXZpY2VfdCogZGV2LAorICAgICAgICBzdHJ1Y3QgbGlnaHRfc3RhdGVfdCBjb25zdCogc3RhdGUpCit7CisgICAgcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQKK3NldF9saWdodF9ub3RpZmljYXRpb24oc3RydWN0IGxpZ2h0X2RldmljZV90KiBkZXYsCisgICAgICAgIHN0cnVjdCBsaWdodF9zdGF0ZV90IGNvbnN0KiBzdGF0ZSkKK3sKKyAgICByZXR1cm4gMDsKK30KKworc3RhdGljIGludAorc2V0X2xpZ2h0X2F0dGVudGlvbihzdHJ1Y3QgbGlnaHRfZGV2aWNlX3QqIGRldiwKKyAgICAgICAgc3RydWN0IGxpZ2h0X3N0YXRlX3QgY29uc3QqIHN0YXRlKQoreworICAgIHJldHVybiAwOworfQorCitzdGF0aWMgaW50CitjbG9zZV9saWdodHMoc3RydWN0IGxpZ2h0X2RldmljZV90ICpkZXYpCit7CisgICAgaWYgKGRldikgeworICAgICAgICBmcmVlKGRldik7CisgICAgfQorICAgIHJldHVybiAwOworfQorCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitzdGF0aWMgaW50IG9wZW5fbGlnaHRzKGNvbnN0IHN0cnVjdCBod19tb2R1bGVfdCogbW9kdWxlLCBjaGFyIGNvbnN0KiBuYW1lLAorICAgICAgICBzdHJ1Y3QgaHdfZGV2aWNlX3QqKiBkZXZpY2UpCit7CisgICAgaW50ICgqc2V0X2xpZ2h0KShzdHJ1Y3QgbGlnaHRfZGV2aWNlX3QqIGRldiwKKyAgICAgICAgICAgIHN0cnVjdCBsaWdodF9zdGF0ZV90IGNvbnN0KiBzdGF0ZSk7CisKKyAgICBpZiAoMCA9PSBzdHJjbXAoTElHSFRfSURfQkFDS0xJR0hULCBuYW1lKSkgeworICAgICAgICBzZXRfbGlnaHQgPSBzZXRfbGlnaHRfYmFja2xpZ2h0OworICAgIH0KKyAgICBlbHNlIGlmICgwID09IHN0cmNtcChMSUdIVF9JRF9LRVlCT0FSRCwgbmFtZSkpIHsKKyAgICAgICAgc2V0X2xpZ2h0ID0gc2V0X2xpZ2h0X2tleWJvYXJkOworICAgIH0KKyAgICBlbHNlIGlmICgwID09IHN0cmNtcChMSUdIVF9JRF9CVVRUT05TLCBuYW1lKSkgeworICAgICAgICBzZXRfbGlnaHQgPSBzZXRfbGlnaHRfYnV0dG9uczsKKyAgICB9CisgICAgZWxzZSBpZiAoMCA9PSBzdHJjbXAoTElHSFRfSURfQkFUVEVSWSwgbmFtZSkpIHsKKyAgICAgICAgc2V0X2xpZ2h0ID0gc2V0X2xpZ2h0X2JhdHRlcnk7CisgICAgfQorICAgIGVsc2UgaWYgKDAgPT0gc3RyY21wKExJR0hUX0lEX05PVElGSUNBVElPTlMsIG5hbWUpKSB7CisgICAgICAgIHNldF9saWdodCA9IHNldF9saWdodF9ub3RpZmljYXRpb247CisgICAgfQorICAgIGVsc2UgaWYgKDAgPT0gc3RyY21wKExJR0hUX0lEX0FUVEVOVElPTiwgbmFtZSkpIHsKKyAgICAgICAgc2V0X2xpZ2h0ID0gc2V0X2xpZ2h0X2F0dGVudGlvbjsKKyAgICB9CisgICAgZWxzZSB7CisgICAgICAgIHJldHVybiAtRUlOVkFMOworICAgIH0KKworICAgIHB0aHJlYWRfb25jZSgmZ19pbml0LCBpbml0X2dsb2JhbHMpOworCisgICAgc3RydWN0IGxpZ2h0X2RldmljZV90ICpkZXYgPSBtYWxsb2Moc2l6ZW9mKHN0cnVjdCBsaWdodF9kZXZpY2VfdCkpOworICAgIG1lbXNldChkZXYsIDAsIHNpemVvZigqZGV2KSk7CisKKyAgICBkZXYtPmNvbW1vbi50YWcgPSBIQVJEV0FSRV9ERVZJQ0VfVEFHOworICAgIGRldi0+Y29tbW9uLnZlcnNpb24gPSAwOworICAgIGRldi0+Y29tbW9uLm1vZHVsZSA9IChzdHJ1Y3QgaHdfbW9kdWxlX3QqKW1vZHVsZTsKKyAgICBkZXYtPmNvbW1vbi5jbG9zZSA9IChpbnQgKCopKHN0cnVjdCBod19kZXZpY2VfdCopKWNsb3NlX2xpZ2h0czsKKyAgICBkZXYtPnNldF9saWdodCA9IHNldF9saWdodDsKKworICAgICpkZXZpY2UgPSAoc3RydWN0IGh3X2RldmljZV90KilkZXY7CisgICAgcmV0dXJuIDA7Cit9CisKKworc3RhdGljIHN0cnVjdCBod19tb2R1bGVfbWV0aG9kc190IGxpZ2h0c19tb2R1bGVfbWV0aG9kcyA9IHsKKyAgICAub3BlbiA9ICBvcGVuX2xpZ2h0cywKK307CisKK2NvbnN0IHN0cnVjdCBod19tb2R1bGVfdCBIQUxfTU9EVUxFX0lORk9fU1lNID0geworICAgIC50YWcgPSBIQVJEV0FSRV9NT0RVTEVfVEFHLAorICAgIC52ZXJzaW9uX21ham9yID0gMSwKKyAgICAudmVyc2lvbl9taW5vciA9IDAsCisgICAgLmlkID0gTElHSFRTX0hBUkRXQVJFX01PRFVMRV9JRCwKKyAgICAubmFtZSA9ICJTYW1zdW5nIEV4eW5vczQyMTAgTGlnaHRzIE1vZHVsZSIsCisgICAgLmF1dGhvciA9ICJUaGUgQ3lhbm9nZW5Nb2QgUHJvamVjdCIsCisgICAgLm1ldGhvZHMgPSAmbGlnaHRzX21vZHVsZV9tZXRob2RzLAorfTsKZGlmZiAtLWdpdCBhL2V4eW5vczQvaGFsL2xpYnM1cGpwZWcvQW5kcm9pZC5tayBiL2V4eW5vczQvaGFsL2xpYnM1cGpwZWcvQW5kcm9pZC5tawpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lMWFjMTg3Ci0tLSAvZGV2L251bGwKKysrIGIvZXh5bm9zNC9oYWwvbGliczVwanBlZy9BbmRyb2lkLm1rCkBAIC0wLDAgKzEsMzQgQEAKKyMgQ29weXJpZ2h0IChDKSAyMDA4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyMKKyMgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisjIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyMgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisjCisjICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisjCisjIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyMgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisjIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyMgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisKK0xPQ0FMX1BBVEg6PSAkKGNhbGwgbXktZGlyKQoraW5jbHVkZSAkKENMRUFSX1ZBUlMpCisKK0xPQ0FMX0NfSU5DTFVERVMgOj0gXAorICAgICQoTE9DQUxfUEFUSCkgXAorICAgICQoQk9BUkRfSEFMX1BBVEgpL2luY2x1ZGUgXAorCitMT0NBTF9TUkNfRklMRVM6PSBcCisJanBlZ19hcGkuYyBcCisKK0xPQ0FMX1NIQVJFRF9MSUJSQVJJRVM6PSBsaWJsb2cKK0xPQ0FMX1NIQVJFRF9MSUJSQVJJRVMrPSBsaWJkbAorCitMT0NBTF9NT0RVTEVfVEFHUyA6PSBlbmcKKworTE9DQUxfTU9EVUxFOj0gbGliczVwanBlZworCitMT0NBTF9QUkVMSU5LX01PRFVMRSA6PSBmYWxzZQorCitpbmNsdWRlICQoQlVJTERfU0hBUkVEX0xJQlJBUlkpCmRpZmYgLS1naXQgYS9leHlub3M0L2hhbC9saWJzNXBqcGVnL2pwZWdfYXBpLmMgYi9leHlub3M0L2hhbC9saWJzNXBqcGVnL2pwZWdfYXBpLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZWI4MGUwNwotLS0gL2Rldi9udWxsCisrKyBiL2V4eW5vczQvaGFsL2xpYnM1cGpwZWcvanBlZ19hcGkuYwpAQCAtMCwwICsxLDM0NyBAQAorLyoKKyoqCisqKiBDb3B5cmlnaHQgMjAwOCwgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorKiogQ29weXJpZ2h0IDIwMTAsIFNhbXN1bmcgRWxlY3Ryb25pY3MgQ28uIExURAorKioKKyoqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworKiogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorKiogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisqKgorKiogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorKioKKyoqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyoqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisqKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyoqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyoqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorKi8KKworLy8jZGVmaW5lIExPR19OREVCVUcgMAorI2RlZmluZSBMT0dfVEFHICJKcGVnLWFwaSIKKworI2luY2x1ZGUgPHV0aWxzL0xvZy5oPgorI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8c3RkbGliLmg+CisjaW5jbHVkZSA8c3lzL3R5cGVzLmg+CisjaW5jbHVkZSA8c3lzL3N0YXQuaD4KKyNpbmNsdWRlIDxzeXMvaW9jdGwuaD4KKyNpbmNsdWRlIDxmY250bC5oPgorI2luY2x1ZGUgPGN0eXBlLmg+CisjaW5jbHVkZSA8dW5pc3RkLmg+CisjaW5jbHVkZSA8c3lzL21tYW4uaD4KKyNpbmNsdWRlIDxzdHJpbmcuaD4KKyNpbmNsdWRlIDxlcnJuby5oPgorI2luY2x1ZGUgPHN5cy90aW1lLmg+CisjaW5jbHVkZSA8c2lnbmFsLmg+CisjaW5jbHVkZSA8bWF0aC5oPgorI2luY2x1ZGUgPHN5cy9wb2xsLmg+CisKKyNpZmRlZiBTNVBfVk1FTQorI2luY2x1ZGUgInM1cF92bWVtX2FwaS5oIgorI2VuZGlmCisjaW5jbHVkZSAianBlZ19hcGkuaCIKKworc3RhdGljIHN0cnVjdCBqcGVnX2xpYiAgKmpwZWdfY3R4ID0gTlVMTDsKKyNpZmRlZiBTNVBfVk1FTQorc3RhdGljIGludCBtZW1fZnA7Cit1bnNpZ25lZCBpbnQgY29va2llOworI2VuZGlmIC8qIFM1UF9WTUVNICovCisKK3N0YXRpYyB1bnNpZ25lZCBpbnQgZ2V0X3l1dl9zaXplKGVudW0ganBlZ19mcmFtZV9mb3JtYXQgb3V0X2Zvcm1hdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgaW50IHdpZHRoLCB1bnNpZ25lZCBpbnQgaGVpZ2h0KQoreworICAgIHN3aXRjaCAob3V0X2Zvcm1hdCkgeworICAgIGNhc2UgWVVWXzQyMiA6CisgICAgICAgIGlmICh3aWR0aCAlIDE2ICE9IDApCisgICAgICAgICAgICB3aWR0aCArPSAxNiAtICh3aWR0aCAlIDE2KTsKKyAgICAgICAgaWYgKGhlaWdodCAlIDggIT0gMCkKKyAgICAgICAgICAgIGhlaWdodCArPSA4IC0gKGhlaWdodCAlIDgpOworICAgICAgICBicmVhazsKKworICAgIGNhc2UgWVVWXzQyMCA6CisgICAgICAgIGlmICh3aWR0aCAlIDE2ICE9IDApCisgICAgICAgICAgICB3aWR0aCArPSAxNiAtICh3aWR0aCAlIDE2KTsKKyAgICAgICAgaWYgKGhlaWdodCAlIDE2ICE9IDApCisgICAgICAgICAgICBoZWlnaHQgKz0gMTYgLSAoaGVpZ2h0ICUgMTYpOworICAgICAgICBicmVhazsKKworICAgIGRlZmF1bHQ6CisgICAgICAgIExPR1YoImdldF95dXZfc2l6ZSByZXR1cm4gZm10KCVkKVxuIiwgb3V0X2Zvcm1hdCk7CisgICAgICAgIHJldHVybigwKTsKKyAgICB9CisKKyAgICBMT0dWKCJnZXRfeXV2X3NpemUgd2lkdGgoJWQpIGhlaWdodCglZClcbiIsIHdpZHRoLCBoZWlnaHQpOworCisgICAgc3dpdGNoIChvdXRfZm9ybWF0KSB7CisgICAgY2FzZSBZVVZfNDIyIDoKKyAgICAgICAgcmV0dXJuKHdpZHRoKmhlaWdodCoyKTsKKyAgICBjYXNlIFlVVl80MjAgOgorICAgICAgICByZXR1cm4oKHdpZHRoKmhlaWdodCkgKyAod2lkdGgqaGVpZ2h0ID4+IDEpKTsKKyAgICBkZWZhdWx0IDoKKyAgICAgICAgcmV0dXJuKDApOworICAgIH0KK30KKworc3RhdGljIGludCBjaGVja19pbnB1dF9zaXplKHVuc2lnbmVkIGludCB3aWR0aCwgdW5zaWduZWQgaW50IGhlaWdodCkKK3sKKyAgICBpZiAoKHdpZHRoICUgMTYpICE9IDAgfHwgKGhlaWdodCAlIDgpICE9IDApCisgICAgICAgIHJldHVybiAtMTsKKworICAgIHJldHVybiAwOworfQorCitzdGF0aWMgdm9pZCBpbml0X2RlY29kZV9wYXJhbSh2b2lkKQoreworICAgIGpwZWdfY3R4ID0gKHN0cnVjdCBqcGVnX2xpYiAqKW1hbGxvYyhzaXplb2Yoc3RydWN0IGpwZWdfbGliKSk7CisgICAgbWVtc2V0KGpwZWdfY3R4LCAweDAwLCBzaXplb2Yoc3RydWN0IGpwZWdfbGliKSk7CisKKyAgICBqcGVnX2N0eC0+YXJncy5kZWNfcGFyYW0gPSAoc3RydWN0IGpwZWdfZGVjX3BhcmFtICopbWFsbG9jKHNpemVvZihzdHJ1Y3QganBlZ19kZWNfcGFyYW0pKTsKKyAgICBtZW1zZXQoanBlZ19jdHgtPmFyZ3MuZGVjX3BhcmFtLCAweDAwLCBzaXplb2Yoc3RydWN0IGpwZWdfZGVjX3BhcmFtKSk7Cit9CisKK3N0YXRpYyB2b2lkIGluaXRfZW5jb2RlX3BhcmFtKHZvaWQpCit7CisgICAganBlZ19jdHggPSAoc3RydWN0IGpwZWdfbGliICopbWFsbG9jKHNpemVvZihzdHJ1Y3QganBlZ19saWIpKTsKKyAgICBtZW1zZXQoanBlZ19jdHgsIDB4MDAsIHNpemVvZihzdHJ1Y3QganBlZ19saWIpKTsKKworICAgIGpwZWdfY3R4LT5hcmdzLmVuY19wYXJhbSA9IChzdHJ1Y3QganBlZ19lbmNfcGFyYW0gKiltYWxsb2Moc2l6ZW9mKHN0cnVjdCBqcGVnX2VuY19wYXJhbSkpOworICAgIG1lbXNldChqcGVnX2N0eC0+YXJncy5lbmNfcGFyYW0sIDB4MDAsIHNpemVvZihzdHJ1Y3QganBlZ19lbmNfcGFyYW0pKTsKK30KKworaW50IGFwaV9qcGVnX2RlY29kZV9pbml0KCkKK3sKKyAgICBpbml0X2RlY29kZV9wYXJhbSgpOworICAgIGpwZWdfY3R4LT5qcGVnX2ZkID0gb3BlbihKUEVHX0RSSVZFUl9OQU1FLCBPX1JEV1IpOworCisgICAgaWYgKGpwZWdfY3R4LT5qcGVnX2ZkIDwgMCkgeworICAgICAgICBMT0dFKCJKUEVHIGRyaXZlciBvcGVuIGZhaWxlZFxuIik7CisgICAgICAgIHJldHVybiAtMTsKKyAgICB9CisKKyNpZmRlZiBTNVBfVk1FTQorICAgIG1lbV9mcCA9IHM1cF92bWVtX29wZW4oKTsKKyAgICBMT0dWKCJzNXBfdm1lbV9vcGVuXG4iKTsKKyNlbHNlCisgICAganBlZ19jdHgtPmFyZ3MubW1hcHBlZF9hZGRyID0gKGNoYXIgKikgbW1hcCgwLAorICAgICAgICAgICAgICAgICAgICAgICAgSlBFR19UT1RBTF9CVUZfU0laRSwKKyAgICAgICAgICAgICAgICAgICAgICAgIFBST1RfUkVBRCB8IFBST1RfV1JJVEUsCisgICAgICAgICAgICAgICAgICAgICAgICBNQVBfU0hBUkVELAorICAgICAgICAgICAgICAgICAgICAgICAganBlZ19jdHgtPmpwZWdfZmQsIDApOworCisgICAgaWYgKGpwZWdfY3R4LT5hcmdzLm1tYXBwZWRfYWRkciA9PSBOVUxMKSB7CisgICAgICAgIExPR0UoIkpQRUcgbW1hcCBmYWlsZWRcbiIpOworICAgICAgICByZXR1cm4gLTE7CisgICAgfQorICAgIExPR1YoImFwaV9qcGVnX2RlY29kZV9pbml0IGpwZWdfY3R4LT5hcmdzLm1tYXBwZWRfYWRkciAweCUwOHhcbiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBqcGVnX2N0eC0+YXJncy5tbWFwcGVkX2FkZHIpOworI2VuZGlmIC8qIFM1UF9WTUVNICovCisKKyAgICByZXR1cm4ganBlZ19jdHgtPmpwZWdfZmQ7Cit9CisKK2ludCBhcGlfanBlZ19lbmNvZGVfaW5pdCgpCit7CisgICAgaW5pdF9lbmNvZGVfcGFyYW0oKTsKKyAgICBqcGVnX2N0eC0+anBlZ19mZCA9IG9wZW4oSlBFR19EUklWRVJfTkFNRSwgT19SRFdSKTsKKworICAgIGlmIChqcGVnX2N0eC0+anBlZ19mZCA8IDApIHsKKyAgICAgICAgTE9HRSgiSlBFRyBkcml2ZXIgb3BlbiBmYWlsZWQgJWRcbiIsIGpwZWdfY3R4LT5qcGVnX2ZkKTsKKyAgICAgICAgcmV0dXJuIC0xOworICAgIH0KKworI2lmZGVmIFM1UF9WTUVNCisgICAgbWVtX2ZwID0gczVwX3ZtZW1fb3BlbigpOworICAgIExPR0koInM1cF92bWVtX29wZW5cbiIpOworI2Vsc2UKKworICAgIGpwZWdfY3R4LT5hcmdzLm1tYXBwZWRfYWRkciA9IChjaGFyICopIG1tYXAoMCwKKyAgICAgICAgICAgIEpQRUdfVE9UQUxfQlVGX1NJWkUsCisgICAgICAgICAgICBQUk9UX1JFQUQgfCBQUk9UX1dSSVRFLAorICAgICAgICAgICAgTUFQX1NIQVJFRCwKKyAgICAgICAgICAgIGpwZWdfY3R4LT5qcGVnX2ZkLCAwKTsKKworICAgIGlmIChqcGVnX2N0eC0+YXJncy5tbWFwcGVkX2FkZHIgPT0gTlVMTCkgeworICAgICAgICBMT0dFKCJKUEVHIG1tYXAgZmFpbGVkXG4iKTsKKyAgICAgICAgcmV0dXJuIC0xOworICAgIH0KKyAgICBMT0dWKCJhcGlfanBlZ19lbmNvZGVfaW5pdCBqcGVnX2N0eC0+YXJncy5tbWFwcGVkX2FkZHIgMHglMDh4XG4iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAganBlZ19jdHgtPmFyZ3MubW1hcHBlZF9hZGRyKTsKKyNlbmRpZiAvKiBTNVBfVk1FTSAqLworICAgIHJldHVybiBqcGVnX2N0eC0+anBlZ19mZDsKK30KKworaW50IGFwaV9qcGVnX2RlY29kZV9kZWluaXQoaW50IGRldl9mZCkKK3sKKyAgICBpZiAoanBlZ19jdHgtPmFyZ3MubW1hcHBlZF9hZGRyICE9IE5VTEwpCisgICAgICAgIG11bm1hcChqcGVnX2N0eC0+YXJncy5tbWFwcGVkX2FkZHIsIEpQRUdfVE9UQUxfQlVGX1NJWkUpOworCisjaWZkZWYgUzVQX1ZNRU0KKyAgICBzNXBfZnJlZV9zaGFyZShtZW1fZnAsIGpwZWdfY3R4LT5hcmdzLmluX2Nvb2tpZSwganBlZ19jdHgtPmFyZ3MuaW5fYnVmKTsKKyAgICBzNXBfZnJlZV9zaGFyZShtZW1fZnAsIGpwZWdfY3R4LT5hcmdzLm91dF9jb29raWUsIGpwZWdfY3R4LT5hcmdzLm91dF9idWYpOworICAgIHM1cF92bWVtX2Nsb3NlKG1lbV9mcCk7CisjZW5kaWYKKworICAgIGNsb3NlKGpwZWdfY3R4LT5qcGVnX2ZkKTsKKworICAgIGlmIChqcGVnX2N0eC0+YXJncy5kZWNfcGFyYW0gIT0gTlVMTCkKKyAgICAgICAgZnJlZShqcGVnX2N0eC0+YXJncy5kZWNfcGFyYW0pOworCisgICAgZnJlZShqcGVnX2N0eCk7CisKKyAgICByZXR1cm4gSlBFR19PSzsKK30KKworaW50IGFwaV9qcGVnX2VuY29kZV9kZWluaXQoaW50IGRldl9mZCkKK3sKKyAgICBpZiAoanBlZ19jdHgtPmFyZ3MubW1hcHBlZF9hZGRyICE9IE5VTEwpCisgICAgICAgIG11bm1hcChqcGVnX2N0eC0+YXJncy5tbWFwcGVkX2FkZHIsIEpQRUdfVE9UQUxfQlVGX1NJWkUpOworCisjaWZkZWYgUzVQX1ZNRU0KKyAgICBzNXBfZnJlZV9zaGFyZShtZW1fZnAsIGpwZWdfY3R4LT5hcmdzLmluX2Nvb2tpZSwganBlZ19jdHgtPmFyZ3MuaW5fYnVmKTsKKyAgICBzNXBfZnJlZV9zaGFyZShtZW1fZnAsIGpwZWdfY3R4LT5hcmdzLm91dF9jb29raWUsIGpwZWdfY3R4LT5hcmdzLm91dF9idWYpOworICAgIHM1cF92bWVtX2Nsb3NlKG1lbV9mcCk7CisjZW5kaWYKKyAgICBjbG9zZShqcGVnX2N0eC0+anBlZ19mZCk7CisKKyAgICBpZiAoanBlZ19jdHgtPmFyZ3MuZW5jX3BhcmFtICE9IE5VTEwpCisgICAgICAgIGZyZWUoanBlZ19jdHgtPmFyZ3MuZW5jX3BhcmFtKTsKKworICAgIGZyZWUoanBlZ19jdHgpOworCisgICAgcmV0dXJuIEpQRUdfT0s7Cit9CisKK3ZvaWQgKmFwaV9qcGVnX2dldF9kZWNvZGVfaW5fYnVmKGludCBkZXZfZmQsIHVuc2lnbmVkIGludCBzaXplKQoreworICAgIGlmIChzaXplIDwgMCB8fCBzaXplID4gTUFYX0pQRUdfUkVTKSB7CisgICAgICAgIExPR0UoIkludmFsaWQgZGVjb2RlIGlucHV0IGJ1ZmZlciBzaXplXHJcbiIpOworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisjaWZkZWYgUzVQX1ZNRU0KKyAgICBqcGVnX2N0eC0+YXJncy5pbl9jb29raWUgPSAodW5zaWduZWQgaW50KWlvY3RsKGpwZWdfY3R4LT5qcGVnX2ZkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJT0NUTF9HRVRfREVDX0lOX0JVRiwgc2l6ZSk7CisgICAganBlZ19jdHgtPmFyZ3MuaW5fYnVmID0gczVwX21hbGxvY19zaGFyZShtZW1fZnAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAganBlZ19jdHgtPmFyZ3MuaW5fY29va2llLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZqcGVnX2N0eC0+YXJncy5pbl9idWZfc2l6ZSk7CisjZWxzZQorICAgIGpwZWdfY3R4LT5hcmdzLmluX2J1ZiA9IChjaGFyICopaW9jdGwoanBlZ19jdHgtPmpwZWdfZmQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElPQ1RMX0dFVF9ERUNfSU5fQlVGLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBqcGVnX2N0eC0+YXJncy5tbWFwcGVkX2FkZHIpOworI2VuZGlmIC8qIFM1UF9WTUVNICovCisgICAgcmV0dXJuICh2b2lkICopKGpwZWdfY3R4LT5hcmdzLmluX2J1Zik7Cit9CisKK3ZvaWQgKmFwaV9qcGVnX2dldF9lbmNvZGVfaW5fYnVmKGludCBkZXZfZmQsIHVuc2lnbmVkIGludCBzaXplKQoreworI2lmZGVmIFM1UF9WTUVNCisgICAganBlZ19jdHgtPmFyZ3MuaW5fY29va2llID0gKHVuc2lnbmVkIGludClpb2N0bChqcGVnX2N0eC0+anBlZ19mZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSU9DVExfR0VUX0VOQ19JTl9CVUYsIChzaXplKjMpKTsKKyAgICBqcGVnX2N0eC0+YXJncy5pbl9idWYgPSBzNXBfbWFsbG9jX3NoYXJlKG1lbV9mcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBqcGVnX2N0eC0+YXJncy5pbl9jb29raWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmpwZWdfY3R4LT5hcmdzLmluX2J1Zl9zaXplKTsKKyNlbHNlCisgICAganBlZ19jdHgtPmFyZ3MuZW5jX3BhcmFtLT5zaXplID0gc2l6ZTsKKyAgICBqcGVnX2N0eC0+YXJncy5pbl9idWYgPSAoY2hhciAqKWlvY3RsKGpwZWdfY3R4LT5qcGVnX2ZkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJT0NUTF9HRVRfRU5DX0lOX0JVRiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAganBlZ19jdHgtPmFyZ3MubW1hcHBlZF9hZGRyKTsKKyNlbmRpZgorCisgICAgTE9HVigiYXBpX2pwZWdfZ2V0X2VuY29kZV9pbl9idWY6IDB4JXhcbiIsCisgICAgICAgICAgICAgICAgICAgICAgICBqcGVnX2N0eC0+YXJncy5pbl9idWYpOworCisgICAgcmV0dXJuICh2b2lkICopKGpwZWdfY3R4LT5hcmdzLmluX2J1Zik7Cit9CisKK3ZvaWQgKmFwaV9qcGVnX2dldF9kZWNvZGVfb3V0X2J1ZihpbnQgZGV2X2ZkKQoreworI2lmZGVmIFM1UF9WTUVNCisgICAganBlZ19jdHgtPmFyZ3Mub3V0X2Nvb2tpZSA9ICh1bnNpZ25lZCBpbnQpaW9jdGwoanBlZ19jdHgtPmpwZWdfZmQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElPQ1RMX0dFVF9ERUNfT1VUX0JVRiwgSlBFR19GUkFNRV9CVUZfU0laRSk7CisgICAganBlZ19jdHgtPmFyZ3Mub3V0X2J1ZiA9IHM1cF9tYWxsb2Nfc2hhcmUobWVtX2ZwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGpwZWdfY3R4LT5hcmdzLm91dF9jb29raWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmpwZWdfY3R4LT5hcmdzLm91dF9idWZfc2l6ZSk7CisjZWxzZQorICAgIGpwZWdfY3R4LT5hcmdzLm91dF9idWYgPSAoY2hhciAqKWlvY3RsKGpwZWdfY3R4LT5qcGVnX2ZkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJT0NUTF9HRVRfREVDX09VVF9CVUYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGpwZWdfY3R4LT5hcmdzLm1tYXBwZWRfYWRkcik7CisjZW5kaWYgLyogUzVQX1ZNRU0gKi8KKyAgICAvKgorICAgIExPR1YoImFwaV9qcGVnX2dldF9kZWNvZGVfb3V0X2J1ZjogMHgleFxuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgIGpwZWdfY3R4LT5hcmdzLm91dF9idWYpOworICAgICovCisgICAgcmV0dXJuICh2b2lkICopKGpwZWdfY3R4LT5hcmdzLm91dF9idWYpOworfQorCit2b2lkICphcGlfanBlZ19nZXRfZW5jb2RlX291dF9idWYoaW50IGRldl9mZCkKK3sKKyNpZmRlZiBTNVBfVk1FTQorICAgIGpwZWdfY3R4LT5hcmdzLm91dF9jb29raWUgPSAodW5zaWduZWQgaW50KWlvY3RsKGpwZWdfY3R4LT5qcGVnX2ZkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJT0NUTF9HRVRfRU5DX09VVF9CVUYsIEpQRUdfU1RSRUFNX0JVRl9TSVpFKTsKKyAgICBqcGVnX2N0eC0+YXJncy5vdXRfYnVmID0gczVwX21hbGxvY19zaGFyZShtZW1fZnAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAganBlZ19jdHgtPmFyZ3Mub3V0X2Nvb2tpZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmanBlZ19jdHgtPmFyZ3Mub3V0X2J1Zl9zaXplKTsKKyNlbHNlCisgICAganBlZ19jdHgtPmFyZ3Mub3V0X2J1ZiA9IChjaGFyICopaW9jdGwoanBlZ19jdHgtPmpwZWdfZmQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElPQ1RMX0dFVF9FTkNfT1VUX0JVRiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAganBlZ19jdHgtPmFyZ3MubW1hcHBlZF9hZGRyKTsKKyNlbmRpZiAvKiBTNVBfVk1FTSAqLworCisgICAgTE9HVigiYXBpX2pwZWdfZ2V0X2VuY29kZV9vdXRfYnVmOiAweCV4XG4iLAorICAgICAgICAgICAgICAgICAgICAgICAganBlZ19jdHgtPmFyZ3Mub3V0X2J1Zik7CisKKyAgICByZXR1cm4gKHZvaWQgKikoanBlZ19jdHgtPmFyZ3Mub3V0X2J1Zik7Cit9CisKK3ZvaWQgYXBpX2pwZWdfc2V0X2RlY29kZV9wYXJhbShzdHJ1Y3QganBlZ19kZWNfcGFyYW0gKnBhcmFtKQoreworICAgIG1lbWNweShqcGVnX2N0eC0+YXJncy5kZWNfcGFyYW0sIHBhcmFtLCBzaXplb2Yoc3RydWN0IGpwZWdfZGVjX3BhcmFtKSk7CisgICAgaW9jdGwoanBlZ19jdHgtPmpwZWdfZmQsIElPQ1RMX1NFVF9ERUNfUEFSQU0sIGpwZWdfY3R4LT5hcmdzLmRlY19wYXJhbSk7Cit9CisKK3ZvaWQgYXBpX2pwZWdfc2V0X2VuY29kZV9wYXJhbShzdHJ1Y3QganBlZ19lbmNfcGFyYW0gKnBhcmFtKQoreworICAgIG1lbWNweShqcGVnX2N0eC0+YXJncy5lbmNfcGFyYW0sIHBhcmFtLCBzaXplb2Yoc3RydWN0IGpwZWdfZW5jX3BhcmFtKSk7CisgICAgaW9jdGwoanBlZ19jdHgtPmpwZWdfZmQsIElPQ1RMX1NFVF9FTkNfUEFSQU0sIGpwZWdfY3R4LT5hcmdzLmVuY19wYXJhbSk7Cit9CisKK2VudW0ganBlZ19yZXRfdHlwZSBhcGlfanBlZ19kZWNvZGVfZXhlKGludCBkZXZfZmQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJ1Y3QganBlZ19kZWNfcGFyYW0gKmRlY19wYXJhbSkKK3sKKyAgICBzdHJ1Y3QganBlZ19hcmdzICphcmc7CisKKyAgICBhcmcgPSAmKGpwZWdfY3R4LT5hcmdzKTsKKworICAgIGlvY3RsKGpwZWdfY3R4LT5qcGVnX2ZkLCBJT0NUTF9KUEVHX0RFQ19FWEUsIGFyZy0+ZGVjX3BhcmFtKTsKKyAgICBMT0dWKCJhcGlfanBlZ19kZWNvZGVfZXhlIGRlY19wYXJhbS0+b3V0X2ZtdCA6JWQgXAorICAgICAgICAgICAgICAgICAgICAgICAgZGVjX3BhcmFtLT53aWR0aCA6ICVkIGRlY19wYXJhbS0+aGVpZ2h0IDogJWRcbiIsCisgICAgICAgICAgICAgICAgICAgICAgICBhcmctPmRlY19wYXJhbS0+b3V0X2ZtdCwKKyAgICAgICAgICAgICAgICAgICAgICAgIGFyZy0+ZGVjX3BhcmFtLT53aWR0aCwKKyAgICAgICAgICAgICAgICAgICAgICAgIGFyZy0+ZGVjX3BhcmFtLT5oZWlnaHQpOworICAgIGRlY19wYXJhbS0+d2lkdGggPSBhcmctPmRlY19wYXJhbS0+d2lkdGg7CisgICAgZGVjX3BhcmFtLT5oZWlnaHQgPSBhcmctPmRlY19wYXJhbS0+aGVpZ2h0OworICAgIGRlY19wYXJhbS0+c2l6ZSA9IGdldF95dXZfc2l6ZShhcmctPmRlY19wYXJhbS0+b3V0X2ZtdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXJnLT5kZWNfcGFyYW0tPndpZHRoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhcmctPmRlY19wYXJhbS0+aGVpZ2h0KTsKKworICAgIHJldHVybiBKUEVHX0RFQ09ERV9PSzsKK30KKworZW51bSBqcGVnX3JldF90eXBlIGFwaV9qcGVnX2VuY29kZV9leGUoaW50IGRldl9mZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJ1Y3QganBlZ19lbmNfcGFyYW0gKmVuY19wYXJhbSkKK3sKKyAgICBzdHJ1Y3QganBlZ19hcmdzICAgICAqYXJnOworICAgIGFyZyA9ICYoanBlZ19jdHgtPmFyZ3MpOworCisgICAgLy8gY2hlY2sgTUNVIHZhbGlkYXRpb24gd2lkdGggJiBoZWlnaHQgJiBzYW1wbGluZyBtb2RlCisgICAgaWYgKGNoZWNrX2lucHV0X3NpemUoanBlZ19jdHgtPmFyZ3MuZW5jX3BhcmFtLT53aWR0aCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAganBlZ19jdHgtPmFyZ3MuZW5jX3BhcmFtLT5oZWlnaHQpIDwgMCkgeworICAgICAgICBMT0dWKCJ3aWR0aC9oZWlnaHQgZG9lc24ndCBtYXRjaCB3aXRoIE1DVVxyXG4iKTsKKyAgICAgICAgcmV0dXJuIEpQRUdfRkFJTDsKKyAgICB9CisKKyAgICBpb2N0bChqcGVnX2N0eC0+anBlZ19mZCwgSU9DVExfSlBFR19FTkNfRVhFLCBhcmctPmVuY19wYXJhbSk7CisKKyAgICBlbmNfcGFyYW0tPnNpemUgPSBhcmctPmVuY19wYXJhbS0+c2l6ZTsKKworICAgIHJldHVybiBKUEVHX0VOQ09ERV9PSzsKK30KZGlmZiAtLWdpdCBhL2V4eW5vczQvaGFsL2xpYnNlbnNvcnMvQWttU2Vuc29yLmNwcCBiL2V4eW5vczQvaGFsL2xpYnNlbnNvcnMvQWttU2Vuc29yLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jMTQ3YmQ2Ci0tLSAvZGV2L251bGwKKysrIGIvZXh5bm9zNC9oYWwvbGlic2Vuc29ycy9Ba21TZW5zb3IuY3BwCkBAIC0wLDAgKzEsMzEwIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDA4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2luY2x1ZGUgPGZjbnRsLmg+CisjaW5jbHVkZSA8ZXJybm8uaD4KKyNpbmNsdWRlIDxtYXRoLmg+CisjaW5jbHVkZSA8cG9sbC5oPgorI2luY2x1ZGUgPHVuaXN0ZC5oPgorI2luY2x1ZGUgPGRpcmVudC5oPgorI2luY2x1ZGUgPHN5cy9zZWxlY3QuaD4KKyNpbmNsdWRlIDxkbGZjbi5oPgorCisjaW5jbHVkZSAiYWs4OTczYi5oIgorCisjaW5jbHVkZSA8Y3V0aWxzL2xvZy5oPgorI2luY2x1ZGUgIkFrbVNlbnNvci5oIgorCisvLyNkZWZpbmUgTE9HX05ERUJVRyAwCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworaW50ICgqYWttX2lzX3NlbnNvcl9lbmFibGVkKSh1aW50MzJfdCBzZW5zb3JfdHlwZSk7CitpbnQgKCpha21fZW5hYmxlX3NlbnNvcikodWludDMyX3Qgc2Vuc29yX3R5cGUpOworaW50ICgqYWttX2Rpc2FibGVfc2Vuc29yKSh1aW50MzJfdCBzZW5zb3JfdHlwZSk7CitpbnQgKCpha21fc2V0X2RlbGF5KSh1aW50MzJfdCBzZW5zb3JfdHlwZSwgdWludDY0X3QgZGVsYXkpOworCitpbnQgc3R1Yl9pc19zZW5zb3JfZW5hYmxlZCh1aW50MzJfdCBzZW5zb3JfdHlwZSkgeworICAgIHJldHVybiAwOworfQorCitpbnQgc3R1Yl9lbmFibGVfZGlzYWJsZV9zZW5zb3IodWludDMyX3Qgc2Vuc29yX3R5cGUpIHsKKyAgICByZXR1cm4gLUVOT0RFVjsKK30KKworaW50IHN0dWJfc2V0X2RlbGF5KHVpbnQzMl90IHNlbnNvcl90eXBlLCB1aW50NjRfdCBkZWxheSkgeworICAgIHJldHVybiAtRU5PREVWOworfQorCitBa21TZW5zb3I6OkFrbVNlbnNvcigpCis6IFNlbnNvckJhc2UoTlVMTCwgTlVMTCksCisgICAgICBtRW5hYmxlZCgwKSwKKyAgICAgIG1QZW5kaW5nTWFzaygwKSwKKyAgICAgIG1JbnB1dFJlYWRlcigzMikKK3sKKyAgICAvKiBPcGVuIHRoZSBsaWJyYXJ5IGJlZm9yZSBvcGVuaW5nIHRoZSBpbnB1dCBkZXZpY2UuICBUaGUgbGlicmFyeQorICAgICAqIGNyZWF0ZXMgYSB1aW5wdXQgZGV2aWNlLgorICAgICAqLworICAgIGlmIChsb2FkQUtNTGlicmFyeSgpID09IDApIHsKKyAgICAgICAgZGF0YV9uYW1lID0gImNvbXBhc3Nfc2Vuc29yIjsKKyAgICAgICAgZGF0YV9mZCA9IG9wZW5JbnB1dCgiY29tcGFzc19zZW5zb3IiKTsKKyAgICB9CisKKyAgICBtZW1zZXQobVBlbmRpbmdFdmVudHMsIDAsIHNpemVvZihtUGVuZGluZ0V2ZW50cykpOworCisgICAgbVBlbmRpbmdFdmVudHNbQWNjZWxlcm9tZXRlcl0udmVyc2lvbiA9IHNpemVvZihzZW5zb3JzX2V2ZW50X3QpOworICAgIG1QZW5kaW5nRXZlbnRzW0FjY2VsZXJvbWV0ZXJdLnNlbnNvciA9IElEX0E7CisgICAgbVBlbmRpbmdFdmVudHNbQWNjZWxlcm9tZXRlcl0udHlwZSA9IFNFTlNPUl9UWVBFX0FDQ0VMRVJPTUVURVI7CisgICAgbVBlbmRpbmdFdmVudHNbQWNjZWxlcm9tZXRlcl0uYWNjZWxlcmF0aW9uLnN0YXR1cyA9IFNFTlNPUl9TVEFUVVNfQUNDVVJBQ1lfSElHSDsKKworICAgIG1QZW5kaW5nRXZlbnRzW01hZ25ldGljRmllbGRdLnZlcnNpb24gPSBzaXplb2Yoc2Vuc29yc19ldmVudF90KTsKKyAgICBtUGVuZGluZ0V2ZW50c1tNYWduZXRpY0ZpZWxkXS5zZW5zb3IgPSBJRF9NOworICAgIG1QZW5kaW5nRXZlbnRzW01hZ25ldGljRmllbGRdLnR5cGUgPSBTRU5TT1JfVFlQRV9NQUdORVRJQ19GSUVMRDsKKyAgICBtUGVuZGluZ0V2ZW50c1tNYWduZXRpY0ZpZWxkXS5tYWduZXRpYy5zdGF0dXMgPSBTRU5TT1JfU1RBVFVTX0FDQ1VSQUNZX0hJR0g7CisKKyAgICBtUGVuZGluZ0V2ZW50c1tPcmllbnRhdGlvbiAgXS52ZXJzaW9uID0gc2l6ZW9mKHNlbnNvcnNfZXZlbnRfdCk7CisgICAgbVBlbmRpbmdFdmVudHNbT3JpZW50YXRpb24gIF0uc2Vuc29yID0gSURfTzsKKyAgICBtUGVuZGluZ0V2ZW50c1tPcmllbnRhdGlvbiAgXS50eXBlID0gU0VOU09SX1RZUEVfT1JJRU5UQVRJT047CisgICAgbVBlbmRpbmdFdmVudHNbT3JpZW50YXRpb24gIF0ub3JpZW50YXRpb24uc3RhdHVzID0gU0VOU09SX1NUQVRVU19BQ0NVUkFDWV9ISUdIOworCisgICAgLy8gcmVhZCB0aGUgYWN0dWFsIHZhbHVlIG9mIGFsbCBzZW5zb3JzIGlmIHRoZXkncmUgZW5hYmxlZCBhbHJlYWR5CisgICAgc3RydWN0IGlucHV0X2Fic2luZm8gYWJzaW5mbzsKKyAgICBzaG9ydCBmbGFncyA9IDA7CisKKyAgICBpZiAoYWttX2lzX3NlbnNvcl9lbmFibGVkKFNFTlNPUl9UWVBFX0FDQ0VMRVJPTUVURVIpKSAgeworICAgICAgICBtRW5hYmxlZCB8PSAxPDxBY2NlbGVyb21ldGVyOworICAgICAgICBpZiAoIWlvY3RsKGRhdGFfZmQsIEVWSU9DR0FCUyhFVkVOVF9UWVBFX0FDQ0VMX1gpLCAmYWJzaW5mbykpIHsKKyAgICAgICAgICAgIG1QZW5kaW5nRXZlbnRzW0FjY2VsZXJvbWV0ZXJdLmFjY2VsZXJhdGlvbi54ID0gYWJzaW5mby52YWx1ZSAqIENPTlZFUlRfQV9YOworICAgICAgICB9CisgICAgICAgIGlmICghaW9jdGwoZGF0YV9mZCwgRVZJT0NHQUJTKEVWRU5UX1RZUEVfQUNDRUxfWSksICZhYnNpbmZvKSkgeworICAgICAgICAgICAgbVBlbmRpbmdFdmVudHNbQWNjZWxlcm9tZXRlcl0uYWNjZWxlcmF0aW9uLnkgPSBhYnNpbmZvLnZhbHVlICogQ09OVkVSVF9BX1k7CisgICAgICAgIH0KKyAgICAgICAgaWYgKCFpb2N0bChkYXRhX2ZkLCBFVklPQ0dBQlMoRVZFTlRfVFlQRV9BQ0NFTF9aKSwgJmFic2luZm8pKSB7CisgICAgICAgICAgICBtUGVuZGluZ0V2ZW50c1tBY2NlbGVyb21ldGVyXS5hY2NlbGVyYXRpb24ueiA9IGFic2luZm8udmFsdWUgKiBDT05WRVJUX0FfWjsKKyAgICAgICAgfQorICAgIH0KKyAgICBpZiAoYWttX2lzX3NlbnNvcl9lbmFibGVkKFNFTlNPUl9UWVBFX01BR05FVElDX0ZJRUxEKSkgIHsKKyAgICAgICAgbUVuYWJsZWQgfD0gMTw8TWFnbmV0aWNGaWVsZDsKKyAgICAgICAgaWYgKCFpb2N0bChkYXRhX2ZkLCBFVklPQ0dBQlMoRVZFTlRfVFlQRV9NQUdWX1gpLCAmYWJzaW5mbykpIHsKKyAgICAgICAgICAgIG1QZW5kaW5nRXZlbnRzW01hZ25ldGljRmllbGRdLm1hZ25ldGljLnggPSBhYnNpbmZvLnZhbHVlICogQ09OVkVSVF9NX1g7CisgICAgICAgIH0KKyAgICAgICAgaWYgKCFpb2N0bChkYXRhX2ZkLCBFVklPQ0dBQlMoRVZFTlRfVFlQRV9NQUdWX1kpLCAmYWJzaW5mbykpIHsKKyAgICAgICAgICAgIG1QZW5kaW5nRXZlbnRzW01hZ25ldGljRmllbGRdLm1hZ25ldGljLnkgPSBhYnNpbmZvLnZhbHVlICogQ09OVkVSVF9NX1k7CisgICAgICAgIH0KKyAgICAgICAgaWYgKCFpb2N0bChkYXRhX2ZkLCBFVklPQ0dBQlMoRVZFTlRfVFlQRV9NQUdWX1opLCAmYWJzaW5mbykpIHsKKyAgICAgICAgICAgIG1QZW5kaW5nRXZlbnRzW01hZ25ldGljRmllbGRdLm1hZ25ldGljLnogPSBhYnNpbmZvLnZhbHVlICogQ09OVkVSVF9NX1o7CisgICAgICAgIH0KKyAgICB9CisgICAgaWYgKGFrbV9pc19zZW5zb3JfZW5hYmxlZChTRU5TT1JfVFlQRV9PUklFTlRBVElPTikpICB7CisgICAgICAgIG1FbmFibGVkIHw9IDE8PE9yaWVudGF0aW9uOworICAgICAgICBpZiAoIWlvY3RsKGRhdGFfZmQsIEVWSU9DR0FCUyhFVkVOVF9UWVBFX1lBVyksICZhYnNpbmZvKSkgeworICAgICAgICAgICAgbVBlbmRpbmdFdmVudHNbT3JpZW50YXRpb25dLm9yaWVudGF0aW9uLmF6aW11dGggPSBhYnNpbmZvLnZhbHVlOworICAgICAgICB9CisgICAgICAgIGlmICghaW9jdGwoZGF0YV9mZCwgRVZJT0NHQUJTKEVWRU5UX1RZUEVfUElUQ0gpLCAmYWJzaW5mbykpIHsKKyAgICAgICAgICAgIG1QZW5kaW5nRXZlbnRzW09yaWVudGF0aW9uXS5vcmllbnRhdGlvbi5waXRjaCA9IGFic2luZm8udmFsdWU7CisgICAgICAgIH0KKyAgICAgICAgaWYgKCFpb2N0bChkYXRhX2ZkLCBFVklPQ0dBQlMoRVZFTlRfVFlQRV9ST0xMKSwgJmFic2luZm8pKSB7CisgICAgICAgICAgICBtUGVuZGluZ0V2ZW50c1tPcmllbnRhdGlvbl0ub3JpZW50YXRpb24ucm9sbCA9IC1hYnNpbmZvLnZhbHVlOworICAgICAgICB9CisgICAgICAgIGlmICghaW9jdGwoZGF0YV9mZCwgRVZJT0NHQUJTKEVWRU5UX1RZUEVfT1JJRU5UX1NUQVRVUyksICZhYnNpbmZvKSkgeworICAgICAgICAgICAgbVBlbmRpbmdFdmVudHNbT3JpZW50YXRpb25dLm9yaWVudGF0aW9uLnN0YXR1cyA9IHVpbnQ4X3QoYWJzaW5mby52YWx1ZSAmIFNFTlNPUl9TVEFURV9NQVNLKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8vIGRpc2FibGUgdGVtcGVyYXR1cmUgc2Vuc29yLCBzaW5jZSBpdCBpcyBub3Qgc3VwcG9ydGVkCisgICAgYWttX2Rpc2FibGVfc2Vuc29yKFNFTlNPUl9UWVBFX1RFTVBFUkFUVVJFKTsKK30KKworQWttU2Vuc29yOjp+QWttU2Vuc29yKCkKK3sKKyAgICBpZiAobUxpYkFLTSkgeworICAgICAgICB1bnNpZ25lZCByZWYgPSA6OmRsY2xvc2UobUxpYkFLTSk7CisgICAgfQorfQorCitpbnQgQWttU2Vuc29yOjplbmFibGUoaW50MzJfdCBoYW5kbGUsIGludCBlbikKK3sKKyAgICBpbnQgd2hhdCA9IC0xOworCisgICAgc3dpdGNoIChoYW5kbGUpIHsKKyAgICAgICAgY2FzZSBJRF9BOiB3aGF0ID0gQWNjZWxlcm9tZXRlcjsgYnJlYWs7CisgICAgICAgIGNhc2UgSURfTTogd2hhdCA9IE1hZ25ldGljRmllbGQ7IGJyZWFrOworICAgICAgICBjYXNlIElEX086IHdoYXQgPSBPcmllbnRhdGlvbjsgICBicmVhazsKKyAgICB9CisKKyAgICBpZiAodWludDMyX3Qod2hhdCkgPj0gbnVtU2Vuc29ycykKKyAgICAgICAgcmV0dXJuIC1FSU5WQUw7CisKKyAgICBpbnQgbmV3U3RhdGUgID0gZW4gPyAxIDogMDsKKyAgICBpbnQgZXJyID0gMDsKKworICAgIGlmICgodWludDMyX3QobmV3U3RhdGUpPDx3aGF0KSAhPSAobUVuYWJsZWQgJiAoMTw8d2hhdCkpKSB7CisgICAgICAgIHVpbnQzMl90IHNlbnNvcl90eXBlOworICAgICAgICBzd2l0Y2ggKHdoYXQpIHsKKyAgICAgICAgICAgIGNhc2UgQWNjZWxlcm9tZXRlcjogc2Vuc29yX3R5cGUgPSBTRU5TT1JfVFlQRV9BQ0NFTEVST01FVEVSOyAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIE1hZ25ldGljRmllbGQ6IHNlbnNvcl90eXBlID0gU0VOU09SX1RZUEVfTUFHTkVUSUNfRklFTEQ7IGJyZWFrOworICAgICAgICAgICAgY2FzZSBPcmllbnRhdGlvbjogICBzZW5zb3JfdHlwZSA9IFNFTlNPUl9UWVBFX09SSUVOVEFUSU9OOyAgYnJlYWs7CisgICAgICAgIH0KKyAgICAgICAgc2hvcnQgZmxhZ3MgPSBuZXdTdGF0ZTsKKyAgICAgICAgaWYgKGVuKQorICAgICAgICAgICAgZXJyID0gYWttX2VuYWJsZV9zZW5zb3Ioc2Vuc29yX3R5cGUpOworICAgICAgICBlbHNlCisgICAgICAgICAgICBlcnIgPSBha21fZGlzYWJsZV9zZW5zb3Ioc2Vuc29yX3R5cGUpOworCisgICAgICAgIExPR0VfSUYoZXJyLCAiQ291bGQgbm90IGNoYW5nZSBzZW5zb3Igc3RhdGUgKCVzKSIsIHN0cmVycm9yKC1lcnIpKTsKKyAgICAgICAgaWYgKCFlcnIpIHsKKyAgICAgICAgICAgIG1FbmFibGVkICY9IH4oMTw8d2hhdCk7CisgICAgICAgICAgICBtRW5hYmxlZCB8PSAodWludDMyX3QoZmxhZ3MpPDx3aGF0KTsKKyAgICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gZXJyOworfQorCitpbnQgQWttU2Vuc29yOjpzZXREZWxheShpbnQzMl90IGhhbmRsZSwgaW50NjRfdCBucykKK3sKKyAgICB1aW50MzJfdCBzZW5zb3JfdHlwZSA9IDA7CisKKyAgICBpZiAobnMgPCAwKQorICAgICAgICByZXR1cm4gLUVJTlZBTDsKKworICAgIHN3aXRjaCAoaGFuZGxlKSB7CisgICAgICAgIGNhc2UgSURfQTogc2Vuc29yX3R5cGUgPSBTRU5TT1JfVFlQRV9BQ0NFTEVST01FVEVSOyBicmVhazsKKyAgICAgICAgY2FzZSBJRF9NOiBzZW5zb3JfdHlwZSA9IFNFTlNPUl9UWVBFX01BR05FVElDX0ZJRUxEOyBicmVhazsKKyAgICAgICAgY2FzZSBJRF9POiBzZW5zb3JfdHlwZSA9IFNFTlNPUl9UWVBFX09SSUVOVEFUSU9OOyBicmVhazsKKyAgICB9CisKKyAgICBpZiAoc2Vuc29yX3R5cGUgPT0gMCkKKyAgICAgICAgcmV0dXJuIC1FSU5WQUw7CisKKyAgICByZXR1cm4gYWttX3NldF9kZWxheShzZW5zb3JfdHlwZSwgbnMpOworfQorCitpbnQgQWttU2Vuc29yOjpsb2FkQUtNTGlicmFyeSgpCit7CisgICAgbUxpYkFLTSA9IGRsb3BlbigibGliYWttLnNvIiwgUlRMRF9OT1cpOworCisgICAgaWYgKCFtTGliQUtNKSB7CisgICAgICAgIGFrbV9pc19zZW5zb3JfZW5hYmxlZCA9IHN0dWJfaXNfc2Vuc29yX2VuYWJsZWQ7CisgICAgICAgIGFrbV9lbmFibGVfc2Vuc29yID0gc3R1Yl9lbmFibGVfZGlzYWJsZV9zZW5zb3I7CisgICAgICAgIGFrbV9kaXNhYmxlX3NlbnNvciA9IHN0dWJfZW5hYmxlX2Rpc2FibGVfc2Vuc29yOworICAgICAgICBha21fc2V0X2RlbGF5ID0gc3R1Yl9zZXRfZGVsYXk7CisgICAgICAgIExPR0UoIkFrbVNlbnNvcjogdW5hYmxlIHRvIGxvYWQgQUtNIExpYnJhcnksICVzIiwgZGxlcnJvcigpKTsKKyAgICAgICAgcmV0dXJuIC1FTk9FTlQ7CisgICAgfQorCisgICAgKih2b2lkICoqKSZha21faXNfc2Vuc29yX2VuYWJsZWQgPSBkbHN5bShtTGliQUtNLCAiYWttX2lzX3NlbnNvcl9lbmFibGVkIik7CisgICAgKih2b2lkICoqKSZha21fZW5hYmxlX3NlbnNvciA9IGRsc3ltKG1MaWJBS00sICJha21fZW5hYmxlX3NlbnNvciIpOworICAgICoodm9pZCAqKikmYWttX2Rpc2FibGVfc2Vuc29yID0gZGxzeW0obUxpYkFLTSwgImFrbV9kaXNhYmxlX3NlbnNvciIpOworICAgICoodm9pZCAqKikmYWttX3NldF9kZWxheSA9IGRsc3ltKG1MaWJBS00sICJha21fc2V0X2RlbGF5Iik7CisKKyAgICByZXR1cm4gMDsKK30KKworaW50IEFrbVNlbnNvcjo6cmVhZEV2ZW50cyhzZW5zb3JzX2V2ZW50X3QqIGRhdGEsIGludCBjb3VudCkKK3sKKyAgICBpZiAoY291bnQgPCAxKQorICAgICAgICByZXR1cm4gLUVJTlZBTDsKKworICAgIHNzaXplX3QgbiA9IG1JbnB1dFJlYWRlci5maWxsKGRhdGFfZmQpOworICAgIGlmIChuIDwgMCkKKyAgICAgICAgcmV0dXJuIG47CisKKyAgICBpbnQgbnVtRXZlbnRSZWNlaXZlZCA9IDA7CisgICAgaW5wdXRfZXZlbnQgY29uc3QqIGV2ZW50OworCisgICAgd2hpbGUgKGNvdW50ICYmIG1JbnB1dFJlYWRlci5yZWFkRXZlbnQoJmV2ZW50KSkgeworICAgICAgICBpbnQgdHlwZSA9IGV2ZW50LT50eXBlOworICAgICAgICBpZiAodHlwZSA9PSBFVl9SRUwpIHsKKyAgICAgICAgICAgIHByb2Nlc3NFdmVudChldmVudC0+Y29kZSwgZXZlbnQtPnZhbHVlKTsKKyAgICAgICAgICAgIG1JbnB1dFJlYWRlci5uZXh0KCk7CisgICAgICAgIH0gZWxzZSBpZiAodHlwZSA9PSBFVl9TWU4pIHsKKyAgICAgICAgICAgIGludDY0X3QgdGltZSA9IHRpbWV2YWxUb05hbm8oZXZlbnQtPnRpbWUpOworICAgICAgICAgICAgZm9yIChpbnQgaj0wIDsgY291bnQgJiYgbVBlbmRpbmdNYXNrICYmIGo8bnVtU2Vuc29ycyA7IGorKykgeworICAgICAgICAgICAgICAgIGlmIChtUGVuZGluZ01hc2sgJiAoMTw8aikpIHsKKyAgICAgICAgICAgICAgICAgICAgbVBlbmRpbmdNYXNrICY9IH4oMTw8aik7CisgICAgICAgICAgICAgICAgICAgIG1QZW5kaW5nRXZlbnRzW2pdLnRpbWVzdGFtcCA9IHRpbWU7CisgICAgICAgICAgICAgICAgICAgIGlmIChtRW5hYmxlZCAmICgxPDxqKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgKmRhdGErKyA9IG1QZW5kaW5nRXZlbnRzW2pdOworICAgICAgICAgICAgICAgICAgICAgICAgY291bnQtLTsKKyAgICAgICAgICAgICAgICAgICAgICAgIG51bUV2ZW50UmVjZWl2ZWQrKzsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmICghbVBlbmRpbmdNYXNrKSB7CisgICAgICAgICAgICAgICAgbUlucHV0UmVhZGVyLm5leHQoKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIExPR0UoIkFrbVNlbnNvcjogdW5rbm93biBldmVudCAodHlwZT0lZCwgY29kZT0lZCkiLAorICAgICAgICAgICAgICAgICAgICB0eXBlLCBldmVudC0+Y29kZSk7CisgICAgICAgICAgICBtSW5wdXRSZWFkZXIubmV4dCgpOworICAgICAgICB9CisgICAgfQorICAgIHJldHVybiBudW1FdmVudFJlY2VpdmVkOworfQorCit2b2lkIEFrbVNlbnNvcjo6cHJvY2Vzc0V2ZW50KGludCBjb2RlLCBpbnQgdmFsdWUpCit7CisgICAgc3dpdGNoIChjb2RlKSB7CisgICAgICAgIGNhc2UgRVZFTlRfVFlQRV9BQ0NFTF9YOgorICAgICAgICAgICAgbVBlbmRpbmdNYXNrIHw9IDE8PEFjY2VsZXJvbWV0ZXI7CisgICAgICAgICAgICBtUGVuZGluZ0V2ZW50c1tBY2NlbGVyb21ldGVyXS5hY2NlbGVyYXRpb24ueCA9IHZhbHVlICogQ09OVkVSVF9BX1g7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBFVkVOVF9UWVBFX0FDQ0VMX1k6CisgICAgICAgICAgICBtUGVuZGluZ01hc2sgfD0gMTw8QWNjZWxlcm9tZXRlcjsKKyAgICAgICAgICAgIG1QZW5kaW5nRXZlbnRzW0FjY2VsZXJvbWV0ZXJdLmFjY2VsZXJhdGlvbi55ID0gdmFsdWUgKiBDT05WRVJUX0FfWTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEVWRU5UX1RZUEVfQUNDRUxfWjoKKyAgICAgICAgICAgIG1QZW5kaW5nTWFzayB8PSAxPDxBY2NlbGVyb21ldGVyOworICAgICAgICAgICAgbVBlbmRpbmdFdmVudHNbQWNjZWxlcm9tZXRlcl0uYWNjZWxlcmF0aW9uLnogPSB2YWx1ZSAqIENPTlZFUlRfQV9aOworICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgY2FzZSBFVkVOVF9UWVBFX01BR1ZfWDoKKyAgICAgICAgICAgIExPR1YoIkFrbVNlbnNvcjogRVZFTlRfVFlQRV9NQUdWX1ggdmFsdWUgPSVkIiwgdmFsdWUpOworICAgICAgICAgICAgbVBlbmRpbmdNYXNrIHw9IDE8PE1hZ25ldGljRmllbGQ7CisgICAgICAgICAgICBtUGVuZGluZ0V2ZW50c1tNYWduZXRpY0ZpZWxkXS5tYWduZXRpYy54ID0gdmFsdWUgKiBDT05WRVJUX01fWDsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEVWRU5UX1RZUEVfTUFHVl9ZOgorICAgICAgICAgICAgTE9HVigiQWttU2Vuc29yOiBFVkVOVF9UWVBFX01BR1ZfWSB2YWx1ZSA9JWQiLCB2YWx1ZSk7CisgICAgICAgICAgICBtUGVuZGluZ01hc2sgfD0gMTw8TWFnbmV0aWNGaWVsZDsKKyAgICAgICAgICAgIG1QZW5kaW5nRXZlbnRzW01hZ25ldGljRmllbGRdLm1hZ25ldGljLnkgPSB2YWx1ZSAqIENPTlZFUlRfTV9ZOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgRVZFTlRfVFlQRV9NQUdWX1o6CisgICAgICAgICAgICBMT0dWKCJBa21TZW5zb3I6IEVWRU5UX1RZUEVfTUFHVl9aIHZhbHVlID0lZCIsIHZhbHVlKTsKKyAgICAgICAgICAgIG1QZW5kaW5nTWFzayB8PSAxPDxNYWduZXRpY0ZpZWxkOworICAgICAgICAgICAgbVBlbmRpbmdFdmVudHNbTWFnbmV0aWNGaWVsZF0ubWFnbmV0aWMueiA9IHZhbHVlICogQ09OVkVSVF9NX1o7CisgICAgICAgICAgICBicmVhazsKKworICAgICAgICBjYXNlIEVWRU5UX1RZUEVfWUFXOgorICAgICAgICAgICAgbVBlbmRpbmdNYXNrIHw9IDE8PE9yaWVudGF0aW9uOworICAgICAgICAgICAgbVBlbmRpbmdFdmVudHNbT3JpZW50YXRpb25dLm9yaWVudGF0aW9uLmF6aW11dGggPSB2YWx1ZSAqIENPTlZFUlRfT19BOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgRVZFTlRfVFlQRV9QSVRDSDoKKyAgICAgICAgICAgIG1QZW5kaW5nTWFzayB8PSAxPDxPcmllbnRhdGlvbjsKKyAgICAgICAgICAgIG1QZW5kaW5nRXZlbnRzW09yaWVudGF0aW9uXS5vcmllbnRhdGlvbi5waXRjaCA9IHZhbHVlICogQ09OVkVSVF9PX1A7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBFVkVOVF9UWVBFX1JPTEw6CisgICAgICAgICAgICBtUGVuZGluZ01hc2sgfD0gMTw8T3JpZW50YXRpb247CisgICAgICAgICAgICBtUGVuZGluZ0V2ZW50c1tPcmllbnRhdGlvbl0ub3JpZW50YXRpb24ucm9sbCA9IHZhbHVlICogQ09OVkVSVF9PX1I7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBFVkVOVF9UWVBFX09SSUVOVF9TVEFUVVM6CisgICAgICAgICAgICB1aW50OF90IHN0YXR1cyA9IHVpbnQ4X3QodmFsdWUgJiBTRU5TT1JfU1RBVEVfTUFTSyk7CisgICAgICAgICAgICBpZiAoc3RhdHVzID09IDQpCisgICAgICAgICAgICAgICAgc3RhdHVzID0gMDsKKyAgICAgICAgICAgIG1QZW5kaW5nTWFzayB8PSAxPDxPcmllbnRhdGlvbjsKKyAgICAgICAgICAgIG1QZW5kaW5nRXZlbnRzW09yaWVudGF0aW9uXS5vcmllbnRhdGlvbi5zdGF0dXMgPSBzdGF0dXM7CisgICAgICAgICAgICBicmVhazsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9leHlub3M0L2hhbC9saWJzZW5zb3JzL0FrbVNlbnNvci5oIGIvZXh5bm9zNC9oYWwvbGlic2Vuc29ycy9Ba21TZW5zb3IuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40NDIxNGUwCi0tLSAvZGV2L251bGwKKysrIGIvZXh5bm9zNC9oYWwvbGlic2Vuc29ycy9Ba21TZW5zb3IuaApAQCAtMCwwICsxLDYyIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDA4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2lmbmRlZiBBTkRST0lEX0FLTV9TRU5TT1JfSAorI2RlZmluZSBBTkRST0lEX0FLTV9TRU5TT1JfSAorCisjaW5jbHVkZSA8c3RkaW50Lmg+CisjaW5jbHVkZSA8ZXJybm8uaD4KKyNpbmNsdWRlIDxzeXMvY2RlZnMuaD4KKyNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KKworCisjaW5jbHVkZSAic2Vuc29ycy5oIgorI2luY2x1ZGUgIlNlbnNvckJhc2UuaCIKKyNpbmNsdWRlICJJbnB1dEV2ZW50UmVhZGVyLmgiCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworc3RydWN0IGlucHV0X2V2ZW50OworCitjbGFzcyBBa21TZW5zb3IgOiBwdWJsaWMgU2Vuc29yQmFzZSB7CitwdWJsaWM6CisgICAgICAgICAgICBBa21TZW5zb3IoKTsKKyAgICB2aXJ0dWFsIH5Ba21TZW5zb3IoKTsKKworICAgIGVudW0geworICAgICAgICBBY2NlbGVyb21ldGVyICAgPSAwLAorICAgICAgICBNYWduZXRpY0ZpZWxkICAgPSAxLAorICAgICAgICBPcmllbnRhdGlvbiAgICAgPSAyLAorICAgICAgICBudW1TZW5zb3JzCisgICAgfTsKKworICAgIHZpcnR1YWwgaW50IHNldERlbGF5KGludDMyX3QgaGFuZGxlLCBpbnQ2NF90IG5zKTsKKyAgICB2aXJ0dWFsIGludCBlbmFibGUoaW50MzJfdCBoYW5kbGUsIGludCBlbmFibGVkKTsKKyAgICB2aXJ0dWFsIGludCByZWFkRXZlbnRzKHNlbnNvcnNfZXZlbnRfdCogZGF0YSwgaW50IGNvdW50KTsKKyAgICB2b2lkIHByb2Nlc3NFdmVudChpbnQgY29kZSwgaW50IHZhbHVlKTsKKworcHJpdmF0ZToKKyAgICBpbnQgbG9hZEFLTUxpYnJhcnkoKTsKKyAgICB2b2lkICptTGliQUtNOworICAgIHVpbnQzMl90IG1FbmFibGVkOworICAgIHVpbnQzMl90IG1QZW5kaW5nTWFzazsKKyAgICBJbnB1dEV2ZW50Q2lyY3VsYXJSZWFkZXIgbUlucHV0UmVhZGVyOworICAgIHNlbnNvcnNfZXZlbnRfdCBtUGVuZGluZ0V2ZW50c1tudW1TZW5zb3JzXTsKK307CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworI2VuZGlmICAvLyBBTkRST0lEX0FLTV9TRU5TT1JfSApkaWZmIC0tZ2l0IGEvZXh5bm9zNC9oYWwvbGlic2Vuc29ycy9BbmRyb2lkLm1rIGIvZXh5bm9zNC9oYWwvbGlic2Vuc29ycy9BbmRyb2lkLm1rCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjE1YzI5YTIKLS0tIC9kZXYvbnVsbAorKysgYi9leHlub3M0L2hhbC9saWJzZW5zb3JzL0FuZHJvaWQubWsKQEAgLTAsMCArMSw0NSBAQAorIyBDb3B5cmlnaHQgKEMpIDIwMDggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorIworIyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyMgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorIyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyMKKyMgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyMKKyMgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorIyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorIyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyMgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorIyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKworCitMT0NBTF9QQVRIIDo9ICQoY2FsbCBteS1kaXIpCisKK2lmbmVxICgkKFRBUkdFVF9TSU1VTEFUT1IpLHRydWUpCisKKyMgSEFMIG1vZHVsZSBpbXBsZW1lbmF0aW9uLCBub3QgcHJlbGlua2VkLCBhbmQgc3RvcmVkIGluCisjIGh3LzxTRU5TT1JTX0hBUkRXQVJFX01PRFVMRV9JRD4uPHJvLnByb2R1Y3QuYm9hcmQ+LnNvCitpbmNsdWRlICQoQ0xFQVJfVkFSUykKKworTE9DQUxfTU9EVUxFIDo9IHNlbnNvcnMuJChUQVJHRVRfQk9BUkRfUExBVEZPUk0pCisKK0xPQ0FMX01PRFVMRV9QQVRIIDo9ICQoVEFSR0VUX09VVF9TSEFSRURfTElCUkFSSUVTKS9odworCitMT0NBTF9NT0RVTEVfVEFHUyA6PSBvcHRpb25hbAorCitMT0NBTF9DRkxBR1MgOj0gLURMT0dfVEFHPVwiU2Vuc29yc1wiCitMT0NBTF9TUkNfRklMRVMgOj0gCQkJCQkJXAorCQkJCXNlbnNvcnMuY3BwIAkJCVwKKwkJCQlTZW5zb3JCYXNlLmNwcAkJCVwKKwkJCQlMaWdodFNlbnNvci5jcHAJCQlcCisJCQkJUHJveGltaXR5U2Vuc29yLmNwcAkJXAorCQkJCUFrbVNlbnNvci5jcHAgICAgICAgICAgICAgICAgICAgXAorCQkJCUd5cm9TZW5zb3IuY3BwICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJbnB1dEV2ZW50UmVhZGVyLmNwcAorCitMT0NBTF9TSEFSRURfTElCUkFSSUVTIDo9IGxpYmxvZyBsaWJjdXRpbHMgbGliZGwKK0xPQ0FMX1BSRUxJTktfTU9EVUxFIDo9IGZhbHNlCisKK2luY2x1ZGUgJChCVUlMRF9TSEFSRURfTElCUkFSWSkKKworZW5kaWYgIyAhVEFSR0VUX1NJTVVMQVRPUgpkaWZmIC0tZ2l0IGEvZXh5bm9zNC9oYWwvbGlic2Vuc29ycy9HeXJvU2Vuc29yLmNwcCBiL2V4eW5vczQvaGFsL2xpYnNlbnNvcnMvR3lyb1NlbnNvci5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZWYwYzAxYwotLS0gL2Rldi9udWxsCisrKyBiL2V4eW5vczQvaGFsL2xpYnNlbnNvcnMvR3lyb1NlbnNvci5jcHAKQEAgLTAsMCArMSwxODUgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMDggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaW5jbHVkZSA8ZmNudGwuaD4KKyNpbmNsdWRlIDxlcnJuby5oPgorI2luY2x1ZGUgPG1hdGguaD4KKyNpbmNsdWRlIDxwb2xsLmg+CisjaW5jbHVkZSA8dW5pc3RkLmg+CisjaW5jbHVkZSA8ZGlyZW50Lmg+CisjaW5jbHVkZSA8c3lzL3NlbGVjdC5oPgorI2luY2x1ZGUgPGN1dGlscy9sb2cuaD4KKworI2luY2x1ZGUgIkd5cm9TZW5zb3IuaCIKKworI2RlZmluZSBGRVRDSF9GVUxMX0VWRU5UX0JFRk9SRV9SRVRVUk4gMQorI2RlZmluZSBJR05PUkVfRVZFTlRfVElNRSAzNTAwMDAwMDAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworR3lyb1NlbnNvcjo6R3lyb1NlbnNvcigpCisgICAgOiBTZW5zb3JCYXNlKE5VTEwsICJneXJvX3NlbnNvciIpLAorICAgICAgbUVuYWJsZWQoMCksCisgICAgICBtSW5wdXRSZWFkZXIoNCksCisgICAgICBtSGFzUGVuZGluZ0V2ZW50KGZhbHNlKSwKKyAgICAgIG1FbmFibGVkVGltZSgwKQoreworICAgIG1QZW5kaW5nRXZlbnQudmVyc2lvbiA9IHNpemVvZihzZW5zb3JzX2V2ZW50X3QpOworICAgIG1QZW5kaW5nRXZlbnQuc2Vuc29yID0gSURfR1k7CisgICAgbVBlbmRpbmdFdmVudC50eXBlID0gU0VOU09SX1RZUEVfR1lST1NDT1BFOworICAgIG1lbXNldChtUGVuZGluZ0V2ZW50LmRhdGEsIDAsIHNpemVvZihtUGVuZGluZ0V2ZW50LmRhdGEpKTsKKworICAgIGlmIChkYXRhX2ZkKSB7CisgICAgICAgIHN0cmNweShpbnB1dF9zeXNmc19wYXRoLCAiL3N5cy9jbGFzcy9pbnB1dC8iKTsKKyAgICAgICAgc3RyY2F0KGlucHV0X3N5c2ZzX3BhdGgsIGlucHV0X25hbWUpOworICAgICAgICBzdHJjYXQoaW5wdXRfc3lzZnNfcGF0aCwgIi9kZXZpY2UvIik7CisgICAgICAgIGlucHV0X3N5c2ZzX3BhdGhfbGVuID0gc3RybGVuKGlucHV0X3N5c2ZzX3BhdGgpOworICAgICAgICBlbmFibGUoMCwgMSk7CisgICAgfQorfQorCitHeXJvU2Vuc29yOjp+R3lyb1NlbnNvcigpIHsKKyAgICBpZiAobUVuYWJsZWQpIHsKKyAgICAgICAgZW5hYmxlKDAsIDApOworICAgIH0KK30KKworaW50IEd5cm9TZW5zb3I6OnNldEluaXRpYWxTdGF0ZSgpIHsKKyAgICBzdHJ1Y3QgaW5wdXRfYWJzaW5mbyBhYnNpbmZvX3g7CisgICAgc3RydWN0IGlucHV0X2Fic2luZm8gYWJzaW5mb195OworICAgIHN0cnVjdCBpbnB1dF9hYnNpbmZvIGFic2luZm9fejsKKyAgICBmbG9hdCB2YWx1ZTsKKyAgICBpZiAoIWlvY3RsKGRhdGFfZmQsIEVWSU9DR0FCUyhFVkVOVF9UWVBFX0dZUk9fWCksICZhYnNpbmZvX3gpICYmCisgICAgICAgICFpb2N0bChkYXRhX2ZkLCBFVklPQ0dBQlMoRVZFTlRfVFlQRV9HWVJPX1gpLCAmYWJzaW5mb195KSAmJgorICAgICAgICAhaW9jdGwoZGF0YV9mZCwgRVZJT0NHQUJTKEVWRU5UX1RZUEVfR1lST19YKSwgJmFic2luZm9feikpIHsKKyAgICAgICAgdmFsdWUgPSBhYnNpbmZvX3gudmFsdWU7CisgICAgICAgIG1QZW5kaW5nRXZlbnQuZGF0YVswXSA9IHZhbHVlICogQ09OVkVSVF9HWVJPX1g7CisgICAgICAgIHZhbHVlID0gYWJzaW5mb194LnZhbHVlOworICAgICAgICBtUGVuZGluZ0V2ZW50LmRhdGFbMV0gPSB2YWx1ZSAqIENPTlZFUlRfR1lST19ZOworICAgICAgICB2YWx1ZSA9IGFic2luZm9feC52YWx1ZTsKKyAgICAgICAgbVBlbmRpbmdFdmVudC5kYXRhWzJdID0gdmFsdWUgKiBDT05WRVJUX0dZUk9fWjsKKyAgICAgICAgbUhhc1BlbmRpbmdFdmVudCA9IHRydWU7CisgICAgfQorICAgIHJldHVybiAwOworfQorCitpbnQgR3lyb1NlbnNvcjo6ZW5hYmxlKGludDMyX3QsIGludCBlbikgeworICAgIGludCBmbGFncyA9IGVuID8gMSA6IDA7CisgICAgaWYgKGZsYWdzICE9IG1FbmFibGVkKSB7CisgICAgICAgIGludCBmZDsKKyAgICAgICAgc3RyY3B5KCZpbnB1dF9zeXNmc19wYXRoW2lucHV0X3N5c2ZzX3BhdGhfbGVuXSwgImVuYWJsZSIpOworICAgICAgICBmZCA9IG9wZW4oaW5wdXRfc3lzZnNfcGF0aCwgT19SRFdSKTsKKyAgICAgICAgaWYgKGZkID49IDApIHsKKyAgICAgICAgICAgIGNoYXIgYnVmWzJdOworICAgICAgICAgICAgaW50IGVycjsKKyAgICAgICAgICAgIGJ1ZlsxXSA9IDA7CisgICAgICAgICAgICBpZiAoZmxhZ3MpIHsKKyAgICAgICAgICAgICAgICBidWZbMF0gPSAnMSc7CisgICAgICAgICAgICAgICAgbUVuYWJsZWRUaW1lID0gZ2V0VGltZXN0YW1wKCkgKyBJR05PUkVfRVZFTlRfVElNRTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgYnVmWzBdID0gJzAnOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZXJyID0gd3JpdGUoZmQsIGJ1Ziwgc2l6ZW9mKGJ1ZikpOworICAgICAgICAgICAgY2xvc2UoZmQpOworICAgICAgICAgICAgbUVuYWJsZWQgPSBmbGFnczsKKyAgICAgICAgICAgIHNldEluaXRpYWxTdGF0ZSgpOworICAgICAgICAgICAgcmV0dXJuIDA7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIC0xOworICAgIH0KKyAgICByZXR1cm4gMDsKK30KKworYm9vbCBHeXJvU2Vuc29yOjpoYXNQZW5kaW5nRXZlbnRzKCkgY29uc3QgeworICAgIHJldHVybiBtSGFzUGVuZGluZ0V2ZW50OworfQorCitpbnQgR3lyb1NlbnNvcjo6c2V0RGVsYXkoaW50MzJfdCBoYW5kbGUsIGludDY0X3QgZGVsYXlfbnMpCit7CisgICAgaW50IGZkOworICAgIHN0cmNweSgmaW5wdXRfc3lzZnNfcGF0aFtpbnB1dF9zeXNmc19wYXRoX2xlbl0sICJwb2xsX2RlbGF5Iik7CisgICAgZmQgPSBvcGVuKGlucHV0X3N5c2ZzX3BhdGgsIE9fUkRXUik7CisgICAgaWYgKGZkID49IDApIHsKKyAgICAgICAgY2hhciBidWZbODBdOworICAgICAgICBzcHJpbnRmKGJ1ZiwgIiVsbGQiLCBkZWxheV9ucyk7CisgICAgICAgIHdyaXRlKGZkLCBidWYsIHN0cmxlbihidWYpKzEpOworICAgICAgICBjbG9zZShmZCk7CisgICAgICAgIHJldHVybiAwOworICAgIH0KKyAgICByZXR1cm4gLTE7Cit9CisKK2ludCBHeXJvU2Vuc29yOjpyZWFkRXZlbnRzKHNlbnNvcnNfZXZlbnRfdCogZGF0YSwgaW50IGNvdW50KQoreworICAgIGlmIChjb3VudCA8IDEpCisgICAgICAgIHJldHVybiAtRUlOVkFMOworCisgICAgaWYgKG1IYXNQZW5kaW5nRXZlbnQpIHsKKyAgICAgICAgbUhhc1BlbmRpbmdFdmVudCA9IGZhbHNlOworICAgICAgICBtUGVuZGluZ0V2ZW50LnRpbWVzdGFtcCA9IGdldFRpbWVzdGFtcCgpOworICAgICAgICAqZGF0YSA9IG1QZW5kaW5nRXZlbnQ7CisgICAgICAgIHJldHVybiBtRW5hYmxlZCA/IDEgOiAwOworICAgIH0KKworICAgIHNzaXplX3QgbiA9IG1JbnB1dFJlYWRlci5maWxsKGRhdGFfZmQpOworICAgIGlmIChuIDwgMCkKKyAgICAgICAgcmV0dXJuIG47CisKKyAgICBpbnQgbnVtRXZlbnRSZWNlaXZlZCA9IDA7CisgICAgaW5wdXRfZXZlbnQgY29uc3QqIGV2ZW50OworCisjaWYgRkVUQ0hfRlVMTF9FVkVOVF9CRUZPUkVfUkVUVVJOCithZ2FpbjoKKyNlbmRpZgorICAgIHdoaWxlIChjb3VudCAmJiBtSW5wdXRSZWFkZXIucmVhZEV2ZW50KCZldmVudCkpIHsKKyAgICAgICAgaW50IHR5cGUgPSBldmVudC0+dHlwZTsKKyAgICAgICAgaWYgKHR5cGUgPT0gRVZfUkVMKSB7CisgICAgICAgICAgICBmbG9hdCB2YWx1ZSA9IGV2ZW50LT52YWx1ZTsKKyAgICAgICAgICAgIGlmIChldmVudC0+Y29kZSA9PSBFVkVOVF9UWVBFX0dZUk9fWCkgeworICAgICAgICAgICAgICAgIG1QZW5kaW5nRXZlbnQuZGF0YVswXSA9IHZhbHVlICogQ09OVkVSVF9HWVJPX1g7CisgICAgICAgICAgICB9IGVsc2UgaWYgKGV2ZW50LT5jb2RlID09IEVWRU5UX1RZUEVfR1lST19ZKSB7CisgICAgICAgICAgICAgICAgbVBlbmRpbmdFdmVudC5kYXRhWzFdID0gdmFsdWUgKiBDT05WRVJUX0dZUk9fWTsKKyAgICAgICAgICAgIH0gZWxzZSBpZiAoZXZlbnQtPmNvZGUgPT0gRVZFTlRfVFlQRV9HWVJPX1opIHsKKyAgICAgICAgICAgICAgICBtUGVuZGluZ0V2ZW50LmRhdGFbMl0gPSB2YWx1ZSAqIENPTlZFUlRfR1lST19aOworICAgICAgICAgICAgfQorICAgICAgICB9IGVsc2UgaWYgKHR5cGUgPT0gRVZfU1lOKSB7CisgICAgICAgICAgICBtUGVuZGluZ0V2ZW50LnRpbWVzdGFtcCA9IHRpbWV2YWxUb05hbm8oZXZlbnQtPnRpbWUpOworICAgICAgICAgICAgaWYgKG1FbmFibGVkKSB7CisgICAgICAgICAgICAgICAgaWYgKG1QZW5kaW5nRXZlbnQudGltZXN0YW1wID49IG1FbmFibGVkVGltZSkgeworICAgICAgICAgICAgICAgICAgICAqZGF0YSsrID0gbVBlbmRpbmdFdmVudDsKKyAgICAgICAgICAgICAgICAgICAgbnVtRXZlbnRSZWNlaXZlZCsrOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBjb3VudC0tOworICAgICAgICAgICAgfQorICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgTE9HRSgiR3lyb1NlbnNvcjogdW5rbm93biBldmVudCAodHlwZT0lZCwgY29kZT0lZCkiLAorICAgICAgICAgICAgICAgICAgICB0eXBlLCBldmVudC0+Y29kZSk7CisgICAgICAgIH0KKyAgICAgICAgbUlucHV0UmVhZGVyLm5leHQoKTsKKyAgICB9CisKKyNpZiBGRVRDSF9GVUxMX0VWRU5UX0JFRk9SRV9SRVRVUk4KKyAgICAvKiBpZiB3ZSBkaWRuJ3QgcmVhZCBhIGNvbXBsZXRlIGV2ZW50LCBzZWUgaWYgd2UgY2FuIGZpbGwgYW5kCisgICAgICAgdHJ5IGFnYWluIGluc3RlYWQgb2YgcmV0dXJuaW5nIHdpdGggbm90aGluZyBhbmQgcmVkb2luZyBwb2xsLiAqLworICAgIGlmIChudW1FdmVudFJlY2VpdmVkID09IDAgJiYgbUVuYWJsZWQgPT0gMSkgeworICAgICAgICBuID0gbUlucHV0UmVhZGVyLmZpbGwoZGF0YV9mZCk7CisgICAgICAgIGlmIChuKQorICAgICAgICAgICAgZ290byBhZ2FpbjsKKyAgICB9CisjZW5kaWYKKworICAgIHJldHVybiBudW1FdmVudFJlY2VpdmVkOworfQorCmRpZmYgLS1naXQgYS9leHlub3M0L2hhbC9saWJzZW5zb3JzL0d5cm9TZW5zb3IuaCBiL2V4eW5vczQvaGFsL2xpYnNlbnNvcnMvR3lyb1NlbnNvci5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU4OTk3ZGUKLS0tIC9kZXYvbnVsbAorKysgYi9leHlub3M0L2hhbC9saWJzZW5zb3JzL0d5cm9TZW5zb3IuaApAQCAtMCwwICsxLDU1IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDA4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2lmbmRlZiBBTkRST0lEX0dZUk9fU0VOU09SX0gKKyNkZWZpbmUgQU5EUk9JRF9HWVJPX1NFTlNPUl9ICisKKyNpbmNsdWRlIDxzdGRpbnQuaD4KKyNpbmNsdWRlIDxlcnJuby5oPgorI2luY2x1ZGUgPHN5cy9jZGVmcy5oPgorI2luY2x1ZGUgPHN5cy90eXBlcy5oPgorCisjaW5jbHVkZSAic2Vuc29ycy5oIgorI2luY2x1ZGUgIlNlbnNvckJhc2UuaCIKKyNpbmNsdWRlICJJbnB1dEV2ZW50UmVhZGVyLmgiCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworc3RydWN0IGlucHV0X2V2ZW50OworCitjbGFzcyBHeXJvU2Vuc29yIDogcHVibGljIFNlbnNvckJhc2UgeworICAgIGludCBtRW5hYmxlZDsKKyAgICBJbnB1dEV2ZW50Q2lyY3VsYXJSZWFkZXIgbUlucHV0UmVhZGVyOworICAgIHNlbnNvcnNfZXZlbnRfdCBtUGVuZGluZ0V2ZW50OworICAgIGJvb2wgbUhhc1BlbmRpbmdFdmVudDsKKyAgICBjaGFyIGlucHV0X3N5c2ZzX3BhdGhbUEFUSF9NQVhdOworICAgIGludCBpbnB1dF9zeXNmc19wYXRoX2xlbjsKKyAgICBpbnQ2NF90IG1FbmFibGVkVGltZTsKKworICAgIGludCBzZXRJbml0aWFsU3RhdGUoKTsKKworcHVibGljOgorICAgICAgICAgICAgR3lyb1NlbnNvcigpOworICAgIHZpcnR1YWwgfkd5cm9TZW5zb3IoKTsKKyAgICB2aXJ0dWFsIGludCByZWFkRXZlbnRzKHNlbnNvcnNfZXZlbnRfdCogZGF0YSwgaW50IGNvdW50KTsKKyAgICB2aXJ0dWFsIGJvb2wgaGFzUGVuZGluZ0V2ZW50cygpIGNvbnN0OworICAgIHZpcnR1YWwgaW50IHNldERlbGF5KGludDMyX3QgaGFuZGxlLCBpbnQ2NF90IG5zKTsKKyAgICB2aXJ0dWFsIGludCBlbmFibGUoaW50MzJfdCBoYW5kbGUsIGludCBlbmFibGVkKTsKK307CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworI2VuZGlmICAvLyBBTkRST0lEX0dZUk9fU0VOU09SX0gKZGlmZiAtLWdpdCBhL2V4eW5vczQvaGFsL2xpYnNlbnNvcnMvSW5wdXRFdmVudFJlYWRlci5jcHAgYi9leHlub3M0L2hhbC9saWJzZW5zb3JzL0lucHV0RXZlbnRSZWFkZXIuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjEwMTRmMjkKLS0tIC9kZXYvbnVsbAorKysgYi9leHlub3M0L2hhbC9saWJzZW5zb3JzL0lucHV0RXZlbnRSZWFkZXIuY3BwCkBAIC0wLDAgKzEsODggQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMDggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaW5jbHVkZSA8c3RkaW50Lmg+CisjaW5jbHVkZSA8ZXJybm8uaD4KKyNpbmNsdWRlIDx1bmlzdGQuaD4KKyNpbmNsdWRlIDxwb2xsLmg+CisKKyNpbmNsdWRlIDxzeXMvY2RlZnMuaD4KKyNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KKworI2luY2x1ZGUgPGxpbnV4L2lucHV0Lmg+CisKKyNpbmNsdWRlIDxjdXRpbHMvbG9nLmg+CisKKyNpbmNsdWRlICJJbnB1dEV2ZW50UmVhZGVyLmgiCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworc3RydWN0IGlucHV0X2V2ZW50OworCitJbnB1dEV2ZW50Q2lyY3VsYXJSZWFkZXI6OklucHV0RXZlbnRDaXJjdWxhclJlYWRlcihzaXplX3QgbnVtRXZlbnRzKQorICAgIDogbUJ1ZmZlcihuZXcgaW5wdXRfZXZlbnRbbnVtRXZlbnRzICogMl0pLAorICAgICAgbUJ1ZmZlckVuZChtQnVmZmVyICsgbnVtRXZlbnRzKSwKKyAgICAgIG1IZWFkKG1CdWZmZXIpLAorICAgICAgbUN1cnIobUJ1ZmZlciksCisgICAgICBtRnJlZVNwYWNlKG51bUV2ZW50cykKK3sKK30KKworSW5wdXRFdmVudENpcmN1bGFyUmVhZGVyOjp+SW5wdXRFdmVudENpcmN1bGFyUmVhZGVyKCkKK3sKKyAgICBkZWxldGUgW10gbUJ1ZmZlcjsKK30KKworc3NpemVfdCBJbnB1dEV2ZW50Q2lyY3VsYXJSZWFkZXI6OmZpbGwoaW50IGZkKQoreworICAgIHNpemVfdCBudW1FdmVudHNSZWFkID0gMDsKKyAgICBpZiAobUZyZWVTcGFjZSkgeworICAgICAgICBjb25zdCBzc2l6ZV90IG5yZWFkID0gcmVhZChmZCwgbUhlYWQsIG1GcmVlU3BhY2UgKiBzaXplb2YoaW5wdXRfZXZlbnQpKTsKKyAgICAgICAgaWYgKG5yZWFkPDAgfHwgbnJlYWQgJSBzaXplb2YoaW5wdXRfZXZlbnQpKSB7CisgICAgICAgICAgICAvLyB3ZSBnb3QgYSBwYXJ0aWFsIGV2ZW50ISEKKyAgICAgICAgICAgIHJldHVybiBucmVhZDwwID8gLWVycm5vIDogLUVJTlZBTDsKKyAgICAgICAgfQorCisgICAgICAgIG51bUV2ZW50c1JlYWQgPSBucmVhZCAvIHNpemVvZihpbnB1dF9ldmVudCk7CisgICAgICAgIGlmIChudW1FdmVudHNSZWFkKSB7CisgICAgICAgICAgICBtSGVhZCArPSBudW1FdmVudHNSZWFkOworICAgICAgICAgICAgbUZyZWVTcGFjZSAtPSBudW1FdmVudHNSZWFkOworICAgICAgICAgICAgaWYgKG1IZWFkID4gbUJ1ZmZlckVuZCkgeworICAgICAgICAgICAgICAgIHNpemVfdCBzID0gbUhlYWQgLSBtQnVmZmVyRW5kOworICAgICAgICAgICAgICAgIG1lbWNweShtQnVmZmVyLCBtQnVmZmVyRW5kLCBzICogc2l6ZW9mKGlucHV0X2V2ZW50KSk7CisgICAgICAgICAgICAgICAgbUhlYWQgPSBtQnVmZmVyICsgczsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiBudW1FdmVudHNSZWFkOworfQorCitzc2l6ZV90IElucHV0RXZlbnRDaXJjdWxhclJlYWRlcjo6cmVhZEV2ZW50KGlucHV0X2V2ZW50IGNvbnN0KiogZXZlbnRzKQoreworICAgICpldmVudHMgPSBtQ3VycjsKKyAgICBzc2l6ZV90IGF2YWlsYWJsZSA9IChtQnVmZmVyRW5kIC0gbUJ1ZmZlcikgLSBtRnJlZVNwYWNlOworICAgIHJldHVybiBhdmFpbGFibGUgPyAxIDogMDsKK30KKwordm9pZCBJbnB1dEV2ZW50Q2lyY3VsYXJSZWFkZXI6Om5leHQoKQoreworICAgIG1DdXJyKys7CisgICAgbUZyZWVTcGFjZSsrOworICAgIGlmIChtQ3VyciA+PSBtQnVmZmVyRW5kKSB7CisgICAgICAgIG1DdXJyID0gbUJ1ZmZlcjsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9leHlub3M0L2hhbC9saWJzZW5zb3JzL0lucHV0RXZlbnRSZWFkZXIuaCBiL2V4eW5vczQvaGFsL2xpYnNlbnNvcnMvSW5wdXRFdmVudFJlYWRlci5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjE4MGFhZGUKLS0tIC9kZXYvbnVsbAorKysgYi9leHlub3M0L2hhbC9saWJzZW5zb3JzL0lucHV0RXZlbnRSZWFkZXIuaApAQCAtMCwwICsxLDQ3IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDA4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2lmbmRlZiBBTkRST0lEX0lOUFVUX0VWRU5UX1JFQURFUl9ICisjZGVmaW5lIEFORFJPSURfSU5QVVRfRVZFTlRfUkVBREVSX0gKKworI2luY2x1ZGUgPHN0ZGludC5oPgorI2luY2x1ZGUgPGVycm5vLmg+CisjaW5jbHVkZSA8c3lzL2NkZWZzLmg+CisjaW5jbHVkZSA8c3lzL3R5cGVzLmg+CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworc3RydWN0IGlucHV0X2V2ZW50OworCitjbGFzcyBJbnB1dEV2ZW50Q2lyY3VsYXJSZWFkZXIKK3sKKyAgICBzdHJ1Y3QgaW5wdXRfZXZlbnQqIGNvbnN0IG1CdWZmZXI7CisgICAgc3RydWN0IGlucHV0X2V2ZW50KiBjb25zdCBtQnVmZmVyRW5kOworICAgIHN0cnVjdCBpbnB1dF9ldmVudCogbUhlYWQ7CisgICAgc3RydWN0IGlucHV0X2V2ZW50KiBtQ3VycjsKKyAgICBzc2l6ZV90IG1GcmVlU3BhY2U7CisKK3B1YmxpYzoKKyAgICBJbnB1dEV2ZW50Q2lyY3VsYXJSZWFkZXIoc2l6ZV90IG51bUV2ZW50cyk7CisgICAgfklucHV0RXZlbnRDaXJjdWxhclJlYWRlcigpOworICAgIHNzaXplX3QgZmlsbChpbnQgZmQpOworICAgIHNzaXplX3QgcmVhZEV2ZW50KGlucHV0X2V2ZW50IGNvbnN0KiogZXZlbnRzKTsKKyAgICB2b2lkIG5leHQoKTsKK307CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworI2VuZGlmICAvLyBBTkRST0lEX0lOUFVUX0VWRU5UX1JFQURFUl9ICmRpZmYgLS1naXQgYS9leHlub3M0L2hhbC9saWJzZW5zb3JzL0xpZ2h0U2Vuc29yLmNwcCBiL2V4eW5vczQvaGFsL2xpYnNlbnNvcnMvTGlnaHRTZW5zb3IuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjFkNGYwZTQKLS0tIC9kZXYvbnVsbAorKysgYi9leHlub3M0L2hhbC9saWJzZW5zb3JzL0xpZ2h0U2Vuc29yLmNwcApAQCAtMCwwICsxLDE2MCBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAwOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpbmNsdWRlIDxmY250bC5oPgorI2luY2x1ZGUgPGVycm5vLmg+CisjaW5jbHVkZSA8bWF0aC5oPgorI2luY2x1ZGUgPHBvbGwuaD4KKyNpbmNsdWRlIDx1bmlzdGQuaD4KKyNpbmNsdWRlIDxkaXJlbnQuaD4KKyNpbmNsdWRlIDxzeXMvc2VsZWN0Lmg+CisKKyNpbmNsdWRlIDxsaW51eC9saWdodHNlbnNvci5oPgorCisjaW5jbHVkZSA8Y3V0aWxzL2xvZy5oPgorCisjaW5jbHVkZSAiTGlnaHRTZW5zb3IuaCIKKworLy8gI2RlZmluZSBMT0dfTkRFQlVHIDAKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCitMaWdodFNlbnNvcjo6TGlnaHRTZW5zb3IoKQorICAgIDogU2Vuc29yQmFzZShOVUxMLCAibGlnaHRfc2Vuc29yIiksCisgICAgICBtRW5hYmxlZCgwKSwKKyAgICAgIG1JbnB1dFJlYWRlcig0KSwKKyAgICAgIG1IYXNQZW5kaW5nRXZlbnQoZmFsc2UpCit7CisgICAgbVBlbmRpbmdFdmVudC52ZXJzaW9uID0gc2l6ZW9mKHNlbnNvcnNfZXZlbnRfdCk7CisgICAgbVBlbmRpbmdFdmVudC5zZW5zb3IgPSBJRF9MOworICAgIG1QZW5kaW5nRXZlbnQudHlwZSA9IFNFTlNPUl9UWVBFX0xJR0hUOworICAgIG1lbXNldChtUGVuZGluZ0V2ZW50LmRhdGEsIDAsIHNpemVvZihtUGVuZGluZ0V2ZW50LmRhdGEpKTsKKworICAgIGlmIChkYXRhX2ZkKSB7CisgICAgICAgIHN0cmNweShpbnB1dF9zeXNmc19wYXRoLCAiL3N5cy9jbGFzcy9pbnB1dC8iKTsKKyAgICAgICAgc3RyY2F0KGlucHV0X3N5c2ZzX3BhdGgsIGlucHV0X25hbWUpOworICAgICAgICBzdHJjYXQoaW5wdXRfc3lzZnNfcGF0aCwgIi9kZXZpY2UvIik7CisgICAgICAgIGlucHV0X3N5c2ZzX3BhdGhfbGVuID0gc3RybGVuKGlucHV0X3N5c2ZzX3BhdGgpOworICAgICAgICBlbmFibGUoMCwgMSk7CisgICAgfQorfQorCitMaWdodFNlbnNvcjo6fkxpZ2h0U2Vuc29yKCkgeworICAgICBpZiAobUVuYWJsZWQpIHsKKyAgICAgICAgZW5hYmxlKDAsIDApOworICAgIH0KK30KKworaW50IExpZ2h0U2Vuc29yOjpzZXRJbml0aWFsU3RhdGUoKSB7CisgICAgc3RydWN0IGlucHV0X2Fic2luZm8gYWJzaW5mbzsKKyAgICBpZiAoIWlvY3RsKGRhdGFfZmQsIEVWSU9DR0FCUyhFVkVOVF9UWVBFX0xJR0hUKSwgJmFic2luZm8pKSB7CisgICAgICAgIC8vIG1ha2Ugc3VyZSB0byByZXBvcnQgYW4gZXZlbnQgaW1tZWRpYXRlbHkKKyAgICAgICAgbUhhc1BlbmRpbmdFdmVudCA9IHRydWU7CisgICAgICAgIG1QZW5kaW5nRXZlbnQubGlnaHQgPSBhYnNpbmZvLnZhbHVlOworICAgIH0KKyAgICByZXR1cm4gMDsKK30KKworaW50IExpZ2h0U2Vuc29yOjpzZXREZWxheShpbnQzMl90IGhhbmRsZSwgaW50NjRfdCBucykKK3sKKyAgICBpbnQgZmQ7CisgICAgc3RyY3B5KCZpbnB1dF9zeXNmc19wYXRoW2lucHV0X3N5c2ZzX3BhdGhfbGVuXSwgInBvbGxfZGVsYXkiKTsKKyAgICBmZCA9IG9wZW4oaW5wdXRfc3lzZnNfcGF0aCwgT19SRFdSKTsKKyAgICBpZiAoZmQgPj0gMCkgeworICAgICAgICBjaGFyIGJ1Zls4MF07CisgICAgICAgIHNwcmludGYoYnVmLCAiJWxsZCIsIG5zKTsKKyAgICAgICAgd3JpdGUoZmQsIGJ1Ziwgc3RybGVuKGJ1ZikrMSk7CisgICAgICAgIGNsb3NlKGZkKTsKKyAgICAgICAgcmV0dXJuIDA7CisgICAgfQorICAgIHJldHVybiAtMTsKK30KKworaW50IExpZ2h0U2Vuc29yOjplbmFibGUoaW50MzJfdCBoYW5kbGUsIGludCBlbikKK3sKKyAgICBpbnQgZmxhZ3MgPSBlbiA/IDEgOiAwOworICAgIGlmIChmbGFncyAhPSBtRW5hYmxlZCkgeworICAgICAgICBpbnQgZmQ7CisgICAgICAgIHN0cmNweSgmaW5wdXRfc3lzZnNfcGF0aFtpbnB1dF9zeXNmc19wYXRoX2xlbl0sICJlbmFibGUiKTsKKyAgICAgICAgZmQgPSBvcGVuKGlucHV0X3N5c2ZzX3BhdGgsIE9fUkRXUik7CisgICAgICAgIGlmIChmZCA+PSAwKSB7CisgICAgICAgICAgICBjaGFyIGJ1ZlsyXTsKKyAgICAgICAgICAgIGludCBlcnI7CisgICAgICAgICAgICBidWZbMV0gPSAwOworICAgICAgICAgICAgaWYgKGZsYWdzKSB7CisgICAgICAgICAgICAgICAgYnVmWzBdID0gJzEnOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBidWZbMF0gPSAnMCc7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlcnIgPSB3cml0ZShmZCwgYnVmLCBzaXplb2YoYnVmKSk7CisgICAgICAgICAgICBjbG9zZShmZCk7CisgICAgICAgICAgICBtRW5hYmxlZCA9IGZsYWdzOworICAgICAgICAgICAgcmV0dXJuIDA7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIC0xOworICAgIH0KKyAgICByZXR1cm4gMDsKK30KKworYm9vbCBMaWdodFNlbnNvcjo6aGFzUGVuZGluZ0V2ZW50cygpIGNvbnN0IHsKKyAgICByZXR1cm4gbUhhc1BlbmRpbmdFdmVudDsKK30KKworaW50IExpZ2h0U2Vuc29yOjpyZWFkRXZlbnRzKHNlbnNvcnNfZXZlbnRfdCogZGF0YSwgaW50IGNvdW50KQoreworICAgIGlmIChjb3VudCA8IDEpCisgICAgICAgIHJldHVybiAtRUlOVkFMOworCisgICAgaWYgKG1IYXNQZW5kaW5nRXZlbnQpIHsKKyAgICAgICAgbUhhc1BlbmRpbmdFdmVudCA9IGZhbHNlOworICAgICAgICBtUGVuZGluZ0V2ZW50LnRpbWVzdGFtcCA9IGdldFRpbWVzdGFtcCgpOworICAgICAgICAqZGF0YSA9IG1QZW5kaW5nRXZlbnQ7CisgICAgICAgIHJldHVybiBtRW5hYmxlZCA/IDEgOiAwOworICAgIH0KKworICAgIHNzaXplX3QgbiA9IG1JbnB1dFJlYWRlci5maWxsKGRhdGFfZmQpOworICAgIGlmIChuIDwgMCkKKyAgICAgICAgcmV0dXJuIG47CisKKyAgICBpbnQgbnVtRXZlbnRSZWNlaXZlZCA9IDA7CisgICAgaW5wdXRfZXZlbnQgY29uc3QqIGV2ZW50OworCisgICAgd2hpbGUgKGNvdW50ICYmIG1JbnB1dFJlYWRlci5yZWFkRXZlbnQoJmV2ZW50KSkgeworICAgICAgICBpbnQgdHlwZSA9IGV2ZW50LT50eXBlOworICAgICAgICBpZiAodHlwZSA9PSBFVl9BQlMpIHsKKyAgICAgICAgICAgIGlmIChldmVudC0+Y29kZSA9PSBFVkVOVF9UWVBFX0xJR0hUKSB7CisgICAgICAgICAgICAgICAgaWYgKGV2ZW50LT52YWx1ZSAhPSAtMSkgeworICAgICAgICAgICAgICAgICAgICBMT0dWKCJMaWdodFNlbnNvcjogZXZlbnQgKHZhbHVlPSVkKSIsIGV2ZW50LT52YWx1ZSk7CisgICAgICAgICAgICAgICAgICAgIC8vIEZJWE1FOiBub3Qgc3VyZSB3aHkgd2UncmUgZ2V0dGluZyAtMSBzb21ldGltZXMKKyAgICAgICAgICAgICAgICAgICAgbVBlbmRpbmdFdmVudC5saWdodCA9IGV2ZW50LT52YWx1ZTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0gZWxzZSBpZiAodHlwZSA9PSBFVl9TWU4pIHsKKyAgICAgICAgICAgIG1QZW5kaW5nRXZlbnQudGltZXN0YW1wID0gdGltZXZhbFRvTmFubyhldmVudC0+dGltZSk7CisgICAgICAgICAgICBpZiAobUVuYWJsZWQpIHsKKyAgICAgICAgICAgICAgICAqZGF0YSsrID0gbVBlbmRpbmdFdmVudDsKKyAgICAgICAgICAgICAgICBjb3VudC0tOworICAgICAgICAgICAgICAgIG51bUV2ZW50UmVjZWl2ZWQrKzsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIExPR0UoIkxpZ2h0U2Vuc29yOiB1bmtub3duIGV2ZW50ICh0eXBlPSVkLCBjb2RlPSVkKSIsCisgICAgICAgICAgICAgICAgICAgIHR5cGUsIGV2ZW50LT5jb2RlKTsKKyAgICAgICAgfQorICAgICAgICBtSW5wdXRSZWFkZXIubmV4dCgpOworICAgIH0KKworICAgIHJldHVybiBudW1FdmVudFJlY2VpdmVkOworfQpkaWZmIC0tZ2l0IGEvZXh5bm9zNC9oYWwvbGlic2Vuc29ycy9MaWdodFNlbnNvci5oIGIvZXh5bm9zNC9oYWwvbGlic2Vuc29ycy9MaWdodFNlbnNvci5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjg1ZTY1ZDkKLS0tIC9kZXYvbnVsbAorKysgYi9leHlub3M0L2hhbC9saWJzZW5zb3JzL0xpZ2h0U2Vuc29yLmgKQEAgLTAsMCArMSw1NSBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAwOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpZm5kZWYgQU5EUk9JRF9MSUdIVF9TRU5TT1JfSAorI2RlZmluZSBBTkRST0lEX0xJR0hUX1NFTlNPUl9ICisKKyNpbmNsdWRlIDxzdGRpbnQuaD4KKyNpbmNsdWRlIDxlcnJuby5oPgorI2luY2x1ZGUgPHN5cy9jZGVmcy5oPgorI2luY2x1ZGUgPHN5cy90eXBlcy5oPgorCisjaW5jbHVkZSAic2Vuc29ycy5oIgorI2luY2x1ZGUgIlNlbnNvckJhc2UuaCIKKyNpbmNsdWRlICJJbnB1dEV2ZW50UmVhZGVyLmgiCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworc3RydWN0IGlucHV0X2V2ZW50OworCitjbGFzcyBMaWdodFNlbnNvciA6IHB1YmxpYyBTZW5zb3JCYXNlIHsKKyAgICBpbnQgbUVuYWJsZWQ7CisgICAgSW5wdXRFdmVudENpcmN1bGFyUmVhZGVyIG1JbnB1dFJlYWRlcjsKKyAgICBzZW5zb3JzX2V2ZW50X3QgbVBlbmRpbmdFdmVudDsKKyAgICBib29sIG1IYXNQZW5kaW5nRXZlbnQ7CisgICAgY2hhciBpbnB1dF9zeXNmc19wYXRoW1BBVEhfTUFYXTsKKyAgICBpbnQgaW5wdXRfc3lzZnNfcGF0aF9sZW47CisKKyAgICBmbG9hdCBpbmRleFRvVmFsdWUoc2l6ZV90IGluZGV4KSBjb25zdDsKKyAgICBpbnQgc2V0SW5pdGlhbFN0YXRlKCk7CisKK3B1YmxpYzoKKyAgICAgICAgICAgIExpZ2h0U2Vuc29yKCk7CisgICAgdmlydHVhbCB+TGlnaHRTZW5zb3IoKTsKKyAgICB2aXJ0dWFsIGludCByZWFkRXZlbnRzKHNlbnNvcnNfZXZlbnRfdCogZGF0YSwgaW50IGNvdW50KTsKKyAgICB2aXJ0dWFsIGJvb2wgaGFzUGVuZGluZ0V2ZW50cygpIGNvbnN0OworICAgIHZpcnR1YWwgaW50IHNldERlbGF5KGludDMyX3QgaGFuZGxlLCBpbnQ2NF90IG5zKTsKKyAgICB2aXJ0dWFsIGludCBlbmFibGUoaW50MzJfdCBoYW5kbGUsIGludCBlbmFibGVkKTsKK307CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworI2VuZGlmICAvLyBBTkRST0lEX0xJR0hUX1NFTlNPUl9ICmRpZmYgLS1naXQgYS9leHlub3M0L2hhbC9saWJzZW5zb3JzL01PRFVMRV9MSUNFTlNFX0FQQUNIRTIgYi9leHlub3M0L2hhbC9saWJzZW5zb3JzL01PRFVMRV9MSUNFTlNFX0FQQUNIRTIKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTY5ZGUyOQotLS0gL2Rldi9udWxsCisrKyBiL2V4eW5vczQvaGFsL2xpYnNlbnNvcnMvTU9EVUxFX0xJQ0VOU0VfQVBBQ0hFMgpkaWZmIC0tZ2l0IGEvZXh5bm9zNC9oYWwvbGlic2Vuc29ycy9Qcm94aW1pdHlTZW5zb3IuY3BwIGIvZXh5bm9zNC9oYWwvbGlic2Vuc29ycy9Qcm94aW1pdHlTZW5zb3IuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQ2NDI0YTUKLS0tIC9kZXYvbnVsbAorKysgYi9leHlub3M0L2hhbC9saWJzZW5zb3JzL1Byb3hpbWl0eVNlbnNvci5jcHAKQEAgLTAsMCArMSwxNDQgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMDggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaW5jbHVkZSA8ZmNudGwuaD4KKyNpbmNsdWRlIDxlcnJuby5oPgorI2luY2x1ZGUgPG1hdGguaD4KKyNpbmNsdWRlIDxwb2xsLmg+CisjaW5jbHVkZSA8dW5pc3RkLmg+CisjaW5jbHVkZSA8ZGlyZW50Lmg+CisjaW5jbHVkZSA8c3lzL3NlbGVjdC5oPgorCisjaW5jbHVkZSA8bGludXgvY2FwZWxsYV9jbTM2MDIuaD4KKworI2luY2x1ZGUgPGN1dGlscy9sb2cuaD4KKworI2luY2x1ZGUgIlByb3hpbWl0eVNlbnNvci5oIgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK1Byb3hpbWl0eVNlbnNvcjo6UHJveGltaXR5U2Vuc29yKCkKKyAgICA6IFNlbnNvckJhc2UoTlVMTCwgInByb3hpbWl0eV9zZW5zb3IiKSwKKyAgICAgIG1FbmFibGVkKDApLAorICAgICAgbUlucHV0UmVhZGVyKDQpLAorICAgICAgbUhhc1BlbmRpbmdFdmVudChmYWxzZSkKK3sKKyAgICBtUGVuZGluZ0V2ZW50LnZlcnNpb24gPSBzaXplb2Yoc2Vuc29yc19ldmVudF90KTsKKyAgICBtUGVuZGluZ0V2ZW50LnNlbnNvciA9IElEX1A7CisgICAgbVBlbmRpbmdFdmVudC50eXBlID0gU0VOU09SX1RZUEVfUFJPWElNSVRZOworICAgIG1lbXNldChtUGVuZGluZ0V2ZW50LmRhdGEsIDAsIHNpemVvZihtUGVuZGluZ0V2ZW50LmRhdGEpKTsKKworICAgIGlmIChkYXRhX2ZkKSB7CisgICAgICAgIHN0cmNweShpbnB1dF9zeXNmc19wYXRoLCAiL3N5cy9jbGFzcy9pbnB1dC8iKTsKKyAgICAgICAgc3RyY2F0KGlucHV0X3N5c2ZzX3BhdGgsIGlucHV0X25hbWUpOworICAgICAgICBzdHJjYXQoaW5wdXRfc3lzZnNfcGF0aCwgIi9kZXZpY2UvIik7CisgICAgICAgIGlucHV0X3N5c2ZzX3BhdGhfbGVuID0gc3RybGVuKGlucHV0X3N5c2ZzX3BhdGgpOworICAgICAgICBlbmFibGUoMCwgMSk7CisgICAgfQorfQorCitQcm94aW1pdHlTZW5zb3I6On5Qcm94aW1pdHlTZW5zb3IoKSB7CisgICAgaWYgKG1FbmFibGVkKSB7CisgICAgICAgIGVuYWJsZSgwLCAwKTsKKyAgICB9Cit9CisKK2ludCBQcm94aW1pdHlTZW5zb3I6OnNldEluaXRpYWxTdGF0ZSgpIHsKKyAgICBzdHJ1Y3QgaW5wdXRfYWJzaW5mbyBhYnNpbmZvOworICAgIGlmICghaW9jdGwoZGF0YV9mZCwgRVZJT0NHQUJTKEVWRU5UX1RZUEVfUFJPWElNSVRZKSwgJmFic2luZm8pKSB7CisgICAgICAgIC8vIG1ha2Ugc3VyZSB0byByZXBvcnQgYW4gZXZlbnQgaW1tZWRpYXRlbHkKKyAgICAgICAgbUhhc1BlbmRpbmdFdmVudCA9IHRydWU7CisgICAgICAgIG1QZW5kaW5nRXZlbnQuZGlzdGFuY2UgPSBpbmRleFRvVmFsdWUoYWJzaW5mby52YWx1ZSk7CisgICAgfQorICAgIHJldHVybiAwOworfQorCitpbnQgUHJveGltaXR5U2Vuc29yOjplbmFibGUoaW50MzJfdCwgaW50IGVuKSB7CisgICAgaW50IGZsYWdzID0gZW4gPyAxIDogMDsKKyAgICBpZiAoZmxhZ3MgIT0gbUVuYWJsZWQpIHsKKyAgICAgICAgaW50IGZkOworICAgICAgICBzdHJjcHkoJmlucHV0X3N5c2ZzX3BhdGhbaW5wdXRfc3lzZnNfcGF0aF9sZW5dLCAiZW5hYmxlIik7CisgICAgICAgIGZkID0gb3BlbihpbnB1dF9zeXNmc19wYXRoLCBPX1JEV1IpOworICAgICAgICBpZiAoZmQgPj0gMCkgeworICAgICAgICAgICAgY2hhciBidWZbMl07CisgICAgICAgICAgICBidWZbMV0gPSAwOworICAgICAgICAgICAgaWYgKGZsYWdzKSB7CisgICAgICAgICAgICAgICAgYnVmWzBdID0gJzEnOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBidWZbMF0gPSAnMCc7CisgICAgICAgICAgICB9CisgICAgICAgICAgICB3cml0ZShmZCwgYnVmLCBzaXplb2YoYnVmKSk7CisgICAgICAgICAgICBjbG9zZShmZCk7CisgICAgICAgICAgICBtRW5hYmxlZCA9IGZsYWdzOworICAgICAgICAgICAgc2V0SW5pdGlhbFN0YXRlKCk7CisgICAgICAgICAgICByZXR1cm4gMDsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gLTE7CisgICAgfQorICAgIHJldHVybiAwOworfQorCitib29sIFByb3hpbWl0eVNlbnNvcjo6aGFzUGVuZGluZ0V2ZW50cygpIGNvbnN0IHsKKyAgICByZXR1cm4gbUhhc1BlbmRpbmdFdmVudDsKK30KKworaW50IFByb3hpbWl0eVNlbnNvcjo6cmVhZEV2ZW50cyhzZW5zb3JzX2V2ZW50X3QqIGRhdGEsIGludCBjb3VudCkKK3sKKyAgICBpZiAoY291bnQgPCAxKQorICAgICAgICByZXR1cm4gLUVJTlZBTDsKKworICAgIGlmIChtSGFzUGVuZGluZ0V2ZW50KSB7CisgICAgICAgIG1IYXNQZW5kaW5nRXZlbnQgPSBmYWxzZTsKKyAgICAgICAgbVBlbmRpbmdFdmVudC50aW1lc3RhbXAgPSBnZXRUaW1lc3RhbXAoKTsKKyAgICAgICAgKmRhdGEgPSBtUGVuZGluZ0V2ZW50OworICAgICAgICByZXR1cm4gbUVuYWJsZWQgPyAxIDogMDsKKyAgICB9CisKKyAgICBzc2l6ZV90IG4gPSBtSW5wdXRSZWFkZXIuZmlsbChkYXRhX2ZkKTsKKyAgICBpZiAobiA8IDApCisgICAgICAgIHJldHVybiBuOworCisgICAgaW50IG51bUV2ZW50UmVjZWl2ZWQgPSAwOworICAgIGlucHV0X2V2ZW50IGNvbnN0KiBldmVudDsKKworICAgIHdoaWxlIChjb3VudCAmJiBtSW5wdXRSZWFkZXIucmVhZEV2ZW50KCZldmVudCkpIHsKKyAgICAgICAgaW50IHR5cGUgPSBldmVudC0+dHlwZTsKKyAgICAgICAgaWYgKHR5cGUgPT0gRVZfQUJTKSB7CisgICAgICAgICAgICBpZiAoZXZlbnQtPmNvZGUgPT0gRVZFTlRfVFlQRV9QUk9YSU1JVFkpIHsKKyAgICAgICAgICAgICAgICBtUGVuZGluZ0V2ZW50LmRpc3RhbmNlID0gaW5kZXhUb1ZhbHVlKGV2ZW50LT52YWx1ZSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0gZWxzZSBpZiAodHlwZSA9PSBFVl9TWU4pIHsKKyAgICAgICAgICAgIG1QZW5kaW5nRXZlbnQudGltZXN0YW1wID0gdGltZXZhbFRvTmFubyhldmVudC0+dGltZSk7CisgICAgICAgICAgICBpZiAobUVuYWJsZWQpIHsKKyAgICAgICAgICAgICAgICAqZGF0YSsrID0gbVBlbmRpbmdFdmVudDsKKyAgICAgICAgICAgICAgICBjb3VudC0tOworICAgICAgICAgICAgICAgIG51bUV2ZW50UmVjZWl2ZWQrKzsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIExPR0UoIlByb3hpbWl0eVNlbnNvcjogdW5rbm93biBldmVudCAodHlwZT0lZCwgY29kZT0lZCkiLAorICAgICAgICAgICAgICAgICAgICB0eXBlLCBldmVudC0+Y29kZSk7CisgICAgICAgIH0KKyAgICAgICAgbUlucHV0UmVhZGVyLm5leHQoKTsKKyAgICB9CisKKyAgICByZXR1cm4gbnVtRXZlbnRSZWNlaXZlZDsKK30KKworZmxvYXQgUHJveGltaXR5U2Vuc29yOjppbmRleFRvVmFsdWUoc2l6ZV90IGluZGV4KSBjb25zdAoreworICAgIExPR1YoIlByb3hpbWl0eVNlbnNvcjogSW5kZXggPSAlenUiLCBpbmRleCk7CisgICAgcmV0dXJuIGluZGV4ICogUFJPWElNSVRZX1RIUkVTSE9MRF9DTTsKK30KZGlmZiAtLWdpdCBhL2V4eW5vczQvaGFsL2xpYnNlbnNvcnMvUHJveGltaXR5U2Vuc29yLmggYi9leHlub3M0L2hhbC9saWJzZW5zb3JzL1Byb3hpbWl0eVNlbnNvci5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjA4ZWE0OWMKLS0tIC9kZXYvbnVsbAorKysgYi9leHlub3M0L2hhbC9saWJzZW5zb3JzL1Byb3hpbWl0eVNlbnNvci5oCkBAIC0wLDAgKzEsNTQgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMDggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaWZuZGVmIEFORFJPSURfUFJPWElNSVRZX1NFTlNPUl9ICisjZGVmaW5lIEFORFJPSURfUFJPWElNSVRZX1NFTlNPUl9ICisKKyNpbmNsdWRlIDxzdGRpbnQuaD4KKyNpbmNsdWRlIDxlcnJuby5oPgorI2luY2x1ZGUgPHN5cy9jZGVmcy5oPgorI2luY2x1ZGUgPHN5cy90eXBlcy5oPgorCisjaW5jbHVkZSAic2Vuc29ycy5oIgorI2luY2x1ZGUgIlNlbnNvckJhc2UuaCIKKyNpbmNsdWRlICJJbnB1dEV2ZW50UmVhZGVyLmgiCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworc3RydWN0IGlucHV0X2V2ZW50OworCitjbGFzcyBQcm94aW1pdHlTZW5zb3IgOiBwdWJsaWMgU2Vuc29yQmFzZSB7CisgICAgaW50IG1FbmFibGVkOworICAgIElucHV0RXZlbnRDaXJjdWxhclJlYWRlciBtSW5wdXRSZWFkZXI7CisgICAgc2Vuc29yc19ldmVudF90IG1QZW5kaW5nRXZlbnQ7CisgICAgYm9vbCBtSGFzUGVuZGluZ0V2ZW50OworICAgIGNoYXIgaW5wdXRfc3lzZnNfcGF0aFtQQVRIX01BWF07CisgICAgaW50IGlucHV0X3N5c2ZzX3BhdGhfbGVuOworCisgICAgaW50IHNldEluaXRpYWxTdGF0ZSgpOworICAgIGZsb2F0IGluZGV4VG9WYWx1ZShzaXplX3QgaW5kZXgpIGNvbnN0OworCitwdWJsaWM6CisgICAgICAgICAgICBQcm94aW1pdHlTZW5zb3IoKTsKKyAgICB2aXJ0dWFsIH5Qcm94aW1pdHlTZW5zb3IoKTsKKyAgICB2aXJ0dWFsIGludCByZWFkRXZlbnRzKHNlbnNvcnNfZXZlbnRfdCogZGF0YSwgaW50IGNvdW50KTsKKyAgICB2aXJ0dWFsIGJvb2wgaGFzUGVuZGluZ0V2ZW50cygpIGNvbnN0OworICAgIHZpcnR1YWwgaW50IGVuYWJsZShpbnQzMl90IGhhbmRsZSwgaW50IGVuYWJsZWQpOworfTsKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisjZW5kaWYgIC8vIEFORFJPSURfUFJPWElNSVRZX1NFTlNPUl9ICmRpZmYgLS1naXQgYS9leHlub3M0L2hhbC9saWJzZW5zb3JzL1NlbnNvckJhc2UuY3BwIGIvZXh5bm9zNC9oYWwvbGlic2Vuc29ycy9TZW5zb3JCYXNlLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kNDQ4ZWIyCi0tLSAvZGV2L251bGwKKysrIGIvZXh5bm9zNC9oYWwvbGlic2Vuc29ycy9TZW5zb3JCYXNlLmNwcApAQCAtMCwwICsxLDEyOCBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAwOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpbmNsdWRlIDxmY250bC5oPgorI2luY2x1ZGUgPGVycm5vLmg+CisjaW5jbHVkZSA8bWF0aC5oPgorI2luY2x1ZGUgPHBvbGwuaD4KKyNpbmNsdWRlIDx1bmlzdGQuaD4KKyNpbmNsdWRlIDxkaXJlbnQuaD4KKyNpbmNsdWRlIDxzeXMvc2VsZWN0Lmg+CisKKyNpbmNsdWRlIDxjdXRpbHMvbG9nLmg+CisKKyNpbmNsdWRlIDxsaW51eC9pbnB1dC5oPgorCisjaW5jbHVkZSAiU2Vuc29yQmFzZS5oIgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK1NlbnNvckJhc2U6OlNlbnNvckJhc2UoCisgICAgICAgIGNvbnN0IGNoYXIqIGRldl9uYW1lLAorICAgICAgICBjb25zdCBjaGFyKiBkYXRhX25hbWUpCisgICAgOiBkZXZfbmFtZShkZXZfbmFtZSksIGRhdGFfbmFtZShkYXRhX25hbWUpLAorICAgICAgZGV2X2ZkKC0xKSwgZGF0YV9mZCgtMSkKK3sKKyAgICBpZiAoZGF0YV9uYW1lKSB7CisgICAgICAgIGRhdGFfZmQgPSBvcGVuSW5wdXQoZGF0YV9uYW1lKTsKKyAgICB9Cit9CisKK1NlbnNvckJhc2U6On5TZW5zb3JCYXNlKCkgeworICAgIGlmIChkYXRhX2ZkID49IDApIHsKKyAgICAgICAgY2xvc2UoZGF0YV9mZCk7CisgICAgfQorICAgIGlmIChkZXZfZmQgPj0gMCkgeworICAgICAgICBjbG9zZShkZXZfZmQpOworICAgIH0KK30KKworaW50IFNlbnNvckJhc2U6Om9wZW5fZGV2aWNlKCkgeworICAgIGlmIChkZXZfZmQ8MCAmJiBkZXZfbmFtZSkgeworICAgICAgICBkZXZfZmQgPSBvcGVuKGRldl9uYW1lLCBPX1JET05MWSk7CisgICAgICAgIExPR0VfSUYoZGV2X2ZkPDAsICJDb3VsZG4ndCBvcGVuICVzICglcykiLCBkZXZfbmFtZSwgc3RyZXJyb3IoZXJybm8pKTsKKyAgICB9CisgICAgcmV0dXJuIDA7Cit9CisKK2ludCBTZW5zb3JCYXNlOjpjbG9zZV9kZXZpY2UoKSB7CisgICAgaWYgKGRldl9mZCA+PSAwKSB7CisgICAgICAgIGNsb3NlKGRldl9mZCk7CisgICAgICAgIGRldl9mZCA9IC0xOworICAgIH0KKyAgICByZXR1cm4gMDsKK30KKworaW50IFNlbnNvckJhc2U6OmdldEZkKCkgY29uc3QgeworICAgIGlmICghZGF0YV9uYW1lKSB7CisgICAgICAgIHJldHVybiBkZXZfZmQ7CisgICAgfQorICAgIHJldHVybiBkYXRhX2ZkOworfQorCitpbnQgU2Vuc29yQmFzZTo6c2V0RGVsYXkoaW50MzJfdCBoYW5kbGUsIGludDY0X3QgbnMpIHsKKyAgICByZXR1cm4gMDsKK30KKworYm9vbCBTZW5zb3JCYXNlOjpoYXNQZW5kaW5nRXZlbnRzKCkgY29uc3QgeworICAgIHJldHVybiBmYWxzZTsKK30KKworaW50NjRfdCBTZW5zb3JCYXNlOjpnZXRUaW1lc3RhbXAoKSB7CisgICAgc3RydWN0IHRpbWVzcGVjIHQ7CisgICAgdC50dl9zZWMgPSB0LnR2X25zZWMgPSAwOworICAgIGNsb2NrX2dldHRpbWUoQ0xPQ0tfTU9OT1RPTklDLCAmdCk7CisgICAgcmV0dXJuIGludDY0X3QodC50dl9zZWMpKjEwMDAwMDAwMDBMTCArIHQudHZfbnNlYzsKK30KKworaW50IFNlbnNvckJhc2U6Om9wZW5JbnB1dChjb25zdCBjaGFyKiBpbnB1dE5hbWUpIHsKKyAgICBpbnQgZmQgPSAtMTsKKyAgICBjb25zdCBjaGFyICpkaXJuYW1lID0gIi9kZXYvaW5wdXQiOworICAgIGNoYXIgZGV2bmFtZVtQQVRIX01BWF07CisgICAgY2hhciAqZmlsZW5hbWU7CisgICAgRElSICpkaXI7CisgICAgc3RydWN0IGRpcmVudCAqZGU7CisgICAgZGlyID0gb3BlbmRpcihkaXJuYW1lKTsKKyAgICBpZihkaXIgPT0gTlVMTCkKKyAgICAgICAgcmV0dXJuIC0xOworICAgIHN0cmNweShkZXZuYW1lLCBkaXJuYW1lKTsKKyAgICBmaWxlbmFtZSA9IGRldm5hbWUgKyBzdHJsZW4oZGV2bmFtZSk7CisgICAgKmZpbGVuYW1lKysgPSAnLyc7CisgICAgd2hpbGUoKGRlID0gcmVhZGRpcihkaXIpKSkgeworICAgICAgICBpZihkZS0+ZF9uYW1lWzBdID09ICcuJyAmJgorICAgICAgICAgICAgICAgIChkZS0+ZF9uYW1lWzFdID09ICdcMCcgfHwKKyAgICAgICAgICAgICAgICAgICAgICAgIChkZS0+ZF9uYW1lWzFdID09ICcuJyAmJiBkZS0+ZF9uYW1lWzJdID09ICdcMCcpKSkKKyAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICBzdHJjcHkoZmlsZW5hbWUsIGRlLT5kX25hbWUpOworICAgICAgICBmZCA9IG9wZW4oZGV2bmFtZSwgT19SRE9OTFkpOworICAgICAgICBpZiAoZmQ+PTApIHsKKyAgICAgICAgICAgIGNoYXIgbmFtZVs4MF07CisgICAgICAgICAgICBpZiAoaW9jdGwoZmQsIEVWSU9DR05BTUUoc2l6ZW9mKG5hbWUpIC0gMSksICZuYW1lKSA8IDEpIHsKKyAgICAgICAgICAgICAgICBuYW1lWzBdID0gJ1wwJzsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmICghc3RyY21wKG5hbWUsIGlucHV0TmFtZSkpIHsKKyAgICAgICAgICAgICAgICBzdHJjcHkoaW5wdXRfbmFtZSwgZmlsZW5hbWUpOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBjbG9zZShmZCk7CisgICAgICAgICAgICAgICAgZmQgPSAtMTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKyAgICBjbG9zZWRpcihkaXIpOworICAgIExPR0VfSUYoZmQ8MCwgImNvdWxkbid0IGZpbmQgJyVzJyBpbnB1dCBkZXZpY2UiLCBpbnB1dE5hbWUpOworICAgIHJldHVybiBmZDsKK30KZGlmZiAtLWdpdCBhL2V4eW5vczQvaGFsL2xpYnNlbnNvcnMvU2Vuc29yQmFzZS5oIGIvZXh5bm9zNC9oYWwvbGlic2Vuc29ycy9TZW5zb3JCYXNlLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYmI0ZDA1NQotLS0gL2Rldi9udWxsCisrKyBiL2V4eW5vczQvaGFsL2xpYnNlbnNvcnMvU2Vuc29yQmFzZS5oCkBAIC0wLDAgKzEsNjUgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMDggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaWZuZGVmIEFORFJPSURfU0VOU09SX0JBU0VfSAorI2RlZmluZSBBTkRST0lEX1NFTlNPUl9CQVNFX0gKKworI2luY2x1ZGUgPHN0ZGludC5oPgorI2luY2x1ZGUgPGVycm5vLmg+CisjaW5jbHVkZSA8c3lzL2NkZWZzLmg+CisjaW5jbHVkZSA8c3lzL3R5cGVzLmg+CisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCitzdHJ1Y3Qgc2Vuc29yc19ldmVudF90OworCitjbGFzcyBTZW5zb3JCYXNlIHsKK3Byb3RlY3RlZDoKKyAgICBjb25zdCBjaGFyKiBkZXZfbmFtZTsKKyAgICBjb25zdCBjaGFyKiBkYXRhX25hbWU7CisgICAgY2hhciAgICAgICAgaW5wdXRfbmFtZVtQQVRIX01BWF07CisgICAgaW50ICAgICAgICAgZGV2X2ZkOworICAgIGludCAgICAgICAgIGRhdGFfZmQ7CisKKyAgICBpbnQgb3BlbklucHV0KGNvbnN0IGNoYXIqIGlucHV0TmFtZSk7CisgICAgc3RhdGljIGludDY0X3QgZ2V0VGltZXN0YW1wKCk7CisKKworICAgIHN0YXRpYyBpbnQ2NF90IHRpbWV2YWxUb05hbm8odGltZXZhbCBjb25zdCYgdCkgeworICAgICAgICByZXR1cm4gdC50dl9zZWMqMTAwMDAwMDAwMExMICsgdC50dl91c2VjKjEwMDA7CisgICAgfQorCisgICAgaW50IG9wZW5fZGV2aWNlKCk7CisgICAgaW50IGNsb3NlX2RldmljZSgpOworCitwdWJsaWM6CisgICAgICAgICAgICBTZW5zb3JCYXNlKAorICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyKiBkZXZfbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciogZGF0YV9uYW1lKTsKKworICAgIHZpcnR1YWwgflNlbnNvckJhc2UoKTsKKworICAgIHZpcnR1YWwgaW50IHJlYWRFdmVudHMoc2Vuc29yc19ldmVudF90KiBkYXRhLCBpbnQgY291bnQpID0gMDsKKyAgICB2aXJ0dWFsIGJvb2wgaGFzUGVuZGluZ0V2ZW50cygpIGNvbnN0OworICAgIHZpcnR1YWwgaW50IGdldEZkKCkgY29uc3Q7CisgICAgdmlydHVhbCBpbnQgc2V0RGVsYXkoaW50MzJfdCBoYW5kbGUsIGludDY0X3QgbnMpOworICAgIHZpcnR1YWwgaW50IGVuYWJsZShpbnQzMl90IGhhbmRsZSwgaW50IGVuYWJsZWQpID0gMDsKK307CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworI2VuZGlmICAvLyBBTkRST0lEX1NFTlNPUl9CQVNFX0gKZGlmZiAtLWdpdCBhL2V4eW5vczQvaGFsL2xpYnNlbnNvcnMvYWs4OTczYi5oIGIvZXh5bm9zNC9oYWwvbGlic2Vuc29ycy9hazg5NzNiLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOWI3YWI2MAotLS0gL2Rldi9udWxsCisrKyBiL2V4eW5vczQvaGFsL2xpYnNlbnNvcnMvYWs4OTczYi5oCkBAIC0wLDAgKzEsNTEgQEAKKy8qCisgKiBEZWZpbml0aW9ucyBmb3IgYWttODk3MyBjb21wYXNzIGNoaXAuCisgKi8KKyNpZm5kZWYgQUtNODk3M19ICisjZGVmaW5lIEFLTTg5NzNfSAorCisjaW5jbHVkZSA8bGludXgvaW9jdGwuaD4KKworI2RlZmluZSBBS004OTczX0kyQ19OQU1FICJhazg5NzNiIgorCisjZGVmaW5lIEFLTUlPICAgICAgICAgICAgICAgICAgIDB4QTEKKworLyogSU9DVExzIGZvciBBS00gbGlicmFyeSAqLworI2RlZmluZSBFQ1NfSU9DVExfV1JJVEUgICAgICAgICBfSU9XKEFLTUlPLCAweDAxLCBjaGFyKikKKyNkZWZpbmUgRUNTX0lPQ1RMX1JFQUQgICAgICAgICAgX0lPV1IoQUtNSU8sIDB4MDIsIGNoYXIqKQorI2RlZmluZSBFQ1NfSU9DVExfUkVTRVQgICAgICAgICBfSU8oQUtNSU8sIDB4MDMpCisjZGVmaW5lIEVDU19JT0NUTF9TRVRfTU9ERSAgICAgIF9JT1coQUtNSU8sIDB4MDQsIHNob3J0KQorI2RlZmluZSBFQ1NfSU9DVExfR0VUREFUQSAgICAgICBfSU9SKEFLTUlPLCAweDA1LCBjaGFyW1NFTlNPUl9EQVRBX1NJWkVdKQorI2RlZmluZSBFQ1NfSU9DVExfU0VUX1lQUiAgICAgICAgICAgICAgIF9JT1coQUtNSU8sIDB4MDYsIHNob3J0WzEyXSkKKyNkZWZpbmUgRUNTX0lPQ1RMX0dFVF9PUEVOX1NUQVRVUyAgICAgICBfSU9SKEFLTUlPLCAweDA3LCBpbnQpCisjZGVmaW5lIEVDU19JT0NUTF9HRVRfQ0xPU0VfU1RBVFVTICAgICAgX0lPUihBS01JTywgMHgwOCwgaW50KQorI2RlZmluZSBFQ1NfSU9DVExfR0VUX0RFTEFZICAgICAgICAgICAgIF9JT1IoQUtNSU8sIDB4MzAsIGludDY0X3QpCisjZGVmaW5lIEVDU19JT0NUTF9HRVRfUFJPSkVDVF9OQU1FICAgICAgX0lPUihBS01JTywgMHgwRCwgY2hhcls2NF0pCisjZGVmaW5lIEVDU19JT0NUTF9HRVRfTUFUUklYICAgICAgICAgICAgX0lPUihBS01JTywgMHgwRSwgc2hvcnQgWzRdWzNdWzNdKQorCisvKiBJT0NUTHMgZm9yIEFQUHMgKi8KKyNkZWZpbmUgRUNTX0lPQ1RMX0FQUF9TRVRfTU9ERSAgICAgICAgICBfSU9XKEFLTUlPLCAweDEwLCBzaG9ydCkKKyNkZWZpbmUgRUNTX0lPQ1RMX0FQUF9TRVRfTUZMQUcgICAgICAgICBfSU9XKEFLTUlPLCAweDExLCBzaG9ydCkKKyNkZWZpbmUgRUNTX0lPQ1RMX0FQUF9HRVRfTUZMQUcgICAgICAgICBfSU9XKEFLTUlPLCAweDEyLCBzaG9ydCkKKyNkZWZpbmUgRUNTX0lPQ1RMX0FQUF9TRVRfQUZMQUcgICAgICAgICBfSU9XKEFLTUlPLCAweDEzLCBzaG9ydCkKKyNkZWZpbmUgRUNTX0lPQ1RMX0FQUF9HRVRfQUZMQUcgICAgICAgICBfSU9SKEFLTUlPLCAweDE0LCBzaG9ydCkKKyNkZWZpbmUgRUNTX0lPQ1RMX0FQUF9TRVRfVEZMQUcgICAgICAgICBfSU9SKEFLTUlPLCAweDE1LCBzaG9ydCkKKyNkZWZpbmUgRUNTX0lPQ1RMX0FQUF9HRVRfVEZMQUcgICAgICAgICBfSU9SKEFLTUlPLCAweDE2LCBzaG9ydCkKKyNkZWZpbmUgRUNTX0lPQ1RMX0FQUF9SRVNFVF9QRURPTUVURVIgICBfSU8oQUtNSU8sIDB4MTcpCisjZGVmaW5lIEVDU19JT0NUTF9BUFBfU0VUX0RFTEFZICAgICAgICAgX0lPVyhBS01JTywgMHgxOCwgaW50NjRfdCkKKyNkZWZpbmUgRUNTX0lPQ1RMX0FQUF9HRVRfREVMQVkgICAgICAgICBFQ1NfSU9DVExfR0VUX0RFTEFZCisKKy8qIFNldCByYXcgbWFnbmV0aWMgdmVjdG9yIGZsYWcgKi8KKyNkZWZpbmUgRUNTX0lPQ1RMX0FQUF9TRVRfTVZGTEFHICAgICAgICBfSU9XKEFLTUlPLCAweDE5LCBzaG9ydCkKKworLyogR2V0IHJhdyBtYWduZXRpYyB2ZWN0b3IgZmxhZyAqLworI2RlZmluZSBFQ1NfSU9DVExfQVBQX0dFVF9NVkZMQUcgICAgICAgIF9JT1IoQUtNSU8sIDB4MUEsIHNob3J0KQorCitzdHJ1Y3QgYWttODk3M19wbGF0Zm9ybV9kYXRhIHsKKyAgICAgICAgc2hvcnQgbGF5b3V0c1s0XVszXVszXTsKKyAgICAgICAgY2hhciBwcm9qZWN0X25hbWVbNjRdOworICAgICAgICBpbnQgZ3Bpb19SU1Q7CisgICAgICAgIGludCBncGlvX0lOVDsKK307CisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvZXh5bm9zNC9oYWwvbGlic2Vuc29ycy9zZW5zb3JzLmNwcCBiL2V4eW5vczQvaGFsL2xpYnNlbnNvcnMvc2Vuc29ycy5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNmYwYmRhZAotLS0gL2Rldi9udWxsCisrKyBiL2V4eW5vczQvaGFsL2xpYnNlbnNvcnMvc2Vuc29ycy5jcHAKQEAgLTAsMCArMSwzMjYgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMDggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjZGVmaW5lIExPR19UQUcgIlNlbnNvcnMiCisKKyNpbmNsdWRlIDxoYXJkd2FyZS9zZW5zb3JzLmg+CisjaW5jbHVkZSA8ZmNudGwuaD4KKyNpbmNsdWRlIDxlcnJuby5oPgorI2luY2x1ZGUgPGRpcmVudC5oPgorI2luY2x1ZGUgPG1hdGguaD4KKyNpbmNsdWRlIDxwb2xsLmg+CisjaW5jbHVkZSA8cHRocmVhZC5oPgorI2luY2x1ZGUgPHN0ZGxpYi5oPgorCisjaW5jbHVkZSA8bGludXgvaW5wdXQuaD4KKworI2luY2x1ZGUgPHV0aWxzL0F0b21pYy5oPgorI2luY2x1ZGUgPHV0aWxzL0xvZy5oPgorCisjaW5jbHVkZSAic2Vuc29ycy5oIgorCisjaW5jbHVkZSAiTGlnaHRTZW5zb3IuaCIKKyNpbmNsdWRlICJQcm94aW1pdHlTZW5zb3IuaCIKKyNpbmNsdWRlICJBa21TZW5zb3IuaCIKKyNpbmNsdWRlICJHeXJvU2Vuc29yLmgiCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworI2RlZmluZSBERUxBWV9PVVRfVElNRSAweDdGRkZGRkZGCisKKyNkZWZpbmUgTElHSFRfU0VOU09SX1BPTExUSU1FICAgIDIwMDAwMDAwMDAKKworCisjZGVmaW5lIFNFTlNPUlNfQUNDRUxFUkFUSU9OICAgICAoMTw8SURfQSkKKyNkZWZpbmUgU0VOU09SU19NQUdORVRJQ19GSUVMRCAgICgxPDxJRF9NKQorI2RlZmluZSBTRU5TT1JTX09SSUVOVEFUSU9OICAgICAgKDE8PElEX08pCisjZGVmaW5lIFNFTlNPUlNfTElHSFQgICAgICAgICAgICAoMTw8SURfTCkKKyNkZWZpbmUgU0VOU09SU19QUk9YSU1JVFkgICAgICAgICgxPDxJRF9QKQorI2RlZmluZSBTRU5TT1JTX0dZUk9TQ09QRSAgICAgICAgKDE8PElEX0dZKQorCisjZGVmaW5lIFNFTlNPUlNfQUNDRUxFUkFUSU9OX0hBTkRMRSAgICAgMAorI2RlZmluZSBTRU5TT1JTX01BR05FVElDX0ZJRUxEX0hBTkRMRSAgIDEKKyNkZWZpbmUgU0VOU09SU19PUklFTlRBVElPTl9IQU5ETEUgICAgICAyCisjZGVmaW5lIFNFTlNPUlNfTElHSFRfSEFORExFICAgICAgICAgICAgMworI2RlZmluZSBTRU5TT1JTX1BST1hJTUlUWV9IQU5ETEUgICAgICAgIDQKKyNkZWZpbmUgU0VOU09SU19HWVJPU0NPUEVfSEFORExFICAgICAgICA1CisKKyNkZWZpbmUgQUtNX0ZUUkFDRSAwCisjZGVmaW5lIEFLTV9ERUJVRyAwCisjZGVmaW5lIEFLTV9EQVRBIDAKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisvKiBUaGUgU0VOU09SUyBNb2R1bGUgKi8KK3N0YXRpYyBjb25zdCBzdHJ1Y3Qgc2Vuc29yX3Qgc1NlbnNvckxpc3RbXSA9IHsKKyAgICAgICAgeyAiS1IzRE0gMy1heGlzIEFjY2VsZXJvbWV0ZXIiLAorICAgICAgICAgICJTVE1pY3JvZWxlY3Ryb25pY3MiLAorICAgICAgICAgIDEsIFNFTlNPUlNfQUNDRUxFUkFUSU9OX0hBTkRMRSwKKyAgICAgICAgICBTRU5TT1JfVFlQRV9BQ0NFTEVST01FVEVSLCBSQU5HRV9BLCBDT05WRVJUX0EsIDAuMjNmLCAyMDAwMCwgeyB9IH0sCisgICAgICAgIHsgIkFLODk3NSAzLWF4aXMgTWFnbmV0aWMgZmllbGQgc2Vuc29yIiwKKyAgICAgICAgICAiQXNhaGkgS2FzZWkgTWljcm9kZXZpY2VzIiwKKyAgICAgICAgICAxLCBTRU5TT1JTX01BR05FVElDX0ZJRUxEX0hBTkRMRSwKKyAgICAgICAgICBTRU5TT1JfVFlQRV9NQUdORVRJQ19GSUVMRCwgMjAwMC4wZiwgQ09OVkVSVF9NLCA2LjhmLCAxNjY2NywgeyB9IH0sCisgICAgICAgIHsgIkFLODk3MyBPcmllbnRhdGlvbiBzZW5zb3IiLAorICAgICAgICAgICJBc2FoaSBLYXNlaSBNaWNyb2RldmljZXMiLAorICAgICAgICAgIDEsIFNFTlNPUlNfT1JJRU5UQVRJT05fSEFORExFLAorICAgICAgICAgIFNFTlNPUl9UWVBFX09SSUVOVEFUSU9OLCAzNjAuMGYsIENPTlZFUlRfTywgNy44ZiwgMTY2NjcsIHsgfSB9LAorICAgICAgICB7ICJDTTM2NjMgTGlnaHQgc2Vuc29yIiwKKyAgICAgICAgICAiQ2FwZWxsYSBNaWNyb3N5c3RlbXMiLAorICAgICAgICAgIDEsIFNFTlNPUlNfTElHSFRfSEFORExFLAorICAgICAgICAgIFNFTlNPUl9UWVBFX0xJR0hULCAxMDI0MC4wZiwgMS4wZiwgMC43NWYsIDAsIHsgfSB9LAorICAgICAgICB7ICJDTTM2NjMgUHJveGltaXR5IHNlbnNvciIsCisgICAgICAgICAgIkNhcGVsbGEgTWljcm9zeXN0ZW1zIiwKKyAgICAgICAgICAxLCBTRU5TT1JTX1BST1hJTUlUWV9IQU5ETEUsCisgICAgICAgICAgU0VOU09SX1RZUEVfUFJPWElNSVRZLCA1LjBmLCA1LjBmLCAwLjc1ZiwgMCwgeyB9IH0sCisgICAgICAgIHsgIkszRyBHeXJvc2NvcGUgc2Vuc29yIiwKKyAgICAgICAgICAiU1RNaWNyb2VsZWN0cm9uaWNzIiwKKyAgICAgICAgICAxLCBTRU5TT1JTX0dZUk9TQ09QRV9IQU5ETEUsCisgICAgICAgICAgU0VOU09SX1RZUEVfR1lST1NDT1BFLCBSQU5HRV9HWVJPLCBDT05WRVJUX0dZUk8sIDYuMWYsIDExOTAsIHsgfSB9LAorfTsKKworCitzdGF0aWMgaW50IG9wZW5fc2Vuc29ycyhjb25zdCBzdHJ1Y3QgaHdfbW9kdWxlX3QqIG1vZHVsZSwgY29uc3QgY2hhciogaWQsCisgICAgICAgICAgICAgICAgICAgICAgICBzdHJ1Y3QgaHdfZGV2aWNlX3QqKiBkZXZpY2UpOworCisKK3N0YXRpYyBpbnQgc2Vuc29yc19fZ2V0X3NlbnNvcnNfbGlzdChzdHJ1Y3Qgc2Vuc29yc19tb2R1bGVfdCogbW9kdWxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cnVjdCBzZW5zb3JfdCBjb25zdCoqIGxpc3QpIAoreworICAgICAgICAqbGlzdCA9IHNTZW5zb3JMaXN0OworICAgICAgICByZXR1cm4gQVJSQVlfU0laRShzU2Vuc29yTGlzdCk7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgaHdfbW9kdWxlX21ldGhvZHNfdCBzZW5zb3JzX21vZHVsZV9tZXRob2RzID0geworICAgICAgICBvcGVuOiBvcGVuX3NlbnNvcnMKK307CisKK3N0cnVjdCBzZW5zb3JzX21vZHVsZV90IEhBTF9NT0RVTEVfSU5GT19TWU0gPSB7CisgICAgICAgIGNvbW1vbjogeworICAgICAgICAgICAgICAgIHRhZzogSEFSRFdBUkVfTU9EVUxFX1RBRywKKyAgICAgICAgICAgICAgICB2ZXJzaW9uX21ham9yOiAxLAorICAgICAgICAgICAgICAgIHZlcnNpb25fbWlub3I6IDAsCisgICAgICAgICAgICAgICAgaWQ6IFNFTlNPUlNfSEFSRFdBUkVfTU9EVUxFX0lELAorICAgICAgICAgICAgICAgIG5hbWU6ICJTYW1zdW5nIFNlbnNvciBtb2R1bGUiLAorICAgICAgICAgICAgICAgIGF1dGhvcjogIlNhbXN1bmcgRWxlY3Ryb25pYyBDb21wYW55IiwKKyAgICAgICAgICAgICAgICBtZXRob2RzOiAmc2Vuc29yc19tb2R1bGVfbWV0aG9kcywKKyAgICAgICAgfSwKKyAgICAgICAgZ2V0X3NlbnNvcnNfbGlzdDogc2Vuc29yc19fZ2V0X3NlbnNvcnNfbGlzdCwKK307CisKK3N0cnVjdCBzZW5zb3JzX3BvbGxfY29udGV4dF90IHsKKyAgICBzdHJ1Y3Qgc2Vuc29yc19wb2xsX2RldmljZV90IGRldmljZTsgLy8gbXVzdCBiZSBmaXJzdAorCisgICAgICAgIHNlbnNvcnNfcG9sbF9jb250ZXh0X3QoKTsKKyAgICAgICAgfnNlbnNvcnNfcG9sbF9jb250ZXh0X3QoKTsKKyAgICBpbnQgYWN0aXZhdGUoaW50IGhhbmRsZSwgaW50IGVuYWJsZWQpOworICAgIGludCBzZXREZWxheShpbnQgaGFuZGxlLCBpbnQ2NF90IG5zKTsKKyAgICBpbnQgcG9sbEV2ZW50cyhzZW5zb3JzX2V2ZW50X3QqIGRhdGEsIGludCBjb3VudCk7CisKK3ByaXZhdGU6CisgICAgZW51bSB7CisgICAgICAgIGxpZ2h0ICAgICAgICAgICA9IDAsCisgICAgICAgIHByb3hpbWl0eSAgICAgICA9IDEsCisgICAgICAgIGFrbSAgICAgICAgICAgICA9IDIsCisgICAgICAgIGd5cm8gICAgICAgICAgICA9IDMsCisgICAgICAgIG51bVNlbnNvckRyaXZlcnMsCisgICAgICAgIG51bUZkcywKKyAgICB9OworCisgICAgc3RhdGljIGNvbnN0IHNpemVfdCB3YWtlID0gbnVtRmRzIC0gMTsKKyAgICBzdGF0aWMgY29uc3QgY2hhciBXQUtFX01FU1NBR0UgPSAnVyc7CisgICAgc3RydWN0IHBvbGxmZCBtUG9sbEZkc1tudW1GZHNdOworICAgIGludCBtV3JpdGVQaXBlRmQ7CisgICAgU2Vuc29yQmFzZSogbVNlbnNvcnNbbnVtU2Vuc29yRHJpdmVyc107CisKKyAgICBpbnQgaGFuZGxlVG9Ecml2ZXIoaW50IGhhbmRsZSkgY29uc3QgeworICAgICAgICBzd2l0Y2ggKGhhbmRsZSkgeworICAgICAgICAgICAgY2FzZSBJRF9BOgorICAgICAgICAgICAgY2FzZSBJRF9NOgorICAgICAgICAgICAgY2FzZSBJRF9POgorICAgICAgICAgICAgICAgIHJldHVybiBha207CisgICAgICAgICAgICBjYXNlIElEX1A6CisgICAgICAgICAgICAgICAgcmV0dXJuIHByb3hpbWl0eTsKKyAgICAgICAgICAgIGNhc2UgSURfTDoKKyAgICAgICAgICAgICAgICByZXR1cm4gbGlnaHQ7CisgICAgICAgICAgICBjYXNlIElEX0dZOgorICAgICAgICAgICAgICAgIHJldHVybiBneXJvOworICAgICAgICB9CisgICAgICAgIHJldHVybiAtRUlOVkFMOworICAgIH0KK307CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworc2Vuc29yc19wb2xsX2NvbnRleHRfdDo6c2Vuc29yc19wb2xsX2NvbnRleHRfdCgpCit7CisgICAgbVNlbnNvcnNbbGlnaHRdID0gbmV3IExpZ2h0U2Vuc29yKCk7CisgICAgbVBvbGxGZHNbbGlnaHRdLmZkID0gbVNlbnNvcnNbbGlnaHRdLT5nZXRGZCgpOworICAgIG1Qb2xsRmRzW2xpZ2h0XS5ldmVudHMgPSBQT0xMSU47CisgICAgbVBvbGxGZHNbbGlnaHRdLnJldmVudHMgPSAwOworCisgICAgbVNlbnNvcnNbcHJveGltaXR5XSA9IG5ldyBQcm94aW1pdHlTZW5zb3IoKTsKKyAgICBtUG9sbEZkc1twcm94aW1pdHldLmZkID0gbVNlbnNvcnNbcHJveGltaXR5XS0+Z2V0RmQoKTsKKyAgICBtUG9sbEZkc1twcm94aW1pdHldLmV2ZW50cyA9IFBPTExJTjsKKyAgICBtUG9sbEZkc1twcm94aW1pdHldLnJldmVudHMgPSAwOworCisgICAgbVNlbnNvcnNbYWttXSA9IG5ldyBBa21TZW5zb3IoKTsKKyAgICBtUG9sbEZkc1tha21dLmZkID0gbVNlbnNvcnNbYWttXS0+Z2V0RmQoKTsKKyAgICBtUG9sbEZkc1tha21dLmV2ZW50cyA9IFBPTExJTjsKKyAgICBtUG9sbEZkc1tha21dLnJldmVudHMgPSAwOworCisgICAgbVNlbnNvcnNbZ3lyb10gPSBuZXcgR3lyb1NlbnNvcigpOworICAgIG1Qb2xsRmRzW2d5cm9dLmZkID0gbVNlbnNvcnNbZ3lyb10tPmdldEZkKCk7CisgICAgbVBvbGxGZHNbZ3lyb10uZXZlbnRzID0gUE9MTElOOworICAgIG1Qb2xsRmRzW2d5cm9dLnJldmVudHMgPSAwOworCisgICAgaW50IHdha2VGZHNbMl07CisgICAgaW50IHJlc3VsdCA9IHBpcGUod2FrZUZkcyk7CisgICAgTE9HRV9JRihyZXN1bHQ8MCwgImVycm9yIGNyZWF0aW5nIHdha2UgcGlwZSAoJXMpIiwgc3RyZXJyb3IoZXJybm8pKTsKKyAgICBmY250bCh3YWtlRmRzWzBdLCBGX1NFVEZMLCBPX05PTkJMT0NLKTsKKyAgICBmY250bCh3YWtlRmRzWzFdLCBGX1NFVEZMLCBPX05PTkJMT0NLKTsKKyAgICBtV3JpdGVQaXBlRmQgPSB3YWtlRmRzWzFdOworCisgICAgbVBvbGxGZHNbd2FrZV0uZmQgPSB3YWtlRmRzWzBdOworICAgIG1Qb2xsRmRzW3dha2VdLmV2ZW50cyA9IFBPTExJTjsKKyAgICBtUG9sbEZkc1t3YWtlXS5yZXZlbnRzID0gMDsKK30KKworc2Vuc29yc19wb2xsX2NvbnRleHRfdDo6fnNlbnNvcnNfcG9sbF9jb250ZXh0X3QoKSB7CisgICAgZm9yIChpbnQgaT0wIDsgaTxudW1TZW5zb3JEcml2ZXJzIDsgaSsrKSB7CisgICAgICAgIGRlbGV0ZSBtU2Vuc29yc1tpXTsKKyAgICB9CisgICAgY2xvc2UobVBvbGxGZHNbd2FrZV0uZmQpOworICAgIGNsb3NlKG1Xcml0ZVBpcGVGZCk7Cit9CisKK2ludCBzZW5zb3JzX3BvbGxfY29udGV4dF90OjphY3RpdmF0ZShpbnQgaGFuZGxlLCBpbnQgZW5hYmxlZCkgeworICAgIGludCBpbmRleCA9IGhhbmRsZVRvRHJpdmVyKGhhbmRsZSk7CisgICAgaWYgKGluZGV4IDwgMCkgcmV0dXJuIGluZGV4OworICAgIGludCBlcnIgPSAgbVNlbnNvcnNbaW5kZXhdLT5lbmFibGUoaGFuZGxlLCBlbmFibGVkKTsKKyAgICBpZiAoZW5hYmxlZCAmJiAhZXJyKSB7CisgICAgICAgIGNvbnN0IGNoYXIgd2FrZU1lc3NhZ2UoV0FLRV9NRVNTQUdFKTsKKyAgICAgICAgaW50IHJlc3VsdCA9IHdyaXRlKG1Xcml0ZVBpcGVGZCwgJndha2VNZXNzYWdlLCAxKTsKKyAgICAgICAgTE9HRV9JRihyZXN1bHQ8MCwgImVycm9yIHNlbmRpbmcgd2FrZSBtZXNzYWdlICglcykiLCBzdHJlcnJvcihlcnJubykpOworICAgIH0KKyAgICByZXR1cm4gZXJyOworfQorCitpbnQgc2Vuc29yc19wb2xsX2NvbnRleHRfdDo6c2V0RGVsYXkoaW50IGhhbmRsZSwgaW50NjRfdCBucykgeworCisgICAgaW50IGluZGV4ID0gaGFuZGxlVG9Ecml2ZXIoaGFuZGxlKTsKKyAgICBpZiAoaW5kZXggPCAwKSByZXR1cm4gaW5kZXg7CisgICAgcmV0dXJuIG1TZW5zb3JzW2luZGV4XS0+c2V0RGVsYXkoaGFuZGxlLCBucyk7Cit9CisKK2ludCBzZW5zb3JzX3BvbGxfY29udGV4dF90Ojpwb2xsRXZlbnRzKHNlbnNvcnNfZXZlbnRfdCogZGF0YSwgaW50IGNvdW50KQoreworICAgIGludCBuYkV2ZW50cyA9IDA7CisgICAgaW50IG4gPSAwOworCisgICAgZG8geworICAgICAgICAvLyBzZWUgaWYgd2UgaGF2ZSBzb21lIGxlZnRvdmVyIGZyb20gdGhlIGxhc3QgcG9sbCgpCisgICAgICAgIGZvciAoaW50IGk9MCA7IGNvdW50ICYmIGk8bnVtU2Vuc29yRHJpdmVycyA7IGkrKykgeworICAgICAgICAgICAgU2Vuc29yQmFzZSogY29uc3Qgc2Vuc29yKG1TZW5zb3JzW2ldKTsKKyAgICAgICAgICAgIGlmICgobVBvbGxGZHNbaV0ucmV2ZW50cyAmIFBPTExJTikgfHwgKHNlbnNvci0+aGFzUGVuZGluZ0V2ZW50cygpKSkgeworICAgICAgICAgICAgICAgIGludCBuYiA9IHNlbnNvci0+cmVhZEV2ZW50cyhkYXRhLCBjb3VudCk7CisgICAgICAgICAgICAgICAgaWYgKG5iIDwgY291bnQpIHsKKyAgICAgICAgICAgICAgICAgICAgLy8gbm8gbW9yZSBkYXRhIGZvciB0aGlzIHNlbnNvcgorICAgICAgICAgICAgICAgICAgICBtUG9sbEZkc1tpXS5yZXZlbnRzID0gMDsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgY291bnQgLT0gbmI7CisgICAgICAgICAgICAgICAgbmJFdmVudHMgKz0gbmI7CisgICAgICAgICAgICAgICAgZGF0YSArPSBuYjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIGlmIChjb3VudCkgeworICAgICAgICAgICAgLy8gd2Ugc3RpbGwgaGF2ZSBzb21lIHJvb20sIHNvIHRyeSB0byBzZWUgaWYgd2UgY2FuIGdldAorICAgICAgICAgICAgLy8gc29tZSBldmVudHMgaW1tZWRpYXRlbHkgb3IganVzdCB3YWl0IGlmIHdlIGRvbid0IGhhdmUKKyAgICAgICAgICAgIC8vIGFueXRoaW5nIHRvIHJldHVybgorICAgICAgICAgICAgbiA9IHBvbGwobVBvbGxGZHMsIG51bUZkcywgbmJFdmVudHMgPyAwIDogLTEpOworICAgICAgICAgICAgaWYgKG48MCkgeworICAgICAgICAgICAgICAgIExPR0UoInBvbGwoKSBmYWlsZWQgKCVzKSIsIHN0cmVycm9yKGVycm5vKSk7CisgICAgICAgICAgICAgICAgcmV0dXJuIC1lcnJubzsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmIChtUG9sbEZkc1t3YWtlXS5yZXZlbnRzICYgUE9MTElOKSB7CisgICAgICAgICAgICAgICAgY2hhciBtc2c7CisgICAgICAgICAgICAgICAgaW50IHJlc3VsdCA9IHJlYWQobVBvbGxGZHNbd2FrZV0uZmQsICZtc2csIDEpOworICAgICAgICAgICAgICAgIExPR0VfSUYocmVzdWx0PDAsICJlcnJvciByZWFkaW5nIGZyb20gd2FrZSBwaXBlICglcykiLCBzdHJlcnJvcihlcnJubykpOworICAgICAgICAgICAgICAgIExPR0VfSUYobXNnICE9IFdBS0VfTUVTU0FHRSwgInVua25vd24gbWVzc2FnZSBvbiB3YWtlIHF1ZXVlICgweCUwMngpIiwgaW50KG1zZykpOworICAgICAgICAgICAgICAgIG1Qb2xsRmRzW3dha2VdLnJldmVudHMgPSAwOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIC8vIGlmIHdlIGhhdmUgZXZlbnRzIGFuZCBzcGFjZSwgZ28gcmVhZCB0aGVtCisgICAgfSB3aGlsZSAobiAmJiBjb3VudCk7CisKKyAgICByZXR1cm4gbmJFdmVudHM7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworc3RhdGljIGludCBwb2xsX19jbG9zZShzdHJ1Y3QgaHdfZGV2aWNlX3QgKmRldikKK3sKKyAgICBzZW5zb3JzX3BvbGxfY29udGV4dF90ICpjdHggPSAoc2Vuc29yc19wb2xsX2NvbnRleHRfdCAqKWRldjsKKyAgICBpZiAoY3R4KSB7CisgICAgICAgIGRlbGV0ZSBjdHg7CisgICAgfQorICAgIHJldHVybiAwOworfQorCitzdGF0aWMgaW50IHBvbGxfX2FjdGl2YXRlKHN0cnVjdCBzZW5zb3JzX3BvbGxfZGV2aWNlX3QgKmRldiwKKyAgICAgICAgaW50IGhhbmRsZSwgaW50IGVuYWJsZWQpIHsKKyAgICBzZW5zb3JzX3BvbGxfY29udGV4dF90ICpjdHggPSAoc2Vuc29yc19wb2xsX2NvbnRleHRfdCAqKWRldjsKKyAgICByZXR1cm4gY3R4LT5hY3RpdmF0ZShoYW5kbGUsIGVuYWJsZWQpOworfQorCitzdGF0aWMgaW50IHBvbGxfX3NldERlbGF5KHN0cnVjdCBzZW5zb3JzX3BvbGxfZGV2aWNlX3QgKmRldiwKKyAgICAgICAgaW50IGhhbmRsZSwgaW50NjRfdCBucykgeworICAgIHNlbnNvcnNfcG9sbF9jb250ZXh0X3QgKmN0eCA9IChzZW5zb3JzX3BvbGxfY29udGV4dF90ICopZGV2OworICAgIHJldHVybiBjdHgtPnNldERlbGF5KGhhbmRsZSwgbnMpOworfQorCitzdGF0aWMgaW50IHBvbGxfX3BvbGwoc3RydWN0IHNlbnNvcnNfcG9sbF9kZXZpY2VfdCAqZGV2LAorICAgICAgICBzZW5zb3JzX2V2ZW50X3QqIGRhdGEsIGludCBjb3VudCkgeworICAgIHNlbnNvcnNfcG9sbF9jb250ZXh0X3QgKmN0eCA9IChzZW5zb3JzX3BvbGxfY29udGV4dF90ICopZGV2OworICAgIHJldHVybiBjdHgtPnBvbGxFdmVudHMoZGF0YSwgY291bnQpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKy8qKiBPcGVuIGEgbmV3IGluc3RhbmNlIG9mIGEgc2Vuc29yIGRldmljZSB1c2luZyBuYW1lICovCitzdGF0aWMgaW50IG9wZW5fc2Vuc29ycyhjb25zdCBzdHJ1Y3QgaHdfbW9kdWxlX3QqIG1vZHVsZSwgY29uc3QgY2hhciogaWQsCisgICAgICAgICAgICAgICAgICAgICAgICBzdHJ1Y3QgaHdfZGV2aWNlX3QqKiBkZXZpY2UpCit7CisgICAgICAgIGludCBzdGF0dXMgPSAtRUlOVkFMOworICAgICAgICBzZW5zb3JzX3BvbGxfY29udGV4dF90ICpkZXYgPSBuZXcgc2Vuc29yc19wb2xsX2NvbnRleHRfdCgpOworCisgICAgICAgIG1lbXNldCgmZGV2LT5kZXZpY2UsIDAsIHNpemVvZihzZW5zb3JzX3BvbGxfZGV2aWNlX3QpKTsKKworICAgICAgICBkZXYtPmRldmljZS5jb21tb24udGFnID0gSEFSRFdBUkVfREVWSUNFX1RBRzsKKyAgICAgICAgZGV2LT5kZXZpY2UuY29tbW9uLnZlcnNpb24gID0gMDsKKyAgICAgICAgZGV2LT5kZXZpY2UuY29tbW9uLm1vZHVsZSAgID0gY29uc3RfY2FzdDxod19tb2R1bGVfdCo+KG1vZHVsZSk7CisgICAgICAgIGRldi0+ZGV2aWNlLmNvbW1vbi5jbG9zZSAgICA9IHBvbGxfX2Nsb3NlOworICAgICAgICBkZXYtPmRldmljZS5hY3RpdmF0ZSAgICAgICAgPSBwb2xsX19hY3RpdmF0ZTsKKyAgICAgICAgZGV2LT5kZXZpY2Uuc2V0RGVsYXkgICAgICAgID0gcG9sbF9fc2V0RGVsYXk7CisgICAgICAgIGRldi0+ZGV2aWNlLnBvbGwgICAgICAgICAgICA9IHBvbGxfX3BvbGw7CisKKyAgICAgICAgKmRldmljZSA9ICZkZXYtPmRldmljZS5jb21tb247CisgICAgICAgIHN0YXR1cyA9IDA7CisKKyAgICAgICAgcmV0dXJuIHN0YXR1czsKK30KKwpkaWZmIC0tZ2l0IGEvZXh5bm9zNC9oYWwvbGlic2Vuc29ycy9zZW5zb3JzLmggYi9leHlub3M0L2hhbC9saWJzZW5zb3JzL3NlbnNvcnMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lY2M2ZmVkCi0tLSAvZGV2L251bGwKKysrIGIvZXh5bm9zNC9oYWwvbGlic2Vuc29ycy9zZW5zb3JzLmgKQEAgLTAsMCArMSwxNDQgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMDggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaWZuZGVmIEFORFJPSURfU0VOU09SU19ICisjZGVmaW5lIEFORFJPSURfU0VOU09SU19ICisKKyNpbmNsdWRlIDxzdGRpbnQuaD4KKyNpbmNsdWRlIDxlcnJuby5oPgorI2luY2x1ZGUgPHN5cy9jZGVmcy5oPgorI2luY2x1ZGUgPHN5cy90eXBlcy5oPgorCisjaW5jbHVkZSA8bGludXgvaW5wdXQuaD4KKworI2luY2x1ZGUgPGhhcmR3YXJlL2hhcmR3YXJlLmg+CisjaW5jbHVkZSA8aGFyZHdhcmUvc2Vuc29ycy5oPgorCitfX0JFR0lOX0RFQ0xTCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworI2RlZmluZSBBUlJBWV9TSVpFKGEpIChzaXplb2YoYSkgLyBzaXplb2YoYVswXSkpCisKKyNkZWZpbmUgSURfQSAgKDApCisjZGVmaW5lIElEX00gICgxKQorI2RlZmluZSBJRF9PICAoMikKKyNkZWZpbmUgSURfTCAgKDMpCisjZGVmaW5lIElEX1AgICg0KQorI2RlZmluZSBJRF9HWSAoNSkKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisvKgorICogVGhlIFNFTlNPUlMgTW9kdWxlCisgKi8KKworLyogdGhlIENNMzY2MyBpcyBhIGJpbmFyeSBwcm94aW1pdHkgc2Vuc29yIHRoYXQgdHJpZ2dlcnMgYXJvdW5kIDYgY20gb24KKyAqIHRoaXMgaGFyZHdhcmUgKi8KKyNkZWZpbmUgUFJPWElNSVRZX1RIUkVTSE9MRF9DTSAgNi4wZgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyNkZWZpbmUgQUtNX0RFVklDRV9OQU1FICAgICAiL2Rldi9ha204OTc1IgorI2RlZmluZSBDTV9ERVZJQ0VfTkFNRSAgICAgICIvZGV2L2kyYzExIiAvLyBGSVhNRSBQcm94aW1pdHkKKyNkZWZpbmUgTFNfREVWSUNFX05BTUUgICAgICAiL2Rldi9pMmMxMSIgLy8gRklYTUUgTGlnCisKKy8qCisgICAgRS9TZW5zb3JzICggMjY1Nik6IEFrbVNlbnNvcjogcHJvY2Vzc2luZyBldmVudCAodHlwZT0wLCBjb2RlPTApCisgICAgRS9TZW5zb3JzICggMjY1Nik6IEFrbVNlbnNvcjogcHJvY2Vzc2luZyBldmVudCAodHlwZT0yLCBjb2RlPTgpCisgICAgRS9TZW5zb3JzICggMjY1Nik6IEFrbVNlbnNvcjogcHJvY2Vzc2luZyBldmVudCAodHlwZT0yLCBjb2RlPTMpCisgICAgRS9TZW5zb3JzICggMjY1Nik6IEFrbVNlbnNvcjogcHJvY2Vzc2luZyBldmVudCAodHlwZT0yLCBjb2RlPTQpCisgICAgRS9TZW5zb3JzICggMjY1Nik6IEFrbVNlbnNvcjogcHJvY2Vzc2luZyBldmVudCAodHlwZT0yLCBjb2RlPTUpCisgICAgRS9TZW5zb3JzICggMjY1Nik6IEFrbVNlbnNvcjogcHJvY2Vzc2luZyBldmVudCAodHlwZT0yLCBjb2RlPTApCisgICAgRS9TZW5zb3JzICggMjY1Nik6IEFrbVNlbnNvcjogcHJvY2Vzc2luZyBldmVudCAodHlwZT0yLCBjb2RlPTEpCisgICAgRS9TZW5zb3JzICggMjY1Nik6IEFrbVNlbnNvcjogcHJvY2Vzc2luZyBldmVudCAodHlwZT0yLCBjb2RlPTIpCisgICAgRS9TZW5zb3JzICggMjY1Nik6IEFrbVNlbnNvcjogcHJvY2Vzc2luZyBldmVudCAodHlwZT0yLCBjb2RlPTYpCisgICAgRS9TZW5zb3JzICggMjY1Nik6IEFrbVNlbnNvcjogcHJvY2Vzc2luZyBldmVudCAodHlwZT0yLCBjb2RlPTcpCisgICAgRS9TZW5zb3JzICggMjY1Nik6IEFrbVNlbnNvcjogcHJvY2Vzc2luZyBldmVudCAodHlwZT0yLCBjb2RlPTkpCisgICAgRS9TZW5zb3JzICggMjY1Nik6IEFrbVNlbnNvcjogcHJvY2Vzc2luZyBldmVudCAodHlwZT0wLCBjb2RlPTApCisgICAgRS9TZW5zb3JzICggMjY1Nik6IEFrbVNlbnNvcjogcHJvY2Vzc2luZyBldmVudCAodHlwZT0yLCBjb2RlPTgpCisgICAgRS9TZW5zb3JzICggMjY1Nik6IEFrbVNlbnNvcjogcHJvY2Vzc2luZyBldmVudCAodHlwZT0yLCBjb2RlPTMpCisgICAgRS9TZW5zb3JzICggMjY1Nik6IEFrbVNlbnNvcjogcHJvY2Vzc2luZyBldmVudCAodHlwZT0yLCBjb2RlPTQpCisgICAgRS9TZW5zb3JzICggMjY1Nik6IEFrbVNlbnNvcjogcHJvY2Vzc2luZyBldmVudCAodHlwZT0yLCBjb2RlPTUpCisgICAgRS9TZW5zb3JzICggMjY1Nik6IEFrbVNlbnNvcjogcHJvY2Vzc2luZyBldmVudCAodHlwZT0yLCBjb2RlPTApCisgICAgRS9TZW5zb3JzICggMjY1Nik6IEFrbVNlbnNvcjogcHJvY2Vzc2luZyBldmVudCAodHlwZT0yLCBjb2RlPTEpCisgICAgRS9TZW5zb3JzICggMjY1Nik6IEFrbVNlbnNvcjogcHJvY2Vzc2luZyBldmVudCAodHlwZT0yLCBjb2RlPTIpCisgICAgRS9TZW5zb3JzICggMjY1Nik6IEFrbVNlbnNvcjogcHJvY2Vzc2luZyBldmVudCAodHlwZT0yLCBjb2RlPTYpCisgICAgRS9TZW5zb3JzICggMjY1Nik6IEFrbVNlbnNvcjogcHJvY2Vzc2luZyBldmVudCAodHlwZT0yLCBjb2RlPTcpCisgICAgRS9TZW5zb3JzICggMjY1Nik6IEFrbVNlbnNvcjogcHJvY2Vzc2luZyBldmVudCAodHlwZT0yLCBjb2RlPTkpCisqLworCisvLyBmb3IgYWttODk3NQorI2RlZmluZSBFVkVOVF9UWVBFX0FDQ0VMX1ggICAgICAgICAgQUJTX1kgIC8vMQorI2RlZmluZSBFVkVOVF9UWVBFX0FDQ0VMX1kgICAgICAgICAgQUJTX1ggIC8vMAorI2RlZmluZSBFVkVOVF9UWVBFX0FDQ0VMX1ogICAgICAgICAgQUJTX1ogIC8vMgorLy8jZGVmaW5lIEVWRU5UX1RZUEVfQUNDRUxfU1RBVFVTICAgICBBQlNfV0hFRUwgLy84CisKKyNkZWZpbmUgRVZFTlRfVFlQRV9ZQVcgICAgICAgICAgICAgIEFCU19SWCAgLy8zCisjZGVmaW5lIEVWRU5UX1RZUEVfUElUQ0ggICAgICAgICAgICBBQlNfUlkgIC8vNAorI2RlZmluZSBFVkVOVF9UWVBFX1JPTEwgICAgICAgICAgICAgQUJTX1JaICAvLzUKKyNkZWZpbmUgRVZFTlRfVFlQRV9PUklFTlRfU1RBVFVTICAgIEFCU19XSEVFTCAvLzgKKworI2RlZmluZSBFVkVOVF9UWVBFX01BR1ZfWCAgICAgICAgICAgQUJTX1JVRERFUiAgLy8gNgorI2RlZmluZSBFVkVOVF9UWVBFX01BR1ZfWSAgICAgICAgICAgQUJTX1RIUk9UVExFICAvLyA3CisjZGVmaW5lIEVWRU5UX1RZUEVfTUFHVl9aICAgICAgICAgICBBQlNfR0FTICAvLyA5CisKKyNkZWZpbmUgRVZFTlRfVFlQRV9URU1QRVJBVFVSRSAgICAgIEFCU19USFJPVFRMRQorI2RlZmluZSBFVkVOVF9UWVBFX1NURVBfQ09VTlQgICAgICAgQUJTX0dBUworI2RlZmluZSBFVkVOVF9UWVBFX1BST1hJTUlUWSAgICAgICAgQUJTX0RJU1RBTkNFCisjZGVmaW5lIEVWRU5UX1RZUEVfTElHSFQgICAgICAgICAgICBBQlNfTUlTQworCisjZGVmaW5lIEVWRU5UX1RZUEVfR1lST19YICAgICAgICAgICBSRUxfUlkKKyNkZWZpbmUgRVZFTlRfVFlQRV9HWVJPX1kgICAgICAgICAgIFJFTF9SWAorI2RlZmluZSBFVkVOVF9UWVBFX0dZUk9fWiAgICAgICAgICAgUkVMX1JaCisKKy8vIDkwIExTQiA9IDFHIGZvciBLUjNETQorI2RlZmluZSBMU0IgICAgICAgICAgICAgICAgICAgICAgICAgKDkwLjBmKQorI2RlZmluZSBOVU1PRkFDQ0RBVEEgICAgICAgICAgICAgICAgKDguMGYpCisKKy8vIGNvbnZlcnNpb24gb2YgYWNjZWxlcmF0aW9uIGRhdGEgdG8gU0kgdW5pdHMgKG0vc14yKQorI2RlZmluZSBSQU5HRV9BICAgICAgICAgICAgICAgICAgICAgKDIqR1JBVklUWV9FQVJUSCkKKyNkZWZpbmUgQ09OVkVSVF9BICAgICAgICAgICAgICAgICAgIChHUkFWSVRZX0VBUlRIIC8gTFNCIC8gTlVNT0ZBQ0NEQVRBKQorI2RlZmluZSBDT05WRVJUX0FfWCAgICAgICAgICAgICAgICAgKENPTlZFUlRfQSkKKyNkZWZpbmUgQ09OVkVSVF9BX1kgICAgICAgICAgICAgICAgICgtQ09OVkVSVF9BKQorI2RlZmluZSBDT05WRVJUX0FfWiAgICAgICAgICAgICAgICAgKC1DT05WRVJUX0EpCisKKy8vIGNvbnZlcnNpb24gb2YgbWFnbmV0aWMgZGF0YSB0byB1VCB1bml0cworI2RlZmluZSBDT05WRVJUX00gICAgICAgICAgICAgICAgICAgKDEuMGYvMTYuMGYpCisjZGVmaW5lIENPTlZFUlRfTV9YICAgICAgICAgICAgICAgICAoQ09OVkVSVF9NKQorI2RlZmluZSBDT05WRVJUX01fWSAgICAgICAgICAgICAgICAgKC1DT05WRVJUX00pCisjZGVmaW5lIENPTlZFUlRfTV9aICAgICAgICAgICAgICAgICAoQ09OVkVSVF9NKQorCisvKiBjb252ZXJzaW9uIG9mIG9yaWVudGF0aW9uIGRhdGEgdG8gZGVncmVlIHVuaXRzICovCisjZGVmaW5lIENPTlZFUlRfTyAgICAgICAgICAgICAgICAgICAoMS4wZi82NC4wZikKKyNkZWZpbmUgQ09OVkVSVF9PX0EgICAgICAgICAgICAgICAgIChDT05WRVJUX08pCisjZGVmaW5lIENPTlZFUlRfT19QICAgICAgICAgICAgICAgICAoQ09OVkVSVF9PKQorI2RlZmluZSBDT05WRVJUX09fUiAgICAgICAgICAgICAgICAgKC1DT05WRVJUX08pCisKKy8vIGNvbnZlcnNpb24gb2YgZ3lybyBkYXRhIHRvIFNJIHVuaXRzIChyYWRpYW4vc2VjKQorI2RlZmluZSBSQU5HRV9HWVJPICAgICAgICAgICAgICAgICAgKDIwMDAuMGYqKGZsb2F0KU1fUEkvMTgwLjBmKQorI2RlZmluZSBDT05WRVJUX0dZUk8gICAgICAgICAgICAgICAgKCg3MC4wZiAvIDEwMDAuMGYpICogKChmbG9hdClNX1BJIC8gMTgwLjBmKSkKKyNkZWZpbmUgQ09OVkVSVF9HWVJPX1ggICAgICAgICAgICAgIChDT05WRVJUX0dZUk8pCisjZGVmaW5lIENPTlZFUlRfR1lST19ZICAgICAgICAgICAgICAoLUNPTlZFUlRfR1lSTykKKyNkZWZpbmUgQ09OVkVSVF9HWVJPX1ogICAgICAgICAgICAgIChDT05WRVJUX0dZUk8pCisKKyNkZWZpbmUgU0VOU09SX1NUQVRFX01BU0sgICAgICAgICAgICgweDdGRkYpCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworX19FTkRfREVDTFMKKworI2VuZGlmICAvLyBBTkRST0lEX1NFTlNPUlNfSApkaWZmIC0tZ2l0IGEvZXh5bm9zNC9oYWwvbGlic3djb252ZXJ0ZXIvQW5kcm9pZC5tayBiL2V4eW5vczQvaGFsL2xpYnN3Y29udmVydGVyL0FuZHJvaWQubWsKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uY2U2ZGFmNAotLS0gL2Rldi9udWxsCisrKyBiL2V4eW5vczQvaGFsL2xpYnN3Y29udmVydGVyL0FuZHJvaWQubWsKQEAgLTAsMCArMSw0NCBAQAorIyBDb3B5cmlnaHQgKEMpIDIwMDggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorIworIyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyMgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorIyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyMKKyMgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyMKKyMgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorIyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorIyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyMgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorIyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKworTE9DQUxfUEFUSCA6PSAkKGNhbGwgbXktZGlyKQoraW5jbHVkZSAkKENMRUFSX1ZBUlMpCisKK0xPQ0FMX1NSQ19GSUxFUyA6PSBcCisJc3djb252ZXJ0b3IuYyBcCisJY3NjX2xpbmVhcl90b190aWxlZF9jcm9wX25lb24ucyBcCisJY3NjX2xpbmVhcl90b190aWxlZF9pbnRlcmxlYXZlX2Nyb3BfbmVvbi5zIFwKKwljc2NfdGlsZWRfdG9fbGluZWFyX2Nyb3BfbmVvbi5zIFwKKwljc2NfdGlsZWRfdG9fbGluZWFyX2RlaW50ZXJsZWF2ZV9jcm9wX25lb24ucyBcCisJY3NjX2ludGVybGVhdmVfbWVtY3B5X25lb24ucworCitMT0NBTF9DX0lOQ0xVREVTIDo9IFwKKwkkKFRPUCkvJChCT0FSRF9ITU1fUEFUSCkvb3Blbm1heC9pbmNsdWRlL2tocm9ub3MgXAorCSQoVE9QKS8kKEJPQVJEX0hNTV9QQVRIKS9vcGVubWF4L2luY2x1ZGUvc2VjIFwKKwkkKFRPUCkvJChCT0FSRF9IQUxfUEFUSCkvaW5jbHVkZSBcCisJJChUT1ApLyQoQk9BUkRfSEFMX1BBVEgpL2xpYmh3Y29udmVydGVyCisKK2lmZXEgKCQoQk9BUkRfVVNFX1NBTVNVTkdfQ09MT1JGT1JNQVQpLCB0cnVlKQorTE9DQUxfQ0ZMQUdTICs9IC1EVVNFX1NBTVNVTkdfQ09MT1JGT1JNQVQKK2VuZGlmCisKK0xPQ0FMX01PRFVMRV9UQUdTIDo9IGVuZworTE9DQUxfTU9EVUxFIDo9IGxpYnN3Y29udmVydGVyCisKK0xPQ0FMX1BSRUxJTktfTU9EVUxFIDo9IGZhbHNlCitMT0NBTF9BUk1fTU9ERSA6PSBhcm0KKworTE9DQUxfU0hBUkVEX0xJQlJBUklFUyA6PSBsaWJsb2cgbGliZmltYyBsaWJod2NvbnZlcnRlcgorCitpbmNsdWRlICQoQlVJTERfU1RBVElDX0xJQlJBUlkpCmRpZmYgLS1naXQgYS9leHlub3M0L2hhbC9saWJzd2NvbnZlcnRlci9jc2NfaW50ZXJsZWF2ZV9tZW1jcHlfbmVvbi5zIGIvZXh5bm9zNC9oYWwvbGlic3djb252ZXJ0ZXIvY3NjX2ludGVybGVhdmVfbWVtY3B5X25lb24ucwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xYWIyNWI2Ci0tLSAvZGV2L251bGwKKysrIGIvZXh5bm9zNC9oYWwvbGlic3djb252ZXJ0ZXIvY3NjX2ludGVybGVhdmVfbWVtY3B5X25lb24ucwpAQCAtMCwwICsxLDEyMCBAQAorLyoKKyAqCisgKiBDb3B5cmlnaHQgMjAxMiBTYW1zdW5nIEVsZWN0cm9uaWNzIFMuTFNJIENvLiBMVEQKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKQorICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisvKgorICogQGZpbGUgICAgY3NjX2xpbmVhcl90b190aWxlZF9jcm9wX25lb24ucworICogQGJyaWVmICAgU0VDX09NWCBzcGVjaWZpYyBkZWZpbmUKKyAqIEBhdXRob3IgIFNoaW5Xb24gTGVlIChzaGlud29uLmxlZUBzYW1zdW5nLmNvbSkKKyAqIEB2ZXJzaW9uIDEuMAorICogQGhpc3RvcnkKKyAqICAgMjAxMi4wMi4wMSA6IENyZWF0ZQorICovCisKKy8qCisgKiBJbnRlcmxlYXZlIHNyYzEsIHNyYzIgdG8gZHN0CisgKgorICogQHBhcmFtIGRlc3QKKyAqICAgZHN0IGFkZHJlc3Nbb3V0XQorICoKKyAqIEBwYXJhbSBzcmMxCisgKiAgIHNyYzEgYWRkcmVzc1tpbl0KKyAqCisgKiBAcGFyYW0gc3JjMgorICogICBzcmMyIGFkZHJlc3NbaW5dCisgKgorICogQHBhcmFtIHNyY19zaXplCisgKiAgIHNyY19zaXplIG9yIHNyYzEKKyAqLworCisgICAgLmFyY2ggYXJtdjctYQorICAgIC50ZXh0CisgICAgLmdsb2JhbCBjc2NfaW50ZXJsZWF2ZV9tZW1jcHlfbmVvbgorICAgIC50eXBlICAgY3NjX2ludGVybGVhdmVfbWVtY3B5X25lb24sICVmdW5jdGlvbgorY3NjX2ludGVybGVhdmVfbWVtY3B5X25lb246CisgICAgLmZuc3RhcnQKKworICAgIEByMCAgICAgZGVzdAorICAgIEByMSAgICAgc3JjMQorICAgIEByMiAgICAgc3JjMgorICAgIEByMyAgICAgc3JjX3NpemUKKyAgICBAcjQKKyAgICBAcjUKKyAgICBAcjYKKyAgICBAcjcKKyAgICBAcjggICAgIHRlbXAxCisgICAgQHI5ICAgICB0ZW1wMgorICAgIEByMTAgICAgZGVzdF9hZGRyCisgICAgQHIxMSAgICBzcmMxX2FkZHIKKyAgICBAcjEyICAgIHNyYzJfYWRkcgorICAgIEByMTQgICAgaQorCisgICAgc3RtZmQgICAgICAgc3AhLCB7cjgtcjEyLHIxNH0gICAgICAgQCBiYWNrdXAgcmVnaXN0ZXJzCisKKyAgICBtb3YgICAgICAgICByMTAsIHIwCisgICAgbW92ICAgICAgICAgcjExLCByMQorICAgIG1vdiAgICAgICAgIHIxMiwgcjIKKyAgICBtb3YgICAgICAgICByMTQsIHIzCisKKyAgICBjbXAgICAgICAgICByMTQsICMxMjgKKyAgICBibHQgICAgICAgICBMRVNTX1RIQU5fMTI4CisKK0xPT1BfMTI4OgorICAgIHZsZDEuOCAgICAgIHtxMH0sIFtyMTFdIQorICAgIHZsZDEuOCAgICAgIHtxMn0sIFtyMTFdIQorICAgIHZsZDEuOCAgICAgIHtxNH0sIFtyMTFdIQorICAgIHZsZDEuOCAgICAgIHtxNn0sIFtyMTFdIQorICAgIHZsZDEuOCAgICAgIHtxOH0sIFtyMTFdIQorICAgIHZsZDEuOCAgICAgIHtxMTB9LCBbcjExXSEKKyAgICB2bGQxLjggICAgICB7cTEyfSwgW3IxMV0hCisgICAgdmxkMS44ICAgICAge3ExNH0sIFtyMTFdIQorICAgIHZsZDEuOCAgICAgIHtxMX0sIFtyMTJdIQorICAgIHZsZDEuOCAgICAgIHtxM30sIFtyMTJdIQorICAgIHZsZDEuOCAgICAgIHtxNX0sIFtyMTJdIQorICAgIHZsZDEuOCAgICAgIHtxN30sIFtyMTJdIQorICAgIHZsZDEuOCAgICAgIHtxOX0sIFtyMTJdIQorICAgIHZsZDEuOCAgICAgIHtxMTF9LCBbcjEyXSEKKyAgICB2bGQxLjggICAgICB7cTEzfSwgW3IxMl0hCisgICAgdmxkMS44ICAgICAge3ExNX0sIFtyMTJdIQorCisgICAgdnN0Mi44ICAgICAge3EwLCBxMX0sIFtyMTBdIQorICAgIHZzdDIuOCAgICAgIHtxMiwgcTN9LCBbcjEwXSEKKyAgICB2c3QyLjggICAgICB7cTQsIHE1fSwgW3IxMF0hCisgICAgdnN0Mi44ICAgICAge3E2LCBxN30sIFtyMTBdIQorICAgIHZzdDIuOCAgICAgIHtxOCwgcTl9LCBbcjEwXSEKKyAgICB2c3QyLjggICAgICB7cTEwLCBxMTF9LCBbcjEwXSEKKyAgICB2c3QyLjggICAgICB7cTEyLCBxMTN9LCBbcjEwXSEKKyAgICB2c3QyLjggICAgICB7cTE0LCBxMTV9LCBbcjEwXSEKKworICAgIHN1YiAgICAgICAgIHIxNCwgIzEyOAorICAgIGNtcCAgICAgICAgIHIxNCwgIzEyOAorICAgIGJndCAgICAgICAgIExPT1BfMTI4CisKK0xFU1NfVEhBTl8xMjg6CisgICAgY21wICAgICAgICAgcjE0LCAjMAorICAgIGJlcSAgICAgICAgIFJFU1RPUkVfUkVHCisKK0xPT1BfMToKKyAgICBsZHJiICAgICAgICByOCwgW3IxMV0sICMxCisgICAgbGRyYiAgICAgICAgcjksIFtyMTJdLCAjMQorICAgIHN0cmIgICAgICAgIHI4LCBbcjEwXSwgIzEKKyAgICBzdHJiICAgICAgICByOSwgW3IxMF0sICMxCisgICAgc3VicyAgICAgICAgcjE0LCAjMQorICAgIGJuZSAgICAgICAgIExPT1BfMQorCitSRVNUT1JFX1JFRzoKKyAgICBsZG1mZCAgICAgICBzcCEsIHtyOC1yMTIscjE1fSAgICAgICBAIHJlc3RvcmUgcmVnaXN0ZXJzCisgICAgLmZuZW5kCmRpZmYgLS1naXQgYS9leHlub3M0L2hhbC9saWJzd2NvbnZlcnRlci9jc2NfbGluZWFyX3RvX3RpbGVkX2Nyb3BfbmVvbi5zIGIvZXh5bm9zNC9oYWwvbGlic3djb252ZXJ0ZXIvY3NjX2xpbmVhcl90b190aWxlZF9jcm9wX25lb24ucwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44ZjU5ODI2Ci0tLSAvZGV2L251bGwKKysrIGIvZXh5bm9zNC9oYWwvbGlic3djb252ZXJ0ZXIvY3NjX2xpbmVhcl90b190aWxlZF9jcm9wX25lb24ucwpAQCAtMCwwICsxLDQ5MiBAQAorLyoKKyAqCisgKiBDb3B5cmlnaHQgMjAxMiBTYW1zdW5nIEVsZWN0cm9uaWNzIFMuTFNJIENvLiBMVEQKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKQorICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisvKgorICogQGZpbGUgICAgY3NjX2xpbmVhcl90b190aWxlZF9jcm9wX25lb24ucworICogQGJyaWVmICAgU0VDX09NWCBzcGVjaWZpYyBkZWZpbmUKKyAqIEBhdXRob3IgIFNoaW5Xb24gTGVlIChzaGlud29uLmxlZUBzYW1zdW5nLmNvbSkKKyAqIEB2ZXJzaW9uIDEuMAorICogQGhpc3RvcnkKKyAqICAgMjAxMi4wMi4wMSA6IENyZWF0ZQorICovCisKKy8qCisgKiBDb252ZXJ0cyBsaW5lYXIgZGF0YSB0byB0aWxlZAorICogQ3JvcHMgbGVmdCwgdG9wLCByaWdodCwgYnV0dG9tCisgKiAxLiBZIG9mIFlVVjQyMFAgdG8gWSBvZiBOVjEyVAorICogMi4gWSBvZiBZVVY0MjBTIHRvIFkgb2YgTlYxMlQKKyAqIDMuIFVWIG9mIFlVVjQyMFMgdG8gVVYgb2YgTlYxMlQKKyAqCisgKiBAcGFyYW0gbnYxMnRfZGVzdAorICogICBZIG9yIFVWIHBsYW5lIGFkZHJlc3Mgb2YgTlYxMlRbb3V0XQorICoKKyAqIEBwYXJhbSB5dXY0MjBfc3JjCisgKiAgIFkgb3IgVVYgcGxhbmUgYWRkcmVzcyBvZiBZVVY0MjBQKFMpW2luXQorICoKKyAqIEBwYXJhbSB5dXY0MjBfd2lkdGgKKyAqICAgV2lkdGggb2YgWVVWNDIwW2luXQorICoKKyAqIEBwYXJhbSB5dXY0MjBfaGVpZ2h0CisgKiAgIFk6IEhlaWdodCBvZiBZVVY0MjAsIFVWOiBIZWlnaHQvMiBvZiBZVVY0MjBbaW5dCisgKgorICogQHBhcmFtIGxlZnQKKyAqICAgQ3JvcCBzaXplIG9mIGxlZnQuIEl0IHNob3VsZCBiZSBldmVuLgorICoKKyAqIEBwYXJhbSB0b3AKKyAqICAgQ3JvcCBzaXplIG9mIHRvcC4gSXQgc2hvdWxkIGJlIGV2ZW4uCisgKgorICogQHBhcmFtIHJpZ2h0CisgKiAgIENyb3Agc2l6ZSBvZiByaWdodC4gSXQgc2hvdWxkIGJlIGV2ZW4uCisgKgorICogQHBhcmFtIGJ1dHRvbQorICogICBDcm9wIHNpemUgb2YgYnV0dG9tLiBJdCBzaG91bGQgYmUgZXZlbi4KKyAqLworCisgICAgLmFyY2ggYXJtdjctYQorICAgIC50ZXh0CisgICAgLmdsb2JhbCBjc2NfbGluZWFyX3RvX3RpbGVkX2Nyb3BfbmVvbgorICAgIC50eXBlICAgY3NjX2xpbmVhcl90b190aWxlZF9jcm9wX25lb24sICVmdW5jdGlvbgorY3NjX2xpbmVhcl90b190aWxlZF9jcm9wX25lb246CisgICAgLmZuc3RhcnQKKworICAgIEByMCAgICAgdGlsZWRfZGVzdAorICAgIEByMSAgICAgbGluZWFyX3NyYworICAgIEByMiAgICAgeXV2NDIwX3dpZHRoCisgICAgQHIzICAgICB5dXY0MjBfaGVpZ2h0CisgICAgQHI0ICAgICBqCisgICAgQHI1ICAgICBpCisgICAgQHI2ICAgICBubih0aWxlZF9hZGRyKQorICAgIEByNyAgICAgbW0obGluZWFyX2FkZHIpCisgICAgQHI4ICAgICBhbGlnbmVkX3hfc2l6ZQorICAgIEByOSAgICAgYWxpZ25lZF95X3NpemUKKyAgICBAcjEwICAgIHRlbXAxCisgICAgQHIxMSAgICB0ZW1wMgorICAgIEByMTIgICAgdGVtcDMKKyAgICBAcjE0ICAgIHRlbXA0CisKKyAgICBzdG1mZCAgICAgICBzcCEsIHtyNC1yMTIscjE0fSAgICAgICBAIGJhY2t1cCByZWdpc3RlcnMKKworICAgIGxkciAgICAgICAgIHIxMSwgW3NwLCAjNDRdICAgICAgICAgICBAIHRvcAorICAgIGxkciAgICAgICAgIHIxNCwgW3NwLCAjNTJdICAgICAgICAgICBAIGJ1dHRvbQorICAgIGxkciAgICAgICAgIHIxMCwgW3NwLCAjNDBdICAgICAgICAgICBAIGxlZnQKKyAgICBsZHIgICAgICAgICByMTIsIFtzcCwgIzQ4XSAgICAgICAgICAgQCByaWdodAorCisgICAgc3ViICAgICAgICAgcjksIHIzLCByMTEgICAgICAgICAgICAgQCBhbGlnbmVkX3lfc2l6ZSA9ICgoeXV2NDIwX2hlaWdodC10b3AtYnV0dG9tKT4+NSk8PDUKKyAgICBzdWIgICAgICAgICByOSwgcjksIHIxNAorICAgIGJpYyAgICAgICAgIHI5LCByOSwgIzB4MUYKKworICAgIHN1YiAgICAgICAgIHI4LCByMiwgcjEwICAgICAgICAgICAgIEAgYWxpZ25lZF94X3NpemUgPSAoKHl1djQyMF93aWR0aC1sZWZ0LXJpZ2h0KT4+Nik8PDYKKyAgICBzdWIgICAgICAgICByOCwgcjgsIHIxMgorICAgIGJpYyAgICAgICAgIHI4LCByOCwgIzB4M0YKKworICAgIG1vdiAgICAgICAgIHI1LCAjMCAgICAgICAgICAgICAgICAgIEAgaSA9IDAKK0xPT1BfQUxJR05FRF9ZX1NJWkU6CisKKyAgICBtb3YgICAgICAgICByNCwgIzAgICAgICAgICAgICAgICAgICBAIGogPSAwCitMT09QX0FMSUdORURfWF9TSVpFOgorCisgICAgYmwgICAgICAgICAgR0VUX1RJTEVEX09GRlNFVAorCisgICAgbGRyICAgICAgICAgcjEwLCBbc3AsICM0NF0gICAgICAgICAgQCByMTAgPSB0b3AKKyAgICBsZHIgICAgICAgICByMTQsIFtzcCwgIzQwXSAgICAgICAgICBAIHIxNCA9IGxlZnQKKyAgICBhZGQgICAgICAgICByMTAsIHI1LCByMTAgICAgICAgICAgICBAIHRlbXAxID0gbGluZWFyX3hfc2l6ZSooaSt0b3ApCisgICAgbXVsICAgICAgICAgcjEwLCByMiwgcjEwCisgICAgYWRkICAgICAgICAgcjcsIHIxLCByNCAgICAgICAgICAgICAgQCBsaW5lYXJfYWRkciA9IGxpbmVhcl9zcmMragorICAgIGFkZCAgICAgICAgIHI3LCByNywgcjEwICAgICAgICAgICAgIEAgbGluZWFyX2FkZHIgPSBsaW5lYXJfYWRkcit0ZW1wMQorICAgIGFkZCAgICAgICAgIHI3LCByNywgcjE0ICAgICAgICAgICAgIEAgbGluZWFyX2FkZHIgPSBsaW5lYXJfYWRkcitsZWZ0CisgICAgc3ViICAgICAgICAgcjEwLCByMiwgIzMyCisKKyAgICBwbGQgICAgICAgICBbcjcsIHIyXQorICAgIHZsZDEuOCAgICAgIHtxMCwgcTF9LCBbcjddISAgICAgICAgIEAgbG9hZCB7bGluZWFyX3NyYywgNjR9CisgICAgcGxkICAgICAgICAgW3I3LCByMl0KKyAgICB2bGQxLjggICAgICB7cTIsIHEzfSwgW3I3XSwgcjEwCisgICAgcGxkICAgICAgICAgW3I3LCByMl0KKyAgICB2bGQxLjggICAgICB7cTQsIHE1fSwgW3I3XSEgICAgICAgICBAIGxvYWQge2xpbmVhcl9zcmMrbGluZWFyX3hfc2l6ZSoxLCA2NH0KKyAgICBwbGQgICAgICAgICBbcjcsIHIyXQorICAgIHZsZDEuOCAgICAgIHtxNiwgcTd9LCBbcjddLCByMTAKKyAgICBwbGQgICAgICAgICBbcjcsIHIyXQorICAgIHZsZDEuOCAgICAgIHtxOCwgcTl9LCBbcjddISAgICAgICAgIEAgbG9hZCB7bGluZWFyX3NyYytsaW5lYXJfeF9zaXplKjIsIDY0fQorICAgIHBsZCAgICAgICAgIFtyNywgcjJdCisgICAgdmxkMS44ICAgICAge3ExMCwgcTExfSwgW3I3XSwgcjEwCisgICAgcGxkICAgICAgICAgW3I3LCByMl0KKyAgICB2bGQxLjggICAgICB7cTEyLCBxMTN9LCBbcjddISAgICAgICBAIGxvYWQge2xpbmVhcl9zcmMrbGluZWFyX3hfc2l6ZSozLCA2NH0KKyAgICBwbGQgICAgICAgICBbcjcsIHIyXQorICAgIHZsZDEuOCAgICAgIHtxMTQsIHExNX0sIFtyN10sIHIxMAorICAgIGFkZCAgICAgICAgIHI2LCByMCwgcjYgICAgICAgICAgICAgIEAgdGlsZWRfYWRkciA9IHRpbGVkX2Rlc3QrdGlsZWRfYWRkcgorICAgIHZzdDEuOCAgICAgIHtxMCwgcTF9LCBbcjZdISAgICAgICAgIEAgc3RvcmUge3RpbGVkX2FkZHJ9CisgICAgdnN0MS44ICAgICAge3EyLCBxM30sIFtyNl0hCisgICAgdnN0MS44ICAgICAge3E0LCBxNX0sIFtyNl0hICAgICAgICAgQCBzdG9yZSB7dGlsZWRfYWRkcis2NCoxfQorICAgIHZzdDEuOCAgICAgIHtxNiwgcTd9LCBbcjZdIQorICAgIHZzdDEuOCAgICAgIHtxOCwgcTl9LCBbcjZdISAgICAgICAgIEAgc3RvcmUge3RpbGVkX2FkZHIrNjQqMn0KKyAgICB2c3QxLjggICAgICB7cTEwLCBxMTF9LCBbcjZdIQorICAgIHZzdDEuOCAgICAgIHtxMTIsIHExM30sIFtyNl0hICAgICAgIEAgc3RvcmUge3RpbGVkX2FkZHIrNjQqM30KKyAgICB2c3QxLjggICAgICB7cTE0LCBxMTV9LCBbcjZdIQorCisgICAgcGxkICAgICAgICAgW3I3LCByMl0KKyAgICB2bGQxLjggICAgICB7cTAsIHExfSwgW3I3XSEgICAgICAgICBAIGxvYWQge2xpbmVhcl9zcmMrbGluZWFyX3hfc2l6ZSo0LCA2NH0KKyAgICBwbGQgICAgICAgICBbcjcsIHIyXQorICAgIHZsZDEuOCAgICAgIHtxMiwgcTN9LCBbcjddLCByMTAKKyAgICBwbGQgICAgICAgICBbcjcsIHIyXQorICAgIHZsZDEuOCAgICAgIHtxNCwgcTV9LCBbcjddISAgICAgICAgIEAgbG9hZCB7bGluZWFyX3NyYytsaW5lYXJfeF9zaXplKjUsIDY0fQorICAgIHBsZCAgICAgICAgIFtyNywgcjJdCisgICAgdmxkMS44ICAgICAge3E2LCBxN30sIFtyN10sIHIxMAorICAgIHBsZCAgICAgICAgIFtyNywgcjJdCisgICAgdmxkMS44ICAgICAge3E4LCBxOX0sIFtyN10hICAgICAgICAgQCBsb2FkIHtsaW5lYXJfc3JjK2xpbmVhcl94X3NpemUqNiwgNjR9CisgICAgcGxkICAgICAgICAgW3I3LCByMl0KKyAgICB2bGQxLjggICAgICB7cTEwLCBxMTF9LCBbcjddLCByMTAKKyAgICBwbGQgICAgICAgICBbcjcsIHIyXQorICAgIHZsZDEuOCAgICAgIHtxMTIsIHExM30sIFtyN10hICAgICAgIEAgbG9hZCB7bGluZWFyX3NyYytsaW5lYXJfeF9zaXplKjcsIDY0fQorICAgIHBsZCAgICAgICAgIFtyNywgcjJdCisgICAgdmxkMS44ICAgICAge3ExNCwgcTE1fSwgW3I3XSwgcjEwCisgICAgdnN0MS44ICAgICAge3EwLCBxMX0sIFtyNl0hICAgICAgICAgQCBzdG9yZSB7dGlsZWRfYWRkcis2NCo0fQorICAgIHZzdDEuOCAgICAgIHtxMiwgcTN9LCBbcjZdIQorICAgIHZzdDEuOCAgICAgIHtxNCwgcTV9LCBbcjZdISAgICAgICAgIEAgc3RvcmUge3RpbGVkX2FkZHIrNjQqNX0KKyAgICB2c3QxLjggICAgICB7cTYsIHE3fSwgW3I2XSEKKyAgICB2c3QxLjggICAgICB7cTgsIHE5fSwgW3I2XSEgICAgICAgICBAIHN0b3JlIHt0aWxlZF9hZGRyKzY0KjZ9CisgICAgdnN0MS44ICAgICAge3ExMCwgcTExfSwgW3I2XSEKKyAgICB2c3QxLjggICAgICB7cTEyLCBxMTN9LCBbcjZdISAgICAgICBAIHN0b3JlIHt0aWxlZF9hZGRyKzY0Kjd9CisgICAgdnN0MS44ICAgICAge3ExNCwgcTE1fSwgW3I2XSEKKworICAgIHBsZCAgICAgICAgIFtyNywgcjJdCisgICAgdmxkMS44ICAgICAge3EwLCBxMX0sIFtyN10hICAgICAgICAgQCBsb2FkIHtsaW5lYXJfc3JjK2xpbmVhcl94X3NpemUqOCwgNjR9CisgICAgcGxkICAgICAgICAgW3I3LCByMl0KKyAgICB2bGQxLjggICAgICB7cTIsIHEzfSwgW3I3XSwgcjEwCisgICAgcGxkICAgICAgICAgW3I3LCByMl0KKyAgICB2bGQxLjggICAgICB7cTQsIHE1fSwgW3I3XSEgICAgICAgICBAIGxvYWQge2xpbmVhcl9zcmMrbGluZWFyX3hfc2l6ZSo5LCA2NH0KKyAgICBwbGQgICAgICAgICBbcjcsIHIyXQorICAgIHZsZDEuOCAgICAgIHtxNiwgcTd9LCBbcjddLCByMTAKKyAgICBwbGQgICAgICAgICBbcjcsIHIyXQorICAgIHZsZDEuOCAgICAgIHtxOCwgcTl9LCBbcjddISAgICAgICAgIEAgbG9hZCB7bGluZWFyX3NyYytsaW5lYXJfeF9zaXplKjEwLCA2NH0KKyAgICBwbGQgICAgICAgICBbcjcsIHIyXQorICAgIHZsZDEuOCAgICAgIHtxMTAsIHExMX0sIFtyN10sIHIxMAorICAgIHBsZCAgICAgICAgIFtyNywgcjJdCisgICAgdmxkMS44ICAgICAge3ExMiwgcTEzfSwgW3I3XSEgICAgICAgQCBsb2FkIHtsaW5lYXJfc3JjK2xpbmVhcl94X3NpemUqMTEsIDY0fQorICAgIHBsZCAgICAgICAgIFtyNywgcjJdCisgICAgdmxkMS44ICAgICAge3ExNCwgcTE1fSwgW3I3XSwgcjEwCisgICAgdnN0MS44ICAgICAge3EwLCBxMX0sIFtyNl0hICAgICAgICAgQCBzdG9yZSB7dGlsZWRfYWRkcis2NCo4fQorICAgIHZzdDEuOCAgICAgIHtxMiwgcTN9LCBbcjZdIQorICAgIHZzdDEuOCAgICAgIHtxNCwgcTV9LCBbcjZdISAgICAgICAgIEAgc3RvcmUge3RpbGVkX2FkZHIrNjQqOX0KKyAgICB2c3QxLjggICAgICB7cTYsIHE3fSwgW3I2XSEKKyAgICB2c3QxLjggICAgICB7cTgsIHE5fSwgW3I2XSEgICAgICAgICBAIHN0b3JlIHt0aWxlZF9hZGRyKzY0KjEwfQorICAgIHZzdDEuOCAgICAgIHtxMTAsIHExMX0sIFtyNl0hCisgICAgdnN0MS44ICAgICAge3ExMiwgcTEzfSwgW3I2XSEgICAgICAgQCBzdG9yZSB7dGlsZWRfYWRkcis2NCoxMX0KKyAgICB2c3QxLjggICAgICB7cTE0LCBxMTV9LCBbcjZdIQorCisgICAgcGxkICAgICAgICAgW3I3LCByMl0KKyAgICB2bGQxLjggICAgICB7cTAsIHExfSwgW3I3XSEgICAgICAgICBAIGxvYWQge2xpbmVhcl9zcmMrbGluZWFyX3hfc2l6ZSoxMiwgNjR9CisgICAgcGxkICAgICAgICAgW3I3LCByMl0KKyAgICB2bGQxLjggICAgICB7cTIsIHEzfSwgW3I3XSwgcjEwCisgICAgcGxkICAgICAgICAgW3I3LCByMl0KKyAgICB2bGQxLjggICAgICB7cTQsIHE1fSwgW3I3XSEgICAgICAgICBAIGxvYWQge2xpbmVhcl9zcmMrbGluZWFyX3hfc2l6ZSoxMywgNjR9CisgICAgcGxkICAgICAgICAgW3I3LCByMl0KKyAgICB2bGQxLjggICAgICB7cTYsIHE3fSwgW3I3XSwgcjEwCisgICAgcGxkICAgICAgICAgW3I3LCByMl0KKyAgICB2bGQxLjggICAgICB7cTgsIHE5fSwgW3I3XSEgICAgICAgICBAIGxvYWQge2xpbmVhcl9zcmMrbGluZWFyX3hfc2l6ZSoxNCwgNjR9CisgICAgcGxkICAgICAgICAgW3I3LCByMl0KKyAgICB2bGQxLjggICAgICB7cTEwLCBxMTF9LCBbcjddLCByMTAKKyAgICBwbGQgICAgICAgICBbcjcsIHIyXQorICAgIHZsZDEuOCAgICAgIHtxMTIsIHExM30sIFtyN10hICAgICAgIEAgbG9hZCB7bGluZWFyX3NyYytsaW5lYXJfeF9zaXplKjE1LCA2NH0KKyAgICBwbGQgICAgICAgICBbcjcsIHIyXQorICAgIHZsZDEuOCAgICAgIHtxMTQsIHExNX0sIFtyN10sIHIxMAorICAgIHZzdDEuOCAgICAgIHtxMCwgcTF9LCBbcjZdISAgICAgICAgIEAgc3RvcmUge3RpbGVkX2FkZHIrNjQqMTJ9CisgICAgdnN0MS44ICAgICAge3EyLCBxM30sIFtyNl0hCisgICAgdnN0MS44ICAgICAge3E0LCBxNX0sIFtyNl0hICAgICAgICAgQCBzdG9yZSB7dGlsZWRfYWRkcis2NCoxM30KKyAgICB2c3QxLjggICAgICB7cTYsIHE3fSwgW3I2XSEKKyAgICB2c3QxLjggICAgICB7cTgsIHE5fSwgW3I2XSEgICAgICAgICBAIHN0b3JlIHt0aWxlZF9hZGRyKzY0KjE0fQorICAgIHZzdDEuOCAgICAgIHtxMTAsIHExMX0sIFtyNl0hCisgICAgdnN0MS44ICAgICAge3ExMiwgcTEzfSwgW3I2XSEgICAgICAgQCBzdG9yZSB7dGlsZWRfYWRkcis2NCoxNX0KKyAgICB2c3QxLjggICAgICB7cTE0LCBxMTV9LCBbcjZdIQorCisgICAgcGxkICAgICAgICAgW3I3LCByMl0KKyAgICB2bGQxLjggICAgICB7cTAsIHExfSwgW3I3XSEgICAgICAgICBAIGxvYWQge2xpbmVhcl9zcmMrbGluZWFyX3hfc2l6ZSoxNiwgNjR9CisgICAgcGxkICAgICAgICAgW3I3LCByMl0KKyAgICB2bGQxLjggICAgICB7cTIsIHEzfSwgW3I3XSwgcjEwCisgICAgcGxkICAgICAgICAgW3I3LCByMl0KKyAgICB2bGQxLjggICAgICB7cTQsIHE1fSwgW3I3XSEgICAgICAgICBAIGxvYWQge2xpbmVhcl9zcmMrbGluZWFyX3hfc2l6ZSoxNywgNjR9CisgICAgcGxkICAgICAgICAgW3I3LCByMl0KKyAgICB2bGQxLjggICAgICB7cTYsIHE3fSwgW3I3XSwgcjEwCisgICAgcGxkICAgICAgICAgW3I3LCByMl0KKyAgICB2bGQxLjggICAgICB7cTgsIHE5fSwgW3I3XSEgICAgICAgICBAIGxvYWQge2xpbmVhcl9zcmMrbGluZWFyX3hfc2l6ZSoxOCwgNjR9CisgICAgcGxkICAgICAgICAgW3I3LCByMl0KKyAgICB2bGQxLjggICAgICB7cTEwLCBxMTF9LCBbcjddLCByMTAKKyAgICBwbGQgICAgICAgICBbcjcsIHIyXQorICAgIHZsZDEuOCAgICAgIHtxMTIsIHExM30sIFtyN10hICAgICAgIEAgbG9hZCB7bGluZWFyX3NyYytsaW5lYXJfeF9zaXplKjE5LCA2NH0KKyAgICBwbGQgICAgICAgICBbcjcsIHIyXQorICAgIHZsZDEuOCAgICAgIHtxMTQsIHExNX0sIFtyN10sIHIxMAorICAgIHZzdDEuOCAgICAgIHtxMCwgcTF9LCBbcjZdISAgICAgICAgIEAgc3RvcmUge3RpbGVkX2FkZHIrNjQqMTZ9CisgICAgdnN0MS44ICAgICAge3EyLCBxM30sIFtyNl0hCisgICAgdnN0MS44ICAgICAge3E0LCBxNX0sIFtyNl0hICAgICAgICAgQCBzdG9yZSB7dGlsZWRfYWRkcis2NCoxN30KKyAgICB2c3QxLjggICAgICB7cTYsIHE3fSwgW3I2XSEKKyAgICB2c3QxLjggICAgICB7cTgsIHE5fSwgW3I2XSEgICAgICAgICBAIHN0b3JlIHt0aWxlZF9hZGRyKzY0KjE4fQorICAgIHZzdDEuOCAgICAgIHtxMTAsIHExMX0sIFtyNl0hCisgICAgdnN0MS44ICAgICAge3ExMiwgcTEzfSwgW3I2XSEgICAgICAgQCBzdG9yZSB7dGlsZWRfYWRkcis2NCoxOX0KKyAgICB2c3QxLjggICAgICB7cTE0LCBxMTV9LCBbcjZdIQorCisgICAgcGxkICAgICAgICAgW3I3LCByMl0KKyAgICB2bGQxLjggICAgICB7cTAsIHExfSwgW3I3XSEgICAgICAgICBAIGxvYWQge2xpbmVhcl9zcmMrbGluZWFyX3hfc2l6ZSoyMCwgNjR9CisgICAgcGxkICAgICAgICAgW3I3LCByMl0KKyAgICB2bGQxLjggICAgICB7cTIsIHEzfSwgW3I3XSwgcjEwCisgICAgcGxkICAgICAgICAgW3I3LCByMl0KKyAgICB2bGQxLjggICAgICB7cTQsIHE1fSwgW3I3XSEgICAgICAgICBAIGxvYWQge2xpbmVhcl9zcmMrbGluZWFyX3hfc2l6ZSoyMSwgNjR9CisgICAgcGxkICAgICAgICAgW3I3LCByMl0KKyAgICB2bGQxLjggICAgICB7cTYsIHE3fSwgW3I3XSwgcjEwCisgICAgcGxkICAgICAgICAgW3I3LCByMl0KKyAgICB2bGQxLjggICAgICB7cTgsIHE5fSwgW3I3XSEgICAgICAgICBAIGxvYWQge2xpbmVhcl9zcmMrbGluZWFyX3hfc2l6ZSoyMiwgNjR9CisgICAgcGxkICAgICAgICAgW3I3LCByMl0KKyAgICB2bGQxLjggICAgICB7cTEwLCBxMTF9LCBbcjddLCByMTAKKyAgICBwbGQgICAgICAgICBbcjcsIHIyXQorICAgIHZsZDEuOCAgICAgIHtxMTIsIHExM30sIFtyN10hICAgICAgIEAgbG9hZCB7bGluZWFyX3NyYytsaW5lYXJfeF9zaXplKjIzLCA2NH0KKyAgICBwbGQgICAgICAgICBbcjcsIHIyXQorICAgIHZsZDEuOCAgICAgIHtxMTQsIHExNX0sIFtyN10sIHIxMAorICAgIHZzdDEuOCAgICAgIHtxMCwgcTF9LCBbcjZdISAgICAgICAgIEAgc3RvcmUge3RpbGVkX2FkZHIrNjQqMjB9CisgICAgdnN0MS44ICAgICAge3EyLCBxM30sIFtyNl0hCisgICAgdnN0MS44ICAgICAge3E0LCBxNX0sIFtyNl0hICAgICAgICAgQCBzdG9yZSB7dGlsZWRfYWRkcis2NCoyMX0KKyAgICB2c3QxLjggICAgICB7cTYsIHE3fSwgW3I2XSEKKyAgICB2c3QxLjggICAgICB7cTgsIHE5fSwgW3I2XSEgICAgICAgICBAIHN0b3JlIHt0aWxlZF9hZGRyKzY0KjIyfQorICAgIHZzdDEuOCAgICAgIHtxMTAsIHExMX0sIFtyNl0hCisgICAgdnN0MS44ICAgICAge3ExMiwgcTEzfSwgW3I2XSEgICAgICAgQCBzdG9yZSB7dGlsZWRfYWRkcis2NCoyM30KKyAgICB2c3QxLjggICAgICB7cTE0LCBxMTV9LCBbcjZdIQorCisgICAgcGxkICAgICAgICAgW3I3LCByMl0KKyAgICB2bGQxLjggICAgICB7cTAsIHExfSwgW3I3XSEgICAgICAgICBAIGxvYWQge2xpbmVhcl9zcmMrbGluZWFyX3hfc2l6ZSoyNCwgNjR9CisgICAgcGxkICAgICAgICAgW3I3LCByMl0KKyAgICB2bGQxLjggICAgICB7cTIsIHEzfSwgW3I3XSwgcjEwCisgICAgcGxkICAgICAgICAgW3I3LCByMl0KKyAgICB2bGQxLjggICAgICB7cTQsIHE1fSwgW3I3XSEgICAgICAgICBAIGxvYWQge2xpbmVhcl9zcmMrbGluZWFyX3hfc2l6ZSoyNSwgNjR9CisgICAgcGxkICAgICAgICAgW3I3LCByMl0KKyAgICB2bGQxLjggICAgICB7cTYsIHE3fSwgW3I3XSwgcjEwCisgICAgcGxkICAgICAgICAgW3I3LCByMl0KKyAgICB2bGQxLjggICAgICB7cTgsIHE5fSwgW3I3XSEgICAgICAgICBAIGxvYWQge2xpbmVhcl9zcmMrbGluZWFyX3hfc2l6ZSoyNiwgNjR9CisgICAgcGxkICAgICAgICAgW3I3LCByMl0KKyAgICB2bGQxLjggICAgICB7cTEwLCBxMTF9LCBbcjddLCByMTAKKyAgICBwbGQgICAgICAgICBbcjcsIHIyXQorICAgIHZsZDEuOCAgICAgIHtxMTIsIHExM30sIFtyN10hICAgICAgIEAgbG9hZCB7bGluZWFyX3NyYytsaW5lYXJfeF9zaXplKjI3LCA2NH0KKyAgICBwbGQgICAgICAgICBbcjcsIHIyXQorICAgIHZsZDEuOCAgICAgIHtxMTQsIHExNX0sIFtyN10sIHIxMAorICAgIHZzdDEuOCAgICAgIHtxMCwgcTF9LCBbcjZdISAgICAgICAgIEAgc3RvcmUge3RpbGVkX2FkZHIrNjQqMjR9CisgICAgdnN0MS44ICAgICAge3EyLCBxM30sIFtyNl0hCisgICAgdnN0MS44ICAgICAge3E0LCBxNX0sIFtyNl0hICAgICAgICAgQCBzdG9yZSB7dGlsZWRfYWRkcis2NCoyNX0KKyAgICB2c3QxLjggICAgICB7cTYsIHE3fSwgW3I2XSEKKyAgICB2c3QxLjggICAgICB7cTgsIHE5fSwgW3I2XSEgICAgICAgICBAIHN0b3JlIHt0aWxlZF9hZGRyKzY0KjI2fQorICAgIHZzdDEuOCAgICAgIHtxMTAsIHExMX0sIFtyNl0hCisgICAgdnN0MS44ICAgICAge3ExMiwgcTEzfSwgW3I2XSEgICAgICAgQCBzdG9yZSB7dGlsZWRfYWRkcis2NCoyN30KKyAgICB2c3QxLjggICAgICB7cTE0LCBxMTV9LCBbcjZdIQorCisgICAgcGxkICAgICAgICAgW3I3LCByMl0KKyAgICB2bGQxLjggICAgICB7cTAsIHExfSwgW3I3XSEgICAgICAgICBAIGxvYWQge2xpbmVhcl9zcmMrbGluZWFyX3hfc2l6ZSoyOCwgNjR9CisgICAgcGxkICAgICAgICAgW3I3LCByMl0KKyAgICB2bGQxLjggICAgICB7cTIsIHEzfSwgW3I3XSwgcjEwCisgICAgcGxkICAgICAgICAgW3I3LCByMl0KKyAgICB2bGQxLjggICAgICB7cTQsIHE1fSwgW3I3XSEgICAgICAgICBAIGxvYWQge2xpbmVhcl9zcmMrbGluZWFyX3hfc2l6ZSoyOSwgNjR9CisgICAgcGxkICAgICAgICAgW3I3LCByMl0KKyAgICB2bGQxLjggICAgICB7cTYsIHE3fSwgW3I3XSwgcjEwCisgICAgcGxkICAgICAgICAgW3I3LCByMl0KKyAgICB2bGQxLjggICAgICB7cTgsIHE5fSwgW3I3XSEgICAgICAgICBAIGxvYWQge2xpbmVhcl9zcmMrbGluZWFyX3hfc2l6ZSozMCwgNjR9CisgICAgcGxkICAgICAgICAgW3I3LCByMl0KKyAgICB2bGQxLjggICAgICB7cTEwLCBxMTF9LCBbcjddLCByMTAKKyAgICB2bGQxLjggICAgICB7cTEyLCBxMTN9LCBbcjddISAgICAgICBAIGxvYWQge2xpbmVhcl9zcmMrbGluZWFyX3hfc2l6ZSozMSwgNjR9CisgICAgdmxkMS44ICAgICAge3ExNCwgcTE1fSwgW3I3XSwgcjEwCisgICAgdnN0MS44ICAgICAge3EwLCBxMX0sIFtyNl0hICAgICAgICAgQCBzdG9yZSB7dGlsZWRfYWRkcis2NCoyOH0KKyAgICB2c3QxLjggICAgICB7cTIsIHEzfSwgW3I2XSEKKyAgICB2c3QxLjggICAgICB7cTQsIHE1fSwgW3I2XSEgICAgICAgICBAIHN0b3JlIHt0aWxlZF9hZGRyKzY0KjI5fQorICAgIHZzdDEuOCAgICAgIHtxNiwgcTd9LCBbcjZdIQorICAgIHZzdDEuOCAgICAgIHtxOCwgcTl9LCBbcjZdISAgICAgICAgIEAgc3RvcmUge3RpbGVkX2FkZHIrNjQqMzB9CisgICAgdnN0MS44ICAgICAge3ExMCwgcTExfSwgW3I2XSEKKyAgICB2c3QxLjggICAgICB7cTEyLCBxMTN9LCBbcjZdISAgICAgICBAIHN0b3JlIHt0aWxlZF9hZGRyKzY0KjMxfQorICAgIHZzdDEuOCAgICAgIHtxMTQsIHExNX0sIFtyNl0hCisKKyAgICBhZGQgICAgICAgICByNCwgcjQsICM2NCAgICAgICAgICAgICBAIGogPSBqKzY0CisgICAgY21wICAgICAgICAgcjQsIHI4ICAgICAgICAgICAgICAgICAgQCBqPGFsaWduZWRfeF9zaXplCisgICAgYmx0ICAgICAgICAgTE9PUF9BTElHTkVEX1hfU0laRQorCisgICAgYWRkICAgICAgICAgcjUsIHI1LCAjMzIgICAgICAgICAgICAgQCBpID0gaSszMgorICAgIGNtcCAgICAgICAgIHI1LCByOSAgICAgICAgICAgICAgICAgIEAgaTxhbGlnbmVkX3lfc2l6ZQorICAgIGJsdCAgICAgICAgIExPT1BfQUxJR05FRF9ZX1NJWkUKKworICAgIGxkciAgICAgICAgIHIxMCwgW3NwLCAjNDRdICAgICAgICAgIEAgcjEwID0gdG9wCisgICAgbGRyICAgICAgICAgcjExLCBbc3AsICM1Ml0gICAgICAgICAgQCByMTEgPSBidXR0b20KKyAgICBzdWIgICAgICAgICByMTAsIHIzLCByMTAKKyAgICBzdWIgICAgICAgICByMTAsIHIxMCwgcjExCisgICAgY21wICAgICAgICAgcjUsIHIxMCAgICAgICAgICAgICAgICAgQCBpID09ICh5dXY0MjBfaGVpZ2h0LXRvcC1idXR0b20pCisgICAgYmVxICAgICAgICAgTE9PUF9MSU5FQVJfWV9TSVpFXzJfU1RBUlQKKworTE9PUF9MSU5FQVJfWV9TSVpFXzE6CisKKyAgICBtb3YgICAgICAgICByNCwgIzAgICAgICAgICAgICAgICAgICBAIGogPSAwCitMT09QX0FMSUdORURfWF9TSVpFXzE6CisKKyAgICBibCAgICAgICAgICBHRVRfVElMRURfT0ZGU0VUCisKKyAgICBsZHIgICAgICAgICByMTAsIFtzcCwgIzQ0XSAgICAgICAgICBAIHIxMCA9IHRvcAorICAgIGxkciAgICAgICAgIHIxNCwgW3NwLCAjNDBdICAgICAgICAgIEAgcjE0ID0gbGVmdAorICAgIGFkZCAgICAgICAgIHIxMCwgcjUsIHIxMCAgICAgICAgICAgIEAgdGVtcDEgPSB5dXY0MjBfd2lkdGgqKGkrdG9wKQorICAgIG11bCAgICAgICAgIHIxMCwgcjIsIHIxMAorICAgIGFkZCAgICAgICAgIHI3LCByMSwgcjQgICAgICAgICAgICAgIEAgbGluZWFyX2FkZHIgPSBsaW5lYXJfc3JjK2oKKyAgICBhZGQgICAgICAgICByNywgcjcsIHIxMCAgICAgICAgICAgICBAIGxpbmVhcl9hZGRyID0gbGluZWFyX2FkZHIrdGVtcDEKKyAgICBhZGQgICAgICAgICByNywgcjcsIHIxNCAgICAgICAgICAgICBAIGxpbmVhcl9hZGRyID0gbGluZWFyX2FkZHIrbGVmdAorICAgIHN1YiAgICAgICAgIHIxMCwgcjIsICMzMiAgICAgICAgICAgIEAgdGVtcDEgPSB5dXY0MjBfd2lkdGgtMzIKKworICAgIHBsZCAgICAgICAgIFtyNywgcjJdCisgICAgdmxkMS44ICAgICAge3EwLCBxMX0sIFtyN10hICAgICAgICAgQCBsb2FkIHtsaW5lYXJfc3JjLCA2NH0KKyAgICBwbGQgICAgICAgICBbcjcsIHIyXQorICAgIHZsZDEuOCAgICAgIHtxMiwgcTN9LCBbcjddLCByMTAKKyAgICB2bGQxLjggICAgICB7cTQsIHE1fSwgW3I3XSEgICAgICAgICBAIGxvYWQge2xpbmVhcl9zcmMrbGluZWFyX3hfc2l6ZSoxLCA2NH0KKyAgICB2bGQxLjggICAgICB7cTYsIHE3fSwgW3I3XQorICAgIGFkZCAgICAgICAgIHI2LCByMCwgcjYgICAgICAgICAgICAgIEAgdGlsZWRfYWRkciA9IHRpbGVkX2Rlc3QrdGlsZWRfYWRkcgorICAgIGFuZCAgICAgICAgIHIxMCwgcjUsICMweDFGICAgICAgICAgIEAgdGVtcDEgPSBpJjB4MUYKKyAgICBtb3YgICAgICAgICByMTAsIHIxMCwgbHNsICM2ICAgICAgICBAIHRlbXAxID0gNjQqdGVtcDEKKyAgICBhZGQgICAgICAgICByNiwgcjYsIHIxMCAgICAgICAgICAgICBAIHRpbGVkX2FkZHIgPSB0aWxlZF9hZGRyK3RlbXAxCisgICAgdnN0MS44ICAgICAge3EwLCBxMX0sIFtyNl0hICAgICAgICAgQCBzdG9yZSB7dGlsZWRfYWRkcn0KKyAgICB2c3QxLjggICAgICB7cTIsIHEzfSwgW3I2XSEKKyAgICB2c3QxLjggICAgICB7cTQsIHE1fSwgW3I2XSEgICAgICAgICBAIHN0b3JlIHt0aWxlZF9hZGRyKzY0KjF9CisgICAgdnN0MS44ICAgICAge3E2LCBxN30sIFtyNl0hCisKKyAgICBhZGQgICAgICAgICByNCwgcjQsICM2NCAgICAgICAgICAgICBAIGogPSBqKzY0CisgICAgY21wICAgICAgICAgcjQsIHI4ICAgICAgICAgICAgICAgICAgQCBqPGFsaWduZWRfeF9zaXplCisgICAgYmx0ICAgICAgICAgTE9PUF9BTElHTkVEX1hfU0laRV8xCisKKyAgICBhZGQgICAgICAgICByNSwgcjUsICMyICAgICAgICAgICAgICBAIGkgPSBpKzIKKyAgICBsZHIgICAgICAgICByMTAsIFtzcCwgIzQ0XSAgICAgICAgICBAIHIxMCA9IHRvcAorICAgIGxkciAgICAgICAgIHIxNCwgW3NwLCAjNTJdICAgICAgICAgIEAgcjE0ID0gYnV0dG9tCisgICAgc3ViICAgICAgICAgcjEwLCByMywgcjEwCisgICAgc3ViICAgICAgICAgcjEwLCByMTAsIHIxNAorICAgIGNtcCAgICAgICAgIHI1LCByMTAgICAgICAgICAgICAgICAgIEAgaTx5dXY0MjBfaGVpZ2h0LXRvcC1idXR0b20KKyAgICBibHQgICAgICAgICBMT09QX0xJTkVBUl9ZX1NJWkVfMQorCitMT09QX0xJTkVBUl9ZX1NJWkVfMl9TVEFSVDoKKyAgICBsZHIgICAgICAgICByMTAsIFtzcCwgIzQwXSAgICAgICAgICBAIHIxMCA9IGxlZnQKKyAgICBsZHIgICAgICAgICByMTEsIFtzcCwgIzQ4XSAgICAgICAgICBAIHIxMSA9IHJpZ2h0CisgICAgc3ViICAgICAgICAgcjEwLCByMiwgcjEwCisgICAgc3ViICAgICAgICAgcjEwLCByMTAsIHIxMQorICAgIGNtcCAgICAgICAgIHI4LCByMTAgICAgICAgICAgICAgICAgIEAgYWxpZ25lZF94X3NpemUgPT0gKHl1djQyMF93aWR0aC1sZWZ0LXJpZ2h0KQorICAgIGJlcSAgICAgICAgIFJFU1RPUkVfUkVHCisKKyAgICBtb3YgICAgICAgICByNSwgIzAgICAgICAgICAgICAgICAgICBAIGkgPSAwCitMT09QX0xJTkVBUl9ZX1NJWkVfMjoKKworICAgIG1vdiAgICAgICAgIHI0LCByOCAgICAgICAgICAgICAgICAgIEAgaiA9IGFsaWduZWRfeF9zaXplCitMT09QX0xJTkVBUl9YX1NJWkVfMjoKKworICAgIGJsICAgICAgICAgIEdFVF9USUxFRF9PRkZTRVQKKworICAgIGxkciAgICAgICAgIHIxMCwgW3NwLCAjNDRdICAgICAgICAgIEAgcjE0ID0gdG9wCisgICAgbGRyICAgICAgICAgcjE0LCBbc3AsICM0MF0gICAgICAgICAgQCByMTAgPSBsZWZ0CisgICAgYWRkICAgICAgICAgcjEwLCByNSwgcjEwCisgICAgbXVsICAgICAgICAgcjEwLCByMiwgcjEwICAgICAgICAgICAgQCB0ZW1wMSA9IGxpbmVhcl94X3NpemUqKGkrdG9wKQorICAgIGFkZCAgICAgICAgIHI3LCByMSwgcjQgICAgICAgICAgICAgIEAgbGluZWFyX2FkZHIgPSBsaW5lYXJfc3JjK2oKKyAgICBhZGQgICAgICAgICByNywgcjcsIHIxMCAgICAgICAgICAgICBAIGxpbmVhcl9hZGRyID0gbGluZWFyX2FkZHIrdGVtcDEKKyAgICBhZGQgICAgICAgICByNywgcjcsIHIxNCAgICAgICAgICAgICBAIGxpbmVhcl9hZGRyID0gbGluZWFyX2FkZHIrbGVmdAorCisgICAgYWRkICAgICAgICAgcjYsIHIwLCByNiAgICAgICAgICAgICAgQCB0aWxlZF9hZGRyID0gdGlsZWRfZGVzdCt0aWxlZF9hZGRyCisgICAgYW5kICAgICAgICAgcjExLCByNSwgIzB4MUYgICAgICAgICAgQCB0ZW1wMiA9IGkmMHgxRgorICAgIG1vdiAgICAgICAgIHIxMSwgcjExLCBsc2wgIzYgICAgICAgIEAgdGVtcDIgPSA2NCp0ZW1wMgorICAgIGFkZCAgICAgICAgIHI2LCByNiwgcjExICAgICAgICAgICAgIEAgdGlsZWRfYWRkciA9IHRpbGVkX2FkZHIrdGVtcDIKKyAgICBhbmQgICAgICAgICByMTEsIHI0LCAjMHgzRiAgICAgICAgICBAIHRlbXAyID0gaiYweDNGCisgICAgYWRkICAgICAgICAgcjYsIHI2LCByMTEgICAgICAgICAgICAgQCB0aWxlZF9hZGRyID0gdGlsZWRfYWRkcit0ZW1wMgorCisgICAgbGRyaCAgICAgICAgcjEwLCBbcjddLCByMgorICAgIGxkcmggICAgICAgIHIxMSwgW3I3XQorICAgIHN0cmggICAgICAgIHIxMCwgW3I2XSwgIzY0CisgICAgc3RyaCAgICAgICAgcjExLCBbcjZdCisKKyAgICBsZHIgICAgICAgICByMTIsIFtzcCwgIzQwXSAgICAgICAgICBAIHIxMiA9IGxlZnQKKyAgICBsZHIgICAgICAgICByMTQsIFtzcCwgIzQ4XSAgICAgICAgICBAIHIxNCA9IHJpZ2h0CisgICAgYWRkICAgICAgICAgcjQsIHI0LCAjMiAgICAgICAgICAgICAgQCBqID0gaisyCisgICAgc3ViICAgICAgICAgcjEyLCByMiwgcjEyCisgICAgc3ViICAgICAgICAgcjEyLCByMTIsIHIxNAorICAgIGNtcCAgICAgICAgIHI0LCByMTIgICAgICAgICAgICAgICAgIEAgajwoeXV2NDIwX3dpZHRoLWxlZnQtcmlnaHQpCisgICAgYmx0ICAgICAgICAgTE9PUF9MSU5FQVJfWF9TSVpFXzIKKworICAgIGxkciAgICAgICAgIHIxMiwgW3NwLCAjNDRdICAgICAgICAgIEAgcjEyID0gdG9wCisgICAgbGRyICAgICAgICAgcjE0LCBbc3AsICM1Ml0gICAgICAgICAgQCByMTQgPSBidXR0b20KKyAgICBhZGQgICAgICAgICByNSwgcjUsICMyICAgICAgICAgICAgICBAIGkgPSBpKzIKKyAgICBzdWIgICAgICAgICByMTIsIHIzLCByMTIKKyAgICBzdWIgICAgICAgICByMTIsIHIxMiwgcjE0CisgICAgY21wICAgICAgICAgcjUsIHIxMiAgICAgICAgICAgICAgICAgQCBpPCh5dXY0MjBfaGVpZ2h0LXRvcC1idXR0b20pCisgICAgYmx0ICAgICAgICAgTE9PUF9MSU5FQVJfWV9TSVpFXzIKKworUkVTVE9SRV9SRUc6CisgICAgbGRtZmQgICAgICAgc3AhLCB7cjQtcjEyLHIxNX0gICAgICAgQCByZXN0b3JlIHJlZ2lzdGVycworCitHRVRfVElMRURfT0ZGU0VUOgorCisgICAgbW92ICAgICAgICAgcjExLCByNSwgYXNyICM1ICAgICAgICAgQCB0ZW1wMiA9IGk+PjUKKyAgICBtb3YgICAgICAgICByMTAsIHI0LCBhc3IgIzYgICAgICAgICBAIHRlbXAxID0gaj4+NgorCisgICAgYW5kICAgICAgICAgcjEyLCByMTEsICMweDEgICAgICAgICAgQCBpZiAodGVtcDIgJiAweDEpCisgICAgY21wICAgICAgICAgcjEyLCAjMHgxCisgICAgYm5lICAgICAgICAgR0VUX1RJTEVEX09GRlNFVF9FVkVOX0ZPUk1VTEFfMQorCitHRVRfVElMRURfT0ZGU0VUX09ERF9GT1JNVUxBOgorICAgIHN1YiAgICAgICAgIHI2LCByMTEsICMxICAgICAgICAgICAgIEAgdGlsZWRfYWRkciA9IHRlbXAyLTEKKworICAgIGxkciAgICAgICAgIHI3LCBbc3AsICM0MF0gICAgICAgICAgQCBsZWZ0CisgICAgYWRkICAgICAgICAgcjEyLCByMiwgIzEyNyAgICAgICAgICAgQCB0ZW1wMyA9IGxpbmVhcl94X3NpemUrMTI3CisgICAgc3ViICAgICAgICAgcjEyLCByMTIsIHI3CisgICAgbGRyICAgICAgICAgcjcsIFtzcCwgIzQ4XSAgICAgICAgICBAIHJpZ2h0CisgICAgc3ViICAgICAgICAgcjEyLCByMTIsIHI3CisgICAgYmljICAgICAgICAgcjEyLCByMTIsICMweDdGICAgICAgICAgQCB0ZW1wMyA9ICh0ZW1wMyA+PjcpPDw3CisgICAgbW92ICAgICAgICAgcjEyLCByMTIsIGFzciAjNiAgICAgICAgQCB0ZW1wMyA9IHRlbXAzPj42CisgICAgbXVsICAgICAgICAgcjYsIHI2LCByMTIgICAgICAgICAgICAgQCB0aWxlZF9hZGRyID0gdGlsZWRfYWRkcip0ZW1wMworICAgIGFkZCAgICAgICAgIHI2LCByNiwgcjEwICAgICAgICAgICAgIEAgdGlsZWRfYWRkciA9IHRpbGVkX2FkZHIrdGVtcDEKKyAgICBhZGQgICAgICAgICByNiwgcjYsICMyICAgICAgICAgICAgICBAIHRpbGVkX2FkZHIgPSB0aWxlZF9hZGRyKzIKKyAgICBiaWMgICAgICAgICByMTIsIHIxMCwgIzB4MyAgICAgICAgICBAIHRlbXAzID0gKHRlbXAxPj4yKTw8MgorICAgIGFkZCAgICAgICAgIHI2LCByNiwgcjEyICAgICAgICAgICAgIEAgdGlsZWRfYWRkciA9IHRpbGVkX2FkZHIrdGVtcDMKKyAgICBtb3YgICAgICAgICByNiwgcjYsIGxzbCAjMTEgICAgICAgICBAIHRpbGVkX2FkZHIgPSB0aWxlZF9hZGRyPDwxMQorICAgIGIgICAgICAgICAgIEdFVF9USUxFRF9PRkZTRVRfUkVUVVJOCisKK0dFVF9USUxFRF9PRkZTRVRfRVZFTl9GT1JNVUxBXzE6CisgICAgbGRyICAgICAgICAgcjcsIFtzcCwgIzQ0XSAgICAgICAgICBAIHRvcAorICAgIGFkZCAgICAgICAgIHIxMiwgcjMsICMzMSAgICAgICAgICAgIEAgdGVtcDMgPSBsaW5lYXJfeV9zaXplKzMxCisgICAgc3ViICAgICAgICAgcjEyLCByMTIsIHI3CisgICAgbGRyICAgICAgICAgcjcsIFtzcCwgIzUyXSAgICAgICAgICBAIGJ1dHRvbQorICAgIHN1YiAgICAgICAgIHIxMiwgcjEyLCByNworICAgIGJpYyAgICAgICAgIHIxMiwgcjEyLCAjMHgxRiAgICAgICAgIEAgdGVtcDMgPSAodGVtcDM+PjUpPDw1CisgICAgc3ViICAgICAgICAgcjEyLCByMTIsICMzMiAgICAgICAgICAgQCB0ZW1wMyA9IHRlbXAzIC0gMzIKKyAgICBjbXAgICAgICAgICByNSwgcjEyICAgICAgICAgICAgICAgICBAIGlmIChpPCh0ZW1wMy0zMikpIHsKKyAgICBiZ2UgICAgICAgICBHRVRfVElMRURfT0ZGU0VUX0VWRU5fRk9STVVMQV8yCisgICAgYWRkICAgICAgICAgcjEyLCByMTAsICMyICAgICAgICAgICAgQCB0ZW1wMyA9IHRlbXAxKzIKKyAgICBiaWMgICAgICAgICByMTIsIHIxMiwgIzMgICAgICAgICAgICBAIHRlbXAzID0gKHRlbXAzPj4yKTw8MgorICAgIGFkZCAgICAgICAgIHI2LCByMTAsIHIxMiAgICAgICAgICAgIEAgdGlsZWRfYWRkciA9IHRlbXAxK3RlbXAzCisgICAgbGRyICAgICAgICAgcjcsIFtzcCwgIzQwXSAgICAgICAgICBAIGxlZnQKKyAgICBhZGQgICAgICAgICByMTIsIHIyLCAjMTI3ICAgICAgICAgICBAIHRlbXAzID0gbGluZWFyX3hfc2l6ZSsxMjcKKyAgICBzdWIgICAgICAgICByMTIsIHIxMiwgcjcKKyAgICBsZHIgICAgICAgICByNywgW3NwLCAjNDhdICAgICAgICAgIEAgcmlnaHQKKyAgICBzdWIgICAgICAgICByMTIsIHIxMiwgcjcKKyAgICBiaWMgICAgICAgICByMTIsIHIxMiwgIzB4N0YgICAgICAgICBAIHRlbXAzID0gKHRlbXAzPj43KTw8NworICAgIG1vdiAgICAgICAgIHIxMiwgcjEyLCBhc3IgIzYgICAgICAgIEAgdGVtcDMgPSB0ZW1wMz4+NgorICAgIG11bCAgICAgICAgIHIxMSwgcjExLCByMTIgICAgICAgICAgIEAgdGlsZWRfeV9pbmRleCA9IHRpbGVkX3lfaW5kZXgqdGVtcDMKKyAgICBhZGQgICAgICAgICByNiwgcjYsIHIxMSAgICAgICAgICAgICBAIHRpbGVkX2FkZHIgPSB0aWxlZF9hZGRyK3RpbGVkX3lfaW5kZXgKKyAgICBtb3YgICAgICAgICByNiwgcjYsIGxzbCAjMTEgICAgICAgICBACisgICAgYiAgICAgICAgICAgR0VUX1RJTEVEX09GRlNFVF9SRVRVUk4KKworR0VUX1RJTEVEX09GRlNFVF9FVkVOX0ZPUk1VTEFfMjoKKyAgICBsZHIgICAgICAgICByNywgW3NwLCAjNDBdICAgICAgICAgIEAgbGVmdAorICAgIGFkZCAgICAgICAgIHIxMiwgcjIsICMxMjcgICAgICAgICAgIEAgdGVtcDMgPSBsaW5lYXJfeF9zaXplKzEyNworICAgIHN1YiAgICAgICAgIHIxMiwgcjEyLCByNworICAgIGxkciAgICAgICAgIHI3LCBbc3AsICM0OF0gICAgICAgICAgQCByaWdodAorICAgIHN1YiAgICAgICAgIHIxMiwgcjEyLCByNworICAgIGJpYyAgICAgICAgIHIxMiwgcjEyLCAjMHg3RiAgICAgICAgIEAgdGVtcDMgPSAodGVtcDM+PjcpPDw3CisgICAgbW92ICAgICAgICAgcjEyLCByMTIsIGFzciAjNiAgICAgICAgQCB0ZW1wMyA9IHRlbXAzPj42CisgICAgbXVsICAgICAgICAgcjYsIHIxMSwgcjEyICAgICAgICAgICAgQCB0aWxlZF9hZGRyID0gdGVtcDIqdGVtcDMKKyAgICBhZGQgICAgICAgICByNiwgcjYsIHIxMCAgICAgICAgICAgICBAIHRpbGVkX2FkZHIgPSB0aWxlZF9hZGRyK3RlbXAzCisgICAgbW92ICAgICAgICAgcjYsIHI2LCBsc2wgIzExICAgICAgICAgQCB0aWxlZF9hZGRyID0gdGlsZWRfYWRkcjw8MTFACisKK0dFVF9USUxFRF9PRkZTRVRfUkVUVVJOOgorICAgIG1vdiAgICAgICAgIHBjLCBscgorCisgICAgLmZuZW5kCmRpZmYgLS1naXQgYS9leHlub3M0L2hhbC9saWJzd2NvbnZlcnRlci9jc2NfbGluZWFyX3RvX3RpbGVkX2ludGVybGVhdmVfY3JvcF9uZW9uLnMgYi9leHlub3M0L2hhbC9saWJzd2NvbnZlcnRlci9jc2NfbGluZWFyX3RvX3RpbGVkX2ludGVybGVhdmVfY3JvcF9uZW9uLnMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzNhMzFkYQotLS0gL2Rldi9udWxsCisrKyBiL2V4eW5vczQvaGFsL2xpYnN3Y29udmVydGVyL2NzY19saW5lYXJfdG9fdGlsZWRfaW50ZXJsZWF2ZV9jcm9wX25lb24ucwpAQCAtMCwwICsxLDU2MyBAQAorLyoKKyAqCisgKiBDb3B5cmlnaHQgMjAxMiBTYW1zdW5nIEVsZWN0cm9uaWNzIFMuTFNJIENvLiBMVEQKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKQorICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisvKgorICogQGZpbGUgICAgY3NjX2xpbmVhcl90b190aWxlZF9pbnRlcmxlYXZlX2Nyb3BfbmVvbi5zCisgKiBAYnJpZWYgICBTRUNfT01YIHNwZWNpZmljIGRlZmluZQorICogQGF1dGhvciAgU2hpbldvbiBMZWUgKHNoaW53b24ubGVlQHNhbXN1bmcuY29tKQorICogQHZlcnNpb24gMS4wCisgKiBAaGlzdG9yeQorICogICAyMDEyLjAyLjAxIDogQ3JlYXRlCisgKi8KKworLyoKKyAqIENvbnZlcnRzIHRpbGVkIGRhdGEgdG8gbGluZWFyCisgKiBDcm9wcyBsZWZ0LCB0b3AsIHJpZ2h0LCBidXR0b20KKyAqIDEuIFkgb2YgTlYxMlQgdG8gWSBvZiBZVVY0MjBQCisgKiAyLiBZIG9mIE5WMTJUIHRvIFkgb2YgWVVWNDIwUworICogMy4gVVYgb2YgTlYxMlQgdG8gVVYgb2YgWVVWNDIwUworICoKKyAqIEBwYXJhbSB5dXY0MjBfZGVzdAorICogICBZIG9yIFVWIHBsYW5lIGFkZHJlc3Mgb2YgWVVWNDIwW291dF0KKyAqCisgKiBAcGFyYW0gbnYxMnRfc3JjCisgKiAgIFkgb3IgVVYgcGxhbmUgYWRkcmVzcyBvZiBOVjEyVFtpbl0KKyAqCisgKiBAcGFyYW0geXV2NDIwX3dpZHRoCisgKiAgIFdpZHRoIG9mIFlVVjQyMFtpbl0KKyAqCisgKiBAcGFyYW0geXV2NDIwX2hlaWdodAorICogICBZOiBIZWlnaHQgb2YgWVVWNDIwLCBVVjogSGVpZ2h0LzIgb2YgWVVWNDIwW2luXQorICoKKyAqIEBwYXJhbSBsZWZ0CisgKiAgIENyb3Agc2l6ZSBvZiBsZWZ0LiBJdCBzaG91bGQgYmUgZXZlbi4KKyAqCisgKiBAcGFyYW0gdG9wCisgKiAgIENyb3Agc2l6ZSBvZiB0b3AuIEl0IHNob3VsZCBiZSBldmVuLgorICoKKyAqIEBwYXJhbSByaWdodAorICogICBDcm9wIHNpemUgb2YgcmlnaHQuIEl0IHNob3VsZCBiZSBldmVuLgorICoKKyAqIEBwYXJhbSBidXR0b20KKyAqICAgQ3JvcCBzaXplIG9mIGJ1dHRvbS4gSXQgc2hvdWxkIGJlIGV2ZW4uCisgKi8KKworICAgIC5hcmNoIGFybXY3LWEKKyAgICAudGV4dAorICAgIC5nbG9iYWwgY3NjX2xpbmVhcl90b190aWxlZF9pbnRlcmxlYXZlX2Nyb3BfbmVvbgorICAgIC50eXBlICAgY3NjX2xpbmVhcl90b190aWxlZF9pbnRlcmxlYXZlX2Nyb3BfbmVvbiwgJWZ1bmN0aW9uCitjc2NfbGluZWFyX3RvX3RpbGVkX2ludGVybGVhdmVfY3JvcF9uZW9uOgorICAgIC5mbnN0YXJ0CisKKyAgICBAcjAgICAgIHRpbGVkX2Rlc3QKKyAgICBAcjEgICAgIGxpbmVhcl9zcmNfdQorICAgIEByMiAgICAgbGluZWFyX3NyY192CisgICAgQHIzICAgICB5dXY0MjBfd2lkdGgKKyAgICBAcjQgICAgIHl1djQyMF9oZWlnaHQKKyAgICBAcjUgICAgIGoKKyAgICBAcjYgICAgIGkKKyAgICBAcjcgICAgIHRpbGVkX2FkZHIKKyAgICBAcjggICAgIGxpbmVhcl9hZGRyCisgICAgQHI5ICAgICBhbGlnbmVkX3hfc2l6ZQorICAgIEByMTAgICAgYWxpZ25lZF95X3NpemUKKyAgICBAcjExICAgIHRlbXAxCisgICAgQHIxMiAgICB0ZW1wMgorICAgIEByMTQgICAgdGVtcDMKKworICAgIHN0bWZkICAgICAgIHNwISwge3I0LXIxMixyMTR9ICAgICAgIEAgYmFja3VwIHJlZ2lzdGVycworCisgICAgbGRyICAgICAgICAgcjQsIFtzcCwgIzQwXSAgICAgICAgICAgQCBsb2FkIGxpbmVhcl95X3NpemUgdG8gcjQKKworICAgIGxkciAgICAgICAgIHIxMCwgW3NwLCAjNDhdICAgICAgICAgIEAgcjEwID0gdG9wCisgICAgbGRyICAgICAgICAgcjE0LCBbc3AsICM1Nl0gICAgICAgICAgQCByMTQgPSBidXR0b20KKyAgICBsZHIgICAgICAgICByMTEsIFtzcCwgIzQ0XSAgICAgICAgICBAIHIxMSA9IGxlZnQKKyAgICBsZHIgICAgICAgICByMTIsIFtzcCwgIzUyXSAgICAgICAgICBAIHIxMiA9IHJpZ2h0CisKKyAgICBzdWIgICAgICAgICByMTAsIHI0LCByMTAgICAgICAgICAgICBAIGFsaWduZWRfeV9zaXplID0gKCh5dXY0MjBfaGVpZ2h0LXRvcC1idXR0b20pPj41KTw8NQorICAgIHN1YiAgICAgICAgIHIxMCwgcjEwLCByMTQKKyAgICBiaWMgICAgICAgICByMTAsIHIxMCwgIzB4MUYKKyAgICBzdWIgICAgICAgICByMTEsIHIzLCByMTEgICAgICAgICAgICBAIGFsaWduZWRfeF9zaXplID0gKCh5dXY0MjBfd2lkdGgtbGVmdC1yaWdodCk+PjYpPDw2CisgICAgc3ViICAgICAgICAgcjExLCByMTEsIHIxMgorICAgIGJpYyAgICAgICAgIHI5LCByMTEsICMweDNGCisKKyAgICBtb3YgICAgICAgICByNiwgIzAgICAgICAgICAgICAgICAgICBAIGkgPSAwCitMT09QX0FMSUdORURfWV9TSVpFOgorCisgICAgbW92ICAgICAgICAgcjUsICMwICAgICAgICAgICAgICAgICAgQCBqID0gMAorTE9PUF9BTElHTkVEX1hfU0laRToKKworICAgIGJsICAgICAgICAgIEdFVF9USUxFRF9PRkZTRVQKKworICAgIGxkciAgICAgICAgIHIxMiwgW3NwLCAjNDhdICAgICAgICAgIEAgcjEyID0gdG9wCisgICAgbGRyICAgICAgICAgcjgsIFtzcCwgIzQ0XSAgICAgICAgICAgQCByOCA9IGxlZnQKKworICAgIG1vdiAgICAgICAgIHIxMSwgcjMsIGFzciAjMSAgICAgICAgIEAgdGVtcDEgPSAoeXV2NDIwX3dpZHRoLzIpKihpK3RvcCkKKyAgICBhZGQgICAgICAgICByMTIsIHI2LCByMTIKKyAgICBtdWwgICAgICAgICByMTEsIHIxMSwgcjEyCisgICAgYWRkICAgICAgICAgcjExLCByMTEsIHI1LCBhc3IgIzEgICAgQCB0ZW1wMSA9IHRlbXAxK2ovMgorICAgIGFkZCAgICAgICAgIHIxMSwgcjExLCByOCwgYXNyICMxICAgIEAgdGVtcDEgPSB0ZW1wMStsZWZ0LzIKKworICAgIG1vdiAgICAgICAgIHIxMiwgcjMsIGFzciAjMSAgICAgICAgIEAgdGVtcDIgPSB5dXY0MjBfd2lkdGgvMgorICAgIHN1YiAgICAgICAgIHIxMiwgcjEyLCAjMTYgICAgICAgICAgIEAgdGVtcDIgPSB5dXY0MjBfd2lkdGgtMTYKKworICAgIGFkZCAgICAgICAgIHI4LCByMSwgcjExICAgICAgICAgICAgIEAgbGluZWFyX2FkZHIgPSBsaW5lYXJfc3JjX3UrdGVtcDEKKyAgICBhZGQgICAgICAgICByMTEsIHIyLCByMTEgICAgICAgICAgICBAIHRlbXAxID0gbGluZWFyX3NyY192K3RlbXAxCisgICAgYWRkICAgICAgICAgcjcsIHIwLCByNyAgICAgICAgICAgICAgQCB0aWxlZF9hZGRyID0gdGlsZWRfZGVzdCt0aWxlZF9hZGRyCisKKyAgICBwbGQgICAgICAgICBbcjgsIHIzXQorICAgIHZsZDEuOCAgICAgIHtxMH0sIFtyOF0hICAgICAgICAgICAgIEAgbG9hZCB7bGluZWFyX3NyY191LCAzMn0KKyAgICB2bGQxLjggICAgICB7cTJ9LCBbcjhdLCByMTIKKyAgICBwbGQgICAgICAgICBbcjgsIHIzXQorICAgIHZsZDEuOCAgICAgIHtxNH0sIFtyOF0hICAgICAgICAgICAgIEAgbG9hZCB7bGluZWFyX3NyY191KyhsaW5lYXJfeF9zaXplLzIpKjEsIDMyfQorICAgIHZsZDEuOCAgICAgIHtxNn0sIFtyOF0sIHIxMgorICAgIHBsZCAgICAgICAgIFtyMTFdCisgICAgdmxkMS44ICAgICAge3E4fSwgW3I4XSEgICAgICAgICAgICAgQCBsb2FkIHtsaW5lYXJfc3JjX3UrKGxpbmVhcl94X3NpemUvMikqMiwgMzJ9CisgICAgdmxkMS44ICAgICAge3ExMH0sIFtyOF0sIHIxMgorICAgIHBsZCAgICAgICAgIFtyMTEsIHIzLCBhc3IgIzFdCisgICAgdmxkMS44ICAgICAge3ExMn0sIFtyOF0hICAgICAgICAgICAgQCBsb2FkIHtsaW5lYXJfc3JjX3UrKGxpbmVhcl94X3NpemUvMikqMywgMzJ9CisgICAgdmxkMS44ICAgICAge3ExNH0sIFtyOF0sIHIxMgorICAgIHBsZCAgICAgICAgIFtyMTEsIHIzXQorICAgIHZsZDEuOCAgICAgIHtxMX0sIFtyMTFdISAgICAgICAgICAgIEAgbG9hZCB7bGluZWFyX3NyY192LCAzMn0KKyAgICB2bGQxLjggICAgICB7cTN9LCBbcjExXSwgcjEyCisgICAgcGxkICAgICAgICAgW3IxMSwgcjNdCisgICAgdmxkMS44ICAgICAge3E1fSwgW3IxMV0hICAgICAgICAgICAgQCBsb2FkIHtsaW5lYXJfc3JjX3YrKGxpbmVhcl94X3NpemUvMikqMSwgMzJ9CisgICAgdmxkMS44ICAgICAge3E3fSwgW3IxMV0sIHIxMgorICAgIHBsZCAgICAgICAgIFtyOF0KKyAgICB2bGQxLjggICAgICB7cTl9LCBbcjExXSEgICAgICAgICAgICBAIGxvYWQge2xpbmVhcl9zcmNfdisobGluZWFyX3hfc2l6ZS8yKSoyLCAzMn0KKyAgICB2bGQxLjggICAgICB7cTExfSwgW3IxMV0sIHIxMgorICAgIHBsZCAgICAgICAgIFtyOCwgcjMsIGFzciAjMV0KKyAgICB2bGQxLjggICAgICB7cTEzfSwgW3IxMV0hICAgICAgICAgICBAIGxvYWQge2xpbmVhcl9zcmNfdisobGluZWFyX3hfc2l6ZS8yKSozLCAzMn0KKyAgICB2bGQxLjggICAgICB7cTE1fSwgW3IxMV0sIHIxMgorICAgIHZzdDIuOCAgICAgIHtxMCwgcTF9LCBbcjddISAgICAgICAgIEAgc3RvcmUge3RpbGVkX2FkZHJ9CisgICAgdnN0Mi44ICAgICAge3EyLCBxM30sIFtyN10hCisgICAgdnN0Mi44ICAgICAge3E0LCBxNX0sIFtyN10hICAgICAgICAgQCBzdG9yZSB7dGlsZWRfYWRkcis2NCoxfQorICAgIHZzdDIuOCAgICAgIHtxNiwgcTd9LCBbcjddIQorICAgIHZzdDIuOCAgICAgIHtxOCwgcTl9LCBbcjddISAgICAgICAgIEAgc3RvcmUge3RpbGVkX2FkZHIrNjQqMn0KKyAgICB2c3QyLjggICAgICB7cTEwLCBxMTF9LCBbcjddIQorICAgIHZzdDIuOCAgICAgIHtxMTIsIHExM30sIFtyN10hICAgICAgIEAgc3RvcmUge3RpbGVkX2FkZHIrNjQqM30KKyAgICB2c3QyLjggICAgICB7cTE0LCBxMTV9LCBbcjddIQorCisgICAgcGxkICAgICAgICAgW3I4LCByM10KKyAgICB2bGQxLjggICAgICB7cTB9LCBbcjhdISAgICAgICAgICAgICBAIGxvYWQge2xpbmVhcl9zcmNfdSsobGluZWFyX3hfc2l6ZS8yKSo0LCAzMn0KKyAgICB2bGQxLjggICAgICB7cTJ9LCBbcjhdLCByMTIKKyAgICBwbGQgICAgICAgICBbcjgsIHIzXQorICAgIHZsZDEuOCAgICAgIHtxNH0sIFtyOF0hICAgICAgICAgICAgIEAgbG9hZCB7bGluZWFyX3NyY191KyhsaW5lYXJfeF9zaXplLzIpKjUsIDMyfQorICAgIHZsZDEuOCAgICAgIHtxNn0sIFtyOF0sIHIxMgorICAgIHBsZCAgICAgICAgIFtyMTFdCisgICAgdmxkMS44ICAgICAge3E4fSwgW3I4XSEgICAgICAgICAgICAgQCBsb2FkIHtsaW5lYXJfc3JjX3UrKGxpbmVhcl94X3NpemUvMikqNiwgMzJ9CisgICAgdmxkMS44ICAgICAge3ExMH0sIFtyOF0sIHIxMgorICAgIHBsZCAgICAgICAgIFtyMTEsIHIzLCBhc3IgIzFdCisgICAgdmxkMS44ICAgICAge3ExMn0sIFtyOF0hICAgICAgICAgICAgQCBsb2FkIHtsaW5lYXJfc3JjX3UrKGxpbmVhcl94X3NpemUvMikqNywgMzJ9CisgICAgdmxkMS44ICAgICAge3ExNH0sIFtyOF0sIHIxMgorICAgIHBsZCAgICAgICAgIFtyMTEsIHIzXQorICAgIHZsZDEuOCAgICAgIHtxMX0sIFtyMTFdISAgICAgICAgICAgIEAgbG9hZCB7bGluZWFyX3NyY192KyhsaW5lYXJfeF9zaXplLzIpKjQsIDMyfQorICAgIHZsZDEuOCAgICAgIHtxM30sIFtyMTFdLCByMTIKKyAgICBwbGQgICAgICAgICBbcjExLCByM10KKyAgICB2bGQxLjggICAgICB7cTV9LCBbcjExXSEgICAgICAgICAgICBAIGxvYWQge2xpbmVhcl9zcmNfdisobGluZWFyX3hfc2l6ZS8yKSo1LCAzMn0KKyAgICB2bGQxLjggICAgICB7cTd9LCBbcjExXSwgcjEyCisgICAgcGxkICAgICAgICAgW3I4XQorICAgIHZsZDEuOCAgICAgIHtxOX0sIFtyMTFdISAgICAgICAgICAgIEAgbG9hZCB7bGluZWFyX3NyY192KyhsaW5lYXJfeF9zaXplLzIpKjYsIDMyfQorICAgIHZsZDEuOCAgICAgIHtxMTF9LCBbcjExXSwgcjEyCisgICAgcGxkICAgICAgICAgW3I4LCByMywgYXNyICMxXQorICAgIHZsZDEuOCAgICAgIHtxMTN9LCBbcjExXSEgICAgICAgICAgIEAgbG9hZCB7bGluZWFyX3NyY192KyhsaW5lYXJfeF9zaXplLzIpKjcsIDMyfQorICAgIHZsZDEuOCAgICAgIHtxMTV9LCBbcjExXSwgcjEyCisgICAgdnN0Mi44ICAgICAge3EwLCBxMX0sIFtyN10hICAgICAgICAgQCBzdG9yZSB7dGlsZWRfYWRkcis2NCo0fQorICAgIHZzdDIuOCAgICAgIHtxMiwgcTN9LCBbcjddIQorICAgIHZzdDIuOCAgICAgIHtxNCwgcTV9LCBbcjddISAgICAgICAgIEAgc3RvcmUge3RpbGVkX2FkZHIrNjQqNX0KKyAgICB2c3QyLjggICAgICB7cTYsIHE3fSwgW3I3XSEKKyAgICB2c3QyLjggICAgICB7cTgsIHE5fSwgW3I3XSEgICAgICAgICBAIHN0b3JlIHt0aWxlZF9hZGRyKzY0KjZ9CisgICAgdnN0Mi44ICAgICAge3ExMCwgcTExfSwgW3I3XSEKKyAgICB2c3QyLjggICAgICB7cTEyLCBxMTN9LCBbcjddISAgICAgICBAIHN0b3JlIHt0aWxlZF9hZGRyKzY0Kjd9CisgICAgdnN0Mi44ICAgICAge3ExNCwgcTE1fSwgW3I3XSEKKworICAgIHBsZCAgICAgICAgIFtyOCwgcjNdCisgICAgdmxkMS44ICAgICAge3EwfSwgW3I4XSEgICAgICAgICAgICAgQCBsb2FkIHtsaW5lYXJfc3JjX3UrKGxpbmVhcl94X3NpemUvMikqOCwgMzJ9CisgICAgdmxkMS44ICAgICAge3EyfSwgW3I4XSwgcjEyCisgICAgcGxkICAgICAgICAgW3I4LCByM10KKyAgICB2bGQxLjggICAgICB7cTR9LCBbcjhdISAgICAgICAgICAgICBAIGxvYWQge2xpbmVhcl9zcmNfdSsobGluZWFyX3hfc2l6ZS8yKSo5LCAzMn0KKyAgICB2bGQxLjggICAgICB7cTZ9LCBbcjhdLCByMTIKKyAgICBwbGQgICAgICAgICBbcjExXQorICAgIHZsZDEuOCAgICAgIHtxOH0sIFtyOF0hICAgICAgICAgICAgIEAgbG9hZCB7bGluZWFyX3NyY191KyhsaW5lYXJfeF9zaXplLzIpKjEwLCAzMn0KKyAgICB2bGQxLjggICAgICB7cTEwfSwgW3I4XSwgcjEyCisgICAgcGxkICAgICAgICAgW3IxMSwgcjMsIGFzciAjMV0KKyAgICB2bGQxLjggICAgICB7cTEyfSwgW3I4XSEgICAgICAgICAgICBAIGxvYWQge2xpbmVhcl9zcmNfdSsobGluZWFyX3hfc2l6ZS8yKSoxMSwgMzJ9CisgICAgdmxkMS44ICAgICAge3ExNH0sIFtyOF0sIHIxMgorICAgIHBsZCAgICAgICAgIFtyMTEsIHIzXQorICAgIHZsZDEuOCAgICAgIHtxMX0sIFtyMTFdISAgICAgICAgICAgIEAgbG9hZCB7bGluZWFyX3NyY192KyhsaW5lYXJfeF9zaXplLzIpKjgsIDMyfQorICAgIHZsZDEuOCAgICAgIHtxM30sIFtyMTFdLCByMTIKKyAgICBwbGQgICAgICAgICBbcjExLCByM10KKyAgICB2bGQxLjggICAgICB7cTV9LCBbcjExXSEgICAgICAgICAgICBAIGxvYWQge2xpbmVhcl9zcmNfdisobGluZWFyX3hfc2l6ZS8yKSo5LCAzMn0KKyAgICB2bGQxLjggICAgICB7cTd9LCBbcjExXSwgcjEyCisgICAgcGxkICAgICAgICAgW3I4XQorICAgIHZsZDEuOCAgICAgIHtxOX0sIFtyMTFdISAgICAgICAgICAgIEAgbG9hZCB7bGluZWFyX3NyY192KyhsaW5lYXJfeF9zaXplLzIpKjEwLCAzMn0KKyAgICB2bGQxLjggICAgICB7cTExfSwgW3IxMV0sIHIxMgorICAgIHBsZCAgICAgICAgIFtyOCwgcjMsIGFzciAjMV0KKyAgICB2bGQxLjggICAgICB7cTEzfSwgW3IxMV0hICAgICAgICAgICBAIGxvYWQge2xpbmVhcl9zcmNfdisobGluZWFyX3hfc2l6ZS8yKSoxMSwgMzJ9CisgICAgdmxkMS44ICAgICAge3ExNX0sIFtyMTFdLCByMTIKKyAgICB2c3QyLjggICAgICB7cTAsIHExfSwgW3I3XSEgICAgICAgICBAIHN0b3JlIHt0aWxlZF9hZGRyKzY0Kjh9CisgICAgdnN0Mi44ICAgICAge3EyLCBxM30sIFtyN10hCisgICAgdnN0Mi44ICAgICAge3E0LCBxNX0sIFtyN10hICAgICAgICAgQCBzdG9yZSB7dGlsZWRfYWRkcis2NCo5fQorICAgIHZzdDIuOCAgICAgIHtxNiwgcTd9LCBbcjddIQorICAgIHZzdDIuOCAgICAgIHtxOCwgcTl9LCBbcjddISAgICAgICAgIEAgc3RvcmUge3RpbGVkX2FkZHIrNjQqMTB9CisgICAgdnN0Mi44ICAgICAge3ExMCwgcTExfSwgW3I3XSEKKyAgICB2c3QyLjggICAgICB7cTEyLCBxMTN9LCBbcjddISAgICAgICBAIHN0b3JlIHt0aWxlZF9hZGRyKzY0KjExfQorICAgIHZzdDIuOCAgICAgIHtxMTQsIHExNX0sIFtyN10hCisKKyAgICBwbGQgICAgICAgICBbcjgsIHIzXQorICAgIHZsZDEuOCAgICAgIHtxMH0sIFtyOF0hICAgICAgICAgICAgIEAgbG9hZCB7bGluZWFyX3NyY191KyhsaW5lYXJfeF9zaXplLzIpKjEyLCAzMn0KKyAgICB2bGQxLjggICAgICB7cTJ9LCBbcjhdLCByMTIKKyAgICBwbGQgICAgICAgICBbcjgsIHIzXQorICAgIHZsZDEuOCAgICAgIHtxNH0sIFtyOF0hICAgICAgICAgICAgIEAgbG9hZCB7bGluZWFyX3NyY191KyhsaW5lYXJfeF9zaXplLzIpKjEzLCAzMn0KKyAgICB2bGQxLjggICAgICB7cTZ9LCBbcjhdLCByMTIKKyAgICBwbGQgICAgICAgICBbcjExXQorICAgIHZsZDEuOCAgICAgIHtxOH0sIFtyOF0hICAgICAgICAgICAgIEAgbG9hZCB7bGluZWFyX3NyY191KyhsaW5lYXJfeF9zaXplLzIpKjE0LCAzMn0KKyAgICB2bGQxLjggICAgICB7cTEwfSwgW3I4XSwgcjEyCisgICAgcGxkICAgICAgICAgW3IxMSwgcjMsIGFzciAjMV0KKyAgICB2bGQxLjggICAgICB7cTEyfSwgW3I4XSEgICAgICAgICAgICBAIGxvYWQge2xpbmVhcl9zcmNfdSsobGluZWFyX3hfc2l6ZS8yKSoxNSwgMzJ9CisgICAgdmxkMS44ICAgICAge3ExNH0sIFtyOF0sIHIxMgorICAgIHBsZCAgICAgICAgIFtyMTEsIHIzXQorICAgIHZsZDEuOCAgICAgIHtxMX0sIFtyMTFdISAgICAgICAgICAgIEAgbG9hZCB7bGluZWFyX3NyY192KyhsaW5lYXJfeF9zaXplLzIpKjEyLCAzMn0KKyAgICB2bGQxLjggICAgICB7cTN9LCBbcjExXSwgcjEyCisgICAgcGxkICAgICAgICAgW3IxMSwgcjNdCisgICAgdmxkMS44ICAgICAge3E1fSwgW3IxMV0hICAgICAgICAgICAgQCBsb2FkIHtsaW5lYXJfc3JjX3YrKGxpbmVhcl94X3NpemUvMikqMTMsIDMyfQorICAgIHZsZDEuOCAgICAgIHtxN30sIFtyMTFdLCByMTIKKyAgICBwbGQgICAgICAgICBbcjhdCisgICAgdmxkMS44ICAgICAge3E5fSwgW3IxMV0hICAgICAgICAgICAgQCBsb2FkIHtsaW5lYXJfc3JjX3YrKGxpbmVhcl94X3NpemUvMikqMTQsIDMyfQorICAgIHZsZDEuOCAgICAgIHtxMTF9LCBbcjExXSwgcjEyCisgICAgcGxkICAgICAgICAgW3I4LCByMywgYXNyICMxXQorICAgIHZsZDEuOCAgICAgIHtxMTN9LCBbcjExXSEgICAgICAgICAgIEAgbG9hZCB7bGluZWFyX3NyY192KyhsaW5lYXJfeF9zaXplLzIpKjE1LCAzMn0KKyAgICB2bGQxLjggICAgICB7cTE1fSwgW3IxMV0sIHIxMgorICAgIHZzdDIuOCAgICAgIHtxMCwgcTF9LCBbcjddISAgICAgICAgIEAgc3RvcmUge3RpbGVkX2FkZHIrNjQqMTJ9CisgICAgdnN0Mi44ICAgICAge3EyLCBxM30sIFtyN10hCisgICAgdnN0Mi44ICAgICAge3E0LCBxNX0sIFtyN10hICAgICAgICAgQCBzdG9yZSB7dGlsZWRfYWRkcis2NCoxM30KKyAgICB2c3QyLjggICAgICB7cTYsIHE3fSwgW3I3XSEKKyAgICB2c3QyLjggICAgICB7cTgsIHE5fSwgW3I3XSEgICAgICAgICBAIHN0b3JlIHt0aWxlZF9hZGRyKzY0KjE0fQorICAgIHZzdDIuOCAgICAgIHtxMTAsIHExMX0sIFtyN10hCisgICAgdnN0Mi44ICAgICAge3ExMiwgcTEzfSwgW3I3XSEgICAgICAgQCBzdG9yZSB7dGlsZWRfYWRkcis2NCoxNX0KKyAgICB2c3QyLjggICAgICB7cTE0LCBxMTV9LCBbcjddIQorCisgICAgcGxkICAgICAgICAgW3I4LCByM10KKyAgICB2bGQxLjggICAgICB7cTB9LCBbcjhdISAgICAgICAgICAgICBAIGxvYWQge2xpbmVhcl9zcmNfdSsobGluZWFyX3hfc2l6ZS8yKSoxNiwgMzJ9CisgICAgdmxkMS44ICAgICAge3EyfSwgW3I4XSwgcjEyCisgICAgcGxkICAgICAgICAgW3I4LCByM10KKyAgICB2bGQxLjggICAgICB7cTR9LCBbcjhdISAgICAgICAgICAgICBAIGxvYWQge2xpbmVhcl9zcmNfdSsobGluZWFyX3hfc2l6ZS8yKSoxNywgMzJ9CisgICAgdmxkMS44ICAgICAge3E2fSwgW3I4XSwgcjEyCisgICAgcGxkICAgICAgICAgW3IxMV0KKyAgICB2bGQxLjggICAgICB7cTh9LCBbcjhdISAgICAgICAgICAgICBAIGxvYWQge2xpbmVhcl9zcmNfdSsobGluZWFyX3hfc2l6ZS8yKSoxOCwgMzJ9CisgICAgdmxkMS44ICAgICAge3ExMH0sIFtyOF0sIHIxMgorICAgIHBsZCAgICAgICAgIFtyMTEsIHIzLCBhc3IgIzFdCisgICAgdmxkMS44ICAgICAge3ExMn0sIFtyOF0hICAgICAgICAgICAgQCBsb2FkIHtsaW5lYXJfc3JjX3UrKGxpbmVhcl94X3NpemUvMikqMTksIDMyfQorICAgIHZsZDEuOCAgICAgIHtxMTR9LCBbcjhdLCByMTIKKyAgICBwbGQgICAgICAgICBbcjExLCByM10KKyAgICB2bGQxLjggICAgICB7cTF9LCBbcjExXSEgICAgICAgICAgICBAIGxvYWQge2xpbmVhcl9zcmNfdisobGluZWFyX3hfc2l6ZS8yKSoxNiwgMzJ9CisgICAgdmxkMS44ICAgICAge3EzfSwgW3IxMV0sIHIxMgorICAgIHBsZCAgICAgICAgIFtyMTEsIHIzXQorICAgIHZsZDEuOCAgICAgIHtxNX0sIFtyMTFdISAgICAgICAgICAgIEAgbG9hZCB7bGluZWFyX3NyY192KyhsaW5lYXJfeF9zaXplLzIpKjE3LCAzMn0KKyAgICB2bGQxLjggICAgICB7cTd9LCBbcjExXSwgcjEyCisgICAgcGxkICAgICAgICAgW3I4XQorICAgIHZsZDEuOCAgICAgIHtxOX0sIFtyMTFdISAgICAgICAgICAgIEAgbG9hZCB7bGluZWFyX3NyY192KyhsaW5lYXJfeF9zaXplLzIpKjE4LCAzMn0KKyAgICB2bGQxLjggICAgICB7cTExfSwgW3IxMV0sIHIxMgorICAgIHBsZCAgICAgICAgIFtyOCwgcjMsIGFzciAjMV0KKyAgICB2bGQxLjggICAgICB7cTEzfSwgW3IxMV0hICAgICAgICAgICBAIGxvYWQge2xpbmVhcl9zcmNfdisobGluZWFyX3hfc2l6ZS8yKSoxOSwgMzJ9CisgICAgdmxkMS44ICAgICAge3ExNX0sIFtyMTFdLCByMTIKKyAgICB2c3QyLjggICAgICB7cTAsIHExfSwgW3I3XSEgICAgICAgICBAIHN0b3JlIHt0aWxlZF9hZGRyKzY0KjE2fQorICAgIHZzdDIuOCAgICAgIHtxMiwgcTN9LCBbcjddIQorICAgIHZzdDIuOCAgICAgIHtxNCwgcTV9LCBbcjddISAgICAgICAgIEAgc3RvcmUge3RpbGVkX2FkZHIrNjQqMTd9CisgICAgdnN0Mi44ICAgICAge3E2LCBxN30sIFtyN10hCisgICAgdnN0Mi44ICAgICAge3E4LCBxOX0sIFtyN10hICAgICAgICAgQCBzdG9yZSB7dGlsZWRfYWRkcis2NCoxOH0KKyAgICB2c3QyLjggICAgICB7cTEwLCBxMTF9LCBbcjddIQorICAgIHZzdDIuOCAgICAgIHtxMTIsIHExM30sIFtyN10hICAgICAgIEAgc3RvcmUge3RpbGVkX2FkZHIrNjQqMTl9CisgICAgdnN0Mi44ICAgICAge3ExNCwgcTE1fSwgW3I3XSEKKworICAgIHBsZCAgICAgICAgIFtyOCwgcjNdCisgICAgdmxkMS44ICAgICAge3EwfSwgW3I4XSEgICAgICAgICAgICAgQCBsb2FkIHtsaW5lYXJfc3JjX3UrKGxpbmVhcl94X3NpemUvMikqMjAsIDMyfQorICAgIHZsZDEuOCAgICAgIHtxMn0sIFtyOF0sIHIxMgorICAgIHBsZCAgICAgICAgIFtyOCwgcjNdCisgICAgdmxkMS44ICAgICAge3E0fSwgW3I4XSEgICAgICAgICAgICAgQCBsb2FkIHtsaW5lYXJfc3JjX3UrKGxpbmVhcl94X3NpemUvMikqMjEsIDMyfQorICAgIHZsZDEuOCAgICAgIHtxNn0sIFtyOF0sIHIxMgorICAgIHBsZCAgICAgICAgIFtyMTFdCisgICAgdmxkMS44ICAgICAge3E4fSwgW3I4XSEgICAgICAgICAgICAgQCBsb2FkIHtsaW5lYXJfc3JjX3UrKGxpbmVhcl94X3NpemUvMikqMjIsIDMyfQorICAgIHZsZDEuOCAgICAgIHtxMTB9LCBbcjhdLCByMTIKKyAgICBwbGQgICAgICAgICBbcjExLCByMywgYXNyICMxXQorICAgIHZsZDEuOCAgICAgIHtxMTJ9LCBbcjhdISAgICAgICAgICAgIEAgbG9hZCB7bGluZWFyX3NyY191KyhsaW5lYXJfeF9zaXplLzIpKjIzLCAzMn0KKyAgICB2bGQxLjggICAgICB7cTE0fSwgW3I4XSwgcjEyCisgICAgcGxkICAgICAgICAgW3IxMSwgcjNdCisgICAgdmxkMS44ICAgICAge3ExfSwgW3IxMV0hICAgICAgICAgICAgQCBsb2FkIHtsaW5lYXJfc3JjX3YrKGxpbmVhcl94X3NpemUvMikqMjAsIDMyfQorICAgIHZsZDEuOCAgICAgIHtxM30sIFtyMTFdLCByMTIKKyAgICBwbGQgICAgICAgICBbcjExLCByM10KKyAgICB2bGQxLjggICAgICB7cTV9LCBbcjExXSEgICAgICAgICAgICBAIGxvYWQge2xpbmVhcl9zcmNfdisobGluZWFyX3hfc2l6ZS8yKSoyMSwgMzJ9CisgICAgdmxkMS44ICAgICAge3E3fSwgW3IxMV0sIHIxMgorICAgIHBsZCAgICAgICAgIFtyOF0KKyAgICB2bGQxLjggICAgICB7cTl9LCBbcjExXSEgICAgICAgICAgICBAIGxvYWQge2xpbmVhcl9zcmNfdisobGluZWFyX3hfc2l6ZS8yKSoyMiwgMzJ9CisgICAgdmxkMS44ICAgICAge3ExMX0sIFtyMTFdLCByMTIKKyAgICBwbGQgICAgICAgICBbcjgsIHIzLCBhc3IgIzFdCisgICAgdmxkMS44ICAgICAge3ExM30sIFtyMTFdISAgICAgICAgICAgQCBsb2FkIHtsaW5lYXJfc3JjX3YrKGxpbmVhcl94X3NpemUvMikqMjMsIDMyfQorICAgIHZsZDEuOCAgICAgIHtxMTV9LCBbcjExXSwgcjEyCisgICAgdnN0Mi44ICAgICAge3EwLCBxMX0sIFtyN10hICAgICAgICAgQCBzdG9yZSB7dGlsZWRfYWRkcis2NCoyMH0KKyAgICB2c3QyLjggICAgICB7cTIsIHEzfSwgW3I3XSEKKyAgICB2c3QyLjggICAgICB7cTQsIHE1fSwgW3I3XSEgICAgICAgICBAIHN0b3JlIHt0aWxlZF9hZGRyKzY0KjIxfQorICAgIHZzdDIuOCAgICAgIHtxNiwgcTd9LCBbcjddIQorICAgIHZzdDIuOCAgICAgIHtxOCwgcTl9LCBbcjddISAgICAgICAgIEAgc3RvcmUge3RpbGVkX2FkZHIrNjQqMjJ9CisgICAgdnN0Mi44ICAgICAge3ExMCwgcTExfSwgW3I3XSEKKyAgICB2c3QyLjggICAgICB7cTEyLCBxMTN9LCBbcjddISAgICAgICBAIHN0b3JlIHt0aWxlZF9hZGRyKzY0KjIzfQorICAgIHZzdDIuOCAgICAgIHtxMTQsIHExNX0sIFtyN10hCisKKyAgICBwbGQgICAgICAgICBbcjgsIHIzXQorICAgIHZsZDEuOCAgICAgIHtxMH0sIFtyOF0hICAgICAgICAgICAgIEAgbG9hZCB7bGluZWFyX3NyY191KyhsaW5lYXJfeF9zaXplLzIpKjI0LCAzMn0KKyAgICB2bGQxLjggICAgICB7cTJ9LCBbcjhdLCByMTIKKyAgICBwbGQgICAgICAgICBbcjgsIHIzXQorICAgIHZsZDEuOCAgICAgIHtxNH0sIFtyOF0hICAgICAgICAgICAgIEAgbG9hZCB7bGluZWFyX3NyY191KyhsaW5lYXJfeF9zaXplLzIpKjI1LCAzMn0KKyAgICB2bGQxLjggICAgICB7cTZ9LCBbcjhdLCByMTIKKyAgICBwbGQgICAgICAgICBbcjExXQorICAgIHZsZDEuOCAgICAgIHtxOH0sIFtyOF0hICAgICAgICAgICAgIEAgbG9hZCB7bGluZWFyX3NyY191KyhsaW5lYXJfeF9zaXplLzIpKjI2LCAzMn0KKyAgICB2bGQxLjggICAgICB7cTEwfSwgW3I4XSwgcjEyCisgICAgcGxkICAgICAgICAgW3IxMSwgcjMsIGFzciAjMV0KKyAgICB2bGQxLjggICAgICB7cTEyfSwgW3I4XSEgICAgICAgICAgICBAIGxvYWQge2xpbmVhcl9zcmNfdSsobGluZWFyX3hfc2l6ZS8yKSoyNywgMzJ9CisgICAgdmxkMS44ICAgICAge3ExNH0sIFtyOF0sIHIxMgorICAgIHBsZCAgICAgICAgIFtyMTEsIHIzXQorICAgIHZsZDEuOCAgICAgIHtxMX0sIFtyMTFdISAgICAgICAgICAgIEAgbG9hZCB7bGluZWFyX3NyY192KyhsaW5lYXJfeF9zaXplLzIpKjI0LCAzMn0KKyAgICB2bGQxLjggICAgICB7cTN9LCBbcjExXSwgcjEyCisgICAgcGxkICAgICAgICAgW3IxMSwgcjNdCisgICAgdmxkMS44ICAgICAge3E1fSwgW3IxMV0hICAgICAgICAgICAgQCBsb2FkIHtsaW5lYXJfc3JjX3YrKGxpbmVhcl94X3NpemUvMikqMjUsIDMyfQorICAgIHZsZDEuOCAgICAgIHtxN30sIFtyMTFdLCByMTIKKyAgICBwbGQgICAgICAgICBbcjhdCisgICAgdmxkMS44ICAgICAge3E5fSwgW3IxMV0hICAgICAgICAgICAgQCBsb2FkIHtsaW5lYXJfc3JjX3YrKGxpbmVhcl94X3NpemUvMikqMjYsIDMyfQorICAgIHZsZDEuOCAgICAgIHtxMTF9LCBbcjExXSwgcjEyCisgICAgcGxkICAgICAgICAgW3I4LCByMywgYXNyICMxXQorICAgIHZsZDEuOCAgICAgIHtxMTN9LCBbcjExXSEgICAgICAgICAgIEAgbG9hZCB7bGluZWFyX3NyY192KyhsaW5lYXJfeF9zaXplLzIpKjI3LCAzMn0KKyAgICB2bGQxLjggICAgICB7cTE1fSwgW3IxMV0sIHIxMgorICAgIHZzdDIuOCAgICAgIHtxMCwgcTF9LCBbcjddISAgICAgICAgIEAgc3RvcmUge3RpbGVkX2FkZHIrNjQqMjR9CisgICAgdnN0Mi44ICAgICAge3EyLCBxM30sIFtyN10hCisgICAgdnN0Mi44ICAgICAge3E0LCBxNX0sIFtyN10hICAgICAgICAgQCBzdG9yZSB7dGlsZWRfYWRkcis2NCoyNX0KKyAgICB2c3QyLjggICAgICB7cTYsIHE3fSwgW3I3XSEKKyAgICB2c3QyLjggICAgICB7cTgsIHE5fSwgW3I3XSEgICAgICAgICBAIHN0b3JlIHt0aWxlZF9hZGRyKzY0KjI2fQorICAgIHZzdDIuOCAgICAgIHtxMTAsIHExMX0sIFtyN10hCisgICAgdnN0Mi44ICAgICAge3ExMiwgcTEzfSwgW3I3XSEgICAgICAgQCBzdG9yZSB7dGlsZWRfYWRkcis2NCoyN30KKyAgICB2c3QyLjggICAgICB7cTE0LCBxMTV9LCBbcjddIQorCisgICAgcGxkICAgICAgICAgW3I4LCByM10KKyAgICB2bGQxLjggICAgICB7cTB9LCBbcjhdISAgICAgICAgICAgICBAIGxvYWQge2xpbmVhcl9zcmNfdSsobGluZWFyX3hfc2l6ZS8yKSoyOCwgMzJ9CisgICAgdmxkMS44ICAgICAge3EyfSwgW3I4XSwgcjEyCisgICAgcGxkICAgICAgICAgW3I4LCByM10KKyAgICB2bGQxLjggICAgICB7cTR9LCBbcjhdISAgICAgICAgICAgICBAIGxvYWQge2xpbmVhcl9zcmNfdSsobGluZWFyX3hfc2l6ZS8yKSoyOSwgMzJ9CisgICAgdmxkMS44ICAgICAge3E2fSwgW3I4XSwgcjEyCisgICAgcGxkICAgICAgICAgW3IxMV0KKyAgICB2bGQxLjggICAgICB7cTh9LCBbcjhdISAgICAgICAgICAgICBAIGxvYWQge2xpbmVhcl9zcmNfdSsobGluZWFyX3hfc2l6ZS8yKSozMCwgMzJ9CisgICAgdmxkMS44ICAgICAge3ExMH0sIFtyOF0sIHIxMgorICAgIHBsZCAgICAgICAgIFtyMTEsIHIzLCBhc3IgIzFdCisgICAgdmxkMS44ICAgICAge3ExMn0sIFtyOF0hICAgICAgICAgICAgQCBsb2FkIHtsaW5lYXJfc3JjX3UrKGxpbmVhcl94X3NpemUvMikqMzEsIDMyfQorICAgIHZsZDEuOCAgICAgIHtxMTR9LCBbcjhdLCByMTIKKyAgICBwbGQgICAgICAgICBbcjExLCByM10KKyAgICB2bGQxLjggICAgICB7cTF9LCBbcjExXSEgICAgICAgICAgICBAIGxvYWQge2xpbmVhcl9zcmNfdisobGluZWFyX3hfc2l6ZS8yKSoyOCwgMzJ9CisgICAgdmxkMS44ICAgICAge3EzfSwgW3IxMV0sIHIxMgorICAgIHBsZCAgICAgICAgIFtyMTEsIHIzXQorICAgIHZsZDEuOCAgICAgIHtxNX0sIFtyMTFdISAgICAgICAgICAgIEAgbG9hZCB7bGluZWFyX3NyY192KyhsaW5lYXJfeF9zaXplLzIpKjI5LCAzMn0KKyAgICB2bGQxLjggICAgICB7cTd9LCBbcjExXSwgcjEyCisgICAgdmxkMS44ICAgICAge3E5fSwgW3IxMV0hICAgICAgICAgICAgQCBsb2FkIHtsaW5lYXJfc3JjX3YrKGxpbmVhcl94X3NpemUvMikqMzAsIDMyfQorICAgIHZsZDEuOCAgICAgIHtxMTF9LCBbcjExXSwgcjEyCisgICAgdmxkMS44ICAgICAge3ExM30sIFtyMTFdISAgICAgICAgICAgQCBsb2FkIHtsaW5lYXJfc3JjX3YrKGxpbmVhcl94X3NpemUvMikqMzEsIDMyfQorICAgIHZsZDEuOCAgICAgIHtxMTV9LCBbcjExXSwgcjEyCisgICAgdnN0Mi44ICAgICAge3EwLCBxMX0sIFtyN10hICAgICAgICAgQCBzdG9yZSB7dGlsZWRfYWRkcis2NCoyOH0KKyAgICB2c3QyLjggICAgICB7cTIsIHEzfSwgW3I3XSEKKyAgICB2c3QyLjggICAgICB7cTQsIHE1fSwgW3I3XSEgICAgICAgICBAIHN0b3JlIHt0aWxlZF9hZGRyKzY0KjI5fQorICAgIHZzdDIuOCAgICAgIHtxNiwgcTd9LCBbcjddIQorICAgIHZzdDIuOCAgICAgIHtxOCwgcTl9LCBbcjddISAgICAgICAgIEAgc3RvcmUge3RpbGVkX2FkZHIrNjQqMzB9CisgICAgdnN0Mi44ICAgICAge3ExMCwgcTExfSwgW3I3XSEKKyAgICB2c3QyLjggICAgICB7cTEyLCBxMTN9LCBbcjddISAgICAgICBAIHN0b3JlIHt0aWxlZF9hZGRyKzY0KjMxfQorICAgIHZzdDIuOCAgICAgIHtxMTQsIHExNX0sIFtyN10hCisKKyAgICBhZGQgICAgICAgICByNSwgcjUsICM2NCAgICAgICAgICAgICBAIGogPSBqKzY0CisgICAgY21wICAgICAgICAgcjUsIHI5ICAgICAgICAgICAgICAgICAgQCBqPGFsaWduZWRfeF9zaXplCisgICAgYmx0ICAgICAgICAgTE9PUF9BTElHTkVEX1hfU0laRQorCisgICAgYWRkICAgICAgICAgcjYsIHI2LCAjMzIgICAgICAgICAgICAgQCBpID0gaSszMgorICAgIGNtcCAgICAgICAgIHI2LCByMTAgICAgICAgICAgICAgICAgIEAgaTxhbGlnbmVkX3lfc2l6ZQorICAgIGJsdCAgICAgICAgIExPT1BfQUxJR05FRF9ZX1NJWkUKKworICAgIGNtcCAgICAgICAgIHI2LCByNAorICAgIGJlcSAgICAgICAgIExPT1BfTElORUFSX1lfU0laRV8yX1NUQVJUCisKK0xPT1BfTElORUFSX1lfU0laRV8xOgorCisgICAgbW92ICAgICAgICAgcjUsICMwICAgICAgICAgICAgICAgICAgQCBqID0gMAorTE9PUF9BTElHTkVEX1hfU0laRV8xOgorCisgICAgYmwgICAgICAgICAgR0VUX1RJTEVEX09GRlNFVAorCisgICAgbGRyICAgICAgICAgcjEyLCBbc3AsICM0OF0gICAgICAgICAgQCByMTIgPSB0b3AKKyAgICBsZHIgICAgICAgICByOCwgW3NwLCAjNDRdICAgICAgICAgICBAIHI4ID0gbGVmdAorCisgICAgbW92ICAgICAgICAgcjExLCByMywgYXNyICMxICAgICAgICAgQCB0ZW1wMSA9ICh5dXY0MjBfd2lkdGgvMikqKGkrdG9wKQorICAgIGFkZCAgICAgICAgIHIxMiwgcjYsIHIxMgorICAgIG11bCAgICAgICAgIHIxMSwgcjExLCByMTIKKyAgICBhZGQgICAgICAgICByMTEsIHIxMSwgcjUsIGFzciAjMSAgICBAIHRlbXAxID0gdGVtcDErai8yCisgICAgYWRkICAgICAgICAgcjExLCByMTEsIHI4LCBhc3IgIzEgICAgQCB0ZW1wMSA9IHRlbXAxK2xlZnQvMgorCisgICAgYWRkICAgICAgICAgcjgsIHIxLCByMTEgICAgICAgICAgICAgQCBsaW5lYXJfYWRkciA9IGxpbmVhcl9zcmNfdSt0ZW1wMQorICAgIGFkZCAgICAgICAgIHIxMSwgcjIsIHIxMSAgICAgICAgICAgIEAgdGVtcDEgPSBsaW5lYXJfc3JjX3YrdGVtcDEKKyAgICBhZGQgICAgICAgICByNywgcjAsIHI3ICAgICAgICAgICAgICBAIHRpbGVkX2FkZHIgPSB0aWxlZF9kZXN0K3RpbGVkX2FkZHIKKyAgICBhbmQgICAgICAgICByMTQsIHI2LCAjMHgxRiAgICAgICAgICBAIHRlbXAzID0gaSYweDFGQAorICAgIG1vdiAgICAgICAgIHIxNCwgcjE0LCBsc2wgIzYgICAgICAgIEAgdGVtcDMgPSB0ZW1wMyo2NAorICAgIGFkZCAgICAgICAgIHI3LCByNywgcjE0ICAgICAgICAgICAgIEAgdGlsZWRfYWRkciA9IHRpbGVkX2FkZHIrdGVtcDMKKworICAgIHZsZDEuOCAgICAgIHtxMH0sIFtyOF0hICAgICAgICAgICAgIEAgbG9hZCB7bGluZWFyX3NyY191LCAzMn0KKyAgICB2bGQxLjggICAgICB7cTJ9LCBbcjhdCisgICAgdmxkMS44ICAgICAge3ExfSwgW3IxMV0hICAgICAgICAgICAgQCBsb2FkIHtsaW5lYXJfc3JjX3YsIDMyfQorICAgIHZsZDEuOCAgICAgIHtxM30sIFtyMTFdCisgICAgdnN0Mi44ICAgICAge3EwLCBxMX0sIFtyN10hICAgICAgICAgQCBzdG9yZSB7dGlsZWRfYWRkcn0KKyAgICB2c3QyLjggICAgICB7cTIsIHEzfSwgW3I3XSEKKworICAgIGFkZCAgICAgICAgIHI1LCByNSwgIzY0ICAgICAgICAgICAgIEAgaiA9IGorNjQKKyAgICBjbXAgICAgICAgICByNSwgcjkgICAgICAgICAgICAgICAgICBAIGo8YWxpZ25lZF94X3NpemUKKyAgICBibHQgICAgICAgICBMT09QX0FMSUdORURfWF9TSVpFXzEKKworICAgIGxkciAgICAgICAgIHIxMiwgW3NwLCAjNDhdICAgICAgICAgIEAgcjEyID0gdG9wCisgICAgbGRyICAgICAgICAgcjgsIFtzcCwgIzU2XSAgICAgICAgICAgQCByOCA9IGJ1dHRvbQorICAgIGFkZCAgICAgICAgIHI2LCByNiwgIzEgICAgICAgICAgICAgIEAgaSA9IGkrMQorICAgIHN1YiAgICAgICAgIHIxMiwgcjQsIHIxMgorICAgIHN1YiAgICAgICAgIHIxMiwgcjEyLCByOAorICAgIGNtcCAgICAgICAgIHI2LCByMTIgICAgICAgICAgICAgICAgIEAgaTwoeXV2NDIwX2hlaWdodC10b3AtYnV0dG9tKQorICAgIGJsdCAgICAgICAgIExPT1BfTElORUFSX1lfU0laRV8xCisKK0xPT1BfTElORUFSX1lfU0laRV8yX1NUQVJUOgorICAgIGNtcCAgICAgICAgIHI1LCByMworICAgIGJlcSAgICAgICAgIFJFU1RPUkVfUkVHCisKKyAgICBtb3YgICAgICAgICByNiwgIzAgICAgICAgICAgICAgICAgICBAIGkgPSAwCitMT09QX0xJTkVBUl9ZX1NJWkVfMjoKKworICAgIG1vdiAgICAgICAgIHI1LCByOSAgICAgICAgICAgICAgICAgIEAgaiA9IGFsaWduZWRfeF9zaXplCitMT09QX0xJTkVBUl9YX1NJWkVfMjoKKworICAgIGJsICAgICAgICAgIEdFVF9USUxFRF9PRkZTRVQKKworICAgIGxkciAgICAgICAgIHIxMiwgW3NwLCAjNDhdICAgICAgICAgIEAgcjEyID0gdG9wCisgICAgbGRyICAgICAgICAgcjgsIFtzcCwgIzQ0XSAgICAgICAgICAgQCByOCA9IGxlZnQKKworICAgIG1vdiAgICAgICAgIHIxMSwgcjMsIGFzciAjMSAgICAgICAgIEAgdGVtcDEgPSAoeXV2NDIwX3dpZHRoLzIpKihpK3RvcCkKKyAgICBhZGQgICAgICAgICByMTIsIHI2LCByMTIKKyAgICBtdWwgICAgICAgICByMTEsIHIxMSwgcjEyCisgICAgYWRkICAgICAgICAgcjExLCByMTEsIHI1LCBhc3IgIzEgICAgQCB0ZW1wMSA9IHRlbXAxK2ovMgorICAgIGFkZCAgICAgICAgIHIxMSwgcjExLCByOCwgYXNyICMxICAgIEAgdGVtcDEgPSB0ZW1wMStsZWZ0LzIKKworICAgIG1vdiAgICAgICAgIHIxMiwgcjMsIGFzciAjMSAgICAgICAgIEAgdGVtcDIgPSBsaW5lYXJfeF9zaXplLzIKKyAgICBzdWIgICAgICAgICByMTIsIHIxMiwgIzEgICAgICAgICAgICBAIHRlbXAyID0gbGluZWFyX3hfc2l6ZS0xCisKKyAgICBhZGQgICAgICAgICByOCwgcjEsIHIxMSAgICAgICAgICAgICBAIGxpbmVhcl9hZGRyID0gbGluZWFyX3NyY191K3RlbXAxCisgICAgYWRkICAgICAgICAgcjExLCByMiwgcjExICAgICAgICAgICAgQCB0ZW1wMSA9IGxpbmVhcl9zcmNfdit0ZW1wMQorICAgIGFkZCAgICAgICAgIHI3LCByMCwgcjcgICAgICAgICAgICAgIEAgdGlsZWRfYWRkciA9IHRpbGVkX2Rlc3QrdGlsZWRfYWRkcgorICAgIGFuZCAgICAgICAgIHIxNCwgcjYsICMweDFGICAgICAgICAgIEAgdGVtcDMgPSBpJjB4MUZACisgICAgbW92ICAgICAgICAgcjE0LCByMTQsIGxzbCAjNiAgICAgICAgQCB0ZW1wMyA9IHRlbXAzKjY0CisgICAgYWRkICAgICAgICAgcjcsIHI3LCByMTQgICAgICAgICAgICAgQCB0aWxlZF9hZGRyID0gdGlsZWRfYWRkcit0ZW1wMworICAgIGFuZCAgICAgICAgIHIxNCwgcjUsICMweDNGICAgICAgICAgIEAgdGVtcDMgPSBqJjB4M0YKKyAgICBhZGQgICAgICAgICByNywgcjcsIHIxNCAgICAgICAgICAgICBAIHRpbGVkX2FkZHIgPSB0aWxlZF9hZGRyK3RlbXAzCisKKyAgICBsZHJiICAgICAgICByMTAsIFtyOF0sICMxCisgICAgbGRyYiAgICAgICAgcjE0LCBbcjExXSwgIzEKKyAgICBtb3YgICAgICAgICByMTQsIHIxNCwgbHNsICM4CisgICAgb3JyICAgICAgICAgcjEwLCByMTAsIHIxNAorICAgIHN0cmggICAgICAgIHIxMCwgW3I3XSwgIzIKKworICAgIGxkciAgICAgICAgIHIxMiwgW3NwLCAjNDRdICAgICAgICAgIEAgcjEyID0gbGVmdAorICAgIGxkciAgICAgICAgIHI4LCBbc3AsICM1Ml0gICAgICAgICAgIEAgcjggPSByaWdodAorICAgIGFkZCAgICAgICAgIHI1LCByNSwgIzIgICAgICAgICAgICAgIEAgaiA9IGorMgorICAgIHN1YiAgICAgICAgIHIxMiwgcjMsIHIxMgorICAgIHN1YiAgICAgICAgIHIxMiwgcjEyLCByOAorICAgIGNtcCAgICAgICAgIHI1LCByMTIgICAgICAgICAgICAgICAgIEAgajwoeXV2NDIwX3dpZHRoLWxlZnQtcmlnaHQpCisgICAgYmx0ICAgICAgICAgTE9PUF9MSU5FQVJfWF9TSVpFXzIKKworICAgIGxkciAgICAgICAgIHIxMiwgW3NwLCAjNDhdICAgICAgICAgIEAgcjEyID0gdG9wCisgICAgbGRyICAgICAgICAgcjgsIFtzcCwgIzU2XSAgICAgICAgICAgQCByOCA9IGJ1dHRvbQorICAgIGFkZCAgICAgICAgIHI2LCByNiwgIzEgICAgICAgICAgICAgIEAgaSA9IGkrMQorICAgIHN1YiAgICAgICAgIHIxMiwgcjQsIHIxMgorICAgIHN1YiAgICAgICAgIHIxMiwgcjEyLCByOAorICAgIGNtcCAgICAgICAgIHI2LCByMTIgICAgICAgICAgICAgICAgIEAgaTwoeXV2NDIwX2hlaWdodC10b3AtYnV0dG9tKQorICAgIGJsdCAgICAgICAgIExPT1BfTElORUFSX1lfU0laRV8yCisKK1JFU1RPUkVfUkVHOgorICAgIGxkbWZkICAgICAgIHNwISwge3I0LXIxMixyMTV9ICAgICAgIEAgcmVzdG9yZSByZWdpc3RlcnMKKworR0VUX1RJTEVEX09GRlNFVDoKKyAgICBzdG1mZCAgICAgICBzcCEsIHtyMTR9CisKKyAgICBtb3YgICAgICAgICByMTIsIHI2LCBhc3IgIzUgICAgICAgICBAIHRlbXAyID0gaT4+NQorICAgIG1vdiAgICAgICAgIHIxMSwgcjUsIGFzciAjNiAgICAgICAgIEAgdGVtcDEgPSBqPj42CisKKyAgICBhbmQgICAgICAgICByMTQsIHIxMiwgIzB4MSAgICAgICAgICBAIGlmICh0ZW1wMiAmIDB4MSkKKyAgICBjbXAgICAgICAgICByMTQsICMweDEKKyAgICBibmUgICAgICAgICBHRVRfVElMRURfT0ZGU0VUX0VWRU5fRk9STVVMQV8xCisKK0dFVF9USUxFRF9PRkZTRVRfT0REX0ZPUk1VTEE6CisKKyAgICBsZHIgICAgICAgICByNywgW3NwLCAjNDhdICAgICAgICAgICBAIHI3ID0gbGVmdCAsIChyMTQgd2FzIHB1c2hlZCB0byBzdGFjaykKKyAgICBsZHIgICAgICAgICByOCwgW3NwLCAjNTZdICAgICAgICAgICBAIHI4ID0gcmlnaHQgLCAocjE0IHdhcyBwdXNoZWQgdG8gc3RhY2spCisgICAgc3ViICAgICAgICAgcjE0LCByMywgcjcKKyAgICBzdWIgICAgICAgICByMTQsIHIxNCwgcjgKKyAgICBhZGQgICAgICAgICByMTQsIHIxNCwgIzEyNyAgICAgICAgICBAIHRlbXAzID0gKCgoeXV2NDIwX3dpZHRoLWxlZnQtcmlnaHQpKzEyNyk+PjcpPDw3CisgICAgYmljICAgICAgICAgcjE0LCByMTQsICMweDdGICAgICAgICAgQCB0ZW1wMyA9ICh0ZW1wMyA+PjcpPDw3CisgICAgbW92ICAgICAgICAgcjE0LCByMTQsIGFzciAjNiAgICAgICAgQCB0ZW1wMyA9IHRlbXAzPj42CisgICAgc3ViICAgICAgICAgcjcsIHIxMiwgIzEgICAgICAgICAgICAgQCB0aWxlZF9hZGRyID0gdGVtcDItMQorICAgIG11bCAgICAgICAgIHI3LCByNywgcjE0ICAgICAgICAgICAgIEAgdGlsZWRfYWRkciA9IHRpbGVkX2FkZHIqdGVtcDMKKyAgICBhZGQgICAgICAgICByNywgcjcsIHIxMSAgICAgICAgICAgICBAIHRpbGVkX2FkZHIgPSB0aWxlZF9hZGRyK3RlbXAxCisgICAgYWRkICAgICAgICAgcjcsIHI3LCAjMiAgICAgICAgICAgICAgQCB0aWxlZF9hZGRyID0gdGlsZWRfYWRkcisyCisgICAgYmljICAgICAgICAgcjE0LCByMTEsICMweDMgICAgICAgICAgQCB0ZW1wMyA9ICh0ZW1wMT4+Mik8PDIKKyAgICBhZGQgICAgICAgICByNywgcjcsIHIxNCAgICAgICAgICAgICBAIHRpbGVkX2FkZHIgPSB0aWxlZF9hZGRyK3RlbXAzCisgICAgbW92ICAgICAgICAgcjcsIHI3LCBsc2wgIzExICAgICAgICAgQCB0aWxlZF9hZGRyID0gdGlsZWRfYWRkcjw8MTEKKyAgICBiICAgICAgICAgICBHRVRfVElMRURfT0ZGU0VUX1JFVFVSTgorCitHRVRfVElMRURfT0ZGU0VUX0VWRU5fRk9STVVMQV8xOgorICAgIGxkciAgICAgICAgIHI3LCBbc3AsICM1Ml0gICAgICAgICAgIEAgcjcgPSB0b3AsIChyMTQgd2FzIHB1c2hlZCB0byBzdGFjaykKKyAgICBsZHIgICAgICAgICByOCwgW3NwLCAjNjBdICAgICAgICAgICBAIHI4ID0gYnV0dG9tLCAocjE0IHdhcyBwdXNoZWQgdG8gc3RhY2spCisgICAgc3ViICAgICAgICAgcjE0LCByNCwgcjcKKyAgICBzdWIgICAgICAgICByMTQsIHIxNCwgcjgKKyAgICBhZGQgICAgICAgICByMTQsIHIxNCwgIzMxICAgICAgICAgICBAIHRlbXAzID0gKCgoeXV2NDIwX2hlaWdodC10b3AtYnV0dG9tKSszMSk+PjUpPDw1CisgICAgYmljICAgICAgICAgcjE0LCByMTQsICMweDFGICAgICAgICAgQCB0ZW1wMyA9ICh0ZW1wMz4+NSk8PDUKKyAgICBzdWIgICAgICAgICByMTQsIHIxNCwgIzMyICAgICAgICAgICBAIHRlbXAzID0gdGVtcDMgLSAzMgorICAgIGNtcCAgICAgICAgIHI2LCByMTQgICAgICAgICAgICAgICAgIEAgaWYgKGk8KHRlbXAzLTMyKSkgeworICAgIGJnZSAgICAgICAgIEdFVF9USUxFRF9PRkZTRVRfRVZFTl9GT1JNVUxBXzIKKyAgICBhZGQgICAgICAgICByMTQsIHIxMSwgIzIgICAgICAgICAgICBAIHRlbXAzID0gdGVtcDErMgorICAgIGJpYyAgICAgICAgIHIxNCwgcjE0LCAjMyAgICAgICAgICAgIEAgdGVtcDMgPSAodGVtcDM+PjIpPDwyCisgICAgYWRkICAgICAgICAgcjcsIHIxMSwgcjE0ICAgICAgICAgICAgQCB0aWxlZF9hZGRyID0gdGVtcDErdGVtcDMKKyAgICBsZHIgICAgICAgICByOCwgW3NwLCAjNDhdICAgICAgICAgICBAIHI4ID0gbGVmdCwgKHIxNCB3YXMgcHVzaGVkIHRvIHN0YWNrKQorICAgIHN1YiAgICAgICAgIHIxNCwgcjMsIHI4CisgICAgbGRyICAgICAgICAgcjgsIFtzcCwgIzU2XSAgICAgICAgICAgQCByOCA9IHJpZ2h0LCAocjE0IHdhcyBwdXNoZWQgdG8gc3RhY2spCisgICAgc3ViICAgICAgICAgcjE0LCByMTQsIHI4CisgICAgYWRkICAgICAgICAgcjE0LCByMTQsICMxMjcgICAgICAgICAgQCB0ZW1wMyA9ICgoKHl1djQyMF93aWR0aC1sZWZ0LXJpZ2h0KSsxMjcpPj43KTw8NworICAgIGJpYyAgICAgICAgIHIxNCwgcjE0LCAjMHg3RiAgICAgICAgIEAgdGVtcDMgPSAodGVtcDM+PjcpPDw3CisgICAgbW92ICAgICAgICAgcjE0LCByMTQsIGFzciAjNiAgICAgICAgQCB0ZW1wMyA9IHRlbXAzPj42CisgICAgbXVsICAgICAgICAgcjEyLCByMTIsIHIxNCAgICAgICAgICAgQCB0aWxlZF95X2luZGV4ID0gdGlsZWRfeV9pbmRleCp0ZW1wMworICAgIGFkZCAgICAgICAgIHI3LCByNywgcjEyICAgICAgICAgICAgIEAgdGlsZWRfYWRkciA9IHRpbGVkX2FkZHIrdGlsZWRfeV9pbmRleAorICAgIG1vdiAgICAgICAgIHI3LCByNywgbHNsICMxMSAgICAgICAgIEAKKyAgICBiICAgICAgICAgICBHRVRfVElMRURfT0ZGU0VUX1JFVFVSTgorCitHRVRfVElMRURfT0ZGU0VUX0VWRU5fRk9STVVMQV8yOgorICAgIGxkciAgICAgICAgIHI4LCBbc3AsICM0OF0gICAgICAgICAgIEAgcjggPSBsZWZ0LCAocjE0IHdhcyBwdXNoZWQgdG8gc3RhY2spCisgICAgc3ViICAgICAgICAgcjE0LCByMywgcjgKKyAgICBsZHIgICAgICAgICByOCwgW3NwLCAjNTZdICAgICAgICAgICBAIHI4ID0gcmlnaHQsIChyMTQgd2FzIHB1c2hlZCB0byBzdGFjaykKKyAgICBzdWIgICAgICAgICByMTQsIHIxNCwgcjgKKyAgICBhZGQgICAgICAgICByMTQsIHIxNCwgIzEyNyAgICAgICAgICBAIHRlbXAzID0gKCgoeXV2NDIwX3dpZHRoLWxlZnQtcmlnaHQpKzEyNyk+PjcpPDw3CisgICAgYmljICAgICAgICAgcjE0LCByMTQsICMweDdGICAgICAgICAgQCB0ZW1wMyA9ICh0ZW1wMz4+Nyk8PDcKKyAgICBtb3YgICAgICAgICByMTQsIHIxNCwgYXNyICM2ICAgICAgICBAIHRlbXAzID0gdGVtcDM+PjYKKyAgICBtdWwgICAgICAgICByNywgcjEyLCByMTQgICAgICAgICAgICBAIHRpbGVkX2FkZHIgPSB0ZW1wMip0ZW1wMworICAgIGFkZCAgICAgICAgIHI3LCByNywgcjExICAgICAgICAgICAgIEAgdGlsZWRfYWRkciA9IHRpbGVkX2FkZHIrdGVtcDMKKyAgICBtb3YgICAgICAgICByNywgcjcsIGxzbCAjMTEgICAgICAgICBAIHRpbGVkX2FkZHIgPSB0aWxlZF9hZGRyPDwxMUAKKworR0VUX1RJTEVEX09GRlNFVF9SRVRVUk46CisgICAgbGRtZmQgICAgICAgc3AhLCB7cjE1fSAgICAgICAgICAgICAgQCByZXN0b3JlIHJlZ2lzdGVycworCisgICAgLmZuZW5kCisKZGlmZiAtLWdpdCBhL2V4eW5vczQvaGFsL2xpYnN3Y29udmVydGVyL2NzY190aWxlZF90b19saW5lYXJfY3JvcF9uZW9uLnMgYi9leHlub3M0L2hhbC9saWJzd2NvbnZlcnRlci9jc2NfdGlsZWRfdG9fbGluZWFyX2Nyb3BfbmVvbi5zCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjljYjgxYjUKLS0tIC9kZXYvbnVsbAorKysgYi9leHlub3M0L2hhbC9saWJzd2NvbnZlcnRlci9jc2NfdGlsZWRfdG9fbGluZWFyX2Nyb3BfbmVvbi5zCkBAIC0wLDAgKzEsNzAxIEBACisvKgorICoKKyAqIENvcHlyaWdodCAyMDEyIFNhbXN1bmcgRWxlY3Ryb25pY3MgUy5MU0kgQ28uIExURAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpCisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKy8qCisgKiBAZmlsZSAgICBjc2NfdGlsZWRfdG9fbGluZWFyX2Nyb3BfbmVvbi5zCisgKiBAYnJpZWYgICBTRUNfT01YIHNwZWNpZmljIGRlZmluZQorICogQGF1dGhvciAgU2hpbldvbiBMZWUgKHNoaW53b24ubGVlQHNhbXN1bmcuY29tKQorICogQHZlcnNpb24gMS4wCisgKiBAaGlzdG9yeQorICogICAyMDEyLjAyLjAxIDogQ3JlYXRlCisgKi8KKworLyoKKyAqIENvbnZlcnRzIHRpbGVkIGRhdGEgdG8gbGluZWFyCisgKiBDcm9wcyBsZWZ0LCB0b3AsIHJpZ2h0LCBidXR0b20KKyAqIDEuIFkgb2YgTlYxMlQgdG8gWSBvZiBZVVY0MjBQCisgKiAyLiBZIG9mIE5WMTJUIHRvIFkgb2YgWVVWNDIwUworICogMy4gVVYgb2YgTlYxMlQgdG8gVVYgb2YgWVVWNDIwUworICoKKyAqIEBwYXJhbSB5dXY0MjBfZGVzdAorICogICBZIG9yIFVWIHBsYW5lIGFkZHJlc3Mgb2YgWVVWNDIwW291dF0KKyAqCisgKiBAcGFyYW0gbnYxMnRfc3JjCisgKiAgIFkgb3IgVVYgcGxhbmUgYWRkcmVzcyBvZiBOVjEyVFtpbl0KKyAqCisgKiBAcGFyYW0geXV2NDIwX3dpZHRoCisgKiAgIFdpZHRoIG9mIFlVVjQyMFtpbl0KKyAqCisgKiBAcGFyYW0geXV2NDIwX2hlaWdodAorICogICBZOiBIZWlnaHQgb2YgWVVWNDIwLCBVVjogSGVpZ2h0LzIgb2YgWVVWNDIwW2luXQorICoKKyAqIEBwYXJhbSBsZWZ0CisgKiAgIENyb3Agc2l6ZSBvZiBsZWZ0LiBJdCBzaG91bGQgYmUgZXZlbi4KKyAqCisgKiBAcGFyYW0gdG9wCisgKiAgIENyb3Agc2l6ZSBvZiB0b3AuIEl0IHNob3VsZCBiZSBldmVuLgorICoKKyAqIEBwYXJhbSByaWdodAorICogICBDcm9wIHNpemUgb2YgcmlnaHQuIEl0IHNob3VsZCBiZSBldmVuLgorICoKKyAqIEBwYXJhbSBidXR0b20KKyAqICAgQ3JvcCBzaXplIG9mIGJ1dHRvbS4gSXQgc2hvdWxkIGJlIGV2ZW4uCisgKi8KKworICAgIC5hcmNoIGFybXY3LWEKKyAgICAudGV4dAorICAgIC5nbG9iYWwgY3NjX3RpbGVkX3RvX2xpbmVhcl9jcm9wX25lb24KKyAgICAudHlwZSAgIGNzY190aWxlZF90b19saW5lYXJfY3JvcF9uZW9uLCAlZnVuY3Rpb24KK2NzY190aWxlZF90b19saW5lYXJfY3JvcF9uZW9uOgorICAgIC5mbnN0YXJ0CisKKyAgICBAcjAgICAgIHl1djQyMF9kZXN0CisgICAgQHIxICAgICBudjEydF9zcmMKKyAgICBAcjIgICAgIHl1djQyMF93aWR0aAorICAgIEByMyAgICAgeXV2NDIwX2hlaWdodAorCUByNAorICAgIEByNSAgICAgaQorICAgIEByNiAgICAgagorICAgIEByNyAgICAgdGlsZWRfb2Zmc2V0CisgICAgQHI4ICAgICB0aWxlZF9vZmZzZXQxCisgICAgQHI5ICAgICBsaW5lYXJfb2Zmc2V0CisgICAgQHIxMCAgICB0ZW1wMQorICAgIEByMTEgICAgdGVtcDIKKyAgICBAcjEyICAgIHRlbXAzCisgICAgQHIxNCAgICB0ZW1wNAorCisgICAgc3RtZmQgICAgICAgc3AhLCB7cjQtcjEyLHIxNH0gICAgICAgQCBiYWNrdXAgcmVnaXN0ZXJzCisKKyAgICBsZHIgICAgICAgICByMTIsIFtzcCwgIzQ4XSAgICAgICAgICBAIHIxMiA9IHJpZ2h0CisgICAgbGRyICAgICAgICAgcjEwLCBbc3AsICM0MF0gICAgICAgICAgQCByMTAgPSBsZWZ0CisgICAgc3ViICAgICAgICAgcjEyLCByMiwgcjEyICAgICAgICAgICAgQCB0ZW1wMyA9IHl1djQyMF93aWR0aC1yaWdodEAKKyAgICBzdWIgICAgICAgICByMTAsIHIxMiwgcjEwICAgICAgICAgICBAIHRlbXAxID0gdGVtcDMtbGVmdEAKKyAgICBjbXAgICAgICAgICByMTAsICMyNTYgICAgICAgICAgICAgICBAIGlmICh0ZW1wMSA+PSAyNTYpCisgICAgYmx0ICAgICAgICAgTE9PUF9IRUlHSFRfNjRfU1RBUlQKKworICAgIGxkciAgICAgICAgIHI1LCBbc3AsICM0NF0gICAgICAgICAgIEAgaSA9IHRvcAorTE9PUF9IRUlHSFRfMjU2OgorICAgIGxkciAgICAgICAgIHI2LCBbc3AsICM0MF0gICAgICAgICAgIEAgaiA9IGxlZnQKKyAgICBtb3YgICAgICAgICByMTQsIHI1LCBhc3IgIzUgICAgICAgICBAIHRlbXA0ID0gaT4+NQorICAgIGJpYyAgICAgICAgIHIxMiwgcjYsICMweEZGICAgICAgICAgIEAgdGVtcDMgPSAoaj4+OCk8PDgKKyAgICBtb3YgICAgICAgICByMTIsIHIxMiwgYXNyICM2ICAgICAgICBAIHRlbXAzID0gdGVtcDM+PjYKKyAgICBhbmQgICAgICAgICByMTEsIHIxNCwgIzB4MSAgICAgICAgICBAIGlmICh0ZW1wNCAmIDB4MSkKKyAgICBjbXAgICAgICAgICByMTEsICMweDEKKyAgICBibmUgICAgICAgICBMT09QX0hFSUdIVF8yNTZfR0VUX1RJTEVEX0VWRU4KK0xPT1BfSEVJR0hUXzI1Nl9HRVRfVElMRURfT0REOgorICAgIHN1YiAgICAgICAgIHI3LCByMTQsICMxICAgICAgICAgICAgIEAgdGlsZWRfb2Zmc2V0ID0gdGVtcDQtMQorICAgIGFkZCAgICAgICAgIHIxMCwgcjIsICMxMjcgICAgICAgICAgIEAgdGVtcDEgPSAoKHl1djQyMF93aWR0aCsxMjcpPj43KTw8NworICAgIGJpYyAgICAgICAgIHIxMCwgcjEwLCAjMHg3RgorICAgIG1vdiAgICAgICAgIHIxMCwgcjEwLCBhc3IgIzYgICAgICAgIEAgdGlsZWRfb2Zmc2V0ID0gdGlsZWRfb2Zmc2V0Kih0ZW1wMT4+NikKKyAgICBtdWwgICAgICAgICByNywgcjcsIHIxMAorICAgIGFkZCAgICAgICAgIHI3LCByNywgcjEyICAgICAgICAgICAgIEAgdGlsZWRfb2Zmc2V0ID0gdGlsZWRfb2Zmc2V0K3RlbXAzCisgICAgYWRkICAgICAgICAgcjcsIHI3LCAjMiAgICAgICAgICAgICAgQCB0aWxlZF9vZmZzZXQgPSB0aWxlZF9vZmZzZXQrMgorICAgIGJpYyAgICAgICAgIHIxMCwgcjEyLCAjMHgzICAgICAgICAgIEAgdGVtcDEgPSAodGVtcDM+PjIpPDwyCisgICAgYWRkICAgICAgICAgcjcsIHI3LCByMTAgICAgICAgICAgICAgQCB0aWxlZF9vZmZzZXQgPSB0aWxlZF9vZmZzZXQrdGVtcDEKKyAgICBtb3YgICAgICAgICByNywgcjcsIGxzbCAjMTEgICAgICAgICBAIHRpbGVkX29mZnNldCA9IHRpbGVkX29mZnNldDw8MTEKKyAgICBhZGQgICAgICAgICByOCwgcjcsICM0MDk2ICAgICAgICAgICBAIHRpbGVkX29mZnNldDEgPSB0aWxlZF9vZmZzZXQrMjA0OCoyCisgICAgbW92ICAgICAgICAgcjE0LCAjOAorICAgIGIgICAgICAgICAgIExPT1BfSEVJR0hUXzI1Nl9HRVRfVElMRURfRU5ECisKK0xPT1BfSEVJR0hUXzI1Nl9HRVRfVElMRURfRVZFTjoKKyAgICBhZGQgICAgICAgICByMTEsIHIzLCAjMzEgICAgICAgICAgICBAIHRlbXAyID0gKCh5dXY0MjBfaGVpZ2h0KzMxKT4+NSk8PDUKKyAgICBiaWMgICAgICAgICByMTEsIHIxMSwgIzB4MUYKKyAgICBhZGQgICAgICAgICByMTAsIHI1LCAjMzIgICAgICAgICAgICBAIGlmICgoaSszMik8dGVtcDIpCisgICAgY21wICAgICAgICAgcjEwLCByMTEKKyAgICBiZ2UgICAgICAgICBMT09QX0hFSUdIVF8yNTZfR0VUX1RJTEVEX0VWRU4xCisgICAgYWRkICAgICAgICAgcjEwLCByMTIsICMyICAgICAgICAgICAgQCB0ZW1wMSA9IHRlbXAzKzIKKyAgICBiaWMgICAgICAgICByMTAsIHIxMCwgIzB4MyAgICAgICAgICBAIHRlbXAxID0gKHRlbXAxPj4yKTw8MgorICAgIGFkZCAgICAgICAgIHI3LCByMTIsIHIxMCAgICAgICAgICAgIEAgdGlsZWRfb2Zmc2V0ID0gdGVtcDMrdGVtcDFACisgICAgYWRkICAgICAgICAgcjEwLCByMiwgIzEyNyAgICAgICAgICAgQCB0ZW1wMSA9ICgoeXV2NDIwX3dpZHRoKzEyNyk+PjcpPDw3CisgICAgYmljICAgICAgICAgcjEwLCByMTAsICMweDdGCisgICAgbW92ICAgICAgICAgcjEwLCByMTAsIGFzciAjNiAgICAgICAgQCB0aWxlZF9vZmZzZXQgPSB0aWxlZF9vZmZzZXQrdGVtcDQqKHRlbXAxPj42KQorICAgIG1sYSAgICAgICAgIHI3LCByMTQsIHIxMCwgcjcKKyAgICBtb3YgICAgICAgICByNywgcjcsIGxzbCAjMTEgICAgICAgICBAIHRpbGVkX29mZnNldCA9IHRpbGVkX29mZnNldDw8MTEKKyAgICBhZGQgICAgICAgICByOCwgcjcsICMxMjI4OCAgICAgICAgICBAIHRpbGVkX29mZnNldDEgPSB0aWxlZF9vZmZzZXQrMjA0OCo2CisgICAgbW92ICAgICAgICAgcjE0LCAjOAorICAgIGIgICAgICAgICAgIExPT1BfSEVJR0hUXzI1Nl9HRVRfVElMRURfRU5ECisKK0xPT1BfSEVJR0hUXzI1Nl9HRVRfVElMRURfRVZFTjE6CisgICAgYWRkICAgICAgICAgcjEwLCByMiwgIzEyNyAgICAgICAgICAgQCB0ZW1wMSA9ICgoeXV2NDIwX3dpZHRoKzEyNyk+PjcpPDw3CisgICAgYmljICAgICAgICAgcjEwLCByMTAsICMweDdGCisgICAgbW92ICAgICAgICAgcjEwLCByMTAsIGFzciAjNiAgICAgICAgQCB0aWxlZF9vZmZzZXQgPSB0ZW1wNCoodGVtcDE+PjYpCisgICAgbXVsICAgICAgICAgcjcsIHIxNCwgcjEwCisgICAgYWRkICAgICAgICAgcjcsIHI3LCByMTIgICAgICAgICAgICAgQCB0aWxlZF9vZmZzZXQgPSB0aWxlZF9vZmZzZXQrdGVtcDMKKyAgICBtb3YgICAgICAgICByNywgcjcsIGxzbCAjMTEgICAgICAgICBAIHRpbGVkX29mZnNldCA9IHRpbGVkX29mZnNldDw8MTEKKyAgICBhZGQgICAgICAgICByOCwgcjcsICM0MDk2ICAgICAgICAgICBAIHRpbGVkX29mZnNldDEgPSB0aWxlZF9vZmZzZXQrMjA0OCoyCisgICAgbW92ICAgICAgICAgcjE0LCAjNAorCitMT09QX0hFSUdIVF8yNTZfR0VUX1RJTEVEX0VORDoKKworICAgIGxkciAgICAgICAgIHIxMiwgW3NwLCAjNDhdICAgICAgICAgIEAgcmlnaHQKKyAgICBsZHIgICAgICAgICByOSwgW3NwLCAjNDRdICAgICAgICAgICBAIHRvcAorICAgIGFuZCAgICAgICAgIHIxMCwgcjUsICMweDFGICAgICAgICAgIEAgdGVtcDEgPSBpJjB4MUYKKyAgICBhZGQgICAgICAgICByNywgcjcsIHIxMCwgbHNsICM2ICAgICBAIHRpbGVkX29mZnNldCA9IHRpbGVkX29mZnNldCs2NCoodGVtcDEpCisgICAgYWRkICAgICAgICAgcjgsIHI4LCByMTAsIGxzbCAjNiAgICAgQCB0aWxlZF9vZmZzZXQxID0gdGlsZWRfb2Zmc2V0MSs2NCoodGVtcDEpCisgICAgc3ViICAgICAgICAgcjExLCByMiwgcjYgICAgICAgICAgICAgQCB0ZW1wMiA9IHl1djQyMF93aWR0aC1sZWZ0KD09aiktcmlnaHQKKyAgICBzdWIgICAgICAgICByMTEsIHIxMSwgcjEyCisgICAgc3ViICAgICAgICAgcjksIHI1LCByOSAgICAgICAgICAgICAgQCBsaW5lYXJfb2Zmc2V0ID0gdGVtcDIqKGktdG9wKUAKKyAgICBtdWwgICAgICAgICByOSwgcjExLCByOQorICAgIGFkZCAgICAgICAgIHIxMiwgcjYsICMyNTYgICAgICAgICAgIEAgdGVtcDMgPSAoKGorMjU2KT4+OCk8PDhACisgICAgYmljICAgICAgICAgcjEyLCByMTIsICMweEZGCisgICAgc3ViICAgICAgICAgcjEyLCByMTIsIHI2ICAgICAgICAgICAgQCB0ZW1wMyA9IHRlbXAzLWpACisgICAgYW5kICAgICAgICAgcjEwLCByNiwgIzB4M0YgICAgICAgICAgQCB0ZW1wMSA9IGxlZnQoPT1qKSYweDNGCisKKyAgICBjbXAgICAgICAgICByMTIsICMxOTIgICAgICAgICAgICAgICBAIGlmICh0ZW1wMyA+IDE5MikKKyAgICBibGUgICAgICAgICBMT09QX0hFSUdIVF8yNTZfTEVGVF8xOTIKKyAgICBhZGQgICAgICAgICByMTEsIHIxLCByNyAgICAgICAgICAgICBAIHIxMSA9IG52MTJ0X3NyYyt0aWxlZF9vZmZzZXQrdGVtcDEKKyAgICBhZGQgICAgICAgICByMTEsIHIxMSwgcjEwCisgICAgcGxkICAgICAgICAgW3IxMV0KKyAgICBhZGQgICAgICAgICByMTIsIHIxLCByNyAgICAgICAgICAgICBAIHIxMiA9IG52MTJ0X3NyYyt0aWxlZF9vZmZzZXQrMjA0OAorICAgIHBsZCAgICAgICAgIFtyMTEsICMzMl0KKyAgICBhZGQgICAgICAgICByMTIsIHIxMiwgIzIwNDgKKyAgICBwbGQgICAgICAgICBbcjEyXQorICAgIGNtcCAgICAgICAgIHIxMCwgIzAKKyAgICBwbGQgICAgICAgICBbcjEyLCAjMzJdCisgICAgc3RtbmVmZCAgICAgc3AhLCB7cjktcjEyLCByMTR9ICAgICAgQCBiYWNrdXAgcmVnaXN0ZXJzCisgICAgcnNibmUgICAgICAgcjEwLCByMTAsICM2NAorICAgIGJsbmUgICAgICAgIE1FTUNPUFlfVU5ERVJfNjQKKyAgICBsZG1uZWZkICAgICBzcCEsIHtyOS1yMTIsIHIxNH0gICAgICBAIHJlc3RvcmUgcmVnaXN0ZXJzCisgICAgYm5lICAgICAgICAgTE9PUF9IRUlHSFRfMjU2X0xFRlRfMjU2XzY0CisgICAgdmxkMS44ICAgICAge3EwLCBxMX0sIFtyMTFdISAgICAgICAgQCBsb2FkIHtudjEydF9zcmMrdGlsZWRfb2Zmc2V0K3RlbXAxLCA2NH0KKyAgICB2bGQxLjggICAgICB7cTIsIHEzfSwgW3IxMV0KKyAgICBhZGQgICAgICAgICByMTEsIHIwLCByOSAgICAgICAgICAgICBAIHIxMSA9IHl1djQyMF9kZXN0K2xpbmVhcl9vZmZzZXQKKyAgICB2c3QxLjggICAgICB7cTAsIHExfSwgW3IxMV0hICAgICAgICBAIHN0b3JlIHt5dXY0MjBfZGVzdCtsaW5lYXJfb2Zmc2V0LCA2NH0KKyAgICB2c3QxLjggICAgICB7cTIsIHEzfSwgW3IxMV0hCitMT09QX0hFSUdIVF8yNTZfTEVGVF8yNTZfNjQ6CisgICAgYWRkICAgICAgICAgcjExLCByMSwgcjggICAgICAgICAgICAgQCByMTEgPSBudjEydF9zcmMrdGlsZWRfb2Zmc2V0MQorICAgIHBsZCAgICAgICAgIFtyMTFdCisgICAgdmxkMS44ICAgICAge3E0LCBxNX0sIFtyMTJdISAgICAgICAgQCBsb2FkIHtudjEydF9zcmMrdGlsZWRfb2Zmc2V0KzIwNDgsIDY0fQorICAgIHBsZCAgICAgICAgIFtyMTEsICMzMl0KKyAgICB2bGQxLjggICAgICB7cTYsIHE3fSwgW3IxMl0KKyAgICBhZGQgICAgICAgICByMTIsIHIxMSwgIzIwNDggICAgICAgICBAIHIxMiA9IG52MTJ0X3NyYyt0aWxlZF9vZmZzZXQxKzIwNDgKKyAgICBwbGQgICAgICAgICBbcjEyXQorICAgIHZsZDEuOCAgICAgIHtxOCwgcTl9LCBbcjExXSEgICAgICAgIEAgbG9hZCB7bnYxMnRfc3JjK3RpbGVkX29mZnNldDEsIDY0fQorICAgIHBsZCAgICAgICAgIFtyMTIsICMzMl0KKyAgICB2bGQxLjggICAgICB7cTEwLCBxMTF9LCBbcjExXQorICAgIHZsZDEuOCAgICAgIHtxMTIsIHExM30sIFtyMTJdISAgICAgIEAgbG9hZCB7bnYxMnRfc3JjK3RpbGVkX29mZnNldDErMjA0OCwgNjR9CisgICAgdmxkMS44ICAgICAge3ExNCwgcTE1fSwgW3IxMl0KKworICAgIHN1YiAgICAgICAgIHIxMSwgcjAsIHIxMCAgICAgICAgICAgIEAgcjExID0geXV2NDIwX2Rlc3QrbGluZWFyX29mZnNldCs2NC10ZW1wMQorICAgIGFkZCAgICAgICAgIHIxMiwgcjksICM2NAorICAgIGFkZCAgICAgICAgIHIxMSwgcjExLCByMTIKKworICAgIHZzdDEuOCAgICAgIHtxNCwgcTV9LCBbcjExXSEgICAgICAgQCBzdG9yZSB7eXV2NDIwX2Rlc3QrbGluZWFyX29mZnNldCs2NC10ZW1wMSwgNjR9CisgICAgdnN0MS44ICAgICAge3E2LCBxN30sIFtyMTFdIQorICAgIHZzdDEuOCAgICAgIHtxOCwgcTl9LCBbcjExXSEgICAgICAgQCBzdG9yZSB7eXV2NDIwX2Rlc3QrbGluZWFyX29mZnNldCsxMjgtdGVtcDEsIDY0fQorICAgIHZzdDEuOCAgICAgIHtxMTAsIHExMX0sIFtyMTFdIQorICAgIHZzdDEuOCAgICAgIHtxMTIsIHExM30sIFtyMTFdISAgICAgQCBzdG9yZSB7eXV2NDIwX2Rlc3QrbGluZWFyX29mZnNldCsxOTItdGVtcDEsIDY0fQorICAgIHZzdDEuOCAgICAgIHtxMTQsIHExNX0sIFtyMTFdIQorCisgICAgYWRkICAgICAgICAgcjksIHI5LCAjMjU2CisgICAgc3ViICAgICAgICAgcjksIHI5LCByMTAKKyAgICBiICAgICAgICAgICBMT09QX0hFSUdIVF8yNTZfTEVGVF9FTkQKKworTE9PUF9IRUlHSFRfMjU2X0xFRlRfMTkyOgorICAgIGNtcCAgICAgICAgIHIxMiwgIzEyOCAgICAgICAgICAgICAgIEAgaWYgKHRlbXAzID4gMTI4KQorICAgIGJsZSAgICAgICAgIExPT1BfSEVJR0hUXzI1Nl9MRUZUXzEyOAorICAgIGFkZCAgICAgICAgIHIxMSwgcjEsIHI3ICAgICAgICAgICAgIEAgcjExID0gbnYxMnRfc3JjK3RpbGVkX29mZnNldCsyMDQ4K3RlbXAxCisgICAgYWRkICAgICAgICAgcjExLCByMTEsIHIxMAorICAgIGFkZCAgICAgICAgIHIxMSwgcjExLCAjMjA0OAorICAgIHBsZCAgICAgICAgIFtyMTFdCisgICAgYWRkICAgICAgICAgcjEyLCByMSwgcjggICAgICAgICAgICAgQCByMTIgPSBudjEydF9zcmMrdGlsZWRfb2Zmc2V0MQorICAgIHBsZCAgICAgICAgIFtyMTEsICMzMl0KKyAgICBjbXAgICAgICAgICByMTAsICMwCisgICAgcGxkICAgICAgICAgW3IxMl0KKyAgICBzdG1uZWZkICAgICBzcCEsIHtyOS1yMTIsIHIxNH0gICAgICBAIGJhY2t1cCByZWdpc3RlcnMKKyAgICBwbGQgICAgICAgICBbcjEyLCAjMzJdCisgICAgcnNibmUgICAgICAgcjEwLCByMTAsICM2NAorICAgIGJsbmUgICAgICAgIE1FTUNPUFlfVU5ERVJfNjQKKyAgICBsZG1uZWZkICAgICBzcCEsIHtyOS1yMTIsIHIxNH0gICAgICBAIHJlc3RvcmUgcmVnaXN0ZXJzCisgICAgYm5lICAgICAgICAgTE9PUF9IRUlHSFRfMjU2X0xFRlRfMTkyXzY0CisgICAgdmxkMS44ICAgICAge3EwLCBxMX0sIFtyMTFdISAgICAgICAgQCBsb2FkIHtudjEydF9zcmMrdGlsZWRfb2Zmc2V0KzIwNDgrdGVtcDEsIDY0fQorICAgIHZsZDEuOCAgICAgIHtxMiwgcTN9LCBbcjExXQorICAgIGFkZCAgICAgICAgIHIxMSwgcjAsIHI5ICAgICAgICAgICAgIEAgcjExID0geXV2NDIwX2Rlc3QrbGluZWFyX29mZnNldAorICAgIHZzdDEuOCAgICAgIHtxMCwgcTF9LCBbcjExXSEgICAgICAgIEAgc3RvcmUge3l1djQyMF9kZXN0K2xpbmVhcl9vZmZzZXQsIDY0fQorICAgIHZzdDEuOCAgICAgIHtxMiwgcTN9LCBbcjExXSEKK0xPT1BfSEVJR0hUXzI1Nl9MRUZUXzE5Ml82NDoKKyAgICBhZGQgICAgICAgICByMTEsIHIxLCByOCAgICAgICAgICAgICBAIHIxMSA9IG52MTJ0X3NyYyt0aWxlZF9vZmZzZXQxKzIwNDgKKyAgICBhZGQgICAgICAgICByMTEsIHIxMSwgIzIwNDgKKyAgICBwbGQgICAgICAgICBbcjExXQorICAgIHZsZDEuOCAgICAgIHtxNCwgcTV9LCBbcjEyXSEgICAgICAgIEAgbG9hZCB7bnYxMnRfc3JjK3RpbGVkX29mZnNldDEsIDY0fQorICAgIHBsZCAgICAgICAgIFtyMTEsICMzMl0KKyAgICB2bGQxLjggICAgICB7cTYsIHE3fSwgW3IxMl0KKyAgICB2bGQxLjggICAgICB7cTgsIHE5fSwgW3IxMV0hICAgICAgICBAIGxvYWQge252MTJ0X3NyYyt0aWxlZF9vZmZzZXQxKzIwNDgsIDY0fQorICAgIHZsZDEuOCAgICAgIHtxMTAsIHExMX0sIFtyMTFdCisKKyAgICBzdWIgICAgICAgICByMTEsIHIwLCByMTAgICAgICAgICAgICBAIHIxMSA9IHl1djQyMF9kZXN0K2xpbmVhcl9vZmZzZXQrNjQtdGVtcDEKKyAgICBhZGQgICAgICAgICByMTIsIHI5LCAjNjQKKyAgICBhZGQgICAgICAgICByMTEsIHIxMSwgcjEyCisKKyAgICB2c3QxLjggICAgICB7cTQsIHE1fSwgW3IxMV0hICAgICAgICBAIHN0b3JlIHt5dXY0MjBfZGVzdCtsaW5lYXJfb2Zmc2V0KzY0LXRlbXAxLCA2NH0KKyAgICB2c3QxLjggICAgICB7cTYsIHE3fSwgW3IxMV0hCisgICAgdnN0MS44ICAgICAge3E4LCBxOX0sIFtyMTFdISAgICAgICAgQCBzdG9yZSB7eXV2NDIwX2Rlc3QrbGluZWFyX29mZnNldCsxMjgtdGVtcDEsIDY0fQorICAgIHZzdDEuOCAgICAgIHtxMTAsIHExMX0sIFtyMTFdIQorCisgICAgYWRkICAgICAgICAgcjksIHI5LCAjMTkyCisgICAgc3ViICAgICAgICAgcjksIHI5LCByMTAKKyAgICBiICAgICAgICAgICBMT09QX0hFSUdIVF8yNTZfTEVGVF9FTkQKKworTE9PUF9IRUlHSFRfMjU2X0xFRlRfMTI4OgorICAgIGNtcCAgICAgICAgIHIxMiwgIzY0ICAgICAgICAgICAgICAgIEAgaWYgKHRlbXAzID4gNjQpCisgICAgYmxlICAgICAgICAgTE9PUF9IRUlHSFRfMjU2X0xFRlRfNjQKKyAgICBhZGQgICAgICAgICByMTEsIHIxLCByOCAgICAgICAgICAgICBAIHIxMSA9IG52MTJ0X3NyYyt0aWxlZF9vZmZzZXQxK3RlbXAxCisgICAgYWRkICAgICAgICAgcjExLCByMTEsIHIxMAorICAgIHBsZCAgICAgICAgIFtyMTFdCisgICAgYWRkICAgICAgICAgcjEyLCByMSwgcjggICAgICAgICAgICAgQCByMTIgPSBudjEydF9zcmMrdGlsZWRfb2Zmc2V0MQorICAgIGFkZCAgICAgICAgIHIxMiwgcjEyLCAjMjA0OAorICAgIHBsZCAgICAgICAgIFtyMTEsICMzMl0KKyAgICBjbXAgICAgICAgICByMTAsICMwCisgICAgcGxkICAgICAgICAgW3IxMl0KKyAgICBzdG1uZWZkICAgICBzcCEsIHtyOS1yMTIsIHIxNH0gICAgICBAIGJhY2t1cCByZWdpc3RlcnMKKyAgICBwbGQgICAgICAgICBbcjEyLCAjMzJdCisgICAgcnNibmUgICAgICAgcjEwLCByMTAsICM2NAorICAgIGJsbmUgICAgICAgIE1FTUNPUFlfVU5ERVJfNjQKKyAgICBsZG1uZWZkICAgICBzcCEsIHtyOS1yMTIsIHIxNH0gICAgICBAIHJlc3RvcmUgcmVnaXN0ZXJzCisgICAgYm5lICAgICAgICAgTE9PUF9IRUlHSFRfMjU2X0xFRlRfMTI4XzY0CisgICAgdmxkMS44ICAgICAge3EwLCBxMX0sIFtyMTFdISAgICAgICAgQCBsb2FkIHtudjEydF9zcmMrdGlsZWRfb2Zmc2V0MSt0ZW1wMSwgNjR9CisgICAgdmxkMS44ICAgICAge3EyLCBxM30sIFtyMTFdCisgICAgYWRkICAgICAgICAgcjExLCByMCwgcjkgICAgICAgICAgICAgQCByMTEgPSB5dXY0MjBfZGVzdCtsaW5lYXJfb2Zmc2V0CisgICAgdnN0MS44ICAgICAge3EwLCBxMX0sIFtyMTFdISAgICAgICAgQCBzdG9yZSB7eXV2NDIwX2Rlc3QrbGluZWFyX29mZnNldCwgNjR9CisgICAgdnN0MS44ICAgICAge3EyLCBxM30sIFtyMTFdIQorTE9PUF9IRUlHSFRfMjU2X0xFRlRfMTI4XzY0OgorICAgIHZsZDEuOCAgICAgIHtxNCwgcTV9LCBbcjEyXSEgICAgICAgIEAgbG9hZCB7bnYxMnRfc3JjK3RpbGVkX29mZnNldDEsIDY0fQorICAgIHZsZDEuOCAgICAgIHtxNiwgcTd9LCBbcjEyXQorCisgICAgc3ViICAgICAgICAgcjExLCByMCwgcjEwICAgICAgICAgICAgQCByMTEgPSB5dXY0MjBfZGVzdCtsaW5lYXJfb2Zmc2V0KzY0LXRlbXAxCisgICAgYWRkICAgICAgICAgcjEyLCByOSwgIzY0CisgICAgYWRkICAgICAgICAgcjExLCByMTEsIHIxMgorCisgICAgdnN0MS44ICAgICAge3E0LCBxNX0sIFtyMTFdISAgICAgICAgQCBzdG9yZSB7eXV2NDIwX2Rlc3QrbGluZWFyX29mZnNldCs2NC10ZW1wMSwgNjR9CisgICAgdnN0MS44ICAgICAge3E2LCBxN30sIFtyMTFdIQorCisgICAgYWRkICAgICAgICAgcjksIHI5LCAjMTI4CisgICAgc3ViICAgICAgICAgcjksIHI5LCByMTAKKyAgICBiICAgICAgICAgICBMT09QX0hFSUdIVF8yNTZfTEVGVF9FTkQKKworTE9PUF9IRUlHSFRfMjU2X0xFRlRfNjQ6CisgICAgYWRkICAgICAgICAgcjExLCByMSwgcjggICAgICAgICAgICAgQCByMTEgPSBudjEydF9zcmMrdGlsZWRfb2Zmc2V0MSsyMDQ4K3RlbXAxCisgICAgYWRkICAgICAgICAgcjExLCByMTEsICMyMDQ4CisgICAgYWRkICAgICAgICAgcjExLCByMTEsIHIxMAorICAgIGNtcCAgICAgICAgIHIxMCwgIzAKKyAgICBwbGQgICAgICAgICBbcjExXQorICAgIHN0bW5lZmQgICAgIHNwISwge3I5LXIxMiwgcjE0fSAgICAgIEAgYmFja3VwIHJlZ2lzdGVycworICAgIHBsZCAgICAgICAgIFtyMTEsICMzMl0KKyAgICByc2JuZSAgICAgICByMTAsIHIxMCwgIzY0CisgICAgYmxuZSAgICAgICAgTUVNQ09QWV9VTkRFUl82NAorICAgIGxkbW5lZmQgICAgIHNwISwge3I5LXIxMiwgcjE0fSAgICAgIEAgcmVzdG9yZSByZWdpc3RlcnMKKyAgICBibmUgICAgICAgICBMT09QX0hFSUdIVF8yNTZfTEVGVF82NF82NAorICAgIHZsZDEuOCAgICAgIHtxMCwgcTF9LCBbcjExXSEgICAgICAgIEAgbG9hZCB7bnYxMnRfc3JjK3RpbGVkX29mZnNldDErdGVtcDEsIDY0fQorICAgIHZsZDEuOCAgICAgIHtxMiwgcTN9LCBbcjExXQorICAgIGFkZCAgICAgICAgIHIxMSwgcjAsIHI5ICAgICAgICAgICAgIEAgcjExID0geXV2NDIwX2Rlc3QrbGluZWFyX29mZnNldAorICAgIHZzdDEuOCAgICAgIHtxMCwgcTF9LCBbcjExXSEgICAgICAgIEAgc3RvcmUge3l1djQyMF9kZXN0K2xpbmVhcl9vZmZzZXQsIDY0fQorICAgIHZzdDEuOCAgICAgIHtxMiwgcTN9LCBbcjExXSEKK0xPT1BfSEVJR0hUXzI1Nl9MRUZUXzY0XzY0OgorICAgIGFkZCAgICAgICAgIHI5LCByOSwgIzY0CisgICAgc3ViICAgICAgICAgcjksIHI5LCByMTAKKworTE9PUF9IRUlHSFRfMjU2X0xFRlRfRU5EOgorCisgICAgbGRyICAgICAgICAgcjEyLCBbc3AsICM0OF0gICAgICAgICAgQCByaWdodAorICAgIGFkZCAgICAgICAgIHI3LCByNywgcjE0LCBsc2wgIzExICAgIEAgdGlsZWRfb2Zmc2V0ID0gdGlsZWRfb2Zmc2V0K3RlbXA0KjIwNDgKKyAgICBhZGQgICAgICAgICByMTAsIHIxLCByNyAgICAgICAgICAgICBAIHIxMCA9IG52MTJ0X3NyYyt0aWxlZF9vZmZzZXQKKyAgICBwbGQgICAgICAgICBbcjEwXQorICAgIGJpYyAgICAgICAgIHI2LCByNiwgIzB4RkYgICAgICAgICAgIEAgaiA9IChsZWZ0Pj44KTw8OAorICAgIHBsZCAgICAgICAgIFtyMTAsICMzMl0KKyAgICBhZGQgICAgICAgICByNiwgcjYsICMyNTYgICAgICAgICAgICBAIGogPSBqICsgMjU2CisgICAgc3ViICAgICAgICAgcjExLCByMiwgcjEyICAgICAgICAgICAgQCB0ZW1wMiA9IHl1djQyMF93aWR0aC1yaWdodC0yNTYKKyAgICBzdWIgICAgICAgICByMTEsIHIxMSwgIzI1NgorICAgIGNtcCAgICAgICAgIHI2LCByMTEKKyAgICBiZ3QgICAgICAgICBMT09QX0hFSUdIVF8yNTZfV0lEVEhfRU5ECisKK0xPT1BfSEVJR0hUXzI1Nl9XSURUSDoKKyAgICBhZGQgICAgICAgICByMTIsIHIxMCwgIzIwNDggICAgICAgICBAIHIxMiA9IG52MTJ0X3NyYyt0aWxlZF9vZmZzZXQrMjA0OAorICAgIHBsZCAgICAgICAgIFtyMTJdCisgICAgdmxkMS44ICAgICAge3EwLCBxMX0sIFtyMTBdISAgICAgICAgQCBsb2FkIHtudjEydF9zcmMrdGlsZWRfb2Zmc2V0LCA2NH0KKyAgICBwbGQgICAgICAgICBbcjEyLCAjMzJdCisgICAgdmxkMS44ICAgICAge3EyLCBxM30sIFtyMTBdCisKKyAgICBhZGQgICAgICAgICByOCwgcjgsIHIxNCwgbHNsICMxMSAgICBAIHRpbGVkX29mZnNldDEgPSB0aWxlZF9vZmZzZXQxK3RlbXA0KjIwNDgKKyAgICBhZGQgICAgICAgICByMTAsIHIxLCByOCAgICAgICAgICAgICBAIHIxMCA9IG52MTJ0X3NyYyt0aWxlZF9vZmZzZXQxCisgICAgcGxkICAgICAgICAgW3IxMF0KKyAgICB2bGQxLjggICAgICB7cTQsIHE1fSwgW3IxMl0hICAgICAgICBAIGxvYWQge252MTJ0X3NyYyt0aWxlZF9vZmZzZXQrMjA0OCwgNjR9CisgICAgcGxkICAgICAgICAgW3IxMCwgIzMyXQorICAgIHZsZDEuOCAgICAgIHtxNiwgcTd9LCBbcjEyXQorCisgICAgYWRkICAgICAgICAgcjEyLCByMTAsICMyMDQ4ICAgICAgICAgQCByMTIgPSBudjEydF9zcmMrdGlsZWRfb2Zmc2V0KzIwNDgKKyAgICBwbGQgICAgICAgICBbcjEyXQorICAgIHZsZDEuOCAgICAgIHtxOCwgcTl9LCBbcjEwXSEgICAgICAgIEAgbG9hZCB7bnYxMnRfc3JjK3RpbGVkX29mZnNldCsyMDQ4LCA2NH0KKyAgICBwbGQgICAgICAgICBbcjEyLCAjMzJdCisgICAgdmxkMS44ICAgICAge3ExMCwgcTExfSwgW3IxMF0KKworICAgIGFkZCAgICAgICAgIHI3LCByNywgcjE0LCBsc2wgIzExICAgIEAgdGlsZWRfb2Zmc2V0ID0gdGlsZWRfb2Zmc2V0K3RlbXA0KjIwNDgKKyAgICBhZGQgICAgICAgICByMTAsIHIxLCByNworICAgIHBsZCAgICAgICAgIFtyMTBdCisgICAgdmxkMS44ICAgICAge3ExMiwgcTEzfSwgW3IxMl0hICAgICAgQCBsb2FkIHtudjEydF9zcmMrdGlsZWRfb2Zmc2V0KzIwNDgsIDY0fQorICAgIHBsZCAgICAgICAgIFtyMTAsICMzMl0KKyAgICB2bGQxLjggICAgICB7cTE0LCBxMTV9LCBbcjEyXQorCisgICAgYWRkICAgICAgICAgcjEyLCByMCwgcjkgICAgICAgICAgICAgQCByMTIgPSB5dXY0MjBfZGVzdCtsaW5lYXJfb2Zmc2V0CisgICAgdnN0MS44ICAgICAge3EwLCBxMX0sIFtyMTJdIQorICAgIHZzdDEuOCAgICAgIHtxMiwgcTN9LCBbcjEyXSEKKyAgICB2c3QxLjggICAgICB7cTQsIHE1fSwgW3IxMl0hCisgICAgdnN0MS44ICAgICAge3E2LCBxN30sIFtyMTJdIQorICAgIHZzdDEuOCAgICAgIHtxOCwgcTl9LCBbcjEyXSEKKyAgICB2c3QxLjggICAgICB7cTEwLCBxMTF9LCBbcjEyXSEKKyAgICB2c3QxLjggICAgICB7cTEyLCBxMTN9LCBbcjEyXSEKKyAgICB2c3QxLjggICAgICB7cTE0LCBxMTV9LCBbcjEyXSEKKyAgICBhZGQgICAgICAgICByOSwgcjksICMyNTYgICAgICAgICAgICBAIGxpbmVhcl9vZmZzZXQgPSBsaW5lYXJfb2Zmc2V0KzI1NgorCisgICAgYWRkICAgICAgICAgcjEyLCByMTAsICMyMDQ4ICAgICAgICAgQCByMTIgPSBudjEydF9zcmMrdGlsZWRfb2Zmc2V0KzIwNDgKKworICAgIGFkZCAgICAgICAgIHI2LCByNiwgIzI1NiAgICAgICAgICAgIEAgaj1qKzI1NgorICAgIGNtcCAgICAgICAgIHI2LCByMTEgICAgICAgICAgICAgICAgIEAgajw9dGVtcDIKKyAgICBibGUgICAgICAgICBMT09QX0hFSUdIVF8yNTZfV0lEVEgKKworTE9PUF9IRUlHSFRfMjU2X1dJRFRIX0VORDoKKworICAgIGFkZCAgICAgICAgIHI4LCByOCwgcjE0LCBsc2wgIzExICAgIEAgdGlsZWRfb2Zmc2V0MSA9IHRpbGVkX29mZnNldDErdGVtcDQqMjA0OAorICAgIGxkciAgICAgICAgIHIxNCwgW3NwLCAjNDhdICAgICAgICAgIEAgcmlnaHQKKyAgICBzdWIgICAgICAgICByMTEsIHIyLCByNiAgICAgICAgICAgICBAIHRlbXAyID0geXV2NDIwX3dpZHRoLXJpZ2h0LWoKKyAgICBzdWIgICAgICAgICByMTEsIHIxMSwgcjE0CisgICAgY21wICAgICAgICAgcjExLCAjMAorICAgIGJlcSAgICAgICAgIExPT1BfSEVJR0hUXzI1Nl9SSUdIVF9FTkQKKyAgICBjbXAgICAgICAgICByMTEsICMxOTIKKyAgICBibGUgICAgICAgICBMT09QX0hFSUdIVF8yNTZfUklHSFRfMTkyCisgICAgYWRkICAgICAgICAgcjEyLCByMTAsICMyMDQ4CisgICAgcGxkICAgICAgICAgW3IxMl0KKyAgICB2bGQxLjggICAgICB7cTAsIHExfSwgW3IxMF0hICAgICAgICBAIGxvYWQge252MTJ0X3NyYyt0aWxlZF9vZmZzZXR9CisgICAgcGxkICAgICAgICAgW3IxMiwgIzMyXQorICAgIHZsZDEuOCAgICAgIHtxMiwgcTN9LCBbcjEwXQorCisgICAgYWRkICAgICAgICAgcjEwLCByMSwgcjggICAgICAgICAgICAgQCByMTAgPSBudjEydF9zcmMrdGlsZWRfb2Zmc2V0MQorICAgIHBsZCAgICAgICAgIFtyMTBdCisgICAgdmxkMS44ICAgICAge3E0LCBxNX0sIFtyMTJdISAgICAgICAgQCBsb2FkIHtudjEydF9zcmMrdGlsZWRfb2Zmc2V0KzIwNDh9CisgICAgcGxkICAgICAgICAgW3IxMCwgIzMyXQorICAgIHZsZDEuOCAgICAgIHtxNiwgcTd9LCBbcjEyXQorCisgICAgYWRkICAgICAgICAgcjE0LCByMTAsICMyMDQ4ICAgICAgICAgQCByMTAgPSBudjEydF9zcmMrdGlsZWRfb2Zmc2V0MSsyMDQ4CisgICAgcGxkICAgICAgICAgW3IxNF0KKyAgICB2bGQxLjggICAgICB7cTgsIHE5fSwgW3IxMF0hICAgICAgICBAIGxvYWQge252MTJ0X3NyYyt0aWxlZF9vZmZzZXQxfQorICAgIHBsZCAgICAgICAgIFtyMTQsICMzMl0KKyAgICB2bGQxLjggICAgICB7cTEwLCBxMTF9LCBbcjEwXQorCisgICAgYWRkICAgICAgICAgcjEyLCByMCwgcjkgICAgICAgICAgICAgQCByMTIgPSB5dXY0MjBfZGVzdCtsaW5lYXJfb2Zmc2V0CisgICAgdnN0MS44ICAgICAge3EwLCBxMX0sIFtyMTJdIQorICAgIHZzdDEuOCAgICAgIHtxMiwgcTN9LCBbcjEyXSEKKyAgICB2c3QxLjggICAgICB7cTQsIHE1fSwgW3IxMl0hCisgICAgdnN0MS44ICAgICAge3E2LCBxN30sIFtyMTJdIQorICAgIHZzdDEuOCAgICAgIHtxOCwgcTl9LCBbcjEyXSEKKyAgICB2c3QxLjggICAgICB7cTEwLCBxMTF9LCBbcjEyXSEKKyAgICBhZGQgICAgICAgICByOSwgcjksICMxOTIgICAgICAgICAgICBAIGxpbmVhcl9vZmZzZXQgPSBsaW5lYXJfb2Zmc2V0KzE5MgorCisgICAgc3RtZmQgICAgICAgc3AhLCB7cjktcjEyLCByMTR9ICAgICAgQCBiYWNrdXAgcmVnaXN0ZXJzCisgICAgc3ViICAgICAgICAgcjEwLCByMTEsICMxOTIKKyAgICBtb3YgICAgICAgICByMTEsIHIxNAorICAgIGJsICAgICAgICAgIE1FTUNPUFlfVU5ERVJfNjQKKyAgICBsZG1mZCAgICAgICBzcCEsIHtyOS1yMTIsIHIxNH0gICAgICBAIHJlc3RvcmUgcmVnaXN0ZXJzCisgICAgYiAgICAgICAgICAgTE9PUF9IRUlHSFRfMjU2X1JJR0hUX0VORAorCitMT09QX0hFSUdIVF8yNTZfUklHSFRfMTkyOgorICAgIGNtcCAgICAgICAgIHIxMSwgIzEyOAorICAgIGJsZSAgICAgICAgIExPT1BfSEVJR0hUXzI1Nl9SSUdIVF8xMjgKKyAgICBhZGQgICAgICAgICByMTIsIHIxMCwgIzIwNDgKKyAgICBwbGQgICAgICAgICBbcjEyXQorICAgIHZsZDEuOCAgICAgIHtxMCwgcTF9LCBbcjEwXSEgICAgICAgIEAgbG9hZCB7bnYxMnRfc3JjK3RpbGVkX29mZnNldH0KKyAgICBwbGQgICAgICAgICBbcjEyLCAjMzJdCisgICAgdmxkMS44ICAgICAge3EyLCBxM30sIFtyMTBdCisKKyAgICBhZGQgICAgICAgICByMTQsIHIxLCByOCAgICAgICAgICAgICBAIHIxMCA9IG52MTJ0X3NyYyt0aWxlZF9vZmZzZXQxCisgICAgcGxkICAgICAgICAgW3IxNF0KKyAgICB2bGQxLjggICAgICB7cTQsIHE1fSwgW3IxMl0hICAgICAgICBAIGxvYWQge252MTJ0X3NyYyt0aWxlZF9vZmZzZXQrMjA0OH0KKyAgICBwbGQgICAgICAgICBbcjE0LCAjMzJdCisgICAgdmxkMS44ICAgICAge3E2LCBxN30sIFtyMTJdCisKKyAgICBhZGQgICAgICAgICByMTIsIHIwLCByOSAgICAgICAgICAgICBAIHIxMiA9IHl1djQyMF9kZXN0K2xpbmVhcl9vZmZzZXQKKyAgICB2c3QxLjggICAgICB7cTAsIHExfSwgW3IxMl0hCisgICAgdnN0MS44ICAgICAge3EyLCBxM30sIFtyMTJdIQorICAgIHZzdDEuOCAgICAgIHtxNCwgcTV9LCBbcjEyXSEKKyAgICB2c3QxLjggICAgICB7cTYsIHE3fSwgW3IxMl0hCisgICAgYWRkICAgICAgICAgcjksIHI5LCAjMTI4ICAgICAgICAgICAgQCBsaW5lYXJfb2Zmc2V0ID0gbGluZWFyX29mZnNldCsxMjgKKworICAgIHN0bWZkICAgICAgIHNwISwge3I5LXIxMiwgcjE0fSAgICAgIEAgYmFja3VwIHJlZ2lzdGVycworICAgIHN1YiAgICAgICAgIHIxMCwgcjExLCAjMTI4CisgICAgbW92ICAgICAgICAgcjExLCByMTQKKyAgICBibCAgICAgICAgICBNRU1DT1BZX1VOREVSXzY0CisgICAgbGRtZmQgICAgICAgc3AhLCB7cjktcjEyLCByMTR9ICAgICAgQCByZXN0b3JlIHJlZ2lzdGVycworICAgIGIgICAgICAgICAgIExPT1BfSEVJR0hUXzI1Nl9SSUdIVF9FTkQKKworTE9PUF9IRUlHSFRfMjU2X1JJR0hUXzEyODoKKyAgICBjbXAgICAgICAgICByMTEsICM2NAorICAgIGJsZSAgICAgICAgIExPT1BfSEVJR0hUXzI1Nl9SSUdIVF82NAorICAgIGFkZCAgICAgICAgIHIxNCwgcjEwLCAjMjA0OAorICAgIHBsZCAgICAgICAgIFtyMTRdCisgICAgdmxkMS44ICAgICAge3EwLCBxMX0sIFtyMTBdISAgICAgICAgQCBsb2FkIHtudjEydF9zcmMrdGlsZWRfb2Zmc2V0fQorICAgIHBsZCAgICAgICAgIFtyMTQsICMzMl0KKyAgICB2bGQxLjggICAgICB7cTIsIHEzfSwgW3IxMF0KKworICAgIGFkZCAgICAgICAgIHIxMiwgcjAsIHI5ICAgICAgICAgICAgIEAgcjEyID0geXV2NDIwX2Rlc3QrbGluZWFyX29mZnNldAorICAgIHZzdDEuOCAgICAgIHtxMCwgcTF9LCBbcjEyXSEKKyAgICB2c3QxLjggICAgICB7cTIsIHEzfSwgW3IxMl0hCisgICAgYWRkICAgICAgICAgcjksIHI5LCAjNjQgICAgICAgICAgICBAIGxpbmVhcl9vZmZzZXQgPSBsaW5lYXJfb2Zmc2V0KzY0CisKKyAgICBzdG1mZCAgICAgICBzcCEsIHtyOS1yMTIsIHIxNH0gICAgICBAIGJhY2t1cCByZWdpc3RlcnMKKyAgICBzdWIgICAgICAgICByMTAsIHIxMSwgIzY0CisgICAgbW92ICAgICAgICAgcjExLCByMTQKKyAgICBibCAgICAgICAgICBNRU1DT1BZX1VOREVSXzY0CisgICAgbGRtZmQgICAgICAgc3AhLCB7cjktcjEyLCByMTR9ICAgICAgQCByZXN0b3JlIHJlZ2lzdGVycworICAgIGIgICAgICAgICAgIExPT1BfSEVJR0hUXzI1Nl9SSUdIVF9FTkQKKworTE9PUF9IRUlHSFRfMjU2X1JJR0hUXzY0OgorICAgIHN0bWZkICAgICAgIHNwISwge3I5LXIxMiwgcjE0fSAgICAgIEAgYmFja3VwIHJlZ2lzdGVycworICAgIG1vdiAgICAgICAgIHIxNCwgcjExCisgICAgbW92ICAgICAgICAgcjExLCByMTAKKyAgICBtb3YgICAgICAgICByMTAsIHIxNAorICAgIGJsICAgICAgICAgIE1FTUNPUFlfVU5ERVJfNjQKKyAgICBsZG1mZCAgICAgICBzcCEsIHtyOS1yMTIsIHIxNH0gICAgICBAIHJlc3RvcmUgcmVnaXN0ZXJzCisKK0xPT1BfSEVJR0hUXzI1Nl9SSUdIVF9FTkQ6CisKKyAgICBsZHIgICAgICAgICByMTQsIFtzcCwgIzUyXSAgICAgICAgICBAIGJ1dHRvbQorICAgIGFkZCAgICAgICAgIHI1LCByNSwgIzEgICAgICAgICAgICAgIEAgaT1pKzEKKyAgICBzdWIgICAgICAgICByMTQsIHIzLCByMTQgICAgICAgICAgICBAIGk8eXV2NDIwX2hlaWdodC1idXR0b20KKyAgICBjbXAgICAgICAgICByNSwgcjE0CisgICAgYmx0ICAgICAgICAgTE9PUF9IRUlHSFRfMjU2CisgICAgYiAgICAgICAgICAgUkVTVE9SRV9SRUcKKworTE9PUF9IRUlHSFRfNjRfU1RBUlQ6CisgICAgY21wICAgICAgICAgcjEwLCAjNjQgICAgICAgICAgICAgICBAIGlmICh0ZW1wMSA+PSA2NCkKKyAgICBibHQgICAgICAgICBMT09QX0hFSUdIVF8yX1NUQVJUCisKKyAgICBsZHIgICAgICAgICByNSwgW3NwLCAjNDRdICAgICAgICAgICBAIGkgPSB0b3AKK0xPT1BfSEVJR0hUXzY0OgorICAgIGxkciAgICAgICAgIHI2LCBbc3AsICM0MF0gICAgICAgICAgIEAgaiA9IGxlZnQKKyAgICBzdG1mZCAgICAgICBzcCEsIHtyMC1yMywgcjEyfSAgICAgICBAIGJhY2t1cCBwYXJhbWV0ZXJzCisgICAgbW92ICAgICAgICAgcjAsIHIyCisgICAgbW92ICAgICAgICAgcjEsIHIzCisgICAgbW92ICAgICAgICAgcjIsIHI2CisgICAgbW92ICAgICAgICAgcjMsIHI1CisgICAgYmwgICAgICAgICAgdGlsZV80eDJfcmVhZF9hc20KKyAgICBtb3YgICAgICAgICByNywgcjAKKyAgICBsZG1mZCAgICAgICBzcCEsIHtyMC1yMywgcjEyfSAgICAgICBAIHJlc3RvcmUgcGFyYW1ldGVycworICAgIGxkciAgICAgICAgIHI5LCBbc3AsICM0NF0gICAgICAgICAgIEAgbGluZWFyX29mZnNldCA9IHRvcAorICAgIGFkZCAgICAgICAgIHIxMSwgcjYsICM2NCAgICAgICAgICAgIEAgdGVtcDIgPSAoKGorNjQpPj42KTw8NgorICAgIGJpYyAgICAgICAgIHIxMSwgcjExLCAjMHgzRgorICAgIHN1YiAgICAgICAgIHIxMSwgcjExLCByNiAgICAgICAgICAgIEAgdGVtcDIgPSB0ZW1wMi1qCisgICAgc3ViICAgICAgICAgcjksIHI1LCByOSAgICAgICAgICAgICAgQCBsaW5lYXJfb2Zmc2V0ID0gdGVtcDEqKGktdG9wKQorICAgIG11bCAgICAgICAgIHI5LCByOSwgcjEwCisgICAgYW5kICAgICAgICAgcjE0LCByNiwgIzB4MyAgICAgICAgICAgQCB0ZW1wNCA9IGomMHgzCisgICAgYWRkICAgICAgICAgcjcsIHI3LCByMTQgICAgICAgICAgICAgQCB0aWxlZF9vZmZzZXQgPSB0aWxlZF9vZmZzZXQrdGVtcDQKKyAgICBzdG1mZCAgICAgICBzcCEsIHtyOS1yMTJ9ICAgICAgICAgICBAIGJhY2t1cCBwYXJhbWV0ZXJzCisgICAgbW92ICAgICAgICAgcjEwLCByMTEKKyAgICBhZGQgICAgICAgICByMTEsIHIxLCByNworICAgIGJsICAgICAgICAgIE1FTUNPUFlfVU5ERVJfNjQKKyAgICBsZG1mZCAgICAgICBzcCEsIHtyOS1yMTJ9ICAgICAgICAgICBAIHJlc3RvcmUgcGFyYW1ldGVycworICAgIGFkZCAgICAgICAgIHI5LCByOSwgcjExICAgICAgICAgICAgIEAgbGluZWFyX29mZnNldCA9IGxpbmVhcl9vZmZzZXQrdGVtcDIKKyAgICBhZGQgICAgICAgICByNiwgcjYsIHIxMSAgICAgICAgICAgICBAIGogPSBqK3RlbXAyQAorCisgICAgYWRkICAgICAgICAgcjE0LCByNiwgIzY0CisgICAgY21wICAgICAgICAgcjE0LCByMTIKKyAgICBiZ3QgICAgICAgICBMT09QX0hFSUdIVF82NF8xCisgICAgc3RtZmQgICAgICAgc3AhLCB7cjAtcjMsIHIxMn0gICAgICAgQCBiYWNrdXAgcGFyYW1ldGVycworICAgIG1vdiAgICAgICAgIHIwLCByMgorICAgIG1vdiAgICAgICAgIHIxLCByMworICAgIG1vdiAgICAgICAgIHIyLCByNgorICAgIG1vdiAgICAgICAgIHIzLCByNQorICAgIGJsICAgICAgICAgIHRpbGVfNHgyX3JlYWRfYXNtCisgICAgbW92ICAgICAgICAgcjcsIHIwCisgICAgbGRtZmQgICAgICAgc3AhLCB7cjAtcjMsIHIxMn0gICAgICAgQCByZXN0b3JlIHBhcmFtZXRlcnMKKyAgICBhZGQgICAgICAgICByNywgcjEsIHI3CisgICAgdmxkMS44ICAgICAge3EwLCBxMX0sIFtyN10hCisgICAgdmxkMS44ICAgICAge3EyLCBxM30sIFtyN10KKyAgICBhZGQgICAgICAgICByNywgcjAsIHI5CisgICAgdnN0MS44ICAgICAge3EwLCBxMX0sIFtyN10hCisgICAgdnN0MS44ICAgICAge3EyLCBxM30sIFtyN10KKyAgICBhZGQgICAgICAgICByOSwgcjksICM2NAorICAgIGFkZCAgICAgICAgIHI2LCByNiwgIzY0CisKK0xPT1BfSEVJR0hUXzY0XzE6CisgICAgYWRkICAgICAgICAgcjE0LCByNiwgIzY0CisgICAgY21wICAgICAgICAgcjE0LCByMTIKKyAgICBiZ3QgICAgICAgICBMT09QX0hFSUdIVF82NF8yCisgICAgc3RtZmQgICAgICAgc3AhLCB7cjAtcjMsIHIxMn0gICAgICAgQCBiYWNrdXAgcGFyYW1ldGVycworICAgIG1vdiAgICAgICAgIHIwLCByMgorICAgIG1vdiAgICAgICAgIHIxLCByMworICAgIG1vdiAgICAgICAgIHIyLCByNgorICAgIG1vdiAgICAgICAgIHIzLCByNQorICAgIGJsICAgICAgICAgIHRpbGVfNHgyX3JlYWRfYXNtCisgICAgbW92ICAgICAgICAgcjcsIHIwCisgICAgbGRtZmQgICAgICAgc3AhLCB7cjAtcjMsIHIxMn0gICAgICAgQCByZXN0b3JlIHBhcmFtZXRlcnMKKyAgICBhZGQgICAgICAgICByNywgcjEsIHI3CisgICAgdmxkMS44ICAgICAge3EwLCBxMX0sIFtyN10hCisgICAgdmxkMS44ICAgICAge3EyLCBxM30sIFtyN10KKyAgICBhZGQgICAgICAgICByNywgcjAsIHI5CisgICAgdnN0MS44ICAgICAge3EwLCBxMX0sIFtyN10hCisgICAgdnN0MS44ICAgICAge3EyLCBxM30sIFtyN10KKyAgICBhZGQgICAgICAgICByOSwgcjksICM2NAorICAgIGFkZCAgICAgICAgIHI2LCByNiwgIzY0CisKK0xPT1BfSEVJR0hUXzY0XzI6CisgICAgY21wICAgICAgICAgcjYsIHIxMgorICAgIGJnZSAgICAgICAgIExPT1BfSEVJR0hUXzY0XzMKKyAgICBzdG1mZCAgICAgICBzcCEsIHtyMC1yMywgcjEyfSAgICAgICBAIGJhY2t1cCBwYXJhbWV0ZXJzCisgICAgbW92ICAgICAgICAgcjAsIHIyCisgICAgbW92ICAgICAgICAgcjEsIHIzCisgICAgbW92ICAgICAgICAgcjIsIHI2CisgICAgbW92ICAgICAgICAgcjMsIHI1CisgICAgYmwgICAgICAgICAgdGlsZV80eDJfcmVhZF9hc20KKyAgICBtb3YgICAgICAgICByNywgcjAKKyAgICBsZG1mZCAgICAgICBzcCEsIHtyMC1yMywgcjEyfSAgICAgICBAIHJlc3RvcmUgcGFyYW1ldGVycworICAgIHN1YiAgICAgICAgIHIxMSwgcjEyLCByNgorICAgIHN0bWZkICAgICAgIHNwISwge3I5LXIxMn0gICAgICAgICAgIEAgYmFja3VwIHBhcmFtZXRlcnMKKyAgICBtb3YgICAgICAgICByMTAsIHIxMQorICAgIGFkZCAgICAgICAgIHIxMSwgcjEsIHI3CisgICAgYmwgICAgICAgICAgTUVNQ09QWV9VTkRFUl82NAorICAgIGxkbWZkICAgICAgIHNwISwge3I5LXIxMn0gICAgICAgICAgIEAgcmVzdG9yZSBwYXJhbWV0ZXJzCisKK0xPT1BfSEVJR0hUXzY0XzM6CisKKyAgICBsZHIgICAgICAgICByMTQsIFtzcCwgIzUyXSAgICAgICAgICBAIGJ1dHRvbQorICAgIGFkZCAgICAgICAgIHI1LCByNSwgIzEgICAgICAgICAgICAgIEAgaT1pKzEKKyAgICBzdWIgICAgICAgICByMTQsIHIzLCByMTQgICAgICAgICAgICBAIGk8eXV2NDIwX2hlaWdodC1idXR0b20KKyAgICBjbXAgICAgICAgICByNSwgcjE0CisgICAgYmx0ICAgICAgICAgTE9PUF9IRUlHSFRfNjQKKyAgICBiICAgICAgICAgICBSRVNUT1JFX1JFRworCitMT09QX0hFSUdIVF8yX1NUQVJUOgorCisgICAgbGRyICAgICAgICAgcjUsIFtzcCwgIzQ0XSAgICAgICAgICAgQCBpID0gdG9wCitMT09QX0hFSUdIVF8yOgorCisgICAgbGRyICAgICAgICAgcjYsIFtzcCwgIzQwXSAgICAgICAgICAgQCBqID0gbGVmdAorICAgIGxkciAgICAgICAgIHI5LCBbc3AsICM0NF0gICAgICAgICAgIEAgbGluZWFyX29mZnNldCA9IHRvcAorICAgIGFkZCAgICAgICAgIHIxMSwgcjYsICM2NCAgICAgICAgICAgIEAgdGVtcDIgPSAoKGorNjQpPj42KTw8NgorICAgIGJpYyAgICAgICAgIHIxMSwgcjExLCAjMHgzRgorICAgIHN1YiAgICAgICAgIHIxMSwgcjExLCByNiAgICAgICAgICAgIEAgdGVtcDIgPSB0ZW1wMi1qCisgICAgc3ViICAgICAgICAgcjksIHI1LCByOSAgICAgICAgICAgICAgQCBsaW5lYXJfb2Zmc2V0ID0gdGVtcDEqKGktdG9wKQorICAgIG11bCAgICAgICAgIHI5LCByMTAsIHI5CisgICAgYWRkICAgICAgICAgcjksIHIwLCByOSAgICAgICAgICAgICAgQCBsaW5lYXJfb2Zmc2V0ID0gbGluZWFyX2RzdCtsaW5lYXJfb2Zmc2V0CitMT09QX0hFSUdIVF8yX1dJRFRIOgorICAgIHN0bWZkICAgICAgIHNwISwge3IwLXIzLCByMTJ9ICAgICAgIEAgYmFja3VwIHBhcmFtZXRlcnMKKyAgICBtb3YgICAgICAgICByMCwgcjIKKyAgICBtb3YgICAgICAgICByMSwgcjMKKyAgICBtb3YgICAgICAgICByMiwgcjYKKyAgICBtb3YgICAgICAgICByMywgcjUKKyAgICBibCAgICAgICAgICB0aWxlXzR4Ml9yZWFkX2FzbQorICAgIG1vdiAgICAgICAgIHI3LCByMAorICAgIGxkbWZkICAgICAgIHNwISwge3IwLXIzLCByMTJ9ICAgICAgIEAgcmVzdG9yZSBwYXJhbWV0ZXJzCisKKyAgICBhbmQgICAgICAgICByMTQsIHI2LCAjMHgzICAgICAgICAgICBAIHRlbXA0ID0gaiYweDNACisgICAgYWRkICAgICAgICAgcjcsIHI3LCByMTQgICAgICAgICAgICAgQCB0aWxlZF9vZmZzZXQgPSB0aWxlZF9vZmZzZXQrdGVtcDRACisgICAgYWRkICAgICAgICAgcjcsIHIxLCByNworCisgICAgbGRyaCAgICAgICAgcjE0LCBbcjddCisgICAgc3RyaCAgICAgICAgcjE0LCBbcjldLCAjMgorCisgICAgbGRyICAgICAgICAgcjE0LCBbc3AsICM0OF0gICAgICAgICAgQCByaWdodAorICAgIGFkZCAgICAgICAgIHI2LCByNiwgIzIgICAgICAgICAgICAgIEAgaj1qKzIKKyAgICBzdWIgICAgICAgICByMTQsIHIyLCByMTQgICAgICAgICAgICBAIGo8eXV2NDIwX3dpZHRoLXJpZ2h0CisgICAgY21wICAgICAgICAgcjYsIHIxNAorICAgIGJsdCAgICAgICAgIExPT1BfSEVJR0hUXzJfV0lEVEgKKworICAgIGxkciAgICAgICAgIHIxNCwgW3NwLCAjNTJdICAgICAgICAgIEAgYnV0dG9tCisgICAgYWRkICAgICAgICAgcjUsIHI1LCAjMSAgICAgICAgICAgICAgQCBpPWkrMQorICAgIHN1YiAgICAgICAgIHIxNCwgcjMsIHIxNCAgICAgICAgICAgIEAgaTx5dXY0MjBfaGVpZ2h0LWJ1dHRvbQorICAgIGNtcCAgICAgICAgIHI1LCByMTQKKyAgICBibHQgICAgICAgICBMT09QX0hFSUdIVF8yCisKK1JFU1RPUkVfUkVHOgorICAgIGxkbWZkICAgICAgIHNwISwge3I0LXIxMixyMTV9ICAgICAgIEAgcmVzdG9yZSByZWdpc3RlcnMKKworTUVNQ09QWV9VTkRFUl82NDogICAgICAgICAgICAgICAgICAgICAgIEAgY291bnQ9cjEwLCBzcmM9cjExCisgICAgY21wICAgICAgICAgcjEwLCAjMzIKKyAgICBhZGQgICAgICAgICByOSwgcjAsIHI5ICAgICAgICAgICAgICBAIHI5ID0geXV2NDIwX2Rlc3QrbGluZWFyX29mZnNldAorICAgIGJsdCAgICAgICAgIE1FTUNPUFlfVU5ERVJfMzIKKyAgICB2bGQxLjggICAgICB7cTAsIHExfSwgW3IxMV0hICAgICAgICBAIGxvYWQge252MTJ0X3NyYyt0aWxlZF9vZmZzZXQrdGVtcDEsIDY0fQorICAgIHN1YiAgICAgICAgIHIxMCwgcjEwLCAjMzIKKyAgICBjbXAgICAgICAgICByMTAsICMwCisgICAgdnN0MS44ICAgICAge3EwLCBxMX0sIFtyOV0hICAgICAgICAgQCBsb2FkIHtudjEydF9zcmMrdGlsZWRfb2Zmc2V0K3RlbXAxLCA2NH0KKyAgICBiZXEgICAgICAgICBNRU1DT1BZX1VOREVSX0VORAorTUVNQ09QWV9VTkRFUl8zMjoKKyAgICBjbXAgICAgICAgICByMTAsICMxNgorICAgIGJsdCAgICAgICAgIE1FTUNPUFlfVU5ERVJfMTYKKyAgICB2bGQxLjggICAgICB7cTB9LCBbcjExXSEgICAgICAgICAgICBAIGxvYWQge252MTJ0X3NyYyt0aWxlZF9vZmZzZXQrdGVtcDEsIDY0fQorICAgIHN1YiAgICAgICAgIHIxMCwgcjEwLCAjMTYKKyAgICBjbXAgICAgICAgICByMTAsICMwCisgICAgdnN0MS44ICAgICAge3EwfSwgW3I5XSEgICAgICAgICAgICAgQCBsb2FkIHtudjEydF9zcmMrdGlsZWRfb2Zmc2V0K3RlbXAxLCA2NH0KKyAgICBiZXEgICAgICAgICBNRU1DT1BZX1VOREVSX0VORAorTUVNQ09QWV9VTkRFUl8xNjoKKyAgICBsZHJiICAgICAgICByMTIsIFtyMTFdLCAjMQorICAgIHN0cmIgICAgICAgIHIxMiwgW3I5XSwgIzEKKyAgICBzdWJzICAgICAgICByMTAsIHIxMCwgIzEKKyAgICBibmUgICAgICAgICBNRU1DT1BZX1VOREVSXzE2CisKK01FTUNPUFlfVU5ERVJfRU5EOgorICAgIGFuZCAgICAgICAgIHIxMCwgcjYsICMweDNGICAgICAgICAgIEAgdGVtcDEgPSBsZWZ0KD09aikmMHgzRgorICAgIGNtcCAgICAgICAgIHIxMCwgIzAKKyAgICBtb3YgICAgICAgICBwYywgbHIKKwordGlsZV80eDJfcmVhZF9hc206CitMRkIwOgorICAgIGFkZCAgICAgaXAsIHIzLCAjMzIKKyAgICBzdWIgICAgIHIwLCByMCwgIzEKKyAgICBjbXAgICAgIHIxLCBpcAorICAgIGNtcGxlICAgcjMsIHIxCisgICAgbW92ICAgICBpcCwgcjIsIGFzciAjMgorICAgIG1vdiAgICAgcjAsIHIwLCBhc3IgIzcKKyAgICBzdG1mZCAgIHNwISwge3I0LCByNSwgbHJ9CitMQ0ZJMDoKKyAgICBhZGQgICAgIHIwLCByMCwgIzEKKyAgICBiZ2UgICAgIEwyCisgICAgc3ViICAgICByMSwgcjEsICMxCisgICAgdHN0ICAgICByMSwgIzMyCisgICAgYm5lICAgICBMMgorICAgIHRzdCAgICAgcjMsICMzMgorICAgIGJuZSAgICAgTDIKKyAgICBtb3YgICAgIHI0LCByMiwgYXNyICM3CisgICAgYW5kICAgICByMSwgcjMsICMzMQorICAgIGVvciAgICAgcjQsIHI0LCByMywgYXNyICM1CisgICAgdWJmeCAgICByMywgcjMsICM2LCAjOAorICAgIHRzdCAgICAgcjQsICMxCisgICAgdWJmeCAgICByNCwgcjIsICM4LCAjNgorICAgIGFuZCAgICAgaXAsIGlwLCAjMTUKKyAgICBtb3YgICAgIHIyLCByMiwgYXNyICM2CisgICAgbWxhICAgICByMywgcjAsIHIzLCByNAorICAgIG9yciAgICAgcjEsIGlwLCByMSwgYXNsICM0CisgICAgYiAgICAgICBMOQorTDI6CisgICAgbW92ICAgICByMiwgaXAsIGFzciAjNQorICAgIGFuZCAgICAgcjQsIHIzLCAjMzEKKyAgICBlb3IgICAgIHIxLCByMiwgcjMsIGFzciAjNQorICAgIGFuZCAgICAgcjUsIHIyLCAjMTI3CisgICAgdWJmeCAgICByMywgcjMsICM2LCAjOAorICAgIHRzdCAgICAgcjEsICMxCisgICAgYW5kICAgICByMSwgaXAsICMxNQorICAgIG1vdiAgICAgcjIsIGlwLCBhc3IgIzQKKyAgICBtbGEgICAgIHIzLCByMCwgcjMsIHI1CisgICAgb3JyICAgICByMSwgcjEsIHI0LCBhc2wgIzQKK0w5OgorICAgIGFuZG5lICAgcjIsIHIyLCAjMQorICAgIGFuZGVxICAgcjIsIHIyLCAjMQorICAgIG9ycm5lICAgcjIsIHIyLCAjMgorICAgIG1vdiAgICAgcjEsIHIxLCBhc2wgIzIKKyAgICBvcnIgICAgIHIzLCByMSwgcjMsIGFzbCAjMTMKKyAgICBvcnIgICAgIHIwLCByMywgcjIsIGFzbCAjMTEKKyAgICBsZG1mZCAgIHNwISwge3I0LCByNSwgcGN9CitMRkUwOgorICAgIC5mbmVuZAorCmRpZmYgLS1naXQgYS9leHlub3M0L2hhbC9saWJzd2NvbnZlcnRlci9jc2NfdGlsZWRfdG9fbGluZWFyX2RlaW50ZXJsZWF2ZV9jcm9wX25lb24ucyBiL2V4eW5vczQvaGFsL2xpYnN3Y29udmVydGVyL2NzY190aWxlZF90b19saW5lYXJfZGVpbnRlcmxlYXZlX2Nyb3BfbmVvbi5zCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmNkZDEwMWUKLS0tIC9kZXYvbnVsbAorKysgYi9leHlub3M0L2hhbC9saWJzd2NvbnZlcnRlci9jc2NfdGlsZWRfdG9fbGluZWFyX2RlaW50ZXJsZWF2ZV9jcm9wX25lb24ucwpAQCAtMCwwICsxLDc4NiBAQAorLyoKKyAqCisgKiBDb3B5cmlnaHQgMjAxMiBTYW1zdW5nIEVsZWN0cm9uaWNzIFMuTFNJIENvLiBMVEQKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKQorICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisvKgorICogQGZpbGUgICAgY3NjX3RpbGVkX3RvX2xpbmVhcl9kZWludGVybGVhdmVfY3JvcF9uZW9uLnMKKyAqIEBicmllZiAgIFNFQ19PTVggc3BlY2lmaWMgZGVmaW5lCisgKiBAYXV0aG9yICBTaGluV29uIExlZSAoc2hpbndvbi5sZWVAc2Ftc3VuZy5jb20pCisgKiBAdmVyc2lvbiAxLjAKKyAqIEBoaXN0b3J5CisgKiAgIDIwMTIuMDIuMDEgOiBDcmVhdGUKKyAqLworCisvKgorICogQ29udmVydHMgYW5kIERlaW50ZXJsZWF2ZXMgdGlsZWQgZGF0YSB0byBsaW5lYXIKKyAqIENyb3BzIGxlZnQsIHRvcCwgcmlnaHQsIGJ1dHRvbQorICogMS4gVVYgb2YgTlYxMlQgdG8gVVYgb2YgWVVWNDIwUAorICoKKyAqIEBwYXJhbSB5dXY0MjBfdV9kZXN0CisgKiAgIFUgcGxhbmUgYWRkcmVzcyBvZiBZVVY0MjBQW291dF0KKyAqCisgKiBAcGFyYW0geXV2NDIwX3ZfZGVzdAorICogICBWIHBsYW5lIGFkZHJlc3Mgb2YgWVVWNDIwUFtvdXRdCisgKgorICogQHBhcmFtIG52MTJ0X3NyYworICogICBVViBwbGFuZSBhZGRyZXNzIG9mIE5WMTJUW2luXQorICoKKyAqIEBwYXJhbSB5dXY0MjBfd2lkdGgKKyAqICAgV2lkdGggb2YgWVVWNDIwW2luXQorICoKKyAqIEBwYXJhbSB5dXY0MjBfdXZfaGVpZ2h0CisgKiAgIEhlaWdodC8yIG9mIFlVVjQyMFtpbl0KKyAqCisgKiBAcGFyYW0gbGVmdAorICogICBDcm9wIHNpemUgb2YgbGVmdC4gSXQgc2hvdWxkIGJlIGV2ZW4uCisgKgorICogQHBhcmFtIHRvcAorICogICBDcm9wIHNpemUgb2YgdG9wLiBJdCBzaG91bGQgYmUgZXZlbi4KKyAqCisgKiBAcGFyYW0gcmlnaHQKKyAqICAgQ3JvcCBzaXplIG9mIHJpZ2h0LiBJdCBzaG91bGQgYmUgZXZlbi4KKyAqCisgKiBAcGFyYW0gYnV0dG9tCisgKiAgIENyb3Agc2l6ZSBvZiBidXR0b20uIEl0IHNob3VsZCBiZSBldmVuLgorICovCisKKyAgICAuYXJjaCBhcm12Ny1hCisgICAgLnRleHQKKyAgICAuZ2xvYmFsIGNzY190aWxlZF90b19saW5lYXJfZGVpbnRlcmxlYXZlX2Nyb3BfbmVvbgorICAgIC50eXBlICAgY3NjX3RpbGVkX3RvX2xpbmVhcl9kZWludGVybGVhdmVfY3JvcF9uZW9uLCAlZnVuY3Rpb24KK2NzY190aWxlZF90b19saW5lYXJfZGVpbnRlcmxlYXZlX2Nyb3BfbmVvbjoKKyAgICAuZm5zdGFydAorCisgICAgQHIwICAgICB5dXY0MjBfdV9kZXN0CisgICAgQHIxICAgICB5dXY0MjBfdl9kZXN0CisgICAgQHIyICAgICBudjEydF9zcmMKKyAgICBAcjMgICAgIHl1djQyMF93aWR0aAorICAgIEByNCAgICAgeXV2NDIwX2hlaWdodAorICAgIEByNSAgICAgaQorICAgIEByNiAgICAgagorICAgIEByNyAgICAgdGlsZWRfb2Zmc2V0CisgICAgQHI4ICAgICB0aWxlZF9vZmZzZXQxCisgICAgQHI5ICAgICBsaW5lYXJfb2Zmc2V0CisgICAgQHIxMCAgICB0ZW1wMQorICAgIEByMTEgICAgdGVtcDIKKyAgICBAcjEyICAgIHRlbXAzCisgICAgQHIxNCAgICB0ZW1wNAorCisgICAgc3RtZmQgICAgICAgc3AhLCB7cjQtcjEyLHIxNH0gICAgICAgQCBiYWNrdXAgcmVnaXN0ZXJzCisKKyAgICBsZHIgICAgICAgICByNCwgW3NwLCAjNDBdICAgICAgICAgICBAIHI0ID0geXV2NDIwX2hlaWdodAorCisgICAgbGRyICAgICAgICAgcjEyLCBbc3AsICM1Ml0gICAgICAgICAgQCByMTIgPSByaWdodAorICAgIGxkciAgICAgICAgIHIxMCwgW3NwLCAjNDRdICAgICAgICAgIEAgcjEwID0gbGVmdAorICAgIHN1YiAgICAgICAgIHIxMiwgcjMsIHIxMiAgICAgICAgICAgIEAgdGVtcDMgPSB5dXY0MjBfd2lkdGgtcmlnaHRACisgICAgc3ViICAgICAgICAgcjEwLCByMTIsIHIxMCAgICAgICAgICAgQCB0ZW1wMSA9IHRlbXAzLWxlZnRACisgICAgY21wICAgICAgICAgcjEwLCAjMjU2ICAgICAgICAgICAgICAgQCBpZiAodGVtcDEgPj0gMjU2KQorICAgIGJsdCAgICAgICAgIExPT1BfSEVJR0hUXzY0X1NUQVJUCisKKyAgICBsZHIgICAgICAgICByNSwgW3NwLCAjNDhdICAgICAgICAgICBAIHRvcAorTE9PUF9IRUlHSFRfMjU2OgorICAgIGxkciAgICAgICAgIHI2LCBbc3AsICM0NF0gICAgICAgICAgIEAgaiA9IGxlZnQKKyAgICBtb3YgICAgICAgICByMTQsIHI1LCBhc3IgIzUgICAgICAgICBAIHRlbXA0ID0gaT4+NQorICAgIGJpYyAgICAgICAgIHIxMiwgcjYsICMweEZGICAgICAgICAgIEAgdGVtcDMgPSAoaj4+OCk8PDgKKyAgICBtb3YgICAgICAgICByMTIsIHIxMiwgYXNyICM2ICAgICAgICBAIHRlbXAzID0gdGVtcDM+PjYKKyAgICBhbmQgICAgICAgICByMTEsIHIxNCwgIzB4MSAgICAgICAgICBAIGlmICh0ZW1wNCAmIDB4MSkKKyAgICBjbXAgICAgICAgICByMTEsICMweDEKKyAgICBibmUgICAgICAgICBMT09QX0hFSUdIVF8yNTZfR0VUX1RJTEVEX0VWRU4KK0xPT1BfSEVJR0hUXzI1Nl9HRVRfVElMRURfT0REOgorICAgIHN1YiAgICAgICAgIHI3LCByMTQsICMxICAgICAgICAgICAgIEAgdGlsZWRfb2Zmc2V0ID0gdGVtcDQtMQorICAgIGFkZCAgICAgICAgIHIxMCwgcjMsICMxMjcgICAgICAgICAgIEAgdGVtcDEgPSAoKHl1djQyMF93aWR0aCsxMjcpPj43KTw8NworICAgIGJpYyAgICAgICAgIHIxMCwgcjEwLCAjMHg3RgorICAgIG1vdiAgICAgICAgIHIxMCwgcjEwLCBhc3IgIzYgICAgICAgIEAgdGlsZWRfb2Zmc2V0ID0gdGlsZWRfb2Zmc2V0Kih0ZW1wMT4+NikKKyAgICBtdWwgICAgICAgICByNywgcjcsIHIxMAorICAgIGFkZCAgICAgICAgIHI3LCByNywgcjEyICAgICAgICAgICAgIEAgdGlsZWRfb2Zmc2V0ID0gdGlsZWRfb2Zmc2V0K3RlbXAzCisgICAgYWRkICAgICAgICAgcjcsIHI3LCAjMiAgICAgICAgICAgICAgQCB0aWxlZF9vZmZzZXQgPSB0aWxlZF9vZmZzZXQrMgorICAgIGJpYyAgICAgICAgIHIxMCwgcjEyLCAjMHgzICAgICAgICAgIEAgdGVtcDEgPSAodGVtcDM+PjIpPDwyCisgICAgYWRkICAgICAgICAgcjcsIHI3LCByMTAgICAgICAgICAgICAgQCB0aWxlZF9vZmZzZXQgPSB0aWxlZF9vZmZzZXQrdGVtcDEKKyAgICBtb3YgICAgICAgICByNywgcjcsIGxzbCAjMTEgICAgICAgICBAIHRpbGVkX29mZnNldCA9IHRpbGVkX29mZnNldDw8MTEKKyAgICBhZGQgICAgICAgICByOCwgcjcsICM0MDk2ICAgICAgICAgICBAIHRpbGVkX29mZnNldDEgPSB0aWxlZF9vZmZzZXQrMjA0OCoyCisgICAgbW92ICAgICAgICAgcjE0LCAjOAorICAgIGIgICAgICAgICAgIExPT1BfSEVJR0hUXzI1Nl9HRVRfVElMRURfRU5ECisKK0xPT1BfSEVJR0hUXzI1Nl9HRVRfVElMRURfRVZFTjoKKyAgICBhZGQgICAgICAgICByMTEsIHI0LCAjMzEgICAgICAgICAgICBAIHRlbXAyID0gKCh5dXY0MjBfaGVpZ2h0KzMxKT4+NSk8PDUKKyAgICBiaWMgICAgICAgICByMTEsIHIxMSwgIzB4MUYKKyAgICBhZGQgICAgICAgICByMTAsIHI1LCAjMzIgICAgICAgICAgICBAIGlmICgoaSszMik8dGVtcDIpCisgICAgY21wICAgICAgICAgcjEwLCByMTEKKyAgICBiZ2UgICAgICAgICBMT09QX0hFSUdIVF8yNTZfR0VUX1RJTEVEX0VWRU4xCisgICAgYWRkICAgICAgICAgcjEwLCByMTIsICMyICAgICAgICAgICAgQCB0ZW1wMSA9IHRlbXAzKzIKKyAgICBiaWMgICAgICAgICByMTAsIHIxMCwgIzB4MyAgICAgICAgICBAIHRlbXAxID0gKHRlbXAxPj4yKTw8MgorICAgIGFkZCAgICAgICAgIHI3LCByMTIsIHIxMCAgICAgICAgICAgIEAgdGlsZWRfb2Zmc2V0ID0gdGVtcDMrdGVtcDFACisgICAgYWRkICAgICAgICAgcjEwLCByMywgIzEyNyAgICAgICAgICAgQCB0ZW1wMSA9ICgoeXV2NDIwX3dpZHRoKzEyNyk+PjcpPDw3CisgICAgYmljICAgICAgICAgcjEwLCByMTAsICMweDdGCisgICAgbW92ICAgICAgICAgcjEwLCByMTAsIGFzciAjNiAgICAgICAgQCB0aWxlZF9vZmZzZXQgPSB0aWxlZF9vZmZzZXQrdGVtcDQqKHRlbXAxPj42KQorICAgIG1sYSAgICAgICAgIHI3LCByMTQsIHIxMCwgcjcKKyAgICBtb3YgICAgICAgICByNywgcjcsIGxzbCAjMTEgICAgICAgICBAIHRpbGVkX29mZnNldCA9IHRpbGVkX29mZnNldDw8MTEKKyAgICBhZGQgICAgICAgICByOCwgcjcsICMxMjI4OCAgICAgICAgICBAIHRpbGVkX29mZnNldDEgPSB0aWxlZF9vZmZzZXQrMjA0OCo2CisgICAgbW92ICAgICAgICAgcjE0LCAjOAorICAgIGIgICAgICAgICAgIExPT1BfSEVJR0hUXzI1Nl9HRVRfVElMRURfRU5ECisKK0xPT1BfSEVJR0hUXzI1Nl9HRVRfVElMRURfRVZFTjE6CisgICAgYWRkICAgICAgICAgcjEwLCByMywgIzEyNyAgICAgICAgICAgQCB0ZW1wMSA9ICgoeXV2NDIwX3dpZHRoKzEyNyk+PjcpPDw3CisgICAgYmljICAgICAgICAgcjEwLCByMTAsICMweDdGCisgICAgbW92ICAgICAgICAgcjEwLCByMTAsIGFzciAjNiAgICAgICAgQCB0aWxlZF9vZmZzZXQgPSB0ZW1wNCoodGVtcDE+PjYpCisgICAgbXVsICAgICAgICAgcjcsIHIxNCwgcjEwCisgICAgYWRkICAgICAgICAgcjcsIHI3LCByMTIgICAgICAgICAgICAgQCB0aWxlZF9vZmZzZXQgPSB0aWxlZF9vZmZzZXQrdGVtcDMKKyAgICBtb3YgICAgICAgICByNywgcjcsIGxzbCAjMTEgICAgICAgICBAIHRpbGVkX29mZnNldCA9IHRpbGVkX29mZnNldDw8MTEKKyAgICBhZGQgICAgICAgICByOCwgcjcsICM0MDk2ICAgICAgICAgICBAIHRpbGVkX29mZnNldDEgPSB0aWxlZF9vZmZzZXQrMjA0OCoyCisgICAgbW92ICAgICAgICAgcjE0LCAjNAorCitMT09QX0hFSUdIVF8yNTZfR0VUX1RJTEVEX0VORDoKKworICAgIGxkciAgICAgICAgIHIxMiwgW3NwLCAjNTJdICAgICAgICAgIEAgcmlnaHQKKyAgICBsZHIgICAgICAgICByOSwgW3NwLCAjNDhdICAgICAgICAgICBAIHRvcAorICAgIGFuZCAgICAgICAgIHIxMCwgcjUsICMweDFGICAgICAgICAgIEAgdGVtcDEgPSBpJjB4MUYKKyAgICBhZGQgICAgICAgICByNywgcjcsIHIxMCwgbHNsICM2ICAgICBAIHRpbGVkX29mZnNldCA9IHRpbGVkX29mZnNldCs2NCoodGVtcDEpCisgICAgYWRkICAgICAgICAgcjgsIHI4LCByMTAsIGxzbCAjNiAgICAgQCB0aWxlZF9vZmZzZXQxID0gdGlsZWRfb2Zmc2V0MSs2NCoodGVtcDEpCisgICAgc3ViICAgICAgICAgcjExLCByMywgcjYgICAgICAgICAgICAgQCB0ZW1wMiA9IHl1djQyMF93aWR0aC1sZWZ0KD09aiktcmlnaHQKKyAgICBzdWIgICAgICAgICByMTEsIHIxMSwgcjEyCisgICAgc3ViICAgICAgICAgcjksIHI1LCByOSAgICAgICAgICAgICAgQCBsaW5lYXJfb2Zmc2V0ID0gdGVtcDIqKGktdG9wKS8yQAorICAgIG11bCAgICAgICAgIHI5LCByMTEsIHI5CisgICAgbW92ICAgICAgICAgcjksIHI5LCBhc3IgIzEKKyAgICBhZGQgICAgICAgICByMTIsIHI2LCAjMjU2ICAgICAgICAgICBAIHRlbXAzID0gKChqKzI1Nik+PjgpPDw4QAorICAgIGJpYyAgICAgICAgIHIxMiwgcjEyLCAjMHhGRgorICAgIHN1YiAgICAgICAgIHIxMiwgcjEyLCByNiAgICAgICAgICAgIEAgdGVtcDMgPSB0ZW1wMy1qQAorICAgIGFuZCAgICAgICAgIHIxMCwgcjYsICMweDNGICAgICAgICAgIEAgdGVtcDEgPSBsZWZ0KD09aikmMHgzRgorCisgICAgY21wICAgICAgICAgcjEyLCAjMTkyICAgICAgICAgICAgICAgQCBpZiAodGVtcDMgPiAxOTIpCisgICAgYmxlICAgICAgICAgTE9PUF9IRUlHSFRfMjU2X0xFRlRfMTkyCisgICAgYWRkICAgICAgICAgcjExLCByMiwgcjcgICAgICAgICAgICAgQCByMTEgPSBudjEydF9zcmMrdGlsZWRfb2Zmc2V0K3RlbXAxCisgICAgYWRkICAgICAgICAgcjExLCByMTEsIHIxMAorICAgIHBsZCAgICAgICAgIFtyMTFdCisgICAgYWRkICAgICAgICAgcjEyLCByMiwgcjcgICAgICAgICAgICAgQCByMTIgPSBudjEydF9zcmMrdGlsZWRfb2Zmc2V0KzIwNDgKKyAgICBwbGQgICAgICAgICBbcjExLCAjMzJdCisgICAgYWRkICAgICAgICAgcjEyLCByMTIsICMyMDQ4CisgICAgcGxkICAgICAgICAgW3IxMl0KKyAgICBjbXAgICAgICAgICByMTAsICMwCisgICAgcGxkICAgICAgICAgW3IxMiwgIzMyXQorICAgIHN0bW5lZmQgICAgIHNwISwge3I4LXIxMiwgcjE0fSAgICAgIEAgYmFja3VwIHJlZ2lzdGVycworICAgIHJzYm5lICAgICAgIHIxMCwgcjEwLCAjNjQKKyAgICBibG5lICAgICAgICBJTlRFUkxFQVZFRF9NRU1DT1BZX1VOREVSXzY0CisgICAgbGRtbmVmZCAgICAgc3AhLCB7cjgtcjEyLCByMTR9ICAgICAgQCByZXN0b3JlIHJlZ2lzdGVycworICAgIGJuZSAgICAgICAgIExPT1BfSEVJR0hUXzI1Nl9MRUZUXzI1Nl82NAorICAgIHZsZDIuOCAgICAgIHtxMCwgcTF9LCBbcjExXSEgICAgICAgIEAgbG9hZCB7bnYxMnRfc3JjK3RpbGVkX29mZnNldCt0ZW1wMSwgNjR9CisgICAgdmxkMi44ICAgICAge3EyLCBxM30sIFtyMTFdCisgICAgYWRkICAgICAgICAgcjExLCByMCwgcjkgICAgICAgICAgICAgQCByMTEgPSB5dXY0MjBfdV9kZXN0K2xpbmVhcl9vZmZzZXQKKyAgICB2c3QxLjggICAgICB7cTB9LCBbcjExXSEKKyAgICB2c3QxLjggICAgICB7cTJ9LCBbcjExXSEKKyAgICBhZGQgICAgICAgICByMTEsIHIxLCByOSAgICAgICAgICAgICBAIHIxMSA9IHl1djQyMF92X2Rlc3QrbGluZWFyX29mZnNldAorICAgIHZzdDEuOCAgICAgIHtxMX0sIFtyMTFdIQorICAgIHZzdDEuOCAgICAgIHtxM30sIFtyMTFdIQorTE9PUF9IRUlHSFRfMjU2X0xFRlRfMjU2XzY0OgorICAgIGFkZCAgICAgICAgIHIxMSwgcjIsIHI4ICAgICAgICAgICAgIEAgcjExID0gbnYxMnRfc3JjK3RpbGVkX29mZnNldDEKKyAgICBwbGQgICAgICAgICBbcjExXQorICAgIHZsZDIuOCAgICAgIHtxNCwgcTV9LCBbcjEyXSEgICAgICAgIEAgbG9hZCB7bnYxMnRfc3JjK3RpbGVkX29mZnNldCsyMDQ4LCA2NH0KKyAgICBwbGQgICAgICAgICBbcjExLCAjMzJdCisgICAgdmxkMi44ICAgICAge3E2LCBxN30sIFtyMTJdCisgICAgYWRkICAgICAgICAgcjEyLCByMTEsICMyMDQ4ICAgICAgICAgQCByMTIgPSBudjEydF9zcmMrdGlsZWRfb2Zmc2V0MSsyMDQ4CisgICAgcGxkICAgICAgICAgW3IxMl0KKyAgICB2bGQyLjggICAgICB7cTgsIHE5fSwgW3IxMV0hICAgICAgICBAIGxvYWQge252MTJ0X3NyYyt0aWxlZF9vZmZzZXQxLCA2NH0KKyAgICBwbGQgICAgICAgICBbcjEyLCAjMzJdCisgICAgdmxkMi44ICAgICAge3ExMCwgcTExfSwgW3IxMV0KKyAgICB2bGQyLjggICAgICB7cTEyLCBxMTN9LCBbcjEyXSEgICAgICBAIGxvYWQge252MTJ0X3NyYyt0aWxlZF9vZmZzZXQxKzIwNDgsIDY0fQorICAgIHZsZDIuOCAgICAgIHtxMTQsIHExNX0sIFtyMTJdCisKKyAgICBhZGQgICAgICAgICByMTEsIHIwLCByOSAgICAgICAgICAgICBAIHIxMSA9IHl1djQyMF91X2Rlc3QrbGluZWFyX29mZnNldCszMi10ZW1wMS8yCisgICAgYWRkICAgICAgICAgcjExLCByMTEsICMzMgorICAgIHN1YiAgICAgICAgIHIxMSwgcjExLCByMTAsIGFzciAjMQorICAgIHZzdDEuOCAgICAgIHtxNH0sIFtyMTFdIQorICAgIHZzdDEuOCAgICAgIHtxNn0sIFtyMTFdIQorICAgIHZzdDEuOCAgICAgIHtxOH0sIFtyMTFdIQorICAgIHZzdDEuOCAgICAgIHtxMTB9LCBbcjExXSEKKyAgICB2c3QxLjggICAgICB7cTEyfSwgW3IxMV0hCisgICAgdnN0MS44ICAgICAge3ExNH0sIFtyMTFdIQorCisgICAgYWRkICAgICAgICAgcjExLCByMSwgcjkgICAgICAgICAgICAgQCByMTEgPSB5dXY0MjBfdl9kZXN0K2xpbmVhcl9vZmZzZXQrMzItdGVtcDEvMgorICAgIGFkZCAgICAgICAgIHIxMSwgcjExLCAjMzIKKyAgICBzdWIgICAgICAgICByMTEsIHIxMSwgcjEwLCBhc3IgIzEKKyAgICB2c3QxLjggICAgICB7cTV9LCBbcjExXSEKKyAgICB2c3QxLjggICAgICB7cTd9LCBbcjExXSEKKyAgICB2c3QxLjggICAgICB7cTl9LCBbcjExXSEKKyAgICB2c3QxLjggICAgICB7cTExfSwgW3IxMV0hCisgICAgdnN0MS44ICAgICAge3ExM30sIFtyMTFdIQorICAgIHZzdDEuOCAgICAgIHtxMTV9LCBbcjExXSEKKworICAgIGFkZCAgICAgICAgIHI5LCByOSwgIzEyOAorICAgIHN1YiAgICAgICAgIHI5LCByOSwgcjEwLCBhc3IgIzEKKyAgICBiICAgICAgICAgICBMT09QX0hFSUdIVF8yNTZfTEVGVF9FTkQKKworTE9PUF9IRUlHSFRfMjU2X0xFRlRfMTkyOgorICAgIGNtcCAgICAgICAgIHIxMiwgIzEyOCAgICAgICAgICAgICAgIEAgaWYgKHRlbXAzID4gMTI4KQorICAgIGJsZSAgICAgICAgIExPT1BfSEVJR0hUXzI1Nl9MRUZUXzEyOAorICAgIGFkZCAgICAgICAgIHIxMSwgcjIsIHI3ICAgICAgICAgICAgIEAgcjExID0gbnYxMnRfc3JjK3RpbGVkX29mZnNldCsyMDQ4K3RlbXAxCisgICAgYWRkICAgICAgICAgcjExLCByMTEsIHIxMAorICAgIGFkZCAgICAgICAgIHIxMSwgcjExLCAjMjA0OAorICAgIHBsZCAgICAgICAgIFtyMTFdCisgICAgYWRkICAgICAgICAgcjEyLCByMiwgcjggICAgICAgICAgICAgQCByMTIgPSBudjEydF9zcmMrdGlsZWRfb2Zmc2V0MQorICAgIHBsZCAgICAgICAgIFtyMTEsICMzMl0KKyAgICBjbXAgICAgICAgICByMTAsICMwCisgICAgcGxkICAgICAgICAgW3IxMl0KKyAgICBzdG1uZWZkICAgICBzcCEsIHtyOC1yMTIsIHIxNH0gICAgICBAIGJhY2t1cCByZWdpc3RlcnMKKyAgICBwbGQgICAgICAgICBbcjEyLCAjMzJdCisgICAgcnNibmUgICAgICAgcjEwLCByMTAsICM2NAorICAgIGJsbmUgICAgICAgIElOVEVSTEVBVkVEX01FTUNPUFlfVU5ERVJfNjQKKyAgICBsZG1uZWZkICAgICBzcCEsIHtyOC1yMTIsIHIxNH0gICAgICBAIHJlc3RvcmUgcmVnaXN0ZXJzCisgICAgYm5lICAgICAgICAgTE9PUF9IRUlHSFRfMjU2X0xFRlRfMTkyXzY0CisgICAgdmxkMi44ICAgICAge3EwLCBxMX0sIFtyMTFdISAgICAgICAgQCBsb2FkIHtudjEydF9zcmMrdGlsZWRfb2Zmc2V0KzIwNDgrdGVtcDEsIDY0fQorICAgIHZsZDIuOCAgICAgIHtxMiwgcTN9LCBbcjExXQorICAgIGFkZCAgICAgICAgIHIxMSwgcjAsIHI5ICAgICAgICAgICAgIEAgcjExID0geXV2NDIwX3VfZGVzdCtsaW5lYXJfb2Zmc2V0CisgICAgdnN0MS44ICAgICAge3EwfSwgW3IxMV0hCisgICAgdnN0MS44ICAgICAge3EyfSwgW3IxMV0hCisgICAgYWRkICAgICAgICAgcjExLCByMSwgcjkgICAgICAgICAgICAgQCByMTEgPSB5dXY0MjBfdl9kZXN0K2xpbmVhcl9vZmZzZXQKKyAgICB2c3QxLjggICAgICB7cTF9LCBbcjExXSEKKyAgICB2c3QxLjggICAgICB7cTN9LCBbcjExXSEKK0xPT1BfSEVJR0hUXzI1Nl9MRUZUXzE5Ml82NDoKKyAgICBhZGQgICAgICAgICByMTEsIHIyLCByOCAgICAgICAgICAgICBAIHIxMSA9IG52MTJ0X3NyYyt0aWxlZF9vZmZzZXQxKzIwNDgKKyAgICBhZGQgICAgICAgICByMTEsIHIxMSwgIzIwNDgKKyAgICBwbGQgICAgICAgICBbcjExXQorICAgIHZsZDIuOCAgICAgIHtxNCwgcTV9LCBbcjEyXSEgICAgICAgIEAgbG9hZCB7bnYxMnRfc3JjK3RpbGVkX29mZnNldDEsIDY0fQorICAgIHBsZCAgICAgICAgIFtyMTEsICMzMl0KKyAgICB2bGQyLjggICAgICB7cTYsIHE3fSwgW3IxMl0KKyAgICB2bGQyLjggICAgICB7cTgsIHE5fSwgW3IxMV0hICAgICAgICBAIGxvYWQge252MTJ0X3NyYyt0aWxlZF9vZmZzZXQxKzIwNDgsIDY0fQorICAgIHZsZDIuOCAgICAgIHtxMTAsIHExMX0sIFtyMTFdCisKKyAgICBhZGQgICAgICAgICByMTEsIHIwLCByOSAgICAgICAgICAgICBAIHIxMSA9IHl1djQyMF91X2Rlc3QrbGluZWFyX29mZnNldCszMi10ZW1wMS8yCisgICAgYWRkICAgICAgICAgcjExLCByMTEsICMzMgorICAgIHN1YiAgICAgICAgIHIxMSwgcjExLCByMTAsIGFzciAjMQorICAgIHZzdDEuOCAgICAgIHtxNH0sIFtyMTFdIQorICAgIHZzdDEuOCAgICAgIHtxNn0sIFtyMTFdIQorICAgIHZzdDEuOCAgICAgIHtxOH0sIFtyMTFdIQorICAgIHZzdDEuOCAgICAgIHtxMTB9LCBbcjExXSEKKworICAgIGFkZCAgICAgICAgIHIxMSwgcjEsIHI5ICAgICAgICAgICAgIEAgcjExID0geXV2NDIwX3ZfZGVzdCtsaW5lYXJfb2Zmc2V0KzMyLXRlbXAxLzIKKyAgICBhZGQgICAgICAgICByMTEsIHIxMSwgIzMyCisgICAgc3ViICAgICAgICAgcjExLCByMTEsIHIxMCwgYXNyICMxCisgICAgdnN0MS44ICAgICAge3E1fSwgW3IxMV0hCisgICAgdnN0MS44ICAgICAge3E3fSwgW3IxMV0hCisgICAgdnN0MS44ICAgICAge3E5fSwgW3IxMV0hCisgICAgdnN0MS44ICAgICAge3ExMX0sIFtyMTFdIQorCisgICAgYWRkICAgICAgICAgcjksIHI5LCAjOTYKKyAgICBzdWIgICAgICAgICByOSwgcjksIHIxMCwgYXNyICMxCisgICAgYiAgICAgICAgICAgTE9PUF9IRUlHSFRfMjU2X0xFRlRfRU5ECisKK0xPT1BfSEVJR0hUXzI1Nl9MRUZUXzEyODoKKyAgICBjbXAgICAgICAgICByMTIsICM2NCAgICAgICAgICAgICAgICBAIGlmICh0ZW1wMyA+IDY0KQorICAgIGJsZSAgICAgICAgIExPT1BfSEVJR0hUXzI1Nl9MRUZUXzY0CisgICAgYWRkICAgICAgICAgcjExLCByMiwgcjggICAgICAgICAgICAgQCByMTEgPSBudjEydF9zcmMrdGlsZWRfb2Zmc2V0MSt0ZW1wMQorICAgIGFkZCAgICAgICAgIHIxMSwgcjExLCByMTAKKyAgICBwbGQgICAgICAgICBbcjExXQorICAgIGFkZCAgICAgICAgIHIxMiwgcjIsIHI4ICAgICAgICAgICAgIEAgcjEyID0gbnYxMnRfc3JjK3RpbGVkX29mZnNldDEKKyAgICBhZGQgICAgICAgICByMTIsIHIxMiwgIzIwNDgKKyAgICBwbGQgICAgICAgICBbcjExLCAjMzJdCisgICAgY21wICAgICAgICAgcjEwLCAjMAorICAgIHBsZCAgICAgICAgIFtyMTJdCisgICAgc3RtbmVmZCAgICAgc3AhLCB7cjgtcjEyLCByMTR9ICAgICAgQCBiYWNrdXAgcmVnaXN0ZXJzCisgICAgcGxkICAgICAgICAgW3IxMiwgIzMyXQorICAgIHJzYm5lICAgICAgIHIxMCwgcjEwLCAjNjQKKyAgICBibG5lICAgICAgICBJTlRFUkxFQVZFRF9NRU1DT1BZX1VOREVSXzY0CisgICAgbGRtbmVmZCAgICAgc3AhLCB7cjgtcjEyLCByMTR9ICAgICAgQCByZXN0b3JlIHJlZ2lzdGVycworICAgIGJuZSAgICAgICAgIExPT1BfSEVJR0hUXzI1Nl9MRUZUXzEyOF82NAorICAgIHZsZDIuOCAgICAgIHtxMCwgcTF9LCBbcjExXSEgICAgICAgIEAgbG9hZCB7bnYxMnRfc3JjK3RpbGVkX29mZnNldDErdGVtcDEsIDY0fQorICAgIHZsZDIuOCAgICAgIHtxMiwgcTN9LCBbcjExXQorICAgIGFkZCAgICAgICAgIHIxMSwgcjAsIHI5ICAgICAgICAgICAgIEAgcjExID0geXV2NDIwX3VfZGVzdCtsaW5lYXJfb2Zmc2V0CisgICAgdnN0MS44ICAgICAge3EwfSwgW3IxMV0hCisgICAgdnN0MS44ICAgICAge3EyfSwgW3IxMV0hCisgICAgYWRkICAgICAgICAgcjExLCByMSwgcjkgICAgICAgICAgICAgQCByMTEgPSB5dXY0MjBfdl9kZXN0K2xpbmVhcl9vZmZzZXQKKyAgICB2c3QxLjggICAgICB7cTF9LCBbcjExXSEKKyAgICB2c3QxLjggICAgICB7cTN9LCBbcjExXSEKK0xPT1BfSEVJR0hUXzI1Nl9MRUZUXzEyOF82NDoKKyAgICB2bGQyLjggICAgICB7cTQsIHE1fSwgW3IxMl0hICAgICAgICBAIGxvYWQge252MTJ0X3NyYyt0aWxlZF9vZmZzZXQxLCA2NH0KKyAgICB2bGQyLjggICAgICB7cTYsIHE3fSwgW3IxMl0KKworICAgIGFkZCAgICAgICAgIHIxMSwgcjAsIHI5ICAgICAgICAgICAgIEAgcjExID0geXV2NDIwX3VfZGVzdCtsaW5lYXJfb2Zmc2V0KzMyLXRlbXAxLzIKKyAgICBhZGQgICAgICAgICByMTEsIHIxMSwgIzMyCisgICAgc3ViICAgICAgICAgcjExLCByMTEsIHIxMCwgYXNyICMxCisgICAgdnN0MS44ICAgICAge3E0fSwgW3IxMV0hCisgICAgdnN0MS44ICAgICAge3E2fSwgW3IxMV0hCisKKyAgICBhZGQgICAgICAgICByMTEsIHIxLCByOSAgICAgICAgICAgICBAIHIxMSA9IHl1djQyMF92X2Rlc3QrbGluZWFyX29mZnNldCszMi10ZW1wMS8yCisgICAgYWRkICAgICAgICAgcjExLCByMTEsICMzMgorICAgIHN1YiAgICAgICAgIHIxMSwgcjExLCByMTAsIGFzciAjMQorICAgIHZzdDEuOCAgICAgIHtxNX0sIFtyMTFdIQorICAgIHZzdDEuOCAgICAgIHtxN30sIFtyMTFdIQorCisgICAgYWRkICAgICAgICAgcjksIHI5LCAjNjQKKyAgICBzdWIgICAgICAgICByOSwgcjksIHIxMCwgYXNyICMxCisgICAgYiAgICAgICAgICAgTE9PUF9IRUlHSFRfMjU2X0xFRlRfRU5ECisKK0xPT1BfSEVJR0hUXzI1Nl9MRUZUXzY0OgorICAgIGFkZCAgICAgICAgIHIxMSwgcjIsIHI4ICAgICAgICAgICAgIEAgcjExID0gbnYxMnRfc3JjK3RpbGVkX29mZnNldDErMjA0OCt0ZW1wMQorICAgIGFkZCAgICAgICAgIHIxMSwgcjExLCAjMjA0OAorICAgIGFkZCAgICAgICAgIHIxMSwgcjExLCByMTAKKyAgICBjbXAgICAgICAgICByMTAsICMwCisgICAgcGxkICAgICAgICAgW3IxMV0KKyAgICBzdG1uZWZkICAgICBzcCEsIHtyOC1yMTIsIHIxNH0gICAgICBAIGJhY2t1cCByZWdpc3RlcnMKKyAgICBwbGQgICAgICAgICBbcjExLCAjMzJdCisgICAgcnNibmUgICAgICAgcjEwLCByMTAsICM2NAorICAgIGJsbmUgICAgICAgIElOVEVSTEVBVkVEX01FTUNPUFlfVU5ERVJfNjQKKyAgICBsZG1uZWZkICAgICBzcCEsIHtyOC1yMTIsIHIxNH0gICAgICBAIHJlc3RvcmUgcmVnaXN0ZXJzCisgICAgYm5lICAgICAgICAgTE9PUF9IRUlHSFRfMjU2X0xFRlRfNjRfNjQKKyAgICB2bGQyLjggICAgICB7cTAsIHExfSwgW3IxMV0hICAgICAgICBAIGxvYWQge252MTJ0X3NyYyt0aWxlZF9vZmZzZXQxK3RlbXAxLCA2NH0KKyAgICB2bGQyLjggICAgICB7cTIsIHEzfSwgW3IxMV0KKyAgICBhZGQgICAgICAgICByMTEsIHIwLCByOSAgICAgICAgICAgICBAIHIxMSA9IHl1djQyMF9kZXN0K2xpbmVhcl9vZmZzZXQKKyAgICB2c3QxLjggICAgICB7cTAsIHExfSwgW3IxMV0hICAgICAgICBAIHN0b3JlIHt5dXY0MjBfZGVzdCtsaW5lYXJfb2Zmc2V0LCA2NH0KKyAgICB2c3QxLjggICAgICB7cTIsIHEzfSwgW3IxMV0hCitMT09QX0hFSUdIVF8yNTZfTEVGVF82NF82NDoKKyAgICBhZGQgICAgICAgICByOSwgcjksICMzMgorICAgIHN1YiAgICAgICAgIHI5LCByOSwgcjEwLCBhc3IgIzEKKworTE9PUF9IRUlHSFRfMjU2X0xFRlRfRU5EOgorCisgICAgbGRyICAgICAgICAgcjEyLCBbc3AsICM1Ml0gICAgICAgICAgQCByaWdodAorICAgIGFkZCAgICAgICAgIHI3LCByNywgcjE0LCBsc2wgIzExICAgIEAgdGlsZWRfb2Zmc2V0ID0gdGlsZWRfb2Zmc2V0K3RlbXA0KjIwNDgKKyAgICBhZGQgICAgICAgICByMTAsIHIyLCByNyAgICAgICAgICAgICBAIHIxMCA9IG52MTJ0X3NyYyt0aWxlZF9vZmZzZXQKKyAgICBwbGQgICAgICAgICBbcjEwXQorICAgIGJpYyAgICAgICAgIHI2LCByNiwgIzB4RkYgICAgICAgICAgIEAgaiA9IChsZWZ0Pj44KTw8OAorICAgIHBsZCAgICAgICAgIFtyMTAsICMzMl0KKyAgICBhZGQgICAgICAgICByNiwgcjYsICMyNTYgICAgICAgICAgICBAIGogPSBqICsgMjU2CisgICAgc3ViICAgICAgICAgcjExLCByMywgcjEyICAgICAgICAgICAgQCB0ZW1wMiA9IHl1djQyMF93aWR0aC1yaWdodC0yNTYKKyAgICBzdWIgICAgICAgICByMTEsIHIxMSwgIzI1NgorICAgIGNtcCAgICAgICAgIHI2LCByMTEKKyAgICBiZ3QgICAgICAgICBMT09QX0hFSUdIVF8yNTZfV0lEVEhfRU5ECisKK0xPT1BfSEVJR0hUXzI1Nl9XSURUSDoKKyAgICBhZGQgICAgICAgICByMTIsIHIxMCwgIzIwNDggICAgICAgICBAIHIxMiA9IG52MTJ0X3NyYyt0aWxlZF9vZmZzZXQrMjA0OAorICAgIHBsZCAgICAgICAgIFtyMTJdCisgICAgdmxkMi44ICAgICAge3EwLCBxMX0sIFtyMTBdISAgICAgICAgQCBsb2FkIHtudjEydF9zcmMrdGlsZWRfb2Zmc2V0LCA2NH0KKyAgICBwbGQgICAgICAgICBbcjEyLCAjMzJdCisgICAgdmxkMi44ICAgICAge3EyLCBxM30sIFtyMTBdCisKKyAgICBhZGQgICAgICAgICByOCwgcjgsIHIxNCwgbHNsICMxMSAgICBAIHRpbGVkX29mZnNldDEgPSB0aWxlZF9vZmZzZXQxK3RlbXA0KjIwNDgKKyAgICBhZGQgICAgICAgICByMTAsIHIyLCByOCAgICAgICAgICAgICBAIHIxMCA9IG52MTJ0X3NyYyt0aWxlZF9vZmZzZXQxCisgICAgcGxkICAgICAgICAgW3IxMF0KKyAgICB2bGQyLjggICAgICB7cTQsIHE1fSwgW3IxMl0hICAgICAgICBAIGxvYWQge252MTJ0X3NyYyt0aWxlZF9vZmZzZXQrMjA0OCwgNjR9CisgICAgcGxkICAgICAgICAgW3IxMCwgIzMyXQorICAgIHZsZDIuOCAgICAgIHtxNiwgcTd9LCBbcjEyXQorCisgICAgYWRkICAgICAgICAgcjEyLCByMTAsICMyMDQ4ICAgICAgICAgQCByMTIgPSBudjEydF9zcmMrdGlsZWRfb2Zmc2V0KzIwNDgKKyAgICBwbGQgICAgICAgICBbcjEyXQorICAgIHZsZDIuOCAgICAgIHtxOCwgcTl9LCBbcjEwXSEgICAgICAgIEAgbG9hZCB7bnYxMnRfc3JjK3RpbGVkX29mZnNldCsyMDQ4LCA2NH0KKyAgICBwbGQgICAgICAgICBbcjEyLCAjMzJdCisgICAgdmxkMi44ICAgICAge3ExMCwgcTExfSwgW3IxMF0KKworICAgIGFkZCAgICAgICAgIHI3LCByNywgcjE0LCBsc2wgIzExICAgIEAgdGlsZWRfb2Zmc2V0ID0gdGlsZWRfb2Zmc2V0K3RlbXA0KjIwNDgKKyAgICBhZGQgICAgICAgICByMTAsIHIyLCByNworICAgIHBsZCAgICAgICAgIFtyMTBdCisgICAgdmxkMi44ICAgICAge3ExMiwgcTEzfSwgW3IxMl0hICAgICAgQCBsb2FkIHtudjEydF9zcmMrdGlsZWRfb2Zmc2V0KzIwNDgsIDY0fQorICAgIHBsZCAgICAgICAgIFtyMTAsICMzMl0KKyAgICB2bGQyLjggICAgICB7cTE0LCBxMTV9LCBbcjEyXQorCisgICAgYWRkICAgICAgICAgcjEyLCByMCwgcjkgICAgICAgICAgICAgQCByMTIgPSB5dXY0MjBfdV9kZXN0K2xpbmVhcl9vZmZzZXQKKyAgICB2c3QxLjggICAgICB7cTB9LCBbcjEyXSEKKyAgICB2c3QxLjggICAgICB7cTJ9LCBbcjEyXSEKKyAgICB2c3QxLjggICAgICB7cTR9LCBbcjEyXSEKKyAgICB2c3QxLjggICAgICB7cTZ9LCBbcjEyXSEKKyAgICB2c3QxLjggICAgICB7cTh9LCBbcjEyXSEKKyAgICB2c3QxLjggICAgICB7cTEwfSwgW3IxMl0hCisgICAgdnN0MS44ICAgICAge3ExMn0sIFtyMTJdIQorICAgIHZzdDEuOCAgICAgIHtxMTR9LCBbcjEyXSEKKyAgICBhZGQgICAgICAgICByMTIsIHIxLCByOSAgICAgICAgICAgICBAIHIxMiA9IHl1djQyMF92X2Rlc3QrbGluZWFyX29mZnNldAorICAgIHZzdDEuOCAgICAgIHtxMX0sIFtyMTJdIQorICAgIHZzdDEuOCAgICAgIHtxM30sIFtyMTJdIQorICAgIHZzdDEuOCAgICAgIHtxNX0sIFtyMTJdIQorICAgIHZzdDEuOCAgICAgIHtxN30sIFtyMTJdIQorICAgIHZzdDEuOCAgICAgIHtxOX0sIFtyMTJdIQorICAgIHZzdDEuOCAgICAgIHtxMTF9LCBbcjEyXSEKKyAgICB2c3QxLjggICAgICB7cTEzfSwgW3IxMl0hCisgICAgdnN0MS44ICAgICAge3ExNX0sIFtyMTJdIQorICAgIGFkZCAgICAgICAgIHI5LCByOSwgIzEyOCAgICAgICAgICAgIEAgbGluZWFyX29mZnNldCA9IGxpbmVhcl9vZmZzZXQrMTI4CisKKyAgICBhZGQgICAgICAgICByMTIsIHIxMCwgIzIwNDggICAgICAgICBAIHIxMiA9IG52MTJ0X3NyYyt0aWxlZF9vZmZzZXQrMjA0OAorCisgICAgYWRkICAgICAgICAgcjYsIHI2LCAjMjU2ICAgICAgICAgICAgQCBqPWorMjU2CisgICAgY21wICAgICAgICAgcjYsIHIxMSAgICAgICAgICAgICAgICAgQCBqPD10ZW1wMgorICAgIGJsZSAgICAgICAgIExPT1BfSEVJR0hUXzI1Nl9XSURUSAorCitMT09QX0hFSUdIVF8yNTZfV0lEVEhfRU5EOgorCisgICAgYWRkICAgICAgICAgcjgsIHI4LCByMTQsIGxzbCAjMTEgICAgQCB0aWxlZF9vZmZzZXQxID0gdGlsZWRfb2Zmc2V0MSt0ZW1wNCoyMDQ4CisgICAgbGRyICAgICAgICAgcjE0LCBbc3AsICM1Ml0gICAgICAgICAgQCByaWdodAorICAgIHN1YiAgICAgICAgIHIxMSwgcjMsIHI2ICAgICAgICAgICAgIEAgdGVtcDIgPSB5dXY0MjBfd2lkdGgtcmlnaHQtagorICAgIHN1YiAgICAgICAgIHIxMSwgcjExLCByMTQKKyAgICBjbXAgICAgICAgICByMTEsICMwCisgICAgYmVxICAgICAgICAgTE9PUF9IRUlHSFRfMjU2X1JJR0hUX0VORAorICAgIGNtcCAgICAgICAgIHIxMSwgIzE5MgorICAgIGJsZSAgICAgICAgIExPT1BfSEVJR0hUXzI1Nl9SSUdIVF8xOTIKKyAgICBhZGQgICAgICAgICByMTIsIHIxMCwgIzIwNDgKKyAgICBwbGQgICAgICAgICBbcjEyXQorICAgIHZsZDIuOCAgICAgIHtxMCwgcTF9LCBbcjEwXSEgICAgICAgIEAgbG9hZCB7bnYxMnRfc3JjK3RpbGVkX29mZnNldH0KKyAgICBwbGQgICAgICAgICBbcjEyLCAjMzJdCisgICAgdmxkMi44ICAgICAge3EyLCBxM30sIFtyMTBdCisKKyAgICBhZGQgICAgICAgICByMTAsIHIyLCByOCAgICAgICAgICAgICBAIHIxMCA9IG52MTJ0X3NyYyt0aWxlZF9vZmZzZXQxCisgICAgcGxkICAgICAgICAgW3IxMF0KKyAgICB2bGQyLjggICAgICB7cTQsIHE1fSwgW3IxMl0hICAgICAgICBAIGxvYWQge252MTJ0X3NyYyt0aWxlZF9vZmZzZXQrMjA0OH0KKyAgICBwbGQgICAgICAgICBbcjEwLCAjMzJdCisgICAgdmxkMi44ICAgICAge3E2LCBxN30sIFtyMTJdCisKKyAgICBhZGQgICAgICAgICByMTQsIHIxMCwgIzIwNDggICAgICAgICBAIHIxMCA9IG52MTJ0X3NyYyt0aWxlZF9vZmZzZXQxKzIwNDgKKyAgICBwbGQgICAgICAgICBbcjE0XQorICAgIHZsZDIuOCAgICAgIHtxOCwgcTl9LCBbcjEwXSEgICAgICAgIEAgbG9hZCB7bnYxMnRfc3JjK3RpbGVkX29mZnNldDF9CisgICAgcGxkICAgICAgICAgW3IxNCwgIzMyXQorICAgIHZsZDIuOCAgICAgIHtxMTAsIHExMX0sIFtyMTBdCisKKyAgICBhZGQgICAgICAgICByMTIsIHIwLCByOSAgICAgICAgICAgICBAIHIxMiA9IHl1djQyMF91X2Rlc3QrbGluZWFyX29mZnNldAorICAgIHZzdDEuOCAgICAgIHtxMH0sIFtyMTJdIQorICAgIHZzdDEuOCAgICAgIHtxMn0sIFtyMTJdIQorICAgIHZzdDEuOCAgICAgIHtxNH0sIFtyMTJdIQorICAgIHZzdDEuOCAgICAgIHtxNn0sIFtyMTJdIQorICAgIHZzdDEuOCAgICAgIHtxOH0sIFtyMTJdIQorICAgIHZzdDEuOCAgICAgIHtxMTB9LCBbcjEyXSEKKyAgICBhZGQgICAgICAgICByMTIsIHIxLCByOSAgICAgICAgICAgICBAIHIxMiA9IHl1djQyMF92X2Rlc3QrbGluZWFyX29mZnNldAorICAgIHZzdDEuOCAgICAgIHtxMX0sIFtyMTJdIQorICAgIHZzdDEuOCAgICAgIHtxM30sIFtyMTJdIQorICAgIHZzdDEuOCAgICAgIHtxNX0sIFtyMTJdIQorICAgIHZzdDEuOCAgICAgIHtxN30sIFtyMTJdIQorICAgIHZzdDEuOCAgICAgIHtxOX0sIFtyMTJdIQorICAgIHZzdDEuOCAgICAgIHtxMTF9LCBbcjEyXSEKKyAgICBhZGQgICAgICAgICByOSwgcjksICM5NiAgICAgICAgICAgIEAgbGluZWFyX29mZnNldCA9IGxpbmVhcl9vZmZzZXQrOTYKKworICAgIHN0bWZkICAgICAgIHNwISwge3I4LXIxMiwgcjE0fSAgICAgIEAgYmFja3VwIHJlZ2lzdGVycworICAgIHN1YiAgICAgICAgIHIxMCwgcjExLCAjMTkyCisgICAgbW92ICAgICAgICAgcjExLCByMTQKKyAgICBibCAgICAgICAgICBJTlRFUkxFQVZFRF9NRU1DT1BZX1VOREVSXzY0CisgICAgbGRtZmQgICAgICAgc3AhLCB7cjgtcjEyLCByMTR9ICAgICAgQCByZXN0b3JlIHJlZ2lzdGVycworICAgIGIgICAgICAgICAgIExPT1BfSEVJR0hUXzI1Nl9SSUdIVF9FTkQKKworTE9PUF9IRUlHSFRfMjU2X1JJR0hUXzE5MjoKKyAgICBjbXAgICAgICAgICByMTEsICMxMjgKKyAgICBibGUgICAgICAgICBMT09QX0hFSUdIVF8yNTZfUklHSFRfMTI4CisgICAgYWRkICAgICAgICAgcjEyLCByMTAsICMyMDQ4CisgICAgcGxkICAgICAgICAgW3IxMl0KKyAgICB2bGQyLjggICAgICB7cTAsIHExfSwgW3IxMF0hICAgICAgICBAIGxvYWQge252MTJ0X3NyYyt0aWxlZF9vZmZzZXR9CisgICAgcGxkICAgICAgICAgW3IxMiwgIzMyXQorICAgIHZsZDIuOCAgICAgIHtxMiwgcTN9LCBbcjEwXQorCisgICAgYWRkICAgICAgICAgcjE0LCByMiwgcjggICAgICAgICAgICAgQCByMTAgPSBudjEydF9zcmMrdGlsZWRfb2Zmc2V0MQorICAgIHBsZCAgICAgICAgIFtyMTRdCisgICAgdmxkMi44ICAgICAge3E0LCBxNX0sIFtyMTJdISAgICAgICAgQCBsb2FkIHtudjEydF9zcmMrdGlsZWRfb2Zmc2V0KzIwNDh9CisgICAgcGxkICAgICAgICAgW3IxNCwgIzMyXQorICAgIHZsZDIuOCAgICAgIHtxNiwgcTd9LCBbcjEyXQorCisgICAgYWRkICAgICAgICAgcjEyLCByMCwgcjkgICAgICAgICAgICAgQCByMTIgPSB5dXY0MjBfdV9kZXN0K2xpbmVhcl9vZmZzZXQKKyAgICB2c3QxLjggICAgICB7cTB9LCBbcjEyXSEKKyAgICB2c3QxLjggICAgICB7cTJ9LCBbcjEyXSEKKyAgICB2c3QxLjggICAgICB7cTR9LCBbcjEyXSEKKyAgICB2c3QxLjggICAgICB7cTZ9LCBbcjEyXSEKKyAgICBhZGQgICAgICAgICByMTIsIHIxLCByOSAgICAgICAgICAgICBAIHIxMiA9IHl1djQyMF92X2Rlc3QrbGluZWFyX29mZnNldAorICAgIHZzdDEuOCAgICAgIHtxMX0sIFtyMTJdIQorICAgIHZzdDEuOCAgICAgIHtxM30sIFtyMTJdIQorICAgIHZzdDEuOCAgICAgIHtxNX0sIFtyMTJdIQorICAgIHZzdDEuOCAgICAgIHtxN30sIFtyMTJdIQorICAgIGFkZCAgICAgICAgIHI5LCByOSwgIzY0ICAgICAgICAgICAgQCBsaW5lYXJfb2Zmc2V0ID0gbGluZWFyX29mZnNldCs2NAorCisgICAgc3RtZmQgICAgICAgc3AhLCB7cjgtcjEyLCByMTR9ICAgICAgQCBiYWNrdXAgcmVnaXN0ZXJzCisgICAgc3ViICAgICAgICAgcjEwLCByMTEsICMxMjgKKyAgICBtb3YgICAgICAgICByMTEsIHIxNAorICAgIGJsICAgICAgICAgIElOVEVSTEVBVkVEX01FTUNPUFlfVU5ERVJfNjQKKyAgICBsZG1mZCAgICAgICBzcCEsIHtyOC1yMTIsIHIxNH0gICAgICBAIHJlc3RvcmUgcmVnaXN0ZXJzCisgICAgYiAgICAgICAgICAgTE9PUF9IRUlHSFRfMjU2X1JJR0hUX0VORAorCitMT09QX0hFSUdIVF8yNTZfUklHSFRfMTI4OgorICAgIGNtcCAgICAgICAgIHIxMSwgIzY0CisgICAgYmxlICAgICAgICAgTE9PUF9IRUlHSFRfMjU2X1JJR0hUXzY0CisgICAgYWRkICAgICAgICAgcjE0LCByMTAsICMyMDQ4CisgICAgcGxkICAgICAgICAgW3IxNF0KKyAgICB2bGQyLjggICAgICB7cTAsIHExfSwgW3IxMF0hICAgICAgICBAIGxvYWQge252MTJ0X3NyYyt0aWxlZF9vZmZzZXR9CisgICAgcGxkICAgICAgICAgW3IxNCwgIzMyXQorICAgIHZsZDIuOCAgICAgIHtxMiwgcTN9LCBbcjEwXQorCisgICAgYWRkICAgICAgICAgcjEyLCByMCwgcjkgICAgICAgICAgICAgQCByMTIgPSB5dXY0MjBfdV9kZXN0K2xpbmVhcl9vZmZzZXQKKyAgICB2c3QxLjggICAgICB7cTB9LCBbcjEyXSEKKyAgICB2c3QxLjggICAgICB7cTJ9LCBbcjEyXSEKKyAgICBhZGQgICAgICAgICByMTIsIHIxLCByOSAgICAgICAgICAgICBAIHIxMiA9IHl1djQyMF92X2Rlc3QrbGluZWFyX29mZnNldAorICAgIHZzdDEuOCAgICAgIHtxMX0sIFtyMTJdIQorICAgIHZzdDEuOCAgICAgIHtxM30sIFtyMTJdIQorICAgIGFkZCAgICAgICAgIHI5LCByOSwgIzMyICAgICAgICAgICAgQCBsaW5lYXJfb2Zmc2V0ID0gbGluZWFyX29mZnNldCszMgorCisgICAgc3RtZmQgICAgICAgc3AhLCB7cjgtcjEyLCByMTR9ICAgICAgQCBiYWNrdXAgcmVnaXN0ZXJzCisgICAgc3ViICAgICAgICAgcjEwLCByMTEsICM2NAorICAgIG1vdiAgICAgICAgIHIxMSwgcjE0CisgICAgYmwgICAgICAgICAgSU5URVJMRUFWRURfTUVNQ09QWV9VTkRFUl82NAorICAgIGxkbWZkICAgICAgIHNwISwge3I4LXIxMiwgcjE0fSAgICAgIEAgcmVzdG9yZSByZWdpc3RlcnMKKyAgICBiICAgICAgICAgICBMT09QX0hFSUdIVF8yNTZfUklHSFRfRU5ECisKK0xPT1BfSEVJR0hUXzI1Nl9SSUdIVF82NDoKKyAgICBzdG1mZCAgICAgICBzcCEsIHtyOC1yMTIsIHIxNH0gICAgICBAIGJhY2t1cCByZWdpc3RlcnMKKyAgICBtb3YgICAgICAgICByMTQsIHIxMQorICAgIG1vdiAgICAgICAgIHIxMSwgcjEwCisgICAgbW92ICAgICAgICAgcjEwLCByMTQKKyAgICBibCAgICAgICAgICBJTlRFUkxFQVZFRF9NRU1DT1BZX1VOREVSXzY0CisgICAgbGRtZmQgICAgICAgc3AhLCB7cjgtcjEyLCByMTR9ICAgICAgQCByZXN0b3JlIHJlZ2lzdGVycworCitMT09QX0hFSUdIVF8yNTZfUklHSFRfRU5EOgorCisgICAgbGRyICAgICAgICAgcjE0LCBbc3AsICM1Nl0gICAgICAgICAgQCBidXR0b20KKyAgICBhZGQgICAgICAgICByNSwgcjUsICMxICAgICAgICAgICAgICBAIGk9aSsxCisgICAgc3ViICAgICAgICAgcjE0LCByNCwgcjE0ICAgICAgICAgICAgQCBpPHl1djQyMF9oZWlnaHQtYnV0dG9tCisgICAgY21wICAgICAgICAgcjUsIHIxNAorICAgIGJsdCAgICAgICAgIExPT1BfSEVJR0hUXzI1NgorICAgIGIgICAgICAgICAgIFJFU1RPUkVfUkVHCisKK0xPT1BfSEVJR0hUXzY0X1NUQVJUOgorICAgIGNtcCAgICAgICAgIHIxMCwgIzY0ICAgICAgICAgICAgICAgIEAgaWYgKHRlbXAxID49IDY0KQorICAgIGJsdCAgICAgICAgIExPT1BfSEVJR0hUXzJfU1RBUlQKKworICAgIGxkciAgICAgICAgIHI1LCBbc3AsICM0OF0gICAgICAgICAgIEAgaSA9IHRvcAorTE9PUF9IRUlHSFRfNjQ6CisgICAgbGRyICAgICAgICAgcjYsIFtzcCwgIzQ0XSAgICAgICAgICAgQCBqID0gbGVmdAorICAgIHN0bWZkICAgICAgIHNwISwge3IwLXIzLCByMTJ9ICAgICAgIEAgYmFja3VwIHBhcmFtZXRlcnMKKyAgICBtb3YgICAgICAgICByMCwgcjMKKyAgICBtb3YgICAgICAgICByMSwgcjQKKyAgICBtb3YgICAgICAgICByMiwgcjYKKyAgICBtb3YgICAgICAgICByMywgcjUKKyAgICBibCAgICAgICAgICB0aWxlXzR4Ml9yZWFkX2FzbQorICAgIG1vdiAgICAgICAgIHI3LCByMAorICAgIGxkbWZkICAgICAgIHNwISwge3IwLXIzLCByMTJ9ICAgICAgIEAgcmVzdG9yZSBwYXJhbWV0ZXJzCisgICAgbGRyICAgICAgICAgcjksIFtzcCwgIzQ4XSAgICAgICAgICAgQCBsaW5lYXJfb2Zmc2V0ID0gdG9wCisgICAgbGRyICAgICAgICAgcjEyLCBbc3AsICM1Ml0gICAgICAgICAgQCByMTIgPSByaWdodAorICAgIGFkZCAgICAgICAgIHIxMSwgcjYsICM2NCAgICAgICAgICAgIEAgdGVtcDIgPSAoKGorNjQpPj42KTw8NgorICAgIGJpYyAgICAgICAgIHIxMSwgcjExLCAjMHgzRgorICAgIHN1YiAgICAgICAgIHIxMSwgcjExLCByNiAgICAgICAgICAgIEAgdGVtcDIgPSB0ZW1wMi1qCisgICAgc3ViICAgICAgICAgcjEyLCByMywgcjEyICAgICAgICAgICAgQCB0ZW1wMyA9IHl1djQyMF93aWR0aC1yaWdodAorICAgIHN1YiAgICAgICAgIHIxNCwgcjEyLCByNiAgICAgICAgICAgIEAgdGVtcDQgPSB0ZW1wMy1sZWZ0CisgICAgc3ViICAgICAgICAgcjksIHI1LCByOSAgICAgICAgICAgICAgQCBsaW5lYXJfb2Zmc2V0ID0gdGVtcDQqKGktdG9wKS8yCisgICAgbXVsICAgICAgICAgcjksIHI5LCByMTQKKyAgICBtb3YgICAgICAgICByOSwgcjksIGFzciAjMQorICAgIGFuZCAgICAgICAgIHIxNCwgcjYsICMweDMgICAgICAgICAgIEAgdGVtcDQgPSBqJjB4MworICAgIGFkZCAgICAgICAgIHI3LCByNywgcjE0ICAgICAgICAgICAgIEAgdGlsZWRfb2Zmc2V0ID0gdGlsZWRfb2Zmc2V0K3RlbXA0CisgICAgc3RtZmQgICAgICAgc3AhLCB7cjktcjEyfSAgICAgICAgICAgQCBiYWNrdXAgcGFyYW1ldGVycworICAgIG1vdiAgICAgICAgIHIxMCwgcjExCisgICAgYWRkICAgICAgICAgcjExLCByMiwgcjcKKyAgICBibCAgICAgICAgICBJTlRFUkxFQVZFRF9NRU1DT1BZX1VOREVSXzY0CisgICAgbGRtZmQgICAgICAgc3AhLCB7cjktcjEyfSAgICAgICAgICAgQCByZXN0b3JlIHBhcmFtZXRlcnMKKyAgICBhZGQgICAgICAgICByOSwgcjksIHIxMSwgYXNyICMxICAgICBAIGxpbmVhcl9vZmZzZXQgPSBsaW5lYXJfb2Zmc2V0K3RlbXAyLzIKKyAgICBhZGQgICAgICAgICByNiwgcjYsIHIxMSAgICAgICAgICAgICBAIGogPSBqK3RlbXAyQAorCisgICAgYWRkICAgICAgICAgcjE0LCByNiwgIzY0CisgICAgY21wICAgICAgICAgcjE0LCByMTIKKyAgICBiZ3QgICAgICAgICBMT09QX0hFSUdIVF82NF8xCisgICAgc3RtZmQgICAgICAgc3AhLCB7cjAtcjMsIHIxMn0gICAgICAgQCBiYWNrdXAgcGFyYW1ldGVycworICAgIG1vdiAgICAgICAgIHIwLCByMworICAgIG1vdiAgICAgICAgIHIxLCByNAorICAgIG1vdiAgICAgICAgIHIyLCByNgorICAgIG1vdiAgICAgICAgIHIzLCByNQorICAgIGJsICAgICAgICAgIHRpbGVfNHgyX3JlYWRfYXNtCisgICAgbW92ICAgICAgICAgcjcsIHIwCisgICAgbGRtZmQgICAgICAgc3AhLCB7cjAtcjMsIHIxMn0gICAgICAgQCByZXN0b3JlIHBhcmFtZXRlcnMKKyAgICBhZGQgICAgICAgICByNywgcjIsIHI3CisgICAgdmxkMi44ICAgICAge3EwLCBxMX0sIFtyN10hCisgICAgdmxkMi44ICAgICAge3EyLCBxM30sIFtyN10KKyAgICBhZGQgICAgICAgICByNywgcjAsIHI5CisgICAgdnN0MS44ICAgICAge3EwfSwgW3I3XSEKKyAgICB2c3QxLjggICAgICB7cTJ9LCBbcjddCisgICAgYWRkICAgICAgICAgcjcsIHIxLCByOQorICAgIHZzdDEuOCAgICAgIHtxMX0sIFtyN10hCisgICAgdnN0MS44ICAgICAge3EzfSwgW3I3XQorICAgIGFkZCAgICAgICAgIHI5LCByOSwgIzMyCisgICAgYWRkICAgICAgICAgcjYsIHI2LCAjNjQKKworTE9PUF9IRUlHSFRfNjRfMToKKyAgICBhZGQgICAgICAgICByMTQsIHI2LCAjNjQKKyAgICBjbXAgICAgICAgICByMTQsIHIxMgorICAgIGJndCAgICAgICAgIExPT1BfSEVJR0hUXzY0XzIKKyAgICBzdG1mZCAgICAgICBzcCEsIHtyMC1yMywgcjEyfSAgICAgICBAIGJhY2t1cCBwYXJhbWV0ZXJzCisgICAgbW92ICAgICAgICAgcjAsIHIzCisgICAgbW92ICAgICAgICAgcjEsIHI0CisgICAgbW92ICAgICAgICAgcjIsIHI2CisgICAgbW92ICAgICAgICAgcjMsIHI1CisgICAgYmwgICAgICAgICAgdGlsZV80eDJfcmVhZF9hc20KKyAgICBtb3YgICAgICAgICByNywgcjAKKyAgICBsZG1mZCAgICAgICBzcCEsIHtyMC1yMywgcjEyfSAgICAgICBAIHJlc3RvcmUgcGFyYW1ldGVycworICAgIGFkZCAgICAgICAgIHI3LCByMiwgcjcKKyAgICB2bGQyLjggICAgICB7cTAsIHExfSwgW3I3XSEKKyAgICB2bGQyLjggICAgICB7cTIsIHEzfSwgW3I3XQorICAgIGFkZCAgICAgICAgIHI3LCByMCwgcjkKKyAgICB2c3QxLjggICAgICB7cTB9LCBbcjddIQorICAgIHZzdDEuOCAgICAgIHtxMn0sIFtyN10KKyAgICBhZGQgICAgICAgICByNywgcjEsIHI5CisgICAgdnN0MS44ICAgICAge3ExfSwgW3I3XSEKKyAgICB2c3QxLjggICAgICB7cTN9LCBbcjddCisgICAgYWRkICAgICAgICAgcjksIHI5LCAjMzIKKyAgICBhZGQgICAgICAgICByNiwgcjYsICM2NAorCitMT09QX0hFSUdIVF82NF8yOgorICAgIGNtcCAgICAgICAgIHI2LCByMTIKKyAgICBiZ2UgICAgICAgICBMT09QX0hFSUdIVF82NF8zCisgICAgc3RtZmQgICAgICAgc3AhLCB7cjAtcjMsIHIxMn0gICAgICAgQCBiYWNrdXAgcGFyYW1ldGVycworICAgIG1vdiAgICAgICAgIHIwLCByMworICAgIG1vdiAgICAgICAgIHIxLCByNAorICAgIG1vdiAgICAgICAgIHIyLCByNgorICAgIG1vdiAgICAgICAgIHIzLCByNQorICAgIGJsICAgICAgICAgIHRpbGVfNHgyX3JlYWRfYXNtCisgICAgbW92ICAgICAgICAgcjcsIHIwCisgICAgbGRtZmQgICAgICAgc3AhLCB7cjAtcjMsIHIxMn0gICAgICAgQCByZXN0b3JlIHBhcmFtZXRlcnMKKyAgICBzdWIgICAgICAgICByMTEsIHIxMiwgcjYKKyAgICBzdG1mZCAgICAgICBzcCEsIHtyOS1yMTJ9ICAgICAgICAgICBAIGJhY2t1cCBwYXJhbWV0ZXJzCisgICAgbW92ICAgICAgICAgcjEwLCByMTEKKyAgICBhZGQgICAgICAgICByMTEsIHIyLCByNworICAgIGJsICAgICAgICAgIElOVEVSTEVBVkVEX01FTUNPUFlfVU5ERVJfNjQKKyAgICBsZG1mZCAgICAgICBzcCEsIHtyOS1yMTJ9ICAgICAgICAgICBAIHJlc3RvcmUgcGFyYW1ldGVycworCitMT09QX0hFSUdIVF82NF8zOgorCisgICAgbGRyICAgICAgICAgcjE0LCBbc3AsICM1Nl0gICAgICAgICAgQCBidXR0b20KKyAgICBhZGQgICAgICAgICByNSwgcjUsICMxICAgICAgICAgICAgICBAIGk9aSsxCisgICAgc3ViICAgICAgICAgcjE0LCByNCwgcjE0ICAgICAgICAgICAgQCBpPHl1djQyMF9oZWlnaHQtYnV0dG9tCisgICAgY21wICAgICAgICAgcjUsIHIxNAorICAgIGJsdCAgICAgICAgIExPT1BfSEVJR0hUXzY0CisgICAgYiAgICAgICAgICAgUkVTVE9SRV9SRUcKKworTE9PUF9IRUlHSFRfMl9TVEFSVDoKKworICAgIGxkciAgICAgICAgIHI1LCBbc3AsICM0OF0gICAgICAgICAgIEAgaSA9IHRvcAorTE9PUF9IRUlHSFRfMjoKKworICAgIGxkciAgICAgICAgIHIxMiwgW3NwLCAjNTJdICAgICAgICAgIEAgbGluZWFyX29mZnNldCA9IHJpZ2h0CisgICAgbGRyICAgICAgICAgcjYsIFtzcCwgIzQ0XSAgICAgICAgICAgQCBqID0gbGVmdAorICAgIGxkciAgICAgICAgIHI5LCBbc3AsICM0OF0gICAgICAgICAgIEAgbGluZWFyX29mZnNldCA9IHRvcAorCisgICAgc3ViICAgICAgICAgcjEyLCByMywgcjEyICAgICAgICAgICAgQCB0ZW1wMyA9IHl1djQyMF93aWR0aC1yaWdodAorICAgIHN1YiAgICAgICAgIHIxNCwgcjEyLCByNiAgICAgICAgICAgIEAgdGVtcDQgPSB0ZW1wMy1sZWZ0QAorICAgIHN1YiAgICAgICAgIHI5LCByNSwgcjkgICAgICAgICAgICAgIEAgcjkgPSBpLXRvcAorICAgIG11bCAgICAgICAgIHI5LCByMTQsIHI5ICAgICAgICAgICAgIEAgdGVtcDQqKGktdG9wKQorICAgIG1vdiAgICAgICAgIHI5LCByOSwgbHNyICMxICAgICAgICAgIEAgbGluZWFyX29mZnNldCA9IHRlbXA0KihpLXRvcCkvMgorICAgIGFkZCAgICAgICAgIHIxMSwgcjAsIHI5CisgICAgYWRkICAgICAgICAgcjEyLCByMSwgcjkKK0xPT1BfSEVJR0hUXzJfV0lEVEg6CisgICAgc3RtZmQgICAgICAgc3AhLCB7cjAtcjMsIHIxMn0gICAgICAgQCBiYWNrdXAgcGFyYW1ldGVycworICAgIG1vdiAgICAgICAgIHIwLCByMgorICAgIG1vdiAgICAgICAgIHIxLCByMworICAgIG1vdiAgICAgICAgIHIyLCByNgorICAgIG1vdiAgICAgICAgIHIzLCByNQorICAgIGJsICAgICAgICAgIHRpbGVfNHgyX3JlYWRfYXNtCisgICAgbW92ICAgICAgICAgcjcsIHIwCisgICAgbGRtZmQgICAgICAgc3AhLCB7cjAtcjMsIHIxMn0gICAgICAgQCByZXN0b3JlIHBhcmFtZXRlcnMKKworICAgIGFuZCAgICAgICAgIHIxNCwgcjYsICMweDMgICAgICAgICAgIEAgdGVtcDQgPSBqJjB4M0AKKyAgICBhZGQgICAgICAgICByNywgcjcsIHIxNCAgICAgICAgICAgICBAIHRpbGVkX29mZnNldCA9IHRpbGVkX29mZnNldCt0ZW1wNEAKKyAgICBhZGQgICAgICAgICByNywgcjIsIHI3CisKKyAgICBsZHJoICAgICAgICByMTQsIFtyN10KKyAgICBzdHJiICAgICAgICByMTQsIFtyMTFdLCAjMQorICAgIG1vdiAgICAgICAgIHIxNCwgcjE0LCBsc3IgIzgKKyAgICBzdHJiICAgICAgICByMTQsIFtyMTJdLCAjMQorCisgICAgbGRyICAgICAgICAgcjE0LCBbc3AsICM1Ml0gICAgICAgICAgQCByaWdodAorICAgIGFkZCAgICAgICAgIHI2LCByNiwgIzIgICAgICAgICAgICAgIEAgaj1qKzIKKyAgICBzdWIgICAgICAgICByMTQsIHIzLCByMTQgICAgICAgICAgICBAIGo8eXV2NDIwX3dpZHRoLXJpZ2h0CisgICAgY21wICAgICAgICAgcjYsIHIxNAorICAgIGJsdCAgICAgICAgIExPT1BfSEVJR0hUXzJfV0lEVEgKKworICAgIGxkciAgICAgICAgIHIxNCwgW3NwLCAjNTZdICAgICAgICAgIEAgYnV0dG9tCisgICAgYWRkICAgICAgICAgcjUsIHI1LCAjMSAgICAgICAgICAgICAgQCBpPWkrMQorICAgIHN1YiAgICAgICAgIHIxNCwgcjQsIHIxNCAgICAgICAgICAgIEAgaTx5dXY0MjBfaGVpZ2h0LWJ1dHRvbQorICAgIGNtcCAgICAgICAgIHI1LCByMTQKKyAgICBibHQgICAgICAgICBMT09QX0hFSUdIVF8yCisKK1JFU1RPUkVfUkVHOgorICAgIGxkbWZkICAgICAgIHNwISwge3I0LXIxMixyMTV9ICAgICAgIEAgcmVzdG9yZSByZWdpc3RlcnMKKworSU5URVJMRUFWRURfTUVNQ09QWV9VTkRFUl82NDogICAgICAgICAgIEAgY291bnQ9cjEwLCBzcmM9cjExCisgICAgY21wICAgICAgICAgcjEwLCAjMzIKKyAgICBibHQgICAgICAgICBJTlRFUkxFQVZFRF9NRU1DT1BZX1VOREVSXzMyCisgICAgdmxkMi44ICAgICAge3EwLCBxMX0sIFtyMTFdISAgICAgICAgQCBsb2FkIHtudjEydF9zcmMrdGlsZWRfb2Zmc2V0K3RlbXAxLCA2NH0KKyAgICBzdWIgICAgICAgICByMTAsIHIxMCwgIzMyCisgICAgY21wICAgICAgICAgcjEwLCAjMAorICAgIGFkZCAgICAgICAgIHIxMiwgcjAsIHI5ICAgICAgICAgICAgICBAIHIxMiA9IHl1djQyMF91X2Rlc3QrbGluZWFyX29mZnNldAorICAgIHZzdDEuOCAgICAgIHtxMH0sIFtyMTJdICAgICAgICAgICAgIEAgbG9hZCB7bnYxMnRfc3JjK3RpbGVkX29mZnNldCt0ZW1wMSwgNjR9CisgICAgYWRkICAgICAgICAgcjEyLCByMSwgcjkgICAgICAgICAgICAgIEAgcjEyID0geXV2NDIwX3ZfZGVzdCtsaW5lYXJfb2Zmc2V0CisgICAgdnN0MS44ICAgICAge3ExfSwgW3IxMl0gICAgICAgICAgICAgQCBsb2FkIHtudjEydF9zcmMrdGlsZWRfb2Zmc2V0K3RlbXAxLCA2NH0KKyAgICBhZGQgICAgICAgICByOSwgcjksICMxNgorICAgIGJlcSAgICAgICAgIElOVEVSTEVBVkVEX01FTUNPUFlfVU5ERVJfRU5ECitJTlRFUkxFQVZFRF9NRU1DT1BZX1VOREVSXzMyOgorICAgIGNtcCAgICAgICAgIHIxMCwgIzE2CisgICAgYmx0ICAgICAgICAgSU5URVJMRUFWRURfTUVNQ09QWV9VTkRFUl8xNgorICAgIHZsZDIuOCAgICAgIHtxMH0sIFtyMTFdISAgICAgICAgICAgIEAgbG9hZCB7bnYxMnRfc3JjK3RpbGVkX29mZnNldCt0ZW1wMSwgNjR9CisgICAgc3ViICAgICAgICAgcjEwLCByMTAsICMxNgorICAgIGNtcCAgICAgICAgIHIxMCwgIzAKKyAgICBhZGQgICAgICAgICByMTIsIHIwLCByOSAgICAgICAgICAgICAgQCByMTIgPSB5dXY0MjBfdV9kZXN0K2xpbmVhcl9vZmZzZXQKKyAgICB2c3QxLjggICAgICB7ZDB9LCBbcjEyXSEgICAgICAgICAgICAgQCBsb2FkIHtudjEydF9zcmMrdGlsZWRfb2Zmc2V0K3RlbXAxLCA2NH0KKyAgICBhZGQgICAgICAgICByMTIsIHIxLCByOSAgICAgICAgICAgICAgQCByMTIgPSB5dXY0MjBfdl9kZXN0K2xpbmVhcl9vZmZzZXQKKyAgICB2c3QxLjggICAgICB7ZDF9LCBbcjEyXSEgICAgICAgICAgICAgQCBsb2FkIHtudjEydF9zcmMrdGlsZWRfb2Zmc2V0K3RlbXAxLCA2NH0KKyAgICBhZGQgICAgICAgICByOSwgcjksICM4CisgICAgYmVxICAgICAgICAgSU5URVJMRUFWRURfTUVNQ09QWV9VTkRFUl9FTkQKK0lOVEVSTEVBVkVEX01FTUNPUFlfVU5ERVJfMTY6CisgICAgbGRyaCAgICAgICAgcjEyLCBbcjExXSwgIzIKKyAgICBhZGQgICAgICAgICByOCwgcjAsIHI5ICAgICAgICAgICAgICBAIHI4ID0geXV2NDIwX3VfZGVzdCtsaW5lYXJfb2Zmc2V0CisgICAgc3RyYiAgICAgICAgcjEyLCBbcjhdCisgICAgYWRkICAgICAgICAgcjgsIHIxLCByOSAgICAgICAgICAgICAgQCByOCA9IHl1djQyMF92X2Rlc3QrbGluZWFyX29mZnNldAorICAgIG1vdiAgICAgICAgIHIxMiwgcjEyLCBsc3IgIzgKKyAgICBzdHJiICAgICAgICByMTIsIFtyOF0KKyAgICBzdWJzICAgICAgICByMTAsIHIxMCwgIzIKKyAgICBhZGQgICAgICAgICByOSwgcjksICMxCisgICAgYm5lICAgICAgICAgSU5URVJMRUFWRURfTUVNQ09QWV9VTkRFUl8xNgorCitJTlRFUkxFQVZFRF9NRU1DT1BZX1VOREVSX0VORDoKKyAgICBhbmQgICAgICAgICByMTAsIHI2LCAjMHgzRiAgICAgICAgICBAIHRlbXAxID0gbGVmdCg9PWopJjB4M0YKKyAgICBjbXAgICAgICAgICByMTAsICMwCisgICAgbW92ICAgICAgICAgcGMsIGxyCisKK3RpbGVfNHgyX3JlYWRfYXNtOgorTEZCMDoKKyAgICBhZGQgICAgIGlwLCByMywgIzMyCisgICAgc3ViICAgICByMCwgcjAsICMxCisgICAgY21wICAgICByMSwgaXAKKyAgICBjbXBsZSAgIHIzLCByMQorICAgIG1vdiAgICAgaXAsIHIyLCBhc3IgIzIKKyAgICBtb3YgICAgIHIwLCByMCwgYXNyICM3CisgICAgc3RtZmQgICBzcCEsIHtyNCwgcjUsIGxyfQorTENGSTA6CisgICAgYWRkICAgICByMCwgcjAsICMxCisgICAgYmdlICAgICBMMgorICAgIHN1YiAgICAgcjEsIHIxLCAjMQorICAgIHRzdCAgICAgcjEsICMzMgorICAgIGJuZSAgICAgTDIKKyAgICB0c3QgICAgIHIzLCAjMzIKKyAgICBibmUgICAgIEwyCisgICAgbW92ICAgICByNCwgcjIsIGFzciAjNworICAgIGFuZCAgICAgcjEsIHIzLCAjMzEKKyAgICBlb3IgICAgIHI0LCByNCwgcjMsIGFzciAjNQorICAgIHViZnggICAgcjMsIHIzLCAjNiwgIzgKKyAgICB0c3QgICAgIHI0LCAjMQorICAgIHViZnggICAgcjQsIHIyLCAjOCwgIzYKKyAgICBhbmQgICAgIGlwLCBpcCwgIzE1CisgICAgbW92ICAgICByMiwgcjIsIGFzciAjNgorICAgIG1sYSAgICAgcjMsIHIwLCByMywgcjQKKyAgICBvcnIgICAgIHIxLCBpcCwgcjEsIGFzbCAjNAorICAgIGIgICAgICAgTDkKK0wyOgorICAgIG1vdiAgICAgcjIsIGlwLCBhc3IgIzUKKyAgICBhbmQgICAgIHI0LCByMywgIzMxCisgICAgZW9yICAgICByMSwgcjIsIHIzLCBhc3IgIzUKKyAgICBhbmQgICAgIHI1LCByMiwgIzEyNworICAgIHViZnggICAgcjMsIHIzLCAjNiwgIzgKKyAgICB0c3QgICAgIHIxLCAjMQorICAgIGFuZCAgICAgcjEsIGlwLCAjMTUKKyAgICBtb3YgICAgIHIyLCBpcCwgYXNyICM0CisgICAgbWxhICAgICByMywgcjAsIHIzLCByNQorICAgIG9yciAgICAgcjEsIHIxLCByNCwgYXNsICM0CitMOToKKyAgICBhbmRuZSAgIHIyLCByMiwgIzEKKyAgICBhbmRlcSAgIHIyLCByMiwgIzEKKyAgICBvcnJuZSAgIHIyLCByMiwgIzIKKyAgICBtb3YgICAgIHIxLCByMSwgYXNsICMyCisgICAgb3JyICAgICByMywgcjEsIHIzLCBhc2wgIzEzCisgICAgb3JyICAgICByMCwgcjMsIHIyLCBhc2wgIzExCisgICAgbGRtZmQgICBzcCEsIHtyNCwgcjUsIHBjfQorTEZFMDoKKyAgICAuZm5lbmQKKwpkaWZmIC0tZ2l0IGEvZXh5bm9zNC9oYWwvbGlic3djb252ZXJ0ZXIvc3djb252ZXJ0b3IuYyBiL2V4eW5vczQvaGFsL2xpYnN3Y29udmVydGVyL3N3Y29udmVydG9yLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDQzYWRkMgotLS0gL2Rldi9udWxsCisrKyBiL2V4eW5vczQvaGFsL2xpYnN3Y29udmVydGVyL3N3Y29udmVydG9yLmMKQEAgLTAsMCArMSwxODI4IEBACisvKgorICoKKyAqIENvcHlyaWdodCAyMDEyIFNhbXN1bmcgRWxlY3Ryb25pY3MgUy5MU0kgQ28uIExURAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisvKgorICogQGZpbGUgICAgc3djb252ZXJ0b3IuYworICoKKyAqIEBicmllZiAgIFNFQ19PTVggc3BlY2lmaWMgZGVmaW5lCisgKgorICogQGF1dGhvciAgU2hpbldvbiBMZWUgKHNoaW53b24ubGVlQHNhbXN1bmcuY29tKQorICoKKyAqIEB2ZXJzaW9uIDEuMAorICoKKyAqIEBoaXN0b3J5CisgKiAgIDIwMTIuMDIuMDEgOiBDcmVhdGUKKyAqLworCisjaW5jbHVkZSAic3RkaW8uaCIKKyNpbmNsdWRlICJzdGRsaWIuaCIKKyNpbmNsdWRlICJzd2NvbnZlcnRlci5oIgorCisvKgorICogR2V0IHRpbGVkIGFkZHJlc3Mgb2YgcG9zaXRpb24oeCx5KQorICoKKyAqIEBwYXJhbSB4X3NpemUKKyAqICAgd2lkdGggb2YgdGlsZWRbaW5dCisgKgorICogQHBhcmFtIHlfc2l6ZQorICogICBoZWlnaHQgb2YgdGlsZWRbaW5dCisgKgorICogQHBhcmFtIHhfcG9zCisgKiAgIHggcG9zaXRpb24gb2YgdGllbGRbaW5dCisgKgorICogQHBhcmFtIHNyY19zaXplCisgKiAgIHkgcG9zaXRpb24gb2YgdGllbGRbaW5dCisgKgorICogQHJldHVybgorICogICBhZGRyZXNzIG9mIHRpbGVkIGRhdGEKKyAqLworc3RhdGljIGludCB0aWxlXzR4Ml9yZWFkKGludCB4X3NpemUsIGludCB5X3NpemUsIGludCB4X3BvcywgaW50IHlfcG9zKQoreworICAgIGludCBwaXhlbF94X20xLCBwaXhlbF95X20xOworICAgIGludCByb3VuZHVwX3gsIHJvdW5kdXBfeTsKKyAgICBpbnQgbGluZWFyX2FkZHIwLCBsaW5lYXJfYWRkcjEsIGJhbmtfYWRkciA7CisgICAgaW50IHhfYWRkcjsKKyAgICBpbnQgdHJhbnNfYWRkcjsKKworICAgIHBpeGVsX3hfbTEgPSB4X3NpemUgLTE7CisgICAgcGl4ZWxfeV9tMSA9IHlfc2l6ZSAtMTsKKworICAgIHJvdW5kdXBfeCA9ICgocGl4ZWxfeF9tMSA+PiA3KSArIDEpOworICAgIHJvdW5kdXBfeSA9ICgocGl4ZWxfeF9tMSA+PiA2KSArIDEpOworCisgICAgeF9hZGRyID0geF9wb3MgPj4gMjsKKworICAgIGlmICgoeV9zaXplIDw9IHlfcG9zKzMyKSAmJiAoIHlfcG9zIDwgeV9zaXplKSAmJgorICAgICAgICAoKChwaXhlbF95X20xID4+IDUpICYgMHgxKSA9PSAwKSAmJiAoKCh5X3BvcyA+PiA1KSAmIDB4MSkgPT0gMCkpIHsKKyAgICAgICAgbGluZWFyX2FkZHIwID0gKCgoeV9wb3MgJiAweDFmKSA8PDQpIHwgKHhfYWRkciAmIDB4ZikpOworICAgICAgICBsaW5lYXJfYWRkcjEgPSAoKCh5X3BvcyA+PiA2KSAmIDB4ZmYpICogcm91bmR1cF94ICsgKCh4X2FkZHIgPj4gNikgJiAweDNmKSk7CisKKyAgICAgICAgaWYgKCgoeF9hZGRyID4+IDUpICYgMHgxKSA9PSAoKHlfcG9zID4+IDUpICYgMHgxKSkKKyAgICAgICAgICAgIGJhbmtfYWRkciA9ICgoeF9hZGRyID4+IDQpICYgMHgxKTsKKyAgICAgICAgZWxzZQorICAgICAgICAgICAgYmFua19hZGRyID0gMHgyIHwgKCh4X2FkZHIgPj4gNCkgJiAweDEpOworICAgIH0gZWxzZSB7CisgICAgICAgIGxpbmVhcl9hZGRyMCA9ICgoKHlfcG9zICYgMHgxZikgPDwgNCkgfCAoeF9hZGRyICYgMHhmKSk7CisgICAgICAgIGxpbmVhcl9hZGRyMSA9ICgoKHlfcG9zID4+IDYpICYgMHhmZikgKiByb3VuZHVwX3ggKyAoKHhfYWRkciA+PiA1KSAmIDB4N2YpKTsKKworICAgICAgICBpZiAoKCh4X2FkZHIgPj4gNSkgJiAweDEpID09ICgoeV9wb3MgPj4gNSkgJiAweDEpKQorICAgICAgICAgICAgYmFua19hZGRyID0gKCh4X2FkZHIgPj4gNCkgJiAweDEpOworICAgICAgICBlbHNlCisgICAgICAgICAgICBiYW5rX2FkZHIgPSAweDIgfCAoKHhfYWRkciA+PiA0KSAmIDB4MSk7CisgICAgfQorCisgICAgbGluZWFyX2FkZHIwID0gbGluZWFyX2FkZHIwIDw8IDI7CisgICAgdHJhbnNfYWRkciA9IChsaW5lYXJfYWRkcjEgPDwxMykgfCAoYmFua19hZGRyIDw8IDExKSB8IGxpbmVhcl9hZGRyMDsKKworICAgIHJldHVybiB0cmFuc19hZGRyOworfQorCisvKgorICogRGUtaW50ZXJsZWF2ZXMgc3JjIHRvIGRlc3QxLCBkZXN0MgorICoKKyAqIEBwYXJhbSBkZXN0MQorICogICBBZGRyZXNzIG9mIGRlLWludGVybGVhdmVkIGRhdGFbb3V0XQorICoKKyAqIEBwYXJhbSBkZXN0MgorICogICBBZGRyZXNzIG9mIGRlLWludGVybGVhdmVkIGRhdGFbb3V0XQorICoKKyAqIEBwYXJhbSBzcmMKKyAqICAgQWRkcmVzcyBvZiBpbnRlcmxlYXZlZCBkYXRhW2luXQorICoKKyAqIEBwYXJhbSBzcmNfc2l6ZQorICogICBTaXplIG9mIGludGVybGVhdmVkIGRhdGFbaW5dCisgKi8KK3ZvaWQgY3NjX2RlaW50ZXJsZWF2ZV9tZW1jcHkoCisgICAgdW5zaWduZWQgY2hhciAqZGVzdDEsCisgICAgdW5zaWduZWQgY2hhciAqZGVzdDIsCisgICAgdW5zaWduZWQgY2hhciAqc3JjLAorICAgIHVuc2lnbmVkIGludCBzcmNfc2l6ZSkKK3sKKyAgICB1bnNpZ25lZCBpbnQgaSA9IDA7CisgICAgZm9yKGk9MDsgaTxzcmNfc2l6ZS8yOyBpKyspIHsKKyAgICAgICAgZGVzdDFbaV0gPSBzcmNbaSoyXTsKKyAgICAgICAgZGVzdDJbaV0gPSBzcmNbaSoyKzFdOworICAgIH0KK30KKworLyoKKyAqIEludGVybGVhdmVzIHNyYzEsIHNyYzIgdG8gZGVzdAorICoKKyAqIEBwYXJhbSBkZXN0CisgKiAgIEFkZHJlc3Mgb2YgaW50ZXJsZWF2ZWQgZGF0YVtvdXRdCisgKgorICogQHBhcmFtIHNyYzEKKyAqICAgQWRkcmVzcyBvZiBkZS1pbnRlcmxlYXZlZCBkYXRhW2luXQorICoKKyAqIEBwYXJhbSBzcmMyCisgKiAgIEFkZHJlc3Mgb2YgZGUtaW50ZXJsZWF2ZWQgZGF0YVtpbl0KKyAqCisgKiBAcGFyYW0gc3JjX3NpemUKKyAqICAgU2l6ZSBvZiBkZS1pbnRlcmxlYXZlZCBkYXRhW2luXQorICovCit2b2lkIGNzY19pbnRlcmxlYXZlX21lbWNweSgKKyAgICB1bnNpZ25lZCBjaGFyICpkZXN0LAorICAgIHVuc2lnbmVkIGNoYXIgKnNyYzEsCisgICAgdW5zaWduZWQgY2hhciAqc3JjMiwKKyAgICB1bnNpZ25lZCBpbnQgc3JjX3NpemUpCit7CisgICAgdW5zaWduZWQgaW50IGkgPSAwOworICAgIGZvcihpPTA7IGk8c3JjX3NpemU7IGkrKykgeworICAgICAgICBkZXN0W2kgKiAyXSA9IHNyYzFbaV07CisgICAgICAgIGRlc3RbaSAqIDIgKyAxXSA9IHNyYzJbaV07CisgICAgfQorfQorCisvKgorICogQ29udmVydHMgdGlsZWQgZGF0YSB0byBsaW5lYXIKKyAqIENyb3BzIGxlZnQsIHRvcCwgcmlnaHQsIGJ1dHRvbQorICogMS4gWSBvZiBOVjEyVCB0byBZIG9mIFlVVjQyMFAKKyAqIDIuIFkgb2YgTlYxMlQgdG8gWSBvZiBZVVY0MjBTCisgKiAzLiBVViBvZiBOVjEyVCB0byBVViBvZiBZVVY0MjBTCisgKgorICogQHBhcmFtIHl1djQyMF9kZXN0CisgKiAgIFkgb3IgVVYgcGxhbmUgYWRkcmVzcyBvZiBZVVY0MjBbb3V0XQorICoKKyAqIEBwYXJhbSBudjEydF9zcmMKKyAqICAgWSBvciBVViBwbGFuZSBhZGRyZXNzIG9mIE5WMTJUW2luXQorICoKKyAqIEBwYXJhbSB5dXY0MjBfd2lkdGgKKyAqICAgV2lkdGggb2YgWVVWNDIwW2luXQorICoKKyAqIEBwYXJhbSB5dXY0MjBfaGVpZ2h0CisgKiAgIFk6IEhlaWdodCBvZiBZVVY0MjAsIFVWOiBIZWlnaHQvMiBvZiBZVVY0MjBbaW5dCisgKgorICogQHBhcmFtIGxlZnQKKyAqICAgQ3JvcCBzaXplIG9mIGxlZnQKKyAqCisgKiBAcGFyYW0gdG9wCisgKiAgIENyb3Agc2l6ZSBvZiB0b3AKKyAqCisgKiBAcGFyYW0gcmlnaHQKKyAqICAgQ3JvcCBzaXplIG9mIHJpZ2h0CisgKgorICogQHBhcmFtIGJ1dHRvbQorICogICBDcm9wIHNpemUgb2YgYnV0dG9tCisgKi8KK3N0YXRpYyB2b2lkIGNzY190aWxlZF90b19saW5lYXJfY3JvcCgKKyAgICB1bnNpZ25lZCBjaGFyICp5dXY0MjBfZGVzdCwKKyAgICB1bnNpZ25lZCBjaGFyICpudjEydF9zcmMsCisgICAgdW5zaWduZWQgaW50IHl1djQyMF93aWR0aCwKKyAgICB1bnNpZ25lZCBpbnQgeXV2NDIwX2hlaWdodCwKKyAgICB1bnNpZ25lZCBpbnQgbGVmdCwKKyAgICB1bnNpZ25lZCBpbnQgdG9wLAorICAgIHVuc2lnbmVkIGludCByaWdodCwKKyAgICB1bnNpZ25lZCBpbnQgYnV0dG9tKQoreworICAgIHVuc2lnbmVkIGludCBpLCBqOworICAgIHVuc2lnbmVkIGludCB0aWxlZF9vZmZzZXQgPSAwLCB0aWxlZF9vZmZzZXQxID0gMDsKKyAgICB1bnNpZ25lZCBpbnQgbGluZWFyX29mZnNldCA9IDA7CisgICAgdW5zaWduZWQgaW50IHRlbXAxID0gMCwgdGVtcDIgPSAwLCB0ZW1wMyA9IDAsIHRlbXA0ID0gMDsKKworICAgIHRlbXAzID0geXV2NDIwX3dpZHRoLXJpZ2h0OworICAgIHRlbXAxID0gdGVtcDMtbGVmdDsKKyAgICAvKiByZWFsIHdpZHRoIGlzIGdyZWF0ZXIgdGhhbiBvciBlcXVhbCAyNTYgKi8KKyAgICBpZiAodGVtcDEgPj0gMjU2KSB7CisgICAgICAgIGZvciAoaT10b3A7IGk8eXV2NDIwX2hlaWdodC1idXR0b207IGk9aSsxKSB7CisgICAgICAgICAgICBqID0gbGVmdDsKKyAgICAgICAgICAgIHRlbXAzID0gKGo+PjgpPDw4OworICAgICAgICAgICAgdGVtcDMgPSB0ZW1wMz4+NjsKKyAgICAgICAgICAgIHRlbXA0ID0gaT4+NTsKKyAgICAgICAgICAgIGlmICh0ZW1wNCAmIDB4MSkgeworICAgICAgICAgICAgICAgIC8qIG9kZCBmb211bGE6IDIreCsoeD4+Mik8PDIreF9ibG9ja19udW0qKHktMSkgKi8KKyAgICAgICAgICAgICAgICB0aWxlZF9vZmZzZXQgPSB0ZW1wNC0xOworICAgICAgICAgICAgICAgIHRlbXAxID0gKCh5dXY0MjBfd2lkdGgrMTI3KT4+Nyk8PDc7CisgICAgICAgICAgICAgICAgdGlsZWRfb2Zmc2V0ID0gdGlsZWRfb2Zmc2V0Kih0ZW1wMT4+Nik7CisgICAgICAgICAgICAgICAgdGlsZWRfb2Zmc2V0ID0gdGlsZWRfb2Zmc2V0K3RlbXAzOworICAgICAgICAgICAgICAgIHRpbGVkX29mZnNldCA9IHRpbGVkX29mZnNldCsyOworICAgICAgICAgICAgICAgIHRlbXAxID0gKHRlbXAzPj4yKTw8MjsKKyAgICAgICAgICAgICAgICB0aWxlZF9vZmZzZXQgPSB0aWxlZF9vZmZzZXQrdGVtcDE7CisgICAgICAgICAgICAgICAgdGlsZWRfb2Zmc2V0ID0gdGlsZWRfb2Zmc2V0PDwxMTsKKyAgICAgICAgICAgICAgICB0aWxlZF9vZmZzZXQxID0gdGlsZWRfb2Zmc2V0KzIwNDgqMjsKKyAgICAgICAgICAgICAgICB0ZW1wNCA9IDg7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIHRlbXAyID0gKCh5dXY0MjBfaGVpZ2h0KzMxKT4+NSk8PDU7CisgICAgICAgICAgICAgICAgaWYgKChpKzMyKTx0ZW1wMikgeworICAgICAgICAgICAgICAgICAgICAvKiBldmVuMSBmb211bGE6IHgrKCh4KzIpPj4yKTw8Mit4X2Jsb2NrX251bSp5ICovCisgICAgICAgICAgICAgICAgICAgIHRlbXAxID0gdGVtcDMrMjsKKyAgICAgICAgICAgICAgICAgICAgdGVtcDEgPSAodGVtcDE+PjIpPDwyOworICAgICAgICAgICAgICAgICAgICB0aWxlZF9vZmZzZXQgPSB0ZW1wMyt0ZW1wMTsKKyAgICAgICAgICAgICAgICAgICAgdGVtcDEgPSAoKHl1djQyMF93aWR0aCsxMjcpPj43KTw8NzsKKyAgICAgICAgICAgICAgICAgICAgdGlsZWRfb2Zmc2V0ID0gdGlsZWRfb2Zmc2V0K3RlbXA0Kih0ZW1wMT4+Nik7CisgICAgICAgICAgICAgICAgICAgIHRpbGVkX29mZnNldCA9IHRpbGVkX29mZnNldDw8MTE7CisgICAgICAgICAgICAgICAgICAgIHRpbGVkX29mZnNldDEgPSB0aWxlZF9vZmZzZXQrMjA0OCo2OworICAgICAgICAgICAgICAgICAgICB0ZW1wNCA9IDg7CisgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgLyogZXZlbjIgZm9tdWxhOiB4K3hfYmxvY2tfbnVtKnkgKi8KKyAgICAgICAgICAgICAgICAgICAgdGVtcDEgPSAoKHl1djQyMF93aWR0aCsxMjcpPj43KTw8NzsKKyAgICAgICAgICAgICAgICAgICAgdGlsZWRfb2Zmc2V0ID0gdGVtcDQqKHRlbXAxPj42KTsKKyAgICAgICAgICAgICAgICAgICAgdGlsZWRfb2Zmc2V0ID0gdGlsZWRfb2Zmc2V0K3RlbXAzOworICAgICAgICAgICAgICAgICAgICB0aWxlZF9vZmZzZXQgPSB0aWxlZF9vZmZzZXQ8PDExOworICAgICAgICAgICAgICAgICAgICB0aWxlZF9vZmZzZXQxID0gdGlsZWRfb2Zmc2V0KzIwNDgqMjsKKyAgICAgICAgICAgICAgICAgICAgdGVtcDQgPSA0OworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgdGVtcDEgPSBpJjB4MUY7CisgICAgICAgICAgICB0aWxlZF9vZmZzZXQgPSB0aWxlZF9vZmZzZXQrNjQqKHRlbXAxKTsKKyAgICAgICAgICAgIHRpbGVkX29mZnNldDEgPSB0aWxlZF9vZmZzZXQxKzY0Kih0ZW1wMSk7CisgICAgICAgICAgICB0ZW1wMiA9IHl1djQyMF93aWR0aC1sZWZ0LXJpZ2h0OworICAgICAgICAgICAgbGluZWFyX29mZnNldCA9IHRlbXAyKihpLXRvcCk7CisgICAgICAgICAgICB0ZW1wMyA9ICgoaisyNTYpPj44KTw8ODsKKyAgICAgICAgICAgIHRlbXAzID0gdGVtcDMtajsKKyAgICAgICAgICAgIHRlbXAxID0gbGVmdCYweDNGOworICAgICAgICAgICAgaWYgKHRlbXAzID4gMTkyKSB7CisgICAgICAgICAgICAgICAgbWVtY3B5KHl1djQyMF9kZXN0K2xpbmVhcl9vZmZzZXQsIG52MTJ0X3NyYyt0aWxlZF9vZmZzZXQrdGVtcDEsIDY0LXRlbXAxKTsKKyAgICAgICAgICAgICAgICB0ZW1wMiA9ICgobGVmdCs2Myk+PjYpPDw2OworICAgICAgICAgICAgICAgIHRlbXAzID0gKCh5dXY0MjBfd2lkdGgtcmlnaHQpPj42KTw8NjsKKyAgICAgICAgICAgICAgICBpZiAodGVtcDIgPT0gdGVtcDMpIHsKKyAgICAgICAgICAgICAgICAgICAgdGVtcDIgPSB5dXY0MjBfd2lkdGgtcmlnaHQtKDY0LXRlbXAxKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgbWVtY3B5KHl1djQyMF9kZXN0K2xpbmVhcl9vZmZzZXQrNjQtdGVtcDEsIG52MTJ0X3NyYyt0aWxlZF9vZmZzZXQrMjA0OCwgNjQpOworICAgICAgICAgICAgICAgIG1lbWNweSh5dXY0MjBfZGVzdCtsaW5lYXJfb2Zmc2V0KzEyOC10ZW1wMSwgbnYxMnRfc3JjK3RpbGVkX29mZnNldDEsIDY0KTsKKyAgICAgICAgICAgICAgICBtZW1jcHkoeXV2NDIwX2Rlc3QrbGluZWFyX29mZnNldCsxOTItdGVtcDEsIG52MTJ0X3NyYyt0aWxlZF9vZmZzZXQxKzIwNDgsIDY0KTsKKyAgICAgICAgICAgICAgICBsaW5lYXJfb2Zmc2V0ID0gbGluZWFyX29mZnNldCsyNTYtdGVtcDE7CisgICAgICAgICAgICB9IGVsc2UgaWYgKHRlbXAzID4gMTI4KSB7CisgICAgICAgICAgICAgICAgbWVtY3B5KHl1djQyMF9kZXN0K2xpbmVhcl9vZmZzZXQsIG52MTJ0X3NyYyt0aWxlZF9vZmZzZXQrMjA0OCt0ZW1wMSwgNjQtdGVtcDEpOworICAgICAgICAgICAgICAgIG1lbWNweSh5dXY0MjBfZGVzdCtsaW5lYXJfb2Zmc2V0KzY0LXRlbXAxLCBudjEydF9zcmMrdGlsZWRfb2Zmc2V0MSwgNjQpOworICAgICAgICAgICAgICAgIG1lbWNweSh5dXY0MjBfZGVzdCtsaW5lYXJfb2Zmc2V0KzEyOC10ZW1wMSwgbnYxMnRfc3JjK3RpbGVkX29mZnNldDErMjA0OCwgNjQpOworICAgICAgICAgICAgICAgIGxpbmVhcl9vZmZzZXQgPSBsaW5lYXJfb2Zmc2V0KzE5Mi10ZW1wMTsKKyAgICAgICAgICAgIH0gZWxzZSBpZiAodGVtcDMgPiA2NCkgeworICAgICAgICAgICAgICAgIG1lbWNweSh5dXY0MjBfZGVzdCtsaW5lYXJfb2Zmc2V0LCBudjEydF9zcmMrdGlsZWRfb2Zmc2V0MSt0ZW1wMSwgNjQtdGVtcDEpOworICAgICAgICAgICAgICAgIG1lbWNweSh5dXY0MjBfZGVzdCtsaW5lYXJfb2Zmc2V0KzY0LXRlbXAxLCBudjEydF9zcmMrdGlsZWRfb2Zmc2V0MSsyMDQ4LCA2NCk7CisgICAgICAgICAgICAgICAgbGluZWFyX29mZnNldCA9IGxpbmVhcl9vZmZzZXQrMTI4LXRlbXAxOworICAgICAgICAgICAgfSBlbHNlIGlmICh0ZW1wMyA+IDApIHsKKyAgICAgICAgICAgICAgICBtZW1jcHkoeXV2NDIwX2Rlc3QrbGluZWFyX29mZnNldCwgbnYxMnRfc3JjK3RpbGVkX29mZnNldDErMjA0OCt0ZW1wMSwgNjQtdGVtcDEpOworICAgICAgICAgICAgICAgIGxpbmVhcl9vZmZzZXQgPSBsaW5lYXJfb2Zmc2V0KzY0LXRlbXAxOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICB0aWxlZF9vZmZzZXQgPSB0aWxlZF9vZmZzZXQrdGVtcDQqMjA0ODsKKyAgICAgICAgICAgIGogPSAobGVmdD4+OCk8PDg7CisgICAgICAgICAgICBqID0gaiArIDI1NjsKKyAgICAgICAgICAgIHRlbXAyID0geXV2NDIwX3dpZHRoLXJpZ2h0LTI1NjsKKyAgICAgICAgICAgIGZvciAoOyBqPD10ZW1wMjsgaj1qKzI1NikgeworICAgICAgICAgICAgICAgIG1lbWNweSh5dXY0MjBfZGVzdCtsaW5lYXJfb2Zmc2V0LCBudjEydF9zcmMrdGlsZWRfb2Zmc2V0LCA2NCk7CisgICAgICAgICAgICAgICAgdGlsZWRfb2Zmc2V0MSA9IHRpbGVkX29mZnNldDErdGVtcDQqMjA0ODsKKyAgICAgICAgICAgICAgICBtZW1jcHkoeXV2NDIwX2Rlc3QrbGluZWFyX29mZnNldCs2NCwgbnYxMnRfc3JjK3RpbGVkX29mZnNldCsyMDQ4LCA2NCk7CisgICAgICAgICAgICAgICAgbWVtY3B5KHl1djQyMF9kZXN0K2xpbmVhcl9vZmZzZXQrMTI4LCBudjEydF9zcmMrdGlsZWRfb2Zmc2V0MSwgNjQpOworICAgICAgICAgICAgICAgIHRpbGVkX29mZnNldCA9IHRpbGVkX29mZnNldCt0ZW1wNCoyMDQ4OworICAgICAgICAgICAgICAgIG1lbWNweSh5dXY0MjBfZGVzdCtsaW5lYXJfb2Zmc2V0KzE5MiwgbnYxMnRfc3JjK3RpbGVkX29mZnNldDErMjA0OCwgNjQpOworICAgICAgICAgICAgICAgIGxpbmVhcl9vZmZzZXQgPSBsaW5lYXJfb2Zmc2V0KzI1NjsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgdGlsZWRfb2Zmc2V0MSA9IHRpbGVkX29mZnNldDErdGVtcDQqMjA0ODsKKyAgICAgICAgICAgIHRlbXAyID0geXV2NDIwX3dpZHRoLXJpZ2h0LWo7CisgICAgICAgICAgICBpZiAodGVtcDIgPiAxOTIpIHsKKyAgICAgICAgICAgICAgICBtZW1jcHkoeXV2NDIwX2Rlc3QrbGluZWFyX29mZnNldCwgbnYxMnRfc3JjK3RpbGVkX29mZnNldCwgNjQpOworICAgICAgICAgICAgICAgIG1lbWNweSh5dXY0MjBfZGVzdCtsaW5lYXJfb2Zmc2V0KzY0LCBudjEydF9zcmMrdGlsZWRfb2Zmc2V0KzIwNDgsIDY0KTsKKyAgICAgICAgICAgICAgICBtZW1jcHkoeXV2NDIwX2Rlc3QrbGluZWFyX29mZnNldCsxMjgsIG52MTJ0X3NyYyt0aWxlZF9vZmZzZXQxLCA2NCk7CisgICAgICAgICAgICAgICAgbWVtY3B5KHl1djQyMF9kZXN0K2xpbmVhcl9vZmZzZXQrMTkyLCBudjEydF9zcmMrdGlsZWRfb2Zmc2V0MSsyMDQ4LCB0ZW1wMi0xOTIpOworICAgICAgICAgICAgfSBlbHNlIGlmICh0ZW1wMiA+IDEyOCkgeworICAgICAgICAgICAgICAgIG1lbWNweSh5dXY0MjBfZGVzdCtsaW5lYXJfb2Zmc2V0LCBudjEydF9zcmMrdGlsZWRfb2Zmc2V0LCA2NCk7CisgICAgICAgICAgICAgICAgbWVtY3B5KHl1djQyMF9kZXN0K2xpbmVhcl9vZmZzZXQrNjQsIG52MTJ0X3NyYyt0aWxlZF9vZmZzZXQrMjA0OCwgNjQpOworICAgICAgICAgICAgICAgIG1lbWNweSh5dXY0MjBfZGVzdCtsaW5lYXJfb2Zmc2V0KzEyOCwgbnYxMnRfc3JjK3RpbGVkX29mZnNldDEsIHRlbXAyLTEyOCk7CisgICAgICAgICAgICB9IGVsc2UgaWYgKHRlbXAyID4gNjQpIHsKKyAgICAgICAgICAgICAgICBtZW1jcHkoeXV2NDIwX2Rlc3QrbGluZWFyX29mZnNldCwgbnYxMnRfc3JjK3RpbGVkX29mZnNldCwgNjQpOworICAgICAgICAgICAgICAgIG1lbWNweSh5dXY0MjBfZGVzdCtsaW5lYXJfb2Zmc2V0KzY0LCBudjEydF9zcmMrdGlsZWRfb2Zmc2V0KzIwNDgsIHRlbXAyLTY0KTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgbWVtY3B5KHl1djQyMF9kZXN0K2xpbmVhcl9vZmZzZXQsIG52MTJ0X3NyYyt0aWxlZF9vZmZzZXQsIHRlbXAyKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0gZWxzZSBpZiAodGVtcDEgPj0gNjQpIHsKKyAgICAgICAgZm9yIChpPXRvcDsgaTwoeXV2NDIwX2hlaWdodC1idXR0b20pOyBpPWkrMSkgeworICAgICAgICAgICAgaiA9IGxlZnQ7CisgICAgICAgICAgICB0aWxlZF9vZmZzZXQgPSB0aWxlXzR4Ml9yZWFkKHl1djQyMF93aWR0aCwgeXV2NDIwX2hlaWdodCwgaiwgaSk7CisgICAgICAgICAgICB0ZW1wMiA9ICgoais2NCk+PjYpPDw2OworICAgICAgICAgICAgdGVtcDIgPSB0ZW1wMi1qOworICAgICAgICAgICAgbGluZWFyX29mZnNldCA9IHRlbXAxKihpLXRvcCk7CisgICAgICAgICAgICB0ZW1wNCA9IGomMHgzOworICAgICAgICAgICAgdGlsZWRfb2Zmc2V0ID0gdGlsZWRfb2Zmc2V0K3RlbXA0OworICAgICAgICAgICAgbWVtY3B5KHl1djQyMF9kZXN0K2xpbmVhcl9vZmZzZXQsIG52MTJ0X3NyYyt0aWxlZF9vZmZzZXQsIHRlbXAyKTsKKyAgICAgICAgICAgIGxpbmVhcl9vZmZzZXQgPSBsaW5lYXJfb2Zmc2V0K3RlbXAyOworICAgICAgICAgICAgaiA9IGordGVtcDI7CisgICAgICAgICAgICBpZiAoKGorNjQpIDw9IHRlbXAzKSB7CisgICAgICAgICAgICAgICAgdGlsZWRfb2Zmc2V0ID0gdGlsZV80eDJfcmVhZCh5dXY0MjBfd2lkdGgsIHl1djQyMF9oZWlnaHQsIGosIGkpOworICAgICAgICAgICAgICAgIG1lbWNweSh5dXY0MjBfZGVzdCtsaW5lYXJfb2Zmc2V0LCBudjEydF9zcmMrdGlsZWRfb2Zmc2V0LCA2NCk7CisgICAgICAgICAgICAgICAgbGluZWFyX29mZnNldCA9IGxpbmVhcl9vZmZzZXQrNjQ7CisgICAgICAgICAgICAgICAgaiA9IGorNjQ7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAoKGorNjQpIDw9IHRlbXAzKSB7CisgICAgICAgICAgICAgICAgdGlsZWRfb2Zmc2V0ID0gdGlsZV80eDJfcmVhZCh5dXY0MjBfd2lkdGgsIHl1djQyMF9oZWlnaHQsIGosIGkpOworICAgICAgICAgICAgICAgIG1lbWNweSh5dXY0MjBfZGVzdCtsaW5lYXJfb2Zmc2V0LCBudjEydF9zcmMrdGlsZWRfb2Zmc2V0LCA2NCk7CisgICAgICAgICAgICAgICAgbGluZWFyX29mZnNldCA9IGxpbmVhcl9vZmZzZXQrNjQ7CisgICAgICAgICAgICAgICAgaiA9IGorNjQ7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAoaiA8IHRlbXAzKSB7CisgICAgICAgICAgICAgICAgdGlsZWRfb2Zmc2V0ID0gdGlsZV80eDJfcmVhZCh5dXY0MjBfd2lkdGgsIHl1djQyMF9oZWlnaHQsIGosIGkpOworICAgICAgICAgICAgICAgIHRlbXAyID0gdGVtcDMtajsKKyAgICAgICAgICAgICAgICBtZW1jcHkoeXV2NDIwX2Rlc3QrbGluZWFyX29mZnNldCwgbnYxMnRfc3JjK3RpbGVkX29mZnNldCwgdGVtcDIpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfSBlbHNlIHsKKyAgICAgICAgZm9yIChpPXRvcDsgaTwoeXV2NDIwX2hlaWdodC1idXR0b20pOyBpPWkrMSkgeworICAgICAgICAgICAgbGluZWFyX29mZnNldCA9IHRlbXAxKihpLXRvcCk7CisgICAgICAgICAgICBmb3IgKGo9bGVmdDsgajwoeXV2NDIwX3dpZHRoLXJpZ2h0KTsgaj1qKzIpIHsKKyAgICAgICAgICAgICAgICB0aWxlZF9vZmZzZXQgPSB0aWxlXzR4Ml9yZWFkKHl1djQyMF93aWR0aCwgeXV2NDIwX2hlaWdodCwgaiwgaSk7CisgICAgICAgICAgICAgICAgdGVtcDQgPSBqJjB4MzsKKyAgICAgICAgICAgICAgICB0aWxlZF9vZmZzZXQgPSB0aWxlZF9vZmZzZXQrdGVtcDQ7CisgICAgICAgICAgICAgICAgbWVtY3B5KHl1djQyMF9kZXN0K2xpbmVhcl9vZmZzZXQsIG52MTJ0X3NyYyt0aWxlZF9vZmZzZXQsIDIpOworICAgICAgICAgICAgICAgIGxpbmVhcl9vZmZzZXQgPSBsaW5lYXJfb2Zmc2V0KzI7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9Cit9CisKKy8qCisgKiBDb252ZXJ0cyBhbmQgRGVpbnRlcmxlYXZlcyB0aWxlZCBkYXRhIHRvIGxpbmVhcgorICogQ3JvcHMgbGVmdCwgdG9wLCByaWdodCwgYnV0dG9tCisgKiAxLiBVViBvZiBOVjEyVCB0byBVViBvZiBZVVY0MjBQCisgKgorICogQHBhcmFtIHl1djQyMF91X2Rlc3QKKyAqICAgVSBwbGFuZSBhZGRyZXNzIG9mIFlVVjQyMFBbb3V0XQorICoKKyAqIEBwYXJhbSB5dXY0MjBfdl9kZXN0CisgKiAgIFYgcGxhbmUgYWRkcmVzcyBvZiBZVVY0MjBQW291dF0KKyAqCisgKiBAcGFyYW0gbnYxMnRfc3JjCisgKiAgIFVWIHBsYW5lIGFkZHJlc3Mgb2YgTlYxMlRbaW5dCisgKgorICogQHBhcmFtIHl1djQyMF93aWR0aAorICogICBXaWR0aCBvZiBZVVY0MjBbaW5dCisgKgorICogQHBhcmFtIHl1djQyMF91dl9oZWlnaHQKKyAqICAgSGVpZ2h0LzIgb2YgWVVWNDIwW2luXQorICoKKyAqIEBwYXJhbSBsZWZ0CisgKiAgIENyb3Agc2l6ZSBvZiBsZWZ0CisgKgorICogQHBhcmFtIHRvcAorICogICBDcm9wIHNpemUgb2YgdG9wCisgKgorICogQHBhcmFtIHJpZ2h0CisgKiAgIENyb3Agc2l6ZSBvZiByaWdodAorICoKKyAqIEBwYXJhbSBidXR0b20KKyAqICAgQ3JvcCBzaXplIG9mIGJ1dHRvbQorICovCitzdGF0aWMgdm9pZCBjc2NfdGlsZWRfdG9fbGluZWFyX2RlaW50ZXJsZWF2ZV9jcm9wKAorICAgIHVuc2lnbmVkIGNoYXIgKnl1djQyMF91X2Rlc3QsCisgICAgdW5zaWduZWQgY2hhciAqeXV2NDIwX3ZfZGVzdCwKKyAgICB1bnNpZ25lZCBjaGFyICpudjEydF91dl9zcmMsCisgICAgdW5zaWduZWQgaW50IHl1djQyMF93aWR0aCwKKyAgICB1bnNpZ25lZCBpbnQgeXV2NDIwX3V2X2hlaWdodCwKKyAgICB1bnNpZ25lZCBpbnQgbGVmdCwKKyAgICB1bnNpZ25lZCBpbnQgdG9wLAorICAgIHVuc2lnbmVkIGludCByaWdodCwKKyAgICB1bnNpZ25lZCBpbnQgYnV0dG9tKQoreworICAgIHVuc2lnbmVkIGludCBpLCBqOworICAgIHVuc2lnbmVkIGludCB0aWxlZF9vZmZzZXQgPSAwLCB0aWxlZF9vZmZzZXQxID0gMDsKKyAgICB1bnNpZ25lZCBpbnQgbGluZWFyX29mZnNldCA9IDA7CisgICAgdW5zaWduZWQgaW50IHRlbXAxID0gMCwgdGVtcDIgPSAwLCB0ZW1wMyA9IDAsIHRlbXA0ID0gMDsKKworICAgIHRlbXAzID0geXV2NDIwX3dpZHRoLXJpZ2h0OworICAgIHRlbXAxID0gdGVtcDMtbGVmdDsKKyAgICAvKiByZWFsIHdpZHRoIGlzIGdyZWF0ZXIgdGhhbiBvciBlcXVhbCAyNTYgKi8KKyAgICBpZiAodGVtcDEgPj0gMjU2KSB7CisgICAgICAgIGZvciAoaT10b3A7IGk8eXV2NDIwX3V2X2hlaWdodC1idXR0b207IGk9aSsxKSB7CisgICAgICAgICAgICBqID0gbGVmdDsKKyAgICAgICAgICAgIHRlbXAzID0gKGo+PjgpPDw4OworICAgICAgICAgICAgdGVtcDMgPSB0ZW1wMz4+NjsKKyAgICAgICAgICAgIHRlbXA0ID0gaT4+NTsKKyAgICAgICAgICAgIGlmICh0ZW1wNCAmIDB4MSkgeworICAgICAgICAgICAgICAgIC8qIG9kZCBmb211bGE6IDIreCsoeD4+Mik8PDIreF9ibG9ja19udW0qKHktMSkgKi8KKyAgICAgICAgICAgICAgICB0aWxlZF9vZmZzZXQgPSB0ZW1wNC0xOworICAgICAgICAgICAgICAgIHRlbXAxID0gKCh5dXY0MjBfd2lkdGgrMTI3KT4+Nyk8PDc7CisgICAgICAgICAgICAgICAgdGlsZWRfb2Zmc2V0ID0gdGlsZWRfb2Zmc2V0Kih0ZW1wMT4+Nik7CisgICAgICAgICAgICAgICAgdGlsZWRfb2Zmc2V0ID0gdGlsZWRfb2Zmc2V0K3RlbXAzOworICAgICAgICAgICAgICAgIHRpbGVkX29mZnNldCA9IHRpbGVkX29mZnNldCsyOworICAgICAgICAgICAgICAgIHRlbXAxID0gKHRlbXAzPj4yKTw8MjsKKyAgICAgICAgICAgICAgICB0aWxlZF9vZmZzZXQgPSB0aWxlZF9vZmZzZXQrdGVtcDE7CisgICAgICAgICAgICAgICAgdGlsZWRfb2Zmc2V0ID0gdGlsZWRfb2Zmc2V0PDwxMTsKKyAgICAgICAgICAgICAgICB0aWxlZF9vZmZzZXQxID0gdGlsZWRfb2Zmc2V0KzIwNDgqMjsKKyAgICAgICAgICAgICAgICB0ZW1wNCA9IDg7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIHRlbXAyID0gKCh5dXY0MjBfdXZfaGVpZ2h0KzMxKT4+NSk8PDU7CisgICAgICAgICAgICAgICAgaWYgKChpKzMyKTx0ZW1wMikgeworICAgICAgICAgICAgICAgICAgICAvKiBldmVuMSBmb211bGE6IHgrKCh4KzIpPj4yKTw8Mit4X2Jsb2NrX251bSp5ICovCisgICAgICAgICAgICAgICAgICAgIHRlbXAxID0gdGVtcDMrMjsKKyAgICAgICAgICAgICAgICAgICAgdGVtcDEgPSAodGVtcDE+PjIpPDwyOworICAgICAgICAgICAgICAgICAgICB0aWxlZF9vZmZzZXQgPSB0ZW1wMyt0ZW1wMTsKKyAgICAgICAgICAgICAgICAgICAgdGVtcDEgPSAoKHl1djQyMF93aWR0aCsxMjcpPj43KTw8NzsKKyAgICAgICAgICAgICAgICAgICAgdGlsZWRfb2Zmc2V0ID0gdGlsZWRfb2Zmc2V0K3RlbXA0Kih0ZW1wMT4+Nik7CisgICAgICAgICAgICAgICAgICAgIHRpbGVkX29mZnNldCA9IHRpbGVkX29mZnNldDw8MTE7CisgICAgICAgICAgICAgICAgICAgIHRpbGVkX29mZnNldDEgPSB0aWxlZF9vZmZzZXQrMjA0OCo2OworICAgICAgICAgICAgICAgICAgICB0ZW1wNCA9IDg7CisgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgLyogZXZlbjIgZm9tdWxhOiB4K3hfYmxvY2tfbnVtKnkgKi8KKyAgICAgICAgICAgICAgICAgICAgdGVtcDEgPSAoKHl1djQyMF93aWR0aCsxMjcpPj43KTw8NzsKKyAgICAgICAgICAgICAgICAgICAgdGlsZWRfb2Zmc2V0ID0gdGVtcDQqKHRlbXAxPj42KTsKKyAgICAgICAgICAgICAgICAgICAgdGlsZWRfb2Zmc2V0ID0gdGlsZWRfb2Zmc2V0K3RlbXAzOworICAgICAgICAgICAgICAgICAgICB0aWxlZF9vZmZzZXQgPSB0aWxlZF9vZmZzZXQ8PDExOworICAgICAgICAgICAgICAgICAgICB0aWxlZF9vZmZzZXQxID0gdGlsZWRfb2Zmc2V0KzIwNDgqMjsKKyAgICAgICAgICAgICAgICAgICAgdGVtcDQgPSA0OworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgdGVtcDEgPSBpJjB4MUY7CisgICAgICAgICAgICB0aWxlZF9vZmZzZXQgPSB0aWxlZF9vZmZzZXQrNjQqKHRlbXAxKTsKKyAgICAgICAgICAgIHRpbGVkX29mZnNldDEgPSB0aWxlZF9vZmZzZXQxKzY0Kih0ZW1wMSk7CisgICAgICAgICAgICB0ZW1wMiA9IHl1djQyMF93aWR0aC1sZWZ0LXJpZ2h0OworICAgICAgICAgICAgbGluZWFyX29mZnNldCA9IHRlbXAyKihpLXRvcCkvMjsKKyAgICAgICAgICAgIHRlbXAzID0gKChqKzI1Nik+PjgpPDw4OworICAgICAgICAgICAgdGVtcDMgPSB0ZW1wMy1qOworICAgICAgICAgICAgdGVtcDEgPSBsZWZ0JjB4M0Y7CisgICAgICAgICAgICBpZiAodGVtcDMgPiAxOTIpIHsKKyAgICAgICAgICAgICAgICBjc2NfZGVpbnRlcmxlYXZlX21lbWNweSh5dXY0MjBfdV9kZXN0K2xpbmVhcl9vZmZzZXQsIHl1djQyMF92X2Rlc3QrbGluZWFyX29mZnNldCwgbnYxMnRfdXZfc3JjK3RpbGVkX29mZnNldCt0ZW1wMSwgNjQtdGVtcDEpOworICAgICAgICAgICAgICAgIGNzY19kZWludGVybGVhdmVfbWVtY3B5KHl1djQyMF91X2Rlc3QrbGluZWFyX29mZnNldCsoMzItdGVtcDEvMiksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeXV2NDIwX3ZfZGVzdCtsaW5lYXJfb2Zmc2V0KygzMi10ZW1wMS8yKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBudjEydF91dl9zcmMrdGlsZWRfb2Zmc2V0KzIwNDgsIDY0KTsKKyAgICAgICAgICAgICAgICBjc2NfZGVpbnRlcmxlYXZlX21lbWNweSh5dXY0MjBfdV9kZXN0K2xpbmVhcl9vZmZzZXQrKDY0LXRlbXAxLzIpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHl1djQyMF92X2Rlc3QrbGluZWFyX29mZnNldCsoNjQtdGVtcDEvMiksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbnYxMnRfdXZfc3JjK3RpbGVkX29mZnNldDEsIDY0KTsKKyAgICAgICAgICAgICAgICBjc2NfZGVpbnRlcmxlYXZlX21lbWNweSh5dXY0MjBfdV9kZXN0K2xpbmVhcl9vZmZzZXQrKDk2LXRlbXAxLzIpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHl1djQyMF92X2Rlc3QrbGluZWFyX29mZnNldCsoOTYtdGVtcDEvMiksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbnYxMnRfdXZfc3JjK3RpbGVkX29mZnNldDErMjA0OCwgNjQpOworICAgICAgICAgICAgICAgIGxpbmVhcl9vZmZzZXQgPSBsaW5lYXJfb2Zmc2V0KzEyOC10ZW1wMS8yOworICAgICAgICAgICAgfSBlbHNlIGlmICh0ZW1wMyA+IDEyOCkgeworICAgICAgICAgICAgICAgIGNzY19kZWludGVybGVhdmVfbWVtY3B5KHl1djQyMF91X2Rlc3QrbGluZWFyX29mZnNldCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB5dXY0MjBfdl9kZXN0K2xpbmVhcl9vZmZzZXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbnYxMnRfdXZfc3JjK3RpbGVkX29mZnNldCsyMDQ4K3RlbXAxLCA2NC10ZW1wMSk7CisgICAgICAgICAgICAgICAgY3NjX2RlaW50ZXJsZWF2ZV9tZW1jcHkoeXV2NDIwX3VfZGVzdCtsaW5lYXJfb2Zmc2V0KygzMi10ZW1wMS8yKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB5dXY0MjBfdl9kZXN0K2xpbmVhcl9vZmZzZXQrKDMyLXRlbXAxLzIpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG52MTJ0X3V2X3NyYyt0aWxlZF9vZmZzZXQxLCA2NCk7CisgICAgICAgICAgICAgICAgY3NjX2RlaW50ZXJsZWF2ZV9tZW1jcHkoeXV2NDIwX3VfZGVzdCtsaW5lYXJfb2Zmc2V0Kyg2NC10ZW1wMS8yKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB5dXY0MjBfdl9kZXN0K2xpbmVhcl9vZmZzZXQrKDY0LXRlbXAxLzIpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG52MTJ0X3V2X3NyYyt0aWxlZF9vZmZzZXQxKzIwNDgsIDY0KTsKKyAgICAgICAgICAgICAgICBsaW5lYXJfb2Zmc2V0ID0gbGluZWFyX29mZnNldCs5Ni10ZW1wMS8yOworICAgICAgICAgICAgfSBlbHNlIGlmICh0ZW1wMyA+IDY0KSB7CisgICAgICAgICAgICAgICAgY3NjX2RlaW50ZXJsZWF2ZV9tZW1jcHkoeXV2NDIwX3VfZGVzdCtsaW5lYXJfb2Zmc2V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHl1djQyMF92X2Rlc3QrbGluZWFyX29mZnNldCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBudjEydF91dl9zcmMrdGlsZWRfb2Zmc2V0MSt0ZW1wMSwgNjQtdGVtcDEpOworICAgICAgICAgICAgICAgIGNzY19kZWludGVybGVhdmVfbWVtY3B5KHl1djQyMF91X2Rlc3QrbGluZWFyX29mZnNldCsoMzItdGVtcDEvMiksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeXV2NDIwX3ZfZGVzdCtsaW5lYXJfb2Zmc2V0KygzMi10ZW1wMS8yKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBudjEydF91dl9zcmMrdGlsZWRfb2Zmc2V0MSsyMDQ4LCA2NCk7CisgICAgICAgICAgICAgICAgbGluZWFyX29mZnNldCA9IGxpbmVhcl9vZmZzZXQrNjQtdGVtcDEvMjsKKyAgICAgICAgICAgIH0gZWxzZSBpZiAodGVtcDMgPiAwKSB7CisgICAgICAgICAgICAgICAgY3NjX2RlaW50ZXJsZWF2ZV9tZW1jcHkoeXV2NDIwX3VfZGVzdCtsaW5lYXJfb2Zmc2V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHl1djQyMF92X2Rlc3QrbGluZWFyX29mZnNldCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBudjEydF91dl9zcmMrdGlsZWRfb2Zmc2V0MSsyMDQ4K3RlbXAxLCA2NC10ZW1wMSk7CisgICAgICAgICAgICAgICAgbGluZWFyX29mZnNldCA9IGxpbmVhcl9vZmZzZXQrMzItdGVtcDEvMjsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgdGlsZWRfb2Zmc2V0ID0gdGlsZWRfb2Zmc2V0K3RlbXA0KjIwNDg7CisgICAgICAgICAgICBqID0gKGxlZnQ+PjgpPDw4OworICAgICAgICAgICAgaiA9IGogKyAyNTY7CisgICAgICAgICAgICB0ZW1wMiA9IHl1djQyMF93aWR0aC1yaWdodC0yNTY7CisgICAgICAgICAgICBmb3IgKDsgajw9dGVtcDI7IGo9aisyNTYpIHsKKyAgICAgICAgICAgICAgICBjc2NfZGVpbnRlcmxlYXZlX21lbWNweSh5dXY0MjBfdV9kZXN0K2xpbmVhcl9vZmZzZXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeXV2NDIwX3ZfZGVzdCtsaW5lYXJfb2Zmc2V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG52MTJ0X3V2X3NyYyt0aWxlZF9vZmZzZXQsIDY0KTsKKyAgICAgICAgICAgICAgICB0aWxlZF9vZmZzZXQxID0gdGlsZWRfb2Zmc2V0MSt0ZW1wNCoyMDQ4OworICAgICAgICAgICAgICAgIGNzY19kZWludGVybGVhdmVfbWVtY3B5KHl1djQyMF91X2Rlc3QrbGluZWFyX29mZnNldCszMiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB5dXY0MjBfdl9kZXN0K2xpbmVhcl9vZmZzZXQrMzIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbnYxMnRfdXZfc3JjK3RpbGVkX29mZnNldCsyMDQ4LCA2NCk7CisgICAgICAgICAgICAgICAgY3NjX2RlaW50ZXJsZWF2ZV9tZW1jcHkoeXV2NDIwX3VfZGVzdCtsaW5lYXJfb2Zmc2V0KzY0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHl1djQyMF92X2Rlc3QrbGluZWFyX29mZnNldCs2NCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBudjEydF91dl9zcmMrdGlsZWRfb2Zmc2V0MSwgNjQpOworICAgICAgICAgICAgICAgIHRpbGVkX29mZnNldCA9IHRpbGVkX29mZnNldCt0ZW1wNCoyMDQ4OworICAgICAgICAgICAgICAgIGNzY19kZWludGVybGVhdmVfbWVtY3B5KHl1djQyMF91X2Rlc3QrbGluZWFyX29mZnNldCs5NiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB5dXY0MjBfdl9kZXN0K2xpbmVhcl9vZmZzZXQrOTYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbnYxMnRfdXZfc3JjK3RpbGVkX29mZnNldDErMjA0OCwgNjQpOworICAgICAgICAgICAgICAgIGxpbmVhcl9vZmZzZXQgPSBsaW5lYXJfb2Zmc2V0KzEyODsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgdGlsZWRfb2Zmc2V0MSA9IHRpbGVkX29mZnNldDErdGVtcDQqMjA0ODsKKyAgICAgICAgICAgIHRlbXAyID0geXV2NDIwX3dpZHRoLXJpZ2h0LWo7CisgICAgICAgICAgICBpZiAodGVtcDIgPiAxOTIpIHsKKyAgICAgICAgICAgICAgICBjc2NfZGVpbnRlcmxlYXZlX21lbWNweSh5dXY0MjBfdV9kZXN0K2xpbmVhcl9vZmZzZXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeXV2NDIwX3ZfZGVzdCtsaW5lYXJfb2Zmc2V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG52MTJ0X3V2X3NyYyt0aWxlZF9vZmZzZXQsIDY0KTsKKyAgICAgICAgICAgICAgICBjc2NfZGVpbnRlcmxlYXZlX21lbWNweSh5dXY0MjBfdV9kZXN0K2xpbmVhcl9vZmZzZXQrMzIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeXV2NDIwX3ZfZGVzdCtsaW5lYXJfb2Zmc2V0KzMyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG52MTJ0X3V2X3NyYyt0aWxlZF9vZmZzZXQrMjA0OCwgNjQpOworICAgICAgICAgICAgICAgIGNzY19kZWludGVybGVhdmVfbWVtY3B5KHl1djQyMF91X2Rlc3QrbGluZWFyX29mZnNldCs2NCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB5dXY0MjBfdl9kZXN0K2xpbmVhcl9vZmZzZXQrNjQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbnYxMnRfdXZfc3JjK3RpbGVkX29mZnNldDEsIDY0KTsKKyAgICAgICAgICAgICAgICBjc2NfZGVpbnRlcmxlYXZlX21lbWNweSh5dXY0MjBfdV9kZXN0K2xpbmVhcl9vZmZzZXQrOTYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeXV2NDIwX3ZfZGVzdCtsaW5lYXJfb2Zmc2V0Kzk2LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG52MTJ0X3V2X3NyYyt0aWxlZF9vZmZzZXQxKzIwNDgsIHRlbXAyLTE5Mik7CisgICAgICAgICAgICB9IGVsc2UgaWYgKHRlbXAyID4gMTI4KSB7CisgICAgICAgICAgICAgICAgY3NjX2RlaW50ZXJsZWF2ZV9tZW1jcHkoeXV2NDIwX3VfZGVzdCtsaW5lYXJfb2Zmc2V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHl1djQyMF92X2Rlc3QrbGluZWFyX29mZnNldCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBudjEydF91dl9zcmMrdGlsZWRfb2Zmc2V0LCA2NCk7CisgICAgICAgICAgICAgICAgY3NjX2RlaW50ZXJsZWF2ZV9tZW1jcHkoeXV2NDIwX3VfZGVzdCtsaW5lYXJfb2Zmc2V0KzMyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHl1djQyMF92X2Rlc3QrbGluZWFyX29mZnNldCszMiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBudjEydF91dl9zcmMrdGlsZWRfb2Zmc2V0KzIwNDgsIDY0KTsKKyAgICAgICAgICAgICAgICBjc2NfZGVpbnRlcmxlYXZlX21lbWNweSh5dXY0MjBfdV9kZXN0K2xpbmVhcl9vZmZzZXQrNjQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeXV2NDIwX3ZfZGVzdCtsaW5lYXJfb2Zmc2V0KzY0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG52MTJ0X3V2X3NyYyt0aWxlZF9vZmZzZXQxLCB0ZW1wMi0xMjgpOworICAgICAgICAgICAgfSBlbHNlIGlmICh0ZW1wMiA+IDY0KSB7CisgICAgICAgICAgICAgICAgY3NjX2RlaW50ZXJsZWF2ZV9tZW1jcHkoeXV2NDIwX3VfZGVzdCtsaW5lYXJfb2Zmc2V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHl1djQyMF92X2Rlc3QrbGluZWFyX29mZnNldCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBudjEydF91dl9zcmMrdGlsZWRfb2Zmc2V0LCA2NCk7CisgICAgICAgICAgICAgICAgY3NjX2RlaW50ZXJsZWF2ZV9tZW1jcHkoeXV2NDIwX3VfZGVzdCtsaW5lYXJfb2Zmc2V0KzMyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHl1djQyMF92X2Rlc3QrbGluZWFyX29mZnNldCszMiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBudjEydF91dl9zcmMrdGlsZWRfb2Zmc2V0KzIwNDgsIHRlbXAyLTY0KTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgY3NjX2RlaW50ZXJsZWF2ZV9tZW1jcHkoeXV2NDIwX3VfZGVzdCtsaW5lYXJfb2Zmc2V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHl1djQyMF92X2Rlc3QrbGluZWFyX29mZnNldCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBudjEydF91dl9zcmMrdGlsZWRfb2Zmc2V0LCB0ZW1wMik7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9IGVsc2UgaWYgKHRlbXAxID49IDY0KSB7CisgICAgICAgIGZvciAoaT10b3A7IGk8KHl1djQyMF91dl9oZWlnaHQtYnV0dG9tKTsgaT1pKzEpIHsKKyAgICAgICAgICAgIGogPSBsZWZ0OworICAgICAgICAgICAgdGlsZWRfb2Zmc2V0ID0gdGlsZV80eDJfcmVhZCh5dXY0MjBfd2lkdGgsIHl1djQyMF91dl9oZWlnaHQsIGosIGkpOworICAgICAgICAgICAgdGVtcDIgPSAoKGorNjQpPj42KTw8NjsKKyAgICAgICAgICAgIHRlbXAyID0gdGVtcDItajsKKyAgICAgICAgICAgIHRlbXAzID0geXV2NDIwX3dpZHRoLXJpZ2h0OworICAgICAgICAgICAgdGVtcDQgPSB0ZW1wMy1sZWZ0OworICAgICAgICAgICAgbGluZWFyX29mZnNldCA9IHRlbXA0KihpLXRvcCkvMjsKKyAgICAgICAgICAgIHRlbXA0ID0gaiYweDM7CisgICAgICAgICAgICB0aWxlZF9vZmZzZXQgPSB0aWxlZF9vZmZzZXQrdGVtcDQ7CisgICAgICAgICAgICBjc2NfZGVpbnRlcmxlYXZlX21lbWNweSh5dXY0MjBfdV9kZXN0K2xpbmVhcl9vZmZzZXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB5dXY0MjBfdl9kZXN0K2xpbmVhcl9vZmZzZXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBudjEydF91dl9zcmMrdGlsZWRfb2Zmc2V0LCB0ZW1wMik7CisgICAgICAgICAgICBsaW5lYXJfb2Zmc2V0ID0gbGluZWFyX29mZnNldCt0ZW1wMi8yOworICAgICAgICAgICAgaiA9IGordGVtcDI7CisgICAgICAgICAgICBpZiAoKGorNjQpIDw9IHRlbXAzKSB7CisgICAgICAgICAgICAgICAgdGlsZWRfb2Zmc2V0ID0gdGlsZV80eDJfcmVhZCh5dXY0MjBfd2lkdGgsIHl1djQyMF91dl9oZWlnaHQsIGosIGkpOworICAgICAgICAgICAgICAgIGNzY19kZWludGVybGVhdmVfbWVtY3B5KHl1djQyMF91X2Rlc3QrbGluZWFyX29mZnNldCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB5dXY0MjBfdl9kZXN0K2xpbmVhcl9vZmZzZXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbnYxMnRfdXZfc3JjK3RpbGVkX29mZnNldCwgNjQpOworICAgICAgICAgICAgICAgIGxpbmVhcl9vZmZzZXQgPSBsaW5lYXJfb2Zmc2V0KzMyOworICAgICAgICAgICAgICAgIGogPSBqKzY0OworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKChqKzY0KSA8PSB0ZW1wMykgeworICAgICAgICAgICAgICAgIHRpbGVkX29mZnNldCA9IHRpbGVfNHgyX3JlYWQoeXV2NDIwX3dpZHRoLCB5dXY0MjBfdXZfaGVpZ2h0LCBqLCBpKTsKKyAgICAgICAgICAgICAgICBjc2NfZGVpbnRlcmxlYXZlX21lbWNweSh5dXY0MjBfdV9kZXN0K2xpbmVhcl9vZmZzZXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeXV2NDIwX3ZfZGVzdCtsaW5lYXJfb2Zmc2V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG52MTJ0X3V2X3NyYyt0aWxlZF9vZmZzZXQsIDY0KTsKKyAgICAgICAgICAgICAgICBsaW5lYXJfb2Zmc2V0ID0gbGluZWFyX29mZnNldCszMjsKKyAgICAgICAgICAgICAgICBqID0gais2NDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmIChqIDwgdGVtcDMpIHsKKyAgICAgICAgICAgICAgICB0aWxlZF9vZmZzZXQgPSB0aWxlXzR4Ml9yZWFkKHl1djQyMF93aWR0aCwgeXV2NDIwX3V2X2hlaWdodCwgaiwgaSk7CisgICAgICAgICAgICAgICAgdGVtcDEgPSB0ZW1wMy1qOworICAgICAgICAgICAgICAgIGNzY19kZWludGVybGVhdmVfbWVtY3B5KHl1djQyMF91X2Rlc3QrbGluZWFyX29mZnNldCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB5dXY0MjBfdl9kZXN0K2xpbmVhcl9vZmZzZXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbnYxMnRfdXZfc3JjK3RpbGVkX29mZnNldCwgdGVtcDEpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfSBlbHNlIHsKKyAgICAgICAgZm9yIChpPXRvcDsgaTwoeXV2NDIwX3V2X2hlaWdodC1idXR0b20pOyBpPWkrMSkgeworICAgICAgICAgICAgdGVtcDMgPSB5dXY0MjBfd2lkdGgtcmlnaHQ7CisgICAgICAgICAgICB0ZW1wNCA9IHRlbXAzLWxlZnQ7CisgICAgICAgICAgICBsaW5lYXJfb2Zmc2V0ID0gdGVtcDQqKGktdG9wKS8yOworICAgICAgICAgICAgZm9yIChqPWxlZnQ7IGo8KHl1djQyMF93aWR0aC1yaWdodCk7IGo9aisyKSB7CisgICAgICAgICAgICAgICAgdGlsZWRfb2Zmc2V0ID0gdGlsZV80eDJfcmVhZCh5dXY0MjBfd2lkdGgsIHl1djQyMF91dl9oZWlnaHQsIGosIGkpOworICAgICAgICAgICAgICAgIHRlbXAzID0gaiYweDM7CisgICAgICAgICAgICAgICAgdGlsZWRfb2Zmc2V0ID0gdGlsZWRfb2Zmc2V0K3RlbXAzOworICAgICAgICAgICAgICAgIGNzY19kZWludGVybGVhdmVfbWVtY3B5KHl1djQyMF91X2Rlc3QrbGluZWFyX29mZnNldCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB5dXY0MjBfdl9kZXN0K2xpbmVhcl9vZmZzZXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbnYxMnRfdXZfc3JjK3RpbGVkX29mZnNldCwgMik7CisgICAgICAgICAgICAgICAgbGluZWFyX29mZnNldCA9IGxpbmVhcl9vZmZzZXQrMTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KK30KKworLyoKKyAqIENvbnZlcnRzIGxpbmVhciBkYXRhIHRvIHRpbGVkCisgKiBDcm9wcyBsZWZ0LCB0b3AsIHJpZ2h0LCBidXR0b20KKyAqIDEuIFkgb2YgWVVWNDIwUCB0byBZIG9mIE5WMTJUCisgKiAyLiBZIG9mIFlVVjQyMFMgdG8gWSBvZiBOVjEyVAorICogMy4gVVYgb2YgWVVWNDIwUyB0byBVViBvZiBOVjEyVAorICoKKyAqIEBwYXJhbSBudjEydF9kZXN0CisgKiAgIFkgb3IgVVYgcGxhbmUgYWRkcmVzcyBvZiBOVjEyVFtvdXRdCisgKgorICogQHBhcmFtIHl1djQyMF9zcmMKKyAqICAgWSBvciBVViBwbGFuZSBhZGRyZXNzIG9mIFlVVjQyMFAoUylbaW5dCisgKgorICogQHBhcmFtIHl1djQyMF93aWR0aAorICogICBXaWR0aCBvZiBZVVY0MjBbaW5dCisgKgorICogQHBhcmFtIHl1djQyMF9oZWlnaHQKKyAqICAgWTogSGVpZ2h0IG9mIFlVVjQyMCwgVVY6IEhlaWdodC8yIG9mIFlVVjQyMFtpbl0KKyAqCisgKiBAcGFyYW0gbGVmdAorICogICBDcm9wIHNpemUgb2YgbGVmdAorICoKKyAqIEBwYXJhbSB0b3AKKyAqICAgQ3JvcCBzaXplIG9mIHRvcAorICoKKyAqIEBwYXJhbSByaWdodAorICogICBDcm9wIHNpemUgb2YgcmlnaHQKKyAqCisgKiBAcGFyYW0gYnV0dG9tCisgKiAgIENyb3Agc2l6ZSBvZiBidXR0b20KKyAqLworc3RhdGljIHZvaWQgY3NjX2xpbmVhcl90b190aWxlZF9jcm9wKAorICAgIHVuc2lnbmVkIGNoYXIgKm52MTJ0X2Rlc3QsCisgICAgdW5zaWduZWQgY2hhciAqeXV2NDIwX3NyYywKKyAgICB1bnNpZ25lZCBpbnQgeXV2NDIwX3dpZHRoLAorICAgIHVuc2lnbmVkIGludCB5dXY0MjBfaGVpZ2h0LAorICAgIHVuc2lnbmVkIGludCBsZWZ0LAorICAgIHVuc2lnbmVkIGludCB0b3AsCisgICAgdW5zaWduZWQgaW50IHJpZ2h0LAorICAgIHVuc2lnbmVkIGludCBidXR0b20pCit7CisgICAgdW5zaWduZWQgaW50IGksIGo7CisgICAgdW5zaWduZWQgaW50IHRpbGVkX3hfaW5kZXggPSAwLCB0aWxlZF95X2luZGV4ID0gMDsKKyAgICB1bnNpZ25lZCBpbnQgYWxpZ25lZF94X3NpemUgPSAwLCBhbGlnbmVkX3lfc2l6ZSA9IDA7CisgICAgdW5zaWduZWQgaW50IHRpbGVkX29mZnNldCA9IDA7CisgICAgdW5zaWduZWQgaW50IHRlbXAxID0gMCwgdGVtcDIgPSAwOworCisgICAgYWxpZ25lZF95X3NpemUgPSAoKHl1djQyMF9oZWlnaHQtdG9wLWJ1dHRvbSk+PjUpPDw1OworICAgIGFsaWduZWRfeF9zaXplID0gKCh5dXY0MjBfd2lkdGgtbGVmdC1yaWdodCk+PjYpPDw2OworCisgICAgZm9yIChpPTA7IGk8YWxpZ25lZF95X3NpemU7IGk9aSszMikgeworICAgICAgICBmb3IgKGo9MDsgajxhbGlnbmVkX3hfc2l6ZTsgaj1qKzY0KSB7CisgICAgICAgICAgICB0aWxlZF9vZmZzZXQgPSAwOworICAgICAgICAgICAgdGlsZWRfeF9pbmRleCA9IGo+PjY7CisgICAgICAgICAgICB0aWxlZF95X2luZGV4ID0gaT4+NTsKKyAgICAgICAgICAgIGlmICh0aWxlZF95X2luZGV4ICYgMHgxKSB7CisgICAgICAgICAgICAgICAgLyogb2RkIGZvbXVsYTogMit4Kyh4Pj4yKTw8Mit4X2Jsb2NrX251bSooeS0xKSAqLworICAgICAgICAgICAgICAgIHRpbGVkX29mZnNldCA9IHRpbGVkX3lfaW5kZXgtMTsKKyAgICAgICAgICAgICAgICB0ZW1wMSA9ICgoKHl1djQyMF93aWR0aC1sZWZ0LXJpZ2h0KSsxMjcpPj43KTw8NzsKKyAgICAgICAgICAgICAgICB0aWxlZF9vZmZzZXQgPSB0aWxlZF9vZmZzZXQqKHRlbXAxPj42KTsKKyAgICAgICAgICAgICAgICB0aWxlZF9vZmZzZXQgPSB0aWxlZF9vZmZzZXQrdGlsZWRfeF9pbmRleDsKKyAgICAgICAgICAgICAgICB0aWxlZF9vZmZzZXQgPSB0aWxlZF9vZmZzZXQrMjsKKyAgICAgICAgICAgICAgICB0ZW1wMSA9ICh0aWxlZF94X2luZGV4Pj4yKTw8MjsKKyAgICAgICAgICAgICAgICB0aWxlZF9vZmZzZXQgPSB0aWxlZF9vZmZzZXQrdGVtcDE7CisgICAgICAgICAgICAgICAgdGlsZWRfb2Zmc2V0ID0gdGlsZWRfb2Zmc2V0PDwxMTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgdGVtcDIgPSAoKCh5dXY0MjBfaGVpZ2h0LXRvcC1idXR0b20pKzMxKT4+NSk8PDU7CisgICAgICAgICAgICAgICAgaWYgKChpKzMyKTx0ZW1wMikgeworICAgICAgICAgICAgICAgICAgICAvKiBldmVuMSBmb211bGE6IHgrKCh4KzIpPj4yKTw8Mit4X2Jsb2NrX251bSp5ICovCisgICAgICAgICAgICAgICAgICAgIHRlbXAxID0gdGlsZWRfeF9pbmRleCsyOworICAgICAgICAgICAgICAgICAgICB0ZW1wMSA9ICh0ZW1wMT4+Mik8PDI7CisgICAgICAgICAgICAgICAgICAgIHRpbGVkX29mZnNldCA9IHRpbGVkX3hfaW5kZXgrdGVtcDE7CisgICAgICAgICAgICAgICAgICAgIHRlbXAxID0gKCgoeXV2NDIwX3dpZHRoLWxlZnQtcmlnaHQpKzEyNyk+PjcpPDw3OworICAgICAgICAgICAgICAgICAgICB0aWxlZF9vZmZzZXQgPSB0aWxlZF9vZmZzZXQrdGlsZWRfeV9pbmRleCoodGVtcDE+PjYpOworICAgICAgICAgICAgICAgICAgICB0aWxlZF9vZmZzZXQgPSB0aWxlZF9vZmZzZXQ8PDExOworICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIC8qIGV2ZW4yIGZvbXVsYTogeCt4X2Jsb2NrX251bSp5ICovCisgICAgICAgICAgICAgICAgICAgIHRlbXAxID0gKCgoeXV2NDIwX3dpZHRoLWxlZnQtcmlnaHQpKzEyNyk+PjcpPDw3OworICAgICAgICAgICAgICAgICAgICB0aWxlZF9vZmZzZXQgPSB0aWxlZF95X2luZGV4Kih0ZW1wMT4+Nik7CisgICAgICAgICAgICAgICAgICAgIHRpbGVkX29mZnNldCA9IHRpbGVkX29mZnNldCt0aWxlZF94X2luZGV4OworICAgICAgICAgICAgICAgICAgICB0aWxlZF9vZmZzZXQgPSB0aWxlZF9vZmZzZXQ8PDExOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgbWVtY3B5KG52MTJ0X2Rlc3QrdGlsZWRfb2Zmc2V0LCB5dXY0MjBfc3JjK2xlZnQrait5dXY0MjBfd2lkdGgqKGkrdG9wKSwgNjQpOworICAgICAgICAgICAgbWVtY3B5KG52MTJ0X2Rlc3QrdGlsZWRfb2Zmc2V0KzY0KjEsIHl1djQyMF9zcmMrbGVmdCtqK3l1djQyMF93aWR0aCooaSt0b3ArMSksIDY0KTsKKyAgICAgICAgICAgIG1lbWNweShudjEydF9kZXN0K3RpbGVkX29mZnNldCs2NCoyLCB5dXY0MjBfc3JjK2xlZnQrait5dXY0MjBfd2lkdGgqKGkrdG9wKzIpLCA2NCk7CisgICAgICAgICAgICBtZW1jcHkobnYxMnRfZGVzdCt0aWxlZF9vZmZzZXQrNjQqMywgeXV2NDIwX3NyYytsZWZ0K2oreXV2NDIwX3dpZHRoKihpK3RvcCszKSwgNjQpOworICAgICAgICAgICAgbWVtY3B5KG52MTJ0X2Rlc3QrdGlsZWRfb2Zmc2V0KzY0KjQsIHl1djQyMF9zcmMrbGVmdCtqK3l1djQyMF93aWR0aCooaSt0b3ArNCksIDY0KTsKKyAgICAgICAgICAgIG1lbWNweShudjEydF9kZXN0K3RpbGVkX29mZnNldCs2NCo1LCB5dXY0MjBfc3JjK2xlZnQrait5dXY0MjBfd2lkdGgqKGkrdG9wKzUpLCA2NCk7CisgICAgICAgICAgICBtZW1jcHkobnYxMnRfZGVzdCt0aWxlZF9vZmZzZXQrNjQqNiwgeXV2NDIwX3NyYytsZWZ0K2oreXV2NDIwX3dpZHRoKihpK3RvcCs2KSwgNjQpOworICAgICAgICAgICAgbWVtY3B5KG52MTJ0X2Rlc3QrdGlsZWRfb2Zmc2V0KzY0KjcsIHl1djQyMF9zcmMrbGVmdCtqK3l1djQyMF93aWR0aCooaSt0b3ArNyksIDY0KTsKKyAgICAgICAgICAgIG1lbWNweShudjEydF9kZXN0K3RpbGVkX29mZnNldCs2NCo4LCB5dXY0MjBfc3JjK2xlZnQrait5dXY0MjBfd2lkdGgqKGkrdG9wKzgpLCA2NCk7CisgICAgICAgICAgICBtZW1jcHkobnYxMnRfZGVzdCt0aWxlZF9vZmZzZXQrNjQqOSwgeXV2NDIwX3NyYytsZWZ0K2oreXV2NDIwX3dpZHRoKihpK3RvcCs5KSwgNjQpOworICAgICAgICAgICAgbWVtY3B5KG52MTJ0X2Rlc3QrdGlsZWRfb2Zmc2V0KzY0KjEwLCB5dXY0MjBfc3JjK2xlZnQrait5dXY0MjBfd2lkdGgqKGkrdG9wKzEwKSwgNjQpOworICAgICAgICAgICAgbWVtY3B5KG52MTJ0X2Rlc3QrdGlsZWRfb2Zmc2V0KzY0KjExLCB5dXY0MjBfc3JjK2xlZnQrait5dXY0MjBfd2lkdGgqKGkrdG9wKzExKSwgNjQpOworICAgICAgICAgICAgbWVtY3B5KG52MTJ0X2Rlc3QrdGlsZWRfb2Zmc2V0KzY0KjEyLCB5dXY0MjBfc3JjK2xlZnQrait5dXY0MjBfd2lkdGgqKGkrdG9wKzEyKSwgNjQpOworICAgICAgICAgICAgbWVtY3B5KG52MTJ0X2Rlc3QrdGlsZWRfb2Zmc2V0KzY0KjEzLCB5dXY0MjBfc3JjK2xlZnQrait5dXY0MjBfd2lkdGgqKGkrdG9wKzEzKSwgNjQpOworICAgICAgICAgICAgbWVtY3B5KG52MTJ0X2Rlc3QrdGlsZWRfb2Zmc2V0KzY0KjE0LCB5dXY0MjBfc3JjK2xlZnQrait5dXY0MjBfd2lkdGgqKGkrdG9wKzE0KSwgNjQpOworICAgICAgICAgICAgbWVtY3B5KG52MTJ0X2Rlc3QrdGlsZWRfb2Zmc2V0KzY0KjE1LCB5dXY0MjBfc3JjK2xlZnQrait5dXY0MjBfd2lkdGgqKGkrdG9wKzE1KSwgNjQpOworICAgICAgICAgICAgbWVtY3B5KG52MTJ0X2Rlc3QrdGlsZWRfb2Zmc2V0KzY0KjE2LCB5dXY0MjBfc3JjK2xlZnQrait5dXY0MjBfd2lkdGgqKGkrdG9wKzE2KSwgNjQpOworICAgICAgICAgICAgbWVtY3B5KG52MTJ0X2Rlc3QrdGlsZWRfb2Zmc2V0KzY0KjE3LCB5dXY0MjBfc3JjK2xlZnQrait5dXY0MjBfd2lkdGgqKGkrdG9wKzE3KSwgNjQpOworICAgICAgICAgICAgbWVtY3B5KG52MTJ0X2Rlc3QrdGlsZWRfb2Zmc2V0KzY0KjE4LCB5dXY0MjBfc3JjK2xlZnQrait5dXY0MjBfd2lkdGgqKGkrdG9wKzE4KSwgNjQpOworICAgICAgICAgICAgbWVtY3B5KG52MTJ0X2Rlc3QrdGlsZWRfb2Zmc2V0KzY0KjE5LCB5dXY0MjBfc3JjK2xlZnQrait5dXY0MjBfd2lkdGgqKGkrdG9wKzE5KSwgNjQpOworICAgICAgICAgICAgbWVtY3B5KG52MTJ0X2Rlc3QrdGlsZWRfb2Zmc2V0KzY0KjIwLCB5dXY0MjBfc3JjK2xlZnQrait5dXY0MjBfd2lkdGgqKGkrdG9wKzIwKSwgNjQpOworICAgICAgICAgICAgbWVtY3B5KG52MTJ0X2Rlc3QrdGlsZWRfb2Zmc2V0KzY0KjIxLCB5dXY0MjBfc3JjK2xlZnQrait5dXY0MjBfd2lkdGgqKGkrdG9wKzIxKSwgNjQpOworICAgICAgICAgICAgbWVtY3B5KG52MTJ0X2Rlc3QrdGlsZWRfb2Zmc2V0KzY0KjIyLCB5dXY0MjBfc3JjK2xlZnQrait5dXY0MjBfd2lkdGgqKGkrdG9wKzIyKSwgNjQpOworICAgICAgICAgICAgbWVtY3B5KG52MTJ0X2Rlc3QrdGlsZWRfb2Zmc2V0KzY0KjIzLCB5dXY0MjBfc3JjK2xlZnQrait5dXY0MjBfd2lkdGgqKGkrdG9wKzIzKSwgNjQpOworICAgICAgICAgICAgbWVtY3B5KG52MTJ0X2Rlc3QrdGlsZWRfb2Zmc2V0KzY0KjI0LCB5dXY0MjBfc3JjK2xlZnQrait5dXY0MjBfd2lkdGgqKGkrdG9wKzI0KSwgNjQpOworICAgICAgICAgICAgbWVtY3B5KG52MTJ0X2Rlc3QrdGlsZWRfb2Zmc2V0KzY0KjI1LCB5dXY0MjBfc3JjK2xlZnQrait5dXY0MjBfd2lkdGgqKGkrdG9wKzI1KSwgNjQpOworICAgICAgICAgICAgbWVtY3B5KG52MTJ0X2Rlc3QrdGlsZWRfb2Zmc2V0KzY0KjI2LCB5dXY0MjBfc3JjK2xlZnQrait5dXY0MjBfd2lkdGgqKGkrdG9wKzI2KSwgNjQpOworICAgICAgICAgICAgbWVtY3B5KG52MTJ0X2Rlc3QrdGlsZWRfb2Zmc2V0KzY0KjI3LCB5dXY0MjBfc3JjK2xlZnQrait5dXY0MjBfd2lkdGgqKGkrdG9wKzI3KSwgNjQpOworICAgICAgICAgICAgbWVtY3B5KG52MTJ0X2Rlc3QrdGlsZWRfb2Zmc2V0KzY0KjI4LCB5dXY0MjBfc3JjK2xlZnQrait5dXY0MjBfd2lkdGgqKGkrdG9wKzI4KSwgNjQpOworICAgICAgICAgICAgbWVtY3B5KG52MTJ0X2Rlc3QrdGlsZWRfb2Zmc2V0KzY0KjI5LCB5dXY0MjBfc3JjK2xlZnQrait5dXY0MjBfd2lkdGgqKGkrdG9wKzI5KSwgNjQpOworICAgICAgICAgICAgbWVtY3B5KG52MTJ0X2Rlc3QrdGlsZWRfb2Zmc2V0KzY0KjMwLCB5dXY0MjBfc3JjK2xlZnQrait5dXY0MjBfd2lkdGgqKGkrdG9wKzMwKSwgNjQpOworICAgICAgICAgICAgbWVtY3B5KG52MTJ0X2Rlc3QrdGlsZWRfb2Zmc2V0KzY0KjMxLCB5dXY0MjBfc3JjK2xlZnQrait5dXY0MjBfd2lkdGgqKGkrdG9wKzMxKSwgNjQpOworICAgICAgICB9CisgICAgfQorCisgICAgZm9yIChpPWFsaWduZWRfeV9zaXplOyBpPCh5dXY0MjBfaGVpZ2h0LXRvcC1idXR0b20pOyBpPWkrMikgeworICAgICAgICBmb3IgKGo9MDsgajxhbGlnbmVkX3hfc2l6ZTsgaj1qKzY0KSB7CisgICAgICAgICAgICB0aWxlZF9vZmZzZXQgPSAwOworICAgICAgICAgICAgdGlsZWRfeF9pbmRleCA9IGo+PjY7CisgICAgICAgICAgICB0aWxlZF95X2luZGV4ID0gaT4+NTsKKyAgICAgICAgICAgIGlmICh0aWxlZF95X2luZGV4ICYgMHgxKSB7CisgICAgICAgICAgICAgICAgLyogb2RkIGZvbXVsYTogMit4Kyh4Pj4yKTw8Mit4X2Jsb2NrX251bSooeS0xKSAqLworICAgICAgICAgICAgICAgIHRpbGVkX29mZnNldCA9IHRpbGVkX3lfaW5kZXgtMTsKKyAgICAgICAgICAgICAgICB0ZW1wMSA9ICgoKHl1djQyMF93aWR0aC1sZWZ0LXJpZ2h0KSsxMjcpPj43KTw8NzsKKyAgICAgICAgICAgICAgICB0aWxlZF9vZmZzZXQgPSB0aWxlZF9vZmZzZXQqKHRlbXAxPj42KTsKKyAgICAgICAgICAgICAgICB0aWxlZF9vZmZzZXQgPSB0aWxlZF9vZmZzZXQrdGlsZWRfeF9pbmRleDsKKyAgICAgICAgICAgICAgICB0aWxlZF9vZmZzZXQgPSB0aWxlZF9vZmZzZXQrMjsKKyAgICAgICAgICAgICAgICB0ZW1wMSA9ICh0aWxlZF94X2luZGV4Pj4yKTw8MjsKKyAgICAgICAgICAgICAgICB0aWxlZF9vZmZzZXQgPSB0aWxlZF9vZmZzZXQrdGVtcDE7CisgICAgICAgICAgICAgICAgdGlsZWRfb2Zmc2V0ID0gdGlsZWRfb2Zmc2V0PDwxMTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgdGVtcDIgPSAoKCh5dXY0MjBfaGVpZ2h0LXRvcC1idXR0b20pKzMxKT4+NSk8PDU7CisgICAgICAgICAgICAgICAgaWYgKChpKzMyKTx0ZW1wMikgeworICAgICAgICAgICAgICAgICAgICAvKiBldmVuMSBmb211bGE6IHgrKCh4KzIpPj4yKTw8Mit4X2Jsb2NrX251bSp5ICovCisgICAgICAgICAgICAgICAgICAgIHRlbXAxID0gdGlsZWRfeF9pbmRleCsyOworICAgICAgICAgICAgICAgICAgICB0ZW1wMSA9ICh0ZW1wMT4+Mik8PDI7CisgICAgICAgICAgICAgICAgICAgIHRpbGVkX29mZnNldCA9IHRpbGVkX3hfaW5kZXgrdGVtcDE7CisgICAgICAgICAgICAgICAgICAgIHRlbXAxID0gKCgoeXV2NDIwX3dpZHRoLWxlZnQtcmlnaHQpKzEyNyk+PjcpPDw3OworICAgICAgICAgICAgICAgICAgICB0aWxlZF9vZmZzZXQgPSB0aWxlZF9vZmZzZXQrdGlsZWRfeV9pbmRleCoodGVtcDE+PjYpOworICAgICAgICAgICAgICAgICAgICB0aWxlZF9vZmZzZXQgPSB0aWxlZF9vZmZzZXQ8PDExOworICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIC8qIGV2ZW4yIGZvbXVsYTogeCt4X2Jsb2NrX251bSp5ICovCisgICAgICAgICAgICAgICAgICAgIHRlbXAxID0gKCgoeXV2NDIwX3dpZHRoLWxlZnQtcmlnaHQpKzEyNyk+PjcpPDw3OworICAgICAgICAgICAgICAgICAgICB0aWxlZF9vZmZzZXQgPSB0aWxlZF95X2luZGV4Kih0ZW1wMT4+Nik7CisgICAgICAgICAgICAgICAgICAgIHRpbGVkX29mZnNldCA9IHRpbGVkX29mZnNldCt0aWxlZF94X2luZGV4OworICAgICAgICAgICAgICAgICAgICB0aWxlZF9vZmZzZXQgPSB0aWxlZF9vZmZzZXQ8PDExOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgdGVtcDEgPSBpJjB4MUY7CisgICAgICAgICAgICBtZW1jcHkobnYxMnRfZGVzdCt0aWxlZF9vZmZzZXQrNjQqKHRlbXAxKSwgeXV2NDIwX3NyYytsZWZ0K2oreXV2NDIwX3dpZHRoKihpK3RvcCksIDY0KTsKKyAgICAgICAgICAgIG1lbWNweShudjEydF9kZXN0K3RpbGVkX29mZnNldCs2NCoodGVtcDErMSksIHl1djQyMF9zcmMrbGVmdCtqK3l1djQyMF93aWR0aCooaSt0b3ArMSksIDY0KTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGZvciAoaT0wOyBpPCh5dXY0MjBfaGVpZ2h0LXRvcC1idXR0b20pOyBpPWkrMikgeworICAgICAgICBmb3IgKGo9YWxpZ25lZF94X3NpemU7IGo8KHl1djQyMF93aWR0aC1sZWZ0LXJpZ2h0KTsgaj1qKzIpIHsKKyAgICAgICAgICAgIHRpbGVkX29mZnNldCA9IDA7CisgICAgICAgICAgICB0aWxlZF94X2luZGV4ID0gaj4+NjsKKyAgICAgICAgICAgIHRpbGVkX3lfaW5kZXggPSBpPj41OworICAgICAgICAgICAgaWYgKHRpbGVkX3lfaW5kZXggJiAweDEpIHsKKyAgICAgICAgICAgICAgICAvKiBvZGQgZm9tdWxhOiAyK3grKHg+PjIpPDwyK3hfYmxvY2tfbnVtKih5LTEpICovCisgICAgICAgICAgICAgICAgdGlsZWRfb2Zmc2V0ID0gdGlsZWRfeV9pbmRleC0xOworICAgICAgICAgICAgICAgIHRlbXAxID0gKCgoeXV2NDIwX3dpZHRoLWxlZnQtcmlnaHQpKzEyNyk+PjcpPDw3OworICAgICAgICAgICAgICAgIHRpbGVkX29mZnNldCA9IHRpbGVkX29mZnNldCoodGVtcDE+PjYpOworICAgICAgICAgICAgICAgIHRpbGVkX29mZnNldCA9IHRpbGVkX29mZnNldCt0aWxlZF94X2luZGV4OworICAgICAgICAgICAgICAgIHRpbGVkX29mZnNldCA9IHRpbGVkX29mZnNldCsyOworICAgICAgICAgICAgICAgIHRlbXAxID0gKHRpbGVkX3hfaW5kZXg+PjIpPDwyOworICAgICAgICAgICAgICAgIHRpbGVkX29mZnNldCA9IHRpbGVkX29mZnNldCt0ZW1wMTsKKyAgICAgICAgICAgICAgICB0aWxlZF9vZmZzZXQgPSB0aWxlZF9vZmZzZXQ8PDExOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICB0ZW1wMiA9ICgoKHl1djQyMF9oZWlnaHQtdG9wLWJ1dHRvbSkrMzEpPj41KTw8NTsKKyAgICAgICAgICAgICAgICBpZiAoKGkrMzIpPHRlbXAyKSB7CisgICAgICAgICAgICAgICAgICAgIC8qIGV2ZW4xIGZvbXVsYTogeCsoKHgrMik+PjIpPDwyK3hfYmxvY2tfbnVtKnkgKi8KKyAgICAgICAgICAgICAgICAgICAgdGVtcDEgPSB0aWxlZF94X2luZGV4KzI7CisgICAgICAgICAgICAgICAgICAgIHRlbXAxID0gKHRlbXAxPj4yKTw8MjsKKyAgICAgICAgICAgICAgICAgICAgdGlsZWRfb2Zmc2V0ID0gdGlsZWRfeF9pbmRleCt0ZW1wMTsKKyAgICAgICAgICAgICAgICAgICAgdGVtcDEgPSAoKCh5dXY0MjBfd2lkdGgtbGVmdC1yaWdodCkrMTI3KT4+Nyk8PDc7CisgICAgICAgICAgICAgICAgICAgIHRpbGVkX29mZnNldCA9IHRpbGVkX29mZnNldCt0aWxlZF95X2luZGV4Kih0ZW1wMT4+Nik7CisgICAgICAgICAgICAgICAgICAgIHRpbGVkX29mZnNldCA9IHRpbGVkX29mZnNldDw8MTE7CisgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgLyogZXZlbjIgZm9tdWxhOiB4K3hfYmxvY2tfbnVtKnkgKi8KKyAgICAgICAgICAgICAgICAgICAgdGVtcDEgPSAoKCh5dXY0MjBfd2lkdGgtbGVmdC1yaWdodCkrMTI3KT4+Nyk8PDc7CisgICAgICAgICAgICAgICAgICAgIHRpbGVkX29mZnNldCA9IHRpbGVkX3lfaW5kZXgqKHRlbXAxPj42KTsKKyAgICAgICAgICAgICAgICAgICAgdGlsZWRfb2Zmc2V0ID0gdGlsZWRfb2Zmc2V0K3RpbGVkX3hfaW5kZXg7CisgICAgICAgICAgICAgICAgICAgIHRpbGVkX29mZnNldCA9IHRpbGVkX29mZnNldDw8MTE7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorCisgICAgICAgICAgICB0ZW1wMSA9IGkmMHgxRjsKKyAgICAgICAgICAgIHRlbXAyID0gaiYweDNGOworICAgICAgICAgICAgbWVtY3B5KG52MTJ0X2Rlc3QrdGlsZWRfb2Zmc2V0K3RlbXAyKzY0Kih0ZW1wMSksIHl1djQyMF9zcmMrbGVmdCtqK3l1djQyMF93aWR0aCooaSt0b3ApLCAyKTsKKyAgICAgICAgICAgIG1lbWNweShudjEydF9kZXN0K3RpbGVkX29mZnNldCt0ZW1wMis2NCoodGVtcDErMSksIHl1djQyMF9zcmMrbGVmdCtqK3l1djQyMF93aWR0aCooaSt0b3ArMSksIDIpOworICAgICAgICB9CisgICAgfQorCit9CisKKy8qCisgKiBDb252ZXJ0cyBhbmQgSW50ZXJsZWF2ZXMgbGluZWFyIHRvIHRpbGVkCisgKiBDcm9wcyBsZWZ0LCB0b3AsIHJpZ2h0LCBidXR0b20KKyAqIDEuIFVWIG9mIFlVVjQyMFAgdG8gVVYgb2YgTlYxMlQKKyAqCisgKiBAcGFyYW0gbnYxMnRfdXZfZGVzdAorICogICBVViBwbGFuZSBhZGRyZXNzIG9mIE5WMTJUW291dF0KKyAqCisgKiBAcGFyYW0geXV2NDIwcF91X3NyYworICogICBVIHBsYW5lIGFkZHJlc3Mgb2YgWVVWNDIwUFtpbl0KKyAqCisgKiBAcGFyYW0geXV2NDIwcF92X3NyYworICogICBWIHBsYW5lIGFkZHJlc3Mgb2YgWVVWNDIwUFtpbl0KKyAqCisgKiBAcGFyYW0geXV2NDIwX3dpZHRoCisgKiAgIFdpZHRoIG9mIFlVVjQyMFtpbl0KKyAqCisgKiBAcGFyYW0geXV2NDIwX3V2X2hlaWdodAorICogICBIZWlnaHQvMiBvZiBZVVY0MjBbaW5dCisgKgorICogQHBhcmFtIGxlZnQKKyAqICAgQ3JvcCBzaXplIG9mIGxlZnQKKyAqCisgKiBAcGFyYW0gdG9wCisgKiAgIENyb3Agc2l6ZSBvZiB0b3AKKyAqCisgKiBAcGFyYW0gcmlnaHQKKyAqICAgQ3JvcCBzaXplIG9mIHJpZ2h0CisgKgorICogQHBhcmFtIGJ1dHRvbQorICogICBDcm9wIHNpemUgb2YgYnV0dG9tCisgKi8KK3N0YXRpYyB2b2lkIGNzY19saW5lYXJfdG9fdGlsZWRfaW50ZXJsZWF2ZV9jcm9wKAorICAgIHVuc2lnbmVkIGNoYXIgKm52MTJ0X3V2X2Rlc3QsCisgICAgdW5zaWduZWQgY2hhciAqeXV2NDIwX3Vfc3JjLAorICAgIHVuc2lnbmVkIGNoYXIgKnl1djQyMF92X3NyYywKKyAgICB1bnNpZ25lZCBpbnQgeXV2NDIwX3dpZHRoLAorICAgIHVuc2lnbmVkIGludCB5dXY0MjBfaGVpZ2h0LAorICAgIHVuc2lnbmVkIGludCBsZWZ0LAorICAgIHVuc2lnbmVkIGludCB0b3AsCisgICAgdW5zaWduZWQgaW50IHJpZ2h0LAorICAgIHVuc2lnbmVkIGludCBidXR0b20pCit7CisgICAgdW5zaWduZWQgaW50IGksIGo7CisgICAgdW5zaWduZWQgaW50IHRpbGVkX3hfaW5kZXggPSAwLCB0aWxlZF95X2luZGV4ID0gMDsKKyAgICB1bnNpZ25lZCBpbnQgYWxpZ25lZF94X3NpemUgPSAwLCBhbGlnbmVkX3lfc2l6ZSA9IDA7CisgICAgdW5zaWduZWQgaW50IHRpbGVkX29mZnNldCA9IDA7CisgICAgdW5zaWduZWQgaW50IHRlbXAxID0gMCwgdGVtcDIgPSAwOworCisgICAgYWxpZ25lZF95X3NpemUgPSAoKHl1djQyMF9oZWlnaHQtdG9wLWJ1dHRvbSk+PjUpPDw1OworICAgIGFsaWduZWRfeF9zaXplID0gKCh5dXY0MjBfd2lkdGgtbGVmdC1yaWdodCk+PjYpPDw2OworCisgICAgZm9yIChpPTA7IGk8YWxpZ25lZF95X3NpemU7IGk9aSszMikgeworICAgICAgICBmb3IgKGo9MDsgajxhbGlnbmVkX3hfc2l6ZTsgaj1qKzY0KSB7CisgICAgICAgICAgICB0aWxlZF9vZmZzZXQgPSAwOworICAgICAgICAgICAgdGlsZWRfeF9pbmRleCA9IGo+PjY7CisgICAgICAgICAgICB0aWxlZF95X2luZGV4ID0gaT4+NTsKKyAgICAgICAgICAgIGlmICh0aWxlZF95X2luZGV4ICYgMHgxKSB7CisgICAgICAgICAgICAgICAgLyogb2RkIGZvbXVsYTogMit4Kyh4Pj4yKTw8Mit4X2Jsb2NrX251bSooeS0xKSAqLworICAgICAgICAgICAgICAgIHRpbGVkX29mZnNldCA9IHRpbGVkX3lfaW5kZXgtMTsKKyAgICAgICAgICAgICAgICB0ZW1wMSA9ICgoKHl1djQyMF93aWR0aC1sZWZ0LXJpZ2h0KSsxMjcpPj43KTw8NzsKKyAgICAgICAgICAgICAgICB0aWxlZF9vZmZzZXQgPSB0aWxlZF9vZmZzZXQqKHRlbXAxPj42KTsKKyAgICAgICAgICAgICAgICB0aWxlZF9vZmZzZXQgPSB0aWxlZF9vZmZzZXQrdGlsZWRfeF9pbmRleDsKKyAgICAgICAgICAgICAgICB0aWxlZF9vZmZzZXQgPSB0aWxlZF9vZmZzZXQrMjsKKyAgICAgICAgICAgICAgICB0ZW1wMSA9ICh0aWxlZF94X2luZGV4Pj4yKTw8MjsKKyAgICAgICAgICAgICAgICB0aWxlZF9vZmZzZXQgPSB0aWxlZF9vZmZzZXQrdGVtcDE7CisgICAgICAgICAgICAgICAgdGlsZWRfb2Zmc2V0ID0gdGlsZWRfb2Zmc2V0PDwxMTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgdGVtcDIgPSAoKCh5dXY0MjBfaGVpZ2h0LXRvcC1idXR0b20pKzMxKT4+NSk8PDU7CisgICAgICAgICAgICAgICAgaWYgKChpKzMyKTx0ZW1wMikgeworICAgICAgICAgICAgICAgICAgICAvKiBldmVuMSBmb211bGE6IHgrKCh4KzIpPj4yKTw8Mit4X2Jsb2NrX251bSp5ICovCisgICAgICAgICAgICAgICAgICAgIHRlbXAxID0gdGlsZWRfeF9pbmRleCsyOworICAgICAgICAgICAgICAgICAgICB0ZW1wMSA9ICh0ZW1wMT4+Mik8PDI7CisgICAgICAgICAgICAgICAgICAgIHRpbGVkX29mZnNldCA9IHRpbGVkX3hfaW5kZXgrdGVtcDE7CisgICAgICAgICAgICAgICAgICAgIHRlbXAxID0gKCgoeXV2NDIwX3dpZHRoLWxlZnQtcmlnaHQpKzEyNyk+PjcpPDw3OworICAgICAgICAgICAgICAgICAgICB0aWxlZF9vZmZzZXQgPSB0aWxlZF9vZmZzZXQrdGlsZWRfeV9pbmRleCoodGVtcDE+PjYpOworICAgICAgICAgICAgICAgICAgICB0aWxlZF9vZmZzZXQgPSB0aWxlZF9vZmZzZXQ8PDExOworICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIC8qIGV2ZW4yIGZvbXVsYTogeCt4X2Jsb2NrX251bSp5ICovCisgICAgICAgICAgICAgICAgICAgIHRlbXAxID0gKCgoeXV2NDIwX3dpZHRoLWxlZnQtcmlnaHQpKzEyNyk+PjcpPDw3OworICAgICAgICAgICAgICAgICAgICB0aWxlZF9vZmZzZXQgPSB0aWxlZF95X2luZGV4Kih0ZW1wMT4+Nik7CisgICAgICAgICAgICAgICAgICAgIHRpbGVkX29mZnNldCA9IHRpbGVkX29mZnNldCt0aWxlZF94X2luZGV4OworICAgICAgICAgICAgICAgICAgICB0aWxlZF9vZmZzZXQgPSB0aWxlZF9vZmZzZXQ8PDExOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgY3NjX2ludGVybGVhdmVfbWVtY3B5KG52MTJ0X3V2X2Rlc3QrdGlsZWRfb2Zmc2V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeXV2NDIwX3Vfc3JjK2xlZnQvMitqLzIreXV2NDIwX3dpZHRoLzIqKGkrdG9wKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHl1djQyMF92X3NyYytsZWZ0LzIrai8yK3l1djQyMF93aWR0aC8yKihpK3RvcCksIDMyKTsKKyAgICAgICAgICAgIGNzY19pbnRlcmxlYXZlX21lbWNweShudjEydF91dl9kZXN0K3RpbGVkX29mZnNldCs2NCoxLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeXV2NDIwX3Vfc3JjK2xlZnQvMitqLzIreXV2NDIwX3dpZHRoLzIqKGkrdG9wKzEpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeXV2NDIwX3Zfc3JjK2xlZnQvMitqLzIreXV2NDIwX3dpZHRoLzIqKGkrdG9wKzEpLCAzMik7CisgICAgICAgICAgICBjc2NfaW50ZXJsZWF2ZV9tZW1jcHkobnYxMnRfdXZfZGVzdCt0aWxlZF9vZmZzZXQrNjQqMiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHl1djQyMF91X3NyYytsZWZ0LzIrai8yK3l1djQyMF93aWR0aC8yKihpK3RvcCsyKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHl1djQyMF92X3NyYytsZWZ0LzIrai8yK3l1djQyMF93aWR0aC8yKihpK3RvcCsyKSwgMzIpOworICAgICAgICAgICAgY3NjX2ludGVybGVhdmVfbWVtY3B5KG52MTJ0X3V2X2Rlc3QrdGlsZWRfb2Zmc2V0KzY0KjMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB5dXY0MjBfdV9zcmMrbGVmdC8yK2ovMit5dXY0MjBfd2lkdGgvMiooaSt0b3ArMyksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB5dXY0MjBfdl9zcmMrbGVmdC8yK2ovMit5dXY0MjBfd2lkdGgvMiooaSt0b3ArMyksIDMyKTsKKyAgICAgICAgICAgIGNzY19pbnRlcmxlYXZlX21lbWNweShudjEydF91dl9kZXN0K3RpbGVkX29mZnNldCs2NCo0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeXV2NDIwX3Vfc3JjK2xlZnQvMitqLzIreXV2NDIwX3dpZHRoLzIqKGkrdG9wKzQpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeXV2NDIwX3Zfc3JjK2xlZnQvMitqLzIreXV2NDIwX3dpZHRoLzIqKGkrdG9wKzQpLCAzMik7CisgICAgICAgICAgICBjc2NfaW50ZXJsZWF2ZV9tZW1jcHkobnYxMnRfdXZfZGVzdCt0aWxlZF9vZmZzZXQrNjQqNSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHl1djQyMF91X3NyYytsZWZ0LzIrai8yK3l1djQyMF93aWR0aC8yKihpK3RvcCs1KSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHl1djQyMF92X3NyYytsZWZ0LzIrai8yK3l1djQyMF93aWR0aC8yKihpK3RvcCs1KSwgMzIpOworICAgICAgICAgICAgY3NjX2ludGVybGVhdmVfbWVtY3B5KG52MTJ0X3V2X2Rlc3QrdGlsZWRfb2Zmc2V0KzY0KjYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB5dXY0MjBfdV9zcmMrbGVmdC8yK2ovMit5dXY0MjBfd2lkdGgvMiooaSt0b3ArNiksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB5dXY0MjBfdl9zcmMrbGVmdC8yK2ovMit5dXY0MjBfd2lkdGgvMiooaSt0b3ArNiksIDMyKTsKKyAgICAgICAgICAgIGNzY19pbnRlcmxlYXZlX21lbWNweShudjEydF91dl9kZXN0K3RpbGVkX29mZnNldCs2NCo3LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeXV2NDIwX3Vfc3JjK2xlZnQvMitqLzIreXV2NDIwX3dpZHRoLzIqKGkrdG9wKzcpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeXV2NDIwX3Zfc3JjK2xlZnQvMitqLzIreXV2NDIwX3dpZHRoLzIqKGkrdG9wKzcpLCAzMik7CisgICAgICAgICAgICBjc2NfaW50ZXJsZWF2ZV9tZW1jcHkobnYxMnRfdXZfZGVzdCt0aWxlZF9vZmZzZXQrNjQqOCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHl1djQyMF91X3NyYytsZWZ0LzIrai8yK3l1djQyMF93aWR0aC8yKihpK3RvcCs4KSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHl1djQyMF92X3NyYytsZWZ0LzIrai8yK3l1djQyMF93aWR0aC8yKihpK3RvcCs4KSwgMzIpOworICAgICAgICAgICAgY3NjX2ludGVybGVhdmVfbWVtY3B5KG52MTJ0X3V2X2Rlc3QrdGlsZWRfb2Zmc2V0KzY0KjksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB5dXY0MjBfdV9zcmMrbGVmdC8yK2ovMit5dXY0MjBfd2lkdGgvMiooaSt0b3ArOSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB5dXY0MjBfdl9zcmMrbGVmdC8yK2ovMit5dXY0MjBfd2lkdGgvMiooaSt0b3ArOSksIDMyKTsKKyAgICAgICAgICAgIGNzY19pbnRlcmxlYXZlX21lbWNweShudjEydF91dl9kZXN0K3RpbGVkX29mZnNldCs2NCoxMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHl1djQyMF91X3NyYytsZWZ0LzIrai8yK3l1djQyMF93aWR0aC8yKihpK3RvcCsxMCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB5dXY0MjBfdl9zcmMrbGVmdC8yK2ovMit5dXY0MjBfd2lkdGgvMiooaSt0b3ArMTApLCAzMik7CisgICAgICAgICAgICBjc2NfaW50ZXJsZWF2ZV9tZW1jcHkobnYxMnRfdXZfZGVzdCt0aWxlZF9vZmZzZXQrNjQqMTEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB5dXY0MjBfdV9zcmMrbGVmdC8yK2ovMit5dXY0MjBfd2lkdGgvMiooaSt0b3ArMTEpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeXV2NDIwX3Zfc3JjK2xlZnQvMitqLzIreXV2NDIwX3dpZHRoLzIqKGkrdG9wKzExKSwgMzIpOworICAgICAgICAgICAgY3NjX2ludGVybGVhdmVfbWVtY3B5KG52MTJ0X3V2X2Rlc3QrdGlsZWRfb2Zmc2V0KzY0KjEyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeXV2NDIwX3Vfc3JjK2xlZnQvMitqLzIreXV2NDIwX3dpZHRoLzIqKGkrdG9wKzEyKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHl1djQyMF92X3NyYytsZWZ0LzIrai8yK3l1djQyMF93aWR0aC8yKihpK3RvcCsxMiksIDMyKTsKKyAgICAgICAgICAgIGNzY19pbnRlcmxlYXZlX21lbWNweShudjEydF91dl9kZXN0K3RpbGVkX29mZnNldCs2NCoxMywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHl1djQyMF91X3NyYytsZWZ0LzIrai8yK3l1djQyMF93aWR0aC8yKihpK3RvcCsxMyksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB5dXY0MjBfdl9zcmMrbGVmdC8yK2ovMit5dXY0MjBfd2lkdGgvMiooaSt0b3ArMTMpLCAzMik7CisgICAgICAgICAgICBjc2NfaW50ZXJsZWF2ZV9tZW1jcHkobnYxMnRfdXZfZGVzdCt0aWxlZF9vZmZzZXQrNjQqMTQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB5dXY0MjBfdV9zcmMrbGVmdC8yK2ovMit5dXY0MjBfd2lkdGgvMiooaSt0b3ArMTQpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeXV2NDIwX3Zfc3JjK2xlZnQvMitqLzIreXV2NDIwX3dpZHRoLzIqKGkrdG9wKzE0KSwgMzIpOworICAgICAgICAgICAgY3NjX2ludGVybGVhdmVfbWVtY3B5KG52MTJ0X3V2X2Rlc3QrdGlsZWRfb2Zmc2V0KzY0KjE1LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeXV2NDIwX3Vfc3JjK2xlZnQvMitqLzIreXV2NDIwX3dpZHRoLzIqKGkrdG9wKzE1KSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHl1djQyMF92X3NyYytsZWZ0LzIrai8yK3l1djQyMF93aWR0aC8yKihpK3RvcCsxNSksIDMyKTsKKyAgICAgICAgICAgIGNzY19pbnRlcmxlYXZlX21lbWNweShudjEydF91dl9kZXN0K3RpbGVkX29mZnNldCs2NCoxNiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHl1djQyMF91X3NyYytsZWZ0LzIrai8yK3l1djQyMF93aWR0aC8yKihpK3RvcCsxNiksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB5dXY0MjBfdl9zcmMrbGVmdC8yK2ovMit5dXY0MjBfd2lkdGgvMiooaSt0b3ArMTYpLCAzMik7CisgICAgICAgICAgICBjc2NfaW50ZXJsZWF2ZV9tZW1jcHkobnYxMnRfdXZfZGVzdCt0aWxlZF9vZmZzZXQrNjQqMTcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB5dXY0MjBfdV9zcmMrbGVmdC8yK2ovMit5dXY0MjBfd2lkdGgvMiooaSt0b3ArMTcpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeXV2NDIwX3Zfc3JjK2xlZnQvMitqLzIreXV2NDIwX3dpZHRoLzIqKGkrdG9wKzE3KSwgMzIpOworICAgICAgICAgICAgY3NjX2ludGVybGVhdmVfbWVtY3B5KG52MTJ0X3V2X2Rlc3QrdGlsZWRfb2Zmc2V0KzY0KjE4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeXV2NDIwX3Vfc3JjK2xlZnQvMitqLzIreXV2NDIwX3dpZHRoLzIqKGkrdG9wKzE4KSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHl1djQyMF92X3NyYytsZWZ0LzIrai8yK3l1djQyMF93aWR0aC8yKihpK3RvcCsxOCksIDMyKTsKKyAgICAgICAgICAgIGNzY19pbnRlcmxlYXZlX21lbWNweShudjEydF91dl9kZXN0K3RpbGVkX29mZnNldCs2NCoxOSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHl1djQyMF91X3NyYytsZWZ0LzIrai8yK3l1djQyMF93aWR0aC8yKihpK3RvcCsxOSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB5dXY0MjBfdl9zcmMrbGVmdC8yK2ovMit5dXY0MjBfd2lkdGgvMiooaSt0b3ArMTkpLCAzMik7CisgICAgICAgICAgICBjc2NfaW50ZXJsZWF2ZV9tZW1jcHkobnYxMnRfdXZfZGVzdCt0aWxlZF9vZmZzZXQrNjQqMjAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB5dXY0MjBfdV9zcmMrbGVmdC8yK2ovMit5dXY0MjBfd2lkdGgvMiooaSt0b3ArMjApLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeXV2NDIwX3Zfc3JjK2xlZnQvMitqLzIreXV2NDIwX3dpZHRoLzIqKGkrdG9wKzIwKSwgMzIpOworICAgICAgICAgICAgY3NjX2ludGVybGVhdmVfbWVtY3B5KG52MTJ0X3V2X2Rlc3QrdGlsZWRfb2Zmc2V0KzY0KjIxLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeXV2NDIwX3Vfc3JjK2xlZnQvMitqLzIreXV2NDIwX3dpZHRoLzIqKGkrdG9wKzIxKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHl1djQyMF92X3NyYytsZWZ0LzIrai8yK3l1djQyMF93aWR0aC8yKihpK3RvcCsyMSksIDMyKTsKKyAgICAgICAgICAgIGNzY19pbnRlcmxlYXZlX21lbWNweShudjEydF91dl9kZXN0K3RpbGVkX29mZnNldCs2NCoyMiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHl1djQyMF91X3NyYytsZWZ0LzIrai8yK3l1djQyMF93aWR0aC8yKihpK3RvcCsyMiksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB5dXY0MjBfdl9zcmMrbGVmdC8yK2ovMit5dXY0MjBfd2lkdGgvMiooaSt0b3ArMjIpLCAzMik7CisgICAgICAgICAgICBjc2NfaW50ZXJsZWF2ZV9tZW1jcHkobnYxMnRfdXZfZGVzdCt0aWxlZF9vZmZzZXQrNjQqMjMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB5dXY0MjBfdV9zcmMrbGVmdC8yK2ovMit5dXY0MjBfd2lkdGgvMiooaSt0b3ArMjMpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeXV2NDIwX3Zfc3JjK2xlZnQvMitqLzIreXV2NDIwX3dpZHRoLzIqKGkrdG9wKzIzKSwgMzIpOworICAgICAgICAgICAgY3NjX2ludGVybGVhdmVfbWVtY3B5KG52MTJ0X3V2X2Rlc3QrdGlsZWRfb2Zmc2V0KzY0KjI0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeXV2NDIwX3Vfc3JjK2xlZnQvMitqLzIreXV2NDIwX3dpZHRoLzIqKGkrdG9wKzI0KSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHl1djQyMF92X3NyYytsZWZ0LzIrai8yK3l1djQyMF93aWR0aC8yKihpK3RvcCsyNCksIDMyKTsKKyAgICAgICAgICAgIGNzY19pbnRlcmxlYXZlX21lbWNweShudjEydF91dl9kZXN0K3RpbGVkX29mZnNldCs2NCoyNSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHl1djQyMF91X3NyYytsZWZ0LzIrai8yK3l1djQyMF93aWR0aC8yKihpK3RvcCsyNSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB5dXY0MjBfdl9zcmMrbGVmdC8yK2ovMit5dXY0MjBfd2lkdGgvMiooaSt0b3ArMjUpLCAzMik7CisgICAgICAgICAgICBjc2NfaW50ZXJsZWF2ZV9tZW1jcHkobnYxMnRfdXZfZGVzdCt0aWxlZF9vZmZzZXQrNjQqMjYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB5dXY0MjBfdV9zcmMrbGVmdC8yK2ovMit5dXY0MjBfd2lkdGgvMiooaSt0b3ArMjYpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeXV2NDIwX3Zfc3JjK2xlZnQvMitqLzIreXV2NDIwX3dpZHRoLzIqKGkrdG9wKzI2KSwgMzIpOworICAgICAgICAgICAgY3NjX2ludGVybGVhdmVfbWVtY3B5KG52MTJ0X3V2X2Rlc3QrdGlsZWRfb2Zmc2V0KzY0KjI3LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeXV2NDIwX3Vfc3JjK2xlZnQvMitqLzIreXV2NDIwX3dpZHRoLzIqKGkrdG9wKzI3KSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHl1djQyMF92X3NyYytsZWZ0LzIrai8yK3l1djQyMF93aWR0aC8yKihpK3RvcCsyNyksIDMyKTsKKyAgICAgICAgICAgIGNzY19pbnRlcmxlYXZlX21lbWNweShudjEydF91dl9kZXN0K3RpbGVkX29mZnNldCs2NCoyOCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHl1djQyMF91X3NyYytsZWZ0LzIrai8yK3l1djQyMF93aWR0aC8yKihpK3RvcCsyOCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB5dXY0MjBfdl9zcmMrbGVmdC8yK2ovMit5dXY0MjBfd2lkdGgvMiooaSt0b3ArMjgpLCAzMik7CisgICAgICAgICAgICBjc2NfaW50ZXJsZWF2ZV9tZW1jcHkobnYxMnRfdXZfZGVzdCt0aWxlZF9vZmZzZXQrNjQqMjksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB5dXY0MjBfdV9zcmMrbGVmdC8yK2ovMit5dXY0MjBfd2lkdGgvMiooaSt0b3ArMjkpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeXV2NDIwX3Zfc3JjK2xlZnQvMitqLzIreXV2NDIwX3dpZHRoLzIqKGkrdG9wKzI5KSwgMzIpOworICAgICAgICAgICAgY3NjX2ludGVybGVhdmVfbWVtY3B5KG52MTJ0X3V2X2Rlc3QrdGlsZWRfb2Zmc2V0KzY0KjMwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeXV2NDIwX3Vfc3JjK2xlZnQvMitqLzIreXV2NDIwX3dpZHRoLzIqKGkrdG9wKzMwKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHl1djQyMF92X3NyYytsZWZ0LzIrai8yK3l1djQyMF93aWR0aC8yKihpK3RvcCszMCksIDMyKTsKKyAgICAgICAgICAgIGNzY19pbnRlcmxlYXZlX21lbWNweShudjEydF91dl9kZXN0K3RpbGVkX29mZnNldCs2NCozMSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHl1djQyMF91X3NyYytsZWZ0LzIrai8yK3l1djQyMF93aWR0aC8yKihpK3RvcCszMSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB5dXY0MjBfdl9zcmMrbGVmdC8yK2ovMit5dXY0MjBfd2lkdGgvMiooaSt0b3ArMzEpLCAzMik7CisKKyAgICAgICAgfQorICAgIH0KKworICAgIGZvciAoaT1hbGlnbmVkX3lfc2l6ZTsgaTwoeXV2NDIwX2hlaWdodC10b3AtYnV0dG9tKTsgaT1pKzEpIHsKKyAgICAgICAgZm9yIChqPTA7IGo8YWxpZ25lZF94X3NpemU7IGo9ais2NCkgeworICAgICAgICAgICAgdGlsZWRfb2Zmc2V0ID0gMDsKKyAgICAgICAgICAgIHRpbGVkX3hfaW5kZXggPSBqPj42OworICAgICAgICAgICAgdGlsZWRfeV9pbmRleCA9IGk+PjU7CisgICAgICAgICAgICBpZiAodGlsZWRfeV9pbmRleCAmIDB4MSkgeworICAgICAgICAgICAgICAgIC8qIG9kZCBmb211bGE6IDIreCsoeD4+Mik8PDIreF9ibG9ja19udW0qKHktMSkgKi8KKyAgICAgICAgICAgICAgICB0aWxlZF9vZmZzZXQgPSB0aWxlZF95X2luZGV4LTE7CisgICAgICAgICAgICAgICAgdGVtcDEgPSAoKCh5dXY0MjBfd2lkdGgtbGVmdC1yaWdodCkrMTI3KT4+Nyk8PDc7CisgICAgICAgICAgICAgICAgdGlsZWRfb2Zmc2V0ID0gdGlsZWRfb2Zmc2V0Kih0ZW1wMT4+Nik7CisgICAgICAgICAgICAgICAgdGlsZWRfb2Zmc2V0ID0gdGlsZWRfb2Zmc2V0K3RpbGVkX3hfaW5kZXg7CisgICAgICAgICAgICAgICAgdGlsZWRfb2Zmc2V0ID0gdGlsZWRfb2Zmc2V0KzI7CisgICAgICAgICAgICAgICAgdGVtcDEgPSAodGlsZWRfeF9pbmRleD4+Mik8PDI7CisgICAgICAgICAgICAgICAgdGlsZWRfb2Zmc2V0ID0gdGlsZWRfb2Zmc2V0K3RlbXAxOworICAgICAgICAgICAgICAgIHRpbGVkX29mZnNldCA9IHRpbGVkX29mZnNldDw8MTE7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIHRlbXAyID0gKCgoeXV2NDIwX2hlaWdodC10b3AtYnV0dG9tKSszMSk+PjUpPDw1OworICAgICAgICAgICAgICAgIGlmICgoaSszMik8dGVtcDIpIHsKKyAgICAgICAgICAgICAgICAgICAgLyogZXZlbjEgZm9tdWxhOiB4KygoeCsyKT4+Mik8PDIreF9ibG9ja19udW0qeSAqLworICAgICAgICAgICAgICAgICAgICB0ZW1wMSA9IHRpbGVkX3hfaW5kZXgrMjsKKyAgICAgICAgICAgICAgICAgICAgdGVtcDEgPSAodGVtcDE+PjIpPDwyOworICAgICAgICAgICAgICAgICAgICB0aWxlZF9vZmZzZXQgPSB0aWxlZF94X2luZGV4K3RlbXAxOworICAgICAgICAgICAgICAgICAgICB0ZW1wMSA9ICgoKHl1djQyMF93aWR0aC1sZWZ0LXJpZ2h0KSsxMjcpPj43KTw8NzsKKyAgICAgICAgICAgICAgICAgICAgdGlsZWRfb2Zmc2V0ID0gdGlsZWRfb2Zmc2V0K3RpbGVkX3lfaW5kZXgqKHRlbXAxPj42KTsKKyAgICAgICAgICAgICAgICAgICAgdGlsZWRfb2Zmc2V0ID0gdGlsZWRfb2Zmc2V0PDwxMTsKKyAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICAvKiBldmVuMiBmb211bGE6IHgreF9ibG9ja19udW0qeSAqLworICAgICAgICAgICAgICAgICAgICB0ZW1wMSA9ICgoKHl1djQyMF93aWR0aC1sZWZ0LXJpZ2h0KSsxMjcpPj43KTw8NzsKKyAgICAgICAgICAgICAgICAgICAgdGlsZWRfb2Zmc2V0ID0gdGlsZWRfeV9pbmRleCoodGVtcDE+PjYpOworICAgICAgICAgICAgICAgICAgICB0aWxlZF9vZmZzZXQgPSB0aWxlZF9vZmZzZXQrdGlsZWRfeF9pbmRleDsKKyAgICAgICAgICAgICAgICAgICAgdGlsZWRfb2Zmc2V0ID0gdGlsZWRfb2Zmc2V0PDwxMTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICB0ZW1wMSA9IGkmMHgxRjsKKyAgICAgICAgICAgIGNzY19pbnRlcmxlYXZlX21lbWNweShudjEydF91dl9kZXN0K3RpbGVkX29mZnNldCs2NCoodGVtcDEpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeXV2NDIwX3Vfc3JjK2xlZnQvMitqLzIreXV2NDIwX3dpZHRoLzIqKGkrdG9wKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHl1djQyMF92X3NyYytsZWZ0LzIrai8yK3l1djQyMF93aWR0aC8yKihpK3RvcCksIDMyKTsKKyAgICAgICB9CisgICAgfQorCisgICAgZm9yIChpPTA7IGk8KHl1djQyMF9oZWlnaHQtdG9wLWJ1dHRvbSk7IGk9aSsxKSB7CisgICAgICAgIGZvciAoaj1hbGlnbmVkX3hfc2l6ZTsgajwoeXV2NDIwX3dpZHRoLWxlZnQtcmlnaHQpOyBqPWorMikgeworICAgICAgICAgICAgdGlsZWRfb2Zmc2V0ID0gMDsKKyAgICAgICAgICAgIHRpbGVkX3hfaW5kZXggPSBqPj42OworICAgICAgICAgICAgdGlsZWRfeV9pbmRleCA9IGk+PjU7CisgICAgICAgICAgICBpZiAodGlsZWRfeV9pbmRleCAmIDB4MSkgeworICAgICAgICAgICAgICAgIC8qIG9kZCBmb211bGE6IDIreCsoeD4+Mik8PDIreF9ibG9ja19udW0qKHktMSkgKi8KKyAgICAgICAgICAgICAgICB0aWxlZF9vZmZzZXQgPSB0aWxlZF95X2luZGV4LTE7CisgICAgICAgICAgICAgICAgdGVtcDEgPSAoKCh5dXY0MjBfd2lkdGgtbGVmdC1yaWdodCkrMTI3KT4+Nyk8PDc7CisgICAgICAgICAgICAgICAgdGlsZWRfb2Zmc2V0ID0gdGlsZWRfb2Zmc2V0Kih0ZW1wMT4+Nik7CisgICAgICAgICAgICAgICAgdGlsZWRfb2Zmc2V0ID0gdGlsZWRfb2Zmc2V0K3RpbGVkX3hfaW5kZXg7CisgICAgICAgICAgICAgICAgdGlsZWRfb2Zmc2V0ID0gdGlsZWRfb2Zmc2V0KzI7CisgICAgICAgICAgICAgICAgdGVtcDEgPSAodGlsZWRfeF9pbmRleD4+Mik8PDI7CisgICAgICAgICAgICAgICAgdGlsZWRfb2Zmc2V0ID0gdGlsZWRfb2Zmc2V0K3RlbXAxOworICAgICAgICAgICAgICAgIHRpbGVkX29mZnNldCA9IHRpbGVkX29mZnNldDw8MTE7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIHRlbXAyID0gKCgoeXV2NDIwX2hlaWdodC10b3AtYnV0dG9tKSszMSk+PjUpPDw1OworICAgICAgICAgICAgICAgIGlmICgoaSszMik8dGVtcDIpIHsKKyAgICAgICAgICAgICAgICAgICAgLyogZXZlbjEgZm9tdWxhOiB4KygoeCsyKT4+Mik8PDIreF9ibG9ja19udW0qeSAqLworICAgICAgICAgICAgICAgICAgICB0ZW1wMSA9IHRpbGVkX3hfaW5kZXgrMjsKKyAgICAgICAgICAgICAgICAgICAgdGVtcDEgPSAodGVtcDE+PjIpPDwyOworICAgICAgICAgICAgICAgICAgICB0aWxlZF9vZmZzZXQgPSB0aWxlZF94X2luZGV4K3RlbXAxOworICAgICAgICAgICAgICAgICAgICB0ZW1wMSA9ICgoKHl1djQyMF93aWR0aC1sZWZ0LXJpZ2h0KSsxMjcpPj43KTw8NzsKKyAgICAgICAgICAgICAgICAgICAgdGlsZWRfb2Zmc2V0ID0gdGlsZWRfb2Zmc2V0K3RpbGVkX3lfaW5kZXgqKHRlbXAxPj42KTsKKyAgICAgICAgICAgICAgICAgICAgdGlsZWRfb2Zmc2V0ID0gdGlsZWRfb2Zmc2V0PDwxMTsKKyAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICAvKiBldmVuMiBmb211bGE6IHgreF9ibG9ja19udW0qeSAqLworICAgICAgICAgICAgICAgICAgICB0ZW1wMSA9ICgoKHl1djQyMF93aWR0aC1sZWZ0LXJpZ2h0KSsxMjcpPj43KTw8NzsKKyAgICAgICAgICAgICAgICAgICAgdGlsZWRfb2Zmc2V0ID0gdGlsZWRfeV9pbmRleCoodGVtcDE+PjYpOworICAgICAgICAgICAgICAgICAgICB0aWxlZF9vZmZzZXQgPSB0aWxlZF9vZmZzZXQrdGlsZWRfeF9pbmRleDsKKyAgICAgICAgICAgICAgICAgICAgdGlsZWRfb2Zmc2V0ID0gdGlsZWRfb2Zmc2V0PDwxMTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICB0ZW1wMSA9IGkmMHgxRjsKKyAgICAgICAgICAgIHRlbXAyID0gaiYweDNGOworICAgICAgICAgICAgY3NjX2ludGVybGVhdmVfbWVtY3B5KG52MTJ0X3V2X2Rlc3QrdGlsZWRfb2Zmc2V0K3RlbXAyKzY0Kih0ZW1wMSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB5dXY0MjBfdV9zcmMrbGVmdC8yK2ovMit5dXY0MjBfd2lkdGgvMiooaSt0b3ApLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeXV2NDIwX3Zfc3JjK2xlZnQvMitqLzIreXV2NDIwX3dpZHRoLzIqKGkrdG9wKSwgMSk7CisgICAgICAgfQorICAgIH0KKworfQorCisKKy8qCisgKiBDb252ZXJ0cyB0aWxlZCBkYXRhIHRvIGxpbmVhcgorICogQ3JvcHMgbGVmdCwgdG9wLCByaWdodCwgYnV0dG9tCisgKiAxLiBZIG9mIE5WMTJUIHRvIFkgb2YgWVVWNDIwUAorICogMi4gWSBvZiBOVjEyVCB0byBZIG9mIFlVVjQyMFMKKyAqIDMuIFVWIG9mIE5WMTJUIHRvIFVWIG9mIFlVVjQyMFMKKyAqCisgKiBAcGFyYW0geXV2NDIwX2Rlc3QKKyAqICAgWSBvciBVViBwbGFuZSBhZGRyZXNzIG9mIFlVVjQyMFtvdXRdCisgKgorICogQHBhcmFtIG52MTJ0X3NyYworICogICBZIG9yIFVWIHBsYW5lIGFkZHJlc3Mgb2YgTlYxMlRbaW5dCisgKgorICogQHBhcmFtIHl1djQyMF93aWR0aAorICogICBXaWR0aCBvZiBZVVY0MjBbaW5dCisgKgorICogQHBhcmFtIHl1djQyMF9oZWlnaHQKKyAqICAgWTogSGVpZ2h0IG9mIFlVVjQyMCwgVVY6IEhlaWdodC8yIG9mIFlVVjQyMFtpbl0KKyAqCisgKiBAcGFyYW0gbGVmdAorICogICBDcm9wIHNpemUgb2YgbGVmdAorICoKKyAqIEBwYXJhbSB0b3AKKyAqICAgQ3JvcCBzaXplIG9mIHRvcAorICoKKyAqIEBwYXJhbSByaWdodAorICogICBDcm9wIHNpemUgb2YgcmlnaHQKKyAqCisgKiBAcGFyYW0gYnV0dG9tCisgKiAgIENyb3Agc2l6ZSBvZiBidXR0b20KKyAqLwordm9pZCBjc2NfdGlsZWRfdG9fbGluZWFyX2Nyb3BfbmVvbigKKyAgICB1bnNpZ25lZCBjaGFyICp5dXY0MjBfZGVzdCwKKyAgICB1bnNpZ25lZCBjaGFyICpudjEydF9zcmMsCisgICAgdW5zaWduZWQgaW50IHl1djQyMF93aWR0aCwKKyAgICB1bnNpZ25lZCBpbnQgeXV2NDIwX2hlaWdodCwKKyAgICB1bnNpZ25lZCBpbnQgbGVmdCwKKyAgICB1bnNpZ25lZCBpbnQgdG9wLAorICAgIHVuc2lnbmVkIGludCByaWdodCwKKyAgICB1bnNpZ25lZCBpbnQgYnV0dG9tKTsKKworLyoKKyAqIENvbnZlcnRzIGFuZCBEZWludGVybGVhdmVzIHRpbGVkIGRhdGEgdG8gbGluZWFyCisgKiBDcm9wcyBsZWZ0LCB0b3AsIHJpZ2h0LCBidXR0b20KKyAqIDEuIFVWIG9mIE5WMTJUIHRvIFVWIG9mIFlVVjQyMFAKKyAqCisgKiBAcGFyYW0geXV2NDIwX3VfZGVzdAorICogICBVIHBsYW5lIGFkZHJlc3Mgb2YgWVVWNDIwUFtvdXRdCisgKgorICogQHBhcmFtIHl1djQyMF92X2Rlc3QKKyAqICAgViBwbGFuZSBhZGRyZXNzIG9mIFlVVjQyMFBbb3V0XQorICoKKyAqIEBwYXJhbSBudjEydF9zcmMKKyAqICAgVVYgcGxhbmUgYWRkcmVzcyBvZiBOVjEyVFtpbl0KKyAqCisgKiBAcGFyYW0geXV2NDIwX3dpZHRoCisgKiAgIFdpZHRoIG9mIFlVVjQyMFtpbl0KKyAqCisgKiBAcGFyYW0geXV2NDIwX3V2X2hlaWdodAorICogICBIZWlnaHQvMiBvZiBZVVY0MjBbaW5dCisgKgorICogQHBhcmFtIGxlZnQKKyAqICAgQ3JvcCBzaXplIG9mIGxlZnQKKyAqCisgKiBAcGFyYW0gdG9wCisgKiAgIENyb3Agc2l6ZSBvZiB0b3AKKyAqCisgKiBAcGFyYW0gcmlnaHQKKyAqICAgQ3JvcCBzaXplIG9mIHJpZ2h0CisgKgorICogQHBhcmFtIGJ1dHRvbQorICogICBDcm9wIHNpemUgb2YgYnV0dG9tCisgKi8KK3ZvaWQgY3NjX3RpbGVkX3RvX2xpbmVhcl9kZWludGVybGVhdmVfY3JvcF9uZW9uKAorICAgIHVuc2lnbmVkIGNoYXIgKnl1djQyMF91X2Rlc3QsCisgICAgdW5zaWduZWQgY2hhciAqeXV2NDIwX3ZfZGVzdCwKKyAgICB1bnNpZ25lZCBjaGFyICpudjEydF91dl9zcmMsCisgICAgdW5zaWduZWQgaW50IHl1djQyMF93aWR0aCwKKyAgICB1bnNpZ25lZCBpbnQgeXV2NDIwX3V2X2hlaWdodCwKKyAgICB1bnNpZ25lZCBpbnQgbGVmdCwKKyAgICB1bnNpZ25lZCBpbnQgdG9wLAorICAgIHVuc2lnbmVkIGludCByaWdodCwKKyAgICB1bnNpZ25lZCBpbnQgYnV0dG9tKTsKKworLyoKKyAqIENvbnZlcnRzIGxpbmVhciBkYXRhIHRvIHRpbGVkCisgKiBDcm9wcyBsZWZ0LCB0b3AsIHJpZ2h0LCBidXR0b20KKyAqIDEuIFkgb2YgWVVWNDIwUCB0byBZIG9mIE5WMTJUCisgKiAyLiBZIG9mIFlVVjQyMFMgdG8gWSBvZiBOVjEyVAorICogMy4gVVYgb2YgWVVWNDIwUyB0byBVViBvZiBOVjEyVAorICoKKyAqIEBwYXJhbSBudjEydF9kZXN0CisgKiAgIFkgb3IgVVYgcGxhbmUgYWRkcmVzcyBvZiBOVjEyVFtvdXRdCisgKgorICogQHBhcmFtIHl1djQyMF9zcmMKKyAqICAgWSBvciBVViBwbGFuZSBhZGRyZXNzIG9mIFlVVjQyMFAoUylbaW5dCisgKgorICogQHBhcmFtIHl1djQyMF93aWR0aAorICogICBXaWR0aCBvZiBZVVY0MjBbaW5dCisgKgorICogQHBhcmFtIHl1djQyMF9oZWlnaHQKKyAqICAgWTogSGVpZ2h0IG9mIFlVVjQyMCwgVVY6IEhlaWdodC8yIG9mIFlVVjQyMFtpbl0KKyAqCisgKiBAcGFyYW0gbGVmdAorICogICBDcm9wIHNpemUgb2YgbGVmdAorICoKKyAqIEBwYXJhbSB0b3AKKyAqICAgQ3JvcCBzaXplIG9mIHRvcAorICoKKyAqIEBwYXJhbSByaWdodAorICogICBDcm9wIHNpemUgb2YgcmlnaHQKKyAqCisgKiBAcGFyYW0gYnV0dG9tCisgKiAgIENyb3Agc2l6ZSBvZiBidXR0b20KKyAqLwordm9pZCBjc2NfbGluZWFyX3RvX3RpbGVkX2Nyb3BfbmVvbigKKyAgICB1bnNpZ25lZCBjaGFyICpudjEydF9kZXN0LAorICAgIHVuc2lnbmVkIGNoYXIgKnl1djQyMF9zcmMsCisgICAgdW5zaWduZWQgaW50IHl1djQyMF93aWR0aCwKKyAgICB1bnNpZ25lZCBpbnQgeXV2NDIwX2hlaWdodCwKKyAgICB1bnNpZ25lZCBpbnQgbGVmdCwKKyAgICB1bnNpZ25lZCBpbnQgdG9wLAorICAgIHVuc2lnbmVkIGludCByaWdodCwKKyAgICB1bnNpZ25lZCBpbnQgYnV0dG9tKTsKKworLyoKKyAqIENvbnZlcnRzIGFuZCBJbnRlcmxlYXZlcyBsaW5lYXIgdG8gdGlsZWQKKyAqIENyb3BzIGxlZnQsIHRvcCwgcmlnaHQsIGJ1dHRvbQorICogMS4gVVYgb2YgWVVWNDIwUCB0byBVViBvZiBOVjEyVAorICoKKyAqIEBwYXJhbSBudjEydF91dl9kZXN0CisgKiAgIFVWIHBsYW5lIGFkZHJlc3Mgb2YgTlYxMlRbb3V0XQorICoKKyAqIEBwYXJhbSB5dXY0MjBwX3Vfc3JjCisgKiAgIFUgcGxhbmUgYWRkcmVzcyBvZiBZVVY0MjBQW2luXQorICoKKyAqIEBwYXJhbSB5dXY0MjBwX3Zfc3JjCisgKiAgIFYgcGxhbmUgYWRkcmVzcyBvZiBZVVY0MjBQW2luXQorICoKKyAqIEBwYXJhbSB5dXY0MjBfd2lkdGgKKyAqICAgV2lkdGggb2YgWVVWNDIwW2luXQorICoKKyAqIEBwYXJhbSB5dXY0MjBfdXZfaGVpZ2h0CisgKiAgIEhlaWdodC8yIG9mIFlVVjQyMFtpbl0KKyAqCisgKiBAcGFyYW0gbGVmdAorICogICBDcm9wIHNpemUgb2YgbGVmdAorICoKKyAqIEBwYXJhbSB0b3AKKyAqICAgQ3JvcCBzaXplIG9mIHRvcAorICoKKyAqIEBwYXJhbSByaWdodAorICogICBDcm9wIHNpemUgb2YgcmlnaHQKKyAqCisgKiBAcGFyYW0gYnV0dG9tCisgKiAgIENyb3Agc2l6ZSBvZiBidXR0b20KKyAqLwordm9pZCBjc2NfbGluZWFyX3RvX3RpbGVkX2ludGVybGVhdmVfY3JvcF9uZW9uKAorICAgIHVuc2lnbmVkIGNoYXIgKm52MTJ0X3V2X2Rlc3QsCisgICAgdW5zaWduZWQgY2hhciAqeXV2NDIwX3Vfc3JjLAorICAgIHVuc2lnbmVkIGNoYXIgKnl1djQyMF92X3NyYywKKyAgICB1bnNpZ25lZCBpbnQgeXV2NDIwX3dpZHRoLAorICAgIHVuc2lnbmVkIGludCB5dXY0MjBfaGVpZ2h0LAorICAgIHVuc2lnbmVkIGludCBsZWZ0LAorICAgIHVuc2lnbmVkIGludCB0b3AsCisgICAgdW5zaWduZWQgaW50IHJpZ2h0LAorICAgIHVuc2lnbmVkIGludCBidXR0b20pOworCisvKgorICogQ29udmVydHMgdGlsZWQgZGF0YSB0byBsaW5lYXIuCisgKiAxLiB5IG9mIG52MTJ0IHRvIHkgb2YgeXV2NDIwcAorICogMi4geSBvZiBudjEydCB0byB5IG9mIHl1djQyMHMKKyAqCisgKiBAcGFyYW0gZHN0CisgKiAgIHkgYWRkcmVzcyBvZiB5dXY0MjBbb3V0XQorICoKKyAqIEBwYXJhbSBzcmMKKyAqICAgeSBhZGRyZXNzIG9mIG52MTJ0W2luXQorICoKKyAqIEBwYXJhbSB5dXY0MjBfd2lkdGgKKyAqICAgcmVhbCB3aWR0aCBvZiB5dXY0MjBbaW5dCisgKiAgIGl0IHNob3VsZCBiZSBldmVuCisgKgorICogQHBhcmFtIHl1djQyMF9oZWlnaHQKKyAqICAgcmVhbCBoZWlnaHQgb2YgeXV2NDIwW2luXQorICogICBpdCBzaG91bGQgYmUgZXZlbi4KKyAqCisgKi8KK3ZvaWQgY3NjX3RpbGVkX3RvX2xpbmVhcl95KAorICAgIHVuc2lnbmVkIGNoYXIgKnlfZHN0LAorICAgIHVuc2lnbmVkIGNoYXIgKnlfc3JjLAorICAgIHVuc2lnbmVkIGludCB3aWR0aCwKKyAgICB1bnNpZ25lZCBpbnQgaGVpZ2h0KQoreworICAgIGNzY190aWxlZF90b19saW5lYXJfY3JvcCh5X2RzdCwgeV9zcmMsIHdpZHRoLCBoZWlnaHQsIDAsIDAsIDAsIDApOworfQorCisvKgorICogQ29udmVydHMgdGlsZWQgZGF0YSB0byBsaW5lYXIKKyAqIDEuIHV2IG9mIG52MTJ0IHRvIHkgb2YgeXV2NDIwcworICoKKyAqIEBwYXJhbSBkc3QKKyAqICAgdXYgYWRkcmVzcyBvZiB5dXY0MjBzW291dF0KKyAqCisgKiBAcGFyYW0gc3JjCisgKiAgIHV2IGFkZHJlc3Mgb2YgbnYxMnRbaW5dCisgKgorICogQHBhcmFtIHl1djQyMF93aWR0aAorICogICByZWFsIHdpZHRoIG9mIHl1djQyMHNbaW5dCisgKgorICogQHBhcmFtIHl1djQyMF9oZWlnaHQKKyAqICAgcmVhbCBoZWlnaHQgb2YgeXV2NDIwc1tpbl0KKyAqCisgKi8KK3ZvaWQgY3NjX3RpbGVkX3RvX2xpbmVhcl91digKKyAgICB1bnNpZ25lZCBjaGFyICp1dl9kc3QsCisgICAgdW5zaWduZWQgY2hhciAqdXZfc3JjLAorICAgIHVuc2lnbmVkIGludCB3aWR0aCwKKyAgICB1bnNpZ25lZCBpbnQgaGVpZ2h0KQoreworICAgIGNzY190aWxlZF90b19saW5lYXJfY3JvcCh1dl9kc3QsIHV2X3NyYywgd2lkdGgsIGhlaWdodCwgMCwgMCwgMCwgMCk7Cit9CisKKy8qCisgKiBDb252ZXJ0cyB0aWxlZCBkYXRhIHRvIGxpbmVhcgorICogMS4gdXYgb2YgbnQxMnQgdG8gdXYgb2YgeXV2NDIwcAorICoKKyAqIEBwYXJhbSB1X2RzdAorICogICB1IGFkZHJlc3Mgb2YgeXV2NDIwcFtvdXRdCisgKgorICogQHBhcmFtIHZfZHN0CisgKiAgIHYgYWRkcmVzcyBvZiB5dXY0MjBwW291dF0KKyAqCisgKiBAcGFyYW0gdXZfc3JjCisgKiAgIHV2IGFkZHJlc3Mgb2YgbnQxMnRbaW5dCisgKgorICogQHBhcmFtIHl1djQyMF93aWR0aAorICogICByZWFsIHdpZHRoIG9mIHl1djQyMHBbaW5dCisgKgorICogQHBhcmFtIHl1djQyMF9oZWlnaHQKKyAqICAgcmVhbCBoZWlnaHQgb2YgeXV2NDIwcFtpbl0KKyAqLwordm9pZCBjc2NfdGlsZWRfdG9fbGluZWFyX3V2X2RlaW50ZXJsZWF2ZSgKKyAgICB1bnNpZ25lZCBjaGFyICp1X2RzdCwKKyAgICB1bnNpZ25lZCBjaGFyICp2X2RzdCwKKyAgICB1bnNpZ25lZCBjaGFyICp1dl9zcmMsCisgICAgdW5zaWduZWQgaW50IHdpZHRoLAorICAgIHVuc2lnbmVkIGludCBoZWlnaHQpCit7CisgICAgY3NjX3RpbGVkX3RvX2xpbmVhcl9kZWludGVybGVhdmVfY3JvcCh1X2RzdCwgdl9kc3QsIHV2X3NyYywgd2lkdGgsIGhlaWdodCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAsIDAsIDAsIDApOworfQorCisvKgorICogQ29udmVydHMgbGluZWFyIGRhdGEgdG8gdGlsZWQKKyAqIDEuIHkgb2YgeXV2NDIwIHRvIHkgb2YgbnYxMnQKKyAqCisgKiBAcGFyYW0gZHN0CisgKiAgIHkgYWRkcmVzcyBvZiBudjEydFtvdXRdCisgKgorICogQHBhcmFtIHNyYworICogICB5IGFkZHJlc3Mgb2YgeXV2NDIwW2luXQorICoKKyAqIEBwYXJhbSB5dXY0MjBfd2lkdGgKKyAqICAgcmVhbCB3aWR0aCBvZiB5dXY0MjBbaW5dCisgKiAgIGl0IHNob3VsZCBiZSBldmVuCisgKgorICogQHBhcmFtIHl1djQyMF9oZWlnaHQKKyAqICAgcmVhbCBoZWlnaHQgb2YgeXV2NDIwW2luXQorICogICBpdCBzaG91bGQgYmUgZXZlbi4KKyAqCisgKi8KK3ZvaWQgY3NjX2xpbmVhcl90b190aWxlZF95KAorICAgIHVuc2lnbmVkIGNoYXIgKnlfZHN0LAorICAgIHVuc2lnbmVkIGNoYXIgKnlfc3JjLAorICAgIHVuc2lnbmVkIGludCB3aWR0aCwKKyAgICB1bnNpZ25lZCBpbnQgaGVpZ2h0KQoreworICAgIGNzY19saW5lYXJfdG9fdGlsZWRfY3JvcCh5X2RzdCwgeV9zcmMsIHdpZHRoLCBoZWlnaHQsIDAsIDAsIDAsIDApOworfQorCisvKgorICogQ29udmVydHMgYW5kIGludGVybGVhdmVzIGxpbmVhciBkYXRhIHRvIHRpbGVkCisgKiAxLiB1diBvZiBudjEydCB0byB1diBvZiB5dXY0MjAKKyAqCisgKiBAcGFyYW0gZHN0CisgKiAgIHV2IGFkZHJlc3Mgb2YgbnYxMnRbb3V0XQorICoKKyAqIEBwYXJhbSBzcmMKKyAqICAgdSBhZGRyZXNzIG9mIHl1djQyMFtpbl0KKyAqCisgKiBAcGFyYW0gc3JjCisgKiAgIHYgYWRkcmVzcyBvZiB5dXY0MjBbaW5dCisgKgorICogQHBhcmFtIHl1djQyMF93aWR0aAorICogICByZWFsIHdpZHRoIG9mIHl1djQyMFtpbl0KKyAqCisgKiBAcGFyYW0geXV2NDIwX2hlaWdodAorICogICByZWFsIGhlaWdodCBvZiB5dXY0MjBbaW5dCisgKgorICovCit2b2lkIGNzY19saW5lYXJfdG9fdGlsZWRfdXYoCisgICAgdW5zaWduZWQgY2hhciAqdXZfZHN0LAorICAgIHVuc2lnbmVkIGNoYXIgKnVfc3JjLAorICAgIHVuc2lnbmVkIGNoYXIgKnZfc3JjLAorICAgIHVuc2lnbmVkIGludCB3aWR0aCwKKyAgICB1bnNpZ25lZCBpbnQgaGVpZ2h0KQoreworICAgIGNzY19saW5lYXJfdG9fdGlsZWRfaW50ZXJsZWF2ZV9jcm9wKHV2X2RzdCwgdV9zcmMsIHZfc3JjLCB3aWR0aCwgaGVpZ2h0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAsIDAsIDAsIDApOworfQorCisvKgorICogQ29udmVydHMgdGlsZWQgZGF0YSB0byBsaW5lYXIgZm9yIG1mYyA2LngKKyAqIDEuIFkgb2YgTlYxMlQgdG8gWSBvZiBZVVY0MjBQCisgKiAyLiBZIG9mIE5WMTJUIHRvIFkgb2YgWVVWNDIwUworICoKKyAqIEBwYXJhbSBkc3QKKyAqICAgWSBhZGRyZXNzIG9mIFlVVjQyMFtvdXRdCisgKgorICogQHBhcmFtIHNyYworICogICBZIGFkZHJlc3Mgb2YgTlYxMlRbaW5dCisgKgorICogQHBhcmFtIHl1djQyMF93aWR0aAorICogICByZWFsIHdpZHRoIG9mIFlVVjQyMFtpbl0KKyAqCisgKiBAcGFyYW0geXV2NDIwX2hlaWdodAorICogICBZOiByZWFsIGhlaWdodCBvZiBZVVY0MjBbaW5dCisgKgorICovCit2b2lkIGNzY190aWxlZF90b19saW5lYXJfeV9uZW9uKAorICAgIHVuc2lnbmVkIGNoYXIgKnlfZHN0LAorICAgIHVuc2lnbmVkIGNoYXIgKnlfc3JjLAorICAgIHVuc2lnbmVkIGludCB3aWR0aCwKKyAgICB1bnNpZ25lZCBpbnQgaGVpZ2h0KQoreworICAgIGNzY190aWxlZF90b19saW5lYXJfY3JvcF9uZW9uKHlfZHN0LCB5X3NyYywgd2lkdGgsIGhlaWdodCwgMCwgMCwgMCwgMCk7Cit9CisKKy8qCisgKiBDb252ZXJ0cyB0aWxlZCBkYXRhIHRvIGxpbmVhciBmb3IgbWZjIDYueAorICogMS4gVVYgb2YgTlYxMlQgdG8gWSBvZiBZVVY0MjBTCisgKgorICogQHBhcmFtIHVfZHN0CisgKiAgIFVWIHBsYW5lIGFkZHJlc3Mgb2YgWVVWNDIwUFtvdXRdCisgKgorICogQHBhcmFtIG52MTJ0X3NyYworICogICBZIG9yIFVWIHBsYW5lIGFkZHJlc3Mgb2YgTlYxMlRbaW5dCisgKgorICogQHBhcmFtIHl1djQyMF93aWR0aAorICogICByZWFsIHdpZHRoIG9mIFlVVjQyMFtpbl0KKyAqCisgKiBAcGFyYW0geXV2NDIwX2hlaWdodAorICogICAocmVhbCBoZWlnaHQpLzIgb2YgWVVWNDIwW2luXQorICovCit2b2lkIGNzY190aWxlZF90b19saW5lYXJfdXZfbmVvbigKKyAgICB1bnNpZ25lZCBjaGFyICp1dl9kc3QsCisgICAgdW5zaWduZWQgY2hhciAqdXZfc3JjLAorICAgIHVuc2lnbmVkIGludCB3aWR0aCwKKyAgICB1bnNpZ25lZCBpbnQgaGVpZ2h0KQoreworICAgIGNzY190aWxlZF90b19saW5lYXJfY3JvcF9uZW9uKHV2X2RzdCwgdXZfc3JjLCB3aWR0aCwgaGVpZ2h0LCAwLCAwLCAwLCAwKTsKK30KKworLyoKKyAqIENvbnZlcnRzIHRpbGVkIGRhdGEgdG8gbGluZWFyIGZvciBtZmMgNi54CisgKiBEZWludGVybGVhdmUgc3JjIHRvIHVfZHN0LCB2X2RzdAorICogMS4gVVYgb2YgTlYxMlQgdG8gWSBvZiBZVVY0MjBQCisgKgorICogQHBhcmFtIHVfZHN0CisgKiAgIFUgcGxhbmUgYWRkcmVzcyBvZiBZVVY0MjBQW291dF0KKyAqCisgKiBAcGFyYW0gdl9kc3QKKyAqICAgViBwbGFuZSBhZGRyZXNzIG9mIFlVVjQyMFBbb3V0XQorICoKKyAqIEBwYXJhbSBudjEydF9zcmMKKyAqICAgWSBvciBVViBwbGFuZSBhZGRyZXNzIG9mIE5WMTJUW2luXQorICoKKyAqIEBwYXJhbSB5dXY0MjBfd2lkdGgKKyAqICAgcmVhbCB3aWR0aCBvZiBZVVY0MjBbaW5dCisgKgorICogQHBhcmFtIHl1djQyMF9oZWlnaHQKKyAqICAgKHJlYWwgaGVpZ2h0KS8yIG9mIFlVVjQyMFtpbl0KKyAqLwordm9pZCBjc2NfdGlsZWRfdG9fbGluZWFyX3V2X2RlaW50ZXJsZWF2ZV9uZW9uKAorICAgIHVuc2lnbmVkIGNoYXIgKnVfZHN0LAorICAgIHVuc2lnbmVkIGNoYXIgKnZfZHN0LAorICAgIHVuc2lnbmVkIGNoYXIgKnV2X3NyYywKKyAgICB1bnNpZ25lZCBpbnQgd2lkdGgsCisgICAgdW5zaWduZWQgaW50IGhlaWdodCkKK3sKKyAgICBjc2NfdGlsZWRfdG9fbGluZWFyX2RlaW50ZXJsZWF2ZV9jcm9wX25lb24odV9kc3QsIHZfZHN0LCB1dl9zcmMsIHdpZHRoLCBoZWlnaHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLCAwLCAwLCAwKTsKK30KKworLyoKKyAqIENvbnZlcnRzIGxpbmVhciBkYXRhIHRvIHRpbGVkCisgKiAxLiB5IG9mIHl1djQyMCB0byB5IG9mIG52MTJ0CisgKgorICogQHBhcmFtIGRzdAorICogICB5IGFkZHJlc3Mgb2YgbnYxMnRbb3V0XQorICoKKyAqIEBwYXJhbSBzcmMKKyAqICAgeSBhZGRyZXNzIG9mIHl1djQyMFtpbl0KKyAqCisgKiBAcGFyYW0geXV2NDIwX3dpZHRoCisgKiAgIHJlYWwgd2lkdGggb2YgeXV2NDIwW2luXQorICogICBpdCBzaG91bGQgYmUgZXZlbgorICoKKyAqIEBwYXJhbSB5dXY0MjBfaGVpZ2h0CisgKiAgIHJlYWwgaGVpZ2h0IG9mIHl1djQyMFtpbl0KKyAqICAgaXQgc2hvdWxkIGJlIGV2ZW4uCisgKgorICovCit2b2lkIGNzY19saW5lYXJfdG9fdGlsZWRfeV9uZW9uKAorICAgIHVuc2lnbmVkIGNoYXIgKnlfZHN0LAorICAgIHVuc2lnbmVkIGNoYXIgKnlfc3JjLAorICAgIHVuc2lnbmVkIGludCB3aWR0aCwKKyAgICB1bnNpZ25lZCBpbnQgaGVpZ2h0KQoreworICAgIGNzY19saW5lYXJfdG9fdGlsZWRfY3JvcF9uZW9uKHlfZHN0LCB5X3NyYywgd2lkdGgsIGhlaWdodCwgMCwgMCwgMCwgMCk7Cit9CisKKy8qCisgKiBDb252ZXJ0cyBhbmQgaW50ZXJsZWF2ZXMgbGluZWFyIGRhdGEgdG8gdGlsZWQKKyAqIDEuIHV2IG9mIG52MTJ0IHRvIHV2IG9mIHl1djQyMAorICoKKyAqIEBwYXJhbSBkc3QKKyAqICAgdXYgYWRkcmVzcyBvZiBudjEydFtvdXRdCisgKgorICogQHBhcmFtIHNyYworICogICB1IGFkZHJlc3Mgb2YgeXV2NDIwW2luXQorICoKKyAqIEBwYXJhbSBzcmMKKyAqICAgdiBhZGRyZXNzIG9mIHl1djQyMFtpbl0KKyAqCisgKiBAcGFyYW0geXV2NDIwX3dpZHRoCisgKiAgIHJlYWwgd2lkdGggb2YgeXV2NDIwW2luXQorICoKKyAqIEBwYXJhbSB5dXY0MjBfaGVpZ2h0CisgKiAgIHJlYWwgaGVpZ2h0IG9mIHl1djQyMFtpbl0KKyAqCisgKi8KK3ZvaWQgY3NjX2xpbmVhcl90b190aWxlZF91dl9uZW9uKAorICAgIHVuc2lnbmVkIGNoYXIgKnV2X2RzdCwKKyAgICB1bnNpZ25lZCBjaGFyICp1X3NyYywKKyAgICB1bnNpZ25lZCBjaGFyICp2X3NyYywKKyAgICB1bnNpZ25lZCBpbnQgd2lkdGgsCisgICAgdW5zaWduZWQgaW50IGhlaWdodCkKK3sKKyAgICBjc2NfbGluZWFyX3RvX3RpbGVkX2ludGVybGVhdmVfY3JvcF9uZW9uKHV2X2RzdCwgdV9zcmMsIHZfc3JjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd2lkdGgsIGhlaWdodCwgMCwgMCwgMCwgMCk7Cit9CisKKy8qCisgKiBDb252ZXJ0cyBSR0I1NjUgdG8gWVVWNDIwUAorICoKKyAqIEBwYXJhbSB5X2RzdAorICogICBZIHBsYW5lIGFkZHJlc3Mgb2YgWVVWNDIwUFtvdXRdCisgKgorICogQHBhcmFtIHVfZHN0CisgKiAgIFUgcGxhbmUgYWRkcmVzcyBvZiBZVVY0MjBQW291dF0KKyAqCisgKiBAcGFyYW0gdl9kc3QKKyAqICAgViBwbGFuZSBhZGRyZXNzIG9mIFlVVjQyMFBbb3V0XQorICoKKyAqIEBwYXJhbSByZ2Jfc3JjCisgKiAgIEFkZHJlc3Mgb2YgUkdCNTY1W2luXQorICoKKyAqIEBwYXJhbSB3aWR0aAorICogICBXaWR0aCBvZiBSR0I1NjVbaW5dCisgKgorICogQHBhcmFtIGhlaWdodAorICogICBIZWlnaHQgb2YgUkdCNTY1W2luXQorICovCit2b2lkIGNzY19SR0I1NjVfdG9fWVVWNDIwUCgKKyAgICB1bnNpZ25lZCBjaGFyICp5X2RzdCwKKyAgICB1bnNpZ25lZCBjaGFyICp1X2RzdCwKKyAgICB1bnNpZ25lZCBjaGFyICp2X2RzdCwKKyAgICB1bnNpZ25lZCBjaGFyICpyZ2Jfc3JjLAorICAgIHVuc2lnbmVkIGludCB3aWR0aCwKKyAgICB1bnNpZ25lZCBpbnQgaGVpZ2h0KQoreworICAgIHVuc2lnbmVkIGludCBpLCBqOworICAgIHVuc2lnbmVkIGludCB0bXA7CisKKyAgICB1bnNpZ25lZCBpbnQgUiwgRywgQjsKKyAgICB1bnNpZ25lZCBpbnQgWSwgVSwgVjsKKworICAgIHVuc2lnbmVkIGludCBvZmZzZXQxID0gd2lkdGggKiBoZWlnaHQ7CisgICAgdW5zaWduZWQgaW50IG9mZnNldDIgPSB3aWR0aC8yICogaGVpZ2h0LzI7CisKKyAgICB1bnNpZ25lZCBzaG9ydCBpbnQgKnBTcmMgPSAodW5zaWduZWQgc2hvcnQgaW50ICopcmdiX3NyYzsKKworICAgIHVuc2lnbmVkIGNoYXIgKnBEc3RZID0gKHVuc2lnbmVkIGNoYXIgKil5X2RzdDsKKyAgICB1bnNpZ25lZCBjaGFyICpwRHN0VSA9ICh1bnNpZ25lZCBjaGFyICopdV9kc3Q7CisgICAgdW5zaWduZWQgY2hhciAqcERzdFYgPSAodW5zaWduZWQgY2hhciAqKXZfZHN0OworCisgICAgdW5zaWduZWQgaW50IHlJbmRleCA9IDA7CisgICAgdW5zaWduZWQgaW50IHVJbmRleCA9IDA7CisgICAgdW5zaWduZWQgaW50IHZJbmRleCA9IDA7CisKKyAgICBmb3IgKGogPSAwOyBqIDwgaGVpZ2h0OyBqKyspIHsKKyAgICAgICAgZm9yIChpID0gMDsgaSA8IHdpZHRoOyBpKyspIHsKKyAgICAgICAgICAgIHRtcCA9IHBTcmNbaiAqIHdpZHRoICsgaV07CisKKyAgICAgICAgICAgIFIgPSAodG1wICYgMHgwMDAwRjgwMCkgPj4gODsKKyAgICAgICAgICAgIEcgPSAodG1wICYgMHgwMDAwMDdFMCkgPj4gMzsKKyAgICAgICAgICAgIEIgPSAodG1wICYgMHgwMDAwMDAxRik7CisgICAgICAgICAgICBCID0gQiA8PCAzOworCisgICAgICAgICAgICBZID0gKCg2NiAqIFIpICsgKDEyOSAqIEcpICsgKDI1ICogQikgKyAxMjgpOworICAgICAgICAgICAgWSA9IFkgPj4gODsKKyAgICAgICAgICAgIFkgKz0gMTY7CisKKyAgICAgICAgICAgIHBEc3RZW3lJbmRleCsrXSA9ICh1bnNpZ25lZCBjaGFyKVk7CisKKyAgICAgICAgICAgIGlmICgoaiAlIDIpID09IDAgJiYgKGkgJSAyKSA9PSAwKSB7CisgICAgICAgICAgICAgICAgVSA9ICgoLTM4ICogUikgLSAoNzQgKiBHKSArICgxMTIgKiBCKSArIDEyOCk7CisgICAgICAgICAgICAgICAgVSA9IFUgPj4gODsKKyAgICAgICAgICAgICAgICBVICs9IDEyODsKKyAgICAgICAgICAgICAgICBWID0gKCgxMTIgKiBSKSAtICg5NCAqIEcpIC0gKDE4ICogQikgKyAxMjgpOworICAgICAgICAgICAgICAgIFYgPSBWID4+IDg7CisgICAgICAgICAgICAgICAgViArPSAxMjg7CisKKyAgICAgICAgICAgICAgICBwRHN0VVt1SW5kZXgrK10gPSAodW5zaWduZWQgY2hhcilVOworICAgICAgICAgICAgICAgIHBEc3RWW3ZJbmRleCsrXSA9ICh1bnNpZ25lZCBjaGFyKVY7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9Cit9CisKKy8qCisgKiBDb252ZXJ0cyBSR0I1NjUgdG8gWVVWNDIwU1AKKyAqCisgKiBAcGFyYW0geV9kc3QKKyAqICAgWSBwbGFuZSBhZGRyZXNzIG9mIFlVVjQyMFNQW291dF0KKyAqCisgKiBAcGFyYW0gdXZfZHN0CisgKiAgIFVWIHBsYW5lIGFkZHJlc3Mgb2YgWVVWNDIwU1Bbb3V0XQorICoKKyAqIEBwYXJhbSByZ2Jfc3JjCisgKiAgIEFkZHJlc3Mgb2YgUkdCNTY1W2luXQorICoKKyAqIEBwYXJhbSB3aWR0aAorICogICBXaWR0aCBvZiBSR0I1NjVbaW5dCisgKgorICogQHBhcmFtIGhlaWdodAorICogICBIZWlnaHQgb2YgUkdCNTY1W2luXQorICovCit2b2lkIGNzY19SR0I1NjVfdG9fWVVWNDIwU1AoCisgICAgdW5zaWduZWQgY2hhciAqeV9kc3QsCisgICAgdW5zaWduZWQgY2hhciAqdXZfZHN0LAorICAgIHVuc2lnbmVkIGNoYXIgKnJnYl9zcmMsCisgICAgdW5zaWduZWQgaW50IHdpZHRoLAorICAgIHVuc2lnbmVkIGludCBoZWlnaHQpCit7CisgICAgdW5zaWduZWQgaW50IGksIGo7CisgICAgdW5zaWduZWQgaW50IHRtcDsKKworICAgIHVuc2lnbmVkIGludCBSLCBHLCBCOworICAgIHVuc2lnbmVkIGludCBZLCBVLCBWOworCisgICAgdW5zaWduZWQgaW50IG9mZnNldCA9IHdpZHRoICogaGVpZ2h0OworCisgICAgdW5zaWduZWQgc2hvcnQgaW50ICpwU3JjID0gKHVuc2lnbmVkIHNob3J0IGludCAqKXJnYl9zcmM7CisKKyAgICB1bnNpZ25lZCBjaGFyICpwRHN0WSA9ICh1bnNpZ25lZCBjaGFyICopeV9kc3Q7CisgICAgdW5zaWduZWQgY2hhciAqcERzdFVWID0gKHVuc2lnbmVkIGNoYXIgKil1dl9kc3Q7CisKKyAgICB1bnNpZ25lZCBpbnQgeUluZGV4ID0gMDsKKyAgICB1bnNpZ25lZCBpbnQgdXZJbmRleCA9IDA7CisKKyAgICBmb3IgKGogPSAwOyBqIDwgaGVpZ2h0OyBqKyspIHsKKyAgICAgICAgZm9yIChpID0gMDsgaSA8IHdpZHRoOyBpKyspIHsKKyAgICAgICAgICAgIHRtcCA9IHBTcmNbaiAqIHdpZHRoICsgaV07CisKKyAgICAgICAgICAgIFIgPSAodG1wICYgMHgwMDAwRjgwMCkgPj4gMTE7CisgICAgICAgICAgICBSID0gUiAqIDg7CisgICAgICAgICAgICBHID0gKHRtcCAmIDB4MDAwMDA3RTApID4+IDU7CisgICAgICAgICAgICBHID0gRyAqIDQ7CisgICAgICAgICAgICBCID0gKHRtcCAmIDB4MDAwMDAwMUYpOworICAgICAgICAgICAgQiA9IEIgKiA4OworCisgICAgICAgICAgICBZID0gKCg2NiAqIFIpICsgKDEyOSAqIEcpICsgKDI1ICogQikgKyAxMjgpOworICAgICAgICAgICAgWSA9IFkgPj4gODsKKyAgICAgICAgICAgIFkgKz0gMTY7CisKKyAgICAgICAgICAgIHBEc3RZW3lJbmRleCsrXSA9ICh1bnNpZ25lZCBjaGFyKVk7CisKKyAgICAgICAgICAgIGlmICgoaiAlIDIpID09IDAgJiYgKGkgJSAyKSA9PSAwKSB7CisgICAgICAgICAgICAgICAgVSA9ICgoLTM4ICogUikgLSAoNzQgKiBHKSArICgxMTIgKiBCKSArIDEyOCk7CisgICAgICAgICAgICAgICAgVSA9IFUgPj4gODsKKyAgICAgICAgICAgICAgICBVICs9IDEyODsKKyAgICAgICAgICAgICAgICBWID0gKCgxMTIgKiBSKSAtICg5NCAqIEcpIC0gKDE4ICogQikgKyAxMjgpOworICAgICAgICAgICAgICAgIFYgPSBWID4+IDg7CisgICAgICAgICAgICAgICAgViArPSAxMjg7CisKKyAgICAgICAgICAgICAgICBwRHN0VVZbdXZJbmRleCsrXSA9ICh1bnNpZ25lZCBjaGFyKVU7CisgICAgICAgICAgICAgICAgcERzdFVWW3V2SW5kZXgrK10gPSAodW5zaWduZWQgY2hhcilWOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorfQorCisvKgorICogQ29udmVydHMgQVJHQjg4ODggdG8gWVVWNDIwUAorICoKKyAqIEBwYXJhbSB5X2RzdAorICogICBZIHBsYW5lIGFkZHJlc3Mgb2YgWVVWNDIwUFtvdXRdCisgKgorICogQHBhcmFtIHVfZHN0CisgKiAgIFUgcGxhbmUgYWRkcmVzcyBvZiBZVVY0MjBQW291dF0KKyAqCisgKiBAcGFyYW0gdl9kc3QKKyAqICAgViBwbGFuZSBhZGRyZXNzIG9mIFlVVjQyMFBbb3V0XQorICoKKyAqIEBwYXJhbSByZ2Jfc3JjCisgKiAgIEFkZHJlc3Mgb2YgQVJHQjg4ODhbaW5dCisgKgorICogQHBhcmFtIHdpZHRoCisgKiAgIFdpZHRoIG9mIEFSR0I4ODg4W2luXQorICoKKyAqIEBwYXJhbSBoZWlnaHQKKyAqICAgSGVpZ2h0IG9mIEFSR0I4ODg4W2luXQorICovCit2b2lkIGNzY19BUkdCODg4OF90b19ZVVY0MjBQKAorICAgIHVuc2lnbmVkIGNoYXIgKnlfZHN0LAorICAgIHVuc2lnbmVkIGNoYXIgKnVfZHN0LAorICAgIHVuc2lnbmVkIGNoYXIgKnZfZHN0LAorICAgIHVuc2lnbmVkIGNoYXIgKnJnYl9zcmMsCisgICAgdW5zaWduZWQgaW50IHdpZHRoLAorICAgIHVuc2lnbmVkIGludCBoZWlnaHQpCit7CisgICAgdW5zaWduZWQgaW50IGksIGo7CisgICAgdW5zaWduZWQgaW50IHRtcDsKKworICAgIHVuc2lnbmVkIGludCBSLCBHLCBCOworICAgIHVuc2lnbmVkIGludCBZLCBVLCBWOworCisgICAgdW5zaWduZWQgaW50IG9mZnNldDEgPSB3aWR0aCAqIGhlaWdodDsKKyAgICB1bnNpZ25lZCBpbnQgb2Zmc2V0MiA9IHdpZHRoLzIgKiBoZWlnaHQvMjsKKworICAgIHVuc2lnbmVkIGludCAqcFNyYyA9ICh1bnNpZ25lZCBpbnQgKilyZ2Jfc3JjOworCisgICAgdW5zaWduZWQgY2hhciAqcERzdFkgPSAodW5zaWduZWQgY2hhciAqKXlfZHN0OworICAgIHVuc2lnbmVkIGNoYXIgKnBEc3RVID0gKHVuc2lnbmVkIGNoYXIgKil1X2RzdDsKKyAgICB1bnNpZ25lZCBjaGFyICpwRHN0ViA9ICh1bnNpZ25lZCBjaGFyICopdl9kc3Q7CisKKyAgICB1bnNpZ25lZCBpbnQgeUluZGV4ID0gMDsKKyAgICB1bnNpZ25lZCBpbnQgdUluZGV4ID0gMDsKKyAgICB1bnNpZ25lZCBpbnQgdkluZGV4ID0gMDsKKworICAgIGZvciAoaiA9IDA7IGogPCBoZWlnaHQ7IGorKykgeworICAgICAgICBmb3IgKGkgPSAwOyBpIDwgd2lkdGg7IGkrKykgeworICAgICAgICAgICAgdG1wID0gcFNyY1tqICogd2lkdGggKyBpXTsKKworICAgICAgICAgICAgUiA9ICh0bXAgJiAweDAwRkYwMDAwKSA+PiAxNjsKKyAgICAgICAgICAgIEcgPSAodG1wICYgMHgwMDAwRkYwMCkgPj4gODsKKyAgICAgICAgICAgIEIgPSAodG1wICYgMHgwMDAwMDBGRik7CisKKyAgICAgICAgICAgIFkgPSAoKDY2ICogUikgKyAoMTI5ICogRykgKyAoMjUgKiBCKSArIDEyOCk7CisgICAgICAgICAgICBZID0gWSA+PiA4OworICAgICAgICAgICAgWSArPSAxNjsKKworICAgICAgICAgICAgcERzdFlbeUluZGV4KytdID0gKHVuc2lnbmVkIGNoYXIpWTsKKworICAgICAgICAgICAgaWYgKChqICUgMikgPT0gMCAmJiAoaSAlIDIpID09IDApIHsKKyAgICAgICAgICAgICAgICBVID0gKCgtMzggKiBSKSAtICg3NCAqIEcpICsgKDExMiAqIEIpICsgMTI4KTsKKyAgICAgICAgICAgICAgICBVID0gVSA+PiA4OworICAgICAgICAgICAgICAgIFUgKz0gMTI4OworICAgICAgICAgICAgICAgIFYgPSAoKDExMiAqIFIpIC0gKDk0ICogRykgLSAoMTggKiBCKSArIDEyOCk7CisgICAgICAgICAgICAgICAgViA9IFYgPj4gODsKKyAgICAgICAgICAgICAgICBWICs9IDEyODsKKworICAgICAgICAgICAgICAgIHBEc3RVW3VJbmRleCsrXSA9ICh1bnNpZ25lZCBjaGFyKVU7CisgICAgICAgICAgICAgICAgcERzdFZbdkluZGV4KytdID0gKHVuc2lnbmVkIGNoYXIpVjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KK30KKworCisvKgorICogQ29udmVydHMgQVJHQjg4ODggdG8gWVVWNDIwU1AKKyAqCisgKiBAcGFyYW0geV9kc3QKKyAqICAgWSBwbGFuZSBhZGRyZXNzIG9mIFlVVjQyMFNQW291dF0KKyAqCisgKiBAcGFyYW0gdXZfZHN0CisgKiAgIFVWIHBsYW5lIGFkZHJlc3Mgb2YgWVVWNDIwU1Bbb3V0XQorICoKKyAqIEBwYXJhbSByZ2Jfc3JjCisgKiAgIEFkZHJlc3Mgb2YgQVJHQjg4ODhbaW5dCisgKgorICogQHBhcmFtIHdpZHRoCisgKiAgIFdpZHRoIG9mIEFSR0I4ODg4W2luXQorICoKKyAqIEBwYXJhbSBoZWlnaHQKKyAqICAgSGVpZ2h0IG9mIEFSR0I4ODg4W2luXQorICovCit2b2lkIGNzY19BUkdCODg4OF90b19ZVVY0MjBTUCgKKyAgICB1bnNpZ25lZCBjaGFyICp5X2RzdCwKKyAgICB1bnNpZ25lZCBjaGFyICp1dl9kc3QsCisgICAgdW5zaWduZWQgY2hhciAqcmdiX3NyYywKKyAgICB1bnNpZ25lZCBpbnQgd2lkdGgsCisgICAgdW5zaWduZWQgaW50IGhlaWdodCkKK3sKKyAgICB1bnNpZ25lZCBpbnQgaSwgajsKKyAgICB1bnNpZ25lZCBpbnQgdG1wOworCisgICAgdW5zaWduZWQgaW50IFIsIEcsIEI7CisgICAgdW5zaWduZWQgaW50IFksIFUsIFY7CisKKyAgICB1bnNpZ25lZCBpbnQgb2Zmc2V0ID0gd2lkdGggKiBoZWlnaHQ7CisKKyAgICB1bnNpZ25lZCBpbnQgKnBTcmMgPSAodW5zaWduZWQgaW50ICopcmdiX3NyYzsKKworICAgIHVuc2lnbmVkIGNoYXIgKnBEc3RZID0gKHVuc2lnbmVkIGNoYXIgKil5X2RzdDsKKyAgICB1bnNpZ25lZCBjaGFyICpwRHN0VVYgPSAodW5zaWduZWQgY2hhciAqKXV2X2RzdDsKKworICAgIHVuc2lnbmVkIGludCB5SW5kZXggPSAwOworICAgIHVuc2lnbmVkIGludCB1dkluZGV4ID0gMDsKKworICAgIGZvciAoaiA9IDA7IGogPCBoZWlnaHQ7IGorKykgeworICAgICAgICBmb3IgKGkgPSAwOyBpIDwgd2lkdGg7IGkrKykgeworICAgICAgICAgICAgdG1wID0gcFNyY1tqICogd2lkdGggKyBpXTsKKworICAgICAgICAgICAgUiA9ICh0bXAgJiAweDAwRkYwMDAwKSA+PiAxNjsKKyAgICAgICAgICAgIEcgPSAodG1wICYgMHgwMDAwRkYwMCkgPj4gODsKKyAgICAgICAgICAgIEIgPSAodG1wICYgMHgwMDAwMDBGRik7CisKKyAgICAgICAgICAgIFkgPSAoKDY2ICogUikgKyAoMTI5ICogRykgKyAoMjUgKiBCKSArIDEyOCk7CisgICAgICAgICAgICBZID0gWSA+PiA4OworICAgICAgICAgICAgWSArPSAxNjsKKworICAgICAgICAgICAgcERzdFlbeUluZGV4KytdID0gKHVuc2lnbmVkIGNoYXIpWTsKKworICAgICAgICAgICAgaWYgKChqICUgMikgPT0gMCAmJiAoaSAlIDIpID09IDApIHsKKyAgICAgICAgICAgICAgICBVID0gKCgtMzggKiBSKSAtICg3NCAqIEcpICsgKDExMiAqIEIpICsgMTI4KTsKKyAgICAgICAgICAgICAgICBVID0gVSA+PiA4OworICAgICAgICAgICAgICAgIFUgKz0gMTI4OworICAgICAgICAgICAgICAgIFYgPSAoKDExMiAqIFIpIC0gKDk0ICogRykgLSAoMTggKiBCKSArIDEyOCk7CisgICAgICAgICAgICAgICAgViA9IFYgPj4gODsKKyAgICAgICAgICAgICAgICBWICs9IDEyODsKKworICAgICAgICAgICAgICAgIHBEc3RVVlt1dkluZGV4KytdID0gKHVuc2lnbmVkIGNoYXIpVTsKKyAgICAgICAgICAgICAgICBwRHN0VVZbdXZJbmRleCsrXSA9ICh1bnNpZ25lZCBjaGFyKVY7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9Cit9ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvZXh5bm9zNC9oYWwvbGlidW1wL0FuZHJvaWQubWsgYi9leHlub3M0L2hhbC9saWJ1bXAvQW5kcm9pZC5tawpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42ODczNzBjCi0tLSAvZGV2L251bGwKKysrIGIvZXh5bm9zNC9oYWwvbGlidW1wL0FuZHJvaWQubWsKQEAgLTAsMCArMSw0OCBAQAorIyAKKyMgQ29weXJpZ2h0IChDKSAyMDEwIEFSTSBMaW1pdGVkLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorIyAKKyMgQ29weXJpZ2h0IChDKSAyMDA4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyMKKyMgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisjIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyMgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisjCisjICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisjCisjIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyMgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisjIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyMgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisKK0xPQ0FMX1BBVEggOj0gJChjYWxsIG15LWRpcikKK2luY2x1ZGUgJChDTEVBUl9WQVJTKQorCitVTVBfU1JDUyA6PSBcCisJYXJjaF8wMTFfdWRkL3VtcF9mcm9udGVuZC5jIFwKKwlhcmNoXzAxMV91ZGQvdW1wX3JlZl9kcnYuYyBcCisJYXJjaF8wMTFfdWRkL3VtcF9hcmNoLmMgXAorCW9zL2xpbnV4L3VtcF91a3UuYyBcCisJb3MvbGludXgvdW1wX29zdV9tZW1vcnkuYyBcCisJb3MvbGludXgvdW1wX29zdV9sb2Nrcy5jCisKKyMgU2hhcmVkIGFuZCBzdGF0aWMgbGlicmFyeSBmb3IgdGFyZ2V0CisjID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CitpbmNsdWRlICQoQ0xFQVJfVkFSUykKK0xPQ0FMX01PRFVMRSA6PSBsaWJVTVAKK0xPQ0FMX1NSQ19GSUxFUyA6PSAkKFVNUF9TUkNTKQorCitMT0NBTF9DX0lOQ0xVREVTOj0gXAorCSQoQk9BUkRfSEFMX1BBVEgpL2xpYnVtcC8gXAorCSQoQk9BUkRfSEFMX1BBVEgpL2xpYnVtcC9pbmNsdWRlL3VtcCBcCisKK0xPQ0FMX01PRFVMRV9UQUdTIDo9IG9wdGlvbmFsCitMT0NBTF9NT0RVTEVfUEFUSCA6PSAkKFRBUkdFVF9PVVRfU1RBVElDX0xJQlJBUklFUykvCitpbmNsdWRlICQoQlVJTERfU1RBVElDX0xJQlJBUlkpCisKK2luY2x1ZGUgJChDTEVBUl9WQVJTKQorTE9DQUxfTU9EVUxFIDo9IGxpYlVNUAorTE9DQUxfTU9EVUxFX1RBR1MgOj0gb3B0aW9uYWwKK0xPQ0FMX1dIT0xFX1NUQVRJQ19MSUJSQVJJRVMgOj0gbGliVU1QCitMT0NBTF9NT0RVTEVfUEFUSCA6PSAkKFRBUkdFVF9PVVRfU0hBUkVEX0xJQlJBUklFUykvCitpbmNsdWRlICQoQlVJTERfU0hBUkVEX0xJQlJBUlkpCmRpZmYgLS1naXQgYS9leHlub3M0L2hhbC9saWJ1bXAvTWFrZWZpbGUgYi9leHlub3M0L2hhbC9saWJ1bXAvTWFrZWZpbGUKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjkzNmZlOQotLS0gL2Rldi9udWxsCisrKyBiL2V4eW5vczQvaGFsL2xpYnVtcC9NYWtlZmlsZQpAQCAtMCwwICsxLDM4IEBACisjCisjIENvcHlyaWdodCAoQykgMjAxMC0yMDExIEFSTSBMaW1pdGVkLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorIyAKKyMgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisjIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyMgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisjIAorIyAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyMgCisjIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyMgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisjIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyMgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisjCisKK1VNUF9ESVIgPz0gLgorVU1QX0xJQiA/PSBsaWJVTVAKK1VERF9PUyA/PSBhbmRyb2lkCisjQ1JPU1NfQ09NUElMRSA/PSBhcm0tbm9uZS1saW51eC1nbnVlYWJpLQorVEFSR0VUX0NDID89ICQoQ1JPU1NfQ09NUElMRSlnY2MKK1RBUkdFVF9BUiA/PSAkKENST1NTX0NPTVBJTEUpYXIKK0NGTEFHUyArPSAtSSQoVU1QX0RJUikvaW5jbHVkZSAtSSQoVU1QX0RJUikvaW5jbHVkZS91bXAgLVdhbGwgLW1hcmNoPWFybXY2IC1tdGh1bWItaW50ZXJ3b3JrIC1mbm8tc3RyaWN0LWFsaWFzaW5nIC1Xbm8tc3RyaWN0LWFsaWFzaW5nIC1Xbm8tbG9uZy1sb25nIC1PMworCitpbmNsdWRlIHVtcC5tYWsKKworJS5vOiAlLmMKKwkkKFRBUkdFVF9DQykgLWMgLW8gJEAgJDwgJChDRkxBR1MpCisKK1VNUF9PQkpTIDo9ICQoVU1QX1NSQ1M6LmM9Lm8pCisKK2xpYlVNUC5zbzogJChVTVBfT0JKUykKKwlhcm0tbm9uZS1saW51eC1nbnVlYWJpLWdjYyAtc2hhcmVkIC1vICRAICQoVU1QX09CSlMpICQoQ0ZMQUdTKQorbGliVU1QLmE6ICQoVU1QX09CSlMpCisJJChUQVJHRVRfQVIpIHJjcyAkQCAkKFVNUF9PQkpTKQorCitjbGVhbjoKKwktcm0gLWYgJChVTVBfT0JKUykgbGliVU1QLnNvIGxpYlVNUC5hCmRpZmYgLS1naXQgYS9leHlub3M0L2hhbC9saWJ1bXAvYXJjaF8wMTFfdWRkL3VtcF9hcmNoLmMgYi9leHlub3M0L2hhbC9saWJ1bXAvYXJjaF8wMTFfdWRkL3VtcF9hcmNoLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzljM2MxOAotLS0gL2Rldi9udWxsCisrKyBiL2V4eW5vczQvaGFsL2xpYnVtcC9hcmNoXzAxMV91ZGQvdW1wX2FyY2guYwpAQCAtMCwwICsxLDI2MCBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxMC0yMDExIEFSTSBMaW1pdGVkLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICogCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICogCisgKiAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqIAorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworLyoqCisgKiBAZmlsZSB1bXBfYXJjaC5jCisgKgorICogVU1QIGFyY2ggbGF5ZXIgZm9yIFVNUC1VREQKKyAqLworCisjaW5jbHVkZSA8dW1wL3VtcC5oPgorI2luY2x1ZGUgInVtcF9hcmNoLmgiCisjaW5jbHVkZSA8dW1wL3VtcF9kZWJ1Zy5oPgorCisjaW5jbHVkZSA8dW1wL3VtcF91a190eXBlcy5oPgorI2luY2x1ZGUgIi4uL29zL3VtcF91a3UuaCIKKworLyoqIFBvaW50ZXIgdG8gYW4gT1MtU3BlY2lmaWMgY29udGV4dCB0aGF0IHdlIHNob3VsZCBwYXNzIGluIF91a3VfIGNhbGxzICovCit2b2lkICp1bXBfdWtfY3R4ID0gTlVMTDsKKworLyoqIFJlZmVyZW5jZSBjb3VudGluZyBvZiB1bXBfYXJjaF9vcGVuKCkgYW5kIHVtcF9hcmNoX2Nsb3NlKCkuICovCit2b2xhdGlsZSBzdGF0aWMgaW50IHVtcF9yZWZfY291bnQgPSAwOworCisvKiogTG9jayBmb3IgY3JpdGljYWwgc2VjdGlvbiBpbiBvcGVuL2Nsb3NlICovCitfdW1wX29zdV9sb2NrX3QgKiB1bXBfbG9jayA9IE5VTEw7CisKK3VtcF9yZXN1bHQgdW1wX2FyY2hfb3Blbih2b2lkKQoreworCXVtcF9yZXN1bHQgcmV0dmFsID0gVU1QX09LOworCisJX3VtcF9vc3VfbG9ja19hdXRvX2luaXQoICZ1bXBfbG9jaywgMCwgMCwgMCApOworCisJLyogQ2hlY2sgdGhhdCB0aGUgbG9jayB3YXMgaW5pdGlhbGl6ZWQgKi8KKwlpZiAoTlVMTCA9PSB1bXBfbG9jaykKKwl7CisJCVVNUF9ERUJVR19QUklOVCgxLCAoIlVNUDogdW1wX2FyY2hfb3BlbigpIGZhaWxlZCB0byBpbml0IGxvY2tcbiIpKTsKKwkJcmV0dXJuIFVNUF9FUlJPUjsKKwl9CisKKwkvKiBBdHRlbXB0IHRvIG9idGFpbiBhIGxvY2sgKi8KKwlpZiggX1VNUF9PU1VfRVJSX09LICE9ICBfdW1wX29zdV9sb2NrX3dhaXQoIHVtcF9sb2NrLCBfVU1QX09TVV9MT0NLTU9ERV9SVyApICkKKwl7CisJCVVNUF9ERUJVR19QUklOVCgxLCAoIlVNUDogdW1wX2FyY2hfb3BlbigpIGZhaWxlZCB0byBhY3F1aXJlIGxvY2tcbiIpKTsKKwkJcmV0dXJuIFVNUF9FUlJPUjsKKwl9CisKKwkvKiBBU1NFUlQgTkVFREVEICovCisJVU1QX0RFQlVHX0FTU0VSVCgwIDw9IHVtcF9yZWZfY291bnQsICgiVU1QOiBSZWZlcmVuY2UgY291bnQgaW52YWxpZCBhdCBfdW1wX2Jhc2VfYXJjaF9vcGVuKCkiKSk7CisJdW1wX3JlZl9jb3VudCsrOworCisJaWYgKDEgPT0gdW1wX3JlZl9jb3VudCkKKwl7CisJCS8qIFdlIGFyZSB0aGUgZmlyc3QsIG9wZW4gdGhlIFVNUCBkZXZpY2UgZHJpdmVyICovCisKKwkJaWYgKF9VTVBfT1NVX0VSUl9PSyAhPSBfdW1wX3VrdV9vcGVuKCAmdW1wX3VrX2N0eCApKQorCQl7CisJCQlVTVBfREVCVUdfUFJJTlQoMSwgKCJVTVA6IHVtcF9hcmNoX29wZW4oKSBmYWlsZWQgdG8gb3BlbiBVTVAgZGV2aWNlIGRyaXZlclxuIikpOworCQkJcmV0dmFsID0gVU1QX0VSUk9SOworCQkJdW1wX3JlZl9jb3VudC0tOworCQl9CisJfQorCisJLyogU2lnbmFsIHRoZSBsb2NrIHNvIHNvbWVvbmUgZWxzZSBjYW4gdXNlIGl0ICovCisJIF91bXBfb3N1X2xvY2tfc2lnbmFsKCB1bXBfbG9jaywgX1VNUF9PU1VfTE9DS01PREVfUlcgKTsKKworCXJldHVybiByZXR2YWw7Cit9CisKKworCit2b2lkIHVtcF9hcmNoX2Nsb3NlKHZvaWQpCit7CisJX3VtcF9vc3VfbG9ja19hdXRvX2luaXQoICZ1bXBfbG9jaywgMCwgMCwgMCApOworCisJLyogQ2hlY2sgdGhhdCB0aGUgbG9jayB3YXMgaW5pdGlhbGl6ZWQgKi8KKwlpZihOVUxMID09IHVtcF9sb2NrKQorCXsKKwkJVU1QX0RFQlVHX1BSSU5UKDEsICgiVU1QOiB1bXBfYXJjaF9jbG9zZSgpIGZhaWxlZCB0byBpbml0IGxvY2tcbiIpKTsKKwkJcmV0dXJuOworCX0KKworCS8qIEF0dGVtcHQgdG8gb2J0YWluIGEgbG9jayAqLworCWlmKCBfVU1QX09TVV9FUlJfT0sgIT0gIF91bXBfb3N1X2xvY2tfd2FpdCggdW1wX2xvY2ssIF9VTVBfT1NVX0xPQ0tNT0RFX1JXICkgKQorCXsKKwkJVU1QX0RFQlVHX1BSSU5UKDEsICgiVU1QOiB1bXBfYXJjaF9jbG9zZSgpIGZhaWxlZCB0byBhY3F1aXJlIGxvY2tcbiIpKTsKKwkJcmV0dXJuOworCX0KKworCVVNUF9ERUJVR19BU1NFUlQoMCA8IHVtcF9yZWZfY291bnQsICgiVU1QOiB1bXBfYXJjaF9jbG9zZSgpIGNhbGxlZCB3aGlsZSBubyByZWZlcmVuY2VzIGV4aXN0IikpOworCWlmICh1bXBfcmVmX2NvdW50ID4gMCkKKwl7CisJCXVtcF9yZWZfY291bnQtLTsKKwkJaWYgKDAgPT0gdW1wX3JlZl9jb3VudCkKKwkJeworCQkJX3VtcF9vc3VfZXJyY29kZV90IHJldHZhbCA9IF91bXBfdWt1X2Nsb3NlKCZ1bXBfdWtfY3R4KTsKKwkJCVVNUF9ERUJVR19BU1NFUlQocmV0dmFsID09IF9VTVBfT1NVX0VSUl9PSywgKCJVTVA6IEZhaWxlZCB0byBjbG9zZSBVTVAgaW50ZXJmYWNlIikpOworCQkJVU1QX0lHTk9SRShyZXR2YWwpOworCQkJdW1wX3VrX2N0eCA9IE5VTEw7CisJCQlfdW1wX29zdV9sb2NrX3NpZ25hbCggdW1wX2xvY2ssIF9VTVBfT1NVX0xPQ0tNT0RFX1JXICk7CisJCQlfdW1wX29zdV9sb2NrX3Rlcm0oIHVtcF9sb2NrICk7IC8qIE5vdCAxMDAlIHRocmVhZCBzYWZlLCBzaW5jZSBhbm90aGVyIHRocmVhZCBjYW4gYWxyZWFkeSBiZSB3YWl0aW5nIGZvciB0aGlzIGxvY2sgaW4gdW1wX2FyY2hfb3BlbigpICovCisJCQl1bXBfbG9jayA9IE5VTEw7CisJCQlyZXR1cm47CisJCX0KKwl9CisKKwkvKiBTaWduYWwgdGhlIGxvY2sgc28gc29tZW9uZSBlbHNlIGNhbiB1c2UgaXQgKi8KKwkgX3VtcF9vc3VfbG9ja19zaWduYWwoIHVtcF9sb2NrLCBfVU1QX09TVV9MT0NLTU9ERV9SVyApOworfQorCisKKwordW1wX3NlY3VyZV9pZCB1bXBfYXJjaF9hbGxvY2F0ZSh1bnNpZ25lZCBsb25nICogc2l6ZSwgdW1wX2FsbG9jX2NvbnN0cmFpbnRzIGNvbnN0cmFpbnRzKQoreworCV91bXBfdWtfYWxsb2NhdGVfcyBjYWxsX2FyZzsKKworCWlmICggTlVMTCA9PSBzaXplICkKKwl7CisJCXJldHVybiBVTVBfSU5WQUxJRF9TRUNVUkVfSUQ7CisJfQorCisJY2FsbF9hcmcuY3R4ID0gdW1wX3VrX2N0eDsKKwljYWxsX2FyZy5zZWN1cmVfaWQgPSBVTVBfSU5WQUxJRF9TRUNVUkVfSUQ7CisJY2FsbF9hcmcuc2l6ZSA9ICpzaXplOworI2lmZGVmIFVNUF9ERUJVR19TS0lQX0NPREUKKwkvKiogUnVuLXRpbWUgQVNTRVJUaW5nIHRoYXQgX3VtcF91a19hcGlfdmVyc2lvbl9zIGFuZCB1bXBfYWxsb2NfY29uc3RyYWludHMgYXJlCisJICogaW50ZXJjaGFuZ2FibGUgKi8KKwlzd2l0Y2ggKGNvbnN0cmFpbnRzKQorCXsKKwljYXNlIFVNUF9SRUZfRFJWX0NPTlNUUkFJTlRfTk9ORToKKwkJVU1QX0RFQlVHX0FTU0VSVCggVU1QX1JFRl9EUlZfVUtfQ09OU1RSQUlOVF9OT05FID09IGNvbnN0cmFpbnRzLCAoInVtcF91a19hbGxvY19jb25zdHJhaW50cyBvdXQgb2Ygc3luYyB3aXRoIHVtcF9hbGxvY19jb25zdHJhaW50cyIpICk7CisJCWJyZWFrOworCWNhc2UgVU1QX1JFRl9EUlZfQ09OU1RSQUlOVF9QSFlTSUNBTExZX0xJTkVBUjoKKwkJVU1QX0RFQlVHX0FTU0VSVCggVU1QX1JFRl9EUlZfVUtfQ09OU1RSQUlOVF9QSFlTSUNBTExZX0xJTkVBUiA9PSBjb25zdHJhaW50cywgKCJ1bXBfdWtfYWxsb2NfY29uc3RyYWludHMgb3V0IG9mIHN5bmMgd2l0aCB1bXBfYWxsb2NfY29uc3RyYWludHMiKSApOworCQlicmVhazsKKwlkZWZhdWx0OgorCQlVTVBfREVCVUdfQVNTRVJUKCAxLCAoInVtcF91a19hbGxvY19jb25zdHJhaW50cyBvdXQgb2Ygc3luYyB3aXRoIHVtcF9hbGxvY19jb25zdHJhaW50czogJWQgdW5yZWNvZ25pemVkIiwgY29uc3RyYWludHMpICk7CisJCWJyZWFrOworCX0KKyNlbmRpZgorCWNhbGxfYXJnLmNvbnN0cmFpbnRzID0gKHVtcF91a19hbGxvY19jb25zdHJhaW50cyljb25zdHJhaW50czsKKworCWlmICggX1VNUF9PU1VfRVJSX09LICE9IF91bXBfdWt1X2FsbG9jYXRlKCZjYWxsX2FyZykgKQorCXsKKwkJcmV0dXJuIFVNUF9JTlZBTElEX1NFQ1VSRV9JRDsKKwl9CisKKwkqc2l6ZSA9IGNhbGxfYXJnLnNpemU7CisKKwlVTVBfREVCVUdfUFJJTlQoNCwgKCJVTVA6IEFsbG9jYXRlZCBJRCAldSwgc2l6ZSAldWwiLCBjYWxsX2FyZy5zZWN1cmVfaWQsIGNhbGxfYXJnLnNpemUpKTsKKworCXJldHVybiBjYWxsX2FyZy5zZWN1cmVfaWQ7Cit9CisKKworCit1bnNpZ25lZCBsb25nIHVtcF9hcmNoX3NpemVfZ2V0KHVtcF9zZWN1cmVfaWQgc2VjdXJlX2lkKQoreworCV91bXBfdWtfc2l6ZV9nZXRfcyBkZF9zaXplX2NhbGxfYXJnOworCisJZGRfc2l6ZV9jYWxsX2FyZy5jdHggPSB1bXBfdWtfY3R4OworCWRkX3NpemVfY2FsbF9hcmcuc2VjdXJlX2lkID0gc2VjdXJlX2lkOworCWRkX3NpemVfY2FsbF9hcmcuc2l6ZSA9IDA7CisKKwlpZiAoX1VNUF9PU1VfRVJSX09LID09IF91bXBfdWt1X3NpemVfZ2V0KCAmZGRfc2l6ZV9jYWxsX2FyZyApICkKKwl7CisJCXJldHVybiBkZF9zaXplX2NhbGxfYXJnLnNpemU7CisJfQorCisJcmV0dXJuIDA7Cit9CisKKwordm9pZCB1bXBfYXJjaF9yZWZlcmVuY2VfcmVsZWFzZSh1bXBfc2VjdXJlX2lkIHNlY3VyZV9pZCkKK3sKKwlfdW1wX3VrX3JlbGVhc2VfcyBkZF9yZWxlYXNlX2NhbGxfYXJnOworCV91bXBfb3N1X2VycmNvZGVfdCByZXR2YWw7CisKKwlkZF9yZWxlYXNlX2NhbGxfYXJnLmN0eCA9IHVtcF91a19jdHg7CisJZGRfcmVsZWFzZV9jYWxsX2FyZy5zZWN1cmVfaWQgPSBzZWN1cmVfaWQ7CisKKwlVTVBfREVCVUdfUFJJTlQoNCwgKCJVTVA6IFJlbGVhc2luZyBJRCAldSIsIHNlY3VyZV9pZCkpOworCisJcmV0dmFsID0gX3VtcF91a3VfcmVsZWFzZSggJmRkX3JlbGVhc2VfY2FsbF9hcmcgKTsKKwlVTVBfREVCVUdfQVNTRVJUKHJldHZhbCA9PSBfVU1QX09TVV9FUlJfT0ssICgiVU1QOiBGYWlsZWQgdG8gcmVsZWFzZSByZWZlcmVuY2UgdG8gVU1QIG1lbW9yeSIpKTsKKwlVTVBfSUdOT1JFKHJldHZhbCk7Cit9CisKKwordm9pZCogdW1wX2FyY2hfbWFwKHVtcF9zZWN1cmVfaWQgc2VjdXJlX2lkLCB1bnNpZ25lZCBsb25nIHNpemUsIHVtcF9jYWNoZV9lbmFibGVkIGNhY2hlLCB1bnNpZ25lZCBsb25nICpjb29raWVfb3V0KQoreworCV91bXBfdWtfbWFwX21lbV9zIGRkX21hcF9jYWxsX2FyZzsKKworCVVNUF9ERUJVR19BU1NFUlRfUE9JTlRFUiggY29va2llX291dCApOworCisJZGRfbWFwX2NhbGxfYXJnLmN0eCA9IHVtcF91a19jdHg7CisJZGRfbWFwX2NhbGxfYXJnLnNlY3VyZV9pZCA9IHNlY3VyZV9pZDsKKwlkZF9tYXBfY2FsbF9hcmcuc2l6ZSA9IHNpemU7CisJZGRfbWFwX2NhbGxfYXJnLmlzX2NhY2hlZCA9ICh1MzIpIChVTVBfQ0FDSEVfRU5BQkxFPT1jYWNoZSk7CisKKwlpZiAoIC0xID09IF91bXBfdWt1X21hcF9tZW0oICZkZF9tYXBfY2FsbF9hcmcgKSApCisJeworCQlVTVBfREVCVUdfUFJJTlQoNCwgKCJVTVA6IE1hcHBpbmcgZmFpbGVkIGZvciBJRCAldSIsIHNlY3VyZV9pZCkpOworCQlyZXR1cm4gTlVMTDsKKwl9CisKKwlVTVBfREVCVUdfUFJJTlQoNCwgKCJNYXBwZWQgJXUgYXQgMHglMDhseCIsIHNlY3VyZV9pZCwgKHVuc2lnbmVkIGxvbmcpZGRfbWFwX2NhbGxfYXJnLm1hcHBpbmcpKTsKKworCSpjb29raWVfb3V0ID0gZGRfbWFwX2NhbGxfYXJnLmNvb2tpZTsKKwlyZXR1cm4gZGRfbWFwX2NhbGxfYXJnLm1hcHBpbmc7Cit9CisKKworCit2b2lkIHVtcF9hcmNoX3VubWFwKHZvaWQqIG1hcHBpbmcsIHVuc2lnbmVkIGxvbmcgc2l6ZSwgdW5zaWduZWQgbG9uZyBjb29raWUpCit7CisJX3VtcF91a191bm1hcF9tZW1fcyBkZF91bm1hcF9jYWxsX2FyZzsKKworCWRkX3VubWFwX2NhbGxfYXJnLmN0eCA9IHVtcF91a19jdHg7CisJZGRfdW5tYXBfY2FsbF9hcmcubWFwcGluZyA9IG1hcHBpbmc7CisJZGRfdW5tYXBfY2FsbF9hcmcuc2l6ZSA9IHNpemU7CisJZGRfdW5tYXBfY2FsbF9hcmcuY29va2llID0gY29va2llOworCisJVU1QX0RFQlVHX1BSSU5UKDQsICgiVW5tYXBwaW5nIDB4JTA4bHgiLCAodW5zaWduZWQgbG9uZyltYXBwaW5nKSk7CisJX3VtcF91a3VfdW5tYXBfbWVtKCAmZGRfdW5tYXBfY2FsbF9hcmcgKTsKK30KKworLyoqIE1lbW9yeSBzeW5jaHJvbml6YXRpb24gLSBjYWNoZSBmbHVzaGluZyBvZiBtYXBwZWQgbWVtb3J5ICovCitpbnQgdW1wX2FyY2hfbXN5bmModW1wX3NlY3VyZV9pZCBzZWN1cmVfaWQsIHZvaWQqIG1hcHBpbmcsIHVuc2lnbmVkIGxvbmcgY29va2llLCB2b2lkICogYWRkcmVzcywgdW5zaWduZWQgbG9uZyBzaXplLCAgdW1wX2NwdV9tc3luY19vcCBvcCkKK3sKKwlfdW1wX3VrX21zeW5jX3MgZGRfbXN5bmNfY2FsbF9hcmc7CisKKwlkZF9tc3luY19jYWxsX2FyZy5jdHggPSB1bXBfdWtfY3R4OworCWRkX21zeW5jX2NhbGxfYXJnLm1hcHBpbmcgPSBtYXBwaW5nOworCWRkX21zeW5jX2NhbGxfYXJnLmFkZHJlc3MgPSBhZGRyZXNzOworCWRkX21zeW5jX2NhbGxfYXJnLnNpemUgPSBzaXplOworCWRkX21zeW5jX2NhbGxfYXJnLm9wID0gKHVtcF91a19tc3luY19vcClvcDsKKwlkZF9tc3luY19jYWxsX2FyZy5jb29raWUgPSBjb29raWU7CisJZGRfbXN5bmNfY2FsbF9hcmcuc2VjdXJlX2lkID0gc2VjdXJlX2lkOworCWRkX21zeW5jX2NhbGxfYXJnLmlzX2NhY2hlZCA9IDA7CisKKwlVTVBfREVCVUdfUFJJTlQoNCwgKCJNc3luYyAweCUwOGx4IiwgKHVuc2lnbmVkIGxvbmcpbWFwcGluZykpOworCV91bXBfdWt1X21zeW5jaCggJmRkX21zeW5jX2NhbGxfYXJnICk7CisJaWYgKCAwPT1kZF9tc3luY19jYWxsX2FyZy5pc19jYWNoZWQgKQorCXsKKwkJVU1QX0RFQlVHX1BSSU5UKDQsICgiVHJ5aW5nIHRvIGZsdXNoIHVuY2FjaGVkIFVNUCBtZW0gSUQ6ICVkIiwgc2VjdXJlX2lkKSk7CisJfQorCXJldHVybiBkZF9tc3luY19jYWxsX2FyZy5pc19jYWNoZWQ7Cit9CmRpZmYgLS1naXQgYS9leHlub3M0L2hhbC9saWJ1bXAvYXJjaF8wMTFfdWRkL3VtcF9hcmNoLmggYi9leHlub3M0L2hhbC9saWJ1bXAvYXJjaF8wMTFfdWRkL3VtcF9hcmNoLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDY0ZDdjNQotLS0gL2Rldi9udWxsCisrKyBiL2V4eW5vczQvaGFsL2xpYnVtcC9hcmNoXzAxMV91ZGQvdW1wX2FyY2guaApAQCAtMCwwICsxLDY1IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDEwLTIwMTEgQVJNIExpbWl0ZWQuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKiAKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKiAKKyAqICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICogCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisvKioKKyAqIEBmaWxlIHVtcF9hcmNoLmgKKyAqCisgKiBIZWFkZXIgZmlsZSBmb3IgdGhlIGFyY2ggZGVwZW5kZW50IGJhY2tlbmQsIHdoaWNoIHdpbGwgZG8gdGhlIGNvbW11bmljYXRpb24gd2l0aCB0aGUgVU1QIGRldmljZSBkcml2ZXIuCisgKi8KKworI2lmbmRlZiBfVU5JRklFRF9NRU1PUllfUFJPVklERVJfQVJDSF9IXworI2RlZmluZSBfVU5JRklFRF9NRU1PUllfUFJPVklERVJfQVJDSF9IXworCisjaW5jbHVkZSA8dW1wL3VtcC5oPgorI2luY2x1ZGUgPHVtcC91bXBfcmVmX2Rydi5oPgorI2luY2x1ZGUgInVtcF9pbnRlcm5hbC5oIgorCisjaWZkZWYgX19jcGx1c3BsdXMKK2V4dGVybiAiQyIgeworI2VuZGlmCisKKworCisvKiogT3BlbiBVTVAgaW50ZXJmYWNlLiAqLwordW1wX3Jlc3VsdCB1bXBfYXJjaF9vcGVuKHZvaWQpOworCisvKiogQ2xvc2UgVU1QIGludGVyZmFjZS4gKi8KK3ZvaWQgdW1wX2FyY2hfY2xvc2Uodm9pZCk7CisKKy8qKiBBbGxvY2F0ZSBVTVAgbWVtb3J5LiAqLwordW1wX3NlY3VyZV9pZCB1bXBfYXJjaF9hbGxvY2F0ZSh1bnNpZ25lZCBsb25nICogc2l6ZSwgdW1wX2FsbG9jX2NvbnN0cmFpbnRzIGNvbnN0cmFpbnRzKTsKKworLyoqIFF1ZXJ5IHNpemUgb2Ygc3BlY2lmaWVkIFVNUCBtZW1vcnksIGluIGJ5dGVzLiAqLwordW5zaWduZWQgbG9uZyB1bXBfYXJjaF9zaXplX2dldCh1bXBfc2VjdXJlX2lkIHNlY3VyZV9pZCk7CisKKy8qKiBSZWxlYXNlIGEgcmVmZXJlbmNlIGZyb20gc3BlY2lmaWVkIFVNUCBtZW1vcnkuICovCit2b2lkIHVtcF9hcmNoX3JlZmVyZW5jZV9yZWxlYXNlKHVtcF9zZWN1cmVfaWQgc2VjdXJlX2lkKTsKKworLyoqIE1hcCBzcGVjaWZpZWQgVU1QIG1lbW9yeSBpbnRvIENQVSBhZGRyZXNzIHNwYWNlICovCit2b2lkKiB1bXBfYXJjaF9tYXAodW1wX3NlY3VyZV9pZCBzZWN1cmVfaWQsIHVuc2lnbmVkIGxvbmcgc2l6ZSwgdW1wX2NhY2hlX2VuYWJsZWQgY2FjaGUsIHVuc2lnbmVkIGxvbmcgKmNvb2tpZV9vdXQpOworCisvKiogVW5tYXAgc3BlY2lmaWVkIFVNUCBtZW1vcnkgZnJvbSBDUFUgYWRkZXJzcyBzcGFjZSAqLwordm9pZCB1bXBfYXJjaF91bm1hcCh2b2lkKiBtYXBwaW5nLCB1bnNpZ25lZCBsb25nIHNpemUsIHVuc2lnbmVkIGxvbmcgY29va2llKTsKKworLyoqIE1lbW9yeSBzeW5jaHJvbml6YXRpb24gLSBjYWNoZSBmbHVzaGluZyBvZiBtYXBwZWQgbWVtb3J5CisgKiBAcmV0dXJuIElzX2NhY2hlZDogMT09VHJ1ZSAwPT1Ob25DYWNoZWQgKi8KK2ludCB1bXBfYXJjaF9tc3luYyh1bXBfc2VjdXJlX2lkIHNlY3VyZV9pZCwgdm9pZCogbWFwcGluZywgdW5zaWduZWQgbG9uZyBjb29raWUsIHZvaWQgKiBhZGRyZXNzLCB1bnNpZ25lZCBsb25nIHNpemUsICB1bXBfY3B1X21zeW5jX29wIG9wKTsKKworI2lmZGVmIF9fY3BsdXNwbHVzCit9CisjZW5kaWYKKworI2VuZGlmIC8qIF9VTklGSUVEX01FTU9SWV9QUk9WSURFUl9BUkNIX0hfICovCmRpZmYgLS1naXQgYS9leHlub3M0L2hhbC9saWJ1bXAvYXJjaF8wMTFfdWRkL3VtcF9mcm9udGVuZC5jIGIvZXh5bm9zNC9oYWwvbGlidW1wL2FyY2hfMDExX3VkZC91bXBfZnJvbnRlbmQuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44YzkzMzMyCi0tLSAvZGV2L251bGwKKysrIGIvZXh5bm9zNC9oYWwvbGlidW1wL2FyY2hfMDExX3VkZC91bXBfZnJvbnRlbmQuYwpAQCAtMCwwICsxLDIxMyBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxMC0yMDExIEFSTSBMaW1pdGVkLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICogCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICogCisgKiAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqIAorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworLyoqCisgKiBAZmlsZSB1bXBfZnJvbnRlbmQuYworICoKKyAqIFRoaXMgZmlsZSBpbXBsZW1lbnRzIHRoZSB1c2VyIHNwYWNlIEFQSSBvZiB0aGUgVU1QIEFQSS4KKyAqIEl0IHJlbGllcyBoZWF2aWx5IG9uIGEgYXJjaCBiYWNrZW5kIHRvIGRvIHRoZSBjb21tdW5pY2F0aW9uIHdpdGggdGhlIFVNUCBkZXZpY2UgZHJpdmVyLgorICovCisKKyNpbmNsdWRlIDx1bXAvdW1wLmg+CisjaW5jbHVkZSAidW1wX2ludGVybmFsLmgiCisjaW5jbHVkZSAidW1wX2FyY2guaCIKKyNpbmNsdWRlIDx1bXAvdW1wX2RlYnVnLmg+CisjaW5jbHVkZSA8dW1wL3VtcF9vc3UuaD4KKworVU1QX0FQSV9FWFBPUlQgdW1wX3Jlc3VsdCB1bXBfb3Blbih2b2lkKQoreworCXJldHVybiB1bXBfYXJjaF9vcGVuKCk7Cit9CisKK1VNUF9BUElfRVhQT1JUIHZvaWQgdW1wX2Nsb3NlKHZvaWQpCit7CisJdW1wX2FyY2hfY2xvc2UoKTsKK30KKworVU1QX0FQSV9FWFBPUlQgdW1wX3NlY3VyZV9pZCB1bXBfc2VjdXJlX2lkX2dldCh1bXBfaGFuZGxlIG1lbWgpCit7CisJdW1wX21lbSAqIG1lbSA9ICh1bXBfbWVtKiltZW1oOworCisJVU1QX0RFQlVHX0FTU0VSVChVTVBfSU5WQUxJRF9NRU1PUllfSEFORExFICE9IG1lbWgsICgiSGFuZGxlIGlzIGludmFsaWQiKSk7CisJVU1QX0RFQlVHX0FTU0VSVChVTVBfSU5WQUxJRF9TRUNVUkVfSUQgIT0gbWVtLT5zZWN1cmVfaWQsICgiU2VjdXJlIElEIGlzIGluYXZsaWQiKSk7CisJVU1QX0RFQlVHX0FTU0VSVCgwIDwgbWVtLT5yZWZfY291bnQsICgiUmVmZXJlbmNlIGNvdW50IHRvbyBsb3ciKSk7CisJVU1QX0RFQlVHX0FTU0VSVCgwIDwgbWVtLT5zaXplLCAoIk1lbW9yeSBzaXplIG9mIHBhc3NlZCBoYW5kbGUgdG9vIGxvdyIpKTsKKworCXJldHVybiBtZW0tPnNlY3VyZV9pZDsKK30KKworVU1QX0FQSV9FWFBPUlQgdW1wX2hhbmRsZSB1bXBfaGFuZGxlX2NyZWF0ZV9mcm9tX3NlY3VyZV9pZCh1bXBfc2VjdXJlX2lkIHNlY3VyZV9pZCkKK3sKKwl1bnNpZ25lZCBsb25nIHNpemU7CisKKwlVTVBfREVCVUdfQVNTRVJUKFVNUF9JTlZBTElEX1NFQ1VSRV9JRCAhPSBzZWN1cmVfaWQsICgiU2VjdXJlIElEIGlzIGludmFsaWQiKSk7CisKKwlzaXplID0gdW1wX2FyY2hfc2l6ZV9nZXQoc2VjdXJlX2lkKTsKKwlpZiAoMCAhPSBzaXplKQorCXsKKwkJdW5zaWduZWQgbG9uZyBjb29raWU7CisJCS8qCisJCSAqIFRoZSBVTVAgbWVtb3J5IHdoaWNoIHRoZSBzZWN1cmVfaWQgcmVmZXJlcyB0byBjb3VsZCBub3cgYmUgZGVsZXRlZCBhbmQgcmUtY3JlYXRlZAorCQkgKiBzaW5jZSB3ZSBkb24ndCBoYXZlIGFueSByZWZlcmVuY2VzIHRvIGl0IHlldC4gVGhlIG1hcHBpbmcgYmVsb3cgd2lsbCBob3dldmVyIGZhaWwgaWYKKwkJICogd2UgaGF2ZSBzdXBwbGllZCBpbmNvcnJlY3Qgc2l6ZSwgc28gd2UgYXJlIHNhZmUuCisJCSAqLworCQl2b2lkICogbWFwcGluZyA9IHVtcF9hcmNoX21hcChzZWN1cmVfaWQsIHNpemUsIFVNUF9DQUNIRV9ESVNBQkxFLCAmY29va2llKTsKKwkJaWYgKE5VTEwgIT0gbWFwcGluZykKKwkJeworCQkJdW1wX21lbSAqIG1lbSA9IF91bXBfb3N1X2NhbGxvYygxLCBzaXplb2YoKm1lbSkpOworCQkJaWYgKE5VTEwgIT0gbWVtKQorCQkJeworCQkJCW1lbS0+c2VjdXJlX2lkID0gc2VjdXJlX2lkOworCQkJCW1lbS0+bWFwcGVkX21lbSA9IG1hcHBpbmc7CisJCQkJbWVtLT5zaXplID0gc2l6ZTsKKwkJCQltZW0tPmNvb2tpZSA9IGNvb2tpZTsKKwkJCQltZW0tPmlzX2NhY2hlZCA9IDE7IC8qIElzIHNldCB0byBhY3R1YWxseSBjaGVjayBpbiB0aGUgdW1wX2NwdV9tc3luY19ub3coKSBmdW5jdGlvbiAqLworCisJCQkJX3VtcF9vc3VfbG9ja19hdXRvX2luaXQoJm1lbS0+cmVmX2xvY2ssIDAsIDAsIDApOworCQkJCVVNUF9ERUJVR19BU1NFUlQoTlVMTCAhPSBtZW0tPnJlZl9sb2NrLCAoIkZhaWxlZCB0byBpbml0aWFsaXplIGxvY2tcbiIpKTsKKwkJCQltZW0tPnJlZl9jb3VudCA9IDE7CisKKwkJCQkvKiBUaGlzIGlzIGNhbGxlZCBvbmx5IHRvIHNldCB0aGUgY2FjaGUgc2V0dGluZ3MgaW4gdGhpcyBoYW5kbGUgKi8KKwkJCQl1bXBfY3B1X21zeW5jX25vdygodW1wX2hhbmRsZSltZW0sIFVNUF9NU1lOQ19SRUFET1VUX0NBQ0hFX0VOQUJMRUQsIE5VTEwsIDApOworCisJCQkJVU1QX0RFQlVHX1BSSU5UKDQsICgiVU1QIGhhbmRsZSBjcmVhdGVkIGZvciBJRCAldSBvZiBzaXplICVsdSwgbWFwcGVkIGludG8gYWRkcmVzcyAweCUwOGx4IiwgbWVtLT5zZWN1cmVfaWQsIG1lbS0+c2l6ZSwgKHVuc2lnbmVkIGxvbmcpbWVtLT5tYXBwZWRfbWVtKSk7CisKKwkJCQlyZXR1cm4gKHVtcF9oYW5kbGUpbWVtOworCQkJfQorCisJCQl1bXBfYXJjaF91bm1hcChtYXBwaW5nLCBzaXplLCBjb29raWUpOworCQl9CisJfQorCisJVU1QX0RFQlVHX1BSSU5UKDIsICgiVU1QIGhhbmRsZSBjcmVhdGlvbiBmYWlsZWQgZm9yIElEICV1Iiwgc2VjdXJlX2lkKSk7CisKKwlyZXR1cm4gVU1QX0lOVkFMSURfTUVNT1JZX0hBTkRMRTsKK30KKworVU1QX0FQSV9FWFBPUlQgdW5zaWduZWQgbG9uZyB1bXBfc2l6ZV9nZXQodW1wX2hhbmRsZSBtZW1oKQoreworCXVtcF9tZW0gKiBtZW0gPSAodW1wX21lbSopbWVtaDsKKworCVVNUF9ERUJVR19BU1NFUlQoVU1QX0lOVkFMSURfTUVNT1JZX0hBTkRMRSAhPSBtZW1oLCAoIkhhbmRsZSBpcyBpbnZhbGlkIikpOworCVVNUF9ERUJVR19BU1NFUlQoVU1QX0lOVkFMSURfU0VDVVJFX0lEICE9IG1lbS0+c2VjdXJlX2lkLCAoIlNlY3VyZSBJRCBpcyBpbmF2bGlkIikpOworCVVNUF9ERUJVR19BU1NFUlQoMCA8IG1lbS0+cmVmX2NvdW50LCAoIlJlZmVyZW5jZSBjb3VudCB0b28gbG93IikpOworCVVNUF9ERUJVR19BU1NFUlQoMCA8IG1lbS0+c2l6ZSwgKCJNZW1vcnkgc2l6ZSBvZiBwYXNzZWQgaGFuZGxlIHRvbyBsb3ciKSk7CisKKwlyZXR1cm4gbWVtLT5zaXplOworfQorCitVTVBfQVBJX0VYUE9SVCB2b2lkIHVtcF9yZWFkKHZvaWQgKmRzdCwgdW1wX2hhbmRsZSBzcmNoLCB1bnNpZ25lZCBsb25nIG9mZnNldCwgdW5zaWduZWQgbG9uZyBsZW5ndGgpCit7CisJdW1wX21lbSAqIHNyYyA9ICh1bXBfbWVtKilzcmNoOworCisJVU1QX0RFQlVHX0FTU0VSVChVTVBfSU5WQUxJRF9NRU1PUllfSEFORExFICE9IHNyY2gsICgiSGFuZGxlIGlzIGludmFsaWQiKSk7CisJVU1QX0RFQlVHX0FTU0VSVChVTVBfSU5WQUxJRF9TRUNVUkVfSUQgIT0gc3JjLT5zZWN1cmVfaWQsICgiU2VjdXJlIElEIGlzIGluYXZsaWQiKSk7CisJVU1QX0RFQlVHX0FTU0VSVCgwIDwgc3JjLT5yZWZfY291bnQsICgiUmVmZXJlbmNlIGNvdW50IHRvbyBsb3ciKSk7CisJVU1QX0RFQlVHX0FTU0VSVCgwIDwgc3JjLT5zaXplLCAoIk1lbW9yeSBzaXplIG9mIHBhc3NlZCBoYW5kbGUgdG9vIGxvdyIpKTsKKwlVTVBfREVCVUdfQVNTRVJUKE5VTEwgIT0gc3JjLT5tYXBwZWRfbWVtLCAoIlVNUCBNZW1vcnkgaXMgbm90IG1hcHBlZCIpKTsKKwlVTVBfREVCVUdfQVNTRVJUKChzcmMtPnNpemUpID49IChvZmZzZXQgKyBsZW5ndGgpLCAoIlJlcXVlc3RlZCByZWFkIGJleW9uZCBlbmQgb2YgVU1QIG1lbW9yeSIpKTsKKworCV91bXBfb3N1X21lbWNweShkc3QsKGNoYXIqKShzcmMtPm1hcHBlZF9tZW0pICsgb2Zmc2V0LCBsZW5ndGgpOworfQorCitVTVBfQVBJX0VYUE9SVCB2b2lkIHVtcF93cml0ZSh1bXBfaGFuZGxlIGRzdGgsIHVuc2lnbmVkIGxvbmcgb2Zmc2V0LCBjb25zdCB2b2lkICpzcmMsIHVuc2lnbmVkIGxvbmcgbGVuZ3RoKQoreworCXVtcF9tZW0gKiBkc3QgPSAodW1wX21lbSopZHN0aDsKKworCVVNUF9ERUJVR19BU1NFUlQoVU1QX0lOVkFMSURfTUVNT1JZX0hBTkRMRSAhPSBkc3RoLCAoIkhhbmRsZSBpcyBpbnZhbGlkIikpOworCVVNUF9ERUJVR19BU1NFUlQoVU1QX0lOVkFMSURfU0VDVVJFX0lEICE9IGRzdC0+c2VjdXJlX2lkLCAoIlNlY3VyZSBJRCBpcyBpbmF2bGlkIikpOworCVVNUF9ERUJVR19BU1NFUlQoMCA8IGRzdC0+cmVmX2NvdW50LCAoIlJlZmVyZW5jZSBjb3VudCB0b28gbG93IikpOworCVVNUF9ERUJVR19BU1NFUlQoMCA8IGRzdC0+c2l6ZSwgKCJNZW1vcnkgc2l6ZSBvZiBwYXNzZWQgaGFuZGxlIHRvbyBsb3ciKSk7CisJVU1QX0RFQlVHX0FTU0VSVChOVUxMICE9IGRzdC0+bWFwcGVkX21lbSwgKCJVTVAgTWVtb3J5IGlzIG5vdCBtYXBwZWQiKSk7CisJVU1QX0RFQlVHX0FTU0VSVCgoZHN0LT5zaXplKSA+PSAob2Zmc2V0ICsgbGVuZ3RoKSwgKCJSZXF1ZXN0ZWQgd3JpdGUgYmV5b25kIGVuZCBvZiBVTVAgbWVtb3J5IikpOworCisJX3VtcF9vc3VfbWVtY3B5KChjaGFyKikoZHN0LT5tYXBwZWRfbWVtKSArIG9mZnNldCwgc3JjLCBsZW5ndGgpOworfQorCisKKworVU1QX0FQSV9FWFBPUlQgdm9pZCogdW1wX21hcHBlZF9wb2ludGVyX2dldCh1bXBfaGFuZGxlIG1lbWgpCit7CisJdW1wX21lbSAqIG1lbSA9ICh1bXBfbWVtKiltZW1oOworCisJVU1QX0RFQlVHX0FTU0VSVChVTVBfSU5WQUxJRF9NRU1PUllfSEFORExFICE9IG1lbWgsICgiSGFuZGxlIGlzIGludmFsaWQiKSk7CisJVU1QX0RFQlVHX0FTU0VSVChVTVBfSU5WQUxJRF9TRUNVUkVfSUQgIT0gbWVtLT5zZWN1cmVfaWQsICgiU2VjdXJlIElEIGlzIGluYXZsaWQiKSk7CisJVU1QX0RFQlVHX0FTU0VSVCgwIDwgbWVtLT5yZWZfY291bnQsICgiUmVmZXJlbmNlIGNvdW50IHRvbyBsb3ciKSk7CisJVU1QX0RFQlVHX0FTU0VSVCgwIDwgbWVtLT5zaXplLCAoIk1lbW9yeSBzaXplIG9mIHBhc3NlZCBoYW5kbGUgdG9vIGxvdyIpKTsKKwlVTVBfREVCVUdfQVNTRVJUKE5VTEwgIT0gbWVtLT5tYXBwZWRfbWVtLCAoIkVycm9yIGluIG1hcHBpbmcgcG9pbnRlciAobm90IG1hcHBlZCkiKSk7CisKKwlyZXR1cm4gbWVtLT5tYXBwZWRfbWVtOworfQorCisKKworVU1QX0FQSV9FWFBPUlQgdm9pZCB1bXBfbWFwcGVkX3BvaW50ZXJfcmVsZWFzZSh1bXBfaGFuZGxlIG1lbWgpCit7CisJVU1QX0RFQlVHX0FTU0VSVChVTVBfSU5WQUxJRF9NRU1PUllfSEFORExFICE9IG1lbWgsICgiSGFuZGxlIGlzIGludmFsaWQiKSk7CisJVU1QX0RFQlVHX0FTU0VSVChVTVBfSU5WQUxJRF9TRUNVUkVfSUQgIT0gKCh1bXBfbWVtKiltZW1oKS0+c2VjdXJlX2lkLCAoIlNlY3VyZSBJRCBpcyBpbmF2bGlkIikpOworCVVNUF9ERUJVR19BU1NFUlQoMCA8ICgodW1wX21lbSopbWVtaCktPnJlZl9jb3VudCwgKCJSZWZlcmVuY2UgY291bnQgdG9vIGxvdyIpKTsKKwlVTVBfREVCVUdfQVNTRVJUKDAgPCAoKHVtcF9tZW0qKW1lbWgpLT5zaXplLCAoIk1lbW9yeSBzaXplIG9mIHBhc3NlZCBoYW5kbGUgdG9vIGxvdyIpKTsKKwlVTVBfREVCVUdfQVNTRVJUKE5VTEwgIT0gKCh1bXBfbWVtKiltZW1oKS0+bWFwcGVkX21lbSwgKCJFcnJvciBpbiBtYXBwaW5nIHBvaW50ZXIgKG5vdCBtYXBwZWQpIikpOworCisJLyogbm9vcCwgY29zIHdlIG1hcCBpbiB0aGUgcG9pbnRlciB3aGVuIGhhbmRsZSBpcyBjcmVhdGVkLCBhbmQgdW5tYXAgaXQgd2hlbiBoYW5kbGUgaXMgZGVzdHJveWVkICovCit9CisKKworCitVTVBfQVBJX0VYUE9SVCB2b2lkIHVtcF9yZWZlcmVuY2VfYWRkKHVtcF9oYW5kbGUgbWVtaCkKK3sKKwl1bXBfbWVtICogbWVtID0gKHVtcF9tZW0qKW1lbWg7CisKKwlVTVBfREVCVUdfQVNTRVJUKFVNUF9JTlZBTElEX01FTU9SWV9IQU5ETEUgIT0gbWVtaCwgKCJIYW5kbGUgaXMgaW52YWxpZCIpKTsKKwlVTVBfREVCVUdfQVNTRVJUKFVNUF9JTlZBTElEX1NFQ1VSRV9JRCAhPSBtZW0tPnNlY3VyZV9pZCwgKCJTZWN1cmUgSUQgaXMgaW5hdmxpZCIpKTsKKwlVTVBfREVCVUdfQVNTRVJUKDAgPCBtZW0tPnJlZl9jb3VudCwgKCJSZWZlcmVuY2UgY291bnQgdG9vIGxvdyIpKTsKKwlVTVBfREVCVUdfQVNTRVJUKDAgPCBtZW0tPnNpemUsICgiTWVtb3J5IHNpemUgb2YgcGFzc2VkIGhhbmRsZSB0b28gbG93IikpOworCisJX3VtcF9vc3VfbG9ja193YWl0KG1lbS0+cmVmX2xvY2ssIF9VTVBfT1NVX0xPQ0tNT0RFX1JXKTsKKwltZW0tPnJlZl9jb3VudCArPSAxOworCV91bXBfb3N1X2xvY2tfc2lnbmFsKG1lbS0+cmVmX2xvY2ssIF9VTVBfT1NVX0xPQ0tNT0RFX1JXKTsKK30KKworCisKK1VNUF9BUElfRVhQT1JUIHZvaWQgdW1wX3JlZmVyZW5jZV9yZWxlYXNlKHVtcF9oYW5kbGUgbWVtaCkKK3sKKwl1bXBfbWVtICogbWVtID0gKHVtcF9tZW0qKW1lbWg7CisKKwlVTVBfREVCVUdfQVNTRVJUKFVNUF9JTlZBTElEX01FTU9SWV9IQU5ETEUgIT0gbWVtaCwgKCJIYW5kbGUgaXMgaW52YWxpZCIpKTsKKwlVTVBfREVCVUdfQVNTRVJUKFVNUF9JTlZBTElEX1NFQ1VSRV9JRCAhPSAoKHVtcF9tZW0qKW1lbSktPnNlY3VyZV9pZCwgKCJTZWN1cmUgSUQgaXMgaW5hdmxpZCIpKTsKKwlVTVBfREVCVUdfQVNTRVJUKDAgPCAoKCh1bXBfbWVtKiltZW0pLT5yZWZfY291bnQpLCAoIlJlZmVyZW5jZSBjb3VudCB0b28gbG93IikpOworCVVNUF9ERUJVR19BU1NFUlQoMCA8ICgodW1wX21lbSopbWVtKS0+c2l6ZSwgKCJNZW1vcnkgc2l6ZSBvZiBwYXNzZWQgaGFuZGxlIHRvbyBsb3ciKSk7CisJVU1QX0RFQlVHX0FTU0VSVChOVUxMICE9ICgodW1wX21lbSopbWVtKS0+bWFwcGVkX21lbSwgKCJFcnJvciBpbiBtYXBwaW5nIHBvaW50ZXIgKG5vdCBtYXBwZWQpIikpOworCisJX3VtcF9vc3VfbG9ja193YWl0KG1lbS0+cmVmX2xvY2ssIF9VTVBfT1NVX0xPQ0tNT0RFX1JXKTsKKwltZW0tPnJlZl9jb3VudCAtPSAxOworCWlmICgwID09IG1lbS0+cmVmX2NvdW50KQorCXsKKwkJLyogUmVtb3ZlIG1lbW9yeSBtYXBwaW5nLCB3aGljaCBob2xkcyBvdXIgb25seSByZWZlcmVuY2UgdG93YXJkcyB0aGUgVU1QIGtlcm5lbCBzcGFjZSBkcml2ZXIgKi8KKwkJdW1wX2FyY2hfdW5tYXAobWVtLT5tYXBwZWRfbWVtLCBtZW0tPnNpemUsIG1lbS0+Y29va2llKTsKKworCQlfdW1wX29zdV9sb2NrX3NpZ25hbChtZW0tPnJlZl9sb2NrLCBfVU1QX09TVV9MT0NLTU9ERV9SVyk7CisKKwkJLyogRnJlZSB0aGUgbG9jayBwcm90ZWN0aW5nIHRoZSByZWZlcmVuY2UgY291bnQgKi8KKwkJX3VtcF9vc3VfbG9ja190ZXJtKG1lbS0+cmVmX2xvY2spOworCisJCS8qIEZyZWUgdGhlIG1lbW9yeSBmb3IgdGhpcyBoYW5kbGUgKi8KKwkJX3VtcF9vc3VfZnJlZShtZW0pOworCX0gZWxzZSB7CisJCV91bXBfb3N1X2xvY2tfc2lnbmFsKG1lbS0+cmVmX2xvY2ssIF9VTVBfT1NVX0xPQ0tNT0RFX1JXKTsKKwl9Cit9CmRpZmYgLS1naXQgYS9leHlub3M0L2hhbC9saWJ1bXAvYXJjaF8wMTFfdWRkL3VtcF9pbnRlcm5hbC5oIGIvZXh5bm9zNC9oYWwvbGlidW1wL2FyY2hfMDExX3VkZC91bXBfaW50ZXJuYWwuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iYzFmMmE5Ci0tLSAvZGV2L251bGwKKysrIGIvZXh5bm9zNC9oYWwvbGlidW1wL2FyY2hfMDExX3VkZC91bXBfaW50ZXJuYWwuaApAQCAtMCwwICsxLDYyIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDEwLTIwMTEgQVJNIExpbWl0ZWQuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKiAKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKiAKKyAqICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICogCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisvKioKKyAqIEBmaWxlIHVtcF9pbnRlcm5hbC5jCisgKgorICogSW50ZXJuYWwgZGVmaW5pdGlvbnMgYW5kIGRlYnVnZ2luZyBtYWNyb3MgZm9yIHRoZSBVTVAgaW1wbGVtZW50YXRpb24uCisgKi8KKworI2lmbmRlZiBfVU5JRklFRF9NRU1PUllfUFJPVklERVJfSU5URVJOQUxfSF8KKyNkZWZpbmUgX1VOSUZJRURfTUVNT1JZX1BST1ZJREVSX0lOVEVSTkFMX0hfCisKKyNpbmNsdWRlIDx1bXAvdW1wLmg+CisjaW5jbHVkZSA8dW1wL3VtcF9vc3UuaD4KKworI2lmZGVmIF9fY3BsdXNwbHVzCitleHRlcm4gIkMiIHsKKyNlbmRpZgorCit0eXBlZGVmIGVudW0gdW1wX2NhY2hlX2VuYWJsZWQKK3sKKwlVTVBfQ0FDSEVfRElTQUJMRSA9IDAsCisJVU1QX0NBQ0hFX0VOQUJMRSAgPSAxCit9IHVtcF9jYWNoZV9lbmFibGVkOworCisvKioKKyAqIFRoZSBhY3R1YWwgKGhpZGRlbikgZGVmaW5pdGlvbiBvZiB1bXBfaGFuZGxlcy4KKyAqLwordHlwZWRlZiBzdHJ1Y3QgdW1wX21lbQoreworCXVtcF9zZWN1cmVfaWQgc2VjdXJlX2lkOyAgICAgICAvKio8IFVNUCBkZXZpY2UgZHJpdmVyIGNvb2tpZSAqLworCXZvaWQgKiBtYXBwZWRfbWVtOyAgICAgICAgICAgICAvKio8IE1hcHBlZCBtZW1vcnk7IGFsbCByZWFkIGFuZCB3cml0ZSB1c2UgdGhpcyAqLworCXVuc2lnbmVkIGxvbmcgc2l6ZTsgICAgICAgICAgICAvKio8IFNpemUgb2YgYWxsb2NhdGVkIG1lbW9yeSAqLworCV91bXBfb3N1X2xvY2tfdCogcmVmX2xvY2s7ICAgIC8qKjwgTG9jayBwcm90ZWN0aW9uIHJlZl9jb3VudCAqLworCWludCByZWZfY291bnQ7ICAgICAgICAgICAgICAgICAvKio8IFRoZSByZWZlcmVuY2UgY291bnQgb2YgdGhlIHVtcF9oYW5kbGUgaW4gdXNlcnNwYWNlLiBJdCBpcyB1c2VkIGZvciBmaW5kaW5nIG91dAorCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdoZW4gdG8gZnJlZSB0aGUgbWVtb3J5IHVzZWQgYnkgdGhpcyB1c2Vyc3BhY2UgaGFuZGxlLiBJdCBpcyBOT1QgdGhlIHNhbWUgYXMgdGhlCisJICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVhbCB1bXBfbWVtIHJlZmVyZW5jZSBjb3VudCBpbiB0aGUgZGV2aWNlZHJpdmVyIHdoaWNoIGRvIHJlZmVyZW5jZSBjb3VudGluZworCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvciB0aGUgbWVtb3J5IHRoYXQgdGhpcyBoYW5kbGUgcmV2ZWFscy4gKi8KKwl1bnNpZ25lZCBsb25nIGNvb2tpZTsgICAgICAgICAgLyoqPCBjb29raWUgZm9yIHVzZSBpbiBhcmNoX3VubWFwIGNhbGxzICovCisJdW1wX2NhY2hlX2VuYWJsZWQgaXNfY2FjaGVkOworfSB1bXBfbWVtOworCisjaWZkZWYgX19jcGx1c3BsdXMKK30KKyNlbmRpZgorCisKKworI2VuZGlmIC8qIF9VTklGSUVEX01FTU9SWV9QUk9WSURFUl9JTlRFUk5BTF9IXyAqLwpkaWZmIC0tZ2l0IGEvZXh5bm9zNC9oYWwvbGlidW1wL2FyY2hfMDExX3VkZC91bXBfcmVmX2Rydi5jIGIvZXh5bm9zNC9oYWwvbGlidW1wL2FyY2hfMDExX3VkZC91bXBfcmVmX2Rydi5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmNmM2I5ZWIKLS0tIC9kZXYvbnVsbAorKysgYi9leHlub3M0L2hhbC9saWJ1bXAvYXJjaF8wMTFfdWRkL3VtcF9yZWZfZHJ2LmMKQEAgLTAsMCArMSwxMjQgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTAtMjAxMSBBUk0gTGltaXRlZC4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqIAorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqIAorICogICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKiAKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKy8qKgorICogQGZpbGUgdW1wX3JlZl9kcnYuYworICoKKyAqIEltcGxlbWVudGF0aW9uIG9mIHRoZSB1c2VyIHNwYWNlIEFQSSBleHRlbnNpb25zIHByb3ZpZGVkIGJ5IHRoZSByZWZlcmVuY2UgaW1wbGVtZW50YXRpb24uCisgKi8KKworI2luY2x1ZGUgPHVtcC91bXBfcmVmX2Rydi5oPgorI2luY2x1ZGUgPHVtcC91bXAuaD4KKyNpbmNsdWRlICJ1bXBfaW50ZXJuYWwuaCIKKyNpbmNsdWRlICJ1bXBfYXJjaC5oIgorI2luY2x1ZGUgPHVtcC91bXBfZGVidWcuaD4KKyNpbmNsdWRlIDx1bXAvdW1wX29zdS5oPgorCisvKiBBbGxvY2F0ZSBhIGJ1ZmZlciB3aGljaCBjYW4gYmUgdXNlZCBkaXJlY3RseSBieSBoYXJkd2FyZSwgNGtiIGFsaWduZWQgKi8KK3N0YXRpYyB1bXBfaGFuZGxlIHVtcF9yZWZfZHJ2X2FsbG9jYXRlX2ludGVybmFsKHVuc2lnbmVkIGxvbmcgc2l6ZSwgdW1wX2FsbG9jX2NvbnN0cmFpbnRzIGNvbnN0cmFpbnRzLCB1bXBfY2FjaGVfZW5hYmxlZCBjYWNoZSk7CisKKworCisvKiBBbGxvY2F0ZSBhIGJ1ZmZlciB3aGljaCBjYW4gYmUgdXNlZCBkaXJlY3RseSBieSBoYXJkd2FyZSwgNGtiIGFsaWduZWQgKi8KK3VtcF9oYW5kbGUgdW1wX3JlZl9kcnZfYWxsb2NhdGUodW5zaWduZWQgbG9uZyBzaXplLCB1bXBfYWxsb2NfY29uc3RyYWludHMgY29uc3RyYWludHMpCit7CisJdW1wX2NhY2hlX2VuYWJsZWQgY2FjaGU9IFVNUF9DQUNIRV9ESVNBQkxFOworCWlmICggMCE9KGNvbnN0cmFpbnRzJlVNUF9SRUZfRFJWX0NPTlNUUkFJTlRfVVNFX0NBQ0hFKSApCisJeworCQljYWNoZSA9IFVNUF9DQUNIRV9FTkFCTEU7CisJfQorCXJldHVybiB1bXBfcmVmX2Rydl9hbGxvY2F0ZV9pbnRlcm5hbChzaXplLCBjb25zdHJhaW50cywgY2FjaGUpOworfQorCitVTVBfQVBJX0VYUE9SVCBpbnQgdW1wX2NwdV9tc3luY19ub3codW1wX2hhbmRsZSBtZW1oLCB1bXBfY3B1X21zeW5jX29wIG9wLCB2b2lkKiBhZGRyZXNzLCBpbnQgc2l6ZSkKK3sKKwl1bXBfbWVtICogbWVtID0gKHVtcF9tZW0qKW1lbWg7CisJVU1QX0RFQlVHX0FTU0VSVChVTVBfSU5WQUxJRF9NRU1PUllfSEFORExFICE9IG1lbWgsICgiSGFuZGxlIGlzIGludmFsaWQiKSk7CisKKwkvKiBJZiB0aGUgb3AgaXMgcmVhZG91dCwgd2UgZG8gdGhlIHJlYWRvdXQgZnJvbSBERC4KKwkgICBFbHNlIHdlIHNraXAgZmx1c2hpbmcgaWYgdGhlIHVzZXJzcGFjZSBoYW5kbGUgc2F5cyB0aGF0IGl0IGlzIHVuY2FjaGVkICovCisJaWYgKChVTVBfTVNZTkNfUkVBRE9VVF9DQUNIRV9FTkFCTEVEIT1vcCkgJiYgKDAgPT0gbWVtLT5pc19jYWNoZWQpICkgcmV0dXJuIDA7CisKKwlVTVBfREVCVUdfQVNTRVJUKDAgPCAoKCh1bXBfbWVtKiltZW0pLT5yZWZfY291bnQpLCAoIlJlZmVyZW5jZSBjb3VudCB0b28gbG93IikpOworCVVNUF9ERUJVR19BU1NFUlQoKHNpemU+PTApICYmIChzaXplIDw9ICgodW1wX21lbSopbWVtKS0+c2l6ZSksICgiTWVtb3J5IHNpemUgb2YgcGFzc2VkIGhhbmRsZSB0b28gbG93IikpOworCVVNUF9ERUJVR19BU1NFUlQoTlVMTCAhPSAoKHVtcF9tZW0qKW1lbSktPm1hcHBlZF9tZW0sICgiRXJyb3IgaW4gbWFwcGluZyBwb2ludGVyIChub3QgbWFwcGVkKSIpKTsKKworCWlmIChzaXplID4gbWVtLT5zaXplKSBzaXplID0gbWVtLT5zaXplOworCisJbWVtLT5pc19jYWNoZWQgPSB1bXBfYXJjaF9tc3luYyhtZW0tPnNlY3VyZV9pZCwgbWVtLT5tYXBwZWRfbWVtLCBtZW0tPmNvb2tpZSwgYWRkcmVzcywgc2l6ZSwgb3ApOworCXJldHVybiBtZW0tPmlzX2NhY2hlZCA7Cit9CisKKy8qIEFsbG9jYXRlIGEgYnVmZmVyIHdoaWNoIGNhbiBiZSB1c2VkIGRpcmVjdGx5IGJ5IGhhcmR3YXJlLCA0a2IgYWxpZ25lZCAqLworc3RhdGljIHVtcF9oYW5kbGUgdW1wX3JlZl9kcnZfYWxsb2NhdGVfaW50ZXJuYWwodW5zaWduZWQgbG9uZyBzaXplLCB1bXBfYWxsb2NfY29uc3RyYWludHMgY29uc3RyYWludHMsIHVtcF9jYWNoZV9lbmFibGVkIGNhY2hlKQoreworCXVtcF9zZWN1cmVfaWQgc2VjdXJlX2lkOworCXVuc2lnbmVkIGxvbmcgYWxsb2NhdGVkX3NpemUgPSBzaXplOworCisJVU1QX0RFQlVHX1BSSU5UKDQsICgiQWxsb2NhdGluZyBVTVAgbWVtb3J5IG9mIHNpemUgJWx1Iiwgc2l6ZSkpOworCisJc2VjdXJlX2lkID0gdW1wX2FyY2hfYWxsb2NhdGUoJmFsbG9jYXRlZF9zaXplLCBjb25zdHJhaW50cyk7CisJaWYgKHNlY3VyZV9pZCAhPSBVTVBfSU5WQUxJRF9TRUNVUkVfSUQpCisJeworCQl1bnNpZ25lZCBsb25nIGNvb2tpZTsKKwkJdm9pZCAqIG1hcHBpbmc7CisKKwkJbWFwcGluZyA9IHVtcF9hcmNoX21hcChzZWN1cmVfaWQsIGFsbG9jYXRlZF9zaXplLCBjYWNoZSwgJmNvb2tpZSk7CisJCWlmIChOVUxMICE9IG1hcHBpbmcpCisJCXsKKwkJCS8qCisJCQkgKiBQUzogQnkgbm93IHdlIGhhdmUgYWN0dWFsbHkgaW5jcmVhc2VkIHRoZSByZWYgY291bnQgaW4gdGhlIGRldmljZSBkcml2ZXIgYnkgMiwKKwkJCSAqIG9uZSBmb3IgdGhlIGFsbG9jYXRpb24gaXRlc2VsZiwgYW5kIG9uZSBmb3IgdGhlIG1hcHBpbmcuCisJCQkgKi8KKwkJCXVtcF9tZW0gKiBtZW07CisJCQltZW0gPSBfdW1wX29zdV9jYWxsb2MoMSwgc2l6ZW9mKCptZW0pKTsKKwkJCWlmIChOVUxMICE9IG1lbSkKKwkJCXsKKwkJCQltZW0tPnNlY3VyZV9pZCA9IHNlY3VyZV9pZDsKKwkJCQltZW0tPm1hcHBlZF9tZW0gPSBtYXBwaW5nOworCQkJCW1lbS0+c2l6ZSA9IGFsbG9jYXRlZF9zaXplOworCQkJCW1lbS0+Y29va2llID0gY29va2llOworCQkJCW1lbS0+aXNfY2FjaGVkID0gMTsgLyrCoERlZmF1bHQgdG8gT04sIGlzIGRpc2FibGVkIGxhdGVyIGlmIG5vdCAqLworCisJCQkJX3VtcF9vc3VfbG9ja19hdXRvX2luaXQoJm1lbS0+cmVmX2xvY2ssIDAsIDAsIDApOworCQkJCVVNUF9ERUJVR19BU1NFUlQoTlVMTCAhPSBtZW0tPnJlZl9sb2NrLCAoIkZhaWxlZCB0byBpbml0aWFsaXplIGxvY2tcbiIpKTsKKwkJCQltZW0tPnJlZl9jb3VudCA9IDE7CisKKwkJCQkvKgorCQkJCSAqIHVtcF9hcmNoX2FsbG9jYXRlKCkgZ2F2ZSB1cyBhIGtlcm5lbCBzcGFjZSByZWZlcmVuY2UsIGFuZCB0aGUgc2FtZSBkaWQgdW1wX2FyY2hfbWFwKCkKKwkJCQkgKiBXZSByZWxlYXNlIHRoZSBvbmUgZnJvbSB1bXBfYXJjaF9hbGxvY2F0ZSgpLCBhbmQgcmVseSBzb2xlbHkgb24gdGhlIG9uZSBmcm9tIHRoZSB1bXBfYXJjaF9tYXAoKQorCQkJCSAqIFRoYXQgaXMsIHVtcF9hcmNoX3VubWFwKCkgc2hvdWxkIG5vdyBkbyB0aGUgZmluYWwgcmVsZWFzZSB0b3dhcmRzIHRoZSBVTVAga2VybmVsIHNwYWNlIGRyaXZlci4KKwkJCQkgKi8KKwkJCQl1bXBfYXJjaF9yZWZlcmVuY2VfcmVsZWFzZShzZWN1cmVfaWQpOworCisJCQkJLyogVGhpcyBpcyBjYWxsZWQgb25seSB0byBzZXQgdGhlIGNhY2hlIHNldHRpbmdzIGluIHRoaXMgaGFuZGxlICovCisJCQkJdW1wX2NwdV9tc3luY19ub3coKHVtcF9oYW5kbGUpbWVtLCBVTVBfTVNZTkNfUkVBRE9VVF9DQUNIRV9FTkFCTEVELCBOVUxMLCAwKTsKKworCQkJCVVNUF9ERUJVR19QUklOVCg0LCAoIlVNUCBoYW5kbGUgY3JlYXRlZCBmb3IgSUQgJXUgb2Ygc2l6ZSAlbHUsIG1hcHBlZCBpbnRvIGFkZHJlc3MgMHglMDhseCIsIG1lbS0+c2VjdXJlX2lkLCBtZW0tPnNpemUsICh1bnNpZ25lZCBsb25nKW1lbS0+bWFwcGVkX21lbSkpOworCisJCQkJcmV0dXJuICh1bXBfaGFuZGxlKW1lbTsKKwkJCX0KKworCQkJdW1wX2FyY2hfdW5tYXAobWFwcGluZywgYWxsb2NhdGVkX3NpemUsIGNvb2tpZSk7IC8qIFVubWFwIHRoZSBtZW1vcnkgKi8KKwkJCXVtcF9hcmNoX3JlZmVyZW5jZV9yZWxlYXNlKHNlY3VyZV9pZCk7IC8qIFJlbGVhc2UgcmVmZXJlbmNlIGFkZGVkIHdoZW4gd2UgYWxsb2NhdGVkIHRoZSBVTVAgbWVtb3J5ICovCisJCX0KKworCQl1bXBfYXJjaF9yZWZlcmVuY2VfcmVsZWFzZShzZWN1cmVfaWQpOyAvKiBSZWxlYXNlIHJlZmVyZW5jZSBhZGRlZCB3aGVuIHdlIGFsbG9jYXRlZCB0aGUgVU1QIG1lbW9yeSAqLworCX0KKworCVVNUF9ERUJVR19QUklOVCg0LCAoIkFsbG9jYXRpb24gb2YgVU1QIG1lbW9yeSBmYWlsZWQiKSk7CisJcmV0dXJuIFVNUF9JTlZBTElEX01FTU9SWV9IQU5ETEU7Cit9CmRpZmYgLS1naXQgYS9leHlub3M0L2hhbC9saWJ1bXAvaW5jbHVkZS91bXAvdW1wLmggYi9leHlub3M0L2hhbC9saWJ1bXAvaW5jbHVkZS91bXAvdW1wLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjgyOTExMwotLS0gL2Rldi9udWxsCisrKyBiL2V4eW5vczQvaGFsL2xpYnVtcC9pbmNsdWRlL3VtcC91bXAuaApAQCAtMCwwICsxLDI2OCBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxMC0yMDExIEFSTSBMaW1pdGVkLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICogCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICogCisgKiAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqIAorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworLyoqCisgKiBAZmlsZSB1bXAuaAorICoKKyAqIFRoaXMgZmlsZSBjb250YWlucyB0aGUgdXNlciBzcGFjZSBwYXJ0IG9mIHRoZSBVTVAgQVBJLgorICovCisKKyNpZm5kZWYgX1VOSUZJRURfTUVNT1JZX1BST1ZJREVSX0hfCisjZGVmaW5lIF9VTklGSUVEX01FTU9SWV9QUk9WSURFUl9IXworCisKKy8qKiBAZGVmZ3JvdXAgdW1wX3VzZXJfc3BhY2VfYXBpIFVNUCBVc2VyIFNwYWNlIEFQSQorICogQHsgKi8KKworCisjaW5jbHVkZSAidW1wX3BsYXRmb3JtLmgiCisKKworI2lmZGVmIF9fY3BsdXNwbHVzCitleHRlcm4gIkMiIHsKKyNlbmRpZgorCisKKy8qKgorICogRXh0ZXJuYWwgcmVwcmVzZW50YXRpb24gb2YgYSBVTVAgaGFuZGxlIGluIHVzZXIgc3BhY2UuCisgKi8KK3R5cGVkZWYgdm9pZCAqIHVtcF9oYW5kbGU7CisKKy8qKgorICogVHlwZWRlZiBmb3IgYSBzZWN1cmUgSUQsIGEgc3lzdGVtIHdpZGUgaWRlbnRpZmljYXRvciBmb3IgVU1QIG1lbW9yeSBidWZmZXJzLgorICovCit0eXBlZGVmIHVuc2lnbmVkIGludCB1bXBfc2VjdXJlX2lkOworCisvKioKKyAqIFZhbHVlIHRvIGluZGljYXRlIGFuIGludmFsaWQgVU1QIG1lbW9yeSBoYW5kbGUuCisgKi8KKyNkZWZpbmUgVU1QX0lOVkFMSURfTUVNT1JZX0hBTkRMRSAoKHVtcF9oYW5kbGUpMCkKKworLyoqCisgKiBWYWx1ZSB0byBpbmRpY2F0ZSBhbiBpbnZhbGlkIHNlY3VyZSBJZC4KKyAqLworI2RlZmluZSBVTVBfSU5WQUxJRF9TRUNVUkVfSUQgICAgICgodW1wX3NlY3VyZV9pZCktMSkKKworLyoqCisgKiBVTVAgZXJyb3IgY29kZXMgZm9yIHVzZXIgc3BhY2UuCisgKi8KK3R5cGVkZWYgZW51bQoreworCVVNUF9PSyA9IDAsIC8qKjwgaW5kaWNhdGVzIHN1Y2Nlc3MgKi8KKwlVTVBfRVJST1IsICAvKio8IGluZGljYXRlcyBmYWlsdXJlICovCit9IHVtcF9yZXN1bHQ7CisKKworLyoqCisgKiBPcGVucyBhbmQgaW5pdGlhbGl6ZXMgdGhlIFVNUCBsaWJyYXJ5LgorICoKKyAqIFRoaXMgZnVuY3Rpb24gbXVzdCBiZSBjYWxsZWQgYXQgbGVhc3Qgb25jZSBiZWZvcmUgY2FsbGluZyBhbnkgb3RoZXIgVU1QIEFQSSBmdW5jdGlvbnMuCisgKiBFYWNoIG9wZW4gaXMgcmVmZXJlbmNlIGNvdW50ZWQgYW5kIG11c3QgYmUgbWF0Y2hlZCB3aXRoIGEgY2FsbCB0byBAcmVmIHVtcF9jbG9zZSAidW1wX2Nsb3NlIi4KKyAqCisgKiBAc2VlIHVtcF9jbG9zZQorICoKKyAqIEByZXR1cm4gVU1QX09LIGluZGljYXRlcyBzdWNjZXNzLCBVTVBfRVJST1IgaW5kaWNhdGVzIGZhaWx1cmUuCisgKi8KK1VNUF9BUElfRVhQT1JUIHVtcF9yZXN1bHQgdW1wX29wZW4odm9pZCk7CisKKworLyoqCisgKiBUZXJtaW5hdGUgdGhlIFVNUCBsaWJyYXJ5LgorICoKKyAqIFRoaXMgbXVzdCBiZSBjYWxsZWQgb25jZSBmb3IgZXZlcnkgc3VjY2Vzc2Z1bCBAcmVmIHVtcF9vcGVuICJ1bXBfb3BlbiIuIFRoZSBVTVAgbGlicmFyeSBpcworICogdGVybWluYXRlZCB3aGVuLCBhbmQgb25seSB3aGVuLCB0aGUgbGFzdCBvcGVuIHJlZmVyZW5jZSB0byB0aGUgVU1QIGludGVyZmFjZSBpcyBjbG9zZWQuCisgKgorICogQHNlZSB1bXBfb3BlbgorICovCitVTVBfQVBJX0VYUE9SVCB2b2lkIHVtcF9jbG9zZSh2b2lkKTsKKworCisvKioKKyAqIFJldHJpZXZlcyB0aGUgc2VjdXJlIElEIGZvciB0aGUgc3BlY2lmaWVkIFVNUCBtZW1vcnkuCisgKgorICogVGhpcyBpZGVudGlmaWNhdG9yIGlzIHVuaXF1ZSBhY3Jvc3MgdGhlIGVudGlyZSBzeXN0ZW0sIGFuZCB1bmlxdWVseSBpZGVudGlmaWVzCisgKiB0aGUgc3BlY2lmaWVkIFVNUCBtZW1vcnkuIFRoaXMgaWRlbnRpZmljYXRvciBjYW4gbGF0ZXIgYmUgdXNlZCB0aHJvdWdoIHRoZQorICogQHJlZiB1bXBfaGFuZGxlX2NyZWF0ZV9mcm9tX3NlY3VyZV9pZCAidW1wX2hhbmRsZV9jcmVhdGVfZnJvbV9zZWN1cmVfaWQiIG9yCisgKiBAcmVmIHVtcF9kZF9oYW5kbGVfY3JlYXRlX2Zyb21fc2VjdXJlX2lkICJ1bXBfZGRfaGFuZGxlX2NyZWF0ZV9mcm9tX3NlY3VyZV9pZCIKKyAqIGZ1bmN0aW9ucyBpbiBvcmRlciB0byBhY2Nlc3MgdGhpcyBVTVAgbWVtb3J5LCBmb3IgaW5zdGFuY2UgZnJvbSBhbm90aGVyIHByb2Nlc3MuCisgKgorICogQG5vdGUgVGhlcmUgaXMgYSBrZXJuZWwgc3BhY2UgZXF1aXZhbGVudCBmdW5jdGlvbiBjYWxsZWQgQHJlZiB1bXBfZGRfc2VjdXJlX2lkX2dldCAidW1wX2RkX3NlY3VyZV9pZF9nZXQiCisgKgorICogQHNlZSB1bXBfaGFuZGxlX2NyZWF0ZV9mcm9tX3NlY3VyZV9pZAorICogQHNlZSB1bXBfZGRfaGFuZGxlX2NyZWF0ZV9mcm9tX3NlY3VyZV9pZAorICogQHNlZSB1bXBfZGRfc2VjdXJlX2lkX2dldAorICoKKyAqIEBwYXJhbSBtZW0gSGFuZGxlIHRvIFVNUCBtZW1vcnkuCisgKgorICogQHJldHVybiBSZXR1cm5zIHRoZSBzZWN1cmUgSUQgZm9yIHRoZSBzcGVjaWZpZWQgVU1QIG1lbW9yeS4KKyAqLworVU1QX0FQSV9FWFBPUlQgdW1wX3NlY3VyZV9pZCB1bXBfc2VjdXJlX2lkX2dldCh1bXBfaGFuZGxlIG1lbSk7CisKKworLyoqCisgKiBSZXRyaWV2ZXMgYSBoYW5kbGUgdG8gYWxsb2NhdGVkIFVNUCBtZW1vcnkuCisgKgorICogVGhlIHVzYWdlIG9mIFVNUCBtZW1vcnkgaXMgcmVmZXJlbmNlIGNvdW50ZWQsIHNvIHRoaXMgd2lsbCBpbmNyZW1lbnQgdGhlIHJlZmVyZW5jZQorICogY291bnQgYnkgb25lIGZvciB0aGUgc3BlY2lmaWVkIFVNUCBtZW1vcnkuCisgKiBVc2UgQHJlZiB1bXBfcmVmZXJlbmNlX3JlbGVhc2UgInVtcF9yZWZlcmVuY2VfcmVsZWFzZSIgd2hlbiB0aGVyZSBpcyBubyBsb25nZXIgYW55CisgKiB1c2UgZm9yIHRoZSByZXRyaWV2ZWQgaGFuZGxlLgorICoKKyAqIEBub3RlIFRoZXJlIGlzIGEga2VybmVsIHNwYWNlIGVxdWl2YWxlbnQgZnVuY3Rpb24gY2FsbGVkIEByZWYgdW1wX2RkX2hhbmRsZV9jcmVhdGVfZnJvbV9zZWN1cmVfaWQgInVtcF9kZF9oYW5kbGVfY3JlYXRlX2Zyb21fc2VjdXJlX2lkIgorICoKKyAqIEBzZWUgdW1wX3JlZmVyZW5jZV9yZWxlYXNlCisgKiBAc2VlIHVtcF9kZF9oYW5kbGVfY3JlYXRlX2Zyb21fc2VjdXJlX2lkCisgKgorICogQHBhcmFtIHNlY3VyZV9pZCBUaGUgc2VjdXJlIElEIG9mIHRoZSBVTVAgbWVtb3J5IHRvIG9wZW4sIHRoYXQgY2FuIGJlIHJldHJpZXZlZCB1c2luZyB0aGUgQHJlZiB1bXBfc2VjdXJlX2lkX2dldCAidW1wX3NlY3VyZV9pZF9nZXQgIiBmdW5jdGlvbi4KKyAqCisgKiBAcmV0dXJuIFVNUF9JTlZBTElEX01FTU9SWV9IQU5ETEUgaW5kaWNhdGVzIGZhaWx1cmUsIG90aGVyd2lzZSBhIHZhbGlkIGhhbmRsZSBpcyByZXR1cm5lZC4KKyAqLworVU1QX0FQSV9FWFBPUlQgdW1wX2hhbmRsZSB1bXBfaGFuZGxlX2NyZWF0ZV9mcm9tX3NlY3VyZV9pZCh1bXBfc2VjdXJlX2lkIHNlY3VyZV9pZCk7CisKKworLyoqCisgKiBSZXRyaWV2ZXMgdGhlIGFjdHVhbCBzaXplIG9mIHRoZSBzcGVjaWZpZWQgVU1QIG1lbW9yeS4KKyAqCisgKiBUaGUgc2l6ZSBpcyByZXBvcnRlZCBpbiBieXRlcywgYW5kIGlzIHR5cGljYWxseSBwYWdlIGFsaWduZWQuCisgKgorICogQG5vdGUgVGhlcmUgaXMgYSBrZXJuZWwgc3BhY2UgZXF1aXZhbGVudCBmdW5jdGlvbiBjYWxsZWQgQHJlZiB1bXBfZGRfc2l6ZV9nZXQgInVtcF9kZF9zaXplX2dldCIKKyAqCisgKiBAc2VlIHVtcF9kZF9zaXplX2dldAorICoKKyAqIEBwYXJhbSBtZW0gSGFuZGxlIHRvIFVNUCBtZW1vcnkuCisgKgorICogQHJldHVybiBSZXR1cm5zIHRoZSBhbGxvY2F0ZWQgc2l6ZSBvZiB0aGUgc3BlY2lmaWVkIFVNUCBtZW1vcnksIGluIGJ5dGVzLgorICovCitVTVBfQVBJX0VYUE9SVCB1bnNpZ25lZCBsb25nIHVtcF9zaXplX2dldCh1bXBfaGFuZGxlIG1lbSk7CisKKworLyoqCisgKiBSZWFkIGZyb20gc3BlY2lmaWVkIFVNUCBtZW1vcnkuCisgKgorICogQW5vdGhlciB3YXkgb2YgcmVhZGluZyBmcm9tIChhbmQgd3JpdGluZyB0bykgVU1QIG1lbW9yeSBpcyB0byB1c2UgdGhlCisgKiBAcmVmIHVtcF9tYXBwZWRfcG9pbnRlcl9nZXQgInVtcF9tYXBwZWRfcG9pbnRlcl9nZXQiIHRvIHJldHJpZXZlCisgKiBhIENQVSBtYXBwZWQgcG9pbnRlciB0byB0aGUgbWVtb3J5LgorICoKKyAqIEBzZWUgdW1wX21hcHBlZF9wb2ludGVyX2dldAorICoKKyAqIEBwYXJhbSBkc3QgRGVzdGluYXRpb24gYnVmZmVyLgorICogQHBhcmFtIHNyYyBIYW5kbGUgdG8gVU1QIG1lbW9yeSB0byByZWFkIGZyb20uCisgKiBAcGFyYW0gb2Zmc2V0IFdoZXJlIHRvIHN0YXJ0IHJlYWRpbmcsIGdpdmVuIGluIGJ5dGVzLgorICogQHBhcmFtIGxlbmd0aCBIb3cgbXVjaCB0byByZWFkLCBnaXZlbiBpbiBieXRlcy4KKyAqLworVU1QX0FQSV9FWFBPUlQgdm9pZCB1bXBfcmVhZCh2b2lkICogZHN0LCB1bXBfaGFuZGxlIHNyYywgdW5zaWduZWQgbG9uZyBvZmZzZXQsIHVuc2lnbmVkIGxvbmcgbGVuZ3RoKTsKKworCisvKioKKyAqIFdyaXRlIHRvIHNwZWNpZmllZCBVTVAgbWVtb3J5LgorICoKKyAqIEFub3RoZXIgd2F5IG9mIHdyaXRpbmcgdG8gKGFuZCByZWFkaW5nIGZyb20pIFVNUCBtZW1vcnkgaXMgdG8gdXNlIHRoZQorICogQHJlZiB1bXBfbWFwcGVkX3BvaW50ZXJfZ2V0ICJ1bXBfbWFwcGVkX3BvaW50ZXJfZ2V0IiB0byByZXRyaWV2ZQorICogYSBDUFUgbWFwcGVkIHBvaW50ZXIgdG8gdGhlIG1lbW9yeS4KKyAqCisgKiBAc2VlIHVtcF9tYXBwZWRfcG9pbnRlcl9nZXQKKyAqCisgKiBAcGFyYW0gZHN0IEhhbmRsZSB0byBVTVAgbWVtb3J5IHRvIHdyaXRlIHRvLgorICogQHBhcmFtIG9mZnNldCBXaGVyZSB0byBzdGFydCB3cml0aW5nLCBnaXZlbiBpbiBieXRlcy4KKyAqIEBwYXJhbSBzcmMgQnVmZmVyIHRvIHJlYWQgZnJvbS4KKyAqIEBwYXJhbSBsZW5ndGggSG93IG11Y2ggdG8gd3JpdGUsIGdpdmVuIGluIGJ5dGVzLgorICovCitVTVBfQVBJX0VYUE9SVCB2b2lkIHVtcF93cml0ZSh1bXBfaGFuZGxlIGRzdCwgdW5zaWduZWQgbG9uZyBvZmZzZXQsIGNvbnN0IHZvaWQgKiBzcmMsIHVuc2lnbmVkIGxvbmcgbGVuZ3RoKTsKKworCisvKioKKyAqIFJldHJpZXZlcyBhIG1lbW9yeSBtYXBwZWQgcG9pbnRlciB0byB0aGUgc3BlY2lmaWVkIFVNUCBtZW1vcnkuCisgKgorICogVGhpcyBmdW5jdGlvbiByZXRyaWV2ZXMgYSBtZW1vcnkgbWFwcGVkIHBvaW50ZXIgdG8gdGhlIHNwZWNpZmllZCBVTVAgbWVtb3J5LAorICogdGhhdCBjYW4gYmUgdXNlZCBieSB0aGUgQ1BVLiBFdmVyeSBzdWNjZXNzZnVsIGNhbGwgdG8KKyAqIEByZWYgdW1wX21hcHBlZF9wb2ludGVyX2dldCAidW1wX21hcHBlZF9wb2ludGVyX2dldCIgaXMgcmVmZXJlbmNlIGNvdW50ZWQsCisgKiBhbmQgbXVzdCB0aGVyZWZvciBiZSBmb2xsb3dlZCBieSBhIGNhbGwgdG8KKyAqIEByZWYgdW1wX21hcHBlZF9wb2ludGVyX3JlbGVhc2UgInVtcF9tYXBwZWRfcG9pbnRlcl9yZWxlYXNlICIgd2hlbiB0aGUKKyAqIG1lbW9yeSBtYXBwaW5nIGlzIG5vIGxvbmdlciBuZWVkZWQuCisgKgorICogQG5vdGUgU3lzdGVtcyB3aXRob3V0IGEgTU1VIGZvciB0aGUgQ1BVIG9ubHkgcmV0dXJuIHRoZSBwaHlzaWNhbCBhZGRyZXNzLCBiZWNhdXNlIG5vIG1hcHBpbmcgaXMgcmVxdWlyZWQuCisgKgorICogQHNlZSB1bXBfbWFwcGVkX3BvaW50ZXJfcmVsZWFzZQorICoKKyAqIEBwYXJhbSBtZW0gSGFuZGxlIHRvIFVNUCBtZW1vcnkuCisgKgorICogQHJldHVybiBOVUxMIGluZGljYXRlcyBmYWlsdXJlLCBvdGhlcndpc2UgYSBDUFUgbWFwcGVkIHBvaW50ZXIgaXMgcmV0dXJuZWQuCisgKi8KK1VNUF9BUElfRVhQT1JUIHZvaWQgKiB1bXBfbWFwcGVkX3BvaW50ZXJfZ2V0KHVtcF9oYW5kbGUgbWVtKTsKKworCisvKioKKyAqIFJlbGVhc2VzIGEgcHJldmlvdXNseSBtYXBwZWQgcG9pbnRlciB0byB0aGUgc3BlY2lmaWVkIFVNUCBtZW1vcnkuCisgKgorICogVGhlIENQVSBtYXBwaW5nIG9mIHRoZSBzcGVjaWZpZWQgVU1QIG1lbW9yeSBtZW1vcnkgaXMgcmVmZXJlbmNlIGNvdW50ZWQsCisgKiBzbyBldmVyeSBjYWxsIHRvIEByZWYgdW1wX21hcHBlZF9wb2ludGVyX2dldCAidW1wX21hcHBlZF9wb2ludGVyX2dldCIgbXVzdAorICogYmUgbWF0Y2hlZCB3aXRoIGEgY2FsbCB0byB0aGlzIGZ1bmN0aW9uIHdoZW4gdGhlIG1hcHBpbmcgaXMgbm8gbG9uZ2VyIG5lZWRlZC4KKyAqCisgKiBUaGUgQ1BVIG1hcHBpbmcgaXMgbm90IHJlbW92ZWQgYmVmb3JlIGFsbCByZWZlcmVuY2VzIHRvIHRoZSBtYXBwaW5nIGlzIHJlbGVhc2VkLgorICoKKyAqIEBub3RlIFN5c3RlbXMgd2l0aG91dCBhIE1NVSBtdXN0IHN0aWxsIGltcGxlbWVudCB0aGlzIGZ1bmN0aW9uLCBldmVuIHRob3VnaCBubyB1bm1hcHBpbmcgc2hvdWxkIGJlIG5lZWRlZC4KKyAqCisgKiBAcGFyYW0gbWVtIEhhbmRsZSB0byBVTVAgbWVtb3J5LgorICovCitVTVBfQVBJX0VYUE9SVCB2b2lkIHVtcF9tYXBwZWRfcG9pbnRlcl9yZWxlYXNlKHVtcF9oYW5kbGUgbWVtKTsKKworCisvKioKKyAqIEFkZHMgYW4gZXh0cmEgcmVmZXJlbmNlIHRvIHRoZSBzcGVjaWZpZWQgVU1QIG1lbW9yeS4KKyAqCisgKiBUaGlzIGZ1bmN0aW9uIGFkZHMgYW4gZXh0cmEgcmVmZXJlbmNlIHRvIHRoZSBzcGVjaWZpZWQgVU1QIG1lbW9yeS4gVGhpcyBmdW5jdGlvbiBzaG91bGQKKyAqIGJlIHVzZWQgZXZlcnkgdGltZSBhIFVNUCBtZW1vcnkgaGFuZGxlIGlzIGR1cGxpY2F0ZWQsIHRoYXQgaXMsIGFzc2lnbmVkIHRvIGFub3RoZXIgdW1wX2hhbmRsZQorICogdmFyaWFibGUuIFRoZSBmdW5jdGlvbiBAcmVmIHVtcF9yZWZlcmVuY2VfcmVsZWFzZSAidW1wX3JlZmVyZW5jZV9yZWxlYXNlIiBtdXN0IHRoZW4gYmUgdXNlZAorICogdG8gcmVsZWFzZSBlYWNoIGNvcHkgb2YgdGhlIFVNUCBtZW1vcnkgaGFuZGxlLgorICoKKyAqIEBub3RlIFlvdSBhcmUgbm90IHJlcXVpcmVkIHRvIGNhbGwgQHJlZiB1bXBfcmVmZXJlbmNlX2FkZCAidW1wX3JlZmVyZW5jZV9hZGQiCisgKiBmb3IgVU1QIGhhbmRsZXMgcmV0dXJuZWQgZnJvbQorICogQHJlZiB1bXBfaGFuZGxlX2NyZWF0ZV9mcm9tX3NlY3VyZV9pZCAidW1wX2hhbmRsZV9jcmVhdGVfZnJvbV9zZWN1cmVfaWQiLAorICogYmVjYXVzZSB0aGVzZSBoYW5kbGVzIGFyZSBhbHJlYWR5IHJlZmVyZW5jZSBjb3VudGVkIGJ5IHRoaXMgZnVuY3Rpb24uCisgKgorICogQG5vdGUgVGhlcmUgaXMgYSBrZXJuZWwgc3BhY2UgZXF1aXZhbGVudCBmdW5jdGlvbiBjYWxsZWQgQHJlZiB1bXBfZGRfcmVmZXJlbmNlX2FkZCAidW1wX2RkX3JlZmVyZW5jZV9hZGQiCisgKgorICogQHNlZSB1bXBfZGRfcmVmZXJlbmNlX2FkZAorICoKKyAqIEBwYXJhbSBtZW0gSGFuZGxlIHRvIFVNUCBtZW1vcnkuCisgKi8KK1VNUF9BUElfRVhQT1JUIHZvaWQgdW1wX3JlZmVyZW5jZV9hZGQodW1wX2hhbmRsZSBtZW0pOworCisKKy8qKgorICogUmVsZWFzZXMgYSByZWZlcmVuY2UgZnJvbSB0aGUgc3BlY2lmaWVkIFVNUCBtZW1vcnkuCisgKgorICogVGhpcyBmdW5jdGlvbiBzaG91bGQgYmUgY2FsbGVkIG9uY2UgZm9yIGV2ZXJ5IHJlZmVyZW5jZSB0byB0aGUgVU1QIG1lbW9yeSBoYW5kbGUuCisgKiBXaGVuIHRoZSBsYXN0IHJlZmVyZW5jZSBpcyByZWxlYXNlZCwgYWxsIHJlc291cmNlcyBhc3NvY2lhdGVkIHdpdGggdGhpcyBVTVAgbWVtb3J5CisgKiBoYW5kbGUgYXJlIGZyZWVkLgorICoKKyAqIEBub3RlIFRoZXJlIGlzIGEga2VybmVsIHNwYWNlIGVxdWl2YWxlbnQgZnVuY3Rpb24gY2FsbGVkIEByZWYgdW1wX2RkX3JlZmVyZW5jZV9yZWxlYXNlICJ1bXBfZGRfcmVmZXJlbmNlX3JlbGVhc2UiCisgKgorICogQHNlZSB1bXBfZGRfcmVmZXJlbmNlX3JlbGVhc2UKKyAqCisgKiBAcGFyYW0gbWVtIEhhbmRsZSB0byBVTVAgbWVtb3J5LgorICovCitVTVBfQVBJX0VYUE9SVCB2b2lkIHVtcF9yZWZlcmVuY2VfcmVsZWFzZSh1bXBfaGFuZGxlIG1lbSk7CisKKworI2lmZGVmIF9fY3BsdXNwbHVzCit9CisjZW5kaWYKKworCisvKiogQH0gKi8gLyogZW5kIGdyb3VwIHVtcF91c2VyX3NwYWNlX2FwaSAqLworCisKKyNlbmRpZiAvKl9VTklGSUVEX01FTU9SWV9QUk9WSURFUl9IXyAqLwpkaWZmIC0tZ2l0IGEvZXh5bm9zNC9oYWwvbGlidW1wL2luY2x1ZGUvdW1wL3VtcF9kZWJ1Zy5oIGIvZXh5bm9zNC9oYWwvbGlidW1wL2luY2x1ZGUvdW1wL3VtcF9kZWJ1Zy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjVlZGU4YTMKLS0tIC9kZXYvbnVsbAorKysgYi9leHlub3M0L2hhbC9saWJ1bXAvaW5jbHVkZS91bXAvdW1wX2RlYnVnLmgKQEAgLTAsMCArMSwyODcgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTAtMjAxMSBBUk0gTGltaXRlZC4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqIAorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqIAorICogICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKiAKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKy8qKgorICogQGZpbGUgdW1wX2RlYnVnLmgKKyAqCisgKiBUaGUgZmlsZSBpbmNsdWRlIHNldmVyYWwgdXNlZnVsIG1hY3JvcyBmb3IgZGVidWdnaW5nIGFuZCBwcmludGluZy4KKyAqIC0gVU1QX1BSSU5URiguLi4pICAgICAgICAgICBEbyBub3QgdXNlIHRoaXMgZnVuY3Rpb246IFdpbGwgYmUgaW5jbHVkZWQgaW4gUmVsZWFzZSBidWlsZHMuCisgKiAtIFVNUF9ERUJVR19UUkFDRSgpICAgICAgICAgUHJpbnRzIGN1cnJlbnQgbG9jYXRpb24gaW4gY29kZS4KKyAqIC0gVU1QX0RFQlVHX1BSSU5UKG5yLCAoWCkgKSBQcmludHMgdGhlIHNlY29uZCBhcmd1bWVudCBpZiBucjw9VU1QX0RFQlVHX0xFVkVMLgorICogLSBVTVBfREVCVUdfVFBSSU5UKG5yLCBYICkgIFByaW50cyB0aGUgc291cmNlIHRyYWNlIGFuZCBzZWNvbmQgYXJndW1lbnQgaWYgbnI8PVVNUF9ERUJVR19MRVZFTC4KKyAqIC0gVU1QX0RFQlVHX0VSUk9SKCAoWCkgKSAgICBQcmludHMgYW4gZXJyb3J0ZXh0LCBhIHNvdXJjZSB0cmFjZSwgYW5kIHRoZSBnaXZlbiBlcnJvciBtZXNzYWdlLgorICogLSBVTVBfREVCVUdfQVNTRVJUKGV4cCwoWCkpIElmIHRoZSBhc3NlcnRlZCBleHByIGlzIGZhbHNlLCB0aGUgcHJvZ3JhbSB3aWxsIGV4aXQuCisgKiAtIFVNUF9ERUJVR19BU1NFUlRfUkFOR0UoeCwgbWluLCBtYXgpIFRyaWdnZXJzIGlmIHZhcmlhYmxlIHggaXMgbm90IGJldHdlZW4gb3IgZXF1YWwgdG8gbWF4IGFuZCBtaW4uCisgKiAtIFVNUF9ERUJVR19BU1NFUlRfTEVRKHgsIG1heCkgVHJpZ2dlcnMgaWYgdmFyaWFibGUgeCBpcyBub3QgbGVzcyB0aGFuIGVxdWFsIHRvIG1heC4KKyAqIC0gVU1QX0RFQlVHX0FTU0VSVF9QT0lOVEVSKHBvaW50ZXIpICBUcmlnZ2VycyBpZiB0aGUgcG9pbnRlciBpcyBhIHplcm8gcG9pbnRlci4KKyAqIC0gVU1QX0RFQlVHX0NPREUoIFggKSAgICAgICBUaGUgY29kZSBpbnNpZGUgdGhlIG1hY3JvIGlzIG9ubHkgY29waWxlZCBpbiBEZWJ1ZyBidWlsZHMuCisgKgorICogVGhlIChYKSBtZWFucyB0aGF0IHlvdSBtdXN0IGFkZCBhbiBleHRyYSBwYXJhbnRlc2UgYXJvdW5kIHRoZSBhcmd1bWVudGxpc3QuCisgKgorICogVGhlICBwcmludGYgZnVuY3Rpb246IFVNUF9QUklOVEYoLi4uKSBpcyByb3V0ZWQgdG8gX3VtcF9zeXNfcHJpbnRmCisgKgorICogU3VnZ2VzdGVkIHJhbmdlIGZvciB0aGUgREVCVUctTEVWRUwgaXMgWzE6Nl0gd2hlcmUKKyAqIFsxOjJdIElzIG1lc3NhZ2VzIHdpdGggaGlnaGVzdCBwcmlvcml0eSwgaW5kaWNhdGUgcG9zc2libGUgZXJyb3JzLgorICogWzM6NF0gSXMgbWVzc2FnZXMgd2l0aCBtZWRpdW0gcHJpb3JpdHksIG91dHB1dCBpbXBvcnRhbnQgdmFyaWFibGVzLgorICogWzU6Nl0gSXMgbWVzc2FnZXMgd2l0aCBsb3cgcHJpb3JpdHksIHVzZWQgZHVyaW5nIGV4dGVuc2l2ZSBkZWJ1Z2dpbmcuCisgKgorICovCisjaWZuZGVmIF9VTVBfREVCVUdfSF8KKyNkZWZpbmUgX1VNUF9ERUJVR19IXworCisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlIDxzdGRsaWIuaD4KKworLyogU1RBUlQ6IENvbmZpZ3VyYXRpb24gKi8KKyNpZm5kZWYgVU1QX1BSSU5URgorCSNkZWZpbmUgVU1QX1BSSU5URiBwcmludGYKKyNlbmRpZiAvKiBVTVBfUFJJTlRGICovCisKKyNpZm5kZWYgVU1QX1BSSU5UX0ZMVVNICisJI2RlZmluZSBVTVBfUFJJTlRfRkxVU0ggZG8ge30gd2hpbGUgKDApCisjZW5kaWYgLyogVU1QX1BSSU5UX0ZMVVNIICovCisKKyNpZm5kZWYgVU1QX0RFQlVHX0xFVkVMCisgICAgI2RlZmluZSBVTVBfREVCVUdfTEVWRUwgMQorI2VuZGlmIC8qIFVNUF9ERUJVR19MRVZFTCAqLworCisjaWZuZGVmIFVNUF9ERUJVR19FUlJPUl9TVEFSVF9NU0cKKyAgICAjZGVmaW5lIFVNUF9ERUJVR19FUlJPUl9TVEFSVF9NU0cgZG8ge1wKKyAgICBVTVBfUFJJTlRGKCIqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKipcbiIpO1wKKyAgICBVTVBfUFJJTlRfRkxVU0g7IH0gd2hpbGUgKDApCisjZW5kaWYgLyogVU1QX0RFQlVHX0VSUk9SX1NUQVJUX01TRyAqLworCisjaWZuZGVmIFVNUF9ERUJVR19FUlJPUl9TVE9QX01TRworICAgICNkZWZpbmUgVU1QX0RFQlVHX0VSUk9SX1NUT1BfTVNHICBkbyB7IFVNUF9QUklOVEYoIlxuIik7IFVNUF9QUklOVF9GTFVTSDsgfSB3aGlsZSAoMCkKKyNlbmRpZiAvKiBVTVBfREVCVUdfRVJST1JfU1RPUF9NU0cgKi8KKworI2lmbmRlZiBVTVBfQVNTRVJUX1FVSVRfQ01ECisJI2RlZmluZSBVTVBfQVNTRVJUX1FVSVRfQ01EICAgIGFib3J0KCkKKyNlbmRpZiAvKiBVTVBfQVNTRVJUX1FVSVRfQ01EICovCisvKiBTVE9QOiBDb25maWd1cmF0aW9uICovCisKKy8qKgorICoJVGhlIG1hY3JvIFVNUF9GVU5DVElPTiBldmFsdWF0ZXMgdG8gdGhlIG5hbWUgb2YgdGhlIGZ1bmN0aW9uIGVuY2xvc2luZworICoJdGhpcyBtYWNybydzIHVzYWdlLCBvciAiPHVua25vd24+IiBpZiBub3Qgc3VwcG9ydGVkLgorICovCisjaWYgKGRlZmluZWQoX19TWU1CSUFOMzJfXykgJiYgZGVmaW5lZChfX0FSTUNDX18pKSB8fCBkZWZpbmVkKF9NU0NfVkVSKQorIwlkZWZpbmUgVU1QX0ZVTkNUSU9OIF9fRlVOQ1RJT05fXworI2VsaWYgX19TVERDX18gICYmIF9fU1REQ19WRVJTSU9OX18gPj0gMTk5OTAxTAorIwlkZWZpbmUgVU1QX0ZVTkNUSU9OIF9fRlVOQ1RJT05fXworI2VsaWYgZGVmaW5lZChfX0dOVUNfXykgJiYgX19HTlVDX18gPj0gMgorIwlkZWZpbmUgVU1QX0ZVTkNUSU9OIF9fRlVOQ1RJT05fXworI2VsaWYgZGVmaW5lZChfX2Z1bmNfXykKKyMJZGVmaW5lIFVNUF9GVU5DVElPTiBfX2Z1bmNfXworI2Vsc2UKKyMJZGVmaW5lIFVNUF9GVU5DVElPTiAiPHVua25vd24+IgorI2VuZGlmCisKKy8qKgorICoJRXhwbGljaXRseSBpZ25vcmUgYSBwYXJhbWV0ZXIgcGFzc2VkIGludG8gYSBmdW5jdGlvbiwgdG8gc3VwcHJlc3MgY29tcGlsZXIgd2FybmluZ3MuCisgKglTaG91bGQgb25seSBiZSB1c2VkIHdpdGggcGFyYW1ldGVyIG5hbWVzLgorICovCisjZGVmaW5lIFVNUF9JR05PUkUoeCkgKHZvaWQpeAorCisvKioKKyAqIEBkZWYgICAgIFVNUF9ERUJVR19UUkFDRSgpCisgKiBAYnJpZWYgICBQcmludHMgY3VycmVudCBsb2NhdGlvbiBpbiBjb2RlLgorICogICAgICAgICAgQ2FuIGJlIHR1cm5lZCBvZmYgYnkgZGVmaW5pbmcgVU1QX0RFQlVHX1NLSVBfVFJBQ0UKKyAqLworCisjaWZuZGVmIFVNUF9ERUJVR19TS0lQX1RSQUNFCisgICAgI2lmbmRlZiBVTVBfREVCVUdfU0tJUF9QUklOVF9GVU5DVElPTl9OQU1FCisgICAgICAgICNkZWZpbmUgVU1QX0RFQlVHX1RSQUNFKCkgIGRvIHsgVU1QX1BSSU5URiggIkluIGZpbGU6ICJfX0ZJTEVfXyBcCisgICAgICAgICAgICAgICAgICAgICAgICAiICBmdW5jdGlvbjogJXMoKSAgIGxpbmU6JTRkXG4iICwgVU1QX0ZVTkNUSU9OLCBfX0xJTkVfXyk7ICBVTVBfUFJJTlRfRkxVU0g7IH0gd2hpbGUgKDApCisJI2Vsc2UKKyAgICAgICAgI2RlZmluZSBVTVBfREVCVUdfVFJBQ0UoKSAgZG8geyBVTVBfUFJJTlRGKCAiSW4gZmlsZTogIl9fRklMRV9fICIgIGxpbmU6JTRkXG4iICwgX19MSU5FX18pOyAgVU1QX1BSSU5UX0ZMVVNIOyB9IHdoaWxlICgwKQorCSNlbmRpZiAvKiBVTVBfREVCVUdfU0tJUF9QUklOVF9GVU5DVElPTl9OQU1FICovCisjZWxzZQorICAgICNkZWZpbmUgVU1QX0RFQlVHX1RSQUNFKCkKKyNlbmRpZiAvKiBVTVBfREVCVUdfU0tJUF9UUkFDRSAqLworCisvKioKKyAqIEBkZWYgICAgIFVNUF9ERUJVR19QUklOVChuciwgKFgpICkKKyAqIEBicmllZiAgIFByaW50cyB0aGUgc2Vjb25kIGFyZ3VtZW50IGlmIG5yPD1VTVBfREVCVUdfTEVWRUwuCisgKiAgICAgICAgICBDYW4gYmUgdHVybmVkIG9mZiBieSBkZWZpbmluZyBVTVBfREVCVUdfU0tJUF9QUklOVAorICogQHBhcmFtICAgbnIgICBJZiBuciA8PSBVTVBfREVCVUdfTEVWRUwsIHdlIHByaW50IHRoZSB0ZXh0LgorICogQHBhcmFtICAgWCAgQSBwYXJhbnRlc2Ugd2l0aCB0aGUgY29udGVudHMgdG8gYmUgc2VudCB0byBVTVBfUFJJTlRGCisgKi8KKyNpZm5kZWYgVU1QX0RFQlVHX1NLSVBfUFJJTlQKKyAgICAjZGVmaW5lIFVNUF9ERUJVR19QUklOVChuciwgWCApICBkbyB7IGlmICggbnI8PVVNUF9ERUJVR19MRVZFTCApIHsgVU1QX1BSSU5URiBYIDsgVU1QX1BSSU5UX0ZMVVNIOyB9IH0gd2hpbGUgKDApCisjZWxzZQorICAgICNkZWZpbmUgVU1QX0RFQlVHX1BSSU5UKG5yLCBYICkKKyNlbmRpZiAvKiBVTVBfREVCVUdfU0tJUF9QUklOVCAqLworCisvKioKKyAqIEBkZWYgICAgIFVNUF9ERUJVR19UUFJJTlQobnIsIChYKSApCisgKiBAYnJpZWYgICBQcmludHMgdGhlIHNlY29uZCBhcmd1bWVudCBpZiBucjw9VU1QX0RFQlVHX0xFVkVMLgorICogICAgICAgICAgQ2FuIGJlIHR1cm5lZCBvZmYgYnkgZGVmaW5pbmcgVU1QX0RFQlVHX1NLSVBfVFBSSU5ULgorICogICAgICAgICAgQ2FuIGJlIHNob3J0ZW5lZCBieSBkZWZpbmluZyBVTVBfREVCVUdfVFBSSU5UX1NLSVBfRlVOQ1RJT04uCisgKiBAcGFyYW0gICBuciAgIElmIG5yIDw9IFVNUF9ERUJVR19MRVZFTCwgd2UgcHJpbnQgdGhlIHRleHQuCisgKiBAcGFyYW0gICBYICBBIHBhcmFudGVzZSB3aXRoIHRoZSBjb250ZW50cyB0byBiZSBzZW50IHRvIFVNUF9QUklOVEYKKyAqLworCisvKiBoZWxwZXIgdG8gaGFuZGxlIGlmIHRoZSBmdW5jdGlvbiBuYW1lIHNob3VsZCBiZSBpbmNsdWRlZCBvciBub3QgKi8KKyNpZm5kZWYgVU1QX0RFQlVHX1RQUklOVF9TS0lQX0ZVTkNUSU9OCisgICAgI2RlZmluZSBVTVBfREVCVUdfVFBSSU5UX0lOVEVSTiBkbyB7VU1QX1BSSU5URiggIiJfX0ZJTEVfXyIgJXMoKSU0ZCAiICwgVU1QX0ZVTkNUSU9OLCBfX0xJTkVfXyk7IFVNUF9QUklOVF9GTFVTSDsgfSAgd2hpbGUgKDApCisjZWxzZQorICAgICNkZWZpbmUgVU1QX0RFQlVHX1RQUklOVF9JTlRFUk4gZG8ge1VNUF9QUklOVEYoICIiX19GSUxFX18gIiU0ZCAiICwgX19MSU5FX18pOyBVTVBfUFJJTlRfRkxVU0g7IH0gIHdoaWxlICgwKQorI2VuZGlmIC8qIFVNUF9ERUJVR19UUFJJTlRfU0tJUF9GVU5DVElPTiAqLworCisjaWZuZGVmIFVNUF9ERUJVR19TS0lQX1RQUklOVAorCSNkZWZpbmUgVU1QX0RFQlVHX1RQUklOVChuciwgWCApIFwKKyAgICBkb3tcCisgICAgICAgIGlmICggbnI8PVVNUF9ERUJVR19MRVZFTCApXAorICAgICAgICB7XAorICAgICAgICAgICAgVU1QX0RFQlVHX1RQUklOVF9JTlRFUk47XAorICAgICAgICAgICAgVU1QX1BSSU5URiBYIDtcCisgICAgICAgICAgICBVTVBfUFJJTlRfRkxVU0g7XAorICAgICAgICB9XAorICAgIH0gd2hpbGUgKDApCisjZWxzZQorICAgICNkZWZpbmUgVU1QX0RFQlVHX1RQUklOVChuciwgWCApCisjZW5kaWYgLyogVU1QX0RFQlVHX1NLSVBfVFBSSU5UICovCisKKy8qKgorICogQGRlZiAgICAgVU1QX0RFQlVHX0VSUk9SKCAoWCkgKQorICogQGJyaWVmICAgUHJpbnRzIGFuIGVycm9ydGV4dCwgYSBzb3VyY2UgVHJhY2UsIGFuZCB0aGUgZ2l2ZW4gZXJyb3IgbWVzc2FnZS4KKyAqICAgICAgICAgIFByaW50cyBmaWxlbmFtZSwgZnVuY3Rpb24sIGxpbmVuciwgYW5kIHRoZSBnaXZlbiBlcnJvciBtZXNzYWdlLgorICogICAgICAgICAgVGhlIGVycm9yIG1lc3NhZ2UgbXVzdCBiZSBpbnNpZGUgYSBzZWNvbmQgcGFyYW50ZXNlLgorICogICAgICAgICAgVGhlIGVycm9yIG1lc3NhZ2UgaXMgd3JpdHRlbiBvbiBhIHNlcGFyYXRlIGxpbmUsIGFuZCBhIE5MIGNoYXIgaXMgYWRkZWQuCisgKiAgICAgICAgICBDYW4gYmUgdHVybmVkIG9mIGJ5IGRlZmluaW5nIFVNUF9ERUJVR19TS0lQX0VSUk9SOworICogICAgICAgICAgWW91IGRvIG5vdCBuZWVkIHRvIHR5cGUgdGhlIHdvcmRzIEVSUk9SIGluIHRoZSBtZXNzYWdlLCBzaW5jZSBpdCB3aWxsCisgKiAgICAgICAgICBiZSBhZGRlZCBhbnl3YXkuCisgKgorICogQG5vdGUgICAgWW91IHNob3VsZCBub3QgZW5kIHRoZSB0ZXh0IHdpdGggYSBuZXdsaW5lLCBzaW5jZSBpdCBpcyBhZGRlZCBieSB0aGUgbWFjcm8uCisgKiBAbm90ZSAgICBZb3Ugc2hvdWxkIG5vdCB3cml0ZSAiRVJST1IiIGluIHRoZSB0ZXh0LCBzaW5jZSBpdCBpcyBhZGRlZCBieSB0aGUgbWFjcm8uCisgKiBAcGFyYW0gICAgWCAgQSBwYXJhbnRlc2Ugd2l0aCB0aGUgY29udGVudHMgdG8gYmUgc2VudCB0byBVTVBfUFJJTlRGCisgKi8KKworI2lmbmRlZiBVTVBfREVCVUdfU0tJUF9FUlJPUgorICAgICNkZWZpbmUgVU1QX0RFQlVHX0VSUk9SKCBYICkgIFwKKyAgICAgICAgZG97IFwKKyAgICAgICAgICAgIFVNUF9ERUJVR19FUlJPUl9TVEFSVF9NU0c7XAorICAgICAgICAgICAgVU1QX1BSSU5URigiRVJST1I6ICIpO1wKKyAgICAgICAgICAgIFVNUF9QUklOVF9GTFVTSDtcCisgICAgICAgICAgICBVTVBfREVCVUdfVFJBQ0UoKTsgXAorICAgICAgICAgICAgVU1QX1BSSU5URiBYIDsgXAorICAgICAgICAgICAgVU1QX1BSSU5UX0ZMVVNIO1wKKyAgICAgICAgICAgIFVNUF9ERUJVR19FUlJPUl9TVE9QX01TRztcCisgICAgICAgIH0gd2hpbGUgKDApCisjZWxzZQorICAgICNkZWZpbmUgVU1QX0RFQlVHX0VSUk9SKCBYICkgZG97IDsgfSB3aGlsZSAoIDAgKQorI2VuZGlmIC8qIFVNUF9ERUJVR19TS0lQX0VSUk9SICovCisKKy8qKgorICogQGRlZiAgICAgVU1QX0RFQlVHX0FTU0VSVChleHByLCAoWCkgKQorICogQGJyaWVmICAgSWYgdGhlIGFzc2VydGVkIGV4cHIgaXMgZmFsc2UsIHRoZSBwcm9ncmFtIHdpbGwgZXhpdC4KKyAqICAgICAgICAgIFByaW50cyBmaWxlbmFtZSwgZnVuY3Rpb24sIGxpbmVuciwgYW5kIHRoZSBnaXZlbiBlcnJvciBtZXNzYWdlLgorICogICAgICAgICAgVGhlIGVycm9yIG1lc3NhZ2UgbXVzdCBiZSBpbnNpZGUgYSBzZWNvbmQgcGFyYW50ZXNlLgorICogICAgICAgICAgVGhlIGVycm9yIG1lc3NhZ2UgaXMgd3JpdHRlbiBvbiBhIHNlcGFyYXRlIGxpbmUsIGFuZCBhIE5MIGNoYXIgaXMgYWRkZWQuCisgKiAgICAgICAgICBDYW4gYmUgdHVybmVkIG9mIGJ5IGRlZmluaW5nIFVNUF9ERUJVR19TS0lQX0VSUk9SOworICogICAgICAgICAgWW91IGRvIG5vdCBuZWVkIHRvIHR5cGUgdGhlIHdvcmRzIEFTU0VSVCBpbiB0aGUgbWVzc2FnZSwgc2luY2UgaXQgd2lsbAorICogICAgICAgICAgYmUgYWRkZWQgYW55d2F5LgorICoKKyAqIEBwYXJhbSAgICBYICBBIHBhcmFudGVzZSB3aXRoIHRoZSBjb250ZW50cyB0byBiZSBzZW50IHRvIFVNUF9QUklOVEYKKyAqICAgICAgICAgIFByaW50cyBmaWxlbmFtZSwgZnVuY3Rpb24sIGxpbmVuciwgYW5kIHRoZSBlcnJvciBtZXNzYWdlCisgKiAgICAgICAgICBvbiBhIHNlcGFydGUgbGluZS4gQSBuZXdsaW5lIGNoYXIgaXMgYWRkZWQgYXQgdGhlIGVuZC4KKyAqICAgICAgICAgIENhbiBiZSB0dXJuZWQgb2YgYnkgZGVmaW5pbmcgVU1QX0RFQlVHX1NLSVBfQVNTRVJUCisgKiBAcGFyYW0gICBleHByICBXaWxsIGV4aXQgcHJvZ3JhbSBpZiBcYSBleHByIGlzIGZhbHNlOworICogQHBhcmFtICAgKFgpICBUZXh0IHRoYXQgd2lsbCBiZSB3cml0dGVuIGlmIHRoZSBhc3NlcnRpb24gdG9nZ2xlcy4KKyAqLworCisjaWZuZGVmIFVNUF9ERUJVR19TS0lQX0FTU0VSVAorICAgICNkZWZpbmUgVU1QX0RFQlVHX0FTU0VSVChleHByLCBYICkgXAorICAgIGRve1wKKyAgICAgICAgaWYgKCAhKGV4cHIpICkgXAorICAgICAgICB7IFwKKyAgICAgICAgICAgICAgICBVTVBfREVCVUdfRVJST1JfU1RBUlRfTVNHO1wKKyAgICAgICAgICAgICAgICBVTVBfUFJJTlRGKCJBU1NFUlQgRVhJVDogIik7XAorICAgICAgICAgICAgICAgIFVNUF9QUklOVF9GTFVTSDtcCisgICAgICAgICAgICAgICAgVU1QX0RFQlVHX1RSQUNFKCk7IFwKKyAgICAgICAgICAgICAgICBVTVBfUFJJTlRGIFggOyBcCisgICAgICAgICAgICAgICAgVU1QX1BSSU5UX0ZMVVNIO1wKKyAgICAgICAgICAgICAgICBVTVBfREVCVUdfRVJST1JfU1RPUF9NU0c7XAorICAgICAgICAgICAgICAgIFVNUF9BU1NFUlRfUVVJVF9DTUQ7XAorICAgICAgICB9XAorICAgIH0gd2hpbGUgKDApCisjZWxzZQorCSNkZWZpbmUgVU1QX0RFQlVHX0FTU0VSVChleHByLCBYKQorI2VuZGlmIC8qIFVNUF9ERUJVR19TS0lQX0FTU0VSVCAqLworCisKKy8qKgorICogQGRlZiAgICAgVU1QX0RFQlVHX0FTU0VSVF9QT0lOVEVSKHBvaW50ZXIpCisgKiBAYnJpZWYgICBJZiB0aGUgYXNzZXJ0ZWQgcG9pbnRlciBpcyBOVUxMLCB0aGUgcHJvZ3JhbSB0ZXJtaW5hdGVzIGFuZCBUUkFDRSBpbmZvIGlzIHByaW50ZWQKKyAqICAgICAgICAgIFRoZSBjaGVja2luZyBpcyBkaXNhYmxlZCBpZiAiVU1QX0RFQlVHX1NLSVBfQVNTRVJUIiBpcyBkZWZpbmVkLgorICovCisjZGVmaW5lIFVNUF9ERUJVR19BU1NFUlRfUE9JTlRFUihwb2ludGVyKSBVTVBfREVCVUdfQVNTRVJUKHBvaW50ZXIsICgiTnVsbCBwb2ludGVyICIgI3BvaW50ZXIpICkKKworLyoqCisgKiBAZGVmICAgICBVTVBfREVCVUdfQVNTRVJUX0hBTkRMRShoYW5kbGUpCisgKiBAYnJpZWYgICBJZiB0aGUgYXNzZXJ0ZWQgaGFuZGxlIGlzIG5vdCBhIHZhbGlkIGhhbmRsZSwgdGhlIHByb2dyYW0gdGVybWluYXRlcyBhbmQgVFJBQ0UgaW5mbyBpcyBwcmludGVkCisgKiAgICAgICAgICBUaGUgY2hlY2tpbmcgaXMgZGlzYWJsZWQgaWYgIlVNUF9ERUJVR19TS0lQX0FTU0VSVCIgaXMgZGVmaW5lZC4KKyAqLworI2RlZmluZSBVTVBfREVCVUdfQVNTRVJUX0hBTkRMRShoYW5kbGUpIFVNUF9ERUJVR19BU1NFUlQoVU1QX05PX0hBTkRMRSAhPSAoaGFuZGxlKSwgKCJJbnZhbGlkIGhhbmRsZSIgI2hhbmRsZSkgKQorCisvKioKKyAqIEBkZWYgICAgIFVNUF9ERUJVR19BU1NFUlRfQUxJR05NRU5UKHB0ciwgYWxpZ24pCisgKiBAYnJpZWYgICBJZiB0aGUgYXNzZXJ0ZWQgcG9pbnRlciBpcyAgbm90IGFsaWduZWQgdG8gYWxpZ24sIHRoZSBwcm9ncmFtIHRlcm1pbmF0ZXMgd2l0aCB0cmFjZSBpbmZvIHByaW50ZWQuCisgKiAgICAgICAgICBUaGUgY2hlY2tpbmcgaXMgZGlzYWJsZWQgaWYgIlVNUF9ERUJVR19TS0lQX0FTU0VSVCIgaXMgZGVmaW5lZC4KKyAqLworI2lmbmRlZiBVTVBfREVCVUdfU0tJUF9BU1NFUlQKKwkjZGVmaW5lIFVNUF9ERUJVR19BU1NFUlRfQUxJR05NRU5UKHB0ciwgYWxpZ24pIGRvIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorCQlVTVBfREVCVUdfQVNTRVJUKDAgPT0gKGFsaWduICYgKGFsaWduIC0gMSkpLCAoImFsaWduICVkIGlzIG5vdCBhIHBvd2VyLW9mLXR3byIsIGFsaWduKSk7ICAgICAgICAgICBcCisJCVVNUF9ERUJVR19BU1NFUlQoMCA9PSAoKCh1MzIpKHB0cikpICYgKGFsaWduIC0gMSkpLCAoInB0ciAlcCBub3QgYWxpZ25lZCB0byAlZCBieXRlcyIsICh2b2lkKilwdHIsIGFsaWduKSk7IFwKKwkJfSB3aGlsZSAoMCkKKyNlbHNlCisJI2RlZmluZSBVTVBfREVCVUdfQVNTRVJUX0FMSUdOTUVOVChwdHIsIGFsaWduKQorI2VuZGlmIC8qIFVNUF9ERUJVR19TS0lQX0FTU0VSVCAqLworCisvKioKKyAqIEBkZWYgICAgIFVNUF9ERUJVR19BU1NFUlRfUkFOR0UoeCxtaW4sbWF4KQorICogQGJyaWVmICAgSWYgdmFyaWFibGUgeCBpcyBub3QgYmV0d2VlbiBvciBlcXVhbCB0byBtYXggYW5kIG1pbiwgdGhlIGFzc2VydGlvbiB0cmlnZ2Vycy4KKyAqICAgICAgICAgIFRoZSBjaGVja2luZyBpcyBkaXNhYmxlZCBpZiAiVU1QX0RFQlVHX1NLSVBfQVNTRVJUIiBpcyBkZWZpbmVkLgorICovCisjZGVmaW5lIFVNUF9ERUJVR19BU1NFUlRfUkFOR0UoeCwgbWluLCBtYXgpIFwKKwlVTVBfREVCVUdfQVNTRVJUKCAoeCkgPj0gKG1pbikgJiYgKHgpIDw9IChtYXgpLCBcCisJCQkgICAoI3ggIiBvdXQgb2YgcmFuZ2UgKCUyLjJmKSIsIChkb3VibGUpeCApIFwKKwkJCSApCisKKy8qKgorICogQGRlZiAgICAgVU1QX0RFQlVHX0FTU0VSVF9MRVEoeCxtYXgpCisgKiBAYnJpZWYgICBJZiB2YXJpYWJsZSB4IGlzIGxlc3MgdGhhbiBvciBlcXVhbCB0byBtYXgsIHRoZSBhc3NlcnRpb24gdHJpZ2dlcnMuCisgKiAgICAgICAgICBUaGUgY2hlY2tpbmcgaXMgZGlzYWJsZWQgaWYgIlVNUF9ERUJVR19TS0lQX0FTU0VSVCIgaXMgZGVmaW5lZC4KKyAqLworI2RlZmluZSBVTVBfREVCVUdfQVNTRVJUX0xFUSh4LCBtYXgpIFwKKwlVTVBfREVCVUdfQVNTRVJUKCAoeCkgPD0gKG1heCksIFwKKwkJCSAgICgjeCAiIG91dCBvZiByYW5nZSAoJTIuMmYpIiwgKGRvdWJsZSl4ICkgXAorCQkJICkKKworLyoqCisgKiBAZGVmICAgICBVTVBfREVCVUdfQ09ERSggWCApCisgKiBAYnJpZWYgICBSdW4gdGhlIGNvZGUgWCBvbiBkZWJ1ZyBidWlsZHMuCisgKiAgICAgICAgICBUaGUgY29kZSB3aWxsIG5vdCBiZSB1c2VkIGlmIFVNUF9ERUJVR19TS0lQX0NPREUgaXMgZGVmaW5lZCAuCisgKgorICovCisjaWZkZWYgVU1QX0RFQlVHX1NLSVBfQ09ERQorICAgICNkZWZpbmUgVU1QX0RFQlVHX0NPREUoIFggKQorI2Vsc2UKKyAgICAjZGVmaW5lIFVNUF9ERUJVR19DT0RFKCBYICkgWAorI2VuZGlmIC8qIFVNUF9ERUJVR19TS0lQX0NPREUgKi8KKworI2VuZGlmIC8qIF9VTVBfREVCVUdfSF8gKi8KKwpkaWZmIC0tZ2l0IGEvZXh5bm9zNC9oYWwvbGlidW1wL2luY2x1ZGUvdW1wL3VtcF9vc3UuaCBiL2V4eW5vczQvaGFsL2xpYnVtcC9pbmNsdWRlL3VtcC91bXBfb3N1LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNWM5YTY1MAotLS0gL2Rldi9udWxsCisrKyBiL2V4eW5vczQvaGFsL2xpYnVtcC9pbmNsdWRlL3VtcC91bXBfb3N1LmgKQEAgLTAsMCArMSw0MzAgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTAtMjAxMSBBUk0gTGltaXRlZC4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqIAorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqIAorICogICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKiAKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKy8qKgorICogQGZpbGUgdW1wX29zdS5oCisgKiBEZWZpbmVzIHRoZSBPUyBhYnN0cmFjdGlvbiBsYXllciBmb3IgdGhlIGJhc2UgZHJpdmVyCisgKi8KKworI2lmbmRlZiBfX1VNUF9PU1VfSF9fCisjZGVmaW5lIF9fVU1QX09TVV9IX18KKworI2luY2x1ZGUgPHN0ZGFyZy5oPgorCisjaWZkZWYgX19jcGx1c3BsdXMKK2V4dGVybiAiQyIKK3sKKyNlbmRpZgorCisKK3R5cGVkZWYgdW5zaWduZWQgaW50IHUzMjsKKyNpZmRlZiBfTVNDX1ZFUgorICAgICAgICB0eXBlZGVmIHVuc2lnbmVkIF9faW50NjQgICAgICAgIHU2NDsKKyAgICAgICAgdHlwZWRlZiBzaWduZWQgICBfX2ludDY0ICAgICAgICBzNjQ7CisjZWxzZQorICAgICAgICB0eXBlZGVmIHVuc2lnbmVkIGxvbmcgbG9uZyAgICAgIHU2NDsKKyAgICAgICAgdHlwZWRlZiBzaWduZWQgbG9uZyBsb25nICAgICAgICBzNjQ7CisjZW5kaWYKKworI2lmbmRlZiBOVUxMCisjZGVmaW5lIE5VTEwgKCh2b2lkKikwKQorI2VuZGlmCisKK3R5cGVkZWYgdW5zaWduZWQgbG9uZyB1bXBfYm9vbDsKKworI2lmbmRlZiBVTVBfVFJVRQorI2RlZmluZSBVTVBfVFJVRSAoKHVtcF9ib29sKTEpCisjZW5kaWYKKworI2lmbmRlZiBVTVBfRkFMU0UKKyNkZWZpbmUgVU1QX0ZBTFNFICgodW1wX2Jvb2wpMCkKKyNlbmRpZgorCisjZGVmaW5lIFVNUF9TVEFUSUMgICAgICAgICAgc3RhdGljCisKKy8qKgorICogQGFkZHRvZ3JvdXAgdW1wX3VzZXJfc3BhY2VfYXBpIFVuaWZpZWQgRGV2aWNlIERyaXZlciAoVUREKSBBUElzIHVzZWQgYnkgVU1QCisgKgorICogQHsKKyAqLworCisvKioKKyAqIEBkZWZncm91cCB1bXBfb3N1YXBpIFVERCBPUyBBYnN0cmFjdGlvbiBmb3IgVXNlci1zaWRlIChPU1UpIEFQSXMgZm9yIFVNUAorICoKKyAqIEB7CisgKi8KKworLyogVGhlIGZvbGxvd2luZyBpcyBuZWNlc3NhcnkgdG8gcHJldmVudCB0aGUgX3VtcF9vc2tfZXJyY29kZV90IGRveHlnZW4gZnJvbQorICogYmVjb21pbmcgdW5yZWFkYWJsZTogKi8KKy8qKiBAY29uZCBPU1VfQ09QWV9PRl9fVU1QX09TVV9FUlJDT0RFX1QgKi8KKworLyoqCisgKiBAYnJpZWYgT1NVL09TSyBFcnJvciBjb2Rlcy4KKyAqCisgKiBFYWNoIE9TIG1heSB1c2UgaXRzIG93biBzZXQgb2YgZXJyb3IgY29kZXMsIGFuZCBtYXkgcmVxdWlyZSB0aGF0IHRoZQorICogVXNlci9LZXJuZWwgaW50ZXJmYWNlIHRha2UgY2VydGFpbiBlcnJvciBjb2RlLiBUaGlzIG1lYW5zIHRoYXQgdGhlIGNvbW1vbgorICogZXJyb3IgY29kZXMgbmVlZCB0byBiZSBzdWZmaWNpZW50bHkgcmljaCB0byBwYXNzIHRoZSBjb3JyZWN0IGVycm9yIGNvZGUKKyAqIHRocm91Z2ggZnJvbSB0aGUgT1NLL09TVSB0byBVL0sgbGF5ZXIsIGFjcm9zcyBhbGwgT1NzLgorICoKKyAqIFRoZSByZXN1bHQgaXMgdGhhdCBzb21lIGVycm9yIGNvZGVzIHdpbGwgYXBwZWFyIHJlZHVuZGFudCBvbiBzb21lIE9Tcy4KKyAqIFVuZGVyIGFsbCBPU3MsIHRoZSBPU0svT1NVIGxheWVyIG11c3QgdHJhbnNsYXRlIG5hdGl2ZSBPUyBlcnJvciBjb2RlcyB0bworICogX3VtcF9vc2svdV9lcnJjb2RlX3QgY29kZXMuIFNpbWlsYXJseSwgdGhlIFUvSyBsYXllciBtdXN0IHRyYW5zbGF0ZSBmcm9tCisgKiBfdW1wX29zay91X2VycmNvZGVfdCBjb2RlcyB0byBuYXRpdmUgT1MgZXJyb3IgY29kZXMuCisgKgorICovCit0eXBlZGVmIGVudW0KK3sKKwlfVU1QX09TS19FUlJfT0sgPSAwLCAgICAgICAgICAgICAgLyoqPCBTdWNjZXNzLiAqLworCV9VTVBfT1NLX0VSUl9GQVVMVCA9IC0xLCAgICAgICAgICAvKio8IEdlbmVyYWwgbm9uLXN1Y2Nlc3MgKi8KKwlfVU1QX09TS19FUlJfSU5WQUxJRF9GVU5DID0gLTIsICAgLyoqPCBJbnZhbGlkIGZ1bmN0aW9uIHJlcXVlc3RlZCB0aHJvdWdoIFVzZXIvS2VybmVsIGludGVyZmFjZSAoZS5nLiBiYWQgSU9DVEwgbnVtYmVyKSAqLworCV9VTVBfT1NLX0VSUl9JTlZBTElEX0FSR1MgPSAtMywgICAvKio8IEludmFsaWQgYXJndW1lbnRzIHBhc3NlZCB0aHJvdWdoIFVzZXIvS2VybmVsIGludGVyZmFjZSAqLworCV9VTVBfT1NLX0VSUl9OT01FTSA9IC00LCAgICAgICAgICAvKio8IEluc3VmZmljaWVudCBtZW1vcnkgKi8KKwlfVU1QX09TS19FUlJfVElNRU9VVCA9IC01LCAgICAgICAgLyoqPCBUaW1lb3V0IG9jY3VyZWQgKi8KKwlfVU1QX09TS19FUlJfUkVTVEFSVFNZU0NBTEwgPSAtNiwgLyoqPCBTcGVjaWFsOiBPbiBjZXJ0YWluIE9TcywgbXVzdCByZXBvcnQgd2hlbiBhbiBpbnRlcnJ1cHRhYmxlIG11dGV4IGlzIGludGVycnVwdGVkLiBJZ25vcmUgb3RoZXJ3aXNlLiAqLworCV9VTVBfT1NLX0VSUl9JVEVNX05PVF9GT1VORCA9IC03LCAvKio8IFRhYmxlIExvb2t1cCBmYWlsZWQgKi8KKwlfVU1QX09TS19FUlJfQlVTWSA9IC04LCAgICAgICAgICAgLyoqPCBEZXZpY2Uvb3BlcmF0aW9uIGlzIGJ1c3kuIFRyeSBhZ2FpbiBsYXRlciAqLworCV9VTVBfT1NLX0VSUl9VTlNVUFBPUlRFRCA9IC05LAkvKio8IE9wdGlvbmFsIHBhcnQgb2YgdGhlIGludGVyZmFjZSB1c2VkLCBhbmQgaXMgdW5zdXBwb3J0ZWQgKi8KK30gX3VtcF9vc2tfZXJyY29kZV90OworCisvKiogQGVuZGNvbmQgKi8gLyogZW5kIGNvbmQgT1NVX0NPUFlfT0ZfX1VNUF9PU1VfRVJSQ09ERV9UICovCisKKy8qKgorICogQGJyaWVmIE9TVSBFcnJvciBjb2Rlcy4KKyAqCisgKiBPU1UgZXJyb3IgY29kZXMgLSBlbnVtIHZhbHVlcyBpbnRlbnRpb25hbGx5IHNhbWUgYXMgT1NLCisgKi8KK3R5cGVkZWYgZW51bQoreworCV9VTVBfT1NVX0VSUl9PSyA9IDAsICAgICAgICAgICAvKio8IFN1Y2Nlc3MuICovCisJX1VNUF9PU1VfRVJSX0ZBVUxUID0gLTEsICAgICAgIC8qKjwgR2VuZXJhbCBub24tc3VjY2VzcyAqLworCV9VTVBfT1NVX0VSUl9USU1FT1VUID0gLTIsICAgICAvKio8IFRpbWVvdXQgb2NjdXJlZCAqLworfSBfdW1wX29zdV9lcnJjb2RlX3Q7CisKKy8qKiBAYnJpZWYgVHJhbnNsYXRlIE9TVSBlcnJvciBjb2RlIHRvIGJhc2UgZHJpdmVyIGVycm9yIGNvZGUuCisgKgorICogVGhlIF9VTVBfT1NVX1RSQU5TTEFURV9FUlJPUiBtYWNybyB0cmFuc2xhdGVzIGFuIE9TVSBlcnJvciBjb2RlIHRvIHRoZQorICogZXJyb3IgY29kZXMgaW4gdXNlIGJ5IHRoZSBiYXNlIGRyaXZlci4KKyAqLworI2RlZmluZSBfVU1QX09TVV9UUkFOU0xBVEVfRVJST1IoX3VtcF9vc3VfZXJyY29kZSkgKCAoIF9VTVBfT1NVX0VSUl9PSyA9PSAoX3VtcF9vc3VfZXJyY29kZSkgKSA/IFVNUF9FUlJfTk9fRVJST1IgOiBVTVBfRVJSX0ZVTkNUSU9OX0ZBSUxFRCkKKworLyoqIEBkZWZncm91cCBfdW1wX29zdV9sb2NrIE9TVSBNdXR1YWwgRXhjbHVzaW9uIExvY2tzCisgICogQHsgKi8KKworLyoqIEBicmllZiBPU1UgTXV0dWFsIEV4Y2x1c2lvbiBMb2NrIGZsYWdzIHR5cGUuCisgKgorICogVGhpcyBpcyBtYWRlIHRvIGxvb2sgbGlrZSBhbmQgZnVuY3Rpb24gaWRlbnRpY2FsbHkgdG8gdGhlIE9TSyBsb2NrcyAocmVmZXIKKyAqIHRvIFxyZWYgX3VtcF9vc2tfbG9jaykuIEhvd2V2ZXIsIHBsZWFzZSBub3RlIHRoZSBmb2xsb3dpbmcgXGIgaW1wb3J0YW50CisgKiBkaWZmZXJlbmNlczoKKyAqIC0gdGhlIE9TVSBkZWZhdWx0IGxvY2sgaXMgYSBTbGVlcGluZywgbm9uLWludGVycnVwdGlibGUgbXV0ZXguCisgKiAtIHRoZSBPU1UgYWRkcyB0aGUgQU5ZVU5MT0NLIHR5cGUgb2YgbG9jayB3aGljaCBhbGxvd3MgYSB0aHJlYWQgd2hpY2ggZG9lc24ndAorICogb3duIHRoZSBsb2NrIHRvIHJlbGVhc2UgdGhlIGxvY2suCisgKiAtIHRoZSBvcmRlciBwYXJhbWV0ZXIgd2hlbiBjcmVhdGluZyBhIGxvY2sgaXMgY3VycmVudGx5IHVudXNlZAorICoKKyAqIEBub3RlIFBheSBjYXJlZnVsIGF0dGVudGlvbiB0byB0aGUgZGlmZmVyZW5jZSBpbiBkZWZhdWx0IGxvY2tzIGZvciBPU1UgYW5kCisgKiBPU0sgbG9ja3M7IE9TVSBsb2NrcyBhcmUgYWx3YXlzIG5vbi1pbnRlcnJ1cHRpYmxlLCBidXQgT1NLIGxvY2tzIGFyZSBieQorICogZGVmYXVsdCwgaW50ZXJydXB0aWJsZS4gVGhpcyBoYXMgaW1wbGljYXRpb25zIGZvciBzeXN0ZW1zIHRoYXQgZG8gbm90CisgKiBkaXN0aW5ndWlzaCBiZXR3ZWVuIHVzZXIgYW5kIGtlcm5lbCBtb2RlLgorICovCit0eXBlZGVmIGVudW0KK3sKKwlfVU1QX09TVV9MT0NLRkxBR19ERUZBVUxUID0gMCwgLyoqPCBEZWZhdWx0IGxvY2sgdHlwZS4gKi8KKwkvKiogQGVudW0gX3VtcF9vc3VfbG9ja19mbGFnc190CisJICoKKwkgKiBGbGFncyBmcm9tIDB4ODAwMC0tMHgxIGFyZSBSRVNFUlZFRCBmb3IgS2VybmVsLW1vZGUKKwkgKi8KKwlfVU1QX09TVV9MT0NLRkxBR19BTllVTkxPQ0sgPSAweDEwMDAwLCAvKio8IE11dGV4IHRoYXQgZ3VhcmFudGVlcyB0aGF0IGFueSB0aHJlYWQgY2FuIHVubG9jayBpdCB3aGVuIGxvY2tlZC4gT3RoZXJ3aXNlLCB0aGlzIHdpbGwgbm90IGJlIHBvc3NpYmxlLiAqLworCS8qKiBAZW51bSBfdW1wX29zdV9sb2NrX2ZsYWdzX3QKKwkgKgorCSAqIEZsYWdzIGZyb20gMHg4MDAwMDAwMCBhcmUgUkVTRVJWRUQgZm9yIFVzZXItbW9kZQorCSAqLworCV9VTVBfT1NVX0xPQ0tGTEFHX1NUQVRJQyA9IDB4ODAwMDAwMDAsIC8qIEZsYWcgaW4gT1NVIHJlc2VydmVkIHJhbmdlIHRvIGlkZW50aWZ5IGxvY2sgYXMgYSBzdGF0aWNhbGx5IGluaXRpYWxpemVkIGxvY2sgKi8KKworIH0gX3VtcF9vc3VfbG9ja19mbGFnc190OworCit0eXBlZGVmIGVudW0KK3sKKwlfVU1QX09TVV9MT0NLTU9ERV9VTkRFRiA9IC0xLCAgLyoqPCBVbmRlZmluZWQgbG9jayBtb2RlLiBGb3IgaW50ZXJuYWwgdXNlIG9ubHkgKi8KKwlfVU1QX09TVV9MT0NLTU9ERV9SVyAgICA9IDB4MCwgLyoqPCBEZWZhdWx0LiBMb2NrIGlzIHVzZWQgdG8gcHJvdGVjdCBkYXRhIHRoYXQgaXMgcmVhZCBmcm9tIGFuZCB3cml0dGVuIHRvICovCisJLyoqIEBlbnVtIF91bXBfb3N1X2xvY2tfbW9kZV90CisJICoKKwkgKiBMb2NrIG1vZGVzIDB4MS0tMHgzRiBhcmUgUkVTRVJWRUQgZm9yIEtlcm5lbC1tb2RlICovCit9IF91bXBfb3N1X2xvY2tfbW9kZV90OworCisvKiogQGJyaWVmIFByaXZhdGUgdHlwZSBmb3IgTXV0dWFsIEV4Y2x1c2lvbiBsb2NrIG9iamVjdHMuICovCit0eXBlZGVmIHN0cnVjdCBfdW1wX29zdV9sb2NrX3Rfc3RydWN0IF91bXBfb3N1X2xvY2tfdDsKKworLyoqIEBicmllZiBUaGUgbnVtYmVyIG9mIHN0YXRpYyBsb2NrcyBzdXBwb3J0ZWQgaW4gX3VtcF9vc3VfbG9ja19zdGF0aWMoKS4gKi8KKyNkZWZpbmUgVU1QX09TVV9TVEFUSUNfTE9DS19DT1VOVCAoc2l6ZW9mKF91bXBfb3N1X3N0YXRpY19sb2NrcykgLyBzaXplb2YoX3VtcF9vc3VfbG9ja190KSkKKworLyoqIEB9ICovIC8qIGVuZCBncm91cCBfdW1wX29zdV9sb2NrICovCisKKy8qKiBAZGVmZ3JvdXAgX3VtcF9vc3VfbWVtb3J5IE9TVSBNZW1vcnkgQWxsb2NhdGlvbgorICogQHsgKi8KKworLyoqIEBicmllZiBBbGxvY2F0ZSB6ZXJvLWluaXRpYWxpemVkIG1lbW9yeS4KKyAqCisgKiBSZXR1cm5zIGEgYnVmZmVyIGNhcGFibGUgb2YgY29udGFpbmluZyBhdCBsZWFzdCBcYSBuIGVsZW1lbnRzIG9mIFxhIHNpemUKKyAqIGJ5dGVzIGVhY2guIFRoZSBidWZmZXIgaXMgaW5pdGlhbGl6ZWQgdG8gemVyby4KKyAqCisgKiBUaGUgYnVmZmVyIGlzIHN1aXRhYmx5IGFsaWduZWQgZm9yIHN0b3JhZ2UgYW5kIHN1YnNlcXVlbnQgYWNjZXNzIG9mIGV2ZXJ5CisgKiB0eXBlIHRoYXQgdGhlIGNvbXBpbGVyIHN1cHBvcnRzLiBUaGVyZWZvcmUsIHRoZSBwb2ludGVyIHRvIHRoZSBzdGFydCBvZiB0aGUKKyAqIGJ1ZmZlciBtYXkgYmUgY2FzdCBpbnRvIGFueSBwb2ludGVyIHR5cGUsIGFuZCBiZSBzdWJzZXF1ZW50bHkgYWNjZXNzZWQgZnJvbQorICogc3VjaCBhIHBvaW50ZXIsIHdpdGhvdXQgbG9zcyBvZiBpbmZvcm1hdGlvbi4KKyAqCisgKiBXaGVuIHRoZSBidWZmZXIgaXMgbm8gbG9uZ2VyIGluIHVzZSwgaXQgbXVzdCBiZSBmcmVlZCB3aXRoIF91bXBfb3N1X2ZyZWUoKS4KKyAqIEZhaWx1cmUgdG8gZG8gc28gd2lsbCBjYXVzZSBhIG1lbW9yeSBsZWFrLgorICoKKyAqIEBub3RlIE1vc3QgdG9vbGNoYWlucyBzdXBwbHkgbWVtb3J5IGFsbG9jYXRpb24gZnVuY3Rpb25zIHRoYXQgbWVldCB0aGUKKyAqIGNvbXBpbGVyJ3MgYWxpZ25tZW50IHJlcXVpcmVtZW50cy4KKyAqCisgKiBAcGFyYW0gbiBOdW1iZXIgb2YgZWxlbWVudHMgdG8gYWxsb2NhdGUKKyAqIEBwYXJhbSBzaXplIFNpemUgb2YgZWFjaCBlbGVtZW50CisgKiBAcmV0dXJuIE9uIHN1Y2Nlc3MsIHRoZSB6ZXJvLWluaXRpYWxpemVkIGJ1ZmZlciBhbGxvY2F0ZWQuIE5VTEwgb24gZmFpbHVyZQorICovCit2b2lkICpfdW1wX29zdV9jYWxsb2MoIHUzMiBuLCB1MzIgc2l6ZSApOworCisvKiogQGJyaWVmIEFsbG9jYXRlIG1lbW9yeS4KKyAqCisgKiBSZXR1cm5zIGEgYnVmZmVyIGNhcGFibGUgb2YgY29udGFpbmluZyBhdCBsZWFzdCBcYSBzaXplIGJ5dGVzLiBUaGUKKyAqIGNvbnRlbnRzIG9mIHRoZSBidWZmZXIgYXJlIHVuZGVmaW5lZC4KKyAqCisgKiBUaGUgYnVmZmVyIGlzIHN1aXRhYmx5IGFsaWduZWQgZm9yIHN0b3JhZ2UgYW5kIHN1YnNlcXVlbnQgYWNjZXNzIG9mIGV2ZXJ5CisgKiB0eXBlIHRoYXQgdGhlIGNvbXBpbGVyIHN1cHBvcnRzLiBUaGVyZWZvcmUsIHRoZSBwb2ludGVyIHRvIHRoZSBzdGFydCBvZiB0aGUKKyAqIGJ1ZmZlciBtYXkgYmUgY2FzdCBpbnRvIGFueSBwb2ludGVyIHR5cGUsIGFuZCBiZSBzdWJzZXF1ZW50bHkgYWNjZXNzZWQgZnJvbQorICogc3VjaCBhIHBvaW50ZXIsIHdpdGhvdXQgbG9zcyBvZiBpbmZvcm1hdGlvbi4KKyAqCisgKiBXaGVuIHRoZSBidWZmZXIgaXMgbm8gbG9uZ2VyIGluIHVzZSwgaXQgbXVzdCBiZSBmcmVlZCB3aXRoIF91bXBfb3N1X2ZyZWUoKS4KKyAqIEZhaWx1cmUgdG8gZG8gc28gd2lsbCBjYXVzZSBhIG1lbW9yeSBsZWFrLgorICoKKyAqIEBub3RlIE1vc3QgdG9vbGNoYWlucyBzdXBwbHkgbWVtb3J5IGFsbG9jYXRpb24gZnVuY3Rpb25zIHRoYXQgbWVldCB0aGUKKyAqIGNvbXBpbGVyJ3MgYWxpZ25tZW50IHJlcXVpcmVtZW50cy4KKyAqCisgKiBSZW1lbWJlciB0byBmcmVlIG1lbW9yeSB1c2luZyBfdW1wX29zdV9mcmVlKCkuCisgKiBAcGFyYW0gc2l6ZSBOdW1iZXIgb2YgYnl0ZXMgdG8gYWxsb2NhdGUKKyAqIEByZXR1cm4gT24gc3VjY2VzcywgdGhlIGJ1ZmZlciBhbGxvY2F0ZWQuIE5VTEwgb24gZmFpbHVyZS4KKyAqLwordm9pZCAqX3VtcF9vc3VfbWFsbG9jKCB1MzIgc2l6ZSApOworCisvKiogQGJyaWVmIEZyZWUgbWVtb3J5LgorICoKKyAqIFJlY2xhaW1zIHRoZSBidWZmZXIgcG9pbnRlZCB0byBieSB0aGUgcGFyYW1ldGVyIFxhIHB0ciBmb3IgdGhlIHN5c3RlbS4KKyAqIEFsbCBtZW1vcnkgcmV0dXJuZWQgZnJvbSBfdW1wX29zdV9tYWxsb2MoKSwgX3VtcF9vc3VfY2FsbG9jKCkgYW5kCisgKiBfdW1wX29zdV9yZWFsbG9jKCkgbXVzdCBiZSBmcmVlZCBiZWZvcmUgdGhlIGFwcGxpY2F0aW9uIGV4aXRzLiBPdGhlcndpc2UsCisgKiBhIG1lbW9yeSBsZWFrIHdpbGwgb2NjdXIuCisgKgorICogTWVtb3J5IG11c3QgYmUgZnJlZWQgb25jZS4gSXQgaXMgYW4gZXJyb3IgdG8gZnJlZSB0aGUgc2FtZSBub24tTlVMTCBwb2ludGVyCisgKiBtb3JlIHRoYW4gb25jZS4KKyAqCisgKiBJdCBpcyBsZWdhbCB0byBmcmVlIHRoZSBOVUxMIHBvaW50ZXIuCisgKgorICogQHBhcmFtIHB0ciBQb2ludGVyIHRvIGJ1ZmZlciB0byBmcmVlCisgKi8KK3ZvaWQgX3VtcF9vc3VfZnJlZSggdm9pZCAqcHRyICk7CisKKy8qKiBAYnJpZWYgQ29waWVzIG1lbW9yeS4KKyAqCisgKiBDb3BpZXMgdGhlIFxhIGxlbiBieXRlcyBmcm9tIHRoZSBidWZmZXIgcG9pbnRlZCBieSB0aGUgcGFyYW1ldGVyIFxhIHNyYworICogZGlyZWN0bHkgdG8gdGhlIGJ1ZmZlciBwb2ludGVkIGJ5IFxhIGRzdC4KKyAqCisgKiBJdCBpcyBhbiBlcnJvciBmb3IgXGEgc3JjIHRvIG92ZXJsYXAgXGEgZHN0IGFueXdoZXJlIGluIFxhIGxlbiBieXRlcy4KKyAqCisgKiBAcGFyYW0gZHN0IFBvaW50ZXIgdG8gdGhlIGRlc3RpbmF0aW9uIGFycmF5IHdoZXJlIHRoZSBjb250ZW50IGlzIHRvIGJlCisgKiBjb3BpZWQuCisgKiBAcGFyYW0gc3JjIFBvaW50ZXIgdG8gdGhlIHNvdXJjZSBvZiBkYXRhIHRvIGJlIGNvcGllZC4KKyAqIEBwYXJhbSBsZW4gTnVtYmVyIG9mIGJ5dGVzIHRvIGNvcHkuCisgKiBAcmV0dXJuIFxhIGRzdCBpcyBhbHdheXMgcGFzc2VkIHRocm91Z2ggdW5tb2RpZmllZC4KKyAqLwordm9pZCAqX3VtcF9vc3VfbWVtY3B5KCB2b2lkICpkc3QsIGNvbnN0IHZvaWQgKnNyYywgdTMyCWxlbiApOworCisvKiogQGJyaWVmIEZpbGxzIG1lbW9yeS4KKyAqCisgKiBTZXRzIHRoZSBmaXJzdCBcYSBzaXplIGJ5dGVzIG9mIHRoZSBibG9jayBvZiBtZW1vcnkgcG9pbnRlZCB0byBieSBcYSBwdHIgdG8KKyAqIHRoZSBzcGVjaWZpZWQgdmFsdWUKKyAqIEBwYXJhbSBwdHIgUG9pbnRlciB0byB0aGUgYmxvY2sgb2YgbWVtb3J5IHRvIGZpbGwuCisgKiBAcGFyYW0gY2hyIFZhbHVlIHRvIGJlIHNldCwgcGFzc2VkIGFzIHUzMi4gT25seSB0aGUgOCBMZWFzdCBTaWduaWZpY2FudCBCaXRzIChMU0IpCisgKiBhcmUgdXNlZC4KKyAqIEBwYXJhbSBzaXplIE51bWJlciBvZiBieXRlcyB0byBiZSBzZXQgdG8gdGhlIHZhbHVlLgorICogQHJldHVybiBcYSBwdHIgaXMgYWx3YXlzIHBhc3NlZCB0aHJvdWdoIHVubW9kaWZpZWQKKyAqLwordm9pZCAqX3VtcF9vc3VfbWVtc2V0KCB2b2lkICpwdHIsIHUzMiBjaHIsIHUzMiBzaXplICk7CisKKy8qKiBAfSAqLyAvKiBlbmQgZ3JvdXAgX3VtcF9vc3VfbWVtb3J5ICovCisKKworLyoqIEBhZGR0b2dyb3VwIF91bXBfb3N1X2xvY2sKKyAqIEB7ICovCisKKy8qKiBAYnJpZWYgSW5pdGlhbGl6ZSBhIE11dHVhbCBFeGNsdXNpb24gTG9jay4KKyAqCisgKiBMb2NrcyBhcmUgY3JlYXRlZCBpbiB0aGUgc2lnbmFsbGVkICh1bmxvY2tlZCkgc3RhdGUuCisgKgorICogVGhlIHBhcmFtZXRlciBcYSBpbml0aWFsIG11c3QgYmUgemVyby4KKyAqCisgKiBBdCBwcmVzZW50LCB0aGUgcGFyYW1ldGVyIFxhIG9yZGVyIG11c3QgYmUgemVyby4gSXQgcmVtYWlucyBmb3IgZnV0dXJlCisgKiBleHBhbnNpb24gZm9yIG11dGV4IG9yZGVyIGNoZWNraW5nLgorICoKKyAqIEBwYXJhbSBmbGFncyBmbGFncyBjb21iaW5lZCB3aXRoIGJpdHdpc2UgT1IgKCd8JyksIG9yIHplcm8uIFRoZXJlIGFyZQorICogcmVzdHJpY3Rpb25zIG9uIHdoaWNoIGZsYWdzIGNhbiBiZSBjb21iaW5lZCwgc2VlIFxyZWYgX3VtcF9vc3VfbG9ja19mbGFnc190LgorICogQHBhcmFtIGluaXRpYWwgRm9yIGZ1dHVyZSBleHBhbnNpb24gaW50byBzZW1hcGhvcmVzLiBTQlouCisgKiBAcGFyYW0gb3JkZXIgVGhlIGxvY2tpbmcgb3JkZXIgb2YgdGhlIG11dGV4LiBTQlouCisgKiBAcmV0dXJuIE9uIHN1Y2Nlc3MsIGEgcG9pbnRlciB0byBhIFxyZWYgX3VtcF9vc3VfbG9ja190IG9iamVjdC4gTlVMTCBvbiBmYWlsdXJlLgorICovCitfdW1wX29zdV9sb2NrX3QgKl91bXBfb3N1X2xvY2tfaW5pdCggX3VtcF9vc3VfbG9ja19mbGFnc190IGZsYWdzLCB1MzIgaW5pdGlhbCwgdTMyIG9yZGVyICk7CisKKy8qKiBAYnJpZWYgT2J0YWluIGEgc3RhdGljYWxseSBpbml0aWFsaXplZCBNdXR1YWwgRXhjbHVzaW9uIExvY2suCisgKgorICogUmV0cmlldmVzIGEgcmVmZXJlbmNlIHRvIGEgc3RhdGljYWxseSBpbml0aWFsaXplZCBsb2NrLiBVcCB0bworICogX1VNUF9PU1VfU1RBVElDX0xPQ0tfQ09VTlQgc3RhdGljYWxseSBpbml0aWFsaXplZCBsb2NrcyBhcmUKKyAqIGF2YWlsYWJsZS4gT25seSBfdW1wX29zdV9sb2NrX3dhaXQoKSwgX3VtcF9vc3VfbG9ja190cnl3YWl0KCksCisgKiBfdW1wX29zdV9sb2NrX3NpZ25hbCgpIGNhbiBiZSB1c2VkIHdpdGggc3RhdGljYWxseSBpbml0aWFsaXplZCBsb2Nrcy4KKyAqIF9VTVBfT1NVX0xPQ0tNT0RFX1JXIG1vZGUgc2hvdWxkIGJlIHVzZWQgd2hlbiB3YWl0aW5nIGFuZCBzaWduYWxsaW5nCisgKiBzdGF0aWNhbGx5IGluaXRpYWxpemVkIGxvY2tzLgorICoKKyAqIEZvciB0aGUgc2FtZSBcYSBuciBhIHBvaW50ZXIgdG8gdGhlIHNhbWUgc3RhdGljYWxseSBpbml0aWFsaXplZCBsb2NrIGlzCisgKiByZXR1cm5lZC4gVGhhdCBpcywgZ2l2ZW4gdGhlIGZvbGxvd2luZyBjb2RlOgorICogQGNvZGUKKyAqCWV4dGVybiB1MzIgbjsKKyAqCisgKiAJX3VtcF9vc3VfbG9ja190ICpsb2NrYSA9IF91bXBfb3N1X2xvY2tfc3RhdGljKG4pOworICoJX3VtcF9vc3VfbG9ja190ICpsb2NrYiA9IF91bXBfb3N1X2xvY2tfc3RhdGljKG4pOworICogQGVuZGNvZGUKKyAqIFRoZW4gKGxvY2thID09IGxvY2tiKSwgZm9yIGFsbCAwIDw9IG4gPCBVTVBfT1NVX1NUQVRJQ19MT0NLX0NPVU5ULgorICoKKyAqIEBwYXJhbSBuciBpbmRleCBvZiBhIHN0YXRpY2FsbHkgaW5pdGlhbGl6ZWQgbG9jayBbMC4uVU1QX09TVV9TVEFUSUNfTE9DS19DT1VOVC0xXQorICogQHJldHVybiBPbiBzdWNjZXNzLCBhIHBvaW50ZXIgdG8gYSBfdW1wX29zdV9sb2NrX3Qgb2JqZWN0LiBOVUxMIG9uIGZhaWx1cmUuCisgKi8KK191bXBfb3N1X2xvY2tfdCAqX3VtcF9vc3VfbG9ja19zdGF0aWMoIHUzMiBuciApOworCisvKiogQGJyaWVmIEluaXRpYWxpemUgYSBNdXR1YWwgRXhjbHVzaW9uIExvY2sgc2FmZWx5IGFjcm9zcyBtdWx0aXBsZSB0aHJlYWRzLgorICoKKyAqIFRoZSBfdW1wX29zdV9sb2NrX2F1dG9faW5pdCgpIGZ1bmN0aW9uIGd1YXJhbnRlZXMgdGhhdCB0aGUgZ2l2ZW4gbG9jayB3aWxsCisgKiBiZSBpbml0aWFsaXplZCBvbmNlIGFuZCBwcmVjaXNlbHkgb25jZSwgZXZlbiBpbiBhIHNpdHVhdGlvbiBpbnZvbHZpbmcKKyAqIG11bHRpcGxlIHRocmVhZHMuCisgKgorICogVGhpcyBpcyBuZWNlc3NhcnkgYmVjYXVzZSB0aGUgZmlyc3QgY2FsbCB0byBjZXJ0YWluIFB1YmxpYyBBUEkgZnVuY3Rpb25zIG11c3QKKyAqIGluaXRpYWxpemUgdGhlIEFQSS4gSG93ZXZlciwgdGhlcmUgY2FuIGJlIGEgcmFjZSBpbnZvbHZlZCB0byBjYWxsIHRoZSBmaXJzdAorICogbGlicmFyeSBmdW5jdGlvbiBpbiBtdWx0aS10aHJlYWRlZCBhcHBsaWNhdGlvbnMuIFRvIHJlc29sdmUgdGhpcyByYWNlLCBhCisgKiBtdXRleCBjYW4gYmUgdXNlZC4gVGhpcyBtdXRleCBtdXN0IGJlIGluaXRpYWxpemVkLCBidXQgaW5pdGlhbGl6ZWQgb25seSBvbmNlCisgKiBieSBhbnkgdGhyZWFkIHRoYXQgbWlnaHQgY29tcGV0ZSBmb3IgaXRzIGluaXRpYWxpemF0aW9uLiBUaGlzIGZ1bmN0aW9uCisgKiBndWFyYW50ZWVzIHRoZSBpbml0aWFsaXphdGlvbiB0byBoYXBwZW4gY29ycmVjdGx5LCBldmVuIHdoZW4gdGhlcmUgaXMgYW4KKyAqIGluaXRpYWxpemF0aW9uIHJhY2UgYmV0d2VlbiBtdWx0aXBsZSB0aHJlYWRzLgorICoKKyAqIE90aGVyd2lzZSwgdGhlIG9wZXJhdGlvbiBpcyBpZGVudGljYWwgdG8gdGhlIF91bXBfb3N1X2xvY2tfaW5pdCgpIGZ1bmN0aW9uLgorICogRm9yIG1vcmUgZGV0YWlscywgcmVmZXIgdG8gX3VtcF9vc3VfbG9ja19pbml0KCkuCisgKgorICogQHBhcmFtIHBwbG9jayBwb2ludGVyIHRvIHN0b3JhZ2UgZm9yIGEgX3VtcF9vc3VfbG9ja190IHBvaW50ZXIuIFRoaXMKKyAqIF91bXBfb3N1X2xvY2tfdCBwb2ludGVyIG1heSBwb2ludCB0byBhIF91bXBfb3N1X2xvY2tfdCB0aGF0IGhhcyBiZWVuCisgKiBpbml0aWFsaXplZCBhbHJlYWR5CisgKiBAcGFyYW0gZmxhZ3MgZmxhZ3MgY29tYmluZWQgd2l0aCBiaXR3aXNlIE9SICgnfCcpLCBvciB6ZXJvLiBUaGVyZSBhcmUKKyAqIHJlc3RyaWN0aW9ucyBvbiB3aGljaCBmbGFncyBjYW4gYmUgY29tYmluZWQuIFJlZmVyIHRvCisgKiBccmVmIF91bXBfb3N1X2xvY2tfZmxhZ3NfdCBmb3IgbW9yZSBpbmZvcm1hdGlvbi4KKyAqIFRoZSBhYnNlbmNlIG9mIGFueSBmbGFncyAodGhlIHZhbHVlIDApIHJlc3VsdHMgaW4gYSBzbGVlcGluZy1tdXRleCwKKyAqIHdoaWNoIGlzIG5vbi1pbnRlcnJ1cHRpYmxlLgorICogQHBhcmFtIGluaXRpYWwgRm9yIGZ1dHVyZSBleHBhbnNpb24gaW50byBzZW1hcGhvcmVzLiBTQlouCisgKiBAcGFyYW0gb3JkZXIgVGhlIGxvY2tpbmcgb3JkZXIgb2YgdGhlIG11dGV4LiBTQlouCisgKiBAcmV0dXJuIE9uIHN1Y2Nlc3MsIF9VTVBfT1NVX0VSUl9PSyBpcyByZXR1cm5lZCBhbmQgYSBwb2ludGVyIHRvIGFuCisgKiBpbml0aWFsaXplZCBccmVmIF91bXBfb3N1X2xvY2tfdCBvYmplY3QgaXMgd3JpdHRlbiBpbnRvIFxhICpwcGxvY2suCisgKiBfVU1QX09TVV9FUlJfRkFVTFQgaXMgcmV0dXJuZWQgb24gZmFpbHVyZS4KKyAqLworX3VtcF9vc3VfZXJyY29kZV90IF91bXBfb3N1X2xvY2tfYXV0b19pbml0KCBfdW1wX29zdV9sb2NrX3QgKipwcGxvY2ssIF91bXBfb3N1X2xvY2tfZmxhZ3NfdCBmbGFncywgdTMyIGluaXRpYWwsIHUzMiBvcmRlciApOworCisvKiogQGJyaWVmIFdhaXQgZm9yIGEgbG9jayB0byBiZSBzaWduYWxsZWQgKG9idGFpbmVkKS4KKyAqCisgKiBBZnRlciBhIHRocmVhZCBoYXMgc3VjY2Vzc2Z1bGx5IHdhaXRlZCBvbiB0aGUgbG9jaywgdGhlIGxvY2sgaXMgb2J0YWluZWQgYnkKKyAqIHRoZSB0aHJlYWQsIGFuZCBpcyBtYXJrZWQgYXMgdW5zaWduYWxsZWQuIFRoZSB0aHJlYWQgcmVsZWFzZXMgdGhlIGxvY2sgYnkKKyAqIHNpZ25hbGxpbmcgaXQuCisgKgorICogVG8gcHJldmVudCBkZWFkbG9jaywgbG9ja3MgbXVzdCBhbHdheXMgYmUgb2J0YWluZWQgaW4gdGhlIHNhbWUgb3JkZXIuCisgKgorICogQHBhcmFtIGxvY2sgdGhlIGxvY2sgdG8gd2FpdCB1cG9uIChvYnRhaW4pLgorICogQHBhcmFtIG1vZGUgdGhlIG1vZGUgaW4gd2hpY2ggdGhlIGxvY2sgc2hvdWxkIGJlIG9idGFpbmVkLiBDdXJyZW50bHkgdGhpcworICogbXVzdCBiZSBfVU1QX09TVV9MT0NLTU9ERV9SVy4KKyAqIEByZXR1cm4gT24gc3VjY2VzcywgX1VNUF9PU1VfRVJSX09LLCBfVU1QX09TVV9FUlJfRkFVTFQgb24gZXJyb3IuCisgKi8KK191bXBfb3N1X2VycmNvZGVfdCBfdW1wX29zdV9sb2NrX3dhaXQoIF91bXBfb3N1X2xvY2tfdCAqbG9jaywgX3VtcF9vc3VfbG9ja19tb2RlX3QgbW9kZSk7CisKKy8qKiBAYnJpZWYgV2FpdCBmb3IgYSBsb2NrIHRvIGJlIHNpZ25hbGxlZCAob2J0YWluZWQpIHdpdGggdGltZW91dAorICoKKyAqIEFmdGVyIGEgdGhyZWFkIGhhcyBzdWNjZXNzZnVsbHkgd2FpdGVkIG9uIHRoZSBsb2NrLCB0aGUgbG9jayBpcyBvYnRhaW5lZCBieQorICogdGhlIHRocmVhZCwgYW5kIGlzIG1hcmtlZCBhcyB1bnNpZ25hbGxlZC4gVGhlIHRocmVhZCByZWxlYXNlcyB0aGUgbG9jayBieQorICogc2lnbmFsbGluZyBpdC4KKyAqCisgKiBUbyBwcmV2ZW50IGRlYWRsb2NrLCBsb2NrcyBtdXN0IGFsd2F5cyBiZSBvYnRhaW5lZCBpbiB0aGUgc2FtZSBvcmRlci4KKyAqCisgKiBUaGlzIHZlcnNpb24gY2FuIHJldHVybiBlYXJseSBpZiBpdCBjYW5ub3Qgb2J0YWluIHRoZSBsb2NrIHdpdGhpbiB0aGUgZ2l2ZW4gdGltZW91dC4KKyAqCisgKiBAcGFyYW0gbG9jayB0aGUgbG9jayB0byB3YWl0IHVwb24gKG9idGFpbikuCisgKiBAcGFyYW0gbW9kZSB0aGUgbW9kZSBpbiB3aGljaCB0aGUgbG9jayBzaG91bGQgYmUgb2J0YWluZWQuIEN1cnJlbnRseSB0aGlzCisgKiBtdXN0IGJlIF9VTVBfT1NVX0xPQ0tNT0RFX1JXLgorICogQHBhcmFtIHRpbWVvdXQgUmVsYXRpdmUgdGltZSBpbiBtaWNyb3NlY29uZHMgZm9yIHRoZSB0aW1lb3V0CisgKiBAcmV0dXJuIF9VTVBfT1NVX0VSUl9PSyBpZiB0aGUgbG9jayB3YXMgb2J0YWluZWQsIF9VTVBfT1NVX0VSUl9USU1FT1VUIGlmIHRoZSB0aW1lb3V0IGV4cGlyZWQgb3IgIF9VTVBfT1NVX0VSUl9GQVVMVCBvbiBlcnJvci4KKyAqLworX3VtcF9vc3VfZXJyY29kZV90IF91bXBfb3N1X2xvY2tfdGltZWRfd2FpdCggX3VtcF9vc3VfbG9ja190ICpsb2NrLCBfdW1wX29zdV9sb2NrX21vZGVfdCBtb2RlLCB1NjQgdGltZW91dCk7CisKKy8qKiBAYnJpZWYgVGVzdCBmb3IgYSBsb2NrIHRvIGJlIHNpZ25hbGxlZCBhbmQgb2J0YWlucyB0aGUgbG9jayB3aGVuIHNvLgorICoKKyAqIE9idGFpbnMgdGhlIGxvY2sgb25seSB3aGVuIGl0IGlzIGluIHNpZ25hbGxlZCBzdGF0ZS4gVGhlIGxvY2sgaXMgdGhlbgorICogbWFya2VkIGFzIHVuc2lnbmFsbGVkLiBUaGUgbG9jayBpcyByZWxlYXNlZCBhZ2FpbiBieSBzaWduYWxsaW5nCisgKiBpdCBieSBfdW1wX29zdV9sb2NrX3NpZ25hbCgpLgorICoKKyAqIElmIHRoZSBsb2NrIGNvdWxkIG5vdCBiZSBvYnRhaW5lZCBpbW1lZGlhdGVseSAodGhhdCBpcywgYW5vdGhlciB0aHJlYWQKKyAqIGN1cnJlbnRseSBob2xkcyB0aGUgbG9jayksIHRoZW4gdGhpcyBmdW5jdGlvbiBcYiBkb2VzIFxiIG5vdCB3YWl0IGZvciB0aGUKKyAqIGxvY2sgdG8gYmUgaW4gYSBzaWduYWxsZWQgc3RhdGUuIEluc3RlYWQsIGFuIGVycm9yIGNvZGUgaXMgaW1tZWRpYXRlbHkKKyAqIHJldHVybmVkIHRvIGluZGljYXRlIHRoYXQgdGhlIHRocmVhZCBjb3VsZCBub3Qgb2J0YWluIHRoZSBsb2NrLgorICoKKyAqIFRvIHByZXZlbnQgZGVhZGxvY2ssIGxvY2tzIG11c3QgYWx3YXlzIGJlIG9idGFpbmVkIGluIHRoZSBzYW1lIG9yZGVyLgorICoKKyAqIEBwYXJhbSBsb2NrIHRoZSBsb2NrIHRvIHdhaXQgdXBvbiAob2J0YWluKS4KKyAqIEBwYXJhbSBtb2RlIHRoZSBtb2RlIGluIHdoaWNoIHRoZSBsb2NrIHNob3VsZCBiZSBvYnRhaW5lZC4gQ3VycmVudGx5IHRoaXMKKyAqIG11c3QgYmUgX1VNUF9PU1VfTE9DS01PREVfUlcuCisgKiBAcmV0dXJuIFdoZW4gdGhlIGxvY2sgd2FzIG9idGFpbmVkLCBfVU1QX09TVV9FUlJfT0suIElmIHRoZSBsb2NrIGNvdWxkIG5vdAorICogYmUgb2J0YWluZWQsIF9VTVBfT1NVX0VSUl9GQVVMVC4KKyAqLworX3VtcF9vc3VfZXJyY29kZV90IF91bXBfb3N1X2xvY2tfdHJ5d2FpdCggX3VtcF9vc3VfbG9ja190ICpsb2NrLCBfdW1wX29zdV9sb2NrX21vZGVfdCBtb2RlKTsKKworLyoqIEBicmllZiBTaWduYWwgKHJlbGVhc2UpIGEgbG9jay4KKyAqCisgKiBMb2NrcyBtYXkgb25seSBiZSBzaWduYWxsZWQgYnkgdGhlIHRocmVhZCB0aGF0IG9yaWdpbmFsbHkgd2FpdGVkIHVwb24gdGhlCisgKiBsb2NrLCB1bmxlc3MgdGhlIGxvY2sgd2FzIGNyZWF0ZWQgdXNpbmcgdGhlIF9VTVBfT1NVX0xPQ0tGTEFHX0FOWVVOTE9DSyBmbGFnLgorICoKKyAqIEBwYXJhbSBsb2NrIHRoZSBsb2NrIHRvIHNpZ25hbCAocmVsZWFzZSkuCisgKiBAcGFyYW0gbW9kZSB0aGUgbW9kZSBpbiB3aGljaCB0aGUgbG9jayBzaG91bGQgYmUgb2J0YWluZWQuIFRoaXMgbXVzdCBtYXRjaAorICogdGhlIG1vZGUgaW4gd2hpY2ggdGhlIGxvY2sgd2FzIHdhaXRlZCB1cG9uLgorICovCit2b2lkIF91bXBfb3N1X2xvY2tfc2lnbmFsKCBfdW1wX29zdV9sb2NrX3QgKmxvY2ssIF91bXBfb3N1X2xvY2tfbW9kZV90IG1vZGUgKTsKKworLyoqIEBicmllZiBUZXJtaW5hdGUgYSBsb2NrLgorICoKKyAqIFRoaXMgdGVybWluYXRlcyBhIGxvY2sgYW5kIGZyZWVzIGFsbCBhc3NvY2lhdGVkIHJlc291cmNlcy4KKyAqCisgKiBJdCBpcyBhIHByb2dyYW1taW5nIGVycm9yIHRvIHRlcm1pbmF0ZSB0aGUgbG9jayB3aGVuIGl0IGlzIGhlbGQgKHVuc2lnbmFsbGVkKQorICogYnkgYSB0aHJlYWQuCisgKgorICogQHBhcmFtIGxvY2sgdGhlIGxvY2sgdG8gdGVybWluYXRlLgorICovCit2b2lkIF91bXBfb3N1X2xvY2tfdGVybSggX3VtcF9vc3VfbG9ja190ICpsb2NrICk7CisvKiogQH0gKi8gLyogZW5kIGdyb3VwIF91bXBfb3N1X2xvY2sgKi8KKworLyoqIEB9ICovIC8qIGVuZCBncm91cCBvc3VhcGkgKi8KKworLyoqIEB9ICovIC8qIGVuZCBncm91cCB1ZGRhcGkgKi8KKworCisjaWZkZWYgX19jcGx1c3BsdXMKK30KKyNlbmRpZgorCisjZW5kaWYgLyogX19VTVBfT1NVX0hfXyAqLwpkaWZmIC0tZ2l0IGEvZXh5bm9zNC9oYWwvbGlidW1wL2luY2x1ZGUvdW1wL3VtcF9wbGF0Zm9ybS5oIGIvZXh5bm9zNC9oYWwvbGlidW1wL2luY2x1ZGUvdW1wL3VtcF9wbGF0Zm9ybS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjY4ZTAxYmUKLS0tIC9kZXYvbnVsbAorKysgYi9leHlub3M0L2hhbC9saWJ1bXAvaW5jbHVkZS91bXAvdW1wX3BsYXRmb3JtLmgKQEAgLTAsMCArMSw2OCBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxMC0yMDExIEFSTSBMaW1pdGVkLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICogCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICogCisgKiAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqIAorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworLyoqCisgKiBAZmlsZSB1bXBfcGxhdGZvcm0uaAorICoKKyAqIFRoaXMgZmlsZSBzaG91bGQgZGVmaW5lIFVNUF9BUElfRVhQT1JULAorICogd2hpY2ggZGljdGF0ZXMgaG93IHRoZSBVTVAgdXNlciBzcGFjZSBBUEkgc2hvdWxkIGJlIGV4cG9ydGVkL2ltcG9ydGVkLgorICogTW9kaWZ5IHRoaXMgZmlsZSwgaWYgbmVlZGVkLCB0byBtYXRjaCB5b3VyIHBsYXRmb3JtIHNldHVwLgorICovCisKKyNpZm5kZWYgX19VTVBfUExBVEZPUk1fSF9fCisjZGVmaW5lIF9fVU1QX1BMQVRGT1JNX0hfXworCisvKiogQGFkZHRvZ3JvdXAgdW1wX3VzZXJfc3BhY2VfYXBpCisgKiBAeyAqLworCisvKioKKyAqIEEgZGVmaW5lIHdoaWNoIGNvbnRyb2xzIGhvdyBVTVAgdXNlciBzcGFjZSBBUEkgZnVuY3Rpb25zIGFyZSBpbXBvcnRlZCBhbmQgZXhwb3J0ZWQuCisgKiBUaGlzIGRlZmluZSBzaG91bGQgYmUgc2V0IGJ5IHRoZSBpbXBsZW1lbnRvciBvZiB0aGUgVU1QIEFQSS4KKyAqLworI2lmIGRlZmluZWQoX1dJTjMyKQorCisjZGVmaW5lIFVNUF9BUElfRVhQT1JUCisKKyNlbGlmIGRlZmluZWQoX19TWU1CSUFOMzJfXykKKworI2RlZmluZSBVTVBfQVBJX0VYUE9SVCBJTVBPUlRfQworCisjZWxzZQorCisjaWYgZGVmaW5lZChfX0dOVUNfXykKKyNpZiBfX0dOVUNfXyA+PSA0CisjCWRlZmluZSBNQUxJX1ZJU0lCTEUgIF9fYXR0cmlidXRlX18gKCh2aXNpYmlsaXR5ICgiZGVmYXVsdCIpKSkJCS8qKjwgRnVuY3Rpb24gc2hvdWxkIGJlIHZpc2libGUgZnJvbSBvdXRzaWRlIHRoZSBkbGwgKi8JCisjZWxzZQorIwlkZWZpbmUgTUFMSV9WSVNJQkxFCisjZW5kaWYKKworI2VsaWYgZGVmaW5lZChfX0FSTUNDX1ZFUlNJT04pCisvKiBBUk1DQyBzcGVjaWZpYyAqLworIwlkZWZpbmUgTUFMSV9WSVNJQkxFICBfX2RlY2xzcGVjKGRsbGV4cG9ydCkKKworI2Vsc2UKKyMJZGVmaW5lIE1BTElfVklTSUJMRQorCisjZW5kaWYKKworI2RlZmluZSBVTVBfQVBJX0VYUE9SVCBNQUxJX1ZJU0lCTEUKKworI2VuZGlmCisKKy8qKiBAfSAqLyAvKiBlbmQgZ3JvdXAgdW1wX3VzZXJfc3BhY2VfYXBpICovCisKKworI2VuZGlmIC8qIF9fVU1QX1BMQVRGT1JNX0hfXyAqLwpkaWZmIC0tZ2l0IGEvZXh5bm9zNC9oYWwvbGlidW1wL2luY2x1ZGUvdW1wL3VtcF9yZWZfZHJ2LmggYi9leHlub3M0L2hhbC9saWJ1bXAvaW5jbHVkZS91bXAvdW1wX3JlZl9kcnYuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xOWZiMjhkCi0tLSAvZGV2L251bGwKKysrIGIvZXh5bm9zNC9oYWwvbGlidW1wL2luY2x1ZGUvdW1wL3VtcF9yZWZfZHJ2LmgKQEAgLTAsMCArMSw2NiBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxMCBBUk0gTGltaXRlZC4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqIAorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqIAorICogICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKiAKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKy8qKgorICogQGZpbGUgdW1wX3JlZl9kcnYuaAorICoKKyAqIFJlZmVyZW5jZSBkcml2ZXIgZXh0ZW5zaW9ucyB0byB0aGUgVU1QIHVzZXIgc3BhY2UgQVBJIGZvciBhbGxvY2F0aW5nIFVNUCBtZW1vcnkKKyAqLworCisjaWZuZGVmIF9VTklGSUVEX01FTU9SWV9QUk9WSURFUl9SRUZfRFJWX0hfCisjZGVmaW5lIF9VTklGSUVEX01FTU9SWV9QUk9WSURFUl9SRUZfRFJWX0hfCisKKyNpbmNsdWRlICJ1bXAuaCIKKworI2lmZGVmIF9fY3BsdXNwbHVzCitleHRlcm4gIkMiIHsKKyNlbmRpZgorCit0eXBlZGVmIGVudW0KK3sKKwkvKiBUaGlzIGVudW0gbXVzdCBtYXRjaCB3aXRoIHRoZSBJT0NUTCBlbnVtIGluIHVtcF9pb2N0bC5oICovCisJVU1QX1JFRl9EUlZfQ09OU1RSQUlOVF9OT05FID0gMCwKKwlVTVBfUkVGX0RSVl9DT05TVFJBSU5UX1BIWVNJQ0FMTFlfTElORUFSID0gMSwKKwlVTVBfUkVGX0RSVl9DT05TVFJBSU5UX1VTRV9DQUNIRSA9IDQsCit9IHVtcF9hbGxvY19jb25zdHJhaW50czsKKworLyoqIEFsbG9jYXRlIGFuIFVNUCBoYW5kbGUgY29udGFpbmluZyBhIG1lbW9yeSBidWZmZXIuCisgKiBJbnB1dDogU2l6ZTogVGhlIG1pbmltdW0gc2l6ZSBmb3IgdGhlIGFsbG9jYXRpb24uCisgKiBVc2FnZTogSWYgdGhpcyBpcyBVTVBfUkVGX0RSVl9DT05TVFJBSU5UX1VTRV9DQUNIRSwgdGhlIGFsbG9jYXRpb24gaXMgbWFwcGVkIGFzIGNhY2hlZCBieSB0aGUgY3B1LgorICogICAgICAgIElmIGl0IGlzIFVNUF9SRUZfRFJWX0NPTlNUUkFJTlRfTk9ORSBpdCBpcyBtYXBwZWQgYXMgbm9uY2FjaGVkLgorICogICAgICAgIFRoZSBmbGFnIFVNUF9SRUZfRFJWX0NPTlNUUkFJTlRfUEhZU0lDQUxMWV9MSU5FQVIgaXMgbm90IHN1cHBvcnRlZC4qLworVU1QX0FQSV9FWFBPUlQgdW1wX2hhbmRsZSB1bXBfcmVmX2Rydl9hbGxvY2F0ZSh1bnNpZ25lZCBsb25nIHNpemUsIHVtcF9hbGxvY19jb25zdHJhaW50cyB1c2FnZSk7CisKK3R5cGVkZWYgZW51bQoreworCVVNUF9NU1lOQ19DTEVBTiA9IDAgLAorCVVNUF9NU1lOQ19DTEVBTl9BTkRfSU5WQUxJREFURSA9IDEsCisJVU1QX01TWU5DX1JFQURPVVRfQ0FDSEVfRU5BQkxFRCA9IDEyOCwKK30gdW1wX2NwdV9tc3luY19vcDsKKworLyoqIEZsdXNoaW5nIGNhY2hlIGZvciBhbiB1bXBfaGFuZGxlLgorICogVGhlIGZ1bmN0aW9uIHdpbGwgYWx3YXlzIENMRUFOX0FORF9JTlZBTElEQVRFIGFzIGxvbmcgYXMgdGhlIFxhIG9wIGlzIG5vdCBVTVBfTVNZTkNfUkVBRE9VVF9DQUNIRV9FTkFCTEVELgorICogSWYgc28gaXQgd2lsbCBvbmx5IHJlcG9ydCBiYWNrIGlmIHRoZSBnaXZlbiB1bXBfaGFuZGxlIGlzIGNhY2hlYWJsZS4KKyAqIEF0IHRoZSBtb21lbWVudCB0aGUgaW1wbGVtZW50YXRpb24gZG9lcyBub3QgdXNlIFxhIGFkZHJlc3Mgb3IgXGEgc2l6ZS4KKyAqIFJldHVybiB2YWx1ZSBpcyAxIGlmIGNhY2hlIGlzIGVuYWJsZWQsIGFuZCAwIGlmIGl0IGlzIGRpc2FibGVkIGZvciB0aGUgZ2l2ZW4gYWxsb2NhdGlvbi4qLworVU1QX0FQSV9FWFBPUlQgaW50IHVtcF9jcHVfbXN5bmNfbm93KHVtcF9oYW5kbGUgbWVtLCB1bXBfY3B1X21zeW5jX29wIG9wLCB2b2lkKiBhZGRyZXNzLCBpbnQgc2l6ZSk7CisKKworI2lmZGVmIF9fY3BsdXNwbHVzCit9CisjZW5kaWYKKworI2VuZGlmIC8qX1VOSUZJRURfTUVNT1JZX1BST1ZJREVSX1JFRl9EUlZfSF8gKi8KZGlmZiAtLWdpdCBhL2V4eW5vczQvaGFsL2xpYnVtcC9pbmNsdWRlL3VtcC91bXBfdWtfdHlwZXMuaCBiL2V4eW5vczQvaGFsL2xpYnVtcC9pbmNsdWRlL3VtcC91bXBfdWtfdHlwZXMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xYTRjMWM4Ci0tLSAvZGV2L251bGwKKysrIGIvZXh5bm9zNC9oYWwvbGlidW1wL2luY2x1ZGUvdW1wL3VtcF91a190eXBlcy5oCkBAIC0wLDAgKzEsMTQ3IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDEwIEFSTSBMaW1pdGVkLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICogCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICogCisgKiAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqIAorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworLyoqCisgKiBAZmlsZSB1bXBfdWtfdHlwZXMuaAorICogRGVmaW5lcyB0aGUgdHlwZXMgYW5kIGNvbnN0YW50cyB1c2VkIGluIHRoZSB1c2VyLWtlcm5lbCBpbnRlcmZhY2UKKyAqLworCisjaWZuZGVmIF9fVU1QX1VLX1RZUEVTX0hfXworI2RlZmluZSBfX1VNUF9VS19UWVBFU19IX18KKworI2lmZGVmIF9fY3BsdXNwbHVzCitleHRlcm4gIkMiCit7CisjZW5kaWYKKworLyogSGVscGVycyBmb3IgQVBJIHZlcnNpb24gaGFuZGxpbmcgKi8KKyNkZWZpbmUgTUFLRV9WRVJTSU9OX0lEKHgpICgoKHgpIDw8IDE2VUwpIHwgKHgpKQorI2RlZmluZSBJU19WRVJTSU9OX0lEKHgpICgoKHgpICYgMHhGRkZGKSA9PSAoKCh4KSA+PiAxNlVMKSAmIDB4RkZGRikpCisjZGVmaW5lIEdFVF9WRVJTSU9OKHgpICgoKHgpID4+IDE2VUwpICYgMHhGRkZGKQorI2RlZmluZSBJU19BUElfTUFUQ0goeCwgeSkgKElTX1ZFUlNJT05fSUQoKHgpKSAmJiBJU19WRVJTSU9OX0lEKCh5KSkgJiYgKEdFVF9WRVJTSU9OKCh4KSkgPT0gR0VUX1ZFUlNJT04oKHkpKSkpCisKKy8qKgorICogQVBJIHZlcnNpb24gZGVmaW5lLgorICogSW5kaWNhdGVzIHRoZSB2ZXJzaW9uIG9mIHRoZSBrZXJuZWwgQVBJCisgKiBUaGUgdmVyc2lvbiBpcyBhIDE2Yml0IGludGVnZXIgaW5jcmVtZW50ZWQgb24gZWFjaCBBUEkgY2hhbmdlLgorICogVGhlIDE2Yml0IGludGVnZXIgaXMgc3RvcmVkIHR3aWNlIGluIGEgMzJiaXQgaW50ZWdlcgorICogU28gZm9yIHZlcnNpb24gMSB0aGUgdmFsdWUgd291bGQgYmUgMHgwMDAxMDAwMQorICovCisjZGVmaW5lIFVNUF9JT0NUTF9BUElfVkVSU0lPTiBNQUtFX1ZFUlNJT05fSUQoMikKKwordHlwZWRlZiBlbnVtCit7CisJX1VNUF9JT0NfUVVFUllfQVBJX1ZFUlNJT04gPSAxLAorCV9VTVBfSU9DX0FMTE9DQVRFLAorCV9VTVBfSU9DX1JFTEVBU0UsCisJX1VNUF9JT0NfU0laRV9HRVQsCisJX1VNUF9JT0NfTUFQX01FTSwgICAgLyogbm90IHVzZWQgaW4gTGludXggKi8KKwlfVU1QX0lPQ19VTk1BUF9NRU0sICAvKiBub3QgdXNlZCBpbiBMaW51eCAqLworCV9VTVBfSU9DX01TWU5DLAorfV91bXBfdWtfZnVuY3Rpb25zOworCit0eXBlZGVmIGVudW0KK3sKKwlVTVBfUkVGX0RSVl9VS19DT05TVFJBSU5UX05PTkUgPSAwLAorCVVNUF9SRUZfRFJWX1VLX0NPTlNUUkFJTlRfUEhZU0lDQUxMWV9MSU5FQVIgPSAxLAorCVVNUF9SRUZfRFJWX1VLX0NPTlNUUkFJTlRfVVNFX0NBQ0hFID0gNCwKK30gdW1wX3VrX2FsbG9jX2NvbnN0cmFpbnRzOworCit0eXBlZGVmIGVudW0KK3sKKwlfVU1QX1VLX01TWU5DX0NMRUFOID0gMCwKKwlfVU1QX1VLX01TWU5DX0NMRUFOX0FORF9JTlZBTElEQVRFID0gMSwKKwlfVU1QX1VLX01TWU5DX1JFQURPVVRfQ0FDSEVfRU5BQkxFRCA9IDEyOCwKK30gdW1wX3VrX21zeW5jX29wOworCisvKioKKyAqIEdldCBBUEkgdmVyc2lvbiAoW2luLG91dF0gdTMyIGFwaV92ZXJzaW9uLCBbb3V0XSB1MzIgY29tcGF0aWJsZSkKKyAqLwordHlwZWRlZiBzdHJ1Y3QgX3VtcF91a19hcGlfdmVyc2lvbl9zCit7CisJdm9pZCAqY3R4OyAgICAgIC8qKjwgW2luLG91dF0gdXNlci1rZXJuZWwgY29udGV4dCAodHJhc2hlZCBvbiBvdXRwdXQpICovCisJdTMyIHZlcnNpb247ICAgIC8qKjwgU2V0IHRvIHRoZSB1c2VyIHNwYWNlIHZlcnNpb24gb24gZW50cnksIHN0b3JlcyB0aGUgZGV2aWNlIGRyaXZlciB2ZXJzaW9uIG9uIGV4aXQgKi8KKwl1MzIgY29tcGF0aWJsZTsgLyoqPCBOb24tbnVsbCBpZiB0aGUgZGV2aWNlIGlzIGNvbXBhdGlibGUgd2l0aCB0aGUgY2xpZW50ICovCit9IF91bXBfdWtfYXBpX3ZlcnNpb25fczsKKworLyoqCisgKiBBTExPQ0FURSAoW291dF0gdTMyIHNlY3VyZV9pZCwgW2luLG91dF0gdTMyIHNpemUsICBbaW5dIGNvbnRyYWludHMpCisgKi8KK3R5cGVkZWYgc3RydWN0IF91bXBfdWtfYWxsb2NhdGVfcworeworCXZvaWQgKmN0eDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKio8IFtpbixvdXRdIHVzZXIta2VybmVsIGNvbnRleHQgKHRyYXNoZWQgb24gb3V0cHV0KSAqLworCXUzMiBzZWN1cmVfaWQ7ICAgICAgICAgICAgICAgICAgICAgICAgICAvKio8IFJldHVybiB2YWx1ZSBmcm9tIEREIHRvIFVzZXJkcml2ZXIgKi8KKwl1MzIgc2l6ZTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyoqPCBJbnB1dCBhbmQgb3V0cHV0LiBSZXF1ZXN0ZWQgc2l6ZTsgaW5wdXQuIFJldHVybmVkIHNpemU7IG91dHB1dCAqLworCXVtcF91a19hbGxvY19jb25zdHJhaW50cyBjb25zdHJhaW50czsgICAvKio8IE9ubHkgaW5wdXQgdG8gRGV2aWNlZHJpdmVyICovCit9IF91bXBfdWtfYWxsb2NhdGVfczsKKworLyoqCisgKiBTSVpFX0dFVCAoW2luXSB1MzIgc2VjdXJlX2lkLCBbb3V0XXNpemUgKQorICovCit0eXBlZGVmIHN0cnVjdCBfdW1wX3VrX3NpemVfZ2V0X3MKK3sKKwl2b2lkICpjdHg7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyoqPCBbaW4sb3V0XSB1c2VyLWtlcm5lbCBjb250ZXh0ICh0cmFzaGVkIG9uIG91dHB1dCkgKi8KKwl1MzIgc2VjdXJlX2lkOyAgICAgICAgICAgICAgICAgICAgICAgICAgLyoqPCBJbnB1dCB0byBERCAqLworCXUzMiBzaXplOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKio8IFJldHVybmVkIHNpemU7IG91dHB1dCAqLworfSBfdW1wX3VrX3NpemVfZ2V0X3M7CisKKy8qKgorICogUmVsZWFzZSAoW2luXSB1MzIgc2VjdXJlX2lkKQorICovCit0eXBlZGVmIHN0cnVjdCBfdW1wX3VrX3JlbGVhc2VfcworeworCXZvaWQgKmN0eDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKio8IFtpbixvdXRdIHVzZXIta2VybmVsIGNvbnRleHQgKHRyYXNoZWQgb24gb3V0cHV0KSAqLworCXUzMiBzZWN1cmVfaWQ7ICAgICAgICAgICAgICAgICAgICAgICAgICAvKio8IElucHV0IHRvIEREICovCit9IF91bXBfdWtfcmVsZWFzZV9zOworCit0eXBlZGVmIHN0cnVjdCBfdW1wX3VrX21hcF9tZW1fcworeworCXZvaWQgKmN0eDsgICAgICAgICAgICAgICAgICAgICAgLyoqPCBbaW4sb3V0XSB1c2VyLWtlcm5lbCBjb250ZXh0ICh0cmFzaGVkIG9uIG91dHB1dCkgKi8KKwl2b2lkICptYXBwaW5nOyAgICAgICAgICAgICAgICAgIC8qKjwgW291dF0gUmV0dXJucyB1c2VyLXNwYWNlIHZpcnR1YWwgYWRkcmVzcyBmb3IgdGhlIG1hcHBpbmcgKi8KKwl2b2lkICpwaHlzX2FkZHI7ICAgICAgICAgICAgICAgIC8qKjwgW2luXSBwaHlzaWNhbCBhZGRyZXNzICovCisJdW5zaWduZWQgbG9uZyBzaXplOyAgICAgICAgICAgICAvKio8IFtpbl0gc2l6ZSAqLworCXUzMiBzZWN1cmVfaWQ7ICAgICAgICAgICAgICAgICAgLyoqPCBbaW5dIHNlY3VyZV9pZCB0byBhc3NpZ24gdG8gbWFwcGluZyAqLworCXZvaWQgKiBfdWtrX3ByaXZhdGU7ICAgICAgICAgICAgLyoqPCBPbmx5IHVzZWQgaW5zaWRlIGxpbnV4IHBvcnQgYmV0d2VlbiBrZXJuZWwgZnJvbnRlbmQgYW5kIGNvbW1vbiBwYXJ0IHRvIHN0b3JlIHZtYSAqLworCXUzMiBjb29raWU7CisJdTMyIGlzX2NhY2hlZDsgICAgICAgICAgICAvKio8IFtpbixvdXRdIGNhY2hpbmcgb2YgQ1BVIG1hcHBpbmdzICovCit9IF91bXBfdWtfbWFwX21lbV9zOworCit0eXBlZGVmIHN0cnVjdCBfdW1wX3VrX3VubWFwX21lbV9zCit7CisJdm9pZCAqY3R4OyAgICAgICAgICAgIC8qKjwgW2luLG91dF0gdXNlci1rZXJuZWwgY29udGV4dCAodHJhc2hlZCBvbiBvdXRwdXQpICovCisJdm9pZCAqbWFwcGluZzsKKwl1MzIgc2l6ZTsKKwl2b2lkICogX3Vra19wcml2YXRlOworCXUzMiBjb29raWU7Cit9IF91bXBfdWtfdW5tYXBfbWVtX3M7CisKK3R5cGVkZWYgc3RydWN0IF91bXBfdWtfbXN5bmNfcworeworCXZvaWQgKmN0eDsgICAgICAgICAgICAvKio8IFtpbixvdXRdIHVzZXIta2VybmVsIGNvbnRleHQgKHRyYXNoZWQgb24gb3V0cHV0KSAqLworCXZvaWQgKm1hcHBpbmc7ICAgICAgICAvKio8IFtpbl0gbWFwcGluZyBhZGRyICovCisJdm9pZCAqYWRkcmVzczsgICAgICAgIC8qKjwgW2luXSBmbHVzaCBzdGFydCBhZGRyICovCisJdTMyIHNpemU7ICAgICAgICAgICAgIC8qKjwgW2luXSBzaXplIHRvIGZsdXNoICovCisJdW1wX3VrX21zeW5jX29wIG9wOyAgIC8qKjwgW2luXSBmbHVzaCBvcGVyYXRpb24gKi8KKwl1MzIgY29va2llOyAgICAgICAgICAgLyoqPCBbaW5dIGNvb2tpZSBzdG9yZWQgd2l0aCByZWZlcmVuY2UgdG8gdGhlIGtlcm5lbCBtYXBwaW5nIGludGVybmFscyAqLworCXUzMiBzZWN1cmVfaWQ7ICAgICAgICAvKio8IFtpbl0gY29va2llIHN0b3JlZCB3aXRoIHJlZmVyZW5jZSB0byB0aGUga2VybmVsIG1hcHBpbmcgaW50ZXJuYWxzICovCisJdTMyIGlzX2NhY2hlZDsgICAgICAgIC8qKjwgW291dF0gY2FjaGluZyBvZiBDUFUgbWFwcGluZ3MgKi8KK30gX3VtcF91a19tc3luY19zOworCisjaWZkZWYgX19jcGx1c3BsdXMKK30KKyNlbmRpZgorCisjZW5kaWYgLyogX19VTVBfVUtfVFlQRVNfSF9fICovCmRpZmYgLS1naXQgYS9leHlub3M0L2hhbC9saWJ1bXAvb3MvbGludXgvdW1wX2lvY3RsLmggYi9leHlub3M0L2hhbC9saWJ1bXAvb3MvbGludXgvdW1wX2lvY3RsLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTk3ODg1OAotLS0gL2Rldi9udWxsCisrKyBiL2V4eW5vczQvaGFsL2xpYnVtcC9vcy9saW51eC91bXBfaW9jdGwuaApAQCAtMCwwICsxLDU1IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDEwLTIwMTEgQVJNIExpbWl0ZWQuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKiAKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKiAKKyAqICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICogCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaWZuZGVmIF9fVU1QX0lPQ1RMX0hfXworI2RlZmluZSBfX1VNUF9JT0NUTF9IX18KKworI2lmZGVmIF9fY3BsdXNwbHVzCitleHRlcm4gIkMiCit7CisjZW5kaWYKKworI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+CisjaW5jbHVkZSA8bGludXgvaW9jdGwuaD4KKworI2luY2x1ZGUgPHVtcF91a190eXBlcy5oPgorCisjaWZuZGVmIF9fdXNlcgorI2RlZmluZSBfX3VzZXIKKyNlbmRpZgorCisKKy8qKgorICogQGZpbGUgVU1QX2lvY3RsLmgKKyAqIFRoaXMgZmlsZSBkZXNjcmliZXMgdGhlIGludGVyZmFjZSBuZWVkZWQgdG8gdXNlIHRoZSBMaW51eCBkZXZpY2UgZHJpdmVyLgorICogVGhlIGludGVyZmFjZSBpcyB1c2VkIGJ5IHRoZSB1c2VycGFjZSBVTVAgZHJpdmVyLgorICovCisKKyNkZWZpbmUgVU1QX0lPQ1RMX05SIDB4OTAKKworCisjZGVmaW5lIFVNUF9JT0NfUVVFUllfQVBJX1ZFUlNJT04gX0lPUihVTVBfSU9DVExfTlIsIF9VTVBfSU9DX1FVRVJZX0FQSV9WRVJTSU9OLCBfdW1wX3VrX2FwaV92ZXJzaW9uX3MpCisjZGVmaW5lIFVNUF9JT0NfQUxMT0NBVEUgIF9JT1dSKFVNUF9JT0NUTF9OUiwgIF9VTVBfSU9DX0FMTE9DQVRFLCAgX3VtcF91a19hbGxvY2F0ZV9zKQorI2RlZmluZSBVTVBfSU9DX1JFTEVBU0UgIF9JT1IoVU1QX0lPQ1RMX05SLCAgX1VNUF9JT0NfUkVMRUFTRSwgIF91bXBfdWtfcmVsZWFzZV9zKQorI2RlZmluZSBVTVBfSU9DX1NJWkVfR0VUICBfSU9XUihVTVBfSU9DVExfTlIsICBfVU1QX0lPQ19TSVpFX0dFVCwgX3VtcF91a19zaXplX2dldF9zKQorI2RlZmluZSBVTVBfSU9DX01TWU5DICAgICBfSU9XKFVNUF9JT0NUTF9OUiwgIF9VTVBfSU9DX01TWU5DLCBfdW1wX3VrX3NpemVfZ2V0X3MpCisKKworI2lmZGVmIF9fY3BsdXNwbHVzCit9CisjZW5kaWYKKworI2VuZGlmIC8qIF9fVU1QX0lPQ1RMX0hfXyAqLwpkaWZmIC0tZ2l0IGEvZXh5bm9zNC9oYWwvbGlidW1wL29zL2xpbnV4L3VtcF9vc3VfbG9ja3MuYyBiL2V4eW5vczQvaGFsL2xpYnVtcC9vcy9saW51eC91bXBfb3N1X2xvY2tzLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTdiYTg1OAotLS0gL2Rldi9udWxsCisrKyBiL2V4eW5vczQvaGFsL2xpYnVtcC9vcy9saW51eC91bXBfb3N1X2xvY2tzLmMKQEAgLTAsMCArMSw1MzcgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTAtMjAxMSBBUk0gTGltaXRlZC4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqIAorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqIAorICogICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKiAKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpZiAoKCFkZWZpbmVkIF9YT1BFTl9TT1VSQ0UpIHx8ICgoX1hPUEVOX1NPVVJDRSAtIDApIDwgNjAwKSkKKyN1bmRlZiBfWE9QRU5fU09VUkNFCisjZGVmaW5lIF9YT1BFTl9TT1VSQ0UgNjAwCisjZW5kaWYKKworCisjZGVmaW5lIF9QT1NJWF9DX1NPVVJDRSAyMDAxMTJMCisKKyNpbmNsdWRlIDx1bXAvdW1wX29zdS5oPgorI2luY2x1ZGUgPHVtcC91bXBfZGVidWcuaD4KKworI2luY2x1ZGUgPHB0aHJlYWQuaD4KKyNpbmNsdWRlIDx0aW1lLmg+CisjaW5jbHVkZSA8c3lzL3RpbWUuaD4KKyNpbmNsdWRlIDxlcnJuby5oPgorCisvKioKKyAqIEBmaWxlIHVtcF9vc3VfbG9ja3MuYworICogRmlsZSBpbXBsZW1lbnRzIHRoZSB1c2VyIHNpZGUgb2YgdGhlIE9TIGludGVyZmFjZQorICovCisKKy8qKiBAb3B0IE1vc3Qgb2YgdGhlIHRpbWUsIHdlIHVzZSB0aGUgcGxhaW4gbXV0ZXggdHlwZSBvZiBvc3VfbG9jaywgYW5kIHNvCisgKiBvbmx5IHJlcXVpcmUgdGhlIGZsYWdzIGFuZCBtdXRleCBtZW1iZXJzLiBUaGlzIGNvc3RzIDIgZXh0cmEgRFdPUkRTLCBidXQKKyAqIG1vc3Qgb2YgdGhlIHRpbWUgd2UgZG9uJ3QgdXNlIHRob3NlIERXT1JEUy4KKyAqIFRoZXJlZm9yZSwgQU5ZX1VOTE9DSyB0eXBlIG9zdV9sb2NrcyBjYW4gYmUgaW1wbGVtZW50ZWQgYXMgYSBzZWNvbmQKKyAqIHN0cnVjdHVyZSBjb250YWluaW5nIHRoZSBtZW1iZXIgX3VtcF9vc3VfbG9ja190IGxvY2tfdCwgcGx1cyB0aGUgZXh0cmEKKyAqIHN0YXRlIHJlcXVpcmVkLiBUaGVuLCB3ZSB1c2UgJmNvbnRhaW5lci0+bG9ja190IHdoZW4gcGFzc2luZyBvdXQgb2YgdGhlCisgKiBPU1UgYXBpLCBhbmQgQ09OVEFJTkVSX09GKCkgd2hlbiBwYXNzaW5nIGJhY2sgaW4gdG8gcmVjb3ZlciB0aGUgb3JpZ2luYWwKKyAqIHN0cnVjdHVyZS4gKi8KKworLyoqIFByaXZhdGUgZGVjbGFyYXRpb24gb2YgdGhlIE9TVSBsb2NrIHR5cGUgKi8KK3N0cnVjdCBfdW1wX29zdV9sb2NrX3Rfc3RydWN0Cit7CisJLyoqIEF0IHByZXNlbnQsIG9ubHkgdHdvIHR5cGVzIG9mIG11dGV4LCBzbyB3ZSBzdG9yZSB0aGlzIGluZm9ybWF0aW9uIGFzCisJICogdGhlIGZsYWdzIHN1cHBsaWVkIGF0IGluaXQgdGltZSAqLworCV91bXBfb3N1X2xvY2tfZmxhZ3NfdCBmbGFnczsKKworCXB0aHJlYWRfbXV0ZXhfdCBtdXRleDsgLyoqPCBVc2VkIGluIGJvdGggcGxhaW4gYW5kIEFOWV9VTkxPQ0sgb3N1X2xvY2tzICovCisKKwkvKiBFeHRyYSBTdGF0ZSBmb3IgQU5ZX1VOTE9DSyBvc3VfbG9ja3MuIFRoZXNlIGFyZSBVTklOSVRJQUxJWkVEIHdoZW4KKwkgKiBmbGFncyBkb2VzIG5vdCBjb250YWluIF9VTVBfT1NVX0xPQ0tGTEFHX0FOWVVOTE9DSzogKi8KKwlwdGhyZWFkX2NvbmRfdCBjb25kaXRpb247ICAvKio8IFRoZSBjb25kaXRpb24gb2JqZWN0IHRvIHVzZSB3aGlsZSBibG9ja2luZyAqLworCXVtcF9ib29sIHN0YXRlOyAgLyoqPCBUaGUgYm9vbGVhbiB3aGljaCBpbmRpY2F0ZXMgdGhlIGV2ZW50J3Mgc3RhdGUgKi8KKworCVVNUF9ERUJVR19DT0RFKAorCQkJCSAgLyoqIGRlYnVnIGNoZWNraW5nIG9mIGxvY2tzICovCisJCQkJICBfdW1wX29zdV9sb2NrX21vZGVfdCBsb2NrZWRfYXM7CisJKSAvKiBVTVBfREVCVUdfQ09ERSAqLworCit9OworCisvKiBQcm92aWRlIHR3byBzdGF0aWNhbGx5IGluaXRpYWxpemVkIGxvY2tzICovCitVTVBfU1RBVElDIF91bXBfb3N1X2xvY2tfdCBfdW1wX29zdV9zdGF0aWNfbG9ja3NbXSA9Cit7CisJeworCSAgICBfVU1QX09TVV9MT0NLRkxBR19TVEFUSUMsCisJICAgIFBUSFJFQURfTVVURVhfSU5JVElBTElaRVIsCisJICAgIFBUSFJFQURfQ09ORF9JTklUSUFMSVpFUiwKKwkgICAgVU1QX0ZBTFNFLAorCQlVTVBfREVCVUdfQ09ERSggX1VNUF9PU1VfTE9DS01PREVfVU5ERUYgKQorCX0sCisJeworCSAgICBfVU1QX09TVV9MT0NLRkxBR19TVEFUSUMsCisJICAgIFBUSFJFQURfTVVURVhfSU5JVElBTElaRVIsCisJICAgIFBUSFJFQURfQ09ORF9JTklUSUFMSVpFUiwKKwkgICAgVU1QX0ZBTFNFLAorCQlVTVBfREVCVUdfQ09ERSggX1VNUF9PU1VfTE9DS01PREVfVU5ERUYgKQorCX0sCisJeworCSAgICBfVU1QX09TVV9MT0NLRkxBR19TVEFUSUMsCisJICAgIFBUSFJFQURfTVVURVhfSU5JVElBTElaRVIsCisJICAgIFBUSFJFQURfQ09ORF9JTklUSUFMSVpFUiwKKwkgICAgVU1QX0ZBTFNFLAorCQlVTVBfREVCVUdfQ09ERSggX1VNUF9PU1VfTE9DS01PREVfVU5ERUYgKQorCX0sCisJeworCSAgICBfVU1QX09TVV9MT0NLRkxBR19TVEFUSUMsCisJICAgIFBUSFJFQURfTVVURVhfSU5JVElBTElaRVIsCisJICAgIFBUSFJFQURfQ09ORF9JTklUSUFMSVpFUiwKKwkgICAgVU1QX0ZBTFNFLAorCQlVTVBfREVCVUdfQ09ERSggX1VNUF9PU1VfTE9DS01PREVfVU5ERUYgKQorCX0sCit9OworCisvKiBDcml0aWNhbCBzZWN0aW9uIGZvciBhdXRvX2luaXQgKi8KK1VNUF9TVEFUSUMgcHRocmVhZF9tdXRleF90CXN0YXRpY19hdXRvX2luaXRfbXV0ZXggPSBQVEhSRUFEX01VVEVYX0lOSVRJQUxJWkVSOworCisKK191bXBfb3N1X2VycmNvZGVfdCBfdW1wX29zdV9sb2NrX2F1dG9faW5pdCggX3VtcF9vc3VfbG9ja190ICoqcHBsb2NrLCBfdW1wX29zdV9sb2NrX2ZsYWdzX3QgZmxhZ3MsIHUzMiBpbml0aWFsLCB1MzIgb3JkZXIgKQoreworCWludCBjYWxsX3Jlc3VsdDsKKwkvKiBWYWxpZGF0ZSBwYXJhbWV0ZXJzOiAqLworCVVNUF9ERUJVR19BU1NFUlRfUE9JTlRFUiggcHBsb2NrICk7CisKKwkvKiogQG9wdCBXZSBkb24ndCBsb2NrIHRoZSBDcml0aWNhbCBTZWN0aW9uIG9yIGRvIGFueXRoaW5nIGlmIHRoaXMgaXMgYWxyZWFkeSBub24tbnVsbCAqLworCWlmICggTlVMTCAhPSAqcHBsb2NrKQorCXsKKwkJcmV0dXJuIF9VTVBfT1NVX0VSUl9PSzsKKwl9CisKKwkvKiBXZSBNSUdIVCBuZWVkIHRvIGluaXRpYWxpemUgaXQsIGxvY2sgdGhlIENyaXRpY2FsIFNlY3Rpb24gYW5kIGNoZWNrIGFnYWluICovCisJY2FsbF9yZXN1bHQgPSBwdGhyZWFkX211dGV4X2xvY2soJnN0YXRpY19hdXRvX2luaXRfbXV0ZXgpOworCS8qIEl0IHdvdWxkIGJlIGEgcHJvZ3JhbW1pbmcgZXJyb3IgZm9yIHRoaXMgdG8gZmFpbDogKi8KKwlVTVBfREVCVUdfQVNTRVJUKCAwID09IGNhbGxfcmVzdWx0LAorCQkJCQkgICAoImZhaWxlZCB0byBsb2NrIGNyaXRpY2FsIHNlY3Rpb25cbiIpICk7CisKKwlpZiAoIE5VTEwgIT0gKnBwbG9jayApCisJeworCQkvKgorCQkJV2UgY2F1Z2h0IGEgcmFjZSBjb25kaXRpb24gdG8gaW5pdGlhbGl6ZSB0aGlzIG9zdV9sb2NrLgorCQkJVGhlIG90aGVyIHRocmVhZCB3b24gdGhlIHJhY2UsIHNvIHRoZSBvc3VfbG9jayBpcyBub3cgaW5pdGlhbGl6ZWQuCisJCSovCisJCWNhbGxfcmVzdWx0ID0gcHRocmVhZF9tdXRleF91bmxvY2soJnN0YXRpY19hdXRvX2luaXRfbXV0ZXgpOworCisJCVVNUF9ERUJVR19BU1NFUlQoMCA9PSBjYWxsX3Jlc3VsdCwKKwkJCQkJCSAgKCJmYWlsZWQgdG8gdW5sb2NrIGNyaXRpY2FsIHNlY3Rpb25cbiIpKTsKKworCQlyZXR1cm4gX1VNUF9PU1VfRVJSX09LOworCX0KKworCS8qIFdlJ3JlIHRoZSBmaXJzdCB0aHJlYWQgaW46IGluaXRpYWxpemUgdGhlIG9zdV9sb2NrICovCisJKnBwbG9jayA9IF91bXBfb3N1X2xvY2tfaW5pdCggZmxhZ3MsIGluaXRpYWwsIG9yZGVyICk7CisKKwlpZiAoIE5VTEwgPT0gKnBwbG9jayApCisJeworCQkvKiBvc3VfbG9jayBjcmVhdGlvbiBmYWlsZWQgKi8KKwkJY2FsbF9yZXN1bHQgPSBwdGhyZWFkX211dGV4X3VubG9jaygmc3RhdGljX2F1dG9faW5pdF9tdXRleCk7CisJCVVNUF9ERUJVR19BU1NFUlQoMCA9PSBjYWxsX3Jlc3VsdCwKKwkJCQkJCSAgKCJmYWlsZWQgdG8gdW5sb2NrIGNyaXRpY2FsIHNlY3Rpb25cbiIpKTsKKworCQlyZXR1cm4gX1VNUF9PU1VfRVJSX0ZBVUxUOworCX0KKworCisJLyogb3N1X2xvY2sgY3JlYXRlZCBPSyAqLworCWNhbGxfcmVzdWx0ID0gcHRocmVhZF9tdXRleF91bmxvY2soJnN0YXRpY19hdXRvX2luaXRfbXV0ZXgpOworCisJVU1QX0RFQlVHX0FTU0VSVCgwID09IGNhbGxfcmVzdWx0LAorCQkJCQkgICgiZmFpbGVkIHRvIHVubG9jayBjcml0aWNhbCBzZWN0aW9uXG4iKSk7CisKKwlVTVBfSUdOT1JFKCBjYWxsX3Jlc3VsdCApOworCisJcmV0dXJuIF9VTVBfT1NVX0VSUl9PSzsKK30KKworCitfdW1wX29zdV9sb2NrX3QgKl91bXBfb3N1X2xvY2tfaW5pdCggX3VtcF9vc3VfbG9ja19mbGFnc190IGZsYWdzLCB1MzIgaW5pdGlhbCwgdTMyIG9yZGVyICkKK3sKKwlfdW1wX29zdV9sb2NrX3QgKiBsb2NrOworCXB0aHJlYWRfbXV0ZXhhdHRyX3QgbXV0ZXhfYXR0cmlidXRlczsKKworCS8qIFZhbGlkYXRlIHBhcmFtZXRlcnM6ICovCisJLyogRmxhZ3MgYWNjZXB0YWJsZSAqLworCVVNUF9ERUJVR19BU1NFUlQoIDAgPT0gKCBmbGFncyAmIH4oIF9VTVBfT1NVX0xPQ0tGTEFHX0FOWVVOTE9DSykpLAorCQkJCQkgICAoImluY29ycmVjdCBmbGFncyBvciB0cnlpbmcgdG8gaW5pdGlhbGlzZSBhIHN0YXRpY2FsbHkgaW5pdGlhbGl6ZWQgbG9jaywgJS44WFxuIiwgZmxhZ3MpICk7CisKKwkvKiBQYXJhbWV0ZXIgaW5pdGlhbCBTQlogLSBmb3IgZnV0dXJlIGV4cGFuc2lvbiAqLworCVVNUF9ERUJVR19BU1NFUlQoIDAgPT0gaW5pdGlhbCwKKwkJCQkJICAgKCJpbml0aWFsIG11c3QgYmUgemVyb1xuIikgKTsKKworCWlmICgwICE9IHB0aHJlYWRfbXV0ZXhhdHRyX2luaXQoJm11dGV4X2F0dHJpYnV0ZXMpKQorCXsKKwkJcmV0dXJuIE5VTEw7CisJfQorCisjaWYgVU1QX0RFQlVHX0VYVEVOREVEX01VVEVYX0xPQ0tfQ0hFQ0tJTkcKKyNkZWZpbmUgVU1QX1BUSFJFQURTX01VVEVYX1RZUEUgUFRIUkVBRF9NVVRFWF9FUlJPUkNIRUNLCisjZWxzZQorI2RlZmluZSBVTVBfUFRIUkVBRFNfTVVURVhfVFlQRSBQVEhSRUFEX01VVEVYX0RFRkFVTFQKKyNlbmRpZgorCisJaWYgKDAgIT0gcHRocmVhZF9tdXRleGF0dHJfc2V0dHlwZSgmbXV0ZXhfYXR0cmlidXRlcywgVU1QX1BUSFJFQURTX01VVEVYX1RZUEUpKQorCXsKKwkJLyoqIFJldHVybiBOVUxMIG9uIGZhaWx1cmUgKi8KKwkJcHRocmVhZF9tdXRleGF0dHJfZGVzdHJveSgmbXV0ZXhfYXR0cmlidXRlcyk7CisJCXJldHVybiBOVUxMOworCisJfQorCisjdW5kZWYgVU1QX1BUSFJFQURTX01VVEVYX1RZUEUKKworCS8qKiBAb3B0IHVzZSBjb250YWluaW5nIHN0cnVjdHVyZXMgZm9yIHRoZSBBTllfVU5MT0NLIHR5cGUsIHRvCisJICogc2F2ZSAyIERXT1JEUyB3aGVuIG5vdCBpbiB1c2UgKi8KKwlsb2NrID0gX3VtcF9vc3VfbWFsbG9jKCBzaXplb2YoX3VtcF9vc3VfbG9ja190KSApOworCisJaWYoIE5VTEwgPT0gbG9jayApCisJeworCQkvKiogUmV0dXJuIE5VTEwgb24gZmFpbHVyZSAqLworCQlwdGhyZWFkX211dGV4YXR0cl9kZXN0cm95KCZtdXRleF9hdHRyaWJ1dGVzKTsKKwkJcmV0dXJuIE5VTEw7CisJfQorCisJaWYgKDAgIT0gcHRocmVhZF9tdXRleF9pbml0KCAmbG9jay0+bXV0ZXgsICZtdXRleF9hdHRyaWJ1dGVzICkpCisJeworCQlwdGhyZWFkX211dGV4YXR0cl9kZXN0cm95KCZtdXRleF9hdHRyaWJ1dGVzKTsKKwkJX3VtcF9vc3VfZnJlZSggbG9jayApOworCQlyZXR1cm4gTlVMTDsKKwl9CisKKwkvKiBkb25lIHdpdGggdGhlIG11dGV4YXR0ciBvYmplY3QgKi8KKwlwdGhyZWFkX211dGV4YXR0cl9kZXN0cm95KCZtdXRleF9hdHRyaWJ1dGVzKTsKKworCS8qIEFOWV9VTkxPQ0sgdHlwZSAqLworCWlmICggZmxhZ3MgJiBfVU1QX09TVV9MT0NLRkxBR19BTllVTkxPQ0sgKQorCXsKKwkJaWYgKDAgIT0gcHRocmVhZF9jb25kX2luaXQoICZsb2NrLT5jb25kaXRpb24sIE5VTEwgKSkKKwkJeworCQkJLyogY2xlYW51cCAqLworCQkJcHRocmVhZF9tdXRleF9kZXN0cm95KCAmbG9jay0+bXV0ZXggKTsKKwkJCV91bXBfb3N1X2ZyZWUoIGxvY2sgKTsKKwkJCXJldHVybiBOVUxMOworCQl9CisJCWxvY2stPnN0YXRlID0gVU1QX0ZBTFNFOyAvKiBtYXJrIGFzIHVubG9ja2VkIGJ5IGRlZmF1bHQgKi8KKwl9CisKKwlsb2NrLT5mbGFncyA9IGZsYWdzOworCisJLyoqIERlYnVnIGxvY2sgY2hlY2tpbmcgKi8KKwlVTVBfREVCVUdfQ09ERSggbG9jay0+bG9ja2VkX2FzID0gX1VNUF9PU1VfTE9DS01PREVfVU5ERUYJKTsKKworCXJldHVybiBsb2NrOworfQorCitfdW1wX29zdV9lcnJjb2RlX3QgX3VtcF9vc3VfbG9ja190aW1lZF93YWl0KCBfdW1wX29zdV9sb2NrX3QgKmxvY2ssIF91bXBfb3N1X2xvY2tfbW9kZV90IG1vZGUsIHU2NCB0aW1lb3V0KQoreworCS8qIGFic29sdXRlIHRpbWUgc3BlY2lmaWVyICovCisJc3RydWN0IHRpbWVzcGVjIHRzOworCXN0cnVjdCB0aW1ldmFsIHR2OworCisJLyogUGFyYW1ldGVyIHZhbGlkYXRpb24gKi8KKwlVTVBfREVCVUdfQVNTRVJUX1BPSU5URVIoIGxvY2sgKTsKKworCVVNUF9ERUJVR19BU1NFUlQoIF9VTVBfT1NVX0xPQ0tNT0RFX1JXID09IG1vZGUsCisJCQkJCSAgICgidW5yZWNvZ25pc2VkIG1vZGUsICUuOFhcbiIsIG1vZGUpICk7CisJVU1QX0RFQlVHX0FTU0VSVCggX1VNUF9PU1VfTE9DS0ZMQUdfQU5ZVU5MT0NLID09IGxvY2stPmZsYWdzLCAoIlRpbWVkIG9wZXJhdGlvbnMgb25seSBpbXBsZW1lbnRlZCBmb3IgQU5ZVU5MT0NLIHR5cGUgbG9ja3MiKSk7CisKKwkvKiBjYWxjdWxhdGUgdGhlIHJlYWx0aW1lIHRpbWVvdXQgdmFsdWUgKi8KKworCWlmICgwICE9IGdldHRpbWVvZmRheSgmdHYsIE5VTEwpKQorCXsKKwkJVU1QX0RFQlVHX1BSSU5UKDEsKCJDb3VsZCBub3QgZ2V0IHRoZSBjdXJyZW50IHJlYWx0aW1lIHZhbHVlIHRvIGNhbGN1bGF0ZSB0aGUgYWJzb2x1dGUgdmFsdWUgZm9yIGEgdGltZWQgbXV0ZXggbG9jayB3aXRoIGEgdGltZW91dCIpKTsKKwkJcmV0dXJuIF9VTVBfT1NVX0VSUl9GQVVMVDsKKwl9CisKKwl0di50dl91c2VjICs9IHRpbWVvdXQ7CisKKyNkZWZpbmUgVU1QX1VTRUNTX1BFUl9TRUNPTkQgMTAwMDAwMFVMTAorI2RlZmluZSBVTVBfTkFOT1NFQ1NfUEVSX1VTRUMgMTAwMFVMTAorCisJLyogZGlkIHdlIG92ZXJmbG93IGEgc2Vjb25kIGluIHRoZSB1c2VjIHBhcnQ/ICovCisJd2hpbGUgKHR2LnR2X3VzZWMgPj0gVU1QX1VTRUNTX1BFUl9TRUNPTkQpCisJeworCQl0di50dl91c2VjIC09IFVNUF9VU0VDU19QRVJfU0VDT05EOworCQl0di50dl9zZWMrKzsKKwl9CisKKwkvKiBjb3B5IHRvIHRoZSBjb3JyZWN0IHN0cnVjdCAqLworCXRzLnR2X3NlYyA9IHR2LnR2X3NlYzsKKwl0cy50dl9uc2VjID0gKHR2LnR2X3VzZWMgKiBVTVBfTkFOT1NFQ1NfUEVSX1VTRUMpOworCisjdW5kZWYgVU1QX1VTRUNTX1BFUl9TRUNPTkQKKyN1bmRlZiBVTVBfTkFOT1NFQ1NfUEVSX1VTRUMKKworCS8qIGxvY2sgdGhlIG11dGV4IHByb3RlY3RpbmcgYWNjZXNzIHRvIHRoZSBzdGF0ZSBmaWVsZCAqLworCXB0aHJlYWRfbXV0ZXhfbG9jayggJmxvY2stPm11dGV4ICk7CisJLyogbG9vcCB3aGlsZSBsb2NrZWQgKHN0YXRlIGlzIFVNUF9UUlVFKSAqLworCS8qIHB0aHJlYWRfY29uZF90aW1lZHdhaXQgdW5sb2NrcyB0aGUgbXV0ZXgsIHdhaXQsIGFuZCBsb2NrcyB0aGUgbXV0ZXggb25jZSB1bmJsb2NrZWQgKGVpdGhlciBkdWUgdG8gdGhlIGV2ZW50IG9yIHRoZSB0aW1lb3V0KSAqLworCXdoaWxlICggVU1QX1RSVUUgPT0gbG9jay0+c3RhdGUgKQorCXsKKwkJaW50IHJlczsKKwkJcmVzID0gcHRocmVhZF9jb25kX3RpbWVkd2FpdCggJmxvY2stPmNvbmRpdGlvbiwgJmxvY2stPm11dGV4LCAmdHMgKTsKKwkJaWYgKDAgPT0gcmVzKSBjb250aW51ZTsgLyogdGVzdCB0aGUgc3RhdGUgdmFyaWFibGUgYWdhaW4gKGxvb3AgY29uZGl0aW9uKSAqLworCQllbHNlIGlmIChFVElNRURPVVQgPT0gcmVzKQorCQl7CisJCQkvKiB0aW1lb3V0LCBuZWVkIHRvIGNsZWFuIHVwIGFuZCByZXR1cm4gdGhlIGNvcnJlY3QgZXJyb3IgY29kZSAqLworCQkJcHRocmVhZF9tdXRleF91bmxvY2soJmxvY2stPm11dGV4KTsKKwkJCXJldHVybiBfVU1QX09TVV9FUlJfVElNRU9VVDsKKwkJfQorCQllbHNlCisJCXsKKwkJCVVNUF9ERUJVR19QUklOVCgxLCAoIlVuZXhwZWN0ZWQgcmV0dXJuIGZyb20gcHRocmVhZF9jb25kX3RpbWVkd2FpdCAweCUwOFhcbiIsIHJlcykpOworCisJCQlwdGhyZWFkX211dGV4X3VubG9jaygmbG9jay0+bXV0ZXgpOworCQkJcmV0dXJuIF9VTVBfT1NVX0VSUl9GQVVMVDsKKwkJfQorCQorCX0KKworCS8qIERFQlVHIHRyYWNraW5nIG9mIHByZXZpb3VzbHkgbG9ja2VkIHN0YXRlIC0gb2NjdXJzIHdoaWxlIGxvY2sgaXMgb2J0YWluZWQgKi8KKwlVTVBfREVCVUdfQVNTRVJUKCBfVU1QX09TVV9MT0NLTU9ERV9VTkRFRiA9PSBsb2NrLT5sb2NrZWRfYXMsCisJCQkoIlRoaXMgbG9jayB3YXMgYWxyZWFkeSBsb2NrZWRcbiIpICk7CisJVU1QX0RFQlVHX0NPREUoIGxvY2stPmxvY2tlZF9hcyA9IG1vZGUgKTsKKworCS8qIHRoZSBzdGF0ZSBpcyBVTVBfRkFMU0UgKHVubG9ja2VkKSwgc28gd2Ugc2V0IGl0IHRvIFVNUF9UUlVFIHRvIGluZGljYXRlIHRoYXQgaXQncyBsb2NrZWQgYW5kIGNhbiByZXR1cm4ga25vd2luZyB0aGF0IHdlIG93biB0aGUgbG9jayAqLworCWxvY2stPnN0YXRlID0gVU1QX1RSVUU7CisJLyogZmluYWwgdW5sb2NrIG9mIHRoZSBtdXRleCAqLworCXB0aHJlYWRfbXV0ZXhfdW5sb2NrKCZsb2NrLT5tdXRleCk7CisKKwlyZXR1cm4gX1VNUF9PU1VfRVJSX09LOworCit9CisKK191bXBfb3N1X2VycmNvZGVfdCBfdW1wX29zdV9sb2NrX3dhaXQoIF91bXBfb3N1X2xvY2tfdCAqbG9jaywgX3VtcF9vc3VfbG9ja19tb2RlX3QgbW9kZSkKK3sKKwkvKiBQYXJhbWV0ZXIgdmFsaWRhdGlvbiAqLworCVVNUF9ERUJVR19BU1NFUlRfUE9JTlRFUiggbG9jayApOworCisJVU1QX0RFQlVHX0FTU0VSVCggX1VNUF9PU1VfTE9DS01PREVfUlcgPT0gbW9kZSwKKwkJCQkJICAgKCJ1bnJlY29nbmlzZWQgbW9kZSwgJS44WFxuIiwgbW9kZSkgKTsKKworCS8qKiBAbm90ZSBzaW5jZSBvbmx5IG9uZSBmbGFnIGNhbiBiZSBzZXQsIHdlIHVzZSBhIHN3aXRjaCBzdGF0ZW1lbnQgaGVyZS4KKwkgKiBPdGhlcndpc2UsIE1VU1QgYWRkIGFuIGVudW0gaW50byB0aGUgX3VtcF9vc3VfbG9ja190IHRvIHN0b3JlIHRoZQorCSAqIGltcGxlbWVudGVkIGxvY2sgdHlwZSAqLworCXN3aXRjaCAoIGxvY2stPmZsYWdzICkKKwl7CisJY2FzZSBfVU1QX09TVV9MT0NLRkxBR19TVEFUSUM6CisJY2FzZSAwOgorCQkvKiBVc3VhbCBNdXRleCB0eXBlICovCisJCXsKKwkJCWludCBjYWxsX3Jlc3VsdDsKKwkJCWNhbGxfcmVzdWx0ID0gcHRocmVhZF9tdXRleF9sb2NrKCAmbG9jay0+bXV0ZXggKTsKKwkJCVVNUF9ERUJVR19BU1NFUlQoIDAgPT0gY2FsbF9yZXN1bHQsCisJCQkJCQkJICAgKCJwdGhyZWFkX211dGV4X2xvY2sgY2FsbCBmYWlsZWQgd2l0aCBlcnJvciBjb2RlICVkXG4iLCBjYWxsX3Jlc3VsdCkpOworCQkJVU1QX0lHTk9SRSggY2FsbF9yZXN1bHQgKTsKKwkJfQorCisJCS8qIERFQlVHIHRyYWNraW5nIG9mIHByZXZpb3VzbHkgbG9ja2VkIHN0YXRlIC0gb2NjdXJzIHdoaWxlIGxvY2sgaXMgb2J0YWluZWQgKi8KKwkJVU1QX0RFQlVHX0FTU0VSVCggX1VNUF9PU1VfTE9DS01PREVfVU5ERUYgPT0gbG9jay0+bG9ja2VkX2FzLAorCQkJCQkJICAgKCJUaGlzIGxvY2sgd2FzIGFscmVhZHkgbG9ja2VkXG4iKSApOworCQlVTVBfREVCVUdfQ09ERSggbG9jay0+bG9ja2VkX2FzID0gbW9kZSApOworCQlicmVhazsKKworCWNhc2UgX1VNUF9PU1VfTE9DS0ZMQUdfQU5ZVU5MT0NLOgorCQkvKiogQG5vdGUgVXNlIG9mIGJpdGZsYWdzIGluIGEgY2FzZSBzdGF0ZW1lbnQgT05MWSB3b3JrcyBiZWNhdXNlIHRoaXMKKwkJICogaXMgdGhlIE9OTFkgZmxhZyB0aGF0IGlzIHN1cHBvcnRlZCAqLworCisJCS8qIGxvY2sgdGhlIG11dGV4IHByb3RlY3RpbmcgYWNjZXNzIHRvIHRoZSBzdGF0ZSBmaWVsZCAqLworCQlwdGhyZWFkX211dGV4X2xvY2soICZsb2NrLT5tdXRleCApOworCQkvKiBsb29wIHdoaWxlIGxvY2tlZCAoc3RhdGUgaXMgVU1QX1RSVUUpICovCisJCS8qIHB0aHJlYWRfY29uZF93YWl0IHVubG9ja3MgdGhlIG11dGV4LCB3YWl0LCBhbmQgbG9ja3MgdGhlIG11dGV4IG9uY2UgdW5ibG9ja2VkICovCisJCXdoaWxlICggVU1QX1RSVUUgPT0gbG9jay0+c3RhdGUgKSBwdGhyZWFkX2NvbmRfd2FpdCggJmxvY2stPmNvbmRpdGlvbiwgJmxvY2stPm11dGV4ICk7CisKKwkJLyogREVCVUcgdHJhY2tpbmcgb2YgcHJldmlvdXNseSBsb2NrZWQgc3RhdGUgLSBvY2N1cnMgd2hpbGUgbG9jayBpcyBvYnRhaW5lZCAqLworCQlVTVBfREVCVUdfQVNTRVJUKCBfVU1QX09TVV9MT0NLTU9ERV9VTkRFRiA9PSBsb2NrLT5sb2NrZWRfYXMsCisJCQkJCQkgICAoIlRoaXMgbG9jayB3YXMgYWxyZWFkeSBsb2NrZWRcbiIpICk7CisJCVVNUF9ERUJVR19DT0RFKCBsb2NrLT5sb2NrZWRfYXMgPSBtb2RlICk7CisKKwkJLyogdGhlIHN0YXRlIGlzIFVNUF9GQUxTRSAodW5sb2NrZWQpLCBzbyB3ZSBzZXQgaXQgdG8gVU1QX1RSVUUgdG8gaW5kaWNhdGUgdGhhdCBpdCdzIGxvY2tlZCBhbmQgY2FuIHJldHVybiBrbm93aW5nIHRoYXQgd2Ugb3duIHRoZSBsb2NrICovCisJCWxvY2stPnN0YXRlID0gVU1QX1RSVUU7CisJCS8qIGZpbmFsIHVubG9jayBvZiB0aGUgbXV0ZXggKi8KKwkJcHRocmVhZF9tdXRleF91bmxvY2soJmxvY2stPm11dGV4KTsKKwkJYnJlYWs7CisKKwlkZWZhdWx0OgorCQlVTVBfREVCVUdfRVJST1IoICgibG9jayBoYXMgaW5jb3JyZWN0IGZsYWdzPT0lLjhYXG4iLCBsb2NrLT5mbGFncykgKTsKKwkJYnJlYWs7CisJfQorCisJcmV0dXJuIF9VTVBfT1NVX0VSUl9PSzsKK30KKworX3VtcF9vc3VfZXJyY29kZV90IF91bXBfb3N1X2xvY2tfdHJ5d2FpdCggX3VtcF9vc3VfbG9ja190ICpsb2NrLCBfdW1wX29zdV9sb2NrX21vZGVfdCBtb2RlKQoreworCV91bXBfb3N1X2VycmNvZGVfdCBlcnIgPSBfVU1QX09TVV9FUlJfRkFVTFQ7CisJLyogUGFyYW1ldGVyIHZhbGlkYXRpb24gKi8KKwlVTVBfREVCVUdfQVNTRVJUX1BPSU5URVIoIGxvY2sgKTsKKworCVVNUF9ERUJVR19BU1NFUlQoIF9VTVBfT1NVX0xPQ0tNT0RFX1JXID09IG1vZGUsCisJCQkJCSAgICgidW5yZWNvZ25pc2VkIG1vZGUsICUuOFhcbiIsIG1vZGUpICk7CisKKwkvKiogQG5vdGUgc2luY2Ugb25seSBvbmUgZmxhZyBjYW4gYmUgc2V0LCB3ZSB1c2UgYSBzd2l0Y2ggc3RhdGVtZW50IGhlcmUuCisJICogT3RoZXJ3aXNlLCBNVVNUIGFkZCBhbiBlbnVtIGludG8gdGhlIF91bXBfb3N1X2xvY2tfdCB0byBzdG9yZSB0aGUKKwkgKiBpbXBsZW1lbnRlZCBsb2NrIHR5cGUgKi8KKwlzd2l0Y2ggKCBsb2NrLT5mbGFncyApCisJeworCWNhc2UgX1VNUF9PU1VfTE9DS0ZMQUdfU1RBVElDOgorCWNhc2UgMDoKKwkJLyogVXN1YWwgTXV0ZXggdHlwZSAqLworCQl7CisJCQkvKiBUaGlzIGlzIG5vdCBzdWJqZWN0IHRvIFVNUF9DSEVDSyAtIG92ZXJyaWRpbmcgdGhlIHJlc3VsdCB3b3VsZCBjYXVzZSBhIHByb2dyYW1taW5nIGVycm9yICovCisJCQlpZiAoIDAgPT0gcHRocmVhZF9tdXRleF90cnlsb2NrKCAmbG9jay0+bXV0ZXggKSApCisJCQl7CisJCQkJZXJyID0gX1VNUF9PU1VfRVJSX09LOworCisJCQkJLyogREVCVUcgdHJhY2tpbmcgb2YgcHJldmlvdXNseSBsb2NrZWQgc3RhdGUgLSBvY2N1cnMgd2hpbGUgbG9jayBpcyBvYnRhaW5lZCAqLworCQkJCVVNUF9ERUJVR19BU1NFUlQoIF9VTVBfT1NVX0xPQ0tNT0RFX1VOREVGID09IGxvY2stPmxvY2tlZF9hcworCQkJCQkJCQkgICB8fCBtb2RlID09IGxvY2stPmxvY2tlZF9hcywKKwkJCQkJCQkJICAgKCJ0cmllZCBhcyBtb2RlPT0lLjhYLCBidXQgd2FzIGxvY2tlZCBhcyAlLjhYXG4iLCBtb2RlLCBsb2NrLT5sb2NrZWRfYXMpICk7CisJCQkJVU1QX0RFQlVHX0NPREUoIGxvY2stPmxvY2tlZF9hcyA9IG1vZGUgKTsKKwkJCX0KKwkJfQorCQlicmVhazsKKworCWNhc2UgX1VNUF9PU1VfTE9DS0ZMQUdfQU5ZVU5MT0NLOgorCQkvKiogQG5vdGUgVXNlIG9mIGJpdGZsYWdzIGluIGEgY2FzZSBzdGF0ZW1lbnQgT05MWSB3b3JrcyBiZWNhdXNlIHRoaXMKKwkJICogaXMgdGhlIE9OTFkgZmxhZyB0aGF0IGlzIHN1cHBvcnRlZCAqLworCisJCS8qIGxvY2sgdGhlIG11dGV4IHByb3RlY3RpbmcgYWNjZXNzIHRvIHRoZSBzdGF0ZSBmaWVsZCAqLworCQlwdGhyZWFkX211dGV4X2xvY2soJmxvY2stPm11dGV4KTsKKworCQlpZiAoIFVNUF9GQUxTRSA9PSBsb2NrLT5zdGF0ZSkKKwkJeworCQkJLyogdW5sb2NrZWQsIHRha2UgdGhlIGxvY2sgKi8KKwkJCWxvY2stPnN0YXRlID0gVU1QX1RSVUU7CisJCQllcnIgPSBfVU1QX09TVV9FUlJfT0s7CisJCX0KKworCQkvKiBERUJVRyB0cmFja2luZyBvZiBwcmV2aW91c2x5IGxvY2tlZCBzdGF0ZSAtIG9jY3VycyB3aGlsZSBsb2NrIGlzIG9idGFpbmVkICovCisJCS8qIENhbiBkbyB0aGlzIHJlZ2FyZGxlc3Mgb2Ygd2hldGhlciB3ZSBvYnRhaW5lZCBBTllVTkxPQ0s6ICovCisKKworCQlVTVBfREVCVUdfQVNTRVJUKCBfVU1QX09TVV9MT0NLTU9ERV9VTkRFRiA9PSBsb2NrLT5sb2NrZWRfYXMKKwkJCQkJCSAgIHx8IG1vZGUgPT0gbG9jay0+bG9ja2VkX2FzLAorCQkJCQkJICAgKCJ0cmllZCBhcyBtb2RlPT0lLjhYLCBidXQgd2FzIGxvY2tlZCBhcyAlLjhYXG4iLCBtb2RlLCBsb2NrLT5sb2NrZWRfYXMpICk7CisJCS8qIElmIHdlIHdlcmUgYWxyZWFkeSBsb2NrZWQsIHRoaXMgZG9lcyBubyBoYXJtLCBiZWNhdXNlIG9mIHRoZSBhYm92ZSBhc3NlcnQ6ICovCisJCVVNUF9ERUJVR19DT0RFKCBsb2NrLT5sb2NrZWRfYXMgPSBtb2RlICk7CisKKwkJcHRocmVhZF9tdXRleF91bmxvY2soJmxvY2stPm11dGV4KTsKKwkJYnJlYWs7CisKKwlkZWZhdWx0OgorCQlVTVBfREVCVUdfRVJST1IoICgibG9jayBoYXMgaW5jb3JyZWN0IGZsYWdzPT0lLjhYXG4iLCBsb2NrLT5mbGFncykgKTsKKwkJYnJlYWs7CisJfQorCisJcmV0dXJuIGVycjsKK30KKworCit2b2lkIF91bXBfb3N1X2xvY2tfc2lnbmFsKCBfdW1wX29zdV9sb2NrX3QgKmxvY2ssIF91bXBfb3N1X2xvY2tfbW9kZV90IG1vZGUgKQoreworCS8qIFBhcmFtZXRlciB2YWxpZGF0aW9uICovCisJVU1QX0RFQlVHX0FTU0VSVF9QT0lOVEVSKCBsb2NrICk7CisKKwlVTVBfREVCVUdfQVNTRVJUKCBfVU1QX09TVV9MT0NLTU9ERV9SVyA9PSBtb2RlLAorCQkJCQkgICAoInVucmVjb2duaXNlZCBtb2RlLCAlLjhYXG4iLCBtb2RlKSApOworCisJLyoqIEBub3RlIHNpbmNlIG9ubHkgb25lIGZsYWcgY2FuIGJlIHNldCwgd2UgdXNlIGEgc3dpdGNoIHN0YXRlbWVudCBoZXJlLgorCSAqIE90aGVyd2lzZSwgTVVTVCBhZGQgYW4gZW51bSBpbnRvIHRoZSBfdW1wX29zdV9sb2NrX3QgdG8gc3RvcmUgdGhlCisJICogaW1wbGVtZW50ZWQgbG9jayB0eXBlICovCisJc3dpdGNoICggbG9jay0+ZmxhZ3MgKQorCXsKKwljYXNlIF9VTVBfT1NVX0xPQ0tGTEFHX1NUQVRJQzoKKwljYXNlIDA6CisJCS8qIFVzdWFsIE11dGV4IHR5cGUgKi8KKworCQkvKiBERUJVRyB0cmFja2luZyBvZiBwcmV2aW91c2x5IGxvY2tlZCBzdGF0ZSAtIG9jY3VycyB3aGlsZSBsb2NrIGlzIG9idGFpbmVkICovCisJCVVNUF9ERUJVR19BU1NFUlQoIG1vZGUgPT0gbG9jay0+bG9ja2VkX2FzLAorCQkJCQkJICAgKCJUaGlzIGxvY2sgd2FzIGxvY2tlZCBhcz09JS44WCwgYnV0IHRyaWVkIHRvIHVubG9jayBhcyBtb2RlPT0lLjhYXG4iLCBsb2NrLT5sb2NrZWRfYXMsIG1vZGUpKTsKKwkJVU1QX0RFQlVHX0NPREUoIGxvY2stPmxvY2tlZF9hcyA9IF9VTVBfT1NVX0xPQ0tNT0RFX1VOREVGICk7CisKKwkJeworCQkJaW50IGNhbGxfcmVzdWx0OworCQkJY2FsbF9yZXN1bHQgPSBwdGhyZWFkX211dGV4X3VubG9jayggJmxvY2stPm11dGV4ICk7CisJCQlVTVBfREVCVUdfQVNTRVJUKCAwID09IGNhbGxfcmVzdWx0LAorCQkJCQkJCSAgICgicHRocmVhZF9tdXRleF9sb2NrIGNhbGwgZmFpbGVkIHdpdGggZXJyb3IgY29kZSAlZFxuIiwgY2FsbF9yZXN1bHQpKTsKKwkJCVVNUF9JR05PUkUoIGNhbGxfcmVzdWx0ICk7CisJCX0KKwkJYnJlYWs7CisKKwljYXNlIF9VTVBfT1NVX0xPQ0tGTEFHX0FOWVVOTE9DSzoKKwkJLyoqIEBub3RlIFVzZSBvZiBiaXRmbGFncyBpbiBhIGNhc2Ugc3RhdGVtZW50IE9OTFkgd29ya3MgYmVjYXVzZSB0aGlzCisJCSAqIGlzIHRoZSBPTkxZIGZsYWcgdGhhdCBpcyBzdXBwb3J0ZWQgKi8KKworCQlwdGhyZWFkX211dGV4X2xvY2soJmxvY2stPm11dGV4KTsKKwkJVU1QX0RFQlVHX0FTU0VSVCggVU1QX1RSVUUgPT0gbG9jay0+c3RhdGUsICgiVW5sb2NraW5nIGEgX3VtcF9vc3VfbG9ja190ICVwIHdoaWNoIGlzIG5vdCBsb2NrZWRcbiIsIGxvY2spKTsKKworCQkvKiBERUJVRyB0cmFja2luZyBvZiBwcmV2aW91c2x5IGxvY2tlZCBzdGF0ZSAtIG9jY3VycyB3aGlsZSBsb2NrIGlzIG9idGFpbmVkICovCisJCVVNUF9ERUJVR19BU1NFUlQoIG1vZGUgPT0gbG9jay0+bG9ja2VkX2FzLAorCQkJCQkJICAgKCJUaGlzIGxvY2sgd2FzIGxvY2tlZCBhcz09JS44WCwgYnV0IHRyaWVkIHRvIHVubG9jayBhcyAlLjhYXG4iLCBsb2NrLT5sb2NrZWRfYXMsIG1vZGUgKSk7CisJCVVNUF9ERUJVR19DT0RFKCBsb2NrLT5sb2NrZWRfYXMgPSBfVU1QX09TVV9MT0NLTU9ERV9VTkRFRiApOworCisJCS8qIG1hcmsgYXMgdW5sb2NrZWQgKi8KKwkJbG9jay0+c3RhdGUgPSBVTVBfRkFMU0U7CisKKwkJLyogc2lnbmFsIHRoZSBjb25kaXRpb24sIG9ubHkgd2FrZSBhIHNpbmdsZSB0aHJlYWQgKi8KKwkJcHRocmVhZF9jb25kX3NpZ25hbCgmbG9jay0+Y29uZGl0aW9uKTsKKworCQlwdGhyZWFkX211dGV4X3VubG9jaygmbG9jay0+bXV0ZXgpOworCQlicmVhazsKKworCWRlZmF1bHQ6CisJCVVNUF9ERUJVR19FUlJPUiggKCJsb2NrIGhhcyBpbmNvcnJlY3QgZmxhZ3M9PSUuOFhcbiIsIGxvY2stPmZsYWdzKSApOworCQlicmVhazsKKwl9Cit9CisKK3ZvaWQgX3VtcF9vc3VfbG9ja190ZXJtKCBfdW1wX29zdV9sb2NrX3QgKmxvY2sgKQoreworCWludCBjYWxsX3Jlc3VsdDsKKwlVTVBfREVCVUdfQVNTRVJUX1BPSU5URVIoIGxvY2sgKTsKKworCS8qKiBEZWJ1ZyBsb2NrIGNoZWNraW5nOiAqLworCS8qIExvY2sgaXMgc2lnbmFsbGVkIG9uIHRlcm1pbmF0ZSAtIG5vdCBhIGd1YXJhbnRlZSwgc2luY2Ugd2UgY291bGQgYmUgbG9ja2VkIGltbWVkaWF0ZWx5IGJlZm9yZWhhbmQgKi8KKwlVTVBfREVCVUdfQVNTRVJUKCBfVU1QX09TVV9MT0NLTU9ERV9VTkRFRiA9PSBsb2NrLT5sb2NrZWRfYXMsCisJCQkJCSAgICgiY2Fubm90IHRlcm1pbmF0ZSBoZWxkIGxvY2tcbiIpICk7CisKKwljYWxsX3Jlc3VsdCA9IHB0aHJlYWRfbXV0ZXhfZGVzdHJveSggJmxvY2stPm11dGV4ICk7CisJVU1QX0RFQlVHX0FTU0VSVCggMCA9PSBjYWxsX3Jlc3VsdCwKKwkJCQkJICAgKCJJbmNvcnJlY3QgbXV0ZXggdXNlIGRldGVjdGVkOiBwdGhyZWFkX211dGV4X2Rlc3Ryb3kgY2FsbCBmYWlsZWQgd2l0aCBlcnJvciBjb2RlICVkXG4iLCBjYWxsX3Jlc3VsdCkgKTsKKworCS8qIERlc3Ryb3kgZXh0cmEgc3RhdGUgZm9yIEFOWV9VTkxPQ0sgdHlwZSBvc3VfbG9ja3MgKi8KKwlpZiAoIGxvY2stPmZsYWdzICYgX1VNUF9PU1VfTE9DS0ZMQUdfQU5ZVU5MT0NLICkKKwl7CisJCVVNUF9ERUJVR19BU1NFUlQoIFVNUF9GQUxTRSA9PSBsb2NrLT5zdGF0ZSwgKCJ0ZXJtaW5hdGUgY2FsbGVkIG9uIGxvY2tlZCBvYmplY3QgJXBcbiIsIGxvY2spKTsKKwkJY2FsbF9yZXN1bHQgPSBwdGhyZWFkX2NvbmRfZGVzdHJveSgmbG9jay0+Y29uZGl0aW9uKTsKKwkJVU1QX0RFQlVHX0FTU0VSVCggMCA9PSBjYWxsX3Jlc3VsdCwKKwkJCQkJCSAgICgiSW5jb3JyZWN0IGNvbmRpdGlvbi12YXJpYWJsZSB1c2UgZGV0ZWN0ZWQ6IHB0aHJlYWRfY29uZF9kZXN0cm95IGNhbGwgZmFpbGVkIHdpdGggZXJyb3IgY29kZSAlZFxuIiwgY2FsbF9yZXN1bHQpICk7CisJfQorCisJVU1QX0lHTk9SRShjYWxsX3Jlc3VsdCk7CisKKwlfdW1wX29zdV9mcmVlKCBsb2NrICk7Cit9CisKK191bXBfb3N1X2xvY2tfdCAqX3VtcF9vc3VfbG9ja19zdGF0aWMoIHUzMiBuciApCit7CisJVU1QX0RFQlVHX0FTU0VSVCggbnIgPCBVTVBfT1NVX1NUQVRJQ19MT0NLX0NPVU5ULAorCSAgICAgICAgICAgICAgICAgICAoInByb3ZpZGVkIHN0YXRpYyBsb2NrIGluZGV4ICglZCkgb3V0IG9mIGJvdW5kcyAoMCA8IG5yIDwgJWQpXG4iLCBuciwgVU1QX09TVV9TVEFUSUNfTE9DS19DT1VOVCkgKTsKKwlyZXR1cm4gJl91bXBfb3N1X3N0YXRpY19sb2Nrc1tucl07Cit9CmRpZmYgLS1naXQgYS9leHlub3M0L2hhbC9saWJ1bXAvb3MvbGludXgvdW1wX29zdV9tZW1vcnkuYyBiL2V4eW5vczQvaGFsL2xpYnVtcC9vcy9saW51eC91bXBfb3N1X21lbW9yeS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjU4MDc1OTQKLS0tIC9kZXYvbnVsbAorKysgYi9leHlub3M0L2hhbC9saWJ1bXAvb3MvbGludXgvdW1wX29zdV9tZW1vcnkuYwpAQCAtMCwwICsxLDYwIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDEwLTIwMTEgQVJNIExpbWl0ZWQuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKiAKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKiAKKyAqICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICogCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaW5jbHVkZSA8dW1wL3VtcF9vc3UuaD4KKworI2luY2x1ZGUgPHN0ZGxpYi5oPgorI2luY2x1ZGUgPHN0cmluZy5oPiAvKiBtZW1jbXAsIG1lbWNociwgbWVtc2V0ICovCisKKy8qKgorICogQGZpbGUgdW1wX29zdV9tZW1vcnkuYworICogRmlsZSBpbXBsZW1lbnRzIHRoZSB1c2VyIHNpZGUgb2YgdGhlIE9TIGludGVyZmFjZQorICovCisKK3ZvaWQgKl91bXBfb3N1X2NhbGxvYyggdTMyIG4sIHUzMiBzaXplICkKK3sKKwlyZXR1cm4gY2FsbG9jKCBuLCBzaXplICk7Cit9CisKK3ZvaWQgKl91bXBfb3N1X21hbGxvYyggdTMyIHNpemUgKQoreworCXJldHVybiBtYWxsb2MoIHNpemUgKTsKK30KKwordm9pZCAqX3VtcF9vc3VfcmVhbGxvYyggdm9pZCAqcHRyLCB1MzIgc2l6ZSApCit7CisJcmV0dXJuIHJlYWxsb2MoIHB0ciwgc2l6ZSApOworfQorCit2b2lkIF91bXBfb3N1X2ZyZWUoIHZvaWQgKnB0ciApCit7CisJZnJlZSggcHRyICk7Cit9CisKK3ZvaWQgKl91bXBfb3N1X21lbWNweSggdm9pZCAqZHN0LCBjb25zdCB2b2lkICpzcmMsIHUzMglsZW4gKQoreworCXJldHVybiBtZW1jcHkoIGRzdCwgc3JjLCBsZW4gKTsKK30KKwordm9pZCAqX3VtcF9vc3VfbWVtc2V0KCB2b2lkICpwdHIsIHUzMiBjaHIsIHUzMiBzaXplICkKK3sKKwlyZXR1cm4gbWVtc2V0KCBwdHIsIGNociwgc2l6ZSApOworfQorCitpbnQgX3VtcF9vc3VfbWVtY21wKCBjb25zdCB2b2lkICpwdHIxLCBjb25zdCB2b2lkICpwdHIyLCB1MzIgc2l6ZSApCit7CisJcmV0dXJuIG1lbWNtcCggcHRyMSwgcHRyMiwgc2l6ZSApOworfQpkaWZmIC0tZ2l0IGEvZXh5bm9zNC9oYWwvbGlidW1wL29zL2xpbnV4L3VtcF91a3UuYyBiL2V4eW5vczQvaGFsL2xpYnVtcC9vcy9saW51eC91bXBfdWt1LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjQ2YTJjNwotLS0gL2Rldi9udWxsCisrKyBiL2V4eW5vczQvaGFsL2xpYnVtcC9vcy9saW51eC91bXBfdWt1LmMKQEAgLTAsMCArMSwxOTMgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTAtMjAxMSBBUk0gTGltaXRlZC4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqIAorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqIAorICogICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKiAKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKy8qKgorICogQGZpbGUgdW1wX3VrdS5jCisgKiBGaWxlIGltcGxlbWVudHMgdGhlIHVzZXIgc2lkZSBvZiB0aGUgdXNlci1rZXJuZWwgaW50ZXJmYWNlCisgKi8KKworI2luY2x1ZGUgIi4uL3VtcF91a3UuaCIKKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgInVtcF9pb2N0bC5oIgorCisjaW5jbHVkZSA8c3lzL21tYW4uaD4KKworLyogTmVlZGVkIGZvciBmaWxlIG9wZXJhdGlvbnMgb24gdGhlIGRldmljZSBmaWxlKi8KKyNpbmNsdWRlIDx1bmlzdGQuaD4KKyNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KKyNpbmNsdWRlIDxzeXMvc3RhdC5oPgorI2luY2x1ZGUgPGZjbnRsLmg+CisjaW5jbHVkZSA8c3lzL2lvY3RsLmg+CisKK3N0YXRpYyBfdW1wX29zdV9lcnJjb2RlX3QgdW1wX2RyaXZlcl9pb2N0bCh2b2lkICpjb250ZXh0LCB1MzIgY29tbWFuZCwgdm9pZCAqYXJncyk7CisKK3N0YXRpYyBpbnQgdW1wX2lvY3RsX2FwaV92ZXJzaW9uX3VzZWQgPSBVTVBfSU9DVExfQVBJX1ZFUlNJT047CisKKy8qKgorICogVGhlIGRldmljZSBmaWxlIHRvIGFjY2VzcyB0aGUgVU1QIGRldmljZSBkcml2ZXIKKyAqIFRoaXMgaXMgYSBjaGFyYWN0ZXIgc3BlY2lhbCBmaWxlIGdpdmluZyBhY2Nlc3MgdG8gdGhlIGRldmljZSBkcml2ZXIuCisgKiBVc3VhbGx5IGNyZWF0ZWQgdXNpbmcgdGhlIG1rbm9kIGNvbW1hbmQgbGluZSB1dGlsaXR5LgorICovCitzdGF0aWMgY29uc3QgY2hhciB1bXBfZGV2aWNlX2ZpbGVfbmFtZVtdID0gIi9kZXYvdW1wIjsKKworX3VtcF9vc3VfZXJyY29kZV90IF91bXBfdWt1X29wZW4oIHZvaWQgKipjb250ZXh0ICkKK3sKKwlpbnQgdW1wX2RldmljZV9maWxlOworCWlmKE5VTEwgPT0gY29udGV4dCkKKwl7CisJCXJldHVybiBfVU1QX09TVV9FUlJfRkFVTFQ7CisJfQorCisJdW1wX2RldmljZV9maWxlID0gb3Blbih1bXBfZGV2aWNlX2ZpbGVfbmFtZSwgT19SRFdSKTsKKworCWlmICgtMSA9PSB1bXBfZGV2aWNlX2ZpbGUpCisJeworCQlyZXR1cm4gX1VNUF9PU1VfRVJSX0ZBVUxUOworCX0KKworCXsKKwkJc3RydWN0IF91bXBfdWtfYXBpX3ZlcnNpb25fcyBhcmdzOworCQlhcmdzLmN0eCAgICAgPSAodm9pZCopdW1wX2RldmljZV9maWxlOworCQlhcmdzLnZlcnNpb24gPSBVTVBfSU9DVExfQVBJX1ZFUlNJT047CisJCWFyZ3MuY29tcGF0aWJsZSA9IDM7CisJCXVtcF9kcml2ZXJfaW9jdGwoYXJncy5jdHgsIFVNUF9JT0NfUVVFUllfQVBJX1ZFUlNJT04sICZhcmdzKTsKKwkJaWYgKCAxICE9IGFyZ3MuY29tcGF0aWJsZSApCisJCXsKKwkJCWlmIChJU19BUElfTUFUQ0goTUFLRV9WRVJTSU9OX0lEKDEpLCBhcmdzLnZlcnNpb24pKQorCQkJeworCQkJCXVtcF9pb2N0bF9hcGlfdmVyc2lvbl91c2VkID0gTUFLRV9WRVJTSU9OX0lEKDEpOworCQkJCVVNUF9QUklOVEYoIlRoZSBVTVAgZGV2aWNlZHJpdmVyIGRvZXMgbm90IHN1cHBvcnQgY2FjaGVkIFVNUC4gVXBkYXRlIGl0IGlmIHRoaXMgaXMgbmVlZGVkLlxuIik7CisJCQl9CisJCQllbHNlCisJCQl7CisJCQkJVU1QX1BSSU5URigiVGhlIFVNUCBkZXZpY2Vkcml2ZXIgaXMgdmVyc2lvbjogJWQsIFVNUCBsaWJyYXJpZXMgaXMgdmVyc2lvbjogJWQuXG4iLCBHRVRfVkVSU0lPTihhcmdzLnZlcnNpb24pLCBHRVRfVkVSU0lPTihVTVBfSU9DVExfQVBJX1ZFUlNJT04pICk7CisJCQkgICBjbG9zZSh1bXBfZGV2aWNlX2ZpbGUpOworCQkJICAgcmV0dXJuIF9VTVBfT1NVX0VSUl9GQVVMVDsKKwkJCX0KKwkJfQorCX0KKworCSpjb250ZXh0ID0gKHZvaWQgKikgdW1wX2RldmljZV9maWxlOworCXJldHVybiBfVU1QX09TVV9FUlJfT0s7Cit9CisKK191bXBfb3N1X2VycmNvZGVfdCBfdW1wX3VrdV9jbG9zZSggdm9pZCAqKmNvbnRleHQgKQoreworCWlmKE5VTEwgPT0gY29udGV4dCkKKwl7CisJCXJldHVybiBfVU1QX09TVV9FUlJfRkFVTFQ7CisJfQorCisJaWYoLTEgPT0gKGludCkqY29udGV4dCkKKwl7CisJCXJldHVybiBfVU1QX09TVV9FUlJfRkFVTFQ7CisJfQorCisJY2xvc2UoKGludCkqY29udGV4dCk7CisJKmNvbnRleHQgPSAodm9pZCAqKS0xOworCisJcmV0dXJuIF9VTVBfT1NVX0VSUl9PSzsKK30KKworaW50IF91bXBfdWt1X2FsbG9jYXRlKF91bXBfdWtfYWxsb2NhdGVfcyAqYXJncykKK3sKKwlyZXR1cm4gdW1wX2RyaXZlcl9pb2N0bChhcmdzLT5jdHgsIFVNUF9JT0NfQUxMT0NBVEUsIGFyZ3MpOworfQorCitfdW1wX29zdV9lcnJjb2RlX3QgX3VtcF91a3VfcmVsZWFzZShfdW1wX3VrX3JlbGVhc2VfcyAqYXJncykKK3sKKwlyZXR1cm4gdW1wX2RyaXZlcl9pb2N0bChhcmdzLT5jdHgsIFVNUF9JT0NfUkVMRUFTRSwgYXJncyk7Cit9CisKK191bXBfb3N1X2VycmNvZGVfdCBfdW1wX3VrdV9zaXplX2dldChfdW1wX3VrX3NpemVfZ2V0X3MgKmFyZ3MpCit7CisJcmV0dXJuIHVtcF9kcml2ZXJfaW9jdGwoYXJncy0+Y3R4LCBVTVBfSU9DX1NJWkVfR0VULCBhcmdzKTsKK30KKworCit2b2lkIF91bXBfdWt1X21zeW5jaChfdW1wX3VrX21zeW5jX3MgKmFyZ3MpCit7CisJLyogVGhpcyBpcyBmb3IgYmFja3dhcmRzIGNvbXBhdGliaWxsaXR5ICovCisJaWYgKCBNQUtFX1ZFUlNJT05fSUQoMSkgPT0gdW1wX2lvY3RsX2FwaV92ZXJzaW9uX3VzZWQpCisJeworCQlhcmdzLT5pc19jYWNoZWQgPSAwOworCQlpZiAoIF9VTVBfVUtfTVNZTkNfUkVBRE9VVF9DQUNIRV9FTkFCTEVEICE9IGFyZ3MtPm9wICkKKwkJeworCQkJVU1QX0RFQlVHX1BSSU5UKDMsICgiV2FybmluZzogRG9pbmcgVU1QIGNhY2hlIGZsdXNoIG9wZXJhdGlvbnMgb24gYSBEZXZpY2UgRHJpdmVyIHRoYXQgZG9lcyBub3Qgc3VwcG9ydCBjYWNoZWQgVU1QIG1lbS5cbiIpKTsKKwkJfQorCQlyZXR1cm47CisJfQorCXVtcF9kcml2ZXJfaW9jdGwoYXJncy0+Y3R4LCBVTVBfSU9DX01TWU5DLCBhcmdzKTsKK30KKworaW50IF91bXBfdWt1X21hcF9tZW0oX3VtcF91a19tYXBfbWVtX3MgKmFyZ3MpCit7CisJaW50IGZsYWdzOworCWlmKCAtMSA9PSAoaW50KWFyZ3MtPmN0eCApCisJeworCQlyZXR1cm4gLTE7CisJfQorCisJZmxhZ3MgPSBNQVBfU0hBUkVEOworCisJLyogVGhpcyBpcyBmb3IgYmFja3dhcmRzIGNvbXBhdGliaWxsaXR5ICovCisJaWYgKCBNQUtFX1ZFUlNJT05fSUQoMSkgPT0gdW1wX2lvY3RsX2FwaV92ZXJzaW9uX3VzZWQpCisJeworCQlhcmdzLT5pc19jYWNoZWQgPSAwOworCX0KKworCS8qIElmIHdlIHdhbnQgdGhlIENhY2hpbmcgdG8gYmUgZW5hYmxlZCB3ZSBzZXQgdGhlIGZsYWdzIHRvIGJlIFBSSVZBVEUuIFRoZSBVTVAgREQgcmVhZHMgdGhpcyBhbmQgZG8gcHJvcGVyIGhhbmRsaW5nCisJICAgTm90ZTogdGhpcyBlbmZvcmNlcyB0aGUgdXNlciB0byB1c2UgcHJvcGVyIGludmFsaWRhdGlvbiovCisJaWYgKCBhcmdzLT5pc19jYWNoZWQgKSBmbGFncyA9IE1BUF9QUklWQVRFOworCisJYXJncy0+bWFwcGluZyA9IG1tYXAoTlVMTCwgYXJncy0+c2l6ZSwgUFJPVF9SRUFEIHwgUFJPVF9XUklURSAsZmxhZ3MgLCAoaW50KWFyZ3MtPmN0eCwgKG9mZl90KWFyZ3MtPnNlY3VyZV9pZCAqIHN5c2NvbmYoX1NDX1BBR0VfU0laRSkpOworCWlmIChNQVBfRkFJTEVEID09IGFyZ3MtPm1hcHBpbmcpCisJeworCQlyZXR1cm4gLTE7CisJfQorCisgICAgYXJncy0+Y29va2llID0gMDsgLyogQ29va2llIGlzIG5vdCB1c2VkIGluIGxpbnV4IF91bXBfdWt1X3VubWFwX21lbSAqLworCisJcmV0dXJuIDA7Cit9CisKK3ZvaWQgX3VtcF91a3VfdW5tYXBfbWVtKCBfdW1wX3VrX3VubWFwX21lbV9zICphcmdzICkKK3sKKwkvKgorCSAqIElmIGEgc21hbGxlciBzaXplIGlzIHVzZWQgTGludXggd2lsbCBqdXN0IHJlbW92ZSB0aGUgcmVxdWVzdGVkIHJhbmdlIGJ1dCBkb24ndCB0ZWxsCisJICogdGhlIHVtcCBkcml2ZXIgYmVmb3JlIGFsbCBvZiBpdCBpcyB1bm1hcHBlZCwgZWl0aGVyIHZpYSBhbm90aGVyIHVubWFwIHJlcXVlc3Qgb3IgdXBvbiBwcm9jZXNzIHNodXRkb3duLgorCSAqIFVubWFwcGluZyB0b28gbXVjaCB3aWxsIGp1c3QgaWdub3JlIHRoZSBvdmVyaGVhZCBvciBoaXQgdW5kZWZpbmVkIGJlaGF2aW9yLAorCSAqIG9ubHkgYWZmZWN0aW5nIHRoZSBjYWxsaW5nIHByb2Nlc3Mgd2hpY2ggY291bGQgbWVzcyBpdHNlbGYgdXAgaW4gb3RoZXIgd2F5cyBhbnl3YXkuCisJICogU28gd2UgZG9uJ3QgbmVlZCBhbnkgc2VjdXJpdHkgY2hlY2tzIGhlcmUuCisJICovCisJbXVubWFwKGFyZ3MtPm1hcHBpbmcsIGFyZ3MtPnNpemUpOworfQorCitzdGF0aWMgX3VtcF9vc3VfZXJyY29kZV90IHVtcF9kcml2ZXJfaW9jdGwodm9pZCAqY29udGV4dCwgdTMyIGNvbW1hbmQsIHZvaWQgKmFyZ3MpCit7CisJLypVTVBfQ0hFQ0tfTk9OX05VTEwoYXJncywgX1VNUF9PU0tfRVJSX0lOVkFMSURfQVJHUyk7Ki8KKworICAgCS8qIGNoZWNrIGZvciBhIHZhbGlkIGZpbGUgZGVzY3JpcHRvciAqLworCS8qKiBAbm90ZSBtYW51YWwgdHlwZSBzYWZldHkgY2hlY2stcG9pbnQgKi8KKwlpZiggLTEgPT0gKGludCljb250ZXh0ICkKKwl7CisJCXJldHVybiBfVU1QX09TVV9FUlJfRkFVTFQ7CisJfQorCisJLyogY2FsbCBpb2N0bCBoYW5kbGVyIG9mIGRyaXZlciAqLworCWlmICgwICE9IGlvY3RsKChpbnQpY29udGV4dCwgY29tbWFuZCwgYXJncykpIHJldHVybiAtMTsKKwlyZXR1cm4gX1VNUF9PU1VfRVJSX09LOworfQpkaWZmIC0tZ2l0IGEvZXh5bm9zNC9oYWwvbGlidW1wL29zL3VtcF91a3UuaCBiL2V4eW5vczQvaGFsL2xpYnVtcC9vcy91bXBfdWt1LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uN2RhNzE4NQotLS0gL2Rldi9udWxsCisrKyBiL2V4eW5vczQvaGFsL2xpYnVtcC9vcy91bXBfdWt1LmgKQEAgLTAsMCArMSw1NiBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxMC0yMDExIEFSTSBMaW1pdGVkLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICogCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICogCisgKiAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqIAorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworLyoqCisgKiBAZmlsZSB1bXBfdWt1LmgKKyAqIERlZmluZXMgdGhlIHVzZXItc2lkZSBpbnRlcmZhY2Ugb2YgdGhlIHVzZXIta2VybmVsIGludGVyZmFjZQorICovCisKKyNpZm5kZWYgX19VTVBfVUtVX0hfXworI2RlZmluZSBfX1VNUF9VS1VfSF9fCisKKyNpbmNsdWRlIDx1bXAvdW1wX29zdS5oPgorI2luY2x1ZGUgPHVtcC91bXBfZGVidWcuaD4KKyNpbmNsdWRlIDx1bXAvdW1wX3VrX3R5cGVzLmg+CisKKyNpZmRlZiBfX2NwbHVzcGx1cworZXh0ZXJuICJDIgoreworI2VuZGlmCisKK191bXBfb3N1X2VycmNvZGVfdCBfdW1wX3VrdV9vcGVuKCB2b2lkICoqY29udGV4dCApOworCitfdW1wX29zdV9lcnJjb2RlX3QgX3VtcF91a3VfY2xvc2UoIHZvaWQgKipjb250ZXh0ICk7CisKK191bXBfb3N1X2VycmNvZGVfdCBfdW1wX3VrdV9hbGxvY2F0ZSggX3VtcF91a19hbGxvY2F0ZV9zICphcmdzICk7CisKK191bXBfb3N1X2VycmNvZGVfdCBfdW1wX3VrdV9yZWxlYXNlKCBfdW1wX3VrX3JlbGVhc2VfcyAqYXJncyApOworCitfdW1wX29zdV9lcnJjb2RlX3QgX3VtcF91a3Vfc2l6ZV9nZXQoIF91bXBfdWtfc2l6ZV9nZXRfcyAqYXJncyApOworCitfdW1wX29zdV9lcnJjb2RlX3QgX3VtcF91a3VfZ2V0X2FwaV92ZXJzaW9uKCBfdW1wX3VrX2FwaV92ZXJzaW9uX3MgKmFyZ3MgKTsKKworaW50IF91bXBfdWt1X21hcF9tZW0oIF91bXBfdWtfbWFwX21lbV9zICphcmdzICk7CisKK3ZvaWQgX3VtcF91a3VfdW5tYXBfbWVtKCBfdW1wX3VrX3VubWFwX21lbV9zICphcmdzICk7CisKK3ZvaWQgX3VtcF91a3VfbXN5bmNoKF91bXBfdWtfbXN5bmNfcyAqYXJncyk7CisKKyNpZmRlZiBfX2NwbHVzcGx1cworfQorI2VuZGlmCisKKyNlbmRpZiAvKiBfX1VNUF9VS1VfSF9fICovCmRpZmYgLS1naXQgYS9leHlub3M0L2hhbC9saWJ1bXAvcmVhZG1lLnR4dCBiL2V4eW5vczQvaGFsL2xpYnVtcC9yZWFkbWUudHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjI5N2RmMzgKLS0tIC9kZXYvbnVsbAorKysgYi9leHlub3M0L2hhbC9saWJ1bXAvcmVhZG1lLnR4dApAQCAtMCwwICsxLDMxIEBACisjCisjIENvcHlyaWdodCAoQykgMjAxMC0yMDExIEFSTSBMaW1pdGVkLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorIyAKKyMgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisjIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyMgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisjIAorIyAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyMgCisjIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyMgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisjIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyMgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisjCitCdWlsZGluZyB0aGUgVU1QIHVzZXIgc3BhY2UgbGlicmFyeSBmb3IgTGludXgKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCitBIHNpbXBsZSBNYWtlZmlsZSBpcyBwcm92aWRlZCwgYW5kIHRoZSBVTVAgdXNlciBzcGFjZSBsaWJyYXJ5IGNhbiBiZSBidWlsdAorc2ltcGx5IGJ5IGlzc3VpbmcgbWFrZS4gVGhpcyBNYWtlZmlsZSBpcyBzZXR1cCB0byB1c2UgdGhlIEFSTSBHQ0MgY29tcGlsZXIKK2Zyb20gQ29kZVNvdXJjZXJ5LCBhbmQgaXQgYnVpbGRzIGZvciBBUk12Ni4gTW9kaWZpY2F0aW9uIHRvIHRoaXMgTWFrZWZpbGUKK2lzIG5lZWRlZCBpbiBvcmRlciB0byBidWlsZCBmb3Igb3RoZXIgY29uZmlndXJhdGlvbnMuCisKK0luIG9yZGVyIHRvIHVzZSB0aGlzIGxpYnJhcnkgZnJvbSB0aGUgTWFsaSBHUFUgZHJpdmVyLCBpbnZva2UgdGhlIE1hbGkgR1BVCitkcml2ZXIgYnVpbGQgc3lzdGVtIHdpdGggdGhlIGZvbGxvd2luZyB0d28gbWFrZSB2YXJpYWJsZXMgc2V0OworLSBVTVBfSU5DTFVERV9ESVIgc2hvdWxkIHBvaW50IHRvIHRoZSBpbmNsdWRlIGZvbGRlciBpbnNpZGUgdGhpcyBwYWNrYWdlCistIFVNUF9MSUIgc2hvdWxkIHBvaW50IHRvIHRoZSBidWlsdCBsaWJyYXJ5IChsaWJVTVAuc28pCisKK1RoaXMgZG9lcyBub3QgYXBwbHkgdG8gQW5kcm9pZCBidWlsZHMsIHdoZXJlIHRoZSBBbmRyb2lkLm1rIGZpbGUgZm9yIHRoZQorTWFsaSBHUFUgZHJpdmVyIG5lZWRzIHRvIGJlIG1hbnVhbGx5IGVkaXRlZCBpbiBvcmRlciB0byBhZGQgdGhlIGNvcnJlY3QKK2luY2x1ZGUgcGF0aCBhbmQgbGluayBhZ2FpbnN0IHRoZSBjb3JyZWN0IGxpYnJhcnkuCmRpZmYgLS1naXQgYS9leHlub3M0L2hhbC9saWJ1bXAvdW1wLm1hayBiL2V4eW5vczQvaGFsL2xpYnVtcC91bXAubWFrCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU0MTczMTMKLS0tIC9kZXYvbnVsbAorKysgYi9leHlub3M0L2hhbC9saWJ1bXAvdW1wLm1hawpAQCAtMCwwICsxLDM0IEBACisjCisjIENvcHlyaWdodCAoQykgMjAxMSBBUk0gTGltaXRlZC4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyMgCisjIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworIyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisjIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorIyAKKyMgICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisjIAorIyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisjIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisjIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorIyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisjIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorIworCitpZmVxICgkKFVNUF9OT19VTVApLDEpCisKK1VNUF9TUkNTID0gXAorCSQoVU1QX0RJUikvYXJjaF85OTlfbm9fdW1wL3VtcF9mcm9udGVuZC5jIFwKKwkkKFVNUF9ESVIpL2FyY2hfOTk5X25vX3VtcC91bXBfcmVmX2Rydi5jCisKK2Vsc2UKKworVU1QX1NSQ1MgPSBcCisJJChVTVBfRElSKS9hcmNoXzAxMV91ZGQvdW1wX2Zyb250ZW5kLmMgXAorCSQoVU1QX0RJUikvYXJjaF8wMTFfdWRkL3VtcF9yZWZfZHJ2LmMgXAorCSQoVU1QX0RJUikvYXJjaF8wMTFfdWRkL3VtcF9hcmNoLmMgXAorCSQoVU1QX0RJUikvb3MvJChVRERfT1MpL3VtcF91a3UuYyBcCisJJChVTVBfRElSKS9vcy8kKFVERF9PUykvdW1wX29zdV9tZW1vcnkuYyBcCisJJChVTVBfRElSKS9vcy8kKFVERF9PUykvdW1wX29zdV9sb2Nrcy5jCisKK2VuZGlmCisKZGlmZiAtLWdpdCBhL2V4eW5vczQvbXVsdGltZWRpYS9BbmRyb2lkLm1rIGIvZXh5bm9zNC9tdWx0aW1lZGlhL0FuZHJvaWQubWsKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjczOTk1MwotLS0gL2Rldi9udWxsCisrKyBiL2V4eW5vczQvbXVsdGltZWRpYS9BbmRyb2lkLm1rCkBAIC0wLDAgKzEsMyBAQAoraWZlcSAoJChUQVJHRVRfQk9BUkRfUExBVEZPUk0pLGV4eW5vczQpCitpbmNsdWRlICQoYWxsLXN1YmRpci1tYWtlZmlsZXMpCitlbmRpZgpkaWZmIC0tZ2l0IGEvZXh5bm9zNC9tdWx0aW1lZGlhL2NvZGVjcy9BbmRyb2lkLm1rIGIvZXh5bm9zNC9tdWx0aW1lZGlhL2NvZGVjcy9BbmRyb2lkLm1rCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjY1NzExNjEKLS0tIC9kZXYvbnVsbAorKysgYi9leHlub3M0L211bHRpbWVkaWEvY29kZWNzL0FuZHJvaWQubWsKQEAgLTAsMCArMSBAQAoraW5jbHVkZSAkKGFsbC1zdWJkaXItbWFrZWZpbGVzKQpkaWZmIC0tZ2l0IGEvZXh5bm9zNC9tdWx0aW1lZGlhL2NvZGVjcy9zZWNfY29kZWNzL0FuZHJvaWQubWsgYi9leHlub3M0L211bHRpbWVkaWEvY29kZWNzL3NlY19jb2RlY3MvQW5kcm9pZC5tawpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42NTcxMTYxCi0tLSAvZGV2L251bGwKKysrIGIvZXh5bm9zNC9tdWx0aW1lZGlhL2NvZGVjcy9zZWNfY29kZWNzL0FuZHJvaWQubWsKQEAgLTAsMCArMSBAQAoraW5jbHVkZSAkKGFsbC1zdWJkaXItbWFrZWZpbGVzKQpkaWZmIC0tZ2l0IGEvZXh5bm9zNC9tdWx0aW1lZGlhL2NvZGVjcy9zZWNfY29kZWNzL2F1ZGlvL0FuZHJvaWQubWsgYi9leHlub3M0L211bHRpbWVkaWEvY29kZWNzL3NlY19jb2RlY3MvYXVkaW8vQW5kcm9pZC5tawpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zYmMzNTc3Ci0tLSAvZGV2L251bGwKKysrIGIvZXh5bm9zNC9tdWx0aW1lZGlhL2NvZGVjcy9zZWNfY29kZWNzL2F1ZGlvL0FuZHJvaWQubWsKQEAgLTAsMCArMSwxMSBAQAorTE9DQUxfUEFUSCA6PSAkKGNhbGwgbXktZGlyKQorCitpbmNsdWRlICQoQ0xFQVJfVkFSUykKKworaWZlcSAoJChmaWx0ZXItb3V0IGV4eW5vczQsJChUQVJHRVRfQk9BUkRfUExBVEZPUk0pKSwpCitpbmNsdWRlICAgJChMT0NBTF9QQVRIKS9leHlub3M0L0FuZHJvaWQubWsKK2VuZGlmCisKK2lmZXEgKCQoZmlsdGVyLW91dCBleHlub3M1LCQoVEFSR0VUX0JPQVJEX1BMQVRGT1JNKSksKQoraW5jbHVkZSAgICQoTE9DQUxfUEFUSCkvZXh5bm9zNS9BbmRyb2lkLm1rCitlbmRpZgpkaWZmIC0tZ2l0IGEvZXh5bm9zNC9tdWx0aW1lZGlhL2NvZGVjcy9zZWNfY29kZWNzL2F1ZGlvL2V4eW5vczQvQW5kcm9pZC5tayBiL2V4eW5vczQvbXVsdGltZWRpYS9jb2RlY3Mvc2VjX2NvZGVjcy9hdWRpby9leHlub3M0L0FuZHJvaWQubWsKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZGY5MzhiZQotLS0gL2Rldi9udWxsCisrKyBiL2V4eW5vczQvbXVsdGltZWRpYS9jb2RlY3Mvc2VjX2NvZGVjcy9hdWRpby9leHlub3M0L0FuZHJvaWQubWsKQEAgLTAsMCArMSwxNCBAQAorTE9DQUxfUEFUSCA6PSAkKGNhbGwgbXktZGlyKQorCitpbmNsdWRlICQoQ0xFQVJfVkFSUykKKworTE9DQUxfQVVESU9fUEFUSCA6PSQoTE9DQUxfUEFUSCkKKworaWZlcSAoJChCT0FSRF9VU0VfQUxQX0FVRElPKSwgdHJ1ZSkKKyAgaW5jbHVkZSAkKExPQ0FMX0FVRElPX1BBVEgpL3NycC9hbHAvQW5kcm9pZC5taworZWxzZQorICBpZmVxICgkKFVTRV9VTFBfQVVESU8pLCB0cnVlKQorICAgIGluY2x1ZGUgJChMT0NBTF9BVURJT19QQVRIKS9zcnAvdWxwL0FuZHJvaWQubWsKKyAgICBpbmNsdWRlICQoTE9DQUxfQVVESU9fUEFUSCkvc3JwL2xpYnNhX2puaS9BbmRyb2lkLm1rCisgIGVuZGlmCitlbmRpZgpkaWZmIC0tZ2l0IGEvZXh5bm9zNC9tdWx0aW1lZGlhL2NvZGVjcy9zZWNfY29kZWNzL2F1ZGlvL2V4eW5vczQvc3JwL2FscC9BbmRyb2lkLm1rIGIvZXh5bm9zNC9tdWx0aW1lZGlhL2NvZGVjcy9zZWNfY29kZWNzL2F1ZGlvL2V4eW5vczQvc3JwL2FscC9BbmRyb2lkLm1rCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjczOTNmNjgKLS0tIC9kZXYvbnVsbAorKysgYi9leHlub3M0L211bHRpbWVkaWEvY29kZWNzL3NlY19jb2RlY3MvYXVkaW8vZXh5bm9zNC9zcnAvYWxwL0FuZHJvaWQubWsKQEAgLTAsMCArMSwyNiBAQAorTE9DQUxfUEFUSCA6PSAkKGNhbGwgbXktZGlyKQoraW5jbHVkZSAkKENMRUFSX1ZBUlMpCisKK0xPQ0FMX0NPUFlfSEVBREVSU19UTyA6PSBsaWJzZWNtbQorTE9DQUxfQ09QWV9IRUFERVJTIDo9IFwKKwlpbmNsdWRlL3NycF9hcGkuaCBcCisJaW5jbHVkZS9zcnBfaW9jdGwuaCBcCisJaW5jbHVkZS9zcnBfZXJyb3IuaAorCitMT0NBTF9TUkNfRklMRVMgOj0gXAorCXNyYy9zcnBfYXBpLmMKKworTE9DQUxfQ19JTkNMVURFUyA6PSBcCisJJChMT0NBTF9QQVRIKS9pbmNsdWRlCisKK0xPQ0FMX01PRFVMRSA6PSBsaWJzcnBhcGkKKworTE9DQUxfTU9EVUxFX1RBR1MgOj0gb3B0aW9uYWwKKworTE9DQUxfQVJNX01PREUgOj0gYXJtCisKK0xPQ0FMX1NUQVRJQ19MSUJSQVJJRVMgOj0KKworTE9DQUxfU0hBUkVEX0xJQlJBUklFUyA6PQorCitpbmNsdWRlICQoQlVJTERfU1RBVElDX0xJQlJBUlkpCmRpZmYgLS1naXQgYS9leHlub3M0L211bHRpbWVkaWEvY29kZWNzL3NlY19jb2RlY3MvYXVkaW8vZXh5bm9zNC9zcnAvYWxwL2luY2x1ZGUvc3JwX2FwaS5oIGIvZXh5bm9zNC9tdWx0aW1lZGlhL2NvZGVjcy9zZWNfY29kZWNzL2F1ZGlvL2V4eW5vczQvc3JwL2FscC9pbmNsdWRlL3NycF9hcGkuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hZDY1YjkwCi0tLSAvZGV2L251bGwKKysrIGIvZXh5bm9zNC9tdWx0aW1lZGlhL2NvZGVjcy9zZWNfY29kZWNzL2F1ZGlvL2V4eW5vczQvc3JwL2FscC9pbmNsdWRlL3NycF9hcGkuaApAQCAtMCwwICsxLDUyIEBACisjaWZuZGVmIF9fU1JQX0FQSV9IX18KKyNkZWZpbmUgX19TUlBfQVBJX0hfXworCisjaW5jbHVkZSAic3JwX2lvY3RsLmgiCisjaW5jbHVkZSAic3JwX2Vycm9yLmgiCisKKyNkZWZpbmUgU1JQX0RFVl9OQU1FICAgICAgICAgICAgICAgICAgICAiZGV2L3NycCIKKworI2RlZmluZSBTUlBfSU5JVF9CTE9DS19NT0RFICAgICAgICAgICAgIDAKKyNkZWZpbmUgU1JQX0lOSVRfTk9OQkxPQ0tfTU9ERSAgICAgICAgICAxCisKKyNkZWZpbmUgU1JQX1BFTkRJTkdfU1RBVEVfUlVOTklORyAgICAgICAwCisjZGVmaW5lIFNSUF9QRU5ESU5HX1NUQVRFX1BFTkRJTkcgICAgICAgMQorCitzdHJ1Y3Qgc3JwX2J1Zl9pbmZvIHsKKyAgICB2b2lkICptbWFwcGVkX2FkZHI7CisgICAgdm9pZCAqYWRkcjsKKyAgICB1bnNpZ25lZCBpbnQgbW1hcHBlZF9zaXplOworICAgIHVuc2lnbmVkIGludCBzaXplOworICAgIGludCBudW07Cit9OworCitzdHJ1Y3Qgc3JwX2RlY19pbmZvIHsKKyAgICB1bnNpZ25lZCBpbnQgc2FtcGxlX3JhdGU7CisgICAgdW5zaWduZWQgaW50IGNoYW5uZWxzOworfTsKKworI2lmZGVmIF9fY3BsdXNwbHVzCitleHRlcm4gIkMiIHsKKyNlbmRpZgorCitpbnQgU1JQX0NyZWF0ZShpbnQgYmxvY2tfbW9kZSk7CitpbnQgU1JQX0luaXQoKTsKK2ludCBTUlBfRGVjb2RlKHZvaWQgKmJ1ZmYsIGludCBzaXplX2J5dGUpOworaW50IFNSUF9TZW5kX0VPUyh2b2lkKTsKK2ludCBTUlBfU2V0UGFyYW1zKGludCBpZCwgdW5zaWduZWQgbG9uZyB2YWwpOworaW50IFNSUF9HZXRQYXJhbXMoaW50IGlkLCB1bnNpZ25lZCBsb25nICpwdmFsKTsKK2ludCBTUlBfRGVpbml0KHZvaWQpOworaW50IFNSUF9UZXJtaW5hdGUodm9pZCk7CitpbnQgU1JQX0lzT3Blbih2b2lkKTsKKworaW50IFNSUF9HZXRfSWJ1Zl9JbmZvKHZvaWQgKiphZGRyLCB1bnNpZ25lZCBpbnQgKnNpemUsIHVuc2lnbmVkIGludCAqbnVtKTsKK2ludCBTUlBfR2V0X09idWZfSW5mbyh2b2lkICoqYWRkciwgdW5zaWduZWQgaW50ICpzaXplLCB1bnNpZ25lZCBpbnQgKm51bSk7CitpbnQgU1JQX0dldF9EZWNfSW5mbyhzdHJ1Y3Qgc3JwX2RlY19pbmZvICpkZWNfaW5mbyk7CitpbnQgU1JQX0dldF9QQ00odm9pZCAqKmFkZHIsIHVuc2lnbmVkIGludCAqc2l6ZSk7CitpbnQgU1JQX0ZsdXNoKHZvaWQpOworCisjaWZkZWYgX19jcGx1c3BsdXMKK30KKyNlbmRpZgorCisjZW5kaWYgLypfX1NSUF9BUElfSF9fICovCmRpZmYgLS1naXQgYS9leHlub3M0L211bHRpbWVkaWEvY29kZWNzL3NlY19jb2RlY3MvYXVkaW8vZXh5bm9zNC9zcnAvYWxwL2luY2x1ZGUvc3JwX2Vycm9yLmggYi9leHlub3M0L211bHRpbWVkaWEvY29kZWNzL3NlY19jb2RlY3MvYXVkaW8vZXh5bm9zNC9zcnAvYWxwL2luY2x1ZGUvc3JwX2Vycm9yLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uN2Y3OTQ1MgotLS0gL2Rldi9udWxsCisrKyBiL2V4eW5vczQvbXVsdGltZWRpYS9jb2RlY3Mvc2VjX2NvZGVjcy9hdWRpby9leHlub3M0L3NycC9hbHAvaW5jbHVkZS9zcnBfZXJyb3IuaApAQCAtMCwwICsxLDIyIEBACisjaWZuZGVmIF9TUlBfRVJST1JfSF8KKyNkZWZpbmUgX1NSUF9FUlJPUl9IXworCit0eXBlZGVmIGVudW0geworICAgIFNSUF9SRVRVUk5fT0sgPSAwLAorCisgICAgU1JQX0VSUk9SX09QRU5fRkFJTCAgICAgICA9IC0xMDAwLAorICAgIFNSUF9FUlJPUl9BTFJFQURZX09QRU4gICAgPSAtMTAwMSwKKyAgICBTUlBfRVJST1JfTk9UX1JFQURZICAgICAgID0gLTEwMDIsCisKKyAgICBTUlBfRVJST1JfSUJVRl9PVkVSRkxPVyAgID0gLTIwMDAsCisgICAgU1JQX0VSUk9SX0lCVUZfSU5GTyAgICAgICA9IC0yMDAxLAorCisgICAgU1JQX0VSUk9SX09CVUZfUkVBRCAgICAgICA9IC0zMDAwLAorICAgIFNSUF9FUlJPUl9PQlVGX0lORk8gICAgICAgPSAtMzAwMSwKKyAgICBTUlBfRVJST1JfT0JVRl9NTUFQICAgICAgID0gLTMwMDIsCisKKyAgICBTUlBfRVJST1JfSU5WQUxJRF9TRVRUSU5HID0gLTQwMDAsCisgICAgU1JQX0VSUk9SX0dFVElORk9fRkFJTCAgICA9IC00MDAxCit9IFNSUF9FUlJPUlRZUEU7CisKKyNlbmRpZiAvKiBfU1JQX0VSUk9SX0hfICovCmRpZmYgLS1naXQgYS9leHlub3M0L211bHRpbWVkaWEvY29kZWNzL3NlY19jb2RlY3MvYXVkaW8vZXh5bm9zNC9zcnAvYWxwL2luY2x1ZGUvc3JwX2lvY3RsLmggYi9leHlub3M0L211bHRpbWVkaWEvY29kZWNzL3NlY19jb2RlY3MvYXVkaW8vZXh5bm9zNC9zcnAvYWxwL2luY2x1ZGUvc3JwX2lvY3RsLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjFkNTVkZgotLS0gL2Rldi9udWxsCisrKyBiL2V4eW5vczQvbXVsdGltZWRpYS9jb2RlY3Mvc2VjX2NvZGVjcy9hdWRpby9leHlub3M0L3NycC9hbHAvaW5jbHVkZS9zcnBfaW9jdGwuaApAQCAtMCwwICsxLDIzIEBACisjaWZuZGVmIF9fU1JQX0lPQ1RMX0hfXworI2RlZmluZSBfX1NSUF9JT0NUTF9IX18KKworI2lmZGVmIF9fY3BsdXNwbHVzCitleHRlcm4gIkMiIHsKKyNlbmRpZgorCisjZGVmaW5lIFNSUF9JTklUICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoMHgxMDAwMCkKKyNkZWZpbmUgU1JQX0RFSU5JVCAgICAgICAgICAgICAgICAgICAgICAgICAgICgweDEwMDAxKQorI2RlZmluZSBTUlBfR0VUX01NQVBfU0laRSAgICAgICAgICAgICAgICAgICAgKDB4MTAwMDIpCisjZGVmaW5lIFNSUF9GTFVTSCAgICAgICAgICAgICAgICAgICAgICAgICAgICAoMHgyMDAwMikKKyNkZWZpbmUgU1JQX1NFTkRfRU9TICAgICAgICAgICAgICAgICAgICAgICAgICgweDIwMDA1KQorI2RlZmluZSBTUlBfR0VUX0lCVUZfSU5GTyAgICAgICAgICAgICAgICAgICAgKDB4MjAwMDcpCisjZGVmaW5lIFNSUF9HRVRfT0JVRl9JTkZPICAgICAgICAgICAgICAgICAgICAoMHgyMDAwOCkKKyNkZWZpbmUgU1JQX1NUT1BfRU9TX1NUQVRFICAgICAgICAgICAgICAgICAgICgweDMwMDA3KQorI2RlZmluZSBTUlBfR0VUX0RFQ19JTkZPICAgICAgICAgICAgICAgICAgICAgKDB4MzAwMDgpCisKKyNpZmRlZiBfX2NwbHVzcGx1cworfQorI2VuZGlmCisKKyNlbmRpZiAvKiBfX1NSUF9JT0NUTF9IX18gKi8KKwpkaWZmIC0tZ2l0IGEvZXh5bm9zNC9tdWx0aW1lZGlhL2NvZGVjcy9zZWNfY29kZWNzL2F1ZGlvL2V4eW5vczQvc3JwL2FscC9zcmMvc3JwX2FwaS5jIGIvZXh5bm9zNC9tdWx0aW1lZGlhL2NvZGVjcy9zZWNfY29kZWNzL2F1ZGlvL2V4eW5vczQvc3JwL2FscC9zcmMvc3JwX2FwaS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjU2MTI1ZmIKLS0tIC9kZXYvbnVsbAorKysgYi9leHlub3M0L211bHRpbWVkaWEvY29kZWNzL3NlY19jb2RlY3MvYXVkaW8vZXh5bm9zNC9zcnAvYWxwL3NyYy9zcnBfYXBpLmMKQEAgLTAsMCArMSwyNjUgQEAKKyNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KKyNpbmNsdWRlIDxzeXMvc3RhdC5oPgorI2luY2x1ZGUgPHN5cy9pb2N0bC5oPgorI2luY2x1ZGUgPHN5cy9tbWFuLmg+CisjaW5jbHVkZSA8c3lzL3RpbWUuaD4KKyNpbmNsdWRlIDxmY250bC5oPgorI2luY2x1ZGUgPGN0eXBlLmg+CisjaW5jbHVkZSA8dW5pc3RkLmg+CisjaW5jbHVkZSA8c3RyaW5nLmg+CisjaW5jbHVkZSA8ZXJybm8uaD4KKyNpbmNsdWRlIDxzdGRpby5oPgorCisjaW5jbHVkZSAic3JwX2FwaS5oIgorCisjZGVmaW5lIExPR19OREVCVUcgMQorI2RlZmluZSBMT0dfVEFHICJsaWJzcnBhcGkiCisjaW5jbHVkZSA8dXRpbHMvTG9nLmg+CisKK3N0YXRpYyBzdHJ1Y3Qgc3JwX2J1Zl9pbmZvIGlidWZfaW5mbzsKK3N0YXRpYyBzdHJ1Y3Qgc3JwX2J1Zl9pbmZvIG9idWZfaW5mbzsKK3N0YXRpYyBzdHJ1Y3Qgc3JwX2J1Zl9pbmZvIHBjbV9pbmZvOworCitzdGF0aWMgaW50IHNycF9kZXYgPSAtMTsKK3N0YXRpYyBpbnQgc3JwX2Jsb2NrX21vZGUgPSBTUlBfSU5JVF9CTE9DS19NT0RFOworCitpbnQgU1JQX0NyZWF0ZShpbnQgYmxvY2tfbW9kZSkKK3sKKyAgICBpZiAoc3JwX2RldiA9PSAtMSkgeworICAgICAgICBzcnBfYmxvY2tfbW9kZSA9IGJsb2NrX21vZGU7CisgICAgICAgIHNycF9kZXYgPSBvcGVuKFNSUF9ERVZfTkFNRSwgT19SRFdSIHwKKyAgICAgICAgICAgICAgICAgICAgKChibG9ja19tb2RlID09IFNSUF9JTklUX05PTkJMT0NLX01PREUpID8gT19OREVMQVkgOiAwKSk7CisgICAgICAgIGlmIChzcnBfZGV2ID4gMCkKKyAgICAgICAgICAgIHJldHVybiBzcnBfZGV2OworICAgICAgICBlbHNlCisgICAgICAgICAgICByZXR1cm4gU1JQX0VSUk9SX09QRU5fRkFJTDsKKyAgICB9CisKKyAgICBMT0dFKCIlczogRGV2aWNlIGlzIGFscmVhZHkgb3BlbmVkIiwgX19mdW5jX18pOworICAgIHJldHVybiBTUlBfRVJST1JfQUxSRUFEWV9PUEVOOworfQorCitpbnQgU1JQX0luaXQoKQoreworICAgIGludCByZXQgPSBTUlBfUkVUVVJOX09LOworICAgIHVuc2lnbmVkIGludCBtbWFwcGVkX3NpemUgPSAwOworCisgICAgaWYgKHNycF9kZXYgIT0gLTEpIHsKKyAgICAgICAgcmV0ID0gaW9jdGwoc3JwX2RldiwgU1JQX0lOSVQpOworICAgICAgICBpZiAocmV0IDwgMCkKKyAgICAgICAgICAgIHJldHVybiByZXQ7CisKKyAgICAgICAgLyogbW1hcCBmb3IgT0JVRiAqLworICAgICAgICByZXQgPSBpb2N0bChzcnBfZGV2LCBTUlBfR0VUX01NQVBfU0laRSwgJm1tYXBwZWRfc2l6ZSk7CisgICAgICAgIGlmIChyZXQgPCAwKSB7CisgICAgICAgICAgICBMT0dFKCIlczogU1JQX0dFVF9NTUFQX1NJWkUgaXMgZmFpbGVkIiwgX19mdW5jX18pOworICAgICAgICAgICAgcmV0dXJuIFNSUF9FUlJPUl9PQlVGX01NQVA7CisgICAgICAgIH0KKyAgICAgICAgb2J1Zl9pbmZvLm1tYXBwZWRfYWRkciA9IG1tYXAoMCwgbW1hcHBlZF9zaXplLAorICAgICAgICAgICAgICAgICAgICBQUk9UX1JFQUQgfCBQUk9UX1dSSVRFLCBNQVBfU0hBUkVELCBzcnBfZGV2LCAwKTsKKyAgICAgICAgaWYgKCFvYnVmX2luZm8ubW1hcHBlZF9hZGRyKSB7CisgICAgICAgICAgICBMT0dFKCIlczogbW1hcCBpcyBmYWlsZWQiLCBfX2Z1bmNfXyk7CisgICAgICAgICAgICByZXR1cm4gU1JQX0VSUk9SX09CVUZfTU1BUDsKKyAgICAgICAgfQorICAgICAgICBvYnVmX2luZm8ubW1hcHBlZF9zaXplID0gbW1hcHBlZF9zaXplOworCisgICAgICAgIHJldCA9IFNSUF9SRVRVUk5fT0s7CisgICAgfSBlbHNlIHsKKyAgICAgICAgTE9HRSgiJXM6IERldmljZSBpcyBub3QgcmVhZHkiLCBfX2Z1bmNfXyk7CisgICAgICAgIHJldCA9IFNSUF9FUlJPUl9OT1RfUkVBRFk7IC8qIGRldmljZSBpcyBub3QgY3JlYXRlZCAqLworICAgIH0KKworICAgIHJldHVybiByZXQ7Cit9CisKK2ludCBTUlBfRGVjb2RlKHZvaWQgKmJ1ZmYsIGludCBzaXplX2J5dGUpCit7CisgICAgaW50IHJldCA9IFNSUF9SRVRVUk5fT0s7CisKKyAgICBpZiAoc3JwX2RldiAhPSAtMSkgeworICAgICAgICBpZiAoc2l6ZV9ieXRlID4gMCkgeworICAgICAgICAgICAgTE9HVigiJXM6IFNlbmQgZGF0YSB0byBSUCAoJWQgYnl0ZXMpIiwgX19mdW5jX18sIHNpemVfYnl0ZSk7CisKKyAgICAgICAgICAgIHJldCA9IHdyaXRlKHNycF9kZXYsIGJ1ZmYsIHNpemVfYnl0ZSk7ICAvKiBXcml0ZSBCdWZmZXIgdG8gUlAgRHJpdmVyICovCisgICAgICAgICAgICBpZiAocmV0IDwgMCkgeworICAgICAgICAgICAgICAgIGlmIChyZXQgIT0gU1JQX0VSUk9SX0lCVUZfT1ZFUkZMT1cpCisgICAgICAgICAgICAgICAgICAgIExPR0UoIlNSUF9EZWNvZGUgcmV0dXJuZWQgZXJyb3IgY29kZTogJWQiLCByZXQpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgcmV0dXJuIHJldDsgLyogV3JpdGUgU3VjY2VzcyAqLworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgcmV0dXJuIHJldDsKKyAgICAgICAgfQorICAgIH0KKworICAgIExPR0UoIiVzOiBEZXZpY2UgaXMgbm90IHJlYWR5IiwgX19mdW5jX18pOworICAgIHJldHVybiBTUlBfRVJST1JfTk9UX1JFQURZOworfQorCitpbnQgU1JQX1NlbmRfRU9TKHZvaWQpCit7CisgICAgaWYgKHNycF9kZXYgIT0gLTEpCisgICAgICAgIHJldHVybiBpb2N0bChzcnBfZGV2LCBTUlBfU0VORF9FT1MpOworCisgICAgcmV0dXJuIFNSUF9FUlJPUl9OT1RfUkVBRFk7Cit9CisKK2ludCBTUlBfU2V0UGFyYW1zKGludCBpZCwgdW5zaWduZWQgbG9uZyB2YWwpCit7CisgICAgaWYgKHNycF9kZXYgIT0gLTEpCisgICAgICAgIHJldHVybiAwOyAvKiBub3QgeWV0ICovCisKKyAgICByZXR1cm4gU1JQX0VSUk9SX05PVF9SRUFEWTsKK30KKworaW50IFNSUF9HZXRQYXJhbXMoaW50IGlkLCB1bnNpZ25lZCBsb25nICpwdmFsKQoreworICAgIGlmIChzcnBfZGV2ICE9IC0xKQorICAgICAgICByZXR1cm4gaW9jdGwoc3JwX2RldiwgaWQsIHB2YWwpOworCisgICAgcmV0dXJuIFNSUF9FUlJPUl9OT1RfUkVBRFk7Cit9CisKK2ludCBTUlBfRmx1c2godm9pZCkKK3sKKyAgICBpZiAoc3JwX2RldiAhPSAtMSkKKyAgICAgICAgcmV0dXJuIGlvY3RsKHNycF9kZXYsIFNSUF9GTFVTSCk7CisKKyAgICByZXR1cm4gU1JQX0VSUk9SX05PVF9SRUFEWTsKK30KKworaW50IFNSUF9HZXRfUENNKHZvaWQgKiphZGRyLCB1bnNpZ25lZCBpbnQgKnNpemUpCit7CisgICAgaW50IHJldCA9IFNSUF9SRVRVUk5fT0s7CisKKyAgICBpZiAoc3JwX2RldiAhPSAtMSkgeworICAgICAgICByZXQgPSByZWFkKHNycF9kZXYsICZwY21faW5mbywgMCk7CisgICAgICAgIGlmIChyZXQgPT0gLTEpIHsKKyAgICAgICAgICAgICpzaXplID0gMDsKKyAgICAgICAgICAgIExPR0UoIiVzOiBQQ00gcmVhZCBmYWlsIiwgX19mdW5jX18pOworICAgICAgICAgICAgcmV0dXJuIFNSUF9FUlJPUl9PQlVGX1JFQUQ7CisgICAgICAgIH0KKworICAgICAgICAqYWRkciA9IHBjbV9pbmZvLmFkZHI7CisgICAgICAgICpzaXplID0gcGNtX2luZm8uc2l6ZTsKKyAgICB9IGVsc2UgeworICAgICAgICByZXR1cm4gU1JQX0VSUk9SX05PVF9SRUFEWTsKKyAgICB9CisKKyAgICByZXR1cm4gcmV0OyAvKiBSZWFkIFN1Y2Nlc3MgKi8KK30KKworaW50IFNSUF9HZXRfRGVjX0luZm8oc3RydWN0IHNycF9kZWNfaW5mbyAqZGVjX2luZm8pCit7CisgICAgaW50IHJldDsKKworICAgIGlmIChzcnBfZGV2ICE9IC0xKSB7CisgICAgICAgIHJldCA9IGlvY3RsKHNycF9kZXYsIFNSUF9HRVRfREVDX0lORk8sIGRlY19pbmZvKTsKKyAgICAgICAgaWYgKHJldCA8IDApIHsKKyAgICAgICAgICAgIExPR0UoIiVzOiBGYWlsZWQgdG8gZ2V0IGRlYyBpbmZvIiwgX19mdW5jX18pOworICAgICAgICAgICAgcmV0dXJuIFNSUF9FUlJPUl9HRVRJTkZPX0ZBSUw7CisgICAgICAgIH0KKworICAgICAgICBMT0dWKCJudW1DaGFubmVscyglZCksIHNhbXBsaW5nUmF0ZSglZCkiLCBkZWNfaW5mby0+Y2hhbm5lbHMsIGRlY19pbmZvLT5zYW1wbGVfcmF0ZSk7CisKKyAgICAgICAgcmV0ID0gU1JQX1JFVFVSTl9PSzsKKyAgICB9IGVsc2UgeworICAgICAgICByZXQgPSBTUlBfRVJST1JfTk9UX1JFQURZOworICAgIH0KKworICAgIHJldHVybiByZXQ7Cit9CisKK2ludCBTUlBfR2V0X0lidWZfSW5mbyh2b2lkICoqYWRkciwgdW5zaWduZWQgaW50ICpzaXplLCB1bnNpZ25lZCBpbnQgKm51bSkKK3sKKyAgICBpbnQgcmV0ID0gU1JQX1JFVFVSTl9PSzsKKworICAgIGlmIChzcnBfZGV2ICE9IC0xKSB7CisgICAgICAgIHJldCA9IGlvY3RsKHNycF9kZXYsIFNSUF9HRVRfSUJVRl9JTkZPLCAmaWJ1Zl9pbmZvKTsKKyAgICAgICAgaWYgKHJldCA9PSAtMSkgeworICAgICAgICAgICAgTE9HRSgiJXM6IEZhaWxlZCB0byBnZXQgSWJ1ZiBpbmZvIiwgX19mdW5jX18pOworICAgICAgICAgICAgcmV0dXJuIFNSUF9FUlJPUl9JQlVGX0lORk87CisgICAgICAgIH0KKworICAgICAgICAqYWRkciA9IGlidWZfaW5mby5hZGRyOworICAgICAgICAqc2l6ZSA9IGlidWZfaW5mby5zaXplOworICAgICAgICAqbnVtID0gaWJ1Zl9pbmZvLm51bTsKKworICAgICAgICBpZiAoKm51bSA9PSAwKSB7CisgICAgICAgICAgICBMT0dFKCIlczogSUJVRiBudW0gaXMgMCIsIF9fZnVuY19fKTsKKyAgICAgICAgICAgIHJldHVybiBTUlBfRVJST1JfSU5WQUxJRF9TRVRUSU5HOworICAgICAgICB9CisKKyAgICAgICAgcmV0ID0gU1JQX1JFVFVSTl9PSzsKKyAgICB9IGVsc2UgeworICAgICAgICByZXQgPSBTUlBfRVJST1JfTk9UX1JFQURZOworICAgIH0KKworICAgIHJldHVybiByZXQ7Cit9CisKK2ludCBTUlBfR2V0X09idWZfSW5mbyh2b2lkICoqYWRkciwgdW5zaWduZWQgaW50ICpzaXplLCB1bnNpZ25lZCBpbnQgKm51bSkKK3sKKyAgICBpbnQgcmV0ID0gU1JQX1JFVFVSTl9PSzsKKworICAgIGlmIChzcnBfZGV2ICE9IC0xKSB7CisgICAgICAgIGlmIChvYnVmX2luZm8uYWRkciA9PSBOVUxMKSB7CisgICAgICAgICAgICByZXQgPSBpb2N0bChzcnBfZGV2LCBTUlBfR0VUX09CVUZfSU5GTywgJm9idWZfaW5mbyk7CisgICAgICAgICAgICBpZiAocmV0IDwgMCkgeworICAgICAgICAgICAgICAgIExPR0UoIiVzOiBTUlBfR0VUX09CVUZfSU5GTyBpcyBmYWlsZWQiLCBfX2Z1bmNfXyk7CisgICAgICAgICAgICAgICAgcmV0dXJuIFNSUF9FUlJPUl9PQlVGX0lORk87CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICAqYWRkciA9IG9idWZfaW5mby5hZGRyOworICAgICAgICAqc2l6ZSA9IG9idWZfaW5mby5zaXplOworICAgICAgICAqbnVtID0gb2J1Zl9pbmZvLm51bTsKKworICAgICAgICBpZiAoKm51bSA9PSAwKSB7CisgICAgICAgICAgICBMT0dFKCIlczogT0JVRiBudW0gaXMgMCIsIF9fZnVuY19fKTsKKyAgICAgICAgICAgIHJldHVybiBTUlBfRVJST1JfSU5WQUxJRF9TRVRUSU5HOworICAgICAgICB9CisKKyAgICAgICAgcmV0ID0gU1JQX1JFVFVSTl9PSzsKKyAgICB9IGVsc2UgeworICAgICAgICByZXQgPSBTUlBfRVJST1JfTk9UX1JFQURZOworICAgIH0KKworICAgIHJldHVybiByZXQ7Cit9CisKK2ludCBTUlBfRGVpbml0KHZvaWQpCit7CisgICAgaWYgKHNycF9kZXYgIT0gLTEpIHsKKyAgICAgICAgbXVubWFwKG9idWZfaW5mby5tbWFwcGVkX2FkZHIsIG9idWZfaW5mby5tbWFwcGVkX3NpemUpOworICAgICAgICByZXR1cm4gaW9jdGwoc3JwX2RldiwgU1JQX0RFSU5JVCk7CisgICAgfQorCisgICAgcmV0dXJuIFNSUF9FUlJPUl9OT1RfUkVBRFk7Cit9CisKK2ludCBTUlBfVGVybWluYXRlKHZvaWQpCit7CisgICAgaW50IHJldDsKKworICAgIGlmIChzcnBfZGV2ICE9IC0xKSB7CisgICAgICAgIHJldCA9IGNsb3NlKHNycF9kZXYpOworCisgICAgICAgIGlmIChyZXQgPT0gMCkgeworICAgICAgICAgICAgc3JwX2RldiA9IC0xOyAvKiBkZXZpY2UgY2xvc2VkICovCisgICAgICAgICAgICByZXR1cm4gU1JQX1JFVFVSTl9PSzsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiBTUlBfRVJST1JfTk9UX1JFQURZOworfQorCitpbnQgU1JQX0lzT3Blbih2b2lkKQoreworICAgIGlmIChzcnBfZGV2ID09IC0xKSB7CisgICAgICAgIExPR1YoIiVzOiBEZXZpY2UgaXMgbm90IG9wZW5lZCIsIF9fZnVuY19fKTsKKyAgICAgICAgcmV0dXJuIDA7CisgICAgfQorCisgICAgTE9HVigiJXM6IERldmljZSBpcyBvcGVuZWQiLCBfX2Z1bmNfXyk7CisgICAgcmV0dXJuIDE7Cit9CmRpZmYgLS1naXQgYS9leHlub3M0L211bHRpbWVkaWEvY29kZWNzL3NlY19jb2RlY3MvYXVkaW8vZXh5bm9zNC9zcnAvbGlic2Ffam5pL0FuZHJvaWQubWsgYi9leHlub3M0L211bHRpbWVkaWEvY29kZWNzL3NlY19jb2RlY3MvYXVkaW8vZXh5bm9zNC9zcnAvbGlic2Ffam5pL0FuZHJvaWQubWsKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODQ1MDg0NQotLS0gL2Rldi9udWxsCisrKyBiL2V4eW5vczQvbXVsdGltZWRpYS9jb2RlY3Mvc2VjX2NvZGVjcy9hdWRpby9leHlub3M0L3NycC9saWJzYV9qbmkvQW5kcm9pZC5tawpAQCAtMCwwICsxLDEzIEBACitMT0NBTF9QQVRIIDo9ICQoY2FsbCBteS1kaXIpCitpbmNsdWRlICQoQ0xFQVJfVkFSUykKKworTE9DQUxfTU9EVUxFX1RBR1MgOj0gb3B0aW9uYWwKK0xPQ0FMX1BSRUxJTktfTU9EVUxFIDo9IGZhbHNlCisKK0xPQ0FMX01PRFVMRSA6PSBsaWJzYV9qbmkKK0xPQ0FMX1NSQ19GSUxFUyA6PSBTQUN0cmwuYworCitMT0NBTF9TSEFSRURfTElCUkFSSUVTIDo9ICBsaWJjdXRpbHMKK0xPQ0FMX1NUQVRJQ19MSUJSQVJJRVMgOj0gbGlic3JwYXBpCisKK2luY2x1ZGUgJChCVUlMRF9TSEFSRURfTElCUkFSWSkKZGlmZiAtLWdpdCBhL2V4eW5vczQvbXVsdGltZWRpYS9jb2RlY3Mvc2VjX2NvZGVjcy9hdWRpby9leHlub3M0L3NycC9saWJzYV9qbmkvU0FDdHJsLmMgYi9leHlub3M0L211bHRpbWVkaWEvY29kZWNzL3NlY19jb2RlY3MvYXVkaW8vZXh5bm9zNC9zcnAvbGlic2Ffam5pL1NBQ3RybC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjZiOTlkYzMKLS0tIC9kZXYvbnVsbAorKysgYi9leHlub3M0L211bHRpbWVkaWEvY29kZWNzL3NlY19jb2RlY3MvYXVkaW8vZXh5bm9zNC9zcnAvbGlic2Ffam5pL1NBQ3RybC5jCkBAIC0wLDAgKzEsMzMgQEAKKyNpbmNsdWRlIDxqbmkuaD4KKyNpbmNsdWRlIDx0aW1lLmg+CisKKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgPHN0ZGxpYi5oPgorI2luY2x1ZGUgPG1hdGguaD4KKworI2luY2x1ZGUgInNycF9hcGlfY3RybC5oIgorCisjZGVmaW5lIExPR19UQUcgImxpYnNhX2puaSIKKyNpbmNsdWRlIDxjdXRpbHMvbG9nLmg+CisKK3ZvaWQgSmF2YV9jb21fYW5kcm9pZF9tdXNpY19TZXRTQUN0cmxKTklfc2V0KEpOSUVudiAqIGVudiwgam9iamVjdCBvYmosIGludCBlZmZlY3RfbnVtKQoreworICAgIHVuc2lnbmVkIGxvbmcgZWZmZWN0X2VuYWJsZSA9IGVmZmVjdF9udW0gPyAxIDogMDsKKyAgICB1bnNpZ25lZCBpbnQgcmV0OworCisgICAgTE9HRCgiU291bmQgZWZmZWN0WyVkXSIsIGVmZmVjdF9udW0pOworCisgICAgcmV0ID0gU1JQX0N0cmxfRW5hYmxlX0VmZmVjdChlZmZlY3RfZW5hYmxlKTsKKyAgICBpZiAocmV0IDwgMCkgeworICAgICAgICBMT0dFKCIlczogQ291bGRuJ3QgZW5hYmxlZCBlZmZlY3RcbiIsIF9fZnVuY19fKTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIFNSUF9DdHJsX1NldF9FZmZlY3RfRGVmKGVmZmVjdF9udW0gPDwgNSk7CisgICAgaWYgKHJldCA8IDApIHsKKyAgICAgICAgTE9HRSgiJXM6IENvdWxkbid0IGRlZmluZWQgZWZmZWN0XG4iLCBfX2Z1bmNfXyk7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICByZXR1cm47Cit9CmRpZmYgLS1naXQgYS9leHlub3M0L211bHRpbWVkaWEvY29kZWNzL3NlY19jb2RlY3MvYXVkaW8vZXh5bm9zNC9zcnAvdWxwL0FuZHJvaWQubWsgYi9leHlub3M0L211bHRpbWVkaWEvY29kZWNzL3NlY19jb2RlY3MvYXVkaW8vZXh5bm9zNC9zcnAvdWxwL0FuZHJvaWQubWsKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNWIxZDM5NwotLS0gL2Rldi9udWxsCisrKyBiL2V4eW5vczQvbXVsdGltZWRpYS9jb2RlY3Mvc2VjX2NvZGVjcy9hdWRpby9leHlub3M0L3NycC91bHAvQW5kcm9pZC5tawpAQCAtMCwwICsxLDIzIEBACitMT0NBTF9QQVRIIDo9ICQoY2FsbCBteS1kaXIpCitpbmNsdWRlICQoQ0xFQVJfVkFSUykKKworTE9DQUxfU1JDX0ZJTEVTIDo9IFwKKwlzcmMvc3JwX2FwaS5jIFwKKwlzcmMvc3JwX2FwaV9jdHJsLmMKKworTE9DQUxfTU9EVUxFIDo9IGxpYnNycGFwaQorCitMT0NBTF9NT0RVTEVfVEFHUyA6PSBvcHRpb25hbAorCitMT0NBTF9BUk1fTU9ERSA6PSBhcm0KKworTE9DQUxfU1RBVElDX0xJQlJBUklFUyA6PQorCitMT0NBTF9TSEFSRURfTElCUkFSSUVTIDo9CisKK0xPQ0FMX0NPUFlfSEVBREVSUyA6PSBcCisJaW5jbHVkZS9zcnBfYXBpLmggXAorCWluY2x1ZGUvc3JwX2FwaV9jdHJsLmggXAorCWluY2x1ZGUvc3JwX2lvY3RsLmgKKworaW5jbHVkZSAkKEJVSUxEX1NUQVRJQ19MSUJSQVJZKQpkaWZmIC0tZ2l0IGEvZXh5bm9zNC9tdWx0aW1lZGlhL2NvZGVjcy9zZWNfY29kZWNzL2F1ZGlvL2V4eW5vczQvc3JwL3VscC9pbmNsdWRlL3NycF9hcGkuaCBiL2V4eW5vczQvbXVsdGltZWRpYS9jb2RlY3Mvc2VjX2NvZGVjcy9hdWRpby9leHlub3M0L3NycC91bHAvaW5jbHVkZS9zcnBfYXBpLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzQ1OThlNQotLS0gL2Rldi9udWxsCisrKyBiL2V4eW5vczQvbXVsdGltZWRpYS9jb2RlY3Mvc2VjX2NvZGVjcy9hdWRpby9leHlub3M0L3NycC91bHAvaW5jbHVkZS9zcnBfYXBpLmgKQEAgLTAsMCArMSw1NSBAQAorI2lmbmRlZiBfX1NSUF9BUElfSF9fCisjZGVmaW5lIF9fU1JQX0FQSV9IX18KKworI2luY2x1ZGUgInNycF9pb2N0bC5oIgorCisjaWZkZWYgX19jcGx1c3BsdXMKK2V4dGVybiAiQyIgeworI2VuZGlmCisKK2ludCBTUlBfQ3JlYXRlKGludCBibG9ja19tb2RlKTsKK2ludCBTUlBfSW5pdCh1bnNpZ25lZCBpbnQgaWJ1Zl9zaXplKTsKK2ludCBTUlBfRGVjb2RlKHZvaWQgKmJ1ZmYsIGludCBzaXplX2J5dGUpOworaW50IFNSUF9TZW5kX0VPUyh2b2lkKTsKK2ludCBTUlBfUmVzdW1lX0VPUyh2b2lkKTsKK2ludCBTUlBfUGF1c2Uodm9pZCk7CitpbnQgU1JQX1N0b3Aodm9pZCk7CitpbnQgU1JQX0ZsdXNoKHZvaWQpOworaW50IFNSUF9TZXRQYXJhbXMoaW50IGlkLCB1bnNpZ25lZCBsb25nIHZhbCk7CitpbnQgU1JQX0dldFBhcmFtcyhpbnQgaWQsIHVuc2lnbmVkIGxvbmcgKnB2YWwpOworaW50IFNSUF9EZWluaXQodm9pZCk7CitpbnQgU1JQX1Rlcm1pbmF0ZSh2b2lkKTsKK2ludCBTUlBfSXNPcGVuKHZvaWQpOworCisjZGVmaW5lIFNSUF9ERVZfTkFNRSAgICAgICAgICAgICAgICAgICAgICAgICAiZGV2L3NycCIKKworI2RlZmluZSBTUlBfSU5JVF9CTE9DS19NT0RFICAgICAgICAgICAgICAgICAgMAorI2RlZmluZSBTUlBfSU5JVF9OT05CTE9DS19NT0RFICAgICAgICAgICAgICAgMQorCisjZGVmaW5lIFNSUF9QRU5ESU5HX1NUQVRFX1JVTk5JTkcgICAgICAgICAgICAwCisjZGVmaW5lIFNSUF9QRU5ESU5HX1NUQVRFX1BFTkRJTkcgICAgICAgICAgICAxCisKKyNkZWZpbmUgU1JQX0VSUk9SX0xPU1RTWU5DICAgICAgICAgICAgICAgICAgIDB4MDAxMDEKKyNkZWZpbmUgU1JQX0VSUk9SX0JBRExBWUVSICAgICAgICAgICAgICAgICAgIDB4MDAxMDIKKyNkZWZpbmUgU1JQX0VSUk9SX0JBREJJVFJBVEUgICAgICAgICAgICAgICAgIDB4MDAxMDMKKyNkZWZpbmUgU1JQX0VSUk9SX0JBRFNBTVBMRVJBVEUgICAgICAgICAgICAgIDB4MDAxMDQKKyNkZWZpbmUgU1JQX0VSUk9SX0JBREVNUEhBU0lTICAgICAgICAgICAgICAgIDB4MDAxMDUKKworI2RlZmluZSBTUlBfRVJST1JfQkFEQ1JDICAgICAgICAgICAgICAgICAgICAgMHgwMDIwMQorI2RlZmluZSBTUlBfRVJST1JfQkFEQklUQUxMT0MgICAgICAgICAgICAgICAgMHgwMDIxMQorI2RlZmluZSBTUlBfRVJST1JfQkFEQkFEU0NBTEVGQUNUT1IgICAgICAgICAgMHgwMDIyMQorI2RlZmluZSBTUlBfRVJST1JfQkFERlJBTUVMRU4gICAgICAgICAgICAgICAgMHgwMDIzMQorI2RlZmluZSBTUlBfRVJST1JfQkFEQklHVkFMVUVTICAgICAgICAgICAgICAgMHgwMDIzMgorI2RlZmluZSBTUlBfRVJST1JfQkFEQkxPQ0tUWVBFICAgICAgICAgICAgICAgMHgwMDIzMworI2RlZmluZSBTUlBfRVJST1JfQkFEU0NGU0kgICAgICAgICAgICAgICAgICAgMHgwMDIzNAorI2RlZmluZSBTUlBfRVJST1JfQkFEREFUQVBUUiAgICAgICAgICAgICAgICAgMHgwMDIzNQorI2RlZmluZSBTUlBfRVJST1JfQkFEUEFSVDNMRU4gICAgICAgICAgICAgICAgMHgwMDIzNgorI2RlZmluZSBTUlBfRVJST1JfQkFESFVGRlRBQkxFICAgICAgICAgICAgICAgMHgwMDIzNworI2RlZmluZSBTUlBfRVJST1JfQkFESFVGRkRBVEEgICAgICAgICAgICAgICAgMHgwMDIzOAorI2RlZmluZSBTUlBfRVJST1JfQkFEU1RFUkVPICAgICAgICAgICAgICAgICAgMHgwMDIzOQorCisjaWZkZWYgX19jcGx1c3BsdXMKK30KKyNlbmRpZgorCisjZW5kaWYgLypfX1NSUF9BUElfSF9fICovCmRpZmYgLS1naXQgYS9leHlub3M0L211bHRpbWVkaWEvY29kZWNzL3NlY19jb2RlY3MvYXVkaW8vZXh5bm9zNC9zcnAvdWxwL2luY2x1ZGUvc3JwX2FwaV9jdHJsLmggYi9leHlub3M0L211bHRpbWVkaWEvY29kZWNzL3NlY19jb2RlY3MvYXVkaW8vZXh5bm9zNC9zcnAvdWxwL2luY2x1ZGUvc3JwX2FwaV9jdHJsLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uM2IxN2FjZgotLS0gL2Rldi9udWxsCisrKyBiL2V4eW5vczQvbXVsdGltZWRpYS9jb2RlY3Mvc2VjX2NvZGVjcy9hdWRpby9leHlub3M0L3NycC91bHAvaW5jbHVkZS9zcnBfYXBpX2N0cmwuaApAQCAtMCwwICsxLDI1IEBACisjaWZuZGVmIF9fU1JQX0FQSV9DVFJMX0hfXworI2RlZmluZSBfX1NSUF9BUElfQ1RSTF9IX18KKworI2lmZGVmIF9fY3BsdXNwbHVzCitleHRlcm4gIkMiIHsKKyNlbmRpZgorCisjZGVmaW5lIFNSUF9DVFJMX0RFVl9OQU1FICAgICJkZXYvc3JwX2N0cmwiCisKK2ludCBTUlBfQ3RybF9TZXRfRWZmZWN0KGludCBlZmZlY3QpOyAgICAvKiB0ZXN0IG9ubHkgKi8KK2ludCBTUlBfQ3RybF9FbmFibGVfRWZmZWN0KGludCBvbik7CitpbnQgU1JQX0N0cmxfU2V0X0VmZmVjdF9EZWYodW5zaWduZWQgbG9uZyBlZmZlY3RfZGVmKTsKK2ludCBTUlBfQ3RybF9TZXRfRWZmZWN0X0VRX1VzZXIodW5zaWduZWQgbG9uZyBlcV91c2VyKTsKK2ludCBTUlBfQ3RybF9TZXRfUGNtX0R1bXAoaW50IG9uKTsKK2ludCBTUlBfQ3RybF9HZXRfUGNtX0R1bXBfU3RhdGUodm9pZCk7CitpbnQgU1JQX0N0cmxfU2V0X0dhaW4oZmxvYXQgdmFsdWUpOworaW50IFNSUF9DdHJsX0dldF9SdW5uaW5nX1N0YXQodm9pZCk7CitpbnQgU1JQX0N0cmxfR2V0X09wZW5fU3RhdCh2b2lkKTsKK3Nob3J0ICpTUlBfQ3RybF9HZXRfUGNtKHZvaWQpOworCisjaWZkZWYgX19jcGx1c3BsdXMKK30KKyNlbmRpZgorCisjZW5kaWYgLyogX19TUlBfQVBJX0NUUkxfSF9fICovCmRpZmYgLS1naXQgYS9leHlub3M0L211bHRpbWVkaWEvY29kZWNzL3NlY19jb2RlY3MvYXVkaW8vZXh5bm9zNC9zcnAvdWxwL2luY2x1ZGUvc3JwX2lvY3RsLmggYi9leHlub3M0L211bHRpbWVkaWEvY29kZWNzL3NlY19jb2RlY3MvYXVkaW8vZXh5bm9zNC9zcnAvdWxwL2luY2x1ZGUvc3JwX2lvY3RsLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTIwYjFhYwotLS0gL2Rldi9udWxsCisrKyBiL2V4eW5vczQvbXVsdGltZWRpYS9jb2RlY3Mvc2VjX2NvZGVjcy9hdWRpby9leHlub3M0L3NycC91bHAvaW5jbHVkZS9zcnBfaW9jdGwuaApAQCAtMCwwICsxLDY2IEBACisjaWZuZGVmIF9fU1JQX0lPQ1RMX0hfXworI2RlZmluZSBfX1NSUF9JT0NUTF9IX18KKworI2lmZGVmIF9fY3BsdXNwbHVzCitleHRlcm4gIkMiIHsKKyNlbmRpZgorCisvKiBjb25zdGFudHMgZm9yIHNycCBkZXZpY2Ugbm9kZSAqLworI2RlZmluZSBTUlBfSU5JVCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKDB4MTAwMDApCisjZGVmaW5lIFNSUF9ERUlOSVQgICAgICAgICAgICAgICAgICAgICAgICAgICAoMHgxMDAwMSkKKworI2RlZmluZSBTUlBfUEFVU0UgICAgICAgICAgICAgICAgICAgICAgICAgICAgKDB4MjAwMDApCisjZGVmaW5lIFNSUF9TVE9QICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoMHgyMDAwMSkKKyNkZWZpbmUgU1JQX0ZMVVNIICAgICAgICAgICAgICAgICAgICAgICAgICAgICgweDIwMDAyKQorI2RlZmluZSBTUlBfV0FJVF9FT1MgICAgICAgICAgICAgICAgICAgICAgICAgKDB4MjAwMDMpCisjZGVmaW5lIFNSUF9FRkZFQ1QgICAgICAgICAgICAgICAgICAgICAgICAgICAoMHgyMDAwNCkKKyNkZWZpbmUgU1JQX1NFTkRfRU9TICAgICAgICAgICAgICAgICAgICAgICAgICgweDIwMDA1KQorI2RlZmluZSBTUlBfUkVTVU1FX0VPUyAgICAgICAgICAgICAgICAgICAgICAgKDB4MjAwMDYpCisKKyNkZWZpbmUgU1JQX1BFTkRJTkdfU1RBVEUgICAgICAgICAgICAgICAgICAgICgweDMwMDAwKQorI2RlZmluZSBTUlBfRVJST1JfU1RBVEUgICAgICAgICAgICAgICAgICAgICAgKDB4MzAwMDEpCisjZGVmaW5lIFNSUF9ERUNPREVEX0ZSQU1FX05PICAgICAgICAgICAgICAgICAoMHgzMDAwMikKKyNkZWZpbmUgU1JQX0RFQ09ERURfT05FX0ZSQU1FX1NJWkUgICAgICAgICAgICgweDMwMDAzKQorI2RlZmluZSBTUlBfREVDT0RFRF9GUkFNRV9TSVpFICAgICAgICAgICAgICAgKDB4MzAwMDQpCisjZGVmaW5lIFNSUF9ERUNPREVEX1BDTV9TSVpFICAgICAgICAgICAgICAgICAoMHgzMDAwNSkKKyNkZWZpbmUgU1JQX0NIQU5ORUxfQ09VTlQgICAgICAgICAgICAgICAgICAgICgweDMwMDA2KQorI2RlZmluZSBTUlBfU1RPUF9FT1NfU1RBVEUgICAgICAgICAgICAgICAgICAgKDB4MzAwMDcpCisKKy8qIGNvbnN0YW50cyBmb3Igc3JwX2N0cmwgZGV2aWNlIG5vZGUqLworI2RlZmluZSBTUlBfQ1RSTF9TRVRfR0FJTiAgICAgICAgICAgICAgICAgICAgKDB4RkYwMDApCisjZGVmaW5lIFNSUF9DVFJMX1NFVF9FRkZFQ1QgICAgICAgICAgICAgICAgICAoMHhGRjAwMSkKKyNkZWZpbmUgU1JQX0NUUkxfR0VUX1BDTV8xS0ZSQU1FICAgICAgICAgICAgICgweEZGMDAyKQorI2RlZmluZSBTUlBfQ1RSTF9QQ01fRFVNUF9PUCAgICAgICAgICAgICAgICAgKDB4RkYwMDMpCisKKyNkZWZpbmUgU1JQX0NUUkxfRUZGRUNUX0VOQUJMRSAgICAgICAgICAgICAgICgweEZGMDEwKQorI2RlZmluZSBTUlBfQ1RSTF9FRkZFQ1RfREVGICAgICAgICAgICAgICAgICAgKDB4RkYwMTEpCisjZGVmaW5lIFNSUF9DVFJMX0VGRkVDVF9FUV9VU1IgICAgICAgICAgICAgICAoMHhGRjAxMikKKyNkZWZpbmUgU1JQX0NUUkxfRUZGRUNUX1NQRUFLRVIgICAgICAgICAgICAgICgweEZGMDEzKQorCisjZGVmaW5lIFNSUF9DVFJMX0lTX1JVTk5JTkcgICAgICAgICAgICAgICAgICAoMHhGRjEwMCkKKyNkZWZpbmUgU1JQX0NUUkxfSVNfT1BFTkVEICAgICAgICAgICAgICAgICAgICgweEZGMTAxKQorI2RlZmluZSBTUlBfQ1RSTF9HRVRfT1BfTEVWRUwgICAgICAgICAgICAgICAgKDB4RkYxMDIpCisjZGVmaW5lIFNSUF9DVFJMX0lTX1BDTV9EVU1QICAgICAgICAgICAgICAgICAoMHhGRjEwMykKKworI2RlZmluZSBTUlBfQ1RSTF9BTFRGV19TVEFURSAgICAgICAgICAgICAgICAgKDB4RkYyMDApCisjZGVmaW5lIFNSUF9DVFJMX0FMVEZXX0xPQUQgICAgICAgICAgICAgICAgICAoMHhGRjIwMSkKKworLyogY29uc3RhbnRzIGZvciBTUlAgZmlybXdhcmUgKi8KKyNkZWZpbmUgU1JQX0ZXX0NPREUxICAgICAgICAgICAgICAgICAgICAgICAgIDAKKyNkZWZpbmUgU1JQX0ZXX0NPREUyMCAgICAgICAgICAgICAgICAgICAgICAgIDEKKyNkZWZpbmUgU1JQX0ZXX0NPREUyMSAgICAgICAgICAgICAgICAgICAgICAgIDIKKyNkZWZpbmUgU1JQX0ZXX0NPREUyMiAgICAgICAgICAgICAgICAgICAgICAgIDMKKyNkZWZpbmUgU1JQX0ZXX0NPREUzMCAgICAgICAgICAgICAgICAgICAgICAgIDQKKyNkZWZpbmUgU1JQX0ZXX0NPREUzMSAgICAgICAgICAgICAgICAgICAgICAgIDUKKworI2RlZmluZSBTUlBfRldfVkxJVyAgICAgICAgICAgICAgICAgICAgICAgICAgMAorI2RlZmluZSBTUlBfRldfQ0dBICAgICAgICAgICAgICAgICAgICAgICAgICAgMQorI2RlZmluZSBTUlBfRldfQ0dBX1NBICAgICAgICAgICAgICAgICAgICAgICAgMgorI2RlZmluZSBTUlBfRldfREFUQSAgICAgICAgICAgICAgICAgICAgICAgICAgMworCisjaWZkZWYgX19jcGx1c3BsdXMKK30KKyNlbmRpZgorCisjZW5kaWYgLyogX19TUlBfSU9DVExfSF9fICovCisKZGlmZiAtLWdpdCBhL2V4eW5vczQvbXVsdGltZWRpYS9jb2RlY3Mvc2VjX2NvZGVjcy9hdWRpby9leHlub3M0L3NycC91bHAvc3JjL3NycF9hcGkuYyBiL2V4eW5vczQvbXVsdGltZWRpYS9jb2RlY3Mvc2VjX2NvZGVjcy9hdWRpby9leHlub3M0L3NycC91bHAvc3JjL3NycF9hcGkuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iMGMwZTVlCi0tLSAvZGV2L251bGwKKysrIGIvZXh5bm9zNC9tdWx0aW1lZGlhL2NvZGVjcy9zZWNfY29kZWNzL2F1ZGlvL2V4eW5vczQvc3JwL3VscC9zcmMvc3JwX2FwaS5jCkBAIC0wLDAgKzEsMzgxIEBACisjaW5jbHVkZSA8c3lzL3R5cGVzLmg+CisjaW5jbHVkZSA8c3lzL3N0YXQuaD4KKyNpbmNsdWRlIDxzeXMvaW9jdGwuaD4KKyNpbmNsdWRlIDxzeXMvbW1hbi5oPgorI2luY2x1ZGUgPHN5cy90aW1lLmg+CisjaW5jbHVkZSA8ZmNudGwuaD4KKyNpbmNsdWRlIDxjdHlwZS5oPgorI2luY2x1ZGUgPHVuaXN0ZC5oPgorI2luY2x1ZGUgPHN0cmluZy5oPgorI2luY2x1ZGUgPGVycm5vLmg+CisjaW5jbHVkZSA8c3RkaW8uaD4KKworI2luY2x1ZGUgInNycF9hcGkuaCIKKworI2RlZmluZSBMT0dfVEFHICJsaWJzcnBhcGkiCisjaW5jbHVkZSA8Y3V0aWxzL2xvZy5oPgorCisvKiBEaXNhYmxlIExPR0QgbWVzc2FnZSAqLworI2lmZGVmIExPR0QKKyN1bmRlZiBMT0dECisjZW5kaWYKKyNkZWZpbmUgTE9HRCguLi4pCisKKy8vI2RlZmluZSBfVVNFX1dCVUZfICAgICAgICAgICAgLyogQnVmZmVyaW5nIGJlZm9yZSB3cml0aW5nIHNycC1ycCBkZXZpY2UgKi8KKy8vI2RlZmluZSBfRFVNUF9UT19GSUxFXworLy8jZGVmaW5lIF9VU0VfRldfRlJPTV9ESVNLXworCisjaWZkZWYgX1VTRV9XQlVGXworI2RlZmluZSBXQlVGX0xFTl9NVUwgICAgICAgIDIKKyNlbmRpZgorCitzdGF0aWMgaW50IHNycF9kZXYgPSAtMTsKK3N0YXRpYyBpbnQgc3JwX2lidWZfc2l6ZSA9IDA7CitzdGF0aWMgaW50IHNycF9ibG9ja19tb2RlID0gU1JQX0lOSVRfQkxPQ0tfTU9ERTsKKworc3RhdGljIHVuc2lnbmVkIGNoYXIgKndidWY7CitzdGF0aWMgaW50IHdidWZfc2l6ZTsKK3N0YXRpYyBpbnQgd2J1Zl9wb3M7CisKKyNpZmRlZiBfRFVNUF9UT19GSUxFXworc3RhdGljIEZJTEUgKmZwX2R1bXAgPSBOVUxMOworI2VuZGlmCisKKyNpZmRlZiBfVVNFX1dCVUZfCitzdGF0aWMgaW50IFdyaXRlQnVmZl9Jbml0KHZvaWQpCit7CisgICAgaWYgKHdidWYgPT0gTlVMTCkgeworICAgICAgICB3YnVmX3NpemUgPSBzcnBfaWJ1Zl9zaXplICogV0JVRl9MRU5fTVVMOworICAgICAgICB3YnVmX3BvcyA9IDA7CisgICAgICAgIHdidWYgPSAodW5zaWduZWQgY2hhciAqKW1hbGxvYyh3YnVmX3NpemUpOworICAgICAgICBMT0dEKCIlczogV3JpdGVCdWZmZXIgJWRieXRlcyBhbGxvY2F0ZWQiLCBfX2Z1bmNfXywgd2J1Zl9zaXplKTsKKyAgICAgICAgcmV0dXJuIDA7CisgICAgfQorCisgICAgTE9HRSgiJXM6IFdyaXRlQnVmZmVyIGFscmVhZHkgYWxsb2NhdGVkIiwgX19mdW5jX18pOworICAgIHJldHVybiAtMTsKK30KKworc3RhdGljIGludCBXcml0ZUJ1ZmZfRGVpbml0KHZvaWQpCit7CisgICAgaWYgKHdidWYgIT0gTlVMTCkgeworICAgICAgICBmcmVlKHdidWYpOworICAgICAgICB3YnVmID0gTlVMTDsKKyAgICAgICAgcmV0dXJuIDA7CisgICAgfQorCisgICAgTE9HRSgiJXM6IFdyaXRlQnVmZmVyIGlzIG5vdCByZWFkeSIsIF9fZnVuY19fKTsKKyAgICByZXR1cm4gLTE7Cit9CisKK3N0YXRpYyBpbnQgV3JpdGVCdWZmX1dyaXRlKHVuc2lnbmVkIGNoYXIgKmJ1ZmYsIGludCBzaXplX2J5dGUpCit7CisgICAgaW50IHdyaXRlX2J5dGU7CisKKyAgICBpZiAoKHdidWZfcG9zICsgc2l6ZV9ieXRlKSA8IHdidWZfc2l6ZSkgeworICAgICAgICBtZW1jcHkoJndidWZbd2J1Zl9wb3NdLCBidWZmLCBzaXplX2J5dGUpOworICAgICAgICB3YnVmX3BvcyArPSBzaXplX2J5dGU7CisgICAgfSBlbHNlIHsKKyAgICAgICAgTE9HRSgiJXM6IFdyaXRlQnVmZmVyIGlzIGZpbGxlZCBbJWRdLCBpZ25vcmluZyB3cml0ZSBbJWRdIiwgX19mdW5jX18sIHdidWZfcG9zLCBzaXplX2J5dGUpOworICAgICAgICByZXR1cm4gLTE7ICAgIC8qIEluc3VmZmljaWVudCBidWZmZXIgKi8KKyAgICB9CisKKyAgICByZXR1cm4gd2J1Zl9wb3M7Cit9CisKK3N0YXRpYyB2b2lkIFdyaXRlQnVmZl9Db25zdW1lKHZvaWQpCit7CisgICAgbWVtY3B5KHdidWYsICZ3YnVmW3NycF9pYnVmX3NpemVdLCBzcnBfaWJ1Zl9zaXplICogKFdCVUZfTEVOX01VTCAtIDEpKTsKKyAgICB3YnVmX3BvcyAtPSBzcnBfaWJ1Zl9zaXplOworfQorCitzdGF0aWMgdm9pZCBXcml0ZUJ1ZmZfRmx1c2godm9pZCkKK3sKKyAgICB3YnVmX3BvcyA9IDA7Cit9CisjZW5kaWYKKworaW50IFNSUF9DcmVhdGUoaW50IGJsb2NrX21vZGUpCit7CisgICAgaWYgKHNycF9kZXYgPT0gLTEpIHsKKyNpZmRlZiBfVVNFX0ZXX0ZST01fRElTS18KKyAgICAgICAgU1JQX0NoZWNrX0FsdEZpcm13YXJlKCk7CisjZW5kaWYKKworICAgICAgICBzcnBfYmxvY2tfbW9kZSA9IGJsb2NrX21vZGU7CisgICAgICAgIHNycF9kZXYgPSBvcGVuKFNSUF9ERVZfTkFNRSwgT19SRFdSIHwKKyAgICAgICAgICAgICAgICAgICAgKChibG9ja19tb2RlID09IFNSUF9JTklUX05PTkJMT0NLX01PREUpID8gT19OREVMQVkgOiAwKSk7CisKKyAgICAgICAgcmV0dXJuIHNycF9kZXY7CisgICAgfQorCisgICAgTE9HRSgiJXM6IERldmljZSBpcyBub3QgcmVhZHkiLCBfX2Z1bmNfXyk7CisgICAgcmV0dXJuIC0xOyAgICAvKiBkZXZpY2UgYWxyZWF5IG9wZW5lZCAqLworfQorCitpbnQgU1JQX0luaXQodW5zaWduZWQgaW50IGlidWZfc2l6ZSkKK3sKKyAgICBpbnQgcmV0OworCisgICAgaWYgKHNycF9kZXYgIT0gLTEpIHsKKyAgICAgICAgc3JwX2lidWZfc2l6ZSA9IGlidWZfc2l6ZTsKKyAgICAgICAgcmV0ID0gaW9jdGwoc3JwX2RldiwgU1JQX0lOSVQsIHNycF9pYnVmX3NpemUpOyAvKiBJbml0aWFsaXplIElCVUYgc2l6ZSAoNEtCIH4gMThLQikgKi8KKworI2lmZGVmIF9EVU1QX1RPX0ZJTEVfCisgICAgICAgIGNoYXIgb3V0bmFtZVsyNTZdOworICAgICAgICBpbnQgY250ID0gMDsKKworICAgICAgICB3aGlsZSAoMSkgeworICAgICAgICAgICAgc3ByaW50ZihvdXRuYW1lLCAiL2RhdGEvcnBfZHVtcF8lMDRkLm1wMyIsIGNudCsrKTsKKyAgICAgICAgICAgIGlmIChmcF9kdW1wID0gZm9wZW4ob3V0bmFtZSwgInJiIikpIHsgLyogZmlsZSBleGlzdD8gKi8KKyAgICAgICAgICAgICAgICBmY2xvc2UoZnBfZHVtcCk7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgTE9HRCgiJXM6IER1bXAgTVAzIHRvICVzIiwgX19mdW5jX18sIG91dG5hbWUpOworICAgICAgICBpZiAoZnBfZHVtcCA9IGZvcGVuKG91dG5hbWUsICJ3YiIpKQorICAgICAgICAgICAgTE9HRCgiJXM6IFN1Y2Nlc3MgdG8gb3BlbiAlcyIsIF9fZnVuY19fLCBvdXRuYW1lKTsKKyAgICAgICAgZWxzZQorICAgICAgICAgICAgTE9HRCgiJXM6IEZhaWwgdG8gb3BlbiAlcyIsIF9fZnVuY19fLCBvdXRuYW1lKTsKKyNlbmRpZgorCisjaWZkZWYgX1VTRV9XQlVGXworICAgICAgICBpZiAocmV0ICE9IC0xKQorICAgICAgICAgICAgcmV0dXJuIFdyaXRlQnVmZl9Jbml0KCk7CisjZWxzZQorICAgICAgICByZXR1cm4gcmV0OworI2VuZGlmCisgICAgfQorCisgICAgTE9HRSgiJXM6IERldmljZSBpcyBub3QgcmVhZHkiLCBfX2Z1bmNfXyk7CisgICAgcmV0dXJuIC0xOyAgLyogZGV2aWNlIGlzIG5vdCBjcmVhdGVkICovCit9CisKKyNpZmRlZiBfVVNFX1dCVUZfCitpbnQgU1JQX0RlY29kZSh2b2lkICpidWZmLCBpbnQgc2l6ZV9ieXRlKQoreworICAgIGludCByZXQ7CisgICAgaW50IHZhbDsKKyAgICBpbnQgZXJyX2NvZGUgPSAwOworCisgICAgaWYgKHNycF9kZXYgIT0gLTEpIHsKKyAgICAgICAgLyogQ2hlY2sgd2J1ZiBiZWZvcmUgd3JpdGluZyBidWZmICovCisgICAgICAgIHdoaWxlICh3YnVmX3BvcyA+PSBzcnBfaWJ1Zl9zaXplKSB7IC8qIFdyaXRlX0J1ZmZlciBmaWxsZWQ/IChJQlVGIFNpemUpKi8KKyAgICAgICAgICAgIExPR0QoIiVzOiBXcml0ZSBCdWZmZXIgaXMgZnVsbCwgU2VuZCBkYXRhIHRvIFJQIiwgX19mdW5jX18pOworCisgICAgICAgICAgICByZXQgPSB3cml0ZShzcnBfZGV2LCB3YnVmLCBzcnBfaWJ1Zl9zaXplKTsgLyogV3JpdGUgQnVmZmVyIHRvIFJQIERyaXZlciAqLworICAgICAgICAgICAgaWYgKHJldCA9PSAtMSkgeyAvKiBGYWlsPyAqLworICAgICAgICAgICAgICAgIGlvY3RsKHNycF9kZXYsIFNSUF9FUlJPUl9TVEFURSwgJnZhbCk7CisgICAgICAgICAgICAgICAgaWYgKCF2YWwpIHsgICAgLyogV3JpdGUgZXJyb3I/ICovCisgICAgICAgICAgICAgICAgICAgIExPR0UoIiVzOiBJQlVGIHdyaXRlIGZhaWwiLCBfX2Z1bmNfXyk7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiAtMTsKKyAgICAgICAgICAgICAgICB9IGVsc2UgeyAgICAgICAvKiBXcml0ZSBPSywgYnV0IFJQIGRlY29kZSBlcnJvcj8gKi8KKyAgICAgICAgICAgICAgICAgICAgZXJyX2NvZGUgPSB2YWw7CisgICAgICAgICAgICAgICAgICAgIExPR0UoIiVzOiBSUCBkZWNvZGUgZXJyb3IgWzB4JTA1WF0iLCBfX2Z1bmNfXywgZXJyX2NvZGUpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyNpZmRlZiBfRFVNUF9UT19GSUxFXworICAgICAgICAgICAgaWYgKGZwX2R1bXApCisgICAgICAgICAgICAgICAgZndyaXRlKHdidWYsIHNycF9pYnVmX3NpemUsIDEsIGZwX2R1bXApOworI2VuZGlmCisgICAgICAgICAgICBXcml0ZUJ1ZmZfQ29uc3VtZSgpOworICAgICAgICB9CisKKyAgICAgICAgcmV0ID0gV3JpdGVCdWZmX1dyaXRlKCh1bnNpZ25lZCBjaGFyICopYnVmZiwgc2l6ZV9ieXRlKTsKKyAgICAgICAgaWYgKHJldCA9PSAtMSkKKyAgICAgICAgICAgIHJldHVybiAtMTsgIC8qIEJ1ZmZlcmluZyBlcnJvciAqLworCisgICAgICAgIExPR0QoIiVzOiBXcml0ZSBCdWZmZXIgcmVtYWluIFslZF0iLCBfX2Z1bmNfXywgd2J1Zl9wb3MpOworICAgICAgICByZXR1cm4gZXJyX2NvZGU7ICAvKiBXcml0ZSBTdWNjZXNzICovCisgICAgfQorCisgICAgTE9HRSgiJXM6IERldmljZSBpcyBub3QgcmVhZHkiLCBfX2Z1bmNfXyk7CisgICAgcmV0dXJuIC0xOyAgLyogZGV2aWNlIGlzIG5vdCBjcmVhdGVkICovCit9CisKK2ludCBTUlBfU2VuZF9FT1Modm9pZCkKK3sKKyAgICBpbnQgcmV0OworICAgIGludCB2YWw7CisKKyAgICBpZiAoc3JwX2RldiAhPSAtMSkgeworICAgICAgICAvKiBDaGVjayB3YnVmIGJlZm9yZSB3cml0aW5nIGJ1ZmYgKi8KKyAgICAgICAgd2hpbGUgKHdidWZfcG9zKSB7IC8qIFdyaXRlX0J1ZmZlciByYW1haW4/Ki8KKyAgICAgICAgICAgIGlmICh3YnVmX3BvcyA8IHNycF9pYnVmX3NpemUpIHsKKyAgICAgICAgICAgICAgICBtZW1zZXQod2J1ZiArIHdidWZfcG9zLCAweEZGLCBzcnBfaWJ1Zl9zaXplIC0gd2J1Zl9wb3MpOyAvKiBGaWxsIGR1bW15IGRhdGEgKi8KKyAgICAgICAgICAgICAgICB3YnVmX3BvcyA9IHNycF9pYnVmX3NpemU7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHJldCA9IHdyaXRlKHNycF9kZXYsIHdidWYsIHNycF9pYnVmX3NpemUpOyAvKiBXcml0ZSBCdWZmZXIgdG8gUlAgRHJpdmVyICovCisgICAgICAgICAgICBpZiAocmV0ID09IC0xKSB7ICAvKiBGYWlsPyAqLworICAgICAgICAgICAgICAgIHJldCA9IGlvY3RsKHNycF9kZXYsIFNSUF9FUlJPUl9TVEFURSwgJnZhbCk7CisgICAgICAgICAgICAgICAgaWYgKCF2YWwpIHsgICAvKiBXcml0ZSBlcnJvcj8gKi8KKyAgICAgICAgICAgICAgICAgICAgTE9HRSgiJXM6IElCVUYgd3JpdGUgZmFpbCIsIF9fZnVuY19fKTsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIC0xOworICAgICAgICAgICAgICAgIH0gZWxzZSB7ICAgICAgLyogUlAgZGVjb2UgZXJyb3I/ICovCisgICAgICAgICAgICAgICAgICAgIExPR0UoIiVzOiBSUCBkZWNvZGUgZXJyb3IgWzB4JTA1WF0iLCBfX2Z1bmNfXywgdmFsKTsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIC0xOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0gZWxzZSB7ICAgICAgICAgIC8qIFN1Y2Nlc3M/ICovCisjaWZkZWYgX0RVTVBfVE9fRklMRV8KKyAgICAgICAgICAgICAgICBpZiAoZnBfZHVtcCkKKyAgICAgICAgICAgICAgICAgICAgZndyaXRlKHdidWYsIHNycF9pYnVmX3NpemUsIDEsIGZwX2R1bXApOworI2VuZGlmCisgICAgICAgICAgICAgICAgV3JpdGVCdWZmX0NvbnN1bWUoKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIG1lbXNldCh3YnVmLCAweEZGLCBzcnBfaWJ1Zl9zaXplKTsgICAgICAvKiBGaWxsIGR1bW15IGRhdGEgKi8KKyAgICAgICAgd3JpdGUoc3JwX2Rldiwgd2J1Ziwgc3JwX2lidWZfc2l6ZSk7IC8qIFdyaXRlIEJ1ZmZlciB0byBSUCBEcml2ZXIgKi8KKworICAgICAgICAvKiBXYWl0IHVudGlsIFJQIGRlY29kaW5nIG92ZXIgKi8KKyAgICAgICAgcmV0dXJuIGlvY3RsKHNycF9kZXYsIFNSUF9XQUlUX0VPUyk7CisgICAgfQorCisgICAgcmV0dXJuIC0xOyAvKiBkZXZpY2UgaXMgbm90IGNyZWF0ZWQgKi8KK30KKyNlbHNlICAvKiBXaXRob3V0IFdCVUYgKi8KK2ludCBTUlBfRGVjb2RlKHZvaWQgKmJ1ZmYsIGludCBzaXplX2J5dGUpCit7CisgICAgaW50IHJldDsKKyAgICBpbnQgdmFsOworICAgIGludCBlcnJfY29kZSA9IDA7CisKKyAgICBpZiAoc3JwX2RldiAhPSAtMSkgeworICAgICAgICBMT0dEKCIlczogU2VuZCBkYXRhIHRvIFJQICglZCBieXRlcykiLCBfX2Z1bmNfXywgc2l6ZV9ieXRlKTsKKworICAgICAgICByZXQgPSB3cml0ZShzcnBfZGV2LCBidWZmLCBzaXplX2J5dGUpOyAgLyogV3JpdGUgQnVmZmVyIHRvIFJQIERyaXZlciAqLworICAgICAgICBpZiAocmV0ID09IC0xKSB7ICAvKiBGYWlsPyAqLworICAgICAgICAgICAgaW9jdGwoc3JwX2RldiwgU1JQX0VSUk9SX1NUQVRFLCAmdmFsKTsKKyAgICAgICAgICAgIGlmICghdmFsKSB7ICAgLyogV3JpdGUgZXJyb3I/ICovCisgICAgICAgICAgICAgICAgTE9HRSgiJXM6IElCVUYgd3JpdGUgZmFpbCIsIF9fZnVuY19fKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gLTE7CisgICAgICAgICAgICB9IGVsc2UgeyAgICAgIC8qIFdyaXRlIE9LLCBidXQgUlAgZGVjb2RlIGVycm9yPyAqLworICAgICAgICAgICAgICAgIGVycl9jb2RlID0gdmFsOworICAgICAgICAgICAgICAgIExPR0UoIiVzOiBSUCBkZWNvZGUgZXJyb3IgWzB4JTA1WF0iLCBfX2Z1bmNfXywgZXJyX2NvZGUpOworICAgICAgICAgICAgfQorICAgICAgICB9CisjaWZkZWYgX0RVTVBfVE9fRklMRV8KKyAgICAgICAgaWYgKGZwX2R1bXApCisgICAgICAgICAgICBmd3JpdGUoYnVmZiwgc2l6ZV9ieXRlLCAxLCBmcF9kdW1wKTsKKyNlbmRpZgorCisgICAgICAgIHJldHVybiBlcnJfY29kZTsgLyogV3JpdGUgU3VjY2VzcyAqLworICAgIH0KKworICAgIExPR0UoIiVzOiBEZXZpY2UgaXMgbm90IHJlYWR5IiwgX19mdW5jX18pOworICAgIHJldHVybiAtMTsgLyogZGV2aWNlIGlzIG5vdCBjcmVhdGVkICovCit9CisKK2ludCBTUlBfU2VuZF9FT1Modm9pZCkKK3sKKyAgICAvKiBXYWl0IHVudGlsIFJQIGRlY29kaW5nIG92ZXIgKi8KKyAgICBpZiAoc3JwX2RldiAhPSAtMSkKKyAgICAgICAgcmV0dXJuIGlvY3RsKHNycF9kZXYsIFNSUF9TRU5EX0VPUyk7CisKKyAgICByZXR1cm4gLTE7IC8qIGRldmljZSBpcyBub3QgY3JlYXRlZCAqLworfQorCitpbnQgU1JQX1Jlc3VtZV9FT1Modm9pZCkKK3sKKyAgICBpZiAoc3JwX2RldiAhPSAtMSkKKyAgICAgICAgcmV0dXJuIGlvY3RsKHNycF9kZXYsIFNSUF9SRVNVTUVfRU9TKTsKKworICAgIHJldHVybiAtMTsgLyogZGV2aWNlIGlzIG5vdCBjcmVhdGVkICovCit9CisjZW5kaWYKKworaW50IFNSUF9QYXVzZSh2b2lkKQoreworICAgIGlmIChzcnBfZGV2ICE9IC0xKQorICAgICAgICByZXR1cm4gaW9jdGwoc3JwX2RldiwgU1JQX1BBVVNFKTsKKworICAgIHJldHVybiAtMTsgLyogZGV2aWNlIGlzIG5vdCBjcmVhdGVkICovCit9CisKK2ludCBTUlBfU3RvcCh2b2lkKQoreworICAgIGlmIChzcnBfZGV2ICE9IC0xKQorICAgICAgICByZXR1cm4gaW9jdGwoc3JwX2RldiwgU1JQX1NUT1ApOworCisgICAgcmV0dXJuIC0xOyAvKiBkZXZpY2UgaXMgbm90IGNyZWF0ZWQgKi8KK30KKworaW50IFNSUF9GbHVzaCh2b2lkKQoreworICAgIGlmIChzcnBfZGV2ICE9IC0xKSB7CisgICAgICAgIGlmIChpb2N0bChzcnBfZGV2LCBTUlBfRkxVU0gpICE9IC0xKSB7CisjaWZkZWYgX1VTRV9XQlVGXworICAgICAgICAgICAgV3JpdGVCdWZmX0ZsdXNoKCk7CisjZW5kaWYKKyAgICAgICAgICAgIHJldHVybiAwOworICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIC0xOyAvKiBkZXZpY2UgaXMgbm90IGNyZWF0ZWQgKi8KK30KKworCitpbnQgU1JQX1NldFBhcmFtcyhpbnQgaWQsIHVuc2lnbmVkIGxvbmcgdmFsKQoreworICAgIGlmIChzcnBfZGV2ICE9IC0xKQorICAgICAgICByZXR1cm4gMDsgLyogbm90IHlldCAqLworCisgICAgcmV0dXJuIC0xOyAgICAvKiBkZXZpY2UgaXMgbm90IGNyZWF0ZWQgKi8KK30KKworaW50IFNSUF9HZXRQYXJhbXMoaW50IGlkLCB1bnNpZ25lZCBsb25nICpwdmFsKQoreworICAgIGlmIChzcnBfZGV2ICE9IC0xKQorICAgICAgICByZXR1cm4gaW9jdGwoc3JwX2RldiwgaWQsIHB2YWwpOworCisgICAgcmV0dXJuIC0xOyAgICAvKiBkZXZpY2UgaXMgbm90IGNyZWF0ZWQgKi8KK30KKworaW50IFNSUF9EZWluaXQodm9pZCkKK3sKKyAgICBpZiAoc3JwX2RldiAhPSAtMSkgeworI2lmZGVmIF9EVU1QX1RPX0ZJTEVfCisgICAgICAgIGlmIChmcF9kdW1wKQorICAgICAgICAgICAgZmNsb3NlKGZwX2R1bXApOworI2VuZGlmCisKKyNpZmRlZiBfVVNFX1dCVUZfCisgICAgICAgIFdyaXRlQnVmZl9EZWluaXQoKTsKKyNlbmRpZgorICAgICAgICByZXR1cm4gaW9jdGwoc3JwX2RldiwgU1JQX0RFSU5JVCk7IC8qIERlaW5pYWxpemUgKi8KKyAgICB9CisKKyAgICBMT0dFKCIlczogRGV2aWNlIGlzIG5vdCByZWFkeSIsIF9fZnVuY19fKTsKKyAgICByZXR1cm4gLTE7ICAgIC8qIGRldmljZSBpcyBub3QgY3JlYXRlZCAqLworfQorCitpbnQgU1JQX1Rlcm1pbmF0ZSh2b2lkKQoreworICAgIGludCByZXQ7CisKKyAgICBpZiAoc3JwX2RldiAhPSAtMSkgeworICAgICAgICByZXQgPSBjbG9zZShzcnBfZGV2KTsKKworICAgICAgICBpZiAocmV0ID09IDApIHsKKyAgICAgICAgICAgIHNycF9kZXYgPSAtMTsgLyogZGV2aWNlIGNsb3NlZCAqLworICAgICAgICAgICAgcmV0dXJuIDA7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBMT0dFKCIlczogRGV2aWNlIGlzIG5vdCByZWFkeSIsIF9fZnVuY19fKTsKKyAgICByZXR1cm4gLTE7IC8qIGRldmljZSBpcyBub3QgY3JlYXRlZCBvciBjbG9zZSBlcnJvciovCit9CisKK2ludCBTUlBfSXNPcGVuKHZvaWQpCit7CisgICAgaWYgKHNycF9kZXYgPT0gLTEpIHsKKyAgICAgICAgTE9HRCgiJXM6IERldmljZSBpcyBub3Qgb3BlbmVkIiwgX19mdW5jX18pOworICAgICAgICByZXR1cm4gMDsKKyAgICB9CisKKyAgICBMT0dEKCIlczogRGV2aWNlIGlzIG9wZW5lZCIsIF9fZnVuY19fKTsKKyAgICByZXR1cm4gMTsKK30KZGlmZiAtLWdpdCBhL2V4eW5vczQvbXVsdGltZWRpYS9jb2RlY3Mvc2VjX2NvZGVjcy9hdWRpby9leHlub3M0L3NycC91bHAvc3JjL3NycF9hcGlfY3RybC5jIGIvZXh5bm9zNC9tdWx0aW1lZGlhL2NvZGVjcy9zZWNfY29kZWNzL2F1ZGlvL2V4eW5vczQvc3JwL3VscC9zcmMvc3JwX2FwaV9jdHJsLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYmRjMjMxMAotLS0gL2Rldi9udWxsCisrKyBiL2V4eW5vczQvbXVsdGltZWRpYS9jb2RlY3Mvc2VjX2NvZGVjcy9hdWRpby9leHlub3M0L3NycC91bHAvc3JjL3NycF9hcGlfY3RybC5jCkBAIC0wLDAgKzEsMzMxIEBACisjaW5jbHVkZSA8c3lzL3R5cGVzLmg+CisjaW5jbHVkZSA8c3lzL3N0YXQuaD4KKyNpbmNsdWRlIDxzeXMvaW9jdGwuaD4KKyNpbmNsdWRlIDxzeXMvbW1hbi5oPgorI2luY2x1ZGUgPHN5cy90aW1lLmg+CisjaW5jbHVkZSA8ZmNudGwuaD4KKyNpbmNsdWRlIDxjdHlwZS5oPgorI2luY2x1ZGUgPHVuaXN0ZC5oPgorI2luY2x1ZGUgPHN0cmluZy5oPgorI2luY2x1ZGUgPGVycm5vLmg+CisjaW5jbHVkZSA8c3RkaW8uaD4KKworI2luY2x1ZGUgInNycF9hcGlfY3RybC5oIgorI2luY2x1ZGUgInNycF9pb2N0bC5oIgorCisjZGVmaW5lIExPR19UQUcgImxpYnNycGFwaSIKKyNpbmNsdWRlIDxjdXRpbHMvbG9nLmg+CisKKy8qIERpc2FibGUgTE9HRCBtZXNzYWdlICovCisjaWZkZWYgTE9HRAorI3VuZGVmIExPR0QKKyNlbmRpZgorI2RlZmluZSBMT0dEKC4uLikKKworc3RhdGljIGludCBzcnBfY3RybCA9IC0xOworc3RhdGljIGludCBzcnBfY3RybF9jbnQgPSAwOworc3RhdGljIHNob3J0IHBjbV9idWZbMjA0OF07IC8qIDRLQnl0ZXMgZGF0YSwgMUsgZnJhbWVzICgxNmJpdCBzdGVyZW8gZGF0YSkgKi8KKworI2lmZGVmIF9VU0VfRldfRlJPTV9ESVNLXworc3RhdGljIGNoYXIgc3JwX2FsdF9md19uYW1lX3ByZVs2XVszMl0gPSB7CisgICAgInNkY2FyZC9ycF9mdy9ycF9md19jb2RlMSIsCisgICAgInNkY2FyZC9ycF9mdy9ycF9md19jb2RlMjAiLAorICAgICJzZGNhcmQvcnBfZncvcnBfZndfY29kZTIxIiwKKyAgICAic2RjYXJkL3JwX2Z3L3JwX2Z3X2NvZGUyMiIsCisgICAgInNkY2FyZC9ycF9mdy9ycF9md19jb2RlMzAiLAorICAgICJzZGNhcmQvcnBfZncvcnBfZndfY29kZTMxIiwKK307CisjZW5kaWYKKworc3RhdGljIGludCBTUlBfQ3RybF9PcGVuKHZvaWQpCit7CisgICAgaWYgKHNycF9jdHJsX2NudCA9PSAwKSB7CisgICAgICAgIHNycF9jdHJsID0gb3BlbihTUlBfQ1RSTF9ERVZfTkFNRSwgT19SRFdSIHwgT19OREVMQVkpOworICAgICAgICBpZiAoc3JwX2N0cmwgPCAwKSB7CisgICAgICAgICAgICBMT0dFKCIlczogRmFpbGVkIG9wZW4gZGV2aWNlIGZpbGUgJWQiLCBfX2Z1bmNfXywgc3JwX2N0cmwpOworICAgICAgICAgICAgcmV0dXJuIC0xOworICAgICAgICB9CisgICAgICAgIHNycF9jdHJsX2NudCsrOworICAgICAgICBMT0dWKCIlczogRGV2aWNlIGlzIG9wZW5lZFslZF06IGNudCAlZCIsIF9fZnVuY19fLCBzcnBfY3RybCwgc3JwX2N0cmxfY250KTsKKyAgICB9CisKKyAgICByZXR1cm4gc3JwX2N0cmw7Cit9CisKK3N0YXRpYyBpbnQgU1JQX0N0cmxfQ2xvc2Uodm9pZCkKK3sKKyAgICBpbnQgcmV0ID0gMDsKKworICAgIGlmIChzcnBfY3RybF9jbnQgPT0gMSkgeworICAgICAgICByZXQgPSBjbG9zZShzcnBfY3RybCk7CisgICAgICAgIGlmIChyZXQgPCAwKSB7CisgICAgICAgICAgICBMT0dFKCIlczogRmFpbGVkIGNsb3NlbiBkZXZpY2UgZmlsZSAlZCIsIF9fZnVuY19fLCBzcnBfY3RybCk7CisgICAgICAgICAgICByZXR1cm4gLTE7CisgICAgICAgIH0KKyAgICAgICAgc3JwX2N0cmxfY250LS07CisgICAgICAgIExPR1YoIiVzOiBEZXZpY2UgaXMgY2xvc2VkWyVkXTogY250ICVkIiwgX19mdW5jX18sIHNycF9jdHJsLCBzcnBfY3RybF9jbnQpOworICAgICAgICBzcnBfY3RybCA9IC0xOworICAgIH0KKworICAgIHJldHVybiByZXQ7Cit9CisKKyNpZmRlZiBfVVNFX0ZXX0ZST01fRElTS18KKy8qIFRoaXMgd2lsbCBjaGVjayAmIGRvd25sb2FkIGFsdGVybmF0ZSBmaXJtd2FyZSAqLworc3RhdGljIGludCBTUlBfQ2hlY2tfQWx0RmlybXdhcmUodm9pZCkKK3sKKyAgICB1bnNpZ25lZCBsb25nICp0ZW1wX2J1ZmY7CisgICAgRklMRSAqZnAgPSBOVUxMOworCisgICAgY2hhciBhbHRfZndfbmFtZVsxMjhdOworICAgIHVuc2lnbmVkIGxvbmcgYWx0X2Z3X3NldDsKKyAgICB1bnNpZ25lZCBsb25nIGFsdF9md19sb2FkZWQgPSAwOworICAgIGludCBhbHRfZndfdGV4dF9vayxhbHRfZndfZGF0YV9vazsKKworICAgIGlmICgoc3JwX2N0cmwgPSBTUlBfQ3RybF9PcGVuKCkpID49IDApIHsKKyAgICAgICAgaW9jdGwoc3JwX2N0cmwsIFNSUF9DVFJMX0FMVEZXX1NUQVRFLCAmYWx0X2Z3X2xvYWRlZCk7CisKKyAgICAgICAgaWYgKCFhbHRfZndfbG9hZGVkKSB7ICAgIC8qIE5vdCBsb2FkZWQgeWV0PyAqLworICAgICAgICAgICAgTE9HRSgiVHJ5IHRvIGRvd25sb2FkIGFsdGVybmF0ZSBSUCBmaXJtd2FyZSIpOworICAgICAgICAgICAgdGVtcF9idWZmID0gKHVuc2lnbmVkIGxvbmcgKiltYWxsb2MoMjU2KjEwMjQpOyAgICAvKiB0ZW1wIGJ1ZmZlciAqLworCisgICAgICAgICAgICBmb3IgKGFsdF9md19zZXQgPSAwOyBhbHRfZndfc2V0IDwgNjsgYWx0X2Z3X3NldCsrKSB7CisgICAgICAgICAgICAgICAgc3ByaW50ZihhbHRfZndfbmFtZSwgIiVzX3RleHQuYmluIiwgc3JwX2FsdF9md19uYW1lX3ByZVthbHRfZndfc2V0XSk7CisgICAgICAgICAgICAgICAgaWYgKGZwID0gZm9wZW4oYWx0X2Z3X25hbWUsICJyYiIpKSB7CisgICAgICAgICAgICAgICAgICAgIExPR0UoIlJQIEFsdC1GaXJtd2FyZSBMb2FkaW5nOiAlcyIsIGFsdF9md19uYW1lKTsKKyAgICAgICAgICAgICAgICAgICAgZnJlYWQodGVtcF9idWZmLCA2NCoxMDI0LCAxLCBmcCk7CisgICAgICAgICAgICAgICAgICAgIGNsb3NlKGZwKTsKKyAgICAgICAgICAgICAgICAgICAgYWx0X2Z3X3RleHRfb2sgPSAxOworICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIGFsdF9md190ZXh0X29rID0gMDsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBzcHJpbnRmKGFsdF9md19uYW1lLCAiJXNfZGF0YS5iaW4iLCBzcnBfYWx0X2Z3X25hbWVfcHJlW2FsdF9md19zZXRdKTsKKyAgICAgICAgICAgICAgICBpZiAoZnAgPSBmb3BlbihhbHRfZndfbmFtZSwgInJiIikpIHsKKyAgICAgICAgICAgICAgICAgICAgTE9HRSgiUlAgQWx0LUZpcm13YXJlIExvYWRpbmc6ICVzIiwgYWx0X2Z3X25hbWUpOworICAgICAgICAgICAgICAgICAgICBmcmVhZCgmdGVtcF9idWZmWzY0KjEwMjQvNF0sIDk2KjEwMjQsIDEsIGZwKTsKKyAgICAgICAgICAgICAgICAgICAgY2xvc2UoZnApOworICAgICAgICAgICAgICAgICAgICBhbHRfZndfZGF0YV9vayA9IDE7CisgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgYWx0X2Z3X2RhdGFfb2sgPSAwOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmIChhbHRfZndfdGV4dF9vayAmJiBhbHRfZndfZGF0YV9vaykgeworICAgICAgICAgICAgICAgICAgICB0ZW1wX2J1ZmZbMTYwKjEwMjQvNF0gPSBhbHRfZndfc2V0OworICAgICAgICAgICAgICAgICAgICBpb2N0bChzcnBfY3RybCwgU1JQX0NUUkxfQUxURldfTE9BRCwgdGVtcF9idWZmKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBmcmVlKHRlbXBfYnVmZik7CisgICAgICAgIH0KKyAgICAgICAgU1JQX0N0cmxfQ2xvc2UoKTsKKyAgICB9CisKKyAgICByZXR1cm4gMDsKK30KKyNlbmRpZgorCitpbnQgU1JQX0N0cmxfU2V0X0VmZmVjdChpbnQgZWZmZWN0KQoreworICAgIGludCByZXQ7CisgICAgdW5zaWduZWQgbG9uZyBlZmZlY3RfbW9kZSA9ICh1bnNpZ25lZCBsb25nKWVmZmVjdDsKKworICAgIHJldCA9IFNSUF9DdHJsX09wZW4oKTsKKyAgICBpZiAocmV0IDwgMCkgeworICAgICAgICBMT0dFKCIlczogU1JQX0N0cmxfT3BlbiBlcnJvciIsIF9fZnVuY19fKTsKKyAgICAgICAgcmV0dXJuIC0xOworICAgIH0KKworICAgIGlvY3RsKHNycF9jdHJsLCBTUlBfQ1RSTF9TRVRfRUZGRUNULCBlZmZlY3RfbW9kZSk7CisKKyAgICBTUlBfQ3RybF9DbG9zZSgpOworCisgICAgcmV0dXJuIDA7Cit9CisKK2ludCBTUlBfQ3RybF9FbmFibGVfRWZmZWN0KGludCBvbikKK3sKKyAgICBpbnQgcmV0OworICAgIHVuc2lnbmVkIGxvbmcgZWZmZWN0X3N3aXRjaCA9IG9uID8gMSA6IDA7CisKKyAgICByZXQgPSBTUlBfQ3RybF9PcGVuKCk7CisgICAgaWYgKHJldCA8IDApIHsKKyAgICAgICAgTE9HRSgiJXM6IFNSUF9DdHJsX09wZW4gZXJyb3IiLCBfX2Z1bmNfXyk7CisgICAgICAgIHJldHVybiAtMTsKKyAgICB9CisKKyAgICBpb2N0bChzcnBfY3RybCwgU1JQX0NUUkxfRUZGRUNUX0VOQUJMRSwgZWZmZWN0X3N3aXRjaCk7CisKKyAgICBTUlBfQ3RybF9DbG9zZSgpOworCisgICAgcmV0dXJuIDA7Cit9CisKK2ludCBTUlBfQ3RybF9TZXRfRWZmZWN0X0RlZih1bnNpZ25lZCBsb25nIGVmZmVjdF9kZWYpCit7CisgICAgaW50IHJldDsKKworICAgIHJldCA9IFNSUF9DdHJsX09wZW4oKTsKKyAgICBpZiAocmV0IDwgMCkgeworICAgICAgICBMT0dFKCIlczogU1JQX0N0cmxfT3BlbiBlcnJvciIsIF9fZnVuY19fKTsKKyAgICAgICAgcmV0dXJuIC0xOworICAgIH0KKworICAgIGlvY3RsKHNycF9jdHJsLCBTUlBfQ1RSTF9FRkZFQ1RfREVGLCBlZmZlY3RfZGVmKTsKKworICAgIFNSUF9DdHJsX0Nsb3NlKCk7CisKKyAgICByZXR1cm4gMDsKK30KKworaW50IFNSUF9DdHJsX1NldF9FZmZlY3RfRVFfVXNlcih1bnNpZ25lZCBsb25nIGVxX3VzZXIpCit7CisgICAgaW50IHJldDsKKworICAgIHJldCA9IFNSUF9DdHJsX09wZW4oKTsKKyAgICBpZiAocmV0IDwgMCkgeworICAgICAgICBMT0dFKCIlczogU1JQX0N0cmxfT3BlbiBlcnJvciIsIF9fZnVuY19fKTsKKyAgICAgICAgcmV0dXJuIC0xOworICAgIH0KKworICAgIGlvY3RsKHNycF9jdHJsLCBTUlBfQ1RSTF9FRkZFQ1RfRVFfVVNSLCBlcV91c2VyKTsKKworICAgIFNSUF9DdHJsX0Nsb3NlKCk7CisKKyAgICByZXR1cm4gMDsKK30KKworaW50IFNSUF9DdHJsX1NldF9QY21fRHVtcChpbnQgb24pCit7CisgICAgaW50IHJldDsKKworICAgIHJldCA9IFNSUF9DdHJsX09wZW4oKTsKKyAgICBpZiAocmV0IDwgMCkgeworICAgICAgICBMT0dFKCIlczogU1JQX0N0cmxfT3BlbiBlcnJvciIsIF9fZnVuY19fKTsKKyAgICAgICAgcmV0dXJuIC0xOworICAgIH0KKworICAgIGlvY3RsKHNycF9jdHJsLCBTUlBfQ1RSTF9QQ01fRFVNUF9PUCwgb24pOworCisgICAgTE9HVigiZHVtcF9vcDogJWQiLCBvbik7CisKKyAgICBTUlBfQ3RybF9DbG9zZSgpOworCisgICAgcmV0dXJuIDA7Cit9CisKK2ludCBTUlBfQ3RybF9HZXRfUGNtX0R1bXBfU3RhdGUodm9pZCkKK3sKKyAgICBpbnQgcmV0OworICAgIGludCBzcnBfZHVtcF9zdGF0ID0gMDsKKworICAgIHJldCA9IFNSUF9DdHJsX09wZW4oKTsKKyAgICBpZiAocmV0IDwgMCkgeworICAgICAgICBMT0dFKCIlczogU1JQX0N0cmxfT3BlbiBlcnJvciIsIF9fZnVuY19fKTsKKyAgICAgICAgcmV0dXJuIC0xOworICAgIH0KKworICAgIGlvY3RsKHNycF9jdHJsLCBTUlBfQ1RSTF9JU19QQ01fRFVNUCwgJnNycF9kdW1wX3N0YXQpOworCisgICAgTE9HVigic3JwX2R1bXBfc3RhdDogJWQiLCBzcnBfZHVtcF9zdGF0KTsKKworICAgIFNSUF9DdHJsX0Nsb3NlKCk7CisKKyAgICByZXR1cm4gc3JwX2R1bXBfc3RhdDsKK30KKworaW50IFNSUF9DdHJsX1NldF9HYWluKGZsb2F0IHZhbHVlKQoreworICAgIGludCByZXQ7CisgICAgdW5zaWduZWQgbG9uZyBnYWluID0gMDsKKworICAgIHJldCA9IFNSUF9DdHJsX09wZW4oKTsKKyAgICBpZiAocmV0IDwgMCkgeworICAgICAgICBMT0dFKCIlczogU1JQX0N0cmxfT3BlbiBlcnJvciIsIF9fZnVuY19fKTsKKyAgICAgICAgcmV0dXJuIC0xOworICAgIH0KKworICAgIGdhaW4gPSAodW5zaWduZWQgbG9uZykoKDEgPDwgMjQpICogdmFsdWUpOworICAgIGlvY3RsKHNycF9jdHJsLCBTUlBfQ1RSTF9TRVRfR0FJTiwgZ2Fpbik7CisKKyAgICBTUlBfQ3RybF9DbG9zZSgpOworCisgICAgcmV0dXJuIDA7Cit9CisKK2ludCBTUlBfQ3RybF9HZXRfUnVubmluZ19TdGF0KHZvaWQpCit7CisgICAgaW50IHJldDsKKyAgICBpbnQgc3JwX3J1bm5pbmdfc3RhdCA9IDA7CisKKyAgICByZXQgPSBTUlBfQ3RybF9PcGVuKCk7CisgICAgaWYgKHJldCA8IDApIHsKKyAgICAgICAgTE9HRSgiJXM6IFNSUF9DdHJsX09wZW4gZXJyb3IiLCBfX2Z1bmNfXyk7CisgICAgICAgIHJldHVybiAtMTsKKyAgICB9CisKKyAgICBpb2N0bChzcnBfY3RybCwgU1JQX0NUUkxfSVNfUlVOTklORywgJnNycF9ydW5uaW5nX3N0YXQpOworCisgICAgTE9HVigic3JwX3J1bm5pbmdfc3RhdDogJWQiLCBzcnBfcnVubmluZ19zdGF0KTsKKworICAgIFNSUF9DdHJsX0Nsb3NlKCk7CisKKyAgICByZXR1cm4gc3JwX3J1bm5pbmdfc3RhdDsKK30KKworaW50IFNSUF9DdHJsX0dldF9PcGVuX1N0YXQodm9pZCkKK3sKKyAgICBpbnQgcmV0OworICAgIGludCBzcnBfb3Blbl9zdGF0ID0gMDsKKworICAgIHJldCA9IFNSUF9DdHJsX09wZW4oKTsKKyAgICBpZiAocmV0IDwgMCkgeworICAgICAgICBMT0dFKCIlczogU1JQX0N0cmxfT3BlbiBlcnJvciIsIF9fZnVuY19fKTsKKyAgICAgICAgcmV0dXJuIC0xOworICAgIH0KKworICAgIGlvY3RsKHNycF9jdHJsLCBTUlBfQ1RSTF9JU19PUEVORUQsICZzcnBfb3Blbl9zdGF0KTsKKworICAgIExPR1YoInNycF9vcGVuX3N0YXQ6ICVkIiwgc3JwX29wZW5fc3RhdCk7CisKKyAgICBTUlBfQ3RybF9DbG9zZSgpOworCisgICAgcmV0dXJuIHNycF9vcGVuX3N0YXQ7Cit9CisKK3Nob3J0ICpTUlBfQ3RybF9HZXRfUGNtKHZvaWQpCit7CisgICAgaW50IHJldDsKKyAgICBpbnQgcnBfaXNfcnVubmluZyA9IDA7CisgICAgaW50IGR1bXBfaXNfb24gPSAwOworICAgIGludCBycF9pc19vcGVuZWQgPSAwOworCisgICAgcmV0ID0gU1JQX0N0cmxfT3BlbigpOworICAgIGlmIChyZXQgPCAwKSB7CisgICAgICAgIExPR0UoIiVzOiBTUlBfQ3RybF9PcGVuIGVycm9yIiwgX19mdW5jX18pOworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisKKyAgICBpb2N0bChzcnBfY3RybCwgU1JQX0NUUkxfSVNfUlVOTklORywgJnJwX2lzX3J1bm5pbmcpOworICAgIGlmIChycF9pc19ydW5uaW5nKSB7CisgICAgICAgIGlvY3RsKHNycF9jdHJsLCBTUlBfQ1RSTF9JU19QQ01fRFVNUCwgJmR1bXBfaXNfb24pOworICAgICAgICBpZiAoZHVtcF9pc19vbiA9PSAwKSB7CisgICAgICAgICAgICBpb2N0bChzcnBfY3RybCwgU1JQX0NUUkxfUENNX0RVTVBfT1AsIDEpOworICAgICAgICAgICAgZHVtcF9pc19vbiA9IDE7CisgICAgICAgIH0KKworICAgICAgICBpb2N0bChzcnBfY3RybCwgU1JQX0NUUkxfR0VUX1BDTV8xS0ZSQU1FLCBwY21fYnVmKTsKKyAgICAgICAgcmV0dXJuIHBjbV9idWY7CisgICAgfQorCisgICAgLyogU1JQIGlzIG5vdCBydW5uaW5nICovCisgICAgaWYgKHNycF9jdHJsID4gMCkgeworICAgICAgICBpZiAoZHVtcF9pc19vbikgeworICAgICAgICAgICAgaW9jdGwoc3JwX2N0cmwsIFNSUF9DVFJMX0lTX09QRU5FRCwgJnJwX2lzX29wZW5lZCk7CisgICAgICAgICAgICBpZiAocnBfaXNfb3BlbmVkKQorICAgICAgICAgICAgICAgIGlvY3RsKHNycF9jdHJsLCBTUlBfQ1RSTF9QQ01fRFVNUF9PUCwgMCk7CisgICAgICAgIH0KKyAgICAgICAgU1JQX0N0cmxfQ2xvc2UoKTsKKyAgICB9CisKKyAgICByZXR1cm4gTlVMTDsKK30KZGlmZiAtLWdpdCBhL2V4eW5vczQvbXVsdGltZWRpYS9jb2RlY3Mvc2VjX2NvZGVjcy9hdWRpby9leHlub3M1L0FuZHJvaWQubWsgYi9leHlub3M0L211bHRpbWVkaWEvY29kZWNzL3NlY19jb2RlY3MvYXVkaW8vZXh5bm9zNS9BbmRyb2lkLm1rCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjRiMTEzZTcKLS0tIC9kZXYvbnVsbAorKysgYi9leHlub3M0L211bHRpbWVkaWEvY29kZWNzL3NlY19jb2RlY3MvYXVkaW8vZXh5bm9zNS9BbmRyb2lkLm1rCkBAIC0wLDAgKzEsOSBAQAorTE9DQUxfUEFUSCA6PSAkKGNhbGwgbXktZGlyKQorCitpbmNsdWRlICQoQ0xFQVJfVkFSUykKKworTE9DQUxfQVVESU9fUEFUSCA6PSQoTE9DQUxfUEFUSCkKKworaWZlcSAoJChCT0FSRF9VU0VfQUxQX0FVRElPKSwgdHJ1ZSkKKyAgaW5jbHVkZSAkKExPQ0FMX0FVRElPX1BBVEgpL3NycC9hbHAvQW5kcm9pZC5taworZW5kaWYKZGlmZiAtLWdpdCBhL2V4eW5vczQvbXVsdGltZWRpYS9jb2RlY3Mvc2VjX2NvZGVjcy9hdWRpby9leHlub3M1L3NycC9hbHAvQW5kcm9pZC5tayBiL2V4eW5vczQvbXVsdGltZWRpYS9jb2RlY3Mvc2VjX2NvZGVjcy9hdWRpby9leHlub3M1L3NycC9hbHAvQW5kcm9pZC5tawpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43MzkzZjY4Ci0tLSAvZGV2L251bGwKKysrIGIvZXh5bm9zNC9tdWx0aW1lZGlhL2NvZGVjcy9zZWNfY29kZWNzL2F1ZGlvL2V4eW5vczUvc3JwL2FscC9BbmRyb2lkLm1rCkBAIC0wLDAgKzEsMjYgQEAKK0xPQ0FMX1BBVEggOj0gJChjYWxsIG15LWRpcikKK2luY2x1ZGUgJChDTEVBUl9WQVJTKQorCitMT0NBTF9DT1BZX0hFQURFUlNfVE8gOj0gbGlic2VjbW0KK0xPQ0FMX0NPUFlfSEVBREVSUyA6PSBcCisJaW5jbHVkZS9zcnBfYXBpLmggXAorCWluY2x1ZGUvc3JwX2lvY3RsLmggXAorCWluY2x1ZGUvc3JwX2Vycm9yLmgKKworTE9DQUxfU1JDX0ZJTEVTIDo9IFwKKwlzcmMvc3JwX2FwaS5jCisKK0xPQ0FMX0NfSU5DTFVERVMgOj0gXAorCSQoTE9DQUxfUEFUSCkvaW5jbHVkZQorCitMT0NBTF9NT0RVTEUgOj0gbGlic3JwYXBpCisKK0xPQ0FMX01PRFVMRV9UQUdTIDo9IG9wdGlvbmFsCisKK0xPQ0FMX0FSTV9NT0RFIDo9IGFybQorCitMT0NBTF9TVEFUSUNfTElCUkFSSUVTIDo9CisKK0xPQ0FMX1NIQVJFRF9MSUJSQVJJRVMgOj0KKworaW5jbHVkZSAkKEJVSUxEX1NUQVRJQ19MSUJSQVJZKQpkaWZmIC0tZ2l0IGEvZXh5bm9zNC9tdWx0aW1lZGlhL2NvZGVjcy9zZWNfY29kZWNzL2F1ZGlvL2V4eW5vczUvc3JwL2FscC9pbmNsdWRlL3NycF9hcGkuaCBiL2V4eW5vczQvbXVsdGltZWRpYS9jb2RlY3Mvc2VjX2NvZGVjcy9hdWRpby9leHlub3M1L3NycC9hbHAvaW5jbHVkZS9zcnBfYXBpLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYWQ2NWI5MAotLS0gL2Rldi9udWxsCisrKyBiL2V4eW5vczQvbXVsdGltZWRpYS9jb2RlY3Mvc2VjX2NvZGVjcy9hdWRpby9leHlub3M1L3NycC9hbHAvaW5jbHVkZS9zcnBfYXBpLmgKQEAgLTAsMCArMSw1MiBAQAorI2lmbmRlZiBfX1NSUF9BUElfSF9fCisjZGVmaW5lIF9fU1JQX0FQSV9IX18KKworI2luY2x1ZGUgInNycF9pb2N0bC5oIgorI2luY2x1ZGUgInNycF9lcnJvci5oIgorCisjZGVmaW5lIFNSUF9ERVZfTkFNRSAgICAgICAgICAgICAgICAgICAgImRldi9zcnAiCisKKyNkZWZpbmUgU1JQX0lOSVRfQkxPQ0tfTU9ERSAgICAgICAgICAgICAwCisjZGVmaW5lIFNSUF9JTklUX05PTkJMT0NLX01PREUgICAgICAgICAgMQorCisjZGVmaW5lIFNSUF9QRU5ESU5HX1NUQVRFX1JVTk5JTkcgICAgICAgMAorI2RlZmluZSBTUlBfUEVORElOR19TVEFURV9QRU5ESU5HICAgICAgIDEKKworc3RydWN0IHNycF9idWZfaW5mbyB7CisgICAgdm9pZCAqbW1hcHBlZF9hZGRyOworICAgIHZvaWQgKmFkZHI7CisgICAgdW5zaWduZWQgaW50IG1tYXBwZWRfc2l6ZTsKKyAgICB1bnNpZ25lZCBpbnQgc2l6ZTsKKyAgICBpbnQgbnVtOworfTsKKworc3RydWN0IHNycF9kZWNfaW5mbyB7CisgICAgdW5zaWduZWQgaW50IHNhbXBsZV9yYXRlOworICAgIHVuc2lnbmVkIGludCBjaGFubmVsczsKK307CisKKyNpZmRlZiBfX2NwbHVzcGx1cworZXh0ZXJuICJDIiB7CisjZW5kaWYKKworaW50IFNSUF9DcmVhdGUoaW50IGJsb2NrX21vZGUpOworaW50IFNSUF9Jbml0KCk7CitpbnQgU1JQX0RlY29kZSh2b2lkICpidWZmLCBpbnQgc2l6ZV9ieXRlKTsKK2ludCBTUlBfU2VuZF9FT1Modm9pZCk7CitpbnQgU1JQX1NldFBhcmFtcyhpbnQgaWQsIHVuc2lnbmVkIGxvbmcgdmFsKTsKK2ludCBTUlBfR2V0UGFyYW1zKGludCBpZCwgdW5zaWduZWQgbG9uZyAqcHZhbCk7CitpbnQgU1JQX0RlaW5pdCh2b2lkKTsKK2ludCBTUlBfVGVybWluYXRlKHZvaWQpOworaW50IFNSUF9Jc09wZW4odm9pZCk7CisKK2ludCBTUlBfR2V0X0lidWZfSW5mbyh2b2lkICoqYWRkciwgdW5zaWduZWQgaW50ICpzaXplLCB1bnNpZ25lZCBpbnQgKm51bSk7CitpbnQgU1JQX0dldF9PYnVmX0luZm8odm9pZCAqKmFkZHIsIHVuc2lnbmVkIGludCAqc2l6ZSwgdW5zaWduZWQgaW50ICpudW0pOworaW50IFNSUF9HZXRfRGVjX0luZm8oc3RydWN0IHNycF9kZWNfaW5mbyAqZGVjX2luZm8pOworaW50IFNSUF9HZXRfUENNKHZvaWQgKiphZGRyLCB1bnNpZ25lZCBpbnQgKnNpemUpOworaW50IFNSUF9GbHVzaCh2b2lkKTsKKworI2lmZGVmIF9fY3BsdXNwbHVzCit9CisjZW5kaWYKKworI2VuZGlmIC8qX19TUlBfQVBJX0hfXyAqLwpkaWZmIC0tZ2l0IGEvZXh5bm9zNC9tdWx0aW1lZGlhL2NvZGVjcy9zZWNfY29kZWNzL2F1ZGlvL2V4eW5vczUvc3JwL2FscC9pbmNsdWRlL3NycF9lcnJvci5oIGIvZXh5bm9zNC9tdWx0aW1lZGlhL2NvZGVjcy9zZWNfY29kZWNzL2F1ZGlvL2V4eW5vczUvc3JwL2FscC9pbmNsdWRlL3NycF9lcnJvci5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjdmNzk0NTIKLS0tIC9kZXYvbnVsbAorKysgYi9leHlub3M0L211bHRpbWVkaWEvY29kZWNzL3NlY19jb2RlY3MvYXVkaW8vZXh5bm9zNS9zcnAvYWxwL2luY2x1ZGUvc3JwX2Vycm9yLmgKQEAgLTAsMCArMSwyMiBAQAorI2lmbmRlZiBfU1JQX0VSUk9SX0hfCisjZGVmaW5lIF9TUlBfRVJST1JfSF8KKwordHlwZWRlZiBlbnVtIHsKKyAgICBTUlBfUkVUVVJOX09LID0gMCwKKworICAgIFNSUF9FUlJPUl9PUEVOX0ZBSUwgICAgICAgPSAtMTAwMCwKKyAgICBTUlBfRVJST1JfQUxSRUFEWV9PUEVOICAgID0gLTEwMDEsCisgICAgU1JQX0VSUk9SX05PVF9SRUFEWSAgICAgICA9IC0xMDAyLAorCisgICAgU1JQX0VSUk9SX0lCVUZfT1ZFUkZMT1cgICA9IC0yMDAwLAorICAgIFNSUF9FUlJPUl9JQlVGX0lORk8gICAgICAgPSAtMjAwMSwKKworICAgIFNSUF9FUlJPUl9PQlVGX1JFQUQgICAgICAgPSAtMzAwMCwKKyAgICBTUlBfRVJST1JfT0JVRl9JTkZPICAgICAgID0gLTMwMDEsCisgICAgU1JQX0VSUk9SX09CVUZfTU1BUCAgICAgICA9IC0zMDAyLAorCisgICAgU1JQX0VSUk9SX0lOVkFMSURfU0VUVElORyA9IC00MDAwLAorICAgIFNSUF9FUlJPUl9HRVRJTkZPX0ZBSUwgICAgPSAtNDAwMQorfSBTUlBfRVJST1JUWVBFOworCisjZW5kaWYgLyogX1NSUF9FUlJPUl9IXyAqLwpkaWZmIC0tZ2l0IGEvZXh5bm9zNC9tdWx0aW1lZGlhL2NvZGVjcy9zZWNfY29kZWNzL2F1ZGlvL2V4eW5vczUvc3JwL2FscC9pbmNsdWRlL3NycF9pb2N0bC5oIGIvZXh5bm9zNC9tdWx0aW1lZGlhL2NvZGVjcy9zZWNfY29kZWNzL2F1ZGlvL2V4eW5vczUvc3JwL2FscC9pbmNsdWRlL3NycF9pb2N0bC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjIxZDU1ZGYKLS0tIC9kZXYvbnVsbAorKysgYi9leHlub3M0L211bHRpbWVkaWEvY29kZWNzL3NlY19jb2RlY3MvYXVkaW8vZXh5bm9zNS9zcnAvYWxwL2luY2x1ZGUvc3JwX2lvY3RsLmgKQEAgLTAsMCArMSwyMyBAQAorI2lmbmRlZiBfX1NSUF9JT0NUTF9IX18KKyNkZWZpbmUgX19TUlBfSU9DVExfSF9fCisKKyNpZmRlZiBfX2NwbHVzcGx1cworZXh0ZXJuICJDIiB7CisjZW5kaWYKKworI2RlZmluZSBTUlBfSU5JVCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKDB4MTAwMDApCisjZGVmaW5lIFNSUF9ERUlOSVQgICAgICAgICAgICAgICAgICAgICAgICAgICAoMHgxMDAwMSkKKyNkZWZpbmUgU1JQX0dFVF9NTUFQX1NJWkUgICAgICAgICAgICAgICAgICAgICgweDEwMDAyKQorI2RlZmluZSBTUlBfRkxVU0ggICAgICAgICAgICAgICAgICAgICAgICAgICAgKDB4MjAwMDIpCisjZGVmaW5lIFNSUF9TRU5EX0VPUyAgICAgICAgICAgICAgICAgICAgICAgICAoMHgyMDAwNSkKKyNkZWZpbmUgU1JQX0dFVF9JQlVGX0lORk8gICAgICAgICAgICAgICAgICAgICgweDIwMDA3KQorI2RlZmluZSBTUlBfR0VUX09CVUZfSU5GTyAgICAgICAgICAgICAgICAgICAgKDB4MjAwMDgpCisjZGVmaW5lIFNSUF9TVE9QX0VPU19TVEFURSAgICAgICAgICAgICAgICAgICAoMHgzMDAwNykKKyNkZWZpbmUgU1JQX0dFVF9ERUNfSU5GTyAgICAgICAgICAgICAgICAgICAgICgweDMwMDA4KQorCisjaWZkZWYgX19jcGx1c3BsdXMKK30KKyNlbmRpZgorCisjZW5kaWYgLyogX19TUlBfSU9DVExfSF9fICovCisKZGlmZiAtLWdpdCBhL2V4eW5vczQvbXVsdGltZWRpYS9jb2RlY3Mvc2VjX2NvZGVjcy9hdWRpby9leHlub3M1L3NycC9hbHAvc3JjL3NycF9hcGkuYyBiL2V4eW5vczQvbXVsdGltZWRpYS9jb2RlY3Mvc2VjX2NvZGVjcy9hdWRpby9leHlub3M1L3NycC9hbHAvc3JjL3NycF9hcGkuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41NjEyNWZiCi0tLSAvZGV2L251bGwKKysrIGIvZXh5bm9zNC9tdWx0aW1lZGlhL2NvZGVjcy9zZWNfY29kZWNzL2F1ZGlvL2V4eW5vczUvc3JwL2FscC9zcmMvc3JwX2FwaS5jCkBAIC0wLDAgKzEsMjY1IEBACisjaW5jbHVkZSA8c3lzL3R5cGVzLmg+CisjaW5jbHVkZSA8c3lzL3N0YXQuaD4KKyNpbmNsdWRlIDxzeXMvaW9jdGwuaD4KKyNpbmNsdWRlIDxzeXMvbW1hbi5oPgorI2luY2x1ZGUgPHN5cy90aW1lLmg+CisjaW5jbHVkZSA8ZmNudGwuaD4KKyNpbmNsdWRlIDxjdHlwZS5oPgorI2luY2x1ZGUgPHVuaXN0ZC5oPgorI2luY2x1ZGUgPHN0cmluZy5oPgorI2luY2x1ZGUgPGVycm5vLmg+CisjaW5jbHVkZSA8c3RkaW8uaD4KKworI2luY2x1ZGUgInNycF9hcGkuaCIKKworI2RlZmluZSBMT0dfTkRFQlVHIDEKKyNkZWZpbmUgTE9HX1RBRyAibGlic3JwYXBpIgorI2luY2x1ZGUgPHV0aWxzL0xvZy5oPgorCitzdGF0aWMgc3RydWN0IHNycF9idWZfaW5mbyBpYnVmX2luZm87CitzdGF0aWMgc3RydWN0IHNycF9idWZfaW5mbyBvYnVmX2luZm87CitzdGF0aWMgc3RydWN0IHNycF9idWZfaW5mbyBwY21faW5mbzsKKworc3RhdGljIGludCBzcnBfZGV2ID0gLTE7CitzdGF0aWMgaW50IHNycF9ibG9ja19tb2RlID0gU1JQX0lOSVRfQkxPQ0tfTU9ERTsKKworaW50IFNSUF9DcmVhdGUoaW50IGJsb2NrX21vZGUpCit7CisgICAgaWYgKHNycF9kZXYgPT0gLTEpIHsKKyAgICAgICAgc3JwX2Jsb2NrX21vZGUgPSBibG9ja19tb2RlOworICAgICAgICBzcnBfZGV2ID0gb3BlbihTUlBfREVWX05BTUUsIE9fUkRXUiB8CisgICAgICAgICAgICAgICAgICAgICgoYmxvY2tfbW9kZSA9PSBTUlBfSU5JVF9OT05CTE9DS19NT0RFKSA/IE9fTkRFTEFZIDogMCkpOworICAgICAgICBpZiAoc3JwX2RldiA+IDApCisgICAgICAgICAgICByZXR1cm4gc3JwX2RldjsKKyAgICAgICAgZWxzZQorICAgICAgICAgICAgcmV0dXJuIFNSUF9FUlJPUl9PUEVOX0ZBSUw7CisgICAgfQorCisgICAgTE9HRSgiJXM6IERldmljZSBpcyBhbHJlYWR5IG9wZW5lZCIsIF9fZnVuY19fKTsKKyAgICByZXR1cm4gU1JQX0VSUk9SX0FMUkVBRFlfT1BFTjsKK30KKworaW50IFNSUF9Jbml0KCkKK3sKKyAgICBpbnQgcmV0ID0gU1JQX1JFVFVSTl9PSzsKKyAgICB1bnNpZ25lZCBpbnQgbW1hcHBlZF9zaXplID0gMDsKKworICAgIGlmIChzcnBfZGV2ICE9IC0xKSB7CisgICAgICAgIHJldCA9IGlvY3RsKHNycF9kZXYsIFNSUF9JTklUKTsKKyAgICAgICAgaWYgKHJldCA8IDApCisgICAgICAgICAgICByZXR1cm4gcmV0OworCisgICAgICAgIC8qIG1tYXAgZm9yIE9CVUYgKi8KKyAgICAgICAgcmV0ID0gaW9jdGwoc3JwX2RldiwgU1JQX0dFVF9NTUFQX1NJWkUsICZtbWFwcGVkX3NpemUpOworICAgICAgICBpZiAocmV0IDwgMCkgeworICAgICAgICAgICAgTE9HRSgiJXM6IFNSUF9HRVRfTU1BUF9TSVpFIGlzIGZhaWxlZCIsIF9fZnVuY19fKTsKKyAgICAgICAgICAgIHJldHVybiBTUlBfRVJST1JfT0JVRl9NTUFQOworICAgICAgICB9CisgICAgICAgIG9idWZfaW5mby5tbWFwcGVkX2FkZHIgPSBtbWFwKDAsIG1tYXBwZWRfc2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgUFJPVF9SRUFEIHwgUFJPVF9XUklURSwgTUFQX1NIQVJFRCwgc3JwX2RldiwgMCk7CisgICAgICAgIGlmICghb2J1Zl9pbmZvLm1tYXBwZWRfYWRkcikgeworICAgICAgICAgICAgTE9HRSgiJXM6IG1tYXAgaXMgZmFpbGVkIiwgX19mdW5jX18pOworICAgICAgICAgICAgcmV0dXJuIFNSUF9FUlJPUl9PQlVGX01NQVA7CisgICAgICAgIH0KKyAgICAgICAgb2J1Zl9pbmZvLm1tYXBwZWRfc2l6ZSA9IG1tYXBwZWRfc2l6ZTsKKworICAgICAgICByZXQgPSBTUlBfUkVUVVJOX09LOworICAgIH0gZWxzZSB7CisgICAgICAgIExPR0UoIiVzOiBEZXZpY2UgaXMgbm90IHJlYWR5IiwgX19mdW5jX18pOworICAgICAgICByZXQgPSBTUlBfRVJST1JfTk9UX1JFQURZOyAvKiBkZXZpY2UgaXMgbm90IGNyZWF0ZWQgKi8KKyAgICB9CisKKyAgICByZXR1cm4gcmV0OworfQorCitpbnQgU1JQX0RlY29kZSh2b2lkICpidWZmLCBpbnQgc2l6ZV9ieXRlKQoreworICAgIGludCByZXQgPSBTUlBfUkVUVVJOX09LOworCisgICAgaWYgKHNycF9kZXYgIT0gLTEpIHsKKyAgICAgICAgaWYgKHNpemVfYnl0ZSA+IDApIHsKKyAgICAgICAgICAgIExPR1YoIiVzOiBTZW5kIGRhdGEgdG8gUlAgKCVkIGJ5dGVzKSIsIF9fZnVuY19fLCBzaXplX2J5dGUpOworCisgICAgICAgICAgICByZXQgPSB3cml0ZShzcnBfZGV2LCBidWZmLCBzaXplX2J5dGUpOyAgLyogV3JpdGUgQnVmZmVyIHRvIFJQIERyaXZlciAqLworICAgICAgICAgICAgaWYgKHJldCA8IDApIHsKKyAgICAgICAgICAgICAgICBpZiAocmV0ICE9IFNSUF9FUlJPUl9JQlVGX09WRVJGTE9XKQorICAgICAgICAgICAgICAgICAgICBMT0dFKCJTUlBfRGVjb2RlIHJldHVybmVkIGVycm9yIGNvZGU6ICVkIiwgcmV0KTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJldHVybiByZXQ7IC8qIFdyaXRlIFN1Y2Nlc3MgKi8KKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHJldHVybiByZXQ7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBMT0dFKCIlczogRGV2aWNlIGlzIG5vdCByZWFkeSIsIF9fZnVuY19fKTsKKyAgICByZXR1cm4gU1JQX0VSUk9SX05PVF9SRUFEWTsKK30KKworaW50IFNSUF9TZW5kX0VPUyh2b2lkKQoreworICAgIGlmIChzcnBfZGV2ICE9IC0xKQorICAgICAgICByZXR1cm4gaW9jdGwoc3JwX2RldiwgU1JQX1NFTkRfRU9TKTsKKworICAgIHJldHVybiBTUlBfRVJST1JfTk9UX1JFQURZOworfQorCitpbnQgU1JQX1NldFBhcmFtcyhpbnQgaWQsIHVuc2lnbmVkIGxvbmcgdmFsKQoreworICAgIGlmIChzcnBfZGV2ICE9IC0xKQorICAgICAgICByZXR1cm4gMDsgLyogbm90IHlldCAqLworCisgICAgcmV0dXJuIFNSUF9FUlJPUl9OT1RfUkVBRFk7Cit9CisKK2ludCBTUlBfR2V0UGFyYW1zKGludCBpZCwgdW5zaWduZWQgbG9uZyAqcHZhbCkKK3sKKyAgICBpZiAoc3JwX2RldiAhPSAtMSkKKyAgICAgICAgcmV0dXJuIGlvY3RsKHNycF9kZXYsIGlkLCBwdmFsKTsKKworICAgIHJldHVybiBTUlBfRVJST1JfTk9UX1JFQURZOworfQorCitpbnQgU1JQX0ZsdXNoKHZvaWQpCit7CisgICAgaWYgKHNycF9kZXYgIT0gLTEpCisgICAgICAgIHJldHVybiBpb2N0bChzcnBfZGV2LCBTUlBfRkxVU0gpOworCisgICAgcmV0dXJuIFNSUF9FUlJPUl9OT1RfUkVBRFk7Cit9CisKK2ludCBTUlBfR2V0X1BDTSh2b2lkICoqYWRkciwgdW5zaWduZWQgaW50ICpzaXplKQoreworICAgIGludCByZXQgPSBTUlBfUkVUVVJOX09LOworCisgICAgaWYgKHNycF9kZXYgIT0gLTEpIHsKKyAgICAgICAgcmV0ID0gcmVhZChzcnBfZGV2LCAmcGNtX2luZm8sIDApOworICAgICAgICBpZiAocmV0ID09IC0xKSB7CisgICAgICAgICAgICAqc2l6ZSA9IDA7CisgICAgICAgICAgICBMT0dFKCIlczogUENNIHJlYWQgZmFpbCIsIF9fZnVuY19fKTsKKyAgICAgICAgICAgIHJldHVybiBTUlBfRVJST1JfT0JVRl9SRUFEOworICAgICAgICB9CisKKyAgICAgICAgKmFkZHIgPSBwY21faW5mby5hZGRyOworICAgICAgICAqc2l6ZSA9IHBjbV9pbmZvLnNpemU7CisgICAgfSBlbHNlIHsKKyAgICAgICAgcmV0dXJuIFNSUF9FUlJPUl9OT1RfUkVBRFk7CisgICAgfQorCisgICAgcmV0dXJuIHJldDsgLyogUmVhZCBTdWNjZXNzICovCit9CisKK2ludCBTUlBfR2V0X0RlY19JbmZvKHN0cnVjdCBzcnBfZGVjX2luZm8gKmRlY19pbmZvKQoreworICAgIGludCByZXQ7CisKKyAgICBpZiAoc3JwX2RldiAhPSAtMSkgeworICAgICAgICByZXQgPSBpb2N0bChzcnBfZGV2LCBTUlBfR0VUX0RFQ19JTkZPLCBkZWNfaW5mbyk7CisgICAgICAgIGlmIChyZXQgPCAwKSB7CisgICAgICAgICAgICBMT0dFKCIlczogRmFpbGVkIHRvIGdldCBkZWMgaW5mbyIsIF9fZnVuY19fKTsKKyAgICAgICAgICAgIHJldHVybiBTUlBfRVJST1JfR0VUSU5GT19GQUlMOworICAgICAgICB9CisKKyAgICAgICAgTE9HVigibnVtQ2hhbm5lbHMoJWQpLCBzYW1wbGluZ1JhdGUoJWQpIiwgZGVjX2luZm8tPmNoYW5uZWxzLCBkZWNfaW5mby0+c2FtcGxlX3JhdGUpOworCisgICAgICAgIHJldCA9IFNSUF9SRVRVUk5fT0s7CisgICAgfSBlbHNlIHsKKyAgICAgICAgcmV0ID0gU1JQX0VSUk9SX05PVF9SRUFEWTsKKyAgICB9CisKKyAgICByZXR1cm4gcmV0OworfQorCitpbnQgU1JQX0dldF9JYnVmX0luZm8odm9pZCAqKmFkZHIsIHVuc2lnbmVkIGludCAqc2l6ZSwgdW5zaWduZWQgaW50ICpudW0pCit7CisgICAgaW50IHJldCA9IFNSUF9SRVRVUk5fT0s7CisKKyAgICBpZiAoc3JwX2RldiAhPSAtMSkgeworICAgICAgICByZXQgPSBpb2N0bChzcnBfZGV2LCBTUlBfR0VUX0lCVUZfSU5GTywgJmlidWZfaW5mbyk7CisgICAgICAgIGlmIChyZXQgPT0gLTEpIHsKKyAgICAgICAgICAgIExPR0UoIiVzOiBGYWlsZWQgdG8gZ2V0IElidWYgaW5mbyIsIF9fZnVuY19fKTsKKyAgICAgICAgICAgIHJldHVybiBTUlBfRVJST1JfSUJVRl9JTkZPOworICAgICAgICB9CisKKyAgICAgICAgKmFkZHIgPSBpYnVmX2luZm8uYWRkcjsKKyAgICAgICAgKnNpemUgPSBpYnVmX2luZm8uc2l6ZTsKKyAgICAgICAgKm51bSA9IGlidWZfaW5mby5udW07CisKKyAgICAgICAgaWYgKCpudW0gPT0gMCkgeworICAgICAgICAgICAgTE9HRSgiJXM6IElCVUYgbnVtIGlzIDAiLCBfX2Z1bmNfXyk7CisgICAgICAgICAgICByZXR1cm4gU1JQX0VSUk9SX0lOVkFMSURfU0VUVElORzsKKyAgICAgICAgfQorCisgICAgICAgIHJldCA9IFNSUF9SRVRVUk5fT0s7CisgICAgfSBlbHNlIHsKKyAgICAgICAgcmV0ID0gU1JQX0VSUk9SX05PVF9SRUFEWTsKKyAgICB9CisKKyAgICByZXR1cm4gcmV0OworfQorCitpbnQgU1JQX0dldF9PYnVmX0luZm8odm9pZCAqKmFkZHIsIHVuc2lnbmVkIGludCAqc2l6ZSwgdW5zaWduZWQgaW50ICpudW0pCit7CisgICAgaW50IHJldCA9IFNSUF9SRVRVUk5fT0s7CisKKyAgICBpZiAoc3JwX2RldiAhPSAtMSkgeworICAgICAgICBpZiAob2J1Zl9pbmZvLmFkZHIgPT0gTlVMTCkgeworICAgICAgICAgICAgcmV0ID0gaW9jdGwoc3JwX2RldiwgU1JQX0dFVF9PQlVGX0lORk8sICZvYnVmX2luZm8pOworICAgICAgICAgICAgaWYgKHJldCA8IDApIHsKKyAgICAgICAgICAgICAgICBMT0dFKCIlczogU1JQX0dFVF9PQlVGX0lORk8gaXMgZmFpbGVkIiwgX19mdW5jX18pOworICAgICAgICAgICAgICAgIHJldHVybiBTUlBfRVJST1JfT0JVRl9JTkZPOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgKmFkZHIgPSBvYnVmX2luZm8uYWRkcjsKKyAgICAgICAgKnNpemUgPSBvYnVmX2luZm8uc2l6ZTsKKyAgICAgICAgKm51bSA9IG9idWZfaW5mby5udW07CisKKyAgICAgICAgaWYgKCpudW0gPT0gMCkgeworICAgICAgICAgICAgTE9HRSgiJXM6IE9CVUYgbnVtIGlzIDAiLCBfX2Z1bmNfXyk7CisgICAgICAgICAgICByZXR1cm4gU1JQX0VSUk9SX0lOVkFMSURfU0VUVElORzsKKyAgICAgICAgfQorCisgICAgICAgIHJldCA9IFNSUF9SRVRVUk5fT0s7CisgICAgfSBlbHNlIHsKKyAgICAgICAgcmV0ID0gU1JQX0VSUk9SX05PVF9SRUFEWTsKKyAgICB9CisKKyAgICByZXR1cm4gcmV0OworfQorCitpbnQgU1JQX0RlaW5pdCh2b2lkKQoreworICAgIGlmIChzcnBfZGV2ICE9IC0xKSB7CisgICAgICAgIG11bm1hcChvYnVmX2luZm8ubW1hcHBlZF9hZGRyLCBvYnVmX2luZm8ubW1hcHBlZF9zaXplKTsKKyAgICAgICAgcmV0dXJuIGlvY3RsKHNycF9kZXYsIFNSUF9ERUlOSVQpOworICAgIH0KKworICAgIHJldHVybiBTUlBfRVJST1JfTk9UX1JFQURZOworfQorCitpbnQgU1JQX1Rlcm1pbmF0ZSh2b2lkKQoreworICAgIGludCByZXQ7CisKKyAgICBpZiAoc3JwX2RldiAhPSAtMSkgeworICAgICAgICByZXQgPSBjbG9zZShzcnBfZGV2KTsKKworICAgICAgICBpZiAocmV0ID09IDApIHsKKyAgICAgICAgICAgIHNycF9kZXYgPSAtMTsgLyogZGV2aWNlIGNsb3NlZCAqLworICAgICAgICAgICAgcmV0dXJuIFNSUF9SRVRVUk5fT0s7CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gU1JQX0VSUk9SX05PVF9SRUFEWTsKK30KKworaW50IFNSUF9Jc09wZW4odm9pZCkKK3sKKyAgICBpZiAoc3JwX2RldiA9PSAtMSkgeworICAgICAgICBMT0dWKCIlczogRGV2aWNlIGlzIG5vdCBvcGVuZWQiLCBfX2Z1bmNfXyk7CisgICAgICAgIHJldHVybiAwOworICAgIH0KKworICAgIExPR1YoIiVzOiBEZXZpY2UgaXMgb3BlbmVkIiwgX19mdW5jX18pOworICAgIHJldHVybiAxOworfQpkaWZmIC0tZ2l0IGEvZXh5bm9zNC9tdWx0aW1lZGlhL2NvZGVjcy9zZWNfY29kZWNzL3ZpZGVvL0FuZHJvaWQubWsgYi9leHlub3M0L211bHRpbWVkaWEvY29kZWNzL3NlY19jb2RlY3MvdmlkZW8vQW5kcm9pZC5tawpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zYmMzNTc3Ci0tLSAvZGV2L251bGwKKysrIGIvZXh5bm9zNC9tdWx0aW1lZGlhL2NvZGVjcy9zZWNfY29kZWNzL3ZpZGVvL0FuZHJvaWQubWsKQEAgLTAsMCArMSwxMSBAQAorTE9DQUxfUEFUSCA6PSAkKGNhbGwgbXktZGlyKQorCitpbmNsdWRlICQoQ0xFQVJfVkFSUykKKworaWZlcSAoJChmaWx0ZXItb3V0IGV4eW5vczQsJChUQVJHRVRfQk9BUkRfUExBVEZPUk0pKSwpCitpbmNsdWRlICAgJChMT0NBTF9QQVRIKS9leHlub3M0L0FuZHJvaWQubWsKK2VuZGlmCisKK2lmZXEgKCQoZmlsdGVyLW91dCBleHlub3M1LCQoVEFSR0VUX0JPQVJEX1BMQVRGT1JNKSksKQoraW5jbHVkZSAgICQoTE9DQUxfUEFUSCkvZXh5bm9zNS9BbmRyb2lkLm1rCitlbmRpZgpkaWZmIC0tZ2l0IGEvZXh5bm9zNC9tdWx0aW1lZGlhL2NvZGVjcy9zZWNfY29kZWNzL3ZpZGVvL2V4eW5vczQvQW5kcm9pZC5tayBiL2V4eW5vczQvbXVsdGltZWRpYS9jb2RlY3Mvc2VjX2NvZGVjcy92aWRlby9leHlub3M0L0FuZHJvaWQubWsKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMWE4YzQxOQotLS0gL2Rldi9udWxsCisrKyBiL2V4eW5vczQvbXVsdGltZWRpYS9jb2RlY3Mvc2VjX2NvZGVjcy92aWRlby9leHlub3M0L0FuZHJvaWQubWsKQEAgLTAsMCArMSwxMSBAQAorTE9DQUxfUEFUSCA6PSAkKGNhbGwgbXktZGlyKQorCitpbmNsdWRlICQoQ0xFQVJfVkFSUykKKworTE9DQUxfVklERU9fUEFUSCA6PSQoTE9DQUxfUEFUSCkKKworaWZlcSAoJChCT0FSRF9VU0VfVjRMMiksIHRydWUpCitpbmNsdWRlICAgICQoTE9DQUxfVklERU9fUEFUSCkvbWZjX3Y0bDIvQW5kcm9pZC5taworZWxzZQoraW5jbHVkZSAgICAkKExPQ0FMX1ZJREVPX1BBVEgpL21mYy9BbmRyb2lkLm1rCitlbmRpZgpkaWZmIC0tZ2l0IGEvZXh5bm9zNC9tdWx0aW1lZGlhL2NvZGVjcy9zZWNfY29kZWNzL3ZpZGVvL2V4eW5vczQvbWZjL0FuZHJvaWQubWsgYi9leHlub3M0L211bHRpbWVkaWEvY29kZWNzL3NlY19jb2RlY3MvdmlkZW8vZXh5bm9zNC9tZmMvQW5kcm9pZC5tawpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iMjNmNjAzCi0tLSAvZGV2L251bGwKKysrIGIvZXh5bm9zNC9tdWx0aW1lZGlhL2NvZGVjcy9zZWNfY29kZWNzL3ZpZGVvL2V4eW5vczQvbWZjL0FuZHJvaWQubWsKQEAgLTAsMCArMSwzOCBAQAorTE9DQUxfUEFUSCA6PSAkKGNhbGwgbXktZGlyKQorCitpbmNsdWRlICQoQ0xFQVJfVkFSUykKKworTE9DQUxfQ09QWV9IRUFERVJTX1RPIDo9IGxpYnNlY21tCitMT0NBTF9DT1BZX0hFQURFUlMgOj0gXAorCWluY2x1ZGUvbWZjX2Vycm5vLmggXAorCWluY2x1ZGUvbWZjX2ludGVyZmFjZS5oIFwKKwlpbmNsdWRlL1NzYlNpcE1mY0FwaS5oCisKK0xPQ0FMX01PRFVMRV9UQUdTIDo9IG9wdGlvbmFsCisKK0xPQ0FMX1NSQ19GSUxFUyA6PSBcCisJZGVjL3NyYy9Tc2JTaXBNZmNEZWNBUEkuYyBcCisJZW5jL3NyYy9Tc2JTaXBNZmNFbmNBUEkuYworCitMT0NBTF9DX0lOQ0xVREVTIDo9IFwKKwkkKExPQ0FMX1BBVEgpL2luY2x1ZGUvCisKK0xPQ0FMX01PRFVMRSA6PSBsaWJzZWNtZmNhcGkKKworTE9DQUxfUFJFTElOS19NT0RVTEUgOj0gZmFsc2UKKworaWZlcSAoJChCT0FSRF9VU0VTX01GQ19GUFMpLHRydWUpCitMT0NBTF9DRkxBR1MgOj0gLURDT05GSUdfTUZDX0ZQUworI0xPQ0FMX0NGTEFHUyArPSAtRENPTkZJR19NRkNfUEVSRl9MT0cKK2VuZGlmCisKK2lmZXEgKCQoQk9BUkRfVVNFX1MzRF9TVVBQT1JUKSwgdHJ1ZSkKK0xPQ0FMX0NGTEFHUyArPSAtRFMzRF9TVVBQT1JUCitlbmRpZgorCitMT0NBTF9BUk1fTU9ERSA6PSBhcm0KKworTE9DQUxfU1RBVElDX0xJQlJBUklFUyA6PQorTE9DQUxfU0hBUkVEX0xJQlJBUklFUyA6PSBsaWJsb2cKKworaW5jbHVkZSAkKEJVSUxEX1NUQVRJQ19MSUJSQVJZKQpkaWZmIC0tZ2l0IGEvZXh5bm9zNC9tdWx0aW1lZGlhL2NvZGVjcy9zZWNfY29kZWNzL3ZpZGVvL2V4eW5vczQvbWZjL2RlYy9zcmMvU3NiU2lwTWZjRGVjQVBJLmMgYi9leHlub3M0L211bHRpbWVkaWEvY29kZWNzL3NlY19jb2RlY3MvdmlkZW8vZXh5bm9zNC9tZmMvZGVjL3NyYy9Tc2JTaXBNZmNEZWNBUEkuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41Y2M3Yzg4Ci0tLSAvZGV2L251bGwKKysrIGIvZXh5bm9zNC9tdWx0aW1lZGlhL2NvZGVjcy9zZWNfY29kZWNzL3ZpZGVvL2V4eW5vczQvbWZjL2RlYy9zcmMvU3NiU2lwTWZjRGVjQVBJLmMKQEAgLTAsMCArMSwxMTY1IEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDEwIFNhbXN1bmcgRWxlY3Ryb25pY3MgQ28uLCBMdGQuCisgKiAgICAgICAgICAgICAgaHR0cDovL3d3dy5zYW1zdW5nLmNvbS8KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgYXMKKyAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICoKKyAqIEFsdGVybmF0aXZlbHksIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlIDxzdGRsaWIuaD4KKyNpbmNsdWRlIDx1bmlzdGQuaD4KKyNpbmNsdWRlIDxzdHJpbmcuaD4KKyNpbmNsdWRlIDxmY250bC5oPgorCisjaW5jbHVkZSA8c3lzL3R5cGVzLmg+CisjaW5jbHVkZSA8c3lzL3N0YXQuaD4KKyNpbmNsdWRlIDxzeXMvaW9jdGwuaD4KKyNpbmNsdWRlIDxzeXMvbW1hbi5oPgorCisjaW5jbHVkZSAibWZjX2ludGVyZmFjZS5oIgorI2luY2x1ZGUgIlNzYlNpcE1mY0FwaS5oIgorCisjaW5jbHVkZSA8dXRpbHMvTG9nLmg+CisvKiNkZWZpbmUgTE9HX05ERUJVRyAwKi8KKyN1bmRlZiAgTE9HX1RBRworI2RlZmluZSBMT0dfVEFHICJNRkNfREVDX0FQUCIKKworI2lmZGVmIENPTkZJR19NRkNfRlBTCisjaW5jbHVkZSA8c3lzL3RpbWUuaD4KKyNlbmRpZgorCisjZGVmaW5lIF9NRkNMSUJfTUFHSUNfTlVNQkVSICAgIDB4OTIyNDEwMDAKKworI2RlZmluZSBVU1JfREFUQV9TVEFSVF9DT0RFICAgICAoMHgwMDAwMDFCMikKKyNkZWZpbmUgVk9QX1NUQVJUX0NPREUgICAgICAgICAgKDB4MDAwMDAxQjYpCisjZGVmaW5lIE1QNF9TVEFSVF9DT0RFICAgICAgICAgICgweDAwMDAwMSkKKworI2lmZGVmIENPTkZJR19NRkNfRlBTCit1bnNpZ25lZCBpbnQgZnJhbWVjb3VudCwgb3ZlcjMwbXM7CitzdHJ1Y3QgdGltZXZhbCBtRGVjMSwgbURlYzIsIG1Bdmc7CisjZW5kaWYKKworc3RhdGljIGNoYXIgKm1mY19kZXZfbmFtZSA9IFNBTVNVTkdfTUZDX0RFVl9OQU1FOworCitzdGF0aWMgdm9pZCBnZXRBQnl0ZShjaGFyICpidWZmLCBpbnQgKmNvZGUpCit7CisgICAgaW50IGJ5dGU7CisKKyAgICAqY29kZSA9ICgqY29kZSA8PCA4KTsKKyAgICBieXRlID0gKGludCkqYnVmZjsKKyAgICBieXRlICY9IDB4RkY7CisgICAgKmNvZGUgfD0gYnl0ZTsKK30KKworc3RhdGljIGludCBpc1BCUGFja2VkKF9NRkNMSUIgKnBDdHgsIGludCBGcmFtZWxlbmcpCit7CisgICAgY2hhciAqc3RybUJ1ZmZlciA9IE5VTEw7CisgICAgaW50IHN0YXJ0Q29kZSA9IDB4RkZGRkZGRkY7CisgICAgaW50IGxlbmdfaWR4ID0gMTsKKworICAgIHN0cm1CdWZmZXIgPSAoY2hhciopcEN0eC0+dmlyU3RybUJ1ZjsKKworICAgIHdoaWxlICgxKSB7CisgICAgICAgIHdoaWxlIChzdGFydENvZGUgIT0gVVNSX0RBVEFfU1RBUlRfQ09ERSkgeworICAgICAgICAgICAgaWYgKChzdGFydENvZGUgPT0gVk9QX1NUQVJUX0NPREUpIHx8IChsZW5nX2lkeCA9PSBGcmFtZWxlbmcpKSB7CisgICAgICAgICAgICAgICAgTE9HSSgiaXNQQlBhY2tlZF0gVk9QIFNUQVJUIEZvdW5kICEhLi4uLi5yZXR1cm4iKTsKKyAgICAgICAgICAgICAgICBMT0dXKCJpc1BCUGFja2VkXSBOb24gUGFja2VkIFBCIik7CisgICAgICAgICAgICAgICAgcmV0dXJuIDA7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBnZXRBQnl0ZShzdHJtQnVmZmVyLCAmc3RhcnRDb2RlKTsKKyAgICAgICAgICAgIExPR1YoIj4+IFN0YXJ0Q29kZSA9IDB4JTA4eCA8PFxuIiwgc3RhcnRDb2RlKTsKKyAgICAgICAgICAgIHN0cm1CdWZmZXIrKzsKKyAgICAgICAgICAgIGxlbmdfaWR4Kys7CisgICAgICAgIH0KKyAgICAgICAgTE9HSSgiaXNQQlBhY2tlZF0gVXNlciBEYXRhIEZvdW5kICEhIik7CisKKyAgICAgICAgZG8geworICAgICAgICAgICAgaWYgKCpzdHJtQnVmZmVyID09ICdwJykgeworICAgICAgICAgICAgICAgIC8qTE9HSSgiPj4gcGV0ZXIgc3RybUJ1ZmZlciA9IDB4JTA4eCA8PFxuIiwgKnN0cm1CdWZmZXIpOyovCisgICAgICAgICAgICAgICAgTE9HVygiaXNQQlBhY2tlZF0gUGFja2VkIFBCXG4iKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gMTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGdldEFCeXRlKHN0cm1CdWZmZXIsICZzdGFydENvZGUpOworICAgICAgICAgICAgc3RybUJ1ZmZlcisrOyBsZW5nX2lkeCsrOworICAgICAgICB9IHdoaWxlICgobGVuZ19pZHggPD0gRnJhbWVsZW5nKSAmJiAoKHN0YXJ0Q29kZSA+PiA4KSAhPSBNUDRfU1RBUlRfQ09ERSkpOworCisgICAgICAgIGlmIChsZW5nX2lkeCA+IEZyYW1lbGVuZykKKyAgICAgICAgICAgIGJyZWFrOworICAgIH0KKworICAgIExPR1coImlzUEJQYWNrZWRdIE5vbiBQYWNrZWQgUEIiKTsKKworICAgIHJldHVybiAwOworfQorCit2b2lkIFNzYlNpcE1mY0RlY1NldE1GQ05hbWUoY2hhciAqZGV2aWNlbmFtZSkKK3sKKyAgICBtZmNfZGV2X25hbWUgPSBkZXZpY2VuYW1lOworfQorCit2b2lkICpTc2JTaXBNZmNEZWNPcGVuKHZvaWQpCit7CisgICAgaW50IGhNRkNPcGVuOworICAgIHVuc2lnbmVkIGludCBtYXBwZWRfYWRkcjsKKyAgICBfTUZDTElCICpwQ1RYID0gTlVMTDsKKyAgICBpbnQgbWFwcGVkX3NpemU7CisgICAgc3RydWN0IG1mY19jb21tb25fYXJncyBDb21tb25Bcmc7CisKKyAgICBMT0dJKCJbJXNdIE1GQyBMaWJyYXJ5IFZlciAlZC4lMDJkXG4iLF9fZnVuY19fLCBNRkNfTElCX1ZFUl9NQUpPUiwgTUZDX0xJQl9WRVJfTUlOT1IpOworI2lmZGVmIENPTkZJR19NRkNfRlBTCisgICAgZnJhbWVjb3VudCA9IDA7CisgICAgb3ZlcjMwbXMgPSAwOworICAgIG1BdmcudHZfc2VjID0gMDsKKyAgICBtQXZnLnR2X3VzZWMgPSAwOworI2VuZGlmCisgICAgcENUWCA9IChfTUZDTElCICopbWFsbG9jKHNpemVvZihfTUZDTElCKSk7CisgICAgaWYgKHBDVFggPT0gTlVMTCkgeworICAgICAgICBMT0dFKCJTc2JTaXBNZmNEZWNPcGVuXSBtYWxsb2MgZmFpbGVkLlxuIik7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KKyAgICBtZW1zZXQocENUWCwgMCwgc2l6ZW9mKF9NRkNMSUIpKTsKKworICAgIGlmIChhY2Nlc3MobWZjX2Rldl9uYW1lLCBGX09LKSAhPSAwKSB7CisgICAgICAgIExPR0UoIlNzYlNpcE1mY0RlY09wZW5dIE1GQyBkZXZpY2Ugbm9kZSBub3QgZXhpc3RzIik7CisgICAgICAgIGZyZWUocENUWCk7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KKworICAgIGhNRkNPcGVuID0gb3BlbihtZmNfZGV2X25hbWUsIE9fUkRXUiB8IE9fTkRFTEFZKTsKKyAgICBpZiAoaE1GQ09wZW4gPCAwKSB7CisgICAgICAgIExPR0UoIlNzYlNpcE1mY0RlY09wZW5dIE1GQyBPcGVuIGZhaWx1cmUiKTsKKyAgICAgICAgZnJlZShwQ1RYKTsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorCisgICAgbWFwcGVkX3NpemUgPSBpb2N0bChoTUZDT3BlbiwgSU9DVExfTUZDX0dFVF9NTUFQX1NJWkUsICZDb21tb25BcmcpOworICAgIGlmICgobWFwcGVkX3NpemUgPCAwKSB8fCAoQ29tbW9uQXJnLnJldF9jb2RlICE9IE1GQ19PSykpIHsKKyAgICAgICAgTE9HRSgiU3NiU2lwTWZjRGVjT3Blbl0gSU9DVExfTUZDX0dFVF9NTUFQX1NJWkUgZmFpbGVkIik7CisgICAgICAgIGZyZWUocENUWCk7CisgICAgICAgIGNsb3NlKGhNRkNPcGVuKTsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorCisgICAgbWFwcGVkX2FkZHIgPSAodW5zaWduZWQgaW50KW1tYXAoMCwgbWFwcGVkX3NpemUsIFBST1RfUkVBRCB8IFBST1RfV1JJVEUsIE1BUF9TSEFSRUQsIGhNRkNPcGVuLCAwKTsKKyAgICBpZiAoIW1hcHBlZF9hZGRyKSB7CisgICAgICAgIExPR0UoIlNzYlNpcE1mY0RlY09wZW5dIEZJTVY1LnggZHJpdmVyIGFkZHJlc3MgbWFwcGluZyBmYWlsZWQiKTsKKyAgICAgICAgZnJlZShwQ1RYKTsKKyAgICAgICAgY2xvc2UoaE1GQ09wZW4pOworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisKKyAgICBwQ1RYLT5tYWdpYyA9IF9NRkNMSUJfTUFHSUNfTlVNQkVSOworICAgIHBDVFgtPmhNRkMgPSBoTUZDT3BlbjsKKyAgICBwQ1RYLT5tYXBwZWRfYWRkciA9IG1hcHBlZF9hZGRyOworICAgIHBDVFgtPm1hcHBlZF9zaXplID0gbWFwcGVkX3NpemU7CisgICAgcENUWC0+aW50ZXJfYnVmZl9zdGF0dXMgPSBNRkNfVVNFX05PTkU7CisKKyAgICByZXR1cm4gKHZvaWQgKilwQ1RYOworfQorCit2b2lkICpTc2JTaXBNZmNEZWNPcGVuRXh0KHZvaWQgKnZhbHVlKQoreworICAgIGludCBoTUZDT3BlbjsKKyAgICB1bnNpZ25lZCBpbnQgbWFwcGVkX2FkZHI7CisgICAgX01GQ0xJQiAqcENUWCA9IE5VTEw7CisgICAgaW50IG1hcHBlZF9zaXplOworICAgIGludCBlcnI7CisgICAgc3RydWN0IG1mY19jb21tb25fYXJncyBDb21tb25Bcmc7CisKKyAgICBMT0dJKCJbJXNdIE1GQyBMaWJyYXJ5IFZlciAlZC4lMDJkXG4iLF9fZnVuY19fLCBNRkNfTElCX1ZFUl9NQUpPUiwgTUZDX0xJQl9WRVJfTUlOT1IpOworCisgICAgcENUWCA9IChfTUZDTElCICopbWFsbG9jKHNpemVvZihfTUZDTElCKSk7CisgICAgaWYgKHBDVFggPT0gTlVMTCkgeworICAgICAgICBMT0dFKCJTc2JTaXBNZmNEZWNPcGVuRXh0XSBtYWxsb2MgZmFpbGVkLlxuIik7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KKyAgICBtZW1zZXQocENUWCwgMCwgc2l6ZW9mKF9NRkNMSUIpKTsKKworICAgIGlmIChhY2Nlc3MobWZjX2Rldl9uYW1lLCBGX09LKSAhPSAwKSB7CisgICAgICAgIExPR0UoIlNzYlNpcE1mY0RlY09wZW5dIE1GQyBkZXZpY2Ugbm9kZSBub3QgZXhpc3RzIik7CisgICAgICAgIGZyZWUocENUWCk7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KKworICAgIGhNRkNPcGVuID0gb3BlbihtZmNfZGV2X25hbWUsIE9fUkRXUiB8IE9fTkRFTEFZKTsKKyAgICBpZiAoaE1GQ09wZW4gPCAwKSB7CisgICAgICAgIExPR0UoIlNzYlNpcE1mY0RlY09wZW5FeHRdIE1GQyBPcGVuIGZhaWx1cmUiKTsKKyAgICAgICAgZnJlZShwQ1RYKTsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorCisgICAgQ29tbW9uQXJnLmFyZ3MubWVtX2FsbG9jLmJ1Zl9jYWNoZV90eXBlID0gKihTU0JJUF9NRkNfQlVGRkVSX1RZUEUgKil2YWx1ZTsKKworICAgIGVyciA9IGlvY3RsKGhNRkNPcGVuLCBJT0NUTF9NRkNfU0VUX0JVRl9DQUNIRSwgJkNvbW1vbkFyZyk7CisgICAgaWYgKChlcnIgPCAwKSB8fCAoQ29tbW9uQXJnLnJldF9jb2RlICE9IE1GQ19PSykpIHsKKyAgICAgICAgTE9HRSgiU3NiU2lwTWZjRGVjT3BlbkV4dF0gSU9DVExfTUZDX1NFVF9CVUZfQ0FDSEUgZmFpbGVkIik7CisgICAgICAgIGZyZWUocENUWCk7CisgICAgICAgIGNsb3NlKGhNRkNPcGVuKTsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorCisgICAgbWFwcGVkX3NpemUgPSBpb2N0bChoTUZDT3BlbiwgSU9DVExfTUZDX0dFVF9NTUFQX1NJWkUsICZDb21tb25BcmcpOworICAgIGlmICgobWFwcGVkX3NpemUgPCAwKSB8fCAoQ29tbW9uQXJnLnJldF9jb2RlICE9IE1GQ19PSykpIHsKKyAgICAgICAgTE9HRSgiU3NiU2lwTWZjRGVjT3BlbkV4dF0gSU9DVExfTUZDX0dFVF9NTUFQX1NJWkUgZmFpbGVkIik7CisgICAgICAgIGZyZWUocENUWCk7CisgICAgICAgIGNsb3NlKGhNRkNPcGVuKTsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorCisgICAgbWFwcGVkX2FkZHIgPSAodW5zaWduZWQgaW50KW1tYXAoMCwgbWFwcGVkX3NpemUsIFBST1RfUkVBRCB8IFBST1RfV1JJVEUsIE1BUF9TSEFSRUQsIGhNRkNPcGVuLCAwKTsKKyAgICBpZiAoIW1hcHBlZF9hZGRyKSB7CisgICAgICAgIExPR0UoIlNzYlNpcE1mY0RlY09wZW5FeHRdIEZJTVY1LnggZHJpdmVyIGFkZHJlc3MgbWFwcGluZyBmYWlsZWQiKTsKKyAgICAgICAgZnJlZShwQ1RYKTsKKyAgICAgICAgY2xvc2UoaE1GQ09wZW4pOworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisKKyAgICBwQ1RYLT5tYWdpYyA9IF9NRkNMSUJfTUFHSUNfTlVNQkVSOworICAgIHBDVFgtPmhNRkMgPSBoTUZDT3BlbjsKKyAgICBwQ1RYLT5tYXBwZWRfYWRkciA9IG1hcHBlZF9hZGRyOworICAgIHBDVFgtPm1hcHBlZF9zaXplID0gbWFwcGVkX3NpemU7CisgICAgcENUWC0+aW50ZXJfYnVmZl9zdGF0dXMgPSBNRkNfVVNFX05PTkU7CisKKyAgICByZXR1cm4gKHZvaWQgKilwQ1RYOworfQorCitTU0JTSVBfTUZDX0VSUk9SX0NPREUgU3NiU2lwTWZjRGVjSW5pdCAodm9pZCAqb3BlbkhhbmRsZSwgU1NCU0lQX01GQ19DT0RFQ19UWVBFIGNvZGVjX3R5cGUsIGludCBGcmFtZWxlbmcpCit7CisgICAgaW50IHI7CisgICAgaW50IHBhY2tlZFBCID0gMDsKKyAgICBzdHJ1Y3QgbWZjX2NvbW1vbl9hcmdzIERlY0FyZzsKKyAgICBfTUZDTElCICpwQ1RYOworCisgICAgaWYgKG9wZW5IYW5kbGUgPT0gTlVMTCkgeworICAgICAgICBMT0dFKCJTc2JTaXBNZmNEZWNJbml0XSBvcGVuSGFuZGxlIGlzIE5VTEwiKTsKKyAgICAgICAgcmV0dXJuIE1GQ19SRVRfSU5WQUxJRF9QQVJBTTsKKyAgICB9CisKKyAgICBwQ1RYID0gKF9NRkNMSUIgKilvcGVuSGFuZGxlOworICAgIG1lbXNldCgmRGVjQXJnLCAweDAwLCBzaXplb2YoRGVjQXJnKSk7CisKKyAgICBpZiAoKGNvZGVjX3R5cGUgIT0gTVBFRzRfREVDKSAgJiYKKyAgICAgICAgKGNvZGVjX3R5cGUgIT0gSDI2NF9ERUMpICAgJiYKKyAgICAgICAgKGNvZGVjX3R5cGUgIT0gSDI2M19ERUMpICAgJiYKKyAgICAgICAgKGNvZGVjX3R5cGUgIT0gTVBFRzFfREVDKSAgJiYKKyAgICAgICAgKGNvZGVjX3R5cGUgIT0gTVBFRzJfREVDKSAgJiYKKyAgICAgICAgKGNvZGVjX3R5cGUgIT0gRklNVjFfREVDKSAgJiYKKyAgICAgICAgKGNvZGVjX3R5cGUgIT0gRklNVjJfREVDKSAgJiYKKyAgICAgICAgKGNvZGVjX3R5cGUgIT0gRklNVjNfREVDKSAgJiYKKyAgICAgICAgKGNvZGVjX3R5cGUgIT0gRklNVjRfREVDKSAgJiYKKyAgICAgICAgKGNvZGVjX3R5cGUgIT0gWFZJRF9ERUMpICAgJiYKKyAgICAgICAgKGNvZGVjX3R5cGUgIT0gVkMxUkNWX0RFQykgJiYKKyAgICAgICAgKGNvZGVjX3R5cGUgIT0gVkMxX0RFQykpIHsKKyAgICAgICAgTE9HRSgiU3NiU2lwTWZjRGVjSW5pdF0gVW5kZWZpbmVkIGNvZGVjIHR5cGUiKTsKKyAgICAgICAgcmV0dXJuIE1GQ19SRVRfSU5WQUxJRF9QQVJBTTsKKyAgICB9CisgICAgcENUWC0+Y29kZWNUeXBlID0gY29kZWNfdHlwZTsKKworICAgIGlmICgocENUWC0+Y29kZWNUeXBlID09IE1QRUc0X0RFQykgfHwKKyAgICAgICAgKHBDVFgtPmNvZGVjVHlwZSA9PSBYVklEX0RFQykgIHx8CisgICAgICAgIChwQ1RYLT5jb2RlY1R5cGUgPT0gRklNVjFfREVDKSB8fAorICAgICAgICAocENUWC0+Y29kZWNUeXBlID09IEZJTVYyX0RFQykgfHwKKyAgICAgICAgKHBDVFgtPmNvZGVjVHlwZSA9PSBGSU1WM19ERUMpIHx8CisgICAgICAgIChwQ1RYLT5jb2RlY1R5cGUgPT0gRklNVjRfREVDKSkKKyAgICAgICAgcGFja2VkUEIgPSBpc1BCUGFja2VkKHBDVFgsIEZyYW1lbGVuZyk7CisKKyAgICAvKiBpbml0IGFyZ3MgKi8KKyAgICBEZWNBcmcuYXJncy5kZWNfaW5pdC5pbl9jb2RlY190eXBlID0gcENUWC0+Y29kZWNUeXBlOworICAgIERlY0FyZy5hcmdzLmRlY19pbml0LmluX3N0cm1fc2l6ZSA9IEZyYW1lbGVuZzsKKyAgICBEZWNBcmcuYXJncy5kZWNfaW5pdC5pbl9zdHJtX2J1ZiA9IHBDVFgtPnBoeVN0cm1CdWY7CisKKyAgICBEZWNBcmcuYXJncy5kZWNfaW5pdC5pbl9udW1leHRyYWRwYiA9IHBDVFgtPmRlY19udW1leHRyYWRwYjsKKyAgICBEZWNBcmcuYXJncy5kZWNfaW5pdC5pbl9zbGljZT0gcENUWC0+ZGVjX3NsaWNlOworICAgIERlY0FyZy5hcmdzLmRlY19pbml0LmluX2NyYyA9IHBDVFgtPmRlY19jcmM7CisgICAgRGVjQXJnLmFyZ3MuZGVjX2luaXQuaW5fcGl4ZWxjYWNoZSA9IHBDVFgtPmRlY19waXhlbGNhY2hlOworCisgICAgRGVjQXJnLmFyZ3MuZGVjX2luaXQuaW5fcGFja2VkX1BCID0gcGFja2VkUEI7CisKKyAgICAvKiBtZW0gYWxsb2MgYXJncyAqLworICAgIERlY0FyZy5hcmdzLmRlY19pbml0LmluX21hcHBlZF9hZGRyID0gcENUWC0+bWFwcGVkX2FkZHI7CisKKyAgICAvKiBnZXQgcHlocyBhZGRyIGFyZ3MgKi8KKyAgICAvKiBubyBuZWVkcyAqLworCisgICAgLyogc2VxdWVuY2Ugc3RhcnQgYXJncyAqLworICAgIC8qIG5vIG5lZWRzICovCisKKyAgICByID0gaW9jdGwocENUWC0+aE1GQywgSU9DVExfTUZDX0RFQ19JTklULCAmRGVjQXJnKTsKKyAgICBpZiAoRGVjQXJnLnJldF9jb2RlICE9IE1GQ19PSykgeworICAgICAgICBMT0dFKCJTc2JTaXBNZmNEZWNJbml0XSBJT0NUTF9NRkNfREVDX0lOSVQgZmFpbGVkIik7CisgICAgICAgIHJldHVybiBNRkNfUkVUX0RFQ19JTklUX0ZBSUw7CisgICAgfQorCisgICAgcENUWC0+ZGVjT3V0SW5mby5pbWdfd2lkdGggPSBEZWNBcmcuYXJncy5kZWNfaW5pdC5vdXRfZnJtX3dpZHRoOworICAgIHBDVFgtPmRlY091dEluZm8uaW1nX2hlaWdodCA9IERlY0FyZy5hcmdzLmRlY19pbml0Lm91dF9mcm1faGVpZ2h0OworICAgIHBDVFgtPmRlY091dEluZm8uYnVmX3dpZHRoID0gRGVjQXJnLmFyZ3MuZGVjX2luaXQub3V0X2J1Zl93aWR0aDsKKyAgICBwQ1RYLT5kZWNPdXRJbmZvLmJ1Zl9oZWlnaHQgPSBEZWNBcmcuYXJncy5kZWNfaW5pdC5vdXRfYnVmX2hlaWdodDsKKworICAgIHBDVFgtPmRlY091dEluZm8uY3JvcF90b3Bfb2Zmc2V0ID0gRGVjQXJnLmFyZ3MuZGVjX2luaXQub3V0X2Nyb3BfdG9wX29mZnNldDsKKyAgICBwQ1RYLT5kZWNPdXRJbmZvLmNyb3BfYm90dG9tX29mZnNldCA9IERlY0FyZy5hcmdzLmRlY19pbml0Lm91dF9jcm9wX2JvdHRvbV9vZmZzZXQ7CisgICAgcENUWC0+ZGVjT3V0SW5mby5jcm9wX2xlZnRfb2Zmc2V0ID0gRGVjQXJnLmFyZ3MuZGVjX2luaXQub3V0X2Nyb3BfbGVmdF9vZmZzZXQ7CisgICAgcENUWC0+ZGVjT3V0SW5mby5jcm9wX3JpZ2h0X29mZnNldCA9IERlY0FyZy5hcmdzLmRlY19pbml0Lm91dF9jcm9wX3JpZ2h0X29mZnNldDsKKworICAgIC8qCisgICAgcENUWC0+dmlyRnJtQnVmLmx1bWEgPSBEZWNBcmcuYXJncy5kZWNfaW5pdC5vdXRfdV9hZGRyLmx1bWE7CisgICAgcENUWC0+dmlyRnJtQnVmLmNocm9tYSA9IERlY0FyZy5hcmdzLmRlY19pbml0Lm91dF91X2FkZHIuY2hyb21hOworCisgICAgcENUWC0+cGh5RnJtQnVmLmx1bWEgPSBEZWNBcmcuYXJncy5kZWNfaW5pdC5vdXRfcF9hZGRyLmx1bWE7CisgICAgcENUWC0+cGh5RnJtQnVmLmNocm9tYSA9IERlY0FyZy5hcmdzLmRlY19pbml0Lm91dF9wX2FkZHIuY2hyb21hOworICAgIHBDVFgtPnNpemVGcm1CdWYubHVtYSA9IERlY0FyZy5hcmdzLmRlY19pbml0Lm91dF9mcmFtZV9idWZfc2l6ZS5sdW1hOworICAgIHBDVFgtPnNpemVGcm1CdWYuY2hyb21hID0gRGVjQXJnLmFyZ3MuZGVjX2luaXQub3V0X2ZyYW1lX2J1Zl9zaXplLmNocm9tYTsKKyAgICAqLworCisgICAgcENUWC0+aW50ZXJfYnVmZl9zdGF0dXMgfD0gTUZDX1VTRV9ZVVZfQlVGRjsKKworICAgIHJldHVybiBNRkNfUkVUX09LOworfQorCitTU0JTSVBfTUZDX0VSUk9SX0NPREUgU3NiU2lwTWZjRGVjRXhlKHZvaWQgKm9wZW5IYW5kbGUsIGludCBsZW5ndGhCdWZGaWxsKQoreworICAgIGludCByZXQ7CisgICAgaW50IFlvZmZzZXQ7CisgICAgaW50IENvZmZzZXQ7CisgICAgX01GQ0xJQiAqcENUWDsKKyAgICBzdHJ1Y3QgbWZjX2NvbW1vbl9hcmdzIERlY0FyZzsKKworI2lmZGVmIENPTkZJR19NRkNfRlBTCisgICAgbG9uZyBpbnQgZGlmZlRpbWUsIGF2Z1RpbWU7CisjZW5kaWYKKyAgICBpZiAob3BlbkhhbmRsZSA9PSBOVUxMKSB7CisgICAgICAgIExPR0UoIlNzYlNpcE1mY0RlY0V4ZV0gb3BlbkhhbmRsZSBpcyBOVUxMXG4iKTsKKyAgICAgICAgcmV0dXJuIE1GQ19SRVRfSU5WQUxJRF9QQVJBTTsKKyAgICB9CisKKyAgICBpZiAoKGxlbmd0aEJ1ZkZpbGwgPCAwKSB8fCAobGVuZ3RoQnVmRmlsbCA+IE1BWF9ERUNPREVSX0lOUFVUX0JVRkZFUl9TSVpFKSkgeworICAgICAgICBMT0dFKCJTc2JTaXBNZmNEZWNFeGVdIGxlbmd0aEJ1ZkZpbGwgaXMgaW52YWxpZC4gKGxlbmd0aEJ1ZkZpbGw9JWQpIiwgbGVuZ3RoQnVmRmlsbCk7CisgICAgICAgIHJldHVybiBNRkNfUkVUX0lOVkFMSURfUEFSQU07CisgICAgfQorCisgICAgcENUWCAgPSAoX01GQ0xJQiAqKSBvcGVuSGFuZGxlOworICAgIG1lbXNldCgmRGVjQXJnLCAweDAwLCBzaXplb2YoRGVjQXJnKSk7CisKKyAgICBEZWNBcmcuYXJncy5kZWNfZXhlLmluX2NvZGVjX3R5cGUgPSBwQ1RYLT5jb2RlY1R5cGU7CisgICAgRGVjQXJnLmFyZ3MuZGVjX2V4ZS5pbl9zdHJtX2J1ZiA9IHBDVFgtPnBoeVN0cm1CdWY7CisgICAgRGVjQXJnLmFyZ3MuZGVjX2V4ZS5pbl9zdHJtX3NpemUgPSBsZW5ndGhCdWZGaWxsOworICAgIERlY0FyZy5hcmdzLmRlY19leGUuaW5fZnJtX2J1Zi5sdW1hID0gcENUWC0+cGh5RnJtQnVmLmx1bWE7CisgICAgRGVjQXJnLmFyZ3MuZGVjX2V4ZS5pbl9mcm1fYnVmLmNocm9tYSA9IHBDVFgtPnBoeUZybUJ1Zi5jaHJvbWE7CisgICAgRGVjQXJnLmFyZ3MuZGVjX2V4ZS5pbl9mcm1fc2l6ZS5sdW1hID0gcENUWC0+c2l6ZUZybUJ1Zi5sdW1hOworICAgIERlY0FyZy5hcmdzLmRlY19leGUuaW5fZnJtX3NpemUuY2hyb21hID0gcENUWC0+c2l6ZUZybUJ1Zi5jaHJvbWE7CisgICAgRGVjQXJnLmFyZ3MuZGVjX2V4ZS5pbl9mcmFtZXRhZyA9IHBDVFgtPmluZnJhbWV0YWc7CisgICAgRGVjQXJnLmFyZ3MuZGVjX2V4ZS5pbl9pbW1lZGlhdGVseV9kaXNwID0gcENUWC0+aW1tZWRpYXRlbHlkaXNwOworCisjaWZkZWYgQ09ORklHX01GQ19GUFMKKyAgICBnZXR0aW1lb2ZkYXkoJm1EZWMxLCBOVUxMKTsKKworI2lmZGVmIENPTkZJR19NRkNfUEVSRl9MT0cKKyAgICBpZiAoZnJhbWVjb3VudCAhPSAwKSB7CisgICAgICAgIGlmIChtRGVjMi50dl9zZWMgPT0gbURlYzEudHZfc2VjKQorICAgICAgICAgICAgTE9HSSgiU3NiU2lwTWZjRGVjRXhlXSBJbnRlcnZhbCBiZXR3ZWVuIElPQ1RMX01GQ19ERUNfRVhFJ3MgKGVuZCB0byBzdGFydCkgPSAlOGQiLCAobURlYzEudHZfdXNlYyAtIG1EZWMyLnR2X3VzZWMpKTsKKyAgICAgICAgZWxzZQorICAgICAgICAgICAgTE9HSSgiU3NiU2lwTWZjRGVjRXhlXSBJbnRlcnZhbCBiZXR3ZWVuIElPQ1RMX01GQ19ERUNfRVhFJ3MgKGVuZCB0byBzdGFydCkgPSAlOGQiLCAoMTAwMDAwMCArIChtRGVjMS50dl91c2VjIC0gbURlYzIudHZfdXNlYykpKTsKKyAgICB9CisjZW5kaWYKKyNlbmRpZgorCisgICAgcmV0ID0gaW9jdGwocENUWC0+aE1GQywgSU9DVExfTUZDX0RFQ19FWEUsICZEZWNBcmcpOworCisgICAgaWYgKERlY0FyZy5yZXRfY29kZSAhPSBNRkNfT0spIHsKKyAgICAgICAgTE9HRSgiU3NiU2lwTWZjRGVjRXhlXSBJT0NUTF9NRkNfREVDX0VYRSBmYWlsZWQocmV0IDogJWQpIiwgRGVjQXJnLnJldF9jb2RlKTsKKyAgICAgICAgcmV0dXJuIE1GQ19SRVRfREVDX0VYRV9FUlI7CisgICAgfQorCisjaWZkZWYgQ09ORklHX01GQ19GUFMKKyAgICBnZXR0aW1lb2ZkYXkoJm1EZWMyLCBOVUxMKTsKKyAgICBmcmFtZWNvdW50Kys7CisKKyAgICBpZiAobURlYzEudHZfc2VjID09IG1EZWMyLnR2X3NlYykgeworICAgICAgICBpZiAobURlYzIudHZfdXNlYyAtIG1EZWMxLnR2X3VzZWMgPiAzMDAwMCkKKyAgICAgICAgICAgIG92ZXIzMG1zKys7CisjaWZkZWYgQ09ORklHX01GQ19QRVJGX0xPRworICAgICAgICBMT0dJKCJTc2JTaXBNZmNEZWNFeGVdIFRpbWUgY29uc3VtZWQgZm9yIElPQ1RMX01GQ19ERUNfRVhFID0gJThkIiwgKChtRGVjMi50dl91c2VjIC0gbURlYzEudHZfdXNlYykpKTsKKyNlbmRpZgorICAgIH0gZWxzZSB7CisgICAgICAgIGlmICgxMDAwMDAwICsgbURlYzIudHZfdXNlYyAtIG1EZWMxLnR2X3VzZWMgPiAzMDAwMCkKKyAgICAgICAgICAgIG92ZXIzMG1zKys7CisjaWZkZWYgQ09ORklHX01GQ19QRVJGX0xPRworICAgICAgICBMT0dJKCJTc2JTaXBNZmNEZWNFeGVdIFRpbWUgY29uc3VtZWQgZm9yIElPQ1RMX01GQ19ERUNfRVhFID0gJThkIiwgKDEwMDAwMDAgKyAobURlYzIudHZfdXNlYyAtIG1EZWMxLnR2X3VzZWMpKSk7CisjZW5kaWYKKyAgICB9CisKKyAgICBkaWZmVGltZSA9ICgobURlYzIudHZfc2VjICogMTAwMDAwMCkgKyBtRGVjMi50dl91c2VjKSAtICgobURlYzEudHZfc2VjICogMTAwMDAwMCkgKyBtRGVjMS50dl91c2VjKTsKKyAgICBhdmdUaW1lID0gKG1BdmcudHZfc2VjICogMTAwMDAwMCkgKyBtQXZnLnR2X3VzZWM7CisgICAgYXZnVGltZSA9ICgoZnJhbWVjb3VudCAtIDEpICogYXZnVGltZSArIGRpZmZUaW1lKSAvIGZyYW1lY291bnQ7CisKKyAgICBtQXZnLnR2X3NlYyA9IGF2Z1RpbWUgLyAxMDAwMDAwOworICAgIG1BdmcudHZfdXNlYyA9IGF2Z1RpbWUgJSAxMDAwMDAwOworI2VuZGlmCisKKyAgICAvKiBGSVhNRTogZHluYW1pYyByZXNvbHV0aW9uIGNoYW5nZSAqLworICAgIGlmIChEZWNBcmcuYXJncy5kZWNfZXhlLm91dF9kaXNwbGF5X3N0YXR1cyA9PSA0KSB7CisgICAgICAgIExPR0koIlNzYlNpcE1mY0RlY0V4ZV0gUmVzb2x1dGlvbiBpcyBjaGFnbmVkIik7CisgICAgICAgIC8qCisgICAgICAgIHBDVFgtPnZpckZybUJ1Zi5jaHJvbWEgPSBEZWNBcmcuYXJncy5kZWNfZXhlLm91dF91X2FkZHIuY2hyb21hOworICAgICAgICBwQ1RYLT52aXJGcm1CdWYubHVtYSA9IERlY0FyZy5hcmdzLmRlY19leGUub3V0X3VfYWRkci5sdW1hOworICAgICAgICBwQ1RYLT5waHlGcm1CdWYuY2hyb21hID0gRGVjQXJnLmFyZ3MuZGVjX2V4ZS5vdXRfcF9hZGRyLmNocm9tYTsKKyAgICAgICAgcENUWC0+cGh5RnJtQnVmLmx1bWEgPSBEZWNBcmcuYXJncy5kZWNfZXhlLm91dF9wX2FkZHIubHVtYTsKKyAgICAgICAgcENUWC0+c2l6ZUZybUJ1Zi5jaHJvbWEgPSBEZWNBcmcuYXJncy5kZWNfZXhlLm91dF9mcmFtZV9idWZfc2l6ZS5jaHJvbWE7CisgICAgICAgIHBDVFgtPnNpemVGcm1CdWYubHVtYSA9IERlY0FyZy5hcmdzLmRlY19leGUub3V0X2ZyYW1lX2J1Zl9zaXplLmx1bWE7CisgICAgICAgICovCisgICAgICAgIHBDVFgtPmRlY091dEluZm8uaW1nX3dpZHRoID0gIERlY0FyZy5hcmdzLmRlY19leGUub3V0X2ltZ193aWR0aDsKKyAgICAgICAgcENUWC0+ZGVjT3V0SW5mby5pbWdfaGVpZ2h0ID0gRGVjQXJnLmFyZ3MuZGVjX2V4ZS5vdXRfaW1nX2hlaWdodDsKKyAgICAgICAgcENUWC0+ZGVjT3V0SW5mby5idWZfd2lkdGggPSBEZWNBcmcuYXJncy5kZWNfZXhlLm91dF9idWZfd2lkdGg7CisgICAgICAgIHBDVFgtPmRlY091dEluZm8uYnVmX2hlaWdodCA9IERlY0FyZy5hcmdzLmRlY19leGUub3V0X2J1Zl9oZWlnaHQ7CisgICAgfQorCisgICAgWW9mZnNldCA9IERlY0FyZy5hcmdzLmRlY19leGUub3V0X2Rpc3BsYXlfWV9hZGRyIC0gRGVjQXJnLmFyZ3MuZGVjX2V4ZS5pbl9mcm1fYnVmLmx1bWE7CisgICAgQ29mZnNldCA9IERlY0FyZy5hcmdzLmRlY19leGUub3V0X2Rpc3BsYXlfQ19hZGRyIC0gRGVjQXJnLmFyZ3MuZGVjX2V4ZS5pbl9mcm1fYnVmLmNocm9tYTsKKworICAgIHBDVFgtPmRlY091dEluZm8uWVBoeUFkZHIgPSAodm9pZCopKERlY0FyZy5hcmdzLmRlY19leGUub3V0X2Rpc3BsYXlfWV9hZGRyKTsKKyAgICBwQ1RYLT5kZWNPdXRJbmZvLkNQaHlBZGRyID0gKHZvaWQqKShEZWNBcmcuYXJncy5kZWNfZXhlLm91dF9kaXNwbGF5X0NfYWRkcik7CisKKyAgICBwQ1RYLT5kZWNPdXRJbmZvLllWaXJBZGRyID0gKHZvaWQqKShwQ1RYLT52aXJGcm1CdWYubHVtYSArIFlvZmZzZXQpOworICAgIHBDVFgtPmRlY091dEluZm8uQ1ZpckFkZHIgPSAodm9pZCopKHBDVFgtPnZpckZybUJ1Zi5jaHJvbWEgKyBDb2Zmc2V0KTsKKworICAgIC8qIGZvciBuZXcgZHJpdmVyICovCisgICAgcENUWC0+ZGVjT3V0SW5mby5ZVmlyQWRkciA9ICh2b2lkKikocENUWC0+bWFwcGVkX2FkZHIgKyBEZWNBcmcuYXJncy5kZWNfZXhlLm91dF95X29mZnNldCk7CisgICAgcENUWC0+ZGVjT3V0SW5mby5DVmlyQWRkciA9ICh2b2lkKikocENUWC0+bWFwcGVkX2FkZHIgKyBEZWNBcmcuYXJncy5kZWNfZXhlLm91dF9jX29mZnNldCk7CisKKyAgICBwQ1RYLT5kaXNwbGF5U3RhdHVzID0gRGVjQXJnLmFyZ3MuZGVjX2V4ZS5vdXRfZGlzcGxheV9zdGF0dXM7CisKKyAgICBwQ1RYLT5kZWNPdXRJbmZvLmRpc3BfcGljX2ZyYW1lX3R5cGUgPSBEZWNBcmcuYXJncy5kZWNfZXhlLm91dF9kaXNwX3BpY19mcmFtZV90eXBlOworCisgICAgLyogY2xlYXIgaW1tZWRpYXRlbHkgZGlzcGxheSBmbGFnICovCisgICAgcENUWC0+aW1tZWRpYXRlbHlkaXNwID0gMDsKKyAgICBwQ1RYLT5vdXRmcmFtZXRhZ3RvcCA9IERlY0FyZy5hcmdzLmRlY19leGUub3V0X2ZyYW1ldGFnX3RvcDsKKyAgICBwQ1RYLT5vdXRmcmFtZXRhZ2JvdHRvbSA9IERlY0FyZy5hcmdzLmRlY19leGUub3V0X2ZyYW1ldGFnX2JvdHRvbTsKKyAgICBwQ1RYLT5kZWNPdXRJbmZvLnRpbWVzdGFtcF90b3AgPSBEZWNBcmcuYXJncy5kZWNfZXhlLm91dF9waWNfdGltZV90b3A7CisgICAgcENUWC0+ZGVjT3V0SW5mby50aW1lc3RhbXBfYm90dG9tID0gRGVjQXJnLmFyZ3MuZGVjX2V4ZS5vdXRfcGljX3RpbWVfYm90dG9tOworICAgIHBDVFgtPmRlY091dEluZm8uY29uc3VtZWRCeXRlID0gIERlY0FyZy5hcmdzLmRlY19leGUub3V0X2NvbnN1bWVkX2J5dGU7CisKKyAgICBwQ1RYLT5kZWNPdXRJbmZvLmNyb3BfcmlnaHRfb2Zmc2V0ID0gIERlY0FyZy5hcmdzLmRlY19leGUub3V0X2Nyb3BfcmlnaHRfb2Zmc2V0OworICAgIHBDVFgtPmRlY091dEluZm8uY3JvcF9sZWZ0X29mZnNldCA9ICBEZWNBcmcuYXJncy5kZWNfZXhlLm91dF9jcm9wX2xlZnRfb2Zmc2V0OworICAgIHBDVFgtPmRlY091dEluZm8uY3JvcF9ib3R0b21fb2Zmc2V0ID0gIERlY0FyZy5hcmdzLmRlY19leGUub3V0X2Nyb3BfYm90dG9tX29mZnNldDsKKyAgICBwQ1RYLT5kZWNPdXRJbmZvLmNyb3BfdG9wX29mZnNldCA9ICBEZWNBcmcuYXJncy5kZWNfZXhlLm91dF9jcm9wX3RvcF9vZmZzZXQ7CisKKyAgICByZXR1cm4gTUZDX1JFVF9PSzsKK30KKworU1NCU0lQX01GQ19FUlJPUl9DT0RFIFNzYlNpcE1mY0RlY0Nsb3NlKHZvaWQgKm9wZW5IYW5kbGUpCit7CisgICAgaW50IHJldDsKKyAgICBfTUZDTElCICAqcENUWDsKKyAgICBzdHJ1Y3QgbWZjX2NvbW1vbl9hcmdzIGZyZWVfYXJnOworCisjaWZkZWYgQ09ORklHX01GQ19GUFMKKyAgICBMT0dJKCI+Pj4gU3RhdGlzdGljcyBpbiBNRkMgQVBJOiIpOworICAgIExPR0koIj4+PiBUb3RhbCBudW1iZXIgb2YgSU9DVExfTUZDX0RFQ19FWEUgPSAlZCIsIGZyYW1lY291bnQpOworICAgIExPR0koIj4+PiBOdW1iZXIgb2YgSU9DVExfTUZDX0RFQ19FWEUgdGFraW5nIG1vcmUgdGhhbiAzMG1zID0gJWQiLCBvdmVyMzBtcyk7CisgICAgTE9HSSgiPj4+IEF2ZyBJT0NUTF9NRkNfREVDX0VYRSB0aW1lID0gJWRzZWMgJS4yZm1zZWMiLCAoaW50KW1BdmcudHZfc2VjLCAoZmxvYXQpKG1BdmcudHZfdXNlYyAvIDEwMDAuMCkpOworI2VuZGlmCisKKyAgICBpZiAob3BlbkhhbmRsZSA9PSBOVUxMKSB7CisgICAgICAgIExPR0UoIlNzYlNpcE1mY0RlY0Nsb3NlXSBvcGVuSGFuZGxlIGlzIE5VTEwiKTsKKyAgICAgICAgcmV0dXJuIE1GQ19SRVRfSU5WQUxJRF9QQVJBTTsKKyAgICB9CisKKyAgICBwQ1RYICA9IChfTUZDTElCICopIG9wZW5IYW5kbGU7CisKKyAgICAvKiBGSVhNRTogZnJlZSBidWZmZXI/ICovCisjaWYgMAorICAgIGlmIChwQ1RYLT5pbnRlcl9idWZmX3N0YXR1cyAmIE1GQ19VU0VfWVVWX0JVRkYpIHsKKyAgICAgICAgZnJlZV9hcmcuYXJncy5tZW1fZnJlZS5rZXkgPSBwQ1RYLT52aXJGcm1CdWYubHVtYTsKKyAgICAgICAgcmV0ID0gaW9jdGwocENUWC0+aE1GQywgSU9DVExfTUZDX0ZSRUVfQlVGLCAmZnJlZV9hcmcpOworICAgICAgICBmcmVlX2FyZy5hcmdzLm1lbV9mcmVlLmtleSA9IHBDVFgtPnZpckZybUJ1Zi5jaHJvbWE7CisgICAgICAgIHJldCA9IGlvY3RsKHBDVFgtPmhNRkMsIElPQ1RMX01GQ19GUkVFX0JVRiwgJmZyZWVfYXJnKTsKKyAgICB9CisjZW5kaWYKKworICAgIGlmIChwQ1RYLT5pbnRlcl9idWZmX3N0YXR1cyAmIE1GQ19VU0VfU1RSTV9CVUZGKSB7CisgICAgICAgIGZyZWVfYXJnLmFyZ3MubWVtX2ZyZWUua2V5ID0gcENUWC0+dmlyU3RybUJ1ZjsKKyAgICAgICAgcmV0ID0gaW9jdGwocENUWC0+aE1GQywgSU9DVExfTUZDX0ZSRUVfQlVGLCAmZnJlZV9hcmcpOworICAgIH0KKworICAgIHBDVFgtPmludGVyX2J1ZmZfc3RhdHVzID0gTUZDX1VTRV9OT05FOworCisgICAgbXVubWFwKCh2b2lkICopcENUWC0+bWFwcGVkX2FkZHIsIHBDVFgtPm1hcHBlZF9zaXplKTsKKyAgICBjbG9zZShwQ1RYLT5oTUZDKTsKKyAgICBmcmVlKHBDVFgpOworCisgICAgcmV0dXJuIE1GQ19SRVRfT0s7Cit9CisKKwordm9pZCAgKlNzYlNpcE1mY0RlY0dldEluQnVmKHZvaWQgKm9wZW5IYW5kbGUsIHZvaWQgKipwaHlJbkJ1ZiwgaW50IGlucHV0QnVmZmVyU2l6ZSkKK3sKKyAgICBpbnQgcmV0X2NvZGU7CisgICAgX01GQ0xJQiAqcENUWDsKKyAgICBzdHJ1Y3QgbWZjX2NvbW1vbl9hcmdzIHVzZXJfYWRkcl9hcmcsIHBoeXNfYWRkcl9hcmc7CisKKyAgICBpZiAoaW5wdXRCdWZmZXJTaXplIDwgMCkgeworICAgICAgICBMT0dFKCJTc2JTaXBNZmNEZWNHZXRJbkJ1Zl0gaW5wdXRCdWZmZXJTaXplID0gJWQgaXMgaW52YWxpZCIsIGlucHV0QnVmZmVyU2l6ZSk7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KKworICAgIGlmIChvcGVuSGFuZGxlID09IE5VTEwpIHsKKyAgICAgICAgTE9HRSgiU3NiU2lwTWZjRGVjR2V0SW5CdWZdIG9wZW5IYW5kbGUgaXMgTlVMTFxuIik7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KKworICAgIHBDVFggID0gKF9NRkNMSUIgKikgb3BlbkhhbmRsZTsKKworICAgIC8qdXNlcl9hZGRyX2FyZy5hcmdzLm1lbV9hbGxvYy5jb2RlY190eXBlID0gcENUWC0+Y29kZWNfdHlwZTsgKi8KKyAgICB1c2VyX2FkZHJfYXJnLmFyZ3MubWVtX2FsbG9jLnR5cGUgPSBERUNPREVSOworICAgIHVzZXJfYWRkcl9hcmcuYXJncy5tZW1fYWxsb2MuYnVmZl9zaXplID0gaW5wdXRCdWZmZXJTaXplOworICAgIHVzZXJfYWRkcl9hcmcuYXJncy5tZW1fYWxsb2MubWFwcGVkX2FkZHIgPSBwQ1RYLT5tYXBwZWRfYWRkcjsKKyAgICByZXRfY29kZSA9IGlvY3RsKHBDVFgtPmhNRkMsIElPQ1RMX01GQ19HRVRfSU5fQlVGLCAmdXNlcl9hZGRyX2FyZyk7CisgICAgaWYgKHJldF9jb2RlIDwgMCkgeworICAgICAgICBMT0dFKCJTc2JTaXBNZmNEZWNHZXRJbkJ1Zl0gSU9DVExfTUZDX0dFVF9JTl9CVUYgZmFpbGVkIik7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KKworICAgIHBoeXNfYWRkcl9hcmcuYXJncy5yZWFsX2FkZHIua2V5ID0gdXNlcl9hZGRyX2FyZy5hcmdzLm1lbV9hbGxvYy5vZmZzZXQ7CisgICAgcmV0X2NvZGUgPSBpb2N0bChwQ1RYLT5oTUZDLCBJT0NUTF9NRkNfR0VUX1JFQUxfQUREUiwgJnBoeXNfYWRkcl9hcmcpOworICAgIGlmIChyZXRfY29kZSA8IDApIHsKKyAgICAgICAgTE9HRSgiU3NiU2lwTWZjRGVjR2V0SW5CdWZdIElPQ1RMX01GQ19HRVRfUEhZU19BRERSIGZhaWxlZCIpOworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisKKyAgICAvKgorICAgIHBDVFgtPnZpclN0cm1CdWYgPSB1c2VyX2FkZHJfYXJnLmFyZ3MubWVtX2FsbG9jLm9mZnNldDsKKyAgICAqLworICAgIHBDVFgtPnZpclN0cm1CdWYgPSBwQ1RYLT5tYXBwZWRfYWRkciArIHVzZXJfYWRkcl9hcmcuYXJncy5tZW1fYWxsb2Mub2Zmc2V0OworICAgIHBDVFgtPnBoeVN0cm1CdWYgPSBwaHlzX2FkZHJfYXJnLmFyZ3MucmVhbF9hZGRyLmFkZHI7CisKKyAgICBwQ1RYLT5zaXplU3RybUJ1ZiA9IGlucHV0QnVmZmVyU2l6ZTsKKyAgICBwQ1RYLT5pbnRlcl9idWZmX3N0YXR1cyB8PSBNRkNfVVNFX1NUUk1fQlVGRjsKKworICAgICpwaHlJbkJ1ZiA9ICh2b2lkICopcENUWC0+cGh5U3RybUJ1ZjsKKworICAgIHJldHVybiAodm9pZCAqKXBDVFgtPnZpclN0cm1CdWY7Cit9CisKK1NTQlNJUF9NRkNfRVJST1JfQ09ERSBTc2JTaXBNZmNEZWNTZXRJbkJ1Zih2b2lkICpvcGVuSGFuZGxlLCB2b2lkICpwaHlJbkJ1Ziwgdm9pZCAqdmlySW5CdWYsIGludCBzaXplKQoreworICAgIF9NRkNMSUIgKnBDVFg7CisKKyAgICBpZiAob3BlbkhhbmRsZSA9PSBOVUxMKSB7CisgICAgICAgIExPR0UoIlNzYlNpcE1mY0RlY1NldEluQnVmXSBvcGVuSGFuZGxlIGlzIE5VTEwiKTsKKyAgICAgICAgcmV0dXJuIE1GQ19SRVRfSU5WQUxJRF9QQVJBTTsKKyAgICB9CisKKyAgICBwQ1RYICA9IChfTUZDTElCICopIG9wZW5IYW5kbGU7CisKKyAgICBwQ1RYLT5waHlTdHJtQnVmID0gKGludClwaHlJbkJ1ZjsKKyAgICBwQ1RYLT52aXJTdHJtQnVmID0gKGludCl2aXJJbkJ1ZjsKKyAgICBwQ1RYLT5zaXplU3RybUJ1ZiA9IHNpemU7CisgICAgcmV0dXJuIE1GQ19SRVRfT0s7Cit9CisKK1NTQlNJUF9NRkNfREVDX09VVEJVRl9TVEFUVVMgU3NiU2lwTWZjRGVjR2V0T3V0QnVmKHZvaWQgKm9wZW5IYW5kbGUsIFNTQlNJUF9NRkNfREVDX09VVFBVVF9JTkZPICpvdXRwdXRfaW5mbykKK3sKKyAgICBfTUZDTElCICpwQ1RYOworCisgICAgaWYgKG9wZW5IYW5kbGUgPT0gTlVMTCkgeworICAgICAgICBMT0dFKCJTc2JTaXBNZmNEZWNHZXRPdXRCdWZdIG9wZW5IYW5kbGUgaXMgTlVMTCIpOworICAgICAgICByZXR1cm4gTUZDX0dFVE9VVEJVRl9ESVNQTEFZX0VORDsKKyAgICB9CisKKyAgICBwQ1RYICA9IChfTUZDTElCICopIG9wZW5IYW5kbGU7CisKKyAgICBvdXRwdXRfaW5mby0+WVBoeUFkZHIgPSBwQ1RYLT5kZWNPdXRJbmZvLllQaHlBZGRyOworICAgIG91dHB1dF9pbmZvLT5DUGh5QWRkciA9IHBDVFgtPmRlY091dEluZm8uQ1BoeUFkZHI7CisKKyAgICBvdXRwdXRfaW5mby0+WVZpckFkZHIgPSBwQ1RYLT5kZWNPdXRJbmZvLllWaXJBZGRyOworICAgIG91dHB1dF9pbmZvLT5DVmlyQWRkciA9IHBDVFgtPmRlY091dEluZm8uQ1ZpckFkZHI7CisKKyAgICBvdXRwdXRfaW5mby0+aW1nX3dpZHRoID0gcENUWC0+ZGVjT3V0SW5mby5pbWdfd2lkdGg7CisgICAgb3V0cHV0X2luZm8tPmltZ19oZWlnaHQ9IHBDVFgtPmRlY091dEluZm8uaW1nX2hlaWdodDsKKworICAgIG91dHB1dF9pbmZvLT5idWZfd2lkdGggPSBwQ1RYLT5kZWNPdXRJbmZvLmJ1Zl93aWR0aDsKKyAgICBvdXRwdXRfaW5mby0+YnVmX2hlaWdodD0gcENUWC0+ZGVjT3V0SW5mby5idWZfaGVpZ2h0OworCisgICAgb3V0cHV0X2luZm8tPnRpbWVzdGFtcF90b3AgPSAgcENUWC0+ZGVjT3V0SW5mby50aW1lc3RhbXBfdG9wOworICAgIG91dHB1dF9pbmZvLT50aW1lc3RhbXBfYm90dG9tID0gIHBDVFgtPmRlY091dEluZm8udGltZXN0YW1wX2JvdHRvbTsKKyAgICBvdXRwdXRfaW5mby0+Y29uc3VtZWRCeXRlID0gIHBDVFgtPmRlY091dEluZm8uY29uc3VtZWRCeXRlOworCisgICAgb3V0cHV0X2luZm8tPmNyb3BfcmlnaHRfb2Zmc2V0ID0gIHBDVFgtPmRlY091dEluZm8uY3JvcF9yaWdodF9vZmZzZXQ7CisgICAgb3V0cHV0X2luZm8tPmNyb3BfbGVmdF9vZmZzZXQgPSAgcENUWC0+ZGVjT3V0SW5mby5jcm9wX2xlZnRfb2Zmc2V0OworICAgIG91dHB1dF9pbmZvLT5jcm9wX2JvdHRvbV9vZmZzZXQgPSAgcENUWC0+ZGVjT3V0SW5mby5jcm9wX2JvdHRvbV9vZmZzZXQ7CisgICAgb3V0cHV0X2luZm8tPmNyb3BfdG9wX29mZnNldCA9ICBwQ1RYLT5kZWNPdXRJbmZvLmNyb3BfdG9wX29mZnNldDsKKworICAgIG91dHB1dF9pbmZvLT5kaXNwX3BpY19mcmFtZV90eXBlID0gcENUWC0+ZGVjT3V0SW5mby5kaXNwX3BpY19mcmFtZV90eXBlOworCisgICAgaWYgKHBDVFgtPmRpc3BsYXlTdGF0dXMgPT0gMykKKyAgICAgICAgcmV0dXJuIE1GQ19HRVRPVVRCVUZfRElTUExBWV9FTkQ7CisgICAgZWxzZSBpZiAocENUWC0+ZGlzcGxheVN0YXR1cyA9PSAxKQorICAgICAgICByZXR1cm4gTUZDX0dFVE9VVEJVRl9ESVNQTEFZX0RFQ09ESU5HOworICAgIGVsc2UgaWYgKHBDVFgtPmRpc3BsYXlTdGF0dXMgPT0gMikKKyAgICAgICAgcmV0dXJuIE1GQ19HRVRPVVRCVUZfRElTUExBWV9PTkxZOworICAgIGVsc2UgaWYgKHBDVFgtPmRpc3BsYXlTdGF0dXMgPT0gMCkKKyAgICAgICAgcmV0dXJuIE1GQ19HRVRPVVRCVUZfREVDT0RJTkdfT05MWTsKKyAgICBlbHNlIGlmIChwQ1RYLT5kaXNwbGF5U3RhdHVzID09IDQpCisgICAgICAgIHJldHVybiBNRkNfR0VUT1VUQlVGX0NIQU5HRV9SRVNPTDsKKyAgICBlbHNlCisgICAgICAgIHJldHVybiBNRkNfR0VUT1VUQlVGX0RJU1BMQVlfRU5EOworfQorCitTU0JTSVBfTUZDX0VSUk9SX0NPREUgU3NiU2lwTWZjRGVjU2V0Q29uZmlnKHZvaWQgKm9wZW5IYW5kbGUsIFNTQlNJUF9NRkNfREVDX0NPTkYgY29uZl90eXBlLCB2b2lkICp2YWx1ZSkKK3sKKyAgICBpbnQgcmV0X2NvZGU7CisgICAgX01GQ0xJQiAqcENUWDsKKyAgICBzdHJ1Y3QgbWZjX2NvbW1vbl9hcmdzIERlY0FyZzsKKyAgICBzdHJ1Y3QgbWZjX2RlY19maW12MV9pbmZvICpmaW12MV9yZXM7CisKKyAgICBpZiAob3BlbkhhbmRsZSA9PSBOVUxMKSB7CisgICAgICAgIExPR0UoIlNzYlNpcE1mY0RlY1NldENvbmZpZ10gb3BlbkhhbmRsZSBpcyBOVUxMIik7CisgICAgICAgIHJldHVybiBNRkNfUkVUX0lOVkFMSURfUEFSQU07CisgICAgfQorCisgICAgaWYgKHZhbHVlID09IE5VTEwpIHsKKyAgICAgICAgTE9HRSgiU3NiU2lwTWZjRGVjU2V0Q29uZmlnXSB2YWx1ZSBpcyBOVUxMIik7CisgICAgICAgIHJldHVybiBNRkNfUkVUX0lOVkFMSURfUEFSQU07CisgICAgfQorCisgICAgcENUWCA9IChfTUZDTElCICopb3BlbkhhbmRsZTsKKyAgICBtZW1zZXQoJkRlY0FyZywgMHgwMCwgc2l6ZW9mKERlY0FyZykpOworI2lmZGVmIFMzRF9TVVBQT1JUCisgICAgRGVjQXJnLmFyZ3MuY29uZmlnLnR5cGUgPSBjb25mX3R5cGU7CisjZWxzZQorICAgIERlY0FyZy5hcmdzLnNldF9jb25maWcuaW5fY29uZmlnX3BhcmFtID0gY29uZl90eXBlOworI2VuZGlmCisgICAgc3dpdGNoIChjb25mX3R5cGUpIHsKKyAgICBjYXNlIE1GQ19ERUNfU0VUQ09ORl9FWFRSQV9CVUZGRVJfTlVNOgorICAgICAgICBwQ1RYLT5kZWNfbnVtZXh0cmFkcGIgPSAqKCh1bnNpZ25lZCBpbnQgKikgdmFsdWUpOworICAgICAgICByZXR1cm4gTUZDX1JFVF9PSzsKKworICAgIGNhc2UgTUZDX0RFQ19TRVRDT05GX1NMSUNFX0VOQUJMRToKKyAgICAgICAgcENUWC0+ZGVjX3NsaWNlID0gKigodW5zaWduZWQgaW50ICopIHZhbHVlKTsKKyAgICAgICAgcmV0dXJuIE1GQ19SRVRfT0s7CisKKyAgICBjYXNlIE1GQ19ERUNfU0VUQ09ORl9DUkNfRU5BQkxFOgorICAgICAgICBwQ1RYLT5kZWNfY3JjID0gKigodW5zaWduZWQgaW50ICopIHZhbHVlKTsKKyAgICAgICAgcmV0dXJuIE1GQ19SRVRfT0s7CisKKyAgICBjYXNlIE1GQ19ERUNfU0VUQ09ORl9QSVhFTF9DQUNIRToKKyAgICAgICAgcENUWC0+ZGVjX3BpeGVsY2FjaGUgPSAqKCh1bnNpZ25lZCBpbnQgKikgdmFsdWUpOworICAgICAgICByZXR1cm4gTUZDX1JFVF9PSzsKKworICAgIGNhc2UgTUZDX0RFQ19TRVRDT05GX0ZSQU1FX1RBRzogLyogYmUgc2V0IGJlZm9yZSBjYWxsaW5nIFNzYlNpcE1mY0RlY0V4ZSAqLworICAgICAgICBwQ1RYLT5pbmZyYW1ldGFnID0gKigodW5zaWduZWQgaW50ICopIHZhbHVlKTsKKyAgICAgICAgcmV0dXJuIE1GQ19SRVRfT0s7CisKKyAgICBjYXNlIE1GQ19ERUNfU0VUQ09ORl9JTU1FRElBVEVMWV9ESVNQTEFZOiAvKiBiZSBzZXQgYmVmb3JlIGNhbGxpbmcgU3NiU2lwTWZjRGVjRXhlICovCisgICAgICAgIHBDVFgtPmltbWVkaWF0ZWx5ZGlzcCAgPSAqKCh1bnNpZ25lZCBpbnQgKikgdmFsdWUpOworICAgICAgICByZXR1cm4gTUZDX1JFVF9PSzsKKworICAgIGNhc2UgTUZDX0RFQ19TRVRDT05GX0ZJTVYxX1dJRFRIX0hFSUdIVDoKKyAgICAgICAgZmltdjFfcmVzID0gKHN0cnVjdCBtZmNfZGVjX2ZpbXYxX2luZm8gKil2YWx1ZTsKKyAgICAgICAgTE9HSSgiZmltdjEtPndpZHRoICA9ICVkXG4iLCBmaW12MV9yZXMtPndpZHRoKTsKKyAgICAgICAgTE9HSSgiZmltdjEtPmhlaWdodCA9ICVkXG4iLCBmaW12MV9yZXMtPmhlaWdodCk7CisjaWZkZWYgUzNEX1NVUFBPUlQKKyAgICAgICAgRGVjQXJnLmFyZ3MuY29uZmlnLmFyZ3MuYmFzaWMudmFsdWVzWzBdICA9IChpbnQpKGZpbXYxX3Jlcy0+d2lkdGgpOworICAgICAgICBEZWNBcmcuYXJncy5jb25maWcuYXJncy5iYXNpYy52YWx1ZXNbMV0gID0gKGludCkoZmltdjFfcmVzLT5oZWlnaHQpOworI2Vsc2UKKyAgICAgICAgRGVjQXJnLmFyZ3Muc2V0X2NvbmZpZy5pbl9jb25maWdfdmFsdWVbMF0gID0gKGludCkoZmltdjFfcmVzLT53aWR0aCk7CisgICAgICAgIERlY0FyZy5hcmdzLnNldF9jb25maWcuaW5fY29uZmlnX3ZhbHVlWzFdICA9IChpbnQpKGZpbXYxX3Jlcy0+aGVpZ2h0KTsKKyNlbmRpZgorICAgICAgICBicmVhazsKKyAgICBjYXNlIE1GQ19ERUNfU0VUQ09ORl9JU19MQVNUX0ZSQU1FOgorICAgIGNhc2UgTUZDX0RFQ19TRVRDT05GX0RQQl9GTFVTSDoKKyNpZmRlZiBTM0RfU1VQUE9SVAorICAgIGNhc2UgTUZDX0RFQ19TRVRDT05GX1NFSV9QQVJTRToKKyAgICBkZWZhdWx0OgorICAgICAgICBEZWNBcmcuYXJncy5jb25maWcuYXJncy5iYXNpYy52YWx1ZXNbMF0gPSAqKChpbnQgKikgdmFsdWUpOworICAgICAgICBEZWNBcmcuYXJncy5jb25maWcuYXJncy5iYXNpYy52YWx1ZXNbMV0gID0gMDsKKyNlbHNlCisgICAgZGVmYXVsdDoKKyAgICAgICAgRGVjQXJnLmFyZ3Muc2V0X2NvbmZpZy5pbl9jb25maWdfdmFsdWVbMF0gID0gKigodW5zaWduZWQgaW50ICopIHZhbHVlKTsKKyAgICAgICAgRGVjQXJnLmFyZ3Muc2V0X2NvbmZpZy5pbl9jb25maWdfdmFsdWVbMV0gID0gMDsKKyNlbmRpZgorICAgICAgICBicmVhazsKKyAgICB9CisKKyAgICByZXRfY29kZSA9IGlvY3RsKHBDVFgtPmhNRkMsIElPQ1RMX01GQ19TRVRfQ09ORklHLCAmRGVjQXJnKTsKKyAgICBpZiAoRGVjQXJnLnJldF9jb2RlICE9IE1GQ19PSykgeworICAgICAgICBMT0dFKCJTc2JTaXBNZmNEZWNTZXRDb25maWddIElPQ1RMX01GQ19TRVRfQ09ORklHIGZhaWxlZChyZXQgOiAlZCwgY29uZl90eXBlOiAweCUwOHgpIiwgRGVjQXJnLnJldF9jb2RlLCBjb25mX3R5cGUpOworICAgICAgICByZXR1cm4gTUZDX1JFVF9ERUNfU0VUX0NPTkZfRkFJTDsKKyAgICB9CisKKyAgICByZXR1cm4gTUZDX1JFVF9PSzsKK30KKworU1NCU0lQX01GQ19FUlJPUl9DT0RFIFNzYlNpcE1mY0RlY0dldENvbmZpZyh2b2lkICpvcGVuSGFuZGxlLCBTU0JTSVBfTUZDX0RFQ19DT05GIGNvbmZfdHlwZSwgdm9pZCAqdmFsdWUpCit7CisgICAgaW50IHJldF9jb2RlOworICAgIF9NRkNMSUIgKnBDVFg7CisgICAgc3RydWN0IG1mY19jb21tb25fYXJncyBEZWNBcmc7CisKKyAgICAvKgorICAgIHMzY19tZmNfY29tbW9uX2FyZ3MgcGh5c19hZGRyX2FyZzsKKyAgICBTU0JTSVBfTUZDX0JVRkZFUl9BRERSICpidWZfYWRkcjsKKyAgICAqLworCisgICAgU1NCU0lQX01GQ19JTUdfUkVTT0xVVElPTiAqaW1nX3Jlc29sdXRpb247CisgICAgU1NCU0lQX01GQ19DUkNfREFUQSAqY3JjX2RhdGE7CisgICAgU1NCU0lQX01GQ19DUk9QX0lORk9STUFUSU9OICpjcm9wX2luZm9ybWF0aW9uOworI2lmZGVmIFMzRF9TVVBQT1JUCisgICAgU1NCU0lQX01GQ19GUkFNRV9QQUNLSU5HICpmcmFtZV9wYWNraW5nOworI2VuZGlmCisKKyAgICBpZiAob3BlbkhhbmRsZSA9PSBOVUxMKSB7CisgICAgICAgIExPR0UoIlNzYlNpcE1mY0RlY0dldENvbmZpZ10gb3BlbkhhbmRsZSBpcyBOVUxMIik7CisgICAgICAgIHJldHVybiBNRkNfUkVUX0lOVkFMSURfUEFSQU07CisgICAgfQorCisgICAgaWYgKHZhbHVlID09IE5VTEwpIHsKKyAgICAgICAgTE9HRSgiU3NiU2lwTWZjRGVjR2V0Q29uZmlnXSB2YWx1ZSBpcyBOVUxMIik7CisgICAgICAgIHJldHVybiBNRkNfUkVUX0lOVkFMSURfUEFSQU07CisgICAgfQorCisgICAgcENUWCA9IChfTUZDTElCICopIG9wZW5IYW5kbGU7CisKKyAgICBzd2l0Y2ggKGNvbmZfdHlwZSkgeworI2lmIDAKKyAgICBjYXNlIE1GQ19ERUNfR0VUQ09ORl9QSFlTX0FERFI6CisgICAgICAgIGJ1Zl9hZGRyID0gKFNTQlNJUF9NRkNfQlVGRkVSX0FERFIgKil2YWx1ZTsKKyAgICAgICAgcGh5c19hZGRyX2FyZy5hcmdzLmdldF9waHlzX2FkZHIudV9hZGRyID0gYnVmX2FkZHItPnVfYWRkcjsKKyAgICAgICAgciA9IGlvY3RsKHBDVFgtPmhNRkMsIElPQ1RMX01GQ19HRVRfUEhZU19BRERSLCAmcGh5c19hZGRyX2FyZyk7CisgICAgICAgIGlmIChyIDwgMCkgeworICAgICAgICAgICAgTE9HRSgiU3NiU2lwTWZjRGVjR2V0Q29uZmlnXSBJT0NUTF9NRkNfR0VUX1BIWVNfQUREUiBmYWlsZWQiKTsKKyAgICAgICAgICAgIHJldHVybiBNRkNfQVBJX0ZBSUw7CisgICAgICAgIH0KKyAgICAgICAgYnVmX2FkZHItPnBfYWRkciA9IHBoeXNfYWRkcl9hcmcuYXJncy5nZXRfcGh5c19hZGRyLnBfYWRkcjsKKyAgICAgICAgYnJlYWs7CisjZW5kaWYKKyAgICBjYXNlIE1GQ19ERUNfR0VUQ09ORl9CVUZfV0lEVEhfSEVJR0hUOgorICAgICAgICBpbWdfcmVzb2x1dGlvbiA9IChTU0JTSVBfTUZDX0lNR19SRVNPTFVUSU9OICopdmFsdWU7CisgICAgICAgIGltZ19yZXNvbHV0aW9uLT53aWR0aCA9IHBDVFgtPmRlY091dEluZm8uaW1nX3dpZHRoOworICAgICAgICBpbWdfcmVzb2x1dGlvbi0+aGVpZ2h0ID0gcENUWC0+ZGVjT3V0SW5mby5pbWdfaGVpZ2h0OworICAgICAgICBpbWdfcmVzb2x1dGlvbi0+YnVmX3dpZHRoID0gcENUWC0+ZGVjT3V0SW5mby5idWZfd2lkdGg7CisgICAgICAgIGltZ19yZXNvbHV0aW9uLT5idWZfaGVpZ2h0ID0gcENUWC0+ZGVjT3V0SW5mby5idWZfaGVpZ2h0OworICAgICAgICBicmVhazsKKyAgICBjYXNlIE1GQ19ERUNfR0VUQ09ORl9GUkFNRV9UQUc6CisgICAgICAgICooKHVuc2lnbmVkIGludCAqKXZhbHVlKSA9IHBDVFgtPm91dGZyYW1ldGFndG9wOworICAgICAgICBicmVhazsKKyAgICBjYXNlIE1GQ19ERUNfR0VUQ09ORl9DUk9QX0lORk86CisgICAgICAgIGNyb3BfaW5mb3JtYXRpb24gPSAoU1NCU0lQX01GQ19DUk9QX0lORk9STUFUSU9OICopdmFsdWU7CisgICAgICAgIGNyb3BfaW5mb3JtYXRpb24tPmNyb3BfdG9wX29mZnNldCA9IHBDVFgtPmRlY091dEluZm8uY3JvcF90b3Bfb2Zmc2V0OworICAgICAgICBjcm9wX2luZm9ybWF0aW9uLT5jcm9wX2JvdHRvbV9vZmZzZXQgPSBwQ1RYLT5kZWNPdXRJbmZvLmNyb3BfYm90dG9tX29mZnNldDsKKyAgICAgICAgY3JvcF9pbmZvcm1hdGlvbi0+Y3JvcF9sZWZ0X29mZnNldCA9IHBDVFgtPmRlY091dEluZm8uY3JvcF9sZWZ0X29mZnNldDsKKyAgICAgICAgY3JvcF9pbmZvcm1hdGlvbi0+Y3JvcF9yaWdodF9vZmZzZXQgPSBwQ1RYLT5kZWNPdXRJbmZvLmNyb3BfcmlnaHRfb2Zmc2V0OworICAgICAgICBicmVhazsKKyAgICBjYXNlIE1GQ19ERUNfR0VUQ09ORl9DUkNfREFUQToKKyNpZmRlZiBTM0RfU1VQUE9SVAorICAgIGNhc2UgTUZDX0RFQ19HRVRDT05GX0ZSQU1FX1BBQ0tJTkc6CisgICAgICAgIG1lbXNldCgmRGVjQXJnLCAweDAwLCBzaXplb2YoRGVjQXJnKSk7CisgICAgICAgIERlY0FyZy5hcmdzLmNvbmZpZy50eXBlID0gY29uZl90eXBlOworCisgICAgICAgIHJldF9jb2RlID0gaW9jdGwocENUWC0+aE1GQywgSU9DVExfTUZDX0dFVF9DT05GSUcsICZEZWNBcmcpOworICAgICAgICBpZiAoRGVjQXJnLnJldF9jb2RlICE9IE1GQ19PSykgeworICAgICAgICAgICAgTE9HRSgiU3NiU2lwTWZjRGVjR2V0Q29uZmlnXSBJT0NUTF9NRkNfR0VUX0NPTkZJRyBmYWlsZWQocmV0IDogJWQsIGNvbmZfdHlwZTogMHglMDh4KSIsIERlY0FyZy5yZXRfY29kZSwgY29uZl90eXBlKTsKKyAgICAgICAgICAgIHJldHVybiBNRkNfUkVUX0RFQ19HRVRfQ09ORl9GQUlMOworICAgICAgICB9CisKKyAgICAgICAgaWYgKGNvbmZfdHlwZSA9PSBNRkNfREVDX0dFVENPTkZfQ1JDX0RBVEEpIHsKKyAgICAgICAgICAgIGNyY19kYXRhID0gKFNTQlNJUF9NRkNfQ1JDX0RBVEEgKil2YWx1ZTsKKworICAgICAgICAgICAgY3JjX2RhdGEtPmx1bWEwID0gRGVjQXJnLmFyZ3MuY29uZmlnLmFyZ3MuYmFzaWMudmFsdWVzWzBdOworICAgICAgICAgICAgY3JjX2RhdGEtPmNocm9tYTAgPSBEZWNBcmcuYXJncy5jb25maWcuYXJncy5iYXNpYy52YWx1ZXNbMV07CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBmcmFtZV9wYWNraW5nID0gKFNTQlNJUF9NRkNfRlJBTUVfUEFDS0lORyAqKXZhbHVlOworICAgICAgICAgICAgbWVtY3B5KGZyYW1lX3BhY2tpbmcsICZEZWNBcmcuYXJncy5jb25maWcuYXJncy5mcmFtZV9wYWNraW5nLAorICAgICAgICAgICAgICAgIHNpemVvZihTU0JTSVBfTUZDX0ZSQU1FX1BBQ0tJTkcpKTsKKyAgICAgICAgfQorI2Vsc2UKKyAgICAgICAgY3JjX2RhdGEgPSAoU1NCU0lQX01GQ19DUkNfREFUQSAqKXZhbHVlOworCisgICAgICAgIG1lbXNldCgmRGVjQXJnLCAweDAwLCBzaXplb2YoRGVjQXJnKSk7CisgICAgICAgIERlY0FyZy5hcmdzLmdldF9jb25maWcuaW5fY29uZmlnX3BhcmFtID0gY29uZl90eXBlOworCisgICAgICAgIHJldF9jb2RlID0gaW9jdGwocENUWC0+aE1GQywgSU9DVExfTUZDX0dFVF9DT05GSUcsICZEZWNBcmcpOworICAgICAgICBpZiAoRGVjQXJnLnJldF9jb2RlICE9IE1GQ19PSykgeworICAgICAgICAgICAgTE9HRSgiU3NiU2lwTWZjRGVjR2V0Q29uZmlnXSBJT0NUTF9NRkNfR0VUX0NPTkZJRyBmYWlsZWQocmV0IDogJWQsIGNvbmZfdHlwZTogMHglMDh4KSIsIERlY0FyZy5yZXRfY29kZSwgY29uZl90eXBlKTsKKyAgICAgICAgICAgIHJldHVybiBNRkNfUkVUX0RFQ19HRVRfQ09ORl9GQUlMOworICAgICAgICB9CisgICAgICAgIGNyY19kYXRhLT5sdW1hMCA9IERlY0FyZy5hcmdzLmdldF9jb25maWcub3V0X2NvbmZpZ192YWx1ZVswXTsKKyAgICAgICAgY3JjX2RhdGEtPmNocm9tYTAgPSBEZWNBcmcuYXJncy5nZXRfY29uZmlnLm91dF9jb25maWdfdmFsdWVbMV07CisjZW5kaWYKKyAgICAgICAgYnJlYWs7CisgICAgZGVmYXVsdDoKKyAgICAgICAgTE9HRSgiU3NiU2lwTWZjRGVjR2V0Q29uZmlnXSBObyBzdWNoIGNvbmZfdHlwZSBpcyBzdXBwb3J0ZWQiKTsKKyAgICAgICAgcmV0dXJuIE1GQ19SRVRfREVDX0dFVF9DT05GX0ZBSUw7CisgICAgfQorCisgICAgcmV0dXJuIE1GQ19SRVRfT0s7Cit9CisKK3ZvaWQgKlNzYlNpcE1mY0RlY0FsbG9jSW5wdXRCdWZmZXIodm9pZCAqb3BlbkhhbmRsZSwgdm9pZCAqKnBoeUluQnVmLCBpbnQgaW5wdXRCdWZmZXJTaXplKQoreworICAgIGludCByZXRfY29kZTsKKyAgICBfTUZDTElCICpwQ1RYOworICAgIHN0cnVjdCBtZmNfY29tbW9uX2FyZ3MgdXNlcl9hZGRyX2FyZywgcGh5c19hZGRyX2FyZzsKKworICAgIGlmIChpbnB1dEJ1ZmZlclNpemUgPCAwKSB7CisgICAgICAgIExPR0UoIlNzYlNpcE1mY0RlY0FsbG9jSW5wdXRCdWZmZXJdIGlucHV0QnVmZmVyU2l6ZSA9ICVkIGlzIGludmFsaWRcbiIsIGlucHV0QnVmZmVyU2l6ZSk7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KKworICAgIGlmIChvcGVuSGFuZGxlID09IE5VTEwpIHsKKyAgICAgICAgTE9HRSgiU3NiU2lwTWZjRGVjQWxsb2NJbnB1dEJ1ZmZlcl0gb3BlbkhhbmRsZSBpcyBOVUxMXG4iKTsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorCisgICAgcENUWCA9IChfTUZDTElCICopb3BlbkhhbmRsZTsKKworICAgIHVzZXJfYWRkcl9hcmcuYXJncy5tZW1fYWxsb2MudHlwZSA9IERFQ09ERVI7CisgICAgdXNlcl9hZGRyX2FyZy5hcmdzLm1lbV9hbGxvYy5idWZmX3NpemUgPSBpbnB1dEJ1ZmZlclNpemU7CisgICAgdXNlcl9hZGRyX2FyZy5hcmdzLm1lbV9hbGxvYy5tYXBwZWRfYWRkciA9IHBDVFgtPm1hcHBlZF9hZGRyOworICAgIHJldF9jb2RlID0gaW9jdGwocENUWC0+aE1GQywgSU9DVExfTUZDX0dFVF9JTl9CVUYsICZ1c2VyX2FkZHJfYXJnKTsKKyAgICBpZiAocmV0X2NvZGUgPCAwKSB7CisgICAgICAgIExPR0UoIlNzYlNpcE1mY0RlY0FsbG9jSW5wdXRCdWZmZXJdIElPQ1RMX01GQ19HRVRfSU5fQlVGIGZhaWxlZCIpOworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisKKyAgICBwaHlzX2FkZHJfYXJnLmFyZ3MucmVhbF9hZGRyLmtleSA9IHVzZXJfYWRkcl9hcmcuYXJncy5tZW1fYWxsb2Mub2Zmc2V0OworICAgIHJldF9jb2RlID0gaW9jdGwocENUWC0+aE1GQywgSU9DVExfTUZDX0dFVF9SRUFMX0FERFIsICZwaHlzX2FkZHJfYXJnKTsKKyAgICBpZiAocmV0X2NvZGUgPCAwKSB7CisgICAgICAgIExPR0UoIlNzYlNpcE1mY0RlY0dldEluQnVmXSBJT0NUTF9NRkNfR0VUX1BIWVNfQUREUiBmYWlsZWQiKTsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorCisgICAgcENUWC0+dmlyU3RybUJ1ZiA9IHBDVFgtPm1hcHBlZF9hZGRyICsgdXNlcl9hZGRyX2FyZy5hcmdzLm1lbV9hbGxvYy5vZmZzZXQ7CisgICAgcENUWC0+cGh5U3RybUJ1ZiA9IHBoeXNfYWRkcl9hcmcuYXJncy5yZWFsX2FkZHIuYWRkcjsKKyAgICBwQ1RYLT5zaXplU3RybUJ1ZiA9IGlucHV0QnVmZmVyU2l6ZTsKKyAgICBwQ1RYLT5pbnRlcl9idWZmX3N0YXR1cyB8PSBNRkNfVVNFX1NUUk1fQlVGRjsKKworICAgICpwaHlJbkJ1ZiA9ICh2b2lkICopcENUWC0+cGh5U3RybUJ1ZjsKKworICAgIHJldHVybiAodm9pZCAqKXBDVFgtPnZpclN0cm1CdWY7Cit9CisKK3ZvaWQgU3NiU2lwTWZjRGVjRnJlZUlucHV0QnVmZmVyKHZvaWQgKm9wZW5IYW5kbGUsIHZvaWQgKnBoeUluQnVmKQoreworICAgIGludCByZXQ7CisgICAgX01GQ0xJQiAgKnBDVFg7CisgICAgc3RydWN0IG1mY19jb21tb25fYXJncyBmcmVlX2FyZzsKKworICAgIGlmIChvcGVuSGFuZGxlID09IE5VTEwpIHsKKyAgICAgICAgTE9HRSgiU3NiU2lwTWZjRGVjRnJlZUlucHV0QnVmZmVyXSBvcGVuSGFuZGxlIGlzIE5VTEwiKTsKKyAgICAgICAgcmV0dXJuIE1GQ19SRVRfSU5WQUxJRF9QQVJBTTsKKyAgICB9CisKKyAgICBwQ1RYID0gKF9NRkNMSUIgKilvcGVuSGFuZGxlOworCisgICAgaWYgKHBDVFgtPmludGVyX2J1ZmZfc3RhdHVzICYgTUZDX1VTRV9TVFJNX0JVRkYpIHsKKyAgICAgICAgZnJlZV9hcmcuYXJncy5tZW1fZnJlZS5rZXkgPSBwQ1RYLT52aXJTdHJtQnVmOworICAgICAgICByZXQgPSBpb2N0bChwQ1RYLT5oTUZDLCBJT0NUTF9NRkNfRlJFRV9CVUYsICZmcmVlX2FyZyk7CisgICAgfQorICAgIHBDVFgtPmludGVyX2J1ZmZfc3RhdHVzID0gTUZDX1VTRV9OT05FOworICAgIHJldHVybiBNRkNfUkVUX09LOworfQorCisvKiBDUkVTUE8gKi8KKyNpZiAxCitpbnQgdGlsZV80eDJfcmVhZChpbnQgeF9zaXplLCBpbnQgeV9zaXplLCBpbnQgeF9wb3MsIGludCB5X3BvcykKK3sKKyAgICBpbnQgcGl4ZWxfeF9tMSwgcGl4ZWxfeV9tMTsKKyAgICBpbnQgcm91bmR1cF94LCByb3VuZHVwX3k7CisgICAgaW50IGxpbmVhcl9hZGRyMCwgbGluZWFyX2FkZHIxLCBiYW5rX2FkZHIgOworICAgIGludCB4X2FkZHI7CisgICAgaW50IHRyYW5zX2FkZHI7CisKKyAgICBwaXhlbF94X20xID0geF9zaXplIC0xOworICAgIHBpeGVsX3lfbTEgPSB5X3NpemUgLTE7CisKKyAgICByb3VuZHVwX3ggPSAoKHBpeGVsX3hfbTEgPj4gNykgKyAxKTsKKyAgICByb3VuZHVwX3kgPSAoKHBpeGVsX3hfbTEgPj4gNikgKyAxKTsKKworICAgIHhfYWRkciA9IHhfcG9zID4+IDI7CisKKyAgICBpZiAoKHlfc2l6ZSA8PSB5X3BvcyszMikgJiYgKCB5X3BvcyA8IHlfc2l6ZSkgJiYKKyAgICAgICAgKCgocGl4ZWxfeV9tMSA+PiA1KSAmIDB4MSkgPT0gMCkgJiYgKCgoeV9wb3MgPj4gNSkgJiAweDEpID09IDApKSB7CisgICAgICAgIGxpbmVhcl9hZGRyMCA9ICgoKHlfcG9zICYgMHgxZikgPDw0KSB8ICh4X2FkZHIgJiAweGYpKTsKKyAgICAgICAgbGluZWFyX2FkZHIxID0gKCgoeV9wb3MgPj4gNikgJiAweGZmKSAqIHJvdW5kdXBfeCArICgoeF9hZGRyID4+IDYpICYgMHgzZikpOworCisgICAgICAgIGlmICgoKHhfYWRkciA+PiA1KSAmIDB4MSkgPT0gKCh5X3BvcyA+PiA1KSAmIDB4MSkpCisgICAgICAgICAgICBiYW5rX2FkZHIgPSAoKHhfYWRkciA+PiA0KSAmIDB4MSk7CisgICAgICAgIGVsc2UKKyAgICAgICAgICAgIGJhbmtfYWRkciA9IDB4MiB8ICgoeF9hZGRyID4+IDQpICYgMHgxKTsKKyAgICB9IGVsc2UgeworICAgICAgICBsaW5lYXJfYWRkcjAgPSAoKCh5X3BvcyAmIDB4MWYpIDw8IDQpIHwgKHhfYWRkciAmIDB4ZikpOworICAgICAgICBsaW5lYXJfYWRkcjEgPSAoKCh5X3BvcyA+PiA2KSAmIDB4ZmYpICogcm91bmR1cF94ICsgKCh4X2FkZHIgPj4gNSkgJiAweDdmKSk7CisKKyAgICAgICAgaWYgKCgoeF9hZGRyID4+IDUpICYgMHgxKSA9PSAoKHlfcG9zID4+IDUpICYgMHgxKSkKKyAgICAgICAgICAgIGJhbmtfYWRkciA9ICgoeF9hZGRyID4+IDQpICYgMHgxKTsKKyAgICAgICAgZWxzZQorICAgICAgICAgICAgYmFua19hZGRyID0gMHgyIHwgKCh4X2FkZHIgPj4gNCkgJiAweDEpOworICAgIH0KKworICAgIGxpbmVhcl9hZGRyMCA9IGxpbmVhcl9hZGRyMCA8PCAyOworICAgIHRyYW5zX2FkZHIgPSAobGluZWFyX2FkZHIxIDw8MTMpIHwgKGJhbmtfYWRkciA8PCAxMSkgfCBsaW5lYXJfYWRkcjA7CisKKyAgICByZXR1cm4gdHJhbnNfYWRkcjsKK30KKwordm9pZCBZX3RpbGVfdG9fbGluZWFyXzR4Mih1bnNpZ25lZCBjaGFyICpwX2xpbmVhcl9hZGRyLCB1bnNpZ25lZCBjaGFyICpwX3RpbGVkX2FkZHIsIHVuc2lnbmVkIGludCB4X3NpemUsIHVuc2lnbmVkIGludCB5X3NpemUpCit7CisgICAgaW50IHRyYW5zX2FkZHI7CisgICAgdW5zaWduZWQgaW50IGksIGosIGssIGluZGV4OworICAgIHVuc2lnbmVkIGNoYXIgZGF0YThbNF07CisgICAgdW5zaWduZWQgaW50IG1heF9pbmRleCA9IHhfc2l6ZSAqIHlfc2l6ZTsKKworICAgIGZvciAoaSA9IDA7IGkgPCB5X3NpemU7IGkgPSBpICsgMTYpIHsKKyAgICAgICAgZm9yIChqID0gMDsgaiA8IHhfc2l6ZTsgaiA9IGogKyAxNikgeworICAgICAgICAgICAgdHJhbnNfYWRkciA9IHRpbGVfNHgyX3JlYWQoeF9zaXplLCB5X3NpemUsIGosIGkpOworICAgICAgICAgICAgZm9yIChrID0gMDsgayA8IDE2OyBrKyspIHsKKyAgICAgICAgICAgICAgICAvKiBsaW1pdCBjaGVjayAtIHByb2hpYml0IHNlZ21lbnRhdGlvbiBmYXVsdCAqLworICAgICAgICAgICAgICAgIGluZGV4ID0gKGkgKiB4X3NpemUpICsgKHhfc2l6ZSAqIGspICsgajsKKyAgICAgICAgICAgICAgICAvKiByZW1vdmUgZXF1YWwgY29uZGl0aW9uIHRvIHNvbHZlIHRodW1ibmFpbCBidWcgKi8KKyAgICAgICAgICAgICAgICBpZiAoaW5kZXggKyAxNiA+IG1heF9pbmRleCkgeworICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBkYXRhOFswXSA9IHBfdGlsZWRfYWRkclt0cmFuc19hZGRyICsgNjQgKiBrICsgMF07CisgICAgICAgICAgICAgICAgZGF0YThbMV0gPSBwX3RpbGVkX2FkZHJbdHJhbnNfYWRkciArIDY0ICogayArIDFdOworICAgICAgICAgICAgICAgIGRhdGE4WzJdID0gcF90aWxlZF9hZGRyW3RyYW5zX2FkZHIgKyA2NCAqIGsgKyAyXTsKKyAgICAgICAgICAgICAgICBkYXRhOFszXSA9IHBfdGlsZWRfYWRkclt0cmFuc19hZGRyICsgNjQgKiBrICsgM107CisKKyAgICAgICAgICAgICAgICBwX2xpbmVhcl9hZGRyW2luZGV4XSA9IGRhdGE4WzBdOworICAgICAgICAgICAgICAgIHBfbGluZWFyX2FkZHJbaW5kZXggKyAxXSA9IGRhdGE4WzFdOworICAgICAgICAgICAgICAgIHBfbGluZWFyX2FkZHJbaW5kZXggKyAyXSA9IGRhdGE4WzJdOworICAgICAgICAgICAgICAgIHBfbGluZWFyX2FkZHJbaW5kZXggKyAzXSA9IGRhdGE4WzNdOworCisgICAgICAgICAgICAgICAgZGF0YThbMF0gPSBwX3RpbGVkX2FkZHJbdHJhbnNfYWRkciArIDY0ICogayArIDRdOworICAgICAgICAgICAgICAgIGRhdGE4WzFdID0gcF90aWxlZF9hZGRyW3RyYW5zX2FkZHIgKyA2NCAqIGsgKyA1XTsKKyAgICAgICAgICAgICAgICBkYXRhOFsyXSA9IHBfdGlsZWRfYWRkclt0cmFuc19hZGRyICsgNjQgKiBrICsgNl07CisgICAgICAgICAgICAgICAgZGF0YThbM10gPSBwX3RpbGVkX2FkZHJbdHJhbnNfYWRkciArIDY0ICogayArIDddOworCisgICAgICAgICAgICAgICAgcF9saW5lYXJfYWRkcltpbmRleCArIDRdID0gZGF0YThbMF07CisgICAgICAgICAgICAgICAgcF9saW5lYXJfYWRkcltpbmRleCArIDVdID0gZGF0YThbMV07CisgICAgICAgICAgICAgICAgcF9saW5lYXJfYWRkcltpbmRleCArIDZdID0gZGF0YThbMl07CisgICAgICAgICAgICAgICAgcF9saW5lYXJfYWRkcltpbmRleCArIDddID0gZGF0YThbM107CisKKyAgICAgICAgICAgICAgICBkYXRhOFswXSA9IHBfdGlsZWRfYWRkclt0cmFuc19hZGRyICsgNjQgKiBrICsgOF07CisgICAgICAgICAgICAgICAgZGF0YThbMV0gPSBwX3RpbGVkX2FkZHJbdHJhbnNfYWRkciArIDY0ICogayArIDldOworICAgICAgICAgICAgICAgIGRhdGE4WzJdID0gcF90aWxlZF9hZGRyW3RyYW5zX2FkZHIgKyA2NCAqIGsgKyAxMF07CisgICAgICAgICAgICAgICAgZGF0YThbM10gPSBwX3RpbGVkX2FkZHJbdHJhbnNfYWRkciArIDY0ICogayArIDExXTsKKworICAgICAgICAgICAgICAgIHBfbGluZWFyX2FkZHJbaW5kZXggKyA4XSA9IGRhdGE4WzBdOworICAgICAgICAgICAgICAgIHBfbGluZWFyX2FkZHJbaW5kZXggKyA5XSA9IGRhdGE4WzFdOworICAgICAgICAgICAgICAgIHBfbGluZWFyX2FkZHJbaW5kZXggKyAxMF0gPSBkYXRhOFsyXTsKKyAgICAgICAgICAgICAgICBwX2xpbmVhcl9hZGRyW2luZGV4ICsgMTFdID0gZGF0YThbM107CisKKyAgICAgICAgICAgICAgICBkYXRhOFswXSA9IHBfdGlsZWRfYWRkclt0cmFuc19hZGRyICsgNjQgKiBrICsgMTJdOworICAgICAgICAgICAgICAgIGRhdGE4WzFdID0gcF90aWxlZF9hZGRyW3RyYW5zX2FkZHIgKyA2NCAqIGsgKyAxM107CisgICAgICAgICAgICAgICAgZGF0YThbMl0gPSBwX3RpbGVkX2FkZHJbdHJhbnNfYWRkciArIDY0ICogayArIDE0XTsKKyAgICAgICAgICAgICAgICBkYXRhOFszXSA9IHBfdGlsZWRfYWRkclt0cmFuc19hZGRyICsgNjQgKiBrICsgMTVdOworCisgICAgICAgICAgICAgICAgcF9saW5lYXJfYWRkcltpbmRleCArIDEyXSA9IGRhdGE4WzBdOworICAgICAgICAgICAgICAgIHBfbGluZWFyX2FkZHJbaW5kZXggKyAxM10gPSBkYXRhOFsxXTsKKyAgICAgICAgICAgICAgICBwX2xpbmVhcl9hZGRyW2luZGV4ICsgMTRdID0gZGF0YThbMl07CisgICAgICAgICAgICAgICAgcF9saW5lYXJfYWRkcltpbmRleCArIDE1XSA9IGRhdGE4WzNdOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorfQorCit2b2lkIENiQ3JfdGlsZV90b19saW5lYXJfNHgyKHVuc2lnbmVkIGNoYXIgKnBfbGluZWFyX2FkZHIsIHVuc2lnbmVkIGNoYXIgKnBfdGlsZWRfYWRkciwgdW5zaWduZWQgaW50IHhfc2l6ZSwgdW5zaWduZWQgaW50IHlfc2l6ZSkKK3sKKyAgICBpbnQgdHJhbnNfYWRkcjsKKyAgICB1bnNpZ25lZCBpbnQgaSwgaiwgaywgaW5kZXg7CisgICAgdW5zaWduZWQgY2hhciBkYXRhOFs0XTsKKyAgICB1bnNpZ25lZCBpbnQgaGFsZl95X3NpemUgPSB5X3NpemUgLyAyOworICAgIHVuc2lnbmVkIGludCBtYXhfaW5kZXggPSB4X3NpemUgKiBoYWxmX3lfc2l6ZTsKKyAgICB1bnNpZ25lZCBjaGFyICpwVVZBZGRyWzJdOworCisgICAgcFVWQWRkclswXSA9IHBfbGluZWFyX2FkZHI7CisgICAgcFVWQWRkclsxXSA9IHBfbGluZWFyX2FkZHIgKyAoKHhfc2l6ZSAqIGhhbGZfeV9zaXplKSAvIDIpOworCisgICAgZm9yIChpID0gMDsgaSA8IGhhbGZfeV9zaXplOyBpID0gaSArIDE2KSB7CisgICAgICAgIGZvciAoaiA9IDA7IGogPCB4X3NpemU7IGogPSBqICsgMTYpIHsKKyAgICAgICAgICAgIHRyYW5zX2FkZHIgPSB0aWxlXzR4Ml9yZWFkKHhfc2l6ZSwgaGFsZl95X3NpemUsIGosIGkpOworICAgICAgICAgICAgZm9yIChrID0gMDsgayA8IDE2OyBrKyspIHsKKyAgICAgICAgICAgICAgICAvKiBsaW1pdCBjaGVjayAtIHByb2hpYml0IHNlZ21lbnRhdGlvbiBmYXVsdCAqLworICAgICAgICAgICAgICAgIGluZGV4ID0gKGkgKiB4X3NpemUpICsgKHhfc2l6ZSAqIGspICsgajsKKyAgICAgICAgICAgICAgICAvKiByZW1vdmUgZXF1YWwgY29uZGl0aW9uIHRvIHNvbHZlIHRodW1ibmFpbCBidWcgKi8KKyAgICAgICAgICAgICAgICBpZiAoaW5kZXggKyAxNiA+IG1heF9pbmRleCkgeworICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBkYXRhOFswXSA9IHBfdGlsZWRfYWRkclt0cmFuc19hZGRyICsgNjQgKiBrICsgMF07CisgICAgICAgICAgICAgICAgZGF0YThbMV0gPSBwX3RpbGVkX2FkZHJbdHJhbnNfYWRkciArIDY0ICogayArIDFdOworICAgICAgICAgICAgICAgIGRhdGE4WzJdID0gcF90aWxlZF9hZGRyW3RyYW5zX2FkZHIgKyA2NCAqIGsgKyAyXTsKKyAgICAgICAgICAgICAgICBkYXRhOFszXSA9IHBfdGlsZWRfYWRkclt0cmFuc19hZGRyICsgNjQgKiBrICsgM107CisKKyAgICAgICAgICAgICAgICBwVVZBZGRyW2luZGV4JTJdW2luZGV4LzJdID0gZGF0YThbMF07CisgICAgICAgICAgICAgICAgcFVWQWRkclsoaW5kZXgrMSklMl1bKGluZGV4KzEpLzJdID0gZGF0YThbMV07CisgICAgICAgICAgICAgICAgcFVWQWRkclsoaW5kZXgrMiklMl1bKGluZGV4KzIpLzJdID0gZGF0YThbMl07CisgICAgICAgICAgICAgICAgcFVWQWRkclsoaW5kZXgrMyklMl1bKGluZGV4KzMpLzJdID0gZGF0YThbM107CisKKyAgICAgICAgICAgICAgICBkYXRhOFswXSA9IHBfdGlsZWRfYWRkclt0cmFuc19hZGRyICsgNjQgKiBrICsgNF07CisgICAgICAgICAgICAgICAgZGF0YThbMV0gPSBwX3RpbGVkX2FkZHJbdHJhbnNfYWRkciArIDY0ICogayArIDVdOworICAgICAgICAgICAgICAgIGRhdGE4WzJdID0gcF90aWxlZF9hZGRyW3RyYW5zX2FkZHIgKyA2NCAqIGsgKyA2XTsKKyAgICAgICAgICAgICAgICBkYXRhOFszXSA9IHBfdGlsZWRfYWRkclt0cmFuc19hZGRyICsgNjQgKiBrICsgN107CisKKyAgICAgICAgICAgICAgICBwVVZBZGRyWyhpbmRleCs0KSUyXVsoaW5kZXgrNCkvMl0gPSBkYXRhOFswXTsKKyAgICAgICAgICAgICAgICBwVVZBZGRyWyhpbmRleCs1KSUyXVsoaW5kZXgrNSkvMl0gPSBkYXRhOFsxXTsKKyAgICAgICAgICAgICAgICBwVVZBZGRyWyhpbmRleCs2KSUyXVsoaW5kZXgrNikvMl0gPSBkYXRhOFsyXTsKKyAgICAgICAgICAgICAgICBwVVZBZGRyWyhpbmRleCs3KSUyXVsoaW5kZXgrNykvMl0gPSBkYXRhOFszXTsKKworICAgICAgICAgICAgICAgIGRhdGE4WzBdID0gcF90aWxlZF9hZGRyW3RyYW5zX2FkZHIgKyA2NCAqIGsgKyA4XTsKKyAgICAgICAgICAgICAgICBkYXRhOFsxXSA9IHBfdGlsZWRfYWRkclt0cmFuc19hZGRyICsgNjQgKiBrICsgOV07CisgICAgICAgICAgICAgICAgZGF0YThbMl0gPSBwX3RpbGVkX2FkZHJbdHJhbnNfYWRkciArIDY0ICogayArIDEwXTsKKyAgICAgICAgICAgICAgICBkYXRhOFszXSA9IHBfdGlsZWRfYWRkclt0cmFuc19hZGRyICsgNjQgKiBrICsgMTFdOworCisgICAgICAgICAgICAgICAgcFVWQWRkclsoaW5kZXgrOCklMl1bKGluZGV4KzgpLzJdID0gZGF0YThbMF07CisgICAgICAgICAgICAgICAgcFVWQWRkclsoaW5kZXgrOSklMl1bKGluZGV4KzkpLzJdID0gZGF0YThbMV07CisgICAgICAgICAgICAgICAgcFVWQWRkclsoaW5kZXgrMTApJTJdWyhpbmRleCsxMCkvMl0gPSBkYXRhOFsyXTsKKyAgICAgICAgICAgICAgICBwVVZBZGRyWyhpbmRleCsxMSklMl1bKGluZGV4KzExKS8yXSA9IGRhdGE4WzNdOworCisgICAgICAgICAgICAgICAgZGF0YThbMF0gPSBwX3RpbGVkX2FkZHJbdHJhbnNfYWRkciArIDY0ICogayArIDEyXTsKKyAgICAgICAgICAgICAgICBkYXRhOFsxXSA9IHBfdGlsZWRfYWRkclt0cmFuc19hZGRyICsgNjQgKiBrICsgMTNdOworICAgICAgICAgICAgICAgIGRhdGE4WzJdID0gcF90aWxlZF9hZGRyW3RyYW5zX2FkZHIgKyA2NCAqIGsgKyAxNF07CisgICAgICAgICAgICAgICAgZGF0YThbM10gPSBwX3RpbGVkX2FkZHJbdHJhbnNfYWRkciArIDY0ICogayArIDE1XTsKKworICAgICAgICAgICAgICAgIHBVVkFkZHJbKGluZGV4KzEyKSUyXVsoaW5kZXgrMTIpLzJdID0gZGF0YThbMF07CisgICAgICAgICAgICAgICAgcFVWQWRkclsoaW5kZXgrMTMpJTJdWyhpbmRleCsxMykvMl0gPSBkYXRhOFsxXTsKKyAgICAgICAgICAgICAgICBwVVZBZGRyWyhpbmRleCsxNCklMl1bKGluZGV4KzE0KS8yXSA9IGRhdGE4WzJdOworICAgICAgICAgICAgICAgIHBVVkFkZHJbKGluZGV4KzE1KSUyXVsoaW5kZXgrMTUpLzJdID0gZGF0YThbM107CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9Cit9CisjZWxzZQoraW50IHRpbGVfNHgyX3JlYWQoaW50IHhfc2l6ZSwgaW50IHlfc2l6ZSwgaW50IHhfcG9zLCBpbnQgeV9wb3MpCit7CisgICAgaW50IHBpeGVsX3hfbTEsIHBpeGVsX3lfbTE7CisgICAgaW50IHJvdW5kdXBfeCwgcm91bmR1cF95OworICAgIGludCBsaW5lYXJfYWRkcjAsIGxpbmVhcl9hZGRyMSwgYmFua19hZGRyOworICAgIGludCB4X2FkZHI7CisgICAgaW50IHRyYW5zX2FkZHI7CisKKyAgICBwaXhlbF94X20xID0geF9zaXplIC0xOworICAgIHBpeGVsX3lfbTEgPSB5X3NpemUgLTE7CisKKyAgICByb3VuZHVwX3ggPSAoKHBpeGVsX3hfbTEgPj4gNykgKyAxKTsKKyAgICByb3VuZHVwX3kgPSAoKHBpeGVsX3hfbTEgPj4gNikgKyAxKTsKKworICAgIHhfYWRkciA9IHhfcG9zID4+IDI7CisKKyAgICBpZiAoKHlfc2l6ZSA8PSB5X3BvcyszMikgICAgICAgICAgICAgJiYKKyAgICAgICAgKCB5X3BvcyA8IHlfc2l6ZSkgICAgICAgICAgICAgICAgJiYKKyAgICAgICAgKCgocGl4ZWxfeV9tMSA+PiA1KSAmIDB4MSkgPT0gMCkgJiYKKyAgICAgICAgKCgoeV9wb3MgPj4gNSkgJiAweDEpID09IDApKSB7CisgICAgICAgIGxpbmVhcl9hZGRyMCA9ICgoKHlfcG9zICYgMHgxZikgPDw0KSB8ICh4X2FkZHIgJiAweGYpKTsKKyAgICAgICAgbGluZWFyX2FkZHIxID0gKCgoeV9wb3MgPj4gNikgJiAweGZmKSAqIHJvdW5kdXBfeCArICgoeF9hZGRyID4+IDYpICYgMHgzZikpOworCisgICAgICAgIGlmICgoKHhfYWRkciA+PiA1KSAmIDB4MSkgPT0gKCh5X3BvcyA+PiA1KSAmIDB4MSkpCisgICAgICAgICAgICBiYW5rX2FkZHIgPSAoKHhfYWRkciA+PiA0KSAmIDB4MSk7CisgICAgICAgIGVsc2UKKyAgICAgICAgICAgIGJhbmtfYWRkciA9IDB4MiB8ICgoeF9hZGRyID4+IDQpICYgMHgxKTsKKyAgICB9IGVsc2UgeworICAgICAgICBsaW5lYXJfYWRkcjAgPSAoKCh5X3BvcyAmIDB4MWYpIDw8IDQpIHwgKHhfYWRkciAmIDB4ZikpOworICAgICAgICBsaW5lYXJfYWRkcjEgPSAoKCh5X3BvcyA+PiA2KSAmIDB4ZmYpICogcm91bmR1cF94ICsgKCh4X2FkZHIgPj4gNSkgJiAweDdmKSk7CisKKyAgICAgICAgaWYgKCgoeF9hZGRyID4+IDUpICYgMHgxKSA9PSAoKHlfcG9zID4+IDUpICYgMHgxKSkKKyAgICAgICAgICAgIGJhbmtfYWRkciA9ICgoeF9hZGRyID4+IDQpICYgMHgxKTsKKyAgICAgICAgZWxzZQorICAgICAgICAgICAgYmFua19hZGRyID0gMHgyIHwgKCh4X2FkZHIgPj4gNCkgJiAweDEpOworICAgIH0KKworICAgIGxpbmVhcl9hZGRyMCA9IGxpbmVhcl9hZGRyMCA8PCAyOworICAgIHRyYW5zX2FkZHIgPSAobGluZWFyX2FkZHIxIDw8MTMpIHwgKGJhbmtfYWRkciA8PCAxMSkgfCBsaW5lYXJfYWRkcjA7CisKKyAgICByZXR1cm4gdHJhbnNfYWRkcjsKK30KKworCit2b2lkIHRpbGVfdG9fbGluZWFyXzR4Mih1bnNpZ25lZCBjaGFyICpwX2xpbmVhcl9hZGRyLCB1bnNpZ25lZCBjaGFyICpwX3RpbGVkX2FkZHIsIHVuc2lnbmVkIGludCB4X3NpemUsIHVuc2lnbmVkIGludCB5X3NpemUpCit7CisgICAgaW50IHRyYW5zX2FkZHI7CisgICAgdW5zaWduZWQgaW50IGksIGosIGssIG5uLCBtbTsKKyAgICB1bnNpZ25lZCBpbnQgaXgsaXksIG54LCBueTsKKworICAgIG54ID0geF9zaXplICUgMTY7CisgICAgbnkgPSB5X3NpemUgJSAxNjsKKworICAgIGlmIChueCAhPSAwKQorICAgICAgICBpeCA9IDE2OworICAgIGVsc2UKKyAgICAgICAgaXggPSAxOworCisgICAgaWYgKG55ICE9IDApCisgICAgICAgIGl5ID0gMTY7CisgICAgZWxzZQorICAgICAgICBpeSA9IDE7CisKKyAgICBmb3IgKGkgPSAwOyBpIDwgeV9zaXplIC0gaXk7IGkgPSBpICsgMTYpIHsKKyAgICAgICAgZm9yIChqID0gMDsgaiA8IHhfc2l6ZSAtaXg7IGogPSBqICsgMTYpCXsKKyAgICAgICAgICAgIHRyYW5zX2FkZHIgPSB0aWxlXzR4Ml9yZWFkKHhfc2l6ZSwgeV9zaXplLCBqLCBpKTsKKworICAgICAgICAgICAgayA9IDA7ICAgICAgICBubiA9IHRyYW5zX2FkZHIgKyAoayA8PCA2KTsgICAgICAgIG1tID14X3NpemUqKGkraykgKyBqOworICAgICAgICAgICAgbWVtY3B5KHBfbGluZWFyX2FkZHIrbW0sIHBfdGlsZWRfYWRkcitubiwgMTYpOworCisgICAgICAgICAgICBrID0gMTsgICAgICAgIG5uID0gdHJhbnNfYWRkciArIChrIDw8IDYpOyAgICAgICAgbW0gPXhfc2l6ZSooaStrKSArIGo7CisgICAgICAgICAgICBtZW1jcHkocF9saW5lYXJfYWRkcittbSwgcF90aWxlZF9hZGRyK25uLCAxNik7CisKKyAgICAgICAgICAgIGsgPSAyOyAgICAgICAgbm4gPSB0cmFuc19hZGRyICsgKGsgPDwgNik7ICAgICAgICBtbSA9eF9zaXplKihpK2spICsgajsKKyAgICAgICAgICAgIG1lbWNweShwX2xpbmVhcl9hZGRyK21tLCBwX3RpbGVkX2FkZHIrbm4sIDE2KTsKKworICAgICAgICAgICAgayA9IDM7ICAgICAgICBubiA9IHRyYW5zX2FkZHIgKyAoayA8PCA2KTsgICAgICAgIG1tID14X3NpemUqKGkraykgKyBqOworICAgICAgICAgICAgbWVtY3B5KHBfbGluZWFyX2FkZHIrbW0sIHBfdGlsZWRfYWRkcitubiwgMTYpOworCisgICAgICAgICAgICBrID0gNDsgICAgICAgIG5uID0gdHJhbnNfYWRkciArIChrIDw8IDYpOyAgICAgICAgbW0gPXhfc2l6ZSooaStrKSArIGo7CisgICAgICAgICAgICBtZW1jcHkocF9saW5lYXJfYWRkcittbSwgcF90aWxlZF9hZGRyK25uLCAxNik7CisKKyAgICAgICAgICAgIGsgPSA1OyAgICAgICAgbm4gPSB0cmFuc19hZGRyICsgKGsgPDwgNik7ICAgICAgICBtbSA9eF9zaXplKihpK2spICsgajsKKyAgICAgICAgICAgIG1lbWNweShwX2xpbmVhcl9hZGRyK21tLCBwX3RpbGVkX2FkZHIrbm4sIDE2KTsKKworICAgICAgICAgICAgayA9IDY7ICAgICAgICBubiA9IHRyYW5zX2FkZHIgKyAoayA8PCA2KTsgICAgICAgIG1tID14X3NpemUqKGkraykgKyBqOworICAgICAgICAgICAgbWVtY3B5KHBfbGluZWFyX2FkZHIrbW0sIHBfdGlsZWRfYWRkcitubiwgMTYpOworCisgICAgICAgICAgICBrID0gNzsgICAgICAgIG5uID0gdHJhbnNfYWRkciArIChrIDw8IDYpOyAgICAgICAgbW0gPXhfc2l6ZSooaStrKSArIGo7CisgICAgICAgICAgICBtZW1jcHkocF9saW5lYXJfYWRkcittbSwgcF90aWxlZF9hZGRyK25uLCAxNik7CisKKyAgICAgICAgICAgIGsgPSA4OyAgICAgICAgbm4gPSB0cmFuc19hZGRyICsgKGsgPDwgNik7ICAgICAgICBtbSA9eF9zaXplKihpK2spICsgajsKKyAgICAgICAgICAgIG1lbWNweShwX2xpbmVhcl9hZGRyK21tLCBwX3RpbGVkX2FkZHIrbm4sIDE2KTsKKworICAgICAgICAgICAgayA9IDk7ICAgICAgICBubiA9IHRyYW5zX2FkZHIgKyAoayA8PCA2KTsgICAgICAgIG1tID14X3NpemUqKGkraykgKyBqOworICAgICAgICAgICAgbWVtY3B5KHBfbGluZWFyX2FkZHIrbW0sIHBfdGlsZWRfYWRkcitubiwgMTYpOworCisgICAgICAgICAgICBrID0gMTA7ICAgICAgIG5uID0gdHJhbnNfYWRkciArIChrIDw8IDYpOyAgICAgICAgbW0gPXhfc2l6ZSooaStrKSArIGo7CisgICAgICAgICAgICBtZW1jcHkocF9saW5lYXJfYWRkcittbSwgcF90aWxlZF9hZGRyK25uLCAxNik7CisKKyAgICAgICAgICAgIGsgPSAxMTsgICAgICAgbm4gPSB0cmFuc19hZGRyICsgKGsgPDwgNik7ICAgICAgICBtbSA9eF9zaXplKihpK2spICsgajsKKyAgICAgICAgICAgIG1lbWNweShwX2xpbmVhcl9hZGRyK21tLCBwX3RpbGVkX2FkZHIrbm4sIDE2KTsKKworICAgICAgICAgICAgayA9IDEyOyAgICAgICBubiA9IHRyYW5zX2FkZHIgKyAoayA8PCA2KTsgICAgICAgIG1tID14X3NpemUqKGkraykgKyBqOworICAgICAgICAgICAgbWVtY3B5KHBfbGluZWFyX2FkZHIrbW0sIHBfdGlsZWRfYWRkcitubiwgMTYpOworCisgICAgICAgICAgICBrID0gMTM7ICAgICAgIG5uID0gdHJhbnNfYWRkciArIChrIDw8IDYpOyAgICAgICAgbW0gPXhfc2l6ZSooaStrKSArIGo7CisgICAgICAgICAgICBtZW1jcHkocF9saW5lYXJfYWRkcittbSwgcF90aWxlZF9hZGRyK25uLCAxNik7CisKKyAgICAgICAgICAgIGsgPSAxNDsgICAgICAgbm4gPSB0cmFuc19hZGRyICsgKGsgPDwgNik7ICAgICAgICBtbSA9eF9zaXplKihpK2spICsgajsKKyAgICAgICAgICAgIG1lbWNweShwX2xpbmVhcl9hZGRyK21tLCBwX3RpbGVkX2FkZHIrbm4sIDE2KTsKKworICAgICAgICAgICAgayA9IDE1OyAgICAgICBubiA9IHRyYW5zX2FkZHIgKyAoayA8PCA2KTsgICAgICAgIG1tID14X3NpemUqKGkraykgKyBqOworICAgICAgICAgICAgbWVtY3B5KHBfbGluZWFyX2FkZHIrbW0sIHBfdGlsZWRfYWRkcitubiwgMTYpOworICAgICAgICB9CisgICAgfQorfQorI2VuZGlmCmRpZmYgLS1naXQgYS9leHlub3M0L211bHRpbWVkaWEvY29kZWNzL3NlY19jb2RlY3MvdmlkZW8vZXh5bm9zNC9tZmMvZW5jL3NyYy9Tc2JTaXBNZmNFbmNBUEkuYyBiL2V4eW5vczQvbXVsdGltZWRpYS9jb2RlY3Mvc2VjX2NvZGVjcy92aWRlby9leHlub3M0L21mYy9lbmMvc3JjL1NzYlNpcE1mY0VuY0FQSS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjRiOWRmNmMKLS0tIC9kZXYvbnVsbAorKysgYi9leHlub3M0L211bHRpbWVkaWEvY29kZWNzL3NlY19jb2RlY3MvdmlkZW8vZXh5bm9zNC9tZmMvZW5jL3NyYy9Tc2JTaXBNZmNFbmNBUEkuYwpAQCAtMCwwICsxLDg2NSBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxMCBTYW1zdW5nIEVsZWN0cm9uaWNzIENvLiwgTHRkLgorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlIDxzdGRsaWIuaD4KKyNpbmNsdWRlIDx1bmlzdGQuaD4KKyNpbmNsdWRlIDxzdHJpbmcuaD4KKyNpbmNsdWRlIDxmY250bC5oPgorCisjaW5jbHVkZSA8c3lzL3R5cGVzLmg+CisjaW5jbHVkZSA8c3lzL3N0YXQuaD4KKyNpbmNsdWRlIDxzeXMvaW9jdGwuaD4KKyNpbmNsdWRlIDxzeXMvbW1hbi5oPgorI2luY2x1ZGUgPG1hdGguaD4KKworI2luY2x1ZGUgIm1mY19pbnRlcmZhY2UuaCIKKyNpbmNsdWRlICJTc2JTaXBNZmNBcGkuaCIKKworI2luY2x1ZGUgPHV0aWxzL0xvZy5oPgorLyogI2RlZmluZSBMT0dfTkRFQlVHIDAgKi8KKyN1bmRlZiAgTE9HX1RBRworI2RlZmluZSBMT0dfVEFHICJNRkNfRU5DX0FQUCIKKworI2RlZmluZSBfTUZDTElCX01BR0lDX05VTUJFUgkweDkyMjQxMDAxCisKK3N0YXRpYyBjaGFyICptZmNfZGV2X25hbWUgPSBTQU1TVU5HX01GQ19ERVZfTkFNRTsKKwordm9pZCBTc2JTaXBNZmNFbmNTZXRNRkNOYW1lKGNoYXIgKmRldmljZW5hbWUpCit7CisgICAgbWZjX2Rldl9uYW1lID0gZGV2aWNlbmFtZTsKK30KKwordm9pZCAqU3NiU2lwTWZjRW5jT3Blbih2b2lkKQoreworICAgIGludCBoTUZDT3BlbjsKKyAgICBfTUZDTElCICpwQ1RYID0gTlVMTDsKKyAgICB1bnNpZ25lZCBpbnQgbWFwcGVkX2FkZHI7CisgICAgaW50IG1hcHBlZF9zaXplOworICAgIHN0cnVjdCBtZmNfY29tbW9uX2FyZ3MgQ29tbW9uQXJnOworCisgICAgTE9HSSgiWyVzXSBNRkMgTGlicmFyeSBWZXIgJWQuJTAyZCIsX19mdW5jX18sIE1GQ19MSUJfVkVSX01BSk9SLCBNRkNfTElCX1ZFUl9NSU5PUik7CisKKyNpZiAwCisgICAgaWYgKChjb2RlY1R5cGUgIT0gTVBFRzRfRU5DKSAmJgorICAgICAgICAoY29kZWNUeXBlICE9IEgyNjRfRU5DKSAmJgorICAgICAgICAoY29kZWNUeXBlICE9IEgyNjNfRU5DKSkgeworICAgICAgICBMT0dFKCJTc2JTaXBNZmNFbmNPcGVuXSBVbmRlZmluZWQgY29kZWMgdHlwZSIpOworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisjZW5kaWYKKworICAgIGlmIChhY2Nlc3MobWZjX2Rldl9uYW1lLCBGX09LKSAhPSAwKSB7CisgICAgICAgIExPR0UoIlNzYlNpcE1mY0VuY09wZW5dIE1GQyBkZXZpY2Ugbm9kZSBub3QgZXhpc3RzIik7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KKworICAgIGhNRkNPcGVuID0gb3BlbihtZmNfZGV2X25hbWUsIE9fUkRXUiB8IE9fTkRFTEFZKTsKKyAgICBpZiAoaE1GQ09wZW4gPCAwKSB7CisgICAgICAgIExPR0UoIlNzYlNpcE1mY0VuY09wZW5dIE1GQyBPcGVuIGZhaWx1cmUiKTsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorCisgICAgcENUWCA9IChfTUZDTElCICopbWFsbG9jKHNpemVvZihfTUZDTElCKSk7CisgICAgaWYgKHBDVFggPT0gTlVMTCkgeworICAgICAgICBMT0dFKCJTc2JTaXBNZmNFbmNPcGVuXSBtYWxsb2MgZmFpbGVkLiIpOworICAgICAgICBjbG9zZShoTUZDT3Blbik7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KKyAgICBtZW1zZXQocENUWCwgMCwgc2l6ZW9mKF9NRkNMSUIpKTsKKworICAgIG1hcHBlZF9zaXplID0gaW9jdGwoaE1GQ09wZW4sIElPQ1RMX01GQ19HRVRfTU1BUF9TSVpFLCAmQ29tbW9uQXJnKTsKKyAgICBpZiAoKG1hcHBlZF9zaXplIDwgMCkgfHwgKENvbW1vbkFyZy5yZXRfY29kZSAhPSBNRkNfT0spKSB7CisgICAgICAgIExPR0UoIlNzYlNpcE1mY0VuY09wZW5dIElPQ1RMX01GQ19HRVRfTU1BUF9TSVpFIGZhaWxlZCIpOworICAgICAgICBmcmVlKHBDVFgpOworICAgICAgICBjbG9zZShoTUZDT3Blbik7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KKworICAgIG1hcHBlZF9hZGRyID0gKHVuc2lnbmVkIGludCltbWFwKDAsIG1hcHBlZF9zaXplLCBQUk9UX1JFQUQgfCBQUk9UX1dSSVRFLCBNQVBfU0hBUkVELCBoTUZDT3BlbiwgMCk7CisgICAgaWYgKCFtYXBwZWRfYWRkcikgeworICAgICAgICBMT0dFKCJTc2JTaXBNZmNFbmNPcGVuXSBGSU1WNS54IGRyaXZlciBhZGRyZXNzIG1hcHBpbmcgZmFpbGVkIik7CisgICAgICAgIGZyZWUocENUWCk7CisgICAgICAgIGNsb3NlKGhNRkNPcGVuKTsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorCisgICAgcENUWC0+bWFnaWMgPSBfTUZDTElCX01BR0lDX05VTUJFUjsKKyAgICBwQ1RYLT5oTUZDID0gaE1GQ09wZW47CisgICAgcENUWC0+bWFwcGVkX2FkZHIgPSBtYXBwZWRfYWRkcjsKKyAgICBwQ1RYLT5tYXBwZWRfc2l6ZSA9IG1hcHBlZF9zaXplOworICAgIHBDVFgtPmludGVyX2J1ZmZfc3RhdHVzID0gTUZDX1VTRV9OT05FOworCisgICAgcmV0dXJuICh2b2lkICopIHBDVFg7Cit9CisKKwordm9pZCAqU3NiU2lwTWZjRW5jT3BlbkV4dCh2b2lkICp2YWx1ZSkKK3sKKyAgICBpbnQgaE1GQ09wZW47CisgICAgX01GQ0xJQiAqcENUWCA9IE5VTEw7CisgICAgdW5zaWduZWQgaW50IG1hcHBlZF9hZGRyOworICAgIGludCBtYXBwZWRfc2l6ZTsKKyAgICBpbnQgZXJyOworICAgIHN0cnVjdCBtZmNfY29tbW9uX2FyZ3MgQ29tbW9uQXJnOworCisgICAgTE9HSSgiWyVzXSBNRkMgTGlicmFyeSBWZXIgJWQuJTAyZCIsX19mdW5jX18sIE1GQ19MSUJfVkVSX01BSk9SLCBNRkNfTElCX1ZFUl9NSU5PUik7CisKKyNpZiAwCisgICAgaWYgKChjb2RlY1R5cGUgIT0gTVBFRzRfRU5DKSAmJgorICAgICAgICAoY29kZWNUeXBlICE9IEgyNjRfRU5DKSAmJgorICAgICAgICAoY29kZWNUeXBlICE9IEgyNjNfRU5DKSkgeworICAgICAgICBMT0dFKCJTc2JTaXBNZmNFbmNPcGVuXSBVbmRlZmluZWQgY29kZWMgdHlwZSIpOworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisjZW5kaWYKKworICAgIGlmIChhY2Nlc3MobWZjX2Rldl9uYW1lLCBGX09LKSAhPSAwKSB7CisgICAgICAgIExPR0UoIlNzYlNpcE1mY0VuY09wZW5FeHRdIE1GQyBkZXZpY2Ugbm9kZSBub3QgZXhpc3RzIik7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KKworICAgIGhNRkNPcGVuID0gb3BlbihtZmNfZGV2X25hbWUsIE9fUkRXUiB8IE9fTkRFTEFZKTsKKyAgICBpZiAoaE1GQ09wZW4gPCAwKSB7CisgICAgICAgIExPR0UoIlNzYlNpcE1mY0VuY09wZW5FeHRdIE1GQyBPcGVuIGZhaWx1cmUiKTsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorCisgICAgcENUWCA9IChfTUZDTElCICopbWFsbG9jKHNpemVvZihfTUZDTElCKSk7CisgICAgaWYgKHBDVFggPT0gTlVMTCkgeworICAgICAgICBMT0dFKCJTc2JTaXBNZmNFbmNPcGVuRXh0XSBtYWxsb2MgZmFpbGVkLiIpOworICAgICAgICBjbG9zZShoTUZDT3Blbik7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KKyAgICBtZW1zZXQocENUWCwgMCwgc2l6ZW9mKF9NRkNMSUIpKTsKKworICAgIENvbW1vbkFyZy5hcmdzLm1lbV9hbGxvYy5idWZfY2FjaGVfdHlwZSA9ICooU1NCSVBfTUZDX0JVRkZFUl9UWVBFICopdmFsdWU7CisKKyAgICBlcnIgPSBpb2N0bChoTUZDT3BlbiwgSU9DVExfTUZDX1NFVF9CVUZfQ0FDSEUsICZDb21tb25BcmcpOworICAgIGlmICgoZXJyIDwgMCkgfHwgKENvbW1vbkFyZy5yZXRfY29kZSAhPSBNRkNfT0spKSB7CisgICAgICAgIExPR0UoIlNzYlNpcE1mY0VuY09wZW5FeHRdIElPQ1RMX01GQ19TRVRfQlVGX0NBQ0hFIGZhaWxlZCIpOworICAgICAgICBmcmVlKHBDVFgpOworICAgICAgICBjbG9zZShoTUZDT3Blbik7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KKworICAgIG1hcHBlZF9zaXplID0gaW9jdGwoaE1GQ09wZW4sIElPQ1RMX01GQ19HRVRfTU1BUF9TSVpFLCAmQ29tbW9uQXJnKTsKKyAgICBpZiAoKG1hcHBlZF9zaXplIDwgMCkgfHwgKENvbW1vbkFyZy5yZXRfY29kZSAhPSBNRkNfT0spKSB7CisgICAgICAgIExPR0UoIlNzYlNpcE1mY0VuY09wZW5FeHRdIElPQ1RMX01GQ19HRVRfTU1BUF9TSVpFIGZhaWxlZCIpOworICAgICAgICBmcmVlKHBDVFgpOworICAgICAgICBjbG9zZShoTUZDT3Blbik7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KKworICAgIG1hcHBlZF9hZGRyID0gKHVuc2lnbmVkIGludCltbWFwKDAsIG1hcHBlZF9zaXplLCBQUk9UX1JFQUQgfCBQUk9UX1dSSVRFLCBNQVBfU0hBUkVELCBoTUZDT3BlbiwgMCk7CisgICAgaWYgKCFtYXBwZWRfYWRkcikgeworICAgICAgICBMT0dFKCJTc2JTaXBNZmNFbmNPcGVuRXh0XSBGSU1WNS54IGRyaXZlciBhZGRyZXNzIG1hcHBpbmcgZmFpbGVkIik7CisgICAgICAgIGZyZWUocENUWCk7CisgICAgICAgIGNsb3NlKGhNRkNPcGVuKTsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorCisgICAgcENUWC0+bWFnaWMgPSBfTUZDTElCX01BR0lDX05VTUJFUjsKKyAgICBwQ1RYLT5oTUZDID0gaE1GQ09wZW47CisgICAgcENUWC0+bWFwcGVkX2FkZHIgPSBtYXBwZWRfYWRkcjsKKyAgICBwQ1RYLT5tYXBwZWRfc2l6ZSA9IG1hcHBlZF9zaXplOworICAgIHBDVFgtPmludGVyX2J1ZmZfc3RhdHVzID0gTUZDX1VTRV9OT05FOworCisgICAgcmV0dXJuICh2b2lkICopIHBDVFg7Cit9CisKK1NTQlNJUF9NRkNfRVJST1JfQ09ERSBTc2JTaXBNZmNFbmNJbml0KHZvaWQgKm9wZW5IYW5kbGUsIHZvaWQgKnBhcmFtKQoreworICAgIGludCByZXRfY29kZTsKKworICAgIF9NRkNMSUIgKnBDVFg7CisgICAgc3RydWN0IG1mY19jb21tb25fYXJncyBFbmNBcmc7CisgICAgU1NCU0lQX01GQ19FTkNfSDI2NF9QQVJBTSAqaDI2NF9hcmc7CisgICAgU1NCU0lQX01GQ19FTkNfTVBFRzRfUEFSQU0gKm1wZWc0X2FyZzsKKyAgICBTU0JTSVBfTUZDX0VOQ19IMjYzX1BBUkFNICpoMjYzX2FyZzsKKworICAgIHBDVFggID0gKF9NRkNMSUIgKikgb3BlbkhhbmRsZTsKKyAgICBtZW1zZXQoJkVuY0FyZywgMCwgc2l6ZW9mKHN0cnVjdCBtZmNfY29tbW9uX2FyZ3MpKTsKKworICAgIHBDVFgtPmVuY29kZV9jbnQgPSAwOworCisgICAgbXBlZzRfYXJnID0gKFNTQlNJUF9NRkNfRU5DX01QRUc0X1BBUkFNKilwYXJhbTsKKyAgICBpZiAobXBlZzRfYXJnLT5jb2RlY1R5cGUgPT0gTVBFRzRfRU5DKSB7CisgICAgICAgIHBDVFgtPmNvZGVjVHlwZT0gTVBFRzRfRU5DOworICAgIH0gZWxzZSB7CisgICAgICAgIGgyNjNfYXJnID0gKFNTQlNJUF9NRkNfRU5DX0gyNjNfUEFSQU0qKXBhcmFtOworICAgICAgICBpZiAoaDI2M19hcmctPmNvZGVjVHlwZSA9PSBIMjYzX0VOQykgeworICAgICAgICAgICAgcENUWC0+Y29kZWNUeXBlID0gSDI2M19FTkM7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBoMjY0X2FyZyA9IChTU0JTSVBfTUZDX0VOQ19IMjY0X1BBUkFNKilwYXJhbTsKKyAgICAgICAgICAgIGlmIChoMjY0X2FyZy0+Y29kZWNUeXBlID09IEgyNjRfRU5DKSB7CisgICAgICAgICAgICAgICAgcENUWC0+Y29kZWNUeXBlID0gSDI2NF9FTkM7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIExPR0UoIlNzYlNpcE1mY0VuY0luaXRdIFVuZGVmaW5lZCBjb2RlYyB0eXBlIik7CisgICAgICAgICAgICAgICAgcmV0dXJuIE1GQ19SRVRfSU5WQUxJRF9QQVJBTTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIExPR0koIlNzYlNpcE1mY0VuY0luaXRdIEVuY29kZSBJbml0IHN0YXJ0Iik7CisKKyAgICBzd2l0Y2ggKHBDVFgtPmNvZGVjVHlwZSkgeworICAgIGNhc2UgTVBFRzRfRU5DOgorICAgICAgICBMT0dJKCJTc2JTaXBNZmNFbmNJbml0XSBNUEVHNCBFbmNvZGUiKTsKKyAgICAgICAgbXBlZzRfYXJnID0gKFNTQlNJUF9NRkNfRU5DX01QRUc0X1BBUkFNICopcGFyYW07CisKKyAgICAgICAgcENUWC0+d2lkdGggPSBtcGVnNF9hcmctPlNvdXJjZVdpZHRoOworICAgICAgICBwQ1RYLT5oZWlnaHQgPSBtcGVnNF9hcmctPlNvdXJjZUhlaWdodDsKKyAgICAgICAgYnJlYWs7CisKKyAgICBjYXNlIEgyNjNfRU5DOgorICAgICAgICBMT0dJKCJTc2JTaXBNZmNFbmNJbml0XSBIMjYzIEVuY29kZSIpOworICAgICAgICBoMjYzX2FyZyA9IChTU0JTSVBfTUZDX0VOQ19IMjYzX1BBUkFNICopcGFyYW07CisKKyAgICAgICAgcENUWC0+d2lkdGggPSBoMjYzX2FyZy0+U291cmNlV2lkdGg7CisgICAgICAgIHBDVFgtPmhlaWdodCA9IGgyNjNfYXJnLT5Tb3VyY2VIZWlnaHQ7CisgICAgICAgIGJyZWFrOworCisgICAgY2FzZSBIMjY0X0VOQzoKKyAgICAgICAgTE9HSSgiU3NiU2lwTWZjRW5jSW5pdF0gSDI2NCBFbmNvZGUiKTsKKyAgICAgICAgaDI2NF9hcmcgPSAoU1NCU0lQX01GQ19FTkNfSDI2NF9QQVJBTSAqKXBhcmFtOworCisgICAgICAgIHBDVFgtPndpZHRoID0gaDI2NF9hcmctPlNvdXJjZVdpZHRoOworICAgICAgICBwQ1RYLT5oZWlnaHQgPSBoMjY0X2FyZy0+U291cmNlSGVpZ2h0OworICAgICAgICBicmVhazsKKworICAgIGRlZmF1bHQ6CisgICAgICAgIGJyZWFrOworICAgIH0KKworICAgIHN3aXRjaCAocENUWC0+Y29kZWNUeXBlKSB7CisgICAgY2FzZSBNUEVHNF9FTkM6CisgICAgICAgIG1wZWc0X2FyZyA9IChTU0JTSVBfTUZDX0VOQ19NUEVHNF9QQVJBTSAqKXBhcmFtOworCisgICAgICAgIEVuY0FyZy5hcmdzLmVuY19pbml0LmNtbi5pbl9jb2RlY190eXBlID0gcENUWC0+Y29kZWNUeXBlOworCisgICAgICAgIEVuY0FyZy5hcmdzLmVuY19pbml0LmNtbi5pbl93aWR0aCA9IG1wZWc0X2FyZy0+U291cmNlV2lkdGg7CisgICAgICAgIEVuY0FyZy5hcmdzLmVuY19pbml0LmNtbi5pbl9oZWlnaHQgPSBtcGVnNF9hcmctPlNvdXJjZUhlaWdodDsKKyAgICAgICAgRW5jQXJnLmFyZ3MuZW5jX2luaXQuY21uLmluX2dvcF9udW0gPSBtcGVnNF9hcmctPklEUlBlcmlvZDsKKworICAgICAgICBFbmNBcmcuYXJncy5lbmNfaW5pdC5jbW4uaW5fbXNfbW9kZSA9IG1wZWc0X2FyZy0+U2xpY2VNb2RlOworICAgICAgICBFbmNBcmcuYXJncy5lbmNfaW5pdC5jbW4uaW5fbXNfYXJnID0gbXBlZzRfYXJnLT5TbGljZUFyZ3VtZW50OworICAgICAgICBFbmNBcmcuYXJncy5lbmNfaW5pdC5jbW4uaW5fb3V0cHV0X21vZGUgPSBtcGVnNF9hcmctPk91dHB1dE1vZGU7CisKKyAgICAgICAgRW5jQXJnLmFyZ3MuZW5jX2luaXQuY21uLmluX21iX3JlZnJlc2ggPSBtcGVnNF9hcmctPlJhbmRvbUludHJhTUJSZWZyZXNoOworCisgICAgICAgIC8qIHJhdGUgY29udHJvbCovCisgICAgICAgIEVuY0FyZy5hcmdzLmVuY19pbml0LmNtbi5pbl9yY19mcl9lbiA9IG1wZWc0X2FyZy0+RW5hYmxlRlJNUmF0ZUNvbnRyb2w7CisgICAgICAgIGlmICgobXBlZzRfYXJnLT5RU0NvZGVNaW4gPiAzMSkgfHwgKG1wZWc0X2FyZy0+UVNDb2RlTWF4ID4gMzEpKSB7CisgICAgICAgICAgICBMT0dFKCJTc2JTaXBNZmNFbmNJbml0XSBObyBzdWNoIE1pbi9NYXggUVAgaXMgc3VwcG9ydGVkIik7CisgICAgICAgICAgICByZXR1cm4gTUZDX1JFVF9JTlZBTElEX1BBUkFNOworICAgICAgICB9CisgICAgICAgIEVuY0FyZy5hcmdzLmVuY19pbml0LmNtbi5pbl9yY19xYm91bmRfbWluID0gbXBlZzRfYXJnLT5RU0NvZGVNaW47CisgICAgICAgIEVuY0FyZy5hcmdzLmVuY19pbml0LmNtbi5pbl9yY19xYm91bmRfbWF4ID0gbXBlZzRfYXJnLT5RU0NvZGVNYXg7CisgICAgICAgIEVuY0FyZy5hcmdzLmVuY19pbml0LmNtbi5pbl9yY19ycGFyYSA9IG1wZWc0X2FyZy0+Q0JSUGVyaW9kUmY7CisKKyAgICAgICAgLyogcGFkIGNvbnRyb2wgKi8KKyAgICAgICAgRW5jQXJnLmFyZ3MuZW5jX2luaXQuY21uLmluX3BhZF9jdHJsX29uID0gbXBlZzRfYXJnLT5QYWRDb250cm9sT247CisgICAgICAgIGlmICgobXBlZzRfYXJnLT5MdW1hUGFkVmFsID4gMjU1KSB8fCAobXBlZzRfYXJnLT5DYlBhZFZhbCA+IDI1NSkgfHwgKG1wZWc0X2FyZy0+Q3JQYWRWYWwgPiAyNTUpKSB7CisgICAgICAgICAgICBMT0dFKCJTc2JTaXBNZmNFbmNJbml0XSBObyBzdWNoIFBhZCB2YWx1ZSBpcyBzdXBwb3J0ZWQiKTsKKyAgICAgICAgICAgIHJldHVybiBNRkNfUkVUX0lOVkFMSURfUEFSQU07CisgICAgICAgIH0KKyAgICAgICAgRW5jQXJnLmFyZ3MuZW5jX2luaXQuY21uLmluX3lfcGFkX3ZhbCA9IG1wZWc0X2FyZy0+THVtYVBhZFZhbDsKKyAgICAgICAgRW5jQXJnLmFyZ3MuZW5jX2luaXQuY21uLmluX2NiX3BhZF92YWwgPSBtcGVnNF9hcmctPkNiUGFkVmFsOworICAgICAgICBFbmNBcmcuYXJncy5lbmNfaW5pdC5jbW4uaW5fY3JfcGFkX3ZhbCA9IG1wZWc0X2FyZy0+Q3JQYWRWYWw7CisKKyAgICAgICAgLyogSW5wdXQgc3RyZWFtIE1vZGUgIE5WMTJfTGluZWFyIG9yIE5WMTJfVGlsZSovCisgICAgICAgIEVuY0FyZy5hcmdzLmVuY19pbml0LmNtbi5pbl9mcmFtZV9tYXAgPSBtcGVnNF9hcmctPkZyYW1lTWFwOworCisgICAgICAgIEVuY0FyZy5hcmdzLmVuY19pbml0LmNtbi5pbl9yY19iaXRyYXRlID0gbXBlZzRfYXJnLT5CaXRyYXRlOworICAgICAgICBpZiAoKG1wZWc0X2FyZy0+RnJhbWVRcCA+IDMxKSB8fCAobXBlZzRfYXJnLT5GcmFtZVFwX1AgPiAzMSkpIHsKKyAgICAgICAgICAgIExPR0UoIlNzYlNpcE1mY0VuY0luaXRdIE5vIHN1Y2ggRnJhbWVRcCBpcyBzdXBwb3J0ZWQiKTsKKyAgICAgICAgICAgIHJldHVybiBNRkNfUkVUX0lOVkFMSURfUEFSQU07CisgICAgICAgIH0KKyAgICAgICAgRW5jQXJnLmFyZ3MuZW5jX2luaXQuY21uLmluX3ZvcF9xdWFudCA9IG1wZWc0X2FyZy0+RnJhbWVRcDsKKyAgICAgICAgRW5jQXJnLmFyZ3MuZW5jX2luaXQuY21uLmluX3ZvcF9xdWFudF9wID0gbXBlZzRfYXJnLT5GcmFtZVFwX1A7CisKKyAgICAgICAgLyogTVBFRzQgb25seSAqLworICAgICAgICBFbmNBcmcuYXJncy5lbmNfaW5pdC5jb2RlYy5tcGVnNC5pbl9wcm9maWxlID0gbXBlZzRfYXJnLT5Qcm9maWxlSURDOworICAgICAgICBFbmNBcmcuYXJncy5lbmNfaW5pdC5jb2RlYy5tcGVnNC5pbl9sZXZlbCA9IG1wZWc0X2FyZy0+TGV2ZWxJREM7CisKKyAgICAgICAgaWYgKG1wZWc0X2FyZy0+RnJhbWVRcF9CID4gMzEpIHsKKyAgICAgICAgICAgIExPR0UoIlNzYlNpcE1mY0VuY0luaXRdIE5vIHN1Y2ggRnJhbWVRcCBpcyBzdXBwb3J0ZWQiKTsKKyAgICAgICAgICAgIHJldHVybiBNRkNfUkVUX0lOVkFMSURfUEFSQU07CisgICAgICAgIH0KKyAgICAgICAgRW5jQXJnLmFyZ3MuZW5jX2luaXQuY29kZWMubXBlZzQuaW5fdm9wX3F1YW50X2IgPSBtcGVnNF9hcmctPkZyYW1lUXBfQjsKKworICAgICAgICBpZiAobXBlZzRfYXJnLT5OdW1iZXJCRnJhbWVzID4gMikgeworICAgICAgICAgICAgTE9HRSgiU3NiU2lwTWZjRW5jSW5pdF0gTm8gc3VjaCBCZnJhbWVOdW0gaXMgc3VwcG9ydGVkIik7CisgICAgICAgICAgICByZXR1cm4gTUZDX1JFVF9JTlZBTElEX1BBUkFNOworICAgICAgICB9CisgICAgICAgIEVuY0FyZy5hcmdzLmVuY19pbml0LmNvZGVjLm1wZWc0LmluX2JmcmFtZW51bSA9IG1wZWc0X2FyZy0+TnVtYmVyQkZyYW1lczsKKworICAgICAgICBFbmNBcmcuYXJncy5lbmNfaW5pdC5jb2RlYy5tcGVnNC5pbl9xdWFydF9waXhlbCA9IG1wZWc0X2FyZy0+RGlzYWJsZVFwZWxNRTsKKworICAgICAgICBFbmNBcmcuYXJncy5lbmNfaW5pdC5jb2RlYy5tcGVnNC5pbl9UaW1lSW5jcmVhbWVudFJlcyA9IG1wZWc0X2FyZy0+VGltZUluY3JlYW1lbnRSZXM7CisgICAgICAgIEVuY0FyZy5hcmdzLmVuY19pbml0LmNvZGVjLm1wZWc0LmluX1ZvcFRpbWVJbmNyZWFtZW50ID0gbXBlZzRfYXJnLT5Wb3BUaW1lSW5jcmVhbWVudDsKKworICAgICAgICBicmVhazsKKworICAgIGNhc2UgSDI2M19FTkM6CisgICAgICAgIGgyNjNfYXJnID0gKFNTQlNJUF9NRkNfRU5DX0gyNjNfUEFSQU0gKilwYXJhbTsKKworICAgICAgICBFbmNBcmcuYXJncy5lbmNfaW5pdC5jbW4uaW5fY29kZWNfdHlwZSA9IHBDVFgtPmNvZGVjVHlwZTsKKworICAgICAgICBFbmNBcmcuYXJncy5lbmNfaW5pdC5jbW4uaW5fd2lkdGggPSBoMjYzX2FyZy0+U291cmNlV2lkdGg7CisgICAgICAgIEVuY0FyZy5hcmdzLmVuY19pbml0LmNtbi5pbl9oZWlnaHQgPSBoMjYzX2FyZy0+U291cmNlSGVpZ2h0OworICAgICAgICBFbmNBcmcuYXJncy5lbmNfaW5pdC5jbW4uaW5fZ29wX251bSA9IGgyNjNfYXJnLT5JRFJQZXJpb2Q7CisKKyAgICAgICAgRW5jQXJnLmFyZ3MuZW5jX2luaXQuY21uLmluX21zX21vZGUgPSBoMjYzX2FyZy0+U2xpY2VNb2RlOworICAgICAgICBFbmNBcmcuYXJncy5lbmNfaW5pdC5jbW4uaW5fbXNfYXJnID0gMDsKKyAgICAgICAgRW5jQXJnLmFyZ3MuZW5jX2luaXQuY21uLmluX291dHB1dF9tb2RlID0gRlJBTUU7ICAvKiBub3Qgc3VwcG9ydCB0byBzbGljZSBvdXRwdXQgbW9kZSAqLworCisgICAgICAgIEVuY0FyZy5hcmdzLmVuY19pbml0LmNtbi5pbl9tYl9yZWZyZXNoID0gaDI2M19hcmctPlJhbmRvbUludHJhTUJSZWZyZXNoOworCisgICAgICAgIC8qIHJhdGUgY29udHJvbCovCisgICAgICAgIEVuY0FyZy5hcmdzLmVuY19pbml0LmNtbi5pbl9yY19mcl9lbiA9IGgyNjNfYXJnLT5FbmFibGVGUk1SYXRlQ29udHJvbDsKKyAgICAgICAgaWYgKChoMjYzX2FyZy0+UVNDb2RlTWluID4gMzEpIHx8IChoMjYzX2FyZy0+UVNDb2RlTWF4ID4gMzEpKSB7CisgICAgICAgICAgICBMT0dFKCJTc2JTaXBNZmNFbmNJbml0XSBObyBzdWNoIE1pbi9NYXggUVAgaXMgc3VwcG9ydGVkIik7CisgICAgICAgICAgICByZXR1cm4gTUZDX1JFVF9JTlZBTElEX1BBUkFNOworICAgICAgICB9CisgICAgICAgIEVuY0FyZy5hcmdzLmVuY19pbml0LmNtbi5pbl9yY19xYm91bmRfbWluID0gaDI2M19hcmctPlFTQ29kZU1pbjsKKyAgICAgICAgRW5jQXJnLmFyZ3MuZW5jX2luaXQuY21uLmluX3JjX3Fib3VuZF9tYXggPSBoMjYzX2FyZy0+UVNDb2RlTWF4OworICAgICAgICBFbmNBcmcuYXJncy5lbmNfaW5pdC5jbW4uaW5fcmNfcnBhcmEgPSBoMjYzX2FyZy0+Q0JSUGVyaW9kUmY7CisKKyAgICAgICAgLyogcGFkIGNvbnRyb2wgKi8KKyAgICAgICAgRW5jQXJnLmFyZ3MuZW5jX2luaXQuY21uLmluX3BhZF9jdHJsX29uID0gaDI2M19hcmctPlBhZENvbnRyb2xPbjsKKyAgICAgICAgaWYgKChoMjYzX2FyZy0+THVtYVBhZFZhbCA+IDI1NSkgfHwgKGgyNjNfYXJnLT5DYlBhZFZhbCA+IDI1NSkgfHwgKGgyNjNfYXJnLT5DclBhZFZhbCA+IDI1NSkpIHsKKyAgICAgICAgICAgIExPR0UoIlNzYlNpcE1mY0VuY0luaXRdIE5vIHN1Y2ggUGFkIHZhbHVlIGlzIHN1cHBvcnRlZCIpOworICAgICAgICAgICAgcmV0dXJuIE1GQ19SRVRfSU5WQUxJRF9QQVJBTTsKKyAgICAgICAgfQorICAgICAgICBFbmNBcmcuYXJncy5lbmNfaW5pdC5jbW4uaW5feV9wYWRfdmFsID0gaDI2M19hcmctPkx1bWFQYWRWYWw7CisgICAgICAgIEVuY0FyZy5hcmdzLmVuY19pbml0LmNtbi5pbl9jYl9wYWRfdmFsID0gaDI2M19hcmctPkNiUGFkVmFsOworICAgICAgICBFbmNBcmcuYXJncy5lbmNfaW5pdC5jbW4uaW5fY3JfcGFkX3ZhbCA9IGgyNjNfYXJnLT5DclBhZFZhbDsKKworICAgICAgICAvKiBJbnB1dCBzdHJlYW0gTW9kZSAgTlYxMl9MaW5lYXIgb3IgTlYxMl9UaWxlKi8KKyAgICAgICAgRW5jQXJnLmFyZ3MuZW5jX2luaXQuY21uLmluX2ZyYW1lX21hcCA9IGgyNjNfYXJnLT5GcmFtZU1hcDsKKworICAgICAgICBFbmNBcmcuYXJncy5lbmNfaW5pdC5jbW4uaW5fcmNfYml0cmF0ZSA9IGgyNjNfYXJnLT5CaXRyYXRlOworICAgICAgICBpZiAoKGgyNjNfYXJnLT5GcmFtZVFwID4gMzEpIHx8IChoMjYzX2FyZy0+RnJhbWVRcF9QID4gMzEpKSB7CisgICAgICAgICAgICBMT0dFKCJTc2JTaXBNZmNFbmNJbml0XSBObyBzdWNoIEZyYW1lUXAgaXMgc3VwcG9ydGVkIik7CisgICAgICAgICAgICByZXR1cm4gTUZDX1JFVF9JTlZBTElEX1BBUkFNOworICAgICAgICB9CisgICAgICAgIEVuY0FyZy5hcmdzLmVuY19pbml0LmNtbi5pbl92b3BfcXVhbnQgPSBoMjYzX2FyZy0+RnJhbWVRcDsKKyAgICAgICAgRW5jQXJnLmFyZ3MuZW5jX2luaXQuY21uLmluX3ZvcF9xdWFudF9wID0gaDI2M19hcmctPkZyYW1lUXBfUDsKKworICAgICAgICAvKiBILjI2MyBvbmx5ICovCisgICAgICAgIEVuY0FyZy5hcmdzLmVuY19pbml0LmNvZGVjLmgyNjMuaW5fcmNfZnJhbWVyYXRlID0gaDI2M19hcmctPkZyYW1lUmF0ZTsKKworICAgICAgICBicmVhazsKKworICAgIGNhc2UgSDI2NF9FTkM6CisgICAgICAgIGgyNjRfYXJnID0gKFNTQlNJUF9NRkNfRU5DX0gyNjRfUEFSQU0gKilwYXJhbTsKKworICAgICAgICBFbmNBcmcuYXJncy5lbmNfaW5pdC5jbW4uaW5fY29kZWNfdHlwZSA9IEgyNjRfRU5DOworCisgICAgICAgIEVuY0FyZy5hcmdzLmVuY19pbml0LmNtbi5pbl93aWR0aCA9IGgyNjRfYXJnLT5Tb3VyY2VXaWR0aDsKKyAgICAgICAgRW5jQXJnLmFyZ3MuZW5jX2luaXQuY21uLmluX2hlaWdodCA9IGgyNjRfYXJnLT5Tb3VyY2VIZWlnaHQ7CisgICAgICAgIEVuY0FyZy5hcmdzLmVuY19pbml0LmNtbi5pbl9nb3BfbnVtID0gaDI2NF9hcmctPklEUlBlcmlvZDsKKworICAgICAgICBpZiAoKGgyNjRfYXJnLT5TbGljZU1vZGUgPT0gMCl8fChoMjY0X2FyZy0+U2xpY2VNb2RlID09IDEpfHwKKyAgICAgICAgICAgIChoMjY0X2FyZy0+U2xpY2VNb2RlID09IDIpfHwoaDI2NF9hcmctPlNsaWNlTW9kZSA9PSA0KSkgeworICAgICAgICAgICAgRW5jQXJnLmFyZ3MuZW5jX2luaXQuY21uLmluX21zX21vZGUgPSBoMjY0X2FyZy0+U2xpY2VNb2RlOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgTE9HRSgiU3NiU2lwTWZjRW5jSW5pdF0gTm8gc3VjaCBzbGljZSBtb2RlIGlzIHN1cHBvcnRlZCIpOworICAgICAgICAgICAgcmV0dXJuIE1GQ19SRVRfSU5WQUxJRF9QQVJBTTsKKyAgICAgICAgfQorICAgICAgICBFbmNBcmcuYXJncy5lbmNfaW5pdC5jbW4uaW5fbXNfYXJnID0gaDI2NF9hcmctPlNsaWNlQXJndW1lbnQ7CisgICAgICAgIEVuY0FyZy5hcmdzLmVuY19pbml0LmNtbi5pbl9vdXRwdXRfbW9kZSA9IGgyNjRfYXJnLT5PdXRwdXRNb2RlOworCisgICAgICAgIEVuY0FyZy5hcmdzLmVuY19pbml0LmNtbi5pbl9tYl9yZWZyZXNoID0gaDI2NF9hcmctPlJhbmRvbUludHJhTUJSZWZyZXNoOworICAgICAgICAvKiBwYWQgY29udHJvbCAqLworICAgICAgICBFbmNBcmcuYXJncy5lbmNfaW5pdC5jbW4uaW5fcGFkX2N0cmxfb24gPSBoMjY0X2FyZy0+UGFkQ29udHJvbE9uOworICAgICAgICBpZiAoKGgyNjRfYXJnLT5MdW1hUGFkVmFsID4gMjU1KSB8fCAoaDI2NF9hcmctPkNiUGFkVmFsID4gMjU1KSB8fCAoaDI2NF9hcmctPkNyUGFkVmFsID4gMjU1KSkgeworICAgICAgICAgICAgTE9HRSgiU3NiU2lwTWZjRW5jSW5pdF0gTm8gc3VjaCBQYWQgdmFsdWUgaXMgc3VwcG9ydGVkIik7CisgICAgICAgICAgICByZXR1cm4gTUZDX1JFVF9JTlZBTElEX1BBUkFNOworICAgICAgICB9CisgICAgICAgIEVuY0FyZy5hcmdzLmVuY19pbml0LmNtbi5pbl95X3BhZF92YWwgPSBoMjY0X2FyZy0+THVtYVBhZFZhbDsKKyAgICAgICAgRW5jQXJnLmFyZ3MuZW5jX2luaXQuY21uLmluX2NiX3BhZF92YWwgPSBoMjY0X2FyZy0+Q2JQYWRWYWw7CisgICAgICAgIEVuY0FyZy5hcmdzLmVuY19pbml0LmNtbi5pbl9jcl9wYWRfdmFsID0gaDI2NF9hcmctPkNyUGFkVmFsOworCisgICAgICAgIC8qIElucHV0IHN0cmVhbSBNb2RlICBOVjEyX0xpbmVhciBvciBOVjEyX1RpbGUqLworICAgICAgICBFbmNBcmcuYXJncy5lbmNfaW5pdC5jbW4uaW5fZnJhbWVfbWFwID0gaDI2NF9hcmctPkZyYW1lTWFwOworCisgICAgICAgIC8qIHJhdGUgY29udHJvbCovCisgICAgICAgIEVuY0FyZy5hcmdzLmVuY19pbml0LmNtbi5pbl9yY19mcl9lbiA9IGgyNjRfYXJnLT5FbmFibGVGUk1SYXRlQ29udHJvbDsKKyAgICAgICAgRW5jQXJnLmFyZ3MuZW5jX2luaXQuY21uLmluX3JjX2JpdHJhdGUgPSBoMjY0X2FyZy0+Qml0cmF0ZTsKKyAgICAgICAgaWYgKChoMjY0X2FyZy0+RnJhbWVRcCA+IDUxKSB8fCAoaDI2NF9hcmctPkZyYW1lUXBfUCA+IDUxKSkgeworICAgICAgICAgICAgTE9HRSgiU3NiU2lwTWZjRW5jSW5pdF0gTm8gc3VjaCBGcmFtZVFwIGlzIHN1cHBvcnRlZCIpOworICAgICAgICAgICAgcmV0dXJuIE1GQ19SRVRfSU5WQUxJRF9QQVJBTTsKKyAgICAgICAgfQorICAgICAgICBFbmNBcmcuYXJncy5lbmNfaW5pdC5jbW4uaW5fdm9wX3F1YW50ID0gaDI2NF9hcmctPkZyYW1lUXA7CisgICAgICAgIEVuY0FyZy5hcmdzLmVuY19pbml0LmNtbi5pbl92b3BfcXVhbnRfcCA9IGgyNjRfYXJnLT5GcmFtZVFwX1A7CisKKyAgICAgICAgaWYgKChoMjY0X2FyZy0+UVNDb2RlTWluID4gNTEpIHx8IChoMjY0X2FyZy0+UVNDb2RlTWF4ID4gNTEpKSB7CisgICAgICAgICAgICBMT0dFKCJTc2JTaXBNZmNFbmNJbml0XSBObyBzdWNoIE1pbi9NYXggUVAgaXMgc3VwcG9ydGVkIik7CisgICAgICAgICAgICByZXR1cm4gTUZDX1JFVF9JTlZBTElEX1BBUkFNOworICAgICAgICB9CisgICAgICAgIEVuY0FyZy5hcmdzLmVuY19pbml0LmNtbi5pbl9yY19xYm91bmRfbWluID0gaDI2NF9hcmctPlFTQ29kZU1pbjsKKyAgICAgICAgRW5jQXJnLmFyZ3MuZW5jX2luaXQuY21uLmluX3JjX3Fib3VuZF9tYXggPSBoMjY0X2FyZy0+UVNDb2RlTWF4OworICAgICAgICBFbmNBcmcuYXJncy5lbmNfaW5pdC5jbW4uaW5fcmNfcnBhcmEgPSBoMjY0X2FyZy0+Q0JSUGVyaW9kUmY7CisKKworICAgICAgICAvKiBILjI2NCBPbmx5ICovCisgICAgICAgIEVuY0FyZy5hcmdzLmVuY19pbml0LmNvZGVjLmgyNjQuaW5fcHJvZmlsZSA9IGgyNjRfYXJnLT5Qcm9maWxlSURDOworICAgICAgICBFbmNBcmcuYXJncy5lbmNfaW5pdC5jb2RlYy5oMjY0LmluX2xldmVsID0gaDI2NF9hcmctPkxldmVsSURDOworCisgICAgICAgIGlmIChoMjY0X2FyZy0+RnJhbWVRcF9CID4gNTEpIHsKKyAgICAgICAgICAgIExPR0UoIlNzYlNpcE1mY0VuY0luaXRdIE5vIHN1Y2ggRnJhbWVRcCBpcyBzdXBwb3J0ZWQiKTsKKyAgICAgICAgICAgIHJldHVybiBNRkNfUkVUX0lOVkFMSURfUEFSQU07CisgICAgICAgIH0KKyAgICAgICAgRW5jQXJnLmFyZ3MuZW5jX2luaXQuY29kZWMuaDI2NC5pbl92b3BfcXVhbnRfYiA9IGgyNjRfYXJnLT5GcmFtZVFwX0I7CisKKyAgICAgICAgaWYgKGgyNjRfYXJnLT5OdW1iZXJCRnJhbWVzID4gMikgeworICAgICAgICAgICAgTE9HRSgiU3NiU2lwTWZjRW5jSW5pdF0gTm8gc3VjaCBCZnJhbWVOdW0gaXMgc3VwcG9ydGVkIik7CisgICAgICAgICAgICByZXR1cm4gTUZDX1JFVF9JTlZBTElEX1BBUkFNOworICAgICAgICB9CisgICAgICAgIEVuY0FyZy5hcmdzLmVuY19pbml0LmNvZGVjLmgyNjQuaW5fYmZyYW1lbnVtID0gaDI2NF9hcmctPk51bWJlckJGcmFtZXM7CisKKyAgICAgICAgRW5jQXJnLmFyZ3MuZW5jX2luaXQuY29kZWMuaDI2NC5pbl9pbnRlcmxhY2VfbW9kZSA9IGgyNjRfYXJnLT5QaWN0dXJlSW50ZXJsYWNlOworCisgICAgICAgIGlmICgoaDI2NF9hcmctPk51bWJlclJlZkZvclBmcmFtZXMgPiAyKXx8KGgyNjRfYXJnLT5OdW1iZXJSZWZlcmVuY2VGcmFtZXMgPjIpKSB7CisgICAgICAgICAgICBMT0dFKCJTc2JTaXBNZmNFbmNJbml0XSBObyBzdWNoIHJlZiBOdW0gaXMgc3VwcG9ydGVkIik7CisgICAgICAgICAgICByZXR1cm4gTUZDX1JFVF9JTlZBTElEX1BBUkFNOworICAgICAgICB9CisgICAgICAgIEVuY0FyZy5hcmdzLmVuY19pbml0LmNvZGVjLmgyNjQuaW5fcmVmZXJlbmNlX251bSA9IGgyNjRfYXJnLT5OdW1iZXJSZWZlcmVuY2VGcmFtZXM7CisgICAgICAgIEVuY0FyZy5hcmdzLmVuY19pbml0LmNvZGVjLmgyNjQuaW5fcmVmX251bV9wID0gaDI2NF9hcmctPk51bWJlclJlZkZvclBmcmFtZXM7CisKKyAgICAgICAgRW5jQXJnLmFyZ3MuZW5jX2luaXQuY29kZWMuaDI2NC5pbl9yY19mcmFtZXJhdGUgPSBoMjY0X2FyZy0+RnJhbWVSYXRlOworCisgICAgICAgIEVuY0FyZy5hcmdzLmVuY19pbml0LmNvZGVjLmgyNjQuaW5fcmNfbWJfZW4gPSBoMjY0X2FyZy0+RW5hYmxlTUJSYXRlQ29udHJvbDsKKyAgICAgICAgRW5jQXJnLmFyZ3MuZW5jX2luaXQuY29kZWMuaDI2NC5pbl9yY19tYl9kYXJrX2RpcyA9IGgyNjRfYXJnLT5EYXJrRGlzYWJsZTsKKyAgICAgICAgRW5jQXJnLmFyZ3MuZW5jX2luaXQuY29kZWMuaDI2NC5pbl9yY19tYl9zbW9vdGhfZGlzID0gaDI2NF9hcmctPlNtb290aERpc2FibGU7CisgICAgICAgIEVuY0FyZy5hcmdzLmVuY19pbml0LmNvZGVjLmgyNjQuaW5fcmNfbWJfc3RhdGljX2RpcyA9IGgyNjRfYXJnLT5TdGF0aWNEaXNhYmxlOworICAgICAgICBFbmNBcmcuYXJncy5lbmNfaW5pdC5jb2RlYy5oMjY0LmluX3JjX21iX2FjdGl2aXR5X2RpcyA9IGgyNjRfYXJnLT5BY3Rpdml0eURpc2FibGU7CisKKyAgICAgICAgRW5jQXJnLmFyZ3MuZW5jX2luaXQuY29kZWMuaDI2NC5pbl9kZWJsb2NrX2RpcyA9IGgyNjRfYXJnLT5Mb29wRmlsdGVyRGlzYWJsZTsKKyAgICAgICAgaWYgKChhYnMoaDI2NF9hcmctPkxvb3BGaWx0ZXJBbHBoYUMwT2Zmc2V0KSA+IDYpIHx8IChhYnMoaDI2NF9hcmctPkxvb3BGaWx0ZXJCZXRhT2Zmc2V0KSA+IDYpKSB7CisgICAgICAgICAgICBMT0dFKCJTc2JTaXBNZmNFbmNJbml0XSBObyBzdWNoIEFscGhhQzBPZmZzZXQgb3IgQmV0YU9mZnNldCBpcyBzdXBwb3J0ZWQiKTsKKyAgICAgICAgICAgIHJldHVybiBNRkNfUkVUX0lOVkFMSURfUEFSQU07CisgICAgICAgIH0KKyAgICAgICAgRW5jQXJnLmFyZ3MuZW5jX2luaXQuY29kZWMuaDI2NC5pbl9kZWJsb2NrX2FscGhhX2MwID0gaDI2NF9hcmctPkxvb3BGaWx0ZXJBbHBoYUMwT2Zmc2V0OworICAgICAgICBFbmNBcmcuYXJncy5lbmNfaW5pdC5jb2RlYy5oMjY0LmluX2RlYmxvY2tfYmV0YSA9IGgyNjRfYXJnLT5Mb29wRmlsdGVyQmV0YU9mZnNldDsKKworICAgICAgICBFbmNBcmcuYXJncy5lbmNfaW5pdC5jb2RlYy5oMjY0LmluX3N5bWJvbG1vZGUgPSBoMjY0X2FyZy0+U3ltYm9sTW9kZTsKKyAgICAgICAgRW5jQXJnLmFyZ3MuZW5jX2luaXQuY29kZWMuaDI2NC5pbl90cmFuc2Zvcm04eDhfbW9kZSA9IGgyNjRfYXJnLT5UcmFuc2Zvcm04eDhNb2RlOworCisgICAgICAgIC8qIEZJWE1FOiBpcyBpdCByZW1vdmVkPyAqLworICAgICAgICBFbmNBcmcuYXJncy5lbmNfaW5pdC5jb2RlYy5oMjY0LmluX21kX2ludGVyd2VpZ2h0X3BwcyA9IDMwMDsKKyAgICAgICAgRW5jQXJnLmFyZ3MuZW5jX2luaXQuY29kZWMuaDI2NC5pbl9tZF9pbnRyYXdlaWdodF9wcHMgPSAxNzA7CisKKyAgICAgICAgYnJlYWs7CisKKyAgICBkZWZhdWx0OgorICAgICAgICBMT0dFKCJTc2JTaXBNZmNFbmNJbml0XSBObyBzdWNoIGNvZGVjIHR5cGUgaXMgc3VwcG9ydGVkIik7CisgICAgICAgIHJldHVybiBNRkNfUkVUX0lOVkFMSURfUEFSQU07CisgICAgfQorCisgICAgRW5jQXJnLmFyZ3MuZW5jX2luaXQuY21uLmluX21hcHBlZF9hZGRyID0gcENUWC0+bWFwcGVkX2FkZHI7CisKKyAgICByZXRfY29kZSA9IGlvY3RsKHBDVFgtPmhNRkMsIElPQ1RMX01GQ19FTkNfSU5JVCwgJkVuY0FyZyk7CisgICAgaWYgKEVuY0FyZy5yZXRfY29kZSAhPSBNRkNfT0spIHsKKyAgICAgICAgTE9HRSgiU3NiU2lwTWZjRW5jSW5pdF0gSU9DVExfTUZDX0VOQ19JTklUIGZhaWxlZCIpOworICAgICAgICByZXR1cm4gTUZDX1JFVF9FTkNfSU5JVF9GQUlMOworICAgIH0KKworICAgIHBDVFgtPnZpclN0cm1CdWYgPSBFbmNBcmcuYXJncy5lbmNfaW5pdC5jbW4ub3V0X3VfYWRkci5zdHJtX3JlZl95OworICAgIHBDVFgtPnBoeVN0cm1CdWYgPSBFbmNBcmcuYXJncy5lbmNfaW5pdC5jbW4ub3V0X3BfYWRkci5zdHJtX3JlZl95OworCisgICAgcENUWC0+c2l6ZVN0cm1CdWYgPSBNQVhfRU5DT0RFUl9PVVRQVVRfQlVGRkVSX1NJWkU7CisgICAgcENUWC0+ZW5jb2RlZEhlYWRlclNpemUgPSBFbmNBcmcuYXJncy5lbmNfaW5pdC5jbW4ub3V0X2hlYWRlcl9zaXplOworCisgICAgcENUWC0+dmlyTXZSZWZZQyA9IEVuY0FyZy5hcmdzLmVuY19pbml0LmNtbi5vdXRfdV9hZGRyLm12X3JlZl95YzsKKworICAgIHBDVFgtPmludGVyX2J1ZmZfc3RhdHVzIHw9IE1GQ19VU0VfU1RSTV9CVUZGOworCisgICAgcmV0dXJuIE1GQ19SRVRfT0s7Cit9CisKK1NTQlNJUF9NRkNfRVJST1JfQ09ERSBTc2JTaXBNZmNFbmNFeGUodm9pZCAqb3BlbkhhbmRsZSkKK3sKKyAgICBpbnQgcmV0X2NvZGU7CisgICAgX01GQ0xJQiAqcENUWDsKKyAgICBzdHJ1Y3QgbWZjX2NvbW1vbl9hcmdzIEVuY0FyZzsKKworICAgIGlmIChvcGVuSGFuZGxlID09IE5VTEwpIHsKKyAgICAgICAgTE9HRSgiU3NiU2lwTWZjRW5jRXhlXSBvcGVuSGFuZGxlIGlzIE5VTEwiKTsKKyAgICAgICAgcmV0dXJuIE1GQ19SRVRfSU5WQUxJRF9QQVJBTTsKKyAgICB9CisKKyAgICBwQ1RYID0gKF9NRkNMSUIgKilvcGVuSGFuZGxlOworCisgICAgbWVtc2V0KCZFbmNBcmcsIDB4MDAsIHNpemVvZihzdHJ1Y3QgbWZjX2NvbW1vbl9hcmdzKSk7CisKKyAgICBFbmNBcmcuYXJncy5lbmNfZXhlLmluX2NvZGVjX3R5cGUgPSBwQ1RYLT5jb2RlY1R5cGU7CisgICAgRW5jQXJnLmFyZ3MuZW5jX2V4ZS5pbl9ZX2FkZHIgICAgPSAodW5zaWduZWQgaW50KXBDVFgtPnBoeUZybUJ1Zi5sdW1hOworICAgIEVuY0FyZy5hcmdzLmVuY19leGUuaW5fQ2JDcl9hZGRyID0gKHVuc2lnbmVkIGludClwQ1RYLT5waHlGcm1CdWYuY2hyb21hOworI2lmIDAgLyogcGV0ZXIgZm9yIGRlYnVnICovCisgICAgRW5jQXJnLmFyZ3MuZW5jX2V4ZS5pbl9ZX2FkZHJfdmlyICAgID0gKHVuc2lnbmVkIGludClwQ1RYLT52aXJGcm1CdWYubHVtYTsKKyAgICBFbmNBcmcuYXJncy5lbmNfZXhlLmluX0NiQ3JfYWRkcl92aXIgPSAodW5zaWduZWQgaW50KXBDVFgtPnZpckZybUJ1Zi5jaHJvbWE7CisjZW5kaWYKKyAgICBFbmNBcmcuYXJncy5lbmNfZXhlLmluX2ZyYW1ldGFnID0gcENUWC0+aW5mcmFtZXRhZzsKKyAgICBpZiAocENUWC0+ZW5jb2RlX2NudCA9PSAwKSB7CisgICAgICAgIEVuY0FyZy5hcmdzLmVuY19leGUuaW5fc3RybV9zdCAgID0gKHVuc2lnbmVkIGludClwQ1RYLT5waHlTdHJtQnVmOworICAgICAgICBFbmNBcmcuYXJncy5lbmNfZXhlLmluX3N0cm1fZW5kICA9ICh1bnNpZ25lZCBpbnQpcENUWC0+cGh5U3RybUJ1ZiArIHBDVFgtPnNpemVTdHJtQnVmOworICAgIH0gZWxzZSB7CisgICAgICAgIEVuY0FyZy5hcmdzLmVuY19leGUuaW5fc3RybV9zdCA9ICh1bnNpZ25lZCBpbnQpcENUWC0+cGh5U3RybUJ1ZiArIChNQVhfRU5DT0RFUl9PVVRQVVRfQlVGRkVSX1NJWkUgLyAyKTsKKyAgICAgICAgRW5jQXJnLmFyZ3MuZW5jX2V4ZS5pbl9zdHJtX2VuZCA9ICh1bnNpZ25lZCBpbnQpcENUWC0+cGh5U3RybUJ1ZiArIHBDVFgtPnNpemVTdHJtQnVmICsgKE1BWF9FTkNPREVSX09VVFBVVF9CVUZGRVJfU0laRSAvIDIpOworICAgIH0KKworICAgIHJldF9jb2RlID0gaW9jdGwocENUWC0+aE1GQywgSU9DVExfTUZDX0VOQ19FWEUsICZFbmNBcmcpOworICAgIGlmIChFbmNBcmcucmV0X2NvZGUgIT0gTUZDX09LKSB7CisgICAgICAgIExPR0UoIlNzYlNpcE1mY0VuY0V4ZV0gSU9DVExfTUZDX0VOQ19FWEUgZmFpbGVkKHJldCA6ICVkKSIsIEVuY0FyZy5yZXRfY29kZSk7CisgICAgICAgIHJldHVybiBNRkNfUkVUX0VOQ19FWEVfRVJSOworICAgIH0KKworICAgIHBDVFgtPmVuY29kZWREYXRhU2l6ZSA9IEVuY0FyZy5hcmdzLmVuY19leGUub3V0X2VuY29kZWRfc2l6ZTsKKyAgICBwQ1RYLT5lbmNvZGVkZnJhbWVUeXBlID0gRW5jQXJnLmFyZ3MuZW5jX2V4ZS5vdXRfZnJhbWVfdHlwZTsKKyAgICBwQ1RYLT5lbmNvZGVkcGh5RnJtQnVmLmx1bWEgPSBFbmNBcmcuYXJncy5lbmNfZXhlLm91dF9ZX2FkZHI7CisgICAgcENUWC0+ZW5jb2RlZHBoeUZybUJ1Zi5jaHJvbWEgPSBFbmNBcmcuYXJncy5lbmNfZXhlLm91dF9DYkNyX2FkZHI7CisgICAgcENUWC0+b3V0ZnJhbWV0YWd0b3AgPSBFbmNBcmcuYXJncy5lbmNfZXhlLm91dF9mcmFtZXRhZ190b3A7CisgICAgcENUWC0+b3V0ZnJhbWV0YWdib3R0b20gPSBFbmNBcmcuYXJncy5lbmNfZXhlLm91dF9mcmFtZXRhZ19ib3R0b207CisKKyAgICBMT0dWKCJTc2JTaXBNZmNFbmNFeGVdIEVuY29kZSBzdWNjZXNzID09PT09PT09PT09PT09PT09PSIpOworCisgICAgcmV0dXJuIE1GQ19SRVRfT0s7Cit9CisKK1NTQlNJUF9NRkNfRVJST1JfQ09ERSBTc2JTaXBNZmNFbmNDbG9zZSh2b2lkICpvcGVuSGFuZGxlKQoreworICAgIGludCByZXRfY29kZTsKKyAgICBfTUZDTElCICpwQ1RYOworICAgIHN0cnVjdCBtZmNfY29tbW9uX2FyZ3MgZnJlZV9hcmc7CisKKyAgICBpZiAob3BlbkhhbmRsZSA9PSBOVUxMKSB7CisgICAgICAgIExPR0UoIlNzYlNpcE1mY0VuY0Nsb3NlXSBvcGVuSGFuZGxlIGlzIE5VTEwiKTsKKyAgICAgICAgcmV0dXJuIE1GQ19SRVRfSU5WQUxJRF9QQVJBTTsKKyAgICB9CisKKyAgICBwQ1RYID0gKF9NRkNMSUIgKilvcGVuSGFuZGxlOworCisgICAgLyogRklYTUU6IGZyZWUgYnVmZmVyPyAqLworICAgIGlmIChwQ1RYLT5pbnRlcl9idWZmX3N0YXR1cyAmIE1GQ19VU0VfWVVWX0JVRkYpIHsKKyAgICAgICAgZnJlZV9hcmcuYXJncy5tZW1fZnJlZS5rZXkgPSBwQ1RYLT52aXJGcm1CdWYubHVtYTsKKyAgICAgICAgcmV0X2NvZGUgPSBpb2N0bChwQ1RYLT5oTUZDLCBJT0NUTF9NRkNfRlJFRV9CVUYsICZmcmVlX2FyZyk7CisgICAgfQorCisgICAgaWYgKHBDVFgtPmludGVyX2J1ZmZfc3RhdHVzICYgTUZDX1VTRV9TVFJNX0JVRkYpIHsKKyAgICAgICAgZnJlZV9hcmcuYXJncy5tZW1fZnJlZS5rZXkgPSBwQ1RYLT52aXJTdHJtQnVmOworICAgICAgICByZXRfY29kZSA9IGlvY3RsKHBDVFgtPmhNRkMsIElPQ1RMX01GQ19GUkVFX0JVRiwgJmZyZWVfYXJnKTsKKyAgICAgICAgZnJlZV9hcmcuYXJncy5tZW1fZnJlZS5rZXkgPSBwQ1RYLT52aXJNdlJlZllDOworICAgICAgICByZXRfY29kZSA9IGlvY3RsKHBDVFgtPmhNRkMsIElPQ1RMX01GQ19GUkVFX0JVRiwgJmZyZWVfYXJnKTsKKyAgICB9CisKKyAgICBwQ1RYLT5pbnRlcl9idWZmX3N0YXR1cyA9IE1GQ19VU0VfTk9ORTsKKworICAgIG11bm1hcCgodm9pZCAqKXBDVFgtPm1hcHBlZF9hZGRyLCBwQ1RYLT5tYXBwZWRfc2l6ZSk7CisKKyAgICBjbG9zZShwQ1RYLT5oTUZDKTsKKworICAgIGZyZWUocENUWCk7CisKKyAgICByZXR1cm4gTUZDX1JFVF9PSzsKK30KKworU1NCU0lQX01GQ19FUlJPUl9DT0RFIFNzYlNpcE1mY0VuY0dldEluQnVmKHZvaWQgKm9wZW5IYW5kbGUsIFNTQlNJUF9NRkNfRU5DX0lOUFVUX0lORk8gKmlucHV0X2luZm8pCit7CisgICAgaW50IHJldF9jb2RlOworICAgIF9NRkNMSUIgKnBDVFg7CisgICAgc3RydWN0IG1mY19jb21tb25fYXJncyB1c2VyX2FkZHJfYXJnLCByZWFsX2FkZHJfYXJnOworICAgIGludCB5X3NpemUsIGNfc2l6ZTsKKyAgICBpbnQgYWxpZ25lZF95X3NpemUsIGFsaWduZWRfY19zaXplOworCisgICAgaWYgKG9wZW5IYW5kbGUgPT0gTlVMTCkgeworICAgICAgICBMT0dFKCJTc2JTaXBNZmNFbmNHZXRJbkJ1Zl0gb3BlbkhhbmRsZSBpcyBOVUxMIik7CisgICAgICAgIHJldHVybiBNRkNfUkVUX0lOVkFMSURfUEFSQU07CisgICAgfQorCisgICAgcENUWCAgPSAoX01GQ0xJQiAqKSBvcGVuSGFuZGxlOworCisgICAgLyogRklYTUU6ICovCisgICAgeV9zaXplID0gcENUWC0+d2lkdGggKiBwQ1RYLT5oZWlnaHQ7CisgICAgY19zaXplID0gKHBDVFgtPndpZHRoICogcENUWC0+aGVpZ2h0KSA+PiAxOworCisgICAgLyogbGVuZWFyOiAyS0IsIHRpbGU6IDhLQiAqLworICAgIGFsaWduZWRfeV9zaXplID0gQWxpZ24oeV9zaXplLCA2NCAqIEJVRl9MX1VOSVQpOworICAgIGFsaWduZWRfY19zaXplID0gQWxpZ24oY19zaXplLCA2NCAqIEJVRl9MX1VOSVQpOworCisgICAgLyogQWxsb2NhdGUgbHVtYSAmIGNocm9tYSBidWYgKi8KKyAgICB1c2VyX2FkZHJfYXJnLmFyZ3MubWVtX2FsbG9jLnR5cGUgPSBFTkNPREVSOworICAgIHVzZXJfYWRkcl9hcmcuYXJncy5tZW1fYWxsb2MuYnVmZl9zaXplID0gYWxpZ25lZF95X3NpemUgKyBhbGlnbmVkX2Nfc2l6ZTsKKyAgICB1c2VyX2FkZHJfYXJnLmFyZ3MubWVtX2FsbG9jLm1hcHBlZF9hZGRyID0gcENUWC0+bWFwcGVkX2FkZHI7CisgICAgcmV0X2NvZGUgPSBpb2N0bChwQ1RYLT5oTUZDLCBJT0NUTF9NRkNfR0VUX0lOX0JVRiwgJnVzZXJfYWRkcl9hcmcpOworICAgIGlmIChyZXRfY29kZSA8IDApIHsKKyAgICAgICAgTE9HRSgiU3NiU2lwTWZjRW5jR2V0SW5CdWZdIElPQ1RMX01GQ19HRVRfSU5fQlVGIGZhaWxlZCIpOworICAgICAgICByZXR1cm4gTUZDX1JFVF9FTkNfR0VUX0lOQlVGX0ZBSUw7CisgICAgfQorCisgICAgcENUWC0+dmlyRnJtQnVmLmx1bWEgPSBwQ1RYLT5tYXBwZWRfYWRkciArIHVzZXJfYWRkcl9hcmcuYXJncy5tZW1fYWxsb2Mub2Zmc2V0OworICAgIHBDVFgtPnZpckZybUJ1Zi5jaHJvbWEgPSBwQ1RYLT5tYXBwZWRfYWRkciArIHVzZXJfYWRkcl9hcmcuYXJncy5tZW1fYWxsb2Mub2Zmc2V0ICsgKHVuc2lnbmVkIGludClhbGlnbmVkX3lfc2l6ZTsKKworICAgIHJlYWxfYWRkcl9hcmcuYXJncy5yZWFsX2FkZHIua2V5ID0gdXNlcl9hZGRyX2FyZy5hcmdzLm1lbV9hbGxvYy5vZmZzZXQ7CisgICAgcmV0X2NvZGUgPSBpb2N0bChwQ1RYLT5oTUZDLCBJT0NUTF9NRkNfR0VUX1JFQUxfQUREUiwgJnJlYWxfYWRkcl9hcmcpOworICAgIGlmIChyZXRfY29kZSAgPCAwKSB7CisgICAgICAgIExPR0UoIlNzYlNpcE1mY0VuY0dldEluQnVmXSBJT0NUTF9NRkNfR0VUX1JFQUxfQUREUiBmYWlsZWQiKTsKKyAgICAgICAgcmV0dXJuIE1GQ19SRVRfRU5DX0dFVF9JTkJVRl9GQUlMOworICAgIH0KKyAgICBwQ1RYLT5waHlGcm1CdWYubHVtYSA9IHJlYWxfYWRkcl9hcmcuYXJncy5yZWFsX2FkZHIuYWRkcjsKKyAgICBwQ1RYLT5waHlGcm1CdWYuY2hyb21hID0gcmVhbF9hZGRyX2FyZy5hcmdzLnJlYWxfYWRkci5hZGRyICsgKHVuc2lnbmVkIGludClhbGlnbmVkX3lfc2l6ZTsKKworICAgIHBDVFgtPnNpemVGcm1CdWYubHVtYSA9ICh1bnNpZ25lZCBpbnQpeV9zaXplOworICAgIHBDVFgtPnNpemVGcm1CdWYuY2hyb21hID0gKHVuc2lnbmVkIGludCljX3NpemU7CisgICAgcENUWC0+aW50ZXJfYnVmZl9zdGF0dXMgfD0gTUZDX1VTRV9ZVVZfQlVGRjsKKworICAgIGlucHV0X2luZm8tPllQaHlBZGRyID0gKHZvaWQqKXBDVFgtPnBoeUZybUJ1Zi5sdW1hOworICAgIGlucHV0X2luZm8tPkNQaHlBZGRyID0gKHZvaWQqKXBDVFgtPnBoeUZybUJ1Zi5jaHJvbWE7CisgICAgaW5wdXRfaW5mby0+WVZpckFkZHIgPSAodm9pZCopcENUWC0+dmlyRnJtQnVmLmx1bWE7CisgICAgaW5wdXRfaW5mby0+Q1ZpckFkZHIgPSAodm9pZCopcENUWC0+dmlyRnJtQnVmLmNocm9tYTsKKworICAgIHJldHVybiBNRkNfUkVUX09LOworfQorCitTU0JTSVBfTUZDX0VSUk9SX0NPREUgU3NiU2lwTWZjRW5jU2V0SW5CdWYodm9pZCAqb3BlbkhhbmRsZSwgU1NCU0lQX01GQ19FTkNfSU5QVVRfSU5GTyAqaW5wdXRfaW5mbykKK3sKKyAgICBfTUZDTElCICpwQ1RYOworICAgIGludCByZXRfY29kZTsKKyAgICBzdHJ1Y3QgbWZjX2NvbW1vbl9hcmdzIHVzZXJfYWRkcl9hcmcsIHJlYWxfYWRkcl9hcmc7CisgICAgaW50IHlfc2l6ZSwgY19zaXplOworICAgIGludCBhbGlnbmVkX3lfc2l6ZSwgYWxpZ25lZF9jX3NpemU7CisKKyAgICBpZiAob3BlbkhhbmRsZSA9PSBOVUxMKSB7CisgICAgICAgIExPR0UoIlNzYlNpcE1mY0VuY1NldEluQnVmXSBvcGVuSGFuZGxlIGlzIE5VTEwiKTsKKyAgICAgICAgcmV0dXJuIE1GQ19SRVRfSU5WQUxJRF9QQVJBTTsKKyAgICB9CisKKyAgICBMT0dWKCJTc2JTaXBNZmNFbmNTZXRJbkJ1Zl0gaW5wdXRfaW5mby0+WVBoeUFkZHIgJiBpbnB1dF9pbmZvLT5DUGh5QWRkciBzaG91bGQgYmUgNjRLQiBhbGlnbmVkIik7CisKKyAgICBwQ1RYICA9IChfTUZDTElCICopIG9wZW5IYW5kbGU7CisKKyAgICAvKiBGSVhNRTogKi8KKyAgICB5X3NpemUgPSBwQ1RYLT53aWR0aCAqIHBDVFgtPmhlaWdodDsKKyAgICBjX3NpemUgPSAocENUWC0+d2lkdGggKiBwQ1RYLT5oZWlnaHQpID4+IDE7CisKKyAgICAvKiBsZW5lYXI6IDJLQiwgdGlsZTogOEtCICovCisgICAgYWxpZ25lZF95X3NpemUgPSBBbGlnbih5X3NpemUsIDY0ICogQlVGX0xfVU5JVCk7CisgICAgYWxpZ25lZF9jX3NpemUgPSBBbGlnbihjX3NpemUsIDY0ICogQlVGX0xfVU5JVCk7CisKKyAgICBwQ1RYLT5waHlGcm1CdWYubHVtYSA9ICh1bnNpZ25lZCBpbnQpaW5wdXRfaW5mby0+WVBoeUFkZHI7CisgICAgcENUWC0+cGh5RnJtQnVmLmNocm9tYSA9ICh1bnNpZ25lZCBpbnQpaW5wdXRfaW5mby0+Q1BoeUFkZHI7CisKKyAgICBwQ1RYLT5zaXplRnJtQnVmLmx1bWEgPSAodW5zaWduZWQgaW50KWlucHV0X2luZm8tPllTaXplOworICAgIHBDVFgtPnNpemVGcm1CdWYuY2hyb21hID0gKHVuc2lnbmVkIGludClpbnB1dF9pbmZvLT5DU2l6ZTsKKworICAgIHJldHVybiBNRkNfUkVUX09LOworfQorCitTU0JTSVBfTUZDX0VSUk9SX0NPREUgU3NiU2lwTWZjRW5jR2V0T3V0QnVmKHZvaWQgKm9wZW5IYW5kbGUsIFNTQlNJUF9NRkNfRU5DX09VVFBVVF9JTkZPICpvdXRwdXRfaW5mbykKK3sKKyAgICBfTUZDTElCICpwQ1RYOworCisgICAgaWYgKG9wZW5IYW5kbGUgPT0gTlVMTCkgeworICAgICAgICBMT0dFKCJTc2JTaXBNZmNFbmNHZXRPdXRCdWZdIG9wZW5IYW5kbGUgaXMgTlVMTCIpOworICAgICAgICByZXR1cm4gTUZDX1JFVF9JTlZBTElEX1BBUkFNOworICAgIH0KKworICAgIHBDVFggPSAoX01GQ0xJQiAqKW9wZW5IYW5kbGU7CisKKyAgICBvdXRwdXRfaW5mby0+aGVhZGVyU2l6ZSA9IHBDVFgtPmVuY29kZWRIZWFkZXJTaXplOworICAgIG91dHB1dF9pbmZvLT5kYXRhU2l6ZSA9IHBDVFgtPmVuY29kZWREYXRhU2l6ZTsKKyAgICBvdXRwdXRfaW5mby0+ZnJhbWVUeXBlID0gcENUWC0+ZW5jb2RlZGZyYW1lVHlwZTsKKworICAgIGlmIChwQ1RYLT5lbmNvZGVfY250ID09IDApIHsKKyAgICAgICAgb3V0cHV0X2luZm8tPlN0cm1QaHlBZGRyID0gKHZvaWQgKilwQ1RYLT5waHlTdHJtQnVmOworICAgICAgICBvdXRwdXRfaW5mby0+U3RybVZpckFkZHIgPSAodW5zaWduZWQgY2hhciAqKXBDVFgtPnZpclN0cm1CdWYgKyBwQ1RYLT5tYXBwZWRfYWRkcjsKKyAgICB9IGVsc2UgeworICAgICAgICBvdXRwdXRfaW5mby0+U3RybVBoeUFkZHIgPSAodW5zaWduZWQgY2hhciAqKXBDVFgtPnBoeVN0cm1CdWYgKyAoTUFYX0VOQ09ERVJfT1VUUFVUX0JVRkZFUl9TSVpFIC8gMik7CisgICAgICAgIG91dHB1dF9pbmZvLT5TdHJtVmlyQWRkciA9ICh1bnNpZ25lZCBjaGFyICopcENUWC0+dmlyU3RybUJ1ZiArIHBDVFgtPm1hcHBlZF9hZGRyICsgKE1BWF9FTkNPREVSX09VVFBVVF9CVUZGRVJfU0laRSAvIDIpOworICAgIH0KKworICAgIHBDVFgtPmVuY29kZV9jbnQgKys7CisgICAgcENUWC0+ZW5jb2RlX2NudCAlPSAyOworCisgICAgb3V0cHV0X2luZm8tPmVuY29kZWRZUGh5QWRkciA9ICh2b2lkKilwQ1RYLT5lbmNvZGVkcGh5RnJtQnVmLmx1bWE7CisgICAgb3V0cHV0X2luZm8tPmVuY29kZWRDUGh5QWRkciA9ICh2b2lkKilwQ1RYLT5lbmNvZGVkcGh5RnJtQnVmLmNocm9tYTsKKworICAgIHJldHVybiBNRkNfUkVUX09LOworfQorCitTU0JTSVBfTUZDX0VSUk9SX0NPREUgU3NiU2lwTWZjRW5jU2V0T3V0QnVmKHZvaWQgKm9wZW5IYW5kbGUsIHZvaWQgKnBoeU91dGJ1Ziwgdm9pZCAqdmlyT3V0YnVmLCBpbnQgb3V0cHV0QnVmZmVyU2l6ZSkKK3sKKyAgICBfTUZDTElCICpwQ1RYOworCisgICAgaWYgKG9wZW5IYW5kbGUgPT0gTlVMTCkgeworICAgICAgICBMT0dFKCJTc2JTaXBNZmNFbmNTZXRPdXRCdWZdIG9wZW5IYW5kbGUgaXMgTlVMTCIpOworICAgICAgICByZXR1cm4gTUZDX1JFVF9JTlZBTElEX1BBUkFNOworICAgIH0KKworICAgIHBDVFggID0gKF9NRkNMSUIgKikgb3BlbkhhbmRsZTsKKworICAgIHBDVFgtPnBoeVN0cm1CdWYgPSAoaW50KXBoeU91dGJ1ZjsKKyAgICBwQ1RYLT52aXJTdHJtQnVmID0gKGludCl2aXJPdXRidWY7CisgICAgcENUWC0+c2l6ZVN0cm1CdWYgPSBvdXRwdXRCdWZmZXJTaXplOworCisgICAgcmV0dXJuIE1GQ19SRVRfT0s7Cit9CisKK1NTQlNJUF9NRkNfRVJST1JfQ09ERSBTc2JTaXBNZmNFbmNTZXRDb25maWcodm9pZCAqb3BlbkhhbmRsZSwgU1NCU0lQX01GQ19FTkNfQ09ORiBjb25mX3R5cGUsIHZvaWQgKnZhbHVlKQoreworICAgIGludCByZXRfY29kZTsKKyAgICBfTUZDTElCICpwQ1RYOworICAgIHN0cnVjdCBtZmNfY29tbW9uX2FyZ3MgRW5jQXJnOworICAgIHN0cnVjdCBtZmNfZW5jX3Z1aV9pbmZvIHZ1aV9pbmZvOworICAgIHN0cnVjdCBtZmNfZW5jX2hpZXJfcF9xcCBoaWVyX3BfcXA7CisjaWZkZWYgUzNEX1NVUFBPUlQKKyAgICBzdHJ1Y3QgbWZjX2VuY19zZXRfY29uZmlnIHNldF9pbmZvOworICAgIHN0cnVjdCBtZmNfZnJhbWVfcGFja2luZyAqZnJhbWVfcGFja2luZzsKKyNlbmRpZgorCisgICAgaWYgKG9wZW5IYW5kbGUgPT0gTlVMTCkgeworICAgICAgICBMT0dFKCJTc2JTaXBNZmNFbmNTZXRDb25maWddIG9wZW5IYW5kbGUgaXMgTlVMTCIpOworICAgICAgICByZXR1cm4gTUZDX1JFVF9JTlZBTElEX1BBUkFNOworICAgIH0KKworICAgIGlmICh2YWx1ZSA9PSBOVUxMKSB7CisgICAgICAgIExPR0UoIlNzYlNpcE1mY0VuY1NldENvbmZpZ10gdmFsdWUgaXMgTlVMTCIpOworICAgICAgICByZXR1cm4gTUZDX1JFVF9JTlZBTElEX1BBUkFNOworICAgIH0KKworICAgIHBDVFggID0gKF9NRkNMSUIgKikgb3BlbkhhbmRsZTsKKyAgICBtZW1zZXQoJkVuY0FyZywgMHgwMCwgc2l6ZW9mKHN0cnVjdCBtZmNfY29tbW9uX2FyZ3MpKTsKKworI2lmZGVmIFMzRF9TVVBQT1JUCisgICAgRW5jQXJnLmFyZ3MuY29uZmlnLnR5cGUgPSBjb25mX3R5cGU7CisKKyAgICBzd2l0Y2ggKGNvbmZfdHlwZSkgeworICAgIGNhc2UgTUZDX0VOQ19TRVRDT05GX0ZSQU1FX1RBRzoKKyAgICAgICAgcENUWC0+aW5mcmFtZXRhZyA9ICooKHVuc2lnbmVkIGludCAqKXZhbHVlKTsKKyAgICAgICAgcmV0dXJuIE1GQ19SRVRfT0s7CisgICAgY2FzZSBNRkNfRU5DX1NFVENPTkZfQUxMT1dfRlJBTUVfU0tJUDoKKyAgICAgICAgc2V0X2luZm8gPSAqKChzdHJ1Y3QgbWZjX2VuY19zZXRfY29uZmlnICopIHZhbHVlKTsKKyAgICAgICAgRW5jQXJnLmFyZ3MuY29uZmlnLmFyZ3MuYmFzaWMudmFsdWVzWzBdID0gc2V0X2luZm8uZW5hYmxlOworICAgICAgICBpZiAoc2V0X2luZm8uZW5hYmxlID09IDIpCisgICAgICAgICAgICBFbmNBcmcuYXJncy5jb25maWcuYXJncy5iYXNpYy52YWx1ZXNbMV0gPSBzZXRfaW5mby5udW1iZXI7CisgICAgICAgIGVsc2UKKyAgICAgICAgICAgIEVuY0FyZy5hcmdzLmNvbmZpZy5hcmdzLmJhc2ljLnZhbHVlc1sxXSA9IDA7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgTUZDX0VOQ19TRVRDT05GX1ZVSV9JTkZPOgorICAgICAgICBzZXRfaW5mbyA9ICooKHN0cnVjdCBtZmNfZW5jX3NldF9jb25maWcgKikgdmFsdWUpOworICAgICAgICBFbmNBcmcuYXJncy5jb25maWcuYXJncy5iYXNpYy52YWx1ZXNbMF0gPSBzZXRfaW5mby5lbmFibGU7CisgICAgICAgIGlmIChzZXRfaW5mby5lbmFibGUgPT0gMjU1KSAvL1JlLWNoZWNrIHRoaXMgcGFydCBvZiBjb2RlIHdpdGggSmVvbmd0YWUgUGFyaworICAgICAgICAgICAgRW5jQXJnLmFyZ3MuY29uZmlnLmFyZ3MuYmFzaWMudmFsdWVzWzFdID0gc2V0X2luZm8ubnVtYmVyOworICAgICAgICBlbHNlCisgICAgICAgICAgICBFbmNBcmcuYXJncy5jb25maWcuYXJncy5iYXNpYy52YWx1ZXNbMV0gPSAwOworCisgICAgICAgIEVuY0FyZy5hcmdzLmNvbmZpZy5hcmdzLmJhc2ljLnZhbHVlc1sxXSA9IHNldF9pbmZvLm51bWJlcjsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBNRkNfRU5DX1NFVENPTkZfRlJBTUVfUEFDS0lORzoKKyAgICAgICAgZnJhbWVfcGFja2luZyA9IChzdHJ1Y3QgbWZjX2ZyYW1lX3BhY2tpbmcgKil2YWx1ZTsKKyAgICAgICAgLyoKKyAgICAgICAgbWVtY3B5KCZFbmNBcmcuYXJncy5jb25maWcuYXJncy5mcmFtZV9wYWNraW5nLCBmcmFtZV9wYWNraW5nLAorICAgICAgICAgICAgc2l6ZW9mKHN0cnVjdCBtZmNfZnJhbWVfcGFja2luZykpOworICAgICAgICAqLworICAgICAgICBFbmNBcmcuYXJncy5jb25maWcuYXJncy5iYXNpYy52YWx1ZXNbMF0gPSBmcmFtZV9wYWNraW5nLT5hcnJhbmdlbWVudF90eXBlOworICAgICAgICBFbmNBcmcuYXJncy5jb25maWcuYXJncy5iYXNpYy52YWx1ZXNbMV0gPSBmcmFtZV9wYWNraW5nLT5jdXJyZW50X2ZyYW1lX2lzX2ZyYW1lMF9mbGFnOworICAgICAgICBicmVhazsKKyAgICBjYXNlIE1GQ19FTkNfU0VUQ09ORl9GUkFNRV9UWVBFOgorICAgIGNhc2UgTUZDX0VOQ19TRVRDT05GX0NIQU5HRV9GUkFNRV9SQVRFOgorICAgIGNhc2UgTUZDX0VOQ19TRVRDT05GX0NIQU5HRV9CSVRfUkFURToKKyAgICBjYXNlIE1GQ19FTkNfU0VUQ09ORl9JX1BFUklPRDoKKyAgICBjYXNlIE1GQ19FTkNfU0VUQ09ORl9ISUVSX1A6CisgICAgY2FzZSBNRkNfRU5DX1NFVENPTkZfU0VJX0dFTjoKKyAgICAgICAgRW5jQXJnLmFyZ3MuY29uZmlnLmFyZ3MuYmFzaWMudmFsdWVzWzBdID0gKigoaW50ICopIHZhbHVlKTsKKyAgICAgICAgRW5jQXJnLmFyZ3MuY29uZmlnLmFyZ3MuYmFzaWMudmFsdWVzWzFdID0gMDsKKyAgICAgICAgYnJlYWs7CisgICAgZGVmYXVsdDoKKyAgICAgICAgTE9HRSgiU3NiU2lwTWZjRW5jU2V0Q29uZmlnXSBub3Qgc3VwcG9ydGVkIHR5cGUiKTsKKyAgICAgICAgcmV0dXJuIE1GQ19SRVRfRU5DX1NFVF9DT05GX0ZBSUw7CisgICAgfQorI2Vsc2UKKyAgICBFbmNBcmcuYXJncy5zZXRfY29uZmlnLmluX2NvbmZpZ19wYXJhbSA9IGNvbmZfdHlwZTsKKyAgICBzd2l0Y2ggKGNvbmZfdHlwZSkgeworICAgIGNhc2UgTUZDX0VOQ19TRVRDT05GX0ZSQU1FX1RBRzoKKyAgICAgICAgcENUWC0+aW5mcmFtZXRhZyA9ICooKHVuc2lnbmVkIGludCAqKXZhbHVlKTsKKyAgICAgICAgcmV0dXJuIE1GQ19SRVRfT0s7CisgICAgY2FzZSBNRkNfRU5DX1NFVENPTkZfVlVJX0lORk86CisgICAgICAgIHZ1aV9pbmZvID0gKigoc3RydWN0IG1mY19lbmNfdnVpX2luZm8gKikgdmFsdWUpOworICAgICAgICBFbmNBcmcuYXJncy5zZXRfY29uZmlnLmluX2NvbmZpZ192YWx1ZVswXSAgPSAoaW50KSh2dWlfaW5mby5hc3BlY3RfcmF0aW9faWRjKTsKKyAgICAgICAgRW5jQXJnLmFyZ3Muc2V0X2NvbmZpZy5pbl9jb25maWdfdmFsdWVbMV0gID0gMDsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBNRkNfRU5DX1NFVENPTkZfSElFUl9QOgorICAgICAgICBoaWVyX3BfcXAgPSAqKChzdHJ1Y3QgbWZjX2VuY19oaWVyX3BfcXAgKikgdmFsdWUpOworICAgICAgICBFbmNBcmcuYXJncy5zZXRfY29uZmlnLmluX2NvbmZpZ192YWx1ZVswXSAgPSAoaW50KShoaWVyX3BfcXAudDBfZnJhbWVfcXApOworICAgICAgICBFbmNBcmcuYXJncy5zZXRfY29uZmlnLmluX2NvbmZpZ192YWx1ZVsxXSAgPSAoaW50KShoaWVyX3BfcXAudDJfZnJhbWVfcXApOworICAgICAgICBFbmNBcmcuYXJncy5zZXRfY29uZmlnLmluX2NvbmZpZ192YWx1ZVsyXSAgPSAoaW50KShoaWVyX3BfcXAudDNfZnJhbWVfcXApOworICAgICAgICBicmVhazsKKyAgICBkZWZhdWx0OgorICAgICAgICBFbmNBcmcuYXJncy5zZXRfY29uZmlnLmluX2NvbmZpZ192YWx1ZVswXSAgPSAqKChpbnQgKikgdmFsdWUpOworICAgICAgICBFbmNBcmcuYXJncy5zZXRfY29uZmlnLmluX2NvbmZpZ192YWx1ZVsxXSAgPSAwOworICAgICAgICBicmVhazsKKyAgICB9CisjZW5kaWYKKworICAgIHJldF9jb2RlID0gaW9jdGwocENUWC0+aE1GQywgSU9DVExfTUZDX1NFVF9DT05GSUcsICZFbmNBcmcpOworICAgIGlmIChFbmNBcmcucmV0X2NvZGUgIT0gTUZDX09LKSB7CisgICAgICAgIExPR0UoIlNzYlNpcE1mY0VuY1NldENvbmZpZ10gSU9DVExfTUZDX1NFVF9DT05GSUcgZmFpbGVkKHJldCA6ICVkKSIsIEVuY0FyZy5yZXRfY29kZSk7CisgICAgICAgIHJldHVybiBNRkNfUkVUX0VOQ19TRVRfQ09ORl9GQUlMOworICAgIH0KKworICAgIHJldHVybiBNRkNfUkVUX09LOworfQorCisKK1NTQlNJUF9NRkNfRVJST1JfQ09ERSBTc2JTaXBNZmNFbmNHZXRDb25maWcodm9pZCAqb3BlbkhhbmRsZSwgU1NCU0lQX01GQ19FTkNfQ09ORiBjb25mX3R5cGUsIHZvaWQgKnZhbHVlKQoreworICAgIF9NRkNMSUIgKnBDVFg7CisgICAgLyoKKyAgICB1bnNpZ25lZCBpbnQgKmVuY29kZWRfaGVhZGVyX3NpemU7CisgICAgKi8KKworICAgIHBDVFggPSAoX01GQ0xJQiAqKW9wZW5IYW5kbGU7CisKKyAgICBpZiAob3BlbkhhbmRsZSA9PSBOVUxMKSB7CisgICAgICAgIExPR0UoIlNzYlNpcE1mY0VuY0dldENvbmZpZ10gb3BlbkhhbmRsZSBpcyBOVUxMIik7CisgICAgICAgIHJldHVybiBNRkNfUkVUX0lOVkFMSURfUEFSQU07CisgICAgfQorICAgIGlmICh2YWx1ZSA9PSBOVUxMKSB7CisgICAgICAgIExPR0UoIlNzYlNpcE1mY0VuY0dldENvbmZpZ10gdmFsdWUgaXMgTlVMTCIpOworICAgICAgICByZXR1cm4gTUZDX1JFVF9JTlZBTElEX1BBUkFNOworICAgIH0KKworICAgIHN3aXRjaCAoY29uZl90eXBlKSB7CisgICAgY2FzZSBNRkNfRU5DX0dFVENPTkZfRlJBTUVfVEFHOgorICAgICAgICAqKCh1bnNpZ25lZCBpbnQgKil2YWx1ZSkgPSBwQ1RYLT5vdXRmcmFtZXRhZ3RvcDsKKyAgICAgICAgYnJlYWs7CisjaWYgMAorICAgIGNhc2UgTUZDX0VOQ19HRVRDT05GX0hFQURFUl9TSVpFOgorICAgICAgICBlbmNvZGVkX2hlYWRlcl9zaXplID0gKHVuc2lnbmVkIGludCAqKXZhbHVlOworICAgICAgICAqZW5jb2RlZF9oZWFkZXJfc2l6ZSA9IHBDVFgtPmVuY29kZWRIZWFkZXJTaXplOworICAgICAgICBicmVhazsKKyNlbmRpZgorICAgIGRlZmF1bHQ6CisgICAgICAgIExPR0UoIlNzYlNpcE1mY0VuY0dldENvbmZpZ10gTm8gc3VjaCBjb25mX3R5cGUgaXMgc3VwcG9ydGVkLiIpOworICAgICAgICByZXR1cm4gTUZDX1JFVF9JTlZBTElEX1BBUkFNOworICAgIH0KKworICAgIHJldHVybiBNRkNfUkVUX09LOworfQorCmRpZmYgLS1naXQgYS9leHlub3M0L211bHRpbWVkaWEvY29kZWNzL3NlY19jb2RlY3MvdmlkZW8vZXh5bm9zNC9tZmMvaW5jbHVkZS9Tc2JTaXBNZmNBcGkuaCBiL2V4eW5vczQvbXVsdGltZWRpYS9jb2RlY3Mvc2VjX2NvZGVjcy92aWRlby9leHlub3M0L21mYy9pbmNsdWRlL1NzYlNpcE1mY0FwaS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmZlZDNlMzQKLS0tIC9kZXYvbnVsbAorKysgYi9leHlub3M0L211bHRpbWVkaWEvY29kZWNzL3NlY19jb2RlY3MvdmlkZW8vZXh5bm9zNC9tZmMvaW5jbHVkZS9Tc2JTaXBNZmNBcGkuaApAQCAtMCwwICsxLDQyMCBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxMCBTYW1zdW5nIEVsZWN0cm9uaWNzIENvLiwgTHRkLgorICogICAgICAgICAgICAgIGh0dHA6Ly93d3cuc2Ftc3VuZy5jb20vCisgKgorICogR2xvYmFsIGhlYWRlciBmb3IgU2Ftc3VuZyBNRkMgKE11bHRpIEZ1bmN0aW9uIENvZGVjIC0gRklNVikgZHJpdmVyCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIGFzCisgKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqCisgKiBBbHRlcm5hdGl2ZWx5LCBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2lmbmRlZiBfU1NCU0lQX01GQ19BUElfSF8KKyNkZWZpbmUgX1NTQlNJUF9NRkNfQVBJX0hfCisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworLyogRGVmaW5pdGlvbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKyNkZWZpbmUgTUFYX0RFQ09ERVJfSU5QVVRfQlVGRkVSX1NJWkUgICgxMDI0ICogMzA3MikKKyNkZWZpbmUgTUFYX0VOQ09ERVJfT1VUUFVUX0JVRkZFUl9TSVpFICgxMDI0ICogMzA3MikKKworI2RlZmluZSBTVVBQT1JUXzEwODBQICAgICAgICAxCisKKyNpZiBTVVBQT1JUXzEwODBQCisjZGVmaW5lIE1NQVBfQlVGRkVSX1NJWkVfTU1BUCAgICAgICAgICAoNzAqMTAyNCoxMDI0KSAvKiBvbmx5IEMxMTAgdXNlIHRoaXMgdmFsdWUuIGluIEMyMTAsIG1lbW9yeSBzaXplIGlzIGRlY2lkZWQgaW4gbWVudWNvbmZpZyovCisjZWxzZQorI2RlZmluZSBNTUFQX0JVRkZFUl9TSVpFX01NQVAgICAgICAgICAgKDYyKjEwMjQqMTAyNCkKKyNlbmRpZgorCisjZGVmaW5lIFNBTVNVTkdfTUZDX0RFVl9OQU1FICAgICAgICAgICAiL2Rldi9zM2MtbWZjIgorCisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworLyogU3RydWN0dXJlIGFuZCBUeXBlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KK3R5cGVkZWYgZW51bSB7CisgICAgSDI2NF9ERUMsCisgICAgVkMxX0RFQywgICAgIC8qIFZDMSBhZHZhY2VkIFByb2ZpbGUgZGVjb2RpbmcgICovCisgICAgTVBFRzRfREVDLAorICAgIFhWSURfREVDLAorICAgIE1QRUcxX0RFQywKKyAgICBNUEVHMl9ERUMsCisgICAgSDI2M19ERUMsCisgICAgVkMxUkNWX0RFQywgIC8qIFZDMSBzaW1wbGUvbWFpbiBwcm9maWxlIGRlY29kaW5nICAqLworICAgIEZJTVYxX0RFQywKKyAgICBGSU1WMl9ERUMsCisgICAgRklNVjNfREVDLAorICAgIEZJTVY0X0RFQywKKyAgICBIMjY0X0VOQywKKyAgICBNUEVHNF9FTkMsCisgICAgSDI2M19FTkMsCisgICAgVU5LTk9XTl9UWVBFCit9IFNTQlNJUF9NRkNfQ09ERUNfVFlQRTsKKwordHlwZWRlZiBlbnVtIHsKKyAgICBET05UX0NBUkUgPSAwLAorICAgIElfRlJBTUUgPSAxLAorICAgIE5PVF9DT0RFRCA9IDIKK30gU1NCU0lQX01GQ19GT1JDRV9TRVRfRlJBTUVfVFlQRTsKKwordHlwZWRlZiBlbnVtIHsKKyAgICBOVjEyX0xJTkVBUiA9IDAsCisgICAgTlYxMl9USUxFLAorICAgIE5WMjFfTElORUFSCit9IFNTQlNJUF9NRkNfSU5TVFJNX01PREVfVFlQRTsKKwordHlwZWRlZiBlbnVtIHsKKyAgICBGUkFNRSA9IDAsCisgICAgU0xJQ0UsCit9IFNTQlNJUF9NRkNfT1VUU1RSTV9NT0RFX1RZUEU7CisKK3R5cGVkZWYgZW51bSB7CisgICAgTk9fQ0FDSEUgPSAwLAorICAgIENBQ0hFID0gMQorfSBTU0JJUF9NRkNfQlVGRkVSX1RZUEU7CisKK3R5cGVkZWYgZW51bSB7CisgICAgTUZDX0RFQ19TRVRDT05GX1BPU1RfRU5BQkxFID0gMSwKKyAgICBNRkNfREVDX1NFVENPTkZfRVhUUkFfQlVGRkVSX05VTSwKKyAgICBNRkNfREVDX1NFVENPTkZfRElTUExBWV9ERUxBWSwKKyAgICBNRkNfREVDX1NFVENPTkZfSVNfTEFTVF9GUkFNRSwKKyAgICBNRkNfREVDX1NFVENPTkZfU0xJQ0VfRU5BQkxFLAorICAgIE1GQ19ERUNfU0VUQ09ORl9DUkNfRU5BQkxFLAorICAgIE1GQ19ERUNfU0VUQ09ORl9GSU1WMV9XSURUSF9IRUlHSFQsCisgICAgTUZDX0RFQ19TRVRDT05GX0ZSQU1FX1RBRywKKyAgICBNRkNfREVDX0dFVENPTkZfQ1JDX0RBVEEsCisgICAgTUZDX0RFQ19HRVRDT05GX0JVRl9XSURUSF9IRUlHSFQsCisgICAgTUZDX0RFQ19HRVRDT05GX0NST1BfSU5GTywKKyAgICBNRkNfREVDX0dFVENPTkZfRlJBTUVfVEFHLAorCisgICAgLyogQzIxMCBzcGVjaWZpYyBmZWF0dXJlICovCisgICAgTUZDX0RFQ19TRVRDT05GX0lNTUVESUFURUxZX0RJU1BMQVksCisgICAgTUZDX0RFQ19TRVRDT05GX0RQQl9GTFVTSCwKKyAgICBNRkNfREVDX1NFVENPTkZfUElYRUxfQ0FDSEUsCisjaWZuZGVmIFMzRF9TVVBQT1JUCisgICAgTUZDX0RFQ19HRVRDT05GX1dJRFRIX0hFSUdIVAorI2Vsc2UKKyAgICBNRkNfREVDX0dFVENPTkZfV0lEVEhfSEVJR0hULAorICAgIE1GQ19ERUNfU0VUQ09ORl9TRUlfUEFSU0UsCisgICAgTUZDX0RFQ19HRVRDT05GX0ZSQU1FX1BBQ0tJTkcKKyNlbmRpZgorfSBTU0JTSVBfTUZDX0RFQ19DT05GOworCit0eXBlZGVmIGVudW0geworICAgIE1GQ19FTkNfU0VUQ09ORl9GUkFNRV9UWVBFID0gMTAwLAorICAgIE1GQ19FTkNfU0VUQ09ORl9DSEFOR0VfRlJBTUVfUkFURSwKKyAgICBNRkNfRU5DX1NFVENPTkZfQ0hBTkdFX0JJVF9SQVRFLAorICAgIE1GQ19FTkNfU0VUQ09ORl9GUkFNRV9UQUcsCisgICAgTUZDX0VOQ19TRVRDT05GX0FMTE9XX0ZSQU1FX1NLSVAsCisgICAgTUZDX0VOQ19HRVRDT05GX0ZSQU1FX1RBRywKKworICAgIC8qIEMyMTAgc3BlY2lmaWMgZmVhdHVyZSAqLworICAgIE1GQ19FTkNfU0VUQ09ORl9WVUlfSU5GTywKKyAgICBNRkNfRU5DX1NFVENPTkZfSV9QRVJJT0QsCisjaWZuZGVmIFMzRF9TVVBQT1JUCisgICAgTUZDX0VOQ19TRVRDT05GX0hJRVJfUAorI2Vsc2UKKyAgICBNRkNfRU5DX1NFVENPTkZfSElFUl9QLAorICAgIE1GQ19FTkNfU0VUQ09ORl9TRUlfR0VOLAorICAgIE1GQ19FTkNfU0VUQ09ORl9GUkFNRV9QQUNLSU5HCisjZW5kaWYKK30gU1NCU0lQX01GQ19FTkNfQ09ORjsKKwordHlwZWRlZiBlbnVtIHsKKyAgICBNRkNfR0VUT1VUQlVGX1NUQVRVU19OVUxMID0gMCwKKyAgICBNRkNfR0VUT1VUQlVGX0RFQ09ESU5HX09OTFkgPSAxLAorICAgIE1GQ19HRVRPVVRCVUZfRElTUExBWV9ERUNPRElORywKKyAgICBNRkNfR0VUT1VUQlVGX0RJU1BMQVlfT05MWSwKKyAgICBNRkNfR0VUT1VUQlVGX0RJU1BMQVlfRU5ELAorICAgIE1GQ19HRVRPVVRCVUZfQ0hBTkdFX1JFU09MCit9IFNTQlNJUF9NRkNfREVDX09VVEJVRl9TVEFUVVM7CisKK3R5cGVkZWYgZW51bSB7CisgICAgTUZDX0ZSQU1FX1RZUEVfTk9UX0NPREVELAorICAgIE1GQ19GUkFNRV9UWVBFX0lfRlJBTUUsCisgICAgTUZDX0ZSQU1FX1RZUEVfUF9GUkFNRSwKKyAgICBNRkNfRlJBTUVfVFlQRV9CX0ZSQU1FLAorICAgIE1GQ19GUkFNRV9UWVBFX09USEVSUworfSBTU0JTSVBfTUZDX0ZSQU1FX1RZUEU7CisKK3R5cGVkZWYgZW51bSB7CisgICAgTUZDX1JFVF9PSyAgICAgICAgICAgICAgICAgICAgICA9IDEsCisgICAgTUZDX1JFVF9GQUlMICAgICAgICAgICAgICAgICAgICA9IC0xMDAwLAorICAgIE1GQ19SRVRfT1BFTl9GQUlMICAgICAgICAgICAgICAgPSAtMTAwMSwKKyAgICBNRkNfUkVUX0NMT1NFX0ZBSUwgICAgICAgICAgICAgID0gLTEwMDIsCisKKyAgICBNRkNfUkVUX0RFQ19JTklUX0ZBSUwgICAgICAgICAgID0gLTIwMDAsCisgICAgTUZDX1JFVF9ERUNfRVhFX1RJTUVfT1VUICAgICAgICA9IC0yMDAxLAorICAgIE1GQ19SRVRfREVDX0VYRV9FUlIgICAgICAgICAgICAgPSAtMjAwMiwKKyAgICBNRkNfUkVUX0RFQ19HRVRfSU5CVUZfRkFJTCAgICAgID0gLTIwMDMsCisgICAgTUZDX1JFVF9ERUNfU0VUX0lOQlVGX0ZBSUwgICAgICA9IC0yMDA0LAorICAgIE1GQ19SRVRfREVDX0dFVF9PVVRCVUZfRkFJTCAgICAgPSAtMjAwNSwKKyAgICBNRkNfUkVUX0RFQ19HRVRfQ09ORl9GQUlMICAgICAgID0gLTIwMDYsCisgICAgTUZDX1JFVF9ERUNfU0VUX0NPTkZfRkFJTCAgICAgICA9IC0yMDA3LAorCisgICAgTUZDX1JFVF9FTkNfSU5JVF9GQUlMICAgICAgICAgICA9IC0zMDAwLAorICAgIE1GQ19SRVRfRU5DX0VYRV9USU1FX09VVCAgICAgICAgPSAtMzAwMSwKKyAgICBNRkNfUkVUX0VOQ19FWEVfRVJSICAgICAgICAgICAgID0gLTMwMDIsCisgICAgTUZDX1JFVF9FTkNfR0VUX0lOQlVGX0ZBSUwgICAgICA9IC0zMDAzLAorICAgIE1GQ19SRVRfRU5DX1NFVF9JTkJVRl9GQUlMICAgICAgPSAtMzAwNCwKKyAgICBNRkNfUkVUX0VOQ19HRVRfT1VUQlVGX0ZBSUwgICAgID0gLTMwMDUsCisgICAgTUZDX1JFVF9FTkNfU0VUX09VVEJVRl9GQUlMICAgICA9IC0zMDA2LAorICAgIE1GQ19SRVRfRU5DX0dFVF9DT05GX0ZBSUwgICAgICAgPSAtMzAwNywKKyAgICBNRkNfUkVUX0VOQ19TRVRfQ09ORl9GQUlMICAgICAgID0gLTMwMDgsCisKKyAgICBNRkNfUkVUX0lOVkFMSURfUEFSQU0gICAgICAgICAgID0gLTQwMDAKK30gU1NCU0lQX01GQ19FUlJPUl9DT0RFOworCit0eXBlZGVmIHN0cnVjdCB7CisgICAgdm9pZCAqWVBoeUFkZHI7ICAgICAgICAgICAgICAgICAgICAgLyogW09VVF0gcGh5c2ljYWwgYWRkcmVzcyBvZiBZICovCisgICAgdm9pZCAqQ1BoeUFkZHI7ICAgICAgICAgICAgICAgICAgICAgLyogW09VVF0gcGh5c2ljYWwgYWRkcmVzcyBvZiBDYkNyICovCisgICAgdm9pZCAqWVZpckFkZHI7ICAgICAgICAgICAgICAgICAgICAgLyogW09VVF0gdmlydHVhbCBhZGRyZXNzIG9mIFkgKi8KKyAgICB2b2lkICpDVmlyQWRkcjsgICAgICAgICAgICAgICAgICAgICAvKiBbT1VUXSB2aXJ0dWFsIGFkZHJlc3Mgb2YgQ2JDciAqLworCisgICAgaW50IGltZ193aWR0aDsgICAgICAgICAgICAgICAgICAgICAgLyogW09VVF0gd2lkdGggb2YgcmVhbCBpbWFnZSAqLworICAgIGludCBpbWdfaGVpZ2h0OyAgICAgICAgICAgICAgICAgICAgIC8qIFtPVVRdIGhlaWdodCBvZiByZWFsIGltYWdlICovCisgICAgaW50IGJ1Zl93aWR0aDsgICAgICAgICAgICAgICAgICAgICAgLyogW09VVF0gd2lkdGggYWxpZ25lZCB0byAxNiAqLworICAgIGludCBidWZfaGVpZ2h0OyAgICAgICAgICAgICAgICAgICAgIC8qIFtPVVRdIGhlaWdodCBhbGlnaGVkIHRvIDE2ICovCisKKyAgICBpbnQgdGltZXN0YW1wX3RvcDsgICAgICAgICAgICAgICAgICAvKiBbT1VUXSB0aW1lc3RhbXAgb2YgdG9wIGZpbGVkKFRoaXMgaXMgdXNlZCBmb3IgaW50ZXJsYWNlZCBzdHJlYW0pICovCisgICAgaW50IHRpbWVzdGFtcF9ib3R0b207ICAgICAgICAgICAgICAgLyogW09VVF0gdGltZXN0YW1wIG9mIGJvdHRvbSBmaWxlZChUaGlzIGlzIHVzZWQgZm9yIGludGVybGFjZWQgc3RyZWFtKSAqLworICAgIGludCBjb25zdW1lZEJ5dGU7ICAgICAgICAgICAgICAgICAgIC8qIFtPVVRdIHRoZSBudW1iZXIgb2YgYnl0ZSBjb25zdW1lZCBkdXJpbmcgZGVjb2RpbmcgKi8KKyAgICBpbnQgcmVzX2NoYW5nZTsgICAgICAgICAgICAgICAgICAgICAvKiBbT1VUXSB3aGV0aGVyIHJlc29sdXRpb24gaXMgY2hhbmdlZCBvciBub3QuIDA6IG5vdCBjaGFuZ2UsIDE6IGluY3JlYXNlZCwgMjogZGVjcmVhc2VkICovCisgICAgaW50IGNyb3BfdG9wX29mZnNldDsgICAgICAgICAgICAgICAgLyogW09VVF0gY3JvcCBpbmZvcm1hdGlvbiwgdG9wX29mZnNldCAqLworICAgIGludCBjcm9wX2JvdHRvbV9vZmZzZXQ7ICAgICAgICAgICAgIC8qIFtPVVRdIGNyb3AgaW5mb3JtYXRpb24sIGJvdHRvbV9vZmZzZXQgKi8KKyAgICBpbnQgY3JvcF9sZWZ0X29mZnNldDsgICAgICAgICAgICAgICAvKiBbT1VUXSBjcm9wIGluZm9ybWF0aW9uLCBsZWZ0X29mZnNldCAqLworICAgIGludCBjcm9wX3JpZ2h0X29mZnNldDsgICAgICAgICAgICAgIC8qIFtPVVRdIGNyb3AgaW5mb3JtYXRpb24sIHJpZ2h0X29mZnNldCAqLworICAgIGludCBkaXNwX3BpY19mcmFtZV90eXBlOyAgICAgICAgICAgIC8qIFtPVVRdIGRpc3BsYXkgcGljdHVyZSBmcmFtZSB0eXBlIGluZm9ybWF0aW9uICovCisKKyAgICAvKiBDMjEwIFVNUCBmZWF0dXJlICovCisgICAgdW5zaWduZWQgaW50IHlfY29va2llOyAgICAgICAgICAgICAgLyogW09VVF0gY29va2llIGZvciBZIGFkZHJlc3MgKi8KKyAgICB1bnNpZ25lZCBpbnQgY19jb29raWU7ICAgICAgICAgICAgICAvKiBbT1VUXSBjb29raWUgZm9yIENiQ3IgYWRkcmVzcywgSWYgaXQgaXMgMCwgWSBhbmQgQ2JDciBpcyBpbiBjb250aW5vdXMgbWVtb3J5ICovCit9IFNTQlNJUF9NRkNfREVDX09VVFBVVF9JTkZPOworCit0eXBlZGVmIHN0cnVjdCB7CisgICAgdm9pZCAqWVBoeUFkZHI7ICAgICAgICAgICAgICAgICAgICAgLyogW0lOL09VVF0gcGh5c2ljYWwgYWRkcmVzcyBvZiBZICovCisgICAgdm9pZCAqQ1BoeUFkZHI7ICAgICAgICAgICAgICAgICAgICAgLyogW0lOL09VVF0gcGh5c2ljYWwgYWRkcmVzcyBvZiBDYkNyICovCisgICAgdm9pZCAqWVZpckFkZHI7ICAgICAgICAgICAgICAgICAgICAgLyogW0lOL09VVF0gdmlydHVhbCBhZGRyZXNzIG9mIFkgKi8KKyAgICB2b2lkICpDVmlyQWRkcjsgICAgICAgICAgICAgICAgICAgICAvKiBbSU4vT1VUXSB2aXJ0dWFsIGFkZHJlc3Mgb2YgQ2JDciAqLworICAgIGludCBZU2l6ZTsgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIFtJTi9PVVRdIGlucHV0IHNpemUgb2YgWSBkYXRhICovCisgICAgaW50IENTaXplOyAgICAgICAgICAgICAgICAgICAgICAgICAgLyogW0lOL09VVF0gaW5wdXQgc2l6ZSBvZiBDYkNyIGRhdGEgKi8KKworICAgIC8qIEMyMTAgVU1QIGZlYXR1cmUgKi8KKyAgICB1bnNpZ25lZCBpbnQgeV9jb29raWU7ICAgICAgICAgICAgICAvKiBbT1VUXSBjb29raWUgZm9yIFkgYWRkcmVzcyAqLworICAgIHVuc2lnbmVkIGludCBjX2Nvb2tpZTsgICAgICAgICAgICAgIC8qIFtPVVRdIGNvb2tpZSBmb3IgQ2JDciBhZGRyZXNzLCBJZiBpdCBpcyAwLCBZIGFuZCBDYkNyIGlzIGluIGNvbnRpbm91cyBtZW1vcnkgKi8KK30gU1NCU0lQX01GQ19FTkNfSU5QVVRfSU5GTzsKKwordHlwZWRlZiBzdHJ1Y3QgeworICAgIHVuc2lnbmVkIGludCBkYXRhU2l6ZTsgICAgICAgICAgICAgIC8qIFtPVVRdIGVuY29kZWQgZGF0YSBzaXplKHdpdGhvdXQgaGVhZGVyKSAqLworICAgIHVuc2lnbmVkIGludCBoZWFkZXJTaXplOyAgICAgICAgICAgIC8qIFtPVVRdIGVuY29kZWQgaGVhZGVyIHNpemUgKi8KKyAgICB1bnNpZ25lZCBpbnQgZnJhbWVUeXBlOyAgICAgICAgICAgICAvKiBbT1VUXSBmcmFtZSB0eXBlIG9mIGVuY29kZWQgc3RyZWFtICovCisgICAgdm9pZCAqU3RybVBoeUFkZHI7ICAgICAgICAgICAgICAgICAgLyogW09VVF0gcGh5c2ljYWwgYWRkcmVzcyBvZiBZICovCisgICAgdm9pZCAqU3RybVZpckFkZHI7ICAgICAgICAgICAgICAgICAgLyogW09VVF0gdmlydHVhbCBhZGRyZXNzIG9mIFkgKi8KKyAgICB2b2lkICplbmNvZGVkWVBoeUFkZHI7ICAgICAgICAgICAgICAvKiBbT1VUXSBwaHlzaWNhbCBhZGRyZXNzIG9mIFkgd2hpY2ggaXMgZmx1c2hlZCAqLworICAgIHZvaWQgKmVuY29kZWRDUGh5QWRkcjsgICAgICAgICAgICAgIC8qIFtPVVRdIHBoeXNpY2FsIGFkZHJlc3Mgb2YgQyB3aGljaCBpcyBmbHVzaGVkICovCisKKyAgICAvKiBDMjEwIFVNUCBmZWF0dXJlICovCisgICAgdW5zaWduZWQgaW50IHN0cm1fY29va2llOyAgICAgICAgICAgLyogW09VVF0gY29va2UgZm9yIHN0cmVhbSBidWZmZXIgKi8KKyAgICB1bnNpZ25lZCBpbnQgeV9lbmNvZGVkX2Nvb2tpZTsgICAgICAvKiBbT1VUXSBjb29raWUgZm9yIFkgYWRkcmVzcyAqLworICAgIHVuc2lnbmVkIGludCBjX2VuY29kZWRfY29va2llOyAgICAgIC8qIFtPVVRdIGNvb2tpZSBmb3IgQ2JDciBhZGRyZXNzLCBJZiBpdCBpcyAwLCBZIGFuZCBDYkNyIGlzIGluIGNvbnRpbm91cyBtZW1vcnkgKi8KK30gU1NCU0lQX01GQ19FTkNfT1VUUFVUX0lORk87CisKK3R5cGVkZWYgc3RydWN0IHsKKyAgICAvKiBjb21tb24gcGFyYW1ldGVycyAqLworICAgIFNTQlNJUF9NRkNfQ09ERUNfVFlQRSBjb2RlY1R5cGU7ICAgICAgICAgICAgLyogW0lOXSBjb2RlYyB0eXBlICovCisgICAgaW50IFNvdXJjZVdpZHRoOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBbSU5dIHdpZHRoIG9mIHZpZGVvIHRvIGJlIGVuY29kZWQgKi8KKyAgICBpbnQgU291cmNlSGVpZ2h0OyAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIFtJTl0gaGVpZ2h0IG9mIHZpZGVvIHRvIGJlIGVuY29kZWQgKi8KKyAgICBpbnQgSURSUGVyaW9kOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIFtJTl0gR09QIG51bWJlcihpbnRlcnZhbCBvZiBJLWZyYW1lKSAqLworICAgIGludCBTbGljZU1vZGU7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogW0lOXSBNdWx0aSBzbGljZSBtb2RlICovCisgICAgaW50IFJhbmRvbUludHJhTUJSZWZyZXNoOyAgICAgICAgICAgICAgICAgICAvKiBbSU5dIGN5Y2xpYyBpbnRyYSByZWZyZXNoICovCisgICAgaW50IEVuYWJsZUZSTVJhdGVDb250cm9sOyAgICAgICAgICAgICAgICAgICAvKiBbSU5dIGZyYW1lIGJhc2VkIHJhdGUgY29udHJvbCBlbmFibGUgKi8KKyAgICBpbnQgQml0cmF0ZTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIFtJTl0gcmF0ZSBjb250cm9sIHBhcmFtZXRlcihiaXQgcmF0ZSkgKi8KKyAgICBpbnQgRnJhbWVRcDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIFtJTl0gVGhlIHF1YW50aXphdGlvbiBwYXJhbWV0ZXIgb2YgdGhlIGZyYW1lICovCisgICAgaW50IEZyYW1lUXBfUDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBbSU5dIFRoZSBxdWFudGl6YXRpb24gcGFyYW1ldGVyIG9mIHRoZSBQIGZyYW1lICovCisgICAgaW50IFFTQ29kZU1heDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBbSU5dIE1heGltdW0gUXVhbnRpemF0aW9uIHZhbHVlICovCisgICAgaW50IFFTQ29kZU1pbjsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBbSU5dIE1pbmltdW0gUXVhbnRpemF0aW9uIHZhbHVlICovCisgICAgaW50IENCUlBlcmlvZFJmOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBbSU5dIFJlYWN0aW9uIGNvZWZmaWNpZW50IHBhcmFtZXRlciBmb3IgcmF0ZSBjb250cm9sICovCisgICAgaW50IFBhZENvbnRyb2xPbjsgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBbSU5dIEVuYWJsZSBwYWRkaW5nIGNvbnRyb2wgKi8KKyAgICBpbnQgTHVtYVBhZFZhbDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIFtJTl0gTHVtYSBwZWwgdmFsdWUgdXNlZCB0byBmaWxsIHBhZGRpbmcgYXJlYSAqLworICAgIGludCBDYlBhZFZhbDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogW0lOXSBDQiBwZWwgdmFsdWUgdXNlZCB0byBmaWxsIHBhZGRpbmcgYXJlYSAqLworICAgIGludCBDclBhZFZhbDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogW0lOXSBDUiBwZWwgdmFsdWUgdXNlZCB0byBmaWxsIHBhZGRpbmcgYXJlYSAqLworICAgIGludCBGcmFtZU1hcDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogW0lOXSBFbmNvZGluZyBpbnB1dCBtb2RlKHRpbGUgbW9kZSBvciBsaW5lYXIgbW9kZSkgKi8KKyAgICBTU0JTSVBfTUZDX09VVFNUUk1fTU9ERV9UWVBFIE91dHB1dE1vZGU7ICAgIC8qIFtJTl0gT3V0cHV0IG1vZGU6IEZyYW1lL1NsaWNlICovCisKKyAgICAvKiBILjI2NCBzcGVjaWZpYyBwYXJhbWV0ZXJzICovCisgICAgaW50IFByb2ZpbGVJREM7ICAgICAgICAgICAgICAgICAgICAgLyogW0lOXSBwcm9maWxlICovCisgICAgaW50IExldmVsSURDOyAgICAgICAgICAgICAgICAgICAgICAgLyogW0lOXSBsZXZlbCAqLworICAgIGludCBGcmFtZVFwX0I7ICAgICAgICAgICAgICAgICAgICAgIC8qIFtJTl0gVGhlIHF1YW50aXphdGlvbiBwYXJhbWV0ZXIgb2YgdGhlIEIgZnJhbWUgKi8KKyAgICBpbnQgRnJhbWVSYXRlOyAgICAgICAgICAgICAgICAgICAgICAvKiBbSU5dIHJhdGUgY29udHJvbCBwYXJhbWV0ZXIoZnJhbWUgcmF0ZSkgKi8KKyAgICBpbnQgU2xpY2VBcmd1bWVudDsgICAgICAgICAgICAgICAgICAvKiBbSU5dIE1CIG51bWJlciBvciBieXRlIG51bWJlciAqLworICAgIGludCBOdW1iZXJCRnJhbWVzOyAgICAgICAgICAgICAgICAgIC8qIFtJTl0gVGhlIG51bWJlciBvZiBjb25zZWN1dGl2ZSBCIGZyYW1lIGluc2VydGVkICovCisgICAgaW50IE51bWJlclJlZmVyZW5jZUZyYW1lczsgICAgICAgICAgLyogW0lOXSBUaGUgbnVtYmVyIG9mIHJlZmVyZW5jZSBwaWN0dXJlcyB1c2VkICovCisgICAgaW50IE51bWJlclJlZkZvclBmcmFtZXM7ICAgICAgICAgICAgLyogW0lOXSBUaGUgbnVtYmVyIG9mIHJlZmVyZW5jZSBwaWN0dXJlcyB1c2VkIGZvciBlbmNvZGluZyBQIHBpY3R1cmVzICovCisgICAgaW50IExvb3BGaWx0ZXJEaXNhYmxlOyAgICAgICAgICAgICAgLyogW0lOXSBkaXNhYmxlIHRoZSBsb29wIGZpbHRlciAqLworICAgIGludCBMb29wRmlsdGVyQWxwaGFDME9mZnNldDsgICAgICAgIC8qIFtJTl0gQWxwaGEgJiBDMCBvZmZzZXQgZm9yIEguMjY0IGxvb3AgZmlsdGVyICovCisgICAgaW50IExvb3BGaWx0ZXJCZXRhT2Zmc2V0OyAgICAgICAgICAgLyogW0lOXSBCZXRhIG9mZnNldCBmb3IgSC4yNjQgbG9vcCBmaWx0ZXIgKi8KKyAgICBpbnQgU3ltYm9sTW9kZTsgICAgICAgICAgICAgICAgICAgICAvKiBbSU5dIFRoZSBtb2RlIG9mIGVudHJvcHkgY29kaW5nKENBQkFDLCBDQVZMQykgKi8KKyAgICBpbnQgUGljdHVyZUludGVybGFjZTsgICAgICAgICAgICAgICAvKiBbSU5dIEVuYWJsZXMgdGhlIGludGVybGFjZSBtb2RlICovCisgICAgaW50IFRyYW5zZm9ybTh4OE1vZGU7ICAgICAgICAgICAgICAgLyogW0lOXSBBbGxvdyA4eDggdHJhbnNmb3JtKFRoaXMgaXMgYWxsb3dlZCBvbmx5IGZvciBoaWdoIHByb2ZpbGUpICovCisgICAgaW50IEVuYWJsZU1CUmF0ZUNvbnRyb2w7ICAgICAgICAgICAgLyogW0lOXSBFbmFibGUgbWFjcm9ibG9jay1sZXZlbCByYXRlIGNvbnRyb2wgKi8KKyAgICBpbnQgRGFya0Rpc2FibGU7ICAgICAgICAgICAgICAgICAgICAvKiBbSU5dIERpc2FibGUgYWRhcHRpdmUgcmF0ZSBjb250cm9sIG9uIGRhcmsgcmVnaW9uICovCisgICAgaW50IFNtb290aERpc2FibGU7ICAgICAgICAgICAgICAgICAgLyogW0lOXSBEaXNhYmxlIGFkYXB0aXZlIHJhdGUgY29udHJvbCBvbiBzbW9vdGggcmVnaW9uICovCisgICAgaW50IFN0YXRpY0Rpc2FibGU7ICAgICAgICAgICAgICAgICAgLyogW0lOXSBEaXNhYmxlIGFkYXB0aXZlIHJhdGUgY29udHJvbCBvbiBzdGF0aWMgcmVnaW9uICovCisgICAgaW50IEFjdGl2aXR5RGlzYWJsZTsgICAgICAgICAgICAgICAgLyogW0lOXSBEaXNhYmxlIGFkYXB0aXZlIHJhdGUgY29udHJvbCBvbiBoaWdoIGFjdGl2aXR5IHJlZ2lvbiAqLworfSBTU0JTSVBfTUZDX0VOQ19IMjY0X1BBUkFNOworCit0eXBlZGVmIHN0cnVjdCB7CisgICAgLyogY29tbW9uIHBhcmFtZXRlcnMgKi8KKyAgICBTU0JTSVBfTUZDX0NPREVDX1RZUEUgY29kZWNUeXBlOyAgICAgICAgICAgIC8qIFtJTl0gY29kZWMgdHlwZSAqLworICAgIGludCBTb3VyY2VXaWR0aDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogW0lOXSB3aWR0aCBvZiB2aWRlbyB0byBiZSBlbmNvZGVkICovCisgICAgaW50IFNvdXJjZUhlaWdodDsgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBbSU5dIGhlaWdodCBvZiB2aWRlbyB0byBiZSBlbmNvZGVkICovCisgICAgaW50IElEUlBlcmlvZDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBbSU5dIEdPUCBudW1iZXIoaW50ZXJ2YWwgb2YgSS1mcmFtZSkgKi8KKyAgICBpbnQgU2xpY2VNb2RlOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIFtJTl0gTXVsdGkgc2xpY2UgbW9kZSAqLworICAgIGludCBSYW5kb21JbnRyYU1CUmVmcmVzaDsgICAgICAgICAgICAgICAgICAgLyogW0lOXSBjeWNsaWMgaW50cmEgcmVmcmVzaCAqLworICAgIGludCBFbmFibGVGUk1SYXRlQ29udHJvbDsgICAgICAgICAgICAgICAgICAgLyogW0lOXSBmcmFtZSBiYXNlZCByYXRlIGNvbnRyb2wgZW5hYmxlICovCisgICAgaW50IEJpdHJhdGU7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBbSU5dIHJhdGUgY29udHJvbCBwYXJhbWV0ZXIoYml0IHJhdGUpICovCisgICAgaW50IEZyYW1lUXA7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBbSU5dIFRoZSBxdWFudGl6YXRpb24gcGFyYW1ldGVyIG9mIHRoZSBmcmFtZSAqLworICAgIGludCBGcmFtZVFwX1A7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogW0lOXSBUaGUgcXVhbnRpemF0aW9uIHBhcmFtZXRlciBvZiB0aGUgUCBmcmFtZSAqLworICAgIGludCBRU0NvZGVNYXg7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogW0lOXSBNYXhpbXVtIFF1YW50aXphdGlvbiB2YWx1ZSAqLworICAgIGludCBRU0NvZGVNaW47ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogW0lOXSBNaW5pbXVtIFF1YW50aXphdGlvbiB2YWx1ZSAqLworICAgIGludCBDQlJQZXJpb2RSZjsgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogW0lOXSBSZWFjdGlvbiBjb2VmZmljaWVudCBwYXJhbWV0ZXIgZm9yIHJhdGUgY29udHJvbCAqLworICAgIGludCBQYWRDb250cm9sT247ICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogW0lOXSBFbmFibGUgcGFkZGluZyBjb250cm9sICovCisgICAgaW50IEx1bWFQYWRWYWw7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBbSU5dIEx1bWEgcGVsIHZhbHVlIHVzZWQgdG8gZmlsbCBwYWRkaW5nIGFyZWEgKi8KKyAgICBpbnQgQ2JQYWRWYWw7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIFtJTl0gQ0IgcGVsIHZhbHVlIHVzZWQgdG8gZmlsbCBwYWRkaW5nIGFyZWEgKi8KKyAgICBpbnQgQ3JQYWRWYWw7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIFtJTl0gQ1IgcGVsIHZhbHVlIHVzZWQgdG8gZmlsbCBwYWRkaW5nIGFyZWEgKi8KKyAgICBpbnQgRnJhbWVNYXA7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIFtJTl0gRW5jb2RpbmcgaW5wdXQgbW9kZSh0aWxlIG1vZGUgb3IgbGluZWFyIG1vZGUpICovCisgICAgU1NCU0lQX01GQ19PVVRTVFJNX01PREVfVFlQRSBPdXRwdXRNb2RlOyAgICAvKiBbSU5dIE91dHB1dCBtb2RlOiBGcmFtZS9TbGljZSAqLworCisgICAgLyogTVBFRzQgc3BlY2lmaWMgcGFyYW1ldGVycyAqLworICAgIGludCBQcm9maWxlSURDOyAgICAgICAgICAgICAgICAgICAgIC8qIFtJTl0gcHJvZmlsZSAqLworICAgIGludCBMZXZlbElEQzsgICAgICAgICAgICAgICAgICAgICAgIC8qIFtJTl0gbGV2ZWwgKi8KKyAgICBpbnQgRnJhbWVRcF9COyAgICAgICAgICAgICAgICAgICAgICAvKiBbSU5dIFRoZSBxdWFudGl6YXRpb24gcGFyYW1ldGVyIG9mIHRoZSBCIGZyYW1lICovCisgICAgaW50IFRpbWVJbmNyZWFtZW50UmVzOyAgICAgICAgICAgICAgLyogW0lOXSBmcmFtZSByYXRlICovCisgICAgaW50IFZvcFRpbWVJbmNyZWFtZW50OyAgICAgICAgICAgICAgLyogW0lOXSBmcmFtZSByYXRlICovCisgICAgaW50IFNsaWNlQXJndW1lbnQ7ICAgICAgICAgICAgICAgICAgLyogW0lOXSBNQiBudW1iZXIgb3IgYnl0ZSBudW1iZXIgKi8KKyAgICBpbnQgTnVtYmVyQkZyYW1lczsgICAgICAgICAgICAgICAgICAvKiBbSU5dIFRoZSBudW1iZXIgb2YgY29uc2VjdXRpdmUgQiBmcmFtZSBpbnNlcnRlZCAqLworICAgIGludCBEaXNhYmxlUXBlbE1FOyAgICAgICAgICAgICAgICAgIC8qIFtJTl0gZGlzYWJsZSBxdWFydGVyLXBpeGVsIG1vdGlvbiBlc3RpbWF0aW9uICovCit9IFNTQlNJUF9NRkNfRU5DX01QRUc0X1BBUkFNOworCit0eXBlZGVmIHN0cnVjdCB7CisgICAgLyogY29tbW9uIHBhcmFtZXRlcnMgKi8KKyAgICBTU0JTSVBfTUZDX0NPREVDX1RZUEUgY29kZWNUeXBlOyAgICAgICAgICAgIC8qIFtJTl0gY29kZWMgdHlwZSAqLworICAgIGludCBTb3VyY2VXaWR0aDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogW0lOXSB3aWR0aCBvZiB2aWRlbyB0byBiZSBlbmNvZGVkICovCisgICAgaW50IFNvdXJjZUhlaWdodDsgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBbSU5dIGhlaWdodCBvZiB2aWRlbyB0byBiZSBlbmNvZGVkICovCisgICAgaW50IElEUlBlcmlvZDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBbSU5dIEdPUCBudW1iZXIoaW50ZXJ2YWwgb2YgSS1mcmFtZSkgKi8KKyAgICBpbnQgU2xpY2VNb2RlOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIFtJTl0gTXVsdGkgc2xpY2UgbW9kZSAqLworICAgIGludCBSYW5kb21JbnRyYU1CUmVmcmVzaDsgICAgICAgICAgICAgICAgICAgLyogW0lOXSBjeWNsaWMgaW50cmEgcmVmcmVzaCAqLworICAgIGludCBFbmFibGVGUk1SYXRlQ29udHJvbDsgICAgICAgICAgICAgICAgICAgLyogW0lOXSBmcmFtZSBiYXNlZCByYXRlIGNvbnRyb2wgZW5hYmxlICovCisgICAgaW50IEJpdHJhdGU7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBbSU5dIHJhdGUgY29udHJvbCBwYXJhbWV0ZXIoYml0IHJhdGUpICovCisgICAgaW50IEZyYW1lUXA7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBbSU5dIFRoZSBxdWFudGl6YXRpb24gcGFyYW1ldGVyIG9mIHRoZSBmcmFtZSAqLworICAgIGludCBGcmFtZVFwX1A7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogW0lOXSBUaGUgcXVhbnRpemF0aW9uIHBhcmFtZXRlciBvZiB0aGUgUCBmcmFtZSAqLworICAgIGludCBRU0NvZGVNYXg7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogW0lOXSBNYXhpbXVtIFF1YW50aXphdGlvbiB2YWx1ZSAqLworICAgIGludCBRU0NvZGVNaW47ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogW0lOXSBNaW5pbXVtIFF1YW50aXphdGlvbiB2YWx1ZSAqLworICAgIGludCBDQlJQZXJpb2RSZjsgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogW0lOXSBSZWFjdGlvbiBjb2VmZmljaWVudCBwYXJhbWV0ZXIgZm9yIHJhdGUgY29udHJvbCAqLworICAgIGludCBQYWRDb250cm9sT247ICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogW0lOXSBFbmFibGUgcGFkZGluZyBjb250cm9sICovCisgICAgaW50IEx1bWFQYWRWYWw7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBbSU5dIEx1bWEgcGVsIHZhbHVlIHVzZWQgdG8gZmlsbCBwYWRkaW5nIGFyZWEgKi8KKyAgICBpbnQgQ2JQYWRWYWw7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIFtJTl0gQ0IgcGVsIHZhbHVlIHVzZWQgdG8gZmlsbCBwYWRkaW5nIGFyZWEgKi8KKyAgICBpbnQgQ3JQYWRWYWw7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIFtJTl0gQ1IgcGVsIHZhbHVlIHVzZWQgdG8gZmlsbCBwYWRkaW5nIGFyZWEgKi8KKyAgICBpbnQgRnJhbWVNYXA7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIFtJTl0gRW5jb2RpbmcgaW5wdXQgbW9kZSh0aWxlIG1vZGUgb3IgbGluZWFyIG1vZGUpICovCisKKyAgICAvKiBILjI2MyBzcGVjaWZpYyBwYXJhbWV0ZXJzICovCisgICAgaW50IEZyYW1lUmF0ZTsgICAgICAgICAgICAgICAgICAgICAgLyogW0lOXSByYXRlIGNvbnRyb2wgcGFyYW1ldGVyKGZyYW1lIHJhdGUpICovCit9IFNTQlNJUF9NRkNfRU5DX0gyNjNfUEFSQU07CisKK3R5cGVkZWYgc3RydWN0IHsKKyAgICBpbnQgd2lkdGg7CisgICAgaW50IGhlaWdodDsKKyAgICBpbnQgYnVmX3dpZHRoOworICAgIGludCBidWZfaGVpZ2h0OworfSBTU0JTSVBfTUZDX0lNR19SRVNPTFVUSU9OOworCit0eXBlZGVmIHN0cnVjdCB7CisgICAgaW50IGNyb3BfdG9wX29mZnNldDsKKyAgICBpbnQgY3JvcF9ib3R0b21fb2Zmc2V0OworICAgIGludCBjcm9wX2xlZnRfb2Zmc2V0OworICAgIGludCBjcm9wX3JpZ2h0X29mZnNldDsKK30gU1NCU0lQX01GQ19DUk9QX0lORk9STUFUSU9OOworCisjaWZkZWYgUzNEX1NVUFBPUlQKK3R5cGVkZWYgc3RydWN0IHsKKyAgICBpbnQgICAgICAgICAgIGF2YWlsYWJsZTsKKyAgICB1bnNpZ25lZCBpbnQgIGFycmFuZ2VtZW50X2lkOworICAgIGludCAgICAgICAgICAgYXJyYW5nZW1lbnRfY2FuY2VsX2ZsYWc7CisgICAgdW5zaWduZWQgY2hhciBhcnJhbmdlbWVudF90eXBlOworICAgIGludCAgICAgICAgICAgcXVpbmN1bnhfc2FtcGxpbmdfZmxhZzsKKyAgICB1bnNpZ25lZCBjaGFyIGNvbnRlbnRfaW50ZXJwcmV0YXRpb25fdHlwZTsKKyAgICBpbnQgICAgICAgICAgIHNwYXRpYWxfZmxpcHBpbmdfZmxhZzsKKyAgICBpbnQgICAgICAgICAgIGZyYW1lMF9mbGlwcGVkX2ZsYWc7CisgICAgaW50ICAgICAgICAgICBmaWVsZF92aWV3c19mbGFnOworICAgIGludCAgICAgICAgICAgY3VycmVudF9mcmFtZV9pc19mcmFtZTBfZmxhZzsKKyAgICB1bnNpZ25lZCBjaGFyIGZyYW1lMF9ncmlkX3Bvc194OworICAgIHVuc2lnbmVkIGNoYXIgZnJhbWUwX2dyaWRfcG9zX3k7CisgICAgdW5zaWduZWQgY2hhciBmcmFtZTFfZ3JpZF9wb3NfeDsKKyAgICB1bnNpZ25lZCBjaGFyIGZyYW1lMV9ncmlkX3Bvc195OworfSBTU0JTSVBfTUZDX0ZSQU1FX1BBQ0tJTkc7CisjZW5kaWYKKworI2lmZGVmIF9fY3BsdXNwbHVzCitleHRlcm4gIkMiIHsKKyNlbmRpZgorCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKy8qIERlY29kaW5nIEFQSXMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCit2b2lkICpTc2JTaXBNZmNEZWNPcGVuKHZvaWQpOwordm9pZCAqU3NiU2lwTWZjRGVjT3BlbkV4dCh2b2lkICp2YWx1ZSk7CitTU0JTSVBfTUZDX0VSUk9SX0NPREUgU3NiU2lwTWZjRGVjSW5pdCh2b2lkICpvcGVuSGFuZGxlLCBTU0JTSVBfTUZDX0NPREVDX1RZUEUgY29kZWNfdHlwZSwgaW50IEZyYW1lbGVuZyk7CitTU0JTSVBfTUZDX0VSUk9SX0NPREUgU3NiU2lwTWZjRGVjRXhlKHZvaWQgKm9wZW5IYW5kbGUsIGludCBsZW5ndGhCdWZGaWxsKTsKK1NTQlNJUF9NRkNfRVJST1JfQ09ERSBTc2JTaXBNZmNEZWNDbG9zZSh2b2lkICpvcGVuSGFuZGxlKTsKK3ZvaWQgICpTc2JTaXBNZmNEZWNHZXRJbkJ1Zih2b2lkICpvcGVuSGFuZGxlLCB2b2lkICoqcGh5SW5CdWYsIGludCBpbnB1dEJ1ZmZlclNpemUpOworCisKKyNpZiAoZGVmaW5lZChDT05GSUdfVklERU9fTUZDX1ZDTV9VTVApIHx8IGRlZmluZWQoVVNFX1VNUCkpCitTU0JTSVBfTUZDX0VSUk9SX0NPREUgU3NiU2lwTWZjRGVjU2V0SW5CdWYodm9pZCAqb3BlbkhhbmRsZSwgdW5zaWduZWQgaW50IHNlY3VyZV9pZCwgaW50IHNpemUpOworI2Vsc2UKK1NTQlNJUF9NRkNfRVJST1JfQ09ERSBTc2JTaXBNZmNEZWNTZXRJbkJ1Zih2b2lkICpvcGVuSGFuZGxlLCB2b2lkICpwaHlJbkJ1Ziwgdm9pZCAqdmlySW5CdWYsIGludCBzaXplKTsKKyNlbmRpZgorCitTU0JTSVBfTUZDX0RFQ19PVVRCVUZfU1RBVFVTIFNzYlNpcE1mY0RlY0dldE91dEJ1Zih2b2lkICpvcGVuSGFuZGxlLCBTU0JTSVBfTUZDX0RFQ19PVVRQVVRfSU5GTyAqb3V0cHV0X2luZm8pOworCitTU0JTSVBfTUZDX0VSUk9SX0NPREUgU3NiU2lwTWZjRGVjU2V0Q29uZmlnKHZvaWQgKm9wZW5IYW5kbGUsIFNTQlNJUF9NRkNfREVDX0NPTkYgY29uZl90eXBlLCB2b2lkICp2YWx1ZSk7CitTU0JTSVBfTUZDX0VSUk9SX0NPREUgU3NiU2lwTWZjRGVjR2V0Q29uZmlnKHZvaWQgKm9wZW5IYW5kbGUsIFNTQlNJUF9NRkNfREVDX0NPTkYgY29uZl90eXBlLCB2b2lkICp2YWx1ZSk7CisKK3ZvaWQgKlNzYlNpcE1mY0RlY0FsbG9jSW5wdXRCdWZmZXIodm9pZCAqb3BlbkhhbmRsZSwgdm9pZCAqKnBoeUluQnVmLCBpbnQgaW5wdXRCdWZmZXJTaXplKTsKK3ZvaWQgU3NiU2lwTWZjRGVjRnJlZUlucHV0QnVmZmVyKHZvaWQgKm9wZW5IYW5kbGUsIHZvaWQgKnBoeUluQnVmKTsKKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisvKiBFbmNvZGluZyBBUElzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwordm9pZCAqU3NiU2lwTWZjRW5jT3Blbih2b2lkKTsKK3ZvaWQgKlNzYlNpcE1mY0VuY09wZW5FeHQodm9pZCAqdmFsdWUpOworU1NCU0lQX01GQ19FUlJPUl9DT0RFIFNzYlNpcE1mY0VuY0luaXQodm9pZCAqb3BlbkhhbmRsZSwgdm9pZCAqcGFyYW0pOworU1NCU0lQX01GQ19FUlJPUl9DT0RFIFNzYlNpcE1mY0VuY0V4ZSh2b2lkICpvcGVuSGFuZGxlKTsKK1NTQlNJUF9NRkNfRVJST1JfQ09ERSBTc2JTaXBNZmNFbmNDbG9zZSh2b2lkICpvcGVuSGFuZGxlKTsKKworU1NCU0lQX01GQ19FUlJPUl9DT0RFIFNzYlNpcE1mY0VuY0dldEluQnVmKHZvaWQgKm9wZW5IYW5kbGUsIFNTQlNJUF9NRkNfRU5DX0lOUFVUX0lORk8gKmlucHV0X2luZm8pOworU1NCU0lQX01GQ19FUlJPUl9DT0RFIFNzYlNpcE1mY0VuY1NldEluQnVmKHZvaWQgKm9wZW5IYW5kbGUsIFNTQlNJUF9NRkNfRU5DX0lOUFVUX0lORk8gKmlucHV0X2luZm8pOworCitTU0JTSVBfTUZDX0VSUk9SX0NPREUgU3NiU2lwTWZjRW5jR2V0T3V0QnVmKHZvaWQgKm9wZW5IYW5kbGUsIFNTQlNJUF9NRkNfRU5DX09VVFBVVF9JTkZPICpvdXRwdXRfaW5mbyk7CitTU0JTSVBfTUZDX0VSUk9SX0NPREUgU3NiU2lwTWZjRW5jU2V0T3V0QnVmKHZvaWQgKm9wZW5IYW5kbGUsIHZvaWQgKnBoeU91dGJ1Ziwgdm9pZCAqdmlyT3V0YnVmLCBpbnQgb3V0cHV0QnVmZmVyU2l6ZSk7CisKK1NTQlNJUF9NRkNfRVJST1JfQ09ERSBTc2JTaXBNZmNFbmNTZXRDb25maWcodm9pZCAqb3BlbkhhbmRsZSwgU1NCU0lQX01GQ19FTkNfQ09ORiBjb25mX3R5cGUsIHZvaWQgKnZhbHVlKTsKK1NTQlNJUF9NRkNfRVJST1JfQ09ERSBTc2JTaXBNZmNFbmNHZXRDb25maWcodm9pZCAqb3BlbkhhbmRsZSwgU1NCU0lQX01GQ19FTkNfQ09ORiBjb25mX3R5cGUsIHZvaWQgKnZhbHVlKTsKKworI2lmZGVmIF9fY3BsdXNwbHVzCit9CisjZW5kaWYKKworI2VuZGlmIC8qIF9TU0JTSVBfTUZDX0FQSV9IXyAqLwpkaWZmIC0tZ2l0IGEvZXh5bm9zNC9tdWx0aW1lZGlhL2NvZGVjcy9zZWNfY29kZWNzL3ZpZGVvL2V4eW5vczQvbWZjL2luY2x1ZGUvbWZjX2Vycm5vLmggYi9leHlub3M0L211bHRpbWVkaWEvY29kZWNzL3NlY19jb2RlY3MvdmlkZW8vZXh5bm9zNC9tZmMvaW5jbHVkZS9tZmNfZXJybm8uaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zMDVhMjhlCi0tLSAvZGV2L251bGwKKysrIGIvZXh5bm9zNC9tdWx0aW1lZGlhL2NvZGVjcy9zZWNfY29kZWNzL3ZpZGVvL2V4eW5vczQvbWZjL2luY2x1ZGUvbWZjX2Vycm5vLmgKQEAgLTAsMCArMSw3OSBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxMCBTYW1zdW5nIEVsZWN0cm9uaWNzIENvLiwgTHRkLgorICogICAgICAgICAgICAgIGh0dHA6Ly93d3cuc2Ftc3VuZy5jb20vCisgKgorICogR2xvYmFsIGhlYWRlciBmb3IgU2Ftc3VuZyBNRkMgKE11bHRpIEZ1bmN0aW9uIENvZGVjIC0gRklNVikgZHJpdmVyCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIGFzCisgKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqCisgKiBBbHRlcm5hdGl2ZWx5LCBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2lmbmRlZiBfX01GQ19FUlJOT19ICisjZGVmaW5lIF9fTUZDX0VSUk5PX0ggX19GSUxFX18KKworZW51bSBtZmNfcmV0X2NvZGUgeworICAgIE1GQ19PSyA9IDEsCisgICAgTUZDX0ZBSUwgPSAtMTAwMCwKKyAgICBNRkNfT1BFTl9GQUlMID0gLTEwMDEsCisgICAgTUZDX0NMT1NFX0ZBSUwgPSAtMTAwMiwKKworICAgIE1GQ19ERUNfSU5JVF9GQUlMID0gLTIwMDAsCisgICAgTUZDX0RFQ19FWEVfVElNRV9PVVQgPSAtMjAwMSwKKyAgICBNRkNfREVDX0VYRV9FUlIgPSAtMjAwMiwKKyAgICBNRkNfREVDX0dFVF9JTkJVRl9GQUlMID0gMjAwMywKKyAgICBNRkNfREVDX1NFVF9JTkJVRl9GQUlMID0gMjAwNCwKKyAgICBNRkNfREVDX0dFVF9PVVRCVUZfRkFJTCA9IC0yMDA1LAorICAgIE1GQ19ERUNfR0VUX0NPTkZfRkFJTCA9IC0yMDA2LAorICAgIE1GQ19ERUNfU0VUX0NPTkZfRkFJTCA9IC0yMDA3LAorCisgICAgTUZDX0VOQ19JTklUX0ZBSUwgPSAtMzAwMCwKKyAgICBNRkNfRU5DX0VYRV9USU1FX09VVCA9IC0zMDAxLAorICAgIE1GQ19FTkNfRVhFX0VSUiA9IC0zMDAyLAorICAgIE1GQ19FTkNfR0VUX0lOQlVGX0ZBSUwgPSAtMzAwMywKKyAgICBNRkNfRU5DX1NFVF9JTkJVRl9GQUlMID0gLTMwMDQsCisgICAgTUZDX0VOQ19HRVRfT1VUQlVGX0ZBSUwgPSAtMzAwNSwKKyAgICBNRkNfRU5DX1NFVF9PVVRCVUZfRkFJTCA9IC0zMDA2LAorICAgIE1GQ19FTkNfR0VUX0NPTkZfRkFJTCA9IC0zMDA3LAorICAgIE1GQ19FTkNfU0VUX0NPTkZfRkFJTCA9IC0zMDA4LAorCisgICAgTUZDX1NUQVRFX0lOVkFMSUQgPSAtNDAwMCwKKyAgICBNRkNfREVDX0hFQURFUl9GQUlMID0gLTQwMDEsCisgICAgTUZDX0RFQ19JTklUX0JVRl9GQUlMID0gLTQwMDIsCisgICAgTUZDX0VOQ19IRUFERVJfRkFJTCA9IC01MDAwLAorICAgIE1GQ19FTkNfUEFSQU1fRkFJTCA9IC01MDAxLAorICAgIE1GQ19GUk1fQlVGX1NJWkVfRkFJTCA9IC02MDAwLAorICAgIE1GQ19GV19MT0FEX0ZBSUwgPSAtNjAwMSwKKyAgICBNRkNfRldfSU5JVF9GQUlMID0gLTYwMDIsCisgICAgTUZDX0lOU1RfTlVNX0VYQ0VFREVEX0ZBSUwgPSAtNjAwMywKKyAgICBNRkNfTUVNX0FMTE9DX0ZBSUwgPSAtNjAwNCwKKyAgICBNRkNfTUVNX0lOVkFMSURfQUREUl9GQUlMID0gLTYwMDUsCisgICAgTUZDX01FTV9NQVBQSU5HX0ZBSUwgPSAtNjAwNiwKKyAgICBNRkNfR0VUX0NPTkZfRkFJTCA9IC02MDA3LAorICAgIE1GQ19TRVRfQ09ORl9GQUlMID0gLTYwMDgsCisgICAgTUZDX0lOVkFMSURfUEFSQU1fRkFJTCA9IC02MDA5LAorICAgIE1GQ19BUElfRkFJTCA9IC05MDAwLAorCisgICAgTUZDX0NNRF9GQUlMID0gLTEwMDMsCisgICAgTUZDX1NMRUVQX0ZBSUwgPSAtMTAxMCwKKyAgICBNRkNfV0FLRVVQX0ZBSUwgPSAtMTAyMCwKKworICAgIE1GQ19DTEtfT05fRkFJTCA9IC0xMDMwLAorICAgIE1GQ19DTEtfT0ZGX0ZBSUwgPSAtMTAzMCwKKyAgICBNRkNfUFdSX09OX0ZBSUwgPSAtMTA0MCwKKyAgICBNRkNfUFdSX09GRl9GQUlMID0gLTEwNDEsCit9IDsKKworI2VuZGlmIC8qIF9fTUZDX0VSUk5PX0ggKi8KZGlmZiAtLWdpdCBhL2V4eW5vczQvbXVsdGltZWRpYS9jb2RlY3Mvc2VjX2NvZGVjcy92aWRlby9leHlub3M0L21mYy9pbmNsdWRlL21mY19pbnRlcmZhY2UuaCBiL2V4eW5vczQvbXVsdGltZWRpYS9jb2RlY3Mvc2VjX2NvZGVjcy92aWRlby9leHlub3M0L21mYy9pbmNsdWRlL21mY19pbnRlcmZhY2UuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41MjEyZGMxCi0tLSAvZGV2L251bGwKKysrIGIvZXh5bm9zNC9tdWx0aW1lZGlhL2NvZGVjcy9zZWNfY29kZWNzL3ZpZGVvL2V4eW5vczQvbWZjL2luY2x1ZGUvbWZjX2ludGVyZmFjZS5oCkBAIC0wLDAgKzEsNTI2IEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDEwIFNhbXN1bmcgRWxlY3Ryb25pY3MgQ28uLCBMdGQuCisgKiAgICAgICAgICAgICAgaHR0cDovL3d3dy5zYW1zdW5nLmNvbS8KKyAqCisgKiBHbG9iYWwgaGVhZGVyIGZvciBTYW1zdW5nIE1GQyAoTXVsdGkgRnVuY3Rpb24gQ29kZWMgLSBGSU1WKSBkcml2ZXIKKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgYXMKKyAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICoKKyAqIEFsdGVybmF0aXZlbHksIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaWZuZGVmIF9fTUZDX0lOVEVSRkFDRV9ICisjZGVmaW5lIF9fTUZDX0lOVEVSRkFDRV9IIF9fRklMRV9fCisKKyNpbmNsdWRlICJtZmNfZXJybm8uaCIKKyNpbmNsdWRlICJTc2JTaXBNZmNBcGkuaCIKKworI2RlZmluZSBJT0NUTF9NRkNfREVDX0lOSVQgICAgICAgICAgICAgICgweDAwODAwMDAxKQorI2RlZmluZSBJT0NUTF9NRkNfRU5DX0lOSVQgICAgICAgICAgICAgICgweDAwODAwMDAyKQorI2RlZmluZSBJT0NUTF9NRkNfREVDX0VYRSAgICAgICAgICAgICAgICgweDAwODAwMDAzKQorI2RlZmluZSBJT0NUTF9NRkNfRU5DX0VYRSAgICAgICAgICAgICAgICgweDAwODAwMDA0KQorCisjZGVmaW5lIElPQ1RMX01GQ19HRVRfSU5fQlVGICAgICAgICAgICAgKDB4MDA4MDAwMTApCisjZGVmaW5lIElPQ1RMX01GQ19GUkVFX0JVRiAgICAgICAgICAgICAgKDB4MDA4MDAwMTEpCisjZGVmaW5lIElPQ1RMX01GQ19HRVRfUkVBTF9BRERSICAgICAgICAgKDB4MDA4MDAwMTIpCisjZGVmaW5lIElPQ1RMX01GQ19HRVRfTU1BUF9TSVpFICAgICAgICAgKDB4MDA4MDAwMTQpCisjZGVmaW5lIElPQ1RMX01GQ19TRVRfSU5fQlVGICAgICAgICAgICAgKDB4MDA4MDAwMTgpCisKKyNkZWZpbmUgSU9DVExfTUZDX1NFVF9DT05GSUcgICAgICAgICAgICAoMHgwMDgwMDEwMSkKKyNkZWZpbmUgSU9DVExfTUZDX0dFVF9DT05GSUcgICAgICAgICAgICAoMHgwMDgwMDEwMikKKworI2RlZmluZSBJT0NUTF9NRkNfU0VUX0JVRl9DQUNIRSAgICAgICAgICgweDAwODAwMjAxKQorCisvKiBNRkMgSC9XIHN1cHBvcnQgbWF4aW11bSAzMiBleHRyYSBEUEIuICovCisjZGVmaW5lIE1GQ19NQVhfRVhUUkFfRFBCICAgICAgICAgICAgICAgNQorI2RlZmluZSBNRkNfTUFYX0RJU1BfREVMQVkgICAgICAgICAgICAgIDB4RgorCisjZGVmaW5lIE1GQ19MSUJfVkVSX01BSk9SICAgICAgICAgICAgICAgMQorI2RlZmluZSBNRkNfTElCX1ZFUl9NSU5PUiAgICAgICAgICAgICAgIDAwCisKKyNkZWZpbmUgQlVGX0xfVU5JVCAgICAgICAgICAgICAgICAgICAgICAoMTAyNCkKKyNkZWZpbmUgQWxpZ24oeCwgYWxpZ25ieXRlKSAgICAgICAgICAgICAoKCh4KSsoYWxpZ25ieXRlKS0xKS8oYWxpZ25ieXRlKSooYWxpZ25ieXRlKSkKKworZW51bSBpbnN0X3R5cGUgeworICAgIERFQ09ERVIgPSAweDEsCisgICAgRU5DT0RFUiA9IDB4MiwKK307CisKK3R5cGVkZWYgZW51bSB7CisgICAgTUZDX1VOUEFDS0VEX1BCID0gMCwKKyAgICBNRkNfUEFDS0VEX1BCID0gMQorfSBtZmNfcGFja2VkX21vZGU7CisKKwordHlwZWRlZiBlbnVtCit7CisgICAgTUZDX1VTRV9OT05FID0gMHgwMCwKKyAgICBNRkNfVVNFX1lVVl9CVUZGID0gMHgwMSwKKyAgICBNRkNfVVNFX1NUUk1fQlVGRiA9IDB4MTAKK30gczNjX21mY19pbnRlcmJ1ZmZfc3RhdHVzOworCit0eXBlZGVmIHN0cnVjdAoreworICAgIGludCBsdW1hMDsgICAvKiBwZXIgZnJhbWUgKG9yIHRvcCBmaWVsZCkgKi8KKyAgICBpbnQgY2hyb21hMDsgLyogcGVyIGZyYW1lIChvciB0b3AgZmllbGQpICovCisgICAgaW50IGx1bWExOyAgIC8qIHBlciBmcmFtZSAob3IgYm90dG9tIGZpZWxkKSAqLworICAgIGludCBjaHJvbWExOyAvKiBwZXIgZnJhbWUgKG9yIGJvdHRvbSBmaWVsZCkgKi8KK30gU1NCU0lQX01GQ19DUkNfREFUQTsKKworc3RydWN0IG1mY19zdHJtX3JlZl9idWZfYXJnIHsKKyAgICB1bnNpZ25lZCBpbnQgc3RybV9yZWZfeTsKKyAgICB1bnNpZ25lZCBpbnQgbXZfcmVmX3ljOworfTsKKworc3RydWN0IG1mY19mcmFtZV9idWZfYXJnIHsKKyAgICB1bnNpZ25lZCBpbnQgbHVtYTsKKyAgICB1bnNpZ25lZCBpbnQgY2hyb21hOworfTsKKworCitzdHJ1Y3QgbWZjX2VuY19pbml0X2NvbW1vbl9hcmcgeworICAgIFNTQlNJUF9NRkNfQ09ERUNfVFlQRSBpbl9jb2RlY190eXBlOyAvKiBbSU5dIGNvZGVjIHR5cGUgKi8KKworICAgIGludCBpbl93aWR0aDsgICAgICAgICAgICAgICAvKiBbSU5dIHdpZHRoIG9mIFlVVjQyMCBmcmFtZSB0byBiZSBlbmNvZGVkICovCisgICAgaW50IGluX2hlaWdodDsgICAgICAgICAgICAgIC8qIFtJTl0gaGVpZ2h0IG9mIFlVVjQyMCBmcmFtZSB0byBiZSBlbmNvZGVkICovCisKKyAgICBpbnQgaW5fZ29wX251bTsgICAgICAgICAgICAgLyogW0lOXSBHT1AgTnVtYmVyIChpbnRlcnZhbCBvZiBJLWZyYW1lKSAqLworICAgIGludCBpbl92b3BfcXVhbnQ7ICAgICAgICAgICAvKiBbSU5dIFZPUCBxdWFudCAqLworICAgIGludCBpbl92b3BfcXVhbnRfcDsJICAgICAgICAvKiBbSU5dIFZPUCBxdWFudCBmb3IgUCBmcmFtZSAqLworCisgICAgLyogW0lOXSBSQyBlbmFibGUgKi8KKyAgICAvKiBbSU5dIFJDIGVuYWJsZSAoMDpkaXNhYmxlLCAxOmZyYW1lIGxldmVsIFJDKSAqLworICAgIGludCBpbl9yY19mcl9lbjsKKyAgICBpbnQgaW5fcmNfYml0cmF0ZTsgICAgICAgICAgLyogW0lOXSAgUkMgcGFyYW1ldGVyIChiaXRyYXRlIGluIGticHMpICovCisKKyAgICBpbnQgaW5fcmNfcWJvdW5kX21pbjsgICAgICAgLyogW0lOXSAgUkMgcGFyYW1ldGVyIChRIGJvdW5kIE1pbikgKi8KKyAgICBpbnQgaW5fcmNfcWJvdW5kX21heDsgICAgICAgLyogW0lOXSAgUkMgcGFyYW1ldGVyIChRIGJvdW5kIE1heCkgKi8KKyAgICBpbnQgaW5fcmNfcnBhcmE7ICAgICAgICAgICAgLyogW0lOXSAgUkMgcGFyYW1ldGVyIChSZWFjdGlvbiBDb2VmZmljaWVudCkgKi8KKworICAgIC8qIFtJTl0gTXVsdGktc2xpY2UgbW9kZSAoMDpzaW5nbGUsIDE6bXVsdGlwbGUpICovCisgICAgaW50IGluX21zX21vZGU7CisgICAgLyogW0lOXSBNdWx0aS1zbGljZSBzaXplIChpbiBudW0uIG9mIG1iIG9yIGJ5dGUpICovCisgICAgaW50IGluX21zX2FyZzsKKworICAgIGludCBpbl9tYl9yZWZyZXNoOyAgICAgICAgICAvKiBbSU5dIE1hY3JvYmxvY2sgcmVmcmVzaCAqLworCisgICAgLyogW0lOXSBFbmFibGUgKDEpIC8gRGlzYWJsZSAoMCkgcGFkZGluZyB3aXRoIHRoZSBzcGVjaWZpZWQgdmFsdWVzICovCisgICAgaW50IGluX3BhZF9jdHJsX29uOworCisgICAgLyogW0lOXSBwYWQgdmFsdWUgaWYgcGFkX2N0cmxfb24gaXMgRW5hYmxlICovCisgICAgaW50IGluX3lfcGFkX3ZhbDsKKyAgICBpbnQgaW5fY2JfcGFkX3ZhbDsKKyAgICBpbnQgaW5fY3JfcGFkX3ZhbDsKKworICAgIC8qIGxpbmVhciBvciB0aWxlZCAqLworICAgIGludCBpbl9mcmFtZV9tYXA7CisKKyAgICB1bnNpZ25lZCBpbnQgaW5fcGl4ZWxjYWNoZTsKKworICAgIFNTQlNJUF9NRkNfT1VUU1RSTV9NT0RFX1RZUEUgaW5fb3V0cHV0X21vZGU7CisKKyAgICB1bnNpZ25lZCBpbnQgaW5fbWFwcGVkX2FkZHI7CisgICAgc3RydWN0IG1mY19zdHJtX3JlZl9idWZfYXJnIG91dF91X2FkZHI7CisgICAgc3RydWN0IG1mY19zdHJtX3JlZl9idWZfYXJnIG91dF9wX2FkZHI7CisgICAgc3RydWN0IG1mY19zdHJtX3JlZl9idWZfYXJnIG91dF9idWZfc2l6ZTsKKyAgICB1bnNpZ25lZCBpbnQgb3V0X2hlYWRlcl9zaXplOworfTsKKworc3RydWN0IG1mY19lbmNfaW5pdF9oMjYzX2FyZyB7CisgICAgaW50IGluX3JjX2ZyYW1lcmF0ZTsgLyogW0lOXSAgUkMgcGFyYW1ldGVyIChmcmFtZXJhdGUpICovCit9OworCitzdHJ1Y3QgbWZjX2VuY19pbml0X21wZWc0X2FyZyB7CisgICAgaW50IGluX3Byb2ZpbGU7IC8qIFtJTl0gcHJvZmlsZSAqLworICAgIGludCBpbl9sZXZlbDsgICAvKiBbSU5dIGxldmVsICovCisKKyAgICBpbnQgaW5fdm9wX3F1YW50X2I7IC8qIFtJTl0gVk9QIHF1YW50IGZvciBCIGZyYW1lICovCisKKyAgICAvKiBbSU5dIEIgZnJhbWUgbnVtYmVyICovCisgICAgaW50IGluX2JmcmFtZW51bTsKKworICAgIC8qIFtJTl0gUXVhcnRlci1wZWwgTUMgZW5hYmxlICgxOmVuYWJsZWQsIDA6ZGlzYWJsZWQpICovCisgICAgaW50IGluX3F1YXJ0X3BpeGVsOworCisgICAgaW50IGluX1RpbWVJbmNyZWFtZW50UmVzOyAvKiBbSU5dIFZPUCB0aW1lIHJlc29sdXRpb24gKi8KKyAgICBpbnQgaW5fVm9wVGltZUluY3JlYW1lbnQ7IC8qIFtJTl0gRnJhbWUgZGVsdGEgKi8KK307CisKK3N0cnVjdCBtZmNfZW5jX2luaXRfaDI2NF9hcmcgeworICAgIGludCBpbl9wcm9maWxlOyAvKiBbSU5dIHByb2ZpbGUgKi8KKyAgICBpbnQgaW5fbGV2ZWw7ICAgLyogW0lOXSBsZXZlbCAqLworCisgICAgaW50IGluX3ZvcF9xdWFudF9iOwkvKiBbSU5dIFZPUCBxdWFudCBmb3IgQiBmcmFtZSAqLworCisgICAgLyogW0lOXSBCIGZyYW1lIG51bWJlciAqLworICAgIGludCBpbl9iZnJhbWVudW07CisKKyAgICAvKiBbSU5dIGludGVybGFjZSBtb2RlKDA6cHJvZ3Jlc3NpdmUsIDE6aW50ZXJsYWNlKSAqLworICAgIGludCBpbl9pbnRlcmxhY2VfbW9kZTsKKworICAgIC8qIFtJTl0gIHJlZmVyZW5jZSBudW1iZXIgKi8KKyAgICBpbnQgaW5fcmVmZXJlbmNlX251bTsKKyAgICAvKiBbSU5dICByZWZlcmVuY2UgbnVtYmVyIG9mIFAgZnJhbWUgKi8KKyAgICBpbnQgaW5fcmVmX251bV9wOworCisgICAgaW50IGluX3JjX2ZyYW1lcmF0ZTsgLyogW0lOXSAgUkMgcGFyYW1ldGVyIChmcmFtZXJhdGUpICovCisgICAgaW50IGluX3JjX21iX2VuOyAgICAgLyogW0lOXSBSQyBlbmFibGUgKDA6ZGlzYWJsZSwgMTpNQiBsZXZlbCBSQykgKi8KKyAgICAvKiBbSU5dIE1CIGxldmVsIHJhdGUgY29udHJvbCBkYXJrIHJlZ2lvbiBhZGFwdGl2ZSBmZWF0dXJlICovCisgICAgaW50IGluX3JjX21iX2RhcmtfZGlzOyAgICAgLyogKDA6ZW5hYmxlLCAxOmRpc2FibGUpICovCisgICAgLyogW0lOXSBNQiBsZXZlbCByYXRlIGNvbnRyb2wgc21vb3RoIHJlZ2lvbiBhZGFwdGl2ZSBmZWF0dXJlICovCisgICAgaW50IGluX3JjX21iX3Ntb290aF9kaXM7ICAgLyogKDA6ZW5hYmxlLCAxOmRpc2FibGUpICovCisgICAgLyogW0lOXSBNQiBsZXZlbCByYXRlIGNvbnRyb2wgc3RhdGljIHJlZ2lvbiBhZGFwdGl2ZSBmZWF0dXJlICovCisgICAgaW50IGluX3JjX21iX3N0YXRpY19kaXM7ICAgLyogKDA6ZW5hYmxlLCAxOmRpc2FibGUpICovCisgICAgLyogW0lOXSBNQiBsZXZlbCByYXRlIGNvbnRyb2wgYWN0aXZpdHkgcmVnaW9uIGFkYXB0aXZlIGZlYXR1cmUgKi8KKyAgICBpbnQgaW5fcmNfbWJfYWN0aXZpdHlfZGlzOyAvKiAoMDplbmFibGUsIDE6ZGlzYWJsZSkgKi8KKworICAgIC8qIFtJTl0gIGRpc2FibGUgZGVibG9ja2luZyBmaWx0ZXIgaWRjICovCisgICAgaW50IGluX2RlYmxvY2tfZGlzOwkvKiAoMDogZW5hYmxlLDE6IGRpc2FibGUsIDI6RGlzYWJsZSBhdCBzbGljZSBib3VuZGFyeSkgKi8KKyAgICAvKiBbSU5dICBzbGljZSBhbHBoYSBjMCBvZmZzZXQgb2YgZGVibG9ja2luZyBmaWx0ZXIgKi8KKyAgICBpbnQgaW5fZGVibG9ja19hbHBoYV9jMDsKKyAgICAvKiBbSU5dICBzbGljZSBiZXRhIG9mZnNldCBvZiBkZWJsb2NraW5nIGZpbHRlciAqLworICAgIGludCBpbl9kZWJsb2NrX2JldGE7CisKKyAgICAvKiBbSU5dICAoIDAgOiBDQVZMQywgMSA6IENBQkFDICkgKi8KKyAgICBpbnQgaW5fc3ltYm9sbW9kZTsKKyAgICAvKiBbSU5dICgwOiBvbmx5IDR4NCB0cmFuc2Zvcm0sIDE6IGFsbG93IHVzaW5nIDh4OCB0cmFuc2Zvcm0pICovCisgICAgaW50IGluX3RyYW5zZm9ybTh4OF9tb2RlOworCisgICAgLyogW0lOXSBJbnRlciB3ZWlnaHRlZCBwYXJhbWV0ZXIgZm9yIG1vZGUgZGVjaXNpb24gKi8KKyAgICBpbnQgaW5fbWRfaW50ZXJ3ZWlnaHRfcHBzOworICAgIC8qIFtJTl0gSW50cmEgd2VpZ2h0ZWQgcGFyYW1ldGVyIGZvciBtb2RlIGRlY2lzaW9uICovCisgICAgaW50IGluX21kX2ludHJhd2VpZ2h0X3BwczsKK307CisKK3N0cnVjdCBtZmNfZW5jX2luaXRfYXJnIHsKKyAgICBzdHJ1Y3QgbWZjX2VuY19pbml0X2NvbW1vbl9hcmcgY21uOworICAgIHVuaW9uIHsKKyAgICAgICAgc3RydWN0IG1mY19lbmNfaW5pdF9oMjY0X2FyZyBoMjY0OworICAgICAgICBzdHJ1Y3QgbWZjX2VuY19pbml0X21wZWc0X2FyZyBtcGVnNDsKKyAgICAgICAgc3RydWN0IG1mY19lbmNfaW5pdF9oMjYzX2FyZyBoMjYzOworICAgIH0gY29kZWM7Cit9OworCitzdHJ1Y3QgbWZjX2VuY19leGVfYXJnIHsKKyAgICBTU0JTSVBfTUZDX0NPREVDX1RZUEUgaW5fY29kZWNfdHlwZTsgLyogW0lOXSAgY29kZWMgdHlwZSAqLworICAgIHVuc2lnbmVkIGludCBpbl9ZX2FkZHI7ICAgICAgICAgICAgICAvKiBbSU5dICBJbi1idWZmZXIgYWRkciBvZiBZIGNvbXBvbmVudCAqLworICAgIHVuc2lnbmVkIGludCBpbl9DYkNyX2FkZHI7ICAgICAgICAgICAvKiBbSU5dICBJbi1idWZmZXIgYWRkciBvZiBDYkNyIGNvbXBvbmVudCAqLworICAgIHVuc2lnbmVkIGludCBpbl9ZX2FkZHJfdmlyOyAgICAgICAgICAvKiBbSU5dICBJbi1idWZmZXIgYWRkciBvZiBZIGNvbXBvbmVudCAqLworICAgIHVuc2lnbmVkIGludCBpbl9DYkNyX2FkZHJfdmlyOyAgICAgICAvKiBbSU5dICBJbi1idWZmZXIgYWRkciBvZiBDYkNyIGNvbXBvbmVudCAqLworICAgIHVuc2lnbmVkIGludCBpbl9zdHJtX3N0OyAgICAgICAgICAgICAvKiBbSU5dICBPdXQtYnVmZmVyIHN0YXJ0IGFkZHIgb2YgZW5jb2RlZCBzdHJtICovCisgICAgdW5zaWduZWQgaW50IGluX3N0cm1fZW5kOyAgICAgICAgICAgIC8qIFtJTl0gIE91dC1idWZmZXIgZW5kIGFkZHIgb2YgZW5jb2RlZCBzdHJtICovCisgICAgdW5zaWduZWQgaW50IGluX2ZyYW1ldGFnOyAgICAgICAgICAgIC8qIFtJTl0gIHVuaXF1ZSBmcmFtZSBJRCAqLworCisgICAgdW5zaWduZWQgaW50IG91dF9mcmFtZV90eXBlOyAgICAgICAgIC8qIFtPVVRdIGZyYW1lIHR5cGUgKi8KKyAgICBpbnQgb3V0X2VuY29kZWRfc2l6ZTsgICAgICAgICAgICAgICAgLyogW09VVF0gTGVuZ3RoIG9mIEVuY29kZWQgdmlkZW8gc3RyZWFtICovCisgICAgdW5zaWduZWQgaW50IG91dF9ZX2FkZHI7ICAgICAgICAgICAgIC8qIFtPVVRdT3V0LWJ1ZmZlciBhZGRyIG9mIGVuY29kZWQgWSBjb21wb25lbnQgKi8KKyAgICB1bnNpZ25lZCBpbnQgb3V0X0NiQ3JfYWRkcjsgICAgICAgICAgLyogW09VVF1PdXQtYnVmZmVyIGFkZHIgb2YgZW5jb2RlZCBDYkNyIGNvbXBvbmVudCAqLworICAgIHVuc2lnbmVkIGludCBvdXRfZnJhbWV0YWdfdG9wOyAgICAgICAvKiBbT1VUXSB1bmlxdWUgZnJhbWUgSUQgb2YgYW4gb3V0cHV0IGZyYW1lIG9yIHRvcCBmaWVsZCAqLworICAgIHVuc2lnbmVkIGludCBvdXRfZnJhbWV0YWdfYm90dG9tOyAgICAvKiBbT1VUXSB1bmlxdWUgZnJhbWUgSUQgb2YgYm90dG9tIGZpZWxkICovCisKKyNpZiBkZWZpbmVkKENPTkZJR19WSURFT19NRkNfVkNNX1VNUCkKKyAgICB1bnNpZ25lZCBpbnQgb3V0X3lfc2VjdXJlX2lkOworICAgIHVuc2lnbmVkIGludCBvdXRfY19zZWN1cmVfaWQ7CisjZWxpZiBkZWZpbmVkKENPTkZJR19TNVBfVk1FTSkKKyAgICB1bnNpZ25lZCBpbnQgb3V0X3lfY29va2llOworICAgIHVuc2lnbmVkIGludCBvdXRfY19jb29raWU7CisjZW5kaWYKK307CisKK3N0cnVjdCBtZmNfZGVjX2luaXRfYXJnIHsKKyAgICBTU0JTSVBfTUZDX0NPREVDX1RZUEUgaW5fY29kZWNfdHlwZTsgLyogW0lOXSBjb2RlYyB0eXBlICovCisgICAgaW50IGluX3N0cm1fYnVmOyAgLyogW0lOXSBhZGRyZXNzIG9mIHN0cmVhbSBidWZmZXIgKi8KKyAgICBpbnQgaW5fc3RybV9zaXplOyAvKiBbSU5dIGZpbGxlZCBzaXplIGluIHN0cmVhbSBidWZmZXIgKi8KKyAgICBpbnQgaW5fcGFja2VkX1BCOyAvKiBbSU5dICBJcyBwYWNrZWQgUEIgZnJhbWUgb3Igbm90LCAxOiBwYWNrZWRQQiAgMDogdW5wYWNrZWQgICAgKi8KKworICAgIHVuc2lnbmVkIGludCBpbl9jcmM7ICAgICAgICAgLyogW0lOXSAqLworICAgIHVuc2lnbmVkIGludCBpbl9waXhlbGNhY2hlOwkgLyogW0lOXSAqLworICAgIHVuc2lnbmVkIGludCBpbl9zbGljZTsgICAgICAgLyogW0lOXSAqLworICAgIHVuc2lnbmVkIGludCBpbl9udW1leHRyYWRwYjsgLyogW0lOXSAqLworCisgICAgdW5zaWduZWQgaW50IGluX21hcHBlZF9hZGRyOworCisgICAgaW50IG91dF9mcm1fd2lkdGg7ICAvKiBbT1VUXSB3aWR0aCAgb2YgWVVWNDIwIGZyYW1lICovCisgICAgaW50IG91dF9mcm1faGVpZ2h0OyAvKiBbT1VUXSBoZWlnaHQgb2YgWVVWNDIwIGZyYW1lICovCisgICAgaW50IG91dF9idWZfd2lkdGg7ICAvKiBbT1VUXSB3aWR0aCAgb2YgWVVWNDIwIGZyYW1lICovCisgICAgaW50IG91dF9idWZfaGVpZ2h0OyAvKiBbT1VUXSBoZWlnaHQgb2YgWVVWNDIwIGZyYW1lICovCisKKyAgICBpbnQgb3V0X2RwYl9jbnQ7ICAgIC8qIFtPVVRdIHRoZSBudW1iZXIgb2YgYnVmZmVycyB3aGljaCBpcyBuZXNzYXJ5IGR1cmluZyBkZWNvZGluZy4gKi8KKworICAgIGludCBvdXRfY3JvcF9yaWdodF9vZmZzZXQ7IC8qIFtPVVRdIGNyb3AgaW5mb3JtYXRpb24gZm9yIGgyNjQgKi8KKyAgICBpbnQgb3V0X2Nyb3BfbGVmdF9vZmZzZXQ7CisgICAgaW50IG91dF9jcm9wX2JvdHRvbV9vZmZzZXQ7CisgICAgaW50IG91dF9jcm9wX3RvcF9vZmZzZXQ7Cit9OworCitzdHJ1Y3QgbWZjX2RlY19leGVfYXJnIHsKKyAgICBTU0JTSVBfTUZDX0NPREVDX1RZUEUgaW5fY29kZWNfdHlwZTsgLyogW0lOXSAgY29kZWMgdHlwZSAqLworICAgIGludCBpbl9zdHJtX2J1ZjsgLyogW0lOXSAgdGhlIHBoeXNpY2FsIGFkZHJlc3Mgb2YgU1RSTV9CVUYgKi8KKyAgICAvKiBbSU5dICBTaXplIG9mIHZpZGVvIHN0cmVhbSBmaWxsZWQgaW4gU1RSTV9CVUYgKi8KKyAgICBpbnQgaW5fc3RybV9zaXplOworICAgIC8qIFtJTl0gdGhlIGFkZHJlc3Mgb2YgZHBiIEZSQU1FX0JVRiAqLworICAgIHN0cnVjdCBtZmNfZnJhbWVfYnVmX2FyZyBpbl9mcm1fYnVmOworICAgIC8qIFtJTl0gc2l6ZSBvZiBkcGIgRlJBTUVfQlVGICovCisgICAgc3RydWN0IG1mY19mcmFtZV9idWZfYXJnIGluX2ZybV9zaXplOworICAgIC8qIFtJTl0gVW5pcXVlIGZyYW1lIElEIGVnLiBhcHBsaWNhdGlvbiBzcGVjaWZpYyB0aW1lc3RhbXAgKi8KKyAgICB1bnNpZ25lZCBpbnQgaW5fZnJhbWV0YWc7CisgICAgLyogW0lOXSBpbW1kaWF0ZSBEaXNwbGF5IGZvciBzZWVrLHRodW1ibmFpbCBhbmQgb25lIGZyYW1lICovCisgICAgaW50IGluX2ltbWVkaWF0ZWx5X2Rpc3A7CisgICAgLyogW09VVF0gIHRoZSBwaHlzaWNhbCBhZGRyZXNzIG9mIGRpc3BsYXkgYnVmICovCisgICAgaW50IG91dF9kaXNwbGF5X1lfYWRkcjsKKyAgICAvKiBbT1VUXSAgdGhlIHBoeXNpY2FsIGFkZHJlc3Mgb2YgZGlzcGxheSBidWYgKi8KKyAgICBpbnQgb3V0X2Rpc3BsYXlfQ19hZGRyOworICAgIGludCBvdXRfZGlzcGxheV9zdGF0dXM7CisgICAgLyogW09VVF0gdW5pcXVlIGZyYW1lIElEIG9mIGFuIG91dHB1dCBmcmFtZSBvciB0b3AgZmllbGQgKi8KKyAgICB1bnNpZ25lZCBpbnQgb3V0X2ZyYW1ldGFnX3RvcDsKKyAgICAvKiBbT1VUXSB1bmlxdWUgZnJhbWUgSUQgb2YgYm90dG9tIGZpZWxkICovCisgICAgdW5zaWduZWQgaW50IG91dF9mcmFtZXRhZ19ib3R0b207CisgICAgaW50IG91dF9waWNfdGltZV90b3A7CisgICAgaW50IG91dF9waWNfdGltZV9ib3R0b207CisgICAgaW50IG91dF9jb25zdW1lZF9ieXRlOworCisgICAgaW50IG91dF9jcm9wX3JpZ2h0X29mZnNldDsKKyAgICBpbnQgb3V0X2Nyb3BfbGVmdF9vZmZzZXQ7CisgICAgaW50IG91dF9jcm9wX2JvdHRvbV9vZmZzZXQ7CisgICAgaW50IG91dF9jcm9wX3RvcF9vZmZzZXQ7CisKKyAgICAvKiBpbiBuZXcgZHJpdmVyLCBlYWNoIGJ1ZmZlciBvZmZzZXQgbXVzdCBiZSByZXR1cm4gdG8gdGhlIHVzZXIgKi8KKyAgICBpbnQgb3V0X3lfb2Zmc2V0OworICAgIGludCBvdXRfY19vZmZzZXQ7CisKKyNpZiBkZWZpbmVkKENPTkZJR19WSURFT19NRkNfVkNNX1VNUCkKKyAgICB1bnNpZ25lZCBpbnQgb3V0X3lfc2VjdXJlX2lkOworICAgIHVuc2lnbmVkIGludCBvdXRfY19zZWN1cmVfaWQ7CisjZWxpZiBkZWZpbmVkKENPTkZJR19TNVBfVk1FTSkKKyAgICB1bnNpZ25lZCBpbnQgb3V0X3lfY29va2llOworICAgIHVuc2lnbmVkIGludCBvdXRfY19jb29raWU7CisjZW5kaWYKKyAgICBpbnQgb3V0X2ltZ193aWR0aDsgIC8qIFtPVVRdIHdpZHRoICBvZiBZVVY0MjAgZnJhbWUgKi8KKyAgICBpbnQgb3V0X2ltZ19oZWlnaHQ7IC8qIFtPVVRdIGhlaWdodCBvZiBZVVY0MjAgZnJhbWUJKi8KKyAgICBpbnQgb3V0X2J1Zl93aWR0aDsgIC8qIFtPVVRdIHdpZHRoICBvZiBZVVY0MjAgZnJhbWUJKi8KKyAgICBpbnQgb3V0X2J1Zl9oZWlnaHQ7IC8qIFtPVVRdIGhlaWdodCBvZiBZVVY0MjAgZnJhbWUJKi8KKworICAgIGludCBvdXRfZGlzcF9waWNfZnJhbWVfdHlwZTsgLyogW09VVF0gZGlzcGxheSBwaWN0dXJlIGZyYW1lIHR5cGUgaW5mb3JtYXRpb24gKi8KK307CisKKyNpZmRlZiBTM0RfU1VQUE9SVAorc3RydWN0IG1mY19iYXNpY19jb25maWcgeworICAgIGludCB2YWx1ZXNbNF07Cit9OworCitzdHJ1Y3QgbWZjX2ZyYW1lX3BhY2tpbmcgeworICAgIGludCAgICAgICAgICAgYXZhaWxhYmxlOworICAgIHVuc2lnbmVkIGludCAgYXJyYW5nZW1lbnRfaWQ7CisgICAgaW50ICAgICAgICAgICBhcnJhbmdlbWVudF9jYW5jZWxfZmxhZzsKKyAgICB1bnNpZ25lZCBjaGFyIGFycmFuZ2VtZW50X3R5cGU7CisgICAgaW50ICAgICAgICAgICBxdWluY3VueF9zYW1wbGluZ19mbGFnOworICAgIHVuc2lnbmVkIGNoYXIgY29udGVudF9pbnRlcnByZXRhdGlvbl90eXBlOworICAgIGludCAgICAgICAgICAgc3BhdGlhbF9mbGlwcGluZ19mbGFnOworICAgIGludCAgICAgICAgICAgZnJhbWUwX2ZsaXBwZWRfZmxhZzsKKyAgICBpbnQgICAgICAgICAgIGZpZWxkX3ZpZXdzX2ZsYWc7CisgICAgaW50ICAgICAgICAgICBjdXJyZW50X2ZyYW1lX2lzX2ZyYW1lMF9mbGFnOworICAgIHVuc2lnbmVkIGNoYXIgZnJhbWUwX2dyaWRfcG9zX3g7CisgICAgdW5zaWduZWQgY2hhciBmcmFtZTBfZ3JpZF9wb3NfeTsKKyAgICB1bnNpZ25lZCBjaGFyIGZyYW1lMV9ncmlkX3Bvc194OworICAgIHVuc2lnbmVkIGNoYXIgZnJhbWUxX2dyaWRfcG9zX3k7Cit9OworCit1bmlvbiBfbWZjX2NvbmZpZ19hcmcgeworICAgIHN0cnVjdCBtZmNfYmFzaWNfY29uZmlnIGJhc2ljOworICAgIHN0cnVjdCBtZmNfZnJhbWVfcGFja2luZyBmcmFtZV9wYWNraW5nOworfTsKKworc3RydWN0IG1mY19jb25maWdfYXJnIHsKKyAgICBpbnQgdHlwZTsKKyAgICB1bmlvbiBfbWZjX2NvbmZpZ19hcmcgYXJnczsKK307CisjZWxzZQorc3RydWN0IG1mY19nZXRfY29uZmlnX2FyZyB7CisgICAgLyogW0lOXSBDb25maWd1cmFibGUgcGFyYW1ldGVyIHR5cGUgKi8KKyAgICBpbnQgaW5fY29uZmlnX3BhcmFtOworCisgICAgLyogW0lOXSBWYWx1ZXMgdG8gZ2V0IGZvciB0aGUgY29uZmlndXJhYmxlIHBhcmFtZXRlci4gKi8KKyAgICAvKiBNYXhpbXVtIGZvdXIgaW50ZWdlciB2YWx1ZXMgY2FuIGJlIG9idGFpbmVkOyAqLworICAgIGludCBvdXRfY29uZmlnX3ZhbHVlWzRdOworfTsKKworc3RydWN0IG1mY19zZXRfY29uZmlnX2FyZyB7CisgICAgLyogW0lOXSBDb25maWd1cmFibGUgcGFyYW1ldGVyIHR5cGUgKi8KKyAgICBpbnQgaW5fY29uZmlnX3BhcmFtOworCisgICAgLyogW0lOXSAgVmFsdWVzIHRvIGJlIHNldCBmb3IgdGhlIGNvbmZpZ3VyYWJsZSBwYXJhbWV0ZXIuICovCisgICAgLyogTWF4aW11bSBmb3VyIGludGVnZXIgdmFsdWVzIGNhbiBiZSBzZXQuICovCisgICAgaW50IGluX2NvbmZpZ192YWx1ZVs0XTsKK307CisjZW5kaWYKKworc3RydWN0IG1mY19nZXRfcmVhbF9hZGRyX2FyZyB7CisgICAgdW5zaWduZWQgaW50IGtleTsKKyAgICB1bnNpZ25lZCBpbnQgYWRkcjsKK307CisKK3N0cnVjdCBtZmNfYnVmX2FsbG9jX2FyZyB7CisgICAgZW51bSBpbnN0X3R5cGUgdHlwZTsKKyAgICBpbnQgc2l6ZTsKKyAgICAvKgorICAgIHVuc2lnbmVkIGludCBtYXBwZWQ7CisgICAgKi8KKyAgICB1bnNpZ25lZCBpbnQgYWxpZ247CisKKyAgICB1bnNpZ25lZCBpbnQgYWRkcjsKKyAgICAvKgorICAgIHVuc2lnbmVkIGludCBwaHlzOworICAgICovCisjaWYgZGVmaW5lZChDT05GSUdfVklERU9fTUZDX1ZDTV9VTVApCisgICAgLyogRklNWEU6IGludmFsaWQgc2VjdXJlIGlkID09IC0xICovCisgICAgdW5zaWduZWQgaW50IHNlY3VyZV9pZDsKKyNlbGlmIGRlZmluZWQoQ09ORklHX1M1UF9WTUVNKQorICAgIHVuc2lnbmVkIGludCBjb29raWU7CisjZWxzZQorICAgIHVuc2lnbmVkIGludCBvZmZzZXQ7CisjZW5kaWYKK307CisKK3N0cnVjdCBtZmNfYnVmX2ZyZWVfYXJnIHsKKyAgICB1bnNpZ25lZCBpbnQgYWRkcjsKK307CisKKworLyogUk1WTUUgKi8KK3N0cnVjdCBtZmNfbWVtX2FsbG9jX2FyZyB7CisgICAgZW51bSBpbnN0X3R5cGUgdHlwZTsKKyAgICBpbnQgYnVmZl9zaXplOworICAgIFNTQklQX01GQ19CVUZGRVJfVFlQRSBidWZfY2FjaGVfdHlwZTsKKyAgICB1bnNpZ25lZCBpbnQgbWFwcGVkX2FkZHI7CisjaWYgZGVmaW5lZChDT05GSUdfVklERU9fTUZDX1ZDTV9VTVApCisgICAgdW5zaWduZWQgaW50IHNlY3VyZV9pZDsKKyNlbGlmIGRlZmluZWQoQ09ORklHX1M1UF9WTUVNKQorICAgIHVuc2lnbmVkIGludCBjb29raWU7CisjZWxzZQorICAgIHVuc2lnbmVkIGludCBvZmZzZXQ7CisjZW5kaWYKK307CisKK3N0cnVjdCBtZmNfbWVtX2ZyZWVfYXJnIHsKKyAgICB1bnNpZ25lZCBpbnQga2V5OworfTsKKy8qIFJNVk1FICovCisKK3VuaW9uIG1mY19hcmdzIHsKKyAgICAvKgorICAgIHN0cnVjdCBtZmNfZW5jX2luaXRfYXJnIGVuY19pbml0OworCisgICAgc3RydWN0IG1mY19lbmNfaW5pdF9tcGVnNF9hcmcgZW5jX2luaXRfbXBlZzQ7CisgICAgc3RydWN0IG1mY19lbmNfaW5pdF9tcGVnNF9hcmcgZW5jX2luaXRfaDI2MzsKKyAgICBzdHJ1Y3QgbWZjX2VuY19pbml0X2gyNjRfYXJnIGVuY19pbml0X2gyNjQ7CisgICAgKi8KKyAgICBzdHJ1Y3QgbWZjX2VuY19pbml0X2FyZyBlbmNfaW5pdDsKKyAgICBzdHJ1Y3QgbWZjX2VuY19leGVfYXJnIGVuY19leGU7CisKKyAgICBzdHJ1Y3QgbWZjX2RlY19pbml0X2FyZyBkZWNfaW5pdDsKKyAgICBzdHJ1Y3QgbWZjX2RlY19leGVfYXJnIGRlY19leGU7CisKKyNpZmRlZiBTM0RfU1VQUE9SVAorICAgIHN0cnVjdCBtZmNfY29uZmlnX2FyZyBjb25maWc7CisjZWxzZQorICAgIHN0cnVjdCBtZmNfZ2V0X2NvbmZpZ19hcmcgZ2V0X2NvbmZpZzsKKyAgICBzdHJ1Y3QgbWZjX3NldF9jb25maWdfYXJnIHNldF9jb25maWc7CisjZW5kaWYKKworICAgIHN0cnVjdCBtZmNfYnVmX2FsbG9jX2FyZyBidWZfYWxsb2M7CisgICAgc3RydWN0IG1mY19idWZfZnJlZV9hcmcgYnVmX2ZyZWU7CisgICAgc3RydWN0IG1mY19nZXRfcmVhbF9hZGRyX2FyZyByZWFsX2FkZHI7CisKKyAgICAvKiBSTVZNRSAqLworICAgIHN0cnVjdCBtZmNfbWVtX2FsbG9jX2FyZyBtZW1fYWxsb2M7CisgICAgc3RydWN0IG1mY19tZW1fZnJlZV9hcmcgbWVtX2ZyZWU7CisgICAgLyogUk1WTUUgKi8KK307CisKK3N0cnVjdCBtZmNfY29tbW9uX2FyZ3MgeworICAgIGVudW0gbWZjX3JldF9jb2RlIHJldF9jb2RlOwkvKiBbT1VUXSBlcnJvciBjb2RlICovCisgICAgdW5pb24gbWZjX2FyZ3MgYXJnczsKK307CisKK3N0cnVjdCBtZmNfZW5jX3Z1aV9pbmZvIHsKKyAgICBpbnQgYXNwZWN0X3JhdGlvX2lkYzsKK307CisKK3N0cnVjdCBtZmNfZGVjX2ZpbXYxX2luZm8geworICAgIGludCB3aWR0aDsKKyAgICBpbnQgaGVpZ2h0OworfTsKKworc3RydWN0IG1mY19lbmNfaGllcl9wX3FwIHsKKyAgICBpbnQgdDBfZnJhbWVfcXA7CisgICAgaW50IHQyX2ZyYW1lX3FwOworICAgIGludCB0M19mcmFtZV9xcDsKK307CisKKyNpZmRlZiBTM0RfU1VQUE9SVAorc3RydWN0IG1mY19lbmNfc2V0X2NvbmZpZyB7CisgICAgaW50IGVuYWJsZTsKKyAgICBpbnQgbnVtYmVyOworfTsKKyNlbmRpZgorCit0eXBlZGVmIHN0cnVjdAoreworICAgIGludCBtYWdpYzsKKyAgICBpbnQgaE1GQzsKKyAgICBpbnQgaFZNRU07CisgICAgaW50IHdpZHRoOworICAgIGludCBoZWlnaHQ7CisgICAgaW50IHNpemVTdHJtQnVmOworICAgIHN0cnVjdCBtZmNfZnJhbWVfYnVmX2FyZyBzaXplRnJtQnVmOworICAgIGludCBkaXNwbGF5U3RhdHVzOworICAgIGludCBpbnRlcl9idWZmX3N0YXR1czsKKyAgICB1bnNpZ25lZCBpbnQgdmlyRnJlZVN0cm1BZGRyOworICAgIHVuc2lnbmVkIGludCBwaHlTdHJtQnVmOworICAgIHVuc2lnbmVkIGludCB2aXJTdHJtQnVmOworICAgIHVuc2lnbmVkIGludCB2aXJNdlJlZllDOworICAgIHN0cnVjdCBtZmNfZnJhbWVfYnVmX2FyZyBwaHlGcm1CdWY7CisgICAgc3RydWN0IG1mY19mcmFtZV9idWZfYXJnIHZpckZybUJ1ZjsKKyAgICB1bnNpZ25lZCBpbnQgbWFwcGVkX2FkZHI7CisgICAgdW5zaWduZWQgaW50IG1hcHBlZF9zaXplOworICAgIHN0cnVjdCBtZmNfY29tbW9uX2FyZ3MgTWZjQXJnOworICAgIFNTQlNJUF9NRkNfQ09ERUNfVFlQRSBjb2RlY1R5cGU7CisgICAgU1NCU0lQX01GQ19ERUNfT1VUUFVUX0lORk8gZGVjT3V0SW5mbzsKKyAgICB1bnNpZ25lZCBpbnQgaW5mcmFtZXRhZzsKKyAgICB1bnNpZ25lZCBpbnQgb3V0ZnJhbWV0YWd0b3A7CisgICAgdW5zaWduZWQgaW50IG91dGZyYW1ldGFnYm90dG9tOworICAgIHVuc2lnbmVkIGludCBpbW1lZGlhdGVseWRpc3A7CisgICAgdW5zaWduZWQgaW50IGVuY29kZWRIZWFkZXJTaXplOworICAgIGludCBlbmNvZGVkRGF0YVNpemU7CisgICAgdW5zaWduZWQgaW50IGVuY29kZWRmcmFtZVR5cGU7CisgICAgc3RydWN0IG1mY19mcmFtZV9idWZfYXJnIGVuY29kZWRwaHlGcm1CdWY7CisKKyAgICB1bnNpZ25lZCBpbnQgZGVjX2NyYzsKKyAgICB1bnNpZ25lZCBpbnQgZGVjX3BpeGVsY2FjaGU7CisgICAgdW5zaWduZWQgaW50IGRlY19zbGljZTsKKyAgICB1bnNpZ25lZCBpbnQgZGVjX251bWV4dHJhZHBiOworCisgICAgaW50IGlucHV0X2Nvb2tpZTsKKyAgICBpbnQgaW5wdXRfc2VjdXJlX2lkOworICAgIGludCBpbnB1dF9zaXplOworCisgICAgLyogdG8gc3VwcG9ydCBub24tYmxvY2tpbmcgbW9kZSAqLworICAgIHVuc2lnbmVkIGludCBlbmNvZGVfY250OworfSBfTUZDTElCOworCisjZGVmaW5lIEVOQ19QUk9GSUxFX0xFVkVMKHByb2ZpbGUsIGxldmVsKSAgICAgICgocHJvZmlsZSkgfCAoKGxldmVsKSA8PCA4KSkKKyNkZWZpbmUgRU5DX1JDX1FCT1VORChtaW5fcXAsIG1heF9xcCkgICAgICAgICAgKChtaW5fcXApIHwgKChtYXhfcXApIDw8IDgpKQorCisjZW5kaWYgLyogX19NRkNfSU5URVJGQUNFX0ggKi8KZGlmZiAtLWdpdCBhL2V4eW5vczQvbXVsdGltZWRpYS9jb2RlY3Mvc2VjX2NvZGVjcy92aWRlby9leHlub3M0L21mY192NGwyL0FuZHJvaWQubWsgYi9leHlub3M0L211bHRpbWVkaWEvY29kZWNzL3NlY19jb2RlY3MvdmlkZW8vZXh5bm9zNC9tZmNfdjRsMi9BbmRyb2lkLm1rCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmYxMzUxNjMKLS0tIC9kZXYvbnVsbAorKysgYi9leHlub3M0L211bHRpbWVkaWEvY29kZWNzL3NlY19jb2RlY3MvdmlkZW8vZXh5bm9zNC9tZmNfdjRsMi9BbmRyb2lkLm1rCkBAIC0wLDAgKzEsMzQgQEAKK0xPQ0FMX1BBVEggOj0gJChjYWxsIG15LWRpcikKKworaW5jbHVkZSAkKENMRUFSX1ZBUlMpCisKK0xPQ0FMX0NPUFlfSEVBREVSU19UTyA6PSBsaWJzZWNtbQorTE9DQUxfQ09QWV9IRUFERVJTIDo9IFwKKwlpbmNsdWRlL21mY19lcnJuby5oIFwKKwlpbmNsdWRlL21mY19pbnRlcmZhY2UuaCBcCisJaW5jbHVkZS9Tc2JTaXBNZmNBcGkuaAorCitMT0NBTF9NT0RVTEVfVEFHUyA6PSBvcHRpb25hbAorCitMT0NBTF9TUkNfRklMRVMgOj0gXAorCWRlYy9zcmMvU3NiU2lwTWZjRGVjQVBJLmMgXAorCWVuYy9zcmMvU3NiU2lwTWZjRW5jQVBJLmMKKworTE9DQUxfQ19JTkNMVURFUyA6PSBcCisJJChMT0NBTF9QQVRIKS9pbmNsdWRlIFwKKwkkKEJPQVJEX0hBTF9QQVRIKS9pbmNsdWRlCisKK0xPQ0FMX01PRFVMRSA6PSBsaWJzZWNtZmNhcGkKKworTE9DQUxfUFJFTElOS19NT0RVTEUgOj0gZmFsc2UKKworaWZlcSAoJChCT0FSRF9VU0VTX01GQ19GUFMpLHRydWUpCitMT0NBTF9DRkxBR1MgOj0gLURDT05GSUdfTUZDX0ZQUworZW5kaWYKKworTE9DQUxfQVJNX01PREUgOj0gYXJtCisKK0xPQ0FMX1NUQVRJQ19MSUJSQVJJRVMgOj0KK0xPQ0FMX1NIQVJFRF9MSUJSQVJJRVMgOj0gbGlibG9nCisKK2luY2x1ZGUgJChCVUlMRF9TVEFUSUNfTElCUkFSWSkKZGlmZiAtLWdpdCBhL2V4eW5vczQvbXVsdGltZWRpYS9jb2RlY3Mvc2VjX2NvZGVjcy92aWRlby9leHlub3M0L21mY192NGwyL2RlYy9zcmMvU3NiU2lwTWZjRGVjQVBJLmMgYi9leHlub3M0L211bHRpbWVkaWEvY29kZWNzL3NlY19jb2RlY3MvdmlkZW8vZXh5bm9zNC9tZmNfdjRsMi9kZWMvc3JjL1NzYlNpcE1mY0RlY0FQSS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjUxMGEzNTEKLS0tIC9kZXYvbnVsbAorKysgYi9leHlub3M0L211bHRpbWVkaWEvY29kZWNzL3NlY19jb2RlY3MvdmlkZW8vZXh5bm9zNC9tZmNfdjRsMi9kZWMvc3JjL1NzYlNpcE1mY0RlY0FQSS5jCkBAIC0wLDAgKzEsMTM1MiBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxMCBTYW1zdW5nIEVsZWN0cm9uaWNzIENvLiwgTHRkLgorICogICAgICAgICAgICAgIGh0dHA6Ly93d3cuc2Ftc3VuZy5jb20vCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIGFzCisgKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqCisgKiBBbHRlcm5hdGl2ZWx5LCBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8c3RkbGliLmg+CisjaW5jbHVkZSA8dW5pc3RkLmg+CisjaW5jbHVkZSA8c3RyaW5nLmg+CisjaW5jbHVkZSA8ZmNudGwuaD4KKworI2luY2x1ZGUgPHN5cy90eXBlcy5oPgorI2luY2x1ZGUgPHN5cy9zdGF0Lmg+CisjaW5jbHVkZSA8c3lzL2lvY3RsLmg+CisjaW5jbHVkZSA8c3lzL21tYW4uaD4KKworI2luY2x1ZGUgPHN5cy9wb2xsLmg+CisjaW5jbHVkZSAidmlkZW9kZXYyLmgiCisKKyNpbmNsdWRlICJtZmNfaW50ZXJmYWNlLmgiCisjaW5jbHVkZSAiU3NiU2lwTWZjQXBpLmgiCisKKy8qICNkZWZpbmUgTE9HX05ERUJVRyAwICovCisjZGVmaW5lIExPR19UQUcgIk1GQ19ERUNfQVBQIgorI2luY2x1ZGUgPHV0aWxzL0xvZy5oPgorCisjaWZkZWYgQ09ORklHX01GQ19GUFMKKyNpbmNsdWRlIDxzeXMvdGltZS5oPgorI2VuZGlmCisKKy8qI2RlZmluZSBDUkNfRU5BQkxFCisjZGVmaW5lIFNMSUNFX01PREVfRU5BQkxFICovCisjZGVmaW5lIFBPTExfREVDX1dBSVRfVElNRU9VVCAyNQorCisjZGVmaW5lIFVTUl9EQVRBX1NUQVJUX0NPREUgKDB4MDAwMDAxQjIpCisjZGVmaW5lIFZPUF9TVEFSVF9DT0RFICAgICAgKDB4MDAwMDAxQjYpCisjZGVmaW5lIE1QNF9TVEFSVF9DT0RFICAgICAgKDB4MDAwMDAxKQorCisjaWZkZWYgQ09ORklHX01GQ19GUFMKK3Vuc2lnbmVkIGludCBmcmFtZWNvdW50LCBvdmVyMzBtczsKK3N0cnVjdCB0aW1ldmFsIG1UUzEsIG1UUzIsIG1EZWMxLCBtRGVjMjsKKyNlbmRpZgorCisjZGVmaW5lIERFRkFVTFRfTlVNQkVSX09GX0VYVFJBX0RQQiA1CisKK3N0YXRpYyBjaGFyICptZmNfZGV2X25hbWUgPSBTQU1TVU5HX01GQ19ERVZfTkFNRTsKK3N0YXRpYyBpbnQgbWZjX2Rldl9ub2RlID0gNjsKKworc3RhdGljIHZvaWQgZ2V0QUJ5dGUoY2hhciAqYnVmZiwgaW50ICpjb2RlKQoreworICAgIGludCBieXRlOworCisgICAgKmNvZGUgPSAoKmNvZGUgPDwgOCk7CisgICAgYnl0ZSA9IChpbnQpKmJ1ZmY7CisgICAgYnl0ZSAmPSAweEZGOworICAgICpjb2RlIHw9IGJ5dGU7Cit9CisKK3N0YXRpYyBpbnQgaXNQQlBhY2tlZChfTUZDTElCICpwQ3R4LCBpbnQgRnJhbWVsZW5nKQoreworICAgIGNoYXIgKnN0cm1CdWZmZXIgPSBOVUxMOworICAgIGludCBzdGFydENvZGUgPSAweEZGRkZGRkZGOworICAgIGludCBsZW5nX2lkeCA9IDE7CisKKyAgICBzdHJtQnVmZmVyID0gKGNoYXIqKXBDdHgtPnZpclN0cm1CdWY7CisKKyAgICB3aGlsZSAoMSkgeworICAgICAgICB3aGlsZSAoc3RhcnRDb2RlICE9IFVTUl9EQVRBX1NUQVJUX0NPREUpIHsKKyAgICAgICAgICAgIGlmICgoc3RhcnRDb2RlID09IFZPUF9TVEFSVF9DT0RFKSB8fCAobGVuZ19pZHggPT0gRnJhbWVsZW5nKSkgeworICAgICAgICAgICAgICAgIExPR0koIlslc10gVk9QIFNUQVJUIEZvdW5kICEhLi4uLi5yZXR1cm4iLF9fZnVuY19fKTsKKyAgICAgICAgICAgICAgICBMT0dXKCJbJXNdIE5vbiBQYWNrZWQgUEIiLF9fZnVuY19fKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gMDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGdldEFCeXRlKHN0cm1CdWZmZXIsICZzdGFydENvZGUpOworICAgICAgICAgICAgTE9HVigiPj4gU3RhcnRDb2RlID0gMHglMDh4IDw8XG4iLCBzdGFydENvZGUpOworICAgICAgICAgICAgc3RybUJ1ZmZlcisrOworICAgICAgICAgICAgbGVuZ19pZHgrKzsKKyAgICAgICAgfQorICAgICAgICBMT0dJKCJbJXNdIFVzZXIgRGF0YSBGb3VuZCAhISIsX19mdW5jX18pOworCisgICAgICAgIGRvIHsKKyAgICAgICAgICAgIGlmICgqc3RybUJ1ZmZlciA9PSAncCcpIHsKKyAgICAgICAgICAgICAgICBMT0dXKCJbJXNdIFBhY2tlZCBQQiIsX19mdW5jX18pOworICAgICAgICAgICAgICAgIHJldHVybiAxOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZ2V0QUJ5dGUoc3RybUJ1ZmZlciwgJnN0YXJ0Q29kZSk7CisgICAgICAgICAgICBzdHJtQnVmZmVyKys7IGxlbmdfaWR4Kys7CisgICAgICAgIH0gd2hpbGUgKChsZW5nX2lkeCA8PSBGcmFtZWxlbmcpICYmICgoc3RhcnRDb2RlID4+IDgpICE9IE1QNF9TVEFSVF9DT0RFKSk7CisKKyAgICAgICAgaWYgKGxlbmdfaWR4ID4gRnJhbWVsZW5nKQorICAgICAgICAgICAgYnJlYWs7CisgICAgfQorCisgICAgTE9HVygiWyVzXSBOb24gUGFja2VkIFBCIixfX2Z1bmNfXyk7CisKKyAgICByZXR1cm4gMDsKK30KKworc3RhdGljIHZvaWQgZ2V0TUZDTmFtZShjaGFyICpkZXZpY2VuYW1lLCBpbnQgc2l6ZSkKK3sKKyAgICBzbnByaW50ZihkZXZpY2VuYW1lLCBzaXplLCAiJXMlZCIsIFNBTVNVTkdfTUZDX0RFVl9OQU1FLCBtZmNfZGV2X25vZGUpOworfQorCit2b2lkIFNzYlNpcE1mY0RlY1NldE1GQ05vZGUoaW50IGRldmljZW5vZGUpCit7CisgICAgbWZjX2Rldl9ub2RlID0gZGV2aWNlbm9kZTsKK30KKwordm9pZCBTc2JTaXBNZmNEZWNTZXRNRkNOYW1lKGNoYXIgKmRldmljZW5hbWUpCit7CisgICAgbWZjX2Rldl9uYW1lID0gZGV2aWNlbmFtZTsKK30KKwordm9pZCAqU3NiU2lwTWZjRGVjT3Blbih2b2lkKQoreworICAgIGludCBoTUZDT3BlbjsKKyAgICBfTUZDTElCICpwQ1RYOworCisgICAgY2hhciBtZmNfZGV2X25hbWVbNjRdOworCisgICAgaW50IHJldDsKKyAgICB1bnNpZ25lZCBpbnQgaSwgajsKKyAgICBzdHJ1Y3QgdjRsMl9jYXBhYmlsaXR5IGNhcDsKKyAgICBzdHJ1Y3QgdjRsMl9mb3JtYXQgZm10OworCisgICAgc3RydWN0IHY0bDJfcmVxdWVzdGJ1ZmZlcnMgcmVxYnVmOworICAgIHN0cnVjdCB2NGwyX2J1ZmZlciBidWY7CisgICAgc3RydWN0IHY0bDJfcGxhbmUgcGxhbmVzW01GQ19ERUNfTlVNX1BMQU5FU107CisKKyAgICBMT0dJKCJbJXNdIE1GQyBMaWJyYXJ5IFZlciAlZC4lMDJkIixfX2Z1bmNfXywgTUZDX0xJQl9WRVJfTUFKT1IsIE1GQ19MSUJfVkVSX01JTk9SKTsKKyNpZmRlZiBDT05GSUdfTUZDX0ZQUworICAgIGZyYW1lY291bnQgPSAwOworICAgIG92ZXIzMG1zID0gMDsKKyAgICBnZXR0aW1lb2ZkYXkoJm1UUzEsIE5VTEwpOworI2VuZGlmCisgICAgcENUWCA9IChfTUZDTElCICopbWFsbG9jKHNpemVvZihfTUZDTElCKSk7CisgICAgaWYgKHBDVFggPT0gTlVMTCkgeworICAgICAgICBMT0dFKCJbJXNdIG1hbGxvYyBmYWlsZWQuIixfX2Z1bmNfXyk7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KKworICAgIG1lbXNldChwQ1RYLCAwLCBzaXplb2YoX01GQ0xJQikpOworCisgICAgZ2V0TUZDTmFtZShtZmNfZGV2X25hbWUsIDY0KTsKKyAgICBMT0dJKCJbJXNdIGRldiBuYW1lIGlzICVzIixfX2Z1bmNfXyxtZmNfZGV2X25hbWUpOworCisgICAgaWYgKGFjY2VzcyhtZmNfZGV2X25hbWUsIEZfT0spICE9IDApIHsKKyAgICAgICAgTE9HRSgiWyVzXSBNRkMgZGV2aWNlIG5vZGUgbm90IGV4aXN0cyIsX19mdW5jX18pOworICAgICAgICBnb3RvIGVycm9yX2Nhc2UxOworICAgIH0KKworICAgIGhNRkNPcGVuID0gb3BlbihtZmNfZGV2X25hbWUsIE9fUkRXUnxPX05PTkJMT0NLLCAwKTsKKyAgICBpZiAoaE1GQ09wZW4gPCAwKSB7CisgICAgICAgIExPR0UoIlslc10gRmFpbGVkIHRvIG9wZW4gTUZDIGRldmljZSIsX19mdW5jX18pOworICAgICAgICBnb3RvIGVycm9yX2Nhc2UxOworICAgIH0KKworICAgIHBDVFgtPmhNRkMgPSBoTUZDT3BlbjsKKworICAgIG1lbXNldCgmY2FwLCAwLCBzaXplb2YoY2FwKSk7CisgICAgcmV0ID0gaW9jdGwocENUWC0+aE1GQywgVklESU9DX1FVRVJZQ0FQLCAmY2FwKTsKKyAgICBpZiAocmV0ICE9IDApIHsKKyAgICAgICAgTE9HRSgiWyVzXSBWSURJT0NfUVVFUllDQVAgZmFpbGVkIixfX2Z1bmNfXyk7CisgICAgICAgIGdvdG8gZXJyb3JfY2FzZTI7CisgICAgfQorCisgICAgaWYgKCEoY2FwLmNhcGFiaWxpdGllcyAmIFY0TDJfQ0FQX1ZJREVPX0NBUFRVUkUpKSB7CisgICAgICAgIExPR0UoIlslc10gRGV2aWNlIGRvZXMgbm90IHN1cHBvcnQgY2FwdHVyZSIsX19mdW5jX18pOworICAgICAgICBnb3RvIGVycm9yX2Nhc2UyOworICAgIH0KKworICAgIGlmICghKGNhcC5jYXBhYmlsaXRpZXMgJiBWNEwyX0NBUF9WSURFT19PVVRQVVQpKSB7CisgICAgICAgIExPR0UoIlslc10gRGV2aWNlIGRvZXMgbm90IHN1cHBvcnQgb3V0cHV0IixfX2Z1bmNfXyk7CisgICAgICAgIGdvdG8gZXJyb3JfY2FzZTI7CisgICAgfQorCisgICAgaWYgKCEoY2FwLmNhcGFiaWxpdGllcyAmIFY0TDJfQ0FQX1NUUkVBTUlORykpIHsKKyAgICAgICAgTE9HRSgiWyVzXSBEZXZpY2UgZG9lcyBub3Qgc3VwcG9ydCBzdHJlYW1pbmciLF9fZnVuY19fKTsKKyAgICAgICAgZ290byBlcnJvcl9jYXNlMjsKKyAgICB9CisKKyAgICBwQ1RYLT5pbnRlcl9idWZmX3N0YXR1cyA9IE1GQ19VU0VfTk9ORTsKKyAgICBtZW1zZXQoJmZtdCwgMCwgc2l6ZW9mKGZtdCkpOworICAgIGZtdC5mbXQucGl4X21wLnBpeGVsZm9ybWF0ID0gVjRMMl9QSVhfRk1UX0gyNjQ7IC8qIERlZmF1bHQgaXMgc2V0IHRvIEgyNjQgKi8KKyAgICBmbXQudHlwZSA9IFY0TDJfQlVGX1RZUEVfVklERU9fT1VUUFVUX01QTEFORTsKKyAgICBmbXQuZm10LnBpeF9tcC5wbGFuZV9mbXRbMF0uc2l6ZWltYWdlID0gTUFYX0RFQ09ERVJfSU5QVVRfQlVGRkVSX1NJWkU7CisKKyAgICByZXQgPSBpb2N0bChwQ1RYLT5oTUZDLCBWSURJT0NfU19GTVQsICZmbXQpOworICAgIGlmIChyZXQgIT0gMCkgeworICAgICAgICBMT0dFKCJbJXNdIFNfRk1UIGZhaWxlZCIsX19mdW5jX18pOworICAgICAgICBnb3RvIGVycm9yX2Nhc2UyOworICAgIH0KKworICAgIHBDVFgtPnY0bDJfZGVjLm1mY19zcmNfYnVmc19sZW4gPSBNQVhfREVDT0RFUl9JTlBVVF9CVUZGRVJfU0laRTsKKworICAgIG1lbXNldCgmKHJlcWJ1ZiksIDAsIHNpemVvZiAocmVxYnVmKSk7CisgICAgcmVxYnVmLmNvdW50ID0gTUZDX0RFQ19OVU1fU1JDX0JVRlM7CisgICAgcmVxYnVmLnR5cGUgPSBWNEwyX0JVRl9UWVBFX1ZJREVPX09VVFBVVF9NUExBTkU7CisgICAgcmVxYnVmLm1lbW9yeSA9IFY0TDJfTUVNT1JZX01NQVA7CisKKyAgICByZXQgPSBpb2N0bChwQ1RYLT5oTUZDLCBWSURJT0NfUkVRQlVGUywgJnJlcWJ1Zik7CisgICAgaWYgKHJldCAhPSAwKSB7CisgICAgICAgIExPR0UoIlslc10gVklESU9DX1JFUUJVRlMgZmFpbGVkIixfX2Z1bmNfXyk7CisgICAgICAgIGdvdG8gZXJyb3JfY2FzZTI7CisgICAgfQorCisgICAgcENUWC0+djRsMl9kZWMubWZjX251bV9zcmNfYnVmcyAgID0gcmVxYnVmLmNvdW50OworCisgICAgZm9yIChpID0gMDsgaSA8IHBDVFgtPnY0bDJfZGVjLm1mY19udW1fc3JjX2J1ZnM7ICsraSkgeworICAgICAgICBtZW1zZXQoJihidWYpLCAwLCBzaXplb2YgKGJ1ZikpOworICAgICAgICBidWYudHlwZSA9IFY0TDJfQlVGX1RZUEVfVklERU9fT1VUUFVUX01QTEFORTsKKyAgICAgICAgYnVmLm1lbW9yeSA9IFY0TDJfTUVNT1JZX01NQVA7CisgICAgICAgIGJ1Zi5pbmRleCA9IGk7CisgICAgICAgIGJ1Zi5tLnBsYW5lcyA9IHBsYW5lczsKKyAgICAgICAgYnVmLmxlbmd0aCA9IDE7CisKKyAgICAgICAgcmV0ID0gaW9jdGwocENUWC0+aE1GQywgVklESU9DX1FVRVJZQlVGLCAmYnVmKTsKKyAgICAgICAgaWYgKHJldCAhPSAwKSB7CisgICAgICAgICAgICBMT0dFKCJbJXNdIFZJRElPQ19RVUVSWUJVRiBmYWlsZWQiLF9fZnVuY19fKTsKKyAgICAgICAgICAgIGdvdG8gZXJyb3JfY2FzZTM7CisgICAgICAgIH0KKworICAgICAgICBwQ1RYLT52NGwyX2RlYy5tZmNfc3JjX2J1ZnNbaV0gPSBtbWFwKE5VTEwsIGJ1Zi5tLnBsYW5lc1swXS5sZW5ndGgsCisgICAgICAgIFBST1RfUkVBRCB8IFBST1RfV1JJVEUsIE1BUF9TSEFSRUQsIHBDVFgtPmhNRkMsIGJ1Zi5tLnBsYW5lc1swXS5tLm1lbV9vZmZzZXQpOworICAgICAgICBpZiAocENUWC0+djRsMl9kZWMubWZjX3NyY19idWZzW2ldID09IE1BUF9GQUlMRUQpIHsKKyAgICAgICAgICAgIExPR0UoIlslc10gbW1hcCBmYWlsZWQgKCVkKSIsX19mdW5jX18saSk7CisgICAgICAgICAgICBnb3RvIGVycm9yX2Nhc2UzOworICAgICAgICB9CisgICAgfQorICAgIHBDVFgtPmludGVyX2J1ZmZfc3RhdHVzIHw9IE1GQ19VU0VfU1RSTV9CVUZGOworCisgICAgLyogc2V0IGV4dHJhIERQQiBzaXplIHRvIDUgYXMgZGVmYXVsdCBmb3Igb3B0aW1hbCBwZXJmb3JtY2UgKGhldXJpc3RpYyBtZXRob2QpICovCisgICAgcENUWC0+ZGVjX251bWV4dHJhZHBiID0gREVGQVVMVF9OVU1CRVJfT0ZfRVhUUkFfRFBCOworCisgICAgcENUWC0+djRsMl9kZWMuYkJlaW5nRmluYWxpemVkID0gMDsKKyAgICBwQ1RYLT5sYXN0ZnJhbWUgPSBTU0JTSVBfTUZDX0xBU1RfRlJBTUVfTk9UX1JFQ0VJVkVEOworCisgICAgcENUWC0+Y2FjaGVhYmxlYnVmZmVyID0gTk9fQ0FDSEU7CisKKyAgICBmb3IgKGkgPSAwOyBpPE1GQ19ERUNfTlVNX1NSQ19CVUZTOyBpKyspCisgICAgICAgIHBDVFgtPnY0bDJfZGVjLm1mY19zcmNfYnVmX2ZsYWdzW2ldID0gQlVGX0RFUVVFVUVEOworCisgICAgcENUWC0+djRsMl9kZWMuYmVpbmdVc2VkSW5kZXggPSAwOworCisgICAgcmV0dXJuICh2b2lkICopIHBDVFg7CisKK2Vycm9yX2Nhc2UzOgorICAgIGZvciAoaiA9IDA7IGogPCBpOyBqKyspCisgICAgICAgIG11bm1hcChwQ1RYLT52NGwyX2RlYy5tZmNfc3JjX2J1ZnNbal0sIHBDVFgtPnY0bDJfZGVjLm1mY19zcmNfYnVmc19sZW4pOworCitlcnJvcl9jYXNlMjoKKyAgICBjbG9zZShwQ1RYLT5oTUZDKTsKKworZXJyb3JfY2FzZTE6CisgICAgZnJlZShwQ1RYKTsKKworICAgIHJldHVybiBOVUxMOworfQorCit2b2lkICpTc2JTaXBNZmNEZWNPcGVuRXh0KHZvaWQgKnZhbHVlKQoreworICAgIF9NRkNMSUIgKnBDVFg7CisKKyAgICBwQ1RYID0gU3NiU2lwTWZjRGVjT3BlbigpOworCisgICAgaWYgKHBDVFggPT0gTlVMTCkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisKKyAgICBpZiAoTk9fQ0FDSEUgPT0gKCooU1NCSVBfTUZDX0JVRkZFUl9UWVBFICopdmFsdWUpKSB7CisgICAgICAgIHBDVFgtPmNhY2hlYWJsZWJ1ZmZlciA9IE5PX0NBQ0hFOworICAgICAgICBMT0dJKCJbJXNdIG5vbiBjYWNoZWFibGUgYnVmZmVyIixfX2Z1bmNfXyk7CisgICAgfSBlbHNlIHsKKyAgICAgICAgcENUWC0+Y2FjaGVhYmxlYnVmZmVyID0gQ0FDSEU7CisgICAgICAgIExPR0koIlslc10gY2FjaGVhYmxlIGJ1ZmZlciIsX19mdW5jX18pOworICAgIH0KKworICAgIHJldHVybiAodm9pZCAqKXBDVFg7Cit9CisKK1NTQlNJUF9NRkNfRVJST1JfQ09ERSBTc2JTaXBNZmNEZWNDbG9zZSh2b2lkICpvcGVuSGFuZGxlKQoreworICAgIGludCByZXQsIGk7CisgICAgX01GQ0xJQiAgKnBDVFg7CisKKyAgICBlbnVtIHY0bDJfYnVmX3R5cGUgdHlwZTsKKyNpZmRlZiBDT05GSUdfTUZDX0ZQUworICAgIExPR0koIj4+PiBNRkMiKTsKKyAgICBnZXR0aW1lb2ZkYXkoJm1UUzIsIE5VTEwpOworICAgIExPR0koIj4+PiB0aW1lPSVkIiwgbVRTMi50dl9zZWMtbVRTMS50dl9zZWMpOworICAgIExPR0koIj4+PiBmcmFtZWNvdW50PSVkIiwgZnJhbWVjb3VudCk7CisgICAgTE9HSSgiPj4+IDMwbXMgb3Zlcj0lZCIsIG92ZXIzMG1zKTsKKyNlbmRpZgorICAgIGlmIChvcGVuSGFuZGxlID09IE5VTEwpIHsKKyAgICAgICAgTE9HRSgiWyVzXSBvcGVuSGFuZGxlIGlzIE5VTEwiLF9fZnVuY19fKTsKKyAgICAgICAgcmV0dXJuIE1GQ19SRVRfSU5WQUxJRF9QQVJBTTsKKyAgICB9CisKKyAgICBwQ1RYICA9IChfTUZDTElCICopIG9wZW5IYW5kbGU7CisKKyAgICBpZiAocENUWC0+aW50ZXJfYnVmZl9zdGF0dXMgJiBNRkNfVVNFX0RTVF9TVFJFQU1PTikgeworICAgICAgICB0eXBlID0gVjRMMl9CVUZfVFlQRV9WSURFT19DQVBUVVJFX01QTEFORTsKKyAgICAgICAgcmV0ID0gaW9jdGwocENUWC0+aE1GQywgVklESU9DX1NUUkVBTU9GRiwgJnR5cGUpOworICAgICAgICBpZiAocmV0ICE9IDApIHsKKyAgICAgICAgICAgIExPR0UoIlslc10gVklESU9DX1NUUkVBTU9GRiBmYWlsZWQgKGRlc3RpbmF0aW9uIGJ1ZmZlcnMpIixfX2Z1bmNfXyk7CisgICAgICAgICAgICByZXR1cm4gTUZDX1JFVF9DTE9TRV9GQUlMOworICAgICAgICB9CisgICAgICAgIHBDVFgtPmludGVyX2J1ZmZfc3RhdHVzICY9IH4oTUZDX1VTRV9EU1RfU1RSRUFNT04pOworICAgIH0KKworICAgIGlmIChwQ1RYLT5pbnRlcl9idWZmX3N0YXR1cyAmIE1GQ19VU0VfU1JDX1NUUkVBTU9OKSB7CisgICAgICAgIHR5cGUgPSBWNEwyX0JVRl9UWVBFX1ZJREVPX09VVFBVVF9NUExBTkU7CisgICAgICAgIHJldCA9IGlvY3RsKHBDVFgtPmhNRkMsIFZJRElPQ19TVFJFQU1PRkYsICZ0eXBlKTsKKyAgICAgICAgaWYgKHJldCAhPSAwKSB7CisgICAgICAgICAgICBMT0dFKCJbJXNdIFZJRElPQ19TVFJFQU1PRkYgZmFpbGVkIChzb3VyY2UgYnVmZmVycykiLF9fZnVuY19fKTsKKyAgICAgICAgICAgIHJldHVybiBNRkNfUkVUX0NMT1NFX0ZBSUw7CisgICAgICAgIH0KKyAgICAgICAgcENUWC0+aW50ZXJfYnVmZl9zdGF0dXMgJj0gfihNRkNfVVNFX1NSQ19TVFJFQU1PTik7CisgICAgfQorCisgICAgaWYgKHBDVFgtPmludGVyX2J1ZmZfc3RhdHVzICYgTUZDX1VTRV9TVFJNX0JVRkYpIHsKKyAgICAgICAgZm9yIChpID0gMDsgaSA8IHBDVFgtPnY0bDJfZGVjLm1mY19udW1fc3JjX2J1ZnM7IGkrKykKKyAgICAgICAgICAgIG11bm1hcChwQ1RYLT52NGwyX2RlYy5tZmNfc3JjX2J1ZnNbaV0sIHBDVFgtPnY0bDJfZGVjLm1mY19zcmNfYnVmc19sZW4pOworICAgICAgICBwQ1RYLT5pbnRlcl9idWZmX3N0YXR1cyAmPSB+KE1GQ19VU0VfU1RSTV9CVUZGKTsKKyAgICB9CisKKyAgICBpZiAocENUWC0+aW50ZXJfYnVmZl9zdGF0dXMgJiBNRkNfVVNFX1lVVl9CVUZGKSB7CisgICAgICAgIGZvciAoaSA9IDA7IGkgPCBwQ1RYLT52NGwyX2RlYy5tZmNfbnVtX2RzdF9idWZzOyBpKyspIHsKKyAgICAgICAgICAgIG11bm1hcChwQ1RYLT52NGwyX2RlYy5tZmNfZHN0X2J1ZnNbaV1bMF0sIHBDVFgtPnY0bDJfZGVjLm1mY19kc3RfYnVmc19sZW5bMF0pOworICAgICAgICAgICAgbXVubWFwKHBDVFgtPnY0bDJfZGVjLm1mY19kc3RfYnVmc1tpXVsxXSwgcENUWC0+djRsMl9kZWMubWZjX2RzdF9idWZzX2xlblsxXSk7CisgICAgICAgIH0KKyAgICAgICAgcENUWC0+aW50ZXJfYnVmZl9zdGF0dXMgJj0gfihNRkNfVVNFX1lVVl9CVUZGKTsKKyAgICB9CisKKyAgICBjbG9zZShwQ1RYLT5oTUZDKTsKKyAgICBmcmVlKHBDVFgpOworCisgICAgcmV0dXJuIE1GQ19SRVRfT0s7Cit9CisKK1NTQlNJUF9NRkNfRVJST1JfQ09ERSBTc2JTaXBNZmNEZWNJbml0KHZvaWQgKm9wZW5IYW5kbGUsIFNTQlNJUF9NRkNfQ09ERUNfVFlQRSBjb2RlY190eXBlLCBpbnQgRnJhbWVsZW5nKQoreworICAgIGludCBwYWNrZWRQQiA9IDA7CisgICAgX01GQ0xJQiAqcENUWDsKKyAgICBpbnQgcmV0OworICAgIHVuc2lnbmVkIGludCBpLCBqOworCisgICAgc3RydWN0IHY0bDJfcmVxdWVzdGJ1ZmZlcnMgcmVxYnVmOworICAgIHN0cnVjdCB2NGwyX2J1ZmZlciBxYnVmOworICAgIHN0cnVjdCB2NGwyX3BsYW5lIHBsYW5lc1tNRkNfREVDX05VTV9QTEFORVNdOworCisgICAgc3RydWN0IHY0bDJfZm9ybWF0IGZtdDsKKyAgICBzdHJ1Y3QgdjRsMl9waXhfZm9ybWF0X21wbGFuZSBwaXhfbXA7CisgICAgc3RydWN0IHY0bDJfY29udHJvbCBjdHJsOworICAgIHN0cnVjdCB2NGwyX2Nyb3AgY3JvcDsKKyAgICBlbnVtIHY0bDJfYnVmX3R5cGUgdHlwZTsKKworICAgIGlmIChvcGVuSGFuZGxlID09IE5VTEwpIHsKKyAgICAgICAgTE9HRSgiWyVzXSBvcGVuSGFuZGxlIGlzIE5VTEwiLF9fZnVuY19fKTsKKyAgICAgICAgcmV0dXJuIE1GQ19SRVRfSU5WQUxJRF9QQVJBTTsKKyAgICB9CisKKyAgICBwQ1RYICA9IChfTUZDTElCICopIG9wZW5IYW5kbGU7CisKKyAgICBwQ1RYLT5jb2RlY1R5cGUgPSBjb2RlY190eXBlOworCisgICAgaWYgKChwQ1RYLT5jb2RlY1R5cGUgPT0gTVBFRzRfREVDKSB8fCAocENUWC0+Y29kZWNUeXBlID09IFhWSURfREVDKSB8fAorICAgIChwQ1RYLT5jb2RlY1R5cGUgPT0gRklNVjFfREVDKSB8fCAocENUWC0+Y29kZWNUeXBlID09IEZJTVYyX0RFQykgfHwKKyAgICAocENUWC0+Y29kZWNUeXBlID09IEZJTVYzX0RFQykgfHwgKHBDVFgtPmNvZGVjVHlwZSA9PSBGSU1WNF9ERUMpKQorICAgICAgICBwYWNrZWRQQiA9IGlzUEJQYWNrZWQocENUWCwgRnJhbWVsZW5nKTsKKworICAgIG1lbXNldCgmZm10LCAwLCBzaXplb2YoZm10KSk7CisKKyAgICBzd2l0Y2ggKHBDVFgtPmNvZGVjVHlwZSkgeworICAgIGNhc2UgSDI2NF9ERUM6CisgICAgICAgIGZtdC5mbXQucGl4X21wLnBpeGVsZm9ybWF0ID0gVjRMMl9QSVhfRk1UX0gyNjQ7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgTVBFRzRfREVDOgorICAgICAgICBmbXQuZm10LnBpeF9tcC5waXhlbGZvcm1hdCA9IFY0TDJfUElYX0ZNVF9NUEVHNDsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBIMjYzX0RFQzoKKyAgICAgICAgZm10LmZtdC5waXhfbXAucGl4ZWxmb3JtYXQgPSBWNEwyX1BJWF9GTVRfSDI2MzsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBYVklEX0RFQzoKKyAgICAgICAgZm10LmZtdC5waXhfbXAucGl4ZWxmb3JtYXQgPSBWNEwyX1BJWF9GTVRfWFZJRDsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBNUEVHMl9ERUM6CisgICAgICAgIGZtdC5mbXQucGl4X21wLnBpeGVsZm9ybWF0ID0gVjRMMl9QSVhfRk1UX01QRUcxMjsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBGSU1WMV9ERUM6CisgICAgICAgIGZtdC5mbXQucGl4X21wLnBpeGVsZm9ybWF0ID0gVjRMMl9QSVhfRk1UX0ZJTVYxOworICAgICAgICBmbXQuZm10LnBpeF9tcC53aWR0aCA9ICBwQ1RYLT5maW12MV9yZXMud2lkdGg7CisgICAgICAgIGZtdC5mbXQucGl4X21wLmhlaWdodCA9IHBDVFgtPmZpbXYxX3Jlcy5oZWlnaHQ7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgRklNVjJfREVDOgorICAgICAgICBmbXQuZm10LnBpeF9tcC5waXhlbGZvcm1hdCA9IFY0TDJfUElYX0ZNVF9GSU1WMjsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBGSU1WM19ERUM6CisgICAgICAgIGZtdC5mbXQucGl4X21wLnBpeGVsZm9ybWF0ID0gVjRMMl9QSVhfRk1UX0ZJTVYzOworICAgICAgICBicmVhazsKKyAgICBjYXNlIEZJTVY0X0RFQzoKKyAgICAgICAgZm10LmZtdC5waXhfbXAucGl4ZWxmb3JtYXQgPSBWNEwyX1BJWF9GTVRfRklNVjQ7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgVkMxX0RFQzoKKyAgICAgICAgZm10LmZtdC5waXhfbXAucGl4ZWxmb3JtYXQgPSBWNEwyX1BJWF9GTVRfVkMxOworICAgICAgICBicmVhazsKKyAgICBjYXNlIFZDMVJDVl9ERUM6CisgICAgICAgIGZtdC5mbXQucGl4X21wLnBpeGVsZm9ybWF0ID0gVjRMMl9QSVhfRk1UX1ZDMV9SQ1Y7CisgICAgICAgIGJyZWFrOworICAgIGRlZmF1bHQ6CisgICAgICAgIExPR0UoIlslc10gRG9lcyBOT1Qgc3VwcG9ydCB0aGUgc3RhbmRhcmQgKCVkKSIsX19mdW5jX18scENUWC0+Y29kZWNUeXBlKTsKKyAgICAgICAgcmV0ID0gTUZDX1JFVF9JTlZBTElEX1BBUkFNOworICAgICAgICBnb3RvIGVycm9yX2Nhc2UxOworICAgIH0KKworICAgIGZtdC50eXBlID0gVjRMMl9CVUZfVFlQRV9WSURFT19PVVRQVVRfTVBMQU5FOworICAgIGZtdC5mbXQucGl4X21wLnBsYW5lX2ZtdFswXS5zaXplaW1hZ2UgPSBNQVhfREVDT0RFUl9JTlBVVF9CVUZGRVJfU0laRTsKKworICAgIHJldCA9IGlvY3RsKHBDVFgtPmhNRkMsIFZJRElPQ19TX0ZNVCwgJmZtdCk7CisgICAgaWYgKHJldCAhPSAwKSB7CisgICAgICAgIExPR0UoIlslc10gU19GTVQgZmFpbGVkIixfX2Z1bmNfXyk7CisgICAgICAgIHJldCA9IE1GQ19SRVRfREVDX0lOSVRfRkFJTDsKKyAgICAgICAgZ290byBlcnJvcl9jYXNlMTsKKyAgICB9CisKKyAgICBtZW1zZXQoJnFidWYsIDAsIHNpemVvZihxYnVmKSk7CisKKyAgICBxYnVmLnR5cGUgPSBWNEwyX0JVRl9UWVBFX1ZJREVPX09VVFBVVF9NUExBTkU7CisgICAgcWJ1Zi5tZW1vcnkgPSBWNEwyX01FTU9SWV9NTUFQOworICAgIHFidWYuaW5kZXggPSBwQ1RYLT52NGwyX2RlYy5iZWluZ1VzZWRJbmRleDsKKyAgICBxYnVmLm0ucGxhbmVzID0gcGxhbmVzOworICAgIHFidWYubGVuZ3RoID0gMTsKKyAgICBxYnVmLm0ucGxhbmVzWzBdLmJ5dGVzdXNlZCA9IEZyYW1lbGVuZzsKKworICAgIHJldCA9IGlvY3RsKHBDVFgtPmhNRkMsIFZJRElPQ19RQlVGLCAmcWJ1Zik7CisgICAgaWYgKHJldCAhPSAwKSB7CisgICAgICAgIExPR0UoIlslc10gVklESU9DX1FCVUYgZmFpbGVkLCBWNEwyX0JVRl9UWVBFX1ZJREVPX09VVFBVVF9NUExBTkUiLF9fZnVuY19fKTsKKyAgICAgICAgcmV0ID0gTUZDX1JFVF9ERUNfSU5JVF9GQUlMOworICAgICAgICBnb3RvIGVycm9yX2Nhc2UxOworICAgIH0KKworICAgIHR5cGUgPSBWNEwyX0JVRl9UWVBFX1ZJREVPX09VVFBVVF9NUExBTkU7CisKKyAgICAvLyBQcm9jZXNzaW5nIHRoZSBoZWFkZXIgcmVxdWlyZXMgcnVubmluZyBzdHJlYW1vbgorICAgIC8vIG9uIE9VVFBVVCBxdWV1ZQorICAgIHJldCA9IGlvY3RsKHBDVFgtPmhNRkMsIFZJRElPQ19TVFJFQU1PTiwgJnR5cGUpOworICAgIGlmIChyZXQgIT0gMCkgeworICAgICAgICBMT0dFKCJbJXNdIFZJRElPQ19TVFJFQU1PTiBmYWlsZWQiLF9fZnVuY19fKTsKKyAgICAgICAgcmV0ID0gTUZDX1JFVF9ERUNfSU5JVF9GQUlMOworICAgICAgICBnb3RvIGVycm9yX2Nhc2UxOworICAgIH0KKworICAgIHBDVFgtPmludGVyX2J1ZmZfc3RhdHVzIHw9IE1GQ19VU0VfU1JDX1NUUkVBTU9OOworCisgICAgZm10LnR5cGUgPSBWNEwyX0JVRl9UWVBFX1ZJREVPX0NBUFRVUkVfTVBMQU5FOworCisgICAgcmV0ID0gaW9jdGwocENUWC0+aE1GQywgVklESU9DX0dfRk1ULCAmZm10KTsKKyAgICBpZiAocmV0ICE9IDApIHsKKyAgICAgICAgTE9HRSgiWyVzXSBWSURJT0NfR19GTVQgZmFpbGVkIixfX2Z1bmNfXyk7CisgICAgICAgIHJldCA9IE1GQ19SRVRfREVDX0lOSVRfRkFJTDsKKyAgICAgICAgZ290byBlcnJvcl9jYXNlMTsKKyAgICB9CisKKyAgICBwaXhfbXAgPSBmbXQuZm10LnBpeF9tcDsKKyAgICBwQ1RYLT5kZWNPdXRJbmZvLmJ1Zl93aWR0aCA9IHBpeF9tcC5wbGFuZV9mbXRbMF0uYnl0ZXNwZXJsaW5lOworICAgIHBDVFgtPmRlY091dEluZm8uYnVmX2hlaWdodCA9CisgICAgICAgIHBpeF9tcC5wbGFuZV9mbXRbMF0uc2l6ZWltYWdlIC8gcGl4X21wLnBsYW5lX2ZtdFswXS5ieXRlc3BlcmxpbmU7CisKKyAgICBwQ1RYLT5kZWNPdXRJbmZvLmltZ193aWR0aCA9IHBpeF9tcC53aWR0aDsKKyAgICBwQ1RYLT5kZWNPdXRJbmZvLmltZ19oZWlnaHQgPSBwaXhfbXAuaGVpZ2h0OworCisgICAgbWVtc2V0KCZjcm9wLCAwLCBzaXplb2YoY3JvcCkpOworICAgIGNyb3AudHlwZSA9IFY0TDJfQlVGX1RZUEVfVklERU9fQ0FQVFVSRV9NUExBTkU7CisKKyAgICByZXQgPSBpb2N0bChwQ1RYLT5oTUZDLCBWSURJT0NfR19DUk9QLCAmY3JvcCk7CisgICAgaWYgKHJldCAhPSAwKSB7CisgICAgICAgIExPR0UoIlslc10gVklESU9DX0dfQ1JPUCBmYWlsZWQiLF9fZnVuY19fKTsKKyAgICAgICAgcmV0ID0gTUZDX1JFVF9ERUNfSU5JVF9GQUlMOworICAgICAgICBnb3RvIGVycm9yX2Nhc2UxOworICAgIH0KKworICAgIHBDVFgtPmRlY091dEluZm8uY3JvcF9sZWZ0X29mZnNldCA9IGNyb3AuYy5sZWZ0OworICAgIHBDVFgtPmRlY091dEluZm8uY3JvcF90b3Bfb2Zmc2V0ID0gY3JvcC5jLnRvcDsKKyAgICBwQ1RYLT5kZWNPdXRJbmZvLmNyb3BfcmlnaHRfb2Zmc2V0ID0KKyAgICAgICAgcGl4X21wLndpZHRoIC0gY3JvcC5jLndpZHRoIC0gY3JvcC5jLmxlZnQ7CisgICAgcENUWC0+ZGVjT3V0SW5mby5jcm9wX2JvdHRvbV9vZmZzZXQgPQorICAgICAgICBwaXhfbXAuaGVpZ2h0IC0gY3JvcC5jLmhlaWdodCAtIGNyb3AuYy50b3A7CisKKyAgICBtZW1zZXQoJmN0cmwsIDAsIHNpemVvZihjdHJsKSk7CisgICAgY3RybC5pZCA9IFY0TDJfQ0lEX0NPREVDX1JFUV9OVU1fQlVGUzsKKworICAgIHJldCA9IGlvY3RsKHBDVFgtPmhNRkMsIFZJRElPQ19HX0NUUkwsICZjdHJsKTsKKyAgICBpZiAocmV0ICE9IDApIHsKKyAgICAgICAgTE9HRSgiWyVzXSBWSURJT0NfR19DVFJMIGZhaWxlZCIsX19mdW5jX18pOworICAgICAgICByZXQgPSBNRkNfUkVUX0RFQ19JTklUX0ZBSUw7CisgICAgICAgIGdvdG8gZXJyb3JfY2FzZTE7CisgICAgfQorCisgICAgcENUWC0+djRsMl9kZWMubWZjX251bV9kc3RfYnVmcyA9IGN0cmwudmFsdWUgKyBwQ1RYLT5kZWNfbnVtZXh0cmFkcGI7CisKKyAgICAvKiBDYWNoZWFibGUgYnVmZmVyICovCisgICAgY3RybC5pZCA9IFY0TDJfQ0lEX0NBQ0hFQUJMRTsKKyAgICBpZihwQ1RYLT5jYWNoZWFibGVidWZmZXIgPT0gTk9fQ0FDSEUpCisgICAgICAgIGN0cmwudmFsdWUgPSAwOworICAgIGVsc2UKKyAgICAgICAgY3RybC52YWx1ZSA9IDE7CisKKyAgICByZXQgPSBpb2N0bChwQ1RYLT5oTUZDLCBWSURJT0NfU19DVFJMLCAmY3RybCk7CisgICAgaWYgKHJldCAhPSAwKSB7CisgICAgICAgIExPR0UoIlslc10gVklESU9DX1NfQ1RSTCBmYWlsZWQsIFY0TDJfQ0lEX0NBQ0hFQUJMRSIsX19mdW5jX18pOworICAgICAgICByZXQgPSBNRkNfUkVUX0RFQ19JTklUX0ZBSUw7CisgICAgICAgIGdvdG8gZXJyb3JfY2FzZTE7CisgICAgfQorCisgICAgbWVtc2V0KCZyZXFidWYsIDAsIHNpemVvZihyZXFidWYpKTsKKyAgICByZXFidWYuY291bnQgID0gcENUWC0+djRsMl9kZWMubWZjX251bV9kc3RfYnVmczsKKyAgICByZXFidWYudHlwZSAgID0gVjRMMl9CVUZfVFlQRV9WSURFT19DQVBUVVJFX01QTEFORTsKKyAgICByZXFidWYubWVtb3J5ID0gVjRMMl9NRU1PUllfTU1BUDsKKworICAgIHJldCA9IGlvY3RsKHBDVFgtPmhNRkMsIFZJRElPQ19SRVFCVUZTLCAmcmVxYnVmKTsKKyAgICBpZiAocmV0ICE9IDApIHsKKyAgICAgICAgTE9HRSgiWyVzXSBWSURJT0NfUkVRQlVGUyBmYWlsZWQgKGRlc3RpbmF0aW9uIGJ1ZmZlcnMpIixfX2Z1bmNfXyk7CisgICAgICAgIHJldCA9IE1GQ19SRVRfREVDX0lOSVRfRkFJTDsKKyAgICAgICAgZ290byBlcnJvcl9jYXNlMTsKKyAgICB9CisKKyAgICBwQ1RYLT52NGwyX2RlYy5tZmNfbnVtX2RzdF9idWZzICA9IHJlcWJ1Zi5jb3VudDsKKworICAgIGZvciAoaSA9IDA7ICBpIDwgcENUWC0+djRsMl9kZWMubWZjX251bV9kc3RfYnVmczsgKytpKSB7CisgICAgICAgIG1lbXNldCgmcWJ1ZiwgMCwgc2l6ZW9mKHFidWYpKTsKKyAgICAgICAgcWJ1Zi50eXBlID0gVjRMMl9CVUZfVFlQRV9WSURFT19DQVBUVVJFX01QTEFORTsKKyAgICAgICAgcWJ1Zi5tZW1vcnkgPSBWNEwyX01FTU9SWV9NTUFQOworICAgICAgICBxYnVmLmluZGV4ID0gaTsKKyAgICAgICAgcWJ1Zi5tLnBsYW5lcyA9IHBsYW5lczsKKyAgICAgICAgcWJ1Zi5sZW5ndGggPSAyOworCisgICAgICAgIHJldCA9IGlvY3RsKHBDVFgtPmhNRkMsIFZJRElPQ19RVUVSWUJVRiwgJnFidWYpOworICAgICAgICBpZiAocmV0ICE9IDApIHsKKyAgICAgICAgICAgIExPR0UoIlslc10gVklESU9DX1FVRVJZQlVGIGZhaWxlZCAoZGVzdGluYXRpb24gYnVmZmVycykiLF9fZnVuY19fKTsKKyAgICAgICAgICAgIHJldCA9IE1GQ19SRVRfREVDX0lOSVRfRkFJTDsKKyAgICAgICAgICAgIGdvdG8gZXJyb3JfY2FzZTE7CisgICAgICAgIH0KKworICAgICAgICBwQ1RYLT52NGwyX2RlYy5tZmNfZHN0X2J1ZnNfbGVuWzBdID0gcWJ1Zi5tLnBsYW5lc1swXS5sZW5ndGg7CisgICAgICAgIHBDVFgtPnY0bDJfZGVjLm1mY19kc3RfYnVmc19sZW5bMV0gPSBxYnVmLm0ucGxhbmVzWzFdLmxlbmd0aDsKKworICAgICAgICBwQ1RYLT52NGwyX2RlYy5tZmNfZHN0X3BoeXNbaV1bMF0gPSBxYnVmLm0ucGxhbmVzWzBdLmNvb2tpZTsKKyAgICAgICAgcENUWC0+djRsMl9kZWMubWZjX2RzdF9waHlzW2ldWzFdID0gcWJ1Zi5tLnBsYW5lc1sxXS5jb29raWU7CisKKyAgICAgICAgcENUWC0+djRsMl9kZWMubWZjX2RzdF9idWZzW2ldWzBdID0gbW1hcChOVUxMLCBxYnVmLm0ucGxhbmVzWzBdLmxlbmd0aCwKKyAgICAgICAgICAgICBQUk9UX1JFQUQgfCBQUk9UX1dSSVRFLCBNQVBfU0hBUkVELCBwQ1RYLT5oTUZDLCBxYnVmLm0ucGxhbmVzWzBdLm0ubWVtX29mZnNldCk7CisKKyAgICAgICAgaWYgKHBDVFgtPnY0bDJfZGVjLm1mY19kc3RfYnVmc1tpXVswXSA9PSBNQVBfRkFJTEVEKSB7CisgICAgICAgICAgICBMT0dFKCJbJXNdIG1tYXAgZmFpbGVkIChkZXN0aW5hdGlvbiBidWZmZXJzIChZKSkiLF9fZnVuY19fKTsKKyAgICAgICAgICAgIHJldCA9IE1GQ19SRVRfREVDX0lOSVRfRkFJTDsKKyAgICAgICAgICAgIGdvdG8gZXJyb3JfY2FzZTI7CisgICAgICAgIH0KKworICAgICAgICBwQ1RYLT52NGwyX2RlYy5tZmNfZHN0X2J1ZnNbaV1bMV0gPSBtbWFwKE5VTEwsIHFidWYubS5wbGFuZXNbMV0ubGVuZ3RoLAorICAgICAgICBQUk9UX1JFQUQgfCBQUk9UX1dSSVRFLCBNQVBfU0hBUkVELCBwQ1RYLT5oTUZDLCBxYnVmLm0ucGxhbmVzWzFdLm0ubWVtX29mZnNldCk7CisgICAgICAgIGlmIChwQ1RYLT52NGwyX2RlYy5tZmNfZHN0X2J1ZnNbaV1bMV0gPT0gTUFQX0ZBSUxFRCkgeworICAgICAgICAgICAgTE9HRSgiWyVzXSBtbWFwIGZhaWxlZCAoZGVzdGluYXRpb24gYnVmZmVycyAoVVYpKSIsX19mdW5jX18pOworICAgICAgICAgICAgcmV0ID0gTUZDX1JFVF9ERUNfSU5JVF9GQUlMOworICAgICAgICAgICAgZ290byBlcnJvcl9jYXNlMjsKKyAgICAgICAgfQorCisgICAgICAgIHJldCA9IGlvY3RsKHBDVFgtPmhNRkMsIFZJRElPQ19RQlVGLCAmcWJ1Zik7CisgICAgICAgIGlmIChyZXQgIT0gMCkgeworICAgICAgICAgICAgTE9HRSgiWyVzXSBWSURJT0NfUUJVRiBmYWlsZWQsIFY0TDJfQlVGX1RZUEVfVklERU9fQ0FQVFVSRV9NUExBTkUiLF9fZnVuY19fKTsKKyAgICAgICAgICAgIHJldCA9IE1GQ19SRVRfREVDX0lOSVRfRkFJTDsKKyAgICAgICAgICAgIGdvdG8gZXJyb3JfY2FzZTI7CisgICAgICAgIH0KKyAgICB9CisgICAgcENUWC0+aW50ZXJfYnVmZl9zdGF0dXMgfD0gTUZDX1VTRV9ZVVZfQlVGRjsKKworICAgIHR5cGUgPSBWNEwyX0JVRl9UWVBFX1ZJREVPX0NBUFRVUkVfTVBMQU5FOworICAgIHJldCA9IGlvY3RsKHBDVFgtPmhNRkMsIFZJRElPQ19TVFJFQU1PTiwgJnR5cGUpOworICAgIGlmIChyZXQgIT0gMCkgeworICAgICAgICBMT0dFKCJbJXNdIFZJRElPQ19TVFJFQU1PTiBmYWlsZWQgKGRlc3RpbmF0aW9uIGJ1ZmZlcnMpIixfX2Z1bmNfXyk7CisgICAgICAgIHJldCA9IE1GQ19SRVRfREVDX0lOSVRfRkFJTDsKKyAgICAgICAgZ290byBlcnJvcl9jYXNlMTsKKyAgICB9CisgICAgcENUWC0+aW50ZXJfYnVmZl9zdGF0dXMgfD0gTUZDX1VTRV9EU1RfU1RSRUFNT047CisKKyAgICBtZW1zZXQoJnFidWYsIDAsIHNpemVvZihxYnVmKSk7CisgICAgcWJ1Zi50eXBlID0gVjRMMl9CVUZfVFlQRV9WSURFT19PVVRQVVRfTVBMQU5FOworICAgIHFidWYubWVtb3J5ID0gVjRMMl9NRU1PUllfTU1BUDsKKworICAgIHJldCA9IGlvY3RsKHBDVFgtPmhNRkMsIFZJRElPQ19EUUJVRiwgJnFidWYpOworICAgIGlmKHJldCAhPSAwKSB7CisgICAgICAgIExPR0UoIlslc10gVklESU9DX0RRQlVGIGZhaWxlZCwgVjRMMl9CVUZfVFlQRV9WSURFT19PVVRQVVRfTVBMQU5FIixfX2Z1bmNfXyk7CisgICAgICAgIHJldCA9IE1GQ19SRVRfREVDX0lOSVRfRkFJTDsKKyAgICAgICAgZ290byBlcnJvcl9jYXNlMTsKKyAgICAgICAgfQorCisgICAgcmV0dXJuIE1GQ19SRVRfT0s7CisKK2Vycm9yX2Nhc2UyOgorICAgIGZvciAoaiA9IDA7IGogPCBpOyBqKyspIHsKKyAgICAgICAgbXVubWFwKHBDVFgtPnY0bDJfZGVjLm1mY19kc3RfYnVmc1tqXVswXSwgcENUWC0+djRsMl9kZWMubWZjX2RzdF9idWZzX2xlblswXSk7CisgICAgICAgIG11bm1hcChwQ1RYLT52NGwyX2RlYy5tZmNfZHN0X2J1ZnNbal1bMV0sIHBDVFgtPnY0bDJfZGVjLm1mY19kc3RfYnVmc19sZW5bMV0pOworICAgIH0KK2Vycm9yX2Nhc2UxOgorICAgIFNzYlNpcE1mY0RlY0Nsb3NlKG9wZW5IYW5kbGUpOworICAgIHJldHVybiByZXQ7Cit9CisKK1NTQlNJUF9NRkNfRVJST1JfQ09ERSBTc2JTaXBNZmNEZWNFeGUodm9pZCAqb3BlbkhhbmRsZSwgaW50IGxlbmd0aEJ1ZkZpbGwpCit7CisgICAgX01GQ0xJQiAqcENUWDsKKyAgICBpbnQgcmV0OworICAgIHN0cnVjdCB2NGwyX2J1ZmZlciBxYnVmOworICAgIHN0cnVjdCB2NGwyX3BsYW5lIHBsYW5lc1tNRkNfREVDX05VTV9QTEFORVNdOworCisgICAgc3RydWN0IHBvbGxmZCBwb2xsX2V2ZW50czsKKyAgICBpbnQgcG9sbF9zdGF0ZTsKKworI2lmZGVmIENPTkZJR19NRkNfRlBTCisgICAgZnJhbWVjb3VudCsrOworI2VuZGlmCisgICAgaWYgKG9wZW5IYW5kbGUgPT0gTlVMTCkgeworICAgICAgICBMT0dFKCJbJXNdIG9wZW5IYW5kbGUgaXMgTlVMTCIsX19mdW5jX18pOworICAgICAgICByZXR1cm4gTUZDX1JFVF9JTlZBTElEX1BBUkFNOworICAgIH0KKworICAgIGlmICgobGVuZ3RoQnVmRmlsbCA8IDApIHx8IChsZW5ndGhCdWZGaWxsID4gTUFYX0RFQ09ERVJfSU5QVVRfQlVGRkVSX1NJWkUpKSB7CisgICAgICAgIExPR0UoIlslc10gbGVuZ3RoQnVmRmlsbCBpcyBpbnZhbGlkLiAobGVuZ3RoQnVmRmlsbD0lZCkiLF9fZnVuY19fLCBsZW5ndGhCdWZGaWxsKTsKKyAgICAgICAgcmV0dXJuIE1GQ19SRVRfSU5WQUxJRF9QQVJBTTsKKyAgICB9CisKKyNpZmRlZiBDT05GSUdfTUZDX0ZQUworICAgIGdldHRpbWVvZmRheSgmbURlYzEsIE5VTEwpOworI2VuZGlmCisgICAgcENUWCAgPSAoX01GQ0xJQiAqKSBvcGVuSGFuZGxlOworCisgICAgLyogbm90ZTogI2RlZmluZSBQT0xMT1VUIDB4MDAwNCAqLworICAgIHBvbGxfZXZlbnRzLmZkID0gcENUWC0+aE1GQzsKKyAgICBwb2xsX2V2ZW50cy5ldmVudHMgPSBQT0xMT1VUIHwgUE9MTEVSUjsKKyAgICBwb2xsX2V2ZW50cy5yZXZlbnRzID0gMDsKKworICAgIGlmICgobGVuZ3RoQnVmRmlsbCA+IDApICYmIChTU0JTSVBfTUZDX0xBU1RfRlJBTUVfUFJPQ0VTU0VEICE9IHBDVFgtPmxhc3RmcmFtZSkpIHsKKyAgICAgICAgLyogUXVldWUgdGhlIHN0cmVhbSBmcmFtZSAqLworICAgICAgICBtZW1zZXQoJnFidWYsIDAsIHNpemVvZihxYnVmKSk7CisgICAgICAgIHFidWYudHlwZSA9IFY0TDJfQlVGX1RZUEVfVklERU9fT1VUUFVUX01QTEFORTsKKyAgICAgICAgcWJ1Zi5tZW1vcnkgPSBWNEwyX01FTU9SWV9NTUFQOworICAgICAgICBxYnVmLmluZGV4ID0gcENUWC0+djRsMl9kZWMuYmVpbmdVc2VkSW5kZXg7CisgICAgICAgIHFidWYubS5wbGFuZXMgPSBwbGFuZXM7CisgICAgICAgIHFidWYubGVuZ3RoID0gMTsKKyAgICAgICAgcWJ1Zi5tLnBsYW5lc1swXS5ieXRlc3VzZWQgPSBsZW5ndGhCdWZGaWxsOworCisgICAgICAgIHJldCA9IGlvY3RsKHBDVFgtPmhNRkMsIFZJRElPQ19RQlVGLCAmcWJ1Zik7CisgICAgICAgIGlmIChyZXQgIT0gMCkgeworICAgICAgICAgICAgTE9HRSgiWyVzXSBWSURJT0NfUUJVRiBmYWlsZWQsIFY0TDJfQlVGX1RZUEVfVklERU9fT1VUUFVUX01QTEFORSIsX19mdW5jX18pOworICAgICAgICAgICAgcmV0dXJuIE1GQ19SRVRfREVDX0VYRV9FUlI7CisgICAgICAgIH0KKworICAgICAgICBtZW1zZXQoJnFidWYsIDAsIHNpemVvZihxYnVmKSk7CisgICAgICAgIHFidWYudHlwZSA9IFY0TDJfQlVGX1RZUEVfVklERU9fT1VUUFVUX01QTEFORTsKKyAgICAgICAgcWJ1Zi5tZW1vcnkgPSBWNEwyX01FTU9SWV9NTUFQOworICAgICAgICBxYnVmLm0ucGxhbmVzID0gcGxhbmVzOworICAgICAgICBxYnVmLmxlbmd0aCA9IDE7CisKKyAgICAgICAgLyogd2FpdCBmb3IgZGVjb2RpbmcgKi8KKyAgICAgICAgZG8geworICAgICAgICAgICAgcG9sbF9zdGF0ZSA9IHBvbGwoKHN0cnVjdCBwb2xsZmQqKSZwb2xsX2V2ZW50cywgMSwgUE9MTF9ERUNfV0FJVF9USU1FT1VUKTsKKyAgICAgICAgICAgIGlmICgwIDwgcG9sbF9zdGF0ZSkgeworICAgICAgICAgICAgICAgIGlmIChwb2xsX2V2ZW50cy5yZXZlbnRzICYgUE9MTE9VVCkgeyAvKiBQT0xMT1VUICovCisgICAgICAgICAgICAgICAgICAgIHJldCA9IGlvY3RsKHBDVFgtPmhNRkMsIFZJRElPQ19EUUJVRiwgJnFidWYpOworICAgICAgICAgICAgICAgICAgICBpZiAocmV0ID09IDApIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChxYnVmLmZsYWdzICYgVjRMMl9CVUZfRkxBR19FUlJPUikKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gTUZDX1JFVF9ERUNfRVhFX0VSUjsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChwb2xsX2V2ZW50cy5yZXZlbnRzICYgUE9MTEVSUikgeyAvKiBQT0xMRVJSICovCisgICAgICAgICAgICAgICAgICAgIExPR0UoIlslc10gUE9MTEVSUlxuIixfX2Z1bmNfXyk7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBNRkNfUkVUX0RFQ19FWEVfRVJSOworICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIExPR0UoIlslc10gcG9sbCgpIHJldHVybnMgMHgleFxuIixfX2Z1bmNfXywgcG9sbF9ldmVudHMucmV2ZW50cyk7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBNRkNfUkVUX0RFQ19FWEVfRVJSOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0gZWxzZSBpZiAoMCA+IHBvbGxfc3RhdGUpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gTUZDX1JFVF9ERUNfRVhFX0VSUjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSB3aGlsZSAoMCA9PSBwb2xsX3N0YXRlKTsKKworICAgICAgICBtZW1zZXQoJnFidWYsIDAsIHNpemVvZihxYnVmKSk7CisgICAgICAgIHFidWYudHlwZSA9IFY0TDJfQlVGX1RZUEVfVklERU9fQ0FQVFVSRV9NUExBTkU7CisgICAgICAgIHFidWYubWVtb3J5ID0gVjRMMl9NRU1PUllfTU1BUDsKKyAgICAgICAgcWJ1Zi5tLnBsYW5lcyA9IHBsYW5lczsKKyAgICAgICAgcWJ1Zi5sZW5ndGggPSBNRkNfREVDX05VTV9QTEFORVM7CisKKyAgICAgICAgcmV0ID0gaW9jdGwocENUWC0+aE1GQywgVklESU9DX0RRQlVGLCAmcWJ1Zik7CisKKyAgICAgICAgaWYgKHJldCAhPSAwKSB7CisgICAgICAgICAgICBwQ1RYLT5kaXNwbGF5U3RhdHVzID0gTUZDX0dFVE9VVEJVRl9ERUNPRElOR19PTkxZOworICAgICAgICAgICAgcENUWC0+ZGVjT3V0SW5mby5kaXNwX3BpY19mcmFtZV90eXBlID0gLTE7CisgICAgICAgICAgICByZXR1cm4gTUZDX1JFVF9PSzsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHBDVFgtPmRpc3BsYXlTdGF0dXMgPSBNRkNfR0VUT1VUQlVGX0RJU1BMQVlfREVDT0RJTkc7CisgICAgICAgIH0KKworICAgICAgICBwQ1RYLT5kZWNPdXRJbmZvLllWaXJBZGRyID0gcENUWC0+djRsMl9kZWMubWZjX2RzdF9idWZzW3FidWYuaW5kZXhdWzBdOworICAgICAgICBwQ1RYLT5kZWNPdXRJbmZvLkNWaXJBZGRyID0gcENUWC0+djRsMl9kZWMubWZjX2RzdF9idWZzW3FidWYuaW5kZXhdWzFdOworCisgICAgICAgIHBDVFgtPmRlY091dEluZm8uWVBoeUFkZHIgPSAodW5zaWduZWQgaW50KXBDVFgtPnY0bDJfZGVjLm1mY19kc3RfcGh5c1txYnVmLmluZGV4XVswXTsKKyAgICAgICAgcENUWC0+ZGVjT3V0SW5mby5DUGh5QWRkciA9ICh1bnNpZ25lZCBpbnQpcENUWC0+djRsMl9kZWMubWZjX2RzdF9waHlzW3FidWYuaW5kZXhdWzFdOworCisgICAgICAgIGlmIChTU0JTSVBfTUZDX0xBU1RfRlJBTUVfUkVDRUlWRUQgPT0gcENUWC0+bGFzdGZyYW1lKQorICAgICAgICAgICAgcENUWC0+bGFzdGZyYW1lID0gU1NCU0lQX01GQ19MQVNUX0ZSQU1FX1BST0NFU1NFRDsKKworICAgIH0gZWxzZSBpZihwQ1RYLT52NGwyX2RlYy5iQmVpbmdGaW5hbGl6ZWQgPT0gMCkgeworICAgICAgICBwQ1RYLT5sYXN0ZnJhbWUgPSBTU0JTSVBfTUZDX0xBU1RfRlJBTUVfUFJPQ0VTU0VEOworCisgICAgICAgIC8qIFF1ZXVlIHRoZSBzdHJlYW0gZnJhbWUgKi8KKyAgICAgICAgbWVtc2V0KCZxYnVmLCAwLCBzaXplb2YocWJ1ZikpOworICAgICAgICBxYnVmLnR5cGUgPSBWNEwyX0JVRl9UWVBFX1ZJREVPX09VVFBVVF9NUExBTkU7CisgICAgICAgIHFidWYubWVtb3J5ID0gVjRMMl9NRU1PUllfTU1BUDsKKyAgICAgICAgcWJ1Zi5pbmRleCA9IHBDVFgtPnY0bDJfZGVjLmJlaW5nVXNlZEluZGV4OworICAgICAgICBxYnVmLm0ucGxhbmVzID0gcGxhbmVzOworICAgICAgICBxYnVmLmxlbmd0aCA9IDE7CisgICAgICAgIHFidWYubS5wbGFuZXNbMF0uYnl0ZXN1c2VkID0gMDsKKworICAgICAgICByZXQgPSBpb2N0bChwQ1RYLT5oTUZDLCBWSURJT0NfUUJVRiwgJnFidWYpOworICAgICAgICBpZiAocmV0ICE9IDApIHsKKyAgICAgICAgICAgIExPR0UoIlslc10gVklESU9DX1FCVUYgZmFpbGVkLCBWNEwyX0JVRl9UWVBFX1ZJREVPX09VVFBVVF9NUExBTkUiLF9fZnVuY19fKTsKKyAgICAgICAgICAgIHJldHVybiBNRkNfUkVUX0RFQ19FWEVfRVJSOworICAgICAgICB9CisKKyAgICAgICAgcENUWC0+djRsMl9kZWMuYkJlaW5nRmluYWxpemVkID0gMTsgLyogdHJ1ZSAqLworCisgICAgICAgIG1lbXNldCgmcWJ1ZiwgMCwgc2l6ZW9mKHFidWYpKTsKKyAgICAgICAgcWJ1Zi50eXBlID0gVjRMMl9CVUZfVFlQRV9WSURFT19DQVBUVVJFX01QTEFORTsKKyAgICAgICAgcWJ1Zi5tZW1vcnkgPSBWNEwyX01FTU9SWV9NTUFQOworICAgICAgICBxYnVmLm0ucGxhbmVzID0gcGxhbmVzOworICAgICAgICBxYnVmLmxlbmd0aCA9IE1GQ19ERUNfTlVNX1BMQU5FUzsKKyAgICAgICAgLyogRklYTUUKKyAgICAgICAgIHdhaXQgZm9yIGRlY29kaW5nICovCisgICAgICAgIGRvIHsKKyAgICAgICAgICAgIHJldCA9IGlvY3RsKHBDVFgtPmhNRkMsIFZJRElPQ19EUUJVRiwgJnFidWYpOworICAgICAgICB9IHdoaWxlIChyZXQgIT0gMCk7CisKKyAgICAgICAgcENUWC0+ZGlzcGxheVN0YXR1cyA9IE1GQ19HRVRPVVRCVUZfRElTUExBWV9PTkxZOworCisgICAgICAgIHBDVFgtPmRlY091dEluZm8uWVZpckFkZHIgPSBwQ1RYLT52NGwyX2RlYy5tZmNfZHN0X2J1ZnNbcWJ1Zi5pbmRleF1bMF07CisgICAgICAgIHBDVFgtPmRlY091dEluZm8uQ1ZpckFkZHIgPSBwQ1RYLT52NGwyX2RlYy5tZmNfZHN0X2J1ZnNbcWJ1Zi5pbmRleF1bMV07CisKKyAgICAgICAgcENUWC0+ZGVjT3V0SW5mby5ZUGh5QWRkciA9ICh1bnNpZ25lZCBpbnQpcENUWC0+djRsMl9kZWMubWZjX2RzdF9waHlzW3FidWYuaW5kZXhdWzBdOworICAgICAgICBwQ1RYLT5kZWNPdXRJbmZvLkNQaHlBZGRyID0gKHVuc2lnbmVkIGludClwQ1RYLT52NGwyX2RlYy5tZmNfZHN0X3BoeXNbcWJ1Zi5pbmRleF1bMV07CisgICAgfSBlbHNlIHsKKyAgICAgICAgbWVtc2V0KCZxYnVmLCAwLCBzaXplb2YocWJ1ZikpOworICAgICAgICBxYnVmLnR5cGUgPSBWNEwyX0JVRl9UWVBFX1ZJREVPX0NBUFRVUkVfTVBMQU5FOworICAgICAgICBxYnVmLm1lbW9yeSA9IFY0TDJfTUVNT1JZX01NQVA7CisgICAgICAgIHFidWYubS5wbGFuZXMgPSBwbGFuZXM7CisgICAgICAgIHFidWYubGVuZ3RoID0gTUZDX0RFQ19OVU1fUExBTkVTOworCisgICAgICAgIHJldCA9IGlvY3RsKHBDVFgtPmhNRkMsIFZJRElPQ19EUUJVRiwgJnFidWYpOworCisgICAgICAgIGlmIChxYnVmLm0ucGxhbmVzWzBdLmJ5dGVzdXNlZCA9PSAwKSB7CisgICAgICAgICAgICBwQ1RYLT5kaXNwbGF5U3RhdHVzID0gTUZDX0dFVE9VVEJVRl9ESVNQTEFZX0VORDsKKyAgICAgICAgICAgIHBDVFgtPmRlY091dEluZm8uZGlzcF9waWNfZnJhbWVfdHlwZSA9IC0xOworICAgICAgICAgICAgcmV0dXJuIE1GQ19SRVRfT0s7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBwQ1RYLT5kaXNwbGF5U3RhdHVzID0gTUZDX0dFVE9VVEJVRl9ESVNQTEFZX09OTFk7CisgICAgICAgIH0KKworICAgICAgICBwQ1RYLT5kZWNPdXRJbmZvLllWaXJBZGRyID0gcENUWC0+djRsMl9kZWMubWZjX2RzdF9idWZzW3FidWYuaW5kZXhdWzBdOworICAgICAgICBwQ1RYLT5kZWNPdXRJbmZvLkNWaXJBZGRyID0gcENUWC0+djRsMl9kZWMubWZjX2RzdF9idWZzW3FidWYuaW5kZXhdWzFdOworCisgICAgICAgIHBDVFgtPmRlY091dEluZm8uWVBoeUFkZHIgPSAodW5zaWduZWQgaW50KXBDVFgtPnY0bDJfZGVjLm1mY19kc3RfcGh5c1txYnVmLmluZGV4XVswXTsKKyAgICAgICAgcENUWC0+ZGVjT3V0SW5mby5DUGh5QWRkciA9ICh1bnNpZ25lZCBpbnQpcENUWC0+djRsMl9kZWMubWZjX2RzdF9waHlzW3FidWYuaW5kZXhdWzFdOworICAgIH0KKworICAgIHBDVFgtPmRlY091dEluZm8uZGlzcF9waWNfZnJhbWVfdHlwZSA9IChxYnVmLmZsYWdzICYgKDB4NyA8PCAzKSk7CisKKyAgICBzd2l0Y2ggKHBDVFgtPmRlY091dEluZm8uZGlzcF9waWNfZnJhbWVfdHlwZSkgeworICAgIGNhc2UgVjRMMl9CVUZfRkxBR19LRVlGUkFNRToKKyAgICAgICAgcENUWC0+ZGVjT3V0SW5mby5kaXNwX3BpY19mcmFtZV90eXBlID0gMTsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBWNEwyX0JVRl9GTEFHX1BGUkFNRToKKyAgICAgICAgcENUWC0+ZGVjT3V0SW5mby5kaXNwX3BpY19mcmFtZV90eXBlID0gMjsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBWNEwyX0JVRl9GTEFHX0JGUkFNRToKKyAgICAgICAgcENUWC0+ZGVjT3V0SW5mby5kaXNwX3BpY19mcmFtZV90eXBlID0gMzsKKyAgICAgICAgYnJlYWs7CisgICAgZGVmYXVsdDoKKyAgICAgICAgcENUWC0+ZGVjT3V0SW5mby5kaXNwX3BpY19mcmFtZV90eXBlID0gMDsKKyAgICAgICAgYnJlYWs7CisgICAgfQorCisgICAgcmV0ID0gaW9jdGwocENUWC0+aE1GQywgVklESU9DX1FCVUYsICZxYnVmKTsKKworI2lmZGVmIENPTkZJR19NRkNfRlBTCisgICAgZ2V0dGltZW9mZGF5KCZtRGVjMiwgTlVMTCk7CisgICAgaWYgKG1EZWMyLnR2X3VzZWMtbURlYzEudHZfdXNlYyA+IDMwMDAwKSBvdmVyMzBtcysrOworI2VuZGlmCisgICAgcmV0dXJuIE1GQ19SRVRfT0s7Cit9CisKKyNpZiAwCitTU0JTSVBfTUZDX0VSUk9SX0NPREUgU3NiU2lwTWZjRGVjRXhlTmIodm9pZCAqb3BlbkhhbmRsZSwgaW50IGxlbmd0aEJ1ZkZpbGwpCit7CisgICAgX01GQ0xJQiAqcENUWDsKKyAgICBpbnQgcmV0OworCisgICAgc3RydWN0IHY0bDJfYnVmZmVyIHFidWY7CisgICAgc3RydWN0IHY0bDJfcGxhbmUgcGxhbmVzW01GQ19ERUNfTlVNX1BMQU5FU107CisKKyNpZmRlZiBDT05GSUdfTUZDX0ZQUworICAgIGZyYW1lY291bnQrKzsKKyNlbmRpZgorICAgIGlmIChvcGVuSGFuZGxlID09IE5VTEwpIHsKKyAgICAgICAgTE9HRSgiWyVzXSBvcGVuSGFuZGxlIGlzIE5VTEwiLF9fZnVuY19fKTsKKyAgICAgICAgcmV0dXJuIE1GQ19SRVRfSU5WQUxJRF9QQVJBTTsKKyAgICB9CisKKyAgICBpZiAoKGxlbmd0aEJ1ZkZpbGwgPCAwKSB8fCAobGVuZ3RoQnVmRmlsbCA+IE1BWF9ERUNPREVSX0lOUFVUX0JVRkZFUl9TSVpFKSkgeworICAgICAgICBMT0dFKCJbJXNdIGxlbmd0aEJ1ZkZpbGwgaXMgaW52YWxpZC4gKGxlbmd0aEJ1ZkZpbGw9JWQpIixfX2Z1bmNfXywgbGVuZ3RoQnVmRmlsbCk7CisgICAgICAgIHJldHVybiBNRkNfUkVUX0lOVkFMSURfUEFSQU07CisgICAgfQorCisgICAgcENUWCAgPSAoX01GQ0xJQiAqKSBvcGVuSGFuZGxlOworCisgICAgaWYgKChsZW5ndGhCdWZGaWxsID4gMCkgJiYgKFNTQlNJUF9NRkNfTEFTVF9GUkFNRV9QUk9DRVNTRUQgIT0gcENUWC0+bGFzdGZyYW1lKSkgeworICAgICAgICAvKiBRdWV1ZSB0aGUgc3RyZWFtIGZyYW1lICovCisgICAgICAgIG1lbXNldCgmcWJ1ZiwgMCwgc2l6ZW9mKHFidWYpKTsKKyAgICAgICAgcWJ1Zi50eXBlID0gVjRMMl9CVUZfVFlQRV9WSURFT19PVVRQVVRfTVBMQU5FOworICAgICAgICBxYnVmLm1lbW9yeSA9IFY0TDJfTUVNT1JZX01NQVA7CisgICAgICAgIHFidWYuaW5kZXggPSBwQ1RYLT52NGwyX2RlYy5iZWluZ1VzZWRJbmRleDsKKyAgICAgICAgcWJ1Zi5tLnBsYW5lcyA9IHBsYW5lczsKKyAgICAgICAgcWJ1Zi5sZW5ndGggPSAxOworICAgICAgICBxYnVmLm0ucGxhbmVzWzBdLmJ5dGVzdXNlZCA9IGxlbmd0aEJ1ZkZpbGw7CisKKyAgICAgICAgcmV0ID0gaW9jdGwocENUWC0+aE1GQywgVklESU9DX1FCVUYsICZxYnVmKTsKKyAgICAgICAgaWYgKHJldCAhPSAwKSB7CisgICAgICAgICAgICBMT0dFKCJbJXNdIFZJRElPQ19RQlVGIGZhaWxlZCwgVjRMMl9CVUZfVFlQRV9WSURFT19PVVRQVVRfTVBMQU5FIixfX2Z1bmNfXyk7CisgICAgICAgICAgICByZXR1cm4gTUZDX1JFVF9ERUNfRVhFX0VSUjsKKyAgICAgICAgfQorICAgIH0gZWxzZSBpZihwQ1RYLT52NGwyX2RlYy5iQmVpbmdGaW5hbGl6ZWQgPT0gMCkgeworICAgICAgICAvKiBRdWV1ZSB0aGUgc3RyZWFtIGZyYW1lICovCisgICAgICAgIG1lbXNldCgmcWJ1ZiwgMCwgc2l6ZW9mKHFidWYpKTsKKyAgICAgICAgcWJ1Zi50eXBlID0gVjRMMl9CVUZfVFlQRV9WSURFT19PVVRQVVRfTVBMQU5FOworICAgICAgICBxYnVmLm1lbW9yeSA9IFY0TDJfTUVNT1JZX01NQVA7CisgICAgICAgIHFidWYuaW5kZXggPSBwQ1RYLT52NGwyX2RlYy5iZWluZ1VzZWRJbmRleDsKKyAgICAgICAgcWJ1Zi5tLnBsYW5lcyA9IHBsYW5lczsKKyAgICAgICAgcWJ1Zi5sZW5ndGggPSAxOworICAgICAgICBxYnVmLm0ucGxhbmVzWzBdLmJ5dGVzdXNlZCA9IDA7CisKKyAgICAgICAgcmV0ID0gaW9jdGwocENUWC0+aE1GQywgVklESU9DX1FCVUYsICZxYnVmKTsKKyAgICAgICAgaWYgKHJldCAhPSAwKSB7CisgICAgICAgICAgICBMT0dFKCJbJXNdIFZJRElPQ19RQlVGIGZhaWxlZCwgVjRMMl9CVUZfVFlQRV9WSURFT19PVVRQVVRfTVBMQU5FIixfX2Z1bmNfXyk7CisgICAgICAgICAgICByZXR1cm4gTUZDX1JFVF9ERUNfRVhFX0VSUjsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoU1NCU0lQX01GQ19MQVNUX0ZSQU1FX1BST0NFU1NFRCAhPSBwQ1RYLT5sYXN0ZnJhbWUpICYmIChsZW5ndGhCdWZGaWxsID09IDApKQorICAgICAgICBwQ1RYLT5sYXN0ZnJhbWUgPSBTU0JTSVBfTUZDX0xBU1RfRlJBTUVfUkVDRUlWRUQ7CisKKyAgICByZXR1cm4gTUZDX1JFVF9PSzsKK30KKworU1NCU0lQX01GQ19ERUNfT1VUQlVGX1NUQVRVUyBTc2JTaXBNZmNEZWNXYWl0Rm9yT3V0QnVmKHZvaWQgKm9wZW5IYW5kbGUsIFNTQlNJUF9NRkNfREVDX09VVFBVVF9JTkZPICpvdXRwdXRfaW5mbykKK3sKKyAgICBfTUZDTElCICpwQ1RYOworICAgIGludCByZXQ7CisKKyAgICBzdHJ1Y3QgdjRsMl9idWZmZXIgcWJ1ZjsKKyAgICBzdHJ1Y3QgdjRsMl9wbGFuZSBwbGFuZXNbTUZDX0RFQ19OVU1fUExBTkVTXTsKKworICAgIHN0cnVjdCBwb2xsZmQgcG9sbF9ldmVudHM7CisgICAgaW50IHBvbGxfc3RhdGU7CisKKyAgICBwQ1RYICA9IChfTUZDTElCICopIG9wZW5IYW5kbGU7CisKKyAgICAvKiBub3RlOiAjZGVmaW5lIFBPTExPVVQgMHgwMDA0ICovCisgICAgcG9sbF9ldmVudHMuZmQgPSBwQ1RYLT5oTUZDOworICAgIHBvbGxfZXZlbnRzLmV2ZW50cyA9IFBPTExPVVQgfCBQT0xMRVJSOworICAgIHBvbGxfZXZlbnRzLnJldmVudHMgPSAwOworCisgICAgaWYgKFNTQlNJUF9NRkNfTEFTVF9GUkFNRV9QUk9DRVNTRUQgIT0gcENUWC0+bGFzdGZyYW1lKSB7CisgICAgICAgIG1lbXNldCgmcWJ1ZiwgMCwgc2l6ZW9mKHFidWYpKTsKKyAgICAgICAgcWJ1Zi50eXBlID0gVjRMMl9CVUZfVFlQRV9WSURFT19PVVRQVVRfTVBMQU5FOworICAgICAgICBxYnVmLm1lbW9yeSA9IFY0TDJfTUVNT1JZX01NQVA7CisgICAgICAgIHFidWYubS5wbGFuZXMgPSBwbGFuZXM7CisgICAgICAgIHFidWYubGVuZ3RoID0gMTsKKworICAgICAgICAvKiB3YWl0IGZvciBkZWNvZGluZyAqLworICAgICAgICBkbyB7CisgICAgICAgICAgICBwb2xsX3N0YXRlID0gcG9sbCgoc3RydWN0IHBvbGxmZCopJnBvbGxfZXZlbnRzLCAxLCBQT0xMX0RFQ19XQUlUX1RJTUVPVVQpOworICAgICAgICAgICAgaWYgKDAgPCBwb2xsX3N0YXRlKSB7CisgICAgICAgICAgICAgICAgaWYgKHBvbGxfZXZlbnRzLnJldmVudHMgJiBQT0xMT1VUKSB7IC8qIFBPTExPVVQgKi8KKyAgICAgICAgICAgICAgICAgICAgcmV0ID0gaW9jdGwocENUWC0+aE1GQywgVklESU9DX0RRQlVGLCAmcWJ1Zik7CisgICAgICAgICAgICAgICAgICAgIGlmIChyZXQgPT0gMCkgeworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHFidWYuZmxhZ3MgJiBWNEwyX0JVRl9GTEFHX0VSUk9SKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBNRkNfR0VUT1VUQlVGX1NUQVRVU19OVUxMOworICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKHBvbGxfZXZlbnRzLnJldmVudHMgJiBQT0xMRVJSKSB7IC8qIFBPTExFUlIgKi8KKyAgICAgICAgICAgICAgICAgICAgTE9HRSgiWyVzXSBQT0xMRVJSXG4iLF9fZnVuY19fKTsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIE1GQ19HRVRPVVRCVUZfU1RBVFVTX05VTEw7CisgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgTE9HRSgiWyVzXSBwb2xsKCkgcmV0dXJucyAweCV4XG4iLF9fZnVuY19fLCBwb2xsX2V2ZW50cy5yZXZlbnRzKTsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIE1GQ19HRVRPVVRCVUZfU1RBVFVTX05VTEw7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfSBlbHNlIGlmICgwID4gcG9sbF9zdGF0ZSkgeworICAgICAgICAgICAgICAgIHJldHVybiBNRkNfR0VUT1VUQlVGX1NUQVRVU19OVUxMOworICAgICAgICAgICAgfQorICAgICAgICB9IHdoaWxlICgwID09IHBvbGxfc3RhdGUpOworCisgICAgICAgIHBDVFgtPnY0bDJfZGVjLm1mY19zcmNfYnVmX2ZsYWdzW3FidWYuaW5kZXhdID0gQlVGX0RFUVVFVUVEOworCisgICAgICAgIG1lbXNldCgmcWJ1ZiwgMCwgc2l6ZW9mKHFidWYpKTsKKyAgICAgICAgcWJ1Zi50eXBlID0gVjRMMl9CVUZfVFlQRV9WSURFT19DQVBUVVJFX01QTEFORTsKKyAgICAgICAgcWJ1Zi5tZW1vcnkgPSBWNEwyX01FTU9SWV9NTUFQOworICAgICAgICBxYnVmLm0ucGxhbmVzID0gcGxhbmVzOworICAgICAgICBxYnVmLmxlbmd0aCA9IE1GQ19ERUNfTlVNX1BMQU5FUzsKKworICAgICAgICByZXQgPSBpb2N0bChwQ1RYLT5oTUZDLCBWSURJT0NfRFFCVUYsICZxYnVmKTsKKworICAgICAgICBpZiAocmV0ICE9IDApIHsKKyAgICAgICAgICAgIHBDVFgtPmRpc3BsYXlTdGF0dXMgPSBNRkNfR0VUT1VUQlVGX0RFQ09ESU5HX09OTFk7CisgICAgICAgICAgICBwQ1RYLT5kZWNPdXRJbmZvLmRpc3BfcGljX2ZyYW1lX3R5cGUgPSAtMTsKKyAgICAgICAgICAgIHJldHVybiBTc2JTaXBNZmNEZWNHZXRPdXRCdWYocENUWCwgb3V0cHV0X2luZm8pOzsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHBDVFgtPmRpc3BsYXlTdGF0dXMgPSBNRkNfR0VUT1VUQlVGX0RJU1BMQVlfREVDT0RJTkc7CisgICAgICAgIH0KKworICAgICAgICBwQ1RYLT5kZWNPdXRJbmZvLllWaXJBZGRyID0gcENUWC0+djRsMl9kZWMubWZjX2RzdF9idWZzW3FidWYuaW5kZXhdWzBdOworICAgICAgICBwQ1RYLT5kZWNPdXRJbmZvLkNWaXJBZGRyID0gcENUWC0+djRsMl9kZWMubWZjX2RzdF9idWZzW3FidWYuaW5kZXhdWzFdOworCisgICAgICAgIHBDVFgtPmRlY091dEluZm8uWVBoeUFkZHIgPSAodW5zaWduZWQgaW50KXBDVFgtPnY0bDJfZGVjLm1mY19kc3RfcGh5c1txYnVmLmluZGV4XVswXTsKKyAgICAgICAgcENUWC0+ZGVjT3V0SW5mby5DUGh5QWRkciA9ICh1bnNpZ25lZCBpbnQpcENUWC0+djRsMl9kZWMubWZjX2RzdF9waHlzW3FidWYuaW5kZXhdWzFdOworCisgICAgICAgIGlmIChTU0JTSVBfTUZDX0xBU1RfRlJBTUVfUkVDRUlWRUQgPT0gcENUWC0+bGFzdGZyYW1lKQorICAgICAgICAgICAgcENUWC0+bGFzdGZyYW1lID0gU1NCU0lQX01GQ19MQVNUX0ZSQU1FX1BST0NFU1NFRDsKKyAgICB9IGVsc2UgaWYgKHBDVFgtPnY0bDJfZGVjLmJCZWluZ0ZpbmFsaXplZCA9PSAwKSB7CisgICAgICAgIHBDVFgtPmxhc3RmcmFtZSA9IFNTQlNJUF9NRkNfTEFTVF9GUkFNRV9QUk9DRVNTRUQ7CisKKyAgICAgICAgcENUWC0+djRsMl9kZWMuYkJlaW5nRmluYWxpemVkID0gMTsgLyogdHJ1ZSAqLworCisgICAgICAgIG1lbXNldCgmcWJ1ZiwgMCwgc2l6ZW9mKHFidWYpKTsKKyAgICAgICAgcWJ1Zi50eXBlID0gVjRMMl9CVUZfVFlQRV9WSURFT19DQVBUVVJFX01QTEFORTsKKyAgICAgICAgcWJ1Zi5tZW1vcnkgPSBWNEwyX01FTU9SWV9NTUFQOworICAgICAgICBxYnVmLm0ucGxhbmVzID0gcGxhbmVzOworICAgICAgICBxYnVmLmxlbmd0aCA9IE1GQ19ERUNfTlVNX1BMQU5FUzsKKworICAgICAgICAvKiB3YWl0IGZvciBkZWNvZGluZyAqLworICAgICAgICBkbyB7CisgICAgICAgICAgICByZXQgPSBpb2N0bChwQ1RYLT5oTUZDLCBWSURJT0NfRFFCVUYsICZxYnVmKTsKKyAgICAgICAgfSB3aGlsZSAocmV0ICE9IDApOworCisgICAgICAgIHBDVFgtPmRpc3BsYXlTdGF0dXMgPSBNRkNfR0VUT1VUQlVGX0RJU1BMQVlfT05MWTsKKworICAgICAgICBwQ1RYLT5kZWNPdXRJbmZvLllWaXJBZGRyID0gcENUWC0+djRsMl9kZWMubWZjX2RzdF9idWZzW3FidWYuaW5kZXhdWzBdOworICAgICAgICBwQ1RYLT5kZWNPdXRJbmZvLkNWaXJBZGRyID0gcENUWC0+djRsMl9kZWMubWZjX2RzdF9idWZzW3FidWYuaW5kZXhdWzFdOworCisgICAgICAgIHBDVFgtPmRlY091dEluZm8uWVBoeUFkZHIgPSAodW5zaWduZWQgaW50KXBDVFgtPnY0bDJfZGVjLm1mY19kc3RfcGh5c1txYnVmLmluZGV4XVswXTsKKyAgICAgICAgcENUWC0+ZGVjT3V0SW5mby5DUGh5QWRkciA9ICh1bnNpZ25lZCBpbnQpcENUWC0+djRsMl9kZWMubWZjX2RzdF9waHlzW3FidWYuaW5kZXhdWzFdOworICAgIH0gZWxzZSB7CisgICAgICAgIG1lbXNldCgmcWJ1ZiwgMCwgc2l6ZW9mKHFidWYpKTsKKyAgICAgICAgcWJ1Zi50eXBlID0gVjRMMl9CVUZfVFlQRV9WSURFT19DQVBUVVJFX01QTEFORTsKKyAgICAgICAgcWJ1Zi5tZW1vcnkgPSBWNEwyX01FTU9SWV9NTUFQOworICAgICAgICBxYnVmLm0ucGxhbmVzID0gcGxhbmVzOworICAgICAgICBxYnVmLmxlbmd0aCA9IE1GQ19ERUNfTlVNX1BMQU5FUzsKKworICAgICAgICByZXQgPSBpb2N0bChwQ1RYLT5oTUZDLCBWSURJT0NfRFFCVUYsICZxYnVmKTsKKworICAgICAgICBpZiAocWJ1Zi5tLnBsYW5lc1swXS5ieXRlc3VzZWQgPT0gMCkgeworICAgICAgICAgICAgcENUWC0+ZGlzcGxheVN0YXR1cyA9IE1GQ19HRVRPVVRCVUZfRElTUExBWV9FTkQ7CisgICAgICAgICAgICBwQ1RYLT5kZWNPdXRJbmZvLmRpc3BfcGljX2ZyYW1lX3R5cGUgPSAtMTsKKyAgICAgICAgICAgIHJldHVybiBTc2JTaXBNZmNEZWNHZXRPdXRCdWYocENUWCwgb3V0cHV0X2luZm8pOzsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHBDVFgtPmRpc3BsYXlTdGF0dXMgPSBNRkNfR0VUT1VUQlVGX0RJU1BMQVlfT05MWTsKKyAgICAgICAgfQorCisgICAgICAgIHBDVFgtPmRlY091dEluZm8uWVZpckFkZHIgPSBwQ1RYLT52NGwyX2RlYy5tZmNfZHN0X2J1ZnNbcWJ1Zi5pbmRleF1bMF07CisgICAgICAgIHBDVFgtPmRlY091dEluZm8uQ1ZpckFkZHIgPSBwQ1RYLT52NGwyX2RlYy5tZmNfZHN0X2J1ZnNbcWJ1Zi5pbmRleF1bMV07CisKKyAgICAgICAgcENUWC0+ZGVjT3V0SW5mby5ZUGh5QWRkciA9ICh1bnNpZ25lZCBpbnQpcENUWC0+djRsMl9kZWMubWZjX2RzdF9waHlzW3FidWYuaW5kZXhdWzBdOworICAgICAgICBwQ1RYLT5kZWNPdXRJbmZvLkNQaHlBZGRyID0gKHVuc2lnbmVkIGludClwQ1RYLT52NGwyX2RlYy5tZmNfZHN0X3BoeXNbcWJ1Zi5pbmRleF1bMV07CisgICAgfQorCisgICAgcENUWC0+ZGVjT3V0SW5mby5kaXNwX3BpY19mcmFtZV90eXBlID0gKHFidWYuZmxhZ3MgJiAoMHg3IDw8IDMpKTsKKworICAgIHN3aXRjaCAocENUWC0+ZGVjT3V0SW5mby5kaXNwX3BpY19mcmFtZV90eXBlKSB7CisgICAgY2FzZSBWNEwyX0JVRl9GTEFHX0tFWUZSQU1FOgorICAgICAgICBwQ1RYLT5kZWNPdXRJbmZvLmRpc3BfcGljX2ZyYW1lX3R5cGUgPSAxOworICAgICAgICBicmVhazsKKyAgICBjYXNlIFY0TDJfQlVGX0ZMQUdfUEZSQU1FOgorICAgICAgICBwQ1RYLT5kZWNPdXRJbmZvLmRpc3BfcGljX2ZyYW1lX3R5cGUgPSAyOworICAgICAgICBicmVhazsKKyAgICBjYXNlIFY0TDJfQlVGX0ZMQUdfQkZSQU1FOgorICAgICAgICBwQ1RYLT5kZWNPdXRJbmZvLmRpc3BfcGljX2ZyYW1lX3R5cGUgPSAzOworICAgICAgICBicmVhazsKKyAgICBkZWZhdWx0OgorICAgICAgICBwQ1RYLT5kZWNPdXRJbmZvLmRpc3BfcGljX2ZyYW1lX3R5cGUgPSAwOworICAgICAgICBicmVhazsKKyAgICB9CisKKyAgICByZXQgPSBpb2N0bChwQ1RYLT5oTUZDLCBWSURJT0NfUUJVRiwgJnFidWYpOworCisgICAgcmV0dXJuIFNzYlNpcE1mY0RlY0dldE91dEJ1ZihwQ1RYLCBvdXRwdXRfaW5mbyk7Cit9CisjZW5kaWYKKwordm9pZCAgKlNzYlNpcE1mY0RlY0dldEluQnVmKHZvaWQgKm9wZW5IYW5kbGUsIHZvaWQgKipwaHlJbkJ1ZiwgaW50IGlucHV0QnVmZmVyU2l6ZSkKK3sKKyAgICBfTUZDTElCICpwQ1RYOworICAgIGludCBpOworCisgICAgaWYgKG9wZW5IYW5kbGUgPT0gTlVMTCkgeworICAgICAgICBMT0dFKCJbJXNdIG9wZW5IYW5kbGUgaXMgTlVMTCIsX19mdW5jX18pOworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisKKyAgICBpZiAoKGlucHV0QnVmZmVyU2l6ZSA8IDApIHx8IChpbnB1dEJ1ZmZlclNpemUgPiBNQVhfREVDT0RFUl9JTlBVVF9CVUZGRVJfU0laRSkpIHsKKyAgICAgICAgTE9HRSgiWyVzXSBpbnB1dEJ1ZmZlclNpemUgPSAlZCBpcyBpbnZhbGlkIixfX2Z1bmNfXywgaW5wdXRCdWZmZXJTaXplKTsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorCisgICAgcENUWCAgPSAoX01GQ0xJQiAqKSBvcGVuSGFuZGxlOworCisgICAgZm9yIChpID0gMDsgaSA8IE1GQ19ERUNfTlVNX1NSQ19CVUZTOyBpKyspCisgICAgICAgIGlmIChCVUZfREVRVUVVRUQgPT0gcENUWC0+djRsMl9kZWMubWZjX3NyY19idWZfZmxhZ3NbaV0pCisgICAgICAgICAgICBicmVhazsKKworICAgIGlmIChpID09IE1GQ19ERUNfTlVNX1NSQ19CVUZTKSB7CisgICAgICAgIExPR1YoIlslc10gTm8gYnVmZmVyIGlzIGF2YWlsYWJsZS4iLF9fZnVuY19fKTsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfSBlbHNlIHsKKyAgICAgICAgcENUWC0+dmlyU3RybUJ1ZiA9ICh1bnNpZ25lZCBpbnQpcENUWC0+djRsMl9kZWMubWZjX3NyY19idWZzW2ldOworICAgICAgICAvKiBTZXQgdGhlIGJ1ZmZlciBmbGFnIGFzIEVucXVldWVkIGZvciBOQl9tb2RlX3Byb2Nlc3MqLworICAgICAgICAvKiBGSVhNRTogQ2hlY2sgdGhpcyBhc3NpZ25tZW50IGluIGNhc2Ugb2YgdXNpbmcgTmV3IEFQSSBFeGVOYigpICovCisgICAgICAgIHBDVFgtPnY0bDJfZGVjLm1mY19zcmNfYnVmX2ZsYWdzW2ldID0gQlVGX0VOUVVFVUVEOworICAgIH0KKworICAgIHJldHVybiAodm9pZCAqKXBDVFgtPnZpclN0cm1CdWY7Cit9CisKK1NTQlNJUF9NRkNfRVJST1JfQ09ERSBTc2JTaXBNZmNEZWNTZXRJbkJ1Zih2b2lkICpvcGVuSGFuZGxlLCB2b2lkICpwaHlJbkJ1Ziwgdm9pZCAqdmlySW5CdWYsIGludCBzaXplKQoreworICAgIF9NRkNMSUIgKnBDVFg7CisgICAgaW50IGk7CisKKyAgICBMT0dWKCJbJXNdIEVudGVyIixfX2Z1bmNfXyk7CisgICAgaWYgKG9wZW5IYW5kbGUgPT0gTlVMTCkgeworICAgICAgICBMT0dFKCJbJXNdIG9wZW5IYW5kbGUgaXMgTlVMTCIsX19mdW5jX18pOworICAgICAgICByZXR1cm4gTUZDX1JFVF9JTlZBTElEX1BBUkFNOworICAgIH0KKworICAgIHBDVFggID0gKF9NRkNMSUIgKikgb3BlbkhhbmRsZTsKKworICAgIGZvciAoaSA9IDA7IGk8TUZDX0RFQ19OVU1fU1JDX0JVRlM7IGkrKykKKyAgICAgICAgaWYgKHBDVFgtPnY0bDJfZGVjLm1mY19zcmNfYnVmc1tpXSA9PSB2aXJJbkJ1ZikKKyAgICAgICAgICAgIGJyZWFrOworCisgICAgaWYgKGkgPT0gTUZDX0RFQ19OVU1fU1JDX0JVRlMpIHsKKyAgICAgICAgTE9HRSgiWyVzXSBDYW4gbm90IHVzZSB0aGUgYnVmZmVyIixfX2Z1bmNfXyk7CisgICAgICAgIHJldHVybiBNRkNfUkVUX0lOVkFMSURfUEFSQU07CisgICAgfSBlbHNlIHsKKyAgICAgICAgcENUWC0+dmlyU3RybUJ1ZiA9ICh1bnNpZ25lZCBpbnQpdmlySW5CdWY7CisgICAgICAgIHBDVFgtPnY0bDJfZGVjLmJlaW5nVXNlZEluZGV4ID0gaTsKKyAgICAgICAgcENUWC0+djRsMl9kZWMubWZjX3NyY19idWZfZmxhZ3NbaV0gPSBCVUZfRU5RVUVVRUQ7CisgICAgfQorICAgIExPR1YoIlslc10gRXhpdCBpZHggJWQiLF9fZnVuY19fLHBDVFgtPnY0bDJfZGVjLmJlaW5nVXNlZEluZGV4KTsKKyAgICByZXR1cm4gTUZDX1JFVF9PSzsKK30KKworU1NCU0lQX01GQ19ERUNfT1VUQlVGX1NUQVRVUyBTc2JTaXBNZmNEZWNHZXRPdXRCdWYodm9pZCAqb3BlbkhhbmRsZSwgU1NCU0lQX01GQ19ERUNfT1VUUFVUX0lORk8gKm91dHB1dF9pbmZvKQoreworICAgIGludCByZXQ7CisgICAgX01GQ0xJQiAqcENUWDsKKworICAgIGlmIChvcGVuSGFuZGxlID09IE5VTEwpIHsKKyAgICAgICAgTE9HRSgiWyVzXSBvcGVuSGFuZGxlIGlzIE5VTEwiLF9fZnVuY19fKTsKKyAgICAgICAgcmV0dXJuIE1GQ19HRVRPVVRCVUZfRElTUExBWV9FTkQ7CisgICAgfQorCisgICAgcENUWCAgPSAoX01GQ0xJQiAqKSBvcGVuSGFuZGxlOworCisgICAgb3V0cHV0X2luZm8tPllQaHlBZGRyID0gcENUWC0+ZGVjT3V0SW5mby5ZUGh5QWRkcjsKKyAgICBvdXRwdXRfaW5mby0+Q1BoeUFkZHIgPSBwQ1RYLT5kZWNPdXRJbmZvLkNQaHlBZGRyOworCisgICAgb3V0cHV0X2luZm8tPllWaXJBZGRyID0gcENUWC0+ZGVjT3V0SW5mby5ZVmlyQWRkcjsKKyAgICBvdXRwdXRfaW5mby0+Q1ZpckFkZHIgPSBwQ1RYLT5kZWNPdXRJbmZvLkNWaXJBZGRyOworCisgICAgb3V0cHV0X2luZm8tPmltZ193aWR0aCA9IHBDVFgtPmRlY091dEluZm8uaW1nX3dpZHRoOworICAgIG91dHB1dF9pbmZvLT5pbWdfaGVpZ2h0PSBwQ1RYLT5kZWNPdXRJbmZvLmltZ19oZWlnaHQ7CisKKyAgICBvdXRwdXRfaW5mby0+YnVmX3dpZHRoID0gcENUWC0+ZGVjT3V0SW5mby5idWZfd2lkdGg7CisgICAgb3V0cHV0X2luZm8tPmJ1Zl9oZWlnaHQ9IHBDVFgtPmRlY091dEluZm8uYnVmX2hlaWdodDsKKworICAgIG91dHB1dF9pbmZvLT5jcm9wX3JpZ2h0X29mZnNldCA9ICBwQ1RYLT5kZWNPdXRJbmZvLmNyb3BfcmlnaHRfb2Zmc2V0OworICAgIG91dHB1dF9pbmZvLT5jcm9wX2xlZnRfb2Zmc2V0ID0gIHBDVFgtPmRlY091dEluZm8uY3JvcF9sZWZ0X29mZnNldDsKKyAgICBvdXRwdXRfaW5mby0+Y3JvcF9ib3R0b21fb2Zmc2V0ID0gcENUWC0+ZGVjT3V0SW5mby5jcm9wX2JvdHRvbV9vZmZzZXQ7CisgICAgb3V0cHV0X2luZm8tPmNyb3BfdG9wX29mZnNldCA9IHBDVFgtPmRlY091dEluZm8uY3JvcF90b3Bfb2Zmc2V0OworCisgICAgb3V0cHV0X2luZm8tPmRpc3BfcGljX2ZyYW1lX3R5cGUgPSBwQ1RYLT5kZWNPdXRJbmZvLmRpc3BfcGljX2ZyYW1lX3R5cGU7CisKKyAgICBzd2l0Y2ggKHBDVFgtPmRpc3BsYXlTdGF0dXMpIHsKKyAgICBjYXNlIE1GQ19HRVRPVVRCVUZfRElTUExBWV9PTkxZOgorICAgIGNhc2UgTUZDX0dFVE9VVEJVRl9ESVNQTEFZX0RFQ09ESU5HOgorICAgIGNhc2UgTUZDX0dFVE9VVEJVRl9ESVNQTEFZX0VORDoKKyNpZmRlZiBTU0JfVU1QCisgICAgICAgIHJldCA9IHVtcF9zZWN1cmVfaWRfZ2V0X2Zyb21fdmFkZHIocENUWC0+ZGVjT3V0SW5mby5ZVmlyQWRkciwgJm91dHB1dF9pbmZvLT55X2Nvb2tpZSk7CisgICAgICAgIGlmIChyZXQpIHsKKyAgICAgICAgICAgIExPR1YoIlslc10gZmFpbCB0byBnZXQgc2VjdXJlIGlkKCVkKSBmcm9tIHZhZGRyKCV4KVxuIixfX2Z1bmNfXywgXAorICAgICAgICAgICAgb3V0cHV0X2luZm8tPnlfY29va2llLCBwQ1RYLT5kZWNPdXRJbmZvLllWaXJBZGRyKTsKKyAgICAgICAgfQorCisgICAgICAgIHJldCA9IHVtcF9zZWN1cmVfaWRfZ2V0X2Zyb21fdmFkZHIocENUWC0+ZGVjT3V0SW5mby5DVmlyQWRkciwgJm91dHB1dF9pbmZvLT5jX2Nvb2tpZSk7CisgICAgICAgIGlmIChyZXQpIHsKKyAgICAgICAgICAgIExPR1YoIlslc10gZmFpbCB0byBnZXQgc2VjdXJlIGlkKCVkKSBmcm9tIHZhZGRyKCV4KVxuIixfX2Z1bmNfXywgXAorICAgICAgICAgICAgb3V0cHV0X2luZm8tPmNfY29va2llLCBwQ1RYLT5kZWNPdXRJbmZvLkNWaXJBZGRyKTsKKyAgICAgICAgfQorICAgICAgICBicmVhazsKKyNlbmRpZgorICAgIGNhc2UgTUZDX0dFVE9VVEJVRl9ERUNPRElOR19PTkxZOgorICAgIGNhc2UgTUZDX0dFVE9VVEJVRl9DSEFOR0VfUkVTT0w6CisgICAgICAgIGJyZWFrOworICAgIGRlZmF1bHQ6CisgICAgICAgIHJldHVybiBNRkNfR0VUT1VUQlVGX0RJU1BMQVlfRU5EOworICAgIH0KKworICAgIHJldHVybiBwQ1RYLT5kaXNwbGF5U3RhdHVzOworfQorCitTU0JTSVBfTUZDX0VSUk9SX0NPREUgU3NiU2lwTWZjRGVjU2V0Q29uZmlnKHZvaWQgKm9wZW5IYW5kbGUsIFNTQlNJUF9NRkNfREVDX0NPTkYgY29uZl90eXBlLCB2b2lkICp2YWx1ZSkKK3sKKyAgICBpbnQgcmV0LCBpOworCisgICAgX01GQ0xJQiAqcENUWDsKKyAgICBzdHJ1Y3QgbWZjX2RlY19maW12MV9pbmZvICpmaW12MV9yZXM7CisKKyAgICBzdHJ1Y3QgdjRsMl9idWZmZXIgcWJ1ZjsKKyAgICBzdHJ1Y3QgdjRsMl9wbGFuZSBwbGFuZXNbTUZDX0RFQ19OVU1fUExBTkVTXTsKKyAgICBzdHJ1Y3QgdjRsMl9jb250cm9sIGN0cmw7CisKKyAgICBlbnVtIHY0bDJfYnVmX3R5cGUgdHlwZTsKKworICAgIGlmIChvcGVuSGFuZGxlID09IE5VTEwpIHsKKyAgICAgICAgTE9HRSgiWyVzXSBvcGVuSGFuZGxlIGlzIE5VTEwiLF9fZnVuY19fKTsKKyAgICAgICAgcmV0dXJuIE1GQ19SRVRfSU5WQUxJRF9QQVJBTTsKKyAgICB9CisKKyAgICBpZiAoKHZhbHVlID09IE5VTEwpICYmIChNRkNfREVDX1NFVENPTkZfSVNfTEFTVF9GUkFNRSAhPWNvbmZfdHlwZSkpIHsKKyAgICAgICAgTE9HRSgiWyVzXSB2YWx1ZSBpcyBOVUxMIixfX2Z1bmNfXyk7CisgICAgICAgIHJldHVybiBNRkNfUkVUX0lOVkFMSURfUEFSQU07CisgICAgfQorCisgICAgcENUWCA9IChfTUZDTElCICopIG9wZW5IYW5kbGU7CisKKyAgICAvKiBGaXJzdCwgcHJvY2VzcyBub24taW9jdGwgY2FsbGluZyBzZXR0aW5ncyAqLworICAgIHN3aXRjaCAoY29uZl90eXBlKSB7CisgICAgY2FzZSBNRkNfREVDX1NFVENPTkZfRVhUUkFfQlVGRkVSX05VTToKKyAgICAgICAgcENUWC0+ZGVjX251bWV4dHJhZHBiID0gKigodW5zaWduZWQgaW50ICopIHZhbHVlKTsKKyAgICAgICAgcmV0dXJuIE1GQ19SRVRfT0s7CisKKyAgICBjYXNlIE1GQ19ERUNfU0VUQ09ORl9GSU1WMV9XSURUSF9IRUlHSFQ6IC8qIGJlIHNldCBiZWZvcmUgY2FsbGluZyBTc2JTaXBNZmNEZWNJbml0ICovCisgICAgICAgICBmaW12MV9yZXMgPSAoc3RydWN0IG1mY19kZWNfZmltdjFfaW5mbyAqKXZhbHVlOworICAgICAgICAgTE9HSSgiZmltdjEtPndpZHRoICA9ICVkXG4iLCBmaW12MV9yZXMtPndpZHRoKTsKKyAgICAgICAgIExPR0koImZpbXYxLT5oZWlnaHQgPSAlZFxuIiwgZmltdjFfcmVzLT5oZWlnaHQpOworICAgICAgICAgcENUWC0+ZmltdjFfcmVzLndpZHRoICA9IChpbnQpKGZpbXYxX3Jlcy0+d2lkdGgpOworICAgICAgICAgcENUWC0+ZmltdjFfcmVzLmhlaWdodCA9IChpbnQpKGZpbXYxX3Jlcy0+aGVpZ2h0KTsKKyAgICAgICAgIHJldHVybiBNRkNfUkVUX09LOworCisgICAgY2FzZSBNRkNfREVDX1NFVENPTkZfSVNfTEFTVF9GUkFNRToKKyAgICAgICAgaWYgKFNTQlNJUF9NRkNfTEFTVF9GUkFNRV9QUk9DRVNTRUQgIT0gcENUWC0+bGFzdGZyYW1lKSB7CisgICAgICAgICAgICBwQ1RYLT5sYXN0ZnJhbWUgPSBTU0JTSVBfTUZDX0xBU1RfRlJBTUVfUkVDRUlWRUQ7CisgICAgICAgICAgICByZXR1cm4gTUZDX1JFVF9PSzsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHJldHVybiBNRkNfUkVUX0ZBSUw7CisgICAgICAgIH0KKworICAgIGNhc2UgTUZDX0RFQ19TRVRDT05GX0RQQl9GTFVTSDoKKyAgICAgICAgdHlwZSA9IFY0TDJfQlVGX1RZUEVfVklERU9fQ0FQVFVSRV9NUExBTkU7CisgICAgICAgIHJldCA9IGlvY3RsKHBDVFgtPmhNRkMsIFZJRElPQ19TVFJFQU1PRkYsICZ0eXBlKTsKKyAgICAgICAgaWYgKHJldCAhPSAwKSB7CisgICAgICAgICAgICBMT0dFKCJbJXNdIFZJRElPQ19TVFJFQU1PRkYgZmFpbGVkIChkZXN0aW5hdGlvbiBidWZmZXJzKSIsX19mdW5jX18pOworICAgICAgICAgICAgcmV0dXJuIE1GQ19SRVRfREVDX1NFVF9DT05GX0ZBSUw7CisgICAgICAgIH0KKyAgICAgICAgcENUWC0+aW50ZXJfYnVmZl9zdGF0dXMgJj0gfihNRkNfVVNFX0RTVF9TVFJFQU1PTik7CisKKyAgICAgICAgZm9yIChpID0gMDsgIGkgPCBwQ1RYLT52NGwyX2RlYy5tZmNfbnVtX2RzdF9idWZzOyArK2kpIHsKKyAgICAgICAgICAgIG1lbXNldCgmcWJ1ZiwgMCwgc2l6ZW9mKHFidWYpKTsKKworICAgICAgICAgICAgcWJ1Zi50eXBlID0gVjRMMl9CVUZfVFlQRV9WSURFT19DQVBUVVJFX01QTEFORTsKKyAgICAgICAgICAgIHFidWYubWVtb3J5ID0gVjRMMl9NRU1PUllfTU1BUDsKKyAgICAgICAgICAgIHFidWYuaW5kZXggPSBpOworICAgICAgICAgICAgcWJ1Zi5tLnBsYW5lcyA9IHBsYW5lczsKKyAgICAgICAgICAgIHFidWYubGVuZ3RoID0gMjsKKworICAgICAgICAgICAgcmV0ID0gaW9jdGwocENUWC0+aE1GQywgVklESU9DX1FCVUYsICZxYnVmKTsKKyAgICAgICAgICAgIGlmIChyZXQgIT0gMCkgeworICAgICAgICAgICAgICAgIExPR0UoIlslc10gVklESU9DX1FCVUYgZmFpbGVkLCBWNEwyX0JVRl9UWVBFX1ZJREVPX0NBUFRVUkVfTVBMQU5FIixfX2Z1bmNfXyk7CisgICAgICAgICAgICAgICAgcmV0dXJuIE1GQ19SRVRfREVDX1NFVF9DT05GX0ZBSUw7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICB0eXBlID0gVjRMMl9CVUZfVFlQRV9WSURFT19DQVBUVVJFX01QTEFORTsKKyAgICAgICAgcmV0ID0gaW9jdGwocENUWC0+aE1GQywgVklESU9DX1NUUkVBTU9OLCAmdHlwZSk7CisgICAgICAgIGlmIChyZXQgIT0gMCkgeworICAgICAgICAgICAgTE9HRSgiWyVzXSBWSURJT0NfU1RSRUFNT04gZmFpbGVkIChkZXN0aW5hdGlvbiBidWZmZXJzKSIsX19mdW5jX18pOworICAgICAgICAgICAgcmV0dXJuIE1GQ19SRVRfREVDX1NFVF9DT05GX0ZBSUw7CisgICAgICAgIH0KKyAgICAgICAgcENUWC0+aW50ZXJfYnVmZl9zdGF0dXMgfD0gTUZDX1VTRV9EU1RfU1RSRUFNT047CisgICAgICAgIHJldHVybiBNRkNfUkVUX09LOworICAgIGRlZmF1bHQ6CisgICAgICAgIC8qIE90aGVycyB3aWxsIGJlIHByb2Nlc3NlZCBuZXh0ICovCisgICAgICAgIGJyZWFrOworICAgIH0KKworICAgIC8qIFByb2Nlc3MgaW9jdGwgY2FsbGluZyBzZXR0aW5ncyAqLworICAgIG1lbXNldCgmY3RybCwgMCwgc2l6ZW9mKGN0cmwpKTsKKyAgICBzd2l0Y2ggKGNvbmZfdHlwZSkgeworICAgIGNhc2UgTUZDX0RFQ19TRVRDT05GX0RJU1BMQVlfREVMQVk6IC8qIGJlIHNldCBiZWZvcmUgY2FsbGluZyBTc2JTaXBNZmNEZWNJbml0ICovCisgICAgICAgIGN0cmwuaWQgPSBWNEwyX0NJRF9DT0RFQ19ESVNQTEFZX0RFTEFZOworICAgICAgICBjdHJsLnZhbHVlID0gKigodW5zaWduZWQgaW50ICopIHZhbHVlKTsKKyAgICAgICAgYnJlYWs7CisKKyAgICBjYXNlIE1GQ19ERUNfU0VUQ09ORl9DUkNfRU5BQkxFOgorICAgICAgICBjdHJsLmlkID0gVjRMMl9DSURfQ09ERUNfQ1JDX0VOQUJMRTsKKyAgICAgICAgY3RybC52YWx1ZSA9IDE7CisgICAgICAgIGJyZWFrOworCisgICAgY2FzZSBNRkNfREVDX1NFVENPTkZfU0xJQ0VfRU5BQkxFOgorICAgICAgICBjdHJsLmlkID0gVjRMMl9DSURfQ09ERUNfU0xJQ0VfSU5URVJGQUNFOworICAgICAgICBjdHJsLnZhbHVlID0gMTsKKyAgICAgICAgYnJlYWs7CisKKyAgICBjYXNlIE1GQ19ERUNfU0VUQ09ORl9GUkFNRV9UQUc6IC8qYmUgc2V0IGJlZm9yZSBjYWxsaW5nIFNzYlNpcE1mY0RlY0V4ZSAqLworICAgICAgICBjdHJsLmlkID0gVjRMMl9DSURfQ09ERUNfRlJBTUVfVEFHOworICAgICAgICBjdHJsLnZhbHVlID0gKigodW5zaWduZWQgaW50Kil2YWx1ZSk7CisgICAgICAgIGJyZWFrOworCisgICAgY2FzZSBNRkNfREVDX1NFVENPTkZfUE9TVF9FTkFCTEU6CisgICAgICAgIGN0cmwuaWQgPSBWNEwyX0NJRF9DT0RFQ19MT09QX0ZJTFRFUl9NUEVHNF9FTkFCTEU7CisgICAgICAgIGN0cmwudmFsdWUgPSAqKCh1bnNpZ25lZCBpbnQqKXZhbHVlKTsKKyAgICAgICAgYnJlYWs7CisKKyAgICBkZWZhdWx0OgorICAgICAgICBMT0dFKCJbJXNdIGNvbmZfdHlwZSglZCkgaXMgTk9UIHN1cHBvcnRlZCIsX19mdW5jX18sIGNvbmZfdHlwZSk7CisgICAgICAgIHJldHVybiBNRkNfUkVUX0lOVkFMSURfUEFSQU07CisgICAgfQorCisgICAgcmV0ID0gaW9jdGwocENUWC0+aE1GQywgVklESU9DX1NfQ1RSTCwgJmN0cmwpOworICAgIGlmIChyZXQgIT0gMCkgeworICAgICAgICBMT0dFKCJbJXNdIFZJRElPQ19TX0NUUkwgZmFpbGVkIChjb25mX3R5cGUgPSAlZCkiLF9fZnVuY19fLCBjb25mX3R5cGUpOworICAgICAgICByZXR1cm4gTUZDX1JFVF9ERUNfU0VUX0NPTkZfRkFJTDsKKyAgICB9CisKKyAgICByZXR1cm4gTUZDX1JFVF9PSzsKK30KKworU1NCU0lQX01GQ19FUlJPUl9DT0RFIFNzYlNpcE1mY0RlY0dldENvbmZpZyh2b2lkICpvcGVuSGFuZGxlLCBTU0JTSVBfTUZDX0RFQ19DT05GIGNvbmZfdHlwZSwgdm9pZCAqdmFsdWUpCit7CisgICAgX01GQ0xJQiAqcENUWDsKKworICAgIFNTQlNJUF9NRkNfSU1HX1JFU09MVVRJT04gKmltZ19yZXNvbHV0aW9uOworICAgIGludCByZXQ7CisgICAgU1NCU0lQX01GQ19DUkNfREFUQSAqY3JjX2RhdGE7CisgICAgU1NCU0lQX01GQ19DUk9QX0lORk9STUFUSU9OICpjcm9wX2luZm9ybWF0aW9uOworICAgIHN0cnVjdCB2NGwyX2NvbnRyb2wgY3RybDsKKworICAgIGlmIChvcGVuSGFuZGxlID09IE5VTEwpIHsKKyAgICAgICAgTE9HRSgiWyVzXSBvcGVuSGFuZGxlIGlzIE5VTEwiLF9fZnVuY19fKTsKKyAgICAgICAgcmV0dXJuIE1GQ19SRVRfSU5WQUxJRF9QQVJBTTsKKyAgICB9CisKKyAgICBpZiAodmFsdWUgPT0gTlVMTCkgeworICAgICAgICBMT0dFKCJbJXNdIHZhbHVlIGlzIE5VTEwiLF9fZnVuY19fKTsKKyAgICAgICAgcmV0dXJuIE1GQ19SRVRfSU5WQUxJRF9QQVJBTTsKKyAgICB9CisKKyAgICBwQ1RYID0gKF9NRkNMSUIgKikgb3BlbkhhbmRsZTsKKworICAgIHN3aXRjaCAoY29uZl90eXBlKSB7CisgICAgY2FzZSBNRkNfREVDX0dFVENPTkZfQlVGX1dJRFRIX0hFSUdIVDoKKyAgICAgICAgaW1nX3Jlc29sdXRpb24gPSAoU1NCU0lQX01GQ19JTUdfUkVTT0xVVElPTiAqKXZhbHVlOworICAgICAgICBpbWdfcmVzb2x1dGlvbi0+d2lkdGggPSBwQ1RYLT5kZWNPdXRJbmZvLmltZ193aWR0aDsKKyAgICAgICAgaW1nX3Jlc29sdXRpb24tPmhlaWdodCA9IHBDVFgtPmRlY091dEluZm8uaW1nX2hlaWdodDsKKyAgICAgICAgaW1nX3Jlc29sdXRpb24tPmJ1Zl93aWR0aCA9IHBDVFgtPmRlY091dEluZm8uYnVmX3dpZHRoOworICAgICAgICBpbWdfcmVzb2x1dGlvbi0+YnVmX2hlaWdodCA9IHBDVFgtPmRlY091dEluZm8uYnVmX2hlaWdodDsKKyAgICAgICAgYnJlYWs7CisKKyAgICBjYXNlIE1GQ19ERUNfR0VUQ09ORl9DUkNfREFUQToKKyAgICAgICAgY3JjX2RhdGEgPSAoU1NCU0lQX01GQ19DUkNfREFUQSAqKSB2YWx1ZTsKKworICAgICAgICBjdHJsLmlkID0gVjRMMl9DSURfQ09ERUNfQ1JDX0RBVEFfTFVNQTsKKyAgICAgICAgY3RybC52YWx1ZSA9IDA7CisKKyAgICAgICAgcmV0ID0gaW9jdGwocENUWC0+aE1GQywgVklESU9DX0dfQ1RSTCwgJmN0cmwpOworICAgICAgICBpZiAocmV0ICE9IDApIHsKKyAgICAgICAgICAgIExPR0UoIlslc10gVklESU9DX0dfQ1RSTCBmYWlsZWQsIFY0TDJfQ0lEX0NPREVDX0NSQ19EQVRBX0xVTUEiLF9fZnVuY19fKTsKKyAgICAgICAgICAgIHJldHVybiBNRkNfUkVUX0RFQ19HRVRfQ09ORl9GQUlMOworICAgICAgICB9CisgICAgICAgIGNyY19kYXRhLT5sdW1hMCA9IGN0cmwudmFsdWU7CisKKyAgICAgICAgY3RybC5pZCA9IFY0TDJfQ0lEX0NPREVDX0NSQ19EQVRBX0NIUk9NQTsKKyAgICAgICAgY3RybC52YWx1ZSA9IDA7CisKKyAgICAgICAgcmV0ID0gaW9jdGwocENUWC0+aE1GQywgVklESU9DX0dfQ1RSTCwgJmN0cmwpOworICAgICAgICBpZiAocmV0ICE9IDApIHsKKyAgICAgICAgICAgIExPR0UoIlslc10gVklESU9DX0dfQ1RSTCBmYWlsZWQsIFY0TDJfQ0lEX0NPREVDX0NSQ19EQVRBX0NIUk9NQSIsX19mdW5jX18pOworICAgICAgICAgICAgcmV0dXJuIE1GQ19SRVRfREVDX0dFVF9DT05GX0ZBSUw7CisgICAgICAgIH0KKyAgICAgICAgY3JjX2RhdGEtPmNocm9tYTAgPSBjdHJsLnZhbHVlOworCisgICAgICAgIExPR0koIlslc10gY3JjX2RhdGEtPmx1bWEwPSVkIixfX2Z1bmNfXyxjdHJsLnZhbHVlKTsKKyAgICAgICAgTE9HSSgiWyVzXSBjcmNfZGF0YS0+Y2hyb21hMD0lZCIsX19mdW5jX18sY3RybC52YWx1ZSk7CisgICAgICAgIGJyZWFrOworCisgICAgY2FzZSBNRkNfREVDX0dFVENPTkZfRlJBTUVfVEFHOgorICAgICAgICBjdHJsLmlkID0gVjRMMl9DSURfQ09ERUNfRlJBTUVfVEFHOworICAgICAgICBjdHJsLnZhbHVlID0gMDsKKworICAgICAgICByZXQgPSBpb2N0bChwQ1RYLT5oTUZDLCBWSURJT0NfR19DVFJMLCAmY3RybCk7CisgICAgICAgIGlmIChyZXQgIT0gMCkgeworICAgICAgICAgICAgcHJpbnRmKCJFcnJvciB0byBkbyBnX2N0cmwuXG4iKTsKKyAgICAgICAgfQorICAgICAgICAqKCh1bnNpZ25lZCBpbnQgKil2YWx1ZSkgPSBjdHJsLnZhbHVlOworICAgICAgICBicmVhazsKKworICAgIGNhc2UgTUZDX0RFQ19HRVRDT05GX0NST1BfSU5GTzoKKyAgICAgICAgY3JvcF9pbmZvcm1hdGlvbiA9IChTU0JTSVBfTUZDX0NST1BfSU5GT1JNQVRJT04gKil2YWx1ZTsKKyAgICAgICAgY3JvcF9pbmZvcm1hdGlvbi0+Y3JvcF90b3Bfb2Zmc2V0ID0gcENUWC0+ZGVjT3V0SW5mby5jcm9wX3RvcF9vZmZzZXQ7CisgICAgICAgIGNyb3BfaW5mb3JtYXRpb24tPmNyb3BfYm90dG9tX29mZnNldCA9IHBDVFgtPmRlY091dEluZm8uY3JvcF9ib3R0b21fb2Zmc2V0OworICAgICAgICBjcm9wX2luZm9ybWF0aW9uLT5jcm9wX2xlZnRfb2Zmc2V0ID0gcENUWC0+ZGVjT3V0SW5mby5jcm9wX2xlZnRfb2Zmc2V0OworICAgICAgICBjcm9wX2luZm9ybWF0aW9uLT5jcm9wX3JpZ2h0X29mZnNldCA9IHBDVFgtPmRlY091dEluZm8uY3JvcF9yaWdodF9vZmZzZXQ7CisgICAgICAgIGJyZWFrOworCisgICAgZGVmYXVsdDoKKyAgICAgICAgTE9HRSgiWyVzXSBjb25mX3R5cGUoJWQpIGlzIE5PVCBzdXBwb3J0ZWQiLF9fZnVuY19fLCBjb25mX3R5cGUpOworICAgICAgICByZXR1cm4gTUZDX1JFVF9JTlZBTElEX1BBUkFNOworICAgIH0KKworICAgIHJldHVybiBNRkNfUkVUX09LOworfQpkaWZmIC0tZ2l0IGEvZXh5bm9zNC9tdWx0aW1lZGlhL2NvZGVjcy9zZWNfY29kZWNzL3ZpZGVvL2V4eW5vczQvbWZjX3Y0bDIvZW5jL3NyYy9Tc2JTaXBNZmNFbmNBUEkuYyBiL2V4eW5vczQvbXVsdGltZWRpYS9jb2RlY3Mvc2VjX2NvZGVjcy92aWRlby9leHlub3M0L21mY192NGwyL2VuYy9zcmMvU3NiU2lwTWZjRW5jQVBJLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDU4ODhjNgotLS0gL2Rldi9udWxsCisrKyBiL2V4eW5vczQvbXVsdGltZWRpYS9jb2RlY3Mvc2VjX2NvZGVjcy92aWRlby9leHlub3M0L21mY192NGwyL2VuYy9zcmMvU3NiU2lwTWZjRW5jQVBJLmMKQEAgLTAsMCArMSwxMjA2IEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDEwIFNhbXN1bmcgRWxlY3Ryb25pY3MgQ28uLCBMdGQuCisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgPHN0ZGxpYi5oPgorI2luY2x1ZGUgPHVuaXN0ZC5oPgorI2luY2x1ZGUgPHN0cmluZy5oPgorI2luY2x1ZGUgPGZjbnRsLmg+CisKKyNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KKyNpbmNsdWRlIDxzeXMvc3RhdC5oPgorI2luY2x1ZGUgPHN5cy9pb2N0bC5oPgorI2luY2x1ZGUgPHN5cy9tbWFuLmg+CisKKyNpbmNsdWRlIDxzeXMvcG9sbC5oPgorI2luY2x1ZGUgInZpZGVvZGV2Mi5oIgorCisjaW5jbHVkZSAibWZjX2ludGVyZmFjZS5oIgorI2luY2x1ZGUgIlNzYlNpcE1mY0FwaS5oIgorCisvKiAjZGVmaW5lIExPR19OREVCVUcgMCAqLworI2RlZmluZSBMT0dfVEFHICJNRkNfRU5DX0FQUCIKKyNpbmNsdWRlIDx1dGlscy9Mb2cuaD4KKworI2RlZmluZSBQT0xMX0VOQ19XQUlUX1RJTUVPVVQgMjUKKworI2lmbmRlZiB0cnVlCisjZGVmaW5lIHRydWUgICgxKQorI2VuZGlmCisKKyNpZm5kZWYgZmFsc2UKKyNkZWZpbmUgZmFsc2UgKDApCisjZW5kaWYKKworI2RlZmluZSBNQVhfU1RSRUFNX1NJWkUgKDIqMTAyNCoxMDI0KQorCitzdGF0aWMgY2hhciAqbWZjX2Rldl9uYW1lID0gU0FNU1VOR19NRkNfREVWX05BTUU7CitzdGF0aWMgaW50IG1mY19kZXZfbm9kZSA9IDc7CisKK3N0YXRpYyB2b2lkIGdldE1GQ05hbWUoY2hhciAqZGV2aWNlbmFtZSwgaW50IHNpemUpCit7CisgICAgc25wcmludGYoZGV2aWNlbmFtZSwgc2l6ZSwgIiVzJWQiLCBTQU1TVU5HX01GQ19ERVZfTkFNRSwgbWZjX2Rldl9ub2RlKTsKK30KKwordm9pZCBTc2JTaXBNZmNFbmNTZXRNRkNOYW1lKGNoYXIgKmRldmljZW5hbWUpCit7CisgICAgbWZjX2Rldl9uYW1lID0gZGV2aWNlbmFtZTsKK30KKwordm9pZCAqU3NiU2lwTWZjRW5jT3Blbih2b2lkKQoreworICAgIGludCBoTUZDT3BlbjsKKyAgICBfTUZDTElCICpwQ1RYOworCisgICAgY2hhciBtZmNfZGV2X25hbWVbNjRdOworCisgICAgaW50IHJldDsKKyAgICBzdHJ1Y3QgdjRsMl9jYXBhYmlsaXR5IGNhcDsKKworICAgIGdldE1GQ05hbWUobWZjX2Rldl9uYW1lLCA2NCk7CisgICAgTE9HSSgiWyVzXSBkZXYgbmFtZSBpcyAlc1xuIixfX2Z1bmNfXyxtZmNfZGV2X25hbWUpOworCisgICAgaWYgKGFjY2VzcyhtZmNfZGV2X25hbWUsIEZfT0spICE9IDApIHsKKyAgICAgICAgTE9HRSgiWyVzXSBNRkMgZGV2aWNlIG5vZGUgbm90IGV4aXN0cyIsX19mdW5jX18pOworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisKKyAgICBoTUZDT3BlbiA9IG9wZW4obWZjX2Rldl9uYW1lLCBPX1JEV1IgfCBPX05PTkJMT0NLLCAwKTsKKyAgICBpZiAoaE1GQ09wZW4gPCAwKSB7CisgICAgICAgIExPR0UoIlslc10gRmFpbGVkIHRvIG9wZW4gTUZDIGRldmljZSIsX19mdW5jX18pOworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisKKyAgICBwQ1RYID0gKF9NRkNMSUIgKiltYWxsb2Moc2l6ZW9mKF9NRkNMSUIpKTsKKyAgICBpZiAocENUWCA9PSBOVUxMKSB7CisgICAgICAgIExPR0UoIlslc10gbWFsbG9jIGZhaWxlZC4iLF9fZnVuY19fKTsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorICAgIG1lbXNldChwQ1RYLCAwLCBzaXplb2YoX01GQ0xJQikpOworCisgICAgcENUWC0+aE1GQyA9IGhNRkNPcGVuOworCisgICAgbWVtc2V0KCZjYXAsIDAsIHNpemVvZihjYXApKTsKKyAgICByZXQgPSBpb2N0bChwQ1RYLT5oTUZDLCBWSURJT0NfUVVFUllDQVAsICZjYXApOworICAgIGlmIChyZXQgIT0gMCkgeworICAgICAgICBMT0dFKCJbJXNdIFZJRElPQ19RVUVSWUNBUCBmYWlsZWQiLF9fZnVuY19fKTsKKyAgICAgICAgY2xvc2UocENUWC0+aE1GQyk7CisgICAgICAgIGZyZWUocENUWCk7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KKworICAgIGlmICghKGNhcC5jYXBhYmlsaXRpZXMgJiBWNEwyX0NBUF9WSURFT19DQVBUVVJFKSkgeworICAgICAgICBMT0dFKCJbJXNdIERldmljZSBkb2VzIG5vdCBzdXBwb3J0IGNhcHR1cmUiLF9fZnVuY19fKTsKKyAgICAgICAgY2xvc2UocENUWC0+aE1GQyk7CisgICAgICAgIGZyZWUocENUWCk7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KKworICAgIGlmICghKGNhcC5jYXBhYmlsaXRpZXMgJiBWNEwyX0NBUF9WSURFT19PVVRQVVQpKSB7CisgICAgICAgIExPR0UoIlslc10gRGV2aWNlIGRvZXMgbm90IHN1cHBvcnQgb3V0cHV0IixfX2Z1bmNfXyk7CisgICAgICAgIGNsb3NlKHBDVFgtPmhNRkMpOworICAgICAgICBmcmVlKHBDVFgpOworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisKKyAgICBpZiAoIShjYXAuY2FwYWJpbGl0aWVzICYgVjRMMl9DQVBfU1RSRUFNSU5HKSkgeworICAgICAgICBMT0dFKCJbJXNdIERldmljZSBkb2VzIG5vdCBzdXBwb3J0IHN0cmVhbWluZyIsX19mdW5jX18pOworICAgICAgICBjbG9zZShwQ1RYLT5oTUZDKTsKKyAgICAgICAgZnJlZShwQ1RYKTsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorCisgICAgcENUWC0+djRsMl9lbmMuYlJ1bm5pbmcgPSAwOworICAgIC8qIHBoeXNpY2FsIGFkZHJlc3MgaXMgdXNlZCBmb3IgSW5wdXQgc291cmNlICovCisgICAgcENUWC0+djRsMl9lbmMuYklucHV0UGh5VmlyID0gMTsKKworICAgIHBDVFgtPmNhY2hlYWJsZWJ1ZmZlciA9IE5PX0NBQ0hFOworCisgICAgcmV0dXJuICh2b2lkICopcENUWDsKK30KKwordm9pZCAqU3NiU2lwTWZjRW5jT3BlbkV4dCh2b2lkICp2YWx1ZSkKK3sKKyAgICBfTUZDTElCICpwQ1RYOworCisgICAgcENUWCA9IFNzYlNpcE1mY0VuY09wZW4oKTsKKyAgICBpZiAocENUWCA9PSBOVUxMKQorICAgICAgICByZXR1cm4gTlVMTDsKKworICAgIGlmIChOT19DQUNIRSA9PSAoKihTU0JJUF9NRkNfQlVGRkVSX1RZUEUgKil2YWx1ZSkpIHsKKyAgICAgICAgcENUWC0+Y2FjaGVhYmxlYnVmZmVyID0gTk9fQ0FDSEU7CisgICAgICAgIC8qIHBoeXNpY2FsIGFkZHJlc3MgaXMgdXNlZCBmb3IgSW5wdXQgc291cmNlICovCisgICAgICAgIHBDVFgtPnY0bDJfZW5jLmJJbnB1dFBoeVZpciA9IDE7CisgICAgICAgIExPR0koIlslc10gbm9uIGNhY2hlYWJsZSBidWZmZXIiLF9fZnVuY19fKTsKKyAgICB9CisgICAgZWxzZSB7CisgICAgICAgIHBDVFgtPmNhY2hlYWJsZWJ1ZmZlciA9IENBQ0hFOworICAgICAgICAvKiB2aXR1YWwgYWRkcmVzcyBpcyB1c2VkIGZvciBJbnB1dCBzb3VyY2UgKi8KKyAgICAgICAgcENUWC0+djRsMl9lbmMuYklucHV0UGh5VmlyID0gMDsKKyAgICAgICAgTE9HSSgiWyVzXSBjYWNoZWFibGUgYnVmZmVyIixfX2Z1bmNfXyk7CisgICAgfQorCisgICAgcmV0dXJuICh2b2lkICopcENUWDsKK30KKworU1NCU0lQX01GQ19FUlJPUl9DT0RFIFNzYlNpcE1mY0VuY0Nsb3NlKHZvaWQgKm9wZW5IYW5kbGUpCit7CisgICAgX01GQ0xJQiAqcENUWDsKKyAgICBpbnQgaTsKKworICAgIGlmIChvcGVuSGFuZGxlID09IE5VTEwpIHsKKyAgICAgICAgTE9HRSgiWyVzXSBvcGVuSGFuZGxlIGlzIE5VTEwiLF9fZnVuY19fKTsKKyAgICAgICAgcmV0dXJuIE1GQ19SRVRfSU5WQUxJRF9QQVJBTTsKKyAgICB9CisKKyAgICBwQ1RYID0gKF9NRkNMSUIgKikgb3BlbkhhbmRsZTsKKworICAgIGlmICghcENUWC0+djRsMl9lbmMuYklucHV0UGh5VmlyKSB7CisgICAgICAgIGZvciAoaSA9IDA7IGkgPCBwQ1RYLT52NGwyX2VuYy5tZmNfbnVtX3NyY19idWZzOyBpKyspIHsKKyAgICAgICAgICAgIG11bm1hcChwQ1RYLT52NGwyX2VuYy5tZmNfc3JjX2J1ZnNbaV1bMF0sIHBDVFgtPnY0bDJfZW5jLm1mY19zcmNfYnVmc19sZW5bMF0pOworICAgICAgICAgICAgbXVubWFwKHBDVFgtPnY0bDJfZW5jLm1mY19zcmNfYnVmc1tpXVsxXSwgcENUWC0+djRsMl9lbmMubWZjX3NyY19idWZzX2xlblsxXSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBmb3IgKGkgPSAwOyBpIDwgcENUWC0+djRsMl9lbmMubWZjX251bV9kc3RfYnVmczsgaSsrKQorICAgICAgICBtdW5tYXAocENUWC0+djRsMl9lbmMubWZjX2RzdF9idWZzW2ldLCBwQ1RYLT52NGwyX2VuYy5tZmNfZHN0X2J1ZnNfbGVuKTsKKworICAgIHBDVFgtPmludGVyX2J1ZmZfc3RhdHVzID0gTUZDX1VTRV9OT05FOworCisgICAgY2xvc2UocENUWC0+aE1GQyk7CisKKyAgICBmcmVlKHBDVFgpOworCisgICAgcmV0dXJuIE1GQ19SRVRfT0s7Cit9CisKK1NTQlNJUF9NRkNfRVJST1JfQ09ERSBTc2JTaXBNZmNFbmNJbml0KHZvaWQgKm9wZW5IYW5kbGUsIHZvaWQgKnBhcmFtKQoreworICAgIGludCByZXQsIGksIGosaW5kZXg7CisgICAgX01GQ0xJQiAqcENUWDsKKworICAgIGVudW0gdjRsMl9idWZfdHlwZSB0eXBlOworICAgIHN0cnVjdCB2NGwyX2Zvcm1hdCBmbXQ7CisgICAgc3RydWN0IHY0bDJfcGxhbmUgcGxhbmVzW01GQ19FTkNfTlVNX1BMQU5FU107CisKKyAgICBzdHJ1Y3QgdjRsMl9idWZmZXIgYnVmOworICAgIHN0cnVjdCB2NGwyX3JlcXVlc3RidWZmZXJzIHJlcWJ1ZjsKKworICAgIHN0cnVjdCB2NGwyX2NvbnRyb2wgY3RybDsKKworICAgIHN0cnVjdCBwb2xsZmQgcG9sbF9ldmVudHM7CisgICAgaW50IHBvbGxfc3RhdGU7CisKKyAgICBzdHJ1Y3QgdjRsMl9leHRfY29udHJvbCBleHRfY3RybF9tcGVnNFsyN107CisgICAgc3RydWN0IHY0bDJfZXh0X2NvbnRyb2wgZXh0X2N0cmxfaDI2M1sxOV07CisgICAgc3RydWN0IHY0bDJfZXh0X2NvbnRyb2wgZXh0X2N0cmxbNDRdOworICAgIHN0cnVjdCB2NGwyX2V4dF9jb250cm9scyBleHRfY3RybHM7CisKKyAgICBTU0JTSVBfTUZDX0VOQ19IMjY0X1BBUkFNICpoMjY0X2FyZzsKKyAgICBTU0JTSVBfTUZDX0VOQ19NUEVHNF9QQVJBTSAqbXBlZzRfYXJnOworICAgIFNTQlNJUF9NRkNfRU5DX0gyNjNfUEFSQU0gKmgyNjNfYXJnOworCisgICAgaWYgKG9wZW5IYW5kbGUgPT0gTlVMTCkgeworICAgICAgICByZXR1cm4gTUZDX1JFVF9JTlZBTElEX1BBUkFNOworICAgIH0KKworICAgIHBDVFggID0gKF9NRkNMSUIgKikgb3BlbkhhbmRsZTsKKworICAgIG1wZWc0X2FyZyA9IChTU0JTSVBfTUZDX0VOQ19NUEVHNF9QQVJBTSopcGFyYW07CisgICAgaWYgKG1wZWc0X2FyZy0+Y29kZWNUeXBlID09IE1QRUc0X0VOQykgeworICAgICAgICBwQ1RYLT5jb2RlY1R5cGU9IE1QRUc0X0VOQzsKKyAgICAgICAgcENUWC0+d2lkdGggPSBtcGVnNF9hcmctPlNvdXJjZVdpZHRoOworICAgICAgICBwQ1RYLT5oZWlnaHQgPSBtcGVnNF9hcmctPlNvdXJjZUhlaWdodDsKKyAgICAgICAgcENUWC0+ZnJhbWVtYXAgPSBtcGVnNF9hcmctPkZyYW1lTWFwOworICAgIH0gZWxzZSB7CisgICAgICAgIGgyNjNfYXJnID0gKFNTQlNJUF9NRkNfRU5DX0gyNjNfUEFSQU0qKXBhcmFtOworICAgICAgICBpZiAoaDI2M19hcmctPmNvZGVjVHlwZSA9PSBIMjYzX0VOQykgeworICAgICAgICAgICAgcENUWC0+Y29kZWNUeXBlID0gSDI2M19FTkM7CisgICAgICAgICAgICBwQ1RYLT53aWR0aCA9IGgyNjNfYXJnLT5Tb3VyY2VXaWR0aDsKKyAgICAgICAgICAgIHBDVFgtPmhlaWdodCA9IGgyNjNfYXJnLT5Tb3VyY2VIZWlnaHQ7CisgICAgICAgICAgICBwQ1RYLT5mcmFtZW1hcCA9IGgyNjNfYXJnLT5GcmFtZU1hcDsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIGgyNjRfYXJnID0gKFNTQlNJUF9NRkNfRU5DX0gyNjRfUEFSQU0qKXBhcmFtOworICAgICAgICAgICAgaWYgKGgyNjRfYXJnLT5jb2RlY1R5cGUgPT0gSDI2NF9FTkMpIHsKKyAgICAgICAgICAgICAgICBwQ1RYLT5jb2RlY1R5cGUgPSBIMjY0X0VOQzsKKyAgICAgICAgICAgICAgICBwQ1RYLT53aWR0aCA9IGgyNjRfYXJnLT5Tb3VyY2VXaWR0aDsKKyAgICAgICAgICAgICAgICBwQ1RYLT5oZWlnaHQgPSBoMjY0X2FyZy0+U291cmNlSGVpZ2h0OworICAgICAgICAgICAgICAgIHBDVFgtPmZyYW1lbWFwID0gaDI2NF9hcmctPkZyYW1lTWFwOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBMT0dFKCJbJXNdIFVuZGVmaW5lZCBjb2RlYyB0eXBlIFxuIixfX2Z1bmNfXyk7CisgICAgICAgICAgICAgICAgcmV0ID0gTUZDX1JFVF9JTlZBTElEX1BBUkFNOworICAgICAgICAgICAgICAgIGdvdG8gZXJyb3JfY2FzZTE7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICBzd2l0Y2ggKHBDVFgtPmNvZGVjVHlwZSkgeworICAgIGNhc2UgTVBFRzRfRU5DOgorICAgICAgICBleHRfY3RybF9tcGVnNFswXS5pZCA9IFY0TDJfQ0lEX0NPREVDX01GQzVYX0VOQ19NUEVHNF9QUk9GSUxFOworICAgICAgICBleHRfY3RybF9tcGVnNFswXS52YWx1ZSA9IG1wZWc0X2FyZy0+UHJvZmlsZUlEQzsKKyAgICAgICAgZXh0X2N0cmxfbXBlZzRbMV0uaWQgPSBWNEwyX0NJRF9DT0RFQ19NRkM1WF9FTkNfTVBFRzRfTEVWRUw7CisgICAgICAgIGV4dF9jdHJsX21wZWc0WzFdLnZhbHVlID0gbXBlZzRfYXJnLT5MZXZlbElEQzsKKyAgICAgICAgZXh0X2N0cmxfbXBlZzRbMl0uaWQgPSBWNEwyX0NJRF9DT0RFQ19NRkM1WF9FTkNfR09QX1NJWkU7CisgICAgICAgIGV4dF9jdHJsX21wZWc0WzJdLnZhbHVlID0gbXBlZzRfYXJnLT5JRFJQZXJpb2Q7CisgICAgICAgIGV4dF9jdHJsX21wZWc0WzNdLmlkID0gVjRMMl9DSURfQ09ERUNfTUZDNVhfRU5DX01QRUc0X1FVQVJURVJfUElYRUw7CisgICAgICAgIGV4dF9jdHJsX21wZWc0WzNdLnZhbHVlID0gbXBlZzRfYXJnLT5EaXNhYmxlUXBlbE1FOworCisgICAgICAgIGV4dF9jdHJsX21wZWc0WzRdLmlkID0gVjRMMl9DSURfQ09ERUNfTUZDNVhfRU5DX01VTFRJX1NMSUNFX01PREU7CisgICAgICAgIGV4dF9jdHJsX21wZWc0WzRdLnZhbHVlID0gbXBlZzRfYXJnLT5TbGljZU1vZGU7IC8qIDA6IG9uZSwgMTogZml4ZWQgI21iLCAzOiBmaXhlZCAjYnl0ZXMgKi8KKyAgICAgICAgaWYgKG1wZWc0X2FyZy0+U2xpY2VNb2RlID09IDApIHsKKyAgICAgICAgICAgIGV4dF9jdHJsX21wZWc0WzVdLmlkID0gVjRMMl9DSURfQ09ERUNfTUZDNVhfRU5DX01VTFRJX1NMSUNFX01COworICAgICAgICAgICAgZXh0X2N0cmxfbXBlZzRbNV0udmFsdWUgPSAxOyAgLyogZGVmYXVsdCAqLworICAgICAgICAgICAgZXh0X2N0cmxfbXBlZzRbNl0uaWQgPSBWNEwyX0NJRF9DT0RFQ19NRkM1WF9FTkNfTVVMVElfU0xJQ0VfQklUOworICAgICAgICAgICAgZXh0X2N0cmxfbXBlZzRbNl0udmFsdWUgPSAxOTAwOyAvKiBkZWZhdWx0ICovCisgICAgICAgIH0gZWxzZSBpZiAobXBlZzRfYXJnLT5TbGljZU1vZGUgPT0gMSkgeworICAgICAgICAgICAgZXh0X2N0cmxfbXBlZzRbNV0uaWQgPSBWNEwyX0NJRF9DT0RFQ19NRkM1WF9FTkNfTVVMVElfU0xJQ0VfTUI7CisgICAgICAgICAgICBleHRfY3RybF9tcGVnNFs1XS52YWx1ZSA9IG1wZWc0X2FyZy0+U2xpY2VBcmd1bWVudDsKKyAgICAgICAgICAgIGV4dF9jdHJsX21wZWc0WzZdLmlkID0gVjRMMl9DSURfQ09ERUNfTUZDNVhfRU5DX01VTFRJX1NMSUNFX0JJVDsKKyAgICAgICAgICAgIGV4dF9jdHJsX21wZWc0WzZdLnZhbHVlID0gMTkwMDsgLyogZGVmYXVsdCAqLworICAgICAgICB9IGVsc2UgaWYgKG1wZWc0X2FyZy0+U2xpY2VNb2RlID09IDMpIHsKKyAgICAgICAgICAgIGV4dF9jdHJsX21wZWc0WzVdLmlkID0gVjRMMl9DSURfQ09ERUNfTUZDNVhfRU5DX01VTFRJX1NMSUNFX01COworICAgICAgICAgICAgZXh0X2N0cmxfbXBlZzRbNV0udmFsdWUgPSAxOyAvKiBkZWZhdWx0ICovCisgICAgICAgICAgICBleHRfY3RybF9tcGVnNFs2XS5pZCA9IFY0TDJfQ0lEX0NPREVDX01GQzVYX0VOQ19NVUxUSV9TTElDRV9CSVQ7CisgICAgICAgICAgICBleHRfY3RybF9tcGVnNFs2XS52YWx1ZSA9IG1wZWc0X2FyZy0+U2xpY2VBcmd1bWVudDsKKyAgICAgICAgfQorICAgICAgICAvKgorICAgICAgICBJdCBzaG91bGQgYmUgc2V0IHVzaW5nIG1wZWc0X2FyZy0+TnVtYmVyQkZyYW1lcyBhZnRlciBiZWluZyBoYW5kbGVkIGJ5IGFwcGwuCisgICAgICAgICAqLworICAgICAgICBleHRfY3RybF9tcGVnNFs3XS5pZCA9ICBWNEwyX0NJRF9DT0RFQ19NRkM1WF9FTkNfTVBFRzRfQl9GUkFNRVM7CisgICAgICAgIGV4dF9jdHJsX21wZWc0WzddLnZhbHVlID0gbXBlZzRfYXJnLT5OdW1iZXJCRnJhbWVzOworICAgICAgICBleHRfY3RybF9tcGVnNFs4XS5pZCA9IFY0TDJfQ0lEX0NPREVDX01GQzVYX0VOQ19JTlRSQV9SRUZSRVNIX01COworICAgICAgICBleHRfY3RybF9tcGVnNFs4XS52YWx1ZSA9IG1wZWc0X2FyZy0+UmFuZG9tSW50cmFNQlJlZnJlc2g7CisKKyAgICAgICAgZXh0X2N0cmxfbXBlZzRbOV0uaWQgPSBWNEwyX0NJRF9DT0RFQ19NRkM1WF9FTkNfUEFEX0NUUkxfRU5BQkxFOworICAgICAgICBleHRfY3RybF9tcGVnNFs5XS52YWx1ZSA9IG1wZWc0X2FyZy0+UGFkQ29udHJvbE9uOworICAgICAgICBleHRfY3RybF9tcGVnNFsxMF0uaWQgPSBWNEwyX0NJRF9DT0RFQ19NRkM1WF9FTkNfUEFEX0xVTUFfVkFMVUU7CisgICAgICAgIGV4dF9jdHJsX21wZWc0WzEwXS52YWx1ZSA9IG1wZWc0X2FyZy0+THVtYVBhZFZhbDsKKyAgICAgICAgZXh0X2N0cmxfbXBlZzRbMTFdLmlkID0gVjRMMl9DSURfQ09ERUNfTUZDNVhfRU5DX1BBRF9DQl9WQUxVRTsKKyAgICAgICAgZXh0X2N0cmxfbXBlZzRbMTFdLnZhbHVlID0gbXBlZzRfYXJnLT5DYlBhZFZhbDsKKyAgICAgICAgZXh0X2N0cmxfbXBlZzRbMTJdLmlkID0gVjRMMl9DSURfQ09ERUNfTUZDNVhfRU5DX1BBRF9DUl9WQUxVRTsKKyAgICAgICAgZXh0X2N0cmxfbXBlZzRbMTJdLnZhbHVlID0gbXBlZzRfYXJnLT5DclBhZFZhbDsKKworICAgICAgICBleHRfY3RybF9tcGVnNFsxM10uaWQgPSBWNEwyX0NJRF9DT0RFQ19NRkM1WF9FTkNfUkNfRlJBTUVfRU5BQkxFOworICAgICAgICBleHRfY3RybF9tcGVnNFsxM10udmFsdWUgPSBtcGVnNF9hcmctPkVuYWJsZUZSTVJhdGVDb250cm9sOworICAgICAgICBleHRfY3RybF9tcGVnNFsxNF0uaWQgPSBWNEwyX0NJRF9DT0RFQ19NRkM1WF9FTkNfTVBFRzRfVk9QX1RJTUVfUkVTOworICAgICAgICBleHRfY3RybF9tcGVnNFsxNF0udmFsdWUgPSBtcGVnNF9hcmctPlRpbWVJbmNyZWFtZW50UmVzOworICAgICAgICBleHRfY3RybF9tcGVnNFsxNV0uaWQgPSBWNEwyX0NJRF9DT0RFQ19NRkM1WF9FTkNfTVBFRzRfVk9QX0ZSTV9ERUxUQTsKKyAgICAgICAgZXh0X2N0cmxfbXBlZzRbMTVdLnZhbHVlID0gbXBlZzRfYXJnLT5Wb3BUaW1lSW5jcmVhbWVudDsKKyAgICAgICAgZXh0X2N0cmxfbXBlZzRbMTZdLmlkID0gVjRMMl9DSURfQ09ERUNfTUZDNVhfRU5DX1JDX0JJVF9SQVRFOworICAgICAgICBleHRfY3RybF9tcGVnNFsxNl0udmFsdWUgPSBtcGVnNF9hcmctPkJpdHJhdGU7CisKKyAgICAgICAgZXh0X2N0cmxfbXBlZzRbMTddLmlkID0gVjRMMl9DSURfQ09ERUNfTUZDNVhfRU5DX01QRUc0X1JDX0ZSQU1FX1FQOworICAgICAgICBleHRfY3RybF9tcGVnNFsxN10udmFsdWUgPSBtcGVnNF9hcmctPkZyYW1lUXA7CisgICAgICAgIGV4dF9jdHJsX21wZWc0WzE4XS5pZCA9ICBWNEwyX0NJRF9DT0RFQ19NRkM1WF9FTkNfTVBFRzRfUkNfUF9GUkFNRV9RUDsKKyAgICAgICAgZXh0X2N0cmxfbXBlZzRbMThdLnZhbHVlID0gbXBlZzRfYXJnLT5GcmFtZVFwX1A7CisgICAgICAgIGV4dF9jdHJsX21wZWc0WzE5XS5pZCA9ICBWNEwyX0NJRF9DT0RFQ19NRkM1WF9FTkNfTVBFRzRfUkNfQl9GUkFNRV9RUDsKKyAgICAgICAgZXh0X2N0cmxfbXBlZzRbMTldLnZhbHVlID0gbXBlZzRfYXJnLT5GcmFtZVFwX0I7CisKKyAgICAgICAgZXh0X2N0cmxfbXBlZzRbMjBdLmlkID0gIFY0TDJfQ0lEX0NPREVDX01GQzVYX0VOQ19NUEVHNF9SQ19NQVhfUVA7CisgICAgICAgIGV4dF9jdHJsX21wZWc0WzIwXS52YWx1ZSA9IG1wZWc0X2FyZy0+UVNDb2RlTWF4OworICAgICAgICBleHRfY3RybF9tcGVnNFsyMV0uaWQgPSBWNEwyX0NJRF9DT0RFQ19NRkM1WF9FTkNfTVBFRzRfUkNfTUlOX1FQOworICAgICAgICBleHRfY3RybF9tcGVnNFsyMV0udmFsdWUgPSBtcGVnNF9hcmctPlFTQ29kZU1pbjsKKyAgICAgICAgZXh0X2N0cmxfbXBlZzRbMjJdLmlkID0gVjRMMl9DSURfQ09ERUNfTUZDNVhfRU5DX1JDX1JFQUNUSU9OX0NPRUZGOworICAgICAgICBleHRfY3RybF9tcGVnNFsyMl0udmFsdWUgPSBtcGVnNF9hcmctPkNCUlBlcmlvZFJmOworCisgICAgICAgIGlmIChWNEwyX0NPREVDX01GQzVYX0VOQ19GUkFNRV9TS0lQX01PREVfTEVWRUwgPT0gcENUWC0+ZW5jX2ZyYW1lc2tpcCkgeworICAgICAgICAgICAgZXh0X2N0cmxfbXBlZzRbMjNdLmlkID0gVjRMMl9DSURfQ09ERUNfTUZDNVhfRU5DX0ZSQU1FX1NLSVBfTU9ERTsKKyAgICAgICAgICAgIGV4dF9jdHJsX21wZWc0WzIzXS52YWx1ZSA9IFY0TDJfQ09ERUNfTUZDNVhfRU5DX0ZSQU1FX1NLSVBfTU9ERV9MRVZFTDsKKyAgICAgICAgfSBlbHNlIGlmKFY0TDJfQ09ERUNfTUZDNVhfRU5DX0ZSQU1FX1NLSVBfTU9ERV9WQlZfQlVGX1NJWkUgPT0gcENUWC0+ZW5jX2ZyYW1lc2tpcCkgeworICAgICAgICAgICAgZXh0X2N0cmxfbXBlZzRbMjNdLmlkID0gVjRMMl9DSURfQ09ERUNfTUZDNVhfRU5DX0ZSQU1FX1NLSVBfTU9ERTsKKyAgICAgICAgICAgIGV4dF9jdHJsX21wZWc0WzIzXS52YWx1ZSA9IFY0TDJfQ09ERUNfTUZDNVhfRU5DX0ZSQU1FX1NLSVBfTU9ERV9WQlZfQlVGX1NJWkU7CisgICAgICAgIH0gZWxzZSB7IC8qIEVOQ19GUkFNRV9TS0lQX01PREVfRElTQUJMRSAoZGVmYXVsdCkgKi8KKyAgICAgICAgICAgIGV4dF9jdHJsX21wZWc0WzIzXS5pZCA9IFY0TDJfQ0lEX0NPREVDX01GQzVYX0VOQ19GUkFNRV9TS0lQX01PREU7CisgICAgICAgICAgICBleHRfY3RybF9tcGVnNFsyM10udmFsdWUgPSBWNEwyX0NPREVDX01GQzVYX0VOQ19GUkFNRV9TS0lQX01PREVfRElTQUJMRTsKKyAgICAgICAgfQorCisgICAgICAgIGV4dF9jdHJsX21wZWc0WzI0XS5pZCA9IFY0TDJfQ0lEX0NPREVDX01GQzVYX0VOQ19WQlZfQlVGX1NJWkU7CisgICAgICAgIGV4dF9jdHJsX21wZWc0WzI0XS52YWx1ZSA9IDA7CisKKyAgICAgICAgZXh0X2N0cmxfbXBlZzRbMjVdLmlkID0gVjRMMl9DSURfQ09ERUNfTUZDNVhfRU5DX1NFUV9IRFJfTU9ERTsKKyAgICAgICAgZXh0X2N0cmxfbXBlZzRbMjVdLnZhbHVlID0gMDsKKworICAgICAgICBleHRfY3RybF9tcGVnNFsyNl0uaWQgPSBWNEwyX0NJRF9DT0RFQ19NRkM1WF9FTkNfUkNfRklYRURfVEFSR0VUX0JJVDsKKyAgICAgICAgZXh0X2N0cmxfbXBlZzRbMjZdLnZhbHVlID0gVjRMMl9DT0RFQ19NRkM1WF9FTkNfU1dfRU5BQkxFOworICAgICAgICBicmVhazsKKworICAgIGNhc2UgSDI2M19FTkM6CisgICAgICAgIGV4dF9jdHJsX2gyNjNbMF0uaWQgPSBWNEwyX0NJRF9DT0RFQ19NRkM1WF9FTkNfR09QX1NJWkU7CisgICAgICAgIGV4dF9jdHJsX2gyNjNbMF0udmFsdWUgPSBoMjYzX2FyZy0+SURSUGVyaW9kOworCisgICAgICAgIGV4dF9jdHJsX2gyNjNbMV0uaWQgPSBWNEwyX0NJRF9DT0RFQ19NRkM1WF9FTkNfTVVMVElfU0xJQ0VfTU9ERTsKKyAgICAgICAgZXh0X2N0cmxfaDI2M1sxXS52YWx1ZSA9IGgyNjNfYXJnLT5TbGljZU1vZGU7IC8qIDA6IG9uZSwgQ2hlY2sgaXMgbmVlZGVkIGlmIGgyNjQgc3VwcG9ydCBtdWx0aS1zbGljZSAqLworCisgICAgICAgIGV4dF9jdHJsX2gyNjNbMl0uaWQgPSBWNEwyX0NJRF9DT0RFQ19NRkM1WF9FTkNfSU5UUkFfUkVGUkVTSF9NQjsKKyAgICAgICAgZXh0X2N0cmxfaDI2M1syXS52YWx1ZSA9IGgyNjNfYXJnLT5SYW5kb21JbnRyYU1CUmVmcmVzaDsKKworICAgICAgICBleHRfY3RybF9oMjYzWzNdLmlkID0gVjRMMl9DSURfQ09ERUNfTUZDNVhfRU5DX1BBRF9DVFJMX0VOQUJMRTsKKyAgICAgICAgZXh0X2N0cmxfaDI2M1szXS52YWx1ZSA9IGgyNjNfYXJnLT5QYWRDb250cm9sT247CisgICAgICAgIGV4dF9jdHJsX2gyNjNbNF0uaWQgPSBWNEwyX0NJRF9DT0RFQ19NRkM1WF9FTkNfUEFEX0xVTUFfVkFMVUU7CisgICAgICAgIGV4dF9jdHJsX2gyNjNbNF0udmFsdWUgPSBoMjYzX2FyZy0+THVtYVBhZFZhbDsKKyAgICAgICAgZXh0X2N0cmxfaDI2M1s1XS5pZCA9IFY0TDJfQ0lEX0NPREVDX01GQzVYX0VOQ19QQURfQ0JfVkFMVUU7CisgICAgICAgIGV4dF9jdHJsX2gyNjNbNV0udmFsdWUgPSBoMjYzX2FyZy0+Q2JQYWRWYWw7CisgICAgICAgIGV4dF9jdHJsX2gyNjNbNl0uaWQgPSBWNEwyX0NJRF9DT0RFQ19NRkM1WF9FTkNfUEFEX0NSX1ZBTFVFOworICAgICAgICBleHRfY3RybF9oMjYzWzZdLnZhbHVlID0gaDI2M19hcmctPkNyUGFkVmFsOworCisgICAgICAgIGV4dF9jdHJsX2gyNjNbN10uaWQgPSBWNEwyX0NJRF9DT0RFQ19NRkM1WF9FTkNfUkNfRlJBTUVfRU5BQkxFOworICAgICAgICBleHRfY3RybF9oMjYzWzddLnZhbHVlID0gaDI2M19hcmctPkVuYWJsZUZSTVJhdGVDb250cm9sOworCisgICAgICAgIGV4dF9jdHJsX2gyNjNbOF0uaWQgPSBWNEwyX0NJRF9DT0RFQ19NRkM1WF9FTkNfSDI2M19SQ19GUkFNRV9SQVRFOworICAgICAgICBleHRfY3RybF9oMjYzWzhdLnZhbHVlID0gaDI2M19hcmctPkZyYW1lUmF0ZTsKKworICAgICAgICBleHRfY3RybF9oMjYzWzldLmlkID0gVjRMMl9DSURfQ09ERUNfTUZDNVhfRU5DX1JDX0JJVF9SQVRFOworICAgICAgICBleHRfY3RybF9oMjYzWzldLnZhbHVlID0gaDI2M19hcmctPkJpdHJhdGU7CisKKyAgICAgICAgZXh0X2N0cmxfaDI2M1sxMF0uaWQgPSBWNEwyX0NJRF9DT0RFQ19NRkM1WF9FTkNfSDI2M19SQ19GUkFNRV9RUDsKKyAgICAgICAgZXh0X2N0cmxfaDI2M1sxMF0udmFsdWUgPSBoMjYzX2FyZy0+RnJhbWVRcDsKKyAgICAgICAgZXh0X2N0cmxfaDI2M1sxMV0uaWQgPSAgVjRMMl9DSURfQ09ERUNfTUZDNVhfRU5DX0gyNjNfUkNfUF9GUkFNRV9RUDsKKyAgICAgICAgZXh0X2N0cmxfaDI2M1sxMV0udmFsdWUgPSBoMjYzX2FyZy0+RnJhbWVRcF9QOworCisgICAgICAgIGV4dF9jdHJsX2gyNjNbMTJdLmlkID0gIFY0TDJfQ0lEX0NPREVDX01GQzVYX0VOQ19IMjYzX1JDX01BWF9RUDsKKyAgICAgICAgZXh0X2N0cmxfaDI2M1sxMl0udmFsdWUgPSBoMjYzX2FyZy0+UVNDb2RlTWF4OworICAgICAgICBleHRfY3RybF9oMjYzWzEzXS5pZCA9IFY0TDJfQ0lEX0NPREVDX01GQzVYX0VOQ19IMjYzX1JDX01JTl9RUDsKKyAgICAgICAgZXh0X2N0cmxfaDI2M1sxM10udmFsdWUgPSBoMjYzX2FyZy0+UVNDb2RlTWluOworICAgICAgICBleHRfY3RybF9oMjYzWzE0XS5pZCA9IFY0TDJfQ0lEX0NPREVDX01GQzVYX0VOQ19SQ19SRUFDVElPTl9DT0VGRjsKKyAgICAgICAgZXh0X2N0cmxfaDI2M1sxNF0udmFsdWUgPSBoMjYzX2FyZy0+Q0JSUGVyaW9kUmY7CisKKyAgICAgICAgaWYgKFY0TDJfQ09ERUNfTUZDNVhfRU5DX0ZSQU1FX1NLSVBfTU9ERV9MRVZFTCA9PSBwQ1RYLT5lbmNfZnJhbWVza2lwKSB7CisgICAgICAgICAgICBleHRfY3RybF9oMjYzWzE1XS5pZCA9IFY0TDJfQ0lEX0NPREVDX01GQzVYX0VOQ19GUkFNRV9TS0lQX01PREU7CisgICAgICAgICAgICBleHRfY3RybF9oMjYzWzE1XS52YWx1ZSA9IFY0TDJfQ09ERUNfTUZDNVhfRU5DX0ZSQU1FX1NLSVBfTU9ERV9MRVZFTDsKKyAgICAgICAgfSBlbHNlIGlmKFY0TDJfQ09ERUNfTUZDNVhfRU5DX0ZSQU1FX1NLSVBfTU9ERV9WQlZfQlVGX1NJWkU9PSBwQ1RYLT5lbmNfZnJhbWVza2lwKSB7CisgICAgICAgICAgICBleHRfY3RybF9oMjYzWzE1XS5pZCA9IFY0TDJfQ0lEX0NPREVDX01GQzVYX0VOQ19GUkFNRV9TS0lQX01PREU7CisgICAgICAgICAgICBleHRfY3RybF9oMjYzWzE1XS52YWx1ZSA9IFY0TDJfQ09ERUNfTUZDNVhfRU5DX0ZSQU1FX1NLSVBfTU9ERV9WQlZfQlVGX1NJWkU7CisgICAgICAgIH0gZWxzZSB7IC8qIEVOQ19GUkFNRV9TS0lQX01PREVfRElTQUJMRSAoZGVmYXVsdCkgKi8KKyAgICAgICAgICAgIGV4dF9jdHJsX2gyNjNbMTVdLmlkID0gVjRMMl9DSURfQ09ERUNfTUZDNVhfRU5DX0ZSQU1FX1NLSVBfTU9ERTsKKyAgICAgICAgICAgIGV4dF9jdHJsX2gyNjNbMTVdLnZhbHVlID0gVjRMMl9DT0RFQ19NRkM1WF9FTkNfRlJBTUVfU0tJUF9NT0RFX0RJU0FCTEU7CisgICAgICAgIH0KKworICAgICAgICBleHRfY3RybF9oMjYzWzE2XS5pZCA9IFY0TDJfQ0lEX0NPREVDX01GQzVYX0VOQ19WQlZfQlVGX1NJWkU7CisgICAgICAgIGV4dF9jdHJsX2gyNjNbMTZdLnZhbHVlID0gMDsKKworICAgICAgICBleHRfY3RybF9oMjYzWzE3XS5pZCA9IFY0TDJfQ0lEX0NPREVDX01GQzVYX0VOQ19TRVFfSERSX01PREU7CisgICAgICAgIGV4dF9jdHJsX2gyNjNbMTddLnZhbHVlID0gMDsKKworICAgICAgICBleHRfY3RybF9oMjYzWzE4XS5pZCA9IFY0TDJfQ0lEX0NPREVDX01GQzVYX0VOQ19SQ19GSVhFRF9UQVJHRVRfQklUOworICAgICAgICBleHRfY3RybF9oMjYzWzE4XS52YWx1ZSA9IFY0TDJfQ09ERUNfTUZDNVhfRU5DX1NXX0VOQUJMRTsKKyAgICAgICAgYnJlYWs7CisKKyAgICBjYXNlIEgyNjRfRU5DOgorICAgICAgICBleHRfY3RybFswXS5pZCA9IFY0TDJfQ0lEX0NPREVDX01GQzVYX0VOQ19IMjY0X1BST0ZJTEU7CisgICAgICAgIGV4dF9jdHJsWzBdLnZhbHVlID0gaDI2NF9hcmctPlByb2ZpbGVJREM7CisgICAgICAgIGV4dF9jdHJsWzFdLmlkID0gVjRMMl9DSURfQ09ERUNfTUZDNVhfRU5DX0gyNjRfTEVWRUw7CisgICAgICAgIGV4dF9jdHJsWzFdLnZhbHVlID0gaDI2NF9hcmctPkxldmVsSURDOworICAgICAgICBleHRfY3RybFsyXS5pZCA9IFY0TDJfQ0lEX0NPREVDX01GQzVYX0VOQ19HT1BfU0laRTsKKyAgICAgICAgZXh0X2N0cmxbMl0udmFsdWUgPSBoMjY0X2FyZy0+SURSUGVyaW9kOworICAgICAgICBleHRfY3RybFszXS5pZCA9IFY0TDJfQ0lEX0NPREVDX01GQzVYX0VOQ19IMjY0X01BWF9SRUZfUElDOworICAgICAgICBleHRfY3RybFszXS52YWx1ZSA9IGgyNjRfYXJnLT5OdW1iZXJSZWZlcmVuY2VGcmFtZXM7CisgICAgICAgIGV4dF9jdHJsWzRdLmlkID0gVjRMMl9DSURfQ09ERUNfTUZDNVhfRU5DX0gyNjRfTlVNX1JFRl9QSUNfNFA7CisgICAgICAgIGV4dF9jdHJsWzRdLnZhbHVlID0gaDI2NF9hcmctPk51bWJlclJlZkZvclBmcmFtZXM7CisgICAgICAgIGV4dF9jdHJsWzVdLmlkID0gVjRMMl9DSURfQ09ERUNfTUZDNVhfRU5DX01VTFRJX1NMSUNFX01PREU7CisgICAgICAgIGV4dF9jdHJsWzVdLnZhbHVlID0gaDI2NF9hcmctPlNsaWNlTW9kZTsgIC8qIDA6IG9uZSwgMTogZml4ZWQgI21iLCAzOiBmaXhlZCAjYnl0ZXMgKi8KKyAgICAgICAgaWYgKGgyNjRfYXJnLT5TbGljZU1vZGUgPT0gMCkgeworICAgICAgICAgICAgZXh0X2N0cmxbNl0uaWQgPSBWNEwyX0NJRF9DT0RFQ19NRkM1WF9FTkNfTVVMVElfU0xJQ0VfTUI7CisgICAgICAgICAgICBleHRfY3RybFs2XS52YWx1ZSA9IDE7ICAvKiBkZWZhdWx0ICovCisgICAgICAgICAgICBleHRfY3RybFs3XS5pZCA9IFY0TDJfQ0lEX0NPREVDX01GQzVYX0VOQ19NVUxUSV9TTElDRV9CSVQ7CisgICAgICAgICAgICBleHRfY3RybFs3XS52YWx1ZSA9IDE5MDA7IC8qIGRlZmF1bHQgKi8KKyAgICAgICAgfSBlbHNlIGlmIChoMjY0X2FyZy0+U2xpY2VNb2RlID09IDEpIHsKKyAgICAgICAgICAgIGV4dF9jdHJsWzZdLmlkID0gVjRMMl9DSURfQ09ERUNfTUZDNVhfRU5DX01VTFRJX1NMSUNFX01COworICAgICAgICAgICAgZXh0X2N0cmxbNl0udmFsdWUgPSBoMjY0X2FyZy0+U2xpY2VBcmd1bWVudDsKKyAgICAgICAgICAgIGV4dF9jdHJsWzddLmlkID0gVjRMMl9DSURfQ09ERUNfTUZDNVhfRU5DX01VTFRJX1NMSUNFX0JJVDsKKyAgICAgICAgICAgIGV4dF9jdHJsWzddLnZhbHVlID0gMTkwMDsgLyogZGVmYXVsdCAqLworICAgICAgICB9IGVsc2UgaWYgKGgyNjRfYXJnLT5TbGljZU1vZGUgPT0gMykgeworICAgICAgICAgICAgZXh0X2N0cmxbNl0uaWQgPSBWNEwyX0NJRF9DT0RFQ19NRkM1WF9FTkNfTVVMVElfU0xJQ0VfTUI7CisgICAgICAgICAgICBleHRfY3RybFs2XS52YWx1ZSA9IDE7IC8qIGRlZmF1bHQgKi8KKyAgICAgICAgICAgIGV4dF9jdHJsWzddLmlkID0gVjRMMl9DSURfQ09ERUNfTUZDNVhfRU5DX01VTFRJX1NMSUNFX0JJVDsKKyAgICAgICAgICAgIGV4dF9jdHJsWzddLnZhbHVlID0gaDI2NF9hcmctPlNsaWNlQXJndW1lbnQ7CisgICAgICAgIH0KKyAgICAgICAgLyoKKyAgICAgICAgSXQgc2hvdWxkIGJlIHNldCB1c2luZyBoMjY0X2FyZy0+TnVtYmVyQkZyYW1lcyBhZnRlciBiZWluZyBoYW5kbGVkIGJ5IGFwcGwuCisgICAgICAgICAqLworICAgICAgICBleHRfY3RybFs4XS5pZCA9ICBWNEwyX0NJRF9DT0RFQ19NRkM1WF9FTkNfSDI2NF9CX0ZSQU1FUzsKKyAgICAgICAgZXh0X2N0cmxbOF0udmFsdWUgPSBoMjY0X2FyZy0+TnVtYmVyQkZyYW1lczsKKyAgICAgICAgZXh0X2N0cmxbOV0uaWQgPSBWNEwyX0NJRF9DT0RFQ19NRkM1WF9FTkNfSDI2NF9MT09QX0ZJTFRFUl9NT0RFOworICAgICAgICBleHRfY3RybFs5XS52YWx1ZSA9IGgyNjRfYXJnLT5Mb29wRmlsdGVyRGlzYWJsZTsKKyAgICAgICAgZXh0X2N0cmxbMTBdLmlkID0gVjRMMl9DSURfQ09ERUNfTUZDNVhfRU5DX0gyNjRfTE9PUF9GSUxURVJfQUxQSEE7CisgICAgICAgIGV4dF9jdHJsWzEwXS52YWx1ZSA9IGgyNjRfYXJnLT5Mb29wRmlsdGVyQWxwaGFDME9mZnNldDsKKyAgICAgICAgZXh0X2N0cmxbMTFdLmlkID0gVjRMMl9DSURfQ09ERUNfTUZDNVhfRU5DX0gyNjRfTE9PUF9GSUxURVJfQkVUQTsKKyAgICAgICAgZXh0X2N0cmxbMTFdLnZhbHVlID0gaDI2NF9hcmctPkxvb3BGaWx0ZXJCZXRhT2Zmc2V0OworICAgICAgICBleHRfY3RybFsxMl0uaWQgPSBWNEwyX0NJRF9DT0RFQ19NRkM1WF9FTkNfSDI2NF9FTlRST1BZX01PREU7CisgICAgICAgIGV4dF9jdHJsWzEyXS52YWx1ZSA9IGgyNjRfYXJnLT5TeW1ib2xNb2RlOworICAgICAgICBleHRfY3RybFsxM10uaWQgPSBWNEwyX0NJRF9DT0RFQ19NRkM1WF9FTkNfSDI2NF9JTlRFUkxBQ0U7CisgICAgICAgIGV4dF9jdHJsWzEzXS52YWx1ZSA9IGgyNjRfYXJnLT5QaWN0dXJlSW50ZXJsYWNlOworICAgICAgICBleHRfY3RybFsxNF0uaWQgPSBWNEwyX0NJRF9DT0RFQ19NRkM1WF9FTkNfSDI2NF84WDhfVFJBTlNGT1JNOworICAgICAgICBleHRfY3RybFsxNF0udmFsdWUgPSBoMjY0X2FyZy0+VHJhbnNmb3JtOHg4TW9kZTsKKyAgICAgICAgZXh0X2N0cmxbMTVdLmlkID0gVjRMMl9DSURfQ09ERUNfTUZDNVhfRU5DX0lOVFJBX1JFRlJFU0hfTUI7CisgICAgICAgIGV4dF9jdHJsWzE1XS52YWx1ZSA9IGgyNjRfYXJnLT5SYW5kb21JbnRyYU1CUmVmcmVzaDsKKyAgICAgICAgZXh0X2N0cmxbMTZdLmlkID0gVjRMMl9DSURfQ09ERUNfTUZDNVhfRU5DX1BBRF9DVFJMX0VOQUJMRTsKKyAgICAgICAgZXh0X2N0cmxbMTZdLnZhbHVlID0gaDI2NF9hcmctPlBhZENvbnRyb2xPbjsKKyAgICAgICAgZXh0X2N0cmxbMTddLmlkID0gVjRMMl9DSURfQ09ERUNfTUZDNVhfRU5DX1BBRF9MVU1BX1ZBTFVFOworICAgICAgICBleHRfY3RybFsxN10udmFsdWUgPSBoMjY0X2FyZy0+THVtYVBhZFZhbDsKKyAgICAgICAgZXh0X2N0cmxbMThdLmlkID0gVjRMMl9DSURfQ09ERUNfTUZDNVhfRU5DX1BBRF9DQl9WQUxVRTsKKyAgICAgICAgZXh0X2N0cmxbMThdLnZhbHVlID0gaDI2NF9hcmctPkNiUGFkVmFsOworICAgICAgICBleHRfY3RybFsxOV0uaWQgPSBWNEwyX0NJRF9DT0RFQ19NRkM1WF9FTkNfUEFEX0NSX1ZBTFVFOworICAgICAgICBleHRfY3RybFsxOV0udmFsdWUgPSBoMjY0X2FyZy0+Q3JQYWRWYWw7CisgICAgICAgIGV4dF9jdHJsWzIwXS5pZCA9IFY0TDJfQ0lEX0NPREVDX01GQzVYX0VOQ19SQ19GUkFNRV9FTkFCTEU7CisgICAgICAgIGV4dF9jdHJsWzIwXS52YWx1ZSA9IGgyNjRfYXJnLT5FbmFibGVGUk1SYXRlQ29udHJvbDsKKyAgICAgICAgZXh0X2N0cmxbMjFdLmlkID0gVjRMMl9DSURfQ09ERUNfTUZDNVhfRU5DX0gyNjRfUkNfTUJfRU5BQkxFOworICAgICAgICBleHRfY3RybFsyMV0udmFsdWUgPSBoMjY0X2FyZy0+RW5hYmxlTUJSYXRlQ29udHJvbDsKKyAgICAgICAgZXh0X2N0cmxbMjJdLmlkID0gVjRMMl9DSURfQ09ERUNfTUZDNVhfRU5DX0gyNjRfUkNfRlJBTUVfUkFURTsKKyAgICAgICAgZXh0X2N0cmxbMjJdLnZhbHVlID0gaDI2NF9hcmctPkZyYW1lUmF0ZTsKKyAgICAgICAgZXh0X2N0cmxbMjNdLmlkID0gVjRMMl9DSURfQ09ERUNfTUZDNVhfRU5DX1JDX0JJVF9SQVRFOworICAgICAgICAvKiBGSVhNRSB0ZW1wb3JhcnkgZml4ICovCisgICAgICAgIGlmIChoMjY0X2FyZy0+Qml0cmF0ZSkKKyAgICAgICAgICAgIGV4dF9jdHJsWzIzXS52YWx1ZSA9IGgyNjRfYXJnLT5CaXRyYXRlOworICAgICAgICBlbHNlCisgICAgICAgICAgICBleHRfY3RybFsyM10udmFsdWUgPSAxOyAvKiBqdXN0IGZvciB0ZXN0aW5nIE1vdmkgc3R1ZGlvICovCisgICAgICAgIGV4dF9jdHJsWzI0XS5pZCA9IFY0TDJfQ0lEX0NPREVDX01GQzVYX0VOQ19IMjY0X1JDX0ZSQU1FX1FQOworICAgICAgICBleHRfY3RybFsyNF0udmFsdWUgPSBoMjY0X2FyZy0+RnJhbWVRcDsKKyAgICAgICAgZXh0X2N0cmxbMjVdLmlkID0gIFY0TDJfQ0lEX0NPREVDX01GQzVYX0VOQ19IMjY0X1JDX1BfRlJBTUVfUVA7CisgICAgICAgIGV4dF9jdHJsWzI1XS52YWx1ZSA9IGgyNjRfYXJnLT5GcmFtZVFwX1A7CisgICAgICAgIGV4dF9jdHJsWzI2XS5pZCA9ICBWNEwyX0NJRF9DT0RFQ19NRkM1WF9FTkNfSDI2NF9SQ19CX0ZSQU1FX1FQOworICAgICAgICBleHRfY3RybFsyNl0udmFsdWUgPSBoMjY0X2FyZy0+RnJhbWVRcF9COworICAgICAgICBleHRfY3RybFsyN10uaWQgPSAgVjRMMl9DSURfQ09ERUNfTUZDNVhfRU5DX0gyNjRfUkNfTUFYX1FQOworICAgICAgICBleHRfY3RybFsyN10udmFsdWUgPSBoMjY0X2FyZy0+UVNDb2RlTWF4OworICAgICAgICBleHRfY3RybFsyOF0uaWQgPSBWNEwyX0NJRF9DT0RFQ19NRkM1WF9FTkNfSDI2NF9SQ19NSU5fUVA7CisgICAgICAgIGV4dF9jdHJsWzI4XS52YWx1ZSA9IGgyNjRfYXJnLT5RU0NvZGVNaW47CisgICAgICAgIGV4dF9jdHJsWzI5XS5pZCA9IFY0TDJfQ0lEX0NPREVDX01GQzVYX0VOQ19SQ19SRUFDVElPTl9DT0VGRjsKKyAgICAgICAgZXh0X2N0cmxbMjldLnZhbHVlID0gaDI2NF9hcmctPkNCUlBlcmlvZFJmOworICAgICAgICBleHRfY3RybFszMF0uaWQgPSAgVjRMMl9DSURfQ09ERUNfTUZDNVhfRU5DX0gyNjRfUkNfTUJfREFSSzsKKyAgICAgICAgZXh0X2N0cmxbMzBdLnZhbHVlID0gaDI2NF9hcmctPkRhcmtEaXNhYmxlOworICAgICAgICBleHRfY3RybFszMV0uaWQgPSAgVjRMMl9DSURfQ09ERUNfTUZDNVhfRU5DX0gyNjRfUkNfTUJfU01PT1RIOworICAgICAgICBleHRfY3RybFszMV0udmFsdWUgPSBoMjY0X2FyZy0+U21vb3RoRGlzYWJsZTsKKyAgICAgICAgZXh0X2N0cmxbMzJdLmlkID0gIFY0TDJfQ0lEX0NPREVDX01GQzVYX0VOQ19IMjY0X1JDX01CX1NUQVRJQzsKKyAgICAgICAgZXh0X2N0cmxbMzJdLnZhbHVlID0gaDI2NF9hcmctPlN0YXRpY0Rpc2FibGU7CisgICAgICAgIGV4dF9jdHJsWzMzXS5pZCA9ICBWNEwyX0NJRF9DT0RFQ19NRkM1WF9FTkNfSDI2NF9SQ19NQl9BQ1RJVklUWTsKKyAgICAgICAgZXh0X2N0cmxbMzNdLnZhbHVlID0gaDI2NF9hcmctPkFjdGl2aXR5RGlzYWJsZTsKKworICAgICAgICAvKiBkb2Vzbid0IGhhdmUgdG8gYmUgc2V0ICovCisgICAgICAgIGV4dF9jdHJsWzM0XS5pZCA9IFY0TDJfQ0lEX0NPREVDX01GQzVYX0VOQ19IMjY0X09QRU5fR09QOworICAgICAgICBleHRfY3RybFszNF0udmFsdWUgPSBWNEwyX0NPREVDX01GQzVYX0VOQ19TV19ESVNBQkxFOworICAgICAgICBleHRfY3RybFszNV0uaWQgPSBWNEwyX0NJRF9DT0RFQ19NRkM1WF9FTkNfSDI2NF9JX1BFUklPRDsKKyAgICAgICAgZXh0X2N0cmxbMzVdLnZhbHVlID0gMTA7CisKKyAgICAgICAgaWYgKFY0TDJfQ09ERUNfTUZDNVhfRU5DX0ZSQU1FX1NLSVBfTU9ERV9MRVZFTCA9PSBwQ1RYLT5lbmNfZnJhbWVza2lwKSB7CisgICAgICAgICAgICBleHRfY3RybFszNl0uaWQgPSBWNEwyX0NJRF9DT0RFQ19NRkM1WF9FTkNfRlJBTUVfU0tJUF9NT0RFOworICAgICAgICAgICAgZXh0X2N0cmxbMzZdLnZhbHVlID0gVjRMMl9DT0RFQ19NRkM1WF9FTkNfRlJBTUVfU0tJUF9NT0RFX0xFVkVMOworICAgICAgICB9IGVsc2UgaWYoVjRMMl9DT0RFQ19NRkM1WF9FTkNfRlJBTUVfU0tJUF9NT0RFX1ZCVl9CVUZfU0laRT09IHBDVFgtPmVuY19mcmFtZXNraXApIHsKKyAgICAgICAgICAgIGV4dF9jdHJsWzM2XS5pZCA9IFY0TDJfQ0lEX0NPREVDX01GQzVYX0VOQ19GUkFNRV9TS0lQX01PREU7CisgICAgICAgICAgICBleHRfY3RybFszNl0udmFsdWUgPSBWNEwyX0NPREVDX01GQzVYX0VOQ19GUkFNRV9TS0lQX01PREVfVkJWX0JVRl9TSVpFOworICAgICAgICB9IGVsc2UgeyAvKiBFTkNfRlJBTUVfU0tJUF9NT0RFX0RJU0FCTEUgKGRlZmF1bHQpICovCisgICAgICAgICAgICBleHRfY3RybFszNl0uaWQgPSBWNEwyX0NJRF9DT0RFQ19NRkM1WF9FTkNfRlJBTUVfU0tJUF9NT0RFOworICAgICAgICAgICAgZXh0X2N0cmxbMzZdLnZhbHVlID0gVjRMMl9DT0RFQ19NRkM1WF9FTkNfRlJBTUVfU0tJUF9NT0RFX0RJU0FCTEU7CisgICAgICAgIH0KKworICAgICAgICBleHRfY3RybFszN10uaWQgPSBWNEwyX0NJRF9DT0RFQ19NRkM1WF9FTkNfVkJWX0JVRl9TSVpFOworICAgICAgICBleHRfY3RybFszN10udmFsdWUgPSAwOworCisgICAgICAgIGV4dF9jdHJsWzM4XS5pZCA9IFY0TDJfQ0lEX0NPREVDX01GQzVYX0VOQ19TRVFfSERSX01PREU7CisgICAgICAgIGV4dF9jdHJsWzM4XS52YWx1ZSA9IDA7IC8qIDA6IHNlcGVyYXRlZCBoZWFkZXIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxOiBoZWFkZXIgKyBmaXJzdCBmcmFtZSAqLworCisgICAgICAgIGV4dF9jdHJsWzM5XS5pZCA9IFY0TDJfQ0lEX0NPREVDX01GQzVYX0VOQ19SQ19GSVhFRF9UQVJHRVRfQklUOworICAgICAgICBleHRfY3RybFszOV0udmFsdWUgPSBWNEwyX0NPREVDX01GQzVYX0VOQ19TV19FTkFCTEU7CisKKyAgICAgICAgZXh0X2N0cmxbNDBdLmlkID0gIFY0TDJfQ0lEX0NPREVDX01GQzVYX0VOQ19IMjY0X0FSX1ZVSV9FTkFCTEU7CisgICAgICAgIGV4dF9jdHJsWzQwXS52YWx1ZSA9IFY0TDJfQ09ERUNfTUZDNVhfRU5DX1NXX0RJU0FCTEU7CisgICAgICAgIGV4dF9jdHJsWzQxXS5pZCA9IFY0TDJfQ0lEX0NPREVDX01GQzVYX0VOQ19IMjY0X0FSX1ZVSV9JREM7CisgICAgICAgIGV4dF9jdHJsWzQxXS52YWx1ZSA9IDA7CisgICAgICAgIGV4dF9jdHJsWzQyXS5pZCA9IFY0TDJfQ0lEX0NPREVDX01GQzVYX0VOQ19IMjY0X0VYVF9TQVJfV0lEVEg7CisgICAgICAgIGV4dF9jdHJsWzQyXS52YWx1ZSA9IDA7CisgICAgICAgIGV4dF9jdHJsWzQzXS5pZCA9ICBWNEwyX0NJRF9DT0RFQ19NRkM1WF9FTkNfSDI2NF9FWFRfU0FSX0hFSUdIVDsKKyAgICAgICAgZXh0X2N0cmxbNDNdLnZhbHVlID0gMDsKKworICAgICAgICBicmVhazsKKworICAgIGRlZmF1bHQ6CisgICAgICAgIExPR0UoIlslc10gVW5kZWZpbmVkIGNvZGVjIHR5cGUiLF9fZnVuY19fKTsKKyAgICAgICAgcmV0ID0gTUZDX1JFVF9JTlZBTElEX1BBUkFNOworICAgICAgICBnb3RvIGVycm9yX2Nhc2UxOworICAgIH0KKworICAgIGV4dF9jdHJscy5jdHJsX2NsYXNzID0gVjRMMl9DVFJMX0NMQVNTX0NPREVDOworICAgIGlmIChwQ1RYLT5jb2RlY1R5cGUgPT0gTVBFRzRfRU5DKSB7CisgICAgICAgIGV4dF9jdHJscy5jb3VudCA9IDI3OworICAgICAgICBleHRfY3RybHMuY29udHJvbHMgPSBleHRfY3RybF9tcGVnNDsKKyAgICB9IGVsc2UgaWYgKHBDVFgtPmNvZGVjVHlwZSA9PSBIMjY0X0VOQykgeworICAgICAgICBleHRfY3RybHMuY291bnQgPSA0NDsKKyAgICAgICAgZXh0X2N0cmxzLmNvbnRyb2xzID0gZXh0X2N0cmw7CisgICAgfSBlbHNlIGlmIChwQ1RYLT5jb2RlY1R5cGUgPT0gSDI2M19FTkMpIHsKKyAgICAgICAgZXh0X2N0cmxzLmNvdW50ID0gMTk7CisgICAgICAgIGV4dF9jdHJscy5jb250cm9scyA9IGV4dF9jdHJsX2gyNjM7CisgICAgfQorCisgICAgcmV0ID0gaW9jdGwocENUWC0+aE1GQywgVklESU9DX1NfRVhUX0NUUkxTLCAmZXh0X2N0cmxzKTsKKyAgICBpZiAocmV0ICE9IDApIHsKKyAgICAgICAgTE9HRSgiWyVzXSBGYWlsZWQgdG8gc2V0IGV4dGVuZGVkIGNvbnRyb2xzIixfX2Z1bmNfXyk7CisgICAgICAgIHJldCA9IE1GQ19SRVRfRU5DX0lOSVRfRkFJTDsKKyAgICAgICAgZ290byBlcnJvcl9jYXNlMTsKKyAgICB9CisKKyAgICBtZW1zZXQoJmZtdCwgMCwgc2l6ZW9mKGZtdCkpOworICAgIGZtdC50eXBlID0gVjRMMl9CVUZfVFlQRV9WSURFT19PVVRQVVRfTVBMQU5FOworCisgICAgZm10LmZtdC5waXhfbXAud2lkdGggPSBwQ1RYLT53aWR0aDsKKyAgICBmbXQuZm10LnBpeF9tcC5oZWlnaHQgPSBwQ1RYLT5oZWlnaHQ7CisgICAgZm10LmZtdC5waXhfbXAubnVtX3BsYW5lcyA9IDI7CisgICAgZm10LmZtdC5waXhfbXAucGxhbmVfZm10WzBdLmJ5dGVzcGVybGluZSA9IEFsaWduKGZtdC5mbXQucGl4X21wLndpZHRoLCAxMjgpOworICAgIGZtdC5mbXQucGl4X21wLnBsYW5lX2ZtdFsxXS5ieXRlc3BlcmxpbmUgPSBBbGlnbihmbXQuZm10LnBpeF9tcC53aWR0aCwgMTI4KTsKKworICAgIGlmIChOVjEyX1RJTEUgPT0gcENUWC0+ZnJhbWVtYXApIHsKKyAgICAgICAgZm10LmZtdC5waXhfbXAucGl4ZWxmb3JtYXQgPSBWNEwyX1BJWF9GTVRfTlYxMk1UOyAvKiA0OjI6MCwgMiBQbGFuZXMsIDY0eDMyIFRpbGVzICovCisgICAgICAgIGZtdC5mbXQucGl4X21wLnBsYW5lX2ZtdFswXS5zaXplaW1hZ2UgPQorICAgICAgICAgICAgQWxpZ24oQWxpZ24oZm10LmZtdC5waXhfbXAud2lkdGgsIDEyOCkgKiBBbGlnbihmbXQuZm10LnBpeF9tcC5oZWlnaHQsIDMyKSwgODE5Mik7IC8qIHRpbGVkIG1vZGUgKi8KKyAgICAgICAgZm10LmZtdC5waXhfbXAucGxhbmVfZm10WzFdLnNpemVpbWFnZSA9CisgICAgICAgICAgICBBbGlnbihBbGlnbihmbXQuZm10LnBpeF9tcC53aWR0aCwgMTI4KSAqIEFsaWduKGZtdC5mbXQucGl4X21wLmhlaWdodCA+PiAxLCAzMiksIDgxOTIpOyAvKiB0aWxlZCBtb2RlICovCisgICAgfSBlbHNlIHsgLyogTlYxMl9MSU5FQVIgKGRlZmF1bHQpICovCisgICAgICAgIGZtdC5mbXQucGl4X21wLnBpeGVsZm9ybWF0ID0gVjRMMl9QSVhfRk1UX05WMTJNOyAvKiA0OjI6MCwgMiBQbGFuZXMsIGxpbmVhciAqLworICAgICAgICBmbXQuZm10LnBpeF9tcC5wbGFuZV9mbXRbMF0uc2l6ZWltYWdlID0KKyAgICAgICAgICAgIEFsaWduKChmbXQuZm10LnBpeF9tcC53aWR0aCAqIGZtdC5mbXQucGl4X21wLmhlaWdodCksIDIwNDgpOyAvKiBsaW5lYXIgbW9kZSwgMksgYWxpZ24gKi8KKyAgICAgICAgZm10LmZtdC5waXhfbXAucGxhbmVfZm10WzFdLnNpemVpbWFnZSA9CisgICAgICAgICAgICBBbGlnbigoZm10LmZtdC5waXhfbXAud2lkdGggKiAoZm10LmZtdC5waXhfbXAuaGVpZ2h0ID4+IDEpKSwgMjA0OCk7IC8qIGxpbmVhciBtb2RlLCAySyBhbGlnbiAqLworICAgIH0KKworICAgIHJldCA9IGlvY3RsKHBDVFgtPmhNRkMsIFZJRElPQ19TX0ZNVCwgJmZtdCk7CisgICAgaWYgKHJldCAhPSAwKSB7CisgICAgICAgIExPR0UoIlslc10gU19GTVQgZmFpbGVkIG9uIE1GQyBvdXRwdXQgc3RyZWFtIixfX2Z1bmNfXyk7CisgICAgICAgIHJldCA9IE1GQ19SRVRfRU5DX0lOSVRfRkFJTDsKKyAgICAgICAgZ290byBlcnJvcl9jYXNlMTsKKyAgICB9CisKKyAgICAvKiBjYXB0dXJlIChkc3QpICovCisgICAgbWVtc2V0KCZmbXQsIDAsIHNpemVvZihmbXQpKTsKKworICAgIHN3aXRjaCAocENUWC0+Y29kZWNUeXBlKSB7CisgICAgY2FzZSBIMjY0X0VOQzoKKyAgICAgICAgZm10LmZtdC5waXhfbXAucGl4ZWxmb3JtYXQgPSBWNEwyX1BJWF9GTVRfSDI2NDsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBNUEVHNF9FTkM6CisgICAgICAgIGZtdC5mbXQucGl4X21wLnBpeGVsZm9ybWF0ID0gVjRMMl9QSVhfRk1UX01QRUc0OworICAgICAgICBicmVhazsKKyAgICBjYXNlIEgyNjNfRU5DOgorICAgICAgICBmbXQuZm10LnBpeF9tcC5waXhlbGZvcm1hdCA9IFY0TDJfUElYX0ZNVF9IMjYzOworICAgICAgICBicmVhazsKKyAgICBkZWZhdWx0OgorICAgICAgICBMT0dFKCJbJXNdIENvZGVjIGhhcyBub3QgYmVlbiByZWNvZ25pc2VkIixfX2Z1bmNfXyk7CisgICAgICAgIHJldHVybiBNRkNfUkVUX0VOQ19JTklUX0ZBSUw7CisgICAgfQorCisgICAgZm10LnR5cGUgPSBWNEwyX0JVRl9UWVBFX1ZJREVPX0NBUFRVUkVfTVBMQU5FOworICAgIGZtdC5mbXQucGl4X21wLnBsYW5lX2ZtdFswXS5zaXplaW1hZ2UgPSBNQVhfU1RSRUFNX1NJWkU7CisKKyAgICByZXQgPSBpb2N0bChwQ1RYLT5oTUZDLCBWSURJT0NfU19GTVQsICZmbXQpOworICAgIGlmIChyZXQgIT0gMCkgeworICAgICAgICBMT0dFKCJbJXNdIFNfRk1UIGZhaWxlZCBvbiBNRkMgb3V0cHV0IHN0cmVhbSIsX19mdW5jX18pOworICAgICAgICByZXQgPSBNRkNfUkVUX0VOQ19JTklUX0ZBSUw7CisgICAgICAgIGdvdG8gZXJyb3JfY2FzZTE7CisgICAgfQorCisgICAgLyogY2FjaGVhYmxlIGJ1ZmZlciAqLworICAgIGN0cmwuaWQgPSBWNEwyX0NJRF9DQUNIRUFCTEU7CisgICAgaWYgKHBDVFgtPmNhY2hlYWJsZWJ1ZmZlciA9PSBOT19DQUNIRSkKKyAgICAgICAgY3RybC52YWx1ZSA9IDA7CisgICAgZWxzZQorICAgICAgICBjdHJsLnZhbHVlID0gMTsKKworICAgIHJldCA9IGlvY3RsKHBDVFgtPmhNRkMsIFZJRElPQ19TX0NUUkwsICZjdHJsKTsKKyAgICBpZiAocmV0ICE9IDApIHsKKyAgICAgICAgTE9HRSgiWyVzXSBWSURJT0NfU19DVFJMIGZhaWxlZCwgVjRMMl9DSURfQ0FDSEVBQkxFIixfX2Z1bmNfXyk7CisgICAgICAgIHJldCA9IE1GQ19SRVRfRU5DX0lOSVRfRkFJTDsKKyAgICAgICAgZ290byBlcnJvcl9jYXNlMTsKKyAgICB9CisKKyAgICAvKiBJbml0aWFsaXplIHN0cmVhbXMgZm9yIGlucHV0ICovCisgICAgbWVtc2V0KCZyZXFidWYsIDAsIHNpemVvZihyZXFidWYpKTsKKyAgICByZXFidWYuY291bnQgID0gTUZDX0VOQ19OVU1fU1JDX0JVRlM7CisgICAgcmVxYnVmLnR5cGUgICA9IFY0TDJfQlVGX1RZUEVfVklERU9fT1VUUFVUX01QTEFORTsKKyAgICBpZiAocENUWC0+djRsMl9lbmMuYklucHV0UGh5VmlyKQorICAgICAgICByZXFidWYubWVtb3J5ID0gVjRMMl9NRU1PUllfVVNFUlBUUjsKKyAgICBlbHNlCisgICAgICAgIHJlcWJ1Zi5tZW1vcnkgPSBWNEwyX01FTU9SWV9NTUFQOworCisgICAgcmV0ID0gaW9jdGwocENUWC0+aE1GQywgVklESU9DX1JFUUJVRlMsICZyZXFidWYpOworICAgIGlmIChyZXQgIT0gMCkgeworICAgICAgICBMT0dFKCJbJXNdIFJlcWJ1ZnMgc3JjIGlvY3RsIGZhaWxlZCIsX19mdW5jX18pOworICAgICAgICByZXQgPSBNRkNfUkVUX0VOQ19JTklUX0ZBSUw7CisgICAgICAgIGdvdG8gZXJyb3JfY2FzZTE7CisgICAgfQorICAgIHBDVFgtPnY0bDJfZW5jLm1mY19udW1fc3JjX2J1ZnMgID0gcmVxYnVmLmNvdW50OworCisgICAgaWYgKCFwQ1RYLT52NGwyX2VuYy5iSW5wdXRQaHlWaXIpIHsKKyAgICAgICAgLyogVGhlbiB0aGUgYnVmZmVycyBoYXZlIHRvIGJlIHF1ZXJpZWQgYW5kIG1tYXBlZCAqLworICAgICAgICBmb3IgKGkgPSAwOyAgaSA8IHBDVFgtPnY0bDJfZW5jLm1mY19udW1fc3JjX2J1ZnM7ICsraSkgeworICAgICAgICAgICAgbWVtc2V0KCZidWYsIDAsIHNpemVvZihidWYpKTsKKyAgICAgICAgICAgIGJ1Zi50eXBlID0gVjRMMl9CVUZfVFlQRV9WSURFT19PVVRQVVRfTVBMQU5FOworICAgICAgICAgICAgYnVmLm1lbW9yeSA9IFY0TDJfTUVNT1JZX01NQVA7CisgICAgICAgICAgICBidWYuaW5kZXggPSBpOworICAgICAgICAgICAgYnVmLm0ucGxhbmVzID0gcGxhbmVzOworICAgICAgICAgICAgYnVmLmxlbmd0aCA9IDI7CisKKyAgICAgICAgICAgIHJldCA9IGlvY3RsKHBDVFgtPmhNRkMsIFZJRElPQ19RVUVSWUJVRiwgJmJ1Zik7CisgICAgICAgICAgICBpZiAocmV0ICE9IDApIHsKKyAgICAgICAgICAgICAgICBMT0dFKCJbJXNdIFF1ZXJ5YnVmIHNyYyBpb2N0bCBmYWlsZWQiLF9fZnVuY19fKTsKKyAgICAgICAgICAgICAgICByZXQgPSBNRkNfUkVUX0VOQ19JTklUX0ZBSUw7CisgICAgICAgICAgICAgICAgZ290byBlcnJvcl9jYXNlMjsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgcENUWC0+djRsMl9lbmMubWZjX3NyY19idWZzX2xlblswXSA9IGJ1Zi5tLnBsYW5lc1swXS5sZW5ndGg7CisgICAgICAgICAgICBwQ1RYLT52NGwyX2VuYy5tZmNfc3JjX2J1ZnNfbGVuWzFdID0gYnVmLm0ucGxhbmVzWzFdLmxlbmd0aDsKKworICAgICAgICAgICAgcENUWC0+djRsMl9lbmMubWZjX3NyY19waHlzW2ldWzBdID0gYnVmLm0ucGxhbmVzWzBdLmNvb2tpZTsKKyAgICAgICAgICAgIHBDVFgtPnY0bDJfZW5jLm1mY19zcmNfcGh5c1tpXVsxXSA9IGJ1Zi5tLnBsYW5lc1sxXS5jb29raWU7CisKKyAgICAgICAgICAgIHBDVFgtPnY0bDJfZW5jLm1mY19zcmNfYnVmc1tpXVswXSA9CisgICAgICAgICAgICAgICAgbW1hcChOVUxMLCBidWYubS5wbGFuZXNbMF0ubGVuZ3RoLCBQUk9UX1JFQUQgfCBQUk9UX1dSSVRFLAorICAgICAgICAgICAgICAgIE1BUF9TSEFSRUQsIHBDVFgtPmhNRkMsIGJ1Zi5tLnBsYW5lc1swXS5tLm1lbV9vZmZzZXQpOworICAgICAgICAgICAgaWYgKHBDVFgtPnY0bDJfZW5jLm1mY19zcmNfYnVmc1tpXVswXSA9PSBNQVBfRkFJTEVEKSB7CisgICAgICAgICAgICAgICAgTE9HRSgiWyVzXSBNbWFwIG9uIHNyYyBidWZmZXIgKDApIGZhaWxlZCIsX19mdW5jX18pOworICAgICAgICAgICAgICAgIHJldCA9IE1GQ19SRVRfRU5DX0lOSVRfRkFJTDsKKyAgICAgICAgICAgICAgICBnb3RvIGVycm9yX2Nhc2UyOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBwQ1RYLT52NGwyX2VuYy5tZmNfc3JjX2J1ZnNbaV1bMV0gPQorICAgICAgICAgICAgICAgIG1tYXAoTlVMTCwgYnVmLm0ucGxhbmVzWzFdLmxlbmd0aCwgUFJPVF9SRUFEIHwgUFJPVF9XUklURSwKKyAgICAgICAgICAgICAgICBNQVBfU0hBUkVELCBwQ1RYLT5oTUZDLCBidWYubS5wbGFuZXNbMV0ubS5tZW1fb2Zmc2V0KTsKKyAgICAgICAgICAgIGlmIChwQ1RYLT52NGwyX2VuYy5tZmNfc3JjX2J1ZnNbaV1bMV0gPT0gTUFQX0ZBSUxFRCkgeworICAgICAgICAgICAgICAgIG11bm1hcChwQ1RYLT52NGwyX2VuYy5tZmNfc3JjX2J1ZnNbaV1bMF0sIHBDVFgtPnY0bDJfZW5jLm1mY19zcmNfYnVmc19sZW5bMF0pOworICAgICAgICAgICAgICAgIExPR0UoIlslc10gTW1hcCBvbiBzcmMgYnVmZmVyICgxKSBmYWlsZWQiLF9fZnVuY19fKTsKKyAgICAgICAgICAgICAgICByZXQgPSBNRkNfUkVUX0VOQ19JTklUX0ZBSUw7CisgICAgICAgICAgICAgICAgZ290byBlcnJvcl9jYXNlMjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0gZWxzZQorICAgICAgICBMT0dWKCJbJXNdIENhbWVyYSBQaHlzIHNyYyBidWYgJWQiLF9fZnVuY19fLHJlcWJ1Zi5jb3VudCk7CisKKyAgICBmb3IgKGkgPSAwOyBpPHBDVFgtPnY0bDJfZW5jLm1mY19udW1fc3JjX2J1ZnM7IGkrKykKKyAgICAgICAgcENUWC0+djRsMl9lbmMubWZjX3NyY19idWZfZmxhZ3NbaV0gPSBCVUZfREVRVUVVRUQ7CisKKyAgICBwQ1RYLT52NGwyX2VuYy5iZWluZ1VzZWRJbmRleCA9IDA7CisKKyAgICBwQ1RYLT5zaXplRnJtQnVmLmx1bWEgPSAodW5zaWduZWQgaW50KShwQ1RYLT53aWR0aCAqIHBDVFgtPmhlaWdodCk7CisgICAgcENUWC0+c2l6ZUZybUJ1Zi5jaHJvbWEgPSAodW5zaWduZWQgaW50KSgocENUWC0+d2lkdGggKiBwQ1RYLT5oZWlnaHQpID4+IDEpOworICAgIHBDVFgtPmludGVyX2J1ZmZfc3RhdHVzIHw9IE1GQ19VU0VfWVVWX0JVRkY7CisKKyAgICAvKiBJbml0aWFsaXplIHN0cmVhbSBmb3Igb3V0cHV0ICovCisgICAgbWVtc2V0KCZyZXFidWYsIDAsIHNpemVvZihyZXFidWYpKTsKKyAgICByZXFidWYuY291bnQgID0gTUZDX0VOQ19NQVhfRFNUX0JVRlM7CisgICAgcmVxYnVmLnR5cGUgICA9IFY0TDJfQlVGX1RZUEVfVklERU9fQ0FQVFVSRV9NUExBTkU7CisgICAgcmVxYnVmLm1lbW9yeSA9IFY0TDJfTUVNT1JZX01NQVA7CisKKyAgICByZXQgPSBpb2N0bChwQ1RYLT5oTUZDLCBWSURJT0NfUkVRQlVGUywgJnJlcWJ1Zik7CisgICAgaWYgKHJldCAhPSAwKSB7CisgICAgICAgIExPR0UoIlslc10gUmVxYnVmcyBkc3QgaW9jdGwgZmFpbGVkIixfX2Z1bmNfXyk7CisgICAgICAgIHJldCA9IE1GQ19SRVRfRU5DX0lOSVRfRkFJTDsKKyAgICAgICAgZ290byBlcnJvcl9jYXNlMjsKKyAgICB9CisKKyAgICBwQ1RYLT52NGwyX2VuYy5tZmNfbnVtX2RzdF9idWZzICAgPSByZXFidWYuY291bnQ7CisKKyAgICBmb3IgKGkgPSAwOyBpPE1GQ19FTkNfTUFYX0RTVF9CVUZTOyArK2kpIHsKKyAgICAgICAgbWVtc2V0KCZidWYsIDAsIHNpemVvZihidWYpKTsKKyAgICAgICAgYnVmLnR5cGUgPSBWNEwyX0JVRl9UWVBFX1ZJREVPX0NBUFRVUkVfTVBMQU5FOworICAgICAgICBidWYubWVtb3J5ID0gVjRMMl9NRU1PUllfTU1BUDsKKyAgICAgICAgYnVmLmluZGV4ID0gaTsKKyAgICAgICAgYnVmLm0ucGxhbmVzID0gcGxhbmVzOworICAgICAgICBidWYubGVuZ3RoID0gMTsKKworICAgICAgICByZXQgPSBpb2N0bChwQ1RYLT5oTUZDLCBWSURJT0NfUVVFUllCVUYsICZidWYpOworICAgICAgICBpZiAocmV0ICE9IDApIHsKKyAgICAgICAgICAgIExPR0UoIlslc10gUXVlcnlidWYgZHN0IGlvY3RsIGZhaWxlZCIsX19mdW5jX18pOworICAgICAgICAgICAgcmV0ID0gTUZDX1JFVF9FTkNfSU5JVF9GQUlMOworICAgICAgICAgICAgZ290byBlcnJvcl9jYXNlMzsKKyAgICAgICAgfQorCisgICAgICAgIHBDVFgtPnY0bDJfZW5jLm1mY19kc3RfYnVmc19sZW4gPSBidWYubS5wbGFuZXNbMF0ubGVuZ3RoOworICAgICAgICBwQ1RYLT52NGwyX2VuYy5tZmNfZHN0X2J1ZnNbaV0gPQorICAgICAgICAgICAgICAgIG1tYXAoTlVMTCwgYnVmLm0ucGxhbmVzWzBdLmxlbmd0aCwgUFJPVF9SRUFEIHwgUFJPVF9XUklURSwKKyAgICAgICAgICAgICAgICBNQVBfU0hBUkVELCBwQ1RYLT5oTUZDLCBidWYubS5wbGFuZXNbMF0ubS5tZW1fb2Zmc2V0KTsKKyAgICAgICAgaWYgKHBDVFgtPnY0bDJfZW5jLm1mY19kc3RfYnVmc1tpXSA9PSBNQVBfRkFJTEVEKSB7CisgICAgICAgICAgICBMT0dFKCJbJXNdIE1tYXAgb24gZHN0IGJ1ZmZlciBmYWlsZWQiLF9fZnVuY19fKTsKKyAgICAgICAgICAgIHJldCA9IE1GQ19SRVRfRU5DX0lOSVRfRkFJTDsKKyAgICAgICAgICAgIGdvdG8gZXJyb3JfY2FzZTM7CisgICAgICAgIH0KKworICAgICAgICByZXQgPSBpb2N0bChwQ1RYLT5oTUZDLCBWSURJT0NfUUJVRiwgJmJ1Zik7CisgICAgICAgIGlmIChyZXQgIT0gMCkgeworICAgICAgICAgICAgTE9HRSgiWyVzXSBWSURJT0NfUUJVRiBmYWlsZWQsIFY0TDJfQlVGX1RZUEVfVklERU9fQ0FQVFVSRV9NUExBTkUiLF9fZnVuY19fKTsKKyAgICAgICAgICAgIHJldCA9IE1GQ19SRVRfRU5DX0lOSVRfRkFJTDsKKyAgICAgICAgICAgIGdvdG8gZXJyb3JfY2FzZTM7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwQ1RYLT5zaXplU3RybUJ1ZiA9IE1BWF9FTkNPREVSX09VVFBVVF9CVUZGRVJfU0laRTsKKyAgICBwQ1RYLT5pbnRlcl9idWZmX3N0YXR1cyB8PSBNRkNfVVNFX1NUUk1fQlVGRjsKKworICAgIHR5cGUgPSBWNEwyX0JVRl9UWVBFX1ZJREVPX0NBUFRVUkVfTVBMQU5FOworCisgICAgcmV0ID0gaW9jdGwocENUWC0+aE1GQywgVklESU9DX1NUUkVBTU9OLCAmdHlwZSk7CisgICAgaWYgKHJldCAhPSAwKSB7CisgICAgICAgIExPR0UoIlslc10gVjRMMl9CVUZfVFlQRV9WSURFT19DQVBUVVJFX01QTEFORSwgVklESU9DX1NUUkVBTU9OIGZhaWxlZCIsX19mdW5jX18pOworICAgICAgICByZXQgPSBNRkNfUkVUX0VOQ19JTklUX0ZBSUw7CisgICAgICAgIGdvdG8gZXJyb3JfY2FzZTM7CisgICAgfQorCisgICAgbWVtc2V0KCZidWYsIDAsIHNpemVvZihidWYpKTsKKyAgICBidWYudHlwZSA9IFY0TDJfQlVGX1RZUEVfVklERU9fQ0FQVFVSRV9NUExBTkU7CisgICAgYnVmLm1lbW9yeSA9IFY0TDJfTUVNT1JZX01NQVA7CisgICAgYnVmLm0ucGxhbmVzID0gcGxhbmVzOworICAgIGJ1Zi5sZW5ndGggPSAxOworCisgICAgLyogbm90ZTogI2RlZmluZSBQT0xMT1VUIDB4MDAwNCAqLworICAgIHBvbGxfZXZlbnRzLmZkID0gcENUWC0+aE1GQzsKKyAgICBwb2xsX2V2ZW50cy5ldmVudHMgPSBQT0xMSU4gfCBQT0xMRVJSOworICAgIHBvbGxfZXZlbnRzLnJldmVudHMgPSAwOworCisgICAgLyogd2FpdCBmb3IgaGVhZGVyIGVuY29kaW5nICovCisgICAgZG8geworICAgICAgICBwb2xsX3N0YXRlID0gcG9sbCgoc3RydWN0IHBvbGxmZCopJnBvbGxfZXZlbnRzLCAxLCBQT0xMX0VOQ19XQUlUX1RJTUVPVVQpOworICAgICAgICBpZiAoMCA8IHBvbGxfc3RhdGUpIHsKKyAgICAgICAgICAgIGlmIChwb2xsX2V2ZW50cy5yZXZlbnRzICYgUE9MTElOKSB7IC8qIFBPTExJTiAqLworICAgICAgICAgICAgICAgIHJldCA9IGlvY3RsKHBDVFgtPmhNRkMsIFZJRElPQ19EUUJVRiwgJmJ1Zik7CisgICAgICAgICAgICAgICAgaWYgKHJldCA9PSAwKQorICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0gZWxzZSBpZihwb2xsX2V2ZW50cy5yZXZlbnRzICYgUE9MTEVSUikgeyAvKlBPTExFUlIgKi8KKyAgICAgICAgICAgICAgICBMT0dFKCJbJXNdIFBPTExFUlJcbiIsX19mdW5jX18pOworICAgICAgICAgICAgICAgIHJldCA9IE1GQ19SRVRfRU5DX0lOSVRfRkFJTDsKKyAgICAgICAgICAgICAgICBnb3RvIGVycm9yX2Nhc2UzOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBMT0dFKCJbJXNdIHBvbGwoKSByZXR1cm5zIDB4JXhcbiIsX19mdW5jX18sIHBvbGxfZXZlbnRzLnJldmVudHMpOworICAgICAgICAgICAgICAgIHJldCA9IE1GQ19SRVRfRU5DX0lOSVRfRkFJTDsKKyAgICAgICAgICAgICAgICBnb3RvIGVycm9yX2Nhc2UzOworICAgICAgICAgICAgfQorICAgICAgICB9IGVsc2UgaWYoMCA+IHBvbGxfc3RhdGUpIHsKKyAgICAgICAgICAgIHJldCA9IE1GQ19SRVRfRU5DX0lOSVRfRkFJTDsKKyAgICAgICAgICAgIGdvdG8gZXJyb3JfY2FzZTM7CisgICAgICAgIH0KKyAgICB9IHdoaWxlICgwID09IHBvbGxfc3RhdGUpOworCisgICAgcENUWC0+djRsMl9lbmMubWZjX2RzdF9idWZzX2J5dGVzX3VzZWRfbGVuID0gYnVmLm0ucGxhbmVzWzBdLmJ5dGVzdXNlZDsKKyAgICBwQ1RYLT52aXJTdHJtQnVmID0gcENUWC0+djRsMl9lbmMubWZjX2RzdF9idWZzW2J1Zi5pbmRleF07CisKKyAgICAvKiBzdHJlYW0gZGVxdWV1ZWQgaW5kZXggKi8KKyAgICBpbmRleCA9IGJ1Zi5pbmRleDsKKyAgICBtZW1zZXQoJmJ1ZiwgMCwgc2l6ZW9mKGJ1ZikpOworICAgIGJ1Zi50eXBlID0gVjRMMl9CVUZfVFlQRV9WSURFT19DQVBUVVJFX01QTEFORTsKKyAgICBidWYubWVtb3J5ID0gVjRMMl9NRU1PUllfTU1BUDsKKyAgICBidWYuaW5kZXggPSBpbmRleDsKKyAgICBidWYubS5wbGFuZXMgPSBwbGFuZXM7CisgICAgYnVmLmxlbmd0aCA9IDE7CisKKyAgICByZXQgPSBpb2N0bChwQ1RYLT5oTUZDLCBWSURJT0NfUUJVRiwgJmJ1Zik7CisgICAgaWYgKHJldCAhPSAwKSB7CisgICAgICAgIExPR0UoIlslc10gVklESU9DX1FCVUYgZmFpbGVkLCBWNEwyX0JVRl9UWVBFX1ZJREVPX0NBUFRVUkVfTVBMQU5FIixfX2Z1bmNfXyk7CisgICAgICAgIHJldCA9IE1GQ19SRVRfRU5DX0lOSVRfRkFJTDsKKyAgICAgICAgZ290byBlcnJvcl9jYXNlMzsKKyAgICB9CisgICAgTE9HVigiWyVzXSBTdHJtIG91dCBpZHggJWQiLF9fZnVuY19fLGluZGV4KTsKKworICAgIHJldHVybiBNRkNfUkVUX09LOworZXJyb3JfY2FzZTM6CisgICAgZm9yIChqID0gMDsgaiA8IGk7IGorKykKKyAgICAgICAgbXVubWFwKHBDVFgtPnY0bDJfZW5jLm1mY19kc3RfYnVmc1tqXSwgcENUWC0+djRsMl9lbmMubWZjX2RzdF9idWZzX2xlbik7CisKKyAgICBpID0gcENUWC0+djRsMl9lbmMubWZjX251bV9zcmNfYnVmczsKK2Vycm9yX2Nhc2UyOgorICAgIGlmICghcENUWC0+djRsMl9lbmMuYklucHV0UGh5VmlyKSB7CisgICAgICAgIGZvciAoaiA9IDA7IGogPCBpOyBqKyspIHsKKyAgICAgICAgICAgIG11bm1hcChwQ1RYLT52NGwyX2VuYy5tZmNfc3JjX2J1ZnNbal1bMF0sIHBDVFgtPnY0bDJfZW5jLm1mY19zcmNfYnVmc19sZW5bMF0pOworICAgICAgICAgICAgbXVubWFwKHBDVFgtPnY0bDJfZW5jLm1mY19zcmNfYnVmc1tqXVsxXSwgcENUWC0+djRsMl9lbmMubWZjX3NyY19idWZzX2xlblsxXSk7CisgICAgICAgIH0KKyAgICB9CitlcnJvcl9jYXNlMToKKyAgICByZXR1cm4gcmV0OworfQorCitTU0JTSVBfTUZDX0VSUk9SX0NPREUgU3NiU2lwTWZjRW5jR2V0SW5CdWYodm9pZCAqb3BlbkhhbmRsZSwgU1NCU0lQX01GQ19FTkNfSU5QVVRfSU5GTyAqaW5wdXRfaW5mbykKK3sKKyAgICBfTUZDTElCICpwQ1RYOworICAgIGludCBpOworCisgICAgaWYgKG9wZW5IYW5kbGUgPT0gTlVMTCkgeworICAgICAgICBMT0dFKCJbJXNdIG9wZW5IYW5kbGUgaXMgTlVMTFxuIixfX2Z1bmNfXyk7CisgICAgICAgIHJldHVybiBNRkNfUkVUX0lOVkFMSURfUEFSQU07CisgICAgfQorCisgICAgcENUWCAgPSAoX01GQ0xJQiAqKSBvcGVuSGFuZGxlOworCisgICAgaWYgKHBDVFgtPnY0bDJfZW5jLmJJbnB1dFBoeVZpcikgeworICAgICAgICBpbnB1dF9pbmZvLT5ZUGh5QWRkciA9ICh2b2lkKikwOworICAgICAgICBpbnB1dF9pbmZvLT5DUGh5QWRkciA9ICh2b2lkKikwOworICAgICAgICBpbnB1dF9pbmZvLT5ZVmlyQWRkciA9ICh2b2lkKikwOworICAgICAgICBpbnB1dF9pbmZvLT5DVmlyQWRkciA9ICh2b2lkKikwOworCisgICAgICAgIGlmIChOVjEyX1RJTEUgPT0gcENUWC0+ZnJhbWVtYXApIHsKKyAgICAgICAgICAgIC8qIDQ6MjowLCAyIFBsYW5lcywgNjR4MzIgVGlsZXMgKi8KKyAgICAgICAgICAgIGlucHV0X2luZm8tPllTaXplID0gQWxpZ24oQWxpZ24ocENUWC0+d2lkdGgsIDEyOCkgKiBBbGlnbihwQ1RYLT5oZWlnaHQsIDMyKSwgODE5Mik7IC8qIHRpbGVkIG1vZGUgKi8KKyAgICAgICAgICAgIGlucHV0X2luZm8tPkNTaXplID0gQWxpZ24oQWxpZ24ocENUWC0+d2lkdGgsIDEyOCkgKiBBbGlnbihwQ1RYLT5oZWlnaHQgPj4gMSwgMzIpLCA4MTkyKTsgLyogdGlsZWQgbW9kZSAqLworICAgICAgICB9IGVsc2UgeyAvKiBOVjEyX0xJTkVBUiAoZGVmYXVsdCkgKi8KKyAgICAgICAgICAgIC8qIDQ6MjowLCAyIFBsYW5lcywgbGluZWFyICovCisgICAgICAgICAgICBpbnB1dF9pbmZvLT5ZU2l6ZSA9IEFsaWduKEFsaWduKHBDVFgtPndpZHRoLCAxNikgKiBBbGlnbihwQ1RYLT5oZWlnaHQsIDE2KSwgMjA0OCk7IC8qIHdpZHRoID0gMTZCLCBoZWlnaHQgPSAxNkIgYWxpZ24gKi8KKyAgICAgICAgICAgIGlucHV0X2luZm8tPkNTaXplID0gQWxpZ24oQWxpZ24ocENUWC0+d2lkdGgsIDE2KSAqIEFsaWduKHBDVFgtPmhlaWdodCA+PiAxLCA4KSwgMjA0OCk7IC8qIHdpZHRoID0gMTZCLCBoZWlnaHQgPSA4QiBhbGlnbiAqLworICAgICAgICB9CisgICAgfSBlbHNlIHsKKyAgICAgICAgZm9yIChpID0gMDsgaSA8IHBDVFgtPnY0bDJfZW5jLm1mY19udW1fc3JjX2J1ZnM7IGkrKykKKyAgICAgICAgICAgIGlmIChCVUZfREVRVUVVRUQgPT0gcENUWC0+djRsMl9lbmMubWZjX3NyY19idWZfZmxhZ3NbaV0pCisgICAgICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgaWYgKGkgPT0gcENUWC0+djRsMl9lbmMubWZjX251bV9zcmNfYnVmcykgeworICAgICAgICAgICAgTE9HVigiWyVzXSBObyBidWZmZXIgaXMgYXZhaWxhYmxlLiIsX19mdW5jX18pOworICAgICAgICAgICAgcmV0dXJuIE1GQ19SRVRfRU5DX0dFVF9JTkJVRl9GQUlMOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgLyogRklYTUUgY2hlY2sgdGhpcyBmb3IgY29ycmVjdCBwaHlzaWNhbCBhZGRyZXNzICovCisgICAgICAgICAgICBpbnB1dF9pbmZvLT5ZUGh5QWRkciA9ICh2b2lkKilwQ1RYLT52NGwyX2VuYy5tZmNfc3JjX3BoeXNbaV1bMF07CisgICAgICAgICAgICBpbnB1dF9pbmZvLT5DUGh5QWRkciA9ICh2b2lkKilwQ1RYLT52NGwyX2VuYy5tZmNfc3JjX3BoeXNbaV1bMV07CisgICAgICAgICAgICBpbnB1dF9pbmZvLT5ZVmlyQWRkciA9ICh2b2lkKilwQ1RYLT52NGwyX2VuYy5tZmNfc3JjX2J1ZnNbaV1bMF07CisgICAgICAgICAgICBpbnB1dF9pbmZvLT5DVmlyQWRkciA9ICh2b2lkKilwQ1RYLT52NGwyX2VuYy5tZmNfc3JjX2J1ZnNbaV1bMV07CisgICAgICAgICAgICBpbnB1dF9pbmZvLT5ZU2l6ZSA9IChpbnQpcENUWC0+djRsMl9lbmMubWZjX3NyY19idWZzX2xlblswXTsKKyAgICAgICAgICAgIGlucHV0X2luZm8tPkNTaXplID0gKGludClwQ1RYLT52NGwyX2VuYy5tZmNfc3JjX2J1ZnNfbGVuWzFdOworCisgICAgICAgICAgICBwQ1RYLT52NGwyX2VuYy5tZmNfc3JjX2J1Zl9mbGFnc1tpXSA9IEJVRl9FTlFVRVVFRDsKKyAgICAgICAgfQorICAgIH0KKyAgICBMT0dWKCJbJXNdIElucHV0IEJ1ZmZlciBpZHggJWQiLF9fZnVuY19fLGkpOworICAgIHJldHVybiBNRkNfUkVUX09LOworfQorCisKK1NTQlNJUF9NRkNfRVJST1JfQ09ERSBTc2JTaXBNZmNFbmNTZXRJbkJ1Zih2b2lkICpvcGVuSGFuZGxlLCBTU0JTSVBfTUZDX0VOQ19JTlBVVF9JTkZPICppbnB1dF9pbmZvKQoreworICAgIF9NRkNMSUIgKnBDVFg7CisgICAgc3RydWN0IHY0bDJfYnVmZmVyIHFidWY7CisgICAgc3RydWN0IHY0bDJfcGxhbmUgcGxhbmVzW01GQ19FTkNfTlVNX1BMQU5FU107CisgICAgaW50IHJldCxpOworCisgICAgaWYgKG9wZW5IYW5kbGUgPT0gTlVMTCkgeworICAgICAgICBMT0dFKCJbJXNdIG9wZW5IYW5kbGUgaXMgTlVMTFxuIixfX2Z1bmNfXyk7CisgICAgICAgIHJldHVybiBNRkNfUkVUX0lOVkFMSURfUEFSQU07CisgICAgfQorCisgICAgcENUWCAgPSAoX01GQ0xJQiAqKSBvcGVuSGFuZGxlOworCisgICAgbWVtc2V0KCZxYnVmLCAwLCBzaXplb2YocWJ1ZikpOworICAgIGlmIChwQ1RYLT52NGwyX2VuYy5iSW5wdXRQaHlWaXIpIHsKKyAgICAgICAgcWJ1Zi5tZW1vcnkgPSBWNEwyX01FTU9SWV9VU0VSUFRSOworICAgICAgICBxYnVmLmluZGV4ID0gcENUWC0+djRsMl9lbmMuYmVpbmdVc2VkSW5kZXg7CisgICAgICAgIHBsYW5lc1swXS5tLnVzZXJwdHIgPSAodW5zaWduZWQgbG9uZylpbnB1dF9pbmZvLT5ZUGh5QWRkcjsKKyAgICAgICAgcGxhbmVzWzBdLmxlbmd0aCA9IGlucHV0X2luZm8tPllTaXplOworICAgICAgICBwbGFuZXNbMF0uYnl0ZXN1c2VkID0gaW5wdXRfaW5mby0+WVNpemU7CisgICAgICAgIHBsYW5lc1sxXS5tLnVzZXJwdHIgPSAodW5zaWduZWQgbG9uZylpbnB1dF9pbmZvLT5DUGh5QWRkcjsKKyAgICAgICAgcGxhbmVzWzFdLmxlbmd0aCA9IGlucHV0X2luZm8tPkNTaXplOworICAgICAgICBwbGFuZXNbMV0uYnl0ZXN1c2VkID0gaW5wdXRfaW5mby0+Q1NpemU7CisKKyAgICAgICAgLyogRklYTUUsIHRoaXMgaXMgb25seSBmb3IgY2FzZSBvZiBub3QgdXNpbmcgQiBmcmFtZSwKKyAgICAgICAgQ2FtZXJhIHNpZGUgc2hvdWxkIGtub3cgd2hpY2ggYnVmZmVyIGlzIHF1ZXVlZCgpIHJlZmVyaW5nIHRvIGluZGV4IG9mCisgICAgICAgIE1GQyBkcWJ1ZigpICovCisgICAgICAgIHBDVFgtPnY0bDJfZW5jLmJlaW5nVXNlZEluZGV4Kys7CisgICAgICAgIHBDVFgtPnY0bDJfZW5jLmJlaW5nVXNlZEluZGV4ICU9IE1GQ19FTkNfTlVNX1NSQ19CVUZTOworICAgICAgICBMT0dWKCJbJXNdIFBoeSBJbnB1dCBCdWZmZXIgaWR4IFF1ZXVlZCAlZCIsX19mdW5jX18scENUWC0+djRsMl9lbmMuYmVpbmdVc2VkSW5kZXgpOworICAgIH0gZWxzZSB7CisgICAgICAgIGZvciAoaSA9IDA7IGkgPCBwQ1RYLT52NGwyX2VuYy5tZmNfbnVtX3NyY19idWZzOyBpKyspCisgICAgICAgICAgICBpZiAocENUWC0+djRsMl9lbmMubWZjX3NyY19idWZzW2ldWzBdID09IGlucHV0X2luZm8tPllWaXJBZGRyKQorICAgICAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgIGlmIChpID09IHBDVFgtPnY0bDJfZW5jLm1mY19udW1fc3JjX2J1ZnMpIHsKKyAgICAgICAgICAgIExPR0UoIlslc10gQ2FuIG5vdCB1c2UgdGhlIGJ1ZmZlciIsX19mdW5jX18pOworICAgICAgICAgICAgcmV0dXJuIE1GQ19SRVRfSU5WQUxJRF9QQVJBTTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHBDVFgtPnY0bDJfZW5jLmJlaW5nVXNlZEluZGV4ID0gaTsKKyAgICAgICAgICAgIC8vcENUWC0+djRsMl9lbmMubWZjX3NyY19idWZfZmxhZ3NbaV0gPSBCVUZfRU5RVUVVRUQ7CisgICAgICAgIH0KKyAgICAgICAgcWJ1Zi5tZW1vcnkgPSBWNEwyX01FTU9SWV9NTUFQOworICAgICAgICBxYnVmLmluZGV4ID0gcENUWC0+djRsMl9lbmMuYmVpbmdVc2VkSW5kZXg7CisgICAgICAgIHBsYW5lc1swXS5ieXRlc3VzZWQgPSBwQ1RYLT53aWR0aCAqIHBDVFgtPmhlaWdodDsKKyAgICAgICAgcGxhbmVzWzFdLmJ5dGVzdXNlZCA9IChwQ1RYLT53aWR0aCAqIHBDVFgtPmhlaWdodCkgPj4gMTsKKyAgICAgICAgTE9HVigiWyVzXSBJbnB1dCBCdWZmZXIgaWR4IFF1ZXVlZCAlZCIsX19mdW5jX18scENUWC0+djRsMl9lbmMuYmVpbmdVc2VkSW5kZXgpOworICAgIH0KKworICAgIHFidWYudHlwZSA9IFY0TDJfQlVGX1RZUEVfVklERU9fT1VUUFVUX01QTEFORTsKKyAgICBxYnVmLm0ucGxhbmVzID0gcGxhbmVzOworICAgIHFidWYubGVuZ3RoID0gMjsKKworICAgIHJldCA9IGlvY3RsKHBDVFgtPmhNRkMsIFZJRElPQ19RQlVGLCAmcWJ1Zik7CisgICAgaWYgKHJldCAhPSAwKSB7CisgICAgICAgIExPR0UoIlslc10gVklESU9DX1FCVUYgZmFpbGVkLCBWNEwyX0JVRl9UWVBFX1ZJREVPX09VVFBVVF9NUExBTkUiLF9fZnVuY19fKTsKKyAgICAgICAgcmV0dXJuIE1GQ19SRVRfRU5DX1NFVF9JTkJVRl9GQUlMOworICAgIH0KKworICAgIHJldHVybiBNRkNfUkVUX09LOworfQorCitTU0JTSVBfTUZDX0VSUk9SX0NPREUgU3NiU2lwTWZjRW5jR2V0T3V0QnVmKHZvaWQgKm9wZW5IYW5kbGUsIFNTQlNJUF9NRkNfRU5DX09VVFBVVF9JTkZPICpvdXRwdXRfaW5mbykKK3sKKyAgICBfTUZDTElCICpwQ1RYOworCisgICAgaWYgKG9wZW5IYW5kbGUgPT0gTlVMTCkgeworICAgICAgICBMT0dFKCJbJXNdIG9wZW5IYW5kbGUgaXMgTlVMTFxuIixfX2Z1bmNfXyk7CisgICAgICAgIHJldHVybiBNRkNfUkVUX0lOVkFMSURfUEFSQU07CisgICAgfQorCisgICAgcENUWCA9IChfTUZDTElCICopIG9wZW5IYW5kbGU7CisKKyAgICBpZiAocENUWC0+djRsMl9lbmMuYlJ1bm5pbmcgPT0gMCkgeworICAgICAgICBwQ1RYLT5lbmNvZGVkSGVhZGVyU2l6ZSA9IHBDVFgtPnY0bDJfZW5jLm1mY19kc3RfYnVmc19ieXRlc191c2VkX2xlbjsKKyAgICAgICAgb3V0cHV0X2luZm8tPmRhdGFTaXplID0gMDsKKyAgICB9IGVsc2UgeworICAgICAgICBvdXRwdXRfaW5mby0+ZGF0YVNpemUgPSBwQ1RYLT52NGwyX2VuYy5tZmNfZHN0X2J1ZnNfYnl0ZXNfdXNlZF9sZW47CisgICAgfQorCisgICAgb3V0cHV0X2luZm8tPmhlYWRlclNpemUgPSBwQ1RYLT5lbmNvZGVkSGVhZGVyU2l6ZTsKKyAgICBvdXRwdXRfaW5mby0+ZnJhbWVUeXBlID0gcENUWC0+ZW5jb2RlZGZyYW1lVHlwZTsKKyAgICBvdXRwdXRfaW5mby0+U3RybVBoeUFkZHIgPSAodm9pZCAqKTA7CisgICAgb3V0cHV0X2luZm8tPlN0cm1WaXJBZGRyID0gKHZvaWQgKilwQ1RYLT52aXJTdHJtQnVmOworICAgIG91dHB1dF9pbmZvLT5lbmNvZGVkWVBoeUFkZHIgPSAodm9pZCopMDsKKyAgICBvdXRwdXRfaW5mby0+ZW5jb2RlZENQaHlBZGRyID0gKHZvaWQqKTA7CisKKyAgICByZXR1cm4gTUZDX1JFVF9PSzsKK30KKworU1NCU0lQX01GQ19FUlJPUl9DT0RFIFNzYlNpcE1mY0VuY1NldE91dEJ1Zih2b2lkICpvcGVuSGFuZGxlLCB2b2lkICpwaHlPdXRidWYsIHZvaWQgKnZpck91dGJ1ZiwgaW50IG91dHB1dEJ1ZmZlclNpemUpCit7CisgICAgaWYgKG9wZW5IYW5kbGUgPT0gTlVMTCkgeworICAgICAgICBMT0dFKCJbJXNdIG9wZW5IYW5kbGUgaXMgTlVMTFxuIixfX2Z1bmNfXyk7CisgICAgICAgIHJldHVybiBNRkNfUkVUX0lOVkFMSURfUEFSQU07CisgICAgfQorCisgICAgcmV0dXJuIE1GQ19SRVRfRU5DX1NFVF9PVVRCVUZfRkFJTDsKK30KKworU1NCU0lQX01GQ19FUlJPUl9DT0RFIFNzYlNpcE1mY0VuY0V4ZSh2b2lkICpvcGVuSGFuZGxlKQoreworICAgIGludCByZXQ7CisgICAgaW50IGRlcXVldWVkX2luZGV4OworICAgIGludCBsb29wY250ID0gMDsKKyAgICBfTUZDTElCICpwQ1RYOworCisgICAgc3RydWN0IHY0bDJfYnVmZmVyIHFidWY7CisgICAgc3RydWN0IHY0bDJfcGxhbmUgcGxhbmVzW01GQ19FTkNfTlVNX1BMQU5FU107CisgICAgZW51bSB2NGwyX2J1Zl90eXBlIHR5cGU7CisKKyAgICBzdHJ1Y3QgdjRsMl9jb250cm9sIGN0cmw7CisKKyAgICBzdHJ1Y3QgcG9sbGZkIHBvbGxfZXZlbnRzOworICAgIGludCBwb2xsX3N0YXRlOworCisgICAgTE9HVigiWyVzXSBFbnRlciBcbiIsX19mdW5jX18pOworICAgIGlmIChvcGVuSGFuZGxlID09IE5VTEwpIHsKKyAgICAgICAgTE9HRSgiWyVzXSBvcGVuSGFuZGxlIGlzIE5VTExcbiIsX19mdW5jX18pOworICAgICAgICByZXR1cm4gTUZDX1JFVF9JTlZBTElEX1BBUkFNOworICAgIH0KKworICAgIHBDVFggPSAoX01GQ0xJQiAqKSBvcGVuSGFuZGxlOworCisgICAgY3RybC5pZCA9IFY0TDJfQ0lEX0NPREVDX0ZSQU1FX1RBRzsKKyAgICBjdHJsLnZhbHVlID0gcENUWC0+aW5mcmFtZXRhZzsKKworICAgIHJldCA9IGlvY3RsKHBDVFgtPmhNRkMsIFZJRElPQ19TX0NUUkwsICZjdHJsKTsKKyAgICBpZiAocmV0ICE9IDApIHsKKyAgICAgICAgTE9HRSgiWyVzXSBWSURJT0NfU19DVFJMIGZhaWxlZCwgVjRMMl9DSURfQ09ERUNfRlJBTUVfVEFHIixfX2Z1bmNfXyk7CisgICAgICAgIHJldHVybiBNRkNfUkVUX0VOQ19FWEVfRVJSOworICAgIH0KKworICAgIGlmIChwQ1RYLT52NGwyX2VuYy5iUnVubmluZyA9PSAwKSB7CisgICAgICAgIHR5cGUgPSBWNEwyX0JVRl9UWVBFX1ZJREVPX09VVFBVVF9NUExBTkU7CisgICAgICAgIHJldCA9IGlvY3RsKHBDVFgtPmhNRkMsIFZJRElPQ19TVFJFQU1PTiwgJnR5cGUpOworICAgICAgICBpZiAocmV0ICE9IDApIHsKKyAgICAgICAgICAgIExPR0UoIlslc10gVklESU9DX1NUUkVBTU9OIGZhaWxlZCwgVjRMMl9CVUZfVFlQRV9WSURFT19PVVRQVVRfTVBMQU5FIixfX2Z1bmNfXyk7CisgICAgICAgICAgICByZXR1cm4gTUZDX1JFVF9FTkNfRVhFX0VSUjsKKyAgICAgICAgfQorCisgICAgICAgIHBDVFgtPnY0bDJfZW5jLmJSdW5uaW5nID0gMTsKKyAgICB9CisKKyAgICBtZW1zZXQoJnFidWYsIDAsIHNpemVvZihxYnVmKSk7CisgICAgcWJ1Zi50eXBlID0gVjRMMl9CVUZfVFlQRV9WSURFT19DQVBUVVJFX01QTEFORTsKKyAgICBxYnVmLm1lbW9yeSA9IFY0TDJfTUVNT1JZX01NQVA7CisgICAgcWJ1Zi5tLnBsYW5lcyA9IHBsYW5lczsKKyAgICBxYnVmLmxlbmd0aCA9IDE7CisKKyAgICAvKiBub3RlOiAjZGVmaW5lIFBPTExPVVQgMHgwMDA0ICovCisgICAgcG9sbF9ldmVudHMuZmQgPSBwQ1RYLT5oTUZDOworICAgIHBvbGxfZXZlbnRzLmV2ZW50cyA9IFBPTExJTiB8IFBPTExFUlI7CisgICAgcG9sbF9ldmVudHMucmV2ZW50cyA9IDA7CisKKyAgICAvKiB3YWl0IGZvciBlbmNvZGluZyAqLworICAgIGRvIHsKKyAgICAgICAgcG9sbF9zdGF0ZSA9IHBvbGwoKHN0cnVjdCBwb2xsZmQqKSZwb2xsX2V2ZW50cywgMSwgUE9MTF9FTkNfV0FJVF9USU1FT1VUKTsKKyAgICAgICAgaWYgKDAgPCBwb2xsX3N0YXRlKSB7CisgICAgICAgICAgICBpZiAocG9sbF9ldmVudHMucmV2ZW50cyAmIFBPTExJTikgeyAvKiBQT0xMSU4gKi8KKyAgICAgICAgICAgICAgICByZXQgPSBpb2N0bChwQ1RYLT5oTUZDLCBWSURJT0NfRFFCVUYsICZxYnVmKTsKKyAgICAgICAgICAgICAgICBpZiAocmV0ID09IDApCisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfSBlbHNlIGlmIChwb2xsX2V2ZW50cy5yZXZlbnRzICYgUE9MTEVSUikgeyAvKiBQT0xMRVJSICovCisgICAgICAgICAgICAgICAgTE9HRSgiWyVzXSBQT0xMRVJSXG4iLF9fZnVuY19fKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gTUZDX1JFVF9FTkNfRVhFX0VSUjsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgTE9HRSgiWyVzXSBwb2xsKCkgcmV0dXJucyAweCV4XG4iLF9fZnVuY19fLCBwb2xsX2V2ZW50cy5yZXZlbnRzKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gTUZDX1JFVF9FTkNfRVhFX0VSUjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSBlbHNlIGlmICgwID4gcG9sbF9zdGF0ZSkgeworICAgICAgICAgICAgTE9HRSgiWyVzXSBwb2xsKCkgRW5jb2RlciBQT0xMIFRpbWVvdXQgMHgleFxuIixfX2Z1bmNfXywgcG9sbF9ldmVudHMucmV2ZW50cyk7CisgICAgICAgICAgICByZXR1cm4gTUZDX1JFVF9FTkNfRVhFX0VSUjsKKyAgICAgICAgfQorICAgICAgICBsb29wY250Kys7CisgICAgfSB3aGlsZSAoKDAgPT0gcG9sbF9zdGF0ZSkgJiYgKGxvb3BjbnQgPCA1KSk7CisKKyAgICBpZiAocENUWC0+djRsMl9lbmMuYlJ1bm5pbmcgIT0gMCkgeworICAgICAgICBwQ1RYLT5lbmNvZGVkZnJhbWVUeXBlID0gKHFidWYuZmxhZ3MgJiAweDE4KSA+PiAzOyAvKiBlbmNvZGVkIGZyYW1lIHR5cGUgKi8KKworICAgICAgICBMT0dWKCJbJXNdIGVuY29kZWQgZnJhbWUgdHlwZSA9ICVkXG4iLF9fZnVuY19fLCBwQ1RYLT5lbmNvZGVkZnJhbWVUeXBlKTsKKyAgICAgICAgc3dpdGNoIChwQ1RYLT5lbmNvZGVkZnJhbWVUeXBlKSB7CisgICAgICAgIGNhc2UgMToKKyAgICAgICAgICAgIHBDVFgtPmVuY29kZWRmcmFtZVR5cGUgPSBNRkNfRlJBTUVfVFlQRV9JX0ZSQU1FOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgMjoKKyAgICAgICAgICAgIHBDVFgtPmVuY29kZWRmcmFtZVR5cGUgPSBNRkNfRlJBTUVfVFlQRV9QX0ZSQU1FOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgNDoKKyAgICAgICAgICAgIHBDVFgtPmVuY29kZWRmcmFtZVR5cGUgPSBNRkNfRlJBTUVfVFlQRV9CX0ZSQU1FOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgTE9HRSgiWyVzXSBWSURJT0NfRFFCVUYgZmFpbGVkLCBlbmNvZGVkIGZyYW1lIHR5cGUgaXMgd3JvbmciLF9fZnVuY19fKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGRlcXVldWVkX2luZGV4ID0gcWJ1Zi5pbmRleDsKKworICAgIGlmIChxYnVmLm0ucGxhbmVzWzBdLmJ5dGVzdXNlZCA+IDApIHsgLyogRklYTUUgbGF0ZXIgKi8KKyAgICAgICAgcENUWC0+djRsMl9lbmMubWZjX2RzdF9idWZzX2J5dGVzX3VzZWRfbGVuID0gcWJ1Zi5tLnBsYW5lc1swXS5ieXRlc3VzZWQ7CisgICAgfQorCisgICAgY3RybC5pZCA9IFY0TDJfQ0lEX0NPREVDX0ZSQU1FX1RBRzsKKyAgICBjdHJsLnZhbHVlID0gMDsKKworICAgIHJldCA9IGlvY3RsKHBDVFgtPmhNRkMsIFZJRElPQ19HX0NUUkwsICZjdHJsKTsKKyAgICBpZiAocmV0ICE9IDApIHsKKyAgICAgICAgTE9HRSgiWyVzXSBWSURJT0NfR19DVFJMIGZhaWxlZCwgVjRMMl9DSURfQ09ERUNfRlJBTUVfVEFHIixfX2Z1bmNfXyk7CisgICAgICAgIHJldHVybiBNRkNfUkVUX0VOQ19FWEVfRVJSOworICAgIH0KKworICAgIHBDVFgtPm91dGZyYW1ldGFndG9wID0gY3RybC52YWx1ZTsKKworICAgIG1lbXNldCgmcWJ1ZiwgMCwgc2l6ZW9mKHFidWYpKTsKKyAgICBxYnVmLnR5cGUgPSBWNEwyX0JVRl9UWVBFX1ZJREVPX0NBUFRVUkVfTVBMQU5FOworICAgIHFidWYubWVtb3J5ID0gVjRMMl9NRU1PUllfTU1BUDsKKyAgICBxYnVmLmluZGV4ID0gZGVxdWV1ZWRfaW5kZXg7CisgICAgcWJ1Zi5tLnBsYW5lcyA9IHBsYW5lczsKKyAgICBxYnVmLmxlbmd0aCA9IDE7CisKKyAgICByZXQgPSBpb2N0bChwQ1RYLT5oTUZDLCBWSURJT0NfUUJVRiwgJnFidWYpOworICAgIGlmIChyZXQgIT0gMCkgeworICAgICAgICBMT0dFKCJbJXNdIFZJRElPQ19RQlVGIGZhaWxlZCwgVjRMMl9CVUZfVFlQRV9WSURFT19DQVBUVVJFX01QTEFORSIsX19mdW5jX18pOworICAgICAgICByZXR1cm4gTUZDX1JFVF9FTkNfRVhFX0VSUjsKKyAgICB9CisKKyAgICBpZiAocENUWC0+djRsMl9lbmMuYlJ1bm5pbmcgIT0gMCkgeworICAgICAgICBtZW1zZXQoJnFidWYsIDAsIHNpemVvZihxYnVmKSk7CisgICAgICAgIHFidWYudHlwZSA9IFY0TDJfQlVGX1RZUEVfVklERU9fT1VUUFVUX01QTEFORTsKKworICAgICAgICBpZiAocENUWC0+djRsMl9lbmMuYklucHV0UGh5VmlyKQorICAgICAgICAgICAgcWJ1Zi5tZW1vcnkgPSBWNEwyX01FTU9SWV9VU0VSUFRSOworICAgICAgICBlbHNlCisgICAgICAgICAgICBxYnVmLm1lbW9yeSA9IFY0TDJfTUVNT1JZX01NQVA7CisKKyAgICAgICAgcmV0ID0gaW9jdGwocENUWC0+aE1GQywgVklESU9DX0RRQlVGLCAmcWJ1Zik7CisgICAgICAgIGlmIChyZXQgIT0gMCkgeworICAgICAgICAgICAgTE9HRSgiWyVzXSBWSURJT0NfRFFCVUYgZmFpbGVkLCBWNEwyX0JVRl9UWVBFX1ZJREVPX09VVFBVVF9NUExBTkUiLF9fZnVuY19fKTsKKyAgICAgICAgICAgIHJldHVybiBNRkNfUkVUX0VOQ19FWEVfRVJSOworICAgICAgICB9CisgICAgfQorICAgIHBDVFgtPnY0bDJfZW5jLm1mY19zcmNfYnVmX2ZsYWdzW3FidWYuaW5kZXhdID0gQlVGX0RFUVVFVUVEOworCisgICAgLyogVXBkYXRlIGNvbnRleHQgc3RyZWFtIGJ1ZmZlciBhZGRyZXNzICovCisgICAgcENUWC0+dmlyU3RybUJ1ZiA9IHBDVFgtPnY0bDJfZW5jLm1mY19kc3RfYnVmc1tkZXF1ZXVlZF9pbmRleF07CisgICAgTE9HVigiWyVzXSBTdHJtIG91dCBpZHggJWQiLF9fZnVuY19fLGRlcXVldWVkX2luZGV4KTsKKworICAgIHJldHVybiBNRkNfUkVUX09LOworfQorCitTU0JTSVBfTUZDX0VSUk9SX0NPREUgU3NiU2lwTWZjRW5jU2V0Q29uZmlnKHZvaWQgKm9wZW5IYW5kbGUsIFNTQlNJUF9NRkNfRU5DX0NPTkYgY29uZl90eXBlLCB2b2lkICp2YWx1ZSkKK3sKKyAgICBfTUZDTElCICpwQ1RYOworCisgICAgaWYgKG9wZW5IYW5kbGUgPT0gTlVMTCkgeworICAgICAgICBMT0dFKCJbJXNdIG9wZW5IYW5kbGUgaXMgTlVMTFxuIixfX2Z1bmNfXyk7CisgICAgICAgIHJldHVybiBNRkNfUkVUX0lOVkFMSURfUEFSQU07CisgICAgfQorCisgICAgaWYgKHZhbHVlID09IE5VTEwpIHsKKyAgICAgICAgTE9HRSgiWyVzXSB2YWx1ZSBpcyBOVUxMXG4iLF9fZnVuY19fKTsKKyAgICAgICAgcmV0dXJuIE1GQ19SRVRfSU5WQUxJRF9QQVJBTTsKKyAgICB9CisKKyAgICBwQ1RYICA9IChfTUZDTElCICopIG9wZW5IYW5kbGU7CisKKyAgICBzd2l0Y2ggKGNvbmZfdHlwZSkgeworICAgIGNhc2UgTUZDX0VOQ19TRVRDT05GX0ZSQU1FX1RBRzoKKyAgICAgICAgcENUWC0+aW5mcmFtZXRhZyA9ICooKHVuc2lnbmVkIGludCAqKXZhbHVlKTsKKyAgICAgICAgcmV0dXJuIE1GQ19SRVRfT0s7CisKKyAgICBjYXNlIE1GQ19FTkNfU0VUQ09ORl9BTExPV19GUkFNRV9TS0lQOgorICAgICAgICBwQ1RYLT5lbmNfZnJhbWVza2lwID0gKigoaW50ICopdmFsdWUpOworICAgICAgICByZXR1cm4gTUZDX1JFVF9PSzsKKyNpZiAwCisgICAgY2FzZSBNRkNfRU5DX1NFVENPTkZfVlVJX0lORk86CisgICAgICAgIHZ1aV9pbmZvID0gKigoc3RydWN0IG1mY19lbmNfdnVpX2luZm8gKikgdmFsdWUpOworICAgICAgICBFbmNBcmcuYXJncy5zZXRfY29uZmlnLmluX2NvbmZpZ192YWx1ZVswXSAgPSAoaW50KSh2dWlfaW5mby5hc3BlY3RfcmF0aW9faWRjKTsKKyAgICAgICAgRW5jQXJnLmFyZ3Muc2V0X2NvbmZpZy5pbl9jb25maWdfdmFsdWVbMV0gID0gMDsKKyAgICAgICAgYnJlYWs7CisKKyAgICBjYXNlIE1GQ19FTkNfU0VUQ09ORl9ISUVSX1A6CisgICAgICAgIGhpZXJfcF9xcCA9ICooKHN0cnVjdCBtZmNfZW5jX2hpZXJfcF9xcCAqKSB2YWx1ZSk7CisgICAgICAgIEVuY0FyZy5hcmdzLnNldF9jb25maWcuaW5fY29uZmlnX3ZhbHVlWzBdICA9IChpbnQpKGhpZXJfcF9xcC50MF9mcmFtZV9xcCk7CisgICAgICAgIEVuY0FyZy5hcmdzLnNldF9jb25maWcuaW5fY29uZmlnX3ZhbHVlWzFdICA9IChpbnQpKGhpZXJfcF9xcC50Ml9mcmFtZV9xcCk7CisgICAgICAgIEVuY0FyZy5hcmdzLnNldF9jb25maWcuaW5fY29uZmlnX3ZhbHVlWzJdICA9IChpbnQpKGhpZXJfcF9xcC50M19mcmFtZV9xcCk7CisgICAgICAgIGJyZWFrOworCisgICAgY2FzZSBNRkNfRU5DX1NFVENPTkZfSV9QRVJJT0Q6CisjZW5kaWYKKyAgICBkZWZhdWx0OgorICAgICAgICBMT0dFKCJbJXNdIGNvbmZfdHlwZSglZCkgaXMgTk9UIHN1cHBvcnRlZFxuIixfX2Z1bmNfXywgY29uZl90eXBlKTsKKyAgICAgICAgcmV0dXJuIE1GQ19SRVRfSU5WQUxJRF9QQVJBTTsKKyAgICB9CisKKyAgICByZXR1cm4gTUZDX1JFVF9PSzsKK30KKworU1NCU0lQX01GQ19FUlJPUl9DT0RFIFNzYlNpcE1mY0VuY0dldENvbmZpZyh2b2lkICpvcGVuSGFuZGxlLCBTU0JTSVBfTUZDX0VOQ19DT05GIGNvbmZfdHlwZSwgdm9pZCAqdmFsdWUpCit7CisgICAgX01GQ0xJQiAqcENUWDsKKworICAgIHBDVFggPSAoX01GQ0xJQiAqKSBvcGVuSGFuZGxlOworCisgICAgaWYgKG9wZW5IYW5kbGUgPT0gTlVMTCkgeworICAgICAgICBMT0dFKCJbJXNdIG9wZW5IYW5kbGUgaXMgTlVMTFxuIixfX2Z1bmNfXyk7CisgICAgICAgIHJldHVybiBNRkNfUkVUX0lOVkFMSURfUEFSQU07CisgICAgfQorCisgICAgaWYgKHZhbHVlID09IE5VTEwpIHsKKyAgICAgICAgTE9HRSgiWyVzXSB2YWx1ZSBpcyBOVUxMXG4iLF9fZnVuY19fKTsKKyAgICAgICAgcmV0dXJuIE1GQ19SRVRfSU5WQUxJRF9QQVJBTTsKKyAgICB9CisKKyAgICBzd2l0Y2ggKGNvbmZfdHlwZSkgeworICAgIGNhc2UgTUZDX0VOQ19HRVRDT05GX0ZSQU1FX1RBRzoKKyAgICAgICAgKigodW5zaWduZWQgaW50ICopdmFsdWUpID0gcENUWC0+b3V0ZnJhbWV0YWd0b3A7CisgICAgICAgIGJyZWFrOworCisgICAgZGVmYXVsdDoKKyAgICAgICAgTE9HRSgiWyVzXSBjb25mX3R5cGUoJWQpIGlzIE5PVCBzdXBwb3J0ZWRcbiIsX19mdW5jX18sIGNvbmZfdHlwZSk7CisgICAgICAgIHJldHVybiBNRkNfUkVUX0lOVkFMSURfUEFSQU07CisgICAgfQorCisgICAgcmV0dXJuIE1GQ19SRVRfT0s7Cit9CisKZGlmZiAtLWdpdCBhL2V4eW5vczQvbXVsdGltZWRpYS9jb2RlY3Mvc2VjX2NvZGVjcy92aWRlby9leHlub3M0L21mY192NGwyL2luY2x1ZGUvU3NiU2lwTWZjQXBpLmggYi9leHlub3M0L211bHRpbWVkaWEvY29kZWNzL3NlY19jb2RlY3MvdmlkZW8vZXh5bm9zNC9tZmNfdjRsMi9pbmNsdWRlL1NzYlNpcE1mY0FwaS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmI4NTI1NmIKLS0tIC9kZXYvbnVsbAorKysgYi9leHlub3M0L211bHRpbWVkaWEvY29kZWNzL3NlY19jb2RlY3MvdmlkZW8vZXh5bm9zNC9tZmNfdjRsMi9pbmNsdWRlL1NzYlNpcE1mY0FwaS5oCkBAIC0wLDAgKzEsMzgyIEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDEwIFNhbXN1bmcgRWxlY3Ryb25pY3MgQ28uLCBMdGQuCisgKiAgICAgICAgICAgICAgaHR0cDovL3d3dy5zYW1zdW5nLmNvbS8KKyAqCisgKiBHbG9iYWwgaGVhZGVyIGZvciBTYW1zdW5nIE1GQyAoTXVsdGkgRnVuY3Rpb24gQ29kZWMgLSBGSU1WKSBkcml2ZXIKKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgYXMKKyAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICoKKyAqIEFsdGVybmF0aXZlbHksIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaWZuZGVmIF9TU0JTSVBfTUZDX0FQSV9IXworI2RlZmluZSBfU1NCU0lQX01GQ19BUElfSF8KKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisvKiBEZWZpbml0aW9uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworI2RlZmluZSBNQVhfREVDT0RFUl9JTlBVVF9CVUZGRVJfU0laRSAgKDEwMjQgKiAzMDcyKQorI2RlZmluZSBNQVhfRU5DT0RFUl9PVVRQVVRfQlVGRkVSX1NJWkUgKDEwMjQgKiAzMDcyKQorCisjZGVmaW5lIFNVUFBPUlRfMTA4MFAgICAgICAgIDEKKworI2lmIFNVUFBPUlRfMTA4MFAKKyNkZWZpbmUgTU1BUF9CVUZGRVJfU0laRV9NTUFQICAgICAgICAgICg3MCoxMDI0KjEwMjQpIC8qIG9ubHkgQzExMCB1c2UgdGhpcyB2YWx1ZS4gaW4gQzIxMCwgbWVtb3J5IHNpemUgaXMgZGVjaWRlZCBpbiBtZW51Y29uZmlnKi8KKyNlbHNlCisjZGVmaW5lIE1NQVBfQlVGRkVSX1NJWkVfTU1BUCAgICAgICAgICAoNjIqMTAyNCoxMDI0KQorI2VuZGlmCisKKyNkZWZpbmUgU0FNU1VOR19NRkNfREVWX05BTUUgICAgICAgICAgICIvZGV2L3ZpZGVvIgorCisjZGVmaW5lIFNTQlNJUF9NRkNfT0sgICAgICAgICAgICAgICAgICAgKDEpCisjZGVmaW5lIFNTQlNJUF9NRkNfRkFJTCAgICAgICAgICAgICAgICAgKDApCisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworLyogU3RydWN0dXJlIGFuZCBUeXBlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KK3R5cGVkZWYgZW51bSB7CisgICAgSDI2NF9ERUMsCisgICAgVkMxX0RFQywgICAgIC8qIFZDMSBhZHZhY2VkIFByb2ZpbGUgZGVjb2RpbmcgICovCisgICAgTVBFRzRfREVDLAorICAgIFhWSURfREVDLAorICAgIE1QRUcxX0RFQywKKyAgICBNUEVHMl9ERUMsCisgICAgSDI2M19ERUMsCisgICAgVkMxUkNWX0RFQywgIC8qIFZDMSBzaW1wbGUvbWFpbiBwcm9maWxlIGRlY29kaW5nICAqLworICAgIEZJTVYxX0RFQywKKyAgICBGSU1WMl9ERUMsCisgICAgRklNVjNfREVDLAorICAgIEZJTVY0X0RFQywKKyAgICBIMjY0X0VOQywKKyAgICBNUEVHNF9FTkMsCisgICAgSDI2M19FTkMsCisgICAgVU5LTk9XTl9UWVBFCit9IFNTQlNJUF9NRkNfQ09ERUNfVFlQRTsKKwordHlwZWRlZiBlbnVtIHsKKyAgICBET05UX0NBUkUgPSAwLAorICAgIElfRlJBTUUgPSAxLAorICAgIE5PVF9DT0RFRCA9IDIKK30gU1NCU0lQX01GQ19GT1JDRV9TRVRfRlJBTUVfVFlQRTsKKwordHlwZWRlZiBlbnVtIHsKKyAgICBOVjEyX0xJTkVBUiA9IDAsCisgICAgTlYxMl9USUxFLAorICAgIE5WMjFfTElORUFSCit9IFNTQlNJUF9NRkNfSU5TVFJNX01PREVfVFlQRTsKKwordHlwZWRlZiBlbnVtIHsKKyAgICBOT19DQUNIRSA9IDAsCisgICAgQ0FDSEUgPSAxCit9IFNTQklQX01GQ19CVUZGRVJfVFlQRTsKKwordHlwZWRlZiBlbnVtIHsKKyAgICBNRkNfREVDX1NFVENPTkZfUE9TVF9FTkFCTEUgPSAxLAorICAgIE1GQ19ERUNfU0VUQ09ORl9FWFRSQV9CVUZGRVJfTlVNLAorICAgIE1GQ19ERUNfU0VUQ09ORl9ESVNQTEFZX0RFTEFZLAorICAgIE1GQ19ERUNfU0VUQ09ORl9JU19MQVNUX0ZSQU1FLAorICAgIE1GQ19ERUNfU0VUQ09ORl9TTElDRV9FTkFCTEUsCisgICAgTUZDX0RFQ19TRVRDT05GX0NSQ19FTkFCTEUsCisgICAgTUZDX0RFQ19TRVRDT05GX0ZJTVYxX1dJRFRIX0hFSUdIVCwKKyAgICBNRkNfREVDX1NFVENPTkZfRlJBTUVfVEFHLAorICAgIE1GQ19ERUNfR0VUQ09ORl9DUkNfREFUQSwKKyAgICBNRkNfREVDX0dFVENPTkZfQlVGX1dJRFRIX0hFSUdIVCwKKyAgICBNRkNfREVDX0dFVENPTkZfQ1JPUF9JTkZPLAorICAgIE1GQ19ERUNfR0VUQ09ORl9GUkFNRV9UQUcsCisKKyAgICAvKiBDMjEwIHNwZWNpZmljIGZlYXR1cmUgKi8KKyAgICBNRkNfREVDX1NFVENPTkZfSU1NRURJQVRFTFlfRElTUExBWSwKKyAgICBNRkNfREVDX1NFVENPTkZfRFBCX0ZMVVNILAorICAgIE1GQ19ERUNfU0VUQ09ORl9QSVhFTF9DQUNIRSwKKyAgICBNRkNfREVDX0dFVENPTkZfV0lEVEhfSEVJR0hUCit9IFNTQlNJUF9NRkNfREVDX0NPTkY7CisKK3R5cGVkZWYgZW51bSB7CisgICAgTUZDX0VOQ19TRVRDT05GX0ZSQU1FX1RZUEUgPSAxMDAsCisgICAgTUZDX0VOQ19TRVRDT05GX0NIQU5HRV9GUkFNRV9SQVRFLAorICAgIE1GQ19FTkNfU0VUQ09ORl9DSEFOR0VfQklUX1JBVEUsCisgICAgTUZDX0VOQ19TRVRDT05GX0ZSQU1FX1RBRywKKyAgICBNRkNfRU5DX1NFVENPTkZfQUxMT1dfRlJBTUVfU0tJUCwKKyAgICBNRkNfRU5DX0dFVENPTkZfRlJBTUVfVEFHLAorCisgICAgLyogQzIxMCBzcGVjaWZpYyBmZWF0dXJlICovCisgICAgTUZDX0VOQ19TRVRDT05GX1ZVSV9JTkZPLAorICAgIE1GQ19FTkNfU0VUQ09ORl9JX1BFUklPRCwKKyAgICBNRkNfRU5DX1NFVENPTkZfSElFUl9QCit9IFNTQlNJUF9NRkNfRU5DX0NPTkY7CisKK3R5cGVkZWYgZW51bSB7CisgICAgTUZDX0dFVE9VVEJVRl9TVEFUVVNfTlVMTCA9IDAsCisgICAgTUZDX0dFVE9VVEJVRl9ERUNPRElOR19PTkxZID0gMSwKKyAgICBNRkNfR0VUT1VUQlVGX0RJU1BMQVlfREVDT0RJTkcsCisgICAgTUZDX0dFVE9VVEJVRl9ESVNQTEFZX09OTFksCisgICAgTUZDX0dFVE9VVEJVRl9ESVNQTEFZX0VORCwKKyAgICBNRkNfR0VUT1VUQlVGX0NIQU5HRV9SRVNPTAorfSBTU0JTSVBfTUZDX0RFQ19PVVRCVUZfU1RBVFVTOworCit0eXBlZGVmIGVudW0geworICAgIE1GQ19GUkFNRV9UWVBFX05PVF9DT0RFRCwKKyAgICBNRkNfRlJBTUVfVFlQRV9JX0ZSQU1FLAorICAgIE1GQ19GUkFNRV9UWVBFX1BfRlJBTUUsCisgICAgTUZDX0ZSQU1FX1RZUEVfQl9GUkFNRSwKKyAgICBNRkNfRlJBTUVfVFlQRV9PVEhFUlMKK30gU1NCU0lQX01GQ19GUkFNRV9UWVBFOworCit0eXBlZGVmIGVudW0geworICAgIE1GQ19SRVRfT0sgICAgICAgICAgICAgICAgICAgICAgPSAxLAorICAgIE1GQ19SRVRfRkFJTCAgICAgICAgICAgICAgICAgICAgPSAtMTAwMCwKKyAgICBNRkNfUkVUX09QRU5fRkFJTCAgICAgICAgICAgICAgID0gLTEwMDEsCisgICAgTUZDX1JFVF9DTE9TRV9GQUlMICAgICAgICAgICAgICA9IC0xMDAyLAorCisgICAgTUZDX1JFVF9ERUNfSU5JVF9GQUlMICAgICAgICAgICA9IC0yMDAwLAorICAgIE1GQ19SRVRfREVDX0VYRV9USU1FX09VVCAgICAgICAgPSAtMjAwMSwKKyAgICBNRkNfUkVUX0RFQ19FWEVfRVJSICAgICAgICAgICAgID0gLTIwMDIsCisgICAgTUZDX1JFVF9ERUNfR0VUX0lOQlVGX0ZBSUwgICAgICA9IC0yMDAzLAorICAgIE1GQ19SRVRfREVDX1NFVF9JTkJVRl9GQUlMICAgICAgPSAtMjAwNCwKKyAgICBNRkNfUkVUX0RFQ19HRVRfT1VUQlVGX0ZBSUwgICAgID0gLTIwMDUsCisgICAgTUZDX1JFVF9ERUNfR0VUX0NPTkZfRkFJTCAgICAgICA9IC0yMDA2LAorICAgIE1GQ19SRVRfREVDX1NFVF9DT05GX0ZBSUwgICAgICAgPSAtMjAwNywKKworICAgIE1GQ19SRVRfRU5DX0lOSVRfRkFJTCAgICAgICAgICAgPSAtMzAwMCwKKyAgICBNRkNfUkVUX0VOQ19FWEVfVElNRV9PVVQgICAgICAgID0gLTMwMDEsCisgICAgTUZDX1JFVF9FTkNfRVhFX0VSUiAgICAgICAgICAgICA9IC0zMDAyLAorICAgIE1GQ19SRVRfRU5DX0dFVF9JTkJVRl9GQUlMICAgICAgPSAtMzAwMywKKyAgICBNRkNfUkVUX0VOQ19TRVRfSU5CVUZfRkFJTCAgICAgID0gLTMwMDQsCisgICAgTUZDX1JFVF9FTkNfR0VUX09VVEJVRl9GQUlMICAgICA9IC0zMDA1LAorICAgIE1GQ19SRVRfRU5DX1NFVF9PVVRCVUZfRkFJTCAgICAgPSAtMzAwNiwKKyAgICBNRkNfUkVUX0VOQ19HRVRfQ09ORl9GQUlMICAgICAgID0gLTMwMDcsCisgICAgTUZDX1JFVF9FTkNfU0VUX0NPTkZfRkFJTCAgICAgICA9IC0zMDA4LAorCisgICAgTUZDX1JFVF9JTlZBTElEX1BBUkFNICAgICAgICAgICA9IC00MDAwCit9IFNTQlNJUF9NRkNfRVJST1JfQ09ERTsKKwordHlwZWRlZiBzdHJ1Y3QgeworICAgIHZvaWQgKllQaHlBZGRyOyAgICAgICAgICAgICAgICAgICAgIC8qIFtPVVRdIHBoeXNpY2FsIGFkZHJlc3Mgb2YgWSAqLworICAgIHZvaWQgKkNQaHlBZGRyOyAgICAgICAgICAgICAgICAgICAgIC8qIFtPVVRdIHBoeXNpY2FsIGFkZHJlc3Mgb2YgQ2JDciAqLworICAgIHZvaWQgKllWaXJBZGRyOyAgICAgICAgICAgICAgICAgICAgIC8qIFtPVVRdIHZpcnR1YWwgYWRkcmVzcyBvZiBZICovCisgICAgdm9pZCAqQ1ZpckFkZHI7ICAgICAgICAgICAgICAgICAgICAgLyogW09VVF0gdmlydHVhbCBhZGRyZXNzIG9mIENiQ3IgKi8KKworICAgIGludCBpbWdfd2lkdGg7ICAgICAgICAgICAgICAgICAgICAgIC8qIFtPVVRdIHdpZHRoIG9mIHJlYWwgaW1hZ2UgKi8KKyAgICBpbnQgaW1nX2hlaWdodDsgICAgICAgICAgICAgICAgICAgICAvKiBbT1VUXSBoZWlnaHQgb2YgcmVhbCBpbWFnZSAqLworICAgIGludCBidWZfd2lkdGg7ICAgICAgICAgICAgICAgICAgICAgIC8qIFtPVVRdIHdpZHRoIGFsaWduZWQgdG8gMTYgKi8KKyAgICBpbnQgYnVmX2hlaWdodDsgICAgICAgICAgICAgICAgICAgICAvKiBbT1VUXSBoZWlnaHQgYWxpZ2hlZCB0byAxNiAqLworCisgICAgaW50IHRpbWVzdGFtcF90b3A7ICAgICAgICAgICAgICAgICAgLyogW09VVF0gdGltZXN0YW1wIG9mIHRvcCBmaWxlZChUaGlzIGlzIHVzZWQgZm9yIGludGVybGFjZWQgc3RyZWFtKSAqLworICAgIGludCB0aW1lc3RhbXBfYm90dG9tOyAgICAgICAgICAgICAgIC8qIFtPVVRdIHRpbWVzdGFtcCBvZiBib3R0b20gZmlsZWQoVGhpcyBpcyB1c2VkIGZvciBpbnRlcmxhY2VkIHN0cmVhbSkgKi8KKyAgICBpbnQgY29uc3VtZWRCeXRlOyAgICAgICAgICAgICAgICAgICAvKiBbT1VUXSB0aGUgbnVtYmVyIG9mIGJ5dGUgY29uc3VtZWQgZHVyaW5nIGRlY29kaW5nICovCisgICAgaW50IHJlc19jaGFuZ2U7ICAgICAgICAgICAgICAgICAgICAgLyogW09VVF0gd2hldGhlciByZXNvbHV0aW9uIGlzIGNoYW5nZWQgb3Igbm90LiAwOiBub3QgY2hhbmdlLCAxOiBpbmNyZWFzZWQsIDI6IGRlY3JlYXNlZCAqLworICAgIGludCBjcm9wX3RvcF9vZmZzZXQ7ICAgICAgICAgICAgICAgIC8qIFtPVVRdIGNyb3AgaW5mb3JtYXRpb24sIHRvcF9vZmZzZXQgKi8KKyAgICBpbnQgY3JvcF9ib3R0b21fb2Zmc2V0OyAgICAgICAgICAgICAvKiBbT1VUXSBjcm9wIGluZm9ybWF0aW9uLCBib3R0b21fb2Zmc2V0ICovCisgICAgaW50IGNyb3BfbGVmdF9vZmZzZXQ7ICAgICAgICAgICAgICAgLyogW09VVF0gY3JvcCBpbmZvcm1hdGlvbiwgbGVmdF9vZmZzZXQgKi8KKyAgICBpbnQgY3JvcF9yaWdodF9vZmZzZXQ7ICAgICAgICAgICAgICAvKiBbT1VUXSBjcm9wIGluZm9ybWF0aW9uLCByaWdodF9vZmZzZXQgKi8KKyAgICBpbnQgZGlzcF9waWNfZnJhbWVfdHlwZTsgICAgICAgICAgICAvKiBbT1VUXSBkaXNwbGF5IHBpY3R1cmUgZnJhbWUgdHlwZSBpbmZvcm1hdGlvbiAqLworCisgICAgLyogQzIxMCBVTVAgZmVhdHVyZSAqLworICAgIHVuc2lnbmVkIGludCB5X2Nvb2tpZTsgICAgICAgICAgICAgIC8qIFtPVVRdIGNvb2tpZSBmb3IgWSBhZGRyZXNzICovCisgICAgdW5zaWduZWQgaW50IGNfY29va2llOyAgICAgICAgICAgICAgLyogW09VVF0gY29va2llIGZvciBDYkNyIGFkZHJlc3MsIElmIGl0IGlzIDAsIFkgYW5kIENiQ3IgaXMgaW4gY29udGlub3VzIG1lbW9yeSAqLworfSBTU0JTSVBfTUZDX0RFQ19PVVRQVVRfSU5GTzsKKwordHlwZWRlZiBzdHJ1Y3QgeworICAgIHZvaWQgKllQaHlBZGRyOyAgICAgICAgICAgICAgICAgICAgIC8qIFtJTi9PVVRdIHBoeXNpY2FsIGFkZHJlc3Mgb2YgWSAqLworICAgIHZvaWQgKkNQaHlBZGRyOyAgICAgICAgICAgICAgICAgICAgIC8qIFtJTi9PVVRdIHBoeXNpY2FsIGFkZHJlc3Mgb2YgQ2JDciAqLworICAgIHZvaWQgKllWaXJBZGRyOyAgICAgICAgICAgICAgICAgICAgIC8qIFtJTi9PVVRdIHZpcnR1YWwgYWRkcmVzcyBvZiBZICovCisgICAgdm9pZCAqQ1ZpckFkZHI7ICAgICAgICAgICAgICAgICAgICAgLyogW0lOL09VVF0gdmlydHVhbCBhZGRyZXNzIG9mIENiQ3IgKi8KKyAgICBpbnQgWVNpemU7ICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBbSU4vT1VUXSBpbnB1dCBzaXplIG9mIFkgZGF0YSAqLworICAgIGludCBDU2l6ZTsgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIFtJTi9PVVRdIGlucHV0IHNpemUgb2YgQ2JDciBkYXRhICovCisKKyAgICAvKiBDMjEwIFVNUCBmZWF0dXJlICovCisgICAgdW5zaWduZWQgaW50IHlfY29va2llOyAgICAgICAgICAgICAgLyogW09VVF0gY29va2llIGZvciBZIGFkZHJlc3MgKi8KKyAgICB1bnNpZ25lZCBpbnQgY19jb29raWU7ICAgICAgICAgICAgICAvKiBbT1VUXSBjb29raWUgZm9yIENiQ3IgYWRkcmVzcywgSWYgaXQgaXMgMCwgWSBhbmQgQ2JDciBpcyBpbiBjb250aW5vdXMgbWVtb3J5ICovCit9IFNTQlNJUF9NRkNfRU5DX0lOUFVUX0lORk87CisKK3R5cGVkZWYgc3RydWN0IHsKKyAgICB1bnNpZ25lZCBpbnQgZGF0YVNpemU7ICAgICAgICAgICAgICAvKiBbT1VUXSBlbmNvZGVkIGRhdGEgc2l6ZSh3aXRob3V0IGhlYWRlcikgKi8KKyAgICB1bnNpZ25lZCBpbnQgaGVhZGVyU2l6ZTsgICAgICAgICAgICAvKiBbT1VUXSBlbmNvZGVkIGhlYWRlciBzaXplICovCisgICAgdW5zaWduZWQgaW50IGZyYW1lVHlwZTsgICAgICAgICAgICAgLyogW09VVF0gZnJhbWUgdHlwZSBvZiBlbmNvZGVkIHN0cmVhbSAqLworICAgIHZvaWQgKlN0cm1QaHlBZGRyOyAgICAgICAgICAgICAgICAgIC8qIFtPVVRdIHBoeXNpY2FsIGFkZHJlc3Mgb2YgWSAqLworICAgIHZvaWQgKlN0cm1WaXJBZGRyOyAgICAgICAgICAgICAgICAgIC8qIFtPVVRdIHZpcnR1YWwgYWRkcmVzcyBvZiBZICovCisgICAgdm9pZCAqZW5jb2RlZFlQaHlBZGRyOyAgICAgICAgICAgICAgLyogW09VVF0gcGh5c2ljYWwgYWRkcmVzcyBvZiBZIHdoaWNoIGlzIGZsdXNoZWQgKi8KKyAgICB2b2lkICplbmNvZGVkQ1BoeUFkZHI7ICAgICAgICAgICAgICAvKiBbT1VUXSBwaHlzaWNhbCBhZGRyZXNzIG9mIEMgd2hpY2ggaXMgZmx1c2hlZCAqLworCisgICAgLyogQzIxMCBVTVAgZmVhdHVyZSAqLworICAgIHVuc2lnbmVkIGludCBzdHJtX2Nvb2tpZTsgICAgICAgICAgIC8qIFtPVVRdIGNvb2tlIGZvciBzdHJlYW0gYnVmZmVyICovCisgICAgdW5zaWduZWQgaW50IHlfZW5jb2RlZF9jb29raWU7ICAgICAgLyogW09VVF0gY29va2llIGZvciBZIGFkZHJlc3MgKi8KKyAgICB1bnNpZ25lZCBpbnQgY19lbmNvZGVkX2Nvb2tpZTsgICAgICAvKiBbT1VUXSBjb29raWUgZm9yIENiQ3IgYWRkcmVzcywgSWYgaXQgaXMgMCwgWSBhbmQgQ2JDciBpcyBpbiBjb250aW5vdXMgbWVtb3J5ICovCit9IFNTQlNJUF9NRkNfRU5DX09VVFBVVF9JTkZPOworCit0eXBlZGVmIHN0cnVjdCB7CisgICAgLyogY29tbW9uIHBhcmFtZXRlcnMgKi8KKyAgICBTU0JTSVBfTUZDX0NPREVDX1RZUEUgY29kZWNUeXBlOyAgICAvKiBbSU5dIGNvZGVjIHR5cGUgKi8KKyAgICBpbnQgU291cmNlV2lkdGg7ICAgICAgICAgICAgICAgICAgICAvKiBbSU5dIHdpZHRoIG9mIHZpZGVvIHRvIGJlIGVuY29kZWQgKi8KKyAgICBpbnQgU291cmNlSGVpZ2h0OyAgICAgICAgICAgICAgICAgICAvKiBbSU5dIGhlaWdodCBvZiB2aWRlbyB0byBiZSBlbmNvZGVkICovCisgICAgaW50IElEUlBlcmlvZDsgICAgICAgICAgICAgICAgICAgICAgLyogW0lOXSBHT1AgbnVtYmVyKGludGVydmFsIG9mIEktZnJhbWUpICovCisgICAgaW50IFNsaWNlTW9kZTsgICAgICAgICAgICAgICAgICAgICAgLyogW0lOXSBNdWx0aSBzbGljZSBtb2RlICovCisgICAgaW50IFJhbmRvbUludHJhTUJSZWZyZXNoOyAgICAgICAgICAgLyogW0lOXSBjeWNsaWMgaW50cmEgcmVmcmVzaCAqLworICAgIGludCBFbmFibGVGUk1SYXRlQ29udHJvbDsgICAgICAgICAgIC8qIFtJTl0gZnJhbWUgYmFzZWQgcmF0ZSBjb250cm9sIGVuYWJsZSAqLworICAgIGludCBCaXRyYXRlOyAgICAgICAgICAgICAgICAgICAgICAgIC8qIFtJTl0gcmF0ZSBjb250cm9sIHBhcmFtZXRlcihiaXQgcmF0ZSkgKi8KKyAgICBpbnQgRnJhbWVRcDsgICAgICAgICAgICAgICAgICAgICAgICAvKiBbSU5dIFRoZSBxdWFudGl6YXRpb24gcGFyYW1ldGVyIG9mIHRoZSBmcmFtZSAqLworICAgIGludCBGcmFtZVFwX1A7ICAgICAgICAgICAgICAgICAgICAgIC8qIFtJTl0gVGhlIHF1YW50aXphdGlvbiBwYXJhbWV0ZXIgb2YgdGhlIFAgZnJhbWUgKi8KKyAgICBpbnQgUVNDb2RlTWF4OyAgICAgICAgICAgICAgICAgICAgICAvKiBbSU5dIE1heGltdW0gUXVhbnRpemF0aW9uIHZhbHVlICovCisgICAgaW50IFFTQ29kZU1pbjsgICAgICAgICAgICAgICAgICAgICAgLyogW0lOXSBNaW5pbXVtIFF1YW50aXphdGlvbiB2YWx1ZSAqLworICAgIGludCBDQlJQZXJpb2RSZjsgICAgICAgICAgICAgICAgICAgIC8qIFtJTl0gUmVhY3Rpb24gY29lZmZpY2llbnQgcGFyYW1ldGVyIGZvciByYXRlIGNvbnRyb2wgKi8KKyAgICBpbnQgUGFkQ29udHJvbE9uOyAgICAgICAgICAgICAgICAgICAvKiBbSU5dIEVuYWJsZSBwYWRkaW5nIGNvbnRyb2wgKi8KKyAgICBpbnQgTHVtYVBhZFZhbDsgICAgICAgICAgICAgICAgICAgICAvKiBbSU5dIEx1bWEgcGVsIHZhbHVlIHVzZWQgdG8gZmlsbCBwYWRkaW5nIGFyZWEgKi8KKyAgICBpbnQgQ2JQYWRWYWw7ICAgICAgICAgICAgICAgICAgICAgICAvKiBbSU5dIENCIHBlbCB2YWx1ZSB1c2VkIHRvIGZpbGwgcGFkZGluZyBhcmVhICovCisgICAgaW50IENyUGFkVmFsOyAgICAgICAgICAgICAgICAgICAgICAgLyogW0lOXSBDUiBwZWwgdmFsdWUgdXNlZCB0byBmaWxsIHBhZGRpbmcgYXJlYSAqLworICAgIGludCBGcmFtZU1hcDsgICAgICAgICAgICAgICAgICAgICAgIC8qIFtJTl0gRW5jb2RpbmcgaW5wdXQgbW9kZSh0aWxlIG1vZGUgb3IgbGluZWFyIG1vZGUpICovCisKKyAgICAvKiBILjI2NCBzcGVjaWZpYyBwYXJhbWV0ZXJzICovCisgICAgaW50IFByb2ZpbGVJREM7ICAgICAgICAgICAgICAgICAgICAgLyogW0lOXSBwcm9maWxlICovCisgICAgaW50IExldmVsSURDOyAgICAgICAgICAgICAgICAgICAgICAgLyogW0lOXSBsZXZlbCAqLworICAgIGludCBGcmFtZVFwX0I7ICAgICAgICAgICAgICAgICAgICAgIC8qIFtJTl0gVGhlIHF1YW50aXphdGlvbiBwYXJhbWV0ZXIgb2YgdGhlIEIgZnJhbWUgKi8KKyAgICBpbnQgRnJhbWVSYXRlOyAgICAgICAgICAgICAgICAgICAgICAvKiBbSU5dIHJhdGUgY29udHJvbCBwYXJhbWV0ZXIoZnJhbWUgcmF0ZSkgKi8KKyAgICBpbnQgU2xpY2VBcmd1bWVudDsgICAgICAgICAgICAgICAgICAvKiBbSU5dIE1CIG51bWJlciBvciBieXRlIG51bWJlciAqLworICAgIGludCBOdW1iZXJCRnJhbWVzOyAgICAgICAgICAgICAgICAgIC8qIFtJTl0gVGhlIG51bWJlciBvZiBjb25zZWN1dGl2ZSBCIGZyYW1lIGluc2VydGVkICovCisgICAgaW50IE51bWJlclJlZmVyZW5jZUZyYW1lczsgICAgICAgICAgLyogW0lOXSBUaGUgbnVtYmVyIG9mIHJlZmVyZW5jZSBwaWN0dXJlcyB1c2VkICovCisgICAgaW50IE51bWJlclJlZkZvclBmcmFtZXM7ICAgICAgICAgICAgLyogW0lOXSBUaGUgbnVtYmVyIG9mIHJlZmVyZW5jZSBwaWN0dXJlcyB1c2VkIGZvciBlbmNvZGluZyBQIHBpY3R1cmVzICovCisgICAgaW50IExvb3BGaWx0ZXJEaXNhYmxlOyAgICAgICAgICAgICAgLyogW0lOXSBkaXNhYmxlIHRoZSBsb29wIGZpbHRlciAqLworICAgIGludCBMb29wRmlsdGVyQWxwaGFDME9mZnNldDsgICAgICAgIC8qIFtJTl0gQWxwaGEgJiBDMCBvZmZzZXQgZm9yIEguMjY0IGxvb3AgZmlsdGVyICovCisgICAgaW50IExvb3BGaWx0ZXJCZXRhT2Zmc2V0OyAgICAgICAgICAgLyogW0lOXSBCZXRhIG9mZnNldCBmb3IgSC4yNjQgbG9vcCBmaWx0ZXIgKi8KKyAgICBpbnQgU3ltYm9sTW9kZTsgICAgICAgICAgICAgICAgICAgICAvKiBbSU5dIFRoZSBtb2RlIG9mIGVudHJvcHkgY29kaW5nKENBQkFDLCBDQVZMQykgKi8KKyAgICBpbnQgUGljdHVyZUludGVybGFjZTsgICAgICAgICAgICAgICAvKiBbSU5dIEVuYWJsZXMgdGhlIGludGVybGFjZSBtb2RlICovCisgICAgaW50IFRyYW5zZm9ybTh4OE1vZGU7ICAgICAgICAgICAgICAgLyogW0lOXSBBbGxvdyA4eDggdHJhbnNmb3JtKFRoaXMgaXMgYWxsb3dlZCBvbmx5IGZvciBoaWdoIHByb2ZpbGUpICovCisgICAgaW50IEVuYWJsZU1CUmF0ZUNvbnRyb2w7ICAgICAgICAgICAgLyogW0lOXSBFbmFibGUgbWFjcm9ibG9jay1sZXZlbCByYXRlIGNvbnRyb2wgKi8KKyAgICBpbnQgRGFya0Rpc2FibGU7ICAgICAgICAgICAgICAgICAgICAvKiBbSU5dIERpc2FibGUgYWRhcHRpdmUgcmF0ZSBjb250cm9sIG9uIGRhcmsgcmVnaW9uICovCisgICAgaW50IFNtb290aERpc2FibGU7ICAgICAgICAgICAgICAgICAgLyogW0lOXSBEaXNhYmxlIGFkYXB0aXZlIHJhdGUgY29udHJvbCBvbiBzbW9vdGggcmVnaW9uICovCisgICAgaW50IFN0YXRpY0Rpc2FibGU7ICAgICAgICAgICAgICAgICAgLyogW0lOXSBEaXNhYmxlIGFkYXB0aXZlIHJhdGUgY29udHJvbCBvbiBzdGF0aWMgcmVnaW9uICovCisgICAgaW50IEFjdGl2aXR5RGlzYWJsZTsgICAgICAgICAgICAgICAgLyogW0lOXSBEaXNhYmxlIGFkYXB0aXZlIHJhdGUgY29udHJvbCBvbiBoaWdoIGFjdGl2aXR5IHJlZ2lvbiAqLworfSBTU0JTSVBfTUZDX0VOQ19IMjY0X1BBUkFNOworCit0eXBlZGVmIHN0cnVjdCB7CisgICAgLyogY29tbW9uIHBhcmFtZXRlcnMgKi8KKyAgICBTU0JTSVBfTUZDX0NPREVDX1RZUEUgY29kZWNUeXBlOyAgICAvKiBbSU5dIGNvZGVjIHR5cGUgKi8KKyAgICBpbnQgU291cmNlV2lkdGg7ICAgICAgICAgICAgICAgICAgICAvKiBbSU5dIHdpZHRoIG9mIHZpZGVvIHRvIGJlIGVuY29kZWQgKi8KKyAgICBpbnQgU291cmNlSGVpZ2h0OyAgICAgICAgICAgICAgICAgICAvKiBbSU5dIGhlaWdodCBvZiB2aWRlbyB0byBiZSBlbmNvZGVkICovCisgICAgaW50IElEUlBlcmlvZDsgICAgICAgICAgICAgICAgICAgICAgLyogW0lOXSBHT1AgbnVtYmVyKGludGVydmFsIG9mIEktZnJhbWUpICovCisgICAgaW50IFNsaWNlTW9kZTsgICAgICAgICAgICAgICAgICAgICAgLyogW0lOXSBNdWx0aSBzbGljZSBtb2RlICovCisgICAgaW50IFJhbmRvbUludHJhTUJSZWZyZXNoOyAgICAgICAgICAgLyogW0lOXSBjeWNsaWMgaW50cmEgcmVmcmVzaCAqLworICAgIGludCBFbmFibGVGUk1SYXRlQ29udHJvbDsgICAgICAgICAgIC8qIFtJTl0gZnJhbWUgYmFzZWQgcmF0ZSBjb250cm9sIGVuYWJsZSAqLworICAgIGludCBCaXRyYXRlOyAgICAgICAgICAgICAgICAgICAgICAgIC8qIFtJTl0gcmF0ZSBjb250cm9sIHBhcmFtZXRlcihiaXQgcmF0ZSkgKi8KKyAgICBpbnQgRnJhbWVRcDsgICAgICAgICAgICAgICAgICAgICAgICAvKiBbSU5dIFRoZSBxdWFudGl6YXRpb24gcGFyYW1ldGVyIG9mIHRoZSBmcmFtZSAqLworICAgIGludCBGcmFtZVFwX1A7ICAgICAgICAgICAgICAgICAgICAgIC8qIFtJTl0gVGhlIHF1YW50aXphdGlvbiBwYXJhbWV0ZXIgb2YgdGhlIFAgZnJhbWUgKi8KKyAgICBpbnQgUVNDb2RlTWF4OyAgICAgICAgICAgICAgICAgICAgICAvKiBbSU5dIE1heGltdW0gUXVhbnRpemF0aW9uIHZhbHVlICovCisgICAgaW50IFFTQ29kZU1pbjsgICAgICAgICAgICAgICAgICAgICAgLyogW0lOXSBNaW5pbXVtIFF1YW50aXphdGlvbiB2YWx1ZSAqLworICAgIGludCBDQlJQZXJpb2RSZjsgICAgICAgICAgICAgICAgICAgIC8qIFtJTl0gUmVhY3Rpb24gY29lZmZpY2llbnQgcGFyYW1ldGVyIGZvciByYXRlIGNvbnRyb2wgKi8KKyAgICBpbnQgUGFkQ29udHJvbE9uOyAgICAgICAgICAgICAgICAgICAvKiBbSU5dIEVuYWJsZSBwYWRkaW5nIGNvbnRyb2wgKi8KKyAgICBpbnQgTHVtYVBhZFZhbDsgICAgICAgICAgICAgICAgICAgICAvKiBbSU5dIEx1bWEgcGVsIHZhbHVlIHVzZWQgdG8gZmlsbCBwYWRkaW5nIGFyZWEgKi8KKyAgICBpbnQgQ2JQYWRWYWw7ICAgICAgICAgICAgICAgICAgICAgICAvKiBbSU5dIENCIHBlbCB2YWx1ZSB1c2VkIHRvIGZpbGwgcGFkZGluZyBhcmVhICovCisgICAgaW50IENyUGFkVmFsOyAgICAgICAgICAgICAgICAgICAgICAgLyogW0lOXSBDUiBwZWwgdmFsdWUgdXNlZCB0byBmaWxsIHBhZGRpbmcgYXJlYSAqLworICAgIGludCBGcmFtZU1hcDsgICAgICAgICAgICAgICAgICAgICAgIC8qIFtJTl0gRW5jb2RpbmcgaW5wdXQgbW9kZSh0aWxlIG1vZGUgb3IgbGluZWFyIG1vZGUpICovCisKKyAgICAvKiBNUEVHNCBzcGVjaWZpYyBwYXJhbWV0ZXJzICovCisgICAgaW50IFByb2ZpbGVJREM7ICAgICAgICAgICAgICAgICAgICAgLyogW0lOXSBwcm9maWxlICovCisgICAgaW50IExldmVsSURDOyAgICAgICAgICAgICAgICAgICAgICAgLyogW0lOXSBsZXZlbCAqLworICAgIGludCBGcmFtZVFwX0I7ICAgICAgICAgICAgICAgICAgICAgIC8qIFtJTl0gVGhlIHF1YW50aXphdGlvbiBwYXJhbWV0ZXIgb2YgdGhlIEIgZnJhbWUgKi8KKyAgICBpbnQgVGltZUluY3JlYW1lbnRSZXM7ICAgICAgICAgICAgICAvKiBbSU5dIGZyYW1lIHJhdGUgKi8KKyAgICBpbnQgVm9wVGltZUluY3JlYW1lbnQ7ICAgICAgICAgICAgICAvKiBbSU5dIGZyYW1lIHJhdGUgKi8KKyAgICBpbnQgU2xpY2VBcmd1bWVudDsgICAgICAgICAgICAgICAgICAvKiBbSU5dIE1CIG51bWJlciBvciBieXRlIG51bWJlciAqLworICAgIGludCBOdW1iZXJCRnJhbWVzOyAgICAgICAgICAgICAgICAgIC8qIFtJTl0gVGhlIG51bWJlciBvZiBjb25zZWN1dGl2ZSBCIGZyYW1lIGluc2VydGVkICovCisgICAgaW50IERpc2FibGVRcGVsTUU7ICAgICAgICAgICAgICAgICAgLyogW0lOXSBkaXNhYmxlIHF1YXJ0ZXItcGl4ZWwgbW90aW9uIGVzdGltYXRpb24gKi8KK30gU1NCU0lQX01GQ19FTkNfTVBFRzRfUEFSQU07CisKK3R5cGVkZWYgc3RydWN0IHsKKyAgICAvKiBjb21tb24gcGFyYW1ldGVycyAqLworICAgIFNTQlNJUF9NRkNfQ09ERUNfVFlQRSBjb2RlY1R5cGU7ICAgIC8qIFtJTl0gY29kZWMgdHlwZSAqLworICAgIGludCBTb3VyY2VXaWR0aDsgICAgICAgICAgICAgICAgICAgIC8qIFtJTl0gd2lkdGggb2YgdmlkZW8gdG8gYmUgZW5jb2RlZCAqLworICAgIGludCBTb3VyY2VIZWlnaHQ7ICAgICAgICAgICAgICAgICAgIC8qIFtJTl0gaGVpZ2h0IG9mIHZpZGVvIHRvIGJlIGVuY29kZWQgKi8KKyAgICBpbnQgSURSUGVyaW9kOyAgICAgICAgICAgICAgICAgICAgICAvKiBbSU5dIEdPUCBudW1iZXIoaW50ZXJ2YWwgb2YgSS1mcmFtZSkgKi8KKyAgICBpbnQgU2xpY2VNb2RlOyAgICAgICAgICAgICAgICAgICAgICAvKiBbSU5dIE11bHRpIHNsaWNlIG1vZGUgKi8KKyAgICBpbnQgUmFuZG9tSW50cmFNQlJlZnJlc2g7ICAgICAgICAgICAvKiBbSU5dIGN5Y2xpYyBpbnRyYSByZWZyZXNoICovCisgICAgaW50IEVuYWJsZUZSTVJhdGVDb250cm9sOyAgICAgICAgICAgLyogW0lOXSBmcmFtZSBiYXNlZCByYXRlIGNvbnRyb2wgZW5hYmxlICovCisgICAgaW50IEJpdHJhdGU7ICAgICAgICAgICAgICAgICAgICAgICAgLyogW0lOXSByYXRlIGNvbnRyb2wgcGFyYW1ldGVyKGJpdCByYXRlKSAqLworICAgIGludCBGcmFtZVFwOyAgICAgICAgICAgICAgICAgICAgICAgIC8qIFtJTl0gVGhlIHF1YW50aXphdGlvbiBwYXJhbWV0ZXIgb2YgdGhlIGZyYW1lICovCisgICAgaW50IEZyYW1lUXBfUDsgICAgICAgICAgICAgICAgICAgICAgLyogW0lOXSBUaGUgcXVhbnRpemF0aW9uIHBhcmFtZXRlciBvZiB0aGUgUCBmcmFtZSAqLworICAgIGludCBRU0NvZGVNYXg7ICAgICAgICAgICAgICAgICAgICAgIC8qIFtJTl0gTWF4aW11bSBRdWFudGl6YXRpb24gdmFsdWUgKi8KKyAgICBpbnQgUVNDb2RlTWluOyAgICAgICAgICAgICAgICAgICAgICAvKiBbSU5dIE1pbmltdW0gUXVhbnRpemF0aW9uIHZhbHVlICovCisgICAgaW50IENCUlBlcmlvZFJmOyAgICAgICAgICAgICAgICAgICAgLyogW0lOXSBSZWFjdGlvbiBjb2VmZmljaWVudCBwYXJhbWV0ZXIgZm9yIHJhdGUgY29udHJvbCAqLworICAgIGludCBQYWRDb250cm9sT247ICAgICAgICAgICAgICAgICAgIC8qIFtJTl0gRW5hYmxlIHBhZGRpbmcgY29udHJvbCAqLworICAgIGludCBMdW1hUGFkVmFsOyAgICAgICAgICAgICAgICAgICAgIC8qIFtJTl0gTHVtYSBwZWwgdmFsdWUgdXNlZCB0byBmaWxsIHBhZGRpbmcgYXJlYSAqLworICAgIGludCBDYlBhZFZhbDsgICAgICAgICAgICAgICAgICAgICAgIC8qIFtJTl0gQ0IgcGVsIHZhbHVlIHVzZWQgdG8gZmlsbCBwYWRkaW5nIGFyZWEgKi8KKyAgICBpbnQgQ3JQYWRWYWw7ICAgICAgICAgICAgICAgICAgICAgICAvKiBbSU5dIENSIHBlbCB2YWx1ZSB1c2VkIHRvIGZpbGwgcGFkZGluZyBhcmVhICovCisgICAgaW50IEZyYW1lTWFwOyAgICAgICAgICAgICAgICAgICAgICAgLyogW0lOXSBFbmNvZGluZyBpbnB1dCBtb2RlKHRpbGUgbW9kZSBvciBsaW5lYXIgbW9kZSkgKi8KKworICAgIC8qIEguMjYzIHNwZWNpZmljIHBhcmFtZXRlcnMgKi8KKyAgICBpbnQgRnJhbWVSYXRlOyAgICAgICAgICAgICAgICAgICAgICAvKiBbSU5dIHJhdGUgY29udHJvbCBwYXJhbWV0ZXIoZnJhbWUgcmF0ZSkgKi8KK30gU1NCU0lQX01GQ19FTkNfSDI2M19QQVJBTTsKKwordHlwZWRlZiBzdHJ1Y3QgeworICAgIGludCB3aWR0aDsKKyAgICBpbnQgaGVpZ2h0OworICAgIGludCBidWZfd2lkdGg7CisgICAgaW50IGJ1Zl9oZWlnaHQ7Cit9IFNTQlNJUF9NRkNfSU1HX1JFU09MVVRJT047CisKK3R5cGVkZWYgc3RydWN0IHsKKyAgICBpbnQgY3JvcF90b3Bfb2Zmc2V0OworICAgIGludCBjcm9wX2JvdHRvbV9vZmZzZXQ7CisgICAgaW50IGNyb3BfbGVmdF9vZmZzZXQ7CisgICAgaW50IGNyb3BfcmlnaHRfb2Zmc2V0OworfSBTU0JTSVBfTUZDX0NST1BfSU5GT1JNQVRJT047CisKKyNpZmRlZiBfX2NwbHVzcGx1cworZXh0ZXJuICJDIiB7CisjZW5kaWYKKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisvKiBEZWNvZGluZyBBUElzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwordm9pZCAqU3NiU2lwTWZjRGVjT3Blbih2b2lkKTsKK3ZvaWQgKlNzYlNpcE1mY0RlY09wZW5FeHQodm9pZCAqdmFsdWUpOworU1NCU0lQX01GQ19FUlJPUl9DT0RFIFNzYlNpcE1mY0RlY0luaXQodm9pZCAqb3BlbkhhbmRsZSwgU1NCU0lQX01GQ19DT0RFQ19UWVBFIGNvZGVjX3R5cGUsIGludCBGcmFtZWxlbmcpOworU1NCU0lQX01GQ19FUlJPUl9DT0RFIFNzYlNpcE1mY0RlY0V4ZSh2b2lkICpvcGVuSGFuZGxlLCBpbnQgbGVuZ3RoQnVmRmlsbCk7CisvL1NTQlNJUF9NRkNfRVJST1JfQ09ERSBTc2JTaXBNZmNEZWNFeGVOYih2b2lkICpvcGVuSGFuZGxlLCBpbnQgbGVuZ3RoQnVmRmlsbCk7CitTU0JTSVBfTUZDX0VSUk9SX0NPREUgU3NiU2lwTWZjRGVjQ2xvc2Uodm9pZCAqb3BlbkhhbmRsZSk7Cit2b2lkICAqU3NiU2lwTWZjRGVjR2V0SW5CdWYodm9pZCAqb3BlbkhhbmRsZSwgdm9pZCAqKnBoeUluQnVmLCBpbnQgaW5wdXRCdWZmZXJTaXplKTsKKy8vU1NCU0lQX01GQ19ERUNfT1VUQlVGX1NUQVRVUyBTc2JTaXBNZmNEZWNXYWl0Rm9yT3V0QnVmKHZvaWQgKm9wZW5IYW5kbGUsIFNTQlNJUF9NRkNfREVDX09VVFBVVF9JTkZPICpvdXRwdXRfaW5mbyk7CisKKyNpZiAoZGVmaW5lZChDT05GSUdfVklERU9fTUZDX1ZDTV9VTVApIHx8IGRlZmluZWQoVVNFX1VNUCkpCitTU0JTSVBfTUZDX0VSUk9SX0NPREUgU3NiU2lwTWZjRGVjU2V0SW5CdWYodm9pZCAqb3BlbkhhbmRsZSwgdW5zaWduZWQgaW50IHNlY3VyZV9pZCwgaW50IHNpemUpOworI2Vsc2UKK1NTQlNJUF9NRkNfRVJST1JfQ09ERSBTc2JTaXBNZmNEZWNTZXRJbkJ1Zih2b2lkICpvcGVuSGFuZGxlLCB2b2lkICpwaHlJbkJ1Ziwgdm9pZCAqdmlySW5CdWYsIGludCBzaXplKTsKKyNlbmRpZgorCitTU0JTSVBfTUZDX0RFQ19PVVRCVUZfU1RBVFVTIFNzYlNpcE1mY0RlY0dldE91dEJ1Zih2b2lkICpvcGVuSGFuZGxlLCBTU0JTSVBfTUZDX0RFQ19PVVRQVVRfSU5GTyAqb3V0cHV0X2luZm8pOworCitTU0JTSVBfTUZDX0VSUk9SX0NPREUgU3NiU2lwTWZjRGVjU2V0Q29uZmlnKHZvaWQgKm9wZW5IYW5kbGUsIFNTQlNJUF9NRkNfREVDX0NPTkYgY29uZl90eXBlLCB2b2lkICp2YWx1ZSk7CitTU0JTSVBfTUZDX0VSUk9SX0NPREUgU3NiU2lwTWZjRGVjR2V0Q29uZmlnKHZvaWQgKm9wZW5IYW5kbGUsIFNTQlNJUF9NRkNfREVDX0NPTkYgY29uZl90eXBlLCB2b2lkICp2YWx1ZSk7CisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworLyogRW5jb2RpbmcgQVBJcyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KK3ZvaWQgKlNzYlNpcE1mY0VuY09wZW4odm9pZCk7Cit2b2lkICpTc2JTaXBNZmNFbmNPcGVuRXh0KHZvaWQgKnZhbHVlKTsKK1NTQlNJUF9NRkNfRVJST1JfQ09ERSBTc2JTaXBNZmNFbmNJbml0KHZvaWQgKm9wZW5IYW5kbGUsIHZvaWQgKnBhcmFtKTsKK1NTQlNJUF9NRkNfRVJST1JfQ09ERSBTc2JTaXBNZmNFbmNFeGUodm9pZCAqb3BlbkhhbmRsZSk7CitTU0JTSVBfTUZDX0VSUk9SX0NPREUgU3NiU2lwTWZjRW5jQ2xvc2Uodm9pZCAqb3BlbkhhbmRsZSk7CisKK1NTQlNJUF9NRkNfRVJST1JfQ09ERSBTc2JTaXBNZmNFbmNHZXRJbkJ1Zih2b2lkICpvcGVuSGFuZGxlLCBTU0JTSVBfTUZDX0VOQ19JTlBVVF9JTkZPICppbnB1dF9pbmZvKTsKK1NTQlNJUF9NRkNfRVJST1JfQ09ERSBTc2JTaXBNZmNFbmNTZXRJbkJ1Zih2b2lkICpvcGVuSGFuZGxlLCBTU0JTSVBfTUZDX0VOQ19JTlBVVF9JTkZPICppbnB1dF9pbmZvKTsKKworU1NCU0lQX01GQ19FUlJPUl9DT0RFIFNzYlNpcE1mY0VuY0dldE91dEJ1Zih2b2lkICpvcGVuSGFuZGxlLCBTU0JTSVBfTUZDX0VOQ19PVVRQVVRfSU5GTyAqb3V0cHV0X2luZm8pOworU1NCU0lQX01GQ19FUlJPUl9DT0RFIFNzYlNpcE1mY0VuY1NldE91dEJ1Zih2b2lkICpvcGVuSGFuZGxlLCB2b2lkICpwaHlPdXRidWYsIHZvaWQgKnZpck91dGJ1ZiwgaW50IG91dHB1dEJ1ZmZlclNpemUpOworCitTU0JTSVBfTUZDX0VSUk9SX0NPREUgU3NiU2lwTWZjRW5jU2V0Q29uZmlnKHZvaWQgKm9wZW5IYW5kbGUsIFNTQlNJUF9NRkNfRU5DX0NPTkYgY29uZl90eXBlLCB2b2lkICp2YWx1ZSk7CitTU0JTSVBfTUZDX0VSUk9SX0NPREUgU3NiU2lwTWZjRW5jR2V0Q29uZmlnKHZvaWQgKm9wZW5IYW5kbGUsIFNTQlNJUF9NRkNfRU5DX0NPTkYgY29uZl90eXBlLCB2b2lkICp2YWx1ZSk7CisKKyNpZmRlZiBfX2NwbHVzcGx1cworfQorI2VuZGlmCisKKyNlbmRpZiAvKiBfU1NCU0lQX01GQ19BUElfSF8gKi8KZGlmZiAtLWdpdCBhL2V4eW5vczQvbXVsdGltZWRpYS9jb2RlY3Mvc2VjX2NvZGVjcy92aWRlby9leHlub3M0L21mY192NGwyL2luY2x1ZGUvbWZjX2Vycm5vLmggYi9leHlub3M0L211bHRpbWVkaWEvY29kZWNzL3NlY19jb2RlY3MvdmlkZW8vZXh5bm9zNC9tZmNfdjRsMi9pbmNsdWRlL21mY19lcnJuby5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmI4ZTk2YWIKLS0tIC9kZXYvbnVsbAorKysgYi9leHlub3M0L211bHRpbWVkaWEvY29kZWNzL3NlY19jb2RlY3MvdmlkZW8vZXh5bm9zNC9tZmNfdjRsMi9pbmNsdWRlL21mY19lcnJuby5oCkBAIC0wLDAgKzEsNzkgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTAgU2Ftc3VuZyBFbGVjdHJvbmljcyBDby4sIEx0ZC4KKyAqICAgICAgICAgICAgICBodHRwOi8vd3d3LnNhbXN1bmcuY29tLworICoKKyAqIEdsb2JhbCBoZWFkZXIgZm9yIFNhbXN1bmcgTUZDIChNdWx0aSBGdW5jdGlvbiBDb2RlYyAtIEZJTVYpIGRyaXZlcgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBhcworICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisgKgorICogQWx0ZXJuYXRpdmVseSwgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpZm5kZWYgX19NRkNfRVJSTk9fSAorI2RlZmluZSBfX01GQ19FUlJOT19IIF9fRklMRV9fCisKK2VudW0gbWZjX3JldF9jb2RlIHsKKyAgICBNRkNfT0sgPSAxLAorICAgIE1GQ19GQUlMID0gLTEwMDAsCisgICAgTUZDX09QRU5fRkFJTCA9IC0xMDAxLAorICAgIE1GQ19DTE9TRV9GQUlMID0gLTEwMDIsCisKKyAgICBNRkNfREVDX0lOSVRfRkFJTCA9IC0yMDAwLAorICAgIE1GQ19ERUNfRVhFX1RJTUVfT1VUID0gLTIwMDEsCisgICAgTUZDX0RFQ19FWEVfRVJSID0gLTIwMDIsCisgICAgTUZDX0RFQ19HRVRfSU5CVUZfRkFJTCA9IDIwMDMsCisgICAgTUZDX0RFQ19TRVRfSU5CVUZfRkFJTCA9IDIwMDQsCisgICAgTUZDX0RFQ19HRVRfT1VUQlVGX0ZBSUwgPSAtMjAwNSwKKyAgICBNRkNfREVDX0dFVF9DT05GX0ZBSUwgPSAtMjAwNiwKKyAgICBNRkNfREVDX1NFVF9DT05GX0ZBSUwgPSAtMjAwNywKKworICAgIE1GQ19FTkNfSU5JVF9GQUlMID0gLTMwMDAsCisgICAgTUZDX0VOQ19FWEVfVElNRV9PVVQgPSAtMzAwMSwKKyAgICBNRkNfRU5DX0VYRV9FUlIgPSAtMzAwMiwKKyAgICBNRkNfRU5DX0dFVF9JTkJVRl9GQUlMID0gLTMwMDMsCisgICAgTUZDX0VOQ19TRVRfSU5CVUZfRkFJTCA9IC0zMDA0LAorICAgIE1GQ19FTkNfR0VUX09VVEJVRl9GQUlMID0gLTMwMDUsCisgICAgTUZDX0VOQ19TRVRfT1VUQlVGX0ZBSUwgPSAtMzAwNiwKKyAgICBNRkNfRU5DX0dFVF9DT05GX0ZBSUwgPSAtMzAwNywKKyAgICBNRkNfRU5DX1NFVF9DT05GX0ZBSUwgPSAtMzAwOCwKKworICAgIE1GQ19TVEFURV9JTlZBTElEID0gLTQwMDAsCisgICAgTUZDX0RFQ19IRUFERVJfRkFJTCA9IC00MDAxLAorICAgIE1GQ19ERUNfSU5JVF9CVUZfRkFJTCA9IC00MDAyLAorICAgIE1GQ19FTkNfSEVBREVSX0ZBSUwgPSAtNTAwMCwKKyAgICBNRkNfRU5DX1BBUkFNX0ZBSUwgPSAtNTAwMSwKKyAgICBNRkNfRlJNX0JVRl9TSVpFX0ZBSUwgPSAtNjAwMCwKKyAgICBNRkNfRldfTE9BRF9GQUlMID0gLTYwMDEsCisgICAgTUZDX0ZXX0lOSVRfRkFJTCA9IC02MDAyLAorICAgIE1GQ19JTlNUX05VTV9FWENFRURFRF9GQUlMID0gLTYwMDMsCisgICAgTUZDX01FTV9BTExPQ19GQUlMID0gLTYwMDQsCisgICAgTUZDX01FTV9JTlZBTElEX0FERFJfRkFJTCA9IC02MDA1LAorICAgIE1GQ19NRU1fTUFQUElOR19GQUlMID0gLTYwMDYsCisgICAgTUZDX0dFVF9DT05GX0ZBSUwgPSAtNjAwNywKKyAgICBNRkNfU0VUX0NPTkZfRkFJTCA9IC02MDA4LAorICAgIE1GQ19JTlZBTElEX1BBUkFNX0ZBSUwgPSAtNjAwOSwKKyAgICBNRkNfQVBJX0ZBSUwgPSAtOTAwMCwKKworICAgIE1GQ19DTURfRkFJTCA9IC0xMDAzLAorICAgIE1GQ19TTEVFUF9GQUlMID0gLTEwMTAsCisgICAgTUZDX1dBS0VVUF9GQUlMID0gLTEwMjAsCisKKyAgICBNRkNfQ0xLX09OX0ZBSUwgPSAtMTAzMCwKKyAgICBNRkNfQ0xLX09GRl9GQUlMID0gLTEwMzAsCisgICAgTUZDX1BXUl9PTl9GQUlMID0gLTEwNDAsCisgICAgTUZDX1BXUl9PRkZfRkFJTCA9IC0xMDQxLAorfTsKKworI2VuZGlmIC8qIF9fTUZDX0VSUk5PX0ggKi8KZGlmZiAtLWdpdCBhL2V4eW5vczQvbXVsdGltZWRpYS9jb2RlY3Mvc2VjX2NvZGVjcy92aWRlby9leHlub3M0L21mY192NGwyL2luY2x1ZGUvbWZjX2ludGVyZmFjZS5oIGIvZXh5bm9zNC9tdWx0aW1lZGlhL2NvZGVjcy9zZWNfY29kZWNzL3ZpZGVvL2V4eW5vczQvbWZjX3Y0bDIvaW5jbHVkZS9tZmNfaW50ZXJmYWNlLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjcyODljNAotLS0gL2Rldi9udWxsCisrKyBiL2V4eW5vczQvbXVsdGltZWRpYS9jb2RlY3Mvc2VjX2NvZGVjcy92aWRlby9leHlub3M0L21mY192NGwyL2luY2x1ZGUvbWZjX2ludGVyZmFjZS5oCkBAIC0wLDAgKzEsNTQxIEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDEwIFNhbXN1bmcgRWxlY3Ryb25pY3MgQ28uLCBMdGQuCisgKiAgICAgICAgICAgICAgaHR0cDovL3d3dy5zYW1zdW5nLmNvbS8KKyAqCisgKiBHbG9iYWwgaGVhZGVyIGZvciBTYW1zdW5nIE1GQyAoTXVsdGkgRnVuY3Rpb24gQ29kZWMgLSBGSU1WKSBkcml2ZXIKKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgYXMKKyAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICoKKyAqIEFsdGVybmF0aXZlbHksIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaWZuZGVmIF9fTUZDX0lOVEVSRkFDRV9ICisjZGVmaW5lIF9fTUZDX0lOVEVSRkFDRV9ICisKKyNpbmNsdWRlICJtZmNfZXJybm8uaCIKKyNpbmNsdWRlICJTc2JTaXBNZmNBcGkuaCIKKworI2RlZmluZSBJT0NUTF9NRkNfREVDX0lOSVQgICAgICAgICAgKDB4MDA4MDAwMDEpCisjZGVmaW5lIElPQ1RMX01GQ19FTkNfSU5JVCAgICAgICAgICAoMHgwMDgwMDAwMikKKyNkZWZpbmUgSU9DVExfTUZDX0RFQ19FWEUgICAgICAgICAgICgweDAwODAwMDAzKQorI2RlZmluZSBJT0NUTF9NRkNfRU5DX0VYRSAgICAgICAgICAgKDB4MDA4MDAwMDQpCisKKyNkZWZpbmUgSU9DVExfTUZDX0dFVF9JTl9CVUYgICAgICAgICgweDAwODAwMDEwKQorI2RlZmluZSBJT0NUTF9NRkNfRlJFRV9CVUYgICAgICAgICAgKDB4MDA4MDAwMTEpCisjZGVmaW5lIElPQ1RMX01GQ19HRVRfUkVBTF9BRERSICAgICAoMHgwMDgwMDAxMikKKyNkZWZpbmUgSU9DVExfTUZDX0dFVF9NTUFQX1NJWkUgICAgICgweDAwODAwMDE0KQorI2RlZmluZSBJT0NUTF9NRkNfU0VUX0lOX0JVRiAgICAgICAgKDB4MDA4MDAwMTgpCisKKyNkZWZpbmUgSU9DVExfTUZDX1NFVF9DT05GSUcgICAgICAgICgweDAwODAwMTAxKQorI2RlZmluZSBJT0NUTF9NRkNfR0VUX0NPTkZJRyAgICAgICAgKDB4MDA4MDAxMDIpCisKKyNkZWZpbmUgSU9DVExfTUZDX1NFVF9CVUZfQ0FDSEUgICAgICgweDAwODAwMjAxKQorCisvKiBNRkMgSC9XIHN1cHBvcnQgbWF4aW11bSAzMiBleHRyYSBEUEIuICovCisjZGVmaW5lIE1GQ19NQVhfRVhUUkFfRFBCICAgICAgICAgICAgICAgICAgICAgIDUKKyNkZWZpbmUgTUZDX01BWF9ESVNQX0RFTEFZICAgICAgICAgICAgICAweEYKKworI2RlZmluZSBNRkNfTElCX1ZFUl9NQUpPUiAgICAgICAgICAgICAgIDEKKyNkZWZpbmUgTUZDX0xJQl9WRVJfTUlOT1IgICAgICAgICAgICAgICAwMAorCisjZGVmaW5lIEJVRl9MX1VOSVQgICAgICAgICAgKDEwMjQpCisjZGVmaW5lIEFsaWduKHgsIGFsaWduYnl0ZSkgICAgICgoKHgpKyhhbGlnbmJ5dGUpLTEpLyhhbGlnbmJ5dGUpKihhbGlnbmJ5dGUpKQorCisjZGVmaW5lIE1GQ19FTkNfTlVNX1NSQ19CVUZTICAgIDIgLyogTnVtYmVyIG9mIHNvdXJjZSBidWZmZXJzIHRvIHJlcXVlc3QgKi8KKyNkZWZpbmUgTUZDX0VOQ19NQVhfRFNUX0JVRlMgICAgMiAvKiBUaGUgbWF4aW11bSBudW1iZXIgb2YgYnVmZmVycyAqLworI2RlZmluZSBNRkNfRU5DX05VTV9QTEFORVMgIDIgLyogTnVtYmVyIG9mIHBsYW5lcyB1c2VkIGJ5IE1GQyBJbnB1dCAqLworCisjZGVmaW5lIE1GQ19ERUNfTlVNX1NSQ19CVUZTICAgIDIgIC8qIE51bWJlciBvZiBzb3VyY2UgYnVmZmVycyB0byByZXF1ZXN0ICovCisjZGVmaW5lIE1GQ19ERUNfTUFYX0RTVF9CVUZTICAgIDMyIC8qIFRoZSBtYXhpbXVtIG51bWJlciBvZiBidWZmZXJzICovCisjZGVmaW5lIE1GQ19ERUNfTlVNX1BMQU5FUyAgMiAgLyogTnVtYmVyIG9mIHBsYW5lcyB1c2VkIGJ5IE1GQyBvdXRwdXQgKi8KKworZW51bSBpbnN0X3R5cGUgeworICAgIERFQ09ERVIgPSAweDEsCisgICAgRU5DT0RFUiA9IDB4MiwKK307CisKK3R5cGVkZWYgZW51bSB7CisgICAgTUZDX1VOUEFDS0VEX1BCID0gMCwKKyAgICBNRkNfUEFDS0VEX1BCID0gMQorfSBtZmNfcGFja2VkX21vZGU7CisKK3R5cGVkZWYgZW51bSB7CisgICAgU1NCU0lQX01GQ19MQVNUX0ZSQU1FX05PVF9SRUNFSVZFRCA9IDAsCisgICAgU1NCU0lQX01GQ19MQVNUX0ZSQU1FX1JFQ0VJVkVEID0gMSwKKyAgICBTU0JTSVBfTUZDX0xBU1RfRlJBTUVfUFJPQ0VTU0VEID0gMgorfSBTU0JTSVBfTUZDX0xBU1RfRlJBTUVfU1RBVFVTOworCit0eXBlZGVmIGVudW0geworICAgIE1GQ19VU0VfTk9ORSAgICAgICAgID0gIDB4MDAwMCwKKyAgICBNRkNfVVNFX1lVVl9CVUZGICAgICA9ICAweDAwMDEsCisgICAgTUZDX1VTRV9TVFJNX0JVRkYgICAgPSAgMHgwMDEwLAorICAgIE1GQ19VU0VfU1JDX1NUUkVBTU9OID0gIDB4MDEwMCwKKyAgICBNRkNfVVNFX0RTVF9TVFJFQU1PTiA9ICAweDEwMDAsCit9IHMzY19tZmNfaW50ZXJidWZmX3N0YXR1czsKKwordHlwZWRlZiBzdHJ1Y3QgeworICAgIGludCBsdW1hMDsgIC8qIHBlciBmcmFtZSAob3IgdG9wIGZpZWxkKSAqLworICAgIGludCBjaHJvbWEwOyAgICAvKiBwZXIgZnJhbWUgKG9yIHRvcCBmaWVsZCkgKi8KKyAgICBpbnQgbHVtYTE7ICAvKiBwZXIgZnJhbWUgKG9yIGJvdHRvbSBmaWVsZCkgKi8KKyAgICBpbnQgY2hyb21hMTsgICAgLyogcGVyIGZyYW1lIChvciBib3R0b20gZmllbGQpICovCit9IFNTQlNJUF9NRkNfQ1JDX0RBVEE7CisKK3N0cnVjdCBtZmNfc3RybV9yZWZfYnVmX2FyZyB7CisgICAgdW5zaWduZWQgaW50IHN0cm1fcmVmX3k7CisgICAgdW5zaWduZWQgaW50IG12X3JlZl95YzsKK307CisKK3N0cnVjdCBtZmNfZnJhbWVfYnVmX2FyZyB7CisgICAgdW5zaWduZWQgaW50IGx1bWE7CisgICAgdW5zaWduZWQgaW50IGNocm9tYTsKK307CisKK3N0cnVjdCBtZmNfZW5jX2luaXRfY29tbW9uX2FyZyB7CisgICAgU1NCU0lQX01GQ19DT0RFQ19UWVBFIGluX2NvZGVjX3R5cGU7IC8qIFtJTl0gY29kZWMgdHlwZSAqLworCisgICAgaW50IGluX3dpZHRoOyAgICAgICAgICAgICAgICAgICAgICAgIC8qIFtJTl0gd2lkdGggb2YgWVVWNDIwIGZyYW1lIHRvIGJlIGVuY29kZWQgKi8KKyAgICBpbnQgaW5faGVpZ2h0OyAgICAgICAgICAgICAgICAgICAgICAgLyogW0lOXSBoZWlnaHQgb2YgWVVWNDIwIGZyYW1lIHRvIGJlIGVuY29kZWQgKi8KKworICAgIGludCBpbl9nb3BfbnVtOyAgICAgICAgICAgICAgICAgICAgICAvKiBbSU5dIEdPUCBOdW1iZXIgKGludGVydmFsIG9mIEktZnJhbWUpICovCisgICAgaW50IGluX3ZvcF9xdWFudDsgICAvKiBbSU5dIFZPUCBxdWFudCAqLworICAgIGludCBpbl92b3BfcXVhbnRfcDsgLyogW0lOXSBWT1AgcXVhbnQgZm9yIFAgZnJhbWUgKi8KKworICAgIC8qIFtJTl0gUkMgZW5hYmxlICovCisgICAgLyogW0lOXSBSQyBlbmFibGUgKDA6ZGlzYWJsZSwgMTpmcmFtZSBsZXZlbCBSQykgKi8KKyAgICBpbnQgaW5fcmNfZnJfZW47CisgICAgaW50IGluX3JjX2JpdHJhdGU7ICAvKiBbSU5dICBSQyBwYXJhbWV0ZXIgKGJpdHJhdGUgaW4ga2JwcykgKi8KKworICAgIGludCBpbl9yY19xYm91bmRfbWluOyAgIC8qIFtJTl0gIFJDIHBhcmFtZXRlciAoUSBib3VuZCBNaW4pICovCisgICAgaW50IGluX3JjX3Fib3VuZF9tYXg7ICAgLyogW0lOXSAgUkMgcGFyYW1ldGVyIChRIGJvdW5kIE1heCkgKi8KKyAgICBpbnQgaW5fcmNfcnBhcmE7ICAgIC8qIFtJTl0gIFJDIHBhcmFtZXRlciAoUmVhY3Rpb24gQ29lZmZpY2llbnQpICovCisKKyAgICAvKiBbSU5dIE11bHRpLXNsaWNlIG1vZGUgKDA6c2luZ2xlLCAxOm11bHRpcGxlKSAqLworICAgIGludCBpbl9tc19tb2RlOworICAgIC8qIFtJTl0gTXVsdGktc2xpY2Ugc2l6ZSAoaW4gbnVtLiBvZiBtYiBvciBieXRlKSAqLworICAgIGludCBpbl9tc19hcmc7CisKKyAgICBpbnQgaW5fbWJfcmVmcmVzaDsgICAgICAgICAgICAgICAgICAgLyogW0lOXSBNYWNyb2Jsb2NrIHJlZnJlc2ggKi8KKworICAgIC8qIFtJTl0gRW5hYmxlICgxKSAvIERpc2FibGUgKDApIHBhZGRpbmcgd2l0aCB0aGUgc3BlY2lmaWVkIHZhbHVlcyAqLworICAgIGludCBpbl9wYWRfY3RybF9vbjsKKworICAgIC8qIFtJTl0gcGFkIHZhbHVlIGlmIHBhZF9jdHJsX29uIGlzIEVuYWJsZSAqLworICAgIGludCBpbl95X3BhZF92YWw7CisgICAgaW50IGluX2NiX3BhZF92YWw7CisgICAgaW50IGluX2NyX3BhZF92YWw7CisKKyAgICAvKiBsaW5lYXIgb3IgdGlsZWQgKi8KKyAgICBpbnQgaW5fZnJhbWVfbWFwOworCisgICAgdW5zaWduZWQgaW50IGluX3BpeGVsY2FjaGU7CisKKyAgICB1bnNpZ25lZCBpbnQgaW5fbWFwcGVkX2FkZHI7CisgICAgc3RydWN0IG1mY19zdHJtX3JlZl9idWZfYXJnIG91dF91X2FkZHI7CisgICAgc3RydWN0IG1mY19zdHJtX3JlZl9idWZfYXJnIG91dF9wX2FkZHI7CisgICAgc3RydWN0IG1mY19zdHJtX3JlZl9idWZfYXJnIG91dF9idWZfc2l6ZTsKKyAgICB1bnNpZ25lZCBpbnQgb3V0X2hlYWRlcl9zaXplOworfTsKKworc3RydWN0IG1mY19lbmNfaW5pdF9oMjYzX2FyZyB7CisgICAgaW50IGluX3JjX2ZyYW1lcmF0ZTsgICAgLyogW0lOXSAgUkMgcGFyYW1ldGVyIChmcmFtZXJhdGUpICovCit9OworCitzdHJ1Y3QgbWZjX2VuY19pbml0X21wZWc0X2FyZyB7CisgICAgaW50IGluX3Byb2ZpbGU7ICAgICAvKiBbSU5dIHByb2ZpbGUgKi8KKyAgICBpbnQgaW5fbGV2ZWw7ICAgICAgIC8qIFtJTl0gbGV2ZWwgKi8KKworICAgIGludCBpbl92b3BfcXVhbnRfYjsgLyogW0lOXSBWT1AgcXVhbnQgZm9yIEIgZnJhbWUgKi8KKworICAgIC8qIFtJTl0gQiBmcmFtZSBudW1iZXIgKi8KKyAgICBpbnQgaW5fYmZyYW1lbnVtOworCisgICAgLyogW0lOXSBRdWFydGVyLXBlbCBNQyBlbmFibGUgKDE6ZW5hYmxlZCwgMDpkaXNhYmxlZCkgKi8KKyAgICBpbnQgaW5fcXVhcnRfcGl4ZWw7CisKKyAgICBpbnQgaW5fVGltZUluY3JlYW1lbnRSZXM7ICAgLyogW0lOXSBWT1AgdGltZSByZXNvbHV0aW9uICovCisgICAgaW50IGluX1ZvcFRpbWVJbmNyZWFtZW50OyAgIC8qIFtJTl0gRnJhbWUgZGVsdGEgKi8KK307CisKK3N0cnVjdCBtZmNfZW5jX2luaXRfaDI2NF9hcmcgeworICAgIGludCBpbl9wcm9maWxlOyAgICAgLyogW0lOXSBwcm9maWxlICovCisgICAgaW50IGluX2xldmVsOyAgICAgICAvKiBbSU5dIGxldmVsICovCisKKyAgICBpbnQgaW5fdm9wX3F1YW50X2I7IC8qIFtJTl0gVk9QIHF1YW50IGZvciBCIGZyYW1lICovCisKKyAgICAvKiBbSU5dIEIgZnJhbWUgbnVtYmVyICovCisgICAgaW50IGluX2JmcmFtZW51bTsKKworICAgIC8qIFtJTl0gaW50ZXJsYWNlIG1vZGUoMDpwcm9ncmVzc2l2ZSwgMTppbnRlcmxhY2UpICovCisgICAgaW50IGluX2ludGVybGFjZV9tb2RlOworCisgICAgLyogW0lOXSAgcmVmZXJlbmNlIG51bWJlciAqLworICAgIGludCBpbl9yZWZlcmVuY2VfbnVtOworICAgIC8qIFtJTl0gIHJlZmVyZW5jZSBudW1iZXIgb2YgUCBmcmFtZSAqLworICAgIGludCBpbl9yZWZfbnVtX3A7CisKKyAgICBpbnQgaW5fcmNfZnJhbWVyYXRlOyAgICAvKiBbSU5dICBSQyBwYXJhbWV0ZXIgKGZyYW1lcmF0ZSkgKi8KKyAgICBpbnQgaW5fcmNfbWJfZW47ICAgIC8qIFtJTl0gUkMgZW5hYmxlICgwOmRpc2FibGUsIDE6TUIgbGV2ZWwgUkMpICovCisgICAgLyogW0lOXSBNQiBsZXZlbCByYXRlIGNvbnRyb2wgZGFyayByZWdpb24gYWRhcHRpdmUgZmVhdHVyZSAqLworICAgIGludCBpbl9yY19tYl9kYXJrX2RpczsgIC8qICgwOmVuYWJsZSwgMTpkaXNhYmxlKSAqLworICAgIC8qIFtJTl0gTUIgbGV2ZWwgcmF0ZSBjb250cm9sIHNtb290aCByZWdpb24gYWRhcHRpdmUgZmVhdHVyZSAqLworICAgIGludCBpbl9yY19tYl9zbW9vdGhfZGlzOyAgICAvKiAoMDplbmFibGUsIDE6ZGlzYWJsZSkgKi8KKyAgICAvKiBbSU5dIE1CIGxldmVsIHJhdGUgY29udHJvbCBzdGF0aWMgcmVnaW9uIGFkYXB0aXZlIGZlYXR1cmUgKi8KKyAgICBpbnQgaW5fcmNfbWJfc3RhdGljX2RpczsgICAgLyogKDA6ZW5hYmxlLCAxOmRpc2FibGUpICovCisgICAgLyogW0lOXSBNQiBsZXZlbCByYXRlIGNvbnRyb2wgYWN0aXZpdHkgcmVnaW9uIGFkYXB0aXZlIGZlYXR1cmUgKi8KKyAgICBpbnQgaW5fcmNfbWJfYWN0aXZpdHlfZGlzOyAgLyogKDA6ZW5hYmxlLCAxOmRpc2FibGUpICovCisKKyAgICAvKiBbSU5dICBkaXNhYmxlIGRlYmxvY2tpbmcgZmlsdGVyIGlkYyAqLworICAgIGludCBpbl9kZWJsb2NrX2RpczsgLyogKDA6IGVuYWJsZSwxOiBkaXNhYmxlLCAyOkRpc2FibGUgYXQgc2xpY2UgYm91bmRhcnkpICovCisgICAgLyogW0lOXSAgc2xpY2UgYWxwaGEgYzAgb2Zmc2V0IG9mIGRlYmxvY2tpbmcgZmlsdGVyICovCisgICAgaW50IGluX2RlYmxvY2tfYWxwaGFfYzA7CisgICAgLyogW0lOXSAgc2xpY2UgYmV0YSBvZmZzZXQgb2YgZGVibG9ja2luZyBmaWx0ZXIgKi8KKyAgICBpbnQgaW5fZGVibG9ja19iZXRhOworCisgICAgLyogW0lOXSAgKCAwIDogQ0FWTEMsIDEgOiBDQUJBQyApICovCisgICAgaW50IGluX3N5bWJvbG1vZGU7CisgICAgLyogW0lOXSAoMDogb25seSA0eDQgdHJhbnNmb3JtLCAxOiBhbGxvdyB1c2luZyA4eDggdHJhbnNmb3JtKSAqLworICAgIGludCBpbl90cmFuc2Zvcm04eDhfbW9kZTsKKworICAgIC8qIFtJTl0gSW50ZXIgd2VpZ2h0ZWQgcGFyYW1ldGVyIGZvciBtb2RlIGRlY2lzaW9uICovCisgICAgaW50IGluX21kX2ludGVyd2VpZ2h0X3BwczsKKyAgICAvKiBbSU5dIEludHJhIHdlaWdodGVkIHBhcmFtZXRlciBmb3IgbW9kZSBkZWNpc2lvbiAqLworICAgIGludCBpbl9tZF9pbnRyYXdlaWdodF9wcHM7Cit9OworCitzdHJ1Y3QgbWZjX2VuY19pbml0X2FyZyB7CisgICAgc3RydWN0IG1mY19lbmNfaW5pdF9jb21tb25fYXJnIGNtbjsKKyAgICB1bmlvbiB7CisgICAgICAgIHN0cnVjdCBtZmNfZW5jX2luaXRfaDI2NF9hcmcgaDI2NDsKKyAgICAgICAgc3RydWN0IG1mY19lbmNfaW5pdF9tcGVnNF9hcmcgbXBlZzQ7CisgICAgICAgIHN0cnVjdCBtZmNfZW5jX2luaXRfaDI2M19hcmcgaDI2MzsKKyAgICB9IGNvZGVjOworfTsKKworc3RydWN0IG1mY19lbmNfZXhlX2FyZyB7CisgICAgU1NCU0lQX01GQ19DT0RFQ19UWVBFIGluX2NvZGVjX3R5cGU7IC8qIFtJTl0gIGNvZGVjIHR5cGUgKi8KKyAgICB1bnNpZ25lZCBpbnQgaW5fWV9hZGRyOyAgICAgICAgICAgICAgLyogW0lOXSAgSW4tYnVmZmVyIGFkZHIgb2YgWSBjb21wb25lbnQgKi8KKyAgICB1bnNpZ25lZCBpbnQgaW5fQ2JDcl9hZGRyOyAgICAgICAgICAgLyogW0lOXSAgSW4tYnVmZmVyIGFkZHIgb2YgQ2JDciBjb21wb25lbnQgKi8KKyAgICB1bnNpZ25lZCBpbnQgaW5fWV9hZGRyX3ZpcjsgICAgICAgICAgLyogW0lOXSAgSW4tYnVmZmVyIGFkZHIgb2YgWSBjb21wb25lbnQgKi8KKyAgICB1bnNpZ25lZCBpbnQgaW5fQ2JDcl9hZGRyX3ZpcjsgICAgICAgLyogW0lOXSAgSW4tYnVmZmVyIGFkZHIgb2YgQ2JDciBjb21wb25lbnQgKi8KKyAgICB1bnNpZ25lZCBpbnQgaW5fc3RybV9zdDsgICAgICAgICAgICAgLyogW0lOXSAgT3V0LWJ1ZmZlciBzdGFydCBhZGRyIG9mIGVuY29kZWQgc3RybSAqLworICAgIHVuc2lnbmVkIGludCBpbl9zdHJtX2VuZDsgICAgICAgICAgICAvKiBbSU5dICBPdXQtYnVmZmVyIGVuZCBhZGRyIG9mIGVuY29kZWQgc3RybSAqLworICAgIHVuc2lnbmVkIGludCBpbl9mcmFtZXRhZzsgICAvKiBbSU5dICB1bmlxdWUgZnJhbWUgSUQgKi8KKworICAgIHVuc2lnbmVkIGludCBvdXRfZnJhbWVfdHlwZTsgICAgICAgICAvKiBbT1VUXSBmcmFtZSB0eXBlICovCisgICAgaW50IG91dF9lbmNvZGVkX3NpemU7ICAgICAgICAgICAgICAgIC8qIFtPVVRdIExlbmd0aCBvZiBFbmNvZGVkIHZpZGVvIHN0cmVhbSAqLworICAgIHVuc2lnbmVkIGludCBvdXRfWV9hZGRyOyAgICAvKltPVVRdT3V0LWJ1ZmZlciBhZGRyIG9mIGVuY29kZWQgWSBjb21wb25lbnQgKi8KKyAgICB1bnNpZ25lZCBpbnQgb3V0X0NiQ3JfYWRkcjsgLypbT1VUXU91dC1idWZmZXIgYWRkciBvZiBlbmNvZGVkIENiQ3IgY29tcG9uZW50ICovCisgICAgdW5zaWduZWQgaW50IG91dF9mcmFtZXRhZ190b3A7ICAvKiBbT1VUXSB1bmlxdWUgZnJhbWUgSUQgb2YgYW4gb3V0cHV0IGZyYW1lIG9yIHRvcCBmaWVsZCAqLworICAgIHVuc2lnbmVkIGludCBvdXRfZnJhbWV0YWdfYm90dG9tOy8qIFtPVVRdIHVuaXF1ZSBmcmFtZSBJRCBvZiBib3R0b20gZmllbGQgKi8KKworI2lmIGRlZmluZWQoQ09ORklHX1ZJREVPX01GQ19WQ01fVU1QKQorICAgIHVuc2lnbmVkIGludCBvdXRfeV9zZWN1cmVfaWQ7CisgICAgdW5zaWduZWQgaW50IG91dF9jX3NlY3VyZV9pZDsKKyNlbGlmIGRlZmluZWQoQ09ORklHX1M1UF9WTUVNKQorICAgIHVuc2lnbmVkIGludCBvdXRfeV9jb29raWU7CisgICAgdW5zaWduZWQgaW50IG91dF9jX2Nvb2tpZTsKKyNlbmRpZgorfTsKKworc3RydWN0IG1mY19kZWNfaW5pdF9hcmcgeworICAgIFNTQlNJUF9NRkNfQ09ERUNfVFlQRSBpbl9jb2RlY190eXBlOyAgICAvKiBbSU5dIGNvZGVjIHR5cGUgKi8KKyAgICBpbnQgaW5fc3RybV9idWY7ICAgICAgICAvKiBbSU5dIGFkZHJlc3Mgb2Ygc3RyZWFtIGJ1ZmZlciAqLworICAgIGludCBpbl9zdHJtX3NpemU7ICAgICAgIC8qIFtJTl0gZmlsbGVkIHNpemUgaW4gc3RyZWFtIGJ1ZmZlciAqLworICAgIGludCBpbl9wYWNrZWRfUEI7ICAgICAgICAgICAgICAgICAgICAvKiBbSU5dICBJcyBwYWNrZWQgUEIgZnJhbWUgb3Igbm90LCAxOiBwYWNrZWRQQiAgMDogdW5wYWNrZWQgKi8KKworICAgIHVuc2lnbmVkIGludCBpbl9jcmM7ICAgICAgICAvKiBbSU5dICovCisgICAgdW5zaWduZWQgaW50IGluX3BpeGVsY2FjaGU7IC8qIFtJTl0gKi8KKyAgICB1bnNpZ25lZCBpbnQgaW5fc2xpY2U7ICAgICAgLyogW0lOXSAqLworICAgIHVuc2lnbmVkIGludCBpbl9udW1leHRyYWRwYjsgICAgLyogW0lOXSAqLworCisgICAgdW5zaWduZWQgaW50IGluX21hcHBlZF9hZGRyOworCisgICAgaW50IG91dF9mcm1fd2lkdGg7ICAgICAgLyogW09VVF0gd2lkdGggIG9mIFlVVjQyMCBmcmFtZSAqLworICAgIGludCBvdXRfZnJtX2hlaWdodDsgICAgIC8qIFtPVVRdIGhlaWdodCBvZiBZVVY0MjAgZnJhbWUgKi8KKyAgICBpbnQgb3V0X2J1Zl93aWR0aDsgIC8qIFtPVVRdIHdpZHRoICBvZiBZVVY0MjAgZnJhbWUgKi8KKyAgICBpbnQgb3V0X2J1Zl9oZWlnaHQ7IC8qIFtPVVRdIGhlaWdodCBvZiBZVVY0MjAgZnJhbWUgKi8KKworICAgIGludCBvdXRfZHBiX2NudDsgICAgLyogW09VVF0gdGhlIG51bWJlciBvZiBidWZmZXJzIHdoaWNoIGlzIG5lc3NhcnkgZHVyaW5nIGRlY29kaW5nLiAqLworCisgICAgaW50IG91dF9jcm9wX3JpZ2h0X29mZnNldDsgLyogW09VVF0gY3JvcCBpbmZvcm1hdGlvbiBmb3IgaDI2NCAqLworICAgIGludCBvdXRfY3JvcF9sZWZ0X29mZnNldDsKKyAgICBpbnQgb3V0X2Nyb3BfYm90dG9tX29mZnNldDsKKyAgICBpbnQgb3V0X2Nyb3BfdG9wX29mZnNldDsKK307CisKK3N0cnVjdCBtZmNfZGVjX2V4ZV9hcmcgeworICAgIFNTQlNJUF9NRkNfQ09ERUNfVFlQRSBpbl9jb2RlY190eXBlOyAvKiBbSU5dICBjb2RlYyB0eXBlICovCisgICAgaW50IGluX3N0cm1fYnVmOyAgLyogW0lOXSAgdGhlIHBoeXNpY2FsIGFkZHJlc3Mgb2YgU1RSTV9CVUYgKi8KKyAgICAvKiBbSU5dICBTaXplIG9mIHZpZGVvIHN0cmVhbSBmaWxsZWQgaW4gU1RSTV9CVUYgKi8KKyAgICBpbnQgaW5fc3RybV9zaXplOworICAgIC8qIFtJTl0gdGhlIGFkZHJlc3Mgb2YgZHBiIEZSQU1FX0JVRiAqLworICAgIHN0cnVjdCBtZmNfZnJhbWVfYnVmX2FyZyBpbl9mcm1fYnVmOworICAgIC8qIFtJTl0gc2l6ZSBvZiBkcGIgRlJBTUVfQlVGICovCisgICAgc3RydWN0IG1mY19mcmFtZV9idWZfYXJnIGluX2ZybV9zaXplOworICAgIC8qIFtJTl0gVW5pcXVlIGZyYW1lIElEIGVnLiBhcHBsaWNhdGlvbiBzcGVjaWZpYyB0aW1lc3RhbXAgKi8KKyAgICB1bnNpZ25lZCBpbnQgaW5fZnJhbWV0YWc7CisgICAgLyogW0lOXSBpbW1kaWF0ZSBEaXNwbGF5IGZvciBzZWVrLHRodW1ibmFpbCBhbmQgb25lIGZyYW1lICovCisgICAgaW50IGluX2ltbWVkaWF0ZWx5X2Rpc3A7CisgICAgLyogW09VVF0gIHRoZSBwaHlzaWNhbCBhZGRyZXNzIG9mIGRpc3BsYXkgYnVmICovCisgICAgaW50IG91dF9kaXNwbGF5X1lfYWRkcjsKKyAgICAvKiBbT1VUXSAgdGhlIHBoeXNpY2FsIGFkZHJlc3Mgb2YgZGlzcGxheSBidWYgKi8KKyAgICBpbnQgb3V0X2Rpc3BsYXlfQ19hZGRyOworICAgIGludCBvdXRfZGlzcGxheV9zdGF0dXM7CisgICAgLyogW09VVF0gdW5pcXVlIGZyYW1lIElEIG9mIGFuIG91dHB1dCBmcmFtZSBvciB0b3AgZmllbGQgKi8KKyAgICB1bnNpZ25lZCBpbnQgb3V0X2ZyYW1ldGFnX3RvcDsKKyAgICAgLyogW09VVF0gdW5pcXVlIGZyYW1lIElEIG9mIGJvdHRvbSBmaWVsZCAqLworICAgIHVuc2lnbmVkIGludCBvdXRfZnJhbWV0YWdfYm90dG9tOworICAgIGludCBvdXRfcGljX3RpbWVfdG9wOworICAgIGludCBvdXRfcGljX3RpbWVfYm90dG9tOworICAgIGludCBvdXRfY29uc3VtZWRfYnl0ZTsKKworICAgIGludCBvdXRfY3JvcF9yaWdodF9vZmZzZXQ7CisgICAgaW50IG91dF9jcm9wX2xlZnRfb2Zmc2V0OworICAgIGludCBvdXRfY3JvcF9ib3R0b21fb2Zmc2V0OworICAgIGludCBvdXRfY3JvcF90b3Bfb2Zmc2V0OworCisgICAgLyogaW4gbmV3IGRyaXZlciwgZWFjaCBidWZmZXIgb2Zmc2V0IG11c3QgYmUgcmV0dXJuIHRvIHRoZSB1c2VyICovCisgICAgaW50IG91dF95X29mZnNldDsKKyAgICBpbnQgb3V0X2Nfb2Zmc2V0OworCisjaWYgZGVmaW5lZChDT05GSUdfVklERU9fTUZDX1ZDTV9VTVApCisgICAgdW5zaWduZWQgaW50IG91dF95X3NlY3VyZV9pZDsKKyAgICB1bnNpZ25lZCBpbnQgb3V0X2Nfc2VjdXJlX2lkOworI2VsaWYgZGVmaW5lZChDT05GSUdfUzVQX1ZNRU0pCisgICAgdW5zaWduZWQgaW50IG91dF95X2Nvb2tpZTsKKyAgICB1bnNpZ25lZCBpbnQgb3V0X2NfY29va2llOworI2VuZGlmCisgICAgaW50IG91dF9pbWdfd2lkdGg7ICAgICAgICAgICAgICAgICAgIC8qIFtPVVRdIHdpZHRoICBvZiBZVVY0MjAgZnJhbWUgKi8KKyAgICBpbnQgb3V0X2ltZ19oZWlnaHQ7ICAgICAgICAgICAgICAgICAgLyogW09VVF0gaGVpZ2h0IG9mIFlVVjQyMCBmcmFtZSAqLworICAgIGludCBvdXRfYnVmX3dpZHRoOyAgICAgICAgICAgICAgICAgICAvKiBbT1VUXSB3aWR0aCAgb2YgWVVWNDIwIGZyYW1lICovCisgICAgaW50IG91dF9idWZfaGVpZ2h0OyAgICAgICAgICAgICAgICAgIC8qIFtPVVRdIGhlaWdodCBvZiBZVVY0MjAgZnJhbWUgKi8KKworICAgIGludCBvdXRfZGlzcF9waWNfZnJhbWVfdHlwZTsgICAgICAgIC8qIFtPVVRdIGRpc3BsYXkgcGljdHVyZSBmcmFtZSB0eXBlIGluZm9ybWF0aW9uICovCit9OworCitzdHJ1Y3QgbWZjX2dldF9jb25maWdfYXJnIHsKKyAgICAvKiBbSU5dIENvbmZpZ3VyYWJsZSBwYXJhbWV0ZXIgdHlwZSAqLworICAgIGludCBpbl9jb25maWdfcGFyYW07CisKKyAgICAvKiBbSU5dIFZhbHVlcyB0byBnZXQgZm9yIHRoZSBjb25maWd1cmFibGUgcGFyYW1ldGVyLiAqLworICAgIC8qIE1heGltdW0gZm91ciBpbnRlZ2VyIHZhbHVlcyBjYW4gYmUgb2J0YWluZWQ7ICovCisgICAgaW50IG91dF9jb25maWdfdmFsdWVbNF07Cit9OworCitzdHJ1Y3QgbWZjX3NldF9jb25maWdfYXJnIHsKKyAgICAvKiBbSU5dIENvbmZpZ3VyYWJsZSBwYXJhbWV0ZXIgdHlwZSAqLworICAgIGludCBpbl9jb25maWdfcGFyYW07CisKKyAgICAvKiBbSU5dICBWYWx1ZXMgdG8gYmUgc2V0IGZvciB0aGUgY29uZmlndXJhYmxlIHBhcmFtZXRlci4gKi8KKyAgICAvKiBNYXhpbXVtIGZvdXIgaW50ZWdlciB2YWx1ZXMgY2FuIGJlIHNldC4gKi8KKyAgICBpbnQgaW5fY29uZmlnX3ZhbHVlWzRdOworfTsKKworc3RydWN0IG1mY19nZXRfcmVhbF9hZGRyX2FyZyB7CisgICAgdW5zaWduZWQgaW50IGtleTsKKyAgICB1bnNpZ25lZCBpbnQgYWRkcjsKK307CisKK3N0cnVjdCBtZmNfYnVmX2FsbG9jX2FyZyB7CisgICAgZW51bSBpbnN0X3R5cGUgdHlwZTsKKyAgICBpbnQgc2l6ZTsKKyAgICAvKgorICAgIHVuc2lnbmVkIGludCBtYXBwZWQ7CisgICAgKi8KKyAgICB1bnNpZ25lZCBpbnQgYWxpZ247CisKKyAgICB1bnNpZ25lZCBpbnQgYWRkcjsKKyAgICAvKgorICAgIHVuc2lnbmVkIGludCBwaHlzOworICAgICovCisjaWYgZGVmaW5lZChDT05GSUdfVklERU9fTUZDX1ZDTV9VTVApCisgICAgLyogRklNWEU6IGludmFsaWQgc2VjdXJlIGlkID09IC0xICovCisgICAgdW5zaWduZWQgaW50IHNlY3VyZV9pZDsKKyNlbGlmIGRlZmluZWQoQ09ORklHX1M1UF9WTUVNKQorICAgIHVuc2lnbmVkIGludCBjb29raWU7CisjZWxzZQorICAgIHVuc2lnbmVkIGludCBvZmZzZXQ7CisjZW5kaWYKK307CisKK3N0cnVjdCBtZmNfYnVmX2ZyZWVfYXJnIHsKKyAgICB1bnNpZ25lZCBpbnQgYWRkcjsKK307CisKKy8qIFJNVk1FICovCitzdHJ1Y3QgbWZjX21lbV9hbGxvY19hcmcgeworICAgIGVudW0gaW5zdF90eXBlIHR5cGU7CisgICAgaW50IGJ1ZmZfc2l6ZTsKKyAgICBTU0JJUF9NRkNfQlVGRkVSX1RZUEUgYnVmX2NhY2hlX3R5cGU7CisgICAgdW5zaWduZWQgaW50IG1hcHBlZF9hZGRyOworI2lmIGRlZmluZWQoQ09ORklHX1ZJREVPX01GQ19WQ01fVU1QKQorICAgIHVuc2lnbmVkIGludCBzZWN1cmVfaWQ7CisjZWxpZiBkZWZpbmVkKENPTkZJR19TNVBfVk1FTSkKKyAgICB1bnNpZ25lZCBpbnQgY29va2llOworI2Vsc2UKKyAgICB1bnNpZ25lZCBpbnQgb2Zmc2V0OworI2VuZGlmCit9OworCitzdHJ1Y3QgbWZjX21lbV9mcmVlX2FyZyB7CisgICAgdW5zaWduZWQgaW50IGtleTsKK307CisvKiBSTVZNRSAqLworCit1bmlvbiBtZmNfYXJncyB7CisgICAgLyoKKyAgICBzdHJ1Y3QgbWZjX2VuY19pbml0X2FyZyBlbmNfaW5pdDsKKworICAgIHN0cnVjdCBtZmNfZW5jX2luaXRfbXBlZzRfYXJnIGVuY19pbml0X21wZWc0OworICAgIHN0cnVjdCBtZmNfZW5jX2luaXRfbXBlZzRfYXJnIGVuY19pbml0X2gyNjM7CisgICAgc3RydWN0IG1mY19lbmNfaW5pdF9oMjY0X2FyZyBlbmNfaW5pdF9oMjY0OworICAgICovCisgICAgc3RydWN0IG1mY19lbmNfaW5pdF9hcmcgZW5jX2luaXQ7CisgICAgc3RydWN0IG1mY19lbmNfZXhlX2FyZyBlbmNfZXhlOworCisgICAgc3RydWN0IG1mY19kZWNfaW5pdF9hcmcgZGVjX2luaXQ7CisgICAgc3RydWN0IG1mY19kZWNfZXhlX2FyZyBkZWNfZXhlOworCisgICAgc3RydWN0IG1mY19nZXRfY29uZmlnX2FyZyBnZXRfY29uZmlnOworICAgIHN0cnVjdCBtZmNfc2V0X2NvbmZpZ19hcmcgc2V0X2NvbmZpZzsKKworICAgIHN0cnVjdCBtZmNfYnVmX2FsbG9jX2FyZyBidWZfYWxsb2M7CisgICAgc3RydWN0IG1mY19idWZfZnJlZV9hcmcgYnVmX2ZyZWU7CisgICAgc3RydWN0IG1mY19nZXRfcmVhbF9hZGRyX2FyZyByZWFsX2FkZHI7CisKKyAgICAvKiBSTVZNRSAqLworICAgIHN0cnVjdCBtZmNfbWVtX2FsbG9jX2FyZyBtZW1fYWxsb2M7CisgICAgc3RydWN0IG1mY19tZW1fZnJlZV9hcmcgbWVtX2ZyZWU7CisgICAgLyogUk1WTUUgKi8KK307CisKK3N0cnVjdCBtZmNfY29tbW9uX2FyZ3MgeworICAgIGVudW0gbWZjX3JldF9jb2RlIHJldF9jb2RlOyAvKiBbT1VUXSBlcnJvciBjb2RlICovCisgICAgdW5pb24gbWZjX2FyZ3MgYXJnczsKK307CisKK3N0cnVjdCBtZmNfZW5jX3Z1aV9pbmZvIHsKKyAgICBpbnQgYXNwZWN0X3JhdGlvX2lkYzsKK307CisKK3N0cnVjdCBtZmNfZGVjX2ZpbXYxX2luZm8geworICAgIGludCB3aWR0aDsKKyAgICBpbnQgaGVpZ2h0OworfTsKKworc3RydWN0IG1mY19lbmNfaGllcl9wX3FwIHsKKyAgICBpbnQgdDBfZnJhbWVfcXA7CisgICAgaW50IHQyX2ZyYW1lX3FwOworICAgIGludCB0M19mcmFtZV9xcDsKK307CisKK2VudW0gQlVGX1NUQVRVUyB7CisgICAgQlVGX0VOUVVFVUVELAorICAgIEJVRl9ERVFVRVVFRAorfTsKKworc3RydWN0IG1mY19kZWNfdjRsMiB7CisgICAgY2hhciAqbWZjX3NyY19idWZzW01GQ19ERUNfTlVNX1NSQ19CVUZTXTsgICAgICAgICAgICAgICAgICAgLyogaW5mb3JtYXRpb24gb2Ygc291cmNlIGJ1ZmZlcnMgKi8KKyAgICBjaGFyICptZmNfZHN0X2J1ZnNbTUZDX0RFQ19NQVhfRFNUX0JVRlNdW01GQ19ERUNfTlVNX1BMQU5FU107ICAgLyogaW5mb3JtYXRpb24gb2YgZGVzdGluYXRpb24gYnVmZmVycyAqLworICAgIGNoYXIgKm1mY19kc3RfcGh5c1tNRkNfREVDX01BWF9EU1RfQlVGU11bTUZDX0RFQ19OVU1fUExBTkVTXTsgICAvKiBjbWEgaW5mb3JtYXRpb24gb2YgZGVzdGluYXRpb24gYnVmZmVycyAqLworCisgICAgdW5zaWduZWQgaW50IG1mY19zcmNfYnVmc19sZW47ICAgICAgICAgICAgICAgICAgICAgIC8qIG5lZWRlZCBmb3IgbXVubWFwICovCisgICAgdW5zaWduZWQgaW50IG1mY19kc3RfYnVmc19sZW5bTUZDX0RFQ19OVU1fUExBTkVTXTsgIC8qIG5lZWRlZCBmb3IgbXVubWFwICovCisKKyAgICB1bnNpZ25lZCBpbnQgbWZjX251bV9zcmNfYnVmczsgIC8qIHRoZSBudW1iZXIgb2Ygc291cmNlIGJ1ZmZlcnMgKi8KKyAgICB1bnNpZ25lZCBpbnQgbWZjX251bV9kc3RfYnVmczsgIC8qIHRoZSBudW1iZXIgb2YgZGVzdGluYXRpb24gYnVmZmVycyAqLworCisgICAgY2hhciBtZmNfc3JjX2J1Zl9mbGFnc1tNRkNfREVDX05VTV9TUkNfQlVGU107CisgICAgaW50IGJCZWluZ0ZpbmFsaXplZDsKKyAgICBpbnQgYWxsb2NJbmRleDsKKyAgICBpbnQgYmVpbmdVc2VkSW5kZXg7Cit9OworCitzdHJ1Y3QgbWZjX2VuY192NGwyIHsKKyAgICBjaGFyICptZmNfc3JjX2J1ZnNbTUZDX0VOQ19OVU1fU1JDX0JVRlNdW01GQ19FTkNfTlVNX1BMQU5FU107CisgICAgY2hhciAqbWZjX3NyY19waHlzW01GQ19FTkNfTlVNX1NSQ19CVUZTXVtNRkNfRU5DX05VTV9QTEFORVNdOworICAgIGNoYXIgKm1mY19kc3RfYnVmc1tNRkNfRU5DX01BWF9EU1RfQlVGU107CisKKyAgICB1bnNpZ25lZCBpbnQgbWZjX3NyY19idWZzX2xlbltNRkNfRU5DX05VTV9QTEFORVNdOworICAgIHVuc2lnbmVkIGludCBtZmNfZHN0X2J1ZnNfbGVuOworCisgICAgdW5zaWduZWQgaW50IG1mY19udW1fc3JjX2J1ZnM7CisgICAgdW5zaWduZWQgaW50IG1mY19udW1fZHN0X2J1ZnM7CisKKyAgICB1bnNpZ25lZCBpbnQgbWZjX2RzdF9idWZzX2J5dGVzX3VzZWRfbGVuOworICAgIGNoYXIgbWZjX3NyY19idWZfZmxhZ3NbTUZDX0VOQ19OVU1fU1JDX0JVRlNdOworICAgIGludCBiUnVubmluZzsKKyAgICBpbnQgYklucHV0UGh5VmlyOyAgICAgICAgICAgICAgIC8qIEZsYWcgdG8gdXNlIE1GQyBzcmMgYXMgcGh5c2ljYWwgb3IgdmlydHVhbCAwOiB2aXJ0dWFsICAxOiBwaHlzaWNhbCAqLworICAgIGludCBiZWluZ1VzZWRJbmRleDsKK307CisKK3R5cGVkZWYgc3RydWN0IHsKKyAgICBpbnQgbWFnaWM7CisgICAgaW50IGhNRkM7CisgICAgaW50IGhWTUVNOworICAgIGludCB3aWR0aDsKKyAgICBpbnQgaGVpZ2h0OworICAgIGludCBzaXplU3RybUJ1ZjsKKyAgICBzdHJ1Y3QgbWZjX2ZyYW1lX2J1Zl9hcmcgc2l6ZUZybUJ1ZjsKKyAgICBpbnQgZGlzcGxheVN0YXR1czsKKyAgICBpbnQgaW50ZXJfYnVmZl9zdGF0dXM7CisgICAgdW5zaWduZWQgaW50IHZpckZyZWVTdHJtQWRkcjsKKyAgICB1bnNpZ25lZCBpbnQgcGh5U3RybUJ1ZjsKKyAgICB1bnNpZ25lZCBpbnQgdmlyU3RybUJ1ZjsKKyAgICB1bnNpZ25lZCBpbnQgdmlyTXZSZWZZQzsKKyAgICBzdHJ1Y3QgbWZjX2ZyYW1lX2J1Zl9hcmcgcGh5RnJtQnVmOworICAgIHN0cnVjdCBtZmNfZnJhbWVfYnVmX2FyZyB2aXJGcm1CdWY7CisgICAgdW5zaWduZWQgaW50IG1hcHBlZF9hZGRyOworICAgIHVuc2lnbmVkIGludCBtYXBwZWRfc2l6ZTsKKyAgICBzdHJ1Y3QgbWZjX2NvbW1vbl9hcmdzIE1mY0FyZzsKKyAgICBTU0JTSVBfTUZDX0NPREVDX1RZUEUgY29kZWNUeXBlOworICAgIFNTQlNJUF9NRkNfREVDX09VVFBVVF9JTkZPIGRlY091dEluZm87CisgICAgdW5zaWduZWQgaW50IGluZnJhbWV0YWc7CisgICAgdW5zaWduZWQgaW50IG91dGZyYW1ldGFndG9wOworICAgIHVuc2lnbmVkIGludCBvdXRmcmFtZXRhZ2JvdHRvbTsKKyAgICB1bnNpZ25lZCBpbnQgaW1tZWRpYXRlbHlkaXNwOworICAgIHVuc2lnbmVkIGludCBlbmNvZGVkSGVhZGVyU2l6ZTsKKyAgICBpbnQgZW5jb2RlZERhdGFTaXplOworICAgIHVuc2lnbmVkIGludCBlbmNvZGVkZnJhbWVUeXBlOworICAgIHN0cnVjdCBtZmNfZnJhbWVfYnVmX2FyZyBlbmNvZGVkcGh5RnJtQnVmOworCisgICAgdW5zaWduZWQgaW50IGRlY19jcmM7CisgICAgdW5zaWduZWQgaW50IGRlY19waXhlbGNhY2hlOworICAgIHVuc2lnbmVkIGludCBkZWNfc2xpY2U7CisgICAgdW5zaWduZWQgaW50IGRlY19udW1leHRyYWRwYjsKKworICAgIGludCBpbnB1dF9jb29raWU7CisgICAgaW50IGlucHV0X3NlY3VyZV9pZDsKKyAgICBpbnQgaW5wdXRfc2l6ZTsKKworICAgIC8qIHRvIHN1cHBvcnQgbm9uLWJsb2NraW5nIG1vZGUgKi8KKyAgICB1bnNpZ25lZCBpbnQgZW5jb2RlX2NudDsKKworICAgIHN0cnVjdCBtZmNfZGVjX3Y0bDIgdjRsMl9kZWM7CisgICAgc3RydWN0IG1mY19lbmNfdjRsMiB2NGwyX2VuYzsKKworICAgIGludCBlbmNfZnJhbWVza2lwOworICAgIGludCBjYWNoZWFibGVidWZmZXI7CisgICAgc3RydWN0IG1mY19kZWNfZmltdjFfaW5mbyBmaW12MV9yZXM7CisgICAgU1NCU0lQX01GQ19MQVNUX0ZSQU1FX1NUQVRVUyBsYXN0ZnJhbWU7CisgICAgU1NCU0lQX01GQ19JTlNUUk1fTU9ERV9UWVBFIGZyYW1lbWFwOworfSBfTUZDTElCOworCisjZGVmaW5lIEVOQ19QUk9GSUxFX0xFVkVMKHByb2ZpbGUsIGxldmVsKSAgICAgICgocHJvZmlsZSkgfCAoKGxldmVsKSA8PCA4KSkKKyNkZWZpbmUgRU5DX1JDX1FCT1VORChtaW5fcXAsIG1heF9xcCkgICAgICAgICAgKChtaW5fcXApIHwgKChtYXhfcXApIDw8IDgpKQorCisjZGVmaW5lIFNTQlNJUF9NRkNfRkFJTCAgICAgICAgICAgICAgICAgICgwKQorCisjZW5kaWYgLyogX19NRkNfSU5URVJGQUNFX0ggKi8KZGlmZiAtLWdpdCBhL2V4eW5vczQvbXVsdGltZWRpYS9jb2RlY3Mvc2VjX2NvZGVjcy92aWRlby9leHlub3M1L0FuZHJvaWQubWsgYi9leHlub3M0L211bHRpbWVkaWEvY29kZWNzL3NlY19jb2RlY3MvdmlkZW8vZXh5bm9zNS9BbmRyb2lkLm1rCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjk0OWM2MzcKLS0tIC9kZXYvbnVsbAorKysgYi9leHlub3M0L211bHRpbWVkaWEvY29kZWNzL3NlY19jb2RlY3MvdmlkZW8vZXh5bm9zNS9BbmRyb2lkLm1rCkBAIC0wLDAgKzEsNyBAQAorTE9DQUxfUEFUSCA6PSAkKGNhbGwgbXktZGlyKQorCitpbmNsdWRlICQoQ0xFQVJfVkFSUykKKworTE9DQUxfVklERU9fUEFUSCA6PSQoTE9DQUxfUEFUSCkKKworaW5jbHVkZSAgICAkKExPQ0FMX1ZJREVPX1BBVEgpL21mY192NGwyL0FuZHJvaWQubWsKZGlmZiAtLWdpdCBhL2V4eW5vczQvbXVsdGltZWRpYS9jb2RlY3Mvc2VjX2NvZGVjcy92aWRlby9leHlub3M1L21mY192NGwyL0FuZHJvaWQubWsgYi9leHlub3M0L211bHRpbWVkaWEvY29kZWNzL3NlY19jb2RlY3MvdmlkZW8vZXh5bm9zNS9tZmNfdjRsMi9BbmRyb2lkLm1rCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjg5ZjNlODQKLS0tIC9kZXYvbnVsbAorKysgYi9leHlub3M0L211bHRpbWVkaWEvY29kZWNzL3NlY19jb2RlY3MvdmlkZW8vZXh5bm9zNS9tZmNfdjRsMi9BbmRyb2lkLm1rCkBAIC0wLDAgKzEsMzkgQEAKK0xPQ0FMX1BBVEggOj0gJChjYWxsIG15LWRpcikKKworaW5jbHVkZSAkKENMRUFSX1ZBUlMpCisKK0xPQ0FMX0NPUFlfSEVBREVSU19UTyA6PSBsaWJzZWNtbQorTE9DQUxfQ09QWV9IRUFERVJTIDo9IFwKKwlpbmNsdWRlL21mY19lcnJuby5oIFwKKwlpbmNsdWRlL21mY19pbnRlcmZhY2UuaCBcCisJaW5jbHVkZS9Tc2JTaXBNZmNBcGkuaAorCitMT0NBTF9NT0RVTEVfVEFHUyA6PSBvcHRpb25hbAorCitMT0NBTF9TUkNfRklMRVMgOj0gXAorCWRlYy9zcmMvU3NiU2lwTWZjRGVjQVBJLmMgXAorCWVuYy9zcmMvU3NiU2lwTWZjRW5jQVBJLmMKKworTE9DQUxfQ19JTkNMVURFUyA6PSBcCisJJChMT0NBTF9QQVRIKS9pbmNsdWRlIFwKKwkkKEJPQVJEX0hBTF9QQVRIKS9pbmNsdWRlCisKK0xPQ0FMX01PRFVMRSA6PSBsaWJzZWNtZmNhcGkKKworTE9DQUxfUFJFTElOS19NT0RVTEUgOj0gZmFsc2UKKworaWZlcSAoJChCT0FSRF9VU0VfUzNEX1NVUFBPUlQpLCB0cnVlKQorTE9DQUxfQ0ZMQUdTICs9IC1EUzNEX1NVUFBPUlQKK2VuZGlmCisKK0xPQ0FMX0FSTV9NT0RFIDo9IGFybQorCitMT0NBTF9TVEFUSUNfTElCUkFSSUVTIDo9CitMT0NBTF9TSEFSRURfTElCUkFSSUVTIDo9IGxpYmxvZworCisjaWZlcSAoJChCT0FSRF9VU0VfVjRMMl9JT04pLHRydWUpCisjTE9DQUxfQ0ZMQUdTICs9IC1EVVNFX0lPTgorI0xPQ0FMX1NIQVJFRF9MSUJSQVJJRVMgKz0gbGliaW9uCisjZW5kaWYKKworaW5jbHVkZSAkKEJVSUxEX1NUQVRJQ19MSUJSQVJZKQpkaWZmIC0tZ2l0IGEvZXh5bm9zNC9tdWx0aW1lZGlhL2NvZGVjcy9zZWNfY29kZWNzL3ZpZGVvL2V4eW5vczUvbWZjX3Y0bDIvZGVjL3NyYy9Tc2JTaXBNZmNEZWNBUEkuYyBiL2V4eW5vczQvbXVsdGltZWRpYS9jb2RlY3Mvc2VjX2NvZGVjcy92aWRlby9leHlub3M1L21mY192NGwyL2RlYy9zcmMvU3NiU2lwTWZjRGVjQVBJLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZmIwNDU4NwotLS0gL2Rldi9udWxsCisrKyBiL2V4eW5vczQvbXVsdGltZWRpYS9jb2RlY3Mvc2VjX2NvZGVjcy92aWRlby9leHlub3M1L21mY192NGwyL2RlYy9zcmMvU3NiU2lwTWZjRGVjQVBJLmMKQEAgLTAsMCArMSwxNzQwIEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDEwIFNhbXN1bmcgRWxlY3Ryb25pY3MgQ28uLCBMdGQuCisgKiAgICAgICAgICAgICAgaHR0cDovL3d3dy5zYW1zdW5nLmNvbS8KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgYXMKKyAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICoKKyAqIEFsdGVybmF0aXZlbHksIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlIDxzdGRsaWIuaD4KKyNpbmNsdWRlIDx1bmlzdGQuaD4KKyNpbmNsdWRlIDxzdHJpbmcuaD4KKyNpbmNsdWRlIDxmY250bC5oPgorCisjaW5jbHVkZSA8c3lzL3R5cGVzLmg+CisjaW5jbHVkZSA8c3lzL3N0YXQuaD4KKyNpbmNsdWRlIDxzeXMvaW9jdGwuaD4KKyNpbmNsdWRlIDxzeXMvbW1hbi5oPgorCisjaW5jbHVkZSA8c3lzL3BvbGwuaD4KKyNpbmNsdWRlICJ2aWRlb2RldjIuaCIKKworI2luY2x1ZGUgIm1mY19pbnRlcmZhY2UuaCIKKyNpbmNsdWRlICJTc2JTaXBNZmNBcGkuaCIKKyNpZmRlZiBVU0VfSU9OCisjaW5jbHVkZSAiaW9uLmgiCisjZW5kaWYKKworLyogI2RlZmluZSBMT0dfTkRFQlVHIDAgKi8KKyNkZWZpbmUgTE9HX1RBRyAiTUZDX0RFQ19BUFAiCisjaW5jbHVkZSA8dXRpbHMvTG9nLmg+CisKKy8qI2RlZmluZSBDUkNfRU5BQkxFCisjZGVmaW5lIFNMSUNFX01PREVfRU5BQkxFICovCisjZGVmaW5lIFBPTExfREVDX1dBSVRfVElNRU9VVCAyNQorCisjZGVmaW5lIFVTUl9EQVRBX1NUQVJUX0NPREUgKDB4MDAwMDAxQjIpCisjZGVmaW5lIFZPUF9TVEFSVF9DT0RFICAgICAgKDB4MDAwMDAxQjYpCisjZGVmaW5lIE1QNF9TVEFSVF9DT0RFICAgICAgKDB4MDAwMDAxKQorCisjZGVmaW5lIERFRkFVTFRfTlVNQkVSX09GX0VYVFJBX0RQQiA1CisjZGVmaW5lIENMRUFSKHgpICAgIG1lbXNldCAoJih4KSwgMCwgc2l6ZW9mKHgpKQorI2lmZGVmIFMzRF9TVVBQT1JUCisjZGVmaW5lIE9QRVJBVEVfQklUKHgsIG1hc2ssIHNoaWZ0KSAgICAoKHggJiAobWFzayA8PCBzaGlmdCkpID4+IHNoaWZ0KQorI2RlZmluZSBGUkFNRV9QQUNLX1NFSV9JTkZPX05VTSAgNAorI2VuZGlmCisKK2VudW0geworICAgIE5WMTJNVF9GTVQgPSAwLAorICAgIE5WMTJNX0ZNVCwKKyAgICBOVjIxTV9GTVQsCit9OworCitzdGF0aWMgY2hhciAqbWZjX2Rldl9uYW1lID0gU0FNU1VOR19NRkNfREVWX05BTUU7CitzdGF0aWMgaW50IG1mY19kZXZfbm9kZSA9IDY7CisKK2ludCByZWFkX2hlYWRlcl9kYXRhKHZvaWQgKm9wZW5IYW5kbGUpOworaW50IGluaXRfbWZjX291dHB1dF9zdHJlYW0odm9pZCAqb3BlbkhhbmRsZSk7CitpbnQgaXNCcmVha19sb29wKHZvaWQgKm9wZW5IYW5kbGUpOworCitpbnQgdjRsMl9tZmNfcXVlcnljYXAoaW50IGZkKQoreworICAgIHN0cnVjdCB2NGwyX2NhcGFiaWxpdHkgY2FwOworICAgIGludCByZXQ7CisKKyAgICBDTEVBUihjYXApOworCisgICAgcmV0ID0gaW9jdGwoZmQsIFZJRElPQ19RVUVSWUNBUCwgJmNhcCk7CisgICAgaWYgKHJldCAhPSAwKSB7CisgICAgICAgIExPR0UoIlslc10gVklESU9DX1FVRVJZQ0FQIGZhaWxlZCIsIF9fZnVuY19fKTsKKyAgICAgICAgcmV0dXJuIHJldDsKKyAgICB9CisKKyAgICBpZiAoIShjYXAuY2FwYWJpbGl0aWVzICYgVjRMMl9DQVBfVklERU9fQ0FQVFVSRSkpIHsKKyAgICAgICAgTE9HRSgiWyVzXSBEZXZpY2UgZG9lcyBub3Qgc3VwcG9ydCBjYXB0dXJlIiwgX19mdW5jX18pOworICAgICAgICByZXR1cm4gLTE7CisgICAgfQorCisgICAgaWYgKCEoY2FwLmNhcGFiaWxpdGllcyAmIFY0TDJfQ0FQX1ZJREVPX09VVFBVVCkpIHsKKyAgICAgICAgTE9HRSgiWyVzXSBEZXZpY2UgZG9lcyBub3Qgc3VwcG9ydCBvdXRwdXQiLCBfX2Z1bmNfXyk7CisgICAgICAgIHJldHVybiAtMTsKKyAgICB9CisKKyAgICBpZiAoIShjYXAuY2FwYWJpbGl0aWVzICYgVjRMMl9DQVBfU1RSRUFNSU5HKSkgeworICAgICAgICBMT0dFKCJbJXNdIERldmljZSBkb2VzIG5vdCBzdXBwb3J0IHN0cmVhbWluZyIsIF9fZnVuY19fKTsKKyAgICAgICAgcmV0dXJuIC0xOworICAgIH0KKworICAgIHJldHVybiAwOworfQorCitpbnQgdjRsMl9tZmNfc19mbXQoaW50IGZkLCBlbnVtIHY0bDJfYnVmX3R5cGUgdHlwZSwKKyAgICAgICAgICAgICAgICAgICAgaW50IHBpeGVsZm9ybWF0LCB1bnNpZ25lZCBpbnQgc2l6ZWltYWdlLCBpbnQgd2lkdGgsIGludCBoZWlnaHQpCit7CisgICAgaW50IHJldDsKKyAgICBzdHJ1Y3QgdjRsMl9mb3JtYXQgZm10OworCisgICAgQ0xFQVIoZm10KTsKKworICAgIGZtdC50eXBlID0gdHlwZTsKKworICAgIGlmICh0eXBlID09IFY0TDJfQlVGX1RZUEVfVklERU9fT1VUUFVUX01QTEFORSkgeworICAgICAgICBzd2l0Y2ggKHBpeGVsZm9ybWF0KSB7CisgICAgICAgIGNhc2UgSDI2NF9ERUM6CisgICAgICAgICAgICBmbXQuZm10LnBpeF9tcC5waXhlbGZvcm1hdCA9IFY0TDJfUElYX0ZNVF9IMjY0OworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgTVBFRzRfREVDOgorICAgICAgICAgICAgZm10LmZtdC5waXhfbXAucGl4ZWxmb3JtYXQgPSBWNEwyX1BJWF9GTVRfTVBFRzQ7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBIMjYzX0RFQzoKKyAgICAgICAgICAgIGZtdC5mbXQucGl4X21wLnBpeGVsZm9ybWF0ID0gVjRMMl9QSVhfRk1UX0gyNjM7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBYVklEX0RFQzoKKyAgICAgICAgICAgIGZtdC5mbXQucGl4X21wLnBpeGVsZm9ybWF0ID0gVjRMMl9QSVhfRk1UX1hWSUQ7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBNUEVHMl9ERUM6CisgICAgICAgICAgICBmbXQuZm10LnBpeF9tcC5waXhlbGZvcm1hdCA9IFY0TDJfUElYX0ZNVF9NUEVHMTI7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBGSU1WMV9ERUM6CisgICAgICAgICAgICBmbXQuZm10LnBpeF9tcC5waXhlbGZvcm1hdCA9IFY0TDJfUElYX0ZNVF9GSU1WMTsKKyAgICAgICAgICAgIGZtdC5mbXQucGl4X21wLndpZHRoID0gd2lkdGg7CisgICAgICAgICAgICBmbXQuZm10LnBpeF9tcC5oZWlnaHQgPSBoZWlnaHQ7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBGSU1WMl9ERUM6CisgICAgICAgICAgICBmbXQuZm10LnBpeF9tcC5waXhlbGZvcm1hdCA9IFY0TDJfUElYX0ZNVF9GSU1WMjsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEZJTVYzX0RFQzoKKyAgICAgICAgICAgIGZtdC5mbXQucGl4X21wLnBpeGVsZm9ybWF0ID0gVjRMMl9QSVhfRk1UX0ZJTVYzOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgRklNVjRfREVDOgorICAgICAgICAgICAgZm10LmZtdC5waXhfbXAucGl4ZWxmb3JtYXQgPSBWNEwyX1BJWF9GTVRfRklNVjQ7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBWQzFfREVDOgorICAgICAgICAgICAgZm10LmZtdC5waXhfbXAucGl4ZWxmb3JtYXQgPSBWNEwyX1BJWF9GTVRfVkMxOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgVkMxUkNWX0RFQzoKKyAgICAgICAgICAgIGZtdC5mbXQucGl4X21wLnBpeGVsZm9ybWF0ID0gVjRMMl9QSVhfRk1UX1ZDMV9SQ1Y7CisgICAgICAgICAgICBicmVhazsKKyNpZiBkZWZpbmVkIChNRkM2eF9WRVJTSU9OKQorICAgICAgICBjYXNlIFZQOF9ERUM6CisgICAgICAgICAgICBmbXQuZm10LnBpeF9tcC5waXhlbGZvcm1hdCA9IFY0TDJfUElYX0ZNVF9WUDg7CisgICAgICAgICAgICBicmVhazsKKyNlbmRpZgorICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgTE9HRSgiWyVzXSBEb2VzIE5PVCBzdXBwb3J0IHRoZSBjb2RlYyB0eXBlICglZCkiLCBfX2Z1bmNfXywgcGl4ZWxmb3JtYXQpOworICAgICAgICAgICAgcmV0dXJuIC0xOworICAgICAgICB9CisgICAgICAgIGZtdC5mbXQucGl4X21wLnBsYW5lX2ZtdFswXS5zaXplaW1hZ2UgPSBzaXplaW1hZ2U7CisgICAgfSBlbHNlIGlmICh0eXBlID09IFY0TDJfQlVGX1RZUEVfVklERU9fQ0FQVFVSRV9NUExBTkUpIHsKKyAgICAgICAgc3dpdGNoIChwaXhlbGZvcm1hdCkgeworICAgICAgICBjYXNlIE5WMTJNVF9GTVQ6CisjaWYgZGVmaW5lZCAoTUZDNnhfVkVSU0lPTikKKyAgICAgICAgICAgIGZtdC5mbXQucGl4X21wLnBpeGVsZm9ybWF0ID0gVjRMMl9QSVhfRk1UX05WMTJNVF8xNlgxNjsKKyNlbHNlCisgICAgICAgICAgICBmbXQuZm10LnBpeF9tcC5waXhlbGZvcm1hdCA9IFY0TDJfUElYX0ZNVF9OVjEyTVQ7CisjZW5kaWYKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIE5WMTJNX0ZNVDoKKyAgICAgICAgICAgIGZtdC5mbXQucGl4X21wLnBpeGVsZm9ybWF0ID0gVjRMMl9QSVhfRk1UX05WMTJNOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgTlYyMU1fRk1UOgorICAgICAgICAgICAgZm10LmZtdC5waXhfbXAucGl4ZWxmb3JtYXQgPSBWNEwyX1BJWF9GTVRfTlYyMU07CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIExPR0UoIlslc10gRG9lcyBOT1Qgc3VwcG9ydCB0aGUgcGl4ZWwgZm9ybWF0ICglZCkiLCBfX2Z1bmNfXywgcGl4ZWxmb3JtYXQpOworICAgICAgICAgICAgcmV0dXJuIC0xOworICAgICAgICB9CisgICAgfSBlbHNlIHsKKyAgICAgICAgTE9HRSgiWyVzXSBXcm9uZyBidWZmZXIgdHlwZSIsIF9fZnVuY19fKTsKKyAgICAgICAgcmV0dXJuIC0xOworICAgIH0KKworICAgIHJldCA9IGlvY3RsKGZkLCBWSURJT0NfU19GTVQsICZmbXQpOworCisgICAgcmV0dXJuIHJldDsKK30KKworaW50IHY0bDJfbWZjX3JlcWJ1ZnMoaW50IGZkLCBlbnVtIHY0bDJfYnVmX3R5cGUgdHlwZSwgZW51bSB2NGwyX21lbW9yeSBtZW1vcnksIGludCAqYnVmX2NudCkKK3sKKyAgICBzdHJ1Y3QgdjRsMl9yZXF1ZXN0YnVmZmVycyByZXFidWY7CisgICAgaW50IHJldDsKKworICAgIENMRUFSKHJlcWJ1Zik7CisKKyAgICByZXFidWYudHlwZSA9IHR5cGU7CisgICAgcmVxYnVmLm1lbW9yeSA9IG1lbW9yeTsKKyAgICByZXFidWYuY291bnQgPSAqYnVmX2NudDsKKworICAgIHJldCA9IGlvY3RsKGZkLCBWSURJT0NfUkVRQlVGUywgJnJlcWJ1Zik7CisgICAgKmJ1Zl9jbnQgPSByZXFidWYuY291bnQ7CisKKyAgICByZXR1cm4gcmV0OworfQorCitpbnQgdjRsMl9tZmNfcXVlcnlidWYoaW50IGZkLCBzdHJ1Y3QgdjRsMl9idWZmZXIgKmJ1ZiwgZW51bSB2NGwyX2J1Zl90eXBlIHR5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICBlbnVtIHY0bDJfbWVtb3J5IG1lbW9yeSwgaW50IGluZGV4LCBzdHJ1Y3QgdjRsMl9wbGFuZSAqcGxhbmVzKQoreworICAgIGludCBsZW5ndGggPSAtMSwgcmV0OworCisgICAgaWYgKHR5cGUgPT0gVjRMMl9CVUZfVFlQRV9WSURFT19PVVRQVVRfTVBMQU5FKQorICAgICAgICBsZW5ndGggPSAxOworICAgIGVsc2UgaWYgKHR5cGUgPT0gVjRMMl9CVUZfVFlQRV9WSURFT19DQVBUVVJFX01QTEFORSkKKyAgICAgICAgbGVuZ3RoID0gMjsKKworICAgIENMRUFSKCpidWYpOworICAgIGJ1Zi0+dHlwZSA9IHR5cGU7CisgICAgYnVmLT5tZW1vcnkgPSBtZW1vcnk7CisgICAgYnVmLT5pbmRleCA9IGluZGV4OworICAgIGJ1Zi0+bS5wbGFuZXMgPSBwbGFuZXM7CisgICAgYnVmLT5sZW5ndGggPSBsZW5ndGg7CisKKyAgICByZXQgPSBpb2N0bChmZCwgVklESU9DX1FVRVJZQlVGLCBidWYpOworCisgICAgcmV0dXJuIHJldDsKK30KKworaW50IHY0bDJfbWZjX3N0cmVhbW9uKGludCBmZCwgZW51bSB2NGwyX2J1Zl90eXBlIHR5cGUpCit7CisgICAgaW50IHJldDsKKworICAgIHJldCA9IGlvY3RsKGZkLCBWSURJT0NfU1RSRUFNT04sICZ0eXBlKTsKKworICAgIHJldHVybiByZXQ7Cit9CisKK2ludCB2NGwyX21mY19zdHJlYW1vZmYoaW50IGZkLCBlbnVtIHY0bDJfYnVmX3R5cGUgdHlwZSkKK3sKKyAgICBpbnQgcmV0OworCisgICAgcmV0ID0gaW9jdGwoZmQsIFZJRElPQ19TVFJFQU1PRkYsICZ0eXBlKTsKKworICAgIHJldHVybiByZXQ7Cit9CisKK2ludCB2NGwyX21mY19zX2N0cmwoaW50IGZkLCBpbnQgaWQsIGludCB2YWx1ZSkKK3sKKyAgICBzdHJ1Y3QgdjRsMl9jb250cm9sIGN0cmw7CisgICAgaW50IHJldDsKKworICAgIENMRUFSKGN0cmwpOworICAgIGN0cmwuaWQgPSBpZDsKKyAgICBjdHJsLnZhbHVlID0gdmFsdWU7CisKKyAgICByZXQgPSBpb2N0bChmZCwgVklESU9DX1NfQ1RSTCwgJmN0cmwpOworCisgICAgcmV0dXJuIHJldDsKK30KKworaW50IHY0bDJfbWZjX2dfY3RybChpbnQgZmQsIGludCBpZCwgaW50ICp2YWx1ZSkKK3sKKyAgICBzdHJ1Y3QgdjRsMl9jb250cm9sIGN0cmw7CisgICAgaW50IHJldDsKKworICAgIENMRUFSKGN0cmwpOworICAgIGN0cmwuaWQgPSBpZDsKKworICAgIHJldCA9IGlvY3RsKGZkLCBWSURJT0NfR19DVFJMLCAmY3RybCk7CisgICAgKnZhbHVlID0gY3RybC52YWx1ZTsKKworICAgIHJldHVybiByZXQ7Cit9CisKKyNpZmRlZiBTM0RfU1VQUE9SVAoraW50IHY0bDJfbWZjX2V4dF9nX2N0cmwoaW50IGZkLCBTU0JTSVBfTUZDX0RFQ19DT05GIGNvbmZfdHlwZSwgdm9pZCAqdmFsdWUpCit7CisgICAgc3RydWN0IHY0bDJfZXh0X2NvbnRyb2wgZXh0X2N0cmxbRlJBTUVfUEFDS19TRUlfSU5GT19OVU1dOworICAgIHN0cnVjdCB2NGwyX2V4dF9jb250cm9scyBleHRfY3RybHM7CisgICAgc3RydWN0IG1mY19mcmFtZV9wYWNrX3NlaV9pbmZvICpzZWlfaW5mbzsKKyAgICBpbnQgcmV0LCBpOworCisgICAgZXh0X2N0cmxzLmN0cmxfY2xhc3MgPSBWNEwyX0NUUkxfQ0xBU1NfQ09ERUM7CisKKyAgICBzd2l0Y2ggKGNvbmZfdHlwZSkgeworICAgIGNhc2UgTUZDX0RFQ19HRVRDT05GX0ZSQU1FX1BBQ0tJTkc6CisgICAgICAgIHNlaV9pbmZvID0gKHN0cnVjdCBtZmNfZnJhbWVfcGFja19zZWlfaW5mbyAqKXZhbHVlOworICAgICAgICBmb3IgKGk9MDsgaTxGUkFNRV9QQUNLX1NFSV9JTkZPX05VTTsgaSsrKQorICAgICAgICAgICAgQ0xFQVIoZXh0X2N0cmxbaV0pOworCisgICAgICAgIGV4dF9jdHJscy5jb3VudCA9IEZSQU1FX1BBQ0tfU0VJX0lORk9fTlVNOworICAgICAgICBleHRfY3RybHMuY29udHJvbHMgPSBleHRfY3RybDsKKyAgICAgICAgZXh0X2N0cmxbMF0uaWQgPSAgVjRMMl9DSURfQ09ERUNfRlJBTUVfUEFDS19TRUlfQVZBSUw7CisgICAgICAgIGV4dF9jdHJsWzFdLmlkID0gIFY0TDJfQ0lEX0NPREVDX0ZSQU1FX1BBQ0tfQVJSR01FTlRfSUQ7CisgICAgICAgIGV4dF9jdHJsWzJdLmlkID0gIFY0TDJfQ0lEX0NPREVDX0ZSQU1FX1BBQ0tfU0VJX0lORk87CisgICAgICAgIGV4dF9jdHJsWzNdLmlkID0gIFY0TDJfQ0lEX0NPREVDX0ZSQU1FX1BBQ0tfR1JJRF9QT1M7CisKKyAgICAgICAgcmV0ID0gaW9jdGwoZmQsIFZJRElPQ19HX0VYVF9DVFJMUywgJmV4dF9jdHJscyk7CisKKyAgICAgICAgc2VpX2luZm8tPnNlaV9hdmFpbCA9IGV4dF9jdHJsWzBdLnZhbHVlOworICAgICAgICBzZWlfaW5mby0+YXJyZ21lbnRfaWQgPSBleHRfY3RybFsxXS52YWx1ZTsKKyAgICAgICAgc2VpX2luZm8tPnNlaV9pbmZvID0gZXh0X2N0cmxbMl0udmFsdWU7CisgICAgICAgIHNlaV9pbmZvLT5ncmlkX3BvcyA9IGV4dF9jdHJsWzNdLnZhbHVlOworICAgICAgICBicmVhazsKKyAgICB9CisKKyAgICByZXR1cm4gcmV0OworfQorI2VuZGlmCisKK2ludCB2NGwyX21mY19xYnVmKGludCBmZCwgc3RydWN0IHY0bDJfYnVmZmVyICpxYnVmLCBlbnVtIHY0bDJfYnVmX3R5cGUgdHlwZSwKKyAgICAgICAgZW51bSB2NGwyX21lbW9yeSBtZW1vcnksIGludCBpbmRleCwKKyAgICAgICAgc3RydWN0IHY0bDJfcGxhbmUgKnBsYW5lcywgaW50IGZyYW1lX2xlbmd0aCkKK3sKKyAgICBpbnQgcmV0LCBsZW5ndGggPSAwOworCisgICAgaWYgKHR5cGUgPT0gVjRMMl9CVUZfVFlQRV9WSURFT19PVVRQVVRfTVBMQU5FKSB7CisgICAgICAgIENMRUFSKCpxYnVmKTsKKyAgICAgICAgbGVuZ3RoID0gMTsKKyAgICB9IGVsc2UgaWYgKHR5cGUgPT0gVjRMMl9CVUZfVFlQRV9WSURFT19DQVBUVVJFX01QTEFORSkgeworICAgICAgICBsZW5ndGggPSAyOworICAgIH0KKworICAgIHFidWYtPnR5cGUgPSB0eXBlOworICAgIHFidWYtPm1lbW9yeSA9IG1lbW9yeTsKKyAgICBxYnVmLT5pbmRleCA9IGluZGV4OworICAgIHFidWYtPm0ucGxhbmVzID0gcGxhbmVzOworICAgIHFidWYtPmxlbmd0aCA9IGxlbmd0aDsKKyAgICBxYnVmLT5tLnBsYW5lc1swXS5ieXRlc3VzZWQgPSBmcmFtZV9sZW5ndGg7CisKKyAgICByZXQgPSBpb2N0bChmZCwgVklESU9DX1FCVUYsIHFidWYpOworCisgICAgcmV0dXJuIHJldDsKK30KKworaW50IHY0bDJfbWZjX2RxYnVmKGludCBmZCwgc3RydWN0IHY0bDJfYnVmZmVyICpkcWJ1ZiwgZW51bSB2NGwyX2J1Zl90eXBlIHR5cGUsCisgICAgICAgICAgICAgICAgICAgIGVudW0gdjRsMl9tZW1vcnkgbWVtb3J5KQoreworICAgIHN0cnVjdCB2NGwyX3BsYW5lIHBsYW5lc1tNRkNfREVDX05VTV9QTEFORVNdOworICAgIGludCByZXQsIGxlbmd0aCA9IDA7CisKKyAgICBDTEVBUigqZHFidWYpOworICAgIGlmICh0eXBlID09IFY0TDJfQlVGX1RZUEVfVklERU9fT1VUUFVUX01QTEFORSkKKyAgICAgICAgbGVuZ3RoID0gMTsKKyAgICBlbHNlIGlmICh0eXBlID09IFY0TDJfQlVGX1RZUEVfVklERU9fQ0FQVFVSRV9NUExBTkUpCisgICAgICAgIGxlbmd0aCA9IDI7CisKKyAgICBkcWJ1Zi0+dHlwZSA9IHR5cGU7CisgICAgZHFidWYtPm1lbW9yeSA9IG1lbW9yeTsKKyAgICBkcWJ1Zi0+bS5wbGFuZXMgPSBwbGFuZXM7CisgICAgZHFidWYtPmxlbmd0aCA9IGxlbmd0aDsKKworICAgIHJldCA9IGlvY3RsKGZkLCBWSURJT0NfRFFCVUYsIGRxYnVmKTsKKworICAgIHJldHVybiByZXQ7Cit9CisKK2ludCB2NGwyX21mY19nX2ZtdChpbnQgZmQsIHN0cnVjdCB2NGwyX2Zvcm1hdCAqZm10LCBlbnVtIHY0bDJfYnVmX3R5cGUgdHlwZSkKK3sKKyAgICBpbnQgcmV0OworCisgICAgQ0xFQVIoKmZtdCk7CisgICAgZm10LT50eXBlID0gdHlwZTsKKyAgICByZXQgPSBpb2N0bChmZCwgVklESU9DX0dfRk1ULCBmbXQpOworCisgICAgcmV0dXJuIHJldDsKK30KKworaW50IHY0bDJfbWZjX2dfY3JvcChpbnQgZmQsIHN0cnVjdCB2NGwyX2Nyb3AgKmNyb3AsIGVudW0gdjRsMl9idWZfdHlwZSB0eXBlKQoreworICAgIGludCByZXQ7CisKKyAgICBDTEVBUigqY3JvcCk7CisgICAgY3JvcC0+dHlwZSA9IHR5cGU7CisgICAgcmV0ID0gaW9jdGwoZmQsIFZJRElPQ19HX0NST1AsIGNyb3ApOworCisgICAgcmV0dXJuIHJldDsKK30KKworaW50IHY0bDJfbWZjX3BvbGwoaW50IGZkLCBpbnQgKnJldmVudHMsIGludCB0aW1lb3V0KQoreworICAgIHN0cnVjdCBwb2xsZmQgcG9sbF9ldmVudHM7CisgICAgaW50IHJldDsKKworICAgIHBvbGxfZXZlbnRzLmZkID0gZmQ7CisgICAgcG9sbF9ldmVudHMuZXZlbnRzID0gUE9MTE9VVCB8IFBPTExFUlI7CisgICAgcG9sbF9ldmVudHMucmV2ZW50cyA9IDA7CisKKyAgICByZXQgPSBwb2xsKChzdHJ1Y3QgcG9sbGZkKikmcG9sbF9ldmVudHMsIDEsIHRpbWVvdXQpOworICAgICpyZXZlbnRzID0gcG9sbF9ldmVudHMucmV2ZW50czsKKworICAgIHJldHVybiByZXQ7Cit9CisKK3N0YXRpYyB2b2lkIGdldEFCeXRlKGNoYXIgKmJ1ZmYsIGludCAqY29kZSkKK3sKKyAgICBpbnQgYnl0ZTsKKworICAgICpjb2RlID0gKCpjb2RlIDw8IDgpOworICAgIGJ5dGUgPSAoaW50KSpidWZmOworICAgIGJ5dGUgJj0gMHhGRjsKKyAgICAqY29kZSB8PSBieXRlOworfQorCitzdGF0aWMgaW50IGlzUEJQYWNrZWQoX01GQ0xJQiAqcEN0eCwgaW50IEZyYW1lbGVuZykKK3sKKyAgICBjaGFyICpzdHJtQnVmZmVyID0gTlVMTDsKKyAgICBpbnQgc3RhcnRDb2RlID0gMHhGRkZGRkZGRjsKKyAgICBpbnQgbGVuZ19pZHggPSAxOworCisgICAgc3RybUJ1ZmZlciA9IChjaGFyKilwQ3R4LT52aXJTdHJtQnVmOworCisgICAgd2hpbGUgKDEpIHsKKyAgICAgICAgd2hpbGUgKHN0YXJ0Q29kZSAhPSBVU1JfREFUQV9TVEFSVF9DT0RFKSB7CisgICAgICAgICAgICBpZiAoKHN0YXJ0Q29kZSA9PSBWT1BfU1RBUlRfQ09ERSkgfHwgKGxlbmdfaWR4ID09IEZyYW1lbGVuZykpIHsKKyAgICAgICAgICAgICAgICBMT0dJKCJbJXNdIFZPUCBTVEFSVCBGb3VuZCAhIS4uLi4ucmV0dXJuIixfX2Z1bmNfXyk7CisgICAgICAgICAgICAgICAgTE9HVygiWyVzXSBOb24gUGFja2VkIFBCIixfX2Z1bmNfXyk7CisgICAgICAgICAgICAgICAgcmV0dXJuIDA7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBnZXRBQnl0ZShzdHJtQnVmZmVyLCAmc3RhcnRDb2RlKTsKKyAgICAgICAgICAgIExPR1YoIj4+IFN0YXJ0Q29kZSA9IDB4JTA4eCA8PFxuIiwgc3RhcnRDb2RlKTsKKyAgICAgICAgICAgIHN0cm1CdWZmZXIrKzsKKyAgICAgICAgICAgIGxlbmdfaWR4Kys7CisgICAgICAgIH0KKyAgICAgICAgTE9HSSgiWyVzXSBVc2VyIERhdGEgRm91bmQgISEiLF9fZnVuY19fKTsKKworICAgICAgICBkbyB7CisgICAgICAgICAgICBpZiAoKnN0cm1CdWZmZXIgPT0gJ3AnKSB7CisgICAgICAgICAgICAgICAgTE9HVygiWyVzXSBQYWNrZWQgUEIiLF9fZnVuY19fKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gMTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGdldEFCeXRlKHN0cm1CdWZmZXIsICZzdGFydENvZGUpOworICAgICAgICAgICAgc3RybUJ1ZmZlcisrOyBsZW5nX2lkeCsrOworICAgICAgICB9IHdoaWxlICgobGVuZ19pZHggPD0gRnJhbWVsZW5nKSAmJiAoKHN0YXJ0Q29kZSA+PiA4KSAhPSBNUDRfU1RBUlRfQ09ERSkpOworCisgICAgICAgIGlmIChsZW5nX2lkeCA+IEZyYW1lbGVuZykKKyAgICAgICAgICAgIGJyZWFrOworICAgIH0KKworICAgIExPR1coIlslc10gTm9uIFBhY2tlZCBQQiIsX19mdW5jX18pOworCisgICAgcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB2b2lkIGdldE1GQ05hbWUoY2hhciAqZGV2aWNlbmFtZSwgaW50IHNpemUpCit7CisgICAgc25wcmludGYoZGV2aWNlbmFtZSwgc2l6ZSwgIiVzJWQiLCBTQU1TVU5HX01GQ19ERVZfTkFNRSwgbWZjX2Rldl9ub2RlKTsKK30KKwordm9pZCBTc2JTaXBNZmNEZWNTZXRNRkNOb2RlKGludCBkZXZpY2Vub2RlKQoreworICAgIG1mY19kZXZfbm9kZSA9IGRldmljZW5vZGU7Cit9CisKK3ZvaWQgU3NiU2lwTWZjRGVjU2V0TUZDTmFtZShjaGFyICpkZXZpY2VuYW1lKQoreworICAgIG1mY19kZXZfbmFtZSA9IGRldmljZW5hbWU7Cit9CisKK3ZvaWQgKlNzYlNpcE1mY0RlY09wZW4odm9pZCkKK3sKKyAgICBpbnQgaE1GQ09wZW47CisgICAgX01GQ0xJQiAqcENUWDsKKyAgICBjaGFyIG1mY19kZXZfbmFtZVs2NF07CisKKyAgICBpbnQgcmV0OworICAgIGludCByZXFfY291bnQ7CisgICAgdW5zaWduZWQgaW50IGksIGo7CisKKyAgICBzdHJ1Y3QgdjRsMl9idWZmZXIgYnVmOworICAgIHN0cnVjdCB2NGwyX3BsYW5lIHBsYW5lc1tNRkNfREVDX05VTV9QTEFORVNdOworCisgICAgTE9HSSgiWyVzXSBNRkMgTGlicmFyeSBWZXIgJWQuJTAyZCIsX19mdW5jX18sIE1GQ19MSUJfVkVSX01BSk9SLCBNRkNfTElCX1ZFUl9NSU5PUik7CisKKyAgICBwQ1RYID0gKF9NRkNMSUIgKiltYWxsb2Moc2l6ZW9mKF9NRkNMSUIpKTsKKyAgICBpZiAocENUWCA9PSBOVUxMKSB7CisgICAgICAgIExPR0UoIlslc10gbWFsbG9jIGZhaWxlZC4iLF9fZnVuY19fKTsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorCisgICAgbWVtc2V0KHBDVFgsIDAsIHNpemVvZihfTUZDTElCKSk7CisKKyAgICBnZXRNRkNOYW1lKG1mY19kZXZfbmFtZSwgNjQpOworICAgIExPR0koIlslc10gZGV2IG5hbWUgaXMgJXMiLF9fZnVuY19fLG1mY19kZXZfbmFtZSk7CisKKyAgICBpZiAoYWNjZXNzKG1mY19kZXZfbmFtZSwgRl9PSykgIT0gMCkgeworICAgICAgICBMT0dFKCJbJXNdIE1GQyBkZXZpY2Ugbm9kZSBub3QgZXhpc3RzIixfX2Z1bmNfXyk7CisgICAgICAgIGdvdG8gZXJyb3JfY2FzZTE7CisgICAgfQorCisgICAgaE1GQ09wZW4gPSBvcGVuKG1mY19kZXZfbmFtZSwgT19SRFdSfE9fTk9OQkxPQ0ssIDApOworICAgIGlmIChoTUZDT3BlbiA8IDApIHsKKyAgICAgICAgTE9HRSgiWyVzXSBGYWlsZWQgdG8gb3BlbiBNRkMgZGV2aWNlIixfX2Z1bmNfXyk7CisgICAgICAgIGdvdG8gZXJyb3JfY2FzZTE7CisgICAgfQorCisgICAgcENUWC0+aE1GQyA9IGhNRkNPcGVuOworCisgICAgcmV0ID0gdjRsMl9tZmNfcXVlcnljYXAocENUWC0+aE1GQyk7CisgICAgaWYgKHJldCAhPSAwKSB7CisgICAgICAgIExPR0UoIlslc10gUVVFUllDQVAgZmFpbGVkIiwgX19mdW5jX18pOworICAgICAgICBnb3RvIGVycm9yX2Nhc2UyOworICAgIH0KKworICAgIHBDVFgtPmludGVyX2J1ZmZfc3RhdHVzID0gTUZDX1VTRV9OT05FOworICAgIHJldCA9IHY0bDJfbWZjX3NfZm10KHBDVFgtPmhNRkMsIFY0TDJfQlVGX1RZUEVfVklERU9fT1VUUFVUX01QTEFORSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSDI2NF9ERUMsIE1BWF9ERUNPREVSX0lOUFVUX0JVRkZFUl9TSVpFLCAwLCAwKTsKKyAgICBpZiAocmV0ICE9IDApIHsKKyAgICAgICAgTE9HRSgiWyVzXSBTX0ZNVCBmYWlsZWQiLF9fZnVuY19fKTsKKyAgICAgICAgZ290byBlcnJvcl9jYXNlMjsKKyAgICB9CisKKyAgICBwQ1RYLT52NGwyX2RlYy5tZmNfc3JjX2J1ZnNfbGVuID0gTUFYX0RFQ09ERVJfSU5QVVRfQlVGRkVSX1NJWkU7CisKKyAgICByZXFfY291bnQgPSBNRkNfREVDX05VTV9TUkNfQlVGUzsKKyAgICByZXQgPSB2NGwyX21mY19yZXFidWZzKHBDVFgtPmhNRkMsIFY0TDJfQlVGX1RZUEVfVklERU9fT1VUUFVUX01QTEFORSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBWNEwyX01FTU9SWV9NTUFQLCAmcmVxX2NvdW50KTsKKyAgICBpZiAocmV0ICE9IDApIHsKKyAgICAgICAgTE9HRSgiWyVzXSBWSURJT0NfUkVRQlVGUyBmYWlsZWQiLF9fZnVuY19fKTsKKyAgICAgICAgZ290byBlcnJvcl9jYXNlMjsKKyAgICB9CisKKyAgICBwQ1RYLT52NGwyX2RlYy5tZmNfbnVtX3NyY19idWZzID0gcmVxX2NvdW50OworCisgICAgZm9yIChpID0gMDsgaSA8IHBDVFgtPnY0bDJfZGVjLm1mY19udW1fc3JjX2J1ZnM7ICsraSkgeworICAgICAgICByZXQgPSB2NGwyX21mY19xdWVyeWJ1ZihwQ1RYLT5oTUZDLCAmYnVmLCBWNEwyX0JVRl9UWVBFX1ZJREVPX09VVFBVVF9NUExBTkUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFY0TDJfTUVNT1JZX01NQVAsIGksIHBsYW5lcyk7CisgICAgICAgIGlmIChyZXQgIT0gMCkgeworICAgICAgICAgICAgTE9HRSgiWyVzXSBWSURJT0NfUVVFUllCVUYgZmFpbGVkIixfX2Z1bmNfXyk7CisgICAgICAgICAgICBnb3RvIGVycm9yX2Nhc2UzOworICAgICAgICB9CisKKyAgICAgICAgcENUWC0+djRsMl9kZWMubWZjX3NyY19idWZzW2ldID0gbW1hcChOVUxMLCBidWYubS5wbGFuZXNbMF0ubGVuZ3RoLAorICAgICAgICBQUk9UX1JFQUQgfCBQUk9UX1dSSVRFLCBNQVBfU0hBUkVELCBwQ1RYLT5oTUZDLCBidWYubS5wbGFuZXNbMF0ubS5tZW1fb2Zmc2V0KTsKKyAgICAgICAgaWYgKHBDVFgtPnY0bDJfZGVjLm1mY19zcmNfYnVmc1tpXSA9PSBNQVBfRkFJTEVEKSB7CisgICAgICAgICAgICBMT0dFKCJbJXNdIG1tYXAgZmFpbGVkICglZCkiLF9fZnVuY19fLGkpOworICAgICAgICAgICAgZ290byBlcnJvcl9jYXNlMzsKKyAgICAgICAgfQorICAgIH0KKyAgICBwQ1RYLT5pbnRlcl9idWZmX3N0YXR1cyB8PSBNRkNfVVNFX1NUUk1fQlVGRjsKKworICAgIC8qIHNldCBleHRyYSBEUEIgc2l6ZSB0byA1IGFzIGRlZmF1bHQgZm9yIG9wdGltYWwgcGVyZm9ybWNlIChoZXVyaXN0aWMgbWV0aG9kKSAqLworICAgIHBDVFgtPmRlY19udW1leHRyYWRwYiA9IERFRkFVTFRfTlVNQkVSX09GX0VYVFJBX0RQQjsKKworICAgIHBDVFgtPnY0bDJfZGVjLmJCZWluZ0ZpbmFsaXplZCA9IDA7CisgICAgcENUWC0+bGFzdGZyYW1lID0gU1NCU0lQX01GQ19MQVNUX0ZSQU1FX05PVF9SRUNFSVZFRDsKKworICAgIHBDVFgtPmNhY2hlYWJsZWJ1ZmZlciA9IE5PX0NBQ0hFOworCisgICAgZm9yIChpID0gMDsgaTxNRkNfREVDX05VTV9TUkNfQlVGUzsgaSsrKQorICAgICAgICBwQ1RYLT52NGwyX2RlYy5tZmNfc3JjX2J1Zl9mbGFnc1tpXSA9IEJVRl9ERVFVRVVFRDsKKworICAgIHBDVFgtPnY0bDJfZGVjLmJlaW5nVXNlZEluZGV4ID0gMDsKKworICAgIHJldHVybiAodm9pZCAqKSBwQ1RYOworCitlcnJvcl9jYXNlMzoKKyAgICBmb3IgKGogPSAwOyBqIDwgaTsgaisrKQorICAgICAgICBtdW5tYXAocENUWC0+djRsMl9kZWMubWZjX3NyY19idWZzW2pdLCBwQ1RYLT52NGwyX2RlYy5tZmNfc3JjX2J1ZnNfbGVuKTsKK2Vycm9yX2Nhc2UyOgorICAgIGNsb3NlKHBDVFgtPmhNRkMpOworZXJyb3JfY2FzZTE6CisgICAgZnJlZShwQ1RYKTsKKworICAgIHJldHVybiBOVUxMOworfQorCit2b2lkICpTc2JTaXBNZmNEZWNPcGVuRXh0KHZvaWQgKnZhbHVlKQoreworICAgIF9NRkNMSUIgKnBDVFg7CisKKyAgICBwQ1RYID0gU3NiU2lwTWZjRGVjT3BlbigpOworCisgICAgaWYgKHBDVFggPT0gTlVMTCkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisKKyAgICBpZiAoTk9fQ0FDSEUgPT0gKCooU1NCSVBfTUZDX0JVRkZFUl9UWVBFICopdmFsdWUpKSB7CisgICAgICAgIHBDVFgtPmNhY2hlYWJsZWJ1ZmZlciA9IE5PX0NBQ0hFOworICAgICAgICBMT0dJKCJbJXNdIG5vbiBjYWNoZWFibGUgYnVmZmVyIixfX2Z1bmNfXyk7CisgICAgfSBlbHNlIHsKKyAgICAgICAgcENUWC0+Y2FjaGVhYmxlYnVmZmVyID0gQ0FDSEU7CisgICAgICAgIExPR0koIlslc10gY2FjaGVhYmxlIGJ1ZmZlciIsX19mdW5jX18pOworICAgIH0KKworICAgIHJldHVybiAodm9pZCAqKXBDVFg7Cit9CisKK1NTQlNJUF9NRkNfRVJST1JfQ09ERSBTc2JTaXBNZmNEZWNDbG9zZSh2b2lkICpvcGVuSGFuZGxlKQoreworICAgIGludCByZXQsIGk7CisgICAgX01GQ0xJQiAgKnBDVFg7CisKKyAgICBpZiAob3BlbkhhbmRsZSA9PSBOVUxMKSB7CisgICAgICAgIExPR0UoIlslc10gb3BlbkhhbmRsZSBpcyBOVUxMIixfX2Z1bmNfXyk7CisgICAgICAgIHJldHVybiBNRkNfUkVUX0lOVkFMSURfUEFSQU07CisgICAgfQorCisgICAgcENUWCAgPSAoX01GQ0xJQiAqKSBvcGVuSGFuZGxlOworCisgICAgaWYgKHBDVFgtPmludGVyX2J1ZmZfc3RhdHVzICYgTUZDX1VTRV9EU1RfU1RSRUFNT04pIHsKKyAgICAgICAgcmV0ID0gdjRsMl9tZmNfc3RyZWFtb2ZmKHBDVFgtPmhNRkMsIFY0TDJfQlVGX1RZUEVfVklERU9fQ0FQVFVSRV9NUExBTkUpOworICAgICAgICBpZiAocmV0ICE9IDApIHsKKyAgICAgICAgICAgIExPR0UoIlslc10gVklESU9DX1NUUkVBTU9GRiBmYWlsZWQgKGRlc3RpbmF0aW9uIGJ1ZmZlcnMpIixfX2Z1bmNfXyk7CisgICAgICAgICAgICByZXR1cm4gTUZDX1JFVF9DTE9TRV9GQUlMOworICAgICAgICB9CisgICAgICAgIHBDVFgtPmludGVyX2J1ZmZfc3RhdHVzICY9IH4oTUZDX1VTRV9EU1RfU1RSRUFNT04pOworICAgIH0KKworICAgIGlmIChwQ1RYLT5pbnRlcl9idWZmX3N0YXR1cyAmIE1GQ19VU0VfU1JDX1NUUkVBTU9OKSB7CisgICAgICAgIHJldCA9IHY0bDJfbWZjX3N0cmVhbW9mZihwQ1RYLT5oTUZDLCBWNEwyX0JVRl9UWVBFX1ZJREVPX09VVFBVVF9NUExBTkUpOworICAgICAgICBpZiAocmV0ICE9IDApIHsKKyAgICAgICAgICAgIExPR0UoIlslc10gVklESU9DX1NUUkVBTU9GRiBmYWlsZWQgKHNvdXJjZSBidWZmZXJzKSIsX19mdW5jX18pOworICAgICAgICAgICAgcmV0dXJuIE1GQ19SRVRfQ0xPU0VfRkFJTDsKKyAgICAgICAgfQorICAgICAgICBwQ1RYLT5pbnRlcl9idWZmX3N0YXR1cyAmPSB+KE1GQ19VU0VfU1JDX1NUUkVBTU9OKTsKKyAgICB9CisKKyAgICBpZiAocENUWC0+aW50ZXJfYnVmZl9zdGF0dXMgJiBNRkNfVVNFX1NUUk1fQlVGRikgeworICAgICAgICBmb3IgKGkgPSAwOyBpIDwgcENUWC0+djRsMl9kZWMubWZjX251bV9zcmNfYnVmczsgaSsrKQorICAgICAgICAgICAgbXVubWFwKHBDVFgtPnY0bDJfZGVjLm1mY19zcmNfYnVmc1tpXSwgcENUWC0+djRsMl9kZWMubWZjX3NyY19idWZzX2xlbik7CisgICAgICAgIHBDVFgtPmludGVyX2J1ZmZfc3RhdHVzICY9IH4oTUZDX1VTRV9TVFJNX0JVRkYpOworICAgIH0KKworICAgIGlmIChwQ1RYLT5pbnRlcl9idWZmX3N0YXR1cyAmIE1GQ19VU0VfWVVWX0JVRkYpIHsKKyAgICAgICAgZm9yIChpID0gMDsgaSA8IHBDVFgtPnY0bDJfZGVjLm1mY19udW1fZHN0X2J1ZnM7IGkrKykgeworICAgICAgICAgICAgbXVubWFwKHBDVFgtPnY0bDJfZGVjLm1mY19kc3RfYnVmc1tpXVswXSwgcENUWC0+djRsMl9kZWMubWZjX2RzdF9idWZzX2xlblswXSk7CisgICAgICAgICAgICBtdW5tYXAocENUWC0+djRsMl9kZWMubWZjX2RzdF9idWZzW2ldWzFdLCBwQ1RYLT52NGwyX2RlYy5tZmNfZHN0X2J1ZnNfbGVuWzFdKTsKKyAgICAgICAgfQorICAgICAgICBwQ1RYLT5pbnRlcl9idWZmX3N0YXR1cyAmPSB+KE1GQ19VU0VfWVVWX0JVRkYpOworICAgIH0KKworI2lmZGVmIFVTRV9JT04KKyAgICBpb25fY2xpZW50X2Rlc3Ryb3kocENUWC0+aW9uX2ZkKTsKKyNlbmRpZgorICAgIGNsb3NlKHBDVFgtPmhNRkMpOworICAgIGZyZWUocENUWCk7CisKKyAgICByZXR1cm4gTUZDX1JFVF9PSzsKK30KKworU1NCU0lQX01GQ19FUlJPUl9DT0RFIFNzYlNpcE1mY0RlY0luaXQodm9pZCAqb3BlbkhhbmRsZSwgU1NCU0lQX01GQ19DT0RFQ19UWVBFIGNvZGVjX3R5cGUsIGludCBGcmFtZWxlbmcpCit7CisgICAgaW50IHBhY2tlZFBCID0gMDsKKyAgICBfTUZDTElCICpwQ1RYOworICAgIGludCByZXQ7CisKKyAgICBpbnQgd2lkdGgsIGhlaWdodDsKKyAgICBpbnQgY3RybF92YWx1ZTsKKworICAgIHN0cnVjdCB2NGwyX2J1ZmZlciBidWY7CisgICAgc3RydWN0IHY0bDJfcGxhbmUgcGxhbmVzW01GQ19ERUNfTlVNX1BMQU5FU107CisKKyAgICBpbnQgcG9sbF9zdGF0ZSwgcG9sbF9yZXZlbnRzOworCisgICAgaWYgKG9wZW5IYW5kbGUgPT0gTlVMTCkgeworICAgICAgICBMT0dFKCJbJXNdIG9wZW5IYW5kbGUgaXMgTlVMTCIsX19mdW5jX18pOworICAgICAgICByZXR1cm4gTUZDX1JFVF9JTlZBTElEX1BBUkFNOworICAgIH0KKworICAgIHBDVFggID0gKF9NRkNMSUIgKikgb3BlbkhhbmRsZTsKKworICAgIHBDVFgtPmNvZGVjVHlwZSA9IGNvZGVjX3R5cGU7CisKKyAgICBpZiAoKHBDVFgtPmNvZGVjVHlwZSA9PSBNUEVHNF9ERUMpIHx8IChwQ1RYLT5jb2RlY1R5cGUgPT0gWFZJRF9ERUMpIHx8CisgICAgKHBDVFgtPmNvZGVjVHlwZSA9PSBGSU1WMV9ERUMpIHx8IChwQ1RYLT5jb2RlY1R5cGUgPT0gRklNVjJfREVDKSB8fAorICAgIChwQ1RYLT5jb2RlY1R5cGUgPT0gRklNVjNfREVDKSB8fCAocENUWC0+Y29kZWNUeXBlID09IEZJTVY0X0RFQykpCisgICAgICAgIHBhY2tlZFBCID0gaXNQQlBhY2tlZChwQ1RYLCBGcmFtZWxlbmcpOworCisgICAgaWYgKHBDVFgtPmNvZGVjVHlwZSA9PSBGSU1WMV9ERUMpIHsKKyAgICAgICAgd2lkdGggPSBwQ1RYLT5maW12MV9yZXMud2lkdGg7CisgICAgICAgIGhlaWdodCA9IHBDVFgtPmZpbXYxX3Jlcy5oZWlnaHQ7CisgICAgfSBlbHNlIHsKKyAgICAgICAgd2lkdGggPSAwOworICAgICAgICBoZWlnaHQgPSAwOworICAgIH0KKyAgICByZXQgPSB2NGwyX21mY19zX2ZtdChwQ1RYLT5oTUZDLCBWNEwyX0JVRl9UWVBFX1ZJREVPX09VVFBVVF9NUExBTkUsIHBDVFgtPmNvZGVjVHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBNQVhfREVDT0RFUl9JTlBVVF9CVUZGRVJfU0laRSwgd2lkdGgsIGhlaWdodCk7CisgICAgaWYgKHJldCAhPSAwKSB7CisgICAgICAgIExPR0UoIlslc10gU19GTVQgZmFpbGVkIiwgX19mdW5jX18pOworICAgICAgICByZXQgPSBNRkNfUkVUX0RFQ19JTklUX0ZBSUw7CisgICAgICAgIGdvdG8gZXJyb3JfY2FzZTE7CisgICAgfQorCisgICAgLyogU2V0IGRlZmF1bHQgZGVzdGluYXRpb24gZm9ybWF0IGFzIE5WMTJNVCAqLworICAgIHJldCA9IHY0bDJfbWZjX3NfZm10KHBDVFgtPmhNRkMsIFY0TDJfQlVGX1RZUEVfVklERU9fQ0FQVFVSRV9NUExBTkUsIE5WMTJNVF9GTVQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgMCwgd2lkdGgsIGhlaWdodCk7CisgICAgaWYgKHJldCAhPSAwKSB7CisgICAgICAgIExPR0UoIlslc10gU19GTVQgZmFpbGVkIixfX2Z1bmNfXyk7CisgICAgICAgIHJldCA9IE1GQ19SRVRfREVDX0lOSVRfRkFJTDsKKyAgICAgICAgZ290byBlcnJvcl9jYXNlMTsKKyAgICB9CisKKyAgICAvKiBQYWNrZWRQQiBzaG91bGQgYmUgc2V0IGFmdGVyIFZJRElPQ19TX0ZNVCAqLworICAgIGlmIChwYWNrZWRQQikgeworICAgICAgICByZXQgPSB2NGwyX21mY19zX2N0cmwocENUWC0+aE1GQywgVjRMMl9DSURfQ09ERUNfUEFDS0VEX1BCLCAxKTsKKyAgICAgICAgaWYgKHJldCAhPSAwKSB7CisgICAgICAgICAgICBMT0dFKCJbJXNdIFZJRElPQ19TX0NUUkwgZmFpbGVkIG9mIFBBQ0tFRF9QQlxuIiwgX19mdW5jX18pOworICAgICAgICAgICAgcmV0dXJuIE1GQ19SRVRfREVDX1NFVF9DT05GX0ZBSUw7CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXQgPSB2NGwyX21mY19xYnVmKHBDVFgtPmhNRkMsICZidWYsIFY0TDJfQlVGX1RZUEVfVklERU9fT1VUUFVUX01QTEFORSwKKyAgICAgICAgICAgICAgICAgICAgVjRMMl9NRU1PUllfTU1BUCwgcENUWC0+djRsMl9kZWMuYmVpbmdVc2VkSW5kZXgsIHBsYW5lcywgRnJhbWVsZW5nKTsKKyAgICBpZiAocmV0ICE9IDApIHsKKyAgICAgICAgTE9HRSgiWyVzXSBWSURJT0NfUUJVRiBmYWlsZWQsIFY0TDJfQlVGX1RZUEVfVklERU9fT1VUUFVUX01QTEFORSIsX19mdW5jX18pOworICAgICAgICByZXQgPSBNRkNfUkVUX0RFQ19JTklUX0ZBSUw7CisgICAgICAgIGdvdG8gZXJyb3JfY2FzZTE7CisgICAgfQorCisgICAgLyogUHJvY2Vzc2luZyB0aGUgaGVhZGVyIHJlcXVpcmVzIHJ1bm5pbmcgc3RyZWFtb24KKyAgICAgb24gT1VUUFVUIHF1ZXVlICovCisgICAgcmV0ID0gdjRsMl9tZmNfc3RyZWFtb24ocENUWC0+aE1GQywgVjRMMl9CVUZfVFlQRV9WSURFT19PVVRQVVRfTVBMQU5FKTsKKyAgICBpZiAocmV0ICE9IDApIHsKKyAgICAgICAgTE9HRSgiWyVzXSBWSURJT0NfU1RSRUFNT04gZmFpbGVkIixfX2Z1bmNfXyk7CisgICAgICAgIHJldCA9IE1GQ19SRVRfREVDX0lOSVRfRkFJTDsKKyAgICAgICAgZ290byBlcnJvcl9jYXNlMTsKKyAgICB9CisgICAgcENUWC0+aW50ZXJfYnVmZl9zdGF0dXMgfD0gTUZDX1VTRV9TUkNfU1RSRUFNT047CisKKyAgICByZXQgPSByZWFkX2hlYWRlcl9kYXRhKHBDVFgpOworICAgIGlmIChyZXQgIT0gMCkKKyAgICAgICAgZ290byBlcnJvcl9jYXNlMTsKKworICAgIC8qIGNhY2hlYWJsZSBidWZmZXIgKi8KKyAgICBpZiAocENUWC0+Y2FjaGVhYmxlYnVmZmVyID09IE5PX0NBQ0hFKQorICAgICAgICBjdHJsX3ZhbHVlID0gMDsKKyAgICBlbHNlCisgICAgICAgIGN0cmxfdmFsdWUgPSAxOworCisgICAgcmV0ID0gdjRsMl9tZmNfc19jdHJsKHBDVFgtPmhNRkMsIFY0TDJfQ0lEX0NBQ0hFQUJMRSwgY3RybF92YWx1ZSk7CisgICAgaWYgKHJldCAhPSAwKSB7CisgICAgICAgIExPR0UoIlslc10gVklESU9DX1NfQ1RSTCBmYWlsZWQsIFY0TDJfQ0lEX0NBQ0hFQUJMRSIsIF9fZnVuY19fKTsKKyAgICAgICAgcmV0ID0gTUZDX1JFVF9ERUNfSU5JVF9GQUlMOworICAgICAgICBnb3RvIGVycm9yX2Nhc2UxOworICAgIH0KKworI2lmZGVmIFVTRV9JT04KKyAgICBwQ1RYLT5pb25fZmQgPSBpb25fY2xpZW50X2NyZWF0ZSgpOworICAgIGlmIChwQ1RYLT5pb25fZmQgPCAzKSB7CisgICAgICAgIExPR0UoIlslc10gRmFpbGVkIHRvIGdldCBpb25fZmQgOiAlZCIsIF9fZnVuY19fLCBwQ1RYLT5pb25fZmQpOworICAgICAgICByZXQgPSBNRkNfUkVUX0RFQ19JTklUX0ZBSUw7CisgICAgICAgIGdvdG8gZXJyb3JfY2FzZTE7CisgICAgfQorI2VuZGlmCisKKyAgICByZXQgPSBpbml0X21mY19vdXRwdXRfc3RyZWFtKHBDVFgpOworICAgIGlmIChyZXQgIT0gMCkKKyAgICAgICAgZ290byBlcnJvcl9jYXNlMTsKKworICAgIHJldCA9IHY0bDJfbWZjX3N0cmVhbW9uKHBDVFgtPmhNRkMsIFY0TDJfQlVGX1RZUEVfVklERU9fQ0FQVFVSRV9NUExBTkUpOworICAgIGlmIChyZXQgIT0gMCkgeworICAgICAgICBMT0dFKCJbJXNdIFZJRElPQ19TVFJFQU1PTiBmYWlsZWQgKGRlc3RpbmF0aW9uIGJ1ZmZlcnMpIiwgX19mdW5jX18pOworICAgICAgICByZXQgPSBNRkNfUkVUX0RFQ19JTklUX0ZBSUw7CisgICAgICAgIGdvdG8gZXJyb3JfY2FzZTE7CisgICAgfQorICAgIHBDVFgtPmludGVyX2J1ZmZfc3RhdHVzIHw9IE1GQ19VU0VfRFNUX1NUUkVBTU9OOworCisgICAgZG8geworICAgICAgICBwb2xsX3N0YXRlID0gdjRsMl9tZmNfcG9sbChwQ1RYLT5oTUZDLCAmcG9sbF9yZXZlbnRzLCBQT0xMX0RFQ19XQUlUX1RJTUVPVVQpOworICAgICAgICBpZiAocG9sbF9zdGF0ZSA+IDApIHsKKyAgICAgICAgICAgIGlmIChwb2xsX3JldmVudHMgJiBQT0xMT1VUKSB7CisgICAgICAgICAgICAgICAgcmV0ID0gdjRsMl9tZmNfZHFidWYocENUWC0+aE1GQywgJmJ1ZiwgVjRMMl9CVUZfVFlQRV9WSURFT19PVVRQVVRfTVBMQU5FLCBWNEwyX01FTU9SWV9NTUFQKTsKKyAgICAgICAgICAgICAgICBpZiAocmV0ID09IDApCisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfSBlbHNlIGlmIChwb2xsX3JldmVudHMgJiBQT0xMRVJSKSB7CisgICAgICAgICAgICAgICAgTE9HRSgiWyVzXSBQT0xMRVJSXG4iLCBfX2Z1bmNfXyk7CisgICAgICAgICAgICAgICAgcmV0dXJuIE1GQ19HRVRPVVRCVUZfU1RBVFVTX05VTEw7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIExPR0UoIlslc10gcG9sbCgpIHJldHVybnMgMHgleFxuIiwgX19mdW5jX18sIHBvbGxfcmV2ZW50cyk7CisgICAgICAgICAgICAgICAgcmV0dXJuIE1GQ19HRVRPVVRCVUZfU1RBVFVTX05VTEw7CisgICAgICAgICAgICB9CisgICAgICAgIH0gZWxzZSBpZiAocG9sbF9zdGF0ZSA8IDApIHsKKyAgICAgICAgICAgIHJldHVybiBNRkNfR0VUT1VUQlVGX1NUQVRVU19OVUxMOworICAgICAgICB9CisgICAgfSB3aGlsZSAocG9sbF9zdGF0ZSA9PSAwKTsKKworICAgIHJldHVybiBNRkNfUkVUX09LOworCitlcnJvcl9jYXNlMToKKyAgICBTc2JTaXBNZmNEZWNDbG9zZShvcGVuSGFuZGxlKTsKKyAgICByZXR1cm4gcmV0OworfQorCitpbnQgcmVhZF9oZWFkZXJfZGF0YSh2b2lkICpvcGVuSGFuZGxlKQoreworICAgIHN0cnVjdCB2NGwyX2Zvcm1hdCBmbXQ7CisgICAgc3RydWN0IHY0bDJfY3JvcCBjcm9wOworICAgIHN0cnVjdCB2NGwyX3BpeF9mb3JtYXRfbXBsYW5lIHBpeF9tcDsKKyAgICBpbnQgY3RybF92YWx1ZTsKKyAgICBpbnQgcmV0OworCisgICAgX01GQ0xJQiAqcENUWDsKKyAgICBwQ1RYICA9IChfTUZDTElCICopIG9wZW5IYW5kbGU7CisKKyAgICByZXQgPSB2NGwyX21mY19nX2ZtdChwQ1RYLT5oTUZDLCAmZm10LCBWNEwyX0JVRl9UWVBFX1ZJREVPX0NBUFRVUkVfTVBMQU5FKTsKKyAgICBpZiAocmV0ICE9IDApIHsKKyAgICAgICAgTE9HRSgiWyVzXSBWSURJT0NfR19GTVQgZmFpbGVkIixfX2Z1bmNfXyk7CisgICAgICAgIHJldCA9IE1GQ19SRVRfREVDX0lOSVRfRkFJTDsKKyAgICAgICAgZ290byBlcnJvcl9jYXNlOworICAgIH0KKworICAgIHBpeF9tcCA9IGZtdC5mbXQucGl4X21wOworICAgIHBDVFgtPmRlY091dEluZm8uYnVmX3dpZHRoID0gcGl4X21wLnBsYW5lX2ZtdFswXS5ieXRlc3BlcmxpbmU7CisgICAgcENUWC0+ZGVjT3V0SW5mby5idWZfaGVpZ2h0ID0KKyAgICAgICAgcGl4X21wLnBsYW5lX2ZtdFswXS5zaXplaW1hZ2UgLyBwaXhfbXAucGxhbmVfZm10WzBdLmJ5dGVzcGVybGluZTsKKworICAgIHBDVFgtPmRlY091dEluZm8uaW1nX3dpZHRoID0gcGl4X21wLndpZHRoOworICAgIHBDVFgtPmRlY091dEluZm8uaW1nX2hlaWdodCA9IHBpeF9tcC5oZWlnaHQ7CisKKyAgICByZXQgPSB2NGwyX21mY19nX2Nyb3AocENUWC0+aE1GQywgJmNyb3AsIFY0TDJfQlVGX1RZUEVfVklERU9fQ0FQVFVSRV9NUExBTkUpOworICAgIGlmIChyZXQgIT0gMCkgeworICAgICAgICBMT0dFKCJbJXNdIFZJRElPQ19HX0NST1AgZmFpbGVkIixfX2Z1bmNfXyk7CisgICAgICAgIHJldCA9IE1GQ19SRVRfREVDX0lOSVRfRkFJTDsKKyAgICAgICAgZ290byBlcnJvcl9jYXNlOworICAgIH0KKworICAgIHBDVFgtPmRlY091dEluZm8uY3JvcF9sZWZ0X29mZnNldCA9IGNyb3AuYy5sZWZ0OworICAgIHBDVFgtPmRlY091dEluZm8uY3JvcF90b3Bfb2Zmc2V0ID0gY3JvcC5jLnRvcDsKKyAgICBwQ1RYLT5kZWNPdXRJbmZvLmNyb3BfcmlnaHRfb2Zmc2V0ID0KKyAgICAgICAgcGl4X21wLndpZHRoIC0gY3JvcC5jLndpZHRoIC0gY3JvcC5jLmxlZnQ7CisgICAgcENUWC0+ZGVjT3V0SW5mby5jcm9wX2JvdHRvbV9vZmZzZXQgPQorICAgICAgICBwaXhfbXAuaGVpZ2h0IC0gY3JvcC5jLmhlaWdodCAtIGNyb3AuYy50b3A7CisKKyAgICByZXQgPSB2NGwyX21mY19nX2N0cmwocENUWC0+aE1GQywgVjRMMl9DSURfQ09ERUNfUkVRX05VTV9CVUZTLCAmY3RybF92YWx1ZSk7CisgICAgaWYgKHJldCAhPSAwKSB7CisgICAgICAgIExPR0UoIlslc10gVklESU9DX0dfQ1RSTCBmYWlsZWQiLF9fZnVuY19fKTsKKyAgICAgICAgcmV0ID0gTUZDX1JFVF9ERUNfSU5JVF9GQUlMOworICAgICAgICBnb3RvIGVycm9yX2Nhc2U7CisgICAgfQorCisgICAgcENUWC0+djRsMl9kZWMubWZjX251bV9kc3RfYnVmcyA9IGN0cmxfdmFsdWUgKyBwQ1RYLT5kZWNfbnVtZXh0cmFkcGI7CisKKyAgICBMT0dWKCJbJXNdIE51bSBvZiBhbGxvY2F0ZWQgYnVmZmVyczogJWRcbiIsX19mdW5jX18sIHBDVFgtPnY0bDJfZGVjLm1mY19udW1fZHN0X2J1ZnMpOworCisgICAgcmV0dXJuIDA7CisKK2Vycm9yX2Nhc2U6CisgICAgcmV0dXJuIHJldDsKKyAgICB9CisKKy8qIEluaXRpYWxpemUgb3V0cHV0IHN0cmVhbSBvZiBNRkMgKi8KK2ludCBpbml0X21mY19vdXRwdXRfc3RyZWFtKHZvaWQgKm9wZW5IYW5kbGUpCit7CisgICAgc3RydWN0IHY0bDJfYnVmZmVyIGJ1ZjsKKyAgICBzdHJ1Y3QgdjRsMl9wbGFuZSBwbGFuZXNbTUZDX0RFQ19OVU1fUExBTkVTXTsKKyAgICBpbnQgcmV0OworICAgIGludCBpLCBqOworICAgIF9NRkNMSUIgKnBDVFg7CisgICAgcENUWCAgPSAoX01GQ0xJQiAqKSBvcGVuSGFuZGxlOworCisgICAgcmV0ID0gdjRsMl9tZmNfcmVxYnVmcyhwQ1RYLT5oTUZDLCBWNEwyX0JVRl9UWVBFX1ZJREVPX0NBUFRVUkVfTVBMQU5FLAorICAgICAgICAgICAgICAgICAgICBWNEwyX01FTU9SWV9NTUFQLCAoaW50ICopJnBDVFgtPnY0bDJfZGVjLm1mY19udW1fZHN0X2J1ZnMpOworICAgIGlmIChyZXQgIT0gMCkgeworICAgICAgICBMT0dFKCJbJXNdIFZJRElPQ19SRVFCVUZTIGZhaWxlZCAoZGVzdGluYXRpb24gYnVmZmVycykiLF9fZnVuY19fKTsKKyAgICAgICAgcmV0ID0gTUZDX1JFVF9ERUNfSU5JVF9GQUlMOworICAgICAgICBnb3RvIGVycm9yX2Nhc2UxOworICAgIH0KKworICAgIGZvciAoaSA9IDA7ICBpIDwgcENUWC0+djRsMl9kZWMubWZjX251bV9kc3RfYnVmczsgKytpKSB7CisgICAgICAgIHJldCA9IHY0bDJfbWZjX3F1ZXJ5YnVmKHBDVFgtPmhNRkMsICZidWYsIFY0TDJfQlVGX1RZUEVfVklERU9fQ0FQVFVSRV9NUExBTkUsCisgICAgICAgICAgICAgICAgICAgICAgICBWNEwyX01FTU9SWV9NTUFQLCBpLCBwbGFuZXMpOworICAgICAgICBpZiAocmV0ICE9IDApIHsKKyAgICAgICAgICAgIExPR0UoIlslc10gVklESU9DX1FVRVJZQlVGIGZhaWxlZCAoZGVzdGluYXRpb24gYnVmZmVycykiLF9fZnVuY19fKTsKKyAgICAgICAgICAgIHJldCA9IE1GQ19SRVRfREVDX0lOSVRfRkFJTDsKKyAgICAgICAgICAgIGdvdG8gZXJyb3JfY2FzZTE7CisgICAgICAgIH0KKworICAgICAgICBwQ1RYLT52NGwyX2RlYy5tZmNfZHN0X2J1ZnNfbGVuWzBdID0gYnVmLm0ucGxhbmVzWzBdLmxlbmd0aDsKKyAgICAgICAgcENUWC0+djRsMl9kZWMubWZjX2RzdF9idWZzX2xlblsxXSA9IGJ1Zi5tLnBsYW5lc1sxXS5sZW5ndGg7CisKKyAgICAgICAgcENUWC0+djRsMl9kZWMubWZjX2RzdF9waHlzW2ldWzBdID0gYnVmLm0ucGxhbmVzWzBdLmNvb2tpZTsKKyAgICAgICAgcENUWC0+djRsMl9kZWMubWZjX2RzdF9waHlzW2ldWzFdID0gYnVmLm0ucGxhbmVzWzFdLmNvb2tpZTsKKworI2lmZGVmIFVTRV9JT04KKyAgICAgICAgcENUWC0+ZHN0X2lvbl9mZFtpXVswXSA9IChpbnQpYnVmLm0ucGxhbmVzWzBdLnNoYXJlOworICAgICAgICBwQ1RYLT5kc3RfaW9uX2ZkW2ldWzFdID0gKGludClidWYubS5wbGFuZXNbMV0uc2hhcmU7CisKKyAgICAgICAgcENUWC0+djRsMl9kZWMubWZjX2RzdF9idWZzW2ldWzBdID0KKyAgICAgICAgICAgIGlvbl9tYXAocENUWC0+ZHN0X2lvbl9mZFtpXVswXSxwQ1RYLT52NGwyX2RlYy5tZmNfZHN0X2J1ZnNfbGVuWzBdLDApOworICAgICAgICBwQ1RYLT52NGwyX2RlYy5tZmNfZHN0X2J1ZnNbaV1bMV0gPQorICAgICAgICAgICAgaW9uX21hcChwQ1RYLT5kc3RfaW9uX2ZkW2ldWzFdLHBDVFgtPnY0bDJfZGVjLm1mY19kc3RfYnVmc19sZW5bMV0sMCk7CisgICAgICAgIGlmIChwQ1RYLT52NGwyX2RlYy5tZmNfZHN0X2J1ZnNbaV1bMF0gPT0gTUFQX0ZBSUxFRCB8fAorICAgICAgICAgICAgcENUWC0+djRsMl9kZWMubWZjX2RzdF9idWZzW2ldWzBdID09IE1BUF9GQUlMRUQpCisgICAgICAgICAgICBnb3RvIGVycm9yX2Nhc2UyOworI2Vsc2UKKyAgICAgICAgcENUWC0+djRsMl9kZWMubWZjX2RzdF9idWZzW2ldWzBdID0gbW1hcChOVUxMLCBidWYubS5wbGFuZXNbMF0ubGVuZ3RoLAorICAgICAgICAgICAgIFBST1RfUkVBRCB8IFBST1RfV1JJVEUsIE1BUF9TSEFSRUQsIHBDVFgtPmhNRkMsIGJ1Zi5tLnBsYW5lc1swXS5tLm1lbV9vZmZzZXQpOworICAgICAgICBpZiAocENUWC0+djRsMl9kZWMubWZjX2RzdF9idWZzW2ldWzBdID09IE1BUF9GQUlMRUQpIHsKKyAgICAgICAgICAgIExPR0UoIlslc10gbW1hcCBmYWlsZWQgKGRlc3RpbmF0aW9uIGJ1ZmZlcnMgKFkpKSIsX19mdW5jX18pOworICAgICAgICAgICAgcmV0ID0gTUZDX1JFVF9ERUNfSU5JVF9GQUlMOworICAgICAgICAgICAgZ290byBlcnJvcl9jYXNlMjsKKyAgICAgICAgfQorCisgICAgICAgIHBDVFgtPnY0bDJfZGVjLm1mY19kc3RfYnVmc1tpXVsxXSA9IG1tYXAoTlVMTCwgYnVmLm0ucGxhbmVzWzFdLmxlbmd0aCwKKyAgICAgICAgUFJPVF9SRUFEIHwgUFJPVF9XUklURSwgTUFQX1NIQVJFRCwgcENUWC0+aE1GQywgYnVmLm0ucGxhbmVzWzFdLm0ubWVtX29mZnNldCk7CisgICAgICAgIGlmIChwQ1RYLT52NGwyX2RlYy5tZmNfZHN0X2J1ZnNbaV1bMV0gPT0gTUFQX0ZBSUxFRCkgeworICAgICAgICAgICAgTE9HRSgiWyVzXSBtbWFwIGZhaWxlZCAoZGVzdGluYXRpb24gYnVmZmVycyAoVVYpKSIsX19mdW5jX18pOworICAgICAgICAgICAgcmV0ID0gTUZDX1JFVF9ERUNfSU5JVF9GQUlMOworICAgICAgICAgICAgZ290byBlcnJvcl9jYXNlMjsKKyAgICAgICAgfQorI2VuZGlmCisKKyAgICAgICAgcmV0ID0gdjRsMl9tZmNfcWJ1ZihwQ1RYLT5oTUZDLCAmYnVmLCBWNEwyX0JVRl9UWVBFX1ZJREVPX0NBUFRVUkVfTVBMQU5FLAorICAgICAgICAgICAgICAgICAgICAgICAgVjRMMl9NRU1PUllfTU1BUCwgaSwgcGxhbmVzLCAwKTsKKyAgICAgICAgaWYgKHJldCAhPSAwKSB7CisgICAgICAgICAgICBMT0dFKCJbJXNdIFZJRElPQ19RQlVGIGZhaWxlZCwgVjRMMl9CVUZfVFlQRV9WSURFT19DQVBUVVJFX01QTEFORSIsX19mdW5jX18pOworICAgICAgICAgICAgcmV0ID0gTUZDX1JFVF9ERUNfSU5JVF9GQUlMOworICAgICAgICAgICAgZ290byBlcnJvcl9jYXNlMjsKKyAgICAgICAgfQorICAgIH0KKyAgICBwQ1RYLT5pbnRlcl9idWZmX3N0YXR1cyB8PSBNRkNfVVNFX1lVVl9CVUZGOworCisgICAgcmV0dXJuIDA7CisKK2Vycm9yX2Nhc2UyOgorICAgIGZvciAoaiA9IDA7IGogPCBpOyBqKyspIHsKKyAgICAgICAgbXVubWFwKHBDVFgtPnY0bDJfZGVjLm1mY19kc3RfYnVmc1tqXVswXSwgcENUWC0+djRsMl9kZWMubWZjX2RzdF9idWZzX2xlblswXSk7CisgICAgICAgIG11bm1hcChwQ1RYLT52NGwyX2RlYy5tZmNfZHN0X2J1ZnNbal1bMV0sIHBDVFgtPnY0bDJfZGVjLm1mY19kc3RfYnVmc19sZW5bMV0pOworICAgIH0KK2Vycm9yX2Nhc2UxOgorICAgIHJldHVybiByZXQ7Cit9CisKK2ludCByZXNvbHV0aW9uX2NoYW5nZSh2b2lkICpvcGVuSGFuZGxlKQoreworICAgIGludCBpLCByZXQ7CisgICAgaW50IHJlcV9jb3VudDsKKyAgICBfTUZDTElCICpwQ1RYOworICAgIHBDVFggID0gKF9NRkNMSUIgKikgb3BlbkhhbmRsZTsKKworICAgIHJldCA9IHY0bDJfbWZjX3N0cmVhbW9mZihwQ1RYLT5oTUZDLCBWNEwyX0JVRl9UWVBFX1ZJREVPX0NBUFRVUkVfTVBMQU5FKTsKKyAgICBpZiAocmV0ICE9IDApCisgICAgICAgIGdvdG8gZXJyb3JfY2FzZTsKKworICAgIHBDVFgtPmludGVyX2J1ZmZfc3RhdHVzICY9IH4oTUZDX1VTRV9EU1RfU1RSRUFNT04pOworCisgICAgZm9yIChpID0gMDsgaSA8IHBDVFgtPnY0bDJfZGVjLm1mY19udW1fZHN0X2J1ZnM7IGkrKykgeworICAgICAgICBtdW5tYXAocENUWC0+djRsMl9kZWMubWZjX2RzdF9idWZzW2ldWzBdLCBwQ1RYLT52NGwyX2RlYy5tZmNfZHN0X2J1ZnNfbGVuWzBdKTsKKyAgICAgICAgbXVubWFwKHBDVFgtPnY0bDJfZGVjLm1mY19kc3RfYnVmc1tpXVsxXSwgcENUWC0+djRsMl9kZWMubWZjX2RzdF9idWZzX2xlblsxXSk7CisgICAgfQorICAgIHBDVFgtPmludGVyX2J1ZmZfc3RhdHVzICY9IH4oTUZDX1VTRV9ZVVZfQlVGRik7CisKKyAgICByZXFfY291bnQgPSAwOworICAgIHJldCA9IHY0bDJfbWZjX3JlcWJ1ZnMocENUWC0+aE1GQywgVjRMMl9CVUZfVFlQRV9WSURFT19DQVBUVVJFX01QTEFORSwKKyAgICAgICAgICAgICAgICAgICAgVjRMMl9NRU1PUllfTU1BUCwgJnJlcV9jb3VudCk7CisgICAgaWYgKHJldCAhPSAwKQorICAgICAgICBnb3RvIGVycm9yX2Nhc2U7CisKKyAgICByZWFkX2hlYWRlcl9kYXRhKHBDVFgpOworICAgIGluaXRfbWZjX291dHB1dF9zdHJlYW0ocENUWCk7CisKKyAgICByZXQgPSB2NGwyX21mY19zdHJlYW1vbihwQ1RYLT5oTUZDLCBWNEwyX0JVRl9UWVBFX1ZJREVPX0NBUFRVUkVfTVBMQU5FKTsKKyAgICBpZiAocmV0ICE9IDApCisgICAgICAgIGdvdG8gZXJyb3JfY2FzZTsKKyAgICBwQ1RYLT5pbnRlcl9idWZmX3N0YXR1cyB8PSBNRkNfVVNFX0RTVF9TVFJFQU1PTjsKKworICAgIHJldHVybiAwOworCitlcnJvcl9jYXNlOgorICAgIHJldHVybiByZXQ7Cit9CisKK1NTQlNJUF9NRkNfRVJST1JfQ09ERSBTc2JTaXBNZmNEZWNFeGUodm9pZCAqb3BlbkhhbmRsZSwgaW50IGxlbmd0aEJ1ZkZpbGwpCit7CisgICAgX01GQ0xJQiAqcENUWDsKKyAgICBpbnQgcmV0OworCisgICAgc3RydWN0IHY0bDJfYnVmZmVyIGJ1ZjsKKyAgICBzdHJ1Y3QgdjRsMl9wbGFuZSBwbGFuZXNbTUZDX0RFQ19OVU1fUExBTkVTXTsKKyAgICBpbnQgbG9vcF9jb3VudCwgY3RybF92YWx1ZTsKKworICAgIGludCBwb2xsX3N0YXRlOworICAgIGludCBwb2xsX3JldmVudHM7CisKKyAgICBpZiAob3BlbkhhbmRsZSA9PSBOVUxMKSB7CisgICAgICAgIExPR0UoIlslc10gb3BlbkhhbmRsZSBpcyBOVUxMIixfX2Z1bmNfXyk7CisgICAgICAgIHJldHVybiBNRkNfUkVUX0lOVkFMSURfUEFSQU07CisgICAgfQorCisgICAgaWYgKChsZW5ndGhCdWZGaWxsIDwgMCkgfHwgKGxlbmd0aEJ1ZkZpbGwgPiBNQVhfREVDT0RFUl9JTlBVVF9CVUZGRVJfU0laRSkpIHsKKyAgICAgICAgTE9HRSgiWyVzXSBsZW5ndGhCdWZGaWxsIGlzIGludmFsaWQuIChsZW5ndGhCdWZGaWxsPSVkKSIsX19mdW5jX18sIGxlbmd0aEJ1ZkZpbGwpOworICAgICAgICByZXR1cm4gTUZDX1JFVF9JTlZBTElEX1BBUkFNOworICAgIH0KKworICAgIHBDVFggID0gKF9NRkNMSUIgKikgb3BlbkhhbmRsZTsKKworICAgIGlmICgobGVuZ3RoQnVmRmlsbCA+IDApICYmIChTU0JTSVBfTUZDX0xBU1RfRlJBTUVfUFJPQ0VTU0VEICE9IHBDVFgtPmxhc3RmcmFtZSkpIHsKKyAgICAgICAgaWYgKHBDVFgtPmRpc3BsYXlTdGF0dXMgIT0gTUZDX0dFVE9VVEJVRl9ESVNQTEFZX09OTFkpIHsKKyAgICAgICAgICAgIC8qIFF1ZXVlIHRoZSBzdHJlYW0gZnJhbWUgKi8KKyAgICAgICAgICAgIHJldCA9IHY0bDJfbWZjX3FidWYocENUWC0+aE1GQywgJmJ1ZiwgVjRMMl9CVUZfVFlQRV9WSURFT19PVVRQVVRfTVBMQU5FLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWNEwyX01FTU9SWV9NTUFQLCBwQ1RYLT52NGwyX2RlYy5iZWluZ1VzZWRJbmRleCwgcGxhbmVzLCBsZW5ndGhCdWZGaWxsKTsKKyAgICAgICAgICAgIGlmIChyZXQgIT0gMCkgeworICAgICAgICAgICAgICAgIExPR0UoIlslc10gVklESU9DX1FCVUYgZmFpbGVkLCBWNEwyX0JVRl9UWVBFX1ZJREVPX09VVFBVVF9NUExBTkUiLF9fZnVuY19fKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gTUZDX1JFVF9ERUNfRVhFX0VSUjsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgbWVtc2V0KCZidWYsIDAsIHNpemVvZihidWYpKTsKKyAgICAgICAgICAgIGJ1Zi50eXBlID0gVjRMMl9CVUZfVFlQRV9WSURFT19PVVRQVVRfTVBMQU5FOworICAgICAgICAgICAgYnVmLm1lbW9yeSA9IFY0TDJfTUVNT1JZX01NQVA7CisgICAgICAgICAgICBidWYubS5wbGFuZXMgPSBwbGFuZXM7CisgICAgICAgICAgICBidWYubGVuZ3RoID0gMTsKKworICAgICAgICAgICAgLyogd2FpdCBmb3IgZGVjb2RpbmcgKi8KKyAgICAgICAgICAgIGRvIHsKKyAgICAgICAgICAgICAgICBwb2xsX3N0YXRlID0gdjRsMl9tZmNfcG9sbChwQ1RYLT5oTUZDLCAmcG9sbF9yZXZlbnRzLCBQT0xMX0RFQ19XQUlUX1RJTUVPVVQpOworICAgICAgICAgICAgICAgIGlmIChwb2xsX3N0YXRlID4gMCkgeworICAgICAgICAgICAgICAgICAgICBpZiAocG9sbF9yZXZlbnRzICYgUE9MTE9VVCkgeworICAgICAgICAgICAgICAgICAgICAgICAgcmV0ID0gdjRsMl9tZmNfZHFidWYocENUWC0+aE1GQywgJmJ1ZiwgVjRMMl9CVUZfVFlQRV9WSURFT19PVVRQVVRfTVBMQU5FLCBWNEwyX01FTU9SWV9NTUFQKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChyZXQgPT0gMCkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChidWYuZmxhZ3MgJiBWNEwyX0JVRl9GTEFHX0VSUk9SKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gTUZDX1JFVF9ERUNfRVhFX0VSUjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBwQ1RYLT52NGwyX2RlYy5tZmNfc3JjX2J1Zl9mbGFnc1tidWYuaW5kZXhdID0gQlVGX0RFUVVFVUVEOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKHBvbGxfcmV2ZW50cyAmIFBPTExFUlIpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIExPR0UoIlslc10gUE9MTEVSUlxuIixfX2Z1bmNfXyk7CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gTUZDX1JFVF9ERUNfRVhFX0VSUjsKKyAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIExPR0UoIlslc10gcG9sbCgpIHJldHVybnMgMHgleFxuIiwgX19mdW5jX18sIHBvbGxfcmV2ZW50cyk7CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gTUZDX1JFVF9ERUNfRVhFX0VSUjsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAocG9sbF9zdGF0ZSA8IDApIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIE1GQ19SRVRfREVDX0VYRV9FUlI7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKGlzQnJlYWtfbG9vcChwQ1RYKSkKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICAgIH0gd2hpbGUoMCA9PSBwb2xsX3N0YXRlKTsKKyAgICAgICAgfQorCisgICAgICAgIHJldCA9IHY0bDJfbWZjX2RxYnVmKHBDVFgtPmhNRkMsICZidWYsIFY0TDJfQlVGX1RZUEVfVklERU9fQ0FQVFVSRV9NUExBTkUsIFY0TDJfTUVNT1JZX01NQVApOworICAgICAgICBpZiAocmV0ICE9IDApIHsKKyAgICAgICAgICAgIHBDVFgtPmRpc3BsYXlTdGF0dXMgPSBNRkNfR0VUT1VUQlVGX0RFQ09ESU5HX09OTFk7CisgICAgICAgICAgICBwQ1RYLT5kZWNPdXRJbmZvLmRpc3BfcGljX2ZyYW1lX3R5cGUgPSAtMTsKKyAgICAgICAgICAgIHJldHVybiBNRkNfUkVUX09LOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgcmV0ID0gdjRsMl9tZmNfZ19jdHJsKHBDVFgtPmhNRkMsIFY0TDJfQ0lEX0NPREVDX0RJU1BMQVlfU1RBVFVTLCAmY3RybF92YWx1ZSk7CisgICAgICAgICAgICBpZiAocmV0ICE9IDApIHsKKyAgICAgICAgICAgICAgICBMT0dFKCJbJXNdIFZJRElPQ19HX0NUUkwgZmFpbGVkIiwgX19mdW5jX18pOworICAgICAgICAgICAgICAgIHJldHVybiBNRkNfUkVUX0RFQ19HRVRfQ09ORl9GQUlMOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBzd2l0Y2ggKGN0cmxfdmFsdWUpIHsKKyAgICAgICAgICAgIGNhc2UgMDoKKyAgICAgICAgICAgICAgICBwQ1RYLT5kaXNwbGF5U3RhdHVzID0gTUZDX0dFVE9VVEJVRl9ERUNPRElOR19PTkxZOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSAxOgorICAgICAgICAgICAgICAgIHBDVFgtPmRpc3BsYXlTdGF0dXMgPSBNRkNfR0VUT1VUQlVGX0RJU1BMQVlfREVDT0RJTkc7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIDI6CisgICAgICAgICAgICAgICAgcENUWC0+ZGlzcGxheVN0YXR1cyA9IE1GQ19HRVRPVVRCVUZfRElTUExBWV9PTkxZOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSAzOgorICAgICAgICAgICAgICAgIHBDVFgtPmRpc3BsYXlTdGF0dXMgPSBNRkNfR0VUT1VUQlVGX0NIQU5HRV9SRVNPTDsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIGlmIChwQ1RYLT5kaXNwbGF5U3RhdHVzID09IE1GQ19HRVRPVVRCVUZfQ0hBTkdFX1JFU09MKSB7CisgICAgICAgICAgICByZXNvbHV0aW9uX2NoYW5nZShwQ1RYKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHBDVFgtPmRlY091dEluZm8uWVZpckFkZHIgPSBwQ1RYLT52NGwyX2RlYy5tZmNfZHN0X2J1ZnNbYnVmLmluZGV4XVswXTsKKyAgICAgICAgICAgIHBDVFgtPmRlY091dEluZm8uQ1ZpckFkZHIgPSBwQ1RYLT52NGwyX2RlYy5tZmNfZHN0X2J1ZnNbYnVmLmluZGV4XVsxXTsKKworICAgICAgICAgICAgcENUWC0+ZGVjT3V0SW5mby5ZUGh5QWRkciA9ICh1bnNpZ25lZCBpbnQpcENUWC0+djRsMl9kZWMubWZjX2RzdF9waHlzW2J1Zi5pbmRleF1bMF07CisgICAgICAgICAgICBwQ1RYLT5kZWNPdXRJbmZvLkNQaHlBZGRyID0gKHVuc2lnbmVkIGludClwQ1RYLT52NGwyX2RlYy5tZmNfZHN0X3BoeXNbYnVmLmluZGV4XVsxXTsKKyAgICAgICAgfQorCisgICAgICAgIGlmIChTU0JTSVBfTUZDX0xBU1RfRlJBTUVfUkVDRUlWRUQgPT0gcENUWC0+bGFzdGZyYW1lKQorICAgICAgICAgICAgcENUWC0+bGFzdGZyYW1lID0gU1NCU0lQX01GQ19MQVNUX0ZSQU1FX1BST0NFU1NFRDsKKworICAgIH0gZWxzZSBpZiAocENUWC0+djRsMl9kZWMuYkJlaW5nRmluYWxpemVkID09IDApIHsKKyAgICAgICAgcENUWC0+bGFzdGZyYW1lID0gU1NCU0lQX01GQ19MQVNUX0ZSQU1FX1BST0NFU1NFRDsKKyAgICAgICAgcENUWC0+djRsMl9kZWMuYkJlaW5nRmluYWxpemVkID0gMTsgLyogdHJ1ZSAqLworCisgICAgICAgIC8qIFF1ZXVlIHRoZSBzdHJlYW0gZnJhbWUgKi8KKyAgICAgICAgcmV0ID0gdjRsMl9tZmNfcWJ1ZihwQ1RYLT5oTUZDLCAmYnVmLCBWNEwyX0JVRl9UWVBFX1ZJREVPX09VVFBVVF9NUExBTkUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgVjRMMl9NRU1PUllfTU1BUCwgcENUWC0+djRsMl9kZWMuYmVpbmdVc2VkSW5kZXgsIHBsYW5lcywgMCk7CisgICAgICAgIGlmIChyZXQgIT0gMCkgeworICAgICAgICAgICAgTE9HRSgiWyVzXSBWSURJT0NfUUJVRiBmYWlsZWQsIFY0TDJfQlVGX1RZUEVfVklERU9fT1VUUFVUX01QTEFORSIsX19mdW5jX18pOworICAgICAgICAgICAgcmV0dXJuIE1GQ19SRVRfREVDX0VYRV9FUlI7CisgICAgICAgIH0KKworICAgICAgICAvKiB3YWl0IGZvciBkZWNvZGluZyAqLworICAgICAgICBsb29wX2NvdW50ID0gMDsKKyAgICAgICAgZG8geworICAgICAgICAgICAgcmV0ID0gdjRsMl9tZmNfZHFidWYocENUWC0+aE1GQywgJmJ1ZiwgVjRMMl9CVUZfVFlQRV9WSURFT19DQVBUVVJFX01QTEFORSwgVjRMMl9NRU1PUllfTU1BUCk7CisgICAgICAgICAgICBpZiAocmV0ICE9IDApCisgICAgICAgICAgICAgICAgdXNsZWVwKDEwMDApOworICAgICAgICAgICAgbG9vcF9jb3VudCsrOworICAgICAgICAgICAgaWYgKGxvb3BfY291bnQgPj0gMTAwMCkgeworICAgICAgICAgICAgICAgIExPR0UoIlslc10gRXJyb3IgaW4gZG8td2hpbGUgbG9vcCIsX19mdW5jX18pOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICB9IHdoaWxlIChyZXQgIT0gMCk7CisKKyAgICAgICAgcmV0ID0gdjRsMl9tZmNfZ19jdHJsKHBDVFgtPmhNRkMsIFY0TDJfQ0lEX0NPREVDX0RJU1BMQVlfU1RBVFVTLCAmY3RybF92YWx1ZSk7CisgICAgICAgIGlmIChyZXQgIT0gMCkgeworICAgICAgICAgICAgTE9HRSgiWyVzXSBWSURJT0NfR19DVFJMIGZhaWxlZCIsIF9fZnVuY19fKTsKKyAgICAgICAgICAgIHJldHVybiBNRkNfUkVUX0RFQ19FWEVfRVJSOworICAgICAgICB9CisgICAgICAgIGlmIChjdHJsX3ZhbHVlID09IDMpIHsKKyAgICAgICAgICAgIHBDVFgtPmRpc3BsYXlTdGF0dXMgPSBNRkNfR0VUT1VUQlVGX0RJU1BMQVlfRU5EOworICAgICAgICAgICAgcENUWC0+ZGVjT3V0SW5mby5kaXNwX3BpY19mcmFtZV90eXBlID0gLTE7CisgICAgICAgICAgICByZXR1cm4gTUZDX1JFVF9PSzsKKyAgICAgICAgfQorCisgICAgICAgIHBDVFgtPmRpc3BsYXlTdGF0dXMgPSBNRkNfR0VUT1VUQlVGX0RJU1BMQVlfT05MWTsKKworICAgICAgICBwQ1RYLT5kZWNPdXRJbmZvLllWaXJBZGRyID0gcENUWC0+djRsMl9kZWMubWZjX2RzdF9idWZzW2J1Zi5pbmRleF1bMF07CisgICAgICAgIHBDVFgtPmRlY091dEluZm8uQ1ZpckFkZHIgPSBwQ1RYLT52NGwyX2RlYy5tZmNfZHN0X2J1ZnNbYnVmLmluZGV4XVsxXTsKKworICAgICAgICBwQ1RYLT5kZWNPdXRJbmZvLllQaHlBZGRyID0gKHVuc2lnbmVkIGludClwQ1RYLT52NGwyX2RlYy5tZmNfZHN0X3BoeXNbYnVmLmluZGV4XVswXTsKKyAgICAgICAgcENUWC0+ZGVjT3V0SW5mby5DUGh5QWRkciA9ICh1bnNpZ25lZCBpbnQpcENUWC0+djRsMl9kZWMubWZjX2RzdF9waHlzW2J1Zi5pbmRleF1bMV07CisgICAgfSBlbHNlIHsKKyAgICAgICAgbG9vcF9jb3VudCA9IDA7CisgICAgICAgIGRvIHsKKyAgICAgICAgICAgIHJldCA9IHY0bDJfbWZjX2RxYnVmKHBDVFgtPmhNRkMsICZidWYsIFY0TDJfQlVGX1RZUEVfVklERU9fQ0FQVFVSRV9NUExBTkUsIFY0TDJfTUVNT1JZX01NQVApOworICAgICAgICAgICAgaWYgKHJldCAhPSAwKQorICAgICAgICAgICAgICAgIHVzbGVlcCgxMDAwKTsKKyAgICAgICAgICAgIGxvb3BfY291bnQrKzsKKyAgICAgICAgICAgIGlmIChsb29wX2NvdW50ID49IDEwMDApIHsKKyAgICAgICAgICAgICAgICBMT0dFKCJbJXNdIEVycm9yIGluIGRvLXdoaWxlIGxvb3AiLF9fZnVuY19fKTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSB3aGlsZSAocmV0ICE9IDApOworCisgICAgICAgIGlmIChidWYubS5wbGFuZXNbMF0uYnl0ZXN1c2VkID09IDApIHsKKyAgICAgICAgICAgIHBDVFgtPmRpc3BsYXlTdGF0dXMgPSBNRkNfR0VUT1VUQlVGX0RJU1BMQVlfRU5EOworICAgICAgICAgICAgcENUWC0+ZGVjT3V0SW5mby5kaXNwX3BpY19mcmFtZV90eXBlID0gLTE7CisgICAgICAgICAgICByZXR1cm4gTUZDX1JFVF9PSzsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHBDVFgtPmRpc3BsYXlTdGF0dXMgPSBNRkNfR0VUT1VUQlVGX0RJU1BMQVlfT05MWTsKKyAgICAgICAgfQorCisgICAgICAgIHBDVFgtPmRlY091dEluZm8uWVZpckFkZHIgPSBwQ1RYLT52NGwyX2RlYy5tZmNfZHN0X2J1ZnNbYnVmLmluZGV4XVswXTsKKyAgICAgICAgcENUWC0+ZGVjT3V0SW5mby5DVmlyQWRkciA9IHBDVFgtPnY0bDJfZGVjLm1mY19kc3RfYnVmc1tidWYuaW5kZXhdWzFdOworCisgICAgICAgIHBDVFgtPmRlY091dEluZm8uWVBoeUFkZHIgPSAodW5zaWduZWQgaW50KXBDVFgtPnY0bDJfZGVjLm1mY19kc3RfcGh5c1tidWYuaW5kZXhdWzBdOworICAgICAgICBwQ1RYLT5kZWNPdXRJbmZvLkNQaHlBZGRyID0gKHVuc2lnbmVkIGludClwQ1RYLT52NGwyX2RlYy5tZmNfZHN0X3BoeXNbYnVmLmluZGV4XVsxXTsKKyAgICB9CisKKyAgICBwQ1RYLT5kZWNPdXRJbmZvLmRpc3BfcGljX2ZyYW1lX3R5cGUgPSAoYnVmLmZsYWdzICYgKDB4NyA8PCAzKSk7CisKKyAgICBzd2l0Y2ggKHBDVFgtPmRlY091dEluZm8uZGlzcF9waWNfZnJhbWVfdHlwZSkgeworICAgIGNhc2UgVjRMMl9CVUZfRkxBR19LRVlGUkFNRToKKyAgICAgICAgcENUWC0+ZGVjT3V0SW5mby5kaXNwX3BpY19mcmFtZV90eXBlID0gMTsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBWNEwyX0JVRl9GTEFHX1BGUkFNRToKKyAgICAgICAgcENUWC0+ZGVjT3V0SW5mby5kaXNwX3BpY19mcmFtZV90eXBlID0gMjsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBWNEwyX0JVRl9GTEFHX0JGUkFNRToKKyAgICAgICAgcENUWC0+ZGVjT3V0SW5mby5kaXNwX3BpY19mcmFtZV90eXBlID0gMzsKKyAgICAgICAgYnJlYWs7CisgICAgZGVmYXVsdDoKKyAgICAgICAgcENUWC0+ZGVjT3V0SW5mby5kaXNwX3BpY19mcmFtZV90eXBlID0gMDsKKyAgICAgICAgYnJlYWs7CisgICAgfQorCisgICAgcmV0ID0gdjRsMl9tZmNfcWJ1ZihwQ1RYLT5oTUZDLCAmYnVmLCBWNEwyX0JVRl9UWVBFX1ZJREVPX0NBUFRVUkVfTVBMQU5FLCBWNEwyX01FTU9SWV9NTUFQLAorICAgICAgICAgICAgICAgICAgICAgICAgYnVmLmluZGV4LCBwbGFuZXMsIDApOworCisgICAgcmV0dXJuIE1GQ19SRVRfT0s7Cit9CisKK1NTQlNJUF9NRkNfRVJST1JfQ09ERSBTc2JTaXBNZmNEZWNFeGVOYih2b2lkICpvcGVuSGFuZGxlLCBpbnQgbGVuZ3RoQnVmRmlsbCkKK3sKKyAgICBfTUZDTElCICpwQ1RYOworICAgIGludCByZXQ7CisKKyAgICBzdHJ1Y3QgdjRsMl9idWZmZXIgYnVmOworICAgIHN0cnVjdCB2NGwyX3BsYW5lIHBsYW5lc1tNRkNfREVDX05VTV9QTEFORVNdOworCisgICAgaWYgKG9wZW5IYW5kbGUgPT0gTlVMTCkgeworICAgICAgICBMT0dFKCJbJXNdIG9wZW5IYW5kbGUgaXMgTlVMTCIsX19mdW5jX18pOworICAgICAgICByZXR1cm4gTUZDX1JFVF9JTlZBTElEX1BBUkFNOworICAgIH0KKworICAgIGlmICgobGVuZ3RoQnVmRmlsbCA8IDApIHx8IChsZW5ndGhCdWZGaWxsID4gTUFYX0RFQ09ERVJfSU5QVVRfQlVGRkVSX1NJWkUpKSB7CisgICAgICAgIExPR0UoIlslc10gbGVuZ3RoQnVmRmlsbCBpcyBpbnZhbGlkLiAobGVuZ3RoQnVmRmlsbD0lZCkiLF9fZnVuY19fLCBsZW5ndGhCdWZGaWxsKTsKKyAgICAgICAgcmV0dXJuIE1GQ19SRVRfSU5WQUxJRF9QQVJBTTsKKyAgICB9CisKKyAgICBwQ1RYICA9IChfTUZDTElCICopIG9wZW5IYW5kbGU7CisKKyAgICBpZiAoKGxlbmd0aEJ1ZkZpbGwgPiAwKSAmJiAoU1NCU0lQX01GQ19MQVNUX0ZSQU1FX1BST0NFU1NFRCAhPSBwQ1RYLT5sYXN0ZnJhbWUpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgJiYgKHBDVFgtPmRpc3BsYXlTdGF0dXMgIT0gTUZDX0dFVE9VVEJVRl9ESVNQTEFZX09OTFkpKSB7CisgICAgICAgIC8qIFF1ZXVlIHRoZSBzdHJlYW0gZnJhbWUgKi8KKyAgICAgICAgcmV0ID0gdjRsMl9tZmNfcWJ1ZihwQ1RYLT5oTUZDLCAmYnVmLCBWNEwyX0JVRl9UWVBFX1ZJREVPX09VVFBVVF9NUExBTkUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgVjRMMl9NRU1PUllfTU1BUCwgcENUWC0+djRsMl9kZWMuYmVpbmdVc2VkSW5kZXgsIHBsYW5lcywgbGVuZ3RoQnVmRmlsbCk7CisgICAgICAgIGlmIChyZXQgIT0gMCkgeworICAgICAgICAgICAgTE9HRSgiWyVzXSBWSURJT0NfUUJVRiBmYWlsZWQsIFY0TDJfQlVGX1RZUEVfVklERU9fT1VUUFVUX01QTEFORSIsX19mdW5jX18pOworICAgICAgICAgICAgcmV0dXJuIE1GQ19SRVRfREVDX0VYRV9FUlI7CisgICAgICAgIH0KKyAgICB9IGVsc2UgaWYgKHBDVFgtPnY0bDJfZGVjLmJCZWluZ0ZpbmFsaXplZCA9PSAwKSB7CisgICAgICAgIC8qIFF1ZXVlIHRoZSBzdHJlYW0gZnJhbWUgKi8KKyAgICAgICAgcmV0ID0gdjRsMl9tZmNfcWJ1ZihwQ1RYLT5oTUZDLCAmYnVmLCBWNEwyX0JVRl9UWVBFX1ZJREVPX09VVFBVVF9NUExBTkUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgVjRMMl9NRU1PUllfTU1BUCwgcENUWC0+djRsMl9kZWMuYmVpbmdVc2VkSW5kZXgsIHBsYW5lcywgMCk7CisgICAgICAgIGlmIChyZXQgIT0gMCkgeworICAgICAgICAgICAgTE9HRSgiWyVzXSBWSURJT0NfUUJVRiBmYWlsZWQsIFY0TDJfQlVGX1RZUEVfVklERU9fT1VUUFVUX01QTEFORSIsX19mdW5jX18pOworICAgICAgICAgICAgcmV0dXJuIE1GQ19SRVRfREVDX0VYRV9FUlI7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKFNTQlNJUF9NRkNfTEFTVF9GUkFNRV9QUk9DRVNTRUQgIT0gcENUWC0+bGFzdGZyYW1lKSAmJiAobGVuZ3RoQnVmRmlsbCA9PSAwKSkKKyAgICAgICAgcENUWC0+bGFzdGZyYW1lID0gU1NCU0lQX01GQ19MQVNUX0ZSQU1FX1JFQ0VJVkVEOworCisgICAgcmV0dXJuIE1GQ19SRVRfT0s7Cit9CisKK2ludCBpc0JyZWFrX2xvb3Aodm9pZCAqb3BlbkhhbmRsZSkKK3sKKyAgICBfTUZDTElCICpwQ1RYOworICAgIHBDVFggID0gKF9NRkNMSUIgKikgb3BlbkhhbmRsZTsKKyAgICBpbnQgY3RybF92YWx1ZTsKKyAgICBpbnQgcmV0ID0gMDsKKworICAgIGlmIChwQ1RYLT5kaXNwbGF5U3RhdHVzID09IE1GQ19HRVRPVVRCVUZfRElTUExBWV9PTkxZKQorICAgICAgICByZXR1cm4gMTsKKworICAgIHJldCA9IHY0bDJfbWZjX2dfY3RybChwQ1RYLT5oTUZDLCBWNEwyX0NJRF9DT0RFQ19DSEVDS19TVEFURSwgJmN0cmxfdmFsdWUpOworICAgIGlmIChyZXQgIT0gMCkgeworICAgICAgICBMT0dFKCJbJXNdIFZJRElPQ19HX0NUUkwgZmFpbGVkIiwgX19mdW5jX18pOworICAgICAgICByZXR1cm4gMDsKKyAgICB9CisKKyAgICBpZiAoY3RybF92YWx1ZSA9PSBNRkNTVEFURV9ERUNfUkVTX0RFVEVDVCkgeworICAgICAgICBMT0dWKCJbJXNdIFJlc29sdXRpb24gQ2hhbmdlIGRldGVjdCIsX19mdW5jX18pOworICAgICAgICByZXR1cm4gMTsKKyAgICB9IGVsc2UgaWYgKGN0cmxfdmFsdWUgPT0gTUZDU1RBVEVfREVDX1RFUk1JTkFUSU5HKSB7CisgICAgICAgIExPR1YoIlslc10gRGVjb2RpbmcgRmluaXNoISEhIixfX2Z1bmNfXyk7CisgICAgICAgIHJldHVybiAxOworICAgIH0KKworICAgIHJldHVybiAwOworfQorCitTU0JTSVBfTUZDX0RFQ19PVVRCVUZfU1RBVFVTIFNzYlNpcE1mY0RlY1dhaXRGb3JPdXRCdWYodm9pZCAqb3BlbkhhbmRsZSwgU1NCU0lQX01GQ19ERUNfT1VUUFVUX0lORk8gKm91dHB1dF9pbmZvKQoreworICAgIF9NRkNMSUIgKnBDVFg7CisgICAgaW50IHJldDsKKworICAgIHN0cnVjdCB2NGwyX2J1ZmZlciBidWY7CisgICAgc3RydWN0IHY0bDJfcGxhbmUgcGxhbmVzW01GQ19ERUNfTlVNX1BMQU5FU107CisgICAgaW50IGxvb3BfY291bnQsIGN0cmxfdmFsdWU7CisKKyAgICBpbnQgcG9sbF9zdGF0ZTsKKyAgICBpbnQgcG9sbF9yZXZlbnRzOworCisgICAgcENUWCAgPSAoX01GQ0xJQiAqKSBvcGVuSGFuZGxlOworCisgICAgaWYgKFNTQlNJUF9NRkNfTEFTVF9GUkFNRV9QUk9DRVNTRUQgIT0gcENUWC0+bGFzdGZyYW1lKSB7CisgICAgICAgIGlmIChwQ1RYLT5kaXNwbGF5U3RhdHVzICE9IE1GQ19HRVRPVVRCVUZfRElTUExBWV9PTkxZKSB7CisgICAgICAgICAgICAvKiB3YWl0IGZvciBkZWNvZGluZyAqLworICAgICAgICAgICAgZG8geworICAgICAgICAgICAgICAgIHBvbGxfc3RhdGUgPSB2NGwyX21mY19wb2xsKHBDVFgtPmhNRkMsICZwb2xsX3JldmVudHMsIFBPTExfREVDX1dBSVRfVElNRU9VVCk7CisgICAgICAgICAgICAgICAgaWYgKHBvbGxfc3RhdGUgPiAwKSB7CisgICAgICAgICAgICAgICAgICAgIGlmIChwb2xsX3JldmVudHMgJiBQT0xMT1VUKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBidWYubS5wbGFuZXMgPSBwbGFuZXM7CisgICAgICAgICAgICAgICAgICAgICAgICBidWYubGVuZ3RoID0gMTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldCA9IHY0bDJfbWZjX2RxYnVmKHBDVFgtPmhNRkMsICZidWYsIFY0TDJfQlVGX1RZUEVfVklERU9fT1VUUFVUX01QTEFORSwgVjRMMl9NRU1PUllfTU1BUCk7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAocmV0ID09IDApIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoYnVmLmZsYWdzICYgVjRMMl9CVUZfRkxBR19FUlJPUikKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIE1GQ19HRVRPVVRCVUZfU1RBVFVTX05VTEw7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcENUWC0+djRsMl9kZWMubWZjX3NyY19idWZfZmxhZ3NbYnVmLmluZGV4XSA9IEJVRl9ERVFVRVVFRDsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChwb2xsX3JldmVudHMgJiBQT0xMRVJSKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBMT0dFKCJbJXNdIFBPTExFUlJcbiIsX19mdW5jX18pOworICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIE1GQ19HRVRPVVRCVUZfU1RBVFVTX05VTEw7CisgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgICAgICBMT0dFKCJbJXNdIHBvbGwoKSByZXR1cm5zIDB4JXhcbiIsIF9fZnVuY19fLCBwb2xsX3JldmVudHMpOworICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIE1GQ19HRVRPVVRCVUZfU1RBVFVTX05VTEw7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKHBvbGxfc3RhdGUgPCAwKSB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBNRkNfR0VUT1VUQlVGX1NUQVRVU19OVUxMOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmIChpc0JyZWFrX2xvb3AocENUWCkpCisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgICB9IHdoaWxlICgwID09IHBvbGxfc3RhdGUpOworICAgICAgICB9CisKKyAgICAgICAgcmV0ID0gdjRsMl9tZmNfZHFidWYocENUWC0+aE1GQywgJmJ1ZiwgVjRMMl9CVUZfVFlQRV9WSURFT19DQVBUVVJFX01QTEFORSwgVjRMMl9NRU1PUllfTU1BUCk7CisgICAgICAgIGlmIChyZXQgIT0gMCkgeworICAgICAgICAgICAgcENUWC0+ZGlzcGxheVN0YXR1cyA9IE1GQ19HRVRPVVRCVUZfREVDT0RJTkdfT05MWTsKKyAgICAgICAgICAgIHBDVFgtPmRlY091dEluZm8uZGlzcF9waWNfZnJhbWVfdHlwZSA9IC0xOworICAgICAgICAgICAgcmV0dXJuIFNzYlNpcE1mY0RlY0dldE91dEJ1ZihwQ1RYLCBvdXRwdXRfaW5mbyk7OworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgcmV0ID0gdjRsMl9tZmNfZ19jdHJsKHBDVFgtPmhNRkMsIFY0TDJfQ0lEX0NPREVDX0RJU1BMQVlfU1RBVFVTLCAmY3RybF92YWx1ZSk7CisgICAgICAgICAgICBpZiAocmV0ICE9IDApIHsKKyAgICAgICAgICAgICAgICBMT0dFKCJbJXNdIFZJRElPQ19HX0NUUkwgZmFpbGVkIiwgX19mdW5jX18pOworICAgICAgICAgICAgICAgIHJldHVybiBNRkNfUkVUX0RFQ19HRVRfQ09ORl9GQUlMOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBzd2l0Y2ggKGN0cmxfdmFsdWUpIHsKKyAgICAgICAgICAgIGNhc2UgMDoKKyAgICAgICAgICAgICAgICBwQ1RYLT5kaXNwbGF5U3RhdHVzID0gTUZDX0dFVE9VVEJVRl9ERUNPRElOR19PTkxZOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSAxOgorICAgICAgICAgICAgICAgIHBDVFgtPmRpc3BsYXlTdGF0dXMgPSBNRkNfR0VUT1VUQlVGX0RJU1BMQVlfREVDT0RJTkc7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIDI6CisgICAgICAgICAgICAgICAgcENUWC0+ZGlzcGxheVN0YXR1cyA9IE1GQ19HRVRPVVRCVUZfRElTUExBWV9PTkxZOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSAzOgorICAgICAgICAgICAgICAgIHBDVFgtPmRpc3BsYXlTdGF0dXMgPSBNRkNfR0VUT1VUQlVGX0NIQU5HRV9SRVNPTDsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIGlmIChwQ1RYLT5kaXNwbGF5U3RhdHVzID09IE1GQ19HRVRPVVRCVUZfQ0hBTkdFX1JFU09MKSB7CisgICAgICAgICAgICByZXNvbHV0aW9uX2NoYW5nZShwQ1RYKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHBDVFgtPmRlY091dEluZm8uWVZpckFkZHIgPSBwQ1RYLT52NGwyX2RlYy5tZmNfZHN0X2J1ZnNbYnVmLmluZGV4XVswXTsKKyAgICAgICAgICAgIHBDVFgtPmRlY091dEluZm8uQ1ZpckFkZHIgPSBwQ1RYLT52NGwyX2RlYy5tZmNfZHN0X2J1ZnNbYnVmLmluZGV4XVsxXTsKKworICAgICAgICAgICAgcENUWC0+ZGVjT3V0SW5mby5ZUGh5QWRkciA9ICh1bnNpZ25lZCBpbnQpcENUWC0+djRsMl9kZWMubWZjX2RzdF9waHlzW2J1Zi5pbmRleF1bMF07CisgICAgICAgICAgICBwQ1RYLT5kZWNPdXRJbmZvLkNQaHlBZGRyID0gKHVuc2lnbmVkIGludClwQ1RYLT52NGwyX2RlYy5tZmNfZHN0X3BoeXNbYnVmLmluZGV4XVsxXTsKKyAgICAgICAgfQorCisgICAgICAgIGlmIChTU0JTSVBfTUZDX0xBU1RfRlJBTUVfUkVDRUlWRUQgPT0gcENUWC0+bGFzdGZyYW1lKQorICAgICAgICAgICAgcENUWC0+bGFzdGZyYW1lID0gU1NCU0lQX01GQ19MQVNUX0ZSQU1FX1BST0NFU1NFRDsKKyAgICB9IGVsc2UgaWYgKHBDVFgtPnY0bDJfZGVjLmJCZWluZ0ZpbmFsaXplZCA9PSAwKSB7CisgICAgICAgIHBDVFgtPmxhc3RmcmFtZSA9IFNTQlNJUF9NRkNfTEFTVF9GUkFNRV9QUk9DRVNTRUQ7CisgICAgICAgIHBDVFgtPnY0bDJfZGVjLmJCZWluZ0ZpbmFsaXplZCA9IDE7IC8qIHRydWUgKi8KKworICAgICAgICAvKiB3YWl0IGZvciBkZWNvZGluZyAqLworICAgICAgICBsb29wX2NvdW50ID0gMDsKKyAgICAgICAgZG8geworICAgICAgICAgICAgcmV0ID0gdjRsMl9tZmNfZHFidWYocENUWC0+aE1GQywgJmJ1ZiwgVjRMMl9CVUZfVFlQRV9WSURFT19DQVBUVVJFX01QTEFORSwgVjRMMl9NRU1PUllfTU1BUCk7CisgICAgICAgICAgICBpZiAocmV0ICE9IDApCisgICAgICAgICAgICAgICAgdXNsZWVwKDEwMDApOworICAgICAgICAgICAgbG9vcF9jb3VudCsrOworICAgICAgICAgICAgaWYgKGxvb3BfY291bnQgPj0gMTAwMCkgeworICAgICAgICAgICAgICAgIExPR0UoIlslc10gRXJyb3IgaW4gZG8td2hpbGUgbG9vcCIsX19mdW5jX18pOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICB9IHdoaWxlIChyZXQgIT0gMCk7CisKKyAgICAgICAgcmV0ID0gdjRsMl9tZmNfZ19jdHJsKHBDVFgtPmhNRkMsIFY0TDJfQ0lEX0NPREVDX0RJU1BMQVlfU1RBVFVTLCAmY3RybF92YWx1ZSk7CisgICAgICAgIGlmIChyZXQgIT0gMCkgeworICAgICAgICAgICAgTE9HRSgiWyVzXSBWSURJT0NfR19DVFJMIGZhaWxlZCIsIF9fZnVuY19fKTsKKyAgICAgICAgICAgIHJldHVybiBNRkNfUkVUX0RFQ19HRVRfQ09ORl9GQUlMOworICAgICAgICB9CisgICAgICAgIGlmIChjdHJsX3ZhbHVlID09IDMpIHsKKyAgICAgICAgICAgIHBDVFgtPmRpc3BsYXlTdGF0dXMgPSBNRkNfR0VUT1VUQlVGX0RJU1BMQVlfRU5EOworICAgICAgICAgICAgcENUWC0+ZGVjT3V0SW5mby5kaXNwX3BpY19mcmFtZV90eXBlID0gLTE7CisgICAgICAgICAgICByZXR1cm4gU3NiU2lwTWZjRGVjR2V0T3V0QnVmKHBDVFgsIG91dHB1dF9pbmZvKTs7CisgICAgICAgIH0KKworICAgICAgICBwQ1RYLT5kaXNwbGF5U3RhdHVzID0gTUZDX0dFVE9VVEJVRl9ESVNQTEFZX09OTFk7CisKKyAgICAgICAgcENUWC0+ZGVjT3V0SW5mby5ZVmlyQWRkciA9IHBDVFgtPnY0bDJfZGVjLm1mY19kc3RfYnVmc1tidWYuaW5kZXhdWzBdOworICAgICAgICBwQ1RYLT5kZWNPdXRJbmZvLkNWaXJBZGRyID0gcENUWC0+djRsMl9kZWMubWZjX2RzdF9idWZzW2J1Zi5pbmRleF1bMV07CisKKyAgICAgICAgcENUWC0+ZGVjT3V0SW5mby5ZUGh5QWRkciA9ICh1bnNpZ25lZCBpbnQpcENUWC0+djRsMl9kZWMubWZjX2RzdF9waHlzW2J1Zi5pbmRleF1bMF07CisgICAgICAgIHBDVFgtPmRlY091dEluZm8uQ1BoeUFkZHIgPSAodW5zaWduZWQgaW50KXBDVFgtPnY0bDJfZGVjLm1mY19kc3RfcGh5c1tidWYuaW5kZXhdWzFdOworICAgIH0gZWxzZSB7CisgICAgICAgIGxvb3BfY291bnQgPSAwOworICAgICAgICBkbyB7CisgICAgICAgICAgICByZXQgPSB2NGwyX21mY19kcWJ1ZihwQ1RYLT5oTUZDLCAmYnVmLCBWNEwyX0JVRl9UWVBFX1ZJREVPX0NBUFRVUkVfTVBMQU5FLCBWNEwyX01FTU9SWV9NTUFQKTsKKyAgICAgICAgICAgIGlmIChyZXQgIT0gMCkKKyAgICAgICAgICAgICAgICB1c2xlZXAoMTAwMCk7CisgICAgICAgICAgICBsb29wX2NvdW50Kys7CisgICAgICAgICAgICBpZiAobG9vcF9jb3VudCA+PSAxMDAwKSB7CisgICAgICAgICAgICAgICAgTE9HRSgiWyVzXSBFcnJvciBpbiBkby13aGlsZSBsb29wIixfX2Z1bmNfXyk7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgIH0gd2hpbGUgKHJldCAhPSAwKTsKKworICAgICAgICBpZiAoYnVmLm0ucGxhbmVzWzBdLmJ5dGVzdXNlZCA9PSAwKSB7CisgICAgICAgICAgICBwQ1RYLT5kaXNwbGF5U3RhdHVzID0gTUZDX0dFVE9VVEJVRl9ESVNQTEFZX0VORDsKKyAgICAgICAgICAgIHBDVFgtPmRlY091dEluZm8uZGlzcF9waWNfZnJhbWVfdHlwZSA9IC0xOworICAgICAgICAgICAgcmV0dXJuIFNzYlNpcE1mY0RlY0dldE91dEJ1ZihwQ1RYLCBvdXRwdXRfaW5mbyk7OworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgcENUWC0+ZGlzcGxheVN0YXR1cyA9IE1GQ19HRVRPVVRCVUZfRElTUExBWV9PTkxZOworICAgICAgICB9CisKKyAgICAgICAgcENUWC0+ZGVjT3V0SW5mby5ZVmlyQWRkciA9IHBDVFgtPnY0bDJfZGVjLm1mY19kc3RfYnVmc1tidWYuaW5kZXhdWzBdOworICAgICAgICBwQ1RYLT5kZWNPdXRJbmZvLkNWaXJBZGRyID0gcENUWC0+djRsMl9kZWMubWZjX2RzdF9idWZzW2J1Zi5pbmRleF1bMV07CisKKyAgICAgICAgcENUWC0+ZGVjT3V0SW5mby5ZUGh5QWRkciA9ICh1bnNpZ25lZCBpbnQpcENUWC0+djRsMl9kZWMubWZjX2RzdF9waHlzW2J1Zi5pbmRleF1bMF07CisgICAgICAgIHBDVFgtPmRlY091dEluZm8uQ1BoeUFkZHIgPSAodW5zaWduZWQgaW50KXBDVFgtPnY0bDJfZGVjLm1mY19kc3RfcGh5c1tidWYuaW5kZXhdWzFdOworICAgIH0KKworICAgIHBDVFgtPmRlY091dEluZm8uZGlzcF9waWNfZnJhbWVfdHlwZSA9IChidWYuZmxhZ3MgJiAoMHg3IDw8IDMpKTsKKworICAgIHN3aXRjaCAocENUWC0+ZGVjT3V0SW5mby5kaXNwX3BpY19mcmFtZV90eXBlKSB7CisgICAgY2FzZSBWNEwyX0JVRl9GTEFHX0tFWUZSQU1FOgorICAgICAgICBwQ1RYLT5kZWNPdXRJbmZvLmRpc3BfcGljX2ZyYW1lX3R5cGUgPSAxOworICAgICAgICBicmVhazsKKyAgICBjYXNlIFY0TDJfQlVGX0ZMQUdfUEZSQU1FOgorICAgICAgICBwQ1RYLT5kZWNPdXRJbmZvLmRpc3BfcGljX2ZyYW1lX3R5cGUgPSAyOworICAgICAgICBicmVhazsKKyAgICBjYXNlIFY0TDJfQlVGX0ZMQUdfQkZSQU1FOgorICAgICAgICBwQ1RYLT5kZWNPdXRJbmZvLmRpc3BfcGljX2ZyYW1lX3R5cGUgPSAzOworICAgICAgICBicmVhazsKKyAgICBkZWZhdWx0OgorICAgICAgICBwQ1RYLT5kZWNPdXRJbmZvLmRpc3BfcGljX2ZyYW1lX3R5cGUgPSAwOworICAgICAgICBicmVhazsKKyAgICB9CisKKyAgICByZXQgPSB2NGwyX21mY19xYnVmKHBDVFgtPmhNRkMsICZidWYsIFY0TDJfQlVGX1RZUEVfVklERU9fQ0FQVFVSRV9NUExBTkUsIFY0TDJfTUVNT1JZX01NQVAsCisgICAgICAgICAgICAgICAgICAgICAgICBidWYuaW5kZXgsIHBsYW5lcywgMCk7CisKKyAgICByZXR1cm4gU3NiU2lwTWZjRGVjR2V0T3V0QnVmKHBDVFgsIG91dHB1dF9pbmZvKTsKK30KKwordm9pZCAgKlNzYlNpcE1mY0RlY0dldEluQnVmKHZvaWQgKm9wZW5IYW5kbGUsIHZvaWQgKipwaHlJbkJ1ZiwgaW50IGlucHV0QnVmZmVyU2l6ZSkKK3sKKyAgICBfTUZDTElCICpwQ1RYOworICAgIGludCBpOworCisgICAgaWYgKG9wZW5IYW5kbGUgPT0gTlVMTCkgeworICAgICAgICBMT0dFKCJbJXNdIG9wZW5IYW5kbGUgaXMgTlVMTCIsX19mdW5jX18pOworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisKKyAgICBpZiAoKGlucHV0QnVmZmVyU2l6ZSA8IDApIHx8IChpbnB1dEJ1ZmZlclNpemUgPiBNQVhfREVDT0RFUl9JTlBVVF9CVUZGRVJfU0laRSkpIHsKKyAgICAgICAgTE9HRSgiWyVzXSBpbnB1dEJ1ZmZlclNpemUgPSAlZCBpcyBpbnZhbGlkIixfX2Z1bmNfXywgaW5wdXRCdWZmZXJTaXplKTsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorCisgICAgcENUWCAgPSAoX01GQ0xJQiAqKSBvcGVuSGFuZGxlOworCisgICAgZm9yIChpID0gMDsgaSA8IE1GQ19ERUNfTlVNX1NSQ19CVUZTOyBpKyspCisgICAgICAgIGlmIChCVUZfREVRVUVVRUQgPT0gcENUWC0+djRsMl9kZWMubWZjX3NyY19idWZfZmxhZ3NbaV0pCisgICAgICAgICAgICBicmVhazsKKworICAgIGlmIChpID09IE1GQ19ERUNfTlVNX1NSQ19CVUZTKSB7CisgICAgICAgIExPR1YoIlslc10gTm8gYnVmZmVyIGlzIGF2YWlsYWJsZS4iLF9fZnVuY19fKTsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfSBlbHNlIHsKKyAgICAgICAgcENUWC0+dmlyU3RybUJ1ZiA9ICh1bnNpZ25lZCBpbnQpcENUWC0+djRsMl9kZWMubWZjX3NyY19idWZzW2ldOworICAgICAgICBwQ1RYLT52NGwyX2RlYy5iZWluZ1VzZWRJbmRleCA9IGk7CisgICAgICAgIC8qIFNldCB0aGUgYnVmZmVyIGZsYWcgYXMgRW5xdWV1ZWQgZm9yIE5CX21vZGVfcHJvY2VzcyovCisgICAgICAgIC8qIEZJWE1FOiBDaGVjayB0aGlzIGFzc2lnbm1lbnQgaW4gY2FzZSBvZiB1c2luZyBOZXcgQVBJIEV4ZU5iKCkgKi8KKyAgICAgICAgcENUWC0+djRsMl9kZWMubWZjX3NyY19idWZfZmxhZ3NbaV0gPSBCVUZfRU5RVUVVRUQ7CisgICAgfQorCisgICAgcmV0dXJuICh2b2lkICopcENUWC0+dmlyU3RybUJ1ZjsKK30KKworU1NCU0lQX01GQ19FUlJPUl9DT0RFIFNzYlNpcE1mY0RlY1NldEluQnVmKHZvaWQgKm9wZW5IYW5kbGUsIHZvaWQgKnBoeUluQnVmLCB2b2lkICp2aXJJbkJ1ZiwgaW50IHNpemUpCit7CisgICAgX01GQ0xJQiAqcENUWDsKKyAgICBpbnQgaTsKKworICAgIExPR1YoIlslc10gRW50ZXIiLF9fZnVuY19fKTsKKyAgICBpZiAob3BlbkhhbmRsZSA9PSBOVUxMKSB7CisgICAgICAgIExPR0UoIlslc10gb3BlbkhhbmRsZSBpcyBOVUxMIixfX2Z1bmNfXyk7CisgICAgICAgIHJldHVybiBNRkNfUkVUX0lOVkFMSURfUEFSQU07CisgICAgfQorCisgICAgcENUWCAgPSAoX01GQ0xJQiAqKSBvcGVuSGFuZGxlOworCisgICAgZm9yIChpID0gMDsgaSA8IE1GQ19ERUNfTlVNX1NSQ19CVUZTOyBpKyspIHsKKyAgICAgICAgaWYgKHBDVFgtPnY0bDJfZGVjLm1mY19zcmNfYnVmc1tpXSA9PSB2aXJJbkJ1ZikKKyAgICAgICAgICAgIGJyZWFrOworICAgIH0KKworICAgIGlmIChpID09IE1GQ19ERUNfTlVNX1NSQ19CVUZTKSB7CisgICAgICAgIExPR0UoIlslc10gQ2FuIG5vdCB1c2UgdGhlIGJ1ZmZlciIsX19mdW5jX18pOworICAgICAgICByZXR1cm4gTUZDX1JFVF9JTlZBTElEX1BBUkFNOworICAgIH0gZWxzZSB7CisgICAgICAgIHBDVFgtPnZpclN0cm1CdWYgPSAodW5zaWduZWQgaW50KXZpckluQnVmOworICAgICAgICBwQ1RYLT52NGwyX2RlYy5iZWluZ1VzZWRJbmRleCA9IGk7CisgICAgICAgIHBDVFgtPnY0bDJfZGVjLm1mY19zcmNfYnVmX2ZsYWdzW2ldID0gQlVGX0VOUVVFVUVEOworICAgIH0KKyAgICBMT0dWKCJbJXNdIEV4aXQgaWR4ICVkIixfX2Z1bmNfXyxwQ1RYLT52NGwyX2RlYy5iZWluZ1VzZWRJbmRleCk7CisgICAgcmV0dXJuIE1GQ19SRVRfT0s7Cit9CisKK1NTQlNJUF9NRkNfREVDX09VVEJVRl9TVEFUVVMgU3NiU2lwTWZjRGVjR2V0T3V0QnVmKHZvaWQgKm9wZW5IYW5kbGUsIFNTQlNJUF9NRkNfREVDX09VVFBVVF9JTkZPICpvdXRwdXRfaW5mbykKK3sKKyAgICBfTUZDTElCICpwQ1RYOworCisgICAgaWYgKG9wZW5IYW5kbGUgPT0gTlVMTCkgeworICAgICAgICBMT0dFKCJbJXNdIG9wZW5IYW5kbGUgaXMgTlVMTCIsX19mdW5jX18pOworICAgICAgICByZXR1cm4gTUZDX0dFVE9VVEJVRl9ESVNQTEFZX0VORDsKKyAgICB9CisKKyAgICBwQ1RYICA9IChfTUZDTElCICopIG9wZW5IYW5kbGU7CisKKyAgICBvdXRwdXRfaW5mby0+WVBoeUFkZHIgPSBwQ1RYLT5kZWNPdXRJbmZvLllQaHlBZGRyOworICAgIG91dHB1dF9pbmZvLT5DUGh5QWRkciA9IHBDVFgtPmRlY091dEluZm8uQ1BoeUFkZHI7CisKKyAgICBvdXRwdXRfaW5mby0+WVZpckFkZHIgPSBwQ1RYLT5kZWNPdXRJbmZvLllWaXJBZGRyOworICAgIG91dHB1dF9pbmZvLT5DVmlyQWRkciA9IHBDVFgtPmRlY091dEluZm8uQ1ZpckFkZHI7CisKKyAgICBvdXRwdXRfaW5mby0+aW1nX3dpZHRoID0gcENUWC0+ZGVjT3V0SW5mby5pbWdfd2lkdGg7CisgICAgb3V0cHV0X2luZm8tPmltZ19oZWlnaHQ9IHBDVFgtPmRlY091dEluZm8uaW1nX2hlaWdodDsKKworICAgIG91dHB1dF9pbmZvLT5idWZfd2lkdGggPSBwQ1RYLT5kZWNPdXRJbmZvLmJ1Zl93aWR0aDsKKyAgICBvdXRwdXRfaW5mby0+YnVmX2hlaWdodD0gcENUWC0+ZGVjT3V0SW5mby5idWZfaGVpZ2h0OworCisgICAgb3V0cHV0X2luZm8tPmNyb3BfcmlnaHRfb2Zmc2V0ID0gIHBDVFgtPmRlY091dEluZm8uY3JvcF9yaWdodF9vZmZzZXQ7CisgICAgb3V0cHV0X2luZm8tPmNyb3BfbGVmdF9vZmZzZXQgPSAgcENUWC0+ZGVjT3V0SW5mby5jcm9wX2xlZnRfb2Zmc2V0OworICAgIG91dHB1dF9pbmZvLT5jcm9wX2JvdHRvbV9vZmZzZXQgPSBwQ1RYLT5kZWNPdXRJbmZvLmNyb3BfYm90dG9tX29mZnNldDsKKyAgICBvdXRwdXRfaW5mby0+Y3JvcF90b3Bfb2Zmc2V0ID0gcENUWC0+ZGVjT3V0SW5mby5jcm9wX3RvcF9vZmZzZXQ7CisKKyAgICBvdXRwdXRfaW5mby0+ZGlzcF9waWNfZnJhbWVfdHlwZSA9IHBDVFgtPmRlY091dEluZm8uZGlzcF9waWNfZnJhbWVfdHlwZTsKKworICAgIHN3aXRjaCAocENUWC0+ZGlzcGxheVN0YXR1cykgeworICAgIGNhc2UgTUZDX0dFVE9VVEJVRl9ESVNQTEFZX09OTFk6CisgICAgY2FzZSBNRkNfR0VUT1VUQlVGX0RJU1BMQVlfREVDT0RJTkc6CisgICAgY2FzZSBNRkNfR0VUT1VUQlVGX0RJU1BMQVlfRU5EOgorICAgIGNhc2UgTUZDX0dFVE9VVEJVRl9ERUNPRElOR19PTkxZOgorICAgIGNhc2UgTUZDX0dFVE9VVEJVRl9DSEFOR0VfUkVTT0w6CisgICAgICAgIGJyZWFrOworICAgIGRlZmF1bHQ6CisgICAgICAgIHJldHVybiBNRkNfR0VUT1VUQlVGX0RJU1BMQVlfRU5EOworICAgIH0KKworICAgIHJldHVybiBwQ1RYLT5kaXNwbGF5U3RhdHVzOworfQorCitTU0JTSVBfTUZDX0VSUk9SX0NPREUgU3NiU2lwTWZjRGVjU2V0Q29uZmlnKHZvaWQgKm9wZW5IYW5kbGUsIFNTQlNJUF9NRkNfREVDX0NPTkYgY29uZl90eXBlLCB2b2lkICp2YWx1ZSkKK3sKKyAgICBpbnQgcmV0LCBpOworCisgICAgX01GQ0xJQiAqcENUWDsKKyAgICBzdHJ1Y3QgbWZjX2RlY19maW12MV9pbmZvICpmaW12MV9yZXM7CisKKyAgICBzdHJ1Y3QgdjRsMl9idWZmZXIgYnVmOworICAgIHN0cnVjdCB2NGwyX3BsYW5lIHBsYW5lc1tNRkNfREVDX05VTV9QTEFORVNdOworCisgICAgaW50IGlkLCBjdHJsX3ZhbHVlOworCisgICAgaWYgKG9wZW5IYW5kbGUgPT0gTlVMTCkgeworICAgICAgICBMT0dFKCJbJXNdIG9wZW5IYW5kbGUgaXMgTlVMTCIsX19mdW5jX18pOworICAgICAgICByZXR1cm4gTUZDX1JFVF9JTlZBTElEX1BBUkFNOworICAgIH0KKworICAgIGlmICgodmFsdWUgPT0gTlVMTCkgJiYgKE1GQ19ERUNfU0VUQ09ORl9JU19MQVNUX0ZSQU1FICE9Y29uZl90eXBlKSkgeworICAgICAgICBMT0dFKCJbJXNdIHZhbHVlIGlzIE5VTEwiLF9fZnVuY19fKTsKKyAgICAgICAgcmV0dXJuIE1GQ19SRVRfSU5WQUxJRF9QQVJBTTsKKyAgICB9CisKKyAgICBwQ1RYID0gKF9NRkNMSUIgKikgb3BlbkhhbmRsZTsKKworICAgIC8qIEZpcnN0LCBwcm9jZXNzIG5vbi1pb2N0bCBjYWxsaW5nIHNldHRpbmdzICovCisgICAgc3dpdGNoIChjb25mX3R5cGUpIHsKKyAgICBjYXNlIE1GQ19ERUNfU0VUQ09ORl9FWFRSQV9CVUZGRVJfTlVNOgorICAgICAgICBwQ1RYLT5kZWNfbnVtZXh0cmFkcGIgPSAqKCh1bnNpZ25lZCBpbnQgKikgdmFsdWUpOworICAgICAgICByZXR1cm4gTUZDX1JFVF9PSzsKKworICAgIGNhc2UgTUZDX0RFQ19TRVRDT05GX0ZJTVYxX1dJRFRIX0hFSUdIVDogLyogYmUgc2V0IGJlZm9yZSBjYWxsaW5nIFNzYlNpcE1mY0RlY0luaXQgKi8KKyAgICAgICAgIGZpbXYxX3JlcyA9IChzdHJ1Y3QgbWZjX2RlY19maW12MV9pbmZvICopdmFsdWU7CisgICAgICAgICBMT0dJKCJmaW12MS0+d2lkdGggID0gJWRcbiIsIGZpbXYxX3Jlcy0+d2lkdGgpOworICAgICAgICAgTE9HSSgiZmltdjEtPmhlaWdodCA9ICVkXG4iLCBmaW12MV9yZXMtPmhlaWdodCk7CisgICAgICAgICBwQ1RYLT5maW12MV9yZXMud2lkdGggID0gKGludCkoZmltdjFfcmVzLT53aWR0aCk7CisgICAgICAgICBwQ1RYLT5maW12MV9yZXMuaGVpZ2h0ID0gKGludCkoZmltdjFfcmVzLT5oZWlnaHQpOworICAgICAgICAgcmV0dXJuIE1GQ19SRVRfT0s7CisKKyAgICBjYXNlIE1GQ19ERUNfU0VUQ09ORl9JU19MQVNUX0ZSQU1FOgorICAgICAgICBpZiAoU1NCU0lQX01GQ19MQVNUX0ZSQU1FX1BST0NFU1NFRCAhPSBwQ1RYLT5sYXN0ZnJhbWUpIHsKKyAgICAgICAgICAgIHBDVFgtPmxhc3RmcmFtZSA9IFNTQlNJUF9NRkNfTEFTVF9GUkFNRV9SRUNFSVZFRDsKKyAgICAgICAgICAgIHJldHVybiBNRkNfUkVUX09LOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgcmV0dXJuIE1GQ19SRVRfRkFJTDsKKyAgICAgICAgfQorCisgICAgY2FzZSBNRkNfREVDX1NFVENPTkZfRFBCX0ZMVVNIOgorICAgICAgICByZXQgPSB2NGwyX21mY19zdHJlYW1vZmYocENUWC0+aE1GQywgVjRMMl9CVUZfVFlQRV9WSURFT19DQVBUVVJFX01QTEFORSk7CisgICAgICAgIGlmIChyZXQgIT0gMCkgeworICAgICAgICAgICAgTE9HRSgiWyVzXSBWSURJT0NfU1RSRUFNT0ZGIGZhaWxlZCAoZGVzdGluYXRpb24gYnVmZmVycykiLF9fZnVuY19fKTsKKyAgICAgICAgICAgIHJldHVybiBNRkNfUkVUX0RFQ19TRVRfQ09ORl9GQUlMOworICAgICAgICB9CisgICAgICAgIHBDVFgtPmludGVyX2J1ZmZfc3RhdHVzICY9IH4oTUZDX1VTRV9EU1RfU1RSRUFNT04pOworCisgICAgICAgIGZvciAoaSA9IDA7ICBpIDwgcENUWC0+djRsMl9kZWMubWZjX251bV9kc3RfYnVmczsgKytpKSB7CisgICAgICAgICAgICByZXQgPSB2NGwyX21mY19xYnVmKHBDVFgtPmhNRkMsICZidWYsIFY0TDJfQlVGX1RZUEVfVklERU9fQ0FQVFVSRV9NUExBTkUsCisgICAgICAgICAgICAgICAgICAgICAgICBWNEwyX01FTU9SWV9NTUFQLCBpLCBwbGFuZXMsIDApOworICAgICAgICAgICAgaWYgKHJldCAhPSAwKSB7CisgICAgICAgICAgICAgICAgTE9HRSgiWyVzXSBWSURJT0NfUUJVRiBmYWlsZWQsIFY0TDJfQlVGX1RZUEVfVklERU9fQ0FQVFVSRV9NUExBTkUiLF9fZnVuY19fKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gTUZDX1JFVF9ERUNfU0VUX0NPTkZfRkFJTDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIHJldCA9IHY0bDJfbWZjX3N0cmVhbW9uKHBDVFgtPmhNRkMsIFY0TDJfQlVGX1RZUEVfVklERU9fQ0FQVFVSRV9NUExBTkUpOworICAgICAgICBpZiAocmV0ICE9IDApIHsKKyAgICAgICAgICAgIExPR0UoIlslc10gVklESU9DX1NUUkVBTU9OIGZhaWxlZCAoZGVzdGluYXRpb24gYnVmZmVycykiLF9fZnVuY19fKTsKKyAgICAgICAgICAgIHJldHVybiBNRkNfUkVUX0RFQ19TRVRfQ09ORl9GQUlMOworICAgICAgICB9CisgICAgICAgIHBDVFgtPmludGVyX2J1ZmZfc3RhdHVzIHw9IE1GQ19VU0VfRFNUX1NUUkVBTU9OOworICAgICAgICByZXR1cm4gTUZDX1JFVF9PSzsKKyAgICBkZWZhdWx0OgorICAgICAgICAvKiBPdGhlcnMgd2lsbCBiZSBwcm9jZXNzZWQgbmV4dCAqLworICAgICAgICBicmVhazsKKyAgICB9CisKKyAgICAvKiBQcm9jZXNzIGlvY3RsIGNhbGxpbmcgc2V0dGluZ3MgKi8KKyAgICBzd2l0Y2ggKGNvbmZfdHlwZSkgeworICAgIGNhc2UgTUZDX0RFQ19TRVRDT05GX0RJU1BMQVlfREVMQVk6IC8qIGJlIHNldCBiZWZvcmUgY2FsbGluZyBTc2JTaXBNZmNEZWNJbml0ICovCisgICAgICAgIGlkID0gVjRMMl9DSURfQ09ERUNfRElTUExBWV9ERUxBWTsKKyAgICAgICAgY3RybF92YWx1ZSA9ICooKHVuc2lnbmVkIGludCAqKSB2YWx1ZSk7CisgICAgICAgIGJyZWFrOworCisgICAgY2FzZSBNRkNfREVDX1NFVENPTkZfQ1JDX0VOQUJMRToKKyAgICAgICAgaWQgPSBWNEwyX0NJRF9DT0RFQ19DUkNfRU5BQkxFOworICAgICAgICBjdHJsX3ZhbHVlID0gMTsKKyAgICAgICAgYnJlYWs7CisKKyAgICBjYXNlIE1GQ19ERUNfU0VUQ09ORl9TTElDRV9FTkFCTEU6CisgICAgICAgIGlkID0gVjRMMl9DSURfQ09ERUNfU0xJQ0VfSU5URVJGQUNFOworICAgICAgICBjdHJsX3ZhbHVlID0gMTsKKyAgICAgICAgYnJlYWs7CisKKyAgICBjYXNlIE1GQ19ERUNfU0VUQ09ORl9GUkFNRV9UQUc6IC8qYmUgc2V0IGJlZm9yZSBjYWxsaW5nIFNzYlNpcE1mY0RlY0V4ZSAqLworICAgICAgICBpZCA9IFY0TDJfQ0lEX0NPREVDX0ZSQU1FX1RBRzsKKyAgICAgICAgY3RybF92YWx1ZSA9ICooKHVuc2lnbmVkIGludCopdmFsdWUpOworICAgICAgICBicmVhazsKKworICAgIGNhc2UgTUZDX0RFQ19TRVRDT05GX1BPU1RfRU5BQkxFOgorICAgICAgICBpZCA9IFY0TDJfQ0lEX0NPREVDX0xPT1BfRklMVEVSX01QRUc0X0VOQUJMRTsKKyAgICAgICAgY3RybF92YWx1ZSA9ICooKHVuc2lnbmVkIGludCopdmFsdWUpOworICAgICAgICBicmVhazsKKyNpZmRlZiBTM0RfU1VQUE9SVAorICAgIGNhc2UgTUZDX0RFQ19TRVRDT05GX1NFSV9QQVJTRToKKyAgICAgICAgaWQgPSBWNEwyX0NJRF9DT0RFQ19GUkFNRV9QQUNLX1NFSV9QQVJTRTsKKyAgICAgICAgY3RybF92YWx1ZSA9IDE7CisgICAgICAgIGJyZWFrOworI2VuZGlmCisgICAgZGVmYXVsdDoKKyAgICAgICAgTE9HRSgiWyVzXSBjb25mX3R5cGUoJWQpIGlzIE5PVCBzdXBwb3J0ZWQiLF9fZnVuY19fLCBjb25mX3R5cGUpOworICAgICAgICByZXR1cm4gTUZDX1JFVF9JTlZBTElEX1BBUkFNOworICAgIH0KKworICAgIHJldCA9IHY0bDJfbWZjX3NfY3RybChwQ1RYLT5oTUZDLCBpZCwgY3RybF92YWx1ZSk7CisgICAgaWYgKHJldCAhPSAwKSB7CisgICAgICAgIExPR0UoIlslc10gVklESU9DX1NfQ1RSTCBmYWlsZWQgKGNvbmZfdHlwZSA9ICVkKSIsX19mdW5jX18sIGNvbmZfdHlwZSk7CisgICAgICAgIHJldHVybiBNRkNfUkVUX0RFQ19TRVRfQ09ORl9GQUlMOworICAgIH0KKworICAgIHJldHVybiBNRkNfUkVUX09LOworfQorCitTU0JTSVBfTUZDX0VSUk9SX0NPREUgU3NiU2lwTWZjRGVjR2V0Q29uZmlnKHZvaWQgKm9wZW5IYW5kbGUsIFNTQlNJUF9NRkNfREVDX0NPTkYgY29uZl90eXBlLCB2b2lkICp2YWx1ZSkKK3sKKyAgICBfTUZDTElCICpwQ1RYOworCisgICAgU1NCU0lQX01GQ19JTUdfUkVTT0xVVElPTiAqaW1nX3Jlc29sdXRpb247CisgICAgaW50IHJldDsKKyAgICBTU0JTSVBfTUZDX0NSQ19EQVRBICpjcmNfZGF0YTsKKyNpZmRlZiBTM0RfU1VQUE9SVAorICAgIFNTQlNJUF9NRkNfRlJBTUVfUEFDS0lORyAqZnJhbWVfcGFja2luZzsKKyAgICBzdHJ1Y3QgbWZjX2ZyYW1lX3BhY2tfc2VpX2luZm8gc2VpX2luZm87CisjZW5kaWYKKyAgICBTU0JTSVBfTUZDX0NST1BfSU5GT1JNQVRJT04gKmNyb3BfaW5mb3JtYXRpb247CisKKyAgICBpZiAob3BlbkhhbmRsZSA9PSBOVUxMKSB7CisgICAgICAgIExPR0UoIlslc10gb3BlbkhhbmRsZSBpcyBOVUxMIixfX2Z1bmNfXyk7CisgICAgICAgIHJldHVybiBNRkNfUkVUX0lOVkFMSURfUEFSQU07CisgICAgfQorCisgICAgaWYgKHZhbHVlID09IE5VTEwpIHsKKyAgICAgICAgTE9HRSgiWyVzXSB2YWx1ZSBpcyBOVUxMIixfX2Z1bmNfXyk7CisgICAgICAgIHJldHVybiBNRkNfUkVUX0lOVkFMSURfUEFSQU07CisgICAgfQorCisgICAgcENUWCA9IChfTUZDTElCICopIG9wZW5IYW5kbGU7CisKKyAgICBzd2l0Y2ggKGNvbmZfdHlwZSkgeworICAgIGNhc2UgTUZDX0RFQ19HRVRDT05GX0JVRl9XSURUSF9IRUlHSFQ6CisgICAgICAgIGltZ19yZXNvbHV0aW9uID0gKFNTQlNJUF9NRkNfSU1HX1JFU09MVVRJT04gKil2YWx1ZTsKKyAgICAgICAgaW1nX3Jlc29sdXRpb24tPndpZHRoID0gcENUWC0+ZGVjT3V0SW5mby5pbWdfd2lkdGg7CisgICAgICAgIGltZ19yZXNvbHV0aW9uLT5oZWlnaHQgPSBwQ1RYLT5kZWNPdXRJbmZvLmltZ19oZWlnaHQ7CisgICAgICAgIGltZ19yZXNvbHV0aW9uLT5idWZfd2lkdGggPSBwQ1RYLT5kZWNPdXRJbmZvLmJ1Zl93aWR0aDsKKyAgICAgICAgaW1nX3Jlc29sdXRpb24tPmJ1Zl9oZWlnaHQgPSBwQ1RYLT5kZWNPdXRJbmZvLmJ1Zl9oZWlnaHQ7CisgICAgICAgIGJyZWFrOworCisgICAgY2FzZSBNRkNfREVDX0dFVENPTkZfRlJBTUVfVEFHOgorICAgICAgICByZXQgPSB2NGwyX21mY19nX2N0cmwocENUWC0+aE1GQywgVjRMMl9DSURfQ09ERUNfRlJBTUVfVEFHLCAoaW50Kil2YWx1ZSk7CisgICAgICAgIGlmIChyZXQgIT0gMCkKKyAgICAgICAgICAgIExPR0UoIlslc10gVklESU9DX0dfQ1RSTCBmYWlsZWQsIFY0TDJfQ0lEX0NPREVDX0ZSQU1FX1RBRyIsIF9fZnVuY19fKTsKKyAgICAgICAgYnJlYWs7CisKKyAgICBjYXNlIE1GQ19ERUNfR0VUQ09ORl9DUkNfREFUQToKKyAgICAgICAgY3JjX2RhdGEgPSAoU1NCU0lQX01GQ19DUkNfREFUQSAqKSB2YWx1ZTsKKworICAgICAgICByZXQgPSB2NGwyX21mY19nX2N0cmwocENUWC0+aE1GQywgVjRMMl9DSURfQ09ERUNfQ1JDX0RBVEFfTFVNQSwgJmNyY19kYXRhLT5sdW1hMCk7CisgICAgICAgIGlmIChyZXQgIT0gMCkgeworICAgICAgICAgICAgTE9HRSgiWyVzXSBWSURJT0NfR19DVFJMIGZhaWxlZCwgVjRMMl9DSURfQ09ERUNfQ1JDX0RBVEFfTFVNQSIsX19mdW5jX18pOworICAgICAgICAgICAgcmV0dXJuIE1GQ19SRVRfREVDX0dFVF9DT05GX0ZBSUw7CisgICAgICAgIH0KKworICAgICAgICByZXQgPSB2NGwyX21mY19nX2N0cmwocENUWC0+aE1GQywgVjRMMl9DSURfQ09ERUNfQ1JDX0RBVEFfQ0hST01BLCAmY3JjX2RhdGEtPmNocm9tYTApOworICAgICAgICBpZiAocmV0ICE9IDApIHsKKyAgICAgICAgICAgIExPR0UoIlslc10gVklESU9DX0dfQ1RSTCBmYWlsZWQsIFY0TDJfQ0lEX0NPREVDX0NSQ19EQVRBX0NIUk9NQSIsX19mdW5jX18pOworICAgICAgICAgICAgcmV0dXJuIE1GQ19SRVRfREVDX0dFVF9DT05GX0ZBSUw7CisgICAgICAgIH0KKyAgICAgICAgTE9HSSgiWyVzXSBjcmNfZGF0YS0+bHVtYTA9MHgleFxuIiwgX19mdW5jX18sIGNyY19kYXRhLT5sdW1hMCk7CisgICAgICAgIExPR0koIlslc10gY3JjX2RhdGEtPmNocm9tYTA9MHgleFxuIiwgX19mdW5jX18sIGNyY19kYXRhLT5jaHJvbWEwKTsKKyAgICAgICAgYnJlYWs7CisjaWZkZWYgUzNEX1NVUFBPUlQKKyAgICBjYXNlIE1GQ19ERUNfR0VUQ09ORl9GUkFNRV9QQUNLSU5HOgorICAgICAgICBmcmFtZV9wYWNraW5nID0gKFNTQlNJUF9NRkNfRlJBTUVfUEFDS0lORyAqKXZhbHVlOworCisgICAgICAgIHJldCA9IHY0bDJfbWZjX2V4dF9nX2N0cmwocENUWC0+aE1GQywgY29uZl90eXBlLCAmc2VpX2luZm8pOworICAgICAgICBpZiAocmV0ICE9IDApIHsKKyAgICAgICAgICAgIHByaW50ZigiRXJyb3IgdG8gZG8gZXh0X2dfY3RybC5cbiIpOworICAgICAgICB9CisgICAgICAgIGZyYW1lX3BhY2tpbmctPmF2YWlsYWJsZSA9IHNlaV9pbmZvLnNlaV9hdmFpbDsKKyAgICAgICAgZnJhbWVfcGFja2luZy0+YXJyYW5nZW1lbnRfaWQgPSBzZWlfaW5mby5hcnJnbWVudF9pZDsKKworICAgICAgICBmcmFtZV9wYWNraW5nLT5hcnJhbmdlbWVudF9jYW5jZWxfZmxhZyA9IE9QRVJBVEVfQklUKHNlaV9pbmZvLnNlaV9pbmZvLCAweDEsIDApOworICAgICAgICBmcmFtZV9wYWNraW5nLT5hcnJhbmdlbWVudF90eXBlID0gT1BFUkFURV9CSVQoc2VpX2luZm8uc2VpX2luZm8sIDB4M2YsIDEpOworICAgICAgICBmcmFtZV9wYWNraW5nLT5xdWluY3VueF9zYW1wbGluZ19mbGFnID0gT1BFUkFURV9CSVQoc2VpX2luZm8uc2VpX2luZm8sIDB4MSwgOCk7CisgICAgICAgIGZyYW1lX3BhY2tpbmctPmNvbnRlbnRfaW50ZXJwcmV0YXRpb25fdHlwZSA9IE9QRVJBVEVfQklUKHNlaV9pbmZvLnNlaV9pbmZvLCAweDNmLCA5KTsKKyAgICAgICAgZnJhbWVfcGFja2luZy0+c3BhdGlhbF9mbGlwcGluZ19mbGFnID0gT1BFUkFURV9CSVQoc2VpX2luZm8uc2VpX2luZm8sIDB4MSwgMTUpOworICAgICAgICBmcmFtZV9wYWNraW5nLT5mcmFtZTBfZmxpcHBlZF9mbGFnID0gT1BFUkFURV9CSVQoc2VpX2luZm8uc2VpX2luZm8sIDB4MSwgMTYpOworICAgICAgICBmcmFtZV9wYWNraW5nLT5maWVsZF92aWV3c19mbGFnID0gT1BFUkFURV9CSVQoc2VpX2luZm8uc2VpX2luZm8sIDB4MSwgMTcpOworICAgICAgICBmcmFtZV9wYWNraW5nLT5jdXJyZW50X2ZyYW1lX2lzX2ZyYW1lMF9mbGFnID0gT1BFUkFURV9CSVQoc2VpX2luZm8uc2VpX2luZm8sIDB4MSwgMTgpOworCisgICAgICAgIGZyYW1lX3BhY2tpbmctPmZyYW1lMF9ncmlkX3Bvc194ID0gT1BFUkFURV9CSVQoc2VpX2luZm8uc2VpX2luZm8sIDB4ZiwgMCk7CisgICAgICAgIGZyYW1lX3BhY2tpbmctPmZyYW1lMF9ncmlkX3Bvc195ID0gT1BFUkFURV9CSVQoc2VpX2luZm8uc2VpX2luZm8sIDB4ZiwgNCk7CisgICAgICAgIGZyYW1lX3BhY2tpbmctPmZyYW1lMV9ncmlkX3Bvc194ID0gT1BFUkFURV9CSVQoc2VpX2luZm8uc2VpX2luZm8sIDB4ZiwgOCk7CisgICAgICAgIGZyYW1lX3BhY2tpbmctPmZyYW1lMV9ncmlkX3Bvc195ID0gT1BFUkFURV9CSVQoc2VpX2luZm8uc2VpX2luZm8sIDB4ZiwgMTIpOworICAgICAgICBicmVhazsKKyNlbmRpZgorICAgIGNhc2UgTUZDX0RFQ19HRVRDT05GX0NST1BfSU5GTzoKKyAgICAgICAgY3JvcF9pbmZvcm1hdGlvbiA9IChTU0JTSVBfTUZDX0NST1BfSU5GT1JNQVRJT04gKil2YWx1ZTsKKyAgICAgICAgY3JvcF9pbmZvcm1hdGlvbi0+Y3JvcF90b3Bfb2Zmc2V0ID0gcENUWC0+ZGVjT3V0SW5mby5jcm9wX3RvcF9vZmZzZXQ7CisgICAgICAgIGNyb3BfaW5mb3JtYXRpb24tPmNyb3BfYm90dG9tX29mZnNldCA9IHBDVFgtPmRlY091dEluZm8uY3JvcF9ib3R0b21fb2Zmc2V0OworICAgICAgICBjcm9wX2luZm9ybWF0aW9uLT5jcm9wX2xlZnRfb2Zmc2V0ID0gcENUWC0+ZGVjT3V0SW5mby5jcm9wX2xlZnRfb2Zmc2V0OworICAgICAgICBjcm9wX2luZm9ybWF0aW9uLT5jcm9wX3JpZ2h0X29mZnNldCA9IHBDVFgtPmRlY091dEluZm8uY3JvcF9yaWdodF9vZmZzZXQ7CisgICAgICAgIGJyZWFrOworCisgICAgZGVmYXVsdDoKKyAgICAgICAgTE9HRSgiWyVzXSBjb25mX3R5cGUoJWQpIGlzIE5PVCBzdXBwb3J0ZWQiLF9fZnVuY19fLCBjb25mX3R5cGUpOworICAgICAgICByZXR1cm4gTUZDX1JFVF9JTlZBTElEX1BBUkFNOworICAgIH0KKworICAgIHJldHVybiBNRkNfUkVUX09LOworfQpkaWZmIC0tZ2l0IGEvZXh5bm9zNC9tdWx0aW1lZGlhL2NvZGVjcy9zZWNfY29kZWNzL3ZpZGVvL2V4eW5vczUvbWZjX3Y0bDIvZW5jL3NyYy9Tc2JTaXBNZmNFbmNBUEkuYyBiL2V4eW5vczQvbXVsdGltZWRpYS9jb2RlY3Mvc2VjX2NvZGVjcy92aWRlby9leHlub3M1L21mY192NGwyL2VuYy9zcmMvU3NiU2lwTWZjRW5jQVBJLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjMzM2I2YwotLS0gL2Rldi9udWxsCisrKyBiL2V4eW5vczQvbXVsdGltZWRpYS9jb2RlY3Mvc2VjX2NvZGVjcy92aWRlby9leHlub3M1L21mY192NGwyL2VuYy9zcmMvU3NiU2lwTWZjRW5jQVBJLmMKQEAgLTAsMCArMSwxNTA2IEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDEwIFNhbXN1bmcgRWxlY3Ryb25pY3MgQ28uLCBMdGQuCisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgPHN0ZGxpYi5oPgorI2luY2x1ZGUgPHVuaXN0ZC5oPgorI2luY2x1ZGUgPHN0cmluZy5oPgorI2luY2x1ZGUgPGZjbnRsLmg+CisKKyNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KKyNpbmNsdWRlIDxzeXMvc3RhdC5oPgorI2luY2x1ZGUgPHN5cy9pb2N0bC5oPgorI2luY2x1ZGUgPHN5cy9tbWFuLmg+CisKKyNpbmNsdWRlIDxzeXMvcG9sbC5oPgorI2luY2x1ZGUgInZpZGVvZGV2Mi5oIgorCisjaW5jbHVkZSAibWZjX2ludGVyZmFjZS5oIgorI2luY2x1ZGUgIlNzYlNpcE1mY0FwaS5oIgorCisvKiAjZGVmaW5lIExPR19OREVCVUcgMCAqLworI2RlZmluZSBMT0dfVEFHICJNRkNfRU5DX0FQUCIKKyNpbmNsdWRlIDx1dGlscy9Mb2cuaD4KKworI2RlZmluZSBQT0xMX0VOQ19XQUlUX1RJTUVPVVQgMjUKKworI2lmbmRlZiB0cnVlCisjZGVmaW5lIHRydWUgICgxKQorI2VuZGlmCisKKyNpZm5kZWYgZmFsc2UKKyNkZWZpbmUgZmFsc2UgKDApCisjZW5kaWYKKworI2RlZmluZSBNQVhfU1RSRUFNX1NJWkUgKDIqMTAyNCoxMDI0KQorCitzdGF0aWMgY2hhciAqbWZjX2Rldl9uYW1lID0gU0FNU1VOR19NRkNfREVWX05BTUU7CitzdGF0aWMgaW50IG1mY19kZXZfbm9kZSA9IDc7CisKKyNpZiBkZWZpbmVkIChNRkM1eF9WRVJTSU9OKQorI2RlZmluZSBIMjYzX0NUUkxfTlVNICAgMTkKKyNkZWZpbmUgTVBFRzRfQ1RSTF9OVU0gIDI3CisjZGVmaW5lIEgyNjRfQ1RSTF9OVU0gICA1MAorI2VsaWYgZGVmaW5lZCAoTUZDNnhfVkVSU0lPTikKKyNkZWZpbmUgSDI2M19DVFJMX05VTSAgIDIwCisjZGVmaW5lIE1QRUc0X0NUUkxfTlVNICAyOAorI2RlZmluZSBIMjY0X0NUUkxfTlVNICAgNjcKKyNlbmRpZgorCisKK3N0YXRpYyB2b2lkIGdldE1GQ05hbWUoY2hhciAqZGV2aWNlbmFtZSwgaW50IHNpemUpCit7CisgICAgc25wcmludGYoZGV2aWNlbmFtZSwgc2l6ZSwgIiVzJWQiLCBTQU1TVU5HX01GQ19ERVZfTkFNRSwgbWZjX2Rldl9ub2RlKTsKK30KKwordm9pZCBTc2JTaXBNZmNFbmNTZXRNRkNOYW1lKGNoYXIgKmRldmljZW5hbWUpCit7CisgICAgbWZjX2Rldl9uYW1lID0gZGV2aWNlbmFtZTsKK30KKwordm9pZCAqU3NiU2lwTWZjRW5jT3Blbih2b2lkKQoreworICAgIGludCBoTUZDT3BlbjsKKyAgICBfTUZDTElCICpwQ1RYOworCisgICAgY2hhciBtZmNfZGV2X25hbWVbNjRdOworCisgICAgaW50IHJldDsKKyAgICBzdHJ1Y3QgdjRsMl9jYXBhYmlsaXR5IGNhcDsKKworICAgIExPR0koIlslc10gTUZDIExpYnJhcnkgVmVyICVkLiUwMmQiLF9fZnVuY19fLCBNRkNfTElCX1ZFUl9NQUpPUiwgTUZDX0xJQl9WRVJfTUlOT1IpOworICAgIGdldE1GQ05hbWUobWZjX2Rldl9uYW1lLCA2NCk7CisgICAgTE9HSSgiWyVzXSBkZXYgbmFtZSBpcyAlc1xuIixfX2Z1bmNfXyxtZmNfZGV2X25hbWUpOworCisgICAgaWYgKGFjY2VzcyhtZmNfZGV2X25hbWUsIEZfT0spICE9IDApIHsKKyAgICAgICAgTE9HRSgiWyVzXSBNRkMgZGV2aWNlIG5vZGUgbm90IGV4aXN0cyIsX19mdW5jX18pOworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisKKyAgICBoTUZDT3BlbiA9IG9wZW4obWZjX2Rldl9uYW1lLCBPX1JEV1IgfCBPX05PTkJMT0NLLCAwKTsKKyAgICBpZiAoaE1GQ09wZW4gPCAwKSB7CisgICAgICAgIExPR0UoIlslc10gRmFpbGVkIHRvIG9wZW4gTUZDIGRldmljZSIsX19mdW5jX18pOworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisKKyAgICBwQ1RYID0gKF9NRkNMSUIgKiltYWxsb2Moc2l6ZW9mKF9NRkNMSUIpKTsKKyAgICBpZiAocENUWCA9PSBOVUxMKSB7CisgICAgICAgIExPR0UoIlslc10gbWFsbG9jIGZhaWxlZC4iLF9fZnVuY19fKTsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorICAgIG1lbXNldChwQ1RYLCAwLCBzaXplb2YoX01GQ0xJQikpOworCisgICAgcENUWC0+aE1GQyA9IGhNRkNPcGVuOworCisgICAgbWVtc2V0KCZjYXAsIDAsIHNpemVvZihjYXApKTsKKyAgICByZXQgPSBpb2N0bChwQ1RYLT5oTUZDLCBWSURJT0NfUVVFUllDQVAsICZjYXApOworICAgIGlmIChyZXQgIT0gMCkgeworICAgICAgICBMT0dFKCJbJXNdIFZJRElPQ19RVUVSWUNBUCBmYWlsZWQiLF9fZnVuY19fKTsKKyAgICAgICAgY2xvc2UocENUWC0+aE1GQyk7CisgICAgICAgIGZyZWUocENUWCk7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KKworICAgIGlmICghKGNhcC5jYXBhYmlsaXRpZXMgJiBWNEwyX0NBUF9WSURFT19DQVBUVVJFKSkgeworICAgICAgICBMT0dFKCJbJXNdIERldmljZSBkb2VzIG5vdCBzdXBwb3J0IGNhcHR1cmUiLF9fZnVuY19fKTsKKyAgICAgICAgY2xvc2UocENUWC0+aE1GQyk7CisgICAgICAgIGZyZWUocENUWCk7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KKworICAgIGlmICghKGNhcC5jYXBhYmlsaXRpZXMgJiBWNEwyX0NBUF9WSURFT19PVVRQVVQpKSB7CisgICAgICAgIExPR0UoIlslc10gRGV2aWNlIGRvZXMgbm90IHN1cHBvcnQgb3V0cHV0IixfX2Z1bmNfXyk7CisgICAgICAgIGNsb3NlKHBDVFgtPmhNRkMpOworICAgICAgICBmcmVlKHBDVFgpOworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisKKyAgICBpZiAoIShjYXAuY2FwYWJpbGl0aWVzICYgVjRMMl9DQVBfU1RSRUFNSU5HKSkgeworICAgICAgICBMT0dFKCJbJXNdIERldmljZSBkb2VzIG5vdCBzdXBwb3J0IHN0cmVhbWluZyIsX19mdW5jX18pOworICAgICAgICBjbG9zZShwQ1RYLT5oTUZDKTsKKyAgICAgICAgZnJlZShwQ1RYKTsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorCisgICAgcENUWC0+djRsMl9lbmMuYlJ1bm5pbmcgPSAwOworICAgIC8qIHBoeXNpY2FsIGFkZHJlc3MgaXMgdXNlZCBmb3IgSW5wdXQgc291cmNlICovCisgICAgcENUWC0+djRsMl9lbmMuYklucHV0UGh5VmlyID0gMTsKKworICAgIHBDVFgtPmNhY2hlYWJsZWJ1ZmZlciA9IE5PX0NBQ0hFOworCisgICAgcmV0dXJuICh2b2lkICopcENUWDsKK30KKwordm9pZCAqU3NiU2lwTWZjRW5jT3BlbkV4dCh2b2lkICp2YWx1ZSkKK3sKKyAgICBfTUZDTElCICpwQ1RYOworCisgICAgcENUWCA9IFNzYlNpcE1mY0VuY09wZW4oKTsKKyAgICBpZiAocENUWCA9PSBOVUxMKQorICAgICAgICByZXR1cm4gTlVMTDsKKworICAgIGlmIChOT19DQUNIRSA9PSAoKihTU0JJUF9NRkNfQlVGRkVSX1RZUEUgKil2YWx1ZSkpIHsKKyAgICAgICAgcENUWC0+Y2FjaGVhYmxlYnVmZmVyID0gTk9fQ0FDSEU7CisgICAgICAgIC8qIHBoeXNpY2FsIGFkZHJlc3MgaXMgdXNlZCBmb3IgSW5wdXQgc291cmNlICovCisgICAgICAgIHBDVFgtPnY0bDJfZW5jLmJJbnB1dFBoeVZpciA9IDE7CisgICAgICAgIExPR0koIlslc10gbm9uIGNhY2hlYWJsZSBidWZmZXIiLF9fZnVuY19fKTsKKyAgICB9CisgICAgZWxzZSB7CisgICAgICAgIHBDVFgtPmNhY2hlYWJsZWJ1ZmZlciA9IENBQ0hFOworICAgICAgICAvKiB2aXR1YWwgYWRkcmVzcyBpcyB1c2VkIGZvciBJbnB1dCBzb3VyY2UgKi8KKyAgICAgICAgcENUWC0+djRsMl9lbmMuYklucHV0UGh5VmlyID0gMDsKKyAgICAgICAgTE9HSSgiWyVzXSBjYWNoZWFibGUgYnVmZmVyIixfX2Z1bmNfXyk7CisgICAgfQorCisgICAgcmV0dXJuICh2b2lkICopcENUWDsKK30KKworU1NCU0lQX01GQ19FUlJPUl9DT0RFIFNzYlNpcE1mY0VuY0Nsb3NlKHZvaWQgKm9wZW5IYW5kbGUpCit7CisgICAgX01GQ0xJQiAqcENUWDsKKyAgICBpbnQgcmV0LCBpOworCisgICAgZW51bSB2NGwyX2J1Zl90eXBlIHR5cGU7CisKKyAgICBpZiAob3BlbkhhbmRsZSA9PSBOVUxMKSB7CisgICAgICAgIExPR0UoIlslc10gb3BlbkhhbmRsZSBpcyBOVUxMIixfX2Z1bmNfXyk7CisgICAgICAgIHJldHVybiBNRkNfUkVUX0lOVkFMSURfUEFSQU07CisgICAgfQorCisgICAgcENUWCA9IChfTUZDTElCICopIG9wZW5IYW5kbGU7CisKKyAgICBpZiAocENUWC0+aW50ZXJfYnVmZl9zdGF0dXMgJiBNRkNfVVNFX0RTVF9TVFJFQU1PTikgeworICAgICAgICB0eXBlID0gVjRMMl9CVUZfVFlQRV9WSURFT19DQVBUVVJFX01QTEFORTsKKyAgICAgICAgcmV0ID0gaW9jdGwocENUWC0+aE1GQywgVklESU9DX1NUUkVBTU9GRiwgJnR5cGUpOworICAgICAgICBpZiAocmV0ICE9IDApIHsKKyAgICAgICAgICAgIExPR0UoIlslc10gVklESU9DX1NUUkVBTU9GRiBmYWlsZWQgKGRlc3RpbmF0aW9uIGJ1ZmZlcnMpIixfX2Z1bmNfXyk7CisgICAgICAgICAgICByZXR1cm4gTUZDX1JFVF9DTE9TRV9GQUlMOworICAgICAgICB9CisgICAgICAgIHBDVFgtPmludGVyX2J1ZmZfc3RhdHVzICY9IH4oTUZDX1VTRV9EU1RfU1RSRUFNT04pOworICAgIH0KKworICAgIGlmIChwQ1RYLT5pbnRlcl9idWZmX3N0YXR1cyAmIE1GQ19VU0VfU1JDX1NUUkVBTU9OKSB7CisgICAgICAgIHR5cGUgPSBWNEwyX0JVRl9UWVBFX1ZJREVPX09VVFBVVF9NUExBTkU7CisgICAgICAgIHJldCA9IGlvY3RsKHBDVFgtPmhNRkMsIFZJRElPQ19TVFJFQU1PRkYsICZ0eXBlKTsKKyAgICAgICAgaWYgKHJldCAhPSAwKSB7CisgICAgICAgICAgICBMT0dFKCJbJXNdIFZJRElPQ19TVFJFQU1PRkYgZmFpbGVkIChzb3VyY2UgYnVmZmVycykiLF9fZnVuY19fKTsKKyAgICAgICAgICAgIHJldHVybiBNRkNfUkVUX0NMT1NFX0ZBSUw7CisgICAgICAgIH0KKyAgICAgICAgcENUWC0+aW50ZXJfYnVmZl9zdGF0dXMgJj0gfihNRkNfVVNFX1NSQ19TVFJFQU1PTik7CisgICAgfQorCisgICAgaWYgKCFwQ1RYLT52NGwyX2VuYy5iSW5wdXRQaHlWaXIpIHsKKyAgICAgICAgZm9yIChpID0gMDsgaSA8IHBDVFgtPnY0bDJfZW5jLm1mY19udW1fc3JjX2J1ZnM7IGkrKykgeworICAgICAgICAgICAgbXVubWFwKHBDVFgtPnY0bDJfZW5jLm1mY19zcmNfYnVmc1tpXVswXSwgcENUWC0+djRsMl9lbmMubWZjX3NyY19idWZzX2xlblswXSk7CisgICAgICAgICAgICBtdW5tYXAocENUWC0+djRsMl9lbmMubWZjX3NyY19idWZzW2ldWzFdLCBwQ1RYLT52NGwyX2VuYy5tZmNfc3JjX2J1ZnNfbGVuWzFdKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGZvciAoaSA9IDA7IGkgPCBwQ1RYLT52NGwyX2VuYy5tZmNfbnVtX2RzdF9idWZzOyBpKyspCisgICAgICAgIG11bm1hcChwQ1RYLT52NGwyX2VuYy5tZmNfZHN0X2J1ZnNbaV0sIHBDVFgtPnY0bDJfZW5jLm1mY19kc3RfYnVmc19sZW4pOworCisgICAgcENUWC0+aW50ZXJfYnVmZl9zdGF0dXMgPSBNRkNfVVNFX05PTkU7CisKKyAgICBjbG9zZShwQ1RYLT5oTUZDKTsKKworICAgIGZyZWUocENUWCk7CisKKyAgICByZXR1cm4gTUZDX1JFVF9PSzsKK30KKworU1NCU0lQX01GQ19FUlJPUl9DT0RFIFNzYlNpcE1mY0VuY0luaXQodm9pZCAqb3BlbkhhbmRsZSwgdm9pZCAqcGFyYW0pCit7CisgICAgaW50IHJldCwgaSwgaixpbmRleDsKKyAgICBfTUZDTElCICpwQ1RYOworCisgICAgZW51bSB2NGwyX2J1Zl90eXBlIHR5cGU7CisgICAgc3RydWN0IHY0bDJfZm9ybWF0IGZtdDsKKyAgICBzdHJ1Y3QgdjRsMl9wbGFuZSBwbGFuZXNbTUZDX0VOQ19OVU1fUExBTkVTXTsKKworICAgIHN0cnVjdCB2NGwyX2J1ZmZlciBidWY7CisgICAgc3RydWN0IHY0bDJfcmVxdWVzdGJ1ZmZlcnMgcmVxYnVmOworCisgICAgc3RydWN0IHY0bDJfY29udHJvbCBjdHJsOworCisgICAgc3RydWN0IHBvbGxmZCBwb2xsX2V2ZW50czsKKyAgICBpbnQgcG9sbF9zdGF0ZTsKKworICAgIHN0cnVjdCB2NGwyX2V4dF9jb250cm9sIGV4dF9jdHJsX21wZWc0W01QRUc0X0NUUkxfTlVNXTsKKyAgICBzdHJ1Y3QgdjRsMl9leHRfY29udHJvbCBleHRfY3RybF9oMjYzW0gyNjNfQ1RSTF9OVU1dOworICAgIHN0cnVjdCB2NGwyX2V4dF9jb250cm9sIGV4dF9jdHJsW0gyNjRfQ1RSTF9OVU1dOworICAgIHN0cnVjdCB2NGwyX2V4dF9jb250cm9scyBleHRfY3RybHM7CisKKyAgICBTU0JTSVBfTUZDX0VOQ19IMjY0X1BBUkFNICpoMjY0X2FyZzsKKyAgICBTU0JTSVBfTUZDX0VOQ19NUEVHNF9QQVJBTSAqbXBlZzRfYXJnOworICAgIFNTQlNJUF9NRkNfRU5DX0gyNjNfUEFSQU0gKmgyNjNfYXJnOworCisgICAgaWYgKG9wZW5IYW5kbGUgPT0gTlVMTCkKKyAgICAgICAgcmV0dXJuIE1GQ19SRVRfSU5WQUxJRF9QQVJBTTsKKworICAgIHBDVFggID0gKF9NRkNMSUIgKikgb3BlbkhhbmRsZTsKKworICAgIG1wZWc0X2FyZyA9IChTU0JTSVBfTUZDX0VOQ19NUEVHNF9QQVJBTSopcGFyYW07CisgICAgaWYgKG1wZWc0X2FyZy0+Y29kZWNUeXBlID09IE1QRUc0X0VOQykgeworICAgICAgICBwQ1RYLT5jb2RlY1R5cGU9IE1QRUc0X0VOQzsKKyAgICAgICAgcENUWC0+d2lkdGggPSBtcGVnNF9hcmctPlNvdXJjZVdpZHRoOworICAgICAgICBwQ1RYLT5oZWlnaHQgPSBtcGVnNF9hcmctPlNvdXJjZUhlaWdodDsKKyAgICAgICAgcENUWC0+ZnJhbWVtYXAgPSBtcGVnNF9hcmctPkZyYW1lTWFwOworICAgIH0gZWxzZSB7CisgICAgICAgIGgyNjNfYXJnID0gKFNTQlNJUF9NRkNfRU5DX0gyNjNfUEFSQU0qKXBhcmFtOworICAgICAgICBpZiAoaDI2M19hcmctPmNvZGVjVHlwZSA9PSBIMjYzX0VOQykgeworICAgICAgICAgICAgcENUWC0+Y29kZWNUeXBlID0gSDI2M19FTkM7CisgICAgICAgICAgICBwQ1RYLT53aWR0aCA9IGgyNjNfYXJnLT5Tb3VyY2VXaWR0aDsKKyAgICAgICAgICAgIHBDVFgtPmhlaWdodCA9IGgyNjNfYXJnLT5Tb3VyY2VIZWlnaHQ7CisgICAgICAgICAgICBwQ1RYLT5mcmFtZW1hcCA9IGgyNjNfYXJnLT5GcmFtZU1hcDsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIGgyNjRfYXJnID0gKFNTQlNJUF9NRkNfRU5DX0gyNjRfUEFSQU0qKXBhcmFtOworICAgICAgICAgICAgaWYgKGgyNjRfYXJnLT5jb2RlY1R5cGUgPT0gSDI2NF9FTkMpIHsKKyAgICAgICAgICAgICAgICBwQ1RYLT5jb2RlY1R5cGUgPSBIMjY0X0VOQzsKKyAgICAgICAgICAgICAgICBwQ1RYLT53aWR0aCA9IGgyNjRfYXJnLT5Tb3VyY2VXaWR0aDsKKyAgICAgICAgICAgICAgICBwQ1RYLT5oZWlnaHQgPSBoMjY0X2FyZy0+U291cmNlSGVpZ2h0OworICAgICAgICAgICAgICAgIHBDVFgtPmZyYW1lbWFwID0gaDI2NF9hcmctPkZyYW1lTWFwOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBMT0dFKCJbJXNdIFVuZGVmaW5lZCBjb2RlYyB0eXBlIFxuIixfX2Z1bmNfXyk7CisgICAgICAgICAgICAgICAgcmV0ID0gTUZDX1JFVF9JTlZBTElEX1BBUkFNOworICAgICAgICAgICAgICAgIGdvdG8gZXJyb3JfY2FzZTE7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICBzd2l0Y2ggKHBDVFgtPmNvZGVjVHlwZSkgeworICAgIGNhc2UgTVBFRzRfRU5DOgorICAgICAgICBleHRfY3RybF9tcGVnNFswXS5pZCA9IFY0TDJfQ0lEX0NPREVDX01GQzVYX0VOQ19NUEVHNF9QUk9GSUxFOworICAgICAgICBleHRfY3RybF9tcGVnNFswXS52YWx1ZSA9IG1wZWc0X2FyZy0+UHJvZmlsZUlEQzsKKyAgICAgICAgZXh0X2N0cmxfbXBlZzRbMV0uaWQgPSBWNEwyX0NJRF9DT0RFQ19NRkM1WF9FTkNfTVBFRzRfTEVWRUw7CisgICAgICAgIGV4dF9jdHJsX21wZWc0WzFdLnZhbHVlID0gbXBlZzRfYXJnLT5MZXZlbElEQzsKKyAgICAgICAgZXh0X2N0cmxfbXBlZzRbMl0uaWQgPSBWNEwyX0NJRF9DT0RFQ19NRkM1WF9FTkNfR09QX1NJWkU7CisgICAgICAgIGV4dF9jdHJsX21wZWc0WzJdLnZhbHVlID0gbXBlZzRfYXJnLT5JRFJQZXJpb2Q7CisgICAgICAgIGV4dF9jdHJsX21wZWc0WzNdLmlkID0gVjRMMl9DSURfQ09ERUNfTUZDNVhfRU5DX01QRUc0X1FVQVJURVJfUElYRUw7CisgICAgICAgIGV4dF9jdHJsX21wZWc0WzNdLnZhbHVlID0gbXBlZzRfYXJnLT5EaXNhYmxlUXBlbE1FOworCisgICAgICAgIGV4dF9jdHJsX21wZWc0WzRdLmlkID0gVjRMMl9DSURfQ09ERUNfTUZDNVhfRU5DX01VTFRJX1NMSUNFX01PREU7CisgICAgICAgIGV4dF9jdHJsX21wZWc0WzRdLnZhbHVlID0gbXBlZzRfYXJnLT5TbGljZU1vZGU7IC8qIDA6IG9uZSwgMTogZml4ZWQgI21iLCAzOiBmaXhlZCAjYnl0ZXMgKi8KKyAgICAgICAgaWYgKG1wZWc0X2FyZy0+U2xpY2VNb2RlID09IDApIHsKKyAgICAgICAgICAgIGV4dF9jdHJsX21wZWc0WzVdLmlkID0gVjRMMl9DSURfQ09ERUNfTUZDNVhfRU5DX01VTFRJX1NMSUNFX01COworICAgICAgICAgICAgZXh0X2N0cmxfbXBlZzRbNV0udmFsdWUgPSAxOyAgLyogZGVmYXVsdCAqLworI2lmIGRlZmluZWQgKE1GQzV4X1ZFUlNJT04pCisgICAgICAgICAgICBleHRfY3RybF9tcGVnNFs2XS5pZCA9IFY0TDJfQ0lEX0NPREVDX01GQzVYX0VOQ19NVUxUSV9TTElDRV9CSVQ7CisgICAgICAgICAgICBleHRfY3RybF9tcGVnNFs2XS52YWx1ZSA9IDE5MDA7IC8qIGRlZmF1bHQgKi8KKyNlbGlmIGRlZmluZWQgKE1GQzZ4X1ZFUlNJT04pCisgICAgICAgICAgICBleHRfY3RybF9tcGVnNFs2XS5pZCA9IFY0TDJfQ0lEX0NPREVDX01GQzVYX0VOQ19NVUxUSV9TTElDRV9CSVQ7CisgICAgICAgICAgICBleHRfY3RybF9tcGVnNFs2XS52YWx1ZSA9IDI4MDA7IC8qIGJhc2VkIG9uIE1GQzYueCAqLworI2VuZGlmCisgICAgICAgIH0gZWxzZSBpZiAobXBlZzRfYXJnLT5TbGljZU1vZGUgPT0gMSkgeworICAgICAgICAgICAgZXh0X2N0cmxfbXBlZzRbNV0uaWQgPSBWNEwyX0NJRF9DT0RFQ19NRkM1WF9FTkNfTVVMVElfU0xJQ0VfTUI7CisgICAgICAgICAgICBleHRfY3RybF9tcGVnNFs1XS52YWx1ZSA9IG1wZWc0X2FyZy0+U2xpY2VBcmd1bWVudDsKKyNpZiBkZWZpbmVkIChNRkM1eF9WRVJTSU9OKQorICAgICAgICAgICAgZXh0X2N0cmxfbXBlZzRbNl0uaWQgPSBWNEwyX0NJRF9DT0RFQ19NRkM1WF9FTkNfTVVMVElfU0xJQ0VfQklUOworICAgICAgICAgICAgZXh0X2N0cmxfbXBlZzRbNl0udmFsdWUgPSAxOTAwOyAvKiBkZWZhdWx0ICovCisjZWxpZiBkZWZpbmVkIChNRkM2eF9WRVJTSU9OKQorICAgICAgICAgICAgZXh0X2N0cmxfbXBlZzRbNl0uaWQgPSBWNEwyX0NJRF9DT0RFQ19NRkM1WF9FTkNfTVVMVElfU0xJQ0VfQklUOworICAgICAgICAgICAgZXh0X2N0cmxfbXBlZzRbNl0udmFsdWUgPSAyODAwOyAvKiBiYXNlZCBvbiBNRkM2LnggKi8KKyNlbmRpZgorICAgICAgICB9IGVsc2UgaWYgKG1wZWc0X2FyZy0+U2xpY2VNb2RlID09IDMpIHsKKyAgICAgICAgICAgIGV4dF9jdHJsX21wZWc0WzVdLmlkID0gVjRMMl9DSURfQ09ERUNfTUZDNVhfRU5DX01VTFRJX1NMSUNFX01COworICAgICAgICAgICAgZXh0X2N0cmxfbXBlZzRbNV0udmFsdWUgPSAxOyAvKiBkZWZhdWx0ICovCisgICAgICAgICAgICBleHRfY3RybF9tcGVnNFs2XS5pZCA9IFY0TDJfQ0lEX0NPREVDX01GQzVYX0VOQ19NVUxUSV9TTElDRV9CSVQ7CisgICAgICAgICAgICBleHRfY3RybF9tcGVnNFs2XS52YWx1ZSA9IG1wZWc0X2FyZy0+U2xpY2VBcmd1bWVudDsKKyAgICAgICAgfQorICAgICAgICAvKgorICAgICAgICAgKiBJdCBzaG91bGQgYmUgc2V0IHVzaW5nIG1wZWc0X2FyZy0+TnVtYmVyQkZyYW1lcyBhZnRlciBiZWluZyBoYW5kbGVkIGJ5IGFwcGwuCisgICAgICAgICAqLworICAgICAgICBleHRfY3RybF9tcGVnNFs3XS5pZCA9ICBWNEwyX0NJRF9DT0RFQ19NRkM1WF9FTkNfTVBFRzRfQl9GUkFNRVM7CisgICAgICAgIGV4dF9jdHJsX21wZWc0WzddLnZhbHVlID0gbXBlZzRfYXJnLT5OdW1iZXJCRnJhbWVzOworICAgICAgICBleHRfY3RybF9tcGVnNFs4XS5pZCA9IFY0TDJfQ0lEX0NPREVDX01GQzVYX0VOQ19JTlRSQV9SRUZSRVNIX01COworICAgICAgICBleHRfY3RybF9tcGVnNFs4XS52YWx1ZSA9IG1wZWc0X2FyZy0+UmFuZG9tSW50cmFNQlJlZnJlc2g7CisKKyAgICAgICAgZXh0X2N0cmxfbXBlZzRbOV0uaWQgPSBWNEwyX0NJRF9DT0RFQ19NRkM1WF9FTkNfUEFEX0NUUkxfRU5BQkxFOworICAgICAgICBleHRfY3RybF9tcGVnNFs5XS52YWx1ZSA9IG1wZWc0X2FyZy0+UGFkQ29udHJvbE9uOworICAgICAgICBleHRfY3RybF9tcGVnNFsxMF0uaWQgPSBWNEwyX0NJRF9DT0RFQ19NRkM1WF9FTkNfUEFEX0xVTUFfVkFMVUU7CisgICAgICAgIGV4dF9jdHJsX21wZWc0WzEwXS52YWx1ZSA9IG1wZWc0X2FyZy0+THVtYVBhZFZhbDsKKyAgICAgICAgZXh0X2N0cmxfbXBlZzRbMTFdLmlkID0gVjRMMl9DSURfQ09ERUNfTUZDNVhfRU5DX1BBRF9DQl9WQUxVRTsKKyAgICAgICAgZXh0X2N0cmxfbXBlZzRbMTFdLnZhbHVlID0gbXBlZzRfYXJnLT5DYlBhZFZhbDsKKyAgICAgICAgZXh0X2N0cmxfbXBlZzRbMTJdLmlkID0gVjRMMl9DSURfQ09ERUNfTUZDNVhfRU5DX1BBRF9DUl9WQUxVRTsKKyAgICAgICAgZXh0X2N0cmxfbXBlZzRbMTJdLnZhbHVlID0gbXBlZzRfYXJnLT5DclBhZFZhbDsKKworICAgICAgICBleHRfY3RybF9tcGVnNFsxM10uaWQgPSBWNEwyX0NJRF9DT0RFQ19NRkM1WF9FTkNfUkNfRlJBTUVfRU5BQkxFOworICAgICAgICBleHRfY3RybF9tcGVnNFsxM10udmFsdWUgPSBtcGVnNF9hcmctPkVuYWJsZUZSTVJhdGVDb250cm9sOworICAgICAgICBleHRfY3RybF9tcGVnNFsxNF0uaWQgPSBWNEwyX0NJRF9DT0RFQ19NRkM1WF9FTkNfTVBFRzRfVk9QX1RJTUVfUkVTOworICAgICAgICBleHRfY3RybF9tcGVnNFsxNF0udmFsdWUgPSBtcGVnNF9hcmctPlRpbWVJbmNyZWFtZW50UmVzOworICAgICAgICBleHRfY3RybF9tcGVnNFsxNV0uaWQgPSBWNEwyX0NJRF9DT0RFQ19NRkM1WF9FTkNfTVBFRzRfVk9QX0ZSTV9ERUxUQTsKKyAgICAgICAgZXh0X2N0cmxfbXBlZzRbMTVdLnZhbHVlID0gbXBlZzRfYXJnLT5Wb3BUaW1lSW5jcmVhbWVudDsKKyAgICAgICAgZXh0X2N0cmxfbXBlZzRbMTZdLmlkID0gVjRMMl9DSURfQ09ERUNfTUZDNVhfRU5DX1JDX0JJVF9SQVRFOworICAgICAgICBleHRfY3RybF9tcGVnNFsxNl0udmFsdWUgPSBtcGVnNF9hcmctPkJpdHJhdGU7CisKKyAgICAgICAgZXh0X2N0cmxfbXBlZzRbMTddLmlkID0gVjRMMl9DSURfQ09ERUNfTUZDNVhfRU5DX01QRUc0X1JDX0ZSQU1FX1FQOworICAgICAgICBleHRfY3RybF9tcGVnNFsxN10udmFsdWUgPSBtcGVnNF9hcmctPkZyYW1lUXA7CisgICAgICAgIGV4dF9jdHJsX21wZWc0WzE4XS5pZCA9ICBWNEwyX0NJRF9DT0RFQ19NRkM1WF9FTkNfTVBFRzRfUkNfUF9GUkFNRV9RUDsKKyAgICAgICAgZXh0X2N0cmxfbXBlZzRbMThdLnZhbHVlID0gbXBlZzRfYXJnLT5GcmFtZVFwX1A7CisgICAgICAgIGV4dF9jdHJsX21wZWc0WzE5XS5pZCA9ICBWNEwyX0NJRF9DT0RFQ19NRkM1WF9FTkNfTVBFRzRfUkNfQl9GUkFNRV9RUDsKKyAgICAgICAgZXh0X2N0cmxfbXBlZzRbMTldLnZhbHVlID0gbXBlZzRfYXJnLT5GcmFtZVFwX0I7CisKKyAgICAgICAgZXh0X2N0cmxfbXBlZzRbMjBdLmlkID0gIFY0TDJfQ0lEX0NPREVDX01GQzVYX0VOQ19NUEVHNF9SQ19NQVhfUVA7CisgICAgICAgIGV4dF9jdHJsX21wZWc0WzIwXS52YWx1ZSA9IG1wZWc0X2FyZy0+UVNDb2RlTWF4OworICAgICAgICBleHRfY3RybF9tcGVnNFsyMV0uaWQgPSBWNEwyX0NJRF9DT0RFQ19NRkM1WF9FTkNfTVBFRzRfUkNfTUlOX1FQOworICAgICAgICBleHRfY3RybF9tcGVnNFsyMV0udmFsdWUgPSBtcGVnNF9hcmctPlFTQ29kZU1pbjsKKyAgICAgICAgZXh0X2N0cmxfbXBlZzRbMjJdLmlkID0gVjRMMl9DSURfQ09ERUNfTUZDNVhfRU5DX1JDX1JFQUNUSU9OX0NPRUZGOworICAgICAgICBleHRfY3RybF9tcGVnNFsyMl0udmFsdWUgPSBtcGVnNF9hcmctPkNCUlBlcmlvZFJmOworCisgICAgICAgIGlmIChWNEwyX0NPREVDX01GQzVYX0VOQ19GUkFNRV9TS0lQX01PREVfTEVWRUwgPT0gcENUWC0+ZW5jX2ZyYW1lc2tpcCkgeworICAgICAgICAgICAgZXh0X2N0cmxfbXBlZzRbMjNdLmlkID0gVjRMMl9DSURfQ09ERUNfTUZDNVhfRU5DX0ZSQU1FX1NLSVBfTU9ERTsKKyAgICAgICAgICAgIGV4dF9jdHJsX21wZWc0WzIzXS52YWx1ZSA9IFY0TDJfQ09ERUNfTUZDNVhfRU5DX0ZSQU1FX1NLSVBfTU9ERV9MRVZFTDsKKyAgICAgICAgfSBlbHNlIGlmIChWNEwyX0NPREVDX01GQzVYX0VOQ19GUkFNRV9TS0lQX01PREVfVkJWX0JVRl9TSVpFID09IHBDVFgtPmVuY19mcmFtZXNraXApIHsKKyAgICAgICAgICAgIGV4dF9jdHJsX21wZWc0WzIzXS5pZCA9IFY0TDJfQ0lEX0NPREVDX01GQzVYX0VOQ19GUkFNRV9TS0lQX01PREU7CisgICAgICAgICAgICBleHRfY3RybF9tcGVnNFsyM10udmFsdWUgPSBWNEwyX0NPREVDX01GQzVYX0VOQ19GUkFNRV9TS0lQX01PREVfVkJWX0JVRl9TSVpFOworICAgICAgICB9IGVsc2UgeyAvKiBFTkNfRlJBTUVfU0tJUF9NT0RFX0RJU0FCTEUgKGRlZmF1bHQpICovCisgICAgICAgICAgICBleHRfY3RybF9tcGVnNFsyM10uaWQgPSBWNEwyX0NJRF9DT0RFQ19NRkM1WF9FTkNfRlJBTUVfU0tJUF9NT0RFOworICAgICAgICAgICAgZXh0X2N0cmxfbXBlZzRbMjNdLnZhbHVlID0gVjRMMl9DT0RFQ19NRkM1WF9FTkNfRlJBTUVfU0tJUF9NT0RFX0RJU0FCTEU7CisgICAgICAgIH0KKworICAgICAgICBleHRfY3RybF9tcGVnNFsyNF0uaWQgPSBWNEwyX0NJRF9DT0RFQ19NRkM1WF9FTkNfVkJWX0JVRl9TSVpFOworICAgICAgICBleHRfY3RybF9tcGVnNFsyNF0udmFsdWUgPSAwOworCisgICAgICAgIGV4dF9jdHJsX21wZWc0WzI1XS5pZCA9IFY0TDJfQ0lEX0NPREVDX01GQzVYX0VOQ19TRVFfSERSX01PREU7CisgICAgICAgIGV4dF9jdHJsX21wZWc0WzI1XS52YWx1ZSA9IDA7CisKKyAgICAgICAgZXh0X2N0cmxfbXBlZzRbMjZdLmlkID0gVjRMMl9DSURfQ09ERUNfTUZDNVhfRU5DX1JDX0ZJWEVEX1RBUkdFVF9CSVQ7CisgICAgICAgIGV4dF9jdHJsX21wZWc0WzI2XS52YWx1ZSA9IFY0TDJfQ09ERUNfTUZDNVhfRU5DX1NXX0VOQUJMRTsKKworI2lmIGRlZmluZWQgKE1GQzZ4X1ZFUlNJT04pCisgICAgICAgIGV4dF9jdHJsX21wZWc0WzI3XS5pZCA9IFY0TDJfQ0lEX0NPREVDX01GQzVYX0VOQ19NUEVHNF9SQ19NQl9FTkFCTEU7IC8qIE1GQyA2LnggT25seSAqLworICAgICAgICBleHRfY3RybF9tcGVnNFsyN10udmFsdWUgPSBtcGVnNF9hcmctPkVuYWJsZU1CUmF0ZUNvbnRyb2w7CisjZW5kaWYKKyAgICAgICAgYnJlYWs7CisKKyAgICBjYXNlIEgyNjNfRU5DOgorICAgICAgICBleHRfY3RybF9oMjYzWzBdLmlkID0gVjRMMl9DSURfQ09ERUNfTUZDNVhfRU5DX0dPUF9TSVpFOworICAgICAgICBleHRfY3RybF9oMjYzWzBdLnZhbHVlID0gaDI2M19hcmctPklEUlBlcmlvZDsKKworICAgICAgICBleHRfY3RybF9oMjYzWzFdLmlkID0gVjRMMl9DSURfQ09ERUNfTUZDNVhfRU5DX01VTFRJX1NMSUNFX01PREU7CisgICAgICAgIGV4dF9jdHJsX2gyNjNbMV0udmFsdWUgPSBoMjYzX2FyZy0+U2xpY2VNb2RlOyAvKiAwOiBvbmUsIENoZWNrIGlzIG5lZWRlZCBpZiBoMjY0IHN1cHBvcnQgbXVsdGktc2xpY2UgKi8KKworICAgICAgICBleHRfY3RybF9oMjYzWzJdLmlkID0gVjRMMl9DSURfQ09ERUNfTUZDNVhfRU5DX0lOVFJBX1JFRlJFU0hfTUI7CisgICAgICAgIGV4dF9jdHJsX2gyNjNbMl0udmFsdWUgPSBoMjYzX2FyZy0+UmFuZG9tSW50cmFNQlJlZnJlc2g7CisKKyAgICAgICAgZXh0X2N0cmxfaDI2M1szXS5pZCA9IFY0TDJfQ0lEX0NPREVDX01GQzVYX0VOQ19QQURfQ1RSTF9FTkFCTEU7CisgICAgICAgIGV4dF9jdHJsX2gyNjNbM10udmFsdWUgPSBoMjYzX2FyZy0+UGFkQ29udHJvbE9uOworICAgICAgICBleHRfY3RybF9oMjYzWzRdLmlkID0gVjRMMl9DSURfQ09ERUNfTUZDNVhfRU5DX1BBRF9MVU1BX1ZBTFVFOworICAgICAgICBleHRfY3RybF9oMjYzWzRdLnZhbHVlID0gaDI2M19hcmctPkx1bWFQYWRWYWw7CisgICAgICAgIGV4dF9jdHJsX2gyNjNbNV0uaWQgPSBWNEwyX0NJRF9DT0RFQ19NRkM1WF9FTkNfUEFEX0NCX1ZBTFVFOworICAgICAgICBleHRfY3RybF9oMjYzWzVdLnZhbHVlID0gaDI2M19hcmctPkNiUGFkVmFsOworICAgICAgICBleHRfY3RybF9oMjYzWzZdLmlkID0gVjRMMl9DSURfQ09ERUNfTUZDNVhfRU5DX1BBRF9DUl9WQUxVRTsKKyAgICAgICAgZXh0X2N0cmxfaDI2M1s2XS52YWx1ZSA9IGgyNjNfYXJnLT5DclBhZFZhbDsKKworICAgICAgICBleHRfY3RybF9oMjYzWzddLmlkID0gVjRMMl9DSURfQ09ERUNfTUZDNVhfRU5DX1JDX0ZSQU1FX0VOQUJMRTsKKyAgICAgICAgZXh0X2N0cmxfaDI2M1s3XS52YWx1ZSA9IGgyNjNfYXJnLT5FbmFibGVGUk1SYXRlQ29udHJvbDsKKworICAgICAgICBleHRfY3RybF9oMjYzWzhdLmlkID0gVjRMMl9DSURfQ09ERUNfTUZDNVhfRU5DX0gyNjNfUkNfRlJBTUVfUkFURTsKKyAgICAgICAgZXh0X2N0cmxfaDI2M1s4XS52YWx1ZSA9IGgyNjNfYXJnLT5GcmFtZVJhdGU7CisKKyAgICAgICAgZXh0X2N0cmxfaDI2M1s5XS5pZCA9IFY0TDJfQ0lEX0NPREVDX01GQzVYX0VOQ19SQ19CSVRfUkFURTsKKyAgICAgICAgZXh0X2N0cmxfaDI2M1s5XS52YWx1ZSA9IGgyNjNfYXJnLT5CaXRyYXRlOworCisgICAgICAgIGV4dF9jdHJsX2gyNjNbMTBdLmlkID0gVjRMMl9DSURfQ09ERUNfTUZDNVhfRU5DX0gyNjNfUkNfRlJBTUVfUVA7CisgICAgICAgIGV4dF9jdHJsX2gyNjNbMTBdLnZhbHVlID0gaDI2M19hcmctPkZyYW1lUXA7CisgICAgICAgIGV4dF9jdHJsX2gyNjNbMTFdLmlkID0gIFY0TDJfQ0lEX0NPREVDX01GQzVYX0VOQ19IMjYzX1JDX1BfRlJBTUVfUVA7CisgICAgICAgIGV4dF9jdHJsX2gyNjNbMTFdLnZhbHVlID0gaDI2M19hcmctPkZyYW1lUXBfUDsKKworICAgICAgICBleHRfY3RybF9oMjYzWzEyXS5pZCA9ICBWNEwyX0NJRF9DT0RFQ19NRkM1WF9FTkNfSDI2M19SQ19NQVhfUVA7CisgICAgICAgIGV4dF9jdHJsX2gyNjNbMTJdLnZhbHVlID0gaDI2M19hcmctPlFTQ29kZU1heDsKKyAgICAgICAgZXh0X2N0cmxfaDI2M1sxM10uaWQgPSBWNEwyX0NJRF9DT0RFQ19NRkM1WF9FTkNfSDI2M19SQ19NSU5fUVA7CisgICAgICAgIGV4dF9jdHJsX2gyNjNbMTNdLnZhbHVlID0gaDI2M19hcmctPlFTQ29kZU1pbjsKKyAgICAgICAgZXh0X2N0cmxfaDI2M1sxNF0uaWQgPSBWNEwyX0NJRF9DT0RFQ19NRkM1WF9FTkNfUkNfUkVBQ1RJT05fQ09FRkY7CisgICAgICAgIGV4dF9jdHJsX2gyNjNbMTRdLnZhbHVlID0gaDI2M19hcmctPkNCUlBlcmlvZFJmOworCisgICAgICAgIGlmIChWNEwyX0NPREVDX01GQzVYX0VOQ19GUkFNRV9TS0lQX01PREVfTEVWRUwgPT0gcENUWC0+ZW5jX2ZyYW1lc2tpcCkgeworICAgICAgICAgICAgZXh0X2N0cmxfaDI2M1sxNV0uaWQgPSBWNEwyX0NJRF9DT0RFQ19NRkM1WF9FTkNfRlJBTUVfU0tJUF9NT0RFOworICAgICAgICAgICAgZXh0X2N0cmxfaDI2M1sxNV0udmFsdWUgPSBWNEwyX0NPREVDX01GQzVYX0VOQ19GUkFNRV9TS0lQX01PREVfTEVWRUw7CisgICAgICAgIH0gZWxzZSBpZiAoVjRMMl9DT0RFQ19NRkM1WF9FTkNfRlJBTUVfU0tJUF9NT0RFX1ZCVl9CVUZfU0laRSA9PSBwQ1RYLT5lbmNfZnJhbWVza2lwKSB7CisgICAgICAgICAgICBleHRfY3RybF9oMjYzWzE1XS5pZCA9IFY0TDJfQ0lEX0NPREVDX01GQzVYX0VOQ19GUkFNRV9TS0lQX01PREU7CisgICAgICAgICAgICBleHRfY3RybF9oMjYzWzE1XS52YWx1ZSA9IFY0TDJfQ09ERUNfTUZDNVhfRU5DX0ZSQU1FX1NLSVBfTU9ERV9WQlZfQlVGX1NJWkU7CisgICAgICAgIH0gZWxzZSB7IC8qIEVOQ19GUkFNRV9TS0lQX01PREVfRElTQUJMRSAoZGVmYXVsdCkgKi8KKyAgICAgICAgICAgIGV4dF9jdHJsX2gyNjNbMTVdLmlkID0gVjRMMl9DSURfQ09ERUNfTUZDNVhfRU5DX0ZSQU1FX1NLSVBfTU9ERTsKKyAgICAgICAgICAgIGV4dF9jdHJsX2gyNjNbMTVdLnZhbHVlID0gVjRMMl9DT0RFQ19NRkM1WF9FTkNfRlJBTUVfU0tJUF9NT0RFX0RJU0FCTEU7CisgICAgICAgIH0KKworICAgICAgICBleHRfY3RybF9oMjYzWzE2XS5pZCA9IFY0TDJfQ0lEX0NPREVDX01GQzVYX0VOQ19WQlZfQlVGX1NJWkU7CisgICAgICAgIGV4dF9jdHJsX2gyNjNbMTZdLnZhbHVlID0gMDsKKworICAgICAgICBleHRfY3RybF9oMjYzWzE3XS5pZCA9IFY0TDJfQ0lEX0NPREVDX01GQzVYX0VOQ19TRVFfSERSX01PREU7CisgICAgICAgIGV4dF9jdHJsX2gyNjNbMTddLnZhbHVlID0gMDsKKworICAgICAgICBleHRfY3RybF9oMjYzWzE4XS5pZCA9IFY0TDJfQ0lEX0NPREVDX01GQzVYX0VOQ19SQ19GSVhFRF9UQVJHRVRfQklUOworICAgICAgICBleHRfY3RybF9oMjYzWzE4XS52YWx1ZSA9IFY0TDJfQ09ERUNfTUZDNVhfRU5DX1NXX0VOQUJMRTsKKworI2lmIGRlZmluZWQgKE1GQzZ4X1ZFUlNJT04pCisgICAgICAgIGV4dF9jdHJsX2gyNjNbMTldLmlkID0gVjRMMl9DSURfQ09ERUNfTUZDNVhfRU5DX0gyNjNfUkNfTUJfRU5BQkxFOyAvKiBNRkMgNi54IE9ubHkgKi8KKyAgICAgICAgZXh0X2N0cmxfaDI2M1sxOV0udmFsdWUgPSBoMjYzX2FyZy0+RW5hYmxlTUJSYXRlQ29udHJvbDsKKyNlbmRpZgorICAgICAgICBicmVhazsKKworICAgIGNhc2UgSDI2NF9FTkM6CisgICAgICAgIGV4dF9jdHJsWzBdLmlkID0gVjRMMl9DSURfQ09ERUNfTUZDNVhfRU5DX0gyNjRfUFJPRklMRTsKKyAgICAgICAgZXh0X2N0cmxbMF0udmFsdWUgPSBoMjY0X2FyZy0+UHJvZmlsZUlEQzsKKyAgICAgICAgZXh0X2N0cmxbMV0uaWQgPSBWNEwyX0NJRF9DT0RFQ19NRkM1WF9FTkNfSDI2NF9MRVZFTDsKKyAgICAgICAgZXh0X2N0cmxbMV0udmFsdWUgPSBoMjY0X2FyZy0+TGV2ZWxJREM7CisgICAgICAgIGV4dF9jdHJsWzJdLmlkID0gVjRMMl9DSURfQ09ERUNfTUZDNVhfRU5DX0dPUF9TSVpFOworICAgICAgICBleHRfY3RybFsyXS52YWx1ZSA9IGgyNjRfYXJnLT5JRFJQZXJpb2Q7CisgICAgICAgIGV4dF9jdHJsWzNdLmlkID0gVjRMMl9DSURfQ09ERUNfTUZDNVhfRU5DX0gyNjRfTUFYX1JFRl9QSUM7CisgICAgICAgIGV4dF9jdHJsWzNdLnZhbHVlID0gaDI2NF9hcmctPk51bWJlclJlZmVyZW5jZUZyYW1lczsKKyAgICAgICAgZXh0X2N0cmxbNF0uaWQgPSBWNEwyX0NJRF9DT0RFQ19NRkM1WF9FTkNfSDI2NF9OVU1fUkVGX1BJQ180UDsKKyAgICAgICAgZXh0X2N0cmxbNF0udmFsdWUgPSBoMjY0X2FyZy0+TnVtYmVyUmVmRm9yUGZyYW1lczsKKyAgICAgICAgZXh0X2N0cmxbNV0uaWQgPSBWNEwyX0NJRF9DT0RFQ19NRkM1WF9FTkNfTVVMVElfU0xJQ0VfTU9ERTsKKyAgICAgICAgZXh0X2N0cmxbNV0udmFsdWUgPSBoMjY0X2FyZy0+U2xpY2VNb2RlOyAgLyogMDogb25lLCAxOiBmaXhlZCAjbWIsIDM6IGZpeGVkICNieXRlcyAqLworICAgICAgICBpZiAoaDI2NF9hcmctPlNsaWNlTW9kZSA9PSAwKSB7CisgICAgICAgICAgICBleHRfY3RybFs2XS5pZCA9IFY0TDJfQ0lEX0NPREVDX01GQzVYX0VOQ19NVUxUSV9TTElDRV9NQjsKKyAgICAgICAgICAgIGV4dF9jdHJsWzZdLnZhbHVlID0gMTsgIC8qIGRlZmF1bHQgKi8KKyNpZiBkZWZpbmVkIChNRkM1eF9WRVJTSU9OKQorICAgICAgICAgICAgZXh0X2N0cmxbN10uaWQgPSBWNEwyX0NJRF9DT0RFQ19NRkM1WF9FTkNfTVVMVElfU0xJQ0VfQklUOworICAgICAgICAgICAgZXh0X2N0cmxbN10udmFsdWUgPSAxOTAwOyAvKiBkZWZhdWx0ICovCisjZWxpZiBkZWZpbmVkIChNRkM2eF9WRVJTSU9OKQorICAgICAgICAgICAgZXh0X2N0cmxbN10uaWQgPSBWNEwyX0NJRF9DT0RFQ19NRkM1WF9FTkNfTVVMVElfU0xJQ0VfQklUOworICAgICAgICAgICAgZXh0X2N0cmxbN10udmFsdWUgPSAyODAwOyAvKiBiYXNlZCBvbiBNRkM2LnggKi8KKyNlbmRpZgorICAgICAgICB9IGVsc2UgaWYgKGgyNjRfYXJnLT5TbGljZU1vZGUgPT0gMSkgeworICAgICAgICAgICAgZXh0X2N0cmxbNl0uaWQgPSBWNEwyX0NJRF9DT0RFQ19NRkM1WF9FTkNfTVVMVElfU0xJQ0VfTUI7CisgICAgICAgICAgICBleHRfY3RybFs2XS52YWx1ZSA9IGgyNjRfYXJnLT5TbGljZUFyZ3VtZW50OworI2lmIGRlZmluZWQgKE1GQzV4X1ZFUlNJT04pCisgICAgICAgICAgICBleHRfY3RybFs3XS5pZCA9IFY0TDJfQ0lEX0NPREVDX01GQzVYX0VOQ19NVUxUSV9TTElDRV9CSVQ7CisgICAgICAgICAgICBleHRfY3RybFs3XS52YWx1ZSA9IDE5MDA7IC8qIGRlZmF1bHQgKi8KKyNlbGlmIGRlZmluZWQgKE1GQzZ4X1ZFUlNJT04pCisgICAgICAgICAgICBleHRfY3RybFs3XS5pZCA9IFY0TDJfQ0lEX0NPREVDX01GQzVYX0VOQ19NVUxUSV9TTElDRV9CSVQ7CisgICAgICAgICAgICBleHRfY3RybFs3XS52YWx1ZSA9IDI4MDA7IC8qIGJhc2VkIG9uIE1GQzYueCAqLworI2VuZGlmCisgICAgICAgIH0gZWxzZSBpZiAoaDI2NF9hcmctPlNsaWNlTW9kZSA9PSAzKSB7CisgICAgICAgICAgICBleHRfY3RybFs2XS5pZCA9IFY0TDJfQ0lEX0NPREVDX01GQzVYX0VOQ19NVUxUSV9TTElDRV9NQjsKKyAgICAgICAgICAgIGV4dF9jdHJsWzZdLnZhbHVlID0gMTsgLyogZGVmYXVsdCAqLworICAgICAgICAgICAgZXh0X2N0cmxbN10uaWQgPSBWNEwyX0NJRF9DT0RFQ19NRkM1WF9FTkNfTVVMVElfU0xJQ0VfQklUOworICAgICAgICAgICAgZXh0X2N0cmxbN10udmFsdWUgPSBoMjY0X2FyZy0+U2xpY2VBcmd1bWVudDsKKyAgICAgICAgfQorICAgICAgICAvKgorICAgICAgICAgKiBJdCBzaG91bGQgYmUgc2V0IHVzaW5nIGgyNjRfYXJnLT5OdW1iZXJCRnJhbWVzIGFmdGVyIGJlaW5nIGhhbmRsZWQgYnkgYXBwbC4KKyAgICAgICAgICovCisgICAgICAgIGV4dF9jdHJsWzhdLmlkID0gIFY0TDJfQ0lEX0NPREVDX01GQzVYX0VOQ19IMjY0X0JfRlJBTUVTOworICAgICAgICBleHRfY3RybFs4XS52YWx1ZSA9IGgyNjRfYXJnLT5OdW1iZXJCRnJhbWVzOworICAgICAgICBleHRfY3RybFs5XS5pZCA9IFY0TDJfQ0lEX0NPREVDX01GQzVYX0VOQ19IMjY0X0xPT1BfRklMVEVSX01PREU7CisgICAgICAgIGV4dF9jdHJsWzldLnZhbHVlID0gaDI2NF9hcmctPkxvb3BGaWx0ZXJEaXNhYmxlOworICAgICAgICBleHRfY3RybFsxMF0uaWQgPSBWNEwyX0NJRF9DT0RFQ19NRkM1WF9FTkNfSDI2NF9MT09QX0ZJTFRFUl9BTFBIQTsKKyAgICAgICAgZXh0X2N0cmxbMTBdLnZhbHVlID0gaDI2NF9hcmctPkxvb3BGaWx0ZXJBbHBoYUMwT2Zmc2V0OworICAgICAgICBleHRfY3RybFsxMV0uaWQgPSBWNEwyX0NJRF9DT0RFQ19NRkM1WF9FTkNfSDI2NF9MT09QX0ZJTFRFUl9CRVRBOworICAgICAgICBleHRfY3RybFsxMV0udmFsdWUgPSBoMjY0X2FyZy0+TG9vcEZpbHRlckJldGFPZmZzZXQ7CisgICAgICAgIGV4dF9jdHJsWzEyXS5pZCA9IFY0TDJfQ0lEX0NPREVDX01GQzVYX0VOQ19IMjY0X0VOVFJPUFlfTU9ERTsKKyAgICAgICAgZXh0X2N0cmxbMTJdLnZhbHVlID0gaDI2NF9hcmctPlN5bWJvbE1vZGU7CisgICAgICAgIGV4dF9jdHJsWzEzXS5pZCA9IFY0TDJfQ0lEX0NPREVDX01GQzVYX0VOQ19IMjY0X0lOVEVSTEFDRTsKKyAgICAgICAgZXh0X2N0cmxbMTNdLnZhbHVlID0gaDI2NF9hcmctPlBpY3R1cmVJbnRlcmxhY2U7CisgICAgICAgIGV4dF9jdHJsWzE0XS5pZCA9IFY0TDJfQ0lEX0NPREVDX01GQzVYX0VOQ19IMjY0XzhYOF9UUkFOU0ZPUk07CisgICAgICAgIGV4dF9jdHJsWzE0XS52YWx1ZSA9IGgyNjRfYXJnLT5UcmFuc2Zvcm04eDhNb2RlOworICAgICAgICBleHRfY3RybFsxNV0uaWQgPSBWNEwyX0NJRF9DT0RFQ19NRkM1WF9FTkNfSU5UUkFfUkVGUkVTSF9NQjsKKyAgICAgICAgZXh0X2N0cmxbMTVdLnZhbHVlID0gaDI2NF9hcmctPlJhbmRvbUludHJhTUJSZWZyZXNoOworICAgICAgICBleHRfY3RybFsxNl0uaWQgPSBWNEwyX0NJRF9DT0RFQ19NRkM1WF9FTkNfUEFEX0NUUkxfRU5BQkxFOworICAgICAgICBleHRfY3RybFsxNl0udmFsdWUgPSBoMjY0X2FyZy0+UGFkQ29udHJvbE9uOworICAgICAgICBleHRfY3RybFsxN10uaWQgPSBWNEwyX0NJRF9DT0RFQ19NRkM1WF9FTkNfUEFEX0xVTUFfVkFMVUU7CisgICAgICAgIGV4dF9jdHJsWzE3XS52YWx1ZSA9IGgyNjRfYXJnLT5MdW1hUGFkVmFsOworICAgICAgICBleHRfY3RybFsxOF0uaWQgPSBWNEwyX0NJRF9DT0RFQ19NRkM1WF9FTkNfUEFEX0NCX1ZBTFVFOworICAgICAgICBleHRfY3RybFsxOF0udmFsdWUgPSBoMjY0X2FyZy0+Q2JQYWRWYWw7CisgICAgICAgIGV4dF9jdHJsWzE5XS5pZCA9IFY0TDJfQ0lEX0NPREVDX01GQzVYX0VOQ19QQURfQ1JfVkFMVUU7CisgICAgICAgIGV4dF9jdHJsWzE5XS52YWx1ZSA9IGgyNjRfYXJnLT5DclBhZFZhbDsKKyAgICAgICAgZXh0X2N0cmxbMjBdLmlkID0gVjRMMl9DSURfQ09ERUNfTUZDNVhfRU5DX1JDX0ZSQU1FX0VOQUJMRTsKKyAgICAgICAgZXh0X2N0cmxbMjBdLnZhbHVlID0gaDI2NF9hcmctPkVuYWJsZUZSTVJhdGVDb250cm9sOworICAgICAgICBleHRfY3RybFsyMV0uaWQgPSBWNEwyX0NJRF9DT0RFQ19NRkM1WF9FTkNfSDI2NF9SQ19NQl9FTkFCTEU7CisgICAgICAgIGV4dF9jdHJsWzIxXS52YWx1ZSA9IGgyNjRfYXJnLT5FbmFibGVNQlJhdGVDb250cm9sOworICAgICAgICBleHRfY3RybFsyMl0uaWQgPSBWNEwyX0NJRF9DT0RFQ19NRkM1WF9FTkNfSDI2NF9SQ19GUkFNRV9SQVRFOworICAgICAgICBleHRfY3RybFsyMl0udmFsdWUgPSBoMjY0X2FyZy0+RnJhbWVSYXRlOworICAgICAgICBleHRfY3RybFsyM10uaWQgPSBWNEwyX0NJRF9DT0RFQ19NRkM1WF9FTkNfUkNfQklUX1JBVEU7CisgICAgICAgIC8qIEZJWE1FIHRlbXBvcmFyeSBmaXggKi8KKyAgICAgICAgaWYgKGgyNjRfYXJnLT5CaXRyYXRlKQorICAgICAgICAgICAgZXh0X2N0cmxbMjNdLnZhbHVlID0gaDI2NF9hcmctPkJpdHJhdGU7CisgICAgICAgIGVsc2UKKyAgICAgICAgICAgIGV4dF9jdHJsWzIzXS52YWx1ZSA9IDE7IC8qIGp1c3QgZm9yIHRlc3RpbmcgTW92aSBzdHVkaW8gKi8KKyAgICAgICAgZXh0X2N0cmxbMjRdLmlkID0gVjRMMl9DSURfQ09ERUNfTUZDNVhfRU5DX0gyNjRfUkNfRlJBTUVfUVA7CisgICAgICAgIGV4dF9jdHJsWzI0XS52YWx1ZSA9IGgyNjRfYXJnLT5GcmFtZVFwOworICAgICAgICBleHRfY3RybFsyNV0uaWQgPSAgVjRMMl9DSURfQ09ERUNfTUZDNVhfRU5DX0gyNjRfUkNfUF9GUkFNRV9RUDsKKyAgICAgICAgZXh0X2N0cmxbMjVdLnZhbHVlID0gaDI2NF9hcmctPkZyYW1lUXBfUDsKKyAgICAgICAgZXh0X2N0cmxbMjZdLmlkID0gIFY0TDJfQ0lEX0NPREVDX01GQzVYX0VOQ19IMjY0X1JDX0JfRlJBTUVfUVA7CisgICAgICAgIGV4dF9jdHJsWzI2XS52YWx1ZSA9IGgyNjRfYXJnLT5GcmFtZVFwX0I7CisgICAgICAgIGV4dF9jdHJsWzI3XS5pZCA9ICBWNEwyX0NJRF9DT0RFQ19NRkM1WF9FTkNfSDI2NF9SQ19NQVhfUVA7CisgICAgICAgIGV4dF9jdHJsWzI3XS52YWx1ZSA9IGgyNjRfYXJnLT5RU0NvZGVNYXg7CisgICAgICAgIGV4dF9jdHJsWzI4XS5pZCA9IFY0TDJfQ0lEX0NPREVDX01GQzVYX0VOQ19IMjY0X1JDX01JTl9RUDsKKyAgICAgICAgZXh0X2N0cmxbMjhdLnZhbHVlID0gaDI2NF9hcmctPlFTQ29kZU1pbjsKKyAgICAgICAgZXh0X2N0cmxbMjldLmlkID0gVjRMMl9DSURfQ09ERUNfTUZDNVhfRU5DX1JDX1JFQUNUSU9OX0NPRUZGOworICAgICAgICBleHRfY3RybFsyOV0udmFsdWUgPSBoMjY0X2FyZy0+Q0JSUGVyaW9kUmY7CisgICAgICAgIGV4dF9jdHJsWzMwXS5pZCA9ICBWNEwyX0NJRF9DT0RFQ19NRkM1WF9FTkNfSDI2NF9SQ19NQl9EQVJLOworICAgICAgICBleHRfY3RybFszMF0udmFsdWUgPSBoMjY0X2FyZy0+RGFya0Rpc2FibGU7CisgICAgICAgIGV4dF9jdHJsWzMxXS5pZCA9ICBWNEwyX0NJRF9DT0RFQ19NRkM1WF9FTkNfSDI2NF9SQ19NQl9TTU9PVEg7CisgICAgICAgIGV4dF9jdHJsWzMxXS52YWx1ZSA9IGgyNjRfYXJnLT5TbW9vdGhEaXNhYmxlOworICAgICAgICBleHRfY3RybFszMl0uaWQgPSAgVjRMMl9DSURfQ09ERUNfTUZDNVhfRU5DX0gyNjRfUkNfTUJfU1RBVElDOworICAgICAgICBleHRfY3RybFszMl0udmFsdWUgPSBoMjY0X2FyZy0+U3RhdGljRGlzYWJsZTsKKyAgICAgICAgZXh0X2N0cmxbMzNdLmlkID0gIFY0TDJfQ0lEX0NPREVDX01GQzVYX0VOQ19IMjY0X1JDX01CX0FDVElWSVRZOworICAgICAgICBleHRfY3RybFszM10udmFsdWUgPSBoMjY0X2FyZy0+QWN0aXZpdHlEaXNhYmxlOworCisgICAgICAgIC8qIGRvZXNuJ3QgaGF2ZSB0byBiZSBzZXQgKi8KKyAgICAgICAgZXh0X2N0cmxbMzRdLmlkID0gVjRMMl9DSURfQ09ERUNfTUZDNVhfRU5DX0gyNjRfT1BFTl9HT1A7CisgICAgICAgIGV4dF9jdHJsWzM0XS52YWx1ZSA9IFY0TDJfQ09ERUNfTUZDNVhfRU5DX1NXX0RJU0FCTEU7CisgICAgICAgIGV4dF9jdHJsWzM1XS5pZCA9IFY0TDJfQ0lEX0NPREVDX01GQzVYX0VOQ19IMjY0X0lfUEVSSU9EOworICAgICAgICBleHRfY3RybFszNV0udmFsdWUgPSAxMDsKKworICAgICAgICBpZiAoVjRMMl9DT0RFQ19NRkM1WF9FTkNfRlJBTUVfU0tJUF9NT0RFX0xFVkVMID09IHBDVFgtPmVuY19mcmFtZXNraXApIHsKKyAgICAgICAgICAgIGV4dF9jdHJsWzM2XS5pZCA9IFY0TDJfQ0lEX0NPREVDX01GQzVYX0VOQ19GUkFNRV9TS0lQX01PREU7CisgICAgICAgICAgICBleHRfY3RybFszNl0udmFsdWUgPSBWNEwyX0NPREVDX01GQzVYX0VOQ19GUkFNRV9TS0lQX01PREVfTEVWRUw7CisgICAgICAgIH0gZWxzZSBpZiAoVjRMMl9DT0RFQ19NRkM1WF9FTkNfRlJBTUVfU0tJUF9NT0RFX1ZCVl9CVUZfU0laRSA9PSBwQ1RYLT5lbmNfZnJhbWVza2lwKSB7CisgICAgICAgICAgICBleHRfY3RybFszNl0uaWQgPSBWNEwyX0NJRF9DT0RFQ19NRkM1WF9FTkNfRlJBTUVfU0tJUF9NT0RFOworICAgICAgICAgICAgZXh0X2N0cmxbMzZdLnZhbHVlID0gVjRMMl9DT0RFQ19NRkM1WF9FTkNfRlJBTUVfU0tJUF9NT0RFX1ZCVl9CVUZfU0laRTsKKyAgICAgICAgfSBlbHNlIHsgLyogRU5DX0ZSQU1FX1NLSVBfTU9ERV9ESVNBQkxFIChkZWZhdWx0KSAqLworICAgICAgICAgICAgZXh0X2N0cmxbMzZdLmlkID0gVjRMMl9DSURfQ09ERUNfTUZDNVhfRU5DX0ZSQU1FX1NLSVBfTU9ERTsKKyAgICAgICAgICAgIGV4dF9jdHJsWzM2XS52YWx1ZSA9IFY0TDJfQ09ERUNfTUZDNVhfRU5DX0ZSQU1FX1NLSVBfTU9ERV9ESVNBQkxFOworICAgICAgICB9CisKKyAgICAgICAgZXh0X2N0cmxbMzddLmlkID0gVjRMMl9DSURfQ09ERUNfTUZDNVhfRU5DX1ZCVl9CVUZfU0laRTsKKyAgICAgICAgZXh0X2N0cmxbMzddLnZhbHVlID0gMDsKKworICAgICAgICBleHRfY3RybFszOF0uaWQgPSBWNEwyX0NJRF9DT0RFQ19NRkM1WF9FTkNfU0VRX0hEUl9NT0RFOworICAgICAgICBleHRfY3RybFszOF0udmFsdWUgPSAwOyAvKiAwOiBzZXBlcmF0ZWQgaGVhZGVyLCAxOiBoZWFkZXIgKyBmaXJzdCBmcmFtZSAqLworCisgICAgICAgIGV4dF9jdHJsWzM5XS5pZCA9ICBWNEwyX0NJRF9DT0RFQ19NRkM1WF9FTkNfSDI2NF9BUl9WVUlfRU5BQkxFOworICAgICAgICBleHRfY3RybFszOV0udmFsdWUgPSBWNEwyX0NPREVDX01GQzVYX0VOQ19TV19ESVNBQkxFOworICAgICAgICBleHRfY3RybFs0MF0uaWQgPSBWNEwyX0NJRF9DT0RFQ19NRkM1WF9FTkNfSDI2NF9BUl9WVUlfSURDOworICAgICAgICBleHRfY3RybFs0MF0udmFsdWUgPSAwOworICAgICAgICBleHRfY3RybFs0MV0uaWQgPSBWNEwyX0NJRF9DT0RFQ19NRkM1WF9FTkNfSDI2NF9FWFRfU0FSX1dJRFRIOworICAgICAgICBleHRfY3RybFs0MV0udmFsdWUgPSAwOworICAgICAgICBleHRfY3RybFs0Ml0uaWQgPSAgVjRMMl9DSURfQ09ERUNfTUZDNVhfRU5DX0gyNjRfRVhUX1NBUl9IRUlHSFQ7CisgICAgICAgIGV4dF9jdHJsWzQyXS52YWx1ZSA9IDA7CisKKyAgICAgICAgaWYgKHBDVFgtPmhpZXJfcF9lbmFibGUpIHsKKyAgICAgICAgICAgIGV4dF9jdHJsWzQzXS5pZCA9ICBWNEwyX0NJRF9DT0RFQ19NRkM1WF9FTkNfSDI2NF9ISUVSX1BfRU5BQkxFOworICAgICAgICAgICAgZXh0X2N0cmxbNDNdLnZhbHVlID0gVjRMMl9DT0RFQ19NRkM1WF9FTkNfU1dfRU5BQkxFOworICAgICAgICAgICAgZXh0X2N0cmxbNDRdLmlkID0gIFY0TDJfQ0lEX0NPREVDX01GQzVYX0VOQ19IMjY0X0xBWUVSMF9RUDsKKyAgICAgICAgICAgIGV4dF9jdHJsWzQ0XS52YWx1ZSA9IHBDVFgtPmhpZXJfcXBfdmFsdWUudDBfZnJhbWVfcXA7CisgICAgICAgICAgICBleHRfY3RybFs0NV0uaWQgPSAgVjRMMl9DSURfQ09ERUNfTUZDNVhfRU5DX0gyNjRfTEFZRVIxX1FQOworICAgICAgICAgICAgZXh0X2N0cmxbNDVdLnZhbHVlID0gcENUWC0+aGllcl9xcF92YWx1ZS50Ml9mcmFtZV9xcDsKKyAgICAgICAgICAgIGV4dF9jdHJsWzQ2XS5pZCA9ICBWNEwyX0NJRF9DT0RFQ19NRkM1WF9FTkNfSDI2NF9MQVlFUjJfUVA7CisgICAgICAgICAgICBleHRfY3RybFs0Nl0udmFsdWUgPSBwQ1RYLT5oaWVyX3FwX3ZhbHVlLnQzX2ZyYW1lX3FwOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgZXh0X2N0cmxbNDNdLmlkID0gIFY0TDJfQ0lEX0NPREVDX01GQzVYX0VOQ19IMjY0X0hJRVJfUF9FTkFCTEU7CisgICAgICAgICAgICBleHRfY3RybFs0M10udmFsdWUgPSBWNEwyX0NPREVDX01GQzVYX0VOQ19TV19ESVNBQkxFOworICAgICAgICAgICAgZXh0X2N0cmxbNDRdLmlkID0gIFY0TDJfQ0lEX0NPREVDX01GQzVYX0VOQ19IMjY0X0xBWUVSMF9RUDsKKyAgICAgICAgICAgIGV4dF9jdHJsWzQ0XS52YWx1ZSA9IDA7CisgICAgICAgICAgICBleHRfY3RybFs0NV0uaWQgPSAgVjRMMl9DSURfQ09ERUNfTUZDNVhfRU5DX0gyNjRfTEFZRVIxX1FQOworICAgICAgICAgICAgZXh0X2N0cmxbNDVdLnZhbHVlID0gMDsKKyAgICAgICAgICAgIGV4dF9jdHJsWzQ2XS5pZCA9ICBWNEwyX0NJRF9DT0RFQ19NRkM1WF9FTkNfSDI2NF9MQVlFUjJfUVA7CisgICAgICAgICAgICBleHRfY3RybFs0Nl0udmFsdWUgPSAwOworICAgICAgICAgICAgfQorI2lmZGVmIFMzRF9TVVBQT1JUCisgICAgICAgIGlmIChwQ1RYLT5zZWlfaW5mby5zZWlfZ2VuX2VuYWJsZSkgeworICAgICAgICAgICAgZXh0X2N0cmxbNDddLmlkID0gIFY0TDJfQ0lEX0NPREVDX0ZSQU1FX1BBQ0tfRlJNMF9GTEFHOworICAgICAgICAgICAgZXh0X2N0cmxbNDddLnZhbHVlID0gcENUWC0+c2VpX2luZm8uY3Vycl9mcmFtZV9mcm0wX2ZsYWc7CisgICAgICAgICAgICBleHRfY3RybFs0OF0uaWQgPSAgVjRMMl9DSURfQ09ERUNfRlJBTUVfUEFDS19BUlJHTUVOVF9UWVBFOworICAgICAgICAgICAgZXh0X2N0cmxbNDhdLnZhbHVlID0gcENUWC0+c2VpX2luZm8uZnJhbWVfcGFja19hcnJnbWVudF90eXBlOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgZXh0X2N0cmxbNDddLmlkID0gIFY0TDJfQ0lEX0NPREVDX0ZSQU1FX1BBQ0tfRlJNMF9GTEFHOworICAgICAgICAgICAgZXh0X2N0cmxbNDddLnZhbHVlID0gMDsKKyAgICAgICAgICAgIGV4dF9jdHJsWzQ4XS5pZCA9ICBWNEwyX0NJRF9DT0RFQ19GUkFNRV9QQUNLX0FSUkdNRU5UX1RZUEU7CisgICAgICAgICAgICBleHRfY3RybFs0OF0udmFsdWUgPSAzOworICAgICAgICB9CisjZWxzZQorICAgICAgICBleHRfY3RybFs0N10uaWQgPSAgVjRMMl9DSURfQ09ERUNfRlJBTUVfUEFDS19GUk0wX0ZMQUc7CisgICAgICAgIGV4dF9jdHJsWzQ3XS52YWx1ZSA9IDA7CisgICAgICAgIGV4dF9jdHJsWzQ4XS5pZCA9ICBWNEwyX0NJRF9DT0RFQ19GUkFNRV9QQUNLX0FSUkdNRU5UX1RZUEU7CisgICAgICAgIGV4dF9jdHJsWzQ4XS52YWx1ZSA9IDM7CisjZW5kaWYKKyNpZiBkZWZpbmVkIChNRkM1eF9WRVJTSU9OKQorICAgICAgICBleHRfY3RybFs0OV0uaWQgPSBWNEwyX0NJRF9DT0RFQ19NRkM1WF9FTkNfUkNfRklYRURfVEFSR0VUX0JJVDsgLyogTUZDNS54IE9ubHkgKi8KKyAgICAgICAgZXh0X2N0cmxbNDldLnZhbHVlID0gVjRMMl9DT0RFQ19NRkM1WF9FTkNfU1dfRU5BQkxFOworI2VsaWYgZGVmaW5lZCAoTUZDNnhfVkVSU0lPTikKKyAgICAgICAgaWYgKHBDVFgtPmZtb19lbmFibGUpIHsKKyAgICAgICAgICAgIGV4dF9jdHJsWzQ5XS5pZCA9ICBWNEwyX0NJRF9DT0RFQ19NRkM1WF9FTkNfSDI2NF9GTU9fRU5BQkxFOworICAgICAgICAgICAgZXh0X2N0cmxbNDldLnZhbHVlID0gVjRMMl9DT0RFQ19NRkM1WF9FTkNfU1dfRU5BQkxFOworICAgICAgICAgICAgZXh0X2N0cmxbNTBdLmlkID0gIFY0TDJfQ0lEX0NPREVDX01GQzVYX0VOQ19IMjY0X0ZNT19NQVBfVFlQRTsKKyAgICAgICAgICAgIGV4dF9jdHJsWzUwXS52YWx1ZSA9IHBDVFgtPmZtb192YWx1ZS5zbGljZV9tYXBfdHlwZTsKKyAgICAgICAgICAgIGV4dF9jdHJsWzUxXS5pZCA9ICBWNEwyX0NJRF9DT0RFQ19NRkM1WF9FTkNfSDI2NF9GTU9fU0xJQ0VfTlVNOworICAgICAgICAgICAgZXh0X2N0cmxbNTFdLnZhbHVlID0gcENUWC0+Zm1vX3ZhbHVlLnNsaWNlX251bV9ncnA7CisgICAgICAgICAgICBpZiAocENUWC0+Zm1vX3ZhbHVlLnNsaWNlX21hcF90eXBlID09IDApIHsKKyAgICAgICAgICAgICAgICBleHRfY3RybFs1Ml0uaWQgPSAgVjRMMl9DSURfQ09ERUNfTUZDNVhfRU5DX0gyNjRfRk1PX1JVTl9MRU4xOworICAgICAgICAgICAgICAgIGV4dF9jdHJsWzUzXS5pZCA9ICBWNEwyX0NJRF9DT0RFQ19NRkM1WF9FTkNfSDI2NF9GTU9fUlVOX0xFTjI7CisgICAgICAgICAgICAgICAgZXh0X2N0cmxbNTRdLmlkID0gIFY0TDJfQ0lEX0NPREVDX01GQzVYX0VOQ19IMjY0X0ZNT19SVU5fTEVOMzsKKyAgICAgICAgICAgICAgICBleHRfY3RybFs1NV0uaWQgPSAgVjRMMl9DSURfQ09ERUNfTUZDNVhfRU5DX0gyNjRfRk1PX1JVTl9MRU40OworICAgICAgICAgICAgZm9yIChpID0gMDsgaSA8IHBDVFgtPmZtb192YWx1ZS5zbGljZV9udW1fZ3JwOyBpKyspCisgICAgICAgICAgICAgICAgZXh0X2N0cmxbNTIraV0udmFsdWUgPSBwQ1RYLT5mbW9fdmFsdWUucnVuX2xlbmd0aFtpXTsKKyAgICAgICAgICAgIGZvciAoaSA9IHBDVFgtPmZtb192YWx1ZS5zbGljZV9udW1fZ3JwOyBpIDwgNDsgaSsrKTsKKyAgICAgICAgICAgICAgICBleHRfY3RybFs1MitpXS52YWx1ZSA9IDE7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIGV4dF9jdHJsWzUyXS5pZCA9ICBWNEwyX0NJRF9DT0RFQ19NRkM1WF9FTkNfSDI2NF9GTU9fUlVOX0xFTjE7CisgICAgICAgICAgICAgICAgZXh0X2N0cmxbNTJdLnZhbHVlID0gMTsKKyAgICAgICAgICAgICAgICBleHRfY3RybFs1M10uaWQgPSAgVjRMMl9DSURfQ09ERUNfTUZDNVhfRU5DX0gyNjRfRk1PX1JVTl9MRU4yOworICAgICAgICAgICAgICAgIGV4dF9jdHJsWzUzXS52YWx1ZSA9IDE7CisgICAgICAgICAgICAgICAgZXh0X2N0cmxbNTRdLmlkID0gIFY0TDJfQ0lEX0NPREVDX01GQzVYX0VOQ19IMjY0X0ZNT19SVU5fTEVOMzsKKyAgICAgICAgICAgICAgICBleHRfY3RybFs1NF0udmFsdWUgPSAxOworICAgICAgICAgICAgICAgIGV4dF9jdHJsWzU1XS5pZCA9ICBWNEwyX0NJRF9DT0RFQ19NRkM1WF9FTkNfSDI2NF9GTU9fUlVOX0xFTjQ7CisgICAgICAgICAgICAgICAgZXh0X2N0cmxbNTVdLnZhbHVlID0gMTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmIChwQ1RYLT5mbW9fdmFsdWUuc2xpY2VfbWFwX3R5cGUgPT0gNCB8fCBwQ1RYLT5mbW9fdmFsdWUuc2xpY2VfbWFwX3R5cGUgPT0gNSkgeworICAgICAgICAgICAgICAgIGV4dF9jdHJsWzU2XS5pZCA9ICBWNEwyX0NJRF9DT0RFQ19NRkM1WF9FTkNfSDI2NF9GTU9fU0dfRElSOworICAgICAgICAgICAgICAgIGV4dF9jdHJsWzU2XS52YWx1ZSA9IHBDVFgtPmZtb192YWx1ZS5zZ19kaXI7CisgICAgICAgICAgICAgICAgZXh0X2N0cmxbNTddLmlkID0gIFY0TDJfQ0lEX0NPREVDX01GQzVYX0VOQ19IMjY0X0ZNT19TR19SQVRFOworICAgICAgICAgICAgICAgIGV4dF9jdHJsWzU3XS52YWx1ZSA9IHBDVFgtPmZtb192YWx1ZS5zZ19yYXRlOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBleHRfY3RybFs1Nl0uaWQgPSAgVjRMMl9DSURfQ09ERUNfTUZDNVhfRU5DX0gyNjRfRk1PX1NHX0RJUjsKKyAgICAgICAgICAgICAgICBleHRfY3RybFs1Nl0udmFsdWUgPSAwOworICAgICAgICAgICAgICAgIGV4dF9jdHJsWzU3XS5pZCA9ICBWNEwyX0NJRF9DT0RFQ19NRkM1WF9FTkNfSDI2NF9GTU9fU0dfUkFURTsKKyAgICAgICAgICAgICAgICBleHRfY3RybFs1N10udmFsdWUgPSAxOworICAgICAgICAgICAgfQorICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgZXh0X2N0cmxbNDldLmlkID0gIFY0TDJfQ0lEX0NPREVDX01GQzVYX0VOQ19IMjY0X0ZNT19FTkFCTEU7CisgICAgICAgICAgICBleHRfY3RybFs0OV0udmFsdWUgPSBWNEwyX0NPREVDX01GQzVYX0VOQ19TV19ESVNBQkxFOworICAgICAgICAgICAgZXh0X2N0cmxbNTBdLmlkID0gIFY0TDJfQ0lEX0NPREVDX01GQzVYX0VOQ19IMjY0X0ZNT19NQVBfVFlQRTsKKyAgICAgICAgICAgIGV4dF9jdHJsWzUwXS52YWx1ZSA9IDA7CisgICAgICAgICAgICBleHRfY3RybFs1MV0uaWQgPSAgVjRMMl9DSURfQ09ERUNfTUZDNVhfRU5DX0gyNjRfRk1PX1NMSUNFX05VTTsKKyAgICAgICAgICAgIGV4dF9jdHJsWzUxXS52YWx1ZSA9IDE7CisgICAgICAgICAgICBleHRfY3RybFs1Ml0uaWQgPSAgVjRMMl9DSURfQ09ERUNfTUZDNVhfRU5DX0gyNjRfRk1PX1JVTl9MRU4xOworICAgICAgICAgICAgZXh0X2N0cmxbNTJdLnZhbHVlID0gMTsKKyAgICAgICAgICAgIGV4dF9jdHJsWzUzXS5pZCA9ICBWNEwyX0NJRF9DT0RFQ19NRkM1WF9FTkNfSDI2NF9GTU9fUlVOX0xFTjI7CisgICAgICAgICAgICBleHRfY3RybFs1M10udmFsdWUgPSAxOworICAgICAgICAgICAgZXh0X2N0cmxbNTRdLmlkID0gIFY0TDJfQ0lEX0NPREVDX01GQzVYX0VOQ19IMjY0X0ZNT19SVU5fTEVOMzsKKyAgICAgICAgICAgIGV4dF9jdHJsWzU0XS52YWx1ZSA9IDE7CisgICAgICAgICAgICBleHRfY3RybFs1NV0uaWQgPSAgVjRMMl9DSURfQ09ERUNfTUZDNVhfRU5DX0gyNjRfRk1PX1JVTl9MRU40OworICAgICAgICAgICAgZXh0X2N0cmxbNTVdLnZhbHVlID0gMTsKKyAgICAgICAgICAgIGV4dF9jdHJsWzU2XS5pZCA9ICBWNEwyX0NJRF9DT0RFQ19NRkM1WF9FTkNfSDI2NF9GTU9fU0dfRElSOworICAgICAgICAgICAgZXh0X2N0cmxbNTZdLnZhbHVlID0gMDsKKyAgICAgICAgICAgIGV4dF9jdHJsWzU3XS5pZCA9ICBWNEwyX0NJRF9DT0RFQ19NRkM1WF9FTkNfSDI2NF9GTU9fU0dfUkFURTsKKyAgICAgICAgICAgIGV4dF9jdHJsWzU3XS52YWx1ZSA9IDE7CisgICAgICAgIH0KKyAgICAgICAgaWYgKHBDVFgtPmFzb19lbmFibGUpIHsKKyAgICAgICAgICAgIGV4dF9jdHJsWzU4XS5pZCA9ICBWNEwyX0NJRF9DT0RFQ19NRkM1WF9FTkNfSDI2NF9BU09fRU5BQkxFOworICAgICAgICAgICAgZXh0X2N0cmxbNThdLnZhbHVlID0gVjRMMl9DT0RFQ19NRkM1WF9FTkNfU1dfRU5BQkxFOworICAgICAgICAgICAgZXh0X2N0cmxbNTldLmlkID0gIFY0TDJfQ0lEX0NPREVDX01GQzVYX0VOQ19IMjY0X0FTT19TTF9PUkRFUl8wOworICAgICAgICAgICAgZXh0X2N0cmxbNTldLnZhbHVlID0gcENUWC0+YXNvX3NsX29yZGVyWzBdOworICAgICAgICAgICAgZXh0X2N0cmxbNjBdLmlkID0gIFY0TDJfQ0lEX0NPREVDX01GQzVYX0VOQ19IMjY0X0FTT19TTF9PUkRFUl8xOworICAgICAgICAgICAgZXh0X2N0cmxbNjBdLnZhbHVlID0gcENUWC0+YXNvX3NsX29yZGVyWzFdOworICAgICAgICAgICAgZXh0X2N0cmxbNjFdLmlkID0gIFY0TDJfQ0lEX0NPREVDX01GQzVYX0VOQ19IMjY0X0FTT19TTF9PUkRFUl8yOworICAgICAgICAgICAgZXh0X2N0cmxbNjFdLnZhbHVlID0gcENUWC0+YXNvX3NsX29yZGVyWzJdOworICAgICAgICAgICAgZXh0X2N0cmxbNjJdLmlkID0gIFY0TDJfQ0lEX0NPREVDX01GQzVYX0VOQ19IMjY0X0FTT19TTF9PUkRFUl8zOworICAgICAgICAgICAgZXh0X2N0cmxbNjJdLnZhbHVlID0gcENUWC0+YXNvX3NsX29yZGVyWzNdOworICAgICAgICAgICAgZXh0X2N0cmxbNjNdLmlkID0gIFY0TDJfQ0lEX0NPREVDX01GQzVYX0VOQ19IMjY0X0FTT19TTF9PUkRFUl80OworICAgICAgICAgICAgZXh0X2N0cmxbNjNdLnZhbHVlID0gcENUWC0+YXNvX3NsX29yZGVyWzRdOworICAgICAgICAgICAgZXh0X2N0cmxbNjRdLmlkID0gIFY0TDJfQ0lEX0NPREVDX01GQzVYX0VOQ19IMjY0X0FTT19TTF9PUkRFUl81OworICAgICAgICAgICAgZXh0X2N0cmxbNjRdLnZhbHVlID0gcENUWC0+YXNvX3NsX29yZGVyWzVdOworICAgICAgICAgICAgZXh0X2N0cmxbNjVdLmlkID0gIFY0TDJfQ0lEX0NPREVDX01GQzVYX0VOQ19IMjY0X0FTT19TTF9PUkRFUl82OworICAgICAgICAgICAgZXh0X2N0cmxbNjVdLnZhbHVlID0gcENUWC0+YXNvX3NsX29yZGVyWzZdOworICAgICAgICAgICAgZXh0X2N0cmxbNjZdLmlkID0gIFY0TDJfQ0lEX0NPREVDX01GQzVYX0VOQ19IMjY0X0FTT19TTF9PUkRFUl83OworICAgICAgICAgICAgZXh0X2N0cmxbNjZdLnZhbHVlID0gcENUWC0+YXNvX3NsX29yZGVyWzddOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgZXh0X2N0cmxbNThdLmlkID0gIFY0TDJfQ0lEX0NPREVDX01GQzVYX0VOQ19IMjY0X0FTT19FTkFCTEU7CisgICAgICAgICAgICBleHRfY3RybFs1OF0udmFsdWUgPSBWNEwyX0NPREVDX01GQzVYX0VOQ19TV19ESVNBQkxFOworICAgICAgICAgICAgZXh0X2N0cmxbNTldLmlkID0gIFY0TDJfQ0lEX0NPREVDX01GQzVYX0VOQ19IMjY0X0FTT19TTF9PUkRFUl8wOworICAgICAgICAgICAgZXh0X2N0cmxbNTldLnZhbHVlID0gMDsKKyAgICAgICAgICAgIGV4dF9jdHJsWzYwXS5pZCA9ICBWNEwyX0NJRF9DT0RFQ19NRkM1WF9FTkNfSDI2NF9BU09fU0xfT1JERVJfMTsKKyAgICAgICAgICAgIGV4dF9jdHJsWzYwXS52YWx1ZSA9IDA7CisgICAgICAgICAgICBleHRfY3RybFs2MV0uaWQgPSAgVjRMMl9DSURfQ09ERUNfTUZDNVhfRU5DX0gyNjRfQVNPX1NMX09SREVSXzI7CisgICAgICAgICAgICBleHRfY3RybFs2MV0udmFsdWUgPSAwOworICAgICAgICAgICAgZXh0X2N0cmxbNjJdLmlkID0gIFY0TDJfQ0lEX0NPREVDX01GQzVYX0VOQ19IMjY0X0FTT19TTF9PUkRFUl8zOworICAgICAgICAgICAgZXh0X2N0cmxbNjJdLnZhbHVlID0gMDsKKyAgICAgICAgICAgIGV4dF9jdHJsWzYzXS5pZCA9ICBWNEwyX0NJRF9DT0RFQ19NRkM1WF9FTkNfSDI2NF9BU09fU0xfT1JERVJfNDsKKyAgICAgICAgICAgIGV4dF9jdHJsWzYzXS52YWx1ZSA9IDA7CisgICAgICAgICAgICBleHRfY3RybFs2NF0uaWQgPSAgVjRMMl9DSURfQ09ERUNfTUZDNVhfRU5DX0gyNjRfQVNPX1NMX09SREVSXzU7CisgICAgICAgICAgICBleHRfY3RybFs2NF0udmFsdWUgPSAwOworICAgICAgICAgICAgZXh0X2N0cmxbNjVdLmlkID0gIFY0TDJfQ0lEX0NPREVDX01GQzVYX0VOQ19IMjY0X0FTT19TTF9PUkRFUl82OworICAgICAgICAgICAgZXh0X2N0cmxbNjVdLnZhbHVlID0gMDsKKyAgICAgICAgICAgIGV4dF9jdHJsWzY2XS5pZCA9ICBWNEwyX0NJRF9DT0RFQ19NRkM1WF9FTkNfSDI2NF9BU09fU0xfT1JERVJfNzsKKyAgICAgICAgICAgIGV4dF9jdHJsWzY2XS52YWx1ZSA9IDA7CisgICAgICAgIH0KKyNlbmRpZgorICAgICAgICBicmVhazsKKworICAgIGRlZmF1bHQ6CisgICAgICAgIExPR0UoIlslc10gVW5kZWZpbmVkIGNvZGVjIHR5cGUiLF9fZnVuY19fKTsKKyAgICAgICAgcmV0ID0gTUZDX1JFVF9JTlZBTElEX1BBUkFNOworICAgICAgICBnb3RvIGVycm9yX2Nhc2UxOworICAgIH0KKworICAgIGV4dF9jdHJscy5jdHJsX2NsYXNzID0gVjRMMl9DVFJMX0NMQVNTX0NPREVDOworICAgIGlmIChwQ1RYLT5jb2RlY1R5cGUgPT0gTVBFRzRfRU5DKSB7CisgICAgICAgIGV4dF9jdHJscy5jb3VudCA9IE1QRUc0X0NUUkxfTlVNOworICAgICAgICBleHRfY3RybHMuY29udHJvbHMgPSBleHRfY3RybF9tcGVnNDsKKyAgICB9IGVsc2UgaWYgKHBDVFgtPmNvZGVjVHlwZSA9PSBIMjY0X0VOQykgeworICAgICAgICBleHRfY3RybHMuY291bnQgPSBIMjY0X0NUUkxfTlVNOworICAgICAgICBleHRfY3RybHMuY29udHJvbHMgPSBleHRfY3RybDsKKyAgICB9IGVsc2UgaWYgKHBDVFgtPmNvZGVjVHlwZSA9PSBIMjYzX0VOQykgeworICAgICAgICBleHRfY3RybHMuY291bnQgPSBIMjYzX0NUUkxfTlVNOworICAgICAgICBleHRfY3RybHMuY29udHJvbHMgPSBleHRfY3RybF9oMjYzOworICAgIH0KKworICAgIHJldCA9IGlvY3RsKHBDVFgtPmhNRkMsIFZJRElPQ19TX0VYVF9DVFJMUywgJmV4dF9jdHJscyk7CisgICAgaWYgKHJldCAhPSAwKSB7CisgICAgICAgIExPR0UoIlslc10gRmFpbGVkIHRvIHNldCBleHRlbmRlZCBjb250cm9scyIsX19mdW5jX18pOworICAgICAgICByZXQgPSBNRkNfUkVUX0VOQ19JTklUX0ZBSUw7CisgICAgICAgIGdvdG8gZXJyb3JfY2FzZTE7CisgICAgfQorCisgICAgbWVtc2V0KCZmbXQsIDAsIHNpemVvZihmbXQpKTsKKyAgICBmbXQudHlwZSA9IFY0TDJfQlVGX1RZUEVfVklERU9fT1VUUFVUX01QTEFORTsKKworICAgIGZtdC5mbXQucGl4X21wLndpZHRoID0gcENUWC0+d2lkdGg7CisgICAgZm10LmZtdC5waXhfbXAuaGVpZ2h0ID0gcENUWC0+aGVpZ2h0OworICAgIGZtdC5mbXQucGl4X21wLm51bV9wbGFuZXMgPSAyOworI2lmIDAKKyAgICBmbXQuZm10LnBpeF9tcC5wbGFuZV9mbXRbMF0uYnl0ZXNwZXJsaW5lID0gQWxpZ24oZm10LmZtdC5waXhfbXAud2lkdGgsIDEyOCk7CisgICAgZm10LmZtdC5waXhfbXAucGxhbmVfZm10WzFdLmJ5dGVzcGVybGluZSA9IEFsaWduKGZtdC5mbXQucGl4X21wLndpZHRoLCAxMjgpOworCisgICAgaWYgKE5WMTJfVElMRSA9PSBwQ1RYLT5mcmFtZW1hcCkgeworICAgICAgICBmbXQuZm10LnBpeF9tcC5waXhlbGZvcm1hdCA9IFY0TDJfUElYX0ZNVF9OVjEyTVQ7IC8qIDQ6MjowLCAyIFBsYW5lcywgNjR4MzIgVGlsZXMgKi8KKyAgICAgICAgZm10LmZtdC5waXhfbXAucGxhbmVfZm10WzBdLnNpemVpbWFnZSA9CisgICAgICAgICAgICBBbGlnbihBbGlnbihmbXQuZm10LnBpeF9tcC53aWR0aCwgMTI4KSAqIEFsaWduKGZtdC5mbXQucGl4X21wLmhlaWdodCwgMzIpLCA4MTkyKTsgLyogdGlsZWQgbW9kZSAqLworICAgICAgICBmbXQuZm10LnBpeF9tcC5wbGFuZV9mbXRbMV0uc2l6ZWltYWdlID0KKyAgICAgICAgICAgIEFsaWduKEFsaWduKGZtdC5mbXQucGl4X21wLndpZHRoLCAxMjgpICogQWxpZ24oZm10LmZtdC5waXhfbXAuaGVpZ2h0ID4+IDEsIDMyKSwgODE5Mik7IC8qIHRpbGVkIG1vZGUgKi8KKyAgICB9IGVsc2UgeyAvKiBOVjEyX0xJTkVBUiAoZGVmYXVsdCkgKi8KKyAgICAgICAgZm10LmZtdC5waXhfbXAucGl4ZWxmb3JtYXQgPSBWNEwyX1BJWF9GTVRfTlYxMk07IC8qIDQ6MjowLCAyIFBsYW5lcywgbGluZWFyICovCisgICAgICAgIGZtdC5mbXQucGl4X21wLnBsYW5lX2ZtdFswXS5zaXplaW1hZ2UgPQorICAgICAgICAgICAgQWxpZ24oKGZtdC5mbXQucGl4X21wLndpZHRoICogZm10LmZtdC5waXhfbXAuaGVpZ2h0KSwgMjA0OCk7IC8qIGxpbmVhciBtb2RlLCAySyBhbGlnbiAqLworICAgICAgICBmbXQuZm10LnBpeF9tcC5wbGFuZV9mbXRbMV0uc2l6ZWltYWdlID0KKyAgICAgICAgICAgIEFsaWduKChmbXQuZm10LnBpeF9tcC53aWR0aCAqIChmbXQuZm10LnBpeF9tcC5oZWlnaHQgPj4gMSkpLCAyMDQ4KTsgLyogbGluZWFyIG1vZGUsIDJLIGFsaWduICovCisgICAgfQorI2Vsc2UgICAvKiBGSVhNRTogKi8KKyAgICBpZiAoTlYxMl9USUxFID09IHBDVFgtPmZyYW1lbWFwKSB7CisgICAgICAgIGZtdC5mbXQucGl4X21wLnBpeGVsZm9ybWF0ID0gVjRMMl9QSVhfRk1UX05WMTJNVF8xNlgxNjsgLyogNDoyOjAsIDIgUGxhbmVzLCAxNngxNiBUaWxlcyAqLworICAgIH0gZWxzZSB7IC8qIE5WMTJfTElORUFSIChkZWZhdWx0KSAqLworICAgICAgICBmbXQuZm10LnBpeF9tcC5waXhlbGZvcm1hdCA9IFY0TDJfUElYX0ZNVF9OVjEyTTsgLyogNDoyOjAsIDIgUGxhbmVzLCBsaW5lYXIgKi8KKyAgICB9CisjZW5kaWYKKworICAgIHJldCA9IGlvY3RsKHBDVFgtPmhNRkMsIFZJRElPQ19TX0ZNVCwgJmZtdCk7CisgICAgaWYgKHJldCAhPSAwKSB7CisgICAgICAgIExPR0UoIlslc10gU19GTVQgZmFpbGVkIG9uIE1GQyBvdXRwdXQgc3RyZWFtIixfX2Z1bmNfXyk7CisgICAgICAgIHJldCA9IE1GQ19SRVRfRU5DX0lOSVRfRkFJTDsKKyAgICAgICAgZ290byBlcnJvcl9jYXNlMTsKKyAgICB9CisKKyAgICAvKiBjYXB0dXJlIChkc3QpICovCisgICAgbWVtc2V0KCZmbXQsIDAsIHNpemVvZihmbXQpKTsKKworICAgIHN3aXRjaCAocENUWC0+Y29kZWNUeXBlKSB7CisgICAgY2FzZSBIMjY0X0VOQzoKKyAgICAgICAgZm10LmZtdC5waXhfbXAucGl4ZWxmb3JtYXQgPSBWNEwyX1BJWF9GTVRfSDI2NDsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBNUEVHNF9FTkM6CisgICAgICAgIGZtdC5mbXQucGl4X21wLnBpeGVsZm9ybWF0ID0gVjRMMl9QSVhfRk1UX01QRUc0OworICAgICAgICBicmVhazsKKyAgICBjYXNlIEgyNjNfRU5DOgorICAgICAgICBmbXQuZm10LnBpeF9tcC5waXhlbGZvcm1hdCA9IFY0TDJfUElYX0ZNVF9IMjYzOworICAgICAgICBicmVhazsKKyAgICBkZWZhdWx0OgorICAgICAgICBMT0dFKCJbJXNdIENvZGVjIGhhcyBub3QgYmVlbiByZWNvZ25pc2VkIixfX2Z1bmNfXyk7CisgICAgICAgIHJldHVybiBNRkNfUkVUX0VOQ19JTklUX0ZBSUw7CisgICAgfQorCisgICAgZm10LnR5cGUgPSBWNEwyX0JVRl9UWVBFX1ZJREVPX0NBUFRVUkVfTVBMQU5FOworICAgIGZtdC5mbXQucGl4X21wLnBsYW5lX2ZtdFswXS5zaXplaW1hZ2UgPSBNQVhfU1RSRUFNX1NJWkU7CisKKyAgICByZXQgPSBpb2N0bChwQ1RYLT5oTUZDLCBWSURJT0NfU19GTVQsICZmbXQpOworICAgIGlmIChyZXQgIT0gMCkgeworICAgICAgICBMT0dFKCJbJXNdIFNfRk1UIGZhaWxlZCBvbiBNRkMgb3V0cHV0IHN0cmVhbSIsX19mdW5jX18pOworICAgICAgICByZXQgPSBNRkNfUkVUX0VOQ19JTklUX0ZBSUw7CisgICAgICAgIGdvdG8gZXJyb3JfY2FzZTE7CisgICAgfQorCisgICAgLyogY2FjaGVhYmxlIGJ1ZmZlciAqLworICAgIGN0cmwuaWQgPSBWNEwyX0NJRF9DQUNIRUFCTEU7CisgICAgaWYgKHBDVFgtPmNhY2hlYWJsZWJ1ZmZlciA9PSBOT19DQUNIRSkKKyAgICAgICAgY3RybC52YWx1ZSA9IDA7CisgICAgZWxzZQorICAgICAgICBjdHJsLnZhbHVlID0gMTsKKworICAgIHJldCA9IGlvY3RsKHBDVFgtPmhNRkMsIFZJRElPQ19TX0NUUkwsICZjdHJsKTsKKyAgICBpZiAocmV0ICE9IDApIHsKKyAgICAgICAgTE9HRSgiWyVzXSBWSURJT0NfU19DVFJMIGZhaWxlZCwgVjRMMl9DSURfQ0FDSEVBQkxFIixfX2Z1bmNfXyk7CisgICAgICAgIHJldCA9IE1GQ19SRVRfRU5DX0lOSVRfRkFJTDsKKyAgICAgICAgZ290byBlcnJvcl9jYXNlMTsKKyAgICB9CisKKyAgICAvKiBJbml0aWFsaXplIHN0cmVhbXMgZm9yIGlucHV0ICovCisgICAgbWVtc2V0KCZyZXFidWYsIDAsIHNpemVvZihyZXFidWYpKTsKKyAgICByZXFidWYuY291bnQgID0gTUZDX0VOQ19OVU1fU1JDX0JVRlM7CisgICAgcmVxYnVmLnR5cGUgICA9IFY0TDJfQlVGX1RZUEVfVklERU9fT1VUUFVUX01QTEFORTsKKyAgICBpZiAocENUWC0+djRsMl9lbmMuYklucHV0UGh5VmlyKQorICAgICAgICByZXFidWYubWVtb3J5ID0gVjRMMl9NRU1PUllfVVNFUlBUUjsKKyAgICBlbHNlCisgICAgICAgIHJlcWJ1Zi5tZW1vcnkgPSBWNEwyX01FTU9SWV9NTUFQOworCisgICAgcmV0ID0gaW9jdGwocENUWC0+aE1GQywgVklESU9DX1JFUUJVRlMsICZyZXFidWYpOworICAgIGlmIChyZXQgIT0gMCkgeworICAgICAgICBMT0dFKCJbJXNdIFJlcWJ1ZnMgc3JjIGlvY3RsIGZhaWxlZCIsX19mdW5jX18pOworICAgICAgICByZXQgPSBNRkNfUkVUX0VOQ19JTklUX0ZBSUw7CisgICAgICAgIGdvdG8gZXJyb3JfY2FzZTE7CisgICAgfQorICAgIHBDVFgtPnY0bDJfZW5jLm1mY19udW1fc3JjX2J1ZnMgID0gcmVxYnVmLmNvdW50OworCisgICAgaWYgKCFwQ1RYLT52NGwyX2VuYy5iSW5wdXRQaHlWaXIpIHsKKyAgICAgICAgLyogVGhlbiB0aGUgYnVmZmVycyBoYXZlIHRvIGJlIHF1ZXJpZWQgYW5kIG1tYXBlZCAqLworICAgICAgICBmb3IgKGkgPSAwOyAgaSA8IHBDVFgtPnY0bDJfZW5jLm1mY19udW1fc3JjX2J1ZnM7ICsraSkgeworICAgICAgICAgICAgbWVtc2V0KCZidWYsIDAsIHNpemVvZihidWYpKTsKKyAgICAgICAgICAgIGJ1Zi50eXBlID0gVjRMMl9CVUZfVFlQRV9WSURFT19PVVRQVVRfTVBMQU5FOworICAgICAgICAgICAgYnVmLm1lbW9yeSA9IFY0TDJfTUVNT1JZX01NQVA7CisgICAgICAgICAgICBidWYuaW5kZXggPSBpOworICAgICAgICAgICAgYnVmLm0ucGxhbmVzID0gcGxhbmVzOworICAgICAgICAgICAgYnVmLmxlbmd0aCA9IDI7CisKKyAgICAgICAgICAgIHJldCA9IGlvY3RsKHBDVFgtPmhNRkMsIFZJRElPQ19RVUVSWUJVRiwgJmJ1Zik7CisgICAgICAgICAgICBpZiAocmV0ICE9IDApIHsKKyAgICAgICAgICAgICAgICBMT0dFKCJbJXNdIFF1ZXJ5YnVmIHNyYyBpb2N0bCBmYWlsZWQiLF9fZnVuY19fKTsKKyAgICAgICAgICAgICAgICByZXQgPSBNRkNfUkVUX0VOQ19JTklUX0ZBSUw7CisgICAgICAgICAgICAgICAgZ290byBlcnJvcl9jYXNlMjsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgcENUWC0+djRsMl9lbmMubWZjX3NyY19idWZzX2xlblswXSA9IGJ1Zi5tLnBsYW5lc1swXS5sZW5ndGg7CisgICAgICAgICAgICBwQ1RYLT52NGwyX2VuYy5tZmNfc3JjX2J1ZnNfbGVuWzFdID0gYnVmLm0ucGxhbmVzWzFdLmxlbmd0aDsKKworICAgICAgICAgICAgcENUWC0+djRsMl9lbmMubWZjX3NyY19waHlzW2ldWzBdID0gYnVmLm0ucGxhbmVzWzBdLmNvb2tpZTsKKyAgICAgICAgICAgIHBDVFgtPnY0bDJfZW5jLm1mY19zcmNfcGh5c1tpXVsxXSA9IGJ1Zi5tLnBsYW5lc1sxXS5jb29raWU7CisKKyAgICAgICAgICAgIHBDVFgtPnY0bDJfZW5jLm1mY19zcmNfYnVmc1tpXVswXSA9CisgICAgICAgICAgICAgICAgbW1hcChOVUxMLCBidWYubS5wbGFuZXNbMF0ubGVuZ3RoLCBQUk9UX1JFQUQgfCBQUk9UX1dSSVRFLAorICAgICAgICAgICAgICAgIE1BUF9TSEFSRUQsIHBDVFgtPmhNRkMsIGJ1Zi5tLnBsYW5lc1swXS5tLm1lbV9vZmZzZXQpOworICAgICAgICAgICAgaWYgKHBDVFgtPnY0bDJfZW5jLm1mY19zcmNfYnVmc1tpXVswXSA9PSBNQVBfRkFJTEVEKSB7CisgICAgICAgICAgICAgICAgTE9HRSgiWyVzXSBNbWFwIG9uIHNyYyBidWZmZXIgKDApIGZhaWxlZCIsX19mdW5jX18pOworICAgICAgICAgICAgICAgIHJldCA9IE1GQ19SRVRfRU5DX0lOSVRfRkFJTDsKKyAgICAgICAgICAgICAgICBnb3RvIGVycm9yX2Nhc2UyOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBwQ1RYLT52NGwyX2VuYy5tZmNfc3JjX2J1ZnNbaV1bMV0gPQorICAgICAgICAgICAgICAgIG1tYXAoTlVMTCwgYnVmLm0ucGxhbmVzWzFdLmxlbmd0aCwgUFJPVF9SRUFEIHwgUFJPVF9XUklURSwKKyAgICAgICAgICAgICAgICBNQVBfU0hBUkVELCBwQ1RYLT5oTUZDLCBidWYubS5wbGFuZXNbMV0ubS5tZW1fb2Zmc2V0KTsKKyAgICAgICAgICAgIGlmIChwQ1RYLT52NGwyX2VuYy5tZmNfc3JjX2J1ZnNbaV1bMV0gPT0gTUFQX0ZBSUxFRCkgeworICAgICAgICAgICAgICAgIG11bm1hcChwQ1RYLT52NGwyX2VuYy5tZmNfc3JjX2J1ZnNbaV1bMF0sIHBDVFgtPnY0bDJfZW5jLm1mY19zcmNfYnVmc19sZW5bMF0pOworICAgICAgICAgICAgICAgIExPR0UoIlslc10gTW1hcCBvbiBzcmMgYnVmZmVyICgxKSBmYWlsZWQiLF9fZnVuY19fKTsKKyAgICAgICAgICAgICAgICByZXQgPSBNRkNfUkVUX0VOQ19JTklUX0ZBSUw7CisgICAgICAgICAgICAgICAgZ290byBlcnJvcl9jYXNlMjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0gZWxzZQorICAgICAgICBMT0dWKCJbJXNdIENhbWVyYSBQaHlzIHNyYyBidWYgJWQiLF9fZnVuY19fLHJlcWJ1Zi5jb3VudCk7CisKKyAgICBmb3IgKGkgPSAwOyBpIDwgcENUWC0+djRsMl9lbmMubWZjX251bV9zcmNfYnVmczsgaSsrKQorICAgICAgICBwQ1RYLT52NGwyX2VuYy5tZmNfc3JjX2J1Zl9mbGFnc1tpXSA9IEJVRl9ERVFVRVVFRDsKKworICAgIHBDVFgtPnY0bDJfZW5jLmJlaW5nVXNlZEluZGV4ID0gMDsKKworICAgIHBDVFgtPnNpemVGcm1CdWYubHVtYSA9ICh1bnNpZ25lZCBpbnQpKHBDVFgtPndpZHRoICogcENUWC0+aGVpZ2h0KTsKKyAgICBwQ1RYLT5zaXplRnJtQnVmLmNocm9tYSA9ICh1bnNpZ25lZCBpbnQpKChwQ1RYLT53aWR0aCAqIHBDVFgtPmhlaWdodCkgPj4gMSk7CisgICAgcENUWC0+aW50ZXJfYnVmZl9zdGF0dXMgfD0gTUZDX1VTRV9ZVVZfQlVGRjsKKworICAgIC8qIEluaXRpYWxpemUgc3RyZWFtIGZvciBvdXRwdXQgKi8KKyAgICBtZW1zZXQoJnJlcWJ1ZiwgMCwgc2l6ZW9mKHJlcWJ1ZikpOworICAgIHJlcWJ1Zi5jb3VudCAgPSBNRkNfRU5DX01BWF9EU1RfQlVGUzsKKyAgICByZXFidWYudHlwZSAgID0gVjRMMl9CVUZfVFlQRV9WSURFT19DQVBUVVJFX01QTEFORTsKKyAgICByZXFidWYubWVtb3J5ID0gVjRMMl9NRU1PUllfTU1BUDsKKworICAgIHJldCA9IGlvY3RsKHBDVFgtPmhNRkMsIFZJRElPQ19SRVFCVUZTLCAmcmVxYnVmKTsKKyAgICBpZiAocmV0ICE9IDApIHsKKyAgICAgICAgTE9HRSgiWyVzXSBSZXFidWZzIGRzdCBpb2N0bCBmYWlsZWQiLF9fZnVuY19fKTsKKyAgICAgICAgcmV0ID0gTUZDX1JFVF9FTkNfSU5JVF9GQUlMOworICAgICAgICBnb3RvIGVycm9yX2Nhc2UyOworICAgIH0KKworICAgIHBDVFgtPnY0bDJfZW5jLm1mY19udW1fZHN0X2J1ZnMgICA9IHJlcWJ1Zi5jb3VudDsKKworICAgIGZvciAoaSA9IDA7IGkgPCBNRkNfRU5DX01BWF9EU1RfQlVGUzsgKytpKSB7CisgICAgICAgIG1lbXNldCgmYnVmLCAwLCBzaXplb2YoYnVmKSk7CisgICAgICAgIGJ1Zi50eXBlID0gVjRMMl9CVUZfVFlQRV9WSURFT19DQVBUVVJFX01QTEFORTsKKyAgICAgICAgYnVmLm1lbW9yeSA9IFY0TDJfTUVNT1JZX01NQVA7CisgICAgICAgIGJ1Zi5pbmRleCA9IGk7CisgICAgICAgIGJ1Zi5tLnBsYW5lcyA9IHBsYW5lczsKKyAgICAgICAgYnVmLmxlbmd0aCA9IDE7CisKKyAgICAgICAgcmV0ID0gaW9jdGwocENUWC0+aE1GQywgVklESU9DX1FVRVJZQlVGLCAmYnVmKTsKKyAgICAgICAgaWYgKHJldCAhPSAwKSB7CisgICAgICAgICAgICBMT0dFKCJbJXNdIFF1ZXJ5YnVmIGRzdCBpb2N0bCBmYWlsZWQiLF9fZnVuY19fKTsKKyAgICAgICAgICAgIHJldCA9IE1GQ19SRVRfRU5DX0lOSVRfRkFJTDsKKyAgICAgICAgICAgIGdvdG8gZXJyb3JfY2FzZTM7CisgICAgICAgIH0KKworICAgICAgICBwQ1RYLT52NGwyX2VuYy5tZmNfZHN0X2J1ZnNfbGVuID0gYnVmLm0ucGxhbmVzWzBdLmxlbmd0aDsKKyAgICAgICAgcENUWC0+djRsMl9lbmMubWZjX2RzdF9idWZzW2ldID0KKyAgICAgICAgICAgICAgICBtbWFwKE5VTEwsIGJ1Zi5tLnBsYW5lc1swXS5sZW5ndGgsIFBST1RfUkVBRCB8IFBST1RfV1JJVEUsCisgICAgICAgICAgICAgICAgTUFQX1NIQVJFRCwgcENUWC0+aE1GQywgYnVmLm0ucGxhbmVzWzBdLm0ubWVtX29mZnNldCk7CisgICAgICAgIGlmIChwQ1RYLT52NGwyX2VuYy5tZmNfZHN0X2J1ZnNbaV0gPT0gTUFQX0ZBSUxFRCkgeworICAgICAgICAgICAgTE9HRSgiWyVzXSBNbWFwIG9uIGRzdCBidWZmZXIgZmFpbGVkIixfX2Z1bmNfXyk7CisgICAgICAgICAgICByZXQgPSBNRkNfUkVUX0VOQ19JTklUX0ZBSUw7CisgICAgICAgICAgICBnb3RvIGVycm9yX2Nhc2UzOworICAgICAgICB9CisKKyAgICAgICAgcmV0ID0gaW9jdGwocENUWC0+aE1GQywgVklESU9DX1FCVUYsICZidWYpOworICAgICAgICBpZiAocmV0ICE9IDApIHsKKyAgICAgICAgICAgIExPR0UoIlslc10gVklESU9DX1FCVUYgZmFpbGVkLCBWNEwyX0JVRl9UWVBFX1ZJREVPX0NBUFRVUkVfTVBMQU5FIixfX2Z1bmNfXyk7CisgICAgICAgICAgICByZXQgPSBNRkNfUkVUX0VOQ19JTklUX0ZBSUw7CisgICAgICAgICAgICBnb3RvIGVycm9yX2Nhc2UzOworICAgICAgICB9CisgICAgfQorCisgICAgcENUWC0+c2l6ZVN0cm1CdWYgPSBNQVhfRU5DT0RFUl9PVVRQVVRfQlVGRkVSX1NJWkU7CisgICAgcENUWC0+aW50ZXJfYnVmZl9zdGF0dXMgfD0gTUZDX1VTRV9TVFJNX0JVRkY7CisKKyAgICB0eXBlID0gVjRMMl9CVUZfVFlQRV9WSURFT19DQVBUVVJFX01QTEFORTsKKworICAgIHJldCA9IGlvY3RsKHBDVFgtPmhNRkMsIFZJRElPQ19TVFJFQU1PTiwgJnR5cGUpOworICAgIGlmIChyZXQgIT0gMCkgeworICAgICAgICBMT0dFKCJbJXNdIFY0TDJfQlVGX1RZUEVfVklERU9fQ0FQVFVSRV9NUExBTkUsIFZJRElPQ19TVFJFQU1PTiBmYWlsZWQiLF9fZnVuY19fKTsKKyAgICAgICAgcmV0ID0gTUZDX1JFVF9FTkNfSU5JVF9GQUlMOworICAgICAgICBnb3RvIGVycm9yX2Nhc2UzOworICAgIH0KKworICAgIHBDVFgtPmludGVyX2J1ZmZfc3RhdHVzIHw9IE1GQ19VU0VfRFNUX1NUUkVBTU9OOworCisgICAgbWVtc2V0KCZidWYsIDAsIHNpemVvZihidWYpKTsKKyAgICBidWYudHlwZSA9IFY0TDJfQlVGX1RZUEVfVklERU9fQ0FQVFVSRV9NUExBTkU7CisgICAgYnVmLm1lbW9yeSA9IFY0TDJfTUVNT1JZX01NQVA7CisgICAgYnVmLm0ucGxhbmVzID0gcGxhbmVzOworICAgIGJ1Zi5sZW5ndGggPSAxOworCisgICAgLyogbm90ZTogI2RlZmluZSBQT0xMT1VUIDB4MDAwNCAqLworICAgIHBvbGxfZXZlbnRzLmZkID0gcENUWC0+aE1GQzsKKyAgICBwb2xsX2V2ZW50cy5ldmVudHMgPSBQT0xMSU4gfCBQT0xMRVJSOworICAgIHBvbGxfZXZlbnRzLnJldmVudHMgPSAwOworCisgICAgLyogd2FpdCBmb3IgaGVhZGVyIGVuY29kaW5nICovCisgICAgZG8geworICAgICAgICBwb2xsX3N0YXRlID0gcG9sbCgoc3RydWN0IHBvbGxmZCopJnBvbGxfZXZlbnRzLCAxLCBQT0xMX0VOQ19XQUlUX1RJTUVPVVQpOworICAgICAgICBpZiAoMCA8IHBvbGxfc3RhdGUpIHsKKyAgICAgICAgICAgIGlmIChwb2xsX2V2ZW50cy5yZXZlbnRzICYgUE9MTElOKSB7IC8qIFBPTExJTiAqLworICAgICAgICAgICAgICAgIHJldCA9IGlvY3RsKHBDVFgtPmhNRkMsIFZJRElPQ19EUUJVRiwgJmJ1Zik7CisgICAgICAgICAgICAgICAgaWYgKHJldCA9PSAwKQorICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0gZWxzZSBpZiAocG9sbF9ldmVudHMucmV2ZW50cyAmIFBPTExFUlIpIHsgLypQT0xMRVJSICovCisgICAgICAgICAgICAgICAgTE9HRSgiWyVzXSBQT0xMRVJSXG4iLF9fZnVuY19fKTsKKyAgICAgICAgICAgICAgICByZXQgPSBNRkNfUkVUX0VOQ19JTklUX0ZBSUw7CisgICAgICAgICAgICAgICAgZ290byBlcnJvcl9jYXNlMzsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgTE9HRSgiWyVzXSBwb2xsKCkgcmV0dXJucyAweCV4XG4iLF9fZnVuY19fLCBwb2xsX2V2ZW50cy5yZXZlbnRzKTsKKyAgICAgICAgICAgICAgICByZXQgPSBNRkNfUkVUX0VOQ19JTklUX0ZBSUw7CisgICAgICAgICAgICAgICAgZ290byBlcnJvcl9jYXNlMzsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSBlbHNlIGlmICgwID4gcG9sbF9zdGF0ZSkgeworICAgICAgICAgICAgcmV0ID0gTUZDX1JFVF9FTkNfSU5JVF9GQUlMOworICAgICAgICAgICAgZ290byBlcnJvcl9jYXNlMzsKKyAgICAgICAgfQorICAgIH0gd2hpbGUgKDEgPT0gcG9sbF9zdGF0ZSk7CisKKyAgICBwQ1RYLT52NGwyX2VuYy5tZmNfZHN0X2J1ZnNfYnl0ZXNfdXNlZF9sZW4gPSBidWYubS5wbGFuZXNbMF0uYnl0ZXN1c2VkOworICAgIHBDVFgtPnZpclN0cm1CdWYgPSAodW5zaWduZWQgaW50KXBDVFgtPnY0bDJfZW5jLm1mY19kc3RfYnVmc1tidWYuaW5kZXhdOworCisgICAgLyogc3RyZWFtIGRlcXVldWVkIGluZGV4ICovCisgICAgaW5kZXggPSBidWYuaW5kZXg7CisgICAgbWVtc2V0KCZidWYsIDAsIHNpemVvZihidWYpKTsKKyAgICBidWYudHlwZSA9IFY0TDJfQlVGX1RZUEVfVklERU9fQ0FQVFVSRV9NUExBTkU7CisgICAgYnVmLm1lbW9yeSA9IFY0TDJfTUVNT1JZX01NQVA7CisgICAgYnVmLmluZGV4ID0gaW5kZXg7CisgICAgYnVmLm0ucGxhbmVzID0gcGxhbmVzOworICAgIGJ1Zi5sZW5ndGggPSAxOworCisgICAgcmV0ID0gaW9jdGwocENUWC0+aE1GQywgVklESU9DX1FCVUYsICZidWYpOworICAgIGlmIChyZXQgIT0gMCkgeworICAgICAgICBMT0dFKCJbJXNdIFZJRElPQ19RQlVGIGZhaWxlZCwgVjRMMl9CVUZfVFlQRV9WSURFT19DQVBUVVJFX01QTEFORSIsX19mdW5jX18pOworICAgICAgICByZXQgPSBNRkNfUkVUX0VOQ19JTklUX0ZBSUw7CisgICAgICAgIGdvdG8gZXJyb3JfY2FzZTM7CisgICAgfQorICAgIExPR1YoIlslc10gU3RybSBvdXQgaWR4ICVkIixfX2Z1bmNfXyxpbmRleCk7CisKKyAgICByZXR1cm4gTUZDX1JFVF9PSzsKKworZXJyb3JfY2FzZTM6CisgICAgZm9yIChqID0gMDsgaiA8IGk7IGorKykKKyAgICAgICAgbXVubWFwKHBDVFgtPnY0bDJfZW5jLm1mY19kc3RfYnVmc1tqXSwgcENUWC0+djRsMl9lbmMubWZjX2RzdF9idWZzX2xlbik7CisKKyAgICBpID0gcENUWC0+djRsMl9lbmMubWZjX251bV9zcmNfYnVmczsKK2Vycm9yX2Nhc2UyOgorICAgIGlmICghcENUWC0+djRsMl9lbmMuYklucHV0UGh5VmlyKSB7CisgICAgICAgIGZvciAoaiA9IDA7IGogPCBpOyBqKyspIHsKKyAgICAgICAgICAgIG11bm1hcChwQ1RYLT52NGwyX2VuYy5tZmNfc3JjX2J1ZnNbal1bMF0sIHBDVFgtPnY0bDJfZW5jLm1mY19zcmNfYnVmc19sZW5bMF0pOworICAgICAgICAgICAgbXVubWFwKHBDVFgtPnY0bDJfZW5jLm1mY19zcmNfYnVmc1tqXVsxXSwgcENUWC0+djRsMl9lbmMubWZjX3NyY19idWZzX2xlblsxXSk7CisgICAgICAgIH0KKyAgICB9CitlcnJvcl9jYXNlMToKKyAgICByZXR1cm4gcmV0OworfQorCitTU0JTSVBfTUZDX0VSUk9SX0NPREUgU3NiU2lwTWZjRW5jR2V0SW5CdWYodm9pZCAqb3BlbkhhbmRsZSwgU1NCU0lQX01GQ19FTkNfSU5QVVRfSU5GTyAqaW5wdXRfaW5mbykKK3sKKyAgICBfTUZDTElCICpwQ1RYOworICAgIGludCBpOworCisgICAgaWYgKG9wZW5IYW5kbGUgPT0gTlVMTCkgeworICAgICAgICBMT0dFKCJbJXNdIG9wZW5IYW5kbGUgaXMgTlVMTFxuIixfX2Z1bmNfXyk7CisgICAgICAgIHJldHVybiBNRkNfUkVUX0lOVkFMSURfUEFSQU07CisgICAgfQorCisgICAgcENUWCAgPSAoX01GQ0xJQiAqKSBvcGVuSGFuZGxlOworCisgICAgLyogRklYTUUgY2hlY2sgdGhpcyBpZiBHZXRJbkJ1ZigpIGlzIG5vdCBjYWxsZWQgZm9yIFVzZXJQdHIgKi8KKyAgICBpZiAocENUWC0+djRsMl9lbmMuYklucHV0UGh5VmlyKSB7CisgICAgICAgIGlucHV0X2luZm8tPllQaHlBZGRyID0gKHZvaWQqKTA7CisgICAgICAgIGlucHV0X2luZm8tPkNQaHlBZGRyID0gKHZvaWQqKTA7CisgICAgICAgIGlucHV0X2luZm8tPllWaXJBZGRyID0gKHZvaWQqKTA7CisgICAgICAgIGlucHV0X2luZm8tPkNWaXJBZGRyID0gKHZvaWQqKTA7CisKKyAgICAgICAgLyogRklYTUUgY2hlY2sgd2hldGhlciBZICYgQyBzaXplcyBzaG91bGQgYmUgc2V0IG9yIG5vdCovCisgICAgICAgIGlmIChOVjEyX1RJTEUgPT0gcENUWC0+ZnJhbWVtYXApIHsKKyAgICAgICAgICAgIC8qIDQ6MjowLCAyIFBsYW5lcywgNjR4MzIgVGlsZXMgKi8KKyAgICAgICAgICAgIGlucHV0X2luZm8tPllTaXplID0gQWxpZ24oQWxpZ24ocENUWC0+d2lkdGgsIDEyOCkgKiBBbGlnbihwQ1RYLT5oZWlnaHQsIDMyKSwgODE5Mik7IC8qIHRpbGVkIG1vZGUgKi8KKyAgICAgICAgICAgIGlucHV0X2luZm8tPkNTaXplID0gQWxpZ24oQWxpZ24ocENUWC0+d2lkdGgsIDEyOCkgKiBBbGlnbihwQ1RYLT5oZWlnaHQgPj4gMSwgMzIpLCA4MTkyKTsgLyogdGlsZWQgbW9kZSAqLworICAgICAgICB9IGVsc2UgeyAvKiBOVjEyX0xJTkVBUiAoZGVmYXVsdCkgKi8KKyAgICAgICAgICAgIC8qIDQ6MjowLCAyIFBsYW5lcywgbGluZWFyICovCisgICAgICAgICAgICBpbnB1dF9pbmZvLT5ZU2l6ZSA9IEFsaWduKEFsaWduKHBDVFgtPndpZHRoLCAxNikgKiBBbGlnbihwQ1RYLT5oZWlnaHQsIDE2KSwgMjA0OCk7IC8qIHdpZHRoID0gMTZCLCBoZWlnaHQgPSAxNkIgYWxpZ24gKi8KKyAgICAgICAgICAgIGlucHV0X2luZm8tPkNTaXplID0gQWxpZ24oQWxpZ24ocENUWC0+d2lkdGgsIDE2KSAqIEFsaWduKHBDVFgtPmhlaWdodCA+PiAxLCA4KSwgMjA0OCk7IC8qIHdpZHRoID0gMTZCLCBoZWlnaHQgPSA4QiBhbGlnbiAqLworICAgICAgICB9CisgICAgfSBlbHNlIHsKKyAgICAgICAgZm9yIChpID0gMDsgaSA8IHBDVFgtPnY0bDJfZW5jLm1mY19udW1fc3JjX2J1ZnM7IGkrKykKKyAgICAgICAgICAgIGlmIChCVUZfREVRVUVVRUQgPT0gcENUWC0+djRsMl9lbmMubWZjX3NyY19idWZfZmxhZ3NbaV0pCisgICAgICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgaWYgKGkgPT0gcENUWC0+djRsMl9lbmMubWZjX251bV9zcmNfYnVmcykgeworICAgICAgICAgICAgTE9HVigiWyVzXSBObyBidWZmZXIgaXMgYXZhaWxhYmxlLiIsX19mdW5jX18pOworICAgICAgICAgICAgcmV0dXJuIE1GQ19SRVRfRU5DX0dFVF9JTkJVRl9GQUlMOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgaW5wdXRfaW5mby0+WVBoeUFkZHIgPSAodm9pZCopcENUWC0+djRsMl9lbmMubWZjX3NyY19waHlzW2ldWzBdOworICAgICAgICAgICAgaW5wdXRfaW5mby0+Q1BoeUFkZHIgPSAodm9pZCopcENUWC0+djRsMl9lbmMubWZjX3NyY19waHlzW2ldWzFdOworICAgICAgICAgICAgaW5wdXRfaW5mby0+WVZpckFkZHIgPSAodm9pZCopcENUWC0+djRsMl9lbmMubWZjX3NyY19idWZzW2ldWzBdOworICAgICAgICAgICAgaW5wdXRfaW5mby0+Q1ZpckFkZHIgPSAodm9pZCopcENUWC0+djRsMl9lbmMubWZjX3NyY19idWZzW2ldWzFdOworICAgICAgICAgICAgaW5wdXRfaW5mby0+WVNpemUgPSAoaW50KXBDVFgtPnY0bDJfZW5jLm1mY19zcmNfYnVmc19sZW5bMF07CisgICAgICAgICAgICBpbnB1dF9pbmZvLT5DU2l6ZSA9IChpbnQpcENUWC0+djRsMl9lbmMubWZjX3NyY19idWZzX2xlblsxXTsKKworICAgICAgICAgICAgcENUWC0+djRsMl9lbmMubWZjX3NyY19idWZfZmxhZ3NbaV0gPSBCVUZfRU5RVUVVRUQ7CisgICAgICAgIH0KKyAgICB9CisgICAgTE9HVigiWyVzXSBJbnB1dCBCdWZmZXIgaWR4ICVkIixfX2Z1bmNfXyxpKTsKKyAgICByZXR1cm4gTUZDX1JFVF9PSzsKK30KKworCitTU0JTSVBfTUZDX0VSUk9SX0NPREUgU3NiU2lwTWZjRW5jU2V0SW5CdWYodm9pZCAqb3BlbkhhbmRsZSwgU1NCU0lQX01GQ19FTkNfSU5QVVRfSU5GTyAqaW5wdXRfaW5mbykKK3sKKyAgICBfTUZDTElCICpwQ1RYOworICAgIHN0cnVjdCB2NGwyX2J1ZmZlciBxYnVmOworICAgIHN0cnVjdCB2NGwyX3BsYW5lIHBsYW5lc1tNRkNfRU5DX05VTV9QTEFORVNdOworICAgIGludCByZXQsaTsKKworICAgIGlmIChvcGVuSGFuZGxlID09IE5VTEwpIHsKKyAgICAgICAgTE9HRSgiWyVzXSBvcGVuSGFuZGxlIGlzIE5VTExcbiIsX19mdW5jX18pOworICAgICAgICByZXR1cm4gTUZDX1JFVF9JTlZBTElEX1BBUkFNOworICAgIH0KKworICAgIHBDVFggID0gKF9NRkNMSUIgKikgb3BlbkhhbmRsZTsKKworICAgIG1lbXNldCgmcWJ1ZiwgMCwgc2l6ZW9mKHFidWYpKTsKKyAgICBpZiAocENUWC0+djRsMl9lbmMuYklucHV0UGh5VmlyKSB7CisgICAgICAgIHFidWYubWVtb3J5ID0gVjRMMl9NRU1PUllfVVNFUlBUUjsKKyAgICAgICAgcWJ1Zi5pbmRleCA9IHBDVFgtPnY0bDJfZW5jLmJlaW5nVXNlZEluZGV4OworICAgICAgICBwbGFuZXNbMF0ubS51c2VycHRyID0gKHVuc2lnbmVkIGxvbmcpaW5wdXRfaW5mby0+WVBoeUFkZHI7CisgICAgICAgIHBsYW5lc1swXS5sZW5ndGggPSBpbnB1dF9pbmZvLT5ZU2l6ZTsKKyAgICAgICAgcGxhbmVzWzBdLmJ5dGVzdXNlZCA9IGlucHV0X2luZm8tPllTaXplOworICAgICAgICBwbGFuZXNbMV0ubS51c2VycHRyID0gKHVuc2lnbmVkIGxvbmcpaW5wdXRfaW5mby0+Q1BoeUFkZHI7CisgICAgICAgIHBsYW5lc1sxXS5sZW5ndGggPSBpbnB1dF9pbmZvLT5DU2l6ZTsKKyAgICAgICAgcGxhbmVzWzFdLmJ5dGVzdXNlZCA9IGlucHV0X2luZm8tPkNTaXplOworCisgICAgICAgIC8qIEZJWE1FLCB0aGlzIGlzIG9ubHkgZm9yIGNhc2Ugb2Ygbm90IHVzaW5nIEIgZnJhbWUsCisgICAgICAgIENhbWVyYSBzaWRlIHNob3VsZCBrbm93IHdoaWNoIGJ1ZmZlciBpcyBxdWV1ZWQoKSByZWZlcmluZyB0byBpbmRleCBvZgorICAgICAgICBNRkMgZHFidWYoKSAqLworICAgICAgICBwQ1RYLT52NGwyX2VuYy5iZWluZ1VzZWRJbmRleCsrOworICAgICAgICBwQ1RYLT52NGwyX2VuYy5iZWluZ1VzZWRJbmRleCAlPSBNRkNfRU5DX05VTV9TUkNfQlVGUzsKKyAgICAgICAgTE9HVigiWyVzXSBQaHkgSW5wdXQgQnVmZmVyIGlkeCBRdWV1ZWQgJWQiLF9fZnVuY19fLHBDVFgtPnY0bDJfZW5jLmJlaW5nVXNlZEluZGV4KTsKKyAgICB9IGVsc2UgeworICAgICAgICBmb3IgKGkgPSAwOyBpIDwgcENUWC0+djRsMl9lbmMubWZjX251bV9zcmNfYnVmczsgaSsrKQorICAgICAgICAgICAgaWYgKHBDVFgtPnY0bDJfZW5jLm1mY19zcmNfYnVmc1tpXVswXSA9PSBpbnB1dF9pbmZvLT5ZVmlyQWRkcikKKyAgICAgICAgICAgICAgICBicmVhazsKKworICAgICAgICBpZiAoaSA9PSBwQ1RYLT52NGwyX2VuYy5tZmNfbnVtX3NyY19idWZzKSB7CisgICAgICAgICAgICBMT0dFKCJbJXNdIENhbiBub3QgdXNlIHRoZSBidWZmZXIiLF9fZnVuY19fKTsKKyAgICAgICAgICAgIHJldHVybiBNRkNfUkVUX0lOVkFMSURfUEFSQU07CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBwQ1RYLT52NGwyX2VuYy5iZWluZ1VzZWRJbmRleCA9IGk7CisgICAgICAgICAgICAvL3BDVFgtPnY0bDJfZW5jLm1mY19zcmNfYnVmX2ZsYWdzW2ldID0gQlVGX0VOUVVFVUVEOworICAgICAgICB9CisgICAgICAgIHFidWYubWVtb3J5ID0gVjRMMl9NRU1PUllfTU1BUDsKKyAgICAgICAgcWJ1Zi5pbmRleCA9IHBDVFgtPnY0bDJfZW5jLmJlaW5nVXNlZEluZGV4OworICAgICAgICBwbGFuZXNbMF0uYnl0ZXN1c2VkID0gcENUWC0+d2lkdGggKiBwQ1RYLT5oZWlnaHQ7CisgICAgICAgIHBsYW5lc1sxXS5ieXRlc3VzZWQgPSAocENUWC0+d2lkdGggKiBwQ1RYLT5oZWlnaHQpID4+IDE7CisgICAgICAgIExPR1YoIlslc10gSW5wdXQgQnVmZmVyIGlkeCBRdWV1ZWQgJWQiLF9fZnVuY19fLHBDVFgtPnY0bDJfZW5jLmJlaW5nVXNlZEluZGV4KTsKKyAgICB9CisKKyAgICBxYnVmLnR5cGUgPSBWNEwyX0JVRl9UWVBFX1ZJREVPX09VVFBVVF9NUExBTkU7CisgICAgcWJ1Zi5tLnBsYW5lcyA9IHBsYW5lczsKKyAgICBxYnVmLmxlbmd0aCA9IDI7CisKKyAgICByZXQgPSBpb2N0bChwQ1RYLT5oTUZDLCBWSURJT0NfUUJVRiwgJnFidWYpOworICAgIGlmIChyZXQgIT0gMCkgeworICAgICAgICBMT0dFKCJbJXNdIFZJRElPQ19RQlVGIGZhaWxlZCwgVjRMMl9CVUZfVFlQRV9WSURFT19PVVRQVVRfTVBMQU5FIixfX2Z1bmNfXyk7CisgICAgICAgIHJldHVybiBNRkNfUkVUX0VOQ19TRVRfSU5CVUZfRkFJTDsKKyAgICB9CisKKyAgICByZXR1cm4gTUZDX1JFVF9PSzsKK30KKworU1NCU0lQX01GQ19FUlJPUl9DT0RFIFNzYlNpcE1mY0VuY0dldE91dEJ1Zih2b2lkICpvcGVuSGFuZGxlLCBTU0JTSVBfTUZDX0VOQ19PVVRQVVRfSU5GTyAqb3V0cHV0X2luZm8pCit7CisgICAgX01GQ0xJQiAqcENUWDsKKyAgICBzdHJ1Y3QgdjRsMl9jb250cm9sIGN0cmw7CisgICAgdW5zaWduZWQgaW50IGVuY29kZWRfeV9hZGRyLCBlbmNvZGVkX2NfYWRkcjsKKyAgICBpbnQgcmV0OworCisgICAgaWYgKG9wZW5IYW5kbGUgPT0gTlVMTCkgeworICAgICAgICBMT0dFKCJbJXNdIG9wZW5IYW5kbGUgaXMgTlVMTFxuIixfX2Z1bmNfXyk7CisgICAgICAgIHJldHVybiBNRkNfUkVUX0lOVkFMSURfUEFSQU07CisgICAgfQorCisgICAgcENUWCA9IChfTUZDTElCICopIG9wZW5IYW5kbGU7CisKKyAgICBpZiAocENUWC0+djRsMl9lbmMuYlJ1bm5pbmcgPT0gMCkgeworICAgICAgICBwQ1RYLT5lbmNvZGVkSGVhZGVyU2l6ZSA9IHBDVFgtPnY0bDJfZW5jLm1mY19kc3RfYnVmc19ieXRlc191c2VkX2xlbjsKKyAgICAgICAgb3V0cHV0X2luZm8tPmRhdGFTaXplID0gMDsKKyAgICB9IGVsc2UgeworICAgICAgICBvdXRwdXRfaW5mby0+ZGF0YVNpemUgPSBwQ1RYLT52NGwyX2VuYy5tZmNfZHN0X2J1ZnNfYnl0ZXNfdXNlZF9sZW47CisgICAgfQorCisgICAgY3RybC5pZCA9IFY0TDJfQ0lEX0NPREVDX0VOQ09ERURfTFVNQV9BRERSOworICAgIGN0cmwudmFsdWUgPSAwOworICAgIHJldCA9IGlvY3RsKHBDVFgtPmhNRkMsIFZJRElPQ19HX0NUUkwsICZjdHJsKTsKKyAgICBpZiAocmV0ICE9IDApCisgICAgICAgIExPR0UoIlslc10gRXJyb3IgdG8gZG8gZ19jdHJsIixfX2Z1bmNfXyk7CisgICAgZW5jb2RlZF95X2FkZHIgPSAodW5zaWduZWQgaW50KWN0cmwudmFsdWU7CisKKyAgICBjdHJsLmlkID0gVjRMMl9DSURfQ09ERUNfRU5DT0RFRF9DSFJPTUFfQUREUjsKKyAgICBjdHJsLnZhbHVlID0gMDsKKyAgICByZXQgPSBpb2N0bChwQ1RYLT5oTUZDLCBWSURJT0NfR19DVFJMLCAmY3RybCk7CisgICAgaWYgKHJldCAhPSAwKQorICAgICAgICBMT0dFKCJbJXNdIEVycm9yIHRvIGRvIGdfY3RybCIsX19mdW5jX18pOworICAgIGVuY29kZWRfY19hZGRyID0gKHVuc2lnbmVkIGludCljdHJsLnZhbHVlOworCisgICAgb3V0cHV0X2luZm8tPmhlYWRlclNpemUgPSBwQ1RYLT5lbmNvZGVkSGVhZGVyU2l6ZTsKKyAgICBvdXRwdXRfaW5mby0+ZnJhbWVUeXBlID0gcENUWC0+ZW5jb2RlZGZyYW1lVHlwZTsKKyAgICBvdXRwdXRfaW5mby0+U3RybVBoeUFkZHIgPSAodm9pZCAqKTA7CisgICAgb3V0cHV0X2luZm8tPlN0cm1WaXJBZGRyID0gKHZvaWQgKilwQ1RYLT52aXJTdHJtQnVmOworICAgIG91dHB1dF9pbmZvLT5lbmNvZGVkWVBoeUFkZHIgPSAodm9pZCopZW5jb2RlZF95X2FkZHI7CisgICAgb3V0cHV0X2luZm8tPmVuY29kZWRDUGh5QWRkciA9ICh2b2lkKillbmNvZGVkX2NfYWRkcjsKKworICAgIHJldHVybiBNRkNfUkVUX09LOworfQorCitTU0JTSVBfTUZDX0VSUk9SX0NPREUgU3NiU2lwTWZjRW5jU2V0T3V0QnVmKHZvaWQgKm9wZW5IYW5kbGUsIHZvaWQgKnBoeU91dGJ1Ziwgdm9pZCAqdmlyT3V0YnVmLCBpbnQgb3V0cHV0QnVmZmVyU2l6ZSkKK3sKKyAgICBpZiAob3BlbkhhbmRsZSA9PSBOVUxMKSB7CisgICAgICAgIExPR0UoIlslc10gb3BlbkhhbmRsZSBpcyBOVUxMXG4iLF9fZnVuY19fKTsKKyAgICAgICAgcmV0dXJuIE1GQ19SRVRfSU5WQUxJRF9QQVJBTTsKKyAgICB9CisKKyAgICByZXR1cm4gTUZDX1JFVF9FTkNfU0VUX09VVEJVRl9GQUlMOworfQorCitTU0JTSVBfTUZDX0VSUk9SX0NPREUgU3NiU2lwTWZjRW5jRXhlKHZvaWQgKm9wZW5IYW5kbGUpCit7CisgICAgaW50IHJldDsKKyAgICBpbnQgZGVxdWV1ZWRfaW5kZXg7CisgICAgaW50IGxvb3BjbnQgPSAwOworICAgIF9NRkNMSUIgKnBDVFg7CisKKyAgICBzdHJ1Y3QgdjRsMl9idWZmZXIgcWJ1ZjsKKyAgICBzdHJ1Y3QgdjRsMl9wbGFuZSBwbGFuZXNbTUZDX0VOQ19OVU1fUExBTkVTXTsKKyAgICBlbnVtIHY0bDJfYnVmX3R5cGUgdHlwZTsKKworICAgIHN0cnVjdCB2NGwyX2NvbnRyb2wgY3RybDsKKworICAgIHN0cnVjdCBwb2xsZmQgcG9sbF9ldmVudHM7CisgICAgaW50IHBvbGxfc3RhdGU7CisKKyAgICBMT0dWKCJbJXNdIEVudGVyIFxuIixfX2Z1bmNfXyk7CisgICAgaWYgKG9wZW5IYW5kbGUgPT0gTlVMTCkgeworICAgICAgICBMT0dFKCJbJXNdIG9wZW5IYW5kbGUgaXMgTlVMTFxuIixfX2Z1bmNfXyk7CisgICAgICAgIHJldHVybiBNRkNfUkVUX0lOVkFMSURfUEFSQU07CisgICAgfQorCisgICAgcENUWCA9IChfTUZDTElCICopIG9wZW5IYW5kbGU7CisKKyAgICBjdHJsLmlkID0gVjRMMl9DSURfQ09ERUNfRlJBTUVfVEFHOworICAgIGN0cmwudmFsdWUgPSBwQ1RYLT5pbmZyYW1ldGFnOworCisgICAgcmV0ID0gaW9jdGwocENUWC0+aE1GQywgVklESU9DX1NfQ1RSTCwgJmN0cmwpOworICAgIGlmIChyZXQgIT0gMCkgeworICAgICAgICBMT0dFKCJbJXNdIFZJRElPQ19TX0NUUkwgZmFpbGVkLCBWNEwyX0NJRF9DT0RFQ19GUkFNRV9UQUciLF9fZnVuY19fKTsKKyAgICAgICAgcmV0dXJuIE1GQ19SRVRfRU5DX0VYRV9FUlI7CisgICAgfQorCisgICAgaWYgKHBDVFgtPnY0bDJfZW5jLmJSdW5uaW5nID09IDApIHsKKyAgICAgICAgdHlwZSA9IFY0TDJfQlVGX1RZUEVfVklERU9fT1VUUFVUX01QTEFORTsKKyAgICAgICAgcmV0ID0gaW9jdGwocENUWC0+aE1GQywgVklESU9DX1NUUkVBTU9OLCAmdHlwZSk7CisgICAgICAgIGlmIChyZXQgIT0gMCkgeworICAgICAgICAgICAgTE9HRSgiWyVzXSBWSURJT0NfU1RSRUFNT04gZmFpbGVkLCBWNEwyX0JVRl9UWVBFX1ZJREVPX09VVFBVVF9NUExBTkUiLF9fZnVuY19fKTsKKyAgICAgICAgICAgIHJldHVybiBNRkNfUkVUX0VOQ19FWEVfRVJSOworICAgICAgICB9CisKKyAgICAgICAgcENUWC0+djRsMl9lbmMuYlJ1bm5pbmcgPSAxOworICAgIH0KKworICAgIHBDVFgtPmludGVyX2J1ZmZfc3RhdHVzIHw9IE1GQ19VU0VfU1JDX1NUUkVBTU9OOworCisgICAgbWVtc2V0KCZxYnVmLCAwLCBzaXplb2YocWJ1ZikpOworICAgIHFidWYudHlwZSA9IFY0TDJfQlVGX1RZUEVfVklERU9fQ0FQVFVSRV9NUExBTkU7CisgICAgcWJ1Zi5tZW1vcnkgPSBWNEwyX01FTU9SWV9NTUFQOworICAgIHFidWYubS5wbGFuZXMgPSBwbGFuZXM7CisgICAgcWJ1Zi5sZW5ndGggPSAxOworCisgICAgLyogbm90ZTogI2RlZmluZSBQT0xMT1VUIDB4MDAwNCAqLworICAgIHBvbGxfZXZlbnRzLmZkID0gcENUWC0+aE1GQzsKKyAgICBwb2xsX2V2ZW50cy5ldmVudHMgPSBQT0xMSU4gfCBQT0xMRVJSOworICAgIHBvbGxfZXZlbnRzLnJldmVudHMgPSAwOworCisgICAgLyogd2FpdCBmb3IgZW5jb2RpbmcgKi8KKyAgICBkbyB7CisgICAgICAgIHBvbGxfc3RhdGUgPSBwb2xsKChzdHJ1Y3QgcG9sbGZkKikmcG9sbF9ldmVudHMsIDEsIFBPTExfRU5DX1dBSVRfVElNRU9VVCk7CisgICAgICAgIGlmICgwIDwgcG9sbF9zdGF0ZSkgeworICAgICAgICAgICAgaWYgKHBvbGxfZXZlbnRzLnJldmVudHMgJiBQT0xMSU4pIHsgLyogUE9MTElOICovCisgICAgICAgICAgICAgICAgcmV0ID0gaW9jdGwocENUWC0+aE1GQywgVklESU9DX0RRQlVGLCAmcWJ1Zik7CisgICAgICAgICAgICAgICAgaWYgKHJldCA9PSAwKQorICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0gZWxzZSBpZiAocG9sbF9ldmVudHMucmV2ZW50cyAmIFBPTExFUlIpIHsgLyogUE9MTEVSUiAqLworICAgICAgICAgICAgICAgIExPR0UoIlslc10gUE9MTEVSUlxuIixfX2Z1bmNfXyk7CisgICAgICAgICAgICAgICAgcmV0dXJuIE1GQ19SRVRfRU5DX0VYRV9FUlI7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIExPR0UoIlslc10gcG9sbCgpIHJldHVybnMgMHgleFxuIixfX2Z1bmNfXywgcG9sbF9ldmVudHMucmV2ZW50cyk7CisgICAgICAgICAgICAgICAgcmV0dXJuIE1GQ19SRVRfRU5DX0VYRV9FUlI7CisgICAgICAgICAgICB9CisgICAgICAgIH0gZWxzZSBpZiAoMCA+IHBvbGxfc3RhdGUpIHsKKyAgICAgICAgICAgIExPR0UoIlslc10gcG9sbCgpIEVuY29kZXIgUE9MTCBUaW1lb3V0IDB4JXhcbiIsX19mdW5jX18sIHBvbGxfZXZlbnRzLnJldmVudHMpOworICAgICAgICAgICAgcmV0dXJuIE1GQ19SRVRfRU5DX0VYRV9FUlI7CisgICAgICAgIH0gZWxzZSB7IC8qIGluIHRoZSBjYXNlIG9mIEIgZnJhbWUgZW5jb2RpbmcgKi8KKyAgICAgICAgICAgIGN0cmwuaWQgPSBWNEwyX0NJRF9DT0RFQ19DSEVDS19TVEFURTsKKyAgICAgICAgICAgIGN0cmwudmFsdWUgPSAwOworICAgICAgICAgICAgcmV0ID0gaW9jdGwocENUWC0+aE1GQywgVklESU9DX0dfQ1RSTCwgJmN0cmwpOworICAgICAgICAgICAgTE9HVigiWyVzXSBjdHggc3RhdGUgPSAlZFxuIixfX2Z1bmNfXywgY3RybC52YWx1ZSk7CisgICAgICAgICAgICBpZiAoY3RybC52YWx1ZSA9PSBNRkNTVEFURV9FTkNfTk9fT1VUUFVUKQorICAgICAgICAgICAgICAgIHJldHVybiBNRkNfUkVUX09LOworICAgICAgICB9CisgICAgICAgIGxvb3BjbnQrKzsKKyAgICB9IHdoaWxlICgoMCA9PSBwb2xsX3N0YXRlKSAmJiAobG9vcGNudCA8IDUpKTsKKworICAgIGlmIChwQ1RYLT52NGwyX2VuYy5iUnVubmluZyAhPSAwKSB7CisgICAgICAgIHBDVFgtPmVuY29kZWRmcmFtZVR5cGUgPSAocWJ1Zi5mbGFncyAmIDB4MzgpID4+IDM7IC8qIGVuY29kZWQgZnJhbWUgdHlwZSAqLworICAgICAgICBMT0dWKCJbJXNdIGVuY29kZWQgZnJhbWUgdHlwZSA9ICVkXG4iLCBfX2Z1bmNfXywgcENUWC0+ZW5jb2RlZGZyYW1lVHlwZSk7CisKKyAgICAgICAgc3dpdGNoIChwQ1RYLT5lbmNvZGVkZnJhbWVUeXBlKSB7CisgICAgICAgIGNhc2UgMToKKyAgICAgICAgICAgIHBDVFgtPmVuY29kZWRmcmFtZVR5cGUgPSBNRkNfRlJBTUVfVFlQRV9JX0ZSQU1FOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgMjoKKyAgICAgICAgICAgIHBDVFgtPmVuY29kZWRmcmFtZVR5cGUgPSBNRkNfRlJBTUVfVFlQRV9QX0ZSQU1FOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgNDoKKyAgICAgICAgICAgIHBDVFgtPmVuY29kZWRmcmFtZVR5cGUgPSBNRkNfRlJBTUVfVFlQRV9CX0ZSQU1FOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgTE9HRSgiWyVzXSBWSURJT0NfRFFCVUYgZmFpbGVkLCBlbmNvZGVkIGZyYW1lIHR5cGUgaXMgd3JvbmciLF9fZnVuY19fKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGRlcXVldWVkX2luZGV4ID0gcWJ1Zi5pbmRleDsKKworICAgIGlmIChxYnVmLm0ucGxhbmVzWzBdLmJ5dGVzdXNlZCA+IDApIHsgLyogRklYTUUgbGF0ZXIgKi8KKyAgICAgICAgcENUWC0+djRsMl9lbmMubWZjX2RzdF9idWZzX2J5dGVzX3VzZWRfbGVuID0gcWJ1Zi5tLnBsYW5lc1swXS5ieXRlc3VzZWQ7CisgICAgfQorCisgICAgY3RybC5pZCA9IFY0TDJfQ0lEX0NPREVDX0ZSQU1FX1RBRzsKKyAgICBjdHJsLnZhbHVlID0gMDsKKworICAgIHJldCA9IGlvY3RsKHBDVFgtPmhNRkMsIFZJRElPQ19HX0NUUkwsICZjdHJsKTsKKyAgICBpZiAocmV0ICE9IDApIHsKKyAgICAgICAgTE9HRSgiWyVzXSBWSURJT0NfR19DVFJMIGZhaWxlZCwgVjRMMl9DSURfQ09ERUNfRlJBTUVfVEFHIixfX2Z1bmNfXyk7CisgICAgICAgIHJldHVybiBNRkNfUkVUX0VOQ19FWEVfRVJSOworICAgIH0KKworICAgIHBDVFgtPm91dGZyYW1ldGFndG9wID0gY3RybC52YWx1ZTsKKworICAgIG1lbXNldCgmcWJ1ZiwgMCwgc2l6ZW9mKHFidWYpKTsKKyAgICBxYnVmLnR5cGUgPSBWNEwyX0JVRl9UWVBFX1ZJREVPX0NBUFRVUkVfTVBMQU5FOworICAgIHFidWYubWVtb3J5ID0gVjRMMl9NRU1PUllfTU1BUDsKKyAgICBxYnVmLmluZGV4ID0gZGVxdWV1ZWRfaW5kZXg7CisgICAgcWJ1Zi5tLnBsYW5lcyA9IHBsYW5lczsKKyAgICBxYnVmLmxlbmd0aCA9IDE7CisKKyAgICByZXQgPSBpb2N0bChwQ1RYLT5oTUZDLCBWSURJT0NfUUJVRiwgJnFidWYpOworICAgIGlmIChyZXQgIT0gMCkgeworICAgICAgICBMT0dFKCJbJXNdIFZJRElPQ19RQlVGIGZhaWxlZCwgVjRMMl9CVUZfVFlQRV9WSURFT19DQVBUVVJFX01QTEFORSIsX19mdW5jX18pOworICAgICAgICByZXR1cm4gTUZDX1JFVF9FTkNfRVhFX0VSUjsKKyAgICB9CisKKyAgICBpZiAocENUWC0+djRsMl9lbmMuYlJ1bm5pbmcgIT0gMCkgeworICAgICAgICBtZW1zZXQoJnFidWYsIDAsIHNpemVvZihxYnVmKSk7CisgICAgICAgIHFidWYudHlwZSA9IFY0TDJfQlVGX1RZUEVfVklERU9fT1VUUFVUX01QTEFORTsKKworICAgICAgICBpZiAocENUWC0+djRsMl9lbmMuYklucHV0UGh5VmlyKQorICAgICAgICAgICAgcWJ1Zi5tZW1vcnkgPSBWNEwyX01FTU9SWV9VU0VSUFRSOworICAgICAgICBlbHNlCisgICAgICAgICAgICBxYnVmLm1lbW9yeSA9IFY0TDJfTUVNT1JZX01NQVA7CisKKyAgICAgICAgcmV0ID0gaW9jdGwocENUWC0+aE1GQywgVklESU9DX0RRQlVGLCAmcWJ1Zik7CisgICAgICAgIGlmIChyZXQgIT0gMCkgeworICAgICAgICAgICAgTE9HRSgiWyVzXSBWSURJT0NfRFFCVUYgZmFpbGVkLCBWNEwyX0JVRl9UWVBFX1ZJREVPX09VVFBVVF9NUExBTkUiLF9fZnVuY19fKTsKKyAgICAgICAgICAgIHJldHVybiBNRkNfUkVUX0VOQ19FWEVfRVJSOworICAgICAgICB9CisgICAgfQorICAgIHBDVFgtPnY0bDJfZW5jLm1mY19zcmNfYnVmX2ZsYWdzW3FidWYuaW5kZXhdID0gQlVGX0RFUVVFVUVEOworCisgICAgLyogVXBkYXRlIGNvbnRleHQgc3RyZWFtIGJ1ZmZlciBhZGRyZXNzICovCisgICAgcENUWC0+dmlyU3RybUJ1ZiA9ICh1bnNpZ25lZCBpbnQpcENUWC0+djRsMl9lbmMubWZjX2RzdF9idWZzW2RlcXVldWVkX2luZGV4XTsKKyAgICBMT0dWKCJbJXNdIFN0cm0gb3V0IGlkeCAlZCIsX19mdW5jX18sZGVxdWV1ZWRfaW5kZXgpOworCisgICAgcmV0dXJuIE1GQ19SRVRfT0s7Cit9CisKK1NTQlNJUF9NRkNfRVJST1JfQ09ERSBTc2JTaXBNZmNFbmNTZXRDb25maWcodm9pZCAqb3BlbkhhbmRsZSwgU1NCU0lQX01GQ19FTkNfQ09ORiBjb25mX3R5cGUsIHZvaWQgKnZhbHVlKQoreworICAgIF9NRkNMSUIgKnBDVFg7CisgICAgc3RydWN0IHY0bDJfY29udHJvbCBjdHJsOworICAgIHN0cnVjdCBtZmNfZW5jX2hpZXJfcF9xcCBoaWVyX3BfcXA7CisjaWZkZWYgUzNEX1NVUFBPUlQKKyAgICBTU0JTSVBfTUZDX0ZSQU1FX1BBQ0tJTkcgKmZyYW1lX3BhY2tpbmc7CisjZW5kaWYKKyAgICBzdHJ1Y3QgbWZjX2VuY19mbW8gZm1vX3BhcmFtOworICAgIGludCAqYXNvX3BhcmFtOworICAgIGludCByZXQsIGk7CisKKyAgICBpZiAob3BlbkhhbmRsZSA9PSBOVUxMKSB7CisgICAgICAgIExPR0UoIlslc10gb3BlbkhhbmRsZSBpcyBOVUxMXG4iLF9fZnVuY19fKTsKKyAgICAgICAgcmV0dXJuIE1GQ19SRVRfSU5WQUxJRF9QQVJBTTsKKyAgICB9CisKKyAgICBpZiAodmFsdWUgPT0gTlVMTCkgeworICAgICAgICBMT0dFKCJbJXNdIHZhbHVlIGlzIE5VTExcbiIsX19mdW5jX18pOworICAgICAgICByZXR1cm4gTUZDX1JFVF9JTlZBTElEX1BBUkFNOworICAgIH0KKworICAgIHBDVFggID0gKF9NRkNMSUIgKikgb3BlbkhhbmRsZTsKKworICAgIHN3aXRjaCAoY29uZl90eXBlKSB7CisgICAgY2FzZSBNRkNfRU5DX1NFVENPTkZfRlJBTUVfVEFHOgorICAgICAgICBwQ1RYLT5pbmZyYW1ldGFnID0gKigodW5zaWduZWQgaW50ICopdmFsdWUpOworICAgICAgICByZXR1cm4gTUZDX1JFVF9PSzsKKworICAgIGNhc2UgTUZDX0VOQ19TRVRDT05GX0ZSQU1FX1RZUEU6CisgICAgICAgIGN0cmwuaWQgPSBWNEwyX0NJRF9DT0RFQ19GUkFNRV9JTlNFUlRJT047CisgICAgICAgIGN0cmwudmFsdWUgPSAqKCh1bnNpZ25lZCBpbnQqKXZhbHVlKTsKKyAgICAgICAgYnJlYWs7CisKKyAgICBjYXNlIE1GQ19FTkNfU0VUQ09ORl9JX1BFUklPRDoKKyAgICAgICAgY3RybC5pZCA9IFY0TDJfQ0lEX0NPREVDX0VOQ09ERURfSV9QRVJJT0RfQ0g7CisgICAgICAgIGN0cmwudmFsdWUgPSAqKCh1bnNpZ25lZCBpbnQqKXZhbHVlKTsKKyAgICAgICAgYnJlYWs7CisKKyAgICBjYXNlIE1GQ19FTkNfU0VUQ09ORl9DSEFOR0VfRlJBTUVfUkFURToKKyAgICAgICAgY3RybC5pZCA9IFY0TDJfQ0lEX0NPREVDX0VOQ09ERURfRlJBTUVfUkFURV9DSDsKKyAgICAgICAgY3RybC52YWx1ZSA9ICooKHVuc2lnbmVkIGludCopdmFsdWUpOworICAgICAgICBicmVhazsKKworICAgIGNhc2UgTUZDX0VOQ19TRVRDT05GX0NIQU5HRV9CSVRfUkFURToKKyAgICAgICAgY3RybC5pZCA9IFY0TDJfQ0lEX0NPREVDX0VOQ09ERURfQklUX1JBVEVfQ0g7CisgICAgICAgIGN0cmwudmFsdWUgPSAqKCh1bnNpZ25lZCBpbnQqKXZhbHVlKTsKKyAgICAgICAgYnJlYWs7CisjaWZkZWYgUzNEX1NVUFBPUlQKKyAgICBjYXNlIE1GQ19FTkNfU0VUQ09ORl9TRUlfR0VOOgorICAgICAgICBjdHJsLmlkID0gVjRMMl9DSURfQ09ERUNfRlJBTUVfUEFDS19TRUlfR0VOOworICAgICAgICBjdHJsLnZhbHVlID0gKigodW5zaWduZWQgaW50Kil2YWx1ZSk7CisgICAgICAgIHBDVFgtPnNlaV9pbmZvLnNlaV9nZW5fZW5hYmxlID0gMTsKKyAgICAgICAgYnJlYWs7CisjZW5kaWYKKyAgICBjYXNlIE1GQ19FTkNfU0VUQ09ORl9BTExPV19GUkFNRV9TS0lQOgorICAgICAgICBwQ1RYLT5lbmNfZnJhbWVza2lwID0gKigoaW50ICopdmFsdWUpOworICAgICAgICByZXR1cm4gTUZDX1JFVF9PSzsKKyNpZiAwCisgICAgY2FzZSBNRkNfRU5DX1NFVENPTkZfVlVJX0lORk86CisgICAgICAgIHZ1aV9pbmZvID0gKigoc3RydWN0IG1mY19lbmNfdnVpX2luZm8gKikgdmFsdWUpOworICAgICAgICBFbmNBcmcuYXJncy5zZXRfY29uZmlnLmluX2NvbmZpZ192YWx1ZVswXSAgPSAoaW50KSh2dWlfaW5mby5hc3BlY3RfcmF0aW9faWRjKTsKKyAgICAgICAgRW5jQXJnLmFyZ3Muc2V0X2NvbmZpZy5pbl9jb25maWdfdmFsdWVbMV0gID0gMDsKKyAgICAgICAgYnJlYWs7CisjZW5kaWYKKyAgICBjYXNlIE1GQ19FTkNfU0VUQ09ORl9ISUVSX1A6CisgICAgICAgIGhpZXJfcF9xcCA9ICooKHN0cnVjdCBtZmNfZW5jX2hpZXJfcF9xcCAqKSB2YWx1ZSk7CisgICAgICAgIHBDVFgtPmhpZXJfcF9lbmFibGUgPSAxOworICAgICAgICBwQ1RYLT5oaWVyX3FwX3ZhbHVlLnQwX2ZyYW1lX3FwID0gKGludCkoaGllcl9wX3FwLnQwX2ZyYW1lX3FwKTsKKyAgICAgICAgcENUWC0+aGllcl9xcF92YWx1ZS50Ml9mcmFtZV9xcCAgPSAoaW50KShoaWVyX3BfcXAudDJfZnJhbWVfcXApOworICAgICAgICBwQ1RYLT5oaWVyX3FwX3ZhbHVlLnQzX2ZyYW1lX3FwICA9IChpbnQpKGhpZXJfcF9xcC50M19mcmFtZV9xcCk7CisgICAgICAgIHJldHVybiBNRkNfUkVUX09LOworI2lmZGVmIFMzRF9TVVBQT1JUCisgICAgY2FzZSBNRkNfRU5DX1NFVENPTkZfRlJBTUVfUEFDS0lORzoKKyAgICAgICAgZnJhbWVfcGFja2luZyA9IChTU0JTSVBfTUZDX0ZSQU1FX1BBQ0tJTkcgKil2YWx1ZTsKKyAgICAgICAgcENUWC0+c2VpX2luZm8uY3Vycl9mcmFtZV9mcm0wX2ZsYWcgPSAoaW50KShmcmFtZV9wYWNraW5nLT5jdXJyZW50X2ZyYW1lX2lzX2ZyYW1lMF9mbGFnKTsKKyAgICAgICAgcENUWC0+c2VpX2luZm8uZnJhbWVfcGFja19hcnJnbWVudF90eXBlICA9IChpbnQpKGZyYW1lX3BhY2tpbmctPmFycmFuZ2VtZW50X3R5cGUpOworICAgICAgICByZXR1cm4gTUZDX1JFVF9PSzsKKyNlbmRpZgorICAgIGNhc2UgTUZDX0VOQ19TRVRDT05GX0ZNTzoKKyAgICAgICAgZm1vX3BhcmFtID0gKigoc3RydWN0IG1mY19lbmNfZm1vICopIHZhbHVlKTsKKyAgICAgICAgcENUWC0+Zm1vX2VuYWJsZSA9IDE7CisgICAgICAgIHBDVFgtPmZtb192YWx1ZS5zbGljZV9tYXBfdHlwZSA9IChpbnQpKGZtb19wYXJhbS5zbGljZV9tYXBfdHlwZSk7CisgICAgICAgIHBDVFgtPmZtb192YWx1ZS5zbGljZV9udW1fZ3JwICA9IChpbnQpKGZtb19wYXJhbS5zbGljZV9udW1fZ3JwKTsKKyAgICAgICAgcENUWC0+Zm1vX3ZhbHVlLnJ1bl9sZW5ndGhbMF0gID0gKGludCkoZm1vX3BhcmFtLnJ1bl9sZW5ndGhbMF0pOworICAgICAgICBwQ1RYLT5mbW9fdmFsdWUucnVuX2xlbmd0aFsxXSAgPSAoaW50KShmbW9fcGFyYW0ucnVuX2xlbmd0aFsxXSk7CisgICAgICAgIHBDVFgtPmZtb192YWx1ZS5ydW5fbGVuZ3RoWzJdICA9IChpbnQpKGZtb19wYXJhbS5ydW5fbGVuZ3RoWzJdKTsKKyAgICAgICAgcENUWC0+Zm1vX3ZhbHVlLnJ1bl9sZW5ndGhbM10gID0gKGludCkoZm1vX3BhcmFtLnJ1bl9sZW5ndGhbM10pOworICAgICAgICBwQ1RYLT5mbW9fdmFsdWUuc2dfZGlyICAgICAgICAgPSAoaW50KShmbW9fcGFyYW0uc2dfZGlyKTsKKyAgICAgICAgcENUWC0+Zm1vX3ZhbHVlLnNnX3JhdGUgICAgICAgID0gKGludCkoZm1vX3BhcmFtLnNnX3JhdGUpOworICAgICAgICByZXR1cm4gTUZDX1JFVF9PSzsKKworICAgIGNhc2UgTUZDX0VOQ19TRVRDT05GX0FTTzoKKyAgICAgICAgYXNvX3BhcmFtID0gKGludCAqKSB2YWx1ZTsKKyAgICAgICAgcENUWC0+YXNvX2VuYWJsZSA9IDE7CisgICAgICAgIGZvciAoaSA9IDA7IGkgPCA4OyBpKyspCisgICAgICAgICAgICBwQ1RYLT5hc29fc2xfb3JkZXJbaV0gPSAoaW50KWFzb19wYXJhbVtpXTsKKyAgICAgICAgcmV0dXJuIE1GQ19SRVRfT0s7CisKKyAgICBkZWZhdWx0OgorICAgICAgICBMT0dFKCJbJXNdIGNvbmZfdHlwZSglZCkgaXMgTk9UIHN1cHBvcnRlZFxuIixfX2Z1bmNfXywgY29uZl90eXBlKTsKKyAgICAgICAgcmV0dXJuIE1GQ19SRVRfSU5WQUxJRF9QQVJBTTsKKyAgICB9CisKKyAgICByZXQgPSBpb2N0bChwQ1RYLT5oTUZDLCBWSURJT0NfU19DVFJMLCAmY3RybCk7CisgICAgaWYgKHJldCAhPSAwKSB7CisgICAgICAgIExPR0UoIlslc10gVklESU9DX1NfQ1RSTCBmYWlsZWQgKGNvbmZfdHlwZSA9ICVkKSIsX19mdW5jX18sIGNvbmZfdHlwZSk7CisgICAgICAgIHJldHVybiBNRkNfUkVUX0VOQ19TRVRfQ09ORl9GQUlMOworICAgIH0KKworICAgIHJldHVybiBNRkNfUkVUX09LOworfQorCitTU0JTSVBfTUZDX0VSUk9SX0NPREUgU3NiU2lwTWZjRW5jR2V0Q29uZmlnKHZvaWQgKm9wZW5IYW5kbGUsIFNTQlNJUF9NRkNfRU5DX0NPTkYgY29uZl90eXBlLCB2b2lkICp2YWx1ZSkKK3sKKyAgICBfTUZDTElCICpwQ1RYOworCisgICAgcENUWCA9IChfTUZDTElCICopIG9wZW5IYW5kbGU7CisKKyAgICBpZiAob3BlbkhhbmRsZSA9PSBOVUxMKSB7CisgICAgICAgIExPR0UoIlslc10gb3BlbkhhbmRsZSBpcyBOVUxMXG4iLF9fZnVuY19fKTsKKyAgICAgICAgcmV0dXJuIE1GQ19SRVRfSU5WQUxJRF9QQVJBTTsKKyAgICB9CisKKyAgICBpZiAodmFsdWUgPT0gTlVMTCkgeworICAgICAgICBMT0dFKCJbJXNdIHZhbHVlIGlzIE5VTExcbiIsX19mdW5jX18pOworICAgICAgICByZXR1cm4gTUZDX1JFVF9JTlZBTElEX1BBUkFNOworICAgIH0KKworICAgIHN3aXRjaCAoY29uZl90eXBlKSB7CisgICAgY2FzZSBNRkNfRU5DX0dFVENPTkZfRlJBTUVfVEFHOgorICAgICAgICAqKCh1bnNpZ25lZCBpbnQgKil2YWx1ZSkgPSBwQ1RYLT5vdXRmcmFtZXRhZ3RvcDsKKyAgICAgICAgYnJlYWs7CisKKyAgICBkZWZhdWx0OgorICAgICAgICBMT0dFKCJbJXNdIGNvbmZfdHlwZSglZCkgaXMgTk9UIHN1cHBvcnRlZFxuIixfX2Z1bmNfXywgY29uZl90eXBlKTsKKyAgICAgICAgcmV0dXJuIE1GQ19SRVRfSU5WQUxJRF9QQVJBTTsKKyAgICB9CisKKyAgICByZXR1cm4gTUZDX1JFVF9PSzsKK30KKwpkaWZmIC0tZ2l0IGEvZXh5bm9zNC9tdWx0aW1lZGlhL2NvZGVjcy9zZWNfY29kZWNzL3ZpZGVvL2V4eW5vczUvbWZjX3Y0bDIvaW5jbHVkZS9Tc2JTaXBNZmNBcGkuaCBiL2V4eW5vczQvbXVsdGltZWRpYS9jb2RlY3Mvc2VjX2NvZGVjcy92aWRlby9leHlub3M1L21mY192NGwyL2luY2x1ZGUvU3NiU2lwTWZjQXBpLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjM4NmM3MgotLS0gL2Rldi9udWxsCisrKyBiL2V4eW5vczQvbXVsdGltZWRpYS9jb2RlY3Mvc2VjX2NvZGVjcy92aWRlby9leHlub3M1L21mY192NGwyL2luY2x1ZGUvU3NiU2lwTWZjQXBpLmgKQEAgLTAsMCArMSw0MzEgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTAgU2Ftc3VuZyBFbGVjdHJvbmljcyBDby4sIEx0ZC4KKyAqICAgICAgICAgICAgICBodHRwOi8vd3d3LnNhbXN1bmcuY29tLworICoKKyAqIEdsb2JhbCBoZWFkZXIgZm9yIFNhbXN1bmcgTUZDIChNdWx0aSBGdW5jdGlvbiBDb2RlYyAtIEZJTVYpIGRyaXZlcgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBhcworICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisgKgorICogQWx0ZXJuYXRpdmVseSwgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpZm5kZWYgX1NTQlNJUF9NRkNfQVBJX0hfCisjZGVmaW5lIF9TU0JTSVBfTUZDX0FQSV9IXworCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKy8qIERlZmluaXRpb24gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisjZGVmaW5lIE1BWF9ERUNPREVSX0lOUFVUX0JVRkZFUl9TSVpFICAoMTAyNCAqIDMwNzIpCisjZGVmaW5lIE1BWF9FTkNPREVSX09VVFBVVF9CVUZGRVJfU0laRSAoMTAyNCAqIDMwNzIpCisKKyNkZWZpbmUgTUZDNnhfVkVSU0lPTgorCisjZGVmaW5lIFNVUFBPUlRfMTA4MFAgICAgICAgIDEKKworI2lmIFNVUFBPUlRfMTA4MFAKKyNkZWZpbmUgTU1BUF9CVUZGRVJfU0laRV9NTUFQICAgICAgICAgICg3MCoxMDI0KjEwMjQpIC8qIG9ubHkgQzExMCB1c2UgdGhpcyB2YWx1ZS4gaW4gQzIxMCwgbWVtb3J5IHNpemUgaXMgZGVjaWRlZCBpbiBtZW51Y29uZmlnKi8KKyNlbHNlCisjZGVmaW5lIE1NQVBfQlVGRkVSX1NJWkVfTU1BUCAgICAgICAgICAoNjIqMTAyNCoxMDI0KQorI2VuZGlmCisKKyNkZWZpbmUgU0FNU1VOR19NRkNfREVWX05BTUUgICAgICAgICAgICIvZGV2L3ZpZGVvIgorCisjZGVmaW5lIFNTQlNJUF9NRkNfT0sgICAgICAgICAgICAgICAgICAgKDEpCisjZGVmaW5lIFNTQlNJUF9NRkNfRkFJTCAgICAgICAgICAgICAgICAgKDApCisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworLyogU3RydWN0dXJlIGFuZCBUeXBlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KK3R5cGVkZWYgZW51bSB7CisgICAgSDI2NF9ERUMsCisgICAgVkMxX0RFQywgICAgIC8qIFZDMSBhZHZhY2VkIFByb2ZpbGUgZGVjb2RpbmcgICovCisgICAgTVBFRzRfREVDLAorICAgIFhWSURfREVDLAorICAgIE1QRUcxX0RFQywKKyAgICBNUEVHMl9ERUMsCisgICAgSDI2M19ERUMsCisgICAgVkMxUkNWX0RFQywgIC8qIFZDMSBzaW1wbGUvbWFpbiBwcm9maWxlIGRlY29kaW5nICAqLworICAgIEZJTVYxX0RFQywKKyAgICBGSU1WMl9ERUMsCisgICAgRklNVjNfREVDLAorICAgIEZJTVY0X0RFQywKKyNpZiBkZWZpbmVkIChNRkM2eF9WRVJTSU9OKQorICAgIFZQOF9ERUMsCisjZW5kaWYKKyAgICBIMjY0X0VOQywKKyAgICBNUEVHNF9FTkMsCisgICAgSDI2M19FTkMsCisgICAgVU5LTk9XTl9UWVBFCit9IFNTQlNJUF9NRkNfQ09ERUNfVFlQRTsKKwordHlwZWRlZiBlbnVtIHsKKyAgICBET05UX0NBUkUgPSAwLAorICAgIElfRlJBTUUgPSAxLAorICAgIE5PVF9DT0RFRCA9IDIKK30gU1NCU0lQX01GQ19GT1JDRV9TRVRfRlJBTUVfVFlQRTsKKwordHlwZWRlZiBlbnVtIHsKKyAgICBOVjEyX0xJTkVBUiA9IDAsCisgICAgTlYxMl9USUxFLAorICAgIE5WMjFfTElORUFSCit9IFNTQlNJUF9NRkNfSU5TVFJNX01PREVfVFlQRTsKKwordHlwZWRlZiBlbnVtIHsKKyAgICBGUkFNRSA9IDAsCisgICAgU0xJQ0UsCit9IFNTQlNJUF9NRkNfT1VUU1RSTV9NT0RFX1RZUEU7CisKK3R5cGVkZWYgZW51bSB7CisgICAgTk9fQ0FDSEUgPSAwLAorICAgIENBQ0hFID0gMQorfSBTU0JJUF9NRkNfQlVGRkVSX1RZUEU7CisKK3R5cGVkZWYgZW51bSB7CisgICAgTUZDX0RFQ19TRVRDT05GX1BPU1RfRU5BQkxFID0gMSwKKyAgICBNRkNfREVDX1NFVENPTkZfRVhUUkFfQlVGRkVSX05VTSwKKyAgICBNRkNfREVDX1NFVENPTkZfRElTUExBWV9ERUxBWSwKKyAgICBNRkNfREVDX1NFVENPTkZfSVNfTEFTVF9GUkFNRSwKKyAgICBNRkNfREVDX1NFVENPTkZfU0xJQ0VfRU5BQkxFLAorICAgIE1GQ19ERUNfU0VUQ09ORl9DUkNfRU5BQkxFLAorICAgIE1GQ19ERUNfU0VUQ09ORl9GSU1WMV9XSURUSF9IRUlHSFQsCisgICAgTUZDX0RFQ19TRVRDT05GX0ZSQU1FX1RBRywKKyAgICBNRkNfREVDX0dFVENPTkZfQ1JDX0RBVEEsCisgICAgTUZDX0RFQ19HRVRDT05GX0JVRl9XSURUSF9IRUlHSFQsCisgICAgTUZDX0RFQ19HRVRDT05GX0NST1BfSU5GTywKKyAgICBNRkNfREVDX0dFVENPTkZfRlJBTUVfVEFHLAorCisgICAgLyogQzIxMCBzcGVjaWZpYyBmZWF0dXJlICovCisgICAgTUZDX0RFQ19TRVRDT05GX0lNTUVESUFURUxZX0RJU1BMQVksCisgICAgTUZDX0RFQ19TRVRDT05GX0RQQl9GTFVTSCwKKyAgICBNRkNfREVDX1NFVENPTkZfUElYRUxfQ0FDSEUsCisgICAgTUZDX0RFQ19HRVRDT05GX1dJRFRIX0hFSUdIVCwKKyNpZmRlZiBTM0RfU1VQUE9SVAorICAgIC8qIFMzRCBzcGVjaWZpYyBmZWF0dXJlICovCisgICAgTUZDX0RFQ19TRVRDT05GX1NFSV9QQVJTRSwKKyAgICBNRkNfREVDX0dFVENPTkZfRlJBTUVfUEFDS0lORworI2VuZGlmCit9IFNTQlNJUF9NRkNfREVDX0NPTkY7CisKK3R5cGVkZWYgZW51bSB7CisgICAgTUZDX0VOQ19TRVRDT05GX0ZSQU1FX1RZUEUgPSAxMDAsCisgICAgTUZDX0VOQ19TRVRDT05GX0NIQU5HRV9GUkFNRV9SQVRFLAorICAgIE1GQ19FTkNfU0VUQ09ORl9DSEFOR0VfQklUX1JBVEUsCisgICAgTUZDX0VOQ19TRVRDT05GX0ZSQU1FX1RBRywKKyAgICBNRkNfRU5DX1NFVENPTkZfQUxMT1dfRlJBTUVfU0tJUCwKKyAgICBNRkNfRU5DX0dFVENPTkZfRlJBTUVfVEFHLAorCisgICAgLyogQzIxMCBzcGVjaWZpYyBmZWF0dXJlICovCisgICAgTUZDX0VOQ19TRVRDT05GX1ZVSV9JTkZPLAorICAgIE1GQ19FTkNfU0VUQ09ORl9JX1BFUklPRCwKKyAgICBNRkNfRU5DX1NFVENPTkZfSElFUl9QLAorI2lmZGVmIFMzRF9TVVBQT1JUCisgICAgLyogUzNEIFNwZWNpZmljIGZlYXR1cmUgKi8KKyAgICBNRkNfRU5DX1NFVENPTkZfU0VJX0dFTiwKKyAgICBNRkNfRU5DX1NFVENPTkZfRlJBTUVfUEFDS0lORywKKyNlbmRpZgorICAgIE1GQ19FTkNfU0VUQ09ORl9GTU8sCisgICAgTUZDX0VOQ19TRVRDT05GX0FTTywKK30gU1NCU0lQX01GQ19FTkNfQ09ORjsKKwordHlwZWRlZiBlbnVtIHsKKyAgICBNRkNfR0VUT1VUQlVGX1NUQVRVU19OVUxMID0gMCwKKyAgICBNRkNfR0VUT1VUQlVGX0RFQ09ESU5HX09OTFkgPSAxLAorICAgIE1GQ19HRVRPVVRCVUZfRElTUExBWV9ERUNPRElORywKKyAgICBNRkNfR0VUT1VUQlVGX0RJU1BMQVlfT05MWSwKKyAgICBNRkNfR0VUT1VUQlVGX0RJU1BMQVlfRU5ELAorICAgIE1GQ19HRVRPVVRCVUZfQ0hBTkdFX1JFU09MCit9IFNTQlNJUF9NRkNfREVDX09VVEJVRl9TVEFUVVM7CisKK3R5cGVkZWYgZW51bSB7CisgICAgTUZDX0ZSQU1FX1RZUEVfTk9UX0NPREVELAorICAgIE1GQ19GUkFNRV9UWVBFX0lfRlJBTUUsCisgICAgTUZDX0ZSQU1FX1RZUEVfUF9GUkFNRSwKKyAgICBNRkNfRlJBTUVfVFlQRV9CX0ZSQU1FLAorICAgIE1GQ19GUkFNRV9UWVBFX09USEVSUworfSBTU0JTSVBfTUZDX0ZSQU1FX1RZUEU7CisKK3R5cGVkZWYgZW51bSB7CisgICAgTUZDX1JFVF9PSyAgICAgICAgICAgICAgICAgICAgICA9IDEsCisgICAgTUZDX1JFVF9GQUlMICAgICAgICAgICAgICAgICAgICA9IC0xMDAwLAorICAgIE1GQ19SRVRfT1BFTl9GQUlMICAgICAgICAgICAgICAgPSAtMTAwMSwKKyAgICBNRkNfUkVUX0NMT1NFX0ZBSUwgICAgICAgICAgICAgID0gLTEwMDIsCisKKyAgICBNRkNfUkVUX0RFQ19JTklUX0ZBSUwgICAgICAgICAgID0gLTIwMDAsCisgICAgTUZDX1JFVF9ERUNfRVhFX1RJTUVfT1VUICAgICAgICA9IC0yMDAxLAorICAgIE1GQ19SRVRfREVDX0VYRV9FUlIgICAgICAgICAgICAgPSAtMjAwMiwKKyAgICBNRkNfUkVUX0RFQ19HRVRfSU5CVUZfRkFJTCAgICAgID0gLTIwMDMsCisgICAgTUZDX1JFVF9ERUNfU0VUX0lOQlVGX0ZBSUwgICAgICA9IC0yMDA0LAorICAgIE1GQ19SRVRfREVDX0dFVF9PVVRCVUZfRkFJTCAgICAgPSAtMjAwNSwKKyAgICBNRkNfUkVUX0RFQ19HRVRfQ09ORl9GQUlMICAgICAgID0gLTIwMDYsCisgICAgTUZDX1JFVF9ERUNfU0VUX0NPTkZfRkFJTCAgICAgICA9IC0yMDA3LAorCisgICAgTUZDX1JFVF9FTkNfSU5JVF9GQUlMICAgICAgICAgICA9IC0zMDAwLAorICAgIE1GQ19SRVRfRU5DX0VYRV9USU1FX09VVCAgICAgICAgPSAtMzAwMSwKKyAgICBNRkNfUkVUX0VOQ19FWEVfRVJSICAgICAgICAgICAgID0gLTMwMDIsCisgICAgTUZDX1JFVF9FTkNfR0VUX0lOQlVGX0ZBSUwgICAgICA9IC0zMDAzLAorICAgIE1GQ19SRVRfRU5DX1NFVF9JTkJVRl9GQUlMICAgICAgPSAtMzAwNCwKKyAgICBNRkNfUkVUX0VOQ19HRVRfT1VUQlVGX0ZBSUwgICAgID0gLTMwMDUsCisgICAgTUZDX1JFVF9FTkNfU0VUX09VVEJVRl9GQUlMICAgICA9IC0zMDA2LAorICAgIE1GQ19SRVRfRU5DX0dFVF9DT05GX0ZBSUwgICAgICAgPSAtMzAwNywKKyAgICBNRkNfUkVUX0VOQ19TRVRfQ09ORl9GQUlMICAgICAgID0gLTMwMDgsCisKKyAgICBNRkNfUkVUX0lOVkFMSURfUEFSQU0gICAgICAgICAgID0gLTQwMDAKK30gU1NCU0lQX01GQ19FUlJPUl9DT0RFOworCit0eXBlZGVmIHN0cnVjdCB7CisgICAgdm9pZCAqWVBoeUFkZHI7ICAgICAgICAgICAgICAgICAgICAgLyogW09VVF0gcGh5c2ljYWwgYWRkcmVzcyBvZiBZICovCisgICAgdm9pZCAqQ1BoeUFkZHI7ICAgICAgICAgICAgICAgICAgICAgLyogW09VVF0gcGh5c2ljYWwgYWRkcmVzcyBvZiBDYkNyICovCisgICAgdm9pZCAqWVZpckFkZHI7ICAgICAgICAgICAgICAgICAgICAgLyogW09VVF0gdmlydHVhbCBhZGRyZXNzIG9mIFkgKi8KKyAgICB2b2lkICpDVmlyQWRkcjsgICAgICAgICAgICAgICAgICAgICAvKiBbT1VUXSB2aXJ0dWFsIGFkZHJlc3Mgb2YgQ2JDciAqLworCisgICAgaW50IGltZ193aWR0aDsgICAgICAgICAgICAgICAgICAgICAgLyogW09VVF0gd2lkdGggb2YgcmVhbCBpbWFnZSAqLworICAgIGludCBpbWdfaGVpZ2h0OyAgICAgICAgICAgICAgICAgICAgIC8qIFtPVVRdIGhlaWdodCBvZiByZWFsIGltYWdlICovCisgICAgaW50IGJ1Zl93aWR0aDsgICAgICAgICAgICAgICAgICAgICAgLyogW09VVF0gd2lkdGggYWxpZ25lZCB0byAxNiAqLworICAgIGludCBidWZfaGVpZ2h0OyAgICAgICAgICAgICAgICAgICAgIC8qIFtPVVRdIGhlaWdodCBhbGlnaGVkIHRvIDE2ICovCisKKyAgICBpbnQgdGltZXN0YW1wX3RvcDsgICAgICAgICAgICAgICAgICAvKiBbT1VUXSB0aW1lc3RhbXAgb2YgdG9wIGZpbGVkKFRoaXMgaXMgdXNlZCBmb3IgaW50ZXJsYWNlZCBzdHJlYW0pICovCisgICAgaW50IHRpbWVzdGFtcF9ib3R0b207ICAgICAgICAgICAgICAgLyogW09VVF0gdGltZXN0YW1wIG9mIGJvdHRvbSBmaWxlZChUaGlzIGlzIHVzZWQgZm9yIGludGVybGFjZWQgc3RyZWFtKSAqLworICAgIGludCBjb25zdW1lZEJ5dGU7ICAgICAgICAgICAgICAgICAgIC8qIFtPVVRdIHRoZSBudW1iZXIgb2YgYnl0ZSBjb25zdW1lZCBkdXJpbmcgZGVjb2RpbmcgKi8KKyAgICBpbnQgcmVzX2NoYW5nZTsgICAgICAgICAgICAgICAgICAgICAvKiBbT1VUXSB3aGV0aGVyIHJlc29sdXRpb24gaXMgY2hhbmdlZCBvciBub3QuIDA6IG5vdCBjaGFuZ2UsIDE6IGluY3JlYXNlZCwgMjogZGVjcmVhc2VkICovCisgICAgaW50IGNyb3BfdG9wX29mZnNldDsgICAgICAgICAgICAgICAgLyogW09VVF0gY3JvcCBpbmZvcm1hdGlvbiwgdG9wX29mZnNldCAqLworICAgIGludCBjcm9wX2JvdHRvbV9vZmZzZXQ7ICAgICAgICAgICAgIC8qIFtPVVRdIGNyb3AgaW5mb3JtYXRpb24sIGJvdHRvbV9vZmZzZXQgKi8KKyAgICBpbnQgY3JvcF9sZWZ0X29mZnNldDsgICAgICAgICAgICAgICAvKiBbT1VUXSBjcm9wIGluZm9ybWF0aW9uLCBsZWZ0X29mZnNldCAqLworICAgIGludCBjcm9wX3JpZ2h0X29mZnNldDsgICAgICAgICAgICAgIC8qIFtPVVRdIGNyb3AgaW5mb3JtYXRpb24sIHJpZ2h0X29mZnNldCAqLworICAgIGludCBkaXNwX3BpY19mcmFtZV90eXBlOyAgICAgICAgICAgIC8qIFtPVVRdIGRpc3BsYXkgcGljdHVyZSBmcmFtZSB0eXBlIGluZm9ybWF0aW9uICovCisKKyAgICAvKiBDMjEwIFVNUCBmZWF0dXJlICovCisgICAgdW5zaWduZWQgaW50IHlfY29va2llOyAgICAgICAgICAgICAgLyogW09VVF0gY29va2llIGZvciBZIGFkZHJlc3MgKi8KKyAgICB1bnNpZ25lZCBpbnQgY19jb29raWU7ICAgICAgICAgICAgICAvKiBbT1VUXSBjb29raWUgZm9yIENiQ3IgYWRkcmVzcywgSWYgaXQgaXMgMCwgWSBhbmQgQ2JDciBpcyBpbiBjb250aW5vdXMgbWVtb3J5ICovCit9IFNTQlNJUF9NRkNfREVDX09VVFBVVF9JTkZPOworCit0eXBlZGVmIHN0cnVjdCB7CisgICAgdm9pZCAqWVBoeUFkZHI7ICAgICAgICAgICAgICAgICAgICAgLyogW0lOL09VVF0gcGh5c2ljYWwgYWRkcmVzcyBvZiBZICovCisgICAgdm9pZCAqQ1BoeUFkZHI7ICAgICAgICAgICAgICAgICAgICAgLyogW0lOL09VVF0gcGh5c2ljYWwgYWRkcmVzcyBvZiBDYkNyICovCisgICAgdm9pZCAqWVZpckFkZHI7ICAgICAgICAgICAgICAgICAgICAgLyogW0lOL09VVF0gdmlydHVhbCBhZGRyZXNzIG9mIFkgKi8KKyAgICB2b2lkICpDVmlyQWRkcjsgICAgICAgICAgICAgICAgICAgICAvKiBbSU4vT1VUXSB2aXJ0dWFsIGFkZHJlc3Mgb2YgQ2JDciAqLworICAgIGludCBZU2l6ZTsgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIFtJTi9PVVRdIGlucHV0IHNpemUgb2YgWSBkYXRhICovCisgICAgaW50IENTaXplOyAgICAgICAgICAgICAgICAgICAgICAgICAgLyogW0lOL09VVF0gaW5wdXQgc2l6ZSBvZiBDYkNyIGRhdGEgKi8KKworICAgIC8qIEMyMTAgVU1QIGZlYXR1cmUgKi8KKyAgICB1bnNpZ25lZCBpbnQgeV9jb29raWU7ICAgICAgICAgICAgICAvKiBbT1VUXSBjb29raWUgZm9yIFkgYWRkcmVzcyAqLworICAgIHVuc2lnbmVkIGludCBjX2Nvb2tpZTsgICAgICAgICAgICAgIC8qIFtPVVRdIGNvb2tpZSBmb3IgQ2JDciBhZGRyZXNzLCBJZiBpdCBpcyAwLCBZIGFuZCBDYkNyIGlzIGluIGNvbnRpbm91cyBtZW1vcnkgKi8KK30gU1NCU0lQX01GQ19FTkNfSU5QVVRfSU5GTzsKKwordHlwZWRlZiBzdHJ1Y3QgeworICAgIHVuc2lnbmVkIGludCBkYXRhU2l6ZTsgICAgICAgICAgICAgIC8qIFtPVVRdIGVuY29kZWQgZGF0YSBzaXplKHdpdGhvdXQgaGVhZGVyKSAqLworICAgIHVuc2lnbmVkIGludCBoZWFkZXJTaXplOyAgICAgICAgICAgIC8qIFtPVVRdIGVuY29kZWQgaGVhZGVyIHNpemUgKi8KKyAgICB1bnNpZ25lZCBpbnQgZnJhbWVUeXBlOyAgICAgICAgICAgICAvKiBbT1VUXSBmcmFtZSB0eXBlIG9mIGVuY29kZWQgc3RyZWFtICovCisgICAgdm9pZCAqU3RybVBoeUFkZHI7ICAgICAgICAgICAgICAgICAgLyogW09VVF0gcGh5c2ljYWwgYWRkcmVzcyBvZiBZICovCisgICAgdm9pZCAqU3RybVZpckFkZHI7ICAgICAgICAgICAgICAgICAgLyogW09VVF0gdmlydHVhbCBhZGRyZXNzIG9mIFkgKi8KKyAgICB2b2lkICplbmNvZGVkWVBoeUFkZHI7ICAgICAgICAgICAgICAvKiBbT1VUXSBwaHlzaWNhbCBhZGRyZXNzIG9mIFkgd2hpY2ggaXMgZmx1c2hlZCAqLworICAgIHZvaWQgKmVuY29kZWRDUGh5QWRkcjsgICAgICAgICAgICAgIC8qIFtPVVRdIHBoeXNpY2FsIGFkZHJlc3Mgb2YgQyB3aGljaCBpcyBmbHVzaGVkICovCisKKyAgICAvKiBDMjEwIFVNUCBmZWF0dXJlICovCisgICAgdW5zaWduZWQgaW50IHN0cm1fY29va2llOyAgICAgICAgICAgLyogW09VVF0gY29va2UgZm9yIHN0cmVhbSBidWZmZXIgKi8KKyAgICB1bnNpZ25lZCBpbnQgeV9lbmNvZGVkX2Nvb2tpZTsgICAgICAvKiBbT1VUXSBjb29raWUgZm9yIFkgYWRkcmVzcyAqLworICAgIHVuc2lnbmVkIGludCBjX2VuY29kZWRfY29va2llOyAgICAgIC8qIFtPVVRdIGNvb2tpZSBmb3IgQ2JDciBhZGRyZXNzLCBJZiBpdCBpcyAwLCBZIGFuZCBDYkNyIGlzIGluIGNvbnRpbm91cyBtZW1vcnkgKi8KK30gU1NCU0lQX01GQ19FTkNfT1VUUFVUX0lORk87CisKK3R5cGVkZWYgc3RydWN0IHsKKyAgICAvKiBjb21tb24gcGFyYW1ldGVycyAqLworICAgIFNTQlNJUF9NRkNfQ09ERUNfVFlQRSBjb2RlY1R5cGU7ICAgICAgICAgICAgLyogW0lOXSBjb2RlYyB0eXBlICovCisgICAgaW50IFNvdXJjZVdpZHRoOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBbSU5dIHdpZHRoIG9mIHZpZGVvIHRvIGJlIGVuY29kZWQgKi8KKyAgICBpbnQgU291cmNlSGVpZ2h0OyAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIFtJTl0gaGVpZ2h0IG9mIHZpZGVvIHRvIGJlIGVuY29kZWQgKi8KKyAgICBpbnQgSURSUGVyaW9kOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIFtJTl0gR09QIG51bWJlcihpbnRlcnZhbCBvZiBJLWZyYW1lKSAqLworICAgIGludCBTbGljZU1vZGU7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogW0lOXSBNdWx0aSBzbGljZSBtb2RlICovCisgICAgaW50IFJhbmRvbUludHJhTUJSZWZyZXNoOyAgICAgICAgICAgICAgICAgICAvKiBbSU5dIGN5Y2xpYyBpbnRyYSByZWZyZXNoICovCisgICAgaW50IEVuYWJsZUZSTVJhdGVDb250cm9sOyAgICAgICAgICAgICAgICAgICAvKiBbSU5dIGZyYW1lIGJhc2VkIHJhdGUgY29udHJvbCBlbmFibGUgKi8KKyAgICBpbnQgQml0cmF0ZTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIFtJTl0gcmF0ZSBjb250cm9sIHBhcmFtZXRlcihiaXQgcmF0ZSkgKi8KKyAgICBpbnQgRnJhbWVRcDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIFtJTl0gVGhlIHF1YW50aXphdGlvbiBwYXJhbWV0ZXIgb2YgdGhlIGZyYW1lICovCisgICAgaW50IEZyYW1lUXBfUDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBbSU5dIFRoZSBxdWFudGl6YXRpb24gcGFyYW1ldGVyIG9mIHRoZSBQIGZyYW1lICovCisgICAgaW50IFFTQ29kZU1heDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBbSU5dIE1heGltdW0gUXVhbnRpemF0aW9uIHZhbHVlICovCisgICAgaW50IFFTQ29kZU1pbjsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBbSU5dIE1pbmltdW0gUXVhbnRpemF0aW9uIHZhbHVlICovCisgICAgaW50IENCUlBlcmlvZFJmOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBbSU5dIFJlYWN0aW9uIGNvZWZmaWNpZW50IHBhcmFtZXRlciBmb3IgcmF0ZSBjb250cm9sICovCisgICAgaW50IFBhZENvbnRyb2xPbjsgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBbSU5dIEVuYWJsZSBwYWRkaW5nIGNvbnRyb2wgKi8KKyAgICBpbnQgTHVtYVBhZFZhbDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIFtJTl0gTHVtYSBwZWwgdmFsdWUgdXNlZCB0byBmaWxsIHBhZGRpbmcgYXJlYSAqLworICAgIGludCBDYlBhZFZhbDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogW0lOXSBDQiBwZWwgdmFsdWUgdXNlZCB0byBmaWxsIHBhZGRpbmcgYXJlYSAqLworICAgIGludCBDclBhZFZhbDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogW0lOXSBDUiBwZWwgdmFsdWUgdXNlZCB0byBmaWxsIHBhZGRpbmcgYXJlYSAqLworICAgIGludCBGcmFtZU1hcDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogW0lOXSBFbmNvZGluZyBpbnB1dCBtb2RlKHRpbGUgbW9kZSBvciBsaW5lYXIgbW9kZSkgKi8KKyAgICBTU0JTSVBfTUZDX09VVFNUUk1fTU9ERV9UWVBFIE91dHB1dE1vZGU7ICAgIC8qIFtJTl0gT3V0cHV0IG1vZGU6IEZyYW1lL1NsaWNlICovCisKKyAgICAvKiBILjI2NCBzcGVjaWZpYyBwYXJhbWV0ZXJzICovCisgICAgaW50IFByb2ZpbGVJREM7ICAgICAgICAgICAgICAgICAgICAgLyogW0lOXSBwcm9maWxlICovCisgICAgaW50IExldmVsSURDOyAgICAgICAgICAgICAgICAgICAgICAgLyogW0lOXSBsZXZlbCAqLworICAgIGludCBGcmFtZVFwX0I7ICAgICAgICAgICAgICAgICAgICAgIC8qIFtJTl0gVGhlIHF1YW50aXphdGlvbiBwYXJhbWV0ZXIgb2YgdGhlIEIgZnJhbWUgKi8KKyAgICBpbnQgRnJhbWVSYXRlOyAgICAgICAgICAgICAgICAgICAgICAvKiBbSU5dIHJhdGUgY29udHJvbCBwYXJhbWV0ZXIoZnJhbWUgcmF0ZSkgKi8KKyAgICBpbnQgU2xpY2VBcmd1bWVudDsgICAgICAgICAgICAgICAgICAvKiBbSU5dIE1CIG51bWJlciBvciBieXRlIG51bWJlciAqLworICAgIGludCBOdW1iZXJCRnJhbWVzOyAgICAgICAgICAgICAgICAgIC8qIFtJTl0gVGhlIG51bWJlciBvZiBjb25zZWN1dGl2ZSBCIGZyYW1lIGluc2VydGVkICovCisgICAgaW50IE51bWJlclJlZmVyZW5jZUZyYW1lczsgICAgICAgICAgLyogW0lOXSBUaGUgbnVtYmVyIG9mIHJlZmVyZW5jZSBwaWN0dXJlcyB1c2VkICovCisgICAgaW50IE51bWJlclJlZkZvclBmcmFtZXM7ICAgICAgICAgICAgLyogW0lOXSBUaGUgbnVtYmVyIG9mIHJlZmVyZW5jZSBwaWN0dXJlcyB1c2VkIGZvciBlbmNvZGluZyBQIHBpY3R1cmVzICovCisgICAgaW50IExvb3BGaWx0ZXJEaXNhYmxlOyAgICAgICAgICAgICAgLyogW0lOXSBkaXNhYmxlIHRoZSBsb29wIGZpbHRlciAqLworICAgIGludCBMb29wRmlsdGVyQWxwaGFDME9mZnNldDsgICAgICAgIC8qIFtJTl0gQWxwaGEgJiBDMCBvZmZzZXQgZm9yIEguMjY0IGxvb3AgZmlsdGVyICovCisgICAgaW50IExvb3BGaWx0ZXJCZXRhT2Zmc2V0OyAgICAgICAgICAgLyogW0lOXSBCZXRhIG9mZnNldCBmb3IgSC4yNjQgbG9vcCBmaWx0ZXIgKi8KKyAgICBpbnQgU3ltYm9sTW9kZTsgICAgICAgICAgICAgICAgICAgICAvKiBbSU5dIFRoZSBtb2RlIG9mIGVudHJvcHkgY29kaW5nKENBQkFDLCBDQVZMQykgKi8KKyAgICBpbnQgUGljdHVyZUludGVybGFjZTsgICAgICAgICAgICAgICAvKiBbSU5dIEVuYWJsZXMgdGhlIGludGVybGFjZSBtb2RlICovCisgICAgaW50IFRyYW5zZm9ybTh4OE1vZGU7ICAgICAgICAgICAgICAgLyogW0lOXSBBbGxvdyA4eDggdHJhbnNmb3JtKFRoaXMgaXMgYWxsb3dlZCBvbmx5IGZvciBoaWdoIHByb2ZpbGUpICovCisgICAgaW50IEVuYWJsZU1CUmF0ZUNvbnRyb2w7ICAgICAgICAgICAgLyogW0lOXSBFbmFibGUgbWFjcm9ibG9jay1sZXZlbCByYXRlIGNvbnRyb2wgKi8KKyAgICBpbnQgRGFya0Rpc2FibGU7ICAgICAgICAgICAgICAgICAgICAvKiBbSU5dIERpc2FibGUgYWRhcHRpdmUgcmF0ZSBjb250cm9sIG9uIGRhcmsgcmVnaW9uICovCisgICAgaW50IFNtb290aERpc2FibGU7ICAgICAgICAgICAgICAgICAgLyogW0lOXSBEaXNhYmxlIGFkYXB0aXZlIHJhdGUgY29udHJvbCBvbiBzbW9vdGggcmVnaW9uICovCisgICAgaW50IFN0YXRpY0Rpc2FibGU7ICAgICAgICAgICAgICAgICAgLyogW0lOXSBEaXNhYmxlIGFkYXB0aXZlIHJhdGUgY29udHJvbCBvbiBzdGF0aWMgcmVnaW9uICovCisgICAgaW50IEFjdGl2aXR5RGlzYWJsZTsgICAgICAgICAgICAgICAgLyogW0lOXSBEaXNhYmxlIGFkYXB0aXZlIHJhdGUgY29udHJvbCBvbiBoaWdoIGFjdGl2aXR5IHJlZ2lvbiAqLworfSBTU0JTSVBfTUZDX0VOQ19IMjY0X1BBUkFNOworCit0eXBlZGVmIHN0cnVjdCB7CisgICAgLyogY29tbW9uIHBhcmFtZXRlcnMgKi8KKyAgICBTU0JTSVBfTUZDX0NPREVDX1RZUEUgY29kZWNUeXBlOyAgICAgICAgICAgIC8qIFtJTl0gY29kZWMgdHlwZSAqLworICAgIGludCBTb3VyY2VXaWR0aDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogW0lOXSB3aWR0aCBvZiB2aWRlbyB0byBiZSBlbmNvZGVkICovCisgICAgaW50IFNvdXJjZUhlaWdodDsgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBbSU5dIGhlaWdodCBvZiB2aWRlbyB0byBiZSBlbmNvZGVkICovCisgICAgaW50IElEUlBlcmlvZDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBbSU5dIEdPUCBudW1iZXIoaW50ZXJ2YWwgb2YgSS1mcmFtZSkgKi8KKyAgICBpbnQgU2xpY2VNb2RlOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIFtJTl0gTXVsdGkgc2xpY2UgbW9kZSAqLworICAgIGludCBSYW5kb21JbnRyYU1CUmVmcmVzaDsgICAgICAgICAgICAgICAgICAgLyogW0lOXSBjeWNsaWMgaW50cmEgcmVmcmVzaCAqLworICAgIGludCBFbmFibGVGUk1SYXRlQ29udHJvbDsgICAgICAgICAgICAgICAgICAgLyogW0lOXSBmcmFtZSBiYXNlZCByYXRlIGNvbnRyb2wgZW5hYmxlICovCisgICAgaW50IEJpdHJhdGU7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBbSU5dIHJhdGUgY29udHJvbCBwYXJhbWV0ZXIoYml0IHJhdGUpICovCisgICAgaW50IEZyYW1lUXA7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBbSU5dIFRoZSBxdWFudGl6YXRpb24gcGFyYW1ldGVyIG9mIHRoZSBmcmFtZSAqLworICAgIGludCBGcmFtZVFwX1A7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogW0lOXSBUaGUgcXVhbnRpemF0aW9uIHBhcmFtZXRlciBvZiB0aGUgUCBmcmFtZSAqLworICAgIGludCBRU0NvZGVNYXg7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogW0lOXSBNYXhpbXVtIFF1YW50aXphdGlvbiB2YWx1ZSAqLworICAgIGludCBRU0NvZGVNaW47ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogW0lOXSBNaW5pbXVtIFF1YW50aXphdGlvbiB2YWx1ZSAqLworICAgIGludCBDQlJQZXJpb2RSZjsgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogW0lOXSBSZWFjdGlvbiBjb2VmZmljaWVudCBwYXJhbWV0ZXIgZm9yIHJhdGUgY29udHJvbCAqLworICAgIGludCBQYWRDb250cm9sT247ICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogW0lOXSBFbmFibGUgcGFkZGluZyBjb250cm9sICovCisgICAgaW50IEx1bWFQYWRWYWw7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBbSU5dIEx1bWEgcGVsIHZhbHVlIHVzZWQgdG8gZmlsbCBwYWRkaW5nIGFyZWEgKi8KKyAgICBpbnQgQ2JQYWRWYWw7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIFtJTl0gQ0IgcGVsIHZhbHVlIHVzZWQgdG8gZmlsbCBwYWRkaW5nIGFyZWEgKi8KKyAgICBpbnQgQ3JQYWRWYWw7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIFtJTl0gQ1IgcGVsIHZhbHVlIHVzZWQgdG8gZmlsbCBwYWRkaW5nIGFyZWEgKi8KKyAgICBpbnQgRnJhbWVNYXA7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIFtJTl0gRW5jb2RpbmcgaW5wdXQgbW9kZSh0aWxlIG1vZGUgb3IgbGluZWFyIG1vZGUpICovCisgICAgU1NCU0lQX01GQ19PVVRTVFJNX01PREVfVFlQRSBPdXRwdXRNb2RlOyAgICAvKiBbSU5dIE91dHB1dCBtb2RlOiBGcmFtZS9TbGljZSAqLworI2lmIGRlZmluZWQgKE1GQzZ4X1ZFUlNJT04pCisgICAgaW50IEVuYWJsZU1CUmF0ZUNvbnRyb2w7ICAgICAgICAgICAgICAgICAgICAvKiBbSU5dIEVuYWJsZSBtYWNyb2Jsb2NrLWxldmVsIHJhdGUgY29udHJvbCwgTUZDNi54IE9ubHkgKi8KKyNlbmRpZgorCisgICAgLyogTVBFRzQgc3BlY2lmaWMgcGFyYW1ldGVycyAqLworICAgIGludCBQcm9maWxlSURDOyAgICAgICAgICAgICAgICAgICAgIC8qIFtJTl0gcHJvZmlsZSAqLworICAgIGludCBMZXZlbElEQzsgICAgICAgICAgICAgICAgICAgICAgIC8qIFtJTl0gbGV2ZWwgKi8KKyAgICBpbnQgRnJhbWVRcF9COyAgICAgICAgICAgICAgICAgICAgICAvKiBbSU5dIFRoZSBxdWFudGl6YXRpb24gcGFyYW1ldGVyIG9mIHRoZSBCIGZyYW1lICovCisgICAgaW50IFRpbWVJbmNyZWFtZW50UmVzOyAgICAgICAgICAgICAgLyogW0lOXSBmcmFtZSByYXRlICovCisgICAgaW50IFZvcFRpbWVJbmNyZWFtZW50OyAgICAgICAgICAgICAgLyogW0lOXSBmcmFtZSByYXRlICovCisgICAgaW50IFNsaWNlQXJndW1lbnQ7ICAgICAgICAgICAgICAgICAgLyogW0lOXSBNQiBudW1iZXIgb3IgYnl0ZSBudW1iZXIgKi8KKyAgICBpbnQgTnVtYmVyQkZyYW1lczsgICAgICAgICAgICAgICAgICAvKiBbSU5dIFRoZSBudW1iZXIgb2YgY29uc2VjdXRpdmUgQiBmcmFtZSBpbnNlcnRlZCAqLworICAgIGludCBEaXNhYmxlUXBlbE1FOyAgICAgICAgICAgICAgICAgIC8qIFtJTl0gZGlzYWJsZSBxdWFydGVyLXBpeGVsIG1vdGlvbiBlc3RpbWF0aW9uICovCit9IFNTQlNJUF9NRkNfRU5DX01QRUc0X1BBUkFNOworCit0eXBlZGVmIHN0cnVjdCB7CisgICAgLyogY29tbW9uIHBhcmFtZXRlcnMgKi8KKyAgICBTU0JTSVBfTUZDX0NPREVDX1RZUEUgY29kZWNUeXBlOyAgICAgICAgICAgIC8qIFtJTl0gY29kZWMgdHlwZSAqLworICAgIGludCBTb3VyY2VXaWR0aDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogW0lOXSB3aWR0aCBvZiB2aWRlbyB0byBiZSBlbmNvZGVkICovCisgICAgaW50IFNvdXJjZUhlaWdodDsgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBbSU5dIGhlaWdodCBvZiB2aWRlbyB0byBiZSBlbmNvZGVkICovCisgICAgaW50IElEUlBlcmlvZDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBbSU5dIEdPUCBudW1iZXIoaW50ZXJ2YWwgb2YgSS1mcmFtZSkgKi8KKyAgICBpbnQgU2xpY2VNb2RlOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIFtJTl0gTXVsdGkgc2xpY2UgbW9kZSAqLworICAgIGludCBSYW5kb21JbnRyYU1CUmVmcmVzaDsgICAgICAgICAgICAgICAgICAgLyogW0lOXSBjeWNsaWMgaW50cmEgcmVmcmVzaCAqLworICAgIGludCBFbmFibGVGUk1SYXRlQ29udHJvbDsgICAgICAgICAgICAgICAgICAgLyogW0lOXSBmcmFtZSBiYXNlZCByYXRlIGNvbnRyb2wgZW5hYmxlICovCisgICAgaW50IEJpdHJhdGU7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBbSU5dIHJhdGUgY29udHJvbCBwYXJhbWV0ZXIoYml0IHJhdGUpICovCisgICAgaW50IEZyYW1lUXA7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBbSU5dIFRoZSBxdWFudGl6YXRpb24gcGFyYW1ldGVyIG9mIHRoZSBmcmFtZSAqLworICAgIGludCBGcmFtZVFwX1A7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogW0lOXSBUaGUgcXVhbnRpemF0aW9uIHBhcmFtZXRlciBvZiB0aGUgUCBmcmFtZSAqLworICAgIGludCBRU0NvZGVNYXg7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogW0lOXSBNYXhpbXVtIFF1YW50aXphdGlvbiB2YWx1ZSAqLworICAgIGludCBRU0NvZGVNaW47ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogW0lOXSBNaW5pbXVtIFF1YW50aXphdGlvbiB2YWx1ZSAqLworICAgIGludCBDQlJQZXJpb2RSZjsgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogW0lOXSBSZWFjdGlvbiBjb2VmZmljaWVudCBwYXJhbWV0ZXIgZm9yIHJhdGUgY29udHJvbCAqLworICAgIGludCBQYWRDb250cm9sT247ICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogW0lOXSBFbmFibGUgcGFkZGluZyBjb250cm9sICovCisgICAgaW50IEx1bWFQYWRWYWw7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBbSU5dIEx1bWEgcGVsIHZhbHVlIHVzZWQgdG8gZmlsbCBwYWRkaW5nIGFyZWEgKi8KKyAgICBpbnQgQ2JQYWRWYWw7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIFtJTl0gQ0IgcGVsIHZhbHVlIHVzZWQgdG8gZmlsbCBwYWRkaW5nIGFyZWEgKi8KKyAgICBpbnQgQ3JQYWRWYWw7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIFtJTl0gQ1IgcGVsIHZhbHVlIHVzZWQgdG8gZmlsbCBwYWRkaW5nIGFyZWEgKi8KKyAgICBpbnQgRnJhbWVNYXA7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIFtJTl0gRW5jb2RpbmcgaW5wdXQgbW9kZSh0aWxlIG1vZGUgb3IgbGluZWFyIG1vZGUpICovCisjaWYgZGVmaW5lZCAoTUZDNnhfVkVSU0lPTikKKyAgICBpbnQgRW5hYmxlTUJSYXRlQ29udHJvbDsgICAgICAgICAgICAgICAgICAgIC8qIFtJTl0gRW5hYmxlIG1hY3JvYmxvY2stbGV2ZWwgcmF0ZSBjb250cm9sLCBNRkM2LnggT25seSAqLworI2VuZGlmCisKKyAgICAvKiBILjI2MyBzcGVjaWZpYyBwYXJhbWV0ZXJzICovCisgICAgaW50IEZyYW1lUmF0ZTsgICAgICAgICAgICAgICAgICAgICAgLyogW0lOXSByYXRlIGNvbnRyb2wgcGFyYW1ldGVyKGZyYW1lIHJhdGUpICovCit9IFNTQlNJUF9NRkNfRU5DX0gyNjNfUEFSQU07CisKK3R5cGVkZWYgc3RydWN0IHsKKyAgICBpbnQgd2lkdGg7CisgICAgaW50IGhlaWdodDsKKyAgICBpbnQgYnVmX3dpZHRoOworICAgIGludCBidWZfaGVpZ2h0OworfSBTU0JTSVBfTUZDX0lNR19SRVNPTFVUSU9OOworCit0eXBlZGVmIHN0cnVjdCB7CisgICAgaW50IGNyb3BfdG9wX29mZnNldDsKKyAgICBpbnQgY3JvcF9ib3R0b21fb2Zmc2V0OworICAgIGludCBjcm9wX2xlZnRfb2Zmc2V0OworICAgIGludCBjcm9wX3JpZ2h0X29mZnNldDsKK30gU1NCU0lQX01GQ19DUk9QX0lORk9STUFUSU9OOworCisjaWZkZWYgUzNEX1NVUFBPUlQKK3R5cGVkZWYgc3RydWN0IHsKKyAgICBpbnQgICAgICAgICAgIGF2YWlsYWJsZTsKKyAgICB1bnNpZ25lZCBpbnQgIGFycmFuZ2VtZW50X2lkOworICAgIGludCAgICAgICAgICAgYXJyYW5nZW1lbnRfY2FuY2VsX2ZsYWc7CisgICAgdW5zaWduZWQgY2hhciBhcnJhbmdlbWVudF90eXBlOworICAgIGludCAgICAgICAgICAgcXVpbmN1bnhfc2FtcGxpbmdfZmxhZzsKKyAgICB1bnNpZ25lZCBjaGFyIGNvbnRlbnRfaW50ZXJwcmV0YXRpb25fdHlwZTsKKyAgICBpbnQgICAgICAgICAgIHNwYXRpYWxfZmxpcHBpbmdfZmxhZzsKKyAgICBpbnQgICAgICAgICAgIGZyYW1lMF9mbGlwcGVkX2ZsYWc7CisgICAgaW50ICAgICAgICAgICBmaWVsZF92aWV3c19mbGFnOworICAgIGludCAgICAgICAgICAgY3VycmVudF9mcmFtZV9pc19mcmFtZTBfZmxhZzsKKyAgICB1bnNpZ25lZCBjaGFyIGZyYW1lMF9ncmlkX3Bvc194OworICAgIHVuc2lnbmVkIGNoYXIgZnJhbWUwX2dyaWRfcG9zX3k7CisgICAgdW5zaWduZWQgY2hhciBmcmFtZTFfZ3JpZF9wb3NfeDsKKyAgICB1bnNpZ25lZCBjaGFyIGZyYW1lMV9ncmlkX3Bvc195OworfSBTU0JTSVBfTUZDX0ZSQU1FX1BBQ0tJTkc7CisjZW5kaWYKKworI2lmZGVmIF9fY3BsdXNwbHVzCitleHRlcm4gIkMiIHsKKyNlbmRpZgorCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKy8qIERlY29kaW5nIEFQSXMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCit2b2lkICpTc2JTaXBNZmNEZWNPcGVuKHZvaWQpOwordm9pZCAqU3NiU2lwTWZjRGVjT3BlbkV4dCh2b2lkICp2YWx1ZSk7CitTU0JTSVBfTUZDX0VSUk9SX0NPREUgU3NiU2lwTWZjRGVjSW5pdCh2b2lkICpvcGVuSGFuZGxlLCBTU0JTSVBfTUZDX0NPREVDX1RZUEUgY29kZWNfdHlwZSwgaW50IEZyYW1lbGVuZyk7CitTU0JTSVBfTUZDX0VSUk9SX0NPREUgU3NiU2lwTWZjRGVjRXhlKHZvaWQgKm9wZW5IYW5kbGUsIGludCBsZW5ndGhCdWZGaWxsKTsKKy8vU1NCU0lQX01GQ19FUlJPUl9DT0RFIFNzYlNpcE1mY0RlY0V4ZU5iKHZvaWQgKm9wZW5IYW5kbGUsIGludCBsZW5ndGhCdWZGaWxsKTsKK1NTQlNJUF9NRkNfRVJST1JfQ09ERSBTc2JTaXBNZmNEZWNDbG9zZSh2b2lkICpvcGVuSGFuZGxlKTsKK3ZvaWQgICpTc2JTaXBNZmNEZWNHZXRJbkJ1Zih2b2lkICpvcGVuSGFuZGxlLCB2b2lkICoqcGh5SW5CdWYsIGludCBpbnB1dEJ1ZmZlclNpemUpOworLy9TU0JTSVBfTUZDX0RFQ19PVVRCVUZfU1RBVFVTIFNzYlNpcE1mY0RlY1dhaXRGb3JPdXRCdWYodm9pZCAqb3BlbkhhbmRsZSwgU1NCU0lQX01GQ19ERUNfT1VUUFVUX0lORk8gKm91dHB1dF9pbmZvKTsKKworI2lmIChkZWZpbmVkKENPTkZJR19WSURFT19NRkNfVkNNX1VNUCkgfHwgZGVmaW5lZChVU0VfVU1QKSkKK1NTQlNJUF9NRkNfRVJST1JfQ09ERSBTc2JTaXBNZmNEZWNTZXRJbkJ1Zih2b2lkICpvcGVuSGFuZGxlLCB1bnNpZ25lZCBpbnQgc2VjdXJlX2lkLCBpbnQgc2l6ZSk7CisjZWxzZQorU1NCU0lQX01GQ19FUlJPUl9DT0RFIFNzYlNpcE1mY0RlY1NldEluQnVmKHZvaWQgKm9wZW5IYW5kbGUsIHZvaWQgKnBoeUluQnVmLCB2b2lkICp2aXJJbkJ1ZiwgaW50IHNpemUpOworI2VuZGlmCisKK1NTQlNJUF9NRkNfREVDX09VVEJVRl9TVEFUVVMgU3NiU2lwTWZjRGVjR2V0T3V0QnVmKHZvaWQgKm9wZW5IYW5kbGUsIFNTQlNJUF9NRkNfREVDX09VVFBVVF9JTkZPICpvdXRwdXRfaW5mbyk7CisKK1NTQlNJUF9NRkNfRVJST1JfQ09ERSBTc2JTaXBNZmNEZWNTZXRDb25maWcodm9pZCAqb3BlbkhhbmRsZSwgU1NCU0lQX01GQ19ERUNfQ09ORiBjb25mX3R5cGUsIHZvaWQgKnZhbHVlKTsKK1NTQlNJUF9NRkNfRVJST1JfQ09ERSBTc2JTaXBNZmNEZWNHZXRDb25maWcodm9pZCAqb3BlbkhhbmRsZSwgU1NCU0lQX01GQ19ERUNfQ09ORiBjb25mX3R5cGUsIHZvaWQgKnZhbHVlKTsKKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisvKiBFbmNvZGluZyBBUElzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwordm9pZCAqU3NiU2lwTWZjRW5jT3Blbih2b2lkKTsKK3ZvaWQgKlNzYlNpcE1mY0VuY09wZW5FeHQodm9pZCAqdmFsdWUpOworU1NCU0lQX01GQ19FUlJPUl9DT0RFIFNzYlNpcE1mY0VuY0luaXQodm9pZCAqb3BlbkhhbmRsZSwgdm9pZCAqcGFyYW0pOworU1NCU0lQX01GQ19FUlJPUl9DT0RFIFNzYlNpcE1mY0VuY0V4ZSh2b2lkICpvcGVuSGFuZGxlKTsKK1NTQlNJUF9NRkNfRVJST1JfQ09ERSBTc2JTaXBNZmNFbmNDbG9zZSh2b2lkICpvcGVuSGFuZGxlKTsKKworU1NCU0lQX01GQ19FUlJPUl9DT0RFIFNzYlNpcE1mY0VuY0dldEluQnVmKHZvaWQgKm9wZW5IYW5kbGUsIFNTQlNJUF9NRkNfRU5DX0lOUFVUX0lORk8gKmlucHV0X2luZm8pOworU1NCU0lQX01GQ19FUlJPUl9DT0RFIFNzYlNpcE1mY0VuY1NldEluQnVmKHZvaWQgKm9wZW5IYW5kbGUsIFNTQlNJUF9NRkNfRU5DX0lOUFVUX0lORk8gKmlucHV0X2luZm8pOworCitTU0JTSVBfTUZDX0VSUk9SX0NPREUgU3NiU2lwTWZjRW5jR2V0T3V0QnVmKHZvaWQgKm9wZW5IYW5kbGUsIFNTQlNJUF9NRkNfRU5DX09VVFBVVF9JTkZPICpvdXRwdXRfaW5mbyk7CitTU0JTSVBfTUZDX0VSUk9SX0NPREUgU3NiU2lwTWZjRW5jU2V0T3V0QnVmKHZvaWQgKm9wZW5IYW5kbGUsIHZvaWQgKnBoeU91dGJ1Ziwgdm9pZCAqdmlyT3V0YnVmLCBpbnQgb3V0cHV0QnVmZmVyU2l6ZSk7CisKK1NTQlNJUF9NRkNfRVJST1JfQ09ERSBTc2JTaXBNZmNFbmNTZXRDb25maWcodm9pZCAqb3BlbkhhbmRsZSwgU1NCU0lQX01GQ19FTkNfQ09ORiBjb25mX3R5cGUsIHZvaWQgKnZhbHVlKTsKK1NTQlNJUF9NRkNfRVJST1JfQ09ERSBTc2JTaXBNZmNFbmNHZXRDb25maWcodm9pZCAqb3BlbkhhbmRsZSwgU1NCU0lQX01GQ19FTkNfQ09ORiBjb25mX3R5cGUsIHZvaWQgKnZhbHVlKTsKKworI2lmZGVmIF9fY3BsdXNwbHVzCit9CisjZW5kaWYKKworI2VuZGlmIC8qIF9TU0JTSVBfTUZDX0FQSV9IXyAqLwpkaWZmIC0tZ2l0IGEvZXh5bm9zNC9tdWx0aW1lZGlhL2NvZGVjcy9zZWNfY29kZWNzL3ZpZGVvL2V4eW5vczUvbWZjX3Y0bDIvaW5jbHVkZS9tZmNfZXJybm8uaCBiL2V4eW5vczQvbXVsdGltZWRpYS9jb2RlY3Mvc2VjX2NvZGVjcy92aWRlby9leHlub3M1L21mY192NGwyL2luY2x1ZGUvbWZjX2Vycm5vLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjhlOTZhYgotLS0gL2Rldi9udWxsCisrKyBiL2V4eW5vczQvbXVsdGltZWRpYS9jb2RlY3Mvc2VjX2NvZGVjcy92aWRlby9leHlub3M1L21mY192NGwyL2luY2x1ZGUvbWZjX2Vycm5vLmgKQEAgLTAsMCArMSw3OSBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxMCBTYW1zdW5nIEVsZWN0cm9uaWNzIENvLiwgTHRkLgorICogICAgICAgICAgICAgIGh0dHA6Ly93d3cuc2Ftc3VuZy5jb20vCisgKgorICogR2xvYmFsIGhlYWRlciBmb3IgU2Ftc3VuZyBNRkMgKE11bHRpIEZ1bmN0aW9uIENvZGVjIC0gRklNVikgZHJpdmVyCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIGFzCisgKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqCisgKiBBbHRlcm5hdGl2ZWx5LCBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2lmbmRlZiBfX01GQ19FUlJOT19ICisjZGVmaW5lIF9fTUZDX0VSUk5PX0ggX19GSUxFX18KKworZW51bSBtZmNfcmV0X2NvZGUgeworICAgIE1GQ19PSyA9IDEsCisgICAgTUZDX0ZBSUwgPSAtMTAwMCwKKyAgICBNRkNfT1BFTl9GQUlMID0gLTEwMDEsCisgICAgTUZDX0NMT1NFX0ZBSUwgPSAtMTAwMiwKKworICAgIE1GQ19ERUNfSU5JVF9GQUlMID0gLTIwMDAsCisgICAgTUZDX0RFQ19FWEVfVElNRV9PVVQgPSAtMjAwMSwKKyAgICBNRkNfREVDX0VYRV9FUlIgPSAtMjAwMiwKKyAgICBNRkNfREVDX0dFVF9JTkJVRl9GQUlMID0gMjAwMywKKyAgICBNRkNfREVDX1NFVF9JTkJVRl9GQUlMID0gMjAwNCwKKyAgICBNRkNfREVDX0dFVF9PVVRCVUZfRkFJTCA9IC0yMDA1LAorICAgIE1GQ19ERUNfR0VUX0NPTkZfRkFJTCA9IC0yMDA2LAorICAgIE1GQ19ERUNfU0VUX0NPTkZfRkFJTCA9IC0yMDA3LAorCisgICAgTUZDX0VOQ19JTklUX0ZBSUwgPSAtMzAwMCwKKyAgICBNRkNfRU5DX0VYRV9USU1FX09VVCA9IC0zMDAxLAorICAgIE1GQ19FTkNfRVhFX0VSUiA9IC0zMDAyLAorICAgIE1GQ19FTkNfR0VUX0lOQlVGX0ZBSUwgPSAtMzAwMywKKyAgICBNRkNfRU5DX1NFVF9JTkJVRl9GQUlMID0gLTMwMDQsCisgICAgTUZDX0VOQ19HRVRfT1VUQlVGX0ZBSUwgPSAtMzAwNSwKKyAgICBNRkNfRU5DX1NFVF9PVVRCVUZfRkFJTCA9IC0zMDA2LAorICAgIE1GQ19FTkNfR0VUX0NPTkZfRkFJTCA9IC0zMDA3LAorICAgIE1GQ19FTkNfU0VUX0NPTkZfRkFJTCA9IC0zMDA4LAorCisgICAgTUZDX1NUQVRFX0lOVkFMSUQgPSAtNDAwMCwKKyAgICBNRkNfREVDX0hFQURFUl9GQUlMID0gLTQwMDEsCisgICAgTUZDX0RFQ19JTklUX0JVRl9GQUlMID0gLTQwMDIsCisgICAgTUZDX0VOQ19IRUFERVJfRkFJTCA9IC01MDAwLAorICAgIE1GQ19FTkNfUEFSQU1fRkFJTCA9IC01MDAxLAorICAgIE1GQ19GUk1fQlVGX1NJWkVfRkFJTCA9IC02MDAwLAorICAgIE1GQ19GV19MT0FEX0ZBSUwgPSAtNjAwMSwKKyAgICBNRkNfRldfSU5JVF9GQUlMID0gLTYwMDIsCisgICAgTUZDX0lOU1RfTlVNX0VYQ0VFREVEX0ZBSUwgPSAtNjAwMywKKyAgICBNRkNfTUVNX0FMTE9DX0ZBSUwgPSAtNjAwNCwKKyAgICBNRkNfTUVNX0lOVkFMSURfQUREUl9GQUlMID0gLTYwMDUsCisgICAgTUZDX01FTV9NQVBQSU5HX0ZBSUwgPSAtNjAwNiwKKyAgICBNRkNfR0VUX0NPTkZfRkFJTCA9IC02MDA3LAorICAgIE1GQ19TRVRfQ09ORl9GQUlMID0gLTYwMDgsCisgICAgTUZDX0lOVkFMSURfUEFSQU1fRkFJTCA9IC02MDA5LAorICAgIE1GQ19BUElfRkFJTCA9IC05MDAwLAorCisgICAgTUZDX0NNRF9GQUlMID0gLTEwMDMsCisgICAgTUZDX1NMRUVQX0ZBSUwgPSAtMTAxMCwKKyAgICBNRkNfV0FLRVVQX0ZBSUwgPSAtMTAyMCwKKworICAgIE1GQ19DTEtfT05fRkFJTCA9IC0xMDMwLAorICAgIE1GQ19DTEtfT0ZGX0ZBSUwgPSAtMTAzMCwKKyAgICBNRkNfUFdSX09OX0ZBSUwgPSAtMTA0MCwKKyAgICBNRkNfUFdSX09GRl9GQUlMID0gLTEwNDEsCit9OworCisjZW5kaWYgLyogX19NRkNfRVJSTk9fSCAqLwpkaWZmIC0tZ2l0IGEvZXh5bm9zNC9tdWx0aW1lZGlhL2NvZGVjcy9zZWNfY29kZWNzL3ZpZGVvL2V4eW5vczUvbWZjX3Y0bDIvaW5jbHVkZS9tZmNfaW50ZXJmYWNlLmggYi9leHlub3M0L211bHRpbWVkaWEvY29kZWNzL3NlY19jb2RlY3MvdmlkZW8vZXh5bm9zNS9tZmNfdjRsMi9pbmNsdWRlL21mY19pbnRlcmZhY2UuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45YmNlZTlkCi0tLSAvZGV2L251bGwKKysrIGIvZXh5bm9zNC9tdWx0aW1lZGlhL2NvZGVjcy9zZWNfY29kZWNzL3ZpZGVvL2V4eW5vczUvbWZjX3Y0bDIvaW5jbHVkZS9tZmNfaW50ZXJmYWNlLmgKQEAgLTAsMCArMSw1ODggQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTAgU2Ftc3VuZyBFbGVjdHJvbmljcyBDby4sIEx0ZC4KKyAqICAgICAgICAgICAgICBodHRwOi8vd3d3LnNhbXN1bmcuY29tLworICoKKyAqIEdsb2JhbCBoZWFkZXIgZm9yIFNhbXN1bmcgTUZDIChNdWx0aSBGdW5jdGlvbiBDb2RlYyAtIEZJTVYpIGRyaXZlcgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBhcworICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisgKgorICogQWx0ZXJuYXRpdmVseSwgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpZm5kZWYgX19NRkNfSU5URVJGQUNFX0gKKyNkZWZpbmUgX19NRkNfSU5URVJGQUNFX0gKKworI2luY2x1ZGUgIm1mY19lcnJuby5oIgorI2luY2x1ZGUgIlNzYlNpcE1mY0FwaS5oIgorCisjZGVmaW5lIElPQ1RMX01GQ19ERUNfSU5JVCAgICAgICAgICAoMHgwMDgwMDAwMSkKKyNkZWZpbmUgSU9DVExfTUZDX0VOQ19JTklUICAgICAgICAgICgweDAwODAwMDAyKQorI2RlZmluZSBJT0NUTF9NRkNfREVDX0VYRSAgICAgICAgICAgKDB4MDA4MDAwMDMpCisjZGVmaW5lIElPQ1RMX01GQ19FTkNfRVhFICAgICAgICAgICAoMHgwMDgwMDAwNCkKKworI2RlZmluZSBJT0NUTF9NRkNfR0VUX0lOX0JVRiAgICAgICAgKDB4MDA4MDAwMTApCisjZGVmaW5lIElPQ1RMX01GQ19GUkVFX0JVRiAgICAgICAgICAoMHgwMDgwMDAxMSkKKyNkZWZpbmUgSU9DVExfTUZDX0dFVF9SRUFMX0FERFIgICAgICgweDAwODAwMDEyKQorI2RlZmluZSBJT0NUTF9NRkNfR0VUX01NQVBfU0laRSAgICAgKDB4MDA4MDAwMTQpCisjZGVmaW5lIElPQ1RMX01GQ19TRVRfSU5fQlVGICAgICAgICAoMHgwMDgwMDAxOCkKKworI2RlZmluZSBJT0NUTF9NRkNfU0VUX0NPTkZJRyAgICAgICAgKDB4MDA4MDAxMDEpCisjZGVmaW5lIElPQ1RMX01GQ19HRVRfQ09ORklHICAgICAgICAoMHgwMDgwMDEwMikKKworI2RlZmluZSBJT0NUTF9NRkNfU0VUX0JVRl9DQUNIRSAgICAgKDB4MDA4MDAyMDEpCisKKy8qIE1GQyBIL1cgc3VwcG9ydCBtYXhpbXVtIDMyIGV4dHJhIERQQi4gKi8KKyNkZWZpbmUgTUZDX01BWF9FWFRSQV9EUEIgICAgICAgICAgICAgICAgICAgICAgNQorI2RlZmluZSBNRkNfTUFYX0RJU1BfREVMQVkgICAgICAgICAgICAgIDB4RgorCisjZGVmaW5lIE1GQ19MSUJfVkVSX01BSk9SICAgICAgICAgICAgICAgMQorI2RlZmluZSBNRkNfTElCX1ZFUl9NSU5PUiAgICAgICAgICAgICAgIDAwCisKKyNkZWZpbmUgQlVGX0xfVU5JVCAgICAgICAgICAoMTAyNCkKKyNkZWZpbmUgQWxpZ24oeCwgYWxpZ25ieXRlKSAgICAgKCgoeCkrKGFsaWduYnl0ZSktMSkvKGFsaWduYnl0ZSkqKGFsaWduYnl0ZSkpCisKKyNkZWZpbmUgTUZDX0VOQ19OVU1fU1JDX0JVRlMgICAgMiAvKiBOdW1iZXIgb2Ygc291cmNlIGJ1ZmZlcnMgdG8gcmVxdWVzdCAqLworI2RlZmluZSBNRkNfRU5DX01BWF9EU1RfQlVGUyAgICAyIC8qIFRoZSBtYXhpbXVtIG51bWJlciBvZiBidWZmZXJzICovCisjZGVmaW5lIE1GQ19FTkNfTlVNX1BMQU5FUyAgMiAvKiBOdW1iZXIgb2YgcGxhbmVzIHVzZWQgYnkgTUZDIElucHV0ICovCisKKyNkZWZpbmUgTUZDX0RFQ19OVU1fU1JDX0JVRlMgICAgMiAgLyogTnVtYmVyIG9mIHNvdXJjZSBidWZmZXJzIHRvIHJlcXVlc3QgKi8KKyNkZWZpbmUgTUZDX0RFQ19NQVhfRFNUX0JVRlMgICAgMzIgLyogVGhlIG1heGltdW0gbnVtYmVyIG9mIGJ1ZmZlcnMgKi8KKyNkZWZpbmUgTUZDX0RFQ19OVU1fUExBTkVTICAyICAvKiBOdW1iZXIgb2YgcGxhbmVzIHVzZWQgYnkgTUZDIG91dHB1dCAqLworCitlbnVtIGluc3RfdHlwZSB7CisgICAgREVDT0RFUiA9IDB4MSwKKyAgICBFTkNPREVSID0gMHgyLAorfTsKKworZW51bSBtZmNfY2hlY2tfc3RhdGUgeworICAgIE1GQ1NUQVRFX1BST0NFU1NJTkcgPSAwLAorICAgIE1GQ1NUQVRFX0RFQ19SRVNfREVURUNULAorICAgIE1GQ1NUQVRFX0RFQ19URVJNSU5BVElORywKKyAgICBNRkNTVEFURV9FTkNfTk9fT1VUUFVULAorfTsKKwordHlwZWRlZiBlbnVtIHsKKyAgICBNRkNfVU5QQUNLRURfUEIgPSAwLAorICAgIE1GQ19QQUNLRURfUEIgPSAxCit9IG1mY19wYWNrZWRfbW9kZTsKKwordHlwZWRlZiBlbnVtIHsKKyAgICBTU0JTSVBfTUZDX0xBU1RfRlJBTUVfTk9UX1JFQ0VJVkVEID0gMCwKKyAgICBTU0JTSVBfTUZDX0xBU1RfRlJBTUVfUkVDRUlWRUQgPSAxLAorICAgIFNTQlNJUF9NRkNfTEFTVF9GUkFNRV9QUk9DRVNTRUQgPSAyCit9IFNTQlNJUF9NRkNfTEFTVF9GUkFNRV9TVEFUVVM7CisKK3R5cGVkZWYgZW51bSB7CisgICAgTUZDX1VTRV9OT05FICAgICAgICAgPSAgMHgwMDAwLAorICAgIE1GQ19VU0VfWVVWX0JVRkYgICAgID0gIDB4MDAwMSwKKyAgICBNRkNfVVNFX1NUUk1fQlVGRiAgICA9ICAweDAwMTAsCisgICAgTUZDX1VTRV9TUkNfU1RSRUFNT04gPSAgMHgwMTAwLAorICAgIE1GQ19VU0VfRFNUX1NUUkVBTU9OID0gIDB4MTAwMCwKK30gczNjX21mY19pbnRlcmJ1ZmZfc3RhdHVzOworCit0eXBlZGVmIHN0cnVjdCB7CisgICAgaW50IGx1bWEwOyAgLyogcGVyIGZyYW1lIChvciB0b3AgZmllbGQpICovCisgICAgaW50IGNocm9tYTA7ICAgIC8qIHBlciBmcmFtZSAob3IgdG9wIGZpZWxkKSAqLworICAgIGludCBsdW1hMTsgIC8qIHBlciBmcmFtZSAob3IgYm90dG9tIGZpZWxkKSAqLworICAgIGludCBjaHJvbWExOyAgICAvKiBwZXIgZnJhbWUgKG9yIGJvdHRvbSBmaWVsZCkgKi8KK30gU1NCU0lQX01GQ19DUkNfREFUQTsKKworI2lmZGVmIFMzRF9TVVBQT1JUCitzdHJ1Y3QgbWZjX2ZyYW1lX3BhY2tfc2VpX2luZm8geworICAgIGludCBzZWlfYXZhaWw7CisgICAgdW5zaWduZWQgaW50IGFycmdtZW50X2lkOworICAgIGludCBzZWlfaW5mbzsKKyAgICBpbnQgZ3JpZF9wb3M7Cit9OworI2VuZGlmCisKK3N0cnVjdCBtZmNfc3RybV9yZWZfYnVmX2FyZyB7CisgICAgdW5zaWduZWQgaW50IHN0cm1fcmVmX3k7CisgICAgdW5zaWduZWQgaW50IG12X3JlZl95YzsKK307CisKK3N0cnVjdCBtZmNfZnJhbWVfYnVmX2FyZyB7CisgICAgdW5zaWduZWQgaW50IGx1bWE7CisgICAgdW5zaWduZWQgaW50IGNocm9tYTsKK307CisKK3N0cnVjdCBtZmNfZW5jX2luaXRfY29tbW9uX2FyZyB7CisgICAgU1NCU0lQX01GQ19DT0RFQ19UWVBFIGluX2NvZGVjX3R5cGU7IC8qIFtJTl0gY29kZWMgdHlwZSAqLworCisgICAgaW50IGluX3dpZHRoOyAgICAgICAgICAgICAgICAgICAgICAgIC8qIFtJTl0gd2lkdGggb2YgWVVWNDIwIGZyYW1lIHRvIGJlIGVuY29kZWQgKi8KKyAgICBpbnQgaW5faGVpZ2h0OyAgICAgICAgICAgICAgICAgICAgICAgLyogW0lOXSBoZWlnaHQgb2YgWVVWNDIwIGZyYW1lIHRvIGJlIGVuY29kZWQgKi8KKworICAgIGludCBpbl9nb3BfbnVtOyAgICAgICAgICAgICAgICAgICAgICAvKiBbSU5dIEdPUCBOdW1iZXIgKGludGVydmFsIG9mIEktZnJhbWUpICovCisgICAgaW50IGluX3ZvcF9xdWFudDsgICAvKiBbSU5dIFZPUCBxdWFudCAqLworICAgIGludCBpbl92b3BfcXVhbnRfcDsgLyogW0lOXSBWT1AgcXVhbnQgZm9yIFAgZnJhbWUgKi8KKworICAgIC8qIFtJTl0gUkMgZW5hYmxlICovCisgICAgLyogW0lOXSBSQyBlbmFibGUgKDA6ZGlzYWJsZSwgMTpmcmFtZSBsZXZlbCBSQykgKi8KKyAgICBpbnQgaW5fcmNfZnJfZW47CisgICAgaW50IGluX3JjX2JpdHJhdGU7ICAvKiBbSU5dICBSQyBwYXJhbWV0ZXIgKGJpdHJhdGUgaW4ga2JwcykgKi8KKworICAgIGludCBpbl9yY19xYm91bmRfbWluOyAgIC8qIFtJTl0gIFJDIHBhcmFtZXRlciAoUSBib3VuZCBNaW4pICovCisgICAgaW50IGluX3JjX3Fib3VuZF9tYXg7ICAgLyogW0lOXSAgUkMgcGFyYW1ldGVyIChRIGJvdW5kIE1heCkgKi8KKyAgICBpbnQgaW5fcmNfcnBhcmE7ICAgIC8qIFtJTl0gIFJDIHBhcmFtZXRlciAoUmVhY3Rpb24gQ29lZmZpY2llbnQpICovCisKKyAgICAvKiBbSU5dIE11bHRpLXNsaWNlIG1vZGUgKDA6c2luZ2xlLCAxOm11bHRpcGxlKSAqLworICAgIGludCBpbl9tc19tb2RlOworICAgIC8qIFtJTl0gTXVsdGktc2xpY2Ugc2l6ZSAoaW4gbnVtLiBvZiBtYiBvciBieXRlKSAqLworICAgIGludCBpbl9tc19hcmc7CisKKyAgICBpbnQgaW5fbWJfcmVmcmVzaDsgICAgICAgICAgICAgICAgICAgLyogW0lOXSBNYWNyb2Jsb2NrIHJlZnJlc2ggKi8KKworICAgIC8qIFtJTl0gRW5hYmxlICgxKSAvIERpc2FibGUgKDApIHBhZGRpbmcgd2l0aCB0aGUgc3BlY2lmaWVkIHZhbHVlcyAqLworICAgIGludCBpbl9wYWRfY3RybF9vbjsKKworICAgIC8qIFtJTl0gcGFkIHZhbHVlIGlmIHBhZF9jdHJsX29uIGlzIEVuYWJsZSAqLworICAgIGludCBpbl95X3BhZF92YWw7CisgICAgaW50IGluX2NiX3BhZF92YWw7CisgICAgaW50IGluX2NyX3BhZF92YWw7CisKKyAgICAvKiBsaW5lYXIgb3IgdGlsZWQgKi8KKyAgICBpbnQgaW5fZnJhbWVfbWFwOworCisgICAgdW5zaWduZWQgaW50IGluX3BpeGVsY2FjaGU7CisKKyAgICB1bnNpZ25lZCBpbnQgaW5fbWFwcGVkX2FkZHI7CisgICAgc3RydWN0IG1mY19zdHJtX3JlZl9idWZfYXJnIG91dF91X2FkZHI7CisgICAgc3RydWN0IG1mY19zdHJtX3JlZl9idWZfYXJnIG91dF9wX2FkZHI7CisgICAgc3RydWN0IG1mY19zdHJtX3JlZl9idWZfYXJnIG91dF9idWZfc2l6ZTsKKyAgICB1bnNpZ25lZCBpbnQgb3V0X2hlYWRlcl9zaXplOworfTsKKworc3RydWN0IG1mY19lbmNfaW5pdF9oMjYzX2FyZyB7CisgICAgaW50IGluX3JjX2ZyYW1lcmF0ZTsgICAgLyogW0lOXSAgUkMgcGFyYW1ldGVyIChmcmFtZXJhdGUpICovCit9OworCitzdHJ1Y3QgbWZjX2VuY19pbml0X21wZWc0X2FyZyB7CisgICAgaW50IGluX3Byb2ZpbGU7ICAgICAvKiBbSU5dIHByb2ZpbGUgKi8KKyAgICBpbnQgaW5fbGV2ZWw7ICAgICAgIC8qIFtJTl0gbGV2ZWwgKi8KKworICAgIGludCBpbl92b3BfcXVhbnRfYjsgLyogW0lOXSBWT1AgcXVhbnQgZm9yIEIgZnJhbWUgKi8KKworICAgIC8qIFtJTl0gQiBmcmFtZSBudW1iZXIgKi8KKyAgICBpbnQgaW5fYmZyYW1lbnVtOworCisgICAgLyogW0lOXSBRdWFydGVyLXBlbCBNQyBlbmFibGUgKDE6ZW5hYmxlZCwgMDpkaXNhYmxlZCkgKi8KKyAgICBpbnQgaW5fcXVhcnRfcGl4ZWw7CisKKyAgICBpbnQgaW5fVGltZUluY3JlYW1lbnRSZXM7ICAgLyogW0lOXSBWT1AgdGltZSByZXNvbHV0aW9uICovCisgICAgaW50IGluX1ZvcFRpbWVJbmNyZWFtZW50OyAgIC8qIFtJTl0gRnJhbWUgZGVsdGEgKi8KK307CisKK3N0cnVjdCBtZmNfZW5jX2luaXRfaDI2NF9hcmcgeworICAgIGludCBpbl9wcm9maWxlOyAgICAgLyogW0lOXSBwcm9maWxlICovCisgICAgaW50IGluX2xldmVsOyAgICAgICAvKiBbSU5dIGxldmVsICovCisKKyAgICBpbnQgaW5fdm9wX3F1YW50X2I7IC8qIFtJTl0gVk9QIHF1YW50IGZvciBCIGZyYW1lICovCisKKyAgICAvKiBbSU5dIEIgZnJhbWUgbnVtYmVyICovCisgICAgaW50IGluX2JmcmFtZW51bTsKKworICAgIC8qIFtJTl0gaW50ZXJsYWNlIG1vZGUoMDpwcm9ncmVzc2l2ZSwgMTppbnRlcmxhY2UpICovCisgICAgaW50IGluX2ludGVybGFjZV9tb2RlOworCisgICAgLyogW0lOXSAgcmVmZXJlbmNlIG51bWJlciAqLworICAgIGludCBpbl9yZWZlcmVuY2VfbnVtOworICAgIC8qIFtJTl0gIHJlZmVyZW5jZSBudW1iZXIgb2YgUCBmcmFtZSAqLworICAgIGludCBpbl9yZWZfbnVtX3A7CisKKyAgICBpbnQgaW5fcmNfZnJhbWVyYXRlOyAgICAvKiBbSU5dICBSQyBwYXJhbWV0ZXIgKGZyYW1lcmF0ZSkgKi8KKyAgICBpbnQgaW5fcmNfbWJfZW47ICAgIC8qIFtJTl0gUkMgZW5hYmxlICgwOmRpc2FibGUsIDE6TUIgbGV2ZWwgUkMpICovCisgICAgLyogW0lOXSBNQiBsZXZlbCByYXRlIGNvbnRyb2wgZGFyayByZWdpb24gYWRhcHRpdmUgZmVhdHVyZSAqLworICAgIGludCBpbl9yY19tYl9kYXJrX2RpczsgIC8qICgwOmVuYWJsZSwgMTpkaXNhYmxlKSAqLworICAgIC8qIFtJTl0gTUIgbGV2ZWwgcmF0ZSBjb250cm9sIHNtb290aCByZWdpb24gYWRhcHRpdmUgZmVhdHVyZSAqLworICAgIGludCBpbl9yY19tYl9zbW9vdGhfZGlzOyAgICAvKiAoMDplbmFibGUsIDE6ZGlzYWJsZSkgKi8KKyAgICAvKiBbSU5dIE1CIGxldmVsIHJhdGUgY29udHJvbCBzdGF0aWMgcmVnaW9uIGFkYXB0aXZlIGZlYXR1cmUgKi8KKyAgICBpbnQgaW5fcmNfbWJfc3RhdGljX2RpczsgICAgLyogKDA6ZW5hYmxlLCAxOmRpc2FibGUpICovCisgICAgLyogW0lOXSBNQiBsZXZlbCByYXRlIGNvbnRyb2wgYWN0aXZpdHkgcmVnaW9uIGFkYXB0aXZlIGZlYXR1cmUgKi8KKyAgICBpbnQgaW5fcmNfbWJfYWN0aXZpdHlfZGlzOyAgLyogKDA6ZW5hYmxlLCAxOmRpc2FibGUpICovCisKKyAgICAvKiBbSU5dICBkaXNhYmxlIGRlYmxvY2tpbmcgZmlsdGVyIGlkYyAqLworICAgIGludCBpbl9kZWJsb2NrX2RpczsgLyogKDA6IGVuYWJsZSwxOiBkaXNhYmxlLCAyOkRpc2FibGUgYXQgc2xpY2UgYm91bmRhcnkpICovCisgICAgLyogW0lOXSAgc2xpY2UgYWxwaGEgYzAgb2Zmc2V0IG9mIGRlYmxvY2tpbmcgZmlsdGVyICovCisgICAgaW50IGluX2RlYmxvY2tfYWxwaGFfYzA7CisgICAgLyogW0lOXSAgc2xpY2UgYmV0YSBvZmZzZXQgb2YgZGVibG9ja2luZyBmaWx0ZXIgKi8KKyAgICBpbnQgaW5fZGVibG9ja19iZXRhOworCisgICAgLyogW0lOXSAgKCAwIDogQ0FWTEMsIDEgOiBDQUJBQyApICovCisgICAgaW50IGluX3N5bWJvbG1vZGU7CisgICAgLyogW0lOXSAoMDogb25seSA0eDQgdHJhbnNmb3JtLCAxOiBhbGxvdyB1c2luZyA4eDggdHJhbnNmb3JtKSAqLworICAgIGludCBpbl90cmFuc2Zvcm04eDhfbW9kZTsKKworICAgIC8qIFtJTl0gSW50ZXIgd2VpZ2h0ZWQgcGFyYW1ldGVyIGZvciBtb2RlIGRlY2lzaW9uICovCisgICAgaW50IGluX21kX2ludGVyd2VpZ2h0X3BwczsKKyAgICAvKiBbSU5dIEludHJhIHdlaWdodGVkIHBhcmFtZXRlciBmb3IgbW9kZSBkZWNpc2lvbiAqLworICAgIGludCBpbl9tZF9pbnRyYXdlaWdodF9wcHM7Cit9OworCitzdHJ1Y3QgbWZjX2VuY19pbml0X2FyZyB7CisgICAgc3RydWN0IG1mY19lbmNfaW5pdF9jb21tb25fYXJnIGNtbjsKKyAgICB1bmlvbiB7CisgICAgICAgIHN0cnVjdCBtZmNfZW5jX2luaXRfaDI2NF9hcmcgaDI2NDsKKyAgICAgICAgc3RydWN0IG1mY19lbmNfaW5pdF9tcGVnNF9hcmcgbXBlZzQ7CisgICAgICAgIHN0cnVjdCBtZmNfZW5jX2luaXRfaDI2M19hcmcgaDI2MzsKKyAgICB9IGNvZGVjOworfTsKKworc3RydWN0IG1mY19lbmNfZXhlX2FyZyB7CisgICAgU1NCU0lQX01GQ19DT0RFQ19UWVBFIGluX2NvZGVjX3R5cGU7IC8qIFtJTl0gIGNvZGVjIHR5cGUgKi8KKyAgICB1bnNpZ25lZCBpbnQgaW5fWV9hZGRyOyAgICAgICAgICAgICAgLyogW0lOXSAgSW4tYnVmZmVyIGFkZHIgb2YgWSBjb21wb25lbnQgKi8KKyAgICB1bnNpZ25lZCBpbnQgaW5fQ2JDcl9hZGRyOyAgICAgICAgICAgLyogW0lOXSAgSW4tYnVmZmVyIGFkZHIgb2YgQ2JDciBjb21wb25lbnQgKi8KKyAgICB1bnNpZ25lZCBpbnQgaW5fWV9hZGRyX3ZpcjsgICAgICAgICAgLyogW0lOXSAgSW4tYnVmZmVyIGFkZHIgb2YgWSBjb21wb25lbnQgKi8KKyAgICB1bnNpZ25lZCBpbnQgaW5fQ2JDcl9hZGRyX3ZpcjsgICAgICAgLyogW0lOXSAgSW4tYnVmZmVyIGFkZHIgb2YgQ2JDciBjb21wb25lbnQgKi8KKyAgICB1bnNpZ25lZCBpbnQgaW5fc3RybV9zdDsgICAgICAgICAgICAgLyogW0lOXSAgT3V0LWJ1ZmZlciBzdGFydCBhZGRyIG9mIGVuY29kZWQgc3RybSAqLworICAgIHVuc2lnbmVkIGludCBpbl9zdHJtX2VuZDsgICAgICAgICAgICAvKiBbSU5dICBPdXQtYnVmZmVyIGVuZCBhZGRyIG9mIGVuY29kZWQgc3RybSAqLworICAgIHVuc2lnbmVkIGludCBpbl9mcmFtZXRhZzsgICAvKiBbSU5dICB1bmlxdWUgZnJhbWUgSUQgKi8KKworICAgIHVuc2lnbmVkIGludCBvdXRfZnJhbWVfdHlwZTsgICAgICAgICAvKiBbT1VUXSBmcmFtZSB0eXBlICovCisgICAgaW50IG91dF9lbmNvZGVkX3NpemU7ICAgICAgICAgICAgICAgIC8qIFtPVVRdIExlbmd0aCBvZiBFbmNvZGVkIHZpZGVvIHN0cmVhbSAqLworICAgIHVuc2lnbmVkIGludCBvdXRfWV9hZGRyOyAgICAvKltPVVRdT3V0LWJ1ZmZlciBhZGRyIG9mIGVuY29kZWQgWSBjb21wb25lbnQgKi8KKyAgICB1bnNpZ25lZCBpbnQgb3V0X0NiQ3JfYWRkcjsgLypbT1VUXU91dC1idWZmZXIgYWRkciBvZiBlbmNvZGVkIENiQ3IgY29tcG9uZW50ICovCisgICAgdW5zaWduZWQgaW50IG91dF9mcmFtZXRhZ190b3A7ICAvKiBbT1VUXSB1bmlxdWUgZnJhbWUgSUQgb2YgYW4gb3V0cHV0IGZyYW1lIG9yIHRvcCBmaWVsZCAqLworICAgIHVuc2lnbmVkIGludCBvdXRfZnJhbWV0YWdfYm90dG9tOy8qIFtPVVRdIHVuaXF1ZSBmcmFtZSBJRCBvZiBib3R0b20gZmllbGQgKi8KKworI2lmIGRlZmluZWQoQ09ORklHX1ZJREVPX01GQ19WQ01fVU1QKQorICAgIHVuc2lnbmVkIGludCBvdXRfeV9zZWN1cmVfaWQ7CisgICAgdW5zaWduZWQgaW50IG91dF9jX3NlY3VyZV9pZDsKKyNlbGlmIGRlZmluZWQoQ09ORklHX1M1UF9WTUVNKQorICAgIHVuc2lnbmVkIGludCBvdXRfeV9jb29raWU7CisgICAgdW5zaWduZWQgaW50IG91dF9jX2Nvb2tpZTsKKyNlbmRpZgorfTsKKworc3RydWN0IG1mY19kZWNfaW5pdF9hcmcgeworICAgIFNTQlNJUF9NRkNfQ09ERUNfVFlQRSBpbl9jb2RlY190eXBlOyAgICAvKiBbSU5dIGNvZGVjIHR5cGUgKi8KKyAgICBpbnQgaW5fc3RybV9idWY7ICAgICAgICAvKiBbSU5dIGFkZHJlc3Mgb2Ygc3RyZWFtIGJ1ZmZlciAqLworICAgIGludCBpbl9zdHJtX3NpemU7ICAgICAgIC8qIFtJTl0gZmlsbGVkIHNpemUgaW4gc3RyZWFtIGJ1ZmZlciAqLworICAgIGludCBpbl9wYWNrZWRfUEI7ICAgICAgICAgICAgICAgICAgICAvKiBbSU5dICBJcyBwYWNrZWQgUEIgZnJhbWUgb3Igbm90LCAxOiBwYWNrZWRQQiAgMDogdW5wYWNrZWQgKi8KKworICAgIHVuc2lnbmVkIGludCBpbl9jcmM7ICAgICAgICAvKiBbSU5dICovCisgICAgdW5zaWduZWQgaW50IGluX3BpeGVsY2FjaGU7IC8qIFtJTl0gKi8KKyAgICB1bnNpZ25lZCBpbnQgaW5fc2xpY2U7ICAgICAgLyogW0lOXSAqLworICAgIHVuc2lnbmVkIGludCBpbl9udW1leHRyYWRwYjsgICAgLyogW0lOXSAqLworCisgICAgdW5zaWduZWQgaW50IGluX21hcHBlZF9hZGRyOworCisgICAgaW50IG91dF9mcm1fd2lkdGg7ICAgICAgLyogW09VVF0gd2lkdGggIG9mIFlVVjQyMCBmcmFtZSAqLworICAgIGludCBvdXRfZnJtX2hlaWdodDsgICAgIC8qIFtPVVRdIGhlaWdodCBvZiBZVVY0MjAgZnJhbWUgKi8KKyAgICBpbnQgb3V0X2J1Zl93aWR0aDsgIC8qIFtPVVRdIHdpZHRoICBvZiBZVVY0MjAgZnJhbWUgKi8KKyAgICBpbnQgb3V0X2J1Zl9oZWlnaHQ7IC8qIFtPVVRdIGhlaWdodCBvZiBZVVY0MjAgZnJhbWUgKi8KKworICAgIGludCBvdXRfZHBiX2NudDsgICAgLyogW09VVF0gdGhlIG51bWJlciBvZiBidWZmZXJzIHdoaWNoIGlzIG5lc3NhcnkgZHVyaW5nIGRlY29kaW5nLiAqLworCisgICAgaW50IG91dF9jcm9wX3JpZ2h0X29mZnNldDsgLyogW09VVF0gY3JvcCBpbmZvcm1hdGlvbiBmb3IgaDI2NCAqLworICAgIGludCBvdXRfY3JvcF9sZWZ0X29mZnNldDsKKyAgICBpbnQgb3V0X2Nyb3BfYm90dG9tX29mZnNldDsKKyAgICBpbnQgb3V0X2Nyb3BfdG9wX29mZnNldDsKK307CisKK3N0cnVjdCBtZmNfZGVjX2V4ZV9hcmcgeworICAgIFNTQlNJUF9NRkNfQ09ERUNfVFlQRSBpbl9jb2RlY190eXBlOyAvKiBbSU5dICBjb2RlYyB0eXBlICovCisgICAgaW50IGluX3N0cm1fYnVmOyAgLyogW0lOXSAgdGhlIHBoeXNpY2FsIGFkZHJlc3Mgb2YgU1RSTV9CVUYgKi8KKyAgICAvKiBbSU5dICBTaXplIG9mIHZpZGVvIHN0cmVhbSBmaWxsZWQgaW4gU1RSTV9CVUYgKi8KKyAgICBpbnQgaW5fc3RybV9zaXplOworICAgIC8qIFtJTl0gdGhlIGFkZHJlc3Mgb2YgZHBiIEZSQU1FX0JVRiAqLworICAgIHN0cnVjdCBtZmNfZnJhbWVfYnVmX2FyZyBpbl9mcm1fYnVmOworICAgIC8qIFtJTl0gc2l6ZSBvZiBkcGIgRlJBTUVfQlVGICovCisgICAgc3RydWN0IG1mY19mcmFtZV9idWZfYXJnIGluX2ZybV9zaXplOworICAgIC8qIFtJTl0gVW5pcXVlIGZyYW1lIElEIGVnLiBhcHBsaWNhdGlvbiBzcGVjaWZpYyB0aW1lc3RhbXAgKi8KKyAgICB1bnNpZ25lZCBpbnQgaW5fZnJhbWV0YWc7CisgICAgLyogW0lOXSBpbW1kaWF0ZSBEaXNwbGF5IGZvciBzZWVrLHRodW1ibmFpbCBhbmQgb25lIGZyYW1lICovCisgICAgaW50IGluX2ltbWVkaWF0ZWx5X2Rpc3A7CisgICAgLyogW09VVF0gIHRoZSBwaHlzaWNhbCBhZGRyZXNzIG9mIGRpc3BsYXkgYnVmICovCisgICAgaW50IG91dF9kaXNwbGF5X1lfYWRkcjsKKyAgICAvKiBbT1VUXSAgdGhlIHBoeXNpY2FsIGFkZHJlc3Mgb2YgZGlzcGxheSBidWYgKi8KKyAgICBpbnQgb3V0X2Rpc3BsYXlfQ19hZGRyOworICAgIGludCBvdXRfZGlzcGxheV9zdGF0dXM7CisgICAgLyogW09VVF0gdW5pcXVlIGZyYW1lIElEIG9mIGFuIG91dHB1dCBmcmFtZSBvciB0b3AgZmllbGQgKi8KKyAgICB1bnNpZ25lZCBpbnQgb3V0X2ZyYW1ldGFnX3RvcDsKKyAgICAgLyogW09VVF0gdW5pcXVlIGZyYW1lIElEIG9mIGJvdHRvbSBmaWVsZCAqLworICAgIHVuc2lnbmVkIGludCBvdXRfZnJhbWV0YWdfYm90dG9tOworICAgIGludCBvdXRfcGljX3RpbWVfdG9wOworICAgIGludCBvdXRfcGljX3RpbWVfYm90dG9tOworICAgIGludCBvdXRfY29uc3VtZWRfYnl0ZTsKKworICAgIGludCBvdXRfY3JvcF9yaWdodF9vZmZzZXQ7CisgICAgaW50IG91dF9jcm9wX2xlZnRfb2Zmc2V0OworICAgIGludCBvdXRfY3JvcF9ib3R0b21fb2Zmc2V0OworICAgIGludCBvdXRfY3JvcF90b3Bfb2Zmc2V0OworCisgICAgLyogaW4gbmV3IGRyaXZlciwgZWFjaCBidWZmZXIgb2Zmc2V0IG11c3QgYmUgcmV0dXJuIHRvIHRoZSB1c2VyICovCisgICAgaW50IG91dF95X29mZnNldDsKKyAgICBpbnQgb3V0X2Nfb2Zmc2V0OworCisjaWYgZGVmaW5lZChDT05GSUdfVklERU9fTUZDX1ZDTV9VTVApCisgICAgdW5zaWduZWQgaW50IG91dF95X3NlY3VyZV9pZDsKKyAgICB1bnNpZ25lZCBpbnQgb3V0X2Nfc2VjdXJlX2lkOworI2VsaWYgZGVmaW5lZChDT05GSUdfUzVQX1ZNRU0pCisgICAgdW5zaWduZWQgaW50IG91dF95X2Nvb2tpZTsKKyAgICB1bnNpZ25lZCBpbnQgb3V0X2NfY29va2llOworI2VuZGlmCisgICAgaW50IG91dF9pbWdfd2lkdGg7ICAgICAgICAgICAgICAgICAgIC8qIFtPVVRdIHdpZHRoICBvZiBZVVY0MjAgZnJhbWUgKi8KKyAgICBpbnQgb3V0X2ltZ19oZWlnaHQ7ICAgICAgICAgICAgICAgICAgLyogW09VVF0gaGVpZ2h0IG9mIFlVVjQyMCBmcmFtZSAqLworICAgIGludCBvdXRfYnVmX3dpZHRoOyAgICAgICAgICAgICAgICAgICAvKiBbT1VUXSB3aWR0aCAgb2YgWVVWNDIwIGZyYW1lICovCisgICAgaW50IG91dF9idWZfaGVpZ2h0OyAgICAgICAgICAgICAgICAgIC8qIFtPVVRdIGhlaWdodCBvZiBZVVY0MjAgZnJhbWUgKi8KKworICAgIGludCBvdXRfZGlzcF9waWNfZnJhbWVfdHlwZTsgICAgICAgIC8qIFtPVVRdIGRpc3BsYXkgcGljdHVyZSBmcmFtZSB0eXBlIGluZm9ybWF0aW9uICovCit9OworCitzdHJ1Y3QgbWZjX2dldF9jb25maWdfYXJnIHsKKyAgICAvKiBbSU5dIENvbmZpZ3VyYWJsZSBwYXJhbWV0ZXIgdHlwZSAqLworICAgIGludCBpbl9jb25maWdfcGFyYW07CisKKyAgICAvKiBbSU5dIFZhbHVlcyB0byBnZXQgZm9yIHRoZSBjb25maWd1cmFibGUgcGFyYW1ldGVyLiAqLworICAgIC8qIE1heGltdW0gZm91ciBpbnRlZ2VyIHZhbHVlcyBjYW4gYmUgb2J0YWluZWQ7ICovCisgICAgaW50IG91dF9jb25maWdfdmFsdWVbNF07Cit9OworCitzdHJ1Y3QgbWZjX3NldF9jb25maWdfYXJnIHsKKyAgICAvKiBbSU5dIENvbmZpZ3VyYWJsZSBwYXJhbWV0ZXIgdHlwZSAqLworICAgIGludCBpbl9jb25maWdfcGFyYW07CisKKyAgICAvKiBbSU5dICBWYWx1ZXMgdG8gYmUgc2V0IGZvciB0aGUgY29uZmlndXJhYmxlIHBhcmFtZXRlci4gKi8KKyAgICAvKiBNYXhpbXVtIGZvdXIgaW50ZWdlciB2YWx1ZXMgY2FuIGJlIHNldC4gKi8KKyAgICBpbnQgaW5fY29uZmlnX3ZhbHVlWzRdOworfTsKKworc3RydWN0IG1mY19nZXRfcmVhbF9hZGRyX2FyZyB7CisgICAgdW5zaWduZWQgaW50IGtleTsKKyAgICB1bnNpZ25lZCBpbnQgYWRkcjsKK307CisKK3N0cnVjdCBtZmNfYnVmX2FsbG9jX2FyZyB7CisgICAgZW51bSBpbnN0X3R5cGUgdHlwZTsKKyAgICBpbnQgc2l6ZTsKKyAgICAvKgorICAgIHVuc2lnbmVkIGludCBtYXBwZWQ7CisgICAgKi8KKyAgICB1bnNpZ25lZCBpbnQgYWxpZ247CisKKyAgICB1bnNpZ25lZCBpbnQgYWRkcjsKKyAgICAvKgorICAgIHVuc2lnbmVkIGludCBwaHlzOworICAgICovCisjaWYgZGVmaW5lZChDT05GSUdfVklERU9fTUZDX1ZDTV9VTVApCisgICAgLyogRklNWEU6IGludmFsaWQgc2VjdXJlIGlkID09IC0xICovCisgICAgdW5zaWduZWQgaW50IHNlY3VyZV9pZDsKKyNlbGlmIGRlZmluZWQoQ09ORklHX1M1UF9WTUVNKQorICAgIHVuc2lnbmVkIGludCBjb29raWU7CisjZWxzZQorICAgIHVuc2lnbmVkIGludCBvZmZzZXQ7CisjZW5kaWYKK307CisKK3N0cnVjdCBtZmNfYnVmX2ZyZWVfYXJnIHsKKyAgICB1bnNpZ25lZCBpbnQgYWRkcjsKK307CisKKy8qIFJNVk1FICovCitzdHJ1Y3QgbWZjX21lbV9hbGxvY19hcmcgeworICAgIGVudW0gaW5zdF90eXBlIHR5cGU7CisgICAgaW50IGJ1ZmZfc2l6ZTsKKyAgICBTU0JJUF9NRkNfQlVGRkVSX1RZUEUgYnVmX2NhY2hlX3R5cGU7CisgICAgdW5zaWduZWQgaW50IG1hcHBlZF9hZGRyOworI2lmIGRlZmluZWQoQ09ORklHX1ZJREVPX01GQ19WQ01fVU1QKQorICAgIHVuc2lnbmVkIGludCBzZWN1cmVfaWQ7CisjZWxpZiBkZWZpbmVkKENPTkZJR19TNVBfVk1FTSkKKyAgICB1bnNpZ25lZCBpbnQgY29va2llOworI2Vsc2UKKyAgICB1bnNpZ25lZCBpbnQgb2Zmc2V0OworI2VuZGlmCit9OworCitzdHJ1Y3QgbWZjX21lbV9mcmVlX2FyZyB7CisgICAgdW5zaWduZWQgaW50IGtleTsKK307CisvKiBSTVZNRSAqLworCit1bmlvbiBtZmNfYXJncyB7CisgICAgLyoKKyAgICBzdHJ1Y3QgbWZjX2VuY19pbml0X2FyZyBlbmNfaW5pdDsKKworICAgIHN0cnVjdCBtZmNfZW5jX2luaXRfbXBlZzRfYXJnIGVuY19pbml0X21wZWc0OworICAgIHN0cnVjdCBtZmNfZW5jX2luaXRfbXBlZzRfYXJnIGVuY19pbml0X2gyNjM7CisgICAgc3RydWN0IG1mY19lbmNfaW5pdF9oMjY0X2FyZyBlbmNfaW5pdF9oMjY0OworICAgICovCisgICAgc3RydWN0IG1mY19lbmNfaW5pdF9hcmcgZW5jX2luaXQ7CisgICAgc3RydWN0IG1mY19lbmNfZXhlX2FyZyBlbmNfZXhlOworCisgICAgc3RydWN0IG1mY19kZWNfaW5pdF9hcmcgZGVjX2luaXQ7CisgICAgc3RydWN0IG1mY19kZWNfZXhlX2FyZyBkZWNfZXhlOworCisgICAgc3RydWN0IG1mY19nZXRfY29uZmlnX2FyZyBnZXRfY29uZmlnOworICAgIHN0cnVjdCBtZmNfc2V0X2NvbmZpZ19hcmcgc2V0X2NvbmZpZzsKKworICAgIHN0cnVjdCBtZmNfYnVmX2FsbG9jX2FyZyBidWZfYWxsb2M7CisgICAgc3RydWN0IG1mY19idWZfZnJlZV9hcmcgYnVmX2ZyZWU7CisgICAgc3RydWN0IG1mY19nZXRfcmVhbF9hZGRyX2FyZyByZWFsX2FkZHI7CisKKyAgICAvKiBSTVZNRSAqLworICAgIHN0cnVjdCBtZmNfbWVtX2FsbG9jX2FyZyBtZW1fYWxsb2M7CisgICAgc3RydWN0IG1mY19tZW1fZnJlZV9hcmcgbWVtX2ZyZWU7CisgICAgLyogUk1WTUUgKi8KK307CisKK3N0cnVjdCBtZmNfY29tbW9uX2FyZ3MgeworICAgIGVudW0gbWZjX3JldF9jb2RlIHJldF9jb2RlOyAvKiBbT1VUXSBlcnJvciBjb2RlICovCisgICAgdW5pb24gbWZjX2FyZ3MgYXJnczsKK307CisKK3N0cnVjdCBtZmNfZW5jX3Z1aV9pbmZvIHsKKyAgICBpbnQgYXNwZWN0X3JhdGlvX2lkYzsKK307CisKK3N0cnVjdCBtZmNfZGVjX2ZpbXYxX2luZm8geworICAgIGludCB3aWR0aDsKKyAgICBpbnQgaGVpZ2h0OworfTsKKworc3RydWN0IG1mY19lbmNfaGllcl9wX3FwIHsKKyAgICBpbnQgdDBfZnJhbWVfcXA7CisgICAgaW50IHQyX2ZyYW1lX3FwOworICAgIGludCB0M19mcmFtZV9xcDsKK307CisKKyNpZmRlZiBTM0RfU1VQUE9SVAorc3RydWN0IG1mY19lbmNfc2VpX2luZm8geworICAgIGludCBzZWlfZ2VuX2VuYWJsZTsKKyAgICBpbnQgY3Vycl9mcmFtZV9mcm0wX2ZsYWc7CisgICAgaW50IGZyYW1lX3BhY2tfYXJyZ21lbnRfdHlwZTsKK307CisjZW5kaWYKKworc3RydWN0IG1mY19lbmNfZm1vIHsKKyAgICB1bnNpZ25lZCBpbnQgc2xpY2VfbWFwX3R5cGU7CisgICAgdW5zaWduZWQgaW50IHNsaWNlX251bV9ncnA7CisgICAgdW5zaWduZWQgaW50IHJ1bl9sZW5ndGhbNF07CisgICAgdW5zaWduZWQgaW50IHNnX2RpcjsKKyAgICB1bnNpZ25lZCBpbnQgc2dfcmF0ZTsKK307CisKK2VudW0gQlVGX1NUQVRVUyB7CisgICAgQlVGX0VOUVVFVUVELAorICAgIEJVRl9ERVFVRVVFRAorfTsKKworc3RydWN0IG1mY19kZWNfdjRsMiB7CisgICAgY2hhciAqbWZjX3NyY19idWZzW01GQ19ERUNfTlVNX1NSQ19CVUZTXTsgICAgICAgICAgICAgICAgICAgLyogaW5mb3JtYXRpb24gb2Ygc291cmNlIGJ1ZmZlcnMgKi8KKyAgICBjaGFyICptZmNfZHN0X2J1ZnNbTUZDX0RFQ19NQVhfRFNUX0JVRlNdW01GQ19ERUNfTlVNX1BMQU5FU107ICAgLyogaW5mb3JtYXRpb24gb2YgZGVzdGluYXRpb24gYnVmZmVycyAqLworICAgIGNoYXIgKm1mY19kc3RfcGh5c1tNRkNfREVDX01BWF9EU1RfQlVGU11bTUZDX0RFQ19OVU1fUExBTkVTXTsgICAvKiBjbWEgaW5mb3JtYXRpb24gb2YgZGVzdGluYXRpb24gYnVmZmVycyAqLworCisgICAgdW5zaWduZWQgaW50IG1mY19zcmNfYnVmc19sZW47ICAgICAgICAgICAgICAgICAgICAgIC8qIG5lZWRlZCBmb3IgbXVubWFwICovCisgICAgdW5zaWduZWQgaW50IG1mY19kc3RfYnVmc19sZW5bTUZDX0RFQ19OVU1fUExBTkVTXTsgIC8qIG5lZWRlZCBmb3IgbXVubWFwICovCisKKyAgICB1bnNpZ25lZCBpbnQgbWZjX251bV9zcmNfYnVmczsgIC8qIHRoZSBudW1iZXIgb2Ygc291cmNlIGJ1ZmZlcnMgKi8KKyAgICB1bnNpZ25lZCBpbnQgbWZjX251bV9kc3RfYnVmczsgIC8qIHRoZSBudW1iZXIgb2YgZGVzdGluYXRpb24gYnVmZmVycyAqLworCisgICAgY2hhciBtZmNfc3JjX2J1Zl9mbGFnc1tNRkNfREVDX05VTV9TUkNfQlVGU107CisgICAgaW50IGJCZWluZ0ZpbmFsaXplZDsKKyAgICBpbnQgYWxsb2NJbmRleDsKKyAgICBpbnQgYmVpbmdVc2VkSW5kZXg7Cit9OworCitzdHJ1Y3QgbWZjX2VuY192NGwyIHsKKyAgICBjaGFyICptZmNfc3JjX2J1ZnNbTUZDX0VOQ19OVU1fU1JDX0JVRlNdW01GQ19FTkNfTlVNX1BMQU5FU107CisgICAgY2hhciAqbWZjX3NyY19waHlzW01GQ19FTkNfTlVNX1NSQ19CVUZTXVtNRkNfRU5DX05VTV9QTEFORVNdOworICAgIGNoYXIgKm1mY19kc3RfYnVmc1tNRkNfRU5DX01BWF9EU1RfQlVGU107CisKKyAgICB1bnNpZ25lZCBpbnQgbWZjX3NyY19idWZzX2xlbltNRkNfRU5DX05VTV9QTEFORVNdOworICAgIHVuc2lnbmVkIGludCBtZmNfZHN0X2J1ZnNfbGVuOworCisgICAgdW5zaWduZWQgaW50IG1mY19udW1fc3JjX2J1ZnM7CisgICAgdW5zaWduZWQgaW50IG1mY19udW1fZHN0X2J1ZnM7CisKKyAgICB1bnNpZ25lZCBpbnQgbWZjX2RzdF9idWZzX2J5dGVzX3VzZWRfbGVuOworICAgIGNoYXIgbWZjX3NyY19idWZfZmxhZ3NbTUZDX0VOQ19OVU1fU1JDX0JVRlNdOworICAgIGludCBiUnVubmluZzsKKyAgICBpbnQgYklucHV0UGh5VmlyOyAgICAgICAgICAgICAgIC8qIEZsYWcgdG8gdXNlIE1GQyBzcmMgYXMgcGh5c2ljYWwgb3IgdmlydHVhbCAwOiB2aXJ0dWFsICAxOiBwaHlzaWNhbCAqLworICAgIGludCBiZWluZ1VzZWRJbmRleDsKK307CisKK3R5cGVkZWYgc3RydWN0IHsKKyAgICBpbnQgbWFnaWM7CisgICAgaW50IGhNRkM7CisgICAgaW50IGhWTUVNOworICAgIGludCB3aWR0aDsKKyAgICBpbnQgaGVpZ2h0OworICAgIGludCBzaXplU3RybUJ1ZjsKKyAgICBzdHJ1Y3QgbWZjX2ZyYW1lX2J1Zl9hcmcgc2l6ZUZybUJ1ZjsKKyAgICBpbnQgZGlzcGxheVN0YXR1czsKKyAgICBpbnQgaW50ZXJfYnVmZl9zdGF0dXM7CisgICAgdW5zaWduZWQgaW50IHZpckZyZWVTdHJtQWRkcjsKKyAgICB1bnNpZ25lZCBpbnQgcGh5U3RybUJ1ZjsKKyAgICB1bnNpZ25lZCBpbnQgdmlyU3RybUJ1ZjsKKyAgICB1bnNpZ25lZCBpbnQgdmlyTXZSZWZZQzsKKyAgICBzdHJ1Y3QgbWZjX2ZyYW1lX2J1Zl9hcmcgcGh5RnJtQnVmOworICAgIHN0cnVjdCBtZmNfZnJhbWVfYnVmX2FyZyB2aXJGcm1CdWY7CisgICAgdW5zaWduZWQgaW50IG1hcHBlZF9hZGRyOworICAgIHVuc2lnbmVkIGludCBtYXBwZWRfc2l6ZTsKKyAgICBzdHJ1Y3QgbWZjX2NvbW1vbl9hcmdzIE1mY0FyZzsKKyAgICBTU0JTSVBfTUZDX0NPREVDX1RZUEUgY29kZWNUeXBlOworICAgIFNTQlNJUF9NRkNfREVDX09VVFBVVF9JTkZPIGRlY091dEluZm87CisgICAgdW5zaWduZWQgaW50IGluZnJhbWV0YWc7CisgICAgdW5zaWduZWQgaW50IG91dGZyYW1ldGFndG9wOworICAgIHVuc2lnbmVkIGludCBvdXRmcmFtZXRhZ2JvdHRvbTsKKyAgICB1bnNpZ25lZCBpbnQgaW1tZWRpYXRlbHlkaXNwOworICAgIHVuc2lnbmVkIGludCBlbmNvZGVkSGVhZGVyU2l6ZTsKKyAgICBpbnQgZW5jb2RlZERhdGFTaXplOworICAgIHVuc2lnbmVkIGludCBlbmNvZGVkZnJhbWVUeXBlOworICAgIHN0cnVjdCBtZmNfZnJhbWVfYnVmX2FyZyBlbmNvZGVkcGh5RnJtQnVmOworCisgICAgdW5zaWduZWQgaW50IGRlY19jcmM7CisgICAgdW5zaWduZWQgaW50IGRlY19waXhlbGNhY2hlOworICAgIHVuc2lnbmVkIGludCBkZWNfc2xpY2U7CisgICAgdW5zaWduZWQgaW50IGRlY19udW1leHRyYWRwYjsKKworICAgIGludCBpbnB1dF9jb29raWU7CisgICAgaW50IGlucHV0X3NlY3VyZV9pZDsKKyAgICBpbnQgaW5wdXRfc2l6ZTsKKworICAgIC8qIHRvIHN1cHBvcnQgbm9uLWJsb2NraW5nIG1vZGUgKi8KKyAgICB1bnNpZ25lZCBpbnQgZW5jb2RlX2NudDsKKworICAgIHN0cnVjdCBtZmNfZGVjX3Y0bDIgdjRsMl9kZWM7CisgICAgc3RydWN0IG1mY19lbmNfdjRsMiB2NGwyX2VuYzsKKworICAgIGludCBlbmNfZnJhbWVza2lwOworICAgIGludCBjYWNoZWFibGVidWZmZXI7CisgICAgc3RydWN0IG1mY19kZWNfZmltdjFfaW5mbyBmaW12MV9yZXM7CisgICAgU1NCU0lQX01GQ19MQVNUX0ZSQU1FX1NUQVRVUyBsYXN0ZnJhbWU7CisgICAgU1NCU0lQX01GQ19JTlNUUk1fTU9ERV9UWVBFIGZyYW1lbWFwOworCisgICAgaW50IGhpZXJfcF9lbmFibGU7CisgICAgc3RydWN0IG1mY19lbmNfaGllcl9wX3FwIGhpZXJfcXBfdmFsdWU7CisjaWZkZWYgUzNEX1NVUFBPUlQKKyAgICBzdHJ1Y3QgbWZjX2VuY19zZWlfaW5mbyBzZWlfaW5mbzsKKyNlbmRpZgorICAgIGludCBmbW9fZW5hYmxlOworICAgIHN0cnVjdCBtZmNfZW5jX2ZtbyBmbW9fdmFsdWU7CisgICAgaW50IGFzb19lbmFibGU7CisgICAgaW50IGFzb19zbF9vcmRlcls4XTsKKworCisgICAgLypJT04gcmVsYXRlZCovCisgICAgaW50IGlvbl9mZDsKKyAgICBpbnQgZHN0X2lvbl9mZFtNRkNfREVDX01BWF9EU1RfQlVGU11bTUZDX0RFQ19OVU1fUExBTkVTXTsKK30gX01GQ0xJQjsKKworI2RlZmluZSBFTkNfUFJPRklMRV9MRVZFTChwcm9maWxlLCBsZXZlbCkgICAgICAoKHByb2ZpbGUpIHwgKChsZXZlbCkgPDwgOCkpCisjZGVmaW5lIEVOQ19SQ19RQk9VTkQobWluX3FwLCBtYXhfcXApICAgICAgICAgICgobWluX3FwKSB8ICgobWF4X3FwKSA8PCA4KSkKKworI2RlZmluZSBTU0JTSVBfTUZDX0ZBSUwgICAgICAgICAgICAgICAgICAoMCkKKworI2VuZGlmIC8qIF9fTUZDX0lOVEVSRkFDRV9IICovCmRpZmYgLS1naXQgYS9leHlub3M0L211bHRpbWVkaWEvbGlicy9BbmRyb2lkLm1rIGIvZXh5bm9zNC9tdWx0aW1lZGlhL2xpYnMvQW5kcm9pZC5tawpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41NWNhMzMzCi0tLSAvZGV2L251bGwKKysrIGIvZXh5bm9zNC9tdWx0aW1lZGlhL2xpYnMvQW5kcm9pZC5tawpAQCAtMCwwICsxIEBACitpbmNsdWRlICQoYWxsLXN1YmRpci1tYWtlZmlsZXMpClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvZXh5bm9zNC9tdWx0aW1lZGlhL2xpYnMvbGliY3NjL0FuZHJvaWQubWsgYi9leHlub3M0L211bHRpbWVkaWEvbGlicy9saWJjc2MvQW5kcm9pZC5tawpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42ZjNmNzUzCi0tLSAvZGV2L251bGwKKysrIGIvZXh5bm9zNC9tdWx0aW1lZGlhL2xpYnMvbGliY3NjL0FuZHJvaWQubWsKQEAgLTAsMCArMSw2NCBAQAorTE9DQUxfUEFUSCA6PSAkKGNhbGwgbXktZGlyKQorCitpbmNsdWRlICQoQ0xFQVJfVkFSUykKKworTE9DQUxfQ09QWV9IRUFERVJTX1RPIDo9IGxpYnNlY21tCitMT0NBTF9DT1BZX0hFQURFUlMgOj0gXAorCWNzYy5oCisKK0xPQ0FMX01PRFVMRV9UQUdTIDo9IG9wdGlvbmFsCisKK0xPQ0FMX1NSQ19GSUxFUyA6PSBcCisJY3NjLmMKKworaWZlcSAoJChCT0FSRF9VU0VfRVhZTk9TX09NWCksIHRydWUpCitPTVhfTkFNRSA6PSBleHlub3MKK2Vsc2UKK09NWF9OQU1FIDo9IHNlYworZW5kaWYKKworTE9DQUxfQ19JTkNMVURFUyA6PSBcCisJJChUT1ApLyQoQk9BUkRfSE1NX1BBVEgpL29wZW5tYXgvJChPTVhfTkFNRSlfb214L2luY2x1ZGUva2hyb25vcyBcCisJJChUT1ApLyQoQk9BUkRfSE1NX1BBVEgpL29wZW5tYXgvJChPTVhfTkFNRSlfb214L2luY2x1ZGUvJChPTVhfTkFNRSkKKworTE9DQUxfQ0ZMQUdTIDo9CisKK0xPQ0FMX01PRFVMRSA6PSBsaWJjc2MKKworTE9DQUxfUFJFTElOS19NT0RVTEUgOj0gZmFsc2UKKworTE9DQUxfQVJNX01PREUgOj0gYXJtCisKK0xPQ0FMX1NUQVRJQ19MSUJSQVJJRVMgOj0gbGlic3djb252ZXJ0ZXIKK0xPQ0FMX1NIQVJFRF9MSUJSQVJJRVMgOj0gbGlibG9nCisKK2lmZXEgKCQoQk9BUkRfVVNFX1NBTVNVTkdfQ09MT1JGT1JNQVQpLCB0cnVlKQorTE9DQUxfQ0ZMQUdTICs9IC1EVVNFX1NBTVNVTkdfQ09MT1JGT1JNQVQKK2VuZGlmCisKK2lmZXEgKCQoVEFSR0VUX0JPQVJEX1BMQVRGT1JNKSwgZXh5bm9zNCkKK0xPQ0FMX1NSQ19GSUxFUyArPSBod2NvbnZlcnRlcl93cmFwcGVyLmNwcAorTE9DQUxfQ19JTkNMVURFUyArPSAkKFRPUCkvJChCT0FSRF9ITU1fUEFUSCkvdXRpbHMvY3NjL2V4eW5vczQgXAorCSQoVE9QKS8kKEJPQVJEX0hBTF9QQVRIKS9pbmNsdWRlIFwKKwkkKFRPUCkvJChCT0FSRF9IQUxfUEFUSCkvbGliaHdjb252ZXJ0ZXIKK0xPQ0FMX0NGTEFHUyArPSAtRFVTRV9GSU1DCitMT0NBTF9TSEFSRURfTElCUkFSSUVTICs9IGxpYmZpbWMgbGliaHdjb252ZXJ0ZXIKK2VuZGlmCisKK2lmZXEgKCQoVEFSR0VUX0JPQVJEX1BMQVRGT1JNKSwgZXh5bm9zNSkKK0xPQ0FMX0NfSU5DTFVERVMgKz0gJChUT1ApLyQoQk9BUkRfSE1NX1BBVEgpL3V0aWxzL2NzYy9leHlub3M1IFwKKwkkKFRPUCkvZGV2aWNlL3NhbXN1bmcvZXh5bm9zNS9pbmNsdWRlCitMT0NBTF9DRkxBR1MgKz0gLURVU0VfR1NDQUxFUgorTE9DQUxfU0hBUkVEX0xJQlJBUklFUyArPSBsaWJleHlub3Nnc2NhbGVyCitlbmRpZgorCitpZmVxICgkKEJPQVJEX1VTRV9WNEwyX0lPTiksdHJ1ZSkKK0xPQ0FMX0NGTEFHUyArPSAtRFVTRV9JT04KK0xPQ0FMX1NIQVJFRF9MSUJSQVJJRVMgKz0gbGliaW9uCitlbmRpZgorCitpZmVxICgkKEJPQVJEX1VTRV9FWFlOT1NfT01YKSwgdHJ1ZSkKK0xPQ0FMX0NGTEFHUyArPSAtREVYWU5PU19PTVgKK2VuZGlmCisKK2luY2x1ZGUgJChCVUlMRF9TSEFSRURfTElCUkFSWSkKZGlmZiAtLWdpdCBhL2V4eW5vczQvbXVsdGltZWRpYS9saWJzL2xpYmNzYy9jc2MuYyBiL2V4eW5vczQvbXVsdGltZWRpYS9saWJzL2xpYmNzYy9jc2MuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xOWJkMjAzCi0tLSAvZGV2L251bGwKKysrIGIvZXh5bm9zNC9tdWx0aW1lZGlhL2xpYnMvbGliY3NjL2NzYy5jCkBAIC0wLDAgKzEsNzQwIEBACisvKgorICoKKyAqIENvcHlyaWdodCAyMDEyIFNhbXN1bmcgRWxlY3Ryb25pY3MgUy5MU0kgQ28uIExURAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisvKgorICogQGZpbGUgICAgICAgIGNzYy5jCisgKgorICogQGJyaWVmICAgICAgIGNvbG9yIHNwYWNlIGNvbnZlcnRpb24gYWJzdHJhY3Qgc291cmNlCisgKgorICogQGF1dGhvciAgICAgIFB5b3VuZ2phZSBKdW5nKHBqZXQuanVuZ0BzYW1zdW5nLmNvbSkKKyAqCisgKiBAdmVyc2lvbiAgICAgMS4wLjAKKyAqCisgKiBAaGlzdG9yeQorICogICAyMDEyLjEuMTEgOiBDcmVhdGUKKyAqLworI2RlZmluZSBMT0dfVEFHICJsaWJjc2MiCisjaW5jbHVkZSA8Y3V0aWxzL2xvZy5oPgorCisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlIDxzdGRsaWIuaD4KKyNpbmNsdWRlIDx1dGlscy9Mb2cuaD4KKworI2luY2x1ZGUgImNzYy5oIgorI2luY2x1ZGUgInNlY19mb3JtYXQuaCIKKyNpbmNsdWRlICJzZWNfdXRpbHNfdjRsMi5oIgorI2luY2x1ZGUgInN3Y29udmVydGVyLmgiCisKKyNpZmRlZiBFWFlOT1NfT01YCisjaW5jbHVkZSAiRXh5bm9zX09NWF9EZWYuaCIKKyNlbHNlCisjaW5jbHVkZSAiU0VDX09NWF9EZWYuaCIKKyNlbmRpZgorCisjaWZkZWYgVVNFX0ZJTUMKKyNpbmNsdWRlICJod2NvbnZlcnRlcl93cmFwcGVyLmgiCisjZW5kaWYKKworI2lmZGVmIFVTRV9HU0NBTEVSCisjaW5jbHVkZSAiZXh5bm9zX2dzY2FsZXIuaCIKKyNlbmRpZgorCisjZGVmaW5lIEdTQ0FMRVJfSU1HX0FMSUdOIDE2CisjZGVmaW5lIENTQ19NQVhfUExBTkVTIDMKKyNkZWZpbmUgQUxJR04oeCwgYSkgICAgICAgKCgoeCkgKyAoYSkgLSAxKSAmIH4oKGEpIC0gMSkpCisKK3R5cGVkZWYgZW51bSBfQ1NDX1BMQU5FIHsKKyAgICBDU0NfWV9QTEFORSA9IDAsCisgICAgQ1NDX1JHQl9QTEFORSA9IDAsCisgICAgQ1NDX1VfUExBTkUgPSAxLAorICAgIENTQ19VVl9QTEFORSA9IDEsCisgICAgQ1NDX1ZfUExBTkUgPSAyCit9IENTQ19QTEFORTsKKwordHlwZWRlZiBlbnVtIF9DU0NfSFdfVFlQRSB7CisgICAgQ1NDX0hXX1RZUEVfRklNQyA9IDAsCisgICAgQ1NDX0hXX1RZUEVfR1NDQUxFUgorfSBDU0NfSFdfVFlQRTsKKwordHlwZWRlZiBzdHJ1Y3QgX0NTQ19GT1JNQVQgeworICAgIHVuc2lnbmVkIGludCB3aWR0aDsKKyAgICB1bnNpZ25lZCBpbnQgaGVpZ2h0OworICAgIHVuc2lnbmVkIGludCBjcm9wX2xlZnQ7CisgICAgdW5zaWduZWQgaW50IGNyb3BfdG9wOworICAgIHVuc2lnbmVkIGludCBjcm9wX3dpZHRoOworICAgIHVuc2lnbmVkIGludCBjcm9wX2hlaWdodDsKKyAgICB1bnNpZ25lZCBpbnQgY29sb3JfZm9ybWF0OworICAgIHVuc2lnbmVkIGludCBjYWNoZWFibGU7Cit9IENTQ19GT1JNQVQ7CisKK3R5cGVkZWYgc3RydWN0IF9DU0NfQlVGRkVSIHsKKyAgICB1bnNpZ25lZCBjaGFyICpwbGFuZXNbQ1NDX01BWF9QTEFORVNdOworICAgIGludCBpb25fZmQ7Cit9IENTQ19CVUZGRVI7CisKK3R5cGVkZWYgc3RydWN0IF9DU0NfSEFORExFIHsKKyAgICBDU0NfRk9STUFUICAgICAgZHN0X2Zvcm1hdDsKKyAgICBDU0NfRk9STUFUICAgICAgc3JjX2Zvcm1hdDsKKyAgICBDU0NfQlVGRkVSICAgICAgZHN0X2J1ZmZlcjsKKyAgICBDU0NfQlVGRkVSICAgICAgc3JjX2J1ZmZlcjsKKyAgICBDU0NfTUVUSE9EICAgICAgY3NjX21ldGhvZDsKKyAgICBDU0NfSFdfVFlQRSAgICAgY3NjX2h3X3R5cGU7CisgICAgdm9pZCAgICAgICAgICAgKmNzY19od19oYW5kbGU7Cit9IENTQ19IQU5ETEU7CisKK09NWF9DT0xPUl9GT1JNQVRUWVBFIGhhbF8yX29teF9waXhlbF9mb3JtYXQoCisgICAgdW5zaWduZWQgaW50IGhhbF9mb3JtYXQpCit7CisgICAgT01YX0NPTE9SX0ZPUk1BVFRZUEUgb214X2Zvcm1hdDsKKyAgICBzd2l0Y2ggKGhhbF9mb3JtYXQpIHsKKyAgICBjYXNlIEhBTF9QSVhFTF9GT1JNQVRfWUNiQ3JfNDIwX1A6CisgICAgICAgIG9teF9mb3JtYXQgPSBPTVhfQ09MT1JfRm9ybWF0WVVWNDIwUGxhbmFyOworICAgICAgICBicmVhazsKKyAgICBjYXNlIEhBTF9QSVhFTF9GT1JNQVRfWUNiQ3JfNDIwX1NQOgorICAgICAgICBvbXhfZm9ybWF0ID0gT01YX0NPTE9SX0Zvcm1hdFlVVjQyMFNlbWlQbGFuYXI7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgSEFMX1BJWEVMX0ZPUk1BVF9ZQ2JDcl80MjBfU1BfVElMRUQ6CisgICAgICAgIG9teF9mb3JtYXQgPSBPTVhfU0VDX0NPTE9SX0Zvcm1hdE5WMTJUaWxlZDsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBIQUxfUElYRUxfRk9STUFUX0FSR0I4ODg6CisgICAgICAgIG9teF9mb3JtYXQgPSBPTVhfQ09MT1JfRm9ybWF0MzJiaXRBUkdCODg4ODsKKyAgICAgICAgYnJlYWs7CisgICAgZGVmYXVsdDoKKyAgICAgICAgb214X2Zvcm1hdCA9IE9NWF9DT0xPUl9Gb3JtYXRZVVY0MjBQbGFuYXI7CisgICAgICAgIGJyZWFrOworICAgIH0KKyAgICByZXR1cm4gb214X2Zvcm1hdDsKK30KKwordW5zaWduZWQgaW50IG9teF8yX2hhbF9waXhlbF9mb3JtYXQoCisgICAgT01YX0NPTE9SX0ZPUk1BVFRZUEUgb214X2Zvcm1hdCkKK3sKKyAgICB1bnNpZ25lZCBpbnQgaGFsX2Zvcm1hdDsKKyAgICBzd2l0Y2ggKG9teF9mb3JtYXQpIHsKKyAgICBjYXNlIE9NWF9DT0xPUl9Gb3JtYXRZVVY0MjBQbGFuYXI6CisgICAgICAgIGhhbF9mb3JtYXQgPSBIQUxfUElYRUxfRk9STUFUX1lDYkNyXzQyMF9QOworICAgICAgICBicmVhazsKKyAgICBjYXNlIE9NWF9DT0xPUl9Gb3JtYXRZVVY0MjBTZW1pUGxhbmFyOgorICAgICAgICBoYWxfZm9ybWF0ID0gSEFMX1BJWEVMX0ZPUk1BVF9ZQ2JDcl80MjBfU1A7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgT01YX1NFQ19DT0xPUl9Gb3JtYXROVjEyVGlsZWQ6CisgICAgICAgIGhhbF9mb3JtYXQgPSBIQUxfUElYRUxfRk9STUFUX1lDYkNyXzQyMF9TUF9USUxFRDsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBPTVhfQ09MT1JfRm9ybWF0MzJiaXRBUkdCODg4ODoKKyAgICAgICAgaGFsX2Zvcm1hdCA9IEhBTF9QSVhFTF9GT1JNQVRfQVJHQjg4ODsKKyAgICAgICAgYnJlYWs7CisgICAgZGVmYXVsdDoKKyAgICAgICAgaGFsX2Zvcm1hdCA9IEhBTF9QSVhFTF9GT1JNQVRfWUNiQ3JfNDIwX1A7CisgICAgICAgIGJyZWFrOworICAgIH0KKyAgICByZXR1cm4gaGFsX2Zvcm1hdDsKK30KKworLyogc291cmNlIGlzIFJHQjg4OCAqLworc3RhdGljIENTQ19FUlJPUkNPREUgY29udl9zd19zcmNfYXJnYjg4OCgKKyAgICBDU0NfSEFORExFICpoYW5kbGUpCit7CisgICAgQ1NDX0VSUk9SQ09ERSByZXQgPSBDU0NfRXJyb3JOb25lOworCisgICAgc3dpdGNoIChoYW5kbGUtPmRzdF9mb3JtYXQuY29sb3JfZm9ybWF0KSB7CisgICAgY2FzZSBIQUxfUElYRUxfRk9STUFUX1lDYkNyXzQyMF9QOgorICAgICAgICBjc2NfQVJHQjg4ODhfdG9fWVVWNDIwUCgKKyAgICAgICAgICAgICh1bnNpZ25lZCBjaGFyICopaGFuZGxlLT5kc3RfYnVmZmVyLnBsYW5lc1tDU0NfWV9QTEFORV0sCisgICAgICAgICAgICAodW5zaWduZWQgY2hhciAqKWhhbmRsZS0+ZHN0X2J1ZmZlci5wbGFuZXNbQ1NDX1VfUExBTkVdLAorICAgICAgICAgICAgKHVuc2lnbmVkIGNoYXIgKiloYW5kbGUtPmRzdF9idWZmZXIucGxhbmVzW0NTQ19WX1BMQU5FXSwKKyAgICAgICAgICAgICh1bnNpZ25lZCBjaGFyICopaGFuZGxlLT5zcmNfYnVmZmVyLnBsYW5lc1tDU0NfUkdCX1BMQU5FXSwKKyAgICAgICAgICAgIGhhbmRsZS0+c3JjX2Zvcm1hdC53aWR0aCwKKyAgICAgICAgICAgIGhhbmRsZS0+c3JjX2Zvcm1hdC5oZWlnaHQpOworICAgICAgICByZXQgPSBDU0NfRXJyb3JOb25lOworICAgICAgICBicmVhazsKKyAgICBjYXNlIEhBTF9QSVhFTF9GT1JNQVRfWUNiQ3JfNDIwX1NQOgorICAgICAgICBjc2NfQVJHQjg4ODhfdG9fWVVWNDIwU1AoCisgICAgICAgICAgICAodW5zaWduZWQgY2hhciAqKWhhbmRsZS0+ZHN0X2J1ZmZlci5wbGFuZXNbQ1NDX1lfUExBTkVdLAorICAgICAgICAgICAgKHVuc2lnbmVkIGNoYXIgKiloYW5kbGUtPmRzdF9idWZmZXIucGxhbmVzW0NTQ19VVl9QTEFORV0sCisgICAgICAgICAgICAodW5zaWduZWQgY2hhciAqKWhhbmRsZS0+c3JjX2J1ZmZlci5wbGFuZXNbQ1NDX1JHQl9QTEFORV0sCisgICAgICAgICAgICBoYW5kbGUtPnNyY19mb3JtYXQud2lkdGgsCisgICAgICAgICAgICBoYW5kbGUtPnNyY19mb3JtYXQuaGVpZ2h0KTsKKyAgICAgICAgcmV0ID0gQ1NDX0Vycm9yTm9uZTsKKyAgICAgICAgYnJlYWs7CisgICAgZGVmYXVsdDoKKyAgICAgICAgcmV0ID0gQ1NDX0Vycm9yVW5zdXBwb3J0Rm9ybWF0OworICAgICAgICBicmVhazsKKyAgICB9CisKKyAgICByZXR1cm4gcmV0OworfQorCisvKiBzb3VyY2UgaXMgTlYxMlQgKi8KK3N0YXRpYyBDU0NfRVJST1JDT0RFIGNvbnZfc3dfc3JjX252MTJ0KAorICAgIENTQ19IQU5ETEUgKmhhbmRsZSkKK3sKKyAgICBDU0NfRVJST1JDT0RFIHJldCA9IENTQ19FcnJvck5vbmU7CisKKyAgICBzd2l0Y2ggKGhhbmRsZS0+ZHN0X2Zvcm1hdC5jb2xvcl9mb3JtYXQpIHsKKyAgICBjYXNlIEhBTF9QSVhFTF9GT1JNQVRfWUNiQ3JfNDIwX1A6CisgICAgICAgIGNzY190aWxlZF90b19saW5lYXJfeV9uZW9uKAorICAgICAgICAgICAgKHVuc2lnbmVkIGNoYXIgKiloYW5kbGUtPmRzdF9idWZmZXIucGxhbmVzW0NTQ19ZX1BMQU5FXSwKKyAgICAgICAgICAgICh1bnNpZ25lZCBjaGFyICopaGFuZGxlLT5zcmNfYnVmZmVyLnBsYW5lc1tDU0NfWV9QTEFORV0sCisgICAgICAgICAgICBoYW5kbGUtPnNyY19mb3JtYXQud2lkdGgsCisgICAgICAgICAgICBoYW5kbGUtPnNyY19mb3JtYXQuaGVpZ2h0KTsKKyAgICAgICAgY3NjX3RpbGVkX3RvX2xpbmVhcl91dl9kZWludGVybGVhdmVfbmVvbigKKyAgICAgICAgICAgICh1bnNpZ25lZCBjaGFyICopaGFuZGxlLT5kc3RfYnVmZmVyLnBsYW5lc1tDU0NfVV9QTEFORV0sCisgICAgICAgICAgICAodW5zaWduZWQgY2hhciAqKWhhbmRsZS0+ZHN0X2J1ZmZlci5wbGFuZXNbQ1NDX1ZfUExBTkVdLAorICAgICAgICAgICAgKHVuc2lnbmVkIGNoYXIgKiloYW5kbGUtPnNyY19idWZmZXIucGxhbmVzW0NTQ19VVl9QTEFORV0sCisgICAgICAgICAgICBoYW5kbGUtPnNyY19mb3JtYXQud2lkdGgsCisgICAgICAgICAgICBoYW5kbGUtPnNyY19mb3JtYXQuaGVpZ2h0IC8gMik7CisgICAgICAgIHJldCA9IENTQ19FcnJvck5vbmU7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgSEFMX1BJWEVMX0ZPUk1BVF9ZQ2JDcl80MjBfU1A6CisgICAgICAgIGNzY190aWxlZF90b19saW5lYXJfeV9uZW9uKAorICAgICAgICAgICAgKHVuc2lnbmVkIGNoYXIgKiloYW5kbGUtPmRzdF9idWZmZXIucGxhbmVzW0NTQ19ZX1BMQU5FXSwKKyAgICAgICAgICAgICh1bnNpZ25lZCBjaGFyICopaGFuZGxlLT5zcmNfYnVmZmVyLnBsYW5lc1tDU0NfWV9QTEFORV0sCisgICAgICAgICAgICBoYW5kbGUtPnNyY19mb3JtYXQud2lkdGgsCisgICAgICAgICAgICBoYW5kbGUtPnNyY19mb3JtYXQuaGVpZ2h0KTsKKyAgICAgICAgY3NjX3RpbGVkX3RvX2xpbmVhcl91dl9uZW9uKAorICAgICAgICAgICAgKHVuc2lnbmVkIGNoYXIgKiloYW5kbGUtPmRzdF9idWZmZXIucGxhbmVzW0NTQ19VVl9QTEFORV0sCisgICAgICAgICAgICAodW5zaWduZWQgY2hhciAqKWhhbmRsZS0+c3JjX2J1ZmZlci5wbGFuZXNbQ1NDX1VWX1BMQU5FXSwKKyAgICAgICAgICAgIGhhbmRsZS0+c3JjX2Zvcm1hdC53aWR0aCwKKyAgICAgICAgICAgIGhhbmRsZS0+c3JjX2Zvcm1hdC5oZWlnaHQgLyAyKTsKKyAgICAgICAgcmV0ID0gQ1NDX0Vycm9yTm9uZTsKKyAgICAgICAgYnJlYWs7CisgICAgZGVmYXVsdDoKKyAgICAgICAgcmV0ID0gQ1NDX0Vycm9yVW5zdXBwb3J0Rm9ybWF0OworICAgICAgICBicmVhazsKKyAgICB9CisKKyAgICByZXR1cm4gcmV0OworfQorCisvKiBzb3VyY2UgaXMgWVVWNDIwUCAqLworc3RhdGljIENTQ19FUlJPUkNPREUgY29udl9zd19zcmNfeXV2NDIwcCgKKyAgICBDU0NfSEFORExFICpoYW5kbGUpCit7CisgICAgQ1NDX0VSUk9SQ09ERSByZXQgPSBDU0NfRXJyb3JOb25lOworCisgICAgc3dpdGNoIChoYW5kbGUtPmRzdF9mb3JtYXQuY29sb3JfZm9ybWF0KSB7CisgICAgY2FzZSBIQUxfUElYRUxfRk9STUFUX1lDYkNyXzQyMF9QOiAgLyogYnlwYXNzICovCisgICAgICAgIG1lbWNweSgodW5zaWduZWQgY2hhciAqKWhhbmRsZS0+ZHN0X2J1ZmZlci5wbGFuZXNbQ1NDX1lfUExBTkVdLAorICAgICAgICAgICAgICAgKHVuc2lnbmVkIGNoYXIgKiloYW5kbGUtPnNyY19idWZmZXIucGxhbmVzW0NTQ19ZX1BMQU5FXSwKKyAgICAgICAgICAgICAgIGhhbmRsZS0+c3JjX2Zvcm1hdC53aWR0aCAqIGhhbmRsZS0+c3JjX2Zvcm1hdC5oZWlnaHQpOworICAgICAgICBtZW1jcHkoKHVuc2lnbmVkIGNoYXIgKiloYW5kbGUtPmRzdF9idWZmZXIucGxhbmVzW0NTQ19VX1BMQU5FXSwKKyAgICAgICAgICAgICAgICh1bnNpZ25lZCBjaGFyICopaGFuZGxlLT5zcmNfYnVmZmVyLnBsYW5lc1tDU0NfVV9QTEFORV0sCisgICAgICAgICAgICAgICAoaGFuZGxlLT5zcmNfZm9ybWF0LndpZHRoICogaGFuZGxlLT5zcmNfZm9ybWF0LmhlaWdodCkgPj4gMik7CisgICAgICAgIG1lbWNweSgodW5zaWduZWQgY2hhciAqKWhhbmRsZS0+ZHN0X2J1ZmZlci5wbGFuZXNbQ1NDX1ZfUExBTkVdLAorICAgICAgICAgICAgICAgKHVuc2lnbmVkIGNoYXIgKiloYW5kbGUtPnNyY19idWZmZXIucGxhbmVzW0NTQ19WX1BMQU5FXSwKKyAgICAgICAgICAgICAgIChoYW5kbGUtPnNyY19mb3JtYXQud2lkdGggKiBoYW5kbGUtPnNyY19mb3JtYXQuaGVpZ2h0KSA+PiAyKTsKKyAgICAgICAgcmV0ID0gQ1NDX0Vycm9yTm9uZTsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBIQUxfUElYRUxfRk9STUFUX1lDYkNyXzQyMF9TUDoKKyAgICAgICAgbWVtY3B5KCh1bnNpZ25lZCBjaGFyICopaGFuZGxlLT5kc3RfYnVmZmVyLnBsYW5lc1tDU0NfWV9QTEFORV0sCisgICAgICAgICAgICAgICAodW5zaWduZWQgY2hhciAqKWhhbmRsZS0+c3JjX2J1ZmZlci5wbGFuZXNbQ1NDX1lfUExBTkVdLAorICAgICAgICAgICAgICAgaGFuZGxlLT5zcmNfZm9ybWF0LndpZHRoICogaGFuZGxlLT5zcmNfZm9ybWF0LmhlaWdodCk7CisgICAgICAgIGNzY19pbnRlcmxlYXZlX21lbWNweV9uZW9uKAorICAgICAgICAgICAgKHVuc2lnbmVkIGNoYXIgKiloYW5kbGUtPmRzdF9idWZmZXIucGxhbmVzW0NTQ19VVl9QTEFORV0sCisgICAgICAgICAgICAodW5zaWduZWQgY2hhciAqKWhhbmRsZS0+c3JjX2J1ZmZlci5wbGFuZXNbQ1NDX1VfUExBTkVdLAorICAgICAgICAgICAgKHVuc2lnbmVkIGNoYXIgKiloYW5kbGUtPnNyY19idWZmZXIucGxhbmVzW0NTQ19WX1BMQU5FXSwKKyAgICAgICAgICAgIChoYW5kbGUtPnNyY19mb3JtYXQud2lkdGggKiBoYW5kbGUtPnNyY19mb3JtYXQuaGVpZ2h0KSA+PiAyKTsKKyAgICAgICAgcmV0ID0gQ1NDX0Vycm9yTm9uZTsKKyAgICAgICAgYnJlYWs7CisgICAgZGVmYXVsdDoKKyAgICAgICAgcmV0ID0gQ1NDX0Vycm9yVW5zdXBwb3J0Rm9ybWF0OworICAgICAgICBicmVhazsKKyAgICB9CisKKyAgICByZXR1cm4gcmV0OworfQorCisvKiBzb3VyY2UgaXMgWVVWNDIwU1AgKi8KK3N0YXRpYyBDU0NfRVJST1JDT0RFIGNvbnZfc3dfc3JjX3l1djQyMHNwKAorICAgIENTQ19IQU5ETEUgKmhhbmRsZSkKK3sKKyAgICBDU0NfRVJST1JDT0RFIHJldCA9IENTQ19FcnJvck5vbmU7CisKKyAgICBzd2l0Y2ggKGhhbmRsZS0+ZHN0X2Zvcm1hdC5jb2xvcl9mb3JtYXQpIHsKKyAgICBjYXNlIEhBTF9QSVhFTF9GT1JNQVRfWUNiQ3JfNDIwX1A6CisgICAgICAgIG1lbWNweSgodW5zaWduZWQgY2hhciAqKWhhbmRsZS0+ZHN0X2J1ZmZlci5wbGFuZXNbQ1NDX1lfUExBTkVdLAorICAgICAgICAgICAgICAgKHVuc2lnbmVkIGNoYXIgKiloYW5kbGUtPnNyY19idWZmZXIucGxhbmVzW0NTQ19ZX1BMQU5FXSwKKyAgICAgICAgICAgICAgIGhhbmRsZS0+c3JjX2Zvcm1hdC53aWR0aCAqIGhhbmRsZS0+c3JjX2Zvcm1hdC5oZWlnaHQpOworICAgICAgICBjc2NfZGVpbnRlcmxlYXZlX21lbWNweSgKKyAgICAgICAgICAgICh1bnNpZ25lZCBjaGFyICopaGFuZGxlLT5kc3RfYnVmZmVyLnBsYW5lc1tDU0NfVV9QTEFORV0sCisgICAgICAgICAgICAodW5zaWduZWQgY2hhciAqKWhhbmRsZS0+ZHN0X2J1ZmZlci5wbGFuZXNbQ1NDX1ZfUExBTkVdLAorICAgICAgICAgICAgKHVuc2lnbmVkIGNoYXIgKiloYW5kbGUtPnNyY19idWZmZXIucGxhbmVzW0NTQ19VVl9QTEFORV0sCisgICAgICAgICAgICBoYW5kbGUtPnNyY19mb3JtYXQud2lkdGggKiBoYW5kbGUtPnNyY19mb3JtYXQuaGVpZ2h0ID4+IDEpOworICAgICAgICByZXQgPSBDU0NfRXJyb3JOb25lOworICAgICAgICBicmVhazsKKyAgICBjYXNlIEhBTF9QSVhFTF9GT1JNQVRfWUNiQ3JfNDIwX1NQOiAvKiBieXBhc3MgKi8KKyAgICAgICAgbWVtY3B5KCh1bnNpZ25lZCBjaGFyICopaGFuZGxlLT5kc3RfYnVmZmVyLnBsYW5lc1tDU0NfWV9QTEFORV0sCisgICAgICAgICAgICAgICAodW5zaWduZWQgY2hhciAqKWhhbmRsZS0+c3JjX2J1ZmZlci5wbGFuZXNbQ1NDX1lfUExBTkVdLAorICAgICAgICAgICAgICAgaGFuZGxlLT5zcmNfZm9ybWF0LndpZHRoICogaGFuZGxlLT5zcmNfZm9ybWF0LmhlaWdodCk7CisgICAgICAgIG1lbWNweSgodW5zaWduZWQgY2hhciAqKWhhbmRsZS0+ZHN0X2J1ZmZlci5wbGFuZXNbQ1NDX1VWX1BMQU5FXSwKKyAgICAgICAgICAgICAgICh1bnNpZ25lZCBjaGFyICopaGFuZGxlLT5zcmNfYnVmZmVyLnBsYW5lc1tDU0NfVVZfUExBTkVdLAorICAgICAgICAgICAgICAgaGFuZGxlLT5zcmNfZm9ybWF0LndpZHRoICogaGFuZGxlLT5zcmNfZm9ybWF0LmhlaWdodCA+PiAxKTsKKyAgICAgICAgcmV0ID0gQ1NDX0Vycm9yTm9uZTsKKyAgICAgICAgYnJlYWs7CisgICAgZGVmYXVsdDoKKyAgICAgICAgcmV0ID0gQ1NDX0Vycm9yVW5zdXBwb3J0Rm9ybWF0OworICAgICAgICBicmVhazsKKyAgICB9CisKKyAgICByZXR1cm4gcmV0OworfQorCitzdGF0aWMgQ1NDX0VSUk9SQ09ERSBjb252X3N3KAorICAgIENTQ19IQU5ETEUgKmhhbmRsZSkKK3sKKyAgICBDU0NfRVJST1JDT0RFIHJldCA9IENTQ19FcnJvck5vbmU7CisKKyAgICBzd2l0Y2ggKGhhbmRsZS0+c3JjX2Zvcm1hdC5jb2xvcl9mb3JtYXQpIHsKKyAgICBjYXNlIEhBTF9QSVhFTF9GT1JNQVRfWUNiQ3JfNDIwX1NQX1RJTEVEOgorICAgICAgICByZXQgPSBjb252X3N3X3NyY19udjEydChoYW5kbGUpOworICAgICAgICBicmVhazsKKyAgICBjYXNlIEhBTF9QSVhFTF9GT1JNQVRfWUNiQ3JfNDIwX1A6CisgICAgICAgIHJldCA9IGNvbnZfc3dfc3JjX3l1djQyMHAoaGFuZGxlKTsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBIQUxfUElYRUxfRk9STUFUX1lDYkNyXzQyMF9TUDoKKyAgICAgICAgcmV0ID0gY29udl9zd19zcmNfeXV2NDIwc3AoaGFuZGxlKTsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBIQUxfUElYRUxfRk9STUFUX0FSR0I4ODg6CisgICAgICAgIHJldCA9IGNvbnZfc3dfc3JjX2FyZ2I4ODgoaGFuZGxlKTsKKyAgICAgICAgYnJlYWs7CisgICAgZGVmYXVsdDoKKyAgICAgICAgcmV0ID0gQ1NDX0Vycm9yVW5zdXBwb3J0Rm9ybWF0OworICAgICAgICBicmVhazsKKyAgICB9CisKKyAgICByZXR1cm4gcmV0OworfQorCitzdGF0aWMgQ1NDX0VSUk9SQ09ERSBjb252X2h3KAorICAgIENTQ19IQU5ETEUgKmhhbmRsZSkKK3sKKyAgICBDU0NfRVJST1JDT0RFIHJldCA9IENTQ19FcnJvck5vbmU7CisKKyAgICBzd2l0Y2ggKGhhbmRsZS0+Y3NjX2h3X3R5cGUpIHsKKyNpZmRlZiBVU0VfRklNQworICAgIGNhc2UgQ1NDX0hXX1RZUEVfRklNQzoKKyAgICB7CisgICAgICAgIHZvaWQgKnNyY19hZGRyWzNdOworICAgICAgICB2b2lkICpkc3RfYWRkclszXTsKKyAgICAgICAgT01YX0NPTE9SX0ZPUk1BVFRZUEUgb214X2Zvcm1hdDsKKyAgICAgICAgc3JjX2FkZHJbMF0gPSBoYW5kbGUtPnNyY19idWZmZXIucGxhbmVzW0NTQ19ZX1BMQU5FXTsKKyAgICAgICAgc3JjX2FkZHJbMV0gPSBoYW5kbGUtPnNyY19idWZmZXIucGxhbmVzW0NTQ19VVl9QTEFORV07CisgICAgICAgIGRzdF9hZGRyWzBdID0gaGFuZGxlLT5kc3RfYnVmZmVyLnBsYW5lc1tDU0NfWV9QTEFORV07CisgICAgICAgIGRzdF9hZGRyWzFdID0gaGFuZGxlLT5kc3RfYnVmZmVyLnBsYW5lc1tDU0NfVV9QTEFORV07CisgICAgICAgIGRzdF9hZGRyWzJdID0gaGFuZGxlLT5kc3RfYnVmZmVyLnBsYW5lc1tDU0NfVl9QTEFORV07CisgICAgICAgIG9teF9mb3JtYXQgPSBoYWxfMl9vbXhfcGl4ZWxfZm9ybWF0KGhhbmRsZS0+ZHN0X2Zvcm1hdC5jb2xvcl9mb3JtYXQpOworICAgICAgICBjc2NfaHdjb252ZXJ0ZXJfY29udmVydF9udjEydCgKKyAgICAgICAgICAgIGhhbmRsZS0+Y3NjX2h3X2hhbmRsZSwKKyAgICAgICAgICAgIGRzdF9hZGRyLAorICAgICAgICAgICAgc3JjX2FkZHIsCisgICAgICAgICAgICBoYW5kbGUtPmRzdF9mb3JtYXQud2lkdGgsCisgICAgICAgICAgICBoYW5kbGUtPmRzdF9mb3JtYXQuaGVpZ2h0LAorICAgICAgICAgICAgb214X2Zvcm1hdCk7CisgICAgICAgIGJyZWFrOworICAgIH0KKyNlbmRpZgorI2lmZGVmIFVTRV9HU0NBTEVSCisgICAgY2FzZSBDU0NfSFdfVFlQRV9HU0NBTEVSOgorICAgICAgICBleHlub3NfZ3NjX2NvbnZlcnQoaGFuZGxlLT5jc2NfaHdfaGFuZGxlKTsKKyAgICAgICAgYnJlYWs7CisjZW5kaWYKKyAgICBkZWZhdWx0OgorICAgICAgICBMT0dFKCIlczo6IHVuc3VwcG9ydGVkIGNzY19od190eXBlIiwgX19mdW5jX18pOworICAgICAgICBicmVhazsKKyAgICB9CisKKyAgICByZXR1cm4gQ1NDX0Vycm9yTm90SW1wbGVtZW50ZWQ7Cit9CisKK3ZvaWQgKmNzY19pbml0KAorICAgIENTQ19NRVRIT0QgKm1ldGhvZCkKK3sKKyAgICBDU0NfSEFORExFICpjc2NfaGFuZGxlOworICAgIGNzY19oYW5kbGUgPSAoQ1NDX0hBTkRMRSAqKW1hbGxvYyhzaXplb2YoQ1NDX0hBTkRMRSkpOworICAgIGlmIChjc2NfaGFuZGxlID09IE5VTEwpCisgICAgICAgIHJldHVybiBOVUxMOworCisgICAgbWVtc2V0KGNzY19oYW5kbGUsIDAsIHNpemVvZihDU0NfSEFORExFKSk7CisKKyAgICBjc2NfaGFuZGxlLT5jc2NfbWV0aG9kID0gKm1ldGhvZDsKKworICAgIGlmIChjc2NfaGFuZGxlLT5jc2NfbWV0aG9kID09IENTQ19NRVRIT0RfSFcgfHwKKyAgICAgICAgY3NjX2hhbmRsZS0+Y3NjX21ldGhvZCA9PSBDU0NfTUVUSE9EX1BSRUZFUl9IVykgeworI2lmZGVmIFVTRV9GSU1DCisgICAgICAgIGNzY19oYW5kbGUtPmNzY19od190eXBlID0gQ1NDX0hXX1RZUEVfRklNQzsKKyNlbmRpZgorI2lmZGVmIFVTRV9HU0NBTEVSCisgICAgICAgIGNzY19oYW5kbGUtPmNzY19od190eXBlID0gQ1NDX0hXX1RZUEVfR1NDQUxFUjsKKyNlbmRpZgorICAgICAgICBzd2l0Y2ggKGNzY19oYW5kbGUtPmNzY19od190eXBlKSB7CisjaWZkZWYgVVNFX0ZJTUMKKyAgICAgICAgY2FzZSBDU0NfSFdfVFlQRV9GSU1DOgorICAgICAgICAgICAgY3NjX2hhbmRsZS0+Y3NjX2h3X2hhbmRsZSA9IGNzY19od2NvbnZlcnRlcl9vcGVuKCk7CisgICAgICAgICAgICBMT0dEKCIlczo6IENTQ19IV19UWVBFX0ZJTUMiLCBfX2Z1bmNfXyk7CisgICAgICAgICAgICBicmVhazsKKyNlbmRpZgorI2lmZGVmIFVTRV9HU0NBTEVSCisgICAgICAgIGNhc2UgQ1NDX0hXX1RZUEVfR1NDQUxFUjoKKyAgICAgICAgICAgIGNzY19oYW5kbGUtPmNzY19od19oYW5kbGUgPSBleHlub3NfZ3NjX2NyZWF0ZSgpOworICAgICAgICAgICAgTE9HRCgiJXM6OiBDU0NfSFdfVFlQRV9HU0NBTEVSIiwgX19mdW5jX18pOworICAgICAgICAgICAgYnJlYWs7CisjZW5kaWYKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIExPR0UoIiVzOjogdW5zdXBwb3J0ZWQgY3NjX2h3X3R5cGUsIGNzYyB1c2Ugc3ciLCBfX2Z1bmNfXyk7CisgICAgICAgICAgICBjc2NfaGFuZGxlLT5jc2NfaHdfaGFuZGxlID09IE5VTEw7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmIChjc2NfaGFuZGxlLT5jc2NfbWV0aG9kID09IENTQ19NRVRIT0RfUFJFRkVSX0hXKSB7CisgICAgICAgIGlmIChjc2NfaGFuZGxlLT5jc2NfaHdfaGFuZGxlID09IE5VTEwpIHsKKyAgICAgICAgICAgIGNzY19oYW5kbGUtPmNzY19tZXRob2QgPSBDU0NfTUVUSE9EX1NXOworICAgICAgICAgICAgKm1ldGhvZCA9IENTQ19NRVRIT0RfU1c7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBjc2NfaGFuZGxlLT5jc2NfbWV0aG9kID0gQ1NDX01FVEhPRF9IVzsKKyAgICAgICAgICAgICptZXRob2QgPSBDU0NfTUVUSE9EX0hXOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKGNzY19oYW5kbGUtPmNzY19tZXRob2QgPT0gQ1NDX01FVEhPRF9IVykgeworICAgICAgICBpZiAoY3NjX2hhbmRsZS0+Y3NjX2h3X2hhbmRsZSA9PSBOVUxMKSB7CisgICAgICAgICAgICBMT0dFKCIlczo6IENTQ19NRVRIT0RfSFcgY2FuJ3Qgb3BlbiBIVyIsIF9fZnVuY19fKTsKKyAgICAgICAgICAgIGZyZWUoY3NjX2hhbmRsZSk7CisgICAgICAgICAgICBjc2NfaGFuZGxlID0gTlVMTDsKKyAgICAgICAgfQorICAgIH0KKworICAgIExPR0QoIiVzOjogQ1NDX01FVEhPRD0lZCIsIF9fZnVuY19fLCBjc2NfaGFuZGxlLT5jc2NfbWV0aG9kKTsKKworICAgIHJldHVybiAodm9pZCAqKWNzY19oYW5kbGU7Cit9CisKK0NTQ19FUlJPUkNPREUgY3NjX2RlaW5pdCgKKyAgICB2b2lkICpoYW5kbGUpCit7CisgICAgQ1NDX0VSUk9SQ09ERSByZXQgPSBDU0NfRXJyb3JOb25lOworICAgIENTQ19IQU5ETEUgKmNzY19oYW5kbGU7CisKKyAgICBjc2NfaGFuZGxlID0gKENTQ19IQU5ETEUgKiloYW5kbGU7CisgICAgaWYgKGNzY19oYW5kbGUtPmNzY19tZXRob2QgPT0gQ1NDX01FVEhPRF9IVykgeworICAgICAgICBzd2l0Y2ggKGNzY19oYW5kbGUtPmNzY19od190eXBlKSB7CisjaWZkZWYgVVNFX0ZJTUMKKyAgICAgICAgY2FzZSBDU0NfSFdfVFlQRV9GSU1DOgorICAgICAgICAgICAgY3NjX2h3Y29udmVydGVyX2Nsb3NlKGNzY19oYW5kbGUtPmNzY19od19oYW5kbGUpOworICAgICAgICAgICAgYnJlYWs7CisjZW5kaWYKKyNpZmRlZiBVU0VfR1NDQUxFUgorICAgICAgICBjYXNlIENTQ19IV19UWVBFX0dTQ0FMRVI6CisgICAgICAgICAgICBleHlub3NfZ3NjX2Rlc3Ryb3koY3NjX2hhbmRsZS0+Y3NjX2h3X2hhbmRsZSk7CisgICAgICAgICAgICBicmVhazsKKyNlbmRpZgorICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgTE9HRSgiJXM6OiB1bnN1cHBvcnRlZCBjc2NfaHdfdHlwZSIsIF9fZnVuY19fKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKGNzY19oYW5kbGUgIT0gTlVMTCkgeworICAgICAgICBmcmVlKGNzY19oYW5kbGUpOworICAgICAgICByZXQgPSBDU0NfRXJyb3JOb25lOworICAgIH0KKworICAgIHJldHVybiByZXQ7Cit9CisKK0NTQ19FUlJPUkNPREUgY3NjX2dldF9tZXRob2QoCisgICAgdm9pZCAgICAgICAgICAgKmhhbmRsZSwKKyAgICBDU0NfTUVUSE9EICAgICAqbWV0aG9kKQoreworICAgIENTQ19IQU5ETEUgKmNzY19oYW5kbGU7CisgICAgQ1NDX0VSUk9SQ09ERSByZXQgPSBDU0NfRXJyb3JOb25lOworCisgICAgaWYgKGhhbmRsZSA9PSBOVUxMKQorICAgICAgICByZXR1cm4gQ1NDX0Vycm9yTm90SW5pdDsKKworICAgIGNzY19oYW5kbGUgPSAoQ1NDX0hBTkRMRSAqKWhhbmRsZTsKKyAgICAqbWV0aG9kID0gY3NjX2hhbmRsZS0+Y3NjX21ldGhvZDsKKworICAgIHJldHVybiByZXQ7Cit9CisKK0NTQ19FUlJPUkNPREUgY3NjX2dldF9zcmNfZm9ybWF0KAorICAgIHZvaWQgICAgICAgICAgICpoYW5kbGUsCisgICAgdW5zaWduZWQgaW50ICAgKndpZHRoLAorICAgIHVuc2lnbmVkIGludCAgICpoZWlnaHQsCisgICAgdW5zaWduZWQgaW50ICAgKmNyb3BfbGVmdCwKKyAgICB1bnNpZ25lZCBpbnQgICAqY3JvcF90b3AsCisgICAgdW5zaWduZWQgaW50ICAgKmNyb3Bfd2lkdGgsCisgICAgdW5zaWduZWQgaW50ICAgKmNyb3BfaGVpZ2h0LAorICAgIHVuc2lnbmVkIGludCAgICpjb2xvcl9mb3JtYXQsCisgICAgdW5zaWduZWQgaW50ICAgKmNhY2hlYWJsZSkKK3sKKyAgICBDU0NfSEFORExFICpjc2NfaGFuZGxlOworICAgIENTQ19FUlJPUkNPREUgcmV0ID0gQ1NDX0Vycm9yTm9uZTsKKworICAgIGlmIChoYW5kbGUgPT0gTlVMTCkKKyAgICAgICAgcmV0dXJuIENTQ19FcnJvck5vdEluaXQ7CisKKyAgICBjc2NfaGFuZGxlID0gKENTQ19IQU5ETEUgKiloYW5kbGU7CisgICAgKndpZHRoID0gY3NjX2hhbmRsZS0+c3JjX2Zvcm1hdC53aWR0aDsKKyAgICAqaGVpZ2h0ID0gY3NjX2hhbmRsZS0+c3JjX2Zvcm1hdC5oZWlnaHQ7CisgICAgKmNyb3BfbGVmdCA9IGNzY19oYW5kbGUtPnNyY19mb3JtYXQuY3JvcF9sZWZ0OworICAgICpjcm9wX3RvcCA9IGNzY19oYW5kbGUtPnNyY19mb3JtYXQuY3JvcF90b3A7CisgICAgKmNyb3Bfd2lkdGggPSBjc2NfaGFuZGxlLT5zcmNfZm9ybWF0LmNyb3Bfd2lkdGg7CisgICAgKmNyb3BfaGVpZ2h0ID0gY3NjX2hhbmRsZS0+c3JjX2Zvcm1hdC5jcm9wX2hlaWdodDsKKyAgICAqY29sb3JfZm9ybWF0ID0gY3NjX2hhbmRsZS0+c3JjX2Zvcm1hdC5jb2xvcl9mb3JtYXQ7CisgICAgKmNhY2hlYWJsZSA9IGNzY19oYW5kbGUtPnNyY19mb3JtYXQuY2FjaGVhYmxlOworCisgICAgcmV0dXJuIHJldDsKK30KKworQ1NDX0VSUk9SQ09ERSBjc2Nfc2V0X3NyY19mb3JtYXQoCisgICAgdm9pZCAgICAgICAgICAgKmhhbmRsZSwKKyAgICB1bnNpZ25lZCBpbnQgICAgd2lkdGgsCisgICAgdW5zaWduZWQgaW50ICAgIGhlaWdodCwKKyAgICB1bnNpZ25lZCBpbnQgICAgY3JvcF9sZWZ0LAorICAgIHVuc2lnbmVkIGludCAgICBjcm9wX3RvcCwKKyAgICB1bnNpZ25lZCBpbnQgICAgY3JvcF93aWR0aCwKKyAgICB1bnNpZ25lZCBpbnQgICAgY3JvcF9oZWlnaHQsCisgICAgdW5zaWduZWQgaW50ICAgIGNvbG9yX2Zvcm1hdCwKKyAgICB1bnNpZ25lZCBpbnQgICAgY2FjaGVhYmxlKQoreworICAgIENTQ19IQU5ETEUgKmNzY19oYW5kbGU7CisgICAgQ1NDX0VSUk9SQ09ERSByZXQgPSBDU0NfRXJyb3JOb25lOworCisgICAgaWYgKGhhbmRsZSA9PSBOVUxMKQorICAgICAgICByZXR1cm4gQ1NDX0Vycm9yTm90SW5pdDsKKworICAgIGNzY19oYW5kbGUgPSAoQ1NDX0hBTkRMRSAqKWhhbmRsZTsKKyAgICBjc2NfaGFuZGxlLT5zcmNfZm9ybWF0LndpZHRoID0gd2lkdGg7CisgICAgY3NjX2hhbmRsZS0+c3JjX2Zvcm1hdC5oZWlnaHQgPSBoZWlnaHQ7CisgICAgY3NjX2hhbmRsZS0+c3JjX2Zvcm1hdC5jcm9wX2xlZnQgPSBjcm9wX2xlZnQ7CisgICAgY3NjX2hhbmRsZS0+c3JjX2Zvcm1hdC5jcm9wX3RvcCA9IGNyb3BfdG9wOworICAgIGNzY19oYW5kbGUtPnNyY19mb3JtYXQuY3JvcF93aWR0aCA9IGNyb3Bfd2lkdGg7CisgICAgY3NjX2hhbmRsZS0+c3JjX2Zvcm1hdC5jcm9wX2hlaWdodCA9IGNyb3BfaGVpZ2h0OworICAgIGNzY19oYW5kbGUtPnNyY19mb3JtYXQuY29sb3JfZm9ybWF0ID0gY29sb3JfZm9ybWF0OworICAgIGNzY19oYW5kbGUtPnNyY19mb3JtYXQuY2FjaGVhYmxlID0gY2FjaGVhYmxlOworCisgICAgaWYgKGNzY19oYW5kbGUtPmNzY19tZXRob2QgPT0gQ1NDX01FVEhPRF9IVykgeworICAgICAgICBzd2l0Y2ggKGNzY19oYW5kbGUtPmNzY19od190eXBlKSB7CisgICAgICAgIGNhc2UgQ1NDX0hXX1RZUEVfRklNQzoKKyAgICAgICAgICAgIGJyZWFrOworI2lmZGVmIFVTRV9HU0NBTEVSCisgICAgICAgIGNhc2UgQ1NDX0hXX1RZUEVfR1NDQUxFUjoKKyAgICAgICAgICAgIGV4eW5vc19nc2Nfc2V0X3NyY19mb3JtYXQoCisgICAgICAgICAgICAgICAgY3NjX2hhbmRsZS0+Y3NjX2h3X2hhbmRsZSwKKyAgICAgICAgICAgICAgICBBTElHTihjc2NfaGFuZGxlLT5zcmNfZm9ybWF0LndpZHRoLCBHU0NBTEVSX0lNR19BTElHTiksCisgICAgICAgICAgICAgICAgQUxJR04oY3NjX2hhbmRsZS0+c3JjX2Zvcm1hdC5oZWlnaHQsIEdTQ0FMRVJfSU1HX0FMSUdOKSwKKyAgICAgICAgICAgICAgICBjc2NfaGFuZGxlLT5zcmNfZm9ybWF0LmNyb3BfbGVmdCwKKyAgICAgICAgICAgICAgICBjc2NfaGFuZGxlLT5zcmNfZm9ybWF0LmNyb3BfdG9wLAorICAgICAgICAgICAgICAgIEFMSUdOKGNzY19oYW5kbGUtPnNyY19mb3JtYXQuY3JvcF93aWR0aCwgR1NDQUxFUl9JTUdfQUxJR04pLAorICAgICAgICAgICAgICAgIEFMSUdOKGNzY19oYW5kbGUtPnNyY19mb3JtYXQuY3JvcF9oZWlnaHQsIEdTQ0FMRVJfSU1HX0FMSUdOKSwKKyAgICAgICAgICAgICAgICBIQUxfUElYRUxfRk9STUFUXzJfVjRMMl9QSVgoY3NjX2hhbmRsZS0+c3JjX2Zvcm1hdC5jb2xvcl9mb3JtYXQpLAorICAgICAgICAgICAgICAgIGNzY19oYW5kbGUtPnNyY19mb3JtYXQuY2FjaGVhYmxlKTsKKyAgICAgICAgICAgIGJyZWFrOworI2VuZGlmCisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICBMT0dFKCIlczo6IHVuc3VwcG9ydGVkIGNzY19od190eXBlIiwgX19mdW5jX18pOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gcmV0OworfQorCitDU0NfRVJST1JDT0RFIGNzY19nZXRfZHN0X2Zvcm1hdCgKKyAgICB2b2lkICAgICAgICAgICAqaGFuZGxlLAorICAgIHVuc2lnbmVkIGludCAgICp3aWR0aCwKKyAgICB1bnNpZ25lZCBpbnQgICAqaGVpZ2h0LAorICAgIHVuc2lnbmVkIGludCAgICpjcm9wX2xlZnQsCisgICAgdW5zaWduZWQgaW50ICAgKmNyb3BfdG9wLAorICAgIHVuc2lnbmVkIGludCAgICpjcm9wX3dpZHRoLAorICAgIHVuc2lnbmVkIGludCAgICpjcm9wX2hlaWdodCwKKyAgICB1bnNpZ25lZCBpbnQgICAqY29sb3JfZm9ybWF0LAorICAgIHVuc2lnbmVkIGludCAgICpjYWNoZWFibGUpCit7CisgICAgQ1NDX0hBTkRMRSAqY3NjX2hhbmRsZTsKKyAgICBDU0NfRVJST1JDT0RFIHJldCA9IENTQ19FcnJvck5vbmU7CisKKyAgICBpZiAoaGFuZGxlID09IE5VTEwpCisgICAgICAgIHJldHVybiBDU0NfRXJyb3JOb3RJbml0OworCisgICAgY3NjX2hhbmRsZSA9IChDU0NfSEFORExFICopaGFuZGxlOworICAgICp3aWR0aCA9IGNzY19oYW5kbGUtPmRzdF9mb3JtYXQud2lkdGg7CisgICAgKmhlaWdodCA9IGNzY19oYW5kbGUtPmRzdF9mb3JtYXQuaGVpZ2h0OworICAgICpjcm9wX2xlZnQgPSBjc2NfaGFuZGxlLT5kc3RfZm9ybWF0LmNyb3BfbGVmdDsKKyAgICAqY3JvcF90b3AgPSBjc2NfaGFuZGxlLT5kc3RfZm9ybWF0LmNyb3BfdG9wOworICAgICpjcm9wX3dpZHRoID0gY3NjX2hhbmRsZS0+ZHN0X2Zvcm1hdC5jcm9wX3dpZHRoOworICAgICpjcm9wX2hlaWdodCA9IGNzY19oYW5kbGUtPmRzdF9mb3JtYXQuY3JvcF9oZWlnaHQ7CisgICAgKmNvbG9yX2Zvcm1hdCA9IGNzY19oYW5kbGUtPmRzdF9mb3JtYXQuY29sb3JfZm9ybWF0OworICAgICpjYWNoZWFibGUgPSBjc2NfaGFuZGxlLT5kc3RfZm9ybWF0LmNhY2hlYWJsZTsKKworICAgIHJldHVybiByZXQ7Cit9CisKK0NTQ19FUlJPUkNPREUgY3NjX3NldF9kc3RfZm9ybWF0KAorICAgIHZvaWQgICAgICAgICAgICpoYW5kbGUsCisgICAgdW5zaWduZWQgaW50ICAgIHdpZHRoLAorICAgIHVuc2lnbmVkIGludCAgICBoZWlnaHQsCisgICAgdW5zaWduZWQgaW50ICAgIGNyb3BfbGVmdCwKKyAgICB1bnNpZ25lZCBpbnQgICAgY3JvcF90b3AsCisgICAgdW5zaWduZWQgaW50ICAgIGNyb3Bfd2lkdGgsCisgICAgdW5zaWduZWQgaW50ICAgIGNyb3BfaGVpZ2h0LAorICAgIHVuc2lnbmVkIGludCAgICBjb2xvcl9mb3JtYXQsCisgICAgdW5zaWduZWQgaW50ICAgIGNhY2hlYWJsZSkKK3sKKyAgICBDU0NfSEFORExFICpjc2NfaGFuZGxlOworICAgIENTQ19FUlJPUkNPREUgcmV0ID0gQ1NDX0Vycm9yTm9uZTsKKworICAgIGlmIChoYW5kbGUgPT0gTlVMTCkKKyAgICAgICAgcmV0dXJuIENTQ19FcnJvck5vdEluaXQ7CisKKyAgICBjc2NfaGFuZGxlID0gKENTQ19IQU5ETEUgKiloYW5kbGU7CisgICAgY3NjX2hhbmRsZS0+ZHN0X2Zvcm1hdC53aWR0aCA9IHdpZHRoOworICAgIGNzY19oYW5kbGUtPmRzdF9mb3JtYXQuaGVpZ2h0ID0gaGVpZ2h0OworICAgIGNzY19oYW5kbGUtPmRzdF9mb3JtYXQuY3JvcF9sZWZ0ID0gY3JvcF9sZWZ0OworICAgIGNzY19oYW5kbGUtPmRzdF9mb3JtYXQuY3JvcF90b3AgPSBjcm9wX3RvcDsKKyAgICBjc2NfaGFuZGxlLT5kc3RfZm9ybWF0LmNyb3Bfd2lkdGggPSBjcm9wX3dpZHRoOworICAgIGNzY19oYW5kbGUtPmRzdF9mb3JtYXQuY3JvcF9oZWlnaHQgPSBjcm9wX2hlaWdodDsKKyAgICBjc2NfaGFuZGxlLT5kc3RfZm9ybWF0LmNvbG9yX2Zvcm1hdCA9IGNvbG9yX2Zvcm1hdDsKKyAgICBjc2NfaGFuZGxlLT5kc3RfZm9ybWF0LmNhY2hlYWJsZSA9IGNhY2hlYWJsZTsKKworICAgIGlmIChjc2NfaGFuZGxlLT5jc2NfbWV0aG9kID09IENTQ19NRVRIT0RfSFcpIHsKKyAgICAgICAgc3dpdGNoIChjc2NfaGFuZGxlLT5jc2NfaHdfdHlwZSkgeworICAgICAgICBjYXNlIENTQ19IV19UWVBFX0ZJTUM6CisgICAgICAgICAgICBicmVhazsKKyNpZmRlZiBVU0VfR1NDQUxFUgorICAgICAgICBjYXNlIENTQ19IV19UWVBFX0dTQ0FMRVI6CisgICAgICAgICAgICBleHlub3NfZ3NjX3NldF9kc3RfZm9ybWF0KAorICAgICAgICAgICAgICAgIGNzY19oYW5kbGUtPmNzY19od19oYW5kbGUsCisgICAgICAgICAgICAgICAgQUxJR04oY3NjX2hhbmRsZS0+ZHN0X2Zvcm1hdC53aWR0aCwgR1NDQUxFUl9JTUdfQUxJR04pLAorICAgICAgICAgICAgICAgIEFMSUdOKGNzY19oYW5kbGUtPmRzdF9mb3JtYXQuaGVpZ2h0LCBHU0NBTEVSX0lNR19BTElHTiksCisgICAgICAgICAgICAgICAgY3NjX2hhbmRsZS0+ZHN0X2Zvcm1hdC5jcm9wX2xlZnQsCisgICAgICAgICAgICAgICAgY3NjX2hhbmRsZS0+ZHN0X2Zvcm1hdC5jcm9wX3RvcCwKKyAgICAgICAgICAgICAgICBBTElHTihjc2NfaGFuZGxlLT5kc3RfZm9ybWF0LmNyb3Bfd2lkdGgsIEdTQ0FMRVJfSU1HX0FMSUdOKSwKKyAgICAgICAgICAgICAgICBBTElHTihjc2NfaGFuZGxlLT5kc3RfZm9ybWF0LmNyb3BfaGVpZ2h0LCBHU0NBTEVSX0lNR19BTElHTiksCisgICAgICAgICAgICAgICAgSEFMX1BJWEVMX0ZPUk1BVF8yX1Y0TDJfUElYKGNzY19oYW5kbGUtPmRzdF9mb3JtYXQuY29sb3JfZm9ybWF0KSwKKyAgICAgICAgICAgICAgICBjc2NfaGFuZGxlLT5kc3RfZm9ybWF0LmNhY2hlYWJsZSk7CisgICAgICAgICAgICBicmVhazsKKyNlbmRpZgorICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgTE9HRSgiJXM6OiB1bnN1cHBvcnRlZCBjc2NfaHdfdHlwZSIsIF9fZnVuY19fKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIHJldDsKK30KKworQ1NDX0VSUk9SQ09ERSBjc2Nfc2V0X3NyY19idWZmZXIoCisgICAgdm9pZCAgICAgICAgICAgKmhhbmRsZSwKKyAgICB1bnNpZ25lZCBjaGFyICAqeSwKKyAgICB1bnNpZ25lZCBjaGFyICAqdSwKKyAgICB1bnNpZ25lZCBjaGFyICAqdiwKKyAgICBpbnQgICAgICAgICAgICAgaW9uX2ZkKQoreworICAgIENTQ19IQU5ETEUgKmNzY19oYW5kbGU7CisgICAgQ1NDX0VSUk9SQ09ERSByZXQgPSBDU0NfRXJyb3JOb25lOworICAgIHZvaWQgKmFkZHJbM10gPSB7TlVMTCwgfTsKKworICAgIGlmIChoYW5kbGUgPT0gTlVMTCkKKyAgICAgICAgcmV0dXJuIENTQ19FcnJvck5vdEluaXQ7CisKKyAgICBjc2NfaGFuZGxlID0gKENTQ19IQU5ETEUgKiloYW5kbGU7CisgICAgY3NjX2hhbmRsZS0+c3JjX2J1ZmZlci5wbGFuZXNbQ1NDX1lfUExBTkVdID0geTsKKyAgICBjc2NfaGFuZGxlLT5zcmNfYnVmZmVyLnBsYW5lc1tDU0NfVV9QTEFORV0gPSB1OworICAgIGNzY19oYW5kbGUtPnNyY19idWZmZXIucGxhbmVzW0NTQ19WX1BMQU5FXSA9IHY7CisKKyAgICBpZiAoY3NjX2hhbmRsZS0+Y3NjX21ldGhvZCA9PSBDU0NfTUVUSE9EX0hXKSB7CisgICAgICAgIGFkZHJbMF0gPSBjc2NfaGFuZGxlLT5zcmNfYnVmZmVyLnBsYW5lc1tDU0NfWV9QTEFORV07CisgICAgICAgIGFkZHJbMV0gPSBjc2NfaGFuZGxlLT5zcmNfYnVmZmVyLnBsYW5lc1tDU0NfVV9QTEFORV07CisgICAgICAgIGFkZHJbMl0gPSBjc2NfaGFuZGxlLT5zcmNfYnVmZmVyLnBsYW5lc1tDU0NfVl9QTEFORV07CisKKyAgICAgICAgc3dpdGNoIChjc2NfaGFuZGxlLT5jc2NfaHdfdHlwZSkgeworICAgICAgICBjYXNlIENTQ19IV19UWVBFX0ZJTUM6CisgICAgICAgICAgICBicmVhazsKKyNpZmRlZiBVU0VfR1NDQUxFUgorICAgICAgICBjYXNlIENTQ19IV19UWVBFX0dTQ0FMRVI6CisgICAgICAgICAgICBleHlub3NfZ3NjX3NldF9zcmNfYWRkcihjc2NfaGFuZGxlLT5jc2NfaHdfaGFuZGxlLCBhZGRyKTsKKyAgICAgICAgICAgIGJyZWFrOworI2VuZGlmCisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICBMT0dFKCIlczo6IHVuc3VwcG9ydGVkIGNzY19od190eXBlIiwgX19mdW5jX18pOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gcmV0OworfQorCitDU0NfRVJST1JDT0RFIGNzY19zZXRfZHN0X2J1ZmZlcigKKyAgICB2b2lkICAgICAgICAgICAqaGFuZGxlLAorICAgIHVuc2lnbmVkIGNoYXIgICp5LAorICAgIHVuc2lnbmVkIGNoYXIgICp1LAorICAgIHVuc2lnbmVkIGNoYXIgICp2LAorICAgIGludCAgICAgICAgICAgICBpb25fZmQpCit7CisgICAgQ1NDX0hBTkRMRSAqY3NjX2hhbmRsZTsKKyAgICBDU0NfRVJST1JDT0RFIHJldCA9IENTQ19FcnJvck5vbmU7CisgICAgdm9pZCAqYWRkclszXSA9IHtOVUxMLCB9OworCisgICAgaWYgKGhhbmRsZSA9PSBOVUxMKQorICAgICAgICByZXR1cm4gQ1NDX0Vycm9yTm90SW5pdDsKKworICAgIGNzY19oYW5kbGUgPSAoQ1NDX0hBTkRMRSAqKWhhbmRsZTsKKyAgICBjc2NfaGFuZGxlLT5kc3RfYnVmZmVyLnBsYW5lc1tDU0NfWV9QTEFORV0gPSB5OworICAgIGNzY19oYW5kbGUtPmRzdF9idWZmZXIucGxhbmVzW0NTQ19VX1BMQU5FXSA9IHU7CisgICAgY3NjX2hhbmRsZS0+ZHN0X2J1ZmZlci5wbGFuZXNbQ1NDX1ZfUExBTkVdID0gdjsKKworICAgIGlmIChjc2NfaGFuZGxlLT5jc2NfbWV0aG9kID09IENTQ19NRVRIT0RfSFcpIHsKKyAgICAgICAgYWRkclswXSA9IGNzY19oYW5kbGUtPmRzdF9idWZmZXIucGxhbmVzW0NTQ19ZX1BMQU5FXTsKKyAgICAgICAgYWRkclsxXSA9IGNzY19oYW5kbGUtPmRzdF9idWZmZXIucGxhbmVzW0NTQ19VX1BMQU5FXTsKKyAgICAgICAgYWRkclsyXSA9IGNzY19oYW5kbGUtPmRzdF9idWZmZXIucGxhbmVzW0NTQ19WX1BMQU5FXTsKKworICAgICAgICBzd2l0Y2ggKGNzY19oYW5kbGUtPmNzY19od190eXBlKSB7CisgICAgICAgIGNhc2UgQ1NDX0hXX1RZUEVfRklNQzoKKyAgICAgICAgICAgIGJyZWFrOworI2lmZGVmIFVTRV9HU0NBTEVSCisgICAgICAgIGNhc2UgQ1NDX0hXX1RZUEVfR1NDQUxFUjoKKyAgICAgICAgICAgIGV4eW5vc19nc2Nfc2V0X2RzdF9hZGRyKGNzY19oYW5kbGUtPmNzY19od19oYW5kbGUsIGFkZHIpOworICAgICAgICAgICAgYnJlYWs7CisjZW5kaWYKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIExPR0UoIiVzOjogdW5zdXBwb3J0ZWQgY3NjX2h3X3R5cGUiLCBfX2Z1bmNfXyk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiByZXQ7Cit9CisKK0NTQ19FUlJPUkNPREUgY3NjX2NvbnZlcnQoCisgICAgdm9pZCAqaGFuZGxlKQoreworICAgIENTQ19IQU5ETEUgKmNzY19oYW5kbGUgPSAoQ1NDX0hBTkRMRSAqKWhhbmRsZTsKKyAgICBDU0NfRVJST1JDT0RFIHJldCA9IENTQ19FcnJvck5vbmU7CisKKyAgICBpZiAoY3NjX2hhbmRsZSA9PSBOVUxMKQorICAgICAgICByZXR1cm4gQ1NDX0Vycm9yTm90SW5pdDsKKworICAgIGlmIChjc2NfaGFuZGxlLT5jc2NfbWV0aG9kID09IENTQ19NRVRIT0RfSFcpCisgICAgICAgIHJldCA9IGNvbnZfaHcoY3NjX2hhbmRsZSk7CisgICAgZWxzZQorICAgICAgICByZXQgPSBjb252X3N3KGNzY19oYW5kbGUpOworCisgICAgcmV0dXJuIHJldDsKK30KZGlmZiAtLWdpdCBhL2V4eW5vczQvbXVsdGltZWRpYS9saWJzL2xpYmNzYy9jc2MuaCBiL2V4eW5vczQvbXVsdGltZWRpYS9saWJzL2xpYmNzYy9jc2MuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45MDY5MzkyCi0tLSAvZGV2L251bGwKKysrIGIvZXh5bm9zNC9tdWx0aW1lZGlhL2xpYnMvbGliY3NjL2NzYy5oCkBAIC0wLDAgKzEsMzU1IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDEyIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworLyoKKyAqIEBmaWxlICAgIGNzYy5oCisgKgorICogQGJyaWVmICAgY29sb3Igc3BhY2UgY29udmVydGlvbiBhYnN0cmFjdCBoZWFkZXIKKyAqCisgKiBAYXV0aG9yICBQeW91bmdqYWUgSnVuZyAocGpldC5qdW5nQHNhbXN1bmcuY29tKQorICoKKyAqIEB2ZXJzaW9uIDEuMAorICoKKyAqIEBoaXN0b3J5CisgKiAgIDIwMTEuMTIuMjcgOiBDcmVhdGUKKyAqLworCisjaWZuZGVmIENTQ19ICisjZGVmaW5lIENTQ19ICisKKyNpZmRlZiBfX2NwbHVzcGx1cworZXh0ZXJuICJDIiB7CisjZW5kaWYKKwordHlwZWRlZiBlbnVtIF9DU0NfRVJST1JDT0RFIHsKKyAgICBDU0NfRXJyb3JOb25lID0gMCwKKyAgICBDU0NfRXJyb3IsCisgICAgQ1NDX0Vycm9yTm90SW5pdCwKKyAgICBDU0NfRXJyb3JJbnZhbGlkQWRkcmVzcywKKyAgICBDU0NfRXJyb3JVbnN1cHBvcnRGb3JtYXQsCisgICAgQ1NDX0Vycm9yTm90SW1wbGVtZW50ZWQKK30gQ1NDX0VSUk9SQ09ERTsKKwordHlwZWRlZiBlbnVtIF9DU0NfTUVUSE9EIHsKKyAgICBDU0NfTUVUSE9EX1NXID0gMCwKKyAgICBDU0NfTUVUSE9EX0hXLAorICAgIENTQ19NRVRIT0RfUFJFRkVSX0hXCit9IENTQ19NRVRIT0Q7CisKKy8qCisgKiBjaGFuZ2UgaGFsIHBpeGVsIGZvcm1hdCB0byBvbXggcGl4ZWwgZm9ybWF0CisgKgorICogQHBhcmFtIGhhbF9mb3JtYXQKKyAqICAgaGFsIHBpeGVsIGZvcm1hdFtpbl0KKyAqCisgKiBAcmV0dXJuCisgKiAgIG9teCBwaXhlbCBmb3JtYXQKKyAqLwordW5zaWduZWQgaW50IGhhbF8yX29teF9waXhlbF9mb3JtYXQoCisgICAgdW5zaWduZWQgaW50IGhhbF9mb3JtYXQpOworCisvKgorICogY2hhbmdlIG9teCBwaXhlbCBmb3JtYXQgdG8gaGFsIHBpeGVsIGZvcm1hdAorICoKKyAqIEBwYXJhbSBoYWxfZm9ybWF0CisgKiAgIG9teCBwaXhlbCBmb3JtYXRbaW5dCisgKgorICogQHJldHVybgorICogICBoYWwgcGl4ZWwgZm9ybWF0CisgKi8KK3Vuc2lnbmVkIGludCBvbXhfMl9oYWxfcGl4ZWxfZm9ybWF0KAorICAgIHVuc2lnbmVkIGludCBvbXhfZm9ybWF0KTsKKworLyoKKyAqIEluaXQgQ1NDIGhhbmRsZQorICoKKyAqIEByZXR1cm4KKyAqICAgY3NjIGhhbmRsZQorICovCit2b2lkICpjc2NfaW5pdCgKKyAgICBDU0NfTUVUSE9EICptZXRob2QpOworCisvKgorICogRGVpbml0IENTQyBoYW5kbGUKKyAqCisgKiBAcGFyYW0gaGFuZGxlCisgKiAgIENTQyBoYW5kbGVbaW5dCisgKgorICogQHJldHVybgorICogICBlcnJvciBjb2RlCisgKi8KK0NTQ19FUlJPUkNPREUgY3NjX2RlaW5pdCgKKyAgICB2b2lkICpoYW5kbGUpOworCisvKgorICogZ2V0IGNvbG9yIHNwYWNlIGNvbnZlcnRlciBtZXRob2QKKyAqCisgKiBAcGFyYW0gaGFuZGxlCisgKiAgIENTQyBoYW5kbGVbaW5dCisgKgorICogQHBhcmFtIG1ldGhvZAorICogICBDU0MgbWV0aG9kW291dF0KKyAqCisgKiBAcmV0dXJuCisgKiAgIGVycm9yIGNvZGUKKyAqLworQ1NDX0VSUk9SQ09ERSBjc2NfZ2V0X21ldGhvZCgKKyAgICB2b2lkICAgICAgICAgICAqaGFuZGxlLAorICAgIENTQ19NRVRIT0QgICAgICptZXRob2QpOworCisvKgorICogR2V0IHNvdXJjZSBmb3JtYXQuCisgKgorICogQHBhcmFtIGhhbmRsZQorICogICBDU0MgaGFuZGxlW2luXQorICoKKyAqIEBwYXJhbSB3aWR0aAorICogICBhZGRyZXNzIG9mIGltYWdlIHdpZHRoW291dF0KKyAqCisgKiBAcGFyYW0gaGVpZ2h0CisgKiAgIGFkZHJlc3Mgb2YgaW1hZ2UgaGVpZ2h0W291dF0KKyAqCisgKiBAcGFyYW0gY3JvcF9sZWZ0CisgKiAgIGFkZHJlc3Mgb2YgaW1hZ2UgbGVmdCBjcm9wIHNpemVbb3V0XQorICoKKyAqIEBwYXJhbSBjcm9wX3RvcAorICogICBhZGRyZXNzIG9mIGltYWdlIHRvcCBjcm9wIHNpemVbb3V0XQorICoKKyAqIEBwYXJhbSBjcm9wX3dpZHRoCisgKiAgIGFkZHJlc3Mgb2YgY3JvcHBlZCBpbWFnZSB3aWR0aFtvdXRdCisgKgorICogQHBhcmFtIGNyb3BfaGVpZ2h0CisgKiAgIGFkZHJlc3Mgb2YgY3JvcHBlZCBpbWFnZSBoZWlnaHRbb3V0XQorICoKKyAqIEBwYXJhbSBjb2xvcl9mb3JtYXQKKyAqICAgYWRkcmVzcyBvZiBzb3VyY2UgY29sb3IgZm9ybWF0KEhBTCBmb3JtYXQpW291dF0KKyAqCisgKiBAcmV0dXJuCisgKiAgIGVycm9yIGNvZGUKKyAqLworQ1NDX0VSUk9SQ09ERSBjc2NfZ2V0X3NyY19mb3JtYXQoCisgICAgdm9pZCAgICAgICAgICAgKmhhbmRsZSwKKyAgICB1bnNpZ25lZCBpbnQgICAqd2lkdGgsCisgICAgdW5zaWduZWQgaW50ICAgKmhlaWdodCwKKyAgICB1bnNpZ25lZCBpbnQgICAqY3JvcF9sZWZ0LAorICAgIHVuc2lnbmVkIGludCAgICpjcm9wX3RvcCwKKyAgICB1bnNpZ25lZCBpbnQgICAqY3JvcF93aWR0aCwKKyAgICB1bnNpZ25lZCBpbnQgICAqY3JvcF9oZWlnaHQsCisgICAgdW5zaWduZWQgaW50ICAgKmNvbG9yX2Zvcm1hdCwKKyAgICB1bnNpZ25lZCBpbnQgICAqY2FjaGVhYmxlKTsKKworLyoKKyAqIFNldCBzb3VyY2UgZm9ybWF0LgorICogRG9uJ3QgY2FsbCBlYWNoIGNvbnZlcnRpbmcgdGltZS4KKyAqIFBscyBjYWxsIHRoaXMgZnVuY3Rpb24gYXMgYmVsb3cuCisgKiAgIDEuIGZpcnN0IGNvbnZlcnRpbmcgdGltZQorICogICAyLiBmb3JtYXQgaXMgY2hhbmdlZAorICoKKyAqIEBwYXJhbSBoYW5kbGUKKyAqICAgQ1NDIGhhbmRsZVtpbl0KKyAqCisgKiBAcGFyYW0gd2lkdGgKKyAqICAgaW1hZ2Ugd2lkdGhbaW5dCisgKgorICogQHBhcmFtIGhlaWdodAorICogICBpbWFnZSBoZWlnaHRbaW5dCisgKgorICogQHBhcmFtIGNyb3BfbGVmdAorICogICBpbWFnZSBsZWZ0IGNyb3Agc2l6ZVtpbl0KKyAqCisgKiBAcGFyYW0gY3JvcF90b3AKKyAqICAgaW1hZ2UgdG9wIGNyb3Agc2l6ZVtpbl0KKyAqCisgKiBAcGFyYW0gY3JvcF93aWR0aAorICogICBjcm9wcGVkIGltYWdlIHdpZHRoW2luXQorICoKKyAqIEBwYXJhbSBjcm9wX2hlaWdodAorICogICBjcm9wcGVkIGltYWdlIGhlaWdodFtpbl0KKyAqCisgKiBAcGFyYW0gY29sb3JfZm9ybWF0CisgKiAgIHNvdXJjZSBjb2xvciBmb3JtYXQoSEFMIGZvcm1hdClbaW5dCisgKgorICogQHJldHVybgorICogICBlcnJvciBjb2RlCisgKi8KK0NTQ19FUlJPUkNPREUgY3NjX3NldF9zcmNfZm9ybWF0KAorICAgIHZvaWQgICAgICAgICAgICpoYW5kbGUsCisgICAgdW5zaWduZWQgaW50ICAgIHdpZHRoLAorICAgIHVuc2lnbmVkIGludCAgICBoZWlnaHQsCisgICAgdW5zaWduZWQgaW50ICAgIGNyb3BfbGVmdCwKKyAgICB1bnNpZ25lZCBpbnQgICAgY3JvcF90b3AsCisgICAgdW5zaWduZWQgaW50ICAgIGNyb3Bfd2lkdGgsCisgICAgdW5zaWduZWQgaW50ICAgIGNyb3BfaGVpZ2h0LAorICAgIHVuc2lnbmVkIGludCAgICBjb2xvcl9mb3JtYXQsCisgICAgdW5zaWduZWQgaW50ICAgIGNhY2hlYWJsZSk7CisKKy8qCisgKiBHZXQgZGVzdGluYXRpb24gZm9ybWF0LgorICoKKyAqIEBwYXJhbSBoYW5kbGUKKyAqICAgQ1NDIGhhbmRsZVtpbl0KKyAqCisgKiBAcGFyYW0gd2lkdGgKKyAqICAgYWRkcmVzcyBvZiBpbWFnZSB3aWR0aFtvdXRdCisgKgorICogQHBhcmFtIGhlaWdodAorICogICBhZGRyZXNzIG9mIGltYWdlIGhlaWdodFtvdXRdCisgKgorICogQHBhcmFtIGNyb3BfbGVmdAorICogICBhZGRyZXNzIG9mIGltYWdlIGxlZnQgY3JvcCBzaXplW291dF0KKyAqCisgKiBAcGFyYW0gY3JvcF90b3AKKyAqICAgYWRkcmVzcyBvZiBpbWFnZSB0b3AgY3JvcCBzaXplW291dF0KKyAqCisgKiBAcGFyYW0gY3JvcF93aWR0aAorICogICBhZGRyZXNzIG9mIGNyb3BwZWQgaW1hZ2Ugd2lkdGhbb3V0XQorICoKKyAqIEBwYXJhbSBjcm9wX2hlaWdodAorICogICBhZGRyZXNzIG9mIGNyb3BwZWQgaW1hZ2UgaGVpZ2h0W291dF0KKyAqCisgKiBAcGFyYW0gY29sb3JfZm9ybWF0CisgKiAgIGFkZHJlc3Mgb2YgY29sb3IgZm9ybWF0KEhBTCBmb3JtYXQpW291dF0KKyAqCisgKiBAcmV0dXJuCisgKiAgIGVycm9yIGNvZGUKKyAqLworQ1NDX0VSUk9SQ09ERSBjc2NfZ2V0X2RzdF9mb3JtYXQoCisgICAgdm9pZCAgICAgICAgICAgKmhhbmRsZSwKKyAgICB1bnNpZ25lZCBpbnQgICAqd2lkdGgsCisgICAgdW5zaWduZWQgaW50ICAgKmhlaWdodCwKKyAgICB1bnNpZ25lZCBpbnQgICAqY3JvcF9sZWZ0LAorICAgIHVuc2lnbmVkIGludCAgICpjcm9wX3RvcCwKKyAgICB1bnNpZ25lZCBpbnQgICAqY3JvcF93aWR0aCwKKyAgICB1bnNpZ25lZCBpbnQgICAqY3JvcF9oZWlnaHQsCisgICAgdW5zaWduZWQgaW50ICAgKmNvbG9yX2Zvcm1hdCwKKyAgICB1bnNpZ25lZCBpbnQgICAqY2FjaGVhYmxlKTsKKworLyoKKyAqIFNldCBkZXN0aW5hdGlvbiBmb3JtYXQKKyAqIERvbid0IGNhbGwgZWFjaCBjb252ZXJ0aW5nIHRpbWUuCisgKiBQbHMgY2FsbCB0aGlzIGZ1bmN0aW9uIGFzIGJlbG93LgorICogICAxLiBmaXJzdCBjb252ZXJ0aW5nIHRpbWUKKyAqICAgMi4gZm9ybWF0IGlzIGNoYW5nZWQKKyAqCisgKiBAcGFyYW0gaGFuZGxlCisgKiAgIENTQyBoYW5kbGVbaW5dCisgKgorICogQHBhcmFtIHdpZHRoCisgKiAgIGltYWdlIHdpZHRoW2luXQorICoKKyAqIEBwYXJhbSBoZWlnaHQKKyAqICAgaW1hZ2UgaGVpZ2h0W2luXQorICoKKyAqIEBwYXJhbSBjcm9wX2xlZnQKKyAqICAgaW1hZ2UgbGVmdCBjcm9wIHNpemVbaW5dCisgKgorICogQHBhcmFtIGNyb3BfdG9wCisgKiAgIGltYWdlIHRvcCBjcm9wIHNpemVbaW5dCisgKgorICogQHBhcmFtIGNyb3Bfd2lkdGgKKyAqICAgY3JvcHBlZCBpbWFnZSB3aWR0aFtpbl0KKyAqCisgKiBAcGFyYW0gY3JvcF9oZWlnaHQKKyAqICAgY3JvcHBlZCBpbWFnZSBoZWlnaHRbaW5dCisgKgorICogQHBhcmFtIGNvbG9yX2Zvcm1hdAorICogICBkZXN0aW5hdGlvbiBjb2xvciBmb3JtYXQoSEFMIGZvcm1hdClbaW5dCisgKgorICogQHJldHVybgorICogICBlcnJvciBjb2RlCisgKi8KK0NTQ19FUlJPUkNPREUgY3NjX3NldF9kc3RfZm9ybWF0KAorICAgIHZvaWQgICAgICAgICAgICpoYW5kbGUsCisgICAgdW5zaWduZWQgaW50ICAgIHdpZHRoLAorICAgIHVuc2lnbmVkIGludCAgICBoZWlnaHQsCisgICAgdW5zaWduZWQgaW50ICAgIGNyb3BfbGVmdCwKKyAgICB1bnNpZ25lZCBpbnQgICAgY3JvcF90b3AsCisgICAgdW5zaWduZWQgaW50ICAgIGNyb3Bfd2lkdGgsCisgICAgdW5zaWduZWQgaW50ICAgIGNyb3BfaGVpZ2h0LAorICAgIHVuc2lnbmVkIGludCAgICBjb2xvcl9mb3JtYXQsCisgICAgdW5zaWduZWQgaW50ICAgIGNhY2hlYWJsZSk7CisKKy8qCisgKiBTZXR1cCBzb3VyY2UgYnVmZmVyCisgKiBzZXRfZm9ybWF0IGZ1bmMgc2hvdWxkIGJlIGNhbGxlZCBiZWZvcmUgdGhpcyB0aGlzIGZ1bmMuCisgKgorICogQHBhcmFtIGhhbmRsZQorICogICBDU0MgaGFuZGxlW2luXQorICoKKyAqIEBwYXJhbSBzcmNfYnVmZmVyCisgKiAgIHNvdXJjZSBidWZmZXIgcG9pbnRlciBhcnJheVtpbl0KKyAqCisgKiBAcGFyYW0geQorICogICB5IG9yIFJHQiBkZXN0aW5hdGlvbiBwb2ludGVyW2luXQorICoKKyAqIEBwYXJhbSB1CisgKiAgIHUgb3IgdXYgZGVzdGluYXRpb24gcG9pbnRlcltpbl0KKyAqCisgKiBAcGFyYW0gdgorICogICB2IG9yIG5vbmUgZGVzdGluYXRpb24gcG9pbnRlcltpbl0KKyAqCisgKiBAcmV0dXJuCisgKiAgIGVycm9yIGNvZGUKKyAqLworQ1NDX0VSUk9SQ09ERSBjc2Nfc2V0X3NyY19idWZmZXIoCisgICAgdm9pZCAgICAgICAgICAgKmhhbmRsZSwKKyAgICB1bnNpZ25lZCBjaGFyICAqeSwKKyAgICB1bnNpZ25lZCBjaGFyICAqdSwKKyAgICB1bnNpZ25lZCBjaGFyICAqdiwKKyAgICBpbnQgICAgICAgICAgICAgaW9uX2ZkKTsKKworLyoKKyAqIFNldHVwIGRlc3RpbmF0aW9uIGJ1ZmZlcgorICoKKyAqIEBwYXJhbSBoYW5kbGUKKyAqICAgQ1NDIGhhbmRsZVtpbl0KKyAqCisgKiBAcGFyYW0geQorICogICB5IG9yIFJHQiBkZXN0aW5hdGlvbiBwb2ludGVyW2luXQorICoKKyAqIEBwYXJhbSB1CisgKiAgIHUgb3IgdXYgZGVzdGluYXRpb24gcG9pbnRlcltpbl0KKyAqCisgKiBAcGFyYW0gdgorICogICB2IG9yIG5vbmUgZGVzdGluYXRpb24gcG9pbnRlcltpbl0KKyAqCisgKiBAcmV0dXJuCisgKiAgIGVycm9yIGNvZGUKKyAqLworQ1NDX0VSUk9SQ09ERSBjc2Nfc2V0X2RzdF9idWZmZXIoCisgICAgdm9pZCAgICAgICAgICAgKmhhbmRsZSwKKyAgICB1bnNpZ25lZCBjaGFyICAqeSwKKyAgICB1bnNpZ25lZCBjaGFyICAqdSwKKyAgICB1bnNpZ25lZCBjaGFyICAqdiwKKyAgICBpbnQgICAgICAgICAgICAgaW9uX2ZkKTsKKworLyoKKyAqIENvbnZlcnQgY29sb3Igc3BhY2Ugd2l0aCBwcmVzZXR1cCBjb2xvciBmb3JtYXQKKyAqCisgKiBAcGFyYW0gaGFuZGxlCisgKiAgIENTQyBoYW5kbGVbaW5dCisgKgorICogQHJldHVybgorICogICBlcnJvciBjb2RlCisgKi8KK0NTQ19FUlJPUkNPREUgY3NjX2NvbnZlcnQoCisgICAgdm9pZCAqaGFuZGxlKTsKKworI2lmZGVmIF9fY3BsdXNwbHVzCit9CisjZW5kaWYKKworI2VuZGlmCmRpZmYgLS1naXQgYS9leHlub3M0L211bHRpbWVkaWEvbGlicy9saWJjc2MvaHdjb252ZXJ0ZXJfd3JhcHBlci5jcHAgYi9leHlub3M0L211bHRpbWVkaWEvbGlicy9saWJjc2MvaHdjb252ZXJ0ZXJfd3JhcHBlci5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOWY2Y2QwNwotLS0gL2Rldi9udWxsCisrKyBiL2V4eW5vczQvbXVsdGltZWRpYS9saWJzL2xpYmNzYy9od2NvbnZlcnRlcl93cmFwcGVyLmNwcApAQCAtMCwwICsxLDEzNSBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxMiBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKy8qCisgKiBAZmlsZSAgICBod2NvbnZlcnRlcl93cmFwcGVyLmNwcAorICoKKyAqIEBicmllZiAgIGh3Y29udmVydGVyX3dyYXBwZXIgYWJzdHJhY3QgbGliaHdjb252ZXJ0ZXIgYW5kIHN1cHBvcnQgYyBmdW5jdGlvbnMKKyAqCisgKiBAYXV0aG9yICBTaGluV29uIExlZSAoc2hpbndvbi5sZWVAc2Ftc3VuZy5jb20pCisgKgorICogQHZlcnNpb24gMS4wCisgKgorICogQGhpc3RvcnkKKyAqICAgMjAxMi4wMi4wMSA6IENyZWF0ZQorICovCisKKyNpbmNsdWRlIDx1dGlscy9Mb2cuaD4KKyNpbmNsdWRlIDxkbGZjbi5oPgorCisjaW5jbHVkZSAiU0VDX09NWF9EZWYuaCIKKyNpbmNsdWRlICJod2NvbnZlcnRlcl93cmFwcGVyLmgiCisjaW5jbHVkZSAiSGFyZHdhcmVDb252ZXJ0ZXIuaCIKKworI2lmZGVmIF9fY3BsdXNwbHVzCitleHRlcm4gIkMiIHsKKyNlbmRpZgorCisvKgorICogY3JlYXRlIGh3Y29udmVydGVyIGhhbmRsZQorICoKKyAqIEByZXR1cm4KKyAqICAgZmltYyBoYW5kbGUKKyAqLwordm9pZCAqY3NjX2h3Y29udmVydGVyX29wZW4oKQoreworICAgIEhhcmR3YXJlQ29udmVydGVyICpod19jb252ZXJ0ZXIgPSBOVUxMOworCisgICAgaHdfY29udmVydGVyID0gbmV3IEhhcmR3YXJlQ29udmVydGVyOworICAgIGlmIChod19jb252ZXJ0ZXItPmJIV2NvbnZlcnRfZmxhZyA9PSAwKSB7CisgICAgICAgIGRlbGV0ZSBod19jb252ZXJ0ZXI7CisgICAgICAgIGh3X2NvbnZlcnRlciA9IE5VTEw7CisgICAgICAgIExPR0UoIiVzIExJTkUgPSAlZCBIYXJkd2FyZUNvbnZlcnRlciBmYWlsZWQiLCBfX2Z1bmNfXywgX19MSU5FX18pOworICAgIH0KKworICAgIHJldHVybiAodm9pZCAqKWh3X2NvbnZlcnRlcjsKK30KKworLyoKKyAqIGRlc3Ryb3kgaHdjb252ZXJ0ZXIgaGFuZGxlCisgKgorICogQHBhcmFtIGhhbmRsZQorICogICBmaW1jIGhhbmRsZVtpbl0KKyAqCisgKiBAcmV0dXJuCisgKiAgIHBhc3Mgb3IgZmFpbAorICovCitIV0NPTlZFUlRFUl9FUlJPUl9DT0RFIGNzY19od2NvbnZlcnRlcl9jbG9zZSgKKyAgICB2b2lkICpoYW5kbGUpCit7CisgICAgSGFyZHdhcmVDb252ZXJ0ZXIgKmh3X2NvbnZlcnRlciA9IChIYXJkd2FyZUNvbnZlcnRlciAqKWhhbmRsZTsKKworICAgIGlmIChod19jb252ZXJ0ZXIgIT0gTlVMTCkKKyAgICAgICAgZGVsZXRlIGh3X2NvbnZlcnRlcjsKKworICAgIHJldHVybiBIV0NPTlZFUlRFUl9SRVRfT0s7Cit9CisKKy8qCisgKiBjb252ZXJ0IGNvbG9yIHNwYWNlIG52MTJ0IHRvIG9teGZvcm1hdAorICoKKyAqIEBwYXJhbSBoYW5kbGUKKyAqICAgaHdjb252ZXJ0ZXIgaGFuZGxlW2luXQorICoKKyAqIEBwYXJhbSBkc3RfYWRkcgorICogICB5LHUsdiBhZGRyZXNzIG9mIGRzdF9hZGRyW291dF0KKyAqCisgKiBAcGFyYW0gc3JjX2FkZHIKKyAqICAgeSx1diBhZGRyZXNzIG9mIHNyY19hZGRyLkZvcm1hdCBpcyBudjEydFtpbl0KKyAqCisgKiBAcGFyYW0gd2lkdGgKKyAqICAgd2lkdGggb2YgZHN0IGltYWdlW2luXQorICoKKyAqIEBwYXJhbSBoZWlnaHQKKyAqICAgaGVpZ2h0IG9mIGRzdCBpbWFnZVtpbl0KKyAqCisgKiBAcGFyYW0gb214Zm9ybWF0CisgKiAgIG9teGZvcm1hdCBvZiBkc3QgaW1hZ2VbaW5dCisgKgorICogQHJldHVybgorICogICBwYXNzIG9yIGZhaWwKKyAqLworSFdDT05WRVJURVJfRVJST1JfQ09ERSBjc2NfaHdjb252ZXJ0ZXJfY29udmVydF9udjEydCgKKyAgICB2b2lkICpoYW5kbGUsCisgICAgdm9pZCAqKmRzdF9hZGRyLAorICAgIHZvaWQgKipzcmNfYWRkciwKKyAgICB1bnNpZ25lZCBpbnQgd2lkdGgsCisgICAgdW5zaWduZWQgaW50IGhlaWdodCwKKyAgICBPTVhfQ09MT1JfRk9STUFUVFlQRSBvbXhmb3JtYXQpCit7CisgICAgSFdDT05WRVJURVJfRVJST1JfQ09ERSByZXQgPSBIV0NPTlZFUlRFUl9SRVRfT0s7CisgICAgSGFyZHdhcmVDb252ZXJ0ZXIgKmh3X2NvbnZlcnRlciA9IChIYXJkd2FyZUNvbnZlcnRlciAqKWhhbmRsZTsKKworICAgIGlmIChod19jb252ZXJ0ZXIgPT0gTlVMTCkgeworICAgICAgICByZXQgPSBIV0NPTlZFUlRFUl9SRVRfRkFJTDsKKyAgICAgICAgZ290byBFWElUOworICAgIH0KKworICAgIGh3X2NvbnZlcnRlci0+Y29udmVydCgKKyAgICAgICAgICAgICh2b2lkICopc3JjX2FkZHIsICh2b2lkICopZHN0X2FkZHIsCisgICAgICAgICAgICAoT01YX0NPTE9SX0ZPUk1BVFRZUEUpT01YX1NFQ19DT0xPUl9Gb3JtYXROVjEyVFBoeXNpY2FsQWRkcmVzcywKKyAgICAgICAgICAgIHdpZHRoLCBoZWlnaHQsIG9teGZvcm1hdCk7CisKKyAgICByZXQgPSBIV0NPTlZFUlRFUl9SRVRfT0s7CisKK0VYSVQ6CisKKyAgICByZXR1cm4gcmV0OworfQorCisjaWZkZWYgX19jcGx1c3BsdXMKK30KKyNlbmRpZgpkaWZmIC0tZ2l0IGEvZXh5bm9zNC9tdWx0aW1lZGlhL2xpYnMvbGliY3NjL2h3Y29udmVydGVyX3dyYXBwZXIuaCBiL2V4eW5vczQvbXVsdGltZWRpYS9saWJzL2xpYmNzYy9od2NvbnZlcnRlcl93cmFwcGVyLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjkyYTY4MAotLS0gL2Rldi9udWxsCisrKyBiL2V4eW5vczQvbXVsdGltZWRpYS9saWJzL2xpYmNzYy9od2NvbnZlcnRlcl93cmFwcGVyLmgKQEAgLTAsMCArMSwxMDcgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTIgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisvKgorICogQGZpbGUgICAgaHdjb252ZXJ0ZXJfd3JhcHBlci5oCisgKgorICogQGJyaWVmICAgaHdjb252ZXJ0ZXJfd3JhcHBlciBhYnN0cmFjdCBsaWJod2NvbnZlcnRlciBhbmQgc3VwcG9ydCBjIGZ1bmN0aW9ucworICoKKyAqIEBhdXRob3IgIFNoaW5Xb24gTGVlIChzaGlud29uLmxlZUBzYW1zdW5nLmNvbSkKKyAqCisgKiBAdmVyc2lvbiAxLjAKKyAqCisgKiBAaGlzdG9yeQorICogICAyMDEyLjAyLjAxIDogQ3JlYXRlCisgKi8KKworI2lmbmRlZiBIV0NPTlZFUlRFUl9XUkFQUEVSX0gKKworI2RlZmluZSBIV0NPTlZFUlRFUl9XUkFQUEVSX0gKKworI2lmZGVmIF9fY3BsdXNwbHVzCitleHRlcm4gIkMiIHsKKyNlbmRpZgorCisjaW5jbHVkZSA8T01YX1ZpZGVvLmg+CisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworLyogU3RydWN0dXJlIGFuZCBUeXBlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KK3R5cGVkZWYgZW51bSB7CisgICAgSFdDT05WRVJURVJfUkVUX09LICAgICAgICAgICAgICAgICA9IDAsCisgICAgSFdDT05WRVJURVJfUkVUX0ZBSUwgICAgICAgICAgICAgICA9IC0xCit9IEhXQ09OVkVSVEVSX0VSUk9SX0NPREU7CisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworLyogQ1NDIEZJTUMgQVBJcyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKy8qCisgKiBjcmVhdGUgaHdjb252ZXJ0ZXIgaGFuZGxlCisgKgorICogQHJldHVybgorICogICBod2NvbnZlcnRlciBoYW5kbGUKKyAqLwordm9pZCAqY3NjX2ZpbWNfb3BlbigpOworCisvKgorICogZGVzdHJveSBod2NvbnZlcnRlciBoYW5kbGUKKyAqCisgKiBAcGFyYW0gaGFuZGxlCisgKiAgIGh3Y29udmVydGVyIGhhbmRsZVtpbl0KKyAqCisgKiBAcmV0dXJuCisgKiAgIGVycm9yIGNvZGUKKyAqLworSFdDT05WRVJURVJfRVJST1JfQ09ERSBjc2NfZmltY19jbG9zZSgKKyAgICB2b2lkICpoYW5kbGUpOworCisvKgorICogY29udmVydCBjb2xvciBzcGFjZSBudjEydCB0byBvbXhmb3JtYXQKKyAqCisgKiBAcGFyYW0gaGFuZGxlCisgKiAgIGh3Y29udmVydGVyIGhhbmRsZVtpbl0KKyAqCisgKiBAcGFyYW0gZHN0X2FkZHIKKyAqICAgeSx1LHYgYWRkcmVzcyBvZiBkc3RfYWRkcltvdXRdCisgKgorICogQHBhcmFtIHNyY19hZGRyCisgKiAgIHksdXYgYWRkcmVzcyBvZiBzcmNfYWRkci5Gb3JtYXQgaXMgbnYxMnRbaW5dCisgKgorICogQHBhcmFtIHdpZHRoCisgKiAgIHdpZHRoIG9mIGRzdCBpbWFnZVtpbl0KKyAqCisgKiBAcGFyYW0gaGVpZ2h0CisgKiAgIGhlaWdodCBvZiBkc3QgaW1hZ2VbaW5dCisgKgorICogQHBhcmFtIG9teGZvcm1hdAorICogICBvbXhmb3JtYXQgb2YgZHN0IGltYWdlW2luXQorICoKKyAqIEByZXR1cm4KKyAqICAgZXJyb3IgY29kZQorICovCitIV0NPTlZFUlRFUl9FUlJPUl9DT0RFIGNzY19maW1jX2NvbnZlcnRfbnYxMnQoCisgICAgdm9pZCAqaGFuZGxlLAorICAgIHZvaWQgKipkc3RfYWRkciwKKyAgICB2b2lkICoqc3JjX2FkZHIsCisgICAgdW5zaWduZWQgaW50IHdpZHRoLAorICAgIHVuc2lnbmVkIGludCBoZWlnaHQsCisgICAgT01YX0NPTE9SX0ZPUk1BVFRZUEUgb214Zm9ybWF0KTsKKworI2lmZGVmIF9fY3BsdXNwbHVzCit9CisjZW5kaWYKKworI2VuZGlmCmRpZmYgLS1naXQgYS9leHlub3M0L211bHRpbWVkaWEvbGlic3RhZ2VmcmlnaHRody9BbmRyb2lkLm1rIGIvZXh5bm9zNC9tdWx0aW1lZGlhL2xpYnN0YWdlZnJpZ2h0aHcvQW5kcm9pZC5tawpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jZTdhNWU3Ci0tLSAvZGV2L251bGwKKysrIGIvZXh5bm9zNC9tdWx0aW1lZGlhL2xpYnN0YWdlZnJpZ2h0aHcvQW5kcm9pZC5tawpAQCAtMCwwICsxLDIzIEBACitMT0NBTF9QQVRIIDo9ICQoY2FsbCBteS1kaXIpCitpbmNsdWRlICQoQ0xFQVJfVkFSUykKKworTE9DQUxfU1JDX0ZJTEVTIDo9IFwKKyAgICBTRUNfT01YX1BsdWdpbi5jcHAKKworTE9DQUxfQ0ZMQUdTICs9ICQoUFZfQ0ZMQUdTX01JTlVTX1ZJU0lCSUxJVFkpCisKK0xPQ0FMX0NfSU5DTFVERVM6PSBcCisgICAgICAkKFRPUCkvZnJhbWV3b3Jrcy9iYXNlL2luY2x1ZGUvbWVkaWEvc3RhZ2VmcmlnaHQvb3Blbm1heCBcCisKK0xPQ0FMX1NIQVJFRF9MSUJSQVJJRVMgOj0gICAgXAorICAgICAgICBsaWJiaW5kZXIgICAgICAgICAgICBcCisgICAgICAgIGxpYnV0aWxzICAgICAgICAgICAgIFwKKyAgICAgICAgbGliY3V0aWxzICAgICAgICAgICAgXAorICAgICAgICBsaWJ1aSAgICAgICAgICAgICAgICBcCisgICAgICAgIGxpYmRsICAgICAgICAgICAgICAgIFwKKyAgICAgICAgbGlic3VyZmFjZWZsaW5nZXJfY2xpZW50CisKK0xPQ0FMX01PRFVMRSA6PSBsaWJzdGFnZWZyaWdodGh3CisKK0xPQ0FMX01PRFVMRV9UQUdTIDo9IG9wdGlvbmFsCitpbmNsdWRlICQoQlVJTERfU0hBUkVEX0xJQlJBUlkpCmRpZmYgLS1naXQgYS9leHlub3M0L211bHRpbWVkaWEvbGlic3RhZ2VmcmlnaHRody9TRUNfT01YX1BsdWdpbi5jcHAgYi9leHlub3M0L211bHRpbWVkaWEvbGlic3RhZ2VmcmlnaHRody9TRUNfT01YX1BsdWdpbi5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZWZjODY5MQotLS0gL2Rldi9udWxsCisrKyBiL2V4eW5vczQvbXVsdGltZWRpYS9saWJzdGFnZWZyaWdodGh3L1NFQ19PTVhfUGx1Z2luLmNwcApAQCAtMCwwICsxLDE0NyBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpbmNsdWRlICJTRUNfT01YX1BsdWdpbi5oIgorCisjaW5jbHVkZSA8ZGxmY24uaD4KKworI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L0hhcmR3YXJlQVBJLmg+CisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvTWVkaWFEZWJ1Zy5oPgorCituYW1lc3BhY2UgYW5kcm9pZCB7CisKK09NWFBsdWdpbkJhc2UgKmNyZWF0ZU9NWFBsdWdpbigpIHsKKyAgICByZXR1cm4gbmV3IFNFQ09NWFBsdWdpbjsKK30KKworU0VDT01YUGx1Z2luOjpTRUNPTVhQbHVnaW4oKQorICAgIDogbUxpYkhhbmRsZShkbG9wZW4oImxpYlNFQ19PTVhfQ29yZS5zbyIsIFJUTERfTk9XKSksCisgICAgICBtSW5pdChOVUxMKSwKKyAgICAgIG1EZWluaXQoTlVMTCksCisgICAgICBtQ29tcG9uZW50TmFtZUVudW0oTlVMTCksCisgICAgICBtR2V0SGFuZGxlKE5VTEwpLAorICAgICAgbUZyZWVIYW5kbGUoTlVMTCksCisgICAgICBtR2V0Um9sZXNPZkNvbXBvbmVudEhhbmRsZShOVUxMKSB7CisgICAgaWYgKG1MaWJIYW5kbGUgIT0gTlVMTCkgeworICAgICAgICBtSW5pdCA9IChJbml0RnVuYylkbHN5bShtTGliSGFuZGxlLCAiU0VDX09NWF9Jbml0Iik7CisgICAgICAgIG1EZWluaXQgPSAoRGVpbml0RnVuYylkbHN5bShtTGliSGFuZGxlLCAiU0VDX09NWF9EZWluaXQiKTsKKworICAgICAgICBtQ29tcG9uZW50TmFtZUVudW0gPQorICAgICAgICAgICAgKENvbXBvbmVudE5hbWVFbnVtRnVuYylkbHN5bShtTGliSGFuZGxlLCAiU0VDX09NWF9Db21wb25lbnROYW1lRW51bSIpOworCisgICAgICAgIG1HZXRIYW5kbGUgPSAoR2V0SGFuZGxlRnVuYylkbHN5bShtTGliSGFuZGxlLCAiU0VDX09NWF9HZXRIYW5kbGUiKTsKKyAgICAgICAgbUZyZWVIYW5kbGUgPSAoRnJlZUhhbmRsZUZ1bmMpZGxzeW0obUxpYkhhbmRsZSwgIlNFQ19PTVhfRnJlZUhhbmRsZSIpOworCisgICAgICAgIG1HZXRSb2xlc09mQ29tcG9uZW50SGFuZGxlID0KKyAgICAgICAgICAgIChHZXRSb2xlc09mQ29tcG9uZW50RnVuYylkbHN5bSgKKyAgICAgICAgICAgICAgICAgICAgbUxpYkhhbmRsZSwgIlNFQ19PTVhfR2V0Um9sZXNPZkNvbXBvbmVudCIpOworCisgICAgICAgICgqbUluaXQpKCk7CisKKyAgICB9Cit9CisKK1NFQ09NWFBsdWdpbjo6flNFQ09NWFBsdWdpbigpIHsKKyAgICBpZiAobUxpYkhhbmRsZSAhPSBOVUxMKSB7CisgICAgICAgICgqbURlaW5pdCkoKTsKKworICAgICAgICBkbGNsb3NlKG1MaWJIYW5kbGUpOworICAgICAgICBtTGliSGFuZGxlID0gTlVMTDsKKyAgICB9Cit9CisKK09NWF9FUlJPUlRZUEUgU0VDT01YUGx1Z2luOjptYWtlQ29tcG9uZW50SW5zdGFuY2UoCisgICAgICAgIGNvbnN0IGNoYXIgKm5hbWUsCisgICAgICAgIGNvbnN0IE9NWF9DQUxMQkFDS1RZUEUgKmNhbGxiYWNrcywKKyAgICAgICAgT01YX1BUUiBhcHBEYXRhLAorICAgICAgICBPTVhfQ09NUE9ORU5UVFlQRSAqKmNvbXBvbmVudCkgeworICAgIGlmIChtTGliSGFuZGxlID09IE5VTEwpIHsKKyAgICAgICAgcmV0dXJuIE9NWF9FcnJvclVuZGVmaW5lZDsKKyAgICB9CisKKyAgICByZXR1cm4gKCptR2V0SGFuZGxlKSgKKyAgICAgICAgICAgIHJlaW50ZXJwcmV0X2Nhc3Q8T01YX0hBTkRMRVRZUEUgKj4oY29tcG9uZW50KSwKKyAgICAgICAgICAgIGNvbnN0X2Nhc3Q8Y2hhciAqPihuYW1lKSwKKyAgICAgICAgICAgIGFwcERhdGEsIGNvbnN0X2Nhc3Q8T01YX0NBTExCQUNLVFlQRSAqPihjYWxsYmFja3MpKTsKK30KKworT01YX0VSUk9SVFlQRSBTRUNPTVhQbHVnaW46OmRlc3Ryb3lDb21wb25lbnRJbnN0YW5jZSgKKyAgICAgICAgT01YX0NPTVBPTkVOVFRZUEUgKmNvbXBvbmVudCkgeworICAgIGlmIChtTGliSGFuZGxlID09IE5VTEwpIHsKKyAgICAgICAgcmV0dXJuIE9NWF9FcnJvclVuZGVmaW5lZDsKKyAgICB9CisKKyAgICByZXR1cm4gKCptRnJlZUhhbmRsZSkocmVpbnRlcnByZXRfY2FzdDxPTVhfSEFORExFVFlQRSAqPihjb21wb25lbnQpKTsKK30KKworT01YX0VSUk9SVFlQRSBTRUNPTVhQbHVnaW46OmVudW1lcmF0ZUNvbXBvbmVudHMoCisgICAgICAgIE9NWF9TVFJJTkcgbmFtZSwKKyAgICAgICAgc2l6ZV90IHNpemUsCisgICAgICAgIE9NWF9VMzIgaW5kZXgpIHsKKyAgICBpZiAobUxpYkhhbmRsZSA9PSBOVUxMKSB7CisgICAgICAgIHJldHVybiBPTVhfRXJyb3JVbmRlZmluZWQ7CisgICAgfQorCisgICAgcmV0dXJuICgqbUNvbXBvbmVudE5hbWVFbnVtKShuYW1lLCBzaXplLCBpbmRleCk7Cit9CisKK09NWF9FUlJPUlRZUEUgU0VDT01YUGx1Z2luOjpnZXRSb2xlc09mQ29tcG9uZW50KAorICAgICAgICBjb25zdCBjaGFyICpuYW1lLAorICAgICAgICBWZWN0b3I8U3RyaW5nOD4gKnJvbGVzKSB7CisgICAgcm9sZXMtPmNsZWFyKCk7CisKKyAgICBpZiAobUxpYkhhbmRsZSA9PSBOVUxMKSB7CisgICAgICAgIHJldHVybiBPTVhfRXJyb3JVbmRlZmluZWQ7CisgICAgfQorCisgICAgT01YX1UzMiBudW1Sb2xlczsKKyAgICBPTVhfRVJST1JUWVBFIGVyciA9ICgqbUdldFJvbGVzT2ZDb21wb25lbnRIYW5kbGUpKAorICAgICAgICAgICAgY29uc3RfY2FzdDxPTVhfU1RSSU5HPihuYW1lKSwgJm51bVJvbGVzLCBOVUxMKTsKKworICAgIGlmIChlcnIgIT0gT01YX0Vycm9yTm9uZSkgeworICAgICAgICByZXR1cm4gZXJyOworICAgIH0KKworICAgIGlmIChudW1Sb2xlcyA+IDApIHsKKyAgICAgICAgT01YX1U4ICoqYXJyYXkgPSBuZXcgT01YX1U4ICpbbnVtUm9sZXNdOworICAgICAgICBmb3IgKE9NWF9VMzIgaSA9IDA7IGkgPCBudW1Sb2xlczsgKytpKSB7CisgICAgICAgICAgICBhcnJheVtpXSA9IG5ldyBPTVhfVThbT01YX01BWF9TVFJJTkdOQU1FX1NJWkVdOworICAgICAgICB9CisKKyAgICAgICAgT01YX1UzMiBudW1Sb2xlczI7CisgICAgICAgIGVyciA9ICgqbUdldFJvbGVzT2ZDb21wb25lbnRIYW5kbGUpKAorICAgICAgICAgICAgICAgIGNvbnN0X2Nhc3Q8T01YX1NUUklORz4obmFtZSksICZudW1Sb2xlczIsIGFycmF5KTsKKworICAgICAgICBDSEVDS19FUShlcnIsIE9NWF9FcnJvck5vbmUpOworICAgICAgICBDSEVDS19FUShudW1Sb2xlcywgbnVtUm9sZXMyKTsKKworICAgICAgICBmb3IgKE9NWF9VMzIgaSA9IDA7IGkgPCBudW1Sb2xlczsgKytpKSB7CisgICAgICAgICAgICBTdHJpbmc4IHMoKGNvbnN0IGNoYXIgKilhcnJheVtpXSk7CisgICAgICAgICAgICByb2xlcy0+cHVzaChzKTsKKworICAgICAgICAgICAgZGVsZXRlW10gYXJyYXlbaV07CisgICAgICAgICAgICBhcnJheVtpXSA9IE5VTEw7CisgICAgICAgIH0KKworICAgICAgICBkZWxldGVbXSBhcnJheTsKKyAgICAgICAgYXJyYXkgPSBOVUxMOworICAgIH0KKworICAgIHJldHVybiBPTVhfRXJyb3JOb25lOworfQorCit9ICAvLyBuYW1lc3BhY2UgYW5kcm9pZAorCmRpZmYgLS1naXQgYS9leHlub3M0L211bHRpbWVkaWEvbGlic3RhZ2VmcmlnaHRody9TRUNfT01YX1BsdWdpbi5oIGIvZXh5bm9zNC9tdWx0aW1lZGlhL2xpYnN0YWdlZnJpZ2h0aHcvU0VDX09NWF9QbHVnaW4uaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42ZGYyZDMxCi0tLSAvZGV2L251bGwKKysrIGIvZXh5bm9zNC9tdWx0aW1lZGlhL2xpYnN0YWdlZnJpZ2h0aHcvU0VDX09NWF9QbHVnaW4uaApAQCAtMCwwICsxLDc2IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDEwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2lmbmRlZiBTRUNfT01YX1BMVUdJTgorCisjZGVmaW5lIFNFQ19PTVhfUExVR0lOCisKKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9PTVhQbHVnaW5CYXNlLmg+CisKK25hbWVzcGFjZSBhbmRyb2lkIHsKKworc3RydWN0IFNFQ09NWFBsdWdpbiA6IHB1YmxpYyBPTVhQbHVnaW5CYXNlIHsKKyAgICBTRUNPTVhQbHVnaW4oKTsKKyAgICB2aXJ0dWFsIH5TRUNPTVhQbHVnaW4oKTsKKworICAgIHZpcnR1YWwgT01YX0VSUk9SVFlQRSBtYWtlQ29tcG9uZW50SW5zdGFuY2UoCisgICAgICAgICAgICBjb25zdCBjaGFyICpuYW1lLAorICAgICAgICAgICAgY29uc3QgT01YX0NBTExCQUNLVFlQRSAqY2FsbGJhY2tzLAorICAgICAgICAgICAgT01YX1BUUiBhcHBEYXRhLAorICAgICAgICAgICAgT01YX0NPTVBPTkVOVFRZUEUgKipjb21wb25lbnQpOworCisgICAgdmlydHVhbCBPTVhfRVJST1JUWVBFIGRlc3Ryb3lDb21wb25lbnRJbnN0YW5jZSgKKyAgICAgICAgICAgIE9NWF9DT01QT05FTlRUWVBFICpjb21wb25lbnQpOworCisgICAgdmlydHVhbCBPTVhfRVJST1JUWVBFIGVudW1lcmF0ZUNvbXBvbmVudHMoCisgICAgICAgICAgICBPTVhfU1RSSU5HIG5hbWUsCisgICAgICAgICAgICBzaXplX3Qgc2l6ZSwKKyAgICAgICAgICAgIE9NWF9VMzIgaW5kZXgpOworCisgICAgdmlydHVhbCBPTVhfRVJST1JUWVBFIGdldFJvbGVzT2ZDb21wb25lbnQoCisgICAgICAgICAgICBjb25zdCBjaGFyICpuYW1lLAorICAgICAgICAgICAgVmVjdG9yPFN0cmluZzg+ICpyb2xlcyk7CisKK3ByaXZhdGU6CisgICAgdm9pZCAqbUxpYkhhbmRsZTsKKworICAgIHR5cGVkZWYgT01YX0VSUk9SVFlQRSAoKkluaXRGdW5jKSgpOworICAgIHR5cGVkZWYgT01YX0VSUk9SVFlQRSAoKkRlaW5pdEZ1bmMpKCk7CisgICAgdHlwZWRlZiBPTVhfRVJST1JUWVBFICgqQ29tcG9uZW50TmFtZUVudW1GdW5jKSgKKyAgICAgICAgICAgIE9NWF9TVFJJTkcsIE9NWF9VMzIsIE9NWF9VMzIpOworCisgICAgdHlwZWRlZiBPTVhfRVJST1JUWVBFICgqR2V0SGFuZGxlRnVuYykoCisgICAgICAgICAgICBPTVhfSEFORExFVFlQRSAqLCBPTVhfU1RSSU5HLCBPTVhfUFRSLCBPTVhfQ0FMTEJBQ0tUWVBFICopOworCisgICAgdHlwZWRlZiBPTVhfRVJST1JUWVBFICgqRnJlZUhhbmRsZUZ1bmMpKE9NWF9IQU5ETEVUWVBFICopOworCisgICAgdHlwZWRlZiBPTVhfRVJST1JUWVBFICgqR2V0Um9sZXNPZkNvbXBvbmVudEZ1bmMpKAorICAgICAgICAgICAgT01YX1NUUklORywgT01YX1UzMiAqLCBPTVhfVTggKiopOworCisgICAgSW5pdEZ1bmMgbUluaXQ7CisgICAgRGVpbml0RnVuYyBtRGVpbml0OworICAgIENvbXBvbmVudE5hbWVFbnVtRnVuYyBtQ29tcG9uZW50TmFtZUVudW07CisgICAgR2V0SGFuZGxlRnVuYyBtR2V0SGFuZGxlOworICAgIEZyZWVIYW5kbGVGdW5jIG1GcmVlSGFuZGxlOworICAgIEdldFJvbGVzT2ZDb21wb25lbnRGdW5jIG1HZXRSb2xlc09mQ29tcG9uZW50SGFuZGxlOworCisgICAgU0VDT01YUGx1Z2luKGNvbnN0IFNFQ09NWFBsdWdpbiAmKTsKKyAgICBTRUNPTVhQbHVnaW4gJm9wZXJhdG9yPShjb25zdCBTRUNPTVhQbHVnaW4gJik7Cit9OworCit9ICAvLyBuYW1lc3BhY2UgYW5kcm9pZAorCisjZW5kaWYgIC8vIFNFQ19PTVhfUExVR0lOCmRpZmYgLS1naXQgYS9leHlub3M0L211bHRpbWVkaWEvb3Blbm1heC9BbmRyb2lkLm1rIGIvZXh5bm9zNC9tdWx0aW1lZGlhL29wZW5tYXgvQW5kcm9pZC5tawpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42NTcxMTYxCi0tLSAvZGV2L251bGwKKysrIGIvZXh5bm9zNC9tdWx0aW1lZGlhL29wZW5tYXgvQW5kcm9pZC5tawpAQCAtMCwwICsxIEBACitpbmNsdWRlICQoYWxsLXN1YmRpci1tYWtlZmlsZXMpCmRpZmYgLS1naXQgYS9leHlub3M0L211bHRpbWVkaWEvb3Blbm1heC9zZWNfb214L0FuZHJvaWQubWsgYi9leHlub3M0L211bHRpbWVkaWEvb3Blbm1heC9zZWNfb214L0FuZHJvaWQubWsKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTE1ZjcwZAotLS0gL2Rldi9udWxsCisrKyBiL2V4eW5vczQvbXVsdGltZWRpYS9vcGVubWF4L3NlY19vbXgvQW5kcm9pZC5tawpAQCAtMCwwICsxLDMyIEBACitMT0NBTF9QQVRIIDo9ICQoY2FsbCBteS1kaXIpCitCT0FSRF9VU0VfQU5CIDo9IHRydWUKKworaW5jbHVkZSAkKENMRUFSX1ZBUlMpCisKK1NFQ19PTVhfVE9QIDo9ICQoTE9DQUxfUEFUSCkKKworU0VDX0NPUFlfSEVBREVSU19UTyA6PSBsaWJzZWNtbQorCitTRUNfT01YX0lOQyA6PSAkKFNFQ19PTVhfVE9QKS9pbmNsdWRlLworU0VDX09NWF9DT01QT05FTlQgOj0gJChTRUNfT01YX1RPUCkvY29tcG9uZW50CisKK2luY2x1ZGUgJChTRUNfT01YX1RPUCkvb3NhbC9BbmRyb2lkLm1rCitpbmNsdWRlICQoU0VDX09NWF9UT1ApL2NvcmUvQW5kcm9pZC5taworCitpbmNsdWRlICQoU0VDX09NWF9DT01QT05FTlQpL2NvbW1vbi9BbmRyb2lkLm1rCitpbmNsdWRlICQoU0VDX09NWF9DT01QT05FTlQpL3ZpZGVvL2RlYy9BbmRyb2lkLm1rCitpbmNsdWRlICQoU0VDX09NWF9DT01QT05FTlQpL3ZpZGVvL2RlYy9oMjY0L0FuZHJvaWQubWsKK2luY2x1ZGUgJChTRUNfT01YX0NPTVBPTkVOVCkvdmlkZW8vZGVjL21wZWc0L0FuZHJvaWQubWsKK2luY2x1ZGUgJChTRUNfT01YX0NPTVBPTkVOVCkvdmlkZW8vZGVjL3ZjMS9BbmRyb2lkLm1rCitpbmNsdWRlICQoU0VDX09NWF9DT01QT05FTlQpL3ZpZGVvL2VuYy9BbmRyb2lkLm1rCitpbmNsdWRlICQoU0VDX09NWF9DT01QT05FTlQpL3ZpZGVvL2VuYy9oMjY0L0FuZHJvaWQubWsKK2luY2x1ZGUgJChTRUNfT01YX0NPTVBPTkVOVCkvdmlkZW8vZW5jL21wZWc0L0FuZHJvaWQubWsKKworaWZlcSAoJChmaWx0ZXItb3V0IGV4eW5vczUsJChUQVJHRVRfQk9BUkRfUExBVEZPUk0pKSwpCitpbmNsdWRlICQoU0VDX09NWF9DT01QT05FTlQpL3ZpZGVvL2RlYy92cDgvQW5kcm9pZC5taworZW5kaWYKKworaWZlcSAoJChCT0FSRF9VU0VfQUxQX0FVRElPKSwgdHJ1ZSkKK2luY2x1ZGUgJChTRUNfT01YX0NPTVBPTkVOVCkvYXVkaW8vZGVjL0FuZHJvaWQubWsKK2luY2x1ZGUgJChTRUNfT01YX0NPTVBPTkVOVCkvYXVkaW8vZGVjL21wMy9BbmRyb2lkLm1rCitlbmRpZgpkaWZmIC0tZ2l0IGEvZXh5bm9zNC9tdWx0aW1lZGlhL29wZW5tYXgvc2VjX29teC9jb21wb25lbnQvYXVkaW8vZGVjL0FuZHJvaWQubWsgYi9leHlub3M0L211bHRpbWVkaWEvb3Blbm1heC9zZWNfb214L2NvbXBvbmVudC9hdWRpby9kZWMvQW5kcm9pZC5tawpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zMDM3MzdiCi0tLSAvZGV2L251bGwKKysrIGIvZXh5bm9zNC9tdWx0aW1lZGlhL29wZW5tYXgvc2VjX29teC9jb21wb25lbnQvYXVkaW8vZGVjL0FuZHJvaWQubWsKQEAgLTAsMCArMSwxOSBAQAorTE9DQUxfUEFUSCA6PSAkKGNhbGwgbXktZGlyKQoraW5jbHVkZSAkKENMRUFSX1ZBUlMpCisKK0xPQ0FMX1NSQ19GSUxFUyA6PSBcCisJU0VDX09NWF9BZGVjLmMKKworTE9DQUxfTU9EVUxFIDo9IGxpYlNFQ19PTVhfQWRlYworTE9DQUxfQVJNX01PREUgOj0gYXJtCitMT0NBTF9NT0RVTEVfVEFHUyA6PSBvcHRpb25hbAorCitMT0NBTF9DX0lOQ0xVREVTIDo9ICQoU0VDX09NWF9JTkMpL2tocm9ub3MgXAorCSQoU0VDX09NWF9JTkMpL3NlYyBcCisJJChTRUNfT01YX1RPUCkvb3NhbCBcCisJJChTRUNfT01YX1RPUCkvY29yZSBcCisJJChTRUNfT01YX0NPTVBPTkVOVCkvY29tbW9uIFwKKwkkKFNFQ19PTVhfQ09NUE9ORU5UKS9hdWRpby9kZWMgXAorCSQoVEFSR0VUX09VVF9IRUFERVJTKS8kKFNFQ19DT1BZX0hFQURFUlNfVE8pCisKK2luY2x1ZGUgJChCVUlMRF9TVEFUSUNfTElCUkFSWSkKZGlmZiAtLWdpdCBhL2V4eW5vczQvbXVsdGltZWRpYS9vcGVubWF4L3NlY19vbXgvY29tcG9uZW50L2F1ZGlvL2RlYy9TRUNfT01YX0FkZWMuYyBiL2V4eW5vczQvbXVsdGltZWRpYS9vcGVubWF4L3NlY19vbXgvY29tcG9uZW50L2F1ZGlvL2RlYy9TRUNfT01YX0FkZWMuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kYWI3MjQ3Ci0tLSAvZGV2L251bGwKKysrIGIvZXh5bm9zNC9tdWx0aW1lZGlhL29wZW5tYXgvc2VjX29teC9jb21wb25lbnQvYXVkaW8vZGVjL1NFQ19PTVhfQWRlYy5jCkBAIC0wLDAgKzEsMTM3NiBAQAorLyoKKyAqCisgKiBDb3B5cmlnaHQgMjAxMCBTYW1zdW5nIEVsZWN0cm9uaWNzIFMuTFNJIENvLiBMVEQKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworLyoKKyAqIEBmaWxlICAgICAgICBTRUNfT01YX0FkZWMuYworICogQGJyaWVmCisgKiBAYXV0aG9yICAgICAgWXVuamkgS2ltICh5dW5qaS5raW1Ac2Ftc3VuZy5jb20pCisgKgorICogQHZlcnNpb24gICAgIDEuMS4wCisgKiBAaGlzdG9yeQorICogICAyMDExLjEwLjE4IDogQ3JlYXRlCisgKi8KKworI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8c3RkbGliLmg+CisjaW5jbHVkZSA8c3RyaW5nLmg+CisjaW5jbHVkZSAiU0VDX09NWF9NYWNyb3MuaCIKKyNpbmNsdWRlICJTRUNfT1NBTF9FdmVudC5oIgorI2luY2x1ZGUgIlNFQ19PTVhfQWRlYy5oIgorI2luY2x1ZGUgIlNFQ19PTVhfQmFzZWNvbXBvbmVudC5oIgorI2luY2x1ZGUgIlNFQ19PU0FMX1RocmVhZC5oIgorI2luY2x1ZGUgIlNFQ19PU0FMX1NlbWFwaG9yZS5oIgorI2luY2x1ZGUgIlNFQ19PU0FMX011dGV4LmgiCisjaW5jbHVkZSAiU0VDX09TQUxfRVRDLmgiCisjaW5jbHVkZSAic3JwX2FwaS5oIgorCisjdW5kZWYgIFNFQ19MT0dfVEFHCisjZGVmaW5lIFNFQ19MT0dfVEFHICAgICJTRUNfQVVESU9fREVDIgorI2RlZmluZSBTRUNfTE9HX09GRgorI2luY2x1ZGUgIlNFQ19PU0FMX0xvZy5oIgorCitPTVhfRVJST1JUWVBFIFNFQ19PTVhfVXNlQnVmZmVyKAorICAgIE9NWF9JTiBPTVhfSEFORExFVFlQRSAgICAgICAgICAgIGhDb21wb25lbnQsCisgICAgT01YX0lOT1VUIE9NWF9CVUZGRVJIRUFERVJUWVBFICoqcHBCdWZmZXJIZHIsCisgICAgT01YX0lOIE9NWF9VMzIgICAgICAgICAgICAgICAgICAgblBvcnRJbmRleCwKKyAgICBPTVhfSU4gT01YX1BUUiAgICAgICAgICAgICAgICAgICBwQXBwUHJpdmF0ZSwKKyAgICBPTVhfSU4gT01YX1UzMiAgICAgICAgICAgICAgICAgICBuU2l6ZUJ5dGVzLAorICAgIE9NWF9JTiBPTVhfVTggICAgICAgICAgICAgICAgICAgKnBCdWZmZXIpCit7CisgICAgT01YX0VSUk9SVFlQRSAgICAgICAgICByZXQgPSBPTVhfRXJyb3JOb25lOworICAgIE9NWF9DT01QT05FTlRUWVBFICAgICAqcE9NWENvbXBvbmVudCA9IE5VTEw7CisgICAgU0VDX09NWF9CQVNFQ09NUE9ORU5UICpwU0VDQ29tcG9uZW50ID0gTlVMTDsKKyAgICBTRUNfT01YX0JBU0VQT1JUICAgICAgKnBTRUNQb3J0ID0gTlVMTDsKKyAgICBPTVhfQlVGRkVSSEVBREVSVFlQRSAgKnRlbXBfYnVmZmVySGVhZGVyID0gTlVMTDsKKyAgICBPTVhfVTMyICAgICAgICAgICAgICAgIGkgPSAwOworCisgICAgRnVuY3Rpb25JbigpOworCisgICAgaWYgKGhDb21wb25lbnQgPT0gTlVMTCkgeworICAgICAgICByZXQgPSBPTVhfRXJyb3JCYWRQYXJhbWV0ZXI7CisgICAgICAgIGdvdG8gRVhJVDsKKyAgICB9CisgICAgcE9NWENvbXBvbmVudCA9IChPTVhfQ09NUE9ORU5UVFlQRSAqKWhDb21wb25lbnQ7CisgICAgcmV0ID0gU0VDX09NWF9DaGVja19TaXplVmVyc2lvbihwT01YQ29tcG9uZW50LCBzaXplb2YoT01YX0NPTVBPTkVOVFRZUEUpKTsKKyAgICBpZiAocmV0ICE9IE9NWF9FcnJvck5vbmUpIHsKKyAgICAgICAgZ290byBFWElUOworICAgIH0KKworICAgIGlmIChwT01YQ29tcG9uZW50LT5wQ29tcG9uZW50UHJpdmF0ZSA9PSBOVUxMKSB7CisgICAgICAgIHJldCA9IE9NWF9FcnJvckJhZFBhcmFtZXRlcjsKKyAgICAgICAgZ290byBFWElUOworICAgIH0KKyAgICBwU0VDQ29tcG9uZW50ID0gKFNFQ19PTVhfQkFTRUNPTVBPTkVOVCAqKXBPTVhDb21wb25lbnQtPnBDb21wb25lbnRQcml2YXRlOworCisgICAgcFNFQ1BvcnQgPSAmcFNFQ0NvbXBvbmVudC0+cFNFQ1BvcnRbblBvcnRJbmRleF07CisgICAgaWYgKG5Qb3J0SW5kZXggPj0gcFNFQ0NvbXBvbmVudC0+cG9ydFBhcmFtLm5Qb3J0cykgeworICAgICAgICByZXQgPSBPTVhfRXJyb3JCYWRQb3J0SW5kZXg7CisgICAgICAgIGdvdG8gRVhJVDsKKyAgICB9CisgICAgaWYgKHBTRUNQb3J0LT5wb3J0U3RhdGUgIT0gT01YX1N0YXRlSWRsZSkgeworICAgICAgICByZXQgPSBPTVhfRXJyb3JJbmNvcnJlY3RTdGF0ZU9wZXJhdGlvbjsKKyAgICAgICAgZ290byBFWElUOworICAgIH0KKworICAgIGlmIChDSEVDS19QT1JUX1RVTk5FTEVEKHBTRUNQb3J0KSAmJiBDSEVDS19QT1JUX0JVRkZFUl9TVVBQTElFUihwU0VDUG9ydCkpIHsKKyAgICAgICAgcmV0ID0gT01YX0Vycm9yQmFkUG9ydEluZGV4OworICAgICAgICBnb3RvIEVYSVQ7CisgICAgfQorCisgICAgdGVtcF9idWZmZXJIZWFkZXIgPSAoT01YX0JVRkZFUkhFQURFUlRZUEUgKilTRUNfT1NBTF9NYWxsb2Moc2l6ZW9mKE9NWF9CVUZGRVJIRUFERVJUWVBFKSk7CisgICAgaWYgKHRlbXBfYnVmZmVySGVhZGVyID09IE5VTEwpIHsKKyAgICAgICAgcmV0ID0gT01YX0Vycm9ySW5zdWZmaWNpZW50UmVzb3VyY2VzOworICAgICAgICBnb3RvIEVYSVQ7CisgICAgfQorICAgIFNFQ19PU0FMX01lbXNldCh0ZW1wX2J1ZmZlckhlYWRlciwgMCwgc2l6ZW9mKE9NWF9CVUZGRVJIRUFERVJUWVBFKSk7CisKKyAgICBmb3IgKGkgPSAwOyBpIDwgcFNFQ1BvcnQtPnBvcnREZWZpbml0aW9uLm5CdWZmZXJDb3VudEFjdHVhbDsgaSsrKSB7CisgICAgICAgIGlmIChwU0VDUG9ydC0+YnVmZmVyU3RhdGVBbGxvY2F0ZVtpXSA9PSBCVUZGRVJfU1RBVEVfRlJFRSkgeworICAgICAgICAgICAgcFNFQ1BvcnQtPmJ1ZmZlckhlYWRlcltpXSA9IHRlbXBfYnVmZmVySGVhZGVyOworICAgICAgICAgICAgcFNFQ1BvcnQtPmJ1ZmZlclN0YXRlQWxsb2NhdGVbaV0gPSAoQlVGRkVSX1NUQVRFX0FTU0lHTkVEIHwgSEVBREVSX1NUQVRFX0FMTE9DQVRFRCk7CisgICAgICAgICAgICBJTklUX1NFVF9TSVpFX1ZFUlNJT04odGVtcF9idWZmZXJIZWFkZXIsIE9NWF9CVUZGRVJIRUFERVJUWVBFKTsKKyAgICAgICAgICAgIHRlbXBfYnVmZmVySGVhZGVyLT5wQnVmZmVyICAgICAgICA9IHBCdWZmZXI7CisgICAgICAgICAgICB0ZW1wX2J1ZmZlckhlYWRlci0+bkFsbG9jTGVuICAgICAgPSBuU2l6ZUJ5dGVzOworICAgICAgICAgICAgdGVtcF9idWZmZXJIZWFkZXItPnBBcHBQcml2YXRlICAgID0gcEFwcFByaXZhdGU7CisgICAgICAgICAgICBpZiAoblBvcnRJbmRleCA9PSBJTlBVVF9QT1JUX0lOREVYKQorICAgICAgICAgICAgICAgIHRlbXBfYnVmZmVySGVhZGVyLT5uSW5wdXRQb3J0SW5kZXggPSBJTlBVVF9QT1JUX0lOREVYOworICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgIHRlbXBfYnVmZmVySGVhZGVyLT5uT3V0cHV0UG9ydEluZGV4ID0gT1VUUFVUX1BPUlRfSU5ERVg7CisKKyAgICAgICAgICAgIHBTRUNQb3J0LT5hc3NpZ25lZEJ1ZmZlck51bSsrOworICAgICAgICAgICAgaWYgKHBTRUNQb3J0LT5hc3NpZ25lZEJ1ZmZlck51bSA9PSBwU0VDUG9ydC0+cG9ydERlZmluaXRpb24ubkJ1ZmZlckNvdW50QWN0dWFsKSB7CisgICAgICAgICAgICAgICAgcFNFQ1BvcnQtPnBvcnREZWZpbml0aW9uLmJQb3B1bGF0ZWQgPSBPTVhfVFJVRTsKKyAgICAgICAgICAgICAgICAvKiBTRUNfT1NBTF9NdXRleExvY2socFNFQ0NvbXBvbmVudC0+Y29tcE11dGV4KTsgKi8KKyAgICAgICAgICAgICAgICBTRUNfT1NBTF9TZW1hcGhvcmVQb3N0KHBTRUNQb3J0LT5sb2FkZWRSZXNvdXJjZSk7CisgICAgICAgICAgICAgICAgLyogU0VDX09TQUxfTXV0ZXhVbmxvY2socFNFQ0NvbXBvbmVudC0+Y29tcE11dGV4KTsgKi8KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgICpwcEJ1ZmZlckhkciA9IHRlbXBfYnVmZmVySGVhZGVyOworICAgICAgICAgICAgcmV0ID0gT01YX0Vycm9yTm9uZTsKKyAgICAgICAgICAgIGdvdG8gRVhJVDsKKyAgICAgICAgfQorICAgIH0KKworICAgIFNFQ19PU0FMX0ZyZWUodGVtcF9idWZmZXJIZWFkZXIpOworICAgIHJldCA9IE9NWF9FcnJvckluc3VmZmljaWVudFJlc291cmNlczsKKworRVhJVDoKKyAgICBGdW5jdGlvbk91dCgpOworCisgICAgcmV0dXJuIHJldDsKK30KKworT01YX0VSUk9SVFlQRSBTRUNfT01YX0FsbG9jYXRlQnVmZmVyKAorICAgIE9NWF9JTiBPTVhfSEFORExFVFlQRSAgICAgICAgICAgIGhDb21wb25lbnQsCisgICAgT01YX0lOT1VUIE9NWF9CVUZGRVJIRUFERVJUWVBFICoqcHBCdWZmZXIsCisgICAgT01YX0lOIE9NWF9VMzIgICAgICAgICAgICAgICAgICAgblBvcnRJbmRleCwKKyAgICBPTVhfSU4gT01YX1BUUiAgICAgICAgICAgICAgICAgICBwQXBwUHJpdmF0ZSwKKyAgICBPTVhfSU4gT01YX1UzMiAgICAgICAgICAgICAgICAgICBuU2l6ZUJ5dGVzKQoreworICAgIE9NWF9FUlJPUlRZUEUgICAgICAgICAgcmV0ID0gT01YX0Vycm9yTm9uZTsKKyAgICBPTVhfQ09NUE9ORU5UVFlQRSAgICAgKnBPTVhDb21wb25lbnQgPSBOVUxMOworICAgIFNFQ19PTVhfQkFTRUNPTVBPTkVOVCAqcFNFQ0NvbXBvbmVudCA9IE5VTEw7CisgICAgU0VDX09NWF9CQVNFUE9SVCAgICAgICpwU0VDUG9ydCA9IE5VTEw7CisgICAgT01YX0JVRkZFUkhFQURFUlRZUEUgICp0ZW1wX2J1ZmZlckhlYWRlciA9IE5VTEw7CisgICAgT01YX1U4ICAgICAgICAgICAgICAgICp0ZW1wX2J1ZmZlciA9IE5VTEw7CisgICAgT01YX1UzMiAgICAgICAgICAgICAgICBpID0gMDsKKworICAgIEZ1bmN0aW9uSW4oKTsKKworICAgIGlmIChoQ29tcG9uZW50ID09IE5VTEwpIHsKKyAgICAgICAgcmV0ID0gT01YX0Vycm9yQmFkUGFyYW1ldGVyOworICAgICAgICBnb3RvIEVYSVQ7CisgICAgfQorICAgIHBPTVhDb21wb25lbnQgPSAoT01YX0NPTVBPTkVOVFRZUEUgKiloQ29tcG9uZW50OworICAgIHJldCA9IFNFQ19PTVhfQ2hlY2tfU2l6ZVZlcnNpb24ocE9NWENvbXBvbmVudCwgc2l6ZW9mKE9NWF9DT01QT05FTlRUWVBFKSk7CisgICAgaWYgKHJldCAhPSBPTVhfRXJyb3JOb25lKSB7CisgICAgICAgIGdvdG8gRVhJVDsKKyAgICB9CisKKyAgICBpZiAocE9NWENvbXBvbmVudC0+cENvbXBvbmVudFByaXZhdGUgPT0gTlVMTCkgeworICAgICAgICByZXQgPSBPTVhfRXJyb3JCYWRQYXJhbWV0ZXI7CisgICAgICAgIGdvdG8gRVhJVDsKKyAgICB9CisgICAgcFNFQ0NvbXBvbmVudCA9IChTRUNfT01YX0JBU0VDT01QT05FTlQgKilwT01YQ29tcG9uZW50LT5wQ29tcG9uZW50UHJpdmF0ZTsKKworICAgIHBTRUNQb3J0ID0gJnBTRUNDb21wb25lbnQtPnBTRUNQb3J0W25Qb3J0SW5kZXhdOworICAgIGlmIChuUG9ydEluZGV4ID49IHBTRUNDb21wb25lbnQtPnBvcnRQYXJhbS5uUG9ydHMpIHsKKyAgICAgICAgcmV0ID0gT01YX0Vycm9yQmFkUG9ydEluZGV4OworICAgICAgICBnb3RvIEVYSVQ7CisgICAgfQorLyoKKyAgICBpZiAocFNFQ1BvcnQtPnBvcnRTdGF0ZSAhPSBPTVhfU3RhdGVJZGxlICkgeworICAgICAgICByZXQgPSBPTVhfRXJyb3JJbmNvcnJlY3RTdGF0ZU9wZXJhdGlvbjsKKyAgICAgICAgZ290byBFWElUOworICAgIH0KKyovCisgICAgaWYgKENIRUNLX1BPUlRfVFVOTkVMRUQocFNFQ1BvcnQpICYmIENIRUNLX1BPUlRfQlVGRkVSX1NVUFBMSUVSKHBTRUNQb3J0KSkgeworICAgICAgICByZXQgPSBPTVhfRXJyb3JCYWRQb3J0SW5kZXg7CisgICAgICAgIGdvdG8gRVhJVDsKKyAgICB9CisKKyAgICB0ZW1wX2J1ZmZlciA9IFNFQ19PU0FMX01hbGxvYyhzaXplb2YoT01YX1U4KSAqIG5TaXplQnl0ZXMpOworICAgIGlmICh0ZW1wX2J1ZmZlciA9PSBOVUxMKSB7CisgICAgICAgIHJldCA9IE9NWF9FcnJvckluc3VmZmljaWVudFJlc291cmNlczsKKyAgICAgICAgZ290byBFWElUOworICAgIH0KKworICAgIHRlbXBfYnVmZmVySGVhZGVyID0gKE9NWF9CVUZGRVJIRUFERVJUWVBFICopU0VDX09TQUxfTWFsbG9jKHNpemVvZihPTVhfQlVGRkVSSEVBREVSVFlQRSkpOworICAgIGlmICh0ZW1wX2J1ZmZlckhlYWRlciA9PSBOVUxMKSB7CisgICAgICAgIFNFQ19PU0FMX0ZyZWUodGVtcF9idWZmZXIpOworICAgICAgICB0ZW1wX2J1ZmZlciA9IE5VTEw7CisgICAgICAgIHJldCA9IE9NWF9FcnJvckluc3VmZmljaWVudFJlc291cmNlczsKKyAgICAgICAgZ290byBFWElUOworICAgIH0KKyAgICBTRUNfT1NBTF9NZW1zZXQodGVtcF9idWZmZXJIZWFkZXIsIDAsIHNpemVvZihPTVhfQlVGRkVSSEVBREVSVFlQRSkpOworCisgICAgZm9yIChpID0gMDsgaSA8IHBTRUNQb3J0LT5wb3J0RGVmaW5pdGlvbi5uQnVmZmVyQ291bnRBY3R1YWw7IGkrKykgeworICAgICAgICBpZiAocFNFQ1BvcnQtPmJ1ZmZlclN0YXRlQWxsb2NhdGVbaV0gPT0gQlVGRkVSX1NUQVRFX0ZSRUUpIHsKKyAgICAgICAgICAgIHBTRUNQb3J0LT5idWZmZXJIZWFkZXJbaV0gPSB0ZW1wX2J1ZmZlckhlYWRlcjsKKyAgICAgICAgICAgIHBTRUNQb3J0LT5idWZmZXJTdGF0ZUFsbG9jYXRlW2ldID0gKEJVRkZFUl9TVEFURV9BTExPQ0FURUQgfCBIRUFERVJfU1RBVEVfQUxMT0NBVEVEKTsKKyAgICAgICAgICAgIElOSVRfU0VUX1NJWkVfVkVSU0lPTih0ZW1wX2J1ZmZlckhlYWRlciwgT01YX0JVRkZFUkhFQURFUlRZUEUpOworICAgICAgICAgICAgdGVtcF9idWZmZXJIZWFkZXItPnBCdWZmZXIgICAgICAgID0gdGVtcF9idWZmZXI7CisgICAgICAgICAgICB0ZW1wX2J1ZmZlckhlYWRlci0+bkFsbG9jTGVuICAgICAgPSBuU2l6ZUJ5dGVzOworICAgICAgICAgICAgdGVtcF9idWZmZXJIZWFkZXItPnBBcHBQcml2YXRlICAgID0gcEFwcFByaXZhdGU7CisgICAgICAgICAgICBpZiAoblBvcnRJbmRleCA9PSBJTlBVVF9QT1JUX0lOREVYKQorICAgICAgICAgICAgICAgIHRlbXBfYnVmZmVySGVhZGVyLT5uSW5wdXRQb3J0SW5kZXggPSBJTlBVVF9QT1JUX0lOREVYOworICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgIHRlbXBfYnVmZmVySGVhZGVyLT5uT3V0cHV0UG9ydEluZGV4ID0gT1VUUFVUX1BPUlRfSU5ERVg7CisgICAgICAgICAgICBwU0VDUG9ydC0+YXNzaWduZWRCdWZmZXJOdW0rKzsKKyAgICAgICAgICAgIGlmIChwU0VDUG9ydC0+YXNzaWduZWRCdWZmZXJOdW0gPT0gcFNFQ1BvcnQtPnBvcnREZWZpbml0aW9uLm5CdWZmZXJDb3VudEFjdHVhbCkgeworICAgICAgICAgICAgICAgIHBTRUNQb3J0LT5wb3J0RGVmaW5pdGlvbi5iUG9wdWxhdGVkID0gT01YX1RSVUU7CisgICAgICAgICAgICAgICAgLyogU0VDX09TQUxfTXV0ZXhMb2NrKHBTRUNDb21wb25lbnQtPmNvbXBNdXRleCk7ICovCisgICAgICAgICAgICAgICAgU0VDX09TQUxfU2VtYXBob3JlUG9zdChwU0VDUG9ydC0+bG9hZGVkUmVzb3VyY2UpOworICAgICAgICAgICAgICAgIC8qIFNFQ19PU0FMX011dGV4VW5sb2NrKHBTRUNDb21wb25lbnQtPmNvbXBNdXRleCk7ICovCisgICAgICAgICAgICB9CisgICAgICAgICAgICAqcHBCdWZmZXIgPSB0ZW1wX2J1ZmZlckhlYWRlcjsKKyAgICAgICAgICAgIHJldCA9IE9NWF9FcnJvck5vbmU7CisgICAgICAgICAgICBnb3RvIEVYSVQ7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBTRUNfT1NBTF9GcmVlKHRlbXBfYnVmZmVySGVhZGVyKTsKKyAgICBTRUNfT1NBTF9GcmVlKHRlbXBfYnVmZmVyKTsKKyAgICByZXQgPSBPTVhfRXJyb3JJbnN1ZmZpY2llbnRSZXNvdXJjZXM7CisKK0VYSVQ6CisgICAgRnVuY3Rpb25PdXQoKTsKKworICAgIHJldHVybiByZXQ7Cit9CisKK09NWF9FUlJPUlRZUEUgU0VDX09NWF9GcmVlQnVmZmVyKAorICAgIE9NWF9JTiBPTVhfSEFORExFVFlQRSBoQ29tcG9uZW50LAorICAgIE9NWF9JTiBPTVhfVTMyICAgICAgICBuUG9ydEluZGV4LAorICAgIE9NWF9JTiBPTVhfQlVGRkVSSEVBREVSVFlQRSAqcEJ1ZmZlckhkcikKK3sKKyAgICBPTVhfRVJST1JUWVBFICAgICAgICAgIHJldCA9IE9NWF9FcnJvck5vbmU7CisgICAgT01YX0NPTVBPTkVOVFRZUEUgICAgICpwT01YQ29tcG9uZW50ID0gTlVMTDsKKyAgICBTRUNfT01YX0JBU0VDT01QT05FTlQgKnBTRUNDb21wb25lbnQgPSBOVUxMOworICAgIFNFQ19PTVhfQkFTRVBPUlQgICAgICAqcFNFQ1BvcnQgPSBOVUxMOworICAgIE9NWF9CVUZGRVJIRUFERVJUWVBFICAqdGVtcF9idWZmZXJIZWFkZXIgPSBOVUxMOworICAgIE9NWF9VOCAgICAgICAgICAgICAgICAqdGVtcF9idWZmZXIgPSBOVUxMOworICAgIE9NWF9VMzIgICAgICAgICAgICAgICAgaSA9IDA7CisKKyAgICBGdW5jdGlvbkluKCk7CisKKyAgICBpZiAoaENvbXBvbmVudCA9PSBOVUxMKSB7CisgICAgICAgIHJldCA9IE9NWF9FcnJvckJhZFBhcmFtZXRlcjsKKyAgICAgICAgZ290byBFWElUOworICAgIH0KKyAgICBwT01YQ29tcG9uZW50ID0gKE9NWF9DT01QT05FTlRUWVBFICopaENvbXBvbmVudDsKKyAgICByZXQgPSBTRUNfT01YX0NoZWNrX1NpemVWZXJzaW9uKHBPTVhDb21wb25lbnQsIHNpemVvZihPTVhfQ09NUE9ORU5UVFlQRSkpOworICAgIGlmIChyZXQgIT0gT01YX0Vycm9yTm9uZSkgeworICAgICAgICBnb3RvIEVYSVQ7CisgICAgfQorCisgICAgaWYgKHBPTVhDb21wb25lbnQtPnBDb21wb25lbnRQcml2YXRlID09IE5VTEwpIHsKKyAgICAgICAgcmV0ID0gT01YX0Vycm9yQmFkUGFyYW1ldGVyOworICAgICAgICBnb3RvIEVYSVQ7CisgICAgfQorICAgIHBTRUNDb21wb25lbnQgPSAoU0VDX09NWF9CQVNFQ09NUE9ORU5UICopcE9NWENvbXBvbmVudC0+cENvbXBvbmVudFByaXZhdGU7CisgICAgcFNFQ1BvcnQgPSAmcFNFQ0NvbXBvbmVudC0+cFNFQ1BvcnRbblBvcnRJbmRleF07CisKKyAgICBpZiAoQ0hFQ0tfUE9SVF9UVU5ORUxFRChwU0VDUG9ydCkgJiYgQ0hFQ0tfUE9SVF9CVUZGRVJfU1VQUExJRVIocFNFQ1BvcnQpKSB7CisgICAgICAgIHJldCA9IE9NWF9FcnJvckJhZFBvcnRJbmRleDsKKyAgICAgICAgZ290byBFWElUOworICAgIH0KKworICAgIGlmICgocFNFQ1BvcnQtPnBvcnRTdGF0ZSAhPSBPTVhfU3RhdGVMb2FkZWQpICYmIChwU0VDUG9ydC0+cG9ydFN0YXRlICE9IE9NWF9TdGF0ZUludmFsaWQpKSB7CisgICAgICAgICgqKHBTRUNDb21wb25lbnQtPnBDYWxsYmFja3MtPkV2ZW50SGFuZGxlcikpIChwT01YQ29tcG9uZW50LAorICAgICAgICAgICAgICAgICAgICAgICAgcFNFQ0NvbXBvbmVudC0+Y2FsbGJhY2tEYXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgKE9NWF9VMzIpT01YX0V2ZW50RXJyb3IsCisgICAgICAgICAgICAgICAgICAgICAgICAoT01YX1UzMilPTVhfRXJyb3JQb3J0VW5wb3B1bGF0ZWQsCisgICAgICAgICAgICAgICAgICAgICAgICBuUG9ydEluZGV4LCBOVUxMKTsKKyAgICB9CisKKyAgICBmb3IgKGkgPSAwOyBpIDwgcFNFQ1BvcnQtPnBvcnREZWZpbml0aW9uLm5CdWZmZXJDb3VudEFjdHVhbDsgaSsrKSB7CisgICAgICAgIGlmICgoKHBTRUNQb3J0LT5idWZmZXJTdGF0ZUFsbG9jYXRlW2ldIHwgQlVGRkVSX1NUQVRFX0ZSRUUpICE9IDApICYmIChwU0VDUG9ydC0+YnVmZmVySGVhZGVyW2ldICE9IE5VTEwpKSB7CisgICAgICAgICAgICBpZiAocFNFQ1BvcnQtPmJ1ZmZlckhlYWRlcltpXS0+cEJ1ZmZlciA9PSBwQnVmZmVySGRyLT5wQnVmZmVyKSB7CisgICAgICAgICAgICAgICAgaWYgKHBTRUNQb3J0LT5idWZmZXJTdGF0ZUFsbG9jYXRlW2ldICYgQlVGRkVSX1NUQVRFX0FMTE9DQVRFRCkgeworICAgICAgICAgICAgICAgICAgICBTRUNfT1NBTF9GcmVlKHBTRUNQb3J0LT5idWZmZXJIZWFkZXJbaV0tPnBCdWZmZXIpOworICAgICAgICAgICAgICAgICAgICBwU0VDUG9ydC0+YnVmZmVySGVhZGVyW2ldLT5wQnVmZmVyID0gTlVMTDsKKyAgICAgICAgICAgICAgICAgICAgcEJ1ZmZlckhkci0+cEJ1ZmZlciA9IE5VTEw7CisgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChwU0VDUG9ydC0+YnVmZmVyU3RhdGVBbGxvY2F0ZVtpXSAmIEJVRkZFUl9TVEFURV9BU1NJR05FRCkgeworICAgICAgICAgICAgICAgICAgICA7IC8qIE5vbmUqLworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBwU0VDUG9ydC0+YXNzaWduZWRCdWZmZXJOdW0tLTsKKyAgICAgICAgICAgICAgICBpZiAocFNFQ1BvcnQtPmJ1ZmZlclN0YXRlQWxsb2NhdGVbaV0gJiBIRUFERVJfU1RBVEVfQUxMT0NBVEVEKSB7CisgICAgICAgICAgICAgICAgICAgIFNFQ19PU0FMX0ZyZWUocFNFQ1BvcnQtPmJ1ZmZlckhlYWRlcltpXSk7CisgICAgICAgICAgICAgICAgICAgIHBTRUNQb3J0LT5idWZmZXJIZWFkZXJbaV0gPSBOVUxMOworICAgICAgICAgICAgICAgICAgICBwQnVmZmVySGRyID0gTlVMTDsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgcFNFQ1BvcnQtPmJ1ZmZlclN0YXRlQWxsb2NhdGVbaV0gPSBCVUZGRVJfU1RBVEVfRlJFRTsKKyAgICAgICAgICAgICAgICByZXQgPSBPTVhfRXJyb3JOb25lOworICAgICAgICAgICAgICAgIGdvdG8gRVhJVDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworRVhJVDoKKyAgICBpZiAocmV0ID09IE9NWF9FcnJvck5vbmUpIHsKKyAgICAgICAgaWYgKHBTRUNQb3J0LT5hc3NpZ25lZEJ1ZmZlck51bSA9PSAwKSB7CisgICAgICAgICAgICBTRUNfT1NBTF9Mb2coU0VDX0xPR19UUkFDRSwgInBTRUNQb3J0LT51bmxvYWRlZFJlc291cmNlIHNpZ25hbCBzZXQiKTsKKyAgICAgICAgICAgIC8qIFNFQ19PU0FMX011dGV4TG9jayhwU0VDQ29tcG9uZW50LT5jb21wTXV0ZXgpOyAqLworICAgICAgICAgICAgU0VDX09TQUxfU2VtYXBob3JlUG9zdChwU0VDUG9ydC0+dW5sb2FkZWRSZXNvdXJjZSk7CisgICAgICAgICAgICAvKiBTRUNfT1NBTF9NdXRleFVubG9jayhwU0VDQ29tcG9uZW50LT5jb21wTXV0ZXgpOyAqLworICAgICAgICAgICAgcFNFQ1BvcnQtPnBvcnREZWZpbml0aW9uLmJQb3B1bGF0ZWQgPSBPTVhfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBGdW5jdGlvbk91dCgpOworCisgICAgcmV0dXJuIHJldDsKK30KKworT01YX0VSUk9SVFlQRSBTRUNfT01YX0FsbG9jYXRlVHVubmVsQnVmZmVyKFNFQ19PTVhfQkFTRVBPUlQgKnBPTVhCYXNlUG9ydCwgT01YX1UzMiBuUG9ydEluZGV4KQoreworICAgIE9NWF9FUlJPUlRZUEUgICAgICAgICAgICAgICAgIHJldCA9IE9NWF9FcnJvck5vbmU7CisgICAgU0VDX09NWF9CQVNFUE9SVCAgICAgICAgICAgICAqcFNFQ1BvcnQgPSBOVUxMOworICAgIE9NWF9CVUZGRVJIRUFERVJUWVBFICAgICAgICAgKnRlbXBfYnVmZmVySGVhZGVyID0gTlVMTDsKKyAgICBPTVhfVTggICAgICAgICAgICAgICAgICAgICAgICp0ZW1wX2J1ZmZlciA9IE5VTEw7CisgICAgT01YX1UzMiAgICAgICAgICAgICAgICAgICAgICAgYnVmZmVyU2l6ZSA9IDA7CisgICAgT01YX1BBUkFNX1BPUlRERUZJTklUSU9OVFlQRSAgcG9ydERlZmluaXRpb247CisKKyAgICByZXQgPSBPTVhfRXJyb3JUdW5uZWxpbmdVbnN1cHBvcnRlZDsKK0VYSVQ6CisgICAgcmV0dXJuIHJldDsKK30KKworT01YX0VSUk9SVFlQRSBTRUNfT01YX0ZyZWVUdW5uZWxCdWZmZXIoU0VDX09NWF9CQVNFUE9SVCAqcE9NWEJhc2VQb3J0LCBPTVhfVTMyIG5Qb3J0SW5kZXgpCit7CisgICAgT01YX0VSUk9SVFlQRSByZXQgPSBPTVhfRXJyb3JOb25lOworICAgIFNFQ19PTVhfQkFTRVBPUlQqIHBTRUNQb3J0ID0gTlVMTDsKKyAgICBPTVhfQlVGRkVSSEVBREVSVFlQRSogdGVtcF9idWZmZXJIZWFkZXIgPSBOVUxMOworICAgIE9NWF9VOCAqdGVtcF9idWZmZXIgPSBOVUxMOworICAgIE9NWF9VMzIgYnVmZmVyU2l6ZSA9IDA7CisKKyAgICByZXQgPSBPTVhfRXJyb3JUdW5uZWxpbmdVbnN1cHBvcnRlZDsKK0VYSVQ6CisgICAgcmV0dXJuIHJldDsKK30KKworT01YX0VSUk9SVFlQRSBTRUNfT01YX0NvbXBvbmVudFR1bm5lbFJlcXVlc3QoCisgICAgT01YX0lOIE9NWF9IQU5ETEVUWVBFIGhDb21wLAorICAgIE9NWF9JTiBPTVhfVTMyICAgICAgICBuUG9ydCwKKyAgICBPTVhfSU4gT01YX0hBTkRMRVRZUEUgaFR1bm5lbGVkQ29tcCwKKyAgICBPTVhfSU4gT01YX1UzMiAgICAgICAgblR1bm5lbGVkUG9ydCwKKyAgICBPTVhfSU5PVVQgT01YX1RVTk5FTFNFVFVQVFlQRSAqcFR1bm5lbFNldHVwKQoreworICAgIE9NWF9FUlJPUlRZUEUgcmV0ID0gT01YX0Vycm9yTm9uZTsKKworICAgIHJldCA9IE9NWF9FcnJvclR1bm5lbGluZ1Vuc3VwcG9ydGVkOworRVhJVDoKKyAgICByZXR1cm4gcmV0OworfQorCitPTVhfQk9PTCBTRUNfQ2hlY2tfQnVmZmVyUHJvY2Vzc19TdGF0ZShTRUNfT01YX0JBU0VDT01QT05FTlQgKnBTRUNDb21wb25lbnQpCit7CisgICAgaWYgKChwU0VDQ29tcG9uZW50LT5jdXJyZW50U3RhdGUgPT0gT01YX1N0YXRlRXhlY3V0aW5nKSAmJgorICAgICAgICAocFNFQ0NvbXBvbmVudC0+cFNFQ1BvcnRbSU5QVVRfUE9SVF9JTkRFWF0ucG9ydFN0YXRlID09IE9NWF9TdGF0ZUlkbGUpICYmCisgICAgICAgIChwU0VDQ29tcG9uZW50LT5wU0VDUG9ydFtPVVRQVVRfUE9SVF9JTkRFWF0ucG9ydFN0YXRlID09IE9NWF9TdGF0ZUlkbGUpICYmCisgICAgICAgIChwU0VDQ29tcG9uZW50LT50cmFuc2llbnRTdGF0ZSAhPSBTRUNfT01YX1RyYW5zU3RhdGVFeGVjdXRpbmdUb0lkbGUpICYmCisgICAgICAgIChwU0VDQ29tcG9uZW50LT50cmFuc2llbnRTdGF0ZSAhPSBTRUNfT01YX1RyYW5zU3RhdGVJZGxlVG9FeGVjdXRpbmcpKSB7CisgICAgICAgIHJldHVybiBPTVhfVFJVRTsKKyAgICB9IGVsc2UgeworICAgICAgICByZXR1cm4gT01YX0ZBTFNFOworICAgIH0KK30KKworc3RhdGljIE9NWF9FUlJPUlRZUEUgU0VDX0lucHV0QnVmZmVyUmV0dXJuKE9NWF9DT01QT05FTlRUWVBFICpwT01YQ29tcG9uZW50KQoreworICAgIE9NWF9FUlJPUlRZUEUgICAgICAgICAgcmV0ID0gT01YX0Vycm9yTm9uZTsKKyAgICBTRUNfT01YX0JBU0VDT01QT05FTlQgKnBTRUNDb21wb25lbnQgPSAoU0VDX09NWF9CQVNFQ09NUE9ORU5UICopcE9NWENvbXBvbmVudC0+cENvbXBvbmVudFByaXZhdGU7CisgICAgU0VDX09NWF9CQVNFUE9SVCAgICAgICpzZWNPTVhJbnB1dFBvcnQgPSAmcFNFQ0NvbXBvbmVudC0+cFNFQ1BvcnRbSU5QVVRfUE9SVF9JTkRFWF07CisgICAgU0VDX09NWF9CQVNFUE9SVCAgICAgICpzZWNPTVhPdXRwdXRQb3J0ID0gJnBTRUNDb21wb25lbnQtPnBTRUNQb3J0W09VVFBVVF9QT1JUX0lOREVYXTsKKyAgICBTRUNfT01YX0RBVEFCVUZGRVIgICAgKmRhdGFCdWZmZXIgPSAmcFNFQ0NvbXBvbmVudC0+c2VjRGF0YUJ1ZmZlcltJTlBVVF9QT1JUX0lOREVYXTsKKyAgICBPTVhfQlVGRkVSSEVBREVSVFlQRSAgKmJ1ZmZlckhlYWRlciA9IGRhdGFCdWZmZXItPmJ1ZmZlckhlYWRlcjsKKworICAgIEZ1bmN0aW9uSW4oKTsKKworICAgIGlmIChidWZmZXJIZWFkZXIgIT0gTlVMTCkgeworICAgICAgICBpZiAoc2VjT01YSW5wdXRQb3J0LT5tYXJrVHlwZS5oTWFya1RhcmdldENvbXBvbmVudCAhPSBOVUxMICkgeworICAgICAgICAgICAgYnVmZmVySGVhZGVyLT5oTWFya1RhcmdldENvbXBvbmVudCAgICAgID0gc2VjT01YSW5wdXRQb3J0LT5tYXJrVHlwZS5oTWFya1RhcmdldENvbXBvbmVudDsKKyAgICAgICAgICAgIGJ1ZmZlckhlYWRlci0+cE1hcmtEYXRhICAgICAgICAgICAgICAgICA9IHNlY09NWElucHV0UG9ydC0+bWFya1R5cGUucE1hcmtEYXRhOworICAgICAgICAgICAgc2VjT01YSW5wdXRQb3J0LT5tYXJrVHlwZS5oTWFya1RhcmdldENvbXBvbmVudCA9IE5VTEw7CisgICAgICAgICAgICBzZWNPTVhJbnB1dFBvcnQtPm1hcmtUeXBlLnBNYXJrRGF0YSA9IE5VTEw7CisgICAgICAgIH0KKworICAgICAgICBpZiAoYnVmZmVySGVhZGVyLT5oTWFya1RhcmdldENvbXBvbmVudCAhPSBOVUxMKSB7CisgICAgICAgICAgICBpZiAoYnVmZmVySGVhZGVyLT5oTWFya1RhcmdldENvbXBvbmVudCA9PSBwT01YQ29tcG9uZW50KSB7CisgICAgICAgICAgICAgICAgcFNFQ0NvbXBvbmVudC0+cENhbGxiYWNrcy0+RXZlbnRIYW5kbGVyKHBPTVhDb21wb25lbnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBTRUNDb21wb25lbnQtPmNhbGxiYWNrRGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT01YX0V2ZW50TWFyaywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMCwgMCwgYnVmZmVySGVhZGVyLT5wTWFya0RhdGEpOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBwU0VDQ29tcG9uZW50LT5wcm9wYWdhdGVNYXJrVHlwZS5oTWFya1RhcmdldENvbXBvbmVudCA9IGJ1ZmZlckhlYWRlci0+aE1hcmtUYXJnZXRDb21wb25lbnQ7CisgICAgICAgICAgICAgICAgcFNFQ0NvbXBvbmVudC0+cHJvcGFnYXRlTWFya1R5cGUucE1hcmtEYXRhID0gYnVmZmVySGVhZGVyLT5wTWFya0RhdGE7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBpZiAoQ0hFQ0tfUE9SVF9UVU5ORUxFRChzZWNPTVhJbnB1dFBvcnQpKSB7CisgICAgICAgICAgICBPTVhfRmlsbFRoaXNCdWZmZXIoc2VjT01YSW5wdXRQb3J0LT50dW5uZWxlZENvbXBvbmVudCwgYnVmZmVySGVhZGVyKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIGJ1ZmZlckhlYWRlci0+bkZpbGxlZExlbiA9IDA7CisgICAgICAgICAgICBwU0VDQ29tcG9uZW50LT5wQ2FsbGJhY2tzLT5FbXB0eUJ1ZmZlckRvbmUocE9NWENvbXBvbmVudCwgcFNFQ0NvbXBvbmVudC0+Y2FsbGJhY2tEYXRhLCBidWZmZXJIZWFkZXIpOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChwU0VDQ29tcG9uZW50LT5jdXJyZW50U3RhdGUgPT0gT01YX1N0YXRlUGF1c2UpICYmCisgICAgICAgICgoIUNIRUNLX1BPUlRfQkVJTkdfRkxVU0hFRChzZWNPTVhJbnB1dFBvcnQpICYmICFDSEVDS19QT1JUX0JFSU5HX0ZMVVNIRUQoc2VjT01YT3V0cHV0UG9ydCkpKSkgeworICAgICAgICBTRUNfT1NBTF9TaWduYWxXYWl0KHBTRUNDb21wb25lbnQtPnBhdXNlRXZlbnQsIERFRl9NQVhfV0FJVF9USU1FKTsKKyAgICAgICAgU0VDX09TQUxfU2lnbmFsUmVzZXQocFNFQ0NvbXBvbmVudC0+cGF1c2VFdmVudCk7CisgICAgfQorCisgICAgZGF0YUJ1ZmZlci0+ZGF0YVZhbGlkICAgICA9IE9NWF9GQUxTRTsKKyAgICBkYXRhQnVmZmVyLT5kYXRhTGVuICAgICAgID0gMDsKKyAgICBkYXRhQnVmZmVyLT5yZW1haW5EYXRhTGVuID0gMDsKKyAgICBkYXRhQnVmZmVyLT51c2VkRGF0YUxlbiAgID0gMDsKKyAgICBkYXRhQnVmZmVyLT5idWZmZXJIZWFkZXIgID0gTlVMTDsKKyAgICBkYXRhQnVmZmVyLT5uRmxhZ3MgICAgICAgID0gMDsKKyAgICBkYXRhQnVmZmVyLT50aW1lU3RhbXAgICAgID0gMDsKKworRVhJVDoKKyAgICBGdW5jdGlvbk91dCgpOworCisgICAgcmV0dXJuIHJldDsKK30KKworT01YX0VSUk9SVFlQRSBTRUNfSW5wdXRCdWZmZXJHZXRRdWV1ZShTRUNfT01YX0JBU0VDT01QT05FTlQgKnBTRUNDb21wb25lbnQpCit7CisgICAgT01YX0VSUk9SVFlQRSAgICAgICByZXQgPSBPTVhfRXJyb3JOb25lOworICAgIFNFQ19PTVhfQkFTRVBPUlQgICAqcFNFQ1BvcnQgPSBOVUxMOworICAgIFNFQ19PTVhfREFUQUJVRkZFUiAqZGF0YUJ1ZmZlciA9IE5VTEw7CisgICAgU0VDX09NWF9NRVNTQUdFKiAgICBtZXNzYWdlID0gTlVMTDsKKyAgICBTRUNfT01YX0RBVEFCVUZGRVIgKmlucHV0VXNlQnVmZmVyID0gJnBTRUNDb21wb25lbnQtPnNlY0RhdGFCdWZmZXJbSU5QVVRfUE9SVF9JTkRFWF07CisKKyAgICBGdW5jdGlvbkluKCk7CisKKyAgICBwU0VDUG9ydD0gJnBTRUNDb21wb25lbnQtPnBTRUNQb3J0W0lOUFVUX1BPUlRfSU5ERVhdOworICAgIGRhdGFCdWZmZXIgPSAmcFNFQ0NvbXBvbmVudC0+c2VjRGF0YUJ1ZmZlcltJTlBVVF9QT1JUX0lOREVYXTsKKworICAgIGlmIChwU0VDQ29tcG9uZW50LT5jdXJyZW50U3RhdGUgIT0gT01YX1N0YXRlRXhlY3V0aW5nKSB7CisgICAgICAgIHJldCA9IE9NWF9FcnJvclVuZGVmaW5lZDsKKyAgICAgICAgZ290byBFWElUOworICAgIH0gZWxzZSB7CisgICAgICAgIFNFQ19PU0FMX1NlbWFwaG9yZVdhaXQocFNFQ1BvcnQtPmJ1ZmZlclNlbUlEKTsKKyAgICAgICAgU0VDX09TQUxfTXV0ZXhMb2NrKGlucHV0VXNlQnVmZmVyLT5idWZmZXJNdXRleCk7CisgICAgICAgIGlmIChkYXRhQnVmZmVyLT5kYXRhVmFsaWQgIT0gT01YX1RSVUUpIHsKKyAgICAgICAgICAgIG1lc3NhZ2UgPSAoU0VDX09NWF9NRVNTQUdFICopU0VDX09TQUxfRGVxdWV1ZSgmcFNFQ1BvcnQtPmJ1ZmZlclEpOworICAgICAgICAgICAgaWYgKG1lc3NhZ2UgPT0gTlVMTCkgeworICAgICAgICAgICAgICAgIHJldCA9IE9NWF9FcnJvclVuZGVmaW5lZDsKKyAgICAgICAgICAgICAgICBTRUNfT1NBTF9NdXRleFVubG9jayhpbnB1dFVzZUJ1ZmZlci0+YnVmZmVyTXV0ZXgpOworICAgICAgICAgICAgICAgIGdvdG8gRVhJVDsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgZGF0YUJ1ZmZlci0+YnVmZmVySGVhZGVyID0gKE9NWF9CVUZGRVJIRUFERVJUWVBFICopKG1lc3NhZ2UtPnBDbWREYXRhKTsKKyAgICAgICAgICAgIGRhdGFCdWZmZXItPmFsbG9jU2l6ZSA9IGRhdGFCdWZmZXItPmJ1ZmZlckhlYWRlci0+bkFsbG9jTGVuOworICAgICAgICAgICAgZGF0YUJ1ZmZlci0+ZGF0YUxlbiA9IGRhdGFCdWZmZXItPmJ1ZmZlckhlYWRlci0+bkZpbGxlZExlbjsKKyAgICAgICAgICAgIGRhdGFCdWZmZXItPnJlbWFpbkRhdGFMZW4gPSBkYXRhQnVmZmVyLT5kYXRhTGVuOworICAgICAgICAgICAgZGF0YUJ1ZmZlci0+dXNlZERhdGFMZW4gPSAwOworICAgICAgICAgICAgZGF0YUJ1ZmZlci0+ZGF0YVZhbGlkID0gT01YX1RSVUU7CisgICAgICAgICAgICBkYXRhQnVmZmVyLT5uRmxhZ3MgPSBkYXRhQnVmZmVyLT5idWZmZXJIZWFkZXItPm5GbGFnczsKKyAgICAgICAgICAgIGRhdGFCdWZmZXItPnRpbWVTdGFtcCA9IGRhdGFCdWZmZXItPmJ1ZmZlckhlYWRlci0+blRpbWVTdGFtcDsKKworICAgICAgICAgICAgU0VDX09TQUxfRnJlZShtZXNzYWdlKTsKKworICAgICAgICAgICAgaWYgKGRhdGFCdWZmZXItPmFsbG9jU2l6ZSA8PSBkYXRhQnVmZmVyLT5kYXRhTGVuKQorICAgICAgICAgICAgICAgIFNFQ19PU0FMX0xvZyhTRUNfTE9HX1dBUk5JTkcsICJJbnB1dCBCdWZmZXIgRnVsbCwgQ2hlY2sgaW5wdXQgYnVmZmVyIHNpemUhIGFsbG9jU2l6ZTolZCwgZGF0YUxlbjolZCIsIGRhdGFCdWZmZXItPmFsbG9jU2l6ZSwgZGF0YUJ1ZmZlci0+ZGF0YUxlbik7CisgICAgICAgIH0KKyAgICAgICAgU0VDX09TQUxfTXV0ZXhVbmxvY2soaW5wdXRVc2VCdWZmZXItPmJ1ZmZlck11dGV4KTsKKyAgICAgICAgcmV0ID0gT01YX0Vycm9yTm9uZTsKKyAgICB9CitFWElUOgorICAgIEZ1bmN0aW9uT3V0KCk7CisKKyAgICByZXR1cm4gcmV0OworfQorCitzdGF0aWMgT01YX0VSUk9SVFlQRSBTRUNfT3V0cHV0QnVmZmVyUmV0dXJuKE9NWF9DT01QT05FTlRUWVBFICpwT01YQ29tcG9uZW50KQoreworICAgIE9NWF9FUlJPUlRZUEUgICAgICAgICAgcmV0ID0gT01YX0Vycm9yTm9uZTsKKyAgICBTRUNfT01YX0JBU0VDT01QT05FTlQgKnBTRUNDb21wb25lbnQgPSAoU0VDX09NWF9CQVNFQ09NUE9ORU5UICopcE9NWENvbXBvbmVudC0+cENvbXBvbmVudFByaXZhdGU7CisgICAgU0VDX09NWF9CQVNFUE9SVCAgICAgICpzZWNPTVhJbnB1dFBvcnQgPSAmcFNFQ0NvbXBvbmVudC0+cFNFQ1BvcnRbSU5QVVRfUE9SVF9JTkRFWF07CisgICAgU0VDX09NWF9CQVNFUE9SVCAgICAgICpzZWNPTVhPdXRwdXRQb3J0ID0gJnBTRUNDb21wb25lbnQtPnBTRUNQb3J0W09VVFBVVF9QT1JUX0lOREVYXTsKKyAgICBTRUNfT01YX0RBVEFCVUZGRVIgICAgKmRhdGFCdWZmZXIgPSAmcFNFQ0NvbXBvbmVudC0+c2VjRGF0YUJ1ZmZlcltPVVRQVVRfUE9SVF9JTkRFWF07CisgICAgT01YX0JVRkZFUkhFQURFUlRZUEUgICpidWZmZXJIZWFkZXIgPSBkYXRhQnVmZmVyLT5idWZmZXJIZWFkZXI7CisKKyAgICBGdW5jdGlvbkluKCk7CisKKyAgICBpZiAoYnVmZmVySGVhZGVyICE9IE5VTEwpIHsKKyAgICAgICAgYnVmZmVySGVhZGVyLT5uRmlsbGVkTGVuID0gZGF0YUJ1ZmZlci0+cmVtYWluRGF0YUxlbjsKKyAgICAgICAgYnVmZmVySGVhZGVyLT5uT2Zmc2V0ICAgID0gMDsKKyAgICAgICAgYnVmZmVySGVhZGVyLT5uRmxhZ3MgICAgID0gZGF0YUJ1ZmZlci0+bkZsYWdzOworICAgICAgICBidWZmZXJIZWFkZXItPm5UaW1lU3RhbXAgPSBkYXRhQnVmZmVyLT50aW1lU3RhbXA7CisKKyAgICAgICAgaWYgKHBTRUNDb21wb25lbnQtPnByb3BhZ2F0ZU1hcmtUeXBlLmhNYXJrVGFyZ2V0Q29tcG9uZW50ICE9IE5VTEwpIHsKKyAgICAgICAgICAgIGJ1ZmZlckhlYWRlci0+aE1hcmtUYXJnZXRDb21wb25lbnQgPSBwU0VDQ29tcG9uZW50LT5wcm9wYWdhdGVNYXJrVHlwZS5oTWFya1RhcmdldENvbXBvbmVudDsKKyAgICAgICAgICAgIGJ1ZmZlckhlYWRlci0+cE1hcmtEYXRhID0gcFNFQ0NvbXBvbmVudC0+cHJvcGFnYXRlTWFya1R5cGUucE1hcmtEYXRhOworICAgICAgICAgICAgcFNFQ0NvbXBvbmVudC0+cHJvcGFnYXRlTWFya1R5cGUuaE1hcmtUYXJnZXRDb21wb25lbnQgPSBOVUxMOworICAgICAgICAgICAgcFNFQ0NvbXBvbmVudC0+cHJvcGFnYXRlTWFya1R5cGUucE1hcmtEYXRhID0gTlVMTDsKKyAgICAgICAgfQorCisgICAgICAgIGlmIChidWZmZXJIZWFkZXItPm5GbGFncyAmIE9NWF9CVUZGRVJGTEFHX0VPUykgeworICAgICAgICAgICAgcFNFQ0NvbXBvbmVudC0+cENhbGxiYWNrcy0+RXZlbnRIYW5kbGVyKHBPTVhDb21wb25lbnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcFNFQ0NvbXBvbmVudC0+Y2FsbGJhY2tEYXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9NWF9FdmVudEJ1ZmZlckZsYWcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgT1VUUFVUX1BPUlRfSU5ERVgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnVmZmVySGVhZGVyLT5uRmxhZ3MsIE5VTEwpOworICAgICAgICB9CisKKyAgICAgICAgaWYgKENIRUNLX1BPUlRfVFVOTkVMRUQoc2VjT01YT3V0cHV0UG9ydCkpIHsKKyAgICAgICAgICAgIE9NWF9FbXB0eVRoaXNCdWZmZXIoc2VjT01YT3V0cHV0UG9ydC0+dHVubmVsZWRDb21wb25lbnQsIGJ1ZmZlckhlYWRlcik7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBwU0VDQ29tcG9uZW50LT5wQ2FsbGJhY2tzLT5GaWxsQnVmZmVyRG9uZShwT01YQ29tcG9uZW50LCBwU0VDQ29tcG9uZW50LT5jYWxsYmFja0RhdGEsIGJ1ZmZlckhlYWRlcik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKHBTRUNDb21wb25lbnQtPmN1cnJlbnRTdGF0ZSA9PSBPTVhfU3RhdGVQYXVzZSkgJiYKKyAgICAgICAgKCghQ0hFQ0tfUE9SVF9CRUlOR19GTFVTSEVEKHNlY09NWElucHV0UG9ydCkgJiYgIUNIRUNLX1BPUlRfQkVJTkdfRkxVU0hFRChzZWNPTVhPdXRwdXRQb3J0KSkpKSB7CisgICAgICAgIFNFQ19PU0FMX1NpZ25hbFdhaXQocFNFQ0NvbXBvbmVudC0+cGF1c2VFdmVudCwgREVGX01BWF9XQUlUX1RJTUUpOworICAgICAgICBTRUNfT1NBTF9TaWduYWxSZXNldChwU0VDQ29tcG9uZW50LT5wYXVzZUV2ZW50KTsKKyAgICB9CisKKyAgICAvKiByZXNldCBkYXRhQnVmZmVyICovCisgICAgZGF0YUJ1ZmZlci0+ZGF0YVZhbGlkICAgICA9IE9NWF9GQUxTRTsKKyAgICBkYXRhQnVmZmVyLT5kYXRhTGVuICAgICAgID0gMDsKKyAgICBkYXRhQnVmZmVyLT5yZW1haW5EYXRhTGVuID0gMDsKKyAgICBkYXRhQnVmZmVyLT51c2VkRGF0YUxlbiAgID0gMDsKKyAgICBkYXRhQnVmZmVyLT5idWZmZXJIZWFkZXIgID0gTlVMTDsKKyAgICBkYXRhQnVmZmVyLT5uRmxhZ3MgICAgICAgID0gMDsKKyAgICBkYXRhQnVmZmVyLT50aW1lU3RhbXAgICAgID0gMDsKKworRVhJVDoKKyAgICBGdW5jdGlvbk91dCgpOworCisgICAgcmV0dXJuIHJldDsKK30KKworT01YX0VSUk9SVFlQRSBTRUNfT3V0cHV0QnVmZmVyR2V0UXVldWUoU0VDX09NWF9CQVNFQ09NUE9ORU5UICpwU0VDQ29tcG9uZW50KQoreworICAgIE9NWF9FUlJPUlRZUEUgICAgICAgcmV0ID0gT01YX0Vycm9yTm9uZTsKKyAgICBTRUNfT01YX0JBU0VQT1JUICAgKnBTRUNQb3J0ID0gTlVMTDsKKyAgICBTRUNfT01YX0RBVEFCVUZGRVIgKmRhdGFCdWZmZXIgPSBOVUxMOworICAgIFNFQ19PTVhfTUVTU0FHRSAgICAqbWVzc2FnZSA9IE5VTEw7CisgICAgU0VDX09NWF9EQVRBQlVGRkVSICpvdXRwdXRVc2VCdWZmZXIgPSAmcFNFQ0NvbXBvbmVudC0+c2VjRGF0YUJ1ZmZlcltPVVRQVVRfUE9SVF9JTkRFWF07CisKKyAgICBGdW5jdGlvbkluKCk7CisKKyAgICBwU0VDUG9ydD0gJnBTRUNDb21wb25lbnQtPnBTRUNQb3J0W09VVFBVVF9QT1JUX0lOREVYXTsKKyAgICBkYXRhQnVmZmVyID0gJnBTRUNDb21wb25lbnQtPnNlY0RhdGFCdWZmZXJbT1VUUFVUX1BPUlRfSU5ERVhdOworCisgICAgaWYgKHBTRUNDb21wb25lbnQtPmN1cnJlbnRTdGF0ZSAhPSBPTVhfU3RhdGVFeGVjdXRpbmcpIHsKKyAgICAgICAgcmV0ID0gT01YX0Vycm9yVW5kZWZpbmVkOworICAgICAgICBnb3RvIEVYSVQ7CisgICAgfSBlbHNlIHsKKyAgICAgICAgU0VDX09TQUxfU2VtYXBob3JlV2FpdChwU0VDUG9ydC0+YnVmZmVyU2VtSUQpOworICAgICAgICBTRUNfT1NBTF9NdXRleExvY2sob3V0cHV0VXNlQnVmZmVyLT5idWZmZXJNdXRleCk7CisgICAgICAgIGlmIChkYXRhQnVmZmVyLT5kYXRhVmFsaWQgIT0gT01YX1RSVUUpIHsKKyAgICAgICAgICAgIG1lc3NhZ2UgPSAoU0VDX09NWF9NRVNTQUdFICopU0VDX09TQUxfRGVxdWV1ZSgmcFNFQ1BvcnQtPmJ1ZmZlclEpOworICAgICAgICAgICAgaWYgKG1lc3NhZ2UgPT0gTlVMTCkgeworICAgICAgICAgICAgICAgIHJldCA9IE9NWF9FcnJvclVuZGVmaW5lZDsKKyAgICAgICAgICAgICAgICBTRUNfT1NBTF9NdXRleFVubG9jayhvdXRwdXRVc2VCdWZmZXItPmJ1ZmZlck11dGV4KTsKKyAgICAgICAgICAgICAgICBnb3RvIEVYSVQ7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGRhdGFCdWZmZXItPmJ1ZmZlckhlYWRlciA9IChPTVhfQlVGRkVSSEVBREVSVFlQRSAqKShtZXNzYWdlLT5wQ21kRGF0YSk7CisgICAgICAgICAgICBkYXRhQnVmZmVyLT5hbGxvY1NpemUgPSBkYXRhQnVmZmVyLT5idWZmZXJIZWFkZXItPm5BbGxvY0xlbjsKKyAgICAgICAgICAgIGRhdGFCdWZmZXItPmRhdGFMZW4gPSAwOyAvL2RhdGFCdWZmZXItPmJ1ZmZlckhlYWRlci0+bkZpbGxlZExlbjsKKyAgICAgICAgICAgIGRhdGFCdWZmZXItPnJlbWFpbkRhdGFMZW4gPSBkYXRhQnVmZmVyLT5kYXRhTGVuOworICAgICAgICAgICAgZGF0YUJ1ZmZlci0+dXNlZERhdGFMZW4gPSAwOyAvL2RhdGFCdWZmZXItPmJ1ZmZlckhlYWRlci0+bk9mZnNldDsKKyAgICAgICAgICAgIGRhdGFCdWZmZXItPmRhdGFWYWxpZCA9T01YX1RSVUU7CisgICAgICAgICAgICAvKiBkYXRhQnVmZmVyLT5uRmxhZ3MgPSBkYXRhQnVmZmVyLT5idWZmZXJIZWFkZXItPm5GbGFnczsgKi8KKyAgICAgICAgICAgIC8qIGRhdGFCdWZmZXItPm5UaW1lU3RhbXAgPSBkYXRhQnVmZmVyLT5idWZmZXJIZWFkZXItPm5UaW1lU3RhbXA7ICovCisgICAgICAgICAgICBwU0VDQ29tcG9uZW50LT5wcm9jZXNzRGF0YVtPVVRQVVRfUE9SVF9JTkRFWF0uZGF0YUJ1ZmZlciA9IGRhdGFCdWZmZXItPmJ1ZmZlckhlYWRlci0+cEJ1ZmZlcjsKKyAgICAgICAgICAgIHBTRUNDb21wb25lbnQtPnByb2Nlc3NEYXRhW09VVFBVVF9QT1JUX0lOREVYXS5hbGxvY1NpemUgPSBkYXRhQnVmZmVyLT5idWZmZXJIZWFkZXItPm5BbGxvY0xlbjsKKworICAgICAgICAgICAgU0VDX09TQUxfRnJlZShtZXNzYWdlKTsKKyAgICAgICAgfQorICAgICAgICBTRUNfT1NBTF9NdXRleFVubG9jayhvdXRwdXRVc2VCdWZmZXItPmJ1ZmZlck11dGV4KTsKKyAgICAgICAgcmV0ID0gT01YX0Vycm9yTm9uZTsKKyAgICB9CitFWElUOgorICAgIEZ1bmN0aW9uT3V0KCk7CisKKyAgICByZXR1cm4gcmV0OworCit9CisKK3N0YXRpYyBPTVhfRVJST1JUWVBFIFNFQ19CdWZmZXJSZXNldChPTVhfQ09NUE9ORU5UVFlQRSAqcE9NWENvbXBvbmVudCwgT01YX1UzMiBwb3J0SW5kZXgpCit7CisgICAgT01YX0VSUk9SVFlQRSAgICAgICAgICByZXQgPSBPTVhfRXJyb3JOb25lOworICAgIFNFQ19PTVhfQkFTRUNPTVBPTkVOVCAqcFNFQ0NvbXBvbmVudCA9IChTRUNfT01YX0JBU0VDT01QT05FTlQgKilwT01YQ29tcG9uZW50LT5wQ29tcG9uZW50UHJpdmF0ZTsKKyAgICAvKiBTRUNfT01YX0JBU0VQT1JUICAgICAgKnBTRUNQb3J0ID0gJnBTRUNDb21wb25lbnQtPnBTRUNQb3J0W3BvcnRJbmRleF07ICovCisgICAgU0VDX09NWF9EQVRBQlVGRkVSICAgICpkYXRhQnVmZmVyID0gJnBTRUNDb21wb25lbnQtPnNlY0RhdGFCdWZmZXJbcG9ydEluZGV4XTsKKyAgICAvKiBPTVhfQlVGRkVSSEVBREVSVFlQRSAgKmJ1ZmZlckhlYWRlciA9IGRhdGFCdWZmZXItPmJ1ZmZlckhlYWRlcjsgKi8KKworICAgIGRhdGFCdWZmZXItPmRhdGFWYWxpZCAgICAgPSBPTVhfRkFMU0U7CisgICAgZGF0YUJ1ZmZlci0+ZGF0YUxlbiAgICAgICA9IDA7CisgICAgZGF0YUJ1ZmZlci0+cmVtYWluRGF0YUxlbiA9IDA7CisgICAgZGF0YUJ1ZmZlci0+dXNlZERhdGFMZW4gICA9IDA7CisgICAgZGF0YUJ1ZmZlci0+YnVmZmVySGVhZGVyICA9IE5VTEw7CisgICAgZGF0YUJ1ZmZlci0+bkZsYWdzICAgICAgICA9IDA7CisgICAgZGF0YUJ1ZmZlci0+dGltZVN0YW1wICAgICA9IDA7CisKKyAgICByZXR1cm4gcmV0OworfQorCitzdGF0aWMgT01YX0VSUk9SVFlQRSBTRUNfRGF0YVJlc2V0KE9NWF9DT01QT05FTlRUWVBFICpwT01YQ29tcG9uZW50LCBPTVhfVTMyIHBvcnRJbmRleCkKK3sKKyAgICBPTVhfRVJST1JUWVBFICAgICAgICAgIHJldCA9IE9NWF9FcnJvck5vbmU7CisgICAgU0VDX09NWF9CQVNFQ09NUE9ORU5UICpwU0VDQ29tcG9uZW50ID0gKFNFQ19PTVhfQkFTRUNPTVBPTkVOVCAqKXBPTVhDb21wb25lbnQtPnBDb21wb25lbnRQcml2YXRlOworICAgIC8qIFNFQ19PTVhfQkFTRVBPUlQgICAgICAqcFNFQ1BvcnQgPSAmcFNFQ0NvbXBvbmVudC0+cFNFQ1BvcnRbcG9ydEluZGV4XTsgKi8KKyAgICAvKiBTRUNfT01YX0RBVEFCVUZGRVIgICAgKmRhdGFCdWZmZXIgPSAmcFNFQ0NvbXBvbmVudC0+c2VjRGF0YUJ1ZmZlcltwb3J0SW5kZXhdOyAqLworICAgIC8qIE9NWF9CVUZGRVJIRUFERVJUWVBFICAqYnVmZmVySGVhZGVyID0gZGF0YUJ1ZmZlci0+YnVmZmVySGVhZGVyOyAqLworICAgIFNFQ19PTVhfREFUQSAgICAgICAgICAqcHJvY2Vzc0RhdGEgPSAmcFNFQ0NvbXBvbmVudC0+cHJvY2Vzc0RhdGFbcG9ydEluZGV4XTsKKworICAgIHByb2Nlc3NEYXRhLT5kYXRhTGVuICAgICAgID0gMDsKKyAgICBwcm9jZXNzRGF0YS0+cmVtYWluRGF0YUxlbiA9IDA7CisgICAgcHJvY2Vzc0RhdGEtPnVzZWREYXRhTGVuICAgPSAwOworICAgIHByb2Nlc3NEYXRhLT5uRmxhZ3MgICAgICAgID0gMDsKKyAgICBwcm9jZXNzRGF0YS0+dGltZVN0YW1wICAgICA9IDA7CisKKyAgICByZXR1cm4gcmV0OworfQorCitPTVhfQk9PTCBTRUNfUHJlcHJvY2Vzc29yX0lucHV0RGF0YShPTVhfQ09NUE9ORU5UVFlQRSAqcE9NWENvbXBvbmVudCkKK3sKKyAgICBPTVhfQk9PTCAgICAgICAgICAgICAgIHJldCA9IE9NWF9GQUxTRTsKKyAgICBTRUNfT01YX0JBU0VDT01QT05FTlQgKnBTRUNDb21wb25lbnQgPSAoU0VDX09NWF9CQVNFQ09NUE9ORU5UICopcE9NWENvbXBvbmVudC0+cENvbXBvbmVudFByaXZhdGU7CisgICAgU0VDX09NWF9CQVNFUE9SVCAgICAgICpzZWNJbnB1dFBvcnQgPSAmcFNFQ0NvbXBvbmVudC0+cFNFQ1BvcnRbSU5QVVRfUE9SVF9JTkRFWF07CisgICAgU0VDX09NWF9EQVRBQlVGRkVSICAgICppbnB1dFVzZUJ1ZmZlciA9ICZwU0VDQ29tcG9uZW50LT5zZWNEYXRhQnVmZmVyW0lOUFVUX1BPUlRfSU5ERVhdOworICAgIFNFQ19PTVhfREFUQSAgICAgICAgICAqaW5wdXREYXRhID0gJnBTRUNDb21wb25lbnQtPnByb2Nlc3NEYXRhW0lOUFVUX1BPUlRfSU5ERVhdOworICAgIE9NWF9VMzIgICAgICAgICAgICAgICAgY29weVNpemUgPSAwOworICAgIE9NWF9CWVRFICAgICAgICAgICAgICAgY2hlY2tJbnB1dFN0cmVhbSA9IE5VTEw7CisgICAgT01YX1UzMiAgICAgICAgICAgICAgICBjaGVja0lucHV0U3RyZWFtTGVuID0gMDsKKyAgICBPTVhfVTMyICAgICAgICAgICAgICAgIGNoZWNrZWRTaXplID0gMDsKKyAgICBPTVhfQk9PTCAgICAgICAgICAgICAgIGZsYWdFT0YgPSBPTVhfRkFMU0U7CisgICAgT01YX0JPT0wgICAgICAgICAgICAgICBwcmV2aW91c0ZyYW1lRU9GID0gT01YX0ZBTFNFOworCisgICAgRnVuY3Rpb25JbigpOworCisgICAgaWYgKGlucHV0VXNlQnVmZmVyLT5kYXRhVmFsaWQgPT0gT01YX1RSVUUpIHsKKyAgICAgICAgY2hlY2tJbnB1dFN0cmVhbSA9IGlucHV0VXNlQnVmZmVyLT5idWZmZXJIZWFkZXItPnBCdWZmZXIgKyBpbnB1dFVzZUJ1ZmZlci0+dXNlZERhdGFMZW47CisgICAgICAgIGNoZWNrSW5wdXRTdHJlYW1MZW4gPSBpbnB1dFVzZUJ1ZmZlci0+cmVtYWluRGF0YUxlbjsKKworICAgICAgICBpZiAoaW5wdXREYXRhLT5kYXRhTGVuID09IDApIHsKKyAgICAgICAgICAgIHByZXZpb3VzRnJhbWVFT0YgPSBPTVhfVFJVRTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHByZXZpb3VzRnJhbWVFT0YgPSBPTVhfRkFMU0U7CisgICAgICAgIH0KKworICAgICAgICAvKiBBdWRpbyBleHRyYWN0b3Igc2hvdWxkIHBhcnNlIGludG8gZnJhbWUgdW5pdHMuICovCisgICAgICAgIGZsYWdFT0YgPSBPTVhfVFJVRTsKKyAgICAgICAgY2hlY2tlZFNpemUgPSBjaGVja0lucHV0U3RyZWFtTGVuOworICAgICAgICBjb3B5U2l6ZSA9IGNoZWNrZWRTaXplOworCisgICAgICAgIGlmIChpbnB1dFVzZUJ1ZmZlci0+bkZsYWdzICYgT01YX0JVRkZFUkZMQUdfRU9TKQorICAgICAgICAgICAgcFNFQ0NvbXBvbmVudC0+YlNhdmVGbGFnRU9TID0gT01YX1RSVUU7CisKKyAgICAgICAgaWYgKCgoaW5wdXREYXRhLT5hbGxvY1NpemUpIC0gKGlucHV0RGF0YS0+ZGF0YUxlbikpID49IGNvcHlTaXplKSB7CisgICAgICAgICAgICBpZiAoY29weVNpemUgPiAwKQorICAgICAgICAgICAgICAgIFNFQ19PU0FMX01lbWNweShpbnB1dERhdGEtPmRhdGFCdWZmZXIgKyBpbnB1dERhdGEtPmRhdGFMZW4sIGNoZWNrSW5wdXRTdHJlYW0sIGNvcHlTaXplKTsKKworICAgICAgICAgICAgaW5wdXRVc2VCdWZmZXItPmRhdGFMZW4gLT0gY29weVNpemU7CisgICAgICAgICAgICBpbnB1dFVzZUJ1ZmZlci0+cmVtYWluRGF0YUxlbiAtPSBjb3B5U2l6ZTsKKyAgICAgICAgICAgIGlucHV0VXNlQnVmZmVyLT51c2VkRGF0YUxlbiArPSBjb3B5U2l6ZTsKKworICAgICAgICAgICAgaW5wdXREYXRhLT5kYXRhTGVuICs9IGNvcHlTaXplOworICAgICAgICAgICAgaW5wdXREYXRhLT5yZW1haW5EYXRhTGVuICs9IGNvcHlTaXplOworCisgICAgICAgICAgICBpZiAocHJldmlvdXNGcmFtZUVPRiA9PSBPTVhfVFJVRSkgeworICAgICAgICAgICAgICAgIGlucHV0RGF0YS0+dGltZVN0YW1wID0gaW5wdXRVc2VCdWZmZXItPnRpbWVTdGFtcDsKKyAgICAgICAgICAgICAgICBpbnB1dERhdGEtPm5GbGFncyA9IGlucHV0VXNlQnVmZmVyLT5uRmxhZ3M7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGlmIChwU0VDQ29tcG9uZW50LT5iVXNlRmxhZ0VPRiA9PSBPTVhfVFJVRSkgeworICAgICAgICAgICAgICAgIGlmIChwU0VDQ29tcG9uZW50LT5iU2F2ZUZsYWdFT1MgPT0gT01YX1RSVUUpIHsKKyAgICAgICAgICAgICAgICAgICAgaW5wdXREYXRhLT5uRmxhZ3MgfD0gT01YX0JVRkZFUkZMQUdfRU9TOworICAgICAgICAgICAgICAgICAgICBmbGFnRU9GID0gT01YX1RSVUU7CisgICAgICAgICAgICAgICAgICAgIHBTRUNDb21wb25lbnQtPmJTYXZlRmxhZ0VPUyA9IE9NWF9GQUxTRTsKKyAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICBpbnB1dERhdGEtPm5GbGFncyA9IChpbnB1dERhdGEtPm5GbGFncyAmICh+T01YX0JVRkZFUkZMQUdfRU9TKSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBpZiAoKGNoZWNrZWRTaXplID09IGNoZWNrSW5wdXRTdHJlYW1MZW4pICYmIChwU0VDQ29tcG9uZW50LT5iU2F2ZUZsYWdFT1MgPT0gT01YX1RSVUUpKSB7CisgICAgICAgICAgICAgICAgICAgIGlmICgoaW5wdXRVc2VCdWZmZXItPm5GbGFncyAmIE9NWF9CVUZGRVJGTEFHX0VPUykgJiYKKyAgICAgICAgICAgICAgICAgICAgICAgICgoaW5wdXREYXRhLT5uRmxhZ3MgJiBPTVhfQlVGRkVSRkxBR19DT0RFQ0NPTkZJRykgfHwKKyAgICAgICAgICAgICAgICAgICAgICAgIChpbnB1dERhdGEtPmRhdGFMZW4gPT0gMCkpKSB7CisgICAgICAgICAgICAgICAgICAgIGlucHV0RGF0YS0+bkZsYWdzIHw9IE9NWF9CVUZGRVJGTEFHX0VPUzsKKyAgICAgICAgICAgICAgICAgICAgZmxhZ0VPRiA9IE9NWF9UUlVFOworICAgICAgICAgICAgICAgICAgICBwU0VDQ29tcG9uZW50LT5iU2F2ZUZsYWdFT1MgPSBPTVhfRkFMU0U7CisgICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoKGlucHV0VXNlQnVmZmVyLT5uRmxhZ3MgJiBPTVhfQlVGRkVSRkxBR19FT1MpICYmCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKCEoaW5wdXREYXRhLT5uRmxhZ3MgJiBPTVhfQlVGRkVSRkxBR19DT0RFQ0NPTkZJRykpICYmCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGlucHV0RGF0YS0+ZGF0YUxlbiAhPSAwKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgaW5wdXREYXRhLT5uRmxhZ3MgPSAoaW5wdXREYXRhLT5uRmxhZ3MgJiAofk9NWF9CVUZGRVJGTEFHX0VPUykpOworICAgICAgICAgICAgICAgICAgICAgICAgZmxhZ0VPRiA9IE9NWF9UUlVFOworICAgICAgICAgICAgICAgICAgICAgICAgcFNFQ0NvbXBvbmVudC0+YlNhdmVGbGFnRU9TID0gT01YX1RSVUU7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICBpbnB1dERhdGEtPm5GbGFncyA9IChpbnB1dFVzZUJ1ZmZlci0+bkZsYWdzICYgKH5PTVhfQlVGRkVSRkxBR19FT1MpKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAvKj8/Pz8/Pz8/Pz8/Pz8/Pz8/Pz8/Pz8/Pz8/Pz8/Pz8/PyBFcnJvciA/Pz8/Pz8/Pz8/Pz8/Pz8/Pz8/Pz8/Pz8/Pz8/Pz8/Pz8qLworICAgICAgICAgICAgU0VDX0RhdGFSZXNldChwT01YQ29tcG9uZW50LCBJTlBVVF9QT1JUX0lOREVYKTsKKyAgICAgICAgICAgIGZsYWdFT0YgPSBPTVhfRkFMU0U7CisgICAgICAgIH0KKworICAgICAgICBpZiAoKGlucHV0VXNlQnVmZmVyLT5yZW1haW5EYXRhTGVuID09IDApIHx8CisgICAgICAgICAgICAoQ0hFQ0tfUE9SVF9CRUlOR19GTFVTSEVEKHNlY0lucHV0UG9ydCkpKQorICAgICAgICAgICAgU0VDX0lucHV0QnVmZmVyUmV0dXJuKHBPTVhDb21wb25lbnQpOworICAgICAgICBlbHNlCisgICAgICAgICAgICBpbnB1dFVzZUJ1ZmZlci0+ZGF0YVZhbGlkID0gT01YX1RSVUU7CisgICAgfQorCisgICAgaWYgKGZsYWdFT0YgPT0gT01YX1RSVUUpIHsKKyAgICAgICAgaWYgKHBTRUNDb21wb25lbnQtPmNoZWNrVGltZVN0YW1wLm5lZWRTZXRTdGFydFRpbWVTdGFtcCA9PSBPTVhfVFJVRSkgeworICAgICAgICAgICAgLyogRmx1c2ggU1JQIGJ1ZmZlcnMgKi8KKyAgICAgICAgICAgIFNSUF9GbHVzaCgpOworCisgICAgICAgICAgICBwU0VDQ29tcG9uZW50LT5jaGVja1RpbWVTdGFtcC5uZWVkQ2hlY2tTdGFydFRpbWVTdGFtcCA9IE9NWF9UUlVFOworICAgICAgICAgICAgcFNFQ0NvbXBvbmVudC0+Y2hlY2tUaW1lU3RhbXAuc3RhcnRUaW1lU3RhbXAgPSBpbnB1dERhdGEtPnRpbWVTdGFtcDsKKyAgICAgICAgICAgIHBTRUNDb21wb25lbnQtPmNoZWNrVGltZVN0YW1wLm5TdGFydEZsYWdzID0gaW5wdXREYXRhLT5uRmxhZ3M7CisgICAgICAgICAgICBwU0VDQ29tcG9uZW50LT5jaGVja1RpbWVTdGFtcC5uZWVkU2V0U3RhcnRUaW1lU3RhbXAgPSBPTVhfRkFMU0U7CisgICAgICAgICAgICBTRUNfT1NBTF9Mb2coU0VDX0xPR19UUkFDRSwgImZpcnN0IGZyYW1lIHRpbWVzdGFtcCBhZnRlciBzZWVraW5nICVsbGQgdXMgKCUuMmYgc2VjcykiLAorICAgICAgICAgICAgICAgIGlucHV0RGF0YS0+dGltZVN0YW1wLCBpbnB1dERhdGEtPnRpbWVTdGFtcCAvIDFFNik7CisgICAgICAgIH0KKworICAgICAgICByZXQgPSBPTVhfVFJVRTsKKyAgICB9IGVsc2UgeworICAgICAgICByZXQgPSBPTVhfRkFMU0U7CisgICAgfQorCisgICAgRnVuY3Rpb25PdXQoKTsKKworICAgIHJldHVybiByZXQ7Cit9CisKK09NWF9CT09MIFNFQ19Qb3N0cHJvY2Vzc19PdXRwdXREYXRhKE9NWF9DT01QT05FTlRUWVBFICpwT01YQ29tcG9uZW50KQoreworICAgIE9NWF9CT09MICAgICAgICAgICAgICAgcmV0ID0gT01YX0ZBTFNFOworICAgIFNFQ19PTVhfQkFTRUNPTVBPTkVOVCAqcFNFQ0NvbXBvbmVudCA9IChTRUNfT01YX0JBU0VDT01QT05FTlQgKilwT01YQ29tcG9uZW50LT5wQ29tcG9uZW50UHJpdmF0ZTsKKyAgICBTRUNfT01YX0JBU0VQT1JUICAgICAgKnNlY091dHB1dFBvcnQgPSAmcFNFQ0NvbXBvbmVudC0+cFNFQ1BvcnRbT1VUUFVUX1BPUlRfSU5ERVhdOworICAgIFNFQ19PTVhfREFUQUJVRkZFUiAgICAqb3V0cHV0VXNlQnVmZmVyID0gJnBTRUNDb21wb25lbnQtPnNlY0RhdGFCdWZmZXJbT1VUUFVUX1BPUlRfSU5ERVhdOworICAgIFNFQ19PTVhfREFUQSAgICAgICAgICAqb3V0cHV0RGF0YSA9ICZwU0VDQ29tcG9uZW50LT5wcm9jZXNzRGF0YVtPVVRQVVRfUE9SVF9JTkRFWF07CisgICAgT01YX1UzMiAgICAgICAgICAgICAgICBjb3B5U2l6ZSA9IDA7CisKKyAgICBGdW5jdGlvbkluKCk7CisKKyAgICBpZiAob3V0cHV0VXNlQnVmZmVyLT5kYXRhVmFsaWQgPT0gT01YX1RSVUUpIHsKKyAgICAgICAgaWYgKHBTRUNDb21wb25lbnQtPmNoZWNrVGltZVN0YW1wLm5lZWRDaGVja1N0YXJ0VGltZVN0YW1wID09IE9NWF9UUlVFKSB7CisgICAgICAgICAgICBpZiAocFNFQ0NvbXBvbmVudC0+Y2hlY2tUaW1lU3RhbXAuc3RhcnRUaW1lU3RhbXAgPT0gb3V0cHV0RGF0YS0+dGltZVN0YW1wKSB7CisgICAgICAgICAgICAgICAgcFNFQ0NvbXBvbmVudC0+Y2hlY2tUaW1lU3RhbXAuc3RhcnRUaW1lU3RhbXAgPSAtMTk3NjExMjM7CisgICAgICAgICAgICAgICAgcFNFQ0NvbXBvbmVudC0+Y2hlY2tUaW1lU3RhbXAublN0YXJ0RmxhZ3MgPSAweDA7CisgICAgICAgICAgICAgICAgcFNFQ0NvbXBvbmVudC0+Y2hlY2tUaW1lU3RhbXAubmVlZFNldFN0YXJ0VGltZVN0YW1wID0gT01YX0ZBTFNFOworICAgICAgICAgICAgICAgIHBTRUNDb21wb25lbnQtPmNoZWNrVGltZVN0YW1wLm5lZWRDaGVja1N0YXJ0VGltZVN0YW1wID0gT01YX0ZBTFNFOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBTRUNfRGF0YVJlc2V0KHBPTVhDb21wb25lbnQsIE9VVFBVVF9QT1JUX0lOREVYKTsKKyAgICAgICAgICAgICAgICByZXQgPSBPTVhfVFJVRTsKKyAgICAgICAgICAgICAgICBnb3RvIEVYSVQ7CisgICAgICAgICAgICB9CisgICAgICAgIH0gZWxzZSBpZiAocFNFQ0NvbXBvbmVudC0+Y2hlY2tUaW1lU3RhbXAubmVlZFNldFN0YXJ0VGltZVN0YW1wID09IE9NWF9UUlVFKSB7CisgICAgICAgICAgICBTRUNfRGF0YVJlc2V0KHBPTVhDb21wb25lbnQsIE9VVFBVVF9QT1JUX0lOREVYKTsKKyAgICAgICAgICAgIHJldCA9IE9NWF9UUlVFOworICAgICAgICAgICAgZ290byBFWElUOworICAgICAgICB9CisKKyAgICAgICAgaWYgKG91dHB1dERhdGEtPnJlbWFpbkRhdGFMZW4gPD0gKG91dHB1dFVzZUJ1ZmZlci0+YWxsb2NTaXplIC0gb3V0cHV0VXNlQnVmZmVyLT5kYXRhTGVuKSkgeworICAgICAgICAgICAgY29weVNpemUgPSBvdXRwdXREYXRhLT5yZW1haW5EYXRhTGVuOworCisgICAgICAgICAgICBvdXRwdXRVc2VCdWZmZXItPmRhdGFMZW4gKz0gY29weVNpemU7CisgICAgICAgICAgICBvdXRwdXRVc2VCdWZmZXItPnJlbWFpbkRhdGFMZW4gKz0gY29weVNpemU7CisgICAgICAgICAgICBvdXRwdXRVc2VCdWZmZXItPm5GbGFncyA9IG91dHB1dERhdGEtPm5GbGFnczsKKyAgICAgICAgICAgIG91dHB1dFVzZUJ1ZmZlci0+dGltZVN0YW1wID0gb3V0cHV0RGF0YS0+dGltZVN0YW1wOworCisgICAgICAgICAgICByZXQgPSBPTVhfVFJVRTsKKworICAgICAgICAgICAgLyogcmVzZXQgb3V0cHV0RGF0YSAqLworICAgICAgICAgICAgU0VDX0RhdGFSZXNldChwT01YQ29tcG9uZW50LCBPVVRQVVRfUE9SVF9JTkRFWCk7CisKKyAgICAgICAgICAgIGlmICgob3V0cHV0VXNlQnVmZmVyLT5yZW1haW5EYXRhTGVuID4gMCkgfHwKKyAgICAgICAgICAgICAgICAob3V0cHV0VXNlQnVmZmVyLT5uRmxhZ3MgJiBPTVhfQlVGRkVSRkxBR19FT1MpIHx8CisgICAgICAgICAgICAgICAgKENIRUNLX1BPUlRfQkVJTkdfRkxVU0hFRChzZWNPdXRwdXRQb3J0KSkpCisgICAgICAgICAgICAgICAgU0VDX091dHB1dEJ1ZmZlclJldHVybihwT01YQ29tcG9uZW50KTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIFNFQ19PU0FMX0xvZyhTRUNfTE9HX0VSUk9SLCAib3V0cHV0IGJ1ZmZlciBpcyBzbWFsbGVyIHRoYW4gZGVjb2RlZCBkYXRhIHNpemUgT3V0IExlbmd0aCIpOworCisgICAgICAgICAgICByZXQgPSBPTVhfRkFMU0U7CisKKyAgICAgICAgICAgIC8qIHJlc2V0IG91dHB1dERhdGEgKi8KKyAgICAgICAgICAgIFNFQ19EYXRhUmVzZXQocE9NWENvbXBvbmVudCwgT1VUUFVUX1BPUlRfSU5ERVgpOworICAgICAgICB9CisgICAgfSBlbHNlIHsKKyAgICAgICAgcmV0ID0gT01YX0ZBTFNFOworICAgIH0KKworRVhJVDoKKyAgICBGdW5jdGlvbk91dCgpOworCisgICAgcmV0dXJuIHJldDsKK30KKworT01YX0VSUk9SVFlQRSBTRUNfT01YX0J1ZmZlclByb2Nlc3MoT01YX0hBTkRMRVRZUEUgaENvbXBvbmVudCkKK3sKKyAgICBPTVhfRVJST1JUWVBFICAgICAgICAgIHJldCA9IE9NWF9FcnJvck5vbmU7CisgICAgT01YX0NPTVBPTkVOVFRZUEUgICAgICpwT01YQ29tcG9uZW50ID0gKE9NWF9DT01QT05FTlRUWVBFICopaENvbXBvbmVudDsKKyAgICBTRUNfT01YX0JBU0VDT01QT05FTlQgKnBTRUNDb21wb25lbnQgPSAoU0VDX09NWF9CQVNFQ09NUE9ORU5UICopcE9NWENvbXBvbmVudC0+cENvbXBvbmVudFByaXZhdGU7CisgICAgU0VDX09NWF9BVURJT0RFQ19DT01QT05FTlQgKnBWaWRlb0RlYyA9IChTRUNfT01YX0FVRElPREVDX0NPTVBPTkVOVCAqKXBTRUNDb21wb25lbnQtPmhDb21wb25lbnRIYW5kbGU7CisgICAgU0VDX09NWF9CQVNFUE9SVCAgICAgICpzZWNJbnB1dFBvcnQgPSAmcFNFQ0NvbXBvbmVudC0+cFNFQ1BvcnRbSU5QVVRfUE9SVF9JTkRFWF07CisgICAgU0VDX09NWF9CQVNFUE9SVCAgICAgICpzZWNPdXRwdXRQb3J0ID0gJnBTRUNDb21wb25lbnQtPnBTRUNQb3J0W09VVFBVVF9QT1JUX0lOREVYXTsKKyAgICBTRUNfT01YX0RBVEFCVUZGRVIgICAgKmlucHV0VXNlQnVmZmVyID0gJnBTRUNDb21wb25lbnQtPnNlY0RhdGFCdWZmZXJbSU5QVVRfUE9SVF9JTkRFWF07CisgICAgU0VDX09NWF9EQVRBQlVGRkVSICAgICpvdXRwdXRVc2VCdWZmZXIgPSAmcFNFQ0NvbXBvbmVudC0+c2VjRGF0YUJ1ZmZlcltPVVRQVVRfUE9SVF9JTkRFWF07CisgICAgU0VDX09NWF9EQVRBICAgICAgICAgICppbnB1dERhdGEgPSAmcFNFQ0NvbXBvbmVudC0+cHJvY2Vzc0RhdGFbSU5QVVRfUE9SVF9JTkRFWF07CisgICAgU0VDX09NWF9EQVRBICAgICAgICAgICpvdXRwdXREYXRhID0gJnBTRUNDb21wb25lbnQtPnByb2Nlc3NEYXRhW09VVFBVVF9QT1JUX0lOREVYXTsKKyAgICBPTVhfVTMyICAgICAgICAgICAgICAgIGNvcHlTaXplID0gMDsKKworICAgIHBTRUNDb21wb25lbnQtPnJlbWFpbk91dHB1dERhdGEgPSBPTVhfRkFMU0U7CisgICAgcFNFQ0NvbXBvbmVudC0+cmVJbnB1dERhdGEgPSBPTVhfRkFMU0U7CisKKyAgICBGdW5jdGlvbkluKCk7CisKKyAgICB3aGlsZSAoIXBTRUNDb21wb25lbnQtPmJFeGl0QnVmZmVyUHJvY2Vzc1RocmVhZCkgeworICAgICAgICBTRUNfT1NBTF9TbGVlcE1pbGxpc2VjKDApOworCisgICAgICAgIGlmICgoKHBTRUNDb21wb25lbnQtPmN1cnJlbnRTdGF0ZSA9PSBPTVhfU3RhdGVQYXVzZSkgfHwKKyAgICAgICAgICAgIChwU0VDQ29tcG9uZW50LT5jdXJyZW50U3RhdGUgPT0gT01YX1N0YXRlSWRsZSkgfHwKKyAgICAgICAgICAgIChwU0VDQ29tcG9uZW50LT50cmFuc2llbnRTdGF0ZSA9PSBTRUNfT01YX1RyYW5zU3RhdGVMb2FkZWRUb0lkbGUpIHx8CisgICAgICAgICAgICAocFNFQ0NvbXBvbmVudC0+dHJhbnNpZW50U3RhdGUgPT0gU0VDX09NWF9UcmFuc1N0YXRlRXhlY3V0aW5nVG9JZGxlKSkgJiYKKyAgICAgICAgICAgIChwU0VDQ29tcG9uZW50LT50cmFuc2llbnRTdGF0ZSAhPSBTRUNfT01YX1RyYW5zU3RhdGVJZGxlVG9Mb2FkZWQpJiYKKyAgICAgICAgICAgICgoIUNIRUNLX1BPUlRfQkVJTkdfRkxVU0hFRChzZWNJbnB1dFBvcnQpICYmICFDSEVDS19QT1JUX0JFSU5HX0ZMVVNIRUQoc2VjT3V0cHV0UG9ydCkpKSkgeworICAgICAgICAgICAgU0VDX09TQUxfU2lnbmFsV2FpdChwU0VDQ29tcG9uZW50LT5wYXVzZUV2ZW50LCBERUZfTUFYX1dBSVRfVElNRSk7CisgICAgICAgICAgICBTRUNfT1NBTF9TaWduYWxSZXNldChwU0VDQ29tcG9uZW50LT5wYXVzZUV2ZW50KTsKKyAgICAgICAgfQorCisgICAgICAgIHdoaWxlICgoU0VDX0NoZWNrX0J1ZmZlclByb2Nlc3NfU3RhdGUocFNFQ0NvbXBvbmVudCkpICYmICghcFNFQ0NvbXBvbmVudC0+YkV4aXRCdWZmZXJQcm9jZXNzVGhyZWFkKSkgeworICAgICAgICAgICAgU0VDX09TQUxfU2xlZXBNaWxsaXNlYygwKTsKKworICAgICAgICAgICAgU0VDX09TQUxfTXV0ZXhMb2NrKG91dHB1dFVzZUJ1ZmZlci0+YnVmZmVyTXV0ZXgpOworICAgICAgICAgICAgaWYgKChvdXRwdXRVc2VCdWZmZXItPmRhdGFWYWxpZCAhPSBPTVhfVFJVRSkgJiYKKyAgICAgICAgICAgICAgICAoIUNIRUNLX1BPUlRfQkVJTkdfRkxVU0hFRChzZWNPdXRwdXRQb3J0KSkpIHsKKyAgICAgICAgICAgICAgICBTRUNfT1NBTF9NdXRleFVubG9jayhvdXRwdXRVc2VCdWZmZXItPmJ1ZmZlck11dGV4KTsKKyAgICAgICAgICAgICAgICByZXQgPSBTRUNfT3V0cHV0QnVmZmVyR2V0UXVldWUocFNFQ0NvbXBvbmVudCk7CisgICAgICAgICAgICAgICAgaWYgKChyZXQgPT0gT01YX0Vycm9yVW5kZWZpbmVkKSB8fAorICAgICAgICAgICAgICAgICAgICAoc2VjSW5wdXRQb3J0LT5wb3J0U3RhdGUgIT0gT01YX1N0YXRlSWRsZSkgfHwKKyAgICAgICAgICAgICAgICAgICAgKHNlY091dHB1dFBvcnQtPnBvcnRTdGF0ZSAhPSBPTVhfU3RhdGVJZGxlKSkgeworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIFNFQ19PU0FMX011dGV4VW5sb2NrKG91dHB1dFVzZUJ1ZmZlci0+YnVmZmVyTXV0ZXgpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBpZiAocFNFQ0NvbXBvbmVudC0+cmVtYWluT3V0cHV0RGF0YSA9PSBPTVhfRkFMU0UpIHsKKyAgICAgICAgICAgICAgICBpZiAocFNFQ0NvbXBvbmVudC0+cmVJbnB1dERhdGEgPT0gT01YX0ZBTFNFKSB7CisgICAgICAgICAgICAgICAgICAgIFNFQ19PU0FMX011dGV4TG9jayhpbnB1dFVzZUJ1ZmZlci0+YnVmZmVyTXV0ZXgpOworICAgICAgICAgICAgICAgICAgICBpZiAoKFNFQ19QcmVwcm9jZXNzb3JfSW5wdXREYXRhKHBPTVhDb21wb25lbnQpID09IE9NWF9GQUxTRSkgJiYKKyAgICAgICAgICAgICAgICAgICAgICAgICghQ0hFQ0tfUE9SVF9CRUlOR19GTFVTSEVEKHNlY0lucHV0UG9ydCkpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgU0VDX09TQUxfTXV0ZXhVbmxvY2soaW5wdXRVc2VCdWZmZXItPmJ1ZmZlck11dGV4KTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXQgPSBTRUNfSW5wdXRCdWZmZXJHZXRRdWV1ZShwU0VDQ29tcG9uZW50KTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgIFNFQ19PU0FMX011dGV4VW5sb2NrKGlucHV0VXNlQnVmZmVyLT5idWZmZXJNdXRleCk7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgU0VDX09TQUxfTXV0ZXhMb2NrKGlucHV0VXNlQnVmZmVyLT5idWZmZXJNdXRleCk7CisgICAgICAgICAgICAgICAgU0VDX09TQUxfTXV0ZXhMb2NrKG91dHB1dFVzZUJ1ZmZlci0+YnVmZmVyTXV0ZXgpOworICAgICAgICAgICAgICAgIHJldCA9IHBTRUNDb21wb25lbnQtPnNlY19tZmNfYnVmZmVyUHJvY2VzcyhwT01YQ29tcG9uZW50LCBpbnB1dERhdGEsIG91dHB1dERhdGEpOworICAgICAgICAgICAgICAgIFNFQ19PU0FMX011dGV4VW5sb2NrKG91dHB1dFVzZUJ1ZmZlci0+YnVmZmVyTXV0ZXgpOworICAgICAgICAgICAgICAgIFNFQ19PU0FMX011dGV4VW5sb2NrKGlucHV0VXNlQnVmZmVyLT5idWZmZXJNdXRleCk7CisKKyAgICAgICAgICAgICAgICBpZiAocmV0ID09IE9NWF9FcnJvcklucHV0RGF0YURlY29kZVlldCkKKyAgICAgICAgICAgICAgICAgICAgcFNFQ0NvbXBvbmVudC0+cmVJbnB1dERhdGEgPSBPTVhfVFJVRTsKKyAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgIHBTRUNDb21wb25lbnQtPnJlSW5wdXREYXRhID0gT01YX0ZBTFNFOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBTRUNfT1NBTF9NdXRleExvY2sob3V0cHV0VXNlQnVmZmVyLT5idWZmZXJNdXRleCk7CisKKyAgICAgICAgICAgIGlmIChTRUNfUG9zdHByb2Nlc3NfT3V0cHV0RGF0YShwT01YQ29tcG9uZW50KSA9PSBPTVhfRkFMU0UpCisgICAgICAgICAgICAgICAgcFNFQ0NvbXBvbmVudC0+cmVtYWluT3V0cHV0RGF0YSA9IE9NWF9UUlVFOworICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgIHBTRUNDb21wb25lbnQtPnJlbWFpbk91dHB1dERhdGEgPSBPTVhfRkFMU0U7CisKKyAgICAgICAgICAgIFNFQ19PU0FMX011dGV4VW5sb2NrKG91dHB1dFVzZUJ1ZmZlci0+YnVmZmVyTXV0ZXgpOworICAgICAgICB9CisgICAgfQorCitFWElUOgorCisgICAgRnVuY3Rpb25PdXQoKTsKKworICAgIHJldHVybiByZXQ7Cit9CisKK09NWF9FUlJPUlRZUEUgU0VDX09NWF9BdWRpb0RlY29kZUdldFBhcmFtZXRlcigKKyAgICBPTVhfSU4gT01YX0hBTkRMRVRZUEUgaENvbXBvbmVudCwKKyAgICBPTVhfSU4gT01YX0lOREVYVFlQRSAgblBhcmFtSW5kZXgsCisgICAgT01YX0lOT1VUIE9NWF9QVFIgICAgIENvbXBvbmVudFBhcmFtZXRlclN0cnVjdHVyZSkKK3sKKyAgICBPTVhfRVJST1JUWVBFICAgICAgICAgIHJldCA9IE9NWF9FcnJvck5vbmU7CisgICAgT01YX0NPTVBPTkVOVFRZUEUgICAgICpwT01YQ29tcG9uZW50ID0gTlVMTDsKKyAgICBTRUNfT01YX0JBU0VDT01QT05FTlQgKnBTRUNDb21wb25lbnQgPSBOVUxMOworICAgIFNFQ19PTVhfQkFTRVBPUlQgICAgICAqcFNFQ1BvcnQgPSBOVUxMOworCisgICAgRnVuY3Rpb25JbigpOworCisgICAgaWYgKGhDb21wb25lbnQgPT0gTlVMTCkgeworICAgICAgICByZXQgPSBPTVhfRXJyb3JCYWRQYXJhbWV0ZXI7CisgICAgICAgIGdvdG8gRVhJVDsKKyAgICB9CisgICAgcE9NWENvbXBvbmVudCA9IChPTVhfQ09NUE9ORU5UVFlQRSAqKWhDb21wb25lbnQ7CisgICAgcmV0ID0gU0VDX09NWF9DaGVja19TaXplVmVyc2lvbihwT01YQ29tcG9uZW50LCBzaXplb2YoT01YX0NPTVBPTkVOVFRZUEUpKTsKKyAgICBpZiAocmV0ICE9IE9NWF9FcnJvck5vbmUpIHsKKyAgICAgICAgZ290byBFWElUOworICAgIH0KKworICAgIGlmIChwT01YQ29tcG9uZW50LT5wQ29tcG9uZW50UHJpdmF0ZSA9PSBOVUxMKSB7CisgICAgICAgIHJldCA9IE9NWF9FcnJvckJhZFBhcmFtZXRlcjsKKyAgICAgICAgZ290byBFWElUOworICAgIH0KKyAgICBwU0VDQ29tcG9uZW50ID0gKFNFQ19PTVhfQkFTRUNPTVBPTkVOVCAqKXBPTVhDb21wb25lbnQtPnBDb21wb25lbnRQcml2YXRlOworCisgICAgaWYgKHBTRUNDb21wb25lbnQtPmN1cnJlbnRTdGF0ZSA9PSBPTVhfU3RhdGVJbnZhbGlkICkgeworICAgICAgICByZXQgPSBPTVhfRXJyb3JJbnZhbGlkU3RhdGU7CisgICAgICAgIGdvdG8gRVhJVDsKKyAgICB9CisKKyAgICBpZiAoQ29tcG9uZW50UGFyYW1ldGVyU3RydWN0dXJlID09IE5VTEwpIHsKKyAgICAgICAgcmV0ID0gT01YX0Vycm9yQmFkUGFyYW1ldGVyOworICAgICAgICBnb3RvIEVYSVQ7CisgICAgfQorCisgICAgc3dpdGNoIChuUGFyYW1JbmRleCkgeworICAgIGNhc2UgT01YX0luZGV4UGFyYW1BdWRpb0luaXQ6CisgICAgeworICAgICAgICBPTVhfUE9SVF9QQVJBTV9UWVBFICpwb3J0UGFyYW0gPSAoT01YX1BPUlRfUEFSQU1fVFlQRSAqKUNvbXBvbmVudFBhcmFtZXRlclN0cnVjdHVyZTsKKyAgICAgICAgcmV0ID0gU0VDX09NWF9DaGVja19TaXplVmVyc2lvbihwb3J0UGFyYW0sIHNpemVvZihPTVhfUE9SVF9QQVJBTV9UWVBFKSk7CisgICAgICAgIGlmIChyZXQgIT0gT01YX0Vycm9yTm9uZSkgeworICAgICAgICAgICAgZ290byBFWElUOworICAgICAgICB9CisKKyAgICAgICAgcG9ydFBhcmFtLT5uUG9ydHMgICAgICAgICAgID0gcFNFQ0NvbXBvbmVudC0+cG9ydFBhcmFtLm5Qb3J0czsKKyAgICAgICAgcG9ydFBhcmFtLT5uU3RhcnRQb3J0TnVtYmVyID0gcFNFQ0NvbXBvbmVudC0+cG9ydFBhcmFtLm5TdGFydFBvcnROdW1iZXI7CisgICAgICAgIHJldCA9IE9NWF9FcnJvck5vbmU7CisgICAgfQorICAgICAgICBicmVhazsKKyAgICBjYXNlIE9NWF9JbmRleFBhcmFtQXVkaW9Qb3J0Rm9ybWF0OgorICAgIHsKKyAgICAgICAgT01YX0FVRElPX1BBUkFNX1BPUlRGT1JNQVRUWVBFICpwb3J0Rm9ybWF0ID0gKE9NWF9BVURJT19QQVJBTV9QT1JURk9STUFUVFlQRSAqKUNvbXBvbmVudFBhcmFtZXRlclN0cnVjdHVyZTsKKyAgICAgICAgT01YX1UzMiAgICAgICAgICAgICAgICAgICAgICAgICBwb3J0SW5kZXggPSBwb3J0Rm9ybWF0LT5uUG9ydEluZGV4OworICAgICAgICBPTVhfVTMyICAgICAgICAgICAgICAgICAgICAgICAgIGluZGV4ICAgID0gcG9ydEZvcm1hdC0+bkluZGV4OworICAgICAgICBTRUNfT01YX0JBU0VQT1JUICAgICAgICAgICAgICAgKnBTRUNQb3J0ID0gTlVMTDsKKyAgICAgICAgT01YX1BBUkFNX1BPUlRERUZJTklUSU9OVFlQRSAgICpwb3J0RGVmaW5pdGlvbiA9IE5VTEw7CisgICAgICAgIE9NWF9VMzIgICAgICAgICAgICAgICAgICAgICAgICAgc3VwcG9ydEZvcm1hdE51bSA9IDA7IC8qIHN1cHBvcnRGb3JtYXROdW0gPSBOLTEgKi8KKworICAgICAgICByZXQgPSBTRUNfT01YX0NoZWNrX1NpemVWZXJzaW9uKHBvcnRGb3JtYXQsIHNpemVvZihPTVhfQVVESU9fUEFSQU1fUE9SVEZPUk1BVFRZUEUpKTsKKyAgICAgICAgaWYgKHJldCAhPSBPTVhfRXJyb3JOb25lKSB7CisgICAgICAgICAgICBnb3RvIEVYSVQ7CisgICAgICAgIH0KKworICAgICAgICBpZiAoKHBvcnRJbmRleCA+PSBwU0VDQ29tcG9uZW50LT5wb3J0UGFyYW0ublBvcnRzKSkgeworICAgICAgICAgICAgcmV0ID0gT01YX0Vycm9yQmFkUG9ydEluZGV4OworICAgICAgICAgICAgZ290byBFWElUOworICAgICAgICB9CisKKworICAgICAgICBpZiAocG9ydEluZGV4ID09IElOUFVUX1BPUlRfSU5ERVgpIHsKKyAgICAgICAgICAgIHN1cHBvcnRGb3JtYXROdW0gPSBJTlBVVF9QT1JUX1NVUFBPUlRGT1JNQVRfTlVNX01BWCAtIDE7CisgICAgICAgICAgICBpZiAoaW5kZXggPiBzdXBwb3J0Rm9ybWF0TnVtKSB7CisgICAgICAgICAgICAgICAgcmV0ID0gT01YX0Vycm9yTm9Nb3JlOworICAgICAgICAgICAgICAgIGdvdG8gRVhJVDsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgcFNFQ1BvcnQgPSAmcFNFQ0NvbXBvbmVudC0+cFNFQ1BvcnRbSU5QVVRfUE9SVF9JTkRFWF07CisgICAgICAgICAgICBwb3J0RGVmaW5pdGlvbiA9ICZwU0VDUG9ydC0+cG9ydERlZmluaXRpb247CisKKyAgICAgICAgICAgIHBvcnRGb3JtYXQtPmVFbmNvZGluZyA9IHBvcnREZWZpbml0aW9uLT5mb3JtYXQuYXVkaW8uZUVuY29kaW5nOworICAgICAgICB9IGVsc2UgaWYgKHBvcnRJbmRleCA9PSBPVVRQVVRfUE9SVF9JTkRFWCkgeworICAgICAgICAgICAgc3VwcG9ydEZvcm1hdE51bSA9IE9VVFBVVF9QT1JUX1NVUFBPUlRGT1JNQVRfTlVNX01BWCAtIDE7CisgICAgICAgICAgICBpZiAoaW5kZXggPiBzdXBwb3J0Rm9ybWF0TnVtKSB7CisgICAgICAgICAgICAgICAgcmV0ID0gT01YX0Vycm9yTm9Nb3JlOworICAgICAgICAgICAgICAgIGdvdG8gRVhJVDsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgcFNFQ1BvcnQgPSAmcFNFQ0NvbXBvbmVudC0+cFNFQ1BvcnRbT1VUUFVUX1BPUlRfSU5ERVhdOworICAgICAgICAgICAgcG9ydERlZmluaXRpb24gPSAmcFNFQ1BvcnQtPnBvcnREZWZpbml0aW9uOworCisgICAgICAgICAgICBwb3J0Rm9ybWF0LT5lRW5jb2RpbmcgPSBwb3J0RGVmaW5pdGlvbi0+Zm9ybWF0LmF1ZGlvLmVFbmNvZGluZzsKKyAgICAgICAgfQorICAgICAgICByZXQgPSBPTVhfRXJyb3JOb25lOworICAgIH0KKyAgICAgICAgYnJlYWs7CisgICAgZGVmYXVsdDoKKyAgICB7CisgICAgICAgIHJldCA9IFNFQ19PTVhfR2V0UGFyYW1ldGVyKGhDb21wb25lbnQsIG5QYXJhbUluZGV4LCBDb21wb25lbnRQYXJhbWV0ZXJTdHJ1Y3R1cmUpOworICAgIH0KKyAgICAgICAgYnJlYWs7CisgICAgfQorCitFWElUOgorICAgIEZ1bmN0aW9uT3V0KCk7CisKKyAgICByZXR1cm4gcmV0OworfQorT01YX0VSUk9SVFlQRSBTRUNfT01YX0F1ZGlvRGVjb2RlU2V0UGFyYW1ldGVyKAorICAgIE9NWF9JTiBPTVhfSEFORExFVFlQRSBoQ29tcG9uZW50LAorICAgIE9NWF9JTiBPTVhfSU5ERVhUWVBFICBuSW5kZXgsCisgICAgT01YX0lOIE9NWF9QVFIgICAgICAgIENvbXBvbmVudFBhcmFtZXRlclN0cnVjdHVyZSkKK3sKKyAgICBPTVhfRVJST1JUWVBFICAgICAgICAgIHJldCA9IE9NWF9FcnJvck5vbmU7CisgICAgT01YX0NPTVBPTkVOVFRZUEUgICAgICpwT01YQ29tcG9uZW50ID0gTlVMTDsKKyAgICBTRUNfT01YX0JBU0VDT01QT05FTlQgKnBTRUNDb21wb25lbnQgPSBOVUxMOworICAgIFNFQ19PTVhfQkFTRVBPUlQgICAgICAqcFNFQ1BvcnQgPSBOVUxMOworCisgICAgRnVuY3Rpb25JbigpOworCisgICAgaWYgKGhDb21wb25lbnQgPT0gTlVMTCkgeworICAgICAgICByZXQgPSBPTVhfRXJyb3JCYWRQYXJhbWV0ZXI7CisgICAgICAgIGdvdG8gRVhJVDsKKyAgICB9CisgICAgcE9NWENvbXBvbmVudCA9IChPTVhfQ09NUE9ORU5UVFlQRSAqKWhDb21wb25lbnQ7CisgICAgcmV0ID0gU0VDX09NWF9DaGVja19TaXplVmVyc2lvbihwT01YQ29tcG9uZW50LCBzaXplb2YoT01YX0NPTVBPTkVOVFRZUEUpKTsKKyAgICBpZiAocmV0ICE9IE9NWF9FcnJvck5vbmUpIHsKKyAgICAgICAgZ290byBFWElUOworICAgIH0KKworICAgIGlmIChwT01YQ29tcG9uZW50LT5wQ29tcG9uZW50UHJpdmF0ZSA9PSBOVUxMKSB7CisgICAgICAgIHJldCA9IE9NWF9FcnJvckJhZFBhcmFtZXRlcjsKKyAgICAgICAgZ290byBFWElUOworICAgIH0KKyAgICBwU0VDQ29tcG9uZW50ID0gKFNFQ19PTVhfQkFTRUNPTVBPTkVOVCAqKXBPTVhDb21wb25lbnQtPnBDb21wb25lbnRQcml2YXRlOworCisgICAgaWYgKHBTRUNDb21wb25lbnQtPmN1cnJlbnRTdGF0ZSA9PSBPTVhfU3RhdGVJbnZhbGlkICkgeworICAgICAgICByZXQgPSBPTVhfRXJyb3JJbnZhbGlkU3RhdGU7CisgICAgICAgIGdvdG8gRVhJVDsKKyAgICB9CisKKyAgICBpZiAoQ29tcG9uZW50UGFyYW1ldGVyU3RydWN0dXJlID09IE5VTEwpIHsKKyAgICAgICAgcmV0ID0gT01YX0Vycm9yQmFkUGFyYW1ldGVyOworICAgICAgICBnb3RvIEVYSVQ7CisgICAgfQorCisgICAgc3dpdGNoIChuSW5kZXgpIHsKKyAgICBjYXNlIE9NWF9JbmRleFBhcmFtQXVkaW9Qb3J0Rm9ybWF0OgorICAgIHsKKyAgICAgICAgT01YX0FVRElPX1BBUkFNX1BPUlRGT1JNQVRUWVBFICpwb3J0Rm9ybWF0ID0gKE9NWF9BVURJT19QQVJBTV9QT1JURk9STUFUVFlQRSAqKUNvbXBvbmVudFBhcmFtZXRlclN0cnVjdHVyZTsKKyAgICAgICAgT01YX1UzMiAgICAgICAgICAgICAgICAgICAgICAgICBwb3J0SW5kZXggPSBwb3J0Rm9ybWF0LT5uUG9ydEluZGV4OworICAgICAgICBPTVhfVTMyICAgICAgICAgICAgICAgICAgICAgICAgIGluZGV4ICAgID0gcG9ydEZvcm1hdC0+bkluZGV4OworICAgICAgICBTRUNfT01YX0JBU0VQT1JUICAgICAgICAgICAgICAgKnBTRUNQb3J0ID0gTlVMTDsKKyAgICAgICAgT01YX1BBUkFNX1BPUlRERUZJTklUSU9OVFlQRSAgICpwb3J0RGVmaW5pdGlvbiA9IE5VTEw7CisgICAgICAgIE9NWF9VMzIgICAgICAgICAgICAgICAgICAgICAgICAgc3VwcG9ydEZvcm1hdE51bSA9IDA7IC8qIHN1cHBvcnRGb3JtYXROdW0gPSBOLTEgKi8KKworICAgICAgICByZXQgPSBTRUNfT01YX0NoZWNrX1NpemVWZXJzaW9uKHBvcnRGb3JtYXQsIHNpemVvZihPTVhfQVVESU9fUEFSQU1fUE9SVEZPUk1BVFRZUEUpKTsKKyAgICAgICAgaWYgKHJldCAhPSBPTVhfRXJyb3JOb25lKSB7CisgICAgICAgICAgICBnb3RvIEVYSVQ7CisgICAgICAgIH0KKworICAgICAgICBpZiAoKHBvcnRJbmRleCA+PSBwU0VDQ29tcG9uZW50LT5wb3J0UGFyYW0ublBvcnRzKSkgeworICAgICAgICAgICAgcmV0ID0gT01YX0Vycm9yQmFkUG9ydEluZGV4OworICAgICAgICAgICAgZ290byBFWElUOworICAgICAgICB9CisKKyAgICAgICAgcFNFQ1BvcnQgPSAmcFNFQ0NvbXBvbmVudC0+cFNFQ1BvcnRbcG9ydEluZGV4XTsKKyAgICAgICAgcG9ydERlZmluaXRpb24gPSAmcFNFQ1BvcnQtPnBvcnREZWZpbml0aW9uOworCisgICAgICAgIHBvcnREZWZpbml0aW9uLT5mb3JtYXQuYXVkaW8uZUVuY29kaW5nID0gcG9ydEZvcm1hdC0+ZUVuY29kaW5nOworICAgICAgICByZXQgPSBPTVhfRXJyb3JOb25lOworICAgIH0KKyAgICAgICAgYnJlYWs7CisgICAgZGVmYXVsdDoKKyAgICB7CisgICAgICAgIHJldCA9IFNFQ19PTVhfU2V0UGFyYW1ldGVyKGhDb21wb25lbnQsIG5JbmRleCwgQ29tcG9uZW50UGFyYW1ldGVyU3RydWN0dXJlKTsKKyAgICB9CisgICAgICAgIGJyZWFrOworICAgIH0KKworRVhJVDoKKyAgICBGdW5jdGlvbk91dCgpOworCisgICAgcmV0dXJuIHJldDsKK30KKworT01YX0VSUk9SVFlQRSBTRUNfT01YX0F1ZGlvRGVjb2RlR2V0Q29uZmlnKAorICAgIE9NWF9IQU5ETEVUWVBFIGhDb21wb25lbnQsCisgICAgT01YX0lOREVYVFlQRSBuSW5kZXgsCisgICAgT01YX1BUUiBwQ29tcG9uZW50Q29uZmlnU3RydWN0dXJlKQoreworICAgIE9NWF9FUlJPUlRZUEUgICAgICAgICAgcmV0ID0gT01YX0Vycm9yTm9uZTsKKyAgICBPTVhfQ09NUE9ORU5UVFlQRSAgICAgKnBPTVhDb21wb25lbnQgPSBOVUxMOworICAgIFNFQ19PTVhfQkFTRUNPTVBPTkVOVCAqcFNFQ0NvbXBvbmVudCA9IE5VTEw7CisKKyAgICBGdW5jdGlvbkluKCk7CisKKyAgICBpZiAoaENvbXBvbmVudCA9PSBOVUxMKSB7CisgICAgICAgIHJldCA9IE9NWF9FcnJvckJhZFBhcmFtZXRlcjsKKyAgICAgICAgZ290byBFWElUOworICAgIH0KKyAgICBwT01YQ29tcG9uZW50ID0gKE9NWF9DT01QT05FTlRUWVBFICopaENvbXBvbmVudDsKKyAgICByZXQgPSBTRUNfT01YX0NoZWNrX1NpemVWZXJzaW9uKHBPTVhDb21wb25lbnQsIHNpemVvZihPTVhfQ09NUE9ORU5UVFlQRSkpOworICAgIGlmIChyZXQgIT0gT01YX0Vycm9yTm9uZSkgeworICAgICAgICBnb3RvIEVYSVQ7CisgICAgfQorCisgICAgaWYgKHBPTVhDb21wb25lbnQtPnBDb21wb25lbnRQcml2YXRlID09IE5VTEwpIHsKKyAgICAgICAgcmV0ID0gT01YX0Vycm9yQmFkUGFyYW1ldGVyOworICAgICAgICBnb3RvIEVYSVQ7CisgICAgfQorICAgIHBTRUNDb21wb25lbnQgPSAoU0VDX09NWF9CQVNFQ09NUE9ORU5UICopcE9NWENvbXBvbmVudC0+cENvbXBvbmVudFByaXZhdGU7CisKKyAgICBpZiAocENvbXBvbmVudENvbmZpZ1N0cnVjdHVyZSA9PSBOVUxMKSB7CisgICAgICAgIHJldCA9IE9NWF9FcnJvckJhZFBhcmFtZXRlcjsKKyAgICAgICAgZ290byBFWElUOworICAgIH0KKyAgICBpZiAocFNFQ0NvbXBvbmVudC0+Y3VycmVudFN0YXRlID09IE9NWF9TdGF0ZUludmFsaWQpIHsKKyAgICAgICAgcmV0ID0gT01YX0Vycm9ySW52YWxpZFN0YXRlOworICAgICAgICBnb3RvIEVYSVQ7CisgICAgfQorCisgICAgc3dpdGNoIChuSW5kZXgpIHsKKyAgICBkZWZhdWx0OgorICAgICAgICByZXQgPSBTRUNfT01YX0dldENvbmZpZyhoQ29tcG9uZW50LCBuSW5kZXgsIHBDb21wb25lbnRDb25maWdTdHJ1Y3R1cmUpOworICAgICAgICBicmVhazsKKyAgICB9CisKK0VYSVQ6CisgICAgRnVuY3Rpb25PdXQoKTsKKworICAgIHJldHVybiByZXQ7Cit9CisKK09NWF9FUlJPUlRZUEUgU0VDX09NWF9BdWRpb0RlY29kZVNldENvbmZpZygKKyAgICBPTVhfSEFORExFVFlQRSBoQ29tcG9uZW50LAorICAgIE9NWF9JTkRFWFRZUEUgbkluZGV4LAorICAgIE9NWF9QVFIgcENvbXBvbmVudENvbmZpZ1N0cnVjdHVyZSkKK3sKKyAgICBPTVhfRVJST1JUWVBFICAgICAgICAgIHJldCA9IE9NWF9FcnJvck5vbmU7CisgICAgT01YX0NPTVBPTkVOVFRZUEUgICAgICpwT01YQ29tcG9uZW50ID0gTlVMTDsKKyAgICBTRUNfT01YX0JBU0VDT01QT05FTlQgKnBTRUNDb21wb25lbnQgPSBOVUxMOworCisgICAgRnVuY3Rpb25JbigpOworCisgICAgaWYgKGhDb21wb25lbnQgPT0gTlVMTCkgeworICAgICAgICByZXQgPSBPTVhfRXJyb3JCYWRQYXJhbWV0ZXI7CisgICAgICAgIGdvdG8gRVhJVDsKKyAgICB9CisgICAgcE9NWENvbXBvbmVudCA9IChPTVhfQ09NUE9ORU5UVFlQRSAqKWhDb21wb25lbnQ7CisgICAgcmV0ID0gU0VDX09NWF9DaGVja19TaXplVmVyc2lvbihwT01YQ29tcG9uZW50LCBzaXplb2YoT01YX0NPTVBPTkVOVFRZUEUpKTsKKyAgICBpZiAocmV0ICE9IE9NWF9FcnJvck5vbmUpIHsKKyAgICAgICAgZ290byBFWElUOworICAgIH0KKworICAgIGlmIChwT01YQ29tcG9uZW50LT5wQ29tcG9uZW50UHJpdmF0ZSA9PSBOVUxMKSB7CisgICAgICAgIHJldCA9IE9NWF9FcnJvckJhZFBhcmFtZXRlcjsKKyAgICAgICAgZ290byBFWElUOworICAgIH0KKyAgICBwU0VDQ29tcG9uZW50ID0gKFNFQ19PTVhfQkFTRUNPTVBPTkVOVCAqKXBPTVhDb21wb25lbnQtPnBDb21wb25lbnRQcml2YXRlOworCisgICAgaWYgKHBDb21wb25lbnRDb25maWdTdHJ1Y3R1cmUgPT0gTlVMTCkgeworICAgICAgICByZXQgPSBPTVhfRXJyb3JCYWRQYXJhbWV0ZXI7CisgICAgICAgIGdvdG8gRVhJVDsKKyAgICB9CisgICAgaWYgKHBTRUNDb21wb25lbnQtPmN1cnJlbnRTdGF0ZSA9PSBPTVhfU3RhdGVJbnZhbGlkKSB7CisgICAgICAgIHJldCA9IE9NWF9FcnJvckludmFsaWRTdGF0ZTsKKyAgICAgICAgZ290byBFWElUOworICAgIH0KKworICAgIHN3aXRjaCAobkluZGV4KSB7CisgICAgY2FzZSBPTVhfSW5kZXhDb25maWdBdWRpb011dGU6CisgICAgeworICAgICAgICBTRUNfT1NBTF9Mb2coU0VDX0xPR19UUkFDRSwgIk9NWF9JbmRleENvbmZpZ0F1ZGlvTXV0ZSIpOworICAgICAgICByZXQgPSBPTVhfRXJyb3JVbnN1cHBvcnRlZEluZGV4OworICAgIH0KKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBPTVhfSW5kZXhDb25maWdBdWRpb1ZvbHVtZToKKyAgICB7CisgICAgICAgIFNFQ19PU0FMX0xvZyhTRUNfTE9HX1RSQUNFLCAiT01YX0luZGV4Q29uZmlnQXVkaW9Wb2x1bWUiKTsKKyAgICAgICAgcmV0ID0gT01YX0Vycm9yVW5zdXBwb3J0ZWRJbmRleDsKKyAgICB9CisgICAgICAgIGJyZWFrOworICAgIGRlZmF1bHQ6CisgICAgICAgIHJldCA9IFNFQ19PTVhfU2V0Q29uZmlnKGhDb21wb25lbnQsIG5JbmRleCwgcENvbXBvbmVudENvbmZpZ1N0cnVjdHVyZSk7CisgICAgICAgIGJyZWFrOworICAgIH0KKworRVhJVDoKKyAgICBGdW5jdGlvbk91dCgpOworCisgICAgcmV0dXJuIHJldDsKK30KKworT01YX0VSUk9SVFlQRSBTRUNfT01YX0F1ZGlvRGVjb2RlR2V0RXh0ZW5zaW9uSW5kZXgoCisgICAgT01YX0lOIE9NWF9IQU5ETEVUWVBFICBoQ29tcG9uZW50LAorICAgIE9NWF9JTiBPTVhfU1RSSU5HICAgICAgY1BhcmFtZXRlck5hbWUsCisgICAgT01YX09VVCBPTVhfSU5ERVhUWVBFICpwSW5kZXhUeXBlKQoreworICAgIE9NWF9FUlJPUlRZUEUgICAgICAgICAgcmV0ID0gT01YX0Vycm9yTm9uZTsKKyAgICBPTVhfQ09NUE9ORU5UVFlQRSAgICAgKnBPTVhDb21wb25lbnQgPSBOVUxMOworICAgIFNFQ19PTVhfQkFTRUNPTVBPTkVOVCAqcFNFQ0NvbXBvbmVudCA9IE5VTEw7CisKKyAgICBGdW5jdGlvbkluKCk7CisKKyAgICBpZiAoaENvbXBvbmVudCA9PSBOVUxMKSB7CisgICAgICAgIHJldCA9IE9NWF9FcnJvckJhZFBhcmFtZXRlcjsKKyAgICAgICAgZ290byBFWElUOworICAgIH0KKyAgICBwT01YQ29tcG9uZW50ID0gKE9NWF9DT01QT05FTlRUWVBFICopaENvbXBvbmVudDsKKyAgICByZXQgPSBTRUNfT01YX0NoZWNrX1NpemVWZXJzaW9uKHBPTVhDb21wb25lbnQsIHNpemVvZihPTVhfQ09NUE9ORU5UVFlQRSkpOworICAgIGlmIChyZXQgIT0gT01YX0Vycm9yTm9uZSkgeworICAgICAgICBnb3RvIEVYSVQ7CisgICAgfQorCisgICAgaWYgKHBPTVhDb21wb25lbnQtPnBDb21wb25lbnRQcml2YXRlID09IE5VTEwpIHsKKyAgICAgICAgcmV0ID0gT01YX0Vycm9yQmFkUGFyYW1ldGVyOworICAgICAgICBnb3RvIEVYSVQ7CisgICAgfQorICAgIHBTRUNDb21wb25lbnQgPSAoU0VDX09NWF9CQVNFQ09NUE9ORU5UICopcE9NWENvbXBvbmVudC0+cENvbXBvbmVudFByaXZhdGU7CisKKyAgICBpZiAoKGNQYXJhbWV0ZXJOYW1lID09IE5VTEwpIHx8IChwSW5kZXhUeXBlID09IE5VTEwpKSB7CisgICAgICAgIHJldCA9IE9NWF9FcnJvckJhZFBhcmFtZXRlcjsKKyAgICAgICAgZ290byBFWElUOworICAgIH0KKyAgICBpZiAocFNFQ0NvbXBvbmVudC0+Y3VycmVudFN0YXRlID09IE9NWF9TdGF0ZUludmFsaWQpIHsKKyAgICAgICAgcmV0ID0gT01YX0Vycm9ySW52YWxpZFN0YXRlOworICAgICAgICBnb3RvIEVYSVQ7CisgICAgfQorCisgICAgcmV0ID0gU0VDX09NWF9HZXRFeHRlbnNpb25JbmRleChoQ29tcG9uZW50LCBjUGFyYW1ldGVyTmFtZSwgcEluZGV4VHlwZSk7CisKK0VYSVQ6CisgICAgRnVuY3Rpb25PdXQoKTsKKworICAgIHJldHVybiByZXQ7Cit9CisKK09NWF9FUlJPUlRZUEUgU0VDX09NWF9BdWRpb0RlY29kZUNvbXBvbmVudEluaXQoT01YX0lOIE9NWF9IQU5ETEVUWVBFIGhDb21wb25lbnQpCit7CisgICAgT01YX0VSUk9SVFlQRSAgICAgICAgICAgICAgIHJldCA9IE9NWF9FcnJvck5vbmU7CisgICAgT01YX0NPTVBPTkVOVFRZUEUgICAgICAgICAgKnBPTVhDb21wb25lbnQgPSBOVUxMOworICAgIFNFQ19PTVhfQkFTRUNPTVBPTkVOVCAgICAgICpwU0VDQ29tcG9uZW50ID0gTlVMTDsKKyAgICBTRUNfT01YX0JBU0VQT1JUICAgICAgICAgICAqcFNFQ1BvcnQgPSBOVUxMOworICAgIFNFQ19PTVhfQVVESU9ERUNfQ09NUE9ORU5UICpwQXVkaW9EZWMgPSBOVUxMOworCisgICAgRnVuY3Rpb25JbigpOworCisgICAgaWYgKGhDb21wb25lbnQgPT0gTlVMTCkgeworICAgICAgICByZXQgPSBPTVhfRXJyb3JCYWRQYXJhbWV0ZXI7CisgICAgICAgIGdvdG8gRVhJVDsKKyAgICB9CisgICAgcE9NWENvbXBvbmVudCA9IChPTVhfQ09NUE9ORU5UVFlQRSAqKWhDb21wb25lbnQ7CisgICAgcmV0ID0gU0VDX09NWF9DaGVja19TaXplVmVyc2lvbihwT01YQ29tcG9uZW50LCBzaXplb2YoT01YX0NPTVBPTkVOVFRZUEUpKTsKKyAgICBpZiAocmV0ICE9IE9NWF9FcnJvck5vbmUpIHsKKyAgICAgICAgU0VDX09TQUxfTG9nKFNFQ19MT0dfRVJST1IsICJPTVhfRXJyb3IsIExpbmU6JWQiLCBfX0xJTkVfXyk7CisgICAgICAgIGdvdG8gRVhJVDsKKyAgICB9CisKKyAgICByZXQgPSBTRUNfT01YX0Jhc2VDb21wb25lbnRfQ29uc3RydWN0b3IocE9NWENvbXBvbmVudCk7CisgICAgaWYgKHJldCAhPSBPTVhfRXJyb3JOb25lKSB7CisgICAgICAgIFNFQ19PU0FMX0xvZyhTRUNfTE9HX0VSUk9SLCAiT01YX0Vycm9yLCBMaW5lOiVkIiwgX19MSU5FX18pOworICAgICAgICBnb3RvIEVYSVQ7CisgICAgfQorCisgICAgcmV0ID0gU0VDX09NWF9Qb3J0X0NvbnN0cnVjdG9yKHBPTVhDb21wb25lbnQpOworICAgIGlmIChyZXQgIT0gT01YX0Vycm9yTm9uZSkgeworICAgICAgICBTRUNfT01YX0Jhc2VDb21wb25lbnRfRGVzdHJ1Y3RvcihwT01YQ29tcG9uZW50KTsKKyAgICAgICAgU0VDX09TQUxfTG9nKFNFQ19MT0dfRVJST1IsICJPTVhfRXJyb3IsIExpbmU6JWQiLCBfX0xJTkVfXyk7CisgICAgICAgIGdvdG8gRVhJVDsKKyAgICB9CisKKyAgICBwU0VDQ29tcG9uZW50ID0gKFNFQ19PTVhfQkFTRUNPTVBPTkVOVCAqKXBPTVhDb21wb25lbnQtPnBDb21wb25lbnRQcml2YXRlOworCisgICAgcEF1ZGlvRGVjID0gU0VDX09TQUxfTWFsbG9jKHNpemVvZihTRUNfT01YX0FVRElPREVDX0NPTVBPTkVOVCkpOworICAgIGlmIChwQXVkaW9EZWMgPT0gTlVMTCkgeworICAgICAgICBTRUNfT01YX0Jhc2VDb21wb25lbnRfRGVzdHJ1Y3RvcihwT01YQ29tcG9uZW50KTsKKyAgICAgICAgcmV0ID0gT01YX0Vycm9ySW5zdWZmaWNpZW50UmVzb3VyY2VzOworICAgICAgICBTRUNfT1NBTF9Mb2coU0VDX0xPR19FUlJPUiwgIk9NWF9FcnJvckluc3VmZmljaWVudFJlc291cmNlcywgTGluZTolZCIsIF9fTElORV9fKTsKKyAgICAgICAgZ290byBFWElUOworICAgIH0KKworICAgIFNFQ19PU0FMX01lbXNldChwQXVkaW9EZWMsIDAsIHNpemVvZihTRUNfT01YX0FVRElPREVDX0NPTVBPTkVOVCkpOworICAgIHBTRUNDb21wb25lbnQtPmhDb21wb25lbnRIYW5kbGUgPSAoT01YX0hBTkRMRVRZUEUpcEF1ZGlvRGVjOworICAgIHBTRUNDb21wb25lbnQtPmJTYXZlRmxhZ0VPUyA9IE9NWF9GQUxTRTsKKworICAgIC8qIElucHV0IHBvcnQgKi8KKyAgICBwU0VDUG9ydCA9ICZwU0VDQ29tcG9uZW50LT5wU0VDUG9ydFtJTlBVVF9QT1JUX0lOREVYXTsKKyAgICBwU0VDUG9ydC0+cG9ydERlZmluaXRpb24ubkJ1ZmZlckNvdW50QWN0dWFsID0gTUFYX0FVRElPX0lOUFVUQlVGRkVSX05VTTsKKyAgICBwU0VDUG9ydC0+cG9ydERlZmluaXRpb24ubkJ1ZmZlckNvdW50TWluID0gTUFYX0FVRElPX0lOUFVUQlVGRkVSX05VTTsKKyAgICBwU0VDUG9ydC0+cG9ydERlZmluaXRpb24ubkJ1ZmZlclNpemUgPSBERUZBVUxUX0FVRElPX0lOUFVUX0JVRkZFUl9TSVpFOworICAgIHBTRUNQb3J0LT5wb3J0RGVmaW5pdGlvbi5lRG9tYWluID0gT01YX1BvcnREb21haW5BdWRpbzsKKworICAgIHBTRUNQb3J0LT5wb3J0RGVmaW5pdGlvbi5mb3JtYXQuYXVkaW8uY01JTUVUeXBlID0gU0VDX09TQUxfTWFsbG9jKE1BWF9PTVhfTUlNRVRZUEVfU0laRSk7CisgICAgU0VDX09TQUxfU3RyY3B5KHBTRUNQb3J0LT5wb3J0RGVmaW5pdGlvbi5mb3JtYXQuYXVkaW8uY01JTUVUeXBlLCAiYXVkaW8vcmF3Iik7CisgICAgcFNFQ1BvcnQtPnBvcnREZWZpbml0aW9uLmZvcm1hdC5hdWRpby5wTmF0aXZlUmVuZGVyID0gMDsKKyAgICBwU0VDUG9ydC0+cG9ydERlZmluaXRpb24uZm9ybWF0LmF1ZGlvLmJGbGFnRXJyb3JDb25jZWFsbWVudCA9IE9NWF9GQUxTRTsKKyAgICBwU0VDUG9ydC0+cG9ydERlZmluaXRpb24uZm9ybWF0LmF1ZGlvLmVFbmNvZGluZyA9IE9NWF9BVURJT19Db2RpbmdVbnVzZWQ7CisKKyAgICAvKiBPdXRwdXQgcG9ydCAqLworICAgIHBTRUNQb3J0ID0gJnBTRUNDb21wb25lbnQtPnBTRUNQb3J0W09VVFBVVF9QT1JUX0lOREVYXTsKKyAgICBwU0VDUG9ydC0+cG9ydERlZmluaXRpb24ubkJ1ZmZlckNvdW50QWN0dWFsID0gTUFYX0FVRElPX09VVFBVVEJVRkZFUl9OVU07CisgICAgcFNFQ1BvcnQtPnBvcnREZWZpbml0aW9uLm5CdWZmZXJDb3VudE1pbiA9IE1BWF9BVURJT19PVVRQVVRCVUZGRVJfTlVNOworICAgIHBTRUNQb3J0LT5wb3J0RGVmaW5pdGlvbi5uQnVmZmVyU2l6ZSA9IERFRkFVTFRfQVVESU9fT1VUUFVUX0JVRkZFUl9TSVpFOworICAgIHBTRUNQb3J0LT5wb3J0RGVmaW5pdGlvbi5lRG9tYWluID0gT01YX1BvcnREb21haW5BdWRpbzsKKworICAgIHBTRUNQb3J0LT5wb3J0RGVmaW5pdGlvbi5mb3JtYXQuYXVkaW8uY01JTUVUeXBlID0gU0VDX09TQUxfTWFsbG9jKE1BWF9PTVhfTUlNRVRZUEVfU0laRSk7CisgICAgU0VDX09TQUxfU3RyY3B5KHBTRUNQb3J0LT5wb3J0RGVmaW5pdGlvbi5mb3JtYXQuYXVkaW8uY01JTUVUeXBlLCAiYXVkaW8vcmF3Iik7CisgICAgcFNFQ1BvcnQtPnBvcnREZWZpbml0aW9uLmZvcm1hdC5hdWRpby5wTmF0aXZlUmVuZGVyID0gMDsKKyAgICBwU0VDUG9ydC0+cG9ydERlZmluaXRpb24uZm9ybWF0LmF1ZGlvLmJGbGFnRXJyb3JDb25jZWFsbWVudCA9IE9NWF9GQUxTRTsKKyAgICBwU0VDUG9ydC0+cG9ydERlZmluaXRpb24uZm9ybWF0LmF1ZGlvLmVFbmNvZGluZyA9IE9NWF9BVURJT19Db2RpbmdVbnVzZWQ7CisKKworICAgIHBPTVhDb21wb25lbnQtPlVzZUJ1ZmZlciAgICAgICAgICAgICAgPSAmU0VDX09NWF9Vc2VCdWZmZXI7CisgICAgcE9NWENvbXBvbmVudC0+QWxsb2NhdGVCdWZmZXIgICAgICAgICA9ICZTRUNfT01YX0FsbG9jYXRlQnVmZmVyOworICAgIHBPTVhDb21wb25lbnQtPkZyZWVCdWZmZXIgICAgICAgICAgICAgPSAmU0VDX09NWF9GcmVlQnVmZmVyOworICAgIHBPTVhDb21wb25lbnQtPkNvbXBvbmVudFR1bm5lbFJlcXVlc3QgPSAmU0VDX09NWF9Db21wb25lbnRUdW5uZWxSZXF1ZXN0OworCisgICAgcFNFQ0NvbXBvbmVudC0+c2VjX0FsbG9jYXRlVHVubmVsQnVmZmVyID0gJlNFQ19PTVhfQWxsb2NhdGVUdW5uZWxCdWZmZXI7CisgICAgcFNFQ0NvbXBvbmVudC0+c2VjX0ZyZWVUdW5uZWxCdWZmZXIgICAgID0gJlNFQ19PTVhfRnJlZVR1bm5lbEJ1ZmZlcjsKKyAgICBwU0VDQ29tcG9uZW50LT5zZWNfQnVmZmVyUHJvY2VzcyAgICAgICAgPSAmU0VDX09NWF9CdWZmZXJQcm9jZXNzOworICAgIHBTRUNDb21wb25lbnQtPnNlY19CdWZmZXJSZXNldCAgICAgICAgICA9ICZTRUNfQnVmZmVyUmVzZXQ7CisgICAgcFNFQ0NvbXBvbmVudC0+c2VjX0lucHV0QnVmZmVyUmV0dXJuICAgID0gJlNFQ19JbnB1dEJ1ZmZlclJldHVybjsKKyAgICBwU0VDQ29tcG9uZW50LT5zZWNfT3V0cHV0QnVmZmVyUmV0dXJuICAgPSAmU0VDX091dHB1dEJ1ZmZlclJldHVybjsKKworRVhJVDoKKyAgICBGdW5jdGlvbk91dCgpOworCisgICAgcmV0dXJuIHJldDsKK30KKworT01YX0VSUk9SVFlQRSBTRUNfT01YX0F1ZGlvRGVjb2RlQ29tcG9uZW50RGVpbml0KE9NWF9JTiBPTVhfSEFORExFVFlQRSBoQ29tcG9uZW50KQoreworICAgIE9NWF9FUlJPUlRZUEUgICAgICAgICAgICAgICByZXQgPSBPTVhfRXJyb3JOb25lOworICAgIE9NWF9DT01QT05FTlRUWVBFICAgICAgICAgICpwT01YQ29tcG9uZW50ID0gTlVMTDsKKyAgICBTRUNfT01YX0JBU0VDT01QT05FTlQgICAgICAqcFNFQ0NvbXBvbmVudCA9IE5VTEw7CisgICAgU0VDX09NWF9CQVNFUE9SVCAgICAgICAgICAgKnBTRUNQb3J0ID0gTlVMTDsKKyAgICBTRUNfT01YX0FVRElPREVDX0NPTVBPTkVOVCAqcEF1ZGlvRGVjID0gTlVMTDsKKyAgICBpbnQgICAgICAgICAgICAgICAgICAgICAgICAgaSA9IDA7CisKKyAgICBGdW5jdGlvbkluKCk7CisKKyAgICBpZiAoaENvbXBvbmVudCA9PSBOVUxMKSB7CisgICAgICAgIHJldCA9IE9NWF9FcnJvckJhZFBhcmFtZXRlcjsKKyAgICAgICAgZ290byBFWElUOworICAgIH0KKyAgICBwT01YQ29tcG9uZW50ID0gKE9NWF9DT01QT05FTlRUWVBFICopaENvbXBvbmVudDsKKyAgICByZXQgPSBTRUNfT01YX0NoZWNrX1NpemVWZXJzaW9uKHBPTVhDb21wb25lbnQsIHNpemVvZihPTVhfQ09NUE9ORU5UVFlQRSkpOworICAgIGlmIChyZXQgIT0gT01YX0Vycm9yTm9uZSkgeworICAgICAgICBnb3RvIEVYSVQ7CisgICAgfQorCisgICAgaWYgKHBPTVhDb21wb25lbnQtPnBDb21wb25lbnRQcml2YXRlID09IE5VTEwpIHsKKyAgICAgICAgcmV0ID0gT01YX0Vycm9yQmFkUGFyYW1ldGVyOworICAgICAgICBnb3RvIEVYSVQ7CisgICAgfQorICAgIHBTRUNDb21wb25lbnQgPSAoU0VDX09NWF9CQVNFQ09NUE9ORU5UICopcE9NWENvbXBvbmVudC0+cENvbXBvbmVudFByaXZhdGU7CisKKyAgICBwQXVkaW9EZWMgPSAoU0VDX09NWF9BVURJT0RFQ19DT01QT05FTlQgKilwU0VDQ29tcG9uZW50LT5oQ29tcG9uZW50SGFuZGxlOworICAgIFNFQ19PU0FMX0ZyZWUocEF1ZGlvRGVjKTsKKyAgICBwU0VDQ29tcG9uZW50LT5oQ29tcG9uZW50SGFuZGxlID0gcEF1ZGlvRGVjID0gTlVMTDsKKworICAgIGZvcihpID0gMDsgaSA8IEFMTF9QT1JUX05VTTsgaSsrKSB7CisgICAgICAgIHBTRUNQb3J0ID0gJnBTRUNDb21wb25lbnQtPnBTRUNQb3J0W2ldOworICAgICAgICBTRUNfT1NBTF9GcmVlKHBTRUNQb3J0LT5wb3J0RGVmaW5pdGlvbi5mb3JtYXQuYXVkaW8uY01JTUVUeXBlKTsKKyAgICAgICAgcFNFQ1BvcnQtPnBvcnREZWZpbml0aW9uLmZvcm1hdC5hdWRpby5jTUlNRVR5cGUgPSBOVUxMOworICAgIH0KKworICAgIHJldCA9IFNFQ19PTVhfUG9ydF9EZXN0cnVjdG9yKHBPTVhDb21wb25lbnQpOworCisgICAgcmV0ID0gU0VDX09NWF9CYXNlQ29tcG9uZW50X0Rlc3RydWN0b3IoaENvbXBvbmVudCk7CisKK0VYSVQ6CisgICAgRnVuY3Rpb25PdXQoKTsKKworICAgIHJldHVybiByZXQ7Cit9CmRpZmYgLS1naXQgYS9leHlub3M0L211bHRpbWVkaWEvb3Blbm1heC9zZWNfb214L2NvbXBvbmVudC9hdWRpby9kZWMvU0VDX09NWF9BZGVjLmggYi9leHlub3M0L211bHRpbWVkaWEvb3Blbm1heC9zZWNfb214L2NvbXBvbmVudC9hdWRpby9kZWMvU0VDX09NWF9BZGVjLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOGZmMjBhYgotLS0gL2Rldi9udWxsCisrKyBiL2V4eW5vczQvbXVsdGltZWRpYS9vcGVubWF4L3NlY19vbXgvY29tcG9uZW50L2F1ZGlvL2RlYy9TRUNfT01YX0FkZWMuaApAQCAtMCwwICsxLDEzMiBAQAorLyoKKyAqCisgKiBDb3B5cmlnaHQgMjAxMCBTYW1zdW5nIEVsZWN0cm9uaWNzIFMuTFNJIENvLiBMVEQKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworLyoKKyAqIEBmaWxlICAgICAgICBTRUNfT01YX0FkZWMuaAorICogQGJyaWVmCisgKiBAYXV0aG9yICAgICAgWXVuamkgS2ltICh5dW5qaS5raW1Ac2Ftc3VuZy5jb20pCisgKgorICogQHZlcnNpb24gICAgIDEuMS4wCisgKiBAaGlzdG9yeQorICogICAyMDExLjEwLjE4IDogQ3JlYXRlCisgKi8KKworI2lmbmRlZiBTRUNfT01YX0FVRElPX0RFQ09ERQorI2RlZmluZSBTRUNfT01YX0FVRElPX0RFQ09ERQorCisjaW5jbHVkZSAiT01YX0NvbXBvbmVudC5oIgorI2luY2x1ZGUgIlNFQ19PTVhfRGVmLmgiCisjaW5jbHVkZSAiU0VDX09TQUxfUXVldWUuaCIKKyNpbmNsdWRlICJTRUNfT01YX0Jhc2Vwb3J0LmgiCisjaW5jbHVkZSAiU0VDX09NWF9CYXNlY29tcG9uZW50LmgiCisKKyNkZWZpbmUgTUFYX0FVRElPX0lOUFVUQlVGRkVSX05VTSAgICAyCisjZGVmaW5lIE1BWF9BVURJT19PVVRQVVRCVUZGRVJfTlVNICAgMgorCisjZGVmaW5lIERFRkFVTFRfQVVESU9fSU5QVVRfQlVGRkVSX1NJWkUgICAgICgxNiAqIDEwMjQpCisjZGVmaW5lIERFRkFVTFRfQVVESU9fT1VUUFVUX0JVRkZFUl9TSVpFICAgICgzMiAqIDEwMjQpCisKKyNkZWZpbmUgREVGQVVMVF9BVURJT19TQU1QTElOR19GUkVRICA0NDEwMAorI2RlZmluZSBERUZBVUxUX0FVRElPX0NIQU5ORUxTX05VTSAgIDIKKyNkZWZpbmUgREVGQVVMVF9BVURJT19CSVRfUEVSX1NBTVBMRSAxNgorCisjZGVmaW5lIElOUFVUX1BPUlRfU1VQUE9SVEZPUk1BVF9OVU1fTUFYICAgIDEKKyNkZWZpbmUgT1VUUFVUX1BPUlRfU1VQUE9SVEZPUk1BVF9OVU1fTUFYICAgMQorCit0eXBlZGVmIHN0cnVjdCBfU1JQX0RFQ19JTlBVVF9CVUZGRVIKK3sKKyAgICB2b2lkICpQaHlBZGRyOyAgICAgIC8vIHBoeXNpY2FsIGFkZHJlc3MKKyAgICB2b2lkICpWaXJBZGRyOyAgICAgIC8vIHZpcnR1YWwgYWRkcmVzcworICAgIGludCAgIGJ1ZmZlclNpemU7ICAgLy8gaW5wdXQgYnVmZmVyIGFsbG9jIHNpemUKKyAgICBpbnQgICBkYXRhU2l6ZTsgICAgIC8vIERhdGEgbGVuZ3RoCit9IFNSUF9ERUNfSU5QVVRfQlVGRkVSOworCit0eXBlZGVmIHN0cnVjdCBfU0VDX09NWF9BVURJT0RFQ19DT01QT05FTlQKK3sKKyAgICBPTVhfSEFORExFVFlQRSBoQ29kZWNIYW5kbGU7CisKKyAgICBPTVhfQk9PTCBiRmlyc3RGcmFtZTsKKyAgICBPTVhfUFRSIHBJbnB1dEJ1ZmZlcjsKKyAgICBTUlBfREVDX0lOUFVUX0JVRkZFUiBTUlBEZWNJbnB1dEJ1ZmZlcltNQVhfQVVESU9fSU5QVVRCVUZGRVJfTlVNXTsKKyAgICBPTVhfVTMyICBpbmRleElucHV0QnVmZmVyOworfSBTRUNfT01YX0FVRElPREVDX0NPTVBPTkVOVDsKKworCisjaWZkZWYgX19jcGx1c3BsdXMKK2V4dGVybiAiQyIgeworI2VuZGlmCisKK09NWF9FUlJPUlRZUEUgU0VDX09NWF9Vc2VCdWZmZXIoCisgICAgT01YX0lOIE9NWF9IQU5ETEVUWVBFICAgICAgICAgICAgaENvbXBvbmVudCwKKyAgICBPTVhfSU5PVVQgT01YX0JVRkZFUkhFQURFUlRZUEUgKipwcEJ1ZmZlckhkciwKKyAgICBPTVhfSU4gT01YX1UzMiAgICAgICAgICAgICAgICAgICBuUG9ydEluZGV4LAorICAgIE9NWF9JTiBPTVhfUFRSICAgICAgICAgICAgICAgICAgIHBBcHBQcml2YXRlLAorICAgIE9NWF9JTiBPTVhfVTMyICAgICAgICAgICAgICAgICAgIG5TaXplQnl0ZXMsCisgICAgT01YX0lOIE9NWF9VOCAgICAgICAgICAgICAgICAgICAqcEJ1ZmZlcik7CitPTVhfRVJST1JUWVBFIFNFQ19PTVhfQWxsb2NhdGVCdWZmZXIoCisgICAgT01YX0lOIE9NWF9IQU5ETEVUWVBFICAgICAgICAgICAgaENvbXBvbmVudCwKKyAgICBPTVhfSU5PVVQgT01YX0JVRkZFUkhFQURFUlRZUEUgKipwcEJ1ZmZlciwKKyAgICBPTVhfSU4gT01YX1UzMiAgICAgICAgICAgICAgICAgICBuUG9ydEluZGV4LAorICAgIE9NWF9JTiBPTVhfUFRSICAgICAgICAgICAgICAgICAgIHBBcHBQcml2YXRlLAorICAgIE9NWF9JTiBPTVhfVTMyICAgICAgICAgICAgICAgICAgIG5TaXplQnl0ZXMpOworT01YX0VSUk9SVFlQRSBTRUNfT01YX0ZyZWVCdWZmZXIoCisgICAgT01YX0lOIE9NWF9IQU5ETEVUWVBFIGhDb21wb25lbnQsCisgICAgT01YX0lOIE9NWF9VMzIgICAgICAgIG5Qb3J0SW5kZXgsCisgICAgT01YX0lOIE9NWF9CVUZGRVJIRUFERVJUWVBFICpwQnVmZmVySGRyKTsKK09NWF9FUlJPUlRZUEUgU0VDX09NWF9BbGxvY2F0ZVR1bm5lbEJ1ZmZlcigKKyAgICBTRUNfT01YX0JBU0VQT1JUICpwT01YQmFzZVBvcnQsCisgICAgT01YX1UzMiAgICAgICAgICAgblBvcnRJbmRleCk7CitPTVhfRVJST1JUWVBFIFNFQ19PTVhfRnJlZVR1bm5lbEJ1ZmZlcigKKyAgICBTRUNfT01YX0JBU0VQT1JUICpwT01YQmFzZVBvcnQsCisgICAgT01YX1UzMiAgICAgICAgICAgblBvcnRJbmRleCk7CitPTVhfRVJST1JUWVBFIFNFQ19PTVhfQ29tcG9uZW50VHVubmVsUmVxdWVzdCgKKyAgICBPTVhfSU4gIE9NWF9IQU5ETEVUWVBFIGhDb21wLAorICAgIE9NWF9JTiBPTVhfVTMyICAgICAgICAgblBvcnQsCisgICAgT01YX0lOIE9NWF9IQU5ETEVUWVBFICBoVHVubmVsZWRDb21wLAorICAgIE9NWF9JTiBPTVhfVTMyICAgICAgICAgblR1bm5lbGVkUG9ydCwKKyAgICBPTVhfSU5PVVQgT01YX1RVTk5FTFNFVFVQVFlQRSAqcFR1bm5lbFNldHVwKTsKK09NWF9FUlJPUlRZUEUgU0VDX09NWF9CdWZmZXJQcm9jZXNzKE9NWF9IQU5ETEVUWVBFIGhDb21wb25lbnQpOworT01YX0VSUk9SVFlQRSBTRUNfT01YX0F1ZGlvRGVjb2RlR2V0UGFyYW1ldGVyKAorICAgIE9NWF9JTiBPTVhfSEFORExFVFlQRSBoQ29tcG9uZW50LAorICAgIE9NWF9JTiBPTVhfSU5ERVhUWVBFICBuUGFyYW1JbmRleCwKKyAgICBPTVhfSU5PVVQgT01YX1BUUiAgICAgQ29tcG9uZW50UGFyYW1ldGVyU3RydWN0dXJlKTsKK09NWF9FUlJPUlRZUEUgU0VDX09NWF9BdWRpb0RlY29kZVNldFBhcmFtZXRlcigKKyAgICBPTVhfSU4gT01YX0hBTkRMRVRZUEUgaENvbXBvbmVudCwKKyAgICBPTVhfSU4gT01YX0lOREVYVFlQRSAgbkluZGV4LAorICAgIE9NWF9JTiBPTVhfUFRSICAgICAgICBDb21wb25lbnRQYXJhbWV0ZXJTdHJ1Y3R1cmUpOworT01YX0VSUk9SVFlQRSBTRUNfT01YX0F1ZGlvRGVjb2RlR2V0Q29uZmlnKAorICAgIE9NWF9IQU5ETEVUWVBFIGhDb21wb25lbnQsCisgICAgT01YX0lOREVYVFlQRSBuSW5kZXgsCisgICAgT01YX1BUUiBwQ29tcG9uZW50Q29uZmlnU3RydWN0dXJlKTsKK09NWF9FUlJPUlRZUEUgU0VDX09NWF9BdWRpb0RlY29kZVNldENvbmZpZygKKyAgICBPTVhfSEFORExFVFlQRSBoQ29tcG9uZW50LAorICAgIE9NWF9JTkRFWFRZUEUgbkluZGV4LAorICAgIE9NWF9QVFIgcENvbXBvbmVudENvbmZpZ1N0cnVjdHVyZSk7CitPTVhfRVJST1JUWVBFIFNFQ19PTVhfQXVkaW9EZWNvZGVHZXRFeHRlbnNpb25JbmRleCgKKyAgICBPTVhfSU4gT01YX0hBTkRMRVRZUEUgIGhDb21wb25lbnQsCisgICAgT01YX0lOIE9NWF9TVFJJTkcgICAgICBjUGFyYW1ldGVyTmFtZSwKKyAgICBPTVhfT1VUIE9NWF9JTkRFWFRZUEUgKnBJbmRleFR5cGUpOworT01YX0VSUk9SVFlQRSBTRUNfT01YX0F1ZGlvRGVjb2RlQ29tcG9uZW50SW5pdChPTVhfSU4gT01YX0hBTkRMRVRZUEUgaENvbXBvbmVudCk7CitPTVhfRVJST1JUWVBFIFNFQ19PTVhfQXVkaW9EZWNvZGVDb21wb25lbnREZWluaXQoT01YX0lOIE9NWF9IQU5ETEVUWVBFIGhDb21wb25lbnQpOworT01YX0JPT0wgU0VDX0NoZWNrX0J1ZmZlclByb2Nlc3NfU3RhdGUoU0VDX09NWF9CQVNFQ09NUE9ORU5UICpwU0VDQ29tcG9uZW50KTsKK2lubGluZSB2b2lkIFNFQ19VcGRhdGVGcmFtZVNpemUoT01YX0NPTVBPTkVOVFRZUEUgKnBPTVhDb21wb25lbnQpOworCisjaWZkZWYgX19jcGx1c3BsdXMKK30KKyNlbmRpZgorCisjZW5kaWYgLyogU0VDX09NWF9BVURJT19ERUNPREUgKi8KZGlmZiAtLWdpdCBhL2V4eW5vczQvbXVsdGltZWRpYS9vcGVubWF4L3NlY19vbXgvY29tcG9uZW50L2F1ZGlvL2RlYy9tcDMvQW5kcm9pZC5tayBiL2V4eW5vczQvbXVsdGltZWRpYS9vcGVubWF4L3NlY19vbXgvY29tcG9uZW50L2F1ZGlvL2RlYy9tcDMvQW5kcm9pZC5tawpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40M2FmNjU1Ci0tLSAvZGV2L251bGwKKysrIGIvZXh5bm9zNC9tdWx0aW1lZGlhL29wZW5tYXgvc2VjX29teC9jb21wb25lbnQvYXVkaW8vZGVjL21wMy9BbmRyb2lkLm1rCkBAIC0wLDAgKzEsMzEgQEAKK0xPQ0FMX1BBVEggOj0gJChjYWxsIG15LWRpcikKK2luY2x1ZGUgJChDTEVBUl9WQVJTKQorCitMT0NBTF9NT0RVTEVfVEFHUyA6PSBvcHRpb25hbAorCitMT0NBTF9TUkNfRklMRVMgOj0gXAorCVNFQ19PTVhfTXAzZGVjLmMgXAorCWxpYnJhcnlfcmVnaXN0ZXIuYworCitMT0NBTF9QUkVMSU5LX01PRFVMRSA6PSBmYWxzZQorTE9DQUxfTU9EVUxFIDo9IGxpYk9NWC5TRUMuTVAzLkRlY29kZXIKK0xPQ0FMX01PRFVMRV9QQVRIIDo9ICQoVEFSR0VUX09VVF9TSEFSRURfTElCUkFSSUVTKS9vbXgKKworTE9DQUxfQ0ZMQUdTIDo9CisKK0xPQ0FMX0FSTV9NT0RFIDo9IGFybQorCitMT0NBTF9TVEFUSUNfTElCUkFSSUVTIDo9IGxpYlNFQ19PTVhfQWRlYyBsaWJzZWNvc2FsIGxpYnNlY2Jhc2Vjb21wb25lbnQgXAorCWxpYnNycGFwaQorTE9DQUxfU0hBUkVEX0xJQlJBUklFUyA6PSBsaWJjIGxpYmRsIGxpYmN1dGlscyBsaWJ1dGlscyBsaWJ1aSBcCisJbGliU0VDX09NWF9SZXNvdXJjZW1hbmFnZXIKKworTE9DQUxfQ19JTkNMVURFUyA6PSAkKFNFQ19PTVhfSU5DKS9raHJvbm9zIFwKKwkkKFNFQ19PTVhfSU5DKS9zZWMgXAorCSQoU0VDX09NWF9UT1ApL29zYWwgXAorCSQoU0VDX09NWF9UT1ApL2NvcmUgXAorCSQoU0VDX09NWF9DT01QT05FTlQpL2NvbW1vbiBcCisJJChTRUNfT01YX0NPTVBPTkVOVCkvYXVkaW8vZGVjIFwKKwkkKFRBUkdFVF9PVVRfSEVBREVSUykvJChTRUNfQ09QWV9IRUFERVJTX1RPKQorCitpbmNsdWRlICQoQlVJTERfU0hBUkVEX0xJQlJBUlkpCmRpZmYgLS1naXQgYS9leHlub3M0L211bHRpbWVkaWEvb3Blbm1heC9zZWNfb214L2NvbXBvbmVudC9hdWRpby9kZWMvbXAzL1NFQ19PTVhfTXAzZGVjLmMgYi9leHlub3M0L211bHRpbWVkaWEvb3Blbm1heC9zZWNfb214L2NvbXBvbmVudC9hdWRpby9kZWMvbXAzL1NFQ19PTVhfTXAzZGVjLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYThjNzdmNgotLS0gL2Rldi9udWxsCisrKyBiL2V4eW5vczQvbXVsdGltZWRpYS9vcGVubWF4L3NlY19vbXgvY29tcG9uZW50L2F1ZGlvL2RlYy9tcDMvU0VDX09NWF9NcDNkZWMuYwpAQCAtMCwwICsxLDkxOCBAQAorLyoKKyAqCisgKiBDb3B5cmlnaHQgMjAxMCBTYW1zdW5nIEVsZWN0cm9uaWNzIFMuTFNJIENvLiBMVEQKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworLyoKKyAqIEBmaWxlICAgICAgU0VDX09NWF9NcDNkZWMuYworICogQGJyaWVmCisgKiBAYXV0aG9yICAgIFl1bmppIEtpbSAoeXVuamkua2ltQHNhbXN1bmcuY29tKQorICogQHZlcnNpb24gICAxLjEuMAorICogQGhpc3RvcnkKKyAqICAgMjAxMS4xMC4xOCA6IENyZWF0ZQorICovCisKKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgPHN0ZGxpYi5oPgorI2luY2x1ZGUgPHN0cmluZy5oPgorCisjaW5jbHVkZSAiU0VDX09NWF9NYWNyb3MuaCIKKyNpbmNsdWRlICJTRUNfT01YX0Jhc2Vjb21wb25lbnQuaCIKKyNpbmNsdWRlICJTRUNfT01YX0Jhc2Vwb3J0LmgiCisjaW5jbHVkZSAiU0VDX09NWF9BZGVjLmgiCisjaW5jbHVkZSAiU0VDX09TQUxfRVRDLmgiCisjaW5jbHVkZSAiU0VDX09TQUxfU2VtYXBob3JlLmgiCisjaW5jbHVkZSAiU0VDX09TQUxfVGhyZWFkLmgiCisjaW5jbHVkZSAibGlicmFyeV9yZWdpc3Rlci5oIgorI2luY2x1ZGUgIlNFQ19PTVhfTXAzZGVjLmgiCisjaW5jbHVkZSAic3JwX2FwaS5oIgorCisjdW5kZWYgIFNFQ19MT0dfVEFHCisjZGVmaW5lIFNFQ19MT0dfVEFHICAgICJTRUNfTVAzX0RFQyIKKyNkZWZpbmUgU0VDX0xPR19PRkYKKyNpbmNsdWRlICJTRUNfT1NBTF9Mb2cuaCIKKworLy8jZGVmaW5lIFNSUF9EVU1QX1RPX0ZJTEUKKyNpZmRlZiBTUlBfRFVNUF9UT19GSUxFCisjaW5jbHVkZSAic3RkaW8uaCIKKworRklMRSAqaW5GaWxlOworRklMRSAqb3V0RmlsZTsKKyNlbmRpZgorCitPTVhfRVJST1JUWVBFIFNFQ19TUlBfTXAzRGVjX0dldFBhcmFtZXRlcigKKyAgICBPTVhfSU4gICAgT01YX0hBTkRMRVRZUEUgaENvbXBvbmVudCwKKyAgICBPTVhfSU4gICAgT01YX0lOREVYVFlQRSAgblBhcmFtSW5kZXgsCisgICAgT01YX0lOT1VUIE9NWF9QVFIgICAgICAgIHBDb21wb25lbnRQYXJhbWV0ZXJTdHJ1Y3R1cmUpCit7CisgICAgT01YX0VSUk9SVFlQRSAgICAgICAgICByZXQgPSBPTVhfRXJyb3JOb25lOworICAgIE9NWF9DT01QT05FTlRUWVBFICAgICAqcE9NWENvbXBvbmVudCA9IE5VTEw7CisgICAgU0VDX09NWF9CQVNFQ09NUE9ORU5UICpwU0VDQ29tcG9uZW50ID0gTlVMTDsKKworICAgIEZ1bmN0aW9uSW4oKTsKKworICAgIGlmIChoQ29tcG9uZW50ID09IE5VTEwgfHwgcENvbXBvbmVudFBhcmFtZXRlclN0cnVjdHVyZSA9PSBOVUxMKSB7CisgICAgICAgIHJldCA9IE9NWF9FcnJvckJhZFBhcmFtZXRlcjsKKyAgICAgICAgZ290byBFWElUOworICAgIH0KKyAgICBwT01YQ29tcG9uZW50ID0gKE9NWF9DT01QT05FTlRUWVBFICopaENvbXBvbmVudDsKKyAgICByZXQgPSBTRUNfT01YX0NoZWNrX1NpemVWZXJzaW9uKHBPTVhDb21wb25lbnQsIHNpemVvZihPTVhfQ09NUE9ORU5UVFlQRSkpOworICAgIGlmIChyZXQgIT0gT01YX0Vycm9yTm9uZSkgeworICAgICAgICBnb3RvIEVYSVQ7CisgICAgfQorICAgIGlmIChwT01YQ29tcG9uZW50LT5wQ29tcG9uZW50UHJpdmF0ZSA9PSBOVUxMKSB7CisgICAgICAgIHJldCA9IE9NWF9FcnJvckJhZFBhcmFtZXRlcjsKKyAgICAgICAgZ290byBFWElUOworICAgIH0KKworICAgIHBTRUNDb21wb25lbnQgPSAoU0VDX09NWF9CQVNFQ09NUE9ORU5UICopcE9NWENvbXBvbmVudC0+cENvbXBvbmVudFByaXZhdGU7CisgICAgaWYgKHBTRUNDb21wb25lbnQtPmN1cnJlbnRTdGF0ZSA9PSBPTVhfU3RhdGVJbnZhbGlkICkgeworICAgICAgICByZXQgPSBPTVhfRXJyb3JJbnZhbGlkU3RhdGU7CisgICAgICAgIGdvdG8gRVhJVDsKKyAgICB9CisKKyAgICBzd2l0Y2ggKG5QYXJhbUluZGV4KSB7CisgICAgY2FzZSBPTVhfSW5kZXhQYXJhbUF1ZGlvTXAzOgorICAgIHsKKyAgICAgICAgT01YX0FVRElPX1BBUkFNX01QM1RZUEUgKnBEc3RNcDNQYXJhbSA9IChPTVhfQVVESU9fUEFSQU1fTVAzVFlQRSAqKXBDb21wb25lbnRQYXJhbWV0ZXJTdHJ1Y3R1cmU7CisgICAgICAgIE9NWF9BVURJT19QQVJBTV9NUDNUWVBFICpwU3JjTXAzUGFyYW0gPSBOVUxMOworICAgICAgICBTRUNfTVAzX0hBTkRMRSAgICAgICAgICAqcE1wM0RlYyA9IE5VTEw7CisKKyAgICAgICAgcmV0ID0gU0VDX09NWF9DaGVja19TaXplVmVyc2lvbihwRHN0TXAzUGFyYW0sIHNpemVvZihPTVhfQVVESU9fUEFSQU1fTVAzVFlQRSkpOworICAgICAgICBpZiAocmV0ICE9IE9NWF9FcnJvck5vbmUpIHsKKyAgICAgICAgICAgIGdvdG8gRVhJVDsKKyAgICAgICAgfQorCisgICAgICAgIGlmIChwRHN0TXAzUGFyYW0tPm5Qb3J0SW5kZXggPj0gQUxMX1BPUlRfTlVNKSB7CisgICAgICAgICAgICByZXQgPSBPTVhfRXJyb3JCYWRQb3J0SW5kZXg7CisgICAgICAgICAgICBnb3RvIEVYSVQ7CisgICAgICAgIH0KKworICAgICAgICBwTXAzRGVjID0gKFNFQ19NUDNfSEFORExFICopKChTRUNfT01YX0FVRElPREVDX0NPTVBPTkVOVCAqKXBTRUNDb21wb25lbnQtPmhDb21wb25lbnRIYW5kbGUpLT5oQ29kZWNIYW5kbGU7CisgICAgICAgIHBTcmNNcDNQYXJhbSA9ICZwTXAzRGVjLT5tcDNQYXJhbTsKKworICAgICAgICBTRUNfT1NBTF9NZW1jcHkocERzdE1wM1BhcmFtLCBwU3JjTXAzUGFyYW0sIHNpemVvZihPTVhfQVVESU9fUEFSQU1fTVAzVFlQRSkpOworICAgIH0KKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBPTVhfSW5kZXhQYXJhbUF1ZGlvUGNtOgorICAgIHsKKyAgICAgICAgT01YX0FVRElPX1BBUkFNX1BDTU1PREVUWVBFICpwRHN0UGNtUGFyYW0gPSAoT01YX0FVRElPX1BBUkFNX1BDTU1PREVUWVBFICopcENvbXBvbmVudFBhcmFtZXRlclN0cnVjdHVyZTsKKyAgICAgICAgT01YX0FVRElPX1BBUkFNX1BDTU1PREVUWVBFICpwU3JjUGNtUGFyYW0gPSBOVUxMOworICAgICAgICBTRUNfTVAzX0hBTkRMRSAgICAgICAgICAgICAgKnBNcDNEZWMgPSBOVUxMOworCisgICAgICAgIHJldCA9IFNFQ19PTVhfQ2hlY2tfU2l6ZVZlcnNpb24ocERzdFBjbVBhcmFtLCBzaXplb2YoT01YX0FVRElPX1BBUkFNX1BDTU1PREVUWVBFKSk7CisgICAgICAgIGlmIChyZXQgIT0gT01YX0Vycm9yTm9uZSkgeworICAgICAgICAgICAgZ290byBFWElUOworICAgICAgICB9CisKKyAgICAgICAgaWYgKHBEc3RQY21QYXJhbS0+blBvcnRJbmRleCA+PSBBTExfUE9SVF9OVU0pIHsKKyAgICAgICAgICAgIHJldCA9IE9NWF9FcnJvckJhZFBvcnRJbmRleDsKKyAgICAgICAgICAgIGdvdG8gRVhJVDsKKyAgICAgICAgfQorCisgICAgICAgIHBNcDNEZWMgPSAoU0VDX01QM19IQU5ETEUgKikoKFNFQ19PTVhfQVVESU9ERUNfQ09NUE9ORU5UICopcFNFQ0NvbXBvbmVudC0+aENvbXBvbmVudEhhbmRsZSktPmhDb2RlY0hhbmRsZTsKKyAgICAgICAgcFNyY1BjbVBhcmFtID0gJnBNcDNEZWMtPnBjbVBhcmFtOworCisgICAgICAgIFNFQ19PU0FMX01lbWNweShwRHN0UGNtUGFyYW0sIHBTcmNQY21QYXJhbSwgc2l6ZW9mKE9NWF9BVURJT19QQVJBTV9QQ01NT0RFVFlQRSkpOworICAgIH0KKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBPTVhfSW5kZXhQYXJhbVN0YW5kYXJkQ29tcG9uZW50Um9sZToKKyAgICB7CisgICAgICAgIE9NWF9TMzIgY29kZWNUeXBlOworICAgICAgICBPTVhfUEFSQU1fQ09NUE9ORU5UUk9MRVRZUEUgKnBDb21wb25lbnRSb2xlID0gKE9NWF9QQVJBTV9DT01QT05FTlRST0xFVFlQRSAqKXBDb21wb25lbnRQYXJhbWV0ZXJTdHJ1Y3R1cmU7CisKKyAgICAgICAgcmV0ID0gU0VDX09NWF9DaGVja19TaXplVmVyc2lvbihwQ29tcG9uZW50Um9sZSwgc2l6ZW9mKE9NWF9QQVJBTV9DT01QT05FTlRST0xFVFlQRSkpOworICAgICAgICBpZiAocmV0ICE9IE9NWF9FcnJvck5vbmUpIHsKKyAgICAgICAgICAgIGdvdG8gRVhJVDsKKyAgICAgICAgfQorCisgICAgICAgIFNFQ19PU0FMX1N0cmNweSgoY2hhciAqKXBDb21wb25lbnRSb2xlLT5jUm9sZSwgU0VDX09NWF9DT01QT05FTlRfTVAzX0RFQ19ST0xFKTsKKyAgICB9CisgICAgICAgIGJyZWFrOworICAgIGRlZmF1bHQ6CisgICAgICAgIHJldCA9IFNFQ19PTVhfQXVkaW9EZWNvZGVHZXRQYXJhbWV0ZXIoaENvbXBvbmVudCwgblBhcmFtSW5kZXgsIHBDb21wb25lbnRQYXJhbWV0ZXJTdHJ1Y3R1cmUpOworICAgICAgICBicmVhazsKKyAgICB9CitFWElUOgorICAgIEZ1bmN0aW9uT3V0KCk7CisKKyAgICByZXR1cm4gcmV0OworfQorCitPTVhfRVJST1JUWVBFIFNFQ19TUlBfTXAzRGVjX1NldFBhcmFtZXRlcigKKyAgICBPTVhfSU4gT01YX0hBTkRMRVRZUEUgaENvbXBvbmVudCwKKyAgICBPTVhfSU4gT01YX0lOREVYVFlQRSAgbkluZGV4LAorICAgIE9NWF9JTiBPTVhfUFRSICAgICAgICBwQ29tcG9uZW50UGFyYW1ldGVyU3RydWN0dXJlKQoreworICAgIE9NWF9FUlJPUlRZUEUgICAgICAgICAgIHJldCA9IE9NWF9FcnJvck5vbmU7CisgICAgT01YX0NPTVBPTkVOVFRZUEUgICAgICpwT01YQ29tcG9uZW50ID0gTlVMTDsKKyAgICBTRUNfT01YX0JBU0VDT01QT05FTlQgKnBTRUNDb21wb25lbnQgPSBOVUxMOworCisgICAgRnVuY3Rpb25JbigpOworCisgICAgaWYgKGhDb21wb25lbnQgPT0gTlVMTCB8fCBwQ29tcG9uZW50UGFyYW1ldGVyU3RydWN0dXJlID09IE5VTEwpIHsKKyAgICAgICAgcmV0ID0gT01YX0Vycm9yQmFkUGFyYW1ldGVyOworICAgICAgICBnb3RvIEVYSVQ7CisgICAgfQorICAgIHBPTVhDb21wb25lbnQgPSAoT01YX0NPTVBPTkVOVFRZUEUgKiloQ29tcG9uZW50OworICAgIHJldCA9IFNFQ19PTVhfQ2hlY2tfU2l6ZVZlcnNpb24ocE9NWENvbXBvbmVudCwgc2l6ZW9mKE9NWF9DT01QT05FTlRUWVBFKSk7CisgICAgaWYgKHJldCAhPSBPTVhfRXJyb3JOb25lKSB7CisgICAgICAgIGdvdG8gRVhJVDsKKyAgICB9CisgICAgaWYgKHBPTVhDb21wb25lbnQtPnBDb21wb25lbnRQcml2YXRlID09IE5VTEwpIHsKKyAgICAgICAgcmV0ID0gT01YX0Vycm9yQmFkUGFyYW1ldGVyOworICAgICAgICBnb3RvIEVYSVQ7CisgICAgfQorCisgICAgcFNFQ0NvbXBvbmVudCA9IChTRUNfT01YX0JBU0VDT01QT05FTlQgKilwT01YQ29tcG9uZW50LT5wQ29tcG9uZW50UHJpdmF0ZTsKKyAgICBpZiAocFNFQ0NvbXBvbmVudC0+Y3VycmVudFN0YXRlID09IE9NWF9TdGF0ZUludmFsaWQgKSB7CisgICAgICAgIHJldCA9IE9NWF9FcnJvckludmFsaWRTdGF0ZTsKKyAgICAgICAgZ290byBFWElUOworICAgIH0KKworICAgIHN3aXRjaCAobkluZGV4KSB7CisgICAgY2FzZSBPTVhfSW5kZXhQYXJhbUF1ZGlvTXAzOgorICAgIHsKKyAgICAgICAgT01YX0FVRElPX1BBUkFNX01QM1RZUEUgKnBEc3RNcDNQYXJhbSA9IE5VTEw7CisgICAgICAgIE9NWF9BVURJT19QQVJBTV9NUDNUWVBFICpwU3JjTXAzUGFyYW0gPSAoT01YX0FVRElPX1BBUkFNX01QM1RZUEUgKilwQ29tcG9uZW50UGFyYW1ldGVyU3RydWN0dXJlOworICAgICAgICBTRUNfTVAzX0hBTkRMRSAgICAgICAgICAqcE1wM0RlYyA9IE5VTEw7CisKKyAgICAgICAgcmV0ID0gU0VDX09NWF9DaGVja19TaXplVmVyc2lvbihwU3JjTXAzUGFyYW0sIHNpemVvZihPTVhfQVVESU9fUEFSQU1fTVAzVFlQRSkpOworICAgICAgICBpZiAocmV0ICE9IE9NWF9FcnJvck5vbmUpIHsKKyAgICAgICAgICAgIGdvdG8gRVhJVDsKKyAgICAgICAgfQorCisgICAgICAgIGlmIChwU3JjTXAzUGFyYW0tPm5Qb3J0SW5kZXggPj0gQUxMX1BPUlRfTlVNKSB7CisgICAgICAgICAgICByZXQgPSBPTVhfRXJyb3JCYWRQb3J0SW5kZXg7CisgICAgICAgICAgICBnb3RvIEVYSVQ7CisgICAgICAgIH0KKworICAgICAgICBwTXAzRGVjID0gKFNFQ19NUDNfSEFORExFICopKChTRUNfT01YX0FVRElPREVDX0NPTVBPTkVOVCAqKXBTRUNDb21wb25lbnQtPmhDb21wb25lbnRIYW5kbGUpLT5oQ29kZWNIYW5kbGU7CisgICAgICAgIHBEc3RNcDNQYXJhbSA9ICZwTXAzRGVjLT5tcDNQYXJhbTsKKworICAgICAgICBTRUNfT1NBTF9NZW1jcHkocERzdE1wM1BhcmFtLCBwU3JjTXAzUGFyYW0sIHNpemVvZihPTVhfQVVESU9fUEFSQU1fTVAzVFlQRSkpOworICAgIH0KKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBPTVhfSW5kZXhQYXJhbUF1ZGlvUGNtOgorICAgIHsKKyAgICAgICAgT01YX0FVRElPX1BBUkFNX1BDTU1PREVUWVBFICpwRHN0UGNtUGFyYW0gPSBOVUxMOworICAgICAgICBPTVhfQVVESU9fUEFSQU1fUENNTU9ERVRZUEUgKnBTcmNQY21QYXJhbSA9IChPTVhfQVVESU9fUEFSQU1fUENNTU9ERVRZUEUgKilwQ29tcG9uZW50UGFyYW1ldGVyU3RydWN0dXJlOworICAgICAgICBTRUNfTVAzX0hBTkRMRSAgICAgICAgICAgICAgKnBNcDNEZWMgPSBOVUxMOworCisgICAgICAgIHJldCA9IFNFQ19PTVhfQ2hlY2tfU2l6ZVZlcnNpb24ocFNyY1BjbVBhcmFtLCBzaXplb2YoT01YX0FVRElPX1BBUkFNX1BDTU1PREVUWVBFKSk7CisgICAgICAgIGlmIChyZXQgIT0gT01YX0Vycm9yTm9uZSkgeworICAgICAgICAgICAgZ290byBFWElUOworICAgICAgICB9CisKKyAgICAgICAgaWYgKHBTcmNQY21QYXJhbS0+blBvcnRJbmRleCA+PSBBTExfUE9SVF9OVU0pIHsKKyAgICAgICAgICAgIHJldCA9IE9NWF9FcnJvckJhZFBvcnRJbmRleDsKKyAgICAgICAgICAgIGdvdG8gRVhJVDsKKyAgICAgICAgfQorCisgICAgICAgIHBNcDNEZWMgPSAoU0VDX01QM19IQU5ETEUgKikoKFNFQ19PTVhfQVVESU9ERUNfQ09NUE9ORU5UICopcFNFQ0NvbXBvbmVudC0+aENvbXBvbmVudEhhbmRsZSktPmhDb2RlY0hhbmRsZTsKKyAgICAgICAgcERzdFBjbVBhcmFtID0gJnBNcDNEZWMtPnBjbVBhcmFtOworCisgICAgICAgIFNFQ19PU0FMX01lbWNweShwRHN0UGNtUGFyYW0sIHBTcmNQY21QYXJhbSwgc2l6ZW9mKE9NWF9BVURJT19QQVJBTV9QQ01NT0RFVFlQRSkpOworICAgIH0KKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBPTVhfSW5kZXhQYXJhbVN0YW5kYXJkQ29tcG9uZW50Um9sZToKKyAgICB7CisgICAgICAgIE9NWF9QQVJBTV9DT01QT05FTlRST0xFVFlQRSAqcENvbXBvbmVudFJvbGUgPSAoT01YX1BBUkFNX0NPTVBPTkVOVFJPTEVUWVBFKilwQ29tcG9uZW50UGFyYW1ldGVyU3RydWN0dXJlOworCisgICAgICAgIHJldCA9IFNFQ19PTVhfQ2hlY2tfU2l6ZVZlcnNpb24ocENvbXBvbmVudFJvbGUsIHNpemVvZihPTVhfUEFSQU1fQ09NUE9ORU5UUk9MRVRZUEUpKTsKKyAgICAgICAgaWYgKHJldCAhPSBPTVhfRXJyb3JOb25lKSB7CisgICAgICAgICAgICBnb3RvIEVYSVQ7CisgICAgICAgIH0KKworICAgICAgICBpZiAoKHBTRUNDb21wb25lbnQtPmN1cnJlbnRTdGF0ZSAhPSBPTVhfU3RhdGVMb2FkZWQpICYmIChwU0VDQ29tcG9uZW50LT5jdXJyZW50U3RhdGUgIT0gT01YX1N0YXRlV2FpdEZvclJlc291cmNlcykpIHsKKyAgICAgICAgICAgIHJldCA9IE9NWF9FcnJvckluY29ycmVjdFN0YXRlT3BlcmF0aW9uOworICAgICAgICAgICAgZ290byBFWElUOworICAgICAgICB9CisKKyAgICAgICAgaWYgKCFTRUNfT1NBTF9TdHJjbXAoKGNoYXIqKXBDb21wb25lbnRSb2xlLT5jUm9sZSwgU0VDX09NWF9DT01QT05FTlRfTVAzX0RFQ19ST0xFKSkgeworICAgICAgICAgICAgcFNFQ0NvbXBvbmVudC0+cFNFQ1BvcnRbSU5QVVRfUE9SVF9JTkRFWF0ucG9ydERlZmluaXRpb24uZm9ybWF0LmF1ZGlvLmVFbmNvZGluZyA9IE9NWF9BVURJT19Db2RpbmdNUDM7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICByZXQgPSBPTVhfRXJyb3JCYWRQYXJhbWV0ZXI7CisgICAgICAgICAgICBnb3RvIEVYSVQ7CisgICAgICAgIH0KKyAgICB9CisgICAgICAgIGJyZWFrOworICAgIGRlZmF1bHQ6CisgICAgICAgIHJldCA9IFNFQ19PTVhfQXVkaW9EZWNvZGVTZXRQYXJhbWV0ZXIoaENvbXBvbmVudCwgbkluZGV4LCBwQ29tcG9uZW50UGFyYW1ldGVyU3RydWN0dXJlKTsKKyAgICAgICAgYnJlYWs7CisgICAgfQorRVhJVDoKKyAgICBGdW5jdGlvbk91dCgpOworCisgICAgcmV0dXJuIHJldDsKK30KKworT01YX0VSUk9SVFlQRSBTRUNfU1JQX01wM0RlY19HZXRDb25maWcoCisgICAgT01YX0lOIE9NWF9IQU5ETEVUWVBFIGhDb21wb25lbnQsCisgICAgT01YX0lOIE9NWF9JTkRFWFRZUEUgIG5JbmRleCwKKyAgICBPTVhfSU4gT01YX1BUUiAgICAgICAgcENvbXBvbmVudENvbmZpZ1N0cnVjdHVyZSkKK3sKKyAgICBPTVhfRVJST1JUWVBFICAgICAgICAgIHJldCA9IE9NWF9FcnJvck5vbmU7CisgICAgT01YX0NPTVBPTkVOVFRZUEUgICAgICpwT01YQ29tcG9uZW50ID0gTlVMTDsKKyAgICBTRUNfT01YX0JBU0VDT01QT05FTlQgKnBTRUNDb21wb25lbnQgPSBOVUxMOworCisgICAgRnVuY3Rpb25JbigpOworCisgICAgaWYgKGhDb21wb25lbnQgPT0gTlVMTCB8fCBwQ29tcG9uZW50Q29uZmlnU3RydWN0dXJlID09IE5VTEwpIHsKKyAgICAgICAgcmV0ID0gT01YX0Vycm9yQmFkUGFyYW1ldGVyOworICAgICAgICBnb3RvIEVYSVQ7CisgICAgfQorICAgIHBPTVhDb21wb25lbnQgPSAoT01YX0NPTVBPTkVOVFRZUEUgKiloQ29tcG9uZW50OworICAgIHJldCA9IFNFQ19PTVhfQ2hlY2tfU2l6ZVZlcnNpb24ocE9NWENvbXBvbmVudCwgc2l6ZW9mKE9NWF9DT01QT05FTlRUWVBFKSk7CisgICAgaWYgKHJldCAhPSBPTVhfRXJyb3JOb25lKSB7CisgICAgICAgIGdvdG8gRVhJVDsKKyAgICB9CisgICAgaWYgKHBPTVhDb21wb25lbnQtPnBDb21wb25lbnRQcml2YXRlID09IE5VTEwpIHsKKyAgICAgICAgcmV0ID0gT01YX0Vycm9yQmFkUGFyYW1ldGVyOworICAgICAgICBnb3RvIEVYSVQ7CisgICAgfQorCisgICAgcFNFQ0NvbXBvbmVudCA9IChTRUNfT01YX0JBU0VDT01QT05FTlQgKilwT01YQ29tcG9uZW50LT5wQ29tcG9uZW50UHJpdmF0ZTsKKyAgICBpZiAocFNFQ0NvbXBvbmVudC0+Y3VycmVudFN0YXRlID09IE9NWF9TdGF0ZUludmFsaWQpIHsKKyAgICAgICAgcmV0ID0gT01YX0Vycm9ySW52YWxpZFN0YXRlOworICAgICAgICBnb3RvIEVYSVQ7CisgICAgfQorCisgICAgc3dpdGNoIChuSW5kZXgpIHsKKyAgICBkZWZhdWx0OgorICAgICAgICByZXQgPSBTRUNfT01YX0F1ZGlvRGVjb2RlR2V0Q29uZmlnKGhDb21wb25lbnQsIG5JbmRleCwgcENvbXBvbmVudENvbmZpZ1N0cnVjdHVyZSk7CisgICAgICAgIGJyZWFrOworICAgIH0KKworRVhJVDoKKyAgICBGdW5jdGlvbk91dCgpOworCisgICAgcmV0dXJuIHJldDsKK30KKworT01YX0VSUk9SVFlQRSBTRUNfU1JQX01wM0RlY19TZXRDb25maWcoCisgICAgT01YX0lOIE9NWF9IQU5ETEVUWVBFIGhDb21wb25lbnQsCisgICAgT01YX0lOIE9NWF9JTkRFWFRZUEUgIG5JbmRleCwKKyAgICBPTVhfSU4gT01YX1BUUiAgICAgICAgcENvbXBvbmVudENvbmZpZ1N0cnVjdHVyZSkKK3sKKyAgICBPTVhfRVJST1JUWVBFICAgICAgICAgIHJldCA9IE9NWF9FcnJvck5vbmU7CisgICAgT01YX0NPTVBPTkVOVFRZUEUgICAgICpwT01YQ29tcG9uZW50ID0gTlVMTDsKKyAgICBTRUNfT01YX0JBU0VDT01QT05FTlQgKnBTRUNDb21wb25lbnQgPSBOVUxMOworCisgICAgRnVuY3Rpb25JbigpOworCisgICAgaWYgKGhDb21wb25lbnQgPT0gTlVMTCB8fCBwQ29tcG9uZW50Q29uZmlnU3RydWN0dXJlID09IE5VTEwpIHsKKyAgICAgICAgcmV0ID0gT01YX0Vycm9yQmFkUGFyYW1ldGVyOworICAgICAgICBnb3RvIEVYSVQ7CisgICAgfQorICAgIHBPTVhDb21wb25lbnQgPSAoT01YX0NPTVBPTkVOVFRZUEUgKiloQ29tcG9uZW50OworICAgIHJldCA9IFNFQ19PTVhfQ2hlY2tfU2l6ZVZlcnNpb24ocE9NWENvbXBvbmVudCwgc2l6ZW9mKE9NWF9DT01QT05FTlRUWVBFKSk7CisgICAgaWYgKHJldCAhPSBPTVhfRXJyb3JOb25lKSB7CisgICAgICAgIGdvdG8gRVhJVDsKKyAgICB9CisgICAgaWYgKHBPTVhDb21wb25lbnQtPnBDb21wb25lbnRQcml2YXRlID09IE5VTEwpIHsKKyAgICAgICAgcmV0ID0gT01YX0Vycm9yQmFkUGFyYW1ldGVyOworICAgICAgICBnb3RvIEVYSVQ7CisgICAgfQorCisgICAgcFNFQ0NvbXBvbmVudCA9IChTRUNfT01YX0JBU0VDT01QT05FTlQgKilwT01YQ29tcG9uZW50LT5wQ29tcG9uZW50UHJpdmF0ZTsKKyAgICBpZiAocFNFQ0NvbXBvbmVudC0+Y3VycmVudFN0YXRlID09IE9NWF9TdGF0ZUludmFsaWQpIHsKKyAgICAgICAgcmV0ID0gT01YX0Vycm9ySW52YWxpZFN0YXRlOworICAgICAgICBnb3RvIEVYSVQ7CisgICAgfQorCisgICAgc3dpdGNoIChuSW5kZXgpIHsKKyAgICBkZWZhdWx0OgorICAgICAgICByZXQgPSBTRUNfT01YX0F1ZGlvRGVjb2RlU2V0Q29uZmlnKGhDb21wb25lbnQsIG5JbmRleCwgcENvbXBvbmVudENvbmZpZ1N0cnVjdHVyZSk7CisgICAgICAgIGJyZWFrOworICAgIH0KKworRVhJVDoKKyAgICBGdW5jdGlvbk91dCgpOworCisgICAgcmV0dXJuIHJldDsKK30KKworT01YX0VSUk9SVFlQRSBTRUNfU1JQX01wM0RlY19HZXRFeHRlbnNpb25JbmRleCgKKyAgICBPTVhfSU4gT01YX0hBTkRMRVRZUEUgIGhDb21wb25lbnQsCisgICAgT01YX0lOIE9NWF9TVFJJTkcgICAgICBjUGFyYW1ldGVyTmFtZSwKKyAgICBPTVhfT1VUIE9NWF9JTkRFWFRZUEUgKnBJbmRleFR5cGUpCit7CisgICAgT01YX0VSUk9SVFlQRSAgICAgICAgICAgcmV0ID0gT01YX0Vycm9yTm9uZTsKKyAgICBPTVhfQ09NUE9ORU5UVFlQRSAgICAgKnBPTVhDb21wb25lbnQgPSBOVUxMOworICAgIFNFQ19PTVhfQkFTRUNPTVBPTkVOVCAqcFNFQ0NvbXBvbmVudCA9IE5VTEw7CisKKyAgICBGdW5jdGlvbkluKCk7CisKKyAgICBpZiAoaENvbXBvbmVudCA9PSBOVUxMKSB7CisgICAgICAgIHJldCA9IE9NWF9FcnJvckJhZFBhcmFtZXRlcjsKKyAgICAgICAgZ290byBFWElUOworICAgIH0KKyAgICBwT01YQ29tcG9uZW50ID0gKE9NWF9DT01QT05FTlRUWVBFICopaENvbXBvbmVudDsKKyAgICByZXQgPSBTRUNfT01YX0NoZWNrX1NpemVWZXJzaW9uKHBPTVhDb21wb25lbnQsIHNpemVvZihPTVhfQ09NUE9ORU5UVFlQRSkpOworICAgIGlmIChyZXQgIT0gT01YX0Vycm9yTm9uZSkgeworICAgICAgICBnb3RvIEVYSVQ7CisgICAgfQorCisgICAgaWYgKHBPTVhDb21wb25lbnQtPnBDb21wb25lbnRQcml2YXRlID09IE5VTEwpIHsKKyAgICAgICAgcmV0ID0gT01YX0Vycm9yQmFkUGFyYW1ldGVyOworICAgICAgICBnb3RvIEVYSVQ7CisgICAgfQorICAgIHBTRUNDb21wb25lbnQgPSAoU0VDX09NWF9CQVNFQ09NUE9ORU5UICopcE9NWENvbXBvbmVudC0+cENvbXBvbmVudFByaXZhdGU7CisKKyAgICBpZiAoKGNQYXJhbWV0ZXJOYW1lID09IE5VTEwpIHx8IChwSW5kZXhUeXBlID09IE5VTEwpKSB7CisgICAgICAgIHJldCA9IE9NWF9FcnJvckJhZFBhcmFtZXRlcjsKKyAgICAgICAgZ290byBFWElUOworICAgIH0KKyAgICBpZiAocFNFQ0NvbXBvbmVudC0+Y3VycmVudFN0YXRlID09IE9NWF9TdGF0ZUludmFsaWQpIHsKKyAgICAgICAgcmV0ID0gT01YX0Vycm9ySW52YWxpZFN0YXRlOworICAgICAgICBnb3RvIEVYSVQ7CisgICAgfQorCisgICAgcmV0ID0gU0VDX09NWF9BdWRpb0RlY29kZUdldEV4dGVuc2lvbkluZGV4KGhDb21wb25lbnQsIGNQYXJhbWV0ZXJOYW1lLCBwSW5kZXhUeXBlKTsKKworRVhJVDoKKyAgICBGdW5jdGlvbk91dCgpOworCisgICAgcmV0dXJuIHJldDsKK30KKworT01YX0VSUk9SVFlQRSBTRUNfU1JQX01wM0RlY19Db21wb25lbnRSb2xlRW51bSgKKyAgICBPTVhfSU4gIE9NWF9IQU5ETEVUWVBFIGhDb21wb25lbnQsCisgICAgT01YX09VVCBPTVhfVTggICAgICAgICpjUm9sZSwKKyAgICBPTVhfSU4gIE9NWF9VMzIgICAgICAgIG5JbmRleCkKK3sKKyAgICBPTVhfRVJST1JUWVBFICAgICAgICAgICAgcmV0ID0gT01YX0Vycm9yTm9uZTsKKyAgICBPTVhfQ09NUE9ORU5UVFlQRSAgICAgICAqcE9NWENvbXBvbmVudCA9IE5VTEw7CisgICAgU0VDX09NWF9CQVNFQ09NUE9ORU5UICAgKnBTRUNDb21wb25lbnQgPSBOVUxMOworICAgIE9NWF9TMzIgICAgICAgICAgICAgICAgICBjb2RlY1R5cGU7CisKKyAgICBGdW5jdGlvbkluKCk7CisKKyAgICBpZiAoKGhDb21wb25lbnQgPT0gTlVMTCkgfHwgKGNSb2xlID09IE5VTEwpKSB7CisgICAgICAgIHJldCA9IE9NWF9FcnJvckJhZFBhcmFtZXRlcjsKKyAgICAgICAgZ290byBFWElUOworICAgIH0KKyAgICBpZiAobkluZGV4ICE9IChNQVhfQ09NUE9ORU5UX1JPTEVfTlVNIC0gMSkpIHsKKyAgICAgICAgcmV0ID0gT01YX0Vycm9yTm9Nb3JlOworICAgICAgICBnb3RvIEVYSVQ7CisgICAgfQorICAgIHBPTVhDb21wb25lbnQgPSAoT01YX0NPTVBPTkVOVFRZUEUgKiloQ29tcG9uZW50OworICAgIHJldCA9IFNFQ19PTVhfQ2hlY2tfU2l6ZVZlcnNpb24ocE9NWENvbXBvbmVudCwgc2l6ZW9mKE9NWF9DT01QT05FTlRUWVBFKSk7CisgICAgaWYgKHJldCAhPSBPTVhfRXJyb3JOb25lKSB7CisgICAgICAgIGdvdG8gRVhJVDsKKyAgICB9CisgICAgaWYgKHBPTVhDb21wb25lbnQtPnBDb21wb25lbnRQcml2YXRlID09IE5VTEwpIHsKKyAgICAgICAgcmV0ID0gT01YX0Vycm9yQmFkUGFyYW1ldGVyOworICAgICAgICBnb3RvIEVYSVQ7CisgICAgfQorCisgICAgcFNFQ0NvbXBvbmVudCA9IChTRUNfT01YX0JBU0VDT01QT05FTlQgKilwT01YQ29tcG9uZW50LT5wQ29tcG9uZW50UHJpdmF0ZTsKKyAgICBpZiAocFNFQ0NvbXBvbmVudC0+Y3VycmVudFN0YXRlID09IE9NWF9TdGF0ZUludmFsaWQgKSB7CisgICAgICAgIHJldCA9IE9NWF9FcnJvckludmFsaWRTdGF0ZTsKKyAgICAgICAgZ290byBFWElUOworICAgIH0KKworICAgIFNFQ19PU0FMX1N0cmNweSgoY2hhciAqKWNSb2xlLCBTRUNfT01YX0NPTVBPTkVOVF9NUDNfREVDX1JPTEUpOworCitFWElUOgorICAgIEZ1bmN0aW9uT3V0KCk7CisKKyAgICByZXR1cm4gcmV0OworfQorCitPTVhfRVJST1JUWVBFIFNFQ19TUlBfTXAzRGVjX0luaXQoT01YX0NPTVBPTkVOVFRZUEUgKnBPTVhDb21wb25lbnQpCit7CisgICAgT01YX0VSUk9SVFlQRSAgICAgICAgICAgICAgIHJldCA9IE9NWF9FcnJvck5vbmU7CisgICAgU0VDX09NWF9CQVNFQ09NUE9ORU5UICAgICAgKnBTRUNDb21wb25lbnQgPSAoU0VDX09NWF9CQVNFQ09NUE9ORU5UICopcE9NWENvbXBvbmVudC0+cENvbXBvbmVudFByaXZhdGU7CisgICAgU0VDX09NWF9BVURJT0RFQ19DT01QT05FTlQgKnBBdWRpb0RlYyA9IChTRUNfT01YX0FVRElPREVDX0NPTVBPTkVOVCAqKXBTRUNDb21wb25lbnQtPmhDb21wb25lbnRIYW5kbGU7CisgICAgU0VDX01QM19IQU5ETEUgICAgICAgICAgICAgKnBNcDNEZWMgPSAoU0VDX01QM19IQU5ETEUgKilwQXVkaW9EZWMtPmhDb2RlY0hhbmRsZTsKKworICAgIEZ1bmN0aW9uSW4oKTsKKworICAgIFNFQ19PU0FMX01lbXNldChwU0VDQ29tcG9uZW50LT50aW1lU3RhbXAsIC0xOTc3MTAwMywgc2l6ZW9mKE9NWF9USUNLUykgKiBNQVhfVElNRVNUQU1QKTsKKyAgICBTRUNfT1NBTF9NZW1zZXQocFNFQ0NvbXBvbmVudC0+bkZsYWdzLCAwLCBzaXplb2YoT01YX1UzMikgKiBNQVhfRkxBR1MpOworICAgIHBTRUNDb21wb25lbnQtPmJVc2VGbGFnRU9GID0gT01YX1RSVUU7IC8qIE1wMyBleHRyYWN0b3Igc2hvdWxkIHBhcnNlIGludG8gZnJhbWUgdW5pdC4gKi8KKyAgICBwU0VDQ29tcG9uZW50LT5iU2F2ZUZsYWdFT1MgPSBPTVhfRkFMU0U7CisgICAgcE1wM0RlYy0+aFNSUE1wM0hhbmRsZS5iQ29uZmlndXJlZFNSUCA9IE9NWF9GQUxTRTsKKyAgICBwTXAzRGVjLT5oU1JQTXAzSGFuZGxlLmJTUlBTZW5kRU9TID0gT01YX0ZBTFNFOworICAgIHBTRUNDb21wb25lbnQtPmdldEFsbERlbGF5QnVmZmVyID0gT01YX0ZBTFNFOworCisjaWZkZWYgU1JQX0RVTVBfVE9fRklMRQorICAgIGluRmlsZSA9IGZvcGVuKCIvZGF0YS9JbkZpbGUubXAzIiwgIncrIik7CisgICAgb3V0RmlsZSA9IGZvcGVuKCIvZGF0YS9PdXRGaWxlLnBjbSIsICJ3KyIpOworI2VuZGlmCisKK0VYSVQ6CisgICAgRnVuY3Rpb25PdXQoKTsKKworICAgIHJldHVybiByZXQ7Cit9CisKK09NWF9FUlJPUlRZUEUgU0VDX1NSUF9NcDNEZWNfVGVybWluYXRlKE9NWF9DT01QT05FTlRUWVBFICpwT01YQ29tcG9uZW50KQoreworICAgIE9NWF9FUlJPUlRZUEUgICAgICAgICAgICAgICByZXQgPSBPTVhfRXJyb3JOb25lOworICAgIFNFQ19PTVhfQkFTRUNPTVBPTkVOVCAgICAgICpwU0VDQ29tcG9uZW50ID0gKFNFQ19PTVhfQkFTRUNPTVBPTkVOVCAqKXBPTVhDb21wb25lbnQtPnBDb21wb25lbnRQcml2YXRlOworCisgICAgRnVuY3Rpb25JbigpOworCisjaWZkZWYgU1JQX0RVTVBfVE9fRklMRQorICAgIGZjbG9zZShpbkZpbGUpOworICAgIGZjbG9zZShvdXRGaWxlKTsKKyNlbmRpZgorCitFWElUOgorICAgIEZ1bmN0aW9uT3V0KCk7CisKKyAgICByZXR1cm4gcmV0OworfQorCitPTVhfRVJST1JUWVBFIFNFQ19TUlBfTXAzX0RlY29kZV9CbG9jayhPTVhfQ09NUE9ORU5UVFlQRSAqcE9NWENvbXBvbmVudCwgU0VDX09NWF9EQVRBICpwSW5wdXREYXRhLCBTRUNfT01YX0RBVEEgKnBPdXRwdXREYXRhKQoreworICAgIE9NWF9FUlJPUlRZUEUgICAgICAgICAgICAgICByZXQgPSBPTVhfRXJyb3JOb25lOworICAgIFNFQ19PTVhfQkFTRUNPTVBPTkVOVCAgICAgICpwU0VDQ29tcG9uZW50ID0gKFNFQ19PTVhfQkFTRUNPTVBPTkVOVCAqKXBPTVhDb21wb25lbnQtPnBDb21wb25lbnRQcml2YXRlOworICAgIFNFQ19PTVhfQVVESU9ERUNfQ09NUE9ORU5UICpwQXVkaW9EZWMgPSAoU0VDX09NWF9BVURJT0RFQ19DT01QT05FTlQgKilwU0VDQ29tcG9uZW50LT5oQ29tcG9uZW50SGFuZGxlOworICAgIFNFQ19NUDNfSEFORExFICAgICAgICAgICAgICpwTXAzRGVjID0gKFNFQ19NUDNfSEFORExFICopcEF1ZGlvRGVjLT5oQ29kZWNIYW5kbGU7CisgICAgc3RydWN0IHNycF9kZWNfaW5mbyAgICAgICAgIGNvZGVjRGVjSW5mbzsKKyAgICBPTVhfUzMyICAgICAgICAgICAgICAgICAgICAgcmV0dXJuQ29kZWMgPSAwOworICAgIHVuc2lnbmVkIGxvbmcgICAgICAgICAgICAgICBpc1NSUFN0b3BwZWQgPSAwOworICAgIE9NWF9QVFIgICAgICAgICAgICAgICAgICAgICBkYXRhQnVmZmVyID0gTlVMTDsKKyAgICB1bnNpZ25lZCBpbnQgICAgICAgICAgICAgICAgZGF0YUxlbiA9IDA7CisgICAgT01YX0JPT0wgICAgICAgICAgICAgICAgICAgIGlzU1JQSWJ1Zk92ZXJmbG93ID0gT01YX0ZBTFNFOworCisgICAgRnVuY3Rpb25JbigpOworCisjaWZkZWYgU1JQX0RVTVBfVE9fRklMRQorICAgIGlmIChwU0VDQ29tcG9uZW50LT5yZUlucHV0RGF0YSA9PSBPTVhfRkFMU0UpIHsKKyAgICAgICAgZndyaXRlKHBJbnB1dERhdGEtPmRhdGFCdWZmZXIsIHBJbnB1dERhdGEtPmRhdGFMZW4sIDEsIGluRmlsZSk7CisgICAgfQorI2VuZGlmCisKKyAgICAvKiBTYXZlIHRpbWVzdGFtcCBhbmQgZmxhZ3Mgb2YgaW5wdXQgZGF0YSAqLworICAgIHBPdXRwdXREYXRhLT50aW1lU3RhbXAgPSBwSW5wdXREYXRhLT50aW1lU3RhbXA7CisgICAgcE91dHB1dERhdGEtPm5GbGFncyA9IHBJbnB1dERhdGEtPm5GbGFncyAmICh+T01YX0JVRkZFUkZMQUdfRU9TKTsKKworICAgIC8qIERlY29kaW5nIG1wMyBmcmFtZXMgYnkgU1JQICovCisgICAgaWYgKHBTRUNDb21wb25lbnQtPmdldEFsbERlbGF5QnVmZmVyID09IE9NWF9GQUxTRSkgeworICAgICAgICByZXR1cm5Db2RlYyA9IFNSUF9EZWNvZGUocElucHV0RGF0YS0+ZGF0YUJ1ZmZlciwgcElucHV0RGF0YS0+ZGF0YUxlbik7CisKKyAgICAgICAgaWYgKHJldHVybkNvZGVjID49IDApIHsKKyAgICAgICAgICAgIGlmIChwSW5wdXREYXRhLT5uRmxhZ3MgJiBPTVhfQlVGRkVSRkxBR19FT1MpIHsKKyAgICAgICAgICAgICAgICBTUlBfU2VuZF9FT1MoKTsKKyAgICAgICAgICAgICAgICBwTXAzRGVjLT5oU1JQTXAzSGFuZGxlLmJTUlBTZW5kRU9TID0gT01YX1RSVUU7CisgICAgICAgICAgICB9CisgICAgICAgIH0gZWxzZSBpZiAocmV0dXJuQ29kZWMgPT0gU1JQX0VSUk9SX0lCVUZfT1ZFUkZMT1cpIHsKKyAgICAgICAgICAgIGlzU1JQSWJ1Zk92ZXJmbG93ID0gT01YX1RSVUU7CisgICAgICAgICAgICByZXQgPSBPTVhfRXJyb3JJbnB1dERhdGFEZWNvZGVZZXQ7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAocE1wM0RlYy0+aFNSUE1wM0hhbmRsZS5iQ29uZmlndXJlZFNSUCA9PSBPTVhfRkFMU0UpIHsKKyAgICAgICAgcmV0dXJuQ29kZWMgPSBTUlBfR2V0X0RlY19JbmZvKCZjb2RlY0RlY0luZm8pOworICAgICAgICBpZiAocmV0dXJuQ29kZWMgPCAwKSB7CisgICAgICAgICAgICBTRUNfT1NBTF9Mb2coU0VDX0xPR19FUlJPUiwgIlNSUF9HZXRfRGVjX0luZm8gZmFpbGVkOiAlZCIsIHJldHVybkNvZGVjKTsKKyAgICAgICAgICAgIHJldCA9IE9NWF9FcnJvckhhcmR3YXJlOworICAgICAgICAgICAgZ290byBFWElUOworICAgICAgICB9CisKKyAgICAgICAgaWYgKCFjb2RlY0RlY0luZm8uc2FtcGxlX3JhdGUgfHwgIWNvZGVjRGVjSW5mby5jaGFubmVscykgeworICAgICAgICAgICAgaWYgKHBNcDNEZWMtPmhTUlBNcDNIYW5kbGUuYlNSUFNlbmRFT1MgPT0gT01YX1RSVUUpIHsKKyAgICAgICAgICAgICAgICBwT3V0cHV0RGF0YS0+ZGF0YUxlbiA9IDA7CisgICAgICAgICAgICAgICAgcFNFQ0NvbXBvbmVudC0+Z2V0QWxsRGVsYXlCdWZmZXIgPSBPTVhfVFJVRTsKKyAgICAgICAgICAgICAgICByZXQgPSBPTVhfRXJyb3JJbnB1dERhdGFEZWNvZGVZZXQ7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIHBTRUNDb21wb25lbnQtPmdldEFsbERlbGF5QnVmZmVyID0gT01YX0ZBTFNFOworICAgICAgICAgICAgICAgIGlmIChpc1NSUElidWZPdmVyZmxvdykKKyAgICAgICAgICAgICAgICAgICAgcmV0ID0gT01YX0Vycm9ySW5wdXREYXRhRGVjb2RlWWV0OworICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgcmV0ID0gT01YX0Vycm9yTm9uZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGdvdG8gRVhJVDsKKyAgICAgICAgfQorCisgICAgICAgIFNFQ19PU0FMX0xvZyhTRUNfTE9HX1RSQUNFLCAibnVtQ2hhbm5lbHMoJWQpLCBzYW1wbGluZ1JhdGUoJWQpIiwKKyAgICAgICAgICAgIGNvZGVjRGVjSW5mby5jaGFubmVscywgY29kZWNEZWNJbmZvLnNhbXBsZV9yYXRlKTsKKworICAgICAgICBpZiAocE1wM0RlYy0+cGNtUGFyYW0ubkNoYW5uZWxzICE9IGNvZGVjRGVjSW5mby5jaGFubmVscyB8fAorICAgICAgICAgICAgcE1wM0RlYy0+cGNtUGFyYW0ublNhbXBsaW5nUmF0ZSAhPSBjb2RlY0RlY0luZm8uc2FtcGxlX3JhdGUpIHsKKyAgICAgICAgICAgIC8qIENoYW5nZSBjaGFubmVsIGNvdW50IGFuZCBzYW1wbGluZyByYXRlIGluZm9ybWF0aW9uICovCisgICAgICAgICAgICBwTXAzRGVjLT5wY21QYXJhbS5uQ2hhbm5lbHMgPSBjb2RlY0RlY0luZm8uY2hhbm5lbHM7CisgICAgICAgICAgICBwTXAzRGVjLT5wY21QYXJhbS5uU2FtcGxpbmdSYXRlID0gY29kZWNEZWNJbmZvLnNhbXBsZV9yYXRlOworCisgICAgICAgICAgICAvKiBTZW5kIFBvcnQgU2V0dGluZ3MgY2hhbmdlZCBjYWxsIGJhY2sgKi8KKyAgICAgICAgICAgICgqKHBTRUNDb21wb25lbnQtPnBDYWxsYmFja3MtPkV2ZW50SGFuZGxlcikpCisgICAgICAgICAgICAgICAgICAocE9NWENvbXBvbmVudCwKKyAgICAgICAgICAgICAgICAgICBwU0VDQ29tcG9uZW50LT5jYWxsYmFja0RhdGEsCisgICAgICAgICAgICAgICAgICAgT01YX0V2ZW50UG9ydFNldHRpbmdzQ2hhbmdlZCwgLyogVGhlIGNvbW1hbmQgd2FzIGNvbXBsZXRlZCAqLworICAgICAgICAgICAgICAgICAgIE9NWF9EaXJPdXRwdXQsIC8qIFRoaXMgaXMgdGhlIHBvcnQgaW5kZXggKi8KKyAgICAgICAgICAgICAgICAgICAwLAorICAgICAgICAgICAgICAgICAgIE5VTEwpOworICAgICAgICB9CisKKyAgICAgICAgcE1wM0RlYy0+aFNSUE1wM0hhbmRsZS5iQ29uZmlndXJlZFNSUCA9IE9NWF9UUlVFOworCisgICAgICAgIGlmIChwTXAzRGVjLT5oU1JQTXAzSGFuZGxlLmJTUlBTZW5kRU9TID09IE9NWF9UUlVFKSB7CisgICAgICAgICAgICBwT3V0cHV0RGF0YS0+ZGF0YUxlbiA9IDA7CisgICAgICAgICAgICBwU0VDQ29tcG9uZW50LT5nZXRBbGxEZWxheUJ1ZmZlciA9IE9NWF9UUlVFOworICAgICAgICAgICAgcmV0ID0gT01YX0Vycm9ySW5wdXREYXRhRGVjb2RlWWV0OworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgcFNFQ0NvbXBvbmVudC0+Z2V0QWxsRGVsYXlCdWZmZXIgPSBPTVhfRkFMU0U7CisgICAgICAgICAgICBpZiAoaXNTUlBJYnVmT3ZlcmZsb3cpCisgICAgICAgICAgICAgICAgcmV0ID0gT01YX0Vycm9ySW5wdXREYXRhRGVjb2RlWWV0OworICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgIHJldCA9IE9NWF9FcnJvck5vbmU7CisgICAgICAgIH0KKyAgICAgICAgZ290byBFWElUOworICAgIH0KKworICAgIC8qIEdldCBkZWNvZGVkIGRhdGEgZnJvbSBTUlAgKi8KKyAgICByZXR1cm5Db2RlYyA9IFNSUF9HZXRfUENNKCZkYXRhQnVmZmVyLCAmZGF0YUxlbik7CisgICAgaWYgKGRhdGFMZW4gPiAwKSB7CisgICAgICAgIHBPdXRwdXREYXRhLT5kYXRhTGVuID0gZGF0YUxlbjsKKyAgICAgICAgU0VDX09TQUxfTWVtY3B5KHBPdXRwdXREYXRhLT5kYXRhQnVmZmVyLCBkYXRhQnVmZmVyLCBkYXRhTGVuKTsKKyAgICB9IGVsc2UgeworICAgICAgICBwT3V0cHV0RGF0YS0+ZGF0YUxlbiA9IDA7CisgICAgfQorCisjaWZkZWYgU1JQX0RVTVBfVE9fRklMRQorICAgIGlmIChwT3V0cHV0RGF0YS0+ZGF0YUxlbiA+IDApCisgICAgICAgIGZ3cml0ZShwT3V0cHV0RGF0YS0+ZGF0YUJ1ZmZlciwgcE91dHB1dERhdGEtPmRhdGFMZW4sIDEsIG91dEZpbGUpOworI2VuZGlmCisKKyAgICAvKiBEZWxheSBFT1Mgc2lnbmFsIHVudGlsIGFsbCB0aGUgUENNIGlzIHJldHVybmVkIGZyb20gdGhlIFNSUCBkcml2ZXIuICovCisgICAgaWYgKHBNcDNEZWMtPmhTUlBNcDNIYW5kbGUuYlNSUFNlbmRFT1MgPT0gT01YX1RSVUUpIHsKKyAgICAgICAgaWYgKHBJbnB1dERhdGEtPm5GbGFncyAmIE9NWF9CVUZGRVJGTEFHX0VPUykgeworICAgICAgICAgICAgcmV0dXJuQ29kZWMgPSBTUlBfR2V0UGFyYW1zKFNSUF9TVE9QX0VPU19TVEFURSwgJmlzU1JQU3RvcHBlZCk7CisgICAgICAgICAgICBpZiAocmV0dXJuQ29kZWMgIT0gMCkKKyAgICAgICAgICAgICAgICBTRUNfT1NBTF9Mb2coU0VDX0xPR19FUlJPUiwgIkZhaWwgU1JQX1NUT1BfRU9TX1NUQVRFIik7CisgICAgICAgICAgICBpZiAoaXNTUlBTdG9wcGVkID09IDEpIHsKKyAgICAgICAgICAgICAgICBwT3V0cHV0RGF0YS0+bkZsYWdzIHw9IE9NWF9CVUZGRVJGTEFHX0VPUzsKKyAgICAgICAgICAgICAgICBwU0VDQ29tcG9uZW50LT5nZXRBbGxEZWxheUJ1ZmZlciA9IE9NWF9GQUxTRTsKKyAgICAgICAgICAgICAgICBwTXAzRGVjLT5oU1JQTXAzSGFuZGxlLmJTUlBTZW5kRU9TID0gT01YX0ZBTFNFOyAvKiBmb3IgcmVwZWF0aW5nIG9uZSBzb25nICovCisgICAgICAgICAgICAgICAgcmV0ID0gT01YX0Vycm9yTm9uZTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgcFNFQ0NvbXBvbmVudC0+Z2V0QWxsRGVsYXlCdWZmZXIgPSBPTVhfVFJVRTsKKyAgICAgICAgICAgICAgICByZXQgPSBPTVhfRXJyb3JJbnB1dERhdGFEZWNvZGVZZXQ7CisgICAgICAgICAgICB9CisgICAgICAgIH0gZWxzZSB7IC8qIEZsdXNoIGFmdGVyIEVPUyAqLworICAgICAgICAgICAgcE1wM0RlYy0+aFNSUE1wM0hhbmRsZS5iU1JQU2VuZEVPUyA9IE9NWF9GQUxTRTsKKyAgICAgICAgfQorICAgIH0KK0VYSVQ6CisgICAgRnVuY3Rpb25PdXQoKTsKKworICAgIHJldHVybiByZXQ7Cit9CisKK09NWF9FUlJPUlRZUEUgU0VDX1NSUF9NcDNEZWNfYnVmZmVyUHJvY2VzcyhPTVhfQ09NUE9ORU5UVFlQRSAqcE9NWENvbXBvbmVudCwgU0VDX09NWF9EQVRBICpwSW5wdXREYXRhLCBTRUNfT01YX0RBVEEgKnBPdXRwdXREYXRhKQoreworICAgIE9NWF9FUlJPUlRZUEUgICAgICAgICAgcmV0ID0gT01YX0Vycm9yTm9uZTsKKyAgICBTRUNfT01YX0JBU0VDT01QT05FTlQgKnBTRUNDb21wb25lbnQgPSAoU0VDX09NWF9CQVNFQ09NUE9ORU5UICopcE9NWENvbXBvbmVudC0+cENvbXBvbmVudFByaXZhdGU7CisgICAgU0VDX09NWF9CQVNFUE9SVCAgICAgICpwSW5wdXRQb3J0ID0gJnBTRUNDb21wb25lbnQtPnBTRUNQb3J0W0lOUFVUX1BPUlRfSU5ERVhdOworICAgIFNFQ19PTVhfQkFTRVBPUlQgICAgICAqcE91dHB1dFBvcnQgPSAmcFNFQ0NvbXBvbmVudC0+cFNFQ1BvcnRbT1VUUFVUX1BPUlRfSU5ERVhdOworCisgICAgRnVuY3Rpb25JbigpOworCisgICAgaWYgKCghQ0hFQ0tfUE9SVF9FTkFCTEVEKHBJbnB1dFBvcnQpKSB8fCAoIUNIRUNLX1BPUlRfRU5BQkxFRChwT3V0cHV0UG9ydCkpIHx8CisgICAgICAgICAgICAoIUNIRUNLX1BPUlRfUE9QVUxBVEVEKHBJbnB1dFBvcnQpKSB8fCAoIUNIRUNLX1BPUlRfUE9QVUxBVEVEKHBPdXRwdXRQb3J0KSkpIHsKKyAgICAgICAgaWYgKHBJbnB1dERhdGEtPm5GbGFncyAmIE9NWF9CVUZGRVJGTEFHX0VPUykKKyAgICAgICAgICAgIHJldCA9IE9NWF9FcnJvcklucHV0RGF0YURlY29kZVlldDsKKyAgICAgICAgZWxzZQorICAgICAgICAgICAgcmV0ID0gT01YX0Vycm9yTm9uZTsKKworICAgICAgICBnb3RvIEVYSVQ7CisgICAgfQorICAgIGlmIChPTVhfRkFMU0UgPT0gU0VDX0NoZWNrX0J1ZmZlclByb2Nlc3NfU3RhdGUocFNFQ0NvbXBvbmVudCkpIHsKKyAgICAgICAgaWYgKHBJbnB1dERhdGEtPm5GbGFncyAmIE9NWF9CVUZGRVJGTEFHX0VPUykKKyAgICAgICAgICAgIHJldCA9IE9NWF9FcnJvcklucHV0RGF0YURlY29kZVlldDsKKyAgICAgICAgZWxzZQorICAgICAgICAgICAgcmV0ID0gT01YX0Vycm9yTm9uZTsKKworICAgICAgICBnb3RvIEVYSVQ7CisgICAgfQorCisgICAgcmV0ID0gU0VDX1NSUF9NcDNfRGVjb2RlX0Jsb2NrKHBPTVhDb21wb25lbnQsIHBJbnB1dERhdGEsIHBPdXRwdXREYXRhKTsKKworICAgIGlmIChyZXQgIT0gT01YX0Vycm9yTm9uZSkgeworICAgICAgICBpZiAocmV0ID09IE9NWF9FcnJvcklucHV0RGF0YURlY29kZVlldCkgeworICAgICAgICAgICAgcE91dHB1dERhdGEtPnVzZWREYXRhTGVuID0gMDsKKyAgICAgICAgICAgIHBPdXRwdXREYXRhLT5yZW1haW5EYXRhTGVuID0gcE91dHB1dERhdGEtPmRhdGFMZW47CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBwU0VDQ29tcG9uZW50LT5wQ2FsbGJhY2tzLT5FdmVudEhhbmRsZXIoKE9NWF9IQU5ETEVUWVBFKXBPTVhDb21wb25lbnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcFNFQ0NvbXBvbmVudC0+Y2FsbGJhY2tEYXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9NWF9FdmVudEVycm9yLCByZXQsIDAsIE5VTEwpOworICAgICAgICB9CisgICAgfSBlbHNlIHsKKyAgICAgICAgcElucHV0RGF0YS0+cHJldmlvdXNEYXRhTGVuID0gcElucHV0RGF0YS0+ZGF0YUxlbjsKKyAgICAgICAgcElucHV0RGF0YS0+dXNlZERhdGFMZW4gKz0gcElucHV0RGF0YS0+ZGF0YUxlbjsKKyAgICAgICAgcElucHV0RGF0YS0+cmVtYWluRGF0YUxlbiA9IHBJbnB1dERhdGEtPmRhdGFMZW4gLSBwSW5wdXREYXRhLT51c2VkRGF0YUxlbjsKKyAgICAgICAgcElucHV0RGF0YS0+ZGF0YUxlbiAtPSBwSW5wdXREYXRhLT51c2VkRGF0YUxlbjsKKyAgICAgICAgcElucHV0RGF0YS0+dXNlZERhdGFMZW4gPSAwOworCisgICAgICAgIHBPdXRwdXREYXRhLT51c2VkRGF0YUxlbiA9IDA7CisgICAgICAgIHBPdXRwdXREYXRhLT5yZW1haW5EYXRhTGVuID0gcE91dHB1dERhdGEtPmRhdGFMZW47CisgICAgfQorCitFWElUOgorICAgIEZ1bmN0aW9uT3V0KCk7CisKKyAgICByZXR1cm4gcmV0OworfQorCitPU0NMX0VYUE9SVF9SRUYgT01YX0VSUk9SVFlQRSBTRUNfT01YX0NvbXBvbmVudEluaXQoT01YX0hBTkRMRVRZUEUgaENvbXBvbmVudCwgT01YX1NUUklORyBjb21wb25lbnROYW1lKQoreworICAgIE9NWF9FUlJPUlRZUEUgICAgICAgICAgICAgICByZXQgPSBPTVhfRXJyb3JOb25lOworICAgIE9NWF9DT01QT05FTlRUWVBFICAgICAgICAgICpwT01YQ29tcG9uZW50ID0gTlVMTDsKKyAgICBTRUNfT01YX0JBU0VDT01QT05FTlQgICAgICAqcFNFQ0NvbXBvbmVudCA9IE5VTEw7CisgICAgU0VDX09NWF9CQVNFUE9SVCAgICAgICAgICAgKnBTRUNQb3J0ID0gTlVMTDsKKyAgICBTRUNfT01YX0FVRElPREVDX0NPTVBPTkVOVCAqcEF1ZGlvRGVjID0gTlVMTDsKKyAgICBTRUNfTVAzX0hBTkRMRSAgICAgICAgICAgICAqcE1wM0RlYyA9IE5VTEw7CisgICAgT01YX1BUUiAgICAgICAgICAgICAgICAgICAgIHBJbnB1dEJ1ZmZlciA9IE5VTEw7CisgICAgT01YX1BUUiAgICAgICAgICAgICAgICAgICAgIHBPdXRwdXRCdWZmZXIgPSBOVUxMOworICAgIHVuc2lnbmVkIGludCAgICAgICAgICAgICAgICBpbnB1dEJ1ZmZlclNpemUgPSAwOworICAgIHVuc2lnbmVkIGludCAgICAgICAgICAgICAgICBpbnB1dEJ1ZmZlck51bSA9IDA7CisgICAgdW5zaWduZWQgaW50ICAgICAgICAgICAgICAgIG91dHB1dEJ1ZmZlclNpemUgPSAwOworICAgIHVuc2lnbmVkIGludCAgICAgICAgICAgICAgICBvdXRwdXRCdWZmZXJOdW0gPSAwOworICAgIE9NWF9TMzIgICAgICAgICAgICAgICAgICAgICByZXR1cm5Db2RlYzsKKyAgICBpbnQgaSA9IDA7CisKKyAgICBGdW5jdGlvbkluKCk7CisKKyAgICBpZiAoKGhDb21wb25lbnQgPT0gTlVMTCkgfHwgKGNvbXBvbmVudE5hbWUgPT0gTlVMTCkpIHsKKyAgICAgICAgU0VDX09TQUxfTG9nKFNFQ19MT0dfRVJST1IsICIlczogcGFyYW1ldGVycyBhcmUgbnVsbCwgcmV0OiAlWCIsIF9fRlVOQ1RJT05fXywgcmV0KTsKKyAgICAgICAgcmV0ID0gT01YX0Vycm9yQmFkUGFyYW1ldGVyOworICAgICAgICBnb3RvIEVYSVQ7CisgICAgfQorICAgIGlmIChTRUNfT1NBTF9TdHJjbXAoU0VDX09NWF9DT01QT05FTlRfTVAzX0RFQywgY29tcG9uZW50TmFtZSkgIT0gMCkgeworICAgICAgICBTRUNfT1NBTF9Mb2coU0VDX0xPR19FUlJPUiwgIiVzOiBjb21wb25lbnROYW1lKCVzKSBlcnJvciwgcmV0OiAlWCIsIF9fRlVOQ1RJT05fXywgY29tcG9uZW50TmFtZSwgcmV0KTsKKyAgICAgICAgcmV0ID0gT01YX0Vycm9yQmFkUGFyYW1ldGVyOworICAgICAgICBnb3RvIEVYSVQ7CisgICAgfQorCisgICAgcE9NWENvbXBvbmVudCA9IChPTVhfQ09NUE9ORU5UVFlQRSAqKWhDb21wb25lbnQ7CisgICAgcmV0ID0gU0VDX09NWF9BdWRpb0RlY29kZUNvbXBvbmVudEluaXQocE9NWENvbXBvbmVudCk7CisgICAgaWYgKHJldCAhPSBPTVhfRXJyb3JOb25lKSB7CisgICAgICAgIFNFQ19PU0FMX0xvZyhTRUNfTE9HX0VSUk9SLCAiJXM6IFNFQ19PTVhfQXVkaW9EZWNvZGVDb21wb25lbnRJbml0IGVycm9yLCByZXQ6ICVYIiwgX19GVU5DVElPTl9fLCByZXQpOworICAgICAgICBnb3RvIEVYSVQ7CisgICAgfQorICAgIHBTRUNDb21wb25lbnQgPSAoU0VDX09NWF9CQVNFQ09NUE9ORU5UICopcE9NWENvbXBvbmVudC0+cENvbXBvbmVudFByaXZhdGU7CisgICAgcFNFQ0NvbXBvbmVudC0+Y29kZWNUeXBlID0gSFdfQVVESU9fREVDX0NPREVDOworCisgICAgcFNFQ0NvbXBvbmVudC0+Y29tcG9uZW50TmFtZSA9IChPTVhfU1RSSU5HKVNFQ19PU0FMX01hbGxvYyhNQVhfT01YX0NPTVBPTkVOVF9OQU1FX1NJWkUpOworICAgIGlmIChwU0VDQ29tcG9uZW50LT5jb21wb25lbnROYW1lID09IE5VTEwpIHsKKyAgICAgICAgU0VDX09TQUxfTG9nKFNFQ19MT0dfRVJST1IsICIlczogY29tcG9uZW50TmFtZSBhbGxvYyBlcnJvciwgcmV0OiAlWCIsIF9fRlVOQ1RJT05fXywgcmV0KTsKKyAgICAgICAgcmV0ID0gT01YX0Vycm9ySW5zdWZmaWNpZW50UmVzb3VyY2VzOworICAgICAgICBnb3RvIEVYSVRfRVJST1JfMTsKKyAgICB9CisgICAgU0VDX09TQUxfTWVtc2V0KHBTRUNDb21wb25lbnQtPmNvbXBvbmVudE5hbWUsIDAsIE1BWF9PTVhfQ09NUE9ORU5UX05BTUVfU0laRSk7CisgICAgU0VDX09TQUxfU3RyY3B5KHBTRUNDb21wb25lbnQtPmNvbXBvbmVudE5hbWUsIFNFQ19PTVhfQ09NUE9ORU5UX01QM19ERUMpOworCisgICAgcE1wM0RlYyA9IFNFQ19PU0FMX01hbGxvYyhzaXplb2YoU0VDX01QM19IQU5ETEUpKTsKKyAgICBpZiAocE1wM0RlYyA9PSBOVUxMKSB7CisgICAgICAgIFNFQ19PU0FMX0xvZyhTRUNfTE9HX0VSUk9SLCAiJXM6IFNFQ19NUDNfSEFORExFIGFsbG9jIGVycm9yLCByZXQ6ICVYIiwgX19GVU5DVElPTl9fLCByZXQpOworICAgICAgICByZXQgPSBPTVhfRXJyb3JJbnN1ZmZpY2llbnRSZXNvdXJjZXM7CisgICAgICAgIGdvdG8gRVhJVF9FUlJPUl8yOworICAgIH0KKyAgICBTRUNfT1NBTF9NZW1zZXQocE1wM0RlYywgMCwgc2l6ZW9mKFNFQ19NUDNfSEFORExFKSk7CisgICAgcEF1ZGlvRGVjID0gKFNFQ19PTVhfQVVESU9ERUNfQ09NUE9ORU5UICopcFNFQ0NvbXBvbmVudC0+aENvbXBvbmVudEhhbmRsZTsKKyAgICBwQXVkaW9EZWMtPmhDb2RlY0hhbmRsZSA9IChPTVhfSEFORExFVFlQRSlwTXAzRGVjOworCisgICAgLyogQ3JlYXRlIGFuZCBJbml0IFNSUCAqLworICAgIHBNcDNEZWMtPmhTUlBNcDNIYW5kbGUuYlNSUExvYWRlZCA9IE9NWF9GQUxTRTsKKyAgICByZXR1cm5Db2RlYyA9IFNSUF9DcmVhdGUoU1JQX0lOSVRfQkxPQ0tfTU9ERSk7CisgICAgaWYgKHJldHVybkNvZGVjIDwgMCkgeworICAgICAgICBTRUNfT1NBTF9Mb2coU0VDX0xPR19FUlJPUiwgIlNSUF9DcmVhdGUgZmFpbGVkOiAlZCIsIHJldHVybkNvZGVjKTsKKyAgICAgICAgcmV0ID0gT01YX0Vycm9ySGFyZHdhcmU7CisgICAgICAgIGdvdG8gRVhJVF9FUlJPUl8zOworICAgIH0KKyAgICBwTXAzRGVjLT5oU1JQTXAzSGFuZGxlLmhTUlBIYW5kbGUgPSAoT01YX0hBTkRMRVRZUEUpcmV0dXJuQ29kZWM7IC8qIFNSUCdzIGZkICovCisgICAgcmV0dXJuQ29kZWMgPSBTUlBfSW5pdCgpOworICAgIGlmIChyZXR1cm5Db2RlYyA8IDApIHsKKyAgICAgICAgU0VDX09TQUxfTG9nKFNFQ19MT0dfRVJST1IsICJTUlBfSW5pdCBmYWlsZWQ6ICVkIiwgcmV0dXJuQ29kZWMpOworICAgICAgICByZXQgPSBPTVhfRXJyb3JIYXJkd2FyZTsKKyAgICAgICAgZ290byBFWElUX0VSUk9SXzQ7CisgICAgfQorICAgIHBNcDNEZWMtPmhTUlBNcDNIYW5kbGUuYlNSUExvYWRlZCA9IE9NWF9UUlVFOworCisgICAgLyogR2V0IGlucHV0IGJ1ZmZlciBpbmZvIGZyb20gU1JQICovCisgICAgcmV0dXJuQ29kZWMgPSBTUlBfR2V0X0lidWZfSW5mbygmcElucHV0QnVmZmVyLCAmaW5wdXRCdWZmZXJTaXplLCAmaW5wdXRCdWZmZXJOdW0pOworICAgIGlmIChyZXR1cm5Db2RlYyA8IDApIHsKKyAgICAgICAgU0VDX09TQUxfTG9nKFNFQ19MT0dfRVJST1IsICJTUlBfR2V0X0lidWZfSW5mbyBmYWlsZWQ6ICVkIiwgcmV0dXJuQ29kZWMpOworICAgICAgICByZXQgPSBPTVhfRXJyb3JIYXJkd2FyZTsKKyAgICAgICAgZ290byBFWElUX0VSUk9SXzU7CisgICAgfQorCisgICAgcFNFQ0NvbXBvbmVudC0+cHJvY2Vzc0RhdGFbSU5QVVRfUE9SVF9JTkRFWF0uYWxsb2NTaXplID0gaW5wdXRCdWZmZXJTaXplOworICAgIHBTRUNDb21wb25lbnQtPnByb2Nlc3NEYXRhW0lOUFVUX1BPUlRfSU5ERVhdLmRhdGFCdWZmZXIgPSBTRUNfT1NBTF9NYWxsb2MoaW5wdXRCdWZmZXJTaXplKTsKKyAgICBpZiAocFNFQ0NvbXBvbmVudC0+cHJvY2Vzc0RhdGFbSU5QVVRfUE9SVF9JTkRFWF0uZGF0YUJ1ZmZlciA9PSBOVUxMKSB7CisgICAgICAgIFNFQ19PU0FMX0xvZyhTRUNfTE9HX0VSUk9SLCAiSW5wdXQgZGF0YSBidWZmZXIgYWxsb2MgZmFpbGVkIik7CisgICAgICAgIHJldCA9IE9NWF9FcnJvckluc3VmZmljaWVudFJlc291cmNlczsKKyAgICAgICAgZ290byBFWElUX0VSUk9SXzU7CisgICAgfQorCisgICAgLyogR2V0IG91dHB1dCBidWZmZXIgaW5mbyBmcm9tIFNSUCAqLworICAgIHJldHVybkNvZGVjID0gU1JQX0dldF9PYnVmX0luZm8oJnBPdXRwdXRCdWZmZXIsICZvdXRwdXRCdWZmZXJTaXplLCAmb3V0cHV0QnVmZmVyTnVtKTsKKyAgICBpZiAocmV0dXJuQ29kZWMgPCAwKSB7CisgICAgICAgIFNFQ19PU0FMX0xvZyhTRUNfTE9HX0VSUk9SLCAiU1JQX0dldF9PYnVmX0luZm8gZmFpbGVkOiAlZCIsIHJldHVybkNvZGVjKTsKKyAgICAgICAgcmV0ID0gT01YX0Vycm9ySGFyZHdhcmU7CisgICAgICAgIGdvdG8gRVhJVF9FUlJPUl82OworICAgIH0KKworICAgIC8qIFNldCBjb21wb25lbnRWZXJzaW9uICovCisgICAgcFNFQ0NvbXBvbmVudC0+Y29tcG9uZW50VmVyc2lvbi5zLm5WZXJzaW9uTWFqb3IgPSBWRVJTSU9OTUFKT1JfTlVNQkVSOworICAgIHBTRUNDb21wb25lbnQtPmNvbXBvbmVudFZlcnNpb24ucy5uVmVyc2lvbk1pbm9yID0gVkVSU0lPTk1JTk9SX05VTUJFUjsKKyAgICBwU0VDQ29tcG9uZW50LT5jb21wb25lbnRWZXJzaW9uLnMublJldmlzaW9uICAgICA9IFJFVklTSU9OX05VTUJFUjsKKyAgICBwU0VDQ29tcG9uZW50LT5jb21wb25lbnRWZXJzaW9uLnMublN0ZXAgICAgICAgICA9IFNURVBfTlVNQkVSOworCisgICAgLyogU2V0IHNwZWNWZXJzaW9uICovCisgICAgcFNFQ0NvbXBvbmVudC0+c3BlY1ZlcnNpb24ucy5uVmVyc2lvbk1ham9yID0gVkVSU0lPTk1BSk9SX05VTUJFUjsKKyAgICBwU0VDQ29tcG9uZW50LT5zcGVjVmVyc2lvbi5zLm5WZXJzaW9uTWlub3IgPSBWRVJTSU9OTUlOT1JfTlVNQkVSOworICAgIHBTRUNDb21wb25lbnQtPnNwZWNWZXJzaW9uLnMublJldmlzaW9uICAgICA9IFJFVklTSU9OX05VTUJFUjsKKyAgICBwU0VDQ29tcG9uZW50LT5zcGVjVmVyc2lvbi5zLm5TdGVwICAgICAgICAgPSBTVEVQX05VTUJFUjsKKworICAgIC8qIElucHV0IHBvcnQgKi8KKyAgICBwU0VDUG9ydCA9ICZwU0VDQ29tcG9uZW50LT5wU0VDUG9ydFtJTlBVVF9QT1JUX0lOREVYXTsKKyAgICBwU0VDUG9ydC0+cG9ydERlZmluaXRpb24ubkJ1ZmZlckNvdW50QWN0dWFsID0gaW5wdXRCdWZmZXJOdW07CisgICAgcFNFQ1BvcnQtPnBvcnREZWZpbml0aW9uLm5CdWZmZXJDb3VudE1pbiA9IGlucHV0QnVmZmVyTnVtOworICAgIHBTRUNQb3J0LT5wb3J0RGVmaW5pdGlvbi5uQnVmZmVyU2l6ZSA9IGlucHV0QnVmZmVyU2l6ZTsKKyAgICBwU0VDUG9ydC0+cG9ydERlZmluaXRpb24uYkVuYWJsZWQgPSBPTVhfVFJVRTsKKyAgICBTRUNfT1NBTF9NZW1zZXQocFNFQ1BvcnQtPnBvcnREZWZpbml0aW9uLmZvcm1hdC5hdWRpby5jTUlNRVR5cGUsIDAsIE1BWF9PTVhfTUlNRVRZUEVfU0laRSk7CisgICAgU0VDX09TQUxfU3RyY3B5KHBTRUNQb3J0LT5wb3J0RGVmaW5pdGlvbi5mb3JtYXQuYXVkaW8uY01JTUVUeXBlLCAiYXVkaW8vbXBlZyIpOworICAgIHBTRUNQb3J0LT5wb3J0RGVmaW5pdGlvbi5mb3JtYXQuYXVkaW8ucE5hdGl2ZVJlbmRlciA9IDA7CisgICAgcFNFQ1BvcnQtPnBvcnREZWZpbml0aW9uLmZvcm1hdC5hdWRpby5iRmxhZ0Vycm9yQ29uY2VhbG1lbnQgPSBPTVhfRkFMU0U7CisgICAgcFNFQ1BvcnQtPnBvcnREZWZpbml0aW9uLmZvcm1hdC5hdWRpby5lRW5jb2RpbmcgPSBPTVhfQVVESU9fQ29kaW5nTVAzOworCisgICAgLyogT3V0cHV0IHBvcnQgKi8KKyAgICBwU0VDUG9ydCA9ICZwU0VDQ29tcG9uZW50LT5wU0VDUG9ydFtPVVRQVVRfUE9SVF9JTkRFWF07CisgICAgcFNFQ1BvcnQtPnBvcnREZWZpbml0aW9uLm5CdWZmZXJDb3VudEFjdHVhbCA9IG91dHB1dEJ1ZmZlck51bTsKKyAgICBwU0VDUG9ydC0+cG9ydERlZmluaXRpb24ubkJ1ZmZlckNvdW50TWluID0gb3V0cHV0QnVmZmVyTnVtOworICAgIHBTRUNQb3J0LT5wb3J0RGVmaW5pdGlvbi5uQnVmZmVyU2l6ZSA9IG91dHB1dEJ1ZmZlclNpemU7CisgICAgcFNFQ1BvcnQtPnBvcnREZWZpbml0aW9uLmJFbmFibGVkID0gT01YX1RSVUU7CisgICAgU0VDX09TQUxfTWVtc2V0KHBTRUNQb3J0LT5wb3J0RGVmaW5pdGlvbi5mb3JtYXQuYXVkaW8uY01JTUVUeXBlLCAwLCBNQVhfT01YX01JTUVUWVBFX1NJWkUpOworICAgIFNFQ19PU0FMX1N0cmNweShwU0VDUG9ydC0+cG9ydERlZmluaXRpb24uZm9ybWF0LmF1ZGlvLmNNSU1FVHlwZSwgImF1ZGlvL3JhdyIpOworICAgIHBTRUNQb3J0LT5wb3J0RGVmaW5pdGlvbi5mb3JtYXQuYXVkaW8ucE5hdGl2ZVJlbmRlciA9IDA7CisgICAgcFNFQ1BvcnQtPnBvcnREZWZpbml0aW9uLmZvcm1hdC5hdWRpby5iRmxhZ0Vycm9yQ29uY2VhbG1lbnQgPSBPTVhfRkFMU0U7CisgICAgcFNFQ1BvcnQtPnBvcnREZWZpbml0aW9uLmZvcm1hdC5hdWRpby5lRW5jb2RpbmcgPSBPTVhfQVVESU9fQ29kaW5nUENNOworCisgICAgLyogRGVmYXVsdCB2YWx1ZXMgZm9yIE1wMyBhdWRpbyBwYXJhbSAqLworICAgIElOSVRfU0VUX1NJWkVfVkVSU0lPTigmcE1wM0RlYy0+bXAzUGFyYW0sIE9NWF9BVURJT19QQVJBTV9NUDNUWVBFKTsKKyAgICBwTXAzRGVjLT5tcDNQYXJhbS5uUG9ydEluZGV4ICAgICAgPSBJTlBVVF9QT1JUX0lOREVYOworICAgIHBNcDNEZWMtPm1wM1BhcmFtLm5DaGFubmVscyAgICAgICA9IERFRkFVTFRfQVVESU9fQ0hBTk5FTFNfTlVNOworICAgIHBNcDNEZWMtPm1wM1BhcmFtLm5CaXRSYXRlICAgICAgICA9IDA7CisgICAgcE1wM0RlYy0+bXAzUGFyYW0ublNhbXBsZVJhdGUgICAgID0gREVGQVVMVF9BVURJT19TQU1QTElOR19GUkVROworICAgIHBNcDNEZWMtPm1wM1BhcmFtLm5BdWRpb0JhbmRXaWR0aCA9IDA7CisgICAgcE1wM0RlYy0+bXAzUGFyYW0uZUNoYW5uZWxNb2RlICAgID0gT01YX0FVRElPX0NoYW5uZWxNb2RlU3RlcmVvOworICAgIHBNcDNEZWMtPm1wM1BhcmFtLmVGb3JtYXQgICAgICAgICA9IE9NWF9BVURJT19NUDNTdHJlYW1Gb3JtYXRNUDFMYXllcjM7CisKKyAgICAvKiBEZWZhdWx0IHZhbHVlcyBmb3IgUENNIGF1ZGlvIHBhcmFtICovCisgICAgSU5JVF9TRVRfU0laRV9WRVJTSU9OKCZwTXAzRGVjLT5wY21QYXJhbSwgT01YX0FVRElPX1BBUkFNX1BDTU1PREVUWVBFKTsKKyAgICBwTXAzRGVjLT5wY21QYXJhbS5uUG9ydEluZGV4ICAgICAgICAgPSBPVVRQVVRfUE9SVF9JTkRFWDsKKyAgICBwTXAzRGVjLT5wY21QYXJhbS5uQ2hhbm5lbHMgICAgICAgICAgPSBERUZBVUxUX0FVRElPX0NIQU5ORUxTX05VTTsKKyAgICBwTXAzRGVjLT5wY21QYXJhbS5lTnVtRGF0YSAgICAgICAgICAgPSBPTVhfTnVtZXJpY2FsRGF0YVNpZ25lZDsKKyAgICBwTXAzRGVjLT5wY21QYXJhbS5lRW5kaWFuICAgICAgICAgICAgPSBPTVhfRW5kaWFuTGl0dGxlOworICAgIHBNcDNEZWMtPnBjbVBhcmFtLmJJbnRlcmxlYXZlZCAgICAgICA9IE9NWF9UUlVFOworICAgIHBNcDNEZWMtPnBjbVBhcmFtLm5CaXRQZXJTYW1wbGUgICAgICA9IERFRkFVTFRfQVVESU9fQklUX1BFUl9TQU1QTEU7CisgICAgcE1wM0RlYy0+cGNtUGFyYW0ublNhbXBsaW5nUmF0ZSAgICAgID0gREVGQVVMVF9BVURJT19TQU1QTElOR19GUkVROworICAgIHBNcDNEZWMtPnBjbVBhcmFtLmVQQ01Nb2RlICAgICAgICAgICA9IE9NWF9BVURJT19QQ01Nb2RlTGluZWFyOworICAgIHBNcDNEZWMtPnBjbVBhcmFtLmVDaGFubmVsTWFwcGluZ1swXSA9IE9NWF9BVURJT19DaGFubmVsTEY7CisgICAgcE1wM0RlYy0+cGNtUGFyYW0uZUNoYW5uZWxNYXBwaW5nWzFdID0gT01YX0FVRElPX0NoYW5uZWxSRjsKKworICAgIHBPTVhDb21wb25lbnQtPkdldFBhcmFtZXRlciAgICAgID0gJlNFQ19TUlBfTXAzRGVjX0dldFBhcmFtZXRlcjsKKyAgICBwT01YQ29tcG9uZW50LT5TZXRQYXJhbWV0ZXIgICAgICA9ICZTRUNfU1JQX01wM0RlY19TZXRQYXJhbWV0ZXI7CisgICAgcE9NWENvbXBvbmVudC0+R2V0Q29uZmlnICAgICAgICAgPSAmU0VDX1NSUF9NcDNEZWNfR2V0Q29uZmlnOworICAgIHBPTVhDb21wb25lbnQtPlNldENvbmZpZyAgICAgICAgID0gJlNFQ19TUlBfTXAzRGVjX1NldENvbmZpZzsKKyAgICBwT01YQ29tcG9uZW50LT5HZXRFeHRlbnNpb25JbmRleCA9ICZTRUNfU1JQX01wM0RlY19HZXRFeHRlbnNpb25JbmRleDsKKyAgICBwT01YQ29tcG9uZW50LT5Db21wb25lbnRSb2xlRW51bSA9ICZTRUNfU1JQX01wM0RlY19Db21wb25lbnRSb2xlRW51bTsKKyAgICBwT01YQ29tcG9uZW50LT5Db21wb25lbnREZUluaXQgICA9ICZTRUNfT01YX0NvbXBvbmVudERlaW5pdDsKKworICAgIC8qIFRvRG86IENoYW5nZSB0aGUgZnVuY3Rpb24gbmFtZSBhc3NvY2lhdGVkIHdpdGggYSBzcGVjaWZpYyBjb2RlYyAqLworICAgIHBTRUNDb21wb25lbnQtPnNlY19tZmNfY29tcG9uZW50SW5pdCAgICAgID0gJlNFQ19TUlBfTXAzRGVjX0luaXQ7CisgICAgcFNFQ0NvbXBvbmVudC0+c2VjX21mY19jb21wb25lbnRUZXJtaW5hdGUgPSAmU0VDX1NSUF9NcDNEZWNfVGVybWluYXRlOworICAgIHBTRUNDb21wb25lbnQtPnNlY19tZmNfYnVmZmVyUHJvY2VzcyAgICAgID0gJlNFQ19TUlBfTXAzRGVjX2J1ZmZlclByb2Nlc3M7CisgICAgcFNFQ0NvbXBvbmVudC0+c2VjX2NoZWNrSW5wdXRGcmFtZSA9IE5VTEw7CisKKyAgICBwU0VDQ29tcG9uZW50LT5jdXJyZW50U3RhdGUgPSBPTVhfU3RhdGVMb2FkZWQ7CisKKyAgICByZXQgPSBPTVhfRXJyb3JOb25lOworICAgIGdvdG8gRVhJVDsgLyogVGhpcyBmdW5jdGlvbiBpcyBwZXJmb3JtZWQgc3VjY2Vzc2Z1bGx5LiAqLworCitFWElUX0VSUk9SXzY6CisgICAgU0VDX09TQUxfRnJlZShwU0VDQ29tcG9uZW50LT5wcm9jZXNzRGF0YVtJTlBVVF9QT1JUX0lOREVYXS5kYXRhQnVmZmVyKTsKKyAgICBwU0VDQ29tcG9uZW50LT5wcm9jZXNzRGF0YVtJTlBVVF9QT1JUX0lOREVYXS5kYXRhQnVmZmVyID0gTlVMTDsKKyAgICBwU0VDQ29tcG9uZW50LT5wcm9jZXNzRGF0YVtJTlBVVF9QT1JUX0lOREVYXS5hbGxvY1NpemUgPSAwOworRVhJVF9FUlJPUl81OgorICAgIFNSUF9EZWluaXQoKTsKK0VYSVRfRVJST1JfNDoKKyAgICBTUlBfVGVybWluYXRlKCk7CitFWElUX0VSUk9SXzM6CisgICAgU0VDX09TQUxfRnJlZShwTXAzRGVjKTsKKyAgICBwQXVkaW9EZWMtPmhDb2RlY0hhbmRsZSA9IE5VTEw7CitFWElUX0VSUk9SXzI6CisgICAgU0VDX09TQUxfRnJlZShwU0VDQ29tcG9uZW50LT5jb21wb25lbnROYW1lKTsKKyAgICBwU0VDQ29tcG9uZW50LT5jb21wb25lbnROYW1lID0gTlVMTDsKK0VYSVRfRVJST1JfMToKKyAgICBTRUNfT01YX0F1ZGlvRGVjb2RlQ29tcG9uZW50RGVpbml0KHBPTVhDb21wb25lbnQpOworRVhJVDoKKyAgICBGdW5jdGlvbk91dCgpOworCisgICAgcmV0dXJuIHJldDsKK30KKworT01YX0VSUk9SVFlQRSBTRUNfT01YX0NvbXBvbmVudERlaW5pdChPTVhfSEFORExFVFlQRSBoQ29tcG9uZW50KQoreworICAgIE9NWF9FUlJPUlRZUEUgICAgICAgICAgcmV0ID0gT01YX0Vycm9yTm9uZTsKKyAgICBPTVhfQ09NUE9ORU5UVFlQRSAgICAgKnBPTVhDb21wb25lbnQgPSBOVUxMOworICAgIFNFQ19PTVhfQkFTRUNPTVBPTkVOVCAqcFNFQ0NvbXBvbmVudCA9IE5VTEw7CisgICAgU0VDX01QM19IQU5ETEUgICAgICAgICpwTXAzRGVjID0gTlVMTDsKKworICAgIEZ1bmN0aW9uSW4oKTsKKworICAgIGlmIChoQ29tcG9uZW50ID09IE5VTEwpIHsKKyAgICAgICAgcmV0ID0gT01YX0Vycm9yQmFkUGFyYW1ldGVyOworICAgICAgICBnb3RvIEVYSVQ7CisgICAgfQorICAgIHBPTVhDb21wb25lbnQgPSAoT01YX0NPTVBPTkVOVFRZUEUgKiloQ29tcG9uZW50OworICAgIHBTRUNDb21wb25lbnQgPSAoU0VDX09NWF9CQVNFQ09NUE9ORU5UICopcE9NWENvbXBvbmVudC0+cENvbXBvbmVudFByaXZhdGU7CisKKyAgICBTRUNfT1NBTF9GcmVlKHBTRUNDb21wb25lbnQtPmNvbXBvbmVudE5hbWUpOworICAgIHBTRUNDb21wb25lbnQtPmNvbXBvbmVudE5hbWUgPSBOVUxMOworICAgIGlmIChwU0VDQ29tcG9uZW50LT5wcm9jZXNzRGF0YVtJTlBVVF9QT1JUX0lOREVYXS5kYXRhQnVmZmVyKSB7CisgICAgICAgIFNFQ19PU0FMX0ZyZWUocFNFQ0NvbXBvbmVudC0+cHJvY2Vzc0RhdGFbSU5QVVRfUE9SVF9JTkRFWF0uZGF0YUJ1ZmZlcik7CisgICAgICAgIHBTRUNDb21wb25lbnQtPnByb2Nlc3NEYXRhW0lOUFVUX1BPUlRfSU5ERVhdLmRhdGFCdWZmZXIgPSBOVUxMOworICAgICAgICBwU0VDQ29tcG9uZW50LT5wcm9jZXNzRGF0YVtJTlBVVF9QT1JUX0lOREVYXS5hbGxvY1NpemUgPSAwOworICAgIH0KKworICAgIHBNcDNEZWMgPSAoU0VDX01QM19IQU5ETEUgKikoKFNFQ19PTVhfQVVESU9ERUNfQ09NUE9ORU5UICopcFNFQ0NvbXBvbmVudC0+aENvbXBvbmVudEhhbmRsZSktPmhDb2RlY0hhbmRsZTsKKyAgICBpZiAocE1wM0RlYyAhPSBOVUxMKSB7CisgICAgICAgIGlmIChwTXAzRGVjLT5oU1JQTXAzSGFuZGxlLmJTUlBMb2FkZWQgPT0gT01YX1RSVUUpIHsKKyAgICAgICAgICAgIFNSUF9EZWluaXQoKTsKKyAgICAgICAgICAgIFNSUF9UZXJtaW5hdGUoKTsKKyAgICAgICAgfQorICAgICAgICBTRUNfT1NBTF9GcmVlKHBNcDNEZWMpOworICAgICAgICAoKFNFQ19PTVhfQVVESU9ERUNfQ09NUE9ORU5UICopcFNFQ0NvbXBvbmVudC0+aENvbXBvbmVudEhhbmRsZSktPmhDb2RlY0hhbmRsZSA9IE5VTEw7CisgICAgfQorCisgICAgcmV0ID0gU0VDX09NWF9BdWRpb0RlY29kZUNvbXBvbmVudERlaW5pdChwT01YQ29tcG9uZW50KTsKKyAgICBpZiAocmV0ICE9IE9NWF9FcnJvck5vbmUpIHsKKyAgICAgICAgZ290byBFWElUOworICAgIH0KKworICAgIHJldCA9IE9NWF9FcnJvck5vbmU7CisKK0VYSVQ6CisgICAgRnVuY3Rpb25PdXQoKTsKKworICAgIHJldHVybiByZXQ7Cit9CmRpZmYgLS1naXQgYS9leHlub3M0L211bHRpbWVkaWEvb3Blbm1heC9zZWNfb214L2NvbXBvbmVudC9hdWRpby9kZWMvbXAzL1NFQ19PTVhfTXAzZGVjLmggYi9leHlub3M0L211bHRpbWVkaWEvb3Blbm1heC9zZWNfb214L2NvbXBvbmVudC9hdWRpby9kZWMvbXAzL1NFQ19PTVhfTXAzZGVjLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYThiODBmNQotLS0gL2Rldi9udWxsCisrKyBiL2V4eW5vczQvbXVsdGltZWRpYS9vcGVubWF4L3NlY19vbXgvY29tcG9uZW50L2F1ZGlvL2RlYy9tcDMvU0VDX09NWF9NcDNkZWMuaApAQCAtMCwwICsxLDYzIEBACisvKgorICoKKyAqIENvcHlyaWdodCAyMDEwIFNhbXN1bmcgRWxlY3Ryb25pY3MgUy5MU0kgQ28uIExURAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisvKgorICogQGZpbGUgICAgICAgIFNFQ19PTVhfTXAzZGVjLmgKKyAqIEBicmllZgorICogQGF1dGhvciAgICAgIFl1bmppIEtpbSAoeXVuamkua2ltQHNhbXN1bmcuY29tKQorICogQHZlcnNpb24gICAgIDEuMS4wCisgKiBAaGlzdG9yeQorICogICAyMDExLjEwLjE4IDogQ3JlYXRlCisgKi8KKworI2lmbmRlZiBTRUNfT01YX01QM19ERUNfQ09NUE9ORU5UCisjZGVmaW5lIFNFQ19PTVhfTVAzX0RFQ19DT01QT05FTlQKKworI2luY2x1ZGUgIlNFQ19PTVhfRGVmLmgiCisjaW5jbHVkZSAiT01YX0NvbXBvbmVudC5oIgorCit0eXBlZGVmIHN0cnVjdCBfU0VDX1NSUF9NUDNfSEFORExFCit7CisgICAgT01YX0hBTkRMRVRZUEUgaFNSUEhhbmRsZTsKKyAgICBPTVhfQk9PTCAgICAgICBiQ29uZmlndXJlZFNSUDsKKyAgICBPTVhfQk9PTCAgICAgICBiU1JQTG9hZGVkOworICAgIE9NWF9CT09MICAgICAgIGJTUlBTZW5kRU9TOworICAgIE9NWF9TMzIgICAgICAgIHJldHVybkNvZGVjOworfSBTRUNfU1JQX01QM19IQU5ETEU7CisKK3R5cGVkZWYgc3RydWN0IF9TRUNfTVAzX0hBTkRMRQoreworICAgIC8qIE9NWCBDb2RlYyBzcGVjaWZpYyAqLworICAgIE9NWF9BVURJT19QQVJBTV9NUDNUWVBFICAgICBtcDNQYXJhbTsKKyAgICBPTVhfQVVESU9fUEFSQU1fUENNTU9ERVRZUEUgcGNtUGFyYW07CisKKyAgICAvKiBTRUMgU1JQIENvZGVjIHNwZWNpZmljICovCisgICAgU0VDX1NSUF9NUDNfSEFORExFICAgICAgaFNSUE1wM0hhbmRsZTsKK30gU0VDX01QM19IQU5ETEU7CisKKyNpZmRlZiBfX2NwbHVzcGx1cworZXh0ZXJuICJDIiB7CisjZW5kaWYKKworT1NDTF9FWFBPUlRfUkVGIE9NWF9FUlJPUlRZUEUgU0VDX09NWF9Db21wb25lbnRJbml0KE9NWF9IQU5ETEVUWVBFIGhDb21wb25lbnQsIE9NWF9TVFJJTkcgY29tcG9uZW50TmFtZSk7CisgICAgICAgICAgICAgICAgT01YX0VSUk9SVFlQRSBTRUNfT01YX0NvbXBvbmVudERlaW5pdChPTVhfSEFORExFVFlQRSBoQ29tcG9uZW50KTsKKworI2lmZGVmIF9fY3BsdXNwbHVzCit9OworI2VuZGlmCisKKyNlbmRpZiAvKiBTRUNfT01YX01QM19ERUNfQ09NUE9ORU5UICovCmRpZmYgLS1naXQgYS9leHlub3M0L211bHRpbWVkaWEvb3Blbm1heC9zZWNfb214L2NvbXBvbmVudC9hdWRpby9kZWMvbXAzL2xpYnJhcnlfcmVnaXN0ZXIuYyBiL2V4eW5vczQvbXVsdGltZWRpYS9vcGVubWF4L3NlY19vbXgvY29tcG9uZW50L2F1ZGlvL2RlYy9tcDMvbGlicmFyeV9yZWdpc3Rlci5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmM5NDM3N2EKLS0tIC9kZXYvbnVsbAorKysgYi9leHlub3M0L211bHRpbWVkaWEvb3Blbm1heC9zZWNfb214L2NvbXBvbmVudC9hdWRpby9kZWMvbXAzL2xpYnJhcnlfcmVnaXN0ZXIuYwpAQCAtMCwwICsxLDU4IEBACisvKgorICoKKyAqIENvcHlyaWdodCAyMDEwIFNhbXN1bmcgRWxlY3Ryb25pY3MgUy5MU0kgQ28uIExURAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisvKgorICogQGZpbGUgICAgICAgIGxpYnJhcnlfcmVnaXN0ZXIuYworICogQGJyaWVmCisgKiBAYXV0aG9yICAgICAgWXVuamkgS2ltICh5dW5qaS5raW1Ac2Ftc3VuZy5jb20pCisgKiBAdmVyc2lvbiAgICAgMS4xLjAKKyAqIEBoaXN0b3J5CisgKiAgIDIwMTEuMTAuMTggOiBDcmVhdGUKKyAqLworCisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlIDxzdGRsaWIuaD4KKyNpbmNsdWRlIDxzdHJpbmcuaD4KKyNpbmNsdWRlIDxkbGZjbi5oPgorCisjaW5jbHVkZSAiU0VDX09TQUxfTWVtb3J5LmgiCisjaW5jbHVkZSAiU0VDX09TQUxfRVRDLmgiCisjaW5jbHVkZSAibGlicmFyeV9yZWdpc3Rlci5oIgorCisjdW5kZWYgIFNFQ19MT0dfVEFHCisjZGVmaW5lIFNFQ19MT0dfVEFHICAgICJTRUNfTVAzX0RFQyIKKyNkZWZpbmUgU0VDX0xPR19PRkYKKyNpbmNsdWRlICJTRUNfT1NBTF9Mb2cuaCIKKworCitPU0NMX0VYUE9SVF9SRUYgaW50IFNFQ19PTVhfQ09NUE9ORU5UX0xpYnJhcnlfUmVnaXN0ZXIoU0VDUmVnaXN0ZXJDb21wb25lbnRUeXBlICoqcHBTRUNDb21wb25lbnQpCit7CisgICAgRnVuY3Rpb25JbigpOworCisgICAgaWYgKHBwU0VDQ29tcG9uZW50ID09IE5VTEwpCisgICAgICAgIGdvdG8gRVhJVDsKKworICAgIC8qIGNvbXBvbmVudCAxIC0gYXVkaW8gZGVjb2RlciBNUDMgKi8KKyAgICBTRUNfT1NBTF9TdHJjcHkocHBTRUNDb21wb25lbnRbMF0tPmNvbXBvbmVudE5hbWUsIFNFQ19PTVhfQ09NUE9ORU5UX01QM19ERUMpOworICAgIFNFQ19PU0FMX1N0cmNweShwcFNFQ0NvbXBvbmVudFswXS0+cm9sZXNbMF0sIFNFQ19PTVhfQ09NUE9ORU5UX01QM19ERUNfUk9MRSk7CisgICAgcHBTRUNDb21wb25lbnRbMF0tPnRvdGFsUm9sZU51bSA9IE1BWF9DT01QT05FTlRfUk9MRV9OVU07CisKK0VYSVQ6CisgICAgRnVuY3Rpb25PdXQoKTsKKyAgICByZXR1cm4gTUFYX0NPTVBPTkVOVF9OVU07Cit9CisKZGlmZiAtLWdpdCBhL2V4eW5vczQvbXVsdGltZWRpYS9vcGVubWF4L3NlY19vbXgvY29tcG9uZW50L2F1ZGlvL2RlYy9tcDMvbGlicmFyeV9yZWdpc3Rlci5oIGIvZXh5bm9zNC9tdWx0aW1lZGlhL29wZW5tYXgvc2VjX29teC9jb21wb25lbnQvYXVkaW8vZGVjL21wMy9saWJyYXJ5X3JlZ2lzdGVyLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTBhZThjMgotLS0gL2Rldi9udWxsCisrKyBiL2V4eW5vczQvbXVsdGltZWRpYS9vcGVubWF4L3NlY19vbXgvY29tcG9uZW50L2F1ZGlvL2RlYy9tcDMvbGlicmFyeV9yZWdpc3Rlci5oCkBAIC0wLDAgKzEsNTQgQEAKKy8qCisgKgorICogQ29weXJpZ2h0IDIwMTAgU2Ftc3VuZyBFbGVjdHJvbmljcyBTLkxTSSBDby4gTFRECisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKy8qCisgKiBAZmlsZSAgICAgICAgbGlicmFyeV9yZWdpc3Rlci5oCisgKiBAYnJpZWYKKyAqIEBhdXRob3IgICAgICBZdW5qaSBLaW0gKHl1bmppLmtpbUBzYW1zdW5nLmNvbSkKKyAqIEB2ZXJzaW9uICAgICAxLjEuMAorICogQGhpc3RvcnkKKyAqICAgMjAxMS4xMC4xOCA6IENyZWF0ZQorICovCisKKyNpZm5kZWYgU0VDX09NWF9NUDNfREVDX1JFRworI2RlZmluZSBTRUNfT01YX01QM19ERUNfUkVHCisKKyNpbmNsdWRlICJTRUNfT01YX0RlZi5oIgorI2luY2x1ZGUgIk9NWF9Db21wb25lbnQuaCIKKyNpbmNsdWRlICJTRUNfT01YX0NvbXBvbmVudF9SZWdpc3Rlci5oIgorCisKKyNkZWZpbmUgT1NDTF9FWFBPUlRfUkVGIF9fYXR0cmlidXRlX18oKHZpc2liaWxpdHkoImRlZmF1bHQiKSkpCisjZGVmaW5lIE1BWF9DT01QT05FTlRfTlVNICAgICAgICAgMQorI2RlZmluZSBNQVhfQ09NUE9ORU5UX1JPTEVfTlVNICAgIDEKKworLyogTVAzICovCisjZGVmaW5lIFNFQ19PTVhfQ09NUE9ORU5UX01QM19ERUMgICAgICAgICAiT01YLlNFQy5NUDMuRGVjb2RlciIKKyNkZWZpbmUgU0VDX09NWF9DT01QT05FTlRfTVAzX0RFQ19ST0xFICAgICJhdWRpb19kZWNvZGVyLm1wMyIKKworI2lmZGVmIF9fY3BsdXNwbHVzCitleHRlcm4gIkMiIHsKKyNlbmRpZgorCitPU0NMX0VYUE9SVF9SRUYgaW50IFNFQ19PTVhfQ09NUE9ORU5UX0xpYnJhcnlfUmVnaXN0ZXIoU0VDUmVnaXN0ZXJDb21wb25lbnRUeXBlICoqcHBTRUNDb21wb25lbnQpOworCisjaWZkZWYgX19jcGx1c3BsdXMKK307CisjZW5kaWYKKworI2VuZGlmIC8qIFNFQ19PTVhfTVAzX0RFQ19SRUcgKi8KKwpkaWZmIC0tZ2l0IGEvZXh5bm9zNC9tdWx0aW1lZGlhL29wZW5tYXgvc2VjX29teC9jb21wb25lbnQvY29tbW9uL0FuZHJvaWQubWsgYi9leHlub3M0L211bHRpbWVkaWEvb3Blbm1heC9zZWNfb214L2NvbXBvbmVudC9jb21tb24vQW5kcm9pZC5tawpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hNmY4NGJmCi0tLSAvZGV2L251bGwKKysrIGIvZXh5bm9zNC9tdWx0aW1lZGlhL29wZW5tYXgvc2VjX29teC9jb21wb25lbnQvY29tbW9uL0FuZHJvaWQubWsKQEAgLTAsMCArMSw0MyBAQAorTE9DQUxfUEFUSCA6PSAkKGNhbGwgbXktZGlyKQoraW5jbHVkZSAkKENMRUFSX1ZBUlMpCisKK0xPQ0FMX01PRFVMRV9UQUdTIDo9IG9wdGlvbmFsCisKK0xPQ0FMX1NSQ19GSUxFUyA6PSBcCisJU0VDX09NWF9CYXNlY29tcG9uZW50LmMgXAorCVNFQ19PTVhfQmFzZXBvcnQuYworCitMT0NBTF9NT0RVTEUgOj0gbGlic2VjYmFzZWNvbXBvbmVudAorCitMT0NBTF9DRkxBR1MgOj0KKworTE9DQUxfU1RBVElDX0xJQlJBUklFUyA6PSBsaWJzZWNvc2FsCitMT0NBTF9TSEFSRURfTElCUkFSSUVTIDo9IGxpYmN1dGlscyBsaWJ1dGlscworCitMT0NBTF9DX0lOQ0xVREVTIDo9ICQoU0VDX09NWF9JTkMpL2tocm9ub3MgXAorCSQoU0VDX09NWF9JTkMpL3NlYyBcCisJJChTRUNfT01YX1RPUCkvb3NhbAorCitpbmNsdWRlICQoQlVJTERfU1RBVElDX0xJQlJBUlkpCisKKworaW5jbHVkZSAkKENMRUFSX1ZBUlMpCisKK0xPQ0FMX01PRFVMRV9UQUdTIDo9IG9wdGlvbmFsCisKK0xPQ0FMX1NSQ19GSUxFUyA6PSBcCisJU0VDX09NWF9SZXNvdXJjZW1hbmFnZXIuYworCitMT0NBTF9QUkVMSU5LX01PRFVMRSA6PSBmYWxzZQorTE9DQUxfTU9EVUxFIDo9IGxpYlNFQ19PTVhfUmVzb3VyY2VtYW5hZ2VyCisKK0xPQ0FMX0NGTEFHUyA6PQorCitMT0NBTF9TVEFUSUNfTElCUkFSSUVTIDo9IGxpYnNlY29zYWwKK0xPQ0FMX1NIQVJFRF9MSUJSQVJJRVMgOj0gbGliY3V0aWxzIGxpYnV0aWxzCisKK0xPQ0FMX0NfSU5DTFVERVMgOj0gJChTRUNfT01YX0lOQykva2hyb25vcyBcCisJJChTRUNfT01YX0lOQykvc2VjIFwKKwkkKFNFQ19PTVhfVE9QKS9vc2FsCisKK2luY2x1ZGUgJChCVUlMRF9TSEFSRURfTElCUkFSWSkKZGlmZiAtLWdpdCBhL2V4eW5vczQvbXVsdGltZWRpYS9vcGVubWF4L3NlY19vbXgvY29tcG9uZW50L2NvbW1vbi9TRUNfT01YX0Jhc2Vjb21wb25lbnQuYyBiL2V4eW5vczQvbXVsdGltZWRpYS9vcGVubWF4L3NlY19vbXgvY29tcG9uZW50L2NvbW1vbi9TRUNfT01YX0Jhc2Vjb21wb25lbnQuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lNjE1ZDE4Ci0tLSAvZGV2L251bGwKKysrIGIvZXh5bm9zNC9tdWx0aW1lZGlhL29wZW5tYXgvc2VjX29teC9jb21wb25lbnQvY29tbW9uL1NFQ19PTVhfQmFzZWNvbXBvbmVudC5jCkBAIC0wLDAgKzEsMTUzNSBAQAorLyoKKyAqCisgKiBDb3B5cmlnaHQgMjAxMCBTYW1zdW5nIEVsZWN0cm9uaWNzIFMuTFNJIENvLiBMVEQKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworLyoKKyAqIEBmaWxlICAgICAgIFNFQ19PTVhfQmFzZWNvbXBvbmVudC5jCisgKiBAYnJpZWYKKyAqIEBhdXRob3IgICAgIFNldW5nQmVvbSBLaW0gKHNiY3J1eC5raW1Ac2Ftc3VuZy5jb20pCisgKiAgICAgICAgICAgICBZdW5qaSBLaW0gKHl1bmppLmtpbUBzYW1zdW5nLmNvbSkKKyAqIEB2ZXJzaW9uICAgIDEuMS4wCisgKiBAaGlzdG9yeQorICogICAgMjAxMC43LjE1IDogQ3JlYXRlCisgKi8KKworI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8c3RkbGliLmg+CisjaW5jbHVkZSA8c3RyaW5nLmg+CisjaW5jbHVkZSA8dW5pc3RkLmg+CisKKyNpbmNsdWRlICJTRUNfT1NBTF9FdmVudC5oIgorI2luY2x1ZGUgIlNFQ19PU0FMX1RocmVhZC5oIgorI2luY2x1ZGUgIlNFQ19PU0FMX0VUQy5oIgorI2luY2x1ZGUgIlNFQ19PU0FMX1NlbWFwaG9yZS5oIgorI2luY2x1ZGUgIlNFQ19PU0FMX011dGV4LmgiCisjaW5jbHVkZSAiU0VDX09NWF9CYXNlcG9ydC5oIgorI2luY2x1ZGUgIlNFQ19PTVhfQmFzZWNvbXBvbmVudC5oIgorI2luY2x1ZGUgIlNFQ19PTVhfUmVzb3VyY2VtYW5hZ2VyLmgiCisjaW5jbHVkZSAiU0VDX09NWF9NYWNyb3MuaCIKKworI3VuZGVmICBTRUNfTE9HX1RBRworI2RlZmluZSBTRUNfTE9HX1RBRyAgICAiU0VDX0JBU0VfQ09NUCIKKyNkZWZpbmUgU0VDX0xPR19PRkYKKyNpbmNsdWRlICJTRUNfT1NBTF9Mb2cuaCIKKworCisvKiBDaGFuZ2UgQ0hFQ0tfU0laRV9WRVJTSU9OIE1hY3JvICovCitPTVhfRVJST1JUWVBFIFNFQ19PTVhfQ2hlY2tfU2l6ZVZlcnNpb24oT01YX1BUUiBoZWFkZXIsIE9NWF9VMzIgc2l6ZSkKK3sKKyAgICBPTVhfRVJST1JUWVBFIHJldCA9IE9NWF9FcnJvck5vbmU7CisKKyAgICBPTVhfVkVSU0lPTlRZUEUqIHZlcnNpb24gPSBOVUxMOworICAgIGlmIChoZWFkZXIgPT0gTlVMTCkgeworICAgICAgICByZXQgPSBPTVhfRXJyb3JCYWRQYXJhbWV0ZXI7CisgICAgICAgIGdvdG8gRVhJVDsKKyAgICB9CisgICAgdmVyc2lvbiA9IChPTVhfVkVSU0lPTlRZUEUqKSgoY2hhciopaGVhZGVyICsgc2l6ZW9mKE9NWF9VMzIpKTsKKyAgICBpZiAoKigoT01YX1UzMiopaGVhZGVyKSAhPSBzaXplKSB7CisgICAgICAgIHJldCA9IE9NWF9FcnJvckJhZFBhcmFtZXRlcjsKKyAgICAgICAgZ290byBFWElUOworICAgIH0KKyAgICBpZiAodmVyc2lvbi0+cy5uVmVyc2lvbk1ham9yICE9IFZFUlNJT05NQUpPUl9OVU1CRVIgfHwKKyAgICAgICAgdmVyc2lvbi0+cy5uVmVyc2lvbk1pbm9yICE9IFZFUlNJT05NSU5PUl9OVU1CRVIpIHsKKyAgICAgICAgcmV0ID0gT01YX0Vycm9yVmVyc2lvbk1pc21hdGNoOworICAgICAgICBnb3RvIEVYSVQ7CisgICAgfQorICAgIHJldCA9IE9NWF9FcnJvck5vbmU7CitFWElUOgorICAgIHJldHVybiByZXQ7Cit9CisKK09NWF9FUlJPUlRZUEUgU0VDX09NWF9HZXRDb21wb25lbnRWZXJzaW9uKAorICAgIE9NWF9JTiAgT01YX0hBTkRMRVRZUEUgICBoQ29tcG9uZW50LAorICAgIE9NWF9PVVQgT01YX1NUUklORyAgICAgICBwQ29tcG9uZW50TmFtZSwKKyAgICBPTVhfT1VUIE9NWF9WRVJTSU9OVFlQRSAqcENvbXBvbmVudFZlcnNpb24sCisgICAgT01YX09VVCBPTVhfVkVSU0lPTlRZUEUgKnBTcGVjVmVyc2lvbiwKKyAgICBPTVhfT1VUIE9NWF9VVUlEVFlQRSAgICAqcENvbXBvbmVudFVVSUQpCit7CisgICAgT01YX0VSUk9SVFlQRSAgICAgICAgICByZXQgPSBPTVhfRXJyb3JOb25lOworICAgIE9NWF9DT01QT05FTlRUWVBFICAgICAqcE9NWENvbXBvbmVudCA9IE5VTEw7CisgICAgU0VDX09NWF9CQVNFQ09NUE9ORU5UICpwU0VDQ29tcG9uZW50ID0gTlVMTDsKKyAgICBPTVhfVTMyICAgICAgICAgICAgICAgIGNvbXBVVUlEWzNdOworCisgICAgRnVuY3Rpb25JbigpOworCisgICAgLyogY2hlY2sgcGFyYW1ldGVycyAqLworICAgIGlmIChoQ29tcG9uZW50ICAgICA9PSBOVUxMIHx8CisgICAgICAgIHBDb21wb25lbnROYW1lID09IE5VTEwgfHwgcENvbXBvbmVudFZlcnNpb24gPT0gTlVMTCB8fAorICAgICAgICBwU3BlY1ZlcnNpb24gICA9PSBOVUxMIHx8IHBDb21wb25lbnRVVUlEICAgID09IE5VTEwpIHsKKyAgICAgICAgcmV0ID0gT01YX0Vycm9yQmFkUGFyYW1ldGVyOworICAgICAgICBnb3RvIEVYSVQ7CisgICAgfQorICAgIHBPTVhDb21wb25lbnQgPSAoT01YX0NPTVBPTkVOVFRZUEUgKiloQ29tcG9uZW50OworICAgIHJldCA9IFNFQ19PTVhfQ2hlY2tfU2l6ZVZlcnNpb24ocE9NWENvbXBvbmVudCwgc2l6ZW9mKE9NWF9DT01QT05FTlRUWVBFKSk7CisgICAgaWYgKHJldCAhPSBPTVhfRXJyb3JOb25lKSB7CisgICAgICAgIGdvdG8gRVhJVDsKKyAgICB9CisKKyAgICBpZiAocE9NWENvbXBvbmVudC0+cENvbXBvbmVudFByaXZhdGUgPT0gTlVMTCkgeworICAgICAgICByZXQgPSBPTVhfRXJyb3JCYWRQYXJhbWV0ZXI7CisgICAgICAgIGdvdG8gRVhJVDsKKyAgICB9CisgICAgcFNFQ0NvbXBvbmVudCA9IChTRUNfT01YX0JBU0VDT01QT05FTlQgKilwT01YQ29tcG9uZW50LT5wQ29tcG9uZW50UHJpdmF0ZTsKKworICAgIGlmIChwU0VDQ29tcG9uZW50LT5jdXJyZW50U3RhdGUgPT0gT01YX1N0YXRlSW52YWxpZCkgeworICAgICAgICByZXQgPSBPTVhfRXJyb3JJbnZhbGlkU3RhdGU7CisgICAgICAgIGdvdG8gRVhJVDsKKyAgICB9CisKKyAgICBTRUNfT1NBTF9TdHJjcHkocENvbXBvbmVudE5hbWUsIHBTRUNDb21wb25lbnQtPmNvbXBvbmVudE5hbWUpOworICAgIFNFQ19PU0FMX01lbWNweShwQ29tcG9uZW50VmVyc2lvbiwgJihwU0VDQ29tcG9uZW50LT5jb21wb25lbnRWZXJzaW9uKSwgc2l6ZW9mKE9NWF9WRVJTSU9OVFlQRSkpOworICAgIFNFQ19PU0FMX01lbWNweShwU3BlY1ZlcnNpb24sICYocFNFQ0NvbXBvbmVudC0+c3BlY1ZlcnNpb24pLCBzaXplb2YoT01YX1ZFUlNJT05UWVBFKSk7CisKKyAgICAvKiBGaWxsIFVVSUQgd2l0aCBoYW5kbGUgYWRkcmVzcywgUElEIGFuZCBVSUQuCisgICAgICogVGhpcyBzaG91bGQgZ3VhcmFudGVlIHVpbmlxbmVzcyAqLworICAgIGNvbXBVVUlEWzBdID0gKE9NWF9VMzIpcE9NWENvbXBvbmVudDsKKyAgICBjb21wVVVJRFsxXSA9IGdldHBpZCgpOworICAgIGNvbXBVVUlEWzJdID0gZ2V0dWlkKCk7CisgICAgU0VDX09TQUxfTWVtY3B5KCpwQ29tcG9uZW50VVVJRCwgY29tcFVVSUQsIDMgKiBzaXplb2YoKmNvbXBVVUlEKSk7CisKKyAgICByZXQgPSBPTVhfRXJyb3JOb25lOworCitFWElUOgorICAgIEZ1bmN0aW9uT3V0KCk7CisKKyAgICByZXR1cm4gcmV0OworfQorCitPTVhfRVJST1JUWVBFIFNFQ19PTVhfR2V0U3RhdGUgKAorICAgIE9NWF9JTiBPTVhfSEFORExFVFlQRSAgaENvbXBvbmVudCwKKyAgICBPTVhfT1VUIE9NWF9TVEFURVRZUEUgKnBTdGF0ZSkKK3sKKyAgICBPTVhfRVJST1JUWVBFICAgICAgICAgIHJldCA9IE9NWF9FcnJvck5vbmU7CisgICAgT01YX0NPTVBPTkVOVFRZUEUgICAgICpwT01YQ29tcG9uZW50ID0gTlVMTDsKKyAgICBTRUNfT01YX0JBU0VDT01QT05FTlQgKnBTRUNDb21wb25lbnQgPSBOVUxMOworCisgICAgRnVuY3Rpb25JbigpOworCisgICAgaWYgKGhDb21wb25lbnQgPT0gTlVMTCB8fCBwU3RhdGUgPT0gTlVMTCkgeworICAgICAgICByZXQgPSBPTVhfRXJyb3JCYWRQYXJhbWV0ZXI7CisgICAgICAgIGdvdG8gRVhJVDsKKyAgICB9CisgICAgcE9NWENvbXBvbmVudCA9IChPTVhfQ09NUE9ORU5UVFlQRSAqKWhDb21wb25lbnQ7CisgICAgcmV0ID0gU0VDX09NWF9DaGVja19TaXplVmVyc2lvbihwT01YQ29tcG9uZW50LCBzaXplb2YoT01YX0NPTVBPTkVOVFRZUEUpKTsKKyAgICBpZiAocmV0ICE9IE9NWF9FcnJvck5vbmUpIHsKKyAgICAgICAgZ290byBFWElUOworICAgIH0KKworICAgIGlmIChwT01YQ29tcG9uZW50LT5wQ29tcG9uZW50UHJpdmF0ZSA9PSBOVUxMKSB7CisgICAgICAgIHJldCA9IE9NWF9FcnJvckJhZFBhcmFtZXRlcjsKKyAgICAgICAgZ290byBFWElUOworICAgIH0KKyAgICBwU0VDQ29tcG9uZW50ID0gKFNFQ19PTVhfQkFTRUNPTVBPTkVOVCAqKXBPTVhDb21wb25lbnQtPnBDb21wb25lbnRQcml2YXRlOworCisgICAgKnBTdGF0ZSA9IHBTRUNDb21wb25lbnQtPmN1cnJlbnRTdGF0ZTsKKyAgICByZXQgPSBPTVhfRXJyb3JOb25lOworCitFWElUOgorICAgIEZ1bmN0aW9uT3V0KCk7CisKKyAgICByZXR1cm4gcmV0OworfQorCitzdGF0aWMgT01YX0VSUk9SVFlQRSBTRUNfT01YX0J1ZmZlclByb2Nlc3NUaHJlYWQoT01YX1BUUiB0aHJlYWREYXRhKQoreworICAgIE9NWF9FUlJPUlRZUEUgICAgICAgICAgcmV0ID0gT01YX0Vycm9yTm9uZTsKKyAgICBPTVhfQ09NUE9ORU5UVFlQRSAgICAgKnBPTVhDb21wb25lbnQgPSBOVUxMOworICAgIFNFQ19PTVhfQkFTRUNPTVBPTkVOVCAqcFNFQ0NvbXBvbmVudCA9IE5VTEw7CisgICAgU0VDX09NWF9NRVNTQUdFICAgICAgICptZXNzYWdlID0gTlVMTDsKKworICAgIEZ1bmN0aW9uSW4oKTsKKworICAgIGlmICh0aHJlYWREYXRhID09IE5VTEwpIHsKKyAgICAgICAgcmV0ID0gT01YX0Vycm9yQmFkUGFyYW1ldGVyOworICAgICAgICBnb3RvIEVYSVQ7CisgICAgfQorICAgIHBPTVhDb21wb25lbnQgPSAoT01YX0NPTVBPTkVOVFRZUEUgKil0aHJlYWREYXRhOworICAgIHJldCA9IFNFQ19PTVhfQ2hlY2tfU2l6ZVZlcnNpb24ocE9NWENvbXBvbmVudCwgc2l6ZW9mKE9NWF9DT01QT05FTlRUWVBFKSk7CisgICAgaWYgKHJldCAhPSBPTVhfRXJyb3JOb25lKSB7CisgICAgICAgIGdvdG8gRVhJVDsKKyAgICB9CisgICAgcFNFQ0NvbXBvbmVudCA9IChTRUNfT01YX0JBU0VDT01QT05FTlQgKilwT01YQ29tcG9uZW50LT5wQ29tcG9uZW50UHJpdmF0ZTsKKyAgICBwU0VDQ29tcG9uZW50LT5zZWNfQnVmZmVyUHJvY2VzcyhwT01YQ29tcG9uZW50KTsKKworICAgIFNFQ19PU0FMX1RocmVhZEV4aXQoTlVMTCk7CisKK0VYSVQ6CisgICAgRnVuY3Rpb25PdXQoKTsKKworICAgIHJldHVybiByZXQ7Cit9CisKK09NWF9FUlJPUlRZUEUgU0VDX09NWF9Db21wb25lbnRTdGF0ZVNldChPTVhfQ09NUE9ORU5UVFlQRSAqcE9NWENvbXBvbmVudCwgT01YX1UzMiBtZXNzYWdlUGFyYW0pCit7CisgICAgT01YX0VSUk9SVFlQRSAgICAgICAgICByZXQgPSBPTVhfRXJyb3JOb25lOworICAgIFNFQ19PTVhfQkFTRUNPTVBPTkVOVCAqcFNFQ0NvbXBvbmVudCA9IChTRUNfT01YX0JBU0VDT01QT05FTlQgKilwT01YQ29tcG9uZW50LT5wQ29tcG9uZW50UHJpdmF0ZTsKKyAgICBTRUNfT01YX01FU1NBR0UgICAgICAgKm1lc3NhZ2U7CisgICAgT01YX1NUQVRFVFlQRSAgICAgICAgICBkZXN0U3RhdGUgPSBtZXNzYWdlUGFyYW07CisgICAgT01YX1NUQVRFVFlQRSAgICAgICAgICBjdXJyZW50U3RhdGUgPSBwU0VDQ29tcG9uZW50LT5jdXJyZW50U3RhdGU7CisgICAgU0VDX09NWF9CQVNFUE9SVCAgICAgICpwU0VDUG9ydCA9IE5VTEw7CisgICAgT01YX1MzMiAgICAgICAgICAgICAgICBjb3VudFZhbHVlID0gMDsKKyAgICB1bnNpZ25lZCBpbnQgICAgICAgICAgIGkgPSAwLCBqID0gMDsKKyAgICBpbnQgICAgICAgICAgICAgICAgICAgIGsgPSAwOworCisgICAgRnVuY3Rpb25JbigpOworCisgICAgLyogY2hlY2sgcGFyYW1ldGVycyAqLworICAgIGlmIChjdXJyZW50U3RhdGUgPT0gZGVzdFN0YXRlKSB7CisgICAgICAgICByZXQgPSBPTVhfRXJyb3JTYW1lU3RhdGU7CisgICAgICAgICAgICBnb3RvIEVYSVQ7CisgICAgfQorICAgIGlmIChjdXJyZW50U3RhdGUgPT0gT01YX1N0YXRlSW52YWxpZCkgeworICAgICAgICByZXQgPSBPTVhfRXJyb3JJbnZhbGlkU3RhdGU7CisgICAgICAgIGdvdG8gRVhJVDsKKyAgICB9CisKKyAgICBpZiAoKGN1cnJlbnRTdGF0ZSA9PSBPTVhfU3RhdGVMb2FkZWQpICYmIChkZXN0U3RhdGUgPT0gT01YX1N0YXRlSWRsZSkpIHsKKyAgICAgICAgcmV0ID0gU0VDX09NWF9HZXRfUmVzb3VyY2UocE9NWENvbXBvbmVudCk7CisgICAgICAgIGlmIChyZXQgIT0gT01YX0Vycm9yTm9uZSkgeworICAgICAgICAgICAgZ290byBFWElUOworICAgICAgICB9CisgICAgfQorICAgIGlmICgoKGN1cnJlbnRTdGF0ZSA9PSBPTVhfU3RhdGVJZGxlKSAmJiAoZGVzdFN0YXRlID09IE9NWF9TdGF0ZUxvYWRlZCkpICAgICAgIHx8CisgICAgICAgICgoY3VycmVudFN0YXRlID09IE9NWF9TdGF0ZUlkbGUpICYmIChkZXN0U3RhdGUgPT0gT01YX1N0YXRlSW52YWxpZCkpICAgICAgfHwKKyAgICAgICAgKChjdXJyZW50U3RhdGUgPT0gT01YX1N0YXRlRXhlY3V0aW5nKSAmJiAoZGVzdFN0YXRlID09IE9NWF9TdGF0ZUludmFsaWQpKSB8fAorICAgICAgICAoKGN1cnJlbnRTdGF0ZSA9PSBPTVhfU3RhdGVQYXVzZSkgJiYgKGRlc3RTdGF0ZSA9PSBPTVhfU3RhdGVJbnZhbGlkKSkpIHsKKyAgICAgICAgU0VDX09NWF9SZWxlYXNlX1Jlc291cmNlKHBPTVhDb21wb25lbnQpOworICAgIH0KKworICAgIFNFQ19PU0FMX0xvZyhTRUNfTE9HX1RSQUNFLCAiZGVzdFN0YXRlOiAlZCIsIGRlc3RTdGF0ZSk7CisKKyAgICBzd2l0Y2ggKGRlc3RTdGF0ZSkgeworICAgIGNhc2UgT01YX1N0YXRlSW52YWxpZDoKKyAgICAgICAgc3dpdGNoIChjdXJyZW50U3RhdGUpIHsKKyAgICAgICAgY2FzZSBPTVhfU3RhdGVXYWl0Rm9yUmVzb3VyY2VzOgorICAgICAgICAgICAgU0VDX09NWF9PdXRfV2FpdEZvclJlc291cmNlKHBPTVhDb21wb25lbnQpOworICAgICAgICBjYXNlIE9NWF9TdGF0ZUlkbGU6CisgICAgICAgIGNhc2UgT01YX1N0YXRlRXhlY3V0aW5nOgorICAgICAgICBjYXNlIE9NWF9TdGF0ZVBhdXNlOgorICAgICAgICBjYXNlIE9NWF9TdGF0ZUxvYWRlZDoKKyAgICAgICAgICAgIHBTRUNDb21wb25lbnQtPmN1cnJlbnRTdGF0ZSA9IE9NWF9TdGF0ZUludmFsaWQ7CisgICAgICAgICAgICBpZiAocFNFQ0NvbXBvbmVudC0+aEJ1ZmZlclByb2Nlc3MpIHsKKyAgICAgICAgICAgICAgICBwU0VDQ29tcG9uZW50LT5iRXhpdEJ1ZmZlclByb2Nlc3NUaHJlYWQgPSBPTVhfVFJVRTsKKworICAgICAgICAgICAgICAgIGZvciAoaSA9IDA7IGkgPCBBTExfUE9SVF9OVU07IGkrKykgeworICAgICAgICAgICAgICAgICAgICBTRUNfT1NBTF9HZXRfU2VtYXBob3JlQ291bnQocFNFQ0NvbXBvbmVudC0+cFNFQ1BvcnRbaV0uYnVmZmVyU2VtSUQsICZjb3VudFZhbHVlKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGNvdW50VmFsdWUgPT0gMCkKKyAgICAgICAgICAgICAgICAgICAgICAgIFNFQ19PU0FMX1NlbWFwaG9yZVBvc3QocFNFQ0NvbXBvbmVudC0+cFNFQ1BvcnRbaV0uYnVmZmVyU2VtSUQpOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIFNFQ19PU0FMX1NpZ25hbFNldChwU0VDQ29tcG9uZW50LT5wYXVzZUV2ZW50KTsKKyAgICAgICAgICAgICAgICBTRUNfT1NBTF9UaHJlYWRUZXJtaW5hdGUocFNFQ0NvbXBvbmVudC0+aEJ1ZmZlclByb2Nlc3MpOworICAgICAgICAgICAgICAgIHBTRUNDb21wb25lbnQtPmhCdWZmZXJQcm9jZXNzID0gTlVMTDsKKworICAgICAgICAgICAgICAgIGZvciAoaSA9IDA7IGkgPCBBTExfUE9SVF9OVU07IGkrKykgeworICAgICAgICAgICAgICAgICAgICBTRUNfT1NBTF9NdXRleFRlcm1pbmF0ZShwU0VDQ29tcG9uZW50LT5zZWNEYXRhQnVmZmVyW2ldLmJ1ZmZlck11dGV4KTsKKyAgICAgICAgICAgICAgICAgICAgcFNFQ0NvbXBvbmVudC0+c2VjRGF0YUJ1ZmZlcltpXS5idWZmZXJNdXRleCA9IE5VTEw7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgU0VDX09TQUxfU2lnbmFsVGVybWluYXRlKHBTRUNDb21wb25lbnQtPnBhdXNlRXZlbnQpOworICAgICAgICAgICAgICAgIGZvciAoaSA9IDA7IGkgPCBBTExfUE9SVF9OVU07IGkrKykgeworICAgICAgICAgICAgICAgICAgICBTRUNfT1NBTF9TZW1hcGhvcmVUZXJtaW5hdGUocFNFQ0NvbXBvbmVudC0+cFNFQ1BvcnRbaV0uYnVmZmVyU2VtSUQpOworICAgICAgICAgICAgICAgICAgICBwU0VDQ29tcG9uZW50LT5wU0VDUG9ydFtpXS5idWZmZXJTZW1JRCA9IE5VTEw7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKHBTRUNDb21wb25lbnQtPnNlY19tZmNfY29tcG9uZW50VGVybWluYXRlICE9IE5VTEwpCisgICAgICAgICAgICAgICAgcFNFQ0NvbXBvbmVudC0+c2VjX21mY19jb21wb25lbnRUZXJtaW5hdGUocE9NWENvbXBvbmVudCk7CisKKyAgICAgICAgICAgIHJldCA9IE9NWF9FcnJvckludmFsaWRTdGF0ZTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgcmV0ID0gT01YX0Vycm9ySW52YWxpZFN0YXRlOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBPTVhfU3RhdGVMb2FkZWQ6CisgICAgICAgIHN3aXRjaCAoY3VycmVudFN0YXRlKSB7CisgICAgICAgIGNhc2UgT01YX1N0YXRlSWRsZToKKyAgICAgICAgICAgIHBTRUNDb21wb25lbnQtPmJFeGl0QnVmZmVyUHJvY2Vzc1RocmVhZCA9IE9NWF9UUlVFOworCisgICAgICAgICAgICBmb3IgKGkgPSAwOyBpIDwgQUxMX1BPUlRfTlVNOyBpKyspIHsKKyAgICAgICAgICAgICAgICBTRUNfT1NBTF9HZXRfU2VtYXBob3JlQ291bnQocFNFQ0NvbXBvbmVudC0+cFNFQ1BvcnRbaV0uYnVmZmVyU2VtSUQsICZjb3VudFZhbHVlKTsKKyAgICAgICAgICAgICAgICBpZiAoY291bnRWYWx1ZSA9PSAwKQorICAgICAgICAgICAgICAgICAgICBTRUNfT1NBTF9TZW1hcGhvcmVQb3N0KHBTRUNDb21wb25lbnQtPnBTRUNQb3J0W2ldLmJ1ZmZlclNlbUlEKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgU0VDX09TQUxfU2lnbmFsU2V0KHBTRUNDb21wb25lbnQtPnBhdXNlRXZlbnQpOworICAgICAgICAgICAgU0VDX09TQUxfVGhyZWFkVGVybWluYXRlKHBTRUNDb21wb25lbnQtPmhCdWZmZXJQcm9jZXNzKTsKKyAgICAgICAgICAgIHBTRUNDb21wb25lbnQtPmhCdWZmZXJQcm9jZXNzID0gTlVMTDsKKworICAgICAgICAgICAgZm9yIChpID0gMDsgaSA8IEFMTF9QT1JUX05VTTsgaSsrKSB7CisgICAgICAgICAgICAgICAgU0VDX09TQUxfTXV0ZXhUZXJtaW5hdGUocFNFQ0NvbXBvbmVudC0+c2VjRGF0YUJ1ZmZlcltpXS5idWZmZXJNdXRleCk7CisgICAgICAgICAgICAgICAgcFNFQ0NvbXBvbmVudC0+c2VjRGF0YUJ1ZmZlcltpXS5idWZmZXJNdXRleCA9IE5VTEw7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIFNFQ19PU0FMX1NpZ25hbFRlcm1pbmF0ZShwU0VDQ29tcG9uZW50LT5wYXVzZUV2ZW50KTsKKyAgICAgICAgICAgIGZvciAoaSA9IDA7IGkgPCBBTExfUE9SVF9OVU07IGkrKykgeworICAgICAgICAgICAgICAgIFNFQ19PU0FMX1NlbWFwaG9yZVRlcm1pbmF0ZShwU0VDQ29tcG9uZW50LT5wU0VDUG9ydFtpXS5idWZmZXJTZW1JRCk7CisgICAgICAgICAgICAgICAgcFNFQ0NvbXBvbmVudC0+cFNFQ1BvcnRbaV0uYnVmZmVyU2VtSUQgPSBOVUxMOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBwU0VDQ29tcG9uZW50LT5zZWNfbWZjX2NvbXBvbmVudFRlcm1pbmF0ZShwT01YQ29tcG9uZW50KTsKKworICAgICAgICAgICAgZm9yIChpID0gMDsgaSA8IChwU0VDQ29tcG9uZW50LT5wb3J0UGFyYW0ublBvcnRzKTsgaSsrKSB7CisgICAgICAgICAgICAgICAgcFNFQ1BvcnQgPSAocFNFQ0NvbXBvbmVudC0+cFNFQ1BvcnQgKyBpKTsKKyAgICAgICAgICAgICAgICBpZiAoQ0hFQ0tfUE9SVF9UVU5ORUxFRChwU0VDUG9ydCkgJiYgQ0hFQ0tfUE9SVF9CVUZGRVJfU1VQUExJRVIocFNFQ1BvcnQpKSB7CisgICAgICAgICAgICAgICAgICAgIHdoaWxlIChTRUNfT1NBTF9HZXRFbGVtTnVtKCZwU0VDUG9ydC0+YnVmZmVyUSkgPiAwKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBtZXNzYWdlID0gKFNFQ19PTVhfTUVTU0FHRSopU0VDX09TQUxfRGVxdWV1ZSgmcFNFQ1BvcnQtPmJ1ZmZlclEpOworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG1lc3NhZ2UgIT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBTRUNfT1NBTF9GcmVlKG1lc3NhZ2UpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIHJldCA9IHBTRUNDb21wb25lbnQtPnNlY19GcmVlVHVubmVsQnVmZmVyKHBTRUNQb3J0LCBpKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKE9NWF9FcnJvck5vbmUgIT0gcmV0KSB7CisgICAgICAgICAgICAgICAgICAgICAgICBnb3RvIEVYSVQ7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICBpZiAoQ0hFQ0tfUE9SVF9FTkFCTEVEKHBTRUNQb3J0KSkgeworICAgICAgICAgICAgICAgICAgICAgICAgU0VDX09TQUxfU2VtYXBob3JlV2FpdChwU0VDUG9ydC0+dW5sb2FkZWRSZXNvdXJjZSk7CisgICAgICAgICAgICAgICAgICAgICAgICBwU0VDUG9ydC0+cG9ydERlZmluaXRpb24uYlBvcHVsYXRlZCA9IE9NWF9GQUxTRTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHBTRUNDb21wb25lbnQtPmN1cnJlbnRTdGF0ZSA9IE9NWF9TdGF0ZUxvYWRlZDsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIE9NWF9TdGF0ZVdhaXRGb3JSZXNvdXJjZXM6CisgICAgICAgICAgICByZXQgPSBTRUNfT01YX091dF9XYWl0Rm9yUmVzb3VyY2UocE9NWENvbXBvbmVudCk7CisgICAgICAgICAgICBwU0VDQ29tcG9uZW50LT5jdXJyZW50U3RhdGUgPSBPTVhfU3RhdGVMb2FkZWQ7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBPTVhfU3RhdGVFeGVjdXRpbmc6CisgICAgICAgIGNhc2UgT01YX1N0YXRlUGF1c2U6CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICByZXQgPSBPTVhfRXJyb3JJbmNvcnJlY3RTdGF0ZVRyYW5zaXRpb247CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgICAgICBicmVhazsKKyAgICBjYXNlIE9NWF9TdGF0ZUlkbGU6CisgICAgICAgIHN3aXRjaCAoY3VycmVudFN0YXRlKSB7CisgICAgICAgIGNhc2UgT01YX1N0YXRlTG9hZGVkOgorICAgICAgICAgICAgZm9yIChpID0gMDsgaSA8IHBTRUNDb21wb25lbnQtPnBvcnRQYXJhbS5uUG9ydHM7IGkrKykgeworICAgICAgICAgICAgICAgIHBTRUNQb3J0ID0gKHBTRUNDb21wb25lbnQtPnBTRUNQb3J0ICsgaSk7CisgICAgICAgICAgICAgICAgaWYgKHBTRUNQb3J0ID09IE5VTEwpIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0ID0gT01YX0Vycm9yQmFkUGFyYW1ldGVyOworICAgICAgICAgICAgICAgICAgICBnb3RvIEVYSVQ7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGlmIChDSEVDS19QT1JUX1RVTk5FTEVEKHBTRUNQb3J0KSAmJiBDSEVDS19QT1JUX0JVRkZFUl9TVVBQTElFUihwU0VDUG9ydCkpIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKENIRUNLX1BPUlRfRU5BQkxFRChwU0VDUG9ydCkpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldCA9IHBTRUNDb21wb25lbnQtPnNlY19BbGxvY2F0ZVR1bm5lbEJ1ZmZlcihwU0VDUG9ydCwgaSk7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAocmV0IT1PTVhfRXJyb3JOb25lKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdvdG8gRVhJVDsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIGlmIChDSEVDS19QT1JUX0VOQUJMRUQocFNFQ1BvcnQpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBTRUNfT1NBTF9TZW1hcGhvcmVXYWl0KHBTRUNDb21wb25lbnQtPnBTRUNQb3J0W2ldLmxvYWRlZFJlc291cmNlKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHBTRUNQb3J0LT5wb3J0RGVmaW5pdGlvbi5iUG9wdWxhdGVkID0gT01YX1RSVUU7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICByZXQgPSBwU0VDQ29tcG9uZW50LT5zZWNfbWZjX2NvbXBvbmVudEluaXQocE9NWENvbXBvbmVudCk7CisgICAgICAgICAgICBpZiAocmV0ICE9IE9NWF9FcnJvck5vbmUpIHsKKyAgICAgICAgICAgICAgICAvKgorICAgICAgICAgICAgICAgICAqIGlmIChDSEVDS19QT1JUX1RVTk5FTEVEID09IE9NWF9UUlVFKSB0aGVuVHVubmVsIEJ1ZmZlciBGcmVlCisgICAgICAgICAgICAgICAgICovCisgICAgICAgICAgICAgICAgZ290byBFWElUOworICAgICAgICAgICAgfQorICAgICAgICAgICAgcFNFQ0NvbXBvbmVudC0+YkV4aXRCdWZmZXJQcm9jZXNzVGhyZWFkID0gT01YX0ZBTFNFOworICAgICAgICAgICAgU0VDX09TQUxfU2lnbmFsQ3JlYXRlKCZwU0VDQ29tcG9uZW50LT5wYXVzZUV2ZW50KTsKKyAgICAgICAgICAgIGZvciAoaSA9IDA7IGkgPCBBTExfUE9SVF9OVU07IGkrKykgeworICAgICAgICAgICAgICAgIHJldCA9IFNFQ19PU0FMX1NlbWFwaG9yZUNyZWF0ZSgmcFNFQ0NvbXBvbmVudC0+cFNFQ1BvcnRbaV0uYnVmZmVyU2VtSUQpOworICAgICAgICAgICAgICAgIGlmIChyZXQgIT0gT01YX0Vycm9yTm9uZSkgeworICAgICAgICAgICAgICAgICAgICByZXQgPSBPTVhfRXJyb3JJbnN1ZmZpY2llbnRSZXNvdXJjZXM7CisgICAgICAgICAgICAgICAgICAgIFNFQ19PU0FMX0xvZyhTRUNfTE9HX0VSUk9SLCAiT01YX0Vycm9ySW5zdWZmaWNpZW50UmVzb3VyY2VzLCBMaW5lOiVkIiwgX19MSU5FX18pOworICAgICAgICAgICAgICAgICAgICBnb3RvIEVYSVQ7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgZm9yIChpID0gMDsgaSA8IEFMTF9QT1JUX05VTTsgaSsrKSB7CisgICAgICAgICAgICAgICAgcmV0ID0gU0VDX09TQUxfTXV0ZXhDcmVhdGUoJnBTRUNDb21wb25lbnQtPnNlY0RhdGFCdWZmZXJbaV0uYnVmZmVyTXV0ZXgpOworICAgICAgICAgICAgICAgIGlmIChyZXQgIT0gT01YX0Vycm9yTm9uZSkgeworICAgICAgICAgICAgICAgICAgICByZXQgPSBPTVhfRXJyb3JJbnN1ZmZpY2llbnRSZXNvdXJjZXM7CisgICAgICAgICAgICAgICAgICAgIFNFQ19PU0FMX0xvZyhTRUNfTE9HX0VSUk9SLCAiT01YX0Vycm9ySW5zdWZmaWNpZW50UmVzb3VyY2VzLCBMaW5lOiVkIiwgX19MSU5FX18pOworICAgICAgICAgICAgICAgICAgICBnb3RvIEVYSVQ7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgcmV0ID0gU0VDX09TQUxfVGhyZWFkQ3JlYXRlKCZwU0VDQ29tcG9uZW50LT5oQnVmZmVyUHJvY2VzcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU0VDX09NWF9CdWZmZXJQcm9jZXNzVGhyZWFkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwT01YQ29tcG9uZW50KTsKKyAgICAgICAgICAgIGlmIChyZXQgIT0gT01YX0Vycm9yTm9uZSkgeworICAgICAgICAgICAgICAgIC8qCisgICAgICAgICAgICAgICAgICogaWYgKENIRUNLX1BPUlRfVFVOTkVMRUQgPT0gT01YX1RSVUUpIHRoZW5UdW5uZWwgQnVmZmVyIEZyZWUKKyAgICAgICAgICAgICAgICAgKi8KKworICAgICAgICAgICAgICAgIFNFQ19PU0FMX1NpZ25hbFRlcm1pbmF0ZShwU0VDQ29tcG9uZW50LT5wYXVzZUV2ZW50KTsKKyAgICAgICAgICAgICAgICBmb3IgKGkgPSAwOyBpIDwgQUxMX1BPUlRfTlVNOyBpKyspIHsKKyAgICAgICAgICAgICAgICAgICAgU0VDX09TQUxfTXV0ZXhUZXJtaW5hdGUocFNFQ0NvbXBvbmVudC0+c2VjRGF0YUJ1ZmZlcltpXS5idWZmZXJNdXRleCk7CisgICAgICAgICAgICAgICAgICAgIHBTRUNDb21wb25lbnQtPnNlY0RhdGFCdWZmZXJbaV0uYnVmZmVyTXV0ZXggPSBOVUxMOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBmb3IgKGkgPSAwOyBpIDwgQUxMX1BPUlRfTlVNOyBpKyspIHsKKyAgICAgICAgICAgICAgICAgICAgU0VDX09TQUxfU2VtYXBob3JlVGVybWluYXRlKHBTRUNDb21wb25lbnQtPnBTRUNQb3J0W2ldLmJ1ZmZlclNlbUlEKTsKKyAgICAgICAgICAgICAgICAgICAgcFNFQ0NvbXBvbmVudC0+cFNFQ1BvcnRbaV0uYnVmZmVyU2VtSUQgPSBOVUxMOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIHJldCA9IE9NWF9FcnJvckluc3VmZmljaWVudFJlc291cmNlczsKKyAgICAgICAgICAgICAgICBnb3RvIEVYSVQ7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBwU0VDQ29tcG9uZW50LT5jdXJyZW50U3RhdGUgPSBPTVhfU3RhdGVJZGxlOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgT01YX1N0YXRlRXhlY3V0aW5nOgorICAgICAgICBjYXNlIE9NWF9TdGF0ZVBhdXNlOgorICAgICAgICAgICAgU0VDX09NWF9CdWZmZXJGbHVzaFByb2Nlc3NOb0V2ZW50KHBPTVhDb21wb25lbnQsIEFMTF9QT1JUX0lOREVYKTsKKyAgICAgICAgICAgIHBTRUNDb21wb25lbnQtPmN1cnJlbnRTdGF0ZSA9IE9NWF9TdGF0ZUlkbGU7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBPTVhfU3RhdGVXYWl0Rm9yUmVzb3VyY2VzOgorICAgICAgICAgICAgcFNFQ0NvbXBvbmVudC0+Y3VycmVudFN0YXRlID0gT01YX1N0YXRlSWRsZTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgcmV0ID0gT01YX0Vycm9ySW5jb3JyZWN0U3RhdGVUcmFuc2l0aW9uOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBPTVhfU3RhdGVFeGVjdXRpbmc6CisgICAgICAgIHN3aXRjaCAoY3VycmVudFN0YXRlKSB7CisgICAgICAgIGNhc2UgT01YX1N0YXRlTG9hZGVkOgorICAgICAgICAgICAgcmV0ID0gT01YX0Vycm9ySW5jb3JyZWN0U3RhdGVUcmFuc2l0aW9uOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgT01YX1N0YXRlSWRsZToKKyAgICAgICAgICAgIGZvciAoaSA9IDA7IGkgPCBwU0VDQ29tcG9uZW50LT5wb3J0UGFyYW0ublBvcnRzOyBpKyspIHsKKyAgICAgICAgICAgICAgICBwU0VDUG9ydCA9ICZwU0VDQ29tcG9uZW50LT5wU0VDUG9ydFtpXTsKKyAgICAgICAgICAgICAgICBpZiAoQ0hFQ0tfUE9SVF9UVU5ORUxFRChwU0VDUG9ydCkgJiYgQ0hFQ0tfUE9SVF9CVUZGRVJfU1VQUExJRVIocFNFQ1BvcnQpICYmIENIRUNLX1BPUlRfRU5BQkxFRChwU0VDUG9ydCkpIHsKKyAgICAgICAgICAgICAgICAgICAgZm9yIChqID0gMDsgaiA8IHBTRUNQb3J0LT50dW5uZWxCdWZmZXJOdW07IGorKykgeworICAgICAgICAgICAgICAgICAgICAgICAgU0VDX09TQUxfU2VtYXBob3JlUG9zdChwU0VDQ29tcG9uZW50LT5wU0VDUG9ydFtpXS5idWZmZXJTZW1JRCk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHBTRUNDb21wb25lbnQtPnRyYW5zaWVudFN0YXRlID0gU0VDX09NWF9UcmFuc1N0YXRlTWF4OworICAgICAgICAgICAgcFNFQ0NvbXBvbmVudC0+Y3VycmVudFN0YXRlID0gT01YX1N0YXRlRXhlY3V0aW5nOworICAgICAgICAgICAgU0VDX09TQUxfU2lnbmFsU2V0KHBTRUNDb21wb25lbnQtPnBhdXNlRXZlbnQpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgT01YX1N0YXRlUGF1c2U6CisgICAgICAgICAgICBmb3IgKGkgPSAwOyBpIDwgcFNFQ0NvbXBvbmVudC0+cG9ydFBhcmFtLm5Qb3J0czsgaSsrKSB7CisgICAgICAgICAgICAgICAgcFNFQ1BvcnQgPSAmcFNFQ0NvbXBvbmVudC0+cFNFQ1BvcnRbaV07CisgICAgICAgICAgICAgICAgaWYgKENIRUNLX1BPUlRfVFVOTkVMRUQocFNFQ1BvcnQpICYmIENIRUNLX1BPUlRfQlVGRkVSX1NVUFBMSUVSKHBTRUNQb3J0KSAmJiBDSEVDS19QT1JUX0VOQUJMRUQocFNFQ1BvcnQpKSB7CisgICAgICAgICAgICAgICAgICAgIE9NWF9TMzIgc2VtYVZhbHVlID0gMCwgY250ID0gMDsKKyAgICAgICAgICAgICAgICAgICAgU0VDX09TQUxfR2V0X1NlbWFwaG9yZUNvdW50KHBTRUNDb21wb25lbnQtPnBTRUNQb3J0W2ldLmJ1ZmZlclNlbUlELCAmc2VtYVZhbHVlKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKFNFQ19PU0FMX0dldEVsZW1OdW0oJnBTRUNQb3J0LT5idWZmZXJRKSA+IHNlbWFWYWx1ZSkgeworICAgICAgICAgICAgICAgICAgICAgICAgY250ID0gU0VDX09TQUxfR2V0RWxlbU51bSgmcFNFQ1BvcnQtPmJ1ZmZlclEpIC0gc2VtYVZhbHVlOworICAgICAgICAgICAgICAgICAgICAgICAgZm9yIChrID0gMDsgayA8IGNudDsgaysrKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgU0VDX09TQUxfU2VtYXBob3JlUG9zdChwU0VDQ29tcG9uZW50LT5wU0VDUG9ydFtpXS5idWZmZXJTZW1JRCk7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHBTRUNDb21wb25lbnQtPmN1cnJlbnRTdGF0ZSA9IE9NWF9TdGF0ZUV4ZWN1dGluZzsKKyAgICAgICAgICAgIFNFQ19PU0FMX1NpZ25hbFNldChwU0VDQ29tcG9uZW50LT5wYXVzZUV2ZW50KTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIE9NWF9TdGF0ZVdhaXRGb3JSZXNvdXJjZXM6CisgICAgICAgICAgICByZXQgPSBPTVhfRXJyb3JJbmNvcnJlY3RTdGF0ZVRyYW5zaXRpb247CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIHJldCA9IE9NWF9FcnJvckluY29ycmVjdFN0YXRlVHJhbnNpdGlvbjsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgT01YX1N0YXRlUGF1c2U6CisgICAgICAgIHN3aXRjaCAoY3VycmVudFN0YXRlKSB7CisgICAgICAgIGNhc2UgT01YX1N0YXRlTG9hZGVkOgorICAgICAgICAgICAgcmV0ID0gT01YX0Vycm9ySW5jb3JyZWN0U3RhdGVUcmFuc2l0aW9uOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgT01YX1N0YXRlSWRsZToKKyAgICAgICAgICAgIHBTRUNDb21wb25lbnQtPmN1cnJlbnRTdGF0ZSA9IE9NWF9TdGF0ZVBhdXNlOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgT01YX1N0YXRlRXhlY3V0aW5nOgorICAgICAgICAgICAgcFNFQ0NvbXBvbmVudC0+Y3VycmVudFN0YXRlID0gT01YX1N0YXRlUGF1c2U7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBPTVhfU3RhdGVXYWl0Rm9yUmVzb3VyY2VzOgorICAgICAgICAgICAgcmV0ID0gT01YX0Vycm9ySW5jb3JyZWN0U3RhdGVUcmFuc2l0aW9uOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICByZXQgPSBPTVhfRXJyb3JJbmNvcnJlY3RTdGF0ZVRyYW5zaXRpb247CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgICAgICBicmVhazsKKyAgICBjYXNlIE9NWF9TdGF0ZVdhaXRGb3JSZXNvdXJjZXM6CisgICAgICAgIHN3aXRjaCAoY3VycmVudFN0YXRlKSB7CisgICAgICAgIGNhc2UgT01YX1N0YXRlTG9hZGVkOgorICAgICAgICAgICAgcmV0ID0gU0VDX09NWF9Jbl9XYWl0Rm9yUmVzb3VyY2UocE9NWENvbXBvbmVudCk7CisgICAgICAgICAgICBwU0VDQ29tcG9uZW50LT5jdXJyZW50U3RhdGUgPSBPTVhfU3RhdGVXYWl0Rm9yUmVzb3VyY2VzOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgT01YX1N0YXRlSWRsZToKKyAgICAgICAgY2FzZSBPTVhfU3RhdGVFeGVjdXRpbmc6CisgICAgICAgIGNhc2UgT01YX1N0YXRlUGF1c2U6CisgICAgICAgICAgICByZXQgPSBPTVhfRXJyb3JJbmNvcnJlY3RTdGF0ZVRyYW5zaXRpb247CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIHJldCA9IE9NWF9FcnJvckluY29ycmVjdFN0YXRlVHJhbnNpdGlvbjsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgICAgIGJyZWFrOworICAgIGRlZmF1bHQ6CisgICAgICAgIHJldCA9IE9NWF9FcnJvckluY29ycmVjdFN0YXRlVHJhbnNpdGlvbjsKKyAgICAgICAgYnJlYWs7CisgICAgfQorCitFWElUOgorICAgIGlmIChyZXQgPT0gT01YX0Vycm9yTm9uZSkgeworICAgICAgICBpZiAocFNFQ0NvbXBvbmVudC0+cENhbGxiYWNrcyAhPSBOVUxMKSB7CisgICAgICAgICAgICBwU0VDQ29tcG9uZW50LT5wQ2FsbGJhY2tzLT5FdmVudEhhbmRsZXIoKE9NWF9IQU5ETEVUWVBFKXBPTVhDb21wb25lbnQsCisgICAgICAgICAgICBwU0VDQ29tcG9uZW50LT5jYWxsYmFja0RhdGEsCisgICAgICAgICAgICBPTVhfRXZlbnRDbWRDb21wbGV0ZSwgT01YX0NvbW1hbmRTdGF0ZVNldCwKKyAgICAgICAgICAgIGRlc3RTdGF0ZSwgTlVMTCk7CisgICAgICAgIH0KKyAgICB9IGVsc2UgeworICAgICAgICBpZiAocFNFQ0NvbXBvbmVudC0+cENhbGxiYWNrcyAhPSBOVUxMKSB7CisgICAgICAgICAgICBwU0VDQ29tcG9uZW50LT5wQ2FsbGJhY2tzLT5FdmVudEhhbmRsZXIoKE9NWF9IQU5ETEVUWVBFKXBPTVhDb21wb25lbnQsCisgICAgICAgICAgICBwU0VDQ29tcG9uZW50LT5jYWxsYmFja0RhdGEsCisgICAgICAgICAgICBPTVhfRXZlbnRFcnJvciwgcmV0LCAwLCBOVUxMKTsKKyAgICAgICAgfQorICAgIH0KKyAgICBGdW5jdGlvbk91dCgpOworCisgICAgcmV0dXJuIHJldDsKK30KKworc3RhdGljIE9NWF9FUlJPUlRZUEUgU0VDX09NWF9NZXNzYWdlSGFuZGxlclRocmVhZChPTVhfUFRSIHRocmVhZERhdGEpCit7CisgICAgT01YX0VSUk9SVFlQRSAgICAgICAgICByZXQgPSBPTVhfRXJyb3JOb25lOworICAgIE9NWF9DT01QT05FTlRUWVBFICAgICAqcE9NWENvbXBvbmVudCA9IE5VTEw7CisgICAgU0VDX09NWF9CQVNFQ09NUE9ORU5UICpwU0VDQ29tcG9uZW50ID0gTlVMTDsKKyAgICBTRUNfT01YX01FU1NBR0UgICAgICAgKm1lc3NhZ2UgPSBOVUxMOworICAgIE9NWF9VMzIgICAgICAgICAgICAgICAgbWVzc2FnZVR5cGUgPSAwLCBwb3J0SW5kZXggPSAwOworCisgICAgRnVuY3Rpb25JbigpOworCisgICAgaWYgKHRocmVhZERhdGEgPT0gTlVMTCkgeworICAgICAgICByZXQgPSBPTVhfRXJyb3JCYWRQYXJhbWV0ZXI7CisgICAgICAgIGdvdG8gRVhJVDsKKyAgICB9CisKKyAgICBwT01YQ29tcG9uZW50ID0gKE9NWF9DT01QT05FTlRUWVBFICopdGhyZWFkRGF0YTsKKyAgICByZXQgPSBTRUNfT01YX0NoZWNrX1NpemVWZXJzaW9uKHBPTVhDb21wb25lbnQsIHNpemVvZihPTVhfQ09NUE9ORU5UVFlQRSkpOworICAgIGlmIChyZXQgIT0gT01YX0Vycm9yTm9uZSkgeworICAgICAgICBnb3RvIEVYSVQ7CisgICAgfQorCisgICAgcFNFQ0NvbXBvbmVudCA9IChTRUNfT01YX0JBU0VDT01QT05FTlQgKilwT01YQ29tcG9uZW50LT5wQ29tcG9uZW50UHJpdmF0ZTsKKworICAgIHdoaWxlIChwU0VDQ29tcG9uZW50LT5iRXhpdE1lc3NhZ2VIYW5kbGVyVGhyZWFkID09IE9NWF9GQUxTRSkgeworICAgICAgICBTRUNfT1NBTF9TZW1hcGhvcmVXYWl0KHBTRUNDb21wb25lbnQtPm1zZ1NlbWFwaG9yZUhhbmRsZSk7CisgICAgICAgIG1lc3NhZ2UgPSAoU0VDX09NWF9NRVNTQUdFICopU0VDX09TQUxfRGVxdWV1ZSgmcFNFQ0NvbXBvbmVudC0+bWVzc2FnZVEpOworICAgICAgICBpZiAobWVzc2FnZSAhPSBOVUxMKSB7CisgICAgICAgICAgICBtZXNzYWdlVHlwZSA9IG1lc3NhZ2UtPm1lc3NhZ2VUeXBlOworICAgICAgICAgICAgc3dpdGNoIChtZXNzYWdlVHlwZSkgeworICAgICAgICAgICAgY2FzZSBPTVhfQ29tbWFuZFN0YXRlU2V0OgorICAgICAgICAgICAgICAgIHJldCA9IFNFQ19PTVhfQ29tcG9uZW50U3RhdGVTZXQocE9NWENvbXBvbmVudCwgbWVzc2FnZS0+bWVzc2FnZVBhcmFtKTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgT01YX0NvbW1hbmRGbHVzaDoKKyAgICAgICAgICAgICAgICByZXQgPSBTRUNfT01YX0J1ZmZlckZsdXNoUHJvY2VzcyhwT01YQ29tcG9uZW50LCBtZXNzYWdlLT5tZXNzYWdlUGFyYW0pOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBPTVhfQ29tbWFuZFBvcnREaXNhYmxlOgorICAgICAgICAgICAgICAgIHJldCA9IFNFQ19PTVhfUG9ydERpc2FibGVQcm9jZXNzKHBPTVhDb21wb25lbnQsIG1lc3NhZ2UtPm1lc3NhZ2VQYXJhbSk7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIE9NWF9Db21tYW5kUG9ydEVuYWJsZToKKyAgICAgICAgICAgICAgICByZXQgPSBTRUNfT01YX1BvcnRFbmFibGVQcm9jZXNzKHBPTVhDb21wb25lbnQsIG1lc3NhZ2UtPm1lc3NhZ2VQYXJhbSk7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIE9NWF9Db21tYW5kTWFya0J1ZmZlcjoKKyAgICAgICAgICAgICAgICBwb3J0SW5kZXggPSBtZXNzYWdlLT5tZXNzYWdlUGFyYW07CisgICAgICAgICAgICAgICAgcFNFQ0NvbXBvbmVudC0+cFNFQ1BvcnRbcG9ydEluZGV4XS5tYXJrVHlwZS5oTWFya1RhcmdldENvbXBvbmVudCA9ICgoT01YX01BUktUWVBFICopbWVzc2FnZS0+cENtZERhdGEpLT5oTWFya1RhcmdldENvbXBvbmVudDsKKyAgICAgICAgICAgICAgICBwU0VDQ29tcG9uZW50LT5wU0VDUG9ydFtwb3J0SW5kZXhdLm1hcmtUeXBlLnBNYXJrRGF0YSAgICAgICAgICAgID0gKChPTVhfTUFSS1RZUEUgKiltZXNzYWdlLT5wQ21kRGF0YSktPnBNYXJrRGF0YTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgKE9NWF9DT01NQU5EVFlQRSlTRUNfT01YX0NvbW1hbmRDb21wb25lbnREZUluaXQ6CisgICAgICAgICAgICAgICAgcFNFQ0NvbXBvbmVudC0+YkV4aXRNZXNzYWdlSGFuZGxlclRocmVhZCA9IE9NWF9UUlVFOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIFNFQ19PU0FMX0ZyZWUobWVzc2FnZSk7CisgICAgICAgICAgICBtZXNzYWdlID0gTlVMTDsKKyAgICAgICAgfQorICAgIH0KKworICAgIFNFQ19PU0FMX1RocmVhZEV4aXQoTlVMTCk7CisKK0VYSVQ6CisgICAgRnVuY3Rpb25PdXQoKTsKKworICAgIHJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBPTVhfRVJST1JUWVBFIFNFQ19TdGF0ZVNldChTRUNfT01YX0JBU0VDT01QT05FTlQgKnBTRUNDb21wb25lbnQsIE9NWF9VMzIgblBhcmFtKQoreworICAgIE9NWF9VMzIgZGVzdFN0YXRlID0gblBhcmFtOworICAgIE9NWF9VMzIgaSA9IDA7CisKKyAgICBpZiAoKGRlc3RTdGF0ZSA9PSBPTVhfU3RhdGVJZGxlKSAmJiAocFNFQ0NvbXBvbmVudC0+Y3VycmVudFN0YXRlID09IE9NWF9TdGF0ZUxvYWRlZCkpIHsKKyAgICAgICAgcFNFQ0NvbXBvbmVudC0+dHJhbnNpZW50U3RhdGUgPSBTRUNfT01YX1RyYW5zU3RhdGVMb2FkZWRUb0lkbGU7CisgICAgICAgIGZvcihpID0gMDsgaSA8IHBTRUNDb21wb25lbnQtPnBvcnRQYXJhbS5uUG9ydHM7IGkrKykgeworICAgICAgICAgICAgcFNFQ0NvbXBvbmVudC0+cFNFQ1BvcnRbaV0ucG9ydFN0YXRlID0gT01YX1N0YXRlSWRsZTsKKyAgICAgICAgfQorICAgICAgICBTRUNfT1NBTF9Mb2coU0VDX0xPR19UUkFDRSwgInRvIE9NWF9TdGF0ZUlkbGUiKTsKKyAgICB9IGVsc2UgaWYgKChkZXN0U3RhdGUgPT0gT01YX1N0YXRlTG9hZGVkKSAmJiAocFNFQ0NvbXBvbmVudC0+Y3VycmVudFN0YXRlID09IE9NWF9TdGF0ZUlkbGUpKSB7CisgICAgICAgIHBTRUNDb21wb25lbnQtPnRyYW5zaWVudFN0YXRlID0gU0VDX09NWF9UcmFuc1N0YXRlSWRsZVRvTG9hZGVkOworICAgICAgICBmb3IgKGkgPSAwOyBpIDwgcFNFQ0NvbXBvbmVudC0+cG9ydFBhcmFtLm5Qb3J0czsgaSsrKSB7CisgICAgICAgICAgICBwU0VDQ29tcG9uZW50LT5wU0VDUG9ydFtpXS5wb3J0U3RhdGUgPSBPTVhfU3RhdGVMb2FkZWQ7CisgICAgICAgIH0KKyAgICAgICAgU0VDX09TQUxfTG9nKFNFQ19MT0dfVFJBQ0UsICJ0byBPTVhfU3RhdGVMb2FkZWQiKTsKKyAgICB9IGVsc2UgaWYgKChkZXN0U3RhdGUgPT0gT01YX1N0YXRlSWRsZSkgJiYgKHBTRUNDb21wb25lbnQtPmN1cnJlbnRTdGF0ZSA9PSBPTVhfU3RhdGVFeGVjdXRpbmcpKSB7CisgICAgICAgIHBTRUNDb21wb25lbnQtPnRyYW5zaWVudFN0YXRlID0gU0VDX09NWF9UcmFuc1N0YXRlRXhlY3V0aW5nVG9JZGxlOworICAgICAgICBTRUNfT1NBTF9Mb2coU0VDX0xPR19UUkFDRSwgInRvIE9NWF9TdGF0ZUlkbGUiKTsKKyAgICB9IGVsc2UgaWYgKChkZXN0U3RhdGUgPT0gT01YX1N0YXRlRXhlY3V0aW5nKSAmJiAocFNFQ0NvbXBvbmVudC0+Y3VycmVudFN0YXRlID09IE9NWF9TdGF0ZUlkbGUpKSB7CisgICAgICAgIHBTRUNDb21wb25lbnQtPnRyYW5zaWVudFN0YXRlID0gU0VDX09NWF9UcmFuc1N0YXRlSWRsZVRvRXhlY3V0aW5nOworICAgICAgICBTRUNfT1NBTF9Mb2coU0VDX0xPR19UUkFDRSwgInRvIE9NWF9TdGF0ZUV4ZWN1dGluZyIpOworICAgIH0gZWxzZSBpZiAoZGVzdFN0YXRlID09IE9NWF9TdGF0ZUludmFsaWQpIHsKKyAgICAgICAgZm9yIChpID0gMDsgaSA8IHBTRUNDb21wb25lbnQtPnBvcnRQYXJhbS5uUG9ydHM7IGkrKykgeworICAgICAgICAgICAgcFNFQ0NvbXBvbmVudC0+cFNFQ1BvcnRbaV0ucG9ydFN0YXRlID0gT01YX1N0YXRlSW52YWxpZDsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiBPTVhfRXJyb3JOb25lOworfQorCitzdGF0aWMgT01YX0VSUk9SVFlQRSBTRUNfU2V0UG9ydEZsdXNoKFNFQ19PTVhfQkFTRUNPTVBPTkVOVCAqcFNFQ0NvbXBvbmVudCwgT01YX1UzMiBuUGFyYW0pCit7CisgICAgT01YX0VSUk9SVFlQRSAgICAgcmV0ID0gT01YX0Vycm9yTm9uZTsKKyAgICBTRUNfT01YX0JBU0VQT1JUICpwU0VDUG9ydCA9IE5VTEw7CisgICAgT01YX1MzMiAgICAgICAgICAgcG9ydEluZGV4ID0gblBhcmFtOworICAgIE9NWF9VMTYgICAgICAgICAgIGkgPSAwLCBjbnQgPSAwLCBpbmRleCA9IDA7CisKKworICAgIGlmICgocFNFQ0NvbXBvbmVudC0+Y3VycmVudFN0YXRlID09IE9NWF9TdGF0ZUV4ZWN1dGluZykgfHwKKyAgICAgICAgKHBTRUNDb21wb25lbnQtPmN1cnJlbnRTdGF0ZSA9PSBPTVhfU3RhdGVQYXVzZSkpIHsKKyAgICAgICAgaWYgKChwb3J0SW5kZXggIT0gQUxMX1BPUlRfSU5ERVgpICYmCisgICAgICAgICAgICgoT01YX1MzMilwb3J0SW5kZXggPj0gKE9NWF9TMzIpcFNFQ0NvbXBvbmVudC0+cG9ydFBhcmFtLm5Qb3J0cykpIHsKKyAgICAgICAgICAgIHJldCA9IE9NWF9FcnJvckJhZFBvcnRJbmRleDsKKyAgICAgICAgICAgIGdvdG8gRVhJVDsKKyAgICAgICAgfQorCisgICAgICAgIC8qKioqKioqKioqKioqKioqKioqKioKKyAgICAgICAgKiAgICBuZWVkIGZsdXNoIGV2ZW50IHNldCA/Pz8/PworICAgICAgICAqKioqKioqKioqKioqKioqKioqKioqLworICAgICAgICBjbnQgPSAocG9ydEluZGV4ID09IEFMTF9QT1JUX0lOREVYICkgPyBBTExfUE9SVF9OVU0gOiAxOworICAgICAgICBmb3IgKGkgPSAwOyBpIDwgY250OyBpKyspIHsKKyAgICAgICAgICAgIGlmIChwb3J0SW5kZXggPT0gQUxMX1BPUlRfSU5ERVgpCisgICAgICAgICAgICAgICAgaW5kZXggPSBpOworICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgIGluZGV4ID0gcG9ydEluZGV4OworICAgICAgICAgICAgcFNFQ0NvbXBvbmVudC0+cFNFQ1BvcnRbaW5kZXhdLmJJc1BvcnRGbHVzaGVkID0gT01YX1RSVUU7CisgICAgICAgIH0KKyAgICB9IGVsc2UgeworICAgICAgICByZXQgPSBPTVhfRXJyb3JJbmNvcnJlY3RTdGF0ZU9wZXJhdGlvbjsKKyAgICAgICAgZ290byBFWElUOworICAgIH0KKyAgICByZXQgPSBPTVhfRXJyb3JOb25lOworCitFWElUOgorICAgIHJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBPTVhfRVJST1JUWVBFIFNFQ19TZXRQb3J0RW5hYmxlKFNFQ19PTVhfQkFTRUNPTVBPTkVOVCAqcFNFQ0NvbXBvbmVudCwgT01YX1UzMiBuUGFyYW0pCit7CisgICAgT01YX0VSUk9SVFlQRSAgICAgcmV0ID0gT01YX0Vycm9yTm9uZTsKKyAgICBTRUNfT01YX0JBU0VQT1JUICpwU0VDUG9ydCA9IE5VTEw7CisgICAgT01YX1MzMiAgICAgICAgICAgcG9ydEluZGV4ID0gblBhcmFtOworICAgIE9NWF9VMTYgICAgICAgICAgIGkgPSAwLCBjbnQgPSAwOworCisgICAgRnVuY3Rpb25JbigpOworCisgICAgaWYgKChwb3J0SW5kZXggIT0gQUxMX1BPUlRfSU5ERVgpICYmCisgICAgICAgICgoT01YX1MzMilwb3J0SW5kZXggPj0gKE9NWF9TMzIpcFNFQ0NvbXBvbmVudC0+cG9ydFBhcmFtLm5Qb3J0cykpIHsKKyAgICAgICAgcmV0ID0gT01YX0Vycm9yQmFkUG9ydEluZGV4OworICAgICAgICBnb3RvIEVYSVQ7CisgICAgfQorCisgICAgaWYgKHBvcnRJbmRleCA9PSBBTExfUE9SVF9JTkRFWCkgeworICAgICAgICBmb3IgKGkgPSAwOyBpIDwgcFNFQ0NvbXBvbmVudC0+cG9ydFBhcmFtLm5Qb3J0czsgaSsrKSB7CisgICAgICAgICAgICBwU0VDUG9ydCA9ICZwU0VDQ29tcG9uZW50LT5wU0VDUG9ydFtpXTsKKyAgICAgICAgICAgIGlmIChDSEVDS19QT1JUX0VOQUJMRUQocFNFQ1BvcnQpKSB7CisgICAgICAgICAgICAgICAgcmV0ID0gT01YX0Vycm9ySW5jb3JyZWN0U3RhdGVPcGVyYXRpb247CisgICAgICAgICAgICAgICAgZ290byBFWElUOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBwU0VDUG9ydC0+cG9ydFN0YXRlID0gT01YX1N0YXRlSWRsZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0gZWxzZSB7CisgICAgICAgIHBTRUNQb3J0ID0gJnBTRUNDb21wb25lbnQtPnBTRUNQb3J0W3BvcnRJbmRleF07CisgICAgICAgIGlmIChDSEVDS19QT1JUX0VOQUJMRUQocFNFQ1BvcnQpKSB7CisgICAgICAgICAgICByZXQgPSBPTVhfRXJyb3JJbmNvcnJlY3RTdGF0ZU9wZXJhdGlvbjsKKyAgICAgICAgICAgIGdvdG8gRVhJVDsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHBTRUNQb3J0LT5wb3J0U3RhdGUgPSBPTVhfU3RhdGVJZGxlOworICAgICAgICB9CisgICAgfQorICAgIHJldCA9IE9NWF9FcnJvck5vbmU7CisKK0VYSVQ6CisgICAgRnVuY3Rpb25PdXQoKTsKKworICAgIHJldHVybiByZXQ7CisKK30KKworc3RhdGljIE9NWF9FUlJPUlRZUEUgU0VDX1NldFBvcnREaXNhYmxlKFNFQ19PTVhfQkFTRUNPTVBPTkVOVCAqcFNFQ0NvbXBvbmVudCwgT01YX1UzMiBuUGFyYW0pCit7CisgICAgT01YX0VSUk9SVFlQRSAgICAgcmV0ID0gT01YX0Vycm9yTm9uZTsKKyAgICBTRUNfT01YX0JBU0VQT1JUICpwU0VDUG9ydCA9IE5VTEw7CisgICAgT01YX1MzMiAgICAgICAgICAgcG9ydEluZGV4ID0gblBhcmFtOworICAgIE9NWF9VMTYgICAgICAgICAgIGkgPSAwLCBjbnQgPSAwOworCisgICAgRnVuY3Rpb25JbigpOworCisgICAgaWYgKChwb3J0SW5kZXggIT0gQUxMX1BPUlRfSU5ERVgpICYmCisgICAgICAgICgoT01YX1MzMilwb3J0SW5kZXggPj0gKE9NWF9TMzIpcFNFQ0NvbXBvbmVudC0+cG9ydFBhcmFtLm5Qb3J0cykpIHsKKyAgICAgICAgcmV0ID0gT01YX0Vycm9yQmFkUG9ydEluZGV4OworICAgICAgICBnb3RvIEVYSVQ7CisgICAgfQorCisgICAgaWYgKHBvcnRJbmRleCA9PSBBTExfUE9SVF9JTkRFWCkgeworICAgICAgICBmb3IgKGkgPSAwOyBpIDwgcFNFQ0NvbXBvbmVudC0+cG9ydFBhcmFtLm5Qb3J0czsgaSsrKSB7CisgICAgICAgICAgICBwU0VDUG9ydCA9ICZwU0VDQ29tcG9uZW50LT5wU0VDUG9ydFtpXTsKKyAgICAgICAgICAgIGlmICghQ0hFQ0tfUE9SVF9FTkFCTEVEKHBTRUNQb3J0KSkgeworICAgICAgICAgICAgICAgIHJldCA9IE9NWF9FcnJvckluY29ycmVjdFN0YXRlT3BlcmF0aW9uOworICAgICAgICAgICAgICAgIGdvdG8gRVhJVDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHBTRUNQb3J0LT5wb3J0U3RhdGUgPSBPTVhfU3RhdGVMb2FkZWQ7CisgICAgICAgICAgICBwU0VDUG9ydC0+YklzUG9ydERpc2FibGVkID0gT01YX1RSVUU7CisgICAgICAgIH0KKyAgICB9IGVsc2UgeworICAgICAgICBwU0VDUG9ydCA9ICZwU0VDQ29tcG9uZW50LT5wU0VDUG9ydFtwb3J0SW5kZXhdOworICAgICAgICBwU0VDUG9ydC0+cG9ydFN0YXRlID0gT01YX1N0YXRlTG9hZGVkOworICAgICAgICBwU0VDUG9ydC0+YklzUG9ydERpc2FibGVkID0gT01YX1RSVUU7CisgICAgfQorICAgIHJldCA9IE9NWF9FcnJvck5vbmU7CisKK0VYSVQ6CisgICAgRnVuY3Rpb25PdXQoKTsKKworICAgIHJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBPTVhfRVJST1JUWVBFIFNFQ19TZXRNYXJrQnVmZmVyKFNFQ19PTVhfQkFTRUNPTVBPTkVOVCAqcFNFQ0NvbXBvbmVudCwgT01YX1UzMiBuUGFyYW0pCit7CisgICAgT01YX0VSUk9SVFlQRSAgICAgcmV0ID0gT01YX0Vycm9yTm9uZTsKKyAgICBTRUNfT01YX0JBU0VQT1JUICpwU0VDUG9ydCA9IE5VTEw7CisgICAgT01YX1UzMiAgICAgICAgICAgcG9ydEluZGV4ID0gblBhcmFtOworICAgIE9NWF9VMTYgICAgICAgICAgIGkgPSAwLCBjbnQgPSAwOworCisKKyAgICBpZiAoblBhcmFtID49IHBTRUNDb21wb25lbnQtPnBvcnRQYXJhbS5uUG9ydHMpIHsKKyAgICAgICAgcmV0ID0gT01YX0Vycm9yQmFkUG9ydEluZGV4OworICAgICAgICBnb3RvIEVYSVQ7CisgICAgfQorCisgICAgaWYgKChwU0VDQ29tcG9uZW50LT5jdXJyZW50U3RhdGUgPT0gT01YX1N0YXRlRXhlY3V0aW5nKSB8fAorICAgICAgICAocFNFQ0NvbXBvbmVudC0+Y3VycmVudFN0YXRlID09IE9NWF9TdGF0ZVBhdXNlKSkgeworICAgICAgICByZXQgPSBPTVhfRXJyb3JOb25lOworICAgIH0gZWxzZSB7CisgICAgICAgIHJldCA9IE9NWF9FcnJvckluY29ycmVjdFN0YXRlT3BlcmF0aW9uOworICAgIH0KKworRVhJVDoKKyAgICByZXR1cm4gcmV0OworfQorCitzdGF0aWMgT01YX0VSUk9SVFlQRSBTRUNfT01YX0NvbW1hbmRRdWV1ZSgKKyAgICBTRUNfT01YX0JBU0VDT01QT05FTlQgKnBTRUNDb21wb25lbnQsCisgICAgT01YX0NPTU1BTkRUWVBFICAgICAgICBDbWQsCisgICAgT01YX1UzMiAgICAgICAgICAgICAgICBuUGFyYW0sCisgICAgT01YX1BUUiAgICAgICAgICAgICAgICBwQ21kRGF0YSkKK3sKKyAgICBPTVhfRVJST1JUWVBFICAgIHJldCA9IE9NWF9FcnJvck5vbmU7CisgICAgU0VDX09NWF9NRVNTQUdFICpjb21tYW5kID0gKFNFQ19PTVhfTUVTU0FHRSAqKVNFQ19PU0FMX01hbGxvYyhzaXplb2YoU0VDX09NWF9NRVNTQUdFKSk7CisKKyAgICBpZiAoY29tbWFuZCA9PSBOVUxMKSB7CisgICAgICAgIHJldCA9IE9NWF9FcnJvckluc3VmZmljaWVudFJlc291cmNlczsKKyAgICAgICAgZ290byBFWElUOworICAgIH0KKyAgICBjb21tYW5kLT5tZXNzYWdlVHlwZSAgPSAoT01YX1UzMilDbWQ7CisgICAgY29tbWFuZC0+bWVzc2FnZVBhcmFtID0gblBhcmFtOworICAgIGNvbW1hbmQtPnBDbWREYXRhICAgICA9IHBDbWREYXRhOworCisgICAgcmV0ID0gU0VDX09TQUxfUXVldWUoJnBTRUNDb21wb25lbnQtPm1lc3NhZ2VRLCAodm9pZCAqKWNvbW1hbmQpOworICAgIGlmIChyZXQgIT0gMCkgeworICAgICAgICByZXQgPSBPTVhfRXJyb3JVbmRlZmluZWQ7CisgICAgICAgIGdvdG8gRVhJVDsKKyAgICB9CisgICAgcmV0ID0gU0VDX09TQUxfU2VtYXBob3JlUG9zdChwU0VDQ29tcG9uZW50LT5tc2dTZW1hcGhvcmVIYW5kbGUpOworCitFWElUOgorICAgIHJldHVybiByZXQ7Cit9CisKK09NWF9FUlJPUlRZUEUgU0VDX09NWF9TZW5kQ29tbWFuZCgKKyAgICBPTVhfSU4gT01YX0hBTkRMRVRZUEUgIGhDb21wb25lbnQsCisgICAgT01YX0lOIE9NWF9DT01NQU5EVFlQRSBDbWQsCisgICAgT01YX0lOIE9NWF9VMzIgICAgICAgICBuUGFyYW0sCisgICAgT01YX0lOIE9NWF9QVFIgICAgICAgICBwQ21kRGF0YSkKK3sKKyAgICBPTVhfRVJST1JUWVBFICAgICAgICAgIHJldCA9IE9NWF9FcnJvck5vbmU7CisgICAgT01YX0NPTVBPTkVOVFRZUEUgICAgICpwT01YQ29tcG9uZW50ID0gTlVMTDsKKyAgICBTRUNfT01YX0JBU0VDT01QT05FTlQgKnBTRUNDb21wb25lbnQgPSBOVUxMOworICAgIFNFQ19PTVhfTUVTU0FHRSAgICAgICAqbWVzc2FnZSA9IE5VTEw7CisKKyAgICBGdW5jdGlvbkluKCk7CisKKyAgICBpZiAoaENvbXBvbmVudCA9PSBOVUxMKSB7CisgICAgICAgIHJldCA9IE9NWF9FcnJvckJhZFBhcmFtZXRlcjsKKyAgICAgICAgZ290byBFWElUOworICAgIH0KKyAgICBwT01YQ29tcG9uZW50ID0gKE9NWF9DT01QT05FTlRUWVBFICopaENvbXBvbmVudDsKKyAgICByZXQgPSBTRUNfT01YX0NoZWNrX1NpemVWZXJzaW9uKHBPTVhDb21wb25lbnQsIHNpemVvZihPTVhfQ09NUE9ORU5UVFlQRSkpOworICAgIGlmIChyZXQgIT0gT01YX0Vycm9yTm9uZSkgeworICAgICAgICBnb3RvIEVYSVQ7CisgICAgfQorCisgICAgaWYgKHBPTVhDb21wb25lbnQtPnBDb21wb25lbnRQcml2YXRlID09IE5VTEwpIHsKKyAgICAgICAgcmV0ID0gT01YX0Vycm9yQmFkUGFyYW1ldGVyOworICAgICAgICBnb3RvIEVYSVQ7CisgICAgfQorICAgIHBTRUNDb21wb25lbnQgPSAoU0VDX09NWF9CQVNFQ09NUE9ORU5UICopcE9NWENvbXBvbmVudC0+cENvbXBvbmVudFByaXZhdGU7CisKKyAgICBpZiAocFNFQ0NvbXBvbmVudC0+Y3VycmVudFN0YXRlID09IE9NWF9TdGF0ZUludmFsaWQpIHsKKyAgICAgICAgcmV0ID0gT01YX0Vycm9ySW52YWxpZFN0YXRlOworICAgICAgICBnb3RvIEVYSVQ7CisgICAgfQorCisgICAgc3dpdGNoIChDbWQpIHsKKyAgICBjYXNlIE9NWF9Db21tYW5kU3RhdGVTZXQgOgorICAgICAgICBTRUNfT1NBTF9Mb2coU0VDX0xPR19UUkFDRSwgIkNvbW1hbmQ6IE9NWF9Db21tYW5kU3RhdGVTZXQiKTsKKyAgICAgICAgU0VDX1N0YXRlU2V0KHBTRUNDb21wb25lbnQsIG5QYXJhbSk7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgT01YX0NvbW1hbmRGbHVzaCA6CisgICAgICAgIFNFQ19PU0FMX0xvZyhTRUNfTE9HX1RSQUNFLCAiQ29tbWFuZDogT01YX0NvbW1hbmRGbHVzaCIpOworICAgICAgICByZXQgPSBTRUNfU2V0UG9ydEZsdXNoKHBTRUNDb21wb25lbnQsIG5QYXJhbSk7CisgICAgICAgIGlmIChyZXQgIT0gT01YX0Vycm9yTm9uZSkKKyAgICAgICAgICAgIGdvdG8gRVhJVDsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBPTVhfQ29tbWFuZFBvcnREaXNhYmxlIDoKKyAgICAgICAgU0VDX09TQUxfTG9nKFNFQ19MT0dfVFJBQ0UsICJDb21tYW5kOiBPTVhfQ29tbWFuZFBvcnREaXNhYmxlIik7CisgICAgICAgIHJldCA9IFNFQ19TZXRQb3J0RGlzYWJsZShwU0VDQ29tcG9uZW50LCBuUGFyYW0pOworICAgICAgICBpZiAocmV0ICE9IE9NWF9FcnJvck5vbmUpCisgICAgICAgICAgICBnb3RvIEVYSVQ7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgT01YX0NvbW1hbmRQb3J0RW5hYmxlIDoKKyAgICAgICAgU0VDX09TQUxfTG9nKFNFQ19MT0dfVFJBQ0UsICJDb21tYW5kOiBPTVhfQ29tbWFuZFBvcnRFbmFibGUiKTsKKyAgICAgICAgcmV0ID0gU0VDX1NldFBvcnRFbmFibGUocFNFQ0NvbXBvbmVudCwgblBhcmFtKTsKKyAgICAgICAgaWYgKHJldCAhPSBPTVhfRXJyb3JOb25lKQorICAgICAgICAgICAgZ290byBFWElUOworICAgICAgICBicmVhazsKKyAgICBjYXNlIE9NWF9Db21tYW5kTWFya0J1ZmZlciA6CisgICAgICAgIFNFQ19PU0FMX0xvZyhTRUNfTE9HX1RSQUNFLCAiQ29tbWFuZDogT01YX0NvbW1hbmRNYXJrQnVmZmVyIik7CisgICAgICAgIHJldCA9IFNFQ19TZXRNYXJrQnVmZmVyKHBTRUNDb21wb25lbnQsIG5QYXJhbSk7CisgICAgICAgIGlmIChyZXQgIT0gT01YX0Vycm9yTm9uZSkKKyAgICAgICAgICAgIGdvdG8gRVhJVDsKKyAgICAgICAgYnJlYWs7CisvKgorICAgIGNhc2UgU0VDX0NvbW1hbmRGaWxsQnVmZmVyIDoKKyAgICBjYXNlIFNFQ19Db21tYW5kRW1wdHlCdWZmZXIgOgorICAgIGNhc2UgU0VDX0NvbW1hbmREZUluaXQgOgorKi8KKyAgICBkZWZhdWx0OgorICAgICAgICBicmVhazsKKyAgICB9CisKKyAgICByZXQgPSBTRUNfT01YX0NvbW1hbmRRdWV1ZShwU0VDQ29tcG9uZW50LCBDbWQsIG5QYXJhbSwgcENtZERhdGEpOworCitFWElUOgorICAgIEZ1bmN0aW9uT3V0KCk7CisKKyAgICByZXR1cm4gcmV0OworfQorCitPTVhfRVJST1JUWVBFIFNFQ19PTVhfR2V0UGFyYW1ldGVyKAorICAgIE9NWF9JTiBPTVhfSEFORExFVFlQRSBoQ29tcG9uZW50LAorICAgIE9NWF9JTiBPTVhfSU5ERVhUWVBFICBuUGFyYW1JbmRleCwKKyAgICBPTVhfSU5PVVQgT01YX1BUUiAgICAgQ29tcG9uZW50UGFyYW1ldGVyU3RydWN0dXJlKQoreworICAgIE9NWF9FUlJPUlRZUEUgICAgICAgICAgcmV0ID0gT01YX0Vycm9yTm9uZTsKKyAgICBPTVhfQ09NUE9ORU5UVFlQRSAgICAgKnBPTVhDb21wb25lbnQgPSBOVUxMOworICAgIFNFQ19PTVhfQkFTRUNPTVBPTkVOVCAqcFNFQ0NvbXBvbmVudCA9IE5VTEw7CisKKyAgICBGdW5jdGlvbkluKCk7CisKKyAgICBpZiAoaENvbXBvbmVudCA9PSBOVUxMKSB7CisgICAgICAgIHJldCA9IE9NWF9FcnJvckJhZFBhcmFtZXRlcjsKKyAgICAgICAgZ290byBFWElUOworICAgIH0KKyAgICBwT01YQ29tcG9uZW50ID0gKE9NWF9DT01QT05FTlRUWVBFICopaENvbXBvbmVudDsKKyAgICByZXQgPSBTRUNfT01YX0NoZWNrX1NpemVWZXJzaW9uKHBPTVhDb21wb25lbnQsIHNpemVvZihPTVhfQ09NUE9ORU5UVFlQRSkpOworICAgIGlmIChyZXQgIT0gT01YX0Vycm9yTm9uZSkgeworICAgICAgICBnb3RvIEVYSVQ7CisgICAgfQorCisgICAgaWYgKHBPTVhDb21wb25lbnQtPnBDb21wb25lbnRQcml2YXRlID09IE5VTEwpIHsKKyAgICAgICAgcmV0ID0gT01YX0Vycm9yQmFkUGFyYW1ldGVyOworICAgICAgICBnb3RvIEVYSVQ7CisgICAgfQorICAgIHBTRUNDb21wb25lbnQgPSAoU0VDX09NWF9CQVNFQ09NUE9ORU5UICopcE9NWENvbXBvbmVudC0+cENvbXBvbmVudFByaXZhdGU7CisKKyAgICBpZiAoQ29tcG9uZW50UGFyYW1ldGVyU3RydWN0dXJlID09IE5VTEwpIHsKKyAgICAgICAgcmV0ID0gT01YX0Vycm9yQmFkUGFyYW1ldGVyOworICAgICAgICBnb3RvIEVYSVQ7CisgICAgfQorICAgIGlmIChwU0VDQ29tcG9uZW50LT5jdXJyZW50U3RhdGUgPT0gT01YX1N0YXRlSW52YWxpZCkgeworICAgICAgICByZXQgPSBPTVhfRXJyb3JJbnZhbGlkU3RhdGU7CisgICAgICAgIGdvdG8gRVhJVDsKKyAgICB9CisKKyAgICBzd2l0Y2ggKG5QYXJhbUluZGV4KSB7CisgICAgY2FzZSAoT01YX0lOREVYVFlQRSlPTVhfQ09NUE9ORU5UX0NBUEFCSUxJVFlfVFlQRV9JTkRFWDoKKyAgICB7CisgICAgICAgIC8qIEZvciBBbmRyb2lkIFBWIE9wZW5DT1JFICovCisgICAgICAgIE9NWENvbXBvbmVudENhcGFiaWxpdHlGbGFnc1R5cGUgKmNhcGFiaWxpdHlGbGFncyA9IChPTVhDb21wb25lbnRDYXBhYmlsaXR5RmxhZ3NUeXBlICopQ29tcG9uZW50UGFyYW1ldGVyU3RydWN0dXJlOworICAgICAgICBTRUNfT1NBTF9NZW1jcHkoY2FwYWJpbGl0eUZsYWdzLCAmcFNFQ0NvbXBvbmVudC0+Y2FwYWJpbGl0eUZsYWdzLCBzaXplb2YoT01YQ29tcG9uZW50Q2FwYWJpbGl0eUZsYWdzVHlwZSkpOworICAgIH0KKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBPTVhfSW5kZXhQYXJhbUF1ZGlvSW5pdDoKKyAgICBjYXNlIE9NWF9JbmRleFBhcmFtVmlkZW9Jbml0OgorICAgIGNhc2UgT01YX0luZGV4UGFyYW1JbWFnZUluaXQ6CisgICAgY2FzZSBPTVhfSW5kZXhQYXJhbU90aGVySW5pdDoKKyAgICB7CisgICAgICAgIE9NWF9QT1JUX1BBUkFNX1RZUEUgKnBvcnRQYXJhbSA9IChPTVhfUE9SVF9QQVJBTV9UWVBFICopQ29tcG9uZW50UGFyYW1ldGVyU3RydWN0dXJlOworICAgICAgICByZXQgPSBTRUNfT01YX0NoZWNrX1NpemVWZXJzaW9uKHBvcnRQYXJhbSwgc2l6ZW9mKE9NWF9QT1JUX1BBUkFNX1RZUEUpKTsKKyAgICAgICAgaWYgKHJldCAhPSBPTVhfRXJyb3JOb25lKSB7CisgICAgICAgICAgICBnb3RvIEVYSVQ7CisgICAgICAgIH0KKyAgICAgICAgcG9ydFBhcmFtLT5uUG9ydHMgICAgICAgICA9IDA7CisgICAgICAgIHBvcnRQYXJhbS0+blN0YXJ0UG9ydE51bWJlciAgICAgPSAwOworICAgIH0KKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBPTVhfSW5kZXhQYXJhbVBvcnREZWZpbml0aW9uOgorICAgIHsKKyAgICAgICAgT01YX1BBUkFNX1BPUlRERUZJTklUSU9OVFlQRSAqcG9ydERlZmluaXRpb24gPSAoT01YX1BBUkFNX1BPUlRERUZJTklUSU9OVFlQRSAqKUNvbXBvbmVudFBhcmFtZXRlclN0cnVjdHVyZTsKKyAgICAgICAgT01YX1UzMiAgICAgICAgICAgICAgICAgICAgICAgcG9ydEluZGV4ID0gcG9ydERlZmluaXRpb24tPm5Qb3J0SW5kZXg7CisgICAgICAgIFNFQ19PTVhfQkFTRVBPUlQgICAgICAgICAgICAgKnBTRUNQb3J0OworCisgICAgICAgIGlmIChwb3J0SW5kZXggPj0gcFNFQ0NvbXBvbmVudC0+cG9ydFBhcmFtLm5Qb3J0cykgeworICAgICAgICAgICAgcmV0ID0gT01YX0Vycm9yQmFkUG9ydEluZGV4OworICAgICAgICAgICAgZ290byBFWElUOworICAgICAgICB9CisgICAgICAgIHJldCA9IFNFQ19PTVhfQ2hlY2tfU2l6ZVZlcnNpb24ocG9ydERlZmluaXRpb24sIHNpemVvZihPTVhfUEFSQU1fUE9SVERFRklOSVRJT05UWVBFKSk7CisgICAgICAgIGlmIChyZXQgIT0gT01YX0Vycm9yTm9uZSkgeworICAgICAgICAgICAgZ290byBFWElUOworICAgICAgICB9CisKKyAgICAgICAgcFNFQ1BvcnQgPSAmcFNFQ0NvbXBvbmVudC0+cFNFQ1BvcnRbcG9ydEluZGV4XTsKKyAgICAgICAgU0VDX09TQUxfTWVtY3B5KHBvcnREZWZpbml0aW9uLCAmcFNFQ1BvcnQtPnBvcnREZWZpbml0aW9uLCBwb3J0RGVmaW5pdGlvbi0+blNpemUpOworICAgIH0KKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBPTVhfSW5kZXhQYXJhbVByaW9yaXR5TWdtdDoKKyAgICB7CisgICAgICAgIE9NWF9QUklPUklUWU1HTVRUWVBFICpjb21wUHJpb3JpdHkgPSAoT01YX1BSSU9SSVRZTUdNVFRZUEUgKilDb21wb25lbnRQYXJhbWV0ZXJTdHJ1Y3R1cmU7CisKKyAgICAgICAgcmV0ID0gU0VDX09NWF9DaGVja19TaXplVmVyc2lvbihjb21wUHJpb3JpdHksIHNpemVvZihPTVhfUFJJT1JJVFlNR01UVFlQRSkpOworICAgICAgICBpZiAocmV0ICE9IE9NWF9FcnJvck5vbmUpIHsKKyAgICAgICAgICAgIGdvdG8gRVhJVDsKKyAgICAgICAgfQorCisgICAgICAgIGNvbXBQcmlvcml0eS0+bkdyb3VwSUQgICAgICAgPSBwU0VDQ29tcG9uZW50LT5jb21wUHJpb3JpdHkubkdyb3VwSUQ7CisgICAgICAgIGNvbXBQcmlvcml0eS0+bkdyb3VwUHJpb3JpdHkgPSBwU0VDQ29tcG9uZW50LT5jb21wUHJpb3JpdHkubkdyb3VwUHJpb3JpdHk7CisgICAgfQorICAgICAgICBicmVhazsKKworICAgIGNhc2UgT01YX0luZGV4UGFyYW1Db21wQnVmZmVyU3VwcGxpZXI6CisgICAgeworICAgICAgICBPTVhfUEFSQU1fQlVGRkVSU1VQUExJRVJUWVBFICpidWZmZXJTdXBwbGllciA9IChPTVhfUEFSQU1fQlVGRkVSU1VQUExJRVJUWVBFICopQ29tcG9uZW50UGFyYW1ldGVyU3RydWN0dXJlOworICAgICAgICBPTVhfVTMyICAgICAgICAgICAgICAgICAgICAgICBwb3J0SW5kZXggPSBidWZmZXJTdXBwbGllci0+blBvcnRJbmRleDsKKyAgICAgICAgU0VDX09NWF9CQVNFUE9SVCAgICAgICAgICAgICAqcFNFQ1BvcnQ7CisKKyAgICAgICAgaWYgKChwU0VDQ29tcG9uZW50LT5jdXJyZW50U3RhdGUgPT0gT01YX1N0YXRlTG9hZGVkKSB8fAorICAgICAgICAgICAgKHBTRUNDb21wb25lbnQtPmN1cnJlbnRTdGF0ZSA9PSBPTVhfU3RhdGVXYWl0Rm9yUmVzb3VyY2VzKSkgeworICAgICAgICAgICAgaWYgKHBvcnRJbmRleCA+PSBwU0VDQ29tcG9uZW50LT5wb3J0UGFyYW0ublBvcnRzKSB7CisgICAgICAgICAgICAgICAgcmV0ID0gT01YX0Vycm9yQmFkUG9ydEluZGV4OworICAgICAgICAgICAgICAgIGdvdG8gRVhJVDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJldCA9IFNFQ19PTVhfQ2hlY2tfU2l6ZVZlcnNpb24oYnVmZmVyU3VwcGxpZXIsIHNpemVvZihPTVhfUEFSQU1fQlVGRkVSU1VQUExJRVJUWVBFKSk7CisgICAgICAgICAgICBpZiAocmV0ICE9IE9NWF9FcnJvck5vbmUpIHsKKyAgICAgICAgICAgICAgICBnb3RvIEVYSVQ7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHBTRUNQb3J0ID0gJnBTRUNDb21wb25lbnQtPnBTRUNQb3J0W3BvcnRJbmRleF07CisKKworICAgICAgICAgICAgaWYgKHBTRUNQb3J0LT5wb3J0RGVmaW5pdGlvbi5lRGlyID09IE9NWF9EaXJJbnB1dCkgeworICAgICAgICAgICAgICAgIGlmIChDSEVDS19QT1JUX0JVRkZFUl9TVVBQTElFUihwU0VDUG9ydCkpIHsKKyAgICAgICAgICAgICAgICAgICAgYnVmZmVyU3VwcGxpZXItPmVCdWZmZXJTdXBwbGllciA9IE9NWF9CdWZmZXJTdXBwbHlJbnB1dDsKKyAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKENIRUNLX1BPUlRfVFVOTkVMRUQocFNFQ1BvcnQpKSB7CisgICAgICAgICAgICAgICAgICAgIGJ1ZmZlclN1cHBsaWVyLT5lQnVmZmVyU3VwcGxpZXIgPSBPTVhfQnVmZmVyU3VwcGx5T3V0cHV0OworICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIGJ1ZmZlclN1cHBsaWVyLT5lQnVmZmVyU3VwcGxpZXIgPSBPTVhfQnVmZmVyU3VwcGx5VW5zcGVjaWZpZWQ7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBpZiAoQ0hFQ0tfUE9SVF9CVUZGRVJfU1VQUExJRVIocFNFQ1BvcnQpKSB7CisgICAgICAgICAgICAgICAgICAgIGJ1ZmZlclN1cHBsaWVyLT5lQnVmZmVyU3VwcGxpZXIgPSBPTVhfQnVmZmVyU3VwcGx5T3V0cHV0OworICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoQ0hFQ0tfUE9SVF9UVU5ORUxFRChwU0VDUG9ydCkpIHsKKyAgICAgICAgICAgICAgICAgICAgYnVmZmVyU3VwcGxpZXItPmVCdWZmZXJTdXBwbGllciA9IE9NWF9CdWZmZXJTdXBwbHlJbnB1dDsKKyAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICBidWZmZXJTdXBwbGllci0+ZUJ1ZmZlclN1cHBsaWVyID0gT01YX0J1ZmZlclN1cHBseVVuc3BlY2lmaWVkOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldCA9IE9NWF9FcnJvckluY29ycmVjdFN0YXRlT3BlcmF0aW9uOworICAgICAgICAgICAgZ290byBFWElUOworICAgICAgICB9CisgICAgfQorICAgICAgICBicmVhazsKKyAgICBkZWZhdWx0OgorICAgIHsKKyAgICAgICAgcmV0ID0gT01YX0Vycm9yVW5zdXBwb3J0ZWRJbmRleDsKKyAgICAgICAgZ290byBFWElUOworICAgIH0KKyAgICAgICAgYnJlYWs7CisgICAgfQorCisgICAgcmV0ID0gT01YX0Vycm9yTm9uZTsKKworRVhJVDoKKworICAgIEZ1bmN0aW9uT3V0KCk7CisKKyAgICByZXR1cm4gcmV0OworfQorCitPTVhfRVJST1JUWVBFIFNFQ19PTVhfU2V0UGFyYW1ldGVyKAorICAgIE9NWF9JTiBPTVhfSEFORExFVFlQRSBoQ29tcG9uZW50LAorICAgIE9NWF9JTiBPTVhfSU5ERVhUWVBFICBuSW5kZXgsCisgICAgT01YX0lOIE9NWF9QVFIgICAgICAgIENvbXBvbmVudFBhcmFtZXRlclN0cnVjdHVyZSkKK3sKKyAgICBPTVhfRVJST1JUWVBFICAgICAgICAgIHJldCA9IE9NWF9FcnJvck5vbmU7CisgICAgT01YX0NPTVBPTkVOVFRZUEUgICAgICpwT01YQ29tcG9uZW50ID0gTlVMTDsKKyAgICBTRUNfT01YX0JBU0VDT01QT05FTlQgKnBTRUNDb21wb25lbnQgPSBOVUxMOworCisgICAgRnVuY3Rpb25JbigpOworCisgICAgaWYgKGhDb21wb25lbnQgPT0gTlVMTCkgeworICAgICAgICByZXQgPSBPTVhfRXJyb3JCYWRQYXJhbWV0ZXI7CisgICAgICAgIGdvdG8gRVhJVDsKKyAgICB9CisgICAgcE9NWENvbXBvbmVudCA9IChPTVhfQ09NUE9ORU5UVFlQRSAqKWhDb21wb25lbnQ7CisgICAgcmV0ID0gU0VDX09NWF9DaGVja19TaXplVmVyc2lvbihwT01YQ29tcG9uZW50LCBzaXplb2YoT01YX0NPTVBPTkVOVFRZUEUpKTsKKyAgICBpZiAocmV0ICE9IE9NWF9FcnJvck5vbmUpIHsKKyAgICAgICAgZ290byBFWElUOworICAgIH0KKworICAgIGlmIChwT01YQ29tcG9uZW50LT5wQ29tcG9uZW50UHJpdmF0ZSA9PSBOVUxMKSB7CisgICAgICAgIHJldCA9IE9NWF9FcnJvckJhZFBhcmFtZXRlcjsKKyAgICAgICAgZ290byBFWElUOworICAgIH0KKyAgICBwU0VDQ29tcG9uZW50ID0gKFNFQ19PTVhfQkFTRUNPTVBPTkVOVCAqKXBPTVhDb21wb25lbnQtPnBDb21wb25lbnRQcml2YXRlOworCisgICAgaWYgKENvbXBvbmVudFBhcmFtZXRlclN0cnVjdHVyZSA9PSBOVUxMKSB7CisgICAgICAgIHJldCA9IE9NWF9FcnJvckJhZFBhcmFtZXRlcjsKKyAgICAgICAgZ290byBFWElUOworICAgIH0KKyAgICBpZiAocFNFQ0NvbXBvbmVudC0+Y3VycmVudFN0YXRlID09IE9NWF9TdGF0ZUludmFsaWQpIHsKKyAgICAgICAgcmV0ID0gT01YX0Vycm9ySW52YWxpZFN0YXRlOworICAgICAgICBnb3RvIEVYSVQ7CisgICAgfQorCisgICAgc3dpdGNoIChuSW5kZXgpIHsKKyAgICBjYXNlIE9NWF9JbmRleFBhcmFtQXVkaW9Jbml0OgorICAgIGNhc2UgT01YX0luZGV4UGFyYW1WaWRlb0luaXQ6CisgICAgY2FzZSBPTVhfSW5kZXhQYXJhbUltYWdlSW5pdDoKKyAgICBjYXNlIE9NWF9JbmRleFBhcmFtT3RoZXJJbml0OgorICAgIHsKKyAgICAgICAgT01YX1BPUlRfUEFSQU1fVFlQRSAqcG9ydFBhcmFtID0gKE9NWF9QT1JUX1BBUkFNX1RZUEUgKilDb21wb25lbnRQYXJhbWV0ZXJTdHJ1Y3R1cmU7CisgICAgICAgIHJldCA9IFNFQ19PTVhfQ2hlY2tfU2l6ZVZlcnNpb24ocG9ydFBhcmFtLCBzaXplb2YoT01YX1BPUlRfUEFSQU1fVFlQRSkpOworICAgICAgICBpZiAocmV0ICE9IE9NWF9FcnJvck5vbmUpIHsKKyAgICAgICAgICAgIGdvdG8gRVhJVDsKKyAgICAgICAgfQorCisgICAgICAgIGlmICgocFNFQ0NvbXBvbmVudC0+Y3VycmVudFN0YXRlICE9IE9NWF9TdGF0ZUxvYWRlZCkgJiYKKyAgICAgICAgICAgIChwU0VDQ29tcG9uZW50LT5jdXJyZW50U3RhdGUgIT0gT01YX1N0YXRlV2FpdEZvclJlc291cmNlcykpIHsKKyAgICAgICAgICAgIHJldCA9IE9NWF9FcnJvckluY29ycmVjdFN0YXRlT3BlcmF0aW9uOworICAgICAgICAgICAgZ290byBFWElUOworICAgICAgICB9CisgICAgICAgIHJldCA9IE9NWF9FcnJvclVuZGVmaW5lZDsKKyAgICAgICAgLyogU0VDX09TQUxfTWVtY3B5KCZwU0VDQ29tcG9uZW50LT5wb3J0UGFyYW0sIHBvcnRQYXJhbSwgc2l6ZW9mKE9NWF9QT1JUX1BBUkFNX1RZUEUpKTsgKi8KKyAgICB9CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgT01YX0luZGV4UGFyYW1Qb3J0RGVmaW5pdGlvbjoKKyAgICB7CisgICAgICAgIE9NWF9QQVJBTV9QT1JUREVGSU5JVElPTlRZUEUgKnBvcnREZWZpbml0aW9uID0gKE9NWF9QQVJBTV9QT1JUREVGSU5JVElPTlRZUEUgKilDb21wb25lbnRQYXJhbWV0ZXJTdHJ1Y3R1cmU7CisgICAgICAgIE9NWF9VMzIgICAgICAgICAgICAgICBwb3J0SW5kZXggPSBwb3J0RGVmaW5pdGlvbi0+blBvcnRJbmRleDsKKyAgICAgICAgU0VDX09NWF9CQVNFUE9SVCAgICAgICAgICpwU0VDUG9ydDsKKworICAgICAgICBpZiAocG9ydEluZGV4ID49IHBTRUNDb21wb25lbnQtPnBvcnRQYXJhbS5uUG9ydHMpIHsKKyAgICAgICAgICAgIHJldCA9IE9NWF9FcnJvckJhZFBvcnRJbmRleDsKKyAgICAgICAgICAgIGdvdG8gRVhJVDsKKyAgICAgICAgfQorICAgICAgICByZXQgPSBTRUNfT01YX0NoZWNrX1NpemVWZXJzaW9uKHBvcnREZWZpbml0aW9uLCBzaXplb2YoT01YX1BBUkFNX1BPUlRERUZJTklUSU9OVFlQRSkpOworICAgICAgICBpZiAocmV0ICE9IE9NWF9FcnJvck5vbmUpIHsKKyAgICAgICAgICAgIGdvdG8gRVhJVDsKKyAgICAgICAgfQorCisgICAgICAgIHBTRUNQb3J0ID0gJnBTRUNDb21wb25lbnQtPnBTRUNQb3J0W3BvcnRJbmRleF07CisKKyAgICAgICAgaWYgKChwU0VDQ29tcG9uZW50LT5jdXJyZW50U3RhdGUgIT0gT01YX1N0YXRlTG9hZGVkKSAmJiAocFNFQ0NvbXBvbmVudC0+Y3VycmVudFN0YXRlICE9IE9NWF9TdGF0ZVdhaXRGb3JSZXNvdXJjZXMpKSB7CisgICAgICAgICAgICBpZiAocFNFQ1BvcnQtPnBvcnREZWZpbml0aW9uLmJFbmFibGVkID09IE9NWF9UUlVFKSB7CisgICAgICAgICAgICAgICAgcmV0ID0gT01YX0Vycm9ySW5jb3JyZWN0U3RhdGVPcGVyYXRpb247CisgICAgICAgICAgICAgICAgZ290byBFWElUOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGlmIChwb3J0RGVmaW5pdGlvbi0+bkJ1ZmZlckNvdW50QWN0dWFsIDwgcFNFQ1BvcnQtPnBvcnREZWZpbml0aW9uLm5CdWZmZXJDb3VudE1pbikgeworICAgICAgICAgICAgcmV0ID0gT01YX0Vycm9yQmFkUGFyYW1ldGVyOworICAgICAgICAgICAgZ290byBFWElUOworICAgICAgICB9CisKKyAgICAgICAgU0VDX09TQUxfTWVtY3B5KCZwU0VDUG9ydC0+cG9ydERlZmluaXRpb24sIHBvcnREZWZpbml0aW9uLCBwb3J0RGVmaW5pdGlvbi0+blNpemUpOworICAgIH0KKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBPTVhfSW5kZXhQYXJhbVByaW9yaXR5TWdtdDoKKyAgICB7CisgICAgICAgIE9NWF9QUklPUklUWU1HTVRUWVBFICpjb21wUHJpb3JpdHkgPSAoT01YX1BSSU9SSVRZTUdNVFRZUEUgKilDb21wb25lbnRQYXJhbWV0ZXJTdHJ1Y3R1cmU7CisKKyAgICAgICAgaWYgKChwU0VDQ29tcG9uZW50LT5jdXJyZW50U3RhdGUgIT0gT01YX1N0YXRlTG9hZGVkKSAmJgorICAgICAgICAgICAgKHBTRUNDb21wb25lbnQtPmN1cnJlbnRTdGF0ZSAhPSBPTVhfU3RhdGVXYWl0Rm9yUmVzb3VyY2VzKSkgeworICAgICAgICAgICAgcmV0ID0gT01YX0Vycm9ySW5jb3JyZWN0U3RhdGVPcGVyYXRpb247CisgICAgICAgICAgICBnb3RvIEVYSVQ7CisgICAgICAgIH0KKworICAgICAgICByZXQgPSBTRUNfT01YX0NoZWNrX1NpemVWZXJzaW9uKGNvbXBQcmlvcml0eSwgc2l6ZW9mKE9NWF9QUklPUklUWU1HTVRUWVBFKSk7CisgICAgICAgIGlmIChyZXQgIT0gT01YX0Vycm9yTm9uZSkgeworICAgICAgICAgICAgZ290byBFWElUOworICAgICAgICB9CisKKyAgICAgICAgcFNFQ0NvbXBvbmVudC0+Y29tcFByaW9yaXR5Lm5Hcm91cElEID0gY29tcFByaW9yaXR5LT5uR3JvdXBJRDsKKyAgICAgICAgcFNFQ0NvbXBvbmVudC0+Y29tcFByaW9yaXR5Lm5Hcm91cFByaW9yaXR5ID0gY29tcFByaW9yaXR5LT5uR3JvdXBQcmlvcml0eTsKKyAgICB9CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgT01YX0luZGV4UGFyYW1Db21wQnVmZmVyU3VwcGxpZXI6CisgICAgeworICAgICAgICBPTVhfUEFSQU1fQlVGRkVSU1VQUExJRVJUWVBFICpidWZmZXJTdXBwbGllciA9IChPTVhfUEFSQU1fQlVGRkVSU1VQUExJRVJUWVBFICopQ29tcG9uZW50UGFyYW1ldGVyU3RydWN0dXJlOworICAgICAgICBPTVhfVTMyICAgICAgICAgICBwb3J0SW5kZXggPSBidWZmZXJTdXBwbGllci0+blBvcnRJbmRleDsKKyAgICAgICAgU0VDX09NWF9CQVNFUE9SVCAqcFNFQ1BvcnQgPSBOVUxMOworCisKKyAgICAgICAgaWYgKHBvcnRJbmRleCA+PSBwU0VDQ29tcG9uZW50LT5wb3J0UGFyYW0ublBvcnRzKSB7CisgICAgICAgICAgICByZXQgPSBPTVhfRXJyb3JCYWRQb3J0SW5kZXg7CisgICAgICAgICAgICBnb3RvIEVYSVQ7CisgICAgICAgIH0KKyAgICAgICAgcmV0ID0gU0VDX09NWF9DaGVja19TaXplVmVyc2lvbihidWZmZXJTdXBwbGllciwgc2l6ZW9mKE9NWF9QQVJBTV9CVUZGRVJTVVBQTElFUlRZUEUpKTsKKyAgICAgICAgaWYgKHJldCAhPSBPTVhfRXJyb3JOb25lKSB7CisgICAgICAgICAgICBnb3RvIEVYSVQ7CisgICAgICAgIH0KKworICAgICAgICBwU0VDUG9ydCA9ICZwU0VDQ29tcG9uZW50LT5wU0VDUG9ydFtwb3J0SW5kZXhdOworICAgICAgICBpZiAoKHBTRUNDb21wb25lbnQtPmN1cnJlbnRTdGF0ZSAhPSBPTVhfU3RhdGVMb2FkZWQpICYmIChwU0VDQ29tcG9uZW50LT5jdXJyZW50U3RhdGUgIT0gT01YX1N0YXRlV2FpdEZvclJlc291cmNlcykpIHsKKyAgICAgICAgICAgIGlmIChwU0VDUG9ydC0+cG9ydERlZmluaXRpb24uYkVuYWJsZWQgPT0gT01YX1RSVUUpIHsKKyAgICAgICAgICAgICAgICByZXQgPSBPTVhfRXJyb3JJbmNvcnJlY3RTdGF0ZU9wZXJhdGlvbjsKKyAgICAgICAgICAgICAgICBnb3RvIEVYSVQ7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBpZiAoYnVmZmVyU3VwcGxpZXItPmVCdWZmZXJTdXBwbGllciA9PSBPTVhfQnVmZmVyU3VwcGx5VW5zcGVjaWZpZWQpIHsKKyAgICAgICAgICAgIHJldCA9IE9NWF9FcnJvck5vbmU7CisgICAgICAgICAgICBnb3RvIEVYSVQ7CisgICAgICAgIH0KKyAgICAgICAgaWYgKENIRUNLX1BPUlRfVFVOTkVMRUQocFNFQ1BvcnQpID09IDApIHsKKyAgICAgICAgICAgIHJldCA9IE9NWF9FcnJvck5vbmU7IC8qT01YX0Vycm9yTm9uZSA/Pz8/PyovCisgICAgICAgICAgICBnb3RvIEVYSVQ7CisgICAgICAgIH0KKworICAgICAgICBpZiAocFNFQ1BvcnQtPnBvcnREZWZpbml0aW9uLmVEaXIgPT0gT01YX0RpcklucHV0KSB7CisgICAgICAgICAgICBpZiAoYnVmZmVyU3VwcGxpZXItPmVCdWZmZXJTdXBwbGllciA9PSBPTVhfQnVmZmVyU3VwcGx5SW5wdXQpIHsKKyAgICAgICAgICAgICAgICAvKgorICAgICAgICAgICAgICAgIGlmIChDSEVDS19QT1JUX0JVRkZFUl9TVVBQTElFUihwU0VDUG9ydCkpIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0ID0gT01YX0Vycm9yTm9uZTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgKi8KKyAgICAgICAgICAgICAgICBwU0VDUG9ydC0+dHVubmVsRmxhZ3MgfD0gU0VDX1RVTk5FTF9JU19TVVBQTElFUjsKKyAgICAgICAgICAgICAgICBidWZmZXJTdXBwbGllci0+blBvcnRJbmRleCA9IHBTRUNQb3J0LT50dW5uZWxlZFBvcnQ7CisgICAgICAgICAgICAgICAgcmV0ID0gT01YX1NldFBhcmFtZXRlcihwU0VDUG9ydC0+dHVubmVsZWRDb21wb25lbnQsIE9NWF9JbmRleFBhcmFtQ29tcEJ1ZmZlclN1cHBsaWVyLCBidWZmZXJTdXBwbGllcik7CisgICAgICAgICAgICAgICAgZ290byBFWElUOworICAgICAgICAgICAgfSBlbHNlIGlmIChidWZmZXJTdXBwbGllci0+ZUJ1ZmZlclN1cHBsaWVyID09IE9NWF9CdWZmZXJTdXBwbHlPdXRwdXQpIHsKKyAgICAgICAgICAgICAgICByZXQgPSBPTVhfRXJyb3JOb25lOworICAgICAgICAgICAgICAgIGlmIChDSEVDS19QT1JUX0JVRkZFUl9TVVBQTElFUihwU0VDUG9ydCkpIHsKKyAgICAgICAgICAgICAgICAgICAgcFNFQ1BvcnQtPnR1bm5lbEZsYWdzICY9IH5TRUNfVFVOTkVMX0lTX1NVUFBMSUVSOworICAgICAgICAgICAgICAgICAgICBidWZmZXJTdXBwbGllci0+blBvcnRJbmRleCA9IHBTRUNQb3J0LT50dW5uZWxlZFBvcnQ7CisgICAgICAgICAgICAgICAgICAgIHJldCA9IE9NWF9TZXRQYXJhbWV0ZXIocFNFQ1BvcnQtPnR1bm5lbGVkQ29tcG9uZW50LCBPTVhfSW5kZXhQYXJhbUNvbXBCdWZmZXJTdXBwbGllciwgYnVmZmVyU3VwcGxpZXIpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBnb3RvIEVYSVQ7CisgICAgICAgICAgICB9CisgICAgICAgIH0gZWxzZSBpZiAocFNFQ1BvcnQtPnBvcnREZWZpbml0aW9uLmVEaXIgPT0gT01YX0Rpck91dHB1dCkgeworICAgICAgICAgICAgaWYgKGJ1ZmZlclN1cHBsaWVyLT5lQnVmZmVyU3VwcGxpZXIgPT0gT01YX0J1ZmZlclN1cHBseUlucHV0KSB7CisgICAgICAgICAgICAgICAgcmV0ID0gT01YX0Vycm9yTm9uZTsKKyAgICAgICAgICAgICAgICBpZiAoQ0hFQ0tfUE9SVF9CVUZGRVJfU1VQUExJRVIocFNFQ1BvcnQpKSB7CisgICAgICAgICAgICAgICAgICAgIHBTRUNQb3J0LT50dW5uZWxGbGFncyAmPSB+U0VDX1RVTk5FTF9JU19TVVBQTElFUjsKKyAgICAgICAgICAgICAgICAgICAgcmV0ID0gT01YX0Vycm9yTm9uZTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZ290byBFWElUOworICAgICAgICAgICAgfSBlbHNlIGlmIChidWZmZXJTdXBwbGllci0+ZUJ1ZmZlclN1cHBsaWVyID09IE9NWF9CdWZmZXJTdXBwbHlPdXRwdXQpIHsKKyAgICAgICAgICAgICAgICAvKgorICAgICAgICAgICAgICAgIGlmIChDSEVDS19QT1JUX0JVRkZFUl9TVVBQTElFUihwU0VDUG9ydCkpIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0ID0gT01YX0Vycm9yTm9uZTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgKi8KKyAgICAgICAgICAgICAgICBwU0VDUG9ydC0+dHVubmVsRmxhZ3MgfD0gU0VDX1RVTk5FTF9JU19TVVBQTElFUjsKKyAgICAgICAgICAgICAgICByZXQgPSBPTVhfRXJyb3JOb25lOworICAgICAgICAgICAgICAgIGdvdG8gRVhJVDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKyAgICAgICAgYnJlYWs7CisgICAgZGVmYXVsdDoKKyAgICB7CisgICAgICAgIHJldCA9IE9NWF9FcnJvclVuc3VwcG9ydGVkSW5kZXg7CisgICAgICAgIGdvdG8gRVhJVDsKKyAgICB9CisgICAgICAgIGJyZWFrOworICAgIH0KKworICAgIHJldCA9IE9NWF9FcnJvck5vbmU7CisKK0VYSVQ6CisKKyAgICBGdW5jdGlvbk91dCgpOworCisgICAgcmV0dXJuIHJldDsKK30KKworT01YX0VSUk9SVFlQRSBTRUNfT01YX0dldENvbmZpZygKKyAgICBPTVhfSU4gT01YX0hBTkRMRVRZUEUgaENvbXBvbmVudCwKKyAgICBPTVhfSU4gT01YX0lOREVYVFlQRSAgbkluZGV4LAorICAgIE9NWF9JTk9VVCBPTVhfUFRSICAgICBwQ29tcG9uZW50Q29uZmlnU3RydWN0dXJlKQoreworICAgIE9NWF9FUlJPUlRZUEUgICAgICAgICAgcmV0ID0gT01YX0Vycm9yTm9uZTsKKyAgICBPTVhfQ09NUE9ORU5UVFlQRSAgICAgKnBPTVhDb21wb25lbnQgPSBOVUxMOworICAgIFNFQ19PTVhfQkFTRUNPTVBPTkVOVCAqcFNFQ0NvbXBvbmVudCA9IE5VTEw7CisKKyAgICBGdW5jdGlvbkluKCk7CisKKyAgICBpZiAoaENvbXBvbmVudCA9PSBOVUxMKSB7CisgICAgICAgIHJldCA9IE9NWF9FcnJvckJhZFBhcmFtZXRlcjsKKyAgICAgICAgZ290byBFWElUOworICAgIH0KKyAgICBwT01YQ29tcG9uZW50ID0gKE9NWF9DT01QT05FTlRUWVBFICopaENvbXBvbmVudDsKKyAgICByZXQgPSBTRUNfT01YX0NoZWNrX1NpemVWZXJzaW9uKHBPTVhDb21wb25lbnQsIHNpemVvZihPTVhfQ09NUE9ORU5UVFlQRSkpOworICAgIGlmIChyZXQgIT0gT01YX0Vycm9yTm9uZSkgeworICAgICAgICBnb3RvIEVYSVQ7CisgICAgfQorCisgICAgaWYgKHBPTVhDb21wb25lbnQtPnBDb21wb25lbnRQcml2YXRlID09IE5VTEwpIHsKKyAgICAgICAgcmV0ID0gT01YX0Vycm9yQmFkUGFyYW1ldGVyOworICAgICAgICBnb3RvIEVYSVQ7CisgICAgfQorICAgIHBTRUNDb21wb25lbnQgPSAoU0VDX09NWF9CQVNFQ09NUE9ORU5UICopcE9NWENvbXBvbmVudC0+cENvbXBvbmVudFByaXZhdGU7CisKKyAgICBpZiAocENvbXBvbmVudENvbmZpZ1N0cnVjdHVyZSA9PSBOVUxMKSB7CisgICAgICAgIHJldCA9IE9NWF9FcnJvckJhZFBhcmFtZXRlcjsKKyAgICAgICAgZ290byBFWElUOworICAgIH0KKyAgICBpZiAocFNFQ0NvbXBvbmVudC0+Y3VycmVudFN0YXRlID09IE9NWF9TdGF0ZUludmFsaWQpIHsKKyAgICAgICAgcmV0ID0gT01YX0Vycm9ySW52YWxpZFN0YXRlOworICAgICAgICBnb3RvIEVYSVQ7CisgICAgfQorCisgICAgc3dpdGNoIChuSW5kZXgpIHsKKyAgICBkZWZhdWx0OgorICAgICAgICByZXQgPSBPTVhfRXJyb3JVbnN1cHBvcnRlZEluZGV4OworICAgICAgICBicmVhazsKKyAgICB9CisKK0VYSVQ6CisgICAgRnVuY3Rpb25PdXQoKTsKKworICAgIHJldHVybiByZXQ7Cit9CisKK09NWF9FUlJPUlRZUEUgU0VDX09NWF9TZXRDb25maWcoCisgICAgT01YX0lOIE9NWF9IQU5ETEVUWVBFIGhDb21wb25lbnQsCisgICAgT01YX0lOIE9NWF9JTkRFWFRZUEUgIG5JbmRleCwKKyAgICBPTVhfSU4gT01YX1BUUiAgICAgICAgcENvbXBvbmVudENvbmZpZ1N0cnVjdHVyZSkKK3sKKyAgICBPTVhfRVJST1JUWVBFICAgICAgICAgIHJldCA9IE9NWF9FcnJvck5vbmU7CisgICAgT01YX0NPTVBPTkVOVFRZUEUgICAgICpwT01YQ29tcG9uZW50ID0gTlVMTDsKKyAgICBTRUNfT01YX0JBU0VDT01QT05FTlQgKnBTRUNDb21wb25lbnQgPSBOVUxMOworCisgICAgRnVuY3Rpb25JbigpOworCisgICAgaWYgKGhDb21wb25lbnQgPT0gTlVMTCkgeworICAgICAgICByZXQgPSBPTVhfRXJyb3JCYWRQYXJhbWV0ZXI7CisgICAgICAgIGdvdG8gRVhJVDsKKyAgICB9CisgICAgcE9NWENvbXBvbmVudCA9IChPTVhfQ09NUE9ORU5UVFlQRSAqKWhDb21wb25lbnQ7CisgICAgcmV0ID0gU0VDX09NWF9DaGVja19TaXplVmVyc2lvbihwT01YQ29tcG9uZW50LCBzaXplb2YoT01YX0NPTVBPTkVOVFRZUEUpKTsKKyAgICBpZiAocmV0ICE9IE9NWF9FcnJvck5vbmUpIHsKKyAgICAgICAgZ290byBFWElUOworICAgIH0KKworICAgIGlmIChwT01YQ29tcG9uZW50LT5wQ29tcG9uZW50UHJpdmF0ZSA9PSBOVUxMKSB7CisgICAgICAgIHJldCA9IE9NWF9FcnJvckJhZFBhcmFtZXRlcjsKKyAgICAgICAgZ290byBFWElUOworICAgIH0KKyAgICBwU0VDQ29tcG9uZW50ID0gKFNFQ19PTVhfQkFTRUNPTVBPTkVOVCAqKXBPTVhDb21wb25lbnQtPnBDb21wb25lbnRQcml2YXRlOworCisgICAgaWYgKHBDb21wb25lbnRDb25maWdTdHJ1Y3R1cmUgPT0gTlVMTCkgeworICAgICAgICByZXQgPSBPTVhfRXJyb3JCYWRQYXJhbWV0ZXI7CisgICAgICAgIGdvdG8gRVhJVDsKKyAgICB9CisgICAgaWYgKHBTRUNDb21wb25lbnQtPmN1cnJlbnRTdGF0ZSA9PSBPTVhfU3RhdGVJbnZhbGlkKSB7CisgICAgICAgIHJldCA9IE9NWF9FcnJvckludmFsaWRTdGF0ZTsKKyAgICAgICAgZ290byBFWElUOworICAgIH0KKworICAgIHN3aXRjaCAobkluZGV4KSB7CisgICAgZGVmYXVsdDoKKyAgICAgICAgcmV0ID0gT01YX0Vycm9yVW5zdXBwb3J0ZWRJbmRleDsKKyAgICAgICAgYnJlYWs7CisgICAgfQorCitFWElUOgorICAgIEZ1bmN0aW9uT3V0KCk7CisKKyAgICByZXR1cm4gcmV0OworfQorCitPTVhfRVJST1JUWVBFIFNFQ19PTVhfR2V0RXh0ZW5zaW9uSW5kZXgoCisgICAgT01YX0lOIE9NWF9IQU5ETEVUWVBFICBoQ29tcG9uZW50LAorICAgIE9NWF9JTiBPTVhfU1RSSU5HICAgICAgY1BhcmFtZXRlck5hbWUsCisgICAgT01YX09VVCBPTVhfSU5ERVhUWVBFICpwSW5kZXhUeXBlKQoreworICAgIE9NWF9FUlJPUlRZUEUgICAgICAgICAgcmV0ID0gT01YX0Vycm9yTm9uZTsKKyAgICBPTVhfQ09NUE9ORU5UVFlQRSAgICAgKnBPTVhDb21wb25lbnQgPSBOVUxMOworICAgIFNFQ19PTVhfQkFTRUNPTVBPTkVOVCAqcFNFQ0NvbXBvbmVudCA9IE5VTEw7CisKKyAgICBGdW5jdGlvbkluKCk7CisKKyAgICBpZiAoaENvbXBvbmVudCA9PSBOVUxMKSB7CisgICAgICAgIHJldCA9IE9NWF9FcnJvckJhZFBhcmFtZXRlcjsKKyAgICAgICAgZ290byBFWElUOworICAgIH0KKyAgICBwT01YQ29tcG9uZW50ID0gKE9NWF9DT01QT05FTlRUWVBFICopaENvbXBvbmVudDsKKyAgICByZXQgPSBTRUNfT01YX0NoZWNrX1NpemVWZXJzaW9uKHBPTVhDb21wb25lbnQsIHNpemVvZihPTVhfQ09NUE9ORU5UVFlQRSkpOworICAgIGlmIChyZXQgIT0gT01YX0Vycm9yTm9uZSkgeworICAgICAgICBnb3RvIEVYSVQ7CisgICAgfQorCisgICAgaWYgKHBPTVhDb21wb25lbnQtPnBDb21wb25lbnRQcml2YXRlID09IE5VTEwpIHsKKyAgICAgICAgcmV0ID0gT01YX0Vycm9yQmFkUGFyYW1ldGVyOworICAgICAgICBnb3RvIEVYSVQ7CisgICAgfQorICAgIHBTRUNDb21wb25lbnQgPSAoU0VDX09NWF9CQVNFQ09NUE9ORU5UICopcE9NWENvbXBvbmVudC0+cENvbXBvbmVudFByaXZhdGU7CisKKyAgICBpZiAoKGNQYXJhbWV0ZXJOYW1lID09IE5VTEwpIHx8IChwSW5kZXhUeXBlID09IE5VTEwpKSB7CisgICAgICAgIHJldCA9IE9NWF9FcnJvckJhZFBhcmFtZXRlcjsKKyAgICAgICAgZ290byBFWElUOworICAgIH0KKyAgICBpZiAocFNFQ0NvbXBvbmVudC0+Y3VycmVudFN0YXRlID09IE9NWF9TdGF0ZUludmFsaWQpIHsKKyAgICAgICAgcmV0ID0gT01YX0Vycm9ySW52YWxpZFN0YXRlOworICAgICAgICBnb3RvIEVYSVQ7CisgICAgfQorCisgICAgcmV0ID0gT01YX0Vycm9yQmFkUGFyYW1ldGVyOworCitFWElUOgorICAgIEZ1bmN0aW9uT3V0KCk7CisKKyAgICByZXR1cm4gcmV0OworfQorCitPTVhfRVJST1JUWVBFIFNFQ19PTVhfU2V0Q2FsbGJhY2tzICgKKyAgICBPTVhfSU4gT01YX0hBTkRMRVRZUEUgICAgaENvbXBvbmVudCwKKyAgICBPTVhfSU4gT01YX0NBTExCQUNLVFlQRSogcENhbGxiYWNrcywKKyAgICBPTVhfSU4gT01YX1BUUiAgICAgICAgICAgcEFwcERhdGEpCit7CisgICAgT01YX0VSUk9SVFlQRSAgICAgICAgICByZXQgPSBPTVhfRXJyb3JOb25lOworICAgIE9NWF9DT01QT05FTlRUWVBFICAgICAqcE9NWENvbXBvbmVudCA9IE5VTEw7CisgICAgU0VDX09NWF9CQVNFQ09NUE9ORU5UICpwU0VDQ29tcG9uZW50ID0gTlVMTDsKKworICAgIEZ1bmN0aW9uSW4oKTsKKworICAgIGlmIChoQ29tcG9uZW50ID09IE5VTEwpIHsKKyAgICAgICAgcmV0ID0gT01YX0Vycm9yQmFkUGFyYW1ldGVyOworICAgICAgICBnb3RvIEVYSVQ7CisgICAgfQorICAgIHBPTVhDb21wb25lbnQgPSAoT01YX0NPTVBPTkVOVFRZUEUgKiloQ29tcG9uZW50OworICAgIHJldCA9IFNFQ19PTVhfQ2hlY2tfU2l6ZVZlcnNpb24ocE9NWENvbXBvbmVudCwgc2l6ZW9mKE9NWF9DT01QT05FTlRUWVBFKSk7CisgICAgaWYgKHJldCAhPSBPTVhfRXJyb3JOb25lKSB7CisgICAgICAgIGdvdG8gRVhJVDsKKyAgICB9CisKKyAgICBpZiAocE9NWENvbXBvbmVudC0+cENvbXBvbmVudFByaXZhdGUgPT0gTlVMTCkgeworICAgICAgICByZXQgPSBPTVhfRXJyb3JCYWRQYXJhbWV0ZXI7CisgICAgICAgIGdvdG8gRVhJVDsKKyAgICB9CisgICAgcFNFQ0NvbXBvbmVudCA9IChTRUNfT01YX0JBU0VDT01QT05FTlQgKilwT01YQ29tcG9uZW50LT5wQ29tcG9uZW50UHJpdmF0ZTsKKworICAgIGlmIChwQ2FsbGJhY2tzID09IE5VTEwpIHsKKyAgICAgICAgcmV0ID0gT01YX0Vycm9yQmFkUGFyYW1ldGVyOworICAgICAgICBnb3RvIEVYSVQ7CisgICAgfQorICAgIGlmIChwU0VDQ29tcG9uZW50LT5jdXJyZW50U3RhdGUgPT0gT01YX1N0YXRlSW52YWxpZCkgeworICAgICAgICByZXQgPSBPTVhfRXJyb3JJbnZhbGlkU3RhdGU7CisgICAgICAgIGdvdG8gRVhJVDsKKyAgICB9CisgICAgaWYgKHBTRUNDb21wb25lbnQtPmN1cnJlbnRTdGF0ZSAhPSBPTVhfU3RhdGVMb2FkZWQpIHsKKyAgICAgICAgcmV0ID0gT01YX0Vycm9ySW5jb3JyZWN0U3RhdGVPcGVyYXRpb247CisgICAgICAgIGdvdG8gRVhJVDsKKyAgICB9CisKKyAgICBwU0VDQ29tcG9uZW50LT5wQ2FsbGJhY2tzID0gcENhbGxiYWNrczsKKyAgICBwU0VDQ29tcG9uZW50LT5jYWxsYmFja0RhdGEgPSBwQXBwRGF0YTsKKworICAgIHJldCA9IE9NWF9FcnJvck5vbmU7CisKK0VYSVQ6CisgICAgRnVuY3Rpb25PdXQoKTsKKworICAgIHJldHVybiByZXQ7Cit9CisKK09NWF9FUlJPUlRZUEUgU0VDX09NWF9Vc2VFR0xJbWFnZSgKKyAgICBPTVhfSU4gT01YX0hBTkRMRVRZUEUgICAgICAgICAgICBoQ29tcG9uZW50LAorICAgIE9NWF9JTk9VVCBPTVhfQlVGRkVSSEVBREVSVFlQRSAqKnBwQnVmZmVySGRyLAorICAgIE9NWF9JTiBPTVhfVTMyICAgICAgICAgICAgICAgICAgIG5Qb3J0SW5kZXgsCisgICAgT01YX0lOIE9NWF9QVFIgICAgICAgICAgICAgICAgICAgcEFwcFByaXZhdGUsCisgICAgT01YX0lOIHZvaWQgICAgICAgICAgICAgICAgICAgICAqZWdsSW1hZ2UpCit7CisgICAgcmV0dXJuIE9NWF9FcnJvck5vdEltcGxlbWVudGVkOworfQorCitPTVhfRVJST1JUWVBFIFNFQ19PTVhfQmFzZUNvbXBvbmVudF9Db25zdHJ1Y3RvcigKKyAgICBPTVhfSU4gT01YX0hBTkRMRVRZUEUgaENvbXBvbmVudCkKK3sKKyAgICBPTVhfRVJST1JUWVBFICAgICAgICAgIHJldCA9IE9NWF9FcnJvck5vbmU7CisgICAgT01YX0NPTVBPTkVOVFRZUEUgICAgICpwT01YQ29tcG9uZW50OworICAgIFNFQ19PTVhfQkFTRUNPTVBPTkVOVCAqcFNFQ0NvbXBvbmVudCA9IE5VTEw7CisKKyAgICBGdW5jdGlvbkluKCk7CisKKyAgICBpZiAoaENvbXBvbmVudCA9PSBOVUxMKSB7CisgICAgICAgIHJldCA9IE9NWF9FcnJvckJhZFBhcmFtZXRlcjsKKyAgICAgICAgU0VDX09TQUxfTG9nKFNFQ19MT0dfRVJST1IsICJPTVhfRXJyb3JCYWRQYXJhbWV0ZXIsIExpbmU6JWQiLCBfX0xJTkVfXyk7CisgICAgICAgIGdvdG8gRVhJVDsKKyAgICB9CisgICAgcE9NWENvbXBvbmVudCA9IChPTVhfQ09NUE9ORU5UVFlQRSAqKWhDb21wb25lbnQ7CisgICAgcFNFQ0NvbXBvbmVudCA9IFNFQ19PU0FMX01hbGxvYyhzaXplb2YoU0VDX09NWF9CQVNFQ09NUE9ORU5UKSk7CisgICAgaWYgKHBTRUNDb21wb25lbnQgPT0gTlVMTCkgeworICAgICAgICByZXQgPSBPTVhfRXJyb3JJbnN1ZmZpY2llbnRSZXNvdXJjZXM7CisgICAgICAgIFNFQ19PU0FMX0xvZyhTRUNfTE9HX0VSUk9SLCAiT01YX0Vycm9ySW5zdWZmaWNpZW50UmVzb3VyY2VzLCBMaW5lOiVkIiwgX19MSU5FX18pOworICAgICAgICBnb3RvIEVYSVQ7CisgICAgfQorICAgIFNFQ19PU0FMX01lbXNldChwU0VDQ29tcG9uZW50LCAwLCBzaXplb2YoU0VDX09NWF9CQVNFQ09NUE9ORU5UKSk7CisgICAgcE9NWENvbXBvbmVudC0+cENvbXBvbmVudFByaXZhdGUgPSAoT01YX1BUUilwU0VDQ29tcG9uZW50OworCisgICAgcmV0ID0gU0VDX09TQUxfU2VtYXBob3JlQ3JlYXRlKCZwU0VDQ29tcG9uZW50LT5tc2dTZW1hcGhvcmVIYW5kbGUpOworICAgIGlmIChyZXQgIT0gT01YX0Vycm9yTm9uZSkgeworICAgICAgICByZXQgPSBPTVhfRXJyb3JJbnN1ZmZpY2llbnRSZXNvdXJjZXM7CisgICAgICAgIFNFQ19PU0FMX0xvZyhTRUNfTE9HX0VSUk9SLCAiT01YX0Vycm9ySW5zdWZmaWNpZW50UmVzb3VyY2VzLCBMaW5lOiVkIiwgX19MSU5FX18pOworICAgICAgICBnb3RvIEVYSVQ7CisgICAgfQorICAgIHJldCA9IFNFQ19PU0FMX011dGV4Q3JlYXRlKCZwU0VDQ29tcG9uZW50LT5jb21wTXV0ZXgpOworICAgIGlmIChyZXQgIT0gT01YX0Vycm9yTm9uZSkgeworICAgICAgICByZXQgPSBPTVhfRXJyb3JJbnN1ZmZpY2llbnRSZXNvdXJjZXM7CisgICAgICAgIFNFQ19PU0FMX0xvZyhTRUNfTE9HX0VSUk9SLCAiT01YX0Vycm9ySW5zdWZmaWNpZW50UmVzb3VyY2VzLCBMaW5lOiVkIiwgX19MSU5FX18pOworICAgICAgICBnb3RvIEVYSVQ7CisgICAgfQorCisgICAgcFNFQ0NvbXBvbmVudC0+YkV4aXRNZXNzYWdlSGFuZGxlclRocmVhZCA9IE9NWF9GQUxTRTsKKyAgICBTRUNfT1NBTF9RdWV1ZUNyZWF0ZSgmcFNFQ0NvbXBvbmVudC0+bWVzc2FnZVEpOworICAgIHJldCA9IFNFQ19PU0FMX1RocmVhZENyZWF0ZSgmcFNFQ0NvbXBvbmVudC0+aE1lc3NhZ2VIYW5kbGVyLCBTRUNfT01YX01lc3NhZ2VIYW5kbGVyVGhyZWFkLCBwT01YQ29tcG9uZW50KTsKKyAgICBpZiAocmV0ICE9IE9NWF9FcnJvck5vbmUpIHsKKyAgICAgICAgcmV0ID0gT01YX0Vycm9ySW5zdWZmaWNpZW50UmVzb3VyY2VzOworICAgICAgICBTRUNfT1NBTF9Mb2coU0VDX0xPR19FUlJPUiwgIk9NWF9FcnJvckluc3VmZmljaWVudFJlc291cmNlcywgTGluZTolZCIsIF9fTElORV9fKTsKKyAgICAgICAgZ290byBFWElUOworICAgIH0KKworICAgIHBPTVhDb21wb25lbnQtPkdldENvbXBvbmVudFZlcnNpb24gPSAmU0VDX09NWF9HZXRDb21wb25lbnRWZXJzaW9uOworICAgIHBPTVhDb21wb25lbnQtPlNlbmRDb21tYW5kICAgICAgICAgPSAmU0VDX09NWF9TZW5kQ29tbWFuZDsKKyAgICBwT01YQ29tcG9uZW50LT5HZXRTdGF0ZSAgICAgICAgICAgID0gJlNFQ19PTVhfR2V0U3RhdGU7CisgICAgcE9NWENvbXBvbmVudC0+U2V0Q2FsbGJhY2tzICAgICAgICA9ICZTRUNfT01YX1NldENhbGxiYWNrczsKKyAgICBwT01YQ29tcG9uZW50LT5Vc2VFR0xJbWFnZSAgICAgICAgID0gJlNFQ19PTVhfVXNlRUdMSW1hZ2U7CisKK0VYSVQ6CisgICAgRnVuY3Rpb25PdXQoKTsKKworICAgIHJldHVybiByZXQ7Cit9CisKK09NWF9FUlJPUlRZUEUgU0VDX09NWF9CYXNlQ29tcG9uZW50X0Rlc3RydWN0b3IoCisgICAgT01YX0lOIE9NWF9IQU5ETEVUWVBFIGhDb21wb25lbnQpCit7CisgICAgT01YX0VSUk9SVFlQRSAgICAgICAgICByZXQgPSBPTVhfRXJyb3JOb25lOworICAgIE9NWF9DT01QT05FTlRUWVBFICAgICAqcE9NWENvbXBvbmVudCA9IE5VTEw7CisgICAgU0VDX09NWF9CQVNFQ09NUE9ORU5UICpwU0VDQ29tcG9uZW50ID0gTlVMTDsKKyAgICBPTVhfUzMyICAgICAgICAgICAgICAgIHNlbWFWYWx1ZSA9IDA7CisKKyAgICBGdW5jdGlvbkluKCk7CisKKyAgICBpZiAoaENvbXBvbmVudCA9PSBOVUxMKSB7CisgICAgICAgIHJldCA9IE9NWF9FcnJvckJhZFBhcmFtZXRlcjsKKyAgICAgICAgZ290byBFWElUOworICAgIH0KKyAgICBwT01YQ29tcG9uZW50ID0gKE9NWF9DT01QT05FTlRUWVBFICopaENvbXBvbmVudDsKKyAgICByZXQgPSBTRUNfT01YX0NoZWNrX1NpemVWZXJzaW9uKHBPTVhDb21wb25lbnQsIHNpemVvZihPTVhfQ09NUE9ORU5UVFlQRSkpOworICAgIGlmIChyZXQgIT0gT01YX0Vycm9yTm9uZSkgeworICAgICAgICBnb3RvIEVYSVQ7CisgICAgfQorCisgICAgaWYgKHBPTVhDb21wb25lbnQtPnBDb21wb25lbnRQcml2YXRlID09IE5VTEwpIHsKKyAgICAgICAgcmV0ID0gT01YX0Vycm9yQmFkUGFyYW1ldGVyOworICAgICAgICBnb3RvIEVYSVQ7CisgICAgfQorICAgIHBTRUNDb21wb25lbnQgPSAoU0VDX09NWF9CQVNFQ09NUE9ORU5UICopcE9NWENvbXBvbmVudC0+cENvbXBvbmVudFByaXZhdGU7CisKKyAgICBTRUNfT01YX0NvbW1hbmRRdWV1ZShwU0VDQ29tcG9uZW50LCBTRUNfT01YX0NvbW1hbmRDb21wb25lbnREZUluaXQsIDAsIE5VTEwpOworICAgIFNFQ19PU0FMX1NsZWVwTWlsbGlzZWMoMCk7CisgICAgU0VDX09TQUxfR2V0X1NlbWFwaG9yZUNvdW50KHBTRUNDb21wb25lbnQtPm1zZ1NlbWFwaG9yZUhhbmRsZSwgJnNlbWFWYWx1ZSk7CisgICAgaWYgKHNlbWFWYWx1ZSA9PSAwKQorICAgICAgICBTRUNfT1NBTF9TZW1hcGhvcmVQb3N0KHBTRUNDb21wb25lbnQtPm1zZ1NlbWFwaG9yZUhhbmRsZSk7CisgICAgU0VDX09TQUxfU2VtYXBob3JlUG9zdChwU0VDQ29tcG9uZW50LT5tc2dTZW1hcGhvcmVIYW5kbGUpOworCisgICAgU0VDX09TQUxfVGhyZWFkVGVybWluYXRlKHBTRUNDb21wb25lbnQtPmhNZXNzYWdlSGFuZGxlcik7CisgICAgcFNFQ0NvbXBvbmVudC0+aE1lc3NhZ2VIYW5kbGVyID0gTlVMTDsKKworICAgIFNFQ19PU0FMX011dGV4VGVybWluYXRlKHBTRUNDb21wb25lbnQtPmNvbXBNdXRleCk7CisgICAgcFNFQ0NvbXBvbmVudC0+Y29tcE11dGV4ID0gTlVMTDsKKyAgICBTRUNfT1NBTF9TZW1hcGhvcmVUZXJtaW5hdGUocFNFQ0NvbXBvbmVudC0+bXNnU2VtYXBob3JlSGFuZGxlKTsKKyAgICBwU0VDQ29tcG9uZW50LT5tc2dTZW1hcGhvcmVIYW5kbGUgPSBOVUxMOworICAgIFNFQ19PU0FMX1F1ZXVlVGVybWluYXRlKCZwU0VDQ29tcG9uZW50LT5tZXNzYWdlUSk7CisKKyAgICBTRUNfT1NBTF9GcmVlKHBTRUNDb21wb25lbnQpOworICAgIHBTRUNDb21wb25lbnQgPSBOVUxMOworCisgICAgcmV0ID0gT01YX0Vycm9yTm9uZTsKK0VYSVQ6CisgICAgRnVuY3Rpb25PdXQoKTsKKworICAgIHJldHVybiByZXQ7Cit9CisKKwpkaWZmIC0tZ2l0IGEvZXh5bm9zNC9tdWx0aW1lZGlhL29wZW5tYXgvc2VjX29teC9jb21wb25lbnQvY29tbW9uL1NFQ19PTVhfQmFzZWNvbXBvbmVudC5oIGIvZXh5bm9zNC9tdWx0aW1lZGlhL29wZW5tYXgvc2VjX29teC9jb21wb25lbnQvY29tbW9uL1NFQ19PTVhfQmFzZWNvbXBvbmVudC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQ3YzY3NzEKLS0tIC9kZXYvbnVsbAorKysgYi9leHlub3M0L211bHRpbWVkaWEvb3Blbm1heC9zZWNfb214L2NvbXBvbmVudC9jb21tb24vU0VDX09NWF9CYXNlY29tcG9uZW50LmgKQEAgLTAsMCArMSwxOTYgQEAKKy8qCisgKgorICogQ29weXJpZ2h0IDIwMTAgU2Ftc3VuZyBFbGVjdHJvbmljcyBTLkxTSSBDby4gTFRECisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKy8qCisgKiBAZmlsZSAgICAgICBTRUNfT01YX0Jhc2Vjb21wb25lbnQuaAorICogQGJyaWVmCisgKiBAYXV0aG9yICAgICBTZXVuZ0Jlb20gS2ltIChzYmNydXgua2ltQHNhbXN1bmcuY29tKQorICogICAgICAgICAgICAgWXVuamkgS2ltICh5dW5qaS5raW1Ac2Ftc3VuZy5jb20pCisgKiBAdmVyc2lvbiAgICAxLjEuMAorICogQGhpc3RvcnkKKyAqICAgIDIwMTAuNy4xNSA6IENyZWF0ZQorICovCisKKyNpZm5kZWYgU0VDX09NWF9CQVNFQ09NUAorI2RlZmluZSBTRUNfT01YX0JBU0VDT01QCisKKyNpbmNsdWRlICJTRUNfT01YX0RlZi5oIgorI2luY2x1ZGUgIk9NWF9Db21wb25lbnQuaCIKKyNpbmNsdWRlICJTRUNfT1NBTF9RdWV1ZS5oIgorI2luY2x1ZGUgIlNFQ19PTVhfQmFzZXBvcnQuaCIKKworCit0eXBlZGVmIHN0cnVjdCBfU0VDX09NWF9NRVNTQUdFCit7CisgICAgT01YX1UzMiBtZXNzYWdlVHlwZTsKKyAgICBPTVhfVTMyIG1lc3NhZ2VQYXJhbTsKKyAgICBPTVhfUFRSIHBDbWREYXRhOworfSBTRUNfT01YX01FU1NBR0U7CisKK3R5cGVkZWYgc3RydWN0IF9TRUNfT01YX0RBVEFCVUZGRVIKK3sKKyAgICBPTVhfSEFORExFVFlQRSAgICAgICAgYnVmZmVyTXV0ZXg7CisgICAgT01YX0JVRkZFUkhFQURFUlRZUEUqIGJ1ZmZlckhlYWRlcjsKKyAgICBPTVhfQk9PTCAgICAgICAgICAgICAgZGF0YVZhbGlkOworICAgIE9NWF9VMzIgICAgICAgICAgICAgICBhbGxvY1NpemU7CisgICAgT01YX1UzMiAgICAgICAgICAgICAgIGRhdGFMZW47CisgICAgT01YX1UzMiAgICAgICAgICAgICAgIHVzZWREYXRhTGVuOworICAgIE9NWF9VMzIgICAgICAgICAgICAgICByZW1haW5EYXRhTGVuOworICAgIE9NWF9VMzIgICAgICAgICAgICAgICBuRmxhZ3M7CisgICAgT01YX1RJQ0tTICAgICAgICAgICAgIHRpbWVTdGFtcDsKK30gU0VDX09NWF9EQVRBQlVGRkVSOworCit0eXBlZGVmIHN0cnVjdCBfU0VDX09NWF9EQVRBCit7CisgICAgT01YX0JZVEUgIGRhdGFCdWZmZXI7CisgICAgT01YX1UzMiAgIGFsbG9jU2l6ZTsKKyAgICBPTVhfVTMyICAgZGF0YUxlbjsKKyAgICBPTVhfVTMyICAgdXNlZERhdGFMZW47CisgICAgT01YX1UzMiAgIHJlbWFpbkRhdGFMZW47CisgICAgT01YX1UzMiAgIHByZXZpb3VzRGF0YUxlbjsKKyAgICBPTVhfVTMyICAgbkZsYWdzOworICAgIE9NWF9USUNLUyB0aW1lU3RhbXA7Cit9IFNFQ19PTVhfREFUQTsKKworLyogZm9yIENoZWNrIFRpbWVTdGFtcCBhZnRlciBTZWVrICovCit0eXBlZGVmIHN0cnVjdCBfU0VDX09NWF9USU1FU1RBUE0KK3sKKyAgICBPTVhfQk9PTCAgbmVlZFNldFN0YXJ0VGltZVN0YW1wOworICAgIE9NWF9CT09MICBuZWVkQ2hlY2tTdGFydFRpbWVTdGFtcDsKKyAgICBPTVhfVElDS1Mgc3RhcnRUaW1lU3RhbXA7CisgICAgT01YX1UzMiAgIG5TdGFydEZsYWdzOworfSBTRUNfT01YX1RJTUVTVEFNUDsKKwordHlwZWRlZiBzdHJ1Y3QgX1NFQ19PTVhfQkFTRUNPTVBPTkVOVAoreworICAgIE9NWF9TVFJJTkcgICAgICAgICAgICAgICBjb21wb25lbnROYW1lOworICAgIE9NWF9WRVJTSU9OVFlQRSAgICAgICAgICBjb21wb25lbnRWZXJzaW9uOworICAgIE9NWF9WRVJTSU9OVFlQRSAgICAgICAgICBzcGVjVmVyc2lvbjsKKworICAgIE9NWF9TVEFURVRZUEUgICAgICAgICAgICBjdXJyZW50U3RhdGU7CisgICAgU0VDX09NWF9UUkFOU19TVEFURVRZUEUgIHRyYW5zaWVudFN0YXRlOworCisgICAgU0VDX0NPREVDX1RZUEUgICAgICAgICAgIGNvZGVjVHlwZTsKKyAgICBTRUNfT01YX1BSSU9SSVRZTUdNVFRZUEUgY29tcFByaW9yaXR5OworICAgIE9NWF9NQVJLVFlQRSAgICAgICAgICAgICBwcm9wYWdhdGVNYXJrVHlwZTsKKyAgICBPTVhfSEFORExFVFlQRSAgICAgICAgICAgY29tcE11dGV4OworCisgICAgT01YX0hBTkRMRVRZUEUgICAgICAgICAgIGhDb21wb25lbnRIYW5kbGU7CisKKyAgICAvKiBNZXNzYWdlIEhhbmRsZXIgKi8KKyAgICBPTVhfQk9PTCAgICAgICAgICAgICAgICAgYkV4aXRNZXNzYWdlSGFuZGxlclRocmVhZDsKKyAgICBPTVhfSEFORExFVFlQRSAgICAgICAgICAgaE1lc3NhZ2VIYW5kbGVyOworICAgIE9NWF9IQU5ETEVUWVBFICAgICAgICAgICBtc2dTZW1hcGhvcmVIYW5kbGU7CisgICAgU0VDX1FVRVVFICAgICAgICAgICAgICAgIG1lc3NhZ2VROworCisgICAgLyogQnVmZmVyIFByb2Nlc3MgKi8KKyAgICBPTVhfQk9PTCAgICAgICAgICAgICAgICAgYkV4aXRCdWZmZXJQcm9jZXNzVGhyZWFkOworICAgIE9NWF9IQU5ETEVUWVBFICAgICAgICAgICBoQnVmZmVyUHJvY2VzczsKKworICAgIC8qIEJ1ZmZlciAqLworICAgIFNFQ19PTVhfREFUQUJVRkZFUiAgICAgICBzZWNEYXRhQnVmZmVyWzJdOworCisgICAgLyogRGF0YSAqLworICAgIFNFQ19PTVhfREFUQSAgICAgICAgICAgICBwcm9jZXNzRGF0YVsyXTsKKworICAgIC8qIFBvcnQgKi8KKyAgICBPTVhfUE9SVF9QQVJBTV9UWVBFICAgICAgcG9ydFBhcmFtOworICAgIFNFQ19PTVhfQkFTRVBPUlQgICAgICAgICpwU0VDUG9ydDsKKworICAgIE9NWF9IQU5ETEVUWVBFICAgICAgICAgICBwYXVzZUV2ZW50OworCisgICAgLyogQ2FsbGJhY2sgZnVuY3Rpb24gKi8KKyAgICBPTVhfQ0FMTEJBQ0tUWVBFICAgICAgICAqcENhbGxiYWNrczsKKyAgICBPTVhfUFRSICAgICAgICAgICAgICAgICAgY2FsbGJhY2tEYXRhOworCisgICAgLyogU2F2ZSBUaW1lc3RhbXAgKi8KKyAgICBPTVhfVElDS1MgICAgICAgICAgICAgICAgdGltZVN0YW1wW01BWF9USU1FU1RBTVBdOworICAgIFNFQ19PTVhfVElNRVNUQU1QICAgICAgICBjaGVja1RpbWVTdGFtcDsKKworICAgIC8qIFNhdmUgRmxhZ3MgKi8KKyAgICBPTVhfVTMyICAgICAgICAgICAgICAgICAgbkZsYWdzW01BWF9GTEFHU107CisKKyAgICBPTVhfQk9PTCAgICAgICAgICAgICAgICAgZ2V0QWxsRGVsYXlCdWZmZXI7CisgICAgT01YX0JPT0wgICAgICAgICAgICAgICAgIHJlbWFpbk91dHB1dERhdGE7CisgICAgT01YX0JPT0wgICAgICAgICAgICAgICAgIHJlSW5wdXREYXRhOworCisgICAgLyogQW5kcm9pZCBDYXBhYmlsaXR5RmxhZ3MgKi8KKyAgICBPTVhDb21wb25lbnRDYXBhYmlsaXR5RmxhZ3NUeXBlIGNhcGFiaWxpdHlGbGFnczsKKworICAgIE9NWF9CT09MIGJVc2VGbGFnRU9GOworICAgIE9NWF9CT09MIGJTYXZlRmxhZ0VPUzsKKworICAgIE9NWF9FUlJPUlRZUEUgKCpzZWNfbWZjX2NvbXBvbmVudEluaXQpKE9NWF9DT01QT05FTlRUWVBFICpwT01YQ29tcG9uZW50KTsKKyAgICBPTVhfRVJST1JUWVBFICgqc2VjX21mY19jb21wb25lbnRUZXJtaW5hdGUpKE9NWF9DT01QT05FTlRUWVBFICpwT01YQ29tcG9uZW50KTsKKyAgICBPTVhfRVJST1JUWVBFICgqc2VjX21mY19idWZmZXJQcm9jZXNzKSAoT01YX0NPTVBPTkVOVFRZUEUgKnBPTVhDb21wb25lbnQsIFNFQ19PTVhfREFUQSAqcElucHV0RGF0YSwgU0VDX09NWF9EQVRBICpwT3V0cHV0RGF0YSk7CisKKyAgICBPTVhfRVJST1JUWVBFICgqc2VjX0FsbG9jYXRlVHVubmVsQnVmZmVyKShTRUNfT01YX0JBU0VQT1JUICpwT01YQmFzZVBvcnQsIE9NWF9VMzIgblBvcnRJbmRleCk7CisgICAgT01YX0VSUk9SVFlQRSAoKnNlY19GcmVlVHVubmVsQnVmZmVyKShTRUNfT01YX0JBU0VQT1JUICpwT01YQmFzZVBvcnQsIE9NWF9VMzIgblBvcnRJbmRleCk7CisgICAgT01YX0VSUk9SVFlQRSAoKnNlY19CdWZmZXJQcm9jZXNzKShPTVhfSEFORExFVFlQRSBoQ29tcG9uZW50KTsKKyAgICBPTVhfRVJST1JUWVBFICgqc2VjX0J1ZmZlclJlc2V0KShPTVhfQ09NUE9ORU5UVFlQRSAqcE9NWENvbXBvbmVudCwgT01YX1UzMiBuUG9ydEluZGV4KTsKKyAgICBPTVhfRVJST1JUWVBFICgqc2VjX0lucHV0QnVmZmVyUmV0dXJuKShPTVhfQ09NUE9ORU5UVFlQRSAqcE9NWENvbXBvbmVudCk7CisgICAgT01YX0VSUk9SVFlQRSAoKnNlY19PdXRwdXRCdWZmZXJSZXR1cm4pKE9NWF9DT01QT05FTlRUWVBFICpwT01YQ29tcG9uZW50KTsKKworICAgIE9NWF9FUlJPUlRZUEUgKCpzZWNfYWxsb2NTZWN1cmVJbnB1dEJ1ZmZlcikoT01YX0lOIE9NWF9IQU5ETEVUWVBFIGhDb21wb25lbnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPTVhfSU4gT01YX1UzMiBuQnVmZmVyU2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9NWF9JTk9VVCBPTVhfUFRSICpwSW5wdXRCdWZmZXJfcGh5c2ljYWxBZGRyZXNzKTsKKyAgICBPTVhfRVJST1JUWVBFICgqc2VjX2ZyZWVTZWN1cmVJbnB1dEJ1ZmZlcikoT01YX0lOIE9NWF9IQU5ETEVUWVBFIGhDb21wb25lbnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9NWF9JTk9VVCBPTVhfUFRSIHBJbnB1dEJ1ZmZlcl9waHlzaWNhbEFkZHJlc3MpOworCisgICAgaW50ICgqc2VjX2NoZWNrSW5wdXRGcmFtZSkoT01YX1U4ICpwSW5wdXRTdHJlYW0sIE9NWF9VMzIgYnVmZlNpemUsIE9NWF9VMzIgZmxhZywgT01YX0JPT0wgYlByZXZpb3VzRnJhbWVFT0YsIE9NWF9CT09MICpwYkVuZE9mRnJhbWUpOworfSBTRUNfT01YX0JBU0VDT01QT05FTlQ7CisKK09NWF9FUlJPUlRZUEUgU0VDX09NWF9HZXRQYXJhbWV0ZXIoCisgICAgT01YX0lOIE9NWF9IQU5ETEVUWVBFIGhDb21wb25lbnQsCisgICAgT01YX0lOIE9NWF9JTkRFWFRZUEUgIG5QYXJhbUluZGV4LAorICAgIE9NWF9JTk9VVCBPTVhfUFRSICAgICBDb21wb25lbnRQYXJhbWV0ZXJTdHJ1Y3R1cmUpOworCitPTVhfRVJST1JUWVBFIFNFQ19PTVhfU2V0UGFyYW1ldGVyKAorICAgIE9NWF9JTiBPTVhfSEFORExFVFlQRSBoQ29tcG9uZW50LAorICAgIE9NWF9JTiBPTVhfSU5ERVhUWVBFICBuSW5kZXgsCisgICAgT01YX0lOIE9NWF9QVFIgICAgICAgIENvbXBvbmVudFBhcmFtZXRlclN0cnVjdHVyZSk7CisKK09NWF9FUlJPUlRZUEUgU0VDX09NWF9HZXRDb25maWcoCisgICAgT01YX0lOIE9NWF9IQU5ETEVUWVBFIGhDb21wb25lbnQsCisgICAgT01YX0lOIE9NWF9JTkRFWFRZUEUgIG5JbmRleCwKKyAgICBPTVhfSU5PVVQgT01YX1BUUiAgICAgcENvbXBvbmVudENvbmZpZ1N0cnVjdHVyZSk7CisKK09NWF9FUlJPUlRZUEUgU0VDX09NWF9TZXRDb25maWcoCisgICAgT01YX0lOIE9NWF9IQU5ETEVUWVBFIGhDb21wb25lbnQsCisgICAgT01YX0lOIE9NWF9JTkRFWFRZUEUgIG5JbmRleCwKKyAgICBPTVhfSU4gT01YX1BUUiAgICAgICAgcENvbXBvbmVudENvbmZpZ1N0cnVjdHVyZSk7CisKK09NWF9FUlJPUlRZUEUgU0VDX09NWF9HZXRFeHRlbnNpb25JbmRleCgKKyAgICBPTVhfSU4gT01YX0hBTkRMRVRZUEUgIGhDb21wb25lbnQsCisgICAgT01YX0lOIE9NWF9TVFJJTkcgICAgICBjUGFyYW1ldGVyTmFtZSwKKyAgICBPTVhfT1VUIE9NWF9JTkRFWFRZUEUgKnBJbmRleFR5cGUpOworCitPTVhfRVJST1JUWVBFIFNFQ19PTVhfQmFzZUNvbXBvbmVudF9Db25zdHJ1Y3RvcihPTVhfSU4gT01YX0hBTkRMRVRZUEUgaENvbXBvbmVudCk7CitPTVhfRVJST1JUWVBFIFNFQ19PTVhfQmFzZUNvbXBvbmVudF9EZXN0cnVjdG9yKE9NWF9JTiBPTVhfSEFORExFVFlQRSBoQ29tcG9uZW50KTsKKworI2lmZGVmIF9fY3BsdXNwbHVzCitleHRlcm4gIkMiIHsKKyNlbmRpZgorCisgICAgT01YX0VSUk9SVFlQRSBTRUNfT01YX0NoZWNrX1NpemVWZXJzaW9uKE9NWF9QVFIgaGVhZGVyLCBPTVhfVTMyIHNpemUpOworCisKKyNpZmRlZiBfX2NwbHVzcGx1cworfTsKKyNlbmRpZgorCisjZW5kaWYKZGlmZiAtLWdpdCBhL2V4eW5vczQvbXVsdGltZWRpYS9vcGVubWF4L3NlY19vbXgvY29tcG9uZW50L2NvbW1vbi9TRUNfT01YX0Jhc2Vwb3J0LmMgYi9leHlub3M0L211bHRpbWVkaWEvb3Blbm1heC9zZWNfb214L2NvbXBvbmVudC9jb21tb24vU0VDX09NWF9CYXNlcG9ydC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjNiZDM3ZjUKLS0tIC9kZXYvbnVsbAorKysgYi9leHlub3M0L211bHRpbWVkaWEvb3Blbm1heC9zZWNfb214L2NvbXBvbmVudC9jb21tb24vU0VDX09NWF9CYXNlcG9ydC5jCkBAIC0wLDAgKzEsMTAxNCBAQAorLyoKKyAqCisgKiBDb3B5cmlnaHQgMjAxMCBTYW1zdW5nIEVsZWN0cm9uaWNzIFMuTFNJIENvLiBMVEQKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworLyoKKyAqIEBmaWxlICAgICAgIFNFQ19PTVhfQmFzZXBvcnQuYworICogQGJyaWVmCisgKiBAYXV0aG9yICAgICBTZXVuZ0Jlb20gS2ltIChzYmNydXgua2ltQHNhbXN1bmcuY29tKQorICogICAgICAgICAgICAgSHllWWVvbiBDaHVuZyAoaHllb24uY2h1bmdAc2Ftc3VuZy5jb20pCisgKiBAdmVyc2lvbiAgICAxLjEuMAorICogQGhpc3RvcnkKKyAqICAgIDIwMTAuNy4xNSA6IENyZWF0ZQorICovCisKKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgPHN0ZGxpYi5oPgorI2luY2x1ZGUgPHN0cmluZy5oPgorCisjaW5jbHVkZSAiU0VDX09NWF9NYWNyb3MuaCIKKyNpbmNsdWRlICJTRUNfT1NBTF9FdmVudC5oIgorI2luY2x1ZGUgIlNFQ19PU0FMX1NlbWFwaG9yZS5oIgorI2luY2x1ZGUgIlNFQ19PU0FMX011dGV4LmgiCisKKyNpbmNsdWRlICJTRUNfT01YX0Jhc2Vwb3J0LmgiCisjaW5jbHVkZSAiU0VDX09NWF9CYXNlY29tcG9uZW50LmgiCisKKyN1bmRlZiAgU0VDX0xPR19UQUcKKyNkZWZpbmUgU0VDX0xPR19UQUcgICAgIlNFQ19CQVNFX1BPUlQiCisjZGVmaW5lIFNFQ19MT0dfT0ZGCisjaW5jbHVkZSAiU0VDX09TQUxfTG9nLmgiCisKKworT01YX0VSUk9SVFlQRSBTRUNfT01YX0ZsdXNoUG9ydChPTVhfQ09NUE9ORU5UVFlQRSAqcE9NWENvbXBvbmVudCwgT01YX1MzMiBwb3J0SW5kZXgpCit7CisgICAgT01YX0VSUk9SVFlQRSAgICAgICAgICByZXQgPSBPTVhfRXJyb3JOb25lOworICAgIFNFQ19PTVhfQkFTRUNPTVBPTkVOVCAqcFNFQ0NvbXBvbmVudCA9IChTRUNfT01YX0JBU0VDT01QT05FTlQgKilwT01YQ29tcG9uZW50LT5wQ29tcG9uZW50UHJpdmF0ZTsKKyAgICBTRUNfT01YX0JBU0VQT1JUICAgICAgKnBTRUNQb3J0ID0gTlVMTDsKKyAgICBPTVhfQlVGRkVSSEVBREVSVFlQRSAgKmJ1ZmZlckhlYWRlciA9IE5VTEw7CisgICAgU0VDX09NWF9NRVNTQUdFICAgICAgICptZXNzYWdlID0gTlVMTDsKKyAgICBPTVhfVTMyICAgICAgICAgICAgICAgIGZsdXNoTnVtID0gMDsKKyAgICBPTVhfUzMyICAgICAgICAgICAgICAgIHNlbVZhbHVlID0gMDsKKworICAgIEZ1bmN0aW9uSW4oKTsKKworICAgIHBTRUNQb3J0ID0gJnBTRUNDb21wb25lbnQtPnBTRUNQb3J0W3BvcnRJbmRleF07CisgICAgd2hpbGUgKFNFQ19PU0FMX0dldEVsZW1OdW0oJnBTRUNQb3J0LT5idWZmZXJRKSA+IDApIHsKKyAgICAgICAgU0VDX09TQUxfR2V0X1NlbWFwaG9yZUNvdW50KHBTRUNDb21wb25lbnQtPnBTRUNQb3J0W3BvcnRJbmRleF0uYnVmZmVyU2VtSUQsICZzZW1WYWx1ZSk7CisgICAgICAgIGlmIChzZW1WYWx1ZSA9PSAwKQorICAgICAgICAgICAgU0VDX09TQUxfU2VtYXBob3JlUG9zdChwU0VDQ29tcG9uZW50LT5wU0VDUG9ydFtwb3J0SW5kZXhdLmJ1ZmZlclNlbUlEKTsKKyAgICAgICAgU0VDX09TQUxfU2VtYXBob3JlV2FpdChwU0VDQ29tcG9uZW50LT5wU0VDUG9ydFtwb3J0SW5kZXhdLmJ1ZmZlclNlbUlEKTsKKworICAgICAgICBtZXNzYWdlID0gKFNFQ19PTVhfTUVTU0FHRSAqKVNFQ19PU0FMX0RlcXVldWUoJnBTRUNQb3J0LT5idWZmZXJRKTsKKyAgICAgICAgaWYgKG1lc3NhZ2UgIT0gTlVMTCkgeworICAgICAgICAgICAgYnVmZmVySGVhZGVyID0gKE9NWF9CVUZGRVJIRUFERVJUWVBFICopbWVzc2FnZS0+cENtZERhdGE7CisgICAgICAgICAgICBidWZmZXJIZWFkZXItPm5GaWxsZWRMZW4gPSAwOworCisgICAgICAgICAgICBpZiAoQ0hFQ0tfUE9SVF9UVU5ORUxFRChwU0VDUG9ydCkgJiYgIUNIRUNLX1BPUlRfQlVGRkVSX1NVUFBMSUVSKHBTRUNQb3J0KSkgeworICAgICAgICAgICAgICAgIGlmIChwb3J0SW5kZXgpIHsKKyAgICAgICAgICAgICAgICAgICAgT01YX0VtcHR5VGhpc0J1ZmZlcihwU0VDUG9ydC0+dHVubmVsZWRDb21wb25lbnQsIGJ1ZmZlckhlYWRlcik7CisgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgT01YX0ZpbGxUaGlzQnVmZmVyKHBTRUNQb3J0LT50dW5uZWxlZENvbXBvbmVudCwgYnVmZmVySGVhZGVyKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgU0VDX09TQUxfRnJlZShtZXNzYWdlKTsKKyAgICAgICAgICAgICAgICBtZXNzYWdlID0gTlVMTDsKKyAgICAgICAgICAgIH0gZWxzZSBpZiAoQ0hFQ0tfUE9SVF9UVU5ORUxFRChwU0VDUG9ydCkgJiYgQ0hFQ0tfUE9SVF9CVUZGRVJfU1VQUExJRVIocFNFQ1BvcnQpKSB7CisgICAgICAgICAgICAgICAgU0VDX09TQUxfTG9nKFNFQ19MT0dfRVJST1IsICJUdW5uZWxlZCBtb2RlIGlzIG5vdCB3b3JraW5nLCBMaW5lOiVkIiwgX19MSU5FX18pOworICAgICAgICAgICAgICAgIHJldCA9IE9NWF9FcnJvck5vdEltcGxlbWVudGVkOworICAgICAgICAgICAgICAgIFNFQ19PU0FMX1F1ZXVlKCZwU0VDUG9ydC0+YnVmZmVyUSwgcFNFQ1BvcnQpOworICAgICAgICAgICAgICAgIGdvdG8gRVhJVDsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgaWYgKHBvcnRJbmRleCA9PSBPVVRQVVRfUE9SVF9JTkRFWCkgeworICAgICAgICAgICAgICAgICAgICBwU0VDQ29tcG9uZW50LT5wQ2FsbGJhY2tzLT5GaWxsQnVmZmVyRG9uZShwT01YQ29tcG9uZW50LCBwU0VDQ29tcG9uZW50LT5jYWxsYmFja0RhdGEsIGJ1ZmZlckhlYWRlcik7CisgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgcFNFQ0NvbXBvbmVudC0+cENhbGxiYWNrcy0+RW1wdHlCdWZmZXJEb25lKHBPTVhDb21wb25lbnQsIHBTRUNDb21wb25lbnQtPmNhbGxiYWNrRGF0YSwgYnVmZmVySGVhZGVyKTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBTRUNfT1NBTF9GcmVlKG1lc3NhZ2UpOworICAgICAgICAgICAgICAgIG1lc3NhZ2UgPSBOVUxMOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgaWYgKHBTRUNDb21wb25lbnQtPnNlY0RhdGFCdWZmZXJbcG9ydEluZGV4XS5kYXRhVmFsaWQgPT0gT01YX1RSVUUpIHsKKyAgICAgICAgaWYgKENIRUNLX1BPUlRfVFVOTkVMRUQocFNFQ1BvcnQpICYmIENIRUNLX1BPUlRfQlVGRkVSX1NVUFBMSUVSKHBTRUNQb3J0KSkgeworICAgICAgICAgICAgbWVzc2FnZSA9IFNFQ19PU0FMX01hbGxvYyhzaXplb2YoU0VDX09NWF9NRVNTQUdFKSk7CisgICAgICAgICAgICBtZXNzYWdlLT5wQ21kRGF0YSA9IHBTRUNDb21wb25lbnQtPnNlY0RhdGFCdWZmZXJbcG9ydEluZGV4XS5idWZmZXJIZWFkZXI7CisgICAgICAgICAgICBtZXNzYWdlLT5tZXNzYWdlVHlwZSA9IDA7CisgICAgICAgICAgICBtZXNzYWdlLT5tZXNzYWdlUGFyYW0gPSAtMTsKKyAgICAgICAgICAgIFNFQ19PU0FMX1F1ZXVlKCZwU0VDUG9ydC0+YnVmZmVyUSwgbWVzc2FnZSk7CisgICAgICAgICAgICBwU0VDQ29tcG9uZW50LT5zZWNfQnVmZmVyUmVzZXQocE9NWENvbXBvbmVudCwgcG9ydEluZGV4KTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIGlmIChwb3J0SW5kZXggPT0gSU5QVVRfUE9SVF9JTkRFWCkKKyAgICAgICAgICAgICAgICBwU0VDQ29tcG9uZW50LT5zZWNfSW5wdXRCdWZmZXJSZXR1cm4ocE9NWENvbXBvbmVudCk7CisgICAgICAgICAgICBlbHNlIGlmIChwb3J0SW5kZXggPT0gT1VUUFVUX1BPUlRfSU5ERVgpCisgICAgICAgICAgICAgICAgcFNFQ0NvbXBvbmVudC0+c2VjX091dHB1dEJ1ZmZlclJldHVybihwT01YQ29tcG9uZW50KTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmIChDSEVDS19QT1JUX1RVTk5FTEVEKHBTRUNQb3J0KSAmJiBDSEVDS19QT1JUX0JVRkZFUl9TVVBQTElFUihwU0VDUG9ydCkpIHsKKyAgICAgICAgd2hpbGUgKFNFQ19PU0FMX0dldEVsZW1OdW0oJnBTRUNQb3J0LT5idWZmZXJRKSA8IChpbnQpcFNFQ1BvcnQtPmFzc2lnbmVkQnVmZmVyTnVtKSB7CisgICAgICAgICAgICBTRUNfT1NBTF9TZW1hcGhvcmVXYWl0KHBTRUNDb21wb25lbnQtPnBTRUNQb3J0W3BvcnRJbmRleF0uYnVmZmVyU2VtSUQpOworICAgICAgICB9CisgICAgICAgIGlmIChTRUNfT1NBTF9HZXRFbGVtTnVtKCZwU0VDUG9ydC0+YnVmZmVyUSkgIT0gKGludClwU0VDUG9ydC0+YXNzaWduZWRCdWZmZXJOdW0pCisgICAgICAgICAgICBTRUNfT1NBTF9TZXRFbGVtTnVtKCZwU0VDUG9ydC0+YnVmZmVyUSwgcFNFQ1BvcnQtPmFzc2lnbmVkQnVmZmVyTnVtKTsKKyAgICB9IGVsc2UgeworICAgICAgICB3aGlsZSgxKSB7CisgICAgICAgICAgICBPTVhfUzMyIGNudCA9IDA7CisgICAgICAgICAgICBTRUNfT1NBTF9HZXRfU2VtYXBob3JlQ291bnQocFNFQ0NvbXBvbmVudC0+cFNFQ1BvcnRbcG9ydEluZGV4XS5idWZmZXJTZW1JRCwgJmNudCk7CisgICAgICAgICAgICBpZiAoY250IDw9IDApCisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBTRUNfT1NBTF9TZW1hcGhvcmVXYWl0KHBTRUNDb21wb25lbnQtPnBTRUNQb3J0W3BvcnRJbmRleF0uYnVmZmVyU2VtSUQpOworICAgICAgICB9CisgICAgICAgIFNFQ19PU0FMX1NldEVsZW1OdW0oJnBTRUNQb3J0LT5idWZmZXJRLCAwKTsKKyAgICB9CisKKyAgICBwU0VDQ29tcG9uZW50LT5wcm9jZXNzRGF0YVtwb3J0SW5kZXhdLmRhdGFMZW4gICAgICAgPSAwOworICAgIHBTRUNDb21wb25lbnQtPnByb2Nlc3NEYXRhW3BvcnRJbmRleF0ubkZsYWdzICAgICAgICA9IDA7CisgICAgcFNFQ0NvbXBvbmVudC0+cHJvY2Vzc0RhdGFbcG9ydEluZGV4XS5yZW1haW5EYXRhTGVuID0gMDsKKyAgICBwU0VDQ29tcG9uZW50LT5wcm9jZXNzRGF0YVtwb3J0SW5kZXhdLnRpbWVTdGFtcCAgICAgPSAwOworICAgIHBTRUNDb21wb25lbnQtPnByb2Nlc3NEYXRhW3BvcnRJbmRleF0udXNlZERhdGFMZW4gICA9IDA7CisKK0VYSVQ6CisgICAgRnVuY3Rpb25PdXQoKTsKKworICAgIHJldHVybiByZXQ7Cit9CisKK09NWF9FUlJPUlRZUEUgU0VDX09NWF9CdWZmZXJGbHVzaFByb2Nlc3MoT01YX0NPTVBPTkVOVFRZUEUgKnBPTVhDb21wb25lbnQsIE9NWF9TMzIgblBvcnRJbmRleCkKK3sKKyAgICBPTVhfRVJST1JUWVBFICAgICAgICAgIHJldCA9IE9NWF9FcnJvck5vbmU7CisgICAgU0VDX09NWF9CQVNFQ09NUE9ORU5UICpwU0VDQ29tcG9uZW50ID0gTlVMTDsKKyAgICBTRUNfT01YX0JBU0VQT1JUICAgICAgKnBTRUNQb3J0ID0gTlVMTDsKKyAgICBPTVhfUzMyICAgICAgICAgICAgICAgIHBvcnRJbmRleCA9IDA7CisgICAgT01YX1UzMiAgICAgICAgICAgICAgICBpID0gMCwgY250ID0gMDsKKyAgICBTRUNfT01YX0RBVEFCVUZGRVIgICAgKmZsdXNoQnVmZmVyID0gTlVMTDsKKworICAgIEZ1bmN0aW9uSW4oKTsKKworICAgIGlmIChwT01YQ29tcG9uZW50ID09IE5VTEwpIHsKKyAgICAgICAgcmV0ID0gT01YX0Vycm9yQmFkUGFyYW1ldGVyOworICAgICAgICBnb3RvIEVYSVQ7CisgICAgfQorICAgIHJldCA9IFNFQ19PTVhfQ2hlY2tfU2l6ZVZlcnNpb24ocE9NWENvbXBvbmVudCwgc2l6ZW9mKE9NWF9DT01QT05FTlRUWVBFKSk7CisgICAgaWYgKHJldCAhPSBPTVhfRXJyb3JOb25lKSB7CisgICAgICAgIGdvdG8gRVhJVDsKKyAgICB9CisKKyAgICBpZiAocE9NWENvbXBvbmVudC0+cENvbXBvbmVudFByaXZhdGUgPT0gTlVMTCkgeworICAgICAgICByZXQgPSBPTVhfRXJyb3JCYWRQYXJhbWV0ZXI7CisgICAgICAgIGdvdG8gRVhJVDsKKyAgICB9CisgICAgcFNFQ0NvbXBvbmVudCA9IChTRUNfT01YX0JBU0VDT01QT05FTlQgKilwT01YQ29tcG9uZW50LT5wQ29tcG9uZW50UHJpdmF0ZTsKKworICAgIGNudCA9IChuUG9ydEluZGV4ID09IEFMTF9QT1JUX0lOREVYICkgPyBBTExfUE9SVF9OVU0gOiAxOworCisgICAgZm9yIChpID0gMDsgaSA8IGNudDsgaSsrKSB7CisgICAgICAgIGlmIChuUG9ydEluZGV4ID09IEFMTF9QT1JUX0lOREVYKQorICAgICAgICAgICAgcG9ydEluZGV4ID0gaTsKKyAgICAgICAgZWxzZQorICAgICAgICAgICAgcG9ydEluZGV4ID0gblBvcnRJbmRleDsKKworICAgICAgICBTRUNfT1NBTF9TaWduYWxTZXQocFNFQ0NvbXBvbmVudC0+cGF1c2VFdmVudCk7CisKKyAgICAgICAgZmx1c2hCdWZmZXIgPSAmcFNFQ0NvbXBvbmVudC0+c2VjRGF0YUJ1ZmZlcltwb3J0SW5kZXhdOworCisgICAgICAgIFNFQ19PU0FMX011dGV4TG9jayhmbHVzaEJ1ZmZlci0+YnVmZmVyTXV0ZXgpOworICAgICAgICByZXQgPSBTRUNfT01YX0ZsdXNoUG9ydChwT01YQ29tcG9uZW50LCBwb3J0SW5kZXgpOworICAgICAgICBTRUNfT1NBTF9NdXRleFVubG9jayhmbHVzaEJ1ZmZlci0+YnVmZmVyTXV0ZXgpOworCisgICAgICAgIHBTRUNDb21wb25lbnQtPnBTRUNQb3J0W3BvcnRJbmRleF0uYklzUG9ydEZsdXNoZWQgPSBPTVhfRkFMU0U7CisKKyAgICAgICAgaWYgKHJldCA9PSBPTVhfRXJyb3JOb25lKSB7CisgICAgICAgICAgICBTRUNfT1NBTF9Mb2coU0VDX0xPR19UUkFDRSwiT01YX0NvbW1hbmRGbHVzaCBFdmVudENtZENvbXBsZXRlIik7CisgICAgICAgICAgICBwU0VDQ29tcG9uZW50LT5wQ2FsbGJhY2tzLT5FdmVudEhhbmRsZXIoKE9NWF9IQU5ETEVUWVBFKXBPTVhDb21wb25lbnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcFNFQ0NvbXBvbmVudC0+Y2FsbGJhY2tEYXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9NWF9FdmVudENtZENvbXBsZXRlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9NWF9Db21tYW5kRmx1c2gsIHBvcnRJbmRleCwgTlVMTCk7CisgICAgICAgIH0KKworICAgICAgICBpZiAocG9ydEluZGV4ID09IElOUFVUX1BPUlRfSU5ERVgpIHsKKyAgICAgICAgICAgIHBTRUNDb21wb25lbnQtPmNoZWNrVGltZVN0YW1wLm5lZWRTZXRTdGFydFRpbWVTdGFtcCA9IE9NWF9UUlVFOworICAgICAgICAgICAgcFNFQ0NvbXBvbmVudC0+Y2hlY2tUaW1lU3RhbXAubmVlZENoZWNrU3RhcnRUaW1lU3RhbXAgPSBPTVhfRkFMU0U7CisgICAgICAgICAgICBTRUNfT1NBTF9NZW1zZXQocFNFQ0NvbXBvbmVudC0+dGltZVN0YW1wLCAtMTk3NzEwMDMsIHNpemVvZihPTVhfVElDS1MpICogTUFYX1RJTUVTVEFNUCk7CisgICAgICAgICAgICBTRUNfT1NBTF9NZW1zZXQocFNFQ0NvbXBvbmVudC0+bkZsYWdzLCAwLCBzaXplb2YoT01YX1UzMikgKiBNQVhfRkxBR1MpOworICAgICAgICAgICAgcFNFQ0NvbXBvbmVudC0+Z2V0QWxsRGVsYXlCdWZmZXIgPSBPTVhfRkFMU0U7CisgICAgICAgICAgICBwU0VDQ29tcG9uZW50LT5iU2F2ZUZsYWdFT1MgPSBPTVhfRkFMU0U7CisgICAgICAgICAgICBwU0VDQ29tcG9uZW50LT5yZUlucHV0RGF0YSA9IE9NWF9GQUxTRTsKKyAgICAgICAgfSBlbHNlIGlmIChwb3J0SW5kZXggPT0gT1VUUFVUX1BPUlRfSU5ERVgpIHsKKyAgICAgICAgICAgIHBTRUNDb21wb25lbnQtPnJlbWFpbk91dHB1dERhdGEgPSBPTVhfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKK0VYSVQ6CisgICAgaWYgKChyZXQgIT0gT01YX0Vycm9yTm9uZSkgJiYgKHBPTVhDb21wb25lbnQgIT0gTlVMTCkgJiYgKHBTRUNDb21wb25lbnQgIT0gTlVMTCkpIHsKKyAgICAgICAgICAgIHBTRUNDb21wb25lbnQtPnBDYWxsYmFja3MtPkV2ZW50SGFuZGxlcihwT01YQ29tcG9uZW50LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBTRUNDb21wb25lbnQtPmNhbGxiYWNrRGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBPTVhfRXZlbnRFcnJvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXQsIDAsIE5VTEwpOworICAgIH0KKworICAgIEZ1bmN0aW9uT3V0KCk7CisKKyAgICByZXR1cm4gcmV0OworfQorCitPTVhfRVJST1JUWVBFIFNFQ19PTVhfQnVmZmVyRmx1c2hQcm9jZXNzTm9FdmVudChPTVhfQ09NUE9ORU5UVFlQRSAqcE9NWENvbXBvbmVudCwgT01YX1MzMiBuUG9ydEluZGV4KQoreworICAgIE9NWF9FUlJPUlRZUEUgICAgICAgICAgcmV0ID0gT01YX0Vycm9yTm9uZTsKKyAgICBTRUNfT01YX0JBU0VDT01QT05FTlQgKnBTRUNDb21wb25lbnQgPSBOVUxMOworICAgIFNFQ19PTVhfQkFTRVBPUlQgICAgICAqcFNFQ1BvcnQgPSBOVUxMOworICAgIE9NWF9TMzIgICAgICAgICAgICAgICAgcG9ydEluZGV4ID0gMDsKKyAgICBPTVhfVTMyICAgICAgICAgICAgICAgIGkgPSAwLCBjbnQgPSAwOworICAgIFNFQ19PTVhfREFUQUJVRkZFUiAgICAqZmx1c2hCdWZmZXIgPSBOVUxMOworCisgICAgRnVuY3Rpb25JbigpOworCisgICAgaWYgKHBPTVhDb21wb25lbnQgPT0gTlVMTCkgeworICAgICAgICByZXQgPSBPTVhfRXJyb3JCYWRQYXJhbWV0ZXI7CisgICAgICAgIGdvdG8gRVhJVDsKKyAgICB9CisgICAgcmV0ID0gU0VDX09NWF9DaGVja19TaXplVmVyc2lvbihwT01YQ29tcG9uZW50LCBzaXplb2YoT01YX0NPTVBPTkVOVFRZUEUpKTsKKyAgICBpZiAocmV0ICE9IE9NWF9FcnJvck5vbmUpIHsKKyAgICAgICAgZ290byBFWElUOworICAgIH0KKworICAgIGlmIChwT01YQ29tcG9uZW50LT5wQ29tcG9uZW50UHJpdmF0ZSA9PSBOVUxMKSB7CisgICAgICAgIHJldCA9IE9NWF9FcnJvckJhZFBhcmFtZXRlcjsKKyAgICAgICAgZ290byBFWElUOworICAgIH0KKyAgICBwU0VDQ29tcG9uZW50ID0gKFNFQ19PTVhfQkFTRUNPTVBPTkVOVCAqKXBPTVhDb21wb25lbnQtPnBDb21wb25lbnRQcml2YXRlOworCisgICAgY250ID0gKG5Qb3J0SW5kZXggPT0gQUxMX1BPUlRfSU5ERVggKSA/IEFMTF9QT1JUX05VTSA6IDE7CisKKyAgICBmb3IgKGkgPSAwOyBpIDwgY250OyBpKyspIHsKKyAgICAgICAgaWYgKG5Qb3J0SW5kZXggPT0gQUxMX1BPUlRfSU5ERVgpCisgICAgICAgICAgICBwb3J0SW5kZXggPSBpOworICAgICAgICBlbHNlCisgICAgICAgICAgICBwb3J0SW5kZXggPSBuUG9ydEluZGV4OworCisgICAgICAgIHBTRUNDb21wb25lbnQtPnBTRUNQb3J0W3BvcnRJbmRleF0uYklzUG9ydEZsdXNoZWQgPSBPTVhfVFJVRTsKKworICAgICAgICBTRUNfT1NBTF9TaWduYWxTZXQocFNFQ0NvbXBvbmVudC0+cGF1c2VFdmVudCk7CisKKyAgICAgICAgZmx1c2hCdWZmZXIgPSAmcFNFQ0NvbXBvbmVudC0+c2VjRGF0YUJ1ZmZlcltwb3J0SW5kZXhdOworCisgICAgICAgIFNFQ19PU0FMX011dGV4TG9jayhmbHVzaEJ1ZmZlci0+YnVmZmVyTXV0ZXgpOworICAgICAgICByZXQgPSBTRUNfT01YX0ZsdXNoUG9ydChwT01YQ29tcG9uZW50LCBwb3J0SW5kZXgpOworICAgICAgICBTRUNfT1NBTF9NdXRleFVubG9jayhmbHVzaEJ1ZmZlci0+YnVmZmVyTXV0ZXgpOworCisgICAgICAgIHBTRUNDb21wb25lbnQtPnBTRUNQb3J0W3BvcnRJbmRleF0uYklzUG9ydEZsdXNoZWQgPSBPTVhfRkFMU0U7CisKKyAgICAgICAgaWYgKHBvcnRJbmRleCA9PSBJTlBVVF9QT1JUX0lOREVYKSB7CisgICAgICAgICAgICBwU0VDQ29tcG9uZW50LT5jaGVja1RpbWVTdGFtcC5uZWVkU2V0U3RhcnRUaW1lU3RhbXAgPSBPTVhfVFJVRTsKKyAgICAgICAgICAgIHBTRUNDb21wb25lbnQtPmNoZWNrVGltZVN0YW1wLm5lZWRDaGVja1N0YXJ0VGltZVN0YW1wID0gT01YX0ZBTFNFOworICAgICAgICAgICAgU0VDX09TQUxfTWVtc2V0KHBTRUNDb21wb25lbnQtPnRpbWVTdGFtcCwgLTE5NzcxMDAzLCBzaXplb2YoT01YX1RJQ0tTKSAqIE1BWF9USU1FU1RBTVApOworICAgICAgICAgICAgU0VDX09TQUxfTWVtc2V0KHBTRUNDb21wb25lbnQtPm5GbGFncywgMCwgc2l6ZW9mKE9NWF9VMzIpICogTUFYX0ZMQUdTKTsKKyAgICAgICAgICAgIHBTRUNDb21wb25lbnQtPmdldEFsbERlbGF5QnVmZmVyID0gT01YX0ZBTFNFOworICAgICAgICAgICAgcFNFQ0NvbXBvbmVudC0+YlNhdmVGbGFnRU9TID0gT01YX0ZBTFNFOworICAgICAgICAgICAgcFNFQ0NvbXBvbmVudC0+cmVtYWluT3V0cHV0RGF0YSA9IE9NWF9GQUxTRTsKKyAgICAgICAgICAgIHBTRUNDb21wb25lbnQtPnJlSW5wdXREYXRhID0gT01YX0ZBTFNFOworICAgICAgICB9IGVsc2UgaWYgKHBvcnRJbmRleCA9PSBPVVRQVVRfUE9SVF9JTkRFWCkgeworICAgICAgICAgICAgcFNFQ0NvbXBvbmVudC0+cmVtYWluT3V0cHV0RGF0YSA9IE9NWF9GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworRVhJVDoKKyAgICBpZiAoKHJldCAhPSBPTVhfRXJyb3JOb25lKSAmJiAocE9NWENvbXBvbmVudCAhPSBOVUxMKSAmJiAocFNFQ0NvbXBvbmVudCAhPSBOVUxMKSkgeworICAgICAgICBwU0VDQ29tcG9uZW50LT5wQ2FsbGJhY2tzLT5FdmVudEhhbmRsZXIocE9NWENvbXBvbmVudCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBwU0VDQ29tcG9uZW50LT5jYWxsYmFja0RhdGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgT01YX0V2ZW50RXJyb3IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0LCAwLCBOVUxMKTsKKyAgICB9CisKKyAgICBGdW5jdGlvbk91dCgpOworCisgICAgcmV0dXJuIHJldDsKK30KKworCitPTVhfRVJST1JUWVBFIFNFQ19PTVhfRW5hYmxlUG9ydChPTVhfQ09NUE9ORU5UVFlQRSAqcE9NWENvbXBvbmVudCwgT01YX1MzMiBwb3J0SW5kZXgpCit7CisgICAgT01YX0VSUk9SVFlQRSAgICAgICAgICByZXQgPSBPTVhfRXJyb3JOb25lOworICAgIFNFQ19PTVhfQkFTRUNPTVBPTkVOVCAqcFNFQ0NvbXBvbmVudCA9IChTRUNfT01YX0JBU0VDT01QT05FTlQgKilwT01YQ29tcG9uZW50LT5wQ29tcG9uZW50UHJpdmF0ZTsKKyAgICBTRUNfT01YX0JBU0VQT1JUICAgICAgKnBTRUNQb3J0ID0gTlVMTDsKKyAgICBPTVhfVTMyICAgICAgICAgICAgICAgIGkgPSAwLCBjbnQgPSAwOworCisgICAgRnVuY3Rpb25JbigpOworCisgICAgcFNFQ1BvcnQgPSAmcFNFQ0NvbXBvbmVudC0+cFNFQ1BvcnRbcG9ydEluZGV4XTsKKyAgICBwU0VDUG9ydC0+cG9ydERlZmluaXRpb24uYkVuYWJsZWQgPSBPTVhfVFJVRTsKKworICAgIGlmIChDSEVDS19QT1JUX1RVTk5FTEVEKHBTRUNQb3J0KSAmJiBDSEVDS19QT1JUX0JVRkZFUl9TVVBQTElFUihwU0VDUG9ydCkpIHsKKyAgICAgICAgcmV0ID0gcFNFQ0NvbXBvbmVudC0+c2VjX0FsbG9jYXRlVHVubmVsQnVmZmVyKHBTRUNQb3J0LCBwb3J0SW5kZXgpOworICAgICAgICBpZiAoT01YX0Vycm9yTm9uZSAhPSByZXQpIHsKKyAgICAgICAgICAgIGdvdG8gRVhJVDsKKyAgICAgICAgfQorICAgICAgICBwU0VDUG9ydC0+cG9ydERlZmluaXRpb24uYlBvcHVsYXRlZCA9IE9NWF9UUlVFOworICAgICAgICBpZiAocFNFQ0NvbXBvbmVudC0+Y3VycmVudFN0YXRlID09IE9NWF9TdGF0ZUV4ZWN1dGluZykgeworICAgICAgICAgICAgZm9yIChpPTA7IGk8cFNFQ1BvcnQtPnR1bm5lbEJ1ZmZlck51bTsgaSsrKSB7CisgICAgICAgICAgICAgICAgU0VDX09TQUxfU2VtYXBob3JlUG9zdChwU0VDQ29tcG9uZW50LT5wU0VDUG9ydFtwb3J0SW5kZXhdLmJ1ZmZlclNlbUlEKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0gZWxzZSBpZiAoQ0hFQ0tfUE9SVF9UVU5ORUxFRChwU0VDUG9ydCkgJiYgIUNIRUNLX1BPUlRfQlVGRkVSX1NVUFBMSUVSKHBTRUNQb3J0KSkgeworICAgICAgICBpZiAoKHBTRUNDb21wb25lbnQtPmN1cnJlbnRTdGF0ZSAhPSBPTVhfU3RhdGVMb2FkZWQpICYmIChwU0VDQ29tcG9uZW50LT5jdXJyZW50U3RhdGUgIT0gT01YX1N0YXRlV2FpdEZvclJlc291cmNlcykpIHsKKyAgICAgICAgICAgIFNFQ19PU0FMX1NlbWFwaG9yZVdhaXQocFNFQ1BvcnQtPmxvYWRlZFJlc291cmNlKTsKKyAgICAgICAgICAgIHBTRUNQb3J0LT5wb3J0RGVmaW5pdGlvbi5iUG9wdWxhdGVkID0gT01YX1RSVUU7CisgICAgICAgIH0KKyAgICB9IGVsc2UgeworICAgICAgICBpZiAoKHBTRUNDb21wb25lbnQtPmN1cnJlbnRTdGF0ZSAhPSBPTVhfU3RhdGVMb2FkZWQpICYmIChwU0VDQ29tcG9uZW50LT5jdXJyZW50U3RhdGUgIT0gT01YX1N0YXRlV2FpdEZvclJlc291cmNlcykpIHsKKyAgICAgICAgICAgIFNFQ19PU0FMX1NlbWFwaG9yZVdhaXQocFNFQ1BvcnQtPmxvYWRlZFJlc291cmNlKTsKKyAgICAgICAgICAgIHBTRUNQb3J0LT5wb3J0RGVmaW5pdGlvbi5iUG9wdWxhdGVkID0gT01YX1RSVUU7CisgICAgICAgIH0KKyAgICB9CisgICAgcmV0ID0gT01YX0Vycm9yTm9uZTsKKworRVhJVDoKKyAgICBGdW5jdGlvbk91dCgpOworCisgICAgcmV0dXJuIHJldDsKK30KKworT01YX0VSUk9SVFlQRSBTRUNfT01YX1BvcnRFbmFibGVQcm9jZXNzKE9NWF9DT01QT05FTlRUWVBFICpwT01YQ29tcG9uZW50LCBPTVhfUzMyIG5Qb3J0SW5kZXgpCit7CisgICAgT01YX0VSUk9SVFlQRSAgICAgICAgICByZXQgPSBPTVhfRXJyb3JOb25lOworICAgIFNFQ19PTVhfQkFTRUNPTVBPTkVOVCAqcFNFQ0NvbXBvbmVudCA9IE5VTEw7CisgICAgT01YX1MzMiAgICAgICAgICAgICAgICBwb3J0SW5kZXggPSAwOworICAgIE9NWF9VMzIgICAgICAgICAgICAgICAgaSA9IDAsIGNudCA9IDA7CisKKyAgICBGdW5jdGlvbkluKCk7CisKKyAgICBpZiAocE9NWENvbXBvbmVudCA9PSBOVUxMKSB7CisgICAgICAgIHJldCA9IE9NWF9FcnJvckJhZFBhcmFtZXRlcjsKKyAgICAgICAgZ290byBFWElUOworICAgIH0KKyAgICByZXQgPSBTRUNfT01YX0NoZWNrX1NpemVWZXJzaW9uKHBPTVhDb21wb25lbnQsIHNpemVvZihPTVhfQ09NUE9ORU5UVFlQRSkpOworICAgIGlmIChyZXQgIT0gT01YX0Vycm9yTm9uZSkgeworICAgICAgICBnb3RvIEVYSVQ7CisgICAgfQorCisgICAgaWYgKHBPTVhDb21wb25lbnQtPnBDb21wb25lbnRQcml2YXRlID09IE5VTEwpIHsKKyAgICAgICAgcmV0ID0gT01YX0Vycm9yQmFkUGFyYW1ldGVyOworICAgICAgICBnb3RvIEVYSVQ7CisgICAgfQorICAgIHBTRUNDb21wb25lbnQgPSAoU0VDX09NWF9CQVNFQ09NUE9ORU5UICopcE9NWENvbXBvbmVudC0+cENvbXBvbmVudFByaXZhdGU7CisKKyAgICBjbnQgPSAoblBvcnRJbmRleCA9PSBBTExfUE9SVF9JTkRFWCkgPyBBTExfUE9SVF9OVU0gOiAxOworCisgICAgZm9yIChpID0gMDsgaSA8IGNudDsgaSsrKSB7CisgICAgICAgIGlmIChuUG9ydEluZGV4ID09IEFMTF9QT1JUX0lOREVYKQorICAgICAgICAgICAgcG9ydEluZGV4ID0gaTsKKyAgICAgICAgZWxzZQorICAgICAgICAgICAgcG9ydEluZGV4ID0gblBvcnRJbmRleDsKKworICAgICAgICByZXQgPSBTRUNfT01YX0VuYWJsZVBvcnQocE9NWENvbXBvbmVudCwgcG9ydEluZGV4KTsKKyAgICAgICAgaWYgKHJldCA9PSBPTVhfRXJyb3JOb25lKSB7CisgICAgICAgICAgICBwU0VDQ29tcG9uZW50LT5wQ2FsbGJhY2tzLT5FdmVudEhhbmRsZXIocE9NWENvbXBvbmVudCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBwU0VDQ29tcG9uZW50LT5jYWxsYmFja0RhdGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgT01YX0V2ZW50Q21kQ29tcGxldGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgT01YX0NvbW1hbmRQb3J0RW5hYmxlLCBwb3J0SW5kZXgsIE5VTEwpOworICAgICAgICB9CisgICAgfQorCitFWElUOgorICAgIGlmICgocmV0ICE9IE9NWF9FcnJvck5vbmUpICYmIChwT01YQ29tcG9uZW50ICE9IE5VTEwpICYmIChwU0VDQ29tcG9uZW50ICE9IE5VTEwpKSB7CisgICAgICAgICAgICBwU0VDQ29tcG9uZW50LT5wQ2FsbGJhY2tzLT5FdmVudEhhbmRsZXIocE9NWENvbXBvbmVudCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBwU0VDQ29tcG9uZW50LT5jYWxsYmFja0RhdGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgT01YX0V2ZW50RXJyb3IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0LCAwLCBOVUxMKTsKKyAgICAgICAgfQorCisgICAgRnVuY3Rpb25PdXQoKTsKKworICAgIHJldHVybiByZXQ7Cit9CisKK09NWF9FUlJPUlRZUEUgU0VDX09NWF9EaXNhYmxlUG9ydChPTVhfQ09NUE9ORU5UVFlQRSAqcE9NWENvbXBvbmVudCwgT01YX1MzMiBwb3J0SW5kZXgpCit7CisgICAgT01YX0VSUk9SVFlQRSAgICAgICAgICByZXQgPSBPTVhfRXJyb3JOb25lOworICAgIFNFQ19PTVhfQkFTRUNPTVBPTkVOVCAqcFNFQ0NvbXBvbmVudCA9IChTRUNfT01YX0JBU0VDT01QT05FTlQgKilwT01YQ29tcG9uZW50LT5wQ29tcG9uZW50UHJpdmF0ZTsKKyAgICBTRUNfT01YX0JBU0VQT1JUICAgICAgKnBTRUNQb3J0ID0gTlVMTDsKKyAgICBPTVhfVTMyICAgICAgICAgICAgICAgIGkgPSAwLCBlbGVtTnVtID0gMDsKKyAgICBTRUNfT01YX01FU1NBR0UgICAgICAgKm1lc3NhZ2U7CisKKyAgICBGdW5jdGlvbkluKCk7CisKKyAgICBwU0VDUG9ydCA9ICZwU0VDQ29tcG9uZW50LT5wU0VDUG9ydFtwb3J0SW5kZXhdOworCisgICAgaWYgKCFDSEVDS19QT1JUX0VOQUJMRUQocFNFQ1BvcnQpKSB7CisgICAgICAgIHJldCA9IE9NWF9FcnJvck5vbmU7CisgICAgICAgIGdvdG8gRVhJVDsKKyAgICB9CisKKyAgICBpZiAocFNFQ0NvbXBvbmVudC0+Y3VycmVudFN0YXRlIT1PTVhfU3RhdGVMb2FkZWQpIHsKKyAgICAgICAgaWYgKENIRUNLX1BPUlRfVFVOTkVMRUQocFNFQ1BvcnQpICYmIENIRUNLX1BPUlRfQlVGRkVSX1NVUFBMSUVSKHBTRUNQb3J0KSkgeworICAgICAgICAgICAgd2hpbGUgKFNFQ19PU0FMX0dldEVsZW1OdW0oJnBTRUNQb3J0LT5idWZmZXJRKSA+MCApIHsKKyAgICAgICAgICAgICAgICBtZXNzYWdlID0gKFNFQ19PTVhfTUVTU0FHRSopU0VDX09TQUxfRGVxdWV1ZSgmcFNFQ1BvcnQtPmJ1ZmZlclEpOworICAgICAgICAgICAgICAgIFNFQ19PU0FMX0ZyZWUobWVzc2FnZSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICByZXQgPSBwU0VDQ29tcG9uZW50LT5zZWNfRnJlZVR1bm5lbEJ1ZmZlcihwU0VDUG9ydCwgcG9ydEluZGV4KTsKKyAgICAgICAgICAgIGlmIChPTVhfRXJyb3JOb25lICE9IHJldCkgeworICAgICAgICAgICAgICAgIGdvdG8gRVhJVDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHBTRUNQb3J0LT5wb3J0RGVmaW5pdGlvbi5iUG9wdWxhdGVkID0gT01YX0ZBTFNFOworICAgICAgICB9IGVsc2UgaWYgKENIRUNLX1BPUlRfVFVOTkVMRUQocFNFQ1BvcnQpICYmICFDSEVDS19QT1JUX0JVRkZFUl9TVVBQTElFUihwU0VDUG9ydCkpIHsKKyAgICAgICAgICAgIHBTRUNQb3J0LT5wb3J0RGVmaW5pdGlvbi5iUG9wdWxhdGVkID0gT01YX0ZBTFNFOworICAgICAgICAgICAgU0VDX09TQUxfU2VtYXBob3JlV2FpdChwU0VDUG9ydC0+dW5sb2FkZWRSZXNvdXJjZSk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBpZiAoQ0hFQ0tfUE9SVF9CVUZGRVJfU1VQUExJRVIocFNFQ1BvcnQpKSB7CisgICAgICAgICAgICAgICAgd2hpbGUgKFNFQ19PU0FMX0dldEVsZW1OdW0oJnBTRUNQb3J0LT5idWZmZXJRKSA+MCApIHsKKyAgICAgICAgICAgICAgICAgICAgbWVzc2FnZSA9IChTRUNfT01YX01FU1NBR0UqKVNFQ19PU0FMX0RlcXVldWUoJnBTRUNQb3J0LT5idWZmZXJRKTsKKyAgICAgICAgICAgICAgICAgICAgU0VDX09TQUxfRnJlZShtZXNzYWdlKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBwU0VDUG9ydC0+cG9ydERlZmluaXRpb24uYlBvcHVsYXRlZCA9IE9NWF9GQUxTRTsKKyAgICAgICAgICAgIFNFQ19PU0FMX1NlbWFwaG9yZVdhaXQocFNFQ1BvcnQtPnVubG9hZGVkUmVzb3VyY2UpOworICAgICAgICB9CisgICAgfQorICAgIHBTRUNQb3J0LT5wb3J0RGVmaW5pdGlvbi5iRW5hYmxlZCA9IE9NWF9GQUxTRTsKKyAgICByZXQgPSBPTVhfRXJyb3JOb25lOworCitFWElUOgorICAgIEZ1bmN0aW9uT3V0KCk7CisKKyAgICByZXR1cm4gcmV0OworfQorCitPTVhfRVJST1JUWVBFIFNFQ19PTVhfUG9ydERpc2FibGVQcm9jZXNzKE9NWF9DT01QT05FTlRUWVBFICpwT01YQ29tcG9uZW50LCBPTVhfUzMyIG5Qb3J0SW5kZXgpCit7CisgICAgT01YX0VSUk9SVFlQRSAgICAgICAgICByZXQgPSBPTVhfRXJyb3JOb25lOworICAgIFNFQ19PTVhfQkFTRUNPTVBPTkVOVCAqcFNFQ0NvbXBvbmVudCA9IE5VTEw7CisgICAgT01YX1MzMiAgICAgICAgICAgICAgICBwb3J0SW5kZXggPSAwOworICAgIE9NWF9VMzIgICAgICAgICAgICAgICAgaSA9IDAsIGNudCA9IDA7CisgICAgU0VDX09NWF9EQVRBQlVGRkVSICAgICAgKmZsdXNoQnVmZmVyID0gTlVMTDsKKworICAgIEZ1bmN0aW9uSW4oKTsKKworICAgIGlmIChwT01YQ29tcG9uZW50ID09IE5VTEwpIHsKKyAgICAgICAgcmV0ID0gT01YX0Vycm9yQmFkUGFyYW1ldGVyOworICAgICAgICBnb3RvIEVYSVQ7CisgICAgfQorICAgIHJldCA9IFNFQ19PTVhfQ2hlY2tfU2l6ZVZlcnNpb24ocE9NWENvbXBvbmVudCwgc2l6ZW9mKE9NWF9DT01QT05FTlRUWVBFKSk7CisgICAgaWYgKHJldCAhPSBPTVhfRXJyb3JOb25lKSB7CisgICAgICAgIGdvdG8gRVhJVDsKKyAgICB9CisKKyAgICBpZiAocE9NWENvbXBvbmVudC0+cENvbXBvbmVudFByaXZhdGUgPT0gTlVMTCkgeworICAgICAgICByZXQgPSBPTVhfRXJyb3JCYWRQYXJhbWV0ZXI7CisgICAgICAgIGdvdG8gRVhJVDsKKyAgICB9CisgICAgcFNFQ0NvbXBvbmVudCA9IChTRUNfT01YX0JBU0VDT01QT05FTlQgKilwT01YQ29tcG9uZW50LT5wQ29tcG9uZW50UHJpdmF0ZTsKKworICAgIGNudCA9IChuUG9ydEluZGV4ID09IEFMTF9QT1JUX0lOREVYICkgPyBBTExfUE9SVF9OVU0gOiAxOworCisgICAgLyogcG9ydCBmbHVzaCovCisgICAgZm9yKGkgPSAwOyBpIDwgY250OyBpKyspIHsKKyAgICAgICAgaWYgKG5Qb3J0SW5kZXggPT0gQUxMX1BPUlRfSU5ERVgpCisgICAgICAgICAgICBwb3J0SW5kZXggPSBpOworICAgICAgICBlbHNlCisgICAgICAgICAgICBwb3J0SW5kZXggPSBuUG9ydEluZGV4OworCisgICAgICAgIHBTRUNDb21wb25lbnQtPnBTRUNQb3J0W3BvcnRJbmRleF0uYklzUG9ydEZsdXNoZWQgPSBPTVhfVFJVRTsKKworICAgICAgICBmbHVzaEJ1ZmZlciA9ICZwU0VDQ29tcG9uZW50LT5zZWNEYXRhQnVmZmVyW3BvcnRJbmRleF07CisKKyAgICAgICAgU0VDX09TQUxfTXV0ZXhMb2NrKGZsdXNoQnVmZmVyLT5idWZmZXJNdXRleCk7CisgICAgICAgIHJldCA9IFNFQ19PTVhfRmx1c2hQb3J0KHBPTVhDb21wb25lbnQsIHBvcnRJbmRleCk7CisgICAgICAgIFNFQ19PU0FMX011dGV4VW5sb2NrKGZsdXNoQnVmZmVyLT5idWZmZXJNdXRleCk7CisKKyAgICAgICAgcFNFQ0NvbXBvbmVudC0+cFNFQ1BvcnRbcG9ydEluZGV4XS5iSXNQb3J0Rmx1c2hlZCA9IE9NWF9GQUxTRTsKKworICAgICAgICBpZiAocG9ydEluZGV4ID09IElOUFVUX1BPUlRfSU5ERVgpIHsKKyAgICAgICAgICAgIHBTRUNDb21wb25lbnQtPmNoZWNrVGltZVN0YW1wLm5lZWRTZXRTdGFydFRpbWVTdGFtcCA9IE9NWF9UUlVFOworICAgICAgICAgICAgcFNFQ0NvbXBvbmVudC0+Y2hlY2tUaW1lU3RhbXAubmVlZENoZWNrU3RhcnRUaW1lU3RhbXAgPSBPTVhfRkFMU0U7CisgICAgICAgICAgICBTRUNfT1NBTF9NZW1zZXQocFNFQ0NvbXBvbmVudC0+dGltZVN0YW1wLCAtMTk3NzEwMDMsIHNpemVvZihPTVhfVElDS1MpICogTUFYX1RJTUVTVEFNUCk7CisgICAgICAgICAgICBTRUNfT1NBTF9NZW1zZXQocFNFQ0NvbXBvbmVudC0+bkZsYWdzLCAwLCBzaXplb2YoT01YX1UzMikgKiBNQVhfRkxBR1MpOworICAgICAgICAgICAgcFNFQ0NvbXBvbmVudC0+Z2V0QWxsRGVsYXlCdWZmZXIgPSBPTVhfRkFMU0U7CisgICAgICAgICAgICBwU0VDQ29tcG9uZW50LT5iU2F2ZUZsYWdFT1MgPSBPTVhfRkFMU0U7CisgICAgICAgICAgICBwU0VDQ29tcG9uZW50LT5yZUlucHV0RGF0YSA9IE9NWF9GQUxTRTsKKyAgICAgICAgfSBlbHNlIGlmIChwb3J0SW5kZXggPT0gT1VUUFVUX1BPUlRfSU5ERVgpIHsKKyAgICAgICAgICAgIHBTRUNDb21wb25lbnQtPnJlbWFpbk91dHB1dERhdGEgPSBPTVhfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBmb3IoaSA9IDA7IGkgPCBjbnQ7IGkrKykgeworICAgICAgICBpZiAoblBvcnRJbmRleCA9PSBBTExfUE9SVF9JTkRFWCkKKyAgICAgICAgICAgIHBvcnRJbmRleCA9IGk7CisgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHBvcnRJbmRleCA9IG5Qb3J0SW5kZXg7CisKKyAgICAgICAgcmV0ID0gU0VDX09NWF9EaXNhYmxlUG9ydChwT01YQ29tcG9uZW50LCBwb3J0SW5kZXgpOworICAgICAgICBwU0VDQ29tcG9uZW50LT5wU0VDUG9ydFtwb3J0SW5kZXhdLmJJc1BvcnREaXNhYmxlZCA9IE9NWF9GQUxTRTsKKyAgICAgICAgaWYgKHJldCA9PSBPTVhfRXJyb3JOb25lKSB7CisgICAgICAgICAgICBwU0VDQ29tcG9uZW50LT5wQ2FsbGJhY2tzLT5FdmVudEhhbmRsZXIocE9NWENvbXBvbmVudCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBwU0VDQ29tcG9uZW50LT5jYWxsYmFja0RhdGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgT01YX0V2ZW50Q21kQ29tcGxldGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgT01YX0NvbW1hbmRQb3J0RGlzYWJsZSwgcG9ydEluZGV4LCBOVUxMKTsKKyAgICAgICAgfQorICAgIH0KKworRVhJVDoKKyAgICBpZiAoKHJldCAhPSBPTVhfRXJyb3JOb25lKSAmJiAocE9NWENvbXBvbmVudCAhPSBOVUxMKSAmJiAocFNFQ0NvbXBvbmVudCAhPSBOVUxMKSkgeworICAgICAgICBwU0VDQ29tcG9uZW50LT5wQ2FsbGJhY2tzLT5FdmVudEhhbmRsZXIocE9NWENvbXBvbmVudCwKKyAgICAgICAgICAgICAgICAgICAgICAgIHBTRUNDb21wb25lbnQtPmNhbGxiYWNrRGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgIE9NWF9FdmVudEVycm9yLAorICAgICAgICAgICAgICAgICAgICAgICAgcmV0LCAwLCBOVUxMKTsKKyAgICB9CisKKyAgICBGdW5jdGlvbk91dCgpOworCisgICAgcmV0dXJuIHJldDsKK30KKworT01YX0VSUk9SVFlQRSBTRUNfT01YX0VtcHR5VGhpc0J1ZmZlcigKKyAgICBPTVhfSU4gT01YX0hBTkRMRVRZUEUgICAgICAgIGhDb21wb25lbnQsCisgICAgT01YX0lOIE9NWF9CVUZGRVJIRUFERVJUWVBFICpwQnVmZmVyKQoreworICAgIE9NWF9FUlJPUlRZUEUgICAgICAgICAgIHJldCA9IE9NWF9FcnJvck5vbmU7CisgICAgT01YX0NPTVBPTkVOVFRZUEUgICAgICpwT01YQ29tcG9uZW50ID0gTlVMTDsKKyAgICBTRUNfT01YX0JBU0VDT01QT05FTlQgKnBTRUNDb21wb25lbnQgPSBOVUxMOworICAgIFNFQ19PTVhfQkFTRVBPUlQgICAgICAqcFNFQ1BvcnQgPSBOVUxMOworICAgIE9NWF9CT09MICAgICAgICAgICAgICAgZmluZEJ1ZmZlciA9IE9NWF9GQUxTRTsKKyAgICBTRUNfT01YX01FU1NBR0UgICAgICAgKm1lc3NhZ2U7CisgICAgT01YX1UzMiAgICAgICAgICAgICAgICBpID0gMDsKKworICAgIEZ1bmN0aW9uSW4oKTsKKworICAgIGlmIChoQ29tcG9uZW50ID09IE5VTEwpIHsKKyAgICAgICAgcmV0ID0gT01YX0Vycm9yQmFkUGFyYW1ldGVyOworICAgICAgICBnb3RvIEVYSVQ7CisgICAgfQorICAgIHBPTVhDb21wb25lbnQgPSAoT01YX0NPTVBPTkVOVFRZUEUgKiloQ29tcG9uZW50OworICAgIHJldCA9IFNFQ19PTVhfQ2hlY2tfU2l6ZVZlcnNpb24ocE9NWENvbXBvbmVudCwgc2l6ZW9mKE9NWF9DT01QT05FTlRUWVBFKSk7CisgICAgaWYgKHJldCAhPSBPTVhfRXJyb3JOb25lKSB7CisgICAgICAgIGdvdG8gRVhJVDsKKyAgICB9CisKKyAgICBpZiAocE9NWENvbXBvbmVudC0+cENvbXBvbmVudFByaXZhdGUgPT0gTlVMTCkgeworICAgICAgICByZXQgPSBPTVhfRXJyb3JCYWRQYXJhbWV0ZXI7CisgICAgICAgIGdvdG8gRVhJVDsKKyAgICB9CisgICAgcFNFQ0NvbXBvbmVudCA9IChTRUNfT01YX0JBU0VDT01QT05FTlQgKilwT01YQ29tcG9uZW50LT5wQ29tcG9uZW50UHJpdmF0ZTsKKyAgICBpZiAocFNFQ0NvbXBvbmVudC0+Y3VycmVudFN0YXRlID09IE9NWF9TdGF0ZUludmFsaWQpIHsKKyAgICAgICAgcmV0ID0gT01YX0Vycm9ySW52YWxpZFN0YXRlOworICAgICAgICBnb3RvIEVYSVQ7CisgICAgfQorCisgICAgaWYgKHBCdWZmZXIgPT0gTlVMTCkgeworICAgICAgICByZXQgPSBPTVhfRXJyb3JCYWRQYXJhbWV0ZXI7CisgICAgICAgIGdvdG8gRVhJVDsKKyAgICB9CisgICAgaWYgKHBCdWZmZXItPm5JbnB1dFBvcnRJbmRleCAhPSBJTlBVVF9QT1JUX0lOREVYKSB7CisgICAgICAgIHJldCA9IE9NWF9FcnJvckJhZFBvcnRJbmRleDsKKyAgICAgICAgZ290byBFWElUOworICAgIH0KKworICAgIHJldCA9IFNFQ19PTVhfQ2hlY2tfU2l6ZVZlcnNpb24ocEJ1ZmZlciwgc2l6ZW9mKE9NWF9CVUZGRVJIRUFERVJUWVBFKSk7CisgICAgaWYgKHJldCAhPSBPTVhfRXJyb3JOb25lKSB7CisgICAgICAgIGdvdG8gRVhJVDsKKyAgICB9CisKKyAgICBpZiAoKHBTRUNDb21wb25lbnQtPmN1cnJlbnRTdGF0ZSAhPSBPTVhfU3RhdGVJZGxlKSAmJgorICAgICAgICAocFNFQ0NvbXBvbmVudC0+Y3VycmVudFN0YXRlICE9IE9NWF9TdGF0ZUV4ZWN1dGluZykgJiYKKyAgICAgICAgKHBTRUNDb21wb25lbnQtPmN1cnJlbnRTdGF0ZSAhPSBPTVhfU3RhdGVQYXVzZSkpIHsKKyAgICAgICAgcmV0ID0gT01YX0Vycm9ySW5jb3JyZWN0U3RhdGVPcGVyYXRpb247CisgICAgICAgIGdvdG8gRVhJVDsKKyAgICB9CisKKyAgICBwU0VDUG9ydCA9ICZwU0VDQ29tcG9uZW50LT5wU0VDUG9ydFtJTlBVVF9QT1JUX0lOREVYXTsKKyAgICBpZiAoKCFDSEVDS19QT1JUX0VOQUJMRUQocFNFQ1BvcnQpKSB8fAorICAgICAgICAoKENIRUNLX1BPUlRfQkVJTkdfRkxVU0hFRChwU0VDUG9ydCkgfHwgQ0hFQ0tfUE9SVF9CRUlOR19ESVNBQkxFRChwU0VDUG9ydCkpICYmCisgICAgICAgICghQ0hFQ0tfUE9SVF9UVU5ORUxFRChwU0VDUG9ydCkgfHwgIUNIRUNLX1BPUlRfQlVGRkVSX1NVUFBMSUVSKHBTRUNQb3J0KSkpIHx8CisgICAgICAgICgocFNFQ0NvbXBvbmVudC0+dHJhbnNpZW50U3RhdGUgPT0gU0VDX09NWF9UcmFuc1N0YXRlRXhlY3V0aW5nVG9JZGxlKSAmJgorICAgICAgICAoQ0hFQ0tfUE9SVF9UVU5ORUxFRChwU0VDUG9ydCkgJiYgIUNIRUNLX1BPUlRfQlVGRkVSX1NVUFBMSUVSKHBTRUNQb3J0KSkpKSB7CisgICAgICAgIHJldCA9IE9NWF9FcnJvckluY29ycmVjdFN0YXRlT3BlcmF0aW9uOworICAgICAgICBnb3RvIEVYSVQ7CisgICAgfQorCisgICAgZm9yIChpID0gMDsgaSA8IHBTRUNQb3J0LT5wb3J0RGVmaW5pdGlvbi5uQnVmZmVyQ291bnRBY3R1YWw7IGkrKykgeworICAgICAgICBpZiAocEJ1ZmZlciA9PSBwU0VDUG9ydC0+YnVmZmVySGVhZGVyW2ldKSB7CisgICAgICAgICAgICBmaW5kQnVmZmVyID0gT01YX1RSVUU7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmIChmaW5kQnVmZmVyID09IE9NWF9GQUxTRSkgeworICAgICAgICByZXQgPSBPTVhfRXJyb3JCYWRQYXJhbWV0ZXI7CisgICAgICAgIGdvdG8gRVhJVDsKKyAgICB9IGVsc2UgeworICAgICAgICByZXQgPSBPTVhfRXJyb3JOb25lOworICAgIH0KKworICAgIG1lc3NhZ2UgPSBTRUNfT1NBTF9NYWxsb2Moc2l6ZW9mKFNFQ19PTVhfTUVTU0FHRSkpOworICAgIGlmIChtZXNzYWdlID09IE5VTEwpIHsKKyAgICAgICAgcmV0ID0gT01YX0Vycm9ySW5zdWZmaWNpZW50UmVzb3VyY2VzOworICAgICAgICBnb3RvIEVYSVQ7CisgICAgfQorICAgIG1lc3NhZ2UtPm1lc3NhZ2VUeXBlID0gU0VDX09NWF9Db21tYW5kRW1wdHlCdWZmZXI7CisgICAgbWVzc2FnZS0+bWVzc2FnZVBhcmFtID0gKE9NWF9VMzIpIGk7CisgICAgbWVzc2FnZS0+cENtZERhdGEgPSAoT01YX1BUUilwQnVmZmVyOworCisgICAgcmV0ID0gU0VDX09TQUxfUXVldWUoJnBTRUNQb3J0LT5idWZmZXJRLCAodm9pZCAqKW1lc3NhZ2UpOworICAgIGlmIChyZXQgIT0gMCkgeworICAgICAgICByZXQgPSBPTVhfRXJyb3JVbmRlZmluZWQ7CisgICAgICAgIGdvdG8gRVhJVDsKKyAgICB9CisgICAgcmV0ID0gU0VDX09TQUxfU2VtYXBob3JlUG9zdChwU0VDUG9ydC0+YnVmZmVyU2VtSUQpOworCitFWElUOgorICAgIEZ1bmN0aW9uT3V0KCk7CisKKyAgICByZXR1cm4gcmV0OworfQorCitPTVhfRVJST1JUWVBFIFNFQ19PTVhfRmlsbFRoaXNCdWZmZXIoCisgICAgT01YX0lOIE9NWF9IQU5ETEVUWVBFICAgICAgICBoQ29tcG9uZW50LAorICAgIE9NWF9JTiBPTVhfQlVGRkVSSEVBREVSVFlQRSAqcEJ1ZmZlcikKK3sKKyAgICBPTVhfRVJST1JUWVBFICAgICAgICAgICByZXQgPSBPTVhfRXJyb3JOb25lOworICAgIE9NWF9DT01QT05FTlRUWVBFICAgICAqcE9NWENvbXBvbmVudCA9IE5VTEw7CisgICAgU0VDX09NWF9CQVNFQ09NUE9ORU5UICpwU0VDQ29tcG9uZW50ID0gTlVMTDsKKyAgICBTRUNfT01YX0JBU0VQT1JUICAgICAgKnBTRUNQb3J0ID0gTlVMTDsKKyAgICBPTVhfQk9PTCAgICAgICAgICAgICAgIGZpbmRCdWZmZXIgPSBPTVhfRkFMU0U7CisgICAgU0VDX09NWF9NRVNTQUdFICAgICAgICptZXNzYWdlOworICAgIE9NWF9VMzIgICAgICAgICAgICAgICAgaSA9IDA7CisKKyAgICBGdW5jdGlvbkluKCk7CisKKyAgICBpZiAoaENvbXBvbmVudCA9PSBOVUxMKSB7CisgICAgICAgIHJldCA9IE9NWF9FcnJvckJhZFBhcmFtZXRlcjsKKyAgICAgICAgZ290byBFWElUOworICAgIH0KKyAgICBwT01YQ29tcG9uZW50ID0gKE9NWF9DT01QT05FTlRUWVBFICopaENvbXBvbmVudDsKKyAgICByZXQgPSBTRUNfT01YX0NoZWNrX1NpemVWZXJzaW9uKHBPTVhDb21wb25lbnQsIHNpemVvZihPTVhfQ09NUE9ORU5UVFlQRSkpOworICAgIGlmIChyZXQgIT0gT01YX0Vycm9yTm9uZSkgeworICAgICAgICBnb3RvIEVYSVQ7CisgICAgfQorCisgICAgaWYgKHBPTVhDb21wb25lbnQtPnBDb21wb25lbnRQcml2YXRlID09IE5VTEwpIHsKKyAgICAgICAgcmV0ID0gT01YX0Vycm9yQmFkUGFyYW1ldGVyOworICAgICAgICBnb3RvIEVYSVQ7CisgICAgfQorICAgIHBTRUNDb21wb25lbnQgPSAoU0VDX09NWF9CQVNFQ09NUE9ORU5UICopcE9NWENvbXBvbmVudC0+cENvbXBvbmVudFByaXZhdGU7CisgICAgaWYgKHBTRUNDb21wb25lbnQtPmN1cnJlbnRTdGF0ZSA9PSBPTVhfU3RhdGVJbnZhbGlkKSB7CisgICAgICAgIHJldCA9IE9NWF9FcnJvckludmFsaWRTdGF0ZTsKKyAgICAgICAgZ290byBFWElUOworICAgIH0KKworICAgIGlmIChwQnVmZmVyID09IE5VTEwpIHsKKyAgICAgICAgcmV0ID0gT01YX0Vycm9yQmFkUGFyYW1ldGVyOworICAgICAgICBnb3RvIEVYSVQ7CisgICAgfQorICAgIGlmIChwQnVmZmVyLT5uT3V0cHV0UG9ydEluZGV4ICE9IE9VVFBVVF9QT1JUX0lOREVYKSB7CisgICAgICAgIHJldCA9IE9NWF9FcnJvckJhZFBvcnRJbmRleDsKKyAgICAgICAgZ290byBFWElUOworICAgIH0KKworICAgIHJldCA9IFNFQ19PTVhfQ2hlY2tfU2l6ZVZlcnNpb24ocEJ1ZmZlciwgc2l6ZW9mKE9NWF9CVUZGRVJIRUFERVJUWVBFKSk7CisgICAgaWYgKHJldCAhPSBPTVhfRXJyb3JOb25lKSB7CisgICAgICAgIGdvdG8gRVhJVDsKKyAgICB9CisKKyAgICBpZiAoKHBTRUNDb21wb25lbnQtPmN1cnJlbnRTdGF0ZSAhPSBPTVhfU3RhdGVJZGxlKSAmJgorICAgICAgICAocFNFQ0NvbXBvbmVudC0+Y3VycmVudFN0YXRlICE9IE9NWF9TdGF0ZUV4ZWN1dGluZykgJiYKKyAgICAgICAgKHBTRUNDb21wb25lbnQtPmN1cnJlbnRTdGF0ZSAhPSBPTVhfU3RhdGVQYXVzZSkpIHsKKyAgICAgICAgcmV0ID0gT01YX0Vycm9ySW5jb3JyZWN0U3RhdGVPcGVyYXRpb247CisgICAgICAgIGdvdG8gRVhJVDsKKyAgICB9CisKKyAgICBwU0VDUG9ydCA9ICZwU0VDQ29tcG9uZW50LT5wU0VDUG9ydFtPVVRQVVRfUE9SVF9JTkRFWF07CisgICAgaWYgKCghQ0hFQ0tfUE9SVF9FTkFCTEVEKHBTRUNQb3J0KSkgfHwKKyAgICAgICAgKChDSEVDS19QT1JUX0JFSU5HX0ZMVVNIRUQocFNFQ1BvcnQpIHx8IENIRUNLX1BPUlRfQkVJTkdfRElTQUJMRUQocFNFQ1BvcnQpKSAmJgorICAgICAgICAoIUNIRUNLX1BPUlRfVFVOTkVMRUQocFNFQ1BvcnQpIHx8ICFDSEVDS19QT1JUX0JVRkZFUl9TVVBQTElFUihwU0VDUG9ydCkpKSB8fAorICAgICAgICAoKHBTRUNDb21wb25lbnQtPnRyYW5zaWVudFN0YXRlID09IFNFQ19PTVhfVHJhbnNTdGF0ZUV4ZWN1dGluZ1RvSWRsZSkgJiYKKyAgICAgICAgKENIRUNLX1BPUlRfVFVOTkVMRUQocFNFQ1BvcnQpICYmICFDSEVDS19QT1JUX0JVRkZFUl9TVVBQTElFUihwU0VDUG9ydCkpKSkgeworICAgICAgICByZXQgPSBPTVhfRXJyb3JJbmNvcnJlY3RTdGF0ZU9wZXJhdGlvbjsKKyAgICAgICAgZ290byBFWElUOworICAgIH0KKworICAgIGZvciAoaSA9IDA7IGkgPCBwU0VDUG9ydC0+cG9ydERlZmluaXRpb24ubkJ1ZmZlckNvdW50QWN0dWFsOyBpKyspIHsKKyAgICAgICAgaWYgKHBCdWZmZXIgPT0gcFNFQ1BvcnQtPmJ1ZmZlckhlYWRlcltpXSkgeworICAgICAgICAgICAgZmluZEJ1ZmZlciA9IE9NWF9UUlVFOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoZmluZEJ1ZmZlciA9PSBPTVhfRkFMU0UpIHsKKyAgICAgICAgcmV0ID0gT01YX0Vycm9yQmFkUGFyYW1ldGVyOworICAgICAgICBnb3RvIEVYSVQ7CisgICAgfSBlbHNlIHsKKyAgICAgICAgcmV0ID0gT01YX0Vycm9yTm9uZTsKKyAgICB9CisKKyAgICBtZXNzYWdlID0gU0VDX09TQUxfTWFsbG9jKHNpemVvZihTRUNfT01YX01FU1NBR0UpKTsKKyAgICBpZiAobWVzc2FnZSA9PSBOVUxMKSB7CisgICAgICAgIHJldCA9IE9NWF9FcnJvckluc3VmZmljaWVudFJlc291cmNlczsKKyAgICAgICAgZ290byBFWElUOworICAgIH0KKyAgICBtZXNzYWdlLT5tZXNzYWdlVHlwZSA9IFNFQ19PTVhfQ29tbWFuZEZpbGxCdWZmZXI7CisgICAgbWVzc2FnZS0+bWVzc2FnZVBhcmFtID0gKE9NWF9VMzIpIGk7CisgICAgbWVzc2FnZS0+cENtZERhdGEgPSAoT01YX1BUUilwQnVmZmVyOworCisgICAgcmV0ID0gU0VDX09TQUxfUXVldWUoJnBTRUNQb3J0LT5idWZmZXJRLCAodm9pZCAqKW1lc3NhZ2UpOworICAgIGlmIChyZXQgIT0gMCkgeworICAgICAgICByZXQgPSBPTVhfRXJyb3JVbmRlZmluZWQ7CisgICAgICAgIGdvdG8gRVhJVDsKKyAgICB9CisKKyAgICByZXQgPSBTRUNfT1NBTF9TZW1hcGhvcmVQb3N0KHBTRUNQb3J0LT5idWZmZXJTZW1JRCk7CisKK0VYSVQ6CisgICAgRnVuY3Rpb25PdXQoKTsKKworICAgIHJldHVybiByZXQ7Cit9CisKK09NWF9FUlJPUlRZUEUgU0VDX09NWF9Qb3J0X0NvbnN0cnVjdG9yKE9NWF9IQU5ETEVUWVBFIGhDb21wb25lbnQpCit7CisgICAgT01YX0VSUk9SVFlQRSAgICAgICAgICByZXQgPSBPTVhfRXJyb3JOb25lOworICAgIE9NWF9DT01QT05FTlRUWVBFICAgICAqcE9NWENvbXBvbmVudCA9IE5VTEw7CisgICAgU0VDX09NWF9CQVNFQ09NUE9ORU5UICpwU0VDQ29tcG9uZW50ID0gTlVMTDsKKyAgICBTRUNfT01YX0JBU0VQT1JUICAgICAgKnBTRUNQb3J0ID0gTlVMTDsKKyAgICBTRUNfT01YX0JBU0VQT1JUICAgICAgKnBTRUNJbnB1dFBvcnQgPSBOVUxMOworICAgIFNFQ19PTVhfQkFTRVBPUlQgICAgICAqcFNFQ091dHB1dFBvcnQgPSBOVUxMOworICAgIGludCBpID0gMDsKKworICAgIEZ1bmN0aW9uSW4oKTsKKworICAgIGlmIChoQ29tcG9uZW50ID09IE5VTEwpIHsKKyAgICAgICAgcmV0ID0gT01YX0Vycm9yQmFkUGFyYW1ldGVyOworICAgICAgICBTRUNfT1NBTF9Mb2coU0VDX0xPR19FUlJPUiwgIk9NWF9FcnJvckJhZFBhcmFtZXRlciwgTGluZTolZCIsIF9fTElORV9fKTsKKyAgICAgICAgZ290byBFWElUOworICAgIH0KKyAgICBwT01YQ29tcG9uZW50ID0gKE9NWF9DT01QT05FTlRUWVBFICopaENvbXBvbmVudDsKKyAgICByZXQgPSBTRUNfT01YX0NoZWNrX1NpemVWZXJzaW9uKHBPTVhDb21wb25lbnQsIHNpemVvZihPTVhfQ09NUE9ORU5UVFlQRSkpOworICAgIGlmIChyZXQgIT0gT01YX0Vycm9yTm9uZSkgeworICAgICAgICBnb3RvIEVYSVQ7CisgICAgfQorCisgICAgaWYgKHBPTVhDb21wb25lbnQtPnBDb21wb25lbnRQcml2YXRlID09IE5VTEwpIHsKKyAgICAgICAgcmV0ID0gT01YX0Vycm9yQmFkUGFyYW1ldGVyOworICAgICAgICBTRUNfT1NBTF9Mb2coU0VDX0xPR19FUlJPUiwgIk9NWF9FcnJvckJhZFBhcmFtZXRlciwgTGluZTolZCIsIF9fTElORV9fKTsKKyAgICAgICAgZ290byBFWElUOworICAgIH0KKyAgICBwU0VDQ29tcG9uZW50ID0gKFNFQ19PTVhfQkFTRUNPTVBPTkVOVCAqKXBPTVhDb21wb25lbnQtPnBDb21wb25lbnRQcml2YXRlOworCisgICAgSU5JVF9TRVRfU0laRV9WRVJTSU9OKCZwU0VDQ29tcG9uZW50LT5wb3J0UGFyYW0sIE9NWF9QT1JUX1BBUkFNX1RZUEUpOworICAgIHBTRUNDb21wb25lbnQtPnBvcnRQYXJhbS5uUG9ydHMgPSBBTExfUE9SVF9OVU07CisgICAgcFNFQ0NvbXBvbmVudC0+cG9ydFBhcmFtLm5TdGFydFBvcnROdW1iZXIgPSBJTlBVVF9QT1JUX0lOREVYOworCisgICAgcFNFQ1BvcnQgPSBTRUNfT1NBTF9NYWxsb2Moc2l6ZW9mKFNFQ19PTVhfQkFTRVBPUlQpICogQUxMX1BPUlRfTlVNKTsKKyAgICBpZiAocFNFQ1BvcnQgPT0gTlVMTCkgeworICAgICAgICByZXQgPSBPTVhfRXJyb3JJbnN1ZmZpY2llbnRSZXNvdXJjZXM7CisgICAgICAgIFNFQ19PU0FMX0xvZyhTRUNfTE9HX0VSUk9SLCAiT01YX0Vycm9ySW5zdWZmaWNpZW50UmVzb3VyY2VzLCBMaW5lOiVkIiwgX19MSU5FX18pOworICAgICAgICBnb3RvIEVYSVQ7CisgICAgfQorICAgIFNFQ19PU0FMX01lbXNldChwU0VDUG9ydCwgMCwgc2l6ZW9mKFNFQ19PTVhfQkFTRVBPUlQpICogQUxMX1BPUlRfTlVNKTsKKyAgICBwU0VDQ29tcG9uZW50LT5wU0VDUG9ydCA9IHBTRUNQb3J0OworCisgICAgLyogSW5wdXQgUG9ydCAqLworICAgIHBTRUNJbnB1dFBvcnQgPSAmcFNFQ1BvcnRbSU5QVVRfUE9SVF9JTkRFWF07CisKKyAgICBTRUNfT1NBTF9RdWV1ZUNyZWF0ZSgmcFNFQ0lucHV0UG9ydC0+YnVmZmVyUSk7CisKKyAgICBwU0VDSW5wdXRQb3J0LT5idWZmZXJIZWFkZXIgPSBTRUNfT1NBTF9NYWxsb2Moc2l6ZW9mKE9NWF9CVUZGRVJIRUFERVJUWVBFKikgKiBNQVhfQlVGRkVSX05VTSk7CisgICAgaWYgKHBTRUNJbnB1dFBvcnQtPmJ1ZmZlckhlYWRlciA9PSBOVUxMKSB7CisgICAgICAgIFNFQ19PU0FMX0ZyZWUocFNFQ1BvcnQpOworICAgICAgICBwU0VDUG9ydCA9IE5VTEw7CisgICAgICAgIHJldCA9IE9NWF9FcnJvckluc3VmZmljaWVudFJlc291cmNlczsKKyAgICAgICAgU0VDX09TQUxfTG9nKFNFQ19MT0dfRVJST1IsICJPTVhfRXJyb3JJbnN1ZmZpY2llbnRSZXNvdXJjZXMsIExpbmU6JWQiLCBfX0xJTkVfXyk7CisgICAgICAgIGdvdG8gRVhJVDsKKyAgICB9CisgICAgU0VDX09TQUxfTWVtc2V0KHBTRUNJbnB1dFBvcnQtPmJ1ZmZlckhlYWRlciwgMCwgc2l6ZW9mKE9NWF9CVUZGRVJIRUFERVJUWVBFKikgKiBNQVhfQlVGRkVSX05VTSk7CisKKyAgICBwU0VDSW5wdXRQb3J0LT5idWZmZXJTdGF0ZUFsbG9jYXRlID0gU0VDX09TQUxfTWFsbG9jKHNpemVvZihPTVhfVTMyKSAqIE1BWF9CVUZGRVJfTlVNKTsKKyAgICBpZiAocFNFQ0lucHV0UG9ydC0+YnVmZmVyU3RhdGVBbGxvY2F0ZSA9PSBOVUxMKSB7CisgICAgICAgIFNFQ19PU0FMX0ZyZWUocFNFQ0lucHV0UG9ydC0+YnVmZmVySGVhZGVyKTsKKyAgICAgICAgcFNFQ0lucHV0UG9ydC0+YnVmZmVySGVhZGVyID0gTlVMTDsKKyAgICAgICAgU0VDX09TQUxfRnJlZShwU0VDUG9ydCk7CisgICAgICAgIHBTRUNQb3J0ID0gTlVMTDsKKyAgICAgICAgcmV0ID0gT01YX0Vycm9ySW5zdWZmaWNpZW50UmVzb3VyY2VzOworICAgICAgICBTRUNfT1NBTF9Mb2coU0VDX0xPR19FUlJPUiwgIk9NWF9FcnJvckluc3VmZmljaWVudFJlc291cmNlcywgTGluZTolZCIsIF9fTElORV9fKTsKKyAgICAgICAgZ290byBFWElUOworICAgIH0KKyAgICBTRUNfT1NBTF9NZW1zZXQocFNFQ0lucHV0UG9ydC0+YnVmZmVyU3RhdGVBbGxvY2F0ZSwgMCwgc2l6ZW9mKE9NWF9VMzIpICogTUFYX0JVRkZFUl9OVU0pOworCisgICAgcFNFQ0lucHV0UG9ydC0+YnVmZmVyU2VtSUQgPSBOVUxMOworICAgIHBTRUNJbnB1dFBvcnQtPmFzc2lnbmVkQnVmZmVyTnVtID0gMDsKKyAgICBwU0VDSW5wdXRQb3J0LT5wb3J0U3RhdGUgPSBPTVhfU3RhdGVNYXg7CisgICAgcFNFQ0lucHV0UG9ydC0+YklzUG9ydEZsdXNoZWQgPSBPTVhfRkFMU0U7CisgICAgcFNFQ0lucHV0UG9ydC0+YklzUG9ydERpc2FibGVkID0gT01YX0ZBTFNFOworICAgIHBTRUNJbnB1dFBvcnQtPnR1bm5lbGVkQ29tcG9uZW50ID0gTlVMTDsKKyAgICBwU0VDSW5wdXRQb3J0LT50dW5uZWxlZFBvcnQgPSAwOworICAgIHBTRUNJbnB1dFBvcnQtPnR1bm5lbEJ1ZmZlck51bSA9IDA7CisgICAgcFNFQ0lucHV0UG9ydC0+YnVmZmVyU3VwcGxpZXIgPSBPTVhfQnVmZmVyU3VwcGx5VW5zcGVjaWZpZWQ7CisgICAgcFNFQ0lucHV0UG9ydC0+dHVubmVsRmxhZ3MgPSAwOworICAgIHJldCA9IFNFQ19PU0FMX1NlbWFwaG9yZUNyZWF0ZSgmcFNFQ0lucHV0UG9ydC0+bG9hZGVkUmVzb3VyY2UpOworICAgIGlmIChyZXQgIT0gT01YX0Vycm9yTm9uZSkgeworICAgICAgICBTRUNfT1NBTF9GcmVlKHBTRUNJbnB1dFBvcnQtPmJ1ZmZlclN0YXRlQWxsb2NhdGUpOworICAgICAgICBwU0VDSW5wdXRQb3J0LT5idWZmZXJTdGF0ZUFsbG9jYXRlID0gTlVMTDsKKyAgICAgICAgU0VDX09TQUxfRnJlZShwU0VDSW5wdXRQb3J0LT5idWZmZXJIZWFkZXIpOworICAgICAgICBwU0VDSW5wdXRQb3J0LT5idWZmZXJIZWFkZXIgPSBOVUxMOworICAgICAgICBTRUNfT1NBTF9GcmVlKHBTRUNQb3J0KTsKKyAgICAgICAgcFNFQ1BvcnQgPSBOVUxMOworICAgICAgICBnb3RvIEVYSVQ7CisgICAgfQorICAgIHJldCA9IFNFQ19PU0FMX1NlbWFwaG9yZUNyZWF0ZSgmcFNFQ0lucHV0UG9ydC0+dW5sb2FkZWRSZXNvdXJjZSk7CisgICAgaWYgKHJldCAhPSBPTVhfRXJyb3JOb25lKSB7CisgICAgICAgIFNFQ19PU0FMX1NlbWFwaG9yZVRlcm1pbmF0ZShwU0VDSW5wdXRQb3J0LT5sb2FkZWRSZXNvdXJjZSk7CisgICAgICAgIHBTRUNJbnB1dFBvcnQtPmxvYWRlZFJlc291cmNlID0gTlVMTDsKKyAgICAgICAgU0VDX09TQUxfRnJlZShwU0VDSW5wdXRQb3J0LT5idWZmZXJTdGF0ZUFsbG9jYXRlKTsKKyAgICAgICAgcFNFQ0lucHV0UG9ydC0+YnVmZmVyU3RhdGVBbGxvY2F0ZSA9IE5VTEw7CisgICAgICAgIFNFQ19PU0FMX0ZyZWUocFNFQ0lucHV0UG9ydC0+YnVmZmVySGVhZGVyKTsKKyAgICAgICAgcFNFQ0lucHV0UG9ydC0+YnVmZmVySGVhZGVyID0gTlVMTDsKKyAgICAgICAgU0VDX09TQUxfRnJlZShwU0VDUG9ydCk7CisgICAgICAgIHBTRUNQb3J0ID0gTlVMTDsKKyAgICAgICAgZ290byBFWElUOworICAgIH0KKworICAgIElOSVRfU0VUX1NJWkVfVkVSU0lPTigmcFNFQ0lucHV0UG9ydC0+cG9ydERlZmluaXRpb24sIE9NWF9QQVJBTV9QT1JUREVGSU5JVElPTlRZUEUpOworICAgIHBTRUNJbnB1dFBvcnQtPnBvcnREZWZpbml0aW9uLm5Qb3J0SW5kZXggPSBJTlBVVF9QT1JUX0lOREVYOworICAgIHBTRUNJbnB1dFBvcnQtPnBvcnREZWZpbml0aW9uLmVEaXIgPSBPTVhfRGlySW5wdXQ7CisgICAgcFNFQ0lucHV0UG9ydC0+cG9ydERlZmluaXRpb24ubkJ1ZmZlckNvdW50QWN0dWFsID0gMDsKKyAgICBwU0VDSW5wdXRQb3J0LT5wb3J0RGVmaW5pdGlvbi5uQnVmZmVyQ291bnRNaW4gPSAwOworICAgIHBTRUNJbnB1dFBvcnQtPnBvcnREZWZpbml0aW9uLm5CdWZmZXJTaXplID0gMDsKKyAgICBwU0VDSW5wdXRQb3J0LT5wb3J0RGVmaW5pdGlvbi5iRW5hYmxlZCA9IE9NWF9GQUxTRTsKKyAgICBwU0VDSW5wdXRQb3J0LT5wb3J0RGVmaW5pdGlvbi5iUG9wdWxhdGVkID0gT01YX0ZBTFNFOworICAgIHBTRUNJbnB1dFBvcnQtPnBvcnREZWZpbml0aW9uLmVEb21haW4gPSBPTVhfUG9ydERvbWFpbk1heDsKKyAgICBwU0VDSW5wdXRQb3J0LT5wb3J0RGVmaW5pdGlvbi5iQnVmZmVyc0NvbnRpZ3VvdXMgPSBPTVhfRkFMU0U7CisgICAgcFNFQ0lucHV0UG9ydC0+cG9ydERlZmluaXRpb24ubkJ1ZmZlckFsaWdubWVudCA9IDA7CisgICAgcFNFQ0lucHV0UG9ydC0+bWFya1R5cGUuaE1hcmtUYXJnZXRDb21wb25lbnQgPSBOVUxMOworICAgIHBTRUNJbnB1dFBvcnQtPm1hcmtUeXBlLnBNYXJrRGF0YSA9IE5VTEw7CisKKyAgICAvKiBPdXRwdXQgUG9ydCAqLworICAgIHBTRUNPdXRwdXRQb3J0ID0gJnBTRUNQb3J0W09VVFBVVF9QT1JUX0lOREVYXTsKKworICAgIFNFQ19PU0FMX1F1ZXVlQ3JlYXRlKCZwU0VDT3V0cHV0UG9ydC0+YnVmZmVyUSk7CisKKyAgICBwU0VDT3V0cHV0UG9ydC0+YnVmZmVySGVhZGVyID0gU0VDX09TQUxfTWFsbG9jKHNpemVvZihPTVhfQlVGRkVSSEVBREVSVFlQRSopICogTUFYX0JVRkZFUl9OVU0pOworICAgIGlmIChwU0VDT3V0cHV0UG9ydC0+YnVmZmVySGVhZGVyID09IE5VTEwpIHsKKyAgICAgICAgU0VDX09TQUxfU2VtYXBob3JlVGVybWluYXRlKHBTRUNJbnB1dFBvcnQtPnVubG9hZGVkUmVzb3VyY2UpOworICAgICAgICBwU0VDSW5wdXRQb3J0LT51bmxvYWRlZFJlc291cmNlID0gTlVMTDsKKyAgICAgICAgU0VDX09TQUxfU2VtYXBob3JlVGVybWluYXRlKHBTRUNJbnB1dFBvcnQtPmxvYWRlZFJlc291cmNlKTsKKyAgICAgICAgcFNFQ0lucHV0UG9ydC0+bG9hZGVkUmVzb3VyY2UgPSBOVUxMOworICAgICAgICBTRUNfT1NBTF9GcmVlKHBTRUNJbnB1dFBvcnQtPmJ1ZmZlclN0YXRlQWxsb2NhdGUpOworICAgICAgICBwU0VDSW5wdXRQb3J0LT5idWZmZXJTdGF0ZUFsbG9jYXRlID0gTlVMTDsKKyAgICAgICAgU0VDX09TQUxfRnJlZShwU0VDSW5wdXRQb3J0LT5idWZmZXJIZWFkZXIpOworICAgICAgICBwU0VDSW5wdXRQb3J0LT5idWZmZXJIZWFkZXIgPSBOVUxMOworICAgICAgICBTRUNfT1NBTF9GcmVlKHBTRUNQb3J0KTsKKyAgICAgICAgcFNFQ1BvcnQgPSBOVUxMOworICAgICAgICByZXQgPSBPTVhfRXJyb3JJbnN1ZmZpY2llbnRSZXNvdXJjZXM7CisgICAgICAgIGdvdG8gRVhJVDsKKyAgICB9CisgICAgU0VDX09TQUxfTWVtc2V0KHBTRUNPdXRwdXRQb3J0LT5idWZmZXJIZWFkZXIsIDAsIHNpemVvZihPTVhfQlVGRkVSSEVBREVSVFlQRSopICogTUFYX0JVRkZFUl9OVU0pOworCisgICAgcFNFQ091dHB1dFBvcnQtPmJ1ZmZlclN0YXRlQWxsb2NhdGUgPSBTRUNfT1NBTF9NYWxsb2Moc2l6ZW9mKE9NWF9VMzIpICogTUFYX0JVRkZFUl9OVU0pOworICAgIGlmIChwU0VDT3V0cHV0UG9ydC0+YnVmZmVyU3RhdGVBbGxvY2F0ZSA9PSBOVUxMKSB7CisgICAgICAgIFNFQ19PU0FMX0ZyZWUocFNFQ091dHB1dFBvcnQtPmJ1ZmZlckhlYWRlcik7CisgICAgICAgIHBTRUNPdXRwdXRQb3J0LT5idWZmZXJIZWFkZXIgPSBOVUxMOworCisgICAgICAgIFNFQ19PU0FMX1NlbWFwaG9yZVRlcm1pbmF0ZShwU0VDSW5wdXRQb3J0LT51bmxvYWRlZFJlc291cmNlKTsKKyAgICAgICAgcFNFQ0lucHV0UG9ydC0+dW5sb2FkZWRSZXNvdXJjZSA9IE5VTEw7CisgICAgICAgIFNFQ19PU0FMX1NlbWFwaG9yZVRlcm1pbmF0ZShwU0VDSW5wdXRQb3J0LT5sb2FkZWRSZXNvdXJjZSk7CisgICAgICAgIHBTRUNJbnB1dFBvcnQtPmxvYWRlZFJlc291cmNlID0gTlVMTDsKKyAgICAgICAgU0VDX09TQUxfRnJlZShwU0VDSW5wdXRQb3J0LT5idWZmZXJTdGF0ZUFsbG9jYXRlKTsKKyAgICAgICAgcFNFQ0lucHV0UG9ydC0+YnVmZmVyU3RhdGVBbGxvY2F0ZSA9IE5VTEw7CisgICAgICAgIFNFQ19PU0FMX0ZyZWUocFNFQ0lucHV0UG9ydC0+YnVmZmVySGVhZGVyKTsKKyAgICAgICAgcFNFQ0lucHV0UG9ydC0+YnVmZmVySGVhZGVyID0gTlVMTDsKKyAgICAgICAgU0VDX09TQUxfRnJlZShwU0VDUG9ydCk7CisgICAgICAgIHBTRUNQb3J0ID0gTlVMTDsKKyAgICAgICAgcmV0ID0gT01YX0Vycm9ySW5zdWZmaWNpZW50UmVzb3VyY2VzOworICAgICAgICBnb3RvIEVYSVQ7CisgICAgfQorICAgIFNFQ19PU0FMX01lbXNldChwU0VDT3V0cHV0UG9ydC0+YnVmZmVyU3RhdGVBbGxvY2F0ZSwgMCwgc2l6ZW9mKE9NWF9VMzIpICogTUFYX0JVRkZFUl9OVU0pOworCisgICAgcFNFQ091dHB1dFBvcnQtPmJ1ZmZlclNlbUlEID0gTlVMTDsKKyAgICBwU0VDT3V0cHV0UG9ydC0+YXNzaWduZWRCdWZmZXJOdW0gPSAwOworICAgIHBTRUNPdXRwdXRQb3J0LT5wb3J0U3RhdGUgPSBPTVhfU3RhdGVNYXg7CisgICAgcFNFQ091dHB1dFBvcnQtPmJJc1BvcnRGbHVzaGVkID0gT01YX0ZBTFNFOworICAgIHBTRUNPdXRwdXRQb3J0LT5iSXNQb3J0RGlzYWJsZWQgPSBPTVhfRkFMU0U7CisgICAgcFNFQ091dHB1dFBvcnQtPnR1bm5lbGVkQ29tcG9uZW50ID0gTlVMTDsKKyAgICBwU0VDT3V0cHV0UG9ydC0+dHVubmVsZWRQb3J0ID0gMDsKKyAgICBwU0VDT3V0cHV0UG9ydC0+dHVubmVsQnVmZmVyTnVtID0gMDsKKyAgICBwU0VDT3V0cHV0UG9ydC0+YnVmZmVyU3VwcGxpZXIgPSBPTVhfQnVmZmVyU3VwcGx5VW5zcGVjaWZpZWQ7CisgICAgcFNFQ091dHB1dFBvcnQtPnR1bm5lbEZsYWdzID0gMDsKKyAgICByZXQgPSBTRUNfT1NBTF9TZW1hcGhvcmVDcmVhdGUoJnBTRUNPdXRwdXRQb3J0LT5sb2FkZWRSZXNvdXJjZSk7CisgICAgaWYgKHJldCAhPSBPTVhfRXJyb3JOb25lKSB7CisgICAgICAgIFNFQ19PU0FMX0ZyZWUocFNFQ091dHB1dFBvcnQtPmJ1ZmZlclN0YXRlQWxsb2NhdGUpOworICAgICAgICBwU0VDT3V0cHV0UG9ydC0+YnVmZmVyU3RhdGVBbGxvY2F0ZSA9IE5VTEw7CisgICAgICAgIFNFQ19PU0FMX0ZyZWUocFNFQ091dHB1dFBvcnQtPmJ1ZmZlckhlYWRlcik7CisgICAgICAgIHBTRUNPdXRwdXRQb3J0LT5idWZmZXJIZWFkZXIgPSBOVUxMOworCisgICAgICAgIFNFQ19PU0FMX1NlbWFwaG9yZVRlcm1pbmF0ZShwU0VDSW5wdXRQb3J0LT51bmxvYWRlZFJlc291cmNlKTsKKyAgICAgICAgcFNFQ0lucHV0UG9ydC0+dW5sb2FkZWRSZXNvdXJjZSA9IE5VTEw7CisgICAgICAgIFNFQ19PU0FMX1NlbWFwaG9yZVRlcm1pbmF0ZShwU0VDSW5wdXRQb3J0LT5sb2FkZWRSZXNvdXJjZSk7CisgICAgICAgIHBTRUNJbnB1dFBvcnQtPmxvYWRlZFJlc291cmNlID0gTlVMTDsKKyAgICAgICAgU0VDX09TQUxfRnJlZShwU0VDSW5wdXRQb3J0LT5idWZmZXJTdGF0ZUFsbG9jYXRlKTsKKyAgICAgICAgcFNFQ0lucHV0UG9ydC0+YnVmZmVyU3RhdGVBbGxvY2F0ZSA9IE5VTEw7CisgICAgICAgIFNFQ19PU0FMX0ZyZWUocFNFQ0lucHV0UG9ydC0+YnVmZmVySGVhZGVyKTsKKyAgICAgICAgcFNFQ0lucHV0UG9ydC0+YnVmZmVySGVhZGVyID0gTlVMTDsKKyAgICAgICAgU0VDX09TQUxfRnJlZShwU0VDUG9ydCk7CisgICAgICAgIHBTRUNQb3J0ID0gTlVMTDsKKyAgICAgICAgZ290byBFWElUOworICAgIH0KKyAgICByZXQgPSBTRUNfT1NBTF9TZW1hcGhvcmVDcmVhdGUoJnBTRUNPdXRwdXRQb3J0LT51bmxvYWRlZFJlc291cmNlKTsKKyAgICBpZiAocmV0ICE9IE9NWF9FcnJvck5vbmUpIHsKKyAgICAgICAgU0VDX09TQUxfU2VtYXBob3JlVGVybWluYXRlKHBTRUNPdXRwdXRQb3J0LT5sb2FkZWRSZXNvdXJjZSk7CisgICAgICAgIHBTRUNPdXRwdXRQb3J0LT5sb2FkZWRSZXNvdXJjZSA9IE5VTEw7CisgICAgICAgIFNFQ19PU0FMX0ZyZWUocFNFQ091dHB1dFBvcnQtPmJ1ZmZlclN0YXRlQWxsb2NhdGUpOworICAgICAgICBwU0VDT3V0cHV0UG9ydC0+YnVmZmVyU3RhdGVBbGxvY2F0ZSA9IE5VTEw7CisgICAgICAgIFNFQ19PU0FMX0ZyZWUocFNFQ091dHB1dFBvcnQtPmJ1ZmZlckhlYWRlcik7CisgICAgICAgIHBTRUNPdXRwdXRQb3J0LT5idWZmZXJIZWFkZXIgPSBOVUxMOworCisgICAgICAgIFNFQ19PU0FMX1NlbWFwaG9yZVRlcm1pbmF0ZShwU0VDSW5wdXRQb3J0LT51bmxvYWRlZFJlc291cmNlKTsKKyAgICAgICAgcFNFQ0lucHV0UG9ydC0+dW5sb2FkZWRSZXNvdXJjZSA9IE5VTEw7CisgICAgICAgIFNFQ19PU0FMX1NlbWFwaG9yZVRlcm1pbmF0ZShwU0VDSW5wdXRQb3J0LT5sb2FkZWRSZXNvdXJjZSk7CisgICAgICAgIHBTRUNJbnB1dFBvcnQtPmxvYWRlZFJlc291cmNlID0gTlVMTDsKKyAgICAgICAgU0VDX09TQUxfRnJlZShwU0VDSW5wdXRQb3J0LT5idWZmZXJTdGF0ZUFsbG9jYXRlKTsKKyAgICAgICAgcFNFQ0lucHV0UG9ydC0+YnVmZmVyU3RhdGVBbGxvY2F0ZSA9IE5VTEw7CisgICAgICAgIFNFQ19PU0FMX0ZyZWUocFNFQ0lucHV0UG9ydC0+YnVmZmVySGVhZGVyKTsKKyAgICAgICAgcFNFQ0lucHV0UG9ydC0+YnVmZmVySGVhZGVyID0gTlVMTDsKKyAgICAgICAgU0VDX09TQUxfRnJlZShwU0VDUG9ydCk7CisgICAgICAgIHBTRUNQb3J0ID0gTlVMTDsKKyAgICAgICAgZ290byBFWElUOworICAgIH0KKworICAgIElOSVRfU0VUX1NJWkVfVkVSU0lPTigmcFNFQ091dHB1dFBvcnQtPnBvcnREZWZpbml0aW9uLCBPTVhfUEFSQU1fUE9SVERFRklOSVRJT05UWVBFKTsKKyAgICBwU0VDT3V0cHV0UG9ydC0+cG9ydERlZmluaXRpb24ublBvcnRJbmRleCA9IE9VVFBVVF9QT1JUX0lOREVYOworICAgIHBTRUNPdXRwdXRQb3J0LT5wb3J0RGVmaW5pdGlvbi5lRGlyID0gT01YX0Rpck91dHB1dDsKKyAgICBwU0VDT3V0cHV0UG9ydC0+cG9ydERlZmluaXRpb24ubkJ1ZmZlckNvdW50QWN0dWFsID0gMDsKKyAgICBwU0VDT3V0cHV0UG9ydC0+cG9ydERlZmluaXRpb24ubkJ1ZmZlckNvdW50TWluID0gMDsKKyAgICBwU0VDT3V0cHV0UG9ydC0+cG9ydERlZmluaXRpb24ubkJ1ZmZlclNpemUgPSAwOworICAgIHBTRUNPdXRwdXRQb3J0LT5wb3J0RGVmaW5pdGlvbi5iRW5hYmxlZCA9IE9NWF9GQUxTRTsKKyAgICBwU0VDT3V0cHV0UG9ydC0+cG9ydERlZmluaXRpb24uYlBvcHVsYXRlZCA9IE9NWF9GQUxTRTsKKyAgICBwU0VDT3V0cHV0UG9ydC0+cG9ydERlZmluaXRpb24uZURvbWFpbiA9IE9NWF9Qb3J0RG9tYWluTWF4OworICAgIHBTRUNPdXRwdXRQb3J0LT5wb3J0RGVmaW5pdGlvbi5iQnVmZmVyc0NvbnRpZ3VvdXMgPSBPTVhfRkFMU0U7CisgICAgcFNFQ091dHB1dFBvcnQtPnBvcnREZWZpbml0aW9uLm5CdWZmZXJBbGlnbm1lbnQgPSAwOworICAgIHBTRUNPdXRwdXRQb3J0LT5tYXJrVHlwZS5oTWFya1RhcmdldENvbXBvbmVudCA9IE5VTEw7CisgICAgcFNFQ091dHB1dFBvcnQtPm1hcmtUeXBlLnBNYXJrRGF0YSA9IE5VTEw7CisKKyAgICBwU0VDQ29tcG9uZW50LT5jaGVja1RpbWVTdGFtcC5uZWVkU2V0U3RhcnRUaW1lU3RhbXAgPSBPTVhfRkFMU0U7CisgICAgcFNFQ0NvbXBvbmVudC0+Y2hlY2tUaW1lU3RhbXAubmVlZENoZWNrU3RhcnRUaW1lU3RhbXAgPSBPTVhfRkFMU0U7CisgICAgcFNFQ0NvbXBvbmVudC0+Y2hlY2tUaW1lU3RhbXAuc3RhcnRUaW1lU3RhbXAgPSAwOworICAgIHBTRUNDb21wb25lbnQtPmNoZWNrVGltZVN0YW1wLm5TdGFydEZsYWdzID0gMHgwOworCisgICAgcE9NWENvbXBvbmVudC0+RW1wdHlUaGlzQnVmZmVyID0gJlNFQ19PTVhfRW1wdHlUaGlzQnVmZmVyOworICAgIHBPTVhDb21wb25lbnQtPkZpbGxUaGlzQnVmZmVyICA9ICZTRUNfT01YX0ZpbGxUaGlzQnVmZmVyOworCisgICAgcmV0ID0gT01YX0Vycm9yTm9uZTsKK0VYSVQ6CisgICAgRnVuY3Rpb25PdXQoKTsKKworICAgIHJldHVybiByZXQ7Cit9CisKK09NWF9FUlJPUlRZUEUgU0VDX09NWF9Qb3J0X0Rlc3RydWN0b3IoT01YX0hBTkRMRVRZUEUgaENvbXBvbmVudCkKK3sKKyAgICBPTVhfRVJST1JUWVBFICAgICAgICAgIHJldCA9IE9NWF9FcnJvck5vbmU7CisgICAgT01YX0NPTVBPTkVOVFRZUEUgICAgICpwT01YQ29tcG9uZW50ID0gTlVMTDsKKyAgICBTRUNfT01YX0JBU0VDT01QT05FTlQgKnBTRUNDb21wb25lbnQgPSBOVUxMOworICAgIFNFQ19PTVhfQkFTRVBPUlQgICAgICAqcFNFQ1BvcnQgPSBOVUxMOworCisgICAgRnVuY3Rpb25JbigpOworCisgICAgaW50IGkgPSAwOworCisgICAgaWYgKGhDb21wb25lbnQgPT0gTlVMTCkgeworICAgICAgICByZXQgPSBPTVhfRXJyb3JCYWRQYXJhbWV0ZXI7CisgICAgICAgIGdvdG8gRVhJVDsKKyAgICB9CisgICAgcE9NWENvbXBvbmVudCA9IChPTVhfQ09NUE9ORU5UVFlQRSAqKWhDb21wb25lbnQ7CisgICAgcmV0ID0gU0VDX09NWF9DaGVja19TaXplVmVyc2lvbihwT01YQ29tcG9uZW50LCBzaXplb2YoT01YX0NPTVBPTkVOVFRZUEUpKTsKKyAgICBpZiAocmV0ICE9IE9NWF9FcnJvck5vbmUpIHsKKyAgICAgICAgZ290byBFWElUOworICAgIH0KKyAgICBpZiAocE9NWENvbXBvbmVudC0+cENvbXBvbmVudFByaXZhdGUgPT0gTlVMTCkgeworICAgICAgICByZXQgPSBPTVhfRXJyb3JCYWRQYXJhbWV0ZXI7CisgICAgICAgIGdvdG8gRVhJVDsKKyAgICB9CisgICAgcFNFQ0NvbXBvbmVudCA9IChTRUNfT01YX0JBU0VDT01QT05FTlQgKilwT01YQ29tcG9uZW50LT5wQ29tcG9uZW50UHJpdmF0ZTsKKyAgICBmb3IgKGkgPSAwOyBpIDwgQUxMX1BPUlRfTlVNOyBpKyspIHsKKyAgICAgICAgcFNFQ1BvcnQgPSAmcFNFQ0NvbXBvbmVudC0+cFNFQ1BvcnRbaV07CisKKyAgICAgICAgU0VDX09TQUxfU2VtYXBob3JlVGVybWluYXRlKHBTRUNQb3J0LT5sb2FkZWRSZXNvdXJjZSk7CisgICAgICAgIHBTRUNQb3J0LT5sb2FkZWRSZXNvdXJjZSA9IE5VTEw7CisgICAgICAgIFNFQ19PU0FMX1NlbWFwaG9yZVRlcm1pbmF0ZShwU0VDUG9ydC0+dW5sb2FkZWRSZXNvdXJjZSk7CisgICAgICAgIHBTRUNQb3J0LT51bmxvYWRlZFJlc291cmNlID0gTlVMTDsKKyAgICAgICAgU0VDX09TQUxfRnJlZShwU0VDUG9ydC0+YnVmZmVyU3RhdGVBbGxvY2F0ZSk7CisgICAgICAgIHBTRUNQb3J0LT5idWZmZXJTdGF0ZUFsbG9jYXRlID0gTlVMTDsKKyAgICAgICAgU0VDX09TQUxfRnJlZShwU0VDUG9ydC0+YnVmZmVySGVhZGVyKTsKKyAgICAgICAgcFNFQ1BvcnQtPmJ1ZmZlckhlYWRlciA9IE5VTEw7CisKKyAgICAgICAgU0VDX09TQUxfUXVldWVUZXJtaW5hdGUoJnBTRUNQb3J0LT5idWZmZXJRKTsKKyAgICB9CisgICAgU0VDX09TQUxfRnJlZShwU0VDQ29tcG9uZW50LT5wU0VDUG9ydCk7CisgICAgcFNFQ0NvbXBvbmVudC0+cFNFQ1BvcnQgPSBOVUxMOworICAgIHJldCA9IE9NWF9FcnJvck5vbmU7CitFWElUOgorICAgIEZ1bmN0aW9uT3V0KCk7CisKKyAgICByZXR1cm4gcmV0OworfQpkaWZmIC0tZ2l0IGEvZXh5bm9zNC9tdWx0aW1lZGlhL29wZW5tYXgvc2VjX29teC9jb21wb25lbnQvY29tbW9uL1NFQ19PTVhfQmFzZXBvcnQuaCBiL2V4eW5vczQvbXVsdGltZWRpYS9vcGVubWF4L3NlY19vbXgvY29tcG9uZW50L2NvbW1vbi9TRUNfT01YX0Jhc2Vwb3J0LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTY5YTQ0MwotLS0gL2Rldi9udWxsCisrKyBiL2V4eW5vczQvbXVsdGltZWRpYS9vcGVubWF4L3NlY19vbXgvY29tcG9uZW50L2NvbW1vbi9TRUNfT01YX0Jhc2Vwb3J0LmgKQEAgLTAsMCArMSw5NSBAQAorLyoKKyAqCisgKiBDb3B5cmlnaHQgMjAxMCBTYW1zdW5nIEVsZWN0cm9uaWNzIFMuTFNJIENvLiBMVEQKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworLyoKKyAqIEBmaWxlICAgICAgIFNFQ19PTVhfQmFzZXBvcnQuaAorICogQGJyaWVmCisgKiBAYXV0aG9yICAgICBTZXVuZ0Jlb20gS2ltIChzYmNydXgua2ltQHNhbXN1bmcuY29tKQorICogICAgICAgICAgICAgSHllWWVvbiBDaHVuZyAoaHllb24uY2h1bmdAc2Ftc3VuZy5jb20pCisgKiBAdmVyc2lvbiAgICAxLjEuMAorICogQGhpc3RvcnkKKyAqICAgIDIwMTAuNy4xNSA6IENyZWF0ZQorICovCisKKyNpZm5kZWYgU0VDX09NWF9CQVNFX1BPUlQKKyNkZWZpbmUgU0VDX09NWF9CQVNFX1BPUlQKKworCisjaW5jbHVkZSAiT01YX0NvbXBvbmVudC5oIgorI2luY2x1ZGUgIlNFQ19PTVhfRGVmLmgiCisjaW5jbHVkZSAiU0VDX09TQUxfUXVldWUuaCIKKworCisjZGVmaW5lIEJVRkZFUl9TVEFURV9BTExPQ0FURUQgICgxIDw8IDApCisjZGVmaW5lIEJVRkZFUl9TVEFURV9BU1NJR05FRCAgICgxIDw8IDEpCisjZGVmaW5lIEhFQURFUl9TVEFURV9BTExPQ0FURUQgICgxIDw8IDIpCisjZGVmaW5lIEJVRkZFUl9TVEFURV9GUkVFICAgICAgICAwCisKKyNkZWZpbmUgTUFYX0JVRkZFUl9OVU0gICAgICAgICAgMjAKKworI2RlZmluZSBJTlBVVF9QT1JUX0lOREVYICAgIDAKKyNkZWZpbmUgT1VUUFVUX1BPUlRfSU5ERVggICAxCisjZGVmaW5lIEFMTF9QT1JUX0lOREVYICAgICAtMQorI2RlZmluZSBBTExfUE9SVF9OVU0gICAgICAgIDIKKwordHlwZWRlZiBzdHJ1Y3QgX1NFQ19PTVhfQkFTRVBPUlQKK3sKKyAgICBPTVhfQlVGRkVSSEVBREVSVFlQRSAgICAgICAgICoqYnVmZmVySGVhZGVyOworICAgIE9NWF9VMzIgICAgICAgICAgICAgICAgICAgICAgICpidWZmZXJTdGF0ZUFsbG9jYXRlOworICAgIE9NWF9QQVJBTV9QT1JUREVGSU5JVElPTlRZUEUgICBwb3J0RGVmaW5pdGlvbjsKKyAgICBPTVhfSEFORExFVFlQRSAgICAgICAgICAgICAgICAgYnVmZmVyU2VtSUQ7CisgICAgU0VDX1FVRVVFICAgICAgICAgICAgICAgICAgICAgIGJ1ZmZlclE7CisgICAgT01YX1UzMiAgICAgICAgICAgICAgICAgICAgICAgIGFzc2lnbmVkQnVmZmVyTnVtOworICAgIE9NWF9TVEFURVRZUEUgICAgICAgICAgICAgICAgICBwb3J0U3RhdGU7CisgICAgT01YX0hBTkRMRVRZUEUgICAgICAgICAgICAgICAgIGxvYWRlZFJlc291cmNlOworICAgIE9NWF9IQU5ETEVUWVBFICAgICAgICAgICAgICAgICB1bmxvYWRlZFJlc291cmNlOworCisgICAgT01YX0JPT0wgICAgICAgICAgICAgICAgICAgICAgIGJJc1BvcnRGbHVzaGVkOworICAgIE9NWF9CT09MICAgICAgICAgICAgICAgICAgICAgICBiSXNQb3J0RGlzYWJsZWQ7CisgICAgT01YX01BUktUWVBFICAgICAgICAgICAgICAgICAgIG1hcmtUeXBlOworCisgICAgT01YX0NPTkZJR19SRUNUVFlQRSAgICAgICAgICAgIGNyb3BSZWN0YW5nbGU7CisKKyAgICAvKiBUdW5uZWwgSW5mbyAqLworICAgIE9NWF9IQU5ETEVUWVBFICAgICAgICAgICAgICAgICB0dW5uZWxlZENvbXBvbmVudDsKKyAgICBPTVhfVTMyICAgICAgICAgICAgICAgICAgICAgICAgdHVubmVsZWRQb3J0OworICAgIE9NWF9VMzIgICAgICAgICAgICAgICAgICAgICAgICB0dW5uZWxCdWZmZXJOdW07CisgICAgT01YX0JVRkZFUlNVUFBMSUVSVFlQRSAgICAgICAgIGJ1ZmZlclN1cHBsaWVyOworICAgIE9NWF9VMzIgICAgICAgICAgICAgICAgICAgICAgICB0dW5uZWxGbGFnczsKKworICAgIE9NWF9CT09MICAgICAgICAgICAgICAgICAgICAgICBiSXNBTkJFbmFibGVkOworICAgIE9NWF9CT09MICAgICAgICAgICAgICAgICAgICAgICBiU3RvcmVNZXRhRGF0YTsKK30gU0VDX09NWF9CQVNFUE9SVDsKKworCisjaWZkZWYgX19jcGx1c3BsdXMKK2V4dGVybiAiQyIgeworI2VuZGlmCisKK09NWF9FUlJPUlRZUEUgU0VDX09NWF9Qb3J0RW5hYmxlUHJvY2VzcyhPTVhfQ09NUE9ORU5UVFlQRSAqcE9NWENvbXBvbmVudCwgT01YX1MzMiBuUG9ydEluZGV4KTsKK09NWF9FUlJPUlRZUEUgU0VDX09NWF9Qb3J0RGlzYWJsZVByb2Nlc3MoT01YX0NPTVBPTkVOVFRZUEUgKnBPTVhDb21wb25lbnQsIE9NWF9TMzIgblBvcnRJbmRleCk7CitPTVhfRVJST1JUWVBFIFNFQ19PTVhfQnVmZmVyRmx1c2hQcm9jZXNzKE9NWF9DT01QT05FTlRUWVBFICpwT01YQ29tcG9uZW50LCBPTVhfUzMyIG5Qb3J0SW5kZXgpOworT01YX0VSUk9SVFlQRSBTRUNfT01YX0J1ZmZlckZsdXNoUHJvY2Vzc05vRXZlbnQoT01YX0NPTVBPTkVOVFRZUEUgKnBPTVhDb21wb25lbnQsIE9NWF9TMzIgblBvcnRJbmRleCk7CitPTVhfRVJST1JUWVBFIFNFQ19PTVhfUG9ydF9Db25zdHJ1Y3RvcihPTVhfSEFORExFVFlQRSBoQ29tcG9uZW50KTsKK09NWF9FUlJPUlRZUEUgU0VDX09NWF9Qb3J0X0Rlc3RydWN0b3IoT01YX0hBTkRMRVRZUEUgaENvbXBvbmVudCk7CisKKyNpZmRlZiBfX2NwbHVzcGx1cworfTsKKyNlbmRpZgorCisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvZXh5bm9zNC9tdWx0aW1lZGlhL29wZW5tYXgvc2VjX29teC9jb21wb25lbnQvY29tbW9uL1NFQ19PTVhfUmVzb3VyY2VtYW5hZ2VyLmMgYi9leHlub3M0L211bHRpbWVkaWEvb3Blbm1heC9zZWNfb214L2NvbXBvbmVudC9jb21tb24vU0VDX09NWF9SZXNvdXJjZW1hbmFnZXIuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42YTJjOTc5Ci0tLSAvZGV2L251bGwKKysrIGIvZXh5bm9zNC9tdWx0aW1lZGlhL29wZW5tYXgvc2VjX29teC9jb21wb25lbnQvY29tbW9uL1NFQ19PTVhfUmVzb3VyY2VtYW5hZ2VyLmMKQEAgLTAsMCArMSw0NzggQEAKKy8qCisgKgorICogQ29weXJpZ2h0IDIwMTAgU2Ftc3VuZyBFbGVjdHJvbmljcyBTLkxTSSBDby4gTFRECisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKy8qCisgKiBAZmlsZSAgICAgICBTRUNfT01YX1Jlc291cmNlbWFuYWdlci5jCisgKiBAYnJpZWYKKyAqIEBhdXRob3IgICAgIFNldW5nQmVvbSBLaW0gKHNiY3J1eC5raW1Ac2Ftc3VuZy5jb20pCisgKiBAdmVyc2lvbiAgICAxLjEuMAorICogQGhpc3RvcnkKKyAqICAgIDIwMTAuNy4xNSA6IENyZWF0ZQorICovCisKKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgPHN0ZGxpYi5oPgorI2luY2x1ZGUgPHN0cmluZy5oPgorCisjaW5jbHVkZSAiU0VDX09NWF9SZXNvdXJjZW1hbmFnZXIuaCIKKyNpbmNsdWRlICJTRUNfT01YX0Jhc2Vjb21wb25lbnQuaCIKKyNpbmNsdWRlICJTRUNfT1NBTF9NZW1vcnkuaCIKKyNpbmNsdWRlICJTRUNfT1NBTF9NdXRleC5oIgorCisjdW5kZWYgIFNFQ19MT0dfVEFHCisjZGVmaW5lIFNFQ19MT0dfVEFHICAgICJTRUNfUk0iCisjZGVmaW5lIFNFQ19MT0dfT0ZGCisjaW5jbHVkZSAiU0VDX09TQUxfTG9nLmgiCisKKworI2RlZmluZSBNQVhfUkVTT1VSQ0VfVklERU9fREVDIDMgLyogZm9yIEFuZHJvaWQgKi8KKyNkZWZpbmUgTUFYX1JFU09VUkNFX1ZJREVPX0VOQyAxIC8qIGZvciBBbmRyb2lkICovCisKKy8qIE1heCBhbGxvd2FibGUgdmlkZW8gc2NoZWR1bGVyIGNvbXBvbmVudCBpbnN0YW5jZSAqLworc3RhdGljIFNFQ19PTVhfUk1fQ09NUE9ORU5UX0xJU1QgKmdwVmlkZW9EZWNSTUNvbXBvbmVudExpc3QgPSBOVUxMOworc3RhdGljIFNFQ19PTVhfUk1fQ09NUE9ORU5UX0xJU1QgKmdwVmlkZW9EZWNSTVdhaXRpbmdMaXN0ID0gTlVMTDsKK3N0YXRpYyBTRUNfT01YX1JNX0NPTVBPTkVOVF9MSVNUICpncFZpZGVvRW5jUk1Db21wb25lbnRMaXN0ID0gTlVMTDsKK3N0YXRpYyBTRUNfT01YX1JNX0NPTVBPTkVOVF9MSVNUICpncFZpZGVvRW5jUk1XYWl0aW5nTGlzdCA9IE5VTEw7CitzdGF0aWMgT01YX0hBTkRMRVRZUEUgZ2hWaWRlb1JNQ29tcG9uZW50TGlzdE11dGV4ID0gTlVMTDsKKworCitPTVhfRVJST1JUWVBFIGFkZEVsZW1lbnRMaXN0KFNFQ19PTVhfUk1fQ09NUE9ORU5UX0xJU1QgKipwcExpc3QsIE9NWF9DT01QT05FTlRUWVBFICpwT01YQ29tcG9uZW50KQoreworICAgIE9NWF9FUlJPUlRZUEUgICAgICAgICAgICAgIHJldCA9IE9NWF9FcnJvck5vbmU7CisgICAgU0VDX09NWF9STV9DT01QT05FTlRfTElTVCAqcFRlbXBDb21wID0gTlVMTDsKKyAgICBTRUNfT01YX0JBU0VDT01QT05FTlQgICAgICpwU0VDQ29tcG9uZW50ID0gTlVMTDsKKworICAgIHBTRUNDb21wb25lbnQgPSAoU0VDX09NWF9CQVNFQ09NUE9ORU5UICopcE9NWENvbXBvbmVudC0+cENvbXBvbmVudFByaXZhdGU7CisgICAgaWYgKCpwcExpc3QgIT0gTlVMTCkgeworICAgICAgICBwVGVtcENvbXAgPSAqcHBMaXN0OworICAgICAgICB3aGlsZSAocFRlbXBDb21wLT5wTmV4dCAhPSBOVUxMKSB7CisgICAgICAgICAgICBwVGVtcENvbXAgPSBwVGVtcENvbXAtPnBOZXh0OworICAgICAgICB9CisgICAgICAgIHBUZW1wQ29tcC0+cE5leHQgPSAoU0VDX09NWF9STV9DT01QT05FTlRfTElTVCAqKVNFQ19PU0FMX01hbGxvYyhzaXplb2YoU0VDX09NWF9STV9DT01QT05FTlRfTElTVCkpOworICAgICAgICBpZiAocFRlbXBDb21wLT5wTmV4dCA9PSBOVUxMKSB7CisgICAgICAgICAgICByZXQgPSBPTVhfRXJyb3JJbnN1ZmZpY2llbnRSZXNvdXJjZXM7CisgICAgICAgICAgICBnb3RvIEVYSVQ7CisgICAgICAgIH0KKyAgICAgICAgKChTRUNfT01YX1JNX0NPTVBPTkVOVF9MSVNUICopKHBUZW1wQ29tcC0+cE5leHQpKS0+cE5leHQgPSBOVUxMOworICAgICAgICAoKFNFQ19PTVhfUk1fQ09NUE9ORU5UX0xJU1QgKikocFRlbXBDb21wLT5wTmV4dCkpLT5wT01YU3RhbmRDb21wID0gcE9NWENvbXBvbmVudDsKKyAgICAgICAgKChTRUNfT01YX1JNX0NPTVBPTkVOVF9MSVNUICopKHBUZW1wQ29tcC0+cE5leHQpKS0+Z3JvdXBQcmlvcml0eSA9IHBTRUNDb21wb25lbnQtPmNvbXBQcmlvcml0eS5uR3JvdXBQcmlvcml0eTsKKyAgICAgICAgZ290byBFWElUOworICAgIH0gZWxzZSB7CisgICAgICAgICpwcExpc3QgPSAoU0VDX09NWF9STV9DT01QT05FTlRfTElTVCAqKVNFQ19PU0FMX01hbGxvYyhzaXplb2YoU0VDX09NWF9STV9DT01QT05FTlRfTElTVCkpOworICAgICAgICBpZiAoKnBwTGlzdCA9PSBOVUxMKSB7CisgICAgICAgICAgICByZXQgPSBPTVhfRXJyb3JJbnN1ZmZpY2llbnRSZXNvdXJjZXM7CisgICAgICAgICAgICBnb3RvIEVYSVQ7CisgICAgICAgIH0KKyAgICAgICAgcFRlbXBDb21wID0gKnBwTGlzdDsKKyAgICAgICAgcFRlbXBDb21wLT5wTmV4dCA9IE5VTEw7CisgICAgICAgIHBUZW1wQ29tcC0+cE9NWFN0YW5kQ29tcCA9IHBPTVhDb21wb25lbnQ7CisgICAgICAgIHBUZW1wQ29tcC0+Z3JvdXBQcmlvcml0eSA9IHBTRUNDb21wb25lbnQtPmNvbXBQcmlvcml0eS5uR3JvdXBQcmlvcml0eTsKKyAgICB9CisKK0VYSVQ6CisgICAgcmV0dXJuIHJldDsKK30KKworT01YX0VSUk9SVFlQRSByZW1vdmVFbGVtZW50TGlzdChTRUNfT01YX1JNX0NPTVBPTkVOVF9MSVNUICoqcHBMaXN0LCBPTVhfQ09NUE9ORU5UVFlQRSAqcE9NWENvbXBvbmVudCkKK3sKKyAgICBPTVhfRVJST1JUWVBFICAgICAgICAgICAgICByZXQgPSBPTVhfRXJyb3JOb25lOworICAgIFNFQ19PTVhfUk1fQ09NUE9ORU5UX0xJU1QgKnBDdXJyQ29tcCA9IE5VTEw7CisgICAgU0VDX09NWF9STV9DT01QT05FTlRfTElTVCAqcFByZXZDb21wID0gTlVMTDsKKyAgICBPTVhfQk9PTCAgICAgICAgICAgICAgICAgICBiRGV0ZWN0Q29tcCA9IE9NWF9GQUxTRTsKKworICAgIGlmICgqcHBMaXN0ID09IE5VTEwpIHsKKyAgICAgICAgcmV0ID0gT01YX0Vycm9yVW5kZWZpbmVkOworICAgICAgICBnb3RvIEVYSVQ7CisgICAgfQorCisgICAgcEN1cnJDb21wID0gKnBwTGlzdDsKKyAgICB3aGlsZSAocEN1cnJDb21wICE9IE5VTEwpIHsKKyAgICAgICAgaWYgKHBDdXJyQ29tcC0+cE9NWFN0YW5kQ29tcCA9PSBwT01YQ29tcG9uZW50KSB7CisgICAgICAgICAgICBpZiAoKnBwTGlzdCA9PSBwQ3VyckNvbXApIHsKKyAgICAgICAgICAgICAgICAqcHBMaXN0ID0gcEN1cnJDb21wLT5wTmV4dDsKKyAgICAgICAgICAgICAgICBTRUNfT1NBTF9GcmVlKHBDdXJyQ29tcCk7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIGlmIChwUHJldkNvbXAgIT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgcFByZXZDb21wLT5wTmV4dCA9IHBDdXJyQ29tcC0+cE5leHQ7CisKKyAgICAgICAgICAgICAgICBTRUNfT1NBTF9GcmVlKHBDdXJyQ29tcCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBiRGV0ZWN0Q29tcCA9IE9NWF9UUlVFOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBwUHJldkNvbXAgPSBwQ3VyckNvbXA7CisgICAgICAgICAgICBwQ3VyckNvbXAgPSBwQ3VyckNvbXAtPnBOZXh0OworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKGJEZXRlY3RDb21wID09IE9NWF9GQUxTRSkKKyAgICAgICAgcmV0ID0gT01YX0Vycm9yQ29tcG9uZW50Tm90Rm91bmQ7CisgICAgZWxzZQorICAgICAgICByZXQgPSBPTVhfRXJyb3JOb25lOworCitFWElUOgorICAgIHJldHVybiByZXQ7Cit9CisKK2ludCBzZWFyY2hMb3dQcmlvcml0eShTRUNfT01YX1JNX0NPTVBPTkVOVF9MSVNUICpSTUNvbXBfbGlzdCwgT01YX1UzMiBpbkNvbXBfcHJpb3JpdHksIFNFQ19PTVhfUk1fQ09NUE9ORU5UX0xJU1QgKipvdXRMb3dDb21wKQoreworICAgIGludCByZXQgPSAwOworICAgIFNFQ19PTVhfUk1fQ09NUE9ORU5UX0xJU1QgKnBUZW1wQ29tcCA9IE5VTEw7CisgICAgU0VDX09NWF9STV9DT01QT05FTlRfTElTVCAqcENhbmRpZGF0ZUNvbXAgPSBOVUxMOworCisgICAgaWYgKFJNQ29tcF9saXN0ID09IE5VTEwpCisgICAgICAgIHJldCA9IC0xOworCisgICAgcFRlbXBDb21wID0gUk1Db21wX2xpc3Q7CisgICAgKm91dExvd0NvbXAgPSAwOworCisgICAgd2hpbGUgKHBUZW1wQ29tcCAhPSBOVUxMKSB7CisgICAgICAgIGlmIChwVGVtcENvbXAtPmdyb3VwUHJpb3JpdHkgPiBpbkNvbXBfcHJpb3JpdHkpIHsKKyAgICAgICAgICAgIGlmIChwQ2FuZGlkYXRlQ29tcCAhPSBOVUxMKSB7CisgICAgICAgICAgICAgICAgaWYgKHBDYW5kaWRhdGVDb21wLT5ncm91cFByaW9yaXR5IDwgcFRlbXBDb21wLT5ncm91cFByaW9yaXR5KQorICAgICAgICAgICAgICAgICAgICBwQ2FuZGlkYXRlQ29tcCA9IHBUZW1wQ29tcDsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgcENhbmRpZGF0ZUNvbXAgPSBwVGVtcENvbXA7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBwVGVtcENvbXAgPSBwVGVtcENvbXAtPnBOZXh0OworICAgIH0KKworICAgICpvdXRMb3dDb21wID0gcENhbmRpZGF0ZUNvbXA7CisgICAgaWYgKHBDYW5kaWRhdGVDb21wID09IE5VTEwpCisgICAgICAgIHJldCA9IDA7CisgICAgZWxzZQorICAgICAgICByZXQgPSAxOworCitFWElUOgorICAgIHJldHVybiByZXQ7Cit9CisKK09NWF9FUlJPUlRZUEUgcmVtb3ZlQ29tcG9uZW50KE9NWF9DT01QT05FTlRUWVBFICpwT01YQ29tcG9uZW50KQoreworICAgIE9NWF9FUlJPUlRZUEUgICAgICAgICAgcmV0ID0gT01YX0Vycm9yTm9uZTsKKyAgICBTRUNfT01YX0JBU0VDT01QT05FTlQgKnBTRUNDb21wb25lbnQgPSBOVUxMOworCisgICAgcFNFQ0NvbXBvbmVudCA9IChTRUNfT01YX0JBU0VDT01QT05FTlQgKilwT01YQ29tcG9uZW50LT5wQ29tcG9uZW50UHJpdmF0ZTsKKyAgICBpZiAocFNFQ0NvbXBvbmVudC0+Y3VycmVudFN0YXRlID09IE9NWF9TdGF0ZUlkbGUpIHsKKyAgICAgICAgKCoocFNFQ0NvbXBvbmVudC0+cENhbGxiYWNrcy0+RXZlbnRIYW5kbGVyKSkKKyAgICAgICAgICAgIChwT01YQ29tcG9uZW50LCBwU0VDQ29tcG9uZW50LT5jYWxsYmFja0RhdGEsCisgICAgICAgICAgICBPTVhfRXZlbnRFcnJvciwgT01YX0Vycm9yUmVzb3VyY2VzTG9zdCwgMCwgTlVMTCk7CisgICAgICAgIHJldCA9IE9NWF9TZW5kQ29tbWFuZChwT01YQ29tcG9uZW50LCBPTVhfQ29tbWFuZFN0YXRlU2V0LCBPTVhfU3RhdGVMb2FkZWQsIE5VTEwpOworICAgICAgICBpZiAocmV0ICE9IE9NWF9FcnJvck5vbmUpIHsKKyAgICAgICAgICAgIHJldCA9IE9NWF9FcnJvclVuZGVmaW5lZDsKKyAgICAgICAgICAgIGdvdG8gRVhJVDsKKyAgICAgICAgfQorICAgIH0gZWxzZSBpZiAoKHBTRUNDb21wb25lbnQtPmN1cnJlbnRTdGF0ZSA9PSBPTVhfU3RhdGVFeGVjdXRpbmcpIHx8IChwU0VDQ29tcG9uZW50LT5jdXJyZW50U3RhdGUgPT0gT01YX1N0YXRlUGF1c2UpKSB7CisgICAgICAgIC8qIFRvZG8gKi8KKyAgICB9CisKKyAgICByZXQgPSBPTVhfRXJyb3JOb25lOworCitFWElUOgorICAgIHJldHVybiByZXQ7Cit9CisKKworT01YX0VSUk9SVFlQRSBTRUNfT01YX1Jlc291cmNlTWFuYWdlcl9Jbml0KCkKK3sKKyAgICBPTVhfRVJST1JUWVBFIHJldCA9IE9NWF9FcnJvck5vbmU7CisKKyAgICBGdW5jdGlvbkluKCk7CisgICAgcmV0ID0gU0VDX09TQUxfTXV0ZXhDcmVhdGUoJmdoVmlkZW9STUNvbXBvbmVudExpc3RNdXRleCk7CisgICAgRnVuY3Rpb25PdXQoKTsKKworICAgIHJldHVybiByZXQ7Cit9CisKK09NWF9FUlJPUlRZUEUgU0VDX09NWF9SZXNvdXJjZU1hbmFnZXJfRGVpbml0KCkKK3sKKyAgICBPTVhfRVJST1JUWVBFIHJldCA9IE9NWF9FcnJvck5vbmU7CisgICAgU0VDX09NWF9STV9DT01QT05FTlRfTElTVCAqcEN1cnJDb21wb25lbnQ7CisgICAgU0VDX09NWF9STV9DT01QT05FTlRfTElTVCAqcE5leHRDb21wb25lbnQ7CisKKyAgICBGdW5jdGlvbkluKCk7CisKKyAgICBTRUNfT1NBTF9NdXRleExvY2soZ2hWaWRlb1JNQ29tcG9uZW50TGlzdE11dGV4KTsKKworICAgIGlmIChncFZpZGVvRGVjUk1Db21wb25lbnRMaXN0KSB7CisgICAgICAgIHBDdXJyQ29tcG9uZW50ID0gZ3BWaWRlb0RlY1JNQ29tcG9uZW50TGlzdDsKKyAgICAgICAgd2hpbGUgKHBDdXJyQ29tcG9uZW50ICE9IE5VTEwpIHsKKyAgICAgICAgICAgIHBOZXh0Q29tcG9uZW50ID0gcEN1cnJDb21wb25lbnQtPnBOZXh0OworICAgICAgICAgICAgU0VDX09TQUxfRnJlZShwQ3VyckNvbXBvbmVudCk7CisgICAgICAgICAgICBwQ3VyckNvbXBvbmVudCA9IHBOZXh0Q29tcG9uZW50OworICAgICAgICB9CisgICAgICAgIGdwVmlkZW9EZWNSTUNvbXBvbmVudExpc3QgPSBOVUxMOworICAgIH0KKyAgICBpZiAoZ3BWaWRlb0RlY1JNV2FpdGluZ0xpc3QpIHsKKyAgICAgICAgcEN1cnJDb21wb25lbnQgPSBncFZpZGVvRGVjUk1XYWl0aW5nTGlzdDsKKyAgICAgICAgd2hpbGUgKHBDdXJyQ29tcG9uZW50ICE9IE5VTEwpIHsKKyAgICAgICAgICAgIHBOZXh0Q29tcG9uZW50ID0gcEN1cnJDb21wb25lbnQtPnBOZXh0OworICAgICAgICAgICAgU0VDX09TQUxfRnJlZShwQ3VyckNvbXBvbmVudCk7CisgICAgICAgICAgICBwQ3VyckNvbXBvbmVudCA9IHBOZXh0Q29tcG9uZW50OworICAgICAgICB9CisgICAgICAgIGdwVmlkZW9EZWNSTVdhaXRpbmdMaXN0ID0gTlVMTDsKKyAgICB9CisKKyAgICBpZiAoZ3BWaWRlb0VuY1JNQ29tcG9uZW50TGlzdCkgeworICAgICAgICBwQ3VyckNvbXBvbmVudCA9IGdwVmlkZW9FbmNSTUNvbXBvbmVudExpc3Q7CisgICAgICAgIHdoaWxlIChwQ3VyckNvbXBvbmVudCAhPSBOVUxMKSB7CisgICAgICAgICAgICBwTmV4dENvbXBvbmVudCA9IHBDdXJyQ29tcG9uZW50LT5wTmV4dDsKKyAgICAgICAgICAgIFNFQ19PU0FMX0ZyZWUocEN1cnJDb21wb25lbnQpOworICAgICAgICAgICAgcEN1cnJDb21wb25lbnQgPSBwTmV4dENvbXBvbmVudDsKKyAgICAgICAgfQorICAgICAgICBncFZpZGVvRW5jUk1Db21wb25lbnRMaXN0ID0gTlVMTDsKKyAgICB9CisgICAgaWYgKGdwVmlkZW9FbmNSTVdhaXRpbmdMaXN0KSB7CisgICAgICAgIHBDdXJyQ29tcG9uZW50ID0gZ3BWaWRlb0VuY1JNV2FpdGluZ0xpc3Q7CisgICAgICAgIHdoaWxlIChwQ3VyckNvbXBvbmVudCAhPSBOVUxMKSB7CisgICAgICAgICAgICBwTmV4dENvbXBvbmVudCA9IHBDdXJyQ29tcG9uZW50LT5wTmV4dDsKKyAgICAgICAgICAgIFNFQ19PU0FMX0ZyZWUocEN1cnJDb21wb25lbnQpOworICAgICAgICAgICAgcEN1cnJDb21wb25lbnQgPSBwTmV4dENvbXBvbmVudDsKKyAgICAgICAgfQorICAgICAgICBncFZpZGVvRW5jUk1XYWl0aW5nTGlzdCA9IE5VTEw7CisgICAgfQorCisgICAgU0VDX09TQUxfTXV0ZXhVbmxvY2soZ2hWaWRlb1JNQ29tcG9uZW50TGlzdE11dGV4KTsKKworICAgIFNFQ19PU0FMX011dGV4VGVybWluYXRlKGdoVmlkZW9STUNvbXBvbmVudExpc3RNdXRleCk7CisgICAgZ2hWaWRlb1JNQ29tcG9uZW50TGlzdE11dGV4ID0gTlVMTDsKKworICAgIHJldCA9IE9NWF9FcnJvck5vbmU7CitFWElUOgorICAgIEZ1bmN0aW9uT3V0KCk7CisKKyAgICByZXR1cm4gcmV0OworfQorCitPTVhfRVJST1JUWVBFIFNFQ19PTVhfR2V0X1Jlc291cmNlKE9NWF9DT01QT05FTlRUWVBFICpwT01YQ29tcG9uZW50KQoreworICAgIE9NWF9FUlJPUlRZUEUgICAgICAgICAgICAgIHJldCA9IE9NWF9FcnJvck5vbmU7CisgICAgU0VDX09NWF9CQVNFQ09NUE9ORU5UICAgICAqcFNFQ0NvbXBvbmVudCA9IE5VTEw7CisgICAgU0VDX09NWF9STV9DT01QT05FTlRfTElTVCAqcENvbXBvbmVudFRlbXAgPSBOVUxMOworICAgIFNFQ19PTVhfUk1fQ09NUE9ORU5UX0xJU1QgKnBDb21wb25lbnRDYW5kaWRhdGUgPSBOVUxMOworICAgIGludCBudW1FbGVtID0gMDsKKyAgICBpbnQgbG93Q29tcERldGVjdCA9IDA7CisKKyAgICBGdW5jdGlvbkluKCk7CisKKyAgICBTRUNfT1NBTF9NdXRleExvY2soZ2hWaWRlb1JNQ29tcG9uZW50TGlzdE11dGV4KTsKKworICAgIHBTRUNDb21wb25lbnQgPSAoU0VDX09NWF9CQVNFQ09NUE9ORU5UICopcE9NWENvbXBvbmVudC0+cENvbXBvbmVudFByaXZhdGU7CisKKyAgICBpZiAocFNFQ0NvbXBvbmVudC0+Y29kZWNUeXBlID09IEhXX1ZJREVPX0RFQ19DT0RFQykgeworICAgICAgICBwQ29tcG9uZW50VGVtcCA9IGdwVmlkZW9EZWNSTUNvbXBvbmVudExpc3Q7CisgICAgICAgIGlmIChwQ29tcG9uZW50VGVtcCAhPSBOVUxMKSB7CisgICAgICAgICAgICB3aGlsZSAocENvbXBvbmVudFRlbXApIHsKKyAgICAgICAgICAgICAgICBudW1FbGVtKys7CisgICAgICAgICAgICAgICAgcENvbXBvbmVudFRlbXAgPSBwQ29tcG9uZW50VGVtcC0+cE5leHQ7CisgICAgICAgICAgICB9CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBudW1FbGVtID0gMDsKKyAgICAgICAgfQorICAgICAgICBpZiAobnVtRWxlbSA+PSBNQVhfUkVTT1VSQ0VfVklERU9fREVDKSB7CisgICAgICAgICAgICBsb3dDb21wRGV0ZWN0ID0gc2VhcmNoTG93UHJpb3JpdHkoZ3BWaWRlb0RlY1JNQ29tcG9uZW50TGlzdCwgcFNFQ0NvbXBvbmVudC0+Y29tcFByaW9yaXR5Lm5Hcm91cFByaW9yaXR5LCAmcENvbXBvbmVudENhbmRpZGF0ZSk7CisgICAgICAgICAgICBpZiAobG93Q29tcERldGVjdCA8PSAwKSB7CisgICAgICAgICAgICAgICAgcmV0ID0gT01YX0Vycm9ySW5zdWZmaWNpZW50UmVzb3VyY2VzOworICAgICAgICAgICAgICAgIGdvdG8gRVhJVDsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgcmV0ID0gcmVtb3ZlQ29tcG9uZW50KHBDb21wb25lbnRDYW5kaWRhdGUtPnBPTVhTdGFuZENvbXApOworICAgICAgICAgICAgICAgIGlmIChyZXQgIT0gT01YX0Vycm9yTm9uZSkgeworICAgICAgICAgICAgICAgICAgICByZXQgPSBPTVhfRXJyb3JJbnN1ZmZpY2llbnRSZXNvdXJjZXM7CisgICAgICAgICAgICAgICAgICAgIGdvdG8gRVhJVDsKKyAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICByZXQgPSByZW1vdmVFbGVtZW50TGlzdCgmZ3BWaWRlb0RlY1JNQ29tcG9uZW50TGlzdCwgcENvbXBvbmVudENhbmRpZGF0ZS0+cE9NWFN0YW5kQ29tcCk7CisgICAgICAgICAgICAgICAgICAgIHJldCA9IGFkZEVsZW1lbnRMaXN0KCZncFZpZGVvRGVjUk1Db21wb25lbnRMaXN0LCBwT01YQ29tcG9uZW50KTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKHJldCAhPSBPTVhfRXJyb3JOb25lKSB7CisgICAgICAgICAgICAgICAgICAgICAgICByZXQgPSBPTVhfRXJyb3JJbnN1ZmZpY2llbnRSZXNvdXJjZXM7CisgICAgICAgICAgICAgICAgICAgICAgICBnb3RvIEVYSVQ7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICByZXQgPSBhZGRFbGVtZW50TGlzdCgmZ3BWaWRlb0RlY1JNQ29tcG9uZW50TGlzdCwgcE9NWENvbXBvbmVudCk7CisgICAgICAgICAgICBpZiAocmV0ICE9IE9NWF9FcnJvck5vbmUpIHsKKyAgICAgICAgICAgICAgICByZXQgPSBPTVhfRXJyb3JJbnN1ZmZpY2llbnRSZXNvdXJjZXM7CisgICAgICAgICAgICAgICAgZ290byBFWElUOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfSBlbHNlIGlmIChwU0VDQ29tcG9uZW50LT5jb2RlY1R5cGUgPT0gSFdfVklERU9fRU5DX0NPREVDKSB7CisgICAgICAgIHBDb21wb25lbnRUZW1wID0gZ3BWaWRlb0VuY1JNQ29tcG9uZW50TGlzdDsKKyAgICAgICAgaWYgKHBDb21wb25lbnRUZW1wICE9IE5VTEwpIHsKKyAgICAgICAgICAgIHdoaWxlIChwQ29tcG9uZW50VGVtcCkgeworICAgICAgICAgICAgICAgIG51bUVsZW0rKzsKKyAgICAgICAgICAgICAgICBwQ29tcG9uZW50VGVtcCA9IHBDb21wb25lbnRUZW1wLT5wTmV4dDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIG51bUVsZW0gPSAwOworICAgICAgICB9CisgICAgICAgIGlmIChudW1FbGVtID49IE1BWF9SRVNPVVJDRV9WSURFT19FTkMpIHsKKyAgICAgICAgICAgIGxvd0NvbXBEZXRlY3QgPSBzZWFyY2hMb3dQcmlvcml0eShncFZpZGVvRW5jUk1Db21wb25lbnRMaXN0LCBwU0VDQ29tcG9uZW50LT5jb21wUHJpb3JpdHkubkdyb3VwUHJpb3JpdHksICZwQ29tcG9uZW50Q2FuZGlkYXRlKTsKKyAgICAgICAgICAgIGlmIChsb3dDb21wRGV0ZWN0IDw9IDApIHsKKyAgICAgICAgICAgICAgICByZXQgPSBPTVhfRXJyb3JJbnN1ZmZpY2llbnRSZXNvdXJjZXM7CisgICAgICAgICAgICAgICAgZ290byBFWElUOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICByZXQgPSByZW1vdmVDb21wb25lbnQocENvbXBvbmVudENhbmRpZGF0ZS0+cE9NWFN0YW5kQ29tcCk7CisgICAgICAgICAgICAgICAgaWYgKHJldCAhPSBPTVhfRXJyb3JOb25lKSB7CisgICAgICAgICAgICAgICAgICAgIHJldCA9IE9NWF9FcnJvckluc3VmZmljaWVudFJlc291cmNlczsKKyAgICAgICAgICAgICAgICAgICAgZ290byBFWElUOworICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIHJldCA9IHJlbW92ZUVsZW1lbnRMaXN0KCZncFZpZGVvRW5jUk1Db21wb25lbnRMaXN0LCBwQ29tcG9uZW50Q2FuZGlkYXRlLT5wT01YU3RhbmRDb21wKTsKKyAgICAgICAgICAgICAgICAgICAgcmV0ID0gYWRkRWxlbWVudExpc3QoJmdwVmlkZW9FbmNSTUNvbXBvbmVudExpc3QsIHBPTVhDb21wb25lbnQpOworICAgICAgICAgICAgICAgICAgICBpZiAocmV0ICE9IE9NWF9FcnJvck5vbmUpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldCA9IE9NWF9FcnJvckluc3VmZmljaWVudFJlc291cmNlczsKKyAgICAgICAgICAgICAgICAgICAgICAgIGdvdG8gRVhJVDsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHJldCA9IGFkZEVsZW1lbnRMaXN0KCZncFZpZGVvRW5jUk1Db21wb25lbnRMaXN0LCBwT01YQ29tcG9uZW50KTsKKyAgICAgICAgICAgIGlmIChyZXQgIT0gT01YX0Vycm9yTm9uZSkgeworICAgICAgICAgICAgICAgIHJldCA9IE9NWF9FcnJvckluc3VmZmljaWVudFJlc291cmNlczsKKyAgICAgICAgICAgICAgICBnb3RvIEVYSVQ7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisgICAgcmV0ID0gT01YX0Vycm9yTm9uZTsKKworRVhJVDoKKworICAgIFNFQ19PU0FMX011dGV4VW5sb2NrKGdoVmlkZW9STUNvbXBvbmVudExpc3RNdXRleCk7CisKKyAgICBGdW5jdGlvbk91dCgpOworCisgICAgcmV0dXJuIHJldDsKK30KKworT01YX0VSUk9SVFlQRSBTRUNfT01YX1JlbGVhc2VfUmVzb3VyY2UoT01YX0NPTVBPTkVOVFRZUEUgKnBPTVhDb21wb25lbnQpCit7CisgICAgT01YX0VSUk9SVFlQRSAgICAgICAgICAgICAgcmV0ID0gT01YX0Vycm9yTm9uZTsKKyAgICBTRUNfT01YX0JBU0VDT01QT05FTlQgICAgICpwU0VDQ29tcG9uZW50ID0gTlVMTDsKKyAgICBTRUNfT01YX1JNX0NPTVBPTkVOVF9MSVNUICpwQ29tcG9uZW50VGVtcCA9IE5VTEw7CisgICAgT01YX0NPTVBPTkVOVFRZUEUgICAgICAgICAqcE9NWFdhaXRDb21wb25lbnQgPSBOVUxMOworICAgIGludCBudW1FbGVtID0gMDsKKworICAgIEZ1bmN0aW9uSW4oKTsKKworICAgIFNFQ19PU0FMX011dGV4TG9jayhnaFZpZGVvUk1Db21wb25lbnRMaXN0TXV0ZXgpOworCisgICAgcFNFQ0NvbXBvbmVudCA9IChTRUNfT01YX0JBU0VDT01QT05FTlQgKilwT01YQ29tcG9uZW50LT5wQ29tcG9uZW50UHJpdmF0ZTsKKyAgICAKKyAgICBpZiAocFNFQ0NvbXBvbmVudC0+Y29kZWNUeXBlID09IEhXX1ZJREVPX0RFQ19DT0RFQykgeworICAgICAgICBwQ29tcG9uZW50VGVtcCA9IGdwVmlkZW9EZWNSTVdhaXRpbmdMaXN0OworICAgICAgICBpZiAoZ3BWaWRlb0RlY1JNQ29tcG9uZW50TGlzdCA9PSBOVUxMKSB7CisgICAgICAgICAgICByZXQgPSBPTVhfRXJyb3JVbmRlZmluZWQ7CisgICAgICAgICAgICBnb3RvIEVYSVQ7CisgICAgICAgIH0KKworICAgICAgICByZXQgPSByZW1vdmVFbGVtZW50TGlzdCgmZ3BWaWRlb0RlY1JNQ29tcG9uZW50TGlzdCwgcE9NWENvbXBvbmVudCk7CisgICAgICAgIGlmIChyZXQgIT0gT01YX0Vycm9yTm9uZSkgeworICAgICAgICAgICAgcmV0ID0gT01YX0Vycm9yVW5kZWZpbmVkOworICAgICAgICAgICAgZ290byBFWElUOworICAgICAgICB9CisgICAgICAgIHdoaWxlIChwQ29tcG9uZW50VGVtcCkgeworICAgICAgICAgICAgbnVtRWxlbSsrOworICAgICAgICAgICAgcENvbXBvbmVudFRlbXAgPSBwQ29tcG9uZW50VGVtcC0+cE5leHQ7CisgICAgICAgIH0KKyAgICAgICAgaWYgKG51bUVsZW0gPiAwKSB7CisgICAgICAgICAgICBwT01YV2FpdENvbXBvbmVudCA9IGdwVmlkZW9EZWNSTVdhaXRpbmdMaXN0LT5wT01YU3RhbmRDb21wOworICAgICAgICAgICAgcmVtb3ZlRWxlbWVudExpc3QoJmdwVmlkZW9EZWNSTVdhaXRpbmdMaXN0LCBwT01YV2FpdENvbXBvbmVudCk7CisgICAgICAgICAgICByZXQgPSBPTVhfU2VuZENvbW1hbmQocE9NWFdhaXRDb21wb25lbnQsIE9NWF9Db21tYW5kU3RhdGVTZXQsIE9NWF9TdGF0ZUlkbGUsIE5VTEwpOworICAgICAgICAgICAgaWYgKHJldCAhPSBPTVhfRXJyb3JOb25lKSB7CisgICAgICAgICAgICAgICAgZ290byBFWElUOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfSBlbHNlIGlmIChwU0VDQ29tcG9uZW50LT5jb2RlY1R5cGUgPT0gSFdfVklERU9fRU5DX0NPREVDKSB7CisgICAgICAgIHBDb21wb25lbnRUZW1wID0gZ3BWaWRlb0VuY1JNV2FpdGluZ0xpc3Q7CisgICAgICAgIGlmIChncFZpZGVvRW5jUk1Db21wb25lbnRMaXN0ID09IE5VTEwpIHsKKyAgICAgICAgICAgIHJldCA9IE9NWF9FcnJvclVuZGVmaW5lZDsKKyAgICAgICAgICAgIGdvdG8gRVhJVDsKKyAgICAgICAgfQorCisgICAgICAgIHJldCA9IHJlbW92ZUVsZW1lbnRMaXN0KCZncFZpZGVvRW5jUk1Db21wb25lbnRMaXN0LCBwT01YQ29tcG9uZW50KTsKKyAgICAgICAgaWYgKHJldCAhPSBPTVhfRXJyb3JOb25lKSB7CisgICAgICAgICAgICByZXQgPSBPTVhfRXJyb3JVbmRlZmluZWQ7CisgICAgICAgICAgICBnb3RvIEVYSVQ7CisgICAgICAgIH0KKyAgICAgICAgd2hpbGUgKHBDb21wb25lbnRUZW1wKSB7CisgICAgICAgICAgICBudW1FbGVtKys7CisgICAgICAgICAgICBwQ29tcG9uZW50VGVtcCA9IHBDb21wb25lbnRUZW1wLT5wTmV4dDsKKyAgICAgICAgfQorICAgICAgICBpZiAobnVtRWxlbSA+IDApIHsKKyAgICAgICAgICAgIHBPTVhXYWl0Q29tcG9uZW50ID0gZ3BWaWRlb0VuY1JNV2FpdGluZ0xpc3QtPnBPTVhTdGFuZENvbXA7CisgICAgICAgICAgICByZW1vdmVFbGVtZW50TGlzdCgmZ3BWaWRlb0VuY1JNV2FpdGluZ0xpc3QsIHBPTVhXYWl0Q29tcG9uZW50KTsKKyAgICAgICAgICAgIHJldCA9IE9NWF9TZW5kQ29tbWFuZChwT01YV2FpdENvbXBvbmVudCwgT01YX0NvbW1hbmRTdGF0ZVNldCwgT01YX1N0YXRlSWRsZSwgTlVMTCk7CisgICAgICAgICAgICBpZiAocmV0ICE9IE9NWF9FcnJvck5vbmUpIHsKKyAgICAgICAgICAgICAgICBnb3RvIEVYSVQ7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKK0VYSVQ6CisKKyAgICBTRUNfT1NBTF9NdXRleFVubG9jayhnaFZpZGVvUk1Db21wb25lbnRMaXN0TXV0ZXgpOworCisgICAgRnVuY3Rpb25PdXQoKTsKKworICAgIHJldHVybiByZXQ7Cit9CisKK09NWF9FUlJPUlRZUEUgU0VDX09NWF9Jbl9XYWl0Rm9yUmVzb3VyY2UoT01YX0NPTVBPTkVOVFRZUEUgKnBPTVhDb21wb25lbnQpCit7CisgICAgT01YX0VSUk9SVFlQRSAgICAgICAgICByZXQgPSBPTVhfRXJyb3JOb25lOworICAgIFNFQ19PTVhfQkFTRUNPTVBPTkVOVCAqcFNFQ0NvbXBvbmVudCA9IE5VTEw7CisKKyAgICBGdW5jdGlvbkluKCk7CisKKyAgICBTRUNfT1NBTF9NdXRleExvY2soZ2hWaWRlb1JNQ29tcG9uZW50TGlzdE11dGV4KTsKKworICAgIHBTRUNDb21wb25lbnQgPSAoU0VDX09NWF9CQVNFQ09NUE9ORU5UICopcE9NWENvbXBvbmVudC0+cENvbXBvbmVudFByaXZhdGU7CisgICAgaWYgKHBTRUNDb21wb25lbnQtPmNvZGVjVHlwZSA9PSBIV19WSURFT19ERUNfQ09ERUMpCisgICAgICAgIHJldCA9IGFkZEVsZW1lbnRMaXN0KCZncFZpZGVvRGVjUk1XYWl0aW5nTGlzdCwgcE9NWENvbXBvbmVudCk7CisgICAgZWxzZSBpZiAocFNFQ0NvbXBvbmVudC0+Y29kZWNUeXBlID09IEhXX1ZJREVPX0VOQ19DT0RFQykKKyAgICAgICAgcmV0ID0gYWRkRWxlbWVudExpc3QoJmdwVmlkZW9FbmNSTVdhaXRpbmdMaXN0LCBwT01YQ29tcG9uZW50KTsKKworICAgIFNFQ19PU0FMX011dGV4VW5sb2NrKGdoVmlkZW9STUNvbXBvbmVudExpc3RNdXRleCk7CisKKyAgICBGdW5jdGlvbk91dCgpOworCisgICAgcmV0dXJuIHJldDsKK30KKworT01YX0VSUk9SVFlQRSBTRUNfT01YX091dF9XYWl0Rm9yUmVzb3VyY2UoT01YX0NPTVBPTkVOVFRZUEUgKnBPTVhDb21wb25lbnQpCit7CisgICAgT01YX0VSUk9SVFlQRSAgICAgICAgICByZXQgPSBPTVhfRXJyb3JOb25lOworICAgIFNFQ19PTVhfQkFTRUNPTVBPTkVOVCAqcFNFQ0NvbXBvbmVudCA9IE5VTEw7CisKKyAgICBGdW5jdGlvbkluKCk7CisKKyAgICBTRUNfT1NBTF9NdXRleExvY2soZ2hWaWRlb1JNQ29tcG9uZW50TGlzdE11dGV4KTsKKworICAgIHBTRUNDb21wb25lbnQgPSAoU0VDX09NWF9CQVNFQ09NUE9ORU5UICopcE9NWENvbXBvbmVudC0+cENvbXBvbmVudFByaXZhdGU7CisgICAgaWYgKHBTRUNDb21wb25lbnQtPmNvZGVjVHlwZSA9PSBIV19WSURFT19ERUNfQ09ERUMpCisgICAgICAgIHJldCA9IHJlbW92ZUVsZW1lbnRMaXN0KCZncFZpZGVvRGVjUk1XYWl0aW5nTGlzdCwgcE9NWENvbXBvbmVudCk7CisgICAgZWxzZSBpZiAocFNFQ0NvbXBvbmVudC0+Y29kZWNUeXBlID09IEhXX1ZJREVPX0VOQ19DT0RFQykKKyAgICAgICAgcmV0ID0gcmVtb3ZlRWxlbWVudExpc3QoJmdwVmlkZW9FbmNSTVdhaXRpbmdMaXN0LCBwT01YQ29tcG9uZW50KTsKKworICAgIFNFQ19PU0FMX011dGV4VW5sb2NrKGdoVmlkZW9STUNvbXBvbmVudExpc3RNdXRleCk7CisKKyAgICBGdW5jdGlvbk91dCgpOworCisgICAgcmV0dXJuIHJldDsKK30KKwpkaWZmIC0tZ2l0IGEvZXh5bm9zNC9tdWx0aW1lZGlhL29wZW5tYXgvc2VjX29teC9jb21wb25lbnQvY29tbW9uL1NFQ19PTVhfUmVzb3VyY2VtYW5hZ2VyLmggYi9leHlub3M0L211bHRpbWVkaWEvb3Blbm1heC9zZWNfb214L2NvbXBvbmVudC9jb21tb24vU0VDX09NWF9SZXNvdXJjZW1hbmFnZXIuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lNzhiMzc4Ci0tLSAvZGV2L251bGwKKysrIGIvZXh5bm9zNC9tdWx0aW1lZGlhL29wZW5tYXgvc2VjX29teC9jb21wb25lbnQvY29tbW9uL1NFQ19PTVhfUmVzb3VyY2VtYW5hZ2VyLmgKQEAgLTAsMCArMSw1OSBAQAorLyoKKyAqCisgKiBDb3B5cmlnaHQgMjAxMCBTYW1zdW5nIEVsZWN0cm9uaWNzIFMuTFNJIENvLiBMVEQKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworLyoKKyAqIEBmaWxlICAgICAgIFNFQ19PTVhfUmVzb3VyY2VtYW5hZ2VyLmgKKyAqIEBicmllZgorICogQGF1dGhvciAgICAgU2V1bmdCZW9tIEtpbSAoc2JjcnV4LmtpbUBzYW1zdW5nLmNvbSkKKyAqIEB2ZXJzaW9uICAgIDEuMS4wCisgKiBAaGlzdG9yeQorICogICAgMjAxMC43LjE1IDogQ3JlYXRlCisgKi8KKworI2lmbmRlZiBTRUNfT01YX1JFU09VUkNFTUFOQUdFUgorI2RlZmluZSBTRUNfT01YX1JFU09VUkNFTUFOQUdFUgorCisKKyNpbmNsdWRlICJTRUNfT01YX0RlZi5oIgorI2luY2x1ZGUgIk9NWF9Db21wb25lbnQuaCIKKworCitzdHJ1Y3QgU0VDX09NWF9STV9DT01QT05FTlRfTElTVDsKK3R5cGVkZWYgc3RydWN0IF9TRUNfT01YX1JNX0NPTVBPTkVOVF9MSVNUCit7CisgICAgT01YX0NPTVBPTkVOVFRZUEUgICAgICAgICAqcE9NWFN0YW5kQ29tcDsKKyAgICBPTVhfVTMyICAgICAgICAgICAgICAgICAgICBncm91cFByaW9yaXR5OworICAgIHN0cnVjdCBfU0VDX09NWF9STV9DT01QT05FTlRfTElTVCAqcE5leHQ7Cit9IFNFQ19PTVhfUk1fQ09NUE9ORU5UX0xJU1Q7CisKKworI2lmZGVmIF9fY3BsdXNwbHVzCitleHRlcm4gIkMiIHsKKyNlbmRpZgorCitPTVhfRVJST1JUWVBFIFNFQ19PTVhfUmVzb3VyY2VNYW5hZ2VyX0luaXQoKTsKK09NWF9FUlJPUlRZUEUgU0VDX09NWF9SZXNvdXJjZU1hbmFnZXJfRGVpbml0KCk7CitPTVhfRVJST1JUWVBFIFNFQ19PTVhfR2V0X1Jlc291cmNlKE9NWF9DT01QT05FTlRUWVBFICpwT01YQ29tcG9uZW50KTsKK09NWF9FUlJPUlRZUEUgU0VDX09NWF9SZWxlYXNlX1Jlc291cmNlKE9NWF9DT01QT05FTlRUWVBFICpwT01YQ29tcG9uZW50KTsKK09NWF9FUlJPUlRZUEUgU0VDX09NWF9Jbl9XYWl0Rm9yUmVzb3VyY2UoT01YX0NPTVBPTkVOVFRZUEUgKnBPTVhDb21wb25lbnQpOworT01YX0VSUk9SVFlQRSBTRUNfT01YX091dF9XYWl0Rm9yUmVzb3VyY2UoT01YX0NPTVBPTkVOVFRZUEUgKnBPTVhDb21wb25lbnQpOworCisjaWZkZWYgX19jcGx1c3BsdXMKK307CisjZW5kaWYKKworI2VuZGlmCmRpZmYgLS1naXQgYS9leHlub3M0L211bHRpbWVkaWEvb3Blbm1heC9zZWNfb214L2NvbXBvbmVudC92aWRlby9kZWMvQW5kcm9pZC5tayBiL2V4eW5vczQvbXVsdGltZWRpYS9vcGVubWF4L3NlY19vbXgvY29tcG9uZW50L3ZpZGVvL2RlYy9BbmRyb2lkLm1rCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjM0OWJlNmYKLS0tIC9kZXYvbnVsbAorKysgYi9leHlub3M0L211bHRpbWVkaWEvb3Blbm1heC9zZWNfb214L2NvbXBvbmVudC92aWRlby9kZWMvQW5kcm9pZC5tawpAQCAtMCwwICsxLDIzIEBACitMT0NBTF9QQVRIIDo9ICQoY2FsbCBteS1kaXIpCitpbmNsdWRlICQoQ0xFQVJfVkFSUykKKworTE9DQUxfU1JDX0ZJTEVTIDo9IFwKKwlTRUNfT01YX1ZkZWMuYworCitMT0NBTF9NT0RVTEUgOj0gbGliU0VDX09NWF9WZGVjCitMT0NBTF9BUk1fTU9ERSA6PSBhcm0KK0xPQ0FMX01PRFVMRV9UQUdTIDo9IG9wdGlvbmFsCisKK0xPQ0FMX0NfSU5DTFVERVMgOj0gJChTRUNfT01YX0lOQykva2hyb25vcyBcCisJJChTRUNfT01YX0lOQykvc2VjIFwKKwkkKFNFQ19PTVhfVE9QKS9vc2FsIFwKKwkkKFNFQ19PTVhfVE9QKS9jb3JlIFwKKwkkKFNFQ19PTVhfQ09NUE9ORU5UKS9jb21tb24gXAorCSQoU0VDX09NWF9DT01QT05FTlQpL3ZpZGVvL2RlYworCitpZmVxICgkKEJPQVJEX1VTRV9BTkIpLCB0cnVlKQorTE9DQUxfU1RBVElDX0xJQlJBUklFUyA6PSBsaWJzZWNvc2FsCitMT0NBTF9DRkxBR1MgKz0gLURVU0VfQU5CCitlbmRpZgorCitpbmNsdWRlICQoQlVJTERfU1RBVElDX0xJQlJBUlkpCmRpZmYgLS1naXQgYS9leHlub3M0L211bHRpbWVkaWEvb3Blbm1heC9zZWNfb214L2NvbXBvbmVudC92aWRlby9kZWMvU0VDX09NWF9WZGVjLmMgYi9leHlub3M0L211bHRpbWVkaWEvb3Blbm1heC9zZWNfb214L2NvbXBvbmVudC92aWRlby9kZWMvU0VDX09NWF9WZGVjLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDQyZGQyNQotLS0gL2Rldi9udWxsCisrKyBiL2V4eW5vczQvbXVsdGltZWRpYS9vcGVubWF4L3NlY19vbXgvY29tcG9uZW50L3ZpZGVvL2RlYy9TRUNfT01YX1ZkZWMuYwpAQCAtMCwwICsxLDE1NDQgQEAKKy8qCisgKgorICogQ29weXJpZ2h0IDIwMTAgU2Ftc3VuZyBFbGVjdHJvbmljcyBTLkxTSSBDby4gTFRECisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKy8qCisgKiBAZmlsZSAgICAgICAgU0VDX09NWF9WZGVjLmMKKyAqIEBicmllZgorICogQGF1dGhvciAgICAgIFNldW5nQmVvbSBLaW0gKHNiY3J1eC5raW1Ac2Ftc3VuZy5jb20pCisgKiAgICAgICAgICAgICAgSHllWWVvbiBDaHVuZyAoaHllb24uY2h1bmdAc2Ftc3VuZy5jb20pCisgKiAgICAgICAgICAgICAgWXVuamkgS2ltICh5dW5qaS5raW1Ac2Ftc3VuZy5jb20pCisgKiBAdmVyc2lvbiAgICAgMS4xLjAKKyAqIEBoaXN0b3J5CisgKiAgIDIwMTAuNy4xNSA6IENyZWF0ZQorICovCisKKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgPHN0ZGxpYi5oPgorI2luY2x1ZGUgPHN0cmluZy5oPgorI2luY2x1ZGUgIlNFQ19PTVhfTWFjcm9zLmgiCisjaW5jbHVkZSAiU0VDX09TQUxfRXZlbnQuaCIKKyNpbmNsdWRlICJTRUNfT01YX1ZkZWMuaCIKKyNpbmNsdWRlICJTRUNfT01YX0Jhc2Vjb21wb25lbnQuaCIKKyNpbmNsdWRlICJTRUNfT1NBTF9UaHJlYWQuaCIKKyNpbmNsdWRlICJTRUNfT1NBTF9TZW1hcGhvcmUuaCIKKyNpbmNsdWRlICJTRUNfT1NBTF9NdXRleC5oIgorI2luY2x1ZGUgIlNFQ19PU0FMX0VUQy5oIgorCisjaWZkZWYgVVNFX0FOQgorI2luY2x1ZGUgIlNFQ19PU0FMX0FuZHJvaWQuaCIKKyNlbmRpZgorCisjdW5kZWYgIFNFQ19MT0dfVEFHCisjZGVmaW5lIFNFQ19MT0dfVEFHICAgICJTRUNfVklERU9fREVDIgorI2RlZmluZSBTRUNfTE9HX09GRgorI2luY2x1ZGUgIlNFQ19PU0FMX0xvZy5oIgorCisKK2lubGluZSB2b2lkIFNFQ19VcGRhdGVGcmFtZVNpemUoT01YX0NPTVBPTkVOVFRZUEUgKnBPTVhDb21wb25lbnQpCit7CisgICAgU0VDX09NWF9CQVNFQ09NUE9ORU5UICpwU0VDQ29tcG9uZW50ID0gKFNFQ19PTVhfQkFTRUNPTVBPTkVOVCAqKXBPTVhDb21wb25lbnQtPnBDb21wb25lbnRQcml2YXRlOworICAgIFNFQ19PTVhfQkFTRVBPUlQgICAgICAqc2VjSW5wdXRQb3J0ID0gJnBTRUNDb21wb25lbnQtPnBTRUNQb3J0W0lOUFVUX1BPUlRfSU5ERVhdOworICAgIFNFQ19PTVhfQkFTRVBPUlQgICAgICAqc2VjT3V0cHV0UG9ydCA9ICZwU0VDQ29tcG9uZW50LT5wU0VDUG9ydFtPVVRQVVRfUE9SVF9JTkRFWF07CisKKyAgICBpZiAoKHNlY091dHB1dFBvcnQtPnBvcnREZWZpbml0aW9uLmZvcm1hdC52aWRlby5uRnJhbWVXaWR0aCAhPQorICAgICAgICAgICAgc2VjSW5wdXRQb3J0LT5wb3J0RGVmaW5pdGlvbi5mb3JtYXQudmlkZW8ubkZyYW1lV2lkdGgpIHx8CisgICAgICAgIChzZWNPdXRwdXRQb3J0LT5wb3J0RGVmaW5pdGlvbi5mb3JtYXQudmlkZW8ubkZyYW1lSGVpZ2h0ICE9CisgICAgICAgICAgICBzZWNJbnB1dFBvcnQtPnBvcnREZWZpbml0aW9uLmZvcm1hdC52aWRlby5uRnJhbWVIZWlnaHQpKSB7CisgICAgICAgIE9NWF9VMzIgd2lkdGggPSAwLCBoZWlnaHQgPSAwOworCisgICAgICAgIHNlY091dHB1dFBvcnQtPnBvcnREZWZpbml0aW9uLmZvcm1hdC52aWRlby5uRnJhbWVXaWR0aCA9CisgICAgICAgICAgICBzZWNJbnB1dFBvcnQtPnBvcnREZWZpbml0aW9uLmZvcm1hdC52aWRlby5uRnJhbWVXaWR0aDsKKyAgICAgICAgc2VjT3V0cHV0UG9ydC0+cG9ydERlZmluaXRpb24uZm9ybWF0LnZpZGVvLm5GcmFtZUhlaWdodCA9CisgICAgICAgICAgICBzZWNJbnB1dFBvcnQtPnBvcnREZWZpbml0aW9uLmZvcm1hdC52aWRlby5uRnJhbWVIZWlnaHQ7CisgICAgICAgIHdpZHRoID0gc2VjT3V0cHV0UG9ydC0+cG9ydERlZmluaXRpb24uZm9ybWF0LnZpZGVvLm5TdHJpZGUgPQorICAgICAgICAgICAgc2VjSW5wdXRQb3J0LT5wb3J0RGVmaW5pdGlvbi5mb3JtYXQudmlkZW8ublN0cmlkZTsKKyAgICAgICAgaGVpZ2h0ID0gc2VjT3V0cHV0UG9ydC0+cG9ydERlZmluaXRpb24uZm9ybWF0LnZpZGVvLm5TbGljZUhlaWdodCA9CisgICAgICAgICAgICBzZWNJbnB1dFBvcnQtPnBvcnREZWZpbml0aW9uLmZvcm1hdC52aWRlby5uU2xpY2VIZWlnaHQ7CisKKyAgICAgICAgc3dpdGNoKHNlY091dHB1dFBvcnQtPnBvcnREZWZpbml0aW9uLmZvcm1hdC52aWRlby5lQ29sb3JGb3JtYXQpIHsKKyAgICAgICAgY2FzZSBPTVhfQ09MT1JfRm9ybWF0WVVWNDIwUGxhbmFyOgorICAgICAgICBjYXNlIE9NWF9DT0xPUl9Gb3JtYXRZVVY0MjBTZW1pUGxhbmFyOgorICAgICAgICBjYXNlIE9NWF9TRUNfQ09MT1JfRm9ybWF0TlYxMlRQaHlzaWNhbEFkZHJlc3M6CisgICAgICAgIGNhc2UgT01YX1NFQ19DT0xPUl9Gb3JtYXRBTkJZVVY0MjBTZW1pUGxhbmFyOgorICAgICAgICAgICAgaWYgKHdpZHRoICYmIGhlaWdodCkKKyAgICAgICAgICAgICAgICBzZWNPdXRwdXRQb3J0LT5wb3J0RGVmaW5pdGlvbi5uQnVmZmVyU2l6ZSA9ICh3aWR0aCAqIGhlaWdodCAqIDMpIC8gMjsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIE9NWF9TRUNfQ09MT1JfRm9ybWF0TlYxMlRpbGVkOgorICAgICAgICAgICAgd2lkdGggPSBzZWNPdXRwdXRQb3J0LT5wb3J0RGVmaW5pdGlvbi5mb3JtYXQudmlkZW8ubkZyYW1lV2lkdGg7CisgICAgICAgICAgICBoZWlnaHQgPSBzZWNPdXRwdXRQb3J0LT5wb3J0RGVmaW5pdGlvbi5mb3JtYXQudmlkZW8ubkZyYW1lSGVpZ2h0OworICAgICAgICAgICAgaWYgKHdpZHRoICYmIGhlaWdodCkgeworICAgICAgICAgICAgICAgIHNlY091dHB1dFBvcnQtPnBvcnREZWZpbml0aW9uLm5CdWZmZXJTaXplID0KKyAgICAgICAgICAgICAgICAgICAgQUxJR05fVE9fOEtCKEFMSUdOX1RPXzEyOEIod2lkdGgpICogQUxJR05fVE9fMzJCKGhlaWdodCkpIFwKKyAgICAgICAgICAgICAgICAgICAgKyBBTElHTl9UT184S0IoQUxJR05fVE9fMTI4Qih3aWR0aCkgKiBBTElHTl9UT18zMkIoaGVpZ2h0LzIpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgaWYgKHdpZHRoICYmIGhlaWdodCkKKyAgICAgICAgICAgICAgICBzZWNPdXRwdXRQb3J0LT5wb3J0RGVmaW5pdGlvbi5uQnVmZmVyU2l6ZSA9IHdpZHRoICogaGVpZ2h0ICogMjsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgfQorCisgIHJldHVybiA7Cit9CisKK09NWF9FUlJPUlRZUEUgU0VDX09NWF9Vc2VCdWZmZXIoCisgICAgT01YX0lOIE9NWF9IQU5ETEVUWVBFICAgICAgICAgICAgaENvbXBvbmVudCwKKyAgICBPTVhfSU5PVVQgT01YX0JVRkZFUkhFQURFUlRZUEUgKipwcEJ1ZmZlckhkciwKKyAgICBPTVhfSU4gT01YX1UzMiAgICAgICAgICAgICAgICAgICBuUG9ydEluZGV4LAorICAgIE9NWF9JTiBPTVhfUFRSICAgICAgICAgICAgICAgICAgIHBBcHBQcml2YXRlLAorICAgIE9NWF9JTiBPTVhfVTMyICAgICAgICAgICAgICAgICAgIG5TaXplQnl0ZXMsCisgICAgT01YX0lOIE9NWF9VOCAgICAgICAgICAgICAgICAgICAqcEJ1ZmZlcikKK3sKKyAgICBPTVhfRVJST1JUWVBFICAgICAgICAgIHJldCA9IE9NWF9FcnJvck5vbmU7CisgICAgT01YX0NPTVBPTkVOVFRZUEUgICAgICpwT01YQ29tcG9uZW50ID0gTlVMTDsKKyAgICBTRUNfT01YX0JBU0VDT01QT05FTlQgKnBTRUNDb21wb25lbnQgPSBOVUxMOworICAgIFNFQ19PTVhfQkFTRVBPUlQgICAgICAqcFNFQ1BvcnQgPSBOVUxMOworICAgIE9NWF9CVUZGRVJIRUFERVJUWVBFICAqdGVtcF9idWZmZXJIZWFkZXIgPSBOVUxMOworICAgIE9NWF9VMzIgICAgICAgICAgICAgICAgaSA9IDA7CisKKyAgICBGdW5jdGlvbkluKCk7CisKKyAgICBpZiAoaENvbXBvbmVudCA9PSBOVUxMKSB7CisgICAgICAgIHJldCA9IE9NWF9FcnJvckJhZFBhcmFtZXRlcjsKKyAgICAgICAgZ290byBFWElUOworICAgIH0KKyAgICBwT01YQ29tcG9uZW50ID0gKE9NWF9DT01QT05FTlRUWVBFICopaENvbXBvbmVudDsKKyAgICByZXQgPSBTRUNfT01YX0NoZWNrX1NpemVWZXJzaW9uKHBPTVhDb21wb25lbnQsIHNpemVvZihPTVhfQ09NUE9ORU5UVFlQRSkpOworICAgIGlmIChyZXQgIT0gT01YX0Vycm9yTm9uZSkgeworICAgICAgICBnb3RvIEVYSVQ7CisgICAgfQorCisgICAgaWYgKHBPTVhDb21wb25lbnQtPnBDb21wb25lbnRQcml2YXRlID09IE5VTEwpIHsKKyAgICAgICAgcmV0ID0gT01YX0Vycm9yQmFkUGFyYW1ldGVyOworICAgICAgICBnb3RvIEVYSVQ7CisgICAgfQorICAgIHBTRUNDb21wb25lbnQgPSAoU0VDX09NWF9CQVNFQ09NUE9ORU5UICopcE9NWENvbXBvbmVudC0+cENvbXBvbmVudFByaXZhdGU7CisKKyAgICBwU0VDUG9ydCA9ICZwU0VDQ29tcG9uZW50LT5wU0VDUG9ydFtuUG9ydEluZGV4XTsKKyAgICBpZiAoblBvcnRJbmRleCA+PSBwU0VDQ29tcG9uZW50LT5wb3J0UGFyYW0ublBvcnRzKSB7CisgICAgICAgIHJldCA9IE9NWF9FcnJvckJhZFBvcnRJbmRleDsKKyAgICAgICAgZ290byBFWElUOworICAgIH0KKyAgICBpZiAocFNFQ1BvcnQtPnBvcnRTdGF0ZSAhPSBPTVhfU3RhdGVJZGxlKSB7CisgICAgICAgIHJldCA9IE9NWF9FcnJvckluY29ycmVjdFN0YXRlT3BlcmF0aW9uOworICAgICAgICBnb3RvIEVYSVQ7CisgICAgfQorCisgICAgaWYgKENIRUNLX1BPUlRfVFVOTkVMRUQocFNFQ1BvcnQpICYmIENIRUNLX1BPUlRfQlVGRkVSX1NVUFBMSUVSKHBTRUNQb3J0KSkgeworICAgICAgICByZXQgPSBPTVhfRXJyb3JCYWRQb3J0SW5kZXg7CisgICAgICAgIGdvdG8gRVhJVDsKKyAgICB9CisKKyAgICB0ZW1wX2J1ZmZlckhlYWRlciA9IChPTVhfQlVGRkVSSEVBREVSVFlQRSAqKVNFQ19PU0FMX01hbGxvYyhzaXplb2YoT01YX0JVRkZFUkhFQURFUlRZUEUpKTsKKyAgICBpZiAodGVtcF9idWZmZXJIZWFkZXIgPT0gTlVMTCkgeworICAgICAgICByZXQgPSBPTVhfRXJyb3JJbnN1ZmZpY2llbnRSZXNvdXJjZXM7CisgICAgICAgIGdvdG8gRVhJVDsKKyAgICB9CisgICAgU0VDX09TQUxfTWVtc2V0KHRlbXBfYnVmZmVySGVhZGVyLCAwLCBzaXplb2YoT01YX0JVRkZFUkhFQURFUlRZUEUpKTsKKworICAgIGZvciAoaSA9IDA7IGkgPCBwU0VDUG9ydC0+cG9ydERlZmluaXRpb24ubkJ1ZmZlckNvdW50QWN0dWFsOyBpKyspIHsKKyAgICAgICAgaWYgKHBTRUNQb3J0LT5idWZmZXJTdGF0ZUFsbG9jYXRlW2ldID09IEJVRkZFUl9TVEFURV9GUkVFKSB7CisgICAgICAgICAgICBwU0VDUG9ydC0+YnVmZmVySGVhZGVyW2ldID0gdGVtcF9idWZmZXJIZWFkZXI7CisgICAgICAgICAgICBwU0VDUG9ydC0+YnVmZmVyU3RhdGVBbGxvY2F0ZVtpXSA9IChCVUZGRVJfU1RBVEVfQVNTSUdORUQgfCBIRUFERVJfU1RBVEVfQUxMT0NBVEVEKTsKKyAgICAgICAgICAgIElOSVRfU0VUX1NJWkVfVkVSU0lPTih0ZW1wX2J1ZmZlckhlYWRlciwgT01YX0JVRkZFUkhFQURFUlRZUEUpOworICAgICAgICAgICAgdGVtcF9idWZmZXJIZWFkZXItPnBCdWZmZXIgICAgICAgID0gcEJ1ZmZlcjsKKyAgICAgICAgICAgIHRlbXBfYnVmZmVySGVhZGVyLT5uQWxsb2NMZW4gICAgICA9IG5TaXplQnl0ZXM7CisgICAgICAgICAgICB0ZW1wX2J1ZmZlckhlYWRlci0+cEFwcFByaXZhdGUgICAgPSBwQXBwUHJpdmF0ZTsKKyAgICAgICAgICAgIGlmIChuUG9ydEluZGV4ID09IElOUFVUX1BPUlRfSU5ERVgpCisgICAgICAgICAgICAgICAgdGVtcF9idWZmZXJIZWFkZXItPm5JbnB1dFBvcnRJbmRleCA9IElOUFVUX1BPUlRfSU5ERVg7CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgdGVtcF9idWZmZXJIZWFkZXItPm5PdXRwdXRQb3J0SW5kZXggPSBPVVRQVVRfUE9SVF9JTkRFWDsKKworICAgICAgICAgICAgcFNFQ1BvcnQtPmFzc2lnbmVkQnVmZmVyTnVtKys7CisgICAgICAgICAgICBpZiAocFNFQ1BvcnQtPmFzc2lnbmVkQnVmZmVyTnVtID09IHBTRUNQb3J0LT5wb3J0RGVmaW5pdGlvbi5uQnVmZmVyQ291bnRBY3R1YWwpIHsKKyAgICAgICAgICAgICAgICBwU0VDUG9ydC0+cG9ydERlZmluaXRpb24uYlBvcHVsYXRlZCA9IE9NWF9UUlVFOworICAgICAgICAgICAgICAgIC8qIFNFQ19PU0FMX011dGV4TG9jayhwU0VDQ29tcG9uZW50LT5jb21wTXV0ZXgpOyAqLworICAgICAgICAgICAgICAgIFNFQ19PU0FMX1NlbWFwaG9yZVBvc3QocFNFQ1BvcnQtPmxvYWRlZFJlc291cmNlKTsKKyAgICAgICAgICAgICAgICAvKiBTRUNfT1NBTF9NdXRleFVubG9jayhwU0VDQ29tcG9uZW50LT5jb21wTXV0ZXgpOyAqLworICAgICAgICAgICAgfQorICAgICAgICAgICAgKnBwQnVmZmVySGRyID0gdGVtcF9idWZmZXJIZWFkZXI7CisgICAgICAgICAgICByZXQgPSBPTVhfRXJyb3JOb25lOworICAgICAgICAgICAgZ290byBFWElUOworICAgICAgICB9CisgICAgfQorCisgICAgU0VDX09TQUxfRnJlZSh0ZW1wX2J1ZmZlckhlYWRlcik7CisgICAgcmV0ID0gT01YX0Vycm9ySW5zdWZmaWNpZW50UmVzb3VyY2VzOworCitFWElUOgorICAgIEZ1bmN0aW9uT3V0KCk7CisKKyAgICByZXR1cm4gcmV0OworfQorCitPTVhfRVJST1JUWVBFIFNFQ19PTVhfQWxsb2NhdGVCdWZmZXIoCisgICAgT01YX0lOIE9NWF9IQU5ETEVUWVBFICAgICAgICAgICAgaENvbXBvbmVudCwKKyAgICBPTVhfSU5PVVQgT01YX0JVRkZFUkhFQURFUlRZUEUgKipwcEJ1ZmZlciwKKyAgICBPTVhfSU4gT01YX1UzMiAgICAgICAgICAgICAgICAgICBuUG9ydEluZGV4LAorICAgIE9NWF9JTiBPTVhfUFRSICAgICAgICAgICAgICAgICAgIHBBcHBQcml2YXRlLAorICAgIE9NWF9JTiBPTVhfVTMyICAgICAgICAgICAgICAgICAgIG5TaXplQnl0ZXMpCit7CisgICAgT01YX0VSUk9SVFlQRSAgICAgICAgICByZXQgPSBPTVhfRXJyb3JOb25lOworICAgIE9NWF9DT01QT05FTlRUWVBFICAgICAqcE9NWENvbXBvbmVudCA9IE5VTEw7CisgICAgU0VDX09NWF9CQVNFQ09NUE9ORU5UICpwU0VDQ29tcG9uZW50ID0gTlVMTDsKKyAgICBTRUNfT01YX1ZJREVPREVDX0NPTVBPTkVOVCAqcFZpZGVvRGVjID0gTlVMTDsKKyAgICBTRUNfT01YX0JBU0VQT1JUICAgICAgKnBTRUNQb3J0ID0gTlVMTDsKKyAgICBPTVhfQlVGRkVSSEVBREVSVFlQRSAgKnRlbXBfYnVmZmVySGVhZGVyID0gTlVMTDsKKyAgICBPTVhfVTggICAgICAgICAgICAgICAgKnRlbXBfYnVmZmVyID0gTlVMTDsKKyAgICBPTVhfVTMyICAgICAgICAgICAgICAgIGkgPSAwOworCisgICAgRnVuY3Rpb25JbigpOworCisgICAgaWYgKGhDb21wb25lbnQgPT0gTlVMTCkgeworICAgICAgICByZXQgPSBPTVhfRXJyb3JCYWRQYXJhbWV0ZXI7CisgICAgICAgIGdvdG8gRVhJVDsKKyAgICB9CisgICAgcE9NWENvbXBvbmVudCA9IChPTVhfQ09NUE9ORU5UVFlQRSAqKWhDb21wb25lbnQ7CisgICAgcmV0ID0gU0VDX09NWF9DaGVja19TaXplVmVyc2lvbihwT01YQ29tcG9uZW50LCBzaXplb2YoT01YX0NPTVBPTkVOVFRZUEUpKTsKKyAgICBpZiAocmV0ICE9IE9NWF9FcnJvck5vbmUpIHsKKyAgICAgICAgZ290byBFWElUOworICAgIH0KKworICAgIGlmIChwT01YQ29tcG9uZW50LT5wQ29tcG9uZW50UHJpdmF0ZSA9PSBOVUxMKSB7CisgICAgICAgIHJldCA9IE9NWF9FcnJvckJhZFBhcmFtZXRlcjsKKyAgICAgICAgZ290byBFWElUOworICAgIH0KKyAgICBwU0VDQ29tcG9uZW50ID0gKFNFQ19PTVhfQkFTRUNPTVBPTkVOVCAqKXBPTVhDb21wb25lbnQtPnBDb21wb25lbnRQcml2YXRlOworICAgIHBWaWRlb0RlYyA9IChTRUNfT01YX1ZJREVPREVDX0NPTVBPTkVOVCAqKXBTRUNDb21wb25lbnQtPmhDb21wb25lbnRIYW5kbGU7CisKKyAgICBwU0VDUG9ydCA9ICZwU0VDQ29tcG9uZW50LT5wU0VDUG9ydFtuUG9ydEluZGV4XTsKKyAgICBpZiAoblBvcnRJbmRleCA+PSBwU0VDQ29tcG9uZW50LT5wb3J0UGFyYW0ublBvcnRzKSB7CisgICAgICAgIHJldCA9IE9NWF9FcnJvckJhZFBvcnRJbmRleDsKKyAgICAgICAgZ290byBFWElUOworICAgIH0KKy8qCisgICAgaWYgKHBTRUNQb3J0LT5wb3J0U3RhdGUgIT0gT01YX1N0YXRlSWRsZSApIHsKKyAgICAgICAgcmV0ID0gT01YX0Vycm9ySW5jb3JyZWN0U3RhdGVPcGVyYXRpb247CisgICAgICAgIGdvdG8gRVhJVDsKKyAgICB9CisqLworICAgIGlmIChDSEVDS19QT1JUX1RVTk5FTEVEKHBTRUNQb3J0KSAmJiBDSEVDS19QT1JUX0JVRkZFUl9TVVBQTElFUihwU0VDUG9ydCkpIHsKKyAgICAgICAgcmV0ID0gT01YX0Vycm9yQmFkUG9ydEluZGV4OworICAgICAgICBnb3RvIEVYSVQ7CisgICAgfQorCisgICAgaWYgKChwVmlkZW9EZWMtPmJEUk1QbGF5ZXJNb2RlID09IE9NWF9UUlVFKSAmJiAoblBvcnRJbmRleCA9PSBJTlBVVF9QT1JUX0lOREVYKSkgeworICAgICAgICByZXQgPSBwU0VDQ29tcG9uZW50LT5zZWNfYWxsb2NTZWN1cmVJbnB1dEJ1ZmZlcihoQ29tcG9uZW50LCBzaXplb2YoT01YX1U4KSAqIG5TaXplQnl0ZXMsICZ0ZW1wX2J1ZmZlcik7CisgICAgICAgIGlmIChyZXQgIT0gT01YX0Vycm9yTm9uZSkKKyAgICAgICAgICAgIGdvdG8gRVhJVDsKKyAgICB9IGVsc2UgeworICAgICAgICB0ZW1wX2J1ZmZlciA9IFNFQ19PU0FMX01hbGxvYyhzaXplb2YoT01YX1U4KSAqIG5TaXplQnl0ZXMpOworICAgICAgICBpZiAodGVtcF9idWZmZXIgPT0gTlVMTCkgeworICAgICAgICAgICAgcmV0ID0gT01YX0Vycm9ySW5zdWZmaWNpZW50UmVzb3VyY2VzOworICAgICAgICAgICAgZ290byBFWElUOworICAgICAgICB9CisgICAgfQorCisgICAgdGVtcF9idWZmZXJIZWFkZXIgPSAoT01YX0JVRkZFUkhFQURFUlRZUEUgKilTRUNfT1NBTF9NYWxsb2Moc2l6ZW9mKE9NWF9CVUZGRVJIRUFERVJUWVBFKSk7CisgICAgaWYgKHRlbXBfYnVmZmVySGVhZGVyID09IE5VTEwpIHsKKyAgICAgICAgaWYgKChwVmlkZW9EZWMtPmJEUk1QbGF5ZXJNb2RlID09IE9NWF9UUlVFKSAmJiAoblBvcnRJbmRleCA9PSBJTlBVVF9QT1JUX0lOREVYKSkKKyAgICAgICAgICAgIHBTRUNDb21wb25lbnQtPnNlY19mcmVlU2VjdXJlSW5wdXRCdWZmZXIoaENvbXBvbmVudCwgdGVtcF9idWZmZXIpOworICAgICAgICBlbHNlCisgICAgICAgICAgICBTRUNfT1NBTF9GcmVlKHRlbXBfYnVmZmVyKTsKKworICAgICAgICB0ZW1wX2J1ZmZlciA9IE5VTEw7CisgICAgICAgIHJldCA9IE9NWF9FcnJvckluc3VmZmljaWVudFJlc291cmNlczsKKyAgICAgICAgZ290byBFWElUOworICAgIH0KKyAgICBTRUNfT1NBTF9NZW1zZXQodGVtcF9idWZmZXJIZWFkZXIsIDAsIHNpemVvZihPTVhfQlVGRkVSSEVBREVSVFlQRSkpOworCisgICAgZm9yIChpID0gMDsgaSA8IHBTRUNQb3J0LT5wb3J0RGVmaW5pdGlvbi5uQnVmZmVyQ291bnRBY3R1YWw7IGkrKykgeworICAgICAgICBpZiAocFNFQ1BvcnQtPmJ1ZmZlclN0YXRlQWxsb2NhdGVbaV0gPT0gQlVGRkVSX1NUQVRFX0ZSRUUpIHsKKyAgICAgICAgICAgIHBTRUNQb3J0LT5idWZmZXJIZWFkZXJbaV0gPSB0ZW1wX2J1ZmZlckhlYWRlcjsKKyAgICAgICAgICAgIHBTRUNQb3J0LT5idWZmZXJTdGF0ZUFsbG9jYXRlW2ldID0gKEJVRkZFUl9TVEFURV9BTExPQ0FURUQgfCBIRUFERVJfU1RBVEVfQUxMT0NBVEVEKTsKKyAgICAgICAgICAgIElOSVRfU0VUX1NJWkVfVkVSU0lPTih0ZW1wX2J1ZmZlckhlYWRlciwgT01YX0JVRkZFUkhFQURFUlRZUEUpOworICAgICAgICAgICAgdGVtcF9idWZmZXJIZWFkZXItPnBCdWZmZXIgICAgICAgID0gdGVtcF9idWZmZXI7CisgICAgICAgICAgICB0ZW1wX2J1ZmZlckhlYWRlci0+bkFsbG9jTGVuICAgICAgPSBuU2l6ZUJ5dGVzOworICAgICAgICAgICAgdGVtcF9idWZmZXJIZWFkZXItPnBBcHBQcml2YXRlICAgID0gcEFwcFByaXZhdGU7CisgICAgICAgICAgICBpZiAoblBvcnRJbmRleCA9PSBJTlBVVF9QT1JUX0lOREVYKQorICAgICAgICAgICAgICAgIHRlbXBfYnVmZmVySGVhZGVyLT5uSW5wdXRQb3J0SW5kZXggPSBJTlBVVF9QT1JUX0lOREVYOworICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgIHRlbXBfYnVmZmVySGVhZGVyLT5uT3V0cHV0UG9ydEluZGV4ID0gT1VUUFVUX1BPUlRfSU5ERVg7CisgICAgICAgICAgICBwU0VDUG9ydC0+YXNzaWduZWRCdWZmZXJOdW0rKzsKKyAgICAgICAgICAgIGlmIChwU0VDUG9ydC0+YXNzaWduZWRCdWZmZXJOdW0gPT0gcFNFQ1BvcnQtPnBvcnREZWZpbml0aW9uLm5CdWZmZXJDb3VudEFjdHVhbCkgeworICAgICAgICAgICAgICAgIHBTRUNQb3J0LT5wb3J0RGVmaW5pdGlvbi5iUG9wdWxhdGVkID0gT01YX1RSVUU7CisgICAgICAgICAgICAgICAgLyogU0VDX09TQUxfTXV0ZXhMb2NrKHBTRUNDb21wb25lbnQtPmNvbXBNdXRleCk7ICovCisgICAgICAgICAgICAgICAgU0VDX09TQUxfU2VtYXBob3JlUG9zdChwU0VDUG9ydC0+bG9hZGVkUmVzb3VyY2UpOworICAgICAgICAgICAgICAgIC8qIFNFQ19PU0FMX011dGV4VW5sb2NrKHBTRUNDb21wb25lbnQtPmNvbXBNdXRleCk7ICovCisgICAgICAgICAgICB9CisgICAgICAgICAgICAqcHBCdWZmZXIgPSB0ZW1wX2J1ZmZlckhlYWRlcjsKKyAgICAgICAgICAgIHJldCA9IE9NWF9FcnJvck5vbmU7CisgICAgICAgICAgICBnb3RvIEVYSVQ7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBTRUNfT1NBTF9GcmVlKHRlbXBfYnVmZmVySGVhZGVyKTsKKyAgICBpZiAoKHBWaWRlb0RlYy0+YkRSTVBsYXllck1vZGUgPT0gT01YX1RSVUUpICYmIChuUG9ydEluZGV4ID09IElOUFVUX1BPUlRfSU5ERVgpKQorICAgICAgICBwU0VDQ29tcG9uZW50LT5zZWNfZnJlZVNlY3VyZUlucHV0QnVmZmVyKGhDb21wb25lbnQsIHRlbXBfYnVmZmVyKTsKKyAgICBlbHNlCisgICAgICAgIFNFQ19PU0FMX0ZyZWUodGVtcF9idWZmZXIpOworCisgICAgcmV0ID0gT01YX0Vycm9ySW5zdWZmaWNpZW50UmVzb3VyY2VzOworCitFWElUOgorICAgIEZ1bmN0aW9uT3V0KCk7CisKKyAgICByZXR1cm4gcmV0OworfQorCitPTVhfRVJST1JUWVBFIFNFQ19PTVhfRnJlZUJ1ZmZlcigKKyAgICBPTVhfSU4gT01YX0hBTkRMRVRZUEUgaENvbXBvbmVudCwKKyAgICBPTVhfSU4gT01YX1UzMiAgICAgICAgblBvcnRJbmRleCwKKyAgICBPTVhfSU4gT01YX0JVRkZFUkhFQURFUlRZUEUgKnBCdWZmZXJIZHIpCit7CisgICAgT01YX0VSUk9SVFlQRSAgICAgICAgICByZXQgPSBPTVhfRXJyb3JOb25lOworICAgIE9NWF9DT01QT05FTlRUWVBFICAgICAqcE9NWENvbXBvbmVudCA9IE5VTEw7CisgICAgU0VDX09NWF9CQVNFQ09NUE9ORU5UICpwU0VDQ29tcG9uZW50ID0gTlVMTDsKKyAgICBTRUNfT01YX1ZJREVPREVDX0NPTVBPTkVOVCAqcFZpZGVvRGVjID0gTlVMTDsKKyAgICBTRUNfT01YX0JBU0VQT1JUICAgICAgKnBTRUNQb3J0ID0gTlVMTDsKKyAgICBPTVhfQlVGRkVSSEVBREVSVFlQRSAgKnRlbXBfYnVmZmVySGVhZGVyID0gTlVMTDsKKyAgICBPTVhfVTggICAgICAgICAgICAgICAgKnRlbXBfYnVmZmVyID0gTlVMTDsKKyAgICBPTVhfVTMyICAgICAgICAgICAgICAgIGkgPSAwOworCisgICAgRnVuY3Rpb25JbigpOworCisgICAgaWYgKGhDb21wb25lbnQgPT0gTlVMTCkgeworICAgICAgICByZXQgPSBPTVhfRXJyb3JCYWRQYXJhbWV0ZXI7CisgICAgICAgIGdvdG8gRVhJVDsKKyAgICB9CisgICAgcE9NWENvbXBvbmVudCA9IChPTVhfQ09NUE9ORU5UVFlQRSAqKWhDb21wb25lbnQ7CisgICAgcmV0ID0gU0VDX09NWF9DaGVja19TaXplVmVyc2lvbihwT01YQ29tcG9uZW50LCBzaXplb2YoT01YX0NPTVBPTkVOVFRZUEUpKTsKKyAgICBpZiAocmV0ICE9IE9NWF9FcnJvck5vbmUpIHsKKyAgICAgICAgZ290byBFWElUOworICAgIH0KKworICAgIGlmIChwT01YQ29tcG9uZW50LT5wQ29tcG9uZW50UHJpdmF0ZSA9PSBOVUxMKSB7CisgICAgICAgIHJldCA9IE9NWF9FcnJvckJhZFBhcmFtZXRlcjsKKyAgICAgICAgZ290byBFWElUOworICAgIH0KKyAgICBwU0VDQ29tcG9uZW50ID0gKFNFQ19PTVhfQkFTRUNPTVBPTkVOVCAqKXBPTVhDb21wb25lbnQtPnBDb21wb25lbnRQcml2YXRlOworICAgIHBWaWRlb0RlYyA9IChTRUNfT01YX1ZJREVPREVDX0NPTVBPTkVOVCAqKXBTRUNDb21wb25lbnQtPmhDb21wb25lbnRIYW5kbGU7CisgICAgcFNFQ1BvcnQgPSAmcFNFQ0NvbXBvbmVudC0+cFNFQ1BvcnRbblBvcnRJbmRleF07CisKKyAgICBpZiAoQ0hFQ0tfUE9SVF9UVU5ORUxFRChwU0VDUG9ydCkgJiYgQ0hFQ0tfUE9SVF9CVUZGRVJfU1VQUExJRVIocFNFQ1BvcnQpKSB7CisgICAgICAgIHJldCA9IE9NWF9FcnJvckJhZFBvcnRJbmRleDsKKyAgICAgICAgZ290byBFWElUOworICAgIH0KKworICAgIGlmICgocFNFQ1BvcnQtPnBvcnRTdGF0ZSAhPSBPTVhfU3RhdGVMb2FkZWQpICYmIChwU0VDUG9ydC0+cG9ydFN0YXRlICE9IE9NWF9TdGF0ZUludmFsaWQpKSB7CisgICAgICAgICgqKHBTRUNDb21wb25lbnQtPnBDYWxsYmFja3MtPkV2ZW50SGFuZGxlcikpIChwT01YQ29tcG9uZW50LAorICAgICAgICAgICAgICAgICAgICAgICAgcFNFQ0NvbXBvbmVudC0+Y2FsbGJhY2tEYXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgKE9NWF9VMzIpT01YX0V2ZW50RXJyb3IsCisgICAgICAgICAgICAgICAgICAgICAgICAoT01YX1UzMilPTVhfRXJyb3JQb3J0VW5wb3B1bGF0ZWQsCisgICAgICAgICAgICAgICAgICAgICAgICBuUG9ydEluZGV4LCBOVUxMKTsKKyAgICB9CisKKyAgICBmb3IgKGkgPSAwOyBpIDwgcFNFQ1BvcnQtPnBvcnREZWZpbml0aW9uLm5CdWZmZXJDb3VudEFjdHVhbDsgaSsrKSB7CisgICAgICAgIGlmICgoKHBTRUNQb3J0LT5idWZmZXJTdGF0ZUFsbG9jYXRlW2ldIHwgQlVGRkVSX1NUQVRFX0ZSRUUpICE9IDApICYmIChwU0VDUG9ydC0+YnVmZmVySGVhZGVyW2ldICE9IE5VTEwpKSB7CisgICAgICAgICAgICBpZiAocFNFQ1BvcnQtPmJ1ZmZlckhlYWRlcltpXS0+cEJ1ZmZlciA9PSBwQnVmZmVySGRyLT5wQnVmZmVyKSB7CisgICAgICAgICAgICAgICAgaWYgKHBTRUNQb3J0LT5idWZmZXJTdGF0ZUFsbG9jYXRlW2ldICYgQlVGRkVSX1NUQVRFX0FMTE9DQVRFRCkgeworICAgICAgICAgICAgICAgICAgICBpZiAoKHBWaWRlb0RlYy0+YkRSTVBsYXllck1vZGUgPT0gT01YX1RSVUUpICYmIChuUG9ydEluZGV4ID09IElOUFVUX1BPUlRfSU5ERVgpKQorICAgICAgICAgICAgICAgICAgICAgICAgcFNFQ0NvbXBvbmVudC0+c2VjX2ZyZWVTZWN1cmVJbnB1dEJ1ZmZlcihoQ29tcG9uZW50LCBwU0VDUG9ydC0+YnVmZmVySGVhZGVyW2ldLT5wQnVmZmVyKTsKKyAgICAgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICAgICAgU0VDX09TQUxfRnJlZShwU0VDUG9ydC0+YnVmZmVySGVhZGVyW2ldLT5wQnVmZmVyKTsKKyAgICAgICAgICAgICAgICAgICAgcFNFQ1BvcnQtPmJ1ZmZlckhlYWRlcltpXS0+cEJ1ZmZlciA9IE5VTEw7CisgICAgICAgICAgICAgICAgICAgIHBCdWZmZXJIZHItPnBCdWZmZXIgPSBOVUxMOworICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAocFNFQ1BvcnQtPmJ1ZmZlclN0YXRlQWxsb2NhdGVbaV0gJiBCVUZGRVJfU1RBVEVfQVNTSUdORUQpIHsKKyAgICAgICAgICAgICAgICAgICAgOyAvKiBOb25lKi8KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgcFNFQ1BvcnQtPmFzc2lnbmVkQnVmZmVyTnVtLS07CisgICAgICAgICAgICAgICAgaWYgKHBTRUNQb3J0LT5idWZmZXJTdGF0ZUFsbG9jYXRlW2ldICYgSEVBREVSX1NUQVRFX0FMTE9DQVRFRCkgeworICAgICAgICAgICAgICAgICAgICBTRUNfT1NBTF9GcmVlKHBTRUNQb3J0LT5idWZmZXJIZWFkZXJbaV0pOworICAgICAgICAgICAgICAgICAgICBwU0VDUG9ydC0+YnVmZmVySGVhZGVyW2ldID0gTlVMTDsKKyAgICAgICAgICAgICAgICAgICAgcEJ1ZmZlckhkciA9IE5VTEw7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIHBTRUNQb3J0LT5idWZmZXJTdGF0ZUFsbG9jYXRlW2ldID0gQlVGRkVSX1NUQVRFX0ZSRUU7CisgICAgICAgICAgICAgICAgcmV0ID0gT01YX0Vycm9yTm9uZTsKKyAgICAgICAgICAgICAgICBnb3RvIEVYSVQ7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKK0VYSVQ6CisgICAgaWYgKHJldCA9PSBPTVhfRXJyb3JOb25lKSB7CisgICAgICAgIGlmIChwU0VDUG9ydC0+YXNzaWduZWRCdWZmZXJOdW0gPT0gMCkgeworICAgICAgICAgICAgU0VDX09TQUxfTG9nKFNFQ19MT0dfVFJBQ0UsICJwU0VDUG9ydC0+dW5sb2FkZWRSZXNvdXJjZSBzaWduYWwgc2V0Iik7CisgICAgICAgICAgICAvKiBTRUNfT1NBTF9NdXRleExvY2socFNFQ0NvbXBvbmVudC0+Y29tcE11dGV4KTsgKi8KKyAgICAgICAgICAgIFNFQ19PU0FMX1NlbWFwaG9yZVBvc3QocFNFQ1BvcnQtPnVubG9hZGVkUmVzb3VyY2UpOworICAgICAgICAgICAgLyogU0VDX09TQUxfTXV0ZXhVbmxvY2socFNFQ0NvbXBvbmVudC0+Y29tcE11dGV4KTsgKi8KKyAgICAgICAgICAgIHBTRUNQb3J0LT5wb3J0RGVmaW5pdGlvbi5iUG9wdWxhdGVkID0gT01YX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgRnVuY3Rpb25PdXQoKTsKKworICAgIHJldHVybiByZXQ7Cit9CisKK09NWF9FUlJPUlRZUEUgU0VDX09NWF9BbGxvY2F0ZVR1bm5lbEJ1ZmZlcihTRUNfT01YX0JBU0VQT1JUICpwT01YQmFzZVBvcnQsIE9NWF9VMzIgblBvcnRJbmRleCkKK3sKKyAgICBPTVhfRVJST1JUWVBFICAgICAgICAgICAgICAgICByZXQgPSBPTVhfRXJyb3JOb25lOworICAgIFNFQ19PTVhfQkFTRVBPUlQgICAgICAgICAgICAgKnBTRUNQb3J0ID0gTlVMTDsKKyAgICBPTVhfQlVGRkVSSEVBREVSVFlQRSAgICAgICAgICp0ZW1wX2J1ZmZlckhlYWRlciA9IE5VTEw7CisgICAgT01YX1U4ICAgICAgICAgICAgICAgICAgICAgICAqdGVtcF9idWZmZXIgPSBOVUxMOworICAgIE9NWF9VMzIgICAgICAgICAgICAgICAgICAgICAgIGJ1ZmZlclNpemUgPSAwOworICAgIE9NWF9QQVJBTV9QT1JUREVGSU5JVElPTlRZUEUgIHBvcnREZWZpbml0aW9uOworCisgICAgcmV0ID0gT01YX0Vycm9yVHVubmVsaW5nVW5zdXBwb3J0ZWQ7CitFWElUOgorICAgIHJldHVybiByZXQ7Cit9CisKK09NWF9FUlJPUlRZUEUgU0VDX09NWF9GcmVlVHVubmVsQnVmZmVyKFNFQ19PTVhfQkFTRVBPUlQgKnBPTVhCYXNlUG9ydCwgT01YX1UzMiBuUG9ydEluZGV4KQoreworICAgIE9NWF9FUlJPUlRZUEUgcmV0ID0gT01YX0Vycm9yTm9uZTsKKyAgICBTRUNfT01YX0JBU0VQT1JUKiBwU0VDUG9ydCA9IE5VTEw7CisgICAgT01YX0JVRkZFUkhFQURFUlRZUEUqIHRlbXBfYnVmZmVySGVhZGVyID0gTlVMTDsKKyAgICBPTVhfVTggKnRlbXBfYnVmZmVyID0gTlVMTDsKKyAgICBPTVhfVTMyIGJ1ZmZlclNpemUgPSAwOworCisgICAgcmV0ID0gT01YX0Vycm9yVHVubmVsaW5nVW5zdXBwb3J0ZWQ7CitFWElUOgorICAgIHJldHVybiByZXQ7Cit9CisKK09NWF9FUlJPUlRZUEUgU0VDX09NWF9Db21wb25lbnRUdW5uZWxSZXF1ZXN0KAorICAgIE9NWF9JTiBPTVhfSEFORExFVFlQRSBoQ29tcCwKKyAgICBPTVhfSU4gT01YX1UzMiAgICAgICAgblBvcnQsCisgICAgT01YX0lOIE9NWF9IQU5ETEVUWVBFIGhUdW5uZWxlZENvbXAsCisgICAgT01YX0lOIE9NWF9VMzIgICAgICAgIG5UdW5uZWxlZFBvcnQsCisgICAgT01YX0lOT1VUIE9NWF9UVU5ORUxTRVRVUFRZUEUgKnBUdW5uZWxTZXR1cCkKK3sKKyAgICBPTVhfRVJST1JUWVBFIHJldCA9IE9NWF9FcnJvck5vbmU7CisKKyAgICByZXQgPSBPTVhfRXJyb3JUdW5uZWxpbmdVbnN1cHBvcnRlZDsKK0VYSVQ6CisgICAgcmV0dXJuIHJldDsKK30KKworT01YX0JPT0wgU0VDX0NoZWNrX0J1ZmZlclByb2Nlc3NfU3RhdGUoU0VDX09NWF9CQVNFQ09NUE9ORU5UICpwU0VDQ29tcG9uZW50KQoreworICAgIGlmICgocFNFQ0NvbXBvbmVudC0+Y3VycmVudFN0YXRlID09IE9NWF9TdGF0ZUV4ZWN1dGluZykgJiYKKyAgICAgICAgKHBTRUNDb21wb25lbnQtPnBTRUNQb3J0W0lOUFVUX1BPUlRfSU5ERVhdLnBvcnRTdGF0ZSA9PSBPTVhfU3RhdGVJZGxlKSAmJgorICAgICAgICAocFNFQ0NvbXBvbmVudC0+cFNFQ1BvcnRbT1VUUFVUX1BPUlRfSU5ERVhdLnBvcnRTdGF0ZSA9PSBPTVhfU3RhdGVJZGxlKSAmJgorICAgICAgICAocFNFQ0NvbXBvbmVudC0+dHJhbnNpZW50U3RhdGUgIT0gU0VDX09NWF9UcmFuc1N0YXRlRXhlY3V0aW5nVG9JZGxlKSAmJgorICAgICAgICAocFNFQ0NvbXBvbmVudC0+dHJhbnNpZW50U3RhdGUgIT0gU0VDX09NWF9UcmFuc1N0YXRlSWRsZVRvRXhlY3V0aW5nKSkgeworICAgICAgICByZXR1cm4gT01YX1RSVUU7CisgICAgfSBlbHNlIHsKKyAgICAgICAgcmV0dXJuIE9NWF9GQUxTRTsKKyAgICB9Cit9CisKK3N0YXRpYyBPTVhfRVJST1JUWVBFIFNFQ19JbnB1dEJ1ZmZlclJldHVybihPTVhfQ09NUE9ORU5UVFlQRSAqcE9NWENvbXBvbmVudCkKK3sKKyAgICBPTVhfRVJST1JUWVBFICAgICAgICAgIHJldCA9IE9NWF9FcnJvck5vbmU7CisgICAgU0VDX09NWF9CQVNFQ09NUE9ORU5UICpwU0VDQ29tcG9uZW50ID0gKFNFQ19PTVhfQkFTRUNPTVBPTkVOVCAqKXBPTVhDb21wb25lbnQtPnBDb21wb25lbnRQcml2YXRlOworICAgIFNFQ19PTVhfQkFTRVBPUlQgICAgICAqc2VjT01YSW5wdXRQb3J0ID0gJnBTRUNDb21wb25lbnQtPnBTRUNQb3J0W0lOUFVUX1BPUlRfSU5ERVhdOworICAgIFNFQ19PTVhfQkFTRVBPUlQgICAgICAqc2VjT01YT3V0cHV0UG9ydCA9ICZwU0VDQ29tcG9uZW50LT5wU0VDUG9ydFtPVVRQVVRfUE9SVF9JTkRFWF07CisgICAgU0VDX09NWF9EQVRBQlVGRkVSICAgICpkYXRhQnVmZmVyID0gJnBTRUNDb21wb25lbnQtPnNlY0RhdGFCdWZmZXJbSU5QVVRfUE9SVF9JTkRFWF07CisgICAgT01YX0JVRkZFUkhFQURFUlRZUEUgICpidWZmZXJIZWFkZXIgPSBkYXRhQnVmZmVyLT5idWZmZXJIZWFkZXI7CisKKyAgICBGdW5jdGlvbkluKCk7CisKKyAgICBpZiAoYnVmZmVySGVhZGVyICE9IE5VTEwpIHsKKyAgICAgICAgaWYgKHNlY09NWElucHV0UG9ydC0+bWFya1R5cGUuaE1hcmtUYXJnZXRDb21wb25lbnQgIT0gTlVMTCApIHsKKyAgICAgICAgICAgIGJ1ZmZlckhlYWRlci0+aE1hcmtUYXJnZXRDb21wb25lbnQgICAgICA9IHNlY09NWElucHV0UG9ydC0+bWFya1R5cGUuaE1hcmtUYXJnZXRDb21wb25lbnQ7CisgICAgICAgICAgICBidWZmZXJIZWFkZXItPnBNYXJrRGF0YSAgICAgICAgICAgICAgICAgPSBzZWNPTVhJbnB1dFBvcnQtPm1hcmtUeXBlLnBNYXJrRGF0YTsKKyAgICAgICAgICAgIHNlY09NWElucHV0UG9ydC0+bWFya1R5cGUuaE1hcmtUYXJnZXRDb21wb25lbnQgPSBOVUxMOworICAgICAgICAgICAgc2VjT01YSW5wdXRQb3J0LT5tYXJrVHlwZS5wTWFya0RhdGEgPSBOVUxMOworICAgICAgICB9CisKKyAgICAgICAgaWYgKGJ1ZmZlckhlYWRlci0+aE1hcmtUYXJnZXRDb21wb25lbnQgIT0gTlVMTCkgeworICAgICAgICAgICAgaWYgKGJ1ZmZlckhlYWRlci0+aE1hcmtUYXJnZXRDb21wb25lbnQgPT0gcE9NWENvbXBvbmVudCkgeworICAgICAgICAgICAgICAgIHBTRUNDb21wb25lbnQtPnBDYWxsYmFja3MtPkV2ZW50SGFuZGxlcihwT01YQ29tcG9uZW50LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwU0VDQ29tcG9uZW50LT5jYWxsYmFja0RhdGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9NWF9FdmVudE1hcmssCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAsIDAsIGJ1ZmZlckhlYWRlci0+cE1hcmtEYXRhKTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgcFNFQ0NvbXBvbmVudC0+cHJvcGFnYXRlTWFya1R5cGUuaE1hcmtUYXJnZXRDb21wb25lbnQgPSBidWZmZXJIZWFkZXItPmhNYXJrVGFyZ2V0Q29tcG9uZW50OworICAgICAgICAgICAgICAgIHBTRUNDb21wb25lbnQtPnByb3BhZ2F0ZU1hcmtUeXBlLnBNYXJrRGF0YSA9IGJ1ZmZlckhlYWRlci0+cE1hcmtEYXRhOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgaWYgKENIRUNLX1BPUlRfVFVOTkVMRUQoc2VjT01YSW5wdXRQb3J0KSkgeworICAgICAgICAgICAgT01YX0ZpbGxUaGlzQnVmZmVyKHNlY09NWElucHV0UG9ydC0+dHVubmVsZWRDb21wb25lbnQsIGJ1ZmZlckhlYWRlcik7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBidWZmZXJIZWFkZXItPm5GaWxsZWRMZW4gPSAwOworICAgICAgICAgICAgcFNFQ0NvbXBvbmVudC0+cENhbGxiYWNrcy0+RW1wdHlCdWZmZXJEb25lKHBPTVhDb21wb25lbnQsIHBTRUNDb21wb25lbnQtPmNhbGxiYWNrRGF0YSwgYnVmZmVySGVhZGVyKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgocFNFQ0NvbXBvbmVudC0+Y3VycmVudFN0YXRlID09IE9NWF9TdGF0ZVBhdXNlKSAmJgorICAgICAgICAoKCFDSEVDS19QT1JUX0JFSU5HX0ZMVVNIRUQoc2VjT01YSW5wdXRQb3J0KSAmJiAhQ0hFQ0tfUE9SVF9CRUlOR19GTFVTSEVEKHNlY09NWE91dHB1dFBvcnQpKSkpIHsKKyAgICAgICAgU0VDX09TQUxfU2lnbmFsV2FpdChwU0VDQ29tcG9uZW50LT5wYXVzZUV2ZW50LCBERUZfTUFYX1dBSVRfVElNRSk7CisgICAgICAgIFNFQ19PU0FMX1NpZ25hbFJlc2V0KHBTRUNDb21wb25lbnQtPnBhdXNlRXZlbnQpOworICAgIH0KKworICAgIGRhdGFCdWZmZXItPmRhdGFWYWxpZCAgICAgPSBPTVhfRkFMU0U7CisgICAgZGF0YUJ1ZmZlci0+ZGF0YUxlbiAgICAgICA9IDA7CisgICAgZGF0YUJ1ZmZlci0+cmVtYWluRGF0YUxlbiA9IDA7CisgICAgZGF0YUJ1ZmZlci0+dXNlZERhdGFMZW4gICA9IDA7CisgICAgZGF0YUJ1ZmZlci0+YnVmZmVySGVhZGVyICA9IE5VTEw7CisgICAgZGF0YUJ1ZmZlci0+bkZsYWdzICAgICAgICA9IDA7CisgICAgZGF0YUJ1ZmZlci0+dGltZVN0YW1wICAgICA9IDA7CisKK0VYSVQ6CisgICAgRnVuY3Rpb25PdXQoKTsKKworICAgIHJldHVybiByZXQ7Cit9CisKK09NWF9FUlJPUlRZUEUgU0VDX0lucHV0QnVmZmVyR2V0UXVldWUoU0VDX09NWF9CQVNFQ09NUE9ORU5UICpwU0VDQ29tcG9uZW50KQoreworICAgIE9NWF9FUlJPUlRZUEUgICAgICAgcmV0ID0gT01YX0Vycm9yTm9uZTsKKyAgICBTRUNfT01YX0JBU0VQT1JUICAgKnBTRUNQb3J0ID0gTlVMTDsKKyAgICBTRUNfT01YX0RBVEFCVUZGRVIgKmRhdGFCdWZmZXIgPSBOVUxMOworICAgIFNFQ19PTVhfTUVTU0FHRSogICAgbWVzc2FnZSA9IE5VTEw7CisgICAgU0VDX09NWF9EQVRBQlVGRkVSICppbnB1dFVzZUJ1ZmZlciA9ICZwU0VDQ29tcG9uZW50LT5zZWNEYXRhQnVmZmVyW0lOUFVUX1BPUlRfSU5ERVhdOworCisgICAgRnVuY3Rpb25JbigpOworCisgICAgcFNFQ1BvcnQ9ICZwU0VDQ29tcG9uZW50LT5wU0VDUG9ydFtJTlBVVF9QT1JUX0lOREVYXTsKKyAgICBkYXRhQnVmZmVyID0gJnBTRUNDb21wb25lbnQtPnNlY0RhdGFCdWZmZXJbSU5QVVRfUE9SVF9JTkRFWF07CisKKyAgICBpZiAocFNFQ0NvbXBvbmVudC0+Y3VycmVudFN0YXRlICE9IE9NWF9TdGF0ZUV4ZWN1dGluZykgeworICAgICAgICByZXQgPSBPTVhfRXJyb3JVbmRlZmluZWQ7CisgICAgICAgIGdvdG8gRVhJVDsKKyAgICB9IGVsc2UgeworICAgICAgICBTRUNfT1NBTF9TZW1hcGhvcmVXYWl0KHBTRUNQb3J0LT5idWZmZXJTZW1JRCk7CisgICAgICAgIFNFQ19PU0FMX011dGV4TG9jayhpbnB1dFVzZUJ1ZmZlci0+YnVmZmVyTXV0ZXgpOworICAgICAgICBpZiAoZGF0YUJ1ZmZlci0+ZGF0YVZhbGlkICE9IE9NWF9UUlVFKSB7CisgICAgICAgICAgICBtZXNzYWdlID0gKFNFQ19PTVhfTUVTU0FHRSAqKVNFQ19PU0FMX0RlcXVldWUoJnBTRUNQb3J0LT5idWZmZXJRKTsKKyAgICAgICAgICAgIGlmIChtZXNzYWdlID09IE5VTEwpIHsKKyAgICAgICAgICAgICAgICByZXQgPSBPTVhfRXJyb3JVbmRlZmluZWQ7CisgICAgICAgICAgICAgICAgU0VDX09TQUxfTXV0ZXhVbmxvY2soaW5wdXRVc2VCdWZmZXItPmJ1ZmZlck11dGV4KTsKKyAgICAgICAgICAgICAgICBnb3RvIEVYSVQ7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGRhdGFCdWZmZXItPmJ1ZmZlckhlYWRlciA9IChPTVhfQlVGRkVSSEVBREVSVFlQRSAqKShtZXNzYWdlLT5wQ21kRGF0YSk7CisgICAgICAgICAgICBkYXRhQnVmZmVyLT5hbGxvY1NpemUgPSBkYXRhQnVmZmVyLT5idWZmZXJIZWFkZXItPm5BbGxvY0xlbjsKKyAgICAgICAgICAgIGRhdGFCdWZmZXItPmRhdGFMZW4gPSBkYXRhQnVmZmVyLT5idWZmZXJIZWFkZXItPm5GaWxsZWRMZW47CisgICAgICAgICAgICBkYXRhQnVmZmVyLT5yZW1haW5EYXRhTGVuID0gZGF0YUJ1ZmZlci0+ZGF0YUxlbjsKKyAgICAgICAgICAgIGRhdGFCdWZmZXItPnVzZWREYXRhTGVuID0gMDsKKyAgICAgICAgICAgIGRhdGFCdWZmZXItPmRhdGFWYWxpZCA9IE9NWF9UUlVFOworICAgICAgICAgICAgZGF0YUJ1ZmZlci0+bkZsYWdzID0gZGF0YUJ1ZmZlci0+YnVmZmVySGVhZGVyLT5uRmxhZ3M7CisgICAgICAgICAgICBkYXRhQnVmZmVyLT50aW1lU3RhbXAgPSBkYXRhQnVmZmVyLT5idWZmZXJIZWFkZXItPm5UaW1lU3RhbXA7CisKKyAgICAgICAgICAgIFNFQ19PU0FMX0ZyZWUobWVzc2FnZSk7CisKKyAgICAgICAgICAgIGlmIChkYXRhQnVmZmVyLT5hbGxvY1NpemUgPD0gZGF0YUJ1ZmZlci0+ZGF0YUxlbikKKyAgICAgICAgICAgICAgICBTRUNfT1NBTF9Mb2coU0VDX0xPR19XQVJOSU5HLCAiSW5wdXQgQnVmZmVyIEZ1bGwsIENoZWNrIGlucHV0IGJ1ZmZlciBzaXplISBhbGxvY1NpemU6JWQsIGRhdGFMZW46JWQiLCBkYXRhQnVmZmVyLT5hbGxvY1NpemUsIGRhdGFCdWZmZXItPmRhdGFMZW4pOworICAgICAgICB9CisgICAgICAgIFNFQ19PU0FMX011dGV4VW5sb2NrKGlucHV0VXNlQnVmZmVyLT5idWZmZXJNdXRleCk7CisgICAgICAgIHJldCA9IE9NWF9FcnJvck5vbmU7CisgICAgfQorRVhJVDoKKyAgICBGdW5jdGlvbk91dCgpOworCisgICAgcmV0dXJuIHJldDsKK30KKworc3RhdGljIE9NWF9FUlJPUlRZUEUgU0VDX091dHB1dEJ1ZmZlclJldHVybihPTVhfQ09NUE9ORU5UVFlQRSAqcE9NWENvbXBvbmVudCkKK3sKKyAgICBPTVhfRVJST1JUWVBFICAgICAgICAgIHJldCA9IE9NWF9FcnJvck5vbmU7CisgICAgU0VDX09NWF9CQVNFQ09NUE9ORU5UICpwU0VDQ29tcG9uZW50ID0gKFNFQ19PTVhfQkFTRUNPTVBPTkVOVCAqKXBPTVhDb21wb25lbnQtPnBDb21wb25lbnRQcml2YXRlOworICAgIFNFQ19PTVhfQkFTRVBPUlQgICAgICAqc2VjT01YSW5wdXRQb3J0ID0gJnBTRUNDb21wb25lbnQtPnBTRUNQb3J0W0lOUFVUX1BPUlRfSU5ERVhdOworICAgIFNFQ19PTVhfQkFTRVBPUlQgICAgICAqc2VjT01YT3V0cHV0UG9ydCA9ICZwU0VDQ29tcG9uZW50LT5wU0VDUG9ydFtPVVRQVVRfUE9SVF9JTkRFWF07CisgICAgU0VDX09NWF9EQVRBQlVGRkVSICAgICpkYXRhQnVmZmVyID0gJnBTRUNDb21wb25lbnQtPnNlY0RhdGFCdWZmZXJbT1VUUFVUX1BPUlRfSU5ERVhdOworICAgIE9NWF9CVUZGRVJIRUFERVJUWVBFICAqYnVmZmVySGVhZGVyID0gZGF0YUJ1ZmZlci0+YnVmZmVySGVhZGVyOworCisgICAgRnVuY3Rpb25JbigpOworCisgICAgaWYgKGJ1ZmZlckhlYWRlciAhPSBOVUxMKSB7CisgICAgICAgIGJ1ZmZlckhlYWRlci0+bkZpbGxlZExlbiA9IGRhdGFCdWZmZXItPnJlbWFpbkRhdGFMZW47CisgICAgICAgIGJ1ZmZlckhlYWRlci0+bk9mZnNldCAgICA9IDA7CisgICAgICAgIGJ1ZmZlckhlYWRlci0+bkZsYWdzICAgICA9IGRhdGFCdWZmZXItPm5GbGFnczsKKyAgICAgICAgYnVmZmVySGVhZGVyLT5uVGltZVN0YW1wID0gZGF0YUJ1ZmZlci0+dGltZVN0YW1wOworCisgICAgICAgIGlmIChwU0VDQ29tcG9uZW50LT5wcm9wYWdhdGVNYXJrVHlwZS5oTWFya1RhcmdldENvbXBvbmVudCAhPSBOVUxMKSB7CisgICAgICAgICAgICBidWZmZXJIZWFkZXItPmhNYXJrVGFyZ2V0Q29tcG9uZW50ID0gcFNFQ0NvbXBvbmVudC0+cHJvcGFnYXRlTWFya1R5cGUuaE1hcmtUYXJnZXRDb21wb25lbnQ7CisgICAgICAgICAgICBidWZmZXJIZWFkZXItPnBNYXJrRGF0YSA9IHBTRUNDb21wb25lbnQtPnByb3BhZ2F0ZU1hcmtUeXBlLnBNYXJrRGF0YTsKKyAgICAgICAgICAgIHBTRUNDb21wb25lbnQtPnByb3BhZ2F0ZU1hcmtUeXBlLmhNYXJrVGFyZ2V0Q29tcG9uZW50ID0gTlVMTDsKKyAgICAgICAgICAgIHBTRUNDb21wb25lbnQtPnByb3BhZ2F0ZU1hcmtUeXBlLnBNYXJrRGF0YSA9IE5VTEw7CisgICAgICAgIH0KKworICAgICAgICBpZiAoYnVmZmVySGVhZGVyLT5uRmxhZ3MgJiBPTVhfQlVGRkVSRkxBR19FT1MpIHsKKyAgICAgICAgICAgIHBTRUNDb21wb25lbnQtPnBDYWxsYmFja3MtPkV2ZW50SGFuZGxlcihwT01YQ29tcG9uZW50LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBTRUNDb21wb25lbnQtPmNhbGxiYWNrRGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBPTVhfRXZlbnRCdWZmZXJGbGFnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9VVFBVVF9QT1JUX0lOREVYLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJ1ZmZlckhlYWRlci0+bkZsYWdzLCBOVUxMKTsKKyAgICAgICAgfQorCisgICAgICAgIGlmIChDSEVDS19QT1JUX1RVTk5FTEVEKHNlY09NWE91dHB1dFBvcnQpKSB7CisgICAgICAgICAgICBPTVhfRW1wdHlUaGlzQnVmZmVyKHNlY09NWE91dHB1dFBvcnQtPnR1bm5lbGVkQ29tcG9uZW50LCBidWZmZXJIZWFkZXIpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgcFNFQ0NvbXBvbmVudC0+cENhbGxiYWNrcy0+RmlsbEJ1ZmZlckRvbmUocE9NWENvbXBvbmVudCwgcFNFQ0NvbXBvbmVudC0+Y2FsbGJhY2tEYXRhLCBidWZmZXJIZWFkZXIpOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChwU0VDQ29tcG9uZW50LT5jdXJyZW50U3RhdGUgPT0gT01YX1N0YXRlUGF1c2UpICYmCisgICAgICAgICgoIUNIRUNLX1BPUlRfQkVJTkdfRkxVU0hFRChzZWNPTVhJbnB1dFBvcnQpICYmICFDSEVDS19QT1JUX0JFSU5HX0ZMVVNIRUQoc2VjT01YT3V0cHV0UG9ydCkpKSkgeworICAgICAgICBTRUNfT1NBTF9TaWduYWxXYWl0KHBTRUNDb21wb25lbnQtPnBhdXNlRXZlbnQsIERFRl9NQVhfV0FJVF9USU1FKTsKKyAgICAgICAgU0VDX09TQUxfU2lnbmFsUmVzZXQocFNFQ0NvbXBvbmVudC0+cGF1c2VFdmVudCk7CisgICAgfQorCisgICAgLyogcmVzZXQgZGF0YUJ1ZmZlciAqLworICAgIGRhdGFCdWZmZXItPmRhdGFWYWxpZCAgICAgPSBPTVhfRkFMU0U7CisgICAgZGF0YUJ1ZmZlci0+ZGF0YUxlbiAgICAgICA9IDA7CisgICAgZGF0YUJ1ZmZlci0+cmVtYWluRGF0YUxlbiA9IDA7CisgICAgZGF0YUJ1ZmZlci0+dXNlZERhdGFMZW4gICA9IDA7CisgICAgZGF0YUJ1ZmZlci0+YnVmZmVySGVhZGVyICA9IE5VTEw7CisgICAgZGF0YUJ1ZmZlci0+bkZsYWdzICAgICAgICA9IDA7CisgICAgZGF0YUJ1ZmZlci0+dGltZVN0YW1wICAgICA9IDA7CisKK0VYSVQ6CisgICAgRnVuY3Rpb25PdXQoKTsKKworICAgIHJldHVybiByZXQ7Cit9CisKK09NWF9FUlJPUlRZUEUgU0VDX091dHB1dEJ1ZmZlckdldFF1ZXVlKFNFQ19PTVhfQkFTRUNPTVBPTkVOVCAqcFNFQ0NvbXBvbmVudCkKK3sKKyAgICBPTVhfRVJST1JUWVBFICAgICAgIHJldCA9IE9NWF9FcnJvck5vbmU7CisgICAgU0VDX09NWF9CQVNFUE9SVCAgICpwU0VDUG9ydCA9IE5VTEw7CisgICAgU0VDX09NWF9EQVRBQlVGRkVSICpkYXRhQnVmZmVyID0gTlVMTDsKKyAgICBTRUNfT01YX01FU1NBR0UgICAgKm1lc3NhZ2UgPSBOVUxMOworICAgIFNFQ19PTVhfREFUQUJVRkZFUiAqb3V0cHV0VXNlQnVmZmVyID0gJnBTRUNDb21wb25lbnQtPnNlY0RhdGFCdWZmZXJbT1VUUFVUX1BPUlRfSU5ERVhdOworCisgICAgRnVuY3Rpb25JbigpOworCisgICAgcFNFQ1BvcnQ9ICZwU0VDQ29tcG9uZW50LT5wU0VDUG9ydFtPVVRQVVRfUE9SVF9JTkRFWF07CisgICAgZGF0YUJ1ZmZlciA9ICZwU0VDQ29tcG9uZW50LT5zZWNEYXRhQnVmZmVyW09VVFBVVF9QT1JUX0lOREVYXTsKKworICAgIGlmIChwU0VDQ29tcG9uZW50LT5jdXJyZW50U3RhdGUgIT0gT01YX1N0YXRlRXhlY3V0aW5nKSB7CisgICAgICAgIHJldCA9IE9NWF9FcnJvclVuZGVmaW5lZDsKKyAgICAgICAgZ290byBFWElUOworICAgIH0gZWxzZSB7CisgICAgICAgIFNFQ19PU0FMX1NlbWFwaG9yZVdhaXQocFNFQ1BvcnQtPmJ1ZmZlclNlbUlEKTsKKyAgICAgICAgU0VDX09TQUxfTXV0ZXhMb2NrKG91dHB1dFVzZUJ1ZmZlci0+YnVmZmVyTXV0ZXgpOworICAgICAgICBpZiAoZGF0YUJ1ZmZlci0+ZGF0YVZhbGlkICE9IE9NWF9UUlVFKSB7CisgICAgICAgICAgICBtZXNzYWdlID0gKFNFQ19PTVhfTUVTU0FHRSAqKVNFQ19PU0FMX0RlcXVldWUoJnBTRUNQb3J0LT5idWZmZXJRKTsKKyAgICAgICAgICAgIGlmIChtZXNzYWdlID09IE5VTEwpIHsKKyAgICAgICAgICAgICAgICByZXQgPSBPTVhfRXJyb3JVbmRlZmluZWQ7CisgICAgICAgICAgICAgICAgU0VDX09TQUxfTXV0ZXhVbmxvY2sob3V0cHV0VXNlQnVmZmVyLT5idWZmZXJNdXRleCk7CisgICAgICAgICAgICAgICAgZ290byBFWElUOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBkYXRhQnVmZmVyLT5idWZmZXJIZWFkZXIgPSAoT01YX0JVRkZFUkhFQURFUlRZUEUgKikobWVzc2FnZS0+cENtZERhdGEpOworICAgICAgICAgICAgZGF0YUJ1ZmZlci0+YWxsb2NTaXplID0gZGF0YUJ1ZmZlci0+YnVmZmVySGVhZGVyLT5uQWxsb2NMZW47CisgICAgICAgICAgICBkYXRhQnVmZmVyLT5kYXRhTGVuID0gMDsgLy9kYXRhQnVmZmVyLT5idWZmZXJIZWFkZXItPm5GaWxsZWRMZW47CisgICAgICAgICAgICBkYXRhQnVmZmVyLT5yZW1haW5EYXRhTGVuID0gZGF0YUJ1ZmZlci0+ZGF0YUxlbjsKKyAgICAgICAgICAgIGRhdGFCdWZmZXItPnVzZWREYXRhTGVuID0gMDsgLy9kYXRhQnVmZmVyLT5idWZmZXJIZWFkZXItPm5PZmZzZXQ7CisgICAgICAgICAgICBkYXRhQnVmZmVyLT5kYXRhVmFsaWQgPU9NWF9UUlVFOworICAgICAgICAgICAgLyogZGF0YUJ1ZmZlci0+bkZsYWdzID0gZGF0YUJ1ZmZlci0+YnVmZmVySGVhZGVyLT5uRmxhZ3M7ICovCisgICAgICAgICAgICAvKiBkYXRhQnVmZmVyLT5uVGltZVN0YW1wID0gZGF0YUJ1ZmZlci0+YnVmZmVySGVhZGVyLT5uVGltZVN0YW1wOyAqLworICAgICAgICAgICAgcFNFQ0NvbXBvbmVudC0+cHJvY2Vzc0RhdGFbT1VUUFVUX1BPUlRfSU5ERVhdLmRhdGFCdWZmZXIgPSBkYXRhQnVmZmVyLT5idWZmZXJIZWFkZXItPnBCdWZmZXI7CisgICAgICAgICAgICBwU0VDQ29tcG9uZW50LT5wcm9jZXNzRGF0YVtPVVRQVVRfUE9SVF9JTkRFWF0uYWxsb2NTaXplID0gZGF0YUJ1ZmZlci0+YnVmZmVySGVhZGVyLT5uQWxsb2NMZW47CisKKyAgICAgICAgICAgIFNFQ19PU0FMX0ZyZWUobWVzc2FnZSk7CisgICAgICAgIH0KKyAgICAgICAgU0VDX09TQUxfTXV0ZXhVbmxvY2sob3V0cHV0VXNlQnVmZmVyLT5idWZmZXJNdXRleCk7CisgICAgICAgIHJldCA9IE9NWF9FcnJvck5vbmU7CisgICAgfQorRVhJVDoKKyAgICBGdW5jdGlvbk91dCgpOworCisgICAgcmV0dXJuIHJldDsKKworfQorCitzdGF0aWMgT01YX0VSUk9SVFlQRSBTRUNfQnVmZmVyUmVzZXQoT01YX0NPTVBPTkVOVFRZUEUgKnBPTVhDb21wb25lbnQsIE9NWF9VMzIgcG9ydEluZGV4KQoreworICAgIE9NWF9FUlJPUlRZUEUgICAgICAgICAgcmV0ID0gT01YX0Vycm9yTm9uZTsKKyAgICBTRUNfT01YX0JBU0VDT01QT05FTlQgKnBTRUNDb21wb25lbnQgPSAoU0VDX09NWF9CQVNFQ09NUE9ORU5UICopcE9NWENvbXBvbmVudC0+cENvbXBvbmVudFByaXZhdGU7CisgICAgLyogU0VDX09NWF9CQVNFUE9SVCAgICAgICpwU0VDUG9ydCA9ICZwU0VDQ29tcG9uZW50LT5wU0VDUG9ydFtwb3J0SW5kZXhdOyAqLworICAgIFNFQ19PTVhfREFUQUJVRkZFUiAgICAqZGF0YUJ1ZmZlciA9ICZwU0VDQ29tcG9uZW50LT5zZWNEYXRhQnVmZmVyW3BvcnRJbmRleF07CisgICAgLyogT01YX0JVRkZFUkhFQURFUlRZUEUgICpidWZmZXJIZWFkZXIgPSBkYXRhQnVmZmVyLT5idWZmZXJIZWFkZXI7ICovCisKKyAgICBkYXRhQnVmZmVyLT5kYXRhVmFsaWQgICAgID0gT01YX0ZBTFNFOworICAgIGRhdGFCdWZmZXItPmRhdGFMZW4gICAgICAgPSAwOworICAgIGRhdGFCdWZmZXItPnJlbWFpbkRhdGFMZW4gPSAwOworICAgIGRhdGFCdWZmZXItPnVzZWREYXRhTGVuICAgPSAwOworICAgIGRhdGFCdWZmZXItPmJ1ZmZlckhlYWRlciAgPSBOVUxMOworICAgIGRhdGFCdWZmZXItPm5GbGFncyAgICAgICAgPSAwOworICAgIGRhdGFCdWZmZXItPnRpbWVTdGFtcCAgICAgPSAwOworCisgICAgcmV0dXJuIHJldDsKK30KKworc3RhdGljIE9NWF9FUlJPUlRZUEUgU0VDX0RhdGFSZXNldChPTVhfQ09NUE9ORU5UVFlQRSAqcE9NWENvbXBvbmVudCwgT01YX1UzMiBwb3J0SW5kZXgpCit7CisgICAgT01YX0VSUk9SVFlQRSAgICAgICAgICByZXQgPSBPTVhfRXJyb3JOb25lOworICAgIFNFQ19PTVhfQkFTRUNPTVBPTkVOVCAqcFNFQ0NvbXBvbmVudCA9IChTRUNfT01YX0JBU0VDT01QT05FTlQgKilwT01YQ29tcG9uZW50LT5wQ29tcG9uZW50UHJpdmF0ZTsKKyAgICAvKiBTRUNfT01YX0JBU0VQT1JUICAgICAgKnBTRUNQb3J0ID0gJnBTRUNDb21wb25lbnQtPnBTRUNQb3J0W3BvcnRJbmRleF07ICovCisgICAgLyogU0VDX09NWF9EQVRBQlVGRkVSICAgICpkYXRhQnVmZmVyID0gJnBTRUNDb21wb25lbnQtPnNlY0RhdGFCdWZmZXJbcG9ydEluZGV4XTsgKi8KKyAgICAvKiBPTVhfQlVGRkVSSEVBREVSVFlQRSAgKmJ1ZmZlckhlYWRlciA9IGRhdGFCdWZmZXItPmJ1ZmZlckhlYWRlcjsgKi8KKyAgICBTRUNfT01YX0RBVEEgICAgICAgICAgKnByb2Nlc3NEYXRhID0gJnBTRUNDb21wb25lbnQtPnByb2Nlc3NEYXRhW3BvcnRJbmRleF07CisKKyAgICBwcm9jZXNzRGF0YS0+ZGF0YUxlbiAgICAgICA9IDA7CisgICAgcHJvY2Vzc0RhdGEtPnJlbWFpbkRhdGFMZW4gPSAwOworICAgIHByb2Nlc3NEYXRhLT51c2VkRGF0YUxlbiAgID0gMDsKKyAgICBwcm9jZXNzRGF0YS0+bkZsYWdzICAgICAgICA9IDA7CisgICAgcHJvY2Vzc0RhdGEtPnRpbWVTdGFtcCAgICAgPSAwOworCisgICAgcmV0dXJuIHJldDsKK30KKworT01YX0JPT0wgU0VDX1ByZXByb2Nlc3Nvcl9JbnB1dERhdGEoT01YX0NPTVBPTkVOVFRZUEUgKnBPTVhDb21wb25lbnQpCit7CisgICAgT01YX0JPT0wgICAgICAgICAgICAgICByZXQgPSBPTVhfRkFMU0U7CisgICAgU0VDX09NWF9CQVNFQ09NUE9ORU5UICpwU0VDQ29tcG9uZW50ID0gKFNFQ19PTVhfQkFTRUNPTVBPTkVOVCAqKXBPTVhDb21wb25lbnQtPnBDb21wb25lbnRQcml2YXRlOworICAgIFNFQ19PTVhfVklERU9ERUNfQ09NUE9ORU5UICpwVmlkZW9EZWMgPSAoU0VDX09NWF9WSURFT0RFQ19DT01QT05FTlQgKilwU0VDQ29tcG9uZW50LT5oQ29tcG9uZW50SGFuZGxlOworICAgIFNFQ19PTVhfREFUQUJVRkZFUiAgICAqaW5wdXRVc2VCdWZmZXIgPSAmcFNFQ0NvbXBvbmVudC0+c2VjRGF0YUJ1ZmZlcltJTlBVVF9QT1JUX0lOREVYXTsKKyAgICBTRUNfT01YX0RBVEEgICAgICAgICAgKmlucHV0RGF0YSA9ICZwU0VDQ29tcG9uZW50LT5wcm9jZXNzRGF0YVtJTlBVVF9QT1JUX0lOREVYXTsKKyAgICBPTVhfVTMyICAgICAgICAgICAgICAgIGNvcHlTaXplID0gMDsKKyAgICBPTVhfQllURSAgICAgICAgICAgICAgIGNoZWNrSW5wdXRTdHJlYW0gPSBOVUxMOworICAgIE9NWF9VMzIgICAgICAgICAgICAgICAgY2hlY2tJbnB1dFN0cmVhbUxlbiA9IDA7CisgICAgT01YX1UzMiAgICAgICAgICAgICAgICBjaGVja2VkU2l6ZSA9IDA7CisgICAgT01YX0JPT0wgICAgICAgICAgICAgICBmbGFnRU9GID0gT01YX0ZBTFNFOworICAgIE9NWF9CT09MICAgICAgICAgICAgICAgcHJldmlvdXNGcmFtZUVPRiA9IE9NWF9GQUxTRTsKKworICAgIEZ1bmN0aW9uSW4oKTsKKworICAgIGlmIChpbnB1dFVzZUJ1ZmZlci0+ZGF0YVZhbGlkID09IE9NWF9UUlVFKSB7CisgICAgICAgIGNoZWNrSW5wdXRTdHJlYW0gPSBpbnB1dFVzZUJ1ZmZlci0+YnVmZmVySGVhZGVyLT5wQnVmZmVyICsgaW5wdXRVc2VCdWZmZXItPnVzZWREYXRhTGVuOworICAgICAgICBjaGVja0lucHV0U3RyZWFtTGVuID0gaW5wdXRVc2VCdWZmZXItPnJlbWFpbkRhdGFMZW47CisKKyAgICAgICAgaWYgKGlucHV0RGF0YS0+ZGF0YUxlbiA9PSAwKSB7CisgICAgICAgICAgICBwcmV2aW91c0ZyYW1lRU9GID0gT01YX1RSVUU7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBwcmV2aW91c0ZyYW1lRU9GID0gT01YX0ZBTFNFOworICAgICAgICB9CisgICAgICAgIGlmIChwVmlkZW9EZWMtPmJEUk1QbGF5ZXJNb2RlID09IE9NWF9UUlVFKSB7CisgICAgICAgICAgICBmbGFnRU9GID0gT01YX1RSVUU7CisgICAgICAgICAgICBjaGVja2VkU2l6ZSA9IGNoZWNrSW5wdXRTdHJlYW1MZW47CisgICAgICAgIH0gZWxzZSBpZiAoKHBTRUNDb21wb25lbnQtPmJVc2VGbGFnRU9GID09IE9NWF9UUlVFKSAmJgorICAgICAgICAgICAhKGlucHV0VXNlQnVmZmVyLT5uRmxhZ3MgJiBPTVhfQlVGRkVSRkxBR19DT0RFQ0NPTkZJRykpIHsKKyAgICAgICAgICAgIGZsYWdFT0YgPSBPTVhfVFJVRTsKKyAgICAgICAgICAgIGNoZWNrZWRTaXplID0gY2hlY2tJbnB1dFN0cmVhbUxlbjsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHBTRUNDb21wb25lbnQtPmJVc2VGbGFnRU9GID0gT01YX0ZBTFNFOworICAgICAgICAgICAgY2hlY2tlZFNpemUgPSBwU0VDQ29tcG9uZW50LT5zZWNfY2hlY2tJbnB1dEZyYW1lKGNoZWNrSW5wdXRTdHJlYW0sIGNoZWNrSW5wdXRTdHJlYW1MZW4sIGlucHV0VXNlQnVmZmVyLT5uRmxhZ3MsIHByZXZpb3VzRnJhbWVFT0YsICZmbGFnRU9GKTsKKyAgICAgICAgfQorCisgICAgICAgIGlmIChmbGFnRU9GID09IE9NWF9UUlVFKSB7CisgICAgICAgICAgICBjb3B5U2l6ZSA9IGNoZWNrZWRTaXplOworICAgICAgICAgICAgU0VDX09TQUxfTG9nKFNFQ19MT0dfVFJBQ0UsICJzZWNfY2hlY2tJbnB1dEZyYW1lIDogT01YX1RSVUUiKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIGNvcHlTaXplID0gY2hlY2tJbnB1dFN0cmVhbUxlbjsKKyAgICAgICAgICAgIFNFQ19PU0FMX0xvZyhTRUNfTE9HX1RSQUNFLCAic2VjX2NoZWNrSW5wdXRGcmFtZSA6IE9NWF9GQUxTRSIpOworICAgICAgICB9CisKKyAgICAgICAgaWYgKGlucHV0VXNlQnVmZmVyLT5uRmxhZ3MgJiBPTVhfQlVGRkVSRkxBR19FT1MpCisgICAgICAgICAgICBwU0VDQ29tcG9uZW50LT5iU2F2ZUZsYWdFT1MgPSBPTVhfVFJVRTsKKworICAgICAgICBpZiAoKCgoaW5wdXREYXRhLT5hbGxvY1NpemUpIC0gKGlucHV0RGF0YS0+ZGF0YUxlbikpID49IGNvcHlTaXplKSB8fCAocFZpZGVvRGVjLT5iRFJNUGxheWVyTW9kZSA9PSBPTVhfVFJVRSkpIHsKKyAgICAgICAgICAgIGlmIChwVmlkZW9EZWMtPmJEUk1QbGF5ZXJNb2RlID09IE9NWF9UUlVFKSB7CisgICAgICAgICAgICAgICAgaW5wdXREYXRhLT5kYXRhQnVmZmVyID0gY2hlY2tJbnB1dFN0cmVhbTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgaWYgKGNvcHlTaXplID4gMCkKKyAgICAgICAgICAgICAgICAgICAgU0VDX09TQUxfTWVtY3B5KGlucHV0RGF0YS0+ZGF0YUJ1ZmZlciArIGlucHV0RGF0YS0+ZGF0YUxlbiwgY2hlY2tJbnB1dFN0cmVhbSwgY29weVNpemUpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBpbnB1dFVzZUJ1ZmZlci0+ZGF0YUxlbiAtPSBjb3B5U2l6ZTsKKyAgICAgICAgICAgIGlucHV0VXNlQnVmZmVyLT5yZW1haW5EYXRhTGVuIC09IGNvcHlTaXplOworICAgICAgICAgICAgaW5wdXRVc2VCdWZmZXItPnVzZWREYXRhTGVuICs9IGNvcHlTaXplOworCisgICAgICAgICAgICBpbnB1dERhdGEtPmRhdGFMZW4gKz0gY29weVNpemU7CisgICAgICAgICAgICBpbnB1dERhdGEtPnJlbWFpbkRhdGFMZW4gKz0gY29weVNpemU7CisKKyAgICAgICAgICAgIGlmIChwcmV2aW91c0ZyYW1lRU9GID09IE9NWF9UUlVFKSB7CisgICAgICAgICAgICAgICAgaW5wdXREYXRhLT50aW1lU3RhbXAgPSBpbnB1dFVzZUJ1ZmZlci0+dGltZVN0YW1wOworICAgICAgICAgICAgICAgIGlucHV0RGF0YS0+bkZsYWdzID0gaW5wdXRVc2VCdWZmZXItPm5GbGFnczsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaWYgKHBTRUNDb21wb25lbnQtPmJVc2VGbGFnRU9GID09IE9NWF9UUlVFKSB7CisgICAgICAgICAgICAgICAgaWYgKHBTRUNDb21wb25lbnQtPmJTYXZlRmxhZ0VPUyA9PSBPTVhfVFJVRSkgeworICAgICAgICAgICAgICAgICAgICBpbnB1dERhdGEtPm5GbGFncyB8PSBPTVhfQlVGRkVSRkxBR19FT1M7CisgICAgICAgICAgICAgICAgICAgIGZsYWdFT0YgPSBPTVhfVFJVRTsKKyAgICAgICAgICAgICAgICAgICAgcFNFQ0NvbXBvbmVudC0+YlNhdmVGbGFnRU9TID0gT01YX0ZBTFNFOworICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIGlucHV0RGF0YS0+bkZsYWdzID0gKGlucHV0RGF0YS0+bkZsYWdzICYgKH5PTVhfQlVGRkVSRkxBR19FT1MpKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIGlmICgoY2hlY2tlZFNpemUgPT0gY2hlY2tJbnB1dFN0cmVhbUxlbikgJiYgKHBTRUNDb21wb25lbnQtPmJTYXZlRmxhZ0VPUyA9PSBPTVhfVFJVRSkpIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKChpbnB1dFVzZUJ1ZmZlci0+bkZsYWdzICYgT01YX0JVRkZFUkZMQUdfRU9TKSAmJgorICAgICAgICAgICAgICAgICAgICAgICAgKChpbnB1dERhdGEtPm5GbGFncyAmIE9NWF9CVUZGRVJGTEFHX0NPREVDQ09ORklHKSB8fAorICAgICAgICAgICAgICAgICAgICAgICAgKGlucHV0RGF0YS0+ZGF0YUxlbiA9PSAwKSkpIHsKKyAgICAgICAgICAgICAgICAgICAgaW5wdXREYXRhLT5uRmxhZ3MgfD0gT01YX0JVRkZFUkZMQUdfRU9TOworICAgICAgICAgICAgICAgICAgICBmbGFnRU9GID0gT01YX1RSVUU7CisgICAgICAgICAgICAgICAgICAgIHBTRUNDb21wb25lbnQtPmJTYXZlRmxhZ0VPUyA9IE9NWF9GQUxTRTsKKyAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmICgoaW5wdXRVc2VCdWZmZXItPm5GbGFncyAmIE9NWF9CVUZGRVJGTEFHX0VPUykgJiYKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoIShpbnB1dERhdGEtPm5GbGFncyAmIE9NWF9CVUZGRVJGTEFHX0NPREVDQ09ORklHKSkgJiYKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoaW5wdXREYXRhLT5kYXRhTGVuICE9IDApKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBpbnB1dERhdGEtPm5GbGFncyA9IChpbnB1dERhdGEtPm5GbGFncyAmICh+T01YX0JVRkZFUkZMQUdfRU9TKSk7CisgICAgICAgICAgICAgICAgICAgICAgICBmbGFnRU9GID0gT01YX1RSVUU7CisgICAgICAgICAgICAgICAgICAgICAgICBwU0VDQ29tcG9uZW50LT5iU2F2ZUZsYWdFT1MgPSBPTVhfVFJVRTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIGlucHV0RGF0YS0+bkZsYWdzID0gKGlucHV0VXNlQnVmZmVyLT5uRmxhZ3MgJiAofk9NWF9CVUZGRVJGTEFHX0VPUykpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaWYoKChpbnB1dERhdGEtPm5GbGFncyAmIE9NWF9CVUZGRVJGTEFHX0VPUykgPT0gT01YX0JVRkZFUkZMQUdfRU9TKSAmJgorICAgICAgICAgICAgICAgKGlucHV0RGF0YS0+ZGF0YUxlbiA8PSAwKSAmJiAoZmxhZ0VPRiA9PSBPTVhfVFJVRSkpIHsKKyAgICAgICAgICAgICAgICBpbnB1dERhdGEtPmRhdGFMZW4gPSBpbnB1dERhdGEtPnByZXZpb3VzRGF0YUxlbjsKKyAgICAgICAgICAgICAgICBpbnB1dERhdGEtPnJlbWFpbkRhdGFMZW4gPSBpbnB1dERhdGEtPnByZXZpb3VzRGF0YUxlbjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIC8qPz8/Pz8/Pz8/Pz8/Pz8/Pz8/Pz8/Pz8/Pz8/Pz8/Pz8/IEVycm9yID8/Pz8/Pz8/Pz8/Pz8/Pz8/Pz8/Pz8/Pz8/Pz8/Pz8/PyovCisgICAgICAgICAgICBTRUNfRGF0YVJlc2V0KHBPTVhDb21wb25lbnQsIElOUFVUX1BPUlRfSU5ERVgpOworICAgICAgICAgICAgZmxhZ0VPRiA9IE9NWF9GQUxTRTsKKyAgICAgICAgfQorCisgICAgICAgIGlmIChpbnB1dFVzZUJ1ZmZlci0+cmVtYWluRGF0YUxlbiA9PSAwKSB7CisgICAgICAgICAgICBpZiAocFZpZGVvRGVjLT5iRFJNUGxheWVyTW9kZSAhPSBPTVhfVFJVRSkKKyAgICAgICAgICAgICAgICBTRUNfSW5wdXRCdWZmZXJSZXR1cm4ocE9NWENvbXBvbmVudCk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBpbnB1dFVzZUJ1ZmZlci0+ZGF0YVZhbGlkID0gT01YX1RSVUU7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoZmxhZ0VPRiA9PSBPTVhfVFJVRSkgeworICAgICAgICBpZiAocFNFQ0NvbXBvbmVudC0+Y2hlY2tUaW1lU3RhbXAubmVlZFNldFN0YXJ0VGltZVN0YW1wID09IE9NWF9UUlVFKSB7CisgICAgICAgICAgICBwU0VDQ29tcG9uZW50LT5jaGVja1RpbWVTdGFtcC5uZWVkQ2hlY2tTdGFydFRpbWVTdGFtcCA9IE9NWF9UUlVFOworICAgICAgICAgICAgcFNFQ0NvbXBvbmVudC0+Y2hlY2tUaW1lU3RhbXAuc3RhcnRUaW1lU3RhbXAgPSBpbnB1dERhdGEtPnRpbWVTdGFtcDsKKyAgICAgICAgICAgIHBTRUNDb21wb25lbnQtPmNoZWNrVGltZVN0YW1wLm5TdGFydEZsYWdzID0gaW5wdXREYXRhLT5uRmxhZ3M7CisgICAgICAgICAgICBwU0VDQ29tcG9uZW50LT5jaGVja1RpbWVTdGFtcC5uZWVkU2V0U3RhcnRUaW1lU3RhbXAgPSBPTVhfRkFMU0U7CisgICAgICAgICAgICBTRUNfT1NBTF9Mb2coU0VDX0xPR19UUkFDRSwgImZpcnN0IGZyYW1lIHRpbWVzdGFtcCBhZnRlciBzZWVraW5nICVsbGQgdXMgKCUuMmYgc2VjcykiLAorICAgICAgICAgICAgICAgIGlucHV0RGF0YS0+dGltZVN0YW1wLCBpbnB1dERhdGEtPnRpbWVTdGFtcCAvIDFFNik7CisgICAgICAgIH0KKworICAgICAgICByZXQgPSBPTVhfVFJVRTsKKyAgICB9IGVsc2UgeworICAgICAgICByZXQgPSBPTVhfRkFMU0U7CisgICAgfQorCisgICAgRnVuY3Rpb25PdXQoKTsKKworICAgIHJldHVybiByZXQ7Cit9CisKK09NWF9CT09MIFNFQ19Qb3N0cHJvY2Vzc19PdXRwdXREYXRhKE9NWF9DT01QT05FTlRUWVBFICpwT01YQ29tcG9uZW50KQoreworICAgIE9NWF9CT09MICAgICAgICAgICAgICAgcmV0ID0gT01YX0ZBTFNFOworICAgIFNFQ19PTVhfQkFTRUNPTVBPTkVOVCAqcFNFQ0NvbXBvbmVudCA9IChTRUNfT01YX0JBU0VDT01QT05FTlQgKilwT01YQ29tcG9uZW50LT5wQ29tcG9uZW50UHJpdmF0ZTsKKyAgICBTRUNfT01YX0JBU0VQT1JUICAgICAgKnNlY091dHB1dFBvcnQgPSAmcFNFQ0NvbXBvbmVudC0+cFNFQ1BvcnRbT1VUUFVUX1BPUlRfSU5ERVhdOworICAgIFNFQ19PTVhfREFUQUJVRkZFUiAgICAqb3V0cHV0VXNlQnVmZmVyID0gJnBTRUNDb21wb25lbnQtPnNlY0RhdGFCdWZmZXJbT1VUUFVUX1BPUlRfSU5ERVhdOworICAgIFNFQ19PTVhfREFUQSAgICAgICAgICAqb3V0cHV0RGF0YSA9ICZwU0VDQ29tcG9uZW50LT5wcm9jZXNzRGF0YVtPVVRQVVRfUE9SVF9JTkRFWF07CisgICAgT01YX1UzMiAgICAgICAgICAgICAgICBjb3B5U2l6ZSA9IDA7CisKKyAgICBGdW5jdGlvbkluKCk7CisKKyAgICBpZiAob3V0cHV0VXNlQnVmZmVyLT5kYXRhVmFsaWQgPT0gT01YX1RSVUUpIHsKKyAgICAgICAgaWYgKHBTRUNDb21wb25lbnQtPmNoZWNrVGltZVN0YW1wLm5lZWRDaGVja1N0YXJ0VGltZVN0YW1wID09IE9NWF9UUlVFKSB7CisgICAgICAgICAgICBpZiAoKHBTRUNDb21wb25lbnQtPmNoZWNrVGltZVN0YW1wLnN0YXJ0VGltZVN0YW1wID09IG91dHB1dERhdGEtPnRpbWVTdGFtcCkgJiYKKyAgICAgICAgICAgICAgICAocFNFQ0NvbXBvbmVudC0+Y2hlY2tUaW1lU3RhbXAublN0YXJ0RmxhZ3MgPT0gb3V0cHV0RGF0YS0+bkZsYWdzKSl7CisgICAgICAgICAgICAgICAgcFNFQ0NvbXBvbmVudC0+Y2hlY2tUaW1lU3RhbXAuc3RhcnRUaW1lU3RhbXAgPSAtMTk3NjExMjM7CisgICAgICAgICAgICAgICAgcFNFQ0NvbXBvbmVudC0+Y2hlY2tUaW1lU3RhbXAublN0YXJ0RmxhZ3MgPSAweDA7CisgICAgICAgICAgICAgICAgcFNFQ0NvbXBvbmVudC0+Y2hlY2tUaW1lU3RhbXAubmVlZFNldFN0YXJ0VGltZVN0YW1wID0gT01YX0ZBTFNFOworICAgICAgICAgICAgICAgIHBTRUNDb21wb25lbnQtPmNoZWNrVGltZVN0YW1wLm5lZWRDaGVja1N0YXJ0VGltZVN0YW1wID0gT01YX0ZBTFNFOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBTRUNfRGF0YVJlc2V0KHBPTVhDb21wb25lbnQsIE9VVFBVVF9QT1JUX0lOREVYKTsKKyAgICAgICAgICAgICAgICByZXQgPSBPTVhfVFJVRTsKKyAgICAgICAgICAgICAgICBnb3RvIEVYSVQ7CisgICAgICAgICAgICB9CisgICAgICAgIH0gZWxzZSBpZiAocFNFQ0NvbXBvbmVudC0+Y2hlY2tUaW1lU3RhbXAubmVlZFNldFN0YXJ0VGltZVN0YW1wID09IE9NWF9UUlVFKSB7CisgICAgICAgICAgICBTRUNfRGF0YVJlc2V0KHBPTVhDb21wb25lbnQsIE9VVFBVVF9QT1JUX0lOREVYKTsKKyAgICAgICAgICAgIHJldCA9IE9NWF9UUlVFOworICAgICAgICAgICAgZ290byBFWElUOworICAgICAgICB9CisKKyAgICAgICAgaWYgKG91dHB1dERhdGEtPnJlbWFpbkRhdGFMZW4gPD0gKG91dHB1dFVzZUJ1ZmZlci0+YWxsb2NTaXplIC0gb3V0cHV0VXNlQnVmZmVyLT5kYXRhTGVuKSkgeworICAgICAgICAgICAgY29weVNpemUgPSBvdXRwdXREYXRhLT5yZW1haW5EYXRhTGVuOworCisgICAgICAgICAgICBvdXRwdXRVc2VCdWZmZXItPmRhdGFMZW4gKz0gY29weVNpemU7CisgICAgICAgICAgICBvdXRwdXRVc2VCdWZmZXItPnJlbWFpbkRhdGFMZW4gKz0gY29weVNpemU7CisgICAgICAgICAgICBvdXRwdXRVc2VCdWZmZXItPm5GbGFncyA9IG91dHB1dERhdGEtPm5GbGFnczsKKyAgICAgICAgICAgIG91dHB1dFVzZUJ1ZmZlci0+dGltZVN0YW1wID0gb3V0cHV0RGF0YS0+dGltZVN0YW1wOworCisgICAgICAgICAgICByZXQgPSBPTVhfVFJVRTsKKworICAgICAgICAgICAgLyogcmVzZXQgb3V0cHV0RGF0YSAqLworICAgICAgICAgICAgU0VDX0RhdGFSZXNldChwT01YQ29tcG9uZW50LCBPVVRQVVRfUE9SVF9JTkRFWCk7CisKKyAgICAgICAgICAgIGlmICgob3V0cHV0VXNlQnVmZmVyLT5yZW1haW5EYXRhTGVuID4gMCkgfHwKKyAgICAgICAgICAgICAgICAob3V0cHV0VXNlQnVmZmVyLT5uRmxhZ3MgJiBPTVhfQlVGRkVSRkxBR19FT1MpKQorICAgICAgICAgICAgICAgIFNFQ19PdXRwdXRCdWZmZXJSZXR1cm4ocE9NWENvbXBvbmVudCk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBTRUNfT1NBTF9Mb2coU0VDX0xPR19FUlJPUiwgIm91dHB1dCBidWZmZXIgaXMgc21hbGxlciB0aGFuIGRlY29kZWQgZGF0YSBzaXplIE91dCBMZW5ndGgiKTsKKworICAgICAgICAgICAgcmV0ID0gT01YX0ZBTFNFOworCisgICAgICAgICAgICAvKiByZXNldCBvdXRwdXREYXRhICovCisgICAgICAgICAgICBTRUNfRGF0YVJlc2V0KHBPTVhDb21wb25lbnQsIE9VVFBVVF9QT1JUX0lOREVYKTsKKyAgICAgICAgfQorICAgIH0gZWxzZSB7CisgICAgICAgIHJldCA9IE9NWF9GQUxTRTsKKyAgICB9CisKK0VYSVQ6CisgICAgRnVuY3Rpb25PdXQoKTsKKworICAgIHJldHVybiByZXQ7Cit9CisKK09NWF9FUlJPUlRZUEUgU0VDX09NWF9CdWZmZXJQcm9jZXNzKE9NWF9IQU5ETEVUWVBFIGhDb21wb25lbnQpCit7CisgICAgT01YX0VSUk9SVFlQRSAgICAgICAgICByZXQgPSBPTVhfRXJyb3JOb25lOworICAgIE9NWF9DT01QT05FTlRUWVBFICAgICAqcE9NWENvbXBvbmVudCA9IChPTVhfQ09NUE9ORU5UVFlQRSAqKWhDb21wb25lbnQ7CisgICAgU0VDX09NWF9CQVNFQ09NUE9ORU5UICpwU0VDQ29tcG9uZW50ID0gKFNFQ19PTVhfQkFTRUNPTVBPTkVOVCAqKXBPTVhDb21wb25lbnQtPnBDb21wb25lbnRQcml2YXRlOworICAgIFNFQ19PTVhfVklERU9ERUNfQ09NUE9ORU5UICpwVmlkZW9EZWMgPSAoU0VDX09NWF9WSURFT0RFQ19DT01QT05FTlQgKilwU0VDQ29tcG9uZW50LT5oQ29tcG9uZW50SGFuZGxlOworICAgIFNFQ19PTVhfQkFTRVBPUlQgICAgICAqc2VjSW5wdXRQb3J0ID0gJnBTRUNDb21wb25lbnQtPnBTRUNQb3J0W0lOUFVUX1BPUlRfSU5ERVhdOworICAgIFNFQ19PTVhfQkFTRVBPUlQgICAgICAqc2VjT3V0cHV0UG9ydCA9ICZwU0VDQ29tcG9uZW50LT5wU0VDUG9ydFtPVVRQVVRfUE9SVF9JTkRFWF07CisgICAgU0VDX09NWF9EQVRBQlVGRkVSICAgICppbnB1dFVzZUJ1ZmZlciA9ICZwU0VDQ29tcG9uZW50LT5zZWNEYXRhQnVmZmVyW0lOUFVUX1BPUlRfSU5ERVhdOworICAgIFNFQ19PTVhfREFUQUJVRkZFUiAgICAqb3V0cHV0VXNlQnVmZmVyID0gJnBTRUNDb21wb25lbnQtPnNlY0RhdGFCdWZmZXJbT1VUUFVUX1BPUlRfSU5ERVhdOworICAgIFNFQ19PTVhfREFUQSAgICAgICAgICAqaW5wdXREYXRhID0gJnBTRUNDb21wb25lbnQtPnByb2Nlc3NEYXRhW0lOUFVUX1BPUlRfSU5ERVhdOworICAgIFNFQ19PTVhfREFUQSAgICAgICAgICAqb3V0cHV0RGF0YSA9ICZwU0VDQ29tcG9uZW50LT5wcm9jZXNzRGF0YVtPVVRQVVRfUE9SVF9JTkRFWF07CisgICAgT01YX1UzMiAgICAgICAgICAgICAgICBjb3B5U2l6ZSA9IDA7CisKKyAgICBwU0VDQ29tcG9uZW50LT5yZW1haW5PdXRwdXREYXRhID0gT01YX0ZBTFNFOworICAgIHBTRUNDb21wb25lbnQtPnJlSW5wdXREYXRhID0gT01YX0ZBTFNFOworCisgICAgRnVuY3Rpb25JbigpOworCisgICAgd2hpbGUgKCFwU0VDQ29tcG9uZW50LT5iRXhpdEJ1ZmZlclByb2Nlc3NUaHJlYWQpIHsKKyAgICAgICAgU0VDX09TQUxfU2xlZXBNaWxsaXNlYygwKTsKKworICAgICAgICBpZiAoKChwU0VDQ29tcG9uZW50LT5jdXJyZW50U3RhdGUgPT0gT01YX1N0YXRlUGF1c2UpIHx8CisgICAgICAgICAgICAocFNFQ0NvbXBvbmVudC0+Y3VycmVudFN0YXRlID09IE9NWF9TdGF0ZUlkbGUpIHx8CisgICAgICAgICAgICAocFNFQ0NvbXBvbmVudC0+dHJhbnNpZW50U3RhdGUgPT0gU0VDX09NWF9UcmFuc1N0YXRlTG9hZGVkVG9JZGxlKSB8fAorICAgICAgICAgICAgKHBTRUNDb21wb25lbnQtPnRyYW5zaWVudFN0YXRlID09IFNFQ19PTVhfVHJhbnNTdGF0ZUV4ZWN1dGluZ1RvSWRsZSkpICYmCisgICAgICAgICAgICAocFNFQ0NvbXBvbmVudC0+dHJhbnNpZW50U3RhdGUgIT0gU0VDX09NWF9UcmFuc1N0YXRlSWRsZVRvTG9hZGVkKSYmCisgICAgICAgICAgICAoKCFDSEVDS19QT1JUX0JFSU5HX0ZMVVNIRUQoc2VjSW5wdXRQb3J0KSAmJiAhQ0hFQ0tfUE9SVF9CRUlOR19GTFVTSEVEKHNlY091dHB1dFBvcnQpKSkpIHsKKyAgICAgICAgICAgIFNFQ19PU0FMX1NpZ25hbFdhaXQocFNFQ0NvbXBvbmVudC0+cGF1c2VFdmVudCwgREVGX01BWF9XQUlUX1RJTUUpOworICAgICAgICAgICAgU0VDX09TQUxfU2lnbmFsUmVzZXQocFNFQ0NvbXBvbmVudC0+cGF1c2VFdmVudCk7CisgICAgICAgIH0KKworICAgICAgICB3aGlsZSAoKFNFQ19DaGVja19CdWZmZXJQcm9jZXNzX1N0YXRlKHBTRUNDb21wb25lbnQpKSAmJiAoIXBTRUNDb21wb25lbnQtPmJFeGl0QnVmZmVyUHJvY2Vzc1RocmVhZCkpIHsKKyAgICAgICAgICAgIFNFQ19PU0FMX1NsZWVwTWlsbGlzZWMoMCk7CisKKyAgICAgICAgICAgIFNFQ19PU0FMX011dGV4TG9jayhvdXRwdXRVc2VCdWZmZXItPmJ1ZmZlck11dGV4KTsKKyAgICAgICAgICAgIGlmICgob3V0cHV0VXNlQnVmZmVyLT5kYXRhVmFsaWQgIT0gT01YX1RSVUUpICYmCisgICAgICAgICAgICAgICAgKCFDSEVDS19QT1JUX0JFSU5HX0ZMVVNIRUQoc2VjT3V0cHV0UG9ydCkpKSB7CisgICAgICAgICAgICAgICAgU0VDX09TQUxfTXV0ZXhVbmxvY2sob3V0cHV0VXNlQnVmZmVyLT5idWZmZXJNdXRleCk7CisgICAgICAgICAgICAgICAgcmV0ID0gU0VDX091dHB1dEJ1ZmZlckdldFF1ZXVlKHBTRUNDb21wb25lbnQpOworICAgICAgICAgICAgICAgIGlmICgocmV0ID09IE9NWF9FcnJvclVuZGVmaW5lZCkgfHwKKyAgICAgICAgICAgICAgICAgICAgKHNlY0lucHV0UG9ydC0+cG9ydFN0YXRlICE9IE9NWF9TdGF0ZUlkbGUpIHx8CisgICAgICAgICAgICAgICAgICAgIChzZWNPdXRwdXRQb3J0LT5wb3J0U3RhdGUgIT0gT01YX1N0YXRlSWRsZSkpIHsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBTRUNfT1NBTF9NdXRleFVubG9jayhvdXRwdXRVc2VCdWZmZXItPmJ1ZmZlck11dGV4KTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaWYgKHBTRUNDb21wb25lbnQtPnJlbWFpbk91dHB1dERhdGEgPT0gT01YX0ZBTFNFKSB7CisgICAgICAgICAgICAgICAgaWYgKHBTRUNDb21wb25lbnQtPnJlSW5wdXREYXRhID09IE9NWF9GQUxTRSkgeworICAgICAgICAgICAgICAgICAgICBTRUNfT1NBTF9NdXRleExvY2soaW5wdXRVc2VCdWZmZXItPmJ1ZmZlck11dGV4KTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKChTRUNfUHJlcHJvY2Vzc29yX0lucHV0RGF0YShwT01YQ29tcG9uZW50KSA9PSBPTVhfRkFMU0UpICYmCisgICAgICAgICAgICAgICAgICAgICAgICAoIUNIRUNLX1BPUlRfQkVJTkdfRkxVU0hFRChzZWNJbnB1dFBvcnQpKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNFQ19PU0FMX011dGV4VW5sb2NrKGlucHV0VXNlQnVmZmVyLT5idWZmZXJNdXRleCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0ID0gU0VDX0lucHV0QnVmZmVyR2V0UXVldWUocFNFQ0NvbXBvbmVudCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICBTRUNfT1NBTF9NdXRleFVubG9jayhpbnB1dFVzZUJ1ZmZlci0+YnVmZmVyTXV0ZXgpOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIFNFQ19PU0FMX011dGV4TG9jayhpbnB1dFVzZUJ1ZmZlci0+YnVmZmVyTXV0ZXgpOworICAgICAgICAgICAgICAgIFNFQ19PU0FMX011dGV4TG9jayhvdXRwdXRVc2VCdWZmZXItPmJ1ZmZlck11dGV4KTsKKyAgICAgICAgICAgICAgICByZXQgPSBwU0VDQ29tcG9uZW50LT5zZWNfbWZjX2J1ZmZlclByb2Nlc3MocE9NWENvbXBvbmVudCwgaW5wdXREYXRhLCBvdXRwdXREYXRhKTsKKworICAgICAgICAgICAgICAgIGlmIChwVmlkZW9EZWMtPmJEUk1QbGF5ZXJNb2RlID09IE9NWF9UUlVFKSB7CisgICAgICAgICAgICAgICAgICAgIGlmICgoaW5wdXRVc2VCdWZmZXItPnJlbWFpbkRhdGFMZW4gPT0gMCkgJiYKKyAgICAgICAgICAgICAgICAgICAgICAgIChyZXQgIT0gT01YX0Vycm9ySW5wdXREYXRhRGVjb2RlWWV0KSkKKyAgICAgICAgICAgICAgICAgICAgICAgIFNFQ19JbnB1dEJ1ZmZlclJldHVybihwT01YQ29tcG9uZW50KTsKKyAgICAgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICAgICAgaW5wdXRVc2VCdWZmZXItPmRhdGFWYWxpZCA9IE9NWF9UUlVFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBTRUNfT1NBTF9NdXRleFVubG9jayhvdXRwdXRVc2VCdWZmZXItPmJ1ZmZlck11dGV4KTsKKyAgICAgICAgICAgICAgICBTRUNfT1NBTF9NdXRleFVubG9jayhpbnB1dFVzZUJ1ZmZlci0+YnVmZmVyTXV0ZXgpOworCisgICAgICAgICAgICAgICAgaWYgKHJldCA9PSBPTVhfRXJyb3JJbnB1dERhdGFEZWNvZGVZZXQpCisgICAgICAgICAgICAgICAgICAgIHBTRUNDb21wb25lbnQtPnJlSW5wdXREYXRhID0gT01YX1RSVUU7CisgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICBwU0VDQ29tcG9uZW50LT5yZUlucHV0RGF0YSA9IE9NWF9GQUxTRTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgU0VDX09TQUxfTXV0ZXhMb2NrKG91dHB1dFVzZUJ1ZmZlci0+YnVmZmVyTXV0ZXgpOworCisgICAgICAgICAgICBpZiAoU0VDX1Bvc3Rwcm9jZXNzX091dHB1dERhdGEocE9NWENvbXBvbmVudCkgPT0gT01YX0ZBTFNFKQorICAgICAgICAgICAgICAgIHBTRUNDb21wb25lbnQtPnJlbWFpbk91dHB1dERhdGEgPSBPTVhfVFJVRTsKKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICBwU0VDQ29tcG9uZW50LT5yZW1haW5PdXRwdXREYXRhID0gT01YX0ZBTFNFOworCisgICAgICAgICAgICBTRUNfT1NBTF9NdXRleFVubG9jayhvdXRwdXRVc2VCdWZmZXItPmJ1ZmZlck11dGV4KTsKKyAgICAgICAgfQorICAgIH0KKworRVhJVDoKKworICAgIEZ1bmN0aW9uT3V0KCk7CisKKyAgICByZXR1cm4gcmV0OworfQorCitPTVhfRVJST1JUWVBFIFNFQ19PTVhfVmlkZW9EZWNvZGVHZXRQYXJhbWV0ZXIoCisgICAgT01YX0lOIE9NWF9IQU5ETEVUWVBFIGhDb21wb25lbnQsCisgICAgT01YX0lOIE9NWF9JTkRFWFRZUEUgIG5QYXJhbUluZGV4LAorICAgIE9NWF9JTk9VVCBPTVhfUFRSICAgICBDb21wb25lbnRQYXJhbWV0ZXJTdHJ1Y3R1cmUpCit7CisgICAgT01YX0VSUk9SVFlQRSAgICAgICAgICByZXQgPSBPTVhfRXJyb3JOb25lOworICAgIE9NWF9DT01QT05FTlRUWVBFICAgICAqcE9NWENvbXBvbmVudCA9IE5VTEw7CisgICAgU0VDX09NWF9CQVNFQ09NUE9ORU5UICpwU0VDQ29tcG9uZW50ID0gTlVMTDsKKyAgICBTRUNfT01YX0JBU0VQT1JUICAgICAgKnBTRUNQb3J0ID0gTlVMTDsKKworICAgIEZ1bmN0aW9uSW4oKTsKKworICAgIGlmIChoQ29tcG9uZW50ID09IE5VTEwpIHsKKyAgICAgICAgcmV0ID0gT01YX0Vycm9yQmFkUGFyYW1ldGVyOworICAgICAgICBnb3RvIEVYSVQ7CisgICAgfQorICAgIHBPTVhDb21wb25lbnQgPSAoT01YX0NPTVBPTkVOVFRZUEUgKiloQ29tcG9uZW50OworICAgIHJldCA9IFNFQ19PTVhfQ2hlY2tfU2l6ZVZlcnNpb24ocE9NWENvbXBvbmVudCwgc2l6ZW9mKE9NWF9DT01QT05FTlRUWVBFKSk7CisgICAgaWYgKHJldCAhPSBPTVhfRXJyb3JOb25lKSB7CisgICAgICAgIGdvdG8gRVhJVDsKKyAgICB9CisKKyAgICBpZiAocE9NWENvbXBvbmVudC0+cENvbXBvbmVudFByaXZhdGUgPT0gTlVMTCkgeworICAgICAgICByZXQgPSBPTVhfRXJyb3JCYWRQYXJhbWV0ZXI7CisgICAgICAgIGdvdG8gRVhJVDsKKyAgICB9CisgICAgcFNFQ0NvbXBvbmVudCA9IChTRUNfT01YX0JBU0VDT01QT05FTlQgKilwT01YQ29tcG9uZW50LT5wQ29tcG9uZW50UHJpdmF0ZTsKKworICAgIGlmIChwU0VDQ29tcG9uZW50LT5jdXJyZW50U3RhdGUgPT0gT01YX1N0YXRlSW52YWxpZCApIHsKKyAgICAgICAgcmV0ID0gT01YX0Vycm9ySW52YWxpZFN0YXRlOworICAgICAgICBnb3RvIEVYSVQ7CisgICAgfQorCisgICAgaWYgKENvbXBvbmVudFBhcmFtZXRlclN0cnVjdHVyZSA9PSBOVUxMKSB7CisgICAgICAgIHJldCA9IE9NWF9FcnJvckJhZFBhcmFtZXRlcjsKKyAgICAgICAgZ290byBFWElUOworICAgIH0KKworICAgIHN3aXRjaCAoblBhcmFtSW5kZXgpIHsKKyAgICBjYXNlIE9NWF9JbmRleFBhcmFtVmlkZW9Jbml0OgorICAgIHsKKyAgICAgICAgT01YX1BPUlRfUEFSQU1fVFlQRSAqcG9ydFBhcmFtID0gKE9NWF9QT1JUX1BBUkFNX1RZUEUgKilDb21wb25lbnRQYXJhbWV0ZXJTdHJ1Y3R1cmU7CisgICAgICAgIHJldCA9IFNFQ19PTVhfQ2hlY2tfU2l6ZVZlcnNpb24ocG9ydFBhcmFtLCBzaXplb2YoT01YX1BPUlRfUEFSQU1fVFlQRSkpOworICAgICAgICBpZiAocmV0ICE9IE9NWF9FcnJvck5vbmUpIHsKKyAgICAgICAgICAgIGdvdG8gRVhJVDsKKyAgICAgICAgfQorCisgICAgICAgIHBvcnRQYXJhbS0+blBvcnRzICAgICAgICAgICA9IHBTRUNDb21wb25lbnQtPnBvcnRQYXJhbS5uUG9ydHM7CisgICAgICAgIHBvcnRQYXJhbS0+blN0YXJ0UG9ydE51bWJlciA9IHBTRUNDb21wb25lbnQtPnBvcnRQYXJhbS5uU3RhcnRQb3J0TnVtYmVyOworICAgICAgICByZXQgPSBPTVhfRXJyb3JOb25lOworICAgIH0KKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBPTVhfSW5kZXhQYXJhbVZpZGVvUG9ydEZvcm1hdDoKKyAgICB7CisgICAgICAgIE9NWF9WSURFT19QQVJBTV9QT1JURk9STUFUVFlQRSAqcG9ydEZvcm1hdCA9IChPTVhfVklERU9fUEFSQU1fUE9SVEZPUk1BVFRZUEUgKilDb21wb25lbnRQYXJhbWV0ZXJTdHJ1Y3R1cmU7CisgICAgICAgIE9NWF9VMzIgICAgICAgICAgICAgICAgICAgICAgICAgcG9ydEluZGV4ID0gcG9ydEZvcm1hdC0+blBvcnRJbmRleDsKKyAgICAgICAgT01YX1UzMiAgICAgICAgICAgICAgICAgICAgICAgICBpbmRleCAgICA9IHBvcnRGb3JtYXQtPm5JbmRleDsKKyAgICAgICAgU0VDX09NWF9CQVNFUE9SVCAgICAgICAgICAgICAgICpwU0VDUG9ydCA9IE5VTEw7CisgICAgICAgIE9NWF9QQVJBTV9QT1JUREVGSU5JVElPTlRZUEUgICAqcG9ydERlZmluaXRpb24gPSBOVUxMOworICAgICAgICBPTVhfVTMyICAgICAgICAgICAgICAgICAgICAgICAgIHN1cHBvcnRGb3JtYXROdW0gPSAwOyAvKiBzdXBwb3J0Rm9ybWF0TnVtID0gTi0xICovCisKKyAgICAgICAgcmV0ID0gU0VDX09NWF9DaGVja19TaXplVmVyc2lvbihwb3J0Rm9ybWF0LCBzaXplb2YoT01YX1ZJREVPX1BBUkFNX1BPUlRGT1JNQVRUWVBFKSk7CisgICAgICAgIGlmIChyZXQgIT0gT01YX0Vycm9yTm9uZSkgeworICAgICAgICAgICAgZ290byBFWElUOworICAgICAgICB9CisKKyAgICAgICAgaWYgKChwb3J0SW5kZXggPj0gcFNFQ0NvbXBvbmVudC0+cG9ydFBhcmFtLm5Qb3J0cykpIHsKKyAgICAgICAgICAgIHJldCA9IE9NWF9FcnJvckJhZFBvcnRJbmRleDsKKyAgICAgICAgICAgIGdvdG8gRVhJVDsKKyAgICAgICAgfQorCisKKyAgICAgICAgaWYgKHBvcnRJbmRleCA9PSBJTlBVVF9QT1JUX0lOREVYKSB7CisgICAgICAgICAgICBzdXBwb3J0Rm9ybWF0TnVtID0gSU5QVVRfUE9SVF9TVVBQT1JURk9STUFUX05VTV9NQVggLSAxOworICAgICAgICAgICAgaWYgKGluZGV4ID4gc3VwcG9ydEZvcm1hdE51bSkgeworICAgICAgICAgICAgICAgIHJldCA9IE9NWF9FcnJvck5vTW9yZTsKKyAgICAgICAgICAgICAgICBnb3RvIEVYSVQ7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHBTRUNQb3J0ID0gJnBTRUNDb21wb25lbnQtPnBTRUNQb3J0W0lOUFVUX1BPUlRfSU5ERVhdOworICAgICAgICAgICAgcG9ydERlZmluaXRpb24gPSAmcFNFQ1BvcnQtPnBvcnREZWZpbml0aW9uOworCisgICAgICAgICAgICBwb3J0Rm9ybWF0LT5lQ29tcHJlc3Npb25Gb3JtYXQgPSBwb3J0RGVmaW5pdGlvbi0+Zm9ybWF0LnZpZGVvLmVDb21wcmVzc2lvbkZvcm1hdDsKKyAgICAgICAgICAgIHBvcnRGb3JtYXQtPmVDb2xvckZvcm1hdCAgICAgICA9IHBvcnREZWZpbml0aW9uLT5mb3JtYXQudmlkZW8uZUNvbG9yRm9ybWF0OworICAgICAgICAgICAgcG9ydEZvcm1hdC0+eEZyYW1lcmF0ZSAgICAgICAgICAgPSBwb3J0RGVmaW5pdGlvbi0+Zm9ybWF0LnZpZGVvLnhGcmFtZXJhdGU7CisgICAgICAgIH0gZWxzZSBpZiAocG9ydEluZGV4ID09IE9VVFBVVF9QT1JUX0lOREVYKSB7CisgICAgICAgICAgICBzdXBwb3J0Rm9ybWF0TnVtID0gT1VUUFVUX1BPUlRfU1VQUE9SVEZPUk1BVF9OVU1fTUFYIC0gMTsKKyAgICAgICAgICAgIGlmIChpbmRleCA+IHN1cHBvcnRGb3JtYXROdW0pIHsKKyAgICAgICAgICAgICAgICByZXQgPSBPTVhfRXJyb3JOb01vcmU7CisgICAgICAgICAgICAgICAgZ290byBFWElUOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBwU0VDUG9ydCA9ICZwU0VDQ29tcG9uZW50LT5wU0VDUG9ydFtPVVRQVVRfUE9SVF9JTkRFWF07CisgICAgICAgICAgICBwb3J0RGVmaW5pdGlvbiA9ICZwU0VDUG9ydC0+cG9ydERlZmluaXRpb247CisKKyAgICAgICAgICAgIHN3aXRjaCAoaW5kZXgpIHsKKyAgICAgICAgICAgIGNhc2Ugc3VwcG9ydEZvcm1hdF8wOgorICAgICAgICAgICAgICAgIHBvcnRGb3JtYXQtPmVDb21wcmVzc2lvbkZvcm1hdCA9IE9NWF9WSURFT19Db2RpbmdVbnVzZWQ7CisgICAgICAgICAgICAgICAgcG9ydEZvcm1hdC0+ZUNvbG9yRm9ybWF0ICAgICAgID0gT01YX0NPTE9SX0Zvcm1hdFlVVjQyMFBsYW5hcjsKKyAgICAgICAgICAgICAgICBwb3J0Rm9ybWF0LT54RnJhbWVyYXRlICAgICAgICAgPSBwb3J0RGVmaW5pdGlvbi0+Zm9ybWF0LnZpZGVvLnhGcmFtZXJhdGU7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIHN1cHBvcnRGb3JtYXRfMToKKyAgICAgICAgICAgICAgICBwb3J0Rm9ybWF0LT5lQ29tcHJlc3Npb25Gb3JtYXQgPSBPTVhfVklERU9fQ29kaW5nVW51c2VkOworICAgICAgICAgICAgICAgIHBvcnRGb3JtYXQtPmVDb2xvckZvcm1hdCAgICAgICA9IE9NWF9DT0xPUl9Gb3JtYXRZVVY0MjBTZW1pUGxhbmFyOworICAgICAgICAgICAgICAgIHBvcnRGb3JtYXQtPnhGcmFtZXJhdGUgICAgICAgICA9IHBvcnREZWZpbml0aW9uLT5mb3JtYXQudmlkZW8ueEZyYW1lcmF0ZTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2Ugc3VwcG9ydEZvcm1hdF8yOgorICAgICAgICAgICAgICAgIHBvcnRGb3JtYXQtPmVDb21wcmVzc2lvbkZvcm1hdCA9IE9NWF9WSURFT19Db2RpbmdVbnVzZWQ7CisgICAgICAgICAgICAgICAgcG9ydEZvcm1hdC0+ZUNvbG9yRm9ybWF0ICAgICAgID0gT01YX1NFQ19DT0xPUl9Gb3JtYXROVjEyVFBoeXNpY2FsQWRkcmVzczsKKyAgICAgICAgICAgICAgICBwb3J0Rm9ybWF0LT54RnJhbWVyYXRlICAgICAgICAgPSBwb3J0RGVmaW5pdGlvbi0+Zm9ybWF0LnZpZGVvLnhGcmFtZXJhdGU7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgIGNhc2Ugc3VwcG9ydEZvcm1hdF8zOgorICAgICAgICAgICAgICAgIHBvcnRGb3JtYXQtPmVDb21wcmVzc2lvbkZvcm1hdCA9IE9NWF9WSURFT19Db2RpbmdVbnVzZWQ7CisgICAgICAgICAgICAgICAgcG9ydEZvcm1hdC0+ZUNvbG9yRm9ybWF0ICAgICAgID0gT01YX1NFQ19DT0xPUl9Gb3JtYXROVjEyVGlsZWQ7CisgICAgICAgICAgICAgICAgcG9ydEZvcm1hdC0+eEZyYW1lcmF0ZSAgICAgICAgID0gcG9ydERlZmluaXRpb24tPmZvcm1hdC52aWRlby54RnJhbWVyYXRlOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIHJldCA9IE9NWF9FcnJvck5vbmU7CisgICAgfQorICAgICAgICBicmVhazsKKyNpZmRlZiBVU0VfQU5CCisgICAgY2FzZSBPTVhfSW5kZXhQYXJhbUdldEFuZHJvaWROYXRpdmVCdWZmZXI6CisgICAgeworICAgICAgICByZXQgPSBTRUNfT1NBTF9HZXRBTkJQYXJhbWV0ZXIoaENvbXBvbmVudCwgblBhcmFtSW5kZXgsIENvbXBvbmVudFBhcmFtZXRlclN0cnVjdHVyZSk7CisgICAgfQorICAgICAgICBicmVhazsKKyNlbmRpZgorICAgIGRlZmF1bHQ6CisgICAgeworICAgICAgICByZXQgPSBTRUNfT01YX0dldFBhcmFtZXRlcihoQ29tcG9uZW50LCBuUGFyYW1JbmRleCwgQ29tcG9uZW50UGFyYW1ldGVyU3RydWN0dXJlKTsKKyAgICB9CisgICAgICAgIGJyZWFrOworICAgIH0KKworRVhJVDoKKyAgICBGdW5jdGlvbk91dCgpOworCisgICAgcmV0dXJuIHJldDsKK30KK09NWF9FUlJPUlRZUEUgU0VDX09NWF9WaWRlb0RlY29kZVNldFBhcmFtZXRlcigKKyAgICBPTVhfSU4gT01YX0hBTkRMRVRZUEUgaENvbXBvbmVudCwKKyAgICBPTVhfSU4gT01YX0lOREVYVFlQRSAgbkluZGV4LAorICAgIE9NWF9JTiBPTVhfUFRSICAgICAgICBDb21wb25lbnRQYXJhbWV0ZXJTdHJ1Y3R1cmUpCit7CisgICAgT01YX0VSUk9SVFlQRSAgICAgICAgICByZXQgPSBPTVhfRXJyb3JOb25lOworICAgIE9NWF9DT01QT05FTlRUWVBFICAgICAqcE9NWENvbXBvbmVudCA9IE5VTEw7CisgICAgU0VDX09NWF9CQVNFQ09NUE9ORU5UICpwU0VDQ29tcG9uZW50ID0gTlVMTDsKKyAgICBTRUNfT01YX0JBU0VQT1JUICAgICAgKnBTRUNQb3J0ID0gTlVMTDsKKworICAgIEZ1bmN0aW9uSW4oKTsKKworICAgIGlmIChoQ29tcG9uZW50ID09IE5VTEwpIHsKKyAgICAgICAgcmV0ID0gT01YX0Vycm9yQmFkUGFyYW1ldGVyOworICAgICAgICBnb3RvIEVYSVQ7CisgICAgfQorICAgIHBPTVhDb21wb25lbnQgPSAoT01YX0NPTVBPTkVOVFRZUEUgKiloQ29tcG9uZW50OworICAgIHJldCA9IFNFQ19PTVhfQ2hlY2tfU2l6ZVZlcnNpb24ocE9NWENvbXBvbmVudCwgc2l6ZW9mKE9NWF9DT01QT05FTlRUWVBFKSk7CisgICAgaWYgKHJldCAhPSBPTVhfRXJyb3JOb25lKSB7CisgICAgICAgIGdvdG8gRVhJVDsKKyAgICB9CisKKyAgICBpZiAocE9NWENvbXBvbmVudC0+cENvbXBvbmVudFByaXZhdGUgPT0gTlVMTCkgeworICAgICAgICByZXQgPSBPTVhfRXJyb3JCYWRQYXJhbWV0ZXI7CisgICAgICAgIGdvdG8gRVhJVDsKKyAgICB9CisgICAgcFNFQ0NvbXBvbmVudCA9IChTRUNfT01YX0JBU0VDT01QT05FTlQgKilwT01YQ29tcG9uZW50LT5wQ29tcG9uZW50UHJpdmF0ZTsKKworICAgIGlmIChwU0VDQ29tcG9uZW50LT5jdXJyZW50U3RhdGUgPT0gT01YX1N0YXRlSW52YWxpZCApIHsKKyAgICAgICAgcmV0ID0gT01YX0Vycm9ySW52YWxpZFN0YXRlOworICAgICAgICBnb3RvIEVYSVQ7CisgICAgfQorCisgICAgaWYgKENvbXBvbmVudFBhcmFtZXRlclN0cnVjdHVyZSA9PSBOVUxMKSB7CisgICAgICAgIHJldCA9IE9NWF9FcnJvckJhZFBhcmFtZXRlcjsKKyAgICAgICAgZ290byBFWElUOworICAgIH0KKworICAgIHN3aXRjaCAobkluZGV4KSB7CisgICAgY2FzZSBPTVhfSW5kZXhQYXJhbVZpZGVvUG9ydEZvcm1hdDoKKyAgICB7CisgICAgICAgIE9NWF9WSURFT19QQVJBTV9QT1JURk9STUFUVFlQRSAqcG9ydEZvcm1hdCA9IChPTVhfVklERU9fUEFSQU1fUE9SVEZPUk1BVFRZUEUgKilDb21wb25lbnRQYXJhbWV0ZXJTdHJ1Y3R1cmU7CisgICAgICAgIE9NWF9VMzIgICAgICAgICAgICAgICAgICAgICAgICAgcG9ydEluZGV4ID0gcG9ydEZvcm1hdC0+blBvcnRJbmRleDsKKyAgICAgICAgT01YX1UzMiAgICAgICAgICAgICAgICAgICAgICAgICBpbmRleCAgICA9IHBvcnRGb3JtYXQtPm5JbmRleDsKKyAgICAgICAgU0VDX09NWF9CQVNFUE9SVCAgICAgICAgICAgICAgICpwU0VDUG9ydCA9IE5VTEw7CisgICAgICAgIE9NWF9QQVJBTV9QT1JUREVGSU5JVElPTlRZUEUgICAqcG9ydERlZmluaXRpb24gPSBOVUxMOworICAgICAgICBPTVhfVTMyICAgICAgICAgICAgICAgICAgICAgICAgIHN1cHBvcnRGb3JtYXROdW0gPSAwOworCisgICAgICAgIHJldCA9IFNFQ19PTVhfQ2hlY2tfU2l6ZVZlcnNpb24ocG9ydEZvcm1hdCwgc2l6ZW9mKE9NWF9WSURFT19QQVJBTV9QT1JURk9STUFUVFlQRSkpOworICAgICAgICBpZiAocmV0ICE9IE9NWF9FcnJvck5vbmUpIHsKKyAgICAgICAgICAgIGdvdG8gRVhJVDsKKyAgICAgICAgfQorCisgICAgICAgIGlmICgocG9ydEluZGV4ID49IHBTRUNDb21wb25lbnQtPnBvcnRQYXJhbS5uUG9ydHMpKSB7CisgICAgICAgICAgICByZXQgPSBPTVhfRXJyb3JCYWRQb3J0SW5kZXg7CisgICAgICAgICAgICBnb3RvIEVYSVQ7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBwU0VDUG9ydCA9ICZwU0VDQ29tcG9uZW50LT5wU0VDUG9ydFtwb3J0SW5kZXhdOworICAgICAgICAgICAgcG9ydERlZmluaXRpb24gPSAmcFNFQ1BvcnQtPnBvcnREZWZpbml0aW9uOworCisgICAgICAgICAgICBwb3J0RGVmaW5pdGlvbi0+Zm9ybWF0LnZpZGVvLmVDb2xvckZvcm1hdCAgICAgICA9IHBvcnRGb3JtYXQtPmVDb2xvckZvcm1hdDsKKyAgICAgICAgICAgIHBvcnREZWZpbml0aW9uLT5mb3JtYXQudmlkZW8uZUNvbXByZXNzaW9uRm9ybWF0ID0gcG9ydEZvcm1hdC0+ZUNvbXByZXNzaW9uRm9ybWF0OworICAgICAgICAgICAgcG9ydERlZmluaXRpb24tPmZvcm1hdC52aWRlby54RnJhbWVyYXRlICAgICAgICAgPSBwb3J0Rm9ybWF0LT54RnJhbWVyYXRlOworICAgICAgICB9CisgICAgfQorICAgICAgICBicmVhazsKKyNpZmRlZiBVU0VfQU5CCisgICAgY2FzZSBPTVhfSW5kZXhQYXJhbUVuYWJsZUFuZHJvaWRCdWZmZXJzOgorICAgIGNhc2UgT01YX0luZGV4UGFyYW1Vc2VBbmRyb2lkTmF0aXZlQnVmZmVyOgorICAgIHsKKyAgICAgICAgcmV0ID0gU0VDX09TQUxfU2V0QU5CUGFyYW1ldGVyKGhDb21wb25lbnQsIG5JbmRleCwgQ29tcG9uZW50UGFyYW1ldGVyU3RydWN0dXJlKTsKKyAgICB9CisgICAgICAgIGJyZWFrOworI2VuZGlmCisgICAgZGVmYXVsdDoKKyAgICB7CisgICAgICAgIHJldCA9IFNFQ19PTVhfU2V0UGFyYW1ldGVyKGhDb21wb25lbnQsIG5JbmRleCwgQ29tcG9uZW50UGFyYW1ldGVyU3RydWN0dXJlKTsKKyAgICB9CisgICAgICAgIGJyZWFrOworICAgIH0KKworRVhJVDoKKyAgICBGdW5jdGlvbk91dCgpOworCisgICAgcmV0dXJuIHJldDsKK30KKworT01YX0VSUk9SVFlQRSBTRUNfT01YX1ZpZGVvRGVjb2RlR2V0Q29uZmlnKAorICAgIE9NWF9IQU5ETEVUWVBFIGhDb21wb25lbnQsCisgICAgT01YX0lOREVYVFlQRSBuSW5kZXgsCisgICAgT01YX1BUUiBwQ29tcG9uZW50Q29uZmlnU3RydWN0dXJlKQoreworICAgIE9NWF9FUlJPUlRZUEUgICAgICAgICAgcmV0ID0gT01YX0Vycm9yTm9uZTsKKyAgICBPTVhfQ09NUE9ORU5UVFlQRSAgICAgKnBPTVhDb21wb25lbnQgPSBOVUxMOworICAgIFNFQ19PTVhfQkFTRUNPTVBPTkVOVCAqcFNFQ0NvbXBvbmVudCA9IE5VTEw7CisKKyAgICBGdW5jdGlvbkluKCk7CisKKyAgICBpZiAoaENvbXBvbmVudCA9PSBOVUxMKSB7CisgICAgICAgIHJldCA9IE9NWF9FcnJvckJhZFBhcmFtZXRlcjsKKyAgICAgICAgZ290byBFWElUOworICAgIH0KKyAgICBwT01YQ29tcG9uZW50ID0gKE9NWF9DT01QT05FTlRUWVBFICopaENvbXBvbmVudDsKKyAgICByZXQgPSBTRUNfT01YX0NoZWNrX1NpemVWZXJzaW9uKHBPTVhDb21wb25lbnQsIHNpemVvZihPTVhfQ09NUE9ORU5UVFlQRSkpOworICAgIGlmIChyZXQgIT0gT01YX0Vycm9yTm9uZSkgeworICAgICAgICBnb3RvIEVYSVQ7CisgICAgfQorCisgICAgaWYgKHBPTVhDb21wb25lbnQtPnBDb21wb25lbnRQcml2YXRlID09IE5VTEwpIHsKKyAgICAgICAgcmV0ID0gT01YX0Vycm9yQmFkUGFyYW1ldGVyOworICAgICAgICBnb3RvIEVYSVQ7CisgICAgfQorICAgIHBTRUNDb21wb25lbnQgPSAoU0VDX09NWF9CQVNFQ09NUE9ORU5UICopcE9NWENvbXBvbmVudC0+cENvbXBvbmVudFByaXZhdGU7CisKKyAgICBpZiAocENvbXBvbmVudENvbmZpZ1N0cnVjdHVyZSA9PSBOVUxMKSB7CisgICAgICAgIHJldCA9IE9NWF9FcnJvckJhZFBhcmFtZXRlcjsKKyAgICAgICAgZ290byBFWElUOworICAgIH0KKyAgICBpZiAocFNFQ0NvbXBvbmVudC0+Y3VycmVudFN0YXRlID09IE9NWF9TdGF0ZUludmFsaWQpIHsKKyAgICAgICAgcmV0ID0gT01YX0Vycm9ySW52YWxpZFN0YXRlOworICAgICAgICBnb3RvIEVYSVQ7CisgICAgfQorCisgICAgc3dpdGNoIChuSW5kZXgpIHsKKyAgICBkZWZhdWx0OgorICAgICAgICByZXQgPSBTRUNfT01YX0dldENvbmZpZyhoQ29tcG9uZW50LCBuSW5kZXgsIHBDb21wb25lbnRDb25maWdTdHJ1Y3R1cmUpOworICAgICAgICBicmVhazsKKyAgICB9CisKK0VYSVQ6CisgICAgRnVuY3Rpb25PdXQoKTsKKworICAgIHJldHVybiByZXQ7Cit9CisKK09NWF9FUlJPUlRZUEUgU0VDX09NWF9WaWRlb0RlY29kZVNldENvbmZpZygKKyAgICBPTVhfSEFORExFVFlQRSBoQ29tcG9uZW50LAorICAgIE9NWF9JTkRFWFRZUEUgbkluZGV4LAorICAgIE9NWF9QVFIgcENvbXBvbmVudENvbmZpZ1N0cnVjdHVyZSkKK3sKKyAgICBPTVhfRVJST1JUWVBFICAgICAgICAgICByZXQgPSBPTVhfRXJyb3JOb25lOworICAgIE9NWF9DT01QT05FTlRUWVBFICAgICAqcE9NWENvbXBvbmVudCA9IE5VTEw7CisgICAgU0VDX09NWF9CQVNFQ09NUE9ORU5UICpwU0VDQ29tcG9uZW50ID0gTlVMTDsKKworICAgIEZ1bmN0aW9uSW4oKTsKKworICAgIGlmIChoQ29tcG9uZW50ID09IE5VTEwpIHsKKyAgICAgICAgcmV0ID0gT01YX0Vycm9yQmFkUGFyYW1ldGVyOworICAgICAgICBnb3RvIEVYSVQ7CisgICAgfQorICAgIHBPTVhDb21wb25lbnQgPSAoT01YX0NPTVBPTkVOVFRZUEUgKiloQ29tcG9uZW50OworICAgIHJldCA9IFNFQ19PTVhfQ2hlY2tfU2l6ZVZlcnNpb24ocE9NWENvbXBvbmVudCwgc2l6ZW9mKE9NWF9DT01QT05FTlRUWVBFKSk7CisgICAgaWYgKHJldCAhPSBPTVhfRXJyb3JOb25lKSB7CisgICAgICAgIGdvdG8gRVhJVDsKKyAgICB9CisKKyAgICBpZiAocE9NWENvbXBvbmVudC0+cENvbXBvbmVudFByaXZhdGUgPT0gTlVMTCkgeworICAgICAgICByZXQgPSBPTVhfRXJyb3JCYWRQYXJhbWV0ZXI7CisgICAgICAgIGdvdG8gRVhJVDsKKyAgICB9CisgICAgcFNFQ0NvbXBvbmVudCA9IChTRUNfT01YX0JBU0VDT01QT05FTlQgKilwT01YQ29tcG9uZW50LT5wQ29tcG9uZW50UHJpdmF0ZTsKKworICAgIGlmIChwQ29tcG9uZW50Q29uZmlnU3RydWN0dXJlID09IE5VTEwpIHsKKyAgICAgICAgcmV0ID0gT01YX0Vycm9yQmFkUGFyYW1ldGVyOworICAgICAgICBnb3RvIEVYSVQ7CisgICAgfQorICAgIGlmIChwU0VDQ29tcG9uZW50LT5jdXJyZW50U3RhdGUgPT0gT01YX1N0YXRlSW52YWxpZCkgeworICAgICAgICByZXQgPSBPTVhfRXJyb3JJbnZhbGlkU3RhdGU7CisgICAgICAgIGdvdG8gRVhJVDsKKyAgICB9CisKKyAgICBzd2l0Y2ggKG5JbmRleCkgeworICAgIGNhc2UgT01YX0luZGV4VmVuZG9yVGh1bWJuYWlsTW9kZToKKyAgICB7CisgICAgICAgIFNFQ19PTVhfVklERU9ERUNfQ09NUE9ORU5UICpwVmlkZW9EZWMgPSAoU0VDX09NWF9WSURFT0RFQ19DT01QT05FTlQgKilwU0VDQ29tcG9uZW50LT5oQ29tcG9uZW50SGFuZGxlOworICAgICAgICBwVmlkZW9EZWMtPmJUaHVtYm5haWxNb2RlID0gKigoT01YX0JPT0wgKilwQ29tcG9uZW50Q29uZmlnU3RydWN0dXJlKTsKKworICAgICAgICByZXQgPSBPTVhfRXJyb3JOb25lOworICAgIH0KKyAgICAgICAgYnJlYWs7CisgICAgZGVmYXVsdDoKKyAgICAgICAgcmV0ID0gU0VDX09NWF9TZXRDb25maWcoaENvbXBvbmVudCwgbkluZGV4LCBwQ29tcG9uZW50Q29uZmlnU3RydWN0dXJlKTsKKyAgICAgICAgYnJlYWs7CisgICAgfQorCitFWElUOgorICAgIEZ1bmN0aW9uT3V0KCk7CisKKyAgICByZXR1cm4gcmV0OworfQorCitPTVhfRVJST1JUWVBFIFNFQ19PTVhfVmlkZW9EZWNvZGVHZXRFeHRlbnNpb25JbmRleCgKKyAgICBPTVhfSU4gT01YX0hBTkRMRVRZUEUgIGhDb21wb25lbnQsCisgICAgT01YX0lOIE9NWF9TVFJJTkcgICAgICBjUGFyYW1ldGVyTmFtZSwKKyAgICBPTVhfT1VUIE9NWF9JTkRFWFRZUEUgKnBJbmRleFR5cGUpCit7CisgICAgT01YX0VSUk9SVFlQRSAgICAgICAgICAgcmV0ID0gT01YX0Vycm9yTm9uZTsKKyAgICBPTVhfQ09NUE9ORU5UVFlQRSAgICAgKnBPTVhDb21wb25lbnQgPSBOVUxMOworICAgIFNFQ19PTVhfQkFTRUNPTVBPTkVOVCAqcFNFQ0NvbXBvbmVudCA9IE5VTEw7CisKKyAgICBGdW5jdGlvbkluKCk7CisKKyAgICBpZiAoaENvbXBvbmVudCA9PSBOVUxMKSB7CisgICAgICAgIHJldCA9IE9NWF9FcnJvckJhZFBhcmFtZXRlcjsKKyAgICAgICAgZ290byBFWElUOworICAgIH0KKyAgICBwT01YQ29tcG9uZW50ID0gKE9NWF9DT01QT05FTlRUWVBFICopaENvbXBvbmVudDsKKyAgICByZXQgPSBTRUNfT01YX0NoZWNrX1NpemVWZXJzaW9uKHBPTVhDb21wb25lbnQsIHNpemVvZihPTVhfQ09NUE9ORU5UVFlQRSkpOworICAgIGlmIChyZXQgIT0gT01YX0Vycm9yTm9uZSkgeworICAgICAgICBnb3RvIEVYSVQ7CisgICAgfQorCisgICAgaWYgKHBPTVhDb21wb25lbnQtPnBDb21wb25lbnRQcml2YXRlID09IE5VTEwpIHsKKyAgICAgICAgcmV0ID0gT01YX0Vycm9yQmFkUGFyYW1ldGVyOworICAgICAgICBnb3RvIEVYSVQ7CisgICAgfQorICAgIHBTRUNDb21wb25lbnQgPSAoU0VDX09NWF9CQVNFQ09NUE9ORU5UICopcE9NWENvbXBvbmVudC0+cENvbXBvbmVudFByaXZhdGU7CisKKyAgICBpZiAoKGNQYXJhbWV0ZXJOYW1lID09IE5VTEwpIHx8IChwSW5kZXhUeXBlID09IE5VTEwpKSB7CisgICAgICAgIHJldCA9IE9NWF9FcnJvckJhZFBhcmFtZXRlcjsKKyAgICAgICAgZ290byBFWElUOworICAgIH0KKyAgICBpZiAocFNFQ0NvbXBvbmVudC0+Y3VycmVudFN0YXRlID09IE9NWF9TdGF0ZUludmFsaWQpIHsKKyAgICAgICAgcmV0ID0gT01YX0Vycm9ySW52YWxpZFN0YXRlOworICAgICAgICBnb3RvIEVYSVQ7CisgICAgfQorCisjaWZkZWYgVVNFX0FOQgorICAgIGlmIChTRUNfT1NBTF9TdHJjbXAoY1BhcmFtZXRlck5hbWUsIFNFQ19JTkRFWF9QQVJBTV9FTkFCTEVfQU5CKSA9PSAwKQorICAgICAgICAqcEluZGV4VHlwZSA9IChPTVhfSU5ERVhUWVBFKSBPTVhfSW5kZXhQYXJhbUVuYWJsZUFuZHJvaWRCdWZmZXJzOworICAgIGVsc2UgaWYgKFNFQ19PU0FMX1N0cmNtcChjUGFyYW1ldGVyTmFtZSwgU0VDX0lOREVYX1BBUkFNX0dFVF9BTkIpID09IDApCisgICAgICAgICpwSW5kZXhUeXBlID0gKE9NWF9JTkRFWFRZUEUpIE9NWF9JbmRleFBhcmFtR2V0QW5kcm9pZE5hdGl2ZUJ1ZmZlcjsKKyAgICBlbHNlIGlmIChTRUNfT1NBTF9TdHJjbXAoY1BhcmFtZXRlck5hbWUsIFNFQ19JTkRFWF9QQVJBTV9VU0VfQU5CKSA9PSAwKQorICAgICAgICAqcEluZGV4VHlwZSA9IChPTVhfSU5ERVhUWVBFKSBPTVhfSW5kZXhQYXJhbVVzZUFuZHJvaWROYXRpdmVCdWZmZXI7CisgICAgZWxzZQorICAgICAgICByZXQgPSBTRUNfT01YX0dldEV4dGVuc2lvbkluZGV4KGhDb21wb25lbnQsIGNQYXJhbWV0ZXJOYW1lLCBwSW5kZXhUeXBlKTsKKyNlbHNlCisgICAgcmV0ID0gU0VDX09NWF9HZXRFeHRlbnNpb25JbmRleChoQ29tcG9uZW50LCBjUGFyYW1ldGVyTmFtZSwgcEluZGV4VHlwZSk7CisjZW5kaWYKKworRVhJVDoKKyAgICBGdW5jdGlvbk91dCgpOworCisgICAgcmV0dXJuIHJldDsKK30KKworT01YX0VSUk9SVFlQRSBTRUNfT01YX1ZpZGVvRGVjb2RlQ29tcG9uZW50SW5pdChPTVhfSU4gT01YX0hBTkRMRVRZUEUgaENvbXBvbmVudCkKK3sKKyAgICBPTVhfRVJST1JUWVBFICAgICAgICAgIHJldCA9IE9NWF9FcnJvck5vbmU7CisgICAgT01YX0NPTVBPTkVOVFRZUEUgICAgICpwT01YQ29tcG9uZW50ID0gTlVMTDsKKyAgICBTRUNfT01YX0JBU0VDT01QT05FTlQgKnBTRUNDb21wb25lbnQgPSBOVUxMOworICAgIFNFQ19PTVhfQkFTRVBPUlQgICAgICAqcFNFQ1BvcnQgPSBOVUxMOworICAgIFNFQ19PTVhfVklERU9ERUNfQ09NUE9ORU5UICpwVmlkZW9EZWMgPSBOVUxMOworCisgICAgRnVuY3Rpb25JbigpOworCisgICAgaWYgKGhDb21wb25lbnQgPT0gTlVMTCkgeworICAgICAgICByZXQgPSBPTVhfRXJyb3JCYWRQYXJhbWV0ZXI7CisgICAgICAgIGdvdG8gRVhJVDsKKyAgICB9CisgICAgcE9NWENvbXBvbmVudCA9IChPTVhfQ09NUE9ORU5UVFlQRSAqKWhDb21wb25lbnQ7CisgICAgcmV0ID0gU0VDX09NWF9DaGVja19TaXplVmVyc2lvbihwT01YQ29tcG9uZW50LCBzaXplb2YoT01YX0NPTVBPTkVOVFRZUEUpKTsKKyAgICBpZiAocmV0ICE9IE9NWF9FcnJvck5vbmUpIHsKKyAgICAgICAgU0VDX09TQUxfTG9nKFNFQ19MT0dfRVJST1IsICJPTVhfRXJyb3IsIExpbmU6JWQiLCBfX0xJTkVfXyk7CisgICAgICAgIGdvdG8gRVhJVDsKKyAgICB9CisKKyAgICByZXQgPSBTRUNfT01YX0Jhc2VDb21wb25lbnRfQ29uc3RydWN0b3IocE9NWENvbXBvbmVudCk7CisgICAgaWYgKHJldCAhPSBPTVhfRXJyb3JOb25lKSB7CisgICAgICAgIFNFQ19PU0FMX0xvZyhTRUNfTE9HX0VSUk9SLCAiT01YX0Vycm9yLCBMaW5lOiVkIiwgX19MSU5FX18pOworICAgICAgICBnb3RvIEVYSVQ7CisgICAgfQorCisgICAgcmV0ID0gU0VDX09NWF9Qb3J0X0NvbnN0cnVjdG9yKHBPTVhDb21wb25lbnQpOworICAgIGlmIChyZXQgIT0gT01YX0Vycm9yTm9uZSkgeworICAgICAgICBTRUNfT01YX0Jhc2VDb21wb25lbnRfRGVzdHJ1Y3RvcihwT01YQ29tcG9uZW50KTsKKyAgICAgICAgU0VDX09TQUxfTG9nKFNFQ19MT0dfRVJST1IsICJPTVhfRXJyb3IsIExpbmU6JWQiLCBfX0xJTkVfXyk7CisgICAgICAgIGdvdG8gRVhJVDsKKyAgICB9CisKKyAgICBwU0VDQ29tcG9uZW50ID0gKFNFQ19PTVhfQkFTRUNPTVBPTkVOVCAqKXBPTVhDb21wb25lbnQtPnBDb21wb25lbnRQcml2YXRlOworCisgICAgcFZpZGVvRGVjID0gU0VDX09TQUxfTWFsbG9jKHNpemVvZihTRUNfT01YX1ZJREVPREVDX0NPTVBPTkVOVCkpOworICAgIGlmIChwVmlkZW9EZWMgPT0gTlVMTCkgeworICAgICAgICBTRUNfT01YX0Jhc2VDb21wb25lbnRfRGVzdHJ1Y3RvcihwT01YQ29tcG9uZW50KTsKKyAgICAgICAgcmV0ID0gT01YX0Vycm9ySW5zdWZmaWNpZW50UmVzb3VyY2VzOworICAgICAgICBTRUNfT1NBTF9Mb2coU0VDX0xPR19FUlJPUiwgIk9NWF9FcnJvckluc3VmZmljaWVudFJlc291cmNlcywgTGluZTolZCIsIF9fTElORV9fKTsKKyAgICAgICAgZ290byBFWElUOworICAgIH0KKworICAgIFNFQ19PU0FMX01lbXNldChwVmlkZW9EZWMsIDAsIHNpemVvZihTRUNfT01YX1ZJREVPREVDX0NPTVBPTkVOVCkpOworICAgIHBTRUNDb21wb25lbnQtPmhDb21wb25lbnRIYW5kbGUgPSAoT01YX0hBTkRMRVRZUEUpcFZpZGVvRGVjOworCisgICAgcFNFQ0NvbXBvbmVudC0+YlNhdmVGbGFnRU9TID0gT01YX0ZBTFNFOworCisgICAgLyogSW5wdXQgcG9ydCAqLworICAgIHBTRUNQb3J0ID0gJnBTRUNDb21wb25lbnQtPnBTRUNQb3J0W0lOUFVUX1BPUlRfSU5ERVhdOworICAgIHBTRUNQb3J0LT5wb3J0RGVmaW5pdGlvbi5uQnVmZmVyQ291bnRBY3R1YWwgPSBNQVhfVklERU9fSU5QVVRCVUZGRVJfTlVNOworICAgIHBTRUNQb3J0LT5wb3J0RGVmaW5pdGlvbi5uQnVmZmVyQ291bnRNaW4gPSBNQVhfVklERU9fSU5QVVRCVUZGRVJfTlVNOworICAgIHBTRUNQb3J0LT5wb3J0RGVmaW5pdGlvbi5uQnVmZmVyU2l6ZSA9IDA7CisgICAgcFNFQ1BvcnQtPnBvcnREZWZpbml0aW9uLmVEb21haW4gPSBPTVhfUG9ydERvbWFpblZpZGVvOworCisgICAgcFNFQ1BvcnQtPnBvcnREZWZpbml0aW9uLmZvcm1hdC52aWRlby5jTUlNRVR5cGUgPSBTRUNfT1NBTF9NYWxsb2MoTUFYX09NWF9NSU1FVFlQRV9TSVpFKTsKKyAgICBTRUNfT1NBTF9TdHJjcHkocFNFQ1BvcnQtPnBvcnREZWZpbml0aW9uLmZvcm1hdC52aWRlby5jTUlNRVR5cGUsICJyYXcvdmlkZW8iKTsKKyAgICBwU0VDUG9ydC0+cG9ydERlZmluaXRpb24uZm9ybWF0LnZpZGVvLnBOYXRpdmVSZW5kZXIgPSAwOworICAgIHBTRUNQb3J0LT5wb3J0RGVmaW5pdGlvbi5mb3JtYXQudmlkZW8uYkZsYWdFcnJvckNvbmNlYWxtZW50ID0gT01YX0ZBTFNFOworICAgIHBTRUNQb3J0LT5wb3J0RGVmaW5pdGlvbi5mb3JtYXQudmlkZW8uZUNvbXByZXNzaW9uRm9ybWF0ID0gT01YX1ZJREVPX0NvZGluZ1VudXNlZDsKKworICAgIHBTRUNQb3J0LT5wb3J0RGVmaW5pdGlvbi5mb3JtYXQudmlkZW8ubkZyYW1lV2lkdGggPSAwOworICAgIHBTRUNQb3J0LT5wb3J0RGVmaW5pdGlvbi5mb3JtYXQudmlkZW8ubkZyYW1lSGVpZ2h0PSAwOworICAgIHBTRUNQb3J0LT5wb3J0RGVmaW5pdGlvbi5mb3JtYXQudmlkZW8ublN0cmlkZSA9IDA7CisgICAgcFNFQ1BvcnQtPnBvcnREZWZpbml0aW9uLmZvcm1hdC52aWRlby5uU2xpY2VIZWlnaHQgPSAwOworICAgIHBTRUNQb3J0LT5wb3J0RGVmaW5pdGlvbi5mb3JtYXQudmlkZW8ubkJpdHJhdGUgPSA2NDAwMDsKKyAgICBwU0VDUG9ydC0+cG9ydERlZmluaXRpb24uZm9ybWF0LnZpZGVvLnhGcmFtZXJhdGUgPSAoMTUgPDwgMTYpOworICAgIHBTRUNQb3J0LT5wb3J0RGVmaW5pdGlvbi5mb3JtYXQudmlkZW8uZUNvbG9yRm9ybWF0ID0gT01YX0NPTE9SX0Zvcm1hdFVudXNlZDsKKyAgICBwU0VDUG9ydC0+cG9ydERlZmluaXRpb24uZm9ybWF0LnZpZGVvLnBOYXRpdmVXaW5kb3cgPSBOVUxMOworCisgICAgLyogT3V0cHV0IHBvcnQgKi8KKyAgICBwU0VDUG9ydCA9ICZwU0VDQ29tcG9uZW50LT5wU0VDUG9ydFtPVVRQVVRfUE9SVF9JTkRFWF07CisgICAgcFNFQ1BvcnQtPnBvcnREZWZpbml0aW9uLm5CdWZmZXJDb3VudEFjdHVhbCA9IE1BWF9WSURFT19PVVRQVVRCVUZGRVJfTlVNOworICAgIHBTRUNQb3J0LT5wb3J0RGVmaW5pdGlvbi5uQnVmZmVyQ291bnRNaW4gPSBNQVhfVklERU9fT1VUUFVUQlVGRkVSX05VTTsKKyAgICBwU0VDUG9ydC0+cG9ydERlZmluaXRpb24ubkJ1ZmZlclNpemUgPSBERUZBVUxUX1ZJREVPX09VVFBVVF9CVUZGRVJfU0laRTsKKyAgICBwU0VDUG9ydC0+cG9ydERlZmluaXRpb24uZURvbWFpbiA9IE9NWF9Qb3J0RG9tYWluVmlkZW87CisKKyAgICBwU0VDUG9ydC0+cG9ydERlZmluaXRpb24uZm9ybWF0LnZpZGVvLmNNSU1FVHlwZSA9IFNFQ19PU0FMX01hbGxvYyhNQVhfT01YX01JTUVUWVBFX1NJWkUpOworICAgIFNFQ19PU0FMX1N0cmNweShwU0VDUG9ydC0+cG9ydERlZmluaXRpb24uZm9ybWF0LnZpZGVvLmNNSU1FVHlwZSwgInJhdy92aWRlbyIpOworICAgIHBTRUNQb3J0LT5wb3J0RGVmaW5pdGlvbi5mb3JtYXQudmlkZW8ucE5hdGl2ZVJlbmRlciA9IDA7CisgICAgcFNFQ1BvcnQtPnBvcnREZWZpbml0aW9uLmZvcm1hdC52aWRlby5iRmxhZ0Vycm9yQ29uY2VhbG1lbnQgPSBPTVhfRkFMU0U7CisgICAgcFNFQ1BvcnQtPnBvcnREZWZpbml0aW9uLmZvcm1hdC52aWRlby5lQ29tcHJlc3Npb25Gb3JtYXQgPSBPTVhfVklERU9fQ29kaW5nVW51c2VkOworCisgICAgcFNFQ1BvcnQtPnBvcnREZWZpbml0aW9uLmZvcm1hdC52aWRlby5uRnJhbWVXaWR0aCA9IDA7CisgICAgcFNFQ1BvcnQtPnBvcnREZWZpbml0aW9uLmZvcm1hdC52aWRlby5uRnJhbWVIZWlnaHQ9IDA7CisgICAgcFNFQ1BvcnQtPnBvcnREZWZpbml0aW9uLmZvcm1hdC52aWRlby5uU3RyaWRlID0gMDsKKyAgICBwU0VDUG9ydC0+cG9ydERlZmluaXRpb24uZm9ybWF0LnZpZGVvLm5TbGljZUhlaWdodCA9IDA7CisgICAgcFNFQ1BvcnQtPnBvcnREZWZpbml0aW9uLmZvcm1hdC52aWRlby5uQml0cmF0ZSA9IDY0MDAwOworICAgIHBTRUNQb3J0LT5wb3J0RGVmaW5pdGlvbi5mb3JtYXQudmlkZW8ueEZyYW1lcmF0ZSA9ICgxNSA8PCAxNik7CisgICAgcFNFQ1BvcnQtPnBvcnREZWZpbml0aW9uLmZvcm1hdC52aWRlby5lQ29sb3JGb3JtYXQgPSBPTVhfQ09MT1JfRm9ybWF0VW51c2VkOworICAgIHBTRUNQb3J0LT5wb3J0RGVmaW5pdGlvbi5mb3JtYXQudmlkZW8ucE5hdGl2ZVdpbmRvdyA9IE5VTEw7CisKKyAgICBwT01YQ29tcG9uZW50LT5Vc2VCdWZmZXIgICAgICAgICAgICAgID0gJlNFQ19PTVhfVXNlQnVmZmVyOworICAgIHBPTVhDb21wb25lbnQtPkFsbG9jYXRlQnVmZmVyICAgICAgICAgPSAmU0VDX09NWF9BbGxvY2F0ZUJ1ZmZlcjsKKyAgICBwT01YQ29tcG9uZW50LT5GcmVlQnVmZmVyICAgICAgICAgICAgID0gJlNFQ19PTVhfRnJlZUJ1ZmZlcjsKKyAgICBwT01YQ29tcG9uZW50LT5Db21wb25lbnRUdW5uZWxSZXF1ZXN0ID0gJlNFQ19PTVhfQ29tcG9uZW50VHVubmVsUmVxdWVzdDsKKworICAgIHBTRUNDb21wb25lbnQtPnNlY19BbGxvY2F0ZVR1bm5lbEJ1ZmZlciA9ICZTRUNfT01YX0FsbG9jYXRlVHVubmVsQnVmZmVyOworICAgIHBTRUNDb21wb25lbnQtPnNlY19GcmVlVHVubmVsQnVmZmVyICAgICA9ICZTRUNfT01YX0ZyZWVUdW5uZWxCdWZmZXI7CisgICAgcFNFQ0NvbXBvbmVudC0+c2VjX0J1ZmZlclByb2Nlc3MgICAgICAgID0gJlNFQ19PTVhfQnVmZmVyUHJvY2VzczsKKyAgICBwU0VDQ29tcG9uZW50LT5zZWNfQnVmZmVyUmVzZXQgICAgICAgICAgPSAmU0VDX0J1ZmZlclJlc2V0OworICAgIHBTRUNDb21wb25lbnQtPnNlY19JbnB1dEJ1ZmZlclJldHVybiAgICA9ICZTRUNfSW5wdXRCdWZmZXJSZXR1cm47CisgICAgcFNFQ0NvbXBvbmVudC0+c2VjX091dHB1dEJ1ZmZlclJldHVybiAgID0gJlNFQ19PdXRwdXRCdWZmZXJSZXR1cm47CisKK0VYSVQ6CisgICAgRnVuY3Rpb25PdXQoKTsKKworICAgIHJldHVybiByZXQ7Cit9CisKK09NWF9FUlJPUlRZUEUgU0VDX09NWF9WaWRlb0RlY29kZUNvbXBvbmVudERlaW5pdChPTVhfSU4gT01YX0hBTkRMRVRZUEUgaENvbXBvbmVudCkKK3sKKyAgICBPTVhfRVJST1JUWVBFICAgICAgICAgIHJldCA9IE9NWF9FcnJvck5vbmU7CisgICAgT01YX0NPTVBPTkVOVFRZUEUgICAgICpwT01YQ29tcG9uZW50ID0gTlVMTDsKKyAgICBTRUNfT01YX0JBU0VDT01QT05FTlQgKnBTRUNDb21wb25lbnQgPSBOVUxMOworICAgIFNFQ19PTVhfQkFTRVBPUlQgICAgICAqcFNFQ1BvcnQgPSBOVUxMOworICAgIFNFQ19PTVhfVklERU9ERUNfQ09NUE9ORU5UICpwVmlkZW9EZWMgPSBOVUxMOworICAgIGludCAgICAgICAgICAgICAgICAgICAgaSA9IDA7CisKKyAgICBGdW5jdGlvbkluKCk7CisKKyAgICBpZiAoaENvbXBvbmVudCA9PSBOVUxMKSB7CisgICAgICAgIHJldCA9IE9NWF9FcnJvckJhZFBhcmFtZXRlcjsKKyAgICAgICAgZ290byBFWElUOworICAgIH0KKyAgICBwT01YQ29tcG9uZW50ID0gKE9NWF9DT01QT05FTlRUWVBFICopaENvbXBvbmVudDsKKyAgICByZXQgPSBTRUNfT01YX0NoZWNrX1NpemVWZXJzaW9uKHBPTVhDb21wb25lbnQsIHNpemVvZihPTVhfQ09NUE9ORU5UVFlQRSkpOworICAgIGlmIChyZXQgIT0gT01YX0Vycm9yTm9uZSkgeworICAgICAgICBnb3RvIEVYSVQ7CisgICAgfQorCisgICAgaWYgKHBPTVhDb21wb25lbnQtPnBDb21wb25lbnRQcml2YXRlID09IE5VTEwpIHsKKyAgICAgICAgcmV0ID0gT01YX0Vycm9yQmFkUGFyYW1ldGVyOworICAgICAgICBnb3RvIEVYSVQ7CisgICAgfQorICAgIHBTRUNDb21wb25lbnQgPSAoU0VDX09NWF9CQVNFQ09NUE9ORU5UICopcE9NWENvbXBvbmVudC0+cENvbXBvbmVudFByaXZhdGU7CisKKyAgICBwVmlkZW9EZWMgPSAoU0VDX09NWF9WSURFT0RFQ19DT01QT05FTlQgKilwU0VDQ29tcG9uZW50LT5oQ29tcG9uZW50SGFuZGxlOworICAgIFNFQ19PU0FMX0ZyZWUocFZpZGVvRGVjKTsKKyAgICBwU0VDQ29tcG9uZW50LT5oQ29tcG9uZW50SGFuZGxlID0gcFZpZGVvRGVjID0gTlVMTDsKKworICAgIGZvcihpID0gMDsgaSA8IEFMTF9QT1JUX05VTTsgaSsrKSB7CisgICAgICAgIHBTRUNQb3J0ID0gJnBTRUNDb21wb25lbnQtPnBTRUNQb3J0W2ldOworICAgICAgICBTRUNfT1NBTF9GcmVlKHBTRUNQb3J0LT5wb3J0RGVmaW5pdGlvbi5mb3JtYXQudmlkZW8uY01JTUVUeXBlKTsKKyAgICAgICAgcFNFQ1BvcnQtPnBvcnREZWZpbml0aW9uLmZvcm1hdC52aWRlby5jTUlNRVR5cGUgPSBOVUxMOworICAgIH0KKworICAgIHJldCA9IFNFQ19PTVhfUG9ydF9EZXN0cnVjdG9yKHBPTVhDb21wb25lbnQpOworCisgICAgcmV0ID0gU0VDX09NWF9CYXNlQ29tcG9uZW50X0Rlc3RydWN0b3IoaENvbXBvbmVudCk7CisKK0VYSVQ6CisgICAgRnVuY3Rpb25PdXQoKTsKKworICAgIHJldHVybiByZXQ7Cit9CmRpZmYgLS1naXQgYS9leHlub3M0L211bHRpbWVkaWEvb3Blbm1heC9zZWNfb214L2NvbXBvbmVudC92aWRlby9kZWMvU0VDX09NWF9WZGVjLmggYi9leHlub3M0L211bHRpbWVkaWEvb3Blbm1heC9zZWNfb214L2NvbXBvbmVudC92aWRlby9kZWMvU0VDX09NWF9WZGVjLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDNiYmRmNAotLS0gL2Rldi9udWxsCisrKyBiL2V4eW5vczQvbXVsdGltZWRpYS9vcGVubWF4L3NlY19vbXgvY29tcG9uZW50L3ZpZGVvL2RlYy9TRUNfT01YX1ZkZWMuaApAQCAtMCwwICsxLDE2MCBAQAorLyoKKyAqCisgKiBDb3B5cmlnaHQgMjAxMCBTYW1zdW5nIEVsZWN0cm9uaWNzIFMuTFNJIENvLiBMVEQKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworLyoKKyAqIEBmaWxlICAgICAgICBTRUNfT01YX1ZkZWMuaAorICogQGJyaWVmCisgKiBAYXV0aG9yICAgICAgU2V1bmdCZW9tIEtpbSAoc2JjcnV4LmtpbUBzYW1zdW5nLmNvbSkKKyAqICAgICAgICAgICAgICBIeWVZZW9uIENodW5nIChoeWVvbi5jaHVuZ0BzYW1zdW5nLmNvbSkKKyAqICAgICAgICAgICAgICBZdW5qaSBLaW0gKHl1bmppLmtpbUBzYW1zdW5nLmNvbSkKKyAqIEB2ZXJzaW9uICAgICAxLjEuMAorICogQGhpc3RvcnkKKyAqICAgMjAxMC43LjE1IDogQ3JlYXRlCisgKi8KKworI2lmbmRlZiBTRUNfT01YX1ZJREVPX0RFQ09ERQorI2RlZmluZSBTRUNfT01YX1ZJREVPX0RFQ09ERQorCisjaW5jbHVkZSAiT01YX0NvbXBvbmVudC5oIgorI2luY2x1ZGUgIlNFQ19PTVhfRGVmLmgiCisjaW5jbHVkZSAiU0VDX09TQUxfUXVldWUuaCIKKyNpbmNsdWRlICJTRUNfT01YX0Jhc2Vwb3J0LmgiCisjaW5jbHVkZSAiU0VDX09NWF9CYXNlY29tcG9uZW50LmgiCisKKyNkZWZpbmUgTUFYX1ZJREVPX0lOUFVUQlVGRkVSX05VTSAgICA1CisjZGVmaW5lIE1BWF9WSURFT19PVVRQVVRCVUZGRVJfTlVNICAgMgorCisjZGVmaW5lIERFRkFVTFRfRlJBTUVfV0lEVEggICAgICAgICAgMTc2CisjZGVmaW5lIERFRkFVTFRfRlJBTUVfSEVJR0hUICAgICAgICAgMTQ0CisKKyNkZWZpbmUgREVGQVVMVF9WSURFT19JTlBVVF9CVUZGRVJfU0laRSAgICAoREVGQVVMVF9GUkFNRV9XSURUSCAqIERFRkFVTFRfRlJBTUVfSEVJR0hUKSAqIDIKKyNkZWZpbmUgREVGQVVMVF9WSURFT19PVVRQVVRfQlVGRkVSX1NJWkUgICAoREVGQVVMVF9GUkFNRV9XSURUSCAqIERFRkFVTFRfRlJBTUVfSEVJR0hUICogMykgLyAyCisKKyNkZWZpbmUgTUZDX0lOUFVUX0JVRkZFUl9OVU1fTUFYICAgICAgICAgICAgMgorI2RlZmluZSBERUZBVUxUX01GQ19JTlBVVF9CVUZGRVJfU0laRSAgICAxMDI0ICogMTAyNCAqIE1GQ19JTlBVVF9CVUZGRVJfTlVNX01BWCAgICAvKkRFRkFVTFRfVklERU9fSU5QVVRfQlVGRkVSX1NJWkUqLworCisjZGVmaW5lIElOUFVUX1BPUlRfU1VQUE9SVEZPUk1BVF9OVU1fTUFYICAgIDEKKyNkZWZpbmUgT1VUUFVUX1BPUlRfU1VQUE9SVEZPUk1BVF9OVU1fTUFYICAgNAorCit0eXBlZGVmIHN0cnVjdAoreworICAgIHZvaWQgKnBBZGRyWTsKKyAgICB2b2lkICpwQWRkckM7Cit9IE1GQ19ERUNfQUREUl9JTkZPOworCit0eXBlZGVmIHN0cnVjdCBfU0VDX01GQ19OQkRFQ19USFJFQUQKK3sKKyAgICBPTVhfSEFORExFVFlQRSAgaE5CRGVjb2RlVGhyZWFkOworICAgIE9NWF9IQU5ETEVUWVBFICBoRGVjRnJhbWVTdGFydDsKKyAgICBPTVhfSEFORExFVFlQRSAgaERlY0ZyYW1lRW5kOworICAgIE9NWF9CT09MICAgICAgICBiRXhpdERlY29kZVRocmVhZDsKKyAgICBPTVhfQk9PTCAgICAgICAgYkRlY29kZXJSdW47CisKKyAgICBPTVhfVTMyICAgICAgICAgb25lRnJhbWVTaXplOworfSBTRUNfTUZDX05CREVDX1RIUkVBRDsKKwordHlwZWRlZiBzdHJ1Y3QgX01GQ19ERUNfSU5QVVRfQlVGRkVSCit7CisgICAgdm9pZCAqUGh5QWRkcjsgICAgICAvLyBwaHlzaWNhbCBhZGRyZXNzCisgICAgdm9pZCAqVmlyQWRkcjsgICAgICAvLyB2aXJ0dWFsIGFkZHJlc3MKKyAgICBpbnQgICBidWZmZXJTaXplOyAgIC8vIGlucHV0IGJ1ZmZlciBhbGxvYyBzaXplCisgICAgaW50ICAgZGF0YVNpemU7ICAgICAvLyBEYXRhIGxlbmd0aAorfSBNRkNfREVDX0lOUFVUX0JVRkZFUjsKKwordHlwZWRlZiBzdHJ1Y3QgX1NFQ19PTVhfVklERU9ERUNfQ09NUE9ORU5UCit7CisgICAgT01YX0hBTkRMRVRZUEUgaENvZGVjSGFuZGxlOworICAgIFNFQ19NRkNfTkJERUNfVEhSRUFEIE5CRGVjVGhyZWFkOworCisgICAgT01YX0JPT0wgYlRodW1ibmFpbE1vZGU7CisgICAgT01YX0JPT0wgYkZpcnN0RnJhbWU7CisgICAgTUZDX0RFQ19JTlBVVF9CVUZGRVIgTUZDRGVjSW5wdXRCdWZmZXJbTUZDX0lOUFVUX0JVRkZFUl9OVU1fTUFYXTsKKyAgICBPTVhfVTMyICBpbmRleElucHV0QnVmZmVyOworCisgICAgLyogQ1NDIGhhbmRsZSAqLworICAgIE9NWF9QVFIgY3NjX2hhbmRsZTsKKyAgICBPTVhfVTMyIGNzY19zZXRfZm9ybWF0OworCisgICAgLyogRm9yIERSTSBQbGF5ICovCisgICAgT01YX0JPT0wgYkRSTVBsYXllck1vZGU7Cit9IFNFQ19PTVhfVklERU9ERUNfQ09NUE9ORU5UOworCisKKyNpZmRlZiBfX2NwbHVzcGx1cworZXh0ZXJuICJDIiB7CisjZW5kaWYKKworT01YX0VSUk9SVFlQRSBTRUNfT01YX1VzZUJ1ZmZlcigKKyAgICBPTVhfSU4gT01YX0hBTkRMRVRZUEUgICAgICAgICAgICBoQ29tcG9uZW50LAorICAgIE9NWF9JTk9VVCBPTVhfQlVGRkVSSEVBREVSVFlQRSAqKnBwQnVmZmVySGRyLAorICAgIE9NWF9JTiBPTVhfVTMyICAgICAgICAgICAgICAgICAgIG5Qb3J0SW5kZXgsCisgICAgT01YX0lOIE9NWF9QVFIgICAgICAgICAgICAgICAgICAgcEFwcFByaXZhdGUsCisgICAgT01YX0lOIE9NWF9VMzIgICAgICAgICAgICAgICAgICAgblNpemVCeXRlcywKKyAgICBPTVhfSU4gT01YX1U4ICAgICAgICAgICAgICAgICAgICpwQnVmZmVyKTsKK09NWF9FUlJPUlRZUEUgU0VDX09NWF9BbGxvY2F0ZUJ1ZmZlcigKKyAgICBPTVhfSU4gT01YX0hBTkRMRVRZUEUgICAgICAgICAgICBoQ29tcG9uZW50LAorICAgIE9NWF9JTk9VVCBPTVhfQlVGRkVSSEVBREVSVFlQRSAqKnBwQnVmZmVyLAorICAgIE9NWF9JTiBPTVhfVTMyICAgICAgICAgICAgICAgICAgIG5Qb3J0SW5kZXgsCisgICAgT01YX0lOIE9NWF9QVFIgICAgICAgICAgICAgICAgICAgcEFwcFByaXZhdGUsCisgICAgT01YX0lOIE9NWF9VMzIgICAgICAgICAgICAgICAgICAgblNpemVCeXRlcyk7CitPTVhfRVJST1JUWVBFIFNFQ19PTVhfRnJlZUJ1ZmZlcigKKyAgICBPTVhfSU4gT01YX0hBTkRMRVRZUEUgaENvbXBvbmVudCwKKyAgICBPTVhfSU4gT01YX1UzMiAgICAgICAgblBvcnRJbmRleCwKKyAgICBPTVhfSU4gT01YX0JVRkZFUkhFQURFUlRZUEUgKnBCdWZmZXJIZHIpOworT01YX0VSUk9SVFlQRSBTRUNfT01YX0FsbG9jYXRlVHVubmVsQnVmZmVyKAorICAgIFNFQ19PTVhfQkFTRVBPUlQgKnBPTVhCYXNlUG9ydCwKKyAgICBPTVhfVTMyICAgICAgICAgICBuUG9ydEluZGV4KTsKK09NWF9FUlJPUlRZUEUgU0VDX09NWF9GcmVlVHVubmVsQnVmZmVyKAorICAgIFNFQ19PTVhfQkFTRVBPUlQgKnBPTVhCYXNlUG9ydCwKKyAgICBPTVhfVTMyICAgICAgICAgICBuUG9ydEluZGV4KTsKK09NWF9FUlJPUlRZUEUgU0VDX09NWF9Db21wb25lbnRUdW5uZWxSZXF1ZXN0KAorICAgIE9NWF9JTiAgT01YX0hBTkRMRVRZUEUgaENvbXAsCisgICAgT01YX0lOIE9NWF9VMzIgICAgICAgICBuUG9ydCwKKyAgICBPTVhfSU4gT01YX0hBTkRMRVRZUEUgIGhUdW5uZWxlZENvbXAsCisgICAgT01YX0lOIE9NWF9VMzIgICAgICAgICBuVHVubmVsZWRQb3J0LAorICAgIE9NWF9JTk9VVCBPTVhfVFVOTkVMU0VUVVBUWVBFICpwVHVubmVsU2V0dXApOworT01YX0VSUk9SVFlQRSBTRUNfT01YX0J1ZmZlclByb2Nlc3MoT01YX0hBTkRMRVRZUEUgaENvbXBvbmVudCk7CitPTVhfRVJST1JUWVBFIFNFQ19PTVhfVmlkZW9EZWNvZGVHZXRQYXJhbWV0ZXIoCisgICAgT01YX0lOIE9NWF9IQU5ETEVUWVBFIGhDb21wb25lbnQsCisgICAgT01YX0lOIE9NWF9JTkRFWFRZUEUgIG5QYXJhbUluZGV4LAorICAgIE9NWF9JTk9VVCBPTVhfUFRSICAgICBDb21wb25lbnRQYXJhbWV0ZXJTdHJ1Y3R1cmUpOworT01YX0VSUk9SVFlQRSBTRUNfT01YX1ZpZGVvRGVjb2RlU2V0UGFyYW1ldGVyKAorICAgIE9NWF9JTiBPTVhfSEFORExFVFlQRSBoQ29tcG9uZW50LAorICAgIE9NWF9JTiBPTVhfSU5ERVhUWVBFICBuSW5kZXgsCisgICAgT01YX0lOIE9NWF9QVFIgICAgICAgIENvbXBvbmVudFBhcmFtZXRlclN0cnVjdHVyZSk7CitPTVhfRVJST1JUWVBFIFNFQ19PTVhfVmlkZW9EZWNvZGVHZXRDb25maWcoCisgICAgT01YX0hBTkRMRVRZUEUgaENvbXBvbmVudCwKKyAgICBPTVhfSU5ERVhUWVBFIG5JbmRleCwKKyAgICBPTVhfUFRSIHBDb21wb25lbnRDb25maWdTdHJ1Y3R1cmUpOworT01YX0VSUk9SVFlQRSBTRUNfT01YX1ZpZGVvRGVjb2RlU2V0Q29uZmlnKAorICAgIE9NWF9IQU5ETEVUWVBFIGhDb21wb25lbnQsCisgICAgT01YX0lOREVYVFlQRSBuSW5kZXgsCisgICAgT01YX1BUUiBwQ29tcG9uZW50Q29uZmlnU3RydWN0dXJlKTsKK09NWF9FUlJPUlRZUEUgU0VDX09NWF9WaWRlb0RlY29kZUdldEV4dGVuc2lvbkluZGV4KAorICAgIE9NWF9JTiBPTVhfSEFORExFVFlQRSAgaENvbXBvbmVudCwKKyAgICBPTVhfSU4gT01YX1NUUklORyAgICAgIGNQYXJhbWV0ZXJOYW1lLAorICAgIE9NWF9PVVQgT01YX0lOREVYVFlQRSAqcEluZGV4VHlwZSk7CitPTVhfRVJST1JUWVBFIFNFQ19PTVhfVmlkZW9EZWNvZGVDb21wb25lbnRJbml0KE9NWF9JTiBPTVhfSEFORExFVFlQRSBoQ29tcG9uZW50KTsKK09NWF9FUlJPUlRZUEUgU0VDX09NWF9WaWRlb0RlY29kZUNvbXBvbmVudERlaW5pdChPTVhfSU4gT01YX0hBTkRMRVRZUEUgaENvbXBvbmVudCk7CitPTVhfQk9PTCBTRUNfQ2hlY2tfQnVmZmVyUHJvY2Vzc19TdGF0ZShTRUNfT01YX0JBU0VDT01QT05FTlQgKnBTRUNDb21wb25lbnQpOworaW5saW5lIHZvaWQgU0VDX1VwZGF0ZUZyYW1lU2l6ZShPTVhfQ09NUE9ORU5UVFlQRSAqcE9NWENvbXBvbmVudCk7CisKKyNpZmRlZiBfX2NwbHVzcGx1cworfQorI2VuZGlmCisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvZXh5bm9zNC9tdWx0aW1lZGlhL29wZW5tYXgvc2VjX29teC9jb21wb25lbnQvdmlkZW8vZGVjL2gyNjQvQW5kcm9pZC5tayBiL2V4eW5vczQvbXVsdGltZWRpYS9vcGVubWF4L3NlY19vbXgvY29tcG9uZW50L3ZpZGVvL2RlYy9oMjY0L0FuZHJvaWQubWsKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZGE1ODgwZQotLS0gL2Rldi9udWxsCisrKyBiL2V4eW5vczQvbXVsdGltZWRpYS9vcGVubWF4L3NlY19vbXgvY29tcG9uZW50L3ZpZGVvL2RlYy9oMjY0L0FuZHJvaWQubWsKQEAgLTAsMCArMSw4NCBAQAorTE9DQUxfUEFUSCA6PSAkKGNhbGwgbXktZGlyKQoraW5jbHVkZSAkKENMRUFSX1ZBUlMpCisKK0xPQ0FMX01PRFVMRV9UQUdTIDo9IG9wdGlvbmFsCisKK0xPQ0FMX1NSQ19GSUxFUyA6PSBcCisJU0VDX09NWF9IMjY0ZGVjLmMgXAorCWxpYnJhcnlfcmVnaXN0ZXIuYworCitMT0NBTF9QUkVMSU5LX01PRFVMRSA6PSBmYWxzZQorTE9DQUxfTU9EVUxFIDo9IGxpYk9NWC5TRUMuQVZDLkRlY29kZXIKK0xPQ0FMX01PRFVMRV9QQVRIIDo9ICQoVEFSR0VUX09VVF9TSEFSRURfTElCUkFSSUVTKS9vbXgKKworTE9DQUxfQ0ZMQUdTIDo9CisKK2lmZXEgKCQoQk9BUkRfTk9OQkxPQ0tfTU9ERV9QUk9DRVNTKSwgdHJ1ZSkKK0xPQ0FMX0NGTEFHUyArPSAtRE5PTkJMT0NLX01PREVfUFJPQ0VTUworZW5kaWYKKworaWZlcSAoJChCT0FSRF9VU0VfRFJNKSwgdHJ1ZSkKK0xPQ0FMX0NGTEFHUyArPSAtRFVTRV9EUk0KK2VuZGlmCisKK2lmZXEgKCQoQk9BUkRfVVNFX0FOQiksIHRydWUpCitMT0NBTF9DRkxBR1MgKz0gLURVU0VfQU5CCitpZmVxICgkKEJPQVJEX1VTRV9DU0NfRklNQyksIHRydWUpCitpZmVxICgkKEJPQVJEX1VTRV9WNEwyX0lPTiksIGZhbHNlKQorTE9DQUxfQ0ZMQUdTICs9IC1EVVNFX0NTQ19GSU1DCitlbmRpZgorZW5kaWYKKworaWZlcSAoJChCT0FSRF9VU0VfQ1NDX0dTQ0FMRVIpLCB0cnVlKQorTE9DQUxfQ0ZMQUdTICs9IC1EVVNFX0NTQ19HU0NBTEVSCitlbmRpZgorZW5kaWYKKworCitpZmVxICgkKFRBUkdFVF9CT0FSRF9QTEFURk9STSksIGV4eW5vczQpCitpZmVxICgkKEJPQVJEX1VTRV9WNEwyX0lPTiksZmFsc2UpCitpZmVxICgkKEJPQVJEX1VTRV9TM0RfU1VQUE9SVCksIHRydWUpCitMT0NBTF9DRkxBR1MgKz0gLURTM0RfU1VQUE9SVAorZW5kaWYKK2VuZGlmCitlbmRpZgorCitpZmVxICgkKFRBUkdFVF9CT0FSRF9QTEFURk9STSksIGV4eW5vczUpCitpZmVxICgkKEJPQVJEX1VTRV9TM0RfU1VQUE9SVCksIHRydWUpCitMT0NBTF9DRkxBR1MgKz0gLURTM0RfU1VQUE9SVAorZW5kaWYKK2VuZGlmCisKK0xPQ0FMX0FSTV9NT0RFIDo9IGFybQorCitMT0NBTF9TVEFUSUNfTElCUkFSSUVTIDo9IGxpYlNFQ19PTVhfVmRlYyBsaWJzZWNvc2FsIGxpYnNlY2Jhc2Vjb21wb25lbnQgXAorCWxpYnN3Y29udmVydGVyIGxpYnNlY21mY2FwaQorTE9DQUxfU0hBUkVEX0xJQlJBUklFUyA6PSBsaWJjIGxpYmRsIGxpYmN1dGlscyBsaWJ1dGlscyBsaWJ1aSBcCisJbGliU0VDX09NWF9SZXNvdXJjZW1hbmFnZXIgbGliY3NjCisKK2lmZXEgKCQoZmlsdGVyLW91dCBleHlub3M0LCQoVEFSR0VUX0JPQVJEX1BMQVRGT1JNKSksKQorTE9DQUxfU0hBUkVEX0xJQlJBUklFUyArPSBsaWJmaW1jIGxpYmh3Y29udmVydGVyCitlbmRpZgorCitpZmVxICgkKGZpbHRlci1vdXQgZXh5bm9zNSwkKFRBUkdFVF9CT0FSRF9QTEFURk9STSkpLCkKK0xPQ0FMX1NIQVJFRF9MSUJSQVJJRVMgKz0gbGliZXh5bm9zZ3NjYWxlcgorZW5kaWYKKworI2lmZXEgKCQoQk9BUkRfVVNFX1Y0TDJfSU9OKSx0cnVlKQorI0xPQ0FMX1NIQVJFRF9MSUJSQVJJRVMgKz0gbGliaW9uCisjZW5kaWYKKworaWZlcSAoJChCT0FSRF9VU0VTX01GQ19GUFMpLHRydWUpCitMT0NBTF9DRkxBR1MgKz0gLURDT05GSUdfTUZDX0ZQUworZW5kaWYKKworTE9DQUxfQ19JTkNMVURFUyA6PSAkKFNFQ19PTVhfSU5DKS9raHJvbm9zIFwKKwkkKFNFQ19PTVhfSU5DKS9zZWMgXAorCSQoU0VDX09NWF9UT1ApL29zYWwgXAorCSQoU0VDX09NWF9UT1ApL2NvcmUgXAorCSQoU0VDX09NWF9DT01QT05FTlQpL2NvbW1vbiBcCisJJChTRUNfT01YX0NPTVBPTkVOVCkvdmlkZW8vZGVjIFwKKwkkKFRBUkdFVF9PVVRfSEVBREVSUykvJChTRUNfQ09QWV9IRUFERVJTX1RPKSBcCisJJChCT0FSRF9IQUxfUEFUSCkvaW5jbHVkZQorCitpbmNsdWRlICQoQlVJTERfU0hBUkVEX0xJQlJBUlkpCmRpZmYgLS1naXQgYS9leHlub3M0L211bHRpbWVkaWEvb3Blbm1heC9zZWNfb214L2NvbXBvbmVudC92aWRlby9kZWMvaDI2NC9TRUNfT01YX0gyNjRkZWMuYyBiL2V4eW5vczQvbXVsdGltZWRpYS9vcGVubWF4L3NlY19vbXgvY29tcG9uZW50L3ZpZGVvL2RlYy9oMjY0L1NFQ19PTVhfSDI2NGRlYy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjJhZDM0ZDgKLS0tIC9kZXYvbnVsbAorKysgYi9leHlub3M0L211bHRpbWVkaWEvb3Blbm1heC9zZWNfb214L2NvbXBvbmVudC92aWRlby9kZWMvaDI2NC9TRUNfT01YX0gyNjRkZWMuYwpAQCAtMCwwICsxLDI2MTEgQEAKKy8qCisgKgorICogQ29weXJpZ2h0IDIwMTAgU2Ftc3VuZyBFbGVjdHJvbmljcyBTLkxTSSBDby4gTFRECisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKy8qCisgKiBAZmlsZSAgICAgICAgU0VDX09NWF9IMjY0ZGVjLmMKKyAqIEBicmllZgorICogQGF1dGhvciAgICAgIFNldW5nQmVvbSBLaW0gKHNiY3J1eC5raW1Ac2Ftc3VuZy5jb20pCisgKiBAdmVyc2lvbiAgICAgMS4xLjAKKyAqIEBoaXN0b3J5CisgKiAgIDIwMTAuNy4xNSA6IENyZWF0ZQorICovCisKKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgPHN0ZGxpYi5oPgorI2luY2x1ZGUgPHN0cmluZy5oPgorCisjaW5jbHVkZSAiU0VDX09NWF9NYWNyb3MuaCIKKyNpbmNsdWRlICJTRUNfT01YX0Jhc2Vjb21wb25lbnQuaCIKKyNpbmNsdWRlICJTRUNfT01YX0Jhc2Vwb3J0LmgiCisjaW5jbHVkZSAiU0VDX09NWF9WZGVjLmgiCisjaW5jbHVkZSAiU0VDX09TQUxfRVRDLmgiCisjaW5jbHVkZSAiU0VDX09TQUxfU2VtYXBob3JlLmgiCisjaW5jbHVkZSAiU0VDX09TQUxfVGhyZWFkLmgiCisjaW5jbHVkZSAibGlicmFyeV9yZWdpc3Rlci5oIgorI2luY2x1ZGUgIlNFQ19PTVhfSDI2NGRlYy5oIgorI2luY2x1ZGUgIlNzYlNpcE1mY0FwaS5oIgorCisjaWZkZWYgVVNFX0FOQgorI2luY2x1ZGUgIlNFQ19PU0FMX0FuZHJvaWQuaCIKKyNlbmRpZgorCisvKiBUbyB1c2UgQ1NDX01FVEhPRF9QUkVGRVJfSFcgb3IgQ1NDX01FVEhPRF9IVyBpbiBTRUMgT01YLCBncmFsbG9jIHNob3VsZCBhbGxvY2F0ZSBwaHlzaWNhbCBtZW1vcnkgdXNpbmcgRklNQyAqLworLyogSXQgbWVhbnMgR1JBTExPQ19VU0FHRV9IV19GSU1DMSBzaG91bGQgYmUgc2V0IG9uIE5hdGl2ZSBXaW5kb3cgdXNhZ2UgKi8KKyNpbmNsdWRlICJjc2MuaCIKKworI3VuZGVmICBTRUNfTE9HX1RBRworI2RlZmluZSBTRUNfTE9HX1RBRyAgICAiU0VDX0gyNjRfREVDIgorI2RlZmluZSBTRUNfTE9HX09GRgorI2luY2x1ZGUgIlNFQ19PU0FMX0xvZy5oIgorCisjZGVmaW5lIEgyNjRfREVDX05VTV9PRl9FWFRSQV9CVUZGRVJTIDcKKworI2lmZGVmIFMzRF9TVVBQT1JUCisjZGVmaW5lIEFERF9TUFNfUFBTX0lfRlJBTUUKKyNlbHNlCisvLyNkZWZpbmUgQUREX1NQU19QUFNfSV9GUkFNRQorI2VuZGlmCisvLyNkZWZpbmUgRlVMTF9GUkFNRV9TRUFSQ0gKKworLyogSC4yNjQgRGVjb2RlciBTdXBwb3J0ZWQgTGV2ZWxzICYgcHJvZmlsZXMgKi8KK1NFQ19PTVhfVklERU9fUFJPRklMRUxFVkVMIHN1cHBvcnRlZEFWQ1Byb2ZpbGVMZXZlbHNbXSA9eworICAgIHtPTVhfVklERU9fQVZDUHJvZmlsZUJhc2VsaW5lLCBPTVhfVklERU9fQVZDTGV2ZWwxfSwKKyAgICB7T01YX1ZJREVPX0FWQ1Byb2ZpbGVCYXNlbGluZSwgT01YX1ZJREVPX0FWQ0xldmVsMWJ9LAorICAgIHtPTVhfVklERU9fQVZDUHJvZmlsZUJhc2VsaW5lLCBPTVhfVklERU9fQVZDTGV2ZWwxMX0sCisgICAge09NWF9WSURFT19BVkNQcm9maWxlQmFzZWxpbmUsIE9NWF9WSURFT19BVkNMZXZlbDEyfSwKKyAgICB7T01YX1ZJREVPX0FWQ1Byb2ZpbGVCYXNlbGluZSwgT01YX1ZJREVPX0FWQ0xldmVsMTN9LAorICAgIHtPTVhfVklERU9fQVZDUHJvZmlsZUJhc2VsaW5lLCBPTVhfVklERU9fQVZDTGV2ZWwyfSwKKyAgICB7T01YX1ZJREVPX0FWQ1Byb2ZpbGVCYXNlbGluZSwgT01YX1ZJREVPX0FWQ0xldmVsMjF9LAorICAgIHtPTVhfVklERU9fQVZDUHJvZmlsZUJhc2VsaW5lLCBPTVhfVklERU9fQVZDTGV2ZWwyMn0sCisgICAge09NWF9WSURFT19BVkNQcm9maWxlQmFzZWxpbmUsIE9NWF9WSURFT19BVkNMZXZlbDN9LAorICAgIHtPTVhfVklERU9fQVZDUHJvZmlsZUJhc2VsaW5lLCBPTVhfVklERU9fQVZDTGV2ZWwzMX0sCisgICAge09NWF9WSURFT19BVkNQcm9maWxlQmFzZWxpbmUsIE9NWF9WSURFT19BVkNMZXZlbDMyfSwKKyAgICB7T01YX1ZJREVPX0FWQ1Byb2ZpbGVCYXNlbGluZSwgT01YX1ZJREVPX0FWQ0xldmVsNH0sCisKKyAgICB7T01YX1ZJREVPX0FWQ1Byb2ZpbGVNYWluLCBPTVhfVklERU9fQVZDTGV2ZWwxfSwKKyAgICB7T01YX1ZJREVPX0FWQ1Byb2ZpbGVNYWluLCBPTVhfVklERU9fQVZDTGV2ZWwxYn0sCisgICAge09NWF9WSURFT19BVkNQcm9maWxlTWFpbiwgT01YX1ZJREVPX0FWQ0xldmVsMTF9LAorICAgIHtPTVhfVklERU9fQVZDUHJvZmlsZU1haW4sIE9NWF9WSURFT19BVkNMZXZlbDEyfSwKKyAgICB7T01YX1ZJREVPX0FWQ1Byb2ZpbGVNYWluLCBPTVhfVklERU9fQVZDTGV2ZWwxM30sCisgICAge09NWF9WSURFT19BVkNQcm9maWxlTWFpbiwgT01YX1ZJREVPX0FWQ0xldmVsMn0sCisgICAge09NWF9WSURFT19BVkNQcm9maWxlTWFpbiwgT01YX1ZJREVPX0FWQ0xldmVsMjF9LAorICAgIHtPTVhfVklERU9fQVZDUHJvZmlsZU1haW4sIE9NWF9WSURFT19BVkNMZXZlbDIyfSwKKyAgICB7T01YX1ZJREVPX0FWQ1Byb2ZpbGVNYWluLCBPTVhfVklERU9fQVZDTGV2ZWwzfSwKKyAgICB7T01YX1ZJREVPX0FWQ1Byb2ZpbGVNYWluLCBPTVhfVklERU9fQVZDTGV2ZWwzMX0sCisgICAge09NWF9WSURFT19BVkNQcm9maWxlTWFpbiwgT01YX1ZJREVPX0FWQ0xldmVsMzJ9LAorICAgIHtPTVhfVklERU9fQVZDUHJvZmlsZU1haW4sIE9NWF9WSURFT19BVkNMZXZlbDR9LAorCisgICAge09NWF9WSURFT19BVkNQcm9maWxlSGlnaCwgT01YX1ZJREVPX0FWQ0xldmVsMX0sCisgICAge09NWF9WSURFT19BVkNQcm9maWxlSGlnaCwgT01YX1ZJREVPX0FWQ0xldmVsMWJ9LAorICAgIHtPTVhfVklERU9fQVZDUHJvZmlsZUhpZ2gsIE9NWF9WSURFT19BVkNMZXZlbDExfSwKKyAgICB7T01YX1ZJREVPX0FWQ1Byb2ZpbGVIaWdoLCBPTVhfVklERU9fQVZDTGV2ZWwxMn0sCisgICAge09NWF9WSURFT19BVkNQcm9maWxlSGlnaCwgT01YX1ZJREVPX0FWQ0xldmVsMTN9LAorICAgIHtPTVhfVklERU9fQVZDUHJvZmlsZUhpZ2gsIE9NWF9WSURFT19BVkNMZXZlbDJ9LAorICAgIHtPTVhfVklERU9fQVZDUHJvZmlsZUhpZ2gsIE9NWF9WSURFT19BVkNMZXZlbDIxfSwKKyAgICB7T01YX1ZJREVPX0FWQ1Byb2ZpbGVIaWdoLCBPTVhfVklERU9fQVZDTGV2ZWwyMn0sCisgICAge09NWF9WSURFT19BVkNQcm9maWxlSGlnaCwgT01YX1ZJREVPX0FWQ0xldmVsM30sCisgICAge09NWF9WSURFT19BVkNQcm9maWxlSGlnaCwgT01YX1ZJREVPX0FWQ0xldmVsMzF9LAorICAgIHtPTVhfVklERU9fQVZDUHJvZmlsZUhpZ2gsIE9NWF9WSURFT19BVkNMZXZlbDMyfSwKKyAgICB7T01YX1ZJREVPX0FWQ1Byb2ZpbGVIaWdoLCBPTVhfVklERU9fQVZDTGV2ZWw0fX07CisKKworc3RhdGljIGludCBDaGVja19IMjY0X0ZyYW1lKE9NWF9VOCAqcElucHV0U3RyZWFtLCBPTVhfVTMyIGJ1ZmZTaXplLCBPTVhfVTMyIGZsYWcsIE9NWF9CT09MIGJQcmV2aW91c0ZyYW1lRU9GLCBPTVhfQk9PTCAqcGJFbmRPZkZyYW1lKQoreworICAgIE9NWF9VMzIgIHByZUZvdXJCeXRlICAgICAgID0gKE9NWF9VMzIpLTE7CisgICAgaW50ICAgICAgYWNjZXNzVW5pdFNpemUgICAgPSAwOworICAgIGludCAgICAgIGZyYW1lVHlwZUJvdW5kYXJ5ID0gMDsKKyAgICBpbnQgICAgICBuZXh0TmFsdVNpemUgICAgICA9IDA7CisgICAgaW50ICAgICAgbmFsdVN0YXJ0ICAgICAgICAgPSAwOworCisgICAgaWYgKGJQcmV2aW91c0ZyYW1lRU9GID09IE9NWF9UUlVFKQorICAgICAgICBuYWx1U3RhcnQgPSAwOworICAgIGVsc2UKKyAgICAgICAgbmFsdVN0YXJ0ID0gMTsKKworICAgIHdoaWxlICgxKSB7CisgICAgICAgIGludCBpbnB1dE9uZUJ5dGUgPSAwOworCisgICAgICAgIGlmIChhY2Nlc3NVbml0U2l6ZSA9PSAoaW50KWJ1ZmZTaXplKQorICAgICAgICAgICAgZ290byBFWElUOworCisgICAgICAgIGlucHV0T25lQnl0ZSA9ICoocElucHV0U3RyZWFtKyspOworICAgICAgICBhY2Nlc3NVbml0U2l6ZSArPSAxOworCisgICAgICAgIGlmIChwcmVGb3VyQnl0ZSA9PSAweDAwMDAwMDAxIHx8IChwcmVGb3VyQnl0ZSA8PCA4KSA9PSAweDAwMDAwMTAwKSB7CisgICAgICAgICAgICBpbnQgbmFsdVR5cGUgPSBpbnB1dE9uZUJ5dGUgJiAweDFGOworCisgICAgICAgICAgICBTRUNfT1NBTF9Mb2coU0VDX0xPR19UUkFDRSwgIk5hbHVUeXBlIDogJWQiLCBuYWx1VHlwZSk7CisgICAgICAgICAgICBpZiAobmFsdVN0YXJ0ID09IDApIHsKKyNpZmRlZiBBRERfU1BTX1BQU19JX0ZSQU1FCisgICAgICAgICAgICAgICAgaWYgKG5hbHVUeXBlID09IDEgfHwgbmFsdVR5cGUgPT0gNSkKKyNlbHNlCisgICAgICAgICAgICAgICAgaWYgKG5hbHVUeXBlID09IDEgfHwgbmFsdVR5cGUgPT0gNSB8fCBuYWx1VHlwZSA9PSA3IHx8IG5hbHVUeXBlID09IDgpCisjZW5kaWYKKyAgICAgICAgICAgICAgICAgICAgbmFsdVN0YXJ0ID0gMTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisjaWZkZWYgT0xEX0RFVEVDVAorICAgICAgICAgICAgICAgIGZyYW1lVHlwZUJvdW5kYXJ5ID0gKDggLSBuYWx1VHlwZSkgJiAobmFsdVR5cGUgLSAxMCk7IC8vQVVEKDkpCisjZWxzZQorICAgICAgICAgICAgICAgIGlmIChuYWx1VHlwZSA9PSA5KQorICAgICAgICAgICAgICAgICAgICBmcmFtZVR5cGVCb3VuZGFyeSA9IC0yOworI2VuZGlmCisgICAgICAgICAgICAgICAgaWYgKG5hbHVUeXBlID09IDEgfHwgbmFsdVR5cGUgPT0gNSkgeworICAgICAgICAgICAgICAgICAgICBpZiAoYWNjZXNzVW5pdFNpemUgPT0gKGludClidWZmU2l6ZSkgeworICAgICAgICAgICAgICAgICAgICAgICAgYWNjZXNzVW5pdFNpemUtLTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGdvdG8gRVhJVDsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBpbnB1dE9uZUJ5dGUgPSAqcElucHV0U3RyZWFtKys7CisgICAgICAgICAgICAgICAgICAgIGFjY2Vzc1VuaXRTaXplICs9IDE7CisKKyAgICAgICAgICAgICAgICAgICAgaWYgKGlucHV0T25lQnl0ZSA+PSAweDgwKQorICAgICAgICAgICAgICAgICAgICAgICAgZnJhbWVUeXBlQm91bmRhcnkgPSAtMTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgaWYgKGZyYW1lVHlwZUJvdW5kYXJ5IDwgMCkgeworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisKKyAgICAgICAgfQorICAgICAgICBwcmVGb3VyQnl0ZSA9IChwcmVGb3VyQnl0ZSA8PCA4KSArIGlucHV0T25lQnl0ZTsKKyAgICB9CisKKyAgICAqcGJFbmRPZkZyYW1lID0gT01YX1RSVUU7CisgICAgbmV4dE5hbHVTaXplID0gLTU7CisgICAgaWYgKGZyYW1lVHlwZUJvdW5kYXJ5ID09IC0xKQorICAgICAgICBuZXh0TmFsdVNpemUgPSAtNjsKKyAgICBpZiAocHJlRm91ckJ5dGUgIT0gMHgwMDAwMDAwMSkKKyAgICAgICAgbmV4dE5hbHVTaXplKys7CisgICAgcmV0dXJuIChhY2Nlc3NVbml0U2l6ZSArIG5leHROYWx1U2l6ZSk7CisKK0VYSVQ6CisgICAgKnBiRW5kT2ZGcmFtZSA9IE9NWF9GQUxTRTsKKworICAgIHJldHVybiBhY2Nlc3NVbml0U2l6ZTsKK30KKworT01YX0JPT0wgQ2hlY2tfSDI2NF9TdGFydENvZGUoT01YX1U4ICpwSW5wdXRTdHJlYW0sIE9NWF9VMzIgc3RyZWFtU2l6ZSkKK3sKKyAgICBpZiAoc3RyZWFtU2l6ZSA8IDQpIHsKKyAgICAgICAgcmV0dXJuIE9NWF9GQUxTRTsKKyAgICB9IGVsc2UgaWYgKChwSW5wdXRTdHJlYW1bMF0gPT0gMHgwMCkgJiYKKyAgICAgICAgICAgICAgKHBJbnB1dFN0cmVhbVsxXSA9PSAweDAwKSAmJgorICAgICAgICAgICAgICAocElucHV0U3RyZWFtWzJdID09IDB4MDApICYmCisgICAgICAgICAgICAgIChwSW5wdXRTdHJlYW1bM10gIT0gMHgwMCkgJiYKKyAgICAgICAgICAgICAgKChwSW5wdXRTdHJlYW1bM10gPj4gMykgPT0gMHgwMCkpIHsKKyAgICAgICAgcmV0dXJuIE9NWF9UUlVFOworICAgIH0gZWxzZSBpZiAoKHBJbnB1dFN0cmVhbVswXSA9PSAweDAwKSAmJgorICAgICAgICAgICAgICAocElucHV0U3RyZWFtWzFdID09IDB4MDApICYmCisgICAgICAgICAgICAgIChwSW5wdXRTdHJlYW1bMl0gIT0gMHgwMCkgJiYKKyAgICAgICAgICAgICAgKChwSW5wdXRTdHJlYW1bMl0gPj4gMykgPT0gMHgwMCkpIHsKKyAgICAgICAgcmV0dXJuIE9NWF9UUlVFOworICAgIH0gZWxzZSB7CisgICAgICAgIHJldHVybiBPTVhfRkFMU0U7CisgICAgfQorfQorCitPTVhfRVJST1JUWVBFIFNFQ19NRkNfSDI2NERlY19BbGxvY19TZWN1cmVJbnB1dEJ1ZmZlcihPTVhfSU4gT01YX0hBTkRMRVRZUEUgaENvbXBvbmVudCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9NWF9JTiBPTVhfVTMyIG5CdWZmZXJTaXplLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT01YX0lOT1VUIE9NWF9QVFIgKnBJbnB1dEJ1ZmZlcl9waHlzaWNhbEFkZHJlc3MpCit7CisgICAgRnVuY3Rpb25JbigpOworCisgICAgT01YX0VSUk9SVFlQRSAgICAgIHJldCA9IE9NWF9FcnJvck5vbmU7CisgICAgT01YX0NPTVBPTkVOVFRZUEUgKnBPTVhDb21wb25lbnQgPSAoT01YX0NPTVBPTkVOVFRZUEUgKiloQ29tcG9uZW50OworICAgIFNFQ19PTVhfQkFTRUNPTVBPTkVOVCAqcFNFQ0NvbXBvbmVudCA9IChTRUNfT01YX0JBU0VDT01QT05FTlQgKilwT01YQ29tcG9uZW50LT5wQ29tcG9uZW50UHJpdmF0ZTsKKyAgICBTRUNfT01YX1ZJREVPREVDX0NPTVBPTkVOVCAqcFZpZGVvRGVjID0gKFNFQ19PTVhfVklERU9ERUNfQ09NUE9ORU5UICopcFNFQ0NvbXBvbmVudC0+aENvbXBvbmVudEhhbmRsZTsKKyAgICBTRUNfSDI2NERFQ19IQU5ETEUgICAgKnBIMjY0RGVjID0gTlVMTDsKKyAgICBPTVhfUFRSIHBTdHJlYW1CdWZmZXIgICAgPSBOVUxMOworICAgIE9NWF9QVFIgcFN0cmVhbVBoeUJ1ZmZlciA9IE5VTEw7CisKKyNpZmRlZiBVU0VfRFJNCisgICAgcEgyNjREZWMgPSAoU0VDX0gyNjRERUNfSEFORExFICopKChTRUNfT01YX1ZJREVPREVDX0NPTVBPTkVOVCAqKXBTRUNDb21wb25lbnQtPmhDb21wb25lbnRIYW5kbGUpLT5oQ29kZWNIYW5kbGU7CisgICAgaWYgKHBIMjY0RGVjID09IE5VTEwpIHsKKyAgICAgICAgcmV0ID0gT01YX0Vycm9ySW52YWxpZFN0YXRlOworICAgICAgICBnb3RvIEVYSVQ7CisgICAgfQorCisgICAgcFN0cmVhbUJ1ZmZlciA9IFNzYlNpcE1mY0RlY0FsbG9jSW5wdXRCdWZmZXIocEgyNjREZWMtPmhNRkNIMjY0SGFuZGxlLmhNRkNIYW5kbGUsICZwU3RyZWFtUGh5QnVmZmVyLCBuQnVmZmVyU2l6ZSk7CisgICAgaWYgKHBTdHJlYW1CdWZmZXIgPT0gTlVMTCkgeworICAgICAgICByZXQgPSBPTVhfRXJyb3JJbmNvcnJlY3RTdGF0ZU9wZXJhdGlvbjsKKyAgICAgICAgZ290byBFWElUOworICAgIH0KKworICAgIHBTRUNDb21wb25lbnQtPnByb2Nlc3NEYXRhW0lOUFVUX1BPUlRfSU5ERVhdLmRhdGFCdWZmZXIgPSBwU3RyZWFtUGh5QnVmZmVyOworICAgIHBTRUNDb21wb25lbnQtPnByb2Nlc3NEYXRhW0lOUFVUX1BPUlRfSU5ERVhdLmFsbG9jU2l6ZSA9IG5CdWZmZXJTaXplOworCisgICAgKnBJbnB1dEJ1ZmZlcl9waHlzaWNhbEFkZHJlc3MgPSBwU3RyZWFtUGh5QnVmZmVyOworI2VuZGlmCisKK0VYSVQ6CisgICAgRnVuY3Rpb25PdXQoKTsKKworICAgIHJldHVybiByZXQ7Cit9CisKK09NWF9FUlJPUlRZUEUgU0VDX01GQ19IMjY0RGVjX0ZyZWVfU2VjdXJlSW5wdXRCdWZmZXIoT01YX0lOIE9NWF9IQU5ETEVUWVBFIGhDb21wb25lbnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9NWF9JTk9VVCBPTVhfUFRSIHBJbnB1dEJ1ZmZlcl9waHlzaWNhbEFkZHJlc3MpCit7CisgICAgRnVuY3Rpb25JbigpOworCisgICAgT01YX0VSUk9SVFlQRSAgICAgIHJldCA9IE9NWF9FcnJvck5vbmU7CisgICAgT01YX0NPTVBPTkVOVFRZUEUgKnBPTVhDb21wb25lbnQgPSAoT01YX0NPTVBPTkVOVFRZUEUgKiloQ29tcG9uZW50OworICAgIFNFQ19PTVhfQkFTRUNPTVBPTkVOVCAqcFNFQ0NvbXBvbmVudCA9IChTRUNfT01YX0JBU0VDT01QT05FTlQgKilwT01YQ29tcG9uZW50LT5wQ29tcG9uZW50UHJpdmF0ZTsKKyAgICBTRUNfT01YX1ZJREVPREVDX0NPTVBPTkVOVCAqcFZpZGVvRGVjID0gKFNFQ19PTVhfVklERU9ERUNfQ09NUE9ORU5UICopcFNFQ0NvbXBvbmVudC0+aENvbXBvbmVudEhhbmRsZTsKKyAgICBTRUNfSDI2NERFQ19IQU5ETEUgICAgKnBIMjY0RGVjID0gTlVMTDsKKyAgICBPTVhfUFRSIHBTdHJlYW1QaHlCdWZmZXIgPSBOVUxMOworCisjaWZkZWYgVVNFX0RSTQorICAgIHBIMjY0RGVjID0gKFNFQ19IMjY0REVDX0hBTkRMRSAqKSgoU0VDX09NWF9WSURFT0RFQ19DT01QT05FTlQgKilwU0VDQ29tcG9uZW50LT5oQ29tcG9uZW50SGFuZGxlKS0+aENvZGVjSGFuZGxlOworICAgIGlmIChwSDI2NERlYyA9PSBOVUxMKSB7CisgICAgICAgIHJldCA9IE9NWF9FcnJvckludmFsaWRTdGF0ZTsKKyAgICAgICAgZ290byBFWElUOworICAgIH0KKworICAgIHBTdHJlYW1QaHlCdWZmZXIgPSBwSW5wdXRCdWZmZXJfcGh5c2ljYWxBZGRyZXNzOworICAgIFNzYlNpcE1mY0RlY0ZyZWVJbnB1dEJ1ZmZlcihwSDI2NERlYy0+aE1GQ0gyNjRIYW5kbGUuaE1GQ0hhbmRsZSwgcFN0cmVhbVBoeUJ1ZmZlcik7CisjZW5kaWYKKworRVhJVDoKKyAgICBGdW5jdGlvbk91dCgpOworCisgICAgcmV0dXJuIHJldDsKK30KKworT01YX0VSUk9SVFlQRSBTRUNfTUZDX0gyNjREZWNfR2V0UGFyYW1ldGVyKAorICAgIE9NWF9JTiBPTVhfSEFORExFVFlQRSBoQ29tcG9uZW50LAorICAgIE9NWF9JTiBPTVhfSU5ERVhUWVBFICBuUGFyYW1JbmRleCwKKyAgICBPTVhfSU5PVVQgT01YX1BUUiAgICAgcENvbXBvbmVudFBhcmFtZXRlclN0cnVjdHVyZSkKK3sKKyAgICBPTVhfRVJST1JUWVBFICAgICAgICAgIHJldCA9IE9NWF9FcnJvck5vbmU7CisgICAgT01YX0NPTVBPTkVOVFRZUEUgICAgICpwT01YQ29tcG9uZW50ID0gTlVMTDsKKyAgICBTRUNfT01YX0JBU0VDT01QT05FTlQgKnBTRUNDb21wb25lbnQgPSBOVUxMOworCisgICAgRnVuY3Rpb25JbigpOworCisgICAgaWYgKGhDb21wb25lbnQgPT0gTlVMTCB8fCBwQ29tcG9uZW50UGFyYW1ldGVyU3RydWN0dXJlID09IE5VTEwpIHsKKyAgICAgICAgcmV0ID0gT01YX0Vycm9yQmFkUGFyYW1ldGVyOworICAgICAgICBnb3RvIEVYSVQ7CisgICAgfQorICAgIHBPTVhDb21wb25lbnQgPSAoT01YX0NPTVBPTkVOVFRZUEUgKiloQ29tcG9uZW50OworICAgIHJldCA9IFNFQ19PTVhfQ2hlY2tfU2l6ZVZlcnNpb24ocE9NWENvbXBvbmVudCwgc2l6ZW9mKE9NWF9DT01QT05FTlRUWVBFKSk7CisgICAgaWYgKHJldCAhPSBPTVhfRXJyb3JOb25lKSB7CisgICAgICAgIGdvdG8gRVhJVDsKKyAgICB9CisgICAgaWYgKHBPTVhDb21wb25lbnQtPnBDb21wb25lbnRQcml2YXRlID09IE5VTEwpIHsKKyAgICAgICAgcmV0ID0gT01YX0Vycm9yQmFkUGFyYW1ldGVyOworICAgICAgICBnb3RvIEVYSVQ7CisgICAgfQorCisgICAgcFNFQ0NvbXBvbmVudCA9IChTRUNfT01YX0JBU0VDT01QT05FTlQgKilwT01YQ29tcG9uZW50LT5wQ29tcG9uZW50UHJpdmF0ZTsKKyAgICBpZiAocFNFQ0NvbXBvbmVudC0+Y3VycmVudFN0YXRlID09IE9NWF9TdGF0ZUludmFsaWQgKSB7CisgICAgICAgIHJldCA9IE9NWF9FcnJvckludmFsaWRTdGF0ZTsKKyAgICAgICAgZ290byBFWElUOworICAgIH0KKworICAgIHN3aXRjaCAoblBhcmFtSW5kZXgpIHsKKyAgICBjYXNlIE9NWF9JbmRleFBhcmFtVmlkZW9BdmM6CisgICAgeworICAgICAgICBPTVhfVklERU9fUEFSQU1fQVZDVFlQRSAqcERzdEFWQ0NvbXBvbmVudCA9IChPTVhfVklERU9fUEFSQU1fQVZDVFlQRSAqKXBDb21wb25lbnRQYXJhbWV0ZXJTdHJ1Y3R1cmU7CisgICAgICAgIE9NWF9WSURFT19QQVJBTV9BVkNUWVBFICpwU3JjQVZDQ29tcG9uZW50ID0gTlVMTDsKKyAgICAgICAgU0VDX0gyNjRERUNfSEFORExFICAgICAgKnBIMjY0RGVjID0gTlVMTDsKKworICAgICAgICByZXQgPSBTRUNfT01YX0NoZWNrX1NpemVWZXJzaW9uKHBEc3RBVkNDb21wb25lbnQsIHNpemVvZihPTVhfVklERU9fUEFSQU1fQVZDVFlQRSkpOworICAgICAgICBpZiAocmV0ICE9IE9NWF9FcnJvck5vbmUpIHsKKyAgICAgICAgICAgIGdvdG8gRVhJVDsKKyAgICAgICAgfQorCisgICAgICAgIGlmIChwRHN0QVZDQ29tcG9uZW50LT5uUG9ydEluZGV4ID49IEFMTF9QT1JUX05VTSkgeworICAgICAgICAgICAgcmV0ID0gT01YX0Vycm9yQmFkUG9ydEluZGV4OworICAgICAgICAgICAgZ290byBFWElUOworICAgICAgICB9CisKKyAgICAgICAgcEgyNjREZWMgPSAoU0VDX0gyNjRERUNfSEFORExFICopKChTRUNfT01YX1ZJREVPREVDX0NPTVBPTkVOVCAqKXBTRUNDb21wb25lbnQtPmhDb21wb25lbnRIYW5kbGUpLT5oQ29kZWNIYW5kbGU7CisgICAgICAgIHBTcmNBVkNDb21wb25lbnQgPSAmcEgyNjREZWMtPkFWQ0NvbXBvbmVudFtwRHN0QVZDQ29tcG9uZW50LT5uUG9ydEluZGV4XTsKKworICAgICAgICBTRUNfT1NBTF9NZW1jcHkocERzdEFWQ0NvbXBvbmVudCwgcFNyY0FWQ0NvbXBvbmVudCwgc2l6ZW9mKE9NWF9WSURFT19QQVJBTV9BVkNUWVBFKSk7CisgICAgfQorICAgICAgICBicmVhazsKKyAgICBjYXNlIE9NWF9JbmRleFBhcmFtU3RhbmRhcmRDb21wb25lbnRSb2xlOgorICAgIHsKKyAgICAgICAgT01YX1BBUkFNX0NPTVBPTkVOVFJPTEVUWVBFICpwQ29tcG9uZW50Um9sZSA9IChPTVhfUEFSQU1fQ09NUE9ORU5UUk9MRVRZUEUgKilwQ29tcG9uZW50UGFyYW1ldGVyU3RydWN0dXJlOworICAgICAgICByZXQgPSBTRUNfT01YX0NoZWNrX1NpemVWZXJzaW9uKHBDb21wb25lbnRSb2xlLCBzaXplb2YoT01YX1BBUkFNX0NPTVBPTkVOVFJPTEVUWVBFKSk7CisgICAgICAgIGlmIChyZXQgIT0gT01YX0Vycm9yTm9uZSkgeworICAgICAgICAgICAgZ290byBFWElUOworICAgICAgICB9CisKKyAgICAgICAgU0VDX09TQUxfU3RyY3B5KChjaGFyICopcENvbXBvbmVudFJvbGUtPmNSb2xlLCBTRUNfT01YX0NPTVBPTkVOVF9IMjY0X0RFQ19ST0xFKTsKKyAgICB9CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgT01YX0luZGV4UGFyYW1WaWRlb1Byb2ZpbGVMZXZlbFF1ZXJ5U3VwcG9ydGVkOgorICAgIHsKKyAgICAgICAgT01YX1ZJREVPX1BBUkFNX1BST0ZJTEVMRVZFTFRZUEUgKnBEc3RQcm9maWxlTGV2ZWwgPSAoT01YX1ZJREVPX1BBUkFNX1BST0ZJTEVMRVZFTFRZUEUqKXBDb21wb25lbnRQYXJhbWV0ZXJTdHJ1Y3R1cmU7CisgICAgICAgIFNFQ19PTVhfVklERU9fUFJPRklMRUxFVkVMICpwUHJvZmlsZUxldmVsID0gTlVMTDsKKyAgICAgICAgT01YX1UzMiBtYXhQcm9maWxlTGV2ZWxOdW0gPSAwOworCisgICAgICAgIHJldCA9IFNFQ19PTVhfQ2hlY2tfU2l6ZVZlcnNpb24ocERzdFByb2ZpbGVMZXZlbCwgc2l6ZW9mKE9NWF9WSURFT19QQVJBTV9QUk9GSUxFTEVWRUxUWVBFKSk7CisgICAgICAgIGlmIChyZXQgIT0gT01YX0Vycm9yTm9uZSkgeworICAgICAgICAgICAgZ290byBFWElUOworICAgICAgICB9CisKKyAgICAgICAgaWYgKHBEc3RQcm9maWxlTGV2ZWwtPm5Qb3J0SW5kZXggPj0gQUxMX1BPUlRfTlVNKSB7CisgICAgICAgICAgICByZXQgPSBPTVhfRXJyb3JCYWRQb3J0SW5kZXg7CisgICAgICAgICAgICBnb3RvIEVYSVQ7CisgICAgICAgIH0KKworICAgICAgICBwUHJvZmlsZUxldmVsID0gc3VwcG9ydGVkQVZDUHJvZmlsZUxldmVsczsKKyAgICAgICAgbWF4UHJvZmlsZUxldmVsTnVtID0gc2l6ZW9mKHN1cHBvcnRlZEFWQ1Byb2ZpbGVMZXZlbHMpIC8gc2l6ZW9mKFNFQ19PTVhfVklERU9fUFJPRklMRUxFVkVMKTsKKworICAgICAgICBpZiAocERzdFByb2ZpbGVMZXZlbC0+blByb2ZpbGVJbmRleCA+PSBtYXhQcm9maWxlTGV2ZWxOdW0pIHsKKyAgICAgICAgICAgIHJldCA9IE9NWF9FcnJvck5vTW9yZTsKKyAgICAgICAgICAgIGdvdG8gRVhJVDsKKyAgICAgICAgfQorCisgICAgICAgIHBQcm9maWxlTGV2ZWwgKz0gcERzdFByb2ZpbGVMZXZlbC0+blByb2ZpbGVJbmRleDsKKyAgICAgICAgcERzdFByb2ZpbGVMZXZlbC0+ZVByb2ZpbGUgPSBwUHJvZmlsZUxldmVsLT5wcm9maWxlOworICAgICAgICBwRHN0UHJvZmlsZUxldmVsLT5lTGV2ZWwgPSBwUHJvZmlsZUxldmVsLT5sZXZlbDsKKyAgICB9CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgT01YX0luZGV4UGFyYW1WaWRlb1Byb2ZpbGVMZXZlbEN1cnJlbnQ6CisgICAgeworICAgICAgICBPTVhfVklERU9fUEFSQU1fUFJPRklMRUxFVkVMVFlQRSAqcERzdFByb2ZpbGVMZXZlbCA9IChPTVhfVklERU9fUEFSQU1fUFJPRklMRUxFVkVMVFlQRSopcENvbXBvbmVudFBhcmFtZXRlclN0cnVjdHVyZTsKKyAgICAgICAgT01YX1ZJREVPX1BBUkFNX0FWQ1RZUEUgKnBTcmNBVkNDb21wb25lbnQgPSBOVUxMOworICAgICAgICBTRUNfSDI2NERFQ19IQU5ETEUgICAgICAqcEgyNjREZWMgPSBOVUxMOworCisgICAgICAgIHJldCA9IFNFQ19PTVhfQ2hlY2tfU2l6ZVZlcnNpb24ocERzdFByb2ZpbGVMZXZlbCwgc2l6ZW9mKE9NWF9WSURFT19QQVJBTV9QUk9GSUxFTEVWRUxUWVBFKSk7CisgICAgICAgIGlmIChyZXQgIT0gT01YX0Vycm9yTm9uZSkgeworICAgICAgICAgICAgZ290byBFWElUOworICAgICAgICB9CisKKyAgICAgICAgaWYgKHBEc3RQcm9maWxlTGV2ZWwtPm5Qb3J0SW5kZXggPj0gQUxMX1BPUlRfTlVNKSB7CisgICAgICAgICAgICByZXQgPSBPTVhfRXJyb3JCYWRQb3J0SW5kZXg7CisgICAgICAgICAgICBnb3RvIEVYSVQ7CisgICAgICAgIH0KKworICAgICAgICBwSDI2NERlYyA9IChTRUNfSDI2NERFQ19IQU5ETEUgKikoKFNFQ19PTVhfVklERU9ERUNfQ09NUE9ORU5UICopcFNFQ0NvbXBvbmVudC0+aENvbXBvbmVudEhhbmRsZSktPmhDb2RlY0hhbmRsZTsKKyAgICAgICAgcFNyY0FWQ0NvbXBvbmVudCA9ICZwSDI2NERlYy0+QVZDQ29tcG9uZW50W3BEc3RQcm9maWxlTGV2ZWwtPm5Qb3J0SW5kZXhdOworCisgICAgICAgIHBEc3RQcm9maWxlTGV2ZWwtPmVQcm9maWxlID0gcFNyY0FWQ0NvbXBvbmVudC0+ZVByb2ZpbGU7CisgICAgICAgIHBEc3RQcm9maWxlTGV2ZWwtPmVMZXZlbCA9IHBTcmNBVkNDb21wb25lbnQtPmVMZXZlbDsKKyAgICB9CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgT01YX0luZGV4UGFyYW1WaWRlb0Vycm9yQ29ycmVjdGlvbjoKKyAgICB7CisgICAgICAgIE9NWF9WSURFT19QQVJBTV9FUlJPUkNPUlJFQ1RJT05UWVBFICpwRHN0RXJyb3JDb3JyZWN0aW9uVHlwZSA9IChPTVhfVklERU9fUEFSQU1fRVJST1JDT1JSRUNUSU9OVFlQRSAqKXBDb21wb25lbnRQYXJhbWV0ZXJTdHJ1Y3R1cmU7CisgICAgICAgIE9NWF9WSURFT19QQVJBTV9FUlJPUkNPUlJFQ1RJT05UWVBFICpwU3JjRXJyb3JDb3JyZWN0aW9uVHlwZSA9IE5VTEw7CisgICAgICAgIFNFQ19IMjY0REVDX0hBTkRMRSAgICAgICpwSDI2NERlYyA9IE5VTEw7CisKKyAgICAgICAgcmV0ID0gU0VDX09NWF9DaGVja19TaXplVmVyc2lvbihwRHN0RXJyb3JDb3JyZWN0aW9uVHlwZSwgc2l6ZW9mKE9NWF9WSURFT19QQVJBTV9FUlJPUkNPUlJFQ1RJT05UWVBFKSk7CisgICAgICAgIGlmIChyZXQgIT0gT01YX0Vycm9yTm9uZSkgeworICAgICAgICAgICAgZ290byBFWElUOworICAgICAgICB9CisKKyAgICAgICAgaWYgKHBEc3RFcnJvckNvcnJlY3Rpb25UeXBlLT5uUG9ydEluZGV4ICE9IElOUFVUX1BPUlRfSU5ERVgpIHsKKyAgICAgICAgICAgIHJldCA9IE9NWF9FcnJvckJhZFBvcnRJbmRleDsKKyAgICAgICAgICAgIGdvdG8gRVhJVDsKKyAgICAgICAgfQorCisgICAgICAgIHBIMjY0RGVjID0gKFNFQ19IMjY0REVDX0hBTkRMRSAqKSgoU0VDX09NWF9WSURFT0RFQ19DT01QT05FTlQgKilwU0VDQ29tcG9uZW50LT5oQ29tcG9uZW50SGFuZGxlKS0+aENvZGVjSGFuZGxlOworICAgICAgICBwU3JjRXJyb3JDb3JyZWN0aW9uVHlwZSA9ICZwSDI2NERlYy0+ZXJyb3JDb3JyZWN0aW9uVHlwZVtJTlBVVF9QT1JUX0lOREVYXTsKKworICAgICAgICBwRHN0RXJyb3JDb3JyZWN0aW9uVHlwZS0+YkVuYWJsZUhFQyA9IHBTcmNFcnJvckNvcnJlY3Rpb25UeXBlLT5iRW5hYmxlSEVDOworICAgICAgICBwRHN0RXJyb3JDb3JyZWN0aW9uVHlwZS0+YkVuYWJsZVJlc3luYyA9IHBTcmNFcnJvckNvcnJlY3Rpb25UeXBlLT5iRW5hYmxlUmVzeW5jOworICAgICAgICBwRHN0RXJyb3JDb3JyZWN0aW9uVHlwZS0+blJlc3luY2hNYXJrZXJTcGFjaW5nID0gcFNyY0Vycm9yQ29ycmVjdGlvblR5cGUtPm5SZXN5bmNoTWFya2VyU3BhY2luZzsKKyAgICAgICAgcERzdEVycm9yQ29ycmVjdGlvblR5cGUtPmJFbmFibGVEYXRhUGFydGl0aW9uaW5nID0gcFNyY0Vycm9yQ29ycmVjdGlvblR5cGUtPmJFbmFibGVEYXRhUGFydGl0aW9uaW5nOworICAgICAgICBwRHN0RXJyb3JDb3JyZWN0aW9uVHlwZS0+YkVuYWJsZVJWTEMgPSBwU3JjRXJyb3JDb3JyZWN0aW9uVHlwZS0+YkVuYWJsZVJWTEM7CisgICAgfQorICAgICAgICBicmVhazsKKyAgICBkZWZhdWx0OgorICAgICAgICByZXQgPSBTRUNfT01YX1ZpZGVvRGVjb2RlR2V0UGFyYW1ldGVyKGhDb21wb25lbnQsIG5QYXJhbUluZGV4LCBwQ29tcG9uZW50UGFyYW1ldGVyU3RydWN0dXJlKTsKKyAgICAgICAgYnJlYWs7CisgICAgfQorRVhJVDoKKyAgICBGdW5jdGlvbk91dCgpOworCisgICAgcmV0dXJuIHJldDsKK30KKworT01YX0VSUk9SVFlQRSBTRUNfTUZDX0gyNjREZWNfU2V0UGFyYW1ldGVyKAorICAgIE9NWF9JTiBPTVhfSEFORExFVFlQRSBoQ29tcG9uZW50LAorICAgIE9NWF9JTiBPTVhfSU5ERVhUWVBFICBuSW5kZXgsCisgICAgT01YX0lOIE9NWF9QVFIgICAgICAgIHBDb21wb25lbnRQYXJhbWV0ZXJTdHJ1Y3R1cmUpCit7CisgICAgT01YX0VSUk9SVFlQRSAgICAgICAgICAgcmV0ID0gT01YX0Vycm9yTm9uZTsKKyAgICBPTVhfQ09NUE9ORU5UVFlQRSAgICAgKnBPTVhDb21wb25lbnQgPSBOVUxMOworICAgIFNFQ19PTVhfQkFTRUNPTVBPTkVOVCAqcFNFQ0NvbXBvbmVudCA9IE5VTEw7CisKKyAgICBGdW5jdGlvbkluKCk7CisKKyAgICBpZiAoaENvbXBvbmVudCA9PSBOVUxMIHx8IHBDb21wb25lbnRQYXJhbWV0ZXJTdHJ1Y3R1cmUgPT0gTlVMTCkgeworICAgICAgICByZXQgPSBPTVhfRXJyb3JCYWRQYXJhbWV0ZXI7CisgICAgICAgIGdvdG8gRVhJVDsKKyAgICB9CisgICAgcE9NWENvbXBvbmVudCA9IChPTVhfQ09NUE9ORU5UVFlQRSAqKWhDb21wb25lbnQ7CisgICAgcmV0ID0gU0VDX09NWF9DaGVja19TaXplVmVyc2lvbihwT01YQ29tcG9uZW50LCBzaXplb2YoT01YX0NPTVBPTkVOVFRZUEUpKTsKKyAgICBpZiAocmV0ICE9IE9NWF9FcnJvck5vbmUpIHsKKyAgICAgICAgZ290byBFWElUOworICAgIH0KKyAgICBpZiAocE9NWENvbXBvbmVudC0+cENvbXBvbmVudFByaXZhdGUgPT0gTlVMTCkgeworICAgICAgICByZXQgPSBPTVhfRXJyb3JCYWRQYXJhbWV0ZXI7CisgICAgICAgIGdvdG8gRVhJVDsKKyAgICB9CisKKyAgICBwU0VDQ29tcG9uZW50ID0gKFNFQ19PTVhfQkFTRUNPTVBPTkVOVCAqKXBPTVhDb21wb25lbnQtPnBDb21wb25lbnRQcml2YXRlOworICAgIGlmIChwU0VDQ29tcG9uZW50LT5jdXJyZW50U3RhdGUgPT0gT01YX1N0YXRlSW52YWxpZCApIHsKKyAgICAgICAgcmV0ID0gT01YX0Vycm9ySW52YWxpZFN0YXRlOworICAgICAgICBnb3RvIEVYSVQ7CisgICAgfQorCisgICAgc3dpdGNoIChuSW5kZXgpIHsKKyAgICBjYXNlIE9NWF9JbmRleFBhcmFtVmlkZW9BdmM6CisgICAgeworICAgICAgICBPTVhfVklERU9fUEFSQU1fQVZDVFlQRSAqcERzdEFWQ0NvbXBvbmVudCA9IE5VTEw7CisgICAgICAgIE9NWF9WSURFT19QQVJBTV9BVkNUWVBFICpwU3JjQVZDQ29tcG9uZW50ID0gKE9NWF9WSURFT19QQVJBTV9BVkNUWVBFICopcENvbXBvbmVudFBhcmFtZXRlclN0cnVjdHVyZTsKKyAgICAgICAgU0VDX0gyNjRERUNfSEFORExFICAgICAgKnBIMjY0RGVjID0gTlVMTDsKKworICAgICAgICByZXQgPSBTRUNfT01YX0NoZWNrX1NpemVWZXJzaW9uKHBTcmNBVkNDb21wb25lbnQsIHNpemVvZihPTVhfVklERU9fUEFSQU1fQVZDVFlQRSkpOworICAgICAgICBpZiAocmV0ICE9IE9NWF9FcnJvck5vbmUpIHsKKyAgICAgICAgICAgIGdvdG8gRVhJVDsKKyAgICAgICAgfQorCisgICAgICAgIGlmIChwU3JjQVZDQ29tcG9uZW50LT5uUG9ydEluZGV4ID49IEFMTF9QT1JUX05VTSkgeworICAgICAgICAgICAgcmV0ID0gT01YX0Vycm9yQmFkUG9ydEluZGV4OworICAgICAgICAgICAgZ290byBFWElUOworICAgICAgICB9CisKKyAgICAgICAgcEgyNjREZWMgPSAoU0VDX0gyNjRERUNfSEFORExFICopKChTRUNfT01YX1ZJREVPREVDX0NPTVBPTkVOVCAqKXBTRUNDb21wb25lbnQtPmhDb21wb25lbnRIYW5kbGUpLT5oQ29kZWNIYW5kbGU7CisgICAgICAgIHBEc3RBVkNDb21wb25lbnQgPSAmcEgyNjREZWMtPkFWQ0NvbXBvbmVudFtwU3JjQVZDQ29tcG9uZW50LT5uUG9ydEluZGV4XTsKKworICAgICAgICBTRUNfT1NBTF9NZW1jcHkocERzdEFWQ0NvbXBvbmVudCwgcFNyY0FWQ0NvbXBvbmVudCwgc2l6ZW9mKE9NWF9WSURFT19QQVJBTV9BVkNUWVBFKSk7CisgICAgfQorICAgICAgICBicmVhazsKKyAgICBjYXNlIE9NWF9JbmRleFBhcmFtU3RhbmRhcmRDb21wb25lbnRSb2xlOgorICAgIHsKKyAgICAgICAgT01YX1BBUkFNX0NPTVBPTkVOVFJPTEVUWVBFICpwQ29tcG9uZW50Um9sZSA9IChPTVhfUEFSQU1fQ09NUE9ORU5UUk9MRVRZUEUqKXBDb21wb25lbnRQYXJhbWV0ZXJTdHJ1Y3R1cmU7CisKKyAgICAgICAgcmV0ID0gU0VDX09NWF9DaGVja19TaXplVmVyc2lvbihwQ29tcG9uZW50Um9sZSwgc2l6ZW9mKE9NWF9QQVJBTV9DT01QT05FTlRST0xFVFlQRSkpOworICAgICAgICBpZiAocmV0ICE9IE9NWF9FcnJvck5vbmUpIHsKKyAgICAgICAgICAgIGdvdG8gRVhJVDsKKyAgICAgICAgfQorCisgICAgICAgIGlmICgocFNFQ0NvbXBvbmVudC0+Y3VycmVudFN0YXRlICE9IE9NWF9TdGF0ZUxvYWRlZCkgJiYgKHBTRUNDb21wb25lbnQtPmN1cnJlbnRTdGF0ZSAhPSBPTVhfU3RhdGVXYWl0Rm9yUmVzb3VyY2VzKSkgeworICAgICAgICAgICAgcmV0ID0gT01YX0Vycm9ySW5jb3JyZWN0U3RhdGVPcGVyYXRpb247CisgICAgICAgICAgICBnb3RvIEVYSVQ7CisgICAgICAgIH0KKworICAgICAgICBpZiAoIVNFQ19PU0FMX1N0cmNtcCgoY2hhciopcENvbXBvbmVudFJvbGUtPmNSb2xlLCBTRUNfT01YX0NPTVBPTkVOVF9IMjY0X0RFQ19ST0xFKSkgeworICAgICAgICAgICAgcFNFQ0NvbXBvbmVudC0+cFNFQ1BvcnRbSU5QVVRfUE9SVF9JTkRFWF0ucG9ydERlZmluaXRpb24uZm9ybWF0LnZpZGVvLmVDb21wcmVzc2lvbkZvcm1hdCA9IE9NWF9WSURFT19Db2RpbmdBVkM7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICByZXQgPSBPTVhfRXJyb3JCYWRQYXJhbWV0ZXI7CisgICAgICAgICAgICBnb3RvIEVYSVQ7CisgICAgICAgIH0KKyAgICB9CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgT01YX0luZGV4UGFyYW1Qb3J0RGVmaW5pdGlvbjoKKyAgICB7CisgICAgICAgIE9NWF9QQVJBTV9QT1JUREVGSU5JVElPTlRZUEUgKnBQb3J0RGVmaW5pdGlvbiA9IChPTVhfUEFSQU1fUE9SVERFRklOSVRJT05UWVBFICopcENvbXBvbmVudFBhcmFtZXRlclN0cnVjdHVyZTsKKyAgICAgICAgT01YX1UzMiAgICAgICAgICAgICAgICAgICAgICAgcG9ydEluZGV4ID0gcFBvcnREZWZpbml0aW9uLT5uUG9ydEluZGV4OworICAgICAgICBTRUNfT01YX0JBU0VQT1JUICAgICAgICAgICAgICpwU0VDUG9ydDsKKyAgICAgICAgT01YX1UzMiB3aWR0aCwgaGVpZ2h0LCBzaXplOworICAgICAgICBPTVhfVTMyIHJlYWxXaWR0aCwgcmVhbEhlaWdodDsKKworICAgICAgICBpZiAocG9ydEluZGV4ID49IHBTRUNDb21wb25lbnQtPnBvcnRQYXJhbS5uUG9ydHMpIHsKKyAgICAgICAgICAgIHJldCA9IE9NWF9FcnJvckJhZFBvcnRJbmRleDsKKyAgICAgICAgICAgIGdvdG8gRVhJVDsKKyAgICAgICAgfQorICAgICAgICByZXQgPSBTRUNfT01YX0NoZWNrX1NpemVWZXJzaW9uKHBQb3J0RGVmaW5pdGlvbiwgc2l6ZW9mKE9NWF9QQVJBTV9QT1JUREVGSU5JVElPTlRZUEUpKTsKKyAgICAgICAgaWYgKHJldCAhPSBPTVhfRXJyb3JOb25lKSB7CisgICAgICAgICAgICBnb3RvIEVYSVQ7CisgICAgICAgIH0KKworICAgICAgICBwU0VDUG9ydCA9ICZwU0VDQ29tcG9uZW50LT5wU0VDUG9ydFtwb3J0SW5kZXhdOworCisgICAgICAgIGlmICgocFNFQ0NvbXBvbmVudC0+Y3VycmVudFN0YXRlICE9IE9NWF9TdGF0ZUxvYWRlZCkgJiYgKHBTRUNDb21wb25lbnQtPmN1cnJlbnRTdGF0ZSAhPSBPTVhfU3RhdGVXYWl0Rm9yUmVzb3VyY2VzKSkgeworICAgICAgICAgICAgaWYgKHBTRUNQb3J0LT5wb3J0RGVmaW5pdGlvbi5iRW5hYmxlZCA9PSBPTVhfVFJVRSkgeworICAgICAgICAgICAgICAgIHJldCA9IE9NWF9FcnJvckluY29ycmVjdFN0YXRlT3BlcmF0aW9uOworICAgICAgICAgICAgICAgIGdvdG8gRVhJVDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBpZiAocFBvcnREZWZpbml0aW9uLT5uQnVmZmVyQ291bnRBY3R1YWwgPCBwU0VDUG9ydC0+cG9ydERlZmluaXRpb24ubkJ1ZmZlckNvdW50TWluKSB7CisgICAgICAgICAgICByZXQgPSBPTVhfRXJyb3JCYWRQYXJhbWV0ZXI7CisgICAgICAgICAgICBnb3RvIEVYSVQ7CisgICAgICAgIH0KKworICAgICAgICBTRUNfT1NBTF9NZW1jcHkoJnBTRUNQb3J0LT5wb3J0RGVmaW5pdGlvbiwgcFBvcnREZWZpbml0aW9uLCBwUG9ydERlZmluaXRpb24tPm5TaXplKTsKKworICAgICAgICByZWFsV2lkdGggPSBwU0VDUG9ydC0+cG9ydERlZmluaXRpb24uZm9ybWF0LnZpZGVvLm5GcmFtZVdpZHRoOworICAgICAgICByZWFsSGVpZ2h0ID0gcFNFQ1BvcnQtPnBvcnREZWZpbml0aW9uLmZvcm1hdC52aWRlby5uRnJhbWVIZWlnaHQ7CisgICAgICAgIHdpZHRoID0gKChyZWFsV2lkdGggKyAxNSkgJiAofjE1KSk7CisgICAgICAgIGhlaWdodCA9ICgocmVhbEhlaWdodCArIDE1KSAmICh+MTUpKTsKKyAgICAgICAgc2l6ZSA9ICh3aWR0aCAqIGhlaWdodCAqIDMpIC8gMjsKKyAgICAgICAgcFNFQ1BvcnQtPnBvcnREZWZpbml0aW9uLmZvcm1hdC52aWRlby5uU3RyaWRlID0gd2lkdGg7CisgICAgICAgIHBTRUNQb3J0LT5wb3J0RGVmaW5pdGlvbi5mb3JtYXQudmlkZW8ublNsaWNlSGVpZ2h0ID0gaGVpZ2h0OworICAgICAgICBwU0VDUG9ydC0+cG9ydERlZmluaXRpb24ubkJ1ZmZlclNpemUgPSAoc2l6ZSA+IHBTRUNQb3J0LT5wb3J0RGVmaW5pdGlvbi5uQnVmZmVyU2l6ZSkgPyBzaXplIDogcFNFQ1BvcnQtPnBvcnREZWZpbml0aW9uLm5CdWZmZXJTaXplOworCisgICAgICAgIGlmIChwb3J0SW5kZXggPT0gSU5QVVRfUE9SVF9JTkRFWCkgeworICAgICAgICAgICAgU0VDX09NWF9CQVNFUE9SVCAqcFNFQ091dHB1dFBvcnQgPSAmcFNFQ0NvbXBvbmVudC0+cFNFQ1BvcnRbT1VUUFVUX1BPUlRfSU5ERVhdOworICAgICAgICAgICAgcFNFQ091dHB1dFBvcnQtPnBvcnREZWZpbml0aW9uLmZvcm1hdC52aWRlby5uRnJhbWVXaWR0aCA9IHBTRUNQb3J0LT5wb3J0RGVmaW5pdGlvbi5mb3JtYXQudmlkZW8ubkZyYW1lV2lkdGg7CisgICAgICAgICAgICBwU0VDT3V0cHV0UG9ydC0+cG9ydERlZmluaXRpb24uZm9ybWF0LnZpZGVvLm5GcmFtZUhlaWdodCA9IHBTRUNQb3J0LT5wb3J0RGVmaW5pdGlvbi5mb3JtYXQudmlkZW8ubkZyYW1lSGVpZ2h0OworICAgICAgICAgICAgcFNFQ091dHB1dFBvcnQtPnBvcnREZWZpbml0aW9uLmZvcm1hdC52aWRlby5uU3RyaWRlID0gd2lkdGg7CisgICAgICAgICAgICBwU0VDT3V0cHV0UG9ydC0+cG9ydERlZmluaXRpb24uZm9ybWF0LnZpZGVvLm5TbGljZUhlaWdodCA9IGhlaWdodDsKKworICAgICAgICAgICAgc3dpdGNoIChwU0VDT3V0cHV0UG9ydC0+cG9ydERlZmluaXRpb24uZm9ybWF0LnZpZGVvLmVDb2xvckZvcm1hdCkgeworICAgICAgICAgICAgY2FzZSBPTVhfQ09MT1JfRm9ybWF0WVVWNDIwUGxhbmFyOgorICAgICAgICAgICAgY2FzZSBPTVhfQ09MT1JfRm9ybWF0WVVWNDIwU2VtaVBsYW5hcjoKKyAgICAgICAgICAgIGNhc2UgT01YX1NFQ19DT0xPUl9Gb3JtYXROVjEyVFBoeXNpY2FsQWRkcmVzczoKKyAgICAgICAgICAgIGNhc2UgT01YX1NFQ19DT0xPUl9Gb3JtYXRBTkJZVVY0MjBTZW1pUGxhbmFyOgorICAgICAgICAgICAgICAgIHBTRUNPdXRwdXRQb3J0LT5wb3J0RGVmaW5pdGlvbi5uQnVmZmVyU2l6ZSA9ICh3aWR0aCAqIGhlaWdodCAqIDMpIC8gMjsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgT01YX1NFQ19DT0xPUl9Gb3JtYXROVjEyVGlsZWQ6CisgICAgICAgICAgICAgICAgcFNFQ091dHB1dFBvcnQtPnBvcnREZWZpbml0aW9uLm5CdWZmZXJTaXplID0KKyAgICAgICAgICAgICAgICAgICAgQUxJR05fVE9fOEtCKEFMSUdOX1RPXzEyOEIocmVhbFdpZHRoKSAqIEFMSUdOX1RPXzMyQihyZWFsSGVpZ2h0KSkgXAorICAgICAgICAgICAgICAgICAgKyBBTElHTl9UT184S0IoQUxJR05fVE9fMTI4QihyZWFsV2lkdGgpICogQUxJR05fVE9fMzJCKHJlYWxIZWlnaHQvMikpOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICBTRUNfT1NBTF9Mb2coU0VDX0xPR19FUlJPUiwgIkNvbG9yIGZvcm1hdCBpcyBub3Qgc3VwcG9ydCEhIHVzZSBkZWZhdWx0IFlVViBzaXplISEiKTsKKyAgICAgICAgICAgICAgICByZXQgPSBPTVhfRXJyb3JVbnN1cHBvcnRlZFNldHRpbmc7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgT01YX0luZGV4UGFyYW1WaWRlb1Byb2ZpbGVMZXZlbEN1cnJlbnQ6CisgICAgeworICAgICAgICBPTVhfVklERU9fUEFSQU1fUFJPRklMRUxFVkVMVFlQRSAqcFNyY1Byb2ZpbGVMZXZlbCA9IChPTVhfVklERU9fUEFSQU1fUFJPRklMRUxFVkVMVFlQRSAqKXBDb21wb25lbnRQYXJhbWV0ZXJTdHJ1Y3R1cmU7CisgICAgICAgIE9NWF9WSURFT19QQVJBTV9BVkNUWVBFICpwRHN0QVZDQ29tcG9uZW50ID0gTlVMTDsKKyAgICAgICAgU0VDX0gyNjRERUNfSEFORExFICAgICAgKnBIMjY0RGVjID0gTlVMTDsKKworICAgICAgICByZXQgPSBTRUNfT01YX0NoZWNrX1NpemVWZXJzaW9uKHBTcmNQcm9maWxlTGV2ZWwsIHNpemVvZihPTVhfVklERU9fUEFSQU1fUFJPRklMRUxFVkVMVFlQRSkpOworICAgICAgICBpZiAocmV0ICE9IE9NWF9FcnJvck5vbmUpCisgICAgICAgICAgICBnb3RvIEVYSVQ7CisKKyAgICAgICAgaWYgKHBTcmNQcm9maWxlTGV2ZWwtPm5Qb3J0SW5kZXggPj0gQUxMX1BPUlRfTlVNKSB7CisgICAgICAgICAgICByZXQgPSBPTVhfRXJyb3JCYWRQb3J0SW5kZXg7CisgICAgICAgICAgICBnb3RvIEVYSVQ7CisgICAgICAgIH0KKworICAgICAgICBwSDI2NERlYyA9IChTRUNfSDI2NERFQ19IQU5ETEUgKikoKFNFQ19PTVhfVklERU9ERUNfQ09NUE9ORU5UICopcFNFQ0NvbXBvbmVudC0+aENvbXBvbmVudEhhbmRsZSktPmhDb2RlY0hhbmRsZTsKKworICAgICAgICBwRHN0QVZDQ29tcG9uZW50ID0gJnBIMjY0RGVjLT5BVkNDb21wb25lbnRbcFNyY1Byb2ZpbGVMZXZlbC0+blBvcnRJbmRleF07CisgICAgICAgIHBEc3RBVkNDb21wb25lbnQtPmVQcm9maWxlID0gcFNyY1Byb2ZpbGVMZXZlbC0+ZVByb2ZpbGU7CisgICAgICAgIHBEc3RBVkNDb21wb25lbnQtPmVMZXZlbCA9IHBTcmNQcm9maWxlTGV2ZWwtPmVMZXZlbDsKKyAgICB9CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgT01YX0luZGV4UGFyYW1WaWRlb0Vycm9yQ29ycmVjdGlvbjoKKyAgICB7CisgICAgICAgIE9NWF9WSURFT19QQVJBTV9FUlJPUkNPUlJFQ1RJT05UWVBFICpwU3JjRXJyb3JDb3JyZWN0aW9uVHlwZSA9IChPTVhfVklERU9fUEFSQU1fRVJST1JDT1JSRUNUSU9OVFlQRSAqKXBDb21wb25lbnRQYXJhbWV0ZXJTdHJ1Y3R1cmU7CisgICAgICAgIE9NWF9WSURFT19QQVJBTV9FUlJPUkNPUlJFQ1RJT05UWVBFICpwRHN0RXJyb3JDb3JyZWN0aW9uVHlwZSA9IE5VTEw7CisgICAgICAgIFNFQ19IMjY0REVDX0hBTkRMRSAgICAgICpwSDI2NERlYyA9IE5VTEw7CisKKyAgICAgICAgcmV0ID0gU0VDX09NWF9DaGVja19TaXplVmVyc2lvbihwU3JjRXJyb3JDb3JyZWN0aW9uVHlwZSwgc2l6ZW9mKE9NWF9WSURFT19QQVJBTV9FUlJPUkNPUlJFQ1RJT05UWVBFKSk7CisgICAgICAgIGlmIChyZXQgIT0gT01YX0Vycm9yTm9uZSkgeworICAgICAgICAgICAgZ290byBFWElUOworICAgICAgICB9CisKKyAgICAgICAgaWYgKHBTcmNFcnJvckNvcnJlY3Rpb25UeXBlLT5uUG9ydEluZGV4ICE9IElOUFVUX1BPUlRfSU5ERVgpIHsKKyAgICAgICAgICAgIHJldCA9IE9NWF9FcnJvckJhZFBvcnRJbmRleDsKKyAgICAgICAgICAgIGdvdG8gRVhJVDsKKyAgICAgICAgfQorCisgICAgICAgIHBIMjY0RGVjID0gKFNFQ19IMjY0REVDX0hBTkRMRSAqKSgoU0VDX09NWF9WSURFT0RFQ19DT01QT05FTlQgKilwU0VDQ29tcG9uZW50LT5oQ29tcG9uZW50SGFuZGxlKS0+aENvZGVjSGFuZGxlOworICAgICAgICBwRHN0RXJyb3JDb3JyZWN0aW9uVHlwZSA9ICZwSDI2NERlYy0+ZXJyb3JDb3JyZWN0aW9uVHlwZVtJTlBVVF9QT1JUX0lOREVYXTsKKworICAgICAgICBwRHN0RXJyb3JDb3JyZWN0aW9uVHlwZS0+YkVuYWJsZUhFQyA9IHBTcmNFcnJvckNvcnJlY3Rpb25UeXBlLT5iRW5hYmxlSEVDOworICAgICAgICBwRHN0RXJyb3JDb3JyZWN0aW9uVHlwZS0+YkVuYWJsZVJlc3luYyA9IHBTcmNFcnJvckNvcnJlY3Rpb25UeXBlLT5iRW5hYmxlUmVzeW5jOworICAgICAgICBwRHN0RXJyb3JDb3JyZWN0aW9uVHlwZS0+blJlc3luY2hNYXJrZXJTcGFjaW5nID0gcFNyY0Vycm9yQ29ycmVjdGlvblR5cGUtPm5SZXN5bmNoTWFya2VyU3BhY2luZzsKKyAgICAgICAgcERzdEVycm9yQ29ycmVjdGlvblR5cGUtPmJFbmFibGVEYXRhUGFydGl0aW9uaW5nID0gcFNyY0Vycm9yQ29ycmVjdGlvblR5cGUtPmJFbmFibGVEYXRhUGFydGl0aW9uaW5nOworICAgICAgICBwRHN0RXJyb3JDb3JyZWN0aW9uVHlwZS0+YkVuYWJsZVJWTEMgPSBwU3JjRXJyb3JDb3JyZWN0aW9uVHlwZS0+YkVuYWJsZVJWTEM7CisgICAgfQorICAgICAgICBicmVhazsKKyAgICBkZWZhdWx0OgorICAgICAgICByZXQgPSBTRUNfT01YX1ZpZGVvRGVjb2RlU2V0UGFyYW1ldGVyKGhDb21wb25lbnQsIG5JbmRleCwgcENvbXBvbmVudFBhcmFtZXRlclN0cnVjdHVyZSk7CisgICAgICAgIGJyZWFrOworICAgIH0KK0VYSVQ6CisgICAgRnVuY3Rpb25PdXQoKTsKKworICAgIHJldHVybiByZXQ7Cit9CisKK09NWF9FUlJPUlRZUEUgU0VDX01GQ19IMjY0RGVjX0dldENvbmZpZygKKyAgICBPTVhfSEFORExFVFlQRSBoQ29tcG9uZW50LAorICAgIE9NWF9JTkRFWFRZUEUgbkluZGV4LAorICAgIE9NWF9QVFIgcENvbXBvbmVudENvbmZpZ1N0cnVjdHVyZSkKK3sKKyAgICBPTVhfRVJST1JUWVBFICAgICAgICAgIHJldCA9IE9NWF9FcnJvck5vbmU7CisgICAgT01YX0NPTVBPTkVOVFRZUEUgICAgICpwT01YQ29tcG9uZW50ID0gTlVMTDsKKyAgICBTRUNfT01YX0JBU0VDT01QT05FTlQgKnBTRUNDb21wb25lbnQgPSBOVUxMOworCisgICAgRnVuY3Rpb25JbigpOworCisgICAgaWYgKGhDb21wb25lbnQgPT0gTlVMTCkgeworICAgICAgICByZXQgPSBPTVhfRXJyb3JCYWRQYXJhbWV0ZXI7CisgICAgICAgIGdvdG8gRVhJVDsKKyAgICB9CisgICAgcE9NWENvbXBvbmVudCA9IChPTVhfQ09NUE9ORU5UVFlQRSAqKWhDb21wb25lbnQ7CisgICAgcmV0ID0gU0VDX09NWF9DaGVja19TaXplVmVyc2lvbihwT01YQ29tcG9uZW50LCBzaXplb2YoT01YX0NPTVBPTkVOVFRZUEUpKTsKKyAgICBpZiAocmV0ICE9IE9NWF9FcnJvck5vbmUpIHsKKyAgICAgICAgZ290byBFWElUOworICAgIH0KKworICAgIGlmIChwT01YQ29tcG9uZW50LT5wQ29tcG9uZW50UHJpdmF0ZSA9PSBOVUxMKSB7CisgICAgICAgIHJldCA9IE9NWF9FcnJvckJhZFBhcmFtZXRlcjsKKyAgICAgICAgZ290byBFWElUOworICAgIH0KKyAgICBwU0VDQ29tcG9uZW50ID0gKFNFQ19PTVhfQkFTRUNPTVBPTkVOVCAqKXBPTVhDb21wb25lbnQtPnBDb21wb25lbnRQcml2YXRlOworCisgICAgaWYgKHBDb21wb25lbnRDb25maWdTdHJ1Y3R1cmUgPT0gTlVMTCkgeworICAgICAgICByZXQgPSBPTVhfRXJyb3JCYWRQYXJhbWV0ZXI7CisgICAgICAgIGdvdG8gRVhJVDsKKyAgICB9CisgICAgaWYgKHBTRUNDb21wb25lbnQtPmN1cnJlbnRTdGF0ZSA9PSBPTVhfU3RhdGVJbnZhbGlkKSB7CisgICAgICAgIHJldCA9IE9NWF9FcnJvckludmFsaWRTdGF0ZTsKKyAgICAgICAgZ290byBFWElUOworICAgIH0KKworICAgIHN3aXRjaCAobkluZGV4KSB7CisgICAgY2FzZSBPTVhfSW5kZXhDb25maWdDb21tb25PdXRwdXRDcm9wOgorICAgIHsKKyAgICAgICAgU0VDX0gyNjRERUNfSEFORExFICAqcEgyNjREZWMgPSBOVUxMOworICAgICAgICBPTVhfQ09ORklHX1JFQ1RUWVBFICpwU3JjUmVjdFR5cGUgPSBOVUxMOworICAgICAgICBPTVhfQ09ORklHX1JFQ1RUWVBFICpwRHN0UmVjdFR5cGUgPSBOVUxMOworICAgICAgICBwSDI2NERlYyA9IChTRUNfSDI2NERFQ19IQU5ETEUgKikoKFNFQ19PTVhfVklERU9ERUNfQ09NUE9ORU5UICopcFNFQ0NvbXBvbmVudC0+aENvbXBvbmVudEhhbmRsZSktPmhDb2RlY0hhbmRsZTsKKworICAgICAgICBpZiAocEgyNjREZWMtPmhNRkNIMjY0SGFuZGxlLmJDb25maWd1cmVkTUZDID09IE9NWF9GQUxTRSkgeworICAgICAgICAgICAgcmV0ID0gT01YX0Vycm9yTm90UmVhZHk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorCisgICAgICAgIHBEc3RSZWN0VHlwZSA9IChPTVhfQ09ORklHX1JFQ1RUWVBFICopcENvbXBvbmVudENvbmZpZ1N0cnVjdHVyZTsKKworICAgICAgICBpZiAoKHBEc3RSZWN0VHlwZS0+blBvcnRJbmRleCAhPSBJTlBVVF9QT1JUX0lOREVYKSAmJgorICAgICAgICAgICAgKHBEc3RSZWN0VHlwZS0+blBvcnRJbmRleCAhPSBPVVRQVVRfUE9SVF9JTkRFWCkpIHsKKyAgICAgICAgICAgIHJldCA9IE9NWF9FcnJvckJhZFBvcnRJbmRleDsKKyAgICAgICAgICAgIGdvdG8gRVhJVDsKKyAgICAgICAgfQorCisgICAgICAgIFNFQ19PTVhfQkFTRVBPUlQgKnBTRUNQb3J0ID0gJnBTRUNDb21wb25lbnQtPnBTRUNQb3J0W3BEc3RSZWN0VHlwZS0+blBvcnRJbmRleF07CisKKyAgICAgICAgcFNyY1JlY3RUeXBlID0gJihwU0VDUG9ydC0+Y3JvcFJlY3RhbmdsZSk7CisKKyAgICAgICAgcERzdFJlY3RUeXBlLT5uVG9wID0gcFNyY1JlY3RUeXBlLT5uVG9wOworICAgICAgICBwRHN0UmVjdFR5cGUtPm5MZWZ0ID0gcFNyY1JlY3RUeXBlLT5uTGVmdDsKKyAgICAgICAgcERzdFJlY3RUeXBlLT5uSGVpZ2h0ID0gcFNyY1JlY3RUeXBlLT5uSGVpZ2h0OworICAgICAgICBwRHN0UmVjdFR5cGUtPm5XaWR0aCA9IHBTcmNSZWN0VHlwZS0+bldpZHRoOworICAgIH0KKyAgICAgICAgYnJlYWs7CisgICAgZGVmYXVsdDoKKyAgICAgICAgcmV0ID0gU0VDX09NWF9WaWRlb0RlY29kZUdldENvbmZpZyhoQ29tcG9uZW50LCBuSW5kZXgsIHBDb21wb25lbnRDb25maWdTdHJ1Y3R1cmUpOworICAgICAgICBicmVhazsKKyAgICB9CisKK0VYSVQ6CisgICAgRnVuY3Rpb25PdXQoKTsKKworICAgIHJldHVybiByZXQ7Cit9CisKK09NWF9FUlJPUlRZUEUgU0VDX01GQ19IMjY0RGVjX1NldENvbmZpZygKKyAgICBPTVhfSEFORExFVFlQRSBoQ29tcG9uZW50LAorICAgIE9NWF9JTkRFWFRZUEUgbkluZGV4LAorICAgIE9NWF9QVFIgcENvbXBvbmVudENvbmZpZ1N0cnVjdHVyZSkKK3sKKyAgICBPTVhfRVJST1JUWVBFICAgICAgICAgICByZXQgPSBPTVhfRXJyb3JOb25lOworICAgIE9NWF9DT01QT05FTlRUWVBFICAgICAqcE9NWENvbXBvbmVudCA9IE5VTEw7CisgICAgU0VDX09NWF9CQVNFQ09NUE9ORU5UICpwU0VDQ29tcG9uZW50ID0gTlVMTDsKKworICAgIEZ1bmN0aW9uSW4oKTsKKworICAgIGlmIChoQ29tcG9uZW50ID09IE5VTEwpIHsKKyAgICAgICAgcmV0ID0gT01YX0Vycm9yQmFkUGFyYW1ldGVyOworICAgICAgICBnb3RvIEVYSVQ7CisgICAgfQorICAgIHBPTVhDb21wb25lbnQgPSAoT01YX0NPTVBPTkVOVFRZUEUgKiloQ29tcG9uZW50OworICAgIHJldCA9IFNFQ19PTVhfQ2hlY2tfU2l6ZVZlcnNpb24ocE9NWENvbXBvbmVudCwgc2l6ZW9mKE9NWF9DT01QT05FTlRUWVBFKSk7CisgICAgaWYgKHJldCAhPSBPTVhfRXJyb3JOb25lKSB7CisgICAgICAgIGdvdG8gRVhJVDsKKyAgICB9CisKKyAgICBpZiAocE9NWENvbXBvbmVudC0+cENvbXBvbmVudFByaXZhdGUgPT0gTlVMTCkgeworICAgICAgICByZXQgPSBPTVhfRXJyb3JCYWRQYXJhbWV0ZXI7CisgICAgICAgIGdvdG8gRVhJVDsKKyAgICB9CisgICAgcFNFQ0NvbXBvbmVudCA9IChTRUNfT01YX0JBU0VDT01QT05FTlQgKilwT01YQ29tcG9uZW50LT5wQ29tcG9uZW50UHJpdmF0ZTsKKworICAgIGlmIChwQ29tcG9uZW50Q29uZmlnU3RydWN0dXJlID09IE5VTEwpIHsKKyAgICAgICAgcmV0ID0gT01YX0Vycm9yQmFkUGFyYW1ldGVyOworICAgICAgICBnb3RvIEVYSVQ7CisgICAgfQorICAgIGlmIChwU0VDQ29tcG9uZW50LT5jdXJyZW50U3RhdGUgPT0gT01YX1N0YXRlSW52YWxpZCkgeworICAgICAgICByZXQgPSBPTVhfRXJyb3JJbnZhbGlkU3RhdGU7CisgICAgICAgIGdvdG8gRVhJVDsKKyAgICB9CisKKyAgICBzd2l0Y2ggKG5JbmRleCkgeworICAgIGRlZmF1bHQ6CisgICAgICAgIHJldCA9IFNFQ19PTVhfVmlkZW9EZWNvZGVTZXRDb25maWcoaENvbXBvbmVudCwgbkluZGV4LCBwQ29tcG9uZW50Q29uZmlnU3RydWN0dXJlKTsKKyAgICAgICAgYnJlYWs7CisgICAgfQorCitFWElUOgorICAgIEZ1bmN0aW9uT3V0KCk7CisKKyAgICByZXR1cm4gcmV0OworfQorCitPTVhfRVJST1JUWVBFIFNFQ19NRkNfSDI2NERlY19HZXRFeHRlbnNpb25JbmRleCgKKyAgICBPTVhfSU4gT01YX0hBTkRMRVRZUEUgIGhDb21wb25lbnQsCisgICAgT01YX0lOIE9NWF9TVFJJTkcgICAgICBjUGFyYW1ldGVyTmFtZSwKKyAgICBPTVhfT1VUIE9NWF9JTkRFWFRZUEUgKnBJbmRleFR5cGUpCit7CisgICAgT01YX0VSUk9SVFlQRSAgICAgICAgICAgcmV0ID0gT01YX0Vycm9yTm9uZTsKKyAgICBPTVhfQ09NUE9ORU5UVFlQRSAgICAgKnBPTVhDb21wb25lbnQgPSBOVUxMOworICAgIFNFQ19PTVhfQkFTRUNPTVBPTkVOVCAqcFNFQ0NvbXBvbmVudCA9IE5VTEw7CisKKyAgICBGdW5jdGlvbkluKCk7CisKKyAgICBpZiAoaENvbXBvbmVudCA9PSBOVUxMKSB7CisgICAgICAgIHJldCA9IE9NWF9FcnJvckJhZFBhcmFtZXRlcjsKKyAgICAgICAgZ290byBFWElUOworICAgIH0KKyAgICBwT01YQ29tcG9uZW50ID0gKE9NWF9DT01QT05FTlRUWVBFICopaENvbXBvbmVudDsKKyAgICByZXQgPSBTRUNfT01YX0NoZWNrX1NpemVWZXJzaW9uKHBPTVhDb21wb25lbnQsIHNpemVvZihPTVhfQ09NUE9ORU5UVFlQRSkpOworICAgIGlmIChyZXQgIT0gT01YX0Vycm9yTm9uZSkgeworICAgICAgICBnb3RvIEVYSVQ7CisgICAgfQorCisgICAgaWYgKHBPTVhDb21wb25lbnQtPnBDb21wb25lbnRQcml2YXRlID09IE5VTEwpIHsKKyAgICAgICAgcmV0ID0gT01YX0Vycm9yQmFkUGFyYW1ldGVyOworICAgICAgICBnb3RvIEVYSVQ7CisgICAgfQorICAgIHBTRUNDb21wb25lbnQgPSAoU0VDX09NWF9CQVNFQ09NUE9ORU5UICopcE9NWENvbXBvbmVudC0+cENvbXBvbmVudFByaXZhdGU7CisKKyAgICBpZiAoKGNQYXJhbWV0ZXJOYW1lID09IE5VTEwpIHx8IChwSW5kZXhUeXBlID09IE5VTEwpKSB7CisgICAgICAgIHJldCA9IE9NWF9FcnJvckJhZFBhcmFtZXRlcjsKKyAgICAgICAgZ290byBFWElUOworICAgIH0KKyAgICBpZiAocFNFQ0NvbXBvbmVudC0+Y3VycmVudFN0YXRlID09IE9NWF9TdGF0ZUludmFsaWQpIHsKKyAgICAgICAgcmV0ID0gT01YX0Vycm9ySW52YWxpZFN0YXRlOworICAgICAgICBnb3RvIEVYSVQ7CisgICAgfQorCisgICAgaWYgKFNFQ19PU0FMX1N0cmNtcChjUGFyYW1ldGVyTmFtZSwgU0VDX0lOREVYX1BBUkFNX0VOQUJMRV9USFVNQk5BSUwpID09IDApIHsKKyAgICAgICAgU0VDX0gyNjRERUNfSEFORExFICpwSDI2NERlYyA9IChTRUNfSDI2NERFQ19IQU5ETEUgKikoKFNFQ19PTVhfVklERU9ERUNfQ09NUE9ORU5UICopcFNFQ0NvbXBvbmVudC0+aENvbXBvbmVudEhhbmRsZSktPmhDb2RlY0hhbmRsZTsKKworICAgICAgICAqcEluZGV4VHlwZSA9IE9NWF9JbmRleFZlbmRvclRodW1ibmFpbE1vZGU7CisKKyAgICAgICAgcmV0ID0gT01YX0Vycm9yTm9uZTsKKyAgICB9IGVsc2UgeworICAgICAgICByZXQgPSBTRUNfT01YX1ZpZGVvRGVjb2RlR2V0RXh0ZW5zaW9uSW5kZXgoaENvbXBvbmVudCwgY1BhcmFtZXRlck5hbWUsIHBJbmRleFR5cGUpOworICAgIH0KKworRVhJVDoKKyAgICBGdW5jdGlvbk91dCgpOworCisgICAgcmV0dXJuIHJldDsKK30KKworT01YX0VSUk9SVFlQRSBTRUNfTUZDX0gyNjREZWNfQ29tcG9uZW50Um9sZUVudW0oT01YX0hBTkRMRVRZUEUgaENvbXBvbmVudCwgT01YX1U4ICpjUm9sZSwgT01YX1UzMiBuSW5kZXgpCit7CisgICAgT01YX0VSUk9SVFlQRSAgICAgICAgICAgIHJldCA9IE9NWF9FcnJvck5vbmU7CisgICAgT01YX0NPTVBPTkVOVFRZUEUgICAgICAgKnBPTVhDb21wb25lbnQgPSBOVUxMOworICAgIFNFQ19PTVhfQkFTRUNPTVBPTkVOVCAgICpwU0VDQ29tcG9uZW50ID0gTlVMTDsKKworICAgIEZ1bmN0aW9uSW4oKTsKKworICAgIGlmICgoaENvbXBvbmVudCA9PSBOVUxMKSB8fCAoY1JvbGUgPT0gTlVMTCkpIHsKKyAgICAgICAgcmV0ID0gT01YX0Vycm9yQmFkUGFyYW1ldGVyOworICAgICAgICBnb3RvIEVYSVQ7CisgICAgfQorICAgIGlmIChuSW5kZXggPT0gKE1BWF9DT01QT05FTlRfUk9MRV9OVU0tMSkpIHsKKyAgICAgICAgU0VDX09TQUxfU3RyY3B5KChjaGFyICopY1JvbGUsIFNFQ19PTVhfQ09NUE9ORU5UX0gyNjRfREVDX1JPTEUpOworICAgICAgICByZXQgPSBPTVhfRXJyb3JOb25lOworICAgIH0gZWxzZSB7CisgICAgICAgIHJldCA9IE9NWF9FcnJvck5vTW9yZTsKKyAgICB9CisKK0VYSVQ6CisgICAgRnVuY3Rpb25PdXQoKTsKKworICAgIHJldHVybiByZXQ7Cit9CisKK09NWF9FUlJPUlRZUEUgU0VDX01GQ19EZWNvZGVUaHJlYWQoT01YX0hBTkRMRVRZUEUgaENvbXBvbmVudCkKK3sKKyAgICBPTVhfRVJST1JUWVBFICAgICAgICAgIHJldCA9IE9NWF9FcnJvck5vbmU7CisgICAgT01YX0NPTVBPTkVOVFRZUEUgICAgICpwT01YQ29tcG9uZW50ID0gKE9NWF9DT01QT05FTlRUWVBFICopaENvbXBvbmVudDsKKyAgICBTRUNfT01YX0JBU0VDT01QT05FTlQgKnBTRUNDb21wb25lbnQgPSAoU0VDX09NWF9CQVNFQ09NUE9ORU5UICopcE9NWENvbXBvbmVudC0+cENvbXBvbmVudFByaXZhdGU7CisgICAgU0VDX09NWF9WSURFT0RFQ19DT01QT05FTlQgKnBWaWRlb0RlYyA9IChTRUNfT01YX1ZJREVPREVDX0NPTVBPTkVOVCAqKXBTRUNDb21wb25lbnQtPmhDb21wb25lbnRIYW5kbGU7CisgICAgU0VDX0gyNjRERUNfSEFORExFICAgICpwSDI2NERlYyA9IChTRUNfSDI2NERFQ19IQU5ETEUgKilwVmlkZW9EZWMtPmhDb2RlY0hhbmRsZTsKKworICAgIEZ1bmN0aW9uSW4oKTsKKworICAgIGlmIChoQ29tcG9uZW50ID09IE5VTEwpIHsKKyAgICAgICAgcmV0ID0gT01YX0Vycm9yQmFkUGFyYW1ldGVyOworICAgICAgICBnb3RvIEVYSVQ7CisgICAgfQorCisgICAgd2hpbGUgKHBWaWRlb0RlYy0+TkJEZWNUaHJlYWQuYkV4aXREZWNvZGVUaHJlYWQgPT0gT01YX0ZBTFNFKSB7CisgICAgICAgIFNFQ19PU0FMX1NlbWFwaG9yZVdhaXQocFZpZGVvRGVjLT5OQkRlY1RocmVhZC5oRGVjRnJhbWVTdGFydCk7CisKKyAgICAgICAgaWYgKHBWaWRlb0RlYy0+TkJEZWNUaHJlYWQuYkV4aXREZWNvZGVUaHJlYWQgPT0gT01YX0ZBTFNFKSB7CisjaWZkZWYgQ09ORklHX01GQ19GUFMKKyAgICAgICAgICAgIFNFQ19PU0FMX1BlcmZTdGFydChQRVJGX0lEX0RFQyk7CisjZW5kaWYKKyAgICAgICAgICAgIHBIMjY0RGVjLT5oTUZDSDI2NEhhbmRsZS5yZXR1cm5Db2RlYyA9IFNzYlNpcE1mY0RlY0V4ZShwSDI2NERlYy0+aE1GQ0gyNjRIYW5kbGUuaE1GQ0hhbmRsZSwgcFZpZGVvRGVjLT5OQkRlY1RocmVhZC5vbmVGcmFtZVNpemUpOworI2lmZGVmIENPTkZJR19NRkNfRlBTCisgICAgICAgICAgICBTRUNfT1NBTF9QZXJmU3RvcChQRVJGX0lEX0RFQyk7CisjZW5kaWYKKyAgICAgICAgICAgIFNFQ19PU0FMX1NlbWFwaG9yZVBvc3QocFZpZGVvRGVjLT5OQkRlY1RocmVhZC5oRGVjRnJhbWVFbmQpOworICAgICAgICB9CisgICAgfQorCitFWElUOgorICAgIFNFQ19PU0FMX1RocmVhZEV4aXQoTlVMTCk7CisgICAgRnVuY3Rpb25PdXQoKTsKKworICAgIHJldHVybiByZXQ7Cit9CisKKy8qIE1GQyBJbml0ICovCitPTVhfRVJST1JUWVBFIFNFQ19NRkNfSDI2NERlY19Jbml0KE9NWF9DT01QT05FTlRUWVBFICpwT01YQ29tcG9uZW50KQoreworICAgIE9NWF9FUlJPUlRZUEUgICAgICAgICAgcmV0ID0gT01YX0Vycm9yTm9uZTsKKyAgICBTRUNfT01YX0JBU0VDT01QT05FTlQgKnBTRUNDb21wb25lbnQgPSAoU0VDX09NWF9CQVNFQ09NUE9ORU5UICopcE9NWENvbXBvbmVudC0+cENvbXBvbmVudFByaXZhdGU7CisgICAgU0VDX09NWF9WSURFT0RFQ19DT01QT05FTlQgKnBWaWRlb0RlYyA9IChTRUNfT01YX1ZJREVPREVDX0NPTVBPTkVOVCAqKXBTRUNDb21wb25lbnQtPmhDb21wb25lbnRIYW5kbGU7CisgICAgU0VDX09NWF9CQVNFUE9SVCAgICAgICpwU0VDT3V0cHV0UG9ydCA9ICZwU0VDQ29tcG9uZW50LT5wU0VDUG9ydFtPVVRQVVRfUE9SVF9JTkRFWF07CisgICAgU0VDX0gyNjRERUNfSEFORExFICAgICpwSDI2NERlYyA9IE5VTEw7CisgICAgT01YX1BUUiBwU3RyZWFtQnVmZmVyICAgID0gTlVMTDsKKyAgICBPTVhfUFRSIHBTdHJlYW1QaHlCdWZmZXIgPSBOVUxMOworICAgIE9NWF9QVFIgaE1GQ0hhbmRsZTsKKworI2lmZGVmIFMzRF9TVVBQT1JUCisgICAgT01YX1MzMiBzZXRDb25mVmFsICAgICAgID0gMDsKKyNlbmRpZgorICAgIENTQ19NRVRIT0QgY3NjX21ldGhvZCA9IENTQ19NRVRIT0RfU1c7CisKKyNpZmRlZiBDT05GSUdfTUZDX0ZQUworICAgIFNFQ19PU0FMX1BlcmZJbml0KFBFUkZfSURfREVDKTsKKyAgICBTRUNfT1NBTF9QZXJmSW5pdChQRVJGX0lEX0NTQyk7CisjZW5kaWYKKworICAgIHBIMjY0RGVjID0gKFNFQ19IMjY0REVDX0hBTkRMRSAqKSgoU0VDX09NWF9WSURFT0RFQ19DT01QT05FTlQgKilwU0VDQ29tcG9uZW50LT5oQ29tcG9uZW50SGFuZGxlKS0+aENvZGVjSGFuZGxlOworICAgIHBIMjY0RGVjLT5oTUZDSDI2NEhhbmRsZS5iQ29uZmlndXJlZE1GQyA9IE9NWF9GQUxTRTsKKyAgICBwU0VDQ29tcG9uZW50LT5iVXNlRmxhZ0VPRiA9IE9NWF9GQUxTRTsKKyAgICBwU0VDQ29tcG9uZW50LT5iU2F2ZUZsYWdFT1MgPSBPTVhfRkFMU0U7CisKKyAgICAvKiBNRkMoTXVsdGkgRnVuY3Rpb24gQ29kZWMpIGRlY29kZXIgYW5kIENNTShDb2RlYyBNZW1vcnkgTWFuYWdlbWVudCkgZHJpdmVyIG9wZW4gKi8KKyAgICBpZiAocFZpZGVvRGVjLT5iRFJNUGxheWVyTW9kZSA9PSBPTVhfRkFMU0UpIHsKKyAgICAgICAgaE1GQ0hhbmRsZSA9IE5VTEw7CisKKyAgICAgICAgaWYgKHBTRUNPdXRwdXRQb3J0LT5wb3J0RGVmaW5pdGlvbi5mb3JtYXQudmlkZW8uZUNvbG9yRm9ybWF0ID09IE9NWF9TRUNfQ09MT1JfRm9ybWF0TlYxMlRQaHlzaWNhbEFkZHJlc3MpIHsKKyAgICAgICAgICAgIGhNRkNIYW5kbGUgPSAoT01YX1BUUilTc2JTaXBNZmNEZWNPcGVuKCk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBTU0JJUF9NRkNfQlVGRkVSX1RZUEUgYnVmX3R5cGUgPSBDQUNIRTsKKyAgICAgICAgICAgIGhNRkNIYW5kbGUgPSAoT01YX1BUUilTc2JTaXBNZmNEZWNPcGVuRXh0KCZidWZfdHlwZSk7CisgICAgICAgIH0KKworICAgICAgICBpZiAoaE1GQ0hhbmRsZSA9PSBOVUxMKSB7CisgICAgICAgICAgICByZXQgPSBPTVhfRXJyb3JJbnN1ZmZpY2llbnRSZXNvdXJjZXM7CisgICAgICAgICAgICBnb3RvIEVYSVQ7CisgICAgICAgIH0KKyAgICAgICAgcEgyNjREZWMtPmhNRkNIMjY0SGFuZGxlLmhNRkNIYW5kbGUgPSBoTUZDSGFuZGxlOworICAgIH0gZWxzZSB7CisgICAgICAgIGhNRkNIYW5kbGUgPSBwSDI2NERlYy0+aE1GQ0gyNjRIYW5kbGUuaE1GQ0hhbmRsZTsKKyAgICAgICAgcFNFQ0NvbXBvbmVudC0+YlVzZUZsYWdFT0YgPSBPTVhfVFJVRTsKKyAgICB9CisKKyNpZmRlZiBTM0RfU1VQUE9SVAorICAgIC8qRW5hYmxlIFNFSSBwYXJzaW5nIGZvciBjaGVja2luZyBmcmFtZV9wYWNraW5nIFMzRCovCisgICAgc2V0Q29uZlZhbCA9IDE7CisgICAgU3NiU2lwTWZjRGVjU2V0Q29uZmlnKGhNRkNIYW5kbGUsIE1GQ19ERUNfU0VUQ09ORl9TRUlfUEFSU0UsICZzZXRDb25mVmFsKTsKKyNlbmRpZgorCisgICAgLyogQWxsb2NhdGUgZGVjb2RlcidzIGlucHV0IGJ1ZmZlciAqLworICAgIC8qIEdldCBmaXJzdCBpbnB1dCBidWZmZXIgKi8KKyAgICBpZiAocFZpZGVvRGVjLT5iRFJNUGxheWVyTW9kZSA9PSBPTVhfRkFMU0UpIHsKKyAgICAgICAgcFN0cmVhbUJ1ZmZlciA9IFNzYlNpcE1mY0RlY0dldEluQnVmKGhNRkNIYW5kbGUsICZwU3RyZWFtUGh5QnVmZmVyLCBERUZBVUxUX01GQ19JTlBVVF9CVUZGRVJfU0laRSAvIDIpOworICAgICAgICBpZiAocFN0cmVhbUJ1ZmZlciA9PSBOVUxMKSB7CisgICAgICAgICAgICByZXQgPSBPTVhfRXJyb3JJbnN1ZmZpY2llbnRSZXNvdXJjZXM7CisgICAgICAgICAgICBnb3RvIEVYSVQ7CisgICAgICAgIH0KKyAgICAgICAgcFZpZGVvRGVjLT5NRkNEZWNJbnB1dEJ1ZmZlclswXS5WaXJBZGRyID0gcFN0cmVhbUJ1ZmZlcjsKKyAgICAgICAgcFZpZGVvRGVjLT5NRkNEZWNJbnB1dEJ1ZmZlclswXS5QaHlBZGRyID0gcFN0cmVhbVBoeUJ1ZmZlcjsKKyAgICAgICAgcFZpZGVvRGVjLT5NRkNEZWNJbnB1dEJ1ZmZlclswXS5idWZmZXJTaXplID0gREVGQVVMVF9NRkNfSU5QVVRfQlVGRkVSX1NJWkUgLyAyOworICAgICAgICBwVmlkZW9EZWMtPk1GQ0RlY0lucHV0QnVmZmVyWzBdLmRhdGFTaXplID0gMDsKKworI2lmZGVmIE5PTkJMT0NLX01PREVfUFJPQ0VTUworICAgICAgICAvKiBHZXQgc2Vjb25kIGlucHV0IGJ1ZmZlciAqLworICAgICAgICBwU3RyZWFtQnVmZmVyID0gTlVMTDsKKyAgICAgICAgcFN0cmVhbUJ1ZmZlciA9IFNzYlNpcE1mY0RlY0dldEluQnVmKGhNRkNIYW5kbGUsICZwU3RyZWFtUGh5QnVmZmVyLCBERUZBVUxUX01GQ19JTlBVVF9CVUZGRVJfU0laRSAvIDIpOworICAgICAgICBpZiAocFN0cmVhbUJ1ZmZlciA9PSBOVUxMKSB7CisgICAgICAgICAgICByZXQgPSBPTVhfRXJyb3JJbnN1ZmZpY2llbnRSZXNvdXJjZXM7CisgICAgICAgICAgICBnb3RvIEVYSVQ7CisgICAgICAgIH0KKyAgICAgICAgcFZpZGVvRGVjLT5NRkNEZWNJbnB1dEJ1ZmZlclsxXS5WaXJBZGRyID0gcFN0cmVhbUJ1ZmZlcjsKKyAgICAgICAgcFZpZGVvRGVjLT5NRkNEZWNJbnB1dEJ1ZmZlclsxXS5QaHlBZGRyID0gcFN0cmVhbVBoeUJ1ZmZlcjsKKyAgICAgICAgcFZpZGVvRGVjLT5NRkNEZWNJbnB1dEJ1ZmZlclsxXS5idWZmZXJTaXplID0gREVGQVVMVF9NRkNfSU5QVVRfQlVGRkVSX1NJWkUgLyAyOworICAgICAgICBwVmlkZW9EZWMtPk1GQ0RlY0lucHV0QnVmZmVyWzFdLmRhdGFTaXplID0gMDsKKyAgICAgICAgcFZpZGVvRGVjLT5pbmRleElucHV0QnVmZmVyID0gMDsKKworICAgICAgICBwVmlkZW9EZWMtPmJGaXJzdEZyYW1lID0gT01YX1RSVUU7CisKKyAgICAgICAgcFZpZGVvRGVjLT5OQkRlY1RocmVhZC5iRXhpdERlY29kZVRocmVhZCA9IE9NWF9GQUxTRTsKKyAgICAgICAgcFZpZGVvRGVjLT5OQkRlY1RocmVhZC5iRGVjb2RlclJ1biA9IE9NWF9GQUxTRTsKKyAgICAgICAgcFZpZGVvRGVjLT5OQkRlY1RocmVhZC5vbmVGcmFtZVNpemUgPSAwOworICAgICAgICBTRUNfT1NBTF9TZW1hcGhvcmVDcmVhdGUoJihwVmlkZW9EZWMtPk5CRGVjVGhyZWFkLmhEZWNGcmFtZVN0YXJ0KSk7CisgICAgICAgIFNFQ19PU0FMX1NlbWFwaG9yZUNyZWF0ZSgmKHBWaWRlb0RlYy0+TkJEZWNUaHJlYWQuaERlY0ZyYW1lRW5kKSk7CisgICAgICAgIGlmIChPTVhfRXJyb3JOb25lID09IFNFQ19PU0FMX1RocmVhZENyZWF0ZSgmcFZpZGVvRGVjLT5OQkRlY1RocmVhZC5oTkJEZWNvZGVUaHJlYWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU0VDX01GQ19EZWNvZGVUaHJlYWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcE9NWENvbXBvbmVudCkpIHsKKyAgICAgICAgICAgIHBIMjY0RGVjLT5oTUZDSDI2NEhhbmRsZS5yZXR1cm5Db2RlYyA9IE1GQ19SRVRfT0s7CisgICAgICAgIH0KKyNlbmRpZgorCisgICAgICAgIHBIMjY0RGVjLT5oTUZDSDI2NEhhbmRsZS5wTUZDU3RyZWFtQnVmZmVyICAgID0gcFZpZGVvRGVjLT5NRkNEZWNJbnB1dEJ1ZmZlclswXS5WaXJBZGRyOworICAgICAgICBwSDI2NERlYy0+aE1GQ0gyNjRIYW5kbGUucE1GQ1N0cmVhbVBoeUJ1ZmZlciA9IHBWaWRlb0RlYy0+TUZDRGVjSW5wdXRCdWZmZXJbMF0uUGh5QWRkcjsKKyAgICAgICAgcFNFQ0NvbXBvbmVudC0+cHJvY2Vzc0RhdGFbSU5QVVRfUE9SVF9JTkRFWF0uZGF0YUJ1ZmZlciA9IHBWaWRlb0RlYy0+TUZDRGVjSW5wdXRCdWZmZXJbMF0uVmlyQWRkcjsKKyAgICAgICAgcFNFQ0NvbXBvbmVudC0+cHJvY2Vzc0RhdGFbSU5QVVRfUE9SVF9JTkRFWF0uYWxsb2NTaXplID0gcFZpZGVvRGVjLT5NRkNEZWNJbnB1dEJ1ZmZlclswXS5idWZmZXJTaXplOworICAgIH0KKworICAgIFNFQ19PU0FMX01lbXNldChwU0VDQ29tcG9uZW50LT50aW1lU3RhbXAsIC0xOTc3MTAwMywgc2l6ZW9mKE9NWF9USUNLUykgKiBNQVhfVElNRVNUQU1QKTsKKyAgICBTRUNfT1NBTF9NZW1zZXQocFNFQ0NvbXBvbmVudC0+bkZsYWdzLCAwLCBzaXplb2YoT01YX1UzMikgKiBNQVhfRkxBR1MpOworICAgIHBIMjY0RGVjLT5oTUZDSDI2NEhhbmRsZS5pbmRleFRpbWVzdGFtcCA9IDA7CisgICAgcEgyNjREZWMtPmhNRkNIMjY0SGFuZGxlLm91dHB1dEluZGV4VGltZXN0YW1wID0gMDsKKworICAgIHBTRUNDb21wb25lbnQtPmdldEFsbERlbGF5QnVmZmVyID0gT01YX0ZBTFNFOworCisjaWZkZWYgVVNFX0FOQgorI2lmIGRlZmluZWQoVVNFX0NTQ19GSU1DKSB8fCBkZWZpbmVkKFVTRV9DU0NfR1NDQUxFUikKKyAgICBpZiAocFNFQ091dHB1dFBvcnQtPmJJc0FOQkVuYWJsZWQgPT0gT01YX1RSVUUpCisgICAgICAgIGNzY19tZXRob2QgPSBDU0NfTUVUSE9EX1BSRUZFUl9IVzsKKyNlbmRpZgorICAgIGlmIChwVmlkZW9EZWMtPmJEUk1QbGF5ZXJNb2RlID09IE9NWF9UUlVFKSB7CisgICAgICAgIGNzY19tZXRob2QgPSBDU0NfTUVUSE9EX0hXOworICAgIH0KKyNlbmRpZgorICAgIHBWaWRlb0RlYy0+Y3NjX2hhbmRsZSA9IGNzY19pbml0KCZjc2NfbWV0aG9kKTsKKyAgICBwVmlkZW9EZWMtPmNzY19zZXRfZm9ybWF0ID0gT01YX0ZBTFNFOworCisgICAgU0VDX09TQUxfTG9nKFNFQ19MT0dfRVJST1IsICIlczo6Y3NjX21ldGhvZD0lZCIsIF9fZnVuY19fLCBjc2NfbWV0aG9kKTsKKworRVhJVDoKKyAgICBGdW5jdGlvbk91dCgpOworCisgICAgcmV0dXJuIHJldDsKK30KKworLyogTUZDIFRlcm1pbmF0ZSAqLworT01YX0VSUk9SVFlQRSBTRUNfTUZDX0gyNjREZWNfVGVybWluYXRlKE9NWF9DT01QT05FTlRUWVBFICpwT01YQ29tcG9uZW50KQoreworICAgIE9NWF9FUlJPUlRZUEUgICAgICAgICAgcmV0ID0gT01YX0Vycm9yTm9uZTsKKyAgICBTRUNfT01YX0JBU0VDT01QT05FTlQgKnBTRUNDb21wb25lbnQgPSAoU0VDX09NWF9CQVNFQ09NUE9ORU5UICopcE9NWENvbXBvbmVudC0+cENvbXBvbmVudFByaXZhdGU7CisgICAgU0VDX09NWF9WSURFT0RFQ19DT01QT05FTlQgKnBWaWRlb0RlYyA9IChTRUNfT01YX1ZJREVPREVDX0NPTVBPTkVOVCAqKXBTRUNDb21wb25lbnQtPmhDb21wb25lbnRIYW5kbGU7CisgICAgU0VDX0gyNjRERUNfSEFORExFICAgICpwSDI2NERlYyA9IE5VTEw7CisgICAgT01YX1BUUiAgICAgICAgICAgICAgICBoTUZDSGFuZGxlID0gTlVMTDsKKworICAgIEZ1bmN0aW9uSW4oKTsKKworI2lmZGVmIENPTkZJR19NRkNfRlBTCisgICAgU0VDX09TQUxfUGVyZlByaW50KCJbREVDXSIsICBQRVJGX0lEX0RFQyk7CisgICAgU0VDX09TQUxfUGVyZlByaW50KCJbQ1NDXSIsICBQRVJGX0lEX0NTQyk7CisjZW5kaWYKKworICAgIHBIMjY0RGVjID0gKFNFQ19IMjY0REVDX0hBTkRMRSAqKSgoU0VDX09NWF9WSURFT0RFQ19DT01QT05FTlQgKilwU0VDQ29tcG9uZW50LT5oQ29tcG9uZW50SGFuZGxlKS0+aENvZGVjSGFuZGxlOworICAgIGhNRkNIYW5kbGUgPSBwSDI2NERlYy0+aE1GQ0gyNjRIYW5kbGUuaE1GQ0hhbmRsZTsKKworICAgIHBIMjY0RGVjLT5oTUZDSDI2NEhhbmRsZS5wTUZDU3RyZWFtQnVmZmVyICAgID0gTlVMTDsKKyAgICBwSDI2NERlYy0+aE1GQ0gyNjRIYW5kbGUucE1GQ1N0cmVhbVBoeUJ1ZmZlciA9IE5VTEw7CisgICAgcFNFQ0NvbXBvbmVudC0+cHJvY2Vzc0RhdGFbSU5QVVRfUE9SVF9JTkRFWF0uZGF0YUJ1ZmZlciA9IE5VTEw7CisgICAgcFNFQ0NvbXBvbmVudC0+cHJvY2Vzc0RhdGFbSU5QVVRfUE9SVF9JTkRFWF0uYWxsb2NTaXplID0gMDsKKworICAgIGlmIChwVmlkZW9EZWMtPmJEUk1QbGF5ZXJNb2RlID09IE9NWF9GQUxTRSkgeworI2lmZGVmIE5PTkJMT0NLX01PREVfUFJPQ0VTUworICAgICAgICBpZiAocFZpZGVvRGVjLT5OQkRlY1RocmVhZC5oTkJEZWNvZGVUaHJlYWQgIT0gTlVMTCkgeworICAgICAgICAgICAgcFZpZGVvRGVjLT5OQkRlY1RocmVhZC5iRXhpdERlY29kZVRocmVhZCA9IE9NWF9UUlVFOworICAgICAgICAgICAgU0VDX09TQUxfU2VtYXBob3JlUG9zdChwVmlkZW9EZWMtPk5CRGVjVGhyZWFkLmhEZWNGcmFtZVN0YXJ0KTsKKyAgICAgICAgICAgIFNFQ19PU0FMX1RocmVhZFRlcm1pbmF0ZShwVmlkZW9EZWMtPk5CRGVjVGhyZWFkLmhOQkRlY29kZVRocmVhZCk7CisgICAgICAgICAgICBwVmlkZW9EZWMtPk5CRGVjVGhyZWFkLmhOQkRlY29kZVRocmVhZCA9IE5VTEw7CisgICAgICAgIH0KKworICAgICAgICBpZihwVmlkZW9EZWMtPk5CRGVjVGhyZWFkLmhEZWNGcmFtZUVuZCAhPSBOVUxMKSB7CisgICAgICAgICAgICBTRUNfT1NBTF9TZW1hcGhvcmVUZXJtaW5hdGUocFZpZGVvRGVjLT5OQkRlY1RocmVhZC5oRGVjRnJhbWVFbmQpOworICAgICAgICAgICAgcFZpZGVvRGVjLT5OQkRlY1RocmVhZC5oRGVjRnJhbWVFbmQgPSBOVUxMOworICAgICAgICB9CisKKyAgICAgICAgaWYocFZpZGVvRGVjLT5OQkRlY1RocmVhZC5oRGVjRnJhbWVTdGFydCAhPSBOVUxMKSB7CisgICAgICAgICAgICBTRUNfT1NBTF9TZW1hcGhvcmVUZXJtaW5hdGUocFZpZGVvRGVjLT5OQkRlY1RocmVhZC5oRGVjRnJhbWVTdGFydCk7CisgICAgICAgICAgIHBWaWRlb0RlYy0+TkJEZWNUaHJlYWQuaERlY0ZyYW1lU3RhcnQgPSBOVUxMOworICAgICAgICB9CisjZW5kaWYKKyAgICB9CisKKyAgICBpZiAocFZpZGVvRGVjLT5iRFJNUGxheWVyTW9kZSA9PSBPTVhfRkFMU0UpIHsKKyAgICAgICAgaWYgKGhNRkNIYW5kbGUgIT0gTlVMTCkgeworICAgICAgICAgICAgU3NiU2lwTWZjRGVjQ2xvc2UoaE1GQ0hhbmRsZSk7CisgICAgICAgICAgICBoTUZDSGFuZGxlID0gcEgyNjREZWMtPmhNRkNIMjY0SGFuZGxlLmhNRkNIYW5kbGUgPSBOVUxMOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKHBWaWRlb0RlYy0+Y3NjX2hhbmRsZSAhPSBOVUxMKSB7CisgICAgICAgIGNzY19kZWluaXQocFZpZGVvRGVjLT5jc2NfaGFuZGxlKTsKKyAgICAgICAgcFZpZGVvRGVjLT5jc2NfaGFuZGxlID0gTlVMTDsKKyAgICB9CisKK0VYSVQ6CisgICAgRnVuY3Rpb25PdXQoKTsKKworICAgIHJldHVybiByZXQ7Cit9CisKK09NWF9FUlJPUlRZUEUgU0VDX01GQ19IMjY0X0RlY29kZV9Ob25ibG9jayhPTVhfQ09NUE9ORU5UVFlQRSAqcE9NWENvbXBvbmVudCwgU0VDX09NWF9EQVRBICpwSW5wdXREYXRhLCBTRUNfT01YX0RBVEEgKnBPdXRwdXREYXRhKQoreworICAgIE9NWF9FUlJPUlRZUEUgICAgICAgICAgICAgICByZXQgPSBPTVhfRXJyb3JOb25lOworICAgIFNFQ19PTVhfQkFTRUNPTVBPTkVOVCAgICAgICpwU0VDQ29tcG9uZW50ID0gKFNFQ19PTVhfQkFTRUNPTVBPTkVOVCAqKXBPTVhDb21wb25lbnQtPnBDb21wb25lbnRQcml2YXRlOworICAgIFNFQ19PTVhfVklERU9ERUNfQ09NUE9ORU5UICpwVmlkZW9EZWMgPSAoU0VDX09NWF9WSURFT0RFQ19DT01QT05FTlQgKilwU0VDQ29tcG9uZW50LT5oQ29tcG9uZW50SGFuZGxlOworICAgIFNFQ19IMjY0REVDX0hBTkRMRSAgICAgICAgICpwSDI2NERlYyA9IChTRUNfSDI2NERFQ19IQU5ETEUgKikoKFNFQ19PTVhfVklERU9ERUNfQ09NUE9ORU5UICopcFNFQ0NvbXBvbmVudC0+aENvbXBvbmVudEhhbmRsZSktPmhDb2RlY0hhbmRsZTsKKyAgICBTRUNfT01YX0JBU0VQT1JUICAgICAgICAgICAqcFNFQ0lucHV0UG9ydCA9ICZwU0VDQ29tcG9uZW50LT5wU0VDUG9ydFtJTlBVVF9QT1JUX0lOREVYXTsKKyAgICBTRUNfT01YX0JBU0VQT1JUICAgICAgICAgICAqcFNFQ091dHB1dFBvcnQgPSAmcFNFQ0NvbXBvbmVudC0+cFNFQ1BvcnRbT1VUUFVUX1BPUlRfSU5ERVhdOworICAgIE9NWF9VMzIgICAgICAgICAgICAgICAgICAgICBvbmVGcmFtZVNpemUgPSBwSW5wdXREYXRhLT5kYXRhTGVuOworICAgIFNTQlNJUF9NRkNfREVDX09VVFBVVF9JTkZPICBvdXRwdXRJbmZvOworICAgIE9NWF9TMzIgICAgICAgICAgICAgICAgICAgICBzZXRDb25mVmFsID0gMDsKKyAgICBpbnQgICAgICAgICAgICAgICAgICAgICAgICAgYnVmV2lkdGggPSAwOworICAgIGludCAgICAgICAgICAgICAgICAgICAgICAgICBidWZIZWlnaHQgPSAwOworICAgIE9NWF9VMzIgICAgICAgICAgICAgICAgICAgICBGcmFtZUJ1ZmZlcllTaXplID0gMDsKKyAgICBPTVhfVTMyICAgICAgICAgICAgICAgICAgICAgRnJhbWVCdWZmZXJVVlNpemUgPSAwOworICAgIE9NWF9CT09MICAgICAgICAgICAgICAgICAgICBvdXRwdXREYXRhVmFsaWQgPSBPTVhfRkFMU0U7CisjaWZkZWYgUzNEX1NVUFBPUlQKKyAgICBTU0JTSVBfTUZDX0ZSQU1FX1BBQ0tJTkcgICAgZnJhbWVfcGFja2luZzsKKyNlbmRpZgorCisgICAgRnVuY3Rpb25JbigpOworCisgICAgaWYgKHBIMjY0RGVjLT5oTUZDSDI2NEhhbmRsZS5iQ29uZmlndXJlZE1GQyA9PSBPTVhfRkFMU0UpIHsKKyAgICAgICAgU1NCU0lQX01GQ19DT0RFQ19UWVBFIGVDb2RlY1R5cGUgPSBIMjY0X0RFQzsKKworICAgICAgICBpZiAoKG9uZUZyYW1lU2l6ZSA8PSAwKSAmJiAocElucHV0RGF0YS0+bkZsYWdzICYgT01YX0JVRkZFUkZMQUdfRU9TKSkgeworICAgICAgICAgICAgcE91dHB1dERhdGEtPnRpbWVTdGFtcCA9IHBJbnB1dERhdGEtPnRpbWVTdGFtcDsKKyAgICAgICAgICAgIHBPdXRwdXREYXRhLT5uRmxhZ3MgPSBwSW5wdXREYXRhLT5uRmxhZ3M7CisgICAgICAgICAgICByZXQgPSBPTVhfRXJyb3JOb25lOworICAgICAgICAgICAgZ290byBFWElUOworICAgICAgICB9CisKKyAgICAgICAgLyogRGVmYXVsdCBudW1iZXIgaW4gdGhlIGRyaXZlciBpcyBvcHRpbWl6ZWQgKi8KKyAgICAgICAgaWYgKHBWaWRlb0RlYy0+YlRodW1ibmFpbE1vZGUgPT0gT01YX1RSVUUpIHsKKyAgICAgICAgICAgIHNldENvbmZWYWwgPSAwOworICAgICAgICAgICAgU3NiU2lwTWZjRGVjU2V0Q29uZmlnKHBIMjY0RGVjLT5oTUZDSDI2NEhhbmRsZS5oTUZDSGFuZGxlLCBNRkNfREVDX1NFVENPTkZfRElTUExBWV9ERUxBWSwgJnNldENvbmZWYWwpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgc2V0Q29uZlZhbCA9IEgyNjRfREVDX05VTV9PRl9FWFRSQV9CVUZGRVJTOworICAgICAgICAgICAgU3NiU2lwTWZjRGVjU2V0Q29uZmlnKHBIMjY0RGVjLT5oTUZDSDI2NEhhbmRsZS5oTUZDSGFuZGxlLCBNRkNfREVDX1NFVENPTkZfRVhUUkFfQlVGRkVSX05VTSwgJnNldENvbmZWYWwpOworCisgICAgICAgICAgICBzZXRDb25mVmFsID0gODsKKyAgICAgICAgICAgIFNzYlNpcE1mY0RlY1NldENvbmZpZyhwSDI2NERlYy0+aE1GQ0gyNjRIYW5kbGUuaE1GQ0hhbmRsZSwgTUZDX0RFQ19TRVRDT05GX0RJU1BMQVlfREVMQVksICZzZXRDb25mVmFsKTsKKyAgICAgICAgfQorCisgICAgICAgIFNzYlNpcE1mY0RlY1NldEluQnVmKHBIMjY0RGVjLT5oTUZDSDI2NEhhbmRsZS5oTUZDSGFuZGxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwSDI2NERlYy0+aE1GQ0gyNjRIYW5kbGUucE1GQ1N0cmVhbVBoeUJ1ZmZlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcEgyNjREZWMtPmhNRkNIMjY0SGFuZGxlLnBNRkNTdHJlYW1CdWZmZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBTRUNDb21wb25lbnQtPnByb2Nlc3NEYXRhW0lOUFVUX1BPUlRfSU5ERVhdLmFsbG9jU2l6ZSk7CisKKyAgICAgICAgcEgyNjREZWMtPmhNRkNIMjY0SGFuZGxlLnJldHVybkNvZGVjID0gU3NiU2lwTWZjRGVjSW5pdChwSDI2NERlYy0+aE1GQ0gyNjRIYW5kbGUuaE1GQ0hhbmRsZSwgZUNvZGVjVHlwZSwgb25lRnJhbWVTaXplKTsKKyAgICAgICAgaWYgKHBIMjY0RGVjLT5oTUZDSDI2NEhhbmRsZS5yZXR1cm5Db2RlYyA9PSBNRkNfUkVUX09LKSB7CisgICAgICAgICAgICBTU0JTSVBfTUZDX0lNR19SRVNPTFVUSU9OIGltZ1Jlc29sOworICAgICAgICAgICAgU1NCU0lQX01GQ19DUk9QX0lORk9STUFUSU9OIGNyb3BJbmZvOworCisgICAgICAgICAgICBTc2JTaXBNZmNEZWNHZXRDb25maWcocEgyNjREZWMtPmhNRkNIMjY0SGFuZGxlLmhNRkNIYW5kbGUsIE1GQ19ERUNfR0VUQ09ORl9CVUZfV0lEVEhfSEVJR0hULCAmaW1nUmVzb2wpOworICAgICAgICAgICAgU0VDX09TQUxfTG9nKFNFQ19MT0dfVFJBQ0UsICJzZXQgd2lkdGggaGVpZ2h0IGluZm9ybWF0aW9uIDogJWQsICVkIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBwU0VDSW5wdXRQb3J0LT5wb3J0RGVmaW5pdGlvbi5mb3JtYXQudmlkZW8ubkZyYW1lV2lkdGgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcFNFQ0lucHV0UG9ydC0+cG9ydERlZmluaXRpb24uZm9ybWF0LnZpZGVvLm5GcmFtZUhlaWdodCk7CisgICAgICAgICAgICBTRUNfT1NBTF9Mb2coU0VDX0xPR19UUkFDRSwgIm1mYyB3aWR0aCBoZWlnaHQgaW5mb3JtYXRpb24gOiAlZCwgJWQiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGltZ1Jlc29sLndpZHRoLCBpbWdSZXNvbC5oZWlnaHQpOworCisgICAgICAgICAgICBTc2JTaXBNZmNEZWNHZXRDb25maWcocEgyNjREZWMtPmhNRkNIMjY0SGFuZGxlLmhNRkNIYW5kbGUsIE1GQ19ERUNfR0VUQ09ORl9DUk9QX0lORk8sICZjcm9wSW5mbyk7CisgICAgICAgICAgICBTRUNfT1NBTF9Mb2coU0VDX0xPR19UUkFDRSwgIm1mYyBjcm9wX3RvcCBjcm9wX2JvdHRvbSBjcm9wX2xlZnQgY3JvcF9yaWdodCA6ICAlZCwgJWQsICVkLCAlZCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY3JvcEluZm8uY3JvcF90b3Bfb2Zmc2V0ICwgY3JvcEluZm8uY3JvcF9ib3R0b21fb2Zmc2V0ICwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjcm9wSW5mby5jcm9wX2xlZnRfb2Zmc2V0ICwgY3JvcEluZm8uY3JvcF9yaWdodF9vZmZzZXQpOworCisgICAgICAgICAgICBwU0VDT3V0cHV0UG9ydC0+Y3JvcFJlY3RhbmdsZS5uVG9wICAgID0gY3JvcEluZm8uY3JvcF90b3Bfb2Zmc2V0OworICAgICAgICAgICAgcFNFQ091dHB1dFBvcnQtPmNyb3BSZWN0YW5nbGUubkxlZnQgICA9IGNyb3BJbmZvLmNyb3BfbGVmdF9vZmZzZXQ7CisgICAgICAgICAgICBwU0VDT3V0cHV0UG9ydC0+Y3JvcFJlY3RhbmdsZS5uV2lkdGggID0gaW1nUmVzb2wud2lkdGggLSBjcm9wSW5mby5jcm9wX2xlZnRfb2Zmc2V0IC0gY3JvcEluZm8uY3JvcF9yaWdodF9vZmZzZXQ7CisgICAgICAgICAgICBwU0VDT3V0cHV0UG9ydC0+Y3JvcFJlY3RhbmdsZS5uSGVpZ2h0ID0gaW1nUmVzb2wuaGVpZ2h0IC0gY3JvcEluZm8uY3JvcF90b3Bfb2Zmc2V0IC0gY3JvcEluZm8uY3JvcF9ib3R0b21fb2Zmc2V0OworCisgICAgICAgICAgICBwSDI2NERlYy0+aE1GQ0gyNjRIYW5kbGUuYkNvbmZpZ3VyZWRNRkMgPSBPTVhfVFJVRTsKKworICAgICAgICAgICAgLyoqIFVwZGF0ZSBGcmFtZSBTaXplICoqLworICAgICAgICAgICAgaWYgKChjcm9wSW5mby5jcm9wX2xlZnRfb2Zmc2V0ICE9IDApIHx8IChjcm9wSW5mby5jcm9wX3JpZ2h0X29mZnNldCAhPSAwKSB8fAorICAgICAgICAgICAgICAgIChjcm9wSW5mby5jcm9wX3RvcF9vZmZzZXQgIT0gMCkgfHwgKGNyb3BJbmZvLmNyb3BfYm90dG9tX29mZnNldCAhPSAwKSkgeworICAgICAgICAgICAgICAgIC8qIGNoYW5nZSB3aWR0aCBhbmQgaGVpZ2h0IGluZm9ybWF0aW9uICovCisgICAgICAgICAgICAgICAgcFNFQ0lucHV0UG9ydC0+cG9ydERlZmluaXRpb24uZm9ybWF0LnZpZGVvLm5GcmFtZVdpZHRoID0gaW1nUmVzb2wud2lkdGg7CisgICAgICAgICAgICAgICAgcFNFQ0lucHV0UG9ydC0+cG9ydERlZmluaXRpb24uZm9ybWF0LnZpZGVvLm5GcmFtZUhlaWdodCA9IGltZ1Jlc29sLmhlaWdodDsKKyAgICAgICAgICAgICAgICBwU0VDSW5wdXRQb3J0LT5wb3J0RGVmaW5pdGlvbi5mb3JtYXQudmlkZW8ublN0cmlkZSAgICAgID0gKChpbWdSZXNvbC53aWR0aCArIDE1KSAmICh+MTUpKTsKKyAgICAgICAgICAgICAgICBwU0VDSW5wdXRQb3J0LT5wb3J0RGVmaW5pdGlvbi5mb3JtYXQudmlkZW8ublNsaWNlSGVpZ2h0ID0gKChpbWdSZXNvbC5oZWlnaHQgKyAxNSkgJiAofjE1KSk7CisKKyAgICAgICAgICAgICAgICBTRUNfVXBkYXRlRnJhbWVTaXplKHBPTVhDb21wb25lbnQpOworCisgICAgICAgICAgICAgICAgLyoqIFNlbmQgY3JvcCBpbmZvIGNhbGwgYmFjayAqKi8KKyAgICAgICAgICAgICAgICAoKihwU0VDQ29tcG9uZW50LT5wQ2FsbGJhY2tzLT5FdmVudEhhbmRsZXIpKQorICAgICAgICAgICAgICAgICAgICAgIChwT01YQ29tcG9uZW50LAorICAgICAgICAgICAgICAgICAgICAgICBwU0VDQ29tcG9uZW50LT5jYWxsYmFja0RhdGEsCisgICAgICAgICAgICAgICAgICAgICAgIE9NWF9FdmVudFBvcnRTZXR0aW5nc0NoYW5nZWQsIC8qIFRoZSBjb21tYW5kIHdhcyBjb21wbGV0ZWQgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgT01YX0Rpck91dHB1dCwgLyogVGhpcyBpcyB0aGUgcG9ydCBpbmRleCAqLworICAgICAgICAgICAgICAgICAgICAgICBPTVhfSW5kZXhDb25maWdDb21tb25PdXRwdXRDcm9wLAorICAgICAgICAgICAgICAgICAgICAgICBOVUxMKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmICgocFNFQ0lucHV0UG9ydC0+cG9ydERlZmluaXRpb24uZm9ybWF0LnZpZGVvLm5GcmFtZVdpZHRoICE9ICh1bnNpZ25lZCBpbnQpaW1nUmVzb2wud2lkdGgpIHx8CisgICAgICAgICAgICAgICAgKHBTRUNJbnB1dFBvcnQtPnBvcnREZWZpbml0aW9uLmZvcm1hdC52aWRlby5uRnJhbWVIZWlnaHQgIT0gKHVuc2lnbmVkIGludClpbWdSZXNvbC5oZWlnaHQpKSB7CisgICAgICAgICAgICAgICAgU0VDX09TQUxfTG9nKFNFQ19MT0dfVFJBQ0UsICJjaGFuZ2Ugd2lkdGggaGVpZ2h0IGluZm9ybWF0aW9uIDogT01YX0V2ZW50UG9ydFNldHRpbmdzQ2hhbmdlZCIpOworCisgICAgICAgICAgICAgICAgLyogY2hhbmdlIHdpZHRoIGFuZCBoZWlnaHQgaW5mb3JtYXRpb24gKi8KKyAgICAgICAgICAgICAgICBwU0VDSW5wdXRQb3J0LT5wb3J0RGVmaW5pdGlvbi5mb3JtYXQudmlkZW8ubkZyYW1lV2lkdGggPSBpbWdSZXNvbC53aWR0aDsKKyAgICAgICAgICAgICAgICBwU0VDSW5wdXRQb3J0LT5wb3J0RGVmaW5pdGlvbi5mb3JtYXQudmlkZW8ubkZyYW1lSGVpZ2h0ID0gaW1nUmVzb2wuaGVpZ2h0OworICAgICAgICAgICAgICAgIHBTRUNJbnB1dFBvcnQtPnBvcnREZWZpbml0aW9uLmZvcm1hdC52aWRlby5uU3RyaWRlICAgICAgPSAoKGltZ1Jlc29sLndpZHRoICsgMTUpICYgKH4xNSkpOworICAgICAgICAgICAgICAgIHBTRUNJbnB1dFBvcnQtPnBvcnREZWZpbml0aW9uLmZvcm1hdC52aWRlby5uU2xpY2VIZWlnaHQgPSAoKGltZ1Jlc29sLmhlaWdodCArIDE1KSAmICh+MTUpKTsKKworICAgICAgICAgICAgICAgIFNFQ19VcGRhdGVGcmFtZVNpemUocE9NWENvbXBvbmVudCk7CisKKyAgICAgICAgICAgICAgICAvKiogU2VuZCBQb3J0IFNldHRpbmdzIGNoYW5nZWQgY2FsbCBiYWNrICoqLworICAgICAgICAgICAgICAgICgqKHBTRUNDb21wb25lbnQtPnBDYWxsYmFja3MtPkV2ZW50SGFuZGxlcikpCisgICAgICAgICAgICAgICAgICAgICAgKHBPTVhDb21wb25lbnQsCisgICAgICAgICAgICAgICAgICAgICAgIHBTRUNDb21wb25lbnQtPmNhbGxiYWNrRGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgT01YX0V2ZW50UG9ydFNldHRpbmdzQ2hhbmdlZCwgLyogVGhlIGNvbW1hbmQgd2FzIGNvbXBsZXRlZCAqLworICAgICAgICAgICAgICAgICAgICAgICBPTVhfRGlyT3V0cHV0LCAvKiBUaGlzIGlzIHRoZSBwb3J0IGluZGV4ICovCisgICAgICAgICAgICAgICAgICAgICAgIDAsCisgICAgICAgICAgICAgICAgICAgICAgIE5VTEwpOworICAgICAgICAgICAgfQorCisjaWZkZWYgQUREX1NQU19QUFNfSV9GUkFNRQorICAgICAgICAgICAgcmV0ID0gT01YX0Vycm9ySW5wdXREYXRhRGVjb2RlWWV0OworI2Vsc2UKKyAgICAgICAgICAgIHBPdXRwdXREYXRhLT50aW1lU3RhbXAgPSBwSW5wdXREYXRhLT50aW1lU3RhbXA7CisgICAgICAgICAgICBwT3V0cHV0RGF0YS0+bkZsYWdzID0gcElucHV0RGF0YS0+bkZsYWdzOworCisgICAgICAgICAgICByZXQgPSBPTVhfRXJyb3JOb25lOworI2VuZGlmCisgICAgICAgICAgICBnb3RvIEVYSVQ7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICByZXQgPSBPTVhfRXJyb3JNRkNJbml0OworICAgICAgICAgICAgZ290byBFWElUOworICAgICAgICB9CisgICAgfQorCisjaWZuZGVmIEZVTExfRlJBTUVfU0VBUkNICisgICAgaWYgKChwSW5wdXREYXRhLT5uRmxhZ3MgJiBPTVhfQlVGRkVSRkxBR19FTkRPRkZSQU1FKSAmJgorICAgICAgICAocFNFQ0NvbXBvbmVudC0+YlVzZUZsYWdFT0YgPT0gT01YX0ZBTFNFKSkKKyAgICAgICAgcFNFQ0NvbXBvbmVudC0+YlVzZUZsYWdFT0YgPSBPTVhfVFJVRTsKKyNlbmRpZgorCisgICAgcFNFQ0NvbXBvbmVudC0+dGltZVN0YW1wW3BIMjY0RGVjLT5oTUZDSDI2NEhhbmRsZS5pbmRleFRpbWVzdGFtcF0gPSBwSW5wdXREYXRhLT50aW1lU3RhbXA7CisgICAgcFNFQ0NvbXBvbmVudC0+bkZsYWdzW3BIMjY0RGVjLT5oTUZDSDI2NEhhbmRsZS5pbmRleFRpbWVzdGFtcF0gPSBwSW5wdXREYXRhLT5uRmxhZ3M7CisKKyAgICBpZiAoKHBIMjY0RGVjLT5oTUZDSDI2NEhhbmRsZS5yZXR1cm5Db2RlYyA9PSBNRkNfUkVUX09LKSAmJgorICAgICAgICAocFZpZGVvRGVjLT5iRmlyc3RGcmFtZSA9PSBPTVhfRkFMU0UpKSB7CisgICAgICAgIFNTQlNJUF9NRkNfREVDX09VVEJVRl9TVEFUVVMgc3RhdHVzOworICAgICAgICBPTVhfUzMyIGluZGV4VGltZXN0YW1wID0gMDsKKworICAgICAgICAvKiB3YWl0IGZvciBtZmMgZGVjb2RlIGRvbmUgKi8KKyAgICAgICAgaWYgKHBWaWRlb0RlYy0+TkJEZWNUaHJlYWQuYkRlY29kZXJSdW4gPT0gT01YX1RSVUUpIHsKKyAgICAgICAgICAgIFNFQ19PU0FMX1NlbWFwaG9yZVdhaXQocFZpZGVvRGVjLT5OQkRlY1RocmVhZC5oRGVjRnJhbWVFbmQpOworICAgICAgICAgICAgcFZpZGVvRGVjLT5OQkRlY1RocmVhZC5iRGVjb2RlclJ1biA9IE9NWF9GQUxTRTsKKyAgICAgICAgfQorCisgICAgICAgIFNFQ19PU0FMX1NsZWVwTWlsbGlzZWMoMCk7CisgICAgICAgIHN0YXR1cyA9IFNzYlNpcE1mY0RlY0dldE91dEJ1ZihwSDI2NERlYy0+aE1GQ0gyNjRIYW5kbGUuaE1GQ0hhbmRsZSwgJm91dHB1dEluZm8pOworICAgICAgICBidWZXaWR0aCA9IChvdXRwdXRJbmZvLmltZ193aWR0aCArIDE1KSAmICh+MTUpOworICAgICAgICBidWZIZWlnaHQgPSAob3V0cHV0SW5mby5pbWdfaGVpZ2h0ICsgMTUpICYgKH4xNSk7CisgICAgICAgIEZyYW1lQnVmZmVyWVNpemUgPSBBTElHTl9UT184S0IoQUxJR05fVE9fMTI4QihvdXRwdXRJbmZvLmltZ193aWR0aCkgKiBBTElHTl9UT18zMkIob3V0cHV0SW5mby5pbWdfaGVpZ2h0KSk7CisgICAgICAgIEZyYW1lQnVmZmVyVVZTaXplID0gQUxJR05fVE9fOEtCKEFMSUdOX1RPXzEyOEIob3V0cHV0SW5mby5pbWdfd2lkdGgpICogQUxJR05fVE9fMzJCKG91dHB1dEluZm8uaW1nX2hlaWdodC8yKSk7CisKKyNpZmRlZiBTM0RfU1VQUE9SVAorICAgICAgICAvKiBDaGVjayBXaGV0aGVyIGZyYW1lIHBhY2tpbmcgaW5mb3JtYXRpb24gaXMgYXZhaWxhYmxlICovCisgICAgICAgIFNzYlNpcE1mY0RlY0dldENvbmZpZyhwSDI2NERlYy0+aE1GQ0gyNjRIYW5kbGUuaE1GQ0hhbmRsZSwgTUZDX0RFQ19HRVRDT05GX0ZSQU1FX1BBQ0tJTkcsICZmcmFtZV9wYWNraW5nKTsKKworICAgICAgICBpZiAocFZpZGVvRGVjLT5iVGh1bWJuYWlsTW9kZSA9PSBPTVhfRkFMU0UgJiYKKyAgICAgICAgICAgIGZyYW1lX3BhY2tpbmcuYXZhaWxhYmxlICYmCisgICAgICAgICAgICBwSDI2NERlYy0+aE1GQ0gyNjRIYW5kbGUuYlMzRE1vZGUgPT0gT01YX0ZBTFNFKSB7CisKKyAgICAgICAgICAgIFNFQ19PU0FMX0xvZyhTRUNfTE9HX1RSQUNFLCAiYXJyYW5nZW1lbnQgSUQ6IDB4JTA4eCIsIGZyYW1lX3BhY2tpbmcuYXJyYW5nZW1lbnRfaWQpOworICAgICAgICAgICAgU0VDX09TQUxfTG9nKFNFQ19MT0dfVFJBQ0UsICJhcnJhbmdlbWVudF90eXBlOiAlZCIsIGZyYW1lX3BhY2tpbmcuYXJyYW5nZW1lbnRfdHlwZSk7CisgICAgICAgICAgICBTRUNfT1NBTF9Mb2coU0VDX0xPR19UUkFDRSwgImNvbnRlbnRfaW50ZXJwcmV0YXRpb25fdHlwZTogJWQiLCBmcmFtZV9wYWNraW5nLmNvbnRlbnRfaW50ZXJwcmV0YXRpb25fdHlwZSk7CisgICAgICAgICAgICBTRUNfT1NBTF9Mb2coU0VDX0xPR19UUkFDRSwgImN1cnJlbnRfZnJhbWVfaXNfZnJhbWUwX2ZsYWc6ICVkIiwgZnJhbWVfcGFja2luZy5jdXJyZW50X2ZyYW1lX2lzX2ZyYW1lMF9mbGFnKTsKKyAgICAgICAgICAgIFNFQ19PU0FMX0xvZyhTRUNfTE9HX1RSQUNFLCAic3BhdGlhbF9mbGlwcGluZ19mbGFnOiAlZCIsIGZyYW1lX3BhY2tpbmcuc3BhdGlhbF9mbGlwcGluZ19mbGFnKTsKKyAgICAgICAgICAgIFNFQ19PU0FMX0xvZyhTRUNfTE9HX1RSQUNFLCAiZnIwWDolZCBmcjBZOiVkIGZyMFg6JWQgZnIwWTolZCIsIGZyYW1lX3BhY2tpbmcuZnJhbWUwX2dyaWRfcG9zX3gsCisgICAgICAgICAgICAgICAgZnJhbWVfcGFja2luZy5mcmFtZTBfZ3JpZF9wb3NfeSwgZnJhbWVfcGFja2luZy5mcmFtZTFfZ3JpZF9wb3NfeCwgZnJhbWVfcGFja2luZy5mcmFtZTFfZ3JpZF9wb3NfeSk7CisKKyAgICAgICAgICAgIC8qIENoYW5nZSBPdXRwb3J0IGVDb2xvckZvcm1hdCBiYXNlZCBvbiBGcmFtZXBhY2tpbmcgaW5mb3JtYXRpb24qLworICAgICAgICAgICAgaWYgKGZyYW1lX3BhY2tpbmcuYXJyYW5nZW1lbnRfdHlwZSA9PSAzKSB7CisgICAgICAgICAgICAgICAgaWYgKGZyYW1lX3BhY2tpbmcuY29udGVudF9pbnRlcnByZXRhdGlvbl90eXBlID09IDEpIHsKKyAgICAgICAgICAgICAgICAgICAgc3dpdGNoIChwU0VDT3V0cHV0UG9ydC0+cG9ydERlZmluaXRpb24uZm9ybWF0LnZpZGVvLmVDb2xvckZvcm1hdCkgeworICAgICAgICAgICAgICAgICAgICBjYXNlIE9NWF9TRUNfQ09MT1JfRm9ybWF0TlYxMlRpbGVkOgorICAgICAgICAgICAgICAgICAgICAgICAgcFNFQ091dHB1dFBvcnQtPnBvcnREZWZpbml0aW9uLmZvcm1hdC52aWRlby5lQ29sb3JGb3JtYXQgPSBPTVhfU0VDX0NPTE9SX0Zvcm1hdE5WMTJUaWxlZF9TQlNfTFI7CisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgY2FzZSBPTVhfQ09MT1JfRm9ybWF0WVVWNDIwU2VtaVBsYW5hcjoKKyAgICAgICAgICAgICAgICAgICAgY2FzZSBPTVhfU0VDX0NPTE9SX0Zvcm1hdEFOQllVVjQyMFNlbWlQbGFuYXI6CisgICAgICAgICAgICAgICAgICAgICAgICBwU0VDT3V0cHV0UG9ydC0+cG9ydERlZmluaXRpb24uZm9ybWF0LnZpZGVvLmVDb2xvckZvcm1hdCA9IE9NWF9TRUNfQ09MT1JfRm9ybWF0WVVWNDIwU2VtaVBsYW5hcl9TQlNfTFI7CisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgY2FzZSBPTVhfQ09MT1JfRm9ybWF0WVVWNDIwUGxhbmFyOgorICAgICAgICAgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgICAgICAgICAgcFNFQ091dHB1dFBvcnQtPnBvcnREZWZpbml0aW9uLmZvcm1hdC52aWRlby5lQ29sb3JGb3JtYXQgPSBPTVhfU0VDX0NPTE9SX0Zvcm1hdFlVVjQyMFBsYW5hcl9TQlNfTFI7CisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoZnJhbWVfcGFja2luZy5jb250ZW50X2ludGVycHJldGF0aW9uX3R5cGUgPT0gMikgeworICAgICAgICAgICAgICAgICAgICBzd2l0Y2ggKHBTRUNPdXRwdXRQb3J0LT5wb3J0RGVmaW5pdGlvbi5mb3JtYXQudmlkZW8uZUNvbG9yRm9ybWF0KSB7CisgICAgICAgICAgICAgICAgICAgIGNhc2UgT01YX1NFQ19DT0xPUl9Gb3JtYXROVjEyVGlsZWQ6CisgICAgICAgICAgICAgICAgICAgICAgICBwU0VDT3V0cHV0UG9ydC0+cG9ydERlZmluaXRpb24uZm9ybWF0LnZpZGVvLmVDb2xvckZvcm1hdCA9IE9NWF9TRUNfQ09MT1JfRm9ybWF0TlYxMlRpbGVkX1NCU19STDsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICBjYXNlIE9NWF9DT0xPUl9Gb3JtYXRZVVY0MjBTZW1pUGxhbmFyOgorICAgICAgICAgICAgICAgICAgICBjYXNlIE9NWF9TRUNfQ09MT1JfRm9ybWF0QU5CWVVWNDIwU2VtaVBsYW5hcjoKKyAgICAgICAgICAgICAgICAgICAgICAgIHBTRUNPdXRwdXRQb3J0LT5wb3J0RGVmaW5pdGlvbi5mb3JtYXQudmlkZW8uZUNvbG9yRm9ybWF0ID0gT01YX1NFQ19DT0xPUl9Gb3JtYXRZVVY0MjBTZW1pUGxhbmFyX1NCU19STDsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICBjYXNlIE9NWF9DT0xPUl9Gb3JtYXRZVVY0MjBQbGFuYXI6CisgICAgICAgICAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgICAgICAgICBwU0VDT3V0cHV0UG9ydC0+cG9ydERlZmluaXRpb24uZm9ybWF0LnZpZGVvLmVDb2xvckZvcm1hdCA9IE9NWF9TRUNfQ09MT1JfRm9ybWF0WVVWNDIwUGxhbmFyX1NCU19STDsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfSBlbHNlIGlmIChmcmFtZV9wYWNraW5nLmFycmFuZ2VtZW50X3R5cGUgPT0gNCkgeworICAgICAgICAgICAgICAgIGlmIChmcmFtZV9wYWNraW5nLmNvbnRlbnRfaW50ZXJwcmV0YXRpb25fdHlwZSA9PSAxKSB7CisgICAgICAgICAgICAgICAgICAgIHN3aXRjaCAocFNFQ091dHB1dFBvcnQtPnBvcnREZWZpbml0aW9uLmZvcm1hdC52aWRlby5lQ29sb3JGb3JtYXQpIHsKKyAgICAgICAgICAgICAgICAgICAgY2FzZSBPTVhfU0VDX0NPTE9SX0Zvcm1hdE5WMTJUaWxlZDoKKyAgICAgICAgICAgICAgICAgICAgICAgIHBTRUNPdXRwdXRQb3J0LT5wb3J0RGVmaW5pdGlvbi5mb3JtYXQudmlkZW8uZUNvbG9yRm9ybWF0ID0gT01YX1NFQ19DT0xPUl9Gb3JtYXROVjEyVGlsZWRfVEJfTFI7CisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgY2FzZSBPTVhfQ09MT1JfRm9ybWF0WVVWNDIwU2VtaVBsYW5hcjoKKyAgICAgICAgICAgICAgICAgICAgY2FzZSBPTVhfU0VDX0NPTE9SX0Zvcm1hdEFOQllVVjQyMFNlbWlQbGFuYXI6CisgICAgICAgICAgICAgICAgICAgICAgICBwU0VDT3V0cHV0UG9ydC0+cG9ydERlZmluaXRpb24uZm9ybWF0LnZpZGVvLmVDb2xvckZvcm1hdCA9IE9NWF9TRUNfQ09MT1JfRm9ybWF0WVVWNDIwU2VtaVBsYW5hcl9UQl9MUjsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICBjYXNlIE9NWF9DT0xPUl9Gb3JtYXRZVVY0MjBQbGFuYXI6CisgICAgICAgICAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgICAgICAgICBwU0VDT3V0cHV0UG9ydC0+cG9ydERlZmluaXRpb24uZm9ybWF0LnZpZGVvLmVDb2xvckZvcm1hdCA9IE9NWF9TRUNfQ09MT1JfRm9ybWF0WVVWNDIwUGxhbmFyX1RCX0xSOworICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKGZyYW1lX3BhY2tpbmcuY29udGVudF9pbnRlcnByZXRhdGlvbl90eXBlID09IDIpIHsKKyAgICAgICAgICAgICAgICAgICAgc3dpdGNoIChwU0VDT3V0cHV0UG9ydC0+cG9ydERlZmluaXRpb24uZm9ybWF0LnZpZGVvLmVDb2xvckZvcm1hdCkgeworICAgICAgICAgICAgICAgICAgICBjYXNlIE9NWF9TRUNfQ09MT1JfRm9ybWF0TlYxMlRpbGVkOgorICAgICAgICAgICAgICAgICAgICAgICAgcFNFQ091dHB1dFBvcnQtPnBvcnREZWZpbml0aW9uLmZvcm1hdC52aWRlby5lQ29sb3JGb3JtYXQgPSBPTVhfU0VDX0NPTE9SX0Zvcm1hdE5WMTJUaWxlZF9UQl9STDsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICBjYXNlIE9NWF9DT0xPUl9Gb3JtYXRZVVY0MjBTZW1pUGxhbmFyOgorICAgICAgICAgICAgICAgICAgICBjYXNlIE9NWF9TRUNfQ09MT1JfRm9ybWF0QU5CWVVWNDIwU2VtaVBsYW5hcjoKKyAgICAgICAgICAgICAgICAgICAgICAgIHBTRUNPdXRwdXRQb3J0LT5wb3J0RGVmaW5pdGlvbi5mb3JtYXQudmlkZW8uZUNvbG9yRm9ybWF0ID0gT01YX1NFQ19DT0xPUl9Gb3JtYXRZVVY0MjBTZW1pUGxhbmFyX1RCX1JMOworICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIGNhc2UgT01YX0NPTE9SX0Zvcm1hdFlVVjQyMFBsYW5hcjoKKyAgICAgICAgICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICAgICAgICAgIHBTRUNPdXRwdXRQb3J0LT5wb3J0RGVmaW5pdGlvbi5mb3JtYXQudmlkZW8uZUNvbG9yRm9ybWF0ID0gT01YX1NFQ19DT0xPUl9Gb3JtYXRZVVY0MjBQbGFuYXJfVEJfUkw7CisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgLyoqIFNlbmQgUG9ydCBTZXR0aW5ncyBjaGFuZ2VkIGNhbGwgYmFjayAtIG91dHB1dCBjb2xvciBmb3JtYXQgY2hhbmdlICovCisgICAgICAgICAgICgqKHBTRUNDb21wb25lbnQtPnBDYWxsYmFja3MtPkV2ZW50SGFuZGxlcikpCisgICAgICAgICAgICAgICAgICAocE9NWENvbXBvbmVudCwKKyAgICAgICAgICAgICAgICAgICBwU0VDQ29tcG9uZW50LT5jYWxsYmFja0RhdGEsCisgICAgICAgICAgICAgICAgICAgT01YX0V2ZW50UG9ydFNldHRpbmdzQ2hhbmdlZCwgLyogVGhlIGNvbW1hbmQgd2FzIGNvbXBsZXRlZCAqLworICAgICAgICAgICAgICAgICAgIE9NWF9EaXJPdXRwdXQsIC8qIFRoaXMgaXMgdGhlIHBvcnQgaW5kZXggKi8KKyAgICAgICAgICAgICAgICAgICAwLAorICAgICAgICAgICAgICAgICAgIE5VTEwpOworCisgICAgICAgICAgICBpZiAoKHBTRUNPdXRwdXRQb3J0LT5jcm9wUmVjdGFuZ2xlLm5Ub3AgIT0gMCkgfHwgKHBTRUNPdXRwdXRQb3J0LT5jcm9wUmVjdGFuZ2xlLm5MZWZ0ICE9IDApKSB7CisgICAgICAgICAgICAgICAgLyoqIFNlbmQgY3JvcCBpbmZvIGNhbGwgYmFjayAqKi8KKyAgICAgICAgICAgICAgICAoKihwU0VDQ29tcG9uZW50LT5wQ2FsbGJhY2tzLT5FdmVudEhhbmRsZXIpKQorICAgICAgICAgICAgICAgICAgICAgIChwT01YQ29tcG9uZW50LAorICAgICAgICAgICAgICAgICAgICAgICBwU0VDQ29tcG9uZW50LT5jYWxsYmFja0RhdGEsCisgICAgICAgICAgICAgICAgICAgICAgIE9NWF9FdmVudFBvcnRTZXR0aW5nc0NoYW5nZWQsIC8qIFRoZSBjb21tYW5kIHdhcyBjb21wbGV0ZWQgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgT01YX0Rpck91dHB1dCwgLyogVGhpcyBpcyB0aGUgcG9ydCBpbmRleCAqLworICAgICAgICAgICAgICAgICAgICAgICBPTVhfSW5kZXhDb25maWdDb21tb25PdXRwdXRDcm9wLAorICAgICAgICAgICAgICAgICAgICAgICBOVUxMKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHBIMjY0RGVjLT5oTUZDSDI2NEhhbmRsZS5iUzNETW9kZSA9IE9NWF9UUlVFOworICAgICAgICAgICAgU0VDX09TQUxfU2xlZXBNaWxsaXNlYygwKTsKKyAgICAgICAgICAgIHJldCA9IE9NWF9FcnJvcklucHV0RGF0YURlY29kZVlldDsKKyAgICAgICAgICAgIGdvdG8gRVhJVDsKKyAgICAgICAgfQorI2VuZGlmCisKKyAgICAgICAgaWYgKChTc2JTaXBNZmNEZWNHZXRDb25maWcocEgyNjREZWMtPmhNRkNIMjY0SGFuZGxlLmhNRkNIYW5kbGUsIE1GQ19ERUNfR0VUQ09ORl9GUkFNRV9UQUcsICZpbmRleFRpbWVzdGFtcCkgIT0gTUZDX1JFVF9PSykgfHwKKyAgICAgICAgICAgICgoKGluZGV4VGltZXN0YW1wIDwgMCkgfHwgKGluZGV4VGltZXN0YW1wID49IE1BWF9USU1FU1RBTVApKSkpIHsKKyAgICAgICAgICAgIHBPdXRwdXREYXRhLT50aW1lU3RhbXAgPSBwSW5wdXREYXRhLT50aW1lU3RhbXA7CisgICAgICAgICAgICBwT3V0cHV0RGF0YS0+bkZsYWdzID0gcElucHV0RGF0YS0+bkZsYWdzOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgLyogRm9yIHRpbWVzdGFtcCBjb3JyZWN0aW9uLiBpZiBtZmMgc3VwcG9ydCBmcmFtZXR5cGUgZGV0ZWN0ICovCisgICAgICAgICAgICBTRUNfT1NBTF9Mb2coU0VDX0xPR19UUkFDRSwgImRpc3BfcGljX2ZyYW1lX3R5cGU6ICVkIiwgb3V0cHV0SW5mby5kaXNwX3BpY19mcmFtZV90eXBlKTsKKyNpZmRlZiBORUVEX1RJTUVTVEFNUF9SRU9SREVSCisgICAgICAgICAgICBpZiAoKG91dHB1dEluZm8uZGlzcF9waWNfZnJhbWVfdHlwZSA9PSBNRkNfRlJBTUVfVFlQRV9JX0ZSQU1FKSB8fAorICAgICAgICAgICAgICAgIChwSDI2NERlYy0+aE1GQ0gyNjRIYW5kbGUuYkZsYXNoUGxheWVyTW9kZSA9PSBPTVhfVFJVRSkpIHsKKyAgICAgICAgICAgICAgICBwT3V0cHV0RGF0YS0+dGltZVN0YW1wID0gcFNFQ0NvbXBvbmVudC0+dGltZVN0YW1wW2luZGV4VGltZXN0YW1wXTsKKyAgICAgICAgICAgICAgICBwT3V0cHV0RGF0YS0+bkZsYWdzID0gcFNFQ0NvbXBvbmVudC0+bkZsYWdzW2luZGV4VGltZXN0YW1wXTsKKyAgICAgICAgICAgICAgICBwSDI2NERlYy0+aE1GQ0gyNjRIYW5kbGUub3V0cHV0SW5kZXhUaW1lc3RhbXAgPSBpbmRleFRpbWVzdGFtcDsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgcE91dHB1dERhdGEtPnRpbWVTdGFtcCA9IHBTRUNDb21wb25lbnQtPnRpbWVTdGFtcFtwSDI2NERlYy0+aE1GQ0gyNjRIYW5kbGUub3V0cHV0SW5kZXhUaW1lc3RhbXBdOworICAgICAgICAgICAgICAgIHBPdXRwdXREYXRhLT5uRmxhZ3MgPSBwU0VDQ29tcG9uZW50LT5uRmxhZ3NbcEgyNjREZWMtPmhNRkNIMjY0SGFuZGxlLm91dHB1dEluZGV4VGltZXN0YW1wXTsKKyAgICAgICAgICAgIH0KKyNlbHNlCisgICAgICAgICAgICBwT3V0cHV0RGF0YS0+dGltZVN0YW1wID0gcFNFQ0NvbXBvbmVudC0+dGltZVN0YW1wW2luZGV4VGltZXN0YW1wXTsKKyAgICAgICAgICAgIHBPdXRwdXREYXRhLT5uRmxhZ3MgPSBwU0VDQ29tcG9uZW50LT5uRmxhZ3NbaW5kZXhUaW1lc3RhbXBdOworI2VuZGlmCisgICAgICAgICAgICBTRUNfT1NBTF9Mb2coU0VDX0xPR19UUkFDRSwgInRpbWVzdGFtcCAlbGxkIHVzICglLjJmIHNlY3MpIiwgcE91dHB1dERhdGEtPnRpbWVTdGFtcCwgcE91dHB1dERhdGEtPnRpbWVTdGFtcCAvIDFFNik7CisgICAgICAgIH0KKworICAgICAgICBpZiAoKHN0YXR1cyA9PSBNRkNfR0VUT1VUQlVGX0RJU1BMQVlfREVDT0RJTkcpIHx8CisgICAgICAgICAgICAoc3RhdHVzID09IE1GQ19HRVRPVVRCVUZfRElTUExBWV9PTkxZKSkgeworICAgICAgICAgICAgb3V0cHV0RGF0YVZhbGlkID0gT01YX1RSVUU7CisgICAgICAgICAgICBwSDI2NERlYy0+aE1GQ0gyNjRIYW5kbGUub3V0cHV0SW5kZXhUaW1lc3RhbXArKzsKKyAgICAgICAgICAgIHBIMjY0RGVjLT5oTUZDSDI2NEhhbmRsZS5vdXRwdXRJbmRleFRpbWVzdGFtcCAlPSBNQVhfVElNRVNUQU1QOworICAgICAgICB9CisgICAgICAgIGlmIChwT3V0cHV0RGF0YS0+bkZsYWdzICYgT01YX0JVRkZFUkZMQUdfRU9TKQorICAgICAgICAgICAgb3V0cHV0RGF0YVZhbGlkID0gT01YX0ZBTFNFOworCisgICAgICAgIGlmICgoc3RhdHVzID09IE1GQ19HRVRPVVRCVUZfRElTUExBWV9PTkxZKSB8fAorICAgICAgICAgICAgKHBTRUNDb21wb25lbnQtPmdldEFsbERlbGF5QnVmZmVyID09IE9NWF9UUlVFKSkKKyAgICAgICAgICAgIHJldCA9IE9NWF9FcnJvcklucHV0RGF0YURlY29kZVlldDsKKworICAgICAgICBpZiAoc3RhdHVzID09IE1GQ19HRVRPVVRCVUZfREVDT0RJTkdfT05MWSkgeworICAgICAgICAgICAgaWYgKCgocElucHV0RGF0YS0+bkZsYWdzICYgT01YX0JVRkZFUkZMQUdfRU9TKSAhPSBPTVhfQlVGRkVSRkxBR19FT1MpICYmCisgICAgICAgICAgICAgICAgKChwU0VDQ29tcG9uZW50LT5iU2F2ZUZsYWdFT1MgPT0gT01YX1RSVUUpIHx8IChwU0VDQ29tcG9uZW50LT5nZXRBbGxEZWxheUJ1ZmZlciA9PSBPTVhfVFJVRSkpKSB7CisgICAgICAgICAgICAgICAgcElucHV0RGF0YS0+bkZsYWdzIHw9IE9NWF9CVUZGRVJGTEFHX0VPUzsKKyAgICAgICAgICAgICAgICBwU0VDQ29tcG9uZW50LT5nZXRBbGxEZWxheUJ1ZmZlciA9IE9NWF9UUlVFOworICAgICAgICAgICAgICAgIHJldCA9IE9NWF9FcnJvcklucHV0RGF0YURlY29kZVlldDsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgcmV0ID0gT01YX0Vycm9yTm9uZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIG91dHB1dERhdGFWYWxpZCA9IE9NWF9GQUxTRTsKKyAgICAgICAgfQorCisjaWZkZWYgRlVMTF9GUkFNRV9TRUFSQ0gKKyAgICAgICAgaWYgKCgocElucHV0RGF0YS0+bkZsYWdzICYgT01YX0JVRkZFUkZMQUdfRU9TKSAhPSBPTVhfQlVGRkVSRkxBR19FT1MpICYmCisgICAgICAgICAgICAocFNFQ0NvbXBvbmVudC0+YlNhdmVGbGFnRU9TID09IE9NWF9UUlVFKSkgeworICAgICAgICAgICAgcElucHV0RGF0YS0+bkZsYWdzIHw9IE9NWF9CVUZGRVJGTEFHX0VPUzsKKyAgICAgICAgICAgIHBTRUNDb21wb25lbnQtPmdldEFsbERlbGF5QnVmZmVyID0gT01YX1RSVUU7CisgICAgICAgICAgICByZXQgPSBPTVhfRXJyb3JJbnB1dERhdGFEZWNvZGVZZXQ7CisgICAgICAgIH0gZWxzZQorI2VuZGlmCisgICAgICAgIGlmICgocElucHV0RGF0YS0+bkZsYWdzICYgT01YX0JVRkZFUkZMQUdfRU9TKSA9PSBPTVhfQlVGRkVSRkxBR19FT1MpIHsKKyAgICAgICAgICAgIHBJbnB1dERhdGEtPm5GbGFncyA9IChwT3V0cHV0RGF0YS0+bkZsYWdzICYgKH5PTVhfQlVGRkVSRkxBR19FT1MpKTsKKyAgICAgICAgICAgIHBTRUNDb21wb25lbnQtPmdldEFsbERlbGF5QnVmZmVyID0gT01YX1RSVUU7CisgICAgICAgICAgICByZXQgPSBPTVhfRXJyb3JJbnB1dERhdGFEZWNvZGVZZXQ7CisgICAgICAgIH0gZWxzZSBpZiAoKHBPdXRwdXREYXRhLT5uRmxhZ3MgJiBPTVhfQlVGRkVSRkxBR19FT1MpID09IE9NWF9CVUZGRVJGTEFHX0VPUykgeworICAgICAgICAgICAgcFNFQ0NvbXBvbmVudC0+Z2V0QWxsRGVsYXlCdWZmZXIgPSBPTVhfRkFMU0U7CisgICAgICAgICAgICByZXQgPSBPTVhfRXJyb3JOb25lOworICAgICAgICB9CisgICAgfSBlbHNlIHsKKyAgICAgICAgcE91dHB1dERhdGEtPnRpbWVTdGFtcCA9IHBJbnB1dERhdGEtPnRpbWVTdGFtcDsKKyAgICAgICAgcE91dHB1dERhdGEtPm5GbGFncyA9IHBJbnB1dERhdGEtPm5GbGFnczsKKworICAgICAgICBpZiAoKHBTRUNDb21wb25lbnQtPmJTYXZlRmxhZ0VPUyA9PSBPTVhfVFJVRSkgfHwKKyAgICAgICAgICAgIChwU0VDQ29tcG9uZW50LT5nZXRBbGxEZWxheUJ1ZmZlciA9PSBPTVhfVFJVRSkgfHwKKyAgICAgICAgICAgIChwSW5wdXREYXRhLT5uRmxhZ3MgJiBPTVhfQlVGRkVSRkxBR19FT1MpKSB7CisgICAgICAgICAgICBwT3V0cHV0RGF0YS0+bkZsYWdzIHw9IE9NWF9CVUZGRVJGTEFHX0VPUzsKKyAgICAgICAgICAgIHBTRUNDb21wb25lbnQtPmdldEFsbERlbGF5QnVmZmVyID0gT01YX0ZBTFNFOworICAgICAgICB9CisKKyAgICAgICAgaWYgKChwVmlkZW9EZWMtPmJGaXJzdEZyYW1lID09IE9NWF9UUlVFKSAmJgorICAgICAgICAgICAgKChwT3V0cHV0RGF0YS0+bkZsYWdzICYgT01YX0JVRkZFUkZMQUdfRU9TKSA9PSBPTVhfQlVGRkVSRkxBR19FT1MpICYmCisgICAgICAgICAgICAoKHBJbnB1dERhdGEtPm5GbGFncyAmIE9NWF9CVUZGRVJGTEFHX0NPREVDQ09ORklHKSAhPSBPTVhfQlVGRkVSRkxBR19DT0RFQ0NPTkZJRykpIHsKKyAgICAgICAgICAgIHBPdXRwdXREYXRhLT5uRmxhZ3MgPSAocE91dHB1dERhdGEtPm5GbGFncyAmICh+T01YX0JVRkZFUkZMQUdfRU9TKSk7CisgICAgICAgIH0KKworICAgICAgICBvdXRwdXREYXRhVmFsaWQgPSBPTVhfRkFMU0U7CisKKyAgICAgICAgLyogcmV0ID0gT01YX0Vycm9yVW5kZWZpbmVkOyAqLworICAgICAgICByZXQgPSBPTVhfRXJyb3JOb25lOworICAgIH0KKworICAgIGlmIChyZXQgPT0gT01YX0Vycm9ySW5wdXREYXRhRGVjb2RlWWV0KSB7CisgICAgICAgIHBWaWRlb0RlYy0+TUZDRGVjSW5wdXRCdWZmZXJbcFZpZGVvRGVjLT5pbmRleElucHV0QnVmZmVyXS5kYXRhU2l6ZSA9IG9uZUZyYW1lU2l6ZTsKKyAgICAgICAgcFZpZGVvRGVjLT5pbmRleElucHV0QnVmZmVyKys7CisgICAgICAgIHBWaWRlb0RlYy0+aW5kZXhJbnB1dEJ1ZmZlciAlPSBNRkNfSU5QVVRfQlVGRkVSX05VTV9NQVg7CisgICAgICAgIHBIMjY0RGVjLT5oTUZDSDI2NEhhbmRsZS5wTUZDU3RyZWFtQnVmZmVyICAgID0gcFZpZGVvRGVjLT5NRkNEZWNJbnB1dEJ1ZmZlcltwVmlkZW9EZWMtPmluZGV4SW5wdXRCdWZmZXJdLlZpckFkZHI7CisgICAgICAgIHBIMjY0RGVjLT5oTUZDSDI2NEhhbmRsZS5wTUZDU3RyZWFtUGh5QnVmZmVyID0gcFZpZGVvRGVjLT5NRkNEZWNJbnB1dEJ1ZmZlcltwVmlkZW9EZWMtPmluZGV4SW5wdXRCdWZmZXJdLlBoeUFkZHI7CisgICAgICAgIHBTRUNDb21wb25lbnQtPnByb2Nlc3NEYXRhW0lOUFVUX1BPUlRfSU5ERVhdLmRhdGFCdWZmZXIgPSBwVmlkZW9EZWMtPk1GQ0RlY0lucHV0QnVmZmVyW3BWaWRlb0RlYy0+aW5kZXhJbnB1dEJ1ZmZlcl0uVmlyQWRkcjsKKyAgICAgICAgcFNFQ0NvbXBvbmVudC0+cHJvY2Vzc0RhdGFbSU5QVVRfUE9SVF9JTkRFWF0uYWxsb2NTaXplID0gcFZpZGVvRGVjLT5NRkNEZWNJbnB1dEJ1ZmZlcltwVmlkZW9EZWMtPmluZGV4SW5wdXRCdWZmZXJdLmJ1ZmZlclNpemU7CisgICAgICAgIG9uZUZyYW1lU2l6ZSA9IHBWaWRlb0RlYy0+TUZDRGVjSW5wdXRCdWZmZXJbcFZpZGVvRGVjLT5pbmRleElucHV0QnVmZmVyXS5kYXRhU2l6ZTsKKyAgICAgICAgLy9wSW5wdXREYXRhLT5kYXRhTGVuID0gb25lRnJhbWVTaXplOworICAgICAgICAvL3BJbnB1dERhdGEtPnJlbWFpbkRhdGFMZW4gPSBvbmVGcmFtZVNpemU7CisgICAgfQorCisgICAgaWYgKChDaGVja19IMjY0X1N0YXJ0Q29kZShwSW5wdXREYXRhLT5kYXRhQnVmZmVyLCBvbmVGcmFtZVNpemUpID09IE9NWF9UUlVFKSAmJgorICAgICAgICAoKHBPdXRwdXREYXRhLT5uRmxhZ3MgJiBPTVhfQlVGRkVSRkxBR19FT1MpICE9IE9NWF9CVUZGRVJGTEFHX0VPUykpIHsKKyAgICAgICAgaWYgKChyZXQgIT0gT01YX0Vycm9ySW5wdXREYXRhRGVjb2RlWWV0KSB8fCAocFNFQ0NvbXBvbmVudC0+Z2V0QWxsRGVsYXlCdWZmZXIgPT0gT01YX1RSVUUpKSB7CisgICAgICAgICAgICBTc2JTaXBNZmNEZWNTZXRDb25maWcocEgyNjREZWMtPmhNRkNIMjY0SGFuZGxlLmhNRkNIYW5kbGUsIE1GQ19ERUNfU0VUQ09ORl9GUkFNRV9UQUcsICYocEgyNjREZWMtPmhNRkNIMjY0SGFuZGxlLmluZGV4VGltZXN0YW1wKSk7CisgICAgICAgICAgICBwSDI2NERlYy0+aE1GQ0gyNjRIYW5kbGUuaW5kZXhUaW1lc3RhbXArKzsKKyAgICAgICAgICAgIHBIMjY0RGVjLT5oTUZDSDI2NEhhbmRsZS5pbmRleFRpbWVzdGFtcCAlPSBNQVhfVElNRVNUQU1QOworICAgICAgICB9CisKKyAgICAgICAgU3NiU2lwTWZjRGVjU2V0SW5CdWYocEgyNjREZWMtPmhNRkNIMjY0SGFuZGxlLmhNRkNIYW5kbGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBIMjY0RGVjLT5oTUZDSDI2NEhhbmRsZS5wTUZDU3RyZWFtUGh5QnVmZmVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwSDI2NERlYy0+aE1GQ0gyNjRIYW5kbGUucE1GQ1N0cmVhbUJ1ZmZlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcFNFQ0NvbXBvbmVudC0+cHJvY2Vzc0RhdGFbSU5QVVRfUE9SVF9JTkRFWF0uYWxsb2NTaXplKTsKKworICAgICAgICBwVmlkZW9EZWMtPk1GQ0RlY0lucHV0QnVmZmVyW3BWaWRlb0RlYy0+aW5kZXhJbnB1dEJ1ZmZlcl0uZGF0YVNpemUgPSBvbmVGcmFtZVNpemU7CisgICAgICAgIHBWaWRlb0RlYy0+TkJEZWNUaHJlYWQub25lRnJhbWVTaXplID0gb25lRnJhbWVTaXplOworCisgICAgICAgIC8qIG1mYyBkZWNvZGUgc3RhcnQgKi8KKyAgICAgICAgU0VDX09TQUxfU2VtYXBob3JlUG9zdChwVmlkZW9EZWMtPk5CRGVjVGhyZWFkLmhEZWNGcmFtZVN0YXJ0KTsKKyAgICAgICAgcFZpZGVvRGVjLT5OQkRlY1RocmVhZC5iRGVjb2RlclJ1biA9IE9NWF9UUlVFOworICAgICAgICBwSDI2NERlYy0+aE1GQ0gyNjRIYW5kbGUucmV0dXJuQ29kZWMgPSBNRkNfUkVUX09LOworCisgICAgICAgIFNFQ19PU0FMX1NsZWVwTWlsbGlzZWMoMCk7CisKKyAgICAgICAgcFZpZGVvRGVjLT5pbmRleElucHV0QnVmZmVyKys7CisgICAgICAgIHBWaWRlb0RlYy0+aW5kZXhJbnB1dEJ1ZmZlciAlPSBNRkNfSU5QVVRfQlVGRkVSX05VTV9NQVg7CisgICAgICAgIHBIMjY0RGVjLT5oTUZDSDI2NEhhbmRsZS5wTUZDU3RyZWFtQnVmZmVyICAgID0gcFZpZGVvRGVjLT5NRkNEZWNJbnB1dEJ1ZmZlcltwVmlkZW9EZWMtPmluZGV4SW5wdXRCdWZmZXJdLlZpckFkZHI7CisgICAgICAgIHBIMjY0RGVjLT5oTUZDSDI2NEhhbmRsZS5wTUZDU3RyZWFtUGh5QnVmZmVyID0gcFZpZGVvRGVjLT5NRkNEZWNJbnB1dEJ1ZmZlcltwVmlkZW9EZWMtPmluZGV4SW5wdXRCdWZmZXJdLlBoeUFkZHI7CisgICAgICAgIHBTRUNDb21wb25lbnQtPnByb2Nlc3NEYXRhW0lOUFVUX1BPUlRfSU5ERVhdLmRhdGFCdWZmZXIgPSBwVmlkZW9EZWMtPk1GQ0RlY0lucHV0QnVmZmVyW3BWaWRlb0RlYy0+aW5kZXhJbnB1dEJ1ZmZlcl0uVmlyQWRkcjsKKyAgICAgICAgcFNFQ0NvbXBvbmVudC0+cHJvY2Vzc0RhdGFbSU5QVVRfUE9SVF9JTkRFWF0uYWxsb2NTaXplID0gcFZpZGVvRGVjLT5NRkNEZWNJbnB1dEJ1ZmZlcltwVmlkZW9EZWMtPmluZGV4SW5wdXRCdWZmZXJdLmJ1ZmZlclNpemU7CisKKyAgICAgICAgaWYgKChwVmlkZW9EZWMtPmJGaXJzdEZyYW1lID09IE9NWF9UUlVFKSAmJgorICAgICAgICAgICAgKHBTRUNDb21wb25lbnQtPmJTYXZlRmxhZ0VPUyA9PSBPTVhfVFJVRSkgJiYKKyAgICAgICAgICAgIChvdXRwdXREYXRhVmFsaWQgPT0gT01YX0ZBTFNFKSkgeworICAgICAgICAgICAgcmV0ID0gT01YX0Vycm9ySW5wdXREYXRhRGVjb2RlWWV0OworICAgICAgICB9CisKKyAgICAgICAgcFZpZGVvRGVjLT5iRmlyc3RGcmFtZSA9IE9NWF9GQUxTRTsKKyAgICB9IGVsc2UgeworICAgICAgICBpZiAocFNFQ0NvbXBvbmVudC0+Y2hlY2tUaW1lU3RhbXAubmVlZENoZWNrU3RhcnRUaW1lU3RhbXAgPT0gT01YX1RSVUUpCisgICAgICAgICAgICBwU0VDQ29tcG9uZW50LT5jaGVja1RpbWVTdGFtcC5uZWVkU2V0U3RhcnRUaW1lU3RhbXAgPSBPTVhfVFJVRTsKKyAgICB9CisKKyAgICAvKiogRmlsbCBPdXRwdXQgQnVmZmVyICoqLworICAgIGlmIChvdXRwdXREYXRhVmFsaWQgPT0gT01YX1RSVUUpIHsKKyAgICAgICAgdm9pZCAqcE91dHB1dEJ1ZiA9ICh2b2lkICopcE91dHB1dERhdGEtPmRhdGFCdWZmZXI7CisgICAgICAgIHZvaWQgKnBTcmNCdWZbM10gPSB7TlVMTCwgfTsKKyAgICAgICAgdm9pZCAqcFlVVkJ1ZlszXSA9IHtOVUxMLCB9OworICAgICAgICB1bnNpZ25lZCBpbnQgY3NjX3NyY19jb2xvcl9mb3JtYXQsIGNzY19kc3RfY29sb3JfZm9ybWF0OworICAgICAgICBDU0NfTUVUSE9EIGNzY19tZXRob2QgPSBDU0NfTUVUSE9EX1NXOworICAgICAgICB1bnNpZ25lZCBpbnQgY2FjaGVhYmxlID0gMTsKKworICAgICAgICBpbnQgZnJhbWVTaXplID0gYnVmV2lkdGggKiBidWZIZWlnaHQ7CisgICAgICAgIGludCBhY3R1YWxXaWR0aCA9IG91dHB1dEluZm8uaW1nX3dpZHRoOworICAgICAgICBpbnQgYWN0dWFsSGVpZ2h0ID0gb3V0cHV0SW5mby5pbWdfaGVpZ2h0OworICAgICAgICBpbnQgYWN0dWFsSW1hZ2VTaXplID0gYWN0dWFsV2lkdGggKiBhY3R1YWxIZWlnaHQ7CisKKyAgICAgICAgcFNyY0J1ZlswXSA9IG91dHB1dEluZm8uWVZpckFkZHI7CisgICAgICAgIHBTcmNCdWZbMV0gPSBvdXRwdXRJbmZvLkNWaXJBZGRyOworCisgICAgICAgIHBZVVZCdWZbMF0gID0gKHVuc2lnbmVkIGNoYXIgKilwT3V0cHV0QnVmOworICAgICAgICBwWVVWQnVmWzFdICA9ICh1bnNpZ25lZCBjaGFyICopcE91dHB1dEJ1ZiArIGFjdHVhbEltYWdlU2l6ZTsKKyAgICAgICAgcFlVVkJ1ZlsyXSAgPSAodW5zaWduZWQgY2hhciAqKXBPdXRwdXRCdWYgKyBhY3R1YWxJbWFnZVNpemUgKyBhY3R1YWxJbWFnZVNpemUgLyA0OworICAgICAgICBwT3V0cHV0RGF0YS0+ZGF0YUxlbiA9IChhY3R1YWxJbWFnZVNpemUgKiAzKSAvIDI7CisKKyNpZmRlZiBVU0VfQU5CCisgICAgICAgIGlmIChwU0VDT3V0cHV0UG9ydC0+YklzQU5CRW5hYmxlZCA9PSBPTVhfVFJVRSkgeworICAgICAgICAgICAgT01YX1UzMiBzdHJpZGU7CisgICAgICAgICAgICBTRUNfT1NBTF9Mb2NrQU5CKHBPdXRwdXREYXRhLT5kYXRhQnVmZmVyLCBhY3R1YWxXaWR0aCwgYWN0dWFsSGVpZ2h0LCBwU0VDQ29tcG9uZW50LT5wU0VDUG9ydFtPVVRQVVRfUE9SVF9JTkRFWF0ucG9ydERlZmluaXRpb24uZm9ybWF0LnZpZGVvLmVDb2xvckZvcm1hdCwgJnN0cmlkZSwgcFlVVkJ1Zik7CisgICAgICAgICAgICBhY3R1YWxXaWR0aCA9IHN0cmlkZTsKKyAgICAgICAgICAgIHBPdXRwdXREYXRhLT5kYXRhTGVuID0gc2l6ZW9mKHZvaWQgKik7CisgICAgICAgIH0KKyNlbmRpZgorCisgICAgICAgIGlmICgocFZpZGVvRGVjLT5iVGh1bWJuYWlsTW9kZSA9PSBPTVhfRkFMU0UpICYmCisgICAgICAgICAgICAocFNFQ091dHB1dFBvcnQtPnBvcnREZWZpbml0aW9uLmZvcm1hdC52aWRlby5lQ29sb3JGb3JtYXQgPT0gT01YX1NFQ19DT0xPUl9Gb3JtYXROVjEyVFBoeXNpY2FsQWRkcmVzcykpIHsKKyAgICAgICAgICAgIC8qIGlmIHVzZSBQb3N0IGNvcHkgYWRkcmVzcyBzdHJ1Y3R1cmUgKi8KKyAgICAgICAgICAgIFNFQ19PU0FMX01lbWNweShwWVVWQnVmWzBdLCAmKG91dHB1dEluZm8uWVBoeUFkZHIpLCBzaXplb2Yob3V0cHV0SW5mby5ZUGh5QWRkcikpOworICAgICAgICAgICAgU0VDX09TQUxfTWVtY3B5KCh1bnNpZ25lZCBjaGFyICopcFlVVkJ1ZlswXSArIChzaXplb2Yodm9pZCAqKSAqIDEpLCAmKG91dHB1dEluZm8uQ1BoeUFkZHIpLCBzaXplb2Yob3V0cHV0SW5mby5DUGh5QWRkcikpOworICAgICAgICAgICAgU0VDX09TQUxfTWVtY3B5KCh1bnNpZ25lZCBjaGFyICopcFlVVkJ1ZlswXSArIChzaXplb2Yodm9pZCAqKSAqIDIpLCAmKG91dHB1dEluZm8uWVZpckFkZHIpLCBzaXplb2Yob3V0cHV0SW5mby5ZVmlyQWRkcikpOworICAgICAgICAgICAgU0VDX09TQUxfTWVtY3B5KCh1bnNpZ25lZCBjaGFyICopcFlVVkJ1ZlswXSArIChzaXplb2Yodm9pZCAqKSAqIDMpLCAmKG91dHB1dEluZm8uQ1ZpckFkZHIpLCBzaXplb2Yob3V0cHV0SW5mby5DVmlyQWRkcikpOworICAgICAgICAgICAgcE91dHB1dERhdGEtPmRhdGFMZW4gPSAoYWN0dWFsV2lkdGggKiBhY3R1YWxIZWlnaHQgKiAzKSAvIDI7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBTRUNfT1NBTF9Mb2coU0VDX0xPR19UUkFDRSwgIllVVjQyMHAgb3V0IGZvciBUaHVtYm5haWxNb2RlL0ZsYXNoIHBsYXllciBtb2RlIik7CisjaWZkZWYgQ09ORklHX01GQ19GUFMKKyAgICAgICAgICAgIFNFQ19PU0FMX1BlcmZTdGFydChQRVJGX0lEX0NTQyk7CisjZW5kaWYKKyAgICAgICAgICAgIHN3aXRjaCAocFNFQ0NvbXBvbmVudC0+cFNFQ1BvcnRbT1VUUFVUX1BPUlRfSU5ERVhdLnBvcnREZWZpbml0aW9uLmZvcm1hdC52aWRlby5lQ29sb3JGb3JtYXQpIHsKKyAgICAgICAgICAgIGNhc2UgT01YX1NFQ19DT0xPUl9Gb3JtYXROVjEyVGlsZWQ6CisjaWZkZWYgUzNEX1NVUFBPUlQKKyAgICAgICAgICAgIGNhc2UgT01YX1NFQ19DT0xPUl9Gb3JtYXROVjEyVGlsZWRfU0JTX0xSOgorICAgICAgICAgICAgY2FzZSBPTVhfU0VDX0NPTE9SX0Zvcm1hdE5WMTJUaWxlZF9TQlNfUkw6CisgICAgICAgICAgICBjYXNlIE9NWF9TRUNfQ09MT1JfRm9ybWF0TlYxMlRpbGVkX1RCX0xSOgorICAgICAgICAgICAgY2FzZSBPTVhfU0VDX0NPTE9SX0Zvcm1hdE5WMTJUaWxlZF9UQl9STDoKKyNlbmRpZgorICAgICAgICAgICAgICAgIFNFQ19PU0FMX01lbWNweShwT3V0cHV0QnVmLCBvdXRwdXRJbmZvLllWaXJBZGRyLCBGcmFtZUJ1ZmZlcllTaXplKTsKKyAgICAgICAgICAgICAgICBTRUNfT1NBTF9NZW1jcHkoKHVuc2lnbmVkIGNoYXIgKilwT3V0cHV0QnVmICsgRnJhbWVCdWZmZXJZU2l6ZSwgb3V0cHV0SW5mby5DVmlyQWRkciwgRnJhbWVCdWZmZXJVVlNpemUpOworICAgICAgICAgICAgICAgIHBPdXRwdXREYXRhLT5kYXRhTGVuID0gRnJhbWVCdWZmZXJZU2l6ZSArIEZyYW1lQnVmZmVyVVZTaXplOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBPTVhfQ09MT1JfRm9ybWF0WVVWNDIwU2VtaVBsYW5hcjoKKyNpZmRlZiBTM0RfU1VQUE9SVAorICAgICAgICAgICAgY2FzZSBPTVhfU0VDX0NPTE9SX0Zvcm1hdFlVVjQyMFNlbWlQbGFuYXJfU0JTX0xSOgorICAgICAgICAgICAgY2FzZSBPTVhfU0VDX0NPTE9SX0Zvcm1hdFlVVjQyMFNlbWlQbGFuYXJfU0JTX1JMOgorICAgICAgICAgICAgY2FzZSBPTVhfU0VDX0NPTE9SX0Zvcm1hdFlVVjQyMFNlbWlQbGFuYXJfVEJfTFI6CisgICAgICAgICAgICBjYXNlIE9NWF9TRUNfQ09MT1JfRm9ybWF0WVVWNDIwU2VtaVBsYW5hcl9UQl9STDoKKyNlbmRpZgorICAgICAgICAgICAgY2FzZSBPTVhfU0VDX0NPTE9SX0Zvcm1hdEFOQllVVjQyMFNlbWlQbGFuYXI6CisgICAgICAgICAgICAgICAgY3NjX3NyY19jb2xvcl9mb3JtYXQgPSBvbXhfMl9oYWxfcGl4ZWxfZm9ybWF0KCh1bnNpZ25lZCBpbnQpT01YX1NFQ19DT0xPUl9Gb3JtYXROVjEyVGlsZWQpOworICAgICAgICAgICAgICAgIGNzY19kc3RfY29sb3JfZm9ybWF0ID0gb214XzJfaGFsX3BpeGVsX2Zvcm1hdCgodW5zaWduZWQgaW50KU9NWF9DT0xPUl9Gb3JtYXRZVVY0MjBTZW1pUGxhbmFyKTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgT01YX0NPTE9SX0Zvcm1hdFlVVjQyMFBsYW5hcjoKKyNpZmRlZiBTM0RfU1VQUE9SVAorICAgICAgICAgICAgY2FzZSBPTVhfU0VDX0NPTE9SX0Zvcm1hdFlVVjQyMFBsYW5hcl9TQlNfTFI6CisgICAgICAgICAgICBjYXNlIE9NWF9TRUNfQ09MT1JfRm9ybWF0WVVWNDIwUGxhbmFyX1NCU19STDoKKyAgICAgICAgICAgIGNhc2UgT01YX1NFQ19DT0xPUl9Gb3JtYXRZVVY0MjBQbGFuYXJfVEJfTFI6CisgICAgICAgICAgICBjYXNlIE9NWF9TRUNfQ09MT1JfRm9ybWF0WVVWNDIwUGxhbmFyX1RCX1JMOgorI2VuZGlmCisgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgIGNzY19zcmNfY29sb3JfZm9ybWF0ID0gb214XzJfaGFsX3BpeGVsX2Zvcm1hdCgodW5zaWduZWQgaW50KU9NWF9TRUNfQ09MT1JfRm9ybWF0TlYxMlRpbGVkKTsKKyAgICAgICAgICAgICAgICBjc2NfZHN0X2NvbG9yX2Zvcm1hdCA9IG9teF8yX2hhbF9waXhlbF9mb3JtYXQoKHVuc2lnbmVkIGludClPTVhfQ09MT1JfRm9ybWF0WVVWNDIwUGxhbmFyKTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgY3NjX2dldF9tZXRob2QocFZpZGVvRGVjLT5jc2NfaGFuZGxlLCAmY3NjX21ldGhvZCk7CisjaWZkZWYgVVNFX0NTQ19GSU1DCisgICAgICAgICAgICBpZiAoKHBTRUNPdXRwdXRQb3J0LT5iSXNBTkJFbmFibGVkID09IE9NWF9UUlVFKSAmJiAoY3NjX21ldGhvZCA9PSBDU0NfTUVUSE9EX0hXKSkgeworICAgICAgICAgICAgICAgIFNFQ19PU0FMX0dldFBoeXNBTkIocE91dHB1dERhdGEtPmRhdGFCdWZmZXIsIHBZVVZCdWYpOworICAgICAgICAgICAgICAgIHBTcmNCdWZbMF0gPSBvdXRwdXRJbmZvLllQaHlBZGRyOworICAgICAgICAgICAgICAgIHBTcmNCdWZbMV0gPSBvdXRwdXRJbmZvLkNQaHlBZGRyOworICAgICAgICAgICAgfQorI2VuZGlmCisgICAgICAgICAgICBpZiAocFZpZGVvRGVjLT5jc2Nfc2V0X2Zvcm1hdCA9PSBPTVhfRkFMU0UpIHsKKyAgICAgICAgICAgICAgICBjc2Nfc2V0X3NyY19mb3JtYXQoCisgICAgICAgICAgICAgICAgICAgIHBWaWRlb0RlYy0+Y3NjX2hhbmRsZSwgIC8qIGhhbmRsZSAqLworICAgICAgICAgICAgICAgICAgICBhY3R1YWxXaWR0aCwgICAgICAgICAgICAvKiB3aWR0aCAqLworICAgICAgICAgICAgICAgICAgICBhY3R1YWxIZWlnaHQsICAgICAgICAgICAvKiBoZWlnaHQgKi8KKyAgICAgICAgICAgICAgICAgICAgMCwgICAgICAgICAgICAgICAgICAgICAgLyogY3JvcF9sZWZ0ICovCisgICAgICAgICAgICAgICAgICAgIDAsICAgICAgICAgICAgICAgICAgICAgIC8qIGNyb3BfcmlnaHQgKi8KKyAgICAgICAgICAgICAgICAgICAgYWN0dWFsV2lkdGgsICAgICAgICAgICAgLyogY3JvcF93aWR0aCAqLworICAgICAgICAgICAgICAgICAgICBhY3R1YWxIZWlnaHQsICAgICAgICAgICAvKiBjcm9wX2hlaWdodCAqLworICAgICAgICAgICAgICAgICAgICBjc2Nfc3JjX2NvbG9yX2Zvcm1hdCwgICAvKiBjb2xvcl9mb3JtYXQgKi8KKyAgICAgICAgICAgICAgICAgICAgY2FjaGVhYmxlKTsgICAgICAgICAgICAgLyogY2FjaGVhYmxlICovCisgICAgICAgICAgICAgICAgY3NjX3NldF9kc3RfZm9ybWF0KAorICAgICAgICAgICAgICAgICAgICBwVmlkZW9EZWMtPmNzY19oYW5kbGUsICAvKiBoYW5kbGUgKi8KKyAgICAgICAgICAgICAgICAgICAgYWN0dWFsV2lkdGgsICAgICAgICAgICAgLyogd2lkdGggKi8KKyAgICAgICAgICAgICAgICAgICAgYWN0dWFsSGVpZ2h0LCAgICAgICAgICAgLyogaGVpZ2h0ICovCisgICAgICAgICAgICAgICAgICAgIDAsICAgICAgICAgICAgICAgICAgICAgIC8qIGNyb3BfbGVmdCAqLworICAgICAgICAgICAgICAgICAgICAwLCAgICAgICAgICAgICAgICAgICAgICAvKiBjcm9wX3JpZ2h0ICovCisgICAgICAgICAgICAgICAgICAgIGFjdHVhbFdpZHRoLCAgICAgICAgICAgIC8qIGNyb3Bfd2lkdGggKi8KKyAgICAgICAgICAgICAgICAgICAgYWN0dWFsSGVpZ2h0LCAgICAgICAgICAgLyogY3JvcF9oZWlnaHQgKi8KKyAgICAgICAgICAgICAgICAgICAgY3NjX2RzdF9jb2xvcl9mb3JtYXQsICAgLyogY29sb3JfZm9ybWF0ICovCisgICAgICAgICAgICAgICAgICAgIGNhY2hlYWJsZSk7ICAgICAgICAgICAgIC8qIGNhY2hlYWJsZSAqLworICAgICAgICAgICAgICAgIHBWaWRlb0RlYy0+Y3NjX3NldF9mb3JtYXQgPSBPTVhfVFJVRTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGNzY19zZXRfc3JjX2J1ZmZlcigKKyAgICAgICAgICAgICAgICBwVmlkZW9EZWMtPmNzY19oYW5kbGUsICAvKiBoYW5kbGUgKi8KKyAgICAgICAgICAgICAgICBwU3JjQnVmWzBdLCAgICAgICAgICAgICAvKiB5IGFkZHIgKi8KKyAgICAgICAgICAgICAgICBwU3JjQnVmWzFdLCAgICAgICAgICAgICAvKiB1IGFkZHIgb3IgdXYgYWRkciAqLworICAgICAgICAgICAgICAgIHBTcmNCdWZbMl0sICAgICAgICAgICAgIC8qIHYgYWRkciBvciBub25lICovCisgICAgICAgICAgICAgICAgMCk7ICAgICAgICAgICAgICAgICAgICAgLyogaW9uIGZkICovCisgICAgICAgICAgICBjc2Nfc2V0X2RzdF9idWZmZXIoCisgICAgICAgICAgICAgICAgcFZpZGVvRGVjLT5jc2NfaGFuZGxlLCAgLyogaGFuZGxlICovCisgICAgICAgICAgICAgICAgcFlVVkJ1ZlswXSwgICAgICAgICAgICAgLyogeSBhZGRyICovCisgICAgICAgICAgICAgICAgcFlVVkJ1ZlsxXSwgICAgICAgICAgICAgLyogdSBhZGRyIG9yIHV2IGFkZHIgKi8KKyAgICAgICAgICAgICAgICBwWVVWQnVmWzJdLCAgICAgICAgICAgICAvKiB2IGFkZHIgb3Igbm9uZSAqLworICAgICAgICAgICAgICAgIDApOyAgICAgICAgICAgICAgICAgICAgIC8qIGlvbiBmZCAqLworICAgICAgICAgICAgY3NjX2NvbnZlcnQocFZpZGVvRGVjLT5jc2NfaGFuZGxlKTsKKworI2lmZGVmIENPTkZJR19NRkNfRlBTCisgICAgICAgICAgICBTRUNfT1NBTF9QZXJmU3RvcChQRVJGX0lEX0NTQyk7CisjZW5kaWYKKyAgICAgICAgfQorI2lmZGVmIFVTRV9BTkIKKyAgICAgICAgaWYgKHBTRUNPdXRwdXRQb3J0LT5iSXNBTkJFbmFibGVkID09IE9NWF9UUlVFKSB7CisgICAgICAgICAgICBTRUNfT1NBTF9VbmxvY2tBTkIocE91dHB1dERhdGEtPmRhdGFCdWZmZXIpOworICAgICAgICB9CisjZW5kaWYKKyAgICB9IGVsc2UgeworICAgICAgICBwT3V0cHV0RGF0YS0+ZGF0YUxlbiA9IDA7CisgICAgfQorCitFWElUOgorICAgIEZ1bmN0aW9uT3V0KCk7CisKKyAgICByZXR1cm4gcmV0OworfQorCitPTVhfRVJST1JUWVBFIFNFQ19NRkNfSDI2NF9EZWNvZGVfQmxvY2soT01YX0NPTVBPTkVOVFRZUEUgKnBPTVhDb21wb25lbnQsIFNFQ19PTVhfREFUQSAqcElucHV0RGF0YSwgU0VDX09NWF9EQVRBICpwT3V0cHV0RGF0YSkKK3sKKyAgICBPTVhfRVJST1JUWVBFICAgICAgICAgICAgICAgcmV0ID0gT01YX0Vycm9yTm9uZTsKKyAgICBTRUNfT01YX0JBU0VDT01QT05FTlQgICAgICAqcFNFQ0NvbXBvbmVudCA9IChTRUNfT01YX0JBU0VDT01QT05FTlQgKilwT01YQ29tcG9uZW50LT5wQ29tcG9uZW50UHJpdmF0ZTsKKyAgICBTRUNfT01YX1ZJREVPREVDX0NPTVBPTkVOVCAqcFZpZGVvRGVjID0gKFNFQ19PTVhfVklERU9ERUNfQ09NUE9ORU5UICopcFNFQ0NvbXBvbmVudC0+aENvbXBvbmVudEhhbmRsZTsKKyAgICBTRUNfT01YX0JBU0VQT1JUICAgICAgICAgICAqcFNFQ0lucHV0UG9ydCA9ICZwU0VDQ29tcG9uZW50LT5wU0VDUG9ydFtJTlBVVF9QT1JUX0lOREVYXTsKKyAgICBTRUNfT01YX0JBU0VQT1JUICAgICAgICAgICAqcFNFQ091dHB1dFBvcnQgPSAmcFNFQ0NvbXBvbmVudC0+cFNFQ1BvcnRbT1VUUFVUX1BPUlRfSU5ERVhdOworICAgIFNFQ19IMjY0REVDX0hBTkRMRSAgICAgICAgICpwSDI2NERlYyA9IChTRUNfSDI2NERFQ19IQU5ETEUgKikoKFNFQ19PTVhfVklERU9ERUNfQ09NUE9ORU5UICopcFNFQ0NvbXBvbmVudC0+aENvbXBvbmVudEhhbmRsZSktPmhDb2RlY0hhbmRsZTsKKyAgICBPTVhfVTMyICAgICAgICAgICAgICAgICAgICAgb25lRnJhbWVTaXplID0gcElucHV0RGF0YS0+ZGF0YUxlbjsKKyAgICBTU0JTSVBfTUZDX0RFQ19PVVRQVVRfSU5GTyAgb3V0cHV0SW5mbzsKKyAgICBPTVhfUzMyICAgICAgICAgICAgICAgICAgICAgc2V0Q29uZlZhbCA9IDA7CisgICAgT01YX1MzMiAgICAgICAgICAgICAgICAgICAgIHJldHVybkNvZGVjID0gMDsKKyAgICBpbnQgICAgICAgICAgICAgICAgICAgICAgICAgYnVmV2lkdGggPSAwOworICAgIGludCAgICAgICAgICAgICAgICAgICAgICAgICBidWZIZWlnaHQgPSAwOworICAgIE9NWF9VMzIgICAgICAgICAgICAgICAgICAgICBGcmFtZUJ1ZmZlcllTaXplOworICAgIE9NWF9VMzIgICAgICAgICAgICAgICAgICAgICBGcmFtZUJ1ZmZlclVWU2l6ZTsKKworICAgIEZ1bmN0aW9uSW4oKTsKKworICAgIGlmIChwSDI2NERlYy0+aE1GQ0gyNjRIYW5kbGUuYkNvbmZpZ3VyZWRNRkMgPT0gT01YX0ZBTFNFKSB7CisgICAgICAgIFNTQlNJUF9NRkNfQ09ERUNfVFlQRSBlQ29kZWNUeXBlID0gSDI2NF9ERUM7CisKKyAgICAgICAgaWYgKChvbmVGcmFtZVNpemUgPD0gMCkgJiYgKHBJbnB1dERhdGEtPm5GbGFncyAmIE9NWF9CVUZGRVJGTEFHX0VPUykpIHsKKyAgICAgICAgICAgIHBPdXRwdXREYXRhLT50aW1lU3RhbXAgPSBwSW5wdXREYXRhLT50aW1lU3RhbXA7CisgICAgICAgICAgICBwT3V0cHV0RGF0YS0+bkZsYWdzID0gcElucHV0RGF0YS0+bkZsYWdzOworICAgICAgICAgICAgcmV0ID0gT01YX0Vycm9yTm9uZTsKKyAgICAgICAgICAgIGdvdG8gRVhJVDsKKyAgICAgICAgfQorCisgICAgICAgIC8qIERlZmF1bHQgbnVtYmVyIGluIHRoZSBkcml2ZXIgaXMgb3B0aW1pemVkICovCisgICAgICAgIGlmIChwVmlkZW9EZWMtPmJUaHVtYm5haWxNb2RlID09IE9NWF9UUlVFKSB7CisgICAgICAgICAgICBzZXRDb25mVmFsID0gMDsKKyAgICAgICAgICAgIFNzYlNpcE1mY0RlY1NldENvbmZpZyhwSDI2NERlYy0+aE1GQ0gyNjRIYW5kbGUuaE1GQ0hhbmRsZSwgTUZDX0RFQ19TRVRDT05GX0RJU1BMQVlfREVMQVksICZzZXRDb25mVmFsKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHNldENvbmZWYWwgPSBIMjY0X0RFQ19OVU1fT0ZfRVhUUkFfQlVGRkVSUzsKKyAgICAgICAgICAgIFNzYlNpcE1mY0RlY1NldENvbmZpZyhwSDI2NERlYy0+aE1GQ0gyNjRIYW5kbGUuaE1GQ0hhbmRsZSwgTUZDX0RFQ19TRVRDT05GX0VYVFJBX0JVRkZFUl9OVU0sICZzZXRDb25mVmFsKTsKKworICAgICAgICAgICAgc2V0Q29uZlZhbCA9IDg7CisgICAgICAgICAgICBTc2JTaXBNZmNEZWNTZXRDb25maWcocEgyNjREZWMtPmhNRkNIMjY0SGFuZGxlLmhNRkNIYW5kbGUsIE1GQ19ERUNfU0VUQ09ORl9ESVNQTEFZX0RFTEFZLCAmc2V0Q29uZlZhbCk7CisgICAgICAgIH0KKworICAgICAgICByZXR1cm5Db2RlYyA9IFNzYlNpcE1mY0RlY0luaXQocEgyNjREZWMtPmhNRkNIMjY0SGFuZGxlLmhNRkNIYW5kbGUsIGVDb2RlY1R5cGUsIG9uZUZyYW1lU2l6ZSk7CisgICAgICAgIGlmIChyZXR1cm5Db2RlYyA9PSBNRkNfUkVUX09LKSB7CisgICAgICAgICAgICBTU0JTSVBfTUZDX0lNR19SRVNPTFVUSU9OIGltZ1Jlc29sOworICAgICAgICAgICAgU1NCU0lQX01GQ19DUk9QX0lORk9STUFUSU9OIGNyb3BJbmZvOworCisgICAgICAgICAgICBTc2JTaXBNZmNEZWNHZXRDb25maWcocEgyNjREZWMtPmhNRkNIMjY0SGFuZGxlLmhNRkNIYW5kbGUsIE1GQ19ERUNfR0VUQ09ORl9CVUZfV0lEVEhfSEVJR0hULCAmaW1nUmVzb2wpOworICAgICAgICAgICAgU0VDX09TQUxfTG9nKFNFQ19MT0dfVFJBQ0UsICJzZXQgd2lkdGggaGVpZ2h0IGluZm9ybWF0aW9uIDogJWQsICVkIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBwU0VDSW5wdXRQb3J0LT5wb3J0RGVmaW5pdGlvbi5mb3JtYXQudmlkZW8ubkZyYW1lV2lkdGgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcFNFQ0lucHV0UG9ydC0+cG9ydERlZmluaXRpb24uZm9ybWF0LnZpZGVvLm5GcmFtZUhlaWdodCk7CisgICAgICAgICAgICBTRUNfT1NBTF9Mb2coU0VDX0xPR19UUkFDRSwgIm1mYyB3aWR0aCBoZWlnaHQgaW5mb3JtYXRpb24gOiAlZCwgJWQiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGltZ1Jlc29sLndpZHRoLCBpbWdSZXNvbC5oZWlnaHQpOworCisgICAgICAgICAgICBTc2JTaXBNZmNEZWNHZXRDb25maWcocEgyNjREZWMtPmhNRkNIMjY0SGFuZGxlLmhNRkNIYW5kbGUsIE1GQ19ERUNfR0VUQ09ORl9DUk9QX0lORk8sICZjcm9wSW5mbyk7CisgICAgICAgICAgICBTRUNfT1NBTF9Mb2coU0VDX0xPR19UUkFDRSwgIm1mYyBjcm9wX3RvcCBjcm9wX2JvdHRvbSBjcm9wX2xlZnQgY3JvcF9yaWdodCA6ICAlZCwgJWQsICVkLCAlZCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY3JvcEluZm8uY3JvcF90b3Bfb2Zmc2V0ICwgY3JvcEluZm8uY3JvcF9ib3R0b21fb2Zmc2V0ICwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjcm9wSW5mby5jcm9wX2xlZnRfb2Zmc2V0ICwgY3JvcEluZm8uY3JvcF9yaWdodF9vZmZzZXQpOworCisgICAgICAgICAgICBwU0VDT3V0cHV0UG9ydC0+Y3JvcFJlY3RhbmdsZS5uVG9wICAgID0gY3JvcEluZm8uY3JvcF90b3Bfb2Zmc2V0OworICAgICAgICAgICAgcFNFQ091dHB1dFBvcnQtPmNyb3BSZWN0YW5nbGUubkxlZnQgICA9IGNyb3BJbmZvLmNyb3BfbGVmdF9vZmZzZXQ7CisgICAgICAgICAgICBwU0VDT3V0cHV0UG9ydC0+Y3JvcFJlY3RhbmdsZS5uV2lkdGggID0gaW1nUmVzb2wud2lkdGggLSBjcm9wSW5mby5jcm9wX2xlZnRfb2Zmc2V0IC0gY3JvcEluZm8uY3JvcF9yaWdodF9vZmZzZXQ7CisgICAgICAgICAgICBwU0VDT3V0cHV0UG9ydC0+Y3JvcFJlY3RhbmdsZS5uSGVpZ2h0ID0gaW1nUmVzb2wuaGVpZ2h0IC0gY3JvcEluZm8uY3JvcF90b3Bfb2Zmc2V0IC0gY3JvcEluZm8uY3JvcF9ib3R0b21fb2Zmc2V0OworCisgICAgICAgICAgICBwSDI2NERlYy0+aE1GQ0gyNjRIYW5kbGUuYkNvbmZpZ3VyZWRNRkMgPSBPTVhfVFJVRTsKKworICAgICAgICAgICAgLyoqIFVwZGF0ZSBGcmFtZSBTaXplICoqLworICAgICAgICAgICAgaWYgKChjcm9wSW5mby5jcm9wX2xlZnRfb2Zmc2V0ICE9IDApIHx8IChjcm9wSW5mby5jcm9wX3JpZ2h0X29mZnNldCAhPSAwKSB8fAorICAgICAgICAgICAgICAgIChjcm9wSW5mby5jcm9wX3RvcF9vZmZzZXQgIT0gMCkgfHwgKGNyb3BJbmZvLmNyb3BfYm90dG9tX29mZnNldCAhPSAwKSkgeworICAgICAgICAgICAgICAgIC8qIGNoYW5nZSB3aWR0aCBhbmQgaGVpZ2h0IGluZm9ybWF0aW9uICovCisgICAgICAgICAgICAgICAgcFNFQ0lucHV0UG9ydC0+cG9ydERlZmluaXRpb24uZm9ybWF0LnZpZGVvLm5GcmFtZVdpZHRoID0gaW1nUmVzb2wud2lkdGg7CisgICAgICAgICAgICAgICAgcFNFQ0lucHV0UG9ydC0+cG9ydERlZmluaXRpb24uZm9ybWF0LnZpZGVvLm5GcmFtZUhlaWdodCA9IGltZ1Jlc29sLmhlaWdodDsKKyAgICAgICAgICAgICAgICBwU0VDSW5wdXRQb3J0LT5wb3J0RGVmaW5pdGlvbi5mb3JtYXQudmlkZW8ublN0cmlkZSAgICAgID0gKChpbWdSZXNvbC53aWR0aCArIDE1KSAmICh+MTUpKTsKKyAgICAgICAgICAgICAgICBwU0VDSW5wdXRQb3J0LT5wb3J0RGVmaW5pdGlvbi5mb3JtYXQudmlkZW8ublNsaWNlSGVpZ2h0ID0gKChpbWdSZXNvbC5oZWlnaHQgKyAxNSkgJiAofjE1KSk7CisKKyAgICAgICAgICAgICAgICBTRUNfVXBkYXRlRnJhbWVTaXplKHBPTVhDb21wb25lbnQpOworCisgICAgICAgICAgICAgICAgLyoqIFNlbmQgY3JvcCBpbmZvIGNhbGwgYmFjayAqKi8KKyAgICAgICAgICAgICAgICAoKihwU0VDQ29tcG9uZW50LT5wQ2FsbGJhY2tzLT5FdmVudEhhbmRsZXIpKQorICAgICAgICAgICAgICAgICAgICAgIChwT01YQ29tcG9uZW50LAorICAgICAgICAgICAgICAgICAgICAgICBwU0VDQ29tcG9uZW50LT5jYWxsYmFja0RhdGEsCisgICAgICAgICAgICAgICAgICAgICAgIE9NWF9FdmVudFBvcnRTZXR0aW5nc0NoYW5nZWQsIC8qIFRoZSBjb21tYW5kIHdhcyBjb21wbGV0ZWQgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgT01YX0Rpck91dHB1dCwgLyogVGhpcyBpcyB0aGUgcG9ydCBpbmRleCAqLworICAgICAgICAgICAgICAgICAgICAgICBPTVhfSW5kZXhDb25maWdDb21tb25PdXRwdXRDcm9wLAorICAgICAgICAgICAgICAgICAgICAgICBOVUxMKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmICgocFNFQ0lucHV0UG9ydC0+cG9ydERlZmluaXRpb24uZm9ybWF0LnZpZGVvLm5GcmFtZVdpZHRoICE9ICh1bnNpZ25lZCBpbnQpaW1nUmVzb2wud2lkdGgpIHx8CisgICAgICAgICAgICAgICAgKHBTRUNJbnB1dFBvcnQtPnBvcnREZWZpbml0aW9uLmZvcm1hdC52aWRlby5uRnJhbWVIZWlnaHQgIT0gKHVuc2lnbmVkIGludClpbWdSZXNvbC5oZWlnaHQpKSB7CisgICAgICAgICAgICAgICAgU0VDX09TQUxfTG9nKFNFQ19MT0dfVFJBQ0UsICJjaGFuZ2Ugd2lkdGggaGVpZ2h0IGluZm9ybWF0aW9uIDogT01YX0V2ZW50UG9ydFNldHRpbmdzQ2hhbmdlZCIpOworICAgICAgICAgICAgICAgIC8qIGNoYW5nZSB3aWR0aCBhbmQgaGVpZ2h0IGluZm9ybWF0aW9uICovCisgICAgICAgICAgICAgICAgcFNFQ0lucHV0UG9ydC0+cG9ydERlZmluaXRpb24uZm9ybWF0LnZpZGVvLm5GcmFtZVdpZHRoID0gaW1nUmVzb2wud2lkdGg7CisgICAgICAgICAgICAgICAgcFNFQ0lucHV0UG9ydC0+cG9ydERlZmluaXRpb24uZm9ybWF0LnZpZGVvLm5GcmFtZUhlaWdodCA9IGltZ1Jlc29sLmhlaWdodDsKKyAgICAgICAgICAgICAgICBwU0VDSW5wdXRQb3J0LT5wb3J0RGVmaW5pdGlvbi5mb3JtYXQudmlkZW8ublN0cmlkZSAgICAgID0gKChpbWdSZXNvbC53aWR0aCArIDE1KSAmICh+MTUpKTsKKyAgICAgICAgICAgICAgICBwU0VDSW5wdXRQb3J0LT5wb3J0RGVmaW5pdGlvbi5mb3JtYXQudmlkZW8ublNsaWNlSGVpZ2h0ID0gKChpbWdSZXNvbC5oZWlnaHQgKyAxNSkgJiAofjE1KSk7CisKKyAgICAgICAgICAgICAgICBTRUNfVXBkYXRlRnJhbWVTaXplKHBPTVhDb21wb25lbnQpOworCisgICAgICAgICAgICAgICAgLyoqIFNlbmQgUG9ydCBTZXR0aW5ncyBjaGFuZ2VkIGNhbGwgYmFjayAqKi8KKyAgICAgICAgICAgICAgICAoKihwU0VDQ29tcG9uZW50LT5wQ2FsbGJhY2tzLT5FdmVudEhhbmRsZXIpKQorICAgICAgICAgICAgICAgICAgICAgIChwT01YQ29tcG9uZW50LAorICAgICAgICAgICAgICAgICAgICAgICBwU0VDQ29tcG9uZW50LT5jYWxsYmFja0RhdGEsCisgICAgICAgICAgICAgICAgICAgICAgIE9NWF9FdmVudFBvcnRTZXR0aW5nc0NoYW5nZWQsIC8qIFRoZSBjb21tYW5kIHdhcyBjb21wbGV0ZWQgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgT01YX0Rpck91dHB1dCwgLyogVGhpcyBpcyB0aGUgcG9ydCBpbmRleCAqLworICAgICAgICAgICAgICAgICAgICAgICAwLAorICAgICAgICAgICAgICAgICAgICAgICBOVUxMKTsKKyAgICAgICAgICAgIH0KKworI2lmZGVmIEFERF9TUFNfUFBTX0lfRlJBTUUKKyAgICAgICAgICAgIHJldCA9IE9NWF9FcnJvcklucHV0RGF0YURlY29kZVlldDsKKyNlbHNlCisgICAgICAgICAgICBwT3V0cHV0RGF0YS0+dGltZVN0YW1wID0gcElucHV0RGF0YS0+dGltZVN0YW1wOworICAgICAgICAgICAgcE91dHB1dERhdGEtPm5GbGFncyA9IHBJbnB1dERhdGEtPm5GbGFnczsKKworICAgICAgICAgICAgcmV0ID0gT01YX0Vycm9yTm9uZTsKKyNlbmRpZgorICAgICAgICAgICAgZ290byBFWElUOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgcmV0ID0gT01YX0Vycm9yTUZDSW5pdDsKKyAgICAgICAgICAgIGdvdG8gRVhJVDsKKyAgICAgICAgfQorICAgIH0KKworI2lmbmRlZiBGVUxMX0ZSQU1FX1NFQVJDSAorICAgIGlmICgocElucHV0RGF0YS0+bkZsYWdzICYgT01YX0JVRkZFUkZMQUdfRU5ET0ZGUkFNRSkgJiYKKyAgICAgICAgKHBTRUNDb21wb25lbnQtPmJVc2VGbGFnRU9GID09IE9NWF9GQUxTRSkpCisgICAgICAgIHBTRUNDb21wb25lbnQtPmJVc2VGbGFnRU9GID0gT01YX1RSVUU7CisjZW5kaWYKKworICAgIGlmIChDaGVja19IMjY0X1N0YXJ0Q29kZShwSW5wdXREYXRhLT5kYXRhQnVmZmVyLCBwSW5wdXREYXRhLT5kYXRhTGVuKSA9PSBPTVhfVFJVRSkgeworICAgICAgICBwU0VDQ29tcG9uZW50LT50aW1lU3RhbXBbcEgyNjREZWMtPmhNRkNIMjY0SGFuZGxlLmluZGV4VGltZXN0YW1wXSA9IHBJbnB1dERhdGEtPnRpbWVTdGFtcDsKKyAgICAgICAgcFNFQ0NvbXBvbmVudC0+bkZsYWdzW3BIMjY0RGVjLT5oTUZDSDI2NEhhbmRsZS5pbmRleFRpbWVzdGFtcF0gPSBwSW5wdXREYXRhLT5uRmxhZ3M7CisgICAgICAgIFNzYlNpcE1mY0RlY1NldENvbmZpZyhwSDI2NERlYy0+aE1GQ0gyNjRIYW5kbGUuaE1GQ0hhbmRsZSwgTUZDX0RFQ19TRVRDT05GX0ZSQU1FX1RBRywgJihwSDI2NERlYy0+aE1GQ0gyNjRIYW5kbGUuaW5kZXhUaW1lc3RhbXApKTsKKworICAgICAgICByZXR1cm5Db2RlYyA9IFNzYlNpcE1mY0RlY0V4ZShwSDI2NERlYy0+aE1GQ0gyNjRIYW5kbGUuaE1GQ0hhbmRsZSwgb25lRnJhbWVTaXplKTsKKyAgICB9IGVsc2UgeworICAgICAgICBpZiAocFNFQ0NvbXBvbmVudC0+Y2hlY2tUaW1lU3RhbXAubmVlZENoZWNrU3RhcnRUaW1lU3RhbXAgPT0gT01YX1RSVUUpCisgICAgICAgICAgICBwU0VDQ29tcG9uZW50LT5jaGVja1RpbWVTdGFtcC5uZWVkU2V0U3RhcnRUaW1lU3RhbXAgPSBPTVhfVFJVRTsKKworICAgICAgICBwT3V0cHV0RGF0YS0+dGltZVN0YW1wID0gcElucHV0RGF0YS0+dGltZVN0YW1wOworICAgICAgICBwT3V0cHV0RGF0YS0+bkZsYWdzID0gcElucHV0RGF0YS0+bkZsYWdzOworICAgICAgICByZXR1cm5Db2RlYyA9IE1GQ19SRVRfT0s7CisgICAgICAgIGdvdG8gRVhJVDsKKyAgICB9CisKKyAgICBpZiAocmV0dXJuQ29kZWMgPT0gTUZDX1JFVF9PSykgeworICAgICAgICBTU0JTSVBfTUZDX0RFQ19PVVRCVUZfU1RBVFVTIHN0YXR1czsKKyAgICAgICAgT01YX1MzMiBpbmRleFRpbWVzdGFtcCA9IDA7CisKKyAgICAgICAgc3RhdHVzID0gU3NiU2lwTWZjRGVjR2V0T3V0QnVmKHBIMjY0RGVjLT5oTUZDSDI2NEhhbmRsZS5oTUZDSGFuZGxlLCAmb3V0cHV0SW5mbyk7CisgICAgICAgIGJ1ZldpZHRoID0gICAgKG91dHB1dEluZm8uaW1nX3dpZHRoICsgMTUpICYgKH4xNSk7CisgICAgICAgIGJ1ZkhlaWdodCA9ICAob3V0cHV0SW5mby5pbWdfaGVpZ2h0ICsgMTUpICYgKH4xNSk7CisgICAgICAgIEZyYW1lQnVmZmVyWVNpemUgPSBBTElHTl9UT184S0IoQUxJR05fVE9fMTI4QihvdXRwdXRJbmZvLmltZ193aWR0aCkgKiBBTElHTl9UT18zMkIob3V0cHV0SW5mby5pbWdfaGVpZ2h0KSk7CisgICAgICAgIEZyYW1lQnVmZmVyVVZTaXplID0gQUxJR05fVE9fOEtCKEFMSUdOX1RPXzEyOEIob3V0cHV0SW5mby5pbWdfd2lkdGgpICogQUxJR05fVE9fMzJCKG91dHB1dEluZm8uaW1nX2hlaWdodC8yKSk7CisKKyAgICAgICAgaWYgKHN0YXR1cyAhPSBNRkNfR0VUT1VUQlVGX0RJU1BMQVlfT05MWSkgeworICAgICAgICAgICAgcEgyNjREZWMtPmhNRkNIMjY0SGFuZGxlLmluZGV4VGltZXN0YW1wKys7CisgICAgICAgICAgICBwSDI2NERlYy0+aE1GQ0gyNjRIYW5kbGUuaW5kZXhUaW1lc3RhbXAgJT0gTUFYX1RJTUVTVEFNUDsKKyAgICAgICAgfQorCisgICAgICAgIGlmICgoU3NiU2lwTWZjRGVjR2V0Q29uZmlnKHBIMjY0RGVjLT5oTUZDSDI2NEhhbmRsZS5oTUZDSGFuZGxlLCBNRkNfREVDX0dFVENPTkZfRlJBTUVfVEFHLCAmaW5kZXhUaW1lc3RhbXApICE9IE1GQ19SRVRfT0spIHx8CisgICAgICAgICAgICAoKChpbmRleFRpbWVzdGFtcCA8IDApIHx8IChpbmRleFRpbWVzdGFtcCA+PSBNQVhfVElNRVNUQU1QKSkpKSB7CisgICAgICAgICAgICBwT3V0cHV0RGF0YS0+dGltZVN0YW1wID0gcElucHV0RGF0YS0+dGltZVN0YW1wOworICAgICAgICAgICAgcE91dHB1dERhdGEtPm5GbGFncyA9IHBJbnB1dERhdGEtPm5GbGFnczsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIC8qIEZvciB0aW1lc3RhbXAgY29ycmVjdGlvbi4gaWYgbWZjIHN1cHBvcnQgZnJhbWV0eXBlIGRldGVjdCAqLworICAgICAgICAgICAgU0VDX09TQUxfTG9nKFNFQ19MT0dfVFJBQ0UsICJkaXNwX3BpY19mcmFtZV90eXBlOiAlZCIsIG91dHB1dEluZm8uZGlzcF9waWNfZnJhbWVfdHlwZSk7CisjaWZkZWYgTkVFRF9USU1FU1RBTVBfUkVPUkRFUgorICAgICAgICAgICAgaWYgKChvdXRwdXRJbmZvLmRpc3BfcGljX2ZyYW1lX3R5cGUgPT0gTUZDX0ZSQU1FX1RZUEVfSV9GUkFNRSkgfHwKKyAgICAgICAgICAgICAgICAocEgyNjREZWMtPmhNRkNIMjY0SGFuZGxlLmJGbGFzaFBsYXllck1vZGUgIT0gT01YX0ZBTFNFKSkgeworICAgICAgICAgICAgICAgIHBPdXRwdXREYXRhLT50aW1lU3RhbXAgPSBwU0VDQ29tcG9uZW50LT50aW1lU3RhbXBbaW5kZXhUaW1lc3RhbXBdOworICAgICAgICAgICAgICAgIHBPdXRwdXREYXRhLT5uRmxhZ3MgPSBwU0VDQ29tcG9uZW50LT5uRmxhZ3NbaW5kZXhUaW1lc3RhbXBdOworICAgICAgICAgICAgICAgIHBIMjY0RGVjLT5oTUZDSDI2NEhhbmRsZS5vdXRwdXRJbmRleFRpbWVzdGFtcCA9IGluZGV4VGltZXN0YW1wOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBwT3V0cHV0RGF0YS0+dGltZVN0YW1wID0gcFNFQ0NvbXBvbmVudC0+dGltZVN0YW1wW3BIMjY0RGVjLT5oTUZDSDI2NEhhbmRsZS5vdXRwdXRJbmRleFRpbWVzdGFtcF07CisgICAgICAgICAgICAgICAgcE91dHB1dERhdGEtPm5GbGFncyA9IHBTRUNDb21wb25lbnQtPm5GbGFnc1twSDI2NERlYy0+aE1GQ0gyNjRIYW5kbGUub3V0cHV0SW5kZXhUaW1lc3RhbXBdOworICAgICAgICAgICAgfQorI2Vsc2UKKyAgICAgICAgICAgIHBPdXRwdXREYXRhLT50aW1lU3RhbXAgPSBwU0VDQ29tcG9uZW50LT50aW1lU3RhbXBbaW5kZXhUaW1lc3RhbXBdOworICAgICAgICAgICAgcE91dHB1dERhdGEtPm5GbGFncyA9IHBTRUNDb21wb25lbnQtPm5GbGFnc1tpbmRleFRpbWVzdGFtcF07CisjZW5kaWYKKyAgICAgICAgICAgIFNFQ19PU0FMX0xvZyhTRUNfTE9HX1RSQUNFLCAidGltZXN0YW1wICVsbGQgdXMgKCUuMmYgc2VjcykiLCBwT3V0cHV0RGF0YS0+dGltZVN0YW1wLCBwT3V0cHV0RGF0YS0+dGltZVN0YW1wIC8gMUU2KTsKKyAgICAgICAgfQorCisgICAgICAgIGlmICgoc3RhdHVzID09IE1GQ19HRVRPVVRCVUZfRElTUExBWV9ERUNPRElORykgfHwKKyAgICAgICAgICAgIChzdGF0dXMgPT0gTUZDX0dFVE9VVEJVRl9ESVNQTEFZX09OTFkpKSB7CisgICAgICAgICAgICAvKiogRmlsbCBPdXRwdXQgQnVmZmVyICoqLworICAgICAgICAgICAgdm9pZCAqcE91dHB1dEJ1ZiA9ICh2b2lkICopcE91dHB1dERhdGEtPmRhdGFCdWZmZXI7CisgICAgICAgICAgICB2b2lkICpwU3JjQnVmWzNdID0ge05VTEwsIH07CisgICAgICAgICAgICB2b2lkICpwWVVWQnVmWzNdID0ge05VTEwsIH07CisgICAgICAgICAgICB1bnNpZ25lZCBpbnQgY3NjX3NyY19jb2xvcl9mb3JtYXQsIGNzY19kc3RfY29sb3JfZm9ybWF0OworICAgICAgICAgICAgQ1NDX01FVEhPRCBjc2NfbWV0aG9kID0gQ1NDX01FVEhPRF9TVzsKKyAgICAgICAgICAgIHVuc2lnbmVkIGludCBjYWNoZWFibGUgPSAxOworCisgICAgICAgICAgICBpbnQgZnJhbWVTaXplID0gYnVmV2lkdGggKiBidWZIZWlnaHQ7CisgICAgICAgICAgICBpbnQgYWN0dWFsV2lkdGggPSBvdXRwdXRJbmZvLmltZ193aWR0aDsKKyAgICAgICAgICAgIGludCBhY3R1YWxIZWlnaHQgPSBvdXRwdXRJbmZvLmltZ19oZWlnaHQ7CisgICAgICAgICAgICBpbnQgYWN0dWFsSW1hZ2VTaXplID0gYWN0dWFsV2lkdGggKiBhY3R1YWxIZWlnaHQ7CisKKyAgICAgICAgICAgIHBTcmNCdWZbMF0gPSBvdXRwdXRJbmZvLllWaXJBZGRyOworICAgICAgICAgICAgcFNyY0J1ZlsxXSA9IG91dHB1dEluZm8uQ1ZpckFkZHI7CisKKyAgICAgICAgICAgIHBZVVZCdWZbMF0gID0gKHVuc2lnbmVkIGNoYXIgKilwT3V0cHV0QnVmOworICAgICAgICAgICAgcFlVVkJ1ZlsxXSAgPSAodW5zaWduZWQgY2hhciAqKXBPdXRwdXRCdWYgKyBhY3R1YWxJbWFnZVNpemU7CisgICAgICAgICAgICBwWVVWQnVmWzJdICA9ICh1bnNpZ25lZCBjaGFyICopcE91dHB1dEJ1ZiArIGFjdHVhbEltYWdlU2l6ZSArIGFjdHVhbEltYWdlU2l6ZSAvIDQ7CisgICAgICAgICAgICBwT3V0cHV0RGF0YS0+ZGF0YUxlbiA9IChhY3R1YWxJbWFnZVNpemUgKiAzKSAvIDI7CisKKyNpZmRlZiBVU0VfQU5CCisgICAgICAgICAgICBpZiAocFNFQ091dHB1dFBvcnQtPmJJc0FOQkVuYWJsZWQgPT0gT01YX1RSVUUpIHsKKyAgICAgICAgICAgICAgICBPTVhfVTMyIHN0cmlkZTsKKyAgICAgICAgICAgICAgICBTRUNfT1NBTF9Mb2NrQU5CKHBPdXRwdXREYXRhLT5kYXRhQnVmZmVyLCBhY3R1YWxXaWR0aCwgYWN0dWFsSGVpZ2h0LCBwU0VDQ29tcG9uZW50LT5wU0VDUG9ydFtPVVRQVVRfUE9SVF9JTkRFWF0ucG9ydERlZmluaXRpb24uZm9ybWF0LnZpZGVvLmVDb2xvckZvcm1hdCwgJnN0cmlkZSwgcFlVVkJ1Zik7CisgICAgICAgICAgICAgICAgYWN0dWFsV2lkdGggPSBzdHJpZGU7CisgICAgICAgICAgICAgICAgcE91dHB1dERhdGEtPmRhdGFMZW4gPSBzaXplb2Yodm9pZCAqKTsKKyAgICAgICAgICAgIH0KKyNlbmRpZgorICAgICAgICAgICAgaWYgKChwVmlkZW9EZWMtPmJUaHVtYm5haWxNb2RlID09IE9NWF9GQUxTRSkgJiYKKyAgICAgICAgICAgICAgICAocFNFQ091dHB1dFBvcnQtPnBvcnREZWZpbml0aW9uLmZvcm1hdC52aWRlby5lQ29sb3JGb3JtYXQgPT0gT01YX1NFQ19DT0xPUl9Gb3JtYXROVjEyVFBoeXNpY2FsQWRkcmVzcykpIHsKKyAgICAgICAgICAgICAgICAvKiBpZiB1c2UgUG9zdCBjb3B5IGFkZHJlc3Mgc3RydWN0dXJlICovCisgICAgICAgICAgICAgICAgU0VDX09TQUxfTWVtY3B5KHBZVVZCdWZbMF0sICYob3V0cHV0SW5mby5ZUGh5QWRkciksIHNpemVvZihvdXRwdXRJbmZvLllQaHlBZGRyKSk7CisgICAgICAgICAgICAgICAgU0VDX09TQUxfTWVtY3B5KCh1bnNpZ25lZCBjaGFyICopcFlVVkJ1ZlswXSArIChzaXplb2Yodm9pZCAqKSAqIDEpLCAmKG91dHB1dEluZm8uQ1BoeUFkZHIpLCBzaXplb2Yob3V0cHV0SW5mby5DUGh5QWRkcikpOworICAgICAgICAgICAgICAgIFNFQ19PU0FMX01lbWNweSgodW5zaWduZWQgY2hhciAqKXBZVVZCdWZbMF0gKyAoc2l6ZW9mKHZvaWQgKikgKiAyKSwgJihvdXRwdXRJbmZvLllWaXJBZGRyKSwgc2l6ZW9mKG91dHB1dEluZm8uWVZpckFkZHIpKTsKKyAgICAgICAgICAgICAgICBTRUNfT1NBTF9NZW1jcHkoKHVuc2lnbmVkIGNoYXIgKilwWVVWQnVmWzBdICsgKHNpemVvZih2b2lkICopICogMyksICYob3V0cHV0SW5mby5DVmlyQWRkciksIHNpemVvZihvdXRwdXRJbmZvLkNWaXJBZGRyKSk7CisgICAgICAgICAgICAgICAgcE91dHB1dERhdGEtPmRhdGFMZW4gPSAoYWN0dWFsV2lkdGggKiBhY3R1YWxIZWlnaHQgKiAzKSAvIDI7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIFNFQ19PU0FMX0xvZyhTRUNfTE9HX1RSQUNFLCAiWVVWNDIwcCBvdXQgZm9yIFRodW1ibmFpbE1vZGUvRmxhc2ggcGxheWVyIG1vZGUiKTsKKyNpZmRlZiBDT05GSUdfTUZDX0ZQUworICAgICAgICAgICAgICAgIFNFQ19PU0FMX1BlcmZTdGFydChQRVJGX0lEX0NTQyk7CisjZW5kaWYKKyAgICAgICAgICAgICAgICBzd2l0Y2ggKHBTRUNDb21wb25lbnQtPnBTRUNQb3J0W09VVFBVVF9QT1JUX0lOREVYXS5wb3J0RGVmaW5pdGlvbi5mb3JtYXQudmlkZW8uZUNvbG9yRm9ybWF0KSB7CisgICAgICAgICAgICAgICAgY2FzZSBPTVhfU0VDX0NPTE9SX0Zvcm1hdE5WMTJUaWxlZDoKKyAgICAgICAgICAgICAgICAgICAgU0VDX09TQUxfTWVtY3B5KHBPdXRwdXRCdWYsIG91dHB1dEluZm8uWVZpckFkZHIsIEZyYW1lQnVmZmVyWVNpemUpOworICAgICAgICAgICAgICAgICAgICBTRUNfT1NBTF9NZW1jcHkoKHVuc2lnbmVkIGNoYXIgKilwT3V0cHV0QnVmICsgRnJhbWVCdWZmZXJZU2l6ZSwgb3V0cHV0SW5mby5DVmlyQWRkciwgRnJhbWVCdWZmZXJVVlNpemUpOworICAgICAgICAgICAgICAgICAgICBwT3V0cHV0RGF0YS0+ZGF0YUxlbiA9IEZyYW1lQnVmZmVyWVNpemUgKyBGcmFtZUJ1ZmZlclVWU2l6ZTsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgY2FzZSBPTVhfQ09MT1JfRm9ybWF0WVVWNDIwU2VtaVBsYW5hcjoKKyAgICAgICAgICAgICAgICBjYXNlIE9NWF9TRUNfQ09MT1JfRm9ybWF0QU5CWVVWNDIwU2VtaVBsYW5hcjoKKyAgICAgICAgICAgICAgICAgICAgY3NjX3NyY19jb2xvcl9mb3JtYXQgPSBvbXhfMl9oYWxfcGl4ZWxfZm9ybWF0KCh1bnNpZ25lZCBpbnQpT01YX1NFQ19DT0xPUl9Gb3JtYXROVjEyVGlsZWQpOworICAgICAgICAgICAgICAgICAgICBjc2NfZHN0X2NvbG9yX2Zvcm1hdCA9IG9teF8yX2hhbF9waXhlbF9mb3JtYXQoKHVuc2lnbmVkIGludClPTVhfQ09MT1JfRm9ybWF0WVVWNDIwU2VtaVBsYW5hcik7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIGNhc2UgT01YX0NPTE9SX0Zvcm1hdFlVVjQyMFBsYW5hcjoKKyAgICAgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgICAgICBjc2Nfc3JjX2NvbG9yX2Zvcm1hdCA9IG9teF8yX2hhbF9waXhlbF9mb3JtYXQoKHVuc2lnbmVkIGludClPTVhfU0VDX0NPTE9SX0Zvcm1hdE5WMTJUaWxlZCk7CisgICAgICAgICAgICAgICAgICAgIGNzY19kc3RfY29sb3JfZm9ybWF0ID0gb214XzJfaGFsX3BpeGVsX2Zvcm1hdCgodW5zaWduZWQgaW50KU9NWF9DT0xPUl9Gb3JtYXRZVVY0MjBQbGFuYXIpOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBjc2NfZ2V0X21ldGhvZChwVmlkZW9EZWMtPmNzY19oYW5kbGUsICZjc2NfbWV0aG9kKTsKKyNpZmRlZiBVU0VfQ1NDX0ZJTUMKKyAgICAgICAgICAgICAgICBpZiAoKHBTRUNPdXRwdXRQb3J0LT5iSXNBTkJFbmFibGVkID09IE9NWF9UUlVFKSAmJiAoY3NjX21ldGhvZCA9PSBDU0NfTUVUSE9EX0hXKSkgeworICAgICAgICAgICAgICAgICAgICBTRUNfT1NBTF9HZXRQaHlzQU5CKHBPdXRwdXREYXRhLT5kYXRhQnVmZmVyLCBwWVVWQnVmKTsKKyAgICAgICAgICAgICAgICAgICAgcFNyY0J1ZlswXSA9IG91dHB1dEluZm8uWVBoeUFkZHI7CisgICAgICAgICAgICAgICAgICAgIHBTcmNCdWZbMV0gPSBvdXRwdXRJbmZvLkNQaHlBZGRyOworICAgICAgICAgICAgICAgIH0KKyNlbmRpZgorICAgICAgICAgICAgICAgIGlmIChwVmlkZW9EZWMtPmNzY19zZXRfZm9ybWF0ID09IE9NWF9GQUxTRSkgeworICAgICAgICAgICAgICAgICAgICBjc2Nfc2V0X3NyY19mb3JtYXQoCisgICAgICAgICAgICAgICAgICAgICAgICBwVmlkZW9EZWMtPmNzY19oYW5kbGUsICAvKiBoYW5kbGUgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgIGFjdHVhbFdpZHRoLCAgICAgICAgICAgIC8qIHdpZHRoICovCisgICAgICAgICAgICAgICAgICAgICAgICBhY3R1YWxIZWlnaHQsICAgICAgICAgICAvKiBoZWlnaHQgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgIDAsICAgICAgICAgICAgICAgICAgICAgIC8qIGNyb3BfbGVmdCAqLworICAgICAgICAgICAgICAgICAgICAgICAgMCwgICAgICAgICAgICAgICAgICAgICAgLyogY3JvcF9yaWdodCAqLworICAgICAgICAgICAgICAgICAgICAgICAgYWN0dWFsV2lkdGgsICAgICAgICAgICAgLyogY3JvcF93aWR0aCAqLworICAgICAgICAgICAgICAgICAgICAgICAgYWN0dWFsSGVpZ2h0LCAgICAgICAgICAgLyogY3JvcF9oZWlnaHQgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgIGNzY19zcmNfY29sb3JfZm9ybWF0LCAgIC8qIGNvbG9yX2Zvcm1hdCAqLworICAgICAgICAgICAgICAgICAgICAgICAgY2FjaGVhYmxlKTsgICAgICAgICAgICAgLyogY2FjaGVhYmxlICovCisgICAgICAgICAgICAgICAgICAgIGNzY19zZXRfZHN0X2Zvcm1hdCgKKyAgICAgICAgICAgICAgICAgICAgICAgIHBWaWRlb0RlYy0+Y3NjX2hhbmRsZSwgIC8qIGhhbmRsZSAqLworICAgICAgICAgICAgICAgICAgICAgICAgYWN0dWFsV2lkdGgsICAgICAgICAgICAgLyogd2lkdGggKi8KKyAgICAgICAgICAgICAgICAgICAgICAgIGFjdHVhbEhlaWdodCwgICAgICAgICAgIC8qIGhlaWdodCAqLworICAgICAgICAgICAgICAgICAgICAgICAgMCwgICAgICAgICAgICAgICAgICAgICAgLyogY3JvcF9sZWZ0ICovCisgICAgICAgICAgICAgICAgICAgICAgICAwLCAgICAgICAgICAgICAgICAgICAgICAvKiBjcm9wX3JpZ2h0ICovCisgICAgICAgICAgICAgICAgICAgICAgICBhY3R1YWxXaWR0aCwgICAgICAgICAgICAvKiBjcm9wX3dpZHRoICovCisgICAgICAgICAgICAgICAgICAgICAgICBhY3R1YWxIZWlnaHQsICAgICAgICAgICAvKiBjcm9wX2hlaWdodCAqLworICAgICAgICAgICAgICAgICAgICAgICAgY3NjX2RzdF9jb2xvcl9mb3JtYXQsICAgLyogY29sb3JfZm9ybWF0ICovCisgICAgICAgICAgICAgICAgICAgICAgICBjYWNoZWFibGUpOyAgICAgICAgICAgICAvKiBjYWNoZWFibGUgKi8KKyAgICAgICAgICAgICAgICAgICAgcFZpZGVvRGVjLT5jc2Nfc2V0X2Zvcm1hdCA9IE9NWF9UUlVFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBjc2Nfc2V0X3NyY19idWZmZXIoCisgICAgICAgICAgICAgICAgICAgIHBWaWRlb0RlYy0+Y3NjX2hhbmRsZSwgIC8qIGhhbmRsZSAqLworICAgICAgICAgICAgICAgICAgICBwU3JjQnVmWzBdLCAgICAgICAgICAgICAvKiB5IGFkZHIgKi8KKyAgICAgICAgICAgICAgICAgICAgcFNyY0J1ZlsxXSwgICAgICAgICAgICAgLyogdSBhZGRyIG9yIHV2IGFkZHIgKi8KKyAgICAgICAgICAgICAgICAgICAgcFNyY0J1ZlsyXSwgICAgICAgICAgICAgLyogdiBhZGRyIG9yIG5vbmUgKi8KKyAgICAgICAgICAgICAgICAgICAgMCk7ICAgICAgICAgICAgICAgICAgICAgLyogaW9uIGZkICovCisgICAgICAgICAgICAgICAgY3NjX3NldF9kc3RfYnVmZmVyKAorICAgICAgICAgICAgICAgICAgICBwVmlkZW9EZWMtPmNzY19oYW5kbGUsICAvKiBoYW5kbGUgKi8KKyAgICAgICAgICAgICAgICAgICAgcFlVVkJ1ZlswXSwgICAgICAgICAgICAgLyogeSBhZGRyICovCisgICAgICAgICAgICAgICAgICAgIHBZVVZCdWZbMV0sICAgICAgICAgICAgIC8qIHUgYWRkciBvciB1diBhZGRyICovCisgICAgICAgICAgICAgICAgICAgIHBZVVZCdWZbMl0sICAgICAgICAgICAgIC8qIHYgYWRkciBvciBub25lICovCisgICAgICAgICAgICAgICAgICAgIDApOyAgICAgICAgICAgICAgICAgICAgIC8qIGlvbiBmZCAqLworICAgICAgICAgICAgICAgIGNzY19jb252ZXJ0KHBWaWRlb0RlYy0+Y3NjX2hhbmRsZSk7CisKKyNpZmRlZiBDT05GSUdfTUZDX0ZQUworICAgICAgICAgICAgICAgIFNFQ19PU0FMX1BlcmZTdG9wKFBFUkZfSURfQ1NDKTsKKyNlbmRpZgorICAgICAgICAgICAgfQorCisjaWZkZWYgVVNFX0FOQgorICAgICAgICAgICAgaWYgKHBTRUNPdXRwdXRQb3J0LT5iSXNBTkJFbmFibGVkID09IE9NWF9UUlVFKSB7CisgICAgICAgICAgICAgICAgU0VDX09TQUxfVW5sb2NrQU5CKHBPdXRwdXREYXRhLT5kYXRhQnVmZmVyKTsKKyAgICAgICAgICAgIH0KKyNlbmRpZgorICAgICAgICAgICAgcEgyNjREZWMtPmhNRkNIMjY0SGFuZGxlLm91dHB1dEluZGV4VGltZXN0YW1wKys7CisgICAgICAgICAgICBwSDI2NERlYy0+aE1GQ0gyNjRIYW5kbGUub3V0cHV0SW5kZXhUaW1lc3RhbXAgJT0gTUFYX1RJTUVTVEFNUDsKKyAgICAgICAgfQorICAgICAgICBpZiAocE91dHB1dERhdGEtPm5GbGFncyAmIE9NWF9CVUZGRVJGTEFHX0VPUykKKyAgICAgICAgICAgIHBPdXRwdXREYXRhLT5kYXRhTGVuID0gMDsKKworICAgICAgICBpZiAoKHN0YXR1cyA9PSBNRkNfR0VUT1VUQlVGX0RJU1BMQVlfT05MWSkgfHwKKyAgICAgICAgICAgIChwU0VDQ29tcG9uZW50LT5nZXRBbGxEZWxheUJ1ZmZlciA9PSBPTVhfVFJVRSkpCisgICAgICAgICAgICByZXQgPSBPTVhfRXJyb3JJbnB1dERhdGFEZWNvZGVZZXQ7CisKKyAgICAgICAgaWYgKHN0YXR1cyA9PSBNRkNfR0VUT1VUQlVGX0RFQ09ESU5HX09OTFkpIHsKKyAgICAgICAgICAgIGlmICgoKHBJbnB1dERhdGEtPm5GbGFncyAmIE9NWF9CVUZGRVJGTEFHX0VPUykgIT0gT01YX0JVRkZFUkZMQUdfRU9TKSAmJgorICAgICAgICAgICAgICAgICgocFNFQ0NvbXBvbmVudC0+YlNhdmVGbGFnRU9TID09IE9NWF9UUlVFKSB8fCAocFNFQ0NvbXBvbmVudC0+Z2V0QWxsRGVsYXlCdWZmZXIgPT0gT01YX1RSVUUpKSkgeworICAgICAgICAgICAgICAgIHBJbnB1dERhdGEtPm5GbGFncyB8PSBPTVhfQlVGRkVSRkxBR19FT1M7CisgICAgICAgICAgICAgICAgcFNFQ0NvbXBvbmVudC0+Z2V0QWxsRGVsYXlCdWZmZXIgPSBPTVhfVFJVRTsKKyAgICAgICAgICAgICAgICByZXQgPSBPTVhfRXJyb3JJbnB1dERhdGFEZWNvZGVZZXQ7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIHJldCA9IE9NWF9FcnJvck5vbmU7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBnb3RvIEVYSVQ7CisgICAgICAgIH0KKworI2lmZGVmIEZVTExfRlJBTUVfU0VBUkNICisgICAgICAgIGlmICgoKHBJbnB1dERhdGEtPm5GbGFncyAmIE9NWF9CVUZGRVJGTEFHX0VPUykgIT0gT01YX0JVRkZFUkZMQUdfRU9TKSAmJgorICAgICAgICAgICAgKHBTRUNDb21wb25lbnQtPmJTYXZlRmxhZ0VPUyA9PSBPTVhfVFJVRSkpIHsKKyAgICAgICAgICAgIHBJbnB1dERhdGEtPm5GbGFncyB8PSBPTVhfQlVGRkVSRkxBR19FT1M7CisgICAgICAgICAgICBwU0VDQ29tcG9uZW50LT5nZXRBbGxEZWxheUJ1ZmZlciA9IE9NWF9UUlVFOworICAgICAgICAgICAgcmV0ID0gT01YX0Vycm9ySW5wdXREYXRhRGVjb2RlWWV0OworICAgICAgICB9IGVsc2UKKyNlbmRpZgorICAgICAgICBpZiAoKHBJbnB1dERhdGEtPm5GbGFncyAmIE9NWF9CVUZGRVJGTEFHX0VPUykgPT0gT01YX0JVRkZFUkZMQUdfRU9TKSB7CisgICAgICAgICAgICBwSW5wdXREYXRhLT5uRmxhZ3MgPSAocE91dHB1dERhdGEtPm5GbGFncyAmICh+T01YX0JVRkZFUkZMQUdfRU9TKSk7CisgICAgICAgICAgICBwU0VDQ29tcG9uZW50LT5nZXRBbGxEZWxheUJ1ZmZlciA9IE9NWF9UUlVFOworICAgICAgICAgICAgcmV0ID0gT01YX0Vycm9ySW5wdXREYXRhRGVjb2RlWWV0OworICAgICAgICB9IGVsc2UgaWYgKChwT3V0cHV0RGF0YS0+bkZsYWdzICYgT01YX0JVRkZFUkZMQUdfRU9TKSA9PSBPTVhfQlVGRkVSRkxBR19FT1MpIHsKKyAgICAgICAgICAgIHBTRUNDb21wb25lbnQtPmdldEFsbERlbGF5QnVmZmVyID0gT01YX0ZBTFNFOworICAgICAgICAgICAgcmV0ID0gT01YX0Vycm9yTm9uZTsKKyAgICAgICAgfQorICAgIH0gZWxzZSB7CisgICAgICAgIHBPdXRwdXREYXRhLT50aW1lU3RhbXAgPSBwSW5wdXREYXRhLT50aW1lU3RhbXA7CisgICAgICAgIHBPdXRwdXREYXRhLT5uRmxhZ3MgPSBwSW5wdXREYXRhLT5uRmxhZ3M7CisKKyAgICAgICAgaWYgKChwU0VDQ29tcG9uZW50LT5iU2F2ZUZsYWdFT1MgPT0gT01YX1RSVUUpIHx8CisgICAgICAgICAgICAocFNFQ0NvbXBvbmVudC0+Z2V0QWxsRGVsYXlCdWZmZXIgPT0gT01YX1RSVUUpIHx8CisgICAgICAgICAgICAocElucHV0RGF0YS0+bkZsYWdzICYgT01YX0JVRkZFUkZMQUdfRU9TKSkgeworICAgICAgICAgICAgcE91dHB1dERhdGEtPm5GbGFncyB8PSBPTVhfQlVGRkVSRkxBR19FT1M7CisgICAgICAgICAgICBwU0VDQ29tcG9uZW50LT5nZXRBbGxEZWxheUJ1ZmZlciA9IE9NWF9GQUxTRTsKKyAgICAgICAgfQorICAgICAgICBwT3V0cHV0RGF0YS0+ZGF0YUxlbiA9IDA7CisKKyAgICAgICAgLyogcmV0ID0gT01YX0Vycm9yVW5kZWZpbmVkOyAqLworICAgICAgICByZXQgPSBPTVhfRXJyb3JOb25lOworICAgICAgICBnb3RvIEVYSVQ7CisgICAgfQorCitFWElUOgorICAgIEZ1bmN0aW9uT3V0KCk7CisKKyAgICByZXR1cm4gcmV0OworfQorCitPTVhfRVJST1JUWVBFIFNFQ19NRkNfSDI2NF9EZWNvZGVfRFJNKE9NWF9DT01QT05FTlRUWVBFICpwT01YQ29tcG9uZW50LCBTRUNfT01YX0RBVEEgKnBJbnB1dERhdGEsIFNFQ19PTVhfREFUQSAqcE91dHB1dERhdGEpCit7CisgICAgT01YX0VSUk9SVFlQRSAgICAgICAgICAgICAgIHJldCA9IE9NWF9FcnJvck5vbmU7CisgICAgU0VDX09NWF9CQVNFQ09NUE9ORU5UICAgICAgKnBTRUNDb21wb25lbnQgPSAoU0VDX09NWF9CQVNFQ09NUE9ORU5UICopcE9NWENvbXBvbmVudC0+cENvbXBvbmVudFByaXZhdGU7CisgICAgU0VDX09NWF9WSURFT0RFQ19DT01QT05FTlQgKnBWaWRlb0RlYyA9IChTRUNfT01YX1ZJREVPREVDX0NPTVBPTkVOVCAqKXBTRUNDb21wb25lbnQtPmhDb21wb25lbnRIYW5kbGU7CisgICAgU0VDX09NWF9CQVNFUE9SVCAgICAgICAgICAgKnBTRUNJbnB1dFBvcnQgPSAmcFNFQ0NvbXBvbmVudC0+cFNFQ1BvcnRbSU5QVVRfUE9SVF9JTkRFWF07CisgICAgU0VDX09NWF9CQVNFUE9SVCAgICAgICAgICAgKnBTRUNPdXRwdXRQb3J0ID0gJnBTRUNDb21wb25lbnQtPnBTRUNQb3J0W09VVFBVVF9QT1JUX0lOREVYXTsKKyAgICBTRUNfSDI2NERFQ19IQU5ETEUgICAgICAgICAqcEgyNjREZWMgPSAoU0VDX0gyNjRERUNfSEFORExFICopKChTRUNfT01YX1ZJREVPREVDX0NPTVBPTkVOVCAqKXBTRUNDb21wb25lbnQtPmhDb21wb25lbnRIYW5kbGUpLT5oQ29kZWNIYW5kbGU7CisgICAgT01YX1UzMiAgICAgICAgICAgICAgICAgICAgIG9uZUZyYW1lU2l6ZSA9IHBJbnB1dERhdGEtPmRhdGFMZW47CisgICAgU1NCU0lQX01GQ19ERUNfT1VUUFVUX0lORk8gIG91dHB1dEluZm87CisgICAgT01YX1MzMiAgICAgICAgICAgICAgICAgICAgIHNldENvbmZWYWwgPSAwOworICAgIE9NWF9TMzIgICAgICAgICAgICAgICAgICAgICByZXR1cm5Db2RlYyA9IDA7CisgICAgaW50ICAgICAgICAgICAgICAgICAgICAgICAgIGJ1ZldpZHRoID0gMDsKKyAgICBpbnQgICAgICAgICAgICAgICAgICAgICAgICAgYnVmSGVpZ2h0ID0gMDsKKyAgICBPTVhfVTMyICAgICAgICAgICAgICAgICAgICAgRnJhbWVCdWZmZXJZU2l6ZTsKKyAgICBPTVhfVTMyICAgICAgICAgICAgICAgICAgICAgRnJhbWVCdWZmZXJVVlNpemU7CisgICAgLy8gRFJNCisgICAgT01YX1BUUiAgICAgICAgICAgICAgICAgICAgIHBJbnB1dFBoeXNCdWZmZXI7CisgICAgT01YX1BUUiAgICAgICAgICAgICAgICAgICAgIHBJbnB1dFZpcnRCdWZmZXI7CisKKyAgICBGdW5jdGlvbkluKCk7CisKKyAgICBpZiAocEgyNjREZWMtPmhNRkNIMjY0SGFuZGxlLmJDb25maWd1cmVkTUZDID09IE9NWF9GQUxTRSkgeworICAgICAgICBTU0JTSVBfTUZDX0NPREVDX1RZUEUgZUNvZGVjVHlwZSA9IEgyNjRfREVDOworCisgICAgICAgIGlmICgob25lRnJhbWVTaXplIDw9IDApICYmIChwSW5wdXREYXRhLT5uRmxhZ3MgJiBPTVhfQlVGRkVSRkxBR19FT1MpKSB7CisgICAgICAgICAgICBwT3V0cHV0RGF0YS0+dGltZVN0YW1wID0gcElucHV0RGF0YS0+dGltZVN0YW1wOworICAgICAgICAgICAgcE91dHB1dERhdGEtPm5GbGFncyA9IHBJbnB1dERhdGEtPm5GbGFnczsKKyAgICAgICAgICAgIHJldCA9IE9NWF9FcnJvck5vbmU7CisgICAgICAgICAgICBnb3RvIEVYSVQ7CisgICAgICAgIH0KKworICAgICAgICAvKiBTZXQgdGhlIG51bWJlciBvZiBleHRyYSBidWZmZXIgdG8gcHJldmVudCB0ZWFyaW5nICovCisgICAgICAgIC8qIERSTSBQbGF5IG1vZGUgaXMgcmV0dXJuZWQgb25seSBQaHlzaWNhbEFkZHJlc3MgKi8KKyAgICAgICAgc2V0Q29uZlZhbCA9IEgyNjRfREVDX05VTV9PRl9FWFRSQV9CVUZGRVJTOworICAgICAgICBTc2JTaXBNZmNEZWNTZXRDb25maWcocEgyNjREZWMtPmhNRkNIMjY0SGFuZGxlLmhNRkNIYW5kbGUsIE1GQ19ERUNfU0VUQ09ORl9FWFRSQV9CVUZGRVJfTlVNLCAmc2V0Q29uZlZhbCk7CisKKyAgICAgICAgLyogRGVmYXVsdCBudW1iZXIgaW4gdGhlIGRyaXZlciBpcyBvcHRpbWl6ZWQgKi8KKyAgICAgICAgaWYgKHBWaWRlb0RlYy0+YlRodW1ibmFpbE1vZGUgPT0gT01YX1RSVUUpIHsKKyAgICAgICAgICAgIHNldENvbmZWYWwgPSAwOworICAgICAgICAgICAgU3NiU2lwTWZjRGVjU2V0Q29uZmlnKHBIMjY0RGVjLT5oTUZDSDI2NEhhbmRsZS5oTUZDSGFuZGxlLCBNRkNfREVDX1NFVENPTkZfRElTUExBWV9ERUxBWSwgJnNldENvbmZWYWwpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgc2V0Q29uZlZhbCA9IDg7CisgICAgICAgICAgICBTc2JTaXBNZmNEZWNTZXRDb25maWcocEgyNjREZWMtPmhNRkNIMjY0SGFuZGxlLmhNRkNIYW5kbGUsIE1GQ19ERUNfU0VUQ09ORl9ESVNQTEFZX0RFTEFZLCAmc2V0Q29uZlZhbCk7CisgICAgICAgIH0KKworICAgICAgICBwSW5wdXRQaHlzQnVmZmVyID0gcFNFQ0NvbXBvbmVudC0+cHJvY2Vzc0RhdGFbSU5QVVRfUE9SVF9JTkRFWF0uZGF0YUJ1ZmZlcjsKKyAgICAgICAgcElucHV0VmlydEJ1ZmZlciA9IE5VTEw7IC8qID8/Pz8/Pz8/Pz8/ICovCisKKyAgICAgICAgU0VDX09TQUxfTG9nKFNFQ19MT0dfRVJST1IsICJwSW5wdXRQaHlzQnVmZmVyID0gMHgleCwgYWxsb2NTaXplID0gMHglMHgiLCBwSW5wdXRQaHlzQnVmZmVyLCBwU0VDQ29tcG9uZW50LT5wcm9jZXNzRGF0YVtJTlBVVF9QT1JUX0lOREVYXS5hbGxvY1NpemUpOworCisgICAgICAgIFNzYlNpcE1mY0RlY1NldEluQnVmKHBIMjY0RGVjLT5oTUZDSDI2NEhhbmRsZS5oTUZDSGFuZGxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwSW5wdXRQaHlzQnVmZmVyLCBwSW5wdXRWaXJ0QnVmZmVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwU0VDQ29tcG9uZW50LT5wcm9jZXNzRGF0YVtJTlBVVF9QT1JUX0lOREVYXS5hbGxvY1NpemUpOworCisgICAgICAgIHJldHVybkNvZGVjID0gU3NiU2lwTWZjRGVjSW5pdChwSDI2NERlYy0+aE1GQ0gyNjRIYW5kbGUuaE1GQ0hhbmRsZSwgZUNvZGVjVHlwZSwgb25lRnJhbWVTaXplKTsKKyAgICAgICAgaWYgKHJldHVybkNvZGVjID09IE1GQ19SRVRfT0spIHsKKyAgICAgICAgICAgIFNTQlNJUF9NRkNfSU1HX1JFU09MVVRJT04gaW1nUmVzb2w7CisgICAgICAgICAgICBTU0JTSVBfTUZDX0NST1BfSU5GT1JNQVRJT04gY3JvcEluZm87CisKKyAgICAgICAgICAgIFNzYlNpcE1mY0RlY0dldENvbmZpZyhwSDI2NERlYy0+aE1GQ0gyNjRIYW5kbGUuaE1GQ0hhbmRsZSwgTUZDX0RFQ19HRVRDT05GX0JVRl9XSURUSF9IRUlHSFQsICZpbWdSZXNvbCk7CisgICAgICAgICAgICBTRUNfT1NBTF9Mb2coU0VDX0xPR19UUkFDRSwgInNldCB3aWR0aCBoZWlnaHQgaW5mb3JtYXRpb24gOiAlZCwgJWQiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBTRUNJbnB1dFBvcnQtPnBvcnREZWZpbml0aW9uLmZvcm1hdC52aWRlby5uRnJhbWVXaWR0aCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBwU0VDSW5wdXRQb3J0LT5wb3J0RGVmaW5pdGlvbi5mb3JtYXQudmlkZW8ubkZyYW1lSGVpZ2h0KTsKKyAgICAgICAgICAgIFNFQ19PU0FMX0xvZyhTRUNfTE9HX1RSQUNFLCAibWZjIHdpZHRoIGhlaWdodCBpbmZvcm1hdGlvbiA6ICVkLCAlZCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW1nUmVzb2wud2lkdGgsIGltZ1Jlc29sLmhlaWdodCk7CisKKyAgICAgICAgICAgIFNzYlNpcE1mY0RlY0dldENvbmZpZyhwSDI2NERlYy0+aE1GQ0gyNjRIYW5kbGUuaE1GQ0hhbmRsZSwgTUZDX0RFQ19HRVRDT05GX0NST1BfSU5GTywgJmNyb3BJbmZvKTsKKyAgICAgICAgICAgIFNFQ19PU0FMX0xvZyhTRUNfTE9HX1RSQUNFLCAibWZjIGNyb3BfdG9wIGNyb3BfYm90dG9tIGNyb3BfbGVmdCBjcm9wX3JpZ2h0IDogICVkLCAlZCwgJWQsICVkIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjcm9wSW5mby5jcm9wX3RvcF9vZmZzZXQgLCBjcm9wSW5mby5jcm9wX2JvdHRvbV9vZmZzZXQgLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNyb3BJbmZvLmNyb3BfbGVmdF9vZmZzZXQgLCBjcm9wSW5mby5jcm9wX3JpZ2h0X29mZnNldCk7CisKKyAgICAgICAgICAgIHBTRUNPdXRwdXRQb3J0LT5jcm9wUmVjdGFuZ2xlLm5Ub3AgICAgPSBjcm9wSW5mby5jcm9wX3RvcF9vZmZzZXQ7CisgICAgICAgICAgICBwU0VDT3V0cHV0UG9ydC0+Y3JvcFJlY3RhbmdsZS5uTGVmdCAgID0gY3JvcEluZm8uY3JvcF9sZWZ0X29mZnNldDsKKyAgICAgICAgICAgIHBTRUNPdXRwdXRQb3J0LT5jcm9wUmVjdGFuZ2xlLm5XaWR0aCAgPSBpbWdSZXNvbC53aWR0aCAtIGNyb3BJbmZvLmNyb3BfbGVmdF9vZmZzZXQgLSBjcm9wSW5mby5jcm9wX3JpZ2h0X29mZnNldDsKKyAgICAgICAgICAgIHBTRUNPdXRwdXRQb3J0LT5jcm9wUmVjdGFuZ2xlLm5IZWlnaHQgPSBpbWdSZXNvbC5oZWlnaHQgLSBjcm9wSW5mby5jcm9wX3RvcF9vZmZzZXQgLSBjcm9wSW5mby5jcm9wX2JvdHRvbV9vZmZzZXQ7CisKKyAgICAgICAgICAgIHBIMjY0RGVjLT5oTUZDSDI2NEhhbmRsZS5iQ29uZmlndXJlZE1GQyA9IE9NWF9UUlVFOworCisgICAgICAgICAgICAvKiogVXBkYXRlIEZyYW1lIFNpemUgKiovCisgICAgICAgICAgICBpZiAoKGNyb3BJbmZvLmNyb3BfbGVmdF9vZmZzZXQgIT0gMCkgfHwgKGNyb3BJbmZvLmNyb3BfcmlnaHRfb2Zmc2V0ICE9IDApIHx8CisgICAgICAgICAgICAgICAgKGNyb3BJbmZvLmNyb3BfdG9wX29mZnNldCAhPSAwKSB8fCAoY3JvcEluZm8uY3JvcF9ib3R0b21fb2Zmc2V0ICE9IDApKSB7CisgICAgICAgICAgICAgICAgLyogY2hhbmdlIHdpZHRoIGFuZCBoZWlnaHQgaW5mb3JtYXRpb24gKi8KKyAgICAgICAgICAgICAgICBwU0VDSW5wdXRQb3J0LT5wb3J0RGVmaW5pdGlvbi5mb3JtYXQudmlkZW8ubkZyYW1lV2lkdGggPSBpbWdSZXNvbC53aWR0aDsKKyAgICAgICAgICAgICAgICBwU0VDSW5wdXRQb3J0LT5wb3J0RGVmaW5pdGlvbi5mb3JtYXQudmlkZW8ubkZyYW1lSGVpZ2h0ID0gaW1nUmVzb2wuaGVpZ2h0OworICAgICAgICAgICAgICAgIHBTRUNJbnB1dFBvcnQtPnBvcnREZWZpbml0aW9uLmZvcm1hdC52aWRlby5uU3RyaWRlICAgICAgPSAoKGltZ1Jlc29sLndpZHRoICsgMTUpICYgKH4xNSkpOworICAgICAgICAgICAgICAgIHBTRUNJbnB1dFBvcnQtPnBvcnREZWZpbml0aW9uLmZvcm1hdC52aWRlby5uU2xpY2VIZWlnaHQgPSAoKGltZ1Jlc29sLmhlaWdodCArIDE1KSAmICh+MTUpKTsKKworICAgICAgICAgICAgICAgIFNFQ19VcGRhdGVGcmFtZVNpemUocE9NWENvbXBvbmVudCk7CisKKyAgICAgICAgICAgICAgICAvKiogU2VuZCBjcm9wIGluZm8gY2FsbCBiYWNrICoqLworICAgICAgICAgICAgICAgICgqKHBTRUNDb21wb25lbnQtPnBDYWxsYmFja3MtPkV2ZW50SGFuZGxlcikpCisgICAgICAgICAgICAgICAgICAgICAgKHBPTVhDb21wb25lbnQsCisgICAgICAgICAgICAgICAgICAgICAgIHBTRUNDb21wb25lbnQtPmNhbGxiYWNrRGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgT01YX0V2ZW50UG9ydFNldHRpbmdzQ2hhbmdlZCwgLyogVGhlIGNvbW1hbmQgd2FzIGNvbXBsZXRlZCAqLworICAgICAgICAgICAgICAgICAgICAgICBPTVhfRGlyT3V0cHV0LCAvKiBUaGlzIGlzIHRoZSBwb3J0IGluZGV4ICovCisgICAgICAgICAgICAgICAgICAgICAgIE9NWF9JbmRleENvbmZpZ0NvbW1vbk91dHB1dENyb3AsCisgICAgICAgICAgICAgICAgICAgICAgIE5VTEwpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKChwU0VDSW5wdXRQb3J0LT5wb3J0RGVmaW5pdGlvbi5mb3JtYXQudmlkZW8ubkZyYW1lV2lkdGggIT0gKHVuc2lnbmVkIGludClpbWdSZXNvbC53aWR0aCkgfHwKKyAgICAgICAgICAgICAgICAocFNFQ0lucHV0UG9ydC0+cG9ydERlZmluaXRpb24uZm9ybWF0LnZpZGVvLm5GcmFtZUhlaWdodCAhPSAodW5zaWduZWQgaW50KWltZ1Jlc29sLmhlaWdodCkpIHsKKyAgICAgICAgICAgICAgICBTRUNfT1NBTF9Mb2coU0VDX0xPR19UUkFDRSwgImNoYW5nZSB3aWR0aCBoZWlnaHQgaW5mb3JtYXRpb24gOiBPTVhfRXZlbnRQb3J0U2V0dGluZ3NDaGFuZ2VkIik7CisgICAgICAgICAgICAgICAgLyogY2hhbmdlIHdpZHRoIGFuZCBoZWlnaHQgaW5mb3JtYXRpb24gKi8KKyAgICAgICAgICAgICAgICBwU0VDSW5wdXRQb3J0LT5wb3J0RGVmaW5pdGlvbi5mb3JtYXQudmlkZW8ubkZyYW1lV2lkdGggPSBpbWdSZXNvbC53aWR0aDsKKyAgICAgICAgICAgICAgICBwU0VDSW5wdXRQb3J0LT5wb3J0RGVmaW5pdGlvbi5mb3JtYXQudmlkZW8ubkZyYW1lSGVpZ2h0ID0gaW1nUmVzb2wuaGVpZ2h0OworICAgICAgICAgICAgICAgIHBTRUNJbnB1dFBvcnQtPnBvcnREZWZpbml0aW9uLmZvcm1hdC52aWRlby5uU3RyaWRlICAgICAgPSAoKGltZ1Jlc29sLndpZHRoICsgMTUpICYgKH4xNSkpOworICAgICAgICAgICAgICAgIHBTRUNJbnB1dFBvcnQtPnBvcnREZWZpbml0aW9uLmZvcm1hdC52aWRlby5uU2xpY2VIZWlnaHQgPSAoKGltZ1Jlc29sLmhlaWdodCArIDE1KSAmICh+MTUpKTsKKworICAgICAgICAgICAgICAgIFNFQ19VcGRhdGVGcmFtZVNpemUocE9NWENvbXBvbmVudCk7CisKKyAgICAgICAgICAgICAgICAvKiogU2VuZCBQb3J0IFNldHRpbmdzIGNoYW5nZWQgY2FsbCBiYWNrICoqLworICAgICAgICAgICAgICAgICgqKHBTRUNDb21wb25lbnQtPnBDYWxsYmFja3MtPkV2ZW50SGFuZGxlcikpCisgICAgICAgICAgICAgICAgICAgICAgKHBPTVhDb21wb25lbnQsCisgICAgICAgICAgICAgICAgICAgICAgIHBTRUNDb21wb25lbnQtPmNhbGxiYWNrRGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgT01YX0V2ZW50UG9ydFNldHRpbmdzQ2hhbmdlZCwgLyogVGhlIGNvbW1hbmQgd2FzIGNvbXBsZXRlZCAqLworICAgICAgICAgICAgICAgICAgICAgICBPTVhfRGlyT3V0cHV0LCAvKiBUaGlzIGlzIHRoZSBwb3J0IGluZGV4ICovCisgICAgICAgICAgICAgICAgICAgICAgIDAsCisgICAgICAgICAgICAgICAgICAgICAgIE5VTEwpOworICAgICAgICAgICAgfQorCisjaWZkZWYgQUREX1NQU19QUFNfSV9GUkFNRQorICAgICAgICAgICAgcmV0ID0gT01YX0Vycm9ySW5wdXREYXRhRGVjb2RlWWV0OworI2Vsc2UKKyAgICAgICAgICAgIHBPdXRwdXREYXRhLT50aW1lU3RhbXAgPSBwSW5wdXREYXRhLT50aW1lU3RhbXA7CisgICAgICAgICAgICBwT3V0cHV0RGF0YS0+bkZsYWdzID0gcElucHV0RGF0YS0+bkZsYWdzOworCisgICAgICAgICAgICByZXQgPSBPTVhfRXJyb3JOb25lOworI2VuZGlmCisgICAgICAgICAgICBnb3RvIEVYSVQ7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICByZXQgPSBPTVhfRXJyb3JNRkNJbml0OworICAgICAgICAgICAgZ290byBFWElUOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChwSW5wdXREYXRhLT5kYXRhQnVmZmVyICE9IE5VTEwpICYmIChwSW5wdXREYXRhLT5kYXRhTGVuICE9IDApKSB7CisgICAgICAgIHBTRUNDb21wb25lbnQtPnRpbWVTdGFtcFtwSDI2NERlYy0+aE1GQ0gyNjRIYW5kbGUuaW5kZXhUaW1lc3RhbXBdID0gcElucHV0RGF0YS0+dGltZVN0YW1wOworICAgICAgICBwU0VDQ29tcG9uZW50LT5uRmxhZ3NbcEgyNjREZWMtPmhNRkNIMjY0SGFuZGxlLmluZGV4VGltZXN0YW1wXSA9IHBJbnB1dERhdGEtPm5GbGFnczsKKyAgICAgICAgU3NiU2lwTWZjRGVjU2V0Q29uZmlnKHBIMjY0RGVjLT5oTUZDSDI2NEhhbmRsZS5oTUZDSGFuZGxlLCBNRkNfREVDX1NFVENPTkZfRlJBTUVfVEFHLCAmKHBIMjY0RGVjLT5oTUZDSDI2NEhhbmRsZS5pbmRleFRpbWVzdGFtcCkpOworICAgICAgICBpZiAocFZpZGVvRGVjLT5iRFJNUGxheWVyTW9kZSA9PSBPTVhfVFJVRSkgeworICAgICAgICAgICAgcElucHV0UGh5c0J1ZmZlciA9IHBTRUNDb21wb25lbnQtPnByb2Nlc3NEYXRhW0lOUFVUX1BPUlRfSU5ERVhdLmRhdGFCdWZmZXI7CisgICAgICAgICAgICBwSW5wdXRWaXJ0QnVmZmVyID0gTlVMTDsgLyogPz8/Pz8/Pz8/Pz8gKi8KKworICAgICAgICAgICAgU3NiU2lwTWZjRGVjU2V0SW5CdWYocEgyNjREZWMtPmhNRkNIMjY0SGFuZGxlLmhNRkNIYW5kbGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwSW5wdXRQaHlzQnVmZmVyLCBwSW5wdXRWaXJ0QnVmZmVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcFNFQ0NvbXBvbmVudC0+cHJvY2Vzc0RhdGFbSU5QVVRfUE9SVF9JTkRFWF0uYWxsb2NTaXplKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm5Db2RlYyA9IFNzYlNpcE1mY0RlY0V4ZShwSDI2NERlYy0+aE1GQ0gyNjRIYW5kbGUuaE1GQ0hhbmRsZSwgb25lRnJhbWVTaXplKTsKKyAgICB9IGVsc2UgeworICAgICAgICBpZiAocFNFQ0NvbXBvbmVudC0+Y2hlY2tUaW1lU3RhbXAubmVlZENoZWNrU3RhcnRUaW1lU3RhbXAgPT0gT01YX1RSVUUpCisgICAgICAgICAgICBwU0VDQ29tcG9uZW50LT5jaGVja1RpbWVTdGFtcC5uZWVkU2V0U3RhcnRUaW1lU3RhbXAgPSBPTVhfVFJVRTsKKworICAgICAgICBwT3V0cHV0RGF0YS0+dGltZVN0YW1wID0gcElucHV0RGF0YS0+dGltZVN0YW1wOworICAgICAgICBwT3V0cHV0RGF0YS0+bkZsYWdzID0gcElucHV0RGF0YS0+bkZsYWdzOworICAgICAgICByZXR1cm5Db2RlYyA9IE1GQ19SRVRfT0s7CisgICAgICAgIGdvdG8gRVhJVDsKKyAgICB9CisKKyAgICBpZiAocmV0dXJuQ29kZWMgPT0gTUZDX1JFVF9PSykgeworICAgICAgICBTU0JTSVBfTUZDX0RFQ19PVVRCVUZfU1RBVFVTIHN0YXR1czsKKyAgICAgICAgT01YX1MzMiBpbmRleFRpbWVzdGFtcCA9IDA7CisKKyAgICAgICAgc3RhdHVzID0gU3NiU2lwTWZjRGVjR2V0T3V0QnVmKHBIMjY0RGVjLT5oTUZDSDI2NEhhbmRsZS5oTUZDSGFuZGxlLCAmb3V0cHV0SW5mbyk7CisgICAgICAgIGJ1ZldpZHRoID0gICAgKG91dHB1dEluZm8uaW1nX3dpZHRoICsgMTUpICYgKH4xNSk7CisgICAgICAgIGJ1ZkhlaWdodCA9ICAob3V0cHV0SW5mby5pbWdfaGVpZ2h0ICsgMTUpICYgKH4xNSk7CisgICAgICAgIEZyYW1lQnVmZmVyWVNpemUgPSBBTElHTl9UT184S0IoQUxJR05fVE9fMTI4QihvdXRwdXRJbmZvLmltZ193aWR0aCkgKiBBTElHTl9UT18zMkIob3V0cHV0SW5mby5pbWdfaGVpZ2h0KSk7CisgICAgICAgIEZyYW1lQnVmZmVyVVZTaXplID0gQUxJR05fVE9fOEtCKEFMSUdOX1RPXzEyOEIob3V0cHV0SW5mby5pbWdfd2lkdGgpICogQUxJR05fVE9fMzJCKG91dHB1dEluZm8uaW1nX2hlaWdodC8yKSk7CisKKyAgICAgICAgaWYgKHN0YXR1cyAhPSBNRkNfR0VUT1VUQlVGX0RJU1BMQVlfT05MWSkgeworICAgICAgICAgICAgcEgyNjREZWMtPmhNRkNIMjY0SGFuZGxlLmluZGV4VGltZXN0YW1wKys7CisgICAgICAgICAgICBwSDI2NERlYy0+aE1GQ0gyNjRIYW5kbGUuaW5kZXhUaW1lc3RhbXAgJT0gTUFYX1RJTUVTVEFNUDsKKyAgICAgICAgfQorCisgICAgICAgIGlmICgoU3NiU2lwTWZjRGVjR2V0Q29uZmlnKHBIMjY0RGVjLT5oTUZDSDI2NEhhbmRsZS5oTUZDSGFuZGxlLCBNRkNfREVDX0dFVENPTkZfRlJBTUVfVEFHLCAmaW5kZXhUaW1lc3RhbXApICE9IE1GQ19SRVRfT0spIHx8CisgICAgICAgICAgICAoKChpbmRleFRpbWVzdGFtcCA8IDApIHx8IChpbmRleFRpbWVzdGFtcCA+PSBNQVhfVElNRVNUQU1QKSkpKSB7CisgICAgICAgICAgICBwT3V0cHV0RGF0YS0+dGltZVN0YW1wID0gcElucHV0RGF0YS0+dGltZVN0YW1wOworICAgICAgICAgICAgcE91dHB1dERhdGEtPm5GbGFncyA9IHBJbnB1dERhdGEtPm5GbGFnczsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIC8qIEZvciB0aW1lc3RhbXAgY29ycmVjdGlvbi4gaWYgbWZjIHN1cHBvcnQgZnJhbWV0eXBlIGRldGVjdCAqLworICAgICAgICAgICAgU0VDX09TQUxfTG9nKFNFQ19MT0dfVFJBQ0UsICJkaXNwX3BpY19mcmFtZV90eXBlOiAlZCIsIG91dHB1dEluZm8uZGlzcF9waWNfZnJhbWVfdHlwZSk7CisjaWZkZWYgTkVFRF9USU1FU1RBTVBfUkVPUkRFUgorICAgICAgICAgICAgaWYgKChvdXRwdXRJbmZvLmRpc3BfcGljX2ZyYW1lX3R5cGUgPT0gTUZDX0ZSQU1FX1RZUEVfSV9GUkFNRSkgfHwKKyAgICAgICAgICAgICAgICAocEgyNjREZWMtPmhNRkNIMjY0SGFuZGxlLmJGbGFzaFBsYXllck1vZGUgIT0gT01YX0ZBTFNFKSkgeworICAgICAgICAgICAgICAgIHBPdXRwdXREYXRhLT50aW1lU3RhbXAgPSBwU0VDQ29tcG9uZW50LT50aW1lU3RhbXBbaW5kZXhUaW1lc3RhbXBdOworICAgICAgICAgICAgICAgIHBPdXRwdXREYXRhLT5uRmxhZ3MgPSBwU0VDQ29tcG9uZW50LT5uRmxhZ3NbaW5kZXhUaW1lc3RhbXBdOworICAgICAgICAgICAgICAgIHBIMjY0RGVjLT5oTUZDSDI2NEhhbmRsZS5vdXRwdXRJbmRleFRpbWVzdGFtcCA9IGluZGV4VGltZXN0YW1wOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBwT3V0cHV0RGF0YS0+dGltZVN0YW1wID0gcFNFQ0NvbXBvbmVudC0+dGltZVN0YW1wW3BIMjY0RGVjLT5oTUZDSDI2NEhhbmRsZS5vdXRwdXRJbmRleFRpbWVzdGFtcF07CisgICAgICAgICAgICAgICAgcE91dHB1dERhdGEtPm5GbGFncyA9IHBTRUNDb21wb25lbnQtPm5GbGFnc1twSDI2NERlYy0+aE1GQ0gyNjRIYW5kbGUub3V0cHV0SW5kZXhUaW1lc3RhbXBdOworICAgICAgICAgICAgfQorI2Vsc2UKKyAgICAgICAgICAgIHBPdXRwdXREYXRhLT50aW1lU3RhbXAgPSBwU0VDQ29tcG9uZW50LT50aW1lU3RhbXBbaW5kZXhUaW1lc3RhbXBdOworICAgICAgICAgICAgcE91dHB1dERhdGEtPm5GbGFncyA9IHBTRUNDb21wb25lbnQtPm5GbGFnc1tpbmRleFRpbWVzdGFtcF07CisjZW5kaWYKKyAgICAgICAgICAgIFNFQ19PU0FMX0xvZyhTRUNfTE9HX1RSQUNFLCAidGltZXN0YW1wICVsbGQgdXMgKCUuMmYgc2VjcykiLCBwT3V0cHV0RGF0YS0+dGltZVN0YW1wLCBwT3V0cHV0RGF0YS0+dGltZVN0YW1wIC8gMUU2KTsKKyAgICAgICAgfQorCisgICAgICAgIGlmICgoc3RhdHVzID09IE1GQ19HRVRPVVRCVUZfRElTUExBWV9ERUNPRElORykgfHwKKyAgICAgICAgICAgIChzdGF0dXMgPT0gTUZDX0dFVE9VVEJVRl9ESVNQTEFZX09OTFkpKSB7CisgICAgICAgICAgICAvKiogRmlsbCBPdXRwdXQgQnVmZmVyICoqLworICAgICAgICAgICAgdm9pZCAqcE91dHB1dEJ1ZiA9ICh2b2lkICopcE91dHB1dERhdGEtPmRhdGFCdWZmZXI7CisgICAgICAgICAgICB2b2lkICpwU3JjQnVmWzNdID0ge05VTEwsIH07CisgICAgICAgICAgICB2b2lkICpwWVVWQnVmWzNdID0ge05VTEwsIH07CisgICAgICAgICAgICB1bnNpZ25lZCBpbnQgY3NjX3NyY19jb2xvcl9mb3JtYXQsIGNzY19kc3RfY29sb3JfZm9ybWF0OworICAgICAgICAgICAgQ1NDX01FVEhPRCBjc2NfbWV0aG9kID0gQ1NDX01FVEhPRF9TVzsKKyAgICAgICAgICAgIHVuc2lnbmVkIGludCBjYWNoZWFibGUgPSAxOworCisgICAgICAgICAgICBpbnQgZnJhbWVTaXplID0gYnVmV2lkdGggKiBidWZIZWlnaHQ7CisgICAgICAgICAgICBpbnQgYWN0dWFsV2lkdGggPSBvdXRwdXRJbmZvLmltZ193aWR0aDsKKyAgICAgICAgICAgIGludCBhY3R1YWxIZWlnaHQgPSBvdXRwdXRJbmZvLmltZ19oZWlnaHQ7CisgICAgICAgICAgICBpbnQgYWN0dWFsSW1hZ2VTaXplID0gYWN0dWFsV2lkdGggKiBhY3R1YWxIZWlnaHQ7CisKKyAgICAgICAgICAgIHBTcmNCdWZbMF0gPSBvdXRwdXRJbmZvLllWaXJBZGRyOworICAgICAgICAgICAgcFNyY0J1ZlsxXSA9IG91dHB1dEluZm8uQ1ZpckFkZHI7CisKKyAgICAgICAgICAgIHBZVVZCdWZbMF0gID0gKHVuc2lnbmVkIGNoYXIgKilwT3V0cHV0QnVmOworICAgICAgICAgICAgcFlVVkJ1ZlsxXSAgPSAodW5zaWduZWQgY2hhciAqKXBPdXRwdXRCdWYgKyBhY3R1YWxJbWFnZVNpemU7CisgICAgICAgICAgICBwWVVWQnVmWzJdICA9ICh1bnNpZ25lZCBjaGFyICopcE91dHB1dEJ1ZiArIGFjdHVhbEltYWdlU2l6ZSArIGFjdHVhbEltYWdlU2l6ZSAvIDQ7CisgICAgICAgICAgICBwT3V0cHV0RGF0YS0+ZGF0YUxlbiA9IChhY3R1YWxJbWFnZVNpemUgKiAzKSAvIDI7CisKKyNpZmRlZiBVU0VfQU5CCisgICAgICAgICAgICBpZiAocFNFQ091dHB1dFBvcnQtPmJJc0FOQkVuYWJsZWQgPT0gT01YX1RSVUUpIHsKKyAgICAgICAgICAgICAgICBPTVhfVTMyIHN0cmlkZTsKKyAgICAgICAgICAgICAgICBTRUNfT1NBTF9Mb2NrQU5CKHBPdXRwdXREYXRhLT5kYXRhQnVmZmVyLCBhY3R1YWxXaWR0aCwgYWN0dWFsSGVpZ2h0LCBwU0VDQ29tcG9uZW50LT5wU0VDUG9ydFtPVVRQVVRfUE9SVF9JTkRFWF0ucG9ydERlZmluaXRpb24uZm9ybWF0LnZpZGVvLmVDb2xvckZvcm1hdCwgJnN0cmlkZSwgcFlVVkJ1Zik7CisgICAgICAgICAgICAgICAgYWN0dWFsV2lkdGggPSBzdHJpZGU7CisgICAgICAgICAgICAgICAgcE91dHB1dERhdGEtPmRhdGFMZW4gPSBzaXplb2Yodm9pZCAqKTsKKyAgICAgICAgICAgIH0KKyNlbmRpZgorICAgICAgICAgICAgaWYgKHBTRUNPdXRwdXRQb3J0LT5wb3J0RGVmaW5pdGlvbi5mb3JtYXQudmlkZW8uZUNvbG9yRm9ybWF0ID09IE9NWF9TRUNfQ09MT1JfRm9ybWF0TlYxMlRQaHlzaWNhbEFkZHJlc3MpIHsKKyAgICAgICAgICAgICAgICAvKiBpZiB1c2UgUG9zdCBjb3B5IGFkZHJlc3Mgc3RydWN0dXJlICovCisgICAgICAgICAgICAgICAgU0VDX09TQUxfTG9nKFNFQ19MT0dfVFJBQ0UsICJEUk1dIHBoeXNpY2FsIGFkZHJlc3MgZGF0YSBtb2RlIik7CisgICAgICAgICAgICAgICAgU0VDX09TQUxfTWVtY3B5KHBZVVZCdWZbMF0sICYob3V0cHV0SW5mby5ZUGh5QWRkciksIHNpemVvZihvdXRwdXRJbmZvLllQaHlBZGRyKSk7CisgICAgICAgICAgICAgICAgU0VDX09TQUxfTWVtY3B5KCh1bnNpZ25lZCBjaGFyICopcFlVVkJ1ZlswXSArIChzaXplb2Yodm9pZCAqKSAqIDEpLCAmKG91dHB1dEluZm8uQ1BoeUFkZHIpLCBzaXplb2Yob3V0cHV0SW5mby5DUGh5QWRkcikpOworICAgICAgICAgICAgICAgIFNFQ19PU0FMX01lbWNweSgodW5zaWduZWQgY2hhciAqKXBZVVZCdWZbMF0gKyAoc2l6ZW9mKHZvaWQgKikgKiAyKSwgJihvdXRwdXRJbmZvLllWaXJBZGRyKSwgc2l6ZW9mKG91dHB1dEluZm8uWVZpckFkZHIpKTsKKyAgICAgICAgICAgICAgICBTRUNfT1NBTF9NZW1jcHkoKHVuc2lnbmVkIGNoYXIgKilwWVVWQnVmWzBdICsgKHNpemVvZih2b2lkICopICogMyksICYob3V0cHV0SW5mby5DVmlyQWRkciksIHNpemVvZihvdXRwdXRJbmZvLkNWaXJBZGRyKSk7CisgICAgICAgICAgICAgICAgcE91dHB1dERhdGEtPmRhdGFMZW4gPSAoYWN0dWFsV2lkdGggKiBhY3R1YWxIZWlnaHQgKiAzKSAvIDI7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIFNFQ19PU0FMX0xvZyhTRUNfTE9HX1RSQUNFLCAiRFJNXSBSZWFsIGRhdGEgbWV0aG9kIik7CisjaWZkZWYgQ09ORklHX01GQ19GUFMKKyAgICAgICAgICAgICAgICBTRUNfT1NBTF9QZXJmU3RhcnQoUEVSRl9JRF9DU0MpOworI2VuZGlmCisgICAgICAgICAgICAgICAgc3dpdGNoIChwU0VDQ29tcG9uZW50LT5wU0VDUG9ydFtPVVRQVVRfUE9SVF9JTkRFWF0ucG9ydERlZmluaXRpb24uZm9ybWF0LnZpZGVvLmVDb2xvckZvcm1hdCkgeworICAgICAgICAgICAgICAgIGNhc2UgT01YX1NFQ19DT0xPUl9Gb3JtYXROVjEyVGlsZWQ6CisgICAgICAgICAgICAgICAgICAgIFNFQ19PU0FMX01lbWNweShwT3V0cHV0QnVmLCBvdXRwdXRJbmZvLllWaXJBZGRyLCBGcmFtZUJ1ZmZlcllTaXplKTsKKyAgICAgICAgICAgICAgICAgICAgU0VDX09TQUxfTWVtY3B5KCh1bnNpZ25lZCBjaGFyICopcE91dHB1dEJ1ZiArIEZyYW1lQnVmZmVyWVNpemUsIG91dHB1dEluZm8uQ1ZpckFkZHIsIEZyYW1lQnVmZmVyVVZTaXplKTsKKyAgICAgICAgICAgICAgICAgICAgcE91dHB1dERhdGEtPmRhdGFMZW4gPSBGcmFtZUJ1ZmZlcllTaXplICsgRnJhbWVCdWZmZXJVVlNpemU7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIGNhc2UgT01YX0NPTE9SX0Zvcm1hdFlVVjQyMFNlbWlQbGFuYXI6CisgICAgICAgICAgICAgICAgY2FzZSBPTVhfU0VDX0NPTE9SX0Zvcm1hdEFOQllVVjQyMFNlbWlQbGFuYXI6CisgICAgICAgICAgICAgICAgICAgIGNzY19zcmNfY29sb3JfZm9ybWF0ID0gb214XzJfaGFsX3BpeGVsX2Zvcm1hdCgodW5zaWduZWQgaW50KU9NWF9TRUNfQ09MT1JfRm9ybWF0TlYxMlRpbGVkKTsKKyAgICAgICAgICAgICAgICAgICAgY3NjX2RzdF9jb2xvcl9mb3JtYXQgPSBvbXhfMl9oYWxfcGl4ZWxfZm9ybWF0KCh1bnNpZ25lZCBpbnQpT01YX0NPTE9SX0Zvcm1hdFlVVjQyMFNlbWlQbGFuYXIpOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBjYXNlIE9NWF9DT0xPUl9Gb3JtYXRZVVY0MjBQbGFuYXI6CisgICAgICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICAgICAgY3NjX3NyY19jb2xvcl9mb3JtYXQgPSBvbXhfMl9oYWxfcGl4ZWxfZm9ybWF0KCh1bnNpZ25lZCBpbnQpT01YX1NFQ19DT0xPUl9Gb3JtYXROVjEyVGlsZWQpOworICAgICAgICAgICAgICAgICAgICBjc2NfZHN0X2NvbG9yX2Zvcm1hdCA9IG9teF8yX2hhbF9waXhlbF9mb3JtYXQoKHVuc2lnbmVkIGludClPTVhfQ09MT1JfRm9ybWF0WVVWNDIwUGxhbmFyKTsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgY3NjX2dldF9tZXRob2QocFZpZGVvRGVjLT5jc2NfaGFuZGxlLCAmY3NjX21ldGhvZCk7CisjaWZkZWYgVVNFX0NTQ19GSU1DCisgICAgICAgICAgICAgICAgaWYgKChwU0VDT3V0cHV0UG9ydC0+YklzQU5CRW5hYmxlZCA9PSBPTVhfVFJVRSkgJiYgKGNzY19tZXRob2QgPT0gQ1NDX01FVEhPRF9IVykpIHsKKyAgICAgICAgICAgICAgICAgICAgU0VDX09TQUxfR2V0UGh5c0FOQihwT3V0cHV0RGF0YS0+ZGF0YUJ1ZmZlciwgcFlVVkJ1Zik7CisgICAgICAgICAgICAgICAgICAgIHBTcmNCdWZbMF0gPSBvdXRwdXRJbmZvLllQaHlBZGRyOworICAgICAgICAgICAgICAgICAgICBwU3JjQnVmWzFdID0gb3V0cHV0SW5mby5DUGh5QWRkcjsKKyAgICAgICAgICAgICAgICB9CisjZW5kaWYKKyAgICAgICAgICAgICAgICBpZiAocFZpZGVvRGVjLT5jc2Nfc2V0X2Zvcm1hdCA9PSBPTVhfRkFMU0UpIHsKKyAgICAgICAgICAgICAgICAgICAgY3NjX3NldF9zcmNfZm9ybWF0KAorICAgICAgICAgICAgICAgICAgICAgICAgcFZpZGVvRGVjLT5jc2NfaGFuZGxlLCAgLyogaGFuZGxlICovCisgICAgICAgICAgICAgICAgICAgICAgICBhY3R1YWxXaWR0aCwgICAgICAgICAgICAvKiB3aWR0aCAqLworICAgICAgICAgICAgICAgICAgICAgICAgYWN0dWFsSGVpZ2h0LCAgICAgICAgICAgLyogaGVpZ2h0ICovCisgICAgICAgICAgICAgICAgICAgICAgICAwLCAgICAgICAgICAgICAgICAgICAgICAvKiBjcm9wX2xlZnQgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgIDAsICAgICAgICAgICAgICAgICAgICAgIC8qIGNyb3BfcmlnaHQgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgIGFjdHVhbFdpZHRoLCAgICAgICAgICAgIC8qIGNyb3Bfd2lkdGggKi8KKyAgICAgICAgICAgICAgICAgICAgICAgIGFjdHVhbEhlaWdodCwgICAgICAgICAgIC8qIGNyb3BfaGVpZ2h0ICovCisgICAgICAgICAgICAgICAgICAgICAgICBjc2Nfc3JjX2NvbG9yX2Zvcm1hdCwgICAvKiBjb2xvcl9mb3JtYXQgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgIGNhY2hlYWJsZSk7ICAgICAgICAgICAgIC8qIGNhY2hlYWJsZSAqLworICAgICAgICAgICAgICAgICAgICBjc2Nfc2V0X2RzdF9mb3JtYXQoCisgICAgICAgICAgICAgICAgICAgICAgICBwVmlkZW9EZWMtPmNzY19oYW5kbGUsICAvKiBoYW5kbGUgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgIGFjdHVhbFdpZHRoLCAgICAgICAgICAgIC8qIHdpZHRoICovCisgICAgICAgICAgICAgICAgICAgICAgICBhY3R1YWxIZWlnaHQsICAgICAgICAgICAvKiBoZWlnaHQgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgIDAsICAgICAgICAgICAgICAgICAgICAgIC8qIGNyb3BfbGVmdCAqLworICAgICAgICAgICAgICAgICAgICAgICAgMCwgICAgICAgICAgICAgICAgICAgICAgLyogY3JvcF9yaWdodCAqLworICAgICAgICAgICAgICAgICAgICAgICAgYWN0dWFsV2lkdGgsICAgICAgICAgICAgLyogY3JvcF93aWR0aCAqLworICAgICAgICAgICAgICAgICAgICAgICAgYWN0dWFsSGVpZ2h0LCAgICAgICAgICAgLyogY3JvcF9oZWlnaHQgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgIGNzY19kc3RfY29sb3JfZm9ybWF0LCAgIC8qIGNvbG9yX2Zvcm1hdCAqLworICAgICAgICAgICAgICAgICAgICAgICAgY2FjaGVhYmxlKTsgICAgICAgICAgICAgLyogY2FjaGVhYmxlICovCisgICAgICAgICAgICAgICAgICAgIHBWaWRlb0RlYy0+Y3NjX3NldF9mb3JtYXQgPSBPTVhfVFJVRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgY3NjX3NldF9zcmNfYnVmZmVyKAorICAgICAgICAgICAgICAgICAgICBwVmlkZW9EZWMtPmNzY19oYW5kbGUsICAvKiBoYW5kbGUgKi8KKyAgICAgICAgICAgICAgICAgICAgcFNyY0J1ZlswXSwgICAgICAgICAgICAgLyogeSBhZGRyICovCisgICAgICAgICAgICAgICAgICAgIHBTcmNCdWZbMV0sICAgICAgICAgICAgIC8qIHUgYWRkciBvciB1diBhZGRyICovCisgICAgICAgICAgICAgICAgICAgIHBTcmNCdWZbMl0sICAgICAgICAgICAgIC8qIHYgYWRkciBvciBub25lICovCisgICAgICAgICAgICAgICAgICAgIDApOyAgICAgICAgICAgICAgICAgICAgIC8qIGlvbiBmZCAqLworICAgICAgICAgICAgICAgIGNzY19zZXRfZHN0X2J1ZmZlcigKKyAgICAgICAgICAgICAgICAgICAgcFZpZGVvRGVjLT5jc2NfaGFuZGxlLCAgLyogaGFuZGxlICovCisgICAgICAgICAgICAgICAgICAgIHBZVVZCdWZbMF0sICAgICAgICAgICAgIC8qIHkgYWRkciAqLworICAgICAgICAgICAgICAgICAgICBwWVVWQnVmWzFdLCAgICAgICAgICAgICAvKiB1IGFkZHIgb3IgdXYgYWRkciAqLworICAgICAgICAgICAgICAgICAgICBwWVVWQnVmWzJdLCAgICAgICAgICAgICAvKiB2IGFkZHIgb3Igbm9uZSAqLworICAgICAgICAgICAgICAgICAgICAwKTsgICAgICAgICAgICAgICAgICAgICAvKiBpb24gZmQgKi8KKyAgICAgICAgICAgICAgIGNzY19jb252ZXJ0KHBWaWRlb0RlYy0+Y3NjX2hhbmRsZSk7CisjaWZkZWYgQ09ORklHX01GQ19GUFMKKyAgICAgICAgICAgICAgICBTRUNfT1NBTF9QZXJmU3RvcChQRVJGX0lEX0NTQyk7CisjZW5kaWYKKyAgICAgICAgICAgIH0KKworI2lmZGVmIFVTRV9BTkIKKyAgICAgICAgICAgIGlmIChwU0VDT3V0cHV0UG9ydC0+YklzQU5CRW5hYmxlZCA9PSBPTVhfVFJVRSkKKyAgICAgICAgICAgICAgICBTRUNfT1NBTF9VbmxvY2tBTkIocE91dHB1dERhdGEtPmRhdGFCdWZmZXIpOworI2VuZGlmCisgICAgICAgICAgICBwSDI2NERlYy0+aE1GQ0gyNjRIYW5kbGUub3V0cHV0SW5kZXhUaW1lc3RhbXArKzsKKyAgICAgICAgICAgIHBIMjY0RGVjLT5oTUZDSDI2NEhhbmRsZS5vdXRwdXRJbmRleFRpbWVzdGFtcCAlPSBNQVhfVElNRVNUQU1QOworICAgICAgICB9CisgICAgICAgIGlmIChwT3V0cHV0RGF0YS0+bkZsYWdzICYgT01YX0JVRkZFUkZMQUdfRU9TKQorICAgICAgICAgICAgcE91dHB1dERhdGEtPmRhdGFMZW4gPSAwOworCisgICAgICAgIGlmICgoc3RhdHVzID09IE1GQ19HRVRPVVRCVUZfRElTUExBWV9PTkxZKSB8fAorICAgICAgICAgICAgKHBTRUNDb21wb25lbnQtPmdldEFsbERlbGF5QnVmZmVyID09IE9NWF9UUlVFKSkKKyAgICAgICAgICAgIHJldCA9IE9NWF9FcnJvcklucHV0RGF0YURlY29kZVlldDsKKworICAgICAgICBpZiAoc3RhdHVzID09IE1GQ19HRVRPVVRCVUZfREVDT0RJTkdfT05MWSkgeworICAgICAgICAgICAgaWYgKCgocElucHV0RGF0YS0+bkZsYWdzICYgT01YX0JVRkZFUkZMQUdfRU9TKSAhPSBPTVhfQlVGRkVSRkxBR19FT1MpICYmCisgICAgICAgICAgICAgICAgKChwU0VDQ29tcG9uZW50LT5iU2F2ZUZsYWdFT1MgPT0gT01YX1RSVUUpIHx8IChwU0VDQ29tcG9uZW50LT5nZXRBbGxEZWxheUJ1ZmZlciA9PSBPTVhfVFJVRSkpKSB7CisgICAgICAgICAgICAgICAgcElucHV0RGF0YS0+bkZsYWdzIHw9IE9NWF9CVUZGRVJGTEFHX0VPUzsKKyAgICAgICAgICAgICAgICBwU0VDQ29tcG9uZW50LT5nZXRBbGxEZWxheUJ1ZmZlciA9IE9NWF9UUlVFOworICAgICAgICAgICAgICAgIHJldCA9IE9NWF9FcnJvcklucHV0RGF0YURlY29kZVlldDsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgcmV0ID0gT01YX0Vycm9yTm9uZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGdvdG8gRVhJVDsKKyAgICAgICAgfQorCisgICAgICAgIGlmICgocElucHV0RGF0YS0+bkZsYWdzICYgT01YX0JVRkZFUkZMQUdfRU9TKSA9PSBPTVhfQlVGRkVSRkxBR19FT1MpIHsKKyAgICAgICAgICAgIHBJbnB1dERhdGEtPm5GbGFncyA9IChwT3V0cHV0RGF0YS0+bkZsYWdzICYgKH5PTVhfQlVGRkVSRkxBR19FT1MpKTsKKyAgICAgICAgICAgIHBTRUNDb21wb25lbnQtPmdldEFsbERlbGF5QnVmZmVyID0gT01YX1RSVUU7CisgICAgICAgICAgICByZXQgPSBPTVhfRXJyb3JJbnB1dERhdGFEZWNvZGVZZXQ7CisgICAgICAgIH0gZWxzZSBpZiAoKHBPdXRwdXREYXRhLT5uRmxhZ3MgJiBPTVhfQlVGRkVSRkxBR19FT1MpID09IE9NWF9CVUZGRVJGTEFHX0VPUykgeworICAgICAgICAgICAgcFNFQ0NvbXBvbmVudC0+Z2V0QWxsRGVsYXlCdWZmZXIgPSBPTVhfRkFMU0U7CisgICAgICAgICAgICByZXQgPSBPTVhfRXJyb3JOb25lOworICAgICAgICB9CisgICAgfSBlbHNlIHsKKyAgICAgICAgcE91dHB1dERhdGEtPnRpbWVTdGFtcCA9IHBJbnB1dERhdGEtPnRpbWVTdGFtcDsKKyAgICAgICAgcE91dHB1dERhdGEtPm5GbGFncyA9IHBJbnB1dERhdGEtPm5GbGFnczsKKworICAgICAgICBpZiAoKHBTRUNDb21wb25lbnQtPmJTYXZlRmxhZ0VPUyA9PSBPTVhfVFJVRSkgfHwKKyAgICAgICAgICAgIChwU0VDQ29tcG9uZW50LT5nZXRBbGxEZWxheUJ1ZmZlciA9PSBPTVhfVFJVRSkgfHwKKyAgICAgICAgICAgIChwSW5wdXREYXRhLT5uRmxhZ3MgJiBPTVhfQlVGRkVSRkxBR19FT1MpKSB7CisgICAgICAgICAgICBwT3V0cHV0RGF0YS0+bkZsYWdzIHw9IE9NWF9CVUZGRVJGTEFHX0VPUzsKKyAgICAgICAgICAgIHBTRUNDb21wb25lbnQtPmdldEFsbERlbGF5QnVmZmVyID0gT01YX0ZBTFNFOworICAgICAgICB9CisgICAgICAgIHBPdXRwdXREYXRhLT5kYXRhTGVuID0gMDsKKworICAgICAgICAvKiByZXQgPSBPTVhfRXJyb3JVbmRlZmluZWQ7ICovCisgICAgICAgIHJldCA9IE9NWF9FcnJvck5vbmU7CisgICAgICAgIGdvdG8gRVhJVDsKKyAgICB9CisKK0VYSVQ6CisgICAgRnVuY3Rpb25PdXQoKTsKKworICAgIHJldHVybiByZXQ7Cit9CisKKy8qIE1GQyBEZWNvZGUgKi8KK09NWF9FUlJPUlRZUEUgU0VDX01GQ19IMjY0RGVjX2J1ZmZlclByb2Nlc3MoT01YX0NPTVBPTkVOVFRZUEUgKnBPTVhDb21wb25lbnQsIFNFQ19PTVhfREFUQSAqcElucHV0RGF0YSwgU0VDX09NWF9EQVRBICpwT3V0cHV0RGF0YSkKK3sKKyAgICBPTVhfRVJST1JUWVBFIHJldCA9IE9NWF9FcnJvck5vbmU7CisgICAgU0VDX09NWF9CQVNFQ09NUE9ORU5UICAgKnBTRUNDb21wb25lbnQgPSAoU0VDX09NWF9CQVNFQ09NUE9ORU5UICopcE9NWENvbXBvbmVudC0+cENvbXBvbmVudFByaXZhdGU7CisgICAgU0VDX09NWF9WSURFT0RFQ19DT01QT05FTlQgKnBWaWRlb0RlYyA9IChTRUNfT01YX1ZJREVPREVDX0NPTVBPTkVOVCAqKXBTRUNDb21wb25lbnQtPmhDb21wb25lbnRIYW5kbGU7CisgICAgU0VDX0gyNjRERUNfSEFORExFICAgICAgKnBIMjY0RGVjID0gKFNFQ19IMjY0REVDX0hBTkRMRSAqKSgoU0VDX09NWF9WSURFT0RFQ19DT01QT05FTlQgKilwU0VDQ29tcG9uZW50LT5oQ29tcG9uZW50SGFuZGxlKS0+aENvZGVjSGFuZGxlOworICAgIFNFQ19PTVhfQkFTRVBPUlQgICAgICAgICpwU0VDSW5wdXRQb3J0ID0gJnBTRUNDb21wb25lbnQtPnBTRUNQb3J0W0lOUFVUX1BPUlRfSU5ERVhdOworICAgIFNFQ19PTVhfQkFTRVBPUlQgICAgICAgICpwU0VDT3V0cHV0UG9ydCA9ICZwU0VDQ29tcG9uZW50LT5wU0VDUG9ydFtPVVRQVVRfUE9SVF9JTkRFWF07CisgICAgT01YX0JPT0wgICAgICAgICAgICAgICAgIGVuZE9mRnJhbWUgPSBPTVhfRkFMU0U7CisKKyAgICBGdW5jdGlvbkluKCk7CisKKyAgICBpZiAoKCFDSEVDS19QT1JUX0VOQUJMRUQocFNFQ0lucHV0UG9ydCkpIHx8ICghQ0hFQ0tfUE9SVF9FTkFCTEVEKHBTRUNPdXRwdXRQb3J0KSkgfHwKKyAgICAgICAgKCFDSEVDS19QT1JUX1BPUFVMQVRFRChwU0VDSW5wdXRQb3J0KSkgfHwgKCFDSEVDS19QT1JUX1BPUFVMQVRFRChwU0VDT3V0cHV0UG9ydCkpKSB7CisgICAgICAgIHJldCA9IE9NWF9FcnJvck5vbmU7CisgICAgICAgIGdvdG8gRVhJVDsKKyAgICB9CisgICAgaWYgKE9NWF9GQUxTRSA9PSBTRUNfQ2hlY2tfQnVmZmVyUHJvY2Vzc19TdGF0ZShwU0VDQ29tcG9uZW50KSkgeworICAgICAgICByZXQgPSBPTVhfRXJyb3JOb25lOworICAgICAgICBnb3RvIEVYSVQ7CisgICAgfQorCisgICAgaWYgKHBWaWRlb0RlYy0+YkRSTVBsYXllck1vZGUgPT0gT01YX0ZBTFNFKSB7CisjaWZkZWYgTk9OQkxPQ0tfTU9ERV9QUk9DRVNTCisgICAgICAgIHJldCA9IFNFQ19NRkNfSDI2NF9EZWNvZGVfTm9uYmxvY2socE9NWENvbXBvbmVudCwgcElucHV0RGF0YSwgcE91dHB1dERhdGEpOworI2Vsc2UKKyAgICAgICAgcmV0ID0gU0VDX01GQ19IMjY0X0RlY29kZV9CbG9jayhwT01YQ29tcG9uZW50LCBwSW5wdXREYXRhLCBwT3V0cHV0RGF0YSk7CisjZW5kaWYKKyAgICB9IGVsc2UgeworICAgICAgICByZXQgPSBTRUNfTUZDX0gyNjRfRGVjb2RlX0RSTShwT01YQ29tcG9uZW50LCBwSW5wdXREYXRhLCBwT3V0cHV0RGF0YSk7CisgICAgfQorCisgICAgaWYgKHJldCAhPSBPTVhfRXJyb3JOb25lKSB7CisgICAgICAgIGlmIChyZXQgPT0gT01YX0Vycm9ySW5wdXREYXRhRGVjb2RlWWV0KSB7CisgICAgICAgICAgICBwT3V0cHV0RGF0YS0+dXNlZERhdGFMZW4gPSAwOworICAgICAgICAgICAgcE91dHB1dERhdGEtPnJlbWFpbkRhdGFMZW4gPSBwT3V0cHV0RGF0YS0+ZGF0YUxlbjsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHBTRUNDb21wb25lbnQtPnBDYWxsYmFja3MtPkV2ZW50SGFuZGxlcigoT01YX0hBTkRMRVRZUEUpcE9NWENvbXBvbmVudCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwU0VDQ29tcG9uZW50LT5jYWxsYmFja0RhdGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT01YX0V2ZW50RXJyb3IsIHJldCwgMCwgTlVMTCk7CisgICAgICAgIH0KKyAgICB9IGVsc2UgeworICAgICAgICBwSW5wdXREYXRhLT5wcmV2aW91c0RhdGFMZW4gPSBwSW5wdXREYXRhLT5kYXRhTGVuOworICAgICAgICBwSW5wdXREYXRhLT51c2VkRGF0YUxlbiArPSBwSW5wdXREYXRhLT5kYXRhTGVuOworICAgICAgICBwSW5wdXREYXRhLT5yZW1haW5EYXRhTGVuID0gcElucHV0RGF0YS0+ZGF0YUxlbiAtIHBJbnB1dERhdGEtPnVzZWREYXRhTGVuOworICAgICAgICBwSW5wdXREYXRhLT5kYXRhTGVuIC09IHBJbnB1dERhdGEtPnVzZWREYXRhTGVuOworICAgICAgICBwSW5wdXREYXRhLT51c2VkRGF0YUxlbiA9IDA7CisKKyAgICAgICAgcE91dHB1dERhdGEtPnVzZWREYXRhTGVuID0gMDsKKyAgICAgICAgcE91dHB1dERhdGEtPnJlbWFpbkRhdGFMZW4gPSBwT3V0cHV0RGF0YS0+ZGF0YUxlbjsKKyAgICB9CisKK0VYSVQ6CisgICAgRnVuY3Rpb25PdXQoKTsKKworICAgIHJldHVybiByZXQ7Cit9CisKK09TQ0xfRVhQT1JUX1JFRiBPTVhfRVJST1JUWVBFIFNFQ19PTVhfQ29tcG9uZW50SW5pdChPTVhfSEFORExFVFlQRSBoQ29tcG9uZW50LCBPTVhfU1RSSU5HIGNvbXBvbmVudE5hbWUpCit7CisgICAgT01YX0VSUk9SVFlQRSAgICAgICAgICAgIHJldCA9IE9NWF9FcnJvck5vbmU7CisgICAgT01YX0NPTVBPTkVOVFRZUEUgICAgICAgKnBPTVhDb21wb25lbnQgPSBOVUxMOworICAgIFNFQ19PTVhfQkFTRUNPTVBPTkVOVCAgICpwU0VDQ29tcG9uZW50ID0gTlVMTDsKKyAgICBTRUNfT01YX0JBU0VQT1JUICAgICAgICAqcFNFQ1BvcnQgPSBOVUxMOworICAgIFNFQ19PTVhfVklERU9ERUNfQ09NUE9ORU5UICpwVmlkZW9EZWMgPSBOVUxMOworICAgIFNFQ19IMjY0REVDX0hBTkRMRSAgICAgICpwSDI2NERlYyA9IE5VTEw7CisgICAgT01YX0JPT0wgICAgICAgICAgICAgICAgIGJEUk1QbGF5ZXJNb2RlID0gT01YX0ZBTFNFOworICAgIE9NWF9CT09MICAgICAgICAgICAgICAgICBiRmxhc2hQbGF5ZXJNb2RlID0gT01YX0ZBTFNFOworICAgIGludCBpID0gMDsKKworICAgIEZ1bmN0aW9uSW4oKTsKKworICAgIGlmICgoaENvbXBvbmVudCA9PSBOVUxMKSB8fCAoY29tcG9uZW50TmFtZSA9PSBOVUxMKSkgeworICAgICAgICByZXQgPSBPTVhfRXJyb3JCYWRQYXJhbWV0ZXI7CisgICAgICAgIFNFQ19PU0FMX0xvZyhTRUNfTE9HX0VSUk9SLCAiT01YX0Vycm9yQmFkUGFyYW1ldGVyLCBMaW5lOiVkIiwgX19MSU5FX18pOworICAgICAgICBnb3RvIEVYSVQ7CisgICAgfQorICAgIGlmIChTRUNfT1NBTF9TdHJjbXAoU0VDX09NWF9DT01QT05FTlRfSDI2NF9ERUMsIGNvbXBvbmVudE5hbWUpID09IDApIHsKKyAgICAgICAgYkRSTVBsYXllck1vZGUgPSBPTVhfRkFMU0U7CisgICAgICAgIGJGbGFzaFBsYXllck1vZGUgPSBPTVhfRkFMU0U7CisgICAgfSBlbHNlIGlmIChTRUNfT1NBTF9TdHJjbXAoU0VDX09NWF9DT01QT05FTlRfSDI2NF9EUk1fREVDLCBjb21wb25lbnROYW1lKSA9PSAwKSB7CisgICAgICAgIGJEUk1QbGF5ZXJNb2RlID0gT01YX1RSVUU7CisgICAgICAgIGJGbGFzaFBsYXllck1vZGUgPSBPTVhfRkFMU0U7CisgICAgfSBlbHNlIGlmIChTRUNfT1NBTF9TdHJjbXAoU0VDX09NWF9DT01QT05FTlRfSDI2NF9GUF9ERUMsIGNvbXBvbmVudE5hbWUpID09IDApIHsKKyAgICAgICAgYkRSTVBsYXllck1vZGUgPSBPTVhfRkFMU0U7CisgICAgICAgIGJGbGFzaFBsYXllck1vZGUgPSBPTVhfVFJVRTsKKyAgICB9IGVsc2UgeworICAgICAgICByZXQgPSBPTVhfRXJyb3JCYWRQYXJhbWV0ZXI7CisgICAgICAgIFNFQ19PU0FMX0xvZyhTRUNfTE9HX0VSUk9SLCAiT01YX0Vycm9yQmFkUGFyYW1ldGVyLCBjb21wb25lbnROYW1lOiVzLCBMaW5lOiVkIiwgY29tcG9uZW50TmFtZSwgX19MSU5FX18pOworICAgICAgICBnb3RvIEVYSVQ7CisgICAgfQorCisgICAgcE9NWENvbXBvbmVudCA9IChPTVhfQ09NUE9ORU5UVFlQRSAqKWhDb21wb25lbnQ7CisgICAgcmV0ID0gU0VDX09NWF9WaWRlb0RlY29kZUNvbXBvbmVudEluaXQocE9NWENvbXBvbmVudCk7CisgICAgaWYgKHJldCAhPSBPTVhfRXJyb3JOb25lKSB7CisgICAgICAgIFNFQ19PU0FMX0xvZyhTRUNfTE9HX0VSUk9SLCAiT01YX0Vycm9yLCBMaW5lOiVkIiwgX19MSU5FX18pOworICAgICAgICBnb3RvIEVYSVQ7CisgICAgfQorICAgIHBTRUNDb21wb25lbnQgPSAoU0VDX09NWF9CQVNFQ09NUE9ORU5UICopcE9NWENvbXBvbmVudC0+cENvbXBvbmVudFByaXZhdGU7CisgICAgcFNFQ0NvbXBvbmVudC0+Y29kZWNUeXBlID0gSFdfVklERU9fREVDX0NPREVDOworCisgICAgcFNFQ0NvbXBvbmVudC0+Y29tcG9uZW50TmFtZSA9IChPTVhfU1RSSU5HKVNFQ19PU0FMX01hbGxvYyhNQVhfT01YX0NPTVBPTkVOVF9OQU1FX1NJWkUpOworICAgIGlmIChwU0VDQ29tcG9uZW50LT5jb21wb25lbnROYW1lID09IE5VTEwpIHsKKyAgICAgICAgU0VDX09NWF9WaWRlb0RlY29kZUNvbXBvbmVudERlaW5pdChwT01YQ29tcG9uZW50KTsKKyAgICAgICAgcmV0ID0gT01YX0Vycm9ySW5zdWZmaWNpZW50UmVzb3VyY2VzOworICAgICAgICBTRUNfT1NBTF9Mb2coU0VDX0xPR19FUlJPUiwgIk9NWF9FcnJvckluc3VmZmljaWVudFJlc291cmNlcywgTGluZTolZCIsIF9fTElORV9fKTsKKyAgICAgICAgZ290byBFWElUOworICAgIH0KKyAgICBTRUNfT1NBTF9NZW1zZXQocFNFQ0NvbXBvbmVudC0+Y29tcG9uZW50TmFtZSwgMCwgTUFYX09NWF9DT01QT05FTlRfTkFNRV9TSVpFKTsKKworICAgIHBIMjY0RGVjID0gU0VDX09TQUxfTWFsbG9jKHNpemVvZihTRUNfSDI2NERFQ19IQU5ETEUpKTsKKyAgICBpZiAocEgyNjREZWMgPT0gTlVMTCkgeworICAgICAgICBTRUNfT01YX1ZpZGVvRGVjb2RlQ29tcG9uZW50RGVpbml0KHBPTVhDb21wb25lbnQpOworICAgICAgICByZXQgPSBPTVhfRXJyb3JJbnN1ZmZpY2llbnRSZXNvdXJjZXM7CisgICAgICAgIFNFQ19PU0FMX0xvZyhTRUNfTE9HX0VSUk9SLCAiT01YX0Vycm9ySW5zdWZmaWNpZW50UmVzb3VyY2VzLCBMaW5lOiVkIiwgX19MSU5FX18pOworICAgICAgICBnb3RvIEVYSVQ7CisgICAgfQorICAgIFNFQ19PU0FMX01lbXNldChwSDI2NERlYywgMCwgc2l6ZW9mKFNFQ19IMjY0REVDX0hBTkRMRSkpOworICAgIHBWaWRlb0RlYyA9IChTRUNfT01YX1ZJREVPREVDX0NPTVBPTkVOVCAqKXBTRUNDb21wb25lbnQtPmhDb21wb25lbnRIYW5kbGU7CisgICAgcFZpZGVvRGVjLT5oQ29kZWNIYW5kbGUgPSAoT01YX0hBTkRMRVRZUEUpcEgyNjREZWM7CisKKyAgICBpZiAoYkRSTVBsYXllck1vZGUgPT0gT01YX1RSVUUpCisgICAgICAgIFNFQ19PU0FMX1N0cmNweShwU0VDQ29tcG9uZW50LT5jb21wb25lbnROYW1lLCBTRUNfT01YX0NPTVBPTkVOVF9IMjY0X0RSTV9ERUMpOworICAgIGVsc2UgaWYgKGJGbGFzaFBsYXllck1vZGUgPT0gT01YX1RSVUUpCisgICAgICAgIFNFQ19PU0FMX1N0cmNweShwU0VDQ29tcG9uZW50LT5jb21wb25lbnROYW1lLCBTRUNfT01YX0NPTVBPTkVOVF9IMjY0X0ZQX0RFQyk7CisgICAgZWxzZQorICAgICAgICBTRUNfT1NBTF9TdHJjcHkocFNFQ0NvbXBvbmVudC0+Y29tcG9uZW50TmFtZSwgU0VDX09NWF9DT01QT05FTlRfSDI2NF9ERUMpOworCisgICAgcFZpZGVvRGVjLT5iRFJNUGxheWVyTW9kZSA9IGJEUk1QbGF5ZXJNb2RlOworICAgIHBIMjY0RGVjLT5oTUZDSDI2NEhhbmRsZS5iRmxhc2hQbGF5ZXJNb2RlID0gYkZsYXNoUGxheWVyTW9kZTsKKyNpZmRlZiBTM0RfU1VQUE9SVAorICAgIHBIMjY0RGVjLT5oTUZDSDI2NEhhbmRsZS5iUzNETW9kZSA9IE9NWF9GQUxTRTsKKyNlbmRpZgorCisgICAgLyogU2V0IGNvbXBvbmVudFZlcnNpb24gKi8KKyAgICBwU0VDQ29tcG9uZW50LT5jb21wb25lbnRWZXJzaW9uLnMublZlcnNpb25NYWpvciA9IFZFUlNJT05NQUpPUl9OVU1CRVI7CisgICAgcFNFQ0NvbXBvbmVudC0+Y29tcG9uZW50VmVyc2lvbi5zLm5WZXJzaW9uTWlub3IgPSBWRVJTSU9OTUlOT1JfTlVNQkVSOworICAgIHBTRUNDb21wb25lbnQtPmNvbXBvbmVudFZlcnNpb24ucy5uUmV2aXNpb24gICAgID0gUkVWSVNJT05fTlVNQkVSOworICAgIHBTRUNDb21wb25lbnQtPmNvbXBvbmVudFZlcnNpb24ucy5uU3RlcCAgICAgICAgID0gU1RFUF9OVU1CRVI7CisgICAgLyogU2V0IHNwZWNWZXJzaW9uICovCisgICAgcFNFQ0NvbXBvbmVudC0+c3BlY1ZlcnNpb24ucy5uVmVyc2lvbk1ham9yID0gVkVSU0lPTk1BSk9SX05VTUJFUjsKKyAgICBwU0VDQ29tcG9uZW50LT5zcGVjVmVyc2lvbi5zLm5WZXJzaW9uTWlub3IgPSBWRVJTSU9OTUlOT1JfTlVNQkVSOworICAgIHBTRUNDb21wb25lbnQtPnNwZWNWZXJzaW9uLnMublJldmlzaW9uICAgICA9IFJFVklTSU9OX05VTUJFUjsKKyAgICBwU0VDQ29tcG9uZW50LT5zcGVjVmVyc2lvbi5zLm5TdGVwICAgICAgICAgPSBTVEVQX05VTUJFUjsKKworICAgIC8qIEFuZHJvaWQgQ2FwYWJpbGl0eUZsYWdzICovCisgICAgcFNFQ0NvbXBvbmVudC0+Y2FwYWJpbGl0eUZsYWdzLmlJc09NWENvbXBvbmVudE11bHRpVGhyZWFkZWQgICAgICAgICAgICAgICAgICAgPSBPTVhfVFJVRTsKKyAgICBwU0VDQ29tcG9uZW50LT5jYXBhYmlsaXR5RmxhZ3MuaU9NWENvbXBvbmVudFN1cHBvcnRzRXh0ZXJuYWxJbnB1dEJ1ZmZlckFsbG9jICA9IE9NWF9UUlVFOworICAgIHBTRUNDb21wb25lbnQtPmNhcGFiaWxpdHlGbGFncy5pT01YQ29tcG9uZW50U3VwcG9ydHNFeHRlcm5hbE91dHB1dEJ1ZmZlckFsbG9jID0gT01YX1RSVUU7CisgICAgcFNFQ0NvbXBvbmVudC0+Y2FwYWJpbGl0eUZsYWdzLmlPTVhDb21wb25lbnRTdXBwb3J0c01vdmFibGVJbnB1dEJ1ZmZlcnMgICAgICAgPSBPTVhfRkFMU0U7CisgICAgcFNFQ0NvbXBvbmVudC0+Y2FwYWJpbGl0eUZsYWdzLmlPTVhDb21wb25lbnRTdXBwb3J0c1BhcnRpYWxGcmFtZXMgICAgICAgICAgICAgPSBPTVhfRkFMU0U7CisgICAgcFNFQ0NvbXBvbmVudC0+Y2FwYWJpbGl0eUZsYWdzLmlPTVhDb21wb25lbnRVc2VzTkFMU3RhcnRDb2RlcyAgICAgICAgICAgICAgICAgPSBPTVhfVFJVRTsKKyAgICBwU0VDQ29tcG9uZW50LT5jYXBhYmlsaXR5RmxhZ3MuaU9NWENvbXBvbmVudENhbkhhbmRsZUluY29tcGxldGVGcmFtZXMgICAgICAgICA9IE9NWF9UUlVFOworICAgIHBTRUNDb21wb25lbnQtPmNhcGFiaWxpdHlGbGFncy5pT01YQ29tcG9uZW50VXNlc0Z1bGxBVkNGcmFtZXMgICAgICAgICAgICAgICAgID0gT01YX1RSVUU7CisKKyAgICAvKiBJbnB1dCBwb3J0ICovCisgICAgcFNFQ1BvcnQgPSAmcFNFQ0NvbXBvbmVudC0+cFNFQ1BvcnRbSU5QVVRfUE9SVF9JTkRFWF07CisgICAgcFNFQ1BvcnQtPnBvcnREZWZpbml0aW9uLmZvcm1hdC52aWRlby5uRnJhbWVXaWR0aCA9IERFRkFVTFRfRlJBTUVfV0lEVEg7CisgICAgcFNFQ1BvcnQtPnBvcnREZWZpbml0aW9uLmZvcm1hdC52aWRlby5uRnJhbWVIZWlnaHQ9IERFRkFVTFRfRlJBTUVfSEVJR0hUOworICAgIHBTRUNQb3J0LT5wb3J0RGVmaW5pdGlvbi5mb3JtYXQudmlkZW8ublN0cmlkZSA9IDA7IC8qREVGQVVMVF9GUkFNRV9XSURUSDsqLworICAgIHBTRUNQb3J0LT5wb3J0RGVmaW5pdGlvbi5mb3JtYXQudmlkZW8ublNsaWNlSGVpZ2h0ID0gMDsKKyAgICBwU0VDUG9ydC0+cG9ydERlZmluaXRpb24ubkJ1ZmZlclNpemUgPSBERUZBVUxUX1ZJREVPX0lOUFVUX0JVRkZFUl9TSVpFOworICAgIHBTRUNQb3J0LT5wb3J0RGVmaW5pdGlvbi5mb3JtYXQudmlkZW8uZUNvbXByZXNzaW9uRm9ybWF0ID0gT01YX1ZJREVPX0NvZGluZ0FWQzsKKyAgICBTRUNfT1NBTF9NZW1zZXQocFNFQ1BvcnQtPnBvcnREZWZpbml0aW9uLmZvcm1hdC52aWRlby5jTUlNRVR5cGUsIDAsIE1BWF9PTVhfTUlNRVRZUEVfU0laRSk7CisgICAgU0VDX09TQUxfU3RyY3B5KHBTRUNQb3J0LT5wb3J0RGVmaW5pdGlvbi5mb3JtYXQudmlkZW8uY01JTUVUeXBlLCAidmlkZW8vYXZjIik7CisgICAgcFNFQ1BvcnQtPnBvcnREZWZpbml0aW9uLmZvcm1hdC52aWRlby5wTmF0aXZlUmVuZGVyID0gMDsKKyAgICBwU0VDUG9ydC0+cG9ydERlZmluaXRpb24uZm9ybWF0LnZpZGVvLmJGbGFnRXJyb3JDb25jZWFsbWVudCA9IE9NWF9GQUxTRTsKKyAgICBwU0VDUG9ydC0+cG9ydERlZmluaXRpb24uZm9ybWF0LnZpZGVvLmVDb2xvckZvcm1hdCA9IE9NWF9DT0xPUl9Gb3JtYXRVbnVzZWQ7CisgICAgcFNFQ1BvcnQtPnBvcnREZWZpbml0aW9uLmJFbmFibGVkID0gT01YX1RSVUU7CisgICAgaWYgKGJGbGFzaFBsYXllck1vZGUgIT0gT01YX0ZBTFNFKSB7CisgICAgICAgIHBTRUNQb3J0LT5wb3J0RGVmaW5pdGlvbi5uQnVmZmVyQ291bnRBY3R1YWwgPSBNQVhfSDI2NF9GUF9WSURFT19JTlBVVEJVRkZFUl9OVU07CisgICAgICAgIHBTRUNQb3J0LT5wb3J0RGVmaW5pdGlvbi5uQnVmZmVyQ291bnRNaW4gPSBNQVhfSDI2NF9GUF9WSURFT19JTlBVVEJVRkZFUl9OVU07CisgICAgfQorCisgICAgLyogT3V0cHV0IHBvcnQgKi8KKyAgICBwU0VDUG9ydCA9ICZwU0VDQ29tcG9uZW50LT5wU0VDUG9ydFtPVVRQVVRfUE9SVF9JTkRFWF07CisgICAgcFNFQ1BvcnQtPnBvcnREZWZpbml0aW9uLmZvcm1hdC52aWRlby5uRnJhbWVXaWR0aCA9IERFRkFVTFRfRlJBTUVfV0lEVEg7CisgICAgcFNFQ1BvcnQtPnBvcnREZWZpbml0aW9uLmZvcm1hdC52aWRlby5uRnJhbWVIZWlnaHQ9IERFRkFVTFRfRlJBTUVfSEVJR0hUOworICAgIHBTRUNQb3J0LT5wb3J0RGVmaW5pdGlvbi5mb3JtYXQudmlkZW8ublN0cmlkZSA9IDA7IC8qREVGQVVMVF9GUkFNRV9XSURUSDsqLworICAgIHBTRUNQb3J0LT5wb3J0RGVmaW5pdGlvbi5mb3JtYXQudmlkZW8ublNsaWNlSGVpZ2h0ID0gMDsKKyAgICBwU0VDUG9ydC0+cG9ydERlZmluaXRpb24ubkJ1ZmZlclNpemUgPSBERUZBVUxUX1ZJREVPX09VVFBVVF9CVUZGRVJfU0laRTsKKyAgICBwU0VDUG9ydC0+cG9ydERlZmluaXRpb24uZm9ybWF0LnZpZGVvLmVDb21wcmVzc2lvbkZvcm1hdCA9IE9NWF9WSURFT19Db2RpbmdVbnVzZWQ7CisgICAgU0VDX09TQUxfTWVtc2V0KHBTRUNQb3J0LT5wb3J0RGVmaW5pdGlvbi5mb3JtYXQudmlkZW8uY01JTUVUeXBlLCAwLCBNQVhfT01YX01JTUVUWVBFX1NJWkUpOworICAgIFNFQ19PU0FMX1N0cmNweShwU0VDUG9ydC0+cG9ydERlZmluaXRpb24uZm9ybWF0LnZpZGVvLmNNSU1FVHlwZSwgInJhdy92aWRlbyIpOworICAgIHBTRUNQb3J0LT5wb3J0RGVmaW5pdGlvbi5mb3JtYXQudmlkZW8ucE5hdGl2ZVJlbmRlciA9IDA7CisgICAgcFNFQ1BvcnQtPnBvcnREZWZpbml0aW9uLmZvcm1hdC52aWRlby5iRmxhZ0Vycm9yQ29uY2VhbG1lbnQgPSBPTVhfRkFMU0U7CisgICAgcFNFQ1BvcnQtPnBvcnREZWZpbml0aW9uLmZvcm1hdC52aWRlby5lQ29sb3JGb3JtYXQgPSBPTVhfQ09MT1JfRm9ybWF0WVVWNDIwUGxhbmFyOworICAgIHBTRUNQb3J0LT5wb3J0RGVmaW5pdGlvbi5iRW5hYmxlZCA9IE9NWF9UUlVFOworICAgIGlmIChiRmxhc2hQbGF5ZXJNb2RlICE9IE9NWF9GQUxTRSkgeworICAgICAgICBwU0VDUG9ydC0+cG9ydERlZmluaXRpb24ubkJ1ZmZlckNvdW50QWN0dWFsID0gTUFYX0gyNjRfRlBfVklERU9fT1VUUFVUQlVGRkVSX05VTTsKKyAgICAgICAgcFNFQ1BvcnQtPnBvcnREZWZpbml0aW9uLm5CdWZmZXJDb3VudE1pbiA9IE1BWF9IMjY0X0ZQX1ZJREVPX09VVFBVVEJVRkZFUl9OVU07CisgICAgfQorCisgICAgZm9yKGkgPSAwOyBpIDwgQUxMX1BPUlRfTlVNOyBpKyspIHsKKyAgICAgICAgSU5JVF9TRVRfU0laRV9WRVJTSU9OKCZwSDI2NERlYy0+QVZDQ29tcG9uZW50W2ldLCBPTVhfVklERU9fUEFSQU1fQVZDVFlQRSk7CisgICAgICAgIHBIMjY0RGVjLT5BVkNDb21wb25lbnRbaV0ublBvcnRJbmRleCA9IGk7CisgICAgICAgIHBIMjY0RGVjLT5BVkNDb21wb25lbnRbaV0uZVByb2ZpbGUgICA9IE9NWF9WSURFT19BVkNQcm9maWxlQmFzZWxpbmU7CisgICAgICAgIHBIMjY0RGVjLT5BVkNDb21wb25lbnRbaV0uZUxldmVsICAgICA9IE9NWF9WSURFT19BVkNMZXZlbDQ7CisgICAgfQorCisgICAgcE9NWENvbXBvbmVudC0+R2V0UGFyYW1ldGVyICAgICAgPSAmU0VDX01GQ19IMjY0RGVjX0dldFBhcmFtZXRlcjsKKyAgICBwT01YQ29tcG9uZW50LT5TZXRQYXJhbWV0ZXIgICAgICA9ICZTRUNfTUZDX0gyNjREZWNfU2V0UGFyYW1ldGVyOworICAgIHBPTVhDb21wb25lbnQtPkdldENvbmZpZyAgICAgICAgID0gJlNFQ19NRkNfSDI2NERlY19HZXRDb25maWc7CisgICAgcE9NWENvbXBvbmVudC0+U2V0Q29uZmlnICAgICAgICAgPSAmU0VDX01GQ19IMjY0RGVjX1NldENvbmZpZzsKKyAgICBwT01YQ29tcG9uZW50LT5HZXRFeHRlbnNpb25JbmRleCA9ICZTRUNfTUZDX0gyNjREZWNfR2V0RXh0ZW5zaW9uSW5kZXg7CisgICAgcE9NWENvbXBvbmVudC0+Q29tcG9uZW50Um9sZUVudW0gPSAmU0VDX01GQ19IMjY0RGVjX0NvbXBvbmVudFJvbGVFbnVtOworICAgIHBPTVhDb21wb25lbnQtPkNvbXBvbmVudERlSW5pdCAgID0gJlNFQ19PTVhfQ29tcG9uZW50RGVpbml0OworCisgICAgcFNFQ0NvbXBvbmVudC0+c2VjX21mY19jb21wb25lbnRJbml0ICAgICAgPSAmU0VDX01GQ19IMjY0RGVjX0luaXQ7CisgICAgcFNFQ0NvbXBvbmVudC0+c2VjX21mY19jb21wb25lbnRUZXJtaW5hdGUgPSAmU0VDX01GQ19IMjY0RGVjX1Rlcm1pbmF0ZTsKKyAgICBwU0VDQ29tcG9uZW50LT5zZWNfbWZjX2J1ZmZlclByb2Nlc3MgICAgICA9ICZTRUNfTUZDX0gyNjREZWNfYnVmZmVyUHJvY2VzczsKKyAgICBwU0VDQ29tcG9uZW50LT5zZWNfY2hlY2tJbnB1dEZyYW1lICAgICAgICA9ICZDaGVja19IMjY0X0ZyYW1lOworCisgICAgcFNFQ0NvbXBvbmVudC0+c2VjX2FsbG9jU2VjdXJlSW5wdXRCdWZmZXIgPSAmU0VDX01GQ19IMjY0RGVjX0FsbG9jX1NlY3VyZUlucHV0QnVmZmVyOworICAgIHBTRUNDb21wb25lbnQtPnNlY19mcmVlU2VjdXJlSW5wdXRCdWZmZXIgID0gJlNFQ19NRkNfSDI2NERlY19GcmVlX1NlY3VyZUlucHV0QnVmZmVyOworCisgICAgaWYgKGJEUk1QbGF5ZXJNb2RlID09IE9NWF9UUlVFKSB7CisgICAgICAgIE9NWF9QVFIgaE1GQ0hhbmRsZSA9IE5VTEw7CisgICAgICAgIFNFQ19PU0FMX0xvZyhTRUNfTE9HX0VSUk9SLCAiRFJNLS1Tc2JTaXBNZmNEZWNPcGVuLCBMaW5lOiVkIiwgX19MSU5FX18pOworICAgICAgICBoTUZDSGFuZGxlID0gKE9NWF9QVFIpU3NiU2lwTWZjRGVjT3BlbigpOworICAgICAgICBpZiAoaE1GQ0hhbmRsZSA9PSBOVUxMKSB7CisgICAgICAgICAgICByZXQgPSBPTVhfRXJyb3JJbnN1ZmZpY2llbnRSZXNvdXJjZXM7CisgICAgICAgICAgICBnb3RvIEVYSVQ7CisgICAgICAgIH0KKyAgICAgICAgcEgyNjREZWMtPmhNRkNIMjY0SGFuZGxlLmhNRkNIYW5kbGUgPSBoTUZDSGFuZGxlOworICAgIH0KKworICAgIHBTRUNDb21wb25lbnQtPmN1cnJlbnRTdGF0ZSA9IE9NWF9TdGF0ZUxvYWRlZDsKKworICAgIHJldCA9IE9NWF9FcnJvck5vbmU7CisKK0VYSVQ6CisgICAgRnVuY3Rpb25PdXQoKTsKKworICAgIHJldHVybiByZXQ7Cit9CisKK09NWF9FUlJPUlRZUEUgU0VDX09NWF9Db21wb25lbnREZWluaXQoT01YX0hBTkRMRVRZUEUgaENvbXBvbmVudCkKK3sKKyAgICBPTVhfRVJST1JUWVBFICAgICAgICAgICAgcmV0ID0gT01YX0Vycm9yTm9uZTsKKyAgICBPTVhfQ09NUE9ORU5UVFlQRSAgICAgICAqcE9NWENvbXBvbmVudCA9IE5VTEw7CisgICAgU0VDX09NWF9CQVNFQ09NUE9ORU5UICAgKnBTRUNDb21wb25lbnQgPSBOVUxMOworICAgIFNFQ19PTVhfVklERU9ERUNfQ09NUE9ORU5UICpwVmlkZW9EZWMgPSBOVUxMOworICAgIFNFQ19IMjY0REVDX0hBTkRMRSAgICAgICpwSDI2NERlYyA9IE5VTEw7CisKKyAgICBGdW5jdGlvbkluKCk7CisKKyAgICBpZiAoaENvbXBvbmVudCA9PSBOVUxMKSB7CisgICAgICAgIHJldCA9IE9NWF9FcnJvckJhZFBhcmFtZXRlcjsKKyAgICAgICAgZ290byBFWElUOworICAgIH0KKyAgICBwT01YQ29tcG9uZW50ID0gKE9NWF9DT01QT05FTlRUWVBFICopaENvbXBvbmVudDsKKyAgICBwU0VDQ29tcG9uZW50ID0gKFNFQ19PTVhfQkFTRUNPTVBPTkVOVCAqKXBPTVhDb21wb25lbnQtPnBDb21wb25lbnRQcml2YXRlOworICAgIHBWaWRlb0RlYyA9IChTRUNfT01YX1ZJREVPREVDX0NPTVBPTkVOVCAqKXBTRUNDb21wb25lbnQtPmhDb21wb25lbnRIYW5kbGU7CisKKyAgICBTRUNfT1NBTF9GcmVlKHBTRUNDb21wb25lbnQtPmNvbXBvbmVudE5hbWUpOworICAgIHBTRUNDb21wb25lbnQtPmNvbXBvbmVudE5hbWUgPSBOVUxMOworCisgICAgcEgyNjREZWMgPSAoU0VDX0gyNjRERUNfSEFORExFICopKChTRUNfT01YX1ZJREVPREVDX0NPTVBPTkVOVCAqKXBTRUNDb21wb25lbnQtPmhDb21wb25lbnRIYW5kbGUpLT5oQ29kZWNIYW5kbGU7CisgICAgaWYgKHBIMjY0RGVjICE9IE5VTEwpIHsKKyAgICAgICAgT01YX1BUUiBoTUZDSGFuZGxlID0gTlVMTDsKKyAgICAgICAgaE1GQ0hhbmRsZSA9IHBIMjY0RGVjLT5oTUZDSDI2NEhhbmRsZS5oTUZDSGFuZGxlOworICAgICAgICBpZiAoKGhNRkNIYW5kbGUgIT0gTlVMTCkgJiYgKHBWaWRlb0RlYy0+YkRSTVBsYXllck1vZGUgPT0gT01YX1RSVUUpKSB7CisgICAgICAgICAgICBTRUNfT1NBTF9Mb2coU0VDX0xPR19FUlJPUiwgIkRSTS0tU3NiU2lwTWZjRGVjQ2xvc2UsIExpbmU6JWQiLCBfX0xJTkVfXyk7CisgICAgICAgICAgICBTc2JTaXBNZmNEZWNDbG9zZShoTUZDSGFuZGxlKTsKKyAgICAgICAgICAgIGhNRkNIYW5kbGUgPSBwSDI2NERlYy0+aE1GQ0gyNjRIYW5kbGUuaE1GQ0hhbmRsZSA9IE5VTEw7CisgICAgICAgIH0KKyAgICAgICAgU0VDX09TQUxfRnJlZShwSDI2NERlYyk7CisgICAgICAgIHBIMjY0RGVjID0gKChTRUNfT01YX1ZJREVPREVDX0NPTVBPTkVOVCAqKXBTRUNDb21wb25lbnQtPmhDb21wb25lbnRIYW5kbGUpLT5oQ29kZWNIYW5kbGUgPSBOVUxMOworICAgIH0KKworICAgIHJldCA9IFNFQ19PTVhfVmlkZW9EZWNvZGVDb21wb25lbnREZWluaXQocE9NWENvbXBvbmVudCk7CisgICAgaWYgKHJldCAhPSBPTVhfRXJyb3JOb25lKSB7CisgICAgICAgIGdvdG8gRVhJVDsKKyAgICB9CisKKyAgICByZXQgPSBPTVhfRXJyb3JOb25lOworCitFWElUOgorICAgIEZ1bmN0aW9uT3V0KCk7CisKKyAgICByZXR1cm4gcmV0OworfQpkaWZmIC0tZ2l0IGEvZXh5bm9zNC9tdWx0aW1lZGlhL29wZW5tYXgvc2VjX29teC9jb21wb25lbnQvdmlkZW8vZGVjL2gyNjQvU0VDX09NWF9IMjY0ZGVjLmggYi9leHlub3M0L211bHRpbWVkaWEvb3Blbm1heC9zZWNfb214L2NvbXBvbmVudC92aWRlby9kZWMvaDI2NC9TRUNfT01YX0gyNjRkZWMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zNzBhMTVmCi0tLSAvZGV2L251bGwKKysrIGIvZXh5bm9zNC9tdWx0aW1lZGlhL29wZW5tYXgvc2VjX29teC9jb21wb25lbnQvdmlkZW8vZGVjL2gyNjQvU0VDX09NWF9IMjY0ZGVjLmgKQEAgLTAsMCArMSw3NCBAQAorLyoKKyAqCisgKiBDb3B5cmlnaHQgMjAxMCBTYW1zdW5nIEVsZWN0cm9uaWNzIFMuTFNJIENvLiBMVEQKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworLyoKKyAqIEBmaWxlICAgIFNFQ19PTVhfSDI2NGRlYy5oCisgKiBAYnJpZWYKKyAqIEBhdXRob3IgICAgU2V1bmdCZW9tIEtpbSAoc2JjcnV4LmtpbUBzYW1zdW5nLmNvbSkKKyAqIEB2ZXJzaW9uICAgIDEuMS4wCisgKiBAaGlzdG9yeQorICogICAyMDEwLjcuMTUgOiBDcmVhdGUKKyAqLworCisjaWZuZGVmIFNFQ19PTVhfSDI2NF9ERUNfQ09NUE9ORU5UCisjZGVmaW5lIFNFQ19PTVhfSDI2NF9ERUNfQ09NUE9ORU5UCisKKyNpbmNsdWRlICJTRUNfT01YX0RlZi5oIgorI2luY2x1ZGUgIk9NWF9Db21wb25lbnQuaCIKKyNpbmNsdWRlICJPTVhfVmlkZW8uaCIKKworCisjZGVmaW5lIE1BWF9IMjY0X0ZQX1ZJREVPX0lOUFVUQlVGRkVSX05VTSAgNAorI2RlZmluZSBNQVhfSDI2NF9GUF9WSURFT19PVVRQVVRCVUZGRVJfTlVNIDQKKwordHlwZWRlZiBzdHJ1Y3QgX1NFQ19NRkNfSDI2NERFQ19IQU5ETEUKK3sKKyAgICBPTVhfSEFORExFVFlQRSBoTUZDSGFuZGxlOworICAgIE9NWF9QVFIgIHBNRkNTdHJlYW1CdWZmZXI7CisgICAgT01YX1BUUiAgcE1GQ1N0cmVhbVBoeUJ1ZmZlcjsKKyAgICBPTVhfVTMyICBpbmRleFRpbWVzdGFtcDsKKyAgICBPTVhfVTMyICBvdXRwdXRJbmRleFRpbWVzdGFtcDsKKyAgICBPTVhfQk9PTCBiQ29uZmlndXJlZE1GQzsKKyAgICBPTVhfQk9PTCBiRmxhc2hQbGF5ZXJNb2RlOworI2lmZGVmIFMzRF9TVVBQT1JUCisgICAgT01YX0JPT0wgYlMzRE1vZGU7CisjZW5kaWYKKyAgICBPTVhfUzMyICByZXR1cm5Db2RlYzsKK30gU0VDX01GQ19IMjY0REVDX0hBTkRMRTsKKwordHlwZWRlZiBzdHJ1Y3QgX1NFQ19IMjY0REVDX0hBTkRMRQoreworICAgIC8qIE9NWCBDb2RlYyBzcGVjaWZpYyAqLworICAgIE9NWF9WSURFT19QQVJBTV9BVkNUWVBFIEFWQ0NvbXBvbmVudFtBTExfUE9SVF9OVU1dOworICAgIE9NWF9WSURFT19QQVJBTV9FUlJPUkNPUlJFQ1RJT05UWVBFIGVycm9yQ29ycmVjdGlvblR5cGVbQUxMX1BPUlRfTlVNXTsKKworICAgIC8qIFNFQyBNRkMgQ29kZWMgc3BlY2lmaWMgKi8KKyAgICBTRUNfTUZDX0gyNjRERUNfSEFORExFIGhNRkNIMjY0SGFuZGxlOworfSBTRUNfSDI2NERFQ19IQU5ETEU7CisKKyNpZmRlZiBfX2NwbHVzcGx1cworZXh0ZXJuICJDIiB7CisjZW5kaWYKKworT1NDTF9FWFBPUlRfUkVGIE9NWF9FUlJPUlRZUEUgU0VDX09NWF9Db21wb25lbnRJbml0KE9NWF9IQU5ETEVUWVBFIGhDb21wb25lbnQsIE9NWF9TVFJJTkcgY29tcG9uZW50TmFtZSk7CitPTVhfRVJST1JUWVBFIFNFQ19PTVhfQ29tcG9uZW50RGVpbml0KE9NWF9IQU5ETEVUWVBFIGhDb21wb25lbnQpOworCisjaWZkZWYgX19jcGx1c3BsdXMKK307CisjZW5kaWYKKworI2VuZGlmCmRpZmYgLS1naXQgYS9leHlub3M0L211bHRpbWVkaWEvb3Blbm1heC9zZWNfb214L2NvbXBvbmVudC92aWRlby9kZWMvaDI2NC9saWJyYXJ5X3JlZ2lzdGVyLmMgYi9leHlub3M0L211bHRpbWVkaWEvb3Blbm1heC9zZWNfb214L2NvbXBvbmVudC92aWRlby9kZWMvaDI2NC9saWJyYXJ5X3JlZ2lzdGVyLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYWE2M2M2YwotLS0gL2Rldi9udWxsCisrKyBiL2V4eW5vczQvbXVsdGltZWRpYS9vcGVubWF4L3NlY19vbXgvY29tcG9uZW50L3ZpZGVvL2RlYy9oMjY0L2xpYnJhcnlfcmVnaXN0ZXIuYwpAQCAtMCwwICsxLDY1IEBACisvKgorICoKKyAqIENvcHlyaWdodCAyMDEwIFNhbXN1bmcgRWxlY3Ryb25pY3MgUy5MU0kgQ28uIExURAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisvKgorICogQGZpbGUgICAgbGlicmFyeV9yZWdpc3Rlci5jCisgKiBAYnJpZWYKKyAqIEBhdXRob3IgICAgU2V1bmdCZW9tIEtpbSAoc2JjcnV4LmtpbUBzYW1zdW5nLmNvbSkKKyAqIEB2ZXJzaW9uICAgIDEuMS4wCisgKiBAaGlzdG9yeQorICogICAyMDEwLjcuMTUgOiBDcmVhdGUKKyAqLworCisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlIDxzdGRsaWIuaD4KKyNpbmNsdWRlIDxzdHJpbmcuaD4KKyNpbmNsdWRlIDxkbGZjbi5oPgorCisjaW5jbHVkZSAiU0VDX09TQUxfTWVtb3J5LmgiCisjaW5jbHVkZSAiU0VDX09TQUxfRVRDLmgiCisjaW5jbHVkZSAibGlicmFyeV9yZWdpc3Rlci5oIgorI2luY2x1ZGUgIlNFQ19PU0FMX0xvZy5oIgorCisKK09TQ0xfRVhQT1JUX1JFRiBpbnQgU0VDX09NWF9DT01QT05FTlRfTGlicmFyeV9SZWdpc3RlcihTRUNSZWdpc3RlckNvbXBvbmVudFR5cGUgKipzZWNDb21wb25lbnRzKQoreworICAgIEZ1bmN0aW9uSW4oKTsKKworICAgIGlmIChzZWNDb21wb25lbnRzID09IE5VTEwpCisgICAgICAgIGdvdG8gRVhJVDsKKworICAgIC8qIGNvbXBvbmVudCAxIC0gdmlkZW8gZGVjb2RlciBILjI2NCAqLworICAgIFNFQ19PU0FMX1N0cmNweShzZWNDb21wb25lbnRzWzBdLT5jb21wb25lbnROYW1lLCBTRUNfT01YX0NPTVBPTkVOVF9IMjY0X0RFQyk7CisgICAgU0VDX09TQUxfU3RyY3B5KHNlY0NvbXBvbmVudHNbMF0tPnJvbGVzWzBdLCBTRUNfT01YX0NPTVBPTkVOVF9IMjY0X0RFQ19ST0xFKTsKKyAgICBzZWNDb21wb25lbnRzWzBdLT50b3RhbFJvbGVOdW0gPSBNQVhfQ09NUE9ORU5UX1JPTEVfTlVNOworCisgICAgLyogY29tcG9uZW50IDIgLSB2aWRlbyBkZWNvZGVyIEguMjY0IGZvciBmbGFzaCBwbGF5ZXIgKi8KKyAgICBTRUNfT1NBTF9TdHJjcHkoc2VjQ29tcG9uZW50c1sxXS0+Y29tcG9uZW50TmFtZSwgU0VDX09NWF9DT01QT05FTlRfSDI2NF9GUF9ERUMpOworICAgIFNFQ19PU0FMX1N0cmNweShzZWNDb21wb25lbnRzWzFdLT5yb2xlc1swXSwgU0VDX09NWF9DT01QT05FTlRfSDI2NF9ERUNfUk9MRSk7CisgICAgc2VjQ29tcG9uZW50c1sxXS0+dG90YWxSb2xlTnVtID0gTUFYX0NPTVBPTkVOVF9ST0xFX05VTTsKKworICAgIC8qIGNvbXBvbmVudCAzIC0gdmlkZW8gZGVjb2RlciBILjI2NCBmb3IgRFJNICovCisgICAgU0VDX09TQUxfU3RyY3B5KHNlY0NvbXBvbmVudHNbMl0tPmNvbXBvbmVudE5hbWUsIFNFQ19PTVhfQ09NUE9ORU5UX0gyNjRfRFJNX0RFQyk7CisgICAgU0VDX09TQUxfU3RyY3B5KHNlY0NvbXBvbmVudHNbMl0tPnJvbGVzWzBdLCBTRUNfT01YX0NPTVBPTkVOVF9IMjY0X0RFQ19ST0xFKTsKKyAgICBzZWNDb21wb25lbnRzWzJdLT50b3RhbFJvbGVOdW0gPSBNQVhfQ09NUE9ORU5UX1JPTEVfTlVNOworCitFWElUOgorICAgIEZ1bmN0aW9uT3V0KCk7CisKKyAgICByZXR1cm4gTUFYX0NPTVBPTkVOVF9OVU07Cit9CisKZGlmZiAtLWdpdCBhL2V4eW5vczQvbXVsdGltZWRpYS9vcGVubWF4L3NlY19vbXgvY29tcG9uZW50L3ZpZGVvL2RlYy9oMjY0L2xpYnJhcnlfcmVnaXN0ZXIuaCBiL2V4eW5vczQvbXVsdGltZWRpYS9vcGVubWF4L3NlY19vbXgvY29tcG9uZW50L3ZpZGVvL2RlYy9oMjY0L2xpYnJhcnlfcmVnaXN0ZXIuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44YzAzY2JlCi0tLSAvZGV2L251bGwKKysrIGIvZXh5bm9zNC9tdWx0aW1lZGlhL29wZW5tYXgvc2VjX29teC9jb21wb25lbnQvdmlkZW8vZGVjL2gyNjQvbGlicmFyeV9yZWdpc3Rlci5oCkBAIC0wLDAgKzEsNTcgQEAKKy8qCisgKgorICogQ29weXJpZ2h0IDIwMTAgU2Ftc3VuZyBFbGVjdHJvbmljcyBTLkxTSSBDby4gTFRECisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKy8qCisgKiBAZmlsZSAgICAgICAgbGlicmFyeV9yZWdpc3Rlci5oCisgKiBAYnJpZWYKKyAqIEBhdXRob3IgICAgICBTZXVuZ0Jlb20gS2ltIChzYmNydXgua2ltQHNhbXN1bmcuY29tKQorICogQHZlcnNpb24gICAgIDEuMS4wCisgKiBAaGlzdG9yeQorICogICAyMDEwLjcuMTUgOiBDcmVhdGUKKyAqLworCisjaWZuZGVmIFNFQ19PTVhfSDI2NF9SRUcKKyNkZWZpbmUgU0VDX09NWF9IMjY0X1JFRworCisjaW5jbHVkZSAiU0VDX09NWF9EZWYuaCIKKyNpbmNsdWRlICJPTVhfQ29tcG9uZW50LmgiCisjaW5jbHVkZSAiU0VDX09NWF9Db21wb25lbnRfUmVnaXN0ZXIuaCIKKworCisjZGVmaW5lIE9TQ0xfRVhQT1JUX1JFRiBfX2F0dHJpYnV0ZV9fKCh2aXNpYmlsaXR5KCJkZWZhdWx0IikpKQorI2RlZmluZSBNQVhfQ09NUE9ORU5UX05VTSAgICAgICAzCisjZGVmaW5lIE1BWF9DT01QT05FTlRfUk9MRV9OVU0gIDEKKworLyogSC4yNjQgKi8KKyNkZWZpbmUgU0VDX09NWF9DT01QT05FTlRfSDI2NF9ERUMgIk9NWC5TRUMuQVZDLkRlY29kZXIiCisjZGVmaW5lIFNFQ19PTVhfQ09NUE9ORU5UX0gyNjRfRlBfREVDICJPTVguU0VDLkZQLkFWQy5EZWNvZGVyIgorI2RlZmluZSBTRUNfT01YX0NPTVBPTkVOVF9IMjY0X0RSTV9ERUMgIk9NWC5TRUMuQVZDLkRlY29kZXIuc2VjdXJlIgorI2RlZmluZSBTRUNfT01YX0NPTVBPTkVOVF9IMjY0X0RFQ19ST0xFICJ2aWRlb19kZWNvZGVyLmF2YyIKKworCisjaWZkZWYgX19jcGx1c3BsdXMKK2V4dGVybiAiQyIgeworI2VuZGlmCisKK09TQ0xfRVhQT1JUX1JFRiBpbnQgU0VDX09NWF9DT01QT05FTlRfTGlicmFyeV9SZWdpc3RlcihTRUNSZWdpc3RlckNvbXBvbmVudFR5cGUgKipzZWNDb21wb25lbnRzKTsKKworI2lmZGVmIF9fY3BsdXNwbHVzCit9OworI2VuZGlmCisKKyNlbmRpZgorCmRpZmYgLS1naXQgYS9leHlub3M0L211bHRpbWVkaWEvb3Blbm1heC9zZWNfb214L2NvbXBvbmVudC92aWRlby9kZWMvbXBlZzQvQW5kcm9pZC5tayBiL2V4eW5vczQvbXVsdGltZWRpYS9vcGVubWF4L3NlY19vbXgvY29tcG9uZW50L3ZpZGVvL2RlYy9tcGVnNC9BbmRyb2lkLm1rCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQzNTMxODAKLS0tIC9kZXYvbnVsbAorKysgYi9leHlub3M0L211bHRpbWVkaWEvb3Blbm1heC9zZWNfb214L2NvbXBvbmVudC92aWRlby9kZWMvbXBlZzQvQW5kcm9pZC5tawpAQCAtMCwwICsxLDY1IEBACitMT0NBTF9QQVRIIDo9ICQoY2FsbCBteS1kaXIpCitpbmNsdWRlICQoQ0xFQVJfVkFSUykKKworTE9DQUxfTU9EVUxFX1RBR1MgOj0gb3B0aW9uYWwKKworTE9DQUxfU1JDX0ZJTEVTIDo9IFwKKwlTRUNfT01YX01wZWc0ZGVjLmMgXAorCWxpYnJhcnlfcmVnaXN0ZXIuYworCitMT0NBTF9QUkVMSU5LX01PRFVMRSA6PSBmYWxzZQorTE9DQUxfTU9EVUxFIDo9IGxpYk9NWC5TRUMuTTRWLkRlY29kZXIKK0xPQ0FMX01PRFVMRV9QQVRIIDo9ICQoVEFSR0VUX09VVF9TSEFSRURfTElCUkFSSUVTKS9vbXgKKworTE9DQUxfQ0ZMQUdTIDo9CisKK2lmZXEgKCQoQk9BUkRfTk9OQkxPQ0tfTU9ERV9QUk9DRVNTKSwgdHJ1ZSkKK0xPQ0FMX0NGTEFHUyArPSAtRE5PTkJMT0NLX01PREVfUFJPQ0VTUworZW5kaWYKKworaWZlcSAoJChCT0FSRF9VU0VfQU5CKSwgdHJ1ZSkKK0xPQ0FMX0NGTEFHUyArPSAtRFVTRV9BTkIKK2lmZXEgKCQoQk9BUkRfVVNFX0NTQ19GSU1DKSwgdHJ1ZSkKK2lmZXEgKCQoQk9BUkRfVVNFX1Y0TDJfSU9OKSwgZmFsc2UpCitMT0NBTF9DRkxBR1MgKz0gLURVU0VfQ1NDX0ZJTUMKK2VuZGlmCitlbmRpZgorCitpZmVxICgkKEJPQVJEX1VTRV9DU0NfR1NDQUxFUiksIHRydWUpCitMT0NBTF9DRkxBR1MgKz0gLURVU0VfQ1NDX0dTQ0FMRVIKK2VuZGlmCitlbmRpZgorCitMT0NBTF9BUk1fTU9ERSA6PSBhcm0KKworTE9DQUxfU1RBVElDX0xJQlJBUklFUyA6PSBsaWJTRUNfT01YX1ZkZWMgbGlic2Vjb3NhbCBsaWJzZWNiYXNlY29tcG9uZW50IFwKKwlsaWJzd2NvbnZlcnRlciBsaWJzZWNtZmNhcGkKK0xPQ0FMX1NIQVJFRF9MSUJSQVJJRVMgOj0gbGliYyBsaWJkbCBsaWJjdXRpbHMgbGlidXRpbHMgbGlidWkgXAorCWxpYlNFQ19PTVhfUmVzb3VyY2VtYW5hZ2VyIGxpYmNzYworCitpZmVxICgkKGZpbHRlci1vdXQgZXh5bm9zNCwkKFRBUkdFVF9CT0FSRF9QTEFURk9STSkpLCkKK0xPQ0FMX1NIQVJFRF9MSUJSQVJJRVMgKz0gbGliZmltYyBsaWJod2NvbnZlcnRlcgorZW5kaWYKKworaWZlcSAoJChmaWx0ZXItb3V0IGV4eW5vczUsJChUQVJHRVRfQk9BUkRfUExBVEZPUk0pKSwpCitMT0NBTF9TSEFSRURfTElCUkFSSUVTICs9IGxpYmV4eW5vc2dzY2FsZXIKK2VuZGlmCisKKyNpZmVxICgkKEJPQVJEX1VTRV9WNEwyX0lPTiksdHJ1ZSkKKyNMT0NBTF9TSEFSRURfTElCUkFSSUVTICs9IGxpYmlvbgorI2VuZGlmCisKK2lmZXEgKCQoQk9BUkRfVVNFU19NRkNfRlBTKSx0cnVlKQorTE9DQUxfQ0ZMQUdTICs9IC1EQ09ORklHX01GQ19GUFMKK2VuZGlmCisKK0xPQ0FMX0NfSU5DTFVERVMgOj0gJChTRUNfT01YX0lOQykva2hyb25vcyBcCisJJChTRUNfT01YX0lOQykvc2VjIFwKKwkkKFNFQ19PTVhfVE9QKS9vc2FsIFwKKwkkKFNFQ19PTVhfVE9QKS9jb3JlIFwKKwkkKFNFQ19PTVhfQ09NUE9ORU5UKS9jb21tb24gXAorCSQoU0VDX09NWF9DT01QT05FTlQpL3ZpZGVvL2RlYyBcCisJJChUQVJHRVRfT1VUX0hFQURFUlMpLyQoU0VDX0NPUFlfSEVBREVSU19UTykgXAorCSQoQk9BUkRfSEFMX1BBVEgpL2luY2x1ZGUKKworaW5jbHVkZSAkKEJVSUxEX1NIQVJFRF9MSUJSQVJZKQpkaWZmIC0tZ2l0IGEvZXh5bm9zNC9tdWx0aW1lZGlhL29wZW5tYXgvc2VjX29teC9jb21wb25lbnQvdmlkZW8vZGVjL21wZWc0L1NFQ19PTVhfTXBlZzRkZWMuYyBiL2V4eW5vczQvbXVsdGltZWRpYS9vcGVubWF4L3NlY19vbXgvY29tcG9uZW50L3ZpZGVvL2RlYy9tcGVnNC9TRUNfT01YX01wZWc0ZGVjLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTgyMDUwMwotLS0gL2Rldi9udWxsCisrKyBiL2V4eW5vczQvbXVsdGltZWRpYS9vcGVubWF4L3NlY19vbXgvY29tcG9uZW50L3ZpZGVvL2RlYy9tcGVnNC9TRUNfT01YX01wZWc0ZGVjLmMKQEAgLTAsMCArMSwyMTAzIEBACisvKgorICoKKyAqIENvcHlyaWdodCAyMDEwIFNhbXN1bmcgRWxlY3Ryb25pY3MgUy5MU0kgQ28uIExURAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisvKgorICogQGZpbGUgICAgICBTRUNfT01YX01wZWc0ZGVjLmMKKyAqIEBicmllZgorICogQGF1dGhvciAgICBZdW5qaSBLaW0gKHl1bmppLmtpbUBzYW1zdW5nLmNvbSkKKyAqIEB2ZXJzaW9uICAgMS4xLjAKKyAqIEBoaXN0b3J5CisgKiAgIDIwMTAuNy4xNSA6IENyZWF0ZQorICovCisKKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgPHN0ZGxpYi5oPgorI2luY2x1ZGUgPHN0cmluZy5oPgorCisjaW5jbHVkZSAiU0VDX09NWF9NYWNyb3MuaCIKKyNpbmNsdWRlICJTRUNfT01YX0Jhc2Vjb21wb25lbnQuaCIKKyNpbmNsdWRlICJTRUNfT01YX0Jhc2Vwb3J0LmgiCisjaW5jbHVkZSAiU0VDX09NWF9WZGVjLmgiCisjaW5jbHVkZSAiU0VDX09TQUxfRVRDLmgiCisjaW5jbHVkZSAiU0VDX09TQUxfU2VtYXBob3JlLmgiCisjaW5jbHVkZSAiU0VDX09TQUxfVGhyZWFkLmgiCisjaW5jbHVkZSAibGlicmFyeV9yZWdpc3Rlci5oIgorI2luY2x1ZGUgIlNFQ19PTVhfTXBlZzRkZWMuaCIKKyNpbmNsdWRlICJTc2JTaXBNZmNBcGkuaCIKKworI2lmZGVmIFVTRV9BTkIKKyNpbmNsdWRlICJTRUNfT1NBTF9BbmRyb2lkLmgiCisjZW5kaWYKKworLyogVG8gdXNlIENTQ19NRVRIT0RfUFJFRkVSX0hXIG9yIENTQ19NRVRIT0RfSFcgaW4gU0VDIE9NWCwgZ3JhbGxvYyBzaG91bGQgYWxsb2NhdGUgcGh5c2ljYWwgbWVtb3J5IHVzaW5nIEZJTUMgKi8KKy8qIEl0IG1lYW5zIEdSQUxMT0NfVVNBR0VfSFdfRklNQzEgc2hvdWxkIGJlIHNldCBvbiBOYXRpdmUgV2luZG93IHVzYWdlICovCisjaW5jbHVkZSAiY3NjLmgiCisKKyN1bmRlZiAgU0VDX0xPR19UQUcKKyNkZWZpbmUgU0VDX0xPR19UQUcgICAgIlNFQ19NUEVHNF9ERUMiCisjZGVmaW5lIFNFQ19MT0dfT0ZGCisjaW5jbHVkZSAiU0VDX09TQUxfTG9nLmgiCisKKyNkZWZpbmUgTVBFRzRfREVDX05VTV9PRl9FWFRSQV9CVUZGRVJTIDcKKworLy8jZGVmaW5lIEZVTExfRlJBTUVfU0VBUkNICisKKy8qIE1QRUc0IERlY29kZXIgU3VwcG9ydGVkIExldmVscyAmIHByb2ZpbGVzICovCitTRUNfT01YX1ZJREVPX1BST0ZJTEVMRVZFTCBzdXBwb3J0ZWRNUEVHNFByb2ZpbGVMZXZlbHNbXSA9eworICAgIHtPTVhfVklERU9fTVBFRzRQcm9maWxlU2ltcGxlLCBPTVhfVklERU9fTVBFRzRMZXZlbDB9LAorICAgIHtPTVhfVklERU9fTVBFRzRQcm9maWxlU2ltcGxlLCBPTVhfVklERU9fTVBFRzRMZXZlbDBifSwKKyAgICB7T01YX1ZJREVPX01QRUc0UHJvZmlsZVNpbXBsZSwgT01YX1ZJREVPX01QRUc0TGV2ZWwxfSwKKyAgICB7T01YX1ZJREVPX01QRUc0UHJvZmlsZVNpbXBsZSwgT01YX1ZJREVPX01QRUc0TGV2ZWwyfSwKKyAgICB7T01YX1ZJREVPX01QRUc0UHJvZmlsZVNpbXBsZSwgT01YX1ZJREVPX01QRUc0TGV2ZWwzfSwKKyAgICB7T01YX1ZJREVPX01QRUc0UHJvZmlsZVNpbXBsZSwgT01YX1ZJREVPX01QRUc0TGV2ZWw0fSwKKyAgICB7T01YX1ZJREVPX01QRUc0UHJvZmlsZVNpbXBsZSwgT01YX1ZJREVPX01QRUc0TGV2ZWw0YX0sCisgICAge09NWF9WSURFT19NUEVHNFByb2ZpbGVTaW1wbGUsIE9NWF9WSURFT19NUEVHNExldmVsNX0sCisgICAge09NWF9WSURFT19NUEVHNFByb2ZpbGVBZHZhbmNlZFNpbXBsZSwgT01YX1ZJREVPX01QRUc0TGV2ZWwwfSwKKyAgICB7T01YX1ZJREVPX01QRUc0UHJvZmlsZUFkdmFuY2VkU2ltcGxlLCBPTVhfVklERU9fTVBFRzRMZXZlbDBifSwKKyAgICB7T01YX1ZJREVPX01QRUc0UHJvZmlsZUFkdmFuY2VkU2ltcGxlLCBPTVhfVklERU9fTVBFRzRMZXZlbDF9LAorICAgIHtPTVhfVklERU9fTVBFRzRQcm9maWxlQWR2YW5jZWRTaW1wbGUsIE9NWF9WSURFT19NUEVHNExldmVsMn0sCisgICAge09NWF9WSURFT19NUEVHNFByb2ZpbGVBZHZhbmNlZFNpbXBsZSwgT01YX1ZJREVPX01QRUc0TGV2ZWwzfSwKKyAgICB7T01YX1ZJREVPX01QRUc0UHJvZmlsZUFkdmFuY2VkU2ltcGxlLCBPTVhfVklERU9fTVBFRzRMZXZlbDR9LAorICAgIHtPTVhfVklERU9fTVBFRzRQcm9maWxlQWR2YW5jZWRTaW1wbGUsIE9NWF9WSURFT19NUEVHNExldmVsNGF9LAorICAgIHtPTVhfVklERU9fTVBFRzRQcm9maWxlQWR2YW5jZWRTaW1wbGUsIE9NWF9WSURFT19NUEVHNExldmVsNX19OworCisvKiBILjI2MyBEZWNvZGVyIFN1cHBvcnRlZCBMZXZlbHMgJiBwcm9maWxlcyAqLworU0VDX09NWF9WSURFT19QUk9GSUxFTEVWRUwgc3VwcG9ydGVkSDI2M1Byb2ZpbGVMZXZlbHNbXSA9IHsKKyAgICAvKiBCYXNlbGluZSAoUHJvZmlsZSAwKSAqLworICAgIHtPTVhfVklERU9fSDI2M1Byb2ZpbGVCYXNlbGluZSwgT01YX1ZJREVPX0gyNjNMZXZlbDEwfSwKKyAgICB7T01YX1ZJREVPX0gyNjNQcm9maWxlQmFzZWxpbmUsIE9NWF9WSURFT19IMjYzTGV2ZWwyMH0sCisgICAge09NWF9WSURFT19IMjYzUHJvZmlsZUJhc2VsaW5lLCBPTVhfVklERU9fSDI2M0xldmVsMzB9LAorICAgIHtPTVhfVklERU9fSDI2M1Byb2ZpbGVCYXNlbGluZSwgT01YX1ZJREVPX0gyNjNMZXZlbDQwfSwKKyAgICB7T01YX1ZJREVPX0gyNjNQcm9maWxlQmFzZWxpbmUsIE9NWF9WSURFT19IMjYzTGV2ZWw0NX0sCisgICAge09NWF9WSURFT19IMjYzUHJvZmlsZUJhc2VsaW5lLCBPTVhfVklERU9fSDI2M0xldmVsNTB9LAorICAgIHtPTVhfVklERU9fSDI2M1Byb2ZpbGVCYXNlbGluZSwgT01YX1ZJREVPX0gyNjNMZXZlbDYwfSwKKyAgICB7T01YX1ZJREVPX0gyNjNQcm9maWxlQmFzZWxpbmUsIE9NWF9WSURFT19IMjYzTGV2ZWw3MH0sCisgICAgLyogUHJvZmlsZSAxICovCisgICAge09NWF9WSURFT19IMjYzUHJvZmlsZUgzMjBDb2RpbmcsIE9NWF9WSURFT19IMjYzTGV2ZWwxMH0sCisgICAge09NWF9WSURFT19IMjYzUHJvZmlsZUgzMjBDb2RpbmcsIE9NWF9WSURFT19IMjYzTGV2ZWwyMH0sCisgICAge09NWF9WSURFT19IMjYzUHJvZmlsZUgzMjBDb2RpbmcsIE9NWF9WSURFT19IMjYzTGV2ZWwzMH0sCisgICAge09NWF9WSURFT19IMjYzUHJvZmlsZUgzMjBDb2RpbmcsIE9NWF9WSURFT19IMjYzTGV2ZWw0MH0sCisgICAge09NWF9WSURFT19IMjYzUHJvZmlsZUgzMjBDb2RpbmcsIE9NWF9WSURFT19IMjYzTGV2ZWw0NX0sCisgICAge09NWF9WSURFT19IMjYzUHJvZmlsZUgzMjBDb2RpbmcsIE9NWF9WSURFT19IMjYzTGV2ZWw1MH0sCisgICAge09NWF9WSURFT19IMjYzUHJvZmlsZUgzMjBDb2RpbmcsIE9NWF9WSURFT19IMjYzTGV2ZWw2MH0sCisgICAge09NWF9WSURFT19IMjYzUHJvZmlsZUgzMjBDb2RpbmcsIE9NWF9WSURFT19IMjYzTGV2ZWw3MH0sCisgICAgLyogUHJvZmlsZSAyICovCisgICAge09NWF9WSURFT19IMjYzUHJvZmlsZUJhY2t3YXJkQ29tcGF0aWJsZSwgT01YX1ZJREVPX0gyNjNMZXZlbDEwfSwKKyAgICB7T01YX1ZJREVPX0gyNjNQcm9maWxlQmFja3dhcmRDb21wYXRpYmxlLCBPTVhfVklERU9fSDI2M0xldmVsMjB9LAorICAgIHtPTVhfVklERU9fSDI2M1Byb2ZpbGVCYWNrd2FyZENvbXBhdGlibGUsIE9NWF9WSURFT19IMjYzTGV2ZWwzMH0sCisgICAge09NWF9WSURFT19IMjYzUHJvZmlsZUJhY2t3YXJkQ29tcGF0aWJsZSwgT01YX1ZJREVPX0gyNjNMZXZlbDQwfSwKKyAgICB7T01YX1ZJREVPX0gyNjNQcm9maWxlQmFja3dhcmRDb21wYXRpYmxlLCBPTVhfVklERU9fSDI2M0xldmVsNDV9LAorICAgIHtPTVhfVklERU9fSDI2M1Byb2ZpbGVCYWNrd2FyZENvbXBhdGlibGUsIE9NWF9WSURFT19IMjYzTGV2ZWw1MH0sCisgICAge09NWF9WSURFT19IMjYzUHJvZmlsZUJhY2t3YXJkQ29tcGF0aWJsZSwgT01YX1ZJREVPX0gyNjNMZXZlbDYwfSwKKyAgICB7T01YX1ZJREVPX0gyNjNQcm9maWxlQmFja3dhcmRDb21wYXRpYmxlLCBPTVhfVklERU9fSDI2M0xldmVsNzB9LAorICAgIC8qIFByb2ZpbGUgMywgcmVzdHJpY3RlZCB1cCB0byBTRCByZXNvbHV0aW9uICovCisgICAge09NWF9WSURFT19IMjYzUHJvZmlsZUlTV1YyLCBPTVhfVklERU9fSDI2M0xldmVsMTB9LAorICAgIHtPTVhfVklERU9fSDI2M1Byb2ZpbGVJU1dWMiwgT01YX1ZJREVPX0gyNjNMZXZlbDIwfSwKKyAgICB7T01YX1ZJREVPX0gyNjNQcm9maWxlSVNXVjIsIE9NWF9WSURFT19IMjYzTGV2ZWwzMH0sCisgICAge09NWF9WSURFT19IMjYzUHJvZmlsZUlTV1YyLCBPTVhfVklERU9fSDI2M0xldmVsNDB9LAorICAgIHtPTVhfVklERU9fSDI2M1Byb2ZpbGVJU1dWMiwgT01YX1ZJREVPX0gyNjNMZXZlbDQ1fSwKKyAgICB7T01YX1ZJREVPX0gyNjNQcm9maWxlSVNXVjIsIE9NWF9WSURFT19IMjYzTGV2ZWw1MH0sCisgICAge09NWF9WSURFT19IMjYzUHJvZmlsZUlTV1YyLCBPTVhfVklERU9fSDI2M0xldmVsNjB9LAorICAgIHtPTVhfVklERU9fSDI2M1Byb2ZpbGVJU1dWMiwgT01YX1ZJREVPX0gyNjNMZXZlbDcwfX07CisKK3N0YXRpYyBPTVhfSEFORExFVFlQRSBnaE1GQ0hhbmRsZSA9IE5VTEw7CitzdGF0aWMgT01YX0JPT0wgZ2JGSU1WMSA9IE9NWF9GQUxTRTsKKworc3RhdGljIGludCBDaGVja19NcGVnNF9GcmFtZShPTVhfVTggKnBJbnB1dFN0cmVhbSwgT01YX1UzMiBidWZmU2l6ZSwgT01YX1UzMiBmbGFnLCBPTVhfQk9PTCBiUHJldmlvdXNGcmFtZUVPRiwgT01YX0JPT0wgKnBiRW5kT2ZGcmFtZSkKK3sKKyAgICBPTVhfVTMyIGxlbjsKKyAgICBpbnQgcmVhZFN0cmVhbTsKKyAgICB1bnNpZ25lZCBzdGFydENvZGU7CisgICAgT01YX0JPT0wgYkZyYW1lU3RhcnQ7CisKKyAgICBsZW4gPSAwOworICAgIGJGcmFtZVN0YXJ0ID0gT01YX0ZBTFNFOworCisgICAgaWYgKGZsYWcgJiBPTVhfQlVGRkVSRkxBR19DT0RFQ0NPTkZJRykgeworICAgICAgICBpZiAoKnBJbnB1dFN0cmVhbSA9PSAweDAzKSB7IC8qIEZJTVYxICovCisgICAgICAgICAgICBpZiAoZ2hNRkNIYW5kbGUgIT0gTlVMTCkgeworICAgICAgICAgICAgICAgIEJpdG1hcEluZm9IaHIgKnBJbmZvSGVhZGVyOworICAgICAgICAgICAgICAgIFNTQlNJUF9NRkNfSU1HX1JFU09MVVRJT04gaW1nUmVzb2x1dGlvbjsKKworICAgICAgICAgICAgICAgIHBJbmZvSGVhZGVyID0gKEJpdG1hcEluZm9IaHIgKikocElucHV0U3RyZWFtICsgMSk7CisgICAgICAgICAgICAgICAgaW1nUmVzb2x1dGlvbi53aWR0aCA9IHBJbmZvSGVhZGVyLT5CaVdpZHRoOworICAgICAgICAgICAgICAgIGltZ1Jlc29sdXRpb24uaGVpZ2h0ID0gcEluZm9IZWFkZXItPkJpSGVpZ2h0OworICAgICAgICAgICAgICAgIFNzYlNpcE1mY0RlY1NldENvbmZpZyhnaE1GQ0hhbmRsZSwgTUZDX0RFQ19TRVRDT05GX0ZJTVYxX1dJRFRIX0hFSUdIVCwgJmltZ1Jlc29sdXRpb24pOworCisgICAgICAgICAgICAgICAgU0VDX09TQUxfTG9nKFNFQ19MT0dfVFJBQ0UsICJ3aWR0aCglZCksIGhlaWdodCglZCkiLCBpbWdSZXNvbHV0aW9uLndpZHRoLCBpbWdSZXNvbHV0aW9uLmhlaWdodCk7CisgICAgICAgICAgICAgICAgZ2JGSU1WMSA9IE9NWF9UUlVFOworICAgICAgICAgICAgICAgICpwYkVuZE9mRnJhbWUgPSBPTVhfVFJVRTsKKyAgICAgICAgICAgICAgICByZXR1cm4gYnVmZlNpemU7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoZ2JGSU1WMSkgeworICAgICAgICAqcGJFbmRPZkZyYW1lID0gT01YX1RSVUU7CisgICAgICAgIHJldHVybiBidWZmU2l6ZTsKKyAgICB9CisKKyAgICBpZiAoYlByZXZpb3VzRnJhbWVFT0YgPT0gT01YX0ZBTFNFKQorICAgICAgICBiRnJhbWVTdGFydCA9IE9NWF9UUlVFOworCisgICAgc3RhcnRDb2RlID0gMHhGRkZGRkZGRjsKKyAgICBpZiAoYkZyYW1lU3RhcnQgPT0gT01YX0ZBTFNFKSB7CisgICAgICAgIC8qIGZpbmQgVk9QIHN0YXJ0IGNvZGUgKi8KKyAgICAgICAgd2hpbGUoc3RhcnRDb2RlICE9IDB4MUI2KSB7CisgICAgICAgICAgICByZWFkU3RyZWFtID0gKihwSW5wdXRTdHJlYW0gKyBsZW4pOworICAgICAgICAgICAgc3RhcnRDb2RlID0gKHN0YXJ0Q29kZSA8PCA4KSB8IHJlYWRTdHJlYW07CisgICAgICAgICAgICBsZW4rKzsKKyAgICAgICAgICAgIGlmIChsZW4gPiBidWZmU2l6ZSkKKyAgICAgICAgICAgICAgICBnb3RvIEVYSVQ7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKiBmaW5kIG5leHQgVk9QIHN0YXJ0IGNvZGUgKi8KKyAgICBzdGFydENvZGUgPSAweEZGRkZGRkZGOworICAgIHdoaWxlICgoc3RhcnRDb2RlICE9IDB4MUI2KSkgeworICAgICAgICByZWFkU3RyZWFtID0gKihwSW5wdXRTdHJlYW0gKyBsZW4pOworICAgICAgICBzdGFydENvZGUgPSAoc3RhcnRDb2RlIDw8IDgpIHwgcmVhZFN0cmVhbTsKKyAgICAgICAgbGVuKys7CisgICAgICAgIGlmIChsZW4gPiBidWZmU2l6ZSkKKyAgICAgICAgICAgIGdvdG8gRVhJVDsKKyAgICB9CisKKyAgICAqcGJFbmRPZkZyYW1lID0gT01YX1RSVUU7CisKKyAgICBTRUNfT1NBTF9Mb2coU0VDX0xPR19UUkFDRSwgIjEuIENoZWNrX01wZWc0X0ZyYW1lIHJldHVybmVkIEVPRiA9ICVkLCBsZW4gPSAlZCwgYnVmZlNpemUgPSAlZCIsICpwYkVuZE9mRnJhbWUsIGxlbiAtIDQsIGJ1ZmZTaXplKTsKKworICAgIHJldHVybiBsZW4gLSA0OworCitFWElUIDoKKyAgICAqcGJFbmRPZkZyYW1lID0gT01YX0ZBTFNFOworCisgICAgU0VDX09TQUxfTG9nKFNFQ19MT0dfVFJBQ0UsICIyLiBDaGVja19NcGVnNF9GcmFtZSByZXR1cm5lZCBFT0YgPSAlZCwgbGVuID0gJWQsIGJ1ZmZTaXplID0gJWQiLCAqcGJFbmRPZkZyYW1lLCBsZW4gLSAxLCBidWZmU2l6ZSk7CisKKyAgICByZXR1cm4gLS1sZW47Cit9CisKK3N0YXRpYyBpbnQgQ2hlY2tfSDI2M19GcmFtZShPTVhfVTggKnBJbnB1dFN0cmVhbSwgT01YX1UzMiBidWZmU2l6ZSwgT01YX1UzMiBmbGFnLCBPTVhfQk9PTCBiUHJldmlvdXNGcmFtZUVPRiwgT01YX0JPT0wgKnBiRW5kT2ZGcmFtZSkKK3sKKyAgICBPTVhfVTMyIGxlbjsKKyAgICBpbnQgcmVhZFN0cmVhbTsKKyAgICB1bnNpZ25lZCBzdGFydENvZGU7CisgICAgT01YX0JPT0wgYkZyYW1lU3RhcnQgPSAwOworICAgIHVuc2lnbmVkIHBUeXBlTWFzayA9IDB4MDM7CisgICAgdW5zaWduZWQgcFR5cGUgPSAwOworCisgICAgbGVuID0gMDsKKyAgICBiRnJhbWVTdGFydCA9IE9NWF9GQUxTRTsKKworICAgIGlmIChiUHJldmlvdXNGcmFtZUVPRiA9PSBPTVhfRkFMU0UpCisgICAgICAgIGJGcmFtZVN0YXJ0ID0gT01YX1RSVUU7CisKKyAgICBzdGFydENvZGUgPSAweEZGRkZGRkZGOworICAgIGlmIChiRnJhbWVTdGFydCA9PSBPTVhfRkFMU0UpIHsKKyAgICAgICAgLyogZmluZCBQU0MoUGljdHVyZSBTdGFydCBDb2RlKSA6IDAwMDAgMDAwMCAwMDAwIDAwMDAgMTAwMCAwMCAqLworICAgICAgICB3aGlsZSAoKChzdGFydENvZGUgPDwgOCA+PiAxMCkgIT0gMHgyMCkgfHwgKHBUeXBlICE9IDB4MDIpKSB7CisgICAgICAgICAgICByZWFkU3RyZWFtID0gKihwSW5wdXRTdHJlYW0gKyBsZW4pOworICAgICAgICAgICAgc3RhcnRDb2RlID0gKHN0YXJ0Q29kZSA8PCA4KSB8IHJlYWRTdHJlYW07CisKKyAgICAgICAgICAgIHJlYWRTdHJlYW0gPSAqKHBJbnB1dFN0cmVhbSArIGxlbiArIDEpOworICAgICAgICAgICAgcFR5cGUgPSByZWFkU3RyZWFtICYgcFR5cGVNYXNrOworCisgICAgICAgICAgICBsZW4rKzsKKyAgICAgICAgICAgIGlmIChsZW4gPiBidWZmU2l6ZSkKKyAgICAgICAgICAgICAgICBnb3RvIEVYSVQ7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKiBmaW5kIG5leHQgUFNDICovCisgICAgc3RhcnRDb2RlID0gMHhGRkZGRkZGRjsKKyAgICBwVHlwZSA9IDA7CisgICAgd2hpbGUgKCgoc3RhcnRDb2RlIDw8IDggPj4gMTApICE9IDB4MjApIHx8IChwVHlwZSAhPSAweDAyKSkgeworICAgICAgICByZWFkU3RyZWFtID0gKihwSW5wdXRTdHJlYW0gKyBsZW4pOworICAgICAgICBzdGFydENvZGUgPSAoc3RhcnRDb2RlIDw8IDgpIHwgcmVhZFN0cmVhbTsKKworICAgICAgICByZWFkU3RyZWFtID0gKihwSW5wdXRTdHJlYW0gKyBsZW4gKyAxKTsKKyAgICAgICAgcFR5cGUgPSByZWFkU3RyZWFtICYgcFR5cGVNYXNrOworCisgICAgICAgIGxlbisrOworICAgICAgICBpZiAobGVuID4gYnVmZlNpemUpCisgICAgICAgICAgICBnb3RvIEVYSVQ7CisgICAgfQorCisgICAgKnBiRW5kT2ZGcmFtZSA9IE9NWF9UUlVFOworCisgICAgU0VDX09TQUxfTG9nKFNFQ19MT0dfVFJBQ0UsICIxLiBDaGVja19IMjYzX0ZyYW1lIHJldHVybmVkIEVPRiA9ICVkLCBsZW4gPSAlZCwgaUJ1ZmZTaXplID0gJWQiLCAqcGJFbmRPZkZyYW1lLCBsZW4gLSAzLCBidWZmU2l6ZSk7CisKKyAgICByZXR1cm4gbGVuIC0gMzsKKworRVhJVCA6CisKKyAgICAqcGJFbmRPZkZyYW1lID0gT01YX0ZBTFNFOworCisgICAgU0VDX09TQUxfTG9nKFNFQ19MT0dfVFJBQ0UsICIyLiBDaGVja19IMjYzX0ZyYW1lIHJldHVybmVkIEVPRiA9ICVkLCBsZW4gPSAlZCwgaUJ1ZmZTaXplID0gJWQiLCAqcGJFbmRPZkZyYW1lLCBsZW4gLSAxLCBidWZmU2l6ZSk7CisKKyAgICByZXR1cm4gLS1sZW47Cit9CisKK09NWF9CT09MIENoZWNrX1N0cmVhbV9QcmVmaXhDb2RlKE9NWF9VOCAqcElucHV0U3RyZWFtLCBPTVhfVTMyIHN0cmVhbVNpemUsIENPREVDX1RZUEUgY29kZWNUeXBlKQoreworICAgIHN3aXRjaCAoY29kZWNUeXBlKSB7CisgICAgY2FzZSBDT0RFQ19UWVBFX01QRUc0OgorICAgICAgICBpZiAoZ2JGSU1WMSkgeworICAgICAgICAgICAgcmV0dXJuIE9NWF9UUlVFOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgaWYgKHN0cmVhbVNpemUgPCAzKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIE9NWF9GQUxTRTsKKyAgICAgICAgICAgIH0gZWxzZSBpZiAoKHBJbnB1dFN0cmVhbVswXSA9PSAweDAwKSAmJgorICAgICAgICAgICAgICAgICAgICAgICAocElucHV0U3RyZWFtWzFdID09IDB4MDApICYmCisgICAgICAgICAgICAgICAgICAgICAgIChwSW5wdXRTdHJlYW1bMl0gPT0gMHgwMSkpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gT01YX1RSVUU7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIHJldHVybiBPTVhfRkFMU0U7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBDT0RFQ19UWVBFX0gyNjM6CisgICAgICAgIGlmIChzdHJlYW1TaXplID4gMCkKKyAgICAgICAgICAgIHJldHVybiBPTVhfVFJVRTsKKyAgICAgICAgZWxzZQorICAgICAgICAgICAgcmV0dXJuIE9NWF9GQUxTRTsKKyAgICBkZWZhdWx0OgorICAgICAgICBTRUNfT1NBTF9Mb2coU0VDX0xPR19XQVJOSU5HLCAiJXM6IHVuZGVmaW5lZCBjb2RlYyB0eXBlICglZCkiLCBfX0ZVTkNUSU9OX18sIGNvZGVjVHlwZSk7CisgICAgICAgIHJldHVybiBPTVhfRkFMU0U7CisgICAgfQorfQorCitPTVhfRVJST1JUWVBFIFNFQ19NRkNfTXBlZzREZWNfR2V0UGFyYW1ldGVyKAorICAgIE9NWF9JTiAgICBPTVhfSEFORExFVFlQRSBoQ29tcG9uZW50LAorICAgIE9NWF9JTiAgICBPTVhfSU5ERVhUWVBFICBuUGFyYW1JbmRleCwKKyAgICBPTVhfSU5PVVQgT01YX1BUUiAgICAgICAgcENvbXBvbmVudFBhcmFtZXRlclN0cnVjdHVyZSkKK3sKKyAgICBPTVhfRVJST1JUWVBFICAgICAgICAgIHJldCA9IE9NWF9FcnJvck5vbmU7CisgICAgT01YX0NPTVBPTkVOVFRZUEUgICAgICpwT01YQ29tcG9uZW50ID0gTlVMTDsKKyAgICBTRUNfT01YX0JBU0VDT01QT05FTlQgKnBTRUNDb21wb25lbnQgPSBOVUxMOworCisgICAgRnVuY3Rpb25JbigpOworCisgICAgaWYgKGhDb21wb25lbnQgPT0gTlVMTCB8fCBwQ29tcG9uZW50UGFyYW1ldGVyU3RydWN0dXJlID09IE5VTEwpIHsKKyAgICAgICAgcmV0ID0gT01YX0Vycm9yQmFkUGFyYW1ldGVyOworICAgICAgICBnb3RvIEVYSVQ7CisgICAgfQorICAgIHBPTVhDb21wb25lbnQgPSAoT01YX0NPTVBPTkVOVFRZUEUgKiloQ29tcG9uZW50OworICAgIHJldCA9IFNFQ19PTVhfQ2hlY2tfU2l6ZVZlcnNpb24ocE9NWENvbXBvbmVudCwgc2l6ZW9mKE9NWF9DT01QT05FTlRUWVBFKSk7CisgICAgaWYgKHJldCAhPSBPTVhfRXJyb3JOb25lKSB7CisgICAgICAgIGdvdG8gRVhJVDsKKyAgICB9CisgICAgaWYgKHBPTVhDb21wb25lbnQtPnBDb21wb25lbnRQcml2YXRlID09IE5VTEwpIHsKKyAgICAgICAgcmV0ID0gT01YX0Vycm9yQmFkUGFyYW1ldGVyOworICAgICAgICBnb3RvIEVYSVQ7CisgICAgfQorCisgICAgcFNFQ0NvbXBvbmVudCA9IChTRUNfT01YX0JBU0VDT01QT05FTlQgKilwT01YQ29tcG9uZW50LT5wQ29tcG9uZW50UHJpdmF0ZTsKKyAgICBpZiAocFNFQ0NvbXBvbmVudC0+Y3VycmVudFN0YXRlID09IE9NWF9TdGF0ZUludmFsaWQgKSB7CisgICAgICAgIHJldCA9IE9NWF9FcnJvckludmFsaWRTdGF0ZTsKKyAgICAgICAgZ290byBFWElUOworICAgIH0KKworICAgIHN3aXRjaCAoblBhcmFtSW5kZXgpIHsKKyAgICBjYXNlIE9NWF9JbmRleFBhcmFtVmlkZW9NcGVnNDoKKyAgICB7CisgICAgICAgIE9NWF9WSURFT19QQVJBTV9NUEVHNFRZUEUgKnBEc3RNcGVnNFBhcmFtID0gKE9NWF9WSURFT19QQVJBTV9NUEVHNFRZUEUgKilwQ29tcG9uZW50UGFyYW1ldGVyU3RydWN0dXJlOworICAgICAgICBPTVhfVklERU9fUEFSQU1fTVBFRzRUWVBFICpwU3JjTXBlZzRQYXJhbSA9IE5VTEw7CisgICAgICAgIFNFQ19NUEVHNF9IQU5ETEUgICAgICAgICAgKnBNcGVnNERlYyA9IE5VTEw7CisgICAgICAgIHJldCA9IFNFQ19PTVhfQ2hlY2tfU2l6ZVZlcnNpb24ocERzdE1wZWc0UGFyYW0sIHNpemVvZihPTVhfVklERU9fUEFSQU1fTVBFRzRUWVBFKSk7CisgICAgICAgIGlmIChyZXQgIT0gT01YX0Vycm9yTm9uZSkgeworICAgICAgICAgICAgZ290byBFWElUOworICAgICAgICB9CisKKyAgICAgICAgaWYgKHBEc3RNcGVnNFBhcmFtLT5uUG9ydEluZGV4ID49IEFMTF9QT1JUX05VTSkgeworICAgICAgICAgICAgcmV0ID0gT01YX0Vycm9yQmFkUG9ydEluZGV4OworICAgICAgICAgICAgZ290byBFWElUOworICAgICAgICB9CisKKyAgICAgICAgcE1wZWc0RGVjID0gKFNFQ19NUEVHNF9IQU5ETEUgKikoKFNFQ19PTVhfVklERU9ERUNfQ09NUE9ORU5UICopcFNFQ0NvbXBvbmVudC0+aENvbXBvbmVudEhhbmRsZSktPmhDb2RlY0hhbmRsZTsKKyAgICAgICAgcFNyY01wZWc0UGFyYW0gPSAmcE1wZWc0RGVjLT5tcGVnNENvbXBvbmVudFtwRHN0TXBlZzRQYXJhbS0+blBvcnRJbmRleF07CisKKyAgICAgICAgU0VDX09TQUxfTWVtY3B5KHBEc3RNcGVnNFBhcmFtLCBwU3JjTXBlZzRQYXJhbSwgc2l6ZW9mKE9NWF9WSURFT19QQVJBTV9NUEVHNFRZUEUpKTsKKyAgICB9CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgT01YX0luZGV4UGFyYW1WaWRlb0gyNjM6CisgICAgeworICAgICAgICBPTVhfVklERU9fUEFSQU1fSDI2M1RZUEUgICpwRHN0SDI2M1BhcmFtID0gKE9NWF9WSURFT19QQVJBTV9IMjYzVFlQRSAqKXBDb21wb25lbnRQYXJhbWV0ZXJTdHJ1Y3R1cmU7CisgICAgICAgIE9NWF9WSURFT19QQVJBTV9IMjYzVFlQRSAgKnBTcmNIMjYzUGFyYW0gPSBOVUxMOworICAgICAgICBTRUNfTVBFRzRfSEFORExFICAgICAgICAgICpwTXBlZzREZWMgPSBOVUxMOworICAgICAgICByZXQgPSBTRUNfT01YX0NoZWNrX1NpemVWZXJzaW9uKHBEc3RIMjYzUGFyYW0sIHNpemVvZihPTVhfVklERU9fUEFSQU1fSDI2M1RZUEUpKTsKKyAgICAgICAgaWYgKHJldCAhPSBPTVhfRXJyb3JOb25lKSB7CisgICAgICAgICAgICBnb3RvIEVYSVQ7CisgICAgICAgIH0KKworICAgICAgICBpZiAocERzdEgyNjNQYXJhbS0+blBvcnRJbmRleCA+PSBBTExfUE9SVF9OVU0pIHsKKyAgICAgICAgICAgIHJldCA9IE9NWF9FcnJvckJhZFBvcnRJbmRleDsKKyAgICAgICAgICAgIGdvdG8gRVhJVDsKKyAgICAgICAgfQorCisgICAgICAgIHBNcGVnNERlYyA9IChTRUNfTVBFRzRfSEFORExFICopKChTRUNfT01YX1ZJREVPREVDX0NPTVBPTkVOVCAqKXBTRUNDb21wb25lbnQtPmhDb21wb25lbnRIYW5kbGUpLT5oQ29kZWNIYW5kbGU7CisgICAgICAgIHBTcmNIMjYzUGFyYW0gPSAmcE1wZWc0RGVjLT5oMjYzQ29tcG9uZW50W3BEc3RIMjYzUGFyYW0tPm5Qb3J0SW5kZXhdOworCisgICAgICAgIFNFQ19PU0FMX01lbWNweShwRHN0SDI2M1BhcmFtLCBwU3JjSDI2M1BhcmFtLCBzaXplb2YoT01YX1ZJREVPX1BBUkFNX0gyNjNUWVBFKSk7CisgICAgfQorICAgICAgICBicmVhazsKKyAgICBjYXNlIE9NWF9JbmRleFBhcmFtU3RhbmRhcmRDb21wb25lbnRSb2xlOgorICAgIHsKKyAgICAgICAgT01YX1MzMiBjb2RlY1R5cGU7CisgICAgICAgIE9NWF9QQVJBTV9DT01QT05FTlRST0xFVFlQRSAqcENvbXBvbmVudFJvbGUgPSAoT01YX1BBUkFNX0NPTVBPTkVOVFJPTEVUWVBFICopcENvbXBvbmVudFBhcmFtZXRlclN0cnVjdHVyZTsKKworICAgICAgICByZXQgPSBTRUNfT01YX0NoZWNrX1NpemVWZXJzaW9uKHBDb21wb25lbnRSb2xlLCBzaXplb2YoT01YX1BBUkFNX0NPTVBPTkVOVFJPTEVUWVBFKSk7CisgICAgICAgIGlmIChyZXQgIT0gT01YX0Vycm9yTm9uZSkgeworICAgICAgICAgICAgZ290byBFWElUOworICAgICAgICB9CisKKyAgICAgICAgY29kZWNUeXBlID0gKChTRUNfTVBFRzRfSEFORExFICopKCgoU0VDX09NWF9WSURFT0RFQ19DT01QT05FTlQgKilwU0VDQ29tcG9uZW50LT5oQ29tcG9uZW50SGFuZGxlKS0+aENvZGVjSGFuZGxlKSktPmhNRkNNcGVnNEhhbmRsZS5jb2RlY1R5cGU7CisgICAgICAgIGlmIChjb2RlY1R5cGUgPT0gQ09ERUNfVFlQRV9NUEVHNCkKKyAgICAgICAgICAgIFNFQ19PU0FMX1N0cmNweSgoY2hhciAqKXBDb21wb25lbnRSb2xlLT5jUm9sZSwgU0VDX09NWF9DT01QT05FTlRfTVBFRzRfREVDX1JPTEUpOworICAgICAgICBlbHNlCisgICAgICAgICAgICBTRUNfT1NBTF9TdHJjcHkoKGNoYXIgKilwQ29tcG9uZW50Um9sZS0+Y1JvbGUsIFNFQ19PTVhfQ09NUE9ORU5UX0gyNjNfREVDX1JPTEUpOworICAgIH0KKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBPTVhfSW5kZXhQYXJhbVZpZGVvUHJvZmlsZUxldmVsUXVlcnlTdXBwb3J0ZWQ6CisgICAgeworICAgICAgICBPTVhfVklERU9fUEFSQU1fUFJPRklMRUxFVkVMVFlQRSAqcERzdFByb2ZpbGVMZXZlbCA9IChPTVhfVklERU9fUEFSQU1fUFJPRklMRUxFVkVMVFlQRSAqKXBDb21wb25lbnRQYXJhbWV0ZXJTdHJ1Y3R1cmU7CisgICAgICAgIFNFQ19PTVhfVklERU9fUFJPRklMRUxFVkVMICAgICAgICpwUHJvZmlsZUxldmVsID0gTlVMTDsKKyAgICAgICAgT01YX1UzMiAgICAgICAgICAgICAgICAgICAgICAgICAgIG1heFByb2ZpbGVMZXZlbE51bSA9IDA7CisgICAgICAgIE9NWF9TMzIgICAgICAgICAgICAgICAgICAgICAgICAgICBjb2RlY1R5cGU7CisKKyAgICAgICAgcmV0ID0gU0VDX09NWF9DaGVja19TaXplVmVyc2lvbihwRHN0UHJvZmlsZUxldmVsLCBzaXplb2YoT01YX1ZJREVPX1BBUkFNX1BST0ZJTEVMRVZFTFRZUEUpKTsKKyAgICAgICAgaWYgKHJldCAhPSBPTVhfRXJyb3JOb25lKSB7CisgICAgICAgICAgICBnb3RvIEVYSVQ7CisgICAgICAgIH0KKworICAgICAgICBpZiAocERzdFByb2ZpbGVMZXZlbC0+blBvcnRJbmRleCA+PSBBTExfUE9SVF9OVU0pIHsKKyAgICAgICAgICAgIHJldCA9IE9NWF9FcnJvckJhZFBvcnRJbmRleDsKKyAgICAgICAgICAgIGdvdG8gRVhJVDsKKyAgICAgICAgfQorCisgICAgICAgIGNvZGVjVHlwZSA9ICgoU0VDX01QRUc0X0hBTkRMRSAqKSgoKFNFQ19PTVhfVklERU9ERUNfQ09NUE9ORU5UICopcFNFQ0NvbXBvbmVudC0+aENvbXBvbmVudEhhbmRsZSktPmhDb2RlY0hhbmRsZSkpLT5oTUZDTXBlZzRIYW5kbGUuY29kZWNUeXBlOworICAgICAgICBpZiAoY29kZWNUeXBlID09IENPREVDX1RZUEVfTVBFRzQpIHsKKyAgICAgICAgICAgIHBQcm9maWxlTGV2ZWwgPSBzdXBwb3J0ZWRNUEVHNFByb2ZpbGVMZXZlbHM7CisgICAgICAgICAgICBtYXhQcm9maWxlTGV2ZWxOdW0gPSBzaXplb2Yoc3VwcG9ydGVkTVBFRzRQcm9maWxlTGV2ZWxzKSAvIHNpemVvZihTRUNfT01YX1ZJREVPX1BST0ZJTEVMRVZFTCk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBwUHJvZmlsZUxldmVsID0gc3VwcG9ydGVkSDI2M1Byb2ZpbGVMZXZlbHM7CisgICAgICAgICAgICBtYXhQcm9maWxlTGV2ZWxOdW0gPSBzaXplb2Yoc3VwcG9ydGVkSDI2M1Byb2ZpbGVMZXZlbHMpIC8gc2l6ZW9mKFNFQ19PTVhfVklERU9fUFJPRklMRUxFVkVMKTsKKyAgICAgICAgfQorCisgICAgICAgIGlmIChwRHN0UHJvZmlsZUxldmVsLT5uUHJvZmlsZUluZGV4ID49IG1heFByb2ZpbGVMZXZlbE51bSkgeworICAgICAgICAgICAgcmV0ID0gT01YX0Vycm9yTm9Nb3JlOworICAgICAgICAgICAgZ290byBFWElUOworICAgICAgICB9CisKKyAgICAgICAgcFByb2ZpbGVMZXZlbCArPSBwRHN0UHJvZmlsZUxldmVsLT5uUHJvZmlsZUluZGV4OworICAgICAgICBwRHN0UHJvZmlsZUxldmVsLT5lUHJvZmlsZSA9IHBQcm9maWxlTGV2ZWwtPnByb2ZpbGU7CisgICAgICAgIHBEc3RQcm9maWxlTGV2ZWwtPmVMZXZlbCA9IHBQcm9maWxlTGV2ZWwtPmxldmVsOworICAgIH0KKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBPTVhfSW5kZXhQYXJhbVZpZGVvUHJvZmlsZUxldmVsQ3VycmVudDoKKyAgICB7CisgICAgICAgIE9NWF9WSURFT19QQVJBTV9QUk9GSUxFTEVWRUxUWVBFICpwRHN0UHJvZmlsZUxldmVsID0gKE9NWF9WSURFT19QQVJBTV9QUk9GSUxFTEVWRUxUWVBFICopcENvbXBvbmVudFBhcmFtZXRlclN0cnVjdHVyZTsKKyAgICAgICAgT01YX1ZJREVPX1BBUkFNX01QRUc0VFlQRSAgICAgICAgKnBTcmNNcGVnNFBhcmFtID0gTlVMTDsKKyAgICAgICAgT01YX1ZJREVPX1BBUkFNX0gyNjNUWVBFICAgICAgICAgKnBTcmNIMjYzUGFyYW0gPSBOVUxMOworICAgICAgICBTRUNfTVBFRzRfSEFORExFICAgICAgICAgICAgICAgICAqcE1wZWc0RGVjID0gTlVMTDsKKyAgICAgICAgT01YX1MzMiAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvZGVjVHlwZTsKKworICAgICAgICByZXQgPSBTRUNfT01YX0NoZWNrX1NpemVWZXJzaW9uKHBEc3RQcm9maWxlTGV2ZWwsIHNpemVvZihPTVhfVklERU9fUEFSQU1fUFJPRklMRUxFVkVMVFlQRSkpOworICAgICAgICBpZiAocmV0ICE9IE9NWF9FcnJvck5vbmUpIHsKKyAgICAgICAgICAgIGdvdG8gRVhJVDsKKyAgICAgICAgfQorCisgICAgICAgIGlmIChwRHN0UHJvZmlsZUxldmVsLT5uUG9ydEluZGV4ID49IEFMTF9QT1JUX05VTSkgeworICAgICAgICAgICAgcmV0ID0gT01YX0Vycm9yQmFkUG9ydEluZGV4OworICAgICAgICAgICAgZ290byBFWElUOworICAgICAgICB9CisKKyAgICAgICAgcE1wZWc0RGVjID0gKFNFQ19NUEVHNF9IQU5ETEUgKikoKFNFQ19PTVhfVklERU9ERUNfQ09NUE9ORU5UICopcFNFQ0NvbXBvbmVudC0+aENvbXBvbmVudEhhbmRsZSktPmhDb2RlY0hhbmRsZTsKKyAgICAgICAgY29kZWNUeXBlID0gcE1wZWc0RGVjLT5oTUZDTXBlZzRIYW5kbGUuY29kZWNUeXBlOworICAgICAgICBpZiAoY29kZWNUeXBlID09IENPREVDX1RZUEVfTVBFRzQpIHsKKyAgICAgICAgICAgIHBTcmNNcGVnNFBhcmFtID0gJnBNcGVnNERlYy0+bXBlZzRDb21wb25lbnRbcERzdFByb2ZpbGVMZXZlbC0+blBvcnRJbmRleF07CisgICAgICAgICAgICBwRHN0UHJvZmlsZUxldmVsLT5lUHJvZmlsZSA9IHBTcmNNcGVnNFBhcmFtLT5lUHJvZmlsZTsKKyAgICAgICAgICAgIHBEc3RQcm9maWxlTGV2ZWwtPmVMZXZlbCA9IHBTcmNNcGVnNFBhcmFtLT5lTGV2ZWw7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBwU3JjSDI2M1BhcmFtID0gJnBNcGVnNERlYy0+aDI2M0NvbXBvbmVudFtwRHN0UHJvZmlsZUxldmVsLT5uUG9ydEluZGV4XTsKKyAgICAgICAgICAgIHBEc3RQcm9maWxlTGV2ZWwtPmVQcm9maWxlID0gcFNyY0gyNjNQYXJhbS0+ZVByb2ZpbGU7CisgICAgICAgICAgICBwRHN0UHJvZmlsZUxldmVsLT5lTGV2ZWwgPSBwU3JjSDI2M1BhcmFtLT5lTGV2ZWw7CisgICAgICAgIH0KKyAgICB9CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgT01YX0luZGV4UGFyYW1WaWRlb0Vycm9yQ29ycmVjdGlvbjoKKyAgICB7CisgICAgICAgIE9NWF9WSURFT19QQVJBTV9FUlJPUkNPUlJFQ1RJT05UWVBFICpwRHN0RXJyb3JDb3JyZWN0aW9uVHlwZSA9IChPTVhfVklERU9fUEFSQU1fRVJST1JDT1JSRUNUSU9OVFlQRSAqKXBDb21wb25lbnRQYXJhbWV0ZXJTdHJ1Y3R1cmU7CisgICAgICAgIE9NWF9WSURFT19QQVJBTV9FUlJPUkNPUlJFQ1RJT05UWVBFICpwU3JjRXJyb3JDb3JyZWN0aW9uVHlwZSA9IE5VTEw7CisgICAgICAgIFNFQ19NUEVHNF9IQU5ETEUgICAgICAgICAgICAgICAgICAgICpwTXBlZzREZWMgPSBOVUxMOworCisgICAgICAgIHJldCA9IFNFQ19PTVhfQ2hlY2tfU2l6ZVZlcnNpb24ocERzdEVycm9yQ29ycmVjdGlvblR5cGUsIHNpemVvZihPTVhfVklERU9fUEFSQU1fRVJST1JDT1JSRUNUSU9OVFlQRSkpOworICAgICAgICBpZiAocmV0ICE9IE9NWF9FcnJvck5vbmUpIHsKKyAgICAgICAgICAgIGdvdG8gRVhJVDsKKyAgICAgICAgfQorCisgICAgICAgIGlmIChwRHN0RXJyb3JDb3JyZWN0aW9uVHlwZS0+blBvcnRJbmRleCAhPSBJTlBVVF9QT1JUX0lOREVYKSB7CisgICAgICAgICAgICByZXQgPSBPTVhfRXJyb3JCYWRQb3J0SW5kZXg7CisgICAgICAgICAgICBnb3RvIEVYSVQ7CisgICAgICAgIH0KKworICAgICAgICBwTXBlZzREZWMgPSAoU0VDX01QRUc0X0hBTkRMRSAqKSgoU0VDX09NWF9WSURFT0RFQ19DT01QT05FTlQgKilwU0VDQ29tcG9uZW50LT5oQ29tcG9uZW50SGFuZGxlKS0+aENvZGVjSGFuZGxlOworICAgICAgICBwU3JjRXJyb3JDb3JyZWN0aW9uVHlwZSA9ICZwTXBlZzREZWMtPmVycm9yQ29ycmVjdGlvblR5cGVbSU5QVVRfUE9SVF9JTkRFWF07CisKKyAgICAgICAgcERzdEVycm9yQ29ycmVjdGlvblR5cGUtPmJFbmFibGVIRUMgPSBwU3JjRXJyb3JDb3JyZWN0aW9uVHlwZS0+YkVuYWJsZUhFQzsKKyAgICAgICAgcERzdEVycm9yQ29ycmVjdGlvblR5cGUtPmJFbmFibGVSZXN5bmMgPSBwU3JjRXJyb3JDb3JyZWN0aW9uVHlwZS0+YkVuYWJsZVJlc3luYzsKKyAgICAgICAgcERzdEVycm9yQ29ycmVjdGlvblR5cGUtPm5SZXN5bmNoTWFya2VyU3BhY2luZyA9IHBTcmNFcnJvckNvcnJlY3Rpb25UeXBlLT5uUmVzeW5jaE1hcmtlclNwYWNpbmc7CisgICAgICAgIHBEc3RFcnJvckNvcnJlY3Rpb25UeXBlLT5iRW5hYmxlRGF0YVBhcnRpdGlvbmluZyA9IHBTcmNFcnJvckNvcnJlY3Rpb25UeXBlLT5iRW5hYmxlRGF0YVBhcnRpdGlvbmluZzsKKyAgICAgICAgcERzdEVycm9yQ29ycmVjdGlvblR5cGUtPmJFbmFibGVSVkxDID0gcFNyY0Vycm9yQ29ycmVjdGlvblR5cGUtPmJFbmFibGVSVkxDOworICAgIH0KKyAgICAgICAgYnJlYWs7CisgICAgZGVmYXVsdDoKKyAgICAgICAgcmV0ID0gU0VDX09NWF9WaWRlb0RlY29kZUdldFBhcmFtZXRlcihoQ29tcG9uZW50LCBuUGFyYW1JbmRleCwgcENvbXBvbmVudFBhcmFtZXRlclN0cnVjdHVyZSk7CisgICAgICAgIGJyZWFrOworICAgIH0KK0VYSVQ6CisgICAgRnVuY3Rpb25PdXQoKTsKKworICAgIHJldHVybiByZXQ7Cit9CisKK09NWF9FUlJPUlRZUEUgU0VDX01GQ19NcGVnNERlY19TZXRQYXJhbWV0ZXIoCisgICAgT01YX0lOIE9NWF9IQU5ETEVUWVBFIGhDb21wb25lbnQsCisgICAgT01YX0lOIE9NWF9JTkRFWFRZUEUgIG5JbmRleCwKKyAgICBPTVhfSU4gT01YX1BUUiAgICAgICAgcENvbXBvbmVudFBhcmFtZXRlclN0cnVjdHVyZSkKK3sKKyAgICBPTVhfRVJST1JUWVBFICAgICAgICAgICByZXQgPSBPTVhfRXJyb3JOb25lOworICAgIE9NWF9DT01QT05FTlRUWVBFICAgICAqcE9NWENvbXBvbmVudCA9IE5VTEw7CisgICAgU0VDX09NWF9CQVNFQ09NUE9ORU5UICpwU0VDQ29tcG9uZW50ID0gTlVMTDsKKworICAgIEZ1bmN0aW9uSW4oKTsKKworICAgIGlmIChoQ29tcG9uZW50ID09IE5VTEwgfHwgcENvbXBvbmVudFBhcmFtZXRlclN0cnVjdHVyZSA9PSBOVUxMKSB7CisgICAgICAgIHJldCA9IE9NWF9FcnJvckJhZFBhcmFtZXRlcjsKKyAgICAgICAgZ290byBFWElUOworICAgIH0KKyAgICBwT01YQ29tcG9uZW50ID0gKE9NWF9DT01QT05FTlRUWVBFICopaENvbXBvbmVudDsKKyAgICByZXQgPSBTRUNfT01YX0NoZWNrX1NpemVWZXJzaW9uKHBPTVhDb21wb25lbnQsIHNpemVvZihPTVhfQ09NUE9ORU5UVFlQRSkpOworICAgIGlmIChyZXQgIT0gT01YX0Vycm9yTm9uZSkgeworICAgICAgICBnb3RvIEVYSVQ7CisgICAgfQorICAgIGlmIChwT01YQ29tcG9uZW50LT5wQ29tcG9uZW50UHJpdmF0ZSA9PSBOVUxMKSB7CisgICAgICAgIHJldCA9IE9NWF9FcnJvckJhZFBhcmFtZXRlcjsKKyAgICAgICAgZ290byBFWElUOworICAgIH0KKworICAgIHBTRUNDb21wb25lbnQgPSAoU0VDX09NWF9CQVNFQ09NUE9ORU5UICopcE9NWENvbXBvbmVudC0+cENvbXBvbmVudFByaXZhdGU7CisgICAgaWYgKHBTRUNDb21wb25lbnQtPmN1cnJlbnRTdGF0ZSA9PSBPTVhfU3RhdGVJbnZhbGlkICkgeworICAgICAgICByZXQgPSBPTVhfRXJyb3JJbnZhbGlkU3RhdGU7CisgICAgICAgIGdvdG8gRVhJVDsKKyAgICB9CisKKyAgICBzd2l0Y2ggKG5JbmRleCkgeworICAgIGNhc2UgT01YX0luZGV4UGFyYW1WaWRlb01wZWc0OgorICAgIHsKKyAgICAgICAgT01YX1ZJREVPX1BBUkFNX01QRUc0VFlQRSAqcERzdE1wZWc0UGFyYW0gPSBOVUxMOworICAgICAgICBPTVhfVklERU9fUEFSQU1fTVBFRzRUWVBFICpwU3JjTXBlZzRQYXJhbSA9IChPTVhfVklERU9fUEFSQU1fTVBFRzRUWVBFICopcENvbXBvbmVudFBhcmFtZXRlclN0cnVjdHVyZTsKKyAgICAgICAgU0VDX01QRUc0X0hBTkRMRSAgICAgICAgICAqcE1wZWc0RGVjID0gTlVMTDsKKworICAgICAgICByZXQgPSBTRUNfT01YX0NoZWNrX1NpemVWZXJzaW9uKHBTcmNNcGVnNFBhcmFtLCBzaXplb2YoT01YX1ZJREVPX1BBUkFNX01QRUc0VFlQRSkpOworICAgICAgICBpZiAocmV0ICE9IE9NWF9FcnJvck5vbmUpIHsKKyAgICAgICAgICAgIGdvdG8gRVhJVDsKKyAgICAgICAgfQorCisgICAgICAgIGlmIChwU3JjTXBlZzRQYXJhbS0+blBvcnRJbmRleCA+PSBBTExfUE9SVF9OVU0pIHsKKyAgICAgICAgICAgIHJldCA9IE9NWF9FcnJvckJhZFBvcnRJbmRleDsKKyAgICAgICAgICAgIGdvdG8gRVhJVDsKKyAgICAgICAgfQorCisgICAgICAgIHBNcGVnNERlYyA9IChTRUNfTVBFRzRfSEFORExFICopKChTRUNfT01YX1ZJREVPREVDX0NPTVBPTkVOVCAqKXBTRUNDb21wb25lbnQtPmhDb21wb25lbnRIYW5kbGUpLT5oQ29kZWNIYW5kbGU7CisgICAgICAgIHBEc3RNcGVnNFBhcmFtID0gJnBNcGVnNERlYy0+bXBlZzRDb21wb25lbnRbcFNyY01wZWc0UGFyYW0tPm5Qb3J0SW5kZXhdOworCisgICAgICAgIFNFQ19PU0FMX01lbWNweShwRHN0TXBlZzRQYXJhbSwgcFNyY01wZWc0UGFyYW0sIHNpemVvZihPTVhfVklERU9fUEFSQU1fTVBFRzRUWVBFKSk7CisgICAgfQorICAgICAgICBicmVhazsKKyAgICBjYXNlIE9NWF9JbmRleFBhcmFtVmlkZW9IMjYzOgorICAgIHsKKyAgICAgICAgT01YX1ZJREVPX1BBUkFNX0gyNjNUWVBFICpwRHN0SDI2M1BhcmFtID0gTlVMTDsKKyAgICAgICAgT01YX1ZJREVPX1BBUkFNX0gyNjNUWVBFICpwU3JjSDI2M1BhcmFtID0gKE9NWF9WSURFT19QQVJBTV9IMjYzVFlQRSAqKXBDb21wb25lbnRQYXJhbWV0ZXJTdHJ1Y3R1cmU7CisgICAgICAgIFNFQ19NUEVHNF9IQU5ETEUgICAgICAgICAqcE1wZWc0RGVjID0gTlVMTDsKKworICAgICAgICByZXQgPSBTRUNfT01YX0NoZWNrX1NpemVWZXJzaW9uKHBTcmNIMjYzUGFyYW0sIHNpemVvZihPTVhfVklERU9fUEFSQU1fSDI2M1RZUEUpKTsKKyAgICAgICAgaWYgKHJldCAhPSBPTVhfRXJyb3JOb25lKSB7CisgICAgICAgICAgICBnb3RvIEVYSVQ7CisgICAgICAgIH0KKworICAgICAgICBpZiAocFNyY0gyNjNQYXJhbS0+blBvcnRJbmRleCA+PSBBTExfUE9SVF9OVU0pIHsKKyAgICAgICAgICAgIHJldCA9IE9NWF9FcnJvckJhZFBvcnRJbmRleDsKKyAgICAgICAgICAgIGdvdG8gRVhJVDsKKyAgICAgICAgfQorCisgICAgICAgIHBNcGVnNERlYyA9IChTRUNfTVBFRzRfSEFORExFICopKChTRUNfT01YX1ZJREVPREVDX0NPTVBPTkVOVCAqKXBTRUNDb21wb25lbnQtPmhDb21wb25lbnRIYW5kbGUpLT5oQ29kZWNIYW5kbGU7CisgICAgICAgIHBEc3RIMjYzUGFyYW0gPSAmcE1wZWc0RGVjLT5oMjYzQ29tcG9uZW50W3BTcmNIMjYzUGFyYW0tPm5Qb3J0SW5kZXhdOworCisgICAgICAgIFNFQ19PU0FMX01lbWNweShwRHN0SDI2M1BhcmFtLCBwU3JjSDI2M1BhcmFtLCBzaXplb2YoT01YX1ZJREVPX1BBUkFNX0gyNjNUWVBFKSk7CisgICAgfQorICAgICAgICBicmVhazsKKyAgICBjYXNlIE9NWF9JbmRleFBhcmFtU3RhbmRhcmRDb21wb25lbnRSb2xlOgorICAgIHsKKyAgICAgICAgT01YX1BBUkFNX0NPTVBPTkVOVFJPTEVUWVBFICpwQ29tcG9uZW50Um9sZSA9IChPTVhfUEFSQU1fQ09NUE9ORU5UUk9MRVRZUEUqKXBDb21wb25lbnRQYXJhbWV0ZXJTdHJ1Y3R1cmU7CisKKyAgICAgICAgcmV0ID0gU0VDX09NWF9DaGVja19TaXplVmVyc2lvbihwQ29tcG9uZW50Um9sZSwgc2l6ZW9mKE9NWF9QQVJBTV9DT01QT05FTlRST0xFVFlQRSkpOworICAgICAgICBpZiAocmV0ICE9IE9NWF9FcnJvck5vbmUpIHsKKyAgICAgICAgICAgIGdvdG8gRVhJVDsKKyAgICAgICAgfQorCisgICAgICAgIGlmICgocFNFQ0NvbXBvbmVudC0+Y3VycmVudFN0YXRlICE9IE9NWF9TdGF0ZUxvYWRlZCkgJiYgKHBTRUNDb21wb25lbnQtPmN1cnJlbnRTdGF0ZSAhPSBPTVhfU3RhdGVXYWl0Rm9yUmVzb3VyY2VzKSkgeworICAgICAgICAgICAgcmV0ID0gT01YX0Vycm9ySW5jb3JyZWN0U3RhdGVPcGVyYXRpb247CisgICAgICAgICAgICBnb3RvIEVYSVQ7CisgICAgICAgIH0KKworICAgICAgICBpZiAoIVNFQ19PU0FMX1N0cmNtcCgoY2hhciopcENvbXBvbmVudFJvbGUtPmNSb2xlLCBTRUNfT01YX0NPTVBPTkVOVF9NUEVHNF9ERUNfUk9MRSkpIHsKKyAgICAgICAgICAgIHBTRUNDb21wb25lbnQtPnBTRUNQb3J0W0lOUFVUX1BPUlRfSU5ERVhdLnBvcnREZWZpbml0aW9uLmZvcm1hdC52aWRlby5lQ29tcHJlc3Npb25Gb3JtYXQgPSBPTVhfVklERU9fQ29kaW5nTVBFRzQ7CisgICAgICAgICAgICAvLygoU0VDX01QRUc0X0hBTkRMRSAqKSgoKFNFQ19PTVhfVklERU9ERUNfQ09NUE9ORU5UICopcFNFQ0NvbXBvbmVudC0+aENvbXBvbmVudEhhbmRsZSktPmhDb2RlY0hhbmRsZSkpLT5oTUZDTXBlZzRIYW5kbGUuY29kZWNUeXBlID0gQ09ERUNfVFlQRV9NUEVHNDsKKyAgICAgICAgfSBlbHNlIGlmICghU0VDX09TQUxfU3RyY21wKChjaGFyKilwQ29tcG9uZW50Um9sZS0+Y1JvbGUsIFNFQ19PTVhfQ09NUE9ORU5UX0gyNjNfREVDX1JPTEUpKSB7CisgICAgICAgICAgICBwU0VDQ29tcG9uZW50LT5wU0VDUG9ydFtJTlBVVF9QT1JUX0lOREVYXS5wb3J0RGVmaW5pdGlvbi5mb3JtYXQudmlkZW8uZUNvbXByZXNzaW9uRm9ybWF0ID0gT01YX1ZJREVPX0NvZGluZ0gyNjM7CisgICAgICAgICAgICAvLygoU0VDX01QRUc0X0hBTkRMRSAqKSgoKFNFQ19PTVhfVklERU9ERUNfQ09NUE9ORU5UICopcFNFQ0NvbXBvbmVudC0+aENvbXBvbmVudEhhbmRsZSktPmhDb2RlY0hhbmRsZSkpLT5oTUZDTXBlZzRIYW5kbGUuY29kZWNUeXBlID0gQ09ERUNfVFlQRV9IMjYzOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgcmV0ID0gT01YX0Vycm9yQmFkUGFyYW1ldGVyOworICAgICAgICAgICAgZ290byBFWElUOworICAgICAgICB9CisgICAgfQorICAgICAgICBicmVhazsKKyAgICBjYXNlIE9NWF9JbmRleFBhcmFtUG9ydERlZmluaXRpb246CisgICAgeworICAgICAgICBPTVhfUEFSQU1fUE9SVERFRklOSVRJT05UWVBFICpwUG9ydERlZmluaXRpb24gPSAoT01YX1BBUkFNX1BPUlRERUZJTklUSU9OVFlQRSAqKXBDb21wb25lbnRQYXJhbWV0ZXJTdHJ1Y3R1cmU7CisgICAgICAgIE9NWF9VMzIgICAgICAgICAgICAgICAgICAgICAgIHBvcnRJbmRleCA9IHBQb3J0RGVmaW5pdGlvbi0+blBvcnRJbmRleDsKKyAgICAgICAgU0VDX09NWF9CQVNFUE9SVCAgICAgICAgICAgICAqcFNFQ1BvcnQ7CisgICAgICAgIE9NWF9VMzIgd2lkdGgsIGhlaWdodCwgc2l6ZTsKKyAgICAgICAgT01YX1UzMiByZWFsV2lkdGgsIHJlYWxIZWlnaHQ7CisKKyAgICAgICAgaWYgKHBvcnRJbmRleCA+PSBwU0VDQ29tcG9uZW50LT5wb3J0UGFyYW0ublBvcnRzKSB7CisgICAgICAgICAgICByZXQgPSBPTVhfRXJyb3JCYWRQb3J0SW5kZXg7CisgICAgICAgICAgICBnb3RvIEVYSVQ7CisgICAgICAgIH0KKyAgICAgICAgcmV0ID0gU0VDX09NWF9DaGVja19TaXplVmVyc2lvbihwUG9ydERlZmluaXRpb24sIHNpemVvZihPTVhfUEFSQU1fUE9SVERFRklOSVRJT05UWVBFKSk7CisgICAgICAgIGlmIChyZXQgIT0gT01YX0Vycm9yTm9uZSkgeworICAgICAgICAgICAgZ290byBFWElUOworICAgICAgICB9CisKKyAgICAgICAgcFNFQ1BvcnQgPSAmcFNFQ0NvbXBvbmVudC0+cFNFQ1BvcnRbcG9ydEluZGV4XTsKKworICAgICAgICBpZiAoKHBTRUNDb21wb25lbnQtPmN1cnJlbnRTdGF0ZSAhPSBPTVhfU3RhdGVMb2FkZWQpICYmIChwU0VDQ29tcG9uZW50LT5jdXJyZW50U3RhdGUgIT0gT01YX1N0YXRlV2FpdEZvclJlc291cmNlcykpIHsKKyAgICAgICAgICAgIGlmIChwU0VDUG9ydC0+cG9ydERlZmluaXRpb24uYkVuYWJsZWQgPT0gT01YX1RSVUUpIHsKKyAgICAgICAgICAgICAgICByZXQgPSBPTVhfRXJyb3JJbmNvcnJlY3RTdGF0ZU9wZXJhdGlvbjsKKyAgICAgICAgICAgICAgICBnb3RvIEVYSVQ7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgaWYgKHBQb3J0RGVmaW5pdGlvbi0+bkJ1ZmZlckNvdW50QWN0dWFsIDwgcFNFQ1BvcnQtPnBvcnREZWZpbml0aW9uLm5CdWZmZXJDb3VudE1pbikgeworICAgICAgICAgICAgcmV0ID0gT01YX0Vycm9yQmFkUGFyYW1ldGVyOworICAgICAgICAgICAgZ290byBFWElUOworICAgICAgICB9CisKKyAgICAgICAgU0VDX09TQUxfTWVtY3B5KCZwU0VDUG9ydC0+cG9ydERlZmluaXRpb24sIHBQb3J0RGVmaW5pdGlvbiwgcFBvcnREZWZpbml0aW9uLT5uU2l6ZSk7CisKKyAgICAgICAgcmVhbFdpZHRoID0gcFNFQ1BvcnQtPnBvcnREZWZpbml0aW9uLmZvcm1hdC52aWRlby5uRnJhbWVXaWR0aDsKKyAgICAgICAgcmVhbEhlaWdodCA9IHBTRUNQb3J0LT5wb3J0RGVmaW5pdGlvbi5mb3JtYXQudmlkZW8ubkZyYW1lSGVpZ2h0OworICAgICAgICB3aWR0aCA9ICgocmVhbFdpZHRoICsgMTUpICYgKH4xNSkpOworICAgICAgICBoZWlnaHQgPSAoKHJlYWxIZWlnaHQgKyAxNSkgJiAofjE1KSk7CisgICAgICAgIHNpemUgPSAod2lkdGggKiBoZWlnaHQgKiAzKSAvIDI7CisgICAgICAgIHBTRUNQb3J0LT5wb3J0RGVmaW5pdGlvbi5mb3JtYXQudmlkZW8ublN0cmlkZSA9IHdpZHRoOworICAgICAgICBwU0VDUG9ydC0+cG9ydERlZmluaXRpb24uZm9ybWF0LnZpZGVvLm5TbGljZUhlaWdodCA9IGhlaWdodDsKKyAgICAgICAgcFNFQ1BvcnQtPnBvcnREZWZpbml0aW9uLm5CdWZmZXJTaXplID0gKHNpemUgPiBwU0VDUG9ydC0+cG9ydERlZmluaXRpb24ubkJ1ZmZlclNpemUpID8gc2l6ZSA6IHBTRUNQb3J0LT5wb3J0RGVmaW5pdGlvbi5uQnVmZmVyU2l6ZTsKKworICAgICAgICBpZiAocG9ydEluZGV4ID09IElOUFVUX1BPUlRfSU5ERVgpIHsKKyAgICAgICAgICAgIFNFQ19PTVhfQkFTRVBPUlQgKnBTRUNPdXRwdXRQb3J0ID0gJnBTRUNDb21wb25lbnQtPnBTRUNQb3J0W09VVFBVVF9QT1JUX0lOREVYXTsKKyAgICAgICAgICAgIHBTRUNPdXRwdXRQb3J0LT5wb3J0RGVmaW5pdGlvbi5mb3JtYXQudmlkZW8ubkZyYW1lV2lkdGggPSBwU0VDUG9ydC0+cG9ydERlZmluaXRpb24uZm9ybWF0LnZpZGVvLm5GcmFtZVdpZHRoOworICAgICAgICAgICAgcFNFQ091dHB1dFBvcnQtPnBvcnREZWZpbml0aW9uLmZvcm1hdC52aWRlby5uRnJhbWVIZWlnaHQgPSBwU0VDUG9ydC0+cG9ydERlZmluaXRpb24uZm9ybWF0LnZpZGVvLm5GcmFtZUhlaWdodDsKKyAgICAgICAgICAgIHBTRUNPdXRwdXRQb3J0LT5wb3J0RGVmaW5pdGlvbi5mb3JtYXQudmlkZW8ublN0cmlkZSA9IHdpZHRoOworICAgICAgICAgICAgcFNFQ091dHB1dFBvcnQtPnBvcnREZWZpbml0aW9uLmZvcm1hdC52aWRlby5uU2xpY2VIZWlnaHQgPSBoZWlnaHQ7CisKKyAgICAgICAgICAgIHN3aXRjaCAocFNFQ091dHB1dFBvcnQtPnBvcnREZWZpbml0aW9uLmZvcm1hdC52aWRlby5lQ29sb3JGb3JtYXQpIHsKKyAgICAgICAgICAgIGNhc2UgT01YX0NPTE9SX0Zvcm1hdFlVVjQyMFBsYW5hcjoKKyAgICAgICAgICAgIGNhc2UgT01YX0NPTE9SX0Zvcm1hdFlVVjQyMFNlbWlQbGFuYXI6CisgICAgICAgICAgICBjYXNlIE9NWF9TRUNfQ09MT1JfRm9ybWF0TlYxMlRQaHlzaWNhbEFkZHJlc3M6CisgICAgICAgICAgICBjYXNlIE9NWF9TRUNfQ09MT1JfRm9ybWF0QU5CWVVWNDIwU2VtaVBsYW5hcjoKKyAgICAgICAgICAgICAgICBwU0VDT3V0cHV0UG9ydC0+cG9ydERlZmluaXRpb24ubkJ1ZmZlclNpemUgPSAod2lkdGggKiBoZWlnaHQgKiAzKSAvIDI7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIE9NWF9TRUNfQ09MT1JfRm9ybWF0TlYxMlRpbGVkOgorICAgICAgICAgICAgICAgIHBTRUNPdXRwdXRQb3J0LT5wb3J0RGVmaW5pdGlvbi5uQnVmZmVyU2l6ZSA9CisgICAgICAgICAgICAgICAgICAgIEFMSUdOX1RPXzhLQihBTElHTl9UT18xMjhCKHJlYWxXaWR0aCkgKiBBTElHTl9UT18zMkIocmVhbEhlaWdodCkpIFwKKyAgICAgICAgICAgICAgICAgICsgQUxJR05fVE9fOEtCKEFMSUdOX1RPXzEyOEIocmVhbFdpZHRoKSAqIEFMSUdOX1RPXzMyQihyZWFsSGVpZ2h0LzIpKTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgU0VDX09TQUxfTG9nKFNFQ19MT0dfRVJST1IsICJDb2xvciBmb3JtYXQgaXMgbm90IHN1cHBvcnQhISB1c2UgZGVmYXVsdCBZVVYgc2l6ZSEhIik7CisgICAgICAgICAgICAgICAgcmV0ID0gT01YX0Vycm9yVW5zdXBwb3J0ZWRTZXR0aW5nOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorICAgICAgICBicmVhazsKKyAgICBjYXNlIE9NWF9JbmRleFBhcmFtVmlkZW9Qcm9maWxlTGV2ZWxDdXJyZW50OgorICAgIHsKKyAgICAgICAgT01YX1ZJREVPX1BBUkFNX1BST0ZJTEVMRVZFTFRZUEUgKnBTcmNQcm9maWxlTGV2ZWwgPSAoT01YX1ZJREVPX1BBUkFNX1BST0ZJTEVMRVZFTFRZUEUgKilwQ29tcG9uZW50UGFyYW1ldGVyU3RydWN0dXJlOworICAgICAgICBPTVhfVklERU9fUEFSQU1fTVBFRzRUWVBFICAgICAgICAqcERzdE1wZWc0UGFyYW0gPSBOVUxMOworICAgICAgICBPTVhfVklERU9fUEFSQU1fSDI2M1RZUEUgICAgICAgICAqcERzdEgyNjNQYXJhbSA9IE5VTEw7CisgICAgICAgIFNFQ19NUEVHNF9IQU5ETEUgICAgICAgICAgICAgICAgICpwTXBlZzREZWMgPSBOVUxMOworICAgICAgICBPTVhfUzMyICAgICAgICAgICAgICAgICAgICAgICAgICAgY29kZWNUeXBlOworCisgICAgICAgIHJldCA9IFNFQ19PTVhfQ2hlY2tfU2l6ZVZlcnNpb24ocFNyY1Byb2ZpbGVMZXZlbCwgc2l6ZW9mKE9NWF9WSURFT19QQVJBTV9QUk9GSUxFTEVWRUxUWVBFKSk7CisgICAgICAgIGlmIChyZXQgIT0gT01YX0Vycm9yTm9uZSkgeworICAgICAgICAgICAgZ290byBFWElUOworICAgICAgICB9CisKKyAgICAgICAgaWYgKHBTcmNQcm9maWxlTGV2ZWwtPm5Qb3J0SW5kZXggPj0gQUxMX1BPUlRfTlVNKSB7CisgICAgICAgICAgICByZXQgPSBPTVhfRXJyb3JCYWRQb3J0SW5kZXg7CisgICAgICAgICAgICBnb3RvIEVYSVQ7CisgICAgICAgIH0KKworICAgICAgICBwTXBlZzREZWMgPSAoU0VDX01QRUc0X0hBTkRMRSAqKSgoU0VDX09NWF9WSURFT0RFQ19DT01QT05FTlQgKilwU0VDQ29tcG9uZW50LT5oQ29tcG9uZW50SGFuZGxlKS0+aENvZGVjSGFuZGxlOworICAgICAgICBjb2RlY1R5cGUgPSBwTXBlZzREZWMtPmhNRkNNcGVnNEhhbmRsZS5jb2RlY1R5cGU7CisgICAgICAgIGlmIChjb2RlY1R5cGUgPT0gQ09ERUNfVFlQRV9NUEVHNCkgeworICAgICAgICAgICAgLyoKKyAgICAgICAgICAgICAqIFRvIGRvOiBDaGVjayB2YWxpZGl0eSBvZiBwcm9maWxlICYgbGV2ZWwgcGFyYW1ldGVycworICAgICAgICAgICAgICovCisKKyAgICAgICAgICAgIHBEc3RNcGVnNFBhcmFtID0gJnBNcGVnNERlYy0+bXBlZzRDb21wb25lbnRbcFNyY1Byb2ZpbGVMZXZlbC0+blBvcnRJbmRleF07CisgICAgICAgICAgICBwRHN0TXBlZzRQYXJhbS0+ZVByb2ZpbGUgPSBwU3JjUHJvZmlsZUxldmVsLT5lUHJvZmlsZTsKKyAgICAgICAgICAgIHBEc3RNcGVnNFBhcmFtLT5lTGV2ZWwgPSBwU3JjUHJvZmlsZUxldmVsLT5lTGV2ZWw7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAvKgorICAgICAgICAgICAgICogVG8gZG86IENoZWNrIHZhbGlkaXR5IG9mIHByb2ZpbGUgJiBsZXZlbCBwYXJhbWV0ZXJzCisgICAgICAgICAgICAgKi8KKworICAgICAgICAgICAgcERzdEgyNjNQYXJhbSA9ICZwTXBlZzREZWMtPmgyNjNDb21wb25lbnRbcFNyY1Byb2ZpbGVMZXZlbC0+blBvcnRJbmRleF07CisgICAgICAgICAgICBwRHN0SDI2M1BhcmFtLT5lUHJvZmlsZSA9IHBTcmNQcm9maWxlTGV2ZWwtPmVQcm9maWxlOworICAgICAgICAgICAgcERzdEgyNjNQYXJhbS0+ZUxldmVsID0gcFNyY1Byb2ZpbGVMZXZlbC0+ZUxldmVsOworICAgICAgICB9CisgICAgfQorICAgICAgICBicmVhazsKKyAgICBjYXNlIE9NWF9JbmRleFBhcmFtVmlkZW9FcnJvckNvcnJlY3Rpb246CisgICAgeworICAgICAgICBPTVhfVklERU9fUEFSQU1fRVJST1JDT1JSRUNUSU9OVFlQRSAqcFNyY0Vycm9yQ29ycmVjdGlvblR5cGUgPSAoT01YX1ZJREVPX1BBUkFNX0VSUk9SQ09SUkVDVElPTlRZUEUgKilwQ29tcG9uZW50UGFyYW1ldGVyU3RydWN0dXJlOworICAgICAgICBPTVhfVklERU9fUEFSQU1fRVJST1JDT1JSRUNUSU9OVFlQRSAqcERzdEVycm9yQ29ycmVjdGlvblR5cGUgPSBOVUxMOworICAgICAgICBTRUNfTVBFRzRfSEFORExFICAgICAgICAgICAgICAgICAgICAqcE1wZWc0RGVjID0gTlVMTDsKKworICAgICAgICByZXQgPSBTRUNfT01YX0NoZWNrX1NpemVWZXJzaW9uKHBTcmNFcnJvckNvcnJlY3Rpb25UeXBlLCBzaXplb2YoT01YX1ZJREVPX1BBUkFNX0VSUk9SQ09SUkVDVElPTlRZUEUpKTsKKyAgICAgICAgaWYgKHJldCAhPSBPTVhfRXJyb3JOb25lKSB7CisgICAgICAgICAgICBnb3RvIEVYSVQ7CisgICAgICAgIH0KKworICAgICAgICBpZiAocFNyY0Vycm9yQ29ycmVjdGlvblR5cGUtPm5Qb3J0SW5kZXggIT0gSU5QVVRfUE9SVF9JTkRFWCkgeworICAgICAgICAgICAgcmV0ID0gT01YX0Vycm9yQmFkUG9ydEluZGV4OworICAgICAgICAgICAgZ290byBFWElUOworICAgICAgICB9CisKKyAgICAgICAgcE1wZWc0RGVjID0gKFNFQ19NUEVHNF9IQU5ETEUgKikoKFNFQ19PTVhfVklERU9ERUNfQ09NUE9ORU5UICopcFNFQ0NvbXBvbmVudC0+aENvbXBvbmVudEhhbmRsZSktPmhDb2RlY0hhbmRsZTsKKyAgICAgICAgcERzdEVycm9yQ29ycmVjdGlvblR5cGUgPSAmcE1wZWc0RGVjLT5lcnJvckNvcnJlY3Rpb25UeXBlW0lOUFVUX1BPUlRfSU5ERVhdOworCisgICAgICAgIHBEc3RFcnJvckNvcnJlY3Rpb25UeXBlLT5iRW5hYmxlSEVDID0gcFNyY0Vycm9yQ29ycmVjdGlvblR5cGUtPmJFbmFibGVIRUM7CisgICAgICAgIHBEc3RFcnJvckNvcnJlY3Rpb25UeXBlLT5iRW5hYmxlUmVzeW5jID0gcFNyY0Vycm9yQ29ycmVjdGlvblR5cGUtPmJFbmFibGVSZXN5bmM7CisgICAgICAgIHBEc3RFcnJvckNvcnJlY3Rpb25UeXBlLT5uUmVzeW5jaE1hcmtlclNwYWNpbmcgPSBwU3JjRXJyb3JDb3JyZWN0aW9uVHlwZS0+blJlc3luY2hNYXJrZXJTcGFjaW5nOworICAgICAgICBwRHN0RXJyb3JDb3JyZWN0aW9uVHlwZS0+YkVuYWJsZURhdGFQYXJ0aXRpb25pbmcgPSBwU3JjRXJyb3JDb3JyZWN0aW9uVHlwZS0+YkVuYWJsZURhdGFQYXJ0aXRpb25pbmc7CisgICAgICAgIHBEc3RFcnJvckNvcnJlY3Rpb25UeXBlLT5iRW5hYmxlUlZMQyA9IHBTcmNFcnJvckNvcnJlY3Rpb25UeXBlLT5iRW5hYmxlUlZMQzsKKyAgICB9CisgICAgICAgIGJyZWFrOworICAgIGRlZmF1bHQ6CisgICAgICAgIHJldCA9IFNFQ19PTVhfVmlkZW9EZWNvZGVTZXRQYXJhbWV0ZXIoaENvbXBvbmVudCwgbkluZGV4LCBwQ29tcG9uZW50UGFyYW1ldGVyU3RydWN0dXJlKTsKKyAgICAgICAgYnJlYWs7CisgICAgfQorRVhJVDoKKyAgICBGdW5jdGlvbk91dCgpOworCisgICAgcmV0dXJuIHJldDsKK30KKworT01YX0VSUk9SVFlQRSBTRUNfTUZDX01wZWc0RGVjX0dldENvbmZpZygKKyAgICBPTVhfSU4gT01YX0hBTkRMRVRZUEUgaENvbXBvbmVudCwKKyAgICBPTVhfSU4gT01YX0lOREVYVFlQRSAgbkluZGV4LAorICAgIE9NWF9JTiBPTVhfUFRSICAgICAgICBwQ29tcG9uZW50Q29uZmlnU3RydWN0dXJlKQoreworICAgIE9NWF9FUlJPUlRZUEUgICAgICAgICAgIHJldCA9IE9NWF9FcnJvck5vbmU7CisgICAgT01YX0NPTVBPTkVOVFRZUEUgICAgICpwT01YQ29tcG9uZW50ID0gTlVMTDsKKyAgICBTRUNfT01YX0JBU0VDT01QT05FTlQgKnBTRUNDb21wb25lbnQgPSBOVUxMOworCisgICAgRnVuY3Rpb25JbigpOworCisgICAgaWYgKGhDb21wb25lbnQgPT0gTlVMTCB8fCBwQ29tcG9uZW50Q29uZmlnU3RydWN0dXJlID09IE5VTEwpIHsKKyAgICAgICAgcmV0ID0gT01YX0Vycm9yQmFkUGFyYW1ldGVyOworICAgICAgICBnb3RvIEVYSVQ7CisgICAgfQorICAgIHBPTVhDb21wb25lbnQgPSAoT01YX0NPTVBPTkVOVFRZUEUgKiloQ29tcG9uZW50OworICAgIHJldCA9IFNFQ19PTVhfQ2hlY2tfU2l6ZVZlcnNpb24ocE9NWENvbXBvbmVudCwgc2l6ZW9mKE9NWF9DT01QT05FTlRUWVBFKSk7CisgICAgaWYgKHJldCAhPSBPTVhfRXJyb3JOb25lKSB7CisgICAgICAgIGdvdG8gRVhJVDsKKyAgICB9CisgICAgaWYgKHBPTVhDb21wb25lbnQtPnBDb21wb25lbnRQcml2YXRlID09IE5VTEwpIHsKKyAgICAgICAgcmV0ID0gT01YX0Vycm9yQmFkUGFyYW1ldGVyOworICAgICAgICBnb3RvIEVYSVQ7CisgICAgfQorCisgICAgcFNFQ0NvbXBvbmVudCA9IChTRUNfT01YX0JBU0VDT01QT05FTlQgKilwT01YQ29tcG9uZW50LT5wQ29tcG9uZW50UHJpdmF0ZTsKKyAgICBpZiAocFNFQ0NvbXBvbmVudC0+Y3VycmVudFN0YXRlID09IE9NWF9TdGF0ZUludmFsaWQpIHsKKyAgICAgICAgcmV0ID0gT01YX0Vycm9ySW52YWxpZFN0YXRlOworICAgICAgICBnb3RvIEVYSVQ7CisgICAgfQorCisgICAgc3dpdGNoIChuSW5kZXgpIHsKKyAgICBkZWZhdWx0OgorICAgICAgICByZXQgPSBTRUNfT01YX1ZpZGVvRGVjb2RlR2V0Q29uZmlnKGhDb21wb25lbnQsIG5JbmRleCwgcENvbXBvbmVudENvbmZpZ1N0cnVjdHVyZSk7CisgICAgICAgIGJyZWFrOworICAgIH0KKworRVhJVDoKKyAgICBGdW5jdGlvbk91dCgpOworCisgICAgcmV0dXJuIHJldDsKK30KKworT01YX0VSUk9SVFlQRSBTRUNfTUZDX01wZWc0RGVjX1NldENvbmZpZygKKyAgICBPTVhfSU4gT01YX0hBTkRMRVRZUEUgaENvbXBvbmVudCwKKyAgICBPTVhfSU4gT01YX0lOREVYVFlQRSAgbkluZGV4LAorICAgIE9NWF9JTiBPTVhfUFRSICAgICAgICBwQ29tcG9uZW50Q29uZmlnU3RydWN0dXJlKQoreworICAgIE9NWF9FUlJPUlRZUEUgICAgICAgICAgIHJldCA9IE9NWF9FcnJvck5vbmU7CisgICAgT01YX0NPTVBPTkVOVFRZUEUgICAgICpwT01YQ29tcG9uZW50ID0gTlVMTDsKKyAgICBTRUNfT01YX0JBU0VDT01QT05FTlQgKnBTRUNDb21wb25lbnQgPSBOVUxMOworCisgICAgRnVuY3Rpb25JbigpOworCisgICAgaWYgKGhDb21wb25lbnQgPT0gTlVMTCB8fCBwQ29tcG9uZW50Q29uZmlnU3RydWN0dXJlID09IE5VTEwpIHsKKyAgICAgICAgcmV0ID0gT01YX0Vycm9yQmFkUGFyYW1ldGVyOworICAgICAgICBnb3RvIEVYSVQ7CisgICAgfQorICAgIHBPTVhDb21wb25lbnQgPSAoT01YX0NPTVBPTkVOVFRZUEUgKiloQ29tcG9uZW50OworICAgIHJldCA9IFNFQ19PTVhfQ2hlY2tfU2l6ZVZlcnNpb24ocE9NWENvbXBvbmVudCwgc2l6ZW9mKE9NWF9DT01QT05FTlRUWVBFKSk7CisgICAgaWYgKHJldCAhPSBPTVhfRXJyb3JOb25lKSB7CisgICAgICAgIGdvdG8gRVhJVDsKKyAgICB9CisgICAgaWYgKHBPTVhDb21wb25lbnQtPnBDb21wb25lbnRQcml2YXRlID09IE5VTEwpIHsKKyAgICAgICAgcmV0ID0gT01YX0Vycm9yQmFkUGFyYW1ldGVyOworICAgICAgICBnb3RvIEVYSVQ7CisgICAgfQorCisgICAgcFNFQ0NvbXBvbmVudCA9IChTRUNfT01YX0JBU0VDT01QT05FTlQgKilwT01YQ29tcG9uZW50LT5wQ29tcG9uZW50UHJpdmF0ZTsKKyAgICBpZiAocFNFQ0NvbXBvbmVudC0+Y3VycmVudFN0YXRlID09IE9NWF9TdGF0ZUludmFsaWQpIHsKKyAgICAgICAgcmV0ID0gT01YX0Vycm9ySW52YWxpZFN0YXRlOworICAgICAgICBnb3RvIEVYSVQ7CisgICAgfQorCisgICAgc3dpdGNoIChuSW5kZXgpIHsKKyAgICBkZWZhdWx0OgorICAgICAgICByZXQgPSBTRUNfT01YX1ZpZGVvRGVjb2RlU2V0Q29uZmlnKGhDb21wb25lbnQsIG5JbmRleCwgcENvbXBvbmVudENvbmZpZ1N0cnVjdHVyZSk7CisgICAgICAgIGJyZWFrOworICAgIH0KKworRVhJVDoKKyAgICBGdW5jdGlvbk91dCgpOworCisgICAgcmV0dXJuIHJldDsKK30KKworT01YX0VSUk9SVFlQRSBTRUNfTUZDX01wZWc0RGVjX0dldEV4dGVuc2lvbkluZGV4KAorICAgIE9NWF9JTiBPTVhfSEFORExFVFlQRSAgaENvbXBvbmVudCwKKyAgICBPTVhfSU4gT01YX1NUUklORyAgICAgIGNQYXJhbWV0ZXJOYW1lLAorICAgIE9NWF9PVVQgT01YX0lOREVYVFlQRSAqcEluZGV4VHlwZSkKK3sKKyAgICBPTVhfRVJST1JUWVBFICAgICAgICAgICByZXQgPSBPTVhfRXJyb3JOb25lOworICAgIE9NWF9DT01QT05FTlRUWVBFICAgICAqcE9NWENvbXBvbmVudCA9IE5VTEw7CisgICAgU0VDX09NWF9CQVNFQ09NUE9ORU5UICpwU0VDQ29tcG9uZW50ID0gTlVMTDsKKworICAgIEZ1bmN0aW9uSW4oKTsKKworICAgIGlmIChoQ29tcG9uZW50ID09IE5VTEwpIHsKKyAgICAgICAgcmV0ID0gT01YX0Vycm9yQmFkUGFyYW1ldGVyOworICAgICAgICBnb3RvIEVYSVQ7CisgICAgfQorICAgIHBPTVhDb21wb25lbnQgPSAoT01YX0NPTVBPTkVOVFRZUEUgKiloQ29tcG9uZW50OworICAgIHJldCA9IFNFQ19PTVhfQ2hlY2tfU2l6ZVZlcnNpb24ocE9NWENvbXBvbmVudCwgc2l6ZW9mKE9NWF9DT01QT05FTlRUWVBFKSk7CisgICAgaWYgKHJldCAhPSBPTVhfRXJyb3JOb25lKSB7CisgICAgICAgIGdvdG8gRVhJVDsKKyAgICB9CisKKyAgICBpZiAocE9NWENvbXBvbmVudC0+cENvbXBvbmVudFByaXZhdGUgPT0gTlVMTCkgeworICAgICAgICByZXQgPSBPTVhfRXJyb3JCYWRQYXJhbWV0ZXI7CisgICAgICAgIGdvdG8gRVhJVDsKKyAgICB9CisgICAgcFNFQ0NvbXBvbmVudCA9IChTRUNfT01YX0JBU0VDT01QT05FTlQgKilwT01YQ29tcG9uZW50LT5wQ29tcG9uZW50UHJpdmF0ZTsKKworICAgIGlmICgoY1BhcmFtZXRlck5hbWUgPT0gTlVMTCkgfHwgKHBJbmRleFR5cGUgPT0gTlVMTCkpIHsKKyAgICAgICAgcmV0ID0gT01YX0Vycm9yQmFkUGFyYW1ldGVyOworICAgICAgICBnb3RvIEVYSVQ7CisgICAgfQorICAgIGlmIChwU0VDQ29tcG9uZW50LT5jdXJyZW50U3RhdGUgPT0gT01YX1N0YXRlSW52YWxpZCkgeworICAgICAgICByZXQgPSBPTVhfRXJyb3JJbnZhbGlkU3RhdGU7CisgICAgICAgIGdvdG8gRVhJVDsKKyAgICB9CisKKyAgICBpZiAoU0VDX09TQUxfU3RyY21wKGNQYXJhbWV0ZXJOYW1lLCBTRUNfSU5ERVhfUEFSQU1fRU5BQkxFX1RIVU1CTkFJTCkgPT0gMCkgeworICAgICAgICBTRUNfTVBFRzRfSEFORExFICpwTXBlZzREZWMgPSAoU0VDX01QRUc0X0hBTkRMRSAqKSgoU0VDX09NWF9WSURFT0RFQ19DT01QT05FTlQgKilwU0VDQ29tcG9uZW50LT5oQ29tcG9uZW50SGFuZGxlKS0+aENvZGVjSGFuZGxlOworCisgICAgICAgICpwSW5kZXhUeXBlID0gT01YX0luZGV4VmVuZG9yVGh1bWJuYWlsTW9kZTsKKworICAgICAgICByZXQgPSBPTVhfRXJyb3JOb25lOworICAgIH0gZWxzZSB7CisgICAgICAgIHJldCA9IFNFQ19PTVhfVmlkZW9EZWNvZGVHZXRFeHRlbnNpb25JbmRleChoQ29tcG9uZW50LCBjUGFyYW1ldGVyTmFtZSwgcEluZGV4VHlwZSk7CisgICAgfQorCitFWElUOgorICAgIEZ1bmN0aW9uT3V0KCk7CisKKyAgICByZXR1cm4gcmV0OworfQorCitPTVhfRVJST1JUWVBFIFNFQ19NRkNfTXBlZzREZWNfQ29tcG9uZW50Um9sZUVudW0oCisgICAgT01YX0lOICBPTVhfSEFORExFVFlQRSBoQ29tcG9uZW50LAorICAgIE9NWF9PVVQgT01YX1U4ICAgICAgICAqY1JvbGUsCisgICAgT01YX0lOICBPTVhfVTMyICAgICAgICBuSW5kZXgpCit7CisgICAgT01YX0VSUk9SVFlQRSAgICAgICAgICAgIHJldCA9IE9NWF9FcnJvck5vbmU7CisgICAgT01YX0NPTVBPTkVOVFRZUEUgICAgICAgKnBPTVhDb21wb25lbnQgPSBOVUxMOworICAgIFNFQ19PTVhfQkFTRUNPTVBPTkVOVCAgICpwU0VDQ29tcG9uZW50ID0gTlVMTDsKKyAgICBPTVhfUzMyICAgICAgICAgICAgICAgICAgY29kZWNUeXBlOworCisgICAgRnVuY3Rpb25JbigpOworCisgICAgaWYgKChoQ29tcG9uZW50ID09IE5VTEwpIHx8IChjUm9sZSA9PSBOVUxMKSkgeworICAgICAgICByZXQgPSBPTVhfRXJyb3JCYWRQYXJhbWV0ZXI7CisgICAgICAgIGdvdG8gRVhJVDsKKyAgICB9CisgICAgaWYgKG5JbmRleCAhPSAoTUFYX0NPTVBPTkVOVF9ST0xFX05VTSAtIDEpKSB7CisgICAgICAgIHJldCA9IE9NWF9FcnJvck5vTW9yZTsKKyAgICAgICAgZ290byBFWElUOworICAgIH0KKyAgICBwT01YQ29tcG9uZW50ID0gKE9NWF9DT01QT05FTlRUWVBFICopaENvbXBvbmVudDsKKyAgICByZXQgPSBTRUNfT01YX0NoZWNrX1NpemVWZXJzaW9uKHBPTVhDb21wb25lbnQsIHNpemVvZihPTVhfQ09NUE9ORU5UVFlQRSkpOworICAgIGlmIChyZXQgIT0gT01YX0Vycm9yTm9uZSkgeworICAgICAgICBnb3RvIEVYSVQ7CisgICAgfQorICAgIGlmIChwT01YQ29tcG9uZW50LT5wQ29tcG9uZW50UHJpdmF0ZSA9PSBOVUxMKSB7CisgICAgICAgIHJldCA9IE9NWF9FcnJvckJhZFBhcmFtZXRlcjsKKyAgICAgICAgZ290byBFWElUOworICAgIH0KKworICAgIHBTRUNDb21wb25lbnQgPSAoU0VDX09NWF9CQVNFQ09NUE9ORU5UICopcE9NWENvbXBvbmVudC0+cENvbXBvbmVudFByaXZhdGU7CisgICAgaWYgKHBTRUNDb21wb25lbnQtPmN1cnJlbnRTdGF0ZSA9PSBPTVhfU3RhdGVJbnZhbGlkICkgeworICAgICAgICByZXQgPSBPTVhfRXJyb3JJbnZhbGlkU3RhdGU7CisgICAgICAgIGdvdG8gRVhJVDsKKyAgICB9CisKKyAgICBjb2RlY1R5cGUgPSAoKFNFQ19NUEVHNF9IQU5ETEUgKikoKChTRUNfT01YX1ZJREVPREVDX0NPTVBPTkVOVCAqKXBTRUNDb21wb25lbnQtPmhDb21wb25lbnRIYW5kbGUpLT5oQ29kZWNIYW5kbGUpKS0+aE1GQ01wZWc0SGFuZGxlLmNvZGVjVHlwZTsKKyAgICBpZiAoY29kZWNUeXBlID09IENPREVDX1RZUEVfTVBFRzQpCisgICAgICAgIFNFQ19PU0FMX1N0cmNweSgoY2hhciAqKWNSb2xlLCBTRUNfT01YX0NPTVBPTkVOVF9NUEVHNF9ERUNfUk9MRSk7CisgICAgZWxzZQorICAgICAgICBTRUNfT1NBTF9TdHJjcHkoKGNoYXIgKiljUm9sZSwgU0VDX09NWF9DT01QT05FTlRfSDI2M19ERUNfUk9MRSk7CisKK0VYSVQ6CisgICAgRnVuY3Rpb25PdXQoKTsKKworICAgIHJldHVybiByZXQ7Cit9CisKK09NWF9FUlJPUlRZUEUgU0VDX01GQ19EZWNvZGVUaHJlYWQoT01YX0hBTkRMRVRZUEUgaENvbXBvbmVudCkKK3sKKyAgICBPTVhfRVJST1JUWVBFICAgICAgICAgIHJldCA9IE9NWF9FcnJvck5vbmU7CisgICAgT01YX0NPTVBPTkVOVFRZUEUgICAgICpwT01YQ29tcG9uZW50ID0gKE9NWF9DT01QT05FTlRUWVBFICopaENvbXBvbmVudDsKKyAgICBTRUNfT01YX0JBU0VDT01QT05FTlQgKnBTRUNDb21wb25lbnQgPSAoU0VDX09NWF9CQVNFQ09NUE9ORU5UICopcE9NWENvbXBvbmVudC0+cENvbXBvbmVudFByaXZhdGU7CisgICAgU0VDX09NWF9WSURFT0RFQ19DT01QT05FTlQgKnBWaWRlb0RlYyA9IChTRUNfT01YX1ZJREVPREVDX0NPTVBPTkVOVCAqKXBTRUNDb21wb25lbnQtPmhDb21wb25lbnRIYW5kbGU7CisgICAgU0VDX01QRUc0X0hBTkRMRSAgICAgICpwTXBlZzREZWMgPSAoU0VDX01QRUc0X0hBTkRMRSAqKSgoU0VDX09NWF9WSURFT0RFQ19DT01QT05FTlQgKilwU0VDQ29tcG9uZW50LT5oQ29tcG9uZW50SGFuZGxlKS0+aENvZGVjSGFuZGxlOworCisgICAgRnVuY3Rpb25JbigpOworCisgICAgaWYgKGhDb21wb25lbnQgPT0gTlVMTCkgeworICAgICAgICByZXQgPSBPTVhfRXJyb3JCYWRQYXJhbWV0ZXI7CisgICAgICAgIGdvdG8gRVhJVDsKKyAgICB9CisgICAgd2hpbGUgKHBWaWRlb0RlYy0+TkJEZWNUaHJlYWQuYkV4aXREZWNvZGVUaHJlYWQgPT0gT01YX0ZBTFNFKSB7CisgICAgICAgIFNFQ19PU0FMX1NlbWFwaG9yZVdhaXQocFZpZGVvRGVjLT5OQkRlY1RocmVhZC5oRGVjRnJhbWVTdGFydCk7CisKKyAgICAgICAgaWYgKHBWaWRlb0RlYy0+TkJEZWNUaHJlYWQuYkV4aXREZWNvZGVUaHJlYWQgPT0gT01YX0ZBTFNFKSB7CisjaWZkZWYgQ09ORklHX01GQ19GUFMKKyAgICAgICAgICAgIFNFQ19PU0FMX1BlcmZTdGFydChQRVJGX0lEX0RFQyk7CisjZW5kaWYKKyAgICAgICAgICAgIHBNcGVnNERlYy0+aE1GQ01wZWc0SGFuZGxlLnJldHVybkNvZGVjID0gU3NiU2lwTWZjRGVjRXhlKHBNcGVnNERlYy0+aE1GQ01wZWc0SGFuZGxlLmhNRkNIYW5kbGUsIHBWaWRlb0RlYy0+TkJEZWNUaHJlYWQub25lRnJhbWVTaXplKTsKKyNpZmRlZiBDT05GSUdfTUZDX0ZQUworICAgICAgICAgICAgU0VDX09TQUxfUGVyZlN0b3AoUEVSRl9JRF9ERUMpOworI2VuZGlmCisgICAgICAgICAgICBTRUNfT1NBTF9TZW1hcGhvcmVQb3N0KHBWaWRlb0RlYy0+TkJEZWNUaHJlYWQuaERlY0ZyYW1lRW5kKTsKKyAgICAgICAgfQorICAgIH0KKworRVhJVDoKKyAgICBTRUNfT1NBTF9UaHJlYWRFeGl0KE5VTEwpOworICAgIEZ1bmN0aW9uT3V0KCk7CisKKyAgICByZXR1cm4gcmV0OworfQorCisvKiBNRkMgSW5pdCAqLworT01YX0VSUk9SVFlQRSBTRUNfTUZDX01wZWc0RGVjX0luaXQoT01YX0NPTVBPTkVOVFRZUEUgKnBPTVhDb21wb25lbnQpCit7CisgICAgT01YX0VSUk9SVFlQRSAgICAgICAgICByZXQgPSBPTVhfRXJyb3JOb25lOworICAgIFNFQ19PTVhfQkFTRUNPTVBPTkVOVCAqcFNFQ0NvbXBvbmVudCA9IChTRUNfT01YX0JBU0VDT01QT05FTlQgKilwT01YQ29tcG9uZW50LT5wQ29tcG9uZW50UHJpdmF0ZTsKKyAgICBTRUNfT01YX1ZJREVPREVDX0NPTVBPTkVOVCAqcFZpZGVvRGVjID0gKFNFQ19PTVhfVklERU9ERUNfQ09NUE9ORU5UICopcFNFQ0NvbXBvbmVudC0+aENvbXBvbmVudEhhbmRsZTsKKyAgICBTRUNfT01YX0JBU0VQT1JUICAgICAgKnBTRUNPdXRwdXRQb3J0ID0gJnBTRUNDb21wb25lbnQtPnBTRUNQb3J0W09VVFBVVF9QT1JUX0lOREVYXTsKKyAgICBTRUNfTVBFRzRfSEFORExFICAgICAgKnBNcGVnNERlYyA9IE5VTEw7CisgICAgT01YX0hBTkRMRVRZUEUgICAgICAgICBoTUZDSGFuZGxlID0gTlVMTDsKKyAgICBPTVhfUFRSICAgICAgICAgICAgICAgIHBTdHJlYW1CdWZmZXIgPSBOVUxMOworICAgIE9NWF9QVFIgICAgICAgICAgICAgICAgcFN0cmVhbVBoeUJ1ZmZlciA9IE5VTEw7CisjaWZkZWYgQ09ORklHX01GQ19GUFMKKyAgICBTRUNfT1NBTF9QZXJmSW5pdChQRVJGX0lEX0RFQyk7CisgICAgU0VDX09TQUxfUGVyZkluaXQoUEVSRl9JRF9DU0MpOworI2VuZGlmCisgICAgQ1NDX01FVEhPRCBjc2NfbWV0aG9kID0gQ1NDX01FVEhPRF9TVzsKKworICAgIEZ1bmN0aW9uSW4oKTsKKworICAgIHBNcGVnNERlYyA9IChTRUNfTVBFRzRfSEFORExFICopKChTRUNfT01YX1ZJREVPREVDX0NPTVBPTkVOVCAqKXBTRUNDb21wb25lbnQtPmhDb21wb25lbnRIYW5kbGUpLT5oQ29kZWNIYW5kbGU7CisgICAgcE1wZWc0RGVjLT5oTUZDTXBlZzRIYW5kbGUuYkNvbmZpZ3VyZWRNRkMgPSBPTVhfRkFMU0U7CisgICAgcFNFQ0NvbXBvbmVudC0+YlVzZUZsYWdFT0YgPSBPTVhfRkFMU0U7CisgICAgcFNFQ0NvbXBvbmVudC0+YlNhdmVGbGFnRU9TID0gT01YX0ZBTFNFOworCisgICAgLyogTUZDKE11bHRpIEZvcm1hdCBDb2RlYykgZGVjb2RlciBhbmQgQ01NKENvZGVjIE1lbW9yeSBNYW5hZ2VtZW50KSBkcml2ZXIgb3BlbiAqLworICAgIGlmIChwU0VDT3V0cHV0UG9ydC0+cG9ydERlZmluaXRpb24uZm9ybWF0LnZpZGVvLmVDb2xvckZvcm1hdCA9PSBPTVhfU0VDX0NPTE9SX0Zvcm1hdE5WMTJUUGh5c2ljYWxBZGRyZXNzKSB7CisgICAgICAgIGhNRkNIYW5kbGUgPSAoT01YX1BUUilTc2JTaXBNZmNEZWNPcGVuKCk7CisgICAgfSBlbHNlIHsKKyAgICAgICAgU1NCSVBfTUZDX0JVRkZFUl9UWVBFIGJ1Zl90eXBlID0gQ0FDSEU7CisgICAgICAgIGhNRkNIYW5kbGUgPSAoT01YX1BUUilTc2JTaXBNZmNEZWNPcGVuRXh0KCZidWZfdHlwZSk7CisgICAgfQorCisgICAgaWYgKGhNRkNIYW5kbGUgPT0gTlVMTCkgeworICAgICAgICByZXQgPSBPTVhfRXJyb3JJbnN1ZmZpY2llbnRSZXNvdXJjZXM7CisgICAgICAgIGdvdG8gRVhJVDsKKyAgICB9CisgICAgZ2hNRkNIYW5kbGUgPSBwTXBlZzREZWMtPmhNRkNNcGVnNEhhbmRsZS5oTUZDSGFuZGxlID0gaE1GQ0hhbmRsZTsKKworICAgIC8qIEFsbG9jYXRlIGRlY29kZXIncyBpbnB1dCBidWZmZXIgKi8KKyAgICAvKiBHZXQgZmlyc3QgaW5wdXQgYnVmZmVyICovCisgICAgcFN0cmVhbUJ1ZmZlciA9IFNzYlNpcE1mY0RlY0dldEluQnVmKGhNRkNIYW5kbGUsICZwU3RyZWFtUGh5QnVmZmVyLCBERUZBVUxUX01GQ19JTlBVVF9CVUZGRVJfU0laRSAvIDIpOworICAgIGlmIChwU3RyZWFtQnVmZmVyID09IE5VTEwpIHsKKyAgICAgICAgcmV0ID0gT01YX0Vycm9ySW5zdWZmaWNpZW50UmVzb3VyY2VzOworICAgICAgICBnb3RvIEVYSVQ7CisgICAgfQorICAgIHBWaWRlb0RlYy0+TUZDRGVjSW5wdXRCdWZmZXJbMF0uVmlyQWRkciA9IHBTdHJlYW1CdWZmZXI7CisgICAgcFZpZGVvRGVjLT5NRkNEZWNJbnB1dEJ1ZmZlclswXS5QaHlBZGRyID0gcFN0cmVhbVBoeUJ1ZmZlcjsKKyAgICBwVmlkZW9EZWMtPk1GQ0RlY0lucHV0QnVmZmVyWzBdLmJ1ZmZlclNpemUgPSBERUZBVUxUX01GQ19JTlBVVF9CVUZGRVJfU0laRSAvIDI7CisgICAgcFZpZGVvRGVjLT5NRkNEZWNJbnB1dEJ1ZmZlclswXS5kYXRhU2l6ZSA9IDA7CisKKyNpZmRlZiBOT05CTE9DS19NT0RFX1BST0NFU1MKKyAgICAvKiBHZXQgc2Vjb25kIGlucHV0IGJ1ZmZlciAqLworICAgIHBTdHJlYW1CdWZmZXIgPSBOVUxMOworICAgIHBTdHJlYW1CdWZmZXIgPSBTc2JTaXBNZmNEZWNHZXRJbkJ1ZihoTUZDSGFuZGxlLCAmcFN0cmVhbVBoeUJ1ZmZlciwgREVGQVVMVF9NRkNfSU5QVVRfQlVGRkVSX1NJWkUgLyAyKTsKKyAgICBpZiAocFN0cmVhbUJ1ZmZlciA9PSBOVUxMKSB7CisgICAgICAgIHJldCA9IE9NWF9FcnJvckluc3VmZmljaWVudFJlc291cmNlczsKKyAgICAgICAgZ290byBFWElUOworICAgIH0KKyAgICBwVmlkZW9EZWMtPk1GQ0RlY0lucHV0QnVmZmVyWzFdLlZpckFkZHIgPSBwU3RyZWFtQnVmZmVyOworICAgIHBWaWRlb0RlYy0+TUZDRGVjSW5wdXRCdWZmZXJbMV0uUGh5QWRkciA9IHBTdHJlYW1QaHlCdWZmZXI7CisgICAgcFZpZGVvRGVjLT5NRkNEZWNJbnB1dEJ1ZmZlclsxXS5idWZmZXJTaXplICAgID0gREVGQVVMVF9NRkNfSU5QVVRfQlVGRkVSX1NJWkUgLyAyOworICAgIHBWaWRlb0RlYy0+TUZDRGVjSW5wdXRCdWZmZXJbMV0uZGF0YVNpemUgPSAwOworICAgIHBWaWRlb0RlYy0+aW5kZXhJbnB1dEJ1ZmZlciA9IDA7CisKKyAgICBwVmlkZW9EZWMtPmJGaXJzdEZyYW1lID0gT01YX1RSVUU7CisKKyAgICBwVmlkZW9EZWMtPk5CRGVjVGhyZWFkLmJFeGl0RGVjb2RlVGhyZWFkID0gT01YX0ZBTFNFOworICAgIHBWaWRlb0RlYy0+TkJEZWNUaHJlYWQuYkRlY29kZXJSdW4gPSBPTVhfRkFMU0U7CisgICAgcFZpZGVvRGVjLT5OQkRlY1RocmVhZC5vbmVGcmFtZVNpemUgPSAwOworICAgIFNFQ19PU0FMX1NlbWFwaG9yZUNyZWF0ZSgmKHBWaWRlb0RlYy0+TkJEZWNUaHJlYWQuaERlY0ZyYW1lU3RhcnQpKTsKKyAgICBTRUNfT1NBTF9TZW1hcGhvcmVDcmVhdGUoJihwVmlkZW9EZWMtPk5CRGVjVGhyZWFkLmhEZWNGcmFtZUVuZCkpOworICAgIGlmIChPTVhfRXJyb3JOb25lID09IFNFQ19PU0FMX1RocmVhZENyZWF0ZSgmcFZpZGVvRGVjLT5OQkRlY1RocmVhZC5oTkJEZWNvZGVUaHJlYWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTRUNfTUZDX0RlY29kZVRocmVhZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBPTVhDb21wb25lbnQpKSB7CisgICAgICAgIHBNcGVnNERlYy0+aE1GQ01wZWc0SGFuZGxlLnJldHVybkNvZGVjID0gTUZDX1JFVF9PSzsKKyAgICB9CisjZW5kaWYKKworICAgIHBNcGVnNERlYy0+aE1GQ01wZWc0SGFuZGxlLnBNRkNTdHJlYW1CdWZmZXIgICAgPSBwVmlkZW9EZWMtPk1GQ0RlY0lucHV0QnVmZmVyWzBdLlZpckFkZHI7CisgICAgcE1wZWc0RGVjLT5oTUZDTXBlZzRIYW5kbGUucE1GQ1N0cmVhbVBoeUJ1ZmZlciA9IHBWaWRlb0RlYy0+TUZDRGVjSW5wdXRCdWZmZXJbMF0uUGh5QWRkcjsKKyAgICBwU0VDQ29tcG9uZW50LT5wcm9jZXNzRGF0YVtJTlBVVF9QT1JUX0lOREVYXS5kYXRhQnVmZmVyID0gcFZpZGVvRGVjLT5NRkNEZWNJbnB1dEJ1ZmZlclswXS5WaXJBZGRyOworICAgIHBTRUNDb21wb25lbnQtPnByb2Nlc3NEYXRhW0lOUFVUX1BPUlRfSU5ERVhdLmFsbG9jU2l6ZSA9IHBWaWRlb0RlYy0+TUZDRGVjSW5wdXRCdWZmZXJbMF0uYnVmZmVyU2l6ZTsKKworICAgIFNFQ19PU0FMX01lbXNldChwU0VDQ29tcG9uZW50LT50aW1lU3RhbXAsIC0xOTc3MTAwMywgc2l6ZW9mKE9NWF9USUNLUykgKiBNQVhfVElNRVNUQU1QKTsKKyAgICBTRUNfT1NBTF9NZW1zZXQocFNFQ0NvbXBvbmVudC0+bkZsYWdzLCAwLCBzaXplb2YoT01YX1UzMikgKiBNQVhfRkxBR1MpOworICAgIHBNcGVnNERlYy0+aE1GQ01wZWc0SGFuZGxlLmluZGV4VGltZXN0YW1wID0gMDsKKyAgICBwTXBlZzREZWMtPmhNRkNNcGVnNEhhbmRsZS5vdXRwdXRJbmRleFRpbWVzdGFtcCA9IDA7CisKKyAgICBwU0VDQ29tcG9uZW50LT5nZXRBbGxEZWxheUJ1ZmZlciA9IE9NWF9GQUxTRTsKKworI2lmZGVmIFVTRV9BTkIKKyNpZiBkZWZpbmVkKFVTRV9DU0NfRklNQykgfHwgZGVmaW5lZChVU0VfQ1NDX0dTQ0FMRVIpCisgICAgaWYgKHBTRUNPdXRwdXRQb3J0LT5iSXNBTkJFbmFibGVkID09IE9NWF9UUlVFKSB7CisgICAgICAgIGNzY19tZXRob2QgPSBDU0NfTUVUSE9EX1BSRUZFUl9IVzsKKyAgICB9CisjZW5kaWYKKyNlbmRpZgorICAgIHBWaWRlb0RlYy0+Y3NjX2hhbmRsZSA9IGNzY19pbml0KCZjc2NfbWV0aG9kKTsKKyAgICBwVmlkZW9EZWMtPmNzY19zZXRfZm9ybWF0ID0gT01YX0ZBTFNFOworCitFWElUOgorICAgIEZ1bmN0aW9uT3V0KCk7CisKKyAgICByZXR1cm4gcmV0OworfQorCisvKiBNRkMgVGVybWluYXRlICovCitPTVhfRVJST1JUWVBFIFNFQ19NRkNfTXBlZzREZWNfVGVybWluYXRlKE9NWF9DT01QT05FTlRUWVBFICpwT01YQ29tcG9uZW50KQoreworICAgIE9NWF9FUlJPUlRZUEUgICAgICAgICAgcmV0ID0gT01YX0Vycm9yTm9uZTsKKyAgICBTRUNfT01YX0JBU0VDT01QT05FTlQgKnBTRUNDb21wb25lbnQgPSAoU0VDX09NWF9CQVNFQ09NUE9ORU5UICopcE9NWENvbXBvbmVudC0+cENvbXBvbmVudFByaXZhdGU7CisgICAgU0VDX09NWF9WSURFT0RFQ19DT01QT05FTlQgKnBWaWRlb0RlYyA9IChTRUNfT01YX1ZJREVPREVDX0NPTVBPTkVOVCAqKXBTRUNDb21wb25lbnQtPmhDb21wb25lbnRIYW5kbGU7CisgICAgU0VDX01QRUc0X0hBTkRMRSAgICAgICpwTXBlZzREZWMgPSBOVUxMOworICAgIE9NWF9IQU5ETEVUWVBFICAgICAgICAgaE1GQ0hhbmRsZSA9IE5VTEw7CisKKyAgICBGdW5jdGlvbkluKCk7CisKKyNpZmRlZiBDT05GSUdfTUZDX0ZQUworICAgIFNFQ19PU0FMX1BlcmZQcmludCgiW0RFQ10iLCAgUEVSRl9JRF9ERUMpOworICAgIFNFQ19PU0FMX1BlcmZQcmludCgiW0NTQ10iLCAgUEVSRl9JRF9DU0MpOworI2VuZGlmCisKKyAgICBwTXBlZzREZWMgPSAoU0VDX01QRUc0X0hBTkRMRSAqKSgoU0VDX09NWF9WSURFT0RFQ19DT01QT05FTlQgKilwU0VDQ29tcG9uZW50LT5oQ29tcG9uZW50SGFuZGxlKS0+aENvZGVjSGFuZGxlOworICAgIGhNRkNIYW5kbGUgPSBwTXBlZzREZWMtPmhNRkNNcGVnNEhhbmRsZS5oTUZDSGFuZGxlOworCisgICAgcE1wZWc0RGVjLT5oTUZDTXBlZzRIYW5kbGUucE1GQ1N0cmVhbUJ1ZmZlciAgICA9IE5VTEw7CisgICAgcE1wZWc0RGVjLT5oTUZDTXBlZzRIYW5kbGUucE1GQ1N0cmVhbVBoeUJ1ZmZlciA9IE5VTEw7CisgICAgcFNFQ0NvbXBvbmVudC0+cHJvY2Vzc0RhdGFbSU5QVVRfUE9SVF9JTkRFWF0uZGF0YUJ1ZmZlciA9IE5VTEw7CisgICAgcFNFQ0NvbXBvbmVudC0+cHJvY2Vzc0RhdGFbSU5QVVRfUE9SVF9JTkRFWF0uYWxsb2NTaXplID0gMDsKKworI2lmZGVmIE5PTkJMT0NLX01PREVfUFJPQ0VTUworICAgIGlmIChwVmlkZW9EZWMtPk5CRGVjVGhyZWFkLmhOQkRlY29kZVRocmVhZCAhPSBOVUxMKSB7CisgICAgICAgIHBWaWRlb0RlYy0+TkJEZWNUaHJlYWQuYkV4aXREZWNvZGVUaHJlYWQgPSBPTVhfVFJVRTsKKyAgICAgICAgU0VDX09TQUxfU2VtYXBob3JlUG9zdChwVmlkZW9EZWMtPk5CRGVjVGhyZWFkLmhEZWNGcmFtZVN0YXJ0KTsKKyAgICAgICAgU0VDX09TQUxfVGhyZWFkVGVybWluYXRlKHBWaWRlb0RlYy0+TkJEZWNUaHJlYWQuaE5CRGVjb2RlVGhyZWFkKTsKKyAgICAgICAgcFZpZGVvRGVjLT5OQkRlY1RocmVhZC5oTkJEZWNvZGVUaHJlYWQgPSBOVUxMOworICAgIH0KKworICAgIGlmKHBWaWRlb0RlYy0+TkJEZWNUaHJlYWQuaERlY0ZyYW1lRW5kICE9IE5VTEwpIHsKKyAgICAgICAgU0VDX09TQUxfU2VtYXBob3JlVGVybWluYXRlKHBWaWRlb0RlYy0+TkJEZWNUaHJlYWQuaERlY0ZyYW1lRW5kKTsKKyAgICAgICAgcFZpZGVvRGVjLT5OQkRlY1RocmVhZC5oRGVjRnJhbWVFbmQgPSBOVUxMOworICAgIH0KKworICAgIGlmKHBWaWRlb0RlYy0+TkJEZWNUaHJlYWQuaERlY0ZyYW1lU3RhcnQgIT0gTlVMTCkgeworICAgICAgICBTRUNfT1NBTF9TZW1hcGhvcmVUZXJtaW5hdGUocFZpZGVvRGVjLT5OQkRlY1RocmVhZC5oRGVjRnJhbWVTdGFydCk7CisgICAgICAgIHBWaWRlb0RlYy0+TkJEZWNUaHJlYWQuaERlY0ZyYW1lU3RhcnQgPSBOVUxMOworICAgIH0KKyNlbmRpZgorCisgICAgaWYgKGhNRkNIYW5kbGUgIT0gTlVMTCkgeworICAgICAgICBTc2JTaXBNZmNEZWNDbG9zZShoTUZDSGFuZGxlKTsKKyAgICAgICAgZ2hNRkNIYW5kbGUgPSBoTUZDSGFuZGxlID0gTlVMTDsKKyAgICAgICAgcE1wZWc0RGVjLT5oTUZDTXBlZzRIYW5kbGUuaE1GQ0hhbmRsZSA9IE5VTEw7CisgICAgfQorCisgICAgaWYgKHBWaWRlb0RlYy0+Y3NjX2hhbmRsZSAhPSBOVUxMKSB7CisgICAgICAgIGNzY19kZWluaXQocFZpZGVvRGVjLT5jc2NfaGFuZGxlKTsKKyAgICAgICAgcFZpZGVvRGVjLT5jc2NfaGFuZGxlID0gTlVMTDsKKyAgICB9CisKK0VYSVQ6CisgICAgRnVuY3Rpb25PdXQoKTsKKworICAgIHJldHVybiByZXQ7Cit9CisKK09NWF9FUlJPUlRZUEUgU0VDX01GQ19NcGVnNF9EZWNvZGVfTm9uYmxvY2soT01YX0NPTVBPTkVOVFRZUEUgKnBPTVhDb21wb25lbnQsIFNFQ19PTVhfREFUQSAqcElucHV0RGF0YSwgU0VDX09NWF9EQVRBICpwT3V0cHV0RGF0YSkKK3sKKyAgICBPTVhfRVJST1JUWVBFICAgICAgICAgICAgICAgcmV0ID0gT01YX0Vycm9yTm9uZTsKKyAgICBTRUNfT01YX0JBU0VDT01QT05FTlQgICAgICAqcFNFQ0NvbXBvbmVudCA9IChTRUNfT01YX0JBU0VDT01QT05FTlQgKilwT01YQ29tcG9uZW50LT5wQ29tcG9uZW50UHJpdmF0ZTsKKyAgICBTRUNfT01YX1ZJREVPREVDX0NPTVBPTkVOVCAqcFZpZGVvRGVjID0gKFNFQ19PTVhfVklERU9ERUNfQ09NUE9ORU5UICopcFNFQ0NvbXBvbmVudC0+aENvbXBvbmVudEhhbmRsZTsKKyAgICBTRUNfT01YX0JBU0VQT1JUICAgICAgICAgICAqcFNFQ0lucHV0UG9ydCA9ICZwU0VDQ29tcG9uZW50LT5wU0VDUG9ydFtJTlBVVF9QT1JUX0lOREVYXTsKKyAgICBTRUNfT01YX0JBU0VQT1JUICAgICAgICAgICAqcFNFQ091dHB1dFBvcnQgPSAmcFNFQ0NvbXBvbmVudC0+cFNFQ1BvcnRbT1VUUFVUX1BPUlRfSU5ERVhdOworICAgIFNFQ19NUEVHNF9IQU5ETEUgICAgICAgICAgICpwTXBlZzREZWMgPSAoU0VDX01QRUc0X0hBTkRMRSAqKSgoU0VDX09NWF9WSURFT0RFQ19DT01QT05FTlQgKilwU0VDQ29tcG9uZW50LT5oQ29tcG9uZW50SGFuZGxlKS0+aENvZGVjSGFuZGxlOworICAgIE9NWF9IQU5ETEVUWVBFICAgICAgICAgICAgICBoTUZDSGFuZGxlID0gcE1wZWc0RGVjLT5oTUZDTXBlZzRIYW5kbGUuaE1GQ0hhbmRsZTsKKyAgICBPTVhfVTMyICAgICAgICAgICAgICAgICAgICAgb25lRnJhbWVTaXplID0gcElucHV0RGF0YS0+ZGF0YUxlbjsKKyAgICBTU0JTSVBfTUZDX0RFQ19PVVRQVVRfSU5GTyAgb3V0cHV0SW5mbzsKKyAgICBPTVhfUzMyICAgICAgICAgICAgICAgICAgICAgY29uZmlnVmFsdWU7CisgICAgaW50ICAgICAgICAgICAgICAgICAgICAgICAgIGJ1ZldpZHRoOworICAgIGludCAgICAgICAgICAgICAgICAgICAgICAgICBidWZIZWlnaHQ7CisgICAgT01YX1UzMiAgICAgICAgICAgICAgICAgICAgIEZyYW1lQnVmZmVyWVNpemUgPSAwOworICAgIE9NWF9VMzIgICAgICAgICAgICAgICAgICAgICBGcmFtZUJ1ZmZlclVWU2l6ZSA9IDA7CisgICAgT01YX0JPT0wgICAgICAgICAgICAgICAgICAgIG91dHB1dERhdGFWYWxpZCA9IE9NWF9GQUxTRTsKKworICAgIEZ1bmN0aW9uSW4oKTsKKworICAgIGlmIChwTXBlZzREZWMtPmhNRkNNcGVnNEhhbmRsZS5iQ29uZmlndXJlZE1GQyA9PSBPTVhfRkFMU0UpIHsKKyAgICAgICAgU1NCU0lQX01GQ19DT0RFQ19UWVBFIE1GQ0NvZGVjVHlwZTsKKyAgICAgICAgaWYgKHBNcGVnNERlYy0+aE1GQ01wZWc0SGFuZGxlLmNvZGVjVHlwZSA9PSBDT0RFQ19UWVBFX01QRUc0KSB7CisgICAgICAgICAgICBpZiAoZ2JGSU1WMSkKKyAgICAgICAgICAgICAgICBNRkNDb2RlY1R5cGUgPSBGSU1WMV9ERUM7CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgTUZDQ29kZWNUeXBlID0gTVBFRzRfREVDOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgTUZDQ29kZWNUeXBlID0gSDI2M19ERUM7CisgICAgICAgIH0KKworICAgICAgICBpZiAoKG9uZUZyYW1lU2l6ZSA8PSAwKSAmJiAocElucHV0RGF0YS0+bkZsYWdzICYgT01YX0JVRkZFUkZMQUdfRU9TKSkgeworICAgICAgICAgICAgcE91dHB1dERhdGEtPnRpbWVTdGFtcCA9IHBJbnB1dERhdGEtPnRpbWVTdGFtcDsKKyAgICAgICAgICAgIHBPdXRwdXREYXRhLT5uRmxhZ3MgPSBwSW5wdXREYXRhLT5uRmxhZ3M7CisgICAgICAgICAgICByZXQgPSBPTVhfRXJyb3JOb25lOworICAgICAgICAgICAgZ290byBFWElUOworICAgICAgICB9CisKKyAgICAgICAgLyogU2V0IG1wZWc0IGRlYmxvY2tpbmcgZmlsdGVyIGVuYWJsZSAqLworICAgICAgICBjb25maWdWYWx1ZSA9IDE7CisgICAgICAgIFNzYlNpcE1mY0RlY1NldENvbmZpZyhoTUZDSGFuZGxlLCBNRkNfREVDX1NFVENPTkZfUE9TVF9FTkFCTEUsICZjb25maWdWYWx1ZSk7CisKKyAgICAgICAgaWYgKHBWaWRlb0RlYy0+YlRodW1ibmFpbE1vZGUgPT0gT01YX1RSVUUpIHsKKyAgICAgICAgICAgIGNvbmZpZ1ZhbHVlID0gMDsgICAgLy8gdGhlIG51bWJlciB0aGF0IHlvdSB3YW50IHRvIGRlbGF5CisgICAgICAgICAgICBTc2JTaXBNZmNEZWNTZXRDb25maWcoaE1GQ0hhbmRsZSwgTUZDX0RFQ19TRVRDT05GX0RJU1BMQVlfREVMQVksICZjb25maWdWYWx1ZSk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBjb25maWdWYWx1ZSA9IE1QRUc0X0RFQ19OVU1fT0ZfRVhUUkFfQlVGRkVSUzsKKyAgICAgICAgICAgIFNzYlNpcE1mY0RlY1NldENvbmZpZyhoTUZDSGFuZGxlLCBNRkNfREVDX1NFVENPTkZfRVhUUkFfQlVGRkVSX05VTSwgJmNvbmZpZ1ZhbHVlKTsKKyAgICAgICAgfQorCisgICAgICAgIFNzYlNpcE1mY0RlY1NldEluQnVmKHBNcGVnNERlYy0+aE1GQ01wZWc0SGFuZGxlLmhNRkNIYW5kbGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBNcGVnNERlYy0+aE1GQ01wZWc0SGFuZGxlLnBNRkNTdHJlYW1QaHlCdWZmZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBNcGVnNERlYy0+aE1GQ01wZWc0SGFuZGxlLnBNRkNTdHJlYW1CdWZmZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBTRUNDb21wb25lbnQtPnByb2Nlc3NEYXRhW0lOUFVUX1BPUlRfSU5ERVhdLmFsbG9jU2l6ZSk7CisKKyAgICAgICAgcE1wZWc0RGVjLT5oTUZDTXBlZzRIYW5kbGUucmV0dXJuQ29kZWMgPSBTc2JTaXBNZmNEZWNJbml0KGhNRkNIYW5kbGUsIE1GQ0NvZGVjVHlwZSwgb25lRnJhbWVTaXplKTsKKyAgICAgICAgaWYgKHBNcGVnNERlYy0+aE1GQ01wZWc0SGFuZGxlLnJldHVybkNvZGVjID09IE1GQ19SRVRfT0spIHsKKyAgICAgICAgICAgIFNTQlNJUF9NRkNfSU1HX1JFU09MVVRJT04gaW1nUmVzb2w7CisKKyAgICAgICAgICAgIGlmIChTc2JTaXBNZmNEZWNHZXRDb25maWcoaE1GQ0hhbmRsZSwgTUZDX0RFQ19HRVRDT05GX0JVRl9XSURUSF9IRUlHSFQsICZpbWdSZXNvbCkgIT0gTUZDX1JFVF9PSykgeworICAgICAgICAgICAgICAgIHJldCA9IE9NWF9FcnJvck1GQ0luaXQ7CisgICAgICAgICAgICAgICAgU0VDX09TQUxfTG9nKFNFQ19MT0dfRVJST1IsICIlczogU3NiU2lwTWZjRGVjR2V0Q29uZmlnIGZhaWxlZCIsIF9fRlVOQ1RJT05fXyk7CisgICAgICAgICAgICAgICAgZ290byBFWElUOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICAvKiogVXBkYXRlIEZyYW1lIFNpemUgKiovCisgICAgICAgICAgICBpZiAoKHBTRUNJbnB1dFBvcnQtPnBvcnREZWZpbml0aW9uLmZvcm1hdC52aWRlby5uRnJhbWVXaWR0aCAhPSAodW5zaWduZWQgaW50KWltZ1Jlc29sLndpZHRoKSB8fAorICAgICAgICAgICAgICAgIChwU0VDSW5wdXRQb3J0LT5wb3J0RGVmaW5pdGlvbi5mb3JtYXQudmlkZW8ubkZyYW1lSGVpZ2h0ICE9ICh1bnNpZ25lZCBpbnQpaW1nUmVzb2wuaGVpZ2h0KSkgeworICAgICAgICAgICAgICAgIC8qIGNoYW5nZSB3aWR0aCBhbmQgaGVpZ2h0IGluZm9ybWF0aW9uICovCisgICAgICAgICAgICAgICAgcFNFQ0lucHV0UG9ydC0+cG9ydERlZmluaXRpb24uZm9ybWF0LnZpZGVvLm5GcmFtZVdpZHRoID0gaW1nUmVzb2wud2lkdGg7CisgICAgICAgICAgICAgICAgcFNFQ0lucHV0UG9ydC0+cG9ydERlZmluaXRpb24uZm9ybWF0LnZpZGVvLm5GcmFtZUhlaWdodCA9IGltZ1Jlc29sLmhlaWdodDsKKyAgICAgICAgICAgICAgICBwU0VDSW5wdXRQb3J0LT5wb3J0RGVmaW5pdGlvbi5mb3JtYXQudmlkZW8ublN0cmlkZSAgICAgID0gKChpbWdSZXNvbC53aWR0aCArIDE1KSAmICh+MTUpKTsKKyAgICAgICAgICAgICAgICBwU0VDSW5wdXRQb3J0LT5wb3J0RGVmaW5pdGlvbi5mb3JtYXQudmlkZW8ublNsaWNlSGVpZ2h0ID0gKChpbWdSZXNvbC5oZWlnaHQgKyAxNSkgJiAofjE1KSk7CisKKyAgICAgICAgICAgICAgICBTRUNfVXBkYXRlRnJhbWVTaXplKHBPTVhDb21wb25lbnQpOworCisgICAgICAgICAgICAgICAgLyogU2VuZCBQb3J0IFNldHRpbmdzIGNoYW5nZWQgY2FsbCBiYWNrICovCisgICAgICAgICAgICAgICAgKCoocFNFQ0NvbXBvbmVudC0+cENhbGxiYWNrcy0+RXZlbnRIYW5kbGVyKSkKKyAgICAgICAgICAgICAgICAgICAgICAocE9NWENvbXBvbmVudCwKKyAgICAgICAgICAgICAgICAgICAgICAgcFNFQ0NvbXBvbmVudC0+Y2FsbGJhY2tEYXRhLAorICAgICAgICAgICAgICAgICAgICAgICBPTVhfRXZlbnRQb3J0U2V0dGluZ3NDaGFuZ2VkLCAvLyBUaGUgY29tbWFuZCB3YXMgY29tcGxldGVkCisgICAgICAgICAgICAgICAgICAgICAgIE9NWF9EaXJPdXRwdXQsIC8vIFRoaXMgaXMgdGhlIHBvcnQgaW5kZXgKKyAgICAgICAgICAgICAgICAgICAgICAgMCwKKyAgICAgICAgICAgICAgICAgICAgICAgTlVMTCk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIFNFQ19PU0FMX0xvZyhTRUNfTE9HX1RSQUNFLCAibkZyYW1lV2lkdGgoJWQpIG5GcmFtZUhlaWdodCglZCksIG5TdHJpZGUoJWQpLCBuU2xpY2VIZWlnaHQoJWQpIiwKKyAgICAgICAgICAgICAgICAgICAgcFNFQ0lucHV0UG9ydC0+cG9ydERlZmluaXRpb24uZm9ybWF0LnZpZGVvLm5GcmFtZVdpZHRoLCBwU0VDSW5wdXRQb3J0LT5wb3J0RGVmaW5pdGlvbi5mb3JtYXQudmlkZW8ubkZyYW1lSGVpZ2h0LAorICAgICAgICAgICAgICAgICAgICBwU0VDSW5wdXRQb3J0LT5wb3J0RGVmaW5pdGlvbi5mb3JtYXQudmlkZW8ublN0cmlkZSwgcFNFQ0lucHV0UG9ydC0+cG9ydERlZmluaXRpb24uZm9ybWF0LnZpZGVvLm5TbGljZUhlaWdodCk7CisKKyAgICAgICAgICAgIHBNcGVnNERlYy0+aE1GQ01wZWc0SGFuZGxlLmJDb25maWd1cmVkTUZDID0gT01YX1RSVUU7CisgICAgICAgICAgICBpZiAocE1wZWc0RGVjLT5oTUZDTXBlZzRIYW5kbGUuY29kZWNUeXBlID09IENPREVDX1RZUEVfTVBFRzQpIHsKKyAgICAgICAgICAgICAgICBwT3V0cHV0RGF0YS0+dGltZVN0YW1wID0gcElucHV0RGF0YS0+dGltZVN0YW1wOworICAgICAgICAgICAgICAgIHBPdXRwdXREYXRhLT5uRmxhZ3MgPSBwSW5wdXREYXRhLT5uRmxhZ3M7CisgICAgICAgICAgICAgICAgcmV0ID0gT01YX0Vycm9yTm9uZTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgcE91dHB1dERhdGEtPmRhdGFMZW4gPSAwOworICAgICAgICAgICAgICAgIHJldCA9IE9NWF9FcnJvcklucHV0RGF0YURlY29kZVlldDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGdvdG8gRVhJVDsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIFNFQ19PU0FMX0xvZyhTRUNfTE9HX0VSUk9SLCAiJXM6IFNzYlNpcE1mY0RlY0luaXQgZmFpbGVkIiwgX19GVU5DVElPTl9fKTsKKyAgICAgICAgICAgIHJldCA9IE9NWF9FcnJvck1GQ0luaXQ7ICAgIC8qIE9NWF9FcnJvclVuZGVmaW5lZCAqLworICAgICAgICAgICAgZ290byBFWElUOworICAgICAgICB9CisgICAgfQorCisjaWZuZGVmIEZVTExfRlJBTUVfU0VBUkNICisgICAgaWYgKChwSW5wdXREYXRhLT5uRmxhZ3MgJiBPTVhfQlVGRkVSRkxBR19FTkRPRkZSQU1FKSAmJgorICAgICAgICAocFNFQ0NvbXBvbmVudC0+YlVzZUZsYWdFT0YgPT0gT01YX0ZBTFNFKSkKKyAgICAgICAgcFNFQ0NvbXBvbmVudC0+YlVzZUZsYWdFT0YgPSBPTVhfVFJVRTsKKyNlbmRpZgorCisgICAgcFNFQ0NvbXBvbmVudC0+dGltZVN0YW1wW3BNcGVnNERlYy0+aE1GQ01wZWc0SGFuZGxlLmluZGV4VGltZXN0YW1wXSA9IHBJbnB1dERhdGEtPnRpbWVTdGFtcDsKKyAgICBwU0VDQ29tcG9uZW50LT5uRmxhZ3NbcE1wZWc0RGVjLT5oTUZDTXBlZzRIYW5kbGUuaW5kZXhUaW1lc3RhbXBdID0gcElucHV0RGF0YS0+bkZsYWdzOworCisgICAgaWYgKChwTXBlZzREZWMtPmhNRkNNcGVnNEhhbmRsZS5yZXR1cm5Db2RlYyA9PSBNRkNfUkVUX09LKSAmJgorICAgICAgICAocFZpZGVvRGVjLT5iRmlyc3RGcmFtZSA9PSBPTVhfRkFMU0UpKSB7CisgICAgICAgIFNTQlNJUF9NRkNfREVDX09VVEJVRl9TVEFUVVMgc3RhdHVzOworICAgICAgICBPTVhfUzMyIGluZGV4VGltZXN0YW1wID0gMDsKKworICAgICAgICAvKiB3YWl0IGZvciBtZmMgZGVjb2RlIGRvbmUgKi8KKyAgICAgICAgaWYgKHBWaWRlb0RlYy0+TkJEZWNUaHJlYWQuYkRlY29kZXJSdW4gPT0gT01YX1RSVUUpIHsKKyAgICAgICAgICAgIFNFQ19PU0FMX1NlbWFwaG9yZVdhaXQocFZpZGVvRGVjLT5OQkRlY1RocmVhZC5oRGVjRnJhbWVFbmQpOworICAgICAgICAgICAgcFZpZGVvRGVjLT5OQkRlY1RocmVhZC5iRGVjb2RlclJ1biA9IE9NWF9GQUxTRTsKKyAgICAgICAgfQorCisgICAgICAgIFNFQ19PU0FMX1NsZWVwTWlsbGlzZWMoMCk7CisgICAgICAgIHN0YXR1cyA9IFNzYlNpcE1mY0RlY0dldE91dEJ1ZihoTUZDSGFuZGxlLCAmb3V0cHV0SW5mbyk7CisgICAgICAgIGJ1ZldpZHRoID0gKG91dHB1dEluZm8uaW1nX3dpZHRoICsgMTUpICYgKH4xNSk7CisgICAgICAgIGJ1ZkhlaWdodCA9IChvdXRwdXRJbmZvLmltZ19oZWlnaHQgKyAxNSkgJiAofjE1KTsKKyAgICAgICAgRnJhbWVCdWZmZXJZU2l6ZSA9IEFMSUdOX1RPXzhLQihBTElHTl9UT18xMjhCKG91dHB1dEluZm8uaW1nX3dpZHRoKSAqIEFMSUdOX1RPXzMyQihvdXRwdXRJbmZvLmltZ19oZWlnaHQpKTsKKyAgICAgICAgRnJhbWVCdWZmZXJVVlNpemUgPSBBTElHTl9UT184S0IoQUxJR05fVE9fMTI4QihvdXRwdXRJbmZvLmltZ193aWR0aCkgKiBBTElHTl9UT18zMkIob3V0cHV0SW5mby5pbWdfaGVpZ2h0LzIpKTsKKworICAgICAgICBpZiAoKFNzYlNpcE1mY0RlY0dldENvbmZpZyhoTUZDSGFuZGxlLCBNRkNfREVDX0dFVENPTkZfRlJBTUVfVEFHLCAmaW5kZXhUaW1lc3RhbXApICE9IE1GQ19SRVRfT0spIHx8CisgICAgICAgICAgICAoKChpbmRleFRpbWVzdGFtcCA8IDApIHx8IChpbmRleFRpbWVzdGFtcCA+PSBNQVhfVElNRVNUQU1QKSkpKSB7CisgICAgICAgICAgICBwT3V0cHV0RGF0YS0+dGltZVN0YW1wID0gcElucHV0RGF0YS0+dGltZVN0YW1wOworICAgICAgICAgICAgcE91dHB1dERhdGEtPm5GbGFncyA9IHBJbnB1dERhdGEtPm5GbGFnczsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIC8qIEZvciB0aW1lc3RhbXAgY29ycmVjdGlvbi4gaWYgbWZjIHN1cHBvcnQgZnJhbWV0eXBlIGRldGVjdCAqLworICAgICAgICAgICAgU0VDX09TQUxfTG9nKFNFQ19MT0dfVFJBQ0UsICJkaXNwX3BpY19mcmFtZV90eXBlOiAlZCIsIG91dHB1dEluZm8uZGlzcF9waWNfZnJhbWVfdHlwZSk7CisjaWZkZWYgTkVFRF9USU1FU1RBTVBfUkVPUkRFUgorICAgICAgICAgICAgaWYgKG91dHB1dEluZm8uZGlzcF9waWNfZnJhbWVfdHlwZSA9PSBNRkNfRlJBTUVfVFlQRV9JX0ZSQU1FKSB7CisgICAgICAgICAgICAgICAgcE91dHB1dERhdGEtPnRpbWVTdGFtcCA9IHBTRUNDb21wb25lbnQtPnRpbWVTdGFtcFtpbmRleFRpbWVzdGFtcF07CisgICAgICAgICAgICAgICAgcE91dHB1dERhdGEtPm5GbGFncyA9IHBTRUNDb21wb25lbnQtPm5GbGFnc1tpbmRleFRpbWVzdGFtcF07CisgICAgICAgICAgICAgICAgcE1wZWc0RGVjLT5oTUZDTXBlZzRIYW5kbGUub3V0cHV0SW5kZXhUaW1lc3RhbXAgPSBpbmRleFRpbWVzdGFtcDsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgcE91dHB1dERhdGEtPnRpbWVTdGFtcCA9IHBTRUNDb21wb25lbnQtPnRpbWVTdGFtcFtwTXBlZzREZWMtPmhNRkNNcGVnNEhhbmRsZS5vdXRwdXRJbmRleFRpbWVzdGFtcF07CisgICAgICAgICAgICAgICAgcE91dHB1dERhdGEtPm5GbGFncyA9IHBTRUNDb21wb25lbnQtPm5GbGFnc1twTXBlZzREZWMtPmhNRkNNcGVnNEhhbmRsZS5vdXRwdXRJbmRleFRpbWVzdGFtcF07CisgICAgICAgICAgICB9CisjZWxzZQorICAgICAgICAgICAgcE91dHB1dERhdGEtPnRpbWVTdGFtcCA9IHBTRUNDb21wb25lbnQtPnRpbWVTdGFtcFtpbmRleFRpbWVzdGFtcF07CisgICAgICAgICAgICBwT3V0cHV0RGF0YS0+bkZsYWdzID0gcFNFQ0NvbXBvbmVudC0+bkZsYWdzW2luZGV4VGltZXN0YW1wXTsKKyNlbmRpZgorICAgICAgICB9CisKKyAgICAgICAgaWYgKChzdGF0dXMgPT0gTUZDX0dFVE9VVEJVRl9ESVNQTEFZX0RFQ09ESU5HKSB8fAorICAgICAgICAgICAgKHN0YXR1cyA9PSBNRkNfR0VUT1VUQlVGX0RJU1BMQVlfT05MWSkpIHsKKyAgICAgICAgICAgIG91dHB1dERhdGFWYWxpZCA9IE9NWF9UUlVFOworICAgICAgICAgICAgcE1wZWc0RGVjLT5oTUZDTXBlZzRIYW5kbGUub3V0cHV0SW5kZXhUaW1lc3RhbXArKzsKKyAgICAgICAgICAgIHBNcGVnNERlYy0+aE1GQ01wZWc0SGFuZGxlLm91dHB1dEluZGV4VGltZXN0YW1wICU9IE1BWF9USU1FU1RBTVA7CisgICAgICAgIH0KKyAgICAgICAgaWYgKHBPdXRwdXREYXRhLT5uRmxhZ3MgJiBPTVhfQlVGRkVSRkxBR19FT1MpCisgICAgICAgICAgICBvdXRwdXREYXRhVmFsaWQgPSBPTVhfRkFMU0U7CisKKyAgICAgICAgaWYgKChzdGF0dXMgPT0gTUZDX0dFVE9VVEJVRl9ESVNQTEFZX09OTFkpIHx8CisgICAgICAgICAgICAocFNFQ0NvbXBvbmVudC0+Z2V0QWxsRGVsYXlCdWZmZXIgPT0gT01YX1RSVUUpKQorICAgICAgICAgICAgcmV0ID0gT01YX0Vycm9ySW5wdXREYXRhRGVjb2RlWWV0OworCisgICAgICAgIGlmIChzdGF0dXMgPT0gTUZDX0dFVE9VVEJVRl9ERUNPRElOR19PTkxZKSB7CisgICAgICAgICAgICBpZiAoKChwSW5wdXREYXRhLT5uRmxhZ3MgJiBPTVhfQlVGRkVSRkxBR19FT1MpICE9IE9NWF9CVUZGRVJGTEFHX0VPUykgJiYKKyAgICAgICAgICAgICAgICAoKHBTRUNDb21wb25lbnQtPmJTYXZlRmxhZ0VPUyA9PSBPTVhfVFJVRSkgfHwgKHBTRUNDb21wb25lbnQtPmdldEFsbERlbGF5QnVmZmVyID09IE9NWF9UUlVFKSkpIHsKKyAgICAgICAgICAgICAgICBwSW5wdXREYXRhLT5uRmxhZ3MgfD0gT01YX0JVRkZFUkZMQUdfRU9TOworICAgICAgICAgICAgICAgIHBTRUNDb21wb25lbnQtPmdldEFsbERlbGF5QnVmZmVyID0gT01YX1RSVUU7CisgICAgICAgICAgICAgICAgcmV0ID0gT01YX0Vycm9ySW5wdXREYXRhRGVjb2RlWWV0OworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICByZXQgPSBPTVhfRXJyb3JOb25lOworICAgICAgICAgICAgfQorICAgICAgICAgICAgb3V0cHV0RGF0YVZhbGlkID0gT01YX0ZBTFNFOworICAgICAgICB9CisKKyNpZmRlZiBGVUxMX0ZSQU1FX1NFQVJDSAorICAgICAgICBpZiAoKChwSW5wdXREYXRhLT5uRmxhZ3MgJiBPTVhfQlVGRkVSRkxBR19FT1MpICE9IE9NWF9CVUZGRVJGTEFHX0VPUykgJiYKKyAgICAgICAgICAgIChwU0VDQ29tcG9uZW50LT5iU2F2ZUZsYWdFT1MgPT0gT01YX1RSVUUpKSB7CisgICAgICAgICAgICBwSW5wdXREYXRhLT5uRmxhZ3MgfD0gT01YX0JVRkZFUkZMQUdfRU9TOworICAgICAgICAgICAgcFNFQ0NvbXBvbmVudC0+Z2V0QWxsRGVsYXlCdWZmZXIgPSBPTVhfVFJVRTsKKyAgICAgICAgICAgIHJldCA9IE9NWF9FcnJvcklucHV0RGF0YURlY29kZVlldDsKKyAgICAgICAgfSBlbHNlCisjZW5kaWYKKyAgICAgICAgaWYgKChwSW5wdXREYXRhLT5uRmxhZ3MgJiBPTVhfQlVGRkVSRkxBR19FT1MpID09IE9NWF9CVUZGRVJGTEFHX0VPUykgeworICAgICAgICAgICAgcElucHV0RGF0YS0+bkZsYWdzID0gKHBPdXRwdXREYXRhLT5uRmxhZ3MgJiAofk9NWF9CVUZGRVJGTEFHX0VPUykpOworICAgICAgICAgICAgcFNFQ0NvbXBvbmVudC0+Z2V0QWxsRGVsYXlCdWZmZXIgPSBPTVhfVFJVRTsKKyAgICAgICAgICAgIHJldCA9IE9NWF9FcnJvcklucHV0RGF0YURlY29kZVlldDsKKyAgICAgICAgfSBlbHNlIGlmICgocE91dHB1dERhdGEtPm5GbGFncyAmIE9NWF9CVUZGRVJGTEFHX0VPUykgPT0gT01YX0JVRkZFUkZMQUdfRU9TKSB7CisgICAgICAgICAgICBwU0VDQ29tcG9uZW50LT5nZXRBbGxEZWxheUJ1ZmZlciA9IE9NWF9GQUxTRTsKKyAgICAgICAgICAgIHJldCA9IE9NWF9FcnJvck5vbmU7CisgICAgICAgIH0KKyAgICB9IGVsc2UgeworICAgICAgICBwT3V0cHV0RGF0YS0+dGltZVN0YW1wID0gcElucHV0RGF0YS0+dGltZVN0YW1wOworICAgICAgICBwT3V0cHV0RGF0YS0+bkZsYWdzID0gcElucHV0RGF0YS0+bkZsYWdzOworCisgICAgICAgIGlmICgocFNFQ0NvbXBvbmVudC0+YlNhdmVGbGFnRU9TID09IE9NWF9UUlVFKSB8fAorICAgICAgICAgICAgKHBTRUNDb21wb25lbnQtPmdldEFsbERlbGF5QnVmZmVyID09IE9NWF9UUlVFKSB8fAorICAgICAgICAgICAgKHBJbnB1dERhdGEtPm5GbGFncyAmIE9NWF9CVUZGRVJGTEFHX0VPUykpIHsKKyAgICAgICAgICAgIHBPdXRwdXREYXRhLT5uRmxhZ3MgfD0gT01YX0JVRkZFUkZMQUdfRU9TOworICAgICAgICAgICAgcFNFQ0NvbXBvbmVudC0+Z2V0QWxsRGVsYXlCdWZmZXIgPSBPTVhfRkFMU0U7CisgICAgICAgIH0KKworICAgICAgICBpZiAoKHBWaWRlb0RlYy0+YkZpcnN0RnJhbWUgPT0gT01YX1RSVUUpICYmCisgICAgICAgICAgICAoKHBPdXRwdXREYXRhLT5uRmxhZ3MgJiBPTVhfQlVGRkVSRkxBR19FT1MpID09IE9NWF9CVUZGRVJGTEFHX0VPUykgJiYKKyAgICAgICAgICAgICgocElucHV0RGF0YS0+bkZsYWdzICYgT01YX0JVRkZFUkZMQUdfQ09ERUNDT05GSUcpICE9IE9NWF9CVUZGRVJGTEFHX0NPREVDQ09ORklHKSkgeworICAgICAgICAgICAgcE91dHB1dERhdGEtPm5GbGFncyA9IChwT3V0cHV0RGF0YS0+bkZsYWdzICYgKH5PTVhfQlVGRkVSRkxBR19FT1MpKTsKKyAgICAgICAgfQorCisgICAgICAgIG91dHB1dERhdGFWYWxpZCA9IE9NWF9GQUxTRTsKKworICAgICAgICAvKiByZXQgPSBPTVhfRXJyb3JVbmRlZmluZWQ7ICovCisgICAgICAgIHJldCA9IE9NWF9FcnJvck5vbmU7CisgICAgfQorCisgICAgaWYgKHJldCA9PSBPTVhfRXJyb3JJbnB1dERhdGFEZWNvZGVZZXQpIHsKKyAgICAgICAgcFZpZGVvRGVjLT5NRkNEZWNJbnB1dEJ1ZmZlcltwVmlkZW9EZWMtPmluZGV4SW5wdXRCdWZmZXJdLmRhdGFTaXplID0gb25lRnJhbWVTaXplOworICAgICAgICBwVmlkZW9EZWMtPmluZGV4SW5wdXRCdWZmZXIrKzsKKyAgICAgICAgcFZpZGVvRGVjLT5pbmRleElucHV0QnVmZmVyICU9IE1GQ19JTlBVVF9CVUZGRVJfTlVNX01BWDsKKyAgICAgICAgcE1wZWc0RGVjLT5oTUZDTXBlZzRIYW5kbGUucE1GQ1N0cmVhbUJ1ZmZlciAgICA9IHBWaWRlb0RlYy0+TUZDRGVjSW5wdXRCdWZmZXJbcFZpZGVvRGVjLT5pbmRleElucHV0QnVmZmVyXS5WaXJBZGRyOworICAgICAgICBwTXBlZzREZWMtPmhNRkNNcGVnNEhhbmRsZS5wTUZDU3RyZWFtUGh5QnVmZmVyID0gcFZpZGVvRGVjLT5NRkNEZWNJbnB1dEJ1ZmZlcltwVmlkZW9EZWMtPmluZGV4SW5wdXRCdWZmZXJdLlBoeUFkZHI7CisgICAgICAgIHBTRUNDb21wb25lbnQtPnByb2Nlc3NEYXRhW0lOUFVUX1BPUlRfSU5ERVhdLmRhdGFCdWZmZXIgPSBwVmlkZW9EZWMtPk1GQ0RlY0lucHV0QnVmZmVyW3BWaWRlb0RlYy0+aW5kZXhJbnB1dEJ1ZmZlcl0uVmlyQWRkcjsKKyAgICAgICAgcFNFQ0NvbXBvbmVudC0+cHJvY2Vzc0RhdGFbSU5QVVRfUE9SVF9JTkRFWF0uYWxsb2NTaXplID0gcFZpZGVvRGVjLT5NRkNEZWNJbnB1dEJ1ZmZlcltwVmlkZW9EZWMtPmluZGV4SW5wdXRCdWZmZXJdLmJ1ZmZlclNpemU7CisgICAgICAgIG9uZUZyYW1lU2l6ZSA9IHBWaWRlb0RlYy0+TUZDRGVjSW5wdXRCdWZmZXJbcFZpZGVvRGVjLT5pbmRleElucHV0QnVmZmVyXS5kYXRhU2l6ZTsKKyAgICAgICAgLy9wSW5wdXREYXRhLT5kYXRhTGVuID0gb25lRnJhbWVTaXplOworICAgICAgICAvL3BJbnB1dERhdGEtPnJlbWFpbkRhdGFMZW4gPSBvbmVGcmFtZVNpemU7CisgICAgfQorCisgICAgaWYgKChDaGVja19TdHJlYW1fUHJlZml4Q29kZShwSW5wdXREYXRhLT5kYXRhQnVmZmVyLCBvbmVGcmFtZVNpemUsIHBNcGVnNERlYy0+aE1GQ01wZWc0SGFuZGxlLmNvZGVjVHlwZSkgPT0gT01YX1RSVUUpICYmCisgICAgICAgICgocE91dHB1dERhdGEtPm5GbGFncyAmIE9NWF9CVUZGRVJGTEFHX0VPUykgIT0gT01YX0JVRkZFUkZMQUdfRU9TKSkgeworICAgICAgICBpZiAoKHJldCAhPSBPTVhfRXJyb3JJbnB1dERhdGFEZWNvZGVZZXQpIHx8IChwU0VDQ29tcG9uZW50LT5nZXRBbGxEZWxheUJ1ZmZlciA9PSBPTVhfVFJVRSkpIHsKKyAgICAgICAgICAgIFNzYlNpcE1mY0RlY1NldENvbmZpZyhwTXBlZzREZWMtPmhNRkNNcGVnNEhhbmRsZS5oTUZDSGFuZGxlLCBNRkNfREVDX1NFVENPTkZfRlJBTUVfVEFHLCAmKHBNcGVnNERlYy0+aE1GQ01wZWc0SGFuZGxlLmluZGV4VGltZXN0YW1wKSk7CisgICAgICAgICAgICBwTXBlZzREZWMtPmhNRkNNcGVnNEhhbmRsZS5pbmRleFRpbWVzdGFtcCsrOworICAgICAgICAgICAgcE1wZWc0RGVjLT5oTUZDTXBlZzRIYW5kbGUuaW5kZXhUaW1lc3RhbXAgJT0gTUFYX1RJTUVTVEFNUDsKKyAgICAgICAgfQorCisgICAgICAgIFNzYlNpcE1mY0RlY1NldEluQnVmKHBNcGVnNERlYy0+aE1GQ01wZWc0SGFuZGxlLmhNRkNIYW5kbGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBNcGVnNERlYy0+aE1GQ01wZWc0SGFuZGxlLnBNRkNTdHJlYW1QaHlCdWZmZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBNcGVnNERlYy0+aE1GQ01wZWc0SGFuZGxlLnBNRkNTdHJlYW1CdWZmZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBTRUNDb21wb25lbnQtPnByb2Nlc3NEYXRhW0lOUFVUX1BPUlRfSU5ERVhdLmFsbG9jU2l6ZSk7CisKKyAgICAgICAgcFZpZGVvRGVjLT5NRkNEZWNJbnB1dEJ1ZmZlcltwVmlkZW9EZWMtPmluZGV4SW5wdXRCdWZmZXJdLmRhdGFTaXplID0gb25lRnJhbWVTaXplOworICAgICAgICBwVmlkZW9EZWMtPk5CRGVjVGhyZWFkLm9uZUZyYW1lU2l6ZSA9IG9uZUZyYW1lU2l6ZTsKKworICAgICAgICAvKiBtZmMgZGVjb2RlIHN0YXJ0ICovCisgICAgICAgIFNFQ19PU0FMX1NlbWFwaG9yZVBvc3QocFZpZGVvRGVjLT5OQkRlY1RocmVhZC5oRGVjRnJhbWVTdGFydCk7CisgICAgICAgIHBWaWRlb0RlYy0+TkJEZWNUaHJlYWQuYkRlY29kZXJSdW4gPSBPTVhfVFJVRTsKKyAgICAgICAgcE1wZWc0RGVjLT5oTUZDTXBlZzRIYW5kbGUucmV0dXJuQ29kZWMgPSBNRkNfUkVUX09LOworCisgICAgICAgIFNFQ19PU0FMX1NsZWVwTWlsbGlzZWMoMCk7CisKKyAgICAgICAgcFZpZGVvRGVjLT5pbmRleElucHV0QnVmZmVyKys7CisgICAgICAgIHBWaWRlb0RlYy0+aW5kZXhJbnB1dEJ1ZmZlciAlPSBNRkNfSU5QVVRfQlVGRkVSX05VTV9NQVg7CisgICAgICAgIHBNcGVnNERlYy0+aE1GQ01wZWc0SGFuZGxlLnBNRkNTdHJlYW1CdWZmZXIgICAgPSBwVmlkZW9EZWMtPk1GQ0RlY0lucHV0QnVmZmVyW3BWaWRlb0RlYy0+aW5kZXhJbnB1dEJ1ZmZlcl0uVmlyQWRkcjsKKyAgICAgICAgcE1wZWc0RGVjLT5oTUZDTXBlZzRIYW5kbGUucE1GQ1N0cmVhbVBoeUJ1ZmZlciA9IHBWaWRlb0RlYy0+TUZDRGVjSW5wdXRCdWZmZXJbcFZpZGVvRGVjLT5pbmRleElucHV0QnVmZmVyXS5QaHlBZGRyOworICAgICAgICBwU0VDQ29tcG9uZW50LT5wcm9jZXNzRGF0YVtJTlBVVF9QT1JUX0lOREVYXS5kYXRhQnVmZmVyID0gcFZpZGVvRGVjLT5NRkNEZWNJbnB1dEJ1ZmZlcltwVmlkZW9EZWMtPmluZGV4SW5wdXRCdWZmZXJdLlZpckFkZHI7CisgICAgICAgIHBTRUNDb21wb25lbnQtPnByb2Nlc3NEYXRhW0lOUFVUX1BPUlRfSU5ERVhdLmFsbG9jU2l6ZSA9IHBWaWRlb0RlYy0+TUZDRGVjSW5wdXRCdWZmZXJbcFZpZGVvRGVjLT5pbmRleElucHV0QnVmZmVyXS5idWZmZXJTaXplOworCisgICAgICAgIGlmICgocFZpZGVvRGVjLT5iRmlyc3RGcmFtZSA9PSBPTVhfVFJVRSkgJiYKKyAgICAgICAgICAgIChwU0VDQ29tcG9uZW50LT5iU2F2ZUZsYWdFT1MgPT0gT01YX1RSVUUpICYmCisgICAgICAgICAgICAob3V0cHV0RGF0YVZhbGlkID09IE9NWF9GQUxTRSkpIHsKKyAgICAgICAgICAgIHJldCA9IE9NWF9FcnJvcklucHV0RGF0YURlY29kZVlldDsKKyAgICAgICAgfQorCisgICAgICAgIHBWaWRlb0RlYy0+YkZpcnN0RnJhbWUgPSBPTVhfRkFMU0U7CisgICAgfSBlbHNlIHsKKyAgICAgICAgaWYgKHBTRUNDb21wb25lbnQtPmNoZWNrVGltZVN0YW1wLm5lZWRDaGVja1N0YXJ0VGltZVN0YW1wID09IE9NWF9UUlVFKQorICAgICAgICAgICAgcFNFQ0NvbXBvbmVudC0+Y2hlY2tUaW1lU3RhbXAubmVlZFNldFN0YXJ0VGltZVN0YW1wID0gT01YX1RSVUU7CisgICAgfQorCisgICAgLyoqIEZpbGwgT3V0cHV0IEJ1ZmZlciAqKi8KKyAgICBpZiAob3V0cHV0RGF0YVZhbGlkID09IE9NWF9UUlVFKSB7CisgICAgICAgIHZvaWQgKnBPdXRwdXRCdWYgPSAodm9pZCAqKXBPdXRwdXREYXRhLT5kYXRhQnVmZmVyOworICAgICAgICB2b2lkICpwU3JjQnVmWzNdID0ge05VTEwsIH07CisgICAgICAgIHZvaWQgKnBZVVZCdWZbM10gPSB7TlVMTCwgfTsKKyAgICAgICAgdW5zaWduZWQgaW50IGNzY19zcmNfY29sb3JfZm9ybWF0LCBjc2NfZHN0X2NvbG9yX2Zvcm1hdDsKKyAgICAgICAgQ1NDX01FVEhPRCBjc2NfbWV0aG9kID0gQ1NDX01FVEhPRF9TVzsKKyAgICAgICAgdW5zaWduZWQgaW50IGNhY2hlYWJsZSA9IDE7CisKKyAgICAgICAgaW50IGZyYW1lU2l6ZSA9IGJ1ZldpZHRoICogYnVmSGVpZ2h0OworICAgICAgICBpbnQgd2lkdGggPSBvdXRwdXRJbmZvLmltZ193aWR0aDsKKyAgICAgICAgaW50IGhlaWdodCA9IG91dHB1dEluZm8uaW1nX2hlaWdodDsKKyAgICAgICAgaW50IGltYWdlU2l6ZSA9IG91dHB1dEluZm8uaW1nX3dpZHRoICogb3V0cHV0SW5mby5pbWdfaGVpZ2h0OworCisgICAgICAgIHBTcmNCdWZbMF0gPSBvdXRwdXRJbmZvLllWaXJBZGRyOworICAgICAgICBwU3JjQnVmWzFdID0gb3V0cHV0SW5mby5DVmlyQWRkcjsKKworICAgICAgICBwWVVWQnVmWzBdICA9ICh1bnNpZ25lZCBjaGFyICopcE91dHB1dEJ1ZjsKKyAgICAgICAgcFlVVkJ1ZlsxXSAgPSAodW5zaWduZWQgY2hhciAqKXBPdXRwdXRCdWYgKyBpbWFnZVNpemU7CisgICAgICAgIHBZVVZCdWZbMl0gID0gKHVuc2lnbmVkIGNoYXIgKilwT3V0cHV0QnVmICsgaW1hZ2VTaXplICsgaW1hZ2VTaXplIC8gNDsKKyAgICAgICAgcE91dHB1dERhdGEtPmRhdGFMZW4gPSAoaW1hZ2VTaXplICogMykgLyAyOworCisjaWZkZWYgVVNFX0FOQgorICAgICAgICBpZiAocFNFQ091dHB1dFBvcnQtPmJJc0FOQkVuYWJsZWQgPT0gT01YX1RSVUUpIHsKKyAgICAgICAgICAgIE9NWF9VMzIgc3RyaWRlOworICAgICAgICAgICAgU0VDX09TQUxfTG9ja0FOQihwT3V0cHV0RGF0YS0+ZGF0YUJ1ZmZlciwgd2lkdGgsIGhlaWdodCwgcFNFQ0NvbXBvbmVudC0+cFNFQ1BvcnRbT1VUUFVUX1BPUlRfSU5ERVhdLnBvcnREZWZpbml0aW9uLmZvcm1hdC52aWRlby5lQ29sb3JGb3JtYXQsICZzdHJpZGUsIHBZVVZCdWYpOworICAgICAgICAgICAgd2lkdGggPSBzdHJpZGU7CisgICAgICAgICAgICBwT3V0cHV0RGF0YS0+ZGF0YUxlbiA9IHNpemVvZih2b2lkICopOworICAgICAgICB9CisjZW5kaWYKKyAgICAgICAgaWYgKChwVmlkZW9EZWMtPmJUaHVtYm5haWxNb2RlID09IE9NWF9GQUxTRSkgJiYKKyAgICAgICAgICAgIChwU0VDT3V0cHV0UG9ydC0+cG9ydERlZmluaXRpb24uZm9ybWF0LnZpZGVvLmVDb2xvckZvcm1hdCA9PSBPTVhfU0VDX0NPTE9SX0Zvcm1hdE5WMTJUUGh5c2ljYWxBZGRyZXNzKSkgeworICAgICAgICAgICAgLyogaWYgdXNlIFBvc3QgY29weSBhZGRyZXNzIHN0cnVjdHVyZSAqLworICAgICAgICAgICAgU0VDX09TQUxfTWVtY3B5KHBZVVZCdWZbMF0sICYob3V0cHV0SW5mby5ZUGh5QWRkciksIHNpemVvZihvdXRwdXRJbmZvLllQaHlBZGRyKSk7CisgICAgICAgICAgICBTRUNfT1NBTF9NZW1jcHkoKHVuc2lnbmVkIGNoYXIgKilwWVVWQnVmWzBdICsgKHNpemVvZih2b2lkICopICogMSksICYob3V0cHV0SW5mby5DUGh5QWRkciksIHNpemVvZihvdXRwdXRJbmZvLkNQaHlBZGRyKSk7CisgICAgICAgICAgICBTRUNfT1NBTF9NZW1jcHkoKHVuc2lnbmVkIGNoYXIgKilwWVVWQnVmWzBdICsgKHNpemVvZih2b2lkICopICogMiksICYob3V0cHV0SW5mby5ZVmlyQWRkciksIHNpemVvZihvdXRwdXRJbmZvLllWaXJBZGRyKSk7CisgICAgICAgICAgICBTRUNfT1NBTF9NZW1jcHkoKHVuc2lnbmVkIGNoYXIgKilwWVVWQnVmWzBdICsgKHNpemVvZih2b2lkICopICogMyksICYob3V0cHV0SW5mby5DVmlyQWRkciksIHNpemVvZihvdXRwdXRJbmZvLkNWaXJBZGRyKSk7CisgICAgICAgICAgICBwT3V0cHV0RGF0YS0+ZGF0YUxlbiA9IChvdXRwdXRJbmZvLmltZ193aWR0aCAqIG91dHB1dEluZm8uaW1nX2hlaWdodCAqIDMpIC8gMjsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIFNFQ19PU0FMX0xvZyhTRUNfTE9HX1RSQUNFLCAiWVVWNDIwIG91dCBmb3IgVGh1bWJuYWlsTW9kZSIpOworI2lmZGVmIENPTkZJR19NRkNfRlBTCisgICAgICAgICAgICBTRUNfT1NBTF9QZXJmU3RhcnQoUEVSRl9JRF9DU0MpOworI2VuZGlmCisgICAgICAgICAgICBzd2l0Y2ggKHBTRUNDb21wb25lbnQtPnBTRUNQb3J0W09VVFBVVF9QT1JUX0lOREVYXS5wb3J0RGVmaW5pdGlvbi5mb3JtYXQudmlkZW8uZUNvbG9yRm9ybWF0KSB7CisgICAgICAgICAgICBjYXNlIE9NWF9TRUNfQ09MT1JfRm9ybWF0TlYxMlRpbGVkOgorICAgICAgICAgICAgICAgIFNFQ19PU0FMX01lbWNweShwT3V0cHV0QnVmLCBvdXRwdXRJbmZvLllWaXJBZGRyLCBGcmFtZUJ1ZmZlcllTaXplKTsKKyAgICAgICAgICAgICAgICBTRUNfT1NBTF9NZW1jcHkoKHVuc2lnbmVkIGNoYXIgKilwT3V0cHV0QnVmICsgRnJhbWVCdWZmZXJZU2l6ZSwgb3V0cHV0SW5mby5DVmlyQWRkciwgRnJhbWVCdWZmZXJVVlNpemUpOworICAgICAgICAgICAgICAgIHBPdXRwdXREYXRhLT5kYXRhTGVuID0gRnJhbWVCdWZmZXJZU2l6ZSArIEZyYW1lQnVmZmVyVVZTaXplOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBPTVhfQ09MT1JfRm9ybWF0WVVWNDIwU2VtaVBsYW5hcjoKKyAgICAgICAgICAgIGNhc2UgT01YX1NFQ19DT0xPUl9Gb3JtYXRBTkJZVVY0MjBTZW1pUGxhbmFyOgorICAgICAgICAgICAgICAgIGNzY19zcmNfY29sb3JfZm9ybWF0ID0gb214XzJfaGFsX3BpeGVsX2Zvcm1hdCgodW5zaWduZWQgaW50KU9NWF9TRUNfQ09MT1JfRm9ybWF0TlYxMlRpbGVkKTsKKyAgICAgICAgICAgICAgICBjc2NfZHN0X2NvbG9yX2Zvcm1hdCA9IG9teF8yX2hhbF9waXhlbF9mb3JtYXQoKHVuc2lnbmVkIGludClPTVhfQ09MT1JfRm9ybWF0WVVWNDIwU2VtaVBsYW5hcik7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIE9NWF9DT0xPUl9Gb3JtYXRZVVY0MjBQbGFuYXI6CisgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgIGNzY19zcmNfY29sb3JfZm9ybWF0ID0gb214XzJfaGFsX3BpeGVsX2Zvcm1hdCgodW5zaWduZWQgaW50KU9NWF9TRUNfQ09MT1JfRm9ybWF0TlYxMlRpbGVkKTsKKyAgICAgICAgICAgICAgICBjc2NfZHN0X2NvbG9yX2Zvcm1hdCA9IG9teF8yX2hhbF9waXhlbF9mb3JtYXQoKHVuc2lnbmVkIGludClPTVhfQ09MT1JfRm9ybWF0WVVWNDIwUGxhbmFyKTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgY3NjX2dldF9tZXRob2QocFZpZGVvRGVjLT5jc2NfaGFuZGxlLCAmY3NjX21ldGhvZCk7CisjaWZkZWYgVVNFX0NTQ19GSU1DCisgICAgICAgICAgICBpZiAoKHBTRUNPdXRwdXRQb3J0LT5iSXNBTkJFbmFibGVkID09IE9NWF9UUlVFKSAmJiAoY3NjX21ldGhvZCA9PSBDU0NfTUVUSE9EX0hXKSkgeworICAgICAgICAgICAgICAgIFNFQ19PU0FMX0dldFBoeXNBTkIocE91dHB1dERhdGEtPmRhdGFCdWZmZXIsIHBZVVZCdWYpOworICAgICAgICAgICAgICAgIHBTcmNCdWZbMF0gPSBvdXRwdXRJbmZvLllQaHlBZGRyOworICAgICAgICAgICAgICAgIHBTcmNCdWZbMV0gPSBvdXRwdXRJbmZvLkNQaHlBZGRyOworICAgICAgICAgICAgfQorI2VuZGlmCisgICAgICAgICAgICBpZiAocFZpZGVvRGVjLT5jc2Nfc2V0X2Zvcm1hdCA9PSBPTVhfRkFMU0UpIHsKKyAgICAgICAgICAgICAgICBjc2Nfc2V0X3NyY19mb3JtYXQoCisgICAgICAgICAgICAgICAgICAgIHBWaWRlb0RlYy0+Y3NjX2hhbmRsZSwgIC8qIGhhbmRsZSAqLworICAgICAgICAgICAgICAgICAgICB3aWR0aCwgICAgICAgICAgICAgICAgICAvKiB3aWR0aCAqLworICAgICAgICAgICAgICAgICAgICBoZWlnaHQsICAgICAgICAgICAgICAgICAvKiBoZWlnaHQgKi8KKyAgICAgICAgICAgICAgICAgICAgMCwgICAgICAgICAgICAgICAgICAgICAgLyogY3JvcF9sZWZ0ICovCisgICAgICAgICAgICAgICAgICAgIDAsICAgICAgICAgICAgICAgICAgICAgIC8qIGNyb3BfcmlnaHQgKi8KKyAgICAgICAgICAgICAgICAgICAgd2lkdGgsICAgICAgICAgICAgICAgICAgLyogY3JvcF93aWR0aCAqLworICAgICAgICAgICAgICAgICAgICBoZWlnaHQsICAgICAgICAgICAgICAgICAvKiBjcm9wX2hlaWdodCAqLworICAgICAgICAgICAgICAgICAgICBjc2Nfc3JjX2NvbG9yX2Zvcm1hdCwgICAvKiBjb2xvcl9mb3JtYXQgKi8KKyAgICAgICAgICAgICAgICAgICAgY2FjaGVhYmxlKTsgICAgICAgICAgICAgLyogY2FjaGVhYmxlICovCisgICAgICAgICAgICAgICAgY3NjX3NldF9kc3RfZm9ybWF0KAorICAgICAgICAgICAgICAgICAgICBwVmlkZW9EZWMtPmNzY19oYW5kbGUsICAvKiBoYW5kbGUgKi8KKyAgICAgICAgICAgICAgICAgICAgd2lkdGgsICAgICAgICAgICAgICAgICAgLyogd2lkdGggKi8KKyAgICAgICAgICAgICAgICAgICAgaGVpZ2h0LCAgICAgICAgICAgICAgICAgLyogaGVpZ2h0ICovCisgICAgICAgICAgICAgICAgICAgIDAsICAgICAgICAgICAgICAgICAgICAgIC8qIGNyb3BfbGVmdCAqLworICAgICAgICAgICAgICAgICAgICAwLCAgICAgICAgICAgICAgICAgICAgICAvKiBjcm9wX3JpZ2h0ICovCisgICAgICAgICAgICAgICAgICAgIHdpZHRoLCAgICAgICAgICAgICAgICAgIC8qIGNyb3Bfd2lkdGggKi8KKyAgICAgICAgICAgICAgICAgICAgaGVpZ2h0LCAgICAgICAgICAgICAgICAgLyogY3JvcF9oZWlnaHQgKi8KKyAgICAgICAgICAgICAgICAgICAgY3NjX2RzdF9jb2xvcl9mb3JtYXQsICAgLyogY29sb3JfZm9ybWF0ICovCisgICAgICAgICAgICAgICAgICAgIGNhY2hlYWJsZSk7ICAgICAgICAgICAgIC8qIGNhY2hlYWJsZSAqLworICAgICAgICAgICAgICAgIHBWaWRlb0RlYy0+Y3NjX3NldF9mb3JtYXQgPSBPTVhfVFJVRTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgY3NjX3NldF9zcmNfYnVmZmVyKAorICAgICAgICAgICAgICAgIHBWaWRlb0RlYy0+Y3NjX2hhbmRsZSwgIC8qIGhhbmRsZSAqLworICAgICAgICAgICAgICAgIHBTcmNCdWZbMF0sICAgICAgICAgICAgIC8qIHkgYWRkciAqLworICAgICAgICAgICAgICAgIHBTcmNCdWZbMV0sICAgICAgICAgICAgIC8qIHUgYWRkciBvciB1diBhZGRyICovCisgICAgICAgICAgICAgICAgcFNyY0J1ZlsyXSwgICAgICAgICAgICAgLyogdiBhZGRyIG9yIG5vbmUgKi8KKyAgICAgICAgICAgICAgICAwKTsgICAgICAgICAgICAgICAgICAgICAvKiBpb24gZmQgKi8KKyAgICAgICAgICAgIGNzY19zZXRfZHN0X2J1ZmZlcigKKyAgICAgICAgICAgICAgICBwVmlkZW9EZWMtPmNzY19oYW5kbGUsICAvKiBoYW5kbGUgKi8KKyAgICAgICAgICAgICAgICBwWVVWQnVmWzBdLCAgICAgICAgICAgICAvKiB5IGFkZHIgKi8KKyAgICAgICAgICAgICAgICBwWVVWQnVmWzFdLCAgICAgICAgICAgICAvKiB1IGFkZHIgb3IgdXYgYWRkciAqLworICAgICAgICAgICAgICAgIHBZVVZCdWZbMl0sICAgICAgICAgICAgIC8qIHYgYWRkciBvciBub25lICovCisgICAgICAgICAgICAgICAgMCk7ICAgICAgICAgICAgICAgICAgICAgLyogaW9uIGZkICovCisgICAgICAgICAgICBjc2NfY29udmVydChwVmlkZW9EZWMtPmNzY19oYW5kbGUpOworCisjaWZkZWYgQ09ORklHX01GQ19GUFMKKyAgICAgICAgICAgIFNFQ19PU0FMX1BlcmZTdG9wKFBFUkZfSURfQ1NDKTsKKyNlbmRpZgorICAgICAgICB9CisjaWZkZWYgVVNFX0FOQgorICAgICAgICBpZiAocFNFQ091dHB1dFBvcnQtPmJJc0FOQkVuYWJsZWQgPT0gT01YX1RSVUUpIHsKKyAgICAgICAgICAgIFNFQ19PU0FMX1VubG9ja0FOQihwT3V0cHV0RGF0YS0+ZGF0YUJ1ZmZlcik7CisgICAgICAgIH0KKyNlbmRpZgorICAgIH0gZWxzZSB7CisgICAgICAgIHBPdXRwdXREYXRhLT5kYXRhTGVuID0gMDsKKyAgICB9CisKK0VYSVQ6CisgICAgRnVuY3Rpb25PdXQoKTsKKworICAgIHJldHVybiByZXQ7Cit9CisKK09NWF9FUlJPUlRZUEUgU0VDX01GQ19NcGVnNF9EZWNvZGVfQmxvY2soT01YX0NPTVBPTkVOVFRZUEUgKnBPTVhDb21wb25lbnQsIFNFQ19PTVhfREFUQSAqcElucHV0RGF0YSwgU0VDX09NWF9EQVRBICpwT3V0cHV0RGF0YSkKK3sKKyAgICBPTVhfRVJST1JUWVBFICAgICAgICAgICAgICAgcmV0ID0gT01YX0Vycm9yTm9uZTsKKyAgICBTRUNfT01YX0JBU0VDT01QT05FTlQgICAgICAqcFNFQ0NvbXBvbmVudCA9IChTRUNfT01YX0JBU0VDT01QT05FTlQgKilwT01YQ29tcG9uZW50LT5wQ29tcG9uZW50UHJpdmF0ZTsKKyAgICBTRUNfT01YX1ZJREVPREVDX0NPTVBPTkVOVCAqcFZpZGVvRGVjID0gKFNFQ19PTVhfVklERU9ERUNfQ09NUE9ORU5UICopcFNFQ0NvbXBvbmVudC0+aENvbXBvbmVudEhhbmRsZTsKKyAgICBTRUNfT01YX0JBU0VQT1JUICAgICAgICAgICAqcFNFQ0lucHV0UG9ydCA9ICZwU0VDQ29tcG9uZW50LT5wU0VDUG9ydFtJTlBVVF9QT1JUX0lOREVYXTsKKyAgICBTRUNfT01YX0JBU0VQT1JUICAgICAgICAgICAqcFNFQ091dHB1dFBvcnQgPSAmcFNFQ0NvbXBvbmVudC0+cFNFQ1BvcnRbT1VUUFVUX1BPUlRfSU5ERVhdOworICAgIFNFQ19NUEVHNF9IQU5ETEUgICAgICAgICAgICpwTXBlZzREZWMgPSAoU0VDX01QRUc0X0hBTkRMRSAqKSgoU0VDX09NWF9WSURFT0RFQ19DT01QT05FTlQgKilwU0VDQ29tcG9uZW50LT5oQ29tcG9uZW50SGFuZGxlKS0+aENvZGVjSGFuZGxlOworICAgIE9NWF9IQU5ETEVUWVBFICAgICAgICAgICAgICBoTUZDSGFuZGxlID0gcE1wZWc0RGVjLT5oTUZDTXBlZzRIYW5kbGUuaE1GQ0hhbmRsZTsKKyAgICBPTVhfVTMyICAgICAgICAgICAgICAgICAgICAgb25lRnJhbWVTaXplID0gcElucHV0RGF0YS0+ZGF0YUxlbjsKKyAgICBTU0JTSVBfTUZDX0RFQ19PVVRQVVRfSU5GTyAgb3V0cHV0SW5mbzsKKyAgICBPTVhfUzMyICAgICAgICAgICAgICAgICAgICAgY29uZmlnVmFsdWU7CisgICAgT01YX1MzMiAgICAgICAgICAgICAgICAgICAgIHJldHVybkNvZGVjOworICAgIGludCAgICAgICAgICAgICAgICAgICAgICAgICBidWZXaWR0aDsKKyAgICBpbnQgICAgICAgICAgICAgICAgICAgICAgICAgYnVmSGVpZ2h0OworICAgIE9NWF9VMzIgICAgICAgICAgICAgICAgICAgICBGcmFtZUJ1ZmZlcllTaXplOworICAgIE9NWF9VMzIgICAgICAgICAgICAgICAgICAgICBGcmFtZUJ1ZmZlclVWU2l6ZTsKKworICAgIEZ1bmN0aW9uSW4oKTsKKworICAgIGlmIChwTXBlZzREZWMtPmhNRkNNcGVnNEhhbmRsZS5iQ29uZmlndXJlZE1GQyA9PSBPTVhfRkFMU0UpIHsKKyAgICAgICAgU1NCU0lQX01GQ19DT0RFQ19UWVBFIE1GQ0NvZGVjVHlwZTsKKyAgICAgICAgaWYgKHBNcGVnNERlYy0+aE1GQ01wZWc0SGFuZGxlLmNvZGVjVHlwZSA9PSBDT0RFQ19UWVBFX01QRUc0KSB7CisgICAgICAgICAgICBpZiAoZ2JGSU1WMSkKKyAgICAgICAgICAgICAgICBNRkNDb2RlY1R5cGUgPSBGSU1WMV9ERUM7CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgTUZDQ29kZWNUeXBlID0gTVBFRzRfREVDOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgTUZDQ29kZWNUeXBlID0gSDI2M19ERUM7CisgICAgICAgIH0KKworICAgICAgICBpZiAoKG9uZUZyYW1lU2l6ZSA8PSAwKSAmJiAocElucHV0RGF0YS0+bkZsYWdzICYgT01YX0JVRkZFUkZMQUdfRU9TKSkgeworICAgICAgICAgICAgcE91dHB1dERhdGEtPnRpbWVTdGFtcCA9IHBJbnB1dERhdGEtPnRpbWVTdGFtcDsKKyAgICAgICAgICAgIHBPdXRwdXREYXRhLT5uRmxhZ3MgPSBwSW5wdXREYXRhLT5uRmxhZ3M7CisgICAgICAgICAgICByZXQgPSBPTVhfRXJyb3JOb25lOworICAgICAgICAgICAgZ290byBFWElUOworICAgICAgICB9CisKKyAgICAgICAgLyogU2V0IG1wZWc0IGRlYmxvY2tpbmcgZmlsdGVyIGVuYWJsZSAqLworICAgICAgICBjb25maWdWYWx1ZSA9IDE7CisgICAgICAgIFNzYlNpcE1mY0RlY1NldENvbmZpZyhoTUZDSGFuZGxlLCBNRkNfREVDX1NFVENPTkZfUE9TVF9FTkFCTEUsICZjb25maWdWYWx1ZSk7CisKKyAgICAgICAgaWYgKHBWaWRlb0RlYy0+YlRodW1ibmFpbE1vZGUgPT0gT01YX1RSVUUpIHsKKyAgICAgICAgICAgIGNvbmZpZ1ZhbHVlID0gMDsgICAgLy8gdGhlIG51bWJlciB0aGF0IHlvdSB3YW50IHRvIGRlbGF5CisgICAgICAgICAgICBTc2JTaXBNZmNEZWNTZXRDb25maWcoaE1GQ0hhbmRsZSwgTUZDX0RFQ19TRVRDT05GX0RJU1BMQVlfREVMQVksICZjb25maWdWYWx1ZSk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBjb25maWdWYWx1ZSA9IE1QRUc0X0RFQ19OVU1fT0ZfRVhUUkFfQlVGRkVSUzsKKyAgICAgICAgICAgIFNzYlNpcE1mY0RlY1NldENvbmZpZyhoTUZDSGFuZGxlLCBNRkNfREVDX1NFVENPTkZfRVhUUkFfQlVGRkVSX05VTSwgJmNvbmZpZ1ZhbHVlKTsKKyAgICAgICAgfQorCisgICAgICAgIHJldHVybkNvZGVjID0gU3NiU2lwTWZjRGVjSW5pdChoTUZDSGFuZGxlLCBNRkNDb2RlY1R5cGUsIG9uZUZyYW1lU2l6ZSk7CisgICAgICAgIGlmIChyZXR1cm5Db2RlYyA9PSBNRkNfUkVUX09LKSB7CisgICAgICAgICAgICBTU0JTSVBfTUZDX0lNR19SRVNPTFVUSU9OIGltZ1Jlc29sOworCisgICAgICAgICAgICBpZiAoU3NiU2lwTWZjRGVjR2V0Q29uZmlnKGhNRkNIYW5kbGUsIE1GQ19ERUNfR0VUQ09ORl9CVUZfV0lEVEhfSEVJR0hULCAmaW1nUmVzb2wpICE9IE1GQ19SRVRfT0spIHsKKyAgICAgICAgICAgICAgICByZXQgPSBPTVhfRXJyb3JNRkNJbml0OworICAgICAgICAgICAgICAgIFNFQ19PU0FMX0xvZyhTRUNfTE9HX0VSUk9SLCAiJXM6IFNzYlNpcE1mY0RlY0dldENvbmZpZyBmYWlsZWQiLCBfX0ZVTkNUSU9OX18pOworICAgICAgICAgICAgICAgIGdvdG8gRVhJVDsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgLyoqIFVwZGF0ZSBGcmFtZSBTaXplICoqLworICAgICAgICAgICAgaWYgKChwU0VDSW5wdXRQb3J0LT5wb3J0RGVmaW5pdGlvbi5mb3JtYXQudmlkZW8ubkZyYW1lV2lkdGggIT0gKHVuc2lnbmVkIGludClpbWdSZXNvbC53aWR0aCkgfHwKKyAgICAgICAgICAgICAgIChwU0VDSW5wdXRQb3J0LT5wb3J0RGVmaW5pdGlvbi5mb3JtYXQudmlkZW8ubkZyYW1lSGVpZ2h0ICE9ICh1bnNpZ25lZCBpbnQpaW1nUmVzb2wuaGVpZ2h0KSkgeworICAgICAgICAgICAgICAgIC8qIGNoYW5nZSB3aWR0aCBhbmQgaGVpZ2h0IGluZm9ybWF0aW9uICovCisgICAgICAgICAgICAgICAgcFNFQ0lucHV0UG9ydC0+cG9ydERlZmluaXRpb24uZm9ybWF0LnZpZGVvLm5GcmFtZVdpZHRoID0gaW1nUmVzb2wud2lkdGg7CisgICAgICAgICAgICAgICAgcFNFQ0lucHV0UG9ydC0+cG9ydERlZmluaXRpb24uZm9ybWF0LnZpZGVvLm5GcmFtZUhlaWdodCA9IGltZ1Jlc29sLmhlaWdodDsKKyAgICAgICAgICAgICAgICBwU0VDSW5wdXRQb3J0LT5wb3J0RGVmaW5pdGlvbi5mb3JtYXQudmlkZW8ublN0cmlkZSAgICAgID0gKChpbWdSZXNvbC53aWR0aCArIDE1KSAmICh+MTUpKTsKKyAgICAgICAgICAgICAgICBwU0VDSW5wdXRQb3J0LT5wb3J0RGVmaW5pdGlvbi5mb3JtYXQudmlkZW8ublNsaWNlSGVpZ2h0ID0gKChpbWdSZXNvbC5oZWlnaHQgKyAxNSkgJiAofjE1KSk7CisKKyAgICAgICAgICAgICAgICBTRUNfVXBkYXRlRnJhbWVTaXplKHBPTVhDb21wb25lbnQpOworCisgICAgICAgICAgICAgICAgLyogU2VuZCBQb3J0IFNldHRpbmdzIGNoYW5nZWQgY2FsbCBiYWNrICovCisgICAgICAgICAgICAgICAgKCoocFNFQ0NvbXBvbmVudC0+cENhbGxiYWNrcy0+RXZlbnRIYW5kbGVyKSkKKyAgICAgICAgICAgICAgICAgICAgICAocE9NWENvbXBvbmVudCwKKyAgICAgICAgICAgICAgICAgICAgICAgcFNFQ0NvbXBvbmVudC0+Y2FsbGJhY2tEYXRhLAorICAgICAgICAgICAgICAgICAgICAgICBPTVhfRXZlbnRQb3J0U2V0dGluZ3NDaGFuZ2VkLCAvLyBUaGUgY29tbWFuZCB3YXMgY29tcGxldGVkCisgICAgICAgICAgICAgICAgICAgICAgIE9NWF9EaXJPdXRwdXQsIC8vIFRoaXMgaXMgdGhlIHBvcnQgaW5kZXgKKyAgICAgICAgICAgICAgICAgICAgICAgMCwKKyAgICAgICAgICAgICAgICAgICAgICAgTlVMTCk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIFNFQ19PU0FMX0xvZyhTRUNfTE9HX1RSQUNFLCAibkZyYW1lV2lkdGgoJWQpIG5GcmFtZUhlaWdodCglZCksIG5TdHJpZGUoJWQpLCBuU2xpY2VIZWlnaHQoJWQpIiwKKyAgICAgICAgICAgICAgICAgICAgcFNFQ0lucHV0UG9ydC0+cG9ydERlZmluaXRpb24uZm9ybWF0LnZpZGVvLm5GcmFtZVdpZHRoLCAgcFNFQ0lucHV0UG9ydC0+cG9ydERlZmluaXRpb24uZm9ybWF0LnZpZGVvLm5GcmFtZUhlaWdodCwKKyAgICAgICAgICAgICAgICAgICAgcFNFQ0lucHV0UG9ydC0+cG9ydERlZmluaXRpb24uZm9ybWF0LnZpZGVvLm5TdHJpZGUsIHBTRUNJbnB1dFBvcnQtPnBvcnREZWZpbml0aW9uLmZvcm1hdC52aWRlby5uU2xpY2VIZWlnaHQpOworCisgICAgICAgICAgICBwTXBlZzREZWMtPmhNRkNNcGVnNEhhbmRsZS5iQ29uZmlndXJlZE1GQyA9IE9NWF9UUlVFOworICAgICAgICAgICAgaWYgKHBNcGVnNERlYy0+aE1GQ01wZWc0SGFuZGxlLmNvZGVjVHlwZSA9PSBDT0RFQ19UWVBFX01QRUc0KSB7CisgICAgICAgICAgICAgICAgcE91dHB1dERhdGEtPnRpbWVTdGFtcCA9IHBJbnB1dERhdGEtPnRpbWVTdGFtcDsKKyAgICAgICAgICAgICAgICBwT3V0cHV0RGF0YS0+bkZsYWdzID0gcElucHV0RGF0YS0+bkZsYWdzOworICAgICAgICAgICAgICAgIHJldCA9IE9NWF9FcnJvck5vbmU7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIHBPdXRwdXREYXRhLT5kYXRhTGVuID0gMDsKKyAgICAgICAgICAgICAgICByZXQgPSBPTVhfRXJyb3JJbnB1dERhdGFEZWNvZGVZZXQ7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBnb3RvIEVYSVQ7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBTRUNfT1NBTF9Mb2coU0VDX0xPR19FUlJPUiwgIiVzOiBTc2JTaXBNZmNEZWNJbml0IGZhaWxlZCIsIF9fRlVOQ1RJT05fXyk7CisgICAgICAgICAgICByZXQgPSBPTVhfRXJyb3JNRkNJbml0OyAgICAvKiBPTVhfRXJyb3JVbmRlZmluZWQgKi8KKyAgICAgICAgICAgIGdvdG8gRVhJVDsKKyAgICAgICAgfQorICAgIH0KKworI2lmbmRlZiBGVUxMX0ZSQU1FX1NFQVJDSAorICAgIGlmICgocElucHV0RGF0YS0+bkZsYWdzICYgT01YX0JVRkZFUkZMQUdfRU5ET0ZGUkFNRSkgJiYKKyAgICAgICAgKHBTRUNDb21wb25lbnQtPmJVc2VGbGFnRU9GID09IE9NWF9GQUxTRSkpCisgICAgICAgIHBTRUNDb21wb25lbnQtPmJVc2VGbGFnRU9GID0gT01YX1RSVUU7CisjZW5kaWYKKworICAgIGlmIChDaGVja19TdHJlYW1fUHJlZml4Q29kZShwSW5wdXREYXRhLT5kYXRhQnVmZmVyLCBwSW5wdXREYXRhLT5kYXRhTGVuLCBwTXBlZzREZWMtPmhNRkNNcGVnNEhhbmRsZS5jb2RlY1R5cGUpID09IE9NWF9UUlVFKSB7CisgICAgICAgIHBTRUNDb21wb25lbnQtPnRpbWVTdGFtcFtwTXBlZzREZWMtPmhNRkNNcGVnNEhhbmRsZS5pbmRleFRpbWVzdGFtcF0gPSBwSW5wdXREYXRhLT50aW1lU3RhbXA7CisgICAgICAgIHBTRUNDb21wb25lbnQtPm5GbGFnc1twTXBlZzREZWMtPmhNRkNNcGVnNEhhbmRsZS5pbmRleFRpbWVzdGFtcF0gPSBwSW5wdXREYXRhLT5uRmxhZ3M7CisgICAgICAgIFNzYlNpcE1mY0RlY1NldENvbmZpZyhoTUZDSGFuZGxlLCBNRkNfREVDX1NFVENPTkZfRlJBTUVfVEFHLCAmKHBNcGVnNERlYy0+aE1GQ01wZWc0SGFuZGxlLmluZGV4VGltZXN0YW1wKSk7CisKKyAgICAgICAgcmV0dXJuQ29kZWMgPSBTc2JTaXBNZmNEZWNFeGUoaE1GQ0hhbmRsZSwgb25lRnJhbWVTaXplKTsKKyAgICB9IGVsc2UgeworICAgICAgICBpZiAocFNFQ0NvbXBvbmVudC0+Y2hlY2tUaW1lU3RhbXAubmVlZENoZWNrU3RhcnRUaW1lU3RhbXAgPT0gT01YX1RSVUUpCisgICAgICAgICAgICBwU0VDQ29tcG9uZW50LT5jaGVja1RpbWVTdGFtcC5uZWVkU2V0U3RhcnRUaW1lU3RhbXAgPSBPTVhfVFJVRTsKKworICAgICAgICBwT3V0cHV0RGF0YS0+dGltZVN0YW1wID0gcElucHV0RGF0YS0+dGltZVN0YW1wOworICAgICAgICBwT3V0cHV0RGF0YS0+bkZsYWdzID0gcElucHV0RGF0YS0+bkZsYWdzOworICAgICAgICByZXR1cm5Db2RlYyA9IE1GQ19SRVRfT0s7CisgICAgICAgIGdvdG8gRVhJVDsKKyAgICB9CisKKyAgICBpZiAocmV0dXJuQ29kZWMgPT0gTUZDX1JFVF9PSykgeworICAgICAgICBTU0JTSVBfTUZDX0RFQ19PVVRCVUZfU1RBVFVTIHN0YXR1czsKKyAgICAgICAgT01YX1MzMiBpbmRleFRpbWVzdGFtcCA9IDA7CisKKyAgICAgICAgc3RhdHVzID0gU3NiU2lwTWZjRGVjR2V0T3V0QnVmKGhNRkNIYW5kbGUsICZvdXRwdXRJbmZvKTsKKyAgICAgICAgYnVmV2lkdGggPSAgKG91dHB1dEluZm8uaW1nX3dpZHRoICsgMTUpICYgKH4xNSk7CisgICAgICAgIGJ1ZkhlaWdodCA9ICAob3V0cHV0SW5mby5pbWdfaGVpZ2h0ICsgMTUpICYgKH4xNSk7CisgICAgICAgIEZyYW1lQnVmZmVyWVNpemUgPSBBTElHTl9UT184S0IoQUxJR05fVE9fMTI4QihvdXRwdXRJbmZvLmltZ193aWR0aCkgKiBBTElHTl9UT18zMkIob3V0cHV0SW5mby5pbWdfaGVpZ2h0KSk7CisgICAgICAgIEZyYW1lQnVmZmVyVVZTaXplID0gQUxJR05fVE9fOEtCKEFMSUdOX1RPXzEyOEIob3V0cHV0SW5mby5pbWdfd2lkdGgpICogQUxJR05fVE9fMzJCKG91dHB1dEluZm8uaW1nX2hlaWdodC8yKSk7CisKKyAgICAgICAgaWYgKHN0YXR1cyAhPSBNRkNfR0VUT1VUQlVGX0RJU1BMQVlfT05MWSkgeworICAgICAgICAgICAgcE1wZWc0RGVjLT5oTUZDTXBlZzRIYW5kbGUuaW5kZXhUaW1lc3RhbXArKzsKKyAgICAgICAgICAgIHBNcGVnNERlYy0+aE1GQ01wZWc0SGFuZGxlLmluZGV4VGltZXN0YW1wICU9IE1BWF9USU1FU1RBTVA7CisgICAgICAgIH0KKworICAgICAgICBpZiAoKFNzYlNpcE1mY0RlY0dldENvbmZpZyhoTUZDSGFuZGxlLCBNRkNfREVDX0dFVENPTkZfRlJBTUVfVEFHLCAmaW5kZXhUaW1lc3RhbXApICE9IE1GQ19SRVRfT0spIHx8CisgICAgICAgICAgICAoKChpbmRleFRpbWVzdGFtcCA8IDApIHx8IChpbmRleFRpbWVzdGFtcCA+PSBNQVhfVElNRVNUQU1QKSkpKSB7CisgICAgICAgICAgICBwT3V0cHV0RGF0YS0+dGltZVN0YW1wID0gcElucHV0RGF0YS0+dGltZVN0YW1wOworICAgICAgICAgICAgcE91dHB1dERhdGEtPm5GbGFncyA9IHBJbnB1dERhdGEtPm5GbGFnczsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIC8qIEZvciB0aW1lc3RhbXAgY29ycmVjdGlvbi4gaWYgbWZjIHN1cHBvcnQgZnJhbWV0eXBlIGRldGVjdCAqLworICAgICAgICAgICAgU0VDX09TQUxfTG9nKFNFQ19MT0dfVFJBQ0UsICJkaXNwX3BpY19mcmFtZV90eXBlOiAlZCIsIG91dHB1dEluZm8uZGlzcF9waWNfZnJhbWVfdHlwZSk7CisjaWZkZWYgTkVFRF9USU1FU1RBTVBfUkVPUkRFUgorICAgICAgICAgICAgaWYgKG91dHB1dEluZm8uZGlzcF9waWNfZnJhbWVfdHlwZSA9PSBNRkNfRlJBTUVfVFlQRV9JX0ZSQU1FKSB7CisgICAgICAgICAgICAgICAgcE91dHB1dERhdGEtPnRpbWVTdGFtcCA9IHBTRUNDb21wb25lbnQtPnRpbWVTdGFtcFtpbmRleFRpbWVzdGFtcF07CisgICAgICAgICAgICAgICAgcE91dHB1dERhdGEtPm5GbGFncyA9IHBTRUNDb21wb25lbnQtPm5GbGFnc1tpbmRleFRpbWVzdGFtcF07CisgICAgICAgICAgICAgICAgcE1wZWc0RGVjLT5oTUZDTXBlZzRIYW5kbGUub3V0cHV0SW5kZXhUaW1lc3RhbXAgPSBpbmRleFRpbWVzdGFtcDsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgcE91dHB1dERhdGEtPnRpbWVTdGFtcCA9IHBTRUNDb21wb25lbnQtPnRpbWVTdGFtcFtwTXBlZzREZWMtPmhNRkNNcGVnNEhhbmRsZS5vdXRwdXRJbmRleFRpbWVzdGFtcF07CisgICAgICAgICAgICAgICAgcE91dHB1dERhdGEtPm5GbGFncyA9IHBTRUNDb21wb25lbnQtPm5GbGFnc1twTXBlZzREZWMtPmhNRkNNcGVnNEhhbmRsZS5vdXRwdXRJbmRleFRpbWVzdGFtcF07CisgICAgICAgICAgICB9CisjZWxzZQorICAgICAgICAgICAgcE91dHB1dERhdGEtPnRpbWVTdGFtcCA9IHBTRUNDb21wb25lbnQtPnRpbWVTdGFtcFtpbmRleFRpbWVzdGFtcF07CisgICAgICAgICAgICBwT3V0cHV0RGF0YS0+bkZsYWdzID0gcFNFQ0NvbXBvbmVudC0+bkZsYWdzW2luZGV4VGltZXN0YW1wXTsKKyNlbmRpZgorICAgICAgICB9CisKKyAgICAgICAgaWYgKChzdGF0dXMgPT0gTUZDX0dFVE9VVEJVRl9ESVNQTEFZX0RFQ09ESU5HKSB8fAorICAgICAgICAgICAgKHN0YXR1cyA9PSBNRkNfR0VUT1VUQlVGX0RJU1BMQVlfT05MWSkpIHsKKyAgICAgICAgICAgIC8qKiBGaWxsIE91dHB1dCBCdWZmZXIgKiovCisgICAgICAgICAgICB2b2lkICpwT3V0cHV0QnVmID0gKHZvaWQgKilwT3V0cHV0RGF0YS0+ZGF0YUJ1ZmZlcjsKKyAgICAgICAgICAgIHZvaWQgKnBTcmNCdWZbM10gPSB7TlVMTCwgfTsKKyAgICAgICAgICAgIHZvaWQgKnBZVVZCdWZbM10gPSB7TlVMTCwgfTsKKyAgICAgICAgICAgIHVuc2lnbmVkIGludCBjc2Nfc3JjX2NvbG9yX2Zvcm1hdCwgY3NjX2RzdF9jb2xvcl9mb3JtYXQ7CisgICAgICAgICAgICBDU0NfTUVUSE9EIGNzY19tZXRob2QgPSBDU0NfTUVUSE9EX1NXOworICAgICAgICAgICAgdW5zaWduZWQgaW50IGNhY2hlYWJsZSA9IDE7CisKKyAgICAgICAgICAgIGludCBmcmFtZVNpemUgPSBidWZXaWR0aCAqIGJ1ZkhlaWdodDsKKyAgICAgICAgICAgIGludCB3aWR0aCA9IG91dHB1dEluZm8uaW1nX3dpZHRoOworICAgICAgICAgICAgaW50IGhlaWdodCA9IG91dHB1dEluZm8uaW1nX2hlaWdodDsKKyAgICAgICAgICAgIGludCBpbWFnZVNpemUgPSBvdXRwdXRJbmZvLmltZ193aWR0aCAqIG91dHB1dEluZm8uaW1nX2hlaWdodDsKKworICAgICAgICAgICAgcFNyY0J1ZlswXSA9IG91dHB1dEluZm8uWVZpckFkZHI7CisgICAgICAgICAgICBwU3JjQnVmWzFdID0gb3V0cHV0SW5mby5DVmlyQWRkcjsKKworICAgICAgICAgICAgcFlVVkJ1ZlswXSAgPSAodW5zaWduZWQgY2hhciAqKXBPdXRwdXRCdWY7CisgICAgICAgICAgICBwWVVWQnVmWzFdICA9ICh1bnNpZ25lZCBjaGFyICopcE91dHB1dEJ1ZiArIGltYWdlU2l6ZTsKKyAgICAgICAgICAgIHBZVVZCdWZbMl0gID0gKHVuc2lnbmVkIGNoYXIgKilwT3V0cHV0QnVmICsgaW1hZ2VTaXplICsgaW1hZ2VTaXplIC8gNDsKKyAgICAgICAgICAgIHBPdXRwdXREYXRhLT5kYXRhTGVuID0gKGltYWdlU2l6ZSAqIDMpIC8gMjsKKworI2lmZGVmIFVTRV9BTkIKKyAgICAgICAgICAgIGlmIChwU0VDT3V0cHV0UG9ydC0+YklzQU5CRW5hYmxlZCA9PSBPTVhfVFJVRSkgeworICAgICAgICAgICAgICAgIE9NWF9VMzIgc3RyaWRlOworICAgICAgICAgICAgICAgIFNFQ19PU0FMX0xvY2tBTkIocE91dHB1dERhdGEtPmRhdGFCdWZmZXIsIHdpZHRoLCBoZWlnaHQsIHBTRUNDb21wb25lbnQtPnBTRUNQb3J0W09VVFBVVF9QT1JUX0lOREVYXS5wb3J0RGVmaW5pdGlvbi5mb3JtYXQudmlkZW8uZUNvbG9yRm9ybWF0LCAmc3RyaWRlLCBwWVVWQnVmKTsKKyAgICAgICAgICAgICAgICB3aWR0aCA9IHN0cmlkZTsKKyAgICAgICAgICAgICAgICBwT3V0cHV0RGF0YS0+ZGF0YUxlbiA9IHNpemVvZih2b2lkICopOworICAgICAgICAgICAgfQorI2VuZGlmCisgICAgICAgICAgICBpZiAoKHBWaWRlb0RlYy0+YlRodW1ibmFpbE1vZGUgPT0gT01YX0ZBTFNFKSAmJgorICAgICAgICAgICAgICAgIChwU0VDT3V0cHV0UG9ydC0+cG9ydERlZmluaXRpb24uZm9ybWF0LnZpZGVvLmVDb2xvckZvcm1hdCA9PSBPTVhfU0VDX0NPTE9SX0Zvcm1hdE5WMTJUUGh5c2ljYWxBZGRyZXNzKSkgeworICAgICAgICAgICAgICAgIC8qIGlmIHVzZSBQb3N0IGNvcHkgYWRkcmVzcyBzdHJ1Y3R1cmUgKi8KKyAgICAgICAgICAgICAgICBTRUNfT1NBTF9NZW1jcHkocFlVVkJ1ZlswXSwgJihvdXRwdXRJbmZvLllQaHlBZGRyKSwgc2l6ZW9mKG91dHB1dEluZm8uWVBoeUFkZHIpKTsKKyAgICAgICAgICAgICAgICBTRUNfT1NBTF9NZW1jcHkoKHVuc2lnbmVkIGNoYXIgKilwWVVWQnVmWzBdICsgKHNpemVvZih2b2lkICopICogMSksICYob3V0cHV0SW5mby5DUGh5QWRkciksIHNpemVvZihvdXRwdXRJbmZvLkNQaHlBZGRyKSk7CisgICAgICAgICAgICAgICAgU0VDX09TQUxfTWVtY3B5KCh1bnNpZ25lZCBjaGFyICopcFlVVkJ1ZlswXSArIChzaXplb2Yodm9pZCAqKSAqIDIpLCAmKG91dHB1dEluZm8uWVZpckFkZHIpLCBzaXplb2Yob3V0cHV0SW5mby5ZVmlyQWRkcikpOworICAgICAgICAgICAgICAgIFNFQ19PU0FMX01lbWNweSgodW5zaWduZWQgY2hhciAqKXBZVVZCdWZbMF0gKyAoc2l6ZW9mKHZvaWQgKikgKiAzKSwgJihvdXRwdXRJbmZvLkNWaXJBZGRyKSwgc2l6ZW9mKG91dHB1dEluZm8uQ1ZpckFkZHIpKTsKKyAgICAgICAgICAgICAgICBwT3V0cHV0RGF0YS0+ZGF0YUxlbiA9IChvdXRwdXRJbmZvLmltZ193aWR0aCAqIG91dHB1dEluZm8uaW1nX2hlaWdodCAqIDMpIC8gMjsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgU0VDX09TQUxfTG9nKFNFQ19MT0dfVFJBQ0UsICJZVVY0MjAgb3V0IGZvciBUaHVtYm5haWxNb2RlIik7CisjaWZkZWYgQ09ORklHX01GQ19GUFMKKyAgICAgICAgICAgICAgICBTRUNfT1NBTF9QZXJmU3RhcnQoUEVSRl9JRF9DU0MpOworI2VuZGlmCisgICAgICAgICAgICAgICAgc3dpdGNoIChwU0VDQ29tcG9uZW50LT5wU0VDUG9ydFtPVVRQVVRfUE9SVF9JTkRFWF0ucG9ydERlZmluaXRpb24uZm9ybWF0LnZpZGVvLmVDb2xvckZvcm1hdCkgeworICAgICAgICAgICAgICAgIGNhc2UgT01YX1NFQ19DT0xPUl9Gb3JtYXROVjEyVGlsZWQ6CisgICAgICAgICAgICAgICAgICAgIFNFQ19PU0FMX01lbWNweShwT3V0cHV0QnVmLCBvdXRwdXRJbmZvLllWaXJBZGRyLCBGcmFtZUJ1ZmZlcllTaXplKTsKKyAgICAgICAgICAgICAgICAgICAgU0VDX09TQUxfTWVtY3B5KCh1bnNpZ25lZCBjaGFyICopcE91dHB1dEJ1ZiArIEZyYW1lQnVmZmVyWVNpemUsIG91dHB1dEluZm8uQ1ZpckFkZHIsIEZyYW1lQnVmZmVyVVZTaXplKTsKKyAgICAgICAgICAgICAgICAgICAgcE91dHB1dERhdGEtPmRhdGFMZW4gPSBGcmFtZUJ1ZmZlcllTaXplICsgRnJhbWVCdWZmZXJVVlNpemU7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIGNhc2UgT01YX0NPTE9SX0Zvcm1hdFlVVjQyMFNlbWlQbGFuYXI6CisgICAgICAgICAgICAgICAgY2FzZSBPTVhfU0VDX0NPTE9SX0Zvcm1hdEFOQllVVjQyMFNlbWlQbGFuYXI6CisgICAgICAgICAgICAgICAgICAgIGNzY19zcmNfY29sb3JfZm9ybWF0ID0gb214XzJfaGFsX3BpeGVsX2Zvcm1hdCgodW5zaWduZWQgaW50KU9NWF9TRUNfQ09MT1JfRm9ybWF0TlYxMlRpbGVkKTsKKyAgICAgICAgICAgICAgICAgICAgY3NjX2RzdF9jb2xvcl9mb3JtYXQgPSBvbXhfMl9oYWxfcGl4ZWxfZm9ybWF0KCh1bnNpZ25lZCBpbnQpT01YX0NPTE9SX0Zvcm1hdFlVVjQyMFNlbWlQbGFuYXIpOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBjYXNlIE9NWF9DT0xPUl9Gb3JtYXRZVVY0MjBQbGFuYXI6CisgICAgICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICAgICAgY3NjX3NyY19jb2xvcl9mb3JtYXQgPSBvbXhfMl9oYWxfcGl4ZWxfZm9ybWF0KCh1bnNpZ25lZCBpbnQpT01YX1NFQ19DT0xPUl9Gb3JtYXROVjEyVGlsZWQpOworICAgICAgICAgICAgICAgICAgICBjc2NfZHN0X2NvbG9yX2Zvcm1hdCA9IG9teF8yX2hhbF9waXhlbF9mb3JtYXQoKHVuc2lnbmVkIGludClPTVhfQ09MT1JfRm9ybWF0WVVWNDIwUGxhbmFyKTsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgY3NjX2dldF9tZXRob2QocFZpZGVvRGVjLT5jc2NfaGFuZGxlLCAmY3NjX21ldGhvZCk7CisjaWZkZWYgVVNFX0NTQ19GSU1DCisgICAgICAgICAgICAgICAgaWYgKChwU0VDT3V0cHV0UG9ydC0+YklzQU5CRW5hYmxlZCA9PSBPTVhfVFJVRSkgJiYgKGNzY19tZXRob2QgPT0gQ1NDX01FVEhPRF9IVykpIHsKKyAgICAgICAgICAgICAgICAgICAgU0VDX09TQUxfR2V0UGh5c0FOQihwT3V0cHV0RGF0YS0+ZGF0YUJ1ZmZlciwgcFlVVkJ1Zik7CisgICAgICAgICAgICAgICAgICAgIHBTcmNCdWZbMF0gPSBvdXRwdXRJbmZvLllQaHlBZGRyOworICAgICAgICAgICAgICAgICAgICBwU3JjQnVmWzFdID0gb3V0cHV0SW5mby5DUGh5QWRkcjsKKyAgICAgICAgICAgICAgICB9CisjZW5kaWYKKyAgICAgICAgICAgICAgICBpZiAocFZpZGVvRGVjLT5jc2Nfc2V0X2Zvcm1hdCA9PSBPTVhfRkFMU0UpIHsKKyAgICAgICAgICAgICAgICAgICAgY3NjX3NldF9zcmNfZm9ybWF0KAorICAgICAgICAgICAgICAgICAgICAgICAgcFZpZGVvRGVjLT5jc2NfaGFuZGxlLCAgLyogaGFuZGxlICovCisgICAgICAgICAgICAgICAgICAgICAgICB3aWR0aCwgICAgICAgICAgICAgICAgICAvKiB3aWR0aCAqLworICAgICAgICAgICAgICAgICAgICAgICAgaGVpZ2h0LCAgICAgICAgICAgICAgICAgLyogaGVpZ2h0ICovCisgICAgICAgICAgICAgICAgICAgICAgICAwLCAgICAgICAgICAgICAgICAgICAgICAvKiBjcm9wX2xlZnQgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgIDAsICAgICAgICAgICAgICAgICAgICAgIC8qIGNyb3BfcmlnaHQgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgIHdpZHRoLCAgICAgICAgICAgICAgICAgIC8qIGNyb3Bfd2lkdGggKi8KKyAgICAgICAgICAgICAgICAgICAgICAgIGhlaWdodCwgICAgICAgICAgICAgICAgIC8qIGNyb3BfaGVpZ2h0ICovCisgICAgICAgICAgICAgICAgICAgICAgICBjc2Nfc3JjX2NvbG9yX2Zvcm1hdCwgICAvKiBjb2xvcl9mb3JtYXQgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgIGNhY2hlYWJsZSk7ICAgICAgICAgICAgIC8qIGNhY2hlYWJsZSAqLworICAgICAgICAgICAgICAgICAgICBjc2Nfc2V0X2RzdF9mb3JtYXQoCisgICAgICAgICAgICAgICAgICAgICAgICBwVmlkZW9EZWMtPmNzY19oYW5kbGUsICAvKiBoYW5kbGUgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgIHdpZHRoLCAgICAgICAgICAgICAgICAgIC8qIHdpZHRoICovCisgICAgICAgICAgICAgICAgICAgICAgICBoZWlnaHQsICAgICAgICAgICAgICAgICAvKiBoZWlnaHQgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgIDAsICAgICAgICAgICAgICAgICAgICAgIC8qIGNyb3BfbGVmdCAqLworICAgICAgICAgICAgICAgICAgICAgICAgMCwgICAgICAgICAgICAgICAgICAgICAgLyogY3JvcF9yaWdodCAqLworICAgICAgICAgICAgICAgICAgICAgICAgd2lkdGgsICAgICAgICAgICAgICAgICAgLyogY3JvcF93aWR0aCAqLworICAgICAgICAgICAgICAgICAgICAgICAgaGVpZ2h0LCAgICAgICAgICAgICAgICAgLyogY3JvcF9oZWlnaHQgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgIGNzY19kc3RfY29sb3JfZm9ybWF0LCAgIC8qIGNvbG9yX2Zvcm1hdCAqLworICAgICAgICAgICAgICAgICAgICAgICAgY2FjaGVhYmxlKTsgICAgICAgICAgICAgLyogY2FjaGVhYmxlICovCisgICAgICAgICAgICAgICAgICAgIHBWaWRlb0RlYy0+Y3NjX3NldF9mb3JtYXQgPSBPTVhfVFJVRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBjc2Nfc2V0X3NyY19idWZmZXIoCisgICAgICAgICAgICAgICAgICAgIHBWaWRlb0RlYy0+Y3NjX2hhbmRsZSwgIC8qIGhhbmRsZSAqLworICAgICAgICAgICAgICAgICAgICBwU3JjQnVmWzBdLCAgICAgICAgICAgICAvKiB5IGFkZHIgKi8KKyAgICAgICAgICAgICAgICAgICAgcFNyY0J1ZlsxXSwgICAgICAgICAgICAgLyogdSBhZGRyIG9yIHV2IGFkZHIgKi8KKyAgICAgICAgICAgICAgICAgICAgcFNyY0J1ZlsyXSwgICAgICAgICAgICAgLyogdiBhZGRyIG9yIG5vbmUgKi8KKyAgICAgICAgICAgICAgICAgICAgMCk7ICAgICAgICAgICAgICAgICAgICAgLyogaW9uIGZkICovCisgICAgICAgICAgICAgICAgY3NjX3NldF9kc3RfYnVmZmVyKAorICAgICAgICAgICAgICAgICAgICBwVmlkZW9EZWMtPmNzY19oYW5kbGUsICAvKiBoYW5kbGUgKi8KKyAgICAgICAgICAgICAgICAgICAgcFlVVkJ1ZlswXSwgICAgICAgICAgICAgLyogeSBhZGRyICovCisgICAgICAgICAgICAgICAgICAgIHBZVVZCdWZbMV0sICAgICAgICAgICAgIC8qIHUgYWRkciBvciB1diBhZGRyICovCisgICAgICAgICAgICAgICAgICAgIHBZVVZCdWZbMl0sICAgICAgICAgICAgIC8qIHYgYWRkciBvciBub25lICovCisgICAgICAgICAgICAgICAgICAgIDApOyAgICAgICAgICAgICAgICAgICAgIC8qIGlvbiBmZCAqLworICAgICAgICAgICAgICAgIGNzY19jb252ZXJ0KHBWaWRlb0RlYy0+Y3NjX2hhbmRsZSk7CisKKyNpZmRlZiBDT05GSUdfTUZDX0ZQUworICAgICAgICAgICAgICAgIFNFQ19PU0FMX1BlcmZTdG9wKFBFUkZfSURfQ1NDKTsKKyNlbmRpZgorICAgICAgICAgICAgfQorCisjaWZkZWYgVVNFX0FOQgorICAgICAgICAgICAgaWYgKHBTRUNPdXRwdXRQb3J0LT5iSXNBTkJFbmFibGVkID09IE9NWF9UUlVFKSB7CisgICAgICAgICAgICAgICAgU0VDX09TQUxfVW5sb2NrQU5CKHBPdXRwdXREYXRhLT5kYXRhQnVmZmVyKTsKKyAgICAgICAgICAgIH0KKyNlbmRpZgorICAgICAgICAgICAgcE1wZWc0RGVjLT5oTUZDTXBlZzRIYW5kbGUub3V0cHV0SW5kZXhUaW1lc3RhbXArKzsKKyAgICAgICAgICAgIHBNcGVnNERlYy0+aE1GQ01wZWc0SGFuZGxlLm91dHB1dEluZGV4VGltZXN0YW1wICU9IE1BWF9USU1FU1RBTVA7CisgICAgICAgIH0KKyAgICAgICAgaWYgKHBPdXRwdXREYXRhLT5uRmxhZ3MgJiBPTVhfQlVGRkVSRkxBR19FT1MpCisgICAgICAgICAgICBwT3V0cHV0RGF0YS0+ZGF0YUxlbiA9IDA7CisKKyAgICAgICAgaWYgKChzdGF0dXMgPT0gTUZDX0dFVE9VVEJVRl9ESVNQTEFZX09OTFkpIHx8CisgICAgICAgICAgICAocFNFQ0NvbXBvbmVudC0+Z2V0QWxsRGVsYXlCdWZmZXIgPT0gT01YX1RSVUUpKSB7CisgICAgICAgICAgICByZXQgPSBPTVhfRXJyb3JJbnB1dERhdGFEZWNvZGVZZXQ7CisgICAgICAgIH0KKworICAgICAgICBpZiAoc3RhdHVzID09IE1GQ19HRVRPVVRCVUZfREVDT0RJTkdfT05MWSkgeworICAgICAgICAgICAgaWYgKCgocElucHV0RGF0YS0+bkZsYWdzICYgT01YX0JVRkZFUkZMQUdfRU9TKSAhPSBPTVhfQlVGRkVSRkxBR19FT1MpICYmCisgICAgICAgICAgICAgICAgKChwU0VDQ29tcG9uZW50LT5iU2F2ZUZsYWdFT1MgPT0gT01YX1RSVUUpIHx8IChwU0VDQ29tcG9uZW50LT5nZXRBbGxEZWxheUJ1ZmZlciA9PSBPTVhfVFJVRSkpKSB7CisgICAgICAgICAgICAgICAgcElucHV0RGF0YS0+bkZsYWdzIHw9IE9NWF9CVUZGRVJGTEFHX0VPUzsKKyAgICAgICAgICAgICAgICBwU0VDQ29tcG9uZW50LT5nZXRBbGxEZWxheUJ1ZmZlciA9IE9NWF9UUlVFOworICAgICAgICAgICAgICAgIHJldCA9IE9NWF9FcnJvcklucHV0RGF0YURlY29kZVlldDsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgcmV0ID0gT01YX0Vycm9yTm9uZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGdvdG8gRVhJVDsKKyAgICAgICAgfQorCisjaWZkZWYgRlVMTF9GUkFNRV9TRUFSQ0gKKyAgICAgICAgaWYgKCgocElucHV0RGF0YS0+bkZsYWdzICYgT01YX0JVRkZFUkZMQUdfRU9TKSAhPSBPTVhfQlVGRkVSRkxBR19FT1MpICYmCisgICAgICAgICAgICAocFNFQ0NvbXBvbmVudC0+YlNhdmVGbGFnRU9TID09IE9NWF9UUlVFKSkgeworICAgICAgICAgICAgcElucHV0RGF0YS0+bkZsYWdzIHw9IE9NWF9CVUZGRVJGTEFHX0VPUzsKKyAgICAgICAgICAgIHBTRUNDb21wb25lbnQtPmdldEFsbERlbGF5QnVmZmVyID0gT01YX1RSVUU7CisgICAgICAgICAgICByZXQgPSBPTVhfRXJyb3JJbnB1dERhdGFEZWNvZGVZZXQ7CisgICAgICAgIH0gZWxzZQorI2VuZGlmCisgICAgICAgIGlmICgocElucHV0RGF0YS0+bkZsYWdzICYgT01YX0JVRkZFUkZMQUdfRU9TKSA9PSBPTVhfQlVGRkVSRkxBR19FT1MpIHsKKyAgICAgICAgICAgIHBJbnB1dERhdGEtPm5GbGFncyA9IChwT3V0cHV0RGF0YS0+bkZsYWdzICYgKH5PTVhfQlVGRkVSRkxBR19FT1MpKTsKKyAgICAgICAgICAgIHBTRUNDb21wb25lbnQtPmdldEFsbERlbGF5QnVmZmVyID0gT01YX1RSVUU7CisgICAgICAgICAgICByZXQgPSBPTVhfRXJyb3JJbnB1dERhdGFEZWNvZGVZZXQ7CisgICAgICAgIH0gZWxzZSBpZiAoKHBPdXRwdXREYXRhLT5uRmxhZ3MgJiBPTVhfQlVGRkVSRkxBR19FT1MpID09IE9NWF9CVUZGRVJGTEFHX0VPUykgeworICAgICAgICAgICAgcFNFQ0NvbXBvbmVudC0+Z2V0QWxsRGVsYXlCdWZmZXIgPSBPTVhfRkFMU0U7CisgICAgICAgICAgICByZXQgPSBPTVhfRXJyb3JOb25lOworICAgICAgICB9CisgICAgfSBlbHNlIHsKKyAgICAgICAgcE91dHB1dERhdGEtPnRpbWVTdGFtcCA9IHBJbnB1dERhdGEtPnRpbWVTdGFtcDsKKyAgICAgICAgcE91dHB1dERhdGEtPm5GbGFncyA9IHBJbnB1dERhdGEtPm5GbGFnczsKKworICAgICAgICBpZiAoKHBTRUNDb21wb25lbnQtPmJTYXZlRmxhZ0VPUyA9PSBPTVhfVFJVRSkgfHwKKyAgICAgICAgICAgIChwU0VDQ29tcG9uZW50LT5nZXRBbGxEZWxheUJ1ZmZlciA9PSBPTVhfVFJVRSkgfHwKKyAgICAgICAgICAgIChwSW5wdXREYXRhLT5uRmxhZ3MgJiBPTVhfQlVGRkVSRkxBR19FT1MpKSB7CisgICAgICAgICAgICBwT3V0cHV0RGF0YS0+bkZsYWdzIHw9IE9NWF9CVUZGRVJGTEFHX0VPUzsKKyAgICAgICAgICAgIHBTRUNDb21wb25lbnQtPmdldEFsbERlbGF5QnVmZmVyID0gT01YX0ZBTFNFOworICAgICAgICB9CisgICAgICAgIHBPdXRwdXREYXRhLT5kYXRhTGVuID0gMDsKKworICAgICAgICAvKiByZXQgPSBPTVhfRXJyb3JVbmRlZmluZWQ7ICovCisgICAgICAgICAgICByZXQgPSBPTVhfRXJyb3JOb25lOworICAgICAgICAgICAgZ290byBFWElUOworICAgIH0KKworRVhJVDoKKyAgICBGdW5jdGlvbk91dCgpOworCisgICAgcmV0dXJuIHJldDsKK30KKworLyogTUZDIERlY29kZSAqLworT01YX0VSUk9SVFlQRSBTRUNfTUZDX01wZWc0RGVjX2J1ZmZlclByb2Nlc3MoT01YX0NPTVBPTkVOVFRZUEUgKnBPTVhDb21wb25lbnQsIFNFQ19PTVhfREFUQSAqcElucHV0RGF0YSwgU0VDX09NWF9EQVRBICpwT3V0cHV0RGF0YSkKK3sKKyAgICBPTVhfRVJST1JUWVBFIHJldCA9IE9NWF9FcnJvck5vbmU7CisgICAgU0VDX09NWF9CQVNFQ09NUE9ORU5UICAgKnBTRUNDb21wb25lbnQgPSAoU0VDX09NWF9CQVNFQ09NUE9ORU5UICopcE9NWENvbXBvbmVudC0+cENvbXBvbmVudFByaXZhdGU7CisgICAgU0VDX01QRUc0X0hBTkRMRSAgICAgICAgKnBNcGVnNERlYyA9IChTRUNfTVBFRzRfSEFORExFICopKChTRUNfT01YX1ZJREVPREVDX0NPTVBPTkVOVCAqKXBTRUNDb21wb25lbnQtPmhDb21wb25lbnRIYW5kbGUpLT5oQ29kZWNIYW5kbGU7CisgICAgU0VDX09NWF9CQVNFUE9SVCAgICAgICAgKnBTRUNJbnB1dFBvcnQgPSAmcFNFQ0NvbXBvbmVudC0+cFNFQ1BvcnRbSU5QVVRfUE9SVF9JTkRFWF07CisgICAgU0VDX09NWF9CQVNFUE9SVCAgICAgICAgKnBTRUNPdXRwdXRQb3J0ID0gJnBTRUNDb21wb25lbnQtPnBTRUNQb3J0W09VVFBVVF9QT1JUX0lOREVYXTsKKyAgICBPTVhfQk9PTCAgICAgICAgICAgICAgICAgYkNoZWNrUHJlZml4ID0gT01YX0ZBTFNFOworCisgICAgRnVuY3Rpb25JbigpOworCisgICAgaWYgKCghQ0hFQ0tfUE9SVF9FTkFCTEVEKHBTRUNJbnB1dFBvcnQpKSB8fCAoIUNIRUNLX1BPUlRfRU5BQkxFRChwU0VDT3V0cHV0UG9ydCkpIHx8CisgICAgICAgICghQ0hFQ0tfUE9SVF9QT1BVTEFURUQocFNFQ0lucHV0UG9ydCkpIHx8ICghQ0hFQ0tfUE9SVF9QT1BVTEFURUQocFNFQ091dHB1dFBvcnQpKSkgeworICAgICAgICByZXQgPSBPTVhfRXJyb3JOb25lOworICAgICAgICBnb3RvIEVYSVQ7CisgICAgfQorICAgIGlmIChPTVhfRkFMU0UgPT0gU0VDX0NoZWNrX0J1ZmZlclByb2Nlc3NfU3RhdGUocFNFQ0NvbXBvbmVudCkpIHsKKyAgICAgICAgcmV0ID0gT01YX0Vycm9yTm9uZTsKKyAgICAgICAgZ290byBFWElUOworICAgIH0KKworI2lmZGVmIE5PTkJMT0NLX01PREVfUFJPQ0VTUworICAgIHJldCA9IFNFQ19NRkNfTXBlZzRfRGVjb2RlX05vbmJsb2NrKHBPTVhDb21wb25lbnQsIHBJbnB1dERhdGEsIHBPdXRwdXREYXRhKTsKKyNlbHNlCisgICAgcmV0ID0gU0VDX01GQ19NcGVnNF9EZWNvZGVfQmxvY2socE9NWENvbXBvbmVudCwgcElucHV0RGF0YSwgcE91dHB1dERhdGEpOworI2VuZGlmCisgICAgaWYgKHJldCAhPSBPTVhfRXJyb3JOb25lKSB7CisgICAgICAgIGlmIChyZXQgPT0gT01YX0Vycm9ySW5wdXREYXRhRGVjb2RlWWV0KSB7CisgICAgICAgICAgICBwT3V0cHV0RGF0YS0+dXNlZERhdGFMZW4gPSAwOworICAgICAgICAgICAgcE91dHB1dERhdGEtPnJlbWFpbkRhdGFMZW4gPSBwT3V0cHV0RGF0YS0+ZGF0YUxlbjsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHBTRUNDb21wb25lbnQtPnBDYWxsYmFja3MtPkV2ZW50SGFuZGxlcigoT01YX0hBTkRMRVRZUEUpcE9NWENvbXBvbmVudCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwU0VDQ29tcG9uZW50LT5jYWxsYmFja0RhdGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT01YX0V2ZW50RXJyb3IsIHJldCwgMCwgTlVMTCk7CisgICAgICAgIH0KKyAgICB9IGVsc2UgeworICAgICAgICBwSW5wdXREYXRhLT5wcmV2aW91c0RhdGFMZW4gPSBwSW5wdXREYXRhLT5kYXRhTGVuOworICAgICAgICBwSW5wdXREYXRhLT51c2VkRGF0YUxlbiArPSBwSW5wdXREYXRhLT5kYXRhTGVuOworICAgICAgICBwSW5wdXREYXRhLT5yZW1haW5EYXRhTGVuID0gcElucHV0RGF0YS0+ZGF0YUxlbiAtIHBJbnB1dERhdGEtPnVzZWREYXRhTGVuOworICAgICAgICBwSW5wdXREYXRhLT5kYXRhTGVuIC09IHBJbnB1dERhdGEtPnVzZWREYXRhTGVuOworICAgICAgICBwSW5wdXREYXRhLT51c2VkRGF0YUxlbiA9IDA7CisKKyAgICAgICAgcE91dHB1dERhdGEtPnVzZWREYXRhTGVuID0gMDsKKyAgICAgICAgcE91dHB1dERhdGEtPnJlbWFpbkRhdGFMZW4gPSBwT3V0cHV0RGF0YS0+ZGF0YUxlbjsKKyAgICB9CisKK0VYSVQ6CisgICAgRnVuY3Rpb25PdXQoKTsKKworICAgIHJldHVybiByZXQ7Cit9CisKK09TQ0xfRVhQT1JUX1JFRiBPTVhfRVJST1JUWVBFIFNFQ19PTVhfQ29tcG9uZW50SW5pdChPTVhfSEFORExFVFlQRSBoQ29tcG9uZW50LCBPTVhfU1RSSU5HIGNvbXBvbmVudE5hbWUpCit7CisgICAgT01YX0VSUk9SVFlQRSAgICAgICAgICAgIHJldCA9IE9NWF9FcnJvck5vbmU7CisgICAgT01YX0NPTVBPTkVOVFRZUEUgICAgICAgKnBPTVhDb21wb25lbnQgPSBOVUxMOworICAgIFNFQ19PTVhfQkFTRUNPTVBPTkVOVCAgICpwU0VDQ29tcG9uZW50ID0gTlVMTDsKKyAgICBTRUNfT01YX0JBU0VQT1JUICAgICAgICAqcFNFQ1BvcnQgPSBOVUxMOworICAgIFNFQ19PTVhfVklERU9ERUNfQ09NUE9ORU5UICpwVmlkZW9EZWMgPSBOVUxMOworICAgIFNFQ19NUEVHNF9IQU5ETEUgICAgICAgICpwTXBlZzREZWMgPSBOVUxMOworICAgIE9NWF9TMzIgICAgICAgICAgICAgICAgICBjb2RlY1R5cGUgPSAtMTsKKyAgICBpbnQgaSA9IDA7CisKKyAgICBGdW5jdGlvbkluKCk7CisKKyAgICBpZiAoKGhDb21wb25lbnQgPT0gTlVMTCkgfHwgKGNvbXBvbmVudE5hbWUgPT0gTlVMTCkpIHsKKyAgICAgICAgcmV0ID0gT01YX0Vycm9yQmFkUGFyYW1ldGVyOworICAgICAgICBTRUNfT1NBTF9Mb2coU0VDX0xPR19FUlJPUiwgIiVzOiBwYXJhbWV0ZXJzIGFyZSBudWxsLCByZXQ6ICVYIiwgX19GVU5DVElPTl9fLCByZXQpOworICAgICAgICBnb3RvIEVYSVQ7CisgICAgfQorICAgIGlmIChTRUNfT1NBTF9TdHJjbXAoU0VDX09NWF9DT01QT05FTlRfTVBFRzRfREVDLCBjb21wb25lbnROYW1lKSA9PSAwKSB7CisgICAgICAgIGNvZGVjVHlwZSA9IENPREVDX1RZUEVfTVBFRzQ7CisgICAgfSBlbHNlIGlmIChTRUNfT1NBTF9TdHJjbXAoU0VDX09NWF9DT01QT05FTlRfSDI2M19ERUMsIGNvbXBvbmVudE5hbWUpID09IDApIHsKKyAgICAgICAgY29kZWNUeXBlID0gQ09ERUNfVFlQRV9IMjYzOworICAgIH0gZWxzZSB7CisgICAgICAgIHJldCA9IE9NWF9FcnJvckJhZFBhcmFtZXRlcjsKKyAgICAgICAgU0VDX09TQUxfTG9nKFNFQ19MT0dfRVJST1IsICIlczogY29tcG9uZW50TmFtZSglcykgZXJyb3IsIHJldDogJVgiLCBfX0ZVTkNUSU9OX18sIHJldCk7CisgICAgICAgIGdvdG8gRVhJVDsKKyAgICB9CisKKyAgICBwT01YQ29tcG9uZW50ID0gKE9NWF9DT01QT05FTlRUWVBFICopaENvbXBvbmVudDsKKyAgICByZXQgPSBTRUNfT01YX1ZpZGVvRGVjb2RlQ29tcG9uZW50SW5pdChwT01YQ29tcG9uZW50KTsKKyAgICBpZiAocmV0ICE9IE9NWF9FcnJvck5vbmUpIHsKKyAgICAgICAgU0VDX09TQUxfTG9nKFNFQ19MT0dfRVJST1IsICIlczogU0VDX09NWF9WaWRlb0RlY29kZUNvbXBvbmVudEluaXQgZXJyb3IsIHJldDogJVgiLCBfX0ZVTkNUSU9OX18sIHJldCk7CisgICAgICAgIGdvdG8gRVhJVDsKKyAgICB9CisgICAgcFNFQ0NvbXBvbmVudCA9IChTRUNfT01YX0JBU0VDT01QT05FTlQgKilwT01YQ29tcG9uZW50LT5wQ29tcG9uZW50UHJpdmF0ZTsKKyAgICBwU0VDQ29tcG9uZW50LT5jb2RlY1R5cGUgPSBIV19WSURFT19ERUNfQ09ERUM7CisKKyAgICBwU0VDQ29tcG9uZW50LT5jb21wb25lbnROYW1lID0gKE9NWF9TVFJJTkcpU0VDX09TQUxfTWFsbG9jKE1BWF9PTVhfQ09NUE9ORU5UX05BTUVfU0laRSk7CisgICAgaWYgKHBTRUNDb21wb25lbnQtPmNvbXBvbmVudE5hbWUgPT0gTlVMTCkgeworICAgICAgICBTRUNfT01YX1ZpZGVvRGVjb2RlQ29tcG9uZW50RGVpbml0KHBPTVhDb21wb25lbnQpOworICAgICAgICByZXQgPSBPTVhfRXJyb3JJbnN1ZmZpY2llbnRSZXNvdXJjZXM7CisgICAgICAgIFNFQ19PU0FMX0xvZyhTRUNfTE9HX0VSUk9SLCAiJXM6IGNvbXBvbmVudE5hbWUgYWxsb2MgZXJyb3IsIHJldDogJVgiLCBfX0ZVTkNUSU9OX18sIHJldCk7CisgICAgICAgIGdvdG8gRVhJVDsKKyAgICB9CisgICAgU0VDX09TQUxfTWVtc2V0KHBTRUNDb21wb25lbnQtPmNvbXBvbmVudE5hbWUsIDAsIE1BWF9PTVhfQ09NUE9ORU5UX05BTUVfU0laRSk7CisKKyAgICBwTXBlZzREZWMgPSBTRUNfT1NBTF9NYWxsb2Moc2l6ZW9mKFNFQ19NUEVHNF9IQU5ETEUpKTsKKyAgICBpZiAocE1wZWc0RGVjID09IE5VTEwpIHsKKyAgICAgICAgU0VDX09NWF9WaWRlb0RlY29kZUNvbXBvbmVudERlaW5pdChwT01YQ29tcG9uZW50KTsKKyAgICAgICAgcmV0ID0gT01YX0Vycm9ySW5zdWZmaWNpZW50UmVzb3VyY2VzOworICAgICAgICBTRUNfT1NBTF9Mb2coU0VDX0xPR19FUlJPUiwgIiVzOiBTRUNfTVBFRzRfSEFORExFIGFsbG9jIGVycm9yLCByZXQ6ICVYIiwgX19GVU5DVElPTl9fLCByZXQpOworICAgICAgICBnb3RvIEVYSVQ7CisgICAgfQorICAgIFNFQ19PU0FMX01lbXNldChwTXBlZzREZWMsIDAsIHNpemVvZihTRUNfTVBFRzRfSEFORExFKSk7CisgICAgcFZpZGVvRGVjID0gKFNFQ19PTVhfVklERU9ERUNfQ09NUE9ORU5UICopcFNFQ0NvbXBvbmVudC0+aENvbXBvbmVudEhhbmRsZTsKKyAgICBwVmlkZW9EZWMtPmhDb2RlY0hhbmRsZSA9IChPTVhfSEFORExFVFlQRSlwTXBlZzREZWM7CisgICAgcE1wZWc0RGVjLT5oTUZDTXBlZzRIYW5kbGUuY29kZWNUeXBlID0gY29kZWNUeXBlOworCisgICAgaWYgKGNvZGVjVHlwZSA9PSBDT0RFQ19UWVBFX01QRUc0KQorICAgICAgICBTRUNfT1NBTF9TdHJjcHkocFNFQ0NvbXBvbmVudC0+Y29tcG9uZW50TmFtZSwgU0VDX09NWF9DT01QT05FTlRfTVBFRzRfREVDKTsKKyAgICBlbHNlCisgICAgICAgIFNFQ19PU0FMX1N0cmNweShwU0VDQ29tcG9uZW50LT5jb21wb25lbnROYW1lLCBTRUNfT01YX0NPTVBPTkVOVF9IMjYzX0RFQyk7CisKKyAgICAvKiBTZXQgY29tcG9uZW50VmVyc2lvbiAqLworICAgIHBTRUNDb21wb25lbnQtPmNvbXBvbmVudFZlcnNpb24ucy5uVmVyc2lvbk1ham9yID0gVkVSU0lPTk1BSk9SX05VTUJFUjsKKyAgICBwU0VDQ29tcG9uZW50LT5jb21wb25lbnRWZXJzaW9uLnMublZlcnNpb25NaW5vciA9IFZFUlNJT05NSU5PUl9OVU1CRVI7CisgICAgcFNFQ0NvbXBvbmVudC0+Y29tcG9uZW50VmVyc2lvbi5zLm5SZXZpc2lvbiAgICAgPSBSRVZJU0lPTl9OVU1CRVI7CisgICAgcFNFQ0NvbXBvbmVudC0+Y29tcG9uZW50VmVyc2lvbi5zLm5TdGVwICAgICAgICAgPSBTVEVQX05VTUJFUjsKKyAgICAvKiBTZXQgc3BlY1ZlcnNpb24gKi8KKyAgICBwU0VDQ29tcG9uZW50LT5zcGVjVmVyc2lvbi5zLm5WZXJzaW9uTWFqb3IgPSBWRVJTSU9OTUFKT1JfTlVNQkVSOworICAgIHBTRUNDb21wb25lbnQtPnNwZWNWZXJzaW9uLnMublZlcnNpb25NaW5vciA9IFZFUlNJT05NSU5PUl9OVU1CRVI7CisgICAgcFNFQ0NvbXBvbmVudC0+c3BlY1ZlcnNpb24ucy5uUmV2aXNpb24gICAgID0gUkVWSVNJT05fTlVNQkVSOworICAgIHBTRUNDb21wb25lbnQtPnNwZWNWZXJzaW9uLnMublN0ZXAgICAgICAgICA9IFNURVBfTlVNQkVSOworCisgICAgLyogQW5kcm9pZCBDYXBhYmlsaXR5RmxhZ3MgKi8KKyAgICBwU0VDQ29tcG9uZW50LT5jYXBhYmlsaXR5RmxhZ3MuaUlzT01YQ29tcG9uZW50TXVsdGlUaHJlYWRlZCAgICAgICAgICAgICAgICAgICA9IE9NWF9UUlVFOworICAgIHBTRUNDb21wb25lbnQtPmNhcGFiaWxpdHlGbGFncy5pT01YQ29tcG9uZW50U3VwcG9ydHNFeHRlcm5hbElucHV0QnVmZmVyQWxsb2MgID0gT01YX1RSVUU7CisgICAgcFNFQ0NvbXBvbmVudC0+Y2FwYWJpbGl0eUZsYWdzLmlPTVhDb21wb25lbnRTdXBwb3J0c0V4dGVybmFsT3V0cHV0QnVmZmVyQWxsb2MgPSBPTVhfVFJVRTsKKyAgICBwU0VDQ29tcG9uZW50LT5jYXBhYmlsaXR5RmxhZ3MuaU9NWENvbXBvbmVudFN1cHBvcnRzTW92YWJsZUlucHV0QnVmZmVycyAgICAgICA9IE9NWF9GQUxTRTsKKyAgICBwU0VDQ29tcG9uZW50LT5jYXBhYmlsaXR5RmxhZ3MuaU9NWENvbXBvbmVudFN1cHBvcnRzUGFydGlhbEZyYW1lcyAgICAgICAgICAgICA9IE9NWF9GQUxTRTsKKyAgICBwU0VDQ29tcG9uZW50LT5jYXBhYmlsaXR5RmxhZ3MuaU9NWENvbXBvbmVudFVzZXNOQUxTdGFydENvZGVzICAgICAgICAgICAgICAgICA9IE9NWF9UUlVFOworICAgIHBTRUNDb21wb25lbnQtPmNhcGFiaWxpdHlGbGFncy5pT01YQ29tcG9uZW50Q2FuSGFuZGxlSW5jb21wbGV0ZUZyYW1lcyAgICAgICAgID0gT01YX1RSVUU7CisgICAgcFNFQ0NvbXBvbmVudC0+Y2FwYWJpbGl0eUZsYWdzLmlPTVhDb21wb25lbnRVc2VzRnVsbEFWQ0ZyYW1lcyAgICAgICAgICAgICAgICAgPSBPTVhfVFJVRTsKKworICAgIC8qIElucHV0IHBvcnQgKi8KKyAgICBwU0VDUG9ydCA9ICZwU0VDQ29tcG9uZW50LT5wU0VDUG9ydFtJTlBVVF9QT1JUX0lOREVYXTsKKyAgICBwU0VDUG9ydC0+cG9ydERlZmluaXRpb24uZm9ybWF0LnZpZGVvLm5GcmFtZVdpZHRoID0gREVGQVVMVF9GUkFNRV9XSURUSDsKKyAgICBwU0VDUG9ydC0+cG9ydERlZmluaXRpb24uZm9ybWF0LnZpZGVvLm5GcmFtZUhlaWdodD0gREVGQVVMVF9GUkFNRV9IRUlHSFQ7CisgICAgcFNFQ1BvcnQtPnBvcnREZWZpbml0aW9uLmZvcm1hdC52aWRlby5uU3RyaWRlID0gMDsKKyAgICBwU0VDUG9ydC0+cG9ydERlZmluaXRpb24uZm9ybWF0LnZpZGVvLm5TbGljZUhlaWdodCA9IDA7CisgICAgcFNFQ1BvcnQtPnBvcnREZWZpbml0aW9uLm5CdWZmZXJTaXplID0gREVGQVVMVF9WSURFT19JTlBVVF9CVUZGRVJfU0laRTsKKyAgICBpZiAoY29kZWNUeXBlID09IENPREVDX1RZUEVfTVBFRzQpIHsKKyAgICAgICAgcFNFQ1BvcnQtPnBvcnREZWZpbml0aW9uLmZvcm1hdC52aWRlby5lQ29tcHJlc3Npb25Gb3JtYXQgPSBPTVhfVklERU9fQ29kaW5nTVBFRzQ7CisgICAgICAgIFNFQ19PU0FMX01lbXNldChwU0VDUG9ydC0+cG9ydERlZmluaXRpb24uZm9ybWF0LnZpZGVvLmNNSU1FVHlwZSwgMCwgTUFYX09NWF9NSU1FVFlQRV9TSVpFKTsKKyAgICAgICAgU0VDX09TQUxfU3RyY3B5KHBTRUNQb3J0LT5wb3J0RGVmaW5pdGlvbi5mb3JtYXQudmlkZW8uY01JTUVUeXBlLCAidmlkZW8vbXBlZzQiKTsKKyAgICB9IGVsc2UgeworICAgICAgICBwU0VDUG9ydC0+cG9ydERlZmluaXRpb24uZm9ybWF0LnZpZGVvLmVDb21wcmVzc2lvbkZvcm1hdCA9IE9NWF9WSURFT19Db2RpbmdIMjYzOworICAgICAgICBTRUNfT1NBTF9NZW1zZXQocFNFQ1BvcnQtPnBvcnREZWZpbml0aW9uLmZvcm1hdC52aWRlby5jTUlNRVR5cGUsIDAsIE1BWF9PTVhfTUlNRVRZUEVfU0laRSk7CisgICAgICAgIFNFQ19PU0FMX1N0cmNweShwU0VDUG9ydC0+cG9ydERlZmluaXRpb24uZm9ybWF0LnZpZGVvLmNNSU1FVHlwZSwgInZpZGVvL2gyNjMiKTsKKyAgICB9CisgICAgcFNFQ1BvcnQtPnBvcnREZWZpbml0aW9uLmZvcm1hdC52aWRlby5wTmF0aXZlUmVuZGVyID0gMDsKKyAgICBwU0VDUG9ydC0+cG9ydERlZmluaXRpb24uZm9ybWF0LnZpZGVvLmJGbGFnRXJyb3JDb25jZWFsbWVudCA9IE9NWF9GQUxTRTsKKyAgICBwU0VDUG9ydC0+cG9ydERlZmluaXRpb24uZm9ybWF0LnZpZGVvLmVDb2xvckZvcm1hdCA9IE9NWF9DT0xPUl9Gb3JtYXRVbnVzZWQ7CisgICAgcFNFQ1BvcnQtPnBvcnREZWZpbml0aW9uLmJFbmFibGVkID0gT01YX1RSVUU7CisKKyAgICAvKiBPdXRwdXQgcG9ydCAqLworICAgIHBTRUNQb3J0ID0gJnBTRUNDb21wb25lbnQtPnBTRUNQb3J0W09VVFBVVF9QT1JUX0lOREVYXTsKKyAgICBwU0VDUG9ydC0+cG9ydERlZmluaXRpb24uZm9ybWF0LnZpZGVvLm5GcmFtZVdpZHRoID0gREVGQVVMVF9GUkFNRV9XSURUSDsKKyAgICBwU0VDUG9ydC0+cG9ydERlZmluaXRpb24uZm9ybWF0LnZpZGVvLm5GcmFtZUhlaWdodD0gREVGQVVMVF9GUkFNRV9IRUlHSFQ7CisgICAgcFNFQ1BvcnQtPnBvcnREZWZpbml0aW9uLmZvcm1hdC52aWRlby5uU3RyaWRlID0gMDsKKyAgICBwU0VDUG9ydC0+cG9ydERlZmluaXRpb24uZm9ybWF0LnZpZGVvLm5TbGljZUhlaWdodCA9IDA7CisgICAgcFNFQ1BvcnQtPnBvcnREZWZpbml0aW9uLm5CdWZmZXJTaXplID0gREVGQVVMVF9WSURFT19PVVRQVVRfQlVGRkVSX1NJWkU7CisgICAgcFNFQ1BvcnQtPnBvcnREZWZpbml0aW9uLmZvcm1hdC52aWRlby5lQ29tcHJlc3Npb25Gb3JtYXQgPSBPTVhfVklERU9fQ29kaW5nVW51c2VkOworICAgIFNFQ19PU0FMX01lbXNldChwU0VDUG9ydC0+cG9ydERlZmluaXRpb24uZm9ybWF0LnZpZGVvLmNNSU1FVHlwZSwgMCwgTUFYX09NWF9NSU1FVFlQRV9TSVpFKTsKKyAgICBTRUNfT1NBTF9TdHJjcHkocFNFQ1BvcnQtPnBvcnREZWZpbml0aW9uLmZvcm1hdC52aWRlby5jTUlNRVR5cGUsICJyYXcvdmlkZW8iKTsKKyAgICBwU0VDUG9ydC0+cG9ydERlZmluaXRpb24uZm9ybWF0LnZpZGVvLnBOYXRpdmVSZW5kZXIgPSAwOworICAgIHBTRUNQb3J0LT5wb3J0RGVmaW5pdGlvbi5mb3JtYXQudmlkZW8uYkZsYWdFcnJvckNvbmNlYWxtZW50ID0gT01YX0ZBTFNFOworICAgIHBTRUNQb3J0LT5wb3J0RGVmaW5pdGlvbi5mb3JtYXQudmlkZW8uZUNvbG9yRm9ybWF0ID0gT01YX0NPTE9SX0Zvcm1hdFlVVjQyMFBsYW5hcjsKKyAgICBwU0VDUG9ydC0+cG9ydERlZmluaXRpb24uYkVuYWJsZWQgPSBPTVhfVFJVRTsKKworICAgIGlmIChjb2RlY1R5cGUgPT0gQ09ERUNfVFlQRV9NUEVHNCkgeworICAgICAgICBmb3IoaSA9IDA7IGkgPCBBTExfUE9SVF9OVU07IGkrKykgeworICAgICAgICAgICAgSU5JVF9TRVRfU0laRV9WRVJTSU9OKCZwTXBlZzREZWMtPm1wZWc0Q29tcG9uZW50W2ldLCBPTVhfVklERU9fUEFSQU1fTVBFRzRUWVBFKTsKKyAgICAgICAgICAgIHBNcGVnNERlYy0+bXBlZzRDb21wb25lbnRbaV0ublBvcnRJbmRleCA9IGk7CisgICAgICAgICAgICBwTXBlZzREZWMtPm1wZWc0Q29tcG9uZW50W2ldLmVQcm9maWxlICAgPSBPTVhfVklERU9fTVBFRzRQcm9maWxlU2ltcGxlOworICAgICAgICAgICAgcE1wZWc0RGVjLT5tcGVnNENvbXBvbmVudFtpXS5lTGV2ZWwgICAgID0gT01YX1ZJREVPX01QRUc0TGV2ZWwzOworICAgICAgICB9CisgICAgfSBlbHNlIHsKKyAgICAgICAgZm9yKGkgPSAwOyBpIDwgQUxMX1BPUlRfTlVNOyBpKyspIHsKKyAgICAgICAgICAgIElOSVRfU0VUX1NJWkVfVkVSU0lPTigmcE1wZWc0RGVjLT5oMjYzQ29tcG9uZW50W2ldLCBPTVhfVklERU9fUEFSQU1fSDI2M1RZUEUpOworICAgICAgICAgICAgcE1wZWc0RGVjLT5oMjYzQ29tcG9uZW50W2ldLm5Qb3J0SW5kZXggPSBpOworICAgICAgICAgICAgcE1wZWc0RGVjLT5oMjYzQ29tcG9uZW50W2ldLmVQcm9maWxlICAgPSBPTVhfVklERU9fSDI2M1Byb2ZpbGVCYXNlbGluZSB8IE9NWF9WSURFT19IMjYzUHJvZmlsZUlTV1YyOworICAgICAgICAgICAgcE1wZWc0RGVjLT5oMjYzQ29tcG9uZW50W2ldLmVMZXZlbCAgICAgPSBPTVhfVklERU9fSDI2M0xldmVsNDU7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwT01YQ29tcG9uZW50LT5HZXRQYXJhbWV0ZXIgICAgICA9ICZTRUNfTUZDX01wZWc0RGVjX0dldFBhcmFtZXRlcjsKKyAgICBwT01YQ29tcG9uZW50LT5TZXRQYXJhbWV0ZXIgICAgICA9ICZTRUNfTUZDX01wZWc0RGVjX1NldFBhcmFtZXRlcjsKKyAgICBwT01YQ29tcG9uZW50LT5HZXRDb25maWcgICAgICAgICA9ICZTRUNfTUZDX01wZWc0RGVjX0dldENvbmZpZzsKKyAgICBwT01YQ29tcG9uZW50LT5TZXRDb25maWcgICAgICAgICA9ICZTRUNfTUZDX01wZWc0RGVjX1NldENvbmZpZzsKKyAgICBwT01YQ29tcG9uZW50LT5HZXRFeHRlbnNpb25JbmRleCA9ICZTRUNfTUZDX01wZWc0RGVjX0dldEV4dGVuc2lvbkluZGV4OworICAgIHBPTVhDb21wb25lbnQtPkNvbXBvbmVudFJvbGVFbnVtID0gJlNFQ19NRkNfTXBlZzREZWNfQ29tcG9uZW50Um9sZUVudW07CisgICAgcE9NWENvbXBvbmVudC0+Q29tcG9uZW50RGVJbml0ICAgPSAmU0VDX09NWF9Db21wb25lbnREZWluaXQ7CisKKyAgICBwU0VDQ29tcG9uZW50LT5zZWNfbWZjX2NvbXBvbmVudEluaXQgICAgICA9ICZTRUNfTUZDX01wZWc0RGVjX0luaXQ7CisgICAgcFNFQ0NvbXBvbmVudC0+c2VjX21mY19jb21wb25lbnRUZXJtaW5hdGUgPSAmU0VDX01GQ19NcGVnNERlY19UZXJtaW5hdGU7CisgICAgcFNFQ0NvbXBvbmVudC0+c2VjX21mY19idWZmZXJQcm9jZXNzICAgICAgPSAmU0VDX01GQ19NcGVnNERlY19idWZmZXJQcm9jZXNzOworICAgIGlmIChjb2RlY1R5cGUgPT0gQ09ERUNfVFlQRV9NUEVHNCkKKyAgICAgICAgcFNFQ0NvbXBvbmVudC0+c2VjX2NoZWNrSW5wdXRGcmFtZSA9ICZDaGVja19NcGVnNF9GcmFtZTsKKyAgICBlbHNlCisgICAgICAgIHBTRUNDb21wb25lbnQtPnNlY19jaGVja0lucHV0RnJhbWUgPSAmQ2hlY2tfSDI2M19GcmFtZTsKKworICAgIHBTRUNDb21wb25lbnQtPmN1cnJlbnRTdGF0ZSA9IE9NWF9TdGF0ZUxvYWRlZDsKKworICAgIHJldCA9IE9NWF9FcnJvck5vbmU7CisKK0VYSVQ6CisgICAgRnVuY3Rpb25PdXQoKTsKKworICAgIHJldHVybiByZXQ7Cit9CisKK09NWF9FUlJPUlRZUEUgU0VDX09NWF9Db21wb25lbnREZWluaXQoT01YX0hBTkRMRVRZUEUgaENvbXBvbmVudCkKK3sKKyAgICBPTVhfRVJST1JUWVBFICAgICAgICAgICAgcmV0ID0gT01YX0Vycm9yTm9uZTsKKyAgICBPTVhfQ09NUE9ORU5UVFlQRSAgICAgICAqcE9NWENvbXBvbmVudCA9IE5VTEw7CisgICAgU0VDX09NWF9CQVNFQ09NUE9ORU5UICAgKnBTRUNDb21wb25lbnQgPSBOVUxMOworICAgIFNFQ19NUEVHNF9IQU5ETEUgICAgICAgICpwTXBlZzREZWMgPSBOVUxMOworCisgICAgRnVuY3Rpb25JbigpOworCisgICAgaWYgKGhDb21wb25lbnQgPT0gTlVMTCkgeworICAgICAgICByZXQgPSBPTVhfRXJyb3JCYWRQYXJhbWV0ZXI7CisgICAgICAgIGdvdG8gRVhJVDsKKyAgICB9CisgICAgcE9NWENvbXBvbmVudCA9IChPTVhfQ09NUE9ORU5UVFlQRSAqKWhDb21wb25lbnQ7CisgICAgcFNFQ0NvbXBvbmVudCA9IChTRUNfT01YX0JBU0VDT01QT05FTlQgKilwT01YQ29tcG9uZW50LT5wQ29tcG9uZW50UHJpdmF0ZTsKKworICAgIFNFQ19PU0FMX0ZyZWUocFNFQ0NvbXBvbmVudC0+Y29tcG9uZW50TmFtZSk7CisgICAgcFNFQ0NvbXBvbmVudC0+Y29tcG9uZW50TmFtZSA9IE5VTEw7CisKKyAgICBwTXBlZzREZWMgPSAoU0VDX01QRUc0X0hBTkRMRSAqKSgoU0VDX09NWF9WSURFT0RFQ19DT01QT05FTlQgKilwU0VDQ29tcG9uZW50LT5oQ29tcG9uZW50SGFuZGxlKS0+aENvZGVjSGFuZGxlOworICAgIGlmIChwTXBlZzREZWMgIT0gTlVMTCkgeworICAgICAgICBTRUNfT1NBTF9GcmVlKHBNcGVnNERlYyk7CisgICAgICAgICgoU0VDX09NWF9WSURFT0RFQ19DT01QT05FTlQgKilwU0VDQ29tcG9uZW50LT5oQ29tcG9uZW50SGFuZGxlKS0+aENvZGVjSGFuZGxlID0gTlVMTDsKKyAgICB9CisKKyAgICByZXQgPSBTRUNfT01YX1ZpZGVvRGVjb2RlQ29tcG9uZW50RGVpbml0KHBPTVhDb21wb25lbnQpOworICAgIGlmIChyZXQgIT0gT01YX0Vycm9yTm9uZSkgeworICAgICAgICBnb3RvIEVYSVQ7CisgICAgfQorCisgICAgcmV0ID0gT01YX0Vycm9yTm9uZTsKKworRVhJVDoKKyAgICBGdW5jdGlvbk91dCgpOworCisgICAgcmV0dXJuIHJldDsKK30KZGlmZiAtLWdpdCBhL2V4eW5vczQvbXVsdGltZWRpYS9vcGVubWF4L3NlY19vbXgvY29tcG9uZW50L3ZpZGVvL2RlYy9tcGVnNC9TRUNfT01YX01wZWc0ZGVjLmggYi9leHlub3M0L211bHRpbWVkaWEvb3Blbm1heC9zZWNfb214L2NvbXBvbmVudC92aWRlby9kZWMvbXBlZzQvU0VDX09NWF9NcGVnNGRlYy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjI1NmNiNjYKLS0tIC9kZXYvbnVsbAorKysgYi9leHlub3M0L211bHRpbWVkaWEvb3Blbm1heC9zZWNfb214L2NvbXBvbmVudC92aWRlby9kZWMvbXBlZzQvU0VDX09NWF9NcGVnNGRlYy5oCkBAIC0wLDAgKzEsOTIgQEAKKy8qCisgKgorICogQ29weXJpZ2h0IDIwMTAgU2Ftc3VuZyBFbGVjdHJvbmljcyBTLkxTSSBDby4gTFRECisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKy8qCisgKiBAZmlsZSAgICAgICAgU0VDX09NWF9NcGVnNGRlYy5oCisgKiBAYnJpZWYKKyAqIEBhdXRob3IgICAgICBZdW5qaSBLaW0gKHl1bmppLmtpbUBzYW1zdW5nLmNvbSkKKyAqIEB2ZXJzaW9uICAgICAxLjEuMAorICogQGhpc3RvcnkKKyAqICAgMjAxMC43LjE1IDogQ3JlYXRlCisgKi8KKworI2lmbmRlZiBTRUNfT01YX01QRUc0X0RFQ19DT01QT05FTlQKKyNkZWZpbmUgU0VDX09NWF9NUEVHNF9ERUNfQ09NUE9ORU5UCisKKyNpbmNsdWRlICJTRUNfT01YX0RlZi5oIgorI2luY2x1ZGUgIk9NWF9Db21wb25lbnQuaCIKKworCit0eXBlZGVmIGVudW0gX0NPREVDX1RZUEUKK3sKKyAgICBDT0RFQ19UWVBFX0gyNjMsCisgICAgQ09ERUNfVFlQRV9NUEVHNAorfSBDT0RFQ19UWVBFOworCisvKgorICogVGhpcyBzdHJ1Y3R1cmUgaXMgdGhlIHNhbWUgYXMgQml0bWFwSW5mb0hociBzdHJ1Y3QgaW4gcHZfYXZpZmlsZV90eXBlZGVmcy5oIGZpbGUKKyAqLwordHlwZWRlZiBzdHJ1Y3QgX0JpdG1hcEluZm9IaHIKK3sKKyAgICBPTVhfVTMyICAgIEJpU2l6ZTsKKyAgICBPTVhfVTMyICAgIEJpV2lkdGg7CisgICAgT01YX1UzMiAgICBCaUhlaWdodDsKKyAgICBPTVhfVTE2ICAgIEJpUGxhbmVzOworICAgIE9NWF9VMTYgICAgQmlCaXRDb3VudDsKKyAgICBPTVhfVTMyICAgIEJpQ29tcHJlc3Npb247CisgICAgT01YX1UzMiAgICBCaVNpemVJbWFnZTsKKyAgICBPTVhfVTMyICAgIEJpWFBlbHNQZXJNZXRlcjsKKyAgICBPTVhfVTMyICAgIEJpWVBlbHNQZXJNZXRlcjsKKyAgICBPTVhfVTMyICAgIEJpQ2xyVXNlZDsKKyAgICBPTVhfVTMyICAgIEJpQ2xySW1wb3J0YW50OworfSBCaXRtYXBJbmZvSGhyOworCit0eXBlZGVmIHN0cnVjdCBfU0VDX01GQ19NUEVHNF9IQU5ETEUKK3sKKyAgICBPTVhfSEFORExFVFlQRSBoTUZDSGFuZGxlOworICAgIE9NWF9QVFIgICAgICAgIHBNRkNTdHJlYW1CdWZmZXI7CisgICAgT01YX1BUUiAgICAgICAgcE1GQ1N0cmVhbVBoeUJ1ZmZlcjsKKyAgICBPTVhfVTMyICAgICAgICBpbmRleFRpbWVzdGFtcDsKKyAgICBPTVhfVTMyICAgICAgICBvdXRwdXRJbmRleFRpbWVzdGFtcDsKKyAgICBPTVhfQk9PTCAgICAgICBiQ29uZmlndXJlZE1GQzsKKyAgICBDT0RFQ19UWVBFICAgICBjb2RlY1R5cGU7CisgICAgT01YX1MzMiAgICAgICAgcmV0dXJuQ29kZWM7Cit9IFNFQ19NRkNfTVBFRzRfSEFORExFOworCit0eXBlZGVmIHN0cnVjdCBfU0VDX01QRUc0X0hBTkRMRQoreworICAgIC8qIE9NWCBDb2RlYyBzcGVjaWZpYyAqLworICAgIE9NWF9WSURFT19QQVJBTV9IMjYzVFlQRSAgaDI2M0NvbXBvbmVudFtBTExfUE9SVF9OVU1dOworICAgIE9NWF9WSURFT19QQVJBTV9NUEVHNFRZUEUgbXBlZzRDb21wb25lbnRbQUxMX1BPUlRfTlVNXTsKKyAgICBPTVhfVklERU9fUEFSQU1fRVJST1JDT1JSRUNUSU9OVFlQRSBlcnJvckNvcnJlY3Rpb25UeXBlW0FMTF9QT1JUX05VTV07CisKKyAgICAvKiBTRUMgTUZDIENvZGVjIHNwZWNpZmljICovCisgICAgU0VDX01GQ19NUEVHNF9IQU5ETEUgICAgICBoTUZDTXBlZzRIYW5kbGU7Cit9IFNFQ19NUEVHNF9IQU5ETEU7CisKKyNpZmRlZiBfX2NwbHVzcGx1cworZXh0ZXJuICJDIiB7CisjZW5kaWYKKworT1NDTF9FWFBPUlRfUkVGIE9NWF9FUlJPUlRZUEUgU0VDX09NWF9Db21wb25lbnRJbml0KE9NWF9IQU5ETEVUWVBFIGhDb21wb25lbnQsIE9NWF9TVFJJTkcgY29tcG9uZW50TmFtZSk7CisgICAgICAgICAgICAgICAgT01YX0VSUk9SVFlQRSBTRUNfT01YX0NvbXBvbmVudERlaW5pdChPTVhfSEFORExFVFlQRSBoQ29tcG9uZW50KTsKKworI2lmZGVmIF9fY3BsdXNwbHVzCit9OworI2VuZGlmCisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvZXh5bm9zNC9tdWx0aW1lZGlhL29wZW5tYXgvc2VjX29teC9jb21wb25lbnQvdmlkZW8vZGVjL21wZWc0L2xpYnJhcnlfcmVnaXN0ZXIuYyBiL2V4eW5vczQvbXVsdGltZWRpYS9vcGVubWF4L3NlY19vbXgvY29tcG9uZW50L3ZpZGVvL2RlYy9tcGVnNC9saWJyYXJ5X3JlZ2lzdGVyLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMmFlMWIwZAotLS0gL2Rldi9udWxsCisrKyBiL2V4eW5vczQvbXVsdGltZWRpYS9vcGVubWF4L3NlY19vbXgvY29tcG9uZW50L3ZpZGVvL2RlYy9tcGVnNC9saWJyYXJ5X3JlZ2lzdGVyLmMKQEAgLTAsMCArMSw2MyBAQAorLyoKKyAqCisgKiBDb3B5cmlnaHQgMjAxMCBTYW1zdW5nIEVsZWN0cm9uaWNzIFMuTFNJIENvLiBMVEQKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworLyoKKyAqIEBmaWxlICAgICAgICBsaWJyYXJ5X3JlZ2lzdGVyLmMKKyAqIEBicmllZgorICogQGF1dGhvciAgICAgIFl1bmppIEtpbSAoeXVuamkua2ltQHNhbXN1bmcuY29tKQorICogQHZlcnNpb24gICAgIDEuMS4wCisgKiBAaGlzdG9yeQorICogICAyMDEwLjcuMTUgOiBDcmVhdGUKKyAqLworCisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlIDxzdGRsaWIuaD4KKyNpbmNsdWRlIDxzdHJpbmcuaD4KKyNpbmNsdWRlIDxkbGZjbi5oPgorCisjaW5jbHVkZSAiU0VDX09TQUxfTWVtb3J5LmgiCisjaW5jbHVkZSAiU0VDX09TQUxfRVRDLmgiCisjaW5jbHVkZSAibGlicmFyeV9yZWdpc3Rlci5oIgorCisjdW5kZWYgIFNFQ19MT0dfVEFHCisjZGVmaW5lIFNFQ19MT0dfVEFHICAgICJTRUNfTVBFRzRfREVDIgorI2RlZmluZSBTRUNfTE9HX09GRgorI2luY2x1ZGUgIlNFQ19PU0FMX0xvZy5oIgorCisKK09TQ0xfRVhQT1JUX1JFRiBpbnQgU0VDX09NWF9DT01QT05FTlRfTGlicmFyeV9SZWdpc3RlcihTRUNSZWdpc3RlckNvbXBvbmVudFR5cGUgKipwcFNFQ0NvbXBvbmVudCkKK3sKKyAgICBGdW5jdGlvbkluKCk7CisKKyAgICBpZiAocHBTRUNDb21wb25lbnQgPT0gTlVMTCkKKyAgICAgICAgZ290byBFWElUOworCisgICAgLyogY29tcG9uZW50IDEgLSB2aWRlbyBkZWNvZGVyIE1QRUc0ICovCisgICAgU0VDX09TQUxfU3RyY3B5KHBwU0VDQ29tcG9uZW50WzBdLT5jb21wb25lbnROYW1lLCBTRUNfT01YX0NPTVBPTkVOVF9NUEVHNF9ERUMpOworICAgIFNFQ19PU0FMX1N0cmNweShwcFNFQ0NvbXBvbmVudFswXS0+cm9sZXNbMF0sIFNFQ19PTVhfQ09NUE9ORU5UX01QRUc0X0RFQ19ST0xFKTsKKyAgICBwcFNFQ0NvbXBvbmVudFswXS0+dG90YWxSb2xlTnVtID0gTUFYX0NPTVBPTkVOVF9ST0xFX05VTTsKKworICAgIC8qIGNvbXBvbmVudCAyIC0gdmlkZW8gZGVjb2RlciBILjI2MyAqLworICAgIFNFQ19PU0FMX1N0cmNweShwcFNFQ0NvbXBvbmVudFsxXS0+Y29tcG9uZW50TmFtZSwgU0VDX09NWF9DT01QT05FTlRfSDI2M19ERUMpOworICAgIFNFQ19PU0FMX1N0cmNweShwcFNFQ0NvbXBvbmVudFsxXS0+cm9sZXNbMF0sIFNFQ19PTVhfQ09NUE9ORU5UX0gyNjNfREVDX1JPTEUpOworICAgIHBwU0VDQ29tcG9uZW50WzFdLT50b3RhbFJvbGVOdW0gPSBNQVhfQ09NUE9ORU5UX1JPTEVfTlVNOworCitFWElUOgorICAgIEZ1bmN0aW9uT3V0KCk7CisgICAgcmV0dXJuIE1BWF9DT01QT05FTlRfTlVNOworfQorCmRpZmYgLS1naXQgYS9leHlub3M0L211bHRpbWVkaWEvb3Blbm1heC9zZWNfb214L2NvbXBvbmVudC92aWRlby9kZWMvbXBlZzQvbGlicmFyeV9yZWdpc3Rlci5oIGIvZXh5bm9zNC9tdWx0aW1lZGlhL29wZW5tYXgvc2VjX29teC9jb21wb25lbnQvdmlkZW8vZGVjL21wZWc0L2xpYnJhcnlfcmVnaXN0ZXIuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40MGFlYzczCi0tLSAvZGV2L251bGwKKysrIGIvZXh5bm9zNC9tdWx0aW1lZGlhL29wZW5tYXgvc2VjX29teC9jb21wb25lbnQvdmlkZW8vZGVjL21wZWc0L2xpYnJhcnlfcmVnaXN0ZXIuaApAQCAtMCwwICsxLDU5IEBACisvKgorICoKKyAqIENvcHlyaWdodCAyMDEwIFNhbXN1bmcgRWxlY3Ryb25pY3MgUy5MU0kgQ28uIExURAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisvKgorICogQGZpbGUgICAgICAgIGxpYnJhcnlfcmVnaXN0ZXIuaAorICogQGJyaWVmCisgKiBAYXV0aG9yICAgICAgWXVuamkgS2ltICh5dW5qaS5raW1Ac2Ftc3VuZy5jb20pCisgKiBAdmVyc2lvbiAgICAgMS4xLjAKKyAqIEBoaXN0b3J5CisgKiAgIDIwMTAuNy4xNSA6IENyZWF0ZQorICovCisKKyNpZm5kZWYgU0VDX09NWF9NUEVHNF9ERUNfUkVHCisjZGVmaW5lIFNFQ19PTVhfTVBFRzRfREVDX1JFRworCisjaW5jbHVkZSAiU0VDX09NWF9EZWYuaCIKKyNpbmNsdWRlICJPTVhfQ29tcG9uZW50LmgiCisjaW5jbHVkZSAiU0VDX09NWF9Db21wb25lbnRfUmVnaXN0ZXIuaCIKKworCisjZGVmaW5lIE9TQ0xfRVhQT1JUX1JFRiBfX2F0dHJpYnV0ZV9fKCh2aXNpYmlsaXR5KCJkZWZhdWx0IikpKQorI2RlZmluZSBNQVhfQ09NUE9ORU5UX05VTSAgICAgICAgICAgICAgMgorI2RlZmluZSBNQVhfQ09NUE9ORU5UX1JPTEVfTlVNICAgIDEKKworLyogTVBFRzQgKi8KKyNkZWZpbmUgU0VDX09NWF9DT01QT05FTlRfTVBFRzRfREVDICAgICAgICAgIk9NWC5TRUMuTVBFRzQuRGVjb2RlciIKKyNkZWZpbmUgU0VDX09NWF9DT01QT05FTlRfTVBFRzRfREVDX1JPTEUgICAgInZpZGVvX2RlY29kZXIubXBlZzQiCisKKy8qIEguMjYzICovCisjZGVmaW5lIFNFQ19PTVhfQ09NUE9ORU5UX0gyNjNfREVDICAgICAgICAgICJPTVguU0VDLkgyNjMuRGVjb2RlciIKKyNkZWZpbmUgU0VDX09NWF9DT01QT05FTlRfSDI2M19ERUNfUk9MRSAgICAgInZpZGVvX2RlY29kZXIuaDI2MyIKKworCisjaWZkZWYgX19jcGx1c3BsdXMKK2V4dGVybiAiQyIgeworI2VuZGlmCisKK09TQ0xfRVhQT1JUX1JFRiBpbnQgU0VDX09NWF9DT01QT05FTlRfTGlicmFyeV9SZWdpc3RlcihTRUNSZWdpc3RlckNvbXBvbmVudFR5cGUgKipwcFNFQ0NvbXBvbmVudCk7CisKKyNpZmRlZiBfX2NwbHVzcGx1cworfTsKKyNlbmRpZgorCisjZW5kaWYKKwpkaWZmIC0tZ2l0IGEvZXh5bm9zNC9tdWx0aW1lZGlhL29wZW5tYXgvc2VjX29teC9jb21wb25lbnQvdmlkZW8vZGVjL3ZjMS9BbmRyb2lkLm1rIGIvZXh5bm9zNC9tdWx0aW1lZGlhL29wZW5tYXgvc2VjX29teC9jb21wb25lbnQvdmlkZW8vZGVjL3ZjMS9BbmRyb2lkLm1rCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjhiZTYzZTEKLS0tIC9kZXYvbnVsbAorKysgYi9leHlub3M0L211bHRpbWVkaWEvb3Blbm1heC9zZWNfb214L2NvbXBvbmVudC92aWRlby9kZWMvdmMxL0FuZHJvaWQubWsKQEAgLTAsMCArMSw2NSBAQAorTE9DQUxfUEFUSCA6PSAkKGNhbGwgbXktZGlyKQoraW5jbHVkZSAkKENMRUFSX1ZBUlMpCisKK0xPQ0FMX01PRFVMRV9UQUdTIDo9IG9wdGlvbmFsCisKK0xPQ0FMX1NSQ19GSUxFUyA6PSBcCisJU0VDX09NWF9XbXZkZWMuYyBcCisJbGlicmFyeV9yZWdpc3Rlci5jCisKK0xPQ0FMX1BSRUxJTktfTU9EVUxFIDo9IGZhbHNlCitMT0NBTF9NT0RVTEUgOj0gbGliT01YLlNFQy5XTVYuRGVjb2RlcgorTE9DQUxfTU9EVUxFX1BBVEggOj0gJChUQVJHRVRfT1VUX1NIQVJFRF9MSUJSQVJJRVMpL29teAorCitMT0NBTF9DRkxBR1MgOj0KKworaWZlcSAoJChCT0FSRF9OT05CTE9DS19NT0RFX1BST0NFU1MpLCB0cnVlKQorTE9DQUxfQ0ZMQUdTICs9IC1ETk9OQkxPQ0tfTU9ERV9QUk9DRVNTCitlbmRpZgorCitpZmVxICgkKEJPQVJEX1VTRV9BTkIpLCB0cnVlKQorTE9DQUxfQ0ZMQUdTICs9IC1EVVNFX0FOQgoraWZlcSAoJChCT0FSRF9VU0VfQ1NDX0ZJTUMpLCB0cnVlKQoraWZlcSAoJChCT0FSRF9VU0VfVjRMMl9JT04pLCBmYWxzZSkKK0xPQ0FMX0NGTEFHUyArPSAtRFVTRV9DU0NfRklNQworZW5kaWYKK2VuZGlmCisKK2lmZXEgKCQoQk9BUkRfVVNFX0NTQ19HU0NBTEVSKSwgdHJ1ZSkKK0xPQ0FMX0NGTEFHUyArPSAtRFVTRV9DU0NfR1NDQUxFUgorZW5kaWYKK2VuZGlmCisKK0xPQ0FMX0FSTV9NT0RFIDo9IGFybQorCitMT0NBTF9TVEFUSUNfTElCUkFSSUVTIDo9IGxpYlNFQ19PTVhfVmRlYyBsaWJzZWNvc2FsIGxpYnNlY2Jhc2Vjb21wb25lbnQgXAorCWxpYnN3Y29udmVydGVyIGxpYnNlY21mY2FwaQorTE9DQUxfU0hBUkVEX0xJQlJBUklFUyA6PSBsaWJjIGxpYmRsIGxpYmN1dGlscyBsaWJ1dGlscyBsaWJ1aSBcCisJbGliU0VDX09NWF9SZXNvdXJjZW1hbmFnZXIgbGliY3NjCisKK2lmZXEgKCQoZmlsdGVyLW91dCBleHlub3M0LCQoVEFSR0VUX0JPQVJEX1BMQVRGT1JNKSksKQorTE9DQUxfU0hBUkVEX0xJQlJBUklFUyArPSBsaWJmaW1jIGxpYmh3Y29udmVydGVyCitlbmRpZgorCitpZmVxICgkKGZpbHRlci1vdXQgZXh5bm9zNSwkKFRBUkdFVF9CT0FSRF9QTEFURk9STSkpLCkKK0xPQ0FMX1NIQVJFRF9MSUJSQVJJRVMgKz0gbGliZXh5bm9zZ3NjYWxlcgorZW5kaWYKKworI2lmZXEgKCQoQk9BUkRfVVNFX1Y0TDJfSU9OKSx0cnVlKQorI0xPQ0FMX1NIQVJFRF9MSUJSQVJJRVMgKz0gbGliaW9uCisjZW5kaWYKKworaWZlcSAoJChCT0FSRF9VU0VTX01GQ19GUFMpLHRydWUpCitMT0NBTF9DRkxBR1MgKz0gLURDT05GSUdfTUZDX0ZQUworZW5kaWYKKworTE9DQUxfQ19JTkNMVURFUyA6PSAkKFNFQ19PTVhfSU5DKS9raHJvbm9zIFwKKwkkKFNFQ19PTVhfSU5DKS9zZWMgXAorCSQoU0VDX09NWF9UT1ApL29zYWwgXAorCSQoU0VDX09NWF9UT1ApL2NvcmUgXAorCSQoU0VDX09NWF9DT01QT05FTlQpL2NvbW1vbiBcCisJJChTRUNfT01YX0NPTVBPTkVOVCkvdmlkZW8vZGVjIFwKKwkkKFRBUkdFVF9PVVRfSEVBREVSUykvJChTRUNfQ09QWV9IRUFERVJTX1RPKSBcCisJJChCT0FSRF9IQUxfUEFUSCkvaW5jbHVkZQorCitpbmNsdWRlICQoQlVJTERfU0hBUkVEX0xJQlJBUlkpCmRpZmYgLS1naXQgYS9leHlub3M0L211bHRpbWVkaWEvb3Blbm1heC9zZWNfb214L2NvbXBvbmVudC92aWRlby9kZWMvdmMxL1NFQ19PTVhfV212ZGVjLmMgYi9leHlub3M0L211bHRpbWVkaWEvb3Blbm1heC9zZWNfb214L2NvbXBvbmVudC92aWRlby9kZWMvdmMxL1NFQ19PTVhfV212ZGVjLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uN2U5MTk0YgotLS0gL2Rldi9udWxsCisrKyBiL2V4eW5vczQvbXVsdGltZWRpYS9vcGVubWF4L3NlY19vbXgvY29tcG9uZW50L3ZpZGVvL2RlYy92YzEvU0VDX09NWF9XbXZkZWMuYwpAQCAtMCwwICsxLDIwMTQgQEAKKy8qCisgKgorICogQ29weXJpZ2h0IDIwMTAgU2Ftc3VuZyBFbGVjdHJvbmljcyBTLkxTSSBDby4gTFRECisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKy8qCisgKiBAZmlsZSAgICBTRUNfT01YX1dtdmRlYy5jCisgKiBAYnJpZWYKKyAqIEBhdXRob3IgICAgSHllWWVvbiBDaHVuZyAoaHllb24uY2h1bmdAc2Ftc3VuZy5jb20pCisgKiBAdmVyc2lvbiAgICAxLjEuMAorICogQGhpc3RvcnkKKyAqICAgMjAxMC44LjE2IDogQ3JlYXRlCisgKiAgIDIwMTAuOC4yMCA6IFN1cHBvcnQgV01WMyAoVmMtMSBTaW1wbGUvTWFpbiBQcm9maWxlKQorICogICAyMDEwLjguMjEgOiBTdXBwb3J0IFdNdkMxIChWYy0xIEFkdmFuY2VkIFByb2ZpbGUpCisgKi8KKworI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8c3RkbGliLmg+CisjaW5jbHVkZSA8c3RyaW5nLmg+CisKKyNpbmNsdWRlICJTRUNfT01YX01hY3Jvcy5oIgorI2luY2x1ZGUgIlNFQ19PTVhfQmFzZWNvbXBvbmVudC5oIgorI2luY2x1ZGUgIlNFQ19PTVhfQmFzZXBvcnQuaCIKKyNpbmNsdWRlICJTRUNfT01YX1ZkZWMuaCIKKyNpbmNsdWRlICJTRUNfT1NBTF9FVEMuaCIKKyNpbmNsdWRlICJTRUNfT1NBTF9TZW1hcGhvcmUuaCIKKyNpbmNsdWRlICJTRUNfT1NBTF9UaHJlYWQuaCIKKyNpbmNsdWRlICJTRUNfT1NBTF9NZW1vcnkuaCIKKyNpbmNsdWRlICJsaWJyYXJ5X3JlZ2lzdGVyLmgiCisjaW5jbHVkZSAiU0VDX09NWF9XbXZkZWMuaCIKKyNpbmNsdWRlICJTc2JTaXBNZmNBcGkuaCIKKyNpbmNsdWRlICJTRUNfT1NBTF9FdmVudC5oIgorCisjaWZkZWYgVVNFX0FOQgorI2luY2x1ZGUgIlNFQ19PU0FMX0FuZHJvaWQuaCIKKyNlbmRpZgorCisvKiBUbyB1c2UgQ1NDX01FVEhPRF9QUkVGRVJfSFcgb3IgQ1NDX01FVEhPRF9IVyBpbiBTRUMgT01YLCBncmFsbG9jIHNob3VsZCBhbGxvY2F0ZSBwaHlzaWNhbCBtZW1vcnkgdXNpbmcgRklNQyAqLworLyogSXQgbWVhbnMgR1JBTExPQ19VU0FHRV9IV19GSU1DMSBzaG91bGQgYmUgc2V0IG9uIE5hdGl2ZSBXaW5kb3cgdXNhZ2UgKi8KKyNpbmNsdWRlICJjc2MuaCIKKworI3VuZGVmICBTRUNfTE9HX1RBRworI2RlZmluZSBTRUNfTE9HX1RBRyAgICAiU0VDX1dNVl9ERUMiCisjZGVmaW5lIFNFQ19MT0dfT0ZGCisjaW5jbHVkZSAiU0VDX09TQUxfTG9nLmgiCisKKyNkZWZpbmUgV01WX0RFQ19OVU1fT0ZfRVhUUkFfQlVGRkVSUyA3CisKKy8vI2RlZmluZSBGVUxMX0ZSQU1FX1NFQVJDSAorCisvKiBBU0YgcGFyc2VyIGRvZXMgbm90IHNlbmQgc3RhcnQgY29kZSBvbiBPcGVuQ09SRSAqLworI2RlZmluZSBXT19TVEFSVF9DT0RFCisKK3N0YXRpYyBPTVhfSEFORExFVFlQRSBnaE1GQ0hhbmRsZSA9IE5VTEw7CitzdGF0aWMgV01WX0ZPUk1BVCBnV3ZtRm9ybWF0ID0gV01WX0ZPUk1BVF9VTktOT1dOOworCitjb25zdCBPTVhfVTMyIHdtdjMgPSAweDMzNTY0ZDU3OworY29uc3QgT01YX1UzMiB3dmMxID0gMHgzMTQzNTY1NzsKK2NvbnN0IE9NWF9VMzIgd212YSA9IDB4NDE1NjRkNTc7CisKK3N0YXRpYyBpbnQgQ2hlY2tfV212X0ZyYW1lKE9NWF9VOCAqcElucHV0U3RyZWFtLCBPTVhfVTMyIGJ1ZmZTaXplLCBPTVhfVTMyIGZsYWcsIE9NWF9CT09MIGJQcmV2aW91c0ZyYW1lRU9GLCBPTVhfQk9PTCAqcGJFbmRPZkZyYW1lKQoreworICAgIE9NWF9VMzIgIGNvbXByZXNzaW9uSUQ7CisgICAgT01YX0JPT0wgYkZyYW1lU3RhcnQ7CisgICAgT01YX1UzMiAgbGVuLCByZWFkU3RyZWFtOworICAgIE9NWF9VMzIgIHN0YXJ0Q29kZTsKKworICAgIFNFQ19PU0FMX0xvZyhTRUNfTE9HX1RSQUNFLCAiYnVmZlNpemUgPSAlZCIsIGJ1ZmZTaXplKTsKKworICAgIGxlbiA9IDA7CisgICAgYkZyYW1lU3RhcnQgPSBPTVhfRkFMU0U7CisKKyAgICBpZiAoZmxhZyAmIE9NWF9CVUZGRVJGTEFHX0NPREVDQ09ORklHKSB7CisgICAgICAgIEJpdG1hcEluZm9IaHIgKnBCaXRtYXBJbmZvSGVhZGVyOworICAgICAgICBwQml0bWFwSW5mb0hlYWRlciA9IChCaXRtYXBJbmZvSGhyICopcElucHV0U3RyZWFtOworCisgICAgICAgIGNvbXByZXNzaW9uSUQgPSBwQml0bWFwSW5mb0hlYWRlci0+QmlDb21wcmVzc2lvbjsKKyAgICAgICAgaWYgKGNvbXByZXNzaW9uSUQgPT0gd212MykgeworICAgICAgICAgICAgU0VDX09TQUxfTG9nKFNFQ19MT0dfVFJBQ0UsICJXTVZfRk9STUFUX1dNVjMiKTsKKyAgICAgICAgICAgIGdXdm1Gb3JtYXQgID0gV01WX0ZPUk1BVF9XTVYzOworCisgICAgICAgICAgICAqcGJFbmRPZkZyYW1lID0gT01YX1RSVUU7CisgICAgICAgICAgICByZXR1cm4gYnVmZlNpemU7CisgICAgICAgIH0KKyAgICAgICAgZWxzZSBpZiAoKGNvbXByZXNzaW9uSUQgPT0gd3ZjMSkgfHwgKGNvbXByZXNzaW9uSUQgPT0gd212YSkpIHsKKyAgICAgICAgICAgIFNFQ19PU0FMX0xvZyhTRUNfTE9HX1RSQUNFLCAiV01WX0ZPUk1BVF9WQzEiKTsKKyAgICAgICAgICAgIGdXdm1Gb3JtYXQgID0gV01WX0ZPUk1BVF9WQzE7CisKKyNpZmRlZiBXT19TVEFSVF9DT0RFCisvKiBBU0YgcGFyc2VyIGRvZXMgbm90IHNlbmQgc3RhcnQgY29kZSBvbiBPcGVuQ09SRSAqLworICAgICAgICAgICAgKnBiRW5kT2ZGcmFtZSA9IE9NWF9UUlVFOworICAgICAgICAgICAgcmV0dXJuIGJ1ZmZTaXplOworI2VuZGlmCisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoZ1d2bUZvcm1hdCA9PSBXTVZfRk9STUFUX1dNVjMpIHsKKyAgICAgICAgKnBiRW5kT2ZGcmFtZSA9IE9NWF9UUlVFOworICAgICAgICByZXR1cm4gYnVmZlNpemU7CisgICAgfQorCisjaWZkZWYgV09fU1RBUlRfQ09ERQorLyogQVNGIHBhcnNlciBkb2VzIG5vdCBzZW5kIHN0YXJ0IGNvZGUgb24gT3BlbkNPUkUgKi8KKyAgICBpZiAoZ1d2bUZvcm1hdCA9PSBXTVZfRk9STUFUX1ZDMSkgeworICAgICAgICAqcGJFbmRPZkZyYW1lID0gT01YX1RSVUU7CisgICAgICAgIHJldHVybiBidWZmU2l6ZTsKKyAgICB9CisjZWxzZQorIC8qIFRPRE8gOiBmb3IgY29tZm9ybWFuYyB0ZXN0IGJhc2VkIG9uIGNvbW1vbiBidWZmZXIgc2NoZW1lIHcvbyBwYXJzZXIgKi8KKworICAgIGlmIChiUHJldmlvdXNGcmFtZUVPRiA9PSBPTVhfRkFMU0UpCisgICAgICAgIGJGcmFtZVN0YXJ0ID0gT01YX1RSVUU7CisKKyAgICBzdGFydENvZGUgPSAweEZGRkZGRkZGOworICAgIGlmIChiRnJhbWVTdGFydCA9PSBPTVhfRkFMU0UpIHsKKyAgICAgICAgLyogZmluZCBGcmFtZSBzdGFydCBjb2RlICovCisgICAgICAgIHdoaWxlKHN0YXJ0Q29kZSAhPSAweDEwRCkgeworICAgICAgICAgICAgcmVhZFN0cmVhbSA9ICoocElucHV0U3RyZWFtICsgbGVuKTsKKyAgICAgICAgICAgIHN0YXJ0Q29kZSA9IChzdGFydENvZGUgPDwgOCkgfCByZWFkU3RyZWFtOworICAgICAgICAgICAgbGVuKys7CisgICAgICAgICAgICBpZiAobGVuID4gYnVmZlNpemUpCisgICAgICAgICAgICAgICAgZ290byBFWElUOworICAgICAgICB9CisgICAgfQorCisgICAgLyogZmluZCBuZXh0IEZyYW1lIHN0YXJ0IGNvZGUgKi8KKyAgICBzdGFydENvZGUgPSAweEZGRkZGRkZGOworICAgIHdoaWxlICgoc3RhcnRDb2RlICE9IDB4MTBEKSkgeworICAgICAgICByZWFkU3RyZWFtID0gKihwSW5wdXRTdHJlYW0gKyBsZW4pOworICAgICAgICBzdGFydENvZGUgPSAoc3RhcnRDb2RlIDw8IDgpIHwgcmVhZFN0cmVhbTsKKyAgICAgICAgbGVuKys7CisgICAgICAgIGlmIChsZW4gPiBidWZmU2l6ZSkKKyAgICAgICAgICAgIGdvdG8gRVhJVDsKKyAgICB9CisKKyAgICAqcGJFbmRPZkZyYW1lID0gT01YX1RSVUU7CisKKyAgICBTRUNfT1NBTF9Mb2coU0VDX0xPR19UUkFDRSwgIjEuIENoZWNrX1dtdl9GcmFtZSByZXR1cm5lZCBFT0YgPSAlZCwgbGVuID0gJWQsIGJ1ZmZTaXplID0gJWQiLCAqcGJFbmRPZkZyYW1lLCBsZW4gLSA0LCBidWZmU2l6ZSk7CisKKyAgICByZXR1cm4gbGVuIC0gNDsKKyNlbmRpZgorCitFWElUIDoKKyAgICAqcGJFbmRPZkZyYW1lID0gT01YX0ZBTFNFOworCisgICAgU0VDX09TQUxfTG9nKFNFQ19MT0dfVFJBQ0UsICIyLiBDaGVja19XbXZfRnJhbWUgcmV0dXJuZWQgRU9GID0gJWQsIGxlbiA9ICVkLCBidWZmU2l6ZSA9ICVkIiwgKnBiRW5kT2ZGcmFtZSwgbGVuIC0gMSwgYnVmZlNpemUpOworCisgICAgcmV0dXJuIC0tbGVuOworfQorCitPTVhfQk9PTCBDaGVja19TdHJlYW1fUHJlZml4Q29kZShPTVhfVTggKnBJbnB1dFN0cmVhbSwgT01YX1UzMiBzdHJlYW1TaXplLCBXTVZfRk9STUFUIHdtdkZvcm1hdCkKK3sKKyAgICBzd2l0Y2ggKHdtdkZvcm1hdCkgeworICAgIGNhc2UgV01WX0ZPUk1BVF9XTVYzOgorICAgICAgICBpZiAoc3RyZWFtU2l6ZSA+IDApCisgICAgICAgICAgICByZXR1cm4gT01YX1RSVUU7CisgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHJldHVybiBPTVhfRkFMU0U7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgV01WX0ZPUk1BVF9WQzE6CisKKyNpZmRlZiBXT19TVEFSVF9DT0RFCisgICAgICAgIC8qIEFTRiBwYXJzZXIgZG9lcyBub3Qgc2VuZCBzdGFydCBjb2RlIG9uIE9wZW5DT1JFICovCisgICAgICAgIGlmIChzdHJlYW1TaXplID4gMykKKyAgICAgICAgICAgIHJldHVybiBPTVhfVFJVRTsKKyAgICAgICAgZWxzZQorICAgICAgICAgICAgcmV0dXJuIE9NWF9GQUxTRTsKKyAgICAgICAgYnJlYWs7CisjZWxzZQorICAgICAgICAvKiBUT0RPIDogZm9yIGNvbWZvcm1hbmMgdGVzdCBiYXNlZCBvbiBjb21tb24gYnVmZmVyIHNjaGVtZSB3L28gcGFyc2VyICovCisgICAgICAgIGlmIChzdHJlYW1TaXplIDwgMykgeworICAgICAgICAgICAgU0VDX09TQUxfTG9nKFNFQ19MT0dfRVJST1IsICIlczogc3RyZWFtU2l6ZSBpcyB0b28gc21hbGwgKCVkKSIsIF9fRlVOQ1RJT05fXywgc3RyZWFtU2l6ZSk7CisgICAgICAgICAgICByZXR1cm4gT01YX0ZBTFNFOworICAgICAgICB9IGVsc2UgaWYgKChwSW5wdXRTdHJlYW1bMF0gPT0gMHgwMCkgJiYKKyAgICAgICAgICAgICAgICAgICAocElucHV0U3RyZWFtWzFdID09IDB4MDApICYmCisgICAgICAgICAgICAgICAgICAgKHBJbnB1dFN0cmVhbVsyXSA9PSAweDAxKSkgeworICAgICAgICAgICAgcmV0dXJuIE9NWF9UUlVFOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgU0VDX09TQUxfTG9nKFNFQ19MT0dfRVJST1IsICIlczogQ2Fubm90IGZpbmQgcHJlZml4IiwgX19GVU5DVElPTl9fKTsKKyAgICAgICAgICAgIHJldHVybiBPTVhfRkFMU0U7CisgICAgICAgIH0KKyNlbmRpZgorICAgICAgICBicmVhazsKKworICAgIGRlZmF1bHQ6CisgICAgICAgIFNFQ19PU0FMX0xvZyhTRUNfTE9HX1dBUk5JTkcsICIlczogdW5kZWZpbmVkIHdtdkZvcm1hdCAoJWQpIiwgX19GVU5DVElPTl9fLCB3bXZGb3JtYXQpOworICAgICAgICByZXR1cm4gT01YX0ZBTFNFOworICAgICAgICBicmVhazsKKyAgICB9Cit9CisKK09NWF9CT09MIE1ha2VfU3RyZWFtX01ldGFEYXRhKE9NWF9VOCAqcElucHV0U3RyZWFtLCBPTVhfVTMyICpwU3RyZWFtU2l6ZSwgV01WX0ZPUk1BVCB3bXZGb3JtYXQpCit7CisgICAgT01YX1UzMiB3aWR0aCwgaGVpZ2h0OworICAgIE9NWF9VOCAgKnBDdXJyQnVmID0gcElucHV0U3RyZWFtOworICAgIE9NWF9VMzIgY3VyclBvcyA9IDA7CisKKyAgICBGdW5jdGlvbkluKCk7CisKKyAgICAvKiBTZXF1ZW5jZSBMYXllciBEYXRhIFN0cnVjdHVyZSAqLworICAgIE9NWF9VOCBjb25zdF9DNVs0XSA9IHsweDAwLCAweDAwLCAweDAwLCAweGM1fTsKKyAgICBPTVhfVTggY29uc3RfMDRbNF0gPSB7MHgwNCwgMHgwMCwgMHgwMCwgMHgwMH07CisgICAgT01YX1U4IGNvbnN0XzBDWzRdID0gezB4MEMsIDB4MDAsIDB4MDAsIDB4MDB9OworICAgIE9NWF9VOCBzdHJ1Y3RfQl8xWzRdID0gezB4QjMsIDB4MTksIDB4MDAsIDB4MDB9OworICAgIE9NWF9VOCBzdHJ1Y3RfQl8yWzRdID0gezB4NDQsIDB4NjIsIDB4MDUsIDB4MDB9OworICAgIE9NWF9VOCBzdHJ1Y3RfQl8zWzRdID0gezB4MEYsIDB4MDAsIDB4MDAsIDB4MDB9OworICAgIE9NWF9VOCBzdHJ1Y3RfQ1s0XSA9IHsweDMwLCAweDAwLCAweDAwLCAweDAwfTsKKworICAgIHN3aXRjaCAod212Rm9ybWF0KSB7CisgICAgY2FzZSBXTVZfRk9STUFUX1dNVjM6CisgICAgICAgIGlmICgqcFN0cmVhbVNpemUgPj0gQklUTUFQSU5GT0hFQURFUl9TSVpFKSB7CisgICAgICAgICAgICBCaXRtYXBJbmZvSGhyICpwQml0bWFwSW5mb0hlYWRlcjsKKyAgICAgICAgICAgIHBCaXRtYXBJbmZvSGVhZGVyID0gKEJpdG1hcEluZm9IaHIgKilwSW5wdXRTdHJlYW07CisKKyAgICAgICAgICAgIHdpZHRoID0gcEJpdG1hcEluZm9IZWFkZXItPkJpV2lkdGg7CisgICAgICAgICAgICBoZWlnaHQgPSBwQml0bWFwSW5mb0hlYWRlci0+QmlIZWlnaHQ7CisgICAgICAgICAgICBpZiAoKnBTdHJlYW1TaXplID4gQklUTUFQSU5GT0hFQURFUl9TSVpFKQorICAgICAgICAgICAgICAgIFNFQ19PU0FMX01lbWNweShzdHJ1Y3RfQywgcElucHV0U3RyZWFtK0JJVE1BUElORk9IRUFERVJfU0laRSwgNCk7CisKKyAgICAgICAgICAgIFNFQ19PU0FMX01lbWNweShwQ3VyckJ1ZiArIGN1cnJQb3MsIGNvbnN0X0M1LCA0KTsKKyAgICAgICAgICAgIGN1cnJQb3MgKz00OworCisgICAgICAgICAgICBTRUNfT1NBTF9NZW1jcHkocEN1cnJCdWYgKyBjdXJyUG9zLCBjb25zdF8wNCwgNCk7CisgICAgICAgICAgICBjdXJyUG9zICs9NDsKKworICAgICAgICAgICAgU0VDX09TQUxfTWVtY3B5KHBDdXJyQnVmICsgY3VyclBvcywgc3RydWN0X0MsIDQpOworICAgICAgICAgICAgY3VyclBvcyArPTQ7CisKKyAgICAgICAgICAgIC8qIHN0cnVjdF9BIDogVkVSVF9TSVpFICovCisgICAgICAgICAgICBwQ3VyckJ1ZltjdXJyUG9zXSA9ICBoZWlnaHQgJiAweEZGOworICAgICAgICAgICAgcEN1cnJCdWZbY3VyclBvcysxXSA9IChoZWlnaHQ+PjgpICYgMHhGRjsKKyAgICAgICAgICAgIHBDdXJyQnVmW2N1cnJQb3MrMl0gPSAoaGVpZ2h0Pj4xNikgJiAweEZGOworICAgICAgICAgICAgcEN1cnJCdWZbY3VyclBvcyszXSA9IChoZWlnaHQ+PjI0KSAmIDB4RkY7CisgICAgICAgICAgICBjdXJyUG9zICs9NDsKKworICAgICAgICAgICAgLyogc3RydWN0X0EgOiBIT1JJWl9TSVpFICovCisgICAgICAgICAgICBwQ3VyckJ1ZltjdXJyUG9zXSA9ICB3aWR0aCAmIDB4RkY7CisgICAgICAgICAgICBwQ3VyckJ1ZltjdXJyUG9zKzFdID0gKHdpZHRoPj44KSAmIDB4RkY7CisgICAgICAgICAgICBwQ3VyckJ1ZltjdXJyUG9zKzJdID0gKHdpZHRoPj4xNikgJiAweEZGOworICAgICAgICAgICAgcEN1cnJCdWZbY3VyclBvcyszXSA9ICh3aWR0aD4+MjQpICYgMHhGRjsKKyAgICAgICAgICAgIGN1cnJQb3MgKz00OworCisgICAgICAgICAgICBTRUNfT1NBTF9NZW1jcHkocEN1cnJCdWYgKyBjdXJyUG9zLGNvbnN0XzBDLCA0KTsKKyAgICAgICAgICAgIGN1cnJQb3MgKz00OworCisgICAgICAgICAgICBTRUNfT1NBTF9NZW1jcHkocEN1cnJCdWYgKyBjdXJyUG9zLCBzdHJ1Y3RfQl8xLCA0KTsKKyAgICAgICAgICAgIGN1cnJQb3MgKz00OworCisgICAgICAgICAgICBTRUNfT1NBTF9NZW1jcHkocEN1cnJCdWYgKyBjdXJyUG9zLCBzdHJ1Y3RfQl8yLCA0KTsKKyAgICAgICAgICAgIGN1cnJQb3MgKz00OworCisgICAgICAgICAgICBTRUNfT1NBTF9NZW1jcHkocEN1cnJCdWYgKyBjdXJyUG9zLCBzdHJ1Y3RfQl8zLCA0KTsKKyAgICAgICAgICAgIGN1cnJQb3MgKz00OworCisgICAgICAgICAgICAqcFN0cmVhbVNpemUgPSBjdXJyUG9zOworICAgICAgICAgICAgcmV0dXJuIE9NWF9UUlVFOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgU0VDX09TQUxfTG9nKFNFQ19MT0dfRVJST1IsICIlczogKnBTdHJlYW1TaXplIGlzIHRvbyBzbWFsbCB0byBjb250YWluIG1ldGFkYXRhKCVkKSIsIF9fRlVOQ1RJT05fXywgKnBTdHJlYW1TaXplKTsKKyAgICAgICAgICAgIHJldHVybiBPTVhfRkFMU0U7CisgICAgICAgIH0KKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBXTVZfRk9STUFUX1ZDMToKKyAgICAgICAgaWYgKCpwU3RyZWFtU2l6ZSA+PSBCSVRNQVBJTkZPSEVBREVSX0FTRkJJTkRJTkdfU0laRSkgeworICAgICAgICAgICAgU0VDX09TQUxfTWVtY3B5KHBDdXJyQnVmLCBwSW5wdXRTdHJlYW0gKyBCSVRNQVBJTkZPSEVBREVSX0FTRkJJTkRJTkdfU0laRSwgKnBTdHJlYW1TaXplIC0gQklUTUFQSU5GT0hFQURFUl9BU0ZCSU5ESU5HX1NJWkUpOworICAgICAgICAgICAgKnBTdHJlYW1TaXplIC09IEJJVE1BUElORk9IRUFERVJfQVNGQklORElOR19TSVpFOworICAgICAgICAgICAgcmV0dXJuIE9NWF9UUlVFOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgU0VDX09TQUxfTG9nKFNFQ19MT0dfRVJST1IsICIlczogKnBTdHJlYW1TaXplIGlzIHRvbyBzbWFsbCB0byBjb250YWluIG1ldGFkYXRhKCVkKSIsIF9fRlVOQ1RJT05fXywgKnBTdHJlYW1TaXplKTsKKyAgICAgICAgICAgIHJldHVybiBPTVhfRkFMU0U7CisgICAgICAgIH0KKyAgICAgICAgYnJlYWs7CisgICAgZGVmYXVsdDoKKyAgICAgICAgU0VDX09TQUxfTG9nKFNFQ19MT0dfV0FSTklORywgIiVzOiBJdCBpcyBub3QgbmVjZXNzYXJ5IHRvIG1ha2UgYml0c3RyZWFtIG1ldGFkYXRhIGZvciB3bXZGb3JtYXQgKCVkKSIsIF9fRlVOQ1RJT05fXywgd212Rm9ybWF0KTsKKyAgICAgICAgcmV0dXJuIE9NWF9GQUxTRTsKKyAgICAgICAgYnJlYWs7CisgICAgfQorfQorCisjaWZkZWYgV09fU1RBUlRfQ09ERQorT01YX0JPT0wgTWFrZV9TdHJlYW1fU3RhcnRDb2RlKE9NWF9VOCAqcElucHV0U3RyZWFtLCBPTVhfVTMyIHN0cmVhbVNpemUsIFdNVl9GT1JNQVQgd212Rm9ybWF0KQoreworICAgIE9NWF9VOCAgZnJhbWVTdGFydENvZGVbNF0gPSB7MHgwMCwgMHgwMCwgMHgwMSwgMHgwZH07CisgICAgT01YX1UzMiBpOworCisgICAgc3dpdGNoICh3bXZGb3JtYXQpIHsKKyAgICBjYXNlIFdNVl9GT1JNQVRfV01WMzoKKyAgICAgICAgcmV0dXJuIE9NWF9UUlVFOworICAgICAgICBicmVhazsKKworICAgIGNhc2UgV01WX0ZPUk1BVF9WQzE6CisgICAgICAgIC8qIFNob3VsZCBmaW5kIGJldHRlciB3YXkgdG8gc2hpZnQgZGF0YSAqLworICAgICAgICBTRUNfT1NBTF9NZW1tb3ZlKHBJbnB1dFN0cmVhbSs0LCBwSW5wdXRTdHJlYW0sIHN0cmVhbVNpemUpOworICAgICAgICBTRUNfT1NBTF9NZW1jcHkocElucHV0U3RyZWFtLCBmcmFtZVN0YXJ0Q29kZSwgNCk7CisKKyAgICAgICAgcmV0dXJuIE9NWF9UUlVFOworICAgICAgICBicmVhazsKKworICAgIGRlZmF1bHQ6CisgICAgICAgIFNFQ19PU0FMX0xvZyhTRUNfTE9HX1dBUk5JTkcsICIlczogdW5kZWZpbmVkIHdtdkZvcm1hdCAoJWQpIiwgX19GVU5DVElPTl9fLCB3bXZGb3JtYXQpOworICAgICAgICByZXR1cm4gT01YX0ZBTFNFOworICAgICAgICBicmVhazsKKyAgICB9Cit9CisjZW5kaWYKKworT01YX0VSUk9SVFlQRSBTRUNfTUZDX1dtdkRlY19HZXRQYXJhbWV0ZXIoCisgICAgT01YX0lOICAgIE9NWF9IQU5ETEVUWVBFIGhDb21wb25lbnQsCisgICAgT01YX0lOICAgIE9NWF9JTkRFWFRZUEUgIG5QYXJhbUluZGV4LAorICAgIE9NWF9JTk9VVCBPTVhfUFRSICAgICAgICBwQ29tcG9uZW50UGFyYW1ldGVyU3RydWN0dXJlKQoreworICAgIE9NWF9FUlJPUlRZUEUgICAgICAgICByZXQgPSBPTVhfRXJyb3JOb25lOworICAgIE9NWF9DT01QT05FTlRUWVBFICAgICAqcE9NWENvbXBvbmVudCA9IE5VTEw7CisgICAgU0VDX09NWF9CQVNFQ09NUE9ORU5UICpwU0VDQ29tcG9uZW50ID0gTlVMTDsKKworICAgIEZ1bmN0aW9uSW4oKTsKKworICAgIGlmIChoQ29tcG9uZW50ID09IE5VTEwgfHwgcENvbXBvbmVudFBhcmFtZXRlclN0cnVjdHVyZSA9PSBOVUxMKSB7CisgICAgICAgIHJldCA9IE9NWF9FcnJvckJhZFBhcmFtZXRlcjsKKyAgICAgICAgZ290byBFWElUOworICAgIH0KKyAgICBwT01YQ29tcG9uZW50ID0gKE9NWF9DT01QT05FTlRUWVBFICopaENvbXBvbmVudDsKKyAgICByZXQgPSBTRUNfT01YX0NoZWNrX1NpemVWZXJzaW9uKHBPTVhDb21wb25lbnQsIHNpemVvZihPTVhfQ09NUE9ORU5UVFlQRSkpOworICAgIGlmIChyZXQgIT0gT01YX0Vycm9yTm9uZSkgeworICAgICAgICBnb3RvIEVYSVQ7CisgICAgfQorICAgIGlmIChwT01YQ29tcG9uZW50LT5wQ29tcG9uZW50UHJpdmF0ZSA9PSBOVUxMKSB7CisgICAgICAgIHJldCA9IE9NWF9FcnJvckJhZFBhcmFtZXRlcjsKKyAgICAgICAgZ290byBFWElUOworICAgIH0KKworICAgIHBTRUNDb21wb25lbnQgPSAoU0VDX09NWF9CQVNFQ09NUE9ORU5UICopcE9NWENvbXBvbmVudC0+cENvbXBvbmVudFByaXZhdGU7CisgICAgaWYgKHBTRUNDb21wb25lbnQtPmN1cnJlbnRTdGF0ZSA9PSBPTVhfU3RhdGVJbnZhbGlkICkgeworICAgICAgICByZXQgPSBPTVhfRXJyb3JJbnZhbGlkU3RhdGU7CisgICAgICAgIGdvdG8gRVhJVDsKKyAgICB9CisKKyAgICBzd2l0Y2ggKG5QYXJhbUluZGV4KSB7CisgICAgY2FzZSBPTVhfSW5kZXhQYXJhbVZpZGVvV212OgorICAgIHsKKyAgICAgICAgT01YX1ZJREVPX1BBUkFNX1dNVlRZUEUgKnBEc3RXbXZQYXJhbSA9IChPTVhfVklERU9fUEFSQU1fV01WVFlQRSAqKXBDb21wb25lbnRQYXJhbWV0ZXJTdHJ1Y3R1cmU7CisgICAgICAgIE9NWF9WSURFT19QQVJBTV9XTVZUWVBFICpwU3JjV212UGFyYW0gPSBOVUxMOworICAgICAgICBTRUNfV01WX0hBTkRMRSAgICAgICAgICAqcFdtdkRlYyA9IE5VTEw7CisgICAgICAgIHJldCA9IFNFQ19PTVhfQ2hlY2tfU2l6ZVZlcnNpb24ocERzdFdtdlBhcmFtLCBzaXplb2YoT01YX1ZJREVPX1BBUkFNX1dNVlRZUEUpKTsKKyAgICAgICAgaWYgKHJldCAhPSBPTVhfRXJyb3JOb25lKSB7CisgICAgICAgICAgICBnb3RvIEVYSVQ7CisgICAgICAgIH0KKworICAgICAgICBpZiAocERzdFdtdlBhcmFtLT5uUG9ydEluZGV4ID4gT1VUUFVUX1BPUlRfSU5ERVgpIHsKKyAgICAgICAgICAgIHJldCA9IE9NWF9FcnJvckJhZFBvcnRJbmRleDsKKyAgICAgICAgfQorCisgICAgICAgIHBXbXZEZWMgPSAoU0VDX1dNVl9IQU5ETEUgKikoKFNFQ19PTVhfVklERU9ERUNfQ09NUE9ORU5UICopcFNFQ0NvbXBvbmVudC0+aENvbXBvbmVudEhhbmRsZSktPmhDb2RlY0hhbmRsZTsKKyAgICAgICAgcFNyY1dtdlBhcmFtID0gJnBXbXZEZWMtPldtdkNvbXBvbmVudFtwRHN0V212UGFyYW0tPm5Qb3J0SW5kZXhdOworCisgICAgICAgIFNFQ19PU0FMX01lbWNweShwRHN0V212UGFyYW0sIHBTcmNXbXZQYXJhbSwgc2l6ZW9mKE9NWF9WSURFT19QQVJBTV9XTVZUWVBFKSk7CisgICAgfQorICAgICAgICBicmVhazsKKyAgICBjYXNlIE9NWF9JbmRleFBhcmFtU3RhbmRhcmRDb21wb25lbnRSb2xlOgorICAgIHsKKyAgICAgICAgT01YX1BBUkFNX0NPTVBPTkVOVFJPTEVUWVBFICpwQ29tcG9uZW50Um9sZSA9IChPTVhfUEFSQU1fQ09NUE9ORU5UUk9MRVRZUEUqKXBDb21wb25lbnRQYXJhbWV0ZXJTdHJ1Y3R1cmU7CisgICAgICAgIHJldCA9IFNFQ19PTVhfQ2hlY2tfU2l6ZVZlcnNpb24ocENvbXBvbmVudFJvbGUsIHNpemVvZihPTVhfUEFSQU1fQ09NUE9ORU5UUk9MRVRZUEUpKTsKKyAgICAgICAgICAgIGlmIChyZXQgIT0gT01YX0Vycm9yTm9uZSkgeworICAgICAgICAgICAgZ290byBFWElUOworICAgICAgICB9CisKKyAgICAgICAgU0VDX09TQUxfU3RyY3B5KChjaGFyICopcENvbXBvbmVudFJvbGUtPmNSb2xlLCBTRUNfT01YX0NPTVBPTkVOVF9XTVZfREVDX1JPTEUpOworICAgIH0KKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBPTVhfSW5kZXhQYXJhbVZpZGVvRXJyb3JDb3JyZWN0aW9uOgorICAgIHsKKyAgICAgICAgT01YX1ZJREVPX1BBUkFNX0VSUk9SQ09SUkVDVElPTlRZUEUgKnBEc3RFcnJvckNvcnJlY3Rpb25UeXBlID0gKE9NWF9WSURFT19QQVJBTV9FUlJPUkNPUlJFQ1RJT05UWVBFICopcENvbXBvbmVudFBhcmFtZXRlclN0cnVjdHVyZTsKKyAgICAgICAgT01YX1ZJREVPX1BBUkFNX0VSUk9SQ09SUkVDVElPTlRZUEUgKnBTcmNFcnJvckNvcnJlY3Rpb25UeXBlID0gTlVMTDsKKyAgICAgICAgU0VDX1dNVl9IQU5ETEUgICAgICAgICAgICAgICAgICAgICAgKnBXbXZEZWMgPSBOVUxMOworCisgICAgICAgIHJldCA9IFNFQ19PTVhfQ2hlY2tfU2l6ZVZlcnNpb24ocERzdEVycm9yQ29ycmVjdGlvblR5cGUsIHNpemVvZihPTVhfVklERU9fUEFSQU1fRVJST1JDT1JSRUNUSU9OVFlQRSkpOworICAgICAgICBpZiAocmV0ICE9IE9NWF9FcnJvck5vbmUpIHsKKyAgICAgICAgICAgIGdvdG8gRVhJVDsKKyAgICAgICAgfQorCisgICAgICAgIGlmIChwRHN0RXJyb3JDb3JyZWN0aW9uVHlwZS0+blBvcnRJbmRleCAhPSBJTlBVVF9QT1JUX0lOREVYKSB7CisgICAgICAgICAgICByZXQgPSBPTVhfRXJyb3JCYWRQb3J0SW5kZXg7CisgICAgICAgICAgICBnb3RvIEVYSVQ7CisgICAgICAgIH0KKworICAgICAgICBwV212RGVjID0gKFNFQ19XTVZfSEFORExFICopKChTRUNfT01YX1ZJREVPREVDX0NPTVBPTkVOVCAqKXBTRUNDb21wb25lbnQtPmhDb21wb25lbnRIYW5kbGUpLT5oQ29kZWNIYW5kbGU7CisgICAgICAgIHBTcmNFcnJvckNvcnJlY3Rpb25UeXBlID0gJnBXbXZEZWMtPmVycm9yQ29ycmVjdGlvblR5cGVbSU5QVVRfUE9SVF9JTkRFWF07CisKKyAgICAgICAgcERzdEVycm9yQ29ycmVjdGlvblR5cGUtPmJFbmFibGVIRUMgPSBwU3JjRXJyb3JDb3JyZWN0aW9uVHlwZS0+YkVuYWJsZUhFQzsKKyAgICAgICAgcERzdEVycm9yQ29ycmVjdGlvblR5cGUtPmJFbmFibGVSZXN5bmMgPSBwU3JjRXJyb3JDb3JyZWN0aW9uVHlwZS0+YkVuYWJsZVJlc3luYzsKKyAgICAgICAgcERzdEVycm9yQ29ycmVjdGlvblR5cGUtPm5SZXN5bmNoTWFya2VyU3BhY2luZyA9IHBTcmNFcnJvckNvcnJlY3Rpb25UeXBlLT5uUmVzeW5jaE1hcmtlclNwYWNpbmc7CisgICAgICAgIHBEc3RFcnJvckNvcnJlY3Rpb25UeXBlLT5iRW5hYmxlRGF0YVBhcnRpdGlvbmluZyA9IHBTcmNFcnJvckNvcnJlY3Rpb25UeXBlLT5iRW5hYmxlRGF0YVBhcnRpdGlvbmluZzsKKyAgICAgICAgcERzdEVycm9yQ29ycmVjdGlvblR5cGUtPmJFbmFibGVSVkxDID0gcFNyY0Vycm9yQ29ycmVjdGlvblR5cGUtPmJFbmFibGVSVkxDOworICAgIH0KKyAgICAgICAgYnJlYWs7CisgICAgZGVmYXVsdDoKKyAgICAgICAgcmV0ID0gU0VDX09NWF9WaWRlb0RlY29kZUdldFBhcmFtZXRlcihoQ29tcG9uZW50LCBuUGFyYW1JbmRleCwgcENvbXBvbmVudFBhcmFtZXRlclN0cnVjdHVyZSk7CisgICAgICAgIGJyZWFrOworICAgIH0KK0VYSVQ6CisgICAgRnVuY3Rpb25PdXQoKTsKKworICAgIHJldHVybiByZXQ7Cit9CisKK09NWF9FUlJPUlRZUEUgU0VDX01GQ19XbXZEZWNfU2V0UGFyYW1ldGVyKAorICAgIE9NWF9JTiBPTVhfSEFORExFVFlQRSBoQ29tcG9uZW50LAorICAgIE9NWF9JTiBPTVhfSU5ERVhUWVBFICBuSW5kZXgsCisgICAgT01YX0lOIE9NWF9QVFIgICAgICAgIHBDb21wb25lbnRQYXJhbWV0ZXJTdHJ1Y3R1cmUpCit7CisgICAgT01YX0VSUk9SVFlQRSAgICAgICAgICByZXQgPSBPTVhfRXJyb3JOb25lOworICAgIE9NWF9DT01QT05FTlRUWVBFICAgICAqcE9NWENvbXBvbmVudCA9IE5VTEw7CisgICAgU0VDX09NWF9CQVNFQ09NUE9ORU5UICpwU0VDQ29tcG9uZW50ID0gTlVMTDsKKworICAgIEZ1bmN0aW9uSW4oKTsKKworICAgIGlmIChoQ29tcG9uZW50ID09IE5VTEwgfHwgcENvbXBvbmVudFBhcmFtZXRlclN0cnVjdHVyZSA9PSBOVUxMKSB7CisgICAgICAgIHJldCA9IE9NWF9FcnJvckJhZFBhcmFtZXRlcjsKKyAgICAgICAgZ290byBFWElUOworICAgIH0KKyAgICBwT01YQ29tcG9uZW50ID0gKE9NWF9DT01QT05FTlRUWVBFICopaENvbXBvbmVudDsKKyAgICByZXQgPSBTRUNfT01YX0NoZWNrX1NpemVWZXJzaW9uKHBPTVhDb21wb25lbnQsIHNpemVvZihPTVhfQ09NUE9ORU5UVFlQRSkpOworICAgIGlmIChyZXQgIT0gT01YX0Vycm9yTm9uZSkgeworICAgICAgICBnb3RvIEVYSVQ7CisgICAgfQorICAgIGlmIChwT01YQ29tcG9uZW50LT5wQ29tcG9uZW50UHJpdmF0ZSA9PSBOVUxMKSB7CisgICAgICAgIHJldCA9IE9NWF9FcnJvckJhZFBhcmFtZXRlcjsKKyAgICAgICAgZ290byBFWElUOworICAgIH0KKworICAgIHBTRUNDb21wb25lbnQgPSAoU0VDX09NWF9CQVNFQ09NUE9ORU5UICopcE9NWENvbXBvbmVudC0+cENvbXBvbmVudFByaXZhdGU7CisgICAgaWYgKHBTRUNDb21wb25lbnQtPmN1cnJlbnRTdGF0ZSA9PSBPTVhfU3RhdGVJbnZhbGlkICkgeworICAgICAgICByZXQgPSBPTVhfRXJyb3JJbnZhbGlkU3RhdGU7CisgICAgICAgIGdvdG8gRVhJVDsKKyAgICB9CisKKyAgICBzd2l0Y2ggKG5JbmRleCkgeworICAgIGNhc2UgT01YX0luZGV4UGFyYW1WaWRlb1dtdjoKKyAgICB7CisgICAgICAgIE9NWF9WSURFT19QQVJBTV9XTVZUWVBFICpwRHN0V212UGFyYW0gPSBOVUxMOworICAgICAgICBPTVhfVklERU9fUEFSQU1fV01WVFlQRSAqcFNyY1dtdlBhcmFtID0gKE9NWF9WSURFT19QQVJBTV9XTVZUWVBFICopcENvbXBvbmVudFBhcmFtZXRlclN0cnVjdHVyZTsKKyAgICAgICAgU0VDX1dNVl9IQU5ETEUgICAgICAgICAgKnBXbXZEZWMgPSBOVUxMOworICAgICAgICByZXQgPSBTRUNfT01YX0NoZWNrX1NpemVWZXJzaW9uKHBTcmNXbXZQYXJhbSwgc2l6ZW9mKE9NWF9WSURFT19QQVJBTV9XTVZUWVBFKSk7CisgICAgICAgIGlmIChyZXQgIT0gT01YX0Vycm9yTm9uZSkgeworICAgICAgICAgICAgZ290byBFWElUOworICAgICAgICB9CisKKyAgICAgICAgaWYgKHBTcmNXbXZQYXJhbS0+blBvcnRJbmRleCA+IE9VVFBVVF9QT1JUX0lOREVYKSB7CisgICAgICAgICAgICByZXQgPSBPTVhfRXJyb3JCYWRQb3J0SW5kZXg7CisgICAgICAgICAgICBnb3RvIEVYSVQ7CisgICAgICAgIH0KKworICAgICAgICBwV212RGVjID0gKFNFQ19XTVZfSEFORExFICopKChTRUNfT01YX1ZJREVPREVDX0NPTVBPTkVOVCAqKXBTRUNDb21wb25lbnQtPmhDb21wb25lbnRIYW5kbGUpLT5oQ29kZWNIYW5kbGU7CisgICAgICAgIHBEc3RXbXZQYXJhbSA9ICZwV212RGVjLT5XbXZDb21wb25lbnRbcFNyY1dtdlBhcmFtLT5uUG9ydEluZGV4XTsKKworICAgICAgICBTRUNfT1NBTF9NZW1jcHkocERzdFdtdlBhcmFtLCBwU3JjV212UGFyYW0sIHNpemVvZihPTVhfVklERU9fUEFSQU1fV01WVFlQRSkpOworICAgIH0KKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBPTVhfSW5kZXhQYXJhbVN0YW5kYXJkQ29tcG9uZW50Um9sZToKKyAgICB7CisgICAgICAgIE9NWF9QQVJBTV9DT01QT05FTlRST0xFVFlQRSAqcENvbXBvbmVudFJvbGUgPSAoT01YX1BBUkFNX0NPTVBPTkVOVFJPTEVUWVBFKilwQ29tcG9uZW50UGFyYW1ldGVyU3RydWN0dXJlOworCisgICAgICAgIHJldCA9IFNFQ19PTVhfQ2hlY2tfU2l6ZVZlcnNpb24ocENvbXBvbmVudFJvbGUsIHNpemVvZihPTVhfUEFSQU1fQ09NUE9ORU5UUk9MRVRZUEUpKTsKKyAgICAgICAgaWYgKHJldCAhPSBPTVhfRXJyb3JOb25lKSB7CisgICAgICAgICAgICBnb3RvIEVYSVQ7CisgICAgICAgIH0KKworICAgICAgICBpZiAoKHBTRUNDb21wb25lbnQtPmN1cnJlbnRTdGF0ZSAhPSBPTVhfU3RhdGVMb2FkZWQpICYmIChwU0VDQ29tcG9uZW50LT5jdXJyZW50U3RhdGUgIT0gT01YX1N0YXRlV2FpdEZvclJlc291cmNlcykpIHsKKyAgICAgICAgICAgIHJldCA9IE9NWF9FcnJvckluY29ycmVjdFN0YXRlT3BlcmF0aW9uOworICAgICAgICAgICAgZ290byBFWElUOworICAgICAgICB9CisKKyAgICAgICAgaWYgKCFTRUNfT1NBTF9TdHJjbXAoKGNoYXIqKXBDb21wb25lbnRSb2xlLT5jUm9sZSwgU0VDX09NWF9DT01QT05FTlRfV01WX0RFQ19ST0xFKSkgeworICAgICAgICAgICAgcFNFQ0NvbXBvbmVudC0+cFNFQ1BvcnRbSU5QVVRfUE9SVF9JTkRFWF0ucG9ydERlZmluaXRpb24uZm9ybWF0LnZpZGVvLmVDb21wcmVzc2lvbkZvcm1hdCA9IE9NWF9WSURFT19Db2RpbmdXTVY7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICByZXQgPSBPTVhfRXJyb3JCYWRQYXJhbWV0ZXI7CisgICAgICAgICAgICBnb3RvIEVYSVQ7CisgICAgICAgIH0KKyAgICB9CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgT01YX0luZGV4UGFyYW1Qb3J0RGVmaW5pdGlvbjoKKyAgICB7CisgICAgICAgIE9NWF9QQVJBTV9QT1JUREVGSU5JVElPTlRZUEUgKnBQb3J0RGVmaW5pdGlvbiA9IChPTVhfUEFSQU1fUE9SVERFRklOSVRJT05UWVBFICopcENvbXBvbmVudFBhcmFtZXRlclN0cnVjdHVyZTsKKyAgICAgICAgT01YX1UzMiAgICAgICAgICAgICAgICAgICAgICAgcG9ydEluZGV4ID0gcFBvcnREZWZpbml0aW9uLT5uUG9ydEluZGV4OworICAgICAgICBTRUNfT01YX0JBU0VQT1JUICAgICAgICAgICAgICpwU0VDUG9ydDsKKyAgICAgICAgT01YX1UzMiB3aWR0aCwgaGVpZ2h0LCBzaXplOworICAgICAgICBPTVhfVTMyIHJlYWxXaWR0aCwgcmVhbEhlaWdodDsKKworICAgICAgICBpZiAocG9ydEluZGV4ID49IHBTRUNDb21wb25lbnQtPnBvcnRQYXJhbS5uUG9ydHMpIHsKKyAgICAgICAgICAgIHJldCA9IE9NWF9FcnJvckJhZFBvcnRJbmRleDsKKyAgICAgICAgICAgIGdvdG8gRVhJVDsKKyAgICAgICAgfQorICAgICAgICByZXQgPSBTRUNfT01YX0NoZWNrX1NpemVWZXJzaW9uKHBQb3J0RGVmaW5pdGlvbiwgc2l6ZW9mKE9NWF9QQVJBTV9QT1JUREVGSU5JVElPTlRZUEUpKTsKKyAgICAgICAgaWYgKHJldCAhPSBPTVhfRXJyb3JOb25lKSB7CisgICAgICAgICAgICBnb3RvIEVYSVQ7CisgICAgICAgIH0KKworICAgICAgICBwU0VDUG9ydCA9ICZwU0VDQ29tcG9uZW50LT5wU0VDUG9ydFtwb3J0SW5kZXhdOworCisgICAgICAgIGlmICgocFNFQ0NvbXBvbmVudC0+Y3VycmVudFN0YXRlICE9IE9NWF9TdGF0ZUxvYWRlZCkgJiYgKHBTRUNDb21wb25lbnQtPmN1cnJlbnRTdGF0ZSAhPSBPTVhfU3RhdGVXYWl0Rm9yUmVzb3VyY2VzKSkgeworICAgICAgICAgICAgaWYgKHBTRUNQb3J0LT5wb3J0RGVmaW5pdGlvbi5iRW5hYmxlZCA9PSBPTVhfVFJVRSkgeworICAgICAgICAgICAgICAgIHJldCA9IE9NWF9FcnJvckluY29ycmVjdFN0YXRlT3BlcmF0aW9uOworICAgICAgICAgICAgICAgIGdvdG8gRVhJVDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBpZiAocFBvcnREZWZpbml0aW9uLT5uQnVmZmVyQ291bnRBY3R1YWwgPCBwU0VDUG9ydC0+cG9ydERlZmluaXRpb24ubkJ1ZmZlckNvdW50TWluKSB7CisgICAgICAgICAgICByZXQgPSBPTVhfRXJyb3JCYWRQYXJhbWV0ZXI7CisgICAgICAgICAgICBnb3RvIEVYSVQ7CisgICAgICAgIH0KKworICAgICAgICBTRUNfT1NBTF9NZW1jcHkoJnBTRUNQb3J0LT5wb3J0RGVmaW5pdGlvbiwgcFBvcnREZWZpbml0aW9uLCBwUG9ydERlZmluaXRpb24tPm5TaXplKTsKKworICAgICAgICByZWFsV2lkdGggPSBwU0VDUG9ydC0+cG9ydERlZmluaXRpb24uZm9ybWF0LnZpZGVvLm5GcmFtZVdpZHRoOworICAgICAgICByZWFsSGVpZ2h0ID0gcFNFQ1BvcnQtPnBvcnREZWZpbml0aW9uLmZvcm1hdC52aWRlby5uRnJhbWVIZWlnaHQ7CisgICAgICAgIHdpZHRoID0gKChyZWFsV2lkdGggKyAxNSkgJiAofjE1KSk7CisgICAgICAgIGhlaWdodCA9ICgocmVhbEhlaWdodCArIDE1KSAmICh+MTUpKTsKKyAgICAgICAgc2l6ZSA9ICh3aWR0aCAqIGhlaWdodCAqIDMpIC8gMjsKKyAgICAgICAgcFNFQ1BvcnQtPnBvcnREZWZpbml0aW9uLmZvcm1hdC52aWRlby5uU3RyaWRlID0gd2lkdGg7CisgICAgICAgIHBTRUNQb3J0LT5wb3J0RGVmaW5pdGlvbi5mb3JtYXQudmlkZW8ublNsaWNlSGVpZ2h0ID0gaGVpZ2h0OworICAgICAgICBwU0VDUG9ydC0+cG9ydERlZmluaXRpb24ubkJ1ZmZlclNpemUgPSAoc2l6ZSA+IHBTRUNQb3J0LT5wb3J0RGVmaW5pdGlvbi5uQnVmZmVyU2l6ZSkgPyBzaXplIDogcFNFQ1BvcnQtPnBvcnREZWZpbml0aW9uLm5CdWZmZXJTaXplOworCisgICAgICAgIGlmIChwb3J0SW5kZXggPT0gSU5QVVRfUE9SVF9JTkRFWCkgeworICAgICAgICAgICAgU0VDX09NWF9CQVNFUE9SVCAqcFNFQ091dHB1dFBvcnQgPSAmcFNFQ0NvbXBvbmVudC0+cFNFQ1BvcnRbT1VUUFVUX1BPUlRfSU5ERVhdOworICAgICAgICAgICAgcFNFQ091dHB1dFBvcnQtPnBvcnREZWZpbml0aW9uLmZvcm1hdC52aWRlby5uRnJhbWVXaWR0aCA9IHBTRUNQb3J0LT5wb3J0RGVmaW5pdGlvbi5mb3JtYXQudmlkZW8ubkZyYW1lV2lkdGg7CisgICAgICAgICAgICBwU0VDT3V0cHV0UG9ydC0+cG9ydERlZmluaXRpb24uZm9ybWF0LnZpZGVvLm5GcmFtZUhlaWdodCA9IHBTRUNQb3J0LT5wb3J0RGVmaW5pdGlvbi5mb3JtYXQudmlkZW8ubkZyYW1lSGVpZ2h0OworICAgICAgICAgICAgcFNFQ091dHB1dFBvcnQtPnBvcnREZWZpbml0aW9uLmZvcm1hdC52aWRlby5uU3RyaWRlID0gd2lkdGg7CisgICAgICAgICAgICBwU0VDT3V0cHV0UG9ydC0+cG9ydERlZmluaXRpb24uZm9ybWF0LnZpZGVvLm5TbGljZUhlaWdodCA9IGhlaWdodDsKKworICAgICAgICAgICAgc3dpdGNoIChwU0VDT3V0cHV0UG9ydC0+cG9ydERlZmluaXRpb24uZm9ybWF0LnZpZGVvLmVDb2xvckZvcm1hdCkgeworICAgICAgICAgICAgY2FzZSBPTVhfQ09MT1JfRm9ybWF0WVVWNDIwUGxhbmFyOgorICAgICAgICAgICAgY2FzZSBPTVhfQ09MT1JfRm9ybWF0WVVWNDIwU2VtaVBsYW5hcjoKKyAgICAgICAgICAgIGNhc2UgT01YX1NFQ19DT0xPUl9Gb3JtYXROVjEyVFBoeXNpY2FsQWRkcmVzczoKKyAgICAgICAgICAgIGNhc2UgT01YX1NFQ19DT0xPUl9Gb3JtYXRBTkJZVVY0MjBTZW1pUGxhbmFyOgorICAgICAgICAgICAgICAgIHBTRUNPdXRwdXRQb3J0LT5wb3J0RGVmaW5pdGlvbi5uQnVmZmVyU2l6ZSA9ICh3aWR0aCAqIGhlaWdodCAqIDMpIC8gMjsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgT01YX1NFQ19DT0xPUl9Gb3JtYXROVjEyVGlsZWQ6CisgICAgICAgICAgICAgICAgcFNFQ091dHB1dFBvcnQtPnBvcnREZWZpbml0aW9uLm5CdWZmZXJTaXplID0KKyAgICAgICAgICAgICAgICAgICAgQUxJR05fVE9fOEtCKEFMSUdOX1RPXzEyOEIocmVhbFdpZHRoKSAqIEFMSUdOX1RPXzMyQihyZWFsSGVpZ2h0KSkgXAorICAgICAgICAgICAgICAgICAgKyBBTElHTl9UT184S0IoQUxJR05fVE9fMTI4QihyZWFsV2lkdGgpICogQUxJR05fVE9fMzJCKHJlYWxIZWlnaHQvMikpOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICBTRUNfT1NBTF9Mb2coU0VDX0xPR19FUlJPUiwgIkNvbG9yIGZvcm1hdCBpcyBub3Qgc3VwcG9ydCEhIHVzZSBkZWZhdWx0IFlVViBzaXplISEiKTsKKyAgICAgICAgICAgICAgICByZXQgPSBPTVhfRXJyb3JVbnN1cHBvcnRlZFNldHRpbmc7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgT01YX0luZGV4UGFyYW1WaWRlb0Vycm9yQ29ycmVjdGlvbjoKKyAgICB7CisgICAgICAgIE9NWF9WSURFT19QQVJBTV9FUlJPUkNPUlJFQ1RJT05UWVBFICpwU3JjRXJyb3JDb3JyZWN0aW9uVHlwZSA9IChPTVhfVklERU9fUEFSQU1fRVJST1JDT1JSRUNUSU9OVFlQRSAqKXBDb21wb25lbnRQYXJhbWV0ZXJTdHJ1Y3R1cmU7CisgICAgICAgIE9NWF9WSURFT19QQVJBTV9FUlJPUkNPUlJFQ1RJT05UWVBFICpwRHN0RXJyb3JDb3JyZWN0aW9uVHlwZSA9IE5VTEw7CisgICAgICAgIFNFQ19XTVZfSEFORExFICAgICAgICAgICAgICAgICAgICAgICpwV212RGVjID0gTlVMTDsKKworICAgICAgICByZXQgPSBTRUNfT01YX0NoZWNrX1NpemVWZXJzaW9uKHBTcmNFcnJvckNvcnJlY3Rpb25UeXBlLCBzaXplb2YoT01YX1ZJREVPX1BBUkFNX0VSUk9SQ09SUkVDVElPTlRZUEUpKTsKKyAgICAgICAgaWYgKHJldCAhPSBPTVhfRXJyb3JOb25lKSB7CisgICAgICAgICAgICBnb3RvIEVYSVQ7CisgICAgICAgIH0KKworICAgICAgICBpZiAocFNyY0Vycm9yQ29ycmVjdGlvblR5cGUtPm5Qb3J0SW5kZXggIT0gSU5QVVRfUE9SVF9JTkRFWCkgeworICAgICAgICAgICAgcmV0ID0gT01YX0Vycm9yQmFkUG9ydEluZGV4OworICAgICAgICAgICAgZ290byBFWElUOworICAgICAgICB9CisKKyAgICAgICAgcFdtdkRlYyA9IChTRUNfV01WX0hBTkRMRSAqKSgoU0VDX09NWF9WSURFT0RFQ19DT01QT05FTlQgKilwU0VDQ29tcG9uZW50LT5oQ29tcG9uZW50SGFuZGxlKS0+aENvZGVjSGFuZGxlOworICAgICAgICBwRHN0RXJyb3JDb3JyZWN0aW9uVHlwZSA9ICZwV212RGVjLT5lcnJvckNvcnJlY3Rpb25UeXBlW0lOUFVUX1BPUlRfSU5ERVhdOworCisgICAgICAgIHBEc3RFcnJvckNvcnJlY3Rpb25UeXBlLT5iRW5hYmxlSEVDID0gcFNyY0Vycm9yQ29ycmVjdGlvblR5cGUtPmJFbmFibGVIRUM7CisgICAgICAgIHBEc3RFcnJvckNvcnJlY3Rpb25UeXBlLT5iRW5hYmxlUmVzeW5jID0gcFNyY0Vycm9yQ29ycmVjdGlvblR5cGUtPmJFbmFibGVSZXN5bmM7CisgICAgICAgIHBEc3RFcnJvckNvcnJlY3Rpb25UeXBlLT5uUmVzeW5jaE1hcmtlclNwYWNpbmcgPSBwU3JjRXJyb3JDb3JyZWN0aW9uVHlwZS0+blJlc3luY2hNYXJrZXJTcGFjaW5nOworICAgICAgICBwRHN0RXJyb3JDb3JyZWN0aW9uVHlwZS0+YkVuYWJsZURhdGFQYXJ0aXRpb25pbmcgPSBwU3JjRXJyb3JDb3JyZWN0aW9uVHlwZS0+YkVuYWJsZURhdGFQYXJ0aXRpb25pbmc7CisgICAgICAgIHBEc3RFcnJvckNvcnJlY3Rpb25UeXBlLT5iRW5hYmxlUlZMQyA9IHBTcmNFcnJvckNvcnJlY3Rpb25UeXBlLT5iRW5hYmxlUlZMQzsKKyAgICB9CisgICAgICAgIGJyZWFrOworICAgIGRlZmF1bHQ6CisgICAgICAgIHJldCA9IFNFQ19PTVhfVmlkZW9EZWNvZGVTZXRQYXJhbWV0ZXIoaENvbXBvbmVudCwgbkluZGV4LCBwQ29tcG9uZW50UGFyYW1ldGVyU3RydWN0dXJlKTsKKyAgICAgICAgYnJlYWs7CisgICAgfQorRVhJVDoKKyAgICBGdW5jdGlvbk91dCgpOworCisgICAgcmV0dXJuIHJldDsKK30KKworT01YX0VSUk9SVFlQRSBTRUNfTUZDX1dtdkRlY19HZXRDb25maWcoCisgICAgT01YX0hBTkRMRVRZUEUgaENvbXBvbmVudCwKKyAgICBPTVhfSU5ERVhUWVBFIG5JbmRleCwKKyAgICBPTVhfUFRSIHBDb21wb25lbnRDb25maWdTdHJ1Y3R1cmUpCit7CisgICAgT01YX0VSUk9SVFlQRSAgICAgICAgICAgcmV0ID0gT01YX0Vycm9yTm9uZTsKKyAgICBPTVhfQ09NUE9ORU5UVFlQRSAgICAgKnBPTVhDb21wb25lbnQgPSBOVUxMOworICAgIFNFQ19PTVhfQkFTRUNPTVBPTkVOVCAqcFNFQ0NvbXBvbmVudCA9IE5VTEw7CisKKyAgICBGdW5jdGlvbkluKCk7CisKKyAgICBpZiAoaENvbXBvbmVudCA9PSBOVUxMKSB7CisgICAgICAgIHJldCA9IE9NWF9FcnJvckJhZFBhcmFtZXRlcjsKKyAgICAgICAgZ290byBFWElUOworICAgIH0KKyAgICBwT01YQ29tcG9uZW50ID0gKE9NWF9DT01QT05FTlRUWVBFICopaENvbXBvbmVudDsKKyAgICByZXQgPSBTRUNfT01YX0NoZWNrX1NpemVWZXJzaW9uKHBPTVhDb21wb25lbnQsIHNpemVvZihPTVhfQ09NUE9ORU5UVFlQRSkpOworICAgIGlmIChyZXQgIT0gT01YX0Vycm9yTm9uZSkgeworICAgICAgICBnb3RvIEVYSVQ7CisgICAgfQorCisgICAgaWYgKHBPTVhDb21wb25lbnQtPnBDb21wb25lbnRQcml2YXRlID09IE5VTEwpIHsKKyAgICAgICAgcmV0ID0gT01YX0Vycm9yQmFkUGFyYW1ldGVyOworICAgICAgICBnb3RvIEVYSVQ7CisgICAgfQorICAgIHBTRUNDb21wb25lbnQgPSAoU0VDX09NWF9CQVNFQ09NUE9ORU5UICopcE9NWENvbXBvbmVudC0+cENvbXBvbmVudFByaXZhdGU7CisKKyAgICBpZiAocENvbXBvbmVudENvbmZpZ1N0cnVjdHVyZSA9PSBOVUxMKSB7CisgICAgICAgIHJldCA9IE9NWF9FcnJvckJhZFBhcmFtZXRlcjsKKyAgICAgICAgZ290byBFWElUOworICAgIH0KKyAgICBpZiAocFNFQ0NvbXBvbmVudC0+Y3VycmVudFN0YXRlID09IE9NWF9TdGF0ZUludmFsaWQpIHsKKyAgICAgICAgcmV0ID0gT01YX0Vycm9ySW52YWxpZFN0YXRlOworICAgICAgICBnb3RvIEVYSVQ7CisgICAgfQorCisgICAgc3dpdGNoIChuSW5kZXgpIHsKKyAgICBkZWZhdWx0OgorICAgICAgICByZXQgPSBTRUNfT01YX1ZpZGVvRGVjb2RlR2V0Q29uZmlnKGhDb21wb25lbnQsIG5JbmRleCwgcENvbXBvbmVudENvbmZpZ1N0cnVjdHVyZSk7CisgICAgICAgIGJyZWFrOworICAgIH0KKworRVhJVDoKKyAgICBGdW5jdGlvbk91dCgpOworCisgICAgcmV0dXJuIHJldDsKK30KKworT01YX0VSUk9SVFlQRSBTRUNfTUZDX1dtdkRlY19TZXRDb25maWcoCisgICAgT01YX0lOIE9NWF9IQU5ETEVUWVBFIGhDb21wb25lbnQsCisgICAgT01YX0lOIE9NWF9JTkRFWFRZUEUgIG5JbmRleCwKKyAgICBPTVhfSU4gT01YX1BUUiAgICAgICAgcENvbXBvbmVudENvbmZpZ1N0cnVjdHVyZSkKK3sKKyAgICBPTVhfRVJST1JUWVBFICAgICAgICAgIHJldCA9IE9NWF9FcnJvck5vbmU7CisgICAgT01YX0NPTVBPTkVOVFRZUEUgICAgICpwT01YQ29tcG9uZW50ID0gTlVMTDsKKyAgICBTRUNfT01YX0JBU0VDT01QT05FTlQgKnBTRUNDb21wb25lbnQgPSBOVUxMOworCisgICAgRnVuY3Rpb25JbigpOworCisgICAgaWYgKGhDb21wb25lbnQgPT0gTlVMTCB8fCBwQ29tcG9uZW50Q29uZmlnU3RydWN0dXJlID09IE5VTEwpIHsKKyAgICAgICAgcmV0ID0gT01YX0Vycm9yQmFkUGFyYW1ldGVyOworICAgICAgICBnb3RvIEVYSVQ7CisgICAgfQorICAgIHBPTVhDb21wb25lbnQgPSAoT01YX0NPTVBPTkVOVFRZUEUgKiloQ29tcG9uZW50OworICAgIHJldCA9IFNFQ19PTVhfQ2hlY2tfU2l6ZVZlcnNpb24ocE9NWENvbXBvbmVudCwgc2l6ZW9mKE9NWF9DT01QT05FTlRUWVBFKSk7CisgICAgaWYgKHJldCAhPSBPTVhfRXJyb3JOb25lKSB7CisgICAgICAgIGdvdG8gRVhJVDsKKyAgICB9CisgICAgaWYgKHBPTVhDb21wb25lbnQtPnBDb21wb25lbnRQcml2YXRlID09IE5VTEwpIHsKKyAgICAgICAgcmV0ID0gT01YX0Vycm9yQmFkUGFyYW1ldGVyOworICAgICAgICBnb3RvIEVYSVQ7CisgICAgfQorCisgICAgcFNFQ0NvbXBvbmVudCA9IChTRUNfT01YX0JBU0VDT01QT05FTlQgKilwT01YQ29tcG9uZW50LT5wQ29tcG9uZW50UHJpdmF0ZTsKKyAgICBpZiAocFNFQ0NvbXBvbmVudC0+Y3VycmVudFN0YXRlID09IE9NWF9TdGF0ZUludmFsaWQpIHsKKyAgICAgICAgcmV0ID0gT01YX0Vycm9ySW52YWxpZFN0YXRlOworICAgICAgICBnb3RvIEVYSVQ7CisgICAgfQorCisgICAgc3dpdGNoIChuSW5kZXgpIHsKKyAgICBkZWZhdWx0OgorICAgICAgICByZXQgPSBTRUNfT01YX1ZpZGVvRGVjb2RlU2V0Q29uZmlnKGhDb21wb25lbnQsIG5JbmRleCwgcENvbXBvbmVudENvbmZpZ1N0cnVjdHVyZSk7CisgICAgICAgIGJyZWFrOworICAgIH0KKworRVhJVDoKKyAgICBGdW5jdGlvbk91dCgpOworCisgICAgcmV0dXJuIHJldDsKK30KKworT01YX0VSUk9SVFlQRSBTRUNfTUZDX1dtdkRlY19HZXRFeHRlbnNpb25JbmRleCgKKyAgICBPTVhfSU4gT01YX0hBTkRMRVRZUEUgIGhDb21wb25lbnQsCisgICAgT01YX0lOIE9NWF9TVFJJTkcgICAgICBjUGFyYW1ldGVyTmFtZSwKKyAgICBPTVhfT1VUIE9NWF9JTkRFWFRZUEUgKnBJbmRleFR5cGUpCit7CisgICAgT01YX0VSUk9SVFlQRSAgICAgICAgICAgcmV0ID0gT01YX0Vycm9yTm9uZTsKKyAgICBPTVhfQ09NUE9ORU5UVFlQRSAgICAgKnBPTVhDb21wb25lbnQgPSBOVUxMOworICAgIFNFQ19PTVhfQkFTRUNPTVBPTkVOVCAqcFNFQ0NvbXBvbmVudCA9IE5VTEw7CisKKyAgICBGdW5jdGlvbkluKCk7CisKKyAgICBpZiAoaENvbXBvbmVudCA9PSBOVUxMKSB7CisgICAgICAgIHJldCA9IE9NWF9FcnJvckJhZFBhcmFtZXRlcjsKKyAgICAgICAgZ290byBFWElUOworICAgIH0KKyAgICBwT01YQ29tcG9uZW50ID0gKE9NWF9DT01QT05FTlRUWVBFICopaENvbXBvbmVudDsKKyAgICByZXQgPSBTRUNfT01YX0NoZWNrX1NpemVWZXJzaW9uKHBPTVhDb21wb25lbnQsIHNpemVvZihPTVhfQ09NUE9ORU5UVFlQRSkpOworICAgIGlmIChyZXQgIT0gT01YX0Vycm9yTm9uZSkgeworICAgICAgICBnb3RvIEVYSVQ7CisgICAgfQorCisgICAgaWYgKHBPTVhDb21wb25lbnQtPnBDb21wb25lbnRQcml2YXRlID09IE5VTEwpIHsKKyAgICAgICAgcmV0ID0gT01YX0Vycm9yQmFkUGFyYW1ldGVyOworICAgICAgICBnb3RvIEVYSVQ7CisgICAgfQorICAgIHBTRUNDb21wb25lbnQgPSAoU0VDX09NWF9CQVNFQ09NUE9ORU5UICopcE9NWENvbXBvbmVudC0+cENvbXBvbmVudFByaXZhdGU7CisKKyAgICBpZiAoKGNQYXJhbWV0ZXJOYW1lID09IE5VTEwpIHx8IChwSW5kZXhUeXBlID09IE5VTEwpKSB7CisgICAgICAgIHJldCA9IE9NWF9FcnJvckJhZFBhcmFtZXRlcjsKKyAgICAgICAgZ290byBFWElUOworICAgIH0KKyAgICBpZiAocFNFQ0NvbXBvbmVudC0+Y3VycmVudFN0YXRlID09IE9NWF9TdGF0ZUludmFsaWQpIHsKKyAgICAgICAgcmV0ID0gT01YX0Vycm9ySW52YWxpZFN0YXRlOworICAgICAgICBnb3RvIEVYSVQ7CisgICAgfQorCisgICAgaWYgKFNFQ19PU0FMX1N0cmNtcChjUGFyYW1ldGVyTmFtZSwgU0VDX0lOREVYX1BBUkFNX0VOQUJMRV9USFVNQk5BSUwpID09IDApIHsKKyAgICAgICAgU0VDX1dNVl9IQU5ETEUgKnBXbXZEZWMgPSAoU0VDX1dNVl9IQU5ETEUgKikoKFNFQ19PTVhfVklERU9ERUNfQ09NUE9ORU5UICopcFNFQ0NvbXBvbmVudC0+aENvbXBvbmVudEhhbmRsZSktPmhDb2RlY0hhbmRsZTsKKworICAgICAgICAqcEluZGV4VHlwZSA9IE9NWF9JbmRleFZlbmRvclRodW1ibmFpbE1vZGU7CisKKyAgICAgICAgcmV0ID0gT01YX0Vycm9yTm9uZTsKKyAgICB9IGVsc2UgeworICAgICAgICByZXQgPSBTRUNfT01YX1ZpZGVvRGVjb2RlR2V0RXh0ZW5zaW9uSW5kZXgoaENvbXBvbmVudCwgY1BhcmFtZXRlck5hbWUsIHBJbmRleFR5cGUpOworICAgIH0KKworRVhJVDoKKyAgICBGdW5jdGlvbk91dCgpOworCisgICAgcmV0dXJuIHJldDsKK30KKworT01YX0VSUk9SVFlQRSBTRUNfTUZDX1dtdkRlY19Db21wb25lbnRSb2xlRW51bSgKKyAgICBPTVhfSU4gIE9NWF9IQU5ETEVUWVBFIGhDb21wb25lbnQsCisgICAgT01YX09VVCBPTVhfVTggICAgICAgICpjUm9sZSwKKyAgICBPTVhfSU4gIE9NWF9VMzIgICAgICAgIG5JbmRleCkKK3sKKyAgICBPTVhfRVJST1JUWVBFICAgICAgICAgcmV0ID0gT01YX0Vycm9yTm9uZTsKKyAgICBPTVhfQ09NUE9ORU5UVFlQRSAgICAgKnBPTVhDb21wb25lbnQgPSBOVUxMOworICAgIFNFQ19PTVhfQkFTRUNPTVBPTkVOVCAqcFNFQ0NvbXBvbmVudCA9IE5VTEw7CisKKyAgICBGdW5jdGlvbkluKCk7CisKKyAgICBpZiAoKGhDb21wb25lbnQgPT0gTlVMTCkgfHwgKGNSb2xlID09IE5VTEwpKSB7CisgICAgICAgIHJldCA9IE9NWF9FcnJvckJhZFBhcmFtZXRlcjsKKyAgICAgICAgZ290byBFWElUOworICAgIH0KKyAgICBpZiAobkluZGV4ID09IChNQVhfQ09NUE9ORU5UX1JPTEVfTlVNLTEpKSB7CisgICAgICAgIFNFQ19PU0FMX1N0cmNweSgoY2hhciAqKWNSb2xlLCBTRUNfT01YX0NPTVBPTkVOVF9XTVZfREVDX1JPTEUpOworICAgICAgICByZXQgPSBPTVhfRXJyb3JOb25lOworICAgIH0gZWxzZSB7CisgICAgICAgIHJldCA9IE9NWF9FcnJvclVuc3VwcG9ydGVkSW5kZXg7CisgICAgfQorCitFWElUOgorICAgIEZ1bmN0aW9uT3V0KCk7CisKKyAgICByZXR1cm4gcmV0OworfQorCitPTVhfRVJST1JUWVBFIFNFQ19NRkNfRGVjb2RlVGhyZWFkKE9NWF9IQU5ETEVUWVBFIGhDb21wb25lbnQpCit7CisgICAgT01YX0VSUk9SVFlQRSAgICAgICAgICByZXQgPSBPTVhfRXJyb3JOb25lOworICAgIE9NWF9DT01QT05FTlRUWVBFICAgICAqcE9NWENvbXBvbmVudCA9IChPTVhfQ09NUE9ORU5UVFlQRSAqKWhDb21wb25lbnQ7CisgICAgU0VDX09NWF9CQVNFQ09NUE9ORU5UICpwU0VDQ29tcG9uZW50ID0gKFNFQ19PTVhfQkFTRUNPTVBPTkVOVCAqKXBPTVhDb21wb25lbnQtPnBDb21wb25lbnRQcml2YXRlOworICAgIFNFQ19PTVhfVklERU9ERUNfQ09NUE9ORU5UICpwVmlkZW9EZWMgPSAoU0VDX09NWF9WSURFT0RFQ19DT01QT05FTlQgKilwU0VDQ29tcG9uZW50LT5oQ29tcG9uZW50SGFuZGxlOworICAgIFNFQ19XTVZfSEFORExFICAgICAgICAqcFdtdkRlYyA9IChTRUNfV01WX0hBTkRMRSAqKSgoU0VDX09NWF9WSURFT0RFQ19DT01QT05FTlQgKilwU0VDQ29tcG9uZW50LT5oQ29tcG9uZW50SGFuZGxlKS0+aENvZGVjSGFuZGxlOworCisgICAgRnVuY3Rpb25JbigpOworCisgICAgaWYgKGhDb21wb25lbnQgPT0gTlVMTCkgeworICAgICAgICByZXQgPSBPTVhfRXJyb3JCYWRQYXJhbWV0ZXI7CisgICAgICAgIGdvdG8gRVhJVDsKKyAgICB9CisKKyAgICB3aGlsZSAocFZpZGVvRGVjLT5OQkRlY1RocmVhZC5iRXhpdERlY29kZVRocmVhZCA9PSBPTVhfRkFMU0UpIHsKKyAgICAgICAgU0VDX09TQUxfU2VtYXBob3JlV2FpdChwVmlkZW9EZWMtPk5CRGVjVGhyZWFkLmhEZWNGcmFtZVN0YXJ0KTsKKworICAgICAgICBpZiAocFZpZGVvRGVjLT5OQkRlY1RocmVhZC5iRXhpdERlY29kZVRocmVhZCA9PSBPTVhfRkFMU0UpIHsKKyNpZmRlZiBDT05GSUdfTUZDX0ZQUworICAgICAgICAgICAgU0VDX09TQUxfUGVyZlN0YXJ0KFBFUkZfSURfREVDKTsKKyNlbmRpZgorICAgICAgICAgICAgcFdtdkRlYy0+aE1GQ1dtdkhhbmRsZS5yZXR1cm5Db2RlYyA9IFNzYlNpcE1mY0RlY0V4ZShwV212RGVjLT5oTUZDV212SGFuZGxlLmhNRkNIYW5kbGUsIHBWaWRlb0RlYy0+TkJEZWNUaHJlYWQub25lRnJhbWVTaXplKTsKKyNpZmRlZiBDT05GSUdfTUZDX0ZQUworICAgICAgICAgICAgU0VDX09TQUxfUGVyZlN0b3AoUEVSRl9JRF9ERUMpOworI2VuZGlmCisgICAgICAgICAgICBTRUNfT1NBTF9TZW1hcGhvcmVQb3N0KHBWaWRlb0RlYy0+TkJEZWNUaHJlYWQuaERlY0ZyYW1lRW5kKTsKKyAgICAgICAgfQorICAgIH0KKworRVhJVDoKKyAgICBTRUNfT1NBTF9UaHJlYWRFeGl0KE5VTEwpOworICAgIEZ1bmN0aW9uT3V0KCk7CisKKyAgICByZXR1cm4gcmV0OworfQorCisvKiBNRkMgSW5pdCAqLworT01YX0VSUk9SVFlQRSBTRUNfTUZDX1dtdkRlY19Jbml0KE9NWF9DT01QT05FTlRUWVBFICpwT01YQ29tcG9uZW50KQoreworICAgIE9NWF9FUlJPUlRZUEUgICAgICAgICAgcmV0ID0gT01YX0Vycm9yTm9uZTsKKyAgICBTRUNfT01YX0JBU0VDT01QT05FTlQgKnBTRUNDb21wb25lbnQgPSAoU0VDX09NWF9CQVNFQ09NUE9ORU5UICopcE9NWENvbXBvbmVudC0+cENvbXBvbmVudFByaXZhdGU7CisgICAgU0VDX09NWF9WSURFT0RFQ19DT01QT05FTlQgKnBWaWRlb0RlYyA9IChTRUNfT01YX1ZJREVPREVDX0NPTVBPTkVOVCAqKXBTRUNDb21wb25lbnQtPmhDb21wb25lbnRIYW5kbGU7CisgICAgU0VDX09NWF9CQVNFUE9SVCAgICAgICpwU0VDT3V0cHV0UG9ydCA9ICZwU0VDQ29tcG9uZW50LT5wU0VDUG9ydFtPVVRQVVRfUE9SVF9JTkRFWF07CisgICAgU0VDX1dNVl9IQU5ETEUgICAgICAgICpwV212RGVjID0gTlVMTDsKKyAgICBPTVhfSEFORExFVFlQRSAgICAgICAgIGhNRkNIYW5kbGUgPSBOVUxMOworICAgIE9NWF9QVFIgICAgICAgICAgICAgICAgcFN0cmVhbUJ1ZmZlciA9IE5VTEw7CisgICAgT01YX1BUUiAgICAgICAgICAgICAgICBwU3RyZWFtUGh5QnVmZmVyID0gTlVMTDsKKyAgICBDU0NfTUVUSE9EIGNzY19tZXRob2QgPSBDU0NfTUVUSE9EX1NXOworCisgICAgRnVuY3Rpb25JbigpOworCisjaWZkZWYgQ09ORklHX01GQ19GUFMKKyAgICBTRUNfT1NBTF9QZXJmSW5pdChQRVJGX0lEX0RFQyk7CisgICAgU0VDX09TQUxfUGVyZkluaXQoUEVSRl9JRF9DU0MpOworI2VuZGlmCisKKyAgICBwV212RGVjID0gKFNFQ19XTVZfSEFORExFICopKChTRUNfT01YX1ZJREVPREVDX0NPTVBPTkVOVCAqKXBTRUNDb21wb25lbnQtPmhDb21wb25lbnRIYW5kbGUpLT5oQ29kZWNIYW5kbGU7CisgICAgcFdtdkRlYy0+aE1GQ1dtdkhhbmRsZS5iQ29uZmlndXJlZE1GQyA9IE9NWF9GQUxTRTsKKyAgICBwU0VDQ29tcG9uZW50LT5iVXNlRmxhZ0VPRiA9IE9NWF9GQUxTRTsKKyAgICBwU0VDQ29tcG9uZW50LT5iU2F2ZUZsYWdFT1MgPSBPTVhfRkFMU0U7CisKKyAgICAvKiBNRkMoTXVsdGkgRm9ybWF0IENvZGVjKSBkZWNvZGVyIGFuZCBDTU0oQ29kZWMgTWVtb3J5IE1hbmFnZW1lbnQpIGRyaXZlciBvcGVuICovCisgICAgaWYgKHBTRUNPdXRwdXRQb3J0LT5wb3J0RGVmaW5pdGlvbi5mb3JtYXQudmlkZW8uZUNvbG9yRm9ybWF0ID09IE9NWF9TRUNfQ09MT1JfRm9ybWF0TlYxMlRQaHlzaWNhbEFkZHJlc3MpIHsKKyAgICAgICAgaE1GQ0hhbmRsZSA9IChPTVhfUFRSKVNzYlNpcE1mY0RlY09wZW4oKTsKKyAgICB9IGVsc2UgeworICAgICAgICBTU0JJUF9NRkNfQlVGRkVSX1RZUEUgYnVmX3R5cGUgPSBDQUNIRTsKKyAgICAgICAgaE1GQ0hhbmRsZSA9IChPTVhfUFRSKVNzYlNpcE1mY0RlY09wZW5FeHQoJmJ1Zl90eXBlKTsKKyAgICB9CisKKyAgICBpZiAoaE1GQ0hhbmRsZSA9PSBOVUxMKSB7CisgICAgICAgIHJldCA9IE9NWF9FcnJvckluc3VmZmljaWVudFJlc291cmNlczsKKyAgICAgICAgZ290byBFWElUOworICAgIH0KKyAgICBnaE1GQ0hhbmRsZSA9IHBXbXZEZWMtPmhNRkNXbXZIYW5kbGUuaE1GQ0hhbmRsZSA9IGhNRkNIYW5kbGU7CisKKyAgICAvKiBBbGxvY2F0ZSBkZWNvZGVyJ3MgaW5wdXQgYnVmZmVyICovCisgICAgLyogR2V0IGZpcnN0IGlucHV0IGJ1ZmZlciAqLworICAgIHBTdHJlYW1CdWZmZXIgPSBTc2JTaXBNZmNEZWNHZXRJbkJ1ZihoTUZDSGFuZGxlLCAmcFN0cmVhbVBoeUJ1ZmZlciwgREVGQVVMVF9NRkNfSU5QVVRfQlVGRkVSX1NJWkUgLyAyKTsKKyAgICBpZiAocFN0cmVhbUJ1ZmZlciA9PSBOVUxMKSB7CisgICAgICAgIHJldCA9IE9NWF9FcnJvckluc3VmZmljaWVudFJlc291cmNlczsKKyAgICAgICAgZ290byBFWElUOworICAgIH0KKyAgICBwVmlkZW9EZWMtPk1GQ0RlY0lucHV0QnVmZmVyWzBdLlZpckFkZHIgPSBwU3RyZWFtQnVmZmVyOworICAgIHBWaWRlb0RlYy0+TUZDRGVjSW5wdXRCdWZmZXJbMF0uUGh5QWRkciA9IHBTdHJlYW1QaHlCdWZmZXI7CisgICAgcFZpZGVvRGVjLT5NRkNEZWNJbnB1dEJ1ZmZlclswXS5idWZmZXJTaXplID0gREVGQVVMVF9NRkNfSU5QVVRfQlVGRkVSX1NJWkUgLyAyOworICAgIHBWaWRlb0RlYy0+TUZDRGVjSW5wdXRCdWZmZXJbMF0uZGF0YVNpemUgPSAwOworCisjaWZkZWYgTk9OQkxPQ0tfTU9ERV9QUk9DRVNTCisgICAgLyogR2V0IHNlY29uZCBpbnB1dCBidWZmZXIgKi8KKyAgICBwU3RyZWFtQnVmZmVyID0gTlVMTDsKKyAgICBwU3RyZWFtQnVmZmVyID0gU3NiU2lwTWZjRGVjR2V0SW5CdWYoaE1GQ0hhbmRsZSwgJnBTdHJlYW1QaHlCdWZmZXIsIERFRkFVTFRfTUZDX0lOUFVUX0JVRkZFUl9TSVpFIC8gMik7CisgICAgaWYgKHBTdHJlYW1CdWZmZXIgPT0gTlVMTCkgeworICAgICAgICByZXQgPSBPTVhfRXJyb3JJbnN1ZmZpY2llbnRSZXNvdXJjZXM7CisgICAgICAgIGdvdG8gRVhJVDsKKyAgICB9CisgICAgcFZpZGVvRGVjLT5NRkNEZWNJbnB1dEJ1ZmZlclsxXS5WaXJBZGRyID0gcFN0cmVhbUJ1ZmZlcjsKKyAgICBwVmlkZW9EZWMtPk1GQ0RlY0lucHV0QnVmZmVyWzFdLlBoeUFkZHIgPSBwU3RyZWFtUGh5QnVmZmVyOworICAgIHBWaWRlb0RlYy0+TUZDRGVjSW5wdXRCdWZmZXJbMV0uYnVmZmVyU2l6ZSA9IERFRkFVTFRfTUZDX0lOUFVUX0JVRkZFUl9TSVpFIC8gMjsKKyAgICBwVmlkZW9EZWMtPk1GQ0RlY0lucHV0QnVmZmVyWzFdLmRhdGFTaXplID0gMDsKKyAgICBwVmlkZW9EZWMtPmluZGV4SW5wdXRCdWZmZXIgPSAwOworCisgICAgcFZpZGVvRGVjLT5iRmlyc3RGcmFtZSA9IE9NWF9UUlVFOworCisgICAgcFZpZGVvRGVjLT5OQkRlY1RocmVhZC5iRXhpdERlY29kZVRocmVhZCA9IE9NWF9GQUxTRTsKKyAgICBwVmlkZW9EZWMtPk5CRGVjVGhyZWFkLmJEZWNvZGVyUnVuID0gT01YX0ZBTFNFOworICAgIHBWaWRlb0RlYy0+TkJEZWNUaHJlYWQub25lRnJhbWVTaXplID0gMDsKKyAgICBTRUNfT1NBTF9TZW1hcGhvcmVDcmVhdGUoJihwVmlkZW9EZWMtPk5CRGVjVGhyZWFkLmhEZWNGcmFtZVN0YXJ0KSk7CisgICAgU0VDX09TQUxfU2VtYXBob3JlQ3JlYXRlKCYocFZpZGVvRGVjLT5OQkRlY1RocmVhZC5oRGVjRnJhbWVFbmQpKTsKKyAgICBpZiAoT01YX0Vycm9yTm9uZSA9PSBTRUNfT1NBTF9UaHJlYWRDcmVhdGUoJnBWaWRlb0RlYy0+TkJEZWNUaHJlYWQuaE5CRGVjb2RlVGhyZWFkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU0VDX01GQ19EZWNvZGVUaHJlYWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwT01YQ29tcG9uZW50KSkgeworICAgICAgICBwV212RGVjLT5oTUZDV212SGFuZGxlLnJldHVybkNvZGVjID0gTUZDX1JFVF9PSzsKKyAgICB9CisjZW5kaWYKKworICAgIHBXbXZEZWMtPmhNRkNXbXZIYW5kbGUucE1GQ1N0cmVhbUJ1ZmZlciAgICA9IHBWaWRlb0RlYy0+TUZDRGVjSW5wdXRCdWZmZXJbMF0uVmlyQWRkcjsKKyAgICBwV212RGVjLT5oTUZDV212SGFuZGxlLnBNRkNTdHJlYW1QaHlCdWZmZXIgPSBwVmlkZW9EZWMtPk1GQ0RlY0lucHV0QnVmZmVyWzBdLlBoeUFkZHI7CisgICAgcFNFQ0NvbXBvbmVudC0+cHJvY2Vzc0RhdGFbSU5QVVRfUE9SVF9JTkRFWF0uZGF0YUJ1ZmZlciA9IHBWaWRlb0RlYy0+TUZDRGVjSW5wdXRCdWZmZXJbMF0uVmlyQWRkcjsKKyAgICBwU0VDQ29tcG9uZW50LT5wcm9jZXNzRGF0YVtJTlBVVF9QT1JUX0lOREVYXS5hbGxvY1NpemUgPSBwVmlkZW9EZWMtPk1GQ0RlY0lucHV0QnVmZmVyWzBdLmJ1ZmZlclNpemU7CisKKyAgICBTRUNfT1NBTF9NZW1zZXQocFNFQ0NvbXBvbmVudC0+dGltZVN0YW1wLCAtMTk3NzEwMDMsIHNpemVvZihPTVhfVElDS1MpICogTUFYX1RJTUVTVEFNUCk7CisgICAgU0VDX09TQUxfTWVtc2V0KHBTRUNDb21wb25lbnQtPm5GbGFncywgMCwgc2l6ZW9mKE9NWF9VMzIpICogTUFYX0ZMQUdTKTsKKyAgICBwV212RGVjLT5oTUZDV212SGFuZGxlLmluZGV4VGltZXN0YW1wID0gMDsKKyAgICBwV212RGVjLT5oTUZDV212SGFuZGxlLm91dHB1dEluZGV4VGltZXN0YW1wID0gMDsKKyAgICBwU0VDQ29tcG9uZW50LT5nZXRBbGxEZWxheUJ1ZmZlciA9IE9NWF9GQUxTRTsKKworI2lmZGVmIFVTRV9BTkIKKyNpZiBkZWZpbmVkKFVTRV9DU0NfRklNQykgfHwgZGVmaW5lZChVU0VfQ1NDX0dTQ0FMRVIpCisgICAgaWYgKHBTRUNPdXRwdXRQb3J0LT5iSXNBTkJFbmFibGVkID09IE9NWF9UUlVFKSB7CisgICAgICAgIGNzY19tZXRob2QgPSBDU0NfTUVUSE9EX1BSRUZFUl9IVzsKKyAgICB9CisjZW5kaWYKKyNlbmRpZgorICAgIHBWaWRlb0RlYy0+Y3NjX2hhbmRsZSA9IGNzY19pbml0KCZjc2NfbWV0aG9kKTsKKyAgICBwVmlkZW9EZWMtPmNzY19zZXRfZm9ybWF0ID0gT01YX0ZBTFNFOworCitFWElUOgorICAgIEZ1bmN0aW9uT3V0KCk7CisKKyAgICByZXR1cm4gcmV0OworfQorCisvKiBNRkMgVGVybWluYXRlICovCitPTVhfRVJST1JUWVBFIFNFQ19NRkNfV212RGVjX1Rlcm1pbmF0ZShPTVhfQ09NUE9ORU5UVFlQRSAqcE9NWENvbXBvbmVudCkKK3sKKyAgICBPTVhfRVJST1JUWVBFICAgICAgICAgIHJldCA9IE9NWF9FcnJvck5vbmU7CisgICAgU0VDX09NWF9CQVNFQ09NUE9ORU5UICpwU0VDQ29tcG9uZW50ID0gKFNFQ19PTVhfQkFTRUNPTVBPTkVOVCAqKXBPTVhDb21wb25lbnQtPnBDb21wb25lbnRQcml2YXRlOworICAgIFNFQ19PTVhfVklERU9ERUNfQ09NUE9ORU5UICpwVmlkZW9EZWMgPSAoU0VDX09NWF9WSURFT0RFQ19DT01QT05FTlQgKilwU0VDQ29tcG9uZW50LT5oQ29tcG9uZW50SGFuZGxlOworICAgIFNFQ19XTVZfSEFORExFICAgICAgICAqcFdtdkRlYyA9IE5VTEw7CisgICAgT01YX0hBTkRMRVRZUEUgICAgICAgICBoTUZDSGFuZGxlID0gTlVMTDsKKworICAgIEZ1bmN0aW9uSW4oKTsKKworI2lmZGVmIENPTkZJR19NRkNfRlBTCisgICAgU0VDX09TQUxfUGVyZlByaW50KCJbREVDXSIsICBQRVJGX0lEX0RFQyk7CisgICAgU0VDX09TQUxfUGVyZlByaW50KCJbQ1NDXSIsICBQRVJGX0lEX0NTQyk7CisjZW5kaWYKKworICAgIHBXbXZEZWMgPSAoU0VDX1dNVl9IQU5ETEUgKikoKFNFQ19PTVhfVklERU9ERUNfQ09NUE9ORU5UICopcFNFQ0NvbXBvbmVudC0+aENvbXBvbmVudEhhbmRsZSktPmhDb2RlY0hhbmRsZTsKKyAgICBoTUZDSGFuZGxlID0gcFdtdkRlYy0+aE1GQ1dtdkhhbmRsZS5oTUZDSGFuZGxlOworCisgICAgcFdtdkRlYy0+aE1GQ1dtdkhhbmRsZS5wTUZDU3RyZWFtQnVmZmVyICAgID0gTlVMTDsKKyAgICBwV212RGVjLT5oTUZDV212SGFuZGxlLnBNRkNTdHJlYW1QaHlCdWZmZXIgPSBOVUxMOworICAgIHBTRUNDb21wb25lbnQtPnByb2Nlc3NEYXRhW0lOUFVUX1BPUlRfSU5ERVhdLmRhdGFCdWZmZXIgPSBOVUxMOworICAgIHBTRUNDb21wb25lbnQtPnByb2Nlc3NEYXRhW0lOUFVUX1BPUlRfSU5ERVhdLmFsbG9jU2l6ZSA9IDA7CisKKyNpZmRlZiBOT05CTE9DS19NT0RFX1BST0NFU1MKKyAgICAgICAgaWYgKHBWaWRlb0RlYy0+TkJEZWNUaHJlYWQuaE5CRGVjb2RlVGhyZWFkICE9IE5VTEwpIHsKKyAgICAgICAgICAgIHBWaWRlb0RlYy0+TkJEZWNUaHJlYWQuYkV4aXREZWNvZGVUaHJlYWQgPSBPTVhfVFJVRTsKKyAgICAgICAgICAgIFNFQ19PU0FMX1NlbWFwaG9yZVBvc3QocFZpZGVvRGVjLT5OQkRlY1RocmVhZC5oRGVjRnJhbWVTdGFydCk7CisgICAgICAgICAgICBTRUNfT1NBTF9UaHJlYWRUZXJtaW5hdGUocFZpZGVvRGVjLT5OQkRlY1RocmVhZC5oTkJEZWNvZGVUaHJlYWQpOworICAgICAgICAgICAgcFZpZGVvRGVjLT5OQkRlY1RocmVhZC5oTkJEZWNvZGVUaHJlYWQgPSBOVUxMOworICAgICAgICB9CisKKyAgICAgICAgaWYocFZpZGVvRGVjLT5OQkRlY1RocmVhZC5oRGVjRnJhbWVFbmQgIT0gTlVMTCkgeworICAgICAgICAgICAgU0VDX09TQUxfU2VtYXBob3JlVGVybWluYXRlKHBWaWRlb0RlYy0+TkJEZWNUaHJlYWQuaERlY0ZyYW1lRW5kKTsKKyAgICAgICAgICAgIHBWaWRlb0RlYy0+TkJEZWNUaHJlYWQuaERlY0ZyYW1lRW5kID0gTlVMTDsKKyAgICAgICAgfQorCisgICAgICAgIGlmKHBWaWRlb0RlYy0+TkJEZWNUaHJlYWQuaERlY0ZyYW1lU3RhcnQgIT0gTlVMTCkgeworICAgICAgICAgICAgU0VDX09TQUxfU2VtYXBob3JlVGVybWluYXRlKHBWaWRlb0RlYy0+TkJEZWNUaHJlYWQuaERlY0ZyYW1lU3RhcnQpOworICAgICAgICAgICAgcFZpZGVvRGVjLT5OQkRlY1RocmVhZC5oRGVjRnJhbWVTdGFydCA9IE5VTEw7CisgICAgICAgIH0KKyNlbmRpZgorCisgICAgaWYgKGhNRkNIYW5kbGUgIT0gTlVMTCkgeworICAgICAgICBTc2JTaXBNZmNEZWNDbG9zZShoTUZDSGFuZGxlKTsKKyAgICAgICAgcFdtdkRlYy0+aE1GQ1dtdkhhbmRsZS5oTUZDSGFuZGxlID0gTlVMTDsKKyAgICB9CisKKyAgICBpZiAocFZpZGVvRGVjLT5jc2NfaGFuZGxlICE9IE5VTEwpIHsKKyAgICAgICAgY3NjX2RlaW5pdChwVmlkZW9EZWMtPmNzY19oYW5kbGUpOworICAgICAgICBwVmlkZW9EZWMtPmNzY19oYW5kbGUgPSBOVUxMOworICAgIH0KKworRVhJVDoKKyAgICBGdW5jdGlvbk91dCgpOworCisgICAgcmV0dXJuIHJldDsKK30KKworT01YX0VSUk9SVFlQRSBTRUNfTUZDX1dtdl9EZWNvZGVfTm9uYmxvY2soT01YX0NPTVBPTkVOVFRZUEUgKnBPTVhDb21wb25lbnQsIFNFQ19PTVhfREFUQSAqcElucHV0RGF0YSwgU0VDX09NWF9EQVRBICpwT3V0cHV0RGF0YSkKK3sKKyAgICBPTVhfRVJST1JUWVBFICAgICAgICAgICAgICAgcmV0ID0gT01YX0Vycm9yTm9uZTsKKyAgICBTRUNfT01YX0JBU0VDT01QT05FTlQgICAgICAqcFNFQ0NvbXBvbmVudCA9IChTRUNfT01YX0JBU0VDT01QT05FTlQgKilwT01YQ29tcG9uZW50LT5wQ29tcG9uZW50UHJpdmF0ZTsKKyAgICBTRUNfT01YX1ZJREVPREVDX0NPTVBPTkVOVCAqcFZpZGVvRGVjID0gKFNFQ19PTVhfVklERU9ERUNfQ09NUE9ORU5UICopcFNFQ0NvbXBvbmVudC0+aENvbXBvbmVudEhhbmRsZTsKKyAgICBTRUNfT01YX0JBU0VQT1JUICAgICAgICAgICAqcFNFQ0lucHV0UG9ydCA9ICZwU0VDQ29tcG9uZW50LT5wU0VDUG9ydFtJTlBVVF9QT1JUX0lOREVYXTsKKyAgICBTRUNfT01YX0JBU0VQT1JUICAgICAgICAgICAqcFNFQ091dHB1dFBvcnQgPSAmcFNFQ0NvbXBvbmVudC0+cFNFQ1BvcnRbT1VUUFVUX1BPUlRfSU5ERVhdOworICAgIFNFQ19XTVZfSEFORExFICAgICAgICAgICAgICpwV212RGVjID0gKFNFQ19XTVZfSEFORExFICopKChTRUNfT01YX1ZJREVPREVDX0NPTVBPTkVOVCAqKXBTRUNDb21wb25lbnQtPmhDb21wb25lbnRIYW5kbGUpLT5oQ29kZWNIYW5kbGU7CisgICAgT01YX1UzMiAgICAgICAgICAgICAgICAgICAgIG9uZUZyYW1lU2l6ZSA9IHBJbnB1dERhdGEtPmRhdGFMZW47CisgICAgU1NCU0lQX01GQ19ERUNfT1VUUFVUX0lORk8gIG91dHB1dEluZm87CisgICAgT01YX1MzMiAgICAgICAgICAgICAgICAgICAgIGNvbmZpZ1ZhbHVlID0gMDsKKyAgICBPTVhfQk9PTCAgICAgICAgICAgICAgICAgICAgYk1ldGFEYXRhID0gT01YX0ZBTFNFOworICAgIE9NWF9CT09MICAgICAgICAgICAgICAgICAgICBiU3RhcnRDb2RlID0gT01YX0ZBTFNFOworICAgIGludCAgICAgICAgICAgICAgICAgICAgICAgICBidWZXaWR0aCA9IDA7CisgICAgaW50ICAgICAgICAgICAgICAgICAgICAgICAgIGJ1ZkhlaWdodCA9IDA7CisgICAgT01YX1UzMiAgICAgICAgICAgICAgICAgICAgIEZyYW1lQnVmZmVyWVNpemUgPSAwOworICAgIE9NWF9VMzIgICAgICAgICAgICAgICAgICAgICBGcmFtZUJ1ZmZlclVWU2l6ZSA9IDA7CisgICAgT01YX0JPT0wgICAgICAgICAgICAgICAgICAgIG91dHB1dERhdGFWYWxpZCA9IE9NWF9GQUxTRTsKKworICAgIEZ1bmN0aW9uSW4oKTsKKworICAgIGlmIChwV212RGVjLT5oTUZDV212SGFuZGxlLmJDb25maWd1cmVkTUZDID09IE9NWF9GQUxTRSkgeworICAgICAgICBTU0JTSVBfTUZDX0NPREVDX1RZUEUgTUZDQ29kZWNUeXBlOworCisgICAgICAgIGlmICgob25lRnJhbWVTaXplIDw9IDApICYmIChwSW5wdXREYXRhLT5uRmxhZ3MgJiBPTVhfQlVGRkVSRkxBR19FT1MpKSB7CisgICAgICAgICAgICBwT3V0cHV0RGF0YS0+dGltZVN0YW1wID0gcElucHV0RGF0YS0+dGltZVN0YW1wOworICAgICAgICAgICAgcE91dHB1dERhdGEtPm5GbGFncyA9IHBJbnB1dERhdGEtPm5GbGFnczsKKyAgICAgICAgICAgIHJldCA9IE9NWF9FcnJvck5vbmU7CisgICAgICAgICAgICBnb3RvIEVYSVQ7CisgICAgICAgIH0KKworICAgICAgICBpZiAocFdtdkRlYy0+aE1GQ1dtdkhhbmRsZS53bXZGb3JtYXQgPT0gV01WX0ZPUk1BVF9XTVYzKQorICAgICAgICAgICAgTUZDQ29kZWNUeXBlID0gVkMxUkNWX0RFQzsKKyAgICAgICAgZWxzZSBpZiAocFdtdkRlYy0+aE1GQ1dtdkhhbmRsZS53bXZGb3JtYXQgPT0gV01WX0ZPUk1BVF9WQzEpCisgICAgICAgICAgICBNRkNDb2RlY1R5cGUgPSBWQzFfREVDOworICAgICAgICBlbHNlCisgICAgICAgICAgICBNRkNDb2RlY1R5cGUgPSBVTktOT1dOX1RZUEU7CisKKyAgICAgICAgU0VDX09TQUxfTG9nKFNFQ19MT0dfVFJBQ0UsICJjb2RlYyB0eXBlID0gJWQiLCBNRkNDb2RlY1R5cGUpOworCisgICAgICAgIGlmIChwVmlkZW9EZWMtPmJUaHVtYm5haWxNb2RlID09IE9NWF9UUlVFKSB7CisgICAgICAgICAgICBjb25maWdWYWx1ZSA9IDA7ICAgIC8vIHRoZSBudW1iZXIgdGhhdCB5b3Ugd2FudCB0byBkZWxheQorICAgICAgICAgICAgU3NiU2lwTWZjRGVjU2V0Q29uZmlnKHBXbXZEZWMtPmhNRkNXbXZIYW5kbGUuaE1GQ0hhbmRsZSwgTUZDX0RFQ19TRVRDT05GX0RJU1BMQVlfREVMQVksICZjb25maWdWYWx1ZSk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBjb25maWdWYWx1ZSA9IFdNVl9ERUNfTlVNX09GX0VYVFJBX0JVRkZFUlM7CisgICAgICAgICAgICBTc2JTaXBNZmNEZWNTZXRDb25maWcocFdtdkRlYy0+aE1GQ1dtdkhhbmRsZS5oTUZDSGFuZGxlLCBNRkNfREVDX1NFVENPTkZfRVhUUkFfQlVGRkVSX05VTSwgJmNvbmZpZ1ZhbHVlKTsKKyAgICAgICAgfQorCisgICAgICAgIGJNZXRhRGF0YSA9IE1ha2VfU3RyZWFtX01ldGFEYXRhKHBJbnB1dERhdGEtPmRhdGFCdWZmZXIsICZvbmVGcmFtZVNpemUsIHBXbXZEZWMtPmhNRkNXbXZIYW5kbGUud212Rm9ybWF0KTsKKyAgICAgICAgaWYgKGJNZXRhRGF0YSA9PSBPTVhfRkFMU0UpIHsKKyAgICAgICAgICAgIFNFQ19PU0FMX0xvZyhTRUNfTE9HX0VSUk9SLCAiRmFpbCB0byBNYWtlIFN0cmVhbSBNZXRhRGF0YSIpOworICAgICAgICAgICAgcmV0ID0gT01YX0Vycm9yTUZDSW5pdDsKKyAgICAgICAgICAgIGdvdG8gRVhJVDsKKyAgICAgICAgfQorCisgICAgICAgIFNzYlNpcE1mY0RlY1NldEluQnVmKHBXbXZEZWMtPmhNRkNXbXZIYW5kbGUuaE1GQ0hhbmRsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcFdtdkRlYy0+aE1GQ1dtdkhhbmRsZS5wTUZDU3RyZWFtUGh5QnVmZmVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwV212RGVjLT5oTUZDV212SGFuZGxlLnBNRkNTdHJlYW1CdWZmZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBTRUNDb21wb25lbnQtPnByb2Nlc3NEYXRhW0lOUFVUX1BPUlRfSU5ERVhdLmFsbG9jU2l6ZSk7CisKKyAgICAgICAgcFdtdkRlYy0+aE1GQ1dtdkhhbmRsZS5yZXR1cm5Db2RlYyA9IFNzYlNpcE1mY0RlY0luaXQocFdtdkRlYy0+aE1GQ1dtdkhhbmRsZS5oTUZDSGFuZGxlLCBNRkNDb2RlY1R5cGUsIG9uZUZyYW1lU2l6ZSk7CisgICAgICAgIGlmIChwV212RGVjLT5oTUZDV212SGFuZGxlLnJldHVybkNvZGVjID09IE1GQ19SRVRfT0spIHsKKyAgICAgICAgICAgIFNTQlNJUF9NRkNfSU1HX1JFU09MVVRJT04gaW1nUmVzb2w7CisKKyAgICAgICAgICAgIGlmIChTc2JTaXBNZmNEZWNHZXRDb25maWcocFdtdkRlYy0+aE1GQ1dtdkhhbmRsZS5oTUZDSGFuZGxlLCBNRkNfREVDX0dFVENPTkZfQlVGX1dJRFRIX0hFSUdIVCwgJmltZ1Jlc29sKSAhPSBNRkNfUkVUX09LKSB7CisgICAgICAgICAgICAgICAgcmV0ID0gT01YX0Vycm9yTUZDSW5pdDsKKyAgICAgICAgICAgICAgICBTRUNfT1NBTF9Mb2coU0VDX0xPR19FUlJPUiwgIlNzYlNpcE1mY0RlY0dldENvbmZpZyBmYWlsZWQiKTsKKyAgICAgICAgICAgICAgICBnb3RvIEVYSVQ7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIFNFQ19PU0FMX0xvZyhTRUNfTE9HX1RSQUNFLCAiIyMgbkZyYW1lV2lkdGgoJWQpIG5GcmFtZUhlaWdodCglZCksIG5TdHJpZGUoJWQpLCBuU2xpY2VIZWlnaHQoJWQpIiwKKyAgICAgICAgICAgICAgICBwU0VDSW5wdXRQb3J0LT5wb3J0RGVmaW5pdGlvbi5mb3JtYXQudmlkZW8ubkZyYW1lV2lkdGgsIHBTRUNJbnB1dFBvcnQtPnBvcnREZWZpbml0aW9uLmZvcm1hdC52aWRlby5uRnJhbWVIZWlnaHQsCisgICAgICAgICAgICAgICAgcFNFQ0lucHV0UG9ydC0+cG9ydERlZmluaXRpb24uZm9ybWF0LnZpZGVvLm5TdHJpZGUsIHBTRUNJbnB1dFBvcnQtPnBvcnREZWZpbml0aW9uLmZvcm1hdC52aWRlby5uU2xpY2VIZWlnaHQpOworCisgICAgICAgICAgICAvKiogVXBkYXRlIEZyYW1lIFNpemUgKiovCisgICAgICAgICAgICBpZiAoKHBTRUNJbnB1dFBvcnQtPnBvcnREZWZpbml0aW9uLmZvcm1hdC52aWRlby5uRnJhbWVXaWR0aCAhPSAodW5zaWduZWQgaW50KWltZ1Jlc29sLndpZHRoKSB8fAorICAgICAgICAgICAgICAgKHBTRUNJbnB1dFBvcnQtPnBvcnREZWZpbml0aW9uLmZvcm1hdC52aWRlby5uRnJhbWVIZWlnaHQgIT0gKHVuc2lnbmVkIGludClpbWdSZXNvbC5oZWlnaHQpKSB7CisgICAgICAgICAgICAgICAgLyogY2hhbmdlIHdpZHRoIGFuZCBoZWlnaHQgaW5mb3JtYXRpb24gKi8KKyAgICAgICAgICAgICAgICBwU0VDSW5wdXRQb3J0LT5wb3J0RGVmaW5pdGlvbi5mb3JtYXQudmlkZW8ubkZyYW1lV2lkdGggPSBpbWdSZXNvbC53aWR0aDsKKyAgICAgICAgICAgICAgICBwU0VDSW5wdXRQb3J0LT5wb3J0RGVmaW5pdGlvbi5mb3JtYXQudmlkZW8ubkZyYW1lSGVpZ2h0ID0gaW1nUmVzb2wuaGVpZ2h0OworICAgICAgICAgICAgICAgIHBTRUNJbnB1dFBvcnQtPnBvcnREZWZpbml0aW9uLmZvcm1hdC52aWRlby5uU3RyaWRlICAgICAgPSAoKGltZ1Jlc29sLndpZHRoICsgMTUpICYgKH4xNSkpOworICAgICAgICAgICAgICAgIHBTRUNJbnB1dFBvcnQtPnBvcnREZWZpbml0aW9uLmZvcm1hdC52aWRlby5uU2xpY2VIZWlnaHQgPSAoKGltZ1Jlc29sLmhlaWdodCArIDE1KSAmICh+MTUpKTsKKworICAgICAgICAgICAgICAgIFNFQ19PU0FMX0xvZyhTRUNfTE9HX1RSQUNFLCAibkZyYW1lV2lkdGgoJWQpIG5GcmFtZUhlaWdodCglZCksIG5TdHJpZGUoJWQpLCBuU2xpY2VIZWlnaHQoJWQpIiwKKyAgICAgICAgICAgICAgICAgICAgcFNFQ0lucHV0UG9ydC0+cG9ydERlZmluaXRpb24uZm9ybWF0LnZpZGVvLm5GcmFtZVdpZHRoLCBwU0VDSW5wdXRQb3J0LT5wb3J0RGVmaW5pdGlvbi5mb3JtYXQudmlkZW8ubkZyYW1lSGVpZ2h0LAorICAgICAgICAgICAgICAgICAgICBwU0VDSW5wdXRQb3J0LT5wb3J0RGVmaW5pdGlvbi5mb3JtYXQudmlkZW8ublN0cmlkZSwgcFNFQ0lucHV0UG9ydC0+cG9ydERlZmluaXRpb24uZm9ybWF0LnZpZGVvLm5TbGljZUhlaWdodCk7CisKKyAgICAgICAgICAgICAgICBTRUNfVXBkYXRlRnJhbWVTaXplKHBPTVhDb21wb25lbnQpOworCisgICAgICAgICAgICAgICAgLyogU2VuZCBQb3J0IFNldHRpbmdzIGNoYW5nZWQgY2FsbCBiYWNrICovCisgICAgICAgICAgICAgICAgKCoocFNFQ0NvbXBvbmVudC0+cENhbGxiYWNrcy0+RXZlbnRIYW5kbGVyKSkKKyAgICAgICAgICAgICAgICAgICAgICAocE9NWENvbXBvbmVudCwKKyAgICAgICAgICAgICAgICAgICAgICAgcFNFQ0NvbXBvbmVudC0+Y2FsbGJhY2tEYXRhLAorICAgICAgICAgICAgICAgICAgICAgICBPTVhfRXZlbnRQb3J0U2V0dGluZ3NDaGFuZ2VkLCAvLyBUaGUgY29tbWFuZCB3YXMgY29tcGxldGVkCisgICAgICAgICAgICAgICAgICAgICAgIE9NWF9EaXJPdXRwdXQsIC8vIFRoaXMgaXMgdGhlIHBvcnQgaW5kZXgKKyAgICAgICAgICAgICAgICAgICAgICAgMCwKKyAgICAgICAgICAgICAgICAgICAgICAgTlVMTCk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHBXbXZEZWMtPmhNRkNXbXZIYW5kbGUuYkNvbmZpZ3VyZWRNRkMgPSBPTVhfVFJVRTsKKworICAgICAgICAgICAgaWYgKHBXbXZEZWMtPmhNRkNXbXZIYW5kbGUud212Rm9ybWF0ID09IFdNVl9GT1JNQVRfV01WMykgeworICAgICAgICAgICAgICAgIHBPdXRwdXREYXRhLT50aW1lU3RhbXAgPSBwSW5wdXREYXRhLT50aW1lU3RhbXA7CisgICAgICAgICAgICAgICAgcE91dHB1dERhdGEtPm5GbGFncyA9IHBJbnB1dERhdGEtPm5GbGFnczsKKyAgICAgICAgICAgICAgICByZXQgPSBPTVhfRXJyb3JOb25lOworICAgICAgICAgICAgfSBlbHNlIHsKKworI2lmZGVmIFdPX1NUQVJUX0NPREUKKy8qIEFTRiBwYXJzZXIgZG9lcyBub3Qgc2VuZCBzdGFydCBjb2RlIG9uIE9wZW5DT1JFICovCisgICAgICAgICAgICAgICAgcE91dHB1dERhdGEtPnRpbWVTdGFtcCA9IHBJbnB1dERhdGEtPnRpbWVTdGFtcDsKKyAgICAgICAgICAgICAgICBwT3V0cHV0RGF0YS0+bkZsYWdzID0gcElucHV0RGF0YS0+bkZsYWdzOworICAgICAgICAgICAgICAgIHJldCA9IE9NWF9FcnJvck5vbmU7CisjZWxzZQorLyogVE9ETyA6IGZvciBjb21mb3JtYW5jIHRlc3QgYmFzZWQgb24gY29tbW9uIGJ1ZmZlciBzY2hlbWUgdy9vIHBhcnNlciAqLworICAgICAgICAgICAgICAgIHBPdXRwdXREYXRhLT5kYXRhTGVuID0gMDsKKyAgICAgICAgICAgICAgICByZXQgPSBPTVhfRXJyb3JJbnB1dERhdGFEZWNvZGVZZXQ7CisjZW5kaWYKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGdvdG8gRVhJVDsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIFNFQ19PU0FMX0xvZyhTRUNfTE9HX0VSUk9SLCAiU3NiU2lwTWZjRGVjSW5pdCBmYWlsZWQiKTsKKyAgICAgICAgICAgIHJldCA9IE9NWF9FcnJvck1GQ0luaXQ7ICAgIC8qIE9NWF9FcnJvclVuZGVmaW5lZCAqLworICAgICAgICAgICAgZ290byBFWElUOworICAgICAgICB9CisgICAgfQorCisjaWZuZGVmIEZVTExfRlJBTUVfU0VBUkNICisgICAgaWYgKChwSW5wdXREYXRhLT5uRmxhZ3MgJiBPTVhfQlVGRkVSRkxBR19FTkRPRkZSQU1FKSAmJgorICAgICAgICAocFNFQ0NvbXBvbmVudC0+YlVzZUZsYWdFT0YgPT0gT01YX0ZBTFNFKSkKKyAgICAgICAgcFNFQ0NvbXBvbmVudC0+YlVzZUZsYWdFT0YgPSBPTVhfVFJVRTsKKyNlbmRpZgorCisgICAgcFNFQ0NvbXBvbmVudC0+dGltZVN0YW1wW3BXbXZEZWMtPmhNRkNXbXZIYW5kbGUuaW5kZXhUaW1lc3RhbXBdID0gcElucHV0RGF0YS0+dGltZVN0YW1wOworICAgIHBTRUNDb21wb25lbnQtPm5GbGFnc1twV212RGVjLT5oTUZDV212SGFuZGxlLmluZGV4VGltZXN0YW1wXSA9IHBJbnB1dERhdGEtPm5GbGFnczsKKworICAgIGlmICgocFdtdkRlYy0+aE1GQ1dtdkhhbmRsZS5yZXR1cm5Db2RlYyA9PSBNRkNfUkVUX09LKSAmJiAocFZpZGVvRGVjLT5iRmlyc3RGcmFtZSA9PSBPTVhfRkFMU0UpKSB7CisgICAgICAgIFNTQlNJUF9NRkNfREVDX09VVEJVRl9TVEFUVVMgc3RhdHVzOworICAgICAgICBPTVhfUzMyIGluZGV4VGltZXN0YW1wID0gMDsKKworICAgICAgICAvKiB3YWl0IGZvciBtZmMgZGVjb2RlIGRvbmUgKi8KKyAgICAgICAgaWYgKHBWaWRlb0RlYy0+TkJEZWNUaHJlYWQuYkRlY29kZXJSdW4gPT0gT01YX1RSVUUpIHsKKyAgICAgICAgICAgIFNFQ19PU0FMX1NlbWFwaG9yZVdhaXQocFZpZGVvRGVjLT5OQkRlY1RocmVhZC5oRGVjRnJhbWVFbmQpOworICAgICAgICAgICAgcFZpZGVvRGVjLT5OQkRlY1RocmVhZC5iRGVjb2RlclJ1biA9IE9NWF9GQUxTRTsKKyAgICAgICAgfQorCisgICAgICAgIFNFQ19PU0FMX1NsZWVwTWlsbGlzZWMoMCk7CisgICAgICAgIHN0YXR1cyA9IFNzYlNpcE1mY0RlY0dldE91dEJ1ZihwV212RGVjLT5oTUZDV212SGFuZGxlLmhNRkNIYW5kbGUsICZvdXRwdXRJbmZvKTsKKyAgICAgICAgICAgIGJ1ZldpZHRoID0gKG91dHB1dEluZm8uaW1nX3dpZHRoICsgMTUpICYgKH4xNSk7CisgICAgICAgICAgICBidWZIZWlnaHQgPSAob3V0cHV0SW5mby5pbWdfaGVpZ2h0ICsgMTUpICYgKH4xNSk7CisgICAgICAgICAgICBGcmFtZUJ1ZmZlcllTaXplID0gQUxJR05fVE9fOEtCKEFMSUdOX1RPXzEyOEIob3V0cHV0SW5mby5pbWdfd2lkdGgpICogQUxJR05fVE9fMzJCKG91dHB1dEluZm8uaW1nX2hlaWdodCkpOworICAgICAgICAgICAgRnJhbWVCdWZmZXJVVlNpemUgPSBBTElHTl9UT184S0IoQUxJR05fVE9fMTI4QihvdXRwdXRJbmZvLmltZ193aWR0aCkgKiBBTElHTl9UT18zMkIob3V0cHV0SW5mby5pbWdfaGVpZ2h0LzIpKTsKKworICAgICAgICAgICAgaWYgKChTc2JTaXBNZmNEZWNHZXRDb25maWcocFdtdkRlYy0+aE1GQ1dtdkhhbmRsZS5oTUZDSGFuZGxlLCBNRkNfREVDX0dFVENPTkZfRlJBTUVfVEFHLCAmaW5kZXhUaW1lc3RhbXApICE9IE1GQ19SRVRfT0spIHx8CisgICAgICAgICAgICAgICAgKCgoaW5kZXhUaW1lc3RhbXAgPCAwKSB8fCAoaW5kZXhUaW1lc3RhbXAgPj0gTUFYX1RJTUVTVEFNUCkpKSkgeworICAgICAgICAgICAgICAgIHBPdXRwdXREYXRhLT50aW1lU3RhbXAgPSBwSW5wdXREYXRhLT50aW1lU3RhbXA7CisgICAgICAgICAgICAgICAgcE91dHB1dERhdGEtPm5GbGFncyA9IHBJbnB1dERhdGEtPm5GbGFnczsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgLyogRm9yIHRpbWVzdGFtcCBjb3JyZWN0aW9uLiBpZiBtZmMgc3VwcG9ydCBmcmFtZXR5cGUgZGV0ZWN0ICovCisgICAgICAgICAgICAgICAgU0VDX09TQUxfTG9nKFNFQ19MT0dfVFJBQ0UsICJkaXNwX3BpY19mcmFtZV90eXBlOiAlZCIsIG91dHB1dEluZm8uZGlzcF9waWNfZnJhbWVfdHlwZSk7CisjaWZkZWYgTkVFRF9USU1FU1RBTVBfUkVPUkRFUgorICAgICAgICAgICAgICAgIGlmIChvdXRwdXRJbmZvLmRpc3BfcGljX2ZyYW1lX3R5cGUgPT0gTUZDX0ZSQU1FX1RZUEVfSV9GUkFNRSkgeworICAgICAgICAgICAgICAgICAgICBwT3V0cHV0RGF0YS0+dGltZVN0YW1wID0gcFNFQ0NvbXBvbmVudC0+dGltZVN0YW1wW2luZGV4VGltZXN0YW1wXTsKKyAgICAgICAgICAgICAgICAgICAgcE91dHB1dERhdGEtPm5GbGFncyA9IHBTRUNDb21wb25lbnQtPm5GbGFnc1tpbmRleFRpbWVzdGFtcF07CisgICAgICAgICAgICAgICAgICAgIHBXbXZEZWMtPmhNRkNXbXZIYW5kbGUub3V0cHV0SW5kZXhUaW1lc3RhbXAgPSBpbmRleFRpbWVzdGFtcDsKKyAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICBwT3V0cHV0RGF0YS0+dGltZVN0YW1wID0gcFNFQ0NvbXBvbmVudC0+dGltZVN0YW1wW3BXbXZEZWMtPmhNRkNXbXZIYW5kbGUub3V0cHV0SW5kZXhUaW1lc3RhbXBdOworICAgICAgICAgICAgICAgICAgICBwT3V0cHV0RGF0YS0+bkZsYWdzID0gcFNFQ0NvbXBvbmVudC0+bkZsYWdzW3BXbXZEZWMtPmhNRkNXbXZIYW5kbGUub3V0cHV0SW5kZXhUaW1lc3RhbXBdOworICAgICAgICAgICAgICAgIH0KKyNlbHNlCisgICAgICAgICAgICAgICAgcE91dHB1dERhdGEtPnRpbWVTdGFtcCA9IHBTRUNDb21wb25lbnQtPnRpbWVTdGFtcFtpbmRleFRpbWVzdGFtcF07CisgICAgICAgICAgICAgICAgcE91dHB1dERhdGEtPm5GbGFncyA9IHBTRUNDb21wb25lbnQtPm5GbGFnc1tpbmRleFRpbWVzdGFtcF07CisjZW5kaWYKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaWYgKChzdGF0dXMgPT0gTUZDX0dFVE9VVEJVRl9ESVNQTEFZX0RFQ09ESU5HKSB8fAorICAgICAgICAgICAgICAgIChzdGF0dXMgPT0gTUZDX0dFVE9VVEJVRl9ESVNQTEFZX09OTFkpKSB7CisgICAgICAgICAgICAgICAgb3V0cHV0RGF0YVZhbGlkID0gT01YX1RSVUU7CisgICAgICAgICAgICAgICAgcFdtdkRlYy0+aE1GQ1dtdkhhbmRsZS5vdXRwdXRJbmRleFRpbWVzdGFtcCsrOworICAgICAgICAgICAgICAgIHBXbXZEZWMtPmhNRkNXbXZIYW5kbGUub3V0cHV0SW5kZXhUaW1lc3RhbXAgJT0gTUFYX1RJTUVTVEFNUDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmIChwT3V0cHV0RGF0YS0+bkZsYWdzICYgT01YX0JVRkZFUkZMQUdfRU9TKQorICAgICAgICAgICAgICAgIG91dHB1dERhdGFWYWxpZCA9IE9NWF9GQUxTRTsKKworICAgICAgICAgICAgaWYgKChzdGF0dXMgPT0gTUZDX0dFVE9VVEJVRl9ESVNQTEFZX09OTFkpIHx8CisgICAgICAgICAgICAgICAgKHBTRUNDb21wb25lbnQtPmdldEFsbERlbGF5QnVmZmVyID09IE9NWF9UUlVFKSkKKyAgICAgICAgICAgICAgICByZXQgPSBPTVhfRXJyb3JJbnB1dERhdGFEZWNvZGVZZXQ7CisKKyAgICAgICAgICAgIGlmIChzdGF0dXMgPT0gTUZDX0dFVE9VVEJVRl9ERUNPRElOR19PTkxZKSB7CisgICAgICAgICAgICAgICAgaWYgKCgocElucHV0RGF0YS0+bkZsYWdzICYgT01YX0JVRkZFUkZMQUdfRU9TKSAhPSBPTVhfQlVGRkVSRkxBR19FT1MpICYmCisgICAgICAgICAgICAgICAgICAgICgocFNFQ0NvbXBvbmVudC0+YlNhdmVGbGFnRU9TID09IE9NWF9UUlVFKSB8fCAocFNFQ0NvbXBvbmVudC0+Z2V0QWxsRGVsYXlCdWZmZXIgPT0gT01YX1RSVUUpKSkgeworICAgICAgICAgICAgICAgICAgICBwSW5wdXREYXRhLT5uRmxhZ3MgfD0gT01YX0JVRkZFUkZMQUdfRU9TOworICAgICAgICAgICAgICAgICAgICBwU0VDQ29tcG9uZW50LT5nZXRBbGxEZWxheUJ1ZmZlciA9IE9NWF9UUlVFOworICAgICAgICAgICAgICAgICAgICByZXQgPSBPTVhfRXJyb3JJbnB1dERhdGFEZWNvZGVZZXQ7CisgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0ID0gT01YX0Vycm9yTm9uZTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgb3V0cHV0RGF0YVZhbGlkID0gT01YX0ZBTFNFOworICAgICAgICAgICAgfQorCisjaWZkZWYgRlVMTF9GUkFNRV9TRUFSQ0gKKyAgICAgICAgICAgIGlmICgoKHBJbnB1dERhdGEtPm5GbGFncyAmIE9NWF9CVUZGRVJGTEFHX0VPUykgIT0gT01YX0JVRkZFUkZMQUdfRU9TKSAmJgorICAgICAgICAgICAgICAgIChwU0VDQ29tcG9uZW50LT5iU2F2ZUZsYWdFT1MgPT0gT01YX1RSVUUpKSB7CisgICAgICAgICAgICAgICAgcElucHV0RGF0YS0+bkZsYWdzIHw9IE9NWF9CVUZGRVJGTEFHX0VPUzsKKyAgICAgICAgICAgICAgICBwU0VDQ29tcG9uZW50LT5nZXRBbGxEZWxheUJ1ZmZlciA9IE9NWF9UUlVFOworICAgICAgICAgICAgICAgIHJldCA9IE9NWF9FcnJvcklucHV0RGF0YURlY29kZVlldDsKKyAgICAgICAgICAgIH0gZWxzZQorI2VuZGlmCisgICAgICAgICAgICBpZiAoKHBJbnB1dERhdGEtPm5GbGFncyAmIE9NWF9CVUZGRVJGTEFHX0VPUykgPT0gT01YX0JVRkZFUkZMQUdfRU9TKSB7CisgICAgICAgICAgICAgICAgcElucHV0RGF0YS0+bkZsYWdzID0gKHBPdXRwdXREYXRhLT5uRmxhZ3MgJiAofk9NWF9CVUZGRVJGTEFHX0VPUykpOworICAgICAgICAgICAgICAgIHBTRUNDb21wb25lbnQtPmdldEFsbERlbGF5QnVmZmVyID0gT01YX1RSVUU7CisgICAgICAgICAgICAgICAgcmV0ID0gT01YX0Vycm9ySW5wdXREYXRhRGVjb2RlWWV0OworICAgICAgICAgICAgfSBlbHNlIGlmICgocE91dHB1dERhdGEtPm5GbGFncyAmIE9NWF9CVUZGRVJGTEFHX0VPUykgPT0gT01YX0JVRkZFUkZMQUdfRU9TKSB7CisgICAgICAgICAgICAgICAgcFNFQ0NvbXBvbmVudC0+Z2V0QWxsRGVsYXlCdWZmZXIgPSBPTVhfRkFMU0U7CisgICAgICAgICAgICAgICAgcmV0ID0gT01YX0Vycm9yTm9uZTsKKyAgICAgICAgICAgIH0KKyAgICB9IGVsc2UgeworICAgICAgICBwT3V0cHV0RGF0YS0+dGltZVN0YW1wID0gcElucHV0RGF0YS0+dGltZVN0YW1wOworICAgICAgICBwT3V0cHV0RGF0YS0+bkZsYWdzID0gcElucHV0RGF0YS0+bkZsYWdzOworCisgICAgICAgIGlmICgocFNFQ0NvbXBvbmVudC0+YlNhdmVGbGFnRU9TID09IE9NWF9UUlVFKSB8fAorICAgICAgICAgICAgKHBTRUNDb21wb25lbnQtPmdldEFsbERlbGF5QnVmZmVyID09IE9NWF9UUlVFKSB8fAorICAgICAgICAgICAgKHBJbnB1dERhdGEtPm5GbGFncyAmIE9NWF9CVUZGRVJGTEFHX0VPUykpIHsKKyAgICAgICAgICAgIHBPdXRwdXREYXRhLT5uRmxhZ3MgfD0gT01YX0JVRkZFUkZMQUdfRU9TOworICAgICAgICAgICAgcFNFQ0NvbXBvbmVudC0+Z2V0QWxsRGVsYXlCdWZmZXIgPSBPTVhfRkFMU0U7CisgICAgICAgIH0KKworICAgICAgICBpZiAoKHBWaWRlb0RlYy0+YkZpcnN0RnJhbWUgPT0gT01YX1RSVUUpICYmCisgICAgICAgICAgICAoKHBPdXRwdXREYXRhLT5uRmxhZ3MgJiBPTVhfQlVGRkVSRkxBR19FT1MpID09IE9NWF9CVUZGRVJGTEFHX0VPUykgJiYKKyAgICAgICAgICAgICgocElucHV0RGF0YS0+bkZsYWdzICYgT01YX0JVRkZFUkZMQUdfQ09ERUNDT05GSUcpICE9IE9NWF9CVUZGRVJGTEFHX0NPREVDQ09ORklHKSkgeworICAgICAgICAgICAgcE91dHB1dERhdGEtPm5GbGFncyA9IChwT3V0cHV0RGF0YS0+bkZsYWdzICYgKH5PTVhfQlVGRkVSRkxBR19FT1MpKTsKKyAgICAgICAgfQorCisgICAgICAgIG91dHB1dERhdGFWYWxpZCA9IE9NWF9GQUxTRTsKKworICAgICAgICAvKiByZXQgPSBPTVhfRXJyb3JVbmRlZmluZWQ7ICovCisgICAgICAgIHJldCA9IE9NWF9FcnJvck5vbmU7CisgICAgfQorCisjaWZkZWYgV09fU1RBUlRfQ09ERQorICAgIGlmIChwSW5wdXREYXRhLT5hbGxvY1NpemUgPCBvbmVGcmFtZVNpemUrNCkgeworICAgICAgICBTRUNfT1NBTF9Mb2coU0VDX0xPR19FUlJPUiwgIkNhbid0IGF0dGFjaCBzdGFydGNvZGUgZHVlIHRvIGxhY2sgb2YgYnVmZmVyIHNwYWNlIik7CisgICAgICAgIHJldCA9IE9NWF9FcnJvck1GQ0luaXQ7CisgICAgICAgIGdvdG8gRVhJVDsKKyAgICB9CisKKyAgICBiU3RhcnRDb2RlID0gTWFrZV9TdHJlYW1fU3RhcnRDb2RlKHBJbnB1dERhdGEtPmRhdGFCdWZmZXIsIG9uZUZyYW1lU2l6ZSwgcFdtdkRlYy0+aE1GQ1dtdkhhbmRsZS53bXZGb3JtYXQpOworICAgIGlmIChiU3RhcnRDb2RlID09IE9NWF9GQUxTRSkgeworICAgICAgICBTRUNfT1NBTF9Mb2coU0VDX0xPR19FUlJPUiwgIkZhaWwgdG8gTWFrZSBTdHJlYW0gU3RhcnQgQ29kZSIpOworICAgICAgICByZXQgPSBPTVhfRXJyb3JNRkNJbml0OworICAgICAgICBnb3RvIEVYSVQ7CisgICAgfQorI2VuZGlmCisKKyAgICBpZiAocmV0ID09IE9NWF9FcnJvcklucHV0RGF0YURlY29kZVlldCkgeworICAgICAgICBwVmlkZW9EZWMtPk1GQ0RlY0lucHV0QnVmZmVyW3BWaWRlb0RlYy0+aW5kZXhJbnB1dEJ1ZmZlcl0uZGF0YVNpemUgPSBvbmVGcmFtZVNpemU7CisgICAgICAgIHBWaWRlb0RlYy0+aW5kZXhJbnB1dEJ1ZmZlcisrOworICAgICAgICBwVmlkZW9EZWMtPmluZGV4SW5wdXRCdWZmZXIgJT0gTUZDX0lOUFVUX0JVRkZFUl9OVU1fTUFYOworICAgICAgICBwV212RGVjLT5oTUZDV212SGFuZGxlLnBNRkNTdHJlYW1CdWZmZXIgICAgPSBwVmlkZW9EZWMtPk1GQ0RlY0lucHV0QnVmZmVyW3BWaWRlb0RlYy0+aW5kZXhJbnB1dEJ1ZmZlcl0uVmlyQWRkcjsKKyAgICAgICAgcFdtdkRlYy0+aE1GQ1dtdkhhbmRsZS5wTUZDU3RyZWFtUGh5QnVmZmVyID0gcFZpZGVvRGVjLT5NRkNEZWNJbnB1dEJ1ZmZlcltwVmlkZW9EZWMtPmluZGV4SW5wdXRCdWZmZXJdLlBoeUFkZHI7CisgICAgICAgIHBTRUNDb21wb25lbnQtPnByb2Nlc3NEYXRhW0lOUFVUX1BPUlRfSU5ERVhdLmRhdGFCdWZmZXIgPSBwVmlkZW9EZWMtPk1GQ0RlY0lucHV0QnVmZmVyW3BWaWRlb0RlYy0+aW5kZXhJbnB1dEJ1ZmZlcl0uVmlyQWRkcjsKKyAgICAgICAgcFNFQ0NvbXBvbmVudC0+cHJvY2Vzc0RhdGFbSU5QVVRfUE9SVF9JTkRFWF0uYWxsb2NTaXplID0gcFZpZGVvRGVjLT5NRkNEZWNJbnB1dEJ1ZmZlcltwVmlkZW9EZWMtPmluZGV4SW5wdXRCdWZmZXJdLmJ1ZmZlclNpemU7CisgICAgICAgIG9uZUZyYW1lU2l6ZSA9IHBWaWRlb0RlYy0+TUZDRGVjSW5wdXRCdWZmZXJbcFZpZGVvRGVjLT5pbmRleElucHV0QnVmZmVyXS5kYXRhU2l6ZTsKKyAgICAgICAgLy9wSW5wdXREYXRhLT5kYXRhTGVuID0gb25lRnJhbWVTaXplOworICAgICAgICAvL3BJbnB1dERhdGEtPnJlbWFpbkRhdGFMZW4gPSBvbmVGcmFtZVNpemU7CisgICAgfQorCisgICAgU0VDX09TQUxfTG9nKFNFQ19MT0dfVFJBQ0UsICJTc2JTaXBNZmNEZWNFeGUgb25lRnJhbWVTaXplID0gJWQiLCBvbmVGcmFtZVNpemUpOworCisgICAgaWYgKChDaGVja19TdHJlYW1fUHJlZml4Q29kZShwSW5wdXREYXRhLT5kYXRhQnVmZmVyLCBvbmVGcmFtZVNpemUsIHBXbXZEZWMtPmhNRkNXbXZIYW5kbGUud212Rm9ybWF0KSA9PSBPTVhfVFJVRSkgJiYKKyAgICAgICAgKChwT3V0cHV0RGF0YS0+bkZsYWdzICYgT01YX0JVRkZFUkZMQUdfRU9TKSAhPSBPTVhfQlVGRkVSRkxBR19FT1MpKSB7CisgICAgICAgIGlmICgocmV0ICE9IE9NWF9FcnJvcklucHV0RGF0YURlY29kZVlldCkgfHwgKHBTRUNDb21wb25lbnQtPmdldEFsbERlbGF5QnVmZmVyID09IE9NWF9UUlVFKSkgeworICAgICAgICAgICAgU3NiU2lwTWZjRGVjU2V0Q29uZmlnKHBXbXZEZWMtPmhNRkNXbXZIYW5kbGUuaE1GQ0hhbmRsZSwgTUZDX0RFQ19TRVRDT05GX0ZSQU1FX1RBRywgJihwV212RGVjLT5oTUZDV212SGFuZGxlLmluZGV4VGltZXN0YW1wKSk7CisgICAgICAgICAgICBwV212RGVjLT5oTUZDV212SGFuZGxlLmluZGV4VGltZXN0YW1wKys7CisgICAgICAgICAgICBwV212RGVjLT5oTUZDV212SGFuZGxlLmluZGV4VGltZXN0YW1wICU9IE1BWF9USU1FU1RBTVA7CisgICAgICAgIH0KKworICAgICAgICBTc2JTaXBNZmNEZWNTZXRJbkJ1ZihwV212RGVjLT5oTUZDV212SGFuZGxlLmhNRkNIYW5kbGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBXbXZEZWMtPmhNRkNXbXZIYW5kbGUucE1GQ1N0cmVhbVBoeUJ1ZmZlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcFdtdkRlYy0+aE1GQ1dtdkhhbmRsZS5wTUZDU3RyZWFtQnVmZmVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwU0VDQ29tcG9uZW50LT5wcm9jZXNzRGF0YVtJTlBVVF9QT1JUX0lOREVYXS5hbGxvY1NpemUpOworCisgICAgICAgIHBWaWRlb0RlYy0+TUZDRGVjSW5wdXRCdWZmZXJbcFZpZGVvRGVjLT5pbmRleElucHV0QnVmZmVyXS5kYXRhU2l6ZSA9IG9uZUZyYW1lU2l6ZTsKKyNpZmRlZiBXT19TVEFSVF9DT0RFCisgICAgICAgIHBWaWRlb0RlYy0+TkJEZWNUaHJlYWQub25lRnJhbWVTaXplID0gb25lRnJhbWVTaXplICsgNDsgLyogRnJhbWUgU3RhcnQgQ29kZSAqLworI2Vsc2UKKyAgICAgICAgcFZpZGVvRGVjLT5OQkRlY1RocmVhZC5vbmVGcmFtZVNpemUgPSBvbmVGcmFtZVNpemU7CisjZW5kaWYKKyAgICAgICAgLyogbWZjIGRlY29kZSBzdGFydCAqLworICAgICAgICBTRUNfT1NBTF9TZW1hcGhvcmVQb3N0KHBWaWRlb0RlYy0+TkJEZWNUaHJlYWQuaERlY0ZyYW1lU3RhcnQpOworICAgICAgICBwVmlkZW9EZWMtPk5CRGVjVGhyZWFkLmJEZWNvZGVyUnVuID0gT01YX1RSVUU7CisgICAgICAgIHBXbXZEZWMtPmhNRkNXbXZIYW5kbGUucmV0dXJuQ29kZWMgPSBNRkNfUkVUX09LOworCisgICAgICAgIFNFQ19PU0FMX1NsZWVwTWlsbGlzZWMoMCk7CisKKyAgICAgICAgcFZpZGVvRGVjLT5pbmRleElucHV0QnVmZmVyKys7CisgICAgICAgIHBWaWRlb0RlYy0+aW5kZXhJbnB1dEJ1ZmZlciAlPSBNRkNfSU5QVVRfQlVGRkVSX05VTV9NQVg7CisgICAgICAgIHBXbXZEZWMtPmhNRkNXbXZIYW5kbGUucE1GQ1N0cmVhbUJ1ZmZlciAgICA9IHBWaWRlb0RlYy0+TUZDRGVjSW5wdXRCdWZmZXJbcFZpZGVvRGVjLT5pbmRleElucHV0QnVmZmVyXS5WaXJBZGRyOworICAgICAgICBwV212RGVjLT5oTUZDV212SGFuZGxlLnBNRkNTdHJlYW1QaHlCdWZmZXIgPSBwVmlkZW9EZWMtPk1GQ0RlY0lucHV0QnVmZmVyW3BWaWRlb0RlYy0+aW5kZXhJbnB1dEJ1ZmZlcl0uUGh5QWRkcjsKKyAgICAgICAgcFNFQ0NvbXBvbmVudC0+cHJvY2Vzc0RhdGFbSU5QVVRfUE9SVF9JTkRFWF0uZGF0YUJ1ZmZlciA9IHBWaWRlb0RlYy0+TUZDRGVjSW5wdXRCdWZmZXJbcFZpZGVvRGVjLT5pbmRleElucHV0QnVmZmVyXS5WaXJBZGRyOworICAgICAgICBwU0VDQ29tcG9uZW50LT5wcm9jZXNzRGF0YVtJTlBVVF9QT1JUX0lOREVYXS5hbGxvY1NpemUgPSBwVmlkZW9EZWMtPk1GQ0RlY0lucHV0QnVmZmVyW3BWaWRlb0RlYy0+aW5kZXhJbnB1dEJ1ZmZlcl0uYnVmZmVyU2l6ZTsKKworICAgICAgICBpZiAoKHBWaWRlb0RlYy0+YkZpcnN0RnJhbWUgPT0gT01YX1RSVUUpICYmCisgICAgICAgICAgICAocFNFQ0NvbXBvbmVudC0+YlNhdmVGbGFnRU9TID09IE9NWF9UUlVFKSAmJgorICAgICAgICAgICAgKG91dHB1dERhdGFWYWxpZCA9PSBPTVhfRkFMU0UpKSB7CisgICAgICAgICAgICByZXQgPSBPTVhfRXJyb3JJbnB1dERhdGFEZWNvZGVZZXQ7CisgICAgICAgIH0KKworICAgICAgICBwVmlkZW9EZWMtPmJGaXJzdEZyYW1lID0gT01YX0ZBTFNFOworICAgIH0gZWxzZSB7CisgICAgICAgIGlmIChwU0VDQ29tcG9uZW50LT5jaGVja1RpbWVTdGFtcC5uZWVkQ2hlY2tTdGFydFRpbWVTdGFtcCA9PSBPTVhfVFJVRSkKKyAgICAgICAgICAgIHBTRUNDb21wb25lbnQtPmNoZWNrVGltZVN0YW1wLm5lZWRTZXRTdGFydFRpbWVTdGFtcCA9IE9NWF9UUlVFOworICAgIH0KKworICAgIC8qKiBGaWxsIE91dHB1dCBCdWZmZXIgKiovCisgICAgaWYgKG91dHB1dERhdGFWYWxpZCA9PSBPTVhfVFJVRSkgeworICAgICAgICBTRUNfT01YX0JBU0VQT1JUICpwU0VDSW5wdXRQb3J0ID0gJnBTRUNDb21wb25lbnQtPnBTRUNQb3J0W0lOUFVUX1BPUlRfSU5ERVhdOworICAgICAgICBTRUNfT01YX0JBU0VQT1JUICpwU0VDT3V0cHV0UG9ydCA9ICZwU0VDQ29tcG9uZW50LT5wU0VDUG9ydFtPVVRQVVRfUE9SVF9JTkRFWF07CisgICAgICAgIHZvaWQgKnBPdXRwdXRCdWYgPSAodm9pZCAqKXBPdXRwdXREYXRhLT5kYXRhQnVmZmVyOworICAgICAgICB2b2lkICpwU3JjQnVmWzNdID0ge05VTEwsIH07CisgICAgICAgIHZvaWQgKnBZVVZCdWZbM10gPSB7TlVMTCwgfTsKKyAgICAgICAgdW5zaWduZWQgaW50IGNzY19zcmNfY29sb3JfZm9ybWF0LCBjc2NfZHN0X2NvbG9yX2Zvcm1hdDsKKyAgICAgICAgQ1NDX01FVEhPRCBjc2NfbWV0aG9kID0gQ1NDX01FVEhPRF9TVzsKKyAgICAgICAgdW5zaWduZWQgaW50IGNhY2hlYWJsZSA9IDE7CisKKyAgICAgICAgaW50IGZyYW1lU2l6ZSA9IGJ1ZldpZHRoICogYnVmSGVpZ2h0OworICAgICAgICBpbnQgd2lkdGggPSBvdXRwdXRJbmZvLmltZ193aWR0aDsKKyAgICAgICAgaW50IGhlaWdodCA9IG91dHB1dEluZm8uaW1nX2hlaWdodDsKKyAgICAgICAgaW50IGltYWdlU2l6ZSA9IG91dHB1dEluZm8uaW1nX3dpZHRoICogb3V0cHV0SW5mby5pbWdfaGVpZ2h0OworCisgICAgICAgIHBTcmNCdWZbMF0gPSBvdXRwdXRJbmZvLllWaXJBZGRyOworICAgICAgICBwU3JjQnVmWzFdID0gb3V0cHV0SW5mby5DVmlyQWRkcjsKKworICAgICAgICBwWVVWQnVmWzBdICA9ICh1bnNpZ25lZCBjaGFyICopcE91dHB1dEJ1ZjsKKyAgICAgICAgcFlVVkJ1ZlsxXSAgPSAodW5zaWduZWQgY2hhciAqKXBPdXRwdXRCdWYgKyBpbWFnZVNpemU7CisgICAgICAgIHBZVVZCdWZbMl0gID0gKHVuc2lnbmVkIGNoYXIgKilwT3V0cHV0QnVmICsgaW1hZ2VTaXplICsgaW1hZ2VTaXplIC8gNDsKKyAgICAgICAgcE91dHB1dERhdGEtPmRhdGFMZW4gPSAoaW1hZ2VTaXplICogMykgLyAyOworCisjaWZkZWYgVVNFX0FOQgorICAgICAgICBpZiAocFNFQ091dHB1dFBvcnQtPmJJc0FOQkVuYWJsZWQgPT0gT01YX1RSVUUpIHsKKyAgICAgICAgICAgIE9NWF9VMzIgc3RyaWRlOworICAgICAgICAgICAgU0VDX09TQUxfTG9ja0FOQihwT3V0cHV0RGF0YS0+ZGF0YUJ1ZmZlciwgd2lkdGgsIGhlaWdodCwgcFNFQ0NvbXBvbmVudC0+cFNFQ1BvcnRbT1VUUFVUX1BPUlRfSU5ERVhdLnBvcnREZWZpbml0aW9uLmZvcm1hdC52aWRlby5lQ29sb3JGb3JtYXQsICZzdHJpZGUsIHBZVVZCdWYpOworICAgICAgICAgICAgd2lkdGggPSBzdHJpZGU7CisgICAgICAgICAgICBwT3V0cHV0RGF0YS0+ZGF0YUxlbiA9IHNpemVvZih2b2lkICopOworICAgICAgICB9CisjZW5kaWYKKyAgICAgICAgaWYgKChwVmlkZW9EZWMtPmJUaHVtYm5haWxNb2RlID09IE9NWF9GQUxTRSkgJiYKKyAgICAgICAgICAgIChwU0VDT3V0cHV0UG9ydC0+cG9ydERlZmluaXRpb24uZm9ybWF0LnZpZGVvLmVDb2xvckZvcm1hdCA9PSBPTVhfU0VDX0NPTE9SX0Zvcm1hdE5WMTJUUGh5c2ljYWxBZGRyZXNzKSkgeworICAgICAgICAgICAgLyogaWYgdXNlIFBvc3QgY29weSBhZGRyZXNzIHN0cnVjdHVyZSAqLworICAgICAgICAgICAgU0VDX09TQUxfTWVtY3B5KHBZVVZCdWZbMF0sICYob3V0cHV0SW5mby5ZUGh5QWRkciksIHNpemVvZihvdXRwdXRJbmZvLllQaHlBZGRyKSk7CisgICAgICAgICAgICBTRUNfT1NBTF9NZW1jcHkoKHVuc2lnbmVkIGNoYXIgKilwWVVWQnVmWzBdICsgKHNpemVvZih2b2lkICopICogMSksICYob3V0cHV0SW5mby5DUGh5QWRkciksIHNpemVvZihvdXRwdXRJbmZvLkNQaHlBZGRyKSk7CisgICAgICAgICAgICBTRUNfT1NBTF9NZW1jcHkoKHVuc2lnbmVkIGNoYXIgKilwWVVWQnVmWzBdICsgKHNpemVvZih2b2lkICopICogMiksICYob3V0cHV0SW5mby5ZVmlyQWRkciksIHNpemVvZihvdXRwdXRJbmZvLllWaXJBZGRyKSk7CisgICAgICAgICAgICBTRUNfT1NBTF9NZW1jcHkoKHVuc2lnbmVkIGNoYXIgKilwWVVWQnVmWzBdICsgKHNpemVvZih2b2lkICopICogMyksICYob3V0cHV0SW5mby5DVmlyQWRkciksIHNpemVvZihvdXRwdXRJbmZvLkNWaXJBZGRyKSk7CisgICAgICAgICAgICBwT3V0cHV0RGF0YS0+ZGF0YUxlbiA9IChvdXRwdXRJbmZvLmltZ193aWR0aCAqIG91dHB1dEluZm8uaW1nX2hlaWdodCAqIDMpIC8gMjsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIFNFQ19PU0FMX0xvZyhTRUNfTE9HX1RSQUNFLCAiWVVWNDIwIG91dCBmb3IgVGh1bWJuYWlsTW9kZSIpOworI2lmZGVmIENPTkZJR19NRkNfRlBTCisgICAgICAgICAgICBTRUNfT1NBTF9QZXJmU3RhcnQoUEVSRl9JRF9DU0MpOworI2VuZGlmCisgICAgICAgICAgICBzd2l0Y2ggKHBTRUNDb21wb25lbnQtPnBTRUNQb3J0W09VVFBVVF9QT1JUX0lOREVYXS5wb3J0RGVmaW5pdGlvbi5mb3JtYXQudmlkZW8uZUNvbG9yRm9ybWF0KSB7CisgICAgICAgICAgICBjYXNlIE9NWF9TRUNfQ09MT1JfRm9ybWF0TlYxMlRpbGVkOgorICAgICAgICAgICAgICAgIFNFQ19PU0FMX01lbWNweShwT3V0cHV0QnVmLCBvdXRwdXRJbmZvLllWaXJBZGRyLCBGcmFtZUJ1ZmZlcllTaXplKTsKKyAgICAgICAgICAgICAgICBTRUNfT1NBTF9NZW1jcHkoKHVuc2lnbmVkIGNoYXIgKilwT3V0cHV0QnVmICsgRnJhbWVCdWZmZXJZU2l6ZSwgb3V0cHV0SW5mby5DVmlyQWRkciwgRnJhbWVCdWZmZXJVVlNpemUpOworICAgICAgICAgICAgICAgIHBPdXRwdXREYXRhLT5kYXRhTGVuID0gRnJhbWVCdWZmZXJZU2l6ZSArIEZyYW1lQnVmZmVyVVZTaXplOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBPTVhfQ09MT1JfRm9ybWF0WVVWNDIwU2VtaVBsYW5hcjoKKyAgICAgICAgICAgIGNhc2UgT01YX1NFQ19DT0xPUl9Gb3JtYXRBTkJZVVY0MjBTZW1pUGxhbmFyOgorICAgICAgICAgICAgICAgIGNzY19zcmNfY29sb3JfZm9ybWF0ID0gb214XzJfaGFsX3BpeGVsX2Zvcm1hdCgodW5zaWduZWQgaW50KU9NWF9TRUNfQ09MT1JfRm9ybWF0TlYxMlRpbGVkKTsKKyAgICAgICAgICAgICAgICBjc2NfZHN0X2NvbG9yX2Zvcm1hdCA9IG9teF8yX2hhbF9waXhlbF9mb3JtYXQoKHVuc2lnbmVkIGludClPTVhfQ09MT1JfRm9ybWF0WVVWNDIwU2VtaVBsYW5hcik7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIE9NWF9DT0xPUl9Gb3JtYXRZVVY0MjBQbGFuYXI6CisgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgIGNzY19zcmNfY29sb3JfZm9ybWF0ID0gb214XzJfaGFsX3BpeGVsX2Zvcm1hdCgodW5zaWduZWQgaW50KU9NWF9TRUNfQ09MT1JfRm9ybWF0TlYxMlRpbGVkKTsKKyAgICAgICAgICAgICAgICBjc2NfZHN0X2NvbG9yX2Zvcm1hdCA9IG9teF8yX2hhbF9waXhlbF9mb3JtYXQoKHVuc2lnbmVkIGludClPTVhfQ09MT1JfRm9ybWF0WVVWNDIwUGxhbmFyKTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgY3NjX2dldF9tZXRob2QocFZpZGVvRGVjLT5jc2NfaGFuZGxlLCAmY3NjX21ldGhvZCk7CisjaWZkZWYgVVNFX0NTQ19GSU1DCisgICAgICAgICAgICBpZiAoKHBTRUNPdXRwdXRQb3J0LT5iSXNBTkJFbmFibGVkID09IE9NWF9UUlVFKSAmJiAoY3NjX21ldGhvZCA9PSBDU0NfTUVUSE9EX0hXKSkgeworICAgICAgICAgICAgICAgIFNFQ19PU0FMX0dldFBoeXNBTkIocE91dHB1dERhdGEtPmRhdGFCdWZmZXIsIHBZVVZCdWYpOworICAgICAgICAgICAgICAgIHBTcmNCdWZbMF0gPSBvdXRwdXRJbmZvLllQaHlBZGRyOworICAgICAgICAgICAgICAgIHBTcmNCdWZbMV0gPSBvdXRwdXRJbmZvLkNQaHlBZGRyOworICAgICAgICAgICAgfQorI2VuZGlmCisgICAgICAgICAgICBpZiAocFZpZGVvRGVjLT5jc2Nfc2V0X2Zvcm1hdCA9PSBPTVhfRkFMU0UpIHsKKyAgICAgICAgICAgICAgICBjc2Nfc2V0X3NyY19mb3JtYXQoCisgICAgICAgICAgICAgICAgICAgIHBWaWRlb0RlYy0+Y3NjX2hhbmRsZSwgIC8qIGhhbmRsZSAqLworICAgICAgICAgICAgICAgICAgICB3aWR0aCwgICAgICAgICAgICAgICAgICAvKiB3aWR0aCAqLworICAgICAgICAgICAgICAgICAgICBoZWlnaHQsICAgICAgICAgICAgICAgICAvKiBoZWlnaHQgKi8KKyAgICAgICAgICAgICAgICAgICAgMCwgICAgICAgICAgICAgICAgICAgICAgLyogY3JvcF9sZWZ0ICovCisgICAgICAgICAgICAgICAgICAgIDAsICAgICAgICAgICAgICAgICAgICAgIC8qIGNyb3BfcmlnaHQgKi8KKyAgICAgICAgICAgICAgICAgICAgd2lkdGgsICAgICAgICAgICAgICAgICAgLyogY3JvcF93aWR0aCAqLworICAgICAgICAgICAgICAgICAgICBoZWlnaHQsICAgICAgICAgICAgICAgICAvKiBjcm9wX2hlaWdodCAqLworICAgICAgICAgICAgICAgICAgICBjc2Nfc3JjX2NvbG9yX2Zvcm1hdCwgICAvKiBjb2xvcl9mb3JtYXQgKi8KKyAgICAgICAgICAgICAgICAgICAgY2FjaGVhYmxlKTsgICAgICAgICAgICAgLyogY2FjaGVhYmxlICovCisgICAgICAgICAgICAgICAgY3NjX3NldF9kc3RfZm9ybWF0KAorICAgICAgICAgICAgICAgICAgICBwVmlkZW9EZWMtPmNzY19oYW5kbGUsICAvKiBoYW5kbGUgKi8KKyAgICAgICAgICAgICAgICAgICAgd2lkdGgsICAgICAgICAgICAgICAgICAgLyogd2lkdGggKi8KKyAgICAgICAgICAgICAgICAgICAgaGVpZ2h0LCAgICAgICAgICAgICAgICAgLyogaGVpZ2h0ICovCisgICAgICAgICAgICAgICAgICAgIDAsICAgICAgICAgICAgICAgICAgICAgIC8qIGNyb3BfbGVmdCAqLworICAgICAgICAgICAgICAgICAgICAwLCAgICAgICAgICAgICAgICAgICAgICAvKiBjcm9wX3JpZ2h0ICovCisgICAgICAgICAgICAgICAgICAgIHdpZHRoLCAgICAgICAgICAgICAgICAgIC8qIGNyb3Bfd2lkdGggKi8KKyAgICAgICAgICAgICAgICAgICAgaGVpZ2h0LCAgICAgICAgICAgICAgICAgLyogY3JvcF9oZWlnaHQgKi8KKyAgICAgICAgICAgICAgICAgICAgY3NjX2RzdF9jb2xvcl9mb3JtYXQsICAgLyogY29sb3JfZm9ybWF0ICovCisgICAgICAgICAgICAgICAgICAgIGNhY2hlYWJsZSk7ICAgICAgICAgICAgIC8qIGNhY2hlYWJsZSAqLworICAgICAgICAgICAgICAgIHBWaWRlb0RlYy0+Y3NjX3NldF9mb3JtYXQgPSBPTVhfVFJVRTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGNzY19zZXRfc3JjX2J1ZmZlcigKKyAgICAgICAgICAgICAgICBwVmlkZW9EZWMtPmNzY19oYW5kbGUsICAvKiBoYW5kbGUgKi8KKyAgICAgICAgICAgICAgICBwU3JjQnVmWzBdLCAgICAgICAgICAgICAvKiB5IGFkZHIgKi8KKyAgICAgICAgICAgICAgICBwU3JjQnVmWzFdLCAgICAgICAgICAgICAvKiB1IGFkZHIgb3IgdXYgYWRkciAqLworICAgICAgICAgICAgICAgIHBTcmNCdWZbMl0sICAgICAgICAgICAgIC8qIHYgYWRkciBvciBub25lICovCisgICAgICAgICAgICAgICAgMCk7ICAgICAgICAgICAgICAgICAgICAgLyogaW9uIGZkICovCisgICAgICAgICAgICBjc2Nfc2V0X2RzdF9idWZmZXIoCisgICAgICAgICAgICAgICAgcFZpZGVvRGVjLT5jc2NfaGFuZGxlLAorICAgICAgICAgICAgICAgIHBZVVZCdWZbMF0sICAgICAgICAgICAgIC8qIHkgYWRkciAqLworICAgICAgICAgICAgICAgIHBZVVZCdWZbMV0sICAgICAgICAgICAgIC8qIHUgYWRkciBvciB1diBhZGRyICovCisgICAgICAgICAgICAgICAgcFlVVkJ1ZlsyXSwgICAgICAgICAgICAgLyogdiBhZGRyIG9yIG5vbmUgKi8KKyAgICAgICAgICAgICAgICAwKTsgICAgICAgICAgICAgICAgICAgICAvKiBpb24gZmQgKi8KKyAgICAgICAgICAgIGNzY19jb252ZXJ0KHBWaWRlb0RlYy0+Y3NjX2hhbmRsZSk7CisKKyNpZmRlZiBDT05GSUdfTUZDX0ZQUworICAgICAgICAgICAgU0VDX09TQUxfUGVyZlN0b3AoUEVSRl9JRF9DU0MpOworI2VuZGlmCisgICAgICAgIH0KKyNpZmRlZiBVU0VfQU5CCisgICAgICAgIGlmIChwU0VDT3V0cHV0UG9ydC0+YklzQU5CRW5hYmxlZCA9PSBPTVhfVFJVRSkgeworICAgICAgICAgICAgU0VDX09TQUxfVW5sb2NrQU5CKHBPdXRwdXREYXRhLT5kYXRhQnVmZmVyKTsKKyAgICAgICAgfQorI2VuZGlmCisgICAgfSBlbHNlIHsKKyAgICAgICAgcE91dHB1dERhdGEtPmRhdGFMZW4gPSAwOworICAgIH0KKworRVhJVDoKKyAgICBGdW5jdGlvbk91dCgpOworCisgICAgcmV0dXJuIHJldDsKK30KKworT01YX0VSUk9SVFlQRSBTRUNfTUZDX1dtdl9EZWNvZGVfQmxvY2soT01YX0NPTVBPTkVOVFRZUEUgKnBPTVhDb21wb25lbnQsIFNFQ19PTVhfREFUQSAqcElucHV0RGF0YSwgU0VDX09NWF9EQVRBICpwT3V0cHV0RGF0YSkKK3sKKyAgICBPTVhfRVJST1JUWVBFICAgICAgICAgICAgICAgcmV0ID0gT01YX0Vycm9yTm9uZTsKKyAgICBTRUNfT01YX0JBU0VDT01QT05FTlQgICAgICAqcFNFQ0NvbXBvbmVudCA9IChTRUNfT01YX0JBU0VDT01QT05FTlQgKilwT01YQ29tcG9uZW50LT5wQ29tcG9uZW50UHJpdmF0ZTsKKyAgICBTRUNfT01YX1ZJREVPREVDX0NPTVBPTkVOVCAqcFZpZGVvRGVjID0gKFNFQ19PTVhfVklERU9ERUNfQ09NUE9ORU5UICopcFNFQ0NvbXBvbmVudC0+aENvbXBvbmVudEhhbmRsZTsKKyAgICBTRUNfT01YX0JBU0VQT1JUICAgICAgICAgICAqcFNFQ0lucHV0UG9ydCA9ICZwU0VDQ29tcG9uZW50LT5wU0VDUG9ydFtJTlBVVF9QT1JUX0lOREVYXTsKKyAgICBTRUNfT01YX0JBU0VQT1JUICAgICAgICAgICAqcFNFQ091dHB1dFBvcnQgPSAmcFNFQ0NvbXBvbmVudC0+cFNFQ1BvcnRbT1VUUFVUX1BPUlRfSU5ERVhdOworICAgIFNFQ19XTVZfSEFORExFICAgICAgICAgICAgICpwV212RGVjID0gKFNFQ19XTVZfSEFORExFICopKChTRUNfT01YX1ZJREVPREVDX0NPTVBPTkVOVCAqKXBTRUNDb21wb25lbnQtPmhDb21wb25lbnRIYW5kbGUpLT5oQ29kZWNIYW5kbGU7CisgICAgT01YX1UzMiAgICAgICAgICAgICAgICAgICAgIG9uZUZyYW1lU2l6ZSA9IHBJbnB1dERhdGEtPmRhdGFMZW47CisgICAgU1NCU0lQX01GQ19ERUNfT1VUUFVUX0lORk8gIG91dHB1dEluZm87CisgICAgT01YX1MzMiAgICAgICAgICAgICAgICAgICAgIGNvbmZpZ1ZhbHVlID0gMDsKKyAgICBPTVhfUzMyICAgICAgICAgICAgICAgICAgICAgcmV0dXJuQ29kZWMgPSAwOworICAgIE9NWF9CT09MICAgICAgICAgICAgICAgICAgICBiTWV0YURhdGEgPSBPTVhfRkFMU0U7CisgICAgT01YX0JPT0wgICAgICAgICAgICAgICAgICAgIGJTdGFydENvZGUgPSBPTVhfRkFMU0U7CisgICAgaW50ICAgICAgICAgICAgICAgICAgICAgICAgIGJ1ZldpZHRoID0gMDsKKyAgICBpbnQgICAgICAgICAgICAgICAgICAgICAgICAgYnVmSGVpZ2h0ID0gMDsKKyAgICBPTVhfVTMyICAgICAgICAgICAgICAgICAgICAgRnJhbWVCdWZmZXJZU2l6ZTsKKyAgICBPTVhfVTMyICAgICAgICAgICAgICAgICAgICAgRnJhbWVCdWZmZXJVVlNpemU7CisKKyAgICBGdW5jdGlvbkluKCk7CisKKyAgICBpZiAocFdtdkRlYy0+aE1GQ1dtdkhhbmRsZS5iQ29uZmlndXJlZE1GQyA9PSBPTVhfRkFMU0UpIHsKKyAgICAgICAgU1NCU0lQX01GQ19DT0RFQ19UWVBFIE1GQ0NvZGVjVHlwZTsKKworICAgICAgICBpZiAoKG9uZUZyYW1lU2l6ZSA8PSAwKSAmJiAocElucHV0RGF0YS0+bkZsYWdzICYgT01YX0JVRkZFUkZMQUdfRU9TKSkgeworICAgICAgICAgICAgcE91dHB1dERhdGEtPnRpbWVTdGFtcCA9IHBJbnB1dERhdGEtPnRpbWVTdGFtcDsKKyAgICAgICAgICAgIHBPdXRwdXREYXRhLT5uRmxhZ3MgPSBwSW5wdXREYXRhLT5uRmxhZ3M7CisgICAgICAgICAgICByZXQgPSBPTVhfRXJyb3JOb25lOworICAgICAgICAgICAgZ290byBFWElUOworICAgICAgICB9CisKKyAgICAgICAgaWYgKHBXbXZEZWMtPmhNRkNXbXZIYW5kbGUud212Rm9ybWF0ID09IFdNVl9GT1JNQVRfV01WMykKKyAgICAgICAgICAgIE1GQ0NvZGVjVHlwZSA9IFZDMVJDVl9ERUM7CisgICAgICAgIGVsc2UgaWYgKHBXbXZEZWMtPmhNRkNXbXZIYW5kbGUud212Rm9ybWF0ID09IFdNVl9GT1JNQVRfVkMxKQorICAgICAgICAgICAgTUZDQ29kZWNUeXBlID0gVkMxX0RFQzsKKyAgICAgICAgZWxzZQorICAgICAgICAgICAgTUZDQ29kZWNUeXBlID0gVU5LTk9XTl9UWVBFOworCisgICAgICAgIFNFQ19PU0FMX0xvZyhTRUNfTE9HX1RSQUNFLCAiY29kZWMgdHlwZSA9ICVkIiwgTUZDQ29kZWNUeXBlKTsKKworICAgICAgICBpZiAocFZpZGVvRGVjLT5iVGh1bWJuYWlsTW9kZSA9PSBPTVhfVFJVRSkgeworICAgICAgICAgICAgY29uZmlnVmFsdWUgPSAwOyAgICAvLyB0aGUgbnVtYmVyIHRoYXQgeW91IHdhbnQgdG8gZGVsYXkKKyAgICAgICAgICAgIFNzYlNpcE1mY0RlY1NldENvbmZpZyhwV212RGVjLT5oTUZDV212SGFuZGxlLmhNRkNIYW5kbGUsIE1GQ19ERUNfU0VUQ09ORl9ESVNQTEFZX0RFTEFZLCAmY29uZmlnVmFsdWUpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgY29uZmlnVmFsdWUgPSBXTVZfREVDX05VTV9PRl9FWFRSQV9CVUZGRVJTOworICAgICAgICAgICAgU3NiU2lwTWZjRGVjU2V0Q29uZmlnKHBXbXZEZWMtPmhNRkNXbXZIYW5kbGUuaE1GQ0hhbmRsZSwgTUZDX0RFQ19TRVRDT05GX0VYVFJBX0JVRkZFUl9OVU0sICZjb25maWdWYWx1ZSk7CisgICAgICAgIH0KKworICAgICAgICBiTWV0YURhdGEgPSBNYWtlX1N0cmVhbV9NZXRhRGF0YShwSW5wdXREYXRhLT5kYXRhQnVmZmVyLCAmb25lRnJhbWVTaXplLCBwV212RGVjLT5oTUZDV212SGFuZGxlLndtdkZvcm1hdCk7CisgICAgICAgIGlmIChiTWV0YURhdGEgPT0gT01YX0ZBTFNFKSB7CisgICAgICAgICAgICBTRUNfT1NBTF9Mb2coU0VDX0xPR19FUlJPUiwgIkZhaWwgdG8gTWFrZSBTdHJlYW0gTWV0YURhdGEiKTsKKyAgICAgICAgICAgIHJldCA9IE9NWF9FcnJvck1GQ0luaXQ7CisgICAgICAgICAgICBnb3RvIEVYSVQ7CisgICAgICAgIH0KKworICAgICAgICByZXR1cm5Db2RlYyA9IFNzYlNpcE1mY0RlY0luaXQocFdtdkRlYy0+aE1GQ1dtdkhhbmRsZS5oTUZDSGFuZGxlLCBNRkNDb2RlY1R5cGUsIG9uZUZyYW1lU2l6ZSk7CisgICAgICAgIGlmIChyZXR1cm5Db2RlYyA9PSBNRkNfUkVUX09LKSB7CisgICAgICAgICAgICBTU0JTSVBfTUZDX0lNR19SRVNPTFVUSU9OIGltZ1Jlc29sOworCisgICAgICAgICAgICBpZiAoU3NiU2lwTWZjRGVjR2V0Q29uZmlnKHBXbXZEZWMtPmhNRkNXbXZIYW5kbGUuaE1GQ0hhbmRsZSwgTUZDX0RFQ19HRVRDT05GX0JVRl9XSURUSF9IRUlHSFQsICZpbWdSZXNvbCkgIT0gTUZDX1JFVF9PSykgeworICAgICAgICAgICAgICAgIHJldCA9IE9NWF9FcnJvck1GQ0luaXQ7CisgICAgICAgICAgICAgICAgU0VDX09TQUxfTG9nKFNFQ19MT0dfRVJST1IsICJTc2JTaXBNZmNEZWNHZXRDb25maWcgZmFpbGVkIik7CisgICAgICAgICAgICAgICAgZ290byBFWElUOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBTRUNfT1NBTF9Mb2coU0VDX0xPR19UUkFDRSwgIiMjIG5GcmFtZVdpZHRoKCVkKSBuRnJhbWVIZWlnaHQoJWQpLCBuU3RyaWRlKCVkKSwgblNsaWNlSGVpZ2h0KCVkKSIsCisgICAgICAgICAgICAgICAgcFNFQ0lucHV0UG9ydC0+cG9ydERlZmluaXRpb24uZm9ybWF0LnZpZGVvLm5GcmFtZVdpZHRoLCBwU0VDSW5wdXRQb3J0LT5wb3J0RGVmaW5pdGlvbi5mb3JtYXQudmlkZW8ubkZyYW1lSGVpZ2h0LAorICAgICAgICAgICAgICAgIHBTRUNJbnB1dFBvcnQtPnBvcnREZWZpbml0aW9uLmZvcm1hdC52aWRlby5uU3RyaWRlLCBwU0VDSW5wdXRQb3J0LT5wb3J0RGVmaW5pdGlvbi5mb3JtYXQudmlkZW8ublNsaWNlSGVpZ2h0KTsKKworICAgICAgICAgICAgLyoqIFVwZGF0ZSBGcmFtZSBTaXplICoqLworICAgICAgICAgICAgaWYgKChwU0VDSW5wdXRQb3J0LT5wb3J0RGVmaW5pdGlvbi5mb3JtYXQudmlkZW8ubkZyYW1lV2lkdGggIT0gKHVuc2lnbmVkIGludClpbWdSZXNvbC53aWR0aCkgfHwKKyAgICAgICAgICAgICAgIChwU0VDSW5wdXRQb3J0LT5wb3J0RGVmaW5pdGlvbi5mb3JtYXQudmlkZW8ubkZyYW1lSGVpZ2h0ICE9ICh1bnNpZ25lZCBpbnQpaW1nUmVzb2wuaGVpZ2h0KSkgeworICAgICAgICAgICAgICAgIC8qIGNoYW5nZSB3aWR0aCBhbmQgaGVpZ2h0IGluZm9ybWF0aW9uICovCisgICAgICAgICAgICAgICAgcFNFQ0lucHV0UG9ydC0+cG9ydERlZmluaXRpb24uZm9ybWF0LnZpZGVvLm5GcmFtZVdpZHRoID0gaW1nUmVzb2wud2lkdGg7CisgICAgICAgICAgICAgICAgcFNFQ0lucHV0UG9ydC0+cG9ydERlZmluaXRpb24uZm9ybWF0LnZpZGVvLm5GcmFtZUhlaWdodCA9IGltZ1Jlc29sLmhlaWdodDsKKyAgICAgICAgICAgICAgICBwU0VDSW5wdXRQb3J0LT5wb3J0RGVmaW5pdGlvbi5mb3JtYXQudmlkZW8ublN0cmlkZSAgICAgID0gKChpbWdSZXNvbC53aWR0aCArIDE1KSAmICh+MTUpKTsKKyAgICAgICAgICAgICAgICBwU0VDSW5wdXRQb3J0LT5wb3J0RGVmaW5pdGlvbi5mb3JtYXQudmlkZW8ublNsaWNlSGVpZ2h0ID0gKChpbWdSZXNvbC5oZWlnaHQgKyAxNSkgJiAofjE1KSk7CisKKyAgICAgICAgICAgICAgICBTRUNfT1NBTF9Mb2coU0VDX0xPR19UUkFDRSwgIm5GcmFtZVdpZHRoKCVkKSBuRnJhbWVIZWlnaHQoJWQpLCBuU3RyaWRlKCVkKSwgblNsaWNlSGVpZ2h0KCVkKSIsCisgICAgICAgICAgICAgICAgICAgIHBTRUNJbnB1dFBvcnQtPnBvcnREZWZpbml0aW9uLmZvcm1hdC52aWRlby5uRnJhbWVXaWR0aCwgcFNFQ0lucHV0UG9ydC0+cG9ydERlZmluaXRpb24uZm9ybWF0LnZpZGVvLm5GcmFtZUhlaWdodCwKKyAgICAgICAgICAgICAgICAgICAgcFNFQ0lucHV0UG9ydC0+cG9ydERlZmluaXRpb24uZm9ybWF0LnZpZGVvLm5TdHJpZGUsIHBTRUNJbnB1dFBvcnQtPnBvcnREZWZpbml0aW9uLmZvcm1hdC52aWRlby5uU2xpY2VIZWlnaHQpOworCisgICAgICAgICAgICAgICAgU0VDX1VwZGF0ZUZyYW1lU2l6ZShwT01YQ29tcG9uZW50KTsKKworICAgICAgICAgICAgICAgIC8qIFNlbmQgUG9ydCBTZXR0aW5ncyBjaGFuZ2VkIGNhbGwgYmFjayAqLworICAgICAgICAgICAgICAgICgqKHBTRUNDb21wb25lbnQtPnBDYWxsYmFja3MtPkV2ZW50SGFuZGxlcikpCisgICAgICAgICAgICAgICAgICAgICAgKHBPTVhDb21wb25lbnQsCisgICAgICAgICAgICAgICAgICAgICAgIHBTRUNDb21wb25lbnQtPmNhbGxiYWNrRGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgT01YX0V2ZW50UG9ydFNldHRpbmdzQ2hhbmdlZCwgLy8gVGhlIGNvbW1hbmQgd2FzIGNvbXBsZXRlZAorICAgICAgICAgICAgICAgICAgICAgICBPTVhfRGlyT3V0cHV0LCAvLyBUaGlzIGlzIHRoZSBwb3J0IGluZGV4CisgICAgICAgICAgICAgICAgICAgICAgIDAsCisgICAgICAgICAgICAgICAgICAgICAgIE5VTEwpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBwV212RGVjLT5oTUZDV212SGFuZGxlLmJDb25maWd1cmVkTUZDID0gT01YX1RSVUU7CisKKyAgICAgICAgICAgIGlmIChwV212RGVjLT5oTUZDV212SGFuZGxlLndtdkZvcm1hdCA9PSBXTVZfRk9STUFUX1dNVjMpIHsKKyAgICAgICAgICAgICAgICBwT3V0cHV0RGF0YS0+dGltZVN0YW1wID0gcElucHV0RGF0YS0+dGltZVN0YW1wOworICAgICAgICAgICAgICAgIHBPdXRwdXREYXRhLT5uRmxhZ3MgPSBwSW5wdXREYXRhLT5uRmxhZ3M7CisgICAgICAgICAgICAgICAgcmV0ID0gT01YX0Vycm9yTm9uZTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisKKyNpZmRlZiBXT19TVEFSVF9DT0RFCisvKiBBU0YgcGFyc2VyIGRvZXMgbm90IHNlbmQgc3RhcnQgY29kZSBvbiBPcGVuQ09SRSAqLworICAgICAgICAgICAgICAgIHBPdXRwdXREYXRhLT50aW1lU3RhbXAgPSBwSW5wdXREYXRhLT50aW1lU3RhbXA7CisgICAgICAgICAgICAgICAgcE91dHB1dERhdGEtPm5GbGFncyA9IHBJbnB1dERhdGEtPm5GbGFnczsKKyAgICAgICAgICAgICAgICByZXQgPSBPTVhfRXJyb3JOb25lOworI2Vsc2UKKy8qIFRPRE8gOiBmb3IgY29tZm9ybWFuYyB0ZXN0IGJhc2VkIG9uIGNvbW1vbiBidWZmZXIgc2NoZW1lIHcvbyBwYXJzZXIgKi8KKyAgICAgICAgICAgICAgICBwT3V0cHV0RGF0YS0+ZGF0YUxlbiA9IDA7CisgICAgICAgICAgICAgICAgcmV0ID0gT01YX0Vycm9ySW5wdXREYXRhRGVjb2RlWWV0OworI2VuZGlmCisgICAgICAgICAgICB9CisgICAgICAgICAgICBnb3RvIEVYSVQ7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBTRUNfT1NBTF9Mb2coU0VDX0xPR19FUlJPUiwgIlNzYlNpcE1mY0RlY0luaXQgZmFpbGVkIik7CisgICAgICAgICAgICByZXQgPSBPTVhfRXJyb3JNRkNJbml0OyAgICAvKiBPTVhfRXJyb3JVbmRlZmluZWQgKi8KKyAgICAgICAgICAgIGdvdG8gRVhJVDsKKyAgICAgICAgfQorICAgIH0KKworI2lmbmRlZiBGVUxMX0ZSQU1FX1NFQVJDSAorICAgIGlmICgocElucHV0RGF0YS0+bkZsYWdzICYgT01YX0JVRkZFUkZMQUdfRU5ET0ZGUkFNRSkgJiYKKyAgICAgICAgKHBTRUNDb21wb25lbnQtPmJVc2VGbGFnRU9GID09IE9NWF9GQUxTRSkpCisgICAgICAgIHBTRUNDb21wb25lbnQtPmJVc2VGbGFnRU9GID0gT01YX1RSVUU7CisjZW5kaWYKKworI2lmZGVmIFdPX1NUQVJUX0NPREUKKyAgICBpZiAocElucHV0RGF0YS0+YWxsb2NTaXplIDwgb25lRnJhbWVTaXplKzQpIHsKKyAgICAgICAgU0VDX09TQUxfTG9nKFNFQ19MT0dfRVJST1IsICJDYW4ndCBhdHRhY2ggc3RhcnRjb2RlIGR1ZSB0byBsYWNrIG9mIGJ1ZmZlciBzcGFjZSIpOworICAgICAgICByZXQgPSBPTVhfRXJyb3JNRkNJbml0OworICAgICAgICBnb3RvIEVYSVQ7CisgICAgfQorCisgICAgYlN0YXJ0Q29kZSA9IE1ha2VfU3RyZWFtX1N0YXJ0Q29kZShwSW5wdXREYXRhLT5kYXRhQnVmZmVyLCBvbmVGcmFtZVNpemUsIHBXbXZEZWMtPmhNRkNXbXZIYW5kbGUud212Rm9ybWF0KTsKKyAgICBpZiAoYlN0YXJ0Q29kZSA9PSBPTVhfRkFMU0UpIHsKKyAgICAgICAgU0VDX09TQUxfTG9nKFNFQ19MT0dfRVJST1IsICJGYWlsIHRvIE1ha2UgU3RyZWFtIFN0YXJ0IENvZGUiKTsKKyAgICAgICAgcmV0ID0gT01YX0Vycm9yTUZDSW5pdDsKKyAgICAgICAgZ290byBFWElUOworICAgIH0KKyNlbmRpZgorCisgICAgU0VDX09TQUxfTG9nKFNFQ19MT0dfVFJBQ0UsICJTc2JTaXBNZmNEZWNFeGUgb25lRnJhbWVTaXplID0gJWQiLCBvbmVGcmFtZVNpemUpOworCisgICAgaWYgKENoZWNrX1N0cmVhbV9QcmVmaXhDb2RlKHBJbnB1dERhdGEtPmRhdGFCdWZmZXIsIHBJbnB1dERhdGEtPmRhdGFMZW4sIHBXbXZEZWMtPmhNRkNXbXZIYW5kbGUud212Rm9ybWF0KSA9PSBPTVhfVFJVRSkgeworICAgICAgICBwU0VDQ29tcG9uZW50LT50aW1lU3RhbXBbcFdtdkRlYy0+aE1GQ1dtdkhhbmRsZS5pbmRleFRpbWVzdGFtcF0gPSBwSW5wdXREYXRhLT50aW1lU3RhbXA7CisgICAgICAgIHBTRUNDb21wb25lbnQtPm5GbGFnc1twV212RGVjLT5oTUZDV212SGFuZGxlLmluZGV4VGltZXN0YW1wXSA9IHBJbnB1dERhdGEtPm5GbGFnczsKKyAgICAgICAgU3NiU2lwTWZjRGVjU2V0Q29uZmlnKHBXbXZEZWMtPmhNRkNXbXZIYW5kbGUuaE1GQ0hhbmRsZSwgTUZDX0RFQ19TRVRDT05GX0ZSQU1FX1RBRywgJihwV212RGVjLT5oTUZDV212SGFuZGxlLmluZGV4VGltZXN0YW1wKSk7CisKKyNpZmRlZiBXT19TVEFSVF9DT0RFCisgICAgICAgIHJldHVybkNvZGVjID0gU3NiU2lwTWZjRGVjRXhlKHBXbXZEZWMtPmhNRkNXbXZIYW5kbGUuaE1GQ0hhbmRsZSwgb25lRnJhbWVTaXplKzQpOyAvKiBGcmFtZSBTdGFydCBDb2RlICovCisjZWxzZQorICAgICAgICByZXR1cm5Db2RlYyA9IFNzYlNpcE1mY0RlY0V4ZShwV212RGVjLT5oTUZDV212SGFuZGxlLmhNRkNIYW5kbGUsIG9uZUZyYW1lU2l6ZSk7CisjZW5kaWYKKyAgICB9IGVsc2UgeworICAgICAgICBpZiAocFNFQ0NvbXBvbmVudC0+Y2hlY2tUaW1lU3RhbXAubmVlZENoZWNrU3RhcnRUaW1lU3RhbXAgPT0gT01YX1RSVUUpCisgICAgICAgICAgICBwU0VDQ29tcG9uZW50LT5jaGVja1RpbWVTdGFtcC5uZWVkU2V0U3RhcnRUaW1lU3RhbXAgPSBPTVhfVFJVRTsKKworICAgICAgICBwT3V0cHV0RGF0YS0+dGltZVN0YW1wID0gcElucHV0RGF0YS0+dGltZVN0YW1wOworICAgICAgICBwT3V0cHV0RGF0YS0+bkZsYWdzID0gcElucHV0RGF0YS0+bkZsYWdzOworICAgICAgICByZXR1cm5Db2RlYyA9IE1GQ19SRVRfT0s7CisgICAgICAgIGdvdG8gRVhJVDsKKyAgICB9CisKKyAgICBpZiAocmV0dXJuQ29kZWMgPT0gTUZDX1JFVF9PSykgeworICAgICAgICBTU0JTSVBfTUZDX0RFQ19PVVRCVUZfU1RBVFVTIHN0YXR1czsKKyAgICAgICAgT01YX1MzMiBpbmRleFRpbWVzdGFtcCA9IDA7CisKKyAgICAgICAgc3RhdHVzID0gU3NiU2lwTWZjRGVjR2V0T3V0QnVmKHBXbXZEZWMtPmhNRkNXbXZIYW5kbGUuaE1GQ0hhbmRsZSwgJm91dHB1dEluZm8pOworICAgICAgICBidWZXaWR0aCA9IChvdXRwdXRJbmZvLmltZ193aWR0aCArIDE1KSAmICh+MTUpOworICAgICAgICBidWZIZWlnaHQgPSAob3V0cHV0SW5mby5pbWdfaGVpZ2h0ICsgMTUpICYgKH4xNSk7CisgICAgICAgIEZyYW1lQnVmZmVyWVNpemUgPSBBTElHTl9UT184S0IoQUxJR05fVE9fMTI4QihvdXRwdXRJbmZvLmltZ193aWR0aCkgKiBBTElHTl9UT18zMkIob3V0cHV0SW5mby5pbWdfaGVpZ2h0KSk7CisgICAgICAgIEZyYW1lQnVmZmVyVVZTaXplID0gQUxJR05fVE9fOEtCKEFMSUdOX1RPXzEyOEIob3V0cHV0SW5mby5pbWdfd2lkdGgpICogQUxJR05fVE9fMzJCKG91dHB1dEluZm8uaW1nX2hlaWdodC8yKSk7CisKKyAgICAgICAgaWYgKHN0YXR1cyAhPSBNRkNfR0VUT1VUQlVGX0RJU1BMQVlfT05MWSkgeworICAgICAgICAgICAgcFdtdkRlYy0+aE1GQ1dtdkhhbmRsZS5pbmRleFRpbWVzdGFtcCsrOworICAgICAgICAgICAgcFdtdkRlYy0+aE1GQ1dtdkhhbmRsZS5pbmRleFRpbWVzdGFtcCAlPSBNQVhfVElNRVNUQU1QOworICAgICAgICB9CisKKyAgICAgICAgaWYgKFNzYlNpcE1mY0RlY0dldENvbmZpZyhwV212RGVjLT5oTUZDV212SGFuZGxlLmhNRkNIYW5kbGUsIE1GQ19ERUNfR0VUQ09ORl9GUkFNRV9UQUcsICZpbmRleFRpbWVzdGFtcCkgIT0gTUZDX1JFVF9PSyB8fAorICAgICAgICAgICAgKCgoaW5kZXhUaW1lc3RhbXAgPCAwKSB8fCAoaW5kZXhUaW1lc3RhbXAgPj0gTUFYX1RJTUVTVEFNUCkpKSkgeworICAgICAgICAgICAgcE91dHB1dERhdGEtPnRpbWVTdGFtcCA9IHBJbnB1dERhdGEtPnRpbWVTdGFtcDsKKyAgICAgICAgICAgIHBPdXRwdXREYXRhLT5uRmxhZ3MgPSBwSW5wdXREYXRhLT5uRmxhZ3M7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAvKiBGb3IgdGltZXN0YW1wIGNvcnJlY3Rpb24uIGlmIG1mYyBzdXBwb3J0IGZyYW1ldHlwZSBkZXRlY3QgKi8KKyAgICAgICAgICAgIFNFQ19PU0FMX0xvZyhTRUNfTE9HX1RSQUNFLCAiZGlzcF9waWNfZnJhbWVfdHlwZTogJWQiLCBvdXRwdXRJbmZvLmRpc3BfcGljX2ZyYW1lX3R5cGUpOworI2lmZGVmIE5FRURfVElNRVNUQU1QX1JFT1JERVIKKyAgICAgICAgICAgIGlmIChvdXRwdXRJbmZvLmRpc3BfcGljX2ZyYW1lX3R5cGUgPT0gTUZDX0ZSQU1FX1RZUEVfSV9GUkFNRSkgeworICAgICAgICAgICAgICAgIHBPdXRwdXREYXRhLT50aW1lU3RhbXAgPSBwU0VDQ29tcG9uZW50LT50aW1lU3RhbXBbaW5kZXhUaW1lc3RhbXBdOworICAgICAgICAgICAgICAgIHBPdXRwdXREYXRhLT5uRmxhZ3MgPSBwU0VDQ29tcG9uZW50LT5uRmxhZ3NbaW5kZXhUaW1lc3RhbXBdOworICAgICAgICAgICAgICAgIHBXbXZEZWMtPmhNRkNXbXZIYW5kbGUub3V0cHV0SW5kZXhUaW1lc3RhbXAgPSBpbmRleFRpbWVzdGFtcDsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgcE91dHB1dERhdGEtPnRpbWVTdGFtcCA9IHBTRUNDb21wb25lbnQtPnRpbWVTdGFtcFtwV212RGVjLT5oTUZDV212SGFuZGxlLm91dHB1dEluZGV4VGltZXN0YW1wXTsKKyAgICAgICAgICAgICAgICBwT3V0cHV0RGF0YS0+bkZsYWdzID0gcFNFQ0NvbXBvbmVudC0+bkZsYWdzW3BXbXZEZWMtPmhNRkNXbXZIYW5kbGUub3V0cHV0SW5kZXhUaW1lc3RhbXBdOworICAgICAgICAgICAgfQorI2Vsc2UKKyAgICAgICAgICAgIHBPdXRwdXREYXRhLT50aW1lU3RhbXAgPSBwU0VDQ29tcG9uZW50LT50aW1lU3RhbXBbaW5kZXhUaW1lc3RhbXBdOworICAgICAgICAgICAgcE91dHB1dERhdGEtPm5GbGFncyA9IHBTRUNDb21wb25lbnQtPm5GbGFnc1tpbmRleFRpbWVzdGFtcF07CisjZW5kaWYKKyAgICAgICAgfQorCisgICAgICAgIGlmICgoc3RhdHVzID09IE1GQ19HRVRPVVRCVUZfRElTUExBWV9ERUNPRElORykgfHwKKyAgICAgICAgICAgIChzdGF0dXMgPT0gTUZDX0dFVE9VVEJVRl9ESVNQTEFZX09OTFkpKSB7CisgICAgICAgICAgICAvKiogRmlsbCBPdXRwdXQgQnVmZmVyICoqLworICAgICAgICAgICAgdm9pZCAqcE91dHB1dEJ1ZiA9ICh2b2lkICopcE91dHB1dERhdGEtPmRhdGFCdWZmZXI7CisgICAgICAgICAgICB2b2lkICpwU3JjQnVmWzNdID0ge05VTEwsIH07CisgICAgICAgICAgICB2b2lkICpwWVVWQnVmWzNdID0ge05VTEwsIH07CisgICAgICAgICAgICB1bnNpZ25lZCBpbnQgY3NjX3NyY19jb2xvcl9mb3JtYXQsIGNzY19kc3RfY29sb3JfZm9ybWF0OworICAgICAgICAgICAgQ1NDX01FVEhPRCBjc2NfbWV0aG9kID0gQ1NDX01FVEhPRF9TVzsKKyAgICAgICAgICAgIHVuc2lnbmVkIGludCBjYWNoZWFibGUgPSAxOworCisgICAgICAgICAgICBpbnQgZnJhbWVTaXplID0gYnVmV2lkdGggKiBidWZIZWlnaHQ7CisgICAgICAgICAgICBpbnQgd2lkdGggPSBvdXRwdXRJbmZvLmltZ193aWR0aDsKKyAgICAgICAgICAgIGludCBoZWlnaHQgPSBvdXRwdXRJbmZvLmltZ19oZWlnaHQ7CisgICAgICAgICAgICBpbnQgaW1hZ2VTaXplID0gb3V0cHV0SW5mby5pbWdfd2lkdGggKiBvdXRwdXRJbmZvLmltZ19oZWlnaHQ7CisKKyAgICAgICAgICAgIHBTcmNCdWZbMF0gPSBvdXRwdXRJbmZvLllWaXJBZGRyOworICAgICAgICAgICAgcFNyY0J1ZlsxXSA9IG91dHB1dEluZm8uQ1ZpckFkZHI7CisKKyAgICAgICAgICAgIHBZVVZCdWZbMF0gID0gKHVuc2lnbmVkIGNoYXIgKilwT3V0cHV0QnVmOworICAgICAgICAgICAgcFlVVkJ1ZlsxXSAgPSAodW5zaWduZWQgY2hhciAqKXBPdXRwdXRCdWYgKyBpbWFnZVNpemU7CisgICAgICAgICAgICBwWVVWQnVmWzJdICA9ICh1bnNpZ25lZCBjaGFyICopcE91dHB1dEJ1ZiArIGltYWdlU2l6ZSArIGltYWdlU2l6ZSAvIDQ7CisgICAgICAgICAgICBwT3V0cHV0RGF0YS0+ZGF0YUxlbiA9IChpbWFnZVNpemUgKiAzKSAvIDI7CisKKyNpZmRlZiBVU0VfQU5CCisgICAgICAgICAgICBpZiAocFNFQ091dHB1dFBvcnQtPmJJc0FOQkVuYWJsZWQgPT0gT01YX1RSVUUpIHsKKyAgICAgICAgICAgICAgICBPTVhfVTMyIHN0cmlkZTsKKyAgICAgICAgICAgICAgICBTRUNfT1NBTF9Mb2NrQU5CKHBPdXRwdXREYXRhLT5kYXRhQnVmZmVyLCB3aWR0aCwgaGVpZ2h0LCBwU0VDQ29tcG9uZW50LT5wU0VDUG9ydFtPVVRQVVRfUE9SVF9JTkRFWF0ucG9ydERlZmluaXRpb24uZm9ybWF0LnZpZGVvLmVDb2xvckZvcm1hdCwgJnN0cmlkZSwgcFlVVkJ1Zik7CisgICAgICAgICAgICAgICAgd2lkdGggPSBzdHJpZGU7CisgICAgICAgICAgICAgICAgcE91dHB1dERhdGEtPmRhdGFMZW4gPSBzaXplb2Yodm9pZCAqKTsKKyAgICAgICAgICAgIH0KKyNlbmRpZgorICAgICAgICAgICAgaWYgKChwVmlkZW9EZWMtPmJUaHVtYm5haWxNb2RlID09IE9NWF9GQUxTRSkgJiYKKyAgICAgICAgICAgICAgICAocFNFQ091dHB1dFBvcnQtPnBvcnREZWZpbml0aW9uLmZvcm1hdC52aWRlby5lQ29sb3JGb3JtYXQgPT0gT01YX1NFQ19DT0xPUl9Gb3JtYXROVjEyVFBoeXNpY2FsQWRkcmVzcykpIHsKKyAgICAgICAgICAgICAgICBTRUNfT1NBTF9NZW1jcHkocFlVVkJ1ZlswXSwgJihvdXRwdXRJbmZvLllQaHlBZGRyKSwgc2l6ZW9mKG91dHB1dEluZm8uWVBoeUFkZHIpKTsKKyAgICAgICAgICAgICAgICBTRUNfT1NBTF9NZW1jcHkoKHVuc2lnbmVkIGNoYXIgKilwWVVWQnVmWzBdICsgKHNpemVvZih2b2lkICopICogMSksICYob3V0cHV0SW5mby5DUGh5QWRkciksIHNpemVvZihvdXRwdXRJbmZvLkNQaHlBZGRyKSk7CisgICAgICAgICAgICAgICAgU0VDX09TQUxfTWVtY3B5KCh1bnNpZ25lZCBjaGFyICopcFlVVkJ1ZlswXSArIChzaXplb2Yodm9pZCAqKSAqIDIpLCAmKG91dHB1dEluZm8uWVZpckFkZHIpLCBzaXplb2Yob3V0cHV0SW5mby5ZVmlyQWRkcikpOworICAgICAgICAgICAgICAgIFNFQ19PU0FMX01lbWNweSgodW5zaWduZWQgY2hhciAqKXBZVVZCdWZbMF0gKyAoc2l6ZW9mKHZvaWQgKikgKiAzKSwgJihvdXRwdXRJbmZvLkNWaXJBZGRyKSwgc2l6ZW9mKG91dHB1dEluZm8uQ1ZpckFkZHIpKTsKKyAgICAgICAgICAgICAgICBwT3V0cHV0RGF0YS0+ZGF0YUxlbiA9IChvdXRwdXRJbmZvLmltZ193aWR0aCAqIG91dHB1dEluZm8uaW1nX2hlaWdodCAqIDMpIC8gMjsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgU0VDX09TQUxfTG9nKFNFQ19MT0dfVFJBQ0UsICJZVVY0MjAgb3V0IGZvciBUaHVtYm5haWxNb2RlIik7CisjaWZkZWYgQ09ORklHX01GQ19GUFMKKyAgICAgICAgICAgICAgICBTRUNfT1NBTF9QZXJmU3RhcnQoUEVSRl9JRF9DU0MpOworI2VuZGlmCisgICAgICAgICAgICAgICAgc3dpdGNoIChwU0VDQ29tcG9uZW50LT5wU0VDUG9ydFtPVVRQVVRfUE9SVF9JTkRFWF0ucG9ydERlZmluaXRpb24uZm9ybWF0LnZpZGVvLmVDb2xvckZvcm1hdCkgeworICAgICAgICAgICAgICAgIGNhc2UgT01YX1NFQ19DT0xPUl9Gb3JtYXROVjEyVGlsZWQ6CisgICAgICAgICAgICAgICAgICAgIFNFQ19PU0FMX01lbWNweShwT3V0cHV0QnVmLCBvdXRwdXRJbmZvLllWaXJBZGRyLCBGcmFtZUJ1ZmZlcllTaXplKTsKKyAgICAgICAgICAgICAgICAgICAgU0VDX09TQUxfTWVtY3B5KCh1bnNpZ25lZCBjaGFyICopcE91dHB1dEJ1ZiArIEZyYW1lQnVmZmVyWVNpemUsIG91dHB1dEluZm8uQ1ZpckFkZHIsIEZyYW1lQnVmZmVyVVZTaXplKTsKKyAgICAgICAgICAgICAgICAgICAgcE91dHB1dERhdGEtPmRhdGFMZW4gPSBGcmFtZUJ1ZmZlcllTaXplICsgRnJhbWVCdWZmZXJVVlNpemU7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIGNhc2UgT01YX0NPTE9SX0Zvcm1hdFlVVjQyMFNlbWlQbGFuYXI6CisgICAgICAgICAgICAgICAgY2FzZSBPTVhfU0VDX0NPTE9SX0Zvcm1hdEFOQllVVjQyMFNlbWlQbGFuYXI6CisgICAgICAgICAgICAgICAgICAgIGNzY19zcmNfY29sb3JfZm9ybWF0ID0gb214XzJfaGFsX3BpeGVsX2Zvcm1hdCgodW5zaWduZWQgaW50KU9NWF9TRUNfQ09MT1JfRm9ybWF0TlYxMlRpbGVkKTsKKyAgICAgICAgICAgICAgICAgICAgY3NjX2RzdF9jb2xvcl9mb3JtYXQgPSBvbXhfMl9oYWxfcGl4ZWxfZm9ybWF0KCh1bnNpZ25lZCBpbnQpT01YX0NPTE9SX0Zvcm1hdFlVVjQyMFNlbWlQbGFuYXIpOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBjYXNlIE9NWF9DT0xPUl9Gb3JtYXRZVVY0MjBQbGFuYXI6CisgICAgICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICAgICAgY3NjX3NyY19jb2xvcl9mb3JtYXQgPSBvbXhfMl9oYWxfcGl4ZWxfZm9ybWF0KCh1bnNpZ25lZCBpbnQpT01YX1NFQ19DT0xPUl9Gb3JtYXROVjEyVGlsZWQpOworICAgICAgICAgICAgICAgICAgICBjc2NfZHN0X2NvbG9yX2Zvcm1hdCA9IG9teF8yX2hhbF9waXhlbF9mb3JtYXQoKHVuc2lnbmVkIGludClPTVhfQ09MT1JfRm9ybWF0WVVWNDIwUGxhbmFyKTsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgY3NjX2dldF9tZXRob2QocFZpZGVvRGVjLT5jc2NfaGFuZGxlLCAmY3NjX21ldGhvZCk7CisjaWZkZWYgVVNFX0NTQ19GSU1DCisgICAgICAgICAgICAgICAgaWYgKChwU0VDT3V0cHV0UG9ydC0+YklzQU5CRW5hYmxlZCA9PSBPTVhfVFJVRSkgJiYgKGNzY19tZXRob2QgPT0gQ1NDX01FVEhPRF9IVykpIHsKKyAgICAgICAgICAgICAgICAgICAgU0VDX09TQUxfR2V0UGh5c0FOQihwT3V0cHV0RGF0YS0+ZGF0YUJ1ZmZlciwgcFlVVkJ1Zik7CisgICAgICAgICAgICAgICAgICAgIHBTcmNCdWZbMF0gPSBvdXRwdXRJbmZvLllQaHlBZGRyOworICAgICAgICAgICAgICAgICAgICBwU3JjQnVmWzFdID0gb3V0cHV0SW5mby5DUGh5QWRkcjsKKyAgICAgICAgICAgICAgICB9CisjZW5kaWYKKyAgICAgICAgICAgICAgICBpZiAocFZpZGVvRGVjLT5jc2Nfc2V0X2Zvcm1hdCA9PSBPTVhfRkFMU0UpIHsKKyAgICAgICAgICAgICAgICAgICAgY3NjX3NldF9zcmNfZm9ybWF0KAorICAgICAgICAgICAgICAgICAgICAgICAgcFZpZGVvRGVjLT5jc2NfaGFuZGxlLCAgLyogaGFuZGxlICovCisgICAgICAgICAgICAgICAgICAgICAgICB3aWR0aCwgICAgICAgICAgICAgICAgICAvKiB3aWR0aCAqLworICAgICAgICAgICAgICAgICAgICAgICAgaGVpZ2h0LCAgICAgICAgICAgICAgICAgLyogaGVpZ2h0ICovCisgICAgICAgICAgICAgICAgICAgICAgICAwLCAgICAgICAgICAgICAgICAgICAgICAvKiBjcm9wX2xlZnQgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgIDAsICAgICAgICAgICAgICAgICAgICAgIC8qIGNyb3BfcmlnaHQgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgIHdpZHRoLCAgICAgICAgICAgICAgICAgIC8qIGNyb3Bfd2lkdGggKi8KKyAgICAgICAgICAgICAgICAgICAgICAgIGhlaWdodCwgICAgICAgICAgICAgICAgIC8qIGNyb3BfaGVpZ2h0ICovCisgICAgICAgICAgICAgICAgICAgICAgICBjc2Nfc3JjX2NvbG9yX2Zvcm1hdCwgICAvKiBjb2xvcl9mb3JtYXQgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgIGNhY2hlYWJsZSk7ICAgICAgICAgICAgIC8qIGNhY2hlYWJsZSAqLworICAgICAgICAgICAgICAgICAgICBjc2Nfc2V0X2RzdF9mb3JtYXQoCisgICAgICAgICAgICAgICAgICAgICAgICBwVmlkZW9EZWMtPmNzY19oYW5kbGUsICAvKiBoYW5kbGUgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgIHdpZHRoLCAgICAgICAgICAgICAgICAgIC8qIHdpZHRoICovCisgICAgICAgICAgICAgICAgICAgICAgICBoZWlnaHQsICAgICAgICAgICAgICAgICAvKiBoZWlnaHQgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgIDAsICAgICAgICAgICAgICAgICAgICAgIC8qIGNyb3BfbGVmdCAqLworICAgICAgICAgICAgICAgICAgICAgICAgMCwgICAgICAgICAgICAgICAgICAgICAgLyogY3JvcF9yaWdodCAqLworICAgICAgICAgICAgICAgICAgICAgICAgd2lkdGgsICAgICAgICAgICAgICAgICAgLyogY3JvcF93aWR0aCAqLworICAgICAgICAgICAgICAgICAgICAgICAgaGVpZ2h0LCAgICAgICAgICAgICAgICAgLyogY3JvcF9oZWlnaHQgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgIGNzY19kc3RfY29sb3JfZm9ybWF0LCAgIC8qIGNvbG9yX2Zvcm1hdCAqLworICAgICAgICAgICAgICAgICAgICAgICAgY2FjaGVhYmxlKTsgICAgICAgICAgICAgLyogY2FjaGVhYmxlICovCisgICAgICAgICAgICAgICAgICAgIHBWaWRlb0RlYy0+Y3NjX3NldF9mb3JtYXQgPSBPTVhfVFJVRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgY3NjX3NldF9zcmNfYnVmZmVyKAorICAgICAgICAgICAgICAgICAgICBwVmlkZW9EZWMtPmNzY19oYW5kbGUsICAvKiBoYW5kbGUgKi8KKyAgICAgICAgICAgICAgICAgICAgcFNyY0J1ZlswXSwgICAgICAgICAgICAgLyogeSBhZGRyICovCisgICAgICAgICAgICAgICAgICAgIHBTcmNCdWZbMV0sICAgICAgICAgICAgIC8qIHUgYWRkciBvciB1diBhZGRyICovCisgICAgICAgICAgICAgICAgICAgIHBTcmNCdWZbMl0sICAgICAgICAgICAgIC8qIHYgYWRkciBvciBub25lICovCisgICAgICAgICAgICAgICAgICAgIDApOyAgICAgICAgICAgICAgICAgICAgIC8qIGlvbiBmZCAqLworICAgICAgICAgICAgICAgIGNzY19zZXRfZHN0X2J1ZmZlcigKKyAgICAgICAgICAgICAgICAgICAgcFZpZGVvRGVjLT5jc2NfaGFuZGxlLAorICAgICAgICAgICAgICAgICAgICBwWVVWQnVmWzBdLCAgICAgICAgICAgICAvKiB5IGFkZHIgKi8KKyAgICAgICAgICAgICAgICAgICAgcFlVVkJ1ZlsxXSwgICAgICAgICAgICAgLyogdSBhZGRyIG9yIHV2IGFkZHIgKi8KKyAgICAgICAgICAgICAgICAgICAgcFlVVkJ1ZlsyXSwgICAgICAgICAgICAgLyogdiBhZGRyIG9yIG5vbmUgKi8KKyAgICAgICAgICAgICAgICAgICAgMCk7ICAgICAgICAgICAgICAgICAgICAgLyogaW9uIGZkICovCisgICAgICAgICAgICAgICAgY3NjX2NvbnZlcnQocFZpZGVvRGVjLT5jc2NfaGFuZGxlKTsKKworI2lmZGVmIENPTkZJR19NRkNfRlBTCisgICAgICAgICAgICAgICAgU0VDX09TQUxfUGVyZlN0b3AoUEVSRl9JRF9DU0MpOworI2VuZGlmCisgICAgICAgICAgICB9CisKKyNpZmRlZiBVU0VfQU5CCisgICAgICAgICAgICBpZiAocFNFQ091dHB1dFBvcnQtPmJJc0FOQkVuYWJsZWQgPT0gT01YX1RSVUUpIHsKKyAgICAgICAgICAgICAgICBTRUNfT1NBTF9VbmxvY2tBTkIocE91dHB1dERhdGEtPmRhdGFCdWZmZXIpOworICAgICAgICAgICAgfQorI2VuZGlmCisgICAgICAgICAgICBwV212RGVjLT5oTUZDV212SGFuZGxlLm91dHB1dEluZGV4VGltZXN0YW1wKys7CisgICAgICAgICAgICBwV212RGVjLT5oTUZDV212SGFuZGxlLm91dHB1dEluZGV4VGltZXN0YW1wICU9IE1BWF9USU1FU1RBTVA7CisgICAgICAgIH0KKyAgICAgICAgaWYgKHBPdXRwdXREYXRhLT5uRmxhZ3MgJiBPTVhfQlVGRkVSRkxBR19FT1MpCisgICAgICAgICAgICBwT3V0cHV0RGF0YS0+ZGF0YUxlbiA9IDA7CisKKyAgICAgICAgaWYgKChzdGF0dXMgPT0gTUZDX0dFVE9VVEJVRl9ESVNQTEFZX09OTFkpIHx8CisgICAgICAgICAgICAocFNFQ0NvbXBvbmVudC0+Z2V0QWxsRGVsYXlCdWZmZXIgPT0gT01YX1RSVUUpKQorICAgICAgICAgICAgcmV0ID0gT01YX0Vycm9ySW5wdXREYXRhRGVjb2RlWWV0OworCisgICAgICAgIGlmIChzdGF0dXMgPT0gTUZDX0dFVE9VVEJVRl9ERUNPRElOR19PTkxZKSB7CisgICAgICAgICAgICBpZiAoKChwSW5wdXREYXRhLT5uRmxhZ3MgJiBPTVhfQlVGRkVSRkxBR19FT1MpICE9IE9NWF9CVUZGRVJGTEFHX0VPUykgJiYKKyAgICAgICAgICAgICAgICAoKHBTRUNDb21wb25lbnQtPmJTYXZlRmxhZ0VPUyA9PSBPTVhfVFJVRSkgfHwgKHBTRUNDb21wb25lbnQtPmdldEFsbERlbGF5QnVmZmVyID09IE9NWF9UUlVFKSkpIHsKKyAgICAgICAgICAgICAgICBwSW5wdXREYXRhLT5uRmxhZ3MgfD0gT01YX0JVRkZFUkZMQUdfRU9TOworICAgICAgICAgICAgICAgIHBTRUNDb21wb25lbnQtPmdldEFsbERlbGF5QnVmZmVyID0gT01YX1RSVUU7CisgICAgICAgICAgICAgICAgcmV0ID0gT01YX0Vycm9ySW5wdXREYXRhRGVjb2RlWWV0OworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICByZXQgPSBPTVhfRXJyb3JOb25lOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZ290byBFWElUOworICAgICAgICB9CisKKyNpZmRlZiBGVUxMX0ZSQU1FX1NFQVJDSAorICAgICAgICBpZiAoKChwSW5wdXREYXRhLT5uRmxhZ3MgJiBPTVhfQlVGRkVSRkxBR19FT1MpICE9IE9NWF9CVUZGRVJGTEFHX0VPUykgJiYKKyAgICAgICAgICAgIChwU0VDQ29tcG9uZW50LT5iU2F2ZUZsYWdFT1MgPT0gT01YX1RSVUUpKSB7CisgICAgICAgICAgICBwSW5wdXREYXRhLT5uRmxhZ3MgfD0gT01YX0JVRkZFUkZMQUdfRU9TOworICAgICAgICAgICAgcFNFQ0NvbXBvbmVudC0+Z2V0QWxsRGVsYXlCdWZmZXIgPSBPTVhfVFJVRTsKKyAgICAgICAgICAgIHJldCA9IE9NWF9FcnJvcklucHV0RGF0YURlY29kZVlldDsKKyAgICAgICAgfSBlbHNlCisjZW5kaWYKKyAgICAgICAgaWYgKChwSW5wdXREYXRhLT5uRmxhZ3MgJiBPTVhfQlVGRkVSRkxBR19FT1MpID09IE9NWF9CVUZGRVJGTEFHX0VPUykgeworICAgICAgICAgICAgcElucHV0RGF0YS0+bkZsYWdzID0gKHBPdXRwdXREYXRhLT5uRmxhZ3MgJiAofk9NWF9CVUZGRVJGTEFHX0VPUykpOworICAgICAgICAgICAgcFNFQ0NvbXBvbmVudC0+Z2V0QWxsRGVsYXlCdWZmZXIgPSBPTVhfVFJVRTsKKyAgICAgICAgICAgIHJldCA9IE9NWF9FcnJvcklucHV0RGF0YURlY29kZVlldDsKKyAgICAgICAgfSBlbHNlIGlmICgocE91dHB1dERhdGEtPm5GbGFncyAmIE9NWF9CVUZGRVJGTEFHX0VPUykgPT0gT01YX0JVRkZFUkZMQUdfRU9TKSB7CisgICAgICAgICAgICBwU0VDQ29tcG9uZW50LT5nZXRBbGxEZWxheUJ1ZmZlciA9IE9NWF9GQUxTRTsKKyAgICAgICAgICAgIHJldCA9IE9NWF9FcnJvck5vbmU7CisgICAgICAgIH0KKyAgICB9IGVsc2UgeworICAgICAgICBwT3V0cHV0RGF0YS0+dGltZVN0YW1wID0gcElucHV0RGF0YS0+dGltZVN0YW1wOworICAgICAgICBwT3V0cHV0RGF0YS0+bkZsYWdzID0gcElucHV0RGF0YS0+bkZsYWdzOworCisgICAgICAgIGlmICgocFNFQ0NvbXBvbmVudC0+YlNhdmVGbGFnRU9TID09IE9NWF9UUlVFKSB8fAorICAgICAgICAgICAgKHBTRUNDb21wb25lbnQtPmdldEFsbERlbGF5QnVmZmVyID09IE9NWF9UUlVFKSB8fAorICAgICAgICAgICAgKHBJbnB1dERhdGEtPm5GbGFncyAmIE9NWF9CVUZGRVJGTEFHX0VPUykpIHsKKyAgICAgICAgICAgIHBPdXRwdXREYXRhLT5uRmxhZ3MgfD0gT01YX0JVRkZFUkZMQUdfRU9TOworICAgICAgICAgICAgcFNFQ0NvbXBvbmVudC0+Z2V0QWxsRGVsYXlCdWZmZXIgPSBPTVhfRkFMU0U7CisgICAgICAgIH0KKyAgICAgICAgcE91dHB1dERhdGEtPmRhdGFMZW4gPSAwOworCisgICAgICAgIC8qIHJldCA9IE9NWF9FcnJvclVuZGVmaW5lZDsgKi8KKyAgICAgICAgcmV0ID0gT01YX0Vycm9yTm9uZTsKKyAgICAgICAgZ290byBFWElUOworICAgIH0KKworRVhJVDoKKyAgICBGdW5jdGlvbk91dCgpOworCisgICAgcmV0dXJuIHJldDsKK30KKworLyogTUZDIERlY29kZSAqLworT01YX0VSUk9SVFlQRSBTRUNfTUZDX1dtdkRlY19idWZmZXJQcm9jZXNzKE9NWF9DT01QT05FTlRUWVBFICpwT01YQ29tcG9uZW50LCBTRUNfT01YX0RBVEEgKnBJbnB1dERhdGEsIFNFQ19PTVhfREFUQSAqcE91dHB1dERhdGEpCit7CisgICAgT01YX0VSUk9SVFlQRSAgICAgICAgIHJldCA9IE9NWF9FcnJvck5vbmU7CisgICAgU0VDX09NWF9CQVNFQ09NUE9ORU5UICpwU0VDQ29tcG9uZW50ID0gKFNFQ19PTVhfQkFTRUNPTVBPTkVOVCAqKXBPTVhDb21wb25lbnQtPnBDb21wb25lbnRQcml2YXRlOworICAgIFNFQ19XTVZfSEFORExFICAgICAgICAqcFdtdkRlYyA9IChTRUNfV01WX0hBTkRMRSAqKSgoU0VDX09NWF9WSURFT0RFQ19DT01QT05FTlQgKilwU0VDQ29tcG9uZW50LT5oQ29tcG9uZW50SGFuZGxlKS0+aENvZGVjSGFuZGxlOworICAgIFNFQ19PTVhfQkFTRVBPUlQgICAgICAqcFNFQ0lucHV0UG9ydCA9ICZwU0VDQ29tcG9uZW50LT5wU0VDUG9ydFtJTlBVVF9QT1JUX0lOREVYXTsKKyAgICBTRUNfT01YX0JBU0VQT1JUICAgICAgKnBTRUNPdXRwdXRQb3J0ID0gJnBTRUNDb21wb25lbnQtPnBTRUNQb3J0W09VVFBVVF9QT1JUX0lOREVYXTsKKyAgICBPTVhfQk9PTCAgICAgICAgICAgICAgYkNoZWNrUHJlZml4ID0gT01YX0ZBTFNFOworCisgICAgRnVuY3Rpb25JbigpOworCisgICAgaWYgKCghQ0hFQ0tfUE9SVF9FTkFCTEVEKHBTRUNJbnB1dFBvcnQpKSB8fCAoIUNIRUNLX1BPUlRfRU5BQkxFRChwU0VDT3V0cHV0UG9ydCkpIHx8CisgICAgICAgICghQ0hFQ0tfUE9SVF9QT1BVTEFURUQocFNFQ0lucHV0UG9ydCkpIHx8ICghQ0hFQ0tfUE9SVF9QT1BVTEFURUQocFNFQ091dHB1dFBvcnQpKSkgeworICAgICAgICBnb3RvIEVYSVQ7CisgICAgfQorICAgIGlmIChPTVhfRkFMU0UgPT0gU0VDX0NoZWNrX0J1ZmZlclByb2Nlc3NfU3RhdGUocFNFQ0NvbXBvbmVudCkpIHsKKyAgICAgICAgZ290byBFWElUOworICAgIH0KKworICAgIHBXbXZEZWMtPmhNRkNXbXZIYW5kbGUud212Rm9ybWF0ID0gZ1d2bUZvcm1hdDsKKworI2lmZGVmIE5PTkJMT0NLX01PREVfUFJPQ0VTUworICAgIHJldCA9IFNFQ19NRkNfV212X0RlY29kZV9Ob25ibG9jayhwT01YQ29tcG9uZW50LCBwSW5wdXREYXRhLCBwT3V0cHV0RGF0YSk7CisjZWxzZQorICAgIHJldCA9IFNFQ19NRkNfV212X0RlY29kZV9CbG9jayhwT01YQ29tcG9uZW50LCBwSW5wdXREYXRhLCBwT3V0cHV0RGF0YSk7CisjZW5kaWYKKyAgICBpZiAocmV0ICE9IE9NWF9FcnJvck5vbmUpIHsKKyAgICAgICAgaWYgKHJldCA9PSBPTVhfRXJyb3JJbnB1dERhdGFEZWNvZGVZZXQpIHsKKyAgICAgICAgICAgIHBPdXRwdXREYXRhLT51c2VkRGF0YUxlbiA9IDA7CisgICAgICAgICAgICBwT3V0cHV0RGF0YS0+cmVtYWluRGF0YUxlbiA9IHBPdXRwdXREYXRhLT5kYXRhTGVuOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgcFNFQ0NvbXBvbmVudC0+cENhbGxiYWNrcy0+RXZlbnRIYW5kbGVyKChPTVhfSEFORExFVFlQRSlwT01YQ29tcG9uZW50LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBTRUNDb21wb25lbnQtPmNhbGxiYWNrRGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPTVhfRXZlbnRFcnJvciwgcmV0LCAwLCBOVUxMKTsKKyAgICAgICAgfQorICAgIH0gZWxzZSB7CisgICAgICAgIHBJbnB1dERhdGEtPnByZXZpb3VzRGF0YUxlbiA9IHBJbnB1dERhdGEtPmRhdGFMZW47CisgICAgICAgIHBJbnB1dERhdGEtPnVzZWREYXRhTGVuICs9IHBJbnB1dERhdGEtPmRhdGFMZW47CisgICAgICAgIHBJbnB1dERhdGEtPnJlbWFpbkRhdGFMZW4gPSBwSW5wdXREYXRhLT5kYXRhTGVuIC0gcElucHV0RGF0YS0+dXNlZERhdGFMZW47CisgICAgICAgIHBJbnB1dERhdGEtPmRhdGFMZW4gLT0gcElucHV0RGF0YS0+dXNlZERhdGFMZW47CisgICAgICAgIHBJbnB1dERhdGEtPnVzZWREYXRhTGVuID0gMDsKKworICAgICAgICBwT3V0cHV0RGF0YS0+dXNlZERhdGFMZW4gPSAwOworICAgICAgICBwT3V0cHV0RGF0YS0+cmVtYWluRGF0YUxlbiA9IHBPdXRwdXREYXRhLT5kYXRhTGVuOworICAgIH0KKworRVhJVDoKKyAgICBGdW5jdGlvbk91dCgpOworCisgICAgcmV0dXJuIHJldDsKK30KKworT1NDTF9FWFBPUlRfUkVGIE9NWF9FUlJPUlRZUEUgU0VDX09NWF9Db21wb25lbnRJbml0KE9NWF9IQU5ETEVUWVBFIGhDb21wb25lbnQsIE9NWF9TVFJJTkcgY29tcG9uZW50TmFtZSkKK3sKKyAgICBPTVhfRVJST1JUWVBFICAgICAgICAgcmV0ID0gT01YX0Vycm9yTm9uZTsKKyAgICBPTVhfQ09NUE9ORU5UVFlQRSAgICAgKnBPTVhDb21wb25lbnQgPSBOVUxMOworICAgIFNFQ19PTVhfQkFTRUNPTVBPTkVOVCAqcFNFQ0NvbXBvbmVudCA9IE5VTEw7CisgICAgU0VDX09NWF9CQVNFUE9SVCAgICAgICpwU0VDUG9ydCA9IE5VTEw7CisgICAgU0VDX09NWF9WSURFT0RFQ19DT01QT05FTlQgKnBWaWRlb0RlYyA9IE5VTEw7CisgICAgU0VDX1dNVl9IQU5ETEUgICAgICAgICpwV212RGVjID0gTlVMTDsKKyAgICBPTVhfUzMyICAgICAgICAgICAgICAgd212Rm9ybWF0ID0gV01WX0ZPUk1BVF9VTktOT1dOOworICAgIGludCBpID0gMDsKKworICAgIEZ1bmN0aW9uSW4oKTsKKworICAgIGlmICgoaENvbXBvbmVudCA9PSBOVUxMKSB8fCAoY29tcG9uZW50TmFtZSA9PSBOVUxMKSkgeworICAgICAgICByZXQgPSBPTVhfRXJyb3JCYWRQYXJhbWV0ZXI7CisgICAgICAgIFNFQ19PU0FMX0xvZyhTRUNfTE9HX0VSUk9SLCAiU0VDX09NWF9Db21wb25lbnRJbml0OiBwYXJhbWV0ZXJzIGFyZSBudWxsLCByZXQ6JVgiLCByZXQpOworICAgICAgICBnb3RvIEVYSVQ7CisgICAgfQorICAgIGlmIChTRUNfT1NBTF9TdHJjbXAoU0VDX09NWF9DT01QT05FTlRfV01WX0RFQywgY29tcG9uZW50TmFtZSkgIT0gMCkgeworICAgICAgICByZXQgPSBPTVhfRXJyb3JCYWRQYXJhbWV0ZXI7CisgICAgICAgIFNFQ19PU0FMX0xvZyhTRUNfTE9HX0VSUk9SLCAiT01YX0Vycm9yQmFkUGFyYW1ldGVyLCBjb21wb25lbnROYW1lOiVzLCBMaW5lOiVkIiwgY29tcG9uZW50TmFtZSwgX19MSU5FX18pOworICAgICAgICBnb3RvIEVYSVQ7CisgICAgfQorCisgICAgcE9NWENvbXBvbmVudCA9IChPTVhfQ09NUE9ORU5UVFlQRSAqKWhDb21wb25lbnQ7CisgICAgcmV0ID0gU0VDX09NWF9WaWRlb0RlY29kZUNvbXBvbmVudEluaXQocE9NWENvbXBvbmVudCk7CisgICAgaWYgKHJldCAhPSBPTVhfRXJyb3JOb25lKSB7CisgICAgICAgIFNFQ19PU0FMX0xvZyhTRUNfTE9HX0VSUk9SLCAiU0VDX09NWF9Db21wb25lbnRJbml0OiBTRUNfT01YX1ZpZGVvRGVjb2RlQ29tcG9uZW50SW5pdCBlcnJvciwgcmV0OiAlWCIsIHJldCk7CisgICAgICAgIGdvdG8gRVhJVDsKKyAgICB9CisgICAgcFNFQ0NvbXBvbmVudCA9IChTRUNfT01YX0JBU0VDT01QT05FTlQgKilwT01YQ29tcG9uZW50LT5wQ29tcG9uZW50UHJpdmF0ZTsKKyAgICBwU0VDQ29tcG9uZW50LT5jb2RlY1R5cGUgPSBIV19WSURFT19ERUNfQ09ERUM7CisKKyAgICBwU0VDQ29tcG9uZW50LT5jb21wb25lbnROYW1lID0gKE9NWF9TVFJJTkcpU0VDX09TQUxfTWFsbG9jKE1BWF9PTVhfQ09NUE9ORU5UX05BTUVfU0laRSk7CisgICAgaWYgKHBTRUNDb21wb25lbnQtPmNvbXBvbmVudE5hbWUgPT0gTlVMTCkgeworICAgICAgICBTRUNfT01YX1ZpZGVvRGVjb2RlQ29tcG9uZW50RGVpbml0KHBPTVhDb21wb25lbnQpOworICAgICAgICByZXQgPSBPTVhfRXJyb3JJbnN1ZmZpY2llbnRSZXNvdXJjZXM7CisgICAgICAgIFNFQ19PU0FMX0xvZyhTRUNfTE9HX0VSUk9SLCAiU0VDX09NWF9Db21wb25lbnRJbml0OiBjb21wb25lbnROYW1lIGFsbG9jIGVycm9yLCByZXQ6ICVYIiwgcmV0KTsKKyAgICAgICAgZ290byBFWElUOworICAgIH0KKyAgICBTRUNfT1NBTF9NZW1zZXQocFNFQ0NvbXBvbmVudC0+Y29tcG9uZW50TmFtZSwgMCwgTUFYX09NWF9DT01QT05FTlRfTkFNRV9TSVpFKTsKKworICAgIHBXbXZEZWMgPSBTRUNfT1NBTF9NYWxsb2Moc2l6ZW9mKFNFQ19XTVZfSEFORExFKSk7CisgICAgaWYgKHBXbXZEZWMgPT0gTlVMTCkgeworICAgICAgICBTRUNfT01YX1ZpZGVvRGVjb2RlQ29tcG9uZW50RGVpbml0KHBPTVhDb21wb25lbnQpOworICAgICAgICByZXQgPSBPTVhfRXJyb3JJbnN1ZmZpY2llbnRSZXNvdXJjZXM7CisgICAgICAgIFNFQ19PU0FMX0xvZyhTRUNfTE9HX0VSUk9SLCAiU0VDX09NWF9Db21wb25lbnRJbml0OiBTRUNfV01WX0hBTkRMRSBhbGxvYyBlcnJvciwgcmV0OiAlWCIsIHJldCk7CisgICAgICAgIGdvdG8gRVhJVDsKKyAgICB9CisgICAgU0VDX09TQUxfTWVtc2V0KHBXbXZEZWMsIDAsIHNpemVvZihTRUNfV01WX0hBTkRMRSkpOworICAgIHBWaWRlb0RlYyA9IChTRUNfT01YX1ZJREVPREVDX0NPTVBPTkVOVCAqKXBTRUNDb21wb25lbnQtPmhDb21wb25lbnRIYW5kbGU7CisgICAgcFZpZGVvRGVjLT5oQ29kZWNIYW5kbGUgPSAoT01YX0hBTkRMRVRZUEUpcFdtdkRlYzsKKyAgICBwV212RGVjLT5oTUZDV212SGFuZGxlLndtdkZvcm1hdCA9IHdtdkZvcm1hdDsKKworICAgIFNFQ19PU0FMX1N0cmNweShwU0VDQ29tcG9uZW50LT5jb21wb25lbnROYW1lLCBTRUNfT01YX0NPTVBPTkVOVF9XTVZfREVDKTsKKworICAgIC8qIFNldCBjb21wb25lbnRWZXJzaW9uICovCisgICAgcFNFQ0NvbXBvbmVudC0+Y29tcG9uZW50VmVyc2lvbi5zLm5WZXJzaW9uTWFqb3IgPSBWRVJTSU9OTUFKT1JfTlVNQkVSOworICAgIHBTRUNDb21wb25lbnQtPmNvbXBvbmVudFZlcnNpb24ucy5uVmVyc2lvbk1pbm9yID0gVkVSU0lPTk1JTk9SX05VTUJFUjsKKyAgICBwU0VDQ29tcG9uZW50LT5jb21wb25lbnRWZXJzaW9uLnMublJldmlzaW9uICAgICA9IFJFVklTSU9OX05VTUJFUjsKKyAgICBwU0VDQ29tcG9uZW50LT5jb21wb25lbnRWZXJzaW9uLnMublN0ZXAgICAgICAgICA9IFNURVBfTlVNQkVSOworICAgIC8qIFNldCBzcGVjVmVyc2lvbiAqLworICAgIHBTRUNDb21wb25lbnQtPnNwZWNWZXJzaW9uLnMublZlcnNpb25NYWpvciA9IFZFUlNJT05NQUpPUl9OVU1CRVI7CisgICAgcFNFQ0NvbXBvbmVudC0+c3BlY1ZlcnNpb24ucy5uVmVyc2lvbk1pbm9yID0gVkVSU0lPTk1JTk9SX05VTUJFUjsKKyAgICBwU0VDQ29tcG9uZW50LT5zcGVjVmVyc2lvbi5zLm5SZXZpc2lvbiAgICAgPSBSRVZJU0lPTl9OVU1CRVI7CisgICAgcFNFQ0NvbXBvbmVudC0+c3BlY1ZlcnNpb24ucy5uU3RlcCAgICAgICAgID0gU1RFUF9OVU1CRVI7CisKKyAgICAvKiBBbmRyb2lkIENhcGFiaWxpdHlGbGFncyAqLworICAgIHBTRUNDb21wb25lbnQtPmNhcGFiaWxpdHlGbGFncy5pSXNPTVhDb21wb25lbnRNdWx0aVRocmVhZGVkICAgICAgICAgICAgICAgICAgID0gT01YX1RSVUU7CisgICAgcFNFQ0NvbXBvbmVudC0+Y2FwYWJpbGl0eUZsYWdzLmlPTVhDb21wb25lbnRTdXBwb3J0c0V4dGVybmFsSW5wdXRCdWZmZXJBbGxvYyAgPSBPTVhfVFJVRTsKKyAgICBwU0VDQ29tcG9uZW50LT5jYXBhYmlsaXR5RmxhZ3MuaU9NWENvbXBvbmVudFN1cHBvcnRzRXh0ZXJuYWxPdXRwdXRCdWZmZXJBbGxvYyA9IE9NWF9UUlVFOworICAgIHBTRUNDb21wb25lbnQtPmNhcGFiaWxpdHlGbGFncy5pT01YQ29tcG9uZW50U3VwcG9ydHNNb3ZhYmxlSW5wdXRCdWZmZXJzICAgICAgID0gT01YX0ZBTFNFOworICAgIHBTRUNDb21wb25lbnQtPmNhcGFiaWxpdHlGbGFncy5pT01YQ29tcG9uZW50U3VwcG9ydHNQYXJ0aWFsRnJhbWVzICAgICAgICAgICAgID0gT01YX0ZBTFNFOworICAgIHBTRUNDb21wb25lbnQtPmNhcGFiaWxpdHlGbGFncy5pT01YQ29tcG9uZW50VXNlc05BTFN0YXJ0Q29kZXMgICAgICAgICAgICAgICAgID0gT01YX1RSVUU7CisgICAgcFNFQ0NvbXBvbmVudC0+Y2FwYWJpbGl0eUZsYWdzLmlPTVhDb21wb25lbnRDYW5IYW5kbGVJbmNvbXBsZXRlRnJhbWVzICAgICAgICAgPSBPTVhfVFJVRTsKKyAgICBwU0VDQ29tcG9uZW50LT5jYXBhYmlsaXR5RmxhZ3MuaU9NWENvbXBvbmVudFVzZXNGdWxsQVZDRnJhbWVzICAgICAgICAgICAgICAgICA9IE9NWF9UUlVFOworCisgICAgLyogSW5wdXQgcG9ydCAqLworICAgIHBTRUNQb3J0ID0gJnBTRUNDb21wb25lbnQtPnBTRUNQb3J0W0lOUFVUX1BPUlRfSU5ERVhdOworICAgIHBTRUNQb3J0LT5wb3J0RGVmaW5pdGlvbi5mb3JtYXQudmlkZW8ubkZyYW1lV2lkdGggPSBERUZBVUxUX0ZSQU1FX1dJRFRIOworICAgIHBTRUNQb3J0LT5wb3J0RGVmaW5pdGlvbi5mb3JtYXQudmlkZW8ubkZyYW1lSGVpZ2h0PSBERUZBVUxUX0ZSQU1FX0hFSUdIVDsKKyAgICBwU0VDUG9ydC0+cG9ydERlZmluaXRpb24uZm9ybWF0LnZpZGVvLm5TdHJpZGUgPSAwOworICAgIHBTRUNQb3J0LT5wb3J0RGVmaW5pdGlvbi5mb3JtYXQudmlkZW8ublNsaWNlSGVpZ2h0ID0gMDsKKyAgICBwU0VDUG9ydC0+cG9ydERlZmluaXRpb24ubkJ1ZmZlclNpemUgPSBERUZBVUxUX1ZJREVPX0lOUFVUX0JVRkZFUl9TSVpFOworCisgICAgcFNFQ1BvcnQtPnBvcnREZWZpbml0aW9uLmZvcm1hdC52aWRlby5lQ29tcHJlc3Npb25Gb3JtYXQgPSBPTVhfVklERU9fQ29kaW5nV01WOworICAgIFNFQ19PU0FMX01lbXNldChwU0VDUG9ydC0+cG9ydERlZmluaXRpb24uZm9ybWF0LnZpZGVvLmNNSU1FVHlwZSwgMCwgTUFYX09NWF9NSU1FVFlQRV9TSVpFKTsKKyAgICBTRUNfT1NBTF9TdHJjcHkocFNFQ1BvcnQtPnBvcnREZWZpbml0aW9uLmZvcm1hdC52aWRlby5jTUlNRVR5cGUsICJ2aWRlby93bXYiKTsKKworICAgIHBTRUNQb3J0LT5wb3J0RGVmaW5pdGlvbi5mb3JtYXQudmlkZW8ucE5hdGl2ZVJlbmRlciA9IDA7CisgICAgcFNFQ1BvcnQtPnBvcnREZWZpbml0aW9uLmZvcm1hdC52aWRlby5iRmxhZ0Vycm9yQ29uY2VhbG1lbnQgPSBPTVhfRkFMU0U7CisgICAgcFNFQ1BvcnQtPnBvcnREZWZpbml0aW9uLmZvcm1hdC52aWRlby5lQ29sb3JGb3JtYXQgPSBPTVhfQ09MT1JfRm9ybWF0VW51c2VkOworICAgIHBTRUNQb3J0LT5wb3J0RGVmaW5pdGlvbi5iRW5hYmxlZCA9IE9NWF9UUlVFOworCisgICAgLyogT3V0cHV0IHBvcnQgKi8KKyAgICBwU0VDUG9ydCA9ICZwU0VDQ29tcG9uZW50LT5wU0VDUG9ydFtPVVRQVVRfUE9SVF9JTkRFWF07CisgICAgcFNFQ1BvcnQtPnBvcnREZWZpbml0aW9uLmZvcm1hdC52aWRlby5uRnJhbWVXaWR0aCA9IERFRkFVTFRfRlJBTUVfV0lEVEg7CisgICAgcFNFQ1BvcnQtPnBvcnREZWZpbml0aW9uLmZvcm1hdC52aWRlby5uRnJhbWVIZWlnaHQ9IERFRkFVTFRfRlJBTUVfSEVJR0hUOworICAgIHBTRUNQb3J0LT5wb3J0RGVmaW5pdGlvbi5mb3JtYXQudmlkZW8ublN0cmlkZSA9IDA7CisgICAgcFNFQ1BvcnQtPnBvcnREZWZpbml0aW9uLmZvcm1hdC52aWRlby5uU2xpY2VIZWlnaHQgPSAwOworICAgIHBTRUNQb3J0LT5wb3J0RGVmaW5pdGlvbi5uQnVmZmVyU2l6ZSA9IERFRkFVTFRfVklERU9fT1VUUFVUX0JVRkZFUl9TSVpFOworICAgIHBTRUNQb3J0LT5wb3J0RGVmaW5pdGlvbi5mb3JtYXQudmlkZW8uZUNvbXByZXNzaW9uRm9ybWF0ID0gT01YX1ZJREVPX0NvZGluZ1VudXNlZDsKKyAgICBTRUNfT1NBTF9NZW1zZXQocFNFQ1BvcnQtPnBvcnREZWZpbml0aW9uLmZvcm1hdC52aWRlby5jTUlNRVR5cGUsIDAsIE1BWF9PTVhfTUlNRVRZUEVfU0laRSk7CisgICAgU0VDX09TQUxfU3RyY3B5KHBTRUNQb3J0LT5wb3J0RGVmaW5pdGlvbi5mb3JtYXQudmlkZW8uY01JTUVUeXBlLCAicmF3L3ZpZGVvIik7CisgICAgcFNFQ1BvcnQtPnBvcnREZWZpbml0aW9uLmZvcm1hdC52aWRlby5wTmF0aXZlUmVuZGVyID0gMDsKKyAgICBwU0VDUG9ydC0+cG9ydERlZmluaXRpb24uZm9ybWF0LnZpZGVvLmJGbGFnRXJyb3JDb25jZWFsbWVudCA9IE9NWF9GQUxTRTsKKyAgICBwU0VDUG9ydC0+cG9ydERlZmluaXRpb24uZm9ybWF0LnZpZGVvLmVDb2xvckZvcm1hdCA9IE9NWF9DT0xPUl9Gb3JtYXRZVVY0MjBQbGFuYXI7CisgICAgcFNFQ1BvcnQtPnBvcnREZWZpbml0aW9uLmJFbmFibGVkID0gT01YX1RSVUU7CisKKyAgICBmb3IoaSA9IDA7IGkgPCBBTExfUE9SVF9OVU07IGkrKykgeworICAgICAgICBJTklUX1NFVF9TSVpFX1ZFUlNJT04oJnBXbXZEZWMtPldtdkNvbXBvbmVudFtpXSwgT01YX1ZJREVPX1BBUkFNX1dNVlRZUEUpOworICAgICAgICBwV212RGVjLT5XbXZDb21wb25lbnRbaV0ublBvcnRJbmRleCA9IGk7CisgICAgICAgIHBXbXZEZWMtPldtdkNvbXBvbmVudFtpXS5lRm9ybWF0ICAgID0gT01YX1ZJREVPX1dNVkZvcm1hdDk7CisgICAgfQorCisgICAgcE9NWENvbXBvbmVudC0+R2V0UGFyYW1ldGVyICAgICAgPSAmU0VDX01GQ19XbXZEZWNfR2V0UGFyYW1ldGVyOworICAgIHBPTVhDb21wb25lbnQtPlNldFBhcmFtZXRlciAgICAgID0gJlNFQ19NRkNfV212RGVjX1NldFBhcmFtZXRlcjsKKyAgICBwT01YQ29tcG9uZW50LT5HZXRDb25maWcgICAgICAgICA9ICZTRUNfTUZDX1dtdkRlY19HZXRDb25maWc7CisgICAgcE9NWENvbXBvbmVudC0+U2V0Q29uZmlnICAgICAgICAgPSAmU0VDX01GQ19XbXZEZWNfU2V0Q29uZmlnOworICAgIHBPTVhDb21wb25lbnQtPkdldEV4dGVuc2lvbkluZGV4ID0gJlNFQ19NRkNfV212RGVjX0dldEV4dGVuc2lvbkluZGV4OworICAgIHBPTVhDb21wb25lbnQtPkNvbXBvbmVudFJvbGVFbnVtID0gJlNFQ19NRkNfV212RGVjX0NvbXBvbmVudFJvbGVFbnVtOworICAgIHBPTVhDb21wb25lbnQtPkNvbXBvbmVudERlSW5pdCAgID0gJlNFQ19PTVhfQ29tcG9uZW50RGVpbml0OworCisgICAgcFNFQ0NvbXBvbmVudC0+c2VjX21mY19jb21wb25lbnRJbml0ICAgICAgPSAmU0VDX01GQ19XbXZEZWNfSW5pdDsKKyAgICBwU0VDQ29tcG9uZW50LT5zZWNfbWZjX2NvbXBvbmVudFRlcm1pbmF0ZSA9ICZTRUNfTUZDX1dtdkRlY19UZXJtaW5hdGU7CisgICAgcFNFQ0NvbXBvbmVudC0+c2VjX21mY19idWZmZXJQcm9jZXNzICAgICAgPSAmU0VDX01GQ19XbXZEZWNfYnVmZmVyUHJvY2VzczsKKyAgICBwU0VDQ29tcG9uZW50LT5zZWNfY2hlY2tJbnB1dEZyYW1lID0gJkNoZWNrX1dtdl9GcmFtZTsKKworICAgIHBTRUNDb21wb25lbnQtPmN1cnJlbnRTdGF0ZSA9IE9NWF9TdGF0ZUxvYWRlZDsKKworICAgIHJldCA9IE9NWF9FcnJvck5vbmU7CisKK0VYSVQ6CisgICAgRnVuY3Rpb25PdXQoKTsKKworICAgIHJldHVybiByZXQ7Cit9CisKK09NWF9FUlJPUlRZUEUgU0VDX09NWF9Db21wb25lbnREZWluaXQoT01YX0hBTkRMRVRZUEUgaENvbXBvbmVudCkKK3sKKyAgICBPTVhfRVJST1JUWVBFICAgICAgICAgcmV0ID0gT01YX0Vycm9yTm9uZTsKKyAgICBPTVhfQ09NUE9ORU5UVFlQRSAgICAgKnBPTVhDb21wb25lbnQgPSBOVUxMOworICAgIFNFQ19PTVhfQkFTRUNPTVBPTkVOVCAqcFNFQ0NvbXBvbmVudCA9IE5VTEw7CisgICAgU0VDX1dNVl9IQU5ETEUgICAgICAgICpwV212RGVjID0gTlVMTDsKKworICAgIEZ1bmN0aW9uSW4oKTsKKworICAgIGlmIChoQ29tcG9uZW50ID09IE5VTEwpIHsKKyAgICAgICAgcmV0ID0gT01YX0Vycm9yQmFkUGFyYW1ldGVyOworICAgICAgICBnb3RvIEVYSVQ7CisgICAgfQorICAgIHBPTVhDb21wb25lbnQgPSAoT01YX0NPTVBPTkVOVFRZUEUgKiloQ29tcG9uZW50OworICAgIHBTRUNDb21wb25lbnQgPSAoU0VDX09NWF9CQVNFQ09NUE9ORU5UICopcE9NWENvbXBvbmVudC0+cENvbXBvbmVudFByaXZhdGU7CisKKyAgICBTRUNfT1NBTF9GcmVlKHBTRUNDb21wb25lbnQtPmNvbXBvbmVudE5hbWUpOworICAgIHBTRUNDb21wb25lbnQtPmNvbXBvbmVudE5hbWUgPSBOVUxMOworCisgICAgcFdtdkRlYyA9IChTRUNfV01WX0hBTkRMRSAqKSgoU0VDX09NWF9WSURFT0RFQ19DT01QT05FTlQgKilwU0VDQ29tcG9uZW50LT5oQ29tcG9uZW50SGFuZGxlKS0+aENvZGVjSGFuZGxlOworICAgIGlmIChwV212RGVjICE9IE5VTEwpIHsKKyAgICAgICAgU0VDX09TQUxfRnJlZShwV212RGVjKTsKKyAgICAgICAgcFdtdkRlYyA9ICgoU0VDX09NWF9WSURFT0RFQ19DT01QT05FTlQgKilwU0VDQ29tcG9uZW50LT5oQ29tcG9uZW50SGFuZGxlKS0+aENvZGVjSGFuZGxlID0gTlVMTDsKKyAgICB9CisKKyAgICByZXQgPSBTRUNfT01YX1ZpZGVvRGVjb2RlQ29tcG9uZW50RGVpbml0KHBPTVhDb21wb25lbnQpOworICAgIGlmIChyZXQgIT0gT01YX0Vycm9yTm9uZSkgeworICAgICAgICBnb3RvIEVYSVQ7CisgICAgfQorCisgICAgcmV0ID0gT01YX0Vycm9yTm9uZTsKKworRVhJVDoKKyAgICBGdW5jdGlvbk91dCgpOworCisgICAgcmV0dXJuIHJldDsKK30KZGlmZiAtLWdpdCBhL2V4eW5vczQvbXVsdGltZWRpYS9vcGVubWF4L3NlY19vbXgvY29tcG9uZW50L3ZpZGVvL2RlYy92YzEvU0VDX09NWF9XbXZkZWMuaCBiL2V4eW5vczQvbXVsdGltZWRpYS9vcGVubWF4L3NlY19vbXgvY29tcG9uZW50L3ZpZGVvL2RlYy92YzEvU0VDX09NWF9XbXZkZWMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wNjM0NDY1Ci0tLSAvZGV2L251bGwKKysrIGIvZXh5bm9zNC9tdWx0aW1lZGlhL29wZW5tYXgvc2VjX29teC9jb21wb25lbnQvdmlkZW8vZGVjL3ZjMS9TRUNfT01YX1dtdmRlYy5oCkBAIC0wLDAgKzEsOTQgQEAKKy8qCisgKgorICogQ29weXJpZ2h0IDIwMTAgU2Ftc3VuZyBFbGVjdHJvbmljcyBTLkxTSSBDby4gTFRECisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKy8qCisgKiBAZmlsZSAgICBTRUNfT01YX1dtdmRlYy5oCisgKiBAYnJpZWYKKyAqIEBhdXRob3IgICAgSHllWWVvbiBDaHVuZyAoaHllb24uY2h1bmdAc2Ftc3VuZy5jb20pCisgKiBAdmVyc2lvbiAgICAxLjEuMAorICogQGhpc3RvcnkKKyAqICAgMjAxMC44LjIwIDogQ3JlYXRlCisgKi8KKworI2lmbmRlZiBTRUNfT01YX1dNVl9ERUNfQ09NUE9ORU5UCisjZGVmaW5lIFNFQ19PTVhfV01WX0RFQ19DT01QT05FTlQKKworI2luY2x1ZGUgIlNFQ19PTVhfRGVmLmgiCisjaW5jbHVkZSAiT01YX0NvbXBvbmVudC5oIgorCisjZGVmaW5lIEJJVE1BUElORk9IRUFERVJfU0laRSAgICAgICAgICAgICAgIDQwCisjZGVmaW5lIEJJVE1BUElORk9IRUFERVJfQVNGQklORElOR19TSVpFICAgIDQxCisjZGVmaW5lIENPTVBSRVNTSU9OX1BPUyAgICAgICAgICAgICAgICAgICAgIDE2CisKK3R5cGVkZWYgZW51bSBXTVZfRk9STUFUIHsKKyAgICBXTVZfRk9STUFUX1ZDMSwKKyAgICBXTVZfRk9STUFUX1dNVjMsCisgICAgV01WX0ZPUk1BVF9VTktOT1dOCit9IFdNVl9GT1JNQVQ7CisKKy8qCisgKiBUaGlzIHN0cnVjdHVyZSBpcyB0aGUgc2FtZSBhcyBCaXRtYXBJbmZvSGhyIHN0cnVjdCBpbiBwdl9hdmlmaWxlX3R5cGVkZWZzLmggZmlsZQorICovCit0eXBlZGVmIHN0cnVjdCBfQml0bWFwSW5mb0hocgoreworICAgIE9NWF9VMzIgICAgQmlTaXplOworICAgIE9NWF9VMzIgICAgQmlXaWR0aDsKKyAgICBPTVhfVTMyICAgIEJpSGVpZ2h0OworICAgIE9NWF9VMTYgICAgQmlQbGFuZXM7CisgICAgT01YX1UxNiAgICBCaUJpdENvdW50OworICAgIE9NWF9VMzIgICAgQmlDb21wcmVzc2lvbjsKKyAgICBPTVhfVTMyICAgIEJpU2l6ZUltYWdlOworICAgIE9NWF9VMzIgICAgQmlYUGVsc1Blck1ldGVyOworICAgIE9NWF9VMzIgICAgQmlZUGVsc1Blck1ldGVyOworICAgIE9NWF9VMzIgICAgQmlDbHJVc2VkOworICAgIE9NWF9VMzIgICAgQmlDbHJJbXBvcnRhbnQ7Cit9IEJpdG1hcEluZm9IaHI7CisKK3R5cGVkZWYgc3RydWN0IF9TRUNfTUZDX1dNVl9IQU5ETEUKK3sKKyAgICBPTVhfSEFORExFVFlQRSBoTUZDSGFuZGxlOworICAgIE9NWF9QVFIgICAgICAgIHBNRkNTdHJlYW1CdWZmZXI7CisgICAgT01YX1BUUiAgICAgICAgcE1GQ1N0cmVhbVBoeUJ1ZmZlcjsKKyAgICBPTVhfVTMyICAgICAgICBpbmRleFRpbWVzdGFtcDsKKyAgICBPTVhfVTMyICAgICAgICBvdXRwdXRJbmRleFRpbWVzdGFtcDsKKyAgICBPTVhfQk9PTCAgICAgICBiQ29uZmlndXJlZE1GQzsKKyAgICBXTVZfRk9STUFUICAgICB3bXZGb3JtYXQ7CisgICAgT01YX1MzMiAgICAgICAgcmV0dXJuQ29kZWM7Cit9IFNFQ19NRkNfV01WX0hBTkRMRTsKKwordHlwZWRlZiBzdHJ1Y3QgX1NFQ19XTVZfSEFORExFCit7CisgICAgLyogT01YIENvZGVjIHNwZWNpZmljICovCisgICAgT01YX1ZJREVPX1BBUkFNX1dNVlRZUEUgV212Q29tcG9uZW50W0FMTF9QT1JUX05VTV07CisgICAgT01YX1ZJREVPX1BBUkFNX0VSUk9SQ09SUkVDVElPTlRZUEUgZXJyb3JDb3JyZWN0aW9uVHlwZVtBTExfUE9SVF9OVU1dOworCisgICAgLyogU0VDIE1GQyBDb2RlYyBzcGVjaWZpYyAqLworICAgIFNFQ19NRkNfV01WX0hBTkRMRSAgICAgIGhNRkNXbXZIYW5kbGU7Cit9IFNFQ19XTVZfSEFORExFOworCisjaWZkZWYgX19jcGx1c3BsdXMKK2V4dGVybiAiQyIgeworI2VuZGlmCisKK09TQ0xfRVhQT1JUX1JFRiBPTVhfRVJST1JUWVBFIFNFQ19PTVhfQ29tcG9uZW50SW5pdChPTVhfSEFORExFVFlQRSBoQ29tcG9uZW50LCBPTVhfU1RSSU5HIGNvbXBvbmVudE5hbWUpOworICAgICAgICAgICAgICAgIE9NWF9FUlJPUlRZUEUgU0VDX09NWF9Db21wb25lbnREZWluaXQoT01YX0hBTkRMRVRZUEUgaENvbXBvbmVudCk7CisKKyNpZmRlZiBfX2NwbHVzcGx1cworfTsKKyNlbmRpZgorCisjZW5kaWYKZGlmZiAtLWdpdCBhL2V4eW5vczQvbXVsdGltZWRpYS9vcGVubWF4L3NlY19vbXgvY29tcG9uZW50L3ZpZGVvL2RlYy92YzEvbGlicmFyeV9yZWdpc3Rlci5jIGIvZXh5bm9zNC9tdWx0aW1lZGlhL29wZW5tYXgvc2VjX29teC9jb21wb25lbnQvdmlkZW8vZGVjL3ZjMS9saWJyYXJ5X3JlZ2lzdGVyLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uY2UwNGYxOAotLS0gL2Rldi9udWxsCisrKyBiL2V4eW5vczQvbXVsdGltZWRpYS9vcGVubWF4L3NlY19vbXgvY29tcG9uZW50L3ZpZGVvL2RlYy92YzEvbGlicmFyeV9yZWdpc3Rlci5jCkBAIC0wLDAgKzEsNTcgQEAKKy8qCisgKgorICogQ29weXJpZ2h0IDIwMTAgU2Ftc3VuZyBFbGVjdHJvbmljcyBTLkxTSSBDby4gTFRECisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKy8qCisgKiBAZmlsZSAgICBsaWJyYXJ5X3JlZ2lzdGVyLmMKKyAqIEBicmllZgorICogQGF1dGhvciAgICBIeWVZZW9uIENodW5nIChoeWVvbi5jaHVuZ0BzYW1zdW5nLmNvbSkKKyAqIEB2ZXJzaW9uICAgIDEuMS4wCisgKiBAaGlzdG9yeQorICogICAyMDEwLjguMjAgOiBDcmVhdGUKKyAqLworCisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlIDxzdGRsaWIuaD4KKyNpbmNsdWRlIDxzdHJpbmcuaD4KKyNpbmNsdWRlIDxkbGZjbi5oPgorCisjaW5jbHVkZSAiU0VDX09TQUxfTWVtb3J5LmgiCisjaW5jbHVkZSAiU0VDX09TQUxfRVRDLmgiCisjaW5jbHVkZSAibGlicmFyeV9yZWdpc3Rlci5oIgorCisjdW5kZWYgIFNFQ19MT0dfVEFHCisjZGVmaW5lIFNFQ19MT0dfVEFHICAgICJTRUNfV01WX0RFQyIKKyNkZWZpbmUgU0VDX0xPR19PRkYKKyNpbmNsdWRlICJTRUNfT1NBTF9Mb2cuaCIKKworT1NDTF9FWFBPUlRfUkVGIGludCBTRUNfT01YX0NPTVBPTkVOVF9MaWJyYXJ5X1JlZ2lzdGVyKFNFQ1JlZ2lzdGVyQ29tcG9uZW50VHlwZSAqKnBwU0VDQ29tcG9uZW50KQoreworICAgIEZ1bmN0aW9uSW4oKTsKKworICAgIGlmIChwcFNFQ0NvbXBvbmVudCA9PSBOVUxMKSB7CisgICAgICAgIGdvdG8gRVhJVDsKKyAgICB9CisKKyAgICAvKiBjb21wb25lbnQgMSAtIHZpZGVvIGRlY29kZXIgV01WICovCisgICAgU0VDX09TQUxfU3RyY3B5KHBwU0VDQ29tcG9uZW50WzBdLT5jb21wb25lbnROYW1lLCBTRUNfT01YX0NPTVBPTkVOVF9XTVZfREVDKTsKKyAgICBTRUNfT1NBTF9TdHJjcHkocHBTRUNDb21wb25lbnRbMF0tPnJvbGVzWzBdLCBTRUNfT01YX0NPTVBPTkVOVF9XTVZfREVDX1JPTEUpOworICAgIHBwU0VDQ29tcG9uZW50WzBdLT50b3RhbFJvbGVOdW0gPSBNQVhfQ09NUE9ORU5UX1JPTEVfTlVNOworCitFWElUOgorICAgIEZ1bmN0aW9uT3V0KCk7CisgICAgcmV0dXJuIE1BWF9DT01QT05FTlRfTlVNOworfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2V4eW5vczQvbXVsdGltZWRpYS9vcGVubWF4L3NlY19vbXgvY29tcG9uZW50L3ZpZGVvL2RlYy92YzEvbGlicmFyeV9yZWdpc3Rlci5oIGIvZXh5bm9zNC9tdWx0aW1lZGlhL29wZW5tYXgvc2VjX29teC9jb21wb25lbnQvdmlkZW8vZGVjL3ZjMS9saWJyYXJ5X3JlZ2lzdGVyLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYWRhYzU4NgotLS0gL2Rldi9udWxsCisrKyBiL2V4eW5vczQvbXVsdGltZWRpYS9vcGVubWF4L3NlY19vbXgvY29tcG9uZW50L3ZpZGVvL2RlYy92YzEvbGlicmFyeV9yZWdpc3Rlci5oCkBAIC0wLDAgKzEsNTIgQEAKKy8qCisgKgorICogQ29weXJpZ2h0IDIwMTAgU2Ftc3VuZyBFbGVjdHJvbmljcyBTLkxTSSBDby4gTFRECisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKy8qCisgKiBAZmlsZSAgICBsaWJyYXJ5X3JlZ2lzdGVyLmgKKyAqIEBicmllZgorICogQGF1dGhvciAgICBIeWVZZW9uIENodW5nIChoeWVvbi5jaHVuZy5jaHVuZ0BzYW1zdW5nLmNvbSkKKyAqIEB2ZXJzaW9uICAgIDEuMS4wCisgKiBAaGlzdG9yeQorICogICAyMDEwLjcuMTUgOiBDcmVhdGUKKyAqLworCisjaWZuZGVmIFNFQ19PTVhfV01WX0RFQ19SRUcKKyNkZWZpbmUgU0VDX09NWF9XTVZfREVDX1JFRworCisjaW5jbHVkZSAiU0VDX09NWF9EZWYuaCIKKyNpbmNsdWRlICJPTVhfQ29tcG9uZW50LmgiCisjaW5jbHVkZSAiU0VDX09NWF9Db21wb25lbnRfUmVnaXN0ZXIuaCIKKworI2RlZmluZSBPU0NMX0VYUE9SVF9SRUYgX19hdHRyaWJ1dGVfXygodmlzaWJpbGl0eSgiZGVmYXVsdCIpKSkKKyNkZWZpbmUgTUFYX0NPTVBPTkVOVF9OVU0gICAgICAgICAgICAgIDEKKyNkZWZpbmUgTUFYX0NPTVBPTkVOVF9ST0xFX05VTSAgICAxCisKKy8qIFdNViAqLworI2RlZmluZSBTRUNfT01YX0NPTVBPTkVOVF9XTVZfREVDICAgICAgICAgIk9NWC5TRUMuV01WLkRlY29kZXIiCisjZGVmaW5lIFNFQ19PTVhfQ09NUE9ORU5UX1dNVl9ERUNfUk9MRSAgICAidmlkZW9fZGVjb2Rlci53bXYiCisKKyNpZmRlZiBfX2NwbHVzcGx1cworZXh0ZXJuICJDIiB7CisjZW5kaWYKKworT1NDTF9FWFBPUlRfUkVGIGludCBTRUNfT01YX0NPTVBPTkVOVF9MaWJyYXJ5X1JlZ2lzdGVyKFNFQ1JlZ2lzdGVyQ29tcG9uZW50VHlwZSAqKnBwU0VDQ29tcG9uZW50KTsKKworI2lmZGVmIF9fY3BsdXNwbHVzCit9OworI2VuZGlmCisKKyNlbmRpZgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2V4eW5vczQvbXVsdGltZWRpYS9vcGVubWF4L3NlY19vbXgvY29tcG9uZW50L3ZpZGVvL2RlYy92cDgvQW5kcm9pZC5tayBiL2V4eW5vczQvbXVsdGltZWRpYS9vcGVubWF4L3NlY19vbXgvY29tcG9uZW50L3ZpZGVvL2RlYy92cDgvQW5kcm9pZC5tawpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xY2VkMzgyCi0tLSAvZGV2L251bGwKKysrIGIvZXh5bm9zNC9tdWx0aW1lZGlhL29wZW5tYXgvc2VjX29teC9jb21wb25lbnQvdmlkZW8vZGVjL3ZwOC9BbmRyb2lkLm1rCkBAIC0wLDAgKzEsNjUgQEAKK0xPQ0FMX1BBVEggOj0gJChjYWxsIG15LWRpcikKK2luY2x1ZGUgJChDTEVBUl9WQVJTKQorCitMT0NBTF9NT0RVTEVfVEFHUyA6PSBvcHRpb25hbAorCitMT0NBTF9TUkNfRklMRVMgOj0gXAorCVNFQ19PTVhfVnA4ZGVjLmMgXAorCWxpYnJhcnlfcmVnaXN0ZXIuYworCitMT0NBTF9QUkVMSU5LX01PRFVMRSA6PSBmYWxzZQorTE9DQUxfTU9EVUxFIDo9IGxpYk9NWC5TRUMuVlA4LkRlY29kZXIKK0xPQ0FMX01PRFVMRV9QQVRIIDo9ICQoVEFSR0VUX09VVF9TSEFSRURfTElCUkFSSUVTKS9vbXgKKworTE9DQUxfQ0ZMQUdTIDo9CisKK2lmZXEgKCQoQk9BUkRfTk9OQkxPQ0tfTU9ERV9QUk9DRVNTKSwgdHJ1ZSkKK0xPQ0FMX0NGTEFHUyArPSAtRE5PTkJMT0NLX01PREVfUFJPQ0VTUworZW5kaWYKKworaWZlcSAoJChCT0FSRF9VU0VfQU5CKSwgdHJ1ZSkKK0xPQ0FMX0NGTEFHUyArPSAtRFVTRV9BTkIKK2lmZXEgKCQoQk9BUkRfVVNFX0NTQ19GSU1DKSwgdHJ1ZSkKK2lmZXEgKCQoQk9BUkRfVVNFX1Y0TDJfSU9OKSwgZmFsc2UpCitMT0NBTF9DRkxBR1MgKz0gLURVU0VfQ1NDX0ZJTUMKK2VuZGlmCitlbmRpZgorCitpZmVxICgkKEJPQVJEX1VTRV9DU0NfR1NDQUxFUiksIHRydWUpCitMT0NBTF9DRkxBR1MgKz0gLURVU0VfQ1NDX0dTQ0FMRVIKK2VuZGlmCitlbmRpZgorCitMT0NBTF9BUk1fTU9ERSA6PSBhcm0KKworTE9DQUxfU1RBVElDX0xJQlJBUklFUyA6PSBsaWJTRUNfT01YX1ZkZWMgbGlic2Vjb3NhbCBsaWJzZWNiYXNlY29tcG9uZW50IFwKKwlsaWJzd2NvbnZlcnRlciBsaWJzZWNtZmNhcGkKK0xPQ0FMX1NIQVJFRF9MSUJSQVJJRVMgOj0gbGliYyBsaWJkbCBsaWJjdXRpbHMgbGlidXRpbHMgbGlidWkgXAorCWxpYlNFQ19PTVhfUmVzb3VyY2VtYW5hZ2VyIGxpYmNzYworCitpZmVxICgkKGZpbHRlci1vdXQgZXh5bm9zNCwkKFRBUkdFVF9CT0FSRF9QTEFURk9STSkpLCkKK0xPQ0FMX1NIQVJFRF9MSUJSQVJJRVMgKz0gbGliZmltYyBsaWJod2NvbnZlcnRlcgorZW5kaWYKKworaWZlcSAoJChmaWx0ZXItb3V0IGV4eW5vczUsJChUQVJHRVRfQk9BUkRfUExBVEZPUk0pKSwpCitMT0NBTF9TSEFSRURfTElCUkFSSUVTICs9IGxpYmV4eW5vc2dzY2FsZXIKK2VuZGlmCisKKyNpZmVxICgkKEJPQVJEX1VTRV9WNEwyX0lPTiksdHJ1ZSkKKyNMT0NBTF9TSEFSRURfTElCUkFSSUVTICs9IGxpYmlvbgorI2VuZGlmCisKK2lmZXEgKCQoQk9BUkRfVVNFU19NRkNfRlBTKSx0cnVlKQorTE9DQUxfQ0ZMQUdTICs9IC1EQ09ORklHX01GQ19GUFMKK2VuZGlmCisKK0xPQ0FMX0NfSU5DTFVERVMgOj0gJChTRUNfT01YX0lOQykva2hyb25vcyBcCisJJChTRUNfT01YX0lOQykvc2VjIFwKKwkkKFNFQ19PTVhfVE9QKS9vc2FsIFwKKwkkKFNFQ19PTVhfVE9QKS9jb3JlIFwKKwkkKFNFQ19PTVhfQ09NUE9ORU5UKS9jb21tb24gXAorCSQoU0VDX09NWF9DT01QT05FTlQpL3ZpZGVvL2RlYyBcCisJJChUQVJHRVRfT1VUX0hFQURFUlMpLyQoU0VDX0NPUFlfSEVBREVSU19UTykgXAorCSQoQk9BUkRfSEFMX1BBVEgpL2luY2x1ZGUKKworaW5jbHVkZSAkKEJVSUxEX1NIQVJFRF9MSUJSQVJZKQpkaWZmIC0tZ2l0IGEvZXh5bm9zNC9tdWx0aW1lZGlhL29wZW5tYXgvc2VjX29teC9jb21wb25lbnQvdmlkZW8vZGVjL3ZwOC9TRUNfT01YX1ZwOGRlYy5jIGIvZXh5bm9zNC9tdWx0aW1lZGlhL29wZW5tYXgvc2VjX29teC9jb21wb25lbnQvdmlkZW8vZGVjL3ZwOC9TRUNfT01YX1ZwOGRlYy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjVhYzkxZDUKLS0tIC9kZXYvbnVsbAorKysgYi9leHlub3M0L211bHRpbWVkaWEvb3Blbm1heC9zZWNfb214L2NvbXBvbmVudC92aWRlby9kZWMvdnA4L1NFQ19PTVhfVnA4ZGVjLmMKQEAgLTAsMCArMSwxNjY1IEBACisvKgorICoKKyAqIENvcHlyaWdodCAyMDExIFNhbXN1bmcgRWxlY3Ryb25pY3MgUy5MU0kgQ28uIExURAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisvKgorICogQGZpbGUgICAgICAgIFNFQ19PTVhfVnA4ZGVjLmMKKyAqIEBicmllZgorICogQGF1dGhvciAgICAgIFNhdGlzaCBLdW1hciBSZWRkeSAocGFsbGkuc2F0aXNoQHNhbXN1bmcuY29tKQorICogQHZlcnNpb24gICAgIDEuMS4wCisgKiBAaGlzdG9yeQorICogICAyMDExLjExLjE1IDogQ3JlYXRlCisgKi8KKworI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8c3RkbGliLmg+CisjaW5jbHVkZSA8c3RyaW5nLmg+CisKKyNpbmNsdWRlICJTRUNfT01YX01hY3Jvcy5oIgorI2luY2x1ZGUgIlNFQ19PTVhfQmFzZWNvbXBvbmVudC5oIgorI2luY2x1ZGUgIlNFQ19PTVhfQmFzZXBvcnQuaCIKKyNpbmNsdWRlICJTRUNfT01YX1ZkZWMuaCIKKyNpbmNsdWRlICJTRUNfT1NBTF9FVEMuaCIKKyNpbmNsdWRlICJTRUNfT1NBTF9TZW1hcGhvcmUuaCIKKyNpbmNsdWRlICJTRUNfT1NBTF9UaHJlYWQuaCIKKyNpbmNsdWRlICJsaWJyYXJ5X3JlZ2lzdGVyLmgiCisjaW5jbHVkZSAiU0VDX09NWF9WcDhkZWMuaCIKKyNpbmNsdWRlICJTc2JTaXBNZmNBcGkuaCIKKworI2lmZGVmIFVTRV9BTkIKKyNpbmNsdWRlICJTRUNfT1NBTF9BbmRyb2lkLmgiCisjZW5kaWYKKworLyogVG8gdXNlIENTQ19NRVRIT0RfUFJFRkVSX0hXIG9yIENTQ19NRVRIT0RfSFcgaW4gU0VDIE9NWCwgZ3JhbGxvYyBzaG91bGQgYWxsb2NhdGUgcGh5c2ljYWwgbWVtb3J5IHVzaW5nIEZJTUMgKi8KKy8qIEl0IG1lYW5zIEdSQUxMT0NfVVNBR0VfSFdfRklNQzEgc2hvdWxkIGJlIHNldCBvbiBOYXRpdmUgV2luZG93IHVzYWdlICovCisjaW5jbHVkZSAiY3NjLmgiCisKKyN1bmRlZiAgU0VDX0xPR19UQUcKKyNkZWZpbmUgU0VDX0xPR19UQUcgICAgIlNFQ19WUDhfREVDIgorI2RlZmluZSBTRUNfTE9HX09GRgorI2luY2x1ZGUgIlNFQ19PU0FMX0xvZy5oIgorCisjZGVmaW5lIFZQOF9ERUNfTlVNX09GX0VYVFJBX0JVRkZFUlMgNworCisvLyNkZWZpbmUgRlVMTF9GUkFNRV9TRUFSQ0ggLyogRnVsbCBmcmFtZSBzZWFyY2ggbm90IHN1cHBvcnQqLworCitzdGF0aWMgaW50IENoZWNrX1ZQOF9GcmFtZShPTVhfVTggKnBJbnB1dFN0cmVhbSwgaW50IGJ1ZmZTaXplLCBPTVhfVTMyIGZsYWcsIE9NWF9CT09MIGJQcmV2aW91c0ZyYW1lRU9GLCBPTVhfQk9PTCAqcGJFbmRPZkZyYW1lKQoreworICAgIC8qIFVuY29tcHJlc3NlZCBkYXRhIENodW5rIGNvbXByaXNlcyBhIGNvbW1vbgorICAgIChmb3Iga2V5IGZyYW1lcyBhbmQgaW50ZXJmcmFtZXMpIDMtYnl0ZSBmcmFtZSB0YWcgdGhhdAorICAgIGNvbnRhaW5zIGZvdXIgZmllbGRzCisgICAgLSAxLWJpdCBmcmFtZSB0eXBlICgwIC0ga2V5IGZyYW1lLCAxIC0gaW50ZXIgZnJhbWUpCisgICAgLSAzLWJpdCB2ZXJzaW9uIG51bWJlciAoMCAtIDMgYXJlIGRlZmluZWQgYXMgZm91ciBkaWZmZXJlbnQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJvZmlsZXMgd2l0aCBkaWZmZXJlbnQgZGVjb2RpbmcgY29tcGxleGl0eSkKKyAgICAtIDEtYml0IHNob3dfZnJhbWUgZmxhZyAoIDAgLSBjdXJyZW50IGZyYW1lIG5vdCBmb3IgZGlzcGxheSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDEgLSBjdXJyZW50IGZyYW1lIGlzIGZvciBkaXNwYWx5KQorICAgIC0gMTktYml0IGZpZWxkIC0gc2l6ZSBvZiB0aGUgZmlyc3QgZGF0YSBwYXJ0aXRpb24gaW4gYnl0ZXMKKworICAgIEtleSBGcmFtZXMgOiBmcmFtZSB0YWcgZm9sbG93ZWQgYnkgNyBieXRlcyBvZiB1bmNvbXByZXNzZWQKKyAgICBkYXRhCisgICAgMy1ieXRlcyA6IFN0YXJ0IGNvZGUgKGJ5dGUgMDogMHg5ZCxieXRlIDE6IDB4MDEsYnl0ZSAyOiAweDJhKQorICAgIE5leHQgNC1ieXRlczogV2lkdGggJiBoZWlnaHQsIEhvcml6b250YWwgYW5kIHZlcnRpY2FsIHNjYWxlIGluZm9ybWF0aW9uCisgICAgMTYgYml0cyAgICAgIDogICAgICgyIGJpdHMgSG9yaXpvbnRhbCBTY2FsZSA8PCAxNCkgfCBXaWR0aCAoMTQgYml0cykKKyAgICAxNiBiaXRzICAgICAgOiAgICAgKDIgYml0cyBWZXJ0aWNhbCBTY2FsZSA8PCAxNCkgfCBIZWlnaHQgKDE0IGJpdHMpCisgICAgKi8KKyAgICBpbnQgd2lkdGgsIGhlaWdodDsKKyAgICBpbnQgaG9yaXpTc2NhbGUsIHZlcnRTY2FsZTsKKworICAgIEZ1bmN0aW9uSW4oKTsKKworICAgICpwYkVuZE9mRnJhbWUgPSBPTVhfVFJVRTsKKworICAgIC8qQ2hlY2sgZm9yIEtleSBmcmFtZSovCisgICAgaWYgKCEocElucHV0U3RyZWFtWzBdICYgMHgwMSkpeworICAgICAgICAvKiBLZXkgRnJhbWUgIFN0YXJ0IGNvZGUqLworICAgICAgICBpZiAocElucHV0U3RyZWFtWzNdICE9IDB4OWQgfHwgcElucHV0U3RyZWFtWzRdICE9IDB4MDEgfHwgcElucHV0U3RyZWFtWzVdIT0weDJhKSB7CisgICAgICAgICAgICBTRUNfT1NBTF9Mb2coU0VDX0xPR19FUlJPUiwgIiBWUDggS2V5IEZyYW1lIFN0YXJ0IENvZGUgbm90IEZvdW5kIik7CisgICAgICAgICAgICAqcGJFbmRPZkZyYW1lID0gT01YX0ZBTFNFOworICAgICAgICB9CisgICAgICAgIFNFQ19PU0FMX0xvZyhTRUNfTE9HX1RSQUNFLCAiIFZQOCBGb3VuZCBLZXkgRnJhbWUgU3RhcnQgQ29kZSIpOworICAgICAgICB3aWR0aCA9IChwSW5wdXRTdHJlYW1bNl0gfCAocElucHV0U3RyZWFtWzddIDw8IDgpKSAmIDB4M2ZmZjsKKyAgICAgICAgaG9yaXpTc2NhbGUgPSBwSW5wdXRTdHJlYW1bN10gPj4gNjsKKyAgICAgICAgaGVpZ2h0ID0gKHBJbnB1dFN0cmVhbVs4XSB8IChwSW5wdXRTdHJlYW1bOV0gPDwgOCkpICYgMHgzZmZmOworICAgICAgICB2ZXJ0U2NhbGUgPSBwSW5wdXRTdHJlYW1bOV0gPj4gNjsKKyAgICAgICAgU0VDX09TQUxfTG9nKFNFQ19MT0dfVFJBQ0UsICJ3aWR0aCA9ICVkLCBoZWlnaHQgPSAlZCwgaG9yaXpTc2NhbGUgPSAlZCwgdmVydFNjYWxlID0gJWQiLCB3aWR0aCwgaGVpZ2h0LCBob3JpelNzY2FsZSwgdmVydFNjYWxlKTsKKyAgICB9CisKKyAgICBGdW5jdGlvbk91dCgpOworICAgIHJldHVybiBidWZmU2l6ZTsKK30KKworT01YX0JPT0wgQ2hlY2tfVlA4X1N0YXJ0Q29kZShPTVhfVTggKnBJbnB1dFN0cmVhbSwgT01YX1UzMiBzdHJlYW1TaXplKQoreworICAgIFNFQ19PU0FMX0xvZyhTRUNfTE9HX1RSQUNFLCAic3RyZWFtU2l6ZTogJWQiLHN0cmVhbVNpemUpOworICAgIGlmIChzdHJlYW1TaXplIDwgMykgeworICAgICAgICByZXR1cm4gT01YX0ZBTFNFOworICAgIH0KKworICAgIGlmICghKHBJbnB1dFN0cmVhbVswXSAmIDB4MDEpKXsKKyAgICAgICAgLyogS2V5IEZyYW1lICBTdGFydCBjb2RlKi8KKyAgICAgICAgaWYgKHBJbnB1dFN0cmVhbVszXSAhPSAweDlkIHx8IHBJbnB1dFN0cmVhbVs0XSAhPSAweDAxIHx8IHBJbnB1dFN0cmVhbVs1XSE9MHgyYSkgeworICAgICAgICAgICAgU0VDX09TQUxfTG9nKFNFQ19MT0dfRVJST1IsICIgVlA4IEtleSBGcmFtZSBTdGFydCBDb2RlIG5vdCBGb3VuZCIpOworICAgICAgICAgICAgcmV0dXJuIE9NWF9GQUxTRTsKKyAgICAgICAgfQorICAgICAgICBTRUNfT1NBTF9Mb2coU0VDX0xPR19UUkFDRSwgIiBWUDggRm91bmQgS2V5IEZyYW1lIFN0YXJ0IENvZGUiKTsKKyAgICB9CisKKyAgICByZXR1cm4gT01YX1RSVUU7Cit9CisKK09NWF9FUlJPUlRZUEUgU0VDX01GQ19WUDhEZWNfR2V0UGFyYW1ldGVyKAorICAgIE9NWF9JTiBPTVhfSEFORExFVFlQRSBoQ29tcG9uZW50LAorICAgIE9NWF9JTiBPTVhfSU5ERVhUWVBFICBuUGFyYW1JbmRleCwKKyAgICBPTVhfSU5PVVQgT01YX1BUUiAgICAgcENvbXBvbmVudFBhcmFtZXRlclN0cnVjdHVyZSkKK3sKKyAgICBPTVhfRVJST1JUWVBFICAgICAgICAgIHJldCA9IE9NWF9FcnJvck5vbmU7CisgICAgT01YX0NPTVBPTkVOVFRZUEUgICAgICpwT01YQ29tcG9uZW50ID0gTlVMTDsKKyAgICBTRUNfT01YX0JBU0VDT01QT05FTlQgKnBTRUNDb21wb25lbnQgPSBOVUxMOworCisgICAgRnVuY3Rpb25JbigpOworCisgICAgaWYgKGhDb21wb25lbnQgPT0gTlVMTCB8fCBwQ29tcG9uZW50UGFyYW1ldGVyU3RydWN0dXJlID09IE5VTEwpIHsKKyAgICAgICAgcmV0ID0gT01YX0Vycm9yQmFkUGFyYW1ldGVyOworICAgICAgICBnb3RvIEVYSVQ7CisgICAgfQorICAgIHBPTVhDb21wb25lbnQgPSAoT01YX0NPTVBPTkVOVFRZUEUgKiloQ29tcG9uZW50OworICAgIHJldCA9IFNFQ19PTVhfQ2hlY2tfU2l6ZVZlcnNpb24ocE9NWENvbXBvbmVudCwgc2l6ZW9mKE9NWF9DT01QT05FTlRUWVBFKSk7CisgICAgaWYgKHJldCAhPSBPTVhfRXJyb3JOb25lKSB7CisgICAgICAgIGdvdG8gRVhJVDsKKyAgICB9CisgICAgaWYgKHBPTVhDb21wb25lbnQtPnBDb21wb25lbnRQcml2YXRlID09IE5VTEwpIHsKKyAgICAgICAgcmV0ID0gT01YX0Vycm9yQmFkUGFyYW1ldGVyOworICAgICAgICBnb3RvIEVYSVQ7CisgICAgfQorCisgICAgcFNFQ0NvbXBvbmVudCA9IChTRUNfT01YX0JBU0VDT01QT05FTlQgKilwT01YQ29tcG9uZW50LT5wQ29tcG9uZW50UHJpdmF0ZTsKKyAgICBpZiAocFNFQ0NvbXBvbmVudC0+Y3VycmVudFN0YXRlID09IE9NWF9TdGF0ZUludmFsaWQgKSB7CisgICAgICAgIHJldCA9IE9NWF9FcnJvckludmFsaWRTdGF0ZTsKKyAgICAgICAgZ290byBFWElUOworICAgIH0KKworICAgIHN3aXRjaCAoblBhcmFtSW5kZXgpIHsKKyAgICBjYXNlIE9NWF9JbmRleFBhcmFtU3RhbmRhcmRDb21wb25lbnRSb2xlOgorICAgIHsKKyAgICAgICAgT01YX1BBUkFNX0NPTVBPTkVOVFJPTEVUWVBFICpwQ29tcG9uZW50Um9sZSA9IChPTVhfUEFSQU1fQ09NUE9ORU5UUk9MRVRZUEUgKilwQ29tcG9uZW50UGFyYW1ldGVyU3RydWN0dXJlOworICAgICAgICByZXQgPSBTRUNfT01YX0NoZWNrX1NpemVWZXJzaW9uKHBDb21wb25lbnRSb2xlLCBzaXplb2YoT01YX1BBUkFNX0NPTVBPTkVOVFJPTEVUWVBFKSk7CisgICAgICAgIGlmIChyZXQgIT0gT01YX0Vycm9yTm9uZSkgeworICAgICAgICAgICAgZ290byBFWElUOworICAgICAgICB9CisKKyAgICAgICAgU0VDX09TQUxfU3RyY3B5KChjaGFyICopcENvbXBvbmVudFJvbGUtPmNSb2xlLCBTRUNfT01YX0NPTVBPTkVOVF9WUDhfREVDX1JPTEUpOworICAgIH0KKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBPTVhfSW5kZXhQYXJhbVZpZGVvRXJyb3JDb3JyZWN0aW9uOgorICAgIHsKKyAgICAgICAgT01YX1ZJREVPX1BBUkFNX0VSUk9SQ09SUkVDVElPTlRZUEUgKnBEc3RFcnJvckNvcnJlY3Rpb25UeXBlID0gKE9NWF9WSURFT19QQVJBTV9FUlJPUkNPUlJFQ1RJT05UWVBFICopcENvbXBvbmVudFBhcmFtZXRlclN0cnVjdHVyZTsKKyAgICAgICAgT01YX1ZJREVPX1BBUkFNX0VSUk9SQ09SUkVDVElPTlRZUEUgKnBTcmNFcnJvckNvcnJlY3Rpb25UeXBlID0gTlVMTDsKKyAgICAgICAgU0VDX1ZQOERFQ19IQU5ETEUgICAgICAqcFZwOERlYyA9IE5VTEw7CisKKyAgICAgICAgcmV0ID0gU0VDX09NWF9DaGVja19TaXplVmVyc2lvbihwRHN0RXJyb3JDb3JyZWN0aW9uVHlwZSwgc2l6ZW9mKE9NWF9WSURFT19QQVJBTV9FUlJPUkNPUlJFQ1RJT05UWVBFKSk7CisgICAgICAgIGlmIChyZXQgIT0gT01YX0Vycm9yTm9uZSkgeworICAgICAgICAgICAgZ290byBFWElUOworICAgICAgICB9CisKKyAgICAgICAgaWYgKHBEc3RFcnJvckNvcnJlY3Rpb25UeXBlLT5uUG9ydEluZGV4ICE9IElOUFVUX1BPUlRfSU5ERVgpIHsKKyAgICAgICAgICAgIHJldCA9IE9NWF9FcnJvckJhZFBvcnRJbmRleDsKKyAgICAgICAgICAgIGdvdG8gRVhJVDsKKyAgICAgICAgfQorCisgICAgICAgIHBWcDhEZWMgPSAoU0VDX1ZQOERFQ19IQU5ETEUgKikoKFNFQ19PTVhfVklERU9ERUNfQ09NUE9ORU5UICopcFNFQ0NvbXBvbmVudC0+aENvbXBvbmVudEhhbmRsZSktPmhDb2RlY0hhbmRsZTsKKyAgICAgICAgcFNyY0Vycm9yQ29ycmVjdGlvblR5cGUgPSAmcFZwOERlYy0+ZXJyb3JDb3JyZWN0aW9uVHlwZVtJTlBVVF9QT1JUX0lOREVYXTsKKworICAgICAgICBwRHN0RXJyb3JDb3JyZWN0aW9uVHlwZS0+YkVuYWJsZUhFQyA9IHBTcmNFcnJvckNvcnJlY3Rpb25UeXBlLT5iRW5hYmxlSEVDOworICAgICAgICBwRHN0RXJyb3JDb3JyZWN0aW9uVHlwZS0+YkVuYWJsZVJlc3luYyA9IHBTcmNFcnJvckNvcnJlY3Rpb25UeXBlLT5iRW5hYmxlUmVzeW5jOworICAgICAgICBwRHN0RXJyb3JDb3JyZWN0aW9uVHlwZS0+blJlc3luY2hNYXJrZXJTcGFjaW5nID0gcFNyY0Vycm9yQ29ycmVjdGlvblR5cGUtPm5SZXN5bmNoTWFya2VyU3BhY2luZzsKKyAgICAgICAgcERzdEVycm9yQ29ycmVjdGlvblR5cGUtPmJFbmFibGVEYXRhUGFydGl0aW9uaW5nID0gcFNyY0Vycm9yQ29ycmVjdGlvblR5cGUtPmJFbmFibGVEYXRhUGFydGl0aW9uaW5nOworICAgICAgICBwRHN0RXJyb3JDb3JyZWN0aW9uVHlwZS0+YkVuYWJsZVJWTEMgPSBwU3JjRXJyb3JDb3JyZWN0aW9uVHlwZS0+YkVuYWJsZVJWTEM7CisgICAgfQorICAgICAgICBicmVhazsKKyAgICBkZWZhdWx0OgorICAgICAgICByZXQgPSBTRUNfT01YX1ZpZGVvRGVjb2RlR2V0UGFyYW1ldGVyKGhDb21wb25lbnQsIG5QYXJhbUluZGV4LCBwQ29tcG9uZW50UGFyYW1ldGVyU3RydWN0dXJlKTsKKyAgICAgICAgYnJlYWs7CisgICAgfQorRVhJVDoKKyAgICBGdW5jdGlvbk91dCgpOworCisgICAgcmV0dXJuIHJldDsKK30KKworT01YX0VSUk9SVFlQRSBTRUNfTUZDX1ZQOERlY19TZXRQYXJhbWV0ZXIoCisgICAgT01YX0lOIE9NWF9IQU5ETEVUWVBFIGhDb21wb25lbnQsCisgICAgT01YX0lOIE9NWF9JTkRFWFRZUEUgIG5JbmRleCwKKyAgICBPTVhfSU4gT01YX1BUUiAgICAgICAgcENvbXBvbmVudFBhcmFtZXRlclN0cnVjdHVyZSkKK3sKKyAgICBPTVhfRVJST1JUWVBFICAgICAgICAgICByZXQgPSBPTVhfRXJyb3JOb25lOworICAgIE9NWF9DT01QT05FTlRUWVBFICAgICAqcE9NWENvbXBvbmVudCA9IE5VTEw7CisgICAgU0VDX09NWF9CQVNFQ09NUE9ORU5UICpwU0VDQ29tcG9uZW50ID0gTlVMTDsKKworICAgIEZ1bmN0aW9uSW4oKTsKKworICAgIGlmIChoQ29tcG9uZW50ID09IE5VTEwgfHwgcENvbXBvbmVudFBhcmFtZXRlclN0cnVjdHVyZSA9PSBOVUxMKSB7CisgICAgICAgIHJldCA9IE9NWF9FcnJvckJhZFBhcmFtZXRlcjsKKyAgICAgICAgZ290byBFWElUOworICAgIH0KKyAgICBwT01YQ29tcG9uZW50ID0gKE9NWF9DT01QT05FTlRUWVBFICopaENvbXBvbmVudDsKKyAgICByZXQgPSBTRUNfT01YX0NoZWNrX1NpemVWZXJzaW9uKHBPTVhDb21wb25lbnQsIHNpemVvZihPTVhfQ09NUE9ORU5UVFlQRSkpOworICAgIGlmIChyZXQgIT0gT01YX0Vycm9yTm9uZSkgeworICAgICAgICBnb3RvIEVYSVQ7CisgICAgfQorICAgIGlmIChwT01YQ29tcG9uZW50LT5wQ29tcG9uZW50UHJpdmF0ZSA9PSBOVUxMKSB7CisgICAgICAgIHJldCA9IE9NWF9FcnJvckJhZFBhcmFtZXRlcjsKKyAgICAgICAgZ290byBFWElUOworICAgIH0KKworICAgIHBTRUNDb21wb25lbnQgPSAoU0VDX09NWF9CQVNFQ09NUE9ORU5UICopcE9NWENvbXBvbmVudC0+cENvbXBvbmVudFByaXZhdGU7CisgICAgaWYgKHBTRUNDb21wb25lbnQtPmN1cnJlbnRTdGF0ZSA9PSBPTVhfU3RhdGVJbnZhbGlkICkgeworICAgICAgICByZXQgPSBPTVhfRXJyb3JJbnZhbGlkU3RhdGU7CisgICAgICAgIGdvdG8gRVhJVDsKKyAgICB9CisKKyAgICBzd2l0Y2ggKG5JbmRleCkgeworICAgIGNhc2UgT01YX0luZGV4UGFyYW1TdGFuZGFyZENvbXBvbmVudFJvbGU6CisgICAgeworICAgICAgICBPTVhfUEFSQU1fQ09NUE9ORU5UUk9MRVRZUEUgKnBDb21wb25lbnRSb2xlID0gKE9NWF9QQVJBTV9DT01QT05FTlRST0xFVFlQRSopcENvbXBvbmVudFBhcmFtZXRlclN0cnVjdHVyZTsKKworICAgICAgICByZXQgPSBTRUNfT01YX0NoZWNrX1NpemVWZXJzaW9uKHBDb21wb25lbnRSb2xlLCBzaXplb2YoT01YX1BBUkFNX0NPTVBPTkVOVFJPTEVUWVBFKSk7CisgICAgICAgIGlmIChyZXQgIT0gT01YX0Vycm9yTm9uZSkgeworICAgICAgICAgICAgZ290byBFWElUOworICAgICAgICB9CisKKyAgICAgICAgaWYgKChwU0VDQ29tcG9uZW50LT5jdXJyZW50U3RhdGUgIT0gT01YX1N0YXRlTG9hZGVkKSAmJiAocFNFQ0NvbXBvbmVudC0+Y3VycmVudFN0YXRlICE9IE9NWF9TdGF0ZVdhaXRGb3JSZXNvdXJjZXMpKSB7CisgICAgICAgICAgICByZXQgPSBPTVhfRXJyb3JJbmNvcnJlY3RTdGF0ZU9wZXJhdGlvbjsKKyAgICAgICAgICAgIGdvdG8gRVhJVDsKKyAgICAgICAgfQorCisgICAgICAgIGlmICghU0VDX09TQUxfU3RyY21wKChjaGFyKilwQ29tcG9uZW50Um9sZS0+Y1JvbGUsIFNFQ19PTVhfQ09NUE9ORU5UX1ZQOF9ERUNfUk9MRSkpIHsKKyAgICAgICAgICAgIHBTRUNDb21wb25lbnQtPnBTRUNQb3J0W0lOUFVUX1BPUlRfSU5ERVhdLnBvcnREZWZpbml0aW9uLmZvcm1hdC52aWRlby5lQ29tcHJlc3Npb25Gb3JtYXQgPSBPTVhfVklERU9fQ29kaW5nVlBYOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgcmV0ID0gT01YX0Vycm9yQmFkUGFyYW1ldGVyOworICAgICAgICAgICAgZ290byBFWElUOworICAgICAgICB9CisgICAgfQorICAgICAgICBicmVhazsKKyAgICBjYXNlIE9NWF9JbmRleFBhcmFtUG9ydERlZmluaXRpb246CisgICAgeworICAgICAgICBPTVhfUEFSQU1fUE9SVERFRklOSVRJT05UWVBFICpwUG9ydERlZmluaXRpb24gPSAoT01YX1BBUkFNX1BPUlRERUZJTklUSU9OVFlQRSAqKXBDb21wb25lbnRQYXJhbWV0ZXJTdHJ1Y3R1cmU7CisgICAgICAgIE9NWF9VMzIgICAgICAgICAgICAgICAgICAgICAgIHBvcnRJbmRleCA9IHBQb3J0RGVmaW5pdGlvbi0+blBvcnRJbmRleDsKKyAgICAgICAgU0VDX09NWF9CQVNFUE9SVCAgICAgICAgICAgICAqcFNFQ1BvcnQ7CisgICAgICAgIE9NWF9VMzIgd2lkdGgsIGhlaWdodCwgc2l6ZTsKKyAgICAgICAgT01YX1UzMiByZWFsV2lkdGgsIHJlYWxIZWlnaHQ7CisKKyAgICAgICAgaWYgKHBvcnRJbmRleCA+PSBwU0VDQ29tcG9uZW50LT5wb3J0UGFyYW0ublBvcnRzKSB7CisgICAgICAgICAgICByZXQgPSBPTVhfRXJyb3JCYWRQb3J0SW5kZXg7CisgICAgICAgICAgICBnb3RvIEVYSVQ7CisgICAgICAgIH0KKyAgICAgICAgcmV0ID0gU0VDX09NWF9DaGVja19TaXplVmVyc2lvbihwUG9ydERlZmluaXRpb24sIHNpemVvZihPTVhfUEFSQU1fUE9SVERFRklOSVRJT05UWVBFKSk7CisgICAgICAgIGlmIChyZXQgIT0gT01YX0Vycm9yTm9uZSkgeworICAgICAgICAgICAgZ290byBFWElUOworICAgICAgICB9CisKKyAgICAgICAgcFNFQ1BvcnQgPSAmcFNFQ0NvbXBvbmVudC0+cFNFQ1BvcnRbcG9ydEluZGV4XTsKKworICAgICAgICBpZiAoKHBTRUNDb21wb25lbnQtPmN1cnJlbnRTdGF0ZSAhPSBPTVhfU3RhdGVMb2FkZWQpICYmIChwU0VDQ29tcG9uZW50LT5jdXJyZW50U3RhdGUgIT0gT01YX1N0YXRlV2FpdEZvclJlc291cmNlcykpIHsKKyAgICAgICAgICAgIGlmIChwU0VDUG9ydC0+cG9ydERlZmluaXRpb24uYkVuYWJsZWQgPT0gT01YX1RSVUUpIHsKKyAgICAgICAgICAgICAgICByZXQgPSBPTVhfRXJyb3JJbmNvcnJlY3RTdGF0ZU9wZXJhdGlvbjsKKyAgICAgICAgICAgICAgICBnb3RvIEVYSVQ7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgaWYgKHBQb3J0RGVmaW5pdGlvbi0+bkJ1ZmZlckNvdW50QWN0dWFsIDwgcFNFQ1BvcnQtPnBvcnREZWZpbml0aW9uLm5CdWZmZXJDb3VudE1pbikgeworICAgICAgICAgICAgcmV0ID0gT01YX0Vycm9yQmFkUGFyYW1ldGVyOworICAgICAgICAgICAgZ290byBFWElUOworICAgICAgICB9CisKKyAgICAgICAgU0VDX09TQUxfTWVtY3B5KCZwU0VDUG9ydC0+cG9ydERlZmluaXRpb24sIHBQb3J0RGVmaW5pdGlvbiwgcFBvcnREZWZpbml0aW9uLT5uU2l6ZSk7CisKKyAgICAgICAgcmVhbFdpZHRoID0gcFNFQ1BvcnQtPnBvcnREZWZpbml0aW9uLmZvcm1hdC52aWRlby5uRnJhbWVXaWR0aDsKKyAgICAgICAgcmVhbEhlaWdodCA9IHBTRUNQb3J0LT5wb3J0RGVmaW5pdGlvbi5mb3JtYXQudmlkZW8ubkZyYW1lSGVpZ2h0OworICAgICAgICB3aWR0aCA9ICgocmVhbFdpZHRoICsgMTUpICYgKH4xNSkpOworICAgICAgICBoZWlnaHQgPSAoKHJlYWxIZWlnaHQgKyAxNSkgJiAofjE1KSk7CisgICAgICAgIHNpemUgPSAod2lkdGggKiBoZWlnaHQgKiAzKSAvIDI7CisgICAgICAgIHBTRUNQb3J0LT5wb3J0RGVmaW5pdGlvbi5mb3JtYXQudmlkZW8ublN0cmlkZSA9IHdpZHRoOworICAgICAgICBwU0VDUG9ydC0+cG9ydERlZmluaXRpb24uZm9ybWF0LnZpZGVvLm5TbGljZUhlaWdodCA9IGhlaWdodDsKKyAgICAgICAgcFNFQ1BvcnQtPnBvcnREZWZpbml0aW9uLm5CdWZmZXJTaXplID0gKHNpemUgPiBwU0VDUG9ydC0+cG9ydERlZmluaXRpb24ubkJ1ZmZlclNpemUpID8gc2l6ZSA6IHBTRUNQb3J0LT5wb3J0RGVmaW5pdGlvbi5uQnVmZmVyU2l6ZTsKKworICAgICAgICBpZiAocG9ydEluZGV4ID09IElOUFVUX1BPUlRfSU5ERVgpIHsKKyAgICAgICAgICAgIFNFQ19PTVhfQkFTRVBPUlQgKnBTRUNPdXRwdXRQb3J0ID0gJnBTRUNDb21wb25lbnQtPnBTRUNQb3J0W09VVFBVVF9QT1JUX0lOREVYXTsKKyAgICAgICAgICAgIHBTRUNPdXRwdXRQb3J0LT5wb3J0RGVmaW5pdGlvbi5mb3JtYXQudmlkZW8ubkZyYW1lV2lkdGggPSBwU0VDUG9ydC0+cG9ydERlZmluaXRpb24uZm9ybWF0LnZpZGVvLm5GcmFtZVdpZHRoOworICAgICAgICAgICAgcFNFQ091dHB1dFBvcnQtPnBvcnREZWZpbml0aW9uLmZvcm1hdC52aWRlby5uRnJhbWVIZWlnaHQgPSBwU0VDUG9ydC0+cG9ydERlZmluaXRpb24uZm9ybWF0LnZpZGVvLm5GcmFtZUhlaWdodDsKKyAgICAgICAgICAgIHBTRUNPdXRwdXRQb3J0LT5wb3J0RGVmaW5pdGlvbi5mb3JtYXQudmlkZW8ublN0cmlkZSA9IHdpZHRoOworICAgICAgICAgICAgcFNFQ091dHB1dFBvcnQtPnBvcnREZWZpbml0aW9uLmZvcm1hdC52aWRlby5uU2xpY2VIZWlnaHQgPSBoZWlnaHQ7CisKKyAgICAgICAgICAgIHN3aXRjaCAocFNFQ091dHB1dFBvcnQtPnBvcnREZWZpbml0aW9uLmZvcm1hdC52aWRlby5lQ29sb3JGb3JtYXQpIHsKKyAgICAgICAgICAgIGNhc2UgT01YX0NPTE9SX0Zvcm1hdFlVVjQyMFBsYW5hcjoKKyAgICAgICAgICAgIGNhc2UgT01YX0NPTE9SX0Zvcm1hdFlVVjQyMFNlbWlQbGFuYXI6CisgICAgICAgICAgICBjYXNlIE9NWF9TRUNfQ09MT1JfRm9ybWF0TlYxMlRQaHlzaWNhbEFkZHJlc3M6CisgICAgICAgICAgICBjYXNlIE9NWF9TRUNfQ09MT1JfRm9ybWF0QU5CWVVWNDIwU2VtaVBsYW5hcjoKKyAgICAgICAgICAgICAgICBwU0VDT3V0cHV0UG9ydC0+cG9ydERlZmluaXRpb24ubkJ1ZmZlclNpemUgPSAod2lkdGggKiBoZWlnaHQgKiAzKSAvIDI7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIE9NWF9TRUNfQ09MT1JfRm9ybWF0TlYxMlRpbGVkOgorICAgICAgICAgICAgICAgIHBTRUNPdXRwdXRQb3J0LT5wb3J0RGVmaW5pdGlvbi5uQnVmZmVyU2l6ZSA9CisgICAgICAgICAgICAgICAgICAgIEFMSUdOX1RPXzhLQihBTElHTl9UT18xMjhCKHJlYWxXaWR0aCkgKiBBTElHTl9UT18zMkIocmVhbEhlaWdodCkpIFwKKyAgICAgICAgICAgICAgICAgICsgQUxJR05fVE9fOEtCKEFMSUdOX1RPXzEyOEIocmVhbFdpZHRoKSAqIEFMSUdOX1RPXzMyQihyZWFsSGVpZ2h0LzIpKTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgU0VDX09TQUxfTG9nKFNFQ19MT0dfRVJST1IsICJDb2xvciBmb3JtYXQgaXMgbm90IHN1cHBvcnQhISB1c2UgZGVmYXVsdCBZVVYgc2l6ZSEhIik7CisgICAgICAgICAgICAgICAgcmV0ID0gT01YX0Vycm9yVW5zdXBwb3J0ZWRTZXR0aW5nOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorICAgICAgICBicmVhazsKKyAgICBjYXNlIE9NWF9JbmRleFBhcmFtVmlkZW9FcnJvckNvcnJlY3Rpb246CisgICAgeworICAgICAgICBPTVhfVklERU9fUEFSQU1fRVJST1JDT1JSRUNUSU9OVFlQRSAqcFNyY0Vycm9yQ29ycmVjdGlvblR5cGUgPSAoT01YX1ZJREVPX1BBUkFNX0VSUk9SQ09SUkVDVElPTlRZUEUgKilwQ29tcG9uZW50UGFyYW1ldGVyU3RydWN0dXJlOworICAgICAgICBPTVhfVklERU9fUEFSQU1fRVJST1JDT1JSRUNUSU9OVFlQRSAqcERzdEVycm9yQ29ycmVjdGlvblR5cGUgPSBOVUxMOworICAgICAgICBTRUNfVlA4REVDX0hBTkRMRSAgICAgICpwVnA4RGVjID0gTlVMTDsKKworICAgICAgICByZXQgPSBTRUNfT01YX0NoZWNrX1NpemVWZXJzaW9uKHBTcmNFcnJvckNvcnJlY3Rpb25UeXBlLCBzaXplb2YoT01YX1ZJREVPX1BBUkFNX0VSUk9SQ09SUkVDVElPTlRZUEUpKTsKKyAgICAgICAgaWYgKHJldCAhPSBPTVhfRXJyb3JOb25lKSB7CisgICAgICAgICAgICBnb3RvIEVYSVQ7CisgICAgICAgIH0KKworICAgICAgICBpZiAocFNyY0Vycm9yQ29ycmVjdGlvblR5cGUtPm5Qb3J0SW5kZXggIT0gSU5QVVRfUE9SVF9JTkRFWCkgeworICAgICAgICAgICAgcmV0ID0gT01YX0Vycm9yQmFkUG9ydEluZGV4OworICAgICAgICAgICAgZ290byBFWElUOworICAgICAgICB9CisKKyAgICAgICAgcFZwOERlYyA9IChTRUNfVlA4REVDX0hBTkRMRSAqKSgoU0VDX09NWF9WSURFT0RFQ19DT01QT05FTlQgKilwU0VDQ29tcG9uZW50LT5oQ29tcG9uZW50SGFuZGxlKS0+aENvZGVjSGFuZGxlOworICAgICAgICBwRHN0RXJyb3JDb3JyZWN0aW9uVHlwZSA9ICZwVnA4RGVjLT5lcnJvckNvcnJlY3Rpb25UeXBlW0lOUFVUX1BPUlRfSU5ERVhdOworCisgICAgICAgIHBEc3RFcnJvckNvcnJlY3Rpb25UeXBlLT5iRW5hYmxlSEVDID0gcFNyY0Vycm9yQ29ycmVjdGlvblR5cGUtPmJFbmFibGVIRUM7CisgICAgICAgIHBEc3RFcnJvckNvcnJlY3Rpb25UeXBlLT5iRW5hYmxlUmVzeW5jID0gcFNyY0Vycm9yQ29ycmVjdGlvblR5cGUtPmJFbmFibGVSZXN5bmM7CisgICAgICAgIHBEc3RFcnJvckNvcnJlY3Rpb25UeXBlLT5uUmVzeW5jaE1hcmtlclNwYWNpbmcgPSBwU3JjRXJyb3JDb3JyZWN0aW9uVHlwZS0+blJlc3luY2hNYXJrZXJTcGFjaW5nOworICAgICAgICBwRHN0RXJyb3JDb3JyZWN0aW9uVHlwZS0+YkVuYWJsZURhdGFQYXJ0aXRpb25pbmcgPSBwU3JjRXJyb3JDb3JyZWN0aW9uVHlwZS0+YkVuYWJsZURhdGFQYXJ0aXRpb25pbmc7CisgICAgICAgIHBEc3RFcnJvckNvcnJlY3Rpb25UeXBlLT5iRW5hYmxlUlZMQyA9IHBTcmNFcnJvckNvcnJlY3Rpb25UeXBlLT5iRW5hYmxlUlZMQzsKKyAgICB9CisgICAgICAgIGJyZWFrOworICAgIGRlZmF1bHQ6CisgICAgICAgIHJldCA9IFNFQ19PTVhfVmlkZW9EZWNvZGVTZXRQYXJhbWV0ZXIoaENvbXBvbmVudCwgbkluZGV4LCBwQ29tcG9uZW50UGFyYW1ldGVyU3RydWN0dXJlKTsKKyAgICAgICAgYnJlYWs7CisgICAgfQorRVhJVDoKKyAgICBGdW5jdGlvbk91dCgpOworCisgICAgcmV0dXJuIHJldDsKK30KKworT01YX0VSUk9SVFlQRSBTRUNfTUZDX1ZQOERlY19HZXRDb25maWcoCisgICAgT01YX0hBTkRMRVRZUEUgaENvbXBvbmVudCwKKyAgICBPTVhfSU5ERVhUWVBFIG5JbmRleCwKKyAgICBPTVhfUFRSIHBDb21wb25lbnRDb25maWdTdHJ1Y3R1cmUpCit7CisgICAgT01YX0VSUk9SVFlQRSAgICAgICAgICByZXQgPSBPTVhfRXJyb3JOb25lOworICAgIE9NWF9DT01QT05FTlRUWVBFICAgICAqcE9NWENvbXBvbmVudCA9IE5VTEw7CisgICAgU0VDX09NWF9CQVNFQ09NUE9ORU5UICpwU0VDQ29tcG9uZW50ID0gTlVMTDsKKworICAgIEZ1bmN0aW9uSW4oKTsKKworICAgIGlmIChoQ29tcG9uZW50ID09IE5VTEwpIHsKKyAgICAgICAgcmV0ID0gT01YX0Vycm9yQmFkUGFyYW1ldGVyOworICAgICAgICBnb3RvIEVYSVQ7CisgICAgfQorICAgIHBPTVhDb21wb25lbnQgPSAoT01YX0NPTVBPTkVOVFRZUEUgKiloQ29tcG9uZW50OworICAgIHJldCA9IFNFQ19PTVhfQ2hlY2tfU2l6ZVZlcnNpb24ocE9NWENvbXBvbmVudCwgc2l6ZW9mKE9NWF9DT01QT05FTlRUWVBFKSk7CisgICAgaWYgKHJldCAhPSBPTVhfRXJyb3JOb25lKSB7CisgICAgICAgIGdvdG8gRVhJVDsKKyAgICB9CisKKyAgICBpZiAocE9NWENvbXBvbmVudC0+cENvbXBvbmVudFByaXZhdGUgPT0gTlVMTCkgeworICAgICAgICByZXQgPSBPTVhfRXJyb3JCYWRQYXJhbWV0ZXI7CisgICAgICAgIGdvdG8gRVhJVDsKKyAgICB9CisgICAgcFNFQ0NvbXBvbmVudCA9IChTRUNfT01YX0JBU0VDT01QT05FTlQgKilwT01YQ29tcG9uZW50LT5wQ29tcG9uZW50UHJpdmF0ZTsKKworICAgIGlmIChwQ29tcG9uZW50Q29uZmlnU3RydWN0dXJlID09IE5VTEwpIHsKKyAgICAgICAgcmV0ID0gT01YX0Vycm9yQmFkUGFyYW1ldGVyOworICAgICAgICBnb3RvIEVYSVQ7CisgICAgfQorICAgIGlmIChwU0VDQ29tcG9uZW50LT5jdXJyZW50U3RhdGUgPT0gT01YX1N0YXRlSW52YWxpZCkgeworICAgICAgICByZXQgPSBPTVhfRXJyb3JJbnZhbGlkU3RhdGU7CisgICAgICAgIGdvdG8gRVhJVDsKKyAgICB9CisKKyAgICBzd2l0Y2ggKG5JbmRleCkgeworICAgIGRlZmF1bHQ6CisgICAgICAgIHJldCA9IFNFQ19PTVhfVmlkZW9EZWNvZGVHZXRDb25maWcoaENvbXBvbmVudCwgbkluZGV4LCBwQ29tcG9uZW50Q29uZmlnU3RydWN0dXJlKTsKKyAgICAgICAgYnJlYWs7CisgICAgfQorCitFWElUOgorICAgIEZ1bmN0aW9uT3V0KCk7CisKKyAgICByZXR1cm4gcmV0OworfQorCitPTVhfRVJST1JUWVBFIFNFQ19NRkNfVlA4RGVjX1NldENvbmZpZygKKyAgICBPTVhfSEFORExFVFlQRSBoQ29tcG9uZW50LAorICAgIE9NWF9JTkRFWFRZUEUgbkluZGV4LAorICAgIE9NWF9QVFIgcENvbXBvbmVudENvbmZpZ1N0cnVjdHVyZSkKK3sKKyAgICBPTVhfRVJST1JUWVBFICAgICAgICAgICByZXQgPSBPTVhfRXJyb3JOb25lOworICAgIE9NWF9DT01QT05FTlRUWVBFICAgICAqcE9NWENvbXBvbmVudCA9IE5VTEw7CisgICAgU0VDX09NWF9CQVNFQ09NUE9ORU5UICpwU0VDQ29tcG9uZW50ID0gTlVMTDsKKworICAgIEZ1bmN0aW9uSW4oKTsKKworICAgIGlmIChoQ29tcG9uZW50ID09IE5VTEwpIHsKKyAgICAgICAgcmV0ID0gT01YX0Vycm9yQmFkUGFyYW1ldGVyOworICAgICAgICBnb3RvIEVYSVQ7CisgICAgfQorICAgIHBPTVhDb21wb25lbnQgPSAoT01YX0NPTVBPTkVOVFRZUEUgKiloQ29tcG9uZW50OworICAgIHJldCA9IFNFQ19PTVhfQ2hlY2tfU2l6ZVZlcnNpb24ocE9NWENvbXBvbmVudCwgc2l6ZW9mKE9NWF9DT01QT05FTlRUWVBFKSk7CisgICAgaWYgKHJldCAhPSBPTVhfRXJyb3JOb25lKSB7CisgICAgICAgIGdvdG8gRVhJVDsKKyAgICB9CisKKyAgICBpZiAocE9NWENvbXBvbmVudC0+cENvbXBvbmVudFByaXZhdGUgPT0gTlVMTCkgeworICAgICAgICByZXQgPSBPTVhfRXJyb3JCYWRQYXJhbWV0ZXI7CisgICAgICAgIGdvdG8gRVhJVDsKKyAgICB9CisgICAgcFNFQ0NvbXBvbmVudCA9IChTRUNfT01YX0JBU0VDT01QT05FTlQgKilwT01YQ29tcG9uZW50LT5wQ29tcG9uZW50UHJpdmF0ZTsKKworICAgIGlmIChwQ29tcG9uZW50Q29uZmlnU3RydWN0dXJlID09IE5VTEwpIHsKKyAgICAgICAgcmV0ID0gT01YX0Vycm9yQmFkUGFyYW1ldGVyOworICAgICAgICBnb3RvIEVYSVQ7CisgICAgfQorICAgIGlmIChwU0VDQ29tcG9uZW50LT5jdXJyZW50U3RhdGUgPT0gT01YX1N0YXRlSW52YWxpZCkgeworICAgICAgICByZXQgPSBPTVhfRXJyb3JJbnZhbGlkU3RhdGU7CisgICAgICAgIGdvdG8gRVhJVDsKKyAgICB9CisKKyAgICBzd2l0Y2ggKG5JbmRleCkgeworICAgIGRlZmF1bHQ6CisgICAgICAgIHJldCA9IFNFQ19PTVhfVmlkZW9EZWNvZGVTZXRDb25maWcoaENvbXBvbmVudCwgbkluZGV4LCBwQ29tcG9uZW50Q29uZmlnU3RydWN0dXJlKTsKKyAgICAgICAgYnJlYWs7CisgICAgfQorCitFWElUOgorICAgIEZ1bmN0aW9uT3V0KCk7CisKKyAgICByZXR1cm4gcmV0OworfQorCitPTVhfRVJST1JUWVBFIFNFQ19NRkNfVlA4RGVjX0dldEV4dGVuc2lvbkluZGV4KAorICAgIE9NWF9JTiBPTVhfSEFORExFVFlQRSAgaENvbXBvbmVudCwKKyAgICBPTVhfSU4gT01YX1NUUklORyAgICAgIGNQYXJhbWV0ZXJOYW1lLAorICAgIE9NWF9PVVQgT01YX0lOREVYVFlQRSAqcEluZGV4VHlwZSkKK3sKKyAgICBPTVhfRVJST1JUWVBFICAgICAgICAgICByZXQgPSBPTVhfRXJyb3JOb25lOworICAgIE9NWF9DT01QT05FTlRUWVBFICAgICAqcE9NWENvbXBvbmVudCA9IE5VTEw7CisgICAgU0VDX09NWF9CQVNFQ09NUE9ORU5UICpwU0VDQ29tcG9uZW50ID0gTlVMTDsKKworICAgIEZ1bmN0aW9uSW4oKTsKKworICAgIGlmIChoQ29tcG9uZW50ID09IE5VTEwpIHsKKyAgICAgICAgcmV0ID0gT01YX0Vycm9yQmFkUGFyYW1ldGVyOworICAgICAgICBnb3RvIEVYSVQ7CisgICAgfQorICAgIHBPTVhDb21wb25lbnQgPSAoT01YX0NPTVBPTkVOVFRZUEUgKiloQ29tcG9uZW50OworICAgIHJldCA9IFNFQ19PTVhfQ2hlY2tfU2l6ZVZlcnNpb24ocE9NWENvbXBvbmVudCwgc2l6ZW9mKE9NWF9DT01QT05FTlRUWVBFKSk7CisgICAgaWYgKHJldCAhPSBPTVhfRXJyb3JOb25lKSB7CisgICAgICAgIGdvdG8gRVhJVDsKKyAgICB9CisKKyAgICBpZiAocE9NWENvbXBvbmVudC0+cENvbXBvbmVudFByaXZhdGUgPT0gTlVMTCkgeworICAgICAgICByZXQgPSBPTVhfRXJyb3JCYWRQYXJhbWV0ZXI7CisgICAgICAgIGdvdG8gRVhJVDsKKyAgICB9CisgICAgcFNFQ0NvbXBvbmVudCA9IChTRUNfT01YX0JBU0VDT01QT05FTlQgKilwT01YQ29tcG9uZW50LT5wQ29tcG9uZW50UHJpdmF0ZTsKKworICAgIGlmICgoY1BhcmFtZXRlck5hbWUgPT0gTlVMTCkgfHwgKHBJbmRleFR5cGUgPT0gTlVMTCkpIHsKKyAgICAgICAgcmV0ID0gT01YX0Vycm9yQmFkUGFyYW1ldGVyOworICAgICAgICBnb3RvIEVYSVQ7CisgICAgfQorICAgIGlmIChwU0VDQ29tcG9uZW50LT5jdXJyZW50U3RhdGUgPT0gT01YX1N0YXRlSW52YWxpZCkgeworICAgICAgICByZXQgPSBPTVhfRXJyb3JJbnZhbGlkU3RhdGU7CisgICAgICAgIGdvdG8gRVhJVDsKKyAgICB9CisKKyAgICBpZiAoU0VDX09TQUxfU3RyY21wKGNQYXJhbWV0ZXJOYW1lLCBTRUNfSU5ERVhfUEFSQU1fRU5BQkxFX1RIVU1CTkFJTCkgPT0gMCkgeworICAgICAgICBTRUNfVlA4REVDX0hBTkRMRSAqcFZwOERlYyA9IChTRUNfVlA4REVDX0hBTkRMRSAqKSgoU0VDX09NWF9WSURFT0RFQ19DT01QT05FTlQgKilwU0VDQ29tcG9uZW50LT5oQ29tcG9uZW50SGFuZGxlKS0+aENvZGVjSGFuZGxlOworCisgICAgICAgICpwSW5kZXhUeXBlID0gT01YX0luZGV4VmVuZG9yVGh1bWJuYWlsTW9kZTsKKworICAgICAgICByZXQgPSBPTVhfRXJyb3JOb25lOworICAgIH0gZWxzZSB7CisgICAgICAgIHJldCA9IFNFQ19PTVhfVmlkZW9EZWNvZGVHZXRFeHRlbnNpb25JbmRleChoQ29tcG9uZW50LCBjUGFyYW1ldGVyTmFtZSwgcEluZGV4VHlwZSk7CisgICAgfQorCitFWElUOgorICAgIEZ1bmN0aW9uT3V0KCk7CisKKyAgICByZXR1cm4gcmV0OworfQorCitPTVhfRVJST1JUWVBFIFNFQ19NRkNfVlA4RGVjX0NvbXBvbmVudFJvbGVFbnVtKE9NWF9IQU5ETEVUWVBFIGhDb21wb25lbnQsIE9NWF9VOCAqY1JvbGUsIE9NWF9VMzIgbkluZGV4KQoreworICAgIE9NWF9FUlJPUlRZUEUgICAgICAgICAgICByZXQgPSBPTVhfRXJyb3JOb25lOworICAgIE9NWF9DT01QT05FTlRUWVBFICAgICAgICpwT01YQ29tcG9uZW50ID0gTlVMTDsKKyAgICBTRUNfT01YX0JBU0VDT01QT05FTlQgICAqcFNFQ0NvbXBvbmVudCA9IE5VTEw7CisKKyAgICBGdW5jdGlvbkluKCk7CisKKyAgICBpZiAoKGhDb21wb25lbnQgPT0gTlVMTCkgfHwgKGNSb2xlID09IE5VTEwpKSB7CisgICAgICAgIHJldCA9IE9NWF9FcnJvckJhZFBhcmFtZXRlcjsKKyAgICAgICAgZ290byBFWElUOworICAgIH0KKyAgICBpZiAobkluZGV4ID09IChNQVhfQ09NUE9ORU5UX1JPTEVfTlVNLTEpKSB7CisgICAgICAgIFNFQ19PU0FMX1N0cmNweSgoY2hhciAqKWNSb2xlLCBTRUNfT01YX0NPTVBPTkVOVF9WUDhfREVDX1JPTEUpOworICAgICAgICByZXQgPSBPTVhfRXJyb3JOb25lOworICAgIH0gZWxzZSB7CisgICAgICAgIHJldCA9IE9NWF9FcnJvck5vTW9yZTsKKyAgICB9CisKK0VYSVQ6CisgICAgRnVuY3Rpb25PdXQoKTsKKworICAgIHJldHVybiByZXQ7Cit9CisKK09NWF9FUlJPUlRZUEUgU0VDX01GQ19EZWNvZGVUaHJlYWQoT01YX0hBTkRMRVRZUEUgaENvbXBvbmVudCkKK3sKKyAgICBPTVhfRVJST1JUWVBFICAgICAgICAgIHJldCA9IE9NWF9FcnJvck5vbmU7CisgICAgT01YX0NPTVBPTkVOVFRZUEUgICAgICpwT01YQ29tcG9uZW50ID0gKE9NWF9DT01QT05FTlRUWVBFICopaENvbXBvbmVudDsKKyAgICBTRUNfT01YX0JBU0VDT01QT05FTlQgKnBTRUNDb21wb25lbnQgPSAoU0VDX09NWF9CQVNFQ09NUE9ORU5UICopcE9NWENvbXBvbmVudC0+cENvbXBvbmVudFByaXZhdGU7CisgICAgU0VDX09NWF9WSURFT0RFQ19DT01QT05FTlQgKnBWaWRlb0RlYyA9IChTRUNfT01YX1ZJREVPREVDX0NPTVBPTkVOVCAqKXBTRUNDb21wb25lbnQtPmhDb21wb25lbnRIYW5kbGU7CisgICAgU0VDX1ZQOERFQ19IQU5ETEUgICAgKnBWcDhEZWMgPSAoU0VDX1ZQOERFQ19IQU5ETEUgKilwVmlkZW9EZWMtPmhDb2RlY0hhbmRsZTsKKworICAgIEZ1bmN0aW9uSW4oKTsKKworICAgIGlmIChoQ29tcG9uZW50ID09IE5VTEwpIHsKKyAgICAgICAgcmV0ID0gT01YX0Vycm9yQmFkUGFyYW1ldGVyOworICAgICAgICBnb3RvIEVYSVQ7CisgICAgfQorCisgICAgd2hpbGUgKHBWaWRlb0RlYy0+TkJEZWNUaHJlYWQuYkV4aXREZWNvZGVUaHJlYWQgPT0gT01YX0ZBTFNFKSB7CisgICAgICAgIFNFQ19PU0FMX1NlbWFwaG9yZVdhaXQocFZpZGVvRGVjLT5OQkRlY1RocmVhZC5oRGVjRnJhbWVTdGFydCk7CisKKyAgICAgICAgaWYgKHBWaWRlb0RlYy0+TkJEZWNUaHJlYWQuYkV4aXREZWNvZGVUaHJlYWQgPT0gT01YX0ZBTFNFKSB7CisjaWZkZWYgQ09ORklHX01GQ19GUFMKKyAgICAgICAgICAgIFNFQ19PU0FMX1BlcmZTdGFydChQRVJGX0lEX0RFQyk7CisjZW5kaWYKKyAgICAgICAgICAgIHBWcDhEZWMtPmhNRkNWcDhIYW5kbGUucmV0dXJuQ29kZWMgPSBTc2JTaXBNZmNEZWNFeGUocFZwOERlYy0+aE1GQ1ZwOEhhbmRsZS5oTUZDSGFuZGxlLCBwVmlkZW9EZWMtPk5CRGVjVGhyZWFkLm9uZUZyYW1lU2l6ZSk7CisjaWZkZWYgQ09ORklHX01GQ19GUFMKKyAgICAgICAgICAgIFNFQ19PU0FMX1BlcmZTdG9wKFBFUkZfSURfREVDKTsKKyNlbmRpZgorICAgICAgICAgICAgU0VDX09TQUxfU2VtYXBob3JlUG9zdChwVmlkZW9EZWMtPk5CRGVjVGhyZWFkLmhEZWNGcmFtZUVuZCk7CisgICAgICAgIH0KKyAgICB9CisKK0VYSVQ6CisgICAgU0VDX09TQUxfVGhyZWFkRXhpdChOVUxMKTsKKyAgICBGdW5jdGlvbk91dCgpOworCisgICAgcmV0dXJuIHJldDsKK30KKworLyogTUZDIEluaXQgKi8KK09NWF9FUlJPUlRZUEUgU0VDX01GQ19WUDhEZWNfSW5pdChPTVhfQ09NUE9ORU5UVFlQRSAqcE9NWENvbXBvbmVudCkKK3sKKyAgICBPTVhfRVJST1JUWVBFICAgICAgICAgIHJldCA9IE9NWF9FcnJvck5vbmU7CisgICAgU0VDX09NWF9CQVNFQ09NUE9ORU5UICpwU0VDQ29tcG9uZW50ID0gKFNFQ19PTVhfQkFTRUNPTVBPTkVOVCAqKXBPTVhDb21wb25lbnQtPnBDb21wb25lbnRQcml2YXRlOworICAgIFNFQ19PTVhfVklERU9ERUNfQ09NUE9ORU5UICpwVmlkZW9EZWMgPSAoU0VDX09NWF9WSURFT0RFQ19DT01QT05FTlQgKilwU0VDQ29tcG9uZW50LT5oQ29tcG9uZW50SGFuZGxlOworICAgIFNFQ19PTVhfQkFTRVBPUlQgICAgICAqcFNFQ091dHB1dFBvcnQgPSAmcFNFQ0NvbXBvbmVudC0+cFNFQ1BvcnRbT1VUUFVUX1BPUlRfSU5ERVhdOworICAgIFNFQ19WUDhERUNfSEFORExFICAgICpwVnA4RGVjID0gTlVMTDsKKyAgICBPTVhfUFRSIGhNRkNIYW5kbGUgICAgICAgPSBOVUxMOworICAgIE9NWF9QVFIgcFN0cmVhbUJ1ZmZlciAgICA9IE5VTEw7CisgICAgT01YX1BUUiBwU3RyZWFtUGh5QnVmZmVyID0gTlVMTDsKKyAgICBDU0NfTUVUSE9EIGNzY19tZXRob2QgPSBDU0NfTUVUSE9EX1NXOworCisjaWZkZWYgQ09ORklHX01GQ19GUFMKKyAgICBTRUNfT1NBTF9QZXJmSW5pdChQRVJGX0lEX0RFQyk7CisgICAgU0VDX09TQUxfUGVyZkluaXQoUEVSRl9JRF9DU0MpOworI2VuZGlmCisKKyAgICBwVnA4RGVjID0gKFNFQ19WUDhERUNfSEFORExFICopKChTRUNfT01YX1ZJREVPREVDX0NPTVBPTkVOVCAqKXBTRUNDb21wb25lbnQtPmhDb21wb25lbnRIYW5kbGUpLT5oQ29kZWNIYW5kbGU7CisgICAgcFZwOERlYy0+aE1GQ1ZwOEhhbmRsZS5iQ29uZmlndXJlZE1GQyA9IE9NWF9GQUxTRTsKKyAgICBwU0VDQ29tcG9uZW50LT5iVXNlRmxhZ0VPRiA9IE9NWF9GQUxTRTsKKyAgICBwU0VDQ29tcG9uZW50LT5iU2F2ZUZsYWdFT1MgPSBPTVhfRkFMU0U7CisKKyAgICAvKiBNRkMoTXVsdGkgRnVuY3Rpb24gQ29kZWMpIGRlY29kZXIgYW5kIENNTShDb2RlYyBNZW1vcnkgTWFuYWdlbWVudCkgZHJpdmVyIG9wZW4gKi8KKyAgICBpZiAocFNFQ091dHB1dFBvcnQtPnBvcnREZWZpbml0aW9uLmZvcm1hdC52aWRlby5lQ29sb3JGb3JtYXQgPT0gT01YX1NFQ19DT0xPUl9Gb3JtYXROVjEyVFBoeXNpY2FsQWRkcmVzcykgeworICAgICAgICBoTUZDSGFuZGxlID0gKE9NWF9QVFIpU3NiU2lwTWZjRGVjT3BlbigpOworICAgIH0gZWxzZSB7CisgICAgICAgIFNTQklQX01GQ19CVUZGRVJfVFlQRSBidWZfdHlwZSA9IENBQ0hFOworICAgICAgICBoTUZDSGFuZGxlID0gKE9NWF9QVFIpU3NiU2lwTWZjRGVjT3BlbkV4dCgmYnVmX3R5cGUpOworICAgIH0KKworICAgIGlmIChoTUZDSGFuZGxlID09IE5VTEwpIHsKKyAgICAgICAgcmV0ID0gT01YX0Vycm9ySW5zdWZmaWNpZW50UmVzb3VyY2VzOworICAgICAgICBnb3RvIEVYSVQ7CisgICAgfQorICAgIHBWcDhEZWMtPmhNRkNWcDhIYW5kbGUuaE1GQ0hhbmRsZSA9IGhNRkNIYW5kbGU7CisKKyAgICAvKiBBbGxvY2F0ZSBkZWNvZGVyJ3MgaW5wdXQgYnVmZmVyICovCisgICAgLyogR2V0IGZpcnN0IGlucHV0IGJ1ZmZlciAqLworICAgIHBTdHJlYW1CdWZmZXIgPSBTc2JTaXBNZmNEZWNHZXRJbkJ1ZihoTUZDSGFuZGxlLCAmcFN0cmVhbVBoeUJ1ZmZlciwgREVGQVVMVF9NRkNfSU5QVVRfQlVGRkVSX1NJWkUgLyAyKTsKKyAgICBpZiAocFN0cmVhbUJ1ZmZlciA9PSBOVUxMKSB7CisgICAgICAgIHJldCA9IE9NWF9FcnJvckluc3VmZmljaWVudFJlc291cmNlczsKKyAgICAgICAgZ290byBFWElUOworICAgIH0KKyAgICBwVmlkZW9EZWMtPk1GQ0RlY0lucHV0QnVmZmVyWzBdLlZpckFkZHIgPSBwU3RyZWFtQnVmZmVyOworICAgIHBWaWRlb0RlYy0+TUZDRGVjSW5wdXRCdWZmZXJbMF0uUGh5QWRkciA9IHBTdHJlYW1QaHlCdWZmZXI7CisgICAgcFZpZGVvRGVjLT5NRkNEZWNJbnB1dEJ1ZmZlclswXS5idWZmZXJTaXplID0gREVGQVVMVF9NRkNfSU5QVVRfQlVGRkVSX1NJWkUgLyAyOworICAgIHBWaWRlb0RlYy0+TUZDRGVjSW5wdXRCdWZmZXJbMF0uZGF0YVNpemUgPSAwOworCisjaWZkZWYgTk9OQkxPQ0tfTU9ERV9QUk9DRVNTCisgICAgLyogR2V0IHNlY29uZCBpbnB1dCBidWZmZXIgKi8KKyAgICBwU3RyZWFtQnVmZmVyID0gTlVMTDsKKyAgICBwU3RyZWFtQnVmZmVyID0gU3NiU2lwTWZjRGVjR2V0SW5CdWYoaE1GQ0hhbmRsZSwgJnBTdHJlYW1QaHlCdWZmZXIsIERFRkFVTFRfTUZDX0lOUFVUX0JVRkZFUl9TSVpFIC8gMik7CisgICAgaWYgKHBTdHJlYW1CdWZmZXIgPT0gTlVMTCkgeworICAgICAgICByZXQgPSBPTVhfRXJyb3JJbnN1ZmZpY2llbnRSZXNvdXJjZXM7CisgICAgICAgIGdvdG8gRVhJVDsKKyAgICB9CisgICAgcFZpZGVvRGVjLT5NRkNEZWNJbnB1dEJ1ZmZlclsxXS5WaXJBZGRyID0gcFN0cmVhbUJ1ZmZlcjsKKyAgICBwVmlkZW9EZWMtPk1GQ0RlY0lucHV0QnVmZmVyWzFdLlBoeUFkZHIgPSBwU3RyZWFtUGh5QnVmZmVyOworICAgIHBWaWRlb0RlYy0+TUZDRGVjSW5wdXRCdWZmZXJbMV0uYnVmZmVyU2l6ZSA9IERFRkFVTFRfTUZDX0lOUFVUX0JVRkZFUl9TSVpFIC8gMjsKKyAgICBwVmlkZW9EZWMtPk1GQ0RlY0lucHV0QnVmZmVyWzFdLmRhdGFTaXplID0gMDsKKyAgICBwVmlkZW9EZWMtPmluZGV4SW5wdXRCdWZmZXIgPSAwOworCisgICAgcFZpZGVvRGVjLT5iRmlyc3RGcmFtZSA9IE9NWF9UUlVFOworCisgICAgcFZpZGVvRGVjLT5OQkRlY1RocmVhZC5iRXhpdERlY29kZVRocmVhZCA9IE9NWF9GQUxTRTsKKyAgICBwVmlkZW9EZWMtPk5CRGVjVGhyZWFkLmJEZWNvZGVyUnVuID0gT01YX0ZBTFNFOworICAgIHBWaWRlb0RlYy0+TkJEZWNUaHJlYWQub25lRnJhbWVTaXplID0gMDsKKyAgICBTRUNfT1NBTF9TZW1hcGhvcmVDcmVhdGUoJihwVmlkZW9EZWMtPk5CRGVjVGhyZWFkLmhEZWNGcmFtZVN0YXJ0KSk7CisgICAgU0VDX09TQUxfU2VtYXBob3JlQ3JlYXRlKCYocFZpZGVvRGVjLT5OQkRlY1RocmVhZC5oRGVjRnJhbWVFbmQpKTsKKyAgICBpZiAoT01YX0Vycm9yTm9uZSA9PSBTRUNfT1NBTF9UaHJlYWRDcmVhdGUoJnBWaWRlb0RlYy0+TkJEZWNUaHJlYWQuaE5CRGVjb2RlVGhyZWFkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU0VDX01GQ19EZWNvZGVUaHJlYWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwT01YQ29tcG9uZW50KSkgeworICAgICAgICBwVnA4RGVjLT5oTUZDVnA4SGFuZGxlLnJldHVybkNvZGVjID0gTUZDX1JFVF9PSzsKKyAgICB9CisjZW5kaWYKKworICAgIHBWcDhEZWMtPmhNRkNWcDhIYW5kbGUucE1GQ1N0cmVhbUJ1ZmZlciAgICA9IHBWaWRlb0RlYy0+TUZDRGVjSW5wdXRCdWZmZXJbMF0uVmlyQWRkcjsKKyAgICBwVnA4RGVjLT5oTUZDVnA4SGFuZGxlLnBNRkNTdHJlYW1QaHlCdWZmZXIgPSBwVmlkZW9EZWMtPk1GQ0RlY0lucHV0QnVmZmVyWzBdLlBoeUFkZHI7CisgICAgcFNFQ0NvbXBvbmVudC0+cHJvY2Vzc0RhdGFbSU5QVVRfUE9SVF9JTkRFWF0uZGF0YUJ1ZmZlciA9IHBWaWRlb0RlYy0+TUZDRGVjSW5wdXRCdWZmZXJbMF0uVmlyQWRkcjsKKyAgICBwU0VDQ29tcG9uZW50LT5wcm9jZXNzRGF0YVtJTlBVVF9QT1JUX0lOREVYXS5hbGxvY1NpemUgPSBwVmlkZW9EZWMtPk1GQ0RlY0lucHV0QnVmZmVyWzBdLmJ1ZmZlclNpemU7CisKKyAgICBTRUNfT1NBTF9NZW1zZXQocFNFQ0NvbXBvbmVudC0+dGltZVN0YW1wLCAtMTk3NzEwMDMsIHNpemVvZihPTVhfVElDS1MpICogTUFYX1RJTUVTVEFNUCk7CisgICAgU0VDX09TQUxfTWVtc2V0KHBTRUNDb21wb25lbnQtPm5GbGFncywgMCwgc2l6ZW9mKE9NWF9VMzIpICogTUFYX0ZMQUdTKTsKKyAgICBwVnA4RGVjLT5oTUZDVnA4SGFuZGxlLmluZGV4VGltZXN0YW1wID0gMDsKKyAgICBwVnA4RGVjLT5oTUZDVnA4SGFuZGxlLm91dHB1dEluZGV4VGltZXN0YW1wID0gMDsKKworICAgIHBTRUNDb21wb25lbnQtPmdldEFsbERlbGF5QnVmZmVyID0gT01YX0ZBTFNFOworCisjaWZkZWYgVVNFX0FOQgorI2lmIGRlZmluZWQoVVNFX0NTQ19GSU1DKSB8fCBkZWZpbmVkKFVTRV9DU0NfR1NDQUxFUikKKyAgICBpZiAocFNFQ091dHB1dFBvcnQtPmJJc0FOQkVuYWJsZWQgPT0gT01YX1RSVUUpIHsKKyAgICAgICAgY3NjX21ldGhvZCA9IENTQ19NRVRIT0RfUFJFRkVSX0hXOworICAgIH0KKyNlbmRpZgorI2VuZGlmCisgICAgcFZpZGVvRGVjLT5jc2NfaGFuZGxlID0gY3NjX2luaXQoJmNzY19tZXRob2QpOworICAgIHBWaWRlb0RlYy0+Y3NjX3NldF9mb3JtYXQgPSBPTVhfRkFMU0U7CisKK0VYSVQ6CisgICAgRnVuY3Rpb25PdXQoKTsKKworICAgIHJldHVybiByZXQ7Cit9CisKKy8qIE1GQyBUZXJtaW5hdGUgKi8KK09NWF9FUlJPUlRZUEUgU0VDX01GQ19WUDhEZWNfVGVybWluYXRlKE9NWF9DT01QT05FTlRUWVBFICpwT01YQ29tcG9uZW50KQoreworICAgIE9NWF9FUlJPUlRZUEUgICAgICAgICAgcmV0ID0gT01YX0Vycm9yTm9uZTsKKyAgICBTRUNfT01YX0JBU0VDT01QT05FTlQgKnBTRUNDb21wb25lbnQgPSAoU0VDX09NWF9CQVNFQ09NUE9ORU5UICopcE9NWENvbXBvbmVudC0+cENvbXBvbmVudFByaXZhdGU7CisgICAgU0VDX09NWF9WSURFT0RFQ19DT01QT05FTlQgKnBWaWRlb0RlYyA9IChTRUNfT01YX1ZJREVPREVDX0NPTVBPTkVOVCAqKXBTRUNDb21wb25lbnQtPmhDb21wb25lbnRIYW5kbGU7CisgICAgU0VDX1ZQOERFQ19IQU5ETEUgICAgKnBWcDhEZWMgPSBOVUxMOworICAgIE9NWF9QVFIgICAgICAgICAgICAgICAgaE1GQ0hhbmRsZSA9IE5VTEw7CisKKyAgICBGdW5jdGlvbkluKCk7CisKKyNpZmRlZiBDT05GSUdfTUZDX0ZQUworICAgIFNFQ19PU0FMX1BlcmZQcmludCgiW0RFQ10iLCAgUEVSRl9JRF9ERUMpOworICAgIFNFQ19PU0FMX1BlcmZQcmludCgiW0NTQ10iLCAgUEVSRl9JRF9DU0MpOworI2VuZGlmCisKKyAgICBwVnA4RGVjID0gKFNFQ19WUDhERUNfSEFORExFICopKChTRUNfT01YX1ZJREVPREVDX0NPTVBPTkVOVCAqKXBTRUNDb21wb25lbnQtPmhDb21wb25lbnRIYW5kbGUpLT5oQ29kZWNIYW5kbGU7CisgICAgaE1GQ0hhbmRsZSA9IHBWcDhEZWMtPmhNRkNWcDhIYW5kbGUuaE1GQ0hhbmRsZTsKKworICAgIHBWcDhEZWMtPmhNRkNWcDhIYW5kbGUucE1GQ1N0cmVhbUJ1ZmZlciAgICA9IE5VTEw7CisgICAgcFZwOERlYy0+aE1GQ1ZwOEhhbmRsZS5wTUZDU3RyZWFtUGh5QnVmZmVyID0gTlVMTDsKKyAgICBwU0VDQ29tcG9uZW50LT5wcm9jZXNzRGF0YVtJTlBVVF9QT1JUX0lOREVYXS5kYXRhQnVmZmVyID0gTlVMTDsKKyAgICBwU0VDQ29tcG9uZW50LT5wcm9jZXNzRGF0YVtJTlBVVF9QT1JUX0lOREVYXS5hbGxvY1NpemUgPSAwOworCisjaWZkZWYgTk9OQkxPQ0tfTU9ERV9QUk9DRVNTCisgICAgaWYgKHBWaWRlb0RlYy0+TkJEZWNUaHJlYWQuaE5CRGVjb2RlVGhyZWFkICE9IE5VTEwpIHsKKyAgICAgICAgcFZpZGVvRGVjLT5OQkRlY1RocmVhZC5iRXhpdERlY29kZVRocmVhZCA9IE9NWF9UUlVFOworICAgICAgICBTRUNfT1NBTF9TZW1hcGhvcmVQb3N0KHBWaWRlb0RlYy0+TkJEZWNUaHJlYWQuaERlY0ZyYW1lU3RhcnQpOworICAgICAgICBTRUNfT1NBTF9UaHJlYWRUZXJtaW5hdGUocFZpZGVvRGVjLT5OQkRlY1RocmVhZC5oTkJEZWNvZGVUaHJlYWQpOworICAgICAgICBwVmlkZW9EZWMtPk5CRGVjVGhyZWFkLmhOQkRlY29kZVRocmVhZCA9IE5VTEw7CisgICAgfQorCisgICAgaWYocFZpZGVvRGVjLT5OQkRlY1RocmVhZC5oRGVjRnJhbWVFbmQgIT0gTlVMTCkgeworICAgICAgICBTRUNfT1NBTF9TZW1hcGhvcmVUZXJtaW5hdGUocFZpZGVvRGVjLT5OQkRlY1RocmVhZC5oRGVjRnJhbWVFbmQpOworICAgICAgICBwVmlkZW9EZWMtPk5CRGVjVGhyZWFkLmhEZWNGcmFtZUVuZCA9IE5VTEw7CisgICAgfQorCisgICAgaWYocFZpZGVvRGVjLT5OQkRlY1RocmVhZC5oRGVjRnJhbWVTdGFydCAhPSBOVUxMKSB7CisgICAgICAgIFNFQ19PU0FMX1NlbWFwaG9yZVRlcm1pbmF0ZShwVmlkZW9EZWMtPk5CRGVjVGhyZWFkLmhEZWNGcmFtZVN0YXJ0KTsKKyAgICAgICAgcFZpZGVvRGVjLT5OQkRlY1RocmVhZC5oRGVjRnJhbWVTdGFydCA9IE5VTEw7CisgICAgfQorI2VuZGlmCisKKyAgICBpZiAoaE1GQ0hhbmRsZSAhPSBOVUxMKSB7CisgICAgICAgIFNzYlNpcE1mY0RlY0Nsb3NlKGhNRkNIYW5kbGUpOworICAgICAgICBoTUZDSGFuZGxlID0gcFZwOERlYy0+aE1GQ1ZwOEhhbmRsZS5oTUZDSGFuZGxlID0gTlVMTDsKKyAgICB9CisKKyAgICBpZiAocFZpZGVvRGVjLT5jc2NfaGFuZGxlICE9IE5VTEwpIHsKKyAgICAgICAgY3NjX2RlaW5pdChwVmlkZW9EZWMtPmNzY19oYW5kbGUpOworICAgICAgICBwVmlkZW9EZWMtPmNzY19oYW5kbGUgPSBOVUxMOworICAgIH0KKworRVhJVDoKKyAgICBGdW5jdGlvbk91dCgpOworCisgICAgcmV0dXJuIHJldDsKK30KKworT01YX0VSUk9SVFlQRSBTRUNfTUZDX1ZQOF9EZWNvZGVfTm9uYmxvY2soT01YX0NPTVBPTkVOVFRZUEUgKnBPTVhDb21wb25lbnQsIFNFQ19PTVhfREFUQSAqcElucHV0RGF0YSwgU0VDX09NWF9EQVRBICpwT3V0cHV0RGF0YSkKK3sKKyAgICBPTVhfRVJST1JUWVBFICAgICAgICAgICAgICAgcmV0ID0gT01YX0Vycm9yTm9uZTsKKyAgICBTRUNfT01YX0JBU0VDT01QT05FTlQgICAgICAqcFNFQ0NvbXBvbmVudCA9IChTRUNfT01YX0JBU0VDT01QT05FTlQgKilwT01YQ29tcG9uZW50LT5wQ29tcG9uZW50UHJpdmF0ZTsKKyAgICBTRUNfT01YX1ZJREVPREVDX0NPTVBPTkVOVCAqcFZpZGVvRGVjID0gKFNFQ19PTVhfVklERU9ERUNfQ09NUE9ORU5UICopcFNFQ0NvbXBvbmVudC0+aENvbXBvbmVudEhhbmRsZTsKKyAgICBTRUNfVlA4REVDX0hBTkRMRSAgICAgICAgICpwVnA4RGVjID0gKFNFQ19WUDhERUNfSEFORExFICopKChTRUNfT01YX1ZJREVPREVDX0NPTVBPTkVOVCAqKXBTRUNDb21wb25lbnQtPmhDb21wb25lbnRIYW5kbGUpLT5oQ29kZWNIYW5kbGU7CisgICAgU0VDX09NWF9CQVNFUE9SVCAgICAgICAgICAgKnBTRUNJbnB1dFBvcnQgPSAmcFNFQ0NvbXBvbmVudC0+cFNFQ1BvcnRbSU5QVVRfUE9SVF9JTkRFWF07CisgICAgU0VDX09NWF9CQVNFUE9SVCAgICAgICAgICAgKnBTRUNPdXRwdXRQb3J0ID0gJnBTRUNDb21wb25lbnQtPnBTRUNQb3J0W09VVFBVVF9QT1JUX0lOREVYXTsKKyAgICBPTVhfVTMyICAgICAgICAgICAgICAgICAgICAgb25lRnJhbWVTaXplID0gcElucHV0RGF0YS0+ZGF0YUxlbjsKKyAgICBTU0JTSVBfTUZDX0RFQ19PVVRQVVRfSU5GTyAgb3V0cHV0SW5mbzsKKyAgICBPTVhfUzMyICAgICAgICAgICAgICAgICAgICAgc2V0Q29uZlZhbCA9IDA7CisgICAgaW50ICAgICAgICAgICAgICAgICAgICAgICAgIGJ1ZldpZHRoID0gMDsKKyAgICBpbnQgICAgICAgICAgICAgICAgICAgICAgICAgYnVmSGVpZ2h0ID0gMDsKKyAgICBPTVhfVTMyICAgICAgICAgICAgICAgICAgICAgRnJhbWVCdWZmZXJZU2l6ZSA9IDA7CisgICAgT01YX1UzMiAgICAgICAgICAgICAgICAgICAgIEZyYW1lQnVmZmVyVVZTaXplID0gMDsKKyAgICBPTVhfQk9PTCAgICAgICAgICAgICAgICAgICAgb3V0cHV0RGF0YVZhbGlkID0gT01YX0ZBTFNFOworCisgICAgRnVuY3Rpb25JbigpOworCisgICAgaWYgKHBWcDhEZWMtPmhNRkNWcDhIYW5kbGUuYkNvbmZpZ3VyZWRNRkMgPT0gT01YX0ZBTFNFKSB7CisgICAgICAgIFNTQlNJUF9NRkNfQ09ERUNfVFlQRSBlQ29kZWNUeXBlID0gVlA4X0RFQzsKKworICAgICAgICBpZiAoKG9uZUZyYW1lU2l6ZSA8PSAwKSAmJiAocElucHV0RGF0YS0+bkZsYWdzICYgT01YX0JVRkZFUkZMQUdfRU9TKSkgeworICAgICAgICAgICAgcE91dHB1dERhdGEtPnRpbWVTdGFtcCA9IHBJbnB1dERhdGEtPnRpbWVTdGFtcDsKKyAgICAgICAgICAgIHBPdXRwdXREYXRhLT5uRmxhZ3MgPSBwSW5wdXREYXRhLT5uRmxhZ3M7CisgICAgICAgICAgICByZXQgPSBPTVhfRXJyb3JOb25lOworICAgICAgICAgICAgZ290byBFWElUOworICAgICAgICB9CisKKyAgICAgICAgLyogRGVmYXVsdCBudW1iZXIgaW4gdGhlIGRyaXZlciBpcyBvcHRpbWl6ZWQgKi8KKyAgICAgICAgaWYgKHBWaWRlb0RlYy0+YlRodW1ibmFpbE1vZGUgPT0gT01YX1RSVUUpIHsKKyAgICAgICAgICAgIHNldENvbmZWYWwgPSAwOworICAgICAgICAgICAgU3NiU2lwTWZjRGVjU2V0Q29uZmlnKHBWcDhEZWMtPmhNRkNWcDhIYW5kbGUuaE1GQ0hhbmRsZSwgTUZDX0RFQ19TRVRDT05GX0RJU1BMQVlfREVMQVksICZzZXRDb25mVmFsKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHNldENvbmZWYWwgPSBWUDhfREVDX05VTV9PRl9FWFRSQV9CVUZGRVJTOworICAgICAgICAgICAgU3NiU2lwTWZjRGVjU2V0Q29uZmlnKHBWcDhEZWMtPmhNRkNWcDhIYW5kbGUuaE1GQ0hhbmRsZSwgTUZDX0RFQ19TRVRDT05GX0VYVFJBX0JVRkZFUl9OVU0sICZzZXRDb25mVmFsKTsKKworICAgICAgICAgICAgc2V0Q29uZlZhbCA9IDg7CisgICAgICAgICAgICBTc2JTaXBNZmNEZWNTZXRDb25maWcocFZwOERlYy0+aE1GQ1ZwOEhhbmRsZS5oTUZDSGFuZGxlLCBNRkNfREVDX1NFVENPTkZfRElTUExBWV9ERUxBWSwgJnNldENvbmZWYWwpOworICAgICAgICB9CisKKyAgICAgICAgU3NiU2lwTWZjRGVjU2V0SW5CdWYocFZwOERlYy0+aE1GQ1ZwOEhhbmRsZS5oTUZDSGFuZGxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwVnA4RGVjLT5oTUZDVnA4SGFuZGxlLnBNRkNTdHJlYW1QaHlCdWZmZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBWcDhEZWMtPmhNRkNWcDhIYW5kbGUucE1GQ1N0cmVhbUJ1ZmZlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcFNFQ0NvbXBvbmVudC0+cHJvY2Vzc0RhdGFbSU5QVVRfUE9SVF9JTkRFWF0uYWxsb2NTaXplKTsKKworICAgICAgICBwVnA4RGVjLT5oTUZDVnA4SGFuZGxlLnJldHVybkNvZGVjID0gU3NiU2lwTWZjRGVjSW5pdChwVnA4RGVjLT5oTUZDVnA4SGFuZGxlLmhNRkNIYW5kbGUsIGVDb2RlY1R5cGUsIG9uZUZyYW1lU2l6ZSk7CisgICAgICAgIGlmIChwVnA4RGVjLT5oTUZDVnA4SGFuZGxlLnJldHVybkNvZGVjID09IE1GQ19SRVRfT0spIHsKKyAgICAgICAgICAgIFNTQlNJUF9NRkNfSU1HX1JFU09MVVRJT04gaW1nUmVzb2w7CisKKyAgICAgICAgICAgIFNzYlNpcE1mY0RlY0dldENvbmZpZyhwVnA4RGVjLT5oTUZDVnA4SGFuZGxlLmhNRkNIYW5kbGUsIE1GQ19ERUNfR0VUQ09ORl9CVUZfV0lEVEhfSEVJR0hULCAmaW1nUmVzb2wpOworICAgICAgICAgICAgU0VDX09TQUxfTG9nKFNFQ19MT0dfRVJST1IsICJzZXQgd2lkdGggaGVpZ2h0IGluZm9ybWF0aW9uIDogJWQsICVkIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBwU0VDSW5wdXRQb3J0LT5wb3J0RGVmaW5pdGlvbi5mb3JtYXQudmlkZW8ubkZyYW1lV2lkdGgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcFNFQ0lucHV0UG9ydC0+cG9ydERlZmluaXRpb24uZm9ybWF0LnZpZGVvLm5GcmFtZUhlaWdodCk7CisgICAgICAgICAgICBTRUNfT1NBTF9Mb2coU0VDX0xPR19FUlJPUiwgIm1mYyB3aWR0aCBoZWlnaHQgaW5mb3JtYXRpb24gOiAlZCwgJWQiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGltZ1Jlc29sLndpZHRoLCBpbWdSZXNvbC5oZWlnaHQpOworCisgICAgICAgICAgICBpZiAoKHBTRUNJbnB1dFBvcnQtPnBvcnREZWZpbml0aW9uLmZvcm1hdC52aWRlby5uRnJhbWVXaWR0aCAhPSBpbWdSZXNvbC53aWR0aCkgfHwKKyAgICAgICAgICAgICAgICAocFNFQ0lucHV0UG9ydC0+cG9ydERlZmluaXRpb24uZm9ybWF0LnZpZGVvLm5GcmFtZUhlaWdodCAhPSBpbWdSZXNvbC5oZWlnaHQpKSB7CisgICAgICAgICAgICAgICAgU0VDX09TQUxfTG9nKFNFQ19MT0dfVFJBQ0UsICJjaGFuZ2Ugd2lkdGggaGVpZ2h0IGluZm9ybWF0aW9uIDogT01YX0V2ZW50UG9ydFNldHRpbmdzQ2hhbmdlZCIpOworCisgICAgICAgICAgICAgICAgLyogY2hhbmdlIHdpZHRoIGFuZCBoZWlnaHQgaW5mb3JtYXRpb24gKi8KKyAgICAgICAgICAgICAgICBwU0VDSW5wdXRQb3J0LT5wb3J0RGVmaW5pdGlvbi5mb3JtYXQudmlkZW8ubkZyYW1lV2lkdGggPSBpbWdSZXNvbC53aWR0aDsKKyAgICAgICAgICAgICAgICBwU0VDSW5wdXRQb3J0LT5wb3J0RGVmaW5pdGlvbi5mb3JtYXQudmlkZW8ubkZyYW1lSGVpZ2h0ID0gaW1nUmVzb2wuaGVpZ2h0OworICAgICAgICAgICAgICAgIHBTRUNJbnB1dFBvcnQtPnBvcnREZWZpbml0aW9uLmZvcm1hdC52aWRlby5uU3RyaWRlICAgICAgPSAoKGltZ1Jlc29sLndpZHRoICsgMTUpICYgKH4xNSkpOworICAgICAgICAgICAgICAgIHBTRUNJbnB1dFBvcnQtPnBvcnREZWZpbml0aW9uLmZvcm1hdC52aWRlby5uU2xpY2VIZWlnaHQgPSAoKGltZ1Jlc29sLmhlaWdodCArIDE1KSAmICh+MTUpKTsKKworICAgICAgICAgICAgICAgIFNFQ19VcGRhdGVGcmFtZVNpemUocE9NWENvbXBvbmVudCk7CisKKyAgICAgICAgICAgICAgICAvKiogU2VuZCBQb3J0IFNldHRpbmdzIGNoYW5nZWQgY2FsbCBiYWNrICoqLworICAgICAgICAgICAgICAgICgqKHBTRUNDb21wb25lbnQtPnBDYWxsYmFja3MtPkV2ZW50SGFuZGxlcikpCisgICAgICAgICAgICAgICAgICAgICAgKHBPTVhDb21wb25lbnQsCisgICAgICAgICAgICAgICAgICAgICAgIHBTRUNDb21wb25lbnQtPmNhbGxiYWNrRGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgT01YX0V2ZW50UG9ydFNldHRpbmdzQ2hhbmdlZCwgLyogVGhlIGNvbW1hbmQgd2FzIGNvbXBsZXRlZCAqLworICAgICAgICAgICAgICAgICAgICAgICBPTVhfRGlyT3V0cHV0LCAvKiBUaGlzIGlzIHRoZSBwb3J0IGluZGV4ICovCisgICAgICAgICAgICAgICAgICAgICAgIDAsCisgICAgICAgICAgICAgICAgICAgICAgIE5VTEwpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBwVnA4RGVjLT5oTUZDVnA4SGFuZGxlLmJDb25maWd1cmVkTUZDID0gT01YX1RSVUU7CisgICAgICAgICAgICBwT3V0cHV0RGF0YS0+dGltZVN0YW1wID0gcElucHV0RGF0YS0+dGltZVN0YW1wOworICAgICAgICAgICAgcE91dHB1dERhdGEtPm5GbGFncyA9IHBJbnB1dERhdGEtPm5GbGFnczsKKworICAgICAgICAgICAgcmV0ID0gT01YX0Vycm9ySW5wdXREYXRhRGVjb2RlWWV0OworICAgICAgICAgICAgZ290byBFWElUOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgcmV0ID0gT01YX0Vycm9yTUZDSW5pdDsKKyAgICAgICAgICAgIGdvdG8gRVhJVDsKKyAgICAgICAgfQorICAgIH0KKworI2lmbmRlZiBGVUxMX0ZSQU1FX1NFQVJDSAorICAgIGlmICgocElucHV0RGF0YS0+bkZsYWdzICYgT01YX0JVRkZFUkZMQUdfRU5ET0ZGUkFNRSkgJiYKKyAgICAgICAgKHBTRUNDb21wb25lbnQtPmJVc2VGbGFnRU9GID09IE9NWF9GQUxTRSkpCisgICAgICAgIHBTRUNDb21wb25lbnQtPmJVc2VGbGFnRU9GID0gT01YX1RSVUU7CisjZW5kaWYKKworICAgIHBTRUNDb21wb25lbnQtPnRpbWVTdGFtcFtwVnA4RGVjLT5oTUZDVnA4SGFuZGxlLmluZGV4VGltZXN0YW1wXSA9IHBJbnB1dERhdGEtPnRpbWVTdGFtcDsKKyAgICBwU0VDQ29tcG9uZW50LT5uRmxhZ3NbcFZwOERlYy0+aE1GQ1ZwOEhhbmRsZS5pbmRleFRpbWVzdGFtcF0gPSBwSW5wdXREYXRhLT5uRmxhZ3M7CisKKyAgICBpZiAoKHBWcDhEZWMtPmhNRkNWcDhIYW5kbGUucmV0dXJuQ29kZWMgPT0gTUZDX1JFVF9PSykgJiYKKyAgICAgICAgKHBWaWRlb0RlYy0+YkZpcnN0RnJhbWUgPT0gT01YX0ZBTFNFKSkgeworICAgICAgICBTU0JTSVBfTUZDX0RFQ19PVVRCVUZfU1RBVFVTIHN0YXR1czsKKyAgICAgICAgT01YX1MzMiBpbmRleFRpbWVzdGFtcCA9IDA7CisKKyAgICAgICAgLyogd2FpdCBmb3IgbWZjIGRlY29kZSBkb25lICovCisgICAgICAgIGlmIChwVmlkZW9EZWMtPk5CRGVjVGhyZWFkLmJEZWNvZGVyUnVuID09IE9NWF9UUlVFKSB7CisgICAgICAgICAgICBTRUNfT1NBTF9TZW1hcGhvcmVXYWl0KHBWaWRlb0RlYy0+TkJEZWNUaHJlYWQuaERlY0ZyYW1lRW5kKTsKKyAgICAgICAgICAgIHBWaWRlb0RlYy0+TkJEZWNUaHJlYWQuYkRlY29kZXJSdW4gPSBPTVhfRkFMU0U7CisgICAgICAgIH0KKworICAgICAgICBTRUNfT1NBTF9TbGVlcE1pbGxpc2VjKDApOworICAgICAgICBzdGF0dXMgPSBTc2JTaXBNZmNEZWNHZXRPdXRCdWYocFZwOERlYy0+aE1GQ1ZwOEhhbmRsZS5oTUZDSGFuZGxlLCAmb3V0cHV0SW5mbyk7CisgICAgICAgIGJ1ZldpZHRoID0gKG91dHB1dEluZm8uaW1nX3dpZHRoICsgMTUpICYgKH4xNSk7CisgICAgICAgIGJ1ZkhlaWdodCA9IChvdXRwdXRJbmZvLmltZ19oZWlnaHQgKyAxNSkgJiAofjE1KTsKKyAgICAgICAgRnJhbWVCdWZmZXJZU2l6ZSA9IEFMSUdOX1RPXzhLQihBTElHTl9UT18xMjhCKG91dHB1dEluZm8uaW1nX3dpZHRoKSAqIEFMSUdOX1RPXzMyQihvdXRwdXRJbmZvLmltZ19oZWlnaHQpKTsKKyAgICAgICAgRnJhbWVCdWZmZXJVVlNpemUgPSBBTElHTl9UT184S0IoQUxJR05fVE9fMTI4QihvdXRwdXRJbmZvLmltZ193aWR0aCkgKiBBTElHTl9UT18zMkIob3V0cHV0SW5mby5pbWdfaGVpZ2h0LzIpKTsKKworICAgICAgICBpZiAoKFNzYlNpcE1mY0RlY0dldENvbmZpZyhwVnA4RGVjLT5oTUZDVnA4SGFuZGxlLmhNRkNIYW5kbGUsIE1GQ19ERUNfR0VUQ09ORl9GUkFNRV9UQUcsICZpbmRleFRpbWVzdGFtcCkgIT0gTUZDX1JFVF9PSykgfHwKKyAgICAgICAgICAgICgoKGluZGV4VGltZXN0YW1wIDwgMCkgfHwgKGluZGV4VGltZXN0YW1wID49IE1BWF9USU1FU1RBTVApKSkpIHsKKyAgICAgICAgICAgIHBPdXRwdXREYXRhLT50aW1lU3RhbXAgPSBwSW5wdXREYXRhLT50aW1lU3RhbXA7CisgICAgICAgICAgICBwT3V0cHV0RGF0YS0+bkZsYWdzID0gcElucHV0RGF0YS0+bkZsYWdzOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgLyogRm9yIHRpbWVzdGFtcCBjb3JyZWN0aW9uLiBpZiBtZmMgc3VwcG9ydCBmcmFtZXR5cGUgZGV0ZWN0ICovCisgICAgICAgICAgICBTRUNfT1NBTF9Mb2coU0VDX0xPR19UUkFDRSwgImRpc3BfcGljX2ZyYW1lX3R5cGU6ICVkIiwgb3V0cHV0SW5mby5kaXNwX3BpY19mcmFtZV90eXBlKTsKKyNpZmRlZiBORUVEX1RJTUVTVEFNUF9SRU9SREVSCisgICAgICAgICAgICBpZiAob3V0cHV0SW5mby5kaXNwX3BpY19mcmFtZV90eXBlID09IE1GQ19GUkFNRV9UWVBFX0lfRlJBTUUpIHsKKyAgICAgICAgICAgICAgICBwT3V0cHV0RGF0YS0+dGltZVN0YW1wID0gcFNFQ0NvbXBvbmVudC0+dGltZVN0YW1wW2luZGV4VGltZXN0YW1wXTsKKyAgICAgICAgICAgICAgICBwT3V0cHV0RGF0YS0+bkZsYWdzID0gcFNFQ0NvbXBvbmVudC0+bkZsYWdzW2luZGV4VGltZXN0YW1wXTsKKyAgICAgICAgICAgICAgICBwVnA4RGVjLT5oTUZDVnA4SGFuZGxlLm91dHB1dEluZGV4VGltZXN0YW1wID0gaW5kZXhUaW1lc3RhbXA7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIHBPdXRwdXREYXRhLT50aW1lU3RhbXAgPSBwU0VDQ29tcG9uZW50LT50aW1lU3RhbXBbcFZwOERlYy0+aE1GQ1ZwOEhhbmRsZS5vdXRwdXRJbmRleFRpbWVzdGFtcF07CisgICAgICAgICAgICAgICAgcE91dHB1dERhdGEtPm5GbGFncyA9IHBTRUNDb21wb25lbnQtPm5GbGFnc1twVnA4RGVjLT5oTUZDVnA4SGFuZGxlLm91dHB1dEluZGV4VGltZXN0YW1wXTsKKyAgICAgICAgICAgIH0KKyNlbHNlCisgICAgICAgICAgICBwT3V0cHV0RGF0YS0+dGltZVN0YW1wID0gcFNFQ0NvbXBvbmVudC0+dGltZVN0YW1wW2luZGV4VGltZXN0YW1wXTsKKyAgICAgICAgICAgIHBPdXRwdXREYXRhLT5uRmxhZ3MgPSBwU0VDQ29tcG9uZW50LT5uRmxhZ3NbaW5kZXhUaW1lc3RhbXBdOworI2VuZGlmCisgICAgICAgICAgICBTRUNfT1NBTF9Mb2coU0VDX0xPR19UUkFDRSwgInRpbWVzdGFtcCAlbGxkIHVzICglLjJmIHNlY3MpIiwgcE91dHB1dERhdGEtPnRpbWVTdGFtcCwgcE91dHB1dERhdGEtPnRpbWVTdGFtcCAvIDFFNik7CisgICAgICAgIH0KKworICAgICAgICBpZiAoKHN0YXR1cyA9PSBNRkNfR0VUT1VUQlVGX0RJU1BMQVlfREVDT0RJTkcpIHx8CisgICAgICAgICAgICAoc3RhdHVzID09IE1GQ19HRVRPVVRCVUZfRElTUExBWV9PTkxZKSkgeworICAgICAgICAgICAgb3V0cHV0RGF0YVZhbGlkID0gT01YX1RSVUU7CisgICAgICAgICAgICBwVnA4RGVjLT5oTUZDVnA4SGFuZGxlLm91dHB1dEluZGV4VGltZXN0YW1wKys7CisgICAgICAgICAgICBwVnA4RGVjLT5oTUZDVnA4SGFuZGxlLm91dHB1dEluZGV4VGltZXN0YW1wICU9IE1BWF9USU1FU1RBTVA7CisgICAgICAgIH0KKyAgICAgICAgaWYgKHBPdXRwdXREYXRhLT5uRmxhZ3MgJiBPTVhfQlVGRkVSRkxBR19FT1MpCisgICAgICAgICAgICBvdXRwdXREYXRhVmFsaWQgPSBPTVhfRkFMU0U7CisKKyAgICAgICAgaWYgKChzdGF0dXMgPT0gTUZDX0dFVE9VVEJVRl9ESVNQTEFZX09OTFkpIHx8CisgICAgICAgICAgICAocFNFQ0NvbXBvbmVudC0+Z2V0QWxsRGVsYXlCdWZmZXIgPT0gT01YX1RSVUUpKQorICAgICAgICAgICAgcmV0ID0gT01YX0Vycm9ySW5wdXREYXRhRGVjb2RlWWV0OworCisgICAgICAgIGlmIChzdGF0dXMgPT0gTUZDX0dFVE9VVEJVRl9ERUNPRElOR19PTkxZKSB7CisgICAgICAgICAgICBpZiAoKChwSW5wdXREYXRhLT5uRmxhZ3MgJiBPTVhfQlVGRkVSRkxBR19FT1MpICE9IE9NWF9CVUZGRVJGTEFHX0VPUykgJiYKKyAgICAgICAgICAgICAgICAoKHBTRUNDb21wb25lbnQtPmJTYXZlRmxhZ0VPUyA9PSBPTVhfVFJVRSkgfHwgKHBTRUNDb21wb25lbnQtPmdldEFsbERlbGF5QnVmZmVyID09IE9NWF9UUlVFKSkpIHsKKyAgICAgICAgICAgICAgICBwSW5wdXREYXRhLT5uRmxhZ3MgfD0gT01YX0JVRkZFUkZMQUdfRU9TOworICAgICAgICAgICAgICAgIHBTRUNDb21wb25lbnQtPmdldEFsbERlbGF5QnVmZmVyID0gT01YX1RSVUU7CisgICAgICAgICAgICAgICAgcmV0ID0gT01YX0Vycm9ySW5wdXREYXRhRGVjb2RlWWV0OworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICByZXQgPSBPTVhfRXJyb3JOb25lOworICAgICAgICAgICAgfQorICAgICAgICAgICAgb3V0cHV0RGF0YVZhbGlkID0gT01YX0ZBTFNFOworICAgICAgICB9CisKKyNpZmRlZiBGVUxMX0ZSQU1FX1NFQVJDSAorICAgICAgICBpZiAoKChwSW5wdXREYXRhLT5uRmxhZ3MgJiBPTVhfQlVGRkVSRkxBR19FT1MpICE9IE9NWF9CVUZGRVJGTEFHX0VPUykgJiYKKyAgICAgICAgICAgIChwU0VDQ29tcG9uZW50LT5iU2F2ZUZsYWdFT1MgPT0gT01YX1RSVUUpKSB7CisgICAgICAgICAgICBwSW5wdXREYXRhLT5uRmxhZ3MgfD0gT01YX0JVRkZFUkZMQUdfRU9TOworICAgICAgICAgICAgcFNFQ0NvbXBvbmVudC0+Z2V0QWxsRGVsYXlCdWZmZXIgPSBPTVhfVFJVRTsKKyAgICAgICAgICAgIHJldCA9IE9NWF9FcnJvcklucHV0RGF0YURlY29kZVlldDsKKyAgICAgICAgfSBlbHNlCisjZW5kaWYKKyAgICAgICAgaWYgKChwSW5wdXREYXRhLT5uRmxhZ3MgJiBPTVhfQlVGRkVSRkxBR19FT1MpID09IE9NWF9CVUZGRVJGTEFHX0VPUykgeworICAgICAgICAgICAgcElucHV0RGF0YS0+bkZsYWdzID0gKHBPdXRwdXREYXRhLT5uRmxhZ3MgJiAofk9NWF9CVUZGRVJGTEFHX0VPUykpOworICAgICAgICAgICAgcFNFQ0NvbXBvbmVudC0+Z2V0QWxsRGVsYXlCdWZmZXIgPSBPTVhfVFJVRTsKKyAgICAgICAgICAgIHJldCA9IE9NWF9FcnJvcklucHV0RGF0YURlY29kZVlldDsKKyAgICAgICAgfSBlbHNlIGlmICgocE91dHB1dERhdGEtPm5GbGFncyAmIE9NWF9CVUZGRVJGTEFHX0VPUykgPT0gT01YX0JVRkZFUkZMQUdfRU9TKSB7CisgICAgICAgICAgICBwU0VDQ29tcG9uZW50LT5nZXRBbGxEZWxheUJ1ZmZlciA9IE9NWF9GQUxTRTsKKyAgICAgICAgICAgIHJldCA9IE9NWF9FcnJvck5vbmU7CisgICAgICAgIH0KKyAgICB9IGVsc2UgeworICAgICAgICBwT3V0cHV0RGF0YS0+dGltZVN0YW1wID0gcElucHV0RGF0YS0+dGltZVN0YW1wOworICAgICAgICBwT3V0cHV0RGF0YS0+bkZsYWdzID0gcElucHV0RGF0YS0+bkZsYWdzOworCisgICAgICAgIGlmICgocFNFQ0NvbXBvbmVudC0+YlNhdmVGbGFnRU9TID09IE9NWF9UUlVFKSB8fAorICAgICAgICAgICAgKHBTRUNDb21wb25lbnQtPmdldEFsbERlbGF5QnVmZmVyID09IE9NWF9UUlVFKSB8fAorICAgICAgICAgICAgKHBJbnB1dERhdGEtPm5GbGFncyAmIE9NWF9CVUZGRVJGTEFHX0VPUykpIHsKKyAgICAgICAgICAgIHBPdXRwdXREYXRhLT5uRmxhZ3MgfD0gT01YX0JVRkZFUkZMQUdfRU9TOworICAgICAgICAgICAgcFNFQ0NvbXBvbmVudC0+Z2V0QWxsRGVsYXlCdWZmZXIgPSBPTVhfRkFMU0U7CisgICAgICAgIH0KKworICAgICAgICBpZiAoKHBWaWRlb0RlYy0+YkZpcnN0RnJhbWUgPT0gT01YX1RSVUUpICYmCisgICAgICAgICAgICAoKHBPdXRwdXREYXRhLT5uRmxhZ3MgJiBPTVhfQlVGRkVSRkxBR19FT1MpID09IE9NWF9CVUZGRVJGTEFHX0VPUykgJiYKKyAgICAgICAgICAgICgocElucHV0RGF0YS0+bkZsYWdzICYgT01YX0JVRkZFUkZMQUdfQ09ERUNDT05GSUcpICE9IE9NWF9CVUZGRVJGTEFHX0NPREVDQ09ORklHKSkgeworICAgICAgICAgICAgcE91dHB1dERhdGEtPm5GbGFncyA9IChwT3V0cHV0RGF0YS0+bkZsYWdzICYgKH5PTVhfQlVGRkVSRkxBR19FT1MpKTsKKyAgICAgICAgfQorCisgICAgICAgIG91dHB1dERhdGFWYWxpZCA9IE9NWF9GQUxTRTsKKworICAgICAgICAvKiByZXQgPSBPTVhfRXJyb3JVbmRlZmluZWQ7ICovCisgICAgICAgIHJldCA9IE9NWF9FcnJvck5vbmU7CisgICAgfQorCisgICAgaWYgKHJldCA9PSBPTVhfRXJyb3JJbnB1dERhdGFEZWNvZGVZZXQpIHsKKyAgICAgICAgcFZpZGVvRGVjLT5NRkNEZWNJbnB1dEJ1ZmZlcltwVmlkZW9EZWMtPmluZGV4SW5wdXRCdWZmZXJdLmRhdGFTaXplID0gb25lRnJhbWVTaXplOworICAgICAgICBwVmlkZW9EZWMtPmluZGV4SW5wdXRCdWZmZXIrKzsKKyAgICAgICAgcFZpZGVvRGVjLT5pbmRleElucHV0QnVmZmVyICU9IE1GQ19JTlBVVF9CVUZGRVJfTlVNX01BWDsKKyAgICAgICAgcFZwOERlYy0+aE1GQ1ZwOEhhbmRsZS5wTUZDU3RyZWFtQnVmZmVyICAgID0gcFZpZGVvRGVjLT5NRkNEZWNJbnB1dEJ1ZmZlcltwVmlkZW9EZWMtPmluZGV4SW5wdXRCdWZmZXJdLlZpckFkZHI7CisgICAgICAgIHBWcDhEZWMtPmhNRkNWcDhIYW5kbGUucE1GQ1N0cmVhbVBoeUJ1ZmZlciA9IHBWaWRlb0RlYy0+TUZDRGVjSW5wdXRCdWZmZXJbcFZpZGVvRGVjLT5pbmRleElucHV0QnVmZmVyXS5QaHlBZGRyOworICAgICAgICBwU0VDQ29tcG9uZW50LT5wcm9jZXNzRGF0YVtJTlBVVF9QT1JUX0lOREVYXS5kYXRhQnVmZmVyID0gcFZpZGVvRGVjLT5NRkNEZWNJbnB1dEJ1ZmZlcltwVmlkZW9EZWMtPmluZGV4SW5wdXRCdWZmZXJdLlZpckFkZHI7CisgICAgICAgIHBTRUNDb21wb25lbnQtPnByb2Nlc3NEYXRhW0lOUFVUX1BPUlRfSU5ERVhdLmFsbG9jU2l6ZSA9IHBWaWRlb0RlYy0+TUZDRGVjSW5wdXRCdWZmZXJbcFZpZGVvRGVjLT5pbmRleElucHV0QnVmZmVyXS5idWZmZXJTaXplOworICAgICAgICBvbmVGcmFtZVNpemUgPSBwVmlkZW9EZWMtPk1GQ0RlY0lucHV0QnVmZmVyW3BWaWRlb0RlYy0+aW5kZXhJbnB1dEJ1ZmZlcl0uZGF0YVNpemU7CisgICAgICAgIC8vcElucHV0RGF0YS0+ZGF0YUxlbiA9IG9uZUZyYW1lU2l6ZTsKKyAgICAgICAgLy9wSW5wdXREYXRhLT5yZW1haW5EYXRhTGVuID0gb25lRnJhbWVTaXplOworICAgIH0KKworICAgIGlmICgoQ2hlY2tfVlA4X1N0YXJ0Q29kZShwSW5wdXREYXRhLT5kYXRhQnVmZmVyLCBvbmVGcmFtZVNpemUpID09IE9NWF9UUlVFKSAmJgorICAgICAgICAoKHBPdXRwdXREYXRhLT5uRmxhZ3MgJiBPTVhfQlVGRkVSRkxBR19FT1MpICE9IE9NWF9CVUZGRVJGTEFHX0VPUykpIHsKKyAgICAgICAgaWYgKChyZXQgIT0gT01YX0Vycm9ySW5wdXREYXRhRGVjb2RlWWV0KSB8fCAocFNFQ0NvbXBvbmVudC0+Z2V0QWxsRGVsYXlCdWZmZXIgPT0gT01YX1RSVUUpKSB7CisgICAgICAgICAgICBTc2JTaXBNZmNEZWNTZXRDb25maWcocFZwOERlYy0+aE1GQ1ZwOEhhbmRsZS5oTUZDSGFuZGxlLCBNRkNfREVDX1NFVENPTkZfRlJBTUVfVEFHLCAmKHBWcDhEZWMtPmhNRkNWcDhIYW5kbGUuaW5kZXhUaW1lc3RhbXApKTsKKyAgICAgICAgICAgIHBWcDhEZWMtPmhNRkNWcDhIYW5kbGUuaW5kZXhUaW1lc3RhbXArKzsKKyAgICAgICAgICAgIHBWcDhEZWMtPmhNRkNWcDhIYW5kbGUuaW5kZXhUaW1lc3RhbXAgJT0gTUFYX1RJTUVTVEFNUDsKKyAgICAgICAgfQorCisgICAgICAgIFNzYlNpcE1mY0RlY1NldEluQnVmKHBWcDhEZWMtPmhNRkNWcDhIYW5kbGUuaE1GQ0hhbmRsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcFZwOERlYy0+aE1GQ1ZwOEhhbmRsZS5wTUZDU3RyZWFtUGh5QnVmZmVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwVnA4RGVjLT5oTUZDVnA4SGFuZGxlLnBNRkNTdHJlYW1CdWZmZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBTRUNDb21wb25lbnQtPnByb2Nlc3NEYXRhW0lOUFVUX1BPUlRfSU5ERVhdLmFsbG9jU2l6ZSk7CisKKyAgICAgICAgcFZpZGVvRGVjLT5NRkNEZWNJbnB1dEJ1ZmZlcltwVmlkZW9EZWMtPmluZGV4SW5wdXRCdWZmZXJdLmRhdGFTaXplID0gb25lRnJhbWVTaXplOworICAgICAgICBwVmlkZW9EZWMtPk5CRGVjVGhyZWFkLm9uZUZyYW1lU2l6ZSA9IG9uZUZyYW1lU2l6ZTsKKworICAgICAgICAvKiBtZmMgZGVjb2RlIHN0YXJ0ICovCisgICAgICAgIFNFQ19PU0FMX1NlbWFwaG9yZVBvc3QocFZpZGVvRGVjLT5OQkRlY1RocmVhZC5oRGVjRnJhbWVTdGFydCk7CisgICAgICAgIHBWaWRlb0RlYy0+TkJEZWNUaHJlYWQuYkRlY29kZXJSdW4gPSBPTVhfVFJVRTsKKyAgICAgICAgcFZwOERlYy0+aE1GQ1ZwOEhhbmRsZS5yZXR1cm5Db2RlYyA9IE1GQ19SRVRfT0s7CisKKyAgICAgICAgU0VDX09TQUxfU2xlZXBNaWxsaXNlYygwKTsKKworICAgICAgICBwVmlkZW9EZWMtPmluZGV4SW5wdXRCdWZmZXIrKzsKKyAgICAgICAgcFZpZGVvRGVjLT5pbmRleElucHV0QnVmZmVyICU9IE1GQ19JTlBVVF9CVUZGRVJfTlVNX01BWDsKKyAgICAgICAgcFZwOERlYy0+aE1GQ1ZwOEhhbmRsZS5wTUZDU3RyZWFtQnVmZmVyICAgID0gcFZpZGVvRGVjLT5NRkNEZWNJbnB1dEJ1ZmZlcltwVmlkZW9EZWMtPmluZGV4SW5wdXRCdWZmZXJdLlZpckFkZHI7CisgICAgICAgIHBWcDhEZWMtPmhNRkNWcDhIYW5kbGUucE1GQ1N0cmVhbVBoeUJ1ZmZlciA9IHBWaWRlb0RlYy0+TUZDRGVjSW5wdXRCdWZmZXJbcFZpZGVvRGVjLT5pbmRleElucHV0QnVmZmVyXS5QaHlBZGRyOworICAgICAgICBwU0VDQ29tcG9uZW50LT5wcm9jZXNzRGF0YVtJTlBVVF9QT1JUX0lOREVYXS5kYXRhQnVmZmVyID0gcFZpZGVvRGVjLT5NRkNEZWNJbnB1dEJ1ZmZlcltwVmlkZW9EZWMtPmluZGV4SW5wdXRCdWZmZXJdLlZpckFkZHI7CisgICAgICAgIHBTRUNDb21wb25lbnQtPnByb2Nlc3NEYXRhW0lOUFVUX1BPUlRfSU5ERVhdLmFsbG9jU2l6ZSA9IHBWaWRlb0RlYy0+TUZDRGVjSW5wdXRCdWZmZXJbcFZpZGVvRGVjLT5pbmRleElucHV0QnVmZmVyXS5idWZmZXJTaXplOworCisgICAgICAgIGlmICgocFZpZGVvRGVjLT5iRmlyc3RGcmFtZSA9PSBPTVhfVFJVRSkgJiYKKyAgICAgICAgICAgIChwU0VDQ29tcG9uZW50LT5iU2F2ZUZsYWdFT1MgPT0gT01YX1RSVUUpICYmCisgICAgICAgICAgICAob3V0cHV0RGF0YVZhbGlkID09IE9NWF9GQUxTRSkpIHsKKyAgICAgICAgICAgIHJldCA9IE9NWF9FcnJvcklucHV0RGF0YURlY29kZVlldDsKKyAgICAgICAgfQorCisgICAgICAgIHBWaWRlb0RlYy0+YkZpcnN0RnJhbWUgPSBPTVhfRkFMU0U7CisgICAgfSBlbHNlIHsKKyAgICAgICAgaWYgKHBTRUNDb21wb25lbnQtPmNoZWNrVGltZVN0YW1wLm5lZWRDaGVja1N0YXJ0VGltZVN0YW1wID09IE9NWF9UUlVFKQorICAgICAgICAgICAgcFNFQ0NvbXBvbmVudC0+Y2hlY2tUaW1lU3RhbXAubmVlZFNldFN0YXJ0VGltZVN0YW1wID0gT01YX1RSVUU7CisgICAgfQorCisgICAgLyoqIEZpbGwgT3V0cHV0IEJ1ZmZlciAqKi8KKyAgICBpZiAob3V0cHV0RGF0YVZhbGlkID09IE9NWF9UUlVFKSB7CisgICAgICAgIHZvaWQgKnBPdXRwdXRCdWYgPSAodm9pZCAqKXBPdXRwdXREYXRhLT5kYXRhQnVmZmVyOworICAgICAgICB2b2lkICpwU3JjQnVmWzNdID0ge05VTEwsIH07CisgICAgICAgIHZvaWQgKnBZVVZCdWZbM10gPSB7TlVMTCwgfTsKKyAgICAgICAgdW5zaWduZWQgaW50IGNzY19zcmNfY29sb3JfZm9ybWF0LCBjc2NfZHN0X2NvbG9yX2Zvcm1hdDsKKyAgICAgICAgQ1NDX01FVEhPRCBjc2NfbWV0aG9kID0gQ1NDX01FVEhPRF9TVzsKKyAgICAgICAgdW5zaWduZWQgaW50IGNhY2hlYWJsZSA9IDE7CisKKyAgICAgICAgaW50IGZyYW1lU2l6ZSA9IGJ1ZldpZHRoICogYnVmSGVpZ2h0OworICAgICAgICBpbnQgd2lkdGggPSBvdXRwdXRJbmZvLmltZ193aWR0aDsKKyAgICAgICAgaW50IGhlaWdodCA9IG91dHB1dEluZm8uaW1nX2hlaWdodDsKKyAgICAgICAgaW50IGltYWdlU2l6ZSA9IG91dHB1dEluZm8uaW1nX3dpZHRoICogb3V0cHV0SW5mby5pbWdfaGVpZ2h0OworCisgICAgICAgIHBTcmNCdWZbMF0gPSBvdXRwdXRJbmZvLllWaXJBZGRyOworICAgICAgICBwU3JjQnVmWzFdID0gb3V0cHV0SW5mby5DVmlyQWRkcjsKKworICAgICAgICBwWVVWQnVmWzBdICA9ICh1bnNpZ25lZCBjaGFyICopcE91dHB1dEJ1ZjsKKyAgICAgICAgcFlVVkJ1ZlsxXSAgPSAodW5zaWduZWQgY2hhciAqKXBPdXRwdXRCdWYgKyBpbWFnZVNpemU7CisgICAgICAgIHBZVVZCdWZbMl0gID0gKHVuc2lnbmVkIGNoYXIgKilwT3V0cHV0QnVmICsgaW1hZ2VTaXplICsgaW1hZ2VTaXplIC8gNDsKKyAgICAgICAgcE91dHB1dERhdGEtPmRhdGFMZW4gPSAoaW1hZ2VTaXplICogMykgLyAyOworCisjaWZkZWYgVVNFX0FOQgorICAgICAgICBpZiAocFNFQ091dHB1dFBvcnQtPmJJc0FOQkVuYWJsZWQgPT0gT01YX1RSVUUpIHsKKyAgICAgICAgICAgIHVuc2lnbmVkIGludCBzdHJpZGU7CisgICAgICAgICAgICBTRUNfT1NBTF9Mb2NrQU5CKHBPdXRwdXREYXRhLT5kYXRhQnVmZmVyLCB3aWR0aCwgaGVpZ2h0LCBwU0VDQ29tcG9uZW50LT5wU0VDUG9ydFtPVVRQVVRfUE9SVF9JTkRFWF0ucG9ydERlZmluaXRpb24uZm9ybWF0LnZpZGVvLmVDb2xvckZvcm1hdCwgJnN0cmlkZSwgcFlVVkJ1Zik7CisgICAgICAgICAgICB3aWR0aCA9IHN0cmlkZTsKKyAgICAgICAgICAgIHBPdXRwdXREYXRhLT5kYXRhTGVuID0gc2l6ZW9mKHZvaWQgKik7CisgICAgICAgICB9CisjZW5kaWYKKyAgICAgICAgaWYgKChwVmlkZW9EZWMtPmJUaHVtYm5haWxNb2RlID09IE9NWF9GQUxTRSkgJiYKKyAgICAgICAgICAgIChwU0VDT3V0cHV0UG9ydC0+cG9ydERlZmluaXRpb24uZm9ybWF0LnZpZGVvLmVDb2xvckZvcm1hdCA9PSBPTVhfU0VDX0NPTE9SX0Zvcm1hdE5WMTJUUGh5c2ljYWxBZGRyZXNzKSkgeworICAgICAgICAgICAgLyogaWYgdXNlIFBvc3QgY29weSBhZGRyZXNzIHN0cnVjdHVyZSAqLworICAgICAgICAgICAgU0VDX09TQUxfTWVtY3B5KHBZVVZCdWZbMF0sICYob3V0cHV0SW5mby5ZUGh5QWRkciksIHNpemVvZihvdXRwdXRJbmZvLllQaHlBZGRyKSk7CisgICAgICAgICAgICBTRUNfT1NBTF9NZW1jcHkoKHVuc2lnbmVkIGNoYXIgKilwWVVWQnVmWzBdICsgKHNpemVvZih2b2lkICopICogMSksICYob3V0cHV0SW5mby5DUGh5QWRkciksIHNpemVvZihvdXRwdXRJbmZvLkNQaHlBZGRyKSk7CisgICAgICAgICAgICBTRUNfT1NBTF9NZW1jcHkoKHVuc2lnbmVkIGNoYXIgKilwWVVWQnVmWzBdICsgKHNpemVvZih2b2lkICopICogMiksICYob3V0cHV0SW5mby5ZVmlyQWRkciksIHNpemVvZihvdXRwdXRJbmZvLllWaXJBZGRyKSk7CisgICAgICAgICAgICBTRUNfT1NBTF9NZW1jcHkoKHVuc2lnbmVkIGNoYXIgKilwWVVWQnVmWzBdICsgKHNpemVvZih2b2lkICopICogMyksICYob3V0cHV0SW5mby5DVmlyQWRkciksIHNpemVvZihvdXRwdXRJbmZvLkNWaXJBZGRyKSk7CisgICAgICAgICAgICBwT3V0cHV0RGF0YS0+ZGF0YUxlbiA9ICh3aWR0aCAqIGhlaWdodCAqIDMpIC8gMjsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIFNFQ19PU0FMX0xvZyhTRUNfTE9HX1RSQUNFLCAiWVVWNDIwIFNQL1AgT3V0cHV0IG1vZGUiKTsKKyNpZmRlZiBDT05GSUdfTUZDX0ZQUworICAgICAgICAgICAgU0VDX09TQUxfUGVyZlN0YXJ0KFBFUkZfSURfQ1NDKTsKKyNlbmRpZgorICAgICAgICAgICAgc3dpdGNoIChwU0VDQ29tcG9uZW50LT5wU0VDUG9ydFtPVVRQVVRfUE9SVF9JTkRFWF0ucG9ydERlZmluaXRpb24uZm9ybWF0LnZpZGVvLmVDb2xvckZvcm1hdCkgeworICAgICAgICAgICAgY2FzZSBPTVhfU0VDX0NPTE9SX0Zvcm1hdE5WMTJUaWxlZDoKKyAgICAgICAgICAgICAgICBTRUNfT1NBTF9NZW1jcHkocE91dHB1dEJ1Ziwgb3V0cHV0SW5mby5ZVmlyQWRkciwgRnJhbWVCdWZmZXJZU2l6ZSk7CisgICAgICAgICAgICAgICAgU0VDX09TQUxfTWVtY3B5KCh1bnNpZ25lZCBjaGFyICopcE91dHB1dEJ1ZiArIEZyYW1lQnVmZmVyWVNpemUsIG91dHB1dEluZm8uQ1ZpckFkZHIsIEZyYW1lQnVmZmVyVVZTaXplKTsKKyAgICAgICAgICAgICAgICBwT3V0cHV0RGF0YS0+ZGF0YUxlbiA9IEZyYW1lQnVmZmVyWVNpemUgKyBGcmFtZUJ1ZmZlclVWU2l6ZTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgT01YX0NPTE9SX0Zvcm1hdFlVVjQyMFNlbWlQbGFuYXI6CisgICAgICAgICAgICBjYXNlIE9NWF9TRUNfQ09MT1JfRm9ybWF0QU5CWVVWNDIwU2VtaVBsYW5hcjoKKyAgICAgICAgICAgICAgICBjc2Nfc3JjX2NvbG9yX2Zvcm1hdCA9IG9teF8yX2hhbF9waXhlbF9mb3JtYXQoKHVuc2lnbmVkIGludClPTVhfU0VDX0NPTE9SX0Zvcm1hdE5WMTJUaWxlZCk7CisgICAgICAgICAgICAgICAgY3NjX2RzdF9jb2xvcl9mb3JtYXQgPSBvbXhfMl9oYWxfcGl4ZWxfZm9ybWF0KCh1bnNpZ25lZCBpbnQpT01YX0NPTE9SX0Zvcm1hdFlVVjQyMFNlbWlQbGFuYXIpOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBPTVhfQ09MT1JfRm9ybWF0WVVWNDIwUGxhbmFyOgorICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICBjc2Nfc3JjX2NvbG9yX2Zvcm1hdCA9IG9teF8yX2hhbF9waXhlbF9mb3JtYXQoKHVuc2lnbmVkIGludClPTVhfU0VDX0NPTE9SX0Zvcm1hdE5WMTJUaWxlZCk7CisgICAgICAgICAgICAgICAgY3NjX2RzdF9jb2xvcl9mb3JtYXQgPSBvbXhfMl9oYWxfcGl4ZWxfZm9ybWF0KCh1bnNpZ25lZCBpbnQpT01YX0NPTE9SX0Zvcm1hdFlVVjQyMFBsYW5hcik7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGNzY19nZXRfbWV0aG9kKHBWaWRlb0RlYy0+Y3NjX2hhbmRsZSwgJmNzY19tZXRob2QpOworI2lmZGVmIFVTRV9DU0NfRklNQworICAgICAgICAgICAgaWYgKChwU0VDT3V0cHV0UG9ydC0+YklzQU5CRW5hYmxlZCA9PSBPTVhfVFJVRSkgJiYgKGNzY19tZXRob2QgPT0gQ1NDX01FVEhPRF9IVykpIHsKKyAgICAgICAgICAgICAgICBTRUNfT1NBTF9HZXRQaHlzQU5CKHBPdXRwdXREYXRhLT5kYXRhQnVmZmVyLCBwWVVWQnVmKTsKKyAgICAgICAgICAgICAgICBwU3JjQnVmWzBdID0gb3V0cHV0SW5mby5ZUGh5QWRkcjsKKyAgICAgICAgICAgICAgICBwU3JjQnVmWzFdID0gb3V0cHV0SW5mby5DUGh5QWRkcjsKKyAgICAgICAgICAgIH0KKyNlbmRpZgorICAgICAgICAgICAgaWYgKHBWaWRlb0RlYy0+Y3NjX3NldF9mb3JtYXQgPT0gT01YX0ZBTFNFKSB7CisgICAgICAgICAgICAgICAgY3NjX3NldF9zcmNfZm9ybWF0KAorICAgICAgICAgICAgICAgICAgICBwVmlkZW9EZWMtPmNzY19oYW5kbGUsICAvKiBoYW5kbGUgKi8KKyAgICAgICAgICAgICAgICAgICAgd2lkdGgsICAgICAgICAgICAgICAgICAgLyogd2lkdGggKi8KKyAgICAgICAgICAgICAgICAgICAgaGVpZ2h0LCAgICAgICAgICAgICAgICAgLyogaGVpZ2h0ICovCisgICAgICAgICAgICAgICAgICAgIDAsICAgICAgICAgICAgICAgICAgICAgIC8qIGNyb3BfbGVmdCAqLworICAgICAgICAgICAgICAgICAgICAwLCAgICAgICAgICAgICAgICAgICAgICAvKiBjcm9wX3JpZ2h0ICovCisgICAgICAgICAgICAgICAgICAgIHdpZHRoLCAgICAgICAgICAgICAgICAgIC8qIGNyb3Bfd2lkdGggKi8KKyAgICAgICAgICAgICAgICAgICAgaGVpZ2h0LCAgICAgICAgICAgICAgICAgLyogY3JvcF9oZWlnaHQgKi8KKyAgICAgICAgICAgICAgICAgICAgY3NjX3NyY19jb2xvcl9mb3JtYXQsICAgLyogY29sb3JfZm9ybWF0ICovCisgICAgICAgICAgICAgICAgICAgIGNhY2hlYWJsZSk7ICAgICAgICAgICAgIC8qIGNhY2hlYWJsZSAqLworICAgICAgICAgICAgICAgIGNzY19zZXRfZHN0X2Zvcm1hdCgKKyAgICAgICAgICAgICAgICAgICAgcFZpZGVvRGVjLT5jc2NfaGFuZGxlLCAgLyogaGFuZGxlICovCisgICAgICAgICAgICAgICAgICAgIHdpZHRoLCAgICAgICAgICAgICAgICAgIC8qIHdpZHRoICovCisgICAgICAgICAgICAgICAgICAgIGhlaWdodCwgICAgICAgICAgICAgICAgIC8qIGhlaWdodCAqLworICAgICAgICAgICAgICAgICAgICAwLCAgICAgICAgICAgICAgICAgICAgICAvKiBjcm9wX2xlZnQgKi8KKyAgICAgICAgICAgICAgICAgICAgMCwgICAgICAgICAgICAgICAgICAgICAgLyogY3JvcF9yaWdodCAqLworICAgICAgICAgICAgICAgICAgICB3aWR0aCwgICAgICAgICAgICAgICAgICAvKiBjcm9wX3dpZHRoICovCisgICAgICAgICAgICAgICAgICAgIGhlaWdodCwgICAgICAgICAgICAgICAgIC8qIGNyb3BfaGVpZ2h0ICovCisgICAgICAgICAgICAgICAgICAgIGNzY19kc3RfY29sb3JfZm9ybWF0LCAgIC8qIGNvbG9yX2Zvcm1hdCAqLworICAgICAgICAgICAgICAgICAgICBjYWNoZWFibGUpOyAgICAgICAgICAgICAvKiBjYWNoZWFibGUgKi8KKyAgICAgICAgICAgICAgICBwVmlkZW9EZWMtPmNzY19zZXRfZm9ybWF0ID0gT01YX1RSVUU7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBjc2Nfc2V0X3NyY19idWZmZXIoCisgICAgICAgICAgICAgICAgcFZpZGVvRGVjLT5jc2NfaGFuZGxlLCAgLyogaGFuZGxlICovCisgICAgICAgICAgICAgICAgcFNyY0J1ZlswXSwgICAgICAgICAgICAgLyogeSBhZGRyICovCisgICAgICAgICAgICAgICAgcFNyY0J1ZlsxXSwgICAgICAgICAgICAgLyogdSBhZGRyIG9yIHV2IGFkZHIgKi8KKyAgICAgICAgICAgICAgICBwU3JjQnVmWzJdLCAgICAgICAgICAgICAvKiB2IGFkZHIgb3Igbm9uZSAqLworICAgICAgICAgICAgICAgIDApOyAgICAgICAgICAgICAgICAgICAgIC8qIGlvbiBmZCAqLworICAgICAgICAgICAgY3NjX3NldF9kc3RfYnVmZmVyKAorICAgICAgICAgICAgICAgIHBWaWRlb0RlYy0+Y3NjX2hhbmRsZSwKKyAgICAgICAgICAgICAgICBwWVVWQnVmWzBdLCAgICAgICAgICAgICAvKiB5IGFkZHIgKi8KKyAgICAgICAgICAgICAgICBwWVVWQnVmWzFdLCAgICAgICAgICAgICAvKiB1IGFkZHIgb3IgdXYgYWRkciAqLworICAgICAgICAgICAgICAgIHBZVVZCdWZbMl0sICAgICAgICAgICAgIC8qIHYgYWRkciBvciBub25lICovCisgICAgICAgICAgICAgICAgMCk7ICAgICAgICAgICAgICAgICAgICAgLyogaW9uIGZkICovCisgICAgICAgICAgICBjc2NfY29udmVydChwVmlkZW9EZWMtPmNzY19oYW5kbGUpOworCisjaWZkZWYgQ09ORklHX01GQ19GUFMKKyAgICAgICAgICAgIFNFQ19PU0FMX1BlcmZTdG9wKFBFUkZfSURfQ1NDKTsKKyNlbmRpZgorICAgICAgICB9CisjaWZkZWYgVVNFX0FOQgorICAgICAgICBpZiAocFNFQ091dHB1dFBvcnQtPmJJc0FOQkVuYWJsZWQgPT0gT01YX1RSVUUpIHsKKyAgICAgICAgICAgIFNFQ19PU0FMX1VubG9ja0FOQihwT3V0cHV0RGF0YS0+ZGF0YUJ1ZmZlcik7CisgICAgICAgIH0KKyNlbmRpZgorICAgIH0gZWxzZSB7CisgICAgICAgIHBPdXRwdXREYXRhLT5kYXRhTGVuID0gMDsKKyAgICB9CisKK0VYSVQ6CisgICAgRnVuY3Rpb25PdXQoKTsKKworICAgIHJldHVybiByZXQ7Cit9CisKK09NWF9FUlJPUlRZUEUgU0VDX01GQ19WUDhfRGVjb2RlX0Jsb2NrKE9NWF9DT01QT05FTlRUWVBFICpwT01YQ29tcG9uZW50LCBTRUNfT01YX0RBVEEgKnBJbnB1dERhdGEsIFNFQ19PTVhfREFUQSAqcE91dHB1dERhdGEpCit7CisgICAgT01YX0VSUk9SVFlQRSAgICAgICAgICAgICAgIHJldCA9IE9NWF9FcnJvck5vbmU7CisgICAgU0VDX09NWF9CQVNFQ09NUE9ORU5UICAgICAgKnBTRUNDb21wb25lbnQgPSAoU0VDX09NWF9CQVNFQ09NUE9ORU5UICopcE9NWENvbXBvbmVudC0+cENvbXBvbmVudFByaXZhdGU7CisgICAgU0VDX09NWF9WSURFT0RFQ19DT01QT05FTlQgKnBWaWRlb0RlYyA9IChTRUNfT01YX1ZJREVPREVDX0NPTVBPTkVOVCAqKXBTRUNDb21wb25lbnQtPmhDb21wb25lbnRIYW5kbGU7CisgICAgU0VDX09NWF9CQVNFUE9SVCAgICAgICAgICAgKnBTRUNJbnB1dFBvcnQgPSAmcFNFQ0NvbXBvbmVudC0+cFNFQ1BvcnRbSU5QVVRfUE9SVF9JTkRFWF07CisgICAgU0VDX09NWF9CQVNFUE9SVCAgICAgICAgICAgKnBTRUNPdXRwdXRQb3J0ID0gJnBTRUNDb21wb25lbnQtPnBTRUNQb3J0W09VVFBVVF9QT1JUX0lOREVYXTsKKyAgICBTRUNfVlA4REVDX0hBTkRMRSAgICAgICAgICpwVnA4RGVjID0gKFNFQ19WUDhERUNfSEFORExFICopKChTRUNfT01YX1ZJREVPREVDX0NPTVBPTkVOVCAqKXBTRUNDb21wb25lbnQtPmhDb21wb25lbnRIYW5kbGUpLT5oQ29kZWNIYW5kbGU7CisgICAgT01YX1UzMiAgICAgICAgICAgICAgICAgICAgIG9uZUZyYW1lU2l6ZSA9IHBJbnB1dERhdGEtPmRhdGFMZW47CisgICAgU1NCU0lQX01GQ19ERUNfT1VUUFVUX0lORk8gIG91dHB1dEluZm87CisgICAgT01YX1MzMiAgICAgICAgICAgICAgICAgICAgIHNldENvbmZWYWwgPSAwOworICAgIE9NWF9TMzIgICAgICAgICAgICAgICAgICAgICByZXR1cm5Db2RlYyA9IDA7CisgICAgaW50ICAgICAgICAgICAgICAgICAgICAgICAgIGJ1ZldpZHRoID0gMDsKKyAgICBpbnQgICAgICAgICAgICAgICAgICAgICAgICAgYnVmSGVpZ2h0ID0gMDsKKyAgICBPTVhfVTMyICAgICAgICAgICAgICAgICAgICAgRnJhbWVCdWZmZXJZU2l6ZTsKKyAgICBPTVhfVTMyICAgICAgICAgICAgICAgICAgICAgRnJhbWVCdWZmZXJVVlNpemU7CisKKyAgICBGdW5jdGlvbkluKCk7CisKKyAgICBpZiAocFZwOERlYy0+aE1GQ1ZwOEhhbmRsZS5iQ29uZmlndXJlZE1GQyA9PSBPTVhfRkFMU0UpIHsKKyAgICAgICAgU1NCU0lQX01GQ19DT0RFQ19UWVBFIGVDb2RlY1R5cGUgPSBWUDhfREVDOworCisgICAgICAgIGlmICgob25lRnJhbWVTaXplIDw9IDApICYmIChwSW5wdXREYXRhLT5uRmxhZ3MgJiBPTVhfQlVGRkVSRkxBR19FT1MpKSB7CisgICAgICAgICAgICBwT3V0cHV0RGF0YS0+dGltZVN0YW1wID0gcElucHV0RGF0YS0+dGltZVN0YW1wOworICAgICAgICAgICAgcE91dHB1dERhdGEtPm5GbGFncyA9IHBJbnB1dERhdGEtPm5GbGFnczsKKyAgICAgICAgICAgIHJldCA9IE9NWF9FcnJvck5vbmU7CisgICAgICAgICAgICBnb3RvIEVYSVQ7CisgICAgICAgIH0KKworICAgICAgICAvKiBEZWZhdWx0IG51bWJlciBpbiB0aGUgZHJpdmVyIGlzIG9wdGltaXplZCAqLworICAgICAgICBpZiAocFZpZGVvRGVjLT5iVGh1bWJuYWlsTW9kZSA9PSBPTVhfVFJVRSkgeworICAgICAgICAgICAgc2V0Q29uZlZhbCA9IDA7CisgICAgICAgICAgICBTc2JTaXBNZmNEZWNTZXRDb25maWcocFZwOERlYy0+aE1GQ1ZwOEhhbmRsZS5oTUZDSGFuZGxlLCBNRkNfREVDX1NFVENPTkZfRElTUExBWV9ERUxBWSwgJnNldENvbmZWYWwpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgc2V0Q29uZlZhbCA9IFZQOF9ERUNfTlVNX09GX0VYVFJBX0JVRkZFUlM7CisgICAgICAgICAgICBTc2JTaXBNZmNEZWNTZXRDb25maWcocFZwOERlYy0+aE1GQ1ZwOEhhbmRsZS5oTUZDSGFuZGxlLCBNRkNfREVDX1NFVENPTkZfRVhUUkFfQlVGRkVSX05VTSwgJnNldENvbmZWYWwpOworICAgICAgICB9CisKKyAgICAgICAgcmV0dXJuQ29kZWMgPSBTc2JTaXBNZmNEZWNJbml0KHBWcDhEZWMtPmhNRkNWcDhIYW5kbGUuaE1GQ0hhbmRsZSwgZUNvZGVjVHlwZSwgb25lRnJhbWVTaXplKTsKKyAgICAgICAgaWYgKHJldHVybkNvZGVjID09IE1GQ19SRVRfT0spIHsKKyAgICAgICAgICAgIFNTQlNJUF9NRkNfSU1HX1JFU09MVVRJT04gaW1nUmVzb2w7CisKKyAgICAgICAgICAgIFNzYlNpcE1mY0RlY0dldENvbmZpZyhwVnA4RGVjLT5oTUZDVnA4SGFuZGxlLmhNRkNIYW5kbGUsIE1GQ19ERUNfR0VUQ09ORl9CVUZfV0lEVEhfSEVJR0hULCAmaW1nUmVzb2wpOworICAgICAgICAgICAgU0VDX09TQUxfTG9nKFNFQ19MT0dfVFJBQ0UsICJzZXQgd2lkdGggaGVpZ2h0IGluZm9ybWF0aW9uIDogJWQsICVkIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBwU0VDSW5wdXRQb3J0LT5wb3J0RGVmaW5pdGlvbi5mb3JtYXQudmlkZW8ubkZyYW1lV2lkdGgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcFNFQ0lucHV0UG9ydC0+cG9ydERlZmluaXRpb24uZm9ybWF0LnZpZGVvLm5GcmFtZUhlaWdodCk7CisgICAgICAgICAgICBTRUNfT1NBTF9Mb2coU0VDX0xPR19UUkFDRSwgIm1mYyB3aWR0aCBoZWlnaHQgaW5mb3JtYXRpb24gOiAlZCwgJWQiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGltZ1Jlc29sLndpZHRoLCBpbWdSZXNvbC5oZWlnaHQpOworCisgICAgICAgICAgICAvKiogVXBkYXRlIEZyYW1lIFNpemUgKiovCisgICAgICAgICAgICBpZiAoKHBTRUNJbnB1dFBvcnQtPnBvcnREZWZpbml0aW9uLmZvcm1hdC52aWRlby5uRnJhbWVXaWR0aCAhPSBpbWdSZXNvbC53aWR0aCkgfHwKKyAgICAgICAgICAgICAgICAocFNFQ0lucHV0UG9ydC0+cG9ydERlZmluaXRpb24uZm9ybWF0LnZpZGVvLm5GcmFtZUhlaWdodCAhPSBpbWdSZXNvbC5oZWlnaHQpKSB7CisgICAgICAgICAgICAgICAgU0VDX09TQUxfTG9nKFNFQ19MT0dfVFJBQ0UsICJjaGFuZ2Ugd2lkdGggaGVpZ2h0IGluZm9ybWF0aW9uIDogT01YX0V2ZW50UG9ydFNldHRpbmdzQ2hhbmdlZCIpOworICAgICAgICAgICAgICAgIC8qIGNoYW5nZSB3aWR0aCBhbmQgaGVpZ2h0IGluZm9ybWF0aW9uICovCisgICAgICAgICAgICAgICAgcFNFQ0lucHV0UG9ydC0+cG9ydERlZmluaXRpb24uZm9ybWF0LnZpZGVvLm5GcmFtZVdpZHRoID0gaW1nUmVzb2wud2lkdGg7CisgICAgICAgICAgICAgICAgcFNFQ0lucHV0UG9ydC0+cG9ydERlZmluaXRpb24uZm9ybWF0LnZpZGVvLm5GcmFtZUhlaWdodCA9IGltZ1Jlc29sLmhlaWdodDsKKyAgICAgICAgICAgICAgICBwU0VDSW5wdXRQb3J0LT5wb3J0RGVmaW5pdGlvbi5mb3JtYXQudmlkZW8ublN0cmlkZSAgICAgID0gKChpbWdSZXNvbC53aWR0aCArIDE1KSAmICh+MTUpKTsKKyAgICAgICAgICAgICAgICBwU0VDSW5wdXRQb3J0LT5wb3J0RGVmaW5pdGlvbi5mb3JtYXQudmlkZW8ublNsaWNlSGVpZ2h0ID0gKChpbWdSZXNvbC5oZWlnaHQgKyAxNSkgJiAofjE1KSk7CisKKyAgICAgICAgICAgICAgICBTRUNfVXBkYXRlRnJhbWVTaXplKHBPTVhDb21wb25lbnQpOworCisgICAgICAgICAgICAgICAgLyoqIFNlbmQgUG9ydCBTZXR0aW5ncyBjaGFuZ2VkIGNhbGwgYmFjayAqKi8KKyAgICAgICAgICAgICAgICAoKihwU0VDQ29tcG9uZW50LT5wQ2FsbGJhY2tzLT5FdmVudEhhbmRsZXIpKQorICAgICAgICAgICAgICAgICAgICAgIChwT01YQ29tcG9uZW50LAorICAgICAgICAgICAgICAgICAgICAgICBwU0VDQ29tcG9uZW50LT5jYWxsYmFja0RhdGEsCisgICAgICAgICAgICAgICAgICAgICAgIE9NWF9FdmVudFBvcnRTZXR0aW5nc0NoYW5nZWQsIC8qIFRoZSBjb21tYW5kIHdhcyBjb21wbGV0ZWQgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgT01YX0Rpck91dHB1dCwgLyogVGhpcyBpcyB0aGUgcG9ydCBpbmRleCAqLworICAgICAgICAgICAgICAgICAgICAgICAwLAorICAgICAgICAgICAgICAgICAgICAgICBOVUxMKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgcFZwOERlYy0+aE1GQ1ZwOEhhbmRsZS5iQ29uZmlndXJlZE1GQyA9IE9NWF9UUlVFOworICAgICAgICAgICAgcE91dHB1dERhdGEtPnRpbWVTdGFtcCA9IHBJbnB1dERhdGEtPnRpbWVTdGFtcDsKKyAgICAgICAgICAgIHBPdXRwdXREYXRhLT5uRmxhZ3MgPSBwSW5wdXREYXRhLT5uRmxhZ3M7CisKKyAgICAgICAgICAgIHJldCA9IE9NWF9FcnJvcklucHV0RGF0YURlY29kZVlldDsKKyAgICAgICAgICAgIGdvdG8gRVhJVDsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHJldCA9IE9NWF9FcnJvck1GQ0luaXQ7CisgICAgICAgICAgICBnb3RvIEVYSVQ7CisgICAgICAgIH0KKyAgICB9CisKKyNpZm5kZWYgRlVMTF9GUkFNRV9TRUFSQ0gKKyAgICBpZiAoKHBJbnB1dERhdGEtPm5GbGFncyAmIE9NWF9CVUZGRVJGTEFHX0VORE9GRlJBTUUpICYmCisgICAgICAgIChwU0VDQ29tcG9uZW50LT5iVXNlRmxhZ0VPRiA9PSBPTVhfRkFMU0UpKQorICAgICAgICBwU0VDQ29tcG9uZW50LT5iVXNlRmxhZ0VPRiA9IE9NWF9UUlVFOworI2VuZGlmCisKKyAgICBpZiAoQ2hlY2tfVlA4X1N0YXJ0Q29kZShwSW5wdXREYXRhLT5kYXRhQnVmZmVyLCBwSW5wdXREYXRhLT5kYXRhTGVuKSA9PSBPTVhfVFJVRSkgeworICAgICAgICBwU0VDQ29tcG9uZW50LT50aW1lU3RhbXBbcFZwOERlYy0+aE1GQ1ZwOEhhbmRsZS5pbmRleFRpbWVzdGFtcF0gPSBwSW5wdXREYXRhLT50aW1lU3RhbXA7CisgICAgICAgIHBTRUNDb21wb25lbnQtPm5GbGFnc1twVnA4RGVjLT5oTUZDVnA4SGFuZGxlLmluZGV4VGltZXN0YW1wXSA9IHBJbnB1dERhdGEtPm5GbGFnczsKKyAgICAgICAgU3NiU2lwTWZjRGVjU2V0Q29uZmlnKHBWcDhEZWMtPmhNRkNWcDhIYW5kbGUuaE1GQ0hhbmRsZSwgTUZDX0RFQ19TRVRDT05GX0ZSQU1FX1RBRywgJihwVnA4RGVjLT5oTUZDVnA4SGFuZGxlLmluZGV4VGltZXN0YW1wKSk7CisKKyAgICAgICAgcmV0dXJuQ29kZWMgPSBTc2JTaXBNZmNEZWNFeGUocFZwOERlYy0+aE1GQ1ZwOEhhbmRsZS5oTUZDSGFuZGxlLCBvbmVGcmFtZVNpemUpOworICAgIH0gZWxzZSB7CisgICAgICAgIGlmIChwU0VDQ29tcG9uZW50LT5jaGVja1RpbWVTdGFtcC5uZWVkQ2hlY2tTdGFydFRpbWVTdGFtcCA9PSBPTVhfVFJVRSkKKyAgICAgICAgICAgIHBTRUNDb21wb25lbnQtPmNoZWNrVGltZVN0YW1wLm5lZWRTZXRTdGFydFRpbWVTdGFtcCA9IE9NWF9UUlVFOworCisgICAgICAgIHBPdXRwdXREYXRhLT50aW1lU3RhbXAgPSBwSW5wdXREYXRhLT50aW1lU3RhbXA7CisgICAgICAgIHBPdXRwdXREYXRhLT5uRmxhZ3MgPSBwSW5wdXREYXRhLT5uRmxhZ3M7CisgICAgICAgIHJldHVybkNvZGVjID0gTUZDX1JFVF9PSzsKKyAgICAgICAgZ290byBFWElUOworICAgIH0KKworICAgIGlmIChyZXR1cm5Db2RlYyA9PSBNRkNfUkVUX09LKSB7CisgICAgICAgIFNTQlNJUF9NRkNfREVDX09VVEJVRl9TVEFUVVMgc3RhdHVzOworICAgICAgICBPTVhfUzMyIGluZGV4VGltZXN0YW1wID0gMDsKKworICAgICAgICBzdGF0dXMgPSBTc2JTaXBNZmNEZWNHZXRPdXRCdWYocFZwOERlYy0+aE1GQ1ZwOEhhbmRsZS5oTUZDSGFuZGxlLCAmb3V0cHV0SW5mbyk7CisgICAgICAgIGJ1ZldpZHRoID0gICAgKG91dHB1dEluZm8uaW1nX3dpZHRoICsgMTUpICYgKH4xNSk7CisgICAgICAgIGJ1ZkhlaWdodCA9ICAob3V0cHV0SW5mby5pbWdfaGVpZ2h0ICsgMTUpICYgKH4xNSk7CisgICAgICAgIEZyYW1lQnVmZmVyWVNpemUgPSBBTElHTl9UT184S0IoQUxJR05fVE9fMTI4QihvdXRwdXRJbmZvLmltZ193aWR0aCkgKiBBTElHTl9UT18zMkIob3V0cHV0SW5mby5pbWdfaGVpZ2h0KSk7CisgICAgICAgIEZyYW1lQnVmZmVyVVZTaXplID0gQUxJR05fVE9fOEtCKEFMSUdOX1RPXzEyOEIob3V0cHV0SW5mby5pbWdfd2lkdGgpICogQUxJR05fVE9fMzJCKG91dHB1dEluZm8uaW1nX2hlaWdodC8yKSk7CisKKyAgICAgICAgaWYgKHN0YXR1cyAhPSBNRkNfR0VUT1VUQlVGX0RJU1BMQVlfT05MWSkgeworICAgICAgICAgICAgcFZwOERlYy0+aE1GQ1ZwOEhhbmRsZS5pbmRleFRpbWVzdGFtcCsrOworICAgICAgICAgICAgcFZwOERlYy0+aE1GQ1ZwOEhhbmRsZS5pbmRleFRpbWVzdGFtcCAlPSBNQVhfVElNRVNUQU1QOworICAgICAgICB9CisKKyAgICAgICAgaWYgKChTc2JTaXBNZmNEZWNHZXRDb25maWcocFZwOERlYy0+aE1GQ1ZwOEhhbmRsZS5oTUZDSGFuZGxlLCBNRkNfREVDX0dFVENPTkZfRlJBTUVfVEFHLCAmaW5kZXhUaW1lc3RhbXApICE9IE1GQ19SRVRfT0spIHx8CisgICAgICAgICAgICAoKChpbmRleFRpbWVzdGFtcCA8IDApIHx8IChpbmRleFRpbWVzdGFtcCA+PSBNQVhfVElNRVNUQU1QKSkpKSB7CisgICAgICAgICAgICBwT3V0cHV0RGF0YS0+dGltZVN0YW1wID0gcElucHV0RGF0YS0+dGltZVN0YW1wOworICAgICAgICAgICAgcE91dHB1dERhdGEtPm5GbGFncyA9IHBJbnB1dERhdGEtPm5GbGFnczsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIC8qIEZvciB0aW1lc3RhbXAgY29ycmVjdGlvbi4gaWYgbWZjIHN1cHBvcnQgZnJhbWV0eXBlIGRldGVjdCAqLworICAgICAgICAgICAgU0VDX09TQUxfTG9nKFNFQ19MT0dfVFJBQ0UsICJkaXNwX3BpY19mcmFtZV90eXBlOiAlZCIsIG91dHB1dEluZm8uZGlzcF9waWNfZnJhbWVfdHlwZSk7CisjaWZkZWYgTkVFRF9USU1FU1RBTVBfUkVPUkRFUgorICAgICAgICAgICAgaWYgKG91dHB1dEluZm8uZGlzcF9waWNfZnJhbWVfdHlwZSA9PSBNRkNfRlJBTUVfVFlQRV9JX0ZSQU1FKSB7CisgICAgICAgICAgICAgICAgcE91dHB1dERhdGEtPnRpbWVTdGFtcCA9IHBTRUNDb21wb25lbnQtPnRpbWVTdGFtcFtpbmRleFRpbWVzdGFtcF07CisgICAgICAgICAgICAgICAgcE91dHB1dERhdGEtPm5GbGFncyA9IHBTRUNDb21wb25lbnQtPm5GbGFnc1tpbmRleFRpbWVzdGFtcF07CisgICAgICAgICAgICAgICAgcFZwOERlYy0+aE1GQ1ZwOEhhbmRsZS5vdXRwdXRJbmRleFRpbWVzdGFtcCA9IGluZGV4VGltZXN0YW1wOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBwT3V0cHV0RGF0YS0+dGltZVN0YW1wID0gcFNFQ0NvbXBvbmVudC0+dGltZVN0YW1wW3BWcDhEZWMtPmhNRkNWcDhIYW5kbGUub3V0cHV0SW5kZXhUaW1lc3RhbXBdOworICAgICAgICAgICAgICAgIHBPdXRwdXREYXRhLT5uRmxhZ3MgPSBwU0VDQ29tcG9uZW50LT5uRmxhZ3NbcFZwOERlYy0+aE1GQ1ZwOEhhbmRsZS5vdXRwdXRJbmRleFRpbWVzdGFtcF07CisgICAgICAgICAgICB9CisjZWxzZQorICAgICAgICAgICAgcE91dHB1dERhdGEtPnRpbWVTdGFtcCA9IHBTRUNDb21wb25lbnQtPnRpbWVTdGFtcFtpbmRleFRpbWVzdGFtcF07CisgICAgICAgICAgICBwT3V0cHV0RGF0YS0+bkZsYWdzID0gcFNFQ0NvbXBvbmVudC0+bkZsYWdzW2luZGV4VGltZXN0YW1wXTsKKyNlbmRpZgorICAgICAgICAgICAgU0VDX09TQUxfTG9nKFNFQ19MT0dfVFJBQ0UsICJ0aW1lc3RhbXAgJWxsZCB1cyAoJS4yZiBzZWNzKSIsIHBPdXRwdXREYXRhLT50aW1lU3RhbXAsIHBPdXRwdXREYXRhLT50aW1lU3RhbXAgLyAxRTYpOworICAgICAgICB9CisKKyAgICAgICAgaWYgKChzdGF0dXMgPT0gTUZDX0dFVE9VVEJVRl9ESVNQTEFZX0RFQ09ESU5HKSB8fAorICAgICAgICAgICAgKHN0YXR1cyA9PSBNRkNfR0VUT1VUQlVGX0RJU1BMQVlfT05MWSkpIHsKKyAgICAgICAgICAgIC8qKiBGaWxsIE91dHB1dCBCdWZmZXIgKiovCisgICAgICAgICAgICB2b2lkICpwT3V0cHV0QnVmID0gKHZvaWQgKilwT3V0cHV0RGF0YS0+ZGF0YUJ1ZmZlcjsKKyAgICAgICAgICAgIHZvaWQgKnBTcmNCdWZbM10gPSB7TlVMTCwgfTsKKyAgICAgICAgICAgIHZvaWQgKnBZVVZCdWZbM10gPSB7TlVMTCwgfTsKKyAgICAgICAgICAgIHVuc2lnbmVkIGludCBjc2Nfc3JjX2NvbG9yX2Zvcm1hdCwgY3NjX2RzdF9jb2xvcl9mb3JtYXQ7CisgICAgICAgICAgICBDU0NfTUVUSE9EIGNzY19tZXRob2QgPSBDU0NfTUVUSE9EX1NXOworICAgICAgICAgICAgdW5zaWduZWQgaW50IGNhY2hlYWJsZSA9IDE7CisKKyAgICAgICAgICAgIGludCBmcmFtZVNpemUgPSBidWZXaWR0aCAqIGJ1ZkhlaWdodDsKKyAgICAgICAgICAgIGludCB3aWR0aCA9IG91dHB1dEluZm8uaW1nX3dpZHRoOworICAgICAgICAgICAgaW50IGhlaWdodCA9IG91dHB1dEluZm8uaW1nX2hlaWdodDsKKyAgICAgICAgICAgIGludCBpbWFnZVNpemUgPSBvdXRwdXRJbmZvLmltZ193aWR0aCAqIG91dHB1dEluZm8uaW1nX2hlaWdodDsKKworICAgICAgICAgICAgcFNyY0J1ZlswXSA9IG91dHB1dEluZm8uWVZpckFkZHI7CisgICAgICAgICAgICBwU3JjQnVmWzFdID0gb3V0cHV0SW5mby5DVmlyQWRkcjsKKworICAgICAgICAgICAgcFlVVkJ1ZlswXSAgPSAodW5zaWduZWQgY2hhciAqKXBPdXRwdXRCdWY7CisgICAgICAgICAgICBwWVVWQnVmWzFdICA9ICh1bnNpZ25lZCBjaGFyICopcE91dHB1dEJ1ZiArIGltYWdlU2l6ZTsKKyAgICAgICAgICAgIHBZVVZCdWZbMl0gID0gKHVuc2lnbmVkIGNoYXIgKilwT3V0cHV0QnVmICsgaW1hZ2VTaXplICsgaW1hZ2VTaXplIC8gNDsKKyAgICAgICAgICAgIHBPdXRwdXREYXRhLT5kYXRhTGVuID0gKGltYWdlU2l6ZSAqIDMpIC8gMjsKKworI2lmZGVmIFVTRV9BTkIKKyAgICAgICAgICAgIGlmIChwU0VDT3V0cHV0UG9ydC0+YklzQU5CRW5hYmxlZCA9PSBPTVhfVFJVRSkgeworICAgICAgICAgICAgICAgIHVuc2lnbmVkIGludCBzdHJpZGU7CisgICAgICAgICAgICAgICAgU0VDX09TQUxfTG9ja0FOQihwT3V0cHV0RGF0YS0+ZGF0YUJ1ZmZlciwgd2lkdGgsIGhlaWdodCwgcFNFQ0NvbXBvbmVudC0+cFNFQ1BvcnRbT1VUUFVUX1BPUlRfSU5ERVhdLnBvcnREZWZpbml0aW9uLmZvcm1hdC52aWRlby5lQ29sb3JGb3JtYXQsICZzdHJpZGUsIHBZVVZCdWYpOworICAgICAgICAgICAgICAgIHdpZHRoID0gc3RyaWRlOworICAgICAgICAgICAgICAgIHBPdXRwdXREYXRhLT5kYXRhTGVuID0gc2l6ZW9mKHZvaWQgKik7CisgICAgICAgICAgICB9CisjZW5kaWYKKyAgICAgICAgICAgIGlmICgocFZpZGVvRGVjLT5iVGh1bWJuYWlsTW9kZSA9PSBPTVhfRkFMU0UpICYmCisgICAgICAgICAgICAgICAgKHBTRUNPdXRwdXRQb3J0LT5wb3J0RGVmaW5pdGlvbi5mb3JtYXQudmlkZW8uZUNvbG9yRm9ybWF0ID09IE9NWF9TRUNfQ09MT1JfRm9ybWF0TlYxMlRQaHlzaWNhbEFkZHJlc3MpKSB7CisgICAgICAgICAgICAgICAgLyogaWYgdXNlIFBvc3QgY29weSBhZGRyZXNzIHN0cnVjdHVyZSAqLworICAgICAgICAgICAgICAgIFNFQ19PU0FMX01lbWNweShwWVVWQnVmWzBdLCAmKG91dHB1dEluZm8uWVBoeUFkZHIpLCBzaXplb2Yob3V0cHV0SW5mby5ZUGh5QWRkcikpOworICAgICAgICAgICAgICAgIFNFQ19PU0FMX01lbWNweSgodW5zaWduZWQgY2hhciAqKXBZVVZCdWZbMF0gKyAoc2l6ZW9mKHZvaWQgKikgKiAxKSwgJihvdXRwdXRJbmZvLkNQaHlBZGRyKSwgc2l6ZW9mKG91dHB1dEluZm8uQ1BoeUFkZHIpKTsKKyAgICAgICAgICAgICAgICBTRUNfT1NBTF9NZW1jcHkoKHVuc2lnbmVkIGNoYXIgKilwWVVWQnVmWzBdICsgKHNpemVvZih2b2lkICopICogMiksICYob3V0cHV0SW5mby5ZVmlyQWRkciksIHNpemVvZihvdXRwdXRJbmZvLllWaXJBZGRyKSk7CisgICAgICAgICAgICAgICAgU0VDX09TQUxfTWVtY3B5KCh1bnNpZ25lZCBjaGFyICopcFlVVkJ1ZlswXSArIChzaXplb2Yodm9pZCAqKSAqIDMpLCAmKG91dHB1dEluZm8uQ1ZpckFkZHIpLCBzaXplb2Yob3V0cHV0SW5mby5DVmlyQWRkcikpOworICAgICAgICAgICAgICAgIHBPdXRwdXREYXRhLT5kYXRhTGVuID0gKHdpZHRoICogaGVpZ2h0ICogMykgLyAyOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBTRUNfT1NBTF9Mb2coU0VDX0xPR19UUkFDRSwgIllVVjQyMCBTUC9QIE91dHB1dCBtb2RlIik7CisjaWZkZWYgQ09ORklHX01GQ19GUFMKKyAgICAgICAgICAgICAgICBTRUNfT1NBTF9QZXJmU3RhcnQoUEVSRl9JRF9DU0MpOworI2VuZGlmCisgICAgICAgICAgICAgICAgc3dpdGNoIChwU0VDQ29tcG9uZW50LT5wU0VDUG9ydFtPVVRQVVRfUE9SVF9JTkRFWF0ucG9ydERlZmluaXRpb24uZm9ybWF0LnZpZGVvLmVDb2xvckZvcm1hdCkgeworICAgICAgICAgICAgICAgIGNhc2UgT01YX1NFQ19DT0xPUl9Gb3JtYXROVjEyVGlsZWQ6CisgICAgICAgICAgICAgICAgICAgIFNFQ19PU0FMX01lbWNweShwT3V0cHV0QnVmLCBvdXRwdXRJbmZvLllWaXJBZGRyLCBGcmFtZUJ1ZmZlcllTaXplKTsKKyAgICAgICAgICAgICAgICAgICAgU0VDX09TQUxfTWVtY3B5KCh1bnNpZ25lZCBjaGFyICopcE91dHB1dEJ1ZiArIEZyYW1lQnVmZmVyWVNpemUsIG91dHB1dEluZm8uQ1ZpckFkZHIsIEZyYW1lQnVmZmVyVVZTaXplKTsKKyAgICAgICAgICAgICAgICAgICAgcE91dHB1dERhdGEtPmRhdGFMZW4gPSBGcmFtZUJ1ZmZlcllTaXplICsgRnJhbWVCdWZmZXJVVlNpemU7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIGNhc2UgT01YX0NPTE9SX0Zvcm1hdFlVVjQyMFNlbWlQbGFuYXI6CisgICAgICAgICAgICAgICAgY2FzZSBPTVhfU0VDX0NPTE9SX0Zvcm1hdEFOQllVVjQyMFNlbWlQbGFuYXI6CisgICAgICAgICAgICAgICAgY3NjX3NyY19jb2xvcl9mb3JtYXQgPSBvbXhfMl9oYWxfcGl4ZWxfZm9ybWF0KCh1bnNpZ25lZCBpbnQpT01YX1NFQ19DT0xPUl9Gb3JtYXROVjEyVGlsZWQpOworICAgICAgICAgICAgICAgIGNzY19kc3RfY29sb3JfZm9ybWF0ID0gb214XzJfaGFsX3BpeGVsX2Zvcm1hdCgodW5zaWduZWQgaW50KU9NWF9DT0xPUl9Gb3JtYXRZVVY0MjBTZW1pUGxhbmFyKTsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgY2FzZSBPTVhfQ09MT1JfRm9ybWF0WVVWNDIwUGxhbmFyOgorICAgICAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgY3NjX3NyY19jb2xvcl9mb3JtYXQgPSBvbXhfMl9oYWxfcGl4ZWxfZm9ybWF0KCh1bnNpZ25lZCBpbnQpT01YX1NFQ19DT0xPUl9Gb3JtYXROVjEyVGlsZWQpOworICAgICAgICAgICAgICAgIGNzY19kc3RfY29sb3JfZm9ybWF0ID0gb214XzJfaGFsX3BpeGVsX2Zvcm1hdCgodW5zaWduZWQgaW50KU9NWF9DT0xPUl9Gb3JtYXRZVVY0MjBQbGFuYXIpOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBjc2NfZ2V0X21ldGhvZChwVmlkZW9EZWMtPmNzY19oYW5kbGUsICZjc2NfbWV0aG9kKTsKKyNpZmRlZiBVU0VfQ1NDX0ZJTUMKKyAgICAgICAgICAgICAgICBpZiAoKHBTRUNPdXRwdXRQb3J0LT5iSXNBTkJFbmFibGVkID09IE9NWF9UUlVFKSAmJiAoY3NjX21ldGhvZCA9PSBDU0NfTUVUSE9EX0hXKSkgeworICAgICAgICAgICAgICAgICAgICBTRUNfT1NBTF9HZXRQaHlzQU5CKHBPdXRwdXREYXRhLT5kYXRhQnVmZmVyLCBwWVVWQnVmKTsKKyAgICAgICAgICAgICAgICAgICAgcFNyY0J1ZlswXSA9IG91dHB1dEluZm8uWVBoeUFkZHI7CisgICAgICAgICAgICAgICAgICAgIHBTcmNCdWZbMV0gPSBvdXRwdXRJbmZvLkNQaHlBZGRyOworICAgICAgICAgICAgICAgIH0KKyNlbmRpZgorICAgICAgICAgICAgICAgIGlmIChwVmlkZW9EZWMtPmNzY19zZXRfZm9ybWF0ID09IE9NWF9GQUxTRSkgeworICAgICAgICAgICAgICAgICAgICBjc2Nfc2V0X3NyY19mb3JtYXQoCisgICAgICAgICAgICAgICAgICAgICAgICBwVmlkZW9EZWMtPmNzY19oYW5kbGUsICAvKiBoYW5kbGUgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgIHdpZHRoLCAgICAgICAgICAgICAgICAgIC8qIHdpZHRoICovCisgICAgICAgICAgICAgICAgICAgICAgICBoZWlnaHQsICAgICAgICAgICAgICAgICAvKiBoZWlnaHQgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgIDAsICAgICAgICAgICAgICAgICAgICAgIC8qIGNyb3BfbGVmdCAqLworICAgICAgICAgICAgICAgICAgICAgICAgMCwgICAgICAgICAgICAgICAgICAgICAgLyogY3JvcF9yaWdodCAqLworICAgICAgICAgICAgICAgICAgICAgICAgd2lkdGgsICAgICAgICAgICAgICAgICAgLyogY3JvcF93aWR0aCAqLworICAgICAgICAgICAgICAgICAgICAgICAgaGVpZ2h0LCAgICAgICAgICAgICAgICAgLyogY3JvcF9oZWlnaHQgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgIGNzY19zcmNfY29sb3JfZm9ybWF0LCAgIC8qIGNvbG9yX2Zvcm1hdCAqLworICAgICAgICAgICAgICAgICAgICAgICAgY2FjaGVhYmxlKTsgICAgICAgICAgICAgLyogY2FjaGVhYmxlICovCisgICAgICAgICAgICAgICAgICAgIGNzY19zZXRfZHN0X2Zvcm1hdCgKKyAgICAgICAgICAgICAgICAgICAgICAgIHBWaWRlb0RlYy0+Y3NjX2hhbmRsZSwgIC8qIGhhbmRsZSAqLworICAgICAgICAgICAgICAgICAgICAgICAgd2lkdGgsICAgICAgICAgICAgICAgICAgLyogd2lkdGggKi8KKyAgICAgICAgICAgICAgICAgICAgICAgIGhlaWdodCwgICAgICAgICAgICAgICAgIC8qIGhlaWdodCAqLworICAgICAgICAgICAgICAgICAgICAgICAgMCwgICAgICAgICAgICAgICAgICAgICAgLyogY3JvcF9sZWZ0ICovCisgICAgICAgICAgICAgICAgICAgICAgICAwLCAgICAgICAgICAgICAgICAgICAgICAvKiBjcm9wX3JpZ2h0ICovCisgICAgICAgICAgICAgICAgICAgICAgICB3aWR0aCwgICAgICAgICAgICAgICAgICAvKiBjcm9wX3dpZHRoICovCisgICAgICAgICAgICAgICAgICAgICAgICBoZWlnaHQsICAgICAgICAgICAgICAgICAvKiBjcm9wX2hlaWdodCAqLworICAgICAgICAgICAgICAgICAgICAgICAgY3NjX2RzdF9jb2xvcl9mb3JtYXQsICAgLyogY29sb3JfZm9ybWF0ICovCisgICAgICAgICAgICAgICAgICAgICAgICBjYWNoZWFibGUpOyAgICAgICAgICAgICAvKiBjYWNoZWFibGUgKi8KKyAgICAgICAgICAgICAgICAgICAgcFZpZGVvRGVjLT5jc2Nfc2V0X2Zvcm1hdCA9IE9NWF9UUlVFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBjc2Nfc2V0X3NyY19idWZmZXIoCisgICAgICAgICAgICAgICAgICAgIHBWaWRlb0RlYy0+Y3NjX2hhbmRsZSwgICAgLyogaGFuZGxlICovCisgICAgICAgICAgICAgICAgICAgIHBTcmNCdWZbMF0sICAgICAgICAgICAgICAgLyogeSBhZGRyICovCisgICAgICAgICAgICAgICAgICAgIHBTcmNCdWZbMV0sICAgICAgICAgICAgICAgLyogdSBhZGRyIG9yIHV2IGFkZHIgKi8KKyAgICAgICAgICAgICAgICAgICAgcFNyY0J1ZlsyXSwgICAgICAgICAgICAgICAvKiB2IGFkZHIgb3Igbm9uZSAqLworICAgICAgICAgICAgICAgICAgICAwKTsgICAgICAgICAgICAgICAgICAgICAgIC8qIGlvbiBmZCAqLworICAgICAgICAgICAgICAgIGNzY19zZXRfZHN0X2J1ZmZlcigKKyAgICAgICAgICAgICAgICAgICAgcFZpZGVvRGVjLT5jc2NfaGFuZGxlLAorICAgICAgICAgICAgICAgICAgICBwWVVWQnVmWzBdLCAgICAgICAgICAgICAvKiB5IGFkZHIgKi8KKyAgICAgICAgICAgICAgICAgICAgcFlVVkJ1ZlsxXSwgICAgICAgICAgICAgLyogdSBhZGRyIG9yIHV2IGFkZHIgKi8KKyAgICAgICAgICAgICAgICAgICAgcFlVVkJ1ZlsyXSwgICAgICAgICAgICAgLyogdiBhZGRyIG9yIG5vbmUgKi8KKyAgICAgICAgICAgICAgICAgICAgMCk7ICAgICAgICAgICAgICAgICAgICAgLyogaW9uIGZkICovCisgICAgICAgICAgICAgICAgY3NjX2NvbnZlcnQocFZpZGVvRGVjLT5jc2NfaGFuZGxlKTsKKworI2lmZGVmIENPTkZJR19NRkNfRlBTCisgICAgICAgICAgICAgICAgU0VDX09TQUxfUGVyZlN0b3AoUEVSRl9JRF9DU0MpOworI2VuZGlmCisgICAgICAgICAgICB9CisKKyNpZmRlZiBVU0VfQU5CCisgICAgICAgICAgICBpZiAocFNFQ091dHB1dFBvcnQtPmJJc0FOQkVuYWJsZWQgPT0gT01YX1RSVUUpIHsKKyAgICAgICAgICAgICAgICBTRUNfT1NBTF9VbmxvY2tBTkIocE91dHB1dERhdGEtPmRhdGFCdWZmZXIpOworICAgICAgICAgICAgfQorI2VuZGlmCisgICAgICAgICAgICBwVnA4RGVjLT5oTUZDVnA4SGFuZGxlLm91dHB1dEluZGV4VGltZXN0YW1wKys7CisgICAgICAgICAgICBwVnA4RGVjLT5oTUZDVnA4SGFuZGxlLm91dHB1dEluZGV4VGltZXN0YW1wICU9IE1BWF9USU1FU1RBTVA7CisgICAgICAgIH0KKyAgICAgICAgaWYgKHBPdXRwdXREYXRhLT5uRmxhZ3MgJiBPTVhfQlVGRkVSRkxBR19FT1MpCisgICAgICAgICAgICBwT3V0cHV0RGF0YS0+ZGF0YUxlbiA9IDA7CisKKyAgICAgICAgaWYgKChzdGF0dXMgPT0gTUZDX0dFVE9VVEJVRl9ESVNQTEFZX09OTFkpIHx8CisgICAgICAgICAgICAocFNFQ0NvbXBvbmVudC0+Z2V0QWxsRGVsYXlCdWZmZXIgPT0gT01YX1RSVUUpKQorICAgICAgICAgICAgcmV0ID0gT01YX0Vycm9ySW5wdXREYXRhRGVjb2RlWWV0OworCisgICAgICAgIGlmIChzdGF0dXMgPT0gTUZDX0dFVE9VVEJVRl9ERUNPRElOR19PTkxZKSB7CisgICAgICAgICAgICBpZiAoKChwSW5wdXREYXRhLT5uRmxhZ3MgJiBPTVhfQlVGRkVSRkxBR19FT1MpICE9IE9NWF9CVUZGRVJGTEFHX0VPUykgJiYKKyAgICAgICAgICAgICAgICAoKHBTRUNDb21wb25lbnQtPmJTYXZlRmxhZ0VPUyA9PSBPTVhfVFJVRSkgfHwgKHBTRUNDb21wb25lbnQtPmdldEFsbERlbGF5QnVmZmVyID09IE9NWF9UUlVFKSkpIHsKKyAgICAgICAgICAgICAgICBwSW5wdXREYXRhLT5uRmxhZ3MgfD0gT01YX0JVRkZFUkZMQUdfRU9TOworICAgICAgICAgICAgICAgIHBTRUNDb21wb25lbnQtPmdldEFsbERlbGF5QnVmZmVyID0gT01YX1RSVUU7CisgICAgICAgICAgICAgICAgcmV0ID0gT01YX0Vycm9ySW5wdXREYXRhRGVjb2RlWWV0OworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICByZXQgPSBPTVhfRXJyb3JOb25lOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZ290byBFWElUOworICAgICAgICB9CisKKyNpZmRlZiBGVUxMX0ZSQU1FX1NFQVJDSAorICAgICAgICBpZiAoKChwSW5wdXREYXRhLT5uRmxhZ3MgJiBPTVhfQlVGRkVSRkxBR19FT1MpICE9IE9NWF9CVUZGRVJGTEFHX0VPUykgJiYKKyAgICAgICAgICAgIChwU0VDQ29tcG9uZW50LT5iU2F2ZUZsYWdFT1MgPT0gT01YX1RSVUUpKSB7CisgICAgICAgICAgICBwSW5wdXREYXRhLT5uRmxhZ3MgfD0gT01YX0JVRkZFUkZMQUdfRU9TOworICAgICAgICAgICAgcFNFQ0NvbXBvbmVudC0+Z2V0QWxsRGVsYXlCdWZmZXIgPSBPTVhfVFJVRTsKKyAgICAgICAgICAgIHJldCA9IE9NWF9FcnJvcklucHV0RGF0YURlY29kZVlldDsKKyAgICAgICAgfSBlbHNlCisjZW5kaWYKKyAgICAgICAgaWYgKChwSW5wdXREYXRhLT5uRmxhZ3MgJiBPTVhfQlVGRkVSRkxBR19FT1MpID09IE9NWF9CVUZGRVJGTEFHX0VPUykgeworICAgICAgICAgICAgcElucHV0RGF0YS0+bkZsYWdzID0gKHBPdXRwdXREYXRhLT5uRmxhZ3MgJiAofk9NWF9CVUZGRVJGTEFHX0VPUykpOworICAgICAgICAgICAgcFNFQ0NvbXBvbmVudC0+Z2V0QWxsRGVsYXlCdWZmZXIgPSBPTVhfVFJVRTsKKyAgICAgICAgICAgIHJldCA9IE9NWF9FcnJvcklucHV0RGF0YURlY29kZVlldDsKKyAgICAgICAgfSBlbHNlIGlmICgocE91dHB1dERhdGEtPm5GbGFncyAmIE9NWF9CVUZGRVJGTEFHX0VPUykgPT0gT01YX0JVRkZFUkZMQUdfRU9TKSB7CisgICAgICAgICAgICBwU0VDQ29tcG9uZW50LT5nZXRBbGxEZWxheUJ1ZmZlciA9IE9NWF9GQUxTRTsKKyAgICAgICAgICAgIHJldCA9IE9NWF9FcnJvck5vbmU7CisgICAgICAgIH0KKyAgICB9IGVsc2UgeworICAgICAgICBwT3V0cHV0RGF0YS0+dGltZVN0YW1wID0gcElucHV0RGF0YS0+dGltZVN0YW1wOworICAgICAgICBwT3V0cHV0RGF0YS0+bkZsYWdzID0gcElucHV0RGF0YS0+bkZsYWdzOworCisgICAgICAgIGlmICgocFNFQ0NvbXBvbmVudC0+YlNhdmVGbGFnRU9TID09IE9NWF9UUlVFKSB8fAorICAgICAgICAgICAgKHBTRUNDb21wb25lbnQtPmdldEFsbERlbGF5QnVmZmVyID09IE9NWF9UUlVFKSB8fAorICAgICAgICAgICAgKHBJbnB1dERhdGEtPm5GbGFncyAmIE9NWF9CVUZGRVJGTEFHX0VPUykpIHsKKyAgICAgICAgICAgIHBPdXRwdXREYXRhLT5uRmxhZ3MgfD0gT01YX0JVRkZFUkZMQUdfRU9TOworICAgICAgICAgICAgcFNFQ0NvbXBvbmVudC0+Z2V0QWxsRGVsYXlCdWZmZXIgPSBPTVhfRkFMU0U7CisgICAgICAgIH0KKyAgICAgICAgcE91dHB1dERhdGEtPmRhdGFMZW4gPSAwOworCisgICAgICAgIC8qIHJldCA9IE9NWF9FcnJvclVuZGVmaW5lZDsgKi8KKyAgICAgICAgcmV0ID0gT01YX0Vycm9yTm9uZTsKKyAgICAgICAgZ290byBFWElUOworICAgIH0KKworRVhJVDoKKyAgICBGdW5jdGlvbk91dCgpOworCisgICAgcmV0dXJuIHJldDsKK30KKworLyogTUZDIERlY29kZSAqLworT01YX0VSUk9SVFlQRSBTRUNfTUZDX1ZQOERlY19idWZmZXJQcm9jZXNzKE9NWF9DT01QT05FTlRUWVBFICpwT01YQ29tcG9uZW50LCBTRUNfT01YX0RBVEEgKnBJbnB1dERhdGEsIFNFQ19PTVhfREFUQSAqcE91dHB1dERhdGEpCit7CisgICAgT01YX0VSUk9SVFlQRSByZXQgPSBPTVhfRXJyb3JOb25lOworICAgIFNFQ19PTVhfQkFTRUNPTVBPTkVOVCAgICpwU0VDQ29tcG9uZW50ID0gKFNFQ19PTVhfQkFTRUNPTVBPTkVOVCAqKXBPTVhDb21wb25lbnQtPnBDb21wb25lbnRQcml2YXRlOworICAgIFNFQ19WUDhERUNfSEFORExFICAgICAgKnBWcDhEZWMgPSAoU0VDX1ZQOERFQ19IQU5ETEUgKikoKFNFQ19PTVhfVklERU9ERUNfQ09NUE9ORU5UICopcFNFQ0NvbXBvbmVudC0+aENvbXBvbmVudEhhbmRsZSktPmhDb2RlY0hhbmRsZTsKKyAgICBTRUNfT01YX0JBU0VQT1JUICAgICAgICAqcFNFQ0lucHV0UG9ydCA9ICZwU0VDQ29tcG9uZW50LT5wU0VDUG9ydFtJTlBVVF9QT1JUX0lOREVYXTsKKyAgICBTRUNfT01YX0JBU0VQT1JUICAgICAgICAqcFNFQ091dHB1dFBvcnQgPSAmcFNFQ0NvbXBvbmVudC0+cFNFQ1BvcnRbT1VUUFVUX1BPUlRfSU5ERVhdOworICAgIE9NWF9CT09MICAgICAgICAgICAgICAgICBlbmRPZkZyYW1lID0gT01YX0ZBTFNFOworCisgICAgRnVuY3Rpb25JbigpOworCisgICAgaWYgKCghQ0hFQ0tfUE9SVF9FTkFCTEVEKHBTRUNJbnB1dFBvcnQpKSB8fCAoIUNIRUNLX1BPUlRfRU5BQkxFRChwU0VDT3V0cHV0UG9ydCkpIHx8CisgICAgICAgICghQ0hFQ0tfUE9SVF9QT1BVTEFURUQocFNFQ0lucHV0UG9ydCkpIHx8ICghQ0hFQ0tfUE9SVF9QT1BVTEFURUQocFNFQ091dHB1dFBvcnQpKSkgeworICAgICAgICByZXQgPSBPTVhfRXJyb3JOb25lOworICAgICAgICBnb3RvIEVYSVQ7CisgICAgfQorICAgIGlmIChPTVhfRkFMU0UgPT0gU0VDX0NoZWNrX0J1ZmZlclByb2Nlc3NfU3RhdGUocFNFQ0NvbXBvbmVudCkpIHsKKyAgICAgICAgcmV0ID0gT01YX0Vycm9yTm9uZTsKKyAgICAgICAgZ290byBFWElUOworICAgIH0KKworI2lmZGVmIE5PTkJMT0NLX01PREVfUFJPQ0VTUworICAgIHJldCA9IFNFQ19NRkNfVlA4X0RlY29kZV9Ob25ibG9jayhwT01YQ29tcG9uZW50LCBwSW5wdXREYXRhLCBwT3V0cHV0RGF0YSk7CisjZWxzZQorICAgIHJldCA9IFNFQ19NRkNfVlA4X0RlY29kZV9CbG9jayhwT01YQ29tcG9uZW50LCBwSW5wdXREYXRhLCBwT3V0cHV0RGF0YSk7CisjZW5kaWYKKyAgICBpZiAocmV0ICE9IE9NWF9FcnJvck5vbmUpIHsKKyAgICAgICAgaWYgKHJldCA9PSBPTVhfRXJyb3JJbnB1dERhdGFEZWNvZGVZZXQpIHsKKyAgICAgICAgICAgIHBPdXRwdXREYXRhLT51c2VkRGF0YUxlbiA9IDA7CisgICAgICAgICAgICBwT3V0cHV0RGF0YS0+cmVtYWluRGF0YUxlbiA9IHBPdXRwdXREYXRhLT5kYXRhTGVuOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgcFNFQ0NvbXBvbmVudC0+cENhbGxiYWNrcy0+RXZlbnRIYW5kbGVyKChPTVhfSEFORExFVFlQRSlwT01YQ29tcG9uZW50LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBTRUNDb21wb25lbnQtPmNhbGxiYWNrRGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPTVhfRXZlbnRFcnJvciwgcmV0LCAwLCBOVUxMKTsKKyAgICAgICAgfQorICAgIH0gZWxzZSB7CisgICAgICAgIHBJbnB1dERhdGEtPnByZXZpb3VzRGF0YUxlbiA9IHBJbnB1dERhdGEtPmRhdGFMZW47CisgICAgICAgIHBJbnB1dERhdGEtPnVzZWREYXRhTGVuICs9IHBJbnB1dERhdGEtPmRhdGFMZW47CisgICAgICAgIHBJbnB1dERhdGEtPnJlbWFpbkRhdGFMZW4gPSBwSW5wdXREYXRhLT5kYXRhTGVuIC0gcElucHV0RGF0YS0+dXNlZERhdGFMZW47CisgICAgICAgIHBJbnB1dERhdGEtPmRhdGFMZW4gLT0gcElucHV0RGF0YS0+dXNlZERhdGFMZW47CisgICAgICAgIHBJbnB1dERhdGEtPnVzZWREYXRhTGVuID0gMDsKKworICAgICAgICBwT3V0cHV0RGF0YS0+dXNlZERhdGFMZW4gPSAwOworICAgICAgICBwT3V0cHV0RGF0YS0+cmVtYWluRGF0YUxlbiA9IHBPdXRwdXREYXRhLT5kYXRhTGVuOworICAgIH0KKworRVhJVDoKKyAgICBGdW5jdGlvbk91dCgpOworCisgICAgcmV0dXJuIHJldDsKK30KKworT1NDTF9FWFBPUlRfUkVGIE9NWF9FUlJPUlRZUEUgU0VDX09NWF9Db21wb25lbnRJbml0KE9NWF9IQU5ETEVUWVBFIGhDb21wb25lbnQsIE9NWF9TVFJJTkcgY29tcG9uZW50TmFtZSkKK3sKKyAgICBPTVhfRVJST1JUWVBFICAgICAgICAgICAgcmV0ID0gT01YX0Vycm9yTm9uZTsKKyAgICBPTVhfQ09NUE9ORU5UVFlQRSAgICAgICAqcE9NWENvbXBvbmVudCA9IE5VTEw7CisgICAgU0VDX09NWF9CQVNFQ09NUE9ORU5UICAgKnBTRUNDb21wb25lbnQgPSBOVUxMOworICAgIFNFQ19PTVhfQkFTRVBPUlQgICAgICAgICpwU0VDUG9ydCA9IE5VTEw7CisgICAgU0VDX09NWF9WSURFT0RFQ19DT01QT05FTlQgKnBWaWRlb0RlYyA9IE5VTEw7CisgICAgU0VDX1ZQOERFQ19IQU5ETEUgICAgICAqcFZwOERlYyA9IE5VTEw7CisgICAgLy9PTVhfQk9PTCAgICAgICAgICAgICAgICAgYkZsYXNoUGxheWVyTW9kZSA9IE9NWF9GQUxTRTsKKyAgICBpbnQgaSA9IDA7CisKKyAgICBGdW5jdGlvbkluKCk7CisKKyAgICBpZiAoKGhDb21wb25lbnQgPT0gTlVMTCkgfHwgKGNvbXBvbmVudE5hbWUgPT0gTlVMTCkpIHsKKyAgICAgICAgcmV0ID0gT01YX0Vycm9yQmFkUGFyYW1ldGVyOworICAgICAgICBTRUNfT1NBTF9Mb2coU0VDX0xPR19FUlJPUiwgIk9NWF9FcnJvckJhZFBhcmFtZXRlciwgTGluZTolZCIsIF9fTElORV9fKTsKKyAgICAgICAgZ290byBFWElUOworICAgIH0KKyAgICBpZiAoU0VDX09TQUxfU3RyY21wKFNFQ19PTVhfQ09NUE9ORU5UX1ZQOF9ERUMsIGNvbXBvbmVudE5hbWUpICE9IDApIHsKKyAgICAgICAgcmV0ID0gT01YX0Vycm9yQmFkUGFyYW1ldGVyOworICAgICAgICBTRUNfT1NBTF9Mb2coU0VDX0xPR19FUlJPUiwgIk9NWF9FcnJvckJhZFBhcmFtZXRlciwgY29tcG9uZW50TmFtZTolcywgTGluZTolZCIsIGNvbXBvbmVudE5hbWUsIF9fTElORV9fKTsKKyAgICAgICAgZ290byBFWElUOworICAgIH0KKworICAgIHBPTVhDb21wb25lbnQgPSAoT01YX0NPTVBPTkVOVFRZUEUgKiloQ29tcG9uZW50OworICAgIHJldCA9IFNFQ19PTVhfVmlkZW9EZWNvZGVDb21wb25lbnRJbml0KHBPTVhDb21wb25lbnQpOworICAgIGlmIChyZXQgIT0gT01YX0Vycm9yTm9uZSkgeworICAgICAgICBTRUNfT1NBTF9Mb2coU0VDX0xPR19FUlJPUiwgIk9NWF9FcnJvciwgTGluZTolZCIsIF9fTElORV9fKTsKKyAgICAgICAgZ290byBFWElUOworICAgIH0KKyAgICBwU0VDQ29tcG9uZW50ID0gKFNFQ19PTVhfQkFTRUNPTVBPTkVOVCAqKXBPTVhDb21wb25lbnQtPnBDb21wb25lbnRQcml2YXRlOworICAgIHBTRUNDb21wb25lbnQtPmNvZGVjVHlwZSA9IEhXX1ZJREVPX0RFQ19DT0RFQzsKKworICAgIHBTRUNDb21wb25lbnQtPmNvbXBvbmVudE5hbWUgPSAoT01YX1NUUklORylTRUNfT1NBTF9NYWxsb2MoTUFYX09NWF9DT01QT05FTlRfTkFNRV9TSVpFKTsKKyAgICBpZiAocFNFQ0NvbXBvbmVudC0+Y29tcG9uZW50TmFtZSA9PSBOVUxMKSB7CisgICAgICAgIFNFQ19PTVhfVmlkZW9EZWNvZGVDb21wb25lbnREZWluaXQocE9NWENvbXBvbmVudCk7CisgICAgICAgIHJldCA9IE9NWF9FcnJvckluc3VmZmljaWVudFJlc291cmNlczsKKyAgICAgICAgU0VDX09TQUxfTG9nKFNFQ19MT0dfRVJST1IsICJPTVhfRXJyb3JJbnN1ZmZpY2llbnRSZXNvdXJjZXMsIExpbmU6JWQiLCBfX0xJTkVfXyk7CisgICAgICAgIGdvdG8gRVhJVDsKKyAgICB9CisgICAgU0VDX09TQUxfTWVtc2V0KHBTRUNDb21wb25lbnQtPmNvbXBvbmVudE5hbWUsIDAsIE1BWF9PTVhfQ09NUE9ORU5UX05BTUVfU0laRSk7CisKKyAgICBwVnA4RGVjID0gU0VDX09TQUxfTWFsbG9jKHNpemVvZihTRUNfVlA4REVDX0hBTkRMRSkpOworICAgIGlmIChwVnA4RGVjID09IE5VTEwpIHsKKyAgICAgICAgU0VDX09NWF9WaWRlb0RlY29kZUNvbXBvbmVudERlaW5pdChwT01YQ29tcG9uZW50KTsKKyAgICAgICAgcmV0ID0gT01YX0Vycm9ySW5zdWZmaWNpZW50UmVzb3VyY2VzOworICAgICAgICBTRUNfT1NBTF9Mb2coU0VDX0xPR19FUlJPUiwgIk9NWF9FcnJvckluc3VmZmljaWVudFJlc291cmNlcywgTGluZTolZCIsIF9fTElORV9fKTsKKyAgICAgICAgZ290byBFWElUOworICAgIH0KKyAgICBTRUNfT1NBTF9NZW1zZXQocFZwOERlYywgMCwgc2l6ZW9mKFNFQ19WUDhERUNfSEFORExFKSk7CisgICAgcFZpZGVvRGVjID0gKFNFQ19PTVhfVklERU9ERUNfQ09NUE9ORU5UICopcFNFQ0NvbXBvbmVudC0+aENvbXBvbmVudEhhbmRsZTsKKyAgICBwVmlkZW9EZWMtPmhDb2RlY0hhbmRsZSA9IChPTVhfSEFORExFVFlQRSlwVnA4RGVjOworCisgICAgU0VDX09TQUxfU3RyY3B5KHBTRUNDb21wb25lbnQtPmNvbXBvbmVudE5hbWUsIFNFQ19PTVhfQ09NUE9ORU5UX1ZQOF9ERUMpOworCisgICAgLyogU2V0IGNvbXBvbmVudFZlcnNpb24gKi8KKyAgICBwU0VDQ29tcG9uZW50LT5jb21wb25lbnRWZXJzaW9uLnMublZlcnNpb25NYWpvciA9IFZFUlNJT05NQUpPUl9OVU1CRVI7CisgICAgcFNFQ0NvbXBvbmVudC0+Y29tcG9uZW50VmVyc2lvbi5zLm5WZXJzaW9uTWlub3IgPSBWRVJTSU9OTUlOT1JfTlVNQkVSOworICAgIHBTRUNDb21wb25lbnQtPmNvbXBvbmVudFZlcnNpb24ucy5uUmV2aXNpb24gICAgID0gUkVWSVNJT05fTlVNQkVSOworICAgIHBTRUNDb21wb25lbnQtPmNvbXBvbmVudFZlcnNpb24ucy5uU3RlcCAgICAgICAgID0gU1RFUF9OVU1CRVI7CisgICAgLyogU2V0IHNwZWNWZXJzaW9uICovCisgICAgcFNFQ0NvbXBvbmVudC0+c3BlY1ZlcnNpb24ucy5uVmVyc2lvbk1ham9yID0gVkVSU0lPTk1BSk9SX05VTUJFUjsKKyAgICBwU0VDQ29tcG9uZW50LT5zcGVjVmVyc2lvbi5zLm5WZXJzaW9uTWlub3IgPSBWRVJTSU9OTUlOT1JfTlVNQkVSOworICAgIHBTRUNDb21wb25lbnQtPnNwZWNWZXJzaW9uLnMublJldmlzaW9uICAgICA9IFJFVklTSU9OX05VTUJFUjsKKyAgICBwU0VDQ29tcG9uZW50LT5zcGVjVmVyc2lvbi5zLm5TdGVwICAgICAgICAgPSBTVEVQX05VTUJFUjsKKworICAgIC8qIEFuZHJvaWQgQ2FwYWJpbGl0eUZsYWdzICovCisgICAgcFNFQ0NvbXBvbmVudC0+Y2FwYWJpbGl0eUZsYWdzLmlJc09NWENvbXBvbmVudE11bHRpVGhyZWFkZWQgICAgICAgICAgICAgICAgICAgPSBPTVhfVFJVRTsKKyAgICBwU0VDQ29tcG9uZW50LT5jYXBhYmlsaXR5RmxhZ3MuaU9NWENvbXBvbmVudFN1cHBvcnRzRXh0ZXJuYWxJbnB1dEJ1ZmZlckFsbG9jICA9IE9NWF9UUlVFOworICAgIHBTRUNDb21wb25lbnQtPmNhcGFiaWxpdHlGbGFncy5pT01YQ29tcG9uZW50U3VwcG9ydHNFeHRlcm5hbE91dHB1dEJ1ZmZlckFsbG9jID0gT01YX1RSVUU7CisgICAgcFNFQ0NvbXBvbmVudC0+Y2FwYWJpbGl0eUZsYWdzLmlPTVhDb21wb25lbnRTdXBwb3J0c01vdmFibGVJbnB1dEJ1ZmZlcnMgICAgICAgPSBPTVhfRkFMU0U7CisgICAgcFNFQ0NvbXBvbmVudC0+Y2FwYWJpbGl0eUZsYWdzLmlPTVhDb21wb25lbnRTdXBwb3J0c1BhcnRpYWxGcmFtZXMgICAgICAgICAgICAgPSBPTVhfRkFMU0U7CisgICAgcFNFQ0NvbXBvbmVudC0+Y2FwYWJpbGl0eUZsYWdzLmlPTVhDb21wb25lbnRVc2VzTkFMU3RhcnRDb2RlcyAgICAgICAgICAgICAgICAgPSBPTVhfVFJVRTsKKyAgICBwU0VDQ29tcG9uZW50LT5jYXBhYmlsaXR5RmxhZ3MuaU9NWENvbXBvbmVudENhbkhhbmRsZUluY29tcGxldGVGcmFtZXMgICAgICAgICA9IE9NWF9UUlVFOworICAgIHBTRUNDb21wb25lbnQtPmNhcGFiaWxpdHlGbGFncy5pT01YQ29tcG9uZW50VXNlc0Z1bGxBVkNGcmFtZXMgICAgICAgICAgICAgICAgID0gT01YX1RSVUU7CisKKyAgICAvKiBJbnB1dCBwb3J0ICovCisgICAgcFNFQ1BvcnQgPSAmcFNFQ0NvbXBvbmVudC0+cFNFQ1BvcnRbSU5QVVRfUE9SVF9JTkRFWF07CisgICAgcFNFQ1BvcnQtPnBvcnREZWZpbml0aW9uLmZvcm1hdC52aWRlby5uRnJhbWVXaWR0aCA9IERFRkFVTFRfRlJBTUVfV0lEVEg7CisgICAgcFNFQ1BvcnQtPnBvcnREZWZpbml0aW9uLmZvcm1hdC52aWRlby5uRnJhbWVIZWlnaHQ9IERFRkFVTFRfRlJBTUVfSEVJR0hUOworICAgIHBTRUNQb3J0LT5wb3J0RGVmaW5pdGlvbi5mb3JtYXQudmlkZW8ublN0cmlkZSA9IDA7IC8qREVGQVVMVF9GUkFNRV9XSURUSDsqLworICAgIHBTRUNQb3J0LT5wb3J0RGVmaW5pdGlvbi5mb3JtYXQudmlkZW8ublNsaWNlSGVpZ2h0ID0gMDsKKyAgICBwU0VDUG9ydC0+cG9ydERlZmluaXRpb24ubkJ1ZmZlclNpemUgPSBERUZBVUxUX1ZJREVPX0lOUFVUX0JVRkZFUl9TSVpFOworICAgIHBTRUNQb3J0LT5wb3J0RGVmaW5pdGlvbi5mb3JtYXQudmlkZW8uZUNvbXByZXNzaW9uRm9ybWF0ID0gT01YX1ZJREVPX0NvZGluZ1ZQWDsKKyAgICBTRUNfT1NBTF9NZW1zZXQocFNFQ1BvcnQtPnBvcnREZWZpbml0aW9uLmZvcm1hdC52aWRlby5jTUlNRVR5cGUsIDAsIE1BWF9PTVhfTUlNRVRZUEVfU0laRSk7CisgICAgU0VDX09TQUxfU3RyY3B5KHBTRUNQb3J0LT5wb3J0RGVmaW5pdGlvbi5mb3JtYXQudmlkZW8uY01JTUVUeXBlLCAidmlkZW8veC12bmQub24yLnZwOCIpOworICAgIHBTRUNQb3J0LT5wb3J0RGVmaW5pdGlvbi5mb3JtYXQudmlkZW8ucE5hdGl2ZVJlbmRlciA9IDA7CisgICAgcFNFQ1BvcnQtPnBvcnREZWZpbml0aW9uLmZvcm1hdC52aWRlby5iRmxhZ0Vycm9yQ29uY2VhbG1lbnQgPSBPTVhfRkFMU0U7CisgICAgcFNFQ1BvcnQtPnBvcnREZWZpbml0aW9uLmZvcm1hdC52aWRlby5lQ29sb3JGb3JtYXQgPSBPTVhfQ09MT1JfRm9ybWF0VW51c2VkOworICAgIHBTRUNQb3J0LT5wb3J0RGVmaW5pdGlvbi5iRW5hYmxlZCA9IE9NWF9UUlVFOworCisgICAgLyogT3V0cHV0IHBvcnQgKi8KKyAgICBwU0VDUG9ydCA9ICZwU0VDQ29tcG9uZW50LT5wU0VDUG9ydFtPVVRQVVRfUE9SVF9JTkRFWF07CisgICAgcFNFQ1BvcnQtPnBvcnREZWZpbml0aW9uLmZvcm1hdC52aWRlby5uRnJhbWVXaWR0aCA9IERFRkFVTFRfRlJBTUVfV0lEVEg7CisgICAgcFNFQ1BvcnQtPnBvcnREZWZpbml0aW9uLmZvcm1hdC52aWRlby5uRnJhbWVIZWlnaHQ9IERFRkFVTFRfRlJBTUVfSEVJR0hUOworICAgIHBTRUNQb3J0LT5wb3J0RGVmaW5pdGlvbi5mb3JtYXQudmlkZW8ublN0cmlkZSA9IDA7IC8qREVGQVVMVF9GUkFNRV9XSURUSDsqLworICAgIHBTRUNQb3J0LT5wb3J0RGVmaW5pdGlvbi5mb3JtYXQudmlkZW8ublNsaWNlSGVpZ2h0ID0gMDsKKyAgICBwU0VDUG9ydC0+cG9ydERlZmluaXRpb24ubkJ1ZmZlclNpemUgPSBERUZBVUxUX1ZJREVPX09VVFBVVF9CVUZGRVJfU0laRTsKKyAgICBwU0VDUG9ydC0+cG9ydERlZmluaXRpb24uZm9ybWF0LnZpZGVvLmVDb21wcmVzc2lvbkZvcm1hdCA9IE9NWF9WSURFT19Db2RpbmdVbnVzZWQ7CisgICAgU0VDX09TQUxfTWVtc2V0KHBTRUNQb3J0LT5wb3J0RGVmaW5pdGlvbi5mb3JtYXQudmlkZW8uY01JTUVUeXBlLCAwLCBNQVhfT01YX01JTUVUWVBFX1NJWkUpOworICAgIFNFQ19PU0FMX1N0cmNweShwU0VDUG9ydC0+cG9ydERlZmluaXRpb24uZm9ybWF0LnZpZGVvLmNNSU1FVHlwZSwgInJhdy92aWRlbyIpOworICAgIHBTRUNQb3J0LT5wb3J0RGVmaW5pdGlvbi5mb3JtYXQudmlkZW8ucE5hdGl2ZVJlbmRlciA9IDA7CisgICAgcFNFQ1BvcnQtPnBvcnREZWZpbml0aW9uLmZvcm1hdC52aWRlby5iRmxhZ0Vycm9yQ29uY2VhbG1lbnQgPSBPTVhfRkFMU0U7CisgICAgcFNFQ1BvcnQtPnBvcnREZWZpbml0aW9uLmZvcm1hdC52aWRlby5lQ29sb3JGb3JtYXQgPSBPTVhfQ09MT1JfRm9ybWF0WVVWNDIwUGxhbmFyOworICAgIHBTRUNQb3J0LT5wb3J0RGVmaW5pdGlvbi5iRW5hYmxlZCA9IE9NWF9UUlVFOworCisgICAgLypmb3IoaSA9IDA7IGkgPCBBTExfUE9SVF9OVU07IGkrKykgeworICAgICAgICBJTklUX1NFVF9TSVpFX1ZFUlNJT04oJnBIMjY0RGVjLT5BVkNDb21wb25lbnRbaV0sIE9NWF9WSURFT19QQVJBTV9BVkNUWVBFKTsKKyAgICAgICAgcEgyNjREZWMtPkFWQ0NvbXBvbmVudFtpXS5uUG9ydEluZGV4ID0gaTsKKyAgICAgICAgcEgyNjREZWMtPkFWQ0NvbXBvbmVudFtpXS5lUHJvZmlsZSAgID0gT01YX1ZJREVPX0FWQ1Byb2ZpbGVCYXNlbGluZTsKKyAgICAgICAgcEgyNjREZWMtPkFWQ0NvbXBvbmVudFtpXS5lTGV2ZWwgICAgID0gT01YX1ZJREVPX0FWQ0xldmVsNDsKKyAgICB9Ki8KKworICAgIHBPTVhDb21wb25lbnQtPkdldFBhcmFtZXRlciAgICAgID0gJlNFQ19NRkNfVlA4RGVjX0dldFBhcmFtZXRlcjsKKyAgICBwT01YQ29tcG9uZW50LT5TZXRQYXJhbWV0ZXIgICAgICA9ICZTRUNfTUZDX1ZQOERlY19TZXRQYXJhbWV0ZXI7CisgICAgcE9NWENvbXBvbmVudC0+R2V0Q29uZmlnICAgICAgICAgPSAmU0VDX01GQ19WUDhEZWNfR2V0Q29uZmlnOworICAgIHBPTVhDb21wb25lbnQtPlNldENvbmZpZyAgICAgICAgID0gJlNFQ19NRkNfVlA4RGVjX1NldENvbmZpZzsKKyAgICBwT01YQ29tcG9uZW50LT5HZXRFeHRlbnNpb25JbmRleCA9ICZTRUNfTUZDX1ZQOERlY19HZXRFeHRlbnNpb25JbmRleDsKKyAgICBwT01YQ29tcG9uZW50LT5Db21wb25lbnRSb2xlRW51bSA9ICZTRUNfTUZDX1ZQOERlY19Db21wb25lbnRSb2xlRW51bTsKKyAgICBwT01YQ29tcG9uZW50LT5Db21wb25lbnREZUluaXQgICA9ICZTRUNfT01YX0NvbXBvbmVudERlaW5pdDsKKworICAgIHBTRUNDb21wb25lbnQtPnNlY19tZmNfY29tcG9uZW50SW5pdCAgICAgID0gJlNFQ19NRkNfVlA4RGVjX0luaXQ7CisgICAgcFNFQ0NvbXBvbmVudC0+c2VjX21mY19jb21wb25lbnRUZXJtaW5hdGUgPSAmU0VDX01GQ19WUDhEZWNfVGVybWluYXRlOworICAgIHBTRUNDb21wb25lbnQtPnNlY19tZmNfYnVmZmVyUHJvY2VzcyAgICAgID0gJlNFQ19NRkNfVlA4RGVjX2J1ZmZlclByb2Nlc3M7CisgICAgcFNFQ0NvbXBvbmVudC0+c2VjX2NoZWNrSW5wdXRGcmFtZSAgICAgICAgPSAmQ2hlY2tfVlA4X0ZyYW1lOworCisgICAgcFNFQ0NvbXBvbmVudC0+Y3VycmVudFN0YXRlID0gT01YX1N0YXRlTG9hZGVkOworCisgICAgcmV0ID0gT01YX0Vycm9yTm9uZTsKKworRVhJVDoKKyAgICBGdW5jdGlvbk91dCgpOworCisgICAgcmV0dXJuIHJldDsKK30KKworT01YX0VSUk9SVFlQRSBTRUNfT01YX0NvbXBvbmVudERlaW5pdChPTVhfSEFORExFVFlQRSBoQ29tcG9uZW50KQoreworICAgIE9NWF9FUlJPUlRZUEUgICAgICAgICAgICByZXQgPSBPTVhfRXJyb3JOb25lOworICAgIE9NWF9DT01QT05FTlRUWVBFICAgICAgICpwT01YQ29tcG9uZW50ID0gTlVMTDsKKyAgICBTRUNfT01YX0JBU0VDT01QT05FTlQgICAqcFNFQ0NvbXBvbmVudCA9IE5VTEw7CisgICAgU0VDX1ZQOERFQ19IQU5ETEUgICAgICAqcFZwOERlYyA9IE5VTEw7CisKKyAgICBGdW5jdGlvbkluKCk7CisKKyAgICBpZiAoaENvbXBvbmVudCA9PSBOVUxMKSB7CisgICAgICAgIHJldCA9IE9NWF9FcnJvckJhZFBhcmFtZXRlcjsKKyAgICAgICAgZ290byBFWElUOworICAgIH0KKyAgICBwT01YQ29tcG9uZW50ID0gKE9NWF9DT01QT05FTlRUWVBFICopaENvbXBvbmVudDsKKyAgICBwU0VDQ29tcG9uZW50ID0gKFNFQ19PTVhfQkFTRUNPTVBPTkVOVCAqKXBPTVhDb21wb25lbnQtPnBDb21wb25lbnRQcml2YXRlOworCisgICAgU0VDX09TQUxfRnJlZShwU0VDQ29tcG9uZW50LT5jb21wb25lbnROYW1lKTsKKyAgICBwU0VDQ29tcG9uZW50LT5jb21wb25lbnROYW1lID0gTlVMTDsKKworICAgIHBWcDhEZWMgPSAoU0VDX1ZQOERFQ19IQU5ETEUgKikoKFNFQ19PTVhfVklERU9ERUNfQ09NUE9ORU5UICopcFNFQ0NvbXBvbmVudC0+aENvbXBvbmVudEhhbmRsZSktPmhDb2RlY0hhbmRsZTsKKyAgICBpZiAocFZwOERlYyAhPSBOVUxMKSB7CisgICAgICAgIFNFQ19PU0FMX0ZyZWUocFZwOERlYyk7CisgICAgICAgIHBWcDhEZWMgPSAoKFNFQ19PTVhfVklERU9ERUNfQ09NUE9ORU5UICopcFNFQ0NvbXBvbmVudC0+aENvbXBvbmVudEhhbmRsZSktPmhDb2RlY0hhbmRsZSA9IE5VTEw7CisgICAgfQorCisgICAgcmV0ID0gU0VDX09NWF9WaWRlb0RlY29kZUNvbXBvbmVudERlaW5pdChwT01YQ29tcG9uZW50KTsKKyAgICBpZiAocmV0ICE9IE9NWF9FcnJvck5vbmUpIHsKKyAgICAgICAgZ290byBFWElUOworICAgIH0KKworICAgIHJldCA9IE9NWF9FcnJvck5vbmU7CisKK0VYSVQ6CisgICAgRnVuY3Rpb25PdXQoKTsKKworICAgIHJldHVybiByZXQ7Cit9CmRpZmYgLS1naXQgYS9leHlub3M0L211bHRpbWVkaWEvb3Blbm1heC9zZWNfb214L2NvbXBvbmVudC92aWRlby9kZWMvdnA4L1NFQ19PTVhfVnA4ZGVjLmggYi9leHlub3M0L211bHRpbWVkaWEvb3Blbm1heC9zZWNfb214L2NvbXBvbmVudC92aWRlby9kZWMvdnA4L1NFQ19PTVhfVnA4ZGVjLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDBjZTIwYwotLS0gL2Rldi9udWxsCisrKyBiL2V4eW5vczQvbXVsdGltZWRpYS9vcGVubWF4L3NlY19vbXgvY29tcG9uZW50L3ZpZGVvL2RlYy92cDgvU0VDX09NWF9WcDhkZWMuaApAQCAtMCwwICsxLDY2IEBACisvKgorICoKKyAqIENvcHlyaWdodCAyMDExIFNhbXN1bmcgRWxlY3Ryb25pY3MgUy5MU0kgQ28uIExURAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisvKgorICogQGZpbGUgICAgICAgU0VDX09NWF9WcDhkZWMuaAorICogQGJyaWVmCisgKiBAYXV0aG9yICAgICBTYXRpc2ggS3VtYXIgUmVkZHkgKHBhbGxpLnNhdGlzaEBzYW1zdW5nLmNvbSkKKyAqIEB2ZXJzaW9uICAgIDEuMS4wCisgKiBAaGlzdG9yeQorICogICAyMDExLjEwLjEwIDogQ3JlYXRlCisgKi8KKworI2lmbmRlZiBTRUNfT01YX1ZQOF9ERUNfQ09NUE9ORU5UCisjZGVmaW5lIFNFQ19PTVhfVlA4X0RFQ19DT01QT05FTlQKKworI2luY2x1ZGUgIlNFQ19PTVhfRGVmLmgiCisjaW5jbHVkZSAiT01YX0NvbXBvbmVudC5oIgorI2luY2x1ZGUgIk9NWF9WaWRlby5oIgorCisKK3R5cGVkZWYgc3RydWN0IF9TRUNfTUZDX1ZQOERFQ19IQU5ETEUKK3sKKyAgICBPTVhfSEFORExFVFlQRSBoTUZDSGFuZGxlOworICAgIE9NWF9QVFIgIHBNRkNTdHJlYW1CdWZmZXI7CisgICAgT01YX1BUUiAgcE1GQ1N0cmVhbVBoeUJ1ZmZlcjsKKyAgICBPTVhfVTMyICBpbmRleFRpbWVzdGFtcDsKKyAgICBPTVhfVTMyICBvdXRwdXRJbmRleFRpbWVzdGFtcDsKKyAgICBPTVhfQk9PTCBiQ29uZmlndXJlZE1GQzsKKyAgICBPTVhfUzMyICByZXR1cm5Db2RlYzsKK30gU0VDX01GQ19WUDhERUNfSEFORExFOworCit0eXBlZGVmIHN0cnVjdCBfU0VDX1ZQOERFQ19IQU5ETEUKK3sKKyAgICAvKiBPTVggQ29kZWMgc3BlY2lmaWMgKi8KKyAgICBPTVhfVklERU9fUEFSQU1fRVJST1JDT1JSRUNUSU9OVFlQRSBlcnJvckNvcnJlY3Rpb25UeXBlW0FMTF9QT1JUX05VTV07CisKKyAgICAvKiBTRUMgTUZDIENvZGVjIHNwZWNpZmljICovCisgICAgU0VDX01GQ19WUDhERUNfSEFORExFIGhNRkNWcDhIYW5kbGU7Cit9IFNFQ19WUDhERUNfSEFORExFOworCisjaWZkZWYgX19jcGx1c3BsdXMKK2V4dGVybiAiQyIgeworI2VuZGlmCisKK09TQ0xfRVhQT1JUX1JFRiBPTVhfRVJST1JUWVBFIFNFQ19PTVhfQ29tcG9uZW50SW5pdChPTVhfSEFORExFVFlQRSBoQ29tcG9uZW50LCBPTVhfU1RSSU5HIGNvbXBvbmVudE5hbWUpOworT01YX0VSUk9SVFlQRSBTRUNfT01YX0NvbXBvbmVudERlaW5pdChPTVhfSEFORExFVFlQRSBoQ29tcG9uZW50KTsKKworI2lmZGVmIF9fY3BsdXNwbHVzCit9OworI2VuZGlmCisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvZXh5bm9zNC9tdWx0aW1lZGlhL29wZW5tYXgvc2VjX29teC9jb21wb25lbnQvdmlkZW8vZGVjL3ZwOC9saWJyYXJ5X3JlZ2lzdGVyLmMgYi9leHlub3M0L211bHRpbWVkaWEvb3Blbm1heC9zZWNfb214L2NvbXBvbmVudC92aWRlby9kZWMvdnA4L2xpYnJhcnlfcmVnaXN0ZXIuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xM2Y3ZjRhCi0tLSAvZGV2L251bGwKKysrIGIvZXh5bm9zNC9tdWx0aW1lZGlhL29wZW5tYXgvc2VjX29teC9jb21wb25lbnQvdmlkZW8vZGVjL3ZwOC9saWJyYXJ5X3JlZ2lzdGVyLmMKQEAgLTAsMCArMSw1OCBAQAorLyoKKyAqCisgKiBDb3B5cmlnaHQgMjAxMSBTYW1zdW5nIEVsZWN0cm9uaWNzIFMuTFNJIENvLiBMVEQKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworLyoKKyAqIEBmaWxlICAgIGxpYnJhcnlfcmVnaXN0ZXIuYworICogQGJyaWVmCisgKiBAYXV0aG9yICAgICBTYXRpc2ggS3VtYXIgUmVkZHkgKHBhbGxpLnNhdGlzaEBzYW1zdW5nLmNvbSkKKyAqIEB2ZXJzaW9uICAgIDEuMS4wCisgKiBAaGlzdG9yeQorICogICAyMDExLjExLjE1IDogQ3JlYXRlCisgKi8KKworI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8c3RkbGliLmg+CisjaW5jbHVkZSA8c3RyaW5nLmg+CisjaW5jbHVkZSA8ZGxmY24uaD4KKworI2luY2x1ZGUgIlNFQ19PU0FMX01lbW9yeS5oIgorI2luY2x1ZGUgIlNFQ19PU0FMX0VUQy5oIgorI2luY2x1ZGUgImxpYnJhcnlfcmVnaXN0ZXIuaCIKKworI3VuZGVmICBTRUNfTE9HX1RBRworI2RlZmluZSBTRUNfTE9HX1RBRyAgICAiU0VDX1ZQOF9ERUMiCisjZGVmaW5lIFNFQ19MT0dfT0ZGCisjaW5jbHVkZSAiU0VDX09TQUxfTG9nLmgiCisKKworT1NDTF9FWFBPUlRfUkVGIGludCBTRUNfT01YX0NPTVBPTkVOVF9MaWJyYXJ5X1JlZ2lzdGVyKFNFQ1JlZ2lzdGVyQ29tcG9uZW50VHlwZSAqKnBwU0VDQ29tcG9uZW50KQoreworICAgIEZ1bmN0aW9uSW4oKTsKKworICAgIGlmIChwcFNFQ0NvbXBvbmVudCA9PSBOVUxMKQorICAgICAgICBnb3RvIEVYSVQ7CisKKyAgICAvKiBjb21wb25lbnQgMSAtIHZpZGVvIGRlY29kZXIgVlA4ICovCisgICAgU0VDX09TQUxfU3RyY3B5KHBwU0VDQ29tcG9uZW50WzBdLT5jb21wb25lbnROYW1lLCBTRUNfT01YX0NPTVBPTkVOVF9WUDhfREVDKTsKKyAgICBTRUNfT1NBTF9TdHJjcHkocHBTRUNDb21wb25lbnRbMF0tPnJvbGVzWzBdLCBTRUNfT01YX0NPTVBPTkVOVF9WUDhfREVDX1JPTEUpOworICAgIHBwU0VDQ29tcG9uZW50WzBdLT50b3RhbFJvbGVOdW0gPSBNQVhfQ09NUE9ORU5UX1JPTEVfTlVNOworCitFWElUOgorICAgIEZ1bmN0aW9uT3V0KCk7CisgICAgcmV0dXJuIE1BWF9DT01QT05FTlRfTlVNOworfQorCmRpZmYgLS1naXQgYS9leHlub3M0L211bHRpbWVkaWEvb3Blbm1heC9zZWNfb214L2NvbXBvbmVudC92aWRlby9kZWMvdnA4L2xpYnJhcnlfcmVnaXN0ZXIuaCBiL2V4eW5vczQvbXVsdGltZWRpYS9vcGVubWF4L3NlY19vbXgvY29tcG9uZW50L3ZpZGVvL2RlYy92cDgvbGlicmFyeV9yZWdpc3Rlci5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjVlMTcxNTAKLS0tIC9kZXYvbnVsbAorKysgYi9leHlub3M0L211bHRpbWVkaWEvb3Blbm1heC9zZWNfb214L2NvbXBvbmVudC92aWRlby9kZWMvdnA4L2xpYnJhcnlfcmVnaXN0ZXIuaApAQCAtMCwwICsxLDU0IEBACisvKgorICoKKyAqIENvcHlyaWdodCAyMDExIFNhbXN1bmcgRWxlY3Ryb25pY3MgUy5MU0kgQ28uIExURAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisvKgorICogQGZpbGUgICAgICAgIGxpYnJhcnlfcmVnaXN0ZXIuaAorICogQGJyaWVmCisgKiBAYXV0aG9yICAgICAgU2F0aXNoIEt1bWFyIFJlZGR5IChwYWxsaS5zYXRpc2hAc2Ftc3VuZy5jb20pCisgKiBAdmVyc2lvbiAgICAgMS4xLjAKKyAqIEBoaXN0b3J5CisgKiAgIDIwMTEuMTEuMTUgOiBDcmVhdGUKKyAqLworCisjaWZuZGVmIFNFQ19PTVhfVlA4X0RFQ19SRUcKKyNkZWZpbmUgU0VDX09NWF9WUDhfREVDX1JFRworCisjaW5jbHVkZSAiU0VDX09NWF9EZWYuaCIKKyNpbmNsdWRlICJPTVhfQ29tcG9uZW50LmgiCisjaW5jbHVkZSAiU0VDX09NWF9Db21wb25lbnRfUmVnaXN0ZXIuaCIKKworCisjZGVmaW5lIE9TQ0xfRVhQT1JUX1JFRiBfX2F0dHJpYnV0ZV9fKCh2aXNpYmlsaXR5KCJkZWZhdWx0IikpKQorI2RlZmluZSBNQVhfQ09NUE9ORU5UX05VTSAgICAgICAxCisjZGVmaW5lIE1BWF9DT01QT05FTlRfUk9MRV9OVU0gIDEKKworLyogVlA4ICovCisjZGVmaW5lIFNFQ19PTVhfQ09NUE9ORU5UX1ZQOF9ERUMgIk9NWC5TRUMuVlA4LkRlY29kZXIiCisjZGVmaW5lIFNFQ19PTVhfQ09NUE9ORU5UX1ZQOF9ERUNfUk9MRSAidmlkZW9fZGVjb2Rlci52cHgiCisKKworI2lmZGVmIF9fY3BsdXNwbHVzCitleHRlcm4gIkMiIHsKKyNlbmRpZgorCitPU0NMX0VYUE9SVF9SRUYgaW50IFNFQ19PTVhfQ09NUE9ORU5UX0xpYnJhcnlfUmVnaXN0ZXIoU0VDUmVnaXN0ZXJDb21wb25lbnRUeXBlICoqcHBTRUNDb21wb25lbnQpOworCisjaWZkZWYgX19jcGx1c3BsdXMKK307CisjZW5kaWYKKworI2VuZGlmCmRpZmYgLS1naXQgYS9leHlub3M0L211bHRpbWVkaWEvb3Blbm1heC9zZWNfb214L2NvbXBvbmVudC92aWRlby9lbmMvQW5kcm9pZC5tayBiL2V4eW5vczQvbXVsdGltZWRpYS9vcGVubWF4L3NlY19vbXgvY29tcG9uZW50L3ZpZGVvL2VuYy9BbmRyb2lkLm1rCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjFjODQyZjIKLS0tIC9kZXYvbnVsbAorKysgYi9leHlub3M0L211bHRpbWVkaWEvb3Blbm1heC9zZWNfb214L2NvbXBvbmVudC92aWRlby9lbmMvQW5kcm9pZC5tawpAQCAtMCwwICsxLDM3IEBACitMT0NBTF9QQVRIIDo9ICQoY2FsbCBteS1kaXIpCitpbmNsdWRlICQoQ0xFQVJfVkFSUykKKworTE9DQUxfU1JDX0ZJTEVTIDo9IFwKKwlTRUNfT01YX1ZlbmMuYworCitMT0NBTF9NT0RVTEUgOj0gbGliU0VDX09NWF9WZW5jCitMT0NBTF9BUk1fTU9ERSA6PSBhcm0KK0xPQ0FMX01PRFVMRV9UQUdTIDo9IG9wdGlvbmFsCisKK0xPQ0FMX0NfSU5DTFVERVMgOj0gJChTRUNfT01YX0lOQykva2hyb25vcyBcCisJJChTRUNfT01YX0lOQykvc2VjIFwKKwkkKFNFQ19PTVhfVE9QKS9vc2FsIFwKKwkkKFNFQ19PTVhfVE9QKS9jb3JlIFwKKwkkKFNFQ19PTVhfQ09NUE9ORU5UKS9jb21tb24gXAorCSQoU0VDX09NWF9DT01QT05FTlQpL3ZpZGVvL2RlYyBcCisJJChUQVJHRVRfT1VUX0hFQURFUlMpLyQoU0VDX0NPUFlfSEVBREVSU19UTykKKworaWZlcSAoJChCT0FSRF9VU0VfTUVUQURBVEFCVUZGRVJUWVBFKSwgdHJ1ZSkKK0xPQ0FMX0NGTEFHUyArPSAtRFVTRV9NRVRBREFUQUJVRkZFUlRZUEUKK2VuZGlmCisKK2lmZXEgKCQoQk9BUkRfVVNFX1NUT1JFTUVUQURBVEEpLCB0cnVlKQorTE9DQUxfQ0ZMQUdTICs9IC1EVVNFX1NUT1JFTUVUQURBVEEKK2VuZGlmCisKK2lmZXEgKCQoQk9BUkRfVVNFX1Y0TDIpLCB0cnVlKQoraWZlcSAoJChUQVJHRVRfU09DKSwgZXh5bm9zNTI1MCkKK0xPQ0FMX0NGTEFHUyArPSAtRFVTRV9TTElDRV9PVVRQVVRfTU9ERQorZW5kaWYKK2Vsc2UKK0xPQ0FMX0NGTEFHUyArPSAtRFVTRV9TTElDRV9PVVRQVVRfTU9ERQorZW5kaWYKKworTE9DQUxfU0hBUkVEX0xJQlJBUklFUyA6PSBsaWJjc2MKKworaW5jbHVkZSAkKEJVSUxEX1NUQVRJQ19MSUJSQVJZKQpkaWZmIC0tZ2l0IGEvZXh5bm9zNC9tdWx0aW1lZGlhL29wZW5tYXgvc2VjX29teC9jb21wb25lbnQvdmlkZW8vZW5jL1NFQ19PTVhfVmVuYy5jIGIvZXh5bm9zNC9tdWx0aW1lZGlhL29wZW5tYXgvc2VjX29teC9jb21wb25lbnQvdmlkZW8vZW5jL1NFQ19PTVhfVmVuYy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU0YjZjYzIKLS0tIC9kZXYvbnVsbAorKysgYi9leHlub3M0L211bHRpbWVkaWEvb3Blbm1heC9zZWNfb214L2NvbXBvbmVudC92aWRlby9lbmMvU0VDX09NWF9WZW5jLmMKQEAgLTAsMCArMSwxODU2IEBACisvKgorICoKKyAqIENvcHlyaWdodCAyMDEwIFNhbXN1bmcgRWxlY3Ryb25pY3MgUy5MU0kgQ28uIExURAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisvKgorICogQGZpbGUgICAgICAgIFNFQ19PTVhfVmVuYy5jCisgKiBAYnJpZWYKKyAqIEBhdXRob3IgICAgICBTZXVuZ0Jlb20gS2ltIChzYmNydXgua2ltQHNhbXN1bmcuY29tKQorICogICAgICAgICAgICAgIFl1bmppIEtpbSAoeXVuamkua2ltQHNhbXN1bmcuY29tKQorICogQHZlcnNpb24gICAgIDEuMS4wCisgKiBAaGlzdG9yeQorICogICAyMDEwLjcuMTUgOiBDcmVhdGUKKyAqLworCisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlIDxzdGRsaWIuaD4KKyNpbmNsdWRlIDxzdHJpbmcuaD4KKyNpbmNsdWRlICJTRUNfT01YX01hY3Jvcy5oIgorI2luY2x1ZGUgIlNFQ19PU0FMX0V2ZW50LmgiCisjaW5jbHVkZSAiU0VDX09NWF9WZW5jLmgiCisjaW5jbHVkZSAiU0VDX09NWF9CYXNlY29tcG9uZW50LmgiCisjaW5jbHVkZSAiU0VDX09TQUxfVGhyZWFkLmgiCisjaW5jbHVkZSAiU0VDX09TQUxfTXV0ZXguaCIKKyNpbmNsdWRlICJTRUNfT1NBTF9TZW1hcGhvcmUuaCIKKyNpbmNsdWRlICJTRUNfT1NBTF9FVEMuaCIKKyNpbmNsdWRlICJjc2MuaCIKKworI2lmZGVmIFVTRV9TVE9SRU1FVEFEQVRBCisjaW5jbHVkZSAiU0VDX09TQUxfQW5kcm9pZC5oIgorI2VuZGlmCisKKyN1bmRlZiAgU0VDX0xPR19UQUcKKyNkZWZpbmUgU0VDX0xPR19UQUcgICAgIlNFQ19WSURFT19FTkMiCisjZGVmaW5lIFNFQ19MT0dfT0ZGCisjaW5jbHVkZSAiU0VDX09TQUxfTG9nLmgiCisKKworaW5saW5lIHZvaWQgU0VDX1VwZGF0ZUZyYW1lU2l6ZShPTVhfQ09NUE9ORU5UVFlQRSAqcE9NWENvbXBvbmVudCkKK3sKKyAgICBTRUNfT01YX0JBU0VDT01QT05FTlQgKnBTRUNDb21wb25lbnQgPSAoU0VDX09NWF9CQVNFQ09NUE9ORU5UICopcE9NWENvbXBvbmVudC0+cENvbXBvbmVudFByaXZhdGU7CisgICAgU0VDX09NWF9CQVNFUE9SVCAgICAgICpzZWNJbnB1dFBvcnQgPSAmcFNFQ0NvbXBvbmVudC0+cFNFQ1BvcnRbSU5QVVRfUE9SVF9JTkRFWF07CisgICAgU0VDX09NWF9CQVNFUE9SVCAgICAgICpzZWNPdXRwdXRQb3J0ID0gJnBTRUNDb21wb25lbnQtPnBTRUNQb3J0W09VVFBVVF9QT1JUX0lOREVYXTsKKworICAgIGlmICgoc2VjT3V0cHV0UG9ydC0+cG9ydERlZmluaXRpb24uZm9ybWF0LnZpZGVvLm5GcmFtZVdpZHRoICE9CisgICAgICAgICAgICBzZWNJbnB1dFBvcnQtPnBvcnREZWZpbml0aW9uLmZvcm1hdC52aWRlby5uRnJhbWVXaWR0aCkgfHwKKyAgICAgICAgKHNlY091dHB1dFBvcnQtPnBvcnREZWZpbml0aW9uLmZvcm1hdC52aWRlby5uRnJhbWVIZWlnaHQgIT0KKyAgICAgICAgICAgIHNlY0lucHV0UG9ydC0+cG9ydERlZmluaXRpb24uZm9ybWF0LnZpZGVvLm5GcmFtZUhlaWdodCkpIHsKKyAgICAgICAgT01YX1UzMiB3aWR0aCA9IDAsIGhlaWdodCA9IDA7CisKKyAgICAgICAgc2VjT3V0cHV0UG9ydC0+cG9ydERlZmluaXRpb24uZm9ybWF0LnZpZGVvLm5GcmFtZVdpZHRoID0KKyAgICAgICAgICAgIHNlY0lucHV0UG9ydC0+cG9ydERlZmluaXRpb24uZm9ybWF0LnZpZGVvLm5GcmFtZVdpZHRoOworICAgICAgICBzZWNPdXRwdXRQb3J0LT5wb3J0RGVmaW5pdGlvbi5mb3JtYXQudmlkZW8ubkZyYW1lSGVpZ2h0ID0KKyAgICAgICAgICAgIHNlY0lucHV0UG9ydC0+cG9ydERlZmluaXRpb24uZm9ybWF0LnZpZGVvLm5GcmFtZUhlaWdodDsKKyAgICAgICAgd2lkdGggPSBzZWNPdXRwdXRQb3J0LT5wb3J0RGVmaW5pdGlvbi5mb3JtYXQudmlkZW8ublN0cmlkZSA9CisgICAgICAgICAgICBzZWNJbnB1dFBvcnQtPnBvcnREZWZpbml0aW9uLmZvcm1hdC52aWRlby5uU3RyaWRlOworICAgICAgICBoZWlnaHQgPSBzZWNPdXRwdXRQb3J0LT5wb3J0RGVmaW5pdGlvbi5mb3JtYXQudmlkZW8ublNsaWNlSGVpZ2h0ID0KKyAgICAgICAgICAgIHNlY0lucHV0UG9ydC0+cG9ydERlZmluaXRpb24uZm9ybWF0LnZpZGVvLm5TbGljZUhlaWdodDsKKworICAgICAgICBpZiAod2lkdGggJiYgaGVpZ2h0KQorICAgICAgICAgICAgc2VjT3V0cHV0UG9ydC0+cG9ydERlZmluaXRpb24ubkJ1ZmZlclNpemUgPSAod2lkdGggKiBoZWlnaHQgKiAzKSAvIDI7CisgICAgfQorCisgIHJldHVybiA7Cit9CisKK09NWF9FUlJPUlRZUEUgU0VDX09NWF9Vc2VCdWZmZXIoCisgICAgT01YX0lOIE9NWF9IQU5ETEVUWVBFICAgICAgICAgICAgaENvbXBvbmVudCwKKyAgICBPTVhfSU5PVVQgT01YX0JVRkZFUkhFQURFUlRZUEUgKipwcEJ1ZmZlckhkciwKKyAgICBPTVhfSU4gT01YX1UzMiAgICAgICAgICAgICAgICAgICBuUG9ydEluZGV4LAorICAgIE9NWF9JTiBPTVhfUFRSICAgICAgICAgICAgICAgICAgIHBBcHBQcml2YXRlLAorICAgIE9NWF9JTiBPTVhfVTMyICAgICAgICAgICAgICAgICAgIG5TaXplQnl0ZXMsCisgICAgT01YX0lOIE9NWF9VOCAgICAgICAgICAgICAgICAgICAqcEJ1ZmZlcikKK3sKKyAgICBPTVhfRVJST1JUWVBFICAgICAgICAgIHJldCA9IE9NWF9FcnJvck5vbmU7CisgICAgT01YX0NPTVBPTkVOVFRZUEUgICAgICpwT01YQ29tcG9uZW50ID0gTlVMTDsKKyAgICBTRUNfT01YX0JBU0VDT01QT05FTlQgKnBTRUNDb21wb25lbnQgPSBOVUxMOworICAgIFNFQ19PTVhfQkFTRVBPUlQgICAgICAqcFNFQ1BvcnQgPSBOVUxMOworICAgIE9NWF9CVUZGRVJIRUFERVJUWVBFICAqdGVtcF9idWZmZXJIZWFkZXIgPSBOVUxMOworICAgIE9NWF9VMzIgICAgICAgICAgICAgICAgaSA9IDA7CisKKyAgICBGdW5jdGlvbkluKCk7CisKKyAgICBpZiAoaENvbXBvbmVudCA9PSBOVUxMKSB7CisgICAgICAgIHJldCA9IE9NWF9FcnJvckJhZFBhcmFtZXRlcjsKKyAgICAgICAgZ290byBFWElUOworICAgIH0KKyAgICBwT01YQ29tcG9uZW50ID0gKE9NWF9DT01QT05FTlRUWVBFICopaENvbXBvbmVudDsKKyAgICByZXQgPSBTRUNfT01YX0NoZWNrX1NpemVWZXJzaW9uKHBPTVhDb21wb25lbnQsIHNpemVvZihPTVhfQ09NUE9ORU5UVFlQRSkpOworICAgIGlmIChyZXQgIT0gT01YX0Vycm9yTm9uZSkgeworICAgICAgICBnb3RvIEVYSVQ7CisgICAgfQorCisgICAgaWYgKHBPTVhDb21wb25lbnQtPnBDb21wb25lbnRQcml2YXRlID09IE5VTEwpIHsKKyAgICAgICAgcmV0ID0gT01YX0Vycm9yQmFkUGFyYW1ldGVyOworICAgICAgICBnb3RvIEVYSVQ7CisgICAgfQorICAgIHBTRUNDb21wb25lbnQgPSAoU0VDX09NWF9CQVNFQ09NUE9ORU5UICopcE9NWENvbXBvbmVudC0+cENvbXBvbmVudFByaXZhdGU7CisKKyAgICBwU0VDUG9ydCA9ICZwU0VDQ29tcG9uZW50LT5wU0VDUG9ydFtuUG9ydEluZGV4XTsKKyAgICBpZiAoblBvcnRJbmRleCA+PSBwU0VDQ29tcG9uZW50LT5wb3J0UGFyYW0ublBvcnRzKSB7CisgICAgICAgIHJldCA9IE9NWF9FcnJvckJhZFBvcnRJbmRleDsKKyAgICAgICAgZ290byBFWElUOworICAgIH0KKyAgICBpZiAocFNFQ1BvcnQtPnBvcnRTdGF0ZSAhPSBPTVhfU3RhdGVJZGxlKSB7CisgICAgICAgIHJldCA9IE9NWF9FcnJvckluY29ycmVjdFN0YXRlT3BlcmF0aW9uOworICAgICAgICBnb3RvIEVYSVQ7CisgICAgfQorCisgICAgaWYgKENIRUNLX1BPUlRfVFVOTkVMRUQocFNFQ1BvcnQpICYmIENIRUNLX1BPUlRfQlVGRkVSX1NVUFBMSUVSKHBTRUNQb3J0KSkgeworICAgICAgICByZXQgPSBPTVhfRXJyb3JCYWRQb3J0SW5kZXg7CisgICAgICAgIGdvdG8gRVhJVDsKKyAgICB9CisKKyAgICB0ZW1wX2J1ZmZlckhlYWRlciA9IChPTVhfQlVGRkVSSEVBREVSVFlQRSAqKVNFQ19PU0FMX01hbGxvYyhzaXplb2YoT01YX0JVRkZFUkhFQURFUlRZUEUpKTsKKyAgICBpZiAodGVtcF9idWZmZXJIZWFkZXIgPT0gTlVMTCkgeworICAgICAgICByZXQgPSBPTVhfRXJyb3JJbnN1ZmZpY2llbnRSZXNvdXJjZXM7CisgICAgICAgIGdvdG8gRVhJVDsKKyAgICB9CisgICAgU0VDX09TQUxfTWVtc2V0KHRlbXBfYnVmZmVySGVhZGVyLCAwLCBzaXplb2YoT01YX0JVRkZFUkhFQURFUlRZUEUpKTsKKworICAgIGZvciAoaSA9IDA7IGkgPCBwU0VDUG9ydC0+cG9ydERlZmluaXRpb24ubkJ1ZmZlckNvdW50QWN0dWFsOyBpKyspIHsKKyAgICAgICAgaWYgKHBTRUNQb3J0LT5idWZmZXJTdGF0ZUFsbG9jYXRlW2ldID09IEJVRkZFUl9TVEFURV9GUkVFKSB7CisgICAgICAgICAgICBwU0VDUG9ydC0+YnVmZmVySGVhZGVyW2ldID0gdGVtcF9idWZmZXJIZWFkZXI7CisgICAgICAgICAgICBwU0VDUG9ydC0+YnVmZmVyU3RhdGVBbGxvY2F0ZVtpXSA9IChCVUZGRVJfU1RBVEVfQVNTSUdORUQgfCBIRUFERVJfU1RBVEVfQUxMT0NBVEVEKTsKKyAgICAgICAgICAgIElOSVRfU0VUX1NJWkVfVkVSU0lPTih0ZW1wX2J1ZmZlckhlYWRlciwgT01YX0JVRkZFUkhFQURFUlRZUEUpOworICAgICAgICAgICAgdGVtcF9idWZmZXJIZWFkZXItPnBCdWZmZXIgICAgICAgID0gcEJ1ZmZlcjsKKyAgICAgICAgICAgIHRlbXBfYnVmZmVySGVhZGVyLT5uQWxsb2NMZW4gICAgICA9IG5TaXplQnl0ZXM7CisgICAgICAgICAgICB0ZW1wX2J1ZmZlckhlYWRlci0+cEFwcFByaXZhdGUgICAgPSBwQXBwUHJpdmF0ZTsKKyAgICAgICAgICAgIGlmIChuUG9ydEluZGV4ID09IElOUFVUX1BPUlRfSU5ERVgpCisgICAgICAgICAgICAgICAgdGVtcF9idWZmZXJIZWFkZXItPm5JbnB1dFBvcnRJbmRleCA9IElOUFVUX1BPUlRfSU5ERVg7CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgdGVtcF9idWZmZXJIZWFkZXItPm5PdXRwdXRQb3J0SW5kZXggPSBPVVRQVVRfUE9SVF9JTkRFWDsKKworICAgICAgICAgICAgcFNFQ1BvcnQtPmFzc2lnbmVkQnVmZmVyTnVtKys7CisgICAgICAgICAgICBpZiAocFNFQ1BvcnQtPmFzc2lnbmVkQnVmZmVyTnVtID09IHBTRUNQb3J0LT5wb3J0RGVmaW5pdGlvbi5uQnVmZmVyQ291bnRBY3R1YWwpIHsKKyAgICAgICAgICAgICAgICBwU0VDUG9ydC0+cG9ydERlZmluaXRpb24uYlBvcHVsYXRlZCA9IE9NWF9UUlVFOworICAgICAgICAgICAgICAgIC8qIFNFQ19PU0FMX011dGV4TG9jayhwU0VDQ29tcG9uZW50LT5jb21wTXV0ZXgpOyAqLworICAgICAgICAgICAgICAgIFNFQ19PU0FMX1NlbWFwaG9yZVBvc3QocFNFQ1BvcnQtPmxvYWRlZFJlc291cmNlKTsKKyAgICAgICAgICAgICAgICAvKiBTRUNfT1NBTF9NdXRleFVubG9jayhwU0VDQ29tcG9uZW50LT5jb21wTXV0ZXgpOyAqLworICAgICAgICAgICAgfQorICAgICAgICAgICAgKnBwQnVmZmVySGRyID0gdGVtcF9idWZmZXJIZWFkZXI7CisgICAgICAgICAgICByZXQgPSBPTVhfRXJyb3JOb25lOworICAgICAgICAgICAgZ290byBFWElUOworICAgICAgICB9CisgICAgfQorCisgICAgU0VDX09TQUxfRnJlZSh0ZW1wX2J1ZmZlckhlYWRlcik7CisgICAgcmV0ID0gT01YX0Vycm9ySW5zdWZmaWNpZW50UmVzb3VyY2VzOworCitFWElUOgorICAgIEZ1bmN0aW9uT3V0KCk7CisKKyAgICByZXR1cm4gcmV0OworfQorCitPTVhfRVJST1JUWVBFIFNFQ19PTVhfQWxsb2NhdGVCdWZmZXIoCisgICAgT01YX0lOIE9NWF9IQU5ETEVUWVBFICAgICAgICAgICAgaENvbXBvbmVudCwKKyAgICBPTVhfSU5PVVQgT01YX0JVRkZFUkhFQURFUlRZUEUgKipwcEJ1ZmZlciwKKyAgICBPTVhfSU4gT01YX1UzMiAgICAgICAgICAgICAgICAgICBuUG9ydEluZGV4LAorICAgIE9NWF9JTiBPTVhfUFRSICAgICAgICAgICAgICAgICAgIHBBcHBQcml2YXRlLAorICAgIE9NWF9JTiBPTVhfVTMyICAgICAgICAgICAgICAgICAgIG5TaXplQnl0ZXMpCit7CisgICAgT01YX0VSUk9SVFlQRSAgICAgICAgICByZXQgPSBPTVhfRXJyb3JOb25lOworICAgIE9NWF9DT01QT05FTlRUWVBFICAgICAqcE9NWENvbXBvbmVudCA9IE5VTEw7CisgICAgU0VDX09NWF9CQVNFQ09NUE9ORU5UICpwU0VDQ29tcG9uZW50ID0gTlVMTDsKKyAgICBTRUNfT01YX0JBU0VQT1JUICAgICAgKnBTRUNQb3J0ID0gTlVMTDsKKyAgICBPTVhfQlVGRkVSSEVBREVSVFlQRSAgKnRlbXBfYnVmZmVySGVhZGVyID0gTlVMTDsKKyAgICBPTVhfVTggICAgICAgICAgICAgICAgKnRlbXBfYnVmZmVyID0gTlVMTDsKKyAgICBPTVhfVTMyICAgICAgICAgICAgICAgIGkgPSAwOworCisgICAgRnVuY3Rpb25JbigpOworCisgICAgaWYgKGhDb21wb25lbnQgPT0gTlVMTCkgeworICAgICAgICByZXQgPSBPTVhfRXJyb3JCYWRQYXJhbWV0ZXI7CisgICAgICAgIGdvdG8gRVhJVDsKKyAgICB9CisgICAgcE9NWENvbXBvbmVudCA9IChPTVhfQ09NUE9ORU5UVFlQRSAqKWhDb21wb25lbnQ7CisgICAgcmV0ID0gU0VDX09NWF9DaGVja19TaXplVmVyc2lvbihwT01YQ29tcG9uZW50LCBzaXplb2YoT01YX0NPTVBPTkVOVFRZUEUpKTsKKyAgICBpZiAocmV0ICE9IE9NWF9FcnJvck5vbmUpIHsKKyAgICAgICAgZ290byBFWElUOworICAgIH0KKworICAgIGlmIChwT01YQ29tcG9uZW50LT5wQ29tcG9uZW50UHJpdmF0ZSA9PSBOVUxMKSB7CisgICAgICAgIHJldCA9IE9NWF9FcnJvckJhZFBhcmFtZXRlcjsKKyAgICAgICAgZ290byBFWElUOworICAgIH0KKyAgICBwU0VDQ29tcG9uZW50ID0gKFNFQ19PTVhfQkFTRUNPTVBPTkVOVCAqKXBPTVhDb21wb25lbnQtPnBDb21wb25lbnRQcml2YXRlOworCisgICAgcFNFQ1BvcnQgPSAmcFNFQ0NvbXBvbmVudC0+cFNFQ1BvcnRbblBvcnRJbmRleF07CisgICAgaWYgKG5Qb3J0SW5kZXggPj0gcFNFQ0NvbXBvbmVudC0+cG9ydFBhcmFtLm5Qb3J0cykgeworICAgICAgICByZXQgPSBPTVhfRXJyb3JCYWRQb3J0SW5kZXg7CisgICAgICAgIGdvdG8gRVhJVDsKKyAgICB9CisvKgorICAgIGlmIChwU0VDUG9ydC0+cG9ydFN0YXRlICE9IE9NWF9TdGF0ZUlkbGUgKSB7CisgICAgICAgIHJldCA9IE9NWF9FcnJvckluY29ycmVjdFN0YXRlT3BlcmF0aW9uOworICAgICAgICBnb3RvIEVYSVQ7CisgICAgfQorKi8KKyAgICBpZiAoQ0hFQ0tfUE9SVF9UVU5ORUxFRChwU0VDUG9ydCkgJiYgQ0hFQ0tfUE9SVF9CVUZGRVJfU1VQUExJRVIocFNFQ1BvcnQpKSB7CisgICAgICAgIHJldCA9IE9NWF9FcnJvckJhZFBvcnRJbmRleDsKKyAgICAgICAgZ290byBFWElUOworICAgIH0KKworICAgIHRlbXBfYnVmZmVyID0gU0VDX09TQUxfTWFsbG9jKHNpemVvZihPTVhfVTgpICogblNpemVCeXRlcyk7CisgICAgaWYgKHRlbXBfYnVmZmVyID09IE5VTEwpIHsKKyAgICAgICAgcmV0ID0gT01YX0Vycm9ySW5zdWZmaWNpZW50UmVzb3VyY2VzOworICAgICAgICBnb3RvIEVYSVQ7CisgICAgfQorCisgICAgdGVtcF9idWZmZXJIZWFkZXIgPSAoT01YX0JVRkZFUkhFQURFUlRZUEUgKilTRUNfT1NBTF9NYWxsb2Moc2l6ZW9mKE9NWF9CVUZGRVJIRUFERVJUWVBFKSk7CisgICAgaWYgKHRlbXBfYnVmZmVySGVhZGVyID09IE5VTEwpIHsKKyAgICAgICAgU0VDX09TQUxfRnJlZSh0ZW1wX2J1ZmZlcik7CisgICAgICAgIHRlbXBfYnVmZmVyID0gTlVMTDsKKyAgICAgICAgcmV0ID0gT01YX0Vycm9ySW5zdWZmaWNpZW50UmVzb3VyY2VzOworICAgICAgICBnb3RvIEVYSVQ7CisgICAgfQorICAgIFNFQ19PU0FMX01lbXNldCh0ZW1wX2J1ZmZlckhlYWRlciwgMCwgc2l6ZW9mKE9NWF9CVUZGRVJIRUFERVJUWVBFKSk7CisKKyAgICBmb3IgKGkgPSAwOyBpIDwgcFNFQ1BvcnQtPnBvcnREZWZpbml0aW9uLm5CdWZmZXJDb3VudEFjdHVhbDsgaSsrKSB7CisgICAgICAgIGlmIChwU0VDUG9ydC0+YnVmZmVyU3RhdGVBbGxvY2F0ZVtpXSA9PSBCVUZGRVJfU1RBVEVfRlJFRSkgeworICAgICAgICAgICAgcFNFQ1BvcnQtPmJ1ZmZlckhlYWRlcltpXSA9IHRlbXBfYnVmZmVySGVhZGVyOworICAgICAgICAgICAgcFNFQ1BvcnQtPmJ1ZmZlclN0YXRlQWxsb2NhdGVbaV0gPSAoQlVGRkVSX1NUQVRFX0FMTE9DQVRFRCB8IEhFQURFUl9TVEFURV9BTExPQ0FURUQpOworICAgICAgICAgICAgSU5JVF9TRVRfU0laRV9WRVJTSU9OKHRlbXBfYnVmZmVySGVhZGVyLCBPTVhfQlVGRkVSSEVBREVSVFlQRSk7CisgICAgICAgICAgICB0ZW1wX2J1ZmZlckhlYWRlci0+cEJ1ZmZlciAgICAgICAgPSB0ZW1wX2J1ZmZlcjsKKyAgICAgICAgICAgIHRlbXBfYnVmZmVySGVhZGVyLT5uQWxsb2NMZW4gICAgICA9IG5TaXplQnl0ZXM7CisgICAgICAgICAgICB0ZW1wX2J1ZmZlckhlYWRlci0+cEFwcFByaXZhdGUgICAgPSBwQXBwUHJpdmF0ZTsKKyAgICAgICAgICAgIGlmIChuUG9ydEluZGV4ID09IElOUFVUX1BPUlRfSU5ERVgpCisgICAgICAgICAgICAgICAgdGVtcF9idWZmZXJIZWFkZXItPm5JbnB1dFBvcnRJbmRleCA9IElOUFVUX1BPUlRfSU5ERVg7CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgdGVtcF9idWZmZXJIZWFkZXItPm5PdXRwdXRQb3J0SW5kZXggPSBPVVRQVVRfUE9SVF9JTkRFWDsKKyAgICAgICAgICAgIHBTRUNQb3J0LT5hc3NpZ25lZEJ1ZmZlck51bSsrOworICAgICAgICAgICAgaWYgKHBTRUNQb3J0LT5hc3NpZ25lZEJ1ZmZlck51bSA9PSBwU0VDUG9ydC0+cG9ydERlZmluaXRpb24ubkJ1ZmZlckNvdW50QWN0dWFsKSB7CisgICAgICAgICAgICAgICAgcFNFQ1BvcnQtPnBvcnREZWZpbml0aW9uLmJQb3B1bGF0ZWQgPSBPTVhfVFJVRTsKKyAgICAgICAgICAgICAgICAvKiBTRUNfT1NBTF9NdXRleExvY2socFNFQ0NvbXBvbmVudC0+Y29tcE11dGV4KTsgKi8KKyAgICAgICAgICAgICAgICBTRUNfT1NBTF9TZW1hcGhvcmVQb3N0KHBTRUNQb3J0LT5sb2FkZWRSZXNvdXJjZSk7CisgICAgICAgICAgICAgICAgLyogU0VDX09TQUxfTXV0ZXhVbmxvY2socFNFQ0NvbXBvbmVudC0+Y29tcE11dGV4KTsgKi8KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgICpwcEJ1ZmZlciA9IHRlbXBfYnVmZmVySGVhZGVyOworICAgICAgICAgICAgcmV0ID0gT01YX0Vycm9yTm9uZTsKKyAgICAgICAgICAgIGdvdG8gRVhJVDsKKyAgICAgICAgfQorICAgIH0KKworICAgIFNFQ19PU0FMX0ZyZWUodGVtcF9idWZmZXJIZWFkZXIpOworICAgIFNFQ19PU0FMX0ZyZWUodGVtcF9idWZmZXIpOworICAgIHJldCA9IE9NWF9FcnJvckluc3VmZmljaWVudFJlc291cmNlczsKKworRVhJVDoKKyAgICBGdW5jdGlvbk91dCgpOworCisgICAgcmV0dXJuIHJldDsKK30KKworT01YX0VSUk9SVFlQRSBTRUNfT01YX0ZyZWVCdWZmZXIoCisgICAgT01YX0lOIE9NWF9IQU5ETEVUWVBFIGhDb21wb25lbnQsCisgICAgT01YX0lOIE9NWF9VMzIgICAgICAgIG5Qb3J0SW5kZXgsCisgICAgT01YX0lOIE9NWF9CVUZGRVJIRUFERVJUWVBFICpwQnVmZmVySGRyKQoreworICAgIE9NWF9FUlJPUlRZUEUgICAgICAgICAgcmV0ID0gT01YX0Vycm9yTm9uZTsKKyAgICBPTVhfQ09NUE9ORU5UVFlQRSAgICAgKnBPTVhDb21wb25lbnQgPSBOVUxMOworICAgIFNFQ19PTVhfQkFTRUNPTVBPTkVOVCAqcFNFQ0NvbXBvbmVudCA9IE5VTEw7CisgICAgU0VDX09NWF9CQVNFUE9SVCAgICAgICpwU0VDUG9ydCA9IE5VTEw7CisgICAgT01YX0JVRkZFUkhFQURFUlRZUEUgICp0ZW1wX2J1ZmZlckhlYWRlciA9IE5VTEw7CisgICAgT01YX1U4ICAgICAgICAgICAgICAgICp0ZW1wX2J1ZmZlciA9IE5VTEw7CisgICAgT01YX1UzMiAgICAgICAgICAgICAgICBpID0gMDsKKworICAgIEZ1bmN0aW9uSW4oKTsKKworICAgIGlmIChoQ29tcG9uZW50ID09IE5VTEwpIHsKKyAgICAgICAgcmV0ID0gT01YX0Vycm9yQmFkUGFyYW1ldGVyOworICAgICAgICBnb3RvIEVYSVQ7CisgICAgfQorICAgIHBPTVhDb21wb25lbnQgPSAoT01YX0NPTVBPTkVOVFRZUEUgKiloQ29tcG9uZW50OworICAgIHJldCA9IFNFQ19PTVhfQ2hlY2tfU2l6ZVZlcnNpb24ocE9NWENvbXBvbmVudCwgc2l6ZW9mKE9NWF9DT01QT05FTlRUWVBFKSk7CisgICAgaWYgKHJldCAhPSBPTVhfRXJyb3JOb25lKSB7CisgICAgICAgIGdvdG8gRVhJVDsKKyAgICB9CisKKyAgICBpZiAocE9NWENvbXBvbmVudC0+cENvbXBvbmVudFByaXZhdGUgPT0gTlVMTCkgeworICAgICAgICByZXQgPSBPTVhfRXJyb3JCYWRQYXJhbWV0ZXI7CisgICAgICAgIGdvdG8gRVhJVDsKKyAgICB9CisgICAgcFNFQ0NvbXBvbmVudCA9IChTRUNfT01YX0JBU0VDT01QT05FTlQgKilwT01YQ29tcG9uZW50LT5wQ29tcG9uZW50UHJpdmF0ZTsKKyAgICBwU0VDUG9ydCA9ICZwU0VDQ29tcG9uZW50LT5wU0VDUG9ydFtuUG9ydEluZGV4XTsKKworICAgIGlmIChDSEVDS19QT1JUX1RVTk5FTEVEKHBTRUNQb3J0KSAmJiBDSEVDS19QT1JUX0JVRkZFUl9TVVBQTElFUihwU0VDUG9ydCkpIHsKKyAgICAgICAgcmV0ID0gT01YX0Vycm9yQmFkUG9ydEluZGV4OworICAgICAgICBnb3RvIEVYSVQ7CisgICAgfQorCisgICAgaWYgKChwU0VDUG9ydC0+cG9ydFN0YXRlICE9IE9NWF9TdGF0ZUxvYWRlZCkgJiYgKHBTRUNQb3J0LT5wb3J0U3RhdGUgIT0gT01YX1N0YXRlSW52YWxpZCkpIHsKKyAgICAgICAgKCoocFNFQ0NvbXBvbmVudC0+cENhbGxiYWNrcy0+RXZlbnRIYW5kbGVyKSkgKHBPTVhDb21wb25lbnQsCisgICAgICAgICAgICAgICAgICAgICAgICBwU0VDQ29tcG9uZW50LT5jYWxsYmFja0RhdGEsCisgICAgICAgICAgICAgICAgICAgICAgICAoT01YX1UzMilPTVhfRXZlbnRFcnJvciwKKyAgICAgICAgICAgICAgICAgICAgICAgIChPTVhfVTMyKU9NWF9FcnJvclBvcnRVbnBvcHVsYXRlZCwKKyAgICAgICAgICAgICAgICAgICAgICAgIG5Qb3J0SW5kZXgsIE5VTEwpOworICAgIH0KKworICAgIGZvciAoaSA9IDA7IGkgPCBwU0VDUG9ydC0+cG9ydERlZmluaXRpb24ubkJ1ZmZlckNvdW50QWN0dWFsOyBpKyspIHsKKyAgICAgICAgaWYgKCgocFNFQ1BvcnQtPmJ1ZmZlclN0YXRlQWxsb2NhdGVbaV0gfCBCVUZGRVJfU1RBVEVfRlJFRSkgIT0gMCkgJiYgKHBTRUNQb3J0LT5idWZmZXJIZWFkZXJbaV0gIT0gTlVMTCkpIHsKKyAgICAgICAgICAgIGlmIChwU0VDUG9ydC0+YnVmZmVySGVhZGVyW2ldLT5wQnVmZmVyID09IHBCdWZmZXJIZHItPnBCdWZmZXIpIHsKKyAgICAgICAgICAgICAgICBpZiAocFNFQ1BvcnQtPmJ1ZmZlclN0YXRlQWxsb2NhdGVbaV0gJiBCVUZGRVJfU1RBVEVfQUxMT0NBVEVEKSB7CisgICAgICAgICAgICAgICAgICAgIFNFQ19PU0FMX0ZyZWUocFNFQ1BvcnQtPmJ1ZmZlckhlYWRlcltpXS0+cEJ1ZmZlcik7CisgICAgICAgICAgICAgICAgICAgIHBTRUNQb3J0LT5idWZmZXJIZWFkZXJbaV0tPnBCdWZmZXIgPSBOVUxMOworICAgICAgICAgICAgICAgICAgICBwQnVmZmVySGRyLT5wQnVmZmVyID0gTlVMTDsKKyAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKHBTRUNQb3J0LT5idWZmZXJTdGF0ZUFsbG9jYXRlW2ldICYgQlVGRkVSX1NUQVRFX0FTU0lHTkVEKSB7CisgICAgICAgICAgICAgICAgICAgIDsgLyogTm9uZSovCisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIHBTRUNQb3J0LT5hc3NpZ25lZEJ1ZmZlck51bS0tOworICAgICAgICAgICAgICAgIGlmIChwU0VDUG9ydC0+YnVmZmVyU3RhdGVBbGxvY2F0ZVtpXSAmIEhFQURFUl9TVEFURV9BTExPQ0FURUQpIHsKKyAgICAgICAgICAgICAgICAgICAgU0VDX09TQUxfRnJlZShwU0VDUG9ydC0+YnVmZmVySGVhZGVyW2ldKTsKKyAgICAgICAgICAgICAgICAgICAgcFNFQ1BvcnQtPmJ1ZmZlckhlYWRlcltpXSA9IE5VTEw7CisgICAgICAgICAgICAgICAgICAgIHBCdWZmZXJIZHIgPSBOVUxMOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBwU0VDUG9ydC0+YnVmZmVyU3RhdGVBbGxvY2F0ZVtpXSA9IEJVRkZFUl9TVEFURV9GUkVFOworICAgICAgICAgICAgICAgIHJldCA9IE9NWF9FcnJvck5vbmU7CisgICAgICAgICAgICAgICAgZ290byBFWElUOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCitFWElUOgorICAgIGlmIChyZXQgPT0gT01YX0Vycm9yTm9uZSkgeworICAgICAgICBpZiAocFNFQ1BvcnQtPmFzc2lnbmVkQnVmZmVyTnVtID09IDApIHsKKyAgICAgICAgICAgIFNFQ19PU0FMX0xvZyhTRUNfTE9HX1RSQUNFLCAicFNFQ1BvcnQtPnVubG9hZGVkUmVzb3VyY2Ugc2lnbmFsIHNldCIpOworICAgICAgICAgICAgLyogU0VDX09TQUxfTXV0ZXhMb2NrKHBTRUNDb21wb25lbnQtPmNvbXBNdXRleCk7ICovCisgICAgICAgICAgICBTRUNfT1NBTF9TZW1hcGhvcmVQb3N0KHBTRUNQb3J0LT51bmxvYWRlZFJlc291cmNlKTsKKyAgICAgICAgICAgIC8qIFNFQ19PU0FMX011dGV4VW5sb2NrKHBTRUNDb21wb25lbnQtPmNvbXBNdXRleCk7ICovCisgICAgICAgICAgICBwU0VDUG9ydC0+cG9ydERlZmluaXRpb24uYlBvcHVsYXRlZCA9IE9NWF9GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIEZ1bmN0aW9uT3V0KCk7CisKKyAgICByZXR1cm4gcmV0OworfQorCitPTVhfRVJST1JUWVBFIFNFQ19PTVhfQWxsb2NhdGVUdW5uZWxCdWZmZXIoU0VDX09NWF9CQVNFUE9SVCAqcE9NWEJhc2VQb3J0LCBPTVhfVTMyIG5Qb3J0SW5kZXgpCit7CisgICAgT01YX0VSUk9SVFlQRSAgICAgICAgICAgICAgICAgcmV0ID0gT01YX0Vycm9yTm9uZTsKKyAgICBTRUNfT01YX0JBU0VQT1JUICAgICAgICAgICAgICpwU0VDUG9ydCA9IE5VTEw7CisgICAgT01YX0JVRkZFUkhFQURFUlRZUEUgICAgICAgICAqdGVtcF9idWZmZXJIZWFkZXIgPSBOVUxMOworICAgIE9NWF9VOCAgICAgICAgICAgICAgICAgICAgICAgKnRlbXBfYnVmZmVyID0gTlVMTDsKKyAgICBPTVhfVTMyICAgICAgICAgICAgICAgICAgICAgICBidWZmZXJTaXplID0gMDsKKyAgICBPTVhfUEFSQU1fUE9SVERFRklOSVRJT05UWVBFICBwb3J0RGVmaW5pdGlvbjsKKworICAgIHJldCA9IE9NWF9FcnJvclR1bm5lbGluZ1Vuc3VwcG9ydGVkOworRVhJVDoKKyAgICByZXR1cm4gcmV0OworfQorCitPTVhfRVJST1JUWVBFIFNFQ19PTVhfRnJlZVR1bm5lbEJ1ZmZlcihTRUNfT01YX0JBU0VQT1JUICpwT01YQmFzZVBvcnQsIE9NWF9VMzIgblBvcnRJbmRleCkKK3sKKyAgICBPTVhfRVJST1JUWVBFIHJldCA9IE9NWF9FcnJvck5vbmU7CisgICAgU0VDX09NWF9CQVNFUE9SVCogcFNFQ1BvcnQgPSBOVUxMOworICAgIE9NWF9CVUZGRVJIRUFERVJUWVBFKiB0ZW1wX2J1ZmZlckhlYWRlciA9IE5VTEw7CisgICAgT01YX1U4ICp0ZW1wX2J1ZmZlciA9IE5VTEw7CisgICAgT01YX1UzMiBidWZmZXJTaXplID0gMDsKKyAgICBPTVhfUEFSQU1fUE9SVERFRklOSVRJT05UWVBFIHBvcnREZWZpbml0aW9uOworCisgICAgcmV0ID0gT01YX0Vycm9yVHVubmVsaW5nVW5zdXBwb3J0ZWQ7CitFWElUOgorICAgIHJldHVybiByZXQ7Cit9CisKK09NWF9FUlJPUlRZUEUgU0VDX09NWF9Db21wb25lbnRUdW5uZWxSZXF1ZXN0KAorICAgIE9NWF9JTiBPTVhfSEFORExFVFlQRSBoQ29tcCwKKyAgICBPTVhfSU4gT01YX1UzMiAgICAgICAgblBvcnQsCisgICAgT01YX0lOIE9NWF9IQU5ETEVUWVBFIGhUdW5uZWxlZENvbXAsCisgICAgT01YX0lOIE9NWF9VMzIgICAgICAgIG5UdW5uZWxlZFBvcnQsCisgICAgT01YX0lOT1VUIE9NWF9UVU5ORUxTRVRVUFRZUEUgKnBUdW5uZWxTZXR1cCkKK3sKKyAgICBPTVhfRVJST1JUWVBFIHJldCA9IE9NWF9FcnJvck5vbmU7CisKKyAgICByZXQgPSBPTVhfRXJyb3JUdW5uZWxpbmdVbnN1cHBvcnRlZDsKK0VYSVQ6CisgICAgcmV0dXJuIHJldDsKK30KKworT01YX0JPT0wgU0VDX0NoZWNrX0J1ZmZlclByb2Nlc3NfU3RhdGUoU0VDX09NWF9CQVNFQ09NUE9ORU5UICpwU0VDQ29tcG9uZW50KQoreworICAgIGlmICgocFNFQ0NvbXBvbmVudC0+Y3VycmVudFN0YXRlID09IE9NWF9TdGF0ZUV4ZWN1dGluZykgJiYKKyAgICAgICAgKHBTRUNDb21wb25lbnQtPnBTRUNQb3J0W0lOUFVUX1BPUlRfSU5ERVhdLnBvcnRTdGF0ZSA9PSBPTVhfU3RhdGVJZGxlKSAmJgorICAgICAgICAocFNFQ0NvbXBvbmVudC0+cFNFQ1BvcnRbT1VUUFVUX1BPUlRfSU5ERVhdLnBvcnRTdGF0ZSA9PSBPTVhfU3RhdGVJZGxlKSAmJgorICAgICAgICAocFNFQ0NvbXBvbmVudC0+dHJhbnNpZW50U3RhdGUgIT0gU0VDX09NWF9UcmFuc1N0YXRlRXhlY3V0aW5nVG9JZGxlKSAmJgorICAgICAgICAocFNFQ0NvbXBvbmVudC0+dHJhbnNpZW50U3RhdGUgIT0gU0VDX09NWF9UcmFuc1N0YXRlSWRsZVRvRXhlY3V0aW5nKSkKKyAgICAgICAgcmV0dXJuIE9NWF9UUlVFOworICAgIGVsc2UKKyAgICAgICAgcmV0dXJuIE9NWF9GQUxTRTsKK30KKworc3RhdGljIE9NWF9FUlJPUlRZUEUgU0VDX0lucHV0QnVmZmVyUmV0dXJuKE9NWF9DT01QT05FTlRUWVBFICpwT01YQ29tcG9uZW50KQoreworICAgIE9NWF9FUlJPUlRZUEUgICAgICAgICAgcmV0ID0gT01YX0Vycm9yTm9uZTsKKyAgICBTRUNfT01YX0JBU0VDT01QT05FTlQgKnBTRUNDb21wb25lbnQgPSAoU0VDX09NWF9CQVNFQ09NUE9ORU5UICopcE9NWENvbXBvbmVudC0+cENvbXBvbmVudFByaXZhdGU7CisgICAgU0VDX09NWF9CQVNFUE9SVCAgICAgICpzZWNPTVhJbnB1dFBvcnQgPSAmcFNFQ0NvbXBvbmVudC0+cFNFQ1BvcnRbSU5QVVRfUE9SVF9JTkRFWF07CisgICAgU0VDX09NWF9CQVNFUE9SVCAgICAgICpzZWNPTVhPdXRwdXRQb3J0ID0gJnBTRUNDb21wb25lbnQtPnBTRUNQb3J0W09VVFBVVF9QT1JUX0lOREVYXTsKKyAgICBTRUNfT01YX0RBVEFCVUZGRVIgICAgKmRhdGFCdWZmZXIgPSAmcFNFQ0NvbXBvbmVudC0+c2VjRGF0YUJ1ZmZlcltJTlBVVF9QT1JUX0lOREVYXTsKKyAgICBPTVhfQlVGRkVSSEVBREVSVFlQRSAgKmJ1ZmZlckhlYWRlciA9IGRhdGFCdWZmZXItPmJ1ZmZlckhlYWRlcjsKKworICAgIEZ1bmN0aW9uSW4oKTsKKworICAgIGlmIChidWZmZXJIZWFkZXIgIT0gTlVMTCkgeworICAgICAgICBpZiAoc2VjT01YSW5wdXRQb3J0LT5tYXJrVHlwZS5oTWFya1RhcmdldENvbXBvbmVudCAhPSBOVUxMICkgeworICAgICAgICAgICAgYnVmZmVySGVhZGVyLT5oTWFya1RhcmdldENvbXBvbmVudCAgICAgID0gc2VjT01YSW5wdXRQb3J0LT5tYXJrVHlwZS5oTWFya1RhcmdldENvbXBvbmVudDsKKyAgICAgICAgICAgIGJ1ZmZlckhlYWRlci0+cE1hcmtEYXRhICAgICAgICAgICAgICAgICA9IHNlY09NWElucHV0UG9ydC0+bWFya1R5cGUucE1hcmtEYXRhOworICAgICAgICAgICAgc2VjT01YSW5wdXRQb3J0LT5tYXJrVHlwZS5oTWFya1RhcmdldENvbXBvbmVudCA9IE5VTEw7CisgICAgICAgICAgICBzZWNPTVhJbnB1dFBvcnQtPm1hcmtUeXBlLnBNYXJrRGF0YSA9IE5VTEw7CisgICAgICAgIH0KKworICAgICAgICBpZiAoYnVmZmVySGVhZGVyLT5oTWFya1RhcmdldENvbXBvbmVudCAhPSBOVUxMKSB7CisgICAgICAgICAgICBpZiAoYnVmZmVySGVhZGVyLT5oTWFya1RhcmdldENvbXBvbmVudCA9PSBwT01YQ29tcG9uZW50KSB7CisgICAgICAgICAgICAgICAgcFNFQ0NvbXBvbmVudC0+cENhbGxiYWNrcy0+RXZlbnRIYW5kbGVyKHBPTVhDb21wb25lbnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBTRUNDb21wb25lbnQtPmNhbGxiYWNrRGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT01YX0V2ZW50TWFyaywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMCwgMCwgYnVmZmVySGVhZGVyLT5wTWFya0RhdGEpOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBwU0VDQ29tcG9uZW50LT5wcm9wYWdhdGVNYXJrVHlwZS5oTWFya1RhcmdldENvbXBvbmVudCA9IGJ1ZmZlckhlYWRlci0+aE1hcmtUYXJnZXRDb21wb25lbnQ7CisgICAgICAgICAgICAgICAgcFNFQ0NvbXBvbmVudC0+cHJvcGFnYXRlTWFya1R5cGUucE1hcmtEYXRhID0gYnVmZmVySGVhZGVyLT5wTWFya0RhdGE7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBpZiAoQ0hFQ0tfUE9SVF9UVU5ORUxFRChzZWNPTVhJbnB1dFBvcnQpKSB7CisgICAgICAgICAgICBPTVhfRmlsbFRoaXNCdWZmZXIoc2VjT01YSW5wdXRQb3J0LT50dW5uZWxlZENvbXBvbmVudCwgYnVmZmVySGVhZGVyKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIGJ1ZmZlckhlYWRlci0+bkZpbGxlZExlbiA9IDA7CisgICAgICAgICAgICBwU0VDQ29tcG9uZW50LT5wQ2FsbGJhY2tzLT5FbXB0eUJ1ZmZlckRvbmUocE9NWENvbXBvbmVudCwgcFNFQ0NvbXBvbmVudC0+Y2FsbGJhY2tEYXRhLCBidWZmZXJIZWFkZXIpOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChwU0VDQ29tcG9uZW50LT5jdXJyZW50U3RhdGUgPT0gT01YX1N0YXRlUGF1c2UpICYmCisgICAgICAgICgoIUNIRUNLX1BPUlRfQkVJTkdfRkxVU0hFRChzZWNPTVhJbnB1dFBvcnQpICYmICFDSEVDS19QT1JUX0JFSU5HX0ZMVVNIRUQoc2VjT01YT3V0cHV0UG9ydCkpKSkgeworICAgICAgICBTRUNfT1NBTF9TaWduYWxXYWl0KHBTRUNDb21wb25lbnQtPnBhdXNlRXZlbnQsIERFRl9NQVhfV0FJVF9USU1FKTsKKyAgICAgICAgU0VDX09TQUxfU2lnbmFsUmVzZXQocFNFQ0NvbXBvbmVudC0+cGF1c2VFdmVudCk7CisgICAgfQorCisgICAgZGF0YUJ1ZmZlci0+ZGF0YVZhbGlkICAgICA9IE9NWF9GQUxTRTsKKyAgICBkYXRhQnVmZmVyLT5kYXRhTGVuICAgICAgID0gMDsKKyAgICBkYXRhQnVmZmVyLT5yZW1haW5EYXRhTGVuID0gMDsKKyAgICBkYXRhQnVmZmVyLT51c2VkRGF0YUxlbiAgID0gMDsKKyAgICBkYXRhQnVmZmVyLT5idWZmZXJIZWFkZXIgID0gTlVMTDsKKyAgICBkYXRhQnVmZmVyLT5uRmxhZ3MgICAgICAgID0gMDsKKyAgICBkYXRhQnVmZmVyLT50aW1lU3RhbXAgICAgID0gMDsKKworRVhJVDoKKyAgICBGdW5jdGlvbk91dCgpOworCisgICAgcmV0dXJuIHJldDsKK30KKworT01YX0VSUk9SVFlQRSBTRUNfSW5wdXRCdWZmZXJHZXRRdWV1ZShTRUNfT01YX0JBU0VDT01QT05FTlQgKnBTRUNDb21wb25lbnQpCit7CisgICAgT01YX0VSUk9SVFlQRSAgICAgICByZXQgPSBPTVhfRXJyb3JOb25lOworICAgIFNFQ19PTVhfQkFTRVBPUlQgICAqcFNFQ1BvcnQgPSBOVUxMOworICAgIFNFQ19PTVhfREFUQUJVRkZFUiAqZGF0YUJ1ZmZlciA9IE5VTEw7CisgICAgU0VDX09NWF9NRVNTQUdFKiAgICBtZXNzYWdlID0gTlVMTDsKKyAgICBTRUNfT01YX0RBVEFCVUZGRVIgKmlucHV0VXNlQnVmZmVyID0gJnBTRUNDb21wb25lbnQtPnNlY0RhdGFCdWZmZXJbSU5QVVRfUE9SVF9JTkRFWF07CisKKyAgICBGdW5jdGlvbkluKCk7CisKKyAgICBwU0VDUG9ydD0gJnBTRUNDb21wb25lbnQtPnBTRUNQb3J0W0lOUFVUX1BPUlRfSU5ERVhdOworICAgIGRhdGFCdWZmZXIgPSAmcFNFQ0NvbXBvbmVudC0+c2VjRGF0YUJ1ZmZlcltJTlBVVF9QT1JUX0lOREVYXTsKKworICAgIGlmIChwU0VDQ29tcG9uZW50LT5jdXJyZW50U3RhdGUgIT0gT01YX1N0YXRlRXhlY3V0aW5nKSB7CisgICAgICAgIHJldCA9IE9NWF9FcnJvclVuZGVmaW5lZDsKKyAgICAgICAgZ290byBFWElUOworICAgIH0gZWxzZSB7CisgICAgICAgIFNFQ19PU0FMX1NlbWFwaG9yZVdhaXQocFNFQ1BvcnQtPmJ1ZmZlclNlbUlEKTsKKyAgICAgICAgU0VDX09TQUxfTXV0ZXhMb2NrKGlucHV0VXNlQnVmZmVyLT5idWZmZXJNdXRleCk7CisgICAgICAgIGlmIChkYXRhQnVmZmVyLT5kYXRhVmFsaWQgIT0gT01YX1RSVUUpIHsKKyAgICAgICAgICAgIG1lc3NhZ2UgPSAoU0VDX09NWF9NRVNTQUdFICopU0VDX09TQUxfRGVxdWV1ZSgmcFNFQ1BvcnQtPmJ1ZmZlclEpOworICAgICAgICAgICAgaWYgKG1lc3NhZ2UgPT0gTlVMTCkgeworICAgICAgICAgICAgICAgIHJldCA9IE9NWF9FcnJvclVuZGVmaW5lZDsKKyAgICAgICAgICAgICAgICBTRUNfT1NBTF9NdXRleFVubG9jayhpbnB1dFVzZUJ1ZmZlci0+YnVmZmVyTXV0ZXgpOworICAgICAgICAgICAgICAgIGdvdG8gRVhJVDsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgZGF0YUJ1ZmZlci0+YnVmZmVySGVhZGVyID0gKE9NWF9CVUZGRVJIRUFERVJUWVBFICopKG1lc3NhZ2UtPnBDbWREYXRhKTsKKyAgICAgICAgICAgIGRhdGFCdWZmZXItPmFsbG9jU2l6ZSA9IGRhdGFCdWZmZXItPmJ1ZmZlckhlYWRlci0+bkFsbG9jTGVuOworICAgICAgICAgICAgZGF0YUJ1ZmZlci0+ZGF0YUxlbiA9IGRhdGFCdWZmZXItPmJ1ZmZlckhlYWRlci0+bkZpbGxlZExlbjsKKyAgICAgICAgICAgIGRhdGFCdWZmZXItPnJlbWFpbkRhdGFMZW4gPSBkYXRhQnVmZmVyLT5kYXRhTGVuOworICAgICAgICAgICAgZGF0YUJ1ZmZlci0+dXNlZERhdGFMZW4gPSAwOyAvL2RhdGFCdWZmZXItPmJ1ZmZlckhlYWRlci0+bk9mZnNldDsKKyAgICAgICAgICAgIGRhdGFCdWZmZXItPmRhdGFWYWxpZCA9IE9NWF9UUlVFOworICAgICAgICAgICAgZGF0YUJ1ZmZlci0+bkZsYWdzID0gZGF0YUJ1ZmZlci0+YnVmZmVySGVhZGVyLT5uRmxhZ3M7CisgICAgICAgICAgICBkYXRhQnVmZmVyLT50aW1lU3RhbXAgPSBkYXRhQnVmZmVyLT5idWZmZXJIZWFkZXItPm5UaW1lU3RhbXA7CisgICAgICAgICAgICBwU0VDQ29tcG9uZW50LT5wcm9jZXNzRGF0YVtJTlBVVF9QT1JUX0lOREVYXS5kYXRhQnVmZmVyID0gZGF0YUJ1ZmZlci0+YnVmZmVySGVhZGVyLT5wQnVmZmVyOworICAgICAgICAgICAgcFNFQ0NvbXBvbmVudC0+cHJvY2Vzc0RhdGFbSU5QVVRfUE9SVF9JTkRFWF0uYWxsb2NTaXplID0gZGF0YUJ1ZmZlci0+YnVmZmVySGVhZGVyLT5uQWxsb2NMZW47CisgICAgICAgICAgICBTRUNfT1NBTF9GcmVlKG1lc3NhZ2UpOworICAgICAgICB9CisgICAgICAgIFNFQ19PU0FMX011dGV4VW5sb2NrKGlucHV0VXNlQnVmZmVyLT5idWZmZXJNdXRleCk7CisgICAgICAgIHJldCA9IE9NWF9FcnJvck5vbmU7CisgICAgfQorRVhJVDoKKyAgICBGdW5jdGlvbk91dCgpOworCisgICAgcmV0dXJuIHJldDsKK30KKworc3RhdGljIE9NWF9FUlJPUlRZUEUgU0VDX091dHB1dEJ1ZmZlclJldHVybihPTVhfQ09NUE9ORU5UVFlQRSAqcE9NWENvbXBvbmVudCkKK3sKKyAgICBPTVhfRVJST1JUWVBFICAgICAgICAgIHJldCA9IE9NWF9FcnJvck5vbmU7CisgICAgU0VDX09NWF9CQVNFQ09NUE9ORU5UICpwU0VDQ29tcG9uZW50ID0gKFNFQ19PTVhfQkFTRUNPTVBPTkVOVCAqKXBPTVhDb21wb25lbnQtPnBDb21wb25lbnRQcml2YXRlOworICAgIFNFQ19PTVhfQkFTRVBPUlQgICAgICAqc2VjT01YSW5wdXRQb3J0ID0gJnBTRUNDb21wb25lbnQtPnBTRUNQb3J0W0lOUFVUX1BPUlRfSU5ERVhdOworICAgIFNFQ19PTVhfQkFTRVBPUlQgICAgICAqc2VjT01YT3V0cHV0UG9ydCA9ICZwU0VDQ29tcG9uZW50LT5wU0VDUG9ydFtPVVRQVVRfUE9SVF9JTkRFWF07CisgICAgU0VDX09NWF9EQVRBQlVGRkVSICAgICpkYXRhQnVmZmVyID0gJnBTRUNDb21wb25lbnQtPnNlY0RhdGFCdWZmZXJbT1VUUFVUX1BPUlRfSU5ERVhdOworICAgIE9NWF9CVUZGRVJIRUFERVJUWVBFICAqYnVmZmVySGVhZGVyID0gZGF0YUJ1ZmZlci0+YnVmZmVySGVhZGVyOworCisgICAgRnVuY3Rpb25JbigpOworCisgICAgaWYgKGJ1ZmZlckhlYWRlciAhPSBOVUxMKSB7CisgICAgICAgIGJ1ZmZlckhlYWRlci0+bkZpbGxlZExlbiA9IGRhdGFCdWZmZXItPnJlbWFpbkRhdGFMZW47CisgICAgICAgIGJ1ZmZlckhlYWRlci0+bk9mZnNldCAgICA9IDA7CisgICAgICAgIGJ1ZmZlckhlYWRlci0+bkZsYWdzICAgICA9IGRhdGFCdWZmZXItPm5GbGFnczsKKyAgICAgICAgYnVmZmVySGVhZGVyLT5uVGltZVN0YW1wID0gZGF0YUJ1ZmZlci0+dGltZVN0YW1wOworCisgICAgICAgIGlmIChwU0VDQ29tcG9uZW50LT5wcm9wYWdhdGVNYXJrVHlwZS5oTWFya1RhcmdldENvbXBvbmVudCAhPSBOVUxMKSB7CisgICAgICAgICAgICBidWZmZXJIZWFkZXItPmhNYXJrVGFyZ2V0Q29tcG9uZW50ID0gcFNFQ0NvbXBvbmVudC0+cHJvcGFnYXRlTWFya1R5cGUuaE1hcmtUYXJnZXRDb21wb25lbnQ7CisgICAgICAgICAgICBidWZmZXJIZWFkZXItPnBNYXJrRGF0YSA9IHBTRUNDb21wb25lbnQtPnByb3BhZ2F0ZU1hcmtUeXBlLnBNYXJrRGF0YTsKKyAgICAgICAgICAgIHBTRUNDb21wb25lbnQtPnByb3BhZ2F0ZU1hcmtUeXBlLmhNYXJrVGFyZ2V0Q29tcG9uZW50ID0gTlVMTDsKKyAgICAgICAgICAgIHBTRUNDb21wb25lbnQtPnByb3BhZ2F0ZU1hcmtUeXBlLnBNYXJrRGF0YSA9IE5VTEw7CisgICAgICAgIH0KKworICAgICAgICBpZiAoYnVmZmVySGVhZGVyLT5uRmxhZ3MgJiBPTVhfQlVGRkVSRkxBR19FT1MpIHsKKyAgICAgICAgICAgIHBTRUNDb21wb25lbnQtPnBDYWxsYmFja3MtPkV2ZW50SGFuZGxlcihwT01YQ29tcG9uZW50LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBTRUNDb21wb25lbnQtPmNhbGxiYWNrRGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBPTVhfRXZlbnRCdWZmZXJGbGFnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9VVFBVVF9QT1JUX0lOREVYLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJ1ZmZlckhlYWRlci0+bkZsYWdzLCBOVUxMKTsKKyAgICAgICAgfQorCisgICAgICAgIGlmIChDSEVDS19QT1JUX1RVTk5FTEVEKHNlY09NWE91dHB1dFBvcnQpKSB7CisgICAgICAgICAgICBPTVhfRW1wdHlUaGlzQnVmZmVyKHNlY09NWE91dHB1dFBvcnQtPnR1bm5lbGVkQ29tcG9uZW50LCBidWZmZXJIZWFkZXIpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgcFNFQ0NvbXBvbmVudC0+cENhbGxiYWNrcy0+RmlsbEJ1ZmZlckRvbmUocE9NWENvbXBvbmVudCwgcFNFQ0NvbXBvbmVudC0+Y2FsbGJhY2tEYXRhLCBidWZmZXJIZWFkZXIpOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChwU0VDQ29tcG9uZW50LT5jdXJyZW50U3RhdGUgPT0gT01YX1N0YXRlUGF1c2UpICYmCisgICAgICAgICgoIUNIRUNLX1BPUlRfQkVJTkdfRkxVU0hFRChzZWNPTVhJbnB1dFBvcnQpICYmICFDSEVDS19QT1JUX0JFSU5HX0ZMVVNIRUQoc2VjT01YT3V0cHV0UG9ydCkpKSkgeworICAgICAgICBTRUNfT1NBTF9TaWduYWxXYWl0KHBTRUNDb21wb25lbnQtPnBhdXNlRXZlbnQsIERFRl9NQVhfV0FJVF9USU1FKTsKKyAgICAgICAgU0VDX09TQUxfU2lnbmFsUmVzZXQocFNFQ0NvbXBvbmVudC0+cGF1c2VFdmVudCk7CisgICAgfQorCisgICAgLyogcmVzZXQgZGF0YUJ1ZmZlciAqLworICAgIGRhdGFCdWZmZXItPmRhdGFWYWxpZCAgICAgPSBPTVhfRkFMU0U7CisgICAgZGF0YUJ1ZmZlci0+ZGF0YUxlbiAgICAgICA9IDA7CisgICAgZGF0YUJ1ZmZlci0+cmVtYWluRGF0YUxlbiA9IDA7CisgICAgZGF0YUJ1ZmZlci0+dXNlZERhdGFMZW4gICA9IDA7CisgICAgZGF0YUJ1ZmZlci0+YnVmZmVySGVhZGVyICA9IE5VTEw7CisgICAgZGF0YUJ1ZmZlci0+bkZsYWdzICAgICAgICA9IDA7CisgICAgZGF0YUJ1ZmZlci0+dGltZVN0YW1wICAgICA9IDA7CisKK0VYSVQ6CisgICAgRnVuY3Rpb25PdXQoKTsKKworICAgIHJldHVybiByZXQ7Cit9CisKK09NWF9FUlJPUlRZUEUgU0VDX091dHB1dEJ1ZmZlckdldFF1ZXVlKFNFQ19PTVhfQkFTRUNPTVBPTkVOVCAqcFNFQ0NvbXBvbmVudCkKK3sKKyAgICBPTVhfRVJST1JUWVBFICAgICAgIHJldCA9IE9NWF9FcnJvck5vbmU7CisgICAgU0VDX09NWF9CQVNFUE9SVCAgICpwU0VDUG9ydCA9IE5VTEw7CisgICAgU0VDX09NWF9EQVRBQlVGRkVSICpkYXRhQnVmZmVyID0gTlVMTDsKKyAgICBTRUNfT01YX01FU1NBR0UgICAgKm1lc3NhZ2UgPSBOVUxMOworICAgIFNFQ19PTVhfREFUQUJVRkZFUiAqb3V0cHV0VXNlQnVmZmVyID0gJnBTRUNDb21wb25lbnQtPnNlY0RhdGFCdWZmZXJbT1VUUFVUX1BPUlRfSU5ERVhdOworCisgICAgRnVuY3Rpb25JbigpOworCisgICAgcFNFQ1BvcnQ9ICZwU0VDQ29tcG9uZW50LT5wU0VDUG9ydFtPVVRQVVRfUE9SVF9JTkRFWF07CisgICAgZGF0YUJ1ZmZlciA9ICZwU0VDQ29tcG9uZW50LT5zZWNEYXRhQnVmZmVyW09VVFBVVF9QT1JUX0lOREVYXTsKKworICAgIGlmIChwU0VDQ29tcG9uZW50LT5jdXJyZW50U3RhdGUgIT0gT01YX1N0YXRlRXhlY3V0aW5nKSB7CisgICAgICAgIHJldCA9IE9NWF9FcnJvclVuZGVmaW5lZDsKKyAgICAgICAgZ290byBFWElUOworICAgIH0gZWxzZSB7CisgICAgICAgIFNFQ19PU0FMX1NlbWFwaG9yZVdhaXQocFNFQ1BvcnQtPmJ1ZmZlclNlbUlEKTsKKyAgICAgICAgU0VDX09TQUxfTXV0ZXhMb2NrKG91dHB1dFVzZUJ1ZmZlci0+YnVmZmVyTXV0ZXgpOworICAgICAgICBpZiAoZGF0YUJ1ZmZlci0+ZGF0YVZhbGlkICE9IE9NWF9UUlVFKSB7CisgICAgICAgICAgICBtZXNzYWdlID0gKFNFQ19PTVhfTUVTU0FHRSAqKVNFQ19PU0FMX0RlcXVldWUoJnBTRUNQb3J0LT5idWZmZXJRKTsKKyAgICAgICAgICAgIGlmIChtZXNzYWdlID09IE5VTEwpIHsKKyAgICAgICAgICAgICAgICByZXQgPSBPTVhfRXJyb3JVbmRlZmluZWQ7CisgICAgICAgICAgICAgICAgU0VDX09TQUxfTXV0ZXhVbmxvY2sob3V0cHV0VXNlQnVmZmVyLT5idWZmZXJNdXRleCk7CisgICAgICAgICAgICAgICAgZ290byBFWElUOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBkYXRhQnVmZmVyLT5idWZmZXJIZWFkZXIgPSAoT01YX0JVRkZFUkhFQURFUlRZUEUgKikobWVzc2FnZS0+cENtZERhdGEpOworICAgICAgICAgICAgZGF0YUJ1ZmZlci0+YWxsb2NTaXplID0gZGF0YUJ1ZmZlci0+YnVmZmVySGVhZGVyLT5uQWxsb2NMZW47CisgICAgICAgICAgICBkYXRhQnVmZmVyLT5kYXRhTGVuID0gMDsgLy9kYXRhQnVmZmVyLT5idWZmZXJIZWFkZXItPm5GaWxsZWRMZW47CisgICAgICAgICAgICBkYXRhQnVmZmVyLT5yZW1haW5EYXRhTGVuID0gZGF0YUJ1ZmZlci0+ZGF0YUxlbjsKKyAgICAgICAgICAgIGRhdGFCdWZmZXItPnVzZWREYXRhTGVuID0gMDsgLy9kYXRhQnVmZmVyLT5idWZmZXJIZWFkZXItPm5PZmZzZXQ7CisgICAgICAgICAgICBkYXRhQnVmZmVyLT5kYXRhVmFsaWQgPU9NWF9UUlVFOworICAgICAgICAgICAgLyogZGF0YUJ1ZmZlci0+bkZsYWdzID0gZGF0YUJ1ZmZlci0+YnVmZmVySGVhZGVyLT5uRmxhZ3M7ICovCisgICAgICAgICAgICAvKiBkYXRhQnVmZmVyLT5uVGltZVN0YW1wID0gZGF0YUJ1ZmZlci0+YnVmZmVySGVhZGVyLT5uVGltZVN0YW1wOyAqLworICAgICAgICAgICAgU0VDX09TQUxfRnJlZShtZXNzYWdlKTsKKyAgICAgICAgfQorICAgICAgICBTRUNfT1NBTF9NdXRleFVubG9jayhvdXRwdXRVc2VCdWZmZXItPmJ1ZmZlck11dGV4KTsKKyAgICAgICAgcmV0ID0gT01YX0Vycm9yTm9uZTsKKyAgICB9CitFWElUOgorICAgIEZ1bmN0aW9uT3V0KCk7CisKKyAgICByZXR1cm4gcmV0OworCit9CisKK3N0YXRpYyBPTVhfRVJST1JUWVBFIFNFQ19CdWZmZXJSZXNldChPTVhfQ09NUE9ORU5UVFlQRSAqcE9NWENvbXBvbmVudCwgT01YX1UzMiBwb3J0SW5kZXgpCit7CisgICAgT01YX0VSUk9SVFlQRSAgICAgICAgICByZXQgPSBPTVhfRXJyb3JOb25lOworICAgIFNFQ19PTVhfQkFTRUNPTVBPTkVOVCAqcFNFQ0NvbXBvbmVudCA9IChTRUNfT01YX0JBU0VDT01QT05FTlQgKilwT01YQ29tcG9uZW50LT5wQ29tcG9uZW50UHJpdmF0ZTsKKyAgICAvKiBTRUNfT01YX0JBU0VQT1JUICAgICAgKnBTRUNQb3J0ID0gJnBTRUNDb21wb25lbnQtPnBTRUNQb3J0W3BvcnRJbmRleF07ICovCisgICAgU0VDX09NWF9EQVRBQlVGRkVSICAgICpkYXRhQnVmZmVyID0gJnBTRUNDb21wb25lbnQtPnNlY0RhdGFCdWZmZXJbcG9ydEluZGV4XTsKKyAgICAvKiBPTVhfQlVGRkVSSEVBREVSVFlQRSAgKmJ1ZmZlckhlYWRlciA9IGRhdGFCdWZmZXItPmJ1ZmZlckhlYWRlcjsgKi8KKworICAgIGRhdGFCdWZmZXItPmRhdGFWYWxpZCAgICAgPSBPTVhfRkFMU0U7CisgICAgZGF0YUJ1ZmZlci0+ZGF0YUxlbiAgICAgICA9IDA7CisgICAgZGF0YUJ1ZmZlci0+cmVtYWluRGF0YUxlbiA9IDA7CisgICAgZGF0YUJ1ZmZlci0+dXNlZERhdGFMZW4gICA9IDA7CisgICAgZGF0YUJ1ZmZlci0+YnVmZmVySGVhZGVyICA9IE5VTEw7CisgICAgZGF0YUJ1ZmZlci0+bkZsYWdzICAgICAgICA9IDA7CisgICAgZGF0YUJ1ZmZlci0+dGltZVN0YW1wICAgICA9IDA7CisKKyAgICByZXR1cm4gcmV0OworfQorCitzdGF0aWMgT01YX0VSUk9SVFlQRSBTRUNfRGF0YVJlc2V0KE9NWF9DT01QT05FTlRUWVBFICpwT01YQ29tcG9uZW50LCBPTVhfVTMyIHBvcnRJbmRleCkKK3sKKyAgICBPTVhfRVJST1JUWVBFICAgICAgICAgIHJldCA9IE9NWF9FcnJvck5vbmU7CisgICAgU0VDX09NWF9CQVNFQ09NUE9ORU5UICpwU0VDQ29tcG9uZW50ID0gKFNFQ19PTVhfQkFTRUNPTVBPTkVOVCAqKXBPTVhDb21wb25lbnQtPnBDb21wb25lbnRQcml2YXRlOworICAgIC8qIFNFQ19PTVhfQkFTRVBPUlQgICAgICAqcFNFQ1BvcnQgPSAmcFNFQ0NvbXBvbmVudC0+cFNFQ1BvcnRbcG9ydEluZGV4XTsgKi8KKyAgICAvKiBTRUNfT01YX0RBVEFCVUZGRVIgICAgKmRhdGFCdWZmZXIgPSAmcFNFQ0NvbXBvbmVudC0+c2VjRGF0YUJ1ZmZlcltwb3J0SW5kZXhdOyAqLworICAgIC8qIE9NWF9CVUZGRVJIRUFERVJUWVBFICAqYnVmZmVySGVhZGVyID0gZGF0YUJ1ZmZlci0+YnVmZmVySGVhZGVyOyAqLworICAgIFNFQ19PTVhfREFUQSAgICAgICAgICAqcHJvY2Vzc0RhdGEgPSAmcFNFQ0NvbXBvbmVudC0+cHJvY2Vzc0RhdGFbcG9ydEluZGV4XTsKKworICAgIHByb2Nlc3NEYXRhLT5kYXRhTGVuICAgICAgID0gMDsKKyAgICBwcm9jZXNzRGF0YS0+cmVtYWluRGF0YUxlbiA9IDA7CisgICAgcHJvY2Vzc0RhdGEtPnVzZWREYXRhTGVuICAgPSAwOworICAgIHByb2Nlc3NEYXRhLT5uRmxhZ3MgICAgICAgID0gMDsKKyAgICBwcm9jZXNzRGF0YS0+dGltZVN0YW1wICAgICA9IDA7CisKKyAgICByZXR1cm4gcmV0OworfQorCitPTVhfQk9PTCBTRUNfUHJlcHJvY2Vzc29yX0lucHV0RGF0YShPTVhfQ09NUE9ORU5UVFlQRSAqcE9NWENvbXBvbmVudCkKK3sKKyAgICBPTVhfQk9PTCAgICAgICAgICAgICAgIHJldCA9IE9NWF9GQUxTRTsKKyAgICBTRUNfT01YX0JBU0VDT01QT05FTlQgKnBTRUNDb21wb25lbnQgPSAoU0VDX09NWF9CQVNFQ09NUE9ORU5UICopcE9NWENvbXBvbmVudC0+cENvbXBvbmVudFByaXZhdGU7CisgICAgU0VDX09NWF9WSURFT0VOQ19DT01QT05FTlQgKnBWaWRlb0VuYyA9IChTRUNfT01YX1ZJREVPRU5DX0NPTVBPTkVOVCAqKXBTRUNDb21wb25lbnQtPmhDb21wb25lbnRIYW5kbGU7CisgICAgU0VDX09NWF9EQVRBQlVGRkVSICAgICppbnB1dFVzZUJ1ZmZlciA9ICZwU0VDQ29tcG9uZW50LT5zZWNEYXRhQnVmZmVyW0lOUFVUX1BPUlRfSU5ERVhdOworICAgIFNFQ19PTVhfREFUQSAgICAgICAgICAqaW5wdXREYXRhID0gJnBTRUNDb21wb25lbnQtPnByb2Nlc3NEYXRhW0lOUFVUX1BPUlRfSU5ERVhdOworICAgIE9NWF9VMzIgICAgICAgICAgICAgICAgY29weVNpemUgPSAwOworICAgIE9NWF9CWVRFICAgICAgICAgICAgICAgY2hlY2tJbnB1dFN0cmVhbSA9IE5VTEw7CisgICAgT01YX1UzMiAgICAgICAgICAgICAgICBjaGVja0lucHV0U3RyZWFtTGVuID0gMDsKKyAgICBPTVhfVTMyICAgICAgICAgICAgICAgIGNoZWNrZWRTaXplID0gMDsKKyAgICBPTVhfQk9PTCAgICAgICAgICAgICAgIGZsYWdFT1MgPSBPTVhfRkFMU0U7CisgICAgT01YX0JPT0wgICAgICAgICAgICAgICBmbGFnRU9GID0gT01YX0ZBTFNFOworICAgIE9NWF9CT09MICAgICAgICAgICAgICAgcHJldmlvdXNGcmFtZUVPRiA9IE9NWF9GQUxTRTsKKworICAgIGlmIChpbnB1dFVzZUJ1ZmZlci0+ZGF0YVZhbGlkID09IE9NWF9UUlVFKSB7CisgICAgICAgIGNoZWNrSW5wdXRTdHJlYW0gPSBpbnB1dFVzZUJ1ZmZlci0+YnVmZmVySGVhZGVyLT5wQnVmZmVyICsgaW5wdXRVc2VCdWZmZXItPnVzZWREYXRhTGVuOworICAgICAgICBjaGVja0lucHV0U3RyZWFtTGVuID0gaW5wdXRVc2VCdWZmZXItPnJlbWFpbkRhdGFMZW47CisKKyAgICAgICAgaWYgKChpbnB1dFVzZUJ1ZmZlci0+bkZsYWdzICYgT01YX0JVRkZFUkZMQUdfRU5ET0ZGUkFNRSkgJiYKKyAgICAgICAgICAgIChwU0VDQ29tcG9uZW50LT5iVXNlRmxhZ0VPRiA9PSBPTVhfRkFMU0UpKSB7CisgICAgICAgICAgICBwU0VDQ29tcG9uZW50LT5iVXNlRmxhZ0VPRiA9IE9NWF9UUlVFOworICAgICAgICB9CisKKyAgICAgICAgaWYgKGlucHV0RGF0YS0+ZGF0YUxlbiA9PSAwKSB7CisgICAgICAgICAgICBwcmV2aW91c0ZyYW1lRU9GID0gT01YX1RSVUU7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBwcmV2aW91c0ZyYW1lRU9GID0gT01YX0ZBTFNFOworICAgICAgICB9CisgICAgICAgIGlmIChwU0VDQ29tcG9uZW50LT5iVXNlRmxhZ0VPRiA9PSBPTVhfVFJVRSkgeworICAgICAgICAgICAgZmxhZ0VPRiA9IE9NWF9UUlVFOworICAgICAgICAgICAgY2hlY2tlZFNpemUgPSBjaGVja0lucHV0U3RyZWFtTGVuOworICAgICAgICAgICAgaWYgKGNoZWNrZWRTaXplID09IDApIHsKKyAgICAgICAgICAgICAgICBTRUNfT01YX0JBU0VQT1JUICpwU0VDUG9ydCA9ICZwU0VDQ29tcG9uZW50LT5wU0VDUG9ydFtJTlBVVF9QT1JUX0lOREVYXTsKKyAgICAgICAgICAgICAgICBpbnQgd2lkdGggPSBwU0VDUG9ydC0+cG9ydERlZmluaXRpb24uZm9ybWF0LnZpZGVvLm5GcmFtZVdpZHRoOworICAgICAgICAgICAgICAgIGludCBoZWlnaHQgPSBwU0VDUG9ydC0+cG9ydERlZmluaXRpb24uZm9ybWF0LnZpZGVvLm5GcmFtZUhlaWdodDsKKyAgICAgICAgICAgICAgICBpbnB1dFVzZUJ1ZmZlci0+cmVtYWluRGF0YUxlbiA9IGlucHV0VXNlQnVmZmVyLT5kYXRhTGVuID0gKHdpZHRoICogaGVpZ2h0ICogMykgLyAyOworICAgICAgICAgICAgICAgIGNoZWNrZWRTaXplID0gY2hlY2tJbnB1dFN0cmVhbUxlbiA9IGlucHV0VXNlQnVmZmVyLT5yZW1haW5EYXRhTGVuOworICAgICAgICAgICAgICAgIGlucHV0VXNlQnVmZmVyLT5uRmxhZ3MgfD0gT01YX0JVRkZFUkZMQUdfRU9TOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKGlucHV0VXNlQnVmZmVyLT5uRmxhZ3MgJiBPTVhfQlVGRkVSRkxBR19FT1MpIHsKKyAgICAgICAgICAgICAgICBmbGFnRU9TID0gT01YX1RSVUU7CisgICAgICAgICAgICB9CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBTRUNfT01YX0JBU0VQT1JUICpwU0VDUG9ydCA9ICZwU0VDQ29tcG9uZW50LT5wU0VDUG9ydFtJTlBVVF9QT1JUX0lOREVYXTsKKyAgICAgICAgICAgIGludCB3aWR0aCA9IHBTRUNQb3J0LT5wb3J0RGVmaW5pdGlvbi5mb3JtYXQudmlkZW8ubkZyYW1lV2lkdGg7CisgICAgICAgICAgICBpbnQgaGVpZ2h0ID0gcFNFQ1BvcnQtPnBvcnREZWZpbml0aW9uLmZvcm1hdC52aWRlby5uRnJhbWVIZWlnaHQ7CisgICAgICAgICAgICB1bnNpZ25lZCBpbnQgb25lRnJhbWVTaXplID0gMDsKKworICAgICAgICAgICAgc3dpdGNoIChwU0VDUG9ydC0+cG9ydERlZmluaXRpb24uZm9ybWF0LnZpZGVvLmVDb2xvckZvcm1hdCkgeworICAgICAgICAgICAgY2FzZSBPTVhfQ09MT1JfRm9ybWF0WVVWNDIwU2VtaVBsYW5hcjoKKyAgICAgICAgICAgIGNhc2UgT01YX0NPTE9SX0Zvcm1hdFlVVjQyMFBsYW5hcjoKKyAgICAgICAgICAgIGNhc2UgT01YX1NFQ19DT0xPUl9Gb3JtYXROVjEyVFBoeXNpY2FsQWRkcmVzczoKKyAgICAgICAgICAgIGNhc2UgT01YX1NFQ19DT0xPUl9Gb3JtYXROVjEyTFBoeXNpY2FsQWRkcmVzczoKKyAgICAgICAgICAgIGNhc2UgT01YX1NFQ19DT0xPUl9Gb3JtYXROVjIxTFBoeXNpY2FsQWRkcmVzczoKKyAgICAgICAgICAgIGNhc2UgT01YX1NFQ19DT0xPUl9Gb3JtYXROVjEyVGlsZWQ6CisgICAgICAgICAgICBjYXNlIE9NWF9TRUNfQ09MT1JfRm9ybWF0TlYyMUxpbmVhcjoKKyAgICAgICAgICAgICAgICBvbmVGcmFtZVNpemUgPSAod2lkdGggKiBoZWlnaHQgKiAzKSAvIDI7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIE9NWF9TRUNfQ09MT1JfRm9ybWF0TlYxMkxWaXJ0dWFsQWRkcmVzczoKKyAgICAgICAgICAgICAgICBvbmVGcmFtZVNpemUgPSBBTElHTigoQUxJR04od2lkdGgsIDE2KSAqIEFMSUdOKGhlaWdodCwgMTYpKSwgMjA0OCkgKyBBTElHTigoQUxJR04od2lkdGgsIDE2KSAqIEFMSUdOKGhlaWdodCA+PiAxLCA4KSksIDIwNDgpOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICBTRUNfT1NBTF9Mb2coU0VDX0xPR19FUlJPUiwgIlNFQ19QcmVwcm9jZXNzb3JfSW5wdXREYXRhOiBlQ29sb3JGb3JtYXQgaXMgd3JvbmciKTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaWYgKHByZXZpb3VzRnJhbWVFT0YgPT0gT01YX1RSVUUpIHsKKyAgICAgICAgICAgICAgICBpZiAoY2hlY2tJbnB1dFN0cmVhbUxlbiA+PSBvbmVGcmFtZVNpemUpIHsKKyAgICAgICAgICAgICAgICAgICAgY2hlY2tlZFNpemUgPSBvbmVGcmFtZVNpemU7CisgICAgICAgICAgICAgICAgICAgIGZsYWdFT0YgPSBPTVhfVFJVRTsKKyAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICBmbGFnRU9GID0gT01YX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgaWYgKGNoZWNrSW5wdXRTdHJlYW1MZW4gPj0gKG9uZUZyYW1lU2l6ZSAtIGlucHV0RGF0YS0+ZGF0YUxlbikpIHsKKyAgICAgICAgICAgICAgICAgICAgY2hlY2tlZFNpemUgPSBvbmVGcmFtZVNpemUgLSBpbnB1dERhdGEtPmRhdGFMZW47CisgICAgICAgICAgICAgICAgICAgIGZsYWdFT0YgPSBPTVhfVFJVRTsKKyAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICBmbGFnRU9GID0gT01YX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaWYgKChmbGFnRU9GID09IE9NWF9GQUxTRSkgJiYgKGlucHV0VXNlQnVmZmVyLT5uRmxhZ3MgJiBPTVhfQlVGRkVSRkxBR19FT1MpKSB7CisgICAgICAgICAgICAgICAgZmxhZ0VPRiA9IE9NWF9UUlVFOworICAgICAgICAgICAgICAgIGZsYWdFT1MgPSBPTVhfVFJVRTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIGlmIChmbGFnRU9GID09IE9NWF9UUlVFKSB7CisgICAgICAgICAgICBjb3B5U2l6ZSA9IGNoZWNrZWRTaXplOworICAgICAgICAgICAgU0VDX09TQUxfTG9nKFNFQ19MT0dfVFJBQ0UsICJzZWNfY2hlY2tJbnB1dEZyYW1lIDogT01YX1RSVUUiKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIGNvcHlTaXplID0gY2hlY2tJbnB1dFN0cmVhbUxlbjsKKyAgICAgICAgICAgIFNFQ19PU0FMX0xvZyhTRUNfTE9HX1RSQUNFLCAic2VjX2NoZWNrSW5wdXRGcmFtZSA6IE9NWF9GQUxTRSIpOworICAgICAgICB9CisKKyAgICAgICAgaWYgKGlucHV0VXNlQnVmZmVyLT5uRmxhZ3MgJiBPTVhfQlVGRkVSRkxBR19FT1MpCisgICAgICAgICAgICBwU0VDQ29tcG9uZW50LT5iU2F2ZUZsYWdFT1MgPSBPTVhfVFJVRTsKKworICAgICAgICBpZiAoKChpbnB1dERhdGEtPmFsbG9jU2l6ZSkgLSAoaW5wdXREYXRhLT5kYXRhTGVuKSkgPj0gY29weVNpemUpIHsKKyAgICAgICAgICAgIFNFQ19PTVhfQkFTRVBPUlQgKnBTRUNQb3J0ID0gJnBTRUNDb21wb25lbnQtPnBTRUNQb3J0W0lOUFVUX1BPUlRfSU5ERVhdOworICAgICAgICAgICAgaWYgKChwU0VDUG9ydC0+cG9ydERlZmluaXRpb24uZm9ybWF0LnZpZGVvLmVDb2xvckZvcm1hdCAhPSBPTVhfU0VDX0NPTE9SX0Zvcm1hdE5WMTJUUGh5c2ljYWxBZGRyZXNzKSAmJgorICAgICAgICAgICAgICAgIChwU0VDUG9ydC0+cG9ydERlZmluaXRpb24uZm9ybWF0LnZpZGVvLmVDb2xvckZvcm1hdCAhPSBPTVhfU0VDX0NPTE9SX0Zvcm1hdE5WMTJMUGh5c2ljYWxBZGRyZXNzKSAmJgorICAgICAgICAgICAgICAgIChwU0VDUG9ydC0+cG9ydERlZmluaXRpb24uZm9ybWF0LnZpZGVvLmVDb2xvckZvcm1hdCAhPSBPTVhfU0VDX0NPTE9SX0Zvcm1hdE5WMTJMVmlydHVhbEFkZHJlc3MpICYmCisgICAgICAgICAgICAgICAgKHBTRUNQb3J0LT5wb3J0RGVmaW5pdGlvbi5mb3JtYXQudmlkZW8uZUNvbG9yRm9ybWF0ICE9IE9NWF9TRUNfQ09MT1JfRm9ybWF0TlYyMUxQaHlzaWNhbEFkZHJlc3MpKSB7CisgICAgICAgICAgICAgICAgaWYgKGZsYWdFT0YgPT0gT01YX1RSVUUpIHsKKyAgICAgICAgICAgICAgICAgICAgT01YX1UzMiB3aWR0aCwgaGVpZ2h0OworICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBpbnQgY3NjX3NyY19jb2xvcl9mb3JtYXQsIGNzY19kc3RfY29sb3JfZm9ybWF0OworICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBpbnQgY2FjaGVhYmxlID0gMTsKKyAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgY2hhciAqcFNyY0J1ZlszXSA9IHtOVUxMLCB9OworICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBjaGFyICpwRHN0QnVmWzNdID0ge05VTEwsIH07CisgICAgICAgICAgICAgICAgICAgIE9NWF9QVFIgcHBCdWZbM107CisKKyAgICAgICAgICAgICAgICAgICAgd2lkdGggPSBwU0VDUG9ydC0+cG9ydERlZmluaXRpb24uZm9ybWF0LnZpZGVvLm5GcmFtZVdpZHRoOworICAgICAgICAgICAgICAgICAgICBoZWlnaHQgPSBwU0VDUG9ydC0+cG9ydERlZmluaXRpb24uZm9ybWF0LnZpZGVvLm5GcmFtZUhlaWdodDsKKworICAgICAgICAgICAgICAgICAgICBwRHN0QnVmWzBdID0gKHVuc2lnbmVkIGNoYXIgKilwVmlkZW9FbmMtPk1GQ0VuY0lucHV0QnVmZmVyW3BWaWRlb0VuYy0+aW5kZXhJbnB1dEJ1ZmZlcl0uWVZpckFkZHI7CisgICAgICAgICAgICAgICAgICAgIHBEc3RCdWZbMV0gPSAodW5zaWduZWQgY2hhciAqKXBWaWRlb0VuYy0+TUZDRW5jSW5wdXRCdWZmZXJbcFZpZGVvRW5jLT5pbmRleElucHV0QnVmZmVyXS5DVmlyQWRkcjsKKworICAgICAgICAgICAgICAgICAgICBTRUNfT1NBTF9Mb2coU0VDX0xPR19UUkFDRSwgInBWaWRlb0VuYy0+TUZDRW5jSW5wdXRCdWZmZXJbJWRdLllWaXJBZGRyIDogMHgleCIsIHBWaWRlb0VuYy0+aW5kZXhJbnB1dEJ1ZmZlciwgcFZpZGVvRW5jLT5NRkNFbmNJbnB1dEJ1ZmZlcltwVmlkZW9FbmMtPmluZGV4SW5wdXRCdWZmZXJdLllWaXJBZGRyKTsKKyAgICAgICAgICAgICAgICAgICAgU0VDX09TQUxfTG9nKFNFQ19MT0dfVFJBQ0UsICJwVmlkZW9FbmMtPk1GQ0VuY0lucHV0QnVmZmVyWyVkXS5DVmlyQWRkciA6IDB4JXgiLCBwVmlkZW9FbmMtPmluZGV4SW5wdXRCdWZmZXIsIHBWaWRlb0VuYy0+TUZDRW5jSW5wdXRCdWZmZXJbcFZpZGVvRW5jLT5pbmRleElucHV0QnVmZmVyXS5DVmlyQWRkcik7CisKKyAgICAgICAgICAgICAgICAgICAgU0VDX09TQUxfTG9nKFNFQ19MT0dfVFJBQ0UsICJ3aWR0aDolZCwgaGVpZ2h0OiVkLCBZc2l6ZTolZCIsIHdpZHRoLCBoZWlnaHQsIEFMSUdOX1RPXzhLQihBTElHTl9UT18xMjhCKHdpZHRoKSAqIEFMSUdOX1RPXzMyQihoZWlnaHQpKSk7CisgICAgICAgICAgICAgICAgICAgIFNFQ19PU0FMX0xvZyhTRUNfTE9HX1RSQUNFLCAid2lkdGg6JWQsIGhlaWdodDolZCwgQ3NpemU6JWQiLCB3aWR0aCwgaGVpZ2h0LCBBTElHTl9UT184S0IoQUxJR05fVE9fMTI4Qih3aWR0aCkgKiBBTElHTl9UT18zMkIoaGVpZ2h0IC8gMikpKTsKKworICAgICAgICAgICAgICAgICAgICBpZiAocFNFQ1BvcnQtPmJTdG9yZU1ldGFEYXRhID09IE9NWF9GQUxTRSkgeworICAgICAgICAgICAgICAgICAgICAgICAgcFNyY0J1ZlswXSAgPSBjaGVja0lucHV0U3RyZWFtOworICAgICAgICAgICAgICAgICAgICAgICAgcFNyY0J1ZlsxXSAgPSBjaGVja0lucHV0U3RyZWFtICsgKHdpZHRoICogaGVpZ2h0KTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHBTcmNCdWZbMl0gID0gY2hlY2tJbnB1dFN0cmVhbSArICgoKHdpZHRoICogaGVpZ2h0KSAqIDUpIC8gNCk7CisKKyAgICAgICAgICAgICAgICAgICAgICAgIHN3aXRjaCAocFNFQ1BvcnQtPnBvcnREZWZpbml0aW9uLmZvcm1hdC52aWRlby5lQ29sb3JGb3JtYXQpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgT01YX0NPTE9SX0Zvcm1hdFlVVjQyMFBsYW5hcjoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBZVVY0MjBQbGFuYXIgY2FzZSBpdCBuZWVkZWQgY2hhbmdlZCBpbnRlcmxlYXZlIFVWIHBsYW5lIChNRkMgc3BlYy4pKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjc2Nfc3JjX2NvbG9yX2Zvcm1hdCA9IG9teF8yX2hhbF9waXhlbF9mb3JtYXQoKHVuc2lnbmVkIGludClPTVhfQ09MT1JfRm9ybWF0WVVWNDIwUGxhbmFyKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjc2NfZHN0X2NvbG9yX2Zvcm1hdCA9IG9teF8yX2hhbF9waXhlbF9mb3JtYXQoKHVuc2lnbmVkIGludClPTVhfQ09MT1JfRm9ybWF0WVVWNDIwU2VtaVBsYW5hcik7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIE9NWF9DT0xPUl9Gb3JtYXRZVVY0MjBTZW1pUGxhbmFyOgorICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBPTVhfU0VDX0NPTE9SX0Zvcm1hdE5WMTJUaWxlZDoKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgT01YX1NFQ19DT0xPUl9Gb3JtYXROVjIxTGluZWFyOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNzY19zcmNfY29sb3JfZm9ybWF0ID0gb214XzJfaGFsX3BpeGVsX2Zvcm1hdCgodW5zaWduZWQgaW50KU9NWF9DT0xPUl9Gb3JtYXRZVVY0MjBTZW1pUGxhbmFyKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjc2NfZHN0X2NvbG9yX2Zvcm1hdCA9IG9teF8yX2hhbF9waXhlbF9mb3JtYXQoKHVuc2lnbmVkIGludClPTVhfQ09MT1JfRm9ybWF0WVVWNDIwU2VtaVBsYW5hcik7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICB9CisjaWZkZWYgVVNFX01FVEFEQVRBQlVGRkVSVFlQRQorICAgICAgICAgICAgICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChwU0VDUG9ydC0+cG9ydERlZmluaXRpb24uZm9ybWF0LnZpZGVvLmVDb2xvckZvcm1hdCA9PSBPTVhfQ09MT1JfRm9ybWF0QW5kcm9pZE9wYXF1ZSkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPTVhfUFRSIHBPdXRCdWZmZXI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNzY19zcmNfY29sb3JfZm9ybWF0ID0gb214XzJfaGFsX3BpeGVsX2Zvcm1hdCgodW5zaWduZWQgaW50KU9NWF9DT0xPUl9Gb3JtYXQzMmJpdEFSR0I4ODg4KTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY3NjX2RzdF9jb2xvcl9mb3JtYXQgPSBvbXhfMl9oYWxfcGl4ZWxfZm9ybWF0KCh1bnNpZ25lZCBpbnQpT01YX0NPTE9SX0Zvcm1hdFlVVjQyMFNlbWlQbGFuYXIpOworCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNFQ19PU0FMX0dldEluZm9Gcm9tTWV0YURhdGEoaW5wdXREYXRhLCBwcEJ1Zik7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNFQ19PU0FMX0xvY2tBTkJIYW5kbGUoKE9NWF9VMzIpcHBCdWZbMF0sIHdpZHRoLCBoZWlnaHQsIE9NWF9DT0xPUl9Gb3JtYXRBbmRyb2lkT3BhcXVlLCAmcE91dEJ1ZmZlcik7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBTcmNCdWZbMF0gID0gKHVuc2lnbmVkIGNoYXIgKilwT3V0QnVmZmVyOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwU3JjQnVmWzFdICA9IE5VTEw7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBTcmNCdWZbMl0gID0gTlVMTDsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgfQorI2VuZGlmCisKKyAgICAgICAgICAgICAgICAgICAgY3NjX3NldF9zcmNfZm9ybWF0KAorICAgICAgICAgICAgICAgICAgICAgICAgcFZpZGVvRW5jLT5jc2NfaGFuZGxlLCAgLyogaGFuZGxlICovCisgICAgICAgICAgICAgICAgICAgICAgICB3aWR0aCwgICAgICAgICAgICAgICAgICAvKiB3aWR0aCAqLworICAgICAgICAgICAgICAgICAgICAgICAgaGVpZ2h0LCAgICAgICAgICAgICAgICAgLyogaGVpZ2h0ICovCisgICAgICAgICAgICAgICAgICAgICAgICAwLCAgICAgICAgICAgICAgICAgICAgICAvKiBjcm9wX2xlZnQgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgIDAsICAgICAgICAgICAgICAgICAgICAgIC8qIGNyb3BfcmlnaHQgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgIHdpZHRoLCAgICAgICAgICAgICAgICAgIC8qIGNyb3Bfd2lkdGggKi8KKyAgICAgICAgICAgICAgICAgICAgICAgIGhlaWdodCwgICAgICAgICAgICAgICAgIC8qIGNyb3BfaGVpZ2h0ICovCisgICAgICAgICAgICAgICAgICAgICAgICBjc2Nfc3JjX2NvbG9yX2Zvcm1hdCwgICAvKiBjb2xvcl9mb3JtYXQgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgIGNhY2hlYWJsZSk7ICAgICAgICAgICAgIC8qIGNhY2hlYWJsZSAqLworICAgICAgICAgICAgICAgICAgICBjc2Nfc2V0X2RzdF9mb3JtYXQoCisgICAgICAgICAgICAgICAgICAgICAgICBwVmlkZW9FbmMtPmNzY19oYW5kbGUsICAvKiBoYW5kbGUgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgIHdpZHRoLCAgICAgICAgICAgICAgICAgIC8qIHdpZHRoICovCisgICAgICAgICAgICAgICAgICAgICAgICBoZWlnaHQsICAgICAgICAgICAgICAgICAvKiBoZWlnaHQgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgIDAsICAgICAgICAgICAgICAgICAgICAgIC8qIGNyb3BfbGVmdCAqLworICAgICAgICAgICAgICAgICAgICAgICAgMCwgICAgICAgICAgICAgICAgICAgICAgLyogY3JvcF9yaWdodCAqLworICAgICAgICAgICAgICAgICAgICAgICAgd2lkdGgsICAgICAgICAgICAgICAgICAgLyogY3JvcF93aWR0aCAqLworICAgICAgICAgICAgICAgICAgICAgICAgaGVpZ2h0LCAgICAgICAgICAgICAgICAgLyogY3JvcF9oZWlnaHQgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgIGNzY19kc3RfY29sb3JfZm9ybWF0LCAgIC8qIGNvbG9yX2Zvcm1hdCAqLworICAgICAgICAgICAgICAgICAgICAgICAgY2FjaGVhYmxlKTsgICAgICAgICAgICAgLyogY2FjaGVhYmxlICovCisgICAgICAgICAgICAgICAgICAgIGNzY19zZXRfc3JjX2J1ZmZlcigKKyAgICAgICAgICAgICAgICAgICAgICAgIHBWaWRlb0VuYy0+Y3NjX2hhbmRsZSwgIC8qIGhhbmRsZSAqLworICAgICAgICAgICAgICAgICAgICAgICAgcFNyY0J1ZlswXSwgICAgICAgICAgICAgLyogeSBhZGRyICovCisgICAgICAgICAgICAgICAgICAgICAgICBwU3JjQnVmWzFdLCAgICAgICAgICAgICAvKiB1IGFkZHIgb3IgdXYgYWRkciAqLworICAgICAgICAgICAgICAgICAgICAgICAgcFNyY0J1ZlsyXSwgICAgICAgICAgICAgLyogdiBhZGRyIG9yIG5vbmUgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgIDApOyAgICAgICAgICAgICAgICAgICAgIC8qIGlvbiBmZCAqLworICAgICAgICAgICAgICAgICAgICBjc2Nfc2V0X2RzdF9idWZmZXIoCisgICAgICAgICAgICAgICAgICAgICAgICBwVmlkZW9FbmMtPmNzY19oYW5kbGUsICAvKiBoYW5kbGUgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgIHBEc3RCdWZbMF0sICAgICAgICAgICAgIC8qIHkgYWRkciAqLworICAgICAgICAgICAgICAgICAgICAgICAgcERzdEJ1ZlsxXSwgICAgICAgICAgICAgLyogdSBhZGRyIG9yIHV2IGFkZHIgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgIHBEc3RCdWZbMl0sICAgICAgICAgICAgIC8qIHYgYWRkciBvciBub25lICovCisgICAgICAgICAgICAgICAgICAgICAgICAwKTsgICAgICAgICAgICAgICAgICAgICAvKiBpb24gZmQgKi8KKyAgICAgICAgICAgICAgICAgICAgY3NjX2NvbnZlcnQocFZpZGVvRW5jLT5jc2NfaGFuZGxlKTsKKworI2lmZGVmIFVTRV9NRVRBREFUQUJVRkZFUlRZUEUKKyAgICAgICAgICAgICAgICAgICAgaWYgKHBTRUNQb3J0LT5iU3RvcmVNZXRhRGF0YSA9PSBPTVhfVFJVRSkgeworICAgICAgICAgICAgICAgICAgICAgICAgU0VDX09TQUxfVW5sb2NrQU5CSGFuZGxlKChPTVhfVTMyKXBwQnVmWzBdKTsKKyAgICAgICAgICAgICAgICAgICAgfQorI2VuZGlmCisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorCisgICAgICAgICAgICBpbnB1dFVzZUJ1ZmZlci0+ZGF0YUxlbiAtPSBjb3B5U2l6ZTsgLyogPz8/Pz8/Pz8/Pz8/IGRvIG5vdCBuZWVkID8/Pz8/Pz8/Pz8/Pz8/ICovCisgICAgICAgICAgICBpbnB1dFVzZUJ1ZmZlci0+cmVtYWluRGF0YUxlbiAtPSBjb3B5U2l6ZTsKKyAgICAgICAgICAgIGlucHV0VXNlQnVmZmVyLT51c2VkRGF0YUxlbiArPSBjb3B5U2l6ZTsKKworICAgICAgICAgICAgaW5wdXREYXRhLT5kYXRhTGVuICs9IGNvcHlTaXplOworICAgICAgICAgICAgaW5wdXREYXRhLT5yZW1haW5EYXRhTGVuICs9IGNvcHlTaXplOworCisgICAgICAgICAgICBpZiAocHJldmlvdXNGcmFtZUVPRiA9PSBPTVhfVFJVRSkgeworICAgICAgICAgICAgICAgIGlucHV0RGF0YS0+dGltZVN0YW1wID0gaW5wdXRVc2VCdWZmZXItPnRpbWVTdGFtcDsKKyAgICAgICAgICAgICAgICBpbnB1dERhdGEtPm5GbGFncyA9IGlucHV0VXNlQnVmZmVyLT5uRmxhZ3M7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGlmIChwU0VDQ29tcG9uZW50LT5iVXNlRmxhZ0VPRiA9PSBPTVhfVFJVRSkgeworICAgICAgICAgICAgICAgIGlmIChwU0VDQ29tcG9uZW50LT5iU2F2ZUZsYWdFT1MgPT0gT01YX1RSVUUpIHsKKyAgICAgICAgICAgICAgICAgICAgaW5wdXREYXRhLT5uRmxhZ3MgfD0gT01YX0JVRkZFUkZMQUdfRU9TOworICAgICAgICAgICAgICAgICAgICBmbGFnRU9GID0gT01YX1RSVUU7CisgICAgICAgICAgICAgICAgICAgIHBTRUNDb21wb25lbnQtPmJTYXZlRmxhZ0VPUyA9IE9NWF9GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIGlmICgoY2hlY2tlZFNpemUgPT0gY2hlY2tJbnB1dFN0cmVhbUxlbikgJiYgKHBTRUNDb21wb25lbnQtPmJTYXZlRmxhZ0VPUyA9PSBPTVhfVFJVRSkpIHsKKyAgICAgICAgICAgICAgICAgICAgaW5wdXREYXRhLT5uRmxhZ3MgfD0gT01YX0JVRkZFUkZMQUdfRU9TOworICAgICAgICAgICAgICAgICAgICBmbGFnRU9GID0gT01YX1RSVUU7CisgICAgICAgICAgICAgICAgICAgIHBTRUNDb21wb25lbnQtPmJTYXZlRmxhZ0VPUyA9IE9NWF9GQUxTRTsKKyAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICBpbnB1dERhdGEtPm5GbGFncyA9IChpbnB1dFVzZUJ1ZmZlci0+bkZsYWdzICYgKH5PTVhfQlVGRkVSRkxBR19FT1MpKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAvKj8/Pz8/Pz8/Pz8/Pz8/Pz8/Pz8/Pz8/Pz8/Pz8/Pz8/PyBFcnJvciA/Pz8/Pz8/Pz8/Pz8/Pz8/Pz8/Pz8/Pz8/Pz8/Pz8/Pz8qLworICAgICAgICAgICAgU0VDX0RhdGFSZXNldChwT01YQ29tcG9uZW50LCBJTlBVVF9QT1JUX0lOREVYKTsKKyAgICAgICAgICAgIGZsYWdFT0YgPSBPTVhfRkFMU0U7CisgICAgICAgIH0KKworICAgICAgICBpZiAoaW5wdXRVc2VCdWZmZXItPnJlbWFpbkRhdGFMZW4gPT0gMCkgeworICAgICAgICAgICAgaWYoZmxhZ0VPRiA9PSBPTVhfRkFMU0UpCisgICAgICAgICAgICAgICAgU0VDX0lucHV0QnVmZmVyUmV0dXJuKHBPTVhDb21wb25lbnQpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgaW5wdXRVc2VCdWZmZXItPmRhdGFWYWxpZCA9IE9NWF9UUlVFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKGZsYWdFT0YgPT0gT01YX1RSVUUpIHsKKyAgICAgICAgaWYgKHBTRUNDb21wb25lbnQtPmNoZWNrVGltZVN0YW1wLm5lZWRTZXRTdGFydFRpbWVTdGFtcCA9PSBPTVhfVFJVRSkgeworICAgICAgICAgICAgcFNFQ0NvbXBvbmVudC0+Y2hlY2tUaW1lU3RhbXAubmVlZENoZWNrU3RhcnRUaW1lU3RhbXAgPSBPTVhfVFJVRTsKKyAgICAgICAgICAgIHBTRUNDb21wb25lbnQtPmNoZWNrVGltZVN0YW1wLnN0YXJ0VGltZVN0YW1wID0gaW5wdXREYXRhLT50aW1lU3RhbXA7CisgICAgICAgICAgICBwU0VDQ29tcG9uZW50LT5jaGVja1RpbWVTdGFtcC5uU3RhcnRGbGFncyA9IGlucHV0RGF0YS0+bkZsYWdzOworICAgICAgICAgICAgcFNFQ0NvbXBvbmVudC0+Y2hlY2tUaW1lU3RhbXAubmVlZFNldFN0YXJ0VGltZVN0YW1wID0gT01YX0ZBTFNFOworICAgICAgICB9CisKKyAgICAgICAgcmV0ID0gT01YX1RSVUU7CisgICAgfSBlbHNlIHsKKyAgICAgICAgcmV0ID0gT01YX0ZBTFNFOworICAgIH0KKyAgICByZXR1cm4gcmV0OworfQorCitPTVhfQk9PTCBTRUNfUG9zdHByb2Nlc3NfT3V0cHV0RGF0YShPTVhfQ09NUE9ORU5UVFlQRSAqcE9NWENvbXBvbmVudCkKK3sKKyAgICBPTVhfQk9PTCAgICAgICAgICAgICAgIHJldCA9IE9NWF9GQUxTRTsKKyAgICBTRUNfT01YX0JBU0VDT01QT05FTlQgKnBTRUNDb21wb25lbnQgPSAoU0VDX09NWF9CQVNFQ09NUE9ORU5UICopcE9NWENvbXBvbmVudC0+cENvbXBvbmVudFByaXZhdGU7CisgICAgU0VDX09NWF9EQVRBQlVGRkVSICAgICpvdXRwdXRVc2VCdWZmZXIgPSAmcFNFQ0NvbXBvbmVudC0+c2VjRGF0YUJ1ZmZlcltPVVRQVVRfUE9SVF9JTkRFWF07CisgICAgU0VDX09NWF9EQVRBICAgICAgICAgICpvdXRwdXREYXRhID0gJnBTRUNDb21wb25lbnQtPnByb2Nlc3NEYXRhW09VVFBVVF9QT1JUX0lOREVYXTsKKyAgICBPTVhfVTMyICAgICAgICAgICAgICAgIGNvcHlTaXplID0gMDsKKworICAgIGlmIChvdXRwdXRVc2VCdWZmZXItPmRhdGFWYWxpZCA9PSBPTVhfVFJVRSkgeworICAgICAgICBpZiAocFNFQ0NvbXBvbmVudC0+Y2hlY2tUaW1lU3RhbXAubmVlZENoZWNrU3RhcnRUaW1lU3RhbXAgPT0gT01YX1RSVUUpIHsKKyAgICAgICAgICAgIGlmIChwU0VDQ29tcG9uZW50LT5jaGVja1RpbWVTdGFtcC5zdGFydFRpbWVTdGFtcCA9PSBvdXRwdXREYXRhLT50aW1lU3RhbXApeworICAgICAgICAgICAgICAgIHBTRUNDb21wb25lbnQtPmNoZWNrVGltZVN0YW1wLnN0YXJ0VGltZVN0YW1wID0gLTE5NzYxMTIzOworICAgICAgICAgICAgICAgIHBTRUNDb21wb25lbnQtPmNoZWNrVGltZVN0YW1wLm5TdGFydEZsYWdzID0gMHgwOworICAgICAgICAgICAgICAgIHBTRUNDb21wb25lbnQtPmNoZWNrVGltZVN0YW1wLm5lZWRTZXRTdGFydFRpbWVTdGFtcCA9IE9NWF9GQUxTRTsKKyAgICAgICAgICAgICAgICBwU0VDQ29tcG9uZW50LT5jaGVja1RpbWVTdGFtcC5uZWVkQ2hlY2tTdGFydFRpbWVTdGFtcCA9IE9NWF9GQUxTRTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgU0VDX0RhdGFSZXNldChwT01YQ29tcG9uZW50LCBPVVRQVVRfUE9SVF9JTkRFWCk7CisKKyAgICAgICAgICAgICAgICByZXQgPSBPTVhfVFJVRTsKKyAgICAgICAgICAgICAgICBnb3RvIEVYSVQ7CisgICAgICAgICAgICB9CisgICAgICAgIH0gZWxzZSBpZiAocFNFQ0NvbXBvbmVudC0+Y2hlY2tUaW1lU3RhbXAubmVlZFNldFN0YXJ0VGltZVN0YW1wID09IE9NWF9UUlVFKSB7CisgICAgICAgICAgICBTRUNfRGF0YVJlc2V0KHBPTVhDb21wb25lbnQsIE9VVFBVVF9QT1JUX0lOREVYKTsKKworICAgICAgICAgICAgcmV0ID0gT01YX1RSVUU7CisgICAgICAgICAgICBnb3RvIEVYSVQ7CisgICAgICAgIH0KKworICAgICAgICBpZiAob3V0cHV0RGF0YS0+cmVtYWluRGF0YUxlbiA8PSAob3V0cHV0VXNlQnVmZmVyLT5hbGxvY1NpemUgLSBvdXRwdXRVc2VCdWZmZXItPmRhdGFMZW4pKSB7CisgICAgICAgICAgICBjb3B5U2l6ZSA9IG91dHB1dERhdGEtPnJlbWFpbkRhdGFMZW47CisgICAgICAgICAgICBpZiAoY29weVNpemUgPiAwKQorICAgICAgICAgICAgICAgIFNFQ19PU0FMX01lbWNweSgob3V0cHV0VXNlQnVmZmVyLT5idWZmZXJIZWFkZXItPnBCdWZmZXIgKyBvdXRwdXRVc2VCdWZmZXItPmRhdGFMZW4pLAorICAgICAgICAgICAgICAgICAgICAgICAgKG91dHB1dERhdGEtPmRhdGFCdWZmZXIgKyBvdXRwdXREYXRhLT51c2VkRGF0YUxlbiksCisgICAgICAgICAgICAgICAgICAgICAgICAgY29weVNpemUpOworCisgICAgICAgICAgICBvdXRwdXRVc2VCdWZmZXItPmRhdGFMZW4gKz0gY29weVNpemU7CisgICAgICAgICAgICBvdXRwdXRVc2VCdWZmZXItPnJlbWFpbkRhdGFMZW4gKz0gY29weVNpemU7CisgICAgICAgICAgICBvdXRwdXRVc2VCdWZmZXItPm5GbGFncyA9IG91dHB1dERhdGEtPm5GbGFnczsKKyAgICAgICAgICAgIG91dHB1dFVzZUJ1ZmZlci0+dGltZVN0YW1wID0gb3V0cHV0RGF0YS0+dGltZVN0YW1wOworCisgICAgICAgICAgICByZXQgPSBPTVhfVFJVRTsKKworICAgICAgICAgICAgLyogcmVzZXQgb3V0cHV0RGF0YSAqLworICAgICAgICAgICAgU0VDX0RhdGFSZXNldChwT01YQ29tcG9uZW50LCBPVVRQVVRfUE9SVF9JTkRFWCk7CisKKyAgICAgICAgICAgIGlmICgob3V0cHV0VXNlQnVmZmVyLT5yZW1haW5EYXRhTGVuID4gMCkgfHwKKyAgICAgICAgICAgICAgICAob3V0cHV0VXNlQnVmZmVyLT5uRmxhZ3MgJiBPTVhfQlVGRkVSRkxBR19FT1MpKQorICAgICAgICAgICAgICAgIFNFQ19PdXRwdXRCdWZmZXJSZXR1cm4ocE9NWENvbXBvbmVudCk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBTRUNfT1NBTF9Mb2coU0VDX0xPR19FUlJPUiwgIm91dHB1dCBidWZmZXIgaXMgc21hbGxlciB0aGFuIGVuY29kZWQgZGF0YSBzaXplIE91dCBMZW5ndGgiKTsKKworICAgICAgICAgICAgcmV0ID0gT01YX0ZBTFNFOworCisgICAgICAgICAgICAvKiByZXNldCBvdXRwdXREYXRhICovCisgICAgICAgICAgICBTRUNfRGF0YVJlc2V0KHBPTVhDb21wb25lbnQsIE9VVFBVVF9QT1JUX0lOREVYKTsKKyAgICAgICAgfQorICAgIH0gZWxzZSB7CisgICAgICAgIHJldCA9IE9NWF9GQUxTRTsKKyAgICB9CisKK0VYSVQ6CisgICAgcmV0dXJuIHJldDsKK30KKworT01YX0VSUk9SVFlQRSBTRUNfT01YX0J1ZmZlclByb2Nlc3MoT01YX0hBTkRMRVRZUEUgaENvbXBvbmVudCkKK3sKKyAgICBPTVhfRVJST1JUWVBFICAgICAgICAgIHJldCA9IE9NWF9FcnJvck5vbmU7CisgICAgT01YX0NPTVBPTkVOVFRZUEUgICAgICpwT01YQ29tcG9uZW50ID0gKE9NWF9DT01QT05FTlRUWVBFICopaENvbXBvbmVudDsKKyAgICBTRUNfT01YX0JBU0VDT01QT05FTlQgKnBTRUNDb21wb25lbnQgPSAoU0VDX09NWF9CQVNFQ09NUE9ORU5UICopcE9NWENvbXBvbmVudC0+cENvbXBvbmVudFByaXZhdGU7CisgICAgU0VDX09NWF9WSURFT0VOQ19DT01QT05FTlQgKnBWaWRlb0VuYyA9IChTRUNfT01YX1ZJREVPRU5DX0NPTVBPTkVOVCAqKXBTRUNDb21wb25lbnQtPmhDb21wb25lbnRIYW5kbGU7CisgICAgU0VDX09NWF9CQVNFUE9SVCAgICAgICpzZWNJbnB1dFBvcnQgPSAmcFNFQ0NvbXBvbmVudC0+cFNFQ1BvcnRbSU5QVVRfUE9SVF9JTkRFWF07CisgICAgU0VDX09NWF9CQVNFUE9SVCAgICAgICpzZWNPdXRwdXRQb3J0ID0gJnBTRUNDb21wb25lbnQtPnBTRUNQb3J0W09VVFBVVF9QT1JUX0lOREVYXTsKKyAgICBTRUNfT01YX0RBVEFCVUZGRVIgICAgKmlucHV0VXNlQnVmZmVyID0gJnBTRUNDb21wb25lbnQtPnNlY0RhdGFCdWZmZXJbSU5QVVRfUE9SVF9JTkRFWF07CisgICAgU0VDX09NWF9EQVRBQlVGRkVSICAgICpvdXRwdXRVc2VCdWZmZXIgPSAmcFNFQ0NvbXBvbmVudC0+c2VjRGF0YUJ1ZmZlcltPVVRQVVRfUE9SVF9JTkRFWF07CisgICAgU0VDX09NWF9EQVRBICAgICAgICAgICppbnB1dERhdGEgPSAmcFNFQ0NvbXBvbmVudC0+cHJvY2Vzc0RhdGFbSU5QVVRfUE9SVF9JTkRFWF07CisgICAgU0VDX09NWF9EQVRBICAgICAgICAgICpvdXRwdXREYXRhID0gJnBTRUNDb21wb25lbnQtPnByb2Nlc3NEYXRhW09VVFBVVF9QT1JUX0lOREVYXTsKKyAgICBPTVhfVTMyICAgICAgICAgICAgICAgIGNvcHlTaXplID0gMDsKKworICAgIHBTRUNDb21wb25lbnQtPnJlbWFpbk91dHB1dERhdGEgPSBPTVhfRkFMU0U7CisgICAgcFNFQ0NvbXBvbmVudC0+cmVJbnB1dERhdGEgPSBPTVhfRkFMU0U7CisKKyAgICBGdW5jdGlvbkluKCk7CisKKyAgICB3aGlsZSAoIXBTRUNDb21wb25lbnQtPmJFeGl0QnVmZmVyUHJvY2Vzc1RocmVhZCkgeworICAgICAgICBTRUNfT1NBTF9TbGVlcE1pbGxpc2VjKDApOworCisgICAgICAgIGlmICgoKHBTRUNDb21wb25lbnQtPmN1cnJlbnRTdGF0ZSA9PSBPTVhfU3RhdGVQYXVzZSkgfHwKKyAgICAgICAgICAgIChwU0VDQ29tcG9uZW50LT5jdXJyZW50U3RhdGUgPT0gT01YX1N0YXRlSWRsZSkgfHwKKyAgICAgICAgICAgIChwU0VDQ29tcG9uZW50LT50cmFuc2llbnRTdGF0ZSA9PSBTRUNfT01YX1RyYW5zU3RhdGVMb2FkZWRUb0lkbGUpIHx8CisgICAgICAgICAgICAocFNFQ0NvbXBvbmVudC0+dHJhbnNpZW50U3RhdGUgPT0gU0VDX09NWF9UcmFuc1N0YXRlRXhlY3V0aW5nVG9JZGxlKSkgJiYKKyAgICAgICAgICAgIChwU0VDQ29tcG9uZW50LT50cmFuc2llbnRTdGF0ZSAhPSBTRUNfT01YX1RyYW5zU3RhdGVJZGxlVG9Mb2FkZWQpJiYKKyAgICAgICAgICAgICgoIUNIRUNLX1BPUlRfQkVJTkdfRkxVU0hFRChzZWNJbnB1dFBvcnQpICYmICFDSEVDS19QT1JUX0JFSU5HX0ZMVVNIRUQoc2VjT3V0cHV0UG9ydCkpKSkgeworICAgICAgICAgICAgU0VDX09TQUxfU2lnbmFsV2FpdChwU0VDQ29tcG9uZW50LT5wYXVzZUV2ZW50LCBERUZfTUFYX1dBSVRfVElNRSk7CisgICAgICAgICAgICBTRUNfT1NBTF9TaWduYWxSZXNldChwU0VDQ29tcG9uZW50LT5wYXVzZUV2ZW50KTsKKyAgICAgICAgfQorCisgICAgICAgIHdoaWxlIChTRUNfQ2hlY2tfQnVmZmVyUHJvY2Vzc19TdGF0ZShwU0VDQ29tcG9uZW50KSAmJiAhcFNFQ0NvbXBvbmVudC0+YkV4aXRCdWZmZXJQcm9jZXNzVGhyZWFkKSB7CisgICAgICAgICAgICBTRUNfT1NBTF9TbGVlcE1pbGxpc2VjKDApOworCisgICAgICAgICAgICBTRUNfT1NBTF9NdXRleExvY2sob3V0cHV0VXNlQnVmZmVyLT5idWZmZXJNdXRleCk7CisgICAgICAgICAgICBpZiAoKG91dHB1dFVzZUJ1ZmZlci0+ZGF0YVZhbGlkICE9IE9NWF9UUlVFKSAmJgorICAgICAgICAgICAgICAgICghQ0hFQ0tfUE9SVF9CRUlOR19GTFVTSEVEKHNlY091dHB1dFBvcnQpKSkgeworICAgICAgICAgICAgICAgIFNFQ19PU0FMX011dGV4VW5sb2NrKG91dHB1dFVzZUJ1ZmZlci0+YnVmZmVyTXV0ZXgpOworICAgICAgICAgICAgICAgIHJldCA9IFNFQ19PdXRwdXRCdWZmZXJHZXRRdWV1ZShwU0VDQ29tcG9uZW50KTsKKyAgICAgICAgICAgICAgICBpZiAoKHJldCA9PSBPTVhfRXJyb3JVbmRlZmluZWQpIHx8CisgICAgICAgICAgICAgICAgICAgIChzZWNJbnB1dFBvcnQtPnBvcnRTdGF0ZSAhPSBPTVhfU3RhdGVJZGxlKSB8fAorICAgICAgICAgICAgICAgICAgICAoc2VjT3V0cHV0UG9ydC0+cG9ydFN0YXRlICE9IE9NWF9TdGF0ZUlkbGUpKSB7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgU0VDX09TQUxfTXV0ZXhVbmxvY2sob3V0cHV0VXNlQnVmZmVyLT5idWZmZXJNdXRleCk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGlmIChwU0VDQ29tcG9uZW50LT5yZW1haW5PdXRwdXREYXRhID09IE9NWF9GQUxTRSkgeworICAgICAgICAgICAgICAgIGlmIChwU0VDQ29tcG9uZW50LT5yZUlucHV0RGF0YSA9PSBPTVhfRkFMU0UpIHsKKyAgICAgICAgICAgICAgICAgICAgU0VDX09TQUxfTXV0ZXhMb2NrKGlucHV0VXNlQnVmZmVyLT5idWZmZXJNdXRleCk7CisgICAgICAgICAgICAgICAgICAgIGlmICgoU0VDX1ByZXByb2Nlc3Nvcl9JbnB1dERhdGEocE9NWENvbXBvbmVudCkgPT0gT01YX0ZBTFNFKSAmJgorICAgICAgICAgICAgICAgICAgICAgICAgKCFDSEVDS19QT1JUX0JFSU5HX0ZMVVNIRUQoc2VjSW5wdXRQb3J0KSkpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBTRUNfT1NBTF9NdXRleFVubG9jayhpbnB1dFVzZUJ1ZmZlci0+YnVmZmVyTXV0ZXgpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldCA9IFNFQ19JbnB1dEJ1ZmZlckdldFF1ZXVlKHBTRUNDb21wb25lbnQpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIFNFQ19PU0FMX011dGV4VW5sb2NrKGlucHV0VXNlQnVmZmVyLT5idWZmZXJNdXRleCk7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgU0VDX09TQUxfTXV0ZXhMb2NrKGlucHV0VXNlQnVmZmVyLT5idWZmZXJNdXRleCk7CisgICAgICAgICAgICAgICAgU0VDX09TQUxfTXV0ZXhMb2NrKG91dHB1dFVzZUJ1ZmZlci0+YnVmZmVyTXV0ZXgpOworICAgICAgICAgICAgICAgIHJldCA9IHBTRUNDb21wb25lbnQtPnNlY19tZmNfYnVmZmVyUHJvY2VzcyhwT01YQ29tcG9uZW50LCBpbnB1dERhdGEsIG91dHB1dERhdGEpOworCisgICAgICAgICAgICAgICAgaWYgKGlucHV0VXNlQnVmZmVyLT5yZW1haW5EYXRhTGVuID09IDApCisgICAgICAgICAgICAgICAgICAgIFNFQ19JbnB1dEJ1ZmZlclJldHVybihwT01YQ29tcG9uZW50KTsKKyAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgIGlucHV0VXNlQnVmZmVyLT5kYXRhVmFsaWQgPSBPTVhfVFJVRTsKKworICAgICAgICAgICAgICAgIFNFQ19PU0FMX011dGV4VW5sb2NrKG91dHB1dFVzZUJ1ZmZlci0+YnVmZmVyTXV0ZXgpOworICAgICAgICAgICAgICAgIFNFQ19PU0FMX011dGV4VW5sb2NrKGlucHV0VXNlQnVmZmVyLT5idWZmZXJNdXRleCk7CisKKyAgICAgICAgICAgICAgICBpZiAocmV0ID09IE9NWF9FcnJvcklucHV0RGF0YUVuY29kZVlldCkKKyAgICAgICAgICAgICAgICAgICAgcFNFQ0NvbXBvbmVudC0+cmVJbnB1dERhdGEgPSBPTVhfVFJVRTsKKyAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgIHBTRUNDb21wb25lbnQtPnJlSW5wdXREYXRhID0gT01YX0ZBTFNFOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBTRUNfT1NBTF9NdXRleExvY2sob3V0cHV0VXNlQnVmZmVyLT5idWZmZXJNdXRleCk7CisKKyAgICAgICAgICAgIGlmIChTRUNfUG9zdHByb2Nlc3NfT3V0cHV0RGF0YShwT01YQ29tcG9uZW50KSA9PSBPTVhfRkFMU0UpCisgICAgICAgICAgICAgICAgcFNFQ0NvbXBvbmVudC0+cmVtYWluT3V0cHV0RGF0YSA9IE9NWF9UUlVFOworICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgIHBTRUNDb21wb25lbnQtPnJlbWFpbk91dHB1dERhdGEgPSBPTVhfRkFMU0U7CisKKyAgICAgICAgICAgIFNFQ19PU0FMX011dGV4VW5sb2NrKG91dHB1dFVzZUJ1ZmZlci0+YnVmZmVyTXV0ZXgpOworICAgICAgICB9CisgICAgfQorCitFWElUOgorICAgIEZ1bmN0aW9uT3V0KCk7CisKKyAgICByZXR1cm4gcmV0OworfQorCitPTVhfRVJST1JUWVBFIFNFQ19PTVhfVmlkZW9FbmNvZGVHZXRQYXJhbWV0ZXIoCisgICAgT01YX0lOIE9NWF9IQU5ETEVUWVBFIGhDb21wb25lbnQsCisgICAgT01YX0lOIE9NWF9JTkRFWFRZUEUgIG5QYXJhbUluZGV4LAorICAgIE9NWF9JTk9VVCBPTVhfUFRSICAgICBDb21wb25lbnRQYXJhbWV0ZXJTdHJ1Y3R1cmUpCit7CisgICAgT01YX0VSUk9SVFlQRSAgICAgICAgICByZXQgPSBPTVhfRXJyb3JOb25lOworICAgIE9NWF9DT01QT05FTlRUWVBFICAgICAqcE9NWENvbXBvbmVudCA9IE5VTEw7CisgICAgU0VDX09NWF9CQVNFQ09NUE9ORU5UICpwU0VDQ29tcG9uZW50ID0gTlVMTDsKKyAgICBTRUNfT01YX0JBU0VQT1JUICAgICAgKnBTRUNQb3J0ID0gTlVMTDsKKworICAgIEZ1bmN0aW9uSW4oKTsKKworICAgIGlmIChoQ29tcG9uZW50ID09IE5VTEwpIHsKKyAgICAgICAgcmV0ID0gT01YX0Vycm9yQmFkUGFyYW1ldGVyOworICAgICAgICBnb3RvIEVYSVQ7CisgICAgfQorICAgIHBPTVhDb21wb25lbnQgPSAoT01YX0NPTVBPTkVOVFRZUEUgKiloQ29tcG9uZW50OworICAgIHJldCA9IFNFQ19PTVhfQ2hlY2tfU2l6ZVZlcnNpb24ocE9NWENvbXBvbmVudCwgc2l6ZW9mKE9NWF9DT01QT05FTlRUWVBFKSk7CisgICAgaWYgKHJldCAhPSBPTVhfRXJyb3JOb25lKSB7CisgICAgICAgIGdvdG8gRVhJVDsKKyAgICB9CisKKyAgICBpZiAocE9NWENvbXBvbmVudC0+cENvbXBvbmVudFByaXZhdGUgPT0gTlVMTCkgeworICAgICAgICByZXQgPSBPTVhfRXJyb3JCYWRQYXJhbWV0ZXI7CisgICAgICAgIGdvdG8gRVhJVDsKKyAgICB9CisgICAgcFNFQ0NvbXBvbmVudCA9IChTRUNfT01YX0JBU0VDT01QT05FTlQgKilwT01YQ29tcG9uZW50LT5wQ29tcG9uZW50UHJpdmF0ZTsKKworICAgIGlmIChwU0VDQ29tcG9uZW50LT5jdXJyZW50U3RhdGUgPT0gT01YX1N0YXRlSW52YWxpZCApIHsKKyAgICAgICAgcmV0ID0gT01YX0Vycm9ySW52YWxpZFN0YXRlOworICAgICAgICBnb3RvIEVYSVQ7CisgICAgfQorCisgICAgaWYgKENvbXBvbmVudFBhcmFtZXRlclN0cnVjdHVyZSA9PSBOVUxMKSB7CisgICAgICAgIHJldCA9IE9NWF9FcnJvckJhZFBhcmFtZXRlcjsKKyAgICAgICAgZ290byBFWElUOworICAgIH0KKworICAgIHN3aXRjaCAoblBhcmFtSW5kZXgpIHsKKyAgICBjYXNlIE9NWF9JbmRleFBhcmFtVmlkZW9Jbml0OgorICAgIHsKKyAgICAgICAgT01YX1BPUlRfUEFSQU1fVFlQRSAqcG9ydFBhcmFtID0gKE9NWF9QT1JUX1BBUkFNX1RZUEUgKilDb21wb25lbnRQYXJhbWV0ZXJTdHJ1Y3R1cmU7CisgICAgICAgIHJldCA9IFNFQ19PTVhfQ2hlY2tfU2l6ZVZlcnNpb24ocG9ydFBhcmFtLCBzaXplb2YoT01YX1BPUlRfUEFSQU1fVFlQRSkpOworICAgICAgICBpZiAocmV0ICE9IE9NWF9FcnJvck5vbmUpIHsKKyAgICAgICAgICAgIGdvdG8gRVhJVDsKKyAgICAgICAgfQorCisgICAgICAgIHBvcnRQYXJhbS0+blBvcnRzICAgICAgICAgICA9IHBTRUNDb21wb25lbnQtPnBvcnRQYXJhbS5uUG9ydHM7CisgICAgICAgIHBvcnRQYXJhbS0+blN0YXJ0UG9ydE51bWJlciA9IHBTRUNDb21wb25lbnQtPnBvcnRQYXJhbS5uU3RhcnRQb3J0TnVtYmVyOworICAgICAgICByZXQgPSBPTVhfRXJyb3JOb25lOworICAgIH0KKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBPTVhfSW5kZXhQYXJhbVZpZGVvUG9ydEZvcm1hdDoKKyAgICB7CisgICAgICAgIE9NWF9WSURFT19QQVJBTV9QT1JURk9STUFUVFlQRSAqcG9ydEZvcm1hdCA9IChPTVhfVklERU9fUEFSQU1fUE9SVEZPUk1BVFRZUEUgKilDb21wb25lbnRQYXJhbWV0ZXJTdHJ1Y3R1cmU7CisgICAgICAgIE9NWF9VMzIgICAgICAgICAgICAgICAgICAgICAgICAgcG9ydEluZGV4ID0gcG9ydEZvcm1hdC0+blBvcnRJbmRleDsKKyAgICAgICAgT01YX1UzMiAgICAgICAgICAgICAgICAgICAgICAgICBpbmRleCAgICA9IHBvcnRGb3JtYXQtPm5JbmRleDsKKyAgICAgICAgU0VDX09NWF9CQVNFUE9SVCAgICAgICAgICAgICAgICpwU0VDUG9ydCA9IE5VTEw7CisgICAgICAgIE9NWF9QQVJBTV9QT1JUREVGSU5JVElPTlRZUEUgICAqcG9ydERlZmluaXRpb24gPSBOVUxMOworICAgICAgICBPTVhfVTMyICAgICAgICAgICAgICAgICAgICAgICAgIHN1cHBvcnRGb3JtYXROdW0gPSAwOworCisgICAgICAgIHJldCA9IFNFQ19PTVhfQ2hlY2tfU2l6ZVZlcnNpb24ocG9ydEZvcm1hdCwgc2l6ZW9mKE9NWF9WSURFT19QQVJBTV9QT1JURk9STUFUVFlQRSkpOworICAgICAgICBpZiAocmV0ICE9IE9NWF9FcnJvck5vbmUpIHsKKyAgICAgICAgICAgIGdvdG8gRVhJVDsKKyAgICAgICAgfQorCisgICAgICAgIGlmICgocG9ydEluZGV4ID49IHBTRUNDb21wb25lbnQtPnBvcnRQYXJhbS5uUG9ydHMpKSB7CisgICAgICAgICAgICByZXQgPSBPTVhfRXJyb3JCYWRQb3J0SW5kZXg7CisgICAgICAgICAgICBnb3RvIEVYSVQ7CisgICAgICAgIH0KKworCisgICAgICAgIGlmIChwb3J0SW5kZXggPT0gSU5QVVRfUE9SVF9JTkRFWCkgeworICAgICAgICAgICAgc3VwcG9ydEZvcm1hdE51bSA9IElOUFVUX1BPUlRfU1VQUE9SVEZPUk1BVF9OVU1fTUFYIC0gMTsKKyAgICAgICAgICAgIGlmIChpbmRleCA+IHN1cHBvcnRGb3JtYXROdW0pIHsKKyAgICAgICAgICAgICAgICByZXQgPSBPTVhfRXJyb3JOb01vcmU7CisgICAgICAgICAgICAgICAgZ290byBFWElUOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBwU0VDUG9ydCA9ICZwU0VDQ29tcG9uZW50LT5wU0VDUG9ydFtJTlBVVF9QT1JUX0lOREVYXTsKKyAgICAgICAgICAgIHBvcnREZWZpbml0aW9uID0gJnBTRUNQb3J0LT5wb3J0RGVmaW5pdGlvbjsKKworICAgICAgICAgICAgc3dpdGNoIChpbmRleCkgeworICAgICAgICAgICAgY2FzZSBzdXBwb3J0Rm9ybWF0XzA6CisgICAgICAgICAgICAgICAgcG9ydEZvcm1hdC0+ZUNvbXByZXNzaW9uRm9ybWF0ID0gT01YX1ZJREVPX0NvZGluZ1VudXNlZDsKKyAgICAgICAgICAgICAgICBwb3J0Rm9ybWF0LT5lQ29sb3JGb3JtYXQgICAgICAgPSBPTVhfQ09MT1JfRm9ybWF0WVVWNDIwUGxhbmFyOworICAgICAgICAgICAgICAgIHBvcnRGb3JtYXQtPnhGcmFtZXJhdGUgICAgICAgICAgID0gcG9ydERlZmluaXRpb24tPmZvcm1hdC52aWRlby54RnJhbWVyYXRlOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBzdXBwb3J0Rm9ybWF0XzE6CisgICAgICAgICAgICAgICAgcG9ydEZvcm1hdC0+ZUNvbXByZXNzaW9uRm9ybWF0ID0gT01YX1ZJREVPX0NvZGluZ1VudXNlZDsKKyAgICAgICAgICAgICAgICBwb3J0Rm9ybWF0LT5lQ29sb3JGb3JtYXQgICAgICAgPSBPTVhfU0VDX0NPTE9SX0Zvcm1hdE5WMTJUUGh5c2ljYWxBZGRyZXNzOworICAgICAgICAgICAgICAgIHBvcnRGb3JtYXQtPnhGcmFtZXJhdGUgICAgICAgICA9IHBvcnREZWZpbml0aW9uLT5mb3JtYXQudmlkZW8ueEZyYW1lcmF0ZTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2Ugc3VwcG9ydEZvcm1hdF8yOgorICAgICAgICAgICAgICAgIHBvcnRGb3JtYXQtPmVDb21wcmVzc2lvbkZvcm1hdCA9IE9NWF9WSURFT19Db2RpbmdVbnVzZWQ7CisgICAgICAgICAgICAgICAgcG9ydEZvcm1hdC0+ZUNvbG9yRm9ybWF0ICAgICAgID0gT01YX1NFQ19DT0xPUl9Gb3JtYXROVjEyTFBoeXNpY2FsQWRkcmVzczsKKyAgICAgICAgICAgICAgICBwb3J0Rm9ybWF0LT54RnJhbWVyYXRlICAgICAgICAgICA9IHBvcnREZWZpbml0aW9uLT5mb3JtYXQudmlkZW8ueEZyYW1lcmF0ZTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2Ugc3VwcG9ydEZvcm1hdF8zOgorICAgICAgICAgICAgICAgIHBvcnRGb3JtYXQtPmVDb21wcmVzc2lvbkZvcm1hdCA9IE9NWF9WSURFT19Db2RpbmdVbnVzZWQ7CisgICAgICAgICAgICAgICAgcG9ydEZvcm1hdC0+ZUNvbG9yRm9ybWF0ICAgICAgID0gT01YX0NPTE9SX0Zvcm1hdFlVVjQyMFNlbWlQbGFuYXI7CisgICAgICAgICAgICAgICAgcG9ydEZvcm1hdC0+eEZyYW1lcmF0ZSAgICAgICAgID0gcG9ydERlZmluaXRpb24tPmZvcm1hdC52aWRlby54RnJhbWVyYXRlOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBzdXBwb3J0Rm9ybWF0XzQ6CisgICAgICAgICAgICAgICAgcG9ydEZvcm1hdC0+ZUNvbXByZXNzaW9uRm9ybWF0ID0gT01YX1ZJREVPX0NvZGluZ1VudXNlZDsKKyAgICAgICAgICAgICAgICBwb3J0Rm9ybWF0LT5lQ29sb3JGb3JtYXQgICAgICAgPSBPTVhfU0VDX0NPTE9SX0Zvcm1hdE5WMTJUaWxlZDsKKyAgICAgICAgICAgICAgICBwb3J0Rm9ybWF0LT54RnJhbWVyYXRlICAgICAgICAgPSBwb3J0RGVmaW5pdGlvbi0+Zm9ybWF0LnZpZGVvLnhGcmFtZXJhdGU7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIHN1cHBvcnRGb3JtYXRfNToKKyAgICAgICAgICAgICAgICBwb3J0Rm9ybWF0LT5lQ29tcHJlc3Npb25Gb3JtYXQgPSBPTVhfVklERU9fQ29kaW5nVW51c2VkOworICAgICAgICAgICAgICAgIHBvcnRGb3JtYXQtPmVDb2xvckZvcm1hdCAgICAgICA9IE9NWF9TRUNfQ09MT1JfRm9ybWF0TlYxMkxWaXJ0dWFsQWRkcmVzczsKKyAgICAgICAgICAgICAgICBwb3J0Rm9ybWF0LT54RnJhbWVyYXRlICAgICAgICAgPSBwb3J0RGVmaW5pdGlvbi0+Zm9ybWF0LnZpZGVvLnhGcmFtZXJhdGU7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIHN1cHBvcnRGb3JtYXRfNjoKKyAgICAgICAgICAgICAgICBwb3J0Rm9ybWF0LT5lQ29tcHJlc3Npb25Gb3JtYXQgPSBPTVhfVklERU9fQ29kaW5nVW51c2VkOworICAgICAgICAgICAgICAgIHBvcnRGb3JtYXQtPmVDb2xvckZvcm1hdCAgICAgICA9IE9NWF9TRUNfQ09MT1JfRm9ybWF0TlYyMUxQaHlzaWNhbEFkZHJlc3M7CisgICAgICAgICAgICAgICAgcG9ydEZvcm1hdC0+eEZyYW1lcmF0ZSAgICAgICAgID0gcG9ydERlZmluaXRpb24tPmZvcm1hdC52aWRlby54RnJhbWVyYXRlOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBzdXBwb3J0Rm9ybWF0Xzc6CisgICAgICAgICAgICAgICAgcG9ydEZvcm1hdC0+ZUNvbXByZXNzaW9uRm9ybWF0ID0gT01YX1ZJREVPX0NvZGluZ1VudXNlZDsKKyAgICAgICAgICAgICAgICBwb3J0Rm9ybWF0LT5lQ29sb3JGb3JtYXQgICAgICAgPSBPTVhfU0VDX0NPTE9SX0Zvcm1hdE5WMjFMaW5lYXI7CisgICAgICAgICAgICAgICAgcG9ydEZvcm1hdC0+eEZyYW1lcmF0ZSAgICAgICAgID0gcG9ydERlZmluaXRpb24tPmZvcm1hdC52aWRlby54RnJhbWVyYXRlOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBzdXBwb3J0Rm9ybWF0Xzg6CisgICAgICAgICAgICAgICAgcG9ydEZvcm1hdC0+ZUNvbXByZXNzaW9uRm9ybWF0ID0gT01YX1ZJREVPX0NvZGluZ1VudXNlZDsKKyAgICAgICAgICAgICAgICBwb3J0Rm9ybWF0LT5lQ29sb3JGb3JtYXQgICAgICAgPSBPTVhfQ09MT1JfRm9ybWF0QW5kcm9pZE9wYXF1ZTsKKyAgICAgICAgICAgICAgICBwb3J0Rm9ybWF0LT54RnJhbWVyYXRlICAgICAgICAgPSBwb3J0RGVmaW5pdGlvbi0+Zm9ybWF0LnZpZGVvLnhGcmFtZXJhdGU7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgIH0gZWxzZSBpZiAocG9ydEluZGV4ID09IE9VVFBVVF9QT1JUX0lOREVYKSB7CisgICAgICAgICAgICBzdXBwb3J0Rm9ybWF0TnVtID0gT1VUUFVUX1BPUlRfU1VQUE9SVEZPUk1BVF9OVU1fTUFYIC0gMTsKKyAgICAgICAgICAgIGlmIChpbmRleCA+IHN1cHBvcnRGb3JtYXROdW0pIHsKKyAgICAgICAgICAgICAgICByZXQgPSBPTVhfRXJyb3JOb01vcmU7CisgICAgICAgICAgICAgICAgZ290byBFWElUOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBwU0VDUG9ydCA9ICZwU0VDQ29tcG9uZW50LT5wU0VDUG9ydFtPVVRQVVRfUE9SVF9JTkRFWF07CisgICAgICAgICAgICBwb3J0RGVmaW5pdGlvbiA9ICZwU0VDUG9ydC0+cG9ydERlZmluaXRpb247CisKKyAgICAgICAgICAgIHBvcnRGb3JtYXQtPmVDb21wcmVzc2lvbkZvcm1hdCA9IHBvcnREZWZpbml0aW9uLT5mb3JtYXQudmlkZW8uZUNvbXByZXNzaW9uRm9ybWF0OworICAgICAgICAgICAgcG9ydEZvcm1hdC0+ZUNvbG9yRm9ybWF0ICAgICAgID0gcG9ydERlZmluaXRpb24tPmZvcm1hdC52aWRlby5lQ29sb3JGb3JtYXQ7CisgICAgICAgICAgICBwb3J0Rm9ybWF0LT54RnJhbWVyYXRlICAgICAgICAgICA9IHBvcnREZWZpbml0aW9uLT5mb3JtYXQudmlkZW8ueEZyYW1lcmF0ZTsKKyAgICAgICAgfQorICAgICAgICByZXQgPSBPTVhfRXJyb3JOb25lOworICAgIH0KKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBPTVhfSW5kZXhQYXJhbVZpZGVvQml0cmF0ZToKKyAgICB7CisgICAgICAgIE9NWF9WSURFT19QQVJBTV9CSVRSQVRFVFlQRSAgKnZpZGVvUmF0ZUNvbnRyb2wgPSAoT01YX1ZJREVPX1BBUkFNX0JJVFJBVEVUWVBFICopQ29tcG9uZW50UGFyYW1ldGVyU3RydWN0dXJlOworICAgICAgICBPTVhfVTMyICAgICAgICAgICAgICAgICAgICAgICBwb3J0SW5kZXggPSB2aWRlb1JhdGVDb250cm9sLT5uUG9ydEluZGV4OworICAgICAgICBTRUNfT01YX0JBU0VQT1JUICAgICAgICAgKnBTRUNQb3J0ID0gTlVMTDsKKyAgICAgICAgU0VDX09NWF9WSURFT0VOQ19DT01QT05FTlQgICAqcFZpZGVvRW5jID0gTlVMTDsKKyAgICAgICAgT01YX1BBUkFNX1BPUlRERUZJTklUSU9OVFlQRSAqcG9ydERlZmluaXRpb24gPSBOVUxMOworCisgICAgICAgIGlmICgocG9ydEluZGV4ICE9IE9VVFBVVF9QT1JUX0lOREVYKSkgeworICAgICAgICAgICAgcmV0ID0gT01YX0Vycm9yQmFkUG9ydEluZGV4OworICAgICAgICAgICAgZ290byBFWElUOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgcFZpZGVvRW5jID0gKFNFQ19PTVhfVklERU9FTkNfQ09NUE9ORU5UICopcFNFQ0NvbXBvbmVudC0+aENvbXBvbmVudEhhbmRsZTsKKyAgICAgICAgICAgIHBTRUNQb3J0ID0gJnBTRUNDb21wb25lbnQtPnBTRUNQb3J0W3BvcnRJbmRleF07CisgICAgICAgICAgICBwb3J0RGVmaW5pdGlvbiA9ICZwU0VDUG9ydC0+cG9ydERlZmluaXRpb247CisKKyAgICAgICAgICAgIHZpZGVvUmF0ZUNvbnRyb2wtPmVDb250cm9sUmF0ZSA9IHBWaWRlb0VuYy0+ZUNvbnRyb2xSYXRlW3BvcnRJbmRleF07CisgICAgICAgICAgICB2aWRlb1JhdGVDb250cm9sLT5uVGFyZ2V0Qml0cmF0ZSA9IHBvcnREZWZpbml0aW9uLT5mb3JtYXQudmlkZW8ubkJpdHJhdGU7CisgICAgICAgIH0KKyAgICAgICAgcmV0ID0gT01YX0Vycm9yTm9uZTsKKyAgICB9CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgT01YX0luZGV4UGFyYW1WaWRlb1F1YW50aXphdGlvbjoKKyAgICB7CisgICAgICAgIE9NWF9WSURFT19QQVJBTV9RVUFOVElaQVRJT05UWVBFICAqdmlkZW9RdWFudGl6YXRpb25Db250cm9sID0gKE9NWF9WSURFT19QQVJBTV9RVUFOVElaQVRJT05UWVBFICopQ29tcG9uZW50UGFyYW1ldGVyU3RydWN0dXJlOworICAgICAgICBPTVhfVTMyICAgICAgICAgICAgICAgICAgICAgICBwb3J0SW5kZXggPSB2aWRlb1F1YW50aXphdGlvbkNvbnRyb2wtPm5Qb3J0SW5kZXg7CisgICAgICAgIFNFQ19PTVhfQkFTRVBPUlQgICAgICAgICAqcFNFQ1BvcnQgPSBOVUxMOworICAgICAgICBTRUNfT01YX1ZJREVPRU5DX0NPTVBPTkVOVCAgICpwVmlkZW9FbmMgPSBOVUxMOworICAgICAgICBPTVhfUEFSQU1fUE9SVERFRklOSVRJT05UWVBFICpwb3J0RGVmaW5pdGlvbiA9IE5VTEw7CisKKyAgICAgICAgaWYgKChwb3J0SW5kZXggIT0gT1VUUFVUX1BPUlRfSU5ERVgpKSB7CisgICAgICAgICAgICByZXQgPSBPTVhfRXJyb3JCYWRQb3J0SW5kZXg7CisgICAgICAgICAgICBnb3RvIEVYSVQ7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBwVmlkZW9FbmMgPSAoU0VDX09NWF9WSURFT0VOQ19DT01QT05FTlQgKilwU0VDQ29tcG9uZW50LT5oQ29tcG9uZW50SGFuZGxlOworICAgICAgICAgICAgcFNFQ1BvcnQgPSAmcFNFQ0NvbXBvbmVudC0+cFNFQ1BvcnRbcG9ydEluZGV4XTsKKyAgICAgICAgICAgIHBvcnREZWZpbml0aW9uID0gJnBTRUNQb3J0LT5wb3J0RGVmaW5pdGlvbjsKKworICAgICAgICAgICAgdmlkZW9RdWFudGl6YXRpb25Db250cm9sLT5uUXBJID0gcFZpZGVvRW5jLT5xdWFudGl6YXRpb24ublFwSTsKKyAgICAgICAgICAgIHZpZGVvUXVhbnRpemF0aW9uQ29udHJvbC0+blFwUCA9IHBWaWRlb0VuYy0+cXVhbnRpemF0aW9uLm5RcFA7CisgICAgICAgICAgICB2aWRlb1F1YW50aXphdGlvbkNvbnRyb2wtPm5RcEIgPSBwVmlkZW9FbmMtPnF1YW50aXphdGlvbi5uUXBCOworICAgICAgICB9CisgICAgICAgIHJldCA9IE9NWF9FcnJvck5vbmU7CisKKyAgICB9CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgT01YX0luZGV4UGFyYW1Qb3J0RGVmaW5pdGlvbjoKKyAgICB7CisgICAgICAgIE9NWF9QQVJBTV9QT1JUREVGSU5JVElPTlRZUEUgKnBvcnREZWZpbml0aW9uID0gKE9NWF9QQVJBTV9QT1JUREVGSU5JVElPTlRZUEUgKilDb21wb25lbnRQYXJhbWV0ZXJTdHJ1Y3R1cmU7CisgICAgICAgIE9NWF9VMzIgICAgICAgICAgICAgICAgICAgICAgIHBvcnRJbmRleCA9IHBvcnREZWZpbml0aW9uLT5uUG9ydEluZGV4OworICAgICAgICBTRUNfT01YX0JBU0VQT1JUICAgICAgICAgICAgICpwU0VDUG9ydDsKKworICAgICAgICBpZiAocG9ydEluZGV4ID49IHBTRUNDb21wb25lbnQtPnBvcnRQYXJhbS5uUG9ydHMpIHsKKyAgICAgICAgICAgIHJldCA9IE9NWF9FcnJvckJhZFBvcnRJbmRleDsKKyAgICAgICAgICAgIGdvdG8gRVhJVDsKKyAgICAgICAgfQorICAgICAgICByZXQgPSBTRUNfT01YX0NoZWNrX1NpemVWZXJzaW9uKHBvcnREZWZpbml0aW9uLCBzaXplb2YoT01YX1BBUkFNX1BPUlRERUZJTklUSU9OVFlQRSkpOworICAgICAgICBpZiAocmV0ICE9IE9NWF9FcnJvck5vbmUpIHsKKyAgICAgICAgICAgIGdvdG8gRVhJVDsKKyAgICAgICAgfQorCisgICAgICAgIHBTRUNQb3J0ID0gJnBTRUNDb21wb25lbnQtPnBTRUNQb3J0W3BvcnRJbmRleF07CisgICAgICAgIFNFQ19PU0FMX01lbWNweShwb3J0RGVmaW5pdGlvbiwgJnBTRUNQb3J0LT5wb3J0RGVmaW5pdGlvbiwgcG9ydERlZmluaXRpb24tPm5TaXplKTsKKworI2lmZGVmIFVTRV9TVE9SRU1FVEFEQVRBCisgICAgICAgIGlmICgocG9ydEluZGV4ID09IDApICYmCisgICAgICAgICAgICAocFNFQ1BvcnQtPmJTdG9yZU1ldGFEYXRhID09IE9NWF9UUlVFKSAmJgorICAgICAgICAgICAgKHBTRUNQb3J0LT5wb3J0RGVmaW5pdGlvbi5mb3JtYXQudmlkZW8uZUNvbG9yRm9ybWF0ICE9IE9NWF9TRUNfQ09MT1JfRm9ybWF0TlYxMkxWaXJ0dWFsQWRkcmVzcykpIHsKKyAgICAgICAgICAgIHBvcnREZWZpbml0aW9uLT5uQnVmZmVyU2l6ZSA9IE1BWF9JTlBVVF9NRVRBREFUQV9CVUZGRVJfU0laRTsKKyAgICAgICAgfQorI2VuZGlmCisgICAgfQorICAgICAgICBicmVhazsKKyAgICBkZWZhdWx0OgorICAgIHsKKyAgICAgICAgcmV0ID0gU0VDX09NWF9HZXRQYXJhbWV0ZXIoaENvbXBvbmVudCwgblBhcmFtSW5kZXgsIENvbXBvbmVudFBhcmFtZXRlclN0cnVjdHVyZSk7CisgICAgfQorICAgICAgICBicmVhazsKKyAgICB9CisKK0VYSVQ6CisgICAgRnVuY3Rpb25PdXQoKTsKKworICAgIHJldHVybiByZXQ7Cit9CitPTVhfRVJST1JUWVBFIFNFQ19PTVhfVmlkZW9FbmNvZGVTZXRQYXJhbWV0ZXIoCisgICAgT01YX0lOIE9NWF9IQU5ETEVUWVBFIGhDb21wb25lbnQsCisgICAgT01YX0lOIE9NWF9JTkRFWFRZUEUgIG5JbmRleCwKKyAgICBPTVhfSU4gT01YX1BUUiAgICAgICAgQ29tcG9uZW50UGFyYW1ldGVyU3RydWN0dXJlKQoreworICAgIE9NWF9FUlJPUlRZUEUgICAgICAgICAgcmV0ID0gT01YX0Vycm9yTm9uZTsKKyAgICBPTVhfQ09NUE9ORU5UVFlQRSAgICAgKnBPTVhDb21wb25lbnQgPSBOVUxMOworICAgIFNFQ19PTVhfQkFTRUNPTVBPTkVOVCAqcFNFQ0NvbXBvbmVudCA9IE5VTEw7CisgICAgU0VDX09NWF9CQVNFUE9SVCAgICAgICpwU0VDUG9ydCA9IE5VTEw7CisKKyAgICBGdW5jdGlvbkluKCk7CisKKyAgICBpZiAoaENvbXBvbmVudCA9PSBOVUxMKSB7CisgICAgICAgIHJldCA9IE9NWF9FcnJvckJhZFBhcmFtZXRlcjsKKyAgICAgICAgZ290byBFWElUOworICAgIH0KKyAgICBwT01YQ29tcG9uZW50ID0gKE9NWF9DT01QT05FTlRUWVBFICopaENvbXBvbmVudDsKKyAgICByZXQgPSBTRUNfT01YX0NoZWNrX1NpemVWZXJzaW9uKHBPTVhDb21wb25lbnQsIHNpemVvZihPTVhfQ09NUE9ORU5UVFlQRSkpOworICAgIGlmIChyZXQgIT0gT01YX0Vycm9yTm9uZSkgeworICAgICAgICBnb3RvIEVYSVQ7CisgICAgfQorCisgICAgaWYgKHBPTVhDb21wb25lbnQtPnBDb21wb25lbnRQcml2YXRlID09IE5VTEwpIHsKKyAgICAgICAgcmV0ID0gT01YX0Vycm9yQmFkUGFyYW1ldGVyOworICAgICAgICBnb3RvIEVYSVQ7CisgICAgfQorICAgIHBTRUNDb21wb25lbnQgPSAoU0VDX09NWF9CQVNFQ09NUE9ORU5UICopcE9NWENvbXBvbmVudC0+cENvbXBvbmVudFByaXZhdGU7CisKKyAgICBpZiAocFNFQ0NvbXBvbmVudC0+Y3VycmVudFN0YXRlID09IE9NWF9TdGF0ZUludmFsaWQgKSB7CisgICAgICAgIHJldCA9IE9NWF9FcnJvckludmFsaWRTdGF0ZTsKKyAgICAgICAgZ290byBFWElUOworICAgIH0KKworICAgIGlmIChDb21wb25lbnRQYXJhbWV0ZXJTdHJ1Y3R1cmUgPT0gTlVMTCkgeworICAgICAgICByZXQgPSBPTVhfRXJyb3JCYWRQYXJhbWV0ZXI7CisgICAgICAgIGdvdG8gRVhJVDsKKyAgICB9CisKKyAgICBzd2l0Y2ggKG5JbmRleCkgeworICAgIGNhc2UgT01YX0luZGV4UGFyYW1WaWRlb1BvcnRGb3JtYXQ6CisgICAgeworICAgICAgICBPTVhfVklERU9fUEFSQU1fUE9SVEZPUk1BVFRZUEUgKnBvcnRGb3JtYXQgPSAoT01YX1ZJREVPX1BBUkFNX1BPUlRGT1JNQVRUWVBFICopQ29tcG9uZW50UGFyYW1ldGVyU3RydWN0dXJlOworICAgICAgICBPTVhfVTMyICAgICAgICAgICAgICAgICAgICAgICAgIHBvcnRJbmRleCA9IHBvcnRGb3JtYXQtPm5Qb3J0SW5kZXg7CisgICAgICAgIE9NWF9VMzIgICAgICAgICAgICAgICAgICAgICAgICAgaW5kZXggICAgPSBwb3J0Rm9ybWF0LT5uSW5kZXg7CisgICAgICAgIFNFQ19PTVhfQkFTRVBPUlQgICAgICAgICAgICAgICAqcFNFQ1BvcnQgPSBOVUxMOworICAgICAgICBPTVhfUEFSQU1fUE9SVERFRklOSVRJT05UWVBFICAgKnBvcnREZWZpbml0aW9uID0gTlVMTDsKKyAgICAgICAgT01YX1UzMiAgICAgICAgICAgICAgICAgICAgICAgICBzdXBwb3J0Rm9ybWF0TnVtID0gMDsKKworICAgICAgICByZXQgPSBTRUNfT01YX0NoZWNrX1NpemVWZXJzaW9uKHBvcnRGb3JtYXQsIHNpemVvZihPTVhfVklERU9fUEFSQU1fUE9SVEZPUk1BVFRZUEUpKTsKKyAgICAgICAgaWYgKHJldCAhPSBPTVhfRXJyb3JOb25lKSB7CisgICAgICAgICAgICBnb3RvIEVYSVQ7CisgICAgICAgIH0KKworICAgICAgICBpZiAoKHBvcnRJbmRleCA+PSBwU0VDQ29tcG9uZW50LT5wb3J0UGFyYW0ublBvcnRzKSkgeworICAgICAgICAgICAgcmV0ID0gT01YX0Vycm9yQmFkUG9ydEluZGV4OworICAgICAgICAgICAgZ290byBFWElUOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgcFNFQ1BvcnQgPSAmcFNFQ0NvbXBvbmVudC0+cFNFQ1BvcnRbcG9ydEluZGV4XTsKKyAgICAgICAgICAgIHBvcnREZWZpbml0aW9uID0gJnBTRUNQb3J0LT5wb3J0RGVmaW5pdGlvbjsKKworICAgICAgICAgICAgcG9ydERlZmluaXRpb24tPmZvcm1hdC52aWRlby5lQ29sb3JGb3JtYXQgICAgICAgPSBwb3J0Rm9ybWF0LT5lQ29sb3JGb3JtYXQ7CisgICAgICAgICAgICBwb3J0RGVmaW5pdGlvbi0+Zm9ybWF0LnZpZGVvLmVDb21wcmVzc2lvbkZvcm1hdCA9IHBvcnRGb3JtYXQtPmVDb21wcmVzc2lvbkZvcm1hdDsKKyAgICAgICAgICAgIHBvcnREZWZpbml0aW9uLT5mb3JtYXQudmlkZW8ueEZyYW1lcmF0ZSAgICAgICAgID0gcG9ydEZvcm1hdC0+eEZyYW1lcmF0ZTsKKyAgICAgICAgfQorICAgIH0KKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBPTVhfSW5kZXhQYXJhbVZpZGVvQml0cmF0ZToKKyAgICB7CisgICAgICAgIE9NWF9WSURFT19QQVJBTV9CSVRSQVRFVFlQRSAgKnZpZGVvUmF0ZUNvbnRyb2wgPSAoT01YX1ZJREVPX1BBUkFNX0JJVFJBVEVUWVBFICopQ29tcG9uZW50UGFyYW1ldGVyU3RydWN0dXJlOworICAgICAgICBPTVhfVTMyICAgICAgICAgICAgICAgICAgICAgICBwb3J0SW5kZXggPSB2aWRlb1JhdGVDb250cm9sLT5uUG9ydEluZGV4OworICAgICAgICBTRUNfT01YX0JBU0VQT1JUICAgICAgICAgICAgICpwU0VDUG9ydCA9IE5VTEw7CisgICAgICAgIFNFQ19PTVhfVklERU9FTkNfQ09NUE9ORU5UICAgKnBWaWRlb0VuYyA9IE5VTEw7CisgICAgICAgIE9NWF9QQVJBTV9QT1JUREVGSU5JVElPTlRZUEUgKnBvcnREZWZpbml0aW9uID0gTlVMTDsKKworICAgICAgICBpZiAoKHBvcnRJbmRleCAhPSBPVVRQVVRfUE9SVF9JTkRFWCkpIHsKKyAgICAgICAgICAgIHJldCA9IE9NWF9FcnJvckJhZFBvcnRJbmRleDsKKyAgICAgICAgICAgIGdvdG8gRVhJVDsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHBWaWRlb0VuYyA9IChTRUNfT01YX1ZJREVPRU5DX0NPTVBPTkVOVCAqKXBTRUNDb21wb25lbnQtPmhDb21wb25lbnRIYW5kbGU7CisgICAgICAgICAgICBwU0VDUG9ydCA9ICZwU0VDQ29tcG9uZW50LT5wU0VDUG9ydFtwb3J0SW5kZXhdOworICAgICAgICAgICAgcG9ydERlZmluaXRpb24gPSAmcFNFQ1BvcnQtPnBvcnREZWZpbml0aW9uOworCisgICAgICAgICAgICBwVmlkZW9FbmMtPmVDb250cm9sUmF0ZVtwb3J0SW5kZXhdID0gdmlkZW9SYXRlQ29udHJvbC0+ZUNvbnRyb2xSYXRlOworICAgICAgICAgICAgcG9ydERlZmluaXRpb24tPmZvcm1hdC52aWRlby5uQml0cmF0ZSA9IHZpZGVvUmF0ZUNvbnRyb2wtPm5UYXJnZXRCaXRyYXRlOworICAgICAgICB9CisgICAgICAgIHJldCA9IE9NWF9FcnJvck5vbmU7CisgICAgfQorICAgICAgICBicmVhazsKKyAgICBjYXNlIE9NWF9JbmRleFBhcmFtVmlkZW9RdWFudGl6YXRpb246CisgICAgeworICAgICAgICBPTVhfVklERU9fUEFSQU1fUVVBTlRJWkFUSU9OVFlQRSAgKnZpZGVvUXVhbnRpemF0aW9uQ29udHJvbCA9IChPTVhfVklERU9fUEFSQU1fUVVBTlRJWkFUSU9OVFlQRSAqKUNvbXBvbmVudFBhcmFtZXRlclN0cnVjdHVyZTsKKyAgICAgICAgT01YX1UzMiAgICAgICAgICAgICAgICAgICAgICAgcG9ydEluZGV4ID0gdmlkZW9RdWFudGl6YXRpb25Db250cm9sLT5uUG9ydEluZGV4OworICAgICAgICBTRUNfT01YX0JBU0VQT1JUICAgICAgICAgICAgICpwU0VDUG9ydCA9IE5VTEw7CisgICAgICAgIFNFQ19PTVhfVklERU9FTkNfQ09NUE9ORU5UICAgKnBWaWRlb0VuYyA9IE5VTEw7CisgICAgICAgIE9NWF9QQVJBTV9QT1JUREVGSU5JVElPTlRZUEUgKnBvcnREZWZpbml0aW9uID0gTlVMTDsKKworICAgICAgICBpZiAoKHBvcnRJbmRleCAhPSBPVVRQVVRfUE9SVF9JTkRFWCkpIHsKKyAgICAgICAgICAgIHJldCA9IE9NWF9FcnJvckJhZFBvcnRJbmRleDsKKyAgICAgICAgICAgIGdvdG8gRVhJVDsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHBWaWRlb0VuYyA9IChTRUNfT01YX1ZJREVPRU5DX0NPTVBPTkVOVCAqKXBTRUNDb21wb25lbnQtPmhDb21wb25lbnRIYW5kbGU7CisgICAgICAgICAgICBwU0VDUG9ydCA9ICZwU0VDQ29tcG9uZW50LT5wU0VDUG9ydFtwb3J0SW5kZXhdOworICAgICAgICAgICAgcG9ydERlZmluaXRpb24gPSAmcFNFQ1BvcnQtPnBvcnREZWZpbml0aW9uOworCisgICAgICAgICAgICBwVmlkZW9FbmMtPnF1YW50aXphdGlvbi5uUXBJID0gdmlkZW9RdWFudGl6YXRpb25Db250cm9sLT5uUXBJOworICAgICAgICAgICAgcFZpZGVvRW5jLT5xdWFudGl6YXRpb24ublFwUCA9IHZpZGVvUXVhbnRpemF0aW9uQ29udHJvbC0+blFwUDsKKyAgICAgICAgICAgIHBWaWRlb0VuYy0+cXVhbnRpemF0aW9uLm5RcEIgPSB2aWRlb1F1YW50aXphdGlvbkNvbnRyb2wtPm5RcEI7CisgICAgICAgIH0KKyAgICAgICAgcmV0ID0gT01YX0Vycm9yTm9uZTsKKyAgICB9CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgT01YX0luZGV4UGFyYW1Qb3J0RGVmaW5pdGlvbjoKKyAgICB7CisgICAgICAgIE9NWF9QQVJBTV9QT1JUREVGSU5JVElPTlRZUEUgKnBQb3J0RGVmaW5pdGlvbiA9IChPTVhfUEFSQU1fUE9SVERFRklOSVRJT05UWVBFICopQ29tcG9uZW50UGFyYW1ldGVyU3RydWN0dXJlOworICAgICAgICBPTVhfVTMyICAgICAgICAgICAgICAgICAgICAgICBwb3J0SW5kZXggPSBwUG9ydERlZmluaXRpb24tPm5Qb3J0SW5kZXg7CisgICAgICAgIFNFQ19PTVhfQkFTRVBPUlQgICAgICAgICAgICAgKnBTRUNQb3J0OworICAgICAgICBPTVhfVTMyIHdpZHRoLCBoZWlnaHQsIHNpemU7CisKKyAgICAgICAgaWYgKHBvcnRJbmRleCA+PSBwU0VDQ29tcG9uZW50LT5wb3J0UGFyYW0ublBvcnRzKSB7CisgICAgICAgICAgICByZXQgPSBPTVhfRXJyb3JCYWRQb3J0SW5kZXg7CisgICAgICAgICAgICBnb3RvIEVYSVQ7CisgICAgICAgIH0KKyAgICAgICAgcmV0ID0gU0VDX09NWF9DaGVja19TaXplVmVyc2lvbihwUG9ydERlZmluaXRpb24sIHNpemVvZihPTVhfUEFSQU1fUE9SVERFRklOSVRJT05UWVBFKSk7CisgICAgICAgIGlmIChyZXQgIT0gT01YX0Vycm9yTm9uZSkgeworICAgICAgICAgICAgZ290byBFWElUOworICAgICAgICB9CisKKyAgICAgICAgcFNFQ1BvcnQgPSAmcFNFQ0NvbXBvbmVudC0+cFNFQ1BvcnRbcG9ydEluZGV4XTsKKworICAgICAgICBpZiAoKHBTRUNDb21wb25lbnQtPmN1cnJlbnRTdGF0ZSAhPSBPTVhfU3RhdGVMb2FkZWQpICYmIChwU0VDQ29tcG9uZW50LT5jdXJyZW50U3RhdGUgIT0gT01YX1N0YXRlV2FpdEZvclJlc291cmNlcykpIHsKKyAgICAgICAgICAgIGlmIChwU0VDUG9ydC0+cG9ydERlZmluaXRpb24uYkVuYWJsZWQgPT0gT01YX1RSVUUpIHsKKyAgICAgICAgICAgICAgICByZXQgPSBPTVhfRXJyb3JJbmNvcnJlY3RTdGF0ZU9wZXJhdGlvbjsKKyAgICAgICAgICAgICAgICBnb3RvIEVYSVQ7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgaWYocFBvcnREZWZpbml0aW9uLT5uQnVmZmVyQ291bnRBY3R1YWwgPCBwU0VDUG9ydC0+cG9ydERlZmluaXRpb24ubkJ1ZmZlckNvdW50TWluKSB7CisgICAgICAgICAgICByZXQgPSBPTVhfRXJyb3JCYWRQYXJhbWV0ZXI7CisgICAgICAgICAgICBnb3RvIEVYSVQ7CisgICAgICAgIH0KKworICAgICAgICBTRUNfT1NBTF9NZW1jcHkoJnBTRUNQb3J0LT5wb3J0RGVmaW5pdGlvbiwgcFBvcnREZWZpbml0aW9uLCBwUG9ydERlZmluaXRpb24tPm5TaXplKTsKKyAgICAgICAgaWYgKHBvcnRJbmRleCA9PSBJTlBVVF9QT1JUX0lOREVYKSB7CisgICAgICAgICAgICBTRUNfT01YX0JBU0VQT1JUICpwU0VDT3V0cHV0UG9ydCA9ICZwU0VDQ29tcG9uZW50LT5wU0VDUG9ydFtPVVRQVVRfUE9SVF9JTkRFWF07CisgICAgICAgICAgICBTRUNfVXBkYXRlRnJhbWVTaXplKHBPTVhDb21wb25lbnQpOworICAgICAgICAgICAgU0VDX09TQUxfTG9nKFNFQ19MT0dfVFJBQ0UsICJwU0VDT3V0cHV0UG9ydC0+cG9ydERlZmluaXRpb24ubkJ1ZmZlclNpemU6ICVkIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBwU0VDT3V0cHV0UG9ydC0+cG9ydERlZmluaXRpb24ubkJ1ZmZlclNpemUpOworICAgICAgICB9CisgICAgICAgIHJldCA9IE9NWF9FcnJvck5vbmU7CisgICAgfQorICAgICAgICBicmVhazsKKyNpZmRlZiBVU0VfU1RPUkVNRVRBREFUQQorICAgIGNhc2UgT01YX0luZGV4UGFyYW1TdG9yZU1ldGFEYXRhQnVmZmVyOgorICAgIHsKKyAgICAgICAgcmV0ID0gU0VDX09TQUxfU2V0QU5CUGFyYW1ldGVyKGhDb21wb25lbnQsIG5JbmRleCwgQ29tcG9uZW50UGFyYW1ldGVyU3RydWN0dXJlKTsKKyAgICB9CisgICAgICAgIGJyZWFrOworI2VuZGlmCisgICAgZGVmYXVsdDoKKyAgICB7CisgICAgICAgIHJldCA9IFNFQ19PTVhfU2V0UGFyYW1ldGVyKGhDb21wb25lbnQsIG5JbmRleCwgQ29tcG9uZW50UGFyYW1ldGVyU3RydWN0dXJlKTsKKyAgICB9CisgICAgICAgIGJyZWFrOworICAgIH0KKworRVhJVDoKKyAgICBGdW5jdGlvbk91dCgpOworCisgICAgcmV0dXJuIHJldDsKK30KKworT01YX0VSUk9SVFlQRSBTRUNfT01YX1ZpZGVvRW5jb2RlR2V0Q29uZmlnKAorICAgIE9NWF9IQU5ETEVUWVBFIGhDb21wb25lbnQsCisgICAgT01YX0lOREVYVFlQRSBuSW5kZXgsCisgICAgT01YX1BUUiBwQ29tcG9uZW50Q29uZmlnU3RydWN0dXJlKQoreworICAgIE9NWF9FUlJPUlRZUEUgICAgICAgICAgcmV0ID0gT01YX0Vycm9yTm9uZTsKKyAgICBPTVhfQ09NUE9ORU5UVFlQRSAgICAgKnBPTVhDb21wb25lbnQgPSBOVUxMOworICAgIFNFQ19PTVhfQkFTRUNPTVBPTkVOVCAqcFNFQ0NvbXBvbmVudCA9IE5VTEw7CisKKyAgICBGdW5jdGlvbkluKCk7CisKKyAgICBpZiAoaENvbXBvbmVudCA9PSBOVUxMIHx8IHBDb21wb25lbnRDb25maWdTdHJ1Y3R1cmUgPT0gTlVMTCkgeworICAgICAgICByZXQgPSBPTVhfRXJyb3JCYWRQYXJhbWV0ZXI7CisgICAgICAgIGdvdG8gRVhJVDsKKyAgICB9CisgICAgcE9NWENvbXBvbmVudCA9IChPTVhfQ09NUE9ORU5UVFlQRSAqKWhDb21wb25lbnQ7CisgICAgcmV0ID0gU0VDX09NWF9DaGVja19TaXplVmVyc2lvbihwT01YQ29tcG9uZW50LCBzaXplb2YoT01YX0NPTVBPTkVOVFRZUEUpKTsKKyAgICBpZiAocmV0ICE9IE9NWF9FcnJvck5vbmUpIHsKKyAgICAgICAgZ290byBFWElUOworICAgIH0KKyAgICBpZiAocE9NWENvbXBvbmVudC0+cENvbXBvbmVudFByaXZhdGUgPT0gTlVMTCkgeworICAgICAgICByZXQgPSBPTVhfRXJyb3JCYWRQYXJhbWV0ZXI7CisgICAgICAgIGdvdG8gRVhJVDsKKyAgICB9CisKKyAgICBwU0VDQ29tcG9uZW50ID0gKFNFQ19PTVhfQkFTRUNPTVBPTkVOVCAqKXBPTVhDb21wb25lbnQtPnBDb21wb25lbnRQcml2YXRlOworICAgIGlmIChwU0VDQ29tcG9uZW50LT5jdXJyZW50U3RhdGUgPT0gT01YX1N0YXRlSW52YWxpZCkgeworICAgICAgICByZXQgPSBPTVhfRXJyb3JJbnZhbGlkU3RhdGU7CisgICAgICAgIGdvdG8gRVhJVDsKKyAgICB9CisKKyAgICBzd2l0Y2ggKG5JbmRleCkgeworICAgIGNhc2UgT01YX0luZGV4Q29uZmlnVmlkZW9CaXRyYXRlOgorICAgIHsKKyAgICAgICAgT01YX1ZJREVPX0NPTkZJR19CSVRSQVRFVFlQRSAqcEVuY29kZUJpdHJhdGUgPSAoT01YX1ZJREVPX0NPTkZJR19CSVRSQVRFVFlQRSAqKXBDb21wb25lbnRDb25maWdTdHJ1Y3R1cmU7CisgICAgICAgIE9NWF9VMzIgICAgICAgICAgICAgICAgICAgICAgIHBvcnRJbmRleCA9IHBFbmNvZGVCaXRyYXRlLT5uUG9ydEluZGV4OworICAgICAgICBTRUNfT01YX0JBU0VQT1JUICAgICAgICAgICAgICpwU0VDUG9ydCA9IE5VTEw7CisKKyAgICAgICAgaWYgKChwb3J0SW5kZXggIT0gT1VUUFVUX1BPUlRfSU5ERVgpKSB7CisgICAgICAgICAgICByZXQgPSBPTVhfRXJyb3JCYWRQb3J0SW5kZXg7CisgICAgICAgICAgICBnb3RvIEVYSVQ7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBwU0VDUG9ydCA9ICZwU0VDQ29tcG9uZW50LT5wU0VDUG9ydFtwb3J0SW5kZXhdOworICAgICAgICAgICAgcEVuY29kZUJpdHJhdGUtPm5FbmNvZGVCaXRyYXRlID0gcFNFQ1BvcnQtPnBvcnREZWZpbml0aW9uLmZvcm1hdC52aWRlby5uQml0cmF0ZTsKKyAgICAgICAgfQorICAgIH0KKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBPTVhfSW5kZXhDb25maWdWaWRlb0ZyYW1lcmF0ZToKKyAgICB7CisgICAgICAgIE9NWF9DT05GSUdfRlJBTUVSQVRFVFlQRSAqcEZyYW1lcmF0ZSA9IChPTVhfQ09ORklHX0ZSQU1FUkFURVRZUEUgKilwQ29tcG9uZW50Q29uZmlnU3RydWN0dXJlOworICAgICAgICBPTVhfVTMyICAgICAgICAgICAgICAgICAgIHBvcnRJbmRleCA9IHBGcmFtZXJhdGUtPm5Qb3J0SW5kZXg7CisgICAgICAgIFNFQ19PTVhfQkFTRVBPUlQgICAgICAgICAqcFNFQ1BvcnQgPSBOVUxMOworCisgICAgICAgIGlmICgocG9ydEluZGV4ICE9IE9VVFBVVF9QT1JUX0lOREVYKSkgeworICAgICAgICAgICAgcmV0ID0gT01YX0Vycm9yQmFkUG9ydEluZGV4OworICAgICAgICAgICAgZ290byBFWElUOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgcFNFQ1BvcnQgPSAmcFNFQ0NvbXBvbmVudC0+cFNFQ1BvcnRbcG9ydEluZGV4XTsKKyAgICAgICAgICAgIHBGcmFtZXJhdGUtPnhFbmNvZGVGcmFtZXJhdGUgPSBwU0VDUG9ydC0+cG9ydERlZmluaXRpb24uZm9ybWF0LnZpZGVvLnhGcmFtZXJhdGU7CisgICAgICAgIH0KKyAgICB9CisgICAgICAgIGJyZWFrOworICAgIGRlZmF1bHQ6CisgICAgICAgIHJldCA9IFNFQ19PTVhfU2V0Q29uZmlnKGhDb21wb25lbnQsIG5JbmRleCwgcENvbXBvbmVudENvbmZpZ1N0cnVjdHVyZSk7CisgICAgICAgIGJyZWFrOworICAgIH0KKworRVhJVDoKKyAgICBGdW5jdGlvbk91dCgpOworCisgICAgcmV0dXJuIHJldDsKK30KKworT01YX0VSUk9SVFlQRSBTRUNfT01YX1ZpZGVvRW5jb2RlU2V0Q29uZmlnKAorICAgIE9NWF9IQU5ETEVUWVBFIGhDb21wb25lbnQsCisgICAgT01YX0lOREVYVFlQRSBuSW5kZXgsCisgICAgT01YX1BUUiBwQ29tcG9uZW50Q29uZmlnU3RydWN0dXJlKQorICAgIHsKKyAgICBPTVhfRVJST1JUWVBFICAgICAgICAgIHJldCA9IE9NWF9FcnJvck5vbmU7CisgICAgT01YX0NPTVBPTkVOVFRZUEUgICAgICpwT01YQ29tcG9uZW50ID0gTlVMTDsKKyAgICBTRUNfT01YX0JBU0VDT01QT05FTlQgKnBTRUNDb21wb25lbnQgPSBOVUxMOworCisgICAgRnVuY3Rpb25JbigpOworCisgICAgaWYgKGhDb21wb25lbnQgPT0gTlVMTCB8fCBwQ29tcG9uZW50Q29uZmlnU3RydWN0dXJlID09IE5VTEwpIHsKKyAgICAgICAgcmV0ID0gT01YX0Vycm9yQmFkUGFyYW1ldGVyOworICAgICAgICBnb3RvIEVYSVQ7CisgICAgfQorICAgIHBPTVhDb21wb25lbnQgPSAoT01YX0NPTVBPTkVOVFRZUEUgKiloQ29tcG9uZW50OworICAgIHJldCA9IFNFQ19PTVhfQ2hlY2tfU2l6ZVZlcnNpb24ocE9NWENvbXBvbmVudCwgc2l6ZW9mKE9NWF9DT01QT05FTlRUWVBFKSk7CisgICAgaWYgKHJldCAhPSBPTVhfRXJyb3JOb25lKSB7CisgICAgICAgIGdvdG8gRVhJVDsKKyAgICB9CisgICAgaWYgKHBPTVhDb21wb25lbnQtPnBDb21wb25lbnRQcml2YXRlID09IE5VTEwpIHsKKyAgICAgICAgcmV0ID0gT01YX0Vycm9yQmFkUGFyYW1ldGVyOworICAgICAgICBnb3RvIEVYSVQ7CisgICAgfQorCisgICAgcFNFQ0NvbXBvbmVudCA9IChTRUNfT01YX0JBU0VDT01QT05FTlQgKilwT01YQ29tcG9uZW50LT5wQ29tcG9uZW50UHJpdmF0ZTsKKyAgICBpZiAocFNFQ0NvbXBvbmVudC0+Y3VycmVudFN0YXRlID09IE9NWF9TdGF0ZUludmFsaWQpIHsKKyAgICAgICAgcmV0ID0gT01YX0Vycm9ySW52YWxpZFN0YXRlOworICAgICAgICBnb3RvIEVYSVQ7CisgICAgfQorCisgICAgc3dpdGNoIChuSW5kZXgpIHsKKyAgICBjYXNlIE9NWF9JbmRleENvbmZpZ1ZpZGVvQml0cmF0ZToKKyAgICB7CisgICAgICAgIE9NWF9WSURFT19DT05GSUdfQklUUkFURVRZUEUgKnBFbmNvZGVCaXRyYXRlID0gKE9NWF9WSURFT19DT05GSUdfQklUUkFURVRZUEUgKilwQ29tcG9uZW50Q29uZmlnU3RydWN0dXJlOworICAgICAgICBPTVhfVTMyICAgICAgICAgICAgICAgICAgICAgICBwb3J0SW5kZXggPSBwRW5jb2RlQml0cmF0ZS0+blBvcnRJbmRleDsKKyAgICAgICAgU0VDX09NWF9CQVNFUE9SVCAgICAgICAgICAgICAqcFNFQ1BvcnQgPSBOVUxMOworCisgICAgICAgIGlmICgocG9ydEluZGV4ICE9IE9VVFBVVF9QT1JUX0lOREVYKSkgeworICAgICAgICAgICAgcmV0ID0gT01YX0Vycm9yQmFkUG9ydEluZGV4OworICAgICAgICAgICAgZ290byBFWElUOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgcFNFQ1BvcnQgPSAmcFNFQ0NvbXBvbmVudC0+cFNFQ1BvcnRbcG9ydEluZGV4XTsKKyAgICAgICAgICAgIHBTRUNQb3J0LT5wb3J0RGVmaW5pdGlvbi5mb3JtYXQudmlkZW8ubkJpdHJhdGUgPSBwRW5jb2RlQml0cmF0ZS0+bkVuY29kZUJpdHJhdGU7CisgICAgICAgIH0KKyAgICB9CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgT01YX0luZGV4Q29uZmlnVmlkZW9GcmFtZXJhdGU6CisgICAgeworICAgICAgICBPTVhfQ09ORklHX0ZSQU1FUkFURVRZUEUgKnBGcmFtZXJhdGUgPSAoT01YX0NPTkZJR19GUkFNRVJBVEVUWVBFICopcENvbXBvbmVudENvbmZpZ1N0cnVjdHVyZTsKKyAgICAgICAgT01YX1UzMiAgICAgICAgICAgICAgICAgICBwb3J0SW5kZXggPSBwRnJhbWVyYXRlLT5uUG9ydEluZGV4OworICAgICAgICBTRUNfT01YX0JBU0VQT1JUICAgICAgICAgKnBTRUNQb3J0ID0gTlVMTDsKKworICAgICAgICBpZiAoKHBvcnRJbmRleCAhPSBPVVRQVVRfUE9SVF9JTkRFWCkpIHsKKyAgICAgICAgICAgIHJldCA9IE9NWF9FcnJvckJhZFBvcnRJbmRleDsKKyAgICAgICAgICAgIGdvdG8gRVhJVDsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHBTRUNQb3J0ID0gJnBTRUNDb21wb25lbnQtPnBTRUNQb3J0W3BvcnRJbmRleF07CisgICAgICAgICAgICBwU0VDUG9ydC0+cG9ydERlZmluaXRpb24uZm9ybWF0LnZpZGVvLnhGcmFtZXJhdGUgPSBwRnJhbWVyYXRlLT54RW5jb2RlRnJhbWVyYXRlOworICAgICAgICB9CisgICAgfQorICAgICAgICBicmVhazsKKyAgICBjYXNlIE9NWF9JbmRleENvbmZpZ1ZpZGVvSW50cmFWT1BSZWZyZXNoOgorICAgIHsKKyAgICAgICAgT01YX0NPTkZJR19JTlRSQVJFRlJFU0hWT1BUWVBFICpwSW50cmFSZWZyZXNoVk9QID0gKE9NWF9DT05GSUdfSU5UUkFSRUZSRVNIVk9QVFlQRSAqKXBDb21wb25lbnRDb25maWdTdHJ1Y3R1cmU7CisgICAgICAgIFNFQ19PTVhfVklERU9FTkNfQ09NUE9ORU5UICpwVkVuY0Jhc2UgPSAoKFNFQ19PTVhfVklERU9FTkNfQ09NUE9ORU5UICopcFNFQ0NvbXBvbmVudC0+aENvbXBvbmVudEhhbmRsZSk7CisgICAgICAgIE9NWF9VMzIgcG9ydEluZGV4ID0gcEludHJhUmVmcmVzaFZPUC0+blBvcnRJbmRleDsKKworICAgICAgICBpZiAoKHBvcnRJbmRleCAhPSBPVVRQVVRfUE9SVF9JTkRFWCkpIHsKKyAgICAgICAgICAgIHJldCA9IE9NWF9FcnJvckJhZFBvcnRJbmRleDsKKyAgICAgICAgICAgIGdvdG8gRVhJVDsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHBWRW5jQmFzZS0+SW50cmFSZWZyZXNoVk9QID0gcEludHJhUmVmcmVzaFZPUC0+SW50cmFSZWZyZXNoVk9QOworICAgICAgICB9CisgICAgfQorICAgICAgICBicmVhazsKKyAgICBkZWZhdWx0OgorICAgICAgICByZXQgPSBTRUNfT01YX1NldENvbmZpZyhoQ29tcG9uZW50LCBuSW5kZXgsIHBDb21wb25lbnRDb25maWdTdHJ1Y3R1cmUpOworICAgICAgICBicmVhazsKKyAgICB9CisKK0VYSVQ6CisgICAgRnVuY3Rpb25PdXQoKTsKKworICAgIHJldHVybiByZXQ7Cit9CisKK09NWF9FUlJPUlRZUEUgU0VDX09NWF9WaWRlb0VuY29kZUdldEV4dGVuc2lvbkluZGV4KAorICAgIE9NWF9JTiBPTVhfSEFORExFVFlQRSAgaENvbXBvbmVudCwKKyAgICBPTVhfSU4gT01YX1NUUklORyAgICAgIGNQYXJhbWV0ZXJOYW1lLAorICAgIE9NWF9PVVQgT01YX0lOREVYVFlQRSAqcEluZGV4VHlwZSkKK3sKKyAgICBPTVhfRVJST1JUWVBFICAgICAgICAgICByZXQgPSBPTVhfRXJyb3JOb25lOworICAgIE9NWF9DT01QT05FTlRUWVBFICAgICAqcE9NWENvbXBvbmVudCA9IE5VTEw7CisgICAgU0VDX09NWF9CQVNFQ09NUE9ORU5UICpwU0VDQ29tcG9uZW50ID0gTlVMTDsKKworICAgIEZ1bmN0aW9uSW4oKTsKKworICAgIGlmIChoQ29tcG9uZW50ID09IE5VTEwpIHsKKyAgICAgICAgcmV0ID0gT01YX0Vycm9yQmFkUGFyYW1ldGVyOworICAgICAgICBnb3RvIEVYSVQ7CisgICAgfQorICAgIHBPTVhDb21wb25lbnQgPSAoT01YX0NPTVBPTkVOVFRZUEUgKiloQ29tcG9uZW50OworICAgIHJldCA9IFNFQ19PTVhfQ2hlY2tfU2l6ZVZlcnNpb24ocE9NWENvbXBvbmVudCwgc2l6ZW9mKE9NWF9DT01QT05FTlRUWVBFKSk7CisgICAgaWYgKHJldCAhPSBPTVhfRXJyb3JOb25lKSB7CisgICAgICAgIGdvdG8gRVhJVDsKKyAgICB9CisKKyAgICBpZiAocE9NWENvbXBvbmVudC0+cENvbXBvbmVudFByaXZhdGUgPT0gTlVMTCkgeworICAgICAgICByZXQgPSBPTVhfRXJyb3JCYWRQYXJhbWV0ZXI7CisgICAgICAgIGdvdG8gRVhJVDsKKyAgICB9CisgICAgcFNFQ0NvbXBvbmVudCA9IChTRUNfT01YX0JBU0VDT01QT05FTlQgKilwT01YQ29tcG9uZW50LT5wQ29tcG9uZW50UHJpdmF0ZTsKKworICAgIGlmICgoY1BhcmFtZXRlck5hbWUgPT0gTlVMTCkgfHwgKHBJbmRleFR5cGUgPT0gTlVMTCkpIHsKKyAgICAgICAgcmV0ID0gT01YX0Vycm9yQmFkUGFyYW1ldGVyOworICAgICAgICBnb3RvIEVYSVQ7CisgICAgfQorICAgIGlmIChwU0VDQ29tcG9uZW50LT5jdXJyZW50U3RhdGUgPT0gT01YX1N0YXRlSW52YWxpZCkgeworICAgICAgICByZXQgPSBPTVhfRXJyb3JJbnZhbGlkU3RhdGU7CisgICAgICAgIGdvdG8gRVhJVDsKKyAgICB9CisKKyNpZmRlZiBVU0VfU1RPUkVNRVRBREFUQQorICAgIGlmIChTRUNfT1NBTF9TdHJjbXAoY1BhcmFtZXRlck5hbWUsIFNFQ19JTkRFWF9QQVJBTV9TVE9SRV9NRVRBREFUQV9CVUZGRVIpID09IDApIHsKKyAgICAgICAgKnBJbmRleFR5cGUgPSAoT01YX0lOREVYVFlQRSkgT01YX0luZGV4UGFyYW1TdG9yZU1ldGFEYXRhQnVmZmVyOworICAgIH0gZWxzZSB7CisgICAgICAgIHJldCA9IFNFQ19PTVhfR2V0RXh0ZW5zaW9uSW5kZXgoaENvbXBvbmVudCwgY1BhcmFtZXRlck5hbWUsIHBJbmRleFR5cGUpOworICAgIH0KKyNlbHNlCisgICAgcmV0ID0gU0VDX09NWF9HZXRFeHRlbnNpb25JbmRleChoQ29tcG9uZW50LCBjUGFyYW1ldGVyTmFtZSwgcEluZGV4VHlwZSk7CisjZW5kaWYKKworRVhJVDoKKyAgICBGdW5jdGlvbk91dCgpOworCisgICAgcmV0dXJuIHJldDsKK30KKworT01YX0VSUk9SVFlQRSBTRUNfT01YX1ZpZGVvRW5jb2RlQ29tcG9uZW50SW5pdChPTVhfSU4gT01YX0hBTkRMRVRZUEUgaENvbXBvbmVudCkKK3sKKyAgICBPTVhfRVJST1JUWVBFICAgICAgICAgIHJldCA9IE9NWF9FcnJvck5vbmU7CisgICAgT01YX0NPTVBPTkVOVFRZUEUgICAgICpwT01YQ29tcG9uZW50ID0gTlVMTDsKKyAgICBTRUNfT01YX0JBU0VDT01QT05FTlQgKnBTRUNDb21wb25lbnQgPSBOVUxMOworICAgIFNFQ19PTVhfQkFTRVBPUlQgICAgICAqcFNFQ1BvcnQgPSBOVUxMOworICAgIFNFQ19PTVhfVklERU9FTkNfQ09NUE9ORU5UICpwVmlkZW9FbmMgPSBOVUxMOworCisgICAgRnVuY3Rpb25JbigpOworCisgICAgaWYgKGhDb21wb25lbnQgPT0gTlVMTCkgeworICAgICAgICByZXQgPSBPTVhfRXJyb3JCYWRQYXJhbWV0ZXI7CisgICAgICAgIGdvdG8gRVhJVDsKKyAgICB9CisgICAgcE9NWENvbXBvbmVudCA9IChPTVhfQ09NUE9ORU5UVFlQRSAqKWhDb21wb25lbnQ7CisgICAgcmV0ID0gU0VDX09NWF9DaGVja19TaXplVmVyc2lvbihwT01YQ29tcG9uZW50LCBzaXplb2YoT01YX0NPTVBPTkVOVFRZUEUpKTsKKyAgICBpZiAocmV0ICE9IE9NWF9FcnJvck5vbmUpIHsKKyAgICAgICAgU0VDX09TQUxfTG9nKFNFQ19MT0dfRVJST1IsICJPTVhfRXJyb3IsIExpbmU6JWQiLCBfX0xJTkVfXyk7CisgICAgICAgIGdvdG8gRVhJVDsKKyAgICB9CisKKyAgICByZXQgPSBTRUNfT01YX0Jhc2VDb21wb25lbnRfQ29uc3RydWN0b3IocE9NWENvbXBvbmVudCk7CisgICAgaWYgKHJldCAhPSBPTVhfRXJyb3JOb25lKSB7CisgICAgICAgIFNFQ19PU0FMX0xvZyhTRUNfTE9HX0VSUk9SLCAiT01YX0Vycm9yLCBMaW5lOiVkIiwgX19MSU5FX18pOworICAgICAgICBnb3RvIEVYSVQ7CisgICAgfQorCisgICAgcmV0ID0gU0VDX09NWF9Qb3J0X0NvbnN0cnVjdG9yKHBPTVhDb21wb25lbnQpOworICAgIGlmIChyZXQgIT0gT01YX0Vycm9yTm9uZSkgeworICAgICAgICBTRUNfT01YX0Jhc2VDb21wb25lbnRfRGVzdHJ1Y3RvcihwT01YQ29tcG9uZW50KTsKKyAgICAgICAgU0VDX09TQUxfTG9nKFNFQ19MT0dfRVJST1IsICJPTVhfRXJyb3IsIExpbmU6JWQiLCBfX0xJTkVfXyk7CisgICAgICAgIGdvdG8gRVhJVDsKKyAgICB9CisKKyAgICBwU0VDQ29tcG9uZW50ID0gKFNFQ19PTVhfQkFTRUNPTVBPTkVOVCAqKXBPTVhDb21wb25lbnQtPnBDb21wb25lbnRQcml2YXRlOworCisgICAgcFZpZGVvRW5jID0gU0VDX09TQUxfTWFsbG9jKHNpemVvZihTRUNfT01YX1ZJREVPRU5DX0NPTVBPTkVOVCkpOworICAgIGlmIChwVmlkZW9FbmMgPT0gTlVMTCkgeworICAgICAgICBTRUNfT01YX0Jhc2VDb21wb25lbnRfRGVzdHJ1Y3RvcihwT01YQ29tcG9uZW50KTsKKyAgICAgICAgcmV0ID0gT01YX0Vycm9ySW5zdWZmaWNpZW50UmVzb3VyY2VzOworICAgICAgICBTRUNfT1NBTF9Mb2coU0VDX0xPR19FUlJPUiwgIk9NWF9FcnJvckluc3VmZmljaWVudFJlc291cmNlcywgTGluZTolZCIsIF9fTElORV9fKTsKKyAgICAgICAgZ290byBFWElUOworICAgIH0KKworICAgIFNFQ19PU0FMX01lbXNldChwVmlkZW9FbmMsIDAsIHNpemVvZihTRUNfT01YX1ZJREVPRU5DX0NPTVBPTkVOVCkpOworICAgIHBTRUNDb21wb25lbnQtPmhDb21wb25lbnRIYW5kbGUgPSAoT01YX0hBTkRMRVRZUEUpcFZpZGVvRW5jOworCisgICAgcFNFQ0NvbXBvbmVudC0+YlNhdmVGbGFnRU9TID0gT01YX0ZBTFNFOworCisgICAgcFZpZGVvRW5jLT5jb25maWdDaGFuZ2UgPSBPTVhfRkFMU0U7CisgICAgcFZpZGVvRW5jLT5xdWFudGl6YXRpb24ublFwSSA9IDIwOworICAgIHBWaWRlb0VuYy0+cXVhbnRpemF0aW9uLm5RcFAgPSAyMDsKKyAgICBwVmlkZW9FbmMtPnF1YW50aXphdGlvbi5uUXBCID0gMjA7CisKKyAgICAvKiBJbnB1dCBwb3J0ICovCisgICAgcFNFQ1BvcnQgPSAmcFNFQ0NvbXBvbmVudC0+cFNFQ1BvcnRbSU5QVVRfUE9SVF9JTkRFWF07CisgICAgcFNFQ1BvcnQtPnBvcnREZWZpbml0aW9uLm5CdWZmZXJDb3VudEFjdHVhbCA9IE1BWF9WSURFT19JTlBVVEJVRkZFUl9OVU07CisgICAgcFNFQ1BvcnQtPnBvcnREZWZpbml0aW9uLm5CdWZmZXJDb3VudE1pbiA9IE1BWF9WSURFT19JTlBVVEJVRkZFUl9OVU07CisgICAgcFNFQ1BvcnQtPnBvcnREZWZpbml0aW9uLm5CdWZmZXJTaXplID0gMDsKKyAgICBwU0VDUG9ydC0+cG9ydERlZmluaXRpb24uZURvbWFpbiA9IE9NWF9Qb3J0RG9tYWluVmlkZW87CisKKyAgICBwU0VDUG9ydC0+cG9ydERlZmluaXRpb24uZm9ybWF0LnZpZGVvLmNNSU1FVHlwZSA9IFNFQ19PU0FMX01hbGxvYyhNQVhfT01YX01JTUVUWVBFX1NJWkUpOworICAgIFNFQ19PU0FMX1N0cmNweShwU0VDUG9ydC0+cG9ydERlZmluaXRpb24uZm9ybWF0LnZpZGVvLmNNSU1FVHlwZSwgInJhdy92aWRlbyIpOworICAgIHBTRUNQb3J0LT5wb3J0RGVmaW5pdGlvbi5mb3JtYXQudmlkZW8ucE5hdGl2ZVJlbmRlciA9IDA7CisgICAgcFNFQ1BvcnQtPnBvcnREZWZpbml0aW9uLmZvcm1hdC52aWRlby5iRmxhZ0Vycm9yQ29uY2VhbG1lbnQgPSBPTVhfRkFMU0U7CisgICAgcFNFQ1BvcnQtPnBvcnREZWZpbml0aW9uLmZvcm1hdC52aWRlby5lQ29tcHJlc3Npb25Gb3JtYXQgPSBPTVhfVklERU9fQ29kaW5nVW51c2VkOworCisgICAgcFNFQ1BvcnQtPnBvcnREZWZpbml0aW9uLmZvcm1hdC52aWRlby5uRnJhbWVXaWR0aCA9IDA7CisgICAgcFNFQ1BvcnQtPnBvcnREZWZpbml0aW9uLmZvcm1hdC52aWRlby5uRnJhbWVIZWlnaHQ9IDA7CisgICAgcFNFQ1BvcnQtPnBvcnREZWZpbml0aW9uLmZvcm1hdC52aWRlby5uU3RyaWRlID0gMDsKKyAgICBwU0VDUG9ydC0+cG9ydERlZmluaXRpb24uZm9ybWF0LnZpZGVvLm5TbGljZUhlaWdodCA9IDA7CisgICAgcFNFQ1BvcnQtPnBvcnREZWZpbml0aW9uLmZvcm1hdC52aWRlby5uQml0cmF0ZSA9IDY0MDAwOworICAgIHBTRUNQb3J0LT5wb3J0RGVmaW5pdGlvbi5mb3JtYXQudmlkZW8ueEZyYW1lcmF0ZSA9ICgxNSA8PCAxNik7CisgICAgcFNFQ1BvcnQtPnBvcnREZWZpbml0aW9uLmZvcm1hdC52aWRlby5lQ29sb3JGb3JtYXQgPSBPTVhfQ09MT1JfRm9ybWF0VW51c2VkOworICAgIHBTRUNQb3J0LT5wb3J0RGVmaW5pdGlvbi5mb3JtYXQudmlkZW8ucE5hdGl2ZVdpbmRvdyA9IE5VTEw7CisgICAgcFZpZGVvRW5jLT5lQ29udHJvbFJhdGVbSU5QVVRfUE9SVF9JTkRFWF0gPSBPTVhfVmlkZW9fQ29udHJvbFJhdGVEaXNhYmxlOworCisgICAgcFNFQ1BvcnQtPmJTdG9yZU1ldGFEYXRhID0gT01YX0ZBTFNFOworCisgICAgLyogT3V0cHV0IHBvcnQgKi8KKyAgICBwU0VDUG9ydCA9ICZwU0VDQ29tcG9uZW50LT5wU0VDUG9ydFtPVVRQVVRfUE9SVF9JTkRFWF07CisgICAgcFNFQ1BvcnQtPnBvcnREZWZpbml0aW9uLm5CdWZmZXJDb3VudEFjdHVhbCA9IE1BWF9WSURFT19PVVRQVVRCVUZGRVJfTlVNOworICAgIHBTRUNQb3J0LT5wb3J0RGVmaW5pdGlvbi5uQnVmZmVyQ291bnRNaW4gPSBNQVhfVklERU9fT1VUUFVUQlVGRkVSX05VTTsKKyAgICBwU0VDUG9ydC0+cG9ydERlZmluaXRpb24ubkJ1ZmZlclNpemUgPSBERUZBVUxUX1ZJREVPX09VVFBVVF9CVUZGRVJfU0laRTsKKyAgICBwU0VDUG9ydC0+cG9ydERlZmluaXRpb24uZURvbWFpbiA9IE9NWF9Qb3J0RG9tYWluVmlkZW87CisKKyAgICBwU0VDUG9ydC0+cG9ydERlZmluaXRpb24uZm9ybWF0LnZpZGVvLmNNSU1FVHlwZSA9IFNFQ19PU0FMX01hbGxvYyhNQVhfT01YX01JTUVUWVBFX1NJWkUpOworICAgIFNFQ19PU0FMX1N0cmNweShwU0VDUG9ydC0+cG9ydERlZmluaXRpb24uZm9ybWF0LnZpZGVvLmNNSU1FVHlwZSwgInJhdy92aWRlbyIpOworICAgIHBTRUNQb3J0LT5wb3J0RGVmaW5pdGlvbi5mb3JtYXQudmlkZW8ucE5hdGl2ZVJlbmRlciA9IDA7CisgICAgcFNFQ1BvcnQtPnBvcnREZWZpbml0aW9uLmZvcm1hdC52aWRlby5iRmxhZ0Vycm9yQ29uY2VhbG1lbnQgPSBPTVhfRkFMU0U7CisgICAgcFNFQ1BvcnQtPnBvcnREZWZpbml0aW9uLmZvcm1hdC52aWRlby5lQ29tcHJlc3Npb25Gb3JtYXQgPSBPTVhfVklERU9fQ29kaW5nVW51c2VkOworCisgICAgcFNFQ1BvcnQtPnBvcnREZWZpbml0aW9uLmZvcm1hdC52aWRlby5uRnJhbWVXaWR0aCA9IDA7CisgICAgcFNFQ1BvcnQtPnBvcnREZWZpbml0aW9uLmZvcm1hdC52aWRlby5uRnJhbWVIZWlnaHQ9IDA7CisgICAgcFNFQ1BvcnQtPnBvcnREZWZpbml0aW9uLmZvcm1hdC52aWRlby5uU3RyaWRlID0gMDsKKyAgICBwU0VDUG9ydC0+cG9ydERlZmluaXRpb24uZm9ybWF0LnZpZGVvLm5TbGljZUhlaWdodCA9IDA7CisgICAgcFNFQ1BvcnQtPnBvcnREZWZpbml0aW9uLmZvcm1hdC52aWRlby5uQml0cmF0ZSA9IDY0MDAwOworICAgIHBTRUNQb3J0LT5wb3J0RGVmaW5pdGlvbi5mb3JtYXQudmlkZW8ueEZyYW1lcmF0ZSA9ICgxNSA8PCAxNik7CisgICAgcFNFQ1BvcnQtPnBvcnREZWZpbml0aW9uLmZvcm1hdC52aWRlby5lQ29sb3JGb3JtYXQgPSBPTVhfQ09MT1JfRm9ybWF0VW51c2VkOworICAgIHBTRUNQb3J0LT5wb3J0RGVmaW5pdGlvbi5mb3JtYXQudmlkZW8ucE5hdGl2ZVdpbmRvdyA9IE5VTEw7CisgICAgcFZpZGVvRW5jLT5lQ29udHJvbFJhdGVbT1VUUFVUX1BPUlRfSU5ERVhdID0gT01YX1ZpZGVvX0NvbnRyb2xSYXRlRGlzYWJsZTsKKworICAgIHBPTVhDb21wb25lbnQtPlVzZUJ1ZmZlciAgICAgICAgICAgICAgPSAmU0VDX09NWF9Vc2VCdWZmZXI7CisgICAgcE9NWENvbXBvbmVudC0+QWxsb2NhdGVCdWZmZXIgICAgICAgICA9ICZTRUNfT01YX0FsbG9jYXRlQnVmZmVyOworICAgIHBPTVhDb21wb25lbnQtPkZyZWVCdWZmZXIgICAgICAgICAgICAgPSAmU0VDX09NWF9GcmVlQnVmZmVyOworICAgIHBPTVhDb21wb25lbnQtPkNvbXBvbmVudFR1bm5lbFJlcXVlc3QgPSAmU0VDX09NWF9Db21wb25lbnRUdW5uZWxSZXF1ZXN0OworCisgICAgcFNFQ0NvbXBvbmVudC0+c2VjX0FsbG9jYXRlVHVubmVsQnVmZmVyID0gJlNFQ19PTVhfQWxsb2NhdGVUdW5uZWxCdWZmZXI7CisgICAgcFNFQ0NvbXBvbmVudC0+c2VjX0ZyZWVUdW5uZWxCdWZmZXIgICAgID0gJlNFQ19PTVhfRnJlZVR1bm5lbEJ1ZmZlcjsKKyAgICBwU0VDQ29tcG9uZW50LT5zZWNfQnVmZmVyUHJvY2VzcyAgICAgICAgPSAmU0VDX09NWF9CdWZmZXJQcm9jZXNzOworICAgIHBTRUNDb21wb25lbnQtPnNlY19CdWZmZXJSZXNldCAgICAgICAgICA9ICZTRUNfQnVmZmVyUmVzZXQ7CisgICAgcFNFQ0NvbXBvbmVudC0+c2VjX0lucHV0QnVmZmVyUmV0dXJuICAgID0gJlNFQ19JbnB1dEJ1ZmZlclJldHVybjsKKyAgICBwU0VDQ29tcG9uZW50LT5zZWNfT3V0cHV0QnVmZmVyUmV0dXJuICAgPSAmU0VDX091dHB1dEJ1ZmZlclJldHVybjsKKworRVhJVDoKKyAgICBGdW5jdGlvbk91dCgpOworCisgICAgcmV0dXJuIHJldDsKK30KKworT01YX0VSUk9SVFlQRSBTRUNfT01YX1ZpZGVvRW5jb2RlQ29tcG9uZW50RGVpbml0KE9NWF9JTiBPTVhfSEFORExFVFlQRSBoQ29tcG9uZW50KQoreworICAgIE9NWF9FUlJPUlRZUEUgICAgICAgICAgcmV0ID0gT01YX0Vycm9yTm9uZTsKKyAgICBPTVhfQ09NUE9ORU5UVFlQRSAgICAgKnBPTVhDb21wb25lbnQgPSBOVUxMOworICAgIFNFQ19PTVhfQkFTRUNPTVBPTkVOVCAqcFNFQ0NvbXBvbmVudCA9IE5VTEw7CisgICAgU0VDX09NWF9CQVNFUE9SVCAgICAgICpwU0VDUG9ydCA9IE5VTEw7CisgICAgU0VDX09NWF9WSURFT0VOQ19DT01QT05FTlQgKnBWaWRlb0VuYyA9IE5VTEw7CisgICAgaW50ICAgICAgICAgICAgICAgICAgICBpID0gMDsKKworICAgIEZ1bmN0aW9uSW4oKTsKKworICAgIGlmIChoQ29tcG9uZW50ID09IE5VTEwpIHsKKyAgICAgICAgcmV0ID0gT01YX0Vycm9yQmFkUGFyYW1ldGVyOworICAgICAgICBnb3RvIEVYSVQ7CisgICAgfQorICAgIHBPTVhDb21wb25lbnQgPSAoT01YX0NPTVBPTkVOVFRZUEUgKiloQ29tcG9uZW50OworICAgIHJldCA9IFNFQ19PTVhfQ2hlY2tfU2l6ZVZlcnNpb24ocE9NWENvbXBvbmVudCwgc2l6ZW9mKE9NWF9DT01QT05FTlRUWVBFKSk7CisgICAgaWYgKHJldCAhPSBPTVhfRXJyb3JOb25lKSB7CisgICAgICAgIGdvdG8gRVhJVDsKKyAgICB9CisKKyAgICBpZiAocE9NWENvbXBvbmVudC0+cENvbXBvbmVudFByaXZhdGUgPT0gTlVMTCkgeworICAgICAgICByZXQgPSBPTVhfRXJyb3JCYWRQYXJhbWV0ZXI7CisgICAgICAgIGdvdG8gRVhJVDsKKyAgICB9CisgICAgcFNFQ0NvbXBvbmVudCA9IChTRUNfT01YX0JBU0VDT01QT05FTlQgKilwT01YQ29tcG9uZW50LT5wQ29tcG9uZW50UHJpdmF0ZTsKKworICAgIHBWaWRlb0VuYyA9IChTRUNfT01YX1ZJREVPRU5DX0NPTVBPTkVOVCAqKXBTRUNDb21wb25lbnQtPmhDb21wb25lbnRIYW5kbGU7CisgICAgU0VDX09TQUxfRnJlZShwVmlkZW9FbmMpOworICAgIHBTRUNDb21wb25lbnQtPmhDb21wb25lbnRIYW5kbGUgPSBwVmlkZW9FbmMgPSBOVUxMOworCisgICAgZm9yKGkgPSAwOyBpIDwgQUxMX1BPUlRfTlVNOyBpKyspIHsKKyAgICAgICAgcFNFQ1BvcnQgPSAmcFNFQ0NvbXBvbmVudC0+cFNFQ1BvcnRbaV07CisgICAgICAgIFNFQ19PU0FMX0ZyZWUocFNFQ1BvcnQtPnBvcnREZWZpbml0aW9uLmZvcm1hdC52aWRlby5jTUlNRVR5cGUpOworICAgICAgICBwU0VDUG9ydC0+cG9ydERlZmluaXRpb24uZm9ybWF0LnZpZGVvLmNNSU1FVHlwZSA9IE5VTEw7CisgICAgfQorCisgICAgcmV0ID0gU0VDX09NWF9Qb3J0X0Rlc3RydWN0b3IocE9NWENvbXBvbmVudCk7CisKKyAgICByZXQgPSBTRUNfT01YX0Jhc2VDb21wb25lbnRfRGVzdHJ1Y3RvcihoQ29tcG9uZW50KTsKKworRVhJVDoKKyAgICBGdW5jdGlvbk91dCgpOworCisgICAgcmV0dXJuIHJldDsKK30KZGlmZiAtLWdpdCBhL2V4eW5vczQvbXVsdGltZWRpYS9vcGVubWF4L3NlY19vbXgvY29tcG9uZW50L3ZpZGVvL2VuYy9TRUNfT01YX1ZlbmMuaCBiL2V4eW5vczQvbXVsdGltZWRpYS9vcGVubWF4L3NlY19vbXgvY29tcG9uZW50L3ZpZGVvL2VuYy9TRUNfT01YX1ZlbmMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42MjI1ZmQzCi0tLSAvZGV2L251bGwKKysrIGIvZXh5bm9zNC9tdWx0aW1lZGlhL29wZW5tYXgvc2VjX29teC9jb21wb25lbnQvdmlkZW8vZW5jL1NFQ19PTVhfVmVuYy5oCkBAIC0wLDAgKzEsMTY2IEBACisvKgorICoKKyAqIENvcHlyaWdodCAyMDEwIFNhbXN1bmcgRWxlY3Ryb25pY3MgUy5MU0kgQ28uIExURAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisvKgorICogQGZpbGUgICAgICAgIFNFQ19PTVhfVmVuYy5oCisgKiBAYnJpZWYKKyAqIEBhdXRob3IgICAgICBTZXVuZ0Jlb20gS2ltIChzYmNydXgua2ltQHNhbXN1bmcuY29tKQorICogICAgICAgICAgICAgIFl1bmppIEtpbSAoeXVuamkua2ltQHNhbXN1bmcuY29tKQorICogQHZlcnNpb24gICAgIDEuMS4wCisgKiBAaGlzdG9yeQorICogICAyMDEwLjcuMTUgOiBDcmVhdGUKKyAqLworCisjaWZuZGVmIFNFQ19PTVhfVklERU9fRU5DT0RFCisjZGVmaW5lIFNFQ19PTVhfVklERU9fRU5DT0RFCisKKyNpbmNsdWRlICJPTVhfQ29tcG9uZW50LmgiCisjaW5jbHVkZSAiU0VDX09NWF9EZWYuaCIKKyNpbmNsdWRlICJTRUNfT1NBTF9RdWV1ZS5oIgorI2luY2x1ZGUgIlNFQ19PTVhfQmFzZXBvcnQuaCIKKyNpbmNsdWRlICJTRUNfT01YX0Jhc2Vjb21wb25lbnQuaCIKKworI2RlZmluZSBNQVhfVklERU9fSU5QVVRCVUZGRVJfTlVNICAgIDUKKyNkZWZpbmUgTUFYX1ZJREVPX09VVFBVVEJVRkZFUl9OVU0gICA0CisKKyNkZWZpbmUgREVGQVVMVF9GUkFNRV9XSURUSCAgICAgICAgICAxNzYKKyNkZWZpbmUgREVGQVVMVF9GUkFNRV9IRUlHSFQgICAgICAgICAxNDQKKworI2RlZmluZSBERUZBVUxUX1ZJREVPX0lOUFVUX0JVRkZFUl9TSVpFICAgIEFMSUdOX1RPXzhLQihBTElHTl9UT18xMjhCKERFRkFVTFRfRlJBTUVfV0lEVEgpICogQUxJR05fVE9fMzJCKERFRkFVTFRfRlJBTUVfSEVJR0hUKSkgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgQUxJR05fVE9fOEtCKEFMSUdOX1RPXzEyOEIoREVGQVVMVF9GUkFNRV9XSURUSCkgKiBBTElHTl9UT18zMkIoREVGQVVMVF9GUkFNRV9IRUlHSFQgLyAyKSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiAoREVGQVVMVF9GUkFNRV9XSURUSCAqIERFRkFVTFRfRlJBTUVfSEVJR0hUICogMykgLyAyICovCisjZGVmaW5lIERFRkFVTFRfVklERU9fT1VUUFVUX0JVRkZFUl9TSVpFICAgREVGQVVMVF9WSURFT19JTlBVVF9CVUZGRVJfU0laRQorCisjZGVmaW5lIE1GQ19JTlBVVF9CVUZGRVJfTlVNX01BWCAgICAgICAgICAgIDIKKworI2RlZmluZSBJTlBVVF9QT1JUX1NVUFBPUlRGT1JNQVRfTlVNX01BWCAgICA5CisjZGVmaW5lIE9VVFBVVF9QT1JUX1NVUFBPUlRGT1JNQVRfTlVNX01BWCAgIDEKKworI2lmZGVmIFVTRV9TVE9SRU1FVEFEQVRBCisvLyBUaGUgbGFyZ2VzdCBtZXRhZGF0YSBidWZmZXIgc2l6ZSBhZHZlcnRpc2VkCisvLyB3aGVuIG1ldGFkYXRhIGJ1ZmZlciBtb2RlIGlzIHVzZWQgZm9yIHZpZGVvIGVuY29kaW5nCisjZGVmaW5lICBNQVhfSU5QVVRfTUVUQURBVEFfQlVGRkVSX1NJWkUgKDY0KQorI2VuZGlmCisKK3R5cGVkZWYgc3RydWN0Cit7CisgICAgdm9pZCAqcEFkZHJZOworICAgIHZvaWQgKnBBZGRyQzsKK30gTUZDX0VOQ19BRERSX0lORk87CisKK3R5cGVkZWYgc3RydWN0IF9TRUNfTUZDX05CRU5DX1RIUkVBRAoreworICAgIE9NWF9IQU5ETEVUWVBFICBoTkJFbmNvZGVUaHJlYWQ7CisgICAgT01YX0hBTkRMRVRZUEUgIGhFbmNGcmFtZVN0YXJ0OworICAgIE9NWF9IQU5ETEVUWVBFICBoRW5jRnJhbWVFbmQ7CisgICAgT01YX0JPT0wgICAgICAgIGJFeGl0RW5jb2RlVGhyZWFkOworICAgIE9NWF9CT09MICAgICAgICBiRW5jb2RlclJ1bjsKK30gU0VDX01GQ19OQkVOQ19USFJFQUQ7CisKK3R5cGVkZWYgc3RydWN0IF9NRkNfRU5DX0lOUFVUX0JVRkZFUgoreworICAgIHZvaWQgKllQaHlBZGRyOyAvLyBwaHlzaWNhbCBhZGRyZXNzIG9mIFkKKyAgICB2b2lkICpDUGh5QWRkcjsgLy8gcGh5c2ljYWwgYWRkcmVzcyBvZiBDYkNyCisgICAgdm9pZCAqWVZpckFkZHI7IC8vIHZpcnR1YWwgYWRkcmVzcyBvZiBZCisgICAgdm9pZCAqQ1ZpckFkZHI7IC8vIHZpcnR1YWwgYWRkcmVzcyBvZiBDYkNyCisgICAgaW50IFlCdWZmZXJTaXplOyAvLyBpbnB1dCBidWZmZXIgYWxsb2Mgc2l6ZSBvZiBZCisgICAgaW50IENCdWZmZXJTaXplOyAvLyBpbnB1dCBidWZmZXIgYWxsb2Mgc2l6ZSBvZiBDYkNyCisgICAgaW50IFlEYXRhU2l6ZTsgIC8vIGlucHV0IHNpemUgb2YgWSBkYXRhCisgICAgaW50IENEYXRhU2l6ZTsgIC8vIGlucHV0IHNpemUgb2YgQ2JDciBkYXRhCit9IE1GQ19FTkNfSU5QVVRfQlVGRkVSOworCit0eXBlZGVmIHN0cnVjdCBfU0VDX09NWF9WSURFT0VOQ19DT01QT05FTlQKK3sKKyAgICBPTVhfSEFORExFVFlQRSBoQ29kZWNIYW5kbGU7CisgICAgU0VDX01GQ19OQkVOQ19USFJFQUQgTkJFbmNUaHJlYWQ7CisKKyAgICBPTVhfQk9PTCBjb25maWdDaGFuZ2U7CisgICAgT01YX0JPT0wgSW50cmFSZWZyZXNoVk9QOworICAgIE9NWF9WSURFT19DT05UUk9MUkFURVRZUEUgZUNvbnRyb2xSYXRlW0FMTF9QT1JUX05VTV07CisgICAgT01YX1ZJREVPX1BBUkFNX1FVQU5USVpBVElPTlRZUEUgcXVhbnRpemF0aW9uOworICAgIE9NWF9CT09MIGJGaXJzdEZyYW1lOworICAgIE1GQ19FTkNfSU5QVVRfQlVGRkVSIE1GQ0VuY0lucHV0QnVmZmVyW01GQ19JTlBVVF9CVUZGRVJfTlVNX01BWF07CisgICAgT01YX1UzMiAgaW5kZXhJbnB1dEJ1ZmZlcjsKKworICAgIC8qIENTQyBoYW5kbGUgKi8KKyAgICBPTVhfUFRSIGNzY19oYW5kbGU7Cit9IFNFQ19PTVhfVklERU9FTkNfQ09NUE9ORU5UOworCisjaWZkZWYgX19jcGx1c3BsdXMKK2V4dGVybiAiQyIgeworI2VuZGlmCisKK09NWF9FUlJPUlRZUEUgU0VDX09NWF9Vc2VCdWZmZXIoCisgICAgT01YX0lOIE9NWF9IQU5ETEVUWVBFICAgICAgICAgICAgaENvbXBvbmVudCwKKyAgICBPTVhfSU5PVVQgT01YX0JVRkZFUkhFQURFUlRZUEUgKipwcEJ1ZmZlckhkciwKKyAgICBPTVhfSU4gT01YX1UzMiAgICAgICAgICAgICAgICAgICBuUG9ydEluZGV4LAorICAgIE9NWF9JTiBPTVhfUFRSICAgICAgICAgICAgICAgICAgIHBBcHBQcml2YXRlLAorICAgIE9NWF9JTiBPTVhfVTMyICAgICAgICAgICAgICAgICAgIG5TaXplQnl0ZXMsCisgICAgT01YX0lOIE9NWF9VOCAgICAgICAgICAgICAgICAgICAqcEJ1ZmZlcik7CitPTVhfRVJST1JUWVBFIFNFQ19PTVhfQWxsb2NhdGVCdWZmZXIoCisgICAgT01YX0lOIE9NWF9IQU5ETEVUWVBFICAgICAgICAgICAgaENvbXBvbmVudCwKKyAgICBPTVhfSU5PVVQgT01YX0JVRkZFUkhFQURFUlRZUEUgKipwcEJ1ZmZlciwKKyAgICBPTVhfSU4gT01YX1UzMiAgICAgICAgICAgICAgICAgICBuUG9ydEluZGV4LAorICAgIE9NWF9JTiBPTVhfUFRSICAgICAgICAgICAgICAgICAgIHBBcHBQcml2YXRlLAorICAgIE9NWF9JTiBPTVhfVTMyICAgICAgICAgICAgICAgICAgIG5TaXplQnl0ZXMpOworT01YX0VSUk9SVFlQRSBTRUNfT01YX0ZyZWVCdWZmZXIoCisgICAgT01YX0lOIE9NWF9IQU5ETEVUWVBFIGhDb21wb25lbnQsCisgICAgT01YX0lOIE9NWF9VMzIgICAgICAgIG5Qb3J0SW5kZXgsCisgICAgT01YX0lOIE9NWF9CVUZGRVJIRUFERVJUWVBFICpwQnVmZmVySGRyKTsKK09NWF9FUlJPUlRZUEUgU0VDX09NWF9BbGxvY2F0ZVR1bm5lbEJ1ZmZlcigKKyAgICBTRUNfT01YX0JBU0VQT1JUICpwT01YQmFzZVBvcnQsCisgICAgT01YX1UzMiAgICAgICAgICAgblBvcnRJbmRleCk7CitPTVhfRVJST1JUWVBFIFNFQ19PTVhfRnJlZVR1bm5lbEJ1ZmZlcigKKyAgICBTRUNfT01YX0JBU0VQT1JUICpwT01YQmFzZVBvcnQsCisgICAgT01YX1UzMiAgICAgICAgICAgblBvcnRJbmRleCk7CitPTVhfRVJST1JUWVBFIFNFQ19PTVhfQ29tcG9uZW50VHVubmVsUmVxdWVzdCgKKyAgICBPTVhfSU4gT01YX0hBTkRMRVRZUEUgIGhDb21wLAorICAgIE9NWF9JTiBPTVhfVTMyICAgICAgICAgblBvcnQsCisgICAgT01YX0lOIE9NWF9IQU5ETEVUWVBFICBoVHVubmVsZWRDb21wLAorICAgIE9NWF9JTiBPTVhfVTMyICAgICAgICAgblR1bm5lbGVkUG9ydCwKKyAgICBPTVhfSU5PVVQgT01YX1RVTk5FTFNFVFVQVFlQRSAqcFR1bm5lbFNldHVwKTsKK09NWF9FUlJPUlRZUEUgU0VDX09NWF9CdWZmZXJQcm9jZXNzKE9NWF9IQU5ETEVUWVBFIGhDb21wb25lbnQpOworT01YX0VSUk9SVFlQRSBTRUNfT01YX1ZpZGVvRW5jb2RlR2V0UGFyYW1ldGVyKAorICAgIE9NWF9JTiBPTVhfSEFORExFVFlQRSBoQ29tcG9uZW50LAorICAgIE9NWF9JTiBPTVhfSU5ERVhUWVBFICBuUGFyYW1JbmRleCwKKyAgICBPTVhfSU5PVVQgT01YX1BUUiAgICAgQ29tcG9uZW50UGFyYW1ldGVyU3RydWN0dXJlKTsKK09NWF9FUlJPUlRZUEUgU0VDX09NWF9WaWRlb0VuY29kZVNldFBhcmFtZXRlcigKKyAgICBPTVhfSU4gT01YX0hBTkRMRVRZUEUgaENvbXBvbmVudCwKKyAgICBPTVhfSU4gT01YX0lOREVYVFlQRSAgbkluZGV4LAorICAgIE9NWF9JTiBPTVhfUFRSICAgICAgICBDb21wb25lbnRQYXJhbWV0ZXJTdHJ1Y3R1cmUpOworT01YX0VSUk9SVFlQRSBTRUNfT01YX1ZpZGVvRW5jb2RlR2V0Q29uZmlnKAorICAgIE9NWF9IQU5ETEVUWVBFIGhDb21wb25lbnQsCisgICAgT01YX0lOREVYVFlQRSBuSW5kZXgsCisgICAgT01YX1BUUiBwQ29tcG9uZW50Q29uZmlnU3RydWN0dXJlKTsKK09NWF9FUlJPUlRZUEUgU0VDX09NWF9WaWRlb0VuY29kZVNldENvbmZpZygKKyAgICBPTVhfSEFORExFVFlQRSBoQ29tcG9uZW50LAorICAgIE9NWF9JTkRFWFRZUEUgbkluZGV4LAorICAgIE9NWF9QVFIgcENvbXBvbmVudENvbmZpZ1N0cnVjdHVyZSk7CitPTVhfRVJST1JUWVBFIFNFQ19PTVhfVmlkZW9FbmNvZGVHZXRFeHRlbnNpb25JbmRleCgKKyAgICBPTVhfSU4gT01YX0hBTkRMRVRZUEUgIGhDb21wb25lbnQsCisgICAgT01YX0lOIE9NWF9TVFJJTkcgICAgICBjUGFyYW1ldGVyTmFtZSwKKyAgICBPTVhfT1VUIE9NWF9JTkRFWFRZUEUgKnBJbmRleFR5cGUpOworT01YX0VSUk9SVFlQRSBTRUNfT01YX1ZpZGVvRW5jb2RlQ29tcG9uZW50SW5pdChPTVhfSU4gT01YX0hBTkRMRVRZUEUgaENvbXBvbmVudCk7CitPTVhfRVJST1JUWVBFIFNFQ19PTVhfVmlkZW9FbmNvZGVDb21wb25lbnREZWluaXQoT01YX0lOIE9NWF9IQU5ETEVUWVBFIGhDb21wb25lbnQpOworT01YX0JPT0wgU0VDX0NoZWNrX0J1ZmZlclByb2Nlc3NfU3RhdGUoU0VDX09NWF9CQVNFQ09NUE9ORU5UICpwU0VDQ29tcG9uZW50KTsKK2lubGluZSB2b2lkIFNFQ19VcGRhdGVGcmFtZVNpemUoT01YX0NPTVBPTkVOVFRZUEUgKnBPTVhDb21wb25lbnQpOworCisjaWZkZWYgX19jcGx1c3BsdXMKK30KKyNlbmRpZgorCisjZW5kaWYKZGlmZiAtLWdpdCBhL2V4eW5vczQvbXVsdGltZWRpYS9vcGVubWF4L3NlY19vbXgvY29tcG9uZW50L3ZpZGVvL2VuYy9oMjY0L0FuZHJvaWQubWsgYi9leHlub3M0L211bHRpbWVkaWEvb3Blbm1heC9zZWNfb214L2NvbXBvbmVudC92aWRlby9lbmMvaDI2NC9BbmRyb2lkLm1rCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQ4YzdiMDYKLS0tIC9kZXYvbnVsbAorKysgYi9leHlub3M0L211bHRpbWVkaWEvb3Blbm1heC9zZWNfb214L2NvbXBvbmVudC92aWRlby9lbmMvaDI2NC9BbmRyb2lkLm1rCkBAIC0wLDAgKzEsMzkgQEAKK0xPQ0FMX1BBVEggOj0gJChjYWxsIG15LWRpcikKK2luY2x1ZGUgJChDTEVBUl9WQVJTKQorCitMT0NBTF9NT0RVTEVfVEFHUyA6PSBvcHRpb25hbAorCitMT0NBTF9TUkNfRklMRVMgOj0gXAorCVNFQ19PTVhfSDI2NGVuYy5jIFwKKwlsaWJyYXJ5X3JlZ2lzdGVyLmMKKworTE9DQUxfUFJFTElOS19NT0RVTEUgOj0gZmFsc2UKK0xPQ0FMX01PRFVMRSA6PSBsaWJPTVguU0VDLkFWQy5FbmNvZGVyCitMT0NBTF9NT0RVTEVfUEFUSCA6PSAkKFRBUkdFVF9PVVRfU0hBUkVEX0xJQlJBUklFUykvb214CisKK0xPQ0FMX0NGTEFHUyA6PQorCitpZmVxICgkKEJPQVJEX05PTkJMT0NLX01PREVfUFJPQ0VTUyksIHRydWUpCitMT0NBTF9DRkxBR1MgKz0gLUROT05CTE9DS19NT0RFX1BST0NFU1MKK2VuZGlmCisKK2lmZXEgKCQoQk9BUkRfVVNFX01FVEFEQVRBQlVGRkVSVFlQRSksIHRydWUpCitMT0NBTF9DRkxBR1MgKz0gLURVU0VfTUVUQURBVEFCVUZGRVJUWVBFCitlbmRpZgorCitMT0NBTF9BUk1fTU9ERSA6PSBhcm0KKworTE9DQUxfU1RBVElDX0xJQlJBUklFUyA6PSBsaWJTRUNfT01YX1ZlbmMgbGlic2Vjb3NhbCBsaWJzZWNiYXNlY29tcG9uZW50IFwKKwlsaWJzd2NvbnZlcnRlciBsaWJzZWNtZmNhcGkKK0xPQ0FMX1NIQVJFRF9MSUJSQVJJRVMgOj0gbGliYyBsaWJkbCBsaWJjdXRpbHMgbGlidXRpbHMgbGlidWkgXAorCWxpYlNFQ19PTVhfUmVzb3VyY2VtYW5hZ2VyIGxpYmNzYworCitMT0NBTF9DX0lOQ0xVREVTIDo9ICQoU0VDX09NWF9JTkMpL2tocm9ub3MgXAorCSQoU0VDX09NWF9JTkMpL3NlYyBcCisJJChTRUNfT01YX1RPUCkvb3NhbCBcCisJJChTRUNfT01YX1RPUCkvY29yZSBcCisJJChTRUNfT01YX0NPTVBPTkVOVCkvY29tbW9uIFwKKwkkKFNFQ19PTVhfQ09NUE9ORU5UKS92aWRlby9lbmMgXAorICAgICQoVEFSR0VUX09VVF9IRUFERVJTKS8kKFNFQ19DT1BZX0hFQURFUlNfVE8pCisKK2luY2x1ZGUgJChCVUlMRF9TSEFSRURfTElCUkFSWSkKZGlmZiAtLWdpdCBhL2V4eW5vczQvbXVsdGltZWRpYS9vcGVubWF4L3NlY19vbXgvY29tcG9uZW50L3ZpZGVvL2VuYy9oMjY0L1NFQ19PTVhfSDI2NGVuYy5jIGIvZXh5bm9zNC9tdWx0aW1lZGlhL29wZW5tYXgvc2VjX29teC9jb21wb25lbnQvdmlkZW8vZW5jL2gyNjQvU0VDX09NWF9IMjY0ZW5jLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjQxMjNkNwotLS0gL2Rldi9udWxsCisrKyBiL2V4eW5vczQvbXVsdGltZWRpYS9vcGVubWF4L3NlY19vbXgvY29tcG9uZW50L3ZpZGVvL2VuYy9oMjY0L1NFQ19PTVhfSDI2NGVuYy5jCkBAIC0wLDAgKzEsMTYwNSBAQAorLyoKKyAqCisgKiBDb3B5cmlnaHQgMjAxMCBTYW1zdW5nIEVsZWN0cm9uaWNzIFMuTFNJIENvLiBMVEQKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworLyoKKyAqIEBmaWxlICAgICAgICBTRUNfT01YX0gyNjRlbmMuYworICogQGJyaWVmCisgKiBAYXV0aG9yICAgICAgU2V1bmdCZW9tIEtpbSAoc2JjcnV4LmtpbUBzYW1zdW5nLmNvbSkKKyAqIEB2ZXJzaW9uICAgICAxLjEuMAorICogQGhpc3RvcnkKKyAqICAgMjAxMC43LjE1IDogQ3JlYXRlCisgKi8KKworI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8c3RkbGliLmg+CisjaW5jbHVkZSA8c3RyaW5nLmg+CisKKyNpbmNsdWRlICJTRUNfT01YX01hY3Jvcy5oIgorI2luY2x1ZGUgIlNFQ19PTVhfQmFzZWNvbXBvbmVudC5oIgorI2luY2x1ZGUgIlNFQ19PTVhfQmFzZXBvcnQuaCIKKyNpbmNsdWRlICJTRUNfT01YX1ZlbmMuaCIKKyNpbmNsdWRlICJTRUNfT1NBTF9FVEMuaCIKKyNpbmNsdWRlICJTRUNfT1NBTF9TZW1hcGhvcmUuaCIKKyNpbmNsdWRlICJTRUNfT1NBTF9UaHJlYWQuaCIKKyNpbmNsdWRlICJTRUNfT1NBTF9BbmRyb2lkLmgiCisjaW5jbHVkZSAibGlicmFyeV9yZWdpc3Rlci5oIgorI2luY2x1ZGUgIlNFQ19PTVhfSDI2NGVuYy5oIgorI2luY2x1ZGUgIlNzYlNpcE1mY0FwaS5oIgorI2luY2x1ZGUgImNzYy5oIgorCisjdW5kZWYgIFNFQ19MT0dfVEFHCisjZGVmaW5lIFNFQ19MT0dfVEFHICAgICJTRUNfSDI2NF9FTkMiCisjZGVmaW5lIFNFQ19MT0dfT0ZGCisjaW5jbHVkZSAiU0VDX09TQUxfTG9nLmgiCisKKworLyogSC4yNjQgRW5jb2RlciBTdXBwb3J0ZWQgTGV2ZWxzICYgcHJvZmlsZXMgKi8KK1NFQ19PTVhfVklERU9fUFJPRklMRUxFVkVMIHN1cHBvcnRlZEFWQ1Byb2ZpbGVMZXZlbHNbXSA9eworICAgIHtPTVhfVklERU9fQVZDUHJvZmlsZUJhc2VsaW5lLCBPTVhfVklERU9fQVZDTGV2ZWwxfSwKKyAgICB7T01YX1ZJREVPX0FWQ1Byb2ZpbGVCYXNlbGluZSwgT01YX1ZJREVPX0FWQ0xldmVsMWJ9LAorICAgIHtPTVhfVklERU9fQVZDUHJvZmlsZUJhc2VsaW5lLCBPTVhfVklERU9fQVZDTGV2ZWwxMX0sCisgICAge09NWF9WSURFT19BVkNQcm9maWxlQmFzZWxpbmUsIE9NWF9WSURFT19BVkNMZXZlbDEyfSwKKyAgICB7T01YX1ZJREVPX0FWQ1Byb2ZpbGVCYXNlbGluZSwgT01YX1ZJREVPX0FWQ0xldmVsMTN9LAorICAgIHtPTVhfVklERU9fQVZDUHJvZmlsZUJhc2VsaW5lLCBPTVhfVklERU9fQVZDTGV2ZWwyfSwKKyAgICB7T01YX1ZJREVPX0FWQ1Byb2ZpbGVCYXNlbGluZSwgT01YX1ZJREVPX0FWQ0xldmVsMjF9LAorICAgIHtPTVhfVklERU9fQVZDUHJvZmlsZUJhc2VsaW5lLCBPTVhfVklERU9fQVZDTGV2ZWwyMn0sCisgICAge09NWF9WSURFT19BVkNQcm9maWxlQmFzZWxpbmUsIE9NWF9WSURFT19BVkNMZXZlbDN9LAorICAgIHtPTVhfVklERU9fQVZDUHJvZmlsZUJhc2VsaW5lLCBPTVhfVklERU9fQVZDTGV2ZWwzMX0sCisgICAge09NWF9WSURFT19BVkNQcm9maWxlQmFzZWxpbmUsIE9NWF9WSURFT19BVkNMZXZlbDMyfSwKKyAgICB7T01YX1ZJREVPX0FWQ1Byb2ZpbGVCYXNlbGluZSwgT01YX1ZJREVPX0FWQ0xldmVsNH0sCisKKyAgICB7T01YX1ZJREVPX0FWQ1Byb2ZpbGVNYWluLCBPTVhfVklERU9fQVZDTGV2ZWwxfSwKKyAgICB7T01YX1ZJREVPX0FWQ1Byb2ZpbGVNYWluLCBPTVhfVklERU9fQVZDTGV2ZWwxYn0sCisgICAge09NWF9WSURFT19BVkNQcm9maWxlTWFpbiwgT01YX1ZJREVPX0FWQ0xldmVsMTF9LAorICAgIHtPTVhfVklERU9fQVZDUHJvZmlsZU1haW4sIE9NWF9WSURFT19BVkNMZXZlbDEyfSwKKyAgICB7T01YX1ZJREVPX0FWQ1Byb2ZpbGVNYWluLCBPTVhfVklERU9fQVZDTGV2ZWwxM30sCisgICAge09NWF9WSURFT19BVkNQcm9maWxlTWFpbiwgT01YX1ZJREVPX0FWQ0xldmVsMn0sCisgICAge09NWF9WSURFT19BVkNQcm9maWxlTWFpbiwgT01YX1ZJREVPX0FWQ0xldmVsMjF9LAorICAgIHtPTVhfVklERU9fQVZDUHJvZmlsZU1haW4sIE9NWF9WSURFT19BVkNMZXZlbDIyfSwKKyAgICB7T01YX1ZJREVPX0FWQ1Byb2ZpbGVNYWluLCBPTVhfVklERU9fQVZDTGV2ZWwzfSwKKyAgICB7T01YX1ZJREVPX0FWQ1Byb2ZpbGVNYWluLCBPTVhfVklERU9fQVZDTGV2ZWwzMX0sCisgICAge09NWF9WSURFT19BVkNQcm9maWxlTWFpbiwgT01YX1ZJREVPX0FWQ0xldmVsMzJ9LAorICAgIHtPTVhfVklERU9fQVZDUHJvZmlsZU1haW4sIE9NWF9WSURFT19BVkNMZXZlbDR9LAorCisgICAge09NWF9WSURFT19BVkNQcm9maWxlSGlnaCwgT01YX1ZJREVPX0FWQ0xldmVsMX0sCisgICAge09NWF9WSURFT19BVkNQcm9maWxlSGlnaCwgT01YX1ZJREVPX0FWQ0xldmVsMWJ9LAorICAgIHtPTVhfVklERU9fQVZDUHJvZmlsZUhpZ2gsIE9NWF9WSURFT19BVkNMZXZlbDExfSwKKyAgICB7T01YX1ZJREVPX0FWQ1Byb2ZpbGVIaWdoLCBPTVhfVklERU9fQVZDTGV2ZWwxMn0sCisgICAge09NWF9WSURFT19BVkNQcm9maWxlSGlnaCwgT01YX1ZJREVPX0FWQ0xldmVsMTN9LAorICAgIHtPTVhfVklERU9fQVZDUHJvZmlsZUhpZ2gsIE9NWF9WSURFT19BVkNMZXZlbDJ9LAorICAgIHtPTVhfVklERU9fQVZDUHJvZmlsZUhpZ2gsIE9NWF9WSURFT19BVkNMZXZlbDIxfSwKKyAgICB7T01YX1ZJREVPX0FWQ1Byb2ZpbGVIaWdoLCBPTVhfVklERU9fQVZDTGV2ZWwyMn0sCisgICAge09NWF9WSURFT19BVkNQcm9maWxlSGlnaCwgT01YX1ZJREVPX0FWQ0xldmVsM30sCisgICAge09NWF9WSURFT19BVkNQcm9maWxlSGlnaCwgT01YX1ZJREVPX0FWQ0xldmVsMzF9LAorICAgIHtPTVhfVklERU9fQVZDUHJvZmlsZUhpZ2gsIE9NWF9WSURFT19BVkNMZXZlbDMyfSwKKyAgICB7T01YX1ZJREVPX0FWQ1Byb2ZpbGVIaWdoLCBPTVhfVklERU9fQVZDTGV2ZWw0fX07CisKKworT01YX1UzMiBPTVhBVkNQcm9maWxlVG9Qcm9maWxlSURDKE9NWF9WSURFT19BVkNQUk9GSUxFVFlQRSBwcm9maWxlKQoreworICAgIE9NWF9VMzIgcmV0ID0gMDsgLy9kZWZhdWx0IE9NWF9WSURFT19BVkNQcm9maWxlTWFpbgorCisgICAgaWYgKHByb2ZpbGUgPT0gT01YX1ZJREVPX0FWQ1Byb2ZpbGVNYWluKQorICAgICAgICByZXQgPSAwOworICAgIGVsc2UgaWYgKHByb2ZpbGUgPT0gT01YX1ZJREVPX0FWQ1Byb2ZpbGVIaWdoKQorICAgICAgICByZXQgPSAxOworICAgIGVsc2UgaWYgKHByb2ZpbGUgPT0gT01YX1ZJREVPX0FWQ1Byb2ZpbGVCYXNlbGluZSkKKyAgICAgICAgcmV0ID0gMjsKKworICAgIHJldHVybiByZXQ7Cit9CisKK09NWF9VMzIgT01YQVZDTGV2ZWxUb0xldmVsSURDKE9NWF9WSURFT19BVkNMRVZFTFRZUEUgbGV2ZWwpCit7CisgICAgT01YX1UzMiByZXQgPSA0MDsgLy9kZWZhdWx0IE9NWF9WSURFT19BVkNMZXZlbDQKKworICAgIGlmIChsZXZlbCA9PSBPTVhfVklERU9fQVZDTGV2ZWwxKQorICAgICAgICByZXQgPSAxMDsKKyAgICBlbHNlIGlmIChsZXZlbCA9PSBPTVhfVklERU9fQVZDTGV2ZWwxYikKKyAgICAgICAgcmV0ID0gOTsKKyAgICBlbHNlIGlmIChsZXZlbCA9PSBPTVhfVklERU9fQVZDTGV2ZWwxMSkKKyAgICAgICAgcmV0ID0gMTE7CisgICAgZWxzZSBpZiAobGV2ZWwgPT0gT01YX1ZJREVPX0FWQ0xldmVsMTIpCisgICAgICAgIHJldCA9IDEyOworICAgIGVsc2UgaWYgKGxldmVsID09IE9NWF9WSURFT19BVkNMZXZlbDEzKQorICAgICAgICByZXQgPSAxMzsKKyAgICBlbHNlIGlmIChsZXZlbCA9PSBPTVhfVklERU9fQVZDTGV2ZWwyKQorICAgICAgICByZXQgPSAyMDsKKyAgICBlbHNlIGlmIChsZXZlbCA9PSBPTVhfVklERU9fQVZDTGV2ZWwyMSkKKyAgICAgICAgcmV0ID0gMjE7CisgICAgZWxzZSBpZiAobGV2ZWwgPT0gT01YX1ZJREVPX0FWQ0xldmVsMjIpCisgICAgICAgIHJldCA9IDIyOworICAgIGVsc2UgaWYgKGxldmVsID09IE9NWF9WSURFT19BVkNMZXZlbDMpCisgICAgICAgIHJldCA9IDMwOworICAgIGVsc2UgaWYgKGxldmVsID09IE9NWF9WSURFT19BVkNMZXZlbDMxKQorICAgICAgICByZXQgPSAzMTsKKyAgICBlbHNlIGlmIChsZXZlbCA9PSBPTVhfVklERU9fQVZDTGV2ZWwzMikKKyAgICAgICAgcmV0ID0gMzI7CisgICAgZWxzZSBpZiAobGV2ZWwgPT0gT01YX1ZJREVPX0FWQ0xldmVsNCkKKyAgICAgICAgcmV0ID0gNDA7CisKKyAgICByZXR1cm4gcmV0OworfQorCitPTVhfVTggKkZpbmREZWxpbWl0ZXIoT01YX1U4ICpwQnVmZmVyLCBPTVhfVTMyIHNpemUpCit7CisgICAgT01YX1UzMiBpOworCisgICAgZm9yIChpID0gMDsgaSA8IHNpemUgLSAzOyBpKyspIHsKKyAgICAgICAgaWYgKChwQnVmZmVyW2ldID09IDB4MDApICAgJiYKKyAgICAgICAgICAgIChwQnVmZmVyW2kgKyAxXSA9PSAweDAwKSAmJgorICAgICAgICAgICAgKHBCdWZmZXJbaSArIDJdID09IDB4MDApICYmCisgICAgICAgICAgICAocEJ1ZmZlcltpICsgM10gPT0gMHgwMSkpCisgICAgICAgICAgICByZXR1cm4gKHBCdWZmZXIgKyBpKTsKKyAgICB9CisKKyAgICByZXR1cm4gTlVMTDsKK30KKwordm9pZCBIMjY0UHJpbnRQYXJhbXMoU1NCU0lQX01GQ19FTkNfSDI2NF9QQVJBTSAqaDI2NEFyZykKK3sKKyAgICBTRUNfT1NBTF9Mb2coU0VDX0xPR19UUkFDRSwgIlNvdXJjZVdpZHRoICAgICAgICAgICAgIDogJWRcbiIsIGgyNjRBcmctPlNvdXJjZVdpZHRoKTsKKyAgICBTRUNfT1NBTF9Mb2coU0VDX0xPR19UUkFDRSwgIlNvdXJjZUhlaWdodCAgICAgICAgICAgIDogJWRcbiIsIGgyNjRBcmctPlNvdXJjZUhlaWdodCk7CisgICAgU0VDX09TQUxfTG9nKFNFQ19MT0dfVFJBQ0UsICJQcm9maWxlSURDICAgICAgICAgICAgICA6ICVkXG4iLCBoMjY0QXJnLT5Qcm9maWxlSURDKTsKKyAgICBTRUNfT1NBTF9Mb2coU0VDX0xPR19UUkFDRSwgIkxldmVsSURDICAgICAgICAgICAgICAgIDogJWRcbiIsIGgyNjRBcmctPkxldmVsSURDKTsKKyAgICBTRUNfT1NBTF9Mb2coU0VDX0xPR19UUkFDRSwgIklEUlBlcmlvZCAgICAgICAgICAgICAgIDogJWRcbiIsIGgyNjRBcmctPklEUlBlcmlvZCk7CisgICAgU0VDX09TQUxfTG9nKFNFQ19MT0dfVFJBQ0UsICJOdW1iZXJSZWZlcmVuY2VGcmFtZXMgICA6ICVkXG4iLCBoMjY0QXJnLT5OdW1iZXJSZWZlcmVuY2VGcmFtZXMpOworICAgIFNFQ19PU0FMX0xvZyhTRUNfTE9HX1RSQUNFLCAiTnVtYmVyUmVmRm9yUGZyYW1lcyAgICAgOiAlZFxuIiwgaDI2NEFyZy0+TnVtYmVyUmVmRm9yUGZyYW1lcyk7CisgICAgU0VDX09TQUxfTG9nKFNFQ19MT0dfVFJBQ0UsICJTbGljZU1vZGUgICAgICAgICAgICAgICA6ICVkXG4iLCBoMjY0QXJnLT5TbGljZU1vZGUpOworICAgIFNFQ19PU0FMX0xvZyhTRUNfTE9HX1RSQUNFLCAiU2xpY2VBcmd1bWVudCAgICAgICAgICAgOiAlZFxuIiwgaDI2NEFyZy0+U2xpY2VBcmd1bWVudCk7CisjaWZkZWYgVVNFX1NMSUNFX09VVFBVVF9NT0RFCisgICAgU0VDX09TQUxfTG9nKFNFQ19MT0dfVFJBQ0UsICJPdXRwdXRNb2RlICAgICAgICAgICAgICA6ICVkXG4iLCBoMjY0QXJnLT5PdXRwdXRNb2RlKTsKKyNlbmRpZgorICAgIFNFQ19PU0FMX0xvZyhTRUNfTE9HX1RSQUNFLCAiTnVtYmVyQkZyYW1lcyAgICAgICAgICAgOiAlZFxuIiwgaDI2NEFyZy0+TnVtYmVyQkZyYW1lcyk7CisgICAgU0VDX09TQUxfTG9nKFNFQ19MT0dfVFJBQ0UsICJMb29wRmlsdGVyRGlzYWJsZSAgICAgICA6ICVkXG4iLCBoMjY0QXJnLT5Mb29wRmlsdGVyRGlzYWJsZSk7CisgICAgU0VDX09TQUxfTG9nKFNFQ19MT0dfVFJBQ0UsICJMb29wRmlsdGVyQWxwaGFDME9mZnNldCA6ICVkXG4iLCBoMjY0QXJnLT5Mb29wRmlsdGVyQWxwaGFDME9mZnNldCk7CisgICAgU0VDX09TQUxfTG9nKFNFQ19MT0dfVFJBQ0UsICJMb29wRmlsdGVyQmV0YU9mZnNldCAgICA6ICVkXG4iLCBoMjY0QXJnLT5Mb29wRmlsdGVyQmV0YU9mZnNldCk7CisgICAgU0VDX09TQUxfTG9nKFNFQ19MT0dfVFJBQ0UsICJTeW1ib2xNb2RlICAgICAgICAgICAgICA6ICVkXG4iLCBoMjY0QXJnLT5TeW1ib2xNb2RlKTsKKyAgICBTRUNfT1NBTF9Mb2coU0VDX0xPR19UUkFDRSwgIlBpY3R1cmVJbnRlcmxhY2UgICAgICAgIDogJWRcbiIsIGgyNjRBcmctPlBpY3R1cmVJbnRlcmxhY2UpOworICAgIFNFQ19PU0FMX0xvZyhTRUNfTE9HX1RSQUNFLCAiVHJhbnNmb3JtOHg4TW9kZSAgICAgICAgOiAlZFxuIiwgaDI2NEFyZy0+VHJhbnNmb3JtOHg4TW9kZSk7CisgICAgU0VDX09TQUxfTG9nKFNFQ19MT0dfVFJBQ0UsICJSYW5kb21JbnRyYU1CUmVmcmVzaCAgICA6ICVkXG4iLCBoMjY0QXJnLT5SYW5kb21JbnRyYU1CUmVmcmVzaCk7CisgICAgU0VDX09TQUxfTG9nKFNFQ19MT0dfVFJBQ0UsICJQYWRDb250cm9sT24gICAgICAgICAgICA6ICVkXG4iLCBoMjY0QXJnLT5QYWRDb250cm9sT24pOworICAgIFNFQ19PU0FMX0xvZyhTRUNfTE9HX1RSQUNFLCAiTHVtYVBhZFZhbCAgICAgICAgICAgICAgOiAlZFxuIiwgaDI2NEFyZy0+THVtYVBhZFZhbCk7CisgICAgU0VDX09TQUxfTG9nKFNFQ19MT0dfVFJBQ0UsICJDYlBhZFZhbCAgICAgICAgICAgICAgICA6ICVkXG4iLCBoMjY0QXJnLT5DYlBhZFZhbCk7CisgICAgU0VDX09TQUxfTG9nKFNFQ19MT0dfVFJBQ0UsICJDclBhZFZhbCAgICAgICAgICAgICAgICA6ICVkXG4iLCBoMjY0QXJnLT5DclBhZFZhbCk7CisgICAgU0VDX09TQUxfTG9nKFNFQ19MT0dfVFJBQ0UsICJFbmFibGVGUk1SYXRlQ29udHJvbCAgICA6ICVkXG4iLCBoMjY0QXJnLT5FbmFibGVGUk1SYXRlQ29udHJvbCk7CisgICAgU0VDX09TQUxfTG9nKFNFQ19MT0dfVFJBQ0UsICJFbmFibGVNQlJhdGVDb250cm9sICAgICA6ICVkXG4iLCBoMjY0QXJnLT5FbmFibGVNQlJhdGVDb250cm9sKTsKKyAgICBTRUNfT1NBTF9Mb2coU0VDX0xPR19UUkFDRSwgIkZyYW1lUmF0ZSAgICAgICAgICAgICAgIDogJWRcbiIsIGgyNjRBcmctPkZyYW1lUmF0ZSk7CisgICAgU0VDX09TQUxfTG9nKFNFQ19MT0dfVFJBQ0UsICJCaXRyYXRlICAgICAgICAgICAgICAgICA6ICVkXG4iLCBoMjY0QXJnLT5CaXRyYXRlKTsKKyAgICBTRUNfT1NBTF9Mb2coU0VDX0xPR19UUkFDRSwgIkZyYW1lUXAgICAgICAgICAgICAgICAgIDogJWRcbiIsIGgyNjRBcmctPkZyYW1lUXApOworICAgIFNFQ19PU0FMX0xvZyhTRUNfTE9HX1RSQUNFLCAiUVNDb2RlTWF4ICAgICAgICAgICAgICAgOiAlZFxuIiwgaDI2NEFyZy0+UVNDb2RlTWF4KTsKKyAgICBTRUNfT1NBTF9Mb2coU0VDX0xPR19UUkFDRSwgIlFTQ29kZU1pbiAgICAgICAgICAgICAgIDogJWRcbiIsIGgyNjRBcmctPlFTQ29kZU1pbik7CisgICAgU0VDX09TQUxfTG9nKFNFQ19MT0dfVFJBQ0UsICJDQlJQZXJpb2RSZiAgICAgICAgICAgICA6ICVkXG4iLCBoMjY0QXJnLT5DQlJQZXJpb2RSZik7CisgICAgU0VDX09TQUxfTG9nKFNFQ19MT0dfVFJBQ0UsICJEYXJrRGlzYWJsZSAgICAgICAgICAgICA6ICVkXG4iLCBoMjY0QXJnLT5EYXJrRGlzYWJsZSk7CisgICAgU0VDX09TQUxfTG9nKFNFQ19MT0dfVFJBQ0UsICJTbW9vdGhEaXNhYmxlICAgICAgICAgICA6ICVkXG4iLCBoMjY0QXJnLT5TbW9vdGhEaXNhYmxlKTsKKyAgICBTRUNfT1NBTF9Mb2coU0VDX0xPR19UUkFDRSwgIlN0YXRpY0Rpc2FibGUgICAgICAgICAgIDogJWRcbiIsIGgyNjRBcmctPlN0YXRpY0Rpc2FibGUpOworICAgIFNFQ19PU0FMX0xvZyhTRUNfTE9HX1RSQUNFLCAiQWN0aXZpdHlEaXNhYmxlICAgICAgICAgOiAlZFxuIiwgaDI2NEFyZy0+QWN0aXZpdHlEaXNhYmxlKTsKKyAgICBTRUNfT1NBTF9Mb2coU0VDX0xPR19UUkFDRSwgIkZyYW1lTWFwICAgICAgICAgICAgICAgIDogJWRcbiIsIGgyNjRBcmctPkZyYW1lTWFwKTsKK30KKwordm9pZCBTZXRfSDI2NEVuY19QYXJhbShTU0JTSVBfTUZDX0VOQ19IMjY0X1BBUkFNICpwSDI2NEFyZywgU0VDX09NWF9CQVNFQ09NUE9ORU5UICpwU0VDQ29tcG9uZW50KQoreworICAgIFNFQ19PTVhfQkFTRVBPUlQgICAgICAgICAgKnBTRUNJbnB1dFBvcnQgPSBOVUxMOworICAgIFNFQ19PTVhfQkFTRVBPUlQgICAgICAgICAgKnBTRUNPdXRwdXRQb3J0ID0gTlVMTDsKKyAgICBTRUNfT01YX1ZJREVPRU5DX0NPTVBPTkVOVCAqcFZpZGVvRW5jID0gTlVMTDsKKyAgICBTRUNfSDI2NEVOQ19IQU5ETEUgICAgICAgICpwSDI2NEVuYyA9IE5VTEw7CisKKyAgICBwVmlkZW9FbmMgPSAoU0VDX09NWF9WSURFT0VOQ19DT01QT05FTlQgKilwU0VDQ29tcG9uZW50LT5oQ29tcG9uZW50SGFuZGxlOworICAgIHBIMjY0RW5jID0gKFNFQ19IMjY0RU5DX0hBTkRMRSAqKSgoU0VDX09NWF9WSURFT0VOQ19DT01QT05FTlQgKilwU0VDQ29tcG9uZW50LT5oQ29tcG9uZW50SGFuZGxlKS0+aENvZGVjSGFuZGxlOworICAgIHBTRUNJbnB1dFBvcnQgPSAmcFNFQ0NvbXBvbmVudC0+cFNFQ1BvcnRbSU5QVVRfUE9SVF9JTkRFWF07CisgICAgcFNFQ091dHB1dFBvcnQgPSAmcFNFQ0NvbXBvbmVudC0+cFNFQ1BvcnRbT1VUUFVUX1BPUlRfSU5ERVhdOworCisgICAgcEgyNjRBcmctPmNvZGVjVHlwZSAgICA9IEgyNjRfRU5DOworICAgIHBIMjY0QXJnLT5Tb3VyY2VXaWR0aCAgPSBwU0VDT3V0cHV0UG9ydC0+cG9ydERlZmluaXRpb24uZm9ybWF0LnZpZGVvLm5GcmFtZVdpZHRoOworICAgIHBIMjY0QXJnLT5Tb3VyY2VIZWlnaHQgPSBwU0VDT3V0cHV0UG9ydC0+cG9ydERlZmluaXRpb24uZm9ybWF0LnZpZGVvLm5GcmFtZUhlaWdodDsKKyAgICBwSDI2NEFyZy0+SURSUGVyaW9kICAgID0gcEgyNjRFbmMtPkFWQ0NvbXBvbmVudFtPVVRQVVRfUE9SVF9JTkRFWF0ublBGcmFtZXMgKyAxOworICAgIHBIMjY0QXJnLT5TbGljZU1vZGUgICAgPSAwOworI2lmZGVmIFVTRV9TTElDRV9PVVRQVVRfTU9ERQorICAgIHBIMjY0QXJnLT5PdXRwdXRNb2RlICAgPSBGUkFNRTsKKyNlbmRpZgorICAgIHBIMjY0QXJnLT5SYW5kb21JbnRyYU1CUmVmcmVzaCA9IDA7CisgICAgcEgyNjRBcmctPkJpdHJhdGUgICAgICA9IHBTRUNPdXRwdXRQb3J0LT5wb3J0RGVmaW5pdGlvbi5mb3JtYXQudmlkZW8ubkJpdHJhdGU7CisgICAgcEgyNjRBcmctPlFTQ29kZU1heCAgICA9IDUxOworICAgIHBIMjY0QXJnLT5RU0NvZGVNaW4gICAgPSAxMDsKKyAgICBwSDI2NEFyZy0+UGFkQ29udHJvbE9uID0gMDsgICAgICAgICAgICAgLy8gMDogZGlzYWJsZSwgMTogZW5hYmxlCisgICAgcEgyNjRBcmctPkx1bWFQYWRWYWwgICA9IDA7CisgICAgcEgyNjRBcmctPkNiUGFkVmFsICAgICA9IDA7CisgICAgcEgyNjRBcmctPkNyUGFkVmFsICAgICA9IDA7CisKKyAgICBwSDI2NEFyZy0+UHJvZmlsZUlEQyAgID0gT01YQVZDUHJvZmlsZVRvUHJvZmlsZUlEQyhwSDI2NEVuYy0+QVZDQ29tcG9uZW50W09VVFBVVF9QT1JUX0lOREVYXS5lUHJvZmlsZSk7IC8vMDsgIC8vKE9NWF9WSURFT19BVkNQcm9maWxlTWFpbikKKyAgICBwSDI2NEFyZy0+TGV2ZWxJREMgICAgID0gT01YQVZDTGV2ZWxUb0xldmVsSURDKHBIMjY0RW5jLT5BVkNDb21wb25lbnRbT1VUUFVUX1BPUlRfSU5ERVhdLmVMZXZlbCk7ICAgICAgIC8vNDA7IC8vKE9NWF9WSURFT19BVkNMZXZlbDQpCisgICAgcEgyNjRBcmctPkZyYW1lUmF0ZSAgICA9IChwU0VDSW5wdXRQb3J0LT5wb3J0RGVmaW5pdGlvbi5mb3JtYXQudmlkZW8ueEZyYW1lcmF0ZSkgPj4gMTY7CisgICAgcEgyNjRBcmctPlNsaWNlQXJndW1lbnQgPSAwOyAgICAgICAgICAvLyBTbGljZSBtYi9ieXRlIHNpemUgbnVtYmVyCisgICAgcEgyNjRBcmctPk51bWJlckJGcmFtZXMgPSAwOyAgICAgICAgICAgIC8vIDAgfiAyCisgICAgcEgyNjRBcmctPk51bWJlclJlZmVyZW5jZUZyYW1lcyA9IDE7CisgICAgcEgyNjRBcmctPk51bWJlclJlZkZvclBmcmFtZXMgICA9IDE7CisgICAgcEgyNjRBcmctPkxvb3BGaWx0ZXJEaXNhYmxlICAgICA9IDE7ICAgIC8vIDE6IExvb3AgRmlsdGVyIERpc2FibGUsIDA6IEZpbHRlciBFbmFibGUKKyAgICBwSDI2NEFyZy0+TG9vcEZpbHRlckFscGhhQzBPZmZzZXQgPSAwOworICAgIHBIMjY0QXJnLT5Mb29wRmlsdGVyQmV0YU9mZnNldCAgICA9IDA7CisgICAgcEgyNjRBcmctPlN5bWJvbE1vZGUgICAgICAgPSAwOyAgICAgICAgIC8vIDA6IENBVkxDLCAxOiBDQUJBQworICAgIHBIMjY0QXJnLT5QaWN0dXJlSW50ZXJsYWNlID0gMDsKKyAgICBwSDI2NEFyZy0+VHJhbnNmb3JtOHg4TW9kZSA9IDA7ICAgICAgICAgLy8gMDogNHg0LCAxOiBhbGxvdyA4eDgKKyAgICBwSDI2NEFyZy0+RGFya0Rpc2FibGUgICAgID0gMTsKKyAgICBwSDI2NEFyZy0+U21vb3RoRGlzYWJsZSAgID0gMTsKKyAgICBwSDI2NEFyZy0+U3RhdGljRGlzYWJsZSAgID0gMTsKKyAgICBwSDI2NEFyZy0+QWN0aXZpdHlEaXNhYmxlID0gMTsKKworICAgIHBIMjY0QXJnLT5GcmFtZVFwICAgICAgPSBwVmlkZW9FbmMtPnF1YW50aXphdGlvbi5uUXBJOworICAgIHBIMjY0QXJnLT5GcmFtZVFwX1AgICAgPSBwVmlkZW9FbmMtPnF1YW50aXphdGlvbi5uUXBQOworICAgIHBIMjY0QXJnLT5GcmFtZVFwX0IgICAgPSBwVmlkZW9FbmMtPnF1YW50aXphdGlvbi5uUXBCOworCisgICAgU0VDX09TQUxfTG9nKFNFQ19MT0dfVFJBQ0UsICJwVmlkZW9FbmMtPmVDb250cm9sUmF0ZVtPVVRQVVRfUE9SVF9JTkRFWF06IDB4JXgiLCBwVmlkZW9FbmMtPmVDb250cm9sUmF0ZVtPVVRQVVRfUE9SVF9JTkRFWF0pOworICAgIHN3aXRjaCAocFZpZGVvRW5jLT5lQ29udHJvbFJhdGVbT1VUUFVUX1BPUlRfSU5ERVhdKSB7CisgICAgY2FzZSBPTVhfVmlkZW9fQ29udHJvbFJhdGVWYXJpYWJsZToKKyAgICAgICAgU0VDX09TQUxfTG9nKFNFQ19MT0dfVFJBQ0UsICJWaWRlbyBFbmNvZGUgVkJSIik7CisgICAgICAgIHBIMjY0QXJnLT5FbmFibGVGUk1SYXRlQ29udHJvbCA9IDA7ICAgICAgICAvLyAwOiBEaXNhYmxlLCAxOiBGcmFtZSBsZXZlbCBSQworICAgICAgICBwSDI2NEFyZy0+RW5hYmxlTUJSYXRlQ29udHJvbCAgPSAwOyAgICAgICAgLy8gMDogRGlzYWJsZSwgMTpNQiBsZXZlbCBSQworICAgICAgICBwSDI2NEFyZy0+Q0JSUGVyaW9kUmYgID0gMTAwOworICAgICAgICBicmVhazsKKyAgICBjYXNlIE9NWF9WaWRlb19Db250cm9sUmF0ZUNvbnN0YW50OgorICAgICAgICBTRUNfT1NBTF9Mb2coU0VDX0xPR19UUkFDRSwgIlZpZGVvIEVuY29kZSBDQlIiKTsKKyAgICAgICAgcEgyNjRBcmctPkVuYWJsZUZSTVJhdGVDb250cm9sID0gMTsgICAgICAgIC8vIDA6IERpc2FibGUsIDE6IEZyYW1lIGxldmVsIFJDCisgICAgICAgIHBIMjY0QXJnLT5FbmFibGVNQlJhdGVDb250cm9sICA9IDE7ICAgICAgICAgLy8gMDogRGlzYWJsZSwgMTpNQiBsZXZlbCBSQworICAgICAgICBwSDI2NEFyZy0+Q0JSUGVyaW9kUmYgID0gMTA7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgT01YX1ZpZGVvX0NvbnRyb2xSYXRlRGlzYWJsZToKKyAgICBkZWZhdWx0OiAvL0FuZHJvaWQgZGVmYXVsdAorICAgICAgICBTRUNfT1NBTF9Mb2coU0VDX0xPR19UUkFDRSwgIlZpZGVvIEVuY29kZSBWQlIiKTsKKyAgICAgICAgcEgyNjRBcmctPkVuYWJsZUZSTVJhdGVDb250cm9sID0gMDsKKyAgICAgICAgcEgyNjRBcmctPkVuYWJsZU1CUmF0ZUNvbnRyb2wgID0gMDsKKyAgICAgICAgcEgyNjRBcmctPkNCUlBlcmlvZFJmICA9IDEwMDsKKyAgICAgICAgYnJlYWs7CisgICAgfQorCisgICAgc3dpdGNoICgoU0VDX09NWF9DT0xPUl9GT1JNQVRUWVBFKXBTRUNJbnB1dFBvcnQtPnBvcnREZWZpbml0aW9uLmZvcm1hdC52aWRlby5lQ29sb3JGb3JtYXQpIHsKKyAgICBjYXNlIE9NWF9TRUNfQ09MT1JfRm9ybWF0TlYxMkxQaHlzaWNhbEFkZHJlc3M6CisgICAgY2FzZSBPTVhfU0VDX0NPTE9SX0Zvcm1hdE5WMTJMVmlydHVhbEFkZHJlc3M6CisgICAgY2FzZSBPTVhfQ09MT1JfRm9ybWF0WVVWNDIwU2VtaVBsYW5hcjoKKyAgICBjYXNlIE9NWF9DT0xPUl9Gb3JtYXRZVVY0MjBQbGFuYXI6CisjaWZkZWYgVVNFX01FVEFEQVRBQlVGRkVSVFlQRQorICAgIGNhc2UgT01YX0NPTE9SX0Zvcm1hdEFuZHJvaWRPcGFxdWU6CisjZW5kaWYKKyAgICAgICAgcEgyNjRBcmctPkZyYW1lTWFwID0gTlYxMl9MSU5FQVI7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgT01YX1NFQ19DT0xPUl9Gb3JtYXROVjEyVFBoeXNpY2FsQWRkcmVzczoKKyAgICBjYXNlIE9NWF9TRUNfQ09MT1JfRm9ybWF0TlYxMlRpbGVkOgorICAgICAgICBwSDI2NEFyZy0+RnJhbWVNYXAgPSBOVjEyX1RJTEU7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgT01YX1NFQ19DT0xPUl9Gb3JtYXROVjIxTFBoeXNpY2FsQWRkcmVzczoKKyAgICBjYXNlIE9NWF9TRUNfQ09MT1JfRm9ybWF0TlYyMUxpbmVhcjoKKyAgICAgICAgcEgyNjRBcmctPkZyYW1lTWFwID0gTlYyMV9MSU5FQVI7CisgICAgICAgIGJyZWFrOworICAgIGRlZmF1bHQ6CisgICAgICAgIHBIMjY0QXJnLT5GcmFtZU1hcCA9IE5WMTJfVElMRTsKKyAgICAgICAgYnJlYWs7CisgICAgfQorCisgICAgSDI2NFByaW50UGFyYW1zKHBIMjY0QXJnKTsKK30KKwordm9pZCBDaGFuZ2VfSDI2NEVuY19QYXJhbShTU0JTSVBfTUZDX0VOQ19IMjY0X1BBUkFNICpwSDI2NEFyZywgU0VDX09NWF9CQVNFQ09NUE9ORU5UICpwU0VDQ29tcG9uZW50KQoreworICAgIFNFQ19PTVhfQkFTRVBPUlQgICAgICAgICAgKnBTRUNJbnB1dFBvcnQgPSBOVUxMOworICAgIFNFQ19PTVhfQkFTRVBPUlQgICAgICAgICAgKnBTRUNPdXRwdXRQb3J0ID0gTlVMTDsKKyAgICBTRUNfT01YX1ZJREVPRU5DX0NPTVBPTkVOVCAqcFZpZGVvRW5jID0gTlVMTDsKKyAgICBTRUNfSDI2NEVOQ19IQU5ETEUgICAgICAgICpwSDI2NEVuYyA9IE5VTEw7CisKKyAgICBwVmlkZW9FbmMgPSAoU0VDX09NWF9WSURFT0VOQ19DT01QT05FTlQgKilwU0VDQ29tcG9uZW50LT5oQ29tcG9uZW50SGFuZGxlOworICAgIHBIMjY0RW5jID0gKFNFQ19IMjY0RU5DX0hBTkRMRSAqKSgoU0VDX09NWF9WSURFT0VOQ19DT01QT05FTlQgKilwU0VDQ29tcG9uZW50LT5oQ29tcG9uZW50SGFuZGxlKS0+aENvZGVjSGFuZGxlOworICAgIHBTRUNJbnB1dFBvcnQgPSAmcFNFQ0NvbXBvbmVudC0+cFNFQ1BvcnRbSU5QVVRfUE9SVF9JTkRFWF07CisgICAgcFNFQ091dHB1dFBvcnQgPSAmcFNFQ0NvbXBvbmVudC0+cFNFQ1BvcnRbT1VUUFVUX1BPUlRfSU5ERVhdOworCisgICAgaWYgKHBWaWRlb0VuYy0+SW50cmFSZWZyZXNoVk9QID09IE9NWF9UUlVFKSB7CisgICAgICAgIGludCBzZXRfY29uZl9JbnRyYVJlZnJlc2hWT1AgPSAxOworICAgICAgICBTc2JTaXBNZmNFbmNTZXRDb25maWcocEgyNjRFbmMtPmhNRkNIMjY0SGFuZGxlLmhNRkNIYW5kbGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1GQ19FTkNfU0VUQ09ORl9GUkFNRV9UWVBFLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmc2V0X2NvbmZfSW50cmFSZWZyZXNoVk9QKTsKKyAgICAgICAgcFZpZGVvRW5jLT5JbnRyYVJlZnJlc2hWT1AgPSBPTVhfRkFMU0U7CisgICAgfQorICAgIGlmIChwSDI2NEFyZy0+SURSUGVyaW9kICE9IChpbnQpcEgyNjRFbmMtPkFWQ0NvbXBvbmVudFtPVVRQVVRfUE9SVF9JTkRFWF0ublBGcmFtZXMgKyAxKSB7CisgICAgICAgIGludCBzZXRfY29uZl9JRFJQZXJpb2QgPSBwSDI2NEVuYy0+QVZDQ29tcG9uZW50W09VVFBVVF9QT1JUX0lOREVYXS5uUEZyYW1lcyArIDE7CisgICAgICAgIFNzYlNpcE1mY0VuY1NldENvbmZpZyhwSDI2NEVuYy0+aE1GQ0gyNjRIYW5kbGUuaE1GQ0hhbmRsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTUZDX0VOQ19TRVRDT05GX0lfUEVSSU9ELAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmc2V0X2NvbmZfSURSUGVyaW9kKTsKKyAgICB9CisgICAgaWYgKHBIMjY0QXJnLT5CaXRyYXRlICE9IChpbnQpcFNFQ091dHB1dFBvcnQtPnBvcnREZWZpbml0aW9uLmZvcm1hdC52aWRlby5uQml0cmF0ZSkgeworICAgICAgICBpbnQgc2V0X2NvbmZfYml0cmF0ZSA9IHBTRUNPdXRwdXRQb3J0LT5wb3J0RGVmaW5pdGlvbi5mb3JtYXQudmlkZW8ubkJpdHJhdGU7CisgICAgICAgIFNzYlNpcE1mY0VuY1NldENvbmZpZyhwSDI2NEVuYy0+aE1GQ0gyNjRIYW5kbGUuaE1GQ0hhbmRsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTUZDX0VOQ19TRVRDT05GX0NIQU5HRV9CSVRfUkFURSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnNldF9jb25mX2JpdHJhdGUpOworICAgIH0KKyAgICBpZiAocEgyNjRBcmctPkZyYW1lUmF0ZSAhPSAoaW50KSgocFNFQ091dHB1dFBvcnQtPnBvcnREZWZpbml0aW9uLmZvcm1hdC52aWRlby54RnJhbWVyYXRlKSA+PiAxNikpIHsKKyAgICAgICAgaW50IHNldF9jb25mX2ZyYW1lcmF0ZSA9IChwU0VDSW5wdXRQb3J0LT5wb3J0RGVmaW5pdGlvbi5mb3JtYXQudmlkZW8ueEZyYW1lcmF0ZSkgPj4gMTY7CisgICAgICAgIFNzYlNpcE1mY0VuY1NldENvbmZpZyhwSDI2NEVuYy0+aE1GQ0gyNjRIYW5kbGUuaE1GQ0hhbmRsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTUZDX0VOQ19TRVRDT05GX0NIQU5HRV9GUkFNRV9SQVRFLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmc2V0X2NvbmZfZnJhbWVyYXRlKTsKKyAgICB9CisKKyAgICBTZXRfSDI2NEVuY19QYXJhbShwSDI2NEFyZywgcFNFQ0NvbXBvbmVudCk7CisgICAgSDI2NFByaW50UGFyYW1zKHBIMjY0QXJnKTsKK30KKworT01YX0VSUk9SVFlQRSBTRUNfTUZDX0gyNjRFbmNfR2V0UGFyYW1ldGVyKAorICAgIE9NWF9JTiBPTVhfSEFORExFVFlQRSBoQ29tcG9uZW50LAorICAgIE9NWF9JTiBPTVhfSU5ERVhUWVBFICBuUGFyYW1JbmRleCwKKyAgICBPTVhfSU5PVVQgT01YX1BUUiAgICAgcENvbXBvbmVudFBhcmFtZXRlclN0cnVjdHVyZSkKK3sKKyAgICBPTVhfRVJST1JUWVBFICAgICAgICAgIHJldCA9IE9NWF9FcnJvck5vbmU7CisgICAgT01YX0NPTVBPTkVOVFRZUEUgICAgICpwT01YQ29tcG9uZW50ID0gTlVMTDsKKyAgICBTRUNfT01YX0JBU0VDT01QT05FTlQgKnBTRUNDb21wb25lbnQgPSBOVUxMOworCisgICAgRnVuY3Rpb25JbigpOworCisgICAgaWYgKGhDb21wb25lbnQgPT0gTlVMTCB8fCBwQ29tcG9uZW50UGFyYW1ldGVyU3RydWN0dXJlID09IE5VTEwpIHsKKyAgICAgICAgcmV0ID0gT01YX0Vycm9yQmFkUGFyYW1ldGVyOworICAgICAgICBnb3RvIEVYSVQ7CisgICAgfQorICAgIHBPTVhDb21wb25lbnQgPSAoT01YX0NPTVBPTkVOVFRZUEUgKiloQ29tcG9uZW50OworICAgIHJldCA9IFNFQ19PTVhfQ2hlY2tfU2l6ZVZlcnNpb24ocE9NWENvbXBvbmVudCwgc2l6ZW9mKE9NWF9DT01QT05FTlRUWVBFKSk7CisgICAgaWYgKHJldCAhPSBPTVhfRXJyb3JOb25lKSB7CisgICAgICAgIGdvdG8gRVhJVDsKKyAgICB9CisgICAgaWYgKHBPTVhDb21wb25lbnQtPnBDb21wb25lbnRQcml2YXRlID09IE5VTEwpIHsKKyAgICAgICAgcmV0ID0gT01YX0Vycm9yQmFkUGFyYW1ldGVyOworICAgICAgICBnb3RvIEVYSVQ7CisgICAgfQorCisgICAgcFNFQ0NvbXBvbmVudCA9IChTRUNfT01YX0JBU0VDT01QT05FTlQgKilwT01YQ29tcG9uZW50LT5wQ29tcG9uZW50UHJpdmF0ZTsKKyAgICBpZiAocFNFQ0NvbXBvbmVudC0+Y3VycmVudFN0YXRlID09IE9NWF9TdGF0ZUludmFsaWQgKSB7CisgICAgICAgIHJldCA9IE9NWF9FcnJvckludmFsaWRTdGF0ZTsKKyAgICAgICAgZ290byBFWElUOworICAgIH0KKworICAgIHN3aXRjaCAoblBhcmFtSW5kZXgpIHsKKyAgICBjYXNlIE9NWF9JbmRleFBhcmFtVmlkZW9BdmM6CisgICAgeworICAgICAgICBPTVhfVklERU9fUEFSQU1fQVZDVFlQRSAqcERzdEFWQ0NvbXBvbmVudCA9IChPTVhfVklERU9fUEFSQU1fQVZDVFlQRSAqKXBDb21wb25lbnRQYXJhbWV0ZXJTdHJ1Y3R1cmU7CisgICAgICAgIE9NWF9WSURFT19QQVJBTV9BVkNUWVBFICpwU3JjQVZDQ29tcG9uZW50ID0gTlVMTDsKKyAgICAgICAgU0VDX0gyNjRFTkNfSEFORExFICAgICAgKnBIMjY0RW5jID0gTlVMTDsKKworICAgICAgICByZXQgPSBTRUNfT01YX0NoZWNrX1NpemVWZXJzaW9uKHBEc3RBVkNDb21wb25lbnQsIHNpemVvZihPTVhfVklERU9fUEFSQU1fQVZDVFlQRSkpOworICAgICAgICBpZiAocmV0ICE9IE9NWF9FcnJvck5vbmUpIHsKKyAgICAgICAgICAgIGdvdG8gRVhJVDsKKyAgICAgICAgfQorCisgICAgICAgIGlmIChwRHN0QVZDQ29tcG9uZW50LT5uUG9ydEluZGV4ID49IEFMTF9QT1JUX05VTSkgeworICAgICAgICAgICAgcmV0ID0gT01YX0Vycm9yQmFkUG9ydEluZGV4OworICAgICAgICAgICAgZ290byBFWElUOworICAgICAgICB9CisKKyAgICAgICAgcEgyNjRFbmMgPSAoU0VDX0gyNjRFTkNfSEFORExFICopKChTRUNfT01YX1ZJREVPRU5DX0NPTVBPTkVOVCAqKXBTRUNDb21wb25lbnQtPmhDb21wb25lbnRIYW5kbGUpLT5oQ29kZWNIYW5kbGU7CisgICAgICAgIHBTcmNBVkNDb21wb25lbnQgPSAmcEgyNjRFbmMtPkFWQ0NvbXBvbmVudFtwRHN0QVZDQ29tcG9uZW50LT5uUG9ydEluZGV4XTsKKworICAgICAgICBTRUNfT1NBTF9NZW1jcHkocERzdEFWQ0NvbXBvbmVudCwgcFNyY0FWQ0NvbXBvbmVudCwgc2l6ZW9mKE9NWF9WSURFT19QQVJBTV9BVkNUWVBFKSk7CisgICAgfQorICAgICAgICBicmVhazsKKyAgICBjYXNlIE9NWF9JbmRleFBhcmFtU3RhbmRhcmRDb21wb25lbnRSb2xlOgorICAgIHsKKyAgICAgICAgT01YX1BBUkFNX0NPTVBPTkVOVFJPTEVUWVBFICpwQ29tcG9uZW50Um9sZSA9IChPTVhfUEFSQU1fQ09NUE9ORU5UUk9MRVRZUEUgKilwQ29tcG9uZW50UGFyYW1ldGVyU3RydWN0dXJlOworICAgICAgICByZXQgPSBTRUNfT01YX0NoZWNrX1NpemVWZXJzaW9uKHBDb21wb25lbnRSb2xlLCBzaXplb2YoT01YX1BBUkFNX0NPTVBPTkVOVFJPTEVUWVBFKSk7CisgICAgICAgIGlmIChyZXQgIT0gT01YX0Vycm9yTm9uZSkgeworICAgICAgICAgICAgZ290byBFWElUOworICAgICAgICB9CisKKyAgICAgICAgU0VDX09TQUxfU3RyY3B5KChjaGFyICopcENvbXBvbmVudFJvbGUtPmNSb2xlLCBTRUNfT01YX0NPTVBPTkVOVF9IMjY0X0VOQ19ST0xFKTsKKyAgICB9CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgT01YX0luZGV4UGFyYW1WaWRlb1Byb2ZpbGVMZXZlbFF1ZXJ5U3VwcG9ydGVkOgorICAgIHsKKyAgICAgICAgT01YX1ZJREVPX1BBUkFNX1BST0ZJTEVMRVZFTFRZUEUgKnBEc3RQcm9maWxlTGV2ZWwgPSAoT01YX1ZJREVPX1BBUkFNX1BST0ZJTEVMRVZFTFRZUEUqKXBDb21wb25lbnRQYXJhbWV0ZXJTdHJ1Y3R1cmU7CisgICAgICAgIFNFQ19PTVhfVklERU9fUFJPRklMRUxFVkVMICpwUHJvZmlsZUxldmVsID0gTlVMTDsKKyAgICAgICAgT01YX1UzMiBtYXhQcm9maWxlTGV2ZWxOdW0gPSAwOworCisgICAgICAgIHJldCA9IFNFQ19PTVhfQ2hlY2tfU2l6ZVZlcnNpb24ocERzdFByb2ZpbGVMZXZlbCwgc2l6ZW9mKE9NWF9WSURFT19QQVJBTV9QUk9GSUxFTEVWRUxUWVBFKSk7CisgICAgICAgIGlmIChyZXQgIT0gT01YX0Vycm9yTm9uZSkgeworICAgICAgICAgICAgZ290byBFWElUOworICAgICAgICB9CisKKyAgICAgICAgaWYgKHBEc3RQcm9maWxlTGV2ZWwtPm5Qb3J0SW5kZXggPj0gQUxMX1BPUlRfTlVNKSB7CisgICAgICAgICAgICByZXQgPSBPTVhfRXJyb3JCYWRQb3J0SW5kZXg7CisgICAgICAgICAgICBnb3RvIEVYSVQ7CisgICAgICAgIH0KKworICAgICAgICBwUHJvZmlsZUxldmVsID0gc3VwcG9ydGVkQVZDUHJvZmlsZUxldmVsczsKKyAgICAgICAgbWF4UHJvZmlsZUxldmVsTnVtID0gc2l6ZW9mKHN1cHBvcnRlZEFWQ1Byb2ZpbGVMZXZlbHMpIC8gc2l6ZW9mKFNFQ19PTVhfVklERU9fUFJPRklMRUxFVkVMKTsKKworICAgICAgICBpZiAocERzdFByb2ZpbGVMZXZlbC0+blByb2ZpbGVJbmRleCA+PSBtYXhQcm9maWxlTGV2ZWxOdW0pIHsKKyAgICAgICAgICAgIHJldCA9IE9NWF9FcnJvck5vTW9yZTsKKyAgICAgICAgICAgIGdvdG8gRVhJVDsKKyAgICAgICAgfQorCisgICAgICAgIHBQcm9maWxlTGV2ZWwgKz0gcERzdFByb2ZpbGVMZXZlbC0+blByb2ZpbGVJbmRleDsKKyAgICAgICAgcERzdFByb2ZpbGVMZXZlbC0+ZVByb2ZpbGUgPSBwUHJvZmlsZUxldmVsLT5wcm9maWxlOworICAgICAgICBwRHN0UHJvZmlsZUxldmVsLT5lTGV2ZWwgPSBwUHJvZmlsZUxldmVsLT5sZXZlbDsKKyAgICB9CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgT01YX0luZGV4UGFyYW1WaWRlb1Byb2ZpbGVMZXZlbEN1cnJlbnQ6CisgICAgeworICAgICAgICBPTVhfVklERU9fUEFSQU1fUFJPRklMRUxFVkVMVFlQRSAqcERzdFByb2ZpbGVMZXZlbCA9IChPTVhfVklERU9fUEFSQU1fUFJPRklMRUxFVkVMVFlQRSopcENvbXBvbmVudFBhcmFtZXRlclN0cnVjdHVyZTsKKyAgICAgICAgT01YX1ZJREVPX1BBUkFNX0FWQ1RZUEUgKnBTcmNBVkNDb21wb25lbnQgPSBOVUxMOworICAgICAgICBTRUNfSDI2NEVOQ19IQU5ETEUgICAgICAgICpwSDI2NEVuYyA9IE5VTEw7CisKKyAgICAgICAgcmV0ID0gU0VDX09NWF9DaGVja19TaXplVmVyc2lvbihwRHN0UHJvZmlsZUxldmVsLCBzaXplb2YoT01YX1ZJREVPX1BBUkFNX1BST0ZJTEVMRVZFTFRZUEUpKTsKKyAgICAgICAgaWYgKHJldCAhPSBPTVhfRXJyb3JOb25lKSB7CisgICAgICAgICAgICBnb3RvIEVYSVQ7CisgICAgICAgIH0KKworICAgICAgICBpZiAocERzdFByb2ZpbGVMZXZlbC0+blBvcnRJbmRleCA+PSBBTExfUE9SVF9OVU0pIHsKKyAgICAgICAgICAgIHJldCA9IE9NWF9FcnJvckJhZFBvcnRJbmRleDsKKyAgICAgICAgICAgIGdvdG8gRVhJVDsKKyAgICAgICAgfQorCisgICAgICAgIHBIMjY0RW5jID0gKFNFQ19IMjY0RU5DX0hBTkRMRSAqKSgoU0VDX09NWF9WSURFT0VOQ19DT01QT05FTlQgKilwU0VDQ29tcG9uZW50LT5oQ29tcG9uZW50SGFuZGxlKS0+aENvZGVjSGFuZGxlOworICAgICAgICBwU3JjQVZDQ29tcG9uZW50ID0gJnBIMjY0RW5jLT5BVkNDb21wb25lbnRbcERzdFByb2ZpbGVMZXZlbC0+blBvcnRJbmRleF07CisKKyAgICAgICAgcERzdFByb2ZpbGVMZXZlbC0+ZVByb2ZpbGUgPSBwU3JjQVZDQ29tcG9uZW50LT5lUHJvZmlsZTsKKyAgICAgICAgcERzdFByb2ZpbGVMZXZlbC0+ZUxldmVsID0gcFNyY0FWQ0NvbXBvbmVudC0+ZUxldmVsOworICAgIH0KKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBPTVhfSW5kZXhQYXJhbVZpZGVvRXJyb3JDb3JyZWN0aW9uOgorICAgIHsKKyAgICAgICAgT01YX1ZJREVPX1BBUkFNX0VSUk9SQ09SUkVDVElPTlRZUEUgKnBEc3RFcnJvckNvcnJlY3Rpb25UeXBlID0gKE9NWF9WSURFT19QQVJBTV9FUlJPUkNPUlJFQ1RJT05UWVBFICopcENvbXBvbmVudFBhcmFtZXRlclN0cnVjdHVyZTsKKyAgICAgICAgT01YX1ZJREVPX1BBUkFNX0VSUk9SQ09SUkVDVElPTlRZUEUgKnBTcmNFcnJvckNvcnJlY3Rpb25UeXBlID0gTlVMTDsKKyAgICAgICAgU0VDX0gyNjRFTkNfSEFORExFICAgICAgICAqcEgyNjRFbmMgPSBOVUxMOworCisgICAgICAgIHJldCA9IFNFQ19PTVhfQ2hlY2tfU2l6ZVZlcnNpb24ocERzdEVycm9yQ29ycmVjdGlvblR5cGUsIHNpemVvZihPTVhfVklERU9fUEFSQU1fRVJST1JDT1JSRUNUSU9OVFlQRSkpOworICAgICAgICBpZiAocmV0ICE9IE9NWF9FcnJvck5vbmUpIHsKKyAgICAgICAgICAgIGdvdG8gRVhJVDsKKyAgICAgICAgfQorCisgICAgICAgIGlmIChwRHN0RXJyb3JDb3JyZWN0aW9uVHlwZS0+blBvcnRJbmRleCAhPSBPVVRQVVRfUE9SVF9JTkRFWCkgeworICAgICAgICAgICAgcmV0ID0gT01YX0Vycm9yQmFkUG9ydEluZGV4OworICAgICAgICAgICAgZ290byBFWElUOworICAgICAgICB9CisKKyAgICAgICAgcEgyNjRFbmMgPSAoU0VDX0gyNjRFTkNfSEFORExFICopKChTRUNfT01YX1ZJREVPRU5DX0NPTVBPTkVOVCAqKXBTRUNDb21wb25lbnQtPmhDb21wb25lbnRIYW5kbGUpLT5oQ29kZWNIYW5kbGU7CisgICAgICAgIHBTcmNFcnJvckNvcnJlY3Rpb25UeXBlID0gJnBIMjY0RW5jLT5lcnJvckNvcnJlY3Rpb25UeXBlW09VVFBVVF9QT1JUX0lOREVYXTsKKworICAgICAgICBwRHN0RXJyb3JDb3JyZWN0aW9uVHlwZS0+YkVuYWJsZUhFQyA9IHBTcmNFcnJvckNvcnJlY3Rpb25UeXBlLT5iRW5hYmxlSEVDOworICAgICAgICBwRHN0RXJyb3JDb3JyZWN0aW9uVHlwZS0+YkVuYWJsZVJlc3luYyA9IHBTcmNFcnJvckNvcnJlY3Rpb25UeXBlLT5iRW5hYmxlUmVzeW5jOworICAgICAgICBwRHN0RXJyb3JDb3JyZWN0aW9uVHlwZS0+blJlc3luY2hNYXJrZXJTcGFjaW5nID0gcFNyY0Vycm9yQ29ycmVjdGlvblR5cGUtPm5SZXN5bmNoTWFya2VyU3BhY2luZzsKKyAgICAgICAgcERzdEVycm9yQ29ycmVjdGlvblR5cGUtPmJFbmFibGVEYXRhUGFydGl0aW9uaW5nID0gcFNyY0Vycm9yQ29ycmVjdGlvblR5cGUtPmJFbmFibGVEYXRhUGFydGl0aW9uaW5nOworICAgICAgICBwRHN0RXJyb3JDb3JyZWN0aW9uVHlwZS0+YkVuYWJsZVJWTEMgPSBwU3JjRXJyb3JDb3JyZWN0aW9uVHlwZS0+YkVuYWJsZVJWTEM7CisgICAgfQorICAgICAgICBicmVhazsKKyAgICBkZWZhdWx0OgorICAgICAgICByZXQgPSBTRUNfT01YX1ZpZGVvRW5jb2RlR2V0UGFyYW1ldGVyKGhDb21wb25lbnQsIG5QYXJhbUluZGV4LCBwQ29tcG9uZW50UGFyYW1ldGVyU3RydWN0dXJlKTsKKyAgICAgICAgYnJlYWs7CisgICAgfQorRVhJVDoKKyAgICBGdW5jdGlvbk91dCgpOworCisgICAgcmV0dXJuIHJldDsKK30KKworT01YX0VSUk9SVFlQRSBTRUNfTUZDX0gyNjRFbmNfU2V0UGFyYW1ldGVyKAorICAgIE9NWF9JTiBPTVhfSEFORExFVFlQRSBoQ29tcG9uZW50LAorICAgIE9NWF9JTiBPTVhfSU5ERVhUWVBFICBuSW5kZXgsCisgICAgT01YX0lOIE9NWF9QVFIgICAgICAgIHBDb21wb25lbnRQYXJhbWV0ZXJTdHJ1Y3R1cmUpCit7CisgICAgT01YX0VSUk9SVFlQRSAgICAgICAgICAgcmV0ID0gT01YX0Vycm9yTm9uZTsKKyAgICBPTVhfQ09NUE9ORU5UVFlQRSAgICAgKnBPTVhDb21wb25lbnQgPSBOVUxMOworICAgIFNFQ19PTVhfQkFTRUNPTVBPTkVOVCAqcFNFQ0NvbXBvbmVudCA9IE5VTEw7CisKKyAgICBGdW5jdGlvbkluKCk7CisKKyAgICBpZiAoaENvbXBvbmVudCA9PSBOVUxMIHx8IHBDb21wb25lbnRQYXJhbWV0ZXJTdHJ1Y3R1cmUgPT0gTlVMTCkgeworICAgICAgICByZXQgPSBPTVhfRXJyb3JCYWRQYXJhbWV0ZXI7CisgICAgICAgIGdvdG8gRVhJVDsKKyAgICB9CisgICAgcE9NWENvbXBvbmVudCA9IChPTVhfQ09NUE9ORU5UVFlQRSAqKWhDb21wb25lbnQ7CisgICAgcmV0ID0gU0VDX09NWF9DaGVja19TaXplVmVyc2lvbihwT01YQ29tcG9uZW50LCBzaXplb2YoT01YX0NPTVBPTkVOVFRZUEUpKTsKKyAgICBpZiAocmV0ICE9IE9NWF9FcnJvck5vbmUpIHsKKyAgICAgICAgZ290byBFWElUOworICAgIH0KKyAgICBpZiAocE9NWENvbXBvbmVudC0+cENvbXBvbmVudFByaXZhdGUgPT0gTlVMTCkgeworICAgICAgICByZXQgPSBPTVhfRXJyb3JCYWRQYXJhbWV0ZXI7CisgICAgICAgIGdvdG8gRVhJVDsKKyAgICB9CisKKyAgICBwU0VDQ29tcG9uZW50ID0gKFNFQ19PTVhfQkFTRUNPTVBPTkVOVCAqKXBPTVhDb21wb25lbnQtPnBDb21wb25lbnRQcml2YXRlOworICAgIGlmIChwU0VDQ29tcG9uZW50LT5jdXJyZW50U3RhdGUgPT0gT01YX1N0YXRlSW52YWxpZCApIHsKKyAgICAgICAgcmV0ID0gT01YX0Vycm9ySW52YWxpZFN0YXRlOworICAgICAgICBnb3RvIEVYSVQ7CisgICAgfQorCisgICAgc3dpdGNoIChuSW5kZXgpIHsKKyAgICBjYXNlIE9NWF9JbmRleFBhcmFtVmlkZW9BdmM6CisgICAgeworICAgICAgICBPTVhfVklERU9fUEFSQU1fQVZDVFlQRSAqcERzdEFWQ0NvbXBvbmVudCA9IE5VTEw7CisgICAgICAgIE9NWF9WSURFT19QQVJBTV9BVkNUWVBFICpwU3JjQVZDQ29tcG9uZW50ID0gKE9NWF9WSURFT19QQVJBTV9BVkNUWVBFICopcENvbXBvbmVudFBhcmFtZXRlclN0cnVjdHVyZTsKKyAgICAgICAgU0VDX0gyNjRFTkNfSEFORExFICAgICAgKnBIMjY0RW5jID0gTlVMTDsKKworICAgICAgICByZXQgPSBTRUNfT01YX0NoZWNrX1NpemVWZXJzaW9uKHBTcmNBVkNDb21wb25lbnQsIHNpemVvZihPTVhfVklERU9fUEFSQU1fQVZDVFlQRSkpOworICAgICAgICBpZiAocmV0ICE9IE9NWF9FcnJvck5vbmUpIHsKKyAgICAgICAgICAgIGdvdG8gRVhJVDsKKyAgICAgICAgfQorCisgICAgICAgIGlmIChwU3JjQVZDQ29tcG9uZW50LT5uUG9ydEluZGV4ID49IEFMTF9QT1JUX05VTSkgeworICAgICAgICAgICAgcmV0ID0gT01YX0Vycm9yQmFkUG9ydEluZGV4OworICAgICAgICAgICAgZ290byBFWElUOworICAgICAgICB9CisKKyAgICAgICAgcEgyNjRFbmMgPSAoU0VDX0gyNjRFTkNfSEFORExFICopKChTRUNfT01YX1ZJREVPRU5DX0NPTVBPTkVOVCAqKXBTRUNDb21wb25lbnQtPmhDb21wb25lbnRIYW5kbGUpLT5oQ29kZWNIYW5kbGU7CisgICAgICAgIHBEc3RBVkNDb21wb25lbnQgPSAmcEgyNjRFbmMtPkFWQ0NvbXBvbmVudFtwU3JjQVZDQ29tcG9uZW50LT5uUG9ydEluZGV4XTsKKworICAgICAgICBTRUNfT1NBTF9NZW1jcHkocERzdEFWQ0NvbXBvbmVudCwgcFNyY0FWQ0NvbXBvbmVudCwgc2l6ZW9mKE9NWF9WSURFT19QQVJBTV9BVkNUWVBFKSk7CisgICAgfQorICAgICAgICBicmVhazsKKyAgICBjYXNlIE9NWF9JbmRleFBhcmFtU3RhbmRhcmRDb21wb25lbnRSb2xlOgorICAgIHsKKyAgICAgICAgT01YX1BBUkFNX0NPTVBPTkVOVFJPTEVUWVBFICpwQ29tcG9uZW50Um9sZSA9IChPTVhfUEFSQU1fQ09NUE9ORU5UUk9MRVRZUEUqKXBDb21wb25lbnRQYXJhbWV0ZXJTdHJ1Y3R1cmU7CisKKyAgICAgICAgcmV0ID0gU0VDX09NWF9DaGVja19TaXplVmVyc2lvbihwQ29tcG9uZW50Um9sZSwgc2l6ZW9mKE9NWF9QQVJBTV9DT01QT05FTlRST0xFVFlQRSkpOworICAgICAgICBpZiAocmV0ICE9IE9NWF9FcnJvck5vbmUpIHsKKyAgICAgICAgICAgIGdvdG8gRVhJVDsKKyAgICAgICAgfQorCisgICAgICAgIGlmICgocFNFQ0NvbXBvbmVudC0+Y3VycmVudFN0YXRlICE9IE9NWF9TdGF0ZUxvYWRlZCkgJiYgKHBTRUNDb21wb25lbnQtPmN1cnJlbnRTdGF0ZSAhPSBPTVhfU3RhdGVXYWl0Rm9yUmVzb3VyY2VzKSkgeworICAgICAgICAgICAgcmV0ID0gT01YX0Vycm9ySW5jb3JyZWN0U3RhdGVPcGVyYXRpb247CisgICAgICAgICAgICBnb3RvIEVYSVQ7CisgICAgICAgIH0KKworICAgICAgICBpZiAoIVNFQ19PU0FMX1N0cmNtcCgoY2hhciopcENvbXBvbmVudFJvbGUtPmNSb2xlLCBTRUNfT01YX0NPTVBPTkVOVF9IMjY0X0VOQ19ST0xFKSkgeworICAgICAgICAgICAgcFNFQ0NvbXBvbmVudC0+cFNFQ1BvcnRbT1VUUFVUX1BPUlRfSU5ERVhdLnBvcnREZWZpbml0aW9uLmZvcm1hdC52aWRlby5lQ29tcHJlc3Npb25Gb3JtYXQgPSBPTVhfVklERU9fQ29kaW5nQVZDOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgcmV0ID0gT01YX0Vycm9yQmFkUGFyYW1ldGVyOworICAgICAgICAgICAgZ290byBFWElUOworICAgICAgICB9CisgICAgfQorICAgICAgICBicmVhazsKKyAgICBjYXNlIE9NWF9JbmRleFBhcmFtVmlkZW9Qcm9maWxlTGV2ZWxDdXJyZW50OgorICAgIHsKKyAgICAgICAgT01YX1ZJREVPX1BBUkFNX1BST0ZJTEVMRVZFTFRZUEUgKnBTcmNQcm9maWxlTGV2ZWwgPSAoT01YX1ZJREVPX1BBUkFNX1BST0ZJTEVMRVZFTFRZUEUgKilwQ29tcG9uZW50UGFyYW1ldGVyU3RydWN0dXJlOworICAgICAgICBPTVhfVklERU9fUEFSQU1fQVZDVFlQRSAqcERzdEFWQ0NvbXBvbmVudCA9IE5VTEw7CisgICAgICAgIFNFQ19IMjY0RU5DX0hBTkRMRSAgICAgICAgKnBIMjY0RW5jID0gTlVMTDsKKworICAgICAgICByZXQgPSBTRUNfT01YX0NoZWNrX1NpemVWZXJzaW9uKHBTcmNQcm9maWxlTGV2ZWwsIHNpemVvZihPTVhfVklERU9fUEFSQU1fUFJPRklMRUxFVkVMVFlQRSkpOworICAgICAgICBpZiAocmV0ICE9IE9NWF9FcnJvck5vbmUpIHsKKyAgICAgICAgICAgIGdvdG8gRVhJVDsKKyAgICAgICAgfQorCisgICAgICAgIGlmIChwU3JjUHJvZmlsZUxldmVsLT5uUG9ydEluZGV4ID49IEFMTF9QT1JUX05VTSkgeworICAgICAgICAgICAgcmV0ID0gT01YX0Vycm9yQmFkUG9ydEluZGV4OworICAgICAgICAgICAgZ290byBFWElUOworICAgICAgICB9CisKKyAgICAgICAgcEgyNjRFbmMgPSAoU0VDX0gyNjRFTkNfSEFORExFICopKChTRUNfT01YX1ZJREVPRU5DX0NPTVBPTkVOVCAqKXBTRUNDb21wb25lbnQtPmhDb21wb25lbnRIYW5kbGUpLT5oQ29kZWNIYW5kbGU7CisKKyAgICAgICAgcERzdEFWQ0NvbXBvbmVudCA9ICZwSDI2NEVuYy0+QVZDQ29tcG9uZW50W3BTcmNQcm9maWxlTGV2ZWwtPm5Qb3J0SW5kZXhdOworICAgICAgICBwRHN0QVZDQ29tcG9uZW50LT5lUHJvZmlsZSA9IHBTcmNQcm9maWxlTGV2ZWwtPmVQcm9maWxlOworICAgICAgICBwRHN0QVZDQ29tcG9uZW50LT5lTGV2ZWwgPSBwU3JjUHJvZmlsZUxldmVsLT5lTGV2ZWw7CisgICAgfQorICAgICAgICBicmVhazsKKyAgICBjYXNlIE9NWF9JbmRleFBhcmFtVmlkZW9FcnJvckNvcnJlY3Rpb246CisgICAgeworICAgICAgICBPTVhfVklERU9fUEFSQU1fRVJST1JDT1JSRUNUSU9OVFlQRSAqcFNyY0Vycm9yQ29ycmVjdGlvblR5cGUgPSAoT01YX1ZJREVPX1BBUkFNX0VSUk9SQ09SUkVDVElPTlRZUEUgKilwQ29tcG9uZW50UGFyYW1ldGVyU3RydWN0dXJlOworICAgICAgICBPTVhfVklERU9fUEFSQU1fRVJST1JDT1JSRUNUSU9OVFlQRSAqcERzdEVycm9yQ29ycmVjdGlvblR5cGUgPSBOVUxMOworICAgICAgICBTRUNfSDI2NEVOQ19IQU5ETEUgICAgICAgICpwSDI2NEVuYyA9IE5VTEw7CisKKyAgICAgICAgcmV0ID0gU0VDX09NWF9DaGVja19TaXplVmVyc2lvbihwU3JjRXJyb3JDb3JyZWN0aW9uVHlwZSwgc2l6ZW9mKE9NWF9WSURFT19QQVJBTV9FUlJPUkNPUlJFQ1RJT05UWVBFKSk7CisgICAgICAgIGlmIChyZXQgIT0gT01YX0Vycm9yTm9uZSkgeworICAgICAgICAgICAgZ290byBFWElUOworICAgICAgICB9CisKKyAgICAgICAgaWYgKHBTcmNFcnJvckNvcnJlY3Rpb25UeXBlLT5uUG9ydEluZGV4ICE9IE9VVFBVVF9QT1JUX0lOREVYKSB7CisgICAgICAgICAgICByZXQgPSBPTVhfRXJyb3JCYWRQb3J0SW5kZXg7CisgICAgICAgICAgICBnb3RvIEVYSVQ7CisgICAgICAgIH0KKworICAgICAgICBwSDI2NEVuYyA9IChTRUNfSDI2NEVOQ19IQU5ETEUgKikoKFNFQ19PTVhfVklERU9FTkNfQ09NUE9ORU5UICopcFNFQ0NvbXBvbmVudC0+aENvbXBvbmVudEhhbmRsZSktPmhDb2RlY0hhbmRsZTsKKyAgICAgICAgcERzdEVycm9yQ29ycmVjdGlvblR5cGUgPSAmcEgyNjRFbmMtPmVycm9yQ29ycmVjdGlvblR5cGVbT1VUUFVUX1BPUlRfSU5ERVhdOworCisgICAgICAgIHBEc3RFcnJvckNvcnJlY3Rpb25UeXBlLT5iRW5hYmxlSEVDID0gcFNyY0Vycm9yQ29ycmVjdGlvblR5cGUtPmJFbmFibGVIRUM7CisgICAgICAgIHBEc3RFcnJvckNvcnJlY3Rpb25UeXBlLT5iRW5hYmxlUmVzeW5jID0gcFNyY0Vycm9yQ29ycmVjdGlvblR5cGUtPmJFbmFibGVSZXN5bmM7CisgICAgICAgIHBEc3RFcnJvckNvcnJlY3Rpb25UeXBlLT5uUmVzeW5jaE1hcmtlclNwYWNpbmcgPSBwU3JjRXJyb3JDb3JyZWN0aW9uVHlwZS0+blJlc3luY2hNYXJrZXJTcGFjaW5nOworICAgICAgICBwRHN0RXJyb3JDb3JyZWN0aW9uVHlwZS0+YkVuYWJsZURhdGFQYXJ0aXRpb25pbmcgPSBwU3JjRXJyb3JDb3JyZWN0aW9uVHlwZS0+YkVuYWJsZURhdGFQYXJ0aXRpb25pbmc7CisgICAgICAgIHBEc3RFcnJvckNvcnJlY3Rpb25UeXBlLT5iRW5hYmxlUlZMQyA9IHBTcmNFcnJvckNvcnJlY3Rpb25UeXBlLT5iRW5hYmxlUlZMQzsKKyAgICB9CisgICAgICAgIGJyZWFrOworICAgIGRlZmF1bHQ6CisgICAgICAgIHJldCA9IFNFQ19PTVhfVmlkZW9FbmNvZGVTZXRQYXJhbWV0ZXIoaENvbXBvbmVudCwgbkluZGV4LCBwQ29tcG9uZW50UGFyYW1ldGVyU3RydWN0dXJlKTsKKyAgICAgICAgYnJlYWs7CisgICAgfQorRVhJVDoKKyAgICBGdW5jdGlvbk91dCgpOworCisgICAgcmV0dXJuIHJldDsKK30KKworT01YX0VSUk9SVFlQRSBTRUNfTUZDX0gyNjRFbmNfR2V0Q29uZmlnKAorICAgIE9NWF9IQU5ETEVUWVBFIGhDb21wb25lbnQsCisgICAgT01YX0lOREVYVFlQRSBuSW5kZXgsCisgICAgT01YX1BUUiBwQ29tcG9uZW50Q29uZmlnU3RydWN0dXJlKQoreworICAgIE9NWF9FUlJPUlRZUEUgICAgICAgICAgcmV0ID0gT01YX0Vycm9yTm9uZTsKKyAgICBPTVhfQ09NUE9ORU5UVFlQRSAgICAgKnBPTVhDb21wb25lbnQgPSBOVUxMOworICAgIFNFQ19PTVhfQkFTRUNPTVBPTkVOVCAqcFNFQ0NvbXBvbmVudCA9IE5VTEw7CisgICAgU0VDX0gyNjRFTkNfSEFORExFICAgICpwSDI2NEVuYyA9IE5VTEw7CisKKyAgICBGdW5jdGlvbkluKCk7CisKKyAgICBpZiAoaENvbXBvbmVudCA9PSBOVUxMIHx8IHBDb21wb25lbnRDb25maWdTdHJ1Y3R1cmUgPT0gTlVMTCkgeworICAgICAgICByZXQgPSBPTVhfRXJyb3JCYWRQYXJhbWV0ZXI7CisgICAgICAgIGdvdG8gRVhJVDsKKyAgICB9CisgICAgcE9NWENvbXBvbmVudCA9IChPTVhfQ09NUE9ORU5UVFlQRSAqKWhDb21wb25lbnQ7CisgICAgcmV0ID0gU0VDX09NWF9DaGVja19TaXplVmVyc2lvbihwT01YQ29tcG9uZW50LCBzaXplb2YoT01YX0NPTVBPTkVOVFRZUEUpKTsKKyAgICBpZiAocmV0ICE9IE9NWF9FcnJvck5vbmUpIHsKKyAgICAgICAgZ290byBFWElUOworICAgIH0KKyAgICBpZiAocE9NWENvbXBvbmVudC0+cENvbXBvbmVudFByaXZhdGUgPT0gTlVMTCkgeworICAgICAgICByZXQgPSBPTVhfRXJyb3JCYWRQYXJhbWV0ZXI7CisgICAgICAgIGdvdG8gRVhJVDsKKyAgICB9CisKKyAgICBwU0VDQ29tcG9uZW50ID0gKFNFQ19PTVhfQkFTRUNPTVBPTkVOVCAqKXBPTVhDb21wb25lbnQtPnBDb21wb25lbnRQcml2YXRlOworICAgIGlmIChwU0VDQ29tcG9uZW50LT5jdXJyZW50U3RhdGUgPT0gT01YX1N0YXRlSW52YWxpZCkgeworICAgICAgICByZXQgPSBPTVhfRXJyb3JJbnZhbGlkU3RhdGU7CisgICAgICAgIGdvdG8gRVhJVDsKKyAgICB9CisgICAgcEgyNjRFbmMgPSAoU0VDX0gyNjRFTkNfSEFORExFICopKChTRUNfT01YX1ZJREVPRU5DX0NPTVBPTkVOVCAqKXBTRUNDb21wb25lbnQtPmhDb21wb25lbnRIYW5kbGUpLT5oQ29kZWNIYW5kbGU7CisKKyAgICBzd2l0Y2ggKG5JbmRleCkgeworICAgIGNhc2UgT01YX0luZGV4Q29uZmlnVmlkZW9BVkNJbnRyYVBlcmlvZDoKKyAgICB7CisgICAgICAgIE9NWF9WSURFT19DT05GSUdfQVZDSU5UUkFQRVJJT0QgKnBBVkNJbnRyYVBlcmlvZCA9IChPTVhfVklERU9fQ09ORklHX0FWQ0lOVFJBUEVSSU9EICopcENvbXBvbmVudENvbmZpZ1N0cnVjdHVyZTsKKyAgICAgICAgT01YX1UzMiAgICAgICAgICAgcG9ydEluZGV4ID0gcEFWQ0ludHJhUGVyaW9kLT5uUG9ydEluZGV4OworCisgICAgICAgIGlmICgocG9ydEluZGV4ICE9IE9VVFBVVF9QT1JUX0lOREVYKSkgeworICAgICAgICAgICAgcmV0ID0gT01YX0Vycm9yQmFkUG9ydEluZGV4OworICAgICAgICAgICAgZ290byBFWElUOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgcEFWQ0ludHJhUGVyaW9kLT5uSURSUGVyaW9kID0gcEgyNjRFbmMtPkFWQ0NvbXBvbmVudFtPVVRQVVRfUE9SVF9JTkRFWF0ublBGcmFtZXMgKyAxOworICAgICAgICAgICAgcEFWQ0ludHJhUGVyaW9kLT5uUEZyYW1lcyA9IHBIMjY0RW5jLT5BVkNDb21wb25lbnRbT1VUUFVUX1BPUlRfSU5ERVhdLm5QRnJhbWVzOworICAgICAgICB9CisgICAgfQorICAgICAgICBicmVhazsKKyAgICBkZWZhdWx0OgorICAgICAgICByZXQgPSBTRUNfT01YX1ZpZGVvRW5jb2RlR2V0Q29uZmlnKGhDb21wb25lbnQsIG5JbmRleCwgcENvbXBvbmVudENvbmZpZ1N0cnVjdHVyZSk7CisgICAgICAgIGJyZWFrOworICAgIH0KKworRVhJVDoKKyAgICBGdW5jdGlvbk91dCgpOworCisgICAgcmV0dXJuIHJldDsKK30KKworT01YX0VSUk9SVFlQRSBTRUNfTUZDX0gyNjRFbmNfU2V0Q29uZmlnKAorICAgIE9NWF9IQU5ETEVUWVBFIGhDb21wb25lbnQsCisgICAgT01YX0lOREVYVFlQRSBuSW5kZXgsCisgICAgT01YX1BUUiBwQ29tcG9uZW50Q29uZmlnU3RydWN0dXJlKQoreworICAgIE9NWF9FUlJPUlRZUEUgICAgICAgICAgcmV0ID0gT01YX0Vycm9yTm9uZTsKKyAgICBPTVhfQ09NUE9ORU5UVFlQRSAgICAgKnBPTVhDb21wb25lbnQgPSBOVUxMOworICAgIFNFQ19PTVhfQkFTRUNPTVBPTkVOVCAqcFNFQ0NvbXBvbmVudCA9IE5VTEw7CisgICAgU0VDX09NWF9WSURFT0VOQ19DT01QT05FTlQgKnBWaWRlb0VuYyA9IE5VTEw7CisgICAgU0VDX0gyNjRFTkNfSEFORExFICAgICAgICAgKnBIMjY0RW5jID0gTlVMTDsKKworICAgIEZ1bmN0aW9uSW4oKTsKKworICAgIGlmIChoQ29tcG9uZW50ID09IE5VTEwgfHwgcENvbXBvbmVudENvbmZpZ1N0cnVjdHVyZSA9PSBOVUxMKSB7CisgICAgICAgIHJldCA9IE9NWF9FcnJvckJhZFBhcmFtZXRlcjsKKyAgICAgICAgZ290byBFWElUOworICAgIH0KKyAgICBwT01YQ29tcG9uZW50ID0gKE9NWF9DT01QT05FTlRUWVBFICopaENvbXBvbmVudDsKKyAgICByZXQgPSBTRUNfT01YX0NoZWNrX1NpemVWZXJzaW9uKHBPTVhDb21wb25lbnQsIHNpemVvZihPTVhfQ09NUE9ORU5UVFlQRSkpOworICAgIGlmIChyZXQgIT0gT01YX0Vycm9yTm9uZSkgeworICAgICAgICBnb3RvIEVYSVQ7CisgICAgfQorICAgIGlmIChwT01YQ29tcG9uZW50LT5wQ29tcG9uZW50UHJpdmF0ZSA9PSBOVUxMKSB7CisgICAgICAgIHJldCA9IE9NWF9FcnJvckJhZFBhcmFtZXRlcjsKKyAgICAgICAgZ290byBFWElUOworICAgIH0KKworICAgIHBTRUNDb21wb25lbnQgPSAoU0VDX09NWF9CQVNFQ09NUE9ORU5UICopcE9NWENvbXBvbmVudC0+cENvbXBvbmVudFByaXZhdGU7CisgICAgaWYgKHBTRUNDb21wb25lbnQtPmN1cnJlbnRTdGF0ZSA9PSBPTVhfU3RhdGVJbnZhbGlkKSB7CisgICAgICAgIHJldCA9IE9NWF9FcnJvckludmFsaWRTdGF0ZTsKKyAgICAgICAgZ290byBFWElUOworICAgIH0KKworICAgIHBWaWRlb0VuYyA9ICgoU0VDX09NWF9WSURFT0VOQ19DT01QT05FTlQgKilwU0VDQ29tcG9uZW50LT5oQ29tcG9uZW50SGFuZGxlKTsKKyAgICBwSDI2NEVuYyA9IChTRUNfSDI2NEVOQ19IQU5ETEUgKikoKFNFQ19PTVhfVklERU9FTkNfQ09NUE9ORU5UICopcFNFQ0NvbXBvbmVudC0+aENvbXBvbmVudEhhbmRsZSktPmhDb2RlY0hhbmRsZTsKKworICAgIHN3aXRjaCAobkluZGV4KSB7CisgICAgY2FzZSBPTVhfSW5kZXhDb25maWdWaWRlb0ludHJhUGVyaW9kOgorICAgIHsKKyAgICAgICAgU0VDX09NWF9WSURFT0VOQ19DT01QT05FTlQgKnBWRW5jQmFzZSA9ICgoU0VDX09NWF9WSURFT0VOQ19DT01QT05FTlQgKilwU0VDQ29tcG9uZW50LT5oQ29tcG9uZW50SGFuZGxlKTsKKyAgICAgICAgT01YX1UzMiBuUEZyYW1lcyA9ICgqKChPTVhfVTMyICopcENvbXBvbmVudENvbmZpZ1N0cnVjdHVyZSkpIC0gMTsKKworICAgICAgICBwSDI2NEVuYy0+QVZDQ29tcG9uZW50W09VVFBVVF9QT1JUX0lOREVYXS5uUEZyYW1lcyA9IG5QRnJhbWVzOworCisgICAgICAgIHJldCA9IE9NWF9FcnJvck5vbmU7CisgICAgfQorICAgICAgICBicmVhazsKKyAgICBjYXNlIE9NWF9JbmRleENvbmZpZ1ZpZGVvQVZDSW50cmFQZXJpb2Q6CisgICAgeworICAgICAgICBPTVhfVklERU9fQ09ORklHX0FWQ0lOVFJBUEVSSU9EICpwQVZDSW50cmFQZXJpb2QgPSAoT01YX1ZJREVPX0NPTkZJR19BVkNJTlRSQVBFUklPRCAqKXBDb21wb25lbnRDb25maWdTdHJ1Y3R1cmU7CisgICAgICAgIE9NWF9VMzIgICAgICAgICAgIHBvcnRJbmRleCA9IHBBVkNJbnRyYVBlcmlvZC0+blBvcnRJbmRleDsKKworICAgICAgICBpZiAoKHBvcnRJbmRleCAhPSBPVVRQVVRfUE9SVF9JTkRFWCkpIHsKKyAgICAgICAgICAgIHJldCA9IE9NWF9FcnJvckJhZFBvcnRJbmRleDsKKyAgICAgICAgICAgIGdvdG8gRVhJVDsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIGlmIChwQVZDSW50cmFQZXJpb2QtPm5JRFJQZXJpb2QgPT0gKHBBVkNJbnRyYVBlcmlvZC0+blBGcmFtZXMgKyAxKSkKKyAgICAgICAgICAgICAgICBwSDI2NEVuYy0+QVZDQ29tcG9uZW50W09VVFBVVF9QT1JUX0lOREVYXS5uUEZyYW1lcyA9IHBBVkNJbnRyYVBlcmlvZC0+blBGcmFtZXM7CisgICAgICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgICAgICByZXQgPSBPTVhfRXJyb3JCYWRQYXJhbWV0ZXI7CisgICAgICAgICAgICAgICAgZ290byBFWElUOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorICAgICAgICBicmVhazsKKyAgICBkZWZhdWx0OgorICAgICAgICByZXQgPSBTRUNfT01YX1ZpZGVvRW5jb2RlU2V0Q29uZmlnKGhDb21wb25lbnQsIG5JbmRleCwgcENvbXBvbmVudENvbmZpZ1N0cnVjdHVyZSk7CisgICAgICAgIGJyZWFrOworICAgIH0KKworRVhJVDoKKyAgICBpZiAocmV0ID09IE9NWF9FcnJvck5vbmUpCisgICAgICAgIHBWaWRlb0VuYy0+Y29uZmlnQ2hhbmdlID0gT01YX1RSVUU7CisKKyAgICBGdW5jdGlvbk91dCgpOworCisgICAgcmV0dXJuIHJldDsKK30KKworT01YX0VSUk9SVFlQRSBTRUNfTUZDX0gyNjRFbmNfR2V0RXh0ZW5zaW9uSW5kZXgoCisgICAgT01YX0lOIE9NWF9IQU5ETEVUWVBFICBoQ29tcG9uZW50LAorICAgIE9NWF9JTiBPTVhfU1RSSU5HICAgICAgY1BhcmFtZXRlck5hbWUsCisgICAgT01YX09VVCBPTVhfSU5ERVhUWVBFICpwSW5kZXhUeXBlKQoreworICAgIE9NWF9FUlJPUlRZUEUgICAgICAgICAgIHJldCA9IE9NWF9FcnJvck5vbmU7CisgICAgT01YX0NPTVBPTkVOVFRZUEUgICAgICpwT01YQ29tcG9uZW50ID0gTlVMTDsKKyAgICBTRUNfT01YX0JBU0VDT01QT05FTlQgKnBTRUNDb21wb25lbnQgPSBOVUxMOworCisgICAgRnVuY3Rpb25JbigpOworCisgICAgaWYgKGhDb21wb25lbnQgPT0gTlVMTCkgeworICAgICAgICByZXQgPSBPTVhfRXJyb3JCYWRQYXJhbWV0ZXI7CisgICAgICAgIGdvdG8gRVhJVDsKKyAgICB9CisgICAgcE9NWENvbXBvbmVudCA9IChPTVhfQ09NUE9ORU5UVFlQRSAqKWhDb21wb25lbnQ7CisgICAgcmV0ID0gU0VDX09NWF9DaGVja19TaXplVmVyc2lvbihwT01YQ29tcG9uZW50LCBzaXplb2YoT01YX0NPTVBPTkVOVFRZUEUpKTsKKyAgICBpZiAocmV0ICE9IE9NWF9FcnJvck5vbmUpIHsKKyAgICAgICAgZ290byBFWElUOworICAgIH0KKworICAgIGlmIChwT01YQ29tcG9uZW50LT5wQ29tcG9uZW50UHJpdmF0ZSA9PSBOVUxMKSB7CisgICAgICAgIHJldCA9IE9NWF9FcnJvckJhZFBhcmFtZXRlcjsKKyAgICAgICAgZ290byBFWElUOworICAgIH0KKyAgICBwU0VDQ29tcG9uZW50ID0gKFNFQ19PTVhfQkFTRUNPTVBPTkVOVCAqKXBPTVhDb21wb25lbnQtPnBDb21wb25lbnRQcml2YXRlOworCisgICAgaWYgKChjUGFyYW1ldGVyTmFtZSA9PSBOVUxMKSB8fCAocEluZGV4VHlwZSA9PSBOVUxMKSkgeworICAgICAgICByZXQgPSBPTVhfRXJyb3JCYWRQYXJhbWV0ZXI7CisgICAgICAgIGdvdG8gRVhJVDsKKyAgICB9CisgICAgaWYgKHBTRUNDb21wb25lbnQtPmN1cnJlbnRTdGF0ZSA9PSBPTVhfU3RhdGVJbnZhbGlkKSB7CisgICAgICAgIHJldCA9IE9NWF9FcnJvckludmFsaWRTdGF0ZTsKKyAgICAgICAgZ290byBFWElUOworICAgIH0KKyAgICBpZiAoU0VDX09TQUxfU3RyY21wKGNQYXJhbWV0ZXJOYW1lLCBTRUNfSU5ERVhfQ09ORklHX1ZJREVPX0lOVFJBUEVSSU9EKSA9PSAwKSB7CisgICAgICAgICpwSW5kZXhUeXBlID0gT01YX0luZGV4Q29uZmlnVmlkZW9JbnRyYVBlcmlvZDsKKyAgICAgICAgcmV0ID0gT01YX0Vycm9yTm9uZTsKKyAgICB9IGVsc2UgeworICAgICAgICByZXQgPSBTRUNfT01YX1ZpZGVvRW5jb2RlR2V0RXh0ZW5zaW9uSW5kZXgoaENvbXBvbmVudCwgY1BhcmFtZXRlck5hbWUsIHBJbmRleFR5cGUpOworICAgIH0KKworRVhJVDoKKyAgICBGdW5jdGlvbk91dCgpOworCisgICAgcmV0dXJuIHJldDsKK30KKworT01YX0VSUk9SVFlQRSBTRUNfTUZDX0gyNjRFbmNfQ29tcG9uZW50Um9sZUVudW0oT01YX0hBTkRMRVRZUEUgaENvbXBvbmVudCwgT01YX1U4ICpjUm9sZSwgT01YX1UzMiBuSW5kZXgpCit7CisgICAgT01YX0VSUk9SVFlQRSAgICAgICAgICAgIHJldCA9IE9NWF9FcnJvck5vbmU7CisgICAgT01YX0NPTVBPTkVOVFRZUEUgICAgICAgKnBPTVhDb21wb25lbnQgPSBOVUxMOworICAgIFNFQ19PTVhfQkFTRUNPTVBPTkVOVCAgICpwU0VDQ29tcG9uZW50ID0gTlVMTDsKKworICAgIEZ1bmN0aW9uSW4oKTsKKworICAgIGlmICgoaENvbXBvbmVudCA9PSBOVUxMKSB8fCAoY1JvbGUgPT0gTlVMTCkpIHsKKyAgICAgICAgcmV0ID0gT01YX0Vycm9yQmFkUGFyYW1ldGVyOworICAgICAgICBnb3RvIEVYSVQ7CisgICAgfQorICAgIGlmIChuSW5kZXggPT0gKE1BWF9DT01QT05FTlRfUk9MRV9OVU0tMSkpIHsKKyAgICAgICAgU0VDX09TQUxfU3RyY3B5KChjaGFyICopY1JvbGUsIFNFQ19PTVhfQ09NUE9ORU5UX0gyNjRfRU5DX1JPTEUpOworICAgICAgICByZXQgPSBPTVhfRXJyb3JOb25lOworICAgIH0gZWxzZSB7CisgICAgICAgIHJldCA9IE9NWF9FcnJvck5vTW9yZTsKKyAgICB9CisKK0VYSVQ6CisgICAgRnVuY3Rpb25PdXQoKTsKKworICAgIHJldHVybiByZXQ7Cit9CisKK09NWF9FUlJPUlRZUEUgU0VDX01GQ19FbmNvZGVUaHJlYWQoT01YX0hBTkRMRVRZUEUgaENvbXBvbmVudCkKK3sKKyAgICBPTVhfRVJST1JUWVBFICAgICAgICAgIHJldCA9IE9NWF9FcnJvck5vbmU7CisgICAgT01YX0NPTVBPTkVOVFRZUEUgICAgICpwT01YQ29tcG9uZW50ID0gKE9NWF9DT01QT05FTlRUWVBFICopaENvbXBvbmVudDsKKyAgICBTRUNfT01YX0JBU0VDT01QT05FTlQgKnBTRUNDb21wb25lbnQgPSAoU0VDX09NWF9CQVNFQ09NUE9ORU5UICopcE9NWENvbXBvbmVudC0+cENvbXBvbmVudFByaXZhdGU7CisgICAgU0VDX09NWF9WSURFT0VOQ19DT01QT05FTlQgKnBWaWRlb0VuYyA9IChTRUNfT01YX1ZJREVPRU5DX0NPTVBPTkVOVCAqKXBTRUNDb21wb25lbnQtPmhDb21wb25lbnRIYW5kbGU7CisgICAgU0VDX0gyNjRFTkNfSEFORExFICAgICpwSDI2NEVuYyA9IChTRUNfSDI2NEVOQ19IQU5ETEUgKilwVmlkZW9FbmMtPmhDb2RlY0hhbmRsZTsKKworICAgIEZ1bmN0aW9uSW4oKTsKKworICAgIGlmIChoQ29tcG9uZW50ID09IE5VTEwpIHsKKyAgICAgICAgcmV0ID0gT01YX0Vycm9yQmFkUGFyYW1ldGVyOworICAgICAgICBnb3RvIEVYSVQ7CisgICAgfQorCisgICAgd2hpbGUgKHBWaWRlb0VuYy0+TkJFbmNUaHJlYWQuYkV4aXRFbmNvZGVUaHJlYWQgPT0gT01YX0ZBTFNFKSB7CisgICAgICAgIFNFQ19PU0FMX1NlbWFwaG9yZVdhaXQocFZpZGVvRW5jLT5OQkVuY1RocmVhZC5oRW5jRnJhbWVTdGFydCk7CisKKyAgICAgICAgaWYgKHBWaWRlb0VuYy0+TkJFbmNUaHJlYWQuYkV4aXRFbmNvZGVUaHJlYWQgPT0gT01YX0ZBTFNFKSB7CisgICAgICAgICAgICBwSDI2NEVuYy0+aE1GQ0gyNjRIYW5kbGUucmV0dXJuQ29kZWMgPSBTc2JTaXBNZmNFbmNFeGUocEgyNjRFbmMtPmhNRkNIMjY0SGFuZGxlLmhNRkNIYW5kbGUpOworICAgICAgICAgICAgU0VDX09TQUxfU2VtYXBob3JlUG9zdChwVmlkZW9FbmMtPk5CRW5jVGhyZWFkLmhFbmNGcmFtZUVuZCk7CisgICAgICAgIH0KKyAgICB9CisKK0VYSVQ6CisgICAgRnVuY3Rpb25PdXQoKTsKKyAgICBTRUNfT1NBTF9UaHJlYWRFeGl0KE5VTEwpOworCisgICAgcmV0dXJuIHJldDsKK30KKworLyogTUZDIEluaXQgKi8KK09NWF9FUlJPUlRZUEUgU0VDX01GQ19IMjY0RW5jX0luaXQoT01YX0NPTVBPTkVOVFRZUEUgKnBPTVhDb21wb25lbnQpCit7CisgICAgT01YX0VSUk9SVFlQRSAgICAgICAgICAgICAgcmV0ID0gT01YX0Vycm9yTm9uZTsKKyAgICBTRUNfT01YX0JBU0VDT01QT05FTlQgICAgICpwU0VDQ29tcG9uZW50ID0gKFNFQ19PTVhfQkFTRUNPTVBPTkVOVCAqKXBPTVhDb21wb25lbnQtPnBDb21wb25lbnRQcml2YXRlOworICAgIFNFQ19PTVhfVklERU9FTkNfQ09NUE9ORU5UICpwVmlkZW9FbmMgPSAoU0VDX09NWF9WSURFT0VOQ19DT01QT05FTlQgKilwU0VDQ29tcG9uZW50LT5oQ29tcG9uZW50SGFuZGxlOworICAgIFNFQ19PTVhfQkFTRVBPUlQgICAgICAgICAgKnBTRUNJbnB1dFBvcnQgPSAmcFNFQ0NvbXBvbmVudC0+cFNFQ1BvcnRbSU5QVVRfUE9SVF9JTkRFWF07CisgICAgU0VDX0gyNjRFTkNfSEFORExFICAgICAgICAqcEgyNjRFbmMgPSBOVUxMOworICAgIE9NWF9QVFIgICAgICAgICAgICAgICAgICAgIGhNRkNIYW5kbGUgPSBOVUxMOworICAgIE9NWF9TMzIgICAgICAgICAgICAgICAgICAgIHJldHVybkNvZGVjID0gMDsKKyAgICBDU0NfTUVUSE9EIGNzY19tZXRob2QgPSBDU0NfTUVUSE9EX1NXOworCisgICAgRnVuY3Rpb25JbigpOworCisgICAgcEgyNjRFbmMgPSAoU0VDX0gyNjRFTkNfSEFORExFICopKChTRUNfT01YX1ZJREVPRU5DX0NPTVBPTkVOVCAqKXBTRUNDb21wb25lbnQtPmhDb21wb25lbnRIYW5kbGUpLT5oQ29kZWNIYW5kbGU7CisgICAgcEgyNjRFbmMtPmhNRkNIMjY0SGFuZGxlLmJDb25maWd1cmVkTUZDID0gT01YX0ZBTFNFOworICAgIHBTRUNDb21wb25lbnQtPmJVc2VGbGFnRU9GID0gT01YX0ZBTFNFOworICAgIHBTRUNDb21wb25lbnQtPmJTYXZlRmxhZ0VPUyA9IE9NWF9GQUxTRTsKKworICAgIC8qIE1GQyhNdWx0aSBGdW5jdGlvbiBDb2RlYykgZW5jb2RlciBhbmQgQ01NKENvZGVjIE1lbW9yeSBNYW5hZ2VtZW50KSBkcml2ZXIgb3BlbiAqLworICAgIHN3aXRjaCAocFNFQ0lucHV0UG9ydC0+cG9ydERlZmluaXRpb24uZm9ybWF0LnZpZGVvLmVDb2xvckZvcm1hdCkgeworICAgIGNhc2UgT01YX1NFQ19DT0xPUl9Gb3JtYXROVjEyVFBoeXNpY2FsQWRkcmVzczoKKyAgICBjYXNlIE9NWF9TRUNfQ09MT1JfRm9ybWF0TlYxMkxQaHlzaWNhbEFkZHJlc3M6CisgICAgY2FzZSBPTVhfU0VDX0NPTE9SX0Zvcm1hdE5WMTJMVmlydHVhbEFkZHJlc3M6CisgICAgY2FzZSBPTVhfU0VDX0NPTE9SX0Zvcm1hdE5WMjFMUGh5c2ljYWxBZGRyZXNzOgorICAgICAgICBoTUZDSGFuZGxlID0gKE9NWF9QVFIpU3NiU2lwTWZjRW5jT3BlbigpOworICAgICAgICBicmVhazsKKyAgICBkZWZhdWx0OiB7CisgICAgICAgIFNTQklQX01GQ19CVUZGRVJfVFlQRSBidWZfdHlwZSA9IENBQ0hFOworICAgICAgICBoTUZDSGFuZGxlID0gKE9NWF9QVFIpU3NiU2lwTWZjRW5jT3BlbkV4dCgmYnVmX3R5cGUpOworICAgICAgICBicmVhazsKKyAgICB9CisgICAgfQorCisgICAgaWYgKGhNRkNIYW5kbGUgPT0gTlVMTCkgeworICAgICAgICByZXQgPSBPTVhfRXJyb3JJbnN1ZmZpY2llbnRSZXNvdXJjZXM7CisgICAgICAgIGdvdG8gRVhJVDsKKyAgICB9CisgICAgcEgyNjRFbmMtPmhNRkNIMjY0SGFuZGxlLmhNRkNIYW5kbGUgPSBoTUZDSGFuZGxlOworCisgICAgU2V0X0gyNjRFbmNfUGFyYW0oJihwSDI2NEVuYy0+aE1GQ0gyNjRIYW5kbGUubWZjVmlkZW9BdmMpLCBwU0VDQ29tcG9uZW50KTsKKworICAgIHJldHVybkNvZGVjID0gU3NiU2lwTWZjRW5jSW5pdChoTUZDSGFuZGxlLCAmKHBIMjY0RW5jLT5oTUZDSDI2NEhhbmRsZS5tZmNWaWRlb0F2YykpOworICAgIGlmIChyZXR1cm5Db2RlYyAhPSBNRkNfUkVUX09LKSB7CisgICAgICAgIHJldCA9IE9NWF9FcnJvckluc3VmZmljaWVudFJlc291cmNlczsKKyAgICAgICAgZ290byBFWElUOworICAgIH0KKworICAgIC8qIEFsbG9jYXRlIGVuY29kZXIncyBpbnB1dCBidWZmZXIgKi8KKyAgICByZXR1cm5Db2RlYyA9IFNzYlNpcE1mY0VuY0dldEluQnVmKGhNRkNIYW5kbGUsICYocEgyNjRFbmMtPmhNRkNIMjY0SGFuZGxlLmlucHV0SW5mbykpOworICAgIGlmIChyZXR1cm5Db2RlYyAhPSBNRkNfUkVUX09LKSB7CisgICAgICAgIHJldCA9IE9NWF9FcnJvckluc3VmZmljaWVudFJlc291cmNlczsKKyAgICAgICAgZ290byBFWElUOworICAgIH0KKyAgICBwVmlkZW9FbmMtPk1GQ0VuY0lucHV0QnVmZmVyWzBdLllQaHlBZGRyID0gcEgyNjRFbmMtPmhNRkNIMjY0SGFuZGxlLmlucHV0SW5mby5ZUGh5QWRkcjsKKyAgICBwVmlkZW9FbmMtPk1GQ0VuY0lucHV0QnVmZmVyWzBdLkNQaHlBZGRyID0gcEgyNjRFbmMtPmhNRkNIMjY0SGFuZGxlLmlucHV0SW5mby5DUGh5QWRkcjsKKyAgICBwVmlkZW9FbmMtPk1GQ0VuY0lucHV0QnVmZmVyWzBdLllWaXJBZGRyID0gcEgyNjRFbmMtPmhNRkNIMjY0SGFuZGxlLmlucHV0SW5mby5ZVmlyQWRkcjsKKyAgICBwVmlkZW9FbmMtPk1GQ0VuY0lucHV0QnVmZmVyWzBdLkNWaXJBZGRyID0gcEgyNjRFbmMtPmhNRkNIMjY0SGFuZGxlLmlucHV0SW5mby5DVmlyQWRkcjsKKyAgICBwVmlkZW9FbmMtPk1GQ0VuY0lucHV0QnVmZmVyWzBdLllCdWZmZXJTaXplID0gcEgyNjRFbmMtPmhNRkNIMjY0SGFuZGxlLmlucHV0SW5mby5ZU2l6ZTsKKyAgICBwVmlkZW9FbmMtPk1GQ0VuY0lucHV0QnVmZmVyWzBdLkNCdWZmZXJTaXplID0gcEgyNjRFbmMtPmhNRkNIMjY0SGFuZGxlLmlucHV0SW5mby5DU2l6ZTsKKyAgICBwVmlkZW9FbmMtPk1GQ0VuY0lucHV0QnVmZmVyWzBdLllEYXRhU2l6ZSA9IDA7CisgICAgcFZpZGVvRW5jLT5NRkNFbmNJbnB1dEJ1ZmZlclswXS5DRGF0YVNpemUgPSAwOworICAgIFNFQ19PU0FMX0xvZyhTRUNfTE9HX1RSQUNFLCAicEgyNjRFbmMtPmhNRkNIMjY0SGFuZGxlLmlucHV0SW5mby5ZVmlyQWRkciA6IDB4JXgiLCBwSDI2NEVuYy0+aE1GQ0gyNjRIYW5kbGUuaW5wdXRJbmZvLllWaXJBZGRyKTsKKyAgICBTRUNfT1NBTF9Mb2coU0VDX0xPR19UUkFDRSwgInBIMjY0RW5jLT5oTUZDSDI2NEhhbmRsZS5pbnB1dEluZm8uQ1ZpckFkZHIgOiAweCV4IiwgcEgyNjRFbmMtPmhNRkNIMjY0SGFuZGxlLmlucHV0SW5mby5DVmlyQWRkcik7CisKKyAgICByZXR1cm5Db2RlYyA9IFNzYlNpcE1mY0VuY0dldEluQnVmKGhNRkNIYW5kbGUsICYocEgyNjRFbmMtPmhNRkNIMjY0SGFuZGxlLmlucHV0SW5mbykpOworICAgIGlmIChyZXR1cm5Db2RlYyAhPSBNRkNfUkVUX09LKSB7CisgICAgICAgIHJldCA9IE9NWF9FcnJvckluc3VmZmljaWVudFJlc291cmNlczsKKyAgICAgICAgZ290byBFWElUOworICAgIH0KKyAgICBwVmlkZW9FbmMtPk1GQ0VuY0lucHV0QnVmZmVyWzFdLllQaHlBZGRyID0gcEgyNjRFbmMtPmhNRkNIMjY0SGFuZGxlLmlucHV0SW5mby5ZUGh5QWRkcjsKKyAgICBwVmlkZW9FbmMtPk1GQ0VuY0lucHV0QnVmZmVyWzFdLkNQaHlBZGRyID0gcEgyNjRFbmMtPmhNRkNIMjY0SGFuZGxlLmlucHV0SW5mby5DUGh5QWRkcjsKKyAgICBwVmlkZW9FbmMtPk1GQ0VuY0lucHV0QnVmZmVyWzFdLllWaXJBZGRyID0gcEgyNjRFbmMtPmhNRkNIMjY0SGFuZGxlLmlucHV0SW5mby5ZVmlyQWRkcjsKKyAgICBwVmlkZW9FbmMtPk1GQ0VuY0lucHV0QnVmZmVyWzFdLkNWaXJBZGRyID0gcEgyNjRFbmMtPmhNRkNIMjY0SGFuZGxlLmlucHV0SW5mby5DVmlyQWRkcjsKKyAgICBwVmlkZW9FbmMtPk1GQ0VuY0lucHV0QnVmZmVyWzFdLllCdWZmZXJTaXplID0gcEgyNjRFbmMtPmhNRkNIMjY0SGFuZGxlLmlucHV0SW5mby5ZU2l6ZTsKKyAgICBwVmlkZW9FbmMtPk1GQ0VuY0lucHV0QnVmZmVyWzFdLkNCdWZmZXJTaXplID0gcEgyNjRFbmMtPmhNRkNIMjY0SGFuZGxlLmlucHV0SW5mby5DU2l6ZTsKKyAgICBwVmlkZW9FbmMtPk1GQ0VuY0lucHV0QnVmZmVyWzFdLllEYXRhU2l6ZSA9IDA7CisgICAgcFZpZGVvRW5jLT5NRkNFbmNJbnB1dEJ1ZmZlclsxXS5DRGF0YVNpemUgPSAwOworICAgIFNFQ19PU0FMX0xvZyhTRUNfTE9HX1RSQUNFLCAicEgyNjRFbmMtPmhNRkNIMjY0SGFuZGxlLmlucHV0SW5mby5ZVmlyQWRkciA6IDB4JXgiLCBwSDI2NEVuYy0+aE1GQ0gyNjRIYW5kbGUuaW5wdXRJbmZvLllWaXJBZGRyKTsKKyAgICBTRUNfT1NBTF9Mb2coU0VDX0xPR19UUkFDRSwgInBIMjY0RW5jLT5oTUZDSDI2NEhhbmRsZS5pbnB1dEluZm8uQ1ZpckFkZHIgOiAweCV4IiwgcEgyNjRFbmMtPmhNRkNIMjY0SGFuZGxlLmlucHV0SW5mby5DVmlyQWRkcik7CisKKyAgICBwVmlkZW9FbmMtPmluZGV4SW5wdXRCdWZmZXIgPSAwOworCisgICAgcFZpZGVvRW5jLT5iRmlyc3RGcmFtZSA9IE9NWF9UUlVFOworCisjaWZkZWYgTk9OQkxPQ0tfTU9ERV9QUk9DRVNTCisgICAgcFZpZGVvRW5jLT5OQkVuY1RocmVhZC5iRXhpdEVuY29kZVRocmVhZCA9IE9NWF9GQUxTRTsKKyAgICBwVmlkZW9FbmMtPk5CRW5jVGhyZWFkLmJFbmNvZGVyUnVuID0gT01YX0ZBTFNFOworICAgIFNFQ19PU0FMX1NlbWFwaG9yZUNyZWF0ZSgmKHBWaWRlb0VuYy0+TkJFbmNUaHJlYWQuaEVuY0ZyYW1lU3RhcnQpKTsKKyAgICBTRUNfT1NBTF9TZW1hcGhvcmVDcmVhdGUoJihwVmlkZW9FbmMtPk5CRW5jVGhyZWFkLmhFbmNGcmFtZUVuZCkpOworICAgIGlmIChPTVhfRXJyb3JOb25lID09IFNFQ19PU0FMX1RocmVhZENyZWF0ZSgmcFZpZGVvRW5jLT5OQkVuY1RocmVhZC5oTkJFbmNvZGVUaHJlYWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTRUNfTUZDX0VuY29kZVRocmVhZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBPTVhDb21wb25lbnQpKSB7CisgICAgICAgIHBIMjY0RW5jLT5oTUZDSDI2NEhhbmRsZS5yZXR1cm5Db2RlYyA9IE1GQ19SRVRfT0s7CisgICAgfQorI2VuZGlmCisgICAgU0VDX09TQUxfTWVtc2V0KHBTRUNDb21wb25lbnQtPnRpbWVTdGFtcCwgLTE5NzcxMDAzLCBzaXplb2YoT01YX1RJQ0tTKSAqIE1BWF9USU1FU1RBTVApOworICAgIFNFQ19PU0FMX01lbXNldChwU0VDQ29tcG9uZW50LT5uRmxhZ3MsIDAsIHNpemVvZihPTVhfVTMyKSAqIE1BWF9GTEFHUyk7CisgICAgcEgyNjRFbmMtPmhNRkNIMjY0SGFuZGxlLmluZGV4VGltZXN0YW1wID0gMDsKKworICAgIHBWaWRlb0VuYy0+Y3NjX2hhbmRsZSA9IGNzY19pbml0KCZjc2NfbWV0aG9kKTsKKworRVhJVDoKKyAgICBGdW5jdGlvbk91dCgpOworCisgICAgcmV0dXJuIHJldDsKK30KKworLyogTUZDIFRlcm1pbmF0ZSAqLworT01YX0VSUk9SVFlQRSBTRUNfTUZDX0gyNjRFbmNfVGVybWluYXRlKE9NWF9DT01QT05FTlRUWVBFICpwT01YQ29tcG9uZW50KQoreworICAgIE9NWF9FUlJPUlRZUEUgICAgICAgICAgcmV0ID0gT01YX0Vycm9yTm9uZTsKKyAgICBTRUNfT01YX0JBU0VDT01QT05FTlQgKnBTRUNDb21wb25lbnQgPSAoU0VDX09NWF9CQVNFQ09NUE9ORU5UICopcE9NWENvbXBvbmVudC0+cENvbXBvbmVudFByaXZhdGU7CisgICAgU0VDX09NWF9WSURFT0VOQ19DT01QT05FTlQgKnBWaWRlb0VuYyA9ICgoU0VDX09NWF9WSURFT0VOQ19DT01QT05FTlQgKilwU0VDQ29tcG9uZW50LT5oQ29tcG9uZW50SGFuZGxlKTsKKyAgICBTRUNfSDI2NEVOQ19IQU5ETEUgICAgKnBIMjY0RW5jID0gTlVMTDsKKyAgICBPTVhfUFRSICAgICAgICAgICAgICAgIGhNRkNIYW5kbGUgPSBOVUxMOworCisgICAgRnVuY3Rpb25JbigpOworCisgICAgcEgyNjRFbmMgPSAoU0VDX0gyNjRFTkNfSEFORExFICopKChTRUNfT01YX1ZJREVPRU5DX0NPTVBPTkVOVCAqKXBTRUNDb21wb25lbnQtPmhDb21wb25lbnRIYW5kbGUpLT5oQ29kZWNIYW5kbGU7CisjaWZkZWYgTk9OQkxPQ0tfTU9ERV9QUk9DRVNTCisgICAgaWYgKHBWaWRlb0VuYy0+TkJFbmNUaHJlYWQuaE5CRW5jb2RlVGhyZWFkICE9IE5VTEwpIHsKKyAgICAgICAgcFZpZGVvRW5jLT5OQkVuY1RocmVhZC5iRXhpdEVuY29kZVRocmVhZCA9IE9NWF9UUlVFOworICAgICAgICBTRUNfT1NBTF9TZW1hcGhvcmVQb3N0KHBWaWRlb0VuYy0+TkJFbmNUaHJlYWQuaEVuY0ZyYW1lU3RhcnQpOworICAgICAgICBTRUNfT1NBTF9UaHJlYWRUZXJtaW5hdGUocFZpZGVvRW5jLT5OQkVuY1RocmVhZC5oTkJFbmNvZGVUaHJlYWQpOworICAgICAgICBwVmlkZW9FbmMtPk5CRW5jVGhyZWFkLmhOQkVuY29kZVRocmVhZCA9IE5VTEw7CisgICAgfQorCisgICAgaWYocFZpZGVvRW5jLT5OQkVuY1RocmVhZC5oRW5jRnJhbWVFbmQgIT0gTlVMTCkgeworICAgICAgICBTRUNfT1NBTF9TZW1hcGhvcmVUZXJtaW5hdGUocFZpZGVvRW5jLT5OQkVuY1RocmVhZC5oRW5jRnJhbWVFbmQpOworICAgICAgICBwVmlkZW9FbmMtPk5CRW5jVGhyZWFkLmhFbmNGcmFtZUVuZCA9IE5VTEw7CisgICAgfQorCisgICAgaWYocFZpZGVvRW5jLT5OQkVuY1RocmVhZC5oRW5jRnJhbWVTdGFydCAhPSBOVUxMKSB7CisgICAgICAgIFNFQ19PU0FMX1NlbWFwaG9yZVRlcm1pbmF0ZShwVmlkZW9FbmMtPk5CRW5jVGhyZWFkLmhFbmNGcmFtZVN0YXJ0KTsKKyAgICAgICAgcFZpZGVvRW5jLT5OQkVuY1RocmVhZC5oRW5jRnJhbWVTdGFydCA9IE5VTEw7CisgICAgfQorI2VuZGlmCisKKyAgICBoTUZDSGFuZGxlID0gcEgyNjRFbmMtPmhNRkNIMjY0SGFuZGxlLmhNRkNIYW5kbGU7CisgICAgaWYgKGhNRkNIYW5kbGUgIT0gTlVMTCkgeworICAgICAgICBTc2JTaXBNZmNFbmNDbG9zZShoTUZDSGFuZGxlKTsKKyAgICAgICAgaE1GQ0hhbmRsZSA9IHBIMjY0RW5jLT5oTUZDSDI2NEhhbmRsZS5oTUZDSGFuZGxlID0gTlVMTDsKKyAgICB9CisKKyAgICBpZiAocFZpZGVvRW5jLT5jc2NfaGFuZGxlICE9IE5VTEwpIHsKKyAgICAgICAgY3NjX2RlaW5pdChwVmlkZW9FbmMtPmNzY19oYW5kbGUpOworICAgICAgICBwVmlkZW9FbmMtPmNzY19oYW5kbGUgPSBOVUxMOworICAgIH0KKworRVhJVDoKKyAgICBGdW5jdGlvbk91dCgpOworCisgICAgcmV0dXJuIHJldDsKK30KKworT01YX0VSUk9SVFlQRSBTRUNfTUZDX0gyNjRfRW5jb2RlX05vbmJsb2NrKE9NWF9DT01QT05FTlRUWVBFICpwT01YQ29tcG9uZW50LCBTRUNfT01YX0RBVEEgKnBJbnB1dERhdGEsIFNFQ19PTVhfREFUQSAqcE91dHB1dERhdGEpCit7CisgICAgT01YX0VSUk9SVFlQRSAgICAgICAgICAgICAgcmV0ID0gT01YX0Vycm9yTm9uZTsKKyAgICBTRUNfT01YX0JBU0VDT01QT05FTlQgICAgICpwU0VDQ29tcG9uZW50ID0gKFNFQ19PTVhfQkFTRUNPTVBPTkVOVCAqKXBPTVhDb21wb25lbnQtPnBDb21wb25lbnRQcml2YXRlOworICAgIFNFQ19PTVhfVklERU9FTkNfQ09NUE9ORU5UICpwVmlkZW9FbmMgPSAoKFNFQ19PTVhfVklERU9FTkNfQ09NUE9ORU5UICopcFNFQ0NvbXBvbmVudC0+aENvbXBvbmVudEhhbmRsZSk7CisgICAgU0VDX0gyNjRFTkNfSEFORExFICAgICAgICAqcEgyNjRFbmMgPSAoU0VDX0gyNjRFTkNfSEFORExFICopKChTRUNfT01YX1ZJREVPRU5DX0NPTVBPTkVOVCAqKXBTRUNDb21wb25lbnQtPmhDb21wb25lbnRIYW5kbGUpLT5oQ29kZWNIYW5kbGU7CisgICAgU1NCU0lQX01GQ19FTkNfSU5QVVRfSU5GTyAqcElucHV0SW5mbyA9ICZwSDI2NEVuYy0+aE1GQ0gyNjRIYW5kbGUuaW5wdXRJbmZvOworICAgIFNTQlNJUF9NRkNfRU5DX09VVFBVVF9JTkZPIG91dHB1dEluZm87CisgICAgU0VDX09NWF9CQVNFUE9SVCAgICAgICAgICAqcFNFQ1BvcnQgPSBOVUxMOworICAgIE1GQ19FTkNfQUREUl9JTkZPICAgICAgICAgIGFkZHJJbmZvOworICAgIE9NWF9VMzIgICAgICAgICAgICAgICAgICAgIG9uZUZyYW1lU2l6ZSA9IHBJbnB1dERhdGEtPmRhdGFMZW47CisKKyAgICBGdW5jdGlvbkluKCk7CisKKyAgICBpZiAocEgyNjRFbmMtPmhNRkNIMjY0SGFuZGxlLmJDb25maWd1cmVkTUZDID09IE9NWF9GQUxTRSkgeworICAgICAgICBwSDI2NEVuYy0+aE1GQ0gyNjRIYW5kbGUucmV0dXJuQ29kZWMgPSBTc2JTaXBNZmNFbmNHZXRPdXRCdWYocEgyNjRFbmMtPmhNRkNIMjY0SGFuZGxlLmhNRkNIYW5kbGUsICZvdXRwdXRJbmZvKTsKKyAgICAgICAgaWYgKHBIMjY0RW5jLT5oTUZDSDI2NEhhbmRsZS5yZXR1cm5Db2RlYyAhPSBNRkNfUkVUX09LKSB7CisgICAgICAgICAgICBTRUNfT1NBTF9Mb2coU0VDX0xPR19UUkFDRSwgIiVzIC0gU3NiU2lwTWZjRW5jR2V0T3V0QnVmIEZhaWxlZFxuIiwgX19mdW5jX18pOworICAgICAgICAgICAgcmV0ID0gT01YX0Vycm9yVW5kZWZpbmVkOworICAgICAgICAgICAgZ290byBFWElUOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgT01YX1U4ICpwID0gTlVMTDsKKyAgICAgICAgICAgIGludCBpU3BzU2l6ZSA9IDA7CisgICAgICAgICAgICBpbnQgaVBwc1NpemUgPSAwOworCisgICAgICAgICAgICBwID0gRmluZERlbGltaXRlcigoT01YX1U4ICopb3V0cHV0SW5mby5TdHJtVmlyQWRkciArIDQsIG91dHB1dEluZm8uaGVhZGVyU2l6ZSAtIDQpOworCisgICAgICAgICAgICBpU3BzU2l6ZSA9ICh1bnNpZ25lZCBpbnQpcCAtICh1bnNpZ25lZCBpbnQpb3V0cHV0SW5mby5TdHJtVmlyQWRkcjsKKyAgICAgICAgICAgIHBIMjY0RW5jLT5oTUZDSDI2NEhhbmRsZS5oZWFkZXJEYXRhLnBIZWFkZXJTUFMgPSAoT01YX1BUUilvdXRwdXRJbmZvLlN0cm1WaXJBZGRyOworICAgICAgICAgICAgcEgyNjRFbmMtPmhNRkNIMjY0SGFuZGxlLmhlYWRlckRhdGEuU1BTTGVuID0gaVNwc1NpemU7CisKKyAgICAgICAgICAgIGlQcHNTaXplID0gb3V0cHV0SW5mby5oZWFkZXJTaXplIC0gaVNwc1NpemU7CisgICAgICAgICAgICBwSDI2NEVuYy0+aE1GQ0gyNjRIYW5kbGUuaGVhZGVyRGF0YS5wSGVhZGVyUFBTID0gKE9NWF9VOCAqKW91dHB1dEluZm8uU3RybVZpckFkZHIgKyBpU3BzU2l6ZTsKKyAgICAgICAgICAgIHBIMjY0RW5jLT5oTUZDSDI2NEhhbmRsZS5oZWFkZXJEYXRhLlBQU0xlbiA9IGlQcHNTaXplOworICAgICAgICB9CisKKyAgICAgICAgcE91dHB1dERhdGEtPmRhdGFCdWZmZXIgPSBvdXRwdXRJbmZvLlN0cm1WaXJBZGRyOworICAgICAgICBwT3V0cHV0RGF0YS0+YWxsb2NTaXplID0gb3V0cHV0SW5mby5oZWFkZXJTaXplOworICAgICAgICBwT3V0cHV0RGF0YS0+ZGF0YUxlbiA9IG91dHB1dEluZm8uaGVhZGVyU2l6ZTsKKyAgICAgICAgcE91dHB1dERhdGEtPnRpbWVTdGFtcCA9IDA7CisgICAgICAgIHBPdXRwdXREYXRhLT5uRmxhZ3MgfD0gT01YX0JVRkZFUkZMQUdfQ09ERUNDT05GSUc7CisgICAgICAgIHBPdXRwdXREYXRhLT5uRmxhZ3MgfD0gT01YX0JVRkZFUkZMQUdfRU5ET0ZGUkFNRTsKKworICAgICAgICBwSDI2NEVuYy0+aE1GQ0gyNjRIYW5kbGUuYkNvbmZpZ3VyZWRNRkMgPSBPTVhfVFJVRTsKKworICAgICAgICByZXQgPSBPTVhfRXJyb3JJbnB1dERhdGFFbmNvZGVZZXQ7CisgICAgICAgIGdvdG8gRVhJVDsKKyAgICB9CisKKyAgICBpZiAoKHBJbnB1dERhdGEtPm5GbGFncyAmIE9NWF9CVUZGRVJGTEFHX0VORE9GRlJBTUUpICYmCisgICAgICAgIChwU0VDQ29tcG9uZW50LT5iVXNlRmxhZ0VPRiA9PSBPTVhfRkFMU0UpKQorICAgICAgICBwU0VDQ29tcG9uZW50LT5iVXNlRmxhZ0VPRiA9IE9NWF9UUlVFOworCisgICAgaWYgKG9uZUZyYW1lU2l6ZSA8PSAwKSB7CisgICAgICAgIHBPdXRwdXREYXRhLT50aW1lU3RhbXAgPSBwSW5wdXREYXRhLT50aW1lU3RhbXA7CisgICAgICAgIHBPdXRwdXREYXRhLT5uRmxhZ3MgPSBwSW5wdXREYXRhLT5uRmxhZ3M7CisKKyAgICAgICAgcmV0ID0gT01YX0Vycm9yTm9uZTsKKyAgICAgICAgZ290byBFWElUOworICAgIH0KKworICAgIHBTRUNQb3J0ID0gJnBTRUNDb21wb25lbnQtPnBTRUNQb3J0W0lOUFVUX1BPUlRfSU5ERVhdOworICAgIGlmICgoKHBJbnB1dERhdGEtPm5GbGFncyAmIE9NWF9CVUZGRVJGTEFHX0VPUykgPT0gT01YX0JVRkZFUkZMQUdfRU9TKSB8fAorICAgICAgICAocFNFQ0NvbXBvbmVudC0+Z2V0QWxsRGVsYXlCdWZmZXIgPT0gT01YX1RSVUUpKXsKKyAgICAgICAgLyogRHVtbXkgaW5wdXQgZGF0YSBmb3IgZ2V0IG91dCBlbmNvZGVkIGxhc3QgZnJhbWUgKi8KKyAgICAgICAgcElucHV0SW5mby0+WVBoeUFkZHIgPSBwVmlkZW9FbmMtPk1GQ0VuY0lucHV0QnVmZmVyW3BWaWRlb0VuYy0+aW5kZXhJbnB1dEJ1ZmZlcl0uWVBoeUFkZHI7CisgICAgICAgIHBJbnB1dEluZm8tPkNQaHlBZGRyID0gcFZpZGVvRW5jLT5NRkNFbmNJbnB1dEJ1ZmZlcltwVmlkZW9FbmMtPmluZGV4SW5wdXRCdWZmZXJdLkNQaHlBZGRyOworICAgICAgICBwSW5wdXRJbmZvLT5ZVmlyQWRkciA9IHBWaWRlb0VuYy0+TUZDRW5jSW5wdXRCdWZmZXJbcFZpZGVvRW5jLT5pbmRleElucHV0QnVmZmVyXS5ZVmlyQWRkcjsKKyAgICAgICAgcElucHV0SW5mby0+Q1ZpckFkZHIgPSBwVmlkZW9FbmMtPk1GQ0VuY0lucHV0QnVmZmVyW3BWaWRlb0VuYy0+aW5kZXhJbnB1dEJ1ZmZlcl0uQ1ZpckFkZHI7CisgICAgfSBlbHNlIHsKKyAgICAgICAgc3dpdGNoIChwU0VDUG9ydC0+cG9ydERlZmluaXRpb24uZm9ybWF0LnZpZGVvLmVDb2xvckZvcm1hdCkgeworICAgICAgICBjYXNlIE9NWF9TRUNfQ09MT1JfRm9ybWF0TlYxMlRQaHlzaWNhbEFkZHJlc3M6CisgICAgICAgIGNhc2UgT01YX1NFQ19DT0xPUl9Gb3JtYXROVjEyTFBoeXNpY2FsQWRkcmVzczoKKyAgICAgICAgY2FzZSBPTVhfU0VDX0NPTE9SX0Zvcm1hdE5WMjFMUGh5c2ljYWxBZGRyZXNzOiB7CisjaWZuZGVmIFVTRV9NRVRBREFUQUJVRkZFUlRZUEUKKyAgICAgICAgICAgIC8qIFVTRV9GSU1DX0ZSQU1FX0JVRkZFUiAqLworICAgICAgICAgICAgU0VDX09TQUxfTWVtY3B5KCZhZGRySW5mby5wQWRkclksIHBJbnB1dERhdGEtPmRhdGFCdWZmZXIsIHNpemVvZihhZGRySW5mby5wQWRkclkpKTsKKyAgICAgICAgICAgIFNFQ19PU0FMX01lbWNweSgmYWRkckluZm8ucEFkZHJDLCBwSW5wdXREYXRhLT5kYXRhQnVmZmVyICsgc2l6ZW9mKGFkZHJJbmZvLnBBZGRyWSksIHNpemVvZihhZGRySW5mby5wQWRkckMpKTsKKyNlbHNlCisgICAgICAgICAgICBPTVhfUFRSIHBwQnVmWzNdOworICAgICAgICAgICAgU0VDX09TQUxfR2V0SW5mb0Zyb21NZXRhRGF0YShwSW5wdXREYXRhLCBwcEJ1Zik7CisKKyAgICAgICAgICAgIFNFQ19PU0FMX01lbWNweSgmYWRkckluZm8ucEFkZHJZLCBwcEJ1ZlswXSwgc2l6ZW9mKGFkZHJJbmZvLnBBZGRyWSkpOworICAgICAgICAgICAgU0VDX09TQUxfTWVtY3B5KCZhZGRySW5mby5wQWRkckMsIHBwQnVmWzFdLCBzaXplb2YoYWRkckluZm8ucEFkZHJDKSk7CisjZW5kaWYKKyAgICAgICAgICAgIHBJbnB1dEluZm8tPllQaHlBZGRyID0gYWRkckluZm8ucEFkZHJZOworICAgICAgICAgICAgcElucHV0SW5mby0+Q1BoeUFkZHIgPSBhZGRySW5mby5wQWRkckM7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgICAgICBjYXNlIE9NWF9TRUNfQ09MT1JfRm9ybWF0TlYxMkxWaXJ0dWFsQWRkcmVzczoKKyAgICAgICAgICAgIGFkZHJJbmZvLnBBZGRyWSA9ICooKHZvaWQgKiopcElucHV0RGF0YS0+ZGF0YUJ1ZmZlcik7CisgICAgICAgICAgICBhZGRySW5mby5wQWRkckMgPSAodm9pZCAqKSgoY2hhciAqKWFkZHJJbmZvLnBBZGRyWSArIHBJbnB1dEluZm8tPllTaXplKTsKKworICAgICAgICAgICAgcElucHV0SW5mby0+WVBoeUFkZHIgPSBhZGRySW5mby5wQWRkclk7CisgICAgICAgICAgICBwSW5wdXRJbmZvLT5DUGh5QWRkciA9IGFkZHJJbmZvLnBBZGRyQzsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgcElucHV0SW5mby0+WVBoeUFkZHIgPSBwVmlkZW9FbmMtPk1GQ0VuY0lucHV0QnVmZmVyW3BWaWRlb0VuYy0+aW5kZXhJbnB1dEJ1ZmZlcl0uWVBoeUFkZHI7CisgICAgICAgICAgICBwSW5wdXRJbmZvLT5DUGh5QWRkciA9IHBWaWRlb0VuYy0+TUZDRW5jSW5wdXRCdWZmZXJbcFZpZGVvRW5jLT5pbmRleElucHV0QnVmZmVyXS5DUGh5QWRkcjsKKyAgICAgICAgICAgIHBJbnB1dEluZm8tPllWaXJBZGRyID0gcFZpZGVvRW5jLT5NRkNFbmNJbnB1dEJ1ZmZlcltwVmlkZW9FbmMtPmluZGV4SW5wdXRCdWZmZXJdLllWaXJBZGRyOworICAgICAgICAgICAgcElucHV0SW5mby0+Q1ZpckFkZHIgPSBwVmlkZW9FbmMtPk1GQ0VuY0lucHV0QnVmZmVyW3BWaWRlb0VuYy0+aW5kZXhJbnB1dEJ1ZmZlcl0uQ1ZpckFkZHI7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgIH0KKworICAgIHBTRUNDb21wb25lbnQtPnRpbWVTdGFtcFtwSDI2NEVuYy0+aE1GQ0gyNjRIYW5kbGUuaW5kZXhUaW1lc3RhbXBdID0gcElucHV0RGF0YS0+dGltZVN0YW1wOworICAgIHBTRUNDb21wb25lbnQtPm5GbGFnc1twSDI2NEVuYy0+aE1GQ0gyNjRIYW5kbGUuaW5kZXhUaW1lc3RhbXBdID0gcElucHV0RGF0YS0+bkZsYWdzOworCisgICAgaWYgKChwSDI2NEVuYy0+aE1GQ0gyNjRIYW5kbGUucmV0dXJuQ29kZWMgPT0gTUZDX1JFVF9PSykgJiYKKyAgICAgICAgKHBWaWRlb0VuYy0+YkZpcnN0RnJhbWUgPT0gT01YX0ZBTFNFKSkgeworICAgICAgICBPTVhfUzMyIGluZGV4VGltZXN0YW1wID0gMDsKKworICAgICAgICAvKiB3YWl0IGZvciBtZmMgZW5jb2RlIGRvbmUgKi8KKyAgICAgICAgaWYgKHBWaWRlb0VuYy0+TkJFbmNUaHJlYWQuYkVuY29kZXJSdW4gIT0gT01YX0ZBTFNFKSB7CisgICAgICAgICAgICBTRUNfT1NBTF9TZW1hcGhvcmVXYWl0KHBWaWRlb0VuYy0+TkJFbmNUaHJlYWQuaEVuY0ZyYW1lRW5kKTsKKyAgICAgICAgICAgIHBWaWRlb0VuYy0+TkJFbmNUaHJlYWQuYkVuY29kZXJSdW4gPSBPTVhfRkFMU0U7CisgICAgICAgIH0KKworICAgICAgICBTRUNfT1NBTF9TbGVlcE1pbGxpc2VjKDApOworICAgICAgICBwSDI2NEVuYy0+aE1GQ0gyNjRIYW5kbGUucmV0dXJuQ29kZWMgPSBTc2JTaXBNZmNFbmNHZXRPdXRCdWYocEgyNjRFbmMtPmhNRkNIMjY0SGFuZGxlLmhNRkNIYW5kbGUsICZvdXRwdXRJbmZvKTsKKyAgICAgICAgaWYgKChTc2JTaXBNZmNFbmNHZXRDb25maWcocEgyNjRFbmMtPmhNRkNIMjY0SGFuZGxlLmhNRkNIYW5kbGUsIE1GQ19FTkNfR0VUQ09ORl9GUkFNRV9UQUcsICZpbmRleFRpbWVzdGFtcCkgIT0gTUZDX1JFVF9PSykgfHwKKyAgICAgICAgICAgICgoKGluZGV4VGltZXN0YW1wIDwgMCkgfHwgKGluZGV4VGltZXN0YW1wID49IE1BWF9USU1FU1RBTVApKSkpeworICAgICAgICAgICAgcE91dHB1dERhdGEtPnRpbWVTdGFtcCA9IHBJbnB1dERhdGEtPnRpbWVTdGFtcDsKKyAgICAgICAgICAgIHBPdXRwdXREYXRhLT5uRmxhZ3MgPSBwSW5wdXREYXRhLT5uRmxhZ3M7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBwT3V0cHV0RGF0YS0+dGltZVN0YW1wID0gcFNFQ0NvbXBvbmVudC0+dGltZVN0YW1wW2luZGV4VGltZXN0YW1wXTsKKyAgICAgICAgICAgIHBPdXRwdXREYXRhLT5uRmxhZ3MgPSBwU0VDQ29tcG9uZW50LT5uRmxhZ3NbaW5kZXhUaW1lc3RhbXBdOworICAgICAgICB9CisKKyAgICAgICAgaWYgKHBIMjY0RW5jLT5oTUZDSDI2NEhhbmRsZS5yZXR1cm5Db2RlYyA9PSBNRkNfUkVUX09LKSB7CisgICAgICAgICAgICAvKiogRmlsbCBPdXRwdXQgQnVmZmVyICoqLworICAgICAgICAgICAgcE91dHB1dERhdGEtPmRhdGFCdWZmZXIgPSBvdXRwdXRJbmZvLlN0cm1WaXJBZGRyOworICAgICAgICAgICAgcE91dHB1dERhdGEtPmFsbG9jU2l6ZSA9IG91dHB1dEluZm8uZGF0YVNpemU7CisgICAgICAgICAgICBwT3V0cHV0RGF0YS0+ZGF0YUxlbiA9IG91dHB1dEluZm8uZGF0YVNpemU7CisgICAgICAgICAgICBwT3V0cHV0RGF0YS0+dXNlZERhdGFMZW4gPSAwOworCisgICAgICAgICAgICBwT3V0cHV0RGF0YS0+bkZsYWdzIHw9IE9NWF9CVUZGRVJGTEFHX0VORE9GRlJBTUU7CisgICAgICAgICAgICBpZiAob3V0cHV0SW5mby5mcmFtZVR5cGUgPT0gTUZDX0ZSQU1FX1RZUEVfSV9GUkFNRSkKKyAgICAgICAgICAgICAgICBwT3V0cHV0RGF0YS0+bkZsYWdzIHw9IE9NWF9CVUZGRVJGTEFHX1NZTkNGUkFNRTsKKworICAgICAgICAgICAgU0VDX09TQUxfTG9nKFNFQ19MT0dfVFJBQ0UsICJNRkMgRW5jb2RlIE9LISEhISEhISEhISEhISEhISEhISEhISEhISEhISFcbiIpOworCisgICAgICAgICAgICByZXQgPSBPTVhfRXJyb3JOb25lOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgU0VDX09TQUxfTG9nKFNFQ19MT0dfRVJST1IsICIlczogU3NiU2lwTWZjRW5jR2V0T3V0QnVmIGZhaWxlZCwgcmV0OiVkIiwgX19GVU5DVElPTl9fLCBwSDI2NEVuYy0+aE1GQ0gyNjRIYW5kbGUucmV0dXJuQ29kZWMpOworICAgICAgICAgICAgcmV0ID0gT01YX0Vycm9yVW5kZWZpbmVkOworICAgICAgICAgICAgZ290byBFWElUOworICAgICAgICB9CisKKyAgICAgICAgaWYgKHBTRUNDb21wb25lbnQtPmdldEFsbERlbGF5QnVmZmVyID09IE9NWF9UUlVFKSB7CisgICAgICAgICAgICByZXQgPSBPTVhfRXJyb3JJbnB1dERhdGFFbmNvZGVZZXQ7CisgICAgICAgIH0KKyAgICAgICAgaWYgKChwSW5wdXREYXRhLT5uRmxhZ3MgJiBPTVhfQlVGRkVSRkxBR19FT1MpID09IE9NWF9CVUZGRVJGTEFHX0VPUykgeworICAgICAgICAgICAgcElucHV0RGF0YS0+bkZsYWdzID0gKHBPdXRwdXREYXRhLT5uRmxhZ3MgJiAofk9NWF9CVUZGRVJGTEFHX0VPUykpOworICAgICAgICAgICAgcFNFQ0NvbXBvbmVudC0+Z2V0QWxsRGVsYXlCdWZmZXIgPSBPTVhfVFJVRTsKKyAgICAgICAgICAgIHJldCA9IE9NWF9FcnJvcklucHV0RGF0YUVuY29kZVlldDsKKyAgICAgICAgfQorICAgICAgICBpZiAoKHBPdXRwdXREYXRhLT5uRmxhZ3MgJiBPTVhfQlVGRkVSRkxBR19FT1MpID09IE9NWF9CVUZGRVJGTEFHX0VPUykgeworICAgICAgICAgICAgcFNFQ0NvbXBvbmVudC0+Z2V0QWxsRGVsYXlCdWZmZXIgPSBPTVhfRkFMU0U7CisgICAgICAgICAgICBwT3V0cHV0RGF0YS0+ZGF0YUxlbiA9IDA7CisgICAgICAgICAgICBwT3V0cHV0RGF0YS0+dXNlZERhdGFMZW4gPSAwOworICAgICAgICAgICAgU0VDX09TQUxfTG9nKFNFQ19MT0dfVFJBQ0UsICJPTVhfQlVGRkVSRkxBR19FT1MhISEiKTsKKyAgICAgICAgICAgIHJldCA9IE9NWF9FcnJvck5vbmU7CisgICAgICAgIH0KKyAgICB9CisgICAgaWYgKHBIMjY0RW5jLT5oTUZDSDI2NEhhbmRsZS5yZXR1cm5Db2RlYyAhPSBNRkNfUkVUX09LKSB7CisgICAgICAgIFNFQ19PU0FMX0xvZyhTRUNfTE9HX0VSUk9SLCAiSW4gJXMgOiBTc2JTaXBNZmNFbmNFeGUgRmFpbGVkISEhXG4iLCBfX2Z1bmNfXyk7CisgICAgICAgIHJldCA9IE9NWF9FcnJvclVuZGVmaW5lZDsKKyAgICAgICAgZ290byBFWElUOworICAgIH0KKworICAgIHBIMjY0RW5jLT5oTUZDSDI2NEhhbmRsZS5yZXR1cm5Db2RlYyA9IFNzYlNpcE1mY0VuY1NldEluQnVmKHBIMjY0RW5jLT5oTUZDSDI2NEhhbmRsZS5oTUZDSGFuZGxlLCBwSW5wdXRJbmZvKTsKKyAgICBpZiAocEgyNjRFbmMtPmhNRkNIMjY0SGFuZGxlLnJldHVybkNvZGVjICE9IE1GQ19SRVRfT0spIHsKKyAgICAgICAgU0VDX09TQUxfTG9nKFNFQ19MT0dfVFJBQ0UsICJFcnJvciA6IFNzYlNpcE1mY0VuY1NldEluQnVmKCkgXG4iKTsKKyAgICAgICAgcmV0ID0gT01YX0Vycm9yVW5kZWZpbmVkOworICAgICAgICBnb3RvIEVYSVQ7CisgICAgfSBlbHNlIHsKKyAgICAgICAgcFZpZGVvRW5jLT5pbmRleElucHV0QnVmZmVyKys7CisgICAgICAgIHBWaWRlb0VuYy0+aW5kZXhJbnB1dEJ1ZmZlciAlPSBNRkNfSU5QVVRfQlVGRkVSX05VTV9NQVg7CisgICAgfQorCisgICAgaWYgKHBWaWRlb0VuYy0+Y29uZmlnQ2hhbmdlID09IE9NWF9UUlVFKSB7CisgICAgICAgIENoYW5nZV9IMjY0RW5jX1BhcmFtKCYocEgyNjRFbmMtPmhNRkNIMjY0SGFuZGxlLm1mY1ZpZGVvQXZjKSwgcFNFQ0NvbXBvbmVudCk7CisgICAgICAgIHBWaWRlb0VuYy0+Y29uZmlnQ2hhbmdlID0gT01YX0ZBTFNFOworICAgIH0KKworICAgIFNzYlNpcE1mY0VuY1NldENvbmZpZyhwSDI2NEVuYy0+aE1GQ0gyNjRIYW5kbGUuaE1GQ0hhbmRsZSwgTUZDX0VOQ19TRVRDT05GX0ZSQU1FX1RBRywgJihwSDI2NEVuYy0+aE1GQ0gyNjRIYW5kbGUuaW5kZXhUaW1lc3RhbXApKTsKKworICAgIC8qIG1mYyBlbmNvZGUgc3RhcnQgKi8KKyAgICBTRUNfT1NBTF9TZW1hcGhvcmVQb3N0KHBWaWRlb0VuYy0+TkJFbmNUaHJlYWQuaEVuY0ZyYW1lU3RhcnQpOworICAgIHBWaWRlb0VuYy0+TkJFbmNUaHJlYWQuYkVuY29kZXJSdW4gPSBPTVhfVFJVRTsKKyAgICBwSDI2NEVuYy0+aE1GQ0gyNjRIYW5kbGUuaW5kZXhUaW1lc3RhbXArKzsKKyAgICBwSDI2NEVuYy0+aE1GQ0gyNjRIYW5kbGUuaW5kZXhUaW1lc3RhbXAgJT0gTUFYX1RJTUVTVEFNUDsKKyAgICBwVmlkZW9FbmMtPmJGaXJzdEZyYW1lID0gT01YX0ZBTFNFOworICAgIFNFQ19PU0FMX1NsZWVwTWlsbGlzZWMoMCk7CisKK0VYSVQ6CisgICAgRnVuY3Rpb25PdXQoKTsKKworICAgIHJldHVybiByZXQ7Cit9CisKK09NWF9FUlJPUlRZUEUgU0VDX01GQ19IMjY0X0VuY29kZV9CbG9jayhPTVhfQ09NUE9ORU5UVFlQRSAqcE9NWENvbXBvbmVudCwgU0VDX09NWF9EQVRBICpwSW5wdXREYXRhLCBTRUNfT01YX0RBVEEgKnBPdXRwdXREYXRhKQoreworICAgIE9NWF9FUlJPUlRZUEUgICAgICAgICAgICAgIHJldCA9IE9NWF9FcnJvck5vbmU7CisgICAgU0VDX09NWF9CQVNFQ09NUE9ORU5UICAgICAqcFNFQ0NvbXBvbmVudCA9IChTRUNfT01YX0JBU0VDT01QT05FTlQgKilwT01YQ29tcG9uZW50LT5wQ29tcG9uZW50UHJpdmF0ZTsKKyAgICBTRUNfT01YX1ZJREVPRU5DX0NPTVBPTkVOVCAqcFZpZGVvRW5jID0gKChTRUNfT01YX1ZJREVPRU5DX0NPTVBPTkVOVCAqKXBTRUNDb21wb25lbnQtPmhDb21wb25lbnRIYW5kbGUpOworICAgIFNFQ19IMjY0RU5DX0hBTkRMRSAgICAgICAgKnBIMjY0RW5jID0gKFNFQ19IMjY0RU5DX0hBTkRMRSAqKSgoU0VDX09NWF9WSURFT0VOQ19DT01QT05FTlQgKilwU0VDQ29tcG9uZW50LT5oQ29tcG9uZW50SGFuZGxlKS0+aENvZGVjSGFuZGxlOworICAgIFNTQlNJUF9NRkNfRU5DX0lOUFVUX0lORk8gKnBJbnB1dEluZm8gPSAmcEgyNjRFbmMtPmhNRkNIMjY0SGFuZGxlLmlucHV0SW5mbzsKKyAgICBTU0JTSVBfTUZDX0VOQ19PVVRQVVRfSU5GTyBvdXRwdXRJbmZvOworICAgIFNFQ19PTVhfQkFTRVBPUlQgICAgICAgICAgKnBTRUNQb3J0ID0gTlVMTDsKKyAgICBNRkNfRU5DX0FERFJfSU5GTyAgICAgICAgICBhZGRySW5mbzsKKyAgICBPTVhfVTMyICAgICAgICAgICAgICAgICAgICBvbmVGcmFtZVNpemUgPSBwSW5wdXREYXRhLT5kYXRhTGVuOworICAgIE9NWF9TMzIgICAgICAgICAgICAgICAgICAgIHJldHVybkNvZGVjID0gMDsKKworICAgIEZ1bmN0aW9uSW4oKTsKKworICAgIGlmIChwSDI2NEVuYy0+aE1GQ0gyNjRIYW5kbGUuYkNvbmZpZ3VyZWRNRkMgPT0gT01YX0ZBTFNFKSB7CisgICAgICAgIHJldHVybkNvZGVjID0gU3NiU2lwTWZjRW5jR2V0T3V0QnVmKHBIMjY0RW5jLT5oTUZDSDI2NEhhbmRsZS5oTUZDSGFuZGxlLCAmb3V0cHV0SW5mbyk7CisgICAgICAgIGlmIChyZXR1cm5Db2RlYyAhPSBNRkNfUkVUX09LKQorICAgICAgICB7CisgICAgICAgICAgICBTRUNfT1NBTF9Mb2coU0VDX0xPR19UUkFDRSwgIiVzIC0gU3NiU2lwTWZjRW5jR2V0T3V0QnVmIEZhaWxlZFxuIiwgX19mdW5jX18pOworICAgICAgICAgICAgcmV0ID0gT01YX0Vycm9yVW5kZWZpbmVkOworICAgICAgICAgICAgZ290byBFWElUOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgT01YX1U4ICpwID0gTlVMTDsKKyAgICAgICAgICAgIGludCBpU3BzU2l6ZSA9IDA7CisgICAgICAgICAgICBpbnQgaVBwc1NpemUgPSAwOworCisgICAgICAgICAgICBwID0gRmluZERlbGltaXRlcigoT01YX1U4ICopb3V0cHV0SW5mby5TdHJtVmlyQWRkciArIDQsIG91dHB1dEluZm8uaGVhZGVyU2l6ZSAtIDQpOworCisgICAgICAgICAgICBpU3BzU2l6ZSA9ICh1bnNpZ25lZCBpbnQpcCAtICh1bnNpZ25lZCBpbnQpb3V0cHV0SW5mby5TdHJtVmlyQWRkcjsKKyAgICAgICAgICAgIHBIMjY0RW5jLT5oTUZDSDI2NEhhbmRsZS5oZWFkZXJEYXRhLnBIZWFkZXJTUFMgPSAoT01YX1BUUilvdXRwdXRJbmZvLlN0cm1WaXJBZGRyOworICAgICAgICAgICAgcEgyNjRFbmMtPmhNRkNIMjY0SGFuZGxlLmhlYWRlckRhdGEuU1BTTGVuID0gaVNwc1NpemU7CisKKyAgICAgICAgICAgIGlQcHNTaXplID0gb3V0cHV0SW5mby5oZWFkZXJTaXplIC0gaVNwc1NpemU7CisgICAgICAgICAgICBwSDI2NEVuYy0+aE1GQ0gyNjRIYW5kbGUuaGVhZGVyRGF0YS5wSGVhZGVyUFBTID0gKE9NWF9VOCAqKW91dHB1dEluZm8uU3RybVZpckFkZHIgKyBpU3BzU2l6ZTsKKyAgICAgICAgICAgIHBIMjY0RW5jLT5oTUZDSDI2NEhhbmRsZS5oZWFkZXJEYXRhLlBQU0xlbiA9IGlQcHNTaXplOworICAgICAgICB9CisKKyAgICAgICAgcE91dHB1dERhdGEtPmRhdGFCdWZmZXIgPSBvdXRwdXRJbmZvLlN0cm1WaXJBZGRyOworICAgICAgICBwT3V0cHV0RGF0YS0+YWxsb2NTaXplID0gb3V0cHV0SW5mby5oZWFkZXJTaXplOworICAgICAgICBwT3V0cHV0RGF0YS0+ZGF0YUxlbiA9IG91dHB1dEluZm8uaGVhZGVyU2l6ZTsKKyAgICAgICAgcE91dHB1dERhdGEtPnRpbWVTdGFtcCA9IDA7CisgICAgICAgIHBPdXRwdXREYXRhLT5uRmxhZ3MgfD0gT01YX0JVRkZFUkZMQUdfQ09ERUNDT05GSUc7CisgICAgICAgIHBPdXRwdXREYXRhLT5uRmxhZ3MgfD0gT01YX0JVRkZFUkZMQUdfRU5ET0ZGUkFNRTsKKworICAgICAgICBwSDI2NEVuYy0+aE1GQ0gyNjRIYW5kbGUuYkNvbmZpZ3VyZWRNRkMgPSBPTVhfVFJVRTsKKworICAgICAgICByZXQgPSBPTVhfRXJyb3JJbnB1dERhdGFFbmNvZGVZZXQ7CisgICAgICAgIGdvdG8gRVhJVDsKKyAgICB9CisKKyAgICBpZiAoKHBJbnB1dERhdGEtPm5GbGFncyAmIE9NWF9CVUZGRVJGTEFHX0VORE9GRlJBTUUpICYmCisgICAgICAgIChwU0VDQ29tcG9uZW50LT5iVXNlRmxhZ0VPRiA9PSBPTVhfRkFMU0UpKQorICAgICAgICBwU0VDQ29tcG9uZW50LT5iVXNlRmxhZ0VPRiA9IE9NWF9UUlVFOworCisgICAgaWYgKG9uZUZyYW1lU2l6ZSA8PSAwKSB7CisgICAgICAgIHBPdXRwdXREYXRhLT50aW1lU3RhbXAgPSBwSW5wdXREYXRhLT50aW1lU3RhbXA7CisgICAgICAgIHBPdXRwdXREYXRhLT5uRmxhZ3MgPSBwSW5wdXREYXRhLT5uRmxhZ3M7CisKKyAgICAgICAgcmV0ID0gT01YX0Vycm9yTm9uZTsKKyAgICAgICAgZ290byBFWElUOworICAgIH0KKworICAgIHBTRUNQb3J0ID0gJnBTRUNDb21wb25lbnQtPnBTRUNQb3J0W0lOUFVUX1BPUlRfSU5ERVhdOworICAgIHN3aXRjaCAocFNFQ1BvcnQtPnBvcnREZWZpbml0aW9uLmZvcm1hdC52aWRlby5lQ29sb3JGb3JtYXQpIHsKKyAgICBjYXNlIE9NWF9TRUNfQ09MT1JfRm9ybWF0TlYxMlRQaHlzaWNhbEFkZHJlc3M6CisgICAgY2FzZSBPTVhfU0VDX0NPTE9SX0Zvcm1hdE5WMTJMUGh5c2ljYWxBZGRyZXNzOgorICAgIGNhc2UgT01YX1NFQ19DT0xPUl9Gb3JtYXROVjIxTFBoeXNpY2FsQWRkcmVzczogeworI2lmbmRlZiBVU0VfTUVUQURBVEFCVUZGRVJUWVBFCisgICAgICAgIC8qIFVTRV9GSU1DX0ZSQU1FX0JVRkZFUiAqLworICAgICAgICBTRUNfT1NBTF9NZW1jcHkoJmFkZHJJbmZvLnBBZGRyWSwgcElucHV0RGF0YS0+ZGF0YUJ1ZmZlciwgc2l6ZW9mKGFkZHJJbmZvLnBBZGRyWSkpOworICAgICAgICBTRUNfT1NBTF9NZW1jcHkoJmFkZHJJbmZvLnBBZGRyQywgcElucHV0RGF0YS0+ZGF0YUJ1ZmZlciArIHNpemVvZihhZGRySW5mby5wQWRkclkpLCBzaXplb2YoYWRkckluZm8ucEFkZHJDKSk7CisjZWxzZQorICAgICAgICBPTVhfUFRSIHBwQnVmWzNdOworICAgICAgICBTRUNfT1NBTF9HZXRJbmZvRnJvbU1ldGFEYXRhKHBJbnB1dERhdGEsIHBwQnVmKTsKKworICAgICAgICBTRUNfT1NBTF9NZW1jcHkoJmFkZHJJbmZvLnBBZGRyWSwgcHBCdWZbMF0sIHNpemVvZihhZGRySW5mby5wQWRkclkpKTsKKyAgICAgICAgU0VDX09TQUxfTWVtY3B5KCZhZGRySW5mby5wQWRkckMsIHBwQnVmWzFdLCBzaXplb2YoYWRkckluZm8ucEFkZHJDKSk7CisjZW5kaWYKKyAgICAgICAgcElucHV0SW5mby0+WVBoeUFkZHIgPSBhZGRySW5mby5wQWRkclk7CisgICAgICAgIHBJbnB1dEluZm8tPkNQaHlBZGRyID0gYWRkckluZm8ucEFkZHJDOworICAgICAgICBicmVhazsKKyAgICB9CisgICAgY2FzZSBPTVhfU0VDX0NPTE9SX0Zvcm1hdE5WMTJMVmlydHVhbEFkZHJlc3M6CisgICAgICAgIGFkZHJJbmZvLnBBZGRyWSA9ICooKHZvaWQgKiopcElucHV0RGF0YS0+ZGF0YUJ1ZmZlcik7CisgICAgICAgIGFkZHJJbmZvLnBBZGRyQyA9ICh2b2lkICopKChjaGFyICopYWRkckluZm8ucEFkZHJZICsgcElucHV0SW5mby0+WVNpemUpOworCisgICAgICAgIHBJbnB1dEluZm8tPllQaHlBZGRyID0gYWRkckluZm8ucEFkZHJZOworICAgICAgICBwSW5wdXRJbmZvLT5DUGh5QWRkciA9IGFkZHJJbmZvLnBBZGRyQzsKKyAgICAgICAgYnJlYWs7CisgICAgZGVmYXVsdDoKKyAgICAgICAgcElucHV0SW5mby0+WVBoeUFkZHIgPSBwVmlkZW9FbmMtPk1GQ0VuY0lucHV0QnVmZmVyW3BWaWRlb0VuYy0+aW5kZXhJbnB1dEJ1ZmZlcl0uWVBoeUFkZHI7CisgICAgICAgIHBJbnB1dEluZm8tPkNQaHlBZGRyID0gcFZpZGVvRW5jLT5NRkNFbmNJbnB1dEJ1ZmZlcltwVmlkZW9FbmMtPmluZGV4SW5wdXRCdWZmZXJdLkNQaHlBZGRyOworICAgICAgICBwSW5wdXRJbmZvLT5ZVmlyQWRkciA9IHBWaWRlb0VuYy0+TUZDRW5jSW5wdXRCdWZmZXJbcFZpZGVvRW5jLT5pbmRleElucHV0QnVmZmVyXS5ZVmlyQWRkcjsKKyAgICAgICAgcElucHV0SW5mby0+Q1ZpckFkZHIgPSBwVmlkZW9FbmMtPk1GQ0VuY0lucHV0QnVmZmVyW3BWaWRlb0VuYy0+aW5kZXhJbnB1dEJ1ZmZlcl0uQ1ZpckFkZHI7CisgICAgICAgIGJyZWFrOworICAgIH0KKworICAgIHJldHVybkNvZGVjID0gU3NiU2lwTWZjRW5jU2V0SW5CdWYocEgyNjRFbmMtPmhNRkNIMjY0SGFuZGxlLmhNRkNIYW5kbGUsIHBJbnB1dEluZm8pOworICAgIGlmIChyZXR1cm5Db2RlYyAhPSBNRkNfUkVUX09LKSB7CisgICAgICAgIFNFQ19PU0FMX0xvZyhTRUNfTE9HX1RSQUNFLCAiRXJyb3IgOiBTc2JTaXBNZmNFbmNTZXRJbkJ1ZigpIFxuIik7CisgICAgICAgIHJldCA9IE9NWF9FcnJvclVuZGVmaW5lZDsKKyAgICAgICAgZ290byBFWElUOworICAgIH0gZWxzZSB7CisgICAgICAgIHBWaWRlb0VuYy0+aW5kZXhJbnB1dEJ1ZmZlcisrOworICAgICAgICBwVmlkZW9FbmMtPmluZGV4SW5wdXRCdWZmZXIgJT0gTUZDX0lOUFVUX0JVRkZFUl9OVU1fTUFYOworICAgIH0KKworICAgIGlmIChwVmlkZW9FbmMtPmNvbmZpZ0NoYW5nZSA9PSBPTVhfVFJVRSkgeworICAgICAgICBDaGFuZ2VfSDI2NEVuY19QYXJhbSgmKHBIMjY0RW5jLT5oTUZDSDI2NEhhbmRsZS5tZmNWaWRlb0F2YyksIHBTRUNDb21wb25lbnQpOworICAgICAgICBwVmlkZW9FbmMtPmNvbmZpZ0NoYW5nZSA9IE9NWF9GQUxTRTsKKyAgICB9CisKKyAgICBwU0VDQ29tcG9uZW50LT50aW1lU3RhbXBbcEgyNjRFbmMtPmhNRkNIMjY0SGFuZGxlLmluZGV4VGltZXN0YW1wXSA9IHBJbnB1dERhdGEtPnRpbWVTdGFtcDsKKyAgICBwU0VDQ29tcG9uZW50LT5uRmxhZ3NbcEgyNjRFbmMtPmhNRkNIMjY0SGFuZGxlLmluZGV4VGltZXN0YW1wXSA9IHBJbnB1dERhdGEtPm5GbGFnczsKKyAgICBTc2JTaXBNZmNFbmNTZXRDb25maWcocEgyNjRFbmMtPmhNRkNIMjY0SGFuZGxlLmhNRkNIYW5kbGUsIE1GQ19FTkNfU0VUQ09ORl9GUkFNRV9UQUcsICYocEgyNjRFbmMtPmhNRkNIMjY0SGFuZGxlLmluZGV4VGltZXN0YW1wKSk7CisKKyAgICByZXR1cm5Db2RlYyA9IFNzYlNpcE1mY0VuY0V4ZShwSDI2NEVuYy0+aE1GQ0gyNjRIYW5kbGUuaE1GQ0hhbmRsZSk7CisgICAgaWYgKHJldHVybkNvZGVjID09IE1GQ19SRVRfT0spIHsKKyAgICAgICAgT01YX1MzMiBpbmRleFRpbWVzdGFtcCA9IDA7CisKKyAgICAgICAgcEgyNjRFbmMtPmhNRkNIMjY0SGFuZGxlLmluZGV4VGltZXN0YW1wKys7CisgICAgICAgIHBIMjY0RW5jLT5oTUZDSDI2NEhhbmRsZS5pbmRleFRpbWVzdGFtcCAlPSBNQVhfVElNRVNUQU1QOworCisgICAgICAgIHJldHVybkNvZGVjID0gU3NiU2lwTWZjRW5jR2V0T3V0QnVmKHBIMjY0RW5jLT5oTUZDSDI2NEhhbmRsZS5oTUZDSGFuZGxlLCAmb3V0cHV0SW5mbyk7CisgICAgICAgIGlmICgoU3NiU2lwTWZjRW5jR2V0Q29uZmlnKHBIMjY0RW5jLT5oTUZDSDI2NEhhbmRsZS5oTUZDSGFuZGxlLCBNRkNfRU5DX0dFVENPTkZfRlJBTUVfVEFHLCAmaW5kZXhUaW1lc3RhbXApICE9IE1GQ19SRVRfT0spIHx8CisgICAgICAgICAgICAoKChpbmRleFRpbWVzdGFtcCA8IDApIHx8IChpbmRleFRpbWVzdGFtcCA+PSBNQVhfVElNRVNUQU1QKSkpKXsKKyAgICAgICAgICAgIHBPdXRwdXREYXRhLT50aW1lU3RhbXAgPSBwSW5wdXREYXRhLT50aW1lU3RhbXA7CisgICAgICAgICAgICBwT3V0cHV0RGF0YS0+bkZsYWdzID0gcElucHV0RGF0YS0+bkZsYWdzOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgcE91dHB1dERhdGEtPnRpbWVTdGFtcCA9IHBTRUNDb21wb25lbnQtPnRpbWVTdGFtcFtpbmRleFRpbWVzdGFtcF07CisgICAgICAgICAgICBwT3V0cHV0RGF0YS0+bkZsYWdzID0gcFNFQ0NvbXBvbmVudC0+bkZsYWdzW2luZGV4VGltZXN0YW1wXTsKKyAgICAgICAgfQorCisgICAgICAgIGlmIChyZXR1cm5Db2RlYyA9PSBNRkNfUkVUX09LKSB7CisgICAgICAgICAgICAvKiogRmlsbCBPdXRwdXQgQnVmZmVyICoqLworICAgICAgICAgICAgcE91dHB1dERhdGEtPmRhdGFCdWZmZXIgPSBvdXRwdXRJbmZvLlN0cm1WaXJBZGRyOworICAgICAgICAgICAgcE91dHB1dERhdGEtPmFsbG9jU2l6ZSA9IG91dHB1dEluZm8uZGF0YVNpemU7CisgICAgICAgICAgICBwT3V0cHV0RGF0YS0+ZGF0YUxlbiA9IG91dHB1dEluZm8uZGF0YVNpemU7CisgICAgICAgICAgICBwT3V0cHV0RGF0YS0+dXNlZERhdGFMZW4gPSAwOworCisgICAgICAgICAgICBwT3V0cHV0RGF0YS0+bkZsYWdzIHw9IE9NWF9CVUZGRVJGTEFHX0VORE9GRlJBTUU7CisgICAgICAgICAgICBpZiAob3V0cHV0SW5mby5mcmFtZVR5cGUgPT0gTUZDX0ZSQU1FX1RZUEVfSV9GUkFNRSkKKyAgICAgICAgICAgICAgICBwT3V0cHV0RGF0YS0+bkZsYWdzIHw9IE9NWF9CVUZGRVJGTEFHX1NZTkNGUkFNRTsKKworICAgICAgICAgICAgU0VDX09TQUxfTG9nKFNFQ19MT0dfVFJBQ0UsICJNRkMgRW5jb2RlIE9LISEhISEhISEhISEhISEhISEhISEhISEhISEhISFcbiIpOworCisgICAgICAgICAgICByZXQgPSBPTVhfRXJyb3JOb25lOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKHJldHVybkNvZGVjICE9IE1GQ19SRVRfT0spIHsKKyAgICAgICAgU0VDX09TQUxfTG9nKFNFQ19MT0dfRVJST1IsICJJbiAlcyA6IFNzYlNpcE1mY0VuY0V4ZSBPUiBTc2JTaXBNZmNFbmNHZXRPdXRCdWYgRmFpbGVkISEhXG4iLCBfX2Z1bmNfXyk7CisgICAgICAgIHJldCA9IE9NWF9FcnJvclVuZGVmaW5lZDsKKyAgICB9CisKK0VYSVQ6CisgICAgRnVuY3Rpb25PdXQoKTsKKworICAgIHJldHVybiByZXQ7Cit9CisKKy8qIE1GQyBFbmNvZGUgKi8KK09NWF9FUlJPUlRZUEUgU0VDX01GQ19IMjY0RW5jX2J1ZmZlclByb2Nlc3MoT01YX0NPTVBPTkVOVFRZUEUgKnBPTVhDb21wb25lbnQsIFNFQ19PTVhfREFUQSAqcElucHV0RGF0YSwgU0VDX09NWF9EQVRBICpwT3V0cHV0RGF0YSkKK3sKKyAgICBPTVhfRVJST1JUWVBFIHJldCA9IE9NWF9FcnJvck5vbmU7CisgICAgU0VDX09NWF9CQVNFQ09NUE9ORU5UICAgKnBTRUNDb21wb25lbnQgPSAoU0VDX09NWF9CQVNFQ09NUE9ORU5UICopcE9NWENvbXBvbmVudC0+cENvbXBvbmVudFByaXZhdGU7CisgICAgU0VDX0gyNjRFTkNfSEFORExFICAgICAgKnBIMjY0RW5jID0gKFNFQ19IMjY0RU5DX0hBTkRMRSAqKSgoU0VDX09NWF9WSURFT0VOQ19DT01QT05FTlQgKilwU0VDQ29tcG9uZW50LT5oQ29tcG9uZW50SGFuZGxlKS0+aENvZGVjSGFuZGxlOworICAgIFNFQ19PTVhfQkFTRVBPUlQgICAgICAgICpwU0VDSW5wdXRQb3J0ID0gJnBTRUNDb21wb25lbnQtPnBTRUNQb3J0W0lOUFVUX1BPUlRfSU5ERVhdOworICAgIFNFQ19PTVhfQkFTRVBPUlQgICAgICAgICpwU0VDT3V0cHV0UG9ydCA9ICZwU0VDQ29tcG9uZW50LT5wU0VDUG9ydFtPVVRQVVRfUE9SVF9JTkRFWF07CisgICAgT01YX0JPT0wgICAgICAgICAgICAgICAgIGVuZE9mRnJhbWUgPSBPTVhfRkFMU0U7CisgICAgT01YX0JPT0wgICAgICAgICAgICAgICAgIGZsYWdFT1MgPSBPTVhfRkFMU0U7CisKKyAgICBGdW5jdGlvbkluKCk7CisKKyAgICBpZiAoKCFDSEVDS19QT1JUX0VOQUJMRUQocFNFQ0lucHV0UG9ydCkpIHx8ICghQ0hFQ0tfUE9SVF9FTkFCTEVEKHBTRUNPdXRwdXRQb3J0KSkgfHwKKyAgICAgICAgICAgICghQ0hFQ0tfUE9SVF9QT1BVTEFURUQocFNFQ0lucHV0UG9ydCkpIHx8ICghQ0hFQ0tfUE9SVF9QT1BVTEFURUQocFNFQ091dHB1dFBvcnQpKSkgeworICAgICAgICByZXQgPSBPTVhfRXJyb3JOb25lOworICAgICAgICBnb3RvIEVYSVQ7CisgICAgfQorICAgIGlmIChPTVhfRkFMU0UgPT0gU0VDX0NoZWNrX0J1ZmZlclByb2Nlc3NfU3RhdGUocFNFQ0NvbXBvbmVudCkpIHsKKyAgICAgICAgcmV0ID0gT01YX0Vycm9yTm9uZTsKKyAgICAgICAgZ290byBFWElUOworICAgIH0KKworI2lmZGVmIE5PTkJMT0NLX01PREVfUFJPQ0VTUworICAgIHJldCA9IFNFQ19NRkNfSDI2NF9FbmNvZGVfTm9uYmxvY2socE9NWENvbXBvbmVudCwgcElucHV0RGF0YSwgcE91dHB1dERhdGEpOworI2Vsc2UKKyAgICByZXQgPSBTRUNfTUZDX0gyNjRfRW5jb2RlX0Jsb2NrKHBPTVhDb21wb25lbnQsIHBJbnB1dERhdGEsIHBPdXRwdXREYXRhKTsKKyNlbmRpZgorICAgIGlmIChyZXQgIT0gT01YX0Vycm9yTm9uZSkgeworICAgICAgICBpZiAocmV0ID09IE9NWF9FcnJvcklucHV0RGF0YUVuY29kZVlldCkgeworICAgICAgICAgICAgcE91dHB1dERhdGEtPnVzZWREYXRhTGVuID0gMDsKKyAgICAgICAgICAgIHBPdXRwdXREYXRhLT5yZW1haW5EYXRhTGVuID0gcE91dHB1dERhdGEtPmRhdGFMZW47CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBwU0VDQ29tcG9uZW50LT5wQ2FsbGJhY2tzLT5FdmVudEhhbmRsZXIoKE9NWF9IQU5ETEVUWVBFKXBPTVhDb21wb25lbnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBTRUNDb21wb25lbnQtPmNhbGxiYWNrRGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT01YX0V2ZW50RXJyb3IsIHJldCwgMCwgTlVMTCk7CisgICAgICAgIH0KKyAgICB9IGVsc2UgeworICAgICAgICBwSW5wdXREYXRhLT51c2VkRGF0YUxlbiArPSBwSW5wdXREYXRhLT5kYXRhTGVuOworICAgICAgICBwSW5wdXREYXRhLT5yZW1haW5EYXRhTGVuID0gcElucHV0RGF0YS0+ZGF0YUxlbiAtIHBJbnB1dERhdGEtPnVzZWREYXRhTGVuOworICAgICAgICBwSW5wdXREYXRhLT5kYXRhTGVuIC09IHBJbnB1dERhdGEtPnVzZWREYXRhTGVuOworICAgICAgICBwSW5wdXREYXRhLT51c2VkRGF0YUxlbiA9IDA7CisKKyAgICAgICAgLyogcE91dHB1dERhdGEtPnVzZWREYXRhTGVuID0gMDsgKi8KKyAgICAgICAgcE91dHB1dERhdGEtPnJlbWFpbkRhdGFMZW4gPSBwT3V0cHV0RGF0YS0+ZGF0YUxlbiAtIHBPdXRwdXREYXRhLT51c2VkRGF0YUxlbjsKKyAgICB9CisKK0VYSVQ6CisgICAgRnVuY3Rpb25PdXQoKTsKKworICAgIHJldHVybiByZXQ7Cit9CisKK09TQ0xfRVhQT1JUX1JFRiBPTVhfRVJST1JUWVBFIFNFQ19PTVhfQ29tcG9uZW50SW5pdChPTVhfSEFORExFVFlQRSBoQ29tcG9uZW50LCBPTVhfU1RSSU5HIGNvbXBvbmVudE5hbWUpCit7CisgICAgT01YX0VSUk9SVFlQRSAgICAgICAgICAgIHJldCA9IE9NWF9FcnJvck5vbmU7CisgICAgT01YX0NPTVBPTkVOVFRZUEUgICAgICAgKnBPTVhDb21wb25lbnQgPSBOVUxMOworICAgIFNFQ19PTVhfQkFTRUNPTVBPTkVOVCAgICpwU0VDQ29tcG9uZW50ID0gTlVMTDsKKyAgICBTRUNfT01YX0JBU0VQT1JUICAgICAgICAqcFNFQ1BvcnQgPSBOVUxMOworICAgIFNFQ19PTVhfVklERU9FTkNfQ09NUE9ORU5UICpwVmlkZW9FbmMgPSBOVUxMOworICAgIFNFQ19IMjY0RU5DX0hBTkRMRSAgICAgICpwSDI2NEVuYyA9IE5VTEw7CisgICAgaW50IGkgPSAwOworCisgICAgRnVuY3Rpb25JbigpOworCisgICAgaWYgKChoQ29tcG9uZW50ID09IE5VTEwpIHx8IChjb21wb25lbnROYW1lID09IE5VTEwpKSB7CisgICAgICAgIHJldCA9IE9NWF9FcnJvckJhZFBhcmFtZXRlcjsKKyAgICAgICAgU0VDX09TQUxfTG9nKFNFQ19MT0dfRVJST1IsICJPTVhfRXJyb3JCYWRQYXJhbWV0ZXIsIExpbmU6JWQiLCBfX0xJTkVfXyk7CisgICAgICAgIGdvdG8gRVhJVDsKKyAgICB9CisgICAgaWYgKFNFQ19PU0FMX1N0cmNtcChTRUNfT01YX0NPTVBPTkVOVF9IMjY0X0VOQywgY29tcG9uZW50TmFtZSkgIT0gMCkgeworICAgICAgICByZXQgPSBPTVhfRXJyb3JCYWRQYXJhbWV0ZXI7CisgICAgICAgIFNFQ19PU0FMX0xvZyhTRUNfTE9HX0VSUk9SLCAiT01YX0Vycm9yQmFkUGFyYW1ldGVyLCBjb21wb25lbnROYW1lOiVzLCBMaW5lOiVkIiwgY29tcG9uZW50TmFtZSwgX19MSU5FX18pOworICAgICAgICBnb3RvIEVYSVQ7CisgICAgfQorCisgICAgcE9NWENvbXBvbmVudCA9IChPTVhfQ09NUE9ORU5UVFlQRSAqKWhDb21wb25lbnQ7CisgICAgcmV0ID0gU0VDX09NWF9WaWRlb0VuY29kZUNvbXBvbmVudEluaXQocE9NWENvbXBvbmVudCk7CisgICAgaWYgKHJldCAhPSBPTVhfRXJyb3JOb25lKSB7CisgICAgICAgIFNFQ19PU0FMX0xvZyhTRUNfTE9HX0VSUk9SLCAiT01YX0Vycm9yLCBMaW5lOiVkIiwgX19MSU5FX18pOworICAgICAgICBnb3RvIEVYSVQ7CisgICAgfQorICAgIHBTRUNDb21wb25lbnQgPSAoU0VDX09NWF9CQVNFQ09NUE9ORU5UICopcE9NWENvbXBvbmVudC0+cENvbXBvbmVudFByaXZhdGU7CisgICAgcFNFQ0NvbXBvbmVudC0+Y29kZWNUeXBlID0gSFdfVklERU9fRU5DX0NPREVDOworCisgICAgcFNFQ0NvbXBvbmVudC0+Y29tcG9uZW50TmFtZSA9IChPTVhfU1RSSU5HKVNFQ19PU0FMX01hbGxvYyhNQVhfT01YX0NPTVBPTkVOVF9OQU1FX1NJWkUpOworICAgIGlmIChwU0VDQ29tcG9uZW50LT5jb21wb25lbnROYW1lID09IE5VTEwpIHsKKyAgICAgICAgU0VDX09NWF9WaWRlb0VuY29kZUNvbXBvbmVudERlaW5pdChwT01YQ29tcG9uZW50KTsKKyAgICAgICAgcmV0ID0gT01YX0Vycm9ySW5zdWZmaWNpZW50UmVzb3VyY2VzOworICAgICAgICBTRUNfT1NBTF9Mb2coU0VDX0xPR19FUlJPUiwgIk9NWF9FcnJvckluc3VmZmljaWVudFJlc291cmNlcywgTGluZTolZCIsIF9fTElORV9fKTsKKyAgICAgICAgZ290byBFWElUOworICAgIH0KKyAgICBTRUNfT1NBTF9NZW1zZXQocFNFQ0NvbXBvbmVudC0+Y29tcG9uZW50TmFtZSwgMCwgTUFYX09NWF9DT01QT05FTlRfTkFNRV9TSVpFKTsKKworICAgIHBIMjY0RW5jID0gU0VDX09TQUxfTWFsbG9jKHNpemVvZihTRUNfSDI2NEVOQ19IQU5ETEUpKTsKKyAgICBpZiAocEgyNjRFbmMgPT0gTlVMTCkgeworICAgICAgICBTRUNfT01YX1ZpZGVvRW5jb2RlQ29tcG9uZW50RGVpbml0KHBPTVhDb21wb25lbnQpOworICAgICAgICByZXQgPSBPTVhfRXJyb3JJbnN1ZmZpY2llbnRSZXNvdXJjZXM7CisgICAgICAgIFNFQ19PU0FMX0xvZyhTRUNfTE9HX0VSUk9SLCAiT01YX0Vycm9ySW5zdWZmaWNpZW50UmVzb3VyY2VzLCBMaW5lOiVkIiwgX19MSU5FX18pOworICAgICAgICBnb3RvIEVYSVQ7CisgICAgfQorICAgIFNFQ19PU0FMX01lbXNldChwSDI2NEVuYywgMCwgc2l6ZW9mKFNFQ19IMjY0RU5DX0hBTkRMRSkpOworICAgIHBWaWRlb0VuYyA9IChTRUNfT01YX1ZJREVPRU5DX0NPTVBPTkVOVCAqKXBTRUNDb21wb25lbnQtPmhDb21wb25lbnRIYW5kbGU7CisgICAgcFZpZGVvRW5jLT5oQ29kZWNIYW5kbGUgPSAoT01YX0hBTkRMRVRZUEUpcEgyNjRFbmM7CisKKyAgICBTRUNfT1NBTF9TdHJjcHkocFNFQ0NvbXBvbmVudC0+Y29tcG9uZW50TmFtZSwgU0VDX09NWF9DT01QT05FTlRfSDI2NF9FTkMpOworICAgIC8qIFNldCBjb21wb25lbnRWZXJzaW9uICovCisgICAgcFNFQ0NvbXBvbmVudC0+Y29tcG9uZW50VmVyc2lvbi5zLm5WZXJzaW9uTWFqb3IgPSBWRVJTSU9OTUFKT1JfTlVNQkVSOworICAgIHBTRUNDb21wb25lbnQtPmNvbXBvbmVudFZlcnNpb24ucy5uVmVyc2lvbk1pbm9yID0gVkVSU0lPTk1JTk9SX05VTUJFUjsKKyAgICBwU0VDQ29tcG9uZW50LT5jb21wb25lbnRWZXJzaW9uLnMublJldmlzaW9uICAgICA9IFJFVklTSU9OX05VTUJFUjsKKyAgICBwU0VDQ29tcG9uZW50LT5jb21wb25lbnRWZXJzaW9uLnMublN0ZXAgICAgICAgICA9IFNURVBfTlVNQkVSOworICAgIC8qIFNldCBzcGVjVmVyc2lvbiAqLworICAgIHBTRUNDb21wb25lbnQtPnNwZWNWZXJzaW9uLnMublZlcnNpb25NYWpvciA9IFZFUlNJT05NQUpPUl9OVU1CRVI7CisgICAgcFNFQ0NvbXBvbmVudC0+c3BlY1ZlcnNpb24ucy5uVmVyc2lvbk1pbm9yID0gVkVSU0lPTk1JTk9SX05VTUJFUjsKKyAgICBwU0VDQ29tcG9uZW50LT5zcGVjVmVyc2lvbi5zLm5SZXZpc2lvbiAgICAgPSBSRVZJU0lPTl9OVU1CRVI7CisgICAgcFNFQ0NvbXBvbmVudC0+c3BlY1ZlcnNpb24ucy5uU3RlcCAgICAgICAgID0gU1RFUF9OVU1CRVI7CisKKyAgICAvKiBBbmRyb2lkIENhcGFiaWxpdHlGbGFncyAqLworICAgIHBTRUNDb21wb25lbnQtPmNhcGFiaWxpdHlGbGFncy5pSXNPTVhDb21wb25lbnRNdWx0aVRocmVhZGVkICAgICAgICAgICAgICAgICAgID0gT01YX1RSVUU7CisgICAgcFNFQ0NvbXBvbmVudC0+Y2FwYWJpbGl0eUZsYWdzLmlPTVhDb21wb25lbnRTdXBwb3J0c0V4dGVybmFsSW5wdXRCdWZmZXJBbGxvYyAgPSBPTVhfVFJVRTsKKyAgICBwU0VDQ29tcG9uZW50LT5jYXBhYmlsaXR5RmxhZ3MuaU9NWENvbXBvbmVudFN1cHBvcnRzRXh0ZXJuYWxPdXRwdXRCdWZmZXJBbGxvYyA9IE9NWF9UUlVFOworICAgIHBTRUNDb21wb25lbnQtPmNhcGFiaWxpdHlGbGFncy5pT01YQ29tcG9uZW50U3VwcG9ydHNNb3ZhYmxlSW5wdXRCdWZmZXJzICAgICAgID0gT01YX0ZBTFNFOworICAgIHBTRUNDb21wb25lbnQtPmNhcGFiaWxpdHlGbGFncy5pT01YQ29tcG9uZW50U3VwcG9ydHNQYXJ0aWFsRnJhbWVzICAgICAgICAgICAgID0gT01YX0ZBTFNFOworICAgIHBTRUNDb21wb25lbnQtPmNhcGFiaWxpdHlGbGFncy5pT01YQ29tcG9uZW50VXNlc05BTFN0YXJ0Q29kZXMgICAgICAgICAgICAgICAgID0gT01YX1RSVUU7CisgICAgcFNFQ0NvbXBvbmVudC0+Y2FwYWJpbGl0eUZsYWdzLmlPTVhDb21wb25lbnRDYW5IYW5kbGVJbmNvbXBsZXRlRnJhbWVzICAgICAgICAgPSBPTVhfVFJVRTsKKyAgICBwU0VDQ29tcG9uZW50LT5jYXBhYmlsaXR5RmxhZ3MuaU9NWENvbXBvbmVudFVzZXNGdWxsQVZDRnJhbWVzICAgICAgICAgICAgICAgICA9IE9NWF9UUlVFOworCisgICAgLyogSW5wdXQgcG9ydCAqLworICAgIHBTRUNQb3J0ID0gJnBTRUNDb21wb25lbnQtPnBTRUNQb3J0W0lOUFVUX1BPUlRfSU5ERVhdOworICAgIHBTRUNQb3J0LT5wb3J0RGVmaW5pdGlvbi5mb3JtYXQudmlkZW8ubkZyYW1lV2lkdGggPSBERUZBVUxUX0ZSQU1FX1dJRFRIOworICAgIHBTRUNQb3J0LT5wb3J0RGVmaW5pdGlvbi5mb3JtYXQudmlkZW8ubkZyYW1lSGVpZ2h0PSBERUZBVUxUX0ZSQU1FX0hFSUdIVDsKKyAgICBwU0VDUG9ydC0+cG9ydERlZmluaXRpb24uZm9ybWF0LnZpZGVvLm5TdHJpZGUgPSAwOyAvKkRFRkFVTFRfRlJBTUVfV0lEVEg7Ki8KKyAgICBwU0VDUG9ydC0+cG9ydERlZmluaXRpb24ubkJ1ZmZlclNpemUgPSBERUZBVUxUX1ZJREVPX0lOUFVUX0JVRkZFUl9TSVpFOworICAgIHBTRUNQb3J0LT5wb3J0RGVmaW5pdGlvbi5mb3JtYXQudmlkZW8uZUNvbXByZXNzaW9uRm9ybWF0ID0gT01YX1ZJREVPX0NvZGluZ1VudXNlZDsKKyAgICBTRUNfT1NBTF9NZW1zZXQocFNFQ1BvcnQtPnBvcnREZWZpbml0aW9uLmZvcm1hdC52aWRlby5jTUlNRVR5cGUsIDAsIE1BWF9PTVhfTUlNRVRZUEVfU0laRSk7CisgICAgU0VDX09TQUxfU3RyY3B5KHBTRUNQb3J0LT5wb3J0RGVmaW5pdGlvbi5mb3JtYXQudmlkZW8uY01JTUVUeXBlLCAicmF3L3ZpZGVvIik7CisgICAgcFNFQ1BvcnQtPnBvcnREZWZpbml0aW9uLmZvcm1hdC52aWRlby5lQ29sb3JGb3JtYXQgPSBPTVhfQ09MT1JfRm9ybWF0WVVWNDIwU2VtaVBsYW5hcjsKKyAgICBwU0VDUG9ydC0+cG9ydERlZmluaXRpb24uYkVuYWJsZWQgPSBPTVhfVFJVRTsKKworICAgIC8qIE91dHB1dCBwb3J0ICovCisgICAgcFNFQ1BvcnQgPSAmcFNFQ0NvbXBvbmVudC0+cFNFQ1BvcnRbT1VUUFVUX1BPUlRfSU5ERVhdOworICAgIHBTRUNQb3J0LT5wb3J0RGVmaW5pdGlvbi5mb3JtYXQudmlkZW8ubkZyYW1lV2lkdGggPSBERUZBVUxUX0ZSQU1FX1dJRFRIOworICAgIHBTRUNQb3J0LT5wb3J0RGVmaW5pdGlvbi5mb3JtYXQudmlkZW8ubkZyYW1lSGVpZ2h0PSBERUZBVUxUX0ZSQU1FX0hFSUdIVDsKKyAgICBwU0VDUG9ydC0+cG9ydERlZmluaXRpb24uZm9ybWF0LnZpZGVvLm5TdHJpZGUgPSAwOyAvKkRFRkFVTFRfRlJBTUVfV0lEVEg7Ki8KKyAgICBwU0VDUG9ydC0+cG9ydERlZmluaXRpb24ubkJ1ZmZlclNpemUgPSBERUZBVUxUX1ZJREVPX09VVFBVVF9CVUZGRVJfU0laRTsKKyAgICBwU0VDUG9ydC0+cG9ydERlZmluaXRpb24uZm9ybWF0LnZpZGVvLmVDb21wcmVzc2lvbkZvcm1hdCA9IE9NWF9WSURFT19Db2RpbmdBVkM7CisgICAgU0VDX09TQUxfTWVtc2V0KHBTRUNQb3J0LT5wb3J0RGVmaW5pdGlvbi5mb3JtYXQudmlkZW8uY01JTUVUeXBlLCAwLCBNQVhfT01YX01JTUVUWVBFX1NJWkUpOworICAgIFNFQ19PU0FMX1N0cmNweShwU0VDUG9ydC0+cG9ydERlZmluaXRpb24uZm9ybWF0LnZpZGVvLmNNSU1FVHlwZSwgInZpZGVvL2F2YyIpOworICAgIHBTRUNQb3J0LT5wb3J0RGVmaW5pdGlvbi5mb3JtYXQudmlkZW8uZUNvbG9yRm9ybWF0ID0gT01YX0NPTE9SX0Zvcm1hdFVudXNlZDsKKyAgICBwU0VDUG9ydC0+cG9ydERlZmluaXRpb24uYkVuYWJsZWQgPSBPTVhfVFJVRTsKKworICAgIGZvcihpID0gMDsgaSA8IEFMTF9QT1JUX05VTTsgaSsrKSB7CisgICAgICAgIElOSVRfU0VUX1NJWkVfVkVSU0lPTigmcEgyNjRFbmMtPkFWQ0NvbXBvbmVudFtpXSwgT01YX1ZJREVPX1BBUkFNX0FWQ1RZUEUpOworICAgICAgICBwSDI2NEVuYy0+QVZDQ29tcG9uZW50W2ldLm5Qb3J0SW5kZXggPSBpOworICAgICAgICBwSDI2NEVuYy0+QVZDQ29tcG9uZW50W2ldLmVQcm9maWxlICAgPSBPTVhfVklERU9fQVZDUHJvZmlsZUJhc2VsaW5lOworICAgICAgICBwSDI2NEVuYy0+QVZDQ29tcG9uZW50W2ldLmVMZXZlbCAgICAgPSBPTVhfVklERU9fQVZDTGV2ZWwzMTsKKworICAgICAgICBwSDI2NEVuYy0+QVZDQ29tcG9uZW50W2ldLm5QRnJhbWVzID0gMjA7CisgICAgfQorCisgICAgcE9NWENvbXBvbmVudC0+R2V0UGFyYW1ldGVyICAgICAgPSAmU0VDX01GQ19IMjY0RW5jX0dldFBhcmFtZXRlcjsKKyAgICBwT01YQ29tcG9uZW50LT5TZXRQYXJhbWV0ZXIgICAgICA9ICZTRUNfTUZDX0gyNjRFbmNfU2V0UGFyYW1ldGVyOworICAgIHBPTVhDb21wb25lbnQtPkdldENvbmZpZyAgICAgICAgID0gJlNFQ19NRkNfSDI2NEVuY19HZXRDb25maWc7CisgICAgcE9NWENvbXBvbmVudC0+U2V0Q29uZmlnICAgICAgICAgPSAmU0VDX01GQ19IMjY0RW5jX1NldENvbmZpZzsKKyAgICBwT01YQ29tcG9uZW50LT5HZXRFeHRlbnNpb25JbmRleCA9ICZTRUNfTUZDX0gyNjRFbmNfR2V0RXh0ZW5zaW9uSW5kZXg7CisgICAgcE9NWENvbXBvbmVudC0+Q29tcG9uZW50Um9sZUVudW0gPSAmU0VDX01GQ19IMjY0RW5jX0NvbXBvbmVudFJvbGVFbnVtOworICAgIHBPTVhDb21wb25lbnQtPkNvbXBvbmVudERlSW5pdCAgID0gJlNFQ19PTVhfQ29tcG9uZW50RGVpbml0OworCisgICAgcFNFQ0NvbXBvbmVudC0+c2VjX21mY19jb21wb25lbnRJbml0ICAgICAgPSAmU0VDX01GQ19IMjY0RW5jX0luaXQ7CisgICAgcFNFQ0NvbXBvbmVudC0+c2VjX21mY19jb21wb25lbnRUZXJtaW5hdGUgPSAmU0VDX01GQ19IMjY0RW5jX1Rlcm1pbmF0ZTsKKyAgICBwU0VDQ29tcG9uZW50LT5zZWNfbWZjX2J1ZmZlclByb2Nlc3MgICAgICA9ICZTRUNfTUZDX0gyNjRFbmNfYnVmZmVyUHJvY2VzczsKKyAgICBwU0VDQ29tcG9uZW50LT5zZWNfY2hlY2tJbnB1dEZyYW1lICAgICAgICA9IE5VTEw7CisKKyAgICBwU0VDQ29tcG9uZW50LT5jdXJyZW50U3RhdGUgPSBPTVhfU3RhdGVMb2FkZWQ7CisKKyAgICByZXQgPSBPTVhfRXJyb3JOb25lOworCitFWElUOgorICAgIEZ1bmN0aW9uT3V0KCk7CisKKyAgICByZXR1cm4gcmV0OworfQorCitPTVhfRVJST1JUWVBFIFNFQ19PTVhfQ29tcG9uZW50RGVpbml0KE9NWF9IQU5ETEVUWVBFIGhDb21wb25lbnQpCit7CisgICAgT01YX0VSUk9SVFlQRSAgICAgICAgICAgIHJldCA9IE9NWF9FcnJvck5vbmU7CisgICAgT01YX0NPTVBPTkVOVFRZUEUgICAgICAgKnBPTVhDb21wb25lbnQgPSBOVUxMOworICAgIFNFQ19PTVhfQkFTRUNPTVBPTkVOVCAgICpwU0VDQ29tcG9uZW50ID0gTlVMTDsKKyAgICBTRUNfSDI2NEVOQ19IQU5ETEUgICAgICAqcEgyNjRFbmMgPSBOVUxMOworCisgICAgRnVuY3Rpb25JbigpOworCisgICAgaWYgKGhDb21wb25lbnQgPT0gTlVMTCkgeworICAgICAgICByZXQgPSBPTVhfRXJyb3JCYWRQYXJhbWV0ZXI7CisgICAgICAgIGdvdG8gRVhJVDsKKyAgICB9CisgICAgcE9NWENvbXBvbmVudCA9IChPTVhfQ09NUE9ORU5UVFlQRSAqKWhDb21wb25lbnQ7CisgICAgcFNFQ0NvbXBvbmVudCA9IChTRUNfT01YX0JBU0VDT01QT05FTlQgKilwT01YQ29tcG9uZW50LT5wQ29tcG9uZW50UHJpdmF0ZTsKKworICAgIFNFQ19PU0FMX0ZyZWUocFNFQ0NvbXBvbmVudC0+Y29tcG9uZW50TmFtZSk7CisgICAgcFNFQ0NvbXBvbmVudC0+Y29tcG9uZW50TmFtZSA9IE5VTEw7CisKKyAgICBwSDI2NEVuYyA9IChTRUNfSDI2NEVOQ19IQU5ETEUgKikoKFNFQ19PTVhfVklERU9FTkNfQ09NUE9ORU5UICopcFNFQ0NvbXBvbmVudC0+aENvbXBvbmVudEhhbmRsZSktPmhDb2RlY0hhbmRsZTsKKyAgICBpZiAocEgyNjRFbmMgIT0gTlVMTCkgeworICAgICAgICBTRUNfT1NBTF9GcmVlKHBIMjY0RW5jKTsKKyAgICAgICAgcEgyNjRFbmMgPSAoKFNFQ19PTVhfVklERU9FTkNfQ09NUE9ORU5UICopcFNFQ0NvbXBvbmVudC0+aENvbXBvbmVudEhhbmRsZSktPmhDb2RlY0hhbmRsZSA9IE5VTEw7CisgICAgfQorCisgICAgcmV0ID0gU0VDX09NWF9WaWRlb0VuY29kZUNvbXBvbmVudERlaW5pdChwT01YQ29tcG9uZW50KTsKKyAgICBpZiAocmV0ICE9IE9NWF9FcnJvck5vbmUpIHsKKyAgICAgICAgZ290byBFWElUOworICAgIH0KKworICAgIHJldCA9IE9NWF9FcnJvck5vbmU7CisKK0VYSVQ6CisgICAgRnVuY3Rpb25PdXQoKTsKKworICAgIHJldHVybiByZXQ7Cit9CmRpZmYgLS1naXQgYS9leHlub3M0L211bHRpbWVkaWEvb3Blbm1heC9zZWNfb214L2NvbXBvbmVudC92aWRlby9lbmMvaDI2NC9TRUNfT01YX0gyNjRlbmMuaCBiL2V4eW5vczQvbXVsdGltZWRpYS9vcGVubWF4L3NlY19vbXgvY29tcG9uZW50L3ZpZGVvL2VuYy9oMjY0L1NFQ19PTVhfSDI2NGVuYy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmNjMGE5NGYKLS0tIC9kZXYvbnVsbAorKysgYi9leHlub3M0L211bHRpbWVkaWEvb3Blbm1heC9zZWNfb214L2NvbXBvbmVudC92aWRlby9lbmMvaDI2NC9TRUNfT01YX0gyNjRlbmMuaApAQCAtMCwwICsxLDc3IEBACisvKgorICoKKyAqIENvcHlyaWdodCAyMDEwIFNhbXN1bmcgRWxlY3Ryb25pY3MgUy5MU0kgQ28uIExURAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisvKgorICogQGZpbGUgICAgICAgIFNFQ19PTVhfSDI2NGVuYy5oCisgKiBAYnJpZWYKKyAqIEBhdXRob3IgICAgICBTZXVuZ0Jlb20gS2ltIChzYmNydXgua2ltQHNhbXN1bmcuY29tKQorICogQHZlcnNpb24gICAgIDEuMS4wCisgKiBAaGlzdG9yeQorICogICAyMDEwLjcuMTUgOiBDcmVhdGUKKyAqLworCisjaWZuZGVmIFNFQ19PTVhfSDI2NF9FTkNfQ09NUE9ORU5UCisjZGVmaW5lIFNFQ19PTVhfSDI2NF9FTkNfQ09NUE9ORU5UCisKKyNpbmNsdWRlICJTRUNfT01YX0RlZi5oIgorI2luY2x1ZGUgIk9NWF9Db21wb25lbnQuaCIKKyNpbmNsdWRlICJPTVhfVmlkZW8uaCIKKyNpbmNsdWRlICJTc2JTaXBNZmNBcGkuaCIKKworCit0eXBlZGVmIHN0cnVjdCBfRVhUUkFfREFUQQoreworICAgIE9NWF9QVFIgcEhlYWRlclNQUzsKKyAgICBPTVhfVTMyIFNQU0xlbjsKKyAgICBPTVhfUFRSIHBIZWFkZXJQUFM7CisgICAgT01YX1UzMiBQUFNMZW47Cit9IEVYVFJBX0RBVEE7CisKK3R5cGVkZWYgc3RydWN0IF9TRUNfTUZDX0gyNjRFTkNfSEFORExFCit7CisgICAgT01YX0hBTkRMRVRZUEUgaE1GQ0hhbmRsZTsKKyAgICBTU0JTSVBfTUZDX0VOQ19IMjY0X1BBUkFNIG1mY1ZpZGVvQXZjOworICAgIFNTQlNJUF9NRkNfRU5DX0lOUFVUX0lORk8gaW5wdXRJbmZvOworLyogICAgU1NCU0lQX01GQ19FTkNfT1VUUFVUX0lORk8gb3V0cHV0SW5mbzsgKi8KKyAgICBPTVhfVTMyIGluZGV4VGltZXN0YW1wOworICAgIE9NWF9CT09MIGJDb25maWd1cmVkTUZDOworICAgIEVYVFJBX0RBVEEgaGVhZGVyRGF0YTsKKyAgICBPTVhfUzMyIHJldHVybkNvZGVjOworfSBTRUNfTUZDX0gyNjRFTkNfSEFORExFOworCit0eXBlZGVmIHN0cnVjdCBfU0VDX0gyNjRFTkNfSEFORExFCit7CisgICAgLyogT01YIENvZGVjIHNwZWNpZmljICovCisgICAgT01YX1ZJREVPX1BBUkFNX0FWQ1RZUEUgQVZDQ29tcG9uZW50W0FMTF9QT1JUX05VTV07CisgICAgT01YX1ZJREVPX1BBUkFNX0VSUk9SQ09SUkVDVElPTlRZUEUgZXJyb3JDb3JyZWN0aW9uVHlwZVtBTExfUE9SVF9OVU1dOworCisgICAgLyogU0VDIE1GQyBDb2RlYyBzcGVjaWZpYyAqLworICAgIFNFQ19NRkNfSDI2NEVOQ19IQU5ETEUgaE1GQ0gyNjRIYW5kbGU7Cit9IFNFQ19IMjY0RU5DX0hBTkRMRTsKKworI2lmZGVmIF9fY3BsdXNwbHVzCitleHRlcm4gIkMiIHsKKyNlbmRpZgorCitPU0NMX0VYUE9SVF9SRUYgT01YX0VSUk9SVFlQRSBTRUNfT01YX0NvbXBvbmVudEluaXQoT01YX0hBTkRMRVRZUEUgaENvbXBvbmVudCwgT01YX1NUUklORyBjb21wb25lbnROYW1lKTsKK09NWF9FUlJPUlRZUEUgU0VDX09NWF9Db21wb25lbnREZWluaXQoT01YX0hBTkRMRVRZUEUgaENvbXBvbmVudCk7CisKKyNpZmRlZiBfX2NwbHVzcGx1cworfTsKKyNlbmRpZgorCisjZW5kaWYKZGlmZiAtLWdpdCBhL2V4eW5vczQvbXVsdGltZWRpYS9vcGVubWF4L3NlY19vbXgvY29tcG9uZW50L3ZpZGVvL2VuYy9oMjY0L2xpYnJhcnlfcmVnaXN0ZXIuYyBiL2V4eW5vczQvbXVsdGltZWRpYS9vcGVubWF4L3NlY19vbXgvY29tcG9uZW50L3ZpZGVvL2VuYy9oMjY0L2xpYnJhcnlfcmVnaXN0ZXIuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lMjRlMTI2Ci0tLSAvZGV2L251bGwKKysrIGIvZXh5bm9zNC9tdWx0aW1lZGlhL29wZW5tYXgvc2VjX29teC9jb21wb25lbnQvdmlkZW8vZW5jL2gyNjQvbGlicmFyeV9yZWdpc3Rlci5jCkBAIC0wLDAgKzEsNTUgQEAKKy8qCisgKgorICogQ29weXJpZ2h0IDIwMTAgU2Ftc3VuZyBFbGVjdHJvbmljcyBTLkxTSSBDby4gTFRECisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKy8qCisgKiBAZmlsZSAgICAgICAgbGlicmFyeV9yZWdpc3Rlci5jCisgKiBAYnJpZWYKKyAqIEBhdXRob3IgICAgICBTZXVuZ0Jlb20gS2ltIChzYmNydXgua2ltQHNhbXN1bmcuY29tKQorICogQHZlcnNpb24gICAgIDEuMS4wCisgKiBAaGlzdG9yeQorICogICAyMDEwLjcuMTUgOiBDcmVhdGUKKyAqLworCisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlIDxzdGRsaWIuaD4KKyNpbmNsdWRlIDxzdHJpbmcuaD4KKyNpbmNsdWRlIDxkbGZjbi5oPgorCisjaW5jbHVkZSAiU0VDX09TQUxfTWVtb3J5LmgiCisjaW5jbHVkZSAiU0VDX09TQUxfRVRDLmgiCisjaW5jbHVkZSAibGlicmFyeV9yZWdpc3Rlci5oIgorI2luY2x1ZGUgIlNFQ19PU0FMX0xvZy5oIgorCisKK09TQ0xfRVhQT1JUX1JFRiBpbnQgU0VDX09NWF9DT01QT05FTlRfTGlicmFyeV9SZWdpc3RlcihTRUNSZWdpc3RlckNvbXBvbmVudFR5cGUgKipzZWNDb21wb25lbnRzKQoreworCUZ1bmN0aW9uSW4oKTsKKworCWlmIChzZWNDb21wb25lbnRzID09IE5VTEwpCisJCWdvdG8gRVhJVDsKKworCS8qIGNvbXBvbmVudCAxIC0gdmlkZW8gZGVjb2RlciBILjI2NCAqLworCVNFQ19PU0FMX1N0cmNweShzZWNDb21wb25lbnRzWzBdLT5jb21wb25lbnROYW1lLCBTRUNfT01YX0NPTVBPTkVOVF9IMjY0X0VOQyk7CisJU0VDX09TQUxfU3RyY3B5KHNlY0NvbXBvbmVudHNbMF0tPnJvbGVzWzBdLCBTRUNfT01YX0NPTVBPTkVOVF9IMjY0X0VOQ19ST0xFKTsKKwlzZWNDb21wb25lbnRzWzBdLT50b3RhbFJvbGVOdW0gPSBNQVhfQ09NUE9ORU5UX1JPTEVfTlVNOworCitFWElUOgorCUZ1bmN0aW9uT3V0KCk7CisKKwlyZXR1cm4gTUFYX0NPTVBPTkVOVF9OVU07Cit9CisKZGlmZiAtLWdpdCBhL2V4eW5vczQvbXVsdGltZWRpYS9vcGVubWF4L3NlY19vbXgvY29tcG9uZW50L3ZpZGVvL2VuYy9oMjY0L2xpYnJhcnlfcmVnaXN0ZXIuaCBiL2V4eW5vczQvbXVsdGltZWRpYS9vcGVubWF4L3NlY19vbXgvY29tcG9uZW50L3ZpZGVvL2VuYy9oMjY0L2xpYnJhcnlfcmVnaXN0ZXIuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45NTExZTNjCi0tLSAvZGV2L251bGwKKysrIGIvZXh5bm9zNC9tdWx0aW1lZGlhL29wZW5tYXgvc2VjX29teC9jb21wb25lbnQvdmlkZW8vZW5jL2gyNjQvbGlicmFyeV9yZWdpc3Rlci5oCkBAIC0wLDAgKzEsNTUgQEAKKy8qCisgKgorICogQ29weXJpZ2h0IDIwMTAgU2Ftc3VuZyBFbGVjdHJvbmljcyBTLkxTSSBDby4gTFRECisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKy8qCisgKiBAZmlsZSAgICAgICAgbGlicmFyeV9yZWdpc3Rlci5oCisgKiBAYnJpZWYKKyAqIEBhdXRob3IgICAgICBTZXVuZ0Jlb20gS2ltIChzYmNydXgua2ltQHNhbXN1bmcuY29tKQorICogQHZlcnNpb24gICAgIDEuMS4wCisgKiBAaGlzdG9yeQorICogICAyMDEwLjcuMTUgOiBDcmVhdGUKKyAqLworCisjaWZuZGVmIFNFQ19PTVhfSDI2NF9SRUcKKyNkZWZpbmUgU0VDX09NWF9IMjY0X1JFRworCisjaW5jbHVkZSAiU0VDX09NWF9EZWYuaCIKKyNpbmNsdWRlICJPTVhfQ29tcG9uZW50LmgiCisjaW5jbHVkZSAiU0VDX09NWF9Db21wb25lbnRfUmVnaXN0ZXIuaCIKKworCisjZGVmaW5lIE9TQ0xfRVhQT1JUX1JFRiBfX2F0dHJpYnV0ZV9fKCh2aXNpYmlsaXR5KCJkZWZhdWx0IikpKQorI2RlZmluZSBNQVhfQ09NUE9ORU5UX05VTSAgICAgICAxCisjZGVmaW5lIE1BWF9DT01QT05FTlRfUk9MRV9OVU0gIDEKKworLyogSC4yNjQgKi8KKyNkZWZpbmUgU0VDX09NWF9DT01QT05FTlRfSDI2NF9FTkMgIk9NWC5TRUMuQVZDLkVuY29kZXIiCisjZGVmaW5lIFNFQ19PTVhfQ09NUE9ORU5UX0gyNjRfRU5DX1JPTEUgInZpZGVvX2VuY29kZXIuYXZjIgorCisKKyNpZmRlZiBfX2NwbHVzcGx1cworZXh0ZXJuICJDIiB7CisjZW5kaWYKKworT1NDTF9FWFBPUlRfUkVGIGludCBTRUNfT01YX0NPTVBPTkVOVF9MaWJyYXJ5X1JlZ2lzdGVyKFNFQ1JlZ2lzdGVyQ29tcG9uZW50VHlwZSAqKnNlY0NvbXBvbmVudHMpOworCisjaWZkZWYgX19jcGx1c3BsdXMKK307CisjZW5kaWYKKworI2VuZGlmCisKZGlmZiAtLWdpdCBhL2V4eW5vczQvbXVsdGltZWRpYS9vcGVubWF4L3NlY19vbXgvY29tcG9uZW50L3ZpZGVvL2VuYy9tcGVnNC9BbmRyb2lkLm1rIGIvZXh5bm9zNC9tdWx0aW1lZGlhL29wZW5tYXgvc2VjX29teC9jb21wb25lbnQvdmlkZW8vZW5jL21wZWc0L0FuZHJvaWQubWsKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDQxZjVmYgotLS0gL2Rldi9udWxsCisrKyBiL2V4eW5vczQvbXVsdGltZWRpYS9vcGVubWF4L3NlY19vbXgvY29tcG9uZW50L3ZpZGVvL2VuYy9tcGVnNC9BbmRyb2lkLm1rCkBAIC0wLDAgKzEsMzkgQEAKK0xPQ0FMX1BBVEggOj0gJChjYWxsIG15LWRpcikKK2luY2x1ZGUgJChDTEVBUl9WQVJTKQorCitMT0NBTF9NT0RVTEVfVEFHUyA6PSBvcHRpb25hbAorCitMT0NBTF9TUkNfRklMRVMgOj0gXAorCVNFQ19PTVhfTXBlZzRlbmMuYyBcCisJbGlicmFyeV9yZWdpc3Rlci5jCisKK0xPQ0FMX1BSRUxJTktfTU9EVUxFIDo9IGZhbHNlCitMT0NBTF9NT0RVTEUgOj0gbGliT01YLlNFQy5NNFYuRW5jb2RlcgorTE9DQUxfTU9EVUxFX1BBVEggOj0gJChUQVJHRVRfT1VUX1NIQVJFRF9MSUJSQVJJRVMpL29teAorCitMT0NBTF9DRkxBR1MgOj0KKworaWZlcSAoJChCT0FSRF9OT05CTE9DS19NT0RFX1BST0NFU1MpLCB0cnVlKQorTE9DQUxfQ0ZMQUdTICs9IC1ETk9OQkxPQ0tfTU9ERV9QUk9DRVNTCitlbmRpZgorCitpZmVxICgkKEJPQVJEX1VTRV9NRVRBREFUQUJVRkZFUlRZUEUpLCB0cnVlKQorTE9DQUxfQ0ZMQUdTICs9IC1EVVNFX01FVEFEQVRBQlVGRkVSVFlQRQorZW5kaWYKKworTE9DQUxfQVJNX01PREUgOj0gYXJtCisKK0xPQ0FMX1NUQVRJQ19MSUJSQVJJRVMgOj0gbGliU0VDX09NWF9WZW5jIGxpYnNlY29zYWwgbGlic2VjYmFzZWNvbXBvbmVudCBcCisJbGlic3djb252ZXJ0ZXIgbGlic2VjbWZjYXBpCitMT0NBTF9TSEFSRURfTElCUkFSSUVTIDo9IGxpYmMgbGliZGwgbGliY3V0aWxzIGxpYnV0aWxzIGxpYnVpIFwKKwlsaWJTRUNfT01YX1Jlc291cmNlbWFuYWdlciBsaWJjc2MKKworTE9DQUxfQ19JTkNMVURFUyA6PSAkKFNFQ19PTVhfSU5DKS9raHJvbm9zIFwKKwkkKFNFQ19PTVhfSU5DKS9zZWMgXAorCSQoU0VDX09NWF9UT1ApL29zYWwgXAorCSQoU0VDX09NWF9UT1ApL2NvcmUgXAorCSQoU0VDX09NWF9DT01QT05FTlQpL2NvbW1vbiBcCisJJChTRUNfT01YX0NPTVBPTkVOVCkvdmlkZW8vZW5jIFwKKyAgICAkKFRBUkdFVF9PVVRfSEVBREVSUykvJChTRUNfQ09QWV9IRUFERVJTX1RPKQorCitpbmNsdWRlICQoQlVJTERfU0hBUkVEX0xJQlJBUlkpCmRpZmYgLS1naXQgYS9leHlub3M0L211bHRpbWVkaWEvb3Blbm1heC9zZWNfb214L2NvbXBvbmVudC92aWRlby9lbmMvbXBlZzQvU0VDX09NWF9NcGVnNGVuYy5jIGIvZXh5bm9zNC9tdWx0aW1lZGlhL29wZW5tYXgvc2VjX29teC9jb21wb25lbnQvdmlkZW8vZW5jL21wZWc0L1NFQ19PTVhfTXBlZzRlbmMuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xZmNjOTBlCi0tLSAvZGV2L251bGwKKysrIGIvZXh5bm9zNC9tdWx0aW1lZGlhL29wZW5tYXgvc2VjX29teC9jb21wb25lbnQvdmlkZW8vZW5jL21wZWc0L1NFQ19PTVhfTXBlZzRlbmMuYwpAQCAtMCwwICsxLDE4MDMgQEAKKy8qCisgKgorICogQ29weXJpZ2h0IDIwMTAgU2Ftc3VuZyBFbGVjdHJvbmljcyBTLkxTSSBDby4gTFRECisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKy8qCisgKiBAZmlsZSAgICAgICAgU0VDX09NWF9NcGVnNGVuYy5jCisgKiBAYnJpZWYKKyAqIEBhdXRob3IgICAgICBZdW5qaSBLaW0gKHl1bmppLmtpbUBzYW1zdW5nLmNvbSkKKyAqIEB2ZXJzaW9uICAgICAxLjEuMAorICogQGhpc3RvcnkKKyAqICAgMjAxMC43LjE1IDogQ3JlYXRlCisgKi8KKworCisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlIDxzdGRsaWIuaD4KKyNpbmNsdWRlIDxzdHJpbmcuaD4KKworI2luY2x1ZGUgIlNFQ19PTVhfTWFjcm9zLmgiCisjaW5jbHVkZSAiU0VDX09NWF9CYXNlY29tcG9uZW50LmgiCisjaW5jbHVkZSAiU0VDX09NWF9CYXNlcG9ydC5oIgorI2luY2x1ZGUgIlNFQ19PTVhfVmVuYy5oIgorI2luY2x1ZGUgIlNFQ19PU0FMX1NlbWFwaG9yZS5oIgorI2luY2x1ZGUgIlNFQ19PU0FMX1RocmVhZC5oIgorI2luY2x1ZGUgIlNFQ19PU0FMX0VUQy5oIgorI2luY2x1ZGUgIlNFQ19PU0FMX0FuZHJvaWQuaCIKKyNpbmNsdWRlICJsaWJyYXJ5X3JlZ2lzdGVyLmgiCisjaW5jbHVkZSAiU0VDX09NWF9NcGVnNGVuYy5oIgorI2luY2x1ZGUgIlNzYlNpcE1mY0FwaS5oIgorI2luY2x1ZGUgImNzYy5oIgorCisjdW5kZWYgIFNFQ19MT0dfVEFHCisjZGVmaW5lIFNFQ19MT0dfVEFHICAgICJTRUNfTVBFRzRfRU5DIgorI2RlZmluZSBTRUNfTE9HX09GRgorI2luY2x1ZGUgIlNFQ19PU0FMX0xvZy5oIgorCisKKy8qIE1QRUc0IEVuY29kZXIgU3VwcG9ydGVkIExldmVscyAmIHByb2ZpbGVzICovCitTRUNfT01YX1ZJREVPX1BST0ZJTEVMRVZFTCBzdXBwb3J0ZWRNUEVHNFByb2ZpbGVMZXZlbHNbXSA9eworICAgIHtPTVhfVklERU9fTVBFRzRQcm9maWxlU2ltcGxlLCBPTVhfVklERU9fTVBFRzRMZXZlbDB9LAorICAgIHtPTVhfVklERU9fTVBFRzRQcm9maWxlU2ltcGxlLCBPTVhfVklERU9fTVBFRzRMZXZlbDBifSwKKyAgICB7T01YX1ZJREVPX01QRUc0UHJvZmlsZVNpbXBsZSwgT01YX1ZJREVPX01QRUc0TGV2ZWwxfSwKKyAgICB7T01YX1ZJREVPX01QRUc0UHJvZmlsZVNpbXBsZSwgT01YX1ZJREVPX01QRUc0TGV2ZWwyfSwKKyAgICB7T01YX1ZJREVPX01QRUc0UHJvZmlsZVNpbXBsZSwgT01YX1ZJREVPX01QRUc0TGV2ZWwzfSwKKyAgICB7T01YX1ZJREVPX01QRUc0UHJvZmlsZVNpbXBsZSwgT01YX1ZJREVPX01QRUc0TGV2ZWw0fSwKKyAgICB7T01YX1ZJREVPX01QRUc0UHJvZmlsZVNpbXBsZSwgT01YX1ZJREVPX01QRUc0TGV2ZWw0YX0sCisgICAge09NWF9WSURFT19NUEVHNFByb2ZpbGVTaW1wbGUsIE9NWF9WSURFT19NUEVHNExldmVsNX0sCisgICAge09NWF9WSURFT19NUEVHNFByb2ZpbGVBZHZhbmNlZFNpbXBsZSwgT01YX1ZJREVPX01QRUc0TGV2ZWwwfSwKKyAgICB7T01YX1ZJREVPX01QRUc0UHJvZmlsZUFkdmFuY2VkU2ltcGxlLCBPTVhfVklERU9fTVBFRzRMZXZlbDBifSwKKyAgICB7T01YX1ZJREVPX01QRUc0UHJvZmlsZUFkdmFuY2VkU2ltcGxlLCBPTVhfVklERU9fTVBFRzRMZXZlbDF9LAorICAgIHtPTVhfVklERU9fTVBFRzRQcm9maWxlQWR2YW5jZWRTaW1wbGUsIE9NWF9WSURFT19NUEVHNExldmVsMn0sCisgICAge09NWF9WSURFT19NUEVHNFByb2ZpbGVBZHZhbmNlZFNpbXBsZSwgT01YX1ZJREVPX01QRUc0TGV2ZWwzfSwKKyAgICB7T01YX1ZJREVPX01QRUc0UHJvZmlsZUFkdmFuY2VkU2ltcGxlLCBPTVhfVklERU9fTVBFRzRMZXZlbDR9LAorICAgIHtPTVhfVklERU9fTVBFRzRQcm9maWxlQWR2YW5jZWRTaW1wbGUsIE9NWF9WSURFT19NUEVHNExldmVsNGF9LAorICAgIHtPTVhfVklERU9fTVBFRzRQcm9maWxlQWR2YW5jZWRTaW1wbGUsIE9NWF9WSURFT19NUEVHNExldmVsNX19OworCisvKiBILjI2MyBFbmNvZGVyIFN1cHBvcnRlZCBMZXZlbHMgJiBwcm9maWxlcyAqLworU0VDX09NWF9WSURFT19QUk9GSUxFTEVWRUwgc3VwcG9ydGVkSDI2M1Byb2ZpbGVMZXZlbHNbXSA9IHsKKyAgICB7T01YX1ZJREVPX0gyNjNQcm9maWxlQmFzZWxpbmUsIE9NWF9WSURFT19IMjYzTGV2ZWwxMH0sCisgICAge09NWF9WSURFT19IMjYzUHJvZmlsZUJhc2VsaW5lLCBPTVhfVklERU9fSDI2M0xldmVsMjB9LAorICAgIHtPTVhfVklERU9fSDI2M1Byb2ZpbGVCYXNlbGluZSwgT01YX1ZJREVPX0gyNjNMZXZlbDMwfSwKKyAgICB7T01YX1ZJREVPX0gyNjNQcm9maWxlQmFzZWxpbmUsIE9NWF9WSURFT19IMjYzTGV2ZWw0MH0sCisgICAge09NWF9WSURFT19IMjYzUHJvZmlsZUJhc2VsaW5lLCBPTVhfVklERU9fSDI2M0xldmVsNDV9LAorICAgIHtPTVhfVklERU9fSDI2M1Byb2ZpbGVCYXNlbGluZSwgT01YX1ZJREVPX0gyNjNMZXZlbDUwfSwKKyAgICB7T01YX1ZJREVPX0gyNjNQcm9maWxlQmFzZWxpbmUsIE9NWF9WSURFT19IMjYzTGV2ZWw2MH0sCisgICAge09NWF9WSURFT19IMjYzUHJvZmlsZUJhc2VsaW5lLCBPTVhfVklERU9fSDI2M0xldmVsNzB9fTsKKworT01YX1UzMiBPTVhNcGVnNFByb2ZpbGVUb01GQ1Byb2ZpbGUoT01YX1ZJREVPX01QRUc0UFJPRklMRVRZUEUgcHJvZmlsZSkKK3sKKyAgICBPTVhfVTMyIHJldDsKKworICAgIHN3aXRjaCAocHJvZmlsZSkgeworICAgIGNhc2UgT01YX1ZJREVPX01QRUc0UHJvZmlsZVNpbXBsZToKKyAgICAgICAgcmV0ID0gMDsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBPTVhfVklERU9fTVBFRzRQcm9maWxlQWR2YW5jZWRTaW1wbGU6CisgICAgICAgIHJldCA9IDE7CisgICAgICAgIGJyZWFrOworICAgIGRlZmF1bHQ6CisgICAgICAgIHJldCA9IDA7CisgICAgfTsKKworICAgIHJldHVybiByZXQ7Cit9CitPTVhfVTMyIE9NWE1wZWc0TGV2ZWxUb01GQ0xldmVsKE9NWF9WSURFT19NUEVHNExFVkVMVFlQRSBsZXZlbCkKK3sKKyAgICBPTVhfVTMyIHJldDsKKworICAgIHN3aXRjaCAobGV2ZWwpIHsKKyAgICBjYXNlIE9NWF9WSURFT19NUEVHNExldmVsMDoKKyAgICAgICAgcmV0ID0gMDsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBPTVhfVklERU9fTVBFRzRMZXZlbDBiOgorICAgICAgICByZXQgPSA5OworICAgICAgICBicmVhazsKKyAgICBjYXNlIE9NWF9WSURFT19NUEVHNExldmVsMToKKyAgICAgICAgcmV0ID0gMTsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBPTVhfVklERU9fTVBFRzRMZXZlbDI6CisgICAgICAgIHJldCA9IDI7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgT01YX1ZJREVPX01QRUc0TGV2ZWwzOgorICAgICAgICByZXQgPSAzOworICAgICAgICBicmVhazsKKyAgICBjYXNlIE9NWF9WSURFT19NUEVHNExldmVsNDoKKyAgICBjYXNlIE9NWF9WSURFT19NUEVHNExldmVsNGE6CisgICAgICAgIHJldCA9IDQ7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgT01YX1ZJREVPX01QRUc0TGV2ZWw1OgorICAgICAgICByZXQgPSA1OworICAgICAgICBicmVhazsKKyAgICBkZWZhdWx0OgorICAgICAgICByZXQgPSAwOworICAgIH07CisKKyAgICByZXR1cm4gcmV0OworfQorCit2b2lkIE1wZWc0UHJpbnRQYXJhbXMoU1NCU0lQX01GQ19FTkNfTVBFRzRfUEFSQU0gKnBNcGVnNFBhcmFtKQoreworICAgIFNFQ19PU0FMX0xvZyhTRUNfTE9HX1RSQUNFLCAiU291cmNlV2lkdGggICAgICAgICAgICAgOiAlZFxuIiwgcE1wZWc0UGFyYW0tPlNvdXJjZVdpZHRoKTsKKyAgICBTRUNfT1NBTF9Mb2coU0VDX0xPR19UUkFDRSwgIlNvdXJjZUhlaWdodCAgICAgICAgICAgIDogJWRcbiIsIHBNcGVnNFBhcmFtLT5Tb3VyY2VIZWlnaHQpOworICAgIFNFQ19PU0FMX0xvZyhTRUNfTE9HX1RSQUNFLCAiSURSUGVyaW9kICAgICAgICAgICAgICAgOiAlZFxuIiwgcE1wZWc0UGFyYW0tPklEUlBlcmlvZCk7CisgICAgU0VDX09TQUxfTG9nKFNFQ19MT0dfVFJBQ0UsICJTbGljZU1vZGUgICAgICAgICAgICAgICA6ICVkXG4iLCBwTXBlZzRQYXJhbS0+U2xpY2VNb2RlKTsKKyNpZmRlZiBVU0VfU0xJQ0VfT1VUUFVUX01PREUKKyAgICBTRUNfT1NBTF9Mb2coU0VDX0xPR19UUkFDRSwgIk91dHB1dE1vZGUgICAgICAgICAgICAgIDogJWRcbiIsIHBNcGVnNFBhcmFtLT5PdXRwdXRNb2RlKTsKKyNlbmRpZgorICAgIFNFQ19PU0FMX0xvZyhTRUNfTE9HX1RSQUNFLCAiUmFuZG9tSW50cmFNQlJlZnJlc2ggICAgOiAlZFxuIiwgcE1wZWc0UGFyYW0tPlJhbmRvbUludHJhTUJSZWZyZXNoKTsKKyAgICBTRUNfT1NBTF9Mb2coU0VDX0xPR19UUkFDRSwgIkVuYWJsZUZSTVJhdGVDb250cm9sICAgIDogJWRcbiIsIHBNcGVnNFBhcmFtLT5FbmFibGVGUk1SYXRlQ29udHJvbCk7CisgICAgU0VDX09TQUxfTG9nKFNFQ19MT0dfVFJBQ0UsICJCaXRyYXRlICAgICAgICAgICAgICAgICA6ICVkXG4iLCBwTXBlZzRQYXJhbS0+Qml0cmF0ZSk7CisgICAgU0VDX09TQUxfTG9nKFNFQ19MT0dfVFJBQ0UsICJGcmFtZVFwICAgICAgICAgICAgICAgICA6ICVkXG4iLCBwTXBlZzRQYXJhbS0+RnJhbWVRcCk7CisgICAgU0VDX09TQUxfTG9nKFNFQ19MT0dfVFJBQ0UsICJGcmFtZVFwX1AgICAgICAgICAgICAgICA6ICVkXG4iLCBwTXBlZzRQYXJhbS0+RnJhbWVRcF9QKTsKKyAgICBTRUNfT1NBTF9Mb2coU0VDX0xPR19UUkFDRSwgIlFTQ29kZU1heCAgICAgICAgICAgICAgIDogJWRcbiIsIHBNcGVnNFBhcmFtLT5RU0NvZGVNYXgpOworICAgIFNFQ19PU0FMX0xvZyhTRUNfTE9HX1RSQUNFLCAiUVNDb2RlTWluICAgICAgICAgICAgICAgOiAlZFxuIiwgcE1wZWc0UGFyYW0tPlFTQ29kZU1pbik7CisgICAgU0VDX09TQUxfTG9nKFNFQ19MT0dfVFJBQ0UsICJDQlJQZXJpb2RSZiAgICAgICAgICAgICA6ICVkXG4iLCBwTXBlZzRQYXJhbS0+Q0JSUGVyaW9kUmYpOworICAgIFNFQ19PU0FMX0xvZyhTRUNfTE9HX1RSQUNFLCAiUGFkQ29udHJvbE9uICAgICAgICAgICAgOiAlZFxuIiwgcE1wZWc0UGFyYW0tPlBhZENvbnRyb2xPbik7CisgICAgU0VDX09TQUxfTG9nKFNFQ19MT0dfVFJBQ0UsICJMdW1hUGFkVmFsICAgICAgICAgICAgICA6ICVkXG4iLCBwTXBlZzRQYXJhbS0+THVtYVBhZFZhbCk7CisgICAgU0VDX09TQUxfTG9nKFNFQ19MT0dfVFJBQ0UsICJDYlBhZFZhbCAgICAgICAgICAgICAgICA6ICVkXG4iLCBwTXBlZzRQYXJhbS0+Q2JQYWRWYWwpOworICAgIFNFQ19PU0FMX0xvZyhTRUNfTE9HX1RSQUNFLCAiQ3JQYWRWYWwgICAgICAgICAgICAgICAgOiAlZFxuIiwgcE1wZWc0UGFyYW0tPkNyUGFkVmFsKTsKKyAgICBTRUNfT1NBTF9Mb2coU0VDX0xPR19UUkFDRSwgIkZyYW1lTWFwICAgICAgICAgICAgICAgIDogJWRcbiIsIHBNcGVnNFBhcmFtLT5GcmFtZU1hcCk7CisKKyAgICAvKiBNUEVHNCBzcGVjaWZpYyBwYXJhbWV0ZXJzICovCisgICAgU0VDX09TQUxfTG9nKFNFQ19MT0dfVFJBQ0UsICJQcm9maWxlSURDICAgICAgICAgICAgICA6ICVkXG4iLCBwTXBlZzRQYXJhbS0+UHJvZmlsZUlEQyk7CisgICAgU0VDX09TQUxfTG9nKFNFQ19MT0dfVFJBQ0UsICJMZXZlbElEQyAgICAgICAgICAgICAgICA6ICVkXG4iLCBwTXBlZzRQYXJhbS0+TGV2ZWxJREMpOworICAgIFNFQ19PU0FMX0xvZyhTRUNfTE9HX1RSQUNFLCAiRnJhbWVRcF9CICAgICAgICAgICAgICAgOiAlZFxuIiwgcE1wZWc0UGFyYW0tPkZyYW1lUXBfQik7CisgICAgU0VDX09TQUxfTG9nKFNFQ19MT0dfVFJBQ0UsICJUaW1lSW5jcmVhbWVudFJlcyAgICAgICA6ICVkXG4iLCBwTXBlZzRQYXJhbS0+VGltZUluY3JlYW1lbnRSZXMpOworICAgIFNFQ19PU0FMX0xvZyhTRUNfTE9HX1RSQUNFLCAiVm9wVGltZUluY3JlYW1lbnQgICAgICAgOiAlZFxuIiwgcE1wZWc0UGFyYW0tPlZvcFRpbWVJbmNyZWFtZW50KTsKKyAgICBTRUNfT1NBTF9Mb2coU0VDX0xPR19UUkFDRSwgIlNsaWNlQXJndW1lbnQgICAgICAgICAgIDogJWRcbiIsIHBNcGVnNFBhcmFtLT5TbGljZUFyZ3VtZW50KTsKKyAgICBTRUNfT1NBTF9Mb2coU0VDX0xPR19UUkFDRSwgIk51bWJlckJGcmFtZXMgICAgICAgICAgIDogJWRcbiIsIHBNcGVnNFBhcmFtLT5OdW1iZXJCRnJhbWVzKTsKKyAgICBTRUNfT1NBTF9Mb2coU0VDX0xPR19UUkFDRSwgIkRpc2FibGVRcGVsTUUgICAgICAgICAgIDogJWRcbiIsIHBNcGVnNFBhcmFtLT5EaXNhYmxlUXBlbE1FKTsKK30KKwordm9pZCBIMjYzUHJpbnRQYXJhbXMoU1NCU0lQX01GQ19FTkNfSDI2M19QQVJBTSAqcEgyNjNQYXJhbSkKK3sKKyAgICBTRUNfT1NBTF9Mb2coU0VDX0xPR19UUkFDRSwgIlNvdXJjZVdpZHRoICAgICAgICAgICAgIDogJWRcbiIsIHBIMjYzUGFyYW0tPlNvdXJjZVdpZHRoKTsKKyAgICBTRUNfT1NBTF9Mb2coU0VDX0xPR19UUkFDRSwgIlNvdXJjZUhlaWdodCAgICAgICAgICAgIDogJWRcbiIsIHBIMjYzUGFyYW0tPlNvdXJjZUhlaWdodCk7CisgICAgU0VDX09TQUxfTG9nKFNFQ19MT0dfVFJBQ0UsICJJRFJQZXJpb2QgICAgICAgICAgICAgICA6ICVkXG4iLCBwSDI2M1BhcmFtLT5JRFJQZXJpb2QpOworICAgIFNFQ19PU0FMX0xvZyhTRUNfTE9HX1RSQUNFLCAiU2xpY2VNb2RlICAgICAgICAgICAgICAgOiAlZFxuIiwgcEgyNjNQYXJhbS0+U2xpY2VNb2RlKTsKKyAgICBTRUNfT1NBTF9Mb2coU0VDX0xPR19UUkFDRSwgIlJhbmRvbUludHJhTUJSZWZyZXNoICAgIDogJWRcbiIsIHBIMjYzUGFyYW0tPlJhbmRvbUludHJhTUJSZWZyZXNoKTsKKyAgICBTRUNfT1NBTF9Mb2coU0VDX0xPR19UUkFDRSwgIkVuYWJsZUZSTVJhdGVDb250cm9sICAgIDogJWRcbiIsIHBIMjYzUGFyYW0tPkVuYWJsZUZSTVJhdGVDb250cm9sKTsKKyAgICBTRUNfT1NBTF9Mb2coU0VDX0xPR19UUkFDRSwgIkJpdHJhdGUgICAgICAgICAgICAgICAgIDogJWRcbiIsIHBIMjYzUGFyYW0tPkJpdHJhdGUpOworICAgIFNFQ19PU0FMX0xvZyhTRUNfTE9HX1RSQUNFLCAiRnJhbWVRcCAgICAgICAgICAgICAgICAgOiAlZFxuIiwgcEgyNjNQYXJhbS0+RnJhbWVRcCk7CisgICAgU0VDX09TQUxfTG9nKFNFQ19MT0dfVFJBQ0UsICJGcmFtZVFwX1AgICAgICAgICAgICAgICA6ICVkXG4iLCBwSDI2M1BhcmFtLT5GcmFtZVFwX1ApOworICAgIFNFQ19PU0FMX0xvZyhTRUNfTE9HX1RSQUNFLCAiUVNDb2RlTWF4ICAgICAgICAgICAgICAgOiAlZFxuIiwgcEgyNjNQYXJhbS0+UVNDb2RlTWF4KTsKKyAgICBTRUNfT1NBTF9Mb2coU0VDX0xPR19UUkFDRSwgIlFTQ29kZU1pbiAgICAgICAgICAgICAgIDogJWRcbiIsIHBIMjYzUGFyYW0tPlFTQ29kZU1pbik7CisgICAgU0VDX09TQUxfTG9nKFNFQ19MT0dfVFJBQ0UsICJDQlJQZXJpb2RSZiAgICAgICAgICAgICA6ICVkXG4iLCBwSDI2M1BhcmFtLT5DQlJQZXJpb2RSZik7CisgICAgU0VDX09TQUxfTG9nKFNFQ19MT0dfVFJBQ0UsICJQYWRDb250cm9sT24gICAgICAgICAgICA6ICVkXG4iLCBwSDI2M1BhcmFtLT5QYWRDb250cm9sT24pOworICAgIFNFQ19PU0FMX0xvZyhTRUNfTE9HX1RSQUNFLCAiTHVtYVBhZFZhbCAgICAgICAgICAgICAgOiAlZFxuIiwgcEgyNjNQYXJhbS0+THVtYVBhZFZhbCk7CisgICAgU0VDX09TQUxfTG9nKFNFQ19MT0dfVFJBQ0UsICJDYlBhZFZhbCAgICAgICAgICAgICAgICA6ICVkXG4iLCBwSDI2M1BhcmFtLT5DYlBhZFZhbCk7CisgICAgU0VDX09TQUxfTG9nKFNFQ19MT0dfVFJBQ0UsICJDclBhZFZhbCAgICAgICAgICAgICAgICA6ICVkXG4iLCBwSDI2M1BhcmFtLT5DclBhZFZhbCk7CisgICAgU0VDX09TQUxfTG9nKFNFQ19MT0dfVFJBQ0UsICJGcmFtZU1hcCAgICAgICAgICAgICAgICA6ICVkXG4iLCBwSDI2M1BhcmFtLT5GcmFtZU1hcCk7CisKKyAgICAvKiBILjI2MyBzcGVjaWZpYyBwYXJhbWV0ZXJzICovCisgICAgU0VDX09TQUxfTG9nKFNFQ19MT0dfVFJBQ0UsICJGcmFtZVJhdGUgICAgICAgICAgICAgICA6ICVkXG4iLCBwSDI2M1BhcmFtLT5GcmFtZVJhdGUpOworfQorCit2b2lkIFNldF9NcGVnNEVuY19QYXJhbShTU0JTSVBfTUZDX0VOQ19NUEVHNF9QQVJBTSAqcE1wZWc0UGFyYW0sIFNFQ19PTVhfQkFTRUNPTVBPTkVOVCAqcFNFQ0NvbXBvbmVudCkKK3sKKyAgICBTRUNfT01YX0JBU0VQT1JUICAgICpwU0VDSW5wdXRQb3J0ID0gTlVMTDsKKyAgICBTRUNfT01YX0JBU0VQT1JUICAgICpwU0VDT3V0cHV0UG9ydCA9IE5VTEw7CisgICAgU0VDX09NWF9WSURFT0VOQ19DT01QT05FTlQgKnBWaWRlb0VuYyA9IE5VTEw7CisgICAgU0VDX01QRUc0RU5DX0hBTkRMRSAqcE1wZWc0RW5jID0gTlVMTDsKKworICAgIHBWaWRlb0VuYyA9IChTRUNfT01YX1ZJREVPRU5DX0NPTVBPTkVOVCAqKXBTRUNDb21wb25lbnQtPmhDb21wb25lbnRIYW5kbGU7CisgICAgcE1wZWc0RW5jID0gKFNFQ19NUEVHNEVOQ19IQU5ETEUgKikoKFNFQ19PTVhfVklERU9FTkNfQ09NUE9ORU5UICopcFNFQ0NvbXBvbmVudC0+aENvbXBvbmVudEhhbmRsZSktPmhDb2RlY0hhbmRsZTsKKyAgICBwU0VDSW5wdXRQb3J0ID0gJnBTRUNDb21wb25lbnQtPnBTRUNQb3J0W0lOUFVUX1BPUlRfSU5ERVhdOworICAgIHBTRUNPdXRwdXRQb3J0ID0gJnBTRUNDb21wb25lbnQtPnBTRUNQb3J0W09VVFBVVF9QT1JUX0lOREVYXTsKKworICAgIHBNcGVnNFBhcmFtLT5jb2RlY1R5cGUgICAgICAgICAgICA9IE1QRUc0X0VOQzsKKyAgICBwTXBlZzRQYXJhbS0+U291cmNlV2lkdGggICAgICAgICAgPSBwU0VDT3V0cHV0UG9ydC0+cG9ydERlZmluaXRpb24uZm9ybWF0LnZpZGVvLm5GcmFtZVdpZHRoOworICAgIHBNcGVnNFBhcmFtLT5Tb3VyY2VIZWlnaHQgICAgICAgICA9IHBTRUNPdXRwdXRQb3J0LT5wb3J0RGVmaW5pdGlvbi5mb3JtYXQudmlkZW8ubkZyYW1lSGVpZ2h0OworICAgIHBNcGVnNFBhcmFtLT5JRFJQZXJpb2QgICAgICAgICAgICA9IHBNcGVnNEVuYy0+bXBlZzRDb21wb25lbnRbT1VUUFVUX1BPUlRfSU5ERVhdLm5QRnJhbWVzICsgMTsKKyAgICBwTXBlZzRQYXJhbS0+U2xpY2VNb2RlICAgICAgICAgICAgPSAwOworI2lmZGVmIFVTRV9TTElDRV9PVVRQVVRfTU9ERQorICAgIHBNcGVnNFBhcmFtLT5PdXRwdXRNb2RlICAgICAgICAgICA9IEZSQU1FOworI2VuZGlmCisgICAgcE1wZWc0UGFyYW0tPlJhbmRvbUludHJhTUJSZWZyZXNoID0gMDsKKyAgICBwTXBlZzRQYXJhbS0+Qml0cmF0ZSAgICAgICAgICAgICAgPSBwU0VDT3V0cHV0UG9ydC0+cG9ydERlZmluaXRpb24uZm9ybWF0LnZpZGVvLm5CaXRyYXRlOworICAgIHBNcGVnNFBhcmFtLT5RU0NvZGVNYXggICAgICAgICAgICA9IDMwOworICAgIHBNcGVnNFBhcmFtLT5RU0NvZGVNaW4gICAgICAgICAgICA9IDEwOworICAgIHBNcGVnNFBhcmFtLT5QYWRDb250cm9sT24gICAgICAgICA9IDA7ICAgIC8qIDA6IFVzZSBib3VuZGFyeSBwaXhlbCwgMTogVXNlIHRoZSBiZWxvdyBzZXR0aW5nIHZhbHVlICovCisgICAgcE1wZWc0UGFyYW0tPkx1bWFQYWRWYWwgICAgICAgICAgID0gMDsKKyAgICBwTXBlZzRQYXJhbS0+Q2JQYWRWYWwgICAgICAgICAgICAgPSAwOworICAgIHBNcGVnNFBhcmFtLT5DclBhZFZhbCAgICAgICAgICAgICA9IDA7CisKKyAgICBwTXBlZzRQYXJhbS0+UHJvZmlsZUlEQyAgICAgICAgICAgPSBPTVhNcGVnNFByb2ZpbGVUb01GQ1Byb2ZpbGUocE1wZWc0RW5jLT5tcGVnNENvbXBvbmVudFtPVVRQVVRfUE9SVF9JTkRFWF0uZVByb2ZpbGUpOworICAgIHBNcGVnNFBhcmFtLT5MZXZlbElEQyAgICAgICAgICAgICA9IE9NWE1wZWc0TGV2ZWxUb01GQ0xldmVsKHBNcGVnNEVuYy0+bXBlZzRDb21wb25lbnRbT1VUUFVUX1BPUlRfSU5ERVhdLmVMZXZlbCk7CisgICAgcE1wZWc0UGFyYW0tPlRpbWVJbmNyZWFtZW50UmVzICAgID0gKHBTRUNJbnB1dFBvcnQtPnBvcnREZWZpbml0aW9uLmZvcm1hdC52aWRlby54RnJhbWVyYXRlKSA+PiAxNjsKKyAgICBwTXBlZzRQYXJhbS0+Vm9wVGltZUluY3JlYW1lbnQgICAgPSAxOworICAgIHBNcGVnNFBhcmFtLT5TbGljZUFyZ3VtZW50ICAgICAgICA9IDA7ICAgIC8qIE1CIG51bWJlciBvciBieXRlIG51bWJlciAqLworICAgIHBNcGVnNFBhcmFtLT5OdW1iZXJCRnJhbWVzICAgICAgICA9IDA7ICAgIC8qIDAobm90IHVzZWQpIH4gMiAqLworICAgIHBNcGVnNFBhcmFtLT5EaXNhYmxlUXBlbE1FICAgICAgICA9IDE7CisKKyAgICBwTXBlZzRQYXJhbS0+RnJhbWVRcCAgICAgICAgICAgICAgPSBwVmlkZW9FbmMtPnF1YW50aXphdGlvbi5uUXBJOworICAgIHBNcGVnNFBhcmFtLT5GcmFtZVFwX1AgICAgICAgICAgICA9IHBWaWRlb0VuYy0+cXVhbnRpemF0aW9uLm5RcFA7CisgICAgcE1wZWc0UGFyYW0tPkZyYW1lUXBfQiAgICAgICAgICAgID0gcFZpZGVvRW5jLT5xdWFudGl6YXRpb24ublFwQjsKKworICAgIFNFQ19PU0FMX0xvZyhTRUNfTE9HX1RSQUNFLCAicFZpZGVvRW5jLT5lQ29udHJvbFJhdGVbT1VUUFVUX1BPUlRfSU5ERVhdOiAweCV4IiwgcFZpZGVvRW5jLT5lQ29udHJvbFJhdGVbT1VUUFVUX1BPUlRfSU5ERVhdKTsKKyAgICBzd2l0Y2ggKHBWaWRlb0VuYy0+ZUNvbnRyb2xSYXRlW09VVFBVVF9QT1JUX0lOREVYXSkgeworICAgIGNhc2UgT01YX1ZpZGVvX0NvbnRyb2xSYXRlVmFyaWFibGU6CisgICAgICAgIFNFQ19PU0FMX0xvZyhTRUNfTE9HX1RSQUNFLCAiVmlkZW8gRW5jb2RlIFZCUiIpOworICAgICAgICBwTXBlZzRQYXJhbS0+RW5hYmxlRlJNUmF0ZUNvbnRyb2wgPSAwOyAgICAgICAgLy8gMDogRGlzYWJsZSwgMTogRnJhbWUgbGV2ZWwgUkMKKyAgICAgICAgcE1wZWc0UGFyYW0tPkNCUlBlcmlvZFJmICAgICAgICAgID0gMTAwOworICAgICAgICBicmVhazsKKyAgICBjYXNlIE9NWF9WaWRlb19Db250cm9sUmF0ZUNvbnN0YW50OgorICAgICAgICBTRUNfT1NBTF9Mb2coU0VDX0xPR19UUkFDRSwgIlZpZGVvIEVuY29kZSBDQlIiKTsKKyAgICAgICAgcE1wZWc0UGFyYW0tPkVuYWJsZUZSTVJhdGVDb250cm9sID0gMTsgICAgICAgIC8vIDA6IERpc2FibGUsIDE6IEZyYW1lIGxldmVsIFJDCisgICAgICAgIHBNcGVnNFBhcmFtLT5DQlJQZXJpb2RSZiAgICAgICAgICA9IDEwOworICAgICAgICBicmVhazsKKyAgICBjYXNlIE9NWF9WaWRlb19Db250cm9sUmF0ZURpc2FibGU6CisgICAgZGVmYXVsdDogLy9BbmRyb2lkIGRlZmF1bHQKKyAgICAgICAgU0VDX09TQUxfTG9nKFNFQ19MT0dfVFJBQ0UsICJWaWRlbyBFbmNvZGUgVkJSIik7CisgICAgICAgIHBNcGVnNFBhcmFtLT5FbmFibGVGUk1SYXRlQ29udHJvbCA9IDA7CisgICAgICAgIHBNcGVnNFBhcmFtLT5DQlJQZXJpb2RSZiAgICAgICAgICA9IDEwMDsKKyAgICAgICAgYnJlYWs7CisgICAgfQorCisgICAgc3dpdGNoICgoU0VDX09NWF9DT0xPUl9GT1JNQVRUWVBFKXBTRUNJbnB1dFBvcnQtPnBvcnREZWZpbml0aW9uLmZvcm1hdC52aWRlby5lQ29sb3JGb3JtYXQpIHsKKyAgICBjYXNlIE9NWF9TRUNfQ09MT1JfRm9ybWF0TlYxMkxQaHlzaWNhbEFkZHJlc3M6CisgICAgY2FzZSBPTVhfU0VDX0NPTE9SX0Zvcm1hdE5WMTJMVmlydHVhbEFkZHJlc3M6CisgICAgY2FzZSBPTVhfQ09MT1JfRm9ybWF0WVVWNDIwU2VtaVBsYW5hcjoKKyAgICBjYXNlIE9NWF9DT0xPUl9Gb3JtYXRZVVY0MjBQbGFuYXI6CisjaWZkZWYgTUVUQURBVEFCVUZGRVJUWVBFCisgICAgY2FzZSBPTVhfQ09MT1JfRm9ybWF0QW5kcm9pZE9wYXF1ZToKKyNlbmRpZgorICAgICAgICBwTXBlZzRQYXJhbS0+RnJhbWVNYXAgPSBOVjEyX0xJTkVBUjsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBPTVhfU0VDX0NPTE9SX0Zvcm1hdE5WMTJUUGh5c2ljYWxBZGRyZXNzOgorICAgIGNhc2UgT01YX1NFQ19DT0xPUl9Gb3JtYXROVjEyVGlsZWQ6CisgICAgICAgIHBNcGVnNFBhcmFtLT5GcmFtZU1hcCA9IE5WMTJfVElMRTsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBPTVhfU0VDX0NPTE9SX0Zvcm1hdE5WMjFMUGh5c2ljYWxBZGRyZXNzOgorICAgIGNhc2UgT01YX1NFQ19DT0xPUl9Gb3JtYXROVjIxTGluZWFyOgorICAgICAgICBwTXBlZzRQYXJhbS0+RnJhbWVNYXAgPSBOVjIxX0xJTkVBUjsKKyAgICAgICAgYnJlYWs7CisgICAgZGVmYXVsdDoKKyAgICAgICAgcE1wZWc0UGFyYW0tPkZyYW1lTWFwID0gTlYxMl9USUxFOworICAgICAgICBicmVhazsKKyAgICB9CisKKyAgICBNcGVnNFByaW50UGFyYW1zKHBNcGVnNFBhcmFtKTsKK30KKwordm9pZCBDaGFuZ2VfTXBlZzRFbmNfUGFyYW0oU1NCU0lQX01GQ19FTkNfTVBFRzRfUEFSQU0gKnBNcGVnNFBhcmFtLCBTRUNfT01YX0JBU0VDT01QT05FTlQgKnBTRUNDb21wb25lbnQpCit7CisgICAgU0VDX09NWF9CQVNFUE9SVCAgICAgICAgICAqcFNFQ0lucHV0UG9ydCA9IE5VTEw7CisgICAgU0VDX09NWF9CQVNFUE9SVCAgICAgICAgICAqcFNFQ091dHB1dFBvcnQgPSBOVUxMOworICAgIFNFQ19PTVhfVklERU9FTkNfQ09NUE9ORU5UICpwVmlkZW9FbmMgPSBOVUxMOworICAgIFNFQ19NUEVHNEVOQ19IQU5ETEUgICAgICAgKnBNcGVnNEVuYyA9IE5VTEw7CisKKyAgICBwVmlkZW9FbmMgPSAoU0VDX09NWF9WSURFT0VOQ19DT01QT05FTlQgKilwU0VDQ29tcG9uZW50LT5oQ29tcG9uZW50SGFuZGxlOworICAgIHBNcGVnNEVuYyA9IChTRUNfTVBFRzRFTkNfSEFORExFICopKChTRUNfT01YX1ZJREVPRU5DX0NPTVBPTkVOVCAqKXBTRUNDb21wb25lbnQtPmhDb21wb25lbnRIYW5kbGUpLT5oQ29kZWNIYW5kbGU7CisgICAgcFNFQ0lucHV0UG9ydCA9ICZwU0VDQ29tcG9uZW50LT5wU0VDUG9ydFtJTlBVVF9QT1JUX0lOREVYXTsKKyAgICBwU0VDT3V0cHV0UG9ydCA9ICZwU0VDQ29tcG9uZW50LT5wU0VDUG9ydFtPVVRQVVRfUE9SVF9JTkRFWF07CisKKyAgICBpZiAocFZpZGVvRW5jLT5JbnRyYVJlZnJlc2hWT1AgPT0gT01YX1RSVUUpIHsKKyAgICAgICAgaW50IHNldF9jb25mX0ludHJhUmVmcmVzaFZPUCA9IDE7CisgICAgICAgIFNzYlNpcE1mY0VuY1NldENvbmZpZyhwTXBlZzRFbmMtPmhNRkNNcGVnNEhhbmRsZS5oTUZDSGFuZGxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNRkNfRU5DX1NFVENPTkZfRlJBTUVfVFlQRSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnNldF9jb25mX0ludHJhUmVmcmVzaFZPUCk7CisgICAgICAgIHBWaWRlb0VuYy0+SW50cmFSZWZyZXNoVk9QID0gT01YX0ZBTFNFOworICAgIH0KKworICAgIGlmIChwTXBlZzRQYXJhbS0+SURSUGVyaW9kICE9IChpbnQpcE1wZWc0RW5jLT5tcGVnNENvbXBvbmVudFtPVVRQVVRfUE9SVF9JTkRFWF0ublBGcmFtZXMgKyAxKSB7CisgICAgICAgIGludCBzZXRfY29uZl9JRFJQZXJpb2QgPSBwTXBlZzRFbmMtPm1wZWc0Q29tcG9uZW50W09VVFBVVF9QT1JUX0lOREVYXS5uUEZyYW1lcyArIDE7CisgICAgICAgIFNzYlNpcE1mY0VuY1NldENvbmZpZyhwTXBlZzRFbmMtPmhNRkNNcGVnNEhhbmRsZS5oTUZDSGFuZGxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNRkNfRU5DX1NFVENPTkZfSV9QRVJJT0QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZzZXRfY29uZl9JRFJQZXJpb2QpOworICAgIH0KKyAgICBpZiAocE1wZWc0UGFyYW0tPkJpdHJhdGUgIT0gKGludClwU0VDT3V0cHV0UG9ydC0+cG9ydERlZmluaXRpb24uZm9ybWF0LnZpZGVvLm5CaXRyYXRlKSB7CisgICAgICAgIGludCBzZXRfY29uZl9iaXRyYXRlID0gcFNFQ091dHB1dFBvcnQtPnBvcnREZWZpbml0aW9uLmZvcm1hdC52aWRlby5uQml0cmF0ZTsKKyAgICAgICAgU3NiU2lwTWZjRW5jU2V0Q29uZmlnKHBNcGVnNEVuYy0+aE1GQ01wZWc0SGFuZGxlLmhNRkNIYW5kbGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1GQ19FTkNfU0VUQ09ORl9DSEFOR0VfQklUX1JBVEUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZzZXRfY29uZl9iaXRyYXRlKTsKKyAgICB9CisgICAgaWYgKHBNcGVnNFBhcmFtLT5UaW1lSW5jcmVhbWVudFJlcyAhPSAoaW50KSgocFNFQ091dHB1dFBvcnQtPnBvcnREZWZpbml0aW9uLmZvcm1hdC52aWRlby54RnJhbWVyYXRlKSA+PiAxNikpIHsKKyAgICAgICAgaW50IHNldF9jb25mX2ZyYW1lcmF0ZSA9IChwU0VDSW5wdXRQb3J0LT5wb3J0RGVmaW5pdGlvbi5mb3JtYXQudmlkZW8ueEZyYW1lcmF0ZSkgPj4gMTY7CisgICAgICAgIFNzYlNpcE1mY0VuY1NldENvbmZpZyhwTXBlZzRFbmMtPmhNRkNNcGVnNEhhbmRsZS5oTUZDSGFuZGxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNRkNfRU5DX1NFVENPTkZfQ0hBTkdFX0ZSQU1FX1JBVEUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZzZXRfY29uZl9mcmFtZXJhdGUpOworICAgIH0KKworICAgIFNldF9NcGVnNEVuY19QYXJhbShwTXBlZzRQYXJhbSwgcFNFQ0NvbXBvbmVudCk7CisgICAgTXBlZzRQcmludFBhcmFtcyhwTXBlZzRQYXJhbSk7Cit9CisKK3ZvaWQgU2V0X0gyNjNFbmNfUGFyYW0oU1NCU0lQX01GQ19FTkNfSDI2M19QQVJBTSAqcEgyNjNQYXJhbSwgU0VDX09NWF9CQVNFQ09NUE9ORU5UICpwU0VDQ29tcG9uZW50KQoreworICAgIFNFQ19PTVhfQkFTRVBPUlQgICAgKnBTRUNJbnB1dFBvcnQgPSBOVUxMOworICAgIFNFQ19PTVhfQkFTRVBPUlQgICAgKnBTRUNPdXRwdXRQb3J0ID0gTlVMTDsKKyAgICBTRUNfT01YX1ZJREVPRU5DX0NPTVBPTkVOVCAqcFZpZGVvRW5jID0gTlVMTDsKKyAgICBTRUNfTVBFRzRFTkNfSEFORExFICpwTXBlZzRFbmMgPSBOVUxMOworCisgICAgcFZpZGVvRW5jID0gKFNFQ19PTVhfVklERU9FTkNfQ09NUE9ORU5UICopcFNFQ0NvbXBvbmVudC0+aENvbXBvbmVudEhhbmRsZTsKKyAgICBwTXBlZzRFbmMgPSAoU0VDX01QRUc0RU5DX0hBTkRMRSAqKSgoU0VDX09NWF9WSURFT0VOQ19DT01QT05FTlQgKilwU0VDQ29tcG9uZW50LT5oQ29tcG9uZW50SGFuZGxlKS0+aENvZGVjSGFuZGxlOworICAgIHBTRUNJbnB1dFBvcnQgPSAmcFNFQ0NvbXBvbmVudC0+cFNFQ1BvcnRbSU5QVVRfUE9SVF9JTkRFWF07CisgICAgcFNFQ091dHB1dFBvcnQgPSAmcFNFQ0NvbXBvbmVudC0+cFNFQ1BvcnRbT1VUUFVUX1BPUlRfSU5ERVhdOworCisgICAgcEgyNjNQYXJhbS0+Y29kZWNUeXBlICAgICAgICAgICAgPSBIMjYzX0VOQzsKKyAgICBwSDI2M1BhcmFtLT5Tb3VyY2VXaWR0aCAgICAgICAgICA9IHBTRUNPdXRwdXRQb3J0LT5wb3J0RGVmaW5pdGlvbi5mb3JtYXQudmlkZW8ubkZyYW1lV2lkdGg7CisgICAgcEgyNjNQYXJhbS0+U291cmNlSGVpZ2h0ICAgICAgICAgPSBwU0VDT3V0cHV0UG9ydC0+cG9ydERlZmluaXRpb24uZm9ybWF0LnZpZGVvLm5GcmFtZUhlaWdodDsKKyAgICBwSDI2M1BhcmFtLT5JRFJQZXJpb2QgICAgICAgICAgICA9IHBNcGVnNEVuYy0+aDI2M0NvbXBvbmVudFtPVVRQVVRfUE9SVF9JTkRFWF0ublBGcmFtZXMgKyAxOworICAgIHBIMjYzUGFyYW0tPlNsaWNlTW9kZSAgICAgICAgICAgID0gMDsKKyAgICBwSDI2M1BhcmFtLT5SYW5kb21JbnRyYU1CUmVmcmVzaCA9IDA7CisgICAgcEgyNjNQYXJhbS0+Qml0cmF0ZSAgICAgICAgICAgICAgPSBwU0VDT3V0cHV0UG9ydC0+cG9ydERlZmluaXRpb24uZm9ybWF0LnZpZGVvLm5CaXRyYXRlOworICAgIHBIMjYzUGFyYW0tPlFTQ29kZU1heCAgICAgICAgICAgID0gMzA7CisgICAgcEgyNjNQYXJhbS0+UVNDb2RlTWluICAgICAgICAgICAgPSAxMDsKKyAgICBwSDI2M1BhcmFtLT5QYWRDb250cm9sT24gICAgICAgICA9IDA7ICAgIC8qIDA6IFVzZSBib3VuZGFyeSBwaXhlbCwgMTogVXNlIHRoZSBiZWxvdyBzZXR0aW5nIHZhbHVlICovCisgICAgcEgyNjNQYXJhbS0+THVtYVBhZFZhbCAgICAgICAgICAgPSAwOworICAgIHBIMjYzUGFyYW0tPkNiUGFkVmFsICAgICAgICAgICAgID0gMDsKKyAgICBwSDI2M1BhcmFtLT5DclBhZFZhbCAgICAgICAgICAgICA9IDA7CisKKyAgICBwSDI2M1BhcmFtLT5GcmFtZVJhdGUgICAgICAgICAgICA9IChwU0VDSW5wdXRQb3J0LT5wb3J0RGVmaW5pdGlvbi5mb3JtYXQudmlkZW8ueEZyYW1lcmF0ZSkgPj4gMTY7CisKKyAgICBwSDI2M1BhcmFtLT5GcmFtZVFwICAgICAgICAgICAgICA9IHBWaWRlb0VuYy0+cXVhbnRpemF0aW9uLm5RcEk7CisgICAgcEgyNjNQYXJhbS0+RnJhbWVRcF9QICAgICAgICAgICAgPSBwVmlkZW9FbmMtPnF1YW50aXphdGlvbi5uUXBQOworCisgICAgU0VDX09TQUxfTG9nKFNFQ19MT0dfVFJBQ0UsICJwVmlkZW9FbmMtPmVDb250cm9sUmF0ZVtPVVRQVVRfUE9SVF9JTkRFWF06IDB4JXgiLCBwVmlkZW9FbmMtPmVDb250cm9sUmF0ZVtPVVRQVVRfUE9SVF9JTkRFWF0pOworICAgIHN3aXRjaCAocFZpZGVvRW5jLT5lQ29udHJvbFJhdGVbT1VUUFVUX1BPUlRfSU5ERVhdKSB7CisgICAgY2FzZSBPTVhfVmlkZW9fQ29udHJvbFJhdGVWYXJpYWJsZToKKyAgICAgICAgU0VDX09TQUxfTG9nKFNFQ19MT0dfVFJBQ0UsICJWaWRlbyBFbmNvZGUgVkJSIik7CisgICAgICAgIHBIMjYzUGFyYW0tPkVuYWJsZUZSTVJhdGVDb250cm9sID0gMDsgICAgICAgIC8vIDA6IERpc2FibGUsIDE6IEZyYW1lIGxldmVsIFJDCisgICAgICAgIHBIMjYzUGFyYW0tPkNCUlBlcmlvZFJmICAgICAgICAgID0gMTAwOworICAgICAgICBicmVhazsKKyAgICBjYXNlIE9NWF9WaWRlb19Db250cm9sUmF0ZUNvbnN0YW50OgorICAgICAgICBTRUNfT1NBTF9Mb2coU0VDX0xPR19UUkFDRSwgIlZpZGVvIEVuY29kZSBDQlIiKTsKKyAgICAgICAgcEgyNjNQYXJhbS0+RW5hYmxlRlJNUmF0ZUNvbnRyb2wgPSAxOyAgICAgICAgLy8gMDogRGlzYWJsZSwgMTogRnJhbWUgbGV2ZWwgUkMKKyAgICAgICAgcEgyNjNQYXJhbS0+Q0JSUGVyaW9kUmYgICAgICAgICAgPSAxMDsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBPTVhfVmlkZW9fQ29udHJvbFJhdGVEaXNhYmxlOgorICAgIGRlZmF1bHQ6IC8vQW5kcm9pZCBkZWZhdWx0CisgICAgICAgIFNFQ19PU0FMX0xvZyhTRUNfTE9HX1RSQUNFLCAiVmlkZW8gRW5jb2RlIFZCUiIpOworICAgICAgICBwSDI2M1BhcmFtLT5FbmFibGVGUk1SYXRlQ29udHJvbCA9IDA7CisgICAgICAgIHBIMjYzUGFyYW0tPkNCUlBlcmlvZFJmICAgICAgICAgID0gMTAwOworICAgICAgICBicmVhazsKKyAgICB9CisKKyAgICBzd2l0Y2ggKChTRUNfT01YX0NPTE9SX0ZPUk1BVFRZUEUpcFNFQ0lucHV0UG9ydC0+cG9ydERlZmluaXRpb24uZm9ybWF0LnZpZGVvLmVDb2xvckZvcm1hdCkgeworICAgIGNhc2UgT01YX1NFQ19DT0xPUl9Gb3JtYXROVjEyTFBoeXNpY2FsQWRkcmVzczoKKyAgICBjYXNlIE9NWF9TRUNfQ09MT1JfRm9ybWF0TlYxMkxWaXJ0dWFsQWRkcmVzczoKKyAgICBjYXNlIE9NWF9DT0xPUl9Gb3JtYXRZVVY0MjBTZW1pUGxhbmFyOgorICAgICAgICBwSDI2M1BhcmFtLT5GcmFtZU1hcCA9IE5WMTJfTElORUFSOworICAgICAgICBicmVhazsKKyAgICBjYXNlIE9NWF9TRUNfQ09MT1JfRm9ybWF0TlYxMlRQaHlzaWNhbEFkZHJlc3M6CisgICAgY2FzZSBPTVhfU0VDX0NPTE9SX0Zvcm1hdE5WMTJUaWxlZDoKKyAgICAgICAgcEgyNjNQYXJhbS0+RnJhbWVNYXAgPSBOVjEyX1RJTEU7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgT01YX1NFQ19DT0xPUl9Gb3JtYXROVjIxTFBoeXNpY2FsQWRkcmVzczoKKyAgICBjYXNlIE9NWF9TRUNfQ09MT1JfRm9ybWF0TlYyMUxpbmVhcjoKKyAgICAgICAgcEgyNjNQYXJhbS0+RnJhbWVNYXAgPSBOVjIxX0xJTkVBUjsKKyAgICAgICAgYnJlYWs7CisgICAgZGVmYXVsdDoKKyAgICAgICAgcEgyNjNQYXJhbS0+RnJhbWVNYXAgPSBOVjEyX1RJTEU7CisgICAgICAgIGJyZWFrOworICAgIH0KKworICAgIEgyNjNQcmludFBhcmFtcyhwSDI2M1BhcmFtKTsKK30KKwordm9pZCBDaGFuZ2VfSDI2M0VuY19QYXJhbShTU0JTSVBfTUZDX0VOQ19IMjYzX1BBUkFNICpwSDI2M1BhcmFtLCBTRUNfT01YX0JBU0VDT01QT05FTlQgKnBTRUNDb21wb25lbnQpCit7CisgICAgU0VDX09NWF9CQVNFUE9SVCAgICAgICAgICAqcFNFQ0lucHV0UG9ydCA9IE5VTEw7CisgICAgU0VDX09NWF9CQVNFUE9SVCAgICAgICAgICAqcFNFQ091dHB1dFBvcnQgPSBOVUxMOworICAgIFNFQ19PTVhfVklERU9FTkNfQ09NUE9ORU5UICpwVmlkZW9FbmMgPSBOVUxMOworICAgIFNFQ19NUEVHNEVOQ19IQU5ETEUgICAgICAgKnBNcGVnNEVuYyA9IE5VTEw7CisKKyAgICBwVmlkZW9FbmMgPSAoU0VDX09NWF9WSURFT0VOQ19DT01QT05FTlQgKilwU0VDQ29tcG9uZW50LT5oQ29tcG9uZW50SGFuZGxlOworICAgIHBNcGVnNEVuYyA9IChTRUNfTVBFRzRFTkNfSEFORExFICopKChTRUNfT01YX1ZJREVPRU5DX0NPTVBPTkVOVCAqKXBTRUNDb21wb25lbnQtPmhDb21wb25lbnRIYW5kbGUpLT5oQ29kZWNIYW5kbGU7CisgICAgcFNFQ0lucHV0UG9ydCA9ICZwU0VDQ29tcG9uZW50LT5wU0VDUG9ydFtJTlBVVF9QT1JUX0lOREVYXTsKKyAgICBwU0VDT3V0cHV0UG9ydCA9ICZwU0VDQ29tcG9uZW50LT5wU0VDUG9ydFtPVVRQVVRfUE9SVF9JTkRFWF07CisKKyAgICBpZiAocFZpZGVvRW5jLT5JbnRyYVJlZnJlc2hWT1AgPT0gT01YX1RSVUUpIHsKKyAgICAgICAgaW50IHNldF9jb25mX0ludHJhUmVmcmVzaFZPUCA9IDE7CisgICAgICAgIFNzYlNpcE1mY0VuY1NldENvbmZpZyhwTXBlZzRFbmMtPmhNRkNNcGVnNEhhbmRsZS5oTUZDSGFuZGxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNRkNfRU5DX1NFVENPTkZfRlJBTUVfVFlQRSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnNldF9jb25mX0ludHJhUmVmcmVzaFZPUCk7CisgICAgICAgIHBWaWRlb0VuYy0+SW50cmFSZWZyZXNoVk9QID0gT01YX0ZBTFNFOworICAgIH0KKyAgICBpZiAocEgyNjNQYXJhbS0+SURSUGVyaW9kICE9IChpbnQpcE1wZWc0RW5jLT5oMjYzQ29tcG9uZW50W09VVFBVVF9QT1JUX0lOREVYXS5uUEZyYW1lcyArIDEpIHsKKyAgICAgICAgaW50IHNldF9jb25mX0lEUlBlcmlvZCA9IHBNcGVnNEVuYy0+aDI2M0NvbXBvbmVudFtPVVRQVVRfUE9SVF9JTkRFWF0ublBGcmFtZXMgKyAxOworICAgICAgICBTc2JTaXBNZmNFbmNTZXRDb25maWcocE1wZWc0RW5jLT5oTUZDTXBlZzRIYW5kbGUuaE1GQ0hhbmRsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTUZDX0VOQ19TRVRDT05GX0lfUEVSSU9ELAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmc2V0X2NvbmZfSURSUGVyaW9kKTsKKyAgICB9CisgICAgaWYgKHBIMjYzUGFyYW0tPkJpdHJhdGUgIT0gKGludClwU0VDT3V0cHV0UG9ydC0+cG9ydERlZmluaXRpb24uZm9ybWF0LnZpZGVvLm5CaXRyYXRlKSB7CisgICAgICAgIGludCBzZXRfY29uZl9iaXRyYXRlID0gcFNFQ091dHB1dFBvcnQtPnBvcnREZWZpbml0aW9uLmZvcm1hdC52aWRlby5uQml0cmF0ZTsKKyAgICAgICAgU3NiU2lwTWZjRW5jU2V0Q29uZmlnKHBNcGVnNEVuYy0+aE1GQ01wZWc0SGFuZGxlLmhNRkNIYW5kbGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1GQ19FTkNfU0VUQ09ORl9DSEFOR0VfQklUX1JBVEUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZzZXRfY29uZl9iaXRyYXRlKTsKKyAgICB9CisgICAgaWYgKHBIMjYzUGFyYW0tPkZyYW1lUmF0ZSAhPSAoaW50KSgocFNFQ091dHB1dFBvcnQtPnBvcnREZWZpbml0aW9uLmZvcm1hdC52aWRlby54RnJhbWVyYXRlKSA+PiAxNikpIHsKKyAgICAgICAgaW50IHNldF9jb25mX2ZyYW1lcmF0ZSA9IChwU0VDSW5wdXRQb3J0LT5wb3J0RGVmaW5pdGlvbi5mb3JtYXQudmlkZW8ueEZyYW1lcmF0ZSkgPj4gMTY7CisgICAgICAgIFNzYlNpcE1mY0VuY1NldENvbmZpZyhwTXBlZzRFbmMtPmhNRkNNcGVnNEhhbmRsZS5oTUZDSGFuZGxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNRkNfRU5DX1NFVENPTkZfQ0hBTkdFX0ZSQU1FX1JBVEUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZzZXRfY29uZl9mcmFtZXJhdGUpOworICAgIH0KKworICAgIFNldF9IMjYzRW5jX1BhcmFtKHBIMjYzUGFyYW0sIHBTRUNDb21wb25lbnQpOworICAgIEgyNjNQcmludFBhcmFtcyhwSDI2M1BhcmFtKTsKK30KKworT01YX0VSUk9SVFlQRSBTRUNfTUZDX01wZWc0RW5jX0dldFBhcmFtZXRlcigKKyAgICBPTVhfSU4gICAgT01YX0hBTkRMRVRZUEUgaENvbXBvbmVudCwKKyAgICBPTVhfSU4gICAgT01YX0lOREVYVFlQRSAgblBhcmFtSW5kZXgsCisgICAgT01YX0lOT1VUIE9NWF9QVFIgICAgICAgIHBDb21wb25lbnRQYXJhbWV0ZXJTdHJ1Y3R1cmUpCit7CisgICAgT01YX0VSUk9SVFlQRSAgICAgICAgICByZXQgPSBPTVhfRXJyb3JOb25lOworICAgIE9NWF9DT01QT05FTlRUWVBFICAgICAqcE9NWENvbXBvbmVudCA9IE5VTEw7CisgICAgU0VDX09NWF9CQVNFQ09NUE9ORU5UICpwU0VDQ29tcG9uZW50ID0gTlVMTDsKKworICAgIEZ1bmN0aW9uSW4oKTsKKworICAgIGlmIChoQ29tcG9uZW50ID09IE5VTEwgfHwgcENvbXBvbmVudFBhcmFtZXRlclN0cnVjdHVyZSA9PSBOVUxMKSB7CisgICAgICAgIHJldCA9IE9NWF9FcnJvckJhZFBhcmFtZXRlcjsKKyAgICAgICAgZ290byBFWElUOworICAgIH0KKyAgICBwT01YQ29tcG9uZW50ID0gKE9NWF9DT01QT05FTlRUWVBFICopaENvbXBvbmVudDsKKyAgICByZXQgPSBTRUNfT01YX0NoZWNrX1NpemVWZXJzaW9uKHBPTVhDb21wb25lbnQsIHNpemVvZihPTVhfQ09NUE9ORU5UVFlQRSkpOworICAgIGlmIChyZXQgIT0gT01YX0Vycm9yTm9uZSkgeworICAgICAgICBnb3RvIEVYSVQ7CisgICAgfQorICAgIGlmIChwT01YQ29tcG9uZW50LT5wQ29tcG9uZW50UHJpdmF0ZSA9PSBOVUxMKSB7CisgICAgICAgIHJldCA9IE9NWF9FcnJvckJhZFBhcmFtZXRlcjsKKyAgICAgICAgZ290byBFWElUOworICAgIH0KKworICAgIHBTRUNDb21wb25lbnQgPSAoU0VDX09NWF9CQVNFQ09NUE9ORU5UICopcE9NWENvbXBvbmVudC0+cENvbXBvbmVudFByaXZhdGU7CisgICAgaWYgKHBTRUNDb21wb25lbnQtPmN1cnJlbnRTdGF0ZSA9PSBPTVhfU3RhdGVJbnZhbGlkICkgeworICAgICAgICByZXQgPSBPTVhfRXJyb3JJbnZhbGlkU3RhdGU7CisgICAgICAgIGdvdG8gRVhJVDsKKyAgICB9CisKKyAgICBzd2l0Y2ggKG5QYXJhbUluZGV4KSB7CisgICAgY2FzZSBPTVhfSW5kZXhQYXJhbVZpZGVvTXBlZzQ6CisgICAgeworICAgICAgICBPTVhfVklERU9fUEFSQU1fTVBFRzRUWVBFICpwRHN0TXBlZzRQYXJhbSA9IChPTVhfVklERU9fUEFSQU1fTVBFRzRUWVBFICopcENvbXBvbmVudFBhcmFtZXRlclN0cnVjdHVyZTsKKyAgICAgICAgT01YX1ZJREVPX1BBUkFNX01QRUc0VFlQRSAqcFNyY01wZWc0UGFyYW0gPSBOVUxMOworICAgICAgICBTRUNfTVBFRzRFTkNfSEFORExFICAgICAgICpwTXBlZzRFbmMgPSBOVUxMOworCisgICAgICAgIHJldCA9IFNFQ19PTVhfQ2hlY2tfU2l6ZVZlcnNpb24ocERzdE1wZWc0UGFyYW0sIHNpemVvZihPTVhfVklERU9fUEFSQU1fTVBFRzRUWVBFKSk7CisgICAgICAgIGlmIChyZXQgIT0gT01YX0Vycm9yTm9uZSkgeworICAgICAgICAgICAgZ290byBFWElUOworICAgICAgICB9CisKKyAgICAgICAgaWYgKHBEc3RNcGVnNFBhcmFtLT5uUG9ydEluZGV4ID49IEFMTF9QT1JUX05VTSkgeworICAgICAgICAgICAgcmV0ID0gT01YX0Vycm9yQmFkUG9ydEluZGV4OworICAgICAgICAgICAgZ290byBFWElUOworICAgICAgICB9CisKKyAgICAgICAgcE1wZWc0RW5jID0gKFNFQ19NUEVHNEVOQ19IQU5ETEUgKikoKFNFQ19PTVhfVklERU9FTkNfQ09NUE9ORU5UICopcFNFQ0NvbXBvbmVudC0+aENvbXBvbmVudEhhbmRsZSktPmhDb2RlY0hhbmRsZTsKKyAgICAgICAgcFNyY01wZWc0UGFyYW0gPSAmcE1wZWc0RW5jLT5tcGVnNENvbXBvbmVudFtwRHN0TXBlZzRQYXJhbS0+blBvcnRJbmRleF07CisKKyAgICAgICAgU0VDX09TQUxfTWVtY3B5KHBEc3RNcGVnNFBhcmFtLCBwU3JjTXBlZzRQYXJhbSwgc2l6ZW9mKE9NWF9WSURFT19QQVJBTV9NUEVHNFRZUEUpKTsKKyAgICB9CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgT01YX0luZGV4UGFyYW1WaWRlb0gyNjM6CisgICAgeworICAgICAgICBPTVhfVklERU9fUEFSQU1fSDI2M1RZUEUgICpwRHN0SDI2M1BhcmFtID0gKE9NWF9WSURFT19QQVJBTV9IMjYzVFlQRSAqKXBDb21wb25lbnRQYXJhbWV0ZXJTdHJ1Y3R1cmU7CisgICAgICAgIE9NWF9WSURFT19QQVJBTV9IMjYzVFlQRSAgKnBTcmNIMjYzUGFyYW0gPSBOVUxMOworICAgICAgICBTRUNfTVBFRzRFTkNfSEFORExFICAgICAgICpwTXBlZzRFbmMgPSBOVUxMOworCisgICAgICAgIHJldCA9IFNFQ19PTVhfQ2hlY2tfU2l6ZVZlcnNpb24ocERzdEgyNjNQYXJhbSwgc2l6ZW9mKE9NWF9WSURFT19QQVJBTV9IMjYzVFlQRSkpOworICAgICAgICBpZiAocmV0ICE9IE9NWF9FcnJvck5vbmUpIHsKKyAgICAgICAgICAgIGdvdG8gRVhJVDsKKyAgICAgICAgfQorCisgICAgICAgIGlmIChwRHN0SDI2M1BhcmFtLT5uUG9ydEluZGV4ID49IEFMTF9QT1JUX05VTSkgeworICAgICAgICAgICAgcmV0ID0gT01YX0Vycm9yQmFkUG9ydEluZGV4OworICAgICAgICAgICAgZ290byBFWElUOworICAgICAgICB9CisKKyAgICAgICAgcE1wZWc0RW5jID0gKFNFQ19NUEVHNEVOQ19IQU5ETEUgKikoKFNFQ19PTVhfVklERU9FTkNfQ09NUE9ORU5UICopcFNFQ0NvbXBvbmVudC0+aENvbXBvbmVudEhhbmRsZSktPmhDb2RlY0hhbmRsZTsKKyAgICAgICAgcFNyY0gyNjNQYXJhbSA9ICZwTXBlZzRFbmMtPmgyNjNDb21wb25lbnRbcERzdEgyNjNQYXJhbS0+blBvcnRJbmRleF07CisKKyAgICAgICAgU0VDX09TQUxfTWVtY3B5KHBEc3RIMjYzUGFyYW0sIHBTcmNIMjYzUGFyYW0sIHNpemVvZihPTVhfVklERU9fUEFSQU1fSDI2M1RZUEUpKTsKKyAgICB9CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgT01YX0luZGV4UGFyYW1TdGFuZGFyZENvbXBvbmVudFJvbGU6CisgICAgeworICAgICAgICBPTVhfUzMyIGNvZGVjVHlwZTsKKyAgICAgICAgT01YX1BBUkFNX0NPTVBPTkVOVFJPTEVUWVBFICpwQ29tcG9uZW50Um9sZSA9IChPTVhfUEFSQU1fQ09NUE9ORU5UUk9MRVRZUEUgKilwQ29tcG9uZW50UGFyYW1ldGVyU3RydWN0dXJlOworCisgICAgICAgIHJldCA9IFNFQ19PTVhfQ2hlY2tfU2l6ZVZlcnNpb24ocENvbXBvbmVudFJvbGUsIHNpemVvZihPTVhfUEFSQU1fQ09NUE9ORU5UUk9MRVRZUEUpKTsKKyAgICAgICAgaWYgKHJldCAhPSBPTVhfRXJyb3JOb25lKSB7CisgICAgICAgICAgICBnb3RvIEVYSVQ7CisgICAgICAgIH0KKworICAgICAgICBjb2RlY1R5cGUgPSAoKFNFQ19NUEVHNEVOQ19IQU5ETEUgKikoKChTRUNfT01YX1ZJREVPRU5DX0NPTVBPTkVOVCAqKXBTRUNDb21wb25lbnQtPmhDb21wb25lbnRIYW5kbGUpLT5oQ29kZWNIYW5kbGUpKS0+aE1GQ01wZWc0SGFuZGxlLmNvZGVjVHlwZTsKKyAgICAgICAgaWYgKGNvZGVjVHlwZSA9PSBDT0RFQ19UWVBFX01QRUc0KQorICAgICAgICAgICAgU0VDX09TQUxfU3RyY3B5KChjaGFyICopcENvbXBvbmVudFJvbGUtPmNSb2xlLCBTRUNfT01YX0NPTVBPTkVOVF9NUEVHNF9FTkNfUk9MRSk7CisgICAgICAgIGVsc2UKKyAgICAgICAgICAgIFNFQ19PU0FMX1N0cmNweSgoY2hhciAqKXBDb21wb25lbnRSb2xlLT5jUm9sZSwgU0VDX09NWF9DT01QT05FTlRfSDI2M19FTkNfUk9MRSk7CisgICAgfQorICAgICAgICBicmVhazsKKyAgICBjYXNlIE9NWF9JbmRleFBhcmFtVmlkZW9Qcm9maWxlTGV2ZWxRdWVyeVN1cHBvcnRlZDoKKyAgICB7CisgICAgICAgIE9NWF9WSURFT19QQVJBTV9QUk9GSUxFTEVWRUxUWVBFICpwRHN0UHJvZmlsZUxldmVsID0gKE9NWF9WSURFT19QQVJBTV9QUk9GSUxFTEVWRUxUWVBFICopcENvbXBvbmVudFBhcmFtZXRlclN0cnVjdHVyZTsKKyAgICAgICAgU0VDX09NWF9WSURFT19QUk9GSUxFTEVWRUwgICAgICAgKnBQcm9maWxlTGV2ZWwgPSBOVUxMOworICAgICAgICBPTVhfVTMyICAgICAgICAgICAgICAgICAgICAgICAgICAgbWF4UHJvZmlsZUxldmVsTnVtID0gMDsKKyAgICAgICAgT01YX1MzMiAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvZGVjVHlwZTsKKworICAgICAgICByZXQgPSBTRUNfT01YX0NoZWNrX1NpemVWZXJzaW9uKHBEc3RQcm9maWxlTGV2ZWwsIHNpemVvZihPTVhfVklERU9fUEFSQU1fUFJPRklMRUxFVkVMVFlQRSkpOworICAgICAgICBpZiAocmV0ICE9IE9NWF9FcnJvck5vbmUpIHsKKyAgICAgICAgICAgIGdvdG8gRVhJVDsKKyAgICAgICAgfQorCisgICAgICAgIGlmIChwRHN0UHJvZmlsZUxldmVsLT5uUG9ydEluZGV4ID49IEFMTF9QT1JUX05VTSkgeworICAgICAgICAgICAgcmV0ID0gT01YX0Vycm9yQmFkUG9ydEluZGV4OworICAgICAgICAgICAgZ290byBFWElUOworICAgICAgICB9CisKKyAgICAgICAgY29kZWNUeXBlID0gKChTRUNfTVBFRzRFTkNfSEFORExFICopKCgoU0VDX09NWF9WSURFT0VOQ19DT01QT05FTlQgKilwU0VDQ29tcG9uZW50LT5oQ29tcG9uZW50SGFuZGxlKS0+aENvZGVjSGFuZGxlKSktPmhNRkNNcGVnNEhhbmRsZS5jb2RlY1R5cGU7CisgICAgICAgIGlmIChjb2RlY1R5cGUgPT0gQ09ERUNfVFlQRV9NUEVHNCkgeworICAgICAgICAgICAgcFByb2ZpbGVMZXZlbCA9IHN1cHBvcnRlZE1QRUc0UHJvZmlsZUxldmVsczsKKyAgICAgICAgICAgIG1heFByb2ZpbGVMZXZlbE51bSA9IHNpemVvZihzdXBwb3J0ZWRNUEVHNFByb2ZpbGVMZXZlbHMpIC8gc2l6ZW9mKFNFQ19PTVhfVklERU9fUFJPRklMRUxFVkVMKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHBQcm9maWxlTGV2ZWwgPSBzdXBwb3J0ZWRIMjYzUHJvZmlsZUxldmVsczsKKyAgICAgICAgICAgIG1heFByb2ZpbGVMZXZlbE51bSA9IHNpemVvZihzdXBwb3J0ZWRIMjYzUHJvZmlsZUxldmVscykgLyBzaXplb2YoU0VDX09NWF9WSURFT19QUk9GSUxFTEVWRUwpOworICAgICAgICB9CisKKyAgICAgICAgaWYgKHBEc3RQcm9maWxlTGV2ZWwtPm5Qcm9maWxlSW5kZXggPj0gbWF4UHJvZmlsZUxldmVsTnVtKSB7CisgICAgICAgICAgICByZXQgPSBPTVhfRXJyb3JOb01vcmU7CisgICAgICAgICAgICBnb3RvIEVYSVQ7CisgICAgICAgIH0KKworICAgICAgICBwUHJvZmlsZUxldmVsICs9IHBEc3RQcm9maWxlTGV2ZWwtPm5Qcm9maWxlSW5kZXg7CisgICAgICAgIHBEc3RQcm9maWxlTGV2ZWwtPmVQcm9maWxlID0gcFByb2ZpbGVMZXZlbC0+cHJvZmlsZTsKKyAgICAgICAgcERzdFByb2ZpbGVMZXZlbC0+ZUxldmVsID0gcFByb2ZpbGVMZXZlbC0+bGV2ZWw7CisgICAgfQorICAgICAgICBicmVhazsKKyAgICBjYXNlIE9NWF9JbmRleFBhcmFtVmlkZW9Qcm9maWxlTGV2ZWxDdXJyZW50OgorICAgIHsKKyAgICAgICAgT01YX1ZJREVPX1BBUkFNX1BST0ZJTEVMRVZFTFRZUEUgKnBEc3RQcm9maWxlTGV2ZWwgPSAoT01YX1ZJREVPX1BBUkFNX1BST0ZJTEVMRVZFTFRZUEUgKilwQ29tcG9uZW50UGFyYW1ldGVyU3RydWN0dXJlOworICAgICAgICBPTVhfVklERU9fUEFSQU1fTVBFRzRUWVBFICAgICAgICAqcFNyY01wZWc0UGFyYW0gPSBOVUxMOworICAgICAgICBPTVhfVklERU9fUEFSQU1fSDI2M1RZUEUgICAgICAgICAqcFNyY0gyNjNQYXJhbSA9IE5VTEw7CisgICAgICAgIFNFQ19NUEVHNEVOQ19IQU5ETEUgICAgICAgICAgICAgICpwTXBlZzRFbmMgPSBOVUxMOworICAgICAgICBPTVhfUzMyICAgICAgICAgICAgICAgICAgICAgICAgICAgY29kZWNUeXBlOworCisgICAgICAgIHJldCA9IFNFQ19PTVhfQ2hlY2tfU2l6ZVZlcnNpb24ocERzdFByb2ZpbGVMZXZlbCwgc2l6ZW9mKE9NWF9WSURFT19QQVJBTV9QUk9GSUxFTEVWRUxUWVBFKSk7CisgICAgICAgIGlmIChyZXQgIT0gT01YX0Vycm9yTm9uZSkgeworICAgICAgICAgICAgZ290byBFWElUOworICAgICAgICB9CisKKyAgICAgICAgaWYgKHBEc3RQcm9maWxlTGV2ZWwtPm5Qb3J0SW5kZXggPj0gQUxMX1BPUlRfTlVNKSB7CisgICAgICAgICAgICByZXQgPSBPTVhfRXJyb3JCYWRQb3J0SW5kZXg7CisgICAgICAgICAgICBnb3RvIEVYSVQ7CisgICAgICAgIH0KKworICAgICAgICBwTXBlZzRFbmMgPSAoU0VDX01QRUc0RU5DX0hBTkRMRSAqKSgoU0VDX09NWF9WSURFT0VOQ19DT01QT05FTlQgKilwU0VDQ29tcG9uZW50LT5oQ29tcG9uZW50SGFuZGxlKS0+aENvZGVjSGFuZGxlOworICAgICAgICBjb2RlY1R5cGUgPSBwTXBlZzRFbmMtPmhNRkNNcGVnNEhhbmRsZS5jb2RlY1R5cGU7CisgICAgICAgIGlmIChjb2RlY1R5cGUgPT0gQ09ERUNfVFlQRV9NUEVHNCkgeworICAgICAgICAgICAgcFNyY01wZWc0UGFyYW0gPSAmcE1wZWc0RW5jLT5tcGVnNENvbXBvbmVudFtwRHN0UHJvZmlsZUxldmVsLT5uUG9ydEluZGV4XTsKKyAgICAgICAgICAgIHBEc3RQcm9maWxlTGV2ZWwtPmVQcm9maWxlID0gcFNyY01wZWc0UGFyYW0tPmVQcm9maWxlOworICAgICAgICAgICAgcERzdFByb2ZpbGVMZXZlbC0+ZUxldmVsID0gcFNyY01wZWc0UGFyYW0tPmVMZXZlbDsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHBTcmNIMjYzUGFyYW0gPSAmcE1wZWc0RW5jLT5oMjYzQ29tcG9uZW50W3BEc3RQcm9maWxlTGV2ZWwtPm5Qb3J0SW5kZXhdOworICAgICAgICAgICAgcERzdFByb2ZpbGVMZXZlbC0+ZVByb2ZpbGUgPSBwU3JjSDI2M1BhcmFtLT5lUHJvZmlsZTsKKyAgICAgICAgICAgIHBEc3RQcm9maWxlTGV2ZWwtPmVMZXZlbCA9IHBTcmNIMjYzUGFyYW0tPmVMZXZlbDsKKyAgICAgICAgfQorICAgIH0KKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBPTVhfSW5kZXhQYXJhbVZpZGVvRXJyb3JDb3JyZWN0aW9uOgorICAgIHsKKyAgICAgICAgT01YX1ZJREVPX1BBUkFNX0VSUk9SQ09SUkVDVElPTlRZUEUgKnBEc3RFcnJvckNvcnJlY3Rpb25UeXBlID0gKE9NWF9WSURFT19QQVJBTV9FUlJPUkNPUlJFQ1RJT05UWVBFICopcENvbXBvbmVudFBhcmFtZXRlclN0cnVjdHVyZTsKKyAgICAgICAgT01YX1ZJREVPX1BBUkFNX0VSUk9SQ09SUkVDVElPTlRZUEUgKnBTcmNFcnJvckNvcnJlY3Rpb25UeXBlID0gTlVMTDsKKyAgICAgICAgU0VDX01QRUc0RU5DX0hBTkRMRSAgICAgICAgICAgICAgICAgKnBNcGVnNEVuYyA9IE5VTEw7CisKKyAgICAgICAgcmV0ID0gU0VDX09NWF9DaGVja19TaXplVmVyc2lvbihwRHN0RXJyb3JDb3JyZWN0aW9uVHlwZSwgc2l6ZW9mKE9NWF9WSURFT19QQVJBTV9FUlJPUkNPUlJFQ1RJT05UWVBFKSk7CisgICAgICAgIGlmIChyZXQgIT0gT01YX0Vycm9yTm9uZSkgeworICAgICAgICAgICAgZ290byBFWElUOworICAgICAgICB9CisKKyAgICAgICAgaWYgKHBEc3RFcnJvckNvcnJlY3Rpb25UeXBlLT5uUG9ydEluZGV4ICE9IE9VVFBVVF9QT1JUX0lOREVYKSB7CisgICAgICAgICAgICByZXQgPSBPTVhfRXJyb3JCYWRQb3J0SW5kZXg7CisgICAgICAgICAgICBnb3RvIEVYSVQ7CisgICAgICAgIH0KKworICAgICAgICBwTXBlZzRFbmMgPSAoU0VDX01QRUc0RU5DX0hBTkRMRSAqKSgoU0VDX09NWF9WSURFT0VOQ19DT01QT05FTlQgKilwU0VDQ29tcG9uZW50LT5oQ29tcG9uZW50SGFuZGxlKS0+aENvZGVjSGFuZGxlOworICAgICAgICBwU3JjRXJyb3JDb3JyZWN0aW9uVHlwZSA9ICZwTXBlZzRFbmMtPmVycm9yQ29ycmVjdGlvblR5cGVbT1VUUFVUX1BPUlRfSU5ERVhdOworCisgICAgICAgIHBEc3RFcnJvckNvcnJlY3Rpb25UeXBlLT5iRW5hYmxlSEVDID0gcFNyY0Vycm9yQ29ycmVjdGlvblR5cGUtPmJFbmFibGVIRUM7CisgICAgICAgIHBEc3RFcnJvckNvcnJlY3Rpb25UeXBlLT5iRW5hYmxlUmVzeW5jID0gcFNyY0Vycm9yQ29ycmVjdGlvblR5cGUtPmJFbmFibGVSZXN5bmM7CisgICAgICAgIHBEc3RFcnJvckNvcnJlY3Rpb25UeXBlLT5uUmVzeW5jaE1hcmtlclNwYWNpbmcgPSBwU3JjRXJyb3JDb3JyZWN0aW9uVHlwZS0+blJlc3luY2hNYXJrZXJTcGFjaW5nOworICAgICAgICBwRHN0RXJyb3JDb3JyZWN0aW9uVHlwZS0+YkVuYWJsZURhdGFQYXJ0aXRpb25pbmcgPSBwU3JjRXJyb3JDb3JyZWN0aW9uVHlwZS0+YkVuYWJsZURhdGFQYXJ0aXRpb25pbmc7CisgICAgICAgIHBEc3RFcnJvckNvcnJlY3Rpb25UeXBlLT5iRW5hYmxlUlZMQyA9IHBTcmNFcnJvckNvcnJlY3Rpb25UeXBlLT5iRW5hYmxlUlZMQzsKKyAgICB9CisgICAgICAgIGJyZWFrOworICAgIGRlZmF1bHQ6CisgICAgICAgIHJldCA9IFNFQ19PTVhfVmlkZW9FbmNvZGVHZXRQYXJhbWV0ZXIoaENvbXBvbmVudCwgblBhcmFtSW5kZXgsIHBDb21wb25lbnRQYXJhbWV0ZXJTdHJ1Y3R1cmUpOworICAgICAgICBicmVhazsKKyAgICB9CitFWElUOgorICAgIEZ1bmN0aW9uT3V0KCk7CisKKyAgICByZXR1cm4gcmV0OworfQorCitPTVhfRVJST1JUWVBFIFNFQ19NRkNfTXBlZzRFbmNfU2V0UGFyYW1ldGVyKAorICAgIE9NWF9JTiBPTVhfSEFORExFVFlQRSBoQ29tcG9uZW50LAorICAgIE9NWF9JTiBPTVhfSU5ERVhUWVBFICBuSW5kZXgsCisgICAgT01YX0lOIE9NWF9QVFIgICAgICAgIHBDb21wb25lbnRQYXJhbWV0ZXJTdHJ1Y3R1cmUpCit7CisgICAgT01YX0VSUk9SVFlQRSAgICAgICAgICAgcmV0ID0gT01YX0Vycm9yTm9uZTsKKyAgICBPTVhfQ09NUE9ORU5UVFlQRSAgICAgKnBPTVhDb21wb25lbnQgPSBOVUxMOworICAgIFNFQ19PTVhfQkFTRUNPTVBPTkVOVCAqcFNFQ0NvbXBvbmVudCA9IE5VTEw7CisKKyAgICBGdW5jdGlvbkluKCk7CisKKyAgICBpZiAoaENvbXBvbmVudCA9PSBOVUxMIHx8IHBDb21wb25lbnRQYXJhbWV0ZXJTdHJ1Y3R1cmUgPT0gTlVMTCkgeworICAgICAgICByZXQgPSBPTVhfRXJyb3JCYWRQYXJhbWV0ZXI7CisgICAgICAgIGdvdG8gRVhJVDsKKyAgICB9CisgICAgcE9NWENvbXBvbmVudCA9IChPTVhfQ09NUE9ORU5UVFlQRSAqKWhDb21wb25lbnQ7CisgICAgcmV0ID0gU0VDX09NWF9DaGVja19TaXplVmVyc2lvbihwT01YQ29tcG9uZW50LCBzaXplb2YoT01YX0NPTVBPTkVOVFRZUEUpKTsKKyAgICBpZiAocmV0ICE9IE9NWF9FcnJvck5vbmUpIHsKKyAgICAgICAgZ290byBFWElUOworICAgIH0KKyAgICBpZiAocE9NWENvbXBvbmVudC0+cENvbXBvbmVudFByaXZhdGUgPT0gTlVMTCkgeworICAgICAgICByZXQgPSBPTVhfRXJyb3JCYWRQYXJhbWV0ZXI7CisgICAgICAgIGdvdG8gRVhJVDsKKyAgICB9CisKKyAgICBwU0VDQ29tcG9uZW50ID0gKFNFQ19PTVhfQkFTRUNPTVBPTkVOVCAqKXBPTVhDb21wb25lbnQtPnBDb21wb25lbnRQcml2YXRlOworICAgIGlmIChwU0VDQ29tcG9uZW50LT5jdXJyZW50U3RhdGUgPT0gT01YX1N0YXRlSW52YWxpZCApIHsKKyAgICAgICAgcmV0ID0gT01YX0Vycm9ySW52YWxpZFN0YXRlOworICAgICAgICBnb3RvIEVYSVQ7CisgICAgfQorCisgICAgc3dpdGNoIChuSW5kZXgpIHsKKyAgICBjYXNlIE9NWF9JbmRleFBhcmFtVmlkZW9NcGVnNDoKKyAgICB7CisgICAgICAgIE9NWF9WSURFT19QQVJBTV9NUEVHNFRZUEUgKnBEc3RNcGVnNFBhcmFtID0gTlVMTDsKKyAgICAgICAgT01YX1ZJREVPX1BBUkFNX01QRUc0VFlQRSAqcFNyY01wZWc0UGFyYW0gPSAoT01YX1ZJREVPX1BBUkFNX01QRUc0VFlQRSAqKXBDb21wb25lbnRQYXJhbWV0ZXJTdHJ1Y3R1cmU7CisgICAgICAgIFNFQ19NUEVHNEVOQ19IQU5ETEUgICAgICAgKnBNcGVnNEVuYyA9IE5VTEw7CisKKyAgICAgICAgcmV0ID0gU0VDX09NWF9DaGVja19TaXplVmVyc2lvbihwU3JjTXBlZzRQYXJhbSwgc2l6ZW9mKE9NWF9WSURFT19QQVJBTV9NUEVHNFRZUEUpKTsKKyAgICAgICAgaWYgKHJldCAhPSBPTVhfRXJyb3JOb25lKSB7CisgICAgICAgICAgICBnb3RvIEVYSVQ7CisgICAgICAgIH0KKworICAgICAgICBpZiAocFNyY01wZWc0UGFyYW0tPm5Qb3J0SW5kZXggPj0gQUxMX1BPUlRfTlVNKSB7CisgICAgICAgICAgICByZXQgPSBPTVhfRXJyb3JCYWRQb3J0SW5kZXg7CisgICAgICAgICAgICBnb3RvIEVYSVQ7CisgICAgICAgIH0KKworICAgICAgICBwTXBlZzRFbmMgPSAoU0VDX01QRUc0RU5DX0hBTkRMRSAqKSgoU0VDX09NWF9WSURFT0VOQ19DT01QT05FTlQgKilwU0VDQ29tcG9uZW50LT5oQ29tcG9uZW50SGFuZGxlKS0+aENvZGVjSGFuZGxlOworICAgICAgICBwRHN0TXBlZzRQYXJhbSA9ICZwTXBlZzRFbmMtPm1wZWc0Q29tcG9uZW50W3BTcmNNcGVnNFBhcmFtLT5uUG9ydEluZGV4XTsKKworICAgICAgICBTRUNfT1NBTF9NZW1jcHkocERzdE1wZWc0UGFyYW0sIHBTcmNNcGVnNFBhcmFtLCBzaXplb2YoT01YX1ZJREVPX1BBUkFNX01QRUc0VFlQRSkpOworICAgIH0KKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBPTVhfSW5kZXhQYXJhbVZpZGVvSDI2MzoKKyAgICB7CisgICAgICAgIE9NWF9WSURFT19QQVJBTV9IMjYzVFlQRSAqcERzdEgyNjNQYXJhbSA9IE5VTEw7CisgICAgICAgIE9NWF9WSURFT19QQVJBTV9IMjYzVFlQRSAqcFNyY0gyNjNQYXJhbSA9IChPTVhfVklERU9fUEFSQU1fSDI2M1RZUEUgKilwQ29tcG9uZW50UGFyYW1ldGVyU3RydWN0dXJlOworICAgICAgICBTRUNfTVBFRzRFTkNfSEFORExFICAgICAgKnBNcGVnNEVuYyA9IE5VTEw7CisKKyAgICAgICAgcmV0ID0gU0VDX09NWF9DaGVja19TaXplVmVyc2lvbihwU3JjSDI2M1BhcmFtLCBzaXplb2YoT01YX1ZJREVPX1BBUkFNX0gyNjNUWVBFKSk7CisgICAgICAgIGlmIChyZXQgIT0gT01YX0Vycm9yTm9uZSkgeworICAgICAgICAgICAgZ290byBFWElUOworICAgICAgICB9CisKKyAgICAgICAgaWYgKHBTcmNIMjYzUGFyYW0tPm5Qb3J0SW5kZXggPj0gQUxMX1BPUlRfTlVNKSB7CisgICAgICAgICAgICByZXQgPSBPTVhfRXJyb3JCYWRQb3J0SW5kZXg7CisgICAgICAgICAgICBnb3RvIEVYSVQ7CisgICAgICAgIH0KKworICAgICAgICBwTXBlZzRFbmMgPSAoU0VDX01QRUc0RU5DX0hBTkRMRSAqKSgoU0VDX09NWF9WSURFT0VOQ19DT01QT05FTlQgKilwU0VDQ29tcG9uZW50LT5oQ29tcG9uZW50SGFuZGxlKS0+aENvZGVjSGFuZGxlOworICAgICAgICBwRHN0SDI2M1BhcmFtID0gJnBNcGVnNEVuYy0+aDI2M0NvbXBvbmVudFtwU3JjSDI2M1BhcmFtLT5uUG9ydEluZGV4XTsKKworICAgICAgICBTRUNfT1NBTF9NZW1jcHkocERzdEgyNjNQYXJhbSwgcFNyY0gyNjNQYXJhbSwgc2l6ZW9mKE9NWF9WSURFT19QQVJBTV9IMjYzVFlQRSkpOworICAgIH0KKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBPTVhfSW5kZXhQYXJhbVN0YW5kYXJkQ29tcG9uZW50Um9sZToKKyAgICB7CisgICAgICAgIE9NWF9QQVJBTV9DT01QT05FTlRST0xFVFlQRSAqcENvbXBvbmVudFJvbGUgPSAoT01YX1BBUkFNX0NPTVBPTkVOVFJPTEVUWVBFKilwQ29tcG9uZW50UGFyYW1ldGVyU3RydWN0dXJlOworCisgICAgICAgIHJldCA9IFNFQ19PTVhfQ2hlY2tfU2l6ZVZlcnNpb24ocENvbXBvbmVudFJvbGUsIHNpemVvZihPTVhfUEFSQU1fQ09NUE9ORU5UUk9MRVRZUEUpKTsKKyAgICAgICAgaWYgKHJldCAhPSBPTVhfRXJyb3JOb25lKSB7CisgICAgICAgICAgICBnb3RvIEVYSVQ7CisgICAgICAgIH0KKworICAgICAgICBpZiAoKHBTRUNDb21wb25lbnQtPmN1cnJlbnRTdGF0ZSAhPSBPTVhfU3RhdGVMb2FkZWQpICYmIChwU0VDQ29tcG9uZW50LT5jdXJyZW50U3RhdGUgIT0gT01YX1N0YXRlV2FpdEZvclJlc291cmNlcykpIHsKKyAgICAgICAgICAgIHJldCA9IE9NWF9FcnJvckluY29ycmVjdFN0YXRlT3BlcmF0aW9uOworICAgICAgICAgICAgZ290byBFWElUOworICAgICAgICB9CisKKyAgICAgICAgaWYgKCFTRUNfT1NBTF9TdHJjbXAoKGNoYXIqKXBDb21wb25lbnRSb2xlLT5jUm9sZSwgU0VDX09NWF9DT01QT05FTlRfTVBFRzRfRU5DX1JPTEUpKSB7CisgICAgICAgICAgICBwU0VDQ29tcG9uZW50LT5wU0VDUG9ydFtPVVRQVVRfUE9SVF9JTkRFWF0ucG9ydERlZmluaXRpb24uZm9ybWF0LnZpZGVvLmVDb21wcmVzc2lvbkZvcm1hdCA9IE9NWF9WSURFT19Db2RpbmdNUEVHNDsKKyAgICAgICAgICAgIC8vKChTRUNfTVBFRzRFTkNfSEFORExFICopKCgoU0VDX09NWF9WSURFT0VOQ19DT01QT05FTlQgKilwU0VDQ29tcG9uZW50LT5oQ29tcG9uZW50SGFuZGxlKS0+aENvZGVjSGFuZGxlKSktPmhNRkNNcGVnNEhhbmRsZS5jb2RlY1R5cGUgPSBDT0RFQ19UWVBFX01QRUc0OworICAgICAgICB9IGVsc2UgaWYgKCFTRUNfT1NBTF9TdHJjbXAoKGNoYXIqKXBDb21wb25lbnRSb2xlLT5jUm9sZSwgU0VDX09NWF9DT01QT05FTlRfSDI2M19FTkNfUk9MRSkpIHsKKyAgICAgICAgICAgIHBTRUNDb21wb25lbnQtPnBTRUNQb3J0W09VVFBVVF9QT1JUX0lOREVYXS5wb3J0RGVmaW5pdGlvbi5mb3JtYXQudmlkZW8uZUNvbXByZXNzaW9uRm9ybWF0ID0gT01YX1ZJREVPX0NvZGluZ0gyNjM7CisgICAgICAgICAgICAvLygoU0VDX01QRUc0RU5DX0hBTkRMRSAqKSgoKFNFQ19PTVhfVklERU9FTkNfQ09NUE9ORU5UICopcFNFQ0NvbXBvbmVudC0+aENvbXBvbmVudEhhbmRsZSktPmhDb2RlY0hhbmRsZSkpLT5oTUZDTXBlZzRIYW5kbGUuY29kZWNUeXBlID0gQ09ERUNfVFlQRV9IMjYzOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgcmV0ID0gT01YX0Vycm9yQmFkUGFyYW1ldGVyOworICAgICAgICAgICAgZ290byBFWElUOworICAgICAgICB9CisgICAgfQorICAgICAgICBicmVhazsKKyAgICBjYXNlIE9NWF9JbmRleFBhcmFtVmlkZW9Qcm9maWxlTGV2ZWxDdXJyZW50OgorICAgIHsKKyAgICAgICAgT01YX1ZJREVPX1BBUkFNX1BST0ZJTEVMRVZFTFRZUEUgKnBTcmNQcm9maWxlTGV2ZWwgPSAoT01YX1ZJREVPX1BBUkFNX1BST0ZJTEVMRVZFTFRZUEUgKilwQ29tcG9uZW50UGFyYW1ldGVyU3RydWN0dXJlOworICAgICAgICBPTVhfVklERU9fUEFSQU1fTVBFRzRUWVBFICAgICAgICAqcERzdE1wZWc0UGFyYW0gPSBOVUxMOworICAgICAgICBPTVhfVklERU9fUEFSQU1fSDI2M1RZUEUgICAgICAgICAqcERzdEgyNjNQYXJhbSA9IE5VTEw7CisgICAgICAgIFNFQ19NUEVHNEVOQ19IQU5ETEUgICAgICAgICAgICAgICpwTXBlZzRFbmMgPSBOVUxMOworICAgICAgICBPTVhfUzMyICAgICAgICAgICAgICAgICAgICAgICAgICAgY29kZWNUeXBlOworCisgICAgICAgIHJldCA9IFNFQ19PTVhfQ2hlY2tfU2l6ZVZlcnNpb24ocFNyY1Byb2ZpbGVMZXZlbCwgc2l6ZW9mKE9NWF9WSURFT19QQVJBTV9QUk9GSUxFTEVWRUxUWVBFKSk7CisgICAgICAgIGlmIChyZXQgIT0gT01YX0Vycm9yTm9uZSkgeworICAgICAgICAgICAgZ290byBFWElUOworICAgICAgICB9CisKKyAgICAgICAgaWYgKHBTcmNQcm9maWxlTGV2ZWwtPm5Qb3J0SW5kZXggPj0gQUxMX1BPUlRfTlVNKSB7CisgICAgICAgICAgICByZXQgPSBPTVhfRXJyb3JCYWRQb3J0SW5kZXg7CisgICAgICAgICAgICBnb3RvIEVYSVQ7CisgICAgICAgIH0KKworICAgICAgICBwTXBlZzRFbmMgPSAoU0VDX01QRUc0RU5DX0hBTkRMRSAqKSgoU0VDX09NWF9WSURFT0VOQ19DT01QT05FTlQgKilwU0VDQ29tcG9uZW50LT5oQ29tcG9uZW50SGFuZGxlKS0+aENvZGVjSGFuZGxlOworICAgICAgICBjb2RlY1R5cGUgPSBwTXBlZzRFbmMtPmhNRkNNcGVnNEhhbmRsZS5jb2RlY1R5cGU7CisgICAgICAgIGlmIChjb2RlY1R5cGUgPT0gQ09ERUNfVFlQRV9NUEVHNCkgeworICAgICAgICAgICAgLyoKKyAgICAgICAgICAgICAqIFRvIGRvOiBDaGVjayB2YWxpZGl0eSBvZiBwcm9maWxlICYgbGV2ZWwgcGFyYW1ldGVycworICAgICAgICAgICAgICovCisKKyAgICAgICAgICAgIHBEc3RNcGVnNFBhcmFtID0gJnBNcGVnNEVuYy0+bXBlZzRDb21wb25lbnRbcFNyY1Byb2ZpbGVMZXZlbC0+blBvcnRJbmRleF07CisgICAgICAgICAgICBwRHN0TXBlZzRQYXJhbS0+ZVByb2ZpbGUgPSBwU3JjUHJvZmlsZUxldmVsLT5lUHJvZmlsZTsKKyAgICAgICAgICAgIHBEc3RNcGVnNFBhcmFtLT5lTGV2ZWwgPSBwU3JjUHJvZmlsZUxldmVsLT5lTGV2ZWw7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAvKgorICAgICAgICAgICAgICogVG8gZG86IENoZWNrIHZhbGlkaXR5IG9mIHByb2ZpbGUgJiBsZXZlbCBwYXJhbWV0ZXJzCisgICAgICAgICAgICAgKi8KKworICAgICAgICAgICAgcERzdEgyNjNQYXJhbSA9ICZwTXBlZzRFbmMtPmgyNjNDb21wb25lbnRbcFNyY1Byb2ZpbGVMZXZlbC0+blBvcnRJbmRleF07CisgICAgICAgICAgICBwRHN0SDI2M1BhcmFtLT5lUHJvZmlsZSA9IHBTcmNQcm9maWxlTGV2ZWwtPmVQcm9maWxlOworICAgICAgICAgICAgcERzdEgyNjNQYXJhbS0+ZUxldmVsID0gcFNyY1Byb2ZpbGVMZXZlbC0+ZUxldmVsOworICAgICAgICB9CisgICAgfQorICAgICAgICBicmVhazsKKyAgICBjYXNlIE9NWF9JbmRleFBhcmFtVmlkZW9FcnJvckNvcnJlY3Rpb246CisgICAgeworICAgICAgICBPTVhfVklERU9fUEFSQU1fRVJST1JDT1JSRUNUSU9OVFlQRSAqcFNyY0Vycm9yQ29ycmVjdGlvblR5cGUgPSAoT01YX1ZJREVPX1BBUkFNX0VSUk9SQ09SUkVDVElPTlRZUEUgKilwQ29tcG9uZW50UGFyYW1ldGVyU3RydWN0dXJlOworICAgICAgICBPTVhfVklERU9fUEFSQU1fRVJST1JDT1JSRUNUSU9OVFlQRSAqcERzdEVycm9yQ29ycmVjdGlvblR5cGUgPSBOVUxMOworICAgICAgICBTRUNfTVBFRzRFTkNfSEFORExFICAgICAgICAgICAgICAgICAqcE1wZWc0RW5jID0gTlVMTDsKKworICAgICAgICByZXQgPSBTRUNfT01YX0NoZWNrX1NpemVWZXJzaW9uKHBTcmNFcnJvckNvcnJlY3Rpb25UeXBlLCBzaXplb2YoT01YX1ZJREVPX1BBUkFNX0VSUk9SQ09SUkVDVElPTlRZUEUpKTsKKyAgICAgICAgaWYgKHJldCAhPSBPTVhfRXJyb3JOb25lKSB7CisgICAgICAgICAgICBnb3RvIEVYSVQ7CisgICAgICAgIH0KKworICAgICAgICBpZiAocFNyY0Vycm9yQ29ycmVjdGlvblR5cGUtPm5Qb3J0SW5kZXggIT0gT1VUUFVUX1BPUlRfSU5ERVgpIHsKKyAgICAgICAgICAgIHJldCA9IE9NWF9FcnJvckJhZFBvcnRJbmRleDsKKyAgICAgICAgICAgIGdvdG8gRVhJVDsKKyAgICAgICAgfQorCisgICAgICAgIHBNcGVnNEVuYyA9IChTRUNfTVBFRzRFTkNfSEFORExFICopKChTRUNfT01YX1ZJREVPRU5DX0NPTVBPTkVOVCAqKXBTRUNDb21wb25lbnQtPmhDb21wb25lbnRIYW5kbGUpLT5oQ29kZWNIYW5kbGU7CisgICAgICAgIHBEc3RFcnJvckNvcnJlY3Rpb25UeXBlID0gJnBNcGVnNEVuYy0+ZXJyb3JDb3JyZWN0aW9uVHlwZVtPVVRQVVRfUE9SVF9JTkRFWF07CisKKyAgICAgICAgcERzdEVycm9yQ29ycmVjdGlvblR5cGUtPmJFbmFibGVIRUMgPSBwU3JjRXJyb3JDb3JyZWN0aW9uVHlwZS0+YkVuYWJsZUhFQzsKKyAgICAgICAgcERzdEVycm9yQ29ycmVjdGlvblR5cGUtPmJFbmFibGVSZXN5bmMgPSBwU3JjRXJyb3JDb3JyZWN0aW9uVHlwZS0+YkVuYWJsZVJlc3luYzsKKyAgICAgICAgcERzdEVycm9yQ29ycmVjdGlvblR5cGUtPm5SZXN5bmNoTWFya2VyU3BhY2luZyA9IHBTcmNFcnJvckNvcnJlY3Rpb25UeXBlLT5uUmVzeW5jaE1hcmtlclNwYWNpbmc7CisgICAgICAgIHBEc3RFcnJvckNvcnJlY3Rpb25UeXBlLT5iRW5hYmxlRGF0YVBhcnRpdGlvbmluZyA9IHBTcmNFcnJvckNvcnJlY3Rpb25UeXBlLT5iRW5hYmxlRGF0YVBhcnRpdGlvbmluZzsKKyAgICAgICAgcERzdEVycm9yQ29ycmVjdGlvblR5cGUtPmJFbmFibGVSVkxDID0gcFNyY0Vycm9yQ29ycmVjdGlvblR5cGUtPmJFbmFibGVSVkxDOworICAgIH0KKyAgICAgICAgYnJlYWs7CisgICAgZGVmYXVsdDoKKyAgICAgICAgcmV0ID0gU0VDX09NWF9WaWRlb0VuY29kZVNldFBhcmFtZXRlcihoQ29tcG9uZW50LCBuSW5kZXgsIHBDb21wb25lbnRQYXJhbWV0ZXJTdHJ1Y3R1cmUpOworICAgICAgICBicmVhazsKKyAgICB9CitFWElUOgorICAgIEZ1bmN0aW9uT3V0KCk7CisKKyAgICByZXR1cm4gcmV0OworfQorCitPTVhfRVJST1JUWVBFIFNFQ19NRkNfTXBlZzRFbmNfR2V0Q29uZmlnKAorICAgIE9NWF9JTiBPTVhfSEFORExFVFlQRSBoQ29tcG9uZW50LAorICAgIE9NWF9JTiBPTVhfSU5ERVhUWVBFICBuSW5kZXgsCisgICAgT01YX0lOIE9NWF9QVFIgICAgICAgIHBDb21wb25lbnRDb25maWdTdHJ1Y3R1cmUpCit7CisgICAgT01YX0VSUk9SVFlQRSAgICAgICAgICAgcmV0ID0gT01YX0Vycm9yTm9uZTsKKyAgICBPTVhfQ09NUE9ORU5UVFlQRSAgICAgKnBPTVhDb21wb25lbnQgPSBOVUxMOworICAgIFNFQ19PTVhfQkFTRUNPTVBPTkVOVCAqcFNFQ0NvbXBvbmVudCA9IE5VTEw7CisKKyAgICBGdW5jdGlvbkluKCk7CisKKyAgICBpZiAoaENvbXBvbmVudCA9PSBOVUxMIHx8IHBDb21wb25lbnRDb25maWdTdHJ1Y3R1cmUgPT0gTlVMTCkgeworICAgICAgICByZXQgPSBPTVhfRXJyb3JCYWRQYXJhbWV0ZXI7CisgICAgICAgIGdvdG8gRVhJVDsKKyAgICB9CisgICAgcE9NWENvbXBvbmVudCA9IChPTVhfQ09NUE9ORU5UVFlQRSAqKWhDb21wb25lbnQ7CisgICAgcmV0ID0gU0VDX09NWF9DaGVja19TaXplVmVyc2lvbihwT01YQ29tcG9uZW50LCBzaXplb2YoT01YX0NPTVBPTkVOVFRZUEUpKTsKKyAgICBpZiAocmV0ICE9IE9NWF9FcnJvck5vbmUpIHsKKyAgICAgICAgZ290byBFWElUOworICAgIH0KKyAgICBpZiAocE9NWENvbXBvbmVudC0+cENvbXBvbmVudFByaXZhdGUgPT0gTlVMTCkgeworICAgICAgICByZXQgPSBPTVhfRXJyb3JCYWRQYXJhbWV0ZXI7CisgICAgICAgIGdvdG8gRVhJVDsKKyAgICB9CisKKyAgICBwU0VDQ29tcG9uZW50ID0gKFNFQ19PTVhfQkFTRUNPTVBPTkVOVCAqKXBPTVhDb21wb25lbnQtPnBDb21wb25lbnRQcml2YXRlOworICAgIGlmIChwU0VDQ29tcG9uZW50LT5jdXJyZW50U3RhdGUgPT0gT01YX1N0YXRlSW52YWxpZCkgeworICAgICAgICByZXQgPSBPTVhfRXJyb3JJbnZhbGlkU3RhdGU7CisgICAgICAgIGdvdG8gRVhJVDsKKyAgICB9CisKKyAgICBzd2l0Y2ggKG5JbmRleCkgeworICAgIGRlZmF1bHQ6CisgICAgICAgIHJldCA9IFNFQ19PTVhfVmlkZW9FbmNvZGVHZXRDb25maWcoaENvbXBvbmVudCwgbkluZGV4LCBwQ29tcG9uZW50Q29uZmlnU3RydWN0dXJlKTsKKyAgICAgICAgYnJlYWs7CisgICAgfQorCitFWElUOgorICAgIEZ1bmN0aW9uT3V0KCk7CisKKyAgICByZXR1cm4gcmV0OworfQorCitPTVhfRVJST1JUWVBFIFNFQ19NRkNfTXBlZzRFbmNfU2V0Q29uZmlnKAorICAgIE9NWF9JTiBPTVhfSEFORExFVFlQRSBoQ29tcG9uZW50LAorICAgIE9NWF9JTiBPTVhfSU5ERVhUWVBFICBuSW5kZXgsCisgICAgT01YX0lOIE9NWF9QVFIgICAgICAgIHBDb21wb25lbnRDb25maWdTdHJ1Y3R1cmUpCit7CisgICAgT01YX0VSUk9SVFlQRSAgICAgICAgICAgcmV0ID0gT01YX0Vycm9yTm9uZTsKKyAgICBPTVhfQ09NUE9ORU5UVFlQRSAgICAgKnBPTVhDb21wb25lbnQgPSBOVUxMOworICAgIFNFQ19PTVhfQkFTRUNPTVBPTkVOVCAqcFNFQ0NvbXBvbmVudCA9IE5VTEw7CisgICAgU0VDX09NWF9WSURFT0VOQ19DT01QT05FTlQgKnBWaWRlb0VuYyA9IE5VTEw7CisgICAgU0VDX01QRUc0RU5DX0hBTkRMRSAgICAgICAgKnBNcGVnNEVuYyA9IE5VTEw7CisKKyAgICBGdW5jdGlvbkluKCk7CisKKyAgICBpZiAoaENvbXBvbmVudCA9PSBOVUxMIHx8IHBDb21wb25lbnRDb25maWdTdHJ1Y3R1cmUgPT0gTlVMTCkgeworICAgICAgICByZXQgPSBPTVhfRXJyb3JCYWRQYXJhbWV0ZXI7CisgICAgICAgIGdvdG8gRVhJVDsKKyAgICB9CisgICAgcE9NWENvbXBvbmVudCA9IChPTVhfQ09NUE9ORU5UVFlQRSAqKWhDb21wb25lbnQ7CisgICAgcmV0ID0gU0VDX09NWF9DaGVja19TaXplVmVyc2lvbihwT01YQ29tcG9uZW50LCBzaXplb2YoT01YX0NPTVBPTkVOVFRZUEUpKTsKKyAgICBpZiAocmV0ICE9IE9NWF9FcnJvck5vbmUpIHsKKyAgICAgICAgZ290byBFWElUOworICAgIH0KKyAgICBpZiAocE9NWENvbXBvbmVudC0+cENvbXBvbmVudFByaXZhdGUgPT0gTlVMTCkgeworICAgICAgICByZXQgPSBPTVhfRXJyb3JCYWRQYXJhbWV0ZXI7CisgICAgICAgIGdvdG8gRVhJVDsKKyAgICB9CisKKyAgICBwU0VDQ29tcG9uZW50ID0gKFNFQ19PTVhfQkFTRUNPTVBPTkVOVCAqKXBPTVhDb21wb25lbnQtPnBDb21wb25lbnRQcml2YXRlOworICAgIGlmIChwU0VDQ29tcG9uZW50LT5jdXJyZW50U3RhdGUgPT0gT01YX1N0YXRlSW52YWxpZCkgeworICAgICAgICByZXQgPSBPTVhfRXJyb3JJbnZhbGlkU3RhdGU7CisgICAgICAgIGdvdG8gRVhJVDsKKyAgICB9CisKKyAgICBwVmlkZW9FbmMgPSAoKFNFQ19PTVhfVklERU9FTkNfQ09NUE9ORU5UICopcFNFQ0NvbXBvbmVudC0+aENvbXBvbmVudEhhbmRsZSk7CisKKyAgICBzd2l0Y2ggKG5JbmRleCkgeworICAgIGNhc2UgT01YX0luZGV4Q29uZmlnVmlkZW9JbnRyYVBlcmlvZDoKKyAgICB7CisgICAgICAgIFNFQ19PTVhfVklERU9FTkNfQ09NUE9ORU5UICpwVkVuY0Jhc2UgPSAoKFNFQ19PTVhfVklERU9FTkNfQ09NUE9ORU5UICopcFNFQ0NvbXBvbmVudC0+aENvbXBvbmVudEhhbmRsZSk7CisgICAgICAgIHBNcGVnNEVuYyA9IChTRUNfTVBFRzRFTkNfSEFORExFICopKChTRUNfT01YX1ZJREVPRU5DX0NPTVBPTkVOVCAqKXBTRUNDb21wb25lbnQtPmhDb21wb25lbnRIYW5kbGUpLT5oQ29kZWNIYW5kbGU7CisgICAgICAgIE9NWF9VMzIgblBGcmFtZXMgPSAoKigoT01YX1UzMiAqKXBDb21wb25lbnRDb25maWdTdHJ1Y3R1cmUpKSAtIDE7CisKKyAgICAgICAgaWYgKHBNcGVnNEVuYy0+aE1GQ01wZWc0SGFuZGxlLmNvZGVjVHlwZSA9PSBDT0RFQ19UWVBFX01QRUc0KQorICAgICAgICAgICAgcE1wZWc0RW5jLT5tcGVnNENvbXBvbmVudFtPVVRQVVRfUE9SVF9JTkRFWF0ublBGcmFtZXMgPSBuUEZyYW1lczsKKyAgICAgICAgZWxzZQorICAgICAgICAgICAgcE1wZWc0RW5jLT5oMjYzQ29tcG9uZW50W09VVFBVVF9QT1JUX0lOREVYXS5uUEZyYW1lcyA9IG5QRnJhbWVzOworCisgICAgICAgIHJldCA9IE9NWF9FcnJvck5vbmU7CisgICAgfQorICAgICAgICBicmVhazsKKyAgICBkZWZhdWx0OgorICAgICAgICByZXQgPSBTRUNfT01YX1ZpZGVvRW5jb2RlU2V0Q29uZmlnKGhDb21wb25lbnQsIG5JbmRleCwgcENvbXBvbmVudENvbmZpZ1N0cnVjdHVyZSk7CisgICAgICAgIGJyZWFrOworICAgIH0KKworRVhJVDoKKyAgICBpZiAocmV0ID09IE9NWF9FcnJvck5vbmUpCisgICAgICAgIHBWaWRlb0VuYy0+Y29uZmlnQ2hhbmdlID0gT01YX1RSVUU7CisKKyAgICBGdW5jdGlvbk91dCgpOworCisgICAgcmV0dXJuIHJldDsKK30KKworT01YX0VSUk9SVFlQRSBTRUNfTUZDX01wZWc0RW5jX0dldEV4dGVuc2lvbkluZGV4KAorICAgIE9NWF9JTiBPTVhfSEFORExFVFlQRSAgaENvbXBvbmVudCwKKyAgICBPTVhfSU4gT01YX1NUUklORyAgICAgIGNQYXJhbWV0ZXJOYW1lLAorICAgIE9NWF9PVVQgT01YX0lOREVYVFlQRSAqcEluZGV4VHlwZSkKK3sKKyAgICBPTVhfRVJST1JUWVBFICAgICAgICAgICByZXQgPSBPTVhfRXJyb3JOb25lOworICAgIE9NWF9DT01QT05FTlRUWVBFICAgICAqcE9NWENvbXBvbmVudCA9IE5VTEw7CisgICAgU0VDX09NWF9CQVNFQ09NUE9ORU5UICpwU0VDQ29tcG9uZW50ID0gTlVMTDsKKworICAgIEZ1bmN0aW9uSW4oKTsKKworICAgIGlmIChoQ29tcG9uZW50ID09IE5VTEwpIHsKKyAgICAgICAgcmV0ID0gT01YX0Vycm9yQmFkUGFyYW1ldGVyOworICAgICAgICBnb3RvIEVYSVQ7CisgICAgfQorICAgIHBPTVhDb21wb25lbnQgPSAoT01YX0NPTVBPTkVOVFRZUEUgKiloQ29tcG9uZW50OworICAgIHJldCA9IFNFQ19PTVhfQ2hlY2tfU2l6ZVZlcnNpb24ocE9NWENvbXBvbmVudCwgc2l6ZW9mKE9NWF9DT01QT05FTlRUWVBFKSk7CisgICAgaWYgKHJldCAhPSBPTVhfRXJyb3JOb25lKSB7CisgICAgICAgIGdvdG8gRVhJVDsKKyAgICB9CisKKyAgICBpZiAocE9NWENvbXBvbmVudC0+cENvbXBvbmVudFByaXZhdGUgPT0gTlVMTCkgeworICAgICAgICByZXQgPSBPTVhfRXJyb3JCYWRQYXJhbWV0ZXI7CisgICAgICAgIGdvdG8gRVhJVDsKKyAgICB9CisgICAgcFNFQ0NvbXBvbmVudCA9IChTRUNfT01YX0JBU0VDT01QT05FTlQgKilwT01YQ29tcG9uZW50LT5wQ29tcG9uZW50UHJpdmF0ZTsKKworICAgIGlmICgoY1BhcmFtZXRlck5hbWUgPT0gTlVMTCkgfHwgKHBJbmRleFR5cGUgPT0gTlVMTCkpIHsKKyAgICAgICAgcmV0ID0gT01YX0Vycm9yQmFkUGFyYW1ldGVyOworICAgICAgICBnb3RvIEVYSVQ7CisgICAgfQorICAgIGlmIChwU0VDQ29tcG9uZW50LT5jdXJyZW50U3RhdGUgPT0gT01YX1N0YXRlSW52YWxpZCkgeworICAgICAgICByZXQgPSBPTVhfRXJyb3JJbnZhbGlkU3RhdGU7CisgICAgICAgIGdvdG8gRVhJVDsKKyAgICB9CisgICAgaWYgKFNFQ19PU0FMX1N0cmNtcChjUGFyYW1ldGVyTmFtZSwgU0VDX0lOREVYX0NPTkZJR19WSURFT19JTlRSQVBFUklPRCkgPT0gMCkgeworICAgICAgICAqcEluZGV4VHlwZSA9IE9NWF9JbmRleENvbmZpZ1ZpZGVvSW50cmFQZXJpb2Q7CisgICAgICAgIHJldCA9IE9NWF9FcnJvck5vbmU7CisgICAgfSBlbHNlIHsKKyAgICAgICAgcmV0ID0gU0VDX09NWF9WaWRlb0VuY29kZUdldEV4dGVuc2lvbkluZGV4KGhDb21wb25lbnQsIGNQYXJhbWV0ZXJOYW1lLCBwSW5kZXhUeXBlKTsKKyAgICB9CitFWElUOgorICAgIEZ1bmN0aW9uT3V0KCk7CisKKyAgICByZXR1cm4gcmV0OworfQorCitPTVhfRVJST1JUWVBFIFNFQ19NRkNfTXBlZzRFbmNfQ29tcG9uZW50Um9sZUVudW0oCisgICAgT01YX0lOICBPTVhfSEFORExFVFlQRSBoQ29tcG9uZW50LAorICAgIE9NWF9PVVQgT01YX1U4ICAgICAgICAqY1JvbGUsCisgICAgT01YX0lOICBPTVhfVTMyICAgICAgICBuSW5kZXgpCit7CisgICAgT01YX0VSUk9SVFlQRSAgICAgICAgICAgIHJldCA9IE9NWF9FcnJvck5vbmU7CisgICAgT01YX0NPTVBPTkVOVFRZUEUgICAgICAgKnBPTVhDb21wb25lbnQgPSBOVUxMOworICAgIFNFQ19PTVhfQkFTRUNPTVBPTkVOVCAgICpwU0VDQ29tcG9uZW50ID0gTlVMTDsKKyAgICBPTVhfUzMyICAgICAgICAgICAgICAgICAgY29kZWNUeXBlOworCisgICAgRnVuY3Rpb25JbigpOworCisgICAgaWYgKChoQ29tcG9uZW50ID09IE5VTEwpIHx8IChjUm9sZSA9PSBOVUxMKSkgeworICAgICAgICByZXQgPSBPTVhfRXJyb3JCYWRQYXJhbWV0ZXI7CisgICAgICAgIGdvdG8gRVhJVDsKKyAgICB9CisgICAgaWYgKG5JbmRleCAhPSAoTUFYX0NPTVBPTkVOVF9ST0xFX05VTSAtIDEpKSB7CisgICAgICAgIHJldCA9IE9NWF9FcnJvck5vTW9yZTsKKyAgICAgICAgZ290byBFWElUOworICAgIH0KKyAgICBwT01YQ29tcG9uZW50ID0gKE9NWF9DT01QT05FTlRUWVBFICopaENvbXBvbmVudDsKKyAgICByZXQgPSBTRUNfT01YX0NoZWNrX1NpemVWZXJzaW9uKHBPTVhDb21wb25lbnQsIHNpemVvZihPTVhfQ09NUE9ORU5UVFlQRSkpOworICAgIGlmIChyZXQgIT0gT01YX0Vycm9yTm9uZSkgeworICAgICAgICBnb3RvIEVYSVQ7CisgICAgfQorICAgIGlmIChwT01YQ29tcG9uZW50LT5wQ29tcG9uZW50UHJpdmF0ZSA9PSBOVUxMKSB7CisgICAgICAgIHJldCA9IE9NWF9FcnJvckJhZFBhcmFtZXRlcjsKKyAgICAgICAgZ290byBFWElUOworICAgIH0KKworICAgIHBTRUNDb21wb25lbnQgPSAoU0VDX09NWF9CQVNFQ09NUE9ORU5UICopcE9NWENvbXBvbmVudC0+cENvbXBvbmVudFByaXZhdGU7CisgICAgaWYgKHBTRUNDb21wb25lbnQtPmN1cnJlbnRTdGF0ZSA9PSBPTVhfU3RhdGVJbnZhbGlkICkgeworICAgICAgICByZXQgPSBPTVhfRXJyb3JJbnZhbGlkU3RhdGU7CisgICAgICAgIGdvdG8gRVhJVDsKKyAgICB9CisKKyAgICBjb2RlY1R5cGUgPSAoKFNFQ19NUEVHNEVOQ19IQU5ETEUgKikoKChTRUNfT01YX1ZJREVPRU5DX0NPTVBPTkVOVCAqKXBTRUNDb21wb25lbnQtPmhDb21wb25lbnRIYW5kbGUpLT5oQ29kZWNIYW5kbGUpKS0+aE1GQ01wZWc0SGFuZGxlLmNvZGVjVHlwZTsKKyAgICBpZiAoY29kZWNUeXBlID09IENPREVDX1RZUEVfTVBFRzQpCisgICAgICAgIFNFQ19PU0FMX1N0cmNweSgoY2hhciAqKWNSb2xlLCBTRUNfT01YX0NPTVBPTkVOVF9NUEVHNF9FTkNfUk9MRSk7CisgICAgZWxzZQorICAgICAgICBTRUNfT1NBTF9TdHJjcHkoKGNoYXIgKiljUm9sZSwgU0VDX09NWF9DT01QT05FTlRfSDI2M19FTkNfUk9MRSk7CisKK0VYSVQ6CisgICAgRnVuY3Rpb25PdXQoKTsKKworICAgIHJldHVybiByZXQ7Cit9CisKK09NWF9FUlJPUlRZUEUgU0VDX01GQ19FbmNvZGVUaHJlYWQoT01YX0hBTkRMRVRZUEUgaENvbXBvbmVudCkKK3sKKyAgICBPTVhfRVJST1JUWVBFICAgICAgICAgIHJldCA9IE9NWF9FcnJvck5vbmU7CisgICAgT01YX0NPTVBPTkVOVFRZUEUgICAgICpwT01YQ29tcG9uZW50ID0gKE9NWF9DT01QT05FTlRUWVBFICopaENvbXBvbmVudDsKKyAgICBTRUNfT01YX0JBU0VDT01QT05FTlQgKnBTRUNDb21wb25lbnQgPSAoU0VDX09NWF9CQVNFQ09NUE9ORU5UICopcE9NWENvbXBvbmVudC0+cENvbXBvbmVudFByaXZhdGU7CisgICAgU0VDX09NWF9WSURFT0VOQ19DT01QT05FTlQgKnBWaWRlb0VuYyA9IChTRUNfT01YX1ZJREVPRU5DX0NPTVBPTkVOVCAqKXBTRUNDb21wb25lbnQtPmhDb21wb25lbnRIYW5kbGU7CisgICAgU0VDX01QRUc0RU5DX0hBTkRMRSAgICpwTXBlZzRFbmMgPSAoU0VDX01QRUc0RU5DX0hBTkRMRSAqKSgoU0VDX09NWF9WSURFT0VOQ19DT01QT05FTlQgKilwU0VDQ29tcG9uZW50LT5oQ29tcG9uZW50SGFuZGxlKS0+aENvZGVjSGFuZGxlOworCisgICAgRnVuY3Rpb25JbigpOworCisgICAgaWYgKGhDb21wb25lbnQgPT0gTlVMTCkgeworICAgICAgICByZXQgPSBPTVhfRXJyb3JCYWRQYXJhbWV0ZXI7CisgICAgICAgIGdvdG8gRVhJVDsKKyAgICB9CisKKyAgICB3aGlsZSAocFZpZGVvRW5jLT5OQkVuY1RocmVhZC5iRXhpdEVuY29kZVRocmVhZCA9PSBPTVhfRkFMU0UpIHsKKyAgICAgICAgU0VDX09TQUxfU2VtYXBob3JlV2FpdChwVmlkZW9FbmMtPk5CRW5jVGhyZWFkLmhFbmNGcmFtZVN0YXJ0KTsKKworICAgICAgICBpZiAocFZpZGVvRW5jLT5OQkVuY1RocmVhZC5iRXhpdEVuY29kZVRocmVhZCA9PSBPTVhfRkFMU0UpIHsKKyAgICAgICAgICAgIHBNcGVnNEVuYy0+aE1GQ01wZWc0SGFuZGxlLnJldHVybkNvZGVjID0gU3NiU2lwTWZjRW5jRXhlKHBNcGVnNEVuYy0+aE1GQ01wZWc0SGFuZGxlLmhNRkNIYW5kbGUpOworICAgICAgICAgICAgU0VDX09TQUxfU2VtYXBob3JlUG9zdChwVmlkZW9FbmMtPk5CRW5jVGhyZWFkLmhFbmNGcmFtZUVuZCk7CisgICAgICAgIH0KKyAgICB9CisKK0VYSVQ6CisgICAgRnVuY3Rpb25PdXQoKTsKKyAgICBTRUNfT1NBTF9UaHJlYWRFeGl0KE5VTEwpOworCisgICAgcmV0dXJuIHJldDsKK30KKworLyogTUZDIEluaXQgKi8KK09NWF9FUlJPUlRZUEUgU0VDX01GQ19NcGVnNEVuY19Jbml0KE9NWF9DT01QT05FTlRUWVBFICpwT01YQ29tcG9uZW50KQoreworICAgIE9NWF9FUlJPUlRZUEUgICAgICAgICAgICAgIHJldCA9IE9NWF9FcnJvck5vbmU7CisgICAgU0VDX09NWF9CQVNFQ09NUE9ORU5UICAgICAqcFNFQ0NvbXBvbmVudCA9IChTRUNfT01YX0JBU0VDT01QT05FTlQgKilwT01YQ29tcG9uZW50LT5wQ29tcG9uZW50UHJpdmF0ZTsKKyAgICBTRUNfT01YX1ZJREVPRU5DX0NPTVBPTkVOVCAqcFZpZGVvRW5jID0gKChTRUNfT01YX1ZJREVPRU5DX0NPTVBPTkVOVCAqKXBTRUNDb21wb25lbnQtPmhDb21wb25lbnRIYW5kbGUpOworICAgIFNFQ19PTVhfQkFTRVBPUlQgICAgICAgICAgKnBTRUNJbnB1dFBvcnQgPSAmcFNFQ0NvbXBvbmVudC0+cFNFQ1BvcnRbSU5QVVRfUE9SVF9JTkRFWF07CisgICAgU0VDX01QRUc0RU5DX0hBTkRMRSAgICAgICAqcE1wZWc0RW5jID0gTlVMTDsKKyAgICBPTVhfSEFORExFVFlQRSAgICAgICAgICAgICBoTUZDSGFuZGxlID0gTlVMTDsKKyAgICBPTVhfUzMyICAgICAgICAgICAgICAgICAgICByZXR1cm5Db2RlYyA9IDA7CisgICAgQ1NDX01FVEhPRCBjc2NfbWV0aG9kID0gQ1NDX01FVEhPRF9TVzsKKworICAgIEZ1bmN0aW9uSW4oKTsKKworICAgIHBNcGVnNEVuYyA9IChTRUNfTVBFRzRFTkNfSEFORExFICopKChTRUNfT01YX1ZJREVPRU5DX0NPTVBPTkVOVCAqKXBTRUNDb21wb25lbnQtPmhDb21wb25lbnRIYW5kbGUpLT5oQ29kZWNIYW5kbGU7CisgICAgcE1wZWc0RW5jLT5oTUZDTXBlZzRIYW5kbGUuYkNvbmZpZ3VyZWRNRkMgPSBPTVhfRkFMU0U7CisgICAgcFNFQ0NvbXBvbmVudC0+YlVzZUZsYWdFT0YgPSBPTVhfRkFMU0U7CisgICAgcFNFQ0NvbXBvbmVudC0+YlNhdmVGbGFnRU9TID0gT01YX0ZBTFNFOworCisgICAgLyogTUZDKE11bHRpIEZvcm1hdCBDb2RlYykgZW5jb2RlciBhbmQgQ01NKENvZGVjIE1lbW9yeSBNYW5hZ2VtZW50KSBkcml2ZXIgb3BlbiAqLworICAgIHN3aXRjaCAocFNFQ0lucHV0UG9ydC0+cG9ydERlZmluaXRpb24uZm9ybWF0LnZpZGVvLmVDb2xvckZvcm1hdCkgeworICAgIGNhc2UgT01YX1NFQ19DT0xPUl9Gb3JtYXROVjEyVFBoeXNpY2FsQWRkcmVzczoKKyAgICBjYXNlIE9NWF9TRUNfQ09MT1JfRm9ybWF0TlYxMkxQaHlzaWNhbEFkZHJlc3M6CisgICAgY2FzZSBPTVhfU0VDX0NPTE9SX0Zvcm1hdE5WMTJMVmlydHVhbEFkZHJlc3M6CisgICAgY2FzZSBPTVhfU0VDX0NPTE9SX0Zvcm1hdE5WMjFMUGh5c2ljYWxBZGRyZXNzOgorICAgICAgICBoTUZDSGFuZGxlID0gKE9NWF9QVFIpU3NiU2lwTWZjRW5jT3BlbigpOworICAgICAgICBicmVhazsKKyAgICBkZWZhdWx0OiB7CisgICAgICAgIFNTQklQX01GQ19CVUZGRVJfVFlQRSBidWZfdHlwZSA9IENBQ0hFOworICAgICAgICBoTUZDSGFuZGxlID0gKE9NWF9QVFIpU3NiU2lwTWZjRW5jT3BlbkV4dCgmYnVmX3R5cGUpOworICAgICAgICBicmVhazsKKyAgICB9CisgICAgfQorCisgICAgaWYgKGhNRkNIYW5kbGUgPT0gTlVMTCkgeworICAgICAgICByZXQgPSBPTVhfRXJyb3JJbnN1ZmZpY2llbnRSZXNvdXJjZXM7CisgICAgICAgIGdvdG8gRVhJVDsKKyAgICB9CisgICAgcE1wZWc0RW5jLT5oTUZDTXBlZzRIYW5kbGUuaE1GQ0hhbmRsZSA9IGhNRkNIYW5kbGU7CisKKyAgICAvKiBzZXQgTUZDIEVOQyBWSURFTyBQQVJBTSBhbmQgaW5pdGlhbGl6ZSBNRkMgZW5jb2RlciBpbnN0YW5jZSAqLworICAgIGlmIChwTXBlZzRFbmMtPmhNRkNNcGVnNEhhbmRsZS5jb2RlY1R5cGUgPT0gQ09ERUNfVFlQRV9NUEVHNCkgeworICAgICAgICBTZXRfTXBlZzRFbmNfUGFyYW0oJihwTXBlZzRFbmMtPmhNRkNNcGVnNEhhbmRsZS5tcGVnNE1GQ1BhcmFtKSwgcFNFQ0NvbXBvbmVudCk7CisgICAgICAgIHJldHVybkNvZGVjID0gU3NiU2lwTWZjRW5jSW5pdChoTUZDSGFuZGxlLCAmKHBNcGVnNEVuYy0+aE1GQ01wZWc0SGFuZGxlLm1wZWc0TUZDUGFyYW0pKTsKKyAgICB9IGVsc2UgeworICAgICAgICBTZXRfSDI2M0VuY19QYXJhbSgmKHBNcGVnNEVuYy0+aE1GQ01wZWc0SGFuZGxlLmgyNjNNRkNQYXJhbSksIHBTRUNDb21wb25lbnQpOworICAgICAgICByZXR1cm5Db2RlYyA9IFNzYlNpcE1mY0VuY0luaXQoaE1GQ0hhbmRsZSwgJihwTXBlZzRFbmMtPmhNRkNNcGVnNEhhbmRsZS5oMjYzTUZDUGFyYW0pKTsKKyAgICB9CisgICAgaWYgKHJldHVybkNvZGVjICE9IE1GQ19SRVRfT0spIHsKKyAgICAgICAgcmV0ID0gT01YX0Vycm9ySW5zdWZmaWNpZW50UmVzb3VyY2VzOworICAgICAgICBnb3RvIEVYSVQ7CisgICAgfQorCisgICAgLyogQWxsb2NhdGUgZW5jb2RlcidzIGlucHV0IGJ1ZmZlciAqLworICAgIHJldHVybkNvZGVjID0gU3NiU2lwTWZjRW5jR2V0SW5CdWYoaE1GQ0hhbmRsZSwgJihwTXBlZzRFbmMtPmhNRkNNcGVnNEhhbmRsZS5pbnB1dEluZm8pKTsKKyAgICBpZiAocmV0dXJuQ29kZWMgIT0gTUZDX1JFVF9PSykgeworICAgICAgICByZXQgPSBPTVhfRXJyb3JJbnN1ZmZpY2llbnRSZXNvdXJjZXM7CisgICAgICAgIGdvdG8gRVhJVDsKKyAgICB9CisgICAgcFZpZGVvRW5jLT5NRkNFbmNJbnB1dEJ1ZmZlclswXS5ZUGh5QWRkciA9IHBNcGVnNEVuYy0+aE1GQ01wZWc0SGFuZGxlLmlucHV0SW5mby5ZUGh5QWRkcjsKKyAgICBwVmlkZW9FbmMtPk1GQ0VuY0lucHV0QnVmZmVyWzBdLkNQaHlBZGRyID0gcE1wZWc0RW5jLT5oTUZDTXBlZzRIYW5kbGUuaW5wdXRJbmZvLkNQaHlBZGRyOworICAgIHBWaWRlb0VuYy0+TUZDRW5jSW5wdXRCdWZmZXJbMF0uWVZpckFkZHIgPSBwTXBlZzRFbmMtPmhNRkNNcGVnNEhhbmRsZS5pbnB1dEluZm8uWVZpckFkZHI7CisgICAgcFZpZGVvRW5jLT5NRkNFbmNJbnB1dEJ1ZmZlclswXS5DVmlyQWRkciA9IHBNcGVnNEVuYy0+aE1GQ01wZWc0SGFuZGxlLmlucHV0SW5mby5DVmlyQWRkcjsKKyAgICBwVmlkZW9FbmMtPk1GQ0VuY0lucHV0QnVmZmVyWzBdLllCdWZmZXJTaXplID0gcE1wZWc0RW5jLT5oTUZDTXBlZzRIYW5kbGUuaW5wdXRJbmZvLllTaXplOworICAgIHBWaWRlb0VuYy0+TUZDRW5jSW5wdXRCdWZmZXJbMF0uQ0J1ZmZlclNpemUgPSBwTXBlZzRFbmMtPmhNRkNNcGVnNEhhbmRsZS5pbnB1dEluZm8uQ1NpemU7CisgICAgcFZpZGVvRW5jLT5NRkNFbmNJbnB1dEJ1ZmZlclswXS5ZRGF0YVNpemUgPSAwOworICAgIHBWaWRlb0VuYy0+TUZDRW5jSW5wdXRCdWZmZXJbMF0uQ0RhdGFTaXplID0gMDsKKyAgICBTRUNfT1NBTF9Mb2coU0VDX0xPR19UUkFDRSwgInBNcGVnNEVuYy0+aE1GQ01wZWc0SGFuZGxlLmlucHV0SW5mby5ZVmlyQWRkciA6IDB4JXgiLCBwTXBlZzRFbmMtPmhNRkNNcGVnNEhhbmRsZS5pbnB1dEluZm8uWVZpckFkZHIpOworICAgIFNFQ19PU0FMX0xvZyhTRUNfTE9HX1RSQUNFLCAicE1wZWc0RW5jLT5oTUZDTXBlZzRIYW5kbGUuaW5wdXRJbmZvLkNWaXJBZGRyIDogMHgleCIsIHBNcGVnNEVuYy0+aE1GQ01wZWc0SGFuZGxlLmlucHV0SW5mby5DVmlyQWRkcik7CisKKyAgICByZXR1cm5Db2RlYyA9IFNzYlNpcE1mY0VuY0dldEluQnVmKGhNRkNIYW5kbGUsICYocE1wZWc0RW5jLT5oTUZDTXBlZzRIYW5kbGUuaW5wdXRJbmZvKSk7CisgICAgaWYgKHJldHVybkNvZGVjICE9IE1GQ19SRVRfT0spIHsKKyAgICAgICAgcmV0ID0gT01YX0Vycm9ySW5zdWZmaWNpZW50UmVzb3VyY2VzOworICAgICAgICBnb3RvIEVYSVQ7CisgICAgfQorICAgIHBWaWRlb0VuYy0+TUZDRW5jSW5wdXRCdWZmZXJbMV0uWVBoeUFkZHIgPSBwTXBlZzRFbmMtPmhNRkNNcGVnNEhhbmRsZS5pbnB1dEluZm8uWVBoeUFkZHI7CisgICAgcFZpZGVvRW5jLT5NRkNFbmNJbnB1dEJ1ZmZlclsxXS5DUGh5QWRkciA9IHBNcGVnNEVuYy0+aE1GQ01wZWc0SGFuZGxlLmlucHV0SW5mby5DUGh5QWRkcjsKKyAgICBwVmlkZW9FbmMtPk1GQ0VuY0lucHV0QnVmZmVyWzFdLllWaXJBZGRyID0gcE1wZWc0RW5jLT5oTUZDTXBlZzRIYW5kbGUuaW5wdXRJbmZvLllWaXJBZGRyOworICAgIHBWaWRlb0VuYy0+TUZDRW5jSW5wdXRCdWZmZXJbMV0uQ1ZpckFkZHIgPSBwTXBlZzRFbmMtPmhNRkNNcGVnNEhhbmRsZS5pbnB1dEluZm8uQ1ZpckFkZHI7CisgICAgcFZpZGVvRW5jLT5NRkNFbmNJbnB1dEJ1ZmZlclsxXS5ZQnVmZmVyU2l6ZSA9IHBNcGVnNEVuYy0+aE1GQ01wZWc0SGFuZGxlLmlucHV0SW5mby5ZU2l6ZTsKKyAgICBwVmlkZW9FbmMtPk1GQ0VuY0lucHV0QnVmZmVyWzFdLkNCdWZmZXJTaXplID0gcE1wZWc0RW5jLT5oTUZDTXBlZzRIYW5kbGUuaW5wdXRJbmZvLkNTaXplOworICAgIHBWaWRlb0VuYy0+TUZDRW5jSW5wdXRCdWZmZXJbMV0uWURhdGFTaXplID0gMDsKKyAgICBwVmlkZW9FbmMtPk1GQ0VuY0lucHV0QnVmZmVyWzFdLkNEYXRhU2l6ZSA9IDA7CisgICAgU0VDX09TQUxfTG9nKFNFQ19MT0dfVFJBQ0UsICJwTXBlZzRFbmMtPmhNRkNNcGVnNEhhbmRsZS5pbnB1dEluZm8uWVZpckFkZHIgOiAweCV4IiwgcE1wZWc0RW5jLT5oTUZDTXBlZzRIYW5kbGUuaW5wdXRJbmZvLllWaXJBZGRyKTsKKyAgICBTRUNfT1NBTF9Mb2coU0VDX0xPR19UUkFDRSwgInBNcGVnNEVuYy0+aE1GQ01wZWc0SGFuZGxlLmlucHV0SW5mby5DVmlyQWRkciA6IDB4JXgiLCBwTXBlZzRFbmMtPmhNRkNNcGVnNEhhbmRsZS5pbnB1dEluZm8uQ1ZpckFkZHIpOworCisgICAgcFZpZGVvRW5jLT5pbmRleElucHV0QnVmZmVyID0gMDsKKworICAgIHBWaWRlb0VuYy0+YkZpcnN0RnJhbWUgPSBPTVhfVFJVRTsKKworI2lmZGVmIE5PTkJMT0NLX01PREVfUFJPQ0VTUworICAgIHBWaWRlb0VuYy0+TkJFbmNUaHJlYWQuYkV4aXRFbmNvZGVUaHJlYWQgPSBPTVhfRkFMU0U7CisgICAgcFZpZGVvRW5jLT5OQkVuY1RocmVhZC5iRW5jb2RlclJ1biA9IE9NWF9GQUxTRTsKKyAgICBTRUNfT1NBTF9TZW1hcGhvcmVDcmVhdGUoJihwVmlkZW9FbmMtPk5CRW5jVGhyZWFkLmhFbmNGcmFtZVN0YXJ0KSk7CisgICAgU0VDX09TQUxfU2VtYXBob3JlQ3JlYXRlKCYocFZpZGVvRW5jLT5OQkVuY1RocmVhZC5oRW5jRnJhbWVFbmQpKTsKKyAgICBpZiAoT01YX0Vycm9yTm9uZSA9PSBTRUNfT1NBTF9UaHJlYWRDcmVhdGUoJnBWaWRlb0VuYy0+TkJFbmNUaHJlYWQuaE5CRW5jb2RlVGhyZWFkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU0VDX01GQ19FbmNvZGVUaHJlYWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwT01YQ29tcG9uZW50KSkgeworICAgICAgICBwTXBlZzRFbmMtPmhNRkNNcGVnNEhhbmRsZS5yZXR1cm5Db2RlYyA9IE1GQ19SRVRfT0s7CisgICAgfQorI2VuZGlmCisgICAgU0VDX09TQUxfTWVtc2V0KHBTRUNDb21wb25lbnQtPnRpbWVTdGFtcCwgLTE5NzcxMDAzLCBzaXplb2YoT01YX1RJQ0tTKSAqIE1BWF9USU1FU1RBTVApOworICAgIFNFQ19PU0FMX01lbXNldChwU0VDQ29tcG9uZW50LT5uRmxhZ3MsIDAsIHNpemVvZihPTVhfVTMyKSAqIE1BWF9GTEFHUyk7CisgICAgcE1wZWc0RW5jLT5oTUZDTXBlZzRIYW5kbGUuaW5kZXhUaW1lc3RhbXAgPSAwOworCisgICAgcFZpZGVvRW5jLT5jc2NfaGFuZGxlID0gY3NjX2luaXQoJmNzY19tZXRob2QpOworCitFWElUOgorICAgIEZ1bmN0aW9uT3V0KCk7CisKKyAgICByZXR1cm4gcmV0OworfQorCisvKiBNRkMgVGVybWluYXRlICovCitPTVhfRVJST1JUWVBFIFNFQ19NRkNfTXBlZzRFbmNfVGVybWluYXRlKE9NWF9DT01QT05FTlRUWVBFICpwT01YQ29tcG9uZW50KQoreworICAgIE9NWF9FUlJPUlRZUEUgICAgICAgICAgcmV0ID0gT01YX0Vycm9yTm9uZTsKKyAgICBTRUNfT01YX0JBU0VDT01QT05FTlQgKnBTRUNDb21wb25lbnQgPSAoU0VDX09NWF9CQVNFQ09NUE9ORU5UICopcE9NWENvbXBvbmVudC0+cENvbXBvbmVudFByaXZhdGU7CisgICAgU0VDX09NWF9WSURFT0VOQ19DT01QT05FTlQgKnBWaWRlb0VuYyA9ICgoU0VDX09NWF9WSURFT0VOQ19DT01QT05FTlQgKilwU0VDQ29tcG9uZW50LT5oQ29tcG9uZW50SGFuZGxlKTsKKyAgICBTRUNfTVBFRzRFTkNfSEFORExFICAgKnBNcGVnNEVuYyA9IE5VTEw7CisgICAgT01YX0hBTkRMRVRZUEUgICAgICAgICBoTUZDSGFuZGxlID0gTlVMTDsKKworICAgIEZ1bmN0aW9uSW4oKTsKKworICAgIHBNcGVnNEVuYyA9IChTRUNfTVBFRzRFTkNfSEFORExFICopKChTRUNfT01YX1ZJREVPRU5DX0NPTVBPTkVOVCAqKXBTRUNDb21wb25lbnQtPmhDb21wb25lbnRIYW5kbGUpLT5oQ29kZWNIYW5kbGU7CisjaWZkZWYgTk9OQkxPQ0tfTU9ERV9QUk9DRVNTCisgICAgaWYgKHBWaWRlb0VuYy0+TkJFbmNUaHJlYWQuaE5CRW5jb2RlVGhyZWFkICE9IE5VTEwpIHsKKyAgICAgICAgcFZpZGVvRW5jLT5OQkVuY1RocmVhZC5iRXhpdEVuY29kZVRocmVhZCA9IE9NWF9UUlVFOworICAgICAgICBTRUNfT1NBTF9TZW1hcGhvcmVQb3N0KHBWaWRlb0VuYy0+TkJFbmNUaHJlYWQuaEVuY0ZyYW1lU3RhcnQpOworICAgICAgICBTRUNfT1NBTF9UaHJlYWRUZXJtaW5hdGUocFZpZGVvRW5jLT5OQkVuY1RocmVhZC5oTkJFbmNvZGVUaHJlYWQpOworICAgICAgICBwVmlkZW9FbmMtPk5CRW5jVGhyZWFkLmhOQkVuY29kZVRocmVhZCA9IE5VTEw7CisgICAgfQorCisgICAgaWYocFZpZGVvRW5jLT5OQkVuY1RocmVhZC5oRW5jRnJhbWVFbmQgIT0gTlVMTCkgeworICAgICAgICBTRUNfT1NBTF9TZW1hcGhvcmVUZXJtaW5hdGUocFZpZGVvRW5jLT5OQkVuY1RocmVhZC5oRW5jRnJhbWVFbmQpOworICAgICAgICBwVmlkZW9FbmMtPk5CRW5jVGhyZWFkLmhFbmNGcmFtZUVuZCA9IE5VTEw7CisgICAgfQorCisgICAgaWYocFZpZGVvRW5jLT5OQkVuY1RocmVhZC5oRW5jRnJhbWVTdGFydCAhPSBOVUxMKSB7CisgICAgICAgIFNFQ19PU0FMX1NlbWFwaG9yZVRlcm1pbmF0ZShwVmlkZW9FbmMtPk5CRW5jVGhyZWFkLmhFbmNGcmFtZVN0YXJ0KTsKKyAgICAgICAgcFZpZGVvRW5jLT5OQkVuY1RocmVhZC5oRW5jRnJhbWVTdGFydCA9IE5VTEw7CisgICAgfQorI2VuZGlmCisKKyAgICBoTUZDSGFuZGxlID0gcE1wZWc0RW5jLT5oTUZDTXBlZzRIYW5kbGUuaE1GQ0hhbmRsZTsKKyAgICBpZiAoaE1GQ0hhbmRsZSAhPSBOVUxMKSB7CisgICAgICAgIFNzYlNpcE1mY0VuY0Nsb3NlKGhNRkNIYW5kbGUpOworICAgICAgICBoTUZDSGFuZGxlID0gcE1wZWc0RW5jLT5oTUZDTXBlZzRIYW5kbGUuaE1GQ0hhbmRsZSA9IE5VTEw7CisgICAgfQorCisgICAgaWYgKHBWaWRlb0VuYy0+Y3NjX2hhbmRsZSAhPSBOVUxMKSB7CisgICAgICAgIGNzY19kZWluaXQocFZpZGVvRW5jLT5jc2NfaGFuZGxlKTsKKyAgICAgICAgcFZpZGVvRW5jLT5jc2NfaGFuZGxlID0gTlVMTDsKKyAgICB9CisKK0VYSVQ6CisgICAgRnVuY3Rpb25PdXQoKTsKKworICAgIHJldHVybiByZXQ7Cit9CisKK09NWF9FUlJPUlRZUEUgU0VDX01GQ19NcGVnNF9FbmNvZGVfTm9uYmxvY2soT01YX0NPTVBPTkVOVFRZUEUgKnBPTVhDb21wb25lbnQsIFNFQ19PTVhfREFUQSAqcElucHV0RGF0YSwgU0VDX09NWF9EQVRBICpwT3V0cHV0RGF0YSkKK3sKKyAgICBPTVhfRVJST1JUWVBFICAgICAgICAgICAgICByZXQgPSBPTVhfRXJyb3JOb25lOworICAgIFNFQ19PTVhfQkFTRUNPTVBPTkVOVCAgICAgKnBTRUNDb21wb25lbnQgPSAoU0VDX09NWF9CQVNFQ09NUE9ORU5UICopcE9NWENvbXBvbmVudC0+cENvbXBvbmVudFByaXZhdGU7CisgICAgU0VDX09NWF9WSURFT0VOQ19DT01QT05FTlQgKnBWaWRlb0VuYyA9ICgoU0VDX09NWF9WSURFT0VOQ19DT01QT05FTlQgKilwU0VDQ29tcG9uZW50LT5oQ29tcG9uZW50SGFuZGxlKTsKKyAgICBTRUNfTVBFRzRFTkNfSEFORExFICAgICAgICpwTXBlZzRFbmMgPSAoU0VDX01QRUc0RU5DX0hBTkRMRSAqKSgoU0VDX09NWF9WSURFT0VOQ19DT01QT05FTlQgKilwU0VDQ29tcG9uZW50LT5oQ29tcG9uZW50SGFuZGxlKS0+aENvZGVjSGFuZGxlOworICAgIE9NWF9IQU5ETEVUWVBFICAgICAgICAgICAgIGhNRkNIYW5kbGUgPSBwTXBlZzRFbmMtPmhNRkNNcGVnNEhhbmRsZS5oTUZDSGFuZGxlOworICAgIFNTQlNJUF9NRkNfRU5DX0lOUFVUX0lORk8gKnBJbnB1dEluZm8gPSAmKHBNcGVnNEVuYy0+aE1GQ01wZWc0SGFuZGxlLmlucHV0SW5mbyk7CisgICAgU1NCU0lQX01GQ19FTkNfT1VUUFVUX0lORk8gb3V0cHV0SW5mbzsKKyAgICBTRUNfT01YX0JBU0VQT1JUICAgICAgICAgICpwU0VDUG9ydCA9IE5VTEw7CisgICAgTUZDX0VOQ19BRERSX0lORk8gICAgICAgICAgYWRkckluZm87CisgICAgT01YX1UzMiAgICAgICAgICAgICAgICAgICAgb25lRnJhbWVTaXplID0gcElucHV0RGF0YS0+ZGF0YUxlbjsKKworICAgIEZ1bmN0aW9uSW4oKTsKKworICAgIGlmIChwTXBlZzRFbmMtPmhNRkNNcGVnNEhhbmRsZS5iQ29uZmlndXJlZE1GQyA9PSBPTVhfRkFMU0UpIHsKKyAgICAgICAgcE1wZWc0RW5jLT5oTUZDTXBlZzRIYW5kbGUucmV0dXJuQ29kZWMgPSBTc2JTaXBNZmNFbmNHZXRPdXRCdWYoaE1GQ0hhbmRsZSwgJm91dHB1dEluZm8pOworICAgICAgICBpZiAocE1wZWc0RW5jLT5oTUZDTXBlZzRIYW5kbGUucmV0dXJuQ29kZWMgIT0gTUZDX1JFVF9PSykKKyAgICAgICAgeworICAgICAgICAgICAgU0VDX09TQUxfTG9nKFNFQ19MT0dfRVJST1IsICIlczogU3NiU2lwTWZjRW5jR2V0T3V0QnVmIGZhaWxlZCwgcmV0OiVkIiwgX19GVU5DVElPTl9fLCBwTXBlZzRFbmMtPmhNRkNNcGVnNEhhbmRsZS5yZXR1cm5Db2RlYyk7CisgICAgICAgICAgICByZXQgPSBPTVhfRXJyb3JVbmRlZmluZWQ7CisgICAgICAgICAgICBnb3RvIEVYSVQ7CisgICAgICAgIH0KKworICAgICAgICBwT3V0cHV0RGF0YS0+ZGF0YUJ1ZmZlciA9IG91dHB1dEluZm8uU3RybVZpckFkZHI7CisgICAgICAgIHBPdXRwdXREYXRhLT5hbGxvY1NpemUgPSBvdXRwdXRJbmZvLmhlYWRlclNpemU7CisgICAgICAgIHBPdXRwdXREYXRhLT5kYXRhTGVuID0gb3V0cHV0SW5mby5oZWFkZXJTaXplOworICAgICAgICBwT3V0cHV0RGF0YS0+dGltZVN0YW1wID0gMDsKKyAgICAgICAgcE91dHB1dERhdGEtPm5GbGFncyB8PSBPTVhfQlVGRkVSRkxBR19DT0RFQ0NPTkZJRzsKKyAgICAgICAgcE91dHB1dERhdGEtPm5GbGFncyB8PSBPTVhfQlVGRkVSRkxBR19FTkRPRkZSQU1FOworCisgICAgICAgIHBNcGVnNEVuYy0+aE1GQ01wZWc0SGFuZGxlLmJDb25maWd1cmVkTUZDID0gT01YX1RSVUU7CisKKyAgICAgICAgcmV0ID0gT01YX0Vycm9ySW5wdXREYXRhRW5jb2RlWWV0OworICAgICAgICBnb3RvIEVYSVQ7CisgICAgfQorCisgICAgaWYgKChwSW5wdXREYXRhLT5uRmxhZ3MgJiBPTVhfQlVGRkVSRkxBR19FTkRPRkZSQU1FKSAmJgorICAgICAgICAocFNFQ0NvbXBvbmVudC0+YlVzZUZsYWdFT0YgPT0gT01YX0ZBTFNFKSkKKyAgICAgICAgcFNFQ0NvbXBvbmVudC0+YlVzZUZsYWdFT0YgPSBPTVhfVFJVRTsKKworICAgIGlmIChvbmVGcmFtZVNpemUgPD0gMCkgeworICAgICAgICBwT3V0cHV0RGF0YS0+dGltZVN0YW1wID0gcElucHV0RGF0YS0+dGltZVN0YW1wOworICAgICAgICBwT3V0cHV0RGF0YS0+bkZsYWdzID0gcElucHV0RGF0YS0+bkZsYWdzOworCisgICAgICAgIHJldCA9IE9NWF9FcnJvck5vbmU7CisgICAgICAgIGdvdG8gRVhJVDsKKyAgICB9CisKKyAgICBwU0VDUG9ydCA9ICZwU0VDQ29tcG9uZW50LT5wU0VDUG9ydFtJTlBVVF9QT1JUX0lOREVYXTsKKyAgICBpZiAoKChwSW5wdXREYXRhLT5uRmxhZ3MgJiBPTVhfQlVGRkVSRkxBR19FT1MpID09IE9NWF9CVUZGRVJGTEFHX0VPUykgfHwKKyAgICAgICAgKHBTRUNDb21wb25lbnQtPmdldEFsbERlbGF5QnVmZmVyID09IE9NWF9UUlVFKSl7CisgICAgICAgIC8qIER1bW15IGlucHV0IGRhdGEgZm9yIGdldCBvdXQgZW5jb2RlZCBsYXN0IGZyYW1lICovCisgICAgICAgIHBJbnB1dEluZm8tPllQaHlBZGRyID0gcFZpZGVvRW5jLT5NRkNFbmNJbnB1dEJ1ZmZlcltwVmlkZW9FbmMtPmluZGV4SW5wdXRCdWZmZXJdLllQaHlBZGRyOworICAgICAgICBwSW5wdXRJbmZvLT5DUGh5QWRkciA9IHBWaWRlb0VuYy0+TUZDRW5jSW5wdXRCdWZmZXJbcFZpZGVvRW5jLT5pbmRleElucHV0QnVmZmVyXS5DUGh5QWRkcjsKKyAgICAgICAgcElucHV0SW5mby0+WVZpckFkZHIgPSBwVmlkZW9FbmMtPk1GQ0VuY0lucHV0QnVmZmVyW3BWaWRlb0VuYy0+aW5kZXhJbnB1dEJ1ZmZlcl0uWVZpckFkZHI7CisgICAgICAgIHBJbnB1dEluZm8tPkNWaXJBZGRyID0gcFZpZGVvRW5jLT5NRkNFbmNJbnB1dEJ1ZmZlcltwVmlkZW9FbmMtPmluZGV4SW5wdXRCdWZmZXJdLkNWaXJBZGRyOworICAgIH0gZWxzZSB7CisgICAgICAgIHN3aXRjaCAocFNFQ1BvcnQtPnBvcnREZWZpbml0aW9uLmZvcm1hdC52aWRlby5lQ29sb3JGb3JtYXQpIHsKKyAgICAgICAgY2FzZSBPTVhfU0VDX0NPTE9SX0Zvcm1hdE5WMTJUUGh5c2ljYWxBZGRyZXNzOgorICAgICAgICBjYXNlIE9NWF9TRUNfQ09MT1JfRm9ybWF0TlYxMkxQaHlzaWNhbEFkZHJlc3M6CisgICAgICAgIGNhc2UgT01YX1NFQ19DT0xPUl9Gb3JtYXROVjIxTFBoeXNpY2FsQWRkcmVzczogeworI2lmbmRlZiBVU0VfTUVUQURBVEFCVUZGRVJUWVBFCisgICAgICAgICAgICAvKiBVU0VfRklNQ19GUkFNRV9CVUZGRVIgKi8KKyAgICAgICAgICAgIFNFQ19PU0FMX01lbWNweSgmYWRkckluZm8ucEFkZHJZLCBwSW5wdXREYXRhLT5kYXRhQnVmZmVyLCBzaXplb2YoYWRkckluZm8ucEFkZHJZKSk7CisgICAgICAgICAgICBTRUNfT1NBTF9NZW1jcHkoJmFkZHJJbmZvLnBBZGRyQywgcElucHV0RGF0YS0+ZGF0YUJ1ZmZlciArIHNpemVvZihhZGRySW5mby5wQWRkclkpLCBzaXplb2YoYWRkckluZm8ucEFkZHJDKSk7CisjZWxzZQorICAgICAgICAgICAgT01YX1BUUiBwcEJ1ZlszXTsKKyAgICAgICAgICAgIFNFQ19PU0FMX0dldEluZm9Gcm9tTWV0YURhdGEocElucHV0RGF0YSwgcHBCdWYpOworCisgICAgICAgICAgICBTRUNfT1NBTF9NZW1jcHkoJmFkZHJJbmZvLnBBZGRyWSwgcHBCdWZbMF0sIHNpemVvZihhZGRySW5mby5wQWRkclkpKTsKKyAgICAgICAgICAgIFNFQ19PU0FMX01lbWNweSgmYWRkckluZm8ucEFkZHJDLCBwcEJ1ZlsxXSwgc2l6ZW9mKGFkZHJJbmZvLnBBZGRyQykpOworI2VuZGlmCisgICAgICAgICAgICBwSW5wdXRJbmZvLT5ZUGh5QWRkciA9IGFkZHJJbmZvLnBBZGRyWTsKKyAgICAgICAgICAgIHBJbnB1dEluZm8tPkNQaHlBZGRyID0gYWRkckluZm8ucEFkZHJDOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICAgICAgY2FzZSBPTVhfU0VDX0NPTE9SX0Zvcm1hdE5WMTJMVmlydHVhbEFkZHJlc3M6CisgICAgICAgICAgICBhZGRySW5mby5wQWRkclkgPSAqKCh2b2lkICoqKXBJbnB1dERhdGEtPmRhdGFCdWZmZXIpOworICAgICAgICAgICAgYWRkckluZm8ucEFkZHJDID0gKHZvaWQgKikoKGNoYXIgKilhZGRySW5mby5wQWRkclkgKyBwSW5wdXRJbmZvLT5ZU2l6ZSk7CisKKyAgICAgICAgICAgIHBJbnB1dEluZm8tPllQaHlBZGRyID0gYWRkckluZm8ucEFkZHJZOworICAgICAgICAgICAgcElucHV0SW5mby0+Q1BoeUFkZHIgPSBhZGRySW5mby5wQWRkckM7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIHBJbnB1dEluZm8tPllQaHlBZGRyID0gcFZpZGVvRW5jLT5NRkNFbmNJbnB1dEJ1ZmZlcltwVmlkZW9FbmMtPmluZGV4SW5wdXRCdWZmZXJdLllQaHlBZGRyOworICAgICAgICAgICAgcElucHV0SW5mby0+Q1BoeUFkZHIgPSBwVmlkZW9FbmMtPk1GQ0VuY0lucHV0QnVmZmVyW3BWaWRlb0VuYy0+aW5kZXhJbnB1dEJ1ZmZlcl0uQ1BoeUFkZHI7CisgICAgICAgICAgICBwSW5wdXRJbmZvLT5ZVmlyQWRkciA9IHBWaWRlb0VuYy0+TUZDRW5jSW5wdXRCdWZmZXJbcFZpZGVvRW5jLT5pbmRleElucHV0QnVmZmVyXS5ZVmlyQWRkcjsKKyAgICAgICAgICAgIHBJbnB1dEluZm8tPkNWaXJBZGRyID0gcFZpZGVvRW5jLT5NRkNFbmNJbnB1dEJ1ZmZlcltwVmlkZW9FbmMtPmluZGV4SW5wdXRCdWZmZXJdLkNWaXJBZGRyOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwU0VDQ29tcG9uZW50LT50aW1lU3RhbXBbcE1wZWc0RW5jLT5oTUZDTXBlZzRIYW5kbGUuaW5kZXhUaW1lc3RhbXBdID0gcElucHV0RGF0YS0+dGltZVN0YW1wOworICAgIHBTRUNDb21wb25lbnQtPm5GbGFnc1twTXBlZzRFbmMtPmhNRkNNcGVnNEhhbmRsZS5pbmRleFRpbWVzdGFtcF0gPSBwSW5wdXREYXRhLT5uRmxhZ3M7CisKKyAgICBpZiAoKHBNcGVnNEVuYy0+aE1GQ01wZWc0SGFuZGxlLnJldHVybkNvZGVjID09IE1GQ19SRVRfT0spICYmCisgICAgICAgIChwVmlkZW9FbmMtPmJGaXJzdEZyYW1lID09IE9NWF9GQUxTRSkpIHsKKyAgICAgICAgT01YX1MzMiBpbmRleFRpbWVzdGFtcCA9IDA7CisKKyAgICAgICAgLyogd2FpdCBmb3IgbWZjIGVuY29kZSBkb25lICovCisgICAgICAgIGlmIChwVmlkZW9FbmMtPk5CRW5jVGhyZWFkLmJFbmNvZGVyUnVuICE9IE9NWF9GQUxTRSkgeworICAgICAgICAgICAgU0VDX09TQUxfU2VtYXBob3JlV2FpdChwVmlkZW9FbmMtPk5CRW5jVGhyZWFkLmhFbmNGcmFtZUVuZCk7CisgICAgICAgICAgICBwVmlkZW9FbmMtPk5CRW5jVGhyZWFkLmJFbmNvZGVyUnVuID0gT01YX0ZBTFNFOworICAgICAgICB9CisKKyAgICAgICAgU0VDX09TQUxfU2xlZXBNaWxsaXNlYygwKTsKKyAgICAgICAgcE1wZWc0RW5jLT5oTUZDTXBlZzRIYW5kbGUucmV0dXJuQ29kZWMgPSBTc2JTaXBNZmNFbmNHZXRPdXRCdWYocE1wZWc0RW5jLT5oTUZDTXBlZzRIYW5kbGUuaE1GQ0hhbmRsZSwgJm91dHB1dEluZm8pOworICAgICAgICBpZiAoKFNzYlNpcE1mY0VuY0dldENvbmZpZyhwTXBlZzRFbmMtPmhNRkNNcGVnNEhhbmRsZS5oTUZDSGFuZGxlLCBNRkNfRU5DX0dFVENPTkZfRlJBTUVfVEFHLCAmaW5kZXhUaW1lc3RhbXApICE9IE1GQ19SRVRfT0spIHx8CisgICAgICAgICAgICAoKChpbmRleFRpbWVzdGFtcCA8IDApIHx8IChpbmRleFRpbWVzdGFtcCA+PSBNQVhfVElNRVNUQU1QKSkpKXsKKyAgICAgICAgICAgIHBPdXRwdXREYXRhLT50aW1lU3RhbXAgPSBwSW5wdXREYXRhLT50aW1lU3RhbXA7CisgICAgICAgICAgICBwT3V0cHV0RGF0YS0+bkZsYWdzID0gcElucHV0RGF0YS0+bkZsYWdzOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgcE91dHB1dERhdGEtPnRpbWVTdGFtcCA9IHBTRUNDb21wb25lbnQtPnRpbWVTdGFtcFtpbmRleFRpbWVzdGFtcF07CisgICAgICAgICAgICBwT3V0cHV0RGF0YS0+bkZsYWdzID0gcFNFQ0NvbXBvbmVudC0+bkZsYWdzW2luZGV4VGltZXN0YW1wXTsKKyAgICAgICAgfQorCisgICAgICAgIGlmIChwTXBlZzRFbmMtPmhNRkNNcGVnNEhhbmRsZS5yZXR1cm5Db2RlYyA9PSBNRkNfUkVUX09LKSB7CisgICAgICAgICAgICAvKiogRmlsbCBPdXRwdXQgQnVmZmVyICoqLworICAgICAgICAgICAgcE91dHB1dERhdGEtPmRhdGFCdWZmZXIgPSBvdXRwdXRJbmZvLlN0cm1WaXJBZGRyOworICAgICAgICAgICAgcE91dHB1dERhdGEtPmFsbG9jU2l6ZSA9IG91dHB1dEluZm8uZGF0YVNpemU7CisgICAgICAgICAgICBwT3V0cHV0RGF0YS0+ZGF0YUxlbiA9IG91dHB1dEluZm8uZGF0YVNpemU7CisgICAgICAgICAgICBwT3V0cHV0RGF0YS0+dXNlZERhdGFMZW4gPSAwOworCisgICAgICAgICAgICBwT3V0cHV0RGF0YS0+bkZsYWdzIHw9IE9NWF9CVUZGRVJGTEFHX0VORE9GRlJBTUU7CisgICAgICAgICAgICBpZiAob3V0cHV0SW5mby5mcmFtZVR5cGUgPT0gTUZDX0ZSQU1FX1RZUEVfSV9GUkFNRSkKKyAgICAgICAgICAgICAgICBwT3V0cHV0RGF0YS0+bkZsYWdzIHw9IE9NWF9CVUZGRVJGTEFHX1NZTkNGUkFNRTsKKworICAgICAgICAgICAgU0VDX09TQUxfTG9nKFNFQ19MT0dfVFJBQ0UsICJNRkMgRW5jb2RlIE9LISEhISEhISEhISEhISEhISEhISEhISEhISEhISFcbiIpOworCisgICAgICAgICAgICByZXQgPSBPTVhfRXJyb3JOb25lOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgU0VDX09TQUxfTG9nKFNFQ19MT0dfRVJST1IsICIlczogU3NiU2lwTWZjRW5jR2V0T3V0QnVmIGZhaWxlZCwgcmV0OiVkIiwgX19GVU5DVElPTl9fLCBwTXBlZzRFbmMtPmhNRkNNcGVnNEhhbmRsZS5yZXR1cm5Db2RlYyk7CisgICAgICAgICAgICByZXQgPSBPTVhfRXJyb3JVbmRlZmluZWQ7CisgICAgICAgICAgICBnb3RvIEVYSVQ7CisgICAgICAgIH0KKworICAgICAgICBpZiAocFNFQ0NvbXBvbmVudC0+Z2V0QWxsRGVsYXlCdWZmZXIgPT0gT01YX1RSVUUpIHsKKyAgICAgICAgICAgIHJldCA9IE9NWF9FcnJvcklucHV0RGF0YUVuY29kZVlldDsKKyAgICAgICAgfQorICAgICAgICBpZiAoKHBJbnB1dERhdGEtPm5GbGFncyAmIE9NWF9CVUZGRVJGTEFHX0VPUykgPT0gT01YX0JVRkZFUkZMQUdfRU9TKSB7CisgICAgICAgICAgICBwSW5wdXREYXRhLT5uRmxhZ3MgPSAocE91dHB1dERhdGEtPm5GbGFncyAmICh+T01YX0JVRkZFUkZMQUdfRU9TKSk7CisgICAgICAgICAgICBwU0VDQ29tcG9uZW50LT5nZXRBbGxEZWxheUJ1ZmZlciA9IE9NWF9UUlVFOworICAgICAgICAgICAgcmV0ID0gT01YX0Vycm9ySW5wdXREYXRhRW5jb2RlWWV0OworICAgICAgICB9CisgICAgICAgIGlmICgocE91dHB1dERhdGEtPm5GbGFncyAmIE9NWF9CVUZGRVJGTEFHX0VPUykgPT0gT01YX0JVRkZFUkZMQUdfRU9TKSB7CisgICAgICAgICAgICBwU0VDQ29tcG9uZW50LT5nZXRBbGxEZWxheUJ1ZmZlciA9IE9NWF9GQUxTRTsKKyAgICAgICAgICAgIHBPdXRwdXREYXRhLT5kYXRhTGVuID0gMDsKKyAgICAgICAgICAgIHBPdXRwdXREYXRhLT51c2VkRGF0YUxlbiA9IDA7CisgICAgICAgICAgICBTRUNfT1NBTF9Mb2coU0VDX0xPR19UUkFDRSwgIk9NWF9CVUZGRVJGTEFHX0VPUyEhISIpOworICAgICAgICAgICAgcmV0ID0gT01YX0Vycm9yTm9uZTsKKyAgICAgICAgfQorICAgIH0KKyAgICBpZiAocE1wZWc0RW5jLT5oTUZDTXBlZzRIYW5kbGUucmV0dXJuQ29kZWMgIT0gTUZDX1JFVF9PSykgeworICAgICAgICBTRUNfT1NBTF9Mb2coU0VDX0xPR19FUlJPUiwgIkluICVzIDogU3NiU2lwTWZjRW5jRXhlIEZhaWxlZCEhIVxuIiwgX19mdW5jX18pOworICAgICAgICByZXQgPSBPTVhfRXJyb3JVbmRlZmluZWQ7CisgICAgICAgIGdvdG8gRVhJVDsKKyAgICB9CisKKyAgICBwTXBlZzRFbmMtPmhNRkNNcGVnNEhhbmRsZS5yZXR1cm5Db2RlYyA9IFNzYlNpcE1mY0VuY1NldEluQnVmKGhNRkNIYW5kbGUsIHBJbnB1dEluZm8pOworICAgIGlmIChwTXBlZzRFbmMtPmhNRkNNcGVnNEhhbmRsZS5yZXR1cm5Db2RlYyAhPSBNRkNfUkVUX09LKSB7CisgICAgICAgU0VDX09TQUxfTG9nKFNFQ19MT0dfRVJST1IsICIlczogU3NiU2lwTWZjRW5jU2V0SW5CdWYgZmFpbGVkLCByZXQ6JWQiLCBfX0ZVTkNUSU9OX18sIHBNcGVnNEVuYy0+aE1GQ01wZWc0SGFuZGxlLnJldHVybkNvZGVjKTsKKyAgICAgICByZXQgPSBPTVhfRXJyb3JVbmRlZmluZWQ7CisgICAgICAgZ290byBFWElUOworICAgIH0gZWxzZSB7CisgICAgICAgIHBWaWRlb0VuYy0+aW5kZXhJbnB1dEJ1ZmZlcisrOworICAgICAgICBwVmlkZW9FbmMtPmluZGV4SW5wdXRCdWZmZXIgJT0gTUZDX0lOUFVUX0JVRkZFUl9OVU1fTUFYOworICAgIH0KKworICAgIGlmIChwVmlkZW9FbmMtPmNvbmZpZ0NoYW5nZSA9PSBPTVhfVFJVRSkgeworICAgICAgICBpZiAocE1wZWc0RW5jLT5oTUZDTXBlZzRIYW5kbGUuY29kZWNUeXBlID09IENPREVDX1RZUEVfTVBFRzQpCisgICAgICAgICAgICBDaGFuZ2VfTXBlZzRFbmNfUGFyYW0oJihwTXBlZzRFbmMtPmhNRkNNcGVnNEhhbmRsZS5tcGVnNE1GQ1BhcmFtKSwgcFNFQ0NvbXBvbmVudCk7CisgICAgICAgIGVsc2UKKyAgICAgICAgICAgIENoYW5nZV9IMjYzRW5jX1BhcmFtKCYocE1wZWc0RW5jLT5oTUZDTXBlZzRIYW5kbGUuaDI2M01GQ1BhcmFtKSwgcFNFQ0NvbXBvbmVudCk7CisgICAgICAgIHBWaWRlb0VuYy0+Y29uZmlnQ2hhbmdlID0gT01YX0ZBTFNFOworICAgIH0KKworICAgIFNzYlNpcE1mY0VuY1NldENvbmZpZyhoTUZDSGFuZGxlLCBNRkNfRU5DX1NFVENPTkZfRlJBTUVfVEFHLCAmKHBNcGVnNEVuYy0+aE1GQ01wZWc0SGFuZGxlLmluZGV4VGltZXN0YW1wKSk7CisKKyAgICAvKiBtZmMgZW5jb2RlIHN0YXJ0ICovCisgICAgU0VDX09TQUxfU2VtYXBob3JlUG9zdChwVmlkZW9FbmMtPk5CRW5jVGhyZWFkLmhFbmNGcmFtZVN0YXJ0KTsKKyAgICBwVmlkZW9FbmMtPk5CRW5jVGhyZWFkLmJFbmNvZGVyUnVuID0gT01YX1RSVUU7CisgICAgcE1wZWc0RW5jLT5oTUZDTXBlZzRIYW5kbGUuaW5kZXhUaW1lc3RhbXArKzsKKyAgICBwTXBlZzRFbmMtPmhNRkNNcGVnNEhhbmRsZS5pbmRleFRpbWVzdGFtcCAlPSBNQVhfVElNRVNUQU1QOworICAgIHBWaWRlb0VuYy0+YkZpcnN0RnJhbWUgPSBPTVhfRkFMU0U7CisgICAgU0VDX09TQUxfU2xlZXBNaWxsaXNlYygwKTsKKworRVhJVDoKKyAgICBGdW5jdGlvbk91dCgpOworCisgICAgcmV0dXJuIHJldDsKK30KKworT01YX0VSUk9SVFlQRSBTRUNfTUZDX01wZWc0X0VuY29kZV9CbG9jayhPTVhfQ09NUE9ORU5UVFlQRSAqcE9NWENvbXBvbmVudCwgU0VDX09NWF9EQVRBICpwSW5wdXREYXRhLCBTRUNfT01YX0RBVEEgKnBPdXRwdXREYXRhKQoreworICAgIE9NWF9FUlJPUlRZUEUgICAgICAgICAgICAgIHJldCA9IE9NWF9FcnJvck5vbmU7CisgICAgU0VDX09NWF9CQVNFQ09NUE9ORU5UICAgICAqcFNFQ0NvbXBvbmVudCA9IChTRUNfT01YX0JBU0VDT01QT05FTlQgKilwT01YQ29tcG9uZW50LT5wQ29tcG9uZW50UHJpdmF0ZTsKKyAgICBTRUNfT01YX1ZJREVPRU5DX0NPTVBPTkVOVCAqcFZpZGVvRW5jID0gKChTRUNfT01YX1ZJREVPRU5DX0NPTVBPTkVOVCAqKXBTRUNDb21wb25lbnQtPmhDb21wb25lbnRIYW5kbGUpOworICAgIFNFQ19NUEVHNEVOQ19IQU5ETEUgICAgICAgKnBNcGVnNEVuYyA9IChTRUNfTVBFRzRFTkNfSEFORExFICopKChTRUNfT01YX1ZJREVPRU5DX0NPTVBPTkVOVCAqKXBTRUNDb21wb25lbnQtPmhDb21wb25lbnRIYW5kbGUpLT5oQ29kZWNIYW5kbGU7CisgICAgT01YX0hBTkRMRVRZUEUgICAgICAgICAgICAgaE1GQ0hhbmRsZSA9IHBNcGVnNEVuYy0+aE1GQ01wZWc0SGFuZGxlLmhNRkNIYW5kbGU7CisgICAgU1NCU0lQX01GQ19FTkNfSU5QVVRfSU5GTyAqcElucHV0SW5mbyA9ICYocE1wZWc0RW5jLT5oTUZDTXBlZzRIYW5kbGUuaW5wdXRJbmZvKTsKKyAgICBTU0JTSVBfTUZDX0VOQ19PVVRQVVRfSU5GTyBvdXRwdXRJbmZvOworICAgIFNFQ19PTVhfQkFTRVBPUlQgICAgICAgICAgKnBTRUNQb3J0ID0gTlVMTDsKKyAgICBNRkNfRU5DX0FERFJfSU5GTyAgICAgICAgICBhZGRySW5mbzsKKyAgICBPTVhfVTMyICAgICAgICAgICAgICAgICAgICBvbmVGcmFtZVNpemUgPSBwSW5wdXREYXRhLT5kYXRhTGVuOworICAgIE9NWF9TMzIgICAgICAgICAgICAgICAgICAgIHJldHVybkNvZGVjID0gMDsKKworICAgIEZ1bmN0aW9uSW4oKTsKKworICAgIGlmIChwTXBlZzRFbmMtPmhNRkNNcGVnNEhhbmRsZS5iQ29uZmlndXJlZE1GQyA9PSBPTVhfRkFMU0UpIHsKKyAgICAgICAgcmV0dXJuQ29kZWMgPSBTc2JTaXBNZmNFbmNHZXRPdXRCdWYoaE1GQ0hhbmRsZSwgJm91dHB1dEluZm8pOworICAgICAgICBpZiAocmV0dXJuQ29kZWMgIT0gTUZDX1JFVF9PSykKKyAgICAgICAgeworICAgICAgICAgICAgU0VDX09TQUxfTG9nKFNFQ19MT0dfRVJST1IsICIlczogU3NiU2lwTWZjRW5jR2V0T3V0QnVmIGZhaWxlZCwgcmV0OiVkIiwgX19GVU5DVElPTl9fLCByZXR1cm5Db2RlYyk7CisgICAgICAgICAgICByZXQgPSBPTVhfRXJyb3JVbmRlZmluZWQ7CisgICAgICAgICAgICBnb3RvIEVYSVQ7CisgICAgICAgIH0KKworICAgICAgICBwT3V0cHV0RGF0YS0+ZGF0YUJ1ZmZlciA9IG91dHB1dEluZm8uU3RybVZpckFkZHI7CisgICAgICAgIHBPdXRwdXREYXRhLT5hbGxvY1NpemUgPSBvdXRwdXRJbmZvLmhlYWRlclNpemU7CisgICAgICAgIHBPdXRwdXREYXRhLT5kYXRhTGVuID0gb3V0cHV0SW5mby5oZWFkZXJTaXplOworICAgICAgICBwT3V0cHV0RGF0YS0+dGltZVN0YW1wID0gMDsKKyAgICAgICAgcE91dHB1dERhdGEtPm5GbGFncyB8PSBPTVhfQlVGRkVSRkxBR19DT0RFQ0NPTkZJRzsKKyAgICAgICAgcE91dHB1dERhdGEtPm5GbGFncyB8PSBPTVhfQlVGRkVSRkxBR19FTkRPRkZSQU1FOworCisgICAgICAgIHBNcGVnNEVuYy0+aE1GQ01wZWc0SGFuZGxlLmJDb25maWd1cmVkTUZDID0gT01YX1RSVUU7CisKKyAgICAgICAgcmV0ID0gT01YX0Vycm9ySW5wdXREYXRhRW5jb2RlWWV0OworICAgICAgICBnb3RvIEVYSVQ7CisgICAgfQorCisgICAgaWYgKChwSW5wdXREYXRhLT5uRmxhZ3MgJiBPTVhfQlVGRkVSRkxBR19FTkRPRkZSQU1FKSAmJgorICAgICAgICAocFNFQ0NvbXBvbmVudC0+YlVzZUZsYWdFT0YgPT0gT01YX0ZBTFNFKSkKKyAgICAgICAgcFNFQ0NvbXBvbmVudC0+YlVzZUZsYWdFT0YgPSBPTVhfVFJVRTsKKworICAgIGlmIChvbmVGcmFtZVNpemUgPD0gMCkgeworICAgICAgICBwT3V0cHV0RGF0YS0+dGltZVN0YW1wID0gcElucHV0RGF0YS0+dGltZVN0YW1wOworICAgICAgICBwT3V0cHV0RGF0YS0+bkZsYWdzID0gcElucHV0RGF0YS0+bkZsYWdzOworCisgICAgICAgIHJldCA9IE9NWF9FcnJvck5vbmU7CisgICAgICAgIGdvdG8gRVhJVDsKKyAgICB9CisKKyAgICBwU0VDUG9ydCA9ICZwU0VDQ29tcG9uZW50LT5wU0VDUG9ydFtJTlBVVF9QT1JUX0lOREVYXTsKKyAgICBzd2l0Y2ggKHBTRUNQb3J0LT5wb3J0RGVmaW5pdGlvbi5mb3JtYXQudmlkZW8uZUNvbG9yRm9ybWF0KSB7CisgICAgY2FzZSBPTVhfU0VDX0NPTE9SX0Zvcm1hdE5WMTJUUGh5c2ljYWxBZGRyZXNzOgorICAgIGNhc2UgT01YX1NFQ19DT0xPUl9Gb3JtYXROVjEyTFBoeXNpY2FsQWRkcmVzczoKKyAgICBjYXNlIE9NWF9TRUNfQ09MT1JfRm9ybWF0TlYyMUxQaHlzaWNhbEFkZHJlc3M6IHsKKyNpZm5kZWYgVVNFX01FVEFEQVRBQlVGRkVSVFlQRQorICAgICAgICAvKiBVU0VfRklNQ19GUkFNRV9CVUZGRVIgKi8KKyAgICAgICAgU0VDX09TQUxfTWVtY3B5KCZhZGRySW5mby5wQWRkclksIHBJbnB1dERhdGEtPmRhdGFCdWZmZXIsIHNpemVvZihhZGRySW5mby5wQWRkclkpKTsKKyAgICAgICAgU0VDX09TQUxfTWVtY3B5KCZhZGRySW5mby5wQWRkckMsIHBJbnB1dERhdGEtPmRhdGFCdWZmZXIgKyBzaXplb2YoYWRkckluZm8ucEFkZHJZKSwgc2l6ZW9mKGFkZHJJbmZvLnBBZGRyQykpOworI2Vsc2UKKyAgICAgICAgT01YX1BUUiBwcEJ1ZlszXTsKKyAgICAgICAgU0VDX09TQUxfR2V0SW5mb0Zyb21NZXRhRGF0YShwSW5wdXREYXRhLHBwQnVmKTsKKworICAgICAgICBTRUNfT1NBTF9NZW1jcHkoJmFkZHJJbmZvLnBBZGRyWSwgcHBCdWZbMF0sIHNpemVvZihhZGRySW5mby5wQWRkclkpKTsKKyAgICAgICAgU0VDX09TQUxfTWVtY3B5KCZhZGRySW5mby5wQWRkckMsIHBwQnVmWzFdLCBzaXplb2YoYWRkckluZm8ucEFkZHJDKSk7CisjZW5kaWYKKyAgICAgICAgcElucHV0SW5mby0+WVBoeUFkZHIgPSBhZGRySW5mby5wQWRkclk7CisgICAgICAgIHBJbnB1dEluZm8tPkNQaHlBZGRyID0gYWRkckluZm8ucEFkZHJDOworICAgICAgICBicmVhazsKKyAgICB9CisgICAgY2FzZSBPTVhfU0VDX0NPTE9SX0Zvcm1hdE5WMTJMVmlydHVhbEFkZHJlc3M6CisgICAgICAgIGFkZHJJbmZvLnBBZGRyWSA9ICooKHZvaWQgKiopcElucHV0RGF0YS0+ZGF0YUJ1ZmZlcik7CisgICAgICAgIGFkZHJJbmZvLnBBZGRyQyA9ICh2b2lkICopKChjaGFyICopYWRkckluZm8ucEFkZHJZICsgcElucHV0SW5mby0+WVNpemUpOworCisgICAgICAgIHBJbnB1dEluZm8tPllQaHlBZGRyID0gYWRkckluZm8ucEFkZHJZOworICAgICAgICBwSW5wdXRJbmZvLT5DUGh5QWRkciA9IGFkZHJJbmZvLnBBZGRyQzsKKyAgICAgICAgYnJlYWs7CisgICAgZGVmYXVsdDoKKyAgICAgICAgcElucHV0SW5mby0+WVBoeUFkZHIgPSBwVmlkZW9FbmMtPk1GQ0VuY0lucHV0QnVmZmVyW3BWaWRlb0VuYy0+aW5kZXhJbnB1dEJ1ZmZlcl0uWVBoeUFkZHI7CisgICAgICAgIHBJbnB1dEluZm8tPkNQaHlBZGRyID0gcFZpZGVvRW5jLT5NRkNFbmNJbnB1dEJ1ZmZlcltwVmlkZW9FbmMtPmluZGV4SW5wdXRCdWZmZXJdLkNQaHlBZGRyOworICAgICAgICBwSW5wdXRJbmZvLT5ZVmlyQWRkciA9IHBWaWRlb0VuYy0+TUZDRW5jSW5wdXRCdWZmZXJbcFZpZGVvRW5jLT5pbmRleElucHV0QnVmZmVyXS5ZVmlyQWRkcjsKKyAgICAgICAgcElucHV0SW5mby0+Q1ZpckFkZHIgPSBwVmlkZW9FbmMtPk1GQ0VuY0lucHV0QnVmZmVyW3BWaWRlb0VuYy0+aW5kZXhJbnB1dEJ1ZmZlcl0uQ1ZpckFkZHI7CisgICAgICAgIGJyZWFrOworICAgIH0KKworICAgIHJldHVybkNvZGVjID0gU3NiU2lwTWZjRW5jU2V0SW5CdWYoaE1GQ0hhbmRsZSwgcElucHV0SW5mbyk7CisgICAgaWYgKHJldHVybkNvZGVjICE9IE1GQ19SRVRfT0spIHsKKyAgICAgICBTRUNfT1NBTF9Mb2coU0VDX0xPR19FUlJPUiwgIiVzOiBTc2JTaXBNZmNFbmNTZXRJbkJ1ZiBmYWlsZWQsIHJldDolZCIsIF9fRlVOQ1RJT05fXywgcmV0dXJuQ29kZWMpOworICAgICAgIHJldCA9IE9NWF9FcnJvclVuZGVmaW5lZDsKKyAgICAgICBnb3RvIEVYSVQ7CisgICAgfSBlbHNlIHsKKyAgICAgICAgcFZpZGVvRW5jLT5pbmRleElucHV0QnVmZmVyKys7CisgICAgICAgIHBWaWRlb0VuYy0+aW5kZXhJbnB1dEJ1ZmZlciAlPSBNRkNfSU5QVVRfQlVGRkVSX05VTV9NQVg7CisgICAgfQorCisgICAgaWYgKHBWaWRlb0VuYy0+Y29uZmlnQ2hhbmdlID09IE9NWF9UUlVFKSB7CisgICAgICAgIGlmIChwTXBlZzRFbmMtPmhNRkNNcGVnNEhhbmRsZS5jb2RlY1R5cGUgPT0gQ09ERUNfVFlQRV9NUEVHNCkKKyAgICAgICAgICAgIENoYW5nZV9NcGVnNEVuY19QYXJhbSgmKHBNcGVnNEVuYy0+aE1GQ01wZWc0SGFuZGxlLm1wZWc0TUZDUGFyYW0pLCBwU0VDQ29tcG9uZW50KTsKKyAgICAgICAgZWxzZQorICAgICAgICAgICAgQ2hhbmdlX0gyNjNFbmNfUGFyYW0oJihwTXBlZzRFbmMtPmhNRkNNcGVnNEhhbmRsZS5oMjYzTUZDUGFyYW0pLCBwU0VDQ29tcG9uZW50KTsKKyAgICAgICAgcFZpZGVvRW5jLT5jb25maWdDaGFuZ2UgPSBPTVhfRkFMU0U7CisgICAgfQorCisgICAgcFNFQ0NvbXBvbmVudC0+dGltZVN0YW1wW3BNcGVnNEVuYy0+aE1GQ01wZWc0SGFuZGxlLmluZGV4VGltZXN0YW1wXSA9IHBJbnB1dERhdGEtPnRpbWVTdGFtcDsKKyAgICBwU0VDQ29tcG9uZW50LT5uRmxhZ3NbcE1wZWc0RW5jLT5oTUZDTXBlZzRIYW5kbGUuaW5kZXhUaW1lc3RhbXBdID0gcElucHV0RGF0YS0+bkZsYWdzOworICAgIFNzYlNpcE1mY0VuY1NldENvbmZpZyhoTUZDSGFuZGxlLCBNRkNfRU5DX1NFVENPTkZfRlJBTUVfVEFHLCAmKHBNcGVnNEVuYy0+aE1GQ01wZWc0SGFuZGxlLmluZGV4VGltZXN0YW1wKSk7CisKKyAgICByZXR1cm5Db2RlYyA9IFNzYlNpcE1mY0VuY0V4ZShoTUZDSGFuZGxlKTsKKyAgICBpZiAocmV0dXJuQ29kZWMgPT0gTUZDX1JFVF9PSykgeworICAgICAgICBPTVhfUzMyIGluZGV4VGltZXN0YW1wID0gMDsKKworICAgICAgICBwTXBlZzRFbmMtPmhNRkNNcGVnNEhhbmRsZS5pbmRleFRpbWVzdGFtcCsrOworICAgICAgICBwTXBlZzRFbmMtPmhNRkNNcGVnNEhhbmRsZS5pbmRleFRpbWVzdGFtcCAlPSBNQVhfVElNRVNUQU1QOworCisgICAgICAgIHJldHVybkNvZGVjID0gU3NiU2lwTWZjRW5jR2V0T3V0QnVmKGhNRkNIYW5kbGUsICZvdXRwdXRJbmZvKTsKKworICAgICAgICBpZiAoKFNzYlNpcE1mY0VuY0dldENvbmZpZyhoTUZDSGFuZGxlLCBNRkNfRU5DX0dFVENPTkZfRlJBTUVfVEFHLCAmaW5kZXhUaW1lc3RhbXApICE9IE1GQ19SRVRfT0spIHx8CisgICAgICAgICAgICAoKChpbmRleFRpbWVzdGFtcCA8IDApIHx8IChpbmRleFRpbWVzdGFtcCA+PSBNQVhfVElNRVNUQU1QKSkpKSB7CisgICAgICAgICAgICBwT3V0cHV0RGF0YS0+dGltZVN0YW1wID0gcElucHV0RGF0YS0+dGltZVN0YW1wOworICAgICAgICAgICAgcE91dHB1dERhdGEtPm5GbGFncyA9IHBJbnB1dERhdGEtPm5GbGFnczsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHBPdXRwdXREYXRhLT50aW1lU3RhbXAgPSBwU0VDQ29tcG9uZW50LT50aW1lU3RhbXBbaW5kZXhUaW1lc3RhbXBdOworICAgICAgICAgICAgcE91dHB1dERhdGEtPm5GbGFncyA9IHBTRUNDb21wb25lbnQtPm5GbGFnc1tpbmRleFRpbWVzdGFtcF07CisgICAgICAgIH0KKworICAgICAgICBpZiAocmV0dXJuQ29kZWMgPT0gTUZDX1JFVF9PSykgeworICAgICAgICAgICAgLyoqIEZpbGwgT3V0cHV0IEJ1ZmZlciAqKi8KKyAgICAgICAgICAgIHBPdXRwdXREYXRhLT5kYXRhQnVmZmVyID0gb3V0cHV0SW5mby5TdHJtVmlyQWRkcjsKKyAgICAgICAgICAgIHBPdXRwdXREYXRhLT5hbGxvY1NpemUgPSBvdXRwdXRJbmZvLmRhdGFTaXplOworICAgICAgICAgICAgcE91dHB1dERhdGEtPmRhdGFMZW4gPSBvdXRwdXRJbmZvLmRhdGFTaXplOworICAgICAgICAgICAgcE91dHB1dERhdGEtPm5GbGFncyB8PSBPTVhfQlVGRkVSRkxBR19FTkRPRkZSQU1FOworICAgICAgICAgICAgaWYgKG91dHB1dEluZm8uZnJhbWVUeXBlID09IE1GQ19GUkFNRV9UWVBFX0lfRlJBTUUpCisgICAgICAgICAgICAgICAgcE91dHB1dERhdGEtPm5GbGFncyB8PSBPTVhfQlVGRkVSRkxBR19TWU5DRlJBTUU7CisKKyAgICAgICAgICAgIHJldCA9IE9NWF9FcnJvck5vbmU7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBTRUNfT1NBTF9Mb2coU0VDX0xPR19FUlJPUiwgIiVzOiBTc2JTaXBNZmNFbmNHZXRPdXRCdWYgZmFpbGVkLCByZXQ6JWQiLCBfX0ZVTkNUSU9OX18sIHJldHVybkNvZGVjKTsKKyAgICAgICAgICAgIHJldCA9IE9NWF9FcnJvclVuZGVmaW5lZDsKKyAgICAgICAgfQorICAgIH0gZWxzZSB7CisgICAgICAgIFNFQ19PU0FMX0xvZyhTRUNfTE9HX0VSUk9SLCAiJXM6IFNzYlNpcE1mY0VuY0V4ZSBmYWlsZWQsIHJldDolZCIsIF9fRlVOQ1RJT05fXywgcmV0dXJuQ29kZWMpOworICAgICAgICByZXQgPSBPTVhfRXJyb3JVbmRlZmluZWQ7CisgICAgfQorCitFWElUOgorICAgIEZ1bmN0aW9uT3V0KCk7CisKKyAgICByZXR1cm4gcmV0OworfQorCisvKiBNRkMgRW5jb2RlICovCitPTVhfRVJST1JUWVBFIFNFQ19NRkNfTXBlZzRFbmNfYnVmZmVyUHJvY2VzcyhPTVhfQ09NUE9ORU5UVFlQRSAqcE9NWENvbXBvbmVudCwgU0VDX09NWF9EQVRBICpwSW5wdXREYXRhLCBTRUNfT01YX0RBVEEgKnBPdXRwdXREYXRhKQoreworICAgIE9NWF9FUlJPUlRZUEUgICAgICAgICAgICByZXQgPSBPTVhfRXJyb3JOb25lOworICAgIFNFQ19PTVhfQkFTRUNPTVBPTkVOVCAgICpwU0VDQ29tcG9uZW50ID0gKFNFQ19PTVhfQkFTRUNPTVBPTkVOVCAqKXBPTVhDb21wb25lbnQtPnBDb21wb25lbnRQcml2YXRlOworICAgIFNFQ19PTVhfQkFTRVBPUlQgICAgICAgICpwSW5wdXRQb3J0ID0gJnBTRUNDb21wb25lbnQtPnBTRUNQb3J0W0lOUFVUX1BPUlRfSU5ERVhdOworICAgIFNFQ19PTVhfQkFTRVBPUlQgICAgICAgICpwT3V0cHV0UG9ydCA9ICZwU0VDQ29tcG9uZW50LT5wU0VDUG9ydFtPVVRQVVRfUE9SVF9JTkRFWF07CisKKyAgICBGdW5jdGlvbkluKCk7CisKKyAgICBpZiAoKCFDSEVDS19QT1JUX0VOQUJMRUQocElucHV0UG9ydCkpIHx8ICghQ0hFQ0tfUE9SVF9FTkFCTEVEKHBPdXRwdXRQb3J0KSkgfHwKKyAgICAgICAgICAgICghQ0hFQ0tfUE9SVF9QT1BVTEFURUQocElucHV0UG9ydCkpIHx8ICghQ0hFQ0tfUE9SVF9QT1BVTEFURUQocE91dHB1dFBvcnQpKSkgeworICAgICAgICBnb3RvIEVYSVQ7CisgICAgfQorICAgIGlmIChPTVhfRkFMU0UgPT0gU0VDX0NoZWNrX0J1ZmZlclByb2Nlc3NfU3RhdGUocFNFQ0NvbXBvbmVudCkpIHsKKyAgICAgICAgZ290byBFWElUOworICAgIH0KKworI2lmZGVmIE5PTkJMT0NLX01PREVfUFJPQ0VTUworICAgIHJldCA9IFNFQ19NRkNfTXBlZzRfRW5jb2RlX05vbmJsb2NrKHBPTVhDb21wb25lbnQsIHBJbnB1dERhdGEsIHBPdXRwdXREYXRhKTsKKyNlbHNlCisgICAgcmV0ID0gU0VDX01GQ19NcGVnNF9FbmNvZGVfQmxvY2socE9NWENvbXBvbmVudCwgcElucHV0RGF0YSwgcE91dHB1dERhdGEpOworI2VuZGlmCisgICAgaWYgKHJldCAhPSBPTVhfRXJyb3JOb25lKSB7CisgICAgICAgIGlmIChyZXQgPT0gT01YX0Vycm9ySW5wdXREYXRhRW5jb2RlWWV0KSB7CisgICAgICAgICAgICBwT3V0cHV0RGF0YS0+dXNlZERhdGFMZW4gPSAwOworICAgICAgICAgICAgcE91dHB1dERhdGEtPnJlbWFpbkRhdGFMZW4gPSBwT3V0cHV0RGF0YS0+ZGF0YUxlbjsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHBTRUNDb21wb25lbnQtPnBDYWxsYmFja3MtPkV2ZW50SGFuZGxlcigoT01YX0hBTkRMRVRZUEUpcE9NWENvbXBvbmVudCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcFNFQ0NvbXBvbmVudC0+Y2FsbGJhY2tEYXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPTVhfRXZlbnRFcnJvciwgcmV0LCAwLCBOVUxMKTsKKyAgICAgICAgfQorICAgIH0gZWxzZSB7CisgICAgICAgIHBJbnB1dERhdGEtPnVzZWREYXRhTGVuICs9IHBJbnB1dERhdGEtPmRhdGFMZW47CisgICAgICAgIHBJbnB1dERhdGEtPnJlbWFpbkRhdGFMZW4gPSBwSW5wdXREYXRhLT5kYXRhTGVuIC0gcElucHV0RGF0YS0+dXNlZERhdGFMZW47CisgICAgICAgIHBJbnB1dERhdGEtPmRhdGFMZW4gLT0gcElucHV0RGF0YS0+dXNlZERhdGFMZW47CisgICAgICAgIHBJbnB1dERhdGEtPnVzZWREYXRhTGVuID0gMDsKKworICAgICAgICBwT3V0cHV0RGF0YS0+dXNlZERhdGFMZW4gPSAwOworICAgICAgICBwT3V0cHV0RGF0YS0+cmVtYWluRGF0YUxlbiA9IHBPdXRwdXREYXRhLT5kYXRhTGVuOworICAgIH0KKworRVhJVDoKKyAgICBGdW5jdGlvbk91dCgpOworCisgICAgcmV0dXJuIHJldDsKK30KKworT1NDTF9FWFBPUlRfUkVGIE9NWF9FUlJPUlRZUEUgU0VDX09NWF9Db21wb25lbnRJbml0KE9NWF9IQU5ETEVUWVBFIGhDb21wb25lbnQsIE9NWF9TVFJJTkcgY29tcG9uZW50TmFtZSkKK3sKKyAgICBPTVhfRVJST1JUWVBFICAgICAgICAgICAgcmV0ID0gT01YX0Vycm9yTm9uZTsKKyAgICBPTVhfQ09NUE9ORU5UVFlQRSAgICAgICAqcE9NWENvbXBvbmVudCA9IE5VTEw7CisgICAgU0VDX09NWF9CQVNFQ09NUE9ORU5UICAgKnBTRUNDb21wb25lbnQgPSBOVUxMOworICAgIFNFQ19PTVhfQkFTRVBPUlQgICAgICAgICpwU0VDUG9ydCA9IE5VTEw7CisgICAgU0VDX09NWF9WSURFT0VOQ19DT01QT05FTlQgKnBWaWRlb0VuYyA9IE5VTEw7CisgICAgU0VDX01QRUc0RU5DX0hBTkRMRSAgICAgKnBNcGVnNEVuYyA9IE5VTEw7CisgICAgT01YX1MzMiAgICAgICAgICAgICAgICAgIGNvZGVjVHlwZSA9IC0xOworICAgIGludCBpID0gMDsKKworICAgIEZ1bmN0aW9uSW4oKTsKKworICAgIGlmICgoaENvbXBvbmVudCA9PSBOVUxMKSB8fCAoY29tcG9uZW50TmFtZSA9PSBOVUxMKSkgeworICAgICAgICByZXQgPSBPTVhfRXJyb3JCYWRQYXJhbWV0ZXI7CisgICAgICAgIFNFQ19PU0FMX0xvZyhTRUNfTE9HX0VSUk9SLCAiJXM6IHBhcmFtZXRlcnMgYXJlIG51bGwsIHJldDogJVgiLCBfX0ZVTkNUSU9OX18sIHJldCk7CisgICAgICAgIGdvdG8gRVhJVDsKKyAgICB9CisgICAgaWYgKFNFQ19PU0FMX1N0cmNtcChTRUNfT01YX0NPTVBPTkVOVF9NUEVHNF9FTkMsIGNvbXBvbmVudE5hbWUpID09IDApIHsKKyAgICAgICAgY29kZWNUeXBlID0gQ09ERUNfVFlQRV9NUEVHNDsKKyAgICB9IGVsc2UgaWYgKFNFQ19PU0FMX1N0cmNtcChTRUNfT01YX0NPTVBPTkVOVF9IMjYzX0VOQywgY29tcG9uZW50TmFtZSkgPT0gMCkgeworICAgICAgICBjb2RlY1R5cGUgPSBDT0RFQ19UWVBFX0gyNjM7CisgICAgfSBlbHNlIHsKKyAgICAgICAgcmV0ID0gT01YX0Vycm9yQmFkUGFyYW1ldGVyOworICAgICAgICBTRUNfT1NBTF9Mb2coU0VDX0xPR19FUlJPUiwgIiVzOiBjb21wb25lbnROYW1lKCVzKSBlcnJvciwgcmV0OiAlWCIsIF9fRlVOQ1RJT05fXywgY29tcG9uZW50TmFtZSwgcmV0KTsKKyAgICAgICAgZ290byBFWElUOworICAgIH0KKworICAgIHBPTVhDb21wb25lbnQgPSAoT01YX0NPTVBPTkVOVFRZUEUgKiloQ29tcG9uZW50OworICAgIHJldCA9IFNFQ19PTVhfVmlkZW9FbmNvZGVDb21wb25lbnRJbml0KHBPTVhDb21wb25lbnQpOworICAgIGlmIChyZXQgIT0gT01YX0Vycm9yTm9uZSkgeworICAgICAgICBTRUNfT1NBTF9Mb2coU0VDX0xPR19FUlJPUiwgIiVzOiBTRUNfT01YX1ZpZGVvRGVjb2RlQ29tcG9uZW50SW5pdCBlcnJvciwgcmV0OiAlWCIsIF9fRlVOQ1RJT05fXywgcmV0KTsKKyAgICAgICAgZ290byBFWElUOworICAgIH0KKyAgICBwU0VDQ29tcG9uZW50ID0gKFNFQ19PTVhfQkFTRUNPTVBPTkVOVCAqKXBPTVhDb21wb25lbnQtPnBDb21wb25lbnRQcml2YXRlOworICAgIHBTRUNDb21wb25lbnQtPmNvZGVjVHlwZSA9IEhXX1ZJREVPX0VOQ19DT0RFQzsKKworICAgIHBTRUNDb21wb25lbnQtPmNvbXBvbmVudE5hbWUgPSAoT01YX1NUUklORylTRUNfT1NBTF9NYWxsb2MoTUFYX09NWF9DT01QT05FTlRfTkFNRV9TSVpFKTsKKyAgICBpZiAocFNFQ0NvbXBvbmVudC0+Y29tcG9uZW50TmFtZSA9PSBOVUxMKSB7CisgICAgICAgIFNFQ19PTVhfVmlkZW9FbmNvZGVDb21wb25lbnREZWluaXQocE9NWENvbXBvbmVudCk7CisgICAgICAgIHJldCA9IE9NWF9FcnJvckluc3VmZmljaWVudFJlc291cmNlczsKKyAgICAgICAgU0VDX09TQUxfTG9nKFNFQ19MT0dfRVJST1IsICIlczogY29tcG9uZW50TmFtZSBhbGxvYyBlcnJvciwgcmV0OiAlWCIsIF9fRlVOQ1RJT05fXywgcmV0KTsKKyAgICAgICAgZ290byBFWElUOworICAgIH0KKyAgICBTRUNfT1NBTF9NZW1zZXQocFNFQ0NvbXBvbmVudC0+Y29tcG9uZW50TmFtZSwgMCwgTUFYX09NWF9DT01QT05FTlRfTkFNRV9TSVpFKTsKKworICAgIHBNcGVnNEVuYyA9IFNFQ19PU0FMX01hbGxvYyhzaXplb2YoU0VDX01QRUc0RU5DX0hBTkRMRSkpOworICAgIGlmIChwTXBlZzRFbmMgPT0gTlVMTCkgeworICAgICAgICBTRUNfT01YX1ZpZGVvRW5jb2RlQ29tcG9uZW50RGVpbml0KHBPTVhDb21wb25lbnQpOworICAgICAgICByZXQgPSBPTVhfRXJyb3JJbnN1ZmZpY2llbnRSZXNvdXJjZXM7CisgICAgICAgIFNFQ19PU0FMX0xvZyhTRUNfTE9HX0VSUk9SLCAiJXM6IFNFQ19NUEVHNEVOQ19IQU5ETEUgYWxsb2MgZXJyb3IsIHJldDogJVgiLCBfX0ZVTkNUSU9OX18sIHJldCk7CisgICAgICAgIGdvdG8gRVhJVDsKKyAgICB9CisgICAgU0VDX09TQUxfTWVtc2V0KHBNcGVnNEVuYywgMCwgc2l6ZW9mKFNFQ19NUEVHNEVOQ19IQU5ETEUpKTsKKyAgICBwVmlkZW9FbmMgPSAoU0VDX09NWF9WSURFT0VOQ19DT01QT05FTlQgKilwU0VDQ29tcG9uZW50LT5oQ29tcG9uZW50SGFuZGxlOworICAgIHBWaWRlb0VuYy0+aENvZGVjSGFuZGxlID0gKE9NWF9IQU5ETEVUWVBFKXBNcGVnNEVuYzsKKyAgICBwTXBlZzRFbmMtPmhNRkNNcGVnNEhhbmRsZS5jb2RlY1R5cGUgPSBjb2RlY1R5cGU7CisKKyAgICBpZiAoY29kZWNUeXBlID09IENPREVDX1RZUEVfTVBFRzQpCisgICAgICAgIFNFQ19PU0FMX1N0cmNweShwU0VDQ29tcG9uZW50LT5jb21wb25lbnROYW1lLCBTRUNfT01YX0NPTVBPTkVOVF9NUEVHNF9FTkMpOworICAgIGVsc2UKKyAgICAgICAgU0VDX09TQUxfU3RyY3B5KHBTRUNDb21wb25lbnQtPmNvbXBvbmVudE5hbWUsIFNFQ19PTVhfQ09NUE9ORU5UX0gyNjNfRU5DKTsKKworICAgIC8qIFNldCBjb21wb25lbnRWZXJzaW9uICovCisgICAgcFNFQ0NvbXBvbmVudC0+Y29tcG9uZW50VmVyc2lvbi5zLm5WZXJzaW9uTWFqb3IgPSBWRVJTSU9OTUFKT1JfTlVNQkVSOworICAgIHBTRUNDb21wb25lbnQtPmNvbXBvbmVudFZlcnNpb24ucy5uVmVyc2lvbk1pbm9yID0gVkVSU0lPTk1JTk9SX05VTUJFUjsKKyAgICBwU0VDQ29tcG9uZW50LT5jb21wb25lbnRWZXJzaW9uLnMublJldmlzaW9uICAgICA9IFJFVklTSU9OX05VTUJFUjsKKyAgICBwU0VDQ29tcG9uZW50LT5jb21wb25lbnRWZXJzaW9uLnMublN0ZXAgICAgICAgICA9IFNURVBfTlVNQkVSOworICAgIC8qIFNldCBzcGVjVmVyc2lvbiAqLworICAgIHBTRUNDb21wb25lbnQtPnNwZWNWZXJzaW9uLnMublZlcnNpb25NYWpvciA9IFZFUlNJT05NQUpPUl9OVU1CRVI7CisgICAgcFNFQ0NvbXBvbmVudC0+c3BlY1ZlcnNpb24ucy5uVmVyc2lvbk1pbm9yID0gVkVSU0lPTk1JTk9SX05VTUJFUjsKKyAgICBwU0VDQ29tcG9uZW50LT5zcGVjVmVyc2lvbi5zLm5SZXZpc2lvbiAgICAgPSBSRVZJU0lPTl9OVU1CRVI7CisgICAgcFNFQ0NvbXBvbmVudC0+c3BlY1ZlcnNpb24ucy5uU3RlcCAgICAgICAgID0gU1RFUF9OVU1CRVI7CisKKyAgICAvKiBBbmRyb2lkIENhcGFiaWxpdHlGbGFncyAqLworICAgIHBTRUNDb21wb25lbnQtPmNhcGFiaWxpdHlGbGFncy5pSXNPTVhDb21wb25lbnRNdWx0aVRocmVhZGVkICAgICAgICAgICAgICAgICAgID0gT01YX1RSVUU7CisgICAgcFNFQ0NvbXBvbmVudC0+Y2FwYWJpbGl0eUZsYWdzLmlPTVhDb21wb25lbnRTdXBwb3J0c0V4dGVybmFsSW5wdXRCdWZmZXJBbGxvYyAgPSBPTVhfVFJVRTsKKyAgICBwU0VDQ29tcG9uZW50LT5jYXBhYmlsaXR5RmxhZ3MuaU9NWENvbXBvbmVudFN1cHBvcnRzRXh0ZXJuYWxPdXRwdXRCdWZmZXJBbGxvYyA9IE9NWF9UUlVFOworICAgIHBTRUNDb21wb25lbnQtPmNhcGFiaWxpdHlGbGFncy5pT01YQ29tcG9uZW50U3VwcG9ydHNNb3ZhYmxlSW5wdXRCdWZmZXJzICAgICAgID0gT01YX0ZBTFNFOworICAgIHBTRUNDb21wb25lbnQtPmNhcGFiaWxpdHlGbGFncy5pT01YQ29tcG9uZW50U3VwcG9ydHNQYXJ0aWFsRnJhbWVzICAgICAgICAgICAgID0gT01YX0ZBTFNFOworICAgIHBTRUNDb21wb25lbnQtPmNhcGFiaWxpdHlGbGFncy5pT01YQ29tcG9uZW50VXNlc05BTFN0YXJ0Q29kZXMgICAgICAgICAgICAgICAgID0gT01YX1RSVUU7CisgICAgcFNFQ0NvbXBvbmVudC0+Y2FwYWJpbGl0eUZsYWdzLmlPTVhDb21wb25lbnRDYW5IYW5kbGVJbmNvbXBsZXRlRnJhbWVzICAgICAgICAgPSBPTVhfVFJVRTsKKyAgICBwU0VDQ29tcG9uZW50LT5jYXBhYmlsaXR5RmxhZ3MuaU9NWENvbXBvbmVudFVzZXNGdWxsQVZDRnJhbWVzICAgICAgICAgICAgICAgICA9IE9NWF9UUlVFOworCisgICAgLyogSW5wdXQgcG9ydCAqLworICAgIHBTRUNQb3J0ID0gJnBTRUNDb21wb25lbnQtPnBTRUNQb3J0W0lOUFVUX1BPUlRfSU5ERVhdOworICAgIHBTRUNQb3J0LT5wb3J0RGVmaW5pdGlvbi5mb3JtYXQudmlkZW8ubkZyYW1lV2lkdGggPSBERUZBVUxUX0ZSQU1FX1dJRFRIOworICAgIHBTRUNQb3J0LT5wb3J0RGVmaW5pdGlvbi5mb3JtYXQudmlkZW8ubkZyYW1lSGVpZ2h0PSBERUZBVUxUX0ZSQU1FX0hFSUdIVDsKKyAgICBwU0VDUG9ydC0+cG9ydERlZmluaXRpb24uZm9ybWF0LnZpZGVvLm5CaXRyYXRlID0gNjQwMDA7CisgICAgcFNFQ1BvcnQtPnBvcnREZWZpbml0aW9uLmZvcm1hdC52aWRlby54RnJhbWVyYXRlPSAoMTUgPDwgMTYpOworICAgIHBTRUNQb3J0LT5wb3J0RGVmaW5pdGlvbi5mb3JtYXQudmlkZW8uZUNvbXByZXNzaW9uRm9ybWF0ID0gT01YX1ZJREVPX0NvZGluZ1VudXNlZDsKKyAgICBwU0VDUG9ydC0+cG9ydERlZmluaXRpb24uZm9ybWF0LnZpZGVvLnBOYXRpdmVSZW5kZXIgPSAwOworICAgIHBTRUNQb3J0LT5wb3J0RGVmaW5pdGlvbi5mb3JtYXQudmlkZW8uYkZsYWdFcnJvckNvbmNlYWxtZW50ID0gT01YX0ZBTFNFOworICAgIFNFQ19PU0FMX01lbXNldChwU0VDUG9ydC0+cG9ydERlZmluaXRpb24uZm9ybWF0LnZpZGVvLmNNSU1FVHlwZSwgMCwgTUFYX09NWF9NSU1FVFlQRV9TSVpFKTsKKyAgICBTRUNfT1NBTF9TdHJjcHkocFNFQ1BvcnQtPnBvcnREZWZpbml0aW9uLmZvcm1hdC52aWRlby5jTUlNRVR5cGUsICJyYXcvdmlkZW8iKTsKKyAgICBwU0VDUG9ydC0+cG9ydERlZmluaXRpb24uZm9ybWF0LnZpZGVvLmVDb2xvckZvcm1hdCA9IE9NWF9DT0xPUl9Gb3JtYXRZVVY0MjBTZW1pUGxhbmFyOworICAgIHBTRUNQb3J0LT5wb3J0RGVmaW5pdGlvbi5uQnVmZmVyU2l6ZSA9IERFRkFVTFRfVklERU9fSU5QVVRfQlVGRkVSX1NJWkU7CisgICAgcFNFQ1BvcnQtPnBvcnREZWZpbml0aW9uLmJFbmFibGVkID0gT01YX1RSVUU7CisKKyAgICAvKiBPdXRwdXQgcG9ydCAqLworICAgIHBTRUNQb3J0ID0gJnBTRUNDb21wb25lbnQtPnBTRUNQb3J0W09VVFBVVF9QT1JUX0lOREVYXTsKKyAgICBwU0VDUG9ydC0+cG9ydERlZmluaXRpb24uZm9ybWF0LnZpZGVvLm5GcmFtZVdpZHRoID0gREVGQVVMVF9GUkFNRV9XSURUSDsKKyAgICBwU0VDUG9ydC0+cG9ydERlZmluaXRpb24uZm9ybWF0LnZpZGVvLm5GcmFtZUhlaWdodD0gREVGQVVMVF9GUkFNRV9IRUlHSFQ7CisgICAgcFNFQ1BvcnQtPnBvcnREZWZpbml0aW9uLmZvcm1hdC52aWRlby5uQml0cmF0ZSA9IDY0MDAwOworICAgIHBTRUNQb3J0LT5wb3J0RGVmaW5pdGlvbi5mb3JtYXQudmlkZW8ueEZyYW1lcmF0ZT0gKDE1IDw8IDE2KTsKKyAgICBpZiAoY29kZWNUeXBlID09IENPREVDX1RZUEVfTVBFRzQpIHsKKyAgICAgICAgcFNFQ1BvcnQtPnBvcnREZWZpbml0aW9uLmZvcm1hdC52aWRlby5lQ29tcHJlc3Npb25Gb3JtYXQgPSBPTVhfVklERU9fQ29kaW5nTVBFRzQ7CisgICAgICAgIFNFQ19PU0FMX01lbXNldChwU0VDUG9ydC0+cG9ydERlZmluaXRpb24uZm9ybWF0LnZpZGVvLmNNSU1FVHlwZSwgMCwgTUFYX09NWF9NSU1FVFlQRV9TSVpFKTsKKyAgICAgICAgU0VDX09TQUxfU3RyY3B5KHBTRUNQb3J0LT5wb3J0RGVmaW5pdGlvbi5mb3JtYXQudmlkZW8uY01JTUVUeXBlLCAidmlkZW8vbXBlZzQiKTsKKyAgICB9IGVsc2UgeworICAgICAgICBwU0VDUG9ydC0+cG9ydERlZmluaXRpb24uZm9ybWF0LnZpZGVvLmVDb21wcmVzc2lvbkZvcm1hdCA9IE9NWF9WSURFT19Db2RpbmdIMjYzOworICAgICAgICBTRUNfT1NBTF9NZW1zZXQocFNFQ1BvcnQtPnBvcnREZWZpbml0aW9uLmZvcm1hdC52aWRlby5jTUlNRVR5cGUsIDAsIE1BWF9PTVhfTUlNRVRZUEVfU0laRSk7CisgICAgICAgIFNFQ19PU0FMX1N0cmNweShwU0VDUG9ydC0+cG9ydERlZmluaXRpb24uZm9ybWF0LnZpZGVvLmNNSU1FVHlwZSwgInZpZGVvL2gyNjMiKTsKKyAgICB9CisgICAgcFNFQ1BvcnQtPnBvcnREZWZpbml0aW9uLmZvcm1hdC52aWRlby5wTmF0aXZlUmVuZGVyID0gMDsKKyAgICBwU0VDUG9ydC0+cG9ydERlZmluaXRpb24uZm9ybWF0LnZpZGVvLmJGbGFnRXJyb3JDb25jZWFsbWVudCA9IE9NWF9GQUxTRTsKKyAgICBwU0VDUG9ydC0+cG9ydERlZmluaXRpb24uZm9ybWF0LnZpZGVvLmVDb2xvckZvcm1hdCA9IE9NWF9DT0xPUl9Gb3JtYXRVbnVzZWQ7CisgICAgcFNFQ1BvcnQtPnBvcnREZWZpbml0aW9uLm5CdWZmZXJTaXplID0gREVGQVVMVF9WSURFT19PVVRQVVRfQlVGRkVSX1NJWkU7CisgICAgcFNFQ1BvcnQtPnBvcnREZWZpbml0aW9uLmJFbmFibGVkID0gT01YX1RSVUU7CisKKyAgICBpZiAoY29kZWNUeXBlID09IENPREVDX1RZUEVfTVBFRzQpIHsKKyAgICAgICAgZm9yKGkgPSAwOyBpIDwgQUxMX1BPUlRfTlVNOyBpKyspIHsKKyAgICAgICAgICAgIElOSVRfU0VUX1NJWkVfVkVSU0lPTigmcE1wZWc0RW5jLT5tcGVnNENvbXBvbmVudFtpXSwgT01YX1ZJREVPX1BBUkFNX01QRUc0VFlQRSk7CisgICAgICAgICAgICBwTXBlZzRFbmMtPm1wZWc0Q29tcG9uZW50W2ldLm5Qb3J0SW5kZXggPSBpOworICAgICAgICAgICAgcE1wZWc0RW5jLT5tcGVnNENvbXBvbmVudFtpXS5lUHJvZmlsZSAgID0gT01YX1ZJREVPX01QRUc0UHJvZmlsZVNpbXBsZTsKKyAgICAgICAgICAgIHBNcGVnNEVuYy0+bXBlZzRDb21wb25lbnRbaV0uZUxldmVsICAgICA9IE9NWF9WSURFT19NUEVHNExldmVsNDsKKworICAgICAgICAgICAgcE1wZWc0RW5jLT5tcGVnNENvbXBvbmVudFtpXS5uUEZyYW1lcyA9IDEwOworICAgICAgICAgICAgcE1wZWc0RW5jLT5tcGVnNENvbXBvbmVudFtpXS5uQkZyYW1lcyA9IDA7ICAgICAgICAgIC8qIE5vIHN1cHBvcnQgZm9yIEIgZnJhbWVzICovCisgICAgICAgICAgICBwTXBlZzRFbmMtPm1wZWc0Q29tcG9uZW50W2ldLm5NYXhQYWNrZXRTaXplID0gMjU2OyAgLyogRGVmYXVsdCB2YWx1ZSAqLworICAgICAgICAgICAgcE1wZWc0RW5jLT5tcGVnNENvbXBvbmVudFtpXS5uQWxsb3dlZFBpY3R1cmVUeXBlcyA9ICBPTVhfVklERU9fUGljdHVyZVR5cGVJIHwgT01YX1ZJREVPX1BpY3R1cmVUeXBlUDsKKyAgICAgICAgICAgIHBNcGVnNEVuYy0+bXBlZzRDb21wb25lbnRbaV0uYkdvdiA9IE9NWF9GQUxTRTsKKworICAgICAgICB9CisgICAgfSBlbHNlIHsKKyAgICAgICAgZm9yKGkgPSAwOyBpIDwgQUxMX1BPUlRfTlVNOyBpKyspIHsKKyAgICAgICAgICAgIElOSVRfU0VUX1NJWkVfVkVSU0lPTigmcE1wZWc0RW5jLT5oMjYzQ29tcG9uZW50W2ldLCBPTVhfVklERU9fUEFSQU1fSDI2M1RZUEUpOworICAgICAgICAgICAgcE1wZWc0RW5jLT5oMjYzQ29tcG9uZW50W2ldLm5Qb3J0SW5kZXggPSBpOworICAgICAgICAgICAgcE1wZWc0RW5jLT5oMjYzQ29tcG9uZW50W2ldLmVQcm9maWxlICAgPSBPTVhfVklERU9fSDI2M1Byb2ZpbGVCYXNlbGluZTsKKyAgICAgICAgICAgIHBNcGVnNEVuYy0+aDI2M0NvbXBvbmVudFtpXS5lTGV2ZWwgICAgID0gT01YX1ZJREVPX0gyNjNMZXZlbDQ1OworCisgICAgICAgICAgICBwTXBlZzRFbmMtPmgyNjNDb21wb25lbnRbaV0ublBGcmFtZXMgPSAyMDsKKyAgICAgICAgICAgIHBNcGVnNEVuYy0+aDI2M0NvbXBvbmVudFtpXS5uQkZyYW1lcyA9IDA7ICAgICAgICAgIC8qIE5vIHN1cHBvcnQgZm9yIEIgZnJhbWVzICovCisgICAgICAgICAgICBwTXBlZzRFbmMtPmgyNjNDb21wb25lbnRbaV0uYlBMVVNQVFlQRUFsbG93ZWQgPSBPTVhfRkFMU0U7CisgICAgICAgICAgICBwTXBlZzRFbmMtPmgyNjNDb21wb25lbnRbaV0ubkFsbG93ZWRQaWN0dXJlVHlwZXMgPSBPTVhfVklERU9fUGljdHVyZVR5cGVJIHwgT01YX1ZJREVPX1BpY3R1cmVUeXBlUDsKKyAgICAgICAgICAgIHBNcGVnNEVuYy0+aDI2M0NvbXBvbmVudFtpXS5iRm9yY2VSb3VuZGluZ1R5cGVUb1plcm8gPSBPTVhfVFJVRTsKKyAgICAgICAgICAgIHBNcGVnNEVuYy0+aDI2M0NvbXBvbmVudFtpXS5uUGljdHVyZUhlYWRlclJlcGV0aXRpb24gPSAwOworICAgICAgICAgICAgcE1wZWc0RW5jLT5oMjYzQ29tcG9uZW50W2ldLm5HT0JIZWFkZXJJbnRlcnZhbCA9IDA7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwT01YQ29tcG9uZW50LT5HZXRQYXJhbWV0ZXIgICAgICA9ICZTRUNfTUZDX01wZWc0RW5jX0dldFBhcmFtZXRlcjsKKyAgICBwT01YQ29tcG9uZW50LT5TZXRQYXJhbWV0ZXIgICAgICA9ICZTRUNfTUZDX01wZWc0RW5jX1NldFBhcmFtZXRlcjsKKyAgICBwT01YQ29tcG9uZW50LT5HZXRDb25maWcgICAgICAgICA9ICZTRUNfTUZDX01wZWc0RW5jX0dldENvbmZpZzsKKyAgICBwT01YQ29tcG9uZW50LT5TZXRDb25maWcgICAgICAgICA9ICZTRUNfTUZDX01wZWc0RW5jX1NldENvbmZpZzsKKyAgICBwT01YQ29tcG9uZW50LT5HZXRFeHRlbnNpb25JbmRleCA9ICZTRUNfTUZDX01wZWc0RW5jX0dldEV4dGVuc2lvbkluZGV4OworICAgIHBPTVhDb21wb25lbnQtPkNvbXBvbmVudFJvbGVFbnVtID0gJlNFQ19NRkNfTXBlZzRFbmNfQ29tcG9uZW50Um9sZUVudW07CisgICAgcE9NWENvbXBvbmVudC0+Q29tcG9uZW50RGVJbml0ICAgPSAmU0VDX09NWF9Db21wb25lbnREZWluaXQ7CisKKyAgICBwU0VDQ29tcG9uZW50LT5zZWNfbWZjX2NvbXBvbmVudEluaXQgICAgICA9ICZTRUNfTUZDX01wZWc0RW5jX0luaXQ7CisgICAgcFNFQ0NvbXBvbmVudC0+c2VjX21mY19jb21wb25lbnRUZXJtaW5hdGUgPSAmU0VDX01GQ19NcGVnNEVuY19UZXJtaW5hdGU7CisgICAgcFNFQ0NvbXBvbmVudC0+c2VjX21mY19idWZmZXJQcm9jZXNzICAgICAgPSAmU0VDX01GQ19NcGVnNEVuY19idWZmZXJQcm9jZXNzOworICAgIHBTRUNDb21wb25lbnQtPnNlY19jaGVja0lucHV0RnJhbWUgICAgICAgID0gTlVMTDsKKworICAgIHBTRUNDb21wb25lbnQtPmN1cnJlbnRTdGF0ZSA9IE9NWF9TdGF0ZUxvYWRlZDsKKworICAgIHJldCA9IE9NWF9FcnJvck5vbmU7CisKK0VYSVQ6CisgICAgRnVuY3Rpb25PdXQoKTsKKworICAgIHJldHVybiByZXQ7Cit9CisKK09NWF9FUlJPUlRZUEUgU0VDX09NWF9Db21wb25lbnREZWluaXQoT01YX0hBTkRMRVRZUEUgaENvbXBvbmVudCkKK3sKKyAgICBPTVhfRVJST1JUWVBFICAgICAgICAgICAgcmV0ID0gT01YX0Vycm9yTm9uZTsKKyAgICBPTVhfQ09NUE9ORU5UVFlQRSAgICAgICAqcE9NWENvbXBvbmVudCA9IE5VTEw7CisgICAgU0VDX09NWF9CQVNFQ09NUE9ORU5UICAgKnBTRUNDb21wb25lbnQgPSBOVUxMOworICAgIFNFQ19NUEVHNEVOQ19IQU5ETEUgICAgICpwTXBlZzRFbmMgPSBOVUxMOworCisgICAgRnVuY3Rpb25JbigpOworCisgICAgaWYgKGhDb21wb25lbnQgPT0gTlVMTCkgeworICAgICAgICByZXQgPSBPTVhfRXJyb3JCYWRQYXJhbWV0ZXI7CisgICAgICAgIGdvdG8gRVhJVDsKKyAgICB9CisgICAgcE9NWENvbXBvbmVudCA9IChPTVhfQ09NUE9ORU5UVFlQRSAqKWhDb21wb25lbnQ7CisgICAgcFNFQ0NvbXBvbmVudCA9IChTRUNfT01YX0JBU0VDT01QT05FTlQgKilwT01YQ29tcG9uZW50LT5wQ29tcG9uZW50UHJpdmF0ZTsKKworICAgIFNFQ19PU0FMX0ZyZWUocFNFQ0NvbXBvbmVudC0+Y29tcG9uZW50TmFtZSk7CisgICAgcFNFQ0NvbXBvbmVudC0+Y29tcG9uZW50TmFtZSA9IE5VTEw7CisKKyAgICBwTXBlZzRFbmMgPSAoU0VDX01QRUc0RU5DX0hBTkRMRSAqKSgoU0VDX09NWF9WSURFT0VOQ19DT01QT05FTlQgKilwU0VDQ29tcG9uZW50LT5oQ29tcG9uZW50SGFuZGxlKS0+aENvZGVjSGFuZGxlOworICAgIGlmIChwTXBlZzRFbmMgIT0gTlVMTCkgeworICAgICAgICBTRUNfT1NBTF9GcmVlKHBNcGVnNEVuYyk7CisgICAgICAgIHBNcGVnNEVuYyA9ICgoU0VDX09NWF9WSURFT0VOQ19DT01QT05FTlQgKilwU0VDQ29tcG9uZW50LT5oQ29tcG9uZW50SGFuZGxlKS0+aENvZGVjSGFuZGxlID0gTlVMTDsKKyAgICB9CisKKyAgICByZXQgPSBTRUNfT01YX1ZpZGVvRW5jb2RlQ29tcG9uZW50RGVpbml0KHBPTVhDb21wb25lbnQpOworICAgIGlmIChyZXQgIT0gT01YX0Vycm9yTm9uZSkgeworICAgICAgICBnb3RvIEVYSVQ7CisgICAgfQorCisgICAgcmV0ID0gT01YX0Vycm9yTm9uZTsKKworRVhJVDoKKyAgICBGdW5jdGlvbk91dCgpOworCisgICAgcmV0dXJuIHJldDsKK30KZGlmZiAtLWdpdCBhL2V4eW5vczQvbXVsdGltZWRpYS9vcGVubWF4L3NlY19vbXgvY29tcG9uZW50L3ZpZGVvL2VuYy9tcGVnNC9TRUNfT01YX01wZWc0ZW5jLmggYi9leHlub3M0L211bHRpbWVkaWEvb3Blbm1heC9zZWNfb214L2NvbXBvbmVudC92aWRlby9lbmMvbXBlZzQvU0VDX09NWF9NcGVnNGVuYy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmFhMzJjNDIKLS0tIC9kZXYvbnVsbAorKysgYi9leHlub3M0L211bHRpbWVkaWEvb3Blbm1heC9zZWNfb214L2NvbXBvbmVudC92aWRlby9lbmMvbXBlZzQvU0VDX09NWF9NcGVnNGVuYy5oCkBAIC0wLDAgKzEsNzcgQEAKKy8qCisgKgorICogQ29weXJpZ2h0IDIwMTAgU2Ftc3VuZyBFbGVjdHJvbmljcyBTLkxTSSBDby4gTFRECisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKy8qCisgKiBAZmlsZSAgICAgICAgU0VDX09NWF9NcGVnNGVuYy5oCisgKiBAYnJpZWYKKyAqIEBhdXRob3IgICAgICBZdW5qaSBLaW0gKHl1bmppLmtpbUBzYW1zdW5nLmNvbSkKKyAqIEB2ZXJzaW9uICAgICAxLjEuMAorICogQGhpc3RvcnkKKyAqICAgMjAxMC43LjE1IDogQ3JlYXRlCisgKi8KKworI2lmbmRlZiBTRUNfT01YX01QRUc0X0VOQ19DT01QT05FTlQKKyNkZWZpbmUgU0VDX09NWF9NUEVHNF9FTkNfQ09NUE9ORU5UCisKKyNpbmNsdWRlICJTRUNfT01YX0RlZi5oIgorI2luY2x1ZGUgIk9NWF9Db21wb25lbnQuaCIKKyNpbmNsdWRlICJTc2JTaXBNZmNBcGkuaCIKKworCit0eXBlZGVmIGVudW0gX0NPREVDX1RZUEUKK3sKKyAgICBDT0RFQ19UWVBFX0gyNjMsCisgICAgQ09ERUNfVFlQRV9NUEVHNAorfSBDT0RFQ19UWVBFOworCit0eXBlZGVmIHN0cnVjdCBfU0VDX01GQ19NUEVHNEVOQ19IQU5ETEUKK3sKKyAgICBPTVhfSEFORExFVFlQRSAgICAgICAgICAgICBoTUZDSGFuZGxlOworICAgIFNTQlNJUF9NRkNfRU5DX01QRUc0X1BBUkFNIG1wZWc0TUZDUGFyYW07CisgICAgU1NCU0lQX01GQ19FTkNfSDI2M19QQVJBTSAgaDI2M01GQ1BhcmFtOworICAgIFNTQlNJUF9NRkNfRU5DX0lOUFVUX0lORk8gIGlucHV0SW5mbzsKKyAgICBPTVhfVTMyICAgICAgICAgICAgICAgICAgICBpbmRleFRpbWVzdGFtcDsKKyAgICBPTVhfQk9PTCAgICAgICAgICAgICAgICAgICBiQ29uZmlndXJlZE1GQzsKKyAgICBDT0RFQ19UWVBFICAgICAgICAgICAgICAgICBjb2RlY1R5cGU7CisgICAgT01YX1MzMiAgICAgICAgICAgICAgICAgICAgcmV0dXJuQ29kZWM7Cit9IFNFQ19NRkNfTVBFRzRFTkNfSEFORExFOworCit0eXBlZGVmIHN0cnVjdCBfU0VDX01QRUc0RU5DX0hBTkRMRQoreworICAgIC8qIE9NWCBDb2RlYyBzcGVjaWZpYyAqLworICAgIE9NWF9WSURFT19QQVJBTV9IMjYzVFlQRSAgaDI2M0NvbXBvbmVudFtBTExfUE9SVF9OVU1dOworICAgIE9NWF9WSURFT19QQVJBTV9NUEVHNFRZUEUgbXBlZzRDb21wb25lbnRbQUxMX1BPUlRfTlVNXTsKKyAgICBPTVhfVklERU9fUEFSQU1fRVJST1JDT1JSRUNUSU9OVFlQRSBlcnJvckNvcnJlY3Rpb25UeXBlW0FMTF9QT1JUX05VTV07CisKKyAgICAvKiBTRUMgTUZDIENvZGVjIHNwZWNpZmljICovCisgICAgU0VDX01GQ19NUEVHNEVOQ19IQU5ETEUgICBoTUZDTXBlZzRIYW5kbGU7Cit9IFNFQ19NUEVHNEVOQ19IQU5ETEU7CisKKworI2lmZGVmIF9fY3BsdXNwbHVzCitleHRlcm4gIkMiIHsKKyNlbmRpZgorCisKK09TQ0xfRVhQT1JUX1JFRiBPTVhfRVJST1JUWVBFIFNFQ19PTVhfQ29tcG9uZW50SW5pdChPTVhfSEFORExFVFlQRSBoQ29tcG9uZW50LCBPTVhfU1RSSU5HIGNvbXBvbmVudE5hbWUpOworICAgICAgICAgICAgICAgIE9NWF9FUlJPUlRZUEUgU0VDX09NWF9Db21wb25lbnREZWluaXQoT01YX0hBTkRMRVRZUEUgaENvbXBvbmVudCk7CisKKyNpZmRlZiBfX2NwbHVzcGx1cworfTsKKyNlbmRpZgorCisjZW5kaWYKZGlmZiAtLWdpdCBhL2V4eW5vczQvbXVsdGltZWRpYS9vcGVubWF4L3NlY19vbXgvY29tcG9uZW50L3ZpZGVvL2VuYy9tcGVnNC9saWJyYXJ5X3JlZ2lzdGVyLmMgYi9leHlub3M0L211bHRpbWVkaWEvb3Blbm1heC9zZWNfb214L2NvbXBvbmVudC92aWRlby9lbmMvbXBlZzQvbGlicmFyeV9yZWdpc3Rlci5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQ0M2IyZDcKLS0tIC9kZXYvbnVsbAorKysgYi9leHlub3M0L211bHRpbWVkaWEvb3Blbm1heC9zZWNfb214L2NvbXBvbmVudC92aWRlby9lbmMvbXBlZzQvbGlicmFyeV9yZWdpc3Rlci5jCkBAIC0wLDAgKzEsNjQgQEAKKy8qCisgKgorICogQ29weXJpZ2h0IDIwMTAgU2Ftc3VuZyBFbGVjdHJvbmljcyBTLkxTSSBDby4gTFRECisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKy8qCisgKiBAZmlsZSAgICAgICAgbGlicmFyeV9yZWdpc3Rlci5jCisgKiBAYnJpZWYKKyAqIEBhdXRob3IgICAgICBZdW5qaSBLaW0gKHl1bmppLmtpbUBzYW1zdW5nLmNvbSkKKyAqIEB2ZXJzaW9uICAgICAxLjEuMAorICogQGhpc3RvcnkKKyAqICAgMjAxMC43LjE1IDogQ3JlYXRlCisgKi8KKworCisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlIDxzdGRsaWIuaD4KKyNpbmNsdWRlIDxzdHJpbmcuaD4KKyNpbmNsdWRlIDxkbGZjbi5oPgorCisjaW5jbHVkZSAiU0VDX09TQUxfTWVtb3J5LmgiCisjaW5jbHVkZSAiU0VDX09TQUxfRVRDLmgiCisjaW5jbHVkZSAibGlicmFyeV9yZWdpc3Rlci5oIgorCisjdW5kZWYgIFNFQ19MT0dfVEFHCisjZGVmaW5lIFNFQ19MT0dfVEFHICAgICJTRUNfTVBFRzRfRU5DIgorI2RlZmluZSBTRUNfTE9HX09GRgorI2luY2x1ZGUgIlNFQ19PU0FMX0xvZy5oIgorCisKK09TQ0xfRVhQT1JUX1JFRiBpbnQgU0VDX09NWF9DT01QT05FTlRfTGlicmFyeV9SZWdpc3RlcihTRUNSZWdpc3RlckNvbXBvbmVudFR5cGUgKipwcFNFQ0NvbXBvbmVudCkKK3sKKwlGdW5jdGlvbkluKCk7CisKKwlpZiAocHBTRUNDb21wb25lbnQgPT0gTlVMTCkKKwkJZ290byBFWElUOworCisJLyogY29tcG9uZW50IDEgLSB2aWRlbyBlbmNvZGVyIE1QRUc0ICovCisJU0VDX09TQUxfU3RyY3B5KHBwU0VDQ29tcG9uZW50WzBdLT5jb21wb25lbnROYW1lLCBTRUNfT01YX0NPTVBPTkVOVF9NUEVHNF9FTkMpOworCVNFQ19PU0FMX1N0cmNweShwcFNFQ0NvbXBvbmVudFswXS0+cm9sZXNbMF0sIFNFQ19PTVhfQ09NUE9ORU5UX01QRUc0X0VOQ19ST0xFKTsKKwlwcFNFQ0NvbXBvbmVudFswXS0+dG90YWxSb2xlTnVtID0gTUFYX0NPTVBPTkVOVF9ST0xFX05VTTsKKworCS8qIGNvbXBvbmVudCAyIC0gdmlkZW8gZW5jb2RlciBILjI2MyAqLworCVNFQ19PU0FMX1N0cmNweShwcFNFQ0NvbXBvbmVudFsxXS0+Y29tcG9uZW50TmFtZSwgU0VDX09NWF9DT01QT05FTlRfSDI2M19FTkMpOworCVNFQ19PU0FMX1N0cmNweShwcFNFQ0NvbXBvbmVudFsxXS0+cm9sZXNbMF0sIFNFQ19PTVhfQ09NUE9ORU5UX0gyNjNfRU5DX1JPTEUpOworCXBwU0VDQ29tcG9uZW50WzFdLT50b3RhbFJvbGVOdW0gPSBNQVhfQ09NUE9ORU5UX1JPTEVfTlVNOworCitFWElUOgorCUZ1bmN0aW9uT3V0KCk7CisJcmV0dXJuIE1BWF9DT01QT05FTlRfTlVNOworfQorCmRpZmYgLS1naXQgYS9leHlub3M0L211bHRpbWVkaWEvb3Blbm1heC9zZWNfb214L2NvbXBvbmVudC92aWRlby9lbmMvbXBlZzQvbGlicmFyeV9yZWdpc3Rlci5oIGIvZXh5bm9zNC9tdWx0aW1lZGlhL29wZW5tYXgvc2VjX29teC9jb21wb25lbnQvdmlkZW8vZW5jL21wZWc0L2xpYnJhcnlfcmVnaXN0ZXIuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40MmExNjhiCi0tLSAvZGV2L251bGwKKysrIGIvZXh5bm9zNC9tdWx0aW1lZGlhL29wZW5tYXgvc2VjX29teC9jb21wb25lbnQvdmlkZW8vZW5jL21wZWc0L2xpYnJhcnlfcmVnaXN0ZXIuaApAQCAtMCwwICsxLDU5IEBACisvKgorICoKKyAqIENvcHlyaWdodCAyMDEwIFNhbXN1bmcgRWxlY3Ryb25pY3MgUy5MU0kgQ28uIExURAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisvKgorICogQGZpbGUgICAgICAgIGxpYnJhcnlfcmVnaXN0ZXIuaAorICogQGJyaWVmCisgKiBAYXV0aG9yICAgICAgWXVuamkgS2ltICh5dW5qaS5raW1Ac2Ftc3VuZy5jb20pCisgKiBAdmVyc2lvbiAgICAgMS4xLjAKKyAqIEBoaXN0b3J5CisgKiAgIDIwMTAuNy4xNSA6IENyZWF0ZQorICovCisKKyNpZm5kZWYgU0VDX09NWF9NUEVHNF9FTkNfUkVHCisjZGVmaW5lIFNFQ19PTVhfTVBFRzRfRU5DX1JFRworCisjaW5jbHVkZSAiU0VDX09NWF9EZWYuaCIKKyNpbmNsdWRlICJPTVhfQ29tcG9uZW50LmgiCisjaW5jbHVkZSAiU0VDX09NWF9Db21wb25lbnRfUmVnaXN0ZXIuaCIKKworCisjZGVmaW5lIE9TQ0xfRVhQT1JUX1JFRiBfX2F0dHJpYnV0ZV9fKCh2aXNpYmlsaXR5KCJkZWZhdWx0IikpKQorI2RlZmluZSBNQVhfQ09NUE9ORU5UX05VTSAgICAgICAyCisjZGVmaW5lIE1BWF9DT01QT05FTlRfUk9MRV9OVU0gIDEKKworLyogTVBFRzQgKi8KKyNkZWZpbmUgU0VDX09NWF9DT01QT05FTlRfTVBFRzRfRU5DICAgICAgICAgIk9NWC5TRUMuTVBFRzQuRW5jb2RlciIKKyNkZWZpbmUgU0VDX09NWF9DT01QT05FTlRfTVBFRzRfRU5DX1JPTEUgICAgInZpZGVvX2VuY29kZXIubXBlZzQiCisKKy8qIEguMjYzICovCisjZGVmaW5lIFNFQ19PTVhfQ09NUE9ORU5UX0gyNjNfRU5DICAgICAgICAgICJPTVguU0VDLkgyNjMuRW5jb2RlciIKKyNkZWZpbmUgU0VDX09NWF9DT01QT05FTlRfSDI2M19FTkNfUk9MRSAgICAgInZpZGVvX2VuY29kZXIuaDI2MyIKKworCisjaWZkZWYgX19jcGx1c3BsdXMKK2V4dGVybiAiQyIgeworI2VuZGlmCisKK09TQ0xfRVhQT1JUX1JFRiBpbnQgU0VDX09NWF9DT01QT05FTlRfTGlicmFyeV9SZWdpc3RlcihTRUNSZWdpc3RlckNvbXBvbmVudFR5cGUgKipwcFNFQ0NvbXBvbmVudCk7CisKKyNpZmRlZiBfX2NwbHVzcGx1cworfTsKKyNlbmRpZgorCisjZW5kaWYKKwpkaWZmIC0tZ2l0IGEvZXh5bm9zNC9tdWx0aW1lZGlhL29wZW5tYXgvc2VjX29teC9jb3JlL0FuZHJvaWQubWsgYi9leHlub3M0L211bHRpbWVkaWEvb3Blbm1heC9zZWNfb214L2NvcmUvQW5kcm9pZC5tawpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44OTIyZTRiCi0tLSAvZGV2L251bGwKKysrIGIvZXh5bm9zNC9tdWx0aW1lZGlhL29wZW5tYXgvc2VjX29teC9jb3JlL0FuZHJvaWQubWsKQEAgLTAsMCArMSwyNiBAQAorTE9DQUxfUEFUSCA6PSAkKGNhbGwgbXktZGlyKQoraW5jbHVkZSAkKENMRUFSX1ZBUlMpCisKK0xPQ0FMX01PRFVMRV9UQUdTIDo9IG9wdGlvbmFsCisKK0xPQ0FMX1NSQ19GSUxFUyA6PSBTRUNfT01YX0NvbXBvbmVudF9SZWdpc3Rlci5jIFwKKwlTRUNfT01YX0NvcmUuYworCitMT0NBTF9QUkVMSU5LX01PRFVMRSA6PSBmYWxzZQorTE9DQUxfTU9EVUxFIDo9IGxpYlNFQ19PTVhfQ29yZQorCitMT0NBTF9DRkxBR1MgOj0KKworTE9DQUxfQVJNX01PREUgOj0gYXJtCisKK0xPQ0FMX1NUQVRJQ19MSUJSQVJJRVMgOj0gbGlic2Vjb3NhbCBsaWJzZWNiYXNlY29tcG9uZW50CitMT0NBTF9TSEFSRURfTElCUkFSSUVTIDo9IGxpYmMgbGliZGwgbGliY3V0aWxzIGxpYnV0aWxzIFwKKwlsaWJTRUNfT01YX1Jlc291cmNlbWFuYWdlcgorCitMT0NBTF9DX0lOQ0xVREVTIDo9ICQoU0VDX09NWF9JTkMpL2tocm9ub3MgXAorCSQoU0VDX09NWF9JTkMpL3NlYyBcCisJJChTRUNfT01YX1RPUCkvb3NhbCBcCisJJChTRUNfT01YX1RPUCkvY29tcG9uZW50L2NvbW1vbgorCitpbmNsdWRlICQoQlVJTERfU0hBUkVEX0xJQlJBUlkpCisKZGlmZiAtLWdpdCBhL2V4eW5vczQvbXVsdGltZWRpYS9vcGVubWF4L3NlY19vbXgvY29yZS9TRUNfT01YX0NvbXBvbmVudF9SZWdpc3Rlci5jIGIvZXh5bm9zNC9tdWx0aW1lZGlhL29wZW5tYXgvc2VjX29teC9jb3JlL1NFQ19PTVhfQ29tcG9uZW50X1JlZ2lzdGVyLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjdhODgwNQotLS0gL2Rldi9udWxsCisrKyBiL2V4eW5vczQvbXVsdGltZWRpYS9vcGVubWF4L3NlY19vbXgvY29yZS9TRUNfT01YX0NvbXBvbmVudF9SZWdpc3Rlci5jCkBAIC0wLDAgKzEsMjY0IEBACisvKgorICoKKyAqIENvcHlyaWdodCAyMDEwIFNhbXN1bmcgRWxlY3Ryb25pY3MgUy5MU0kgQ28uIExURAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisvKgorICogQGZpbGUgICAgICAgU0VDX09NWF9Db21wb25lbnRfUmVnaXN0ZXIuYworICogQGJyaWVmICAgICAgU0VDIE9wZW5NQVggSUwgQ29tcG9uZW50IFJlZ2lzdGVyCisgKiBAYXV0aG9yICAgICBTZXVuZ0Jlb20gS2ltIChzYmNydXgua2ltQHNhbXN1bmcuY29tKQorICogQHZlcnNpb24gICAgMS4xLjAKKyAqIEBoaXN0b3J5CisgKiAgICAyMDEwLjcuMTUgOiBDcmVhdGUKKyAqLworI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8c3RkbGliLmg+CisjaW5jbHVkZSA8c3RyaW5nLmg+CisjaW5jbHVkZSA8ZGxmY24uaD4KKyNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KKyNpbmNsdWRlIDxkaXJlbnQuaD4KKyNpbmNsdWRlIDxlcnJuby5oPgorI2luY2x1ZGUgPGFzc2VydC5oPgorI2luY2x1ZGUgPGRpcmVudC5oPgorCisjaW5jbHVkZSAiT01YX0NvbXBvbmVudC5oIgorI2luY2x1ZGUgIlNFQ19PU0FMX01lbW9yeS5oIgorI2luY2x1ZGUgIlNFQ19PU0FMX0VUQy5oIgorI2luY2x1ZGUgIlNFQ19PU0FMX0xpYnJhcnkuaCIKKyNpbmNsdWRlICJTRUNfT01YX0NvbXBvbmVudF9SZWdpc3Rlci5oIgorI2luY2x1ZGUgIlNFQ19PTVhfTWFjcm9zLmgiCisKKyN1bmRlZiAgU0VDX0xPR19UQUcKKyNkZWZpbmUgU0VDX0xPR19UQUcgICAgIlNFQ19DT01QX1JFR1MiCisjZGVmaW5lIFNFQ19MT0dfT0ZGCisjaW5jbHVkZSAiU0VDX09TQUxfTG9nLmgiCisKK09NWF9FUlJPUlRZUEUgU0VDX09NWF9Db21wb25lbnRfUmVnaXN0ZXIoU0VDX09NWF9DT01QT05FTlRfUkVHTElTVCAqKmNvbXBMaXN0LCBPTVhfVTMyICpjb21wTnVtKQoreworICAgIE9NWF9FUlJPUlRZUEUgIHJldCA9IE9NWF9FcnJvck5vbmU7CisgICAgaW50ICAgICAgICAgICAgY29tcG9uZW50TnVtID0gMCwgcm9sZU51bSA9IDAsIHRvdGFsQ29tcE51bSA9IDA7CisgICAgaW50ICAgICAgICAgICAgcmVhZDsKKyAgICBjaGFyICAgICAgICAgICpsaWJOYW1lOworICAgIHNpemVfdCAgICAgICAgIGxlbjsKKyAgICBjb25zdCBjaGFyICAgICplcnJvck1zZzsKKyAgICBESVIgICAgICAgICAgICpkaXI7CisgICAgc3RydWN0IGRpcmVudCAqZDsKKworICAgIGludCAoKlNFQ19PTVhfQ09NUE9ORU5UX0xpYnJhcnlfUmVnaXN0ZXIpKFNFQ1JlZ2lzdGVyQ29tcG9uZW50VHlwZSAqKnNlY0NvbXBvbmVudHMpOworICAgIFNFQ1JlZ2lzdGVyQ29tcG9uZW50VHlwZSAqKnNlY0NvbXBvbmVudHNUZW1wOworICAgIFNFQ19PTVhfQ09NUE9ORU5UX1JFR0xJU1QgKmNvbXBvbmVudExpc3Q7CisKKyAgICBGdW5jdGlvbkluKCk7CisKKyAgICBkaXIgPSBvcGVuZGlyKFNFQ19PTVhfSU5TVEFMTF9QQVRIKTsKKyAgICBpZiAoZGlyID09IE5VTEwpIHsKKyAgICAgICAgcmV0ID0gT01YX0Vycm9yVW5kZWZpbmVkOworICAgICAgICBnb3RvIEVYSVQ7CisgICAgfQorCisgICAgY29tcG9uZW50TGlzdCA9IChTRUNfT01YX0NPTVBPTkVOVF9SRUdMSVNUICopU0VDX09TQUxfTWFsbG9jKHNpemVvZihTRUNfT01YX0NPTVBPTkVOVF9SRUdMSVNUKSAqIE1BWF9PTVhfQ09NUE9ORU5UX05VTSk7CisgICAgU0VDX09TQUxfTWVtc2V0KGNvbXBvbmVudExpc3QsIDAsIHNpemVvZihTRUNfT01YX0NPTVBPTkVOVF9SRUdMSVNUKSAqIE1BWF9PTVhfQ09NUE9ORU5UX05VTSk7CisgICAgbGliTmFtZSA9IFNFQ19PU0FMX01hbGxvYyhNQVhfT01YX0NPTVBPTkVOVF9MSUJOQU1FX1NJWkUpOworCisgICAgd2hpbGUgKChkID0gcmVhZGRpcihkaXIpKSAhPSBOVUxMKSB7CisgICAgICAgIE9NWF9IQU5ETEVUWVBFIHNvSGFuZGxlOworICAgICAgICBTRUNfT1NBTF9Mb2coU0VDX0xPR19FUlJPUiwgIiVzIiwgZC0+ZF9uYW1lKTsKKworICAgICAgICBpZiAoU0VDX09TQUxfU3RybmNtcChkLT5kX25hbWUsICJsaWJPTVguU0VDLiIsIFNFQ19PU0FMX1N0cmxlbigibGliT01YLlNFQy4iKSkgPT0gMCkgeworICAgICAgICAgICAgU0VDX09TQUxfTWVtc2V0KGxpYk5hbWUsIDAsIE1BWF9PTVhfQ09NUE9ORU5UX0xJQk5BTUVfU0laRSk7CisgICAgICAgICAgICBTRUNfT1NBTF9TdHJjcHkobGliTmFtZSwgU0VDX09NWF9JTlNUQUxMX1BBVEgpOworICAgICAgICAgICAgU0VDX09TQUxfU3RyY2F0KGxpYk5hbWUsIGQtPmRfbmFtZSk7CisgICAgICAgICAgICBTRUNfT1NBTF9Mb2coU0VDX0xPR19FUlJPUiwgIlBhdGggJiBsaWJOYW1lIDogJXMiLCBsaWJOYW1lKTsKKyAgICAgICAgICAgIGlmICgoc29IYW5kbGUgPSBTRUNfT1NBTF9kbG9wZW4obGliTmFtZSwgUlRMRF9OT1cpKSAhPSBOVUxMKSB7CisgICAgICAgICAgICAgICAgU0VDX09TQUxfZGxlcnJvcigpOyAgICAvKiBjbGVhciBlcnJvciovCisgICAgICAgICAgICAgICAgaWYgKChTRUNfT01YX0NPTVBPTkVOVF9MaWJyYXJ5X1JlZ2lzdGVyID0gU0VDX09TQUxfZGxzeW0oc29IYW5kbGUsICJTRUNfT01YX0NPTVBPTkVOVF9MaWJyYXJ5X1JlZ2lzdGVyIikpICE9IE5VTEwpIHsKKyAgICAgICAgICAgICAgICAgICAgaW50IGkgPSAwOworICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBpbnQgaiA9IDA7CisKKyAgICAgICAgICAgICAgICAgICAgY29tcG9uZW50TnVtID0gKCpTRUNfT01YX0NPTVBPTkVOVF9MaWJyYXJ5X1JlZ2lzdGVyKShOVUxMKTsKKyAgICAgICAgICAgICAgICAgICAgc2VjQ29tcG9uZW50c1RlbXAgPSAoU0VDUmVnaXN0ZXJDb21wb25lbnRUeXBlICoqKVNFQ19PU0FMX01hbGxvYyhzaXplb2YoU0VDUmVnaXN0ZXJDb21wb25lbnRUeXBlKikgKiBjb21wb25lbnROdW0pOworICAgICAgICAgICAgICAgICAgICBmb3IgKGkgPSAwOyBpIDwgY29tcG9uZW50TnVtOyBpKyspIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHNlY0NvbXBvbmVudHNUZW1wW2ldID0gU0VDX09TQUxfTWFsbG9jKHNpemVvZihTRUNSZWdpc3RlckNvbXBvbmVudFR5cGUpKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIFNFQ19PU0FMX01lbXNldChzZWNDb21wb25lbnRzVGVtcFtpXSwgMCwgc2l6ZW9mKFNFQ1JlZ2lzdGVyQ29tcG9uZW50VHlwZSkpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICgqU0VDX09NWF9DT01QT05FTlRfTGlicmFyeV9SZWdpc3Rlcikoc2VjQ29tcG9uZW50c1RlbXApOworCisgICAgICAgICAgICAgICAgICAgIGZvciAoaSA9IDA7IGkgPCBjb21wb25lbnROdW07IGkrKykgeworICAgICAgICAgICAgICAgICAgICAgICAgU0VDX09TQUxfU3RyY3B5KGNvbXBvbmVudExpc3RbdG90YWxDb21wTnVtXS5jb21wb25lbnQuY29tcG9uZW50TmFtZSwgc2VjQ29tcG9uZW50c1RlbXBbaV0tPmNvbXBvbmVudE5hbWUpOworICAgICAgICAgICAgICAgICAgICAgICAgZm9yIChqID0gMDsgaiA8IHNlY0NvbXBvbmVudHNUZW1wW2ldLT50b3RhbFJvbGVOdW07IGorKykKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBTRUNfT1NBTF9TdHJjcHkoY29tcG9uZW50TGlzdFt0b3RhbENvbXBOdW1dLmNvbXBvbmVudC5yb2xlc1tqXSwgc2VjQ29tcG9uZW50c1RlbXBbaV0tPnJvbGVzW2pdKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNvbXBvbmVudExpc3RbdG90YWxDb21wTnVtXS5jb21wb25lbnQudG90YWxSb2xlTnVtID0gc2VjQ29tcG9uZW50c1RlbXBbaV0tPnRvdGFsUm9sZU51bTsKKworICAgICAgICAgICAgICAgICAgICAgICAgU0VDX09TQUxfU3RyY3B5KGNvbXBvbmVudExpc3RbdG90YWxDb21wTnVtXS5saWJOYW1lLCBsaWJOYW1lKTsKKworICAgICAgICAgICAgICAgICAgICAgICAgdG90YWxDb21wTnVtKys7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgZm9yIChpID0gMDsgaSA8IGNvbXBvbmVudE51bTsgaSsrKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBTRUNfT1NBTF9GcmVlKHNlY0NvbXBvbmVudHNUZW1wW2ldKTsKKyAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgIFNFQ19PU0FMX0ZyZWUoc2VjQ29tcG9uZW50c1RlbXApOworICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIGlmICgoZXJyb3JNc2cgPSBTRUNfT1NBTF9kbGVycm9yKCkpICE9IE5VTEwpCisgICAgICAgICAgICAgICAgICAgICAgICBTRUNfT1NBTF9Mb2coU0VDX0xPR19XQVJOSU5HLCAiZGxzeW0gZmFpbGVkOiAlcyIsIGVycm9yTXNnKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgU0VDX09TQUxfZGxjbG9zZShzb0hhbmRsZSk7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIFNFQ19PU0FMX0xvZyhTRUNfTE9HX1dBUk5JTkcsICJkbG9wZW4gZmFpbGVkOiAlcyIsIFNFQ19PU0FMX2RsZXJyb3IoKSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAvKiBub3QgYSBjb21wb25lbnQgbmFtZSBsaW5lLiBza2lwICovCisgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgfQorICAgIH0KKworICAgIFNFQ19PU0FMX0ZyZWUobGliTmFtZSk7CisKKyAgICBjbG9zZWRpcihkaXIpOworCisgICAgKmNvbXBMaXN0ID0gY29tcG9uZW50TGlzdDsKKyAgICAqY29tcE51bSA9IHRvdGFsQ29tcE51bTsKKworRVhJVDoKKyAgICBGdW5jdGlvbk91dCgpOworCisgICAgcmV0dXJuIHJldDsKK30KKworT01YX0VSUk9SVFlQRSBTRUNfT01YX0NvbXBvbmVudF9VbnJlZ2lzdGVyKFNFQ19PTVhfQ09NUE9ORU5UX1JFR0xJU1QgKmNvbXBvbmVudExpc3QpCit7CisgICAgT01YX0VSUk9SVFlQRSByZXQgPSBPTVhfRXJyb3JOb25lOworCisgICAgU0VDX09TQUxfTWVtc2V0KGNvbXBvbmVudExpc3QsIDAsIHNpemVvZihTRUNfT01YX0NPTVBPTkVOVF9SRUdMSVNUKSAqIE1BWF9PTVhfQ09NUE9ORU5UX05VTSk7CisgICAgU0VDX09TQUxfRnJlZShjb21wb25lbnRMaXN0KTsKKworRVhJVDoKKyAgICByZXR1cm4gcmV0OworfQorCitPTVhfRVJST1JUWVBFIFNFQ19PTVhfQ29tcG9uZW50QVBJQ2hlY2soT01YX0NPTVBPTkVOVFRZUEUgKmNvbXBvbmVudCkKK3sKKyAgICBPTVhfRVJST1JUWVBFIHJldCA9IE9NWF9FcnJvck5vbmU7CisKKyAgICBpZiAoKE5VTEwgPT0gY29tcG9uZW50LT5HZXRDb21wb25lbnRWZXJzaW9uKSAgICB8fAorICAgICAgICAoTlVMTCA9PSBjb21wb25lbnQtPlNlbmRDb21tYW5kKSAgICAgICAgICAgIHx8CisgICAgICAgIChOVUxMID09IGNvbXBvbmVudC0+R2V0UGFyYW1ldGVyKSAgICAgICAgICAgfHwKKyAgICAgICAgKE5VTEwgPT0gY29tcG9uZW50LT5TZXRQYXJhbWV0ZXIpICAgICAgICAgICB8fAorICAgICAgICAoTlVMTCA9PSBjb21wb25lbnQtPkdldENvbmZpZykgICAgICAgICAgICAgIHx8CisgICAgICAgIChOVUxMID09IGNvbXBvbmVudC0+U2V0Q29uZmlnKSAgICAgICAgICAgICAgfHwKKyAgICAgICAgKE5VTEwgPT0gY29tcG9uZW50LT5HZXRFeHRlbnNpb25JbmRleCkgICAgICB8fAorICAgICAgICAoTlVMTCA9PSBjb21wb25lbnQtPkdldFN0YXRlKSAgICAgICAgICAgICAgIHx8CisgICAgICAgIChOVUxMID09IGNvbXBvbmVudC0+Q29tcG9uZW50VHVubmVsUmVxdWVzdCkgfHwKKyAgICAgICAgKE5VTEwgPT0gY29tcG9uZW50LT5Vc2VCdWZmZXIpICAgICAgICAgICAgICB8fAorICAgICAgICAoTlVMTCA9PSBjb21wb25lbnQtPkFsbG9jYXRlQnVmZmVyKSAgICAgICAgIHx8CisgICAgICAgIChOVUxMID09IGNvbXBvbmVudC0+RnJlZUJ1ZmZlcikgICAgICAgICAgICAgfHwKKyAgICAgICAgKE5VTEwgPT0gY29tcG9uZW50LT5FbXB0eVRoaXNCdWZmZXIpICAgICAgICB8fAorICAgICAgICAoTlVMTCA9PSBjb21wb25lbnQtPkZpbGxUaGlzQnVmZmVyKSAgICAgICAgIHx8CisgICAgICAgIChOVUxMID09IGNvbXBvbmVudC0+U2V0Q2FsbGJhY2tzKSAgICAgICAgICAgfHwKKyAgICAgICAgKE5VTEwgPT0gY29tcG9uZW50LT5Db21wb25lbnREZUluaXQpICAgICAgICB8fAorICAgICAgICAoTlVMTCA9PSBjb21wb25lbnQtPlVzZUVHTEltYWdlKSAgICAgICAgICAgIHx8CisgICAgICAgIChOVUxMID09IGNvbXBvbmVudC0+Q29tcG9uZW50Um9sZUVudW0pKQorICAgICAgICByZXQgPSBPTVhfRXJyb3JJbnZhbGlkQ29tcG9uZW50OworICAgIGVsc2UKKyAgICAgICAgcmV0ID0gT01YX0Vycm9yTm9uZTsKKworICAgIHJldHVybiByZXQ7Cit9CisKK09NWF9FUlJPUlRZUEUgU0VDX09NWF9Db21wb25lbnRMb2FkKFNFQ19PTVhfQ09NUE9ORU5UICpzZWNfY29tcG9uZW50KQoreworICAgIE9NWF9FUlJPUlRZUEUgICAgICByZXQgPSBPTVhfRXJyb3JOb25lOworICAgIE9NWF9IQU5ETEVUWVBFICAgICBsaWJIYW5kbGU7CisgICAgT01YX0NPTVBPTkVOVFRZUEUgKnBPTVhDb21wb25lbnQ7CisKKyAgICBGdW5jdGlvbkluKCk7CisKKyAgICBPTVhfRVJST1JUWVBFICgqU0VDX09NWF9Db21wb25lbnRJbml0KShPTVhfSEFORExFVFlQRSBoQ29tcG9uZW50LCBPTVhfU1RSSU5HIGNvbXBvbmVudE5hbWUpOworCisgICAgbGliSGFuZGxlID0gU0VDX09TQUxfZGxvcGVuKChPTVhfU1RSSU5HKXNlY19jb21wb25lbnQtPmxpYk5hbWUsIFJUTERfTk9XKTsKKyAgICBpZiAoIWxpYkhhbmRsZSkgeworICAgICAgICByZXQgPSBPTVhfRXJyb3JJbnZhbGlkQ29tcG9uZW50TmFtZTsKKyAgICAgICAgU0VDX09TQUxfTG9nKFNFQ19MT0dfRVJST1IsICJPTVhfRXJyb3JJbnZhbGlkQ29tcG9uZW50TmFtZSwgTGluZTolZCIsIF9fTElORV9fKTsKKyAgICAgICAgZ290byBFWElUOworICAgIH0KKworICAgIFNFQ19PTVhfQ29tcG9uZW50SW5pdCA9IFNFQ19PU0FMX2Rsc3ltKGxpYkhhbmRsZSwgIlNFQ19PTVhfQ29tcG9uZW50SW5pdCIpOworICAgIGlmICghU0VDX09NWF9Db21wb25lbnRJbml0KSB7CisgICAgICAgIFNFQ19PU0FMX2RsY2xvc2UobGliSGFuZGxlKTsKKyAgICAgICAgcmV0ID0gT01YX0Vycm9ySW52YWxpZENvbXBvbmVudDsKKyAgICAgICAgU0VDX09TQUxfTG9nKFNFQ19MT0dfRVJST1IsICJPTVhfRXJyb3JJbnZhbGlkQ29tcG9uZW50LCBMaW5lOiVkIiwgX19MSU5FX18pOworICAgICAgICBnb3RvIEVYSVQ7CisgICAgfQorCisgICAgcE9NWENvbXBvbmVudCA9IChPTVhfQ09NUE9ORU5UVFlQRSAqKVNFQ19PU0FMX01hbGxvYyhzaXplb2YoT01YX0NPTVBPTkVOVFRZUEUpKTsKKyAgICBJTklUX1NFVF9TSVpFX1ZFUlNJT04ocE9NWENvbXBvbmVudCwgT01YX0NPTVBPTkVOVFRZUEUpOworICAgIHJldCA9ICgqU0VDX09NWF9Db21wb25lbnRJbml0KSgoT01YX0hBTkRMRVRZUEUpcE9NWENvbXBvbmVudCwgKE9NWF9TVFJJTkcpc2VjX2NvbXBvbmVudC0+Y29tcG9uZW50TmFtZSk7CisgICAgaWYgKHJldCAhPSBPTVhfRXJyb3JOb25lKSB7CisgICAgICAgIFNFQ19PU0FMX0ZyZWUocE9NWENvbXBvbmVudCk7CisgICAgICAgIFNFQ19PU0FMX2RsY2xvc2UobGliSGFuZGxlKTsKKyAgICAgICAgcmV0ID0gT01YX0Vycm9ySW52YWxpZENvbXBvbmVudDsKKyAgICAgICAgU0VDX09TQUxfTG9nKFNFQ19MT0dfRVJST1IsICJPTVhfRXJyb3JJbnZhbGlkQ29tcG9uZW50LCBMaW5lOiVkIiwgX19MSU5FX18pOworICAgICAgICBnb3RvIEVYSVQ7CisgICAgfSBlbHNlIHsKKyAgICAgICAgaWYgKFNFQ19PTVhfQ29tcG9uZW50QVBJQ2hlY2socE9NWENvbXBvbmVudCkgIT0gT01YX0Vycm9yTm9uZSkgeworICAgICAgICAgICAgaWYgKE5VTEwgIT0gcE9NWENvbXBvbmVudC0+Q29tcG9uZW50RGVJbml0KQorICAgICAgICAgICAgICAgIHBPTVhDb21wb25lbnQtPkNvbXBvbmVudERlSW5pdChwT01YQ29tcG9uZW50KTsKKyAgICAgICAgICAgIFNFQ19PU0FMX0ZyZWUocE9NWENvbXBvbmVudCk7CisgICAgICAgICAgICBTRUNfT1NBTF9kbGNsb3NlKGxpYkhhbmRsZSk7CisgICAgICAgICAgICByZXQgPSBPTVhfRXJyb3JJbnZhbGlkQ29tcG9uZW50OworICAgICAgICAgICAgU0VDX09TQUxfTG9nKFNFQ19MT0dfRVJST1IsICJPTVhfRXJyb3JJbnZhbGlkQ29tcG9uZW50LCBMaW5lOiVkIiwgX19MSU5FX18pOworICAgICAgICAgICAgZ290byBFWElUOworICAgICAgICB9CisgICAgICAgIHNlY19jb21wb25lbnQtPmxpYkhhbmRsZSA9IGxpYkhhbmRsZTsKKyAgICAgICAgc2VjX2NvbXBvbmVudC0+cE9NWENvbXBvbmVudCA9IHBPTVhDb21wb25lbnQ7CisgICAgICAgIHJldCA9IE9NWF9FcnJvck5vbmU7CisgICAgfQorCitFWElUOgorICAgIEZ1bmN0aW9uT3V0KCk7CisKKyAgICByZXR1cm4gcmV0OworfQorCitPTVhfRVJST1JUWVBFIFNFQ19PTVhfQ29tcG9uZW50VW5sb2FkKFNFQ19PTVhfQ09NUE9ORU5UICpzZWNfY29tcG9uZW50KQoreworICAgIE9NWF9FUlJPUlRZUEUgcmV0ID0gT01YX0Vycm9yTm9uZTsKKyAgICBPTVhfQ09NUE9ORU5UVFlQRSAqcE9NWENvbXBvbmVudCA9IE5VTEw7CisKKyAgICBGdW5jdGlvbkluKCk7CisKKyAgICBpZiAoIXNlY19jb21wb25lbnQpIHsKKyAgICAgICAgcmV0ID0gT01YX0Vycm9yQmFkUGFyYW1ldGVyOworICAgICAgICBnb3RvIEVYSVQ7CisgICAgfQorCisgICAgcE9NWENvbXBvbmVudCA9IHNlY19jb21wb25lbnQtPnBPTVhDb21wb25lbnQ7CisgICAgaWYgKHBPTVhDb21wb25lbnQgIT0gTlVMTCkgeworICAgICAgICBwT01YQ29tcG9uZW50LT5Db21wb25lbnREZUluaXQocE9NWENvbXBvbmVudCk7CisgICAgICAgIFNFQ19PU0FMX0ZyZWUocE9NWENvbXBvbmVudCk7CisgICAgICAgIHNlY19jb21wb25lbnQtPnBPTVhDb21wb25lbnQgPSBOVUxMOworICAgIH0KKworICAgIGlmIChzZWNfY29tcG9uZW50LT5saWJIYW5kbGUgIT0gTlVMTCkgeworICAgICAgICBTRUNfT1NBTF9kbGNsb3NlKHNlY19jb21wb25lbnQtPmxpYkhhbmRsZSk7CisgICAgICAgIHNlY19jb21wb25lbnQtPmxpYkhhbmRsZSA9IE5VTEw7CisgICAgfQorCitFWElUOgorICAgIEZ1bmN0aW9uT3V0KCk7CisKKyAgICByZXR1cm4gcmV0OworfQorCmRpZmYgLS1naXQgYS9leHlub3M0L211bHRpbWVkaWEvb3Blbm1heC9zZWNfb214L2NvcmUvU0VDX09NWF9Db21wb25lbnRfUmVnaXN0ZXIuaCBiL2V4eW5vczQvbXVsdGltZWRpYS9vcGVubWF4L3NlY19vbXgvY29yZS9TRUNfT01YX0NvbXBvbmVudF9SZWdpc3Rlci5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjc1YjhhYzUKLS0tIC9kZXYvbnVsbAorKysgYi9leHlub3M0L211bHRpbWVkaWEvb3Blbm1heC9zZWNfb214L2NvcmUvU0VDX09NWF9Db21wb25lbnRfUmVnaXN0ZXIuaApAQCAtMCwwICsxLDc1IEBACisvKgorICoKKyAqIENvcHlyaWdodCAyMDEwIFNhbXN1bmcgRWxlY3Ryb25pY3MgUy5MU0kgQ28uIExURAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisvKgorICogQGZpbGUgICAgICAgU0VDX09NWF9Db21wb25lbnRfUmVnaXN0ZXIuaAorICogQGJyaWVmICAgICAgU0VDIE9wZW5NQVggSUwgQ29tcG9uZW50IFJlZ2lzdGVyCisgKiBAYXV0aG9yICAgICBTZXVuZ0Jlb20gS2ltIChzYmNydXgua2ltQHNhbXN1bmcuY29tKQorICogQHZlcnNpb24gICAgMS4xLjAKKyAqIEBoaXN0b3J5CisgKiAgICAyMDEwLjcuMTUgOiBDcmVhdGUKKyAqLworCisjaWZuZGVmIFNFQ19PTVhfQ09NUE9ORU5UX1JFRworI2RlZmluZSBTRUNfT01YX0NPTVBPTkVOVF9SRUcKKworI2luY2x1ZGUgIlNFQ19PTVhfRGVmLmgiCisjaW5jbHVkZSAiT01YX1R5cGVzLmgiCisjaW5jbHVkZSAiT01YX0NvcmUuaCIKKyNpbmNsdWRlICJPTVhfQ29tcG9uZW50LmgiCisKKwordHlwZWRlZiBzdHJ1Y3QgX1NFQ1JlZ2lzdGVyQ29tcG9uZW50VHlwZQoreworICAgIE9NWF9VOCAgY29tcG9uZW50TmFtZVtNQVhfT01YX0NPTVBPTkVOVF9OQU1FX1NJWkVdOworICAgIE9NWF9VOCAgcm9sZXNbTUFYX09NWF9DT01QT05FTlRfUk9MRV9OVU1dW01BWF9PTVhfQ09NUE9ORU5UX1JPTEVfU0laRV07CisgICAgT01YX1UzMiB0b3RhbFJvbGVOdW07Cit9IFNFQ1JlZ2lzdGVyQ29tcG9uZW50VHlwZTsKKwordHlwZWRlZiBzdHJ1Y3QgX1NFQ19PTVhfQ09NUE9ORU5UX1JFR0xJU1QKK3sKKyAgICBTRUNSZWdpc3RlckNvbXBvbmVudFR5cGUgY29tcG9uZW50OworICAgIE9NWF9VOCAgbGliTmFtZVtNQVhfT01YX0NPTVBPTkVOVF9MSUJOQU1FX1NJWkVdOworfSBTRUNfT01YX0NPTVBPTkVOVF9SRUdMSVNUOworCitzdHJ1Y3QgU0VDX09NWF9DT01QT05FTlQ7Cit0eXBlZGVmIHN0cnVjdCBfU0VDX09NWF9DT01QT05FTlQKK3sKKyAgICBPTVhfVTggICAgICAgICAgICAgICAgICAgIGNvbXBvbmVudE5hbWVbTUFYX09NWF9DT01QT05FTlRfTkFNRV9TSVpFXTsKKyAgICBPTVhfVTggICAgICAgICAgICAgICAgICAgIGxpYk5hbWVbTUFYX09NWF9DT01QT05FTlRfTElCTkFNRV9TSVpFXTsKKyAgICBPTVhfSEFORExFVFlQRSAgICAgICAgICAgIGxpYkhhbmRsZTsKKyAgICBPTVhfQ09NUE9ORU5UVFlQRSAgICAgICAgKnBPTVhDb21wb25lbnQ7CisgICAgc3RydWN0IF9TRUNfT01YX0NPTVBPTkVOVCAqbmV4dE9NWENvbXA7Cit9IFNFQ19PTVhfQ09NUE9ORU5UOworCisKKyNpZmRlZiBfX2NwbHVzcGx1cworZXh0ZXJuICJDIiB7CisjZW5kaWYKKworCitPTVhfRVJST1JUWVBFIFNFQ19PTVhfQ29tcG9uZW50X1JlZ2lzdGVyKFNFQ19PTVhfQ09NUE9ORU5UX1JFR0xJU1QgKipjb21wTGlzdCwgT01YX1UzMiAqY29tcE51bSk7CitPTVhfRVJST1JUWVBFIFNFQ19PTVhfQ29tcG9uZW50X1VucmVnaXN0ZXIoU0VDX09NWF9DT01QT05FTlRfUkVHTElTVCAqY29tcG9uZW50TGlzdCk7CitPTVhfRVJST1JUWVBFIFNFQ19PTVhfQ29tcG9uZW50TG9hZChTRUNfT01YX0NPTVBPTkVOVCAqc2VjX2NvbXBvbmVudCk7CitPTVhfRVJST1JUWVBFIFNFQ19PTVhfQ29tcG9uZW50VW5sb2FkKFNFQ19PTVhfQ09NUE9ORU5UICpzZWNfY29tcG9uZW50KTsKKworCisjaWZkZWYgX19jcGx1c3BsdXMKK30KKyNlbmRpZgorCisjZW5kaWYKZGlmZiAtLWdpdCBhL2V4eW5vczQvbXVsdGltZWRpYS9vcGVubWF4L3NlY19vbXgvY29yZS9TRUNfT01YX0NvcmUuYyBiL2V4eW5vczQvbXVsdGltZWRpYS9vcGVubWF4L3NlY19vbXgvY29yZS9TRUNfT01YX0NvcmUuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mYTc0NzdiCi0tLSAvZGV2L251bGwKKysrIGIvZXh5bm9zNC9tdWx0aW1lZGlhL29wZW5tYXgvc2VjX29teC9jb3JlL1NFQ19PTVhfQ29yZS5jCkBAIC0wLDAgKzEsMzY0IEBACisvKgorICoKKyAqIENvcHlyaWdodCAyMDEwIFNhbXN1bmcgRWxlY3Ryb25pY3MgUy5MU0kgQ28uIExURAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisvKgorICogQGZpbGUgICAgICAgU0VDX09NWF9Db3JlLmMKKyAqIEBicmllZiAgICAgIFNFQyBPcGVuTUFYIElMIENvcmUKKyAqIEBhdXRob3IgICAgIFNldW5nQmVvbSBLaW0gKHNiY3J1eC5raW1Ac2Ftc3VuZy5jb20pCisgKiAgICAgICAgICAgICBIeWVZZW9uIENodW5nIChoeWVvbi5jaHVuZ0BzYW1zdW5nLmNvbSkKKyAqICAgICAgICAgICAgIFl1bmppIEtpbSAoeXVuamkua2ltQHNhbXN1bmcuY29tKQorICogQHZlcnNpb24gICAgMS4xLjAKKyAqIEBoaXN0b3J5CisgKiAgICAyMDEwLjcuMTUgOiBDcmVhdGUKKyAqLworCisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlIDxzdGRsaWIuaD4KKyNpbmNsdWRlIDxzdHJpbmcuaD4KKworI2luY2x1ZGUgIlNFQ19PTVhfQ29yZS5oIgorI2luY2x1ZGUgIlNFQ19PTVhfQ29tcG9uZW50X1JlZ2lzdGVyLmgiCisjaW5jbHVkZSAiU0VDX09TQUxfTWVtb3J5LmgiCisjaW5jbHVkZSAiU0VDX09TQUxfTXV0ZXguaCIKKyNpbmNsdWRlICJTRUNfT1NBTF9FVEMuaCIKKyNpbmNsdWRlICJTRUNfT01YX1Jlc291cmNlbWFuYWdlci5oIgorCisjdW5kZWYgIFNFQ19MT0dfVEFHCisjZGVmaW5lIFNFQ19MT0dfVEFHICAgICJTRUNfT01YX0NPUkUiCisjZGVmaW5lIFNFQ19MT0dfT0ZGCisjaW5jbHVkZSAiU0VDX09TQUxfTG9nLmgiCisKKworc3RhdGljIGludCBnSW5pdGlhbGl6ZWQgPSAwOworc3RhdGljIE9NWF9VMzIgZ0NvbXBvbmVudE51bSA9IDA7CisKK3N0YXRpYyBTRUNfT01YX0NPTVBPTkVOVF9SRUdMSVNUICpnQ29tcG9uZW50TGlzdCA9IE5VTEw7CitzdGF0aWMgU0VDX09NWF9DT01QT05FTlQgKmdMb2FkQ29tcG9uZW50TGlzdCA9IE5VTEw7CitzdGF0aWMgT01YX0hBTkRMRVRZUEUgZ2hMb2FkQ29tcG9uZW50TGlzdE11dGV4ID0gTlVMTDsKKworCitPTVhfQVBJIE9NWF9FUlJPUlRZUEUgT01YX0FQSUVOVFJZIFNFQ19PTVhfSW5pdCh2b2lkKQoreworICAgIE9NWF9FUlJPUlRZUEUgcmV0ID0gT01YX0Vycm9yTm9uZTsKKworICAgIEZ1bmN0aW9uSW4oKTsKKworICAgIGlmIChnSW5pdGlhbGl6ZWQgPT0gMCkgeworICAgICAgICBpZiAoU0VDX09NWF9Db21wb25lbnRfUmVnaXN0ZXIoJmdDb21wb25lbnRMaXN0LCAmZ0NvbXBvbmVudE51bSkpIHsKKyAgICAgICAgICAgIHJldCA9IE9NWF9FcnJvckluc3VmZmljaWVudFJlc291cmNlczsKKyAgICAgICAgICAgIFNFQ19PU0FMX0xvZyhTRUNfTE9HX0VSUk9SLCAiU0VDX09NWF9Jbml0IDogJXMiLCAiT01YX0Vycm9ySW5zdWZmaWNpZW50UmVzb3VyY2VzIik7CisgICAgICAgICAgICBnb3RvIEVYSVQ7CisgICAgICAgIH0KKworICAgICAgICByZXQgPSBTRUNfT01YX1Jlc291cmNlTWFuYWdlcl9Jbml0KCk7CisgICAgICAgIGlmIChPTVhfRXJyb3JOb25lICE9IHJldCkgeworICAgICAgICAgICAgU0VDX09TQUxfTG9nKFNFQ19MT0dfRVJST1IsICJTRUNfT01YX0luaXQgOiBTRUNfT01YX1Jlc291cmNlTWFuYWdlcl9Jbml0IGZhaWxlZCIpOworICAgICAgICAgICAgZ290byBFWElUOworICAgICAgICB9CisKKyAgICAgICAgcmV0ID0gU0VDX09TQUxfTXV0ZXhDcmVhdGUoJmdoTG9hZENvbXBvbmVudExpc3RNdXRleCk7CisgICAgICAgIGlmIChPTVhfRXJyb3JOb25lICE9IHJldCkgeworICAgICAgICAgICAgU0VDX09TQUxfTG9nKFNFQ19MT0dfRVJST1IsICJTRUNfT01YX0luaXQgOiBTRUNfT1NBTF9NdXRleENyZWF0ZSgmZ2hMb2FkQ29tcG9uZW50TGlzdE11dGV4KSBmYWlsZWQiKTsKKyAgICAgICAgICAgIGdvdG8gRVhJVDsKKyAgICAgICAgfQorCisgICAgICAgIGdJbml0aWFsaXplZCA9IDE7CisgICAgICAgIFNFQ19PU0FMX0xvZyhTRUNfTE9HX1RSQUNFLCAiU0VDX09NWF9Jbml0IDogJXMiLCAiT01YX0Vycm9yTm9uZSIpOworICAgIH0KKworRVhJVDoKKyAgICBGdW5jdGlvbk91dCgpOworCisgICAgcmV0dXJuIHJldDsKK30KKworT01YX0FQSSBPTVhfRVJST1JUWVBFIE9NWF9BUElFTlRSWSBTRUNfT01YX0RlaW5pdCh2b2lkKQoreworICAgIE9NWF9FUlJPUlRZUEUgcmV0ID0gT01YX0Vycm9yTm9uZTsKKworICAgIEZ1bmN0aW9uSW4oKTsKKworICAgIFNFQ19PU0FMX011dGV4VGVybWluYXRlKGdoTG9hZENvbXBvbmVudExpc3RNdXRleCk7CisgICAgZ2hMb2FkQ29tcG9uZW50TGlzdE11dGV4ID0gTlVMTDsKKworICAgIFNFQ19PTVhfUmVzb3VyY2VNYW5hZ2VyX0RlaW5pdCgpOworCisgICAgaWYgKE9NWF9FcnJvck5vbmUgIT0gU0VDX09NWF9Db21wb25lbnRfVW5yZWdpc3RlcihnQ29tcG9uZW50TGlzdCkpIHsKKyAgICAgICAgcmV0ID0gT01YX0Vycm9yVW5kZWZpbmVkOworICAgICAgICBnb3RvIEVYSVQ7CisgICAgfQorICAgIGdDb21wb25lbnRMaXN0ID0gTlVMTDsKKyAgICBnQ29tcG9uZW50TnVtID0gMDsKKyAgICBnSW5pdGlhbGl6ZWQgPSAwOworCitFWElUOgorICAgIEZ1bmN0aW9uT3V0KCk7CisKKyAgICByZXR1cm4gcmV0OworfQorCitPTVhfQVBJIE9NWF9FUlJPUlRZUEUgT01YX0FQSUVOVFJZIFNFQ19PTVhfQ29tcG9uZW50TmFtZUVudW0oCisgICAgT01YX09VVCBPTVhfU1RSSU5HIGNDb21wb25lbnROYW1lLAorICAgIE9NWF9JTiAgT01YX1UzMiBuTmFtZUxlbmd0aCwKKyAgICBPTVhfSU4gIE9NWF9VMzIgbkluZGV4KQoreworICAgIE9NWF9FUlJPUlRZUEUgcmV0ID0gT01YX0Vycm9yTm9uZTsKKworICAgIEZ1bmN0aW9uSW4oKTsKKworICAgIGlmIChuSW5kZXggPj0gZ0NvbXBvbmVudE51bSkgeworICAgICAgICByZXQgPSBPTVhfRXJyb3JOb01vcmU7CisgICAgICAgIGdvdG8gRVhJVDsKKyAgICB9CisKKyAgICBzbnByaW50ZihjQ29tcG9uZW50TmFtZSwgbk5hbWVMZW5ndGgsICIlcyIsIGdDb21wb25lbnRMaXN0W25JbmRleF0uY29tcG9uZW50LmNvbXBvbmVudE5hbWUpOworICAgIHJldCA9IE9NWF9FcnJvck5vbmU7CisKK0VYSVQ6CisgICAgRnVuY3Rpb25PdXQoKTsKKworICAgIHJldHVybiByZXQ7Cit9CisKK09NWF9BUEkgT01YX0VSUk9SVFlQRSBPTVhfQVBJRU5UUlkgU0VDX09NWF9HZXRIYW5kbGUoCisgICAgT01YX09VVCBPTVhfSEFORExFVFlQRSAqcEhhbmRsZSwKKyAgICBPTVhfSU4gIE9NWF9TVFJJTkcgY0NvbXBvbmVudE5hbWUsCisgICAgT01YX0lOICBPTVhfUFRSIHBBcHBEYXRhLAorICAgIE9NWF9JTiAgT01YX0NBTExCQUNLVFlQRSAqcENhbGxCYWNrcykKK3sKKyAgICBPTVhfRVJST1JUWVBFICAgICAgcmV0ID0gT01YX0Vycm9yTm9uZTsKKyAgICBTRUNfT01YX0NPTVBPTkVOVCAqbG9hZENvbXBvbmVudDsKKyAgICBTRUNfT01YX0NPTVBPTkVOVCAqY3VycmVudENvbXBvbmVudDsKKyAgICB1bnNpZ25lZCBpbnQgaSA9IDA7CisKKyAgICBGdW5jdGlvbkluKCk7CisKKyAgICBpZiAoZ0luaXRpYWxpemVkICE9IDEpIHsKKyAgICAgICAgcmV0ID0gT01YX0Vycm9yTm90UmVhZHk7CisgICAgICAgIGdvdG8gRVhJVDsKKyAgICB9CisKKyAgICBpZiAoKHBIYW5kbGUgPT0gTlVMTCkgfHwgKGNDb21wb25lbnROYW1lID09IE5VTEwpIHx8IChwQ2FsbEJhY2tzID09IE5VTEwpKSB7CisgICAgICAgIHJldCA9IE9NWF9FcnJvckJhZFBhcmFtZXRlcjsKKyAgICAgICAgZ290byBFWElUOworICAgIH0KKyAgICBTRUNfT1NBTF9Mb2coU0VDX0xPR19UUkFDRSwgIkNvbXBvbmVudE5hbWUgOiAlcyIsIGNDb21wb25lbnROYW1lKTsKKworICAgIGZvciAoaSA9IDA7IGkgPCBnQ29tcG9uZW50TnVtOyBpKyspIHsKKyAgICAgICAgaWYgKFNFQ19PU0FMX1N0cmNtcChjQ29tcG9uZW50TmFtZSwgZ0NvbXBvbmVudExpc3RbaV0uY29tcG9uZW50LmNvbXBvbmVudE5hbWUpID09IDApIHsKKyAgICAgICAgICAgIGxvYWRDb21wb25lbnQgPSBTRUNfT1NBTF9NYWxsb2Moc2l6ZW9mKFNFQ19PTVhfQ09NUE9ORU5UKSk7CisgICAgICAgICAgICBTRUNfT1NBTF9NZW1zZXQobG9hZENvbXBvbmVudCwgMCwgc2l6ZW9mKFNFQ19PTVhfQ09NUE9ORU5UKSk7CisKKyAgICAgICAgICAgIFNFQ19PU0FMX1N0cmNweShsb2FkQ29tcG9uZW50LT5saWJOYW1lLCBnQ29tcG9uZW50TGlzdFtpXS5saWJOYW1lKTsKKyAgICAgICAgICAgIFNFQ19PU0FMX1N0cmNweShsb2FkQ29tcG9uZW50LT5jb21wb25lbnROYW1lLCBnQ29tcG9uZW50TGlzdFtpXS5jb21wb25lbnQuY29tcG9uZW50TmFtZSk7CisgICAgICAgICAgICByZXQgPSBTRUNfT01YX0NvbXBvbmVudExvYWQobG9hZENvbXBvbmVudCk7CisgICAgICAgICAgICBpZiAocmV0ICE9IE9NWF9FcnJvck5vbmUpIHsKKyAgICAgICAgICAgICAgICBTRUNfT1NBTF9GcmVlKGxvYWRDb21wb25lbnQpOworICAgICAgICAgICAgICAgIFNFQ19PU0FMX0xvZyhTRUNfTE9HX0VSUk9SLCAiT01YX0Vycm9yLCBMaW5lOiVkIiwgX19MSU5FX18pOworICAgICAgICAgICAgICAgIGdvdG8gRVhJVDsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgcmV0ID0gbG9hZENvbXBvbmVudC0+cE9NWENvbXBvbmVudC0+U2V0Q2FsbGJhY2tzKGxvYWRDb21wb25lbnQtPnBPTVhDb21wb25lbnQsIHBDYWxsQmFja3MsIHBBcHBEYXRhKTsKKyAgICAgICAgICAgIGlmIChyZXQgIT0gT01YX0Vycm9yTm9uZSkgeworICAgICAgICAgICAgICAgIFNFQ19PTVhfQ29tcG9uZW50VW5sb2FkKGxvYWRDb21wb25lbnQpOworICAgICAgICAgICAgICAgIFNFQ19PU0FMX0ZyZWUobG9hZENvbXBvbmVudCk7CisgICAgICAgICAgICAgICAgU0VDX09TQUxfTG9nKFNFQ19MT0dfRVJST1IsICJPTVhfRXJyb3IsIExpbmU6JWQiLCBfX0xJTkVfXyk7CisgICAgICAgICAgICAgICAgZ290byBFWElUOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBTRUNfT1NBTF9NdXRleExvY2soZ2hMb2FkQ29tcG9uZW50TGlzdE11dGV4KTsKKyAgICAgICAgICAgIGlmIChnTG9hZENvbXBvbmVudExpc3QgPT0gTlVMTCkgeworICAgICAgICAgICAgICAgIGdMb2FkQ29tcG9uZW50TGlzdCA9IGxvYWRDb21wb25lbnQ7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIGN1cnJlbnRDb21wb25lbnQgPSBnTG9hZENvbXBvbmVudExpc3Q7CisgICAgICAgICAgICAgICAgd2hpbGUgKGN1cnJlbnRDb21wb25lbnQtPm5leHRPTVhDb21wICE9IE5VTEwpIHsKKyAgICAgICAgICAgICAgICAgICAgY3VycmVudENvbXBvbmVudCA9IGN1cnJlbnRDb21wb25lbnQtPm5leHRPTVhDb21wOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBjdXJyZW50Q29tcG9uZW50LT5uZXh0T01YQ29tcCA9IGxvYWRDb21wb25lbnQ7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBTRUNfT1NBTF9NdXRleFVubG9jayhnaExvYWRDb21wb25lbnRMaXN0TXV0ZXgpOworCisgICAgICAgICAgICAqcEhhbmRsZSA9IGxvYWRDb21wb25lbnQtPnBPTVhDb21wb25lbnQ7CisgICAgICAgICAgICByZXQgPSBPTVhfRXJyb3JOb25lOworICAgICAgICAgICAgU0VDX09TQUxfTG9nKFNFQ19MT0dfVFJBQ0UsICJTRUNfT01YX0dldEhhbmRsZSA6ICVzIiwgIk9NWF9FcnJvck5vbmUiKTsKKyAgICAgICAgICAgIGdvdG8gRVhJVDsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJldCA9IE9NWF9FcnJvckNvbXBvbmVudE5vdEZvdW5kOworCitFWElUOgorICAgIEZ1bmN0aW9uT3V0KCk7CisKKyAgICByZXR1cm4gcmV0OworfQorCitPTVhfQVBJIE9NWF9FUlJPUlRZUEUgT01YX0FQSUVOVFJZIFNFQ19PTVhfRnJlZUhhbmRsZShPTVhfSU4gT01YX0hBTkRMRVRZUEUgaENvbXBvbmVudCkKK3sKKyAgICBPTVhfRVJST1JUWVBFICAgICAgcmV0ID0gT01YX0Vycm9yTm9uZTsKKyAgICBTRUNfT01YX0NPTVBPTkVOVCAqY3VycmVudENvbXBvbmVudDsKKyAgICBTRUNfT01YX0NPTVBPTkVOVCAqZGVsZXRlQ29tcG9uZW50OworCisgICAgRnVuY3Rpb25JbigpOworCisgICAgaWYgKGdJbml0aWFsaXplZCAhPSAxKSB7CisgICAgICAgIHJldCA9IE9NWF9FcnJvck5vdFJlYWR5OworICAgICAgICBnb3RvIEVYSVQ7CisgICAgfQorCisgICAgaWYgKCFoQ29tcG9uZW50KSB7CisgICAgICAgIHJldCA9IE9NWF9FcnJvckJhZFBhcmFtZXRlcjsKKyAgICAgICAgZ290byBFWElUOworICAgIH0KKworICAgIFNFQ19PU0FMX011dGV4TG9jayhnaExvYWRDb21wb25lbnRMaXN0TXV0ZXgpOworICAgIGN1cnJlbnRDb21wb25lbnQgPSBnTG9hZENvbXBvbmVudExpc3Q7CisgICAgaWYgKGdMb2FkQ29tcG9uZW50TGlzdC0+cE9NWENvbXBvbmVudCA9PSBoQ29tcG9uZW50KSB7CisgICAgICAgIGRlbGV0ZUNvbXBvbmVudCA9IGdMb2FkQ29tcG9uZW50TGlzdDsKKyAgICAgICAgZ0xvYWRDb21wb25lbnRMaXN0ID0gZ0xvYWRDb21wb25lbnRMaXN0LT5uZXh0T01YQ29tcDsKKyAgICB9IGVsc2UgeworICAgICAgICB3aGlsZSAoKGN1cnJlbnRDb21wb25lbnQgIT0gTlVMTCkgJiYgKCgoU0VDX09NWF9DT01QT05FTlQgKikoY3VycmVudENvbXBvbmVudC0+bmV4dE9NWENvbXApKS0+cE9NWENvbXBvbmVudCAhPSBoQ29tcG9uZW50KSkKKyAgICAgICAgICAgIGN1cnJlbnRDb21wb25lbnQgPSBjdXJyZW50Q29tcG9uZW50LT5uZXh0T01YQ29tcDsKKworICAgICAgICBpZiAoKChTRUNfT01YX0NPTVBPTkVOVCAqKShjdXJyZW50Q29tcG9uZW50LT5uZXh0T01YQ29tcCkpLT5wT01YQ29tcG9uZW50ID09IGhDb21wb25lbnQpIHsKKyAgICAgICAgICAgIGRlbGV0ZUNvbXBvbmVudCA9IGN1cnJlbnRDb21wb25lbnQtPm5leHRPTVhDb21wOworICAgICAgICAgICAgY3VycmVudENvbXBvbmVudC0+bmV4dE9NWENvbXAgPSBkZWxldGVDb21wb25lbnQtPm5leHRPTVhDb21wOworICAgICAgICB9IGVsc2UgaWYgKGN1cnJlbnRDb21wb25lbnQgPT0gTlVMTCkgeworICAgICAgICAgICAgcmV0ID0gT01YX0Vycm9yQ29tcG9uZW50Tm90Rm91bmQ7CisgICAgICAgICAgICBTRUNfT1NBTF9NdXRleFVubG9jayhnaExvYWRDb21wb25lbnRMaXN0TXV0ZXgpOworICAgICAgICAgICAgZ290byBFWElUOworICAgICAgICB9CisgICAgfQorICAgIFNFQ19PU0FMX011dGV4VW5sb2NrKGdoTG9hZENvbXBvbmVudExpc3RNdXRleCk7CisKKyAgICBTRUNfT01YX0NvbXBvbmVudFVubG9hZChkZWxldGVDb21wb25lbnQpOworICAgIFNFQ19PU0FMX0ZyZWUoZGVsZXRlQ29tcG9uZW50KTsKKworRVhJVDoKKyAgICBGdW5jdGlvbk91dCgpOworCisgICAgcmV0dXJuIHJldDsKK30KKworT01YX0FQSSBPTVhfRVJST1JUWVBFIE9NWF9BUElFTlRSWSBTRUNfT01YX1NldHVwVHVubmVsKAorICAgIE9NWF9JTiBPTVhfSEFORExFVFlQRSBoT3V0cHV0LAorICAgIE9NWF9JTiBPTVhfVTMyIG5Qb3J0T3V0cHV0LAorICAgIE9NWF9JTiBPTVhfSEFORExFVFlQRSBoSW5wdXQsCisgICAgT01YX0lOIE9NWF9VMzIgblBvcnRJbnB1dCkKK3sKKyAgICBPTVhfRVJST1JUWVBFIHJldCA9IE9NWF9FcnJvck5vdEltcGxlbWVudGVkOworCitFWElUOgorICAgIHJldHVybiByZXQ7Cit9CisKK09NWF9BUEkgT01YX0VSUk9SVFlQRSBTRUNfT01YX0dldENvbnRlbnRQaXBlKAorICAgIE9NWF9PVVQgT01YX0hBTkRMRVRZUEUgKmhQaXBlLAorICAgIE9NWF9JTiAgT01YX1NUUklORyBzelVSSSkKK3sKKyAgICBPTVhfRVJST1JUWVBFIHJldCA9IE9NWF9FcnJvck5vdEltcGxlbWVudGVkOworCitFWElUOgorICAgIHJldHVybiByZXQ7Cit9CisKK09NWF9BUEkgT01YX0VSUk9SVFlQRSBTRUNfT01YX0dldENvbXBvbmVudHNPZlJvbGUgKAorICAgIE9NWF9JTiAgICBPTVhfU1RSSU5HIHJvbGUsCisgICAgT01YX0lOT1VUIE9NWF9VMzIgKnBOdW1Db21wcywKKyAgICBPTVhfSU5PVVQgT01YX1U4ICAqKmNvbXBOYW1lcykKK3sKKyAgICBPTVhfRVJST1JUWVBFIHJldCA9IE9NWF9FcnJvck5vbmU7CisgICAgaW50ICAgICAgICAgICBtYXhfcm9sZV9udW0gPSAwOworICAgIE9NWF9TVFJJTkcgICAgUm9sZVN0cmluZ1tNQVhfT01YX0NPTVBPTkVOVF9ST0xFX1NJWkVdOworICAgIGludCBpID0gMCwgaiA9IDA7CisKKyAgICBGdW5jdGlvbkluKCk7CisKKyAgICBpZiAoZ0luaXRpYWxpemVkICE9IDEpIHsKKyAgICAgICAgcmV0ID0gT01YX0Vycm9yTm90UmVhZHk7CisgICAgICAgIGdvdG8gRVhJVDsKKyAgICB9CisKKyAgICAqcE51bUNvbXBzID0gMDsKKworICAgIGZvciAoaSA9IDA7IGkgPCBNQVhfT01YX0NPTVBPTkVOVF9OVU07IGkrKykgeworICAgICAgICBtYXhfcm9sZV9udW0gPSBnQ29tcG9uZW50TGlzdFtpXS5jb21wb25lbnQudG90YWxSb2xlTnVtOworCisgICAgICAgIGZvciAoaiA9IDA7IGogPCBtYXhfcm9sZV9udW07IGorKykgeworICAgICAgICAgICAgaWYgKFNFQ19PU0FMX1N0cmNtcChnQ29tcG9uZW50TGlzdFtpXS5jb21wb25lbnQucm9sZXNbal0sIHJvbGUpID09IDApIHsKKyAgICAgICAgICAgICAgICBpZiAoY29tcE5hbWVzICE9IE5VTEwpIHsKKyAgICAgICAgICAgICAgICAgICAgU0VDX09TQUxfU3RyY3B5KChPTVhfU1RSSU5HKWNvbXBOYW1lc1sqcE51bUNvbXBzXSwgZ0NvbXBvbmVudExpc3RbaV0uY29tcG9uZW50LmNvbXBvbmVudE5hbWUpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAqcE51bUNvbXBzID0gKCpwTnVtQ29tcHMgKyAxKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworRVhJVDoKKyAgICBGdW5jdGlvbk91dCgpOworCisgICAgcmV0dXJuIHJldDsKK30KKworT01YX0FQSSBPTVhfRVJST1JUWVBFIFNFQ19PTVhfR2V0Um9sZXNPZkNvbXBvbmVudCAoCisgICAgT01YX0lOICAgIE9NWF9TVFJJTkcgY29tcE5hbWUsCisgICAgT01YX0lOT1VUIE9NWF9VMzIgKnBOdW1Sb2xlcywKKyAgICBPTVhfT1VUICAgT01YX1U4ICoqcm9sZXMpCit7CisgICAgT01YX0VSUk9SVFlQRSByZXQgPSBPTVhfRXJyb3JOb25lOworICAgIE9NWF9CT09MICAgICAgZGV0ZWN0Q29tcCA9IE9NWF9GQUxTRTsKKyAgICBpbnQgICAgICAgICAgIGNvbXBOdW0gPSAwLCB0b3RhbFJvbGVOdW0gPSAwOworICAgIGludCBpID0gMDsKKworICAgIEZ1bmN0aW9uSW4oKTsKKworICAgIGlmIChnSW5pdGlhbGl6ZWQgIT0gMSkgeworICAgICAgICByZXQgPSBPTVhfRXJyb3JOb3RSZWFkeTsKKyAgICAgICAgZ290byBFWElUOworICAgIH0KKworICAgIGZvciAoaSA9IDA7IGkgPCBNQVhfT01YX0NPTVBPTkVOVF9OVU07IGkrKykgeworICAgICAgICBpZiAoZ0NvbXBvbmVudExpc3QgIT0gTlVMTCkgeworICAgICAgICAgICAgaWYgKFNFQ19PU0FMX1N0cmNtcChnQ29tcG9uZW50TGlzdFtpXS5jb21wb25lbnQuY29tcG9uZW50TmFtZSwgY29tcE5hbWUpID09IDApIHsKKyAgICAgICAgICAgICAgICAqcE51bVJvbGVzID0gdG90YWxSb2xlTnVtID0gZ0NvbXBvbmVudExpc3RbaV0uY29tcG9uZW50LnRvdGFsUm9sZU51bTsKKyAgICAgICAgICAgICAgICBjb21wTnVtID0gaTsKKyAgICAgICAgICAgICAgICBkZXRlY3RDb21wID0gT01YX1RSVUU7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICByZXQgPSBPTVhfRXJyb3JVbmRlZmluZWQ7CisgICAgICAgICAgICBnb3RvIEVYSVQ7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoZGV0ZWN0Q29tcCA9PSBPTVhfRkFMU0UpIHsKKyAgICAgICAgKnBOdW1Sb2xlcyA9IDA7CisgICAgICAgIHJldCA9IE9NWF9FcnJvckNvbXBvbmVudE5vdEZvdW5kOworICAgICAgICBnb3RvIEVYSVQ7CisgICAgfQorCisgICAgaWYgKHJvbGVzICE9IE5VTEwpIHsKKyAgICAgICAgZm9yIChpID0gMDsgaSA8IHRvdGFsUm9sZU51bTsgaSsrKSB7CisgICAgICAgICAgICBTRUNfT1NBTF9TdHJjcHkocm9sZXNbaV0sIGdDb21wb25lbnRMaXN0W2NvbXBOdW1dLmNvbXBvbmVudC5yb2xlc1tpXSk7CisgICAgICAgIH0KKyAgICB9CisKK0VYSVQ6CisgICAgRnVuY3Rpb25PdXQoKTsKKworICAgIHJldHVybiByZXQ7Cit9CmRpZmYgLS1naXQgYS9leHlub3M0L211bHRpbWVkaWEvb3Blbm1heC9zZWNfb214L2NvcmUvU0VDX09NWF9Db3JlLmggYi9leHlub3M0L211bHRpbWVkaWEvb3Blbm1heC9zZWNfb214L2NvcmUvU0VDX09NWF9Db3JlLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzYwY2Q1MgotLS0gL2Rldi9udWxsCisrKyBiL2V4eW5vczQvbXVsdGltZWRpYS9vcGVubWF4L3NlY19vbXgvY29yZS9TRUNfT01YX0NvcmUuaApAQCAtMCwwICsxLDc4IEBACisvKgorICoKKyAqIENvcHlyaWdodCAyMDEwIFNhbXN1bmcgRWxlY3Ryb25pY3MgUy5MU0kgQ28uIExURAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisvKgorICogQGZpbGUgICAgICAgU0VDX09NWF9Db3JlLmgKKyAqIEBicmllZiAgICAgIFNFQyBPcGVuTUFYIElMIENvcmUKKyAqIEBhdXRob3IgICAgIFNldW5nQmVvbSBLaW0gKHNiY3J1eC5raW1Ac2Ftc3VuZy5jb20pCisgKiAgICAgICAgICAgICBIeWVZZW9uIENodW5nIChoeWVvbi5jaHVuZ0BzYW1zdW5nLmNvbSkKKyAqICAgICAgICAgICAgIFl1bmppIEtpbSAoeXVuamkua2ltQHNhbXN1bmcuY29tKQorICogQHZlcnNpb24gICAgMS4xLjAKKyAqIEBoaXN0b3J5CisgKiAgICAyMDEwLjcuMTUgOiBDcmVhdGUKKyAqLworCisjaWZuZGVmIFNFQ19PTVhfQ09SRQorI2RlZmluZSBTRUNfT01YX0NPUkUKKworI2luY2x1ZGUgIlNFQ19PTVhfRGVmLmgiCisjaW5jbHVkZSAiT01YX1R5cGVzLmgiCisjaW5jbHVkZSAiT01YX0NvcmUuaCIKKworCisjaWZkZWYgX19jcGx1c3BsdXMKK2V4dGVybiAiQyIgeworI2VuZGlmCisKKworU0VDX0VYUE9SVF9SRUYgT01YX0FQSSBPTVhfRVJST1JUWVBFIE9NWF9BUElFTlRSWSBTRUNfT01YX0luaXQodm9pZCk7CitTRUNfRVhQT1JUX1JFRiBPTVhfQVBJIE9NWF9FUlJPUlRZUEUgT01YX0FQSUVOVFJZIFNFQ19PTVhfRGVpbml0KHZvaWQpOworU0VDX0VYUE9SVF9SRUYgT01YX0FQSSBPTVhfRVJST1JUWVBFIE9NWF9BUElFTlRSWSBTRUNfT01YX0NvbXBvbmVudE5hbWVFbnVtKAorICAgIE9NWF9PVVQgICBPTVhfU1RSSU5HICAgICAgICBjQ29tcG9uZW50TmFtZSwKKyAgICBPTVhfSU4gICAgT01YX1UzMiAgICAgICAgICAgbk5hbWVMZW5ndGgsCisgICAgT01YX0lOICAgIE9NWF9VMzIgICAgICAgICAgIG5JbmRleCk7CitTRUNfRVhQT1JUX1JFRiBPTVhfQVBJIE9NWF9FUlJPUlRZUEUgT01YX0FQSUVOVFJZIFNFQ19PTVhfR2V0SGFuZGxlKAorICAgIE9NWF9PVVQgICBPTVhfSEFORExFVFlQRSAgICpwSGFuZGxlLAorICAgIE9NWF9JTiAgICBPTVhfU1RSSU5HICAgICAgICBjQ29tcG9uZW50TmFtZSwKKyAgICBPTVhfSU4gICAgT01YX1BUUiAgICAgICAgICAgcEFwcERhdGEsCisgICAgT01YX0lOICAgIE9NWF9DQUxMQkFDS1RZUEUgKnBDYWxsQmFja3MpOworU0VDX0VYUE9SVF9SRUYgT01YX0FQSSBPTVhfRVJST1JUWVBFIE9NWF9BUElFTlRSWSBTRUNfT01YX0ZyZWVIYW5kbGUoCisgICAgT01YX0lOICAgIE9NWF9IQU5ETEVUWVBFICAgIGhDb21wb25lbnQpOworU0VDX0VYUE9SVF9SRUYgT01YX0FQSSBPTVhfRVJST1JUWVBFIE9NWF9BUElFTlRSWSBTRUNfT01YX1NldHVwVHVubmVsKAorICAgIE9NWF9JTiAgICBPTVhfSEFORExFVFlQRSAgICBoT3V0cHV0LAorICAgIE9NWF9JTiAgICBPTVhfVTMyICAgICAgICAgICBuUG9ydE91dHB1dCwKKyAgICBPTVhfSU4gICAgT01YX0hBTkRMRVRZUEUgICAgaElucHV0LAorICAgIE9NWF9JTiAgICBPTVhfVTMyICAgICAgICAgICBuUG9ydElucHV0KTsKK1NFQ19FWFBPUlRfUkVGIE9NWF9BUEkgT01YX0VSUk9SVFlQRSAgICAgICAgICAgICAgU0VDX09NWF9HZXRDb250ZW50UGlwZSgKKyAgICBPTVhfT1VUICAgT01YX0hBTkRMRVRZUEUgICAqaFBpcGUsCisgICAgT01YX0lOICAgIE9NWF9TVFJJTkcgICAgICAgIHN6VVJJKTsKK1NFQ19FWFBPUlRfUkVGIE9NWF9BUEkgT01YX0VSUk9SVFlQRSAgICAgICAgICAgICAgU0VDX09NWF9HZXRDb21wb25lbnRzT2ZSb2xlKAorICAgIE9NWF9JTiAgICBPTVhfU1RSSU5HICAgICAgICByb2xlLAorICAgIE9NWF9JTk9VVCBPTVhfVTMyICAgICAgICAgICpwTnVtQ29tcHMsCisgICAgT01YX0lOT1VUIE9NWF9VOCAgICAgICAgICAqKmNvbXBOYW1lcyk7CitTRUNfRVhQT1JUX1JFRiBPTVhfQVBJIE9NWF9FUlJPUlRZUEUgICAgICAgICAgICAgIFNFQ19PTVhfR2V0Um9sZXNPZkNvbXBvbmVudCgKKyAgICBPTVhfSU4gICAgT01YX1NUUklORyAgICAgICAgY29tcE5hbWUsCisgICAgT01YX0lOT1VUIE9NWF9VMzIgICAgICAgICAgKnBOdW1Sb2xlcywKKyAgICBPTVhfT1VUICAgT01YX1U4ICAgICAgICAgICoqcm9sZXMpOworCisKKyNpZmRlZiBfX2NwbHVzcGx1cworfQorI2VuZGlmCisKKyNlbmRpZgorCmRpZmYgLS1naXQgYS9leHlub3M0L211bHRpbWVkaWEvb3Blbm1heC9zZWNfb214L2luY2x1ZGUva2hyb25vcy9PTVhfQXVkaW8uaCBiL2V4eW5vczQvbXVsdGltZWRpYS9vcGVubWF4L3NlY19vbXgvaW5jbHVkZS9raHJvbm9zL09NWF9BdWRpby5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjA0ZjFhOTkKLS0tIC9kZXYvbnVsbAorKysgYi9leHlub3M0L211bHRpbWVkaWEvb3Blbm1heC9zZWNfb214L2luY2x1ZGUva2hyb25vcy9PTVhfQXVkaW8uaApAQCAtMCwwICsxLDEzMTEgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMDggVGhlIEtocm9ub3MgR3JvdXAgSW5jLiAKKyAqIAorICogUGVybWlzc2lvbiBpcyBoZXJlYnkgZ3JhbnRlZCwgZnJlZSBvZiBjaGFyZ2UsIHRvIGFueSBwZXJzb24gb2J0YWluaW5nCisgKiBhIGNvcHkgb2YgdGhpcyBzb2Z0d2FyZSBhbmQgYXNzb2NpYXRlZCBkb2N1bWVudGF0aW9uIGZpbGVzICh0aGUKKyAqICJTb2Z0d2FyZSIpLCB0byBkZWFsIGluIHRoZSBTb2Z0d2FyZSB3aXRob3V0IHJlc3RyaWN0aW9uLCBpbmNsdWRpbmcKKyAqIHdpdGhvdXQgbGltaXRhdGlvbiB0aGUgcmlnaHRzIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBtZXJnZSwgcHVibGlzaCwKKyAqIGRpc3RyaWJ1dGUsIHN1YmxpY2Vuc2UsIGFuZC9vciBzZWxsIGNvcGllcyBvZiB0aGUgU29mdHdhcmUsIGFuZCB0bworICogcGVybWl0IHBlcnNvbnMgdG8gd2hvbSB0aGUgU29mdHdhcmUgaXMgZnVybmlzaGVkIHRvIGRvIHNvLCBzdWJqZWN0CisgKiB0byB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6IAorICogVGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2Ugc2hhbGwgYmUgaW5jbHVkZWQKKyAqIGluIGFsbCBjb3BpZXMgb3Igc3Vic3RhbnRpYWwgcG9ydGlvbnMgb2YgdGhlIFNvZnR3YXJlLiAKKyAqIAorICogVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIEVYUFJFU1MKKyAqIE9SIElNUExJRUQsIElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8gVEhFIFdBUlJBTlRJRVMgT0YKKyAqIE1FUkNIQU5UQUJJTElUWSwgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5EIE5PTklORlJJTkdFTUVOVC4KKyAqIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1JTIE9SIENPUFlSSUdIVCBIT0xERVJTIEJFIExJQUJMRSBGT1IgQU5ZCisgKiBDTEFJTSwgREFNQUdFUyBPUiBPVEhFUiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULAorICogVE9SVCBPUiBPVEhFUldJU0UsIEFSSVNJTkcgRlJPTSwgT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUKKyAqIFNPRlRXQVJFIE9SIFRIRSBVU0UgT1IgT1RIRVIgREVBTElOR1MgSU4gVEhFIFNPRlRXQVJFLiAKKyAqCisgKi8KKworLyoqIEBmaWxlIE9NWF9BdWRpby5oIC0gT3Blbk1heCBJTCB2ZXJzaW9uIDEuMS4yCisgKiAgVGhlIHN0cnVjdHVyZXMgbmVlZGVkIGJ5IEF1ZGlvIGNvbXBvbmVudHMgdG8gZXhjaGFuZ2UKKyAqICBwYXJhbWV0ZXJzIGFuZCBjb25maWd1cmF0aW9uIGRhdGEgd2l0aCB0aGUgY29tcG9uZW5taWx0cy4KKyAqLworCisjaWZuZGVmIE9NWF9BdWRpb19oCisjZGVmaW5lIE9NWF9BdWRpb19oCisKKyNpZmRlZiBfX2NwbHVzcGx1cworZXh0ZXJuICJDIiB7CisjZW5kaWYgLyogX19jcGx1c3BsdXMgKi8KKworCisvKiBFYWNoIE9NWCBoZWFkZXIgbXVzdCBpbmNsdWRlIGFsbCByZXF1aXJlZCBoZWFkZXIgZmlsZXMgdG8gYWxsb3cgdGhlCisgKiAgaGVhZGVyIHRvIGNvbXBpbGUgd2l0aG91dCBlcnJvcnMuICBUaGUgaW5jbHVkZXMgYmVsb3cgYXJlIHJlcXVpcmVkCisgKiAgZm9yIHRoaXMgaGVhZGVyIGZpbGUgdG8gY29tcGlsZSBzdWNjZXNzZnVsbHkgCisgKi8KKworI2luY2x1ZGUgPE9NWF9Db3JlLmg+CisKKy8qKiBAZGVmZ3JvdXAgbWlkaSBNSURJCisgKiBAaW5ncm91cCBhdWRpbworICovCisgCisvKiogQGRlZmdyb3VwIGVmZmVjdHMgQXVkaW8gZWZmZWN0cworICogQGluZ3JvdXAgYXVkaW8KKyAqLworCisvKiogQGRlZmdyb3VwIGF1ZGlvIE9wZW5NQVggSUwgQXVkaW8gRG9tYWluCisgKiBTdHJ1Y3R1cmVzIGZvciBPcGVuTUFYIElMIEF1ZGlvIGRvbWFpbgorICogQHsKKyAqLworCisvKiogRW51bWVyYXRpb24gdXNlZCB0byBkZWZpbmUgdGhlIHBvc3NpYmxlIGF1ZGlvIGNvZGluZ3MuICAKKyAqICBJZiAiT01YX0FVRElPX0NvZGluZ1VudXNlZCIgaXMgc2VsZWN0ZWQsIHRoZSBjb2Rpbmcgc2VsZWN0aW9uIG11c3QgCisgKiAgYmUgZG9uZSBpbiBhIHZlbmRvciBzcGVjaWZpYyB3YXkuICBTaW5jZSB0aGlzIGlzIGZvciBhbiBhdWRpbyAKKyAqICBwcm9jZXNzaW5nIGVsZW1lbnQgdGhpcyBlbnVtIGlzIHJlbGV2YW50LiAgSG93ZXZlciwgZm9yIGFub3RoZXIgCisgKiAgdHlwZSBvZiBjb21wb25lbnQgb3RoZXIgZW51bXMgd291bGQgYmUgaW4gdGhpcyBhcmVhLgorICovCit0eXBlZGVmIGVudW0gT01YX0FVRElPX0NPRElOR1RZUEUgeworICAgIE9NWF9BVURJT19Db2RpbmdVbnVzZWQgPSAwLCAgLyoqPCBQbGFjZWhvbGRlciB2YWx1ZSB3aGVuIGNvZGluZyBpcyBOL0EgICovCisgICAgT01YX0FVRElPX0NvZGluZ0F1dG9EZXRlY3QsICAvKio8IGF1dG8gZGV0ZWN0aW9uIG9mIGF1ZGlvIGZvcm1hdCAqLworICAgIE9NWF9BVURJT19Db2RpbmdQQ00sICAgICAgICAgLyoqPCBBbnkgdmFyaWFudCBvZiBQQ00gY29kaW5nICovCisgICAgT01YX0FVRElPX0NvZGluZ0FEUENNLCAgICAgICAvKio8IEFueSB2YXJpYW50IG9mIEFEUENNIGVuY29kZWQgZGF0YSAqLworICAgIE9NWF9BVURJT19Db2RpbmdBTVIsICAgICAgICAgLyoqPCBBbnkgdmFyaWFudCBvZiBBTVIgZW5jb2RlZCBkYXRhICovCisgICAgT01YX0FVRElPX0NvZGluZ0dTTUZSLCAgICAgICAvKio8IEFueSB2YXJpYW50IG9mIEdTTSBmdWxscmF0ZSAoaS5lLiBHU002MTApICovCisgICAgT01YX0FVRElPX0NvZGluZ0dTTUVGUiwgICAgICAvKio8IEFueSB2YXJpYW50IG9mIEdTTSBFbmhhbmNlZCBGdWxscmF0ZSBlbmNvZGVkIGRhdGEqLworICAgIE9NWF9BVURJT19Db2RpbmdHU01IUiwgICAgICAgLyoqPCBBbnkgdmFyaWFudCBvZiBHU00gSGFsZnJhdGUgZW5jb2RlZCBkYXRhICovCisgICAgT01YX0FVRElPX0NvZGluZ1BEQ0ZSLCAgICAgICAvKio8IEFueSB2YXJpYW50IG9mIFBEQyBGdWxscmF0ZSBlbmNvZGVkIGRhdGEgKi8KKyAgICBPTVhfQVVESU9fQ29kaW5nUERDRUZSLCAgICAgIC8qKjwgQW55IHZhcmlhbnQgb2YgUERDIEVuaGFuY2VkIEZ1bGxyYXRlIGVuY29kZWQgZGF0YSAqLworICAgIE9NWF9BVURJT19Db2RpbmdQRENIUiwgICAgICAgLyoqPCBBbnkgdmFyaWFudCBvZiBQREMgSGFsZnJhdGUgZW5jb2RlZCBkYXRhICovCisgICAgT01YX0FVRElPX0NvZGluZ1RETUFGUiwgICAgICAvKio8IEFueSB2YXJpYW50IG9mIFRETUEgRnVsbHJhdGUgZW5jb2RlZCBkYXRhIChUSUEvRUlBLTEzNi00MjApICovCisgICAgT01YX0FVRElPX0NvZGluZ1RETUFFRlIsICAgICAvKio8IEFueSB2YXJpYW50IG9mIFRETUEgRW5oYW5jZWQgRnVsbHJhdGUgZW5jb2RlZCBkYXRhIChUSUEvRUlBLTEzNi00MTApICovCisgICAgT01YX0FVRElPX0NvZGluZ1FDRUxQOCwgICAgICAvKio8IEFueSB2YXJpYW50IG9mIFFDRUxQIDhrYnBzIGVuY29kZWQgZGF0YSAqLworICAgIE9NWF9BVURJT19Db2RpbmdRQ0VMUDEzLCAgICAgLyoqPCBBbnkgdmFyaWFudCBvZiBRQ0VMUCAxM2ticHMgZW5jb2RlZCBkYXRhICovCisgICAgT01YX0FVRElPX0NvZGluZ0VWUkMsICAgICAgICAvKio8IEFueSB2YXJpYW50IG9mIEVWUkMgZW5jb2RlZCBkYXRhICovCisgICAgT01YX0FVRElPX0NvZGluZ1NNViwgICAgICAgICAvKio8IEFueSB2YXJpYW50IG9mIFNNViBlbmNvZGVkIGRhdGEgKi8KKyAgICBPTVhfQVVESU9fQ29kaW5nRzcxMSwgICAgICAgIC8qKjwgQW55IHZhcmlhbnQgb2YgRy43MTEgZW5jb2RlZCBkYXRhICovCisgICAgT01YX0FVRElPX0NvZGluZ0c3MjMsICAgICAgICAvKio8IEFueSB2YXJpYW50IG9mIEcuNzIzIGRvdCAxIGVuY29kZWQgZGF0YSAqLworICAgIE9NWF9BVURJT19Db2RpbmdHNzI2LCAgICAgICAgLyoqPCBBbnkgdmFyaWFudCBvZiBHLjcyNiBlbmNvZGVkIGRhdGEgKi8KKyAgICBPTVhfQVVESU9fQ29kaW5nRzcyOSwgICAgICAgIC8qKjwgQW55IHZhcmlhbnQgb2YgRy43MjkgZW5jb2RlZCBkYXRhICovCisgICAgT01YX0FVRElPX0NvZGluZ0FBQywgICAgICAgICAvKio8IEFueSB2YXJpYW50IG9mIEFBQyBlbmNvZGVkIGRhdGEgKi8KKyAgICBPTVhfQVVESU9fQ29kaW5nTVAzLCAgICAgICAgIC8qKjwgQW55IHZhcmlhbnQgb2YgTVAzIGVuY29kZWQgZGF0YSAqLworICAgIE9NWF9BVURJT19Db2RpbmdTQkMsICAgICAgICAgLyoqPCBBbnkgdmFyaWFudCBvZiBTQkMgZW5jb2RlZCBkYXRhICovCisgICAgT01YX0FVRElPX0NvZGluZ1ZPUkJJUywgICAgICAvKio8IEFueSB2YXJpYW50IG9mIFZPUkJJUyBlbmNvZGVkIGRhdGEgKi8KKyAgICBPTVhfQVVESU9fQ29kaW5nV01BLCAgICAgICAgIC8qKjwgQW55IHZhcmlhbnQgb2YgV01BIGVuY29kZWQgZGF0YSAqLworICAgIE9NWF9BVURJT19Db2RpbmdSQSwgICAgICAgICAgLyoqPCBBbnkgdmFyaWFudCBvZiBSQSBlbmNvZGVkIGRhdGEgKi8KKyAgICBPTVhfQVVESU9fQ29kaW5nTUlESSwgICAgICAgIC8qKjwgQW55IHZhcmlhbnQgb2YgTUlESSBlbmNvZGVkIGRhdGEgKi8KKyAgICBPTVhfQVVESU9fQ29kaW5nS2hyb25vc0V4dGVuc2lvbnMgPSAweDZGMDAwMDAwLCAvKio8IFJlc2VydmVkIHJlZ2lvbiBmb3IgaW50cm9kdWNpbmcgS2hyb25vcyBTdGFuZGFyZCBFeHRlbnNpb25zICovIAorICAgIE9NWF9BVURJT19Db2RpbmdWZW5kb3JTdGFydFVudXNlZCA9IDB4N0YwMDAwMDAsIC8qKjwgUmVzZXJ2ZWQgcmVnaW9uIGZvciBpbnRyb2R1Y2luZyBWZW5kb3IgRXh0ZW5zaW9ucyAqLworICAgIE9NWF9BVURJT19Db2RpbmdNYXggPSAweDdGRkZGRkZGCit9IE9NWF9BVURJT19DT0RJTkdUWVBFOworCisKKy8qKiBUaGUgUG9ydERlZmluaXRpb24gc3RydWN0dXJlIGlzIHVzZWQgdG8gZGVmaW5lIGFsbCBvZiB0aGUgcGFyYW1ldGVycyAKKyAqICBuZWNlc3NhcnkgZm9yIHRoZSBjb21wbGlhbnQgY29tcG9uZW50IHRvIHNldHVwIGFuIGlucHV0IG9yIGFuIG91dHB1dCBhdWRpbyAKKyAqICBwYXRoLiAgSWYgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiBpcyBuZWVkZWQgdG8gZGVmaW5lIHRoZSBwYXJhbWV0ZXJzIG9mIHRoZQorICogIHBvcnQgKHN1Y2ggYXMgZnJlcXVlbmN5KSwgYWRkaXRpb25hbCBzdHJ1Y3R1cmVzIG11c3QgYmUgc2VudCBzdWNoIGFzIHRoZQorICogIE9NWF9BVURJT19QQVJBTV9QQ01NT0RFVFlQRSBzdHJ1Y3R1cmUgdG8gc3VwcGx5IHRoZSBleHRyYSBwYXJhbWV0ZXJzIGZvciB0aGUgcG9ydC4KKyAqLwordHlwZWRlZiBzdHJ1Y3QgT01YX0FVRElPX1BPUlRERUZJTklUSU9OVFlQRSB7CisgICAgT01YX1NUUklORyBjTUlNRVR5cGU7ICAgICAgICAgICAgLyoqPCBNSU1FIHR5cGUgb2YgZGF0YSBmb3IgdGhlIHBvcnQgKi8KKyAgICBPTVhfTkFUSVZFX0RFVklDRVRZUEUgcE5hdGl2ZVJlbmRlcjsgLyoqIDwgcGxhdGZvcm0gc3BlY2lmaWMgcmVmZXJlbmNlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvciBhbiBvdXRwdXQgZGV2aWNlLCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3RoZXJ3aXNlIHRoaXMgZmllbGQgaXMgMCAqLworICAgIE9NWF9CT09MIGJGbGFnRXJyb3JDb25jZWFsbWVudDsgIC8qKjwgVHVybnMgb24gZXJyb3IgY29uY2VhbG1lbnQgaWYgaXQgaXMgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdXBwb3J0ZWQgYnkgdGhlIE9NWCBjb21wb25lbnQgKi8KKyAgICBPTVhfQVVESU9fQ09ESU5HVFlQRSBlRW5jb2Rpbmc7ICAvKio8IFR5cGUgb2YgZGF0YSBleHBlY3RlZCBmb3IgdGhpcyAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBvcnQgKGUuZy4gUENNLCBBTVIsIE1QMywgZXRjKSAqLworfSBPTVhfQVVESU9fUE9SVERFRklOSVRJT05UWVBFOworCisKKy8qKiAgUG9ydCBmb3JtYXQgcGFyYW1ldGVyLiAgVGhpcyBzdHJ1Y3R1cmUgaXMgdXNlZCB0byBlbnVtZXJhdGUKKyAgKiAgdGhlIHZhcmlvdXMgZGF0YSBpbnB1dC9vdXRwdXQgZm9ybWF0IHN1cHBvcnRlZCBieSB0aGUgcG9ydC4KKyAgKi8KK3R5cGVkZWYgc3RydWN0IE9NWF9BVURJT19QQVJBTV9QT1JURk9STUFUVFlQRSB7CisgICAgT01YX1UzMiBuU2l6ZTsgICAgICAgICAgICAgICAgICAvKio8IHNpemUgb2YgdGhlIHN0cnVjdHVyZSBpbiBieXRlcyAqLworICAgIE9NWF9WRVJTSU9OVFlQRSBuVmVyc2lvbjsgICAgICAgLyoqPCBPTVggc3BlY2lmaWNhdGlvbiB2ZXJzaW9uIGluZm9ybWF0aW9uICovCisgICAgT01YX1UzMiBuUG9ydEluZGV4OyAgICAgICAgICAgICAvKio8IEluZGljYXRlcyB3aGljaCBwb3J0IHRvIHNldCAqLworICAgIE9NWF9VMzIgbkluZGV4OyAgICAgICAgICAgICAgICAgLyoqPCBJbmRpY2F0ZXMgdGhlIGVudW1lcmF0aW9uIGluZGV4IGZvciB0aGUgZm9ybWF0IGZyb20gMHgwIHRvIE4tMSAqLworICAgIE9NWF9BVURJT19DT0RJTkdUWVBFIGVFbmNvZGluZzsgLyoqPCBUeXBlIG9mIGRhdGEgZXhwZWN0ZWQgZm9yIHRoaXMgcG9ydCAoZS5nLiBQQ00sIEFNUiwgTVAzLCBldGMpICovCit9IE9NWF9BVURJT19QQVJBTV9QT1JURk9STUFUVFlQRTsKKworCisvKiogUENNIG1vZGUgdHlwZSAgKi8gCit0eXBlZGVmIGVudW0gT01YX0FVRElPX1BDTU1PREVUWVBFIHsgCisgICAgT01YX0FVRElPX1BDTU1vZGVMaW5lYXIgPSAwLCAgLyoqPCBMaW5lYXIgUENNIGVuY29kZWQgZGF0YSAqLyAKKyAgICBPTVhfQVVESU9fUENNTW9kZUFMYXcsICAgICAgICAvKio8IEEgbGF3IFBDTSBlbmNvZGVkIGRhdGEgKEcuNzExKSAqLyAKKyAgICBPTVhfQVVESU9fUENNTW9kZU1VTGF3LCAgICAgICAvKio8IE11IGxhdyBQQ00gZW5jb2RlZCBkYXRhIChHLjcxMSkgICovIAorICAgIE9NWF9BVURJT19QQ01Nb2RlS2hyb25vc0V4dGVuc2lvbnMgPSAweDZGMDAwMDAwLCAvKio8IFJlc2VydmVkIHJlZ2lvbiBmb3IgaW50cm9kdWNpbmcgS2hyb25vcyBTdGFuZGFyZCBFeHRlbnNpb25zICovIAorICAgIE9NWF9BVURJT19QQ01Nb2RlVmVuZG9yU3RhcnRVbnVzZWQgPSAweDdGMDAwMDAwLCAvKio8IFJlc2VydmVkIHJlZ2lvbiBmb3IgaW50cm9kdWNpbmcgVmVuZG9yIEV4dGVuc2lvbnMgKi8KKyAgICBPTVhfQVVESU9fUENNTW9kZU1heCA9IDB4N0ZGRkZGRkYgCit9IE9NWF9BVURJT19QQ01NT0RFVFlQRTsgCisKKwordHlwZWRlZiBlbnVtIE9NWF9BVURJT19DSEFOTkVMVFlQRSB7CisgICAgT01YX0FVRElPX0NoYW5uZWxOb25lID0gMHgwLCAgICAvKio8IFVudXNlZCBvciBlbXB0eSAqLworICAgIE9NWF9BVURJT19DaGFubmVsTEYgICA9IDB4MSwgICAgLyoqPCBMZWZ0IGZyb250ICovCisgICAgT01YX0FVRElPX0NoYW5uZWxSRiAgID0gMHgyLCAgICAvKio8IFJpZ2h0IGZyb250ICovCisgICAgT01YX0FVRElPX0NoYW5uZWxDRiAgID0gMHgzLCAgICAvKio8IENlbnRlciBmcm9udCAqLworICAgIE9NWF9BVURJT19DaGFubmVsTFMgICA9IDB4NCwgICAgLyoqPCBMZWZ0IHN1cnJvdW5kICovCisgICAgT01YX0FVRElPX0NoYW5uZWxSUyAgID0gMHg1LCAgICAvKio8IFJpZ2h0IHN1cnJvdW5kICovCisgICAgT01YX0FVRElPX0NoYW5uZWxMRkUgID0gMHg2LCAgICAvKio8IExvdyBmcmVxdWVuY3kgZWZmZWN0cyAqLworICAgIE9NWF9BVURJT19DaGFubmVsQ1MgICA9IDB4NywgICAgLyoqPCBCYWNrIHN1cnJvdW5kICovCisgICAgT01YX0FVRElPX0NoYW5uZWxMUiAgID0gMHg4LCAgICAvKio8IExlZnQgcmVhci4gKi8KKyAgICBPTVhfQVVESU9fQ2hhbm5lbFJSICAgPSAweDksICAgIC8qKjwgUmlnaHQgcmVhci4gKi8KKyAgICBPTVhfQVVESU9fQ2hhbm5lbEtocm9ub3NFeHRlbnNpb25zID0gMHg2RjAwMDAwMCwgLyoqPCBSZXNlcnZlZCByZWdpb24gZm9yIGludHJvZHVjaW5nIEtocm9ub3MgU3RhbmRhcmQgRXh0ZW5zaW9ucyAqLyAKKyAgICBPTVhfQVVESU9fQ2hhbm5lbFZlbmRvclN0YXJ0VW51c2VkID0gMHg3RjAwMDAwMCwgLyoqPCBSZXNlcnZlZCByZWdpb24gZm9yIGludHJvZHVjaW5nIFZlbmRvciBFeHRlbnNpb25zICovCisgICAgT01YX0FVRElPX0NoYW5uZWxNYXggID0gMHg3RkZGRkZGRiAKK30gT01YX0FVRElPX0NIQU5ORUxUWVBFOworCisjZGVmaW5lIE9NWF9BVURJT19NQVhDSEFOTkVMUyAxNiAgLyoqPCBtYXhpbXVtIG51bWJlciBkaXN0aW5jdCBhdWRpbyBjaGFubmVscyB0aGF0IGEgYnVmZmVyIG1heSBjb250YWluICovCisjZGVmaW5lIE9NWF9NSU5fUENNUEFZTE9BRF9NU0VDIDUgLyoqPCBNaW5pbXVtIGF1ZGlvIGJ1ZmZlciBwYXlsb2FkIHNpemUgZm9yIHVuY29tcHJlc3NlZCAoUENNKSBhdWRpbyAqLworCisvKiogUENNIGZvcm1hdCBkZXNjcmlwdGlvbiAqLyAKK3R5cGVkZWYgc3RydWN0IE9NWF9BVURJT19QQVJBTV9QQ01NT0RFVFlQRSB7IAorICAgIE9NWF9VMzIgblNpemU7ICAgICAgICAgICAgICAgICAgICAvKio8IFNpemUgb2YgdGhpcyBzdHJ1Y3R1cmUsIGluIEJ5dGVzICovIAorICAgIE9NWF9WRVJTSU9OVFlQRSBuVmVyc2lvbjsgICAgICAgICAvKio8IE9NWCBzcGVjaWZpY2F0aW9uIHZlcnNpb24gaW5mb3JtYXRpb24gKi8gCisgICAgT01YX1UzMiBuUG9ydEluZGV4OyAgICAgICAgICAgICAgIC8qKjwgcG9ydCB0aGF0IHRoaXMgc3RydWN0dXJlIGFwcGxpZXMgdG8gKi8gCisgICAgT01YX1UzMiBuQ2hhbm5lbHM7ICAgICAgICAgICAgICAgIC8qKjwgTnVtYmVyIG9mIGNoYW5uZWxzIChlLmcuIDIgZm9yIHN0ZXJlbykgKi8gCisgICAgT01YX05VTUVSSUNBTERBVEFUWVBFIGVOdW1EYXRhOyAgIC8qKjwgaW5kaWNhdGVzIFBDTSBkYXRhIGFzIHNpZ25lZCBvciB1bnNpZ25lZCAqLyAKKyAgICBPTVhfRU5ESUFOVFlQRSBlRW5kaWFuOyAgICAgICAgICAgLyoqPCBpbmRpY2F0ZXMgUENNIGRhdGEgYXMgbGl0dGxlIG9yIGJpZyBlbmRpYW4gKi8gCisgICAgT01YX0JPT0wgYkludGVybGVhdmVkOyAgICAgICAgICAgIC8qKjwgVHJ1ZSBmb3Igbm9ybWFsIGludGVybGVhdmVkIGRhdGE7IGZhbHNlIGZvciAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBub24taW50ZXJsZWF2ZWQgZGF0YSAoZS5nLiBibG9jayBkYXRhKSAqLyAKKyAgICBPTVhfVTMyIG5CaXRQZXJTYW1wbGU7ICAgICAgICAgICAgLyoqPCBCaXQgcGVyIHNhbXBsZSAqLyAKKyAgICBPTVhfVTMyIG5TYW1wbGluZ1JhdGU7ICAgICAgICAgICAgLyoqPCBTYW1wbGluZyByYXRlIG9mIHRoZSBzb3VyY2UgZGF0YS4gIFVzZSAwIGZvciAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXJpYWJsZSBvciB1bmtub3duIHNhbXBsaW5nIHJhdGUuICovIAorICAgIE9NWF9BVURJT19QQ01NT0RFVFlQRSBlUENNTW9kZTsgICAvKio8IFBDTSBtb2RlIGVudW1lcmF0aW9uICovIAorICAgIE9NWF9BVURJT19DSEFOTkVMVFlQRSBlQ2hhbm5lbE1hcHBpbmdbT01YX0FVRElPX01BWENIQU5ORUxTXTsgLyoqPCBTbG90IGkgY29udGFpbnMgY2hhbm5lbCBkZWZpbmVkIGJ5IGVDaGFubmVsTWFwW2ldICovCisKK30gT01YX0FVRElPX1BBUkFNX1BDTU1PREVUWVBFOyAKKworCisvKiogQXVkaW8gY2hhbm5lbCBtb2RlLiAgVGhpcyBpcyB1c2VkIGJ5IGJvdGggQUFDIGFuZCBNUDMsIGFsdGhvdWdoIHRoZSBuYW1lcyBhcmUgbW9yZSBhcHByb3ByaWF0ZQorICogZm9yIHRoZSBNUDMuICBGb3IgZXhhbXBsZSwgSm9pbnRTdGVyZW8gZm9yIE1QMyBpcyBDb3VwbGluZ0NoYW5uZWxzIGZvciBBQUMuIAorICovCit0eXBlZGVmIGVudW0gT01YX0FVRElPX0NIQU5ORUxNT0RFVFlQRSB7CisgICAgT01YX0FVRElPX0NoYW5uZWxNb2RlU3RlcmVvID0gMCwgIC8qKjwgMiBjaGFubmVscywgdGhlIGJpdHJhdGUgYWxsb2NhdGlvbiBiZXR3ZWVuIHRob3NlIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHdvIGNoYW5uZWxzIGNoYW5nZXMgYWNjb3JkaW5nbHkgdG8gZWFjaCBjaGFubmVsIGluZm9ybWF0aW9uICovCisgICAgT01YX0FVRElPX0NoYW5uZWxNb2RlSm9pbnRTdGVyZW8sIC8qKjwgbW9kZSB0aGF0IHRha2VzIGFkdmFudGFnZSBvZiB3aGF0IGlzIGNvbW1vbiBiZXR3ZWVuIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDIgY2hhbm5lbHMgZm9yIGhpZ2hlciBjb21wcmVzc2lvbiBnYWluICovCisgICAgT01YX0FVRElPX0NoYW5uZWxNb2RlRHVhbCwgICAgICAgIC8qKjwgMiBtb25vLWNoYW5uZWxzLCBlYWNoIGNoYW5uZWwgaXMgZW5jb2RlZCB3aXRoIGhhbGYgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhlIGJpdHJhdGUgb2YgdGhlIG92ZXJhbGwgYml0cmF0ZSAqLworICAgIE9NWF9BVURJT19DaGFubmVsTW9kZU1vbm8sICAgICAgICAvKio8IE1vbm8gY2hhbm5lbCBtb2RlICovCisgICAgT01YX0FVRElPX0NoYW5uZWxNb2RlS2hyb25vc0V4dGVuc2lvbnMgPSAweDZGMDAwMDAwLCAvKio8IFJlc2VydmVkIHJlZ2lvbiBmb3IgaW50cm9kdWNpbmcgS2hyb25vcyBTdGFuZGFyZCBFeHRlbnNpb25zICovIAorICAgIE9NWF9BVURJT19DaGFubmVsTW9kZVZlbmRvclN0YXJ0VW51c2VkID0gMHg3RjAwMDAwMCwgLyoqPCBSZXNlcnZlZCByZWdpb24gZm9yIGludHJvZHVjaW5nIFZlbmRvciBFeHRlbnNpb25zICovCisgICAgT01YX0FVRElPX0NoYW5uZWxNb2RlTWF4ID0gMHg3RkZGRkZGRgorfSBPTVhfQVVESU9fQ0hBTk5FTE1PREVUWVBFOworCisKK3R5cGVkZWYgZW51bSBPTVhfQVVESU9fTVAzU1RSRUFNRk9STUFUVFlQRSB7CisgICAgT01YX0FVRElPX01QM1N0cmVhbUZvcm1hdE1QMUxheWVyMyA9IDAsIC8qKjwgTVAzIEF1ZGlvIE1QRUcgMSBMYXllciAzIFN0cmVhbSBmb3JtYXQgKi8KKyAgICBPTVhfQVVESU9fTVAzU3RyZWFtRm9ybWF0TVAyTGF5ZXIzLCAgICAgLyoqPCBNUDMgQXVkaW8gTVBFRyAyIExheWVyIDMgU3RyZWFtIGZvcm1hdCAqLworICAgIE9NWF9BVURJT19NUDNTdHJlYW1Gb3JtYXRNUDJfNUxheWVyMywgICAvKio8IE1QMyBBdWRpbyBNUEVHMi41IExheWVyIDMgU3RyZWFtIGZvcm1hdCAqLworICAgIE9NWF9BVURJT19NUDNTdHJlYW1Gb3JtYXRLaHJvbm9zRXh0ZW5zaW9ucyA9IDB4NkYwMDAwMDAsIC8qKjwgUmVzZXJ2ZWQgcmVnaW9uIGZvciBpbnRyb2R1Y2luZyBLaHJvbm9zIFN0YW5kYXJkIEV4dGVuc2lvbnMgKi8gCisgICAgT01YX0FVRElPX01QM1N0cmVhbUZvcm1hdFZlbmRvclN0YXJ0VW51c2VkID0gMHg3RjAwMDAwMCwgLyoqPCBSZXNlcnZlZCByZWdpb24gZm9yIGludHJvZHVjaW5nIFZlbmRvciBFeHRlbnNpb25zICovCisgICAgT01YX0FVRElPX01QM1N0cmVhbUZvcm1hdE1heCA9IDB4N0ZGRkZGRkYKK30gT01YX0FVRElPX01QM1NUUkVBTUZPUk1BVFRZUEU7CisKKy8qKiBNUDMgcGFyYW1zICovCit0eXBlZGVmIHN0cnVjdCBPTVhfQVVESU9fUEFSQU1fTVAzVFlQRSB7CisgICAgT01YX1UzMiBuU2l6ZTsgICAgICAgICAgICAgICAgIC8qKjwgc2l6ZSBvZiB0aGUgc3RydWN0dXJlIGluIGJ5dGVzICovCisgICAgT01YX1ZFUlNJT05UWVBFIG5WZXJzaW9uOyAgICAgIC8qKjwgT01YIHNwZWNpZmljYXRpb24gdmVyc2lvbiBpbmZvcm1hdGlvbiAqLworICAgIE9NWF9VMzIgblBvcnRJbmRleDsgICAgICAgICAgICAvKio8IHBvcnQgdGhhdCB0aGlzIHN0cnVjdHVyZSBhcHBsaWVzIHRvICovCisgICAgT01YX1UzMiBuQ2hhbm5lbHM7ICAgICAgICAgICAgIC8qKjwgTnVtYmVyIG9mIGNoYW5uZWxzICovCisgICAgT01YX1UzMiBuQml0UmF0ZTsgICAgICAgICAgICAgIC8qKjwgQml0IHJhdGUgb2YgdGhlIGlucHV0IGRhdGEuICBVc2UgMCBmb3IgdmFyaWFibGUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByYXRlIG9yIHVua25vd24gYml0IHJhdGVzICovCisgICAgT01YX1UzMiBuU2FtcGxlUmF0ZTsgICAgICAgICAgIC8qKjwgU2FtcGxpbmcgcmF0ZSBvZiB0aGUgc291cmNlIGRhdGEuICBVc2UgMCBmb3IKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXJpYWJsZSBvciB1bmtub3duIHNhbXBsaW5nIHJhdGUuICovCisgICAgT01YX1UzMiBuQXVkaW9CYW5kV2lkdGg7ICAgICAgIC8qKjwgQXVkaW8gYmFuZCB3aWR0aCAoaW4gSHopIHRvIHdoaWNoIGFuIGVuY29kZXIgc2hvdWxkCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGltaXQgdGhlIGF1ZGlvIHNpZ25hbC4gVXNlIDAgdG8gbGV0IGVuY29kZXIgZGVjaWRlICovCisgICAgT01YX0FVRElPX0NIQU5ORUxNT0RFVFlQRSBlQ2hhbm5lbE1vZGU7ICAgLyoqPCBDaGFubmVsIG1vZGUgZW51bWVyYXRpb24gKi8KKyAgICBPTVhfQVVESU9fTVAzU1RSRUFNRk9STUFUVFlQRSBlRm9ybWF0OyAgLyoqPCBNUDMgc3RyZWFtIGZvcm1hdCAqLworfSBPTVhfQVVESU9fUEFSQU1fTVAzVFlQRTsKKworCit0eXBlZGVmIGVudW0gT01YX0FVRElPX0FBQ1NUUkVBTUZPUk1BVFRZUEUgeworICAgIE9NWF9BVURJT19BQUNTdHJlYW1Gb3JtYXRNUDJBRFRTID0gMCwgLyoqPCBBQUMgQXVkaW8gRGF0YSBUcmFuc3BvcnQgU3RyZWFtIDIgZm9ybWF0ICovCisgICAgT01YX0FVRElPX0FBQ1N0cmVhbUZvcm1hdE1QNEFEVFMsICAgICAvKio8IEFBQyBBdWRpbyBEYXRhIFRyYW5zcG9ydCBTdHJlYW0gNCBmb3JtYXQgKi8KKyAgICBPTVhfQVVESU9fQUFDU3RyZWFtRm9ybWF0TVA0TE9BUywgICAgIC8qKjwgQUFDIExvdyBPdmVyaGVhZCBBdWRpbyBTdHJlYW0gZm9ybWF0ICovCisgICAgT01YX0FVRElPX0FBQ1N0cmVhbUZvcm1hdE1QNExBVE0sICAgICAvKio8IEFBQyBMb3cgb3ZlcmhlYWQgQXVkaW8gVHJhbnNwb3J0IE11bHRpcGxleCAqLworICAgIE9NWF9BVURJT19BQUNTdHJlYW1Gb3JtYXRBRElGLCAgICAgICAgLyoqPCBBQUMgQXVkaW8gRGF0YSBJbnRlcmNoYW5nZSBGb3JtYXQgKi8KKyAgICBPTVhfQVVESU9fQUFDU3RyZWFtRm9ybWF0TVA0RkYsICAgICAgIC8qKjwgQUFDIGluc2lkZSBNUEVHLTQvSVNPIEZpbGUgRm9ybWF0ICovCisgICAgT01YX0FVRElPX0FBQ1N0cmVhbUZvcm1hdFJBVywgICAgICAgICAvKio8IEFBQyBSYXcgRm9ybWF0ICovCisgICAgT01YX0FVRElPX0FBQ1N0cmVhbUZvcm1hdEtocm9ub3NFeHRlbnNpb25zID0gMHg2RjAwMDAwMCwgLyoqPCBSZXNlcnZlZCByZWdpb24gZm9yIGludHJvZHVjaW5nIEtocm9ub3MgU3RhbmRhcmQgRXh0ZW5zaW9ucyAqLyAKKyAgICBPTVhfQVVESU9fQUFDU3RyZWFtRm9ybWF0VmVuZG9yU3RhcnRVbnVzZWQgPSAweDdGMDAwMDAwLCAvKio8IFJlc2VydmVkIHJlZ2lvbiBmb3IgaW50cm9kdWNpbmcgVmVuZG9yIEV4dGVuc2lvbnMgKi8KKyAgICBPTVhfQVVESU9fQUFDU3RyZWFtRm9ybWF0TWF4ID0gMHg3RkZGRkZGRgorfSBPTVhfQVVESU9fQUFDU1RSRUFNRk9STUFUVFlQRTsKKworCisvKiogQUFDIG1vZGUgdHlwZS4gIE5vdGUgdGhhdCB0aGUgdGVybSBwcm9maWxlIGlzIHVzZWQgd2l0aCB0aGUgTVBFRy0yCisgKiBzdGFuZGFyZCBhbmQgdGhlIHRlcm0gb2JqZWN0IHR5cGUgYW5kIHByb2ZpbGUgaXMgdXNlZCB3aXRoIE1QRUctNCAqLwordHlwZWRlZiBlbnVtIE9NWF9BVURJT19BQUNQUk9GSUxFVFlQRXsKKyAgT01YX0FVRElPX0FBQ09iamVjdE51bGwgPSAwLCAgICAgIC8qKjwgTnVsbCwgbm90IHVzZWQgKi8KKyAgT01YX0FVRElPX0FBQ09iamVjdE1haW4gPSAxLCAgICAgIC8qKjwgQUFDIE1haW4gb2JqZWN0ICovCisgIE9NWF9BVURJT19BQUNPYmplY3RMQywgICAgICAgICAgICAvKio8IEFBQyBMb3cgQ29tcGxleGl0eSBvYmplY3QgKEFBQyBwcm9maWxlKSAqLworICBPTVhfQVVESU9fQUFDT2JqZWN0U1NSLCAgICAgICAgICAgLyoqPCBBQUMgU2NhbGFibGUgU2FtcGxlIFJhdGUgb2JqZWN0ICovCisgIE9NWF9BVURJT19BQUNPYmplY3RMVFAsICAgICAgICAgICAvKio8IEFBQyBMb25nIFRlcm0gUHJlZGljdGlvbiBvYmplY3QgKi8KKyAgT01YX0FVRElPX0FBQ09iamVjdEhFLCAgICAgICAgICAgIC8qKjwgQUFDIEhpZ2ggRWZmaWNpZW5jeSAob2JqZWN0IHR5cGUgU0JSLCBIRS1BQUMgcHJvZmlsZSkgKi8KKyAgT01YX0FVRElPX0FBQ09iamVjdFNjYWxhYmxlLCAgICAgIC8qKjwgQUFDIFNjYWxhYmxlIG9iamVjdCAqLworICBPTVhfQVVESU9fQUFDT2JqZWN0RVJMQyA9IDE3LCAgICAgLyoqPCBFUiBBQUMgTG93IENvbXBsZXhpdHkgb2JqZWN0IChFcnJvciBSZXNpbGllbnQgQUFDLUxDKSAqLworICBPTVhfQVVESU9fQUFDT2JqZWN0TEQgPSAyMywgICAgICAgLyoqPCBBQUMgTG93IERlbGF5IG9iamVjdCAoRXJyb3IgUmVzaWxpZW50KSAqLworICBPTVhfQVVESU9fQUFDT2JqZWN0SEVfUFMgPSAyOSwgICAgLyoqPCBBQUMgSGlnaCBFZmZpY2llbmN5IHdpdGggUGFyYW1ldHJpYyBTdGVyZW8gY29kaW5nIChIRS1BQUMgdjIsIG9iamVjdCB0eXBlIFBTKSAqLworICBPTVhfQVVESU9fQUFDT2JqZWN0S2hyb25vc0V4dGVuc2lvbnMgPSAweDZGMDAwMDAwLCAvKio8IFJlc2VydmVkIHJlZ2lvbiBmb3IgaW50cm9kdWNpbmcgS2hyb25vcyBTdGFuZGFyZCBFeHRlbnNpb25zICovIAorICBPTVhfQVVESU9fQUFDT2JqZWN0VmVuZG9yU3RhcnRVbnVzZWQgPSAweDdGMDAwMDAwLCAvKio8IFJlc2VydmVkIHJlZ2lvbiBmb3IgaW50cm9kdWNpbmcgVmVuZG9yIEV4dGVuc2lvbnMgKi8KKyAgT01YX0FVRElPX0FBQ09iamVjdE1heCA9IDB4N0ZGRkZGRkYKK30gT01YX0FVRElPX0FBQ1BST0ZJTEVUWVBFOworCisKKy8qKiBBQUMgdG9vbCB1c2FnZSAoZm9yIG5BQUN0b29scyBpbiBPTVhfQVVESU9fUEFSQU1fQUFDUFJPRklMRVRZUEUpLgorICogUmVxdWlyZWQgZm9yIGVuY29kZXIgY29uZmlndXJhdGlvbiBhbmQgb3B0aW9uYWwgYXMgZGVjb2RlciBpbmZvIG91dHB1dC4KKyAqIEZvciBNUDMsIE9NWF9BVURJT19DSEFOTkVMTU9ERVRZUEUgaXMgc3VmZmljaWVudC4gKi8KKyNkZWZpbmUgT01YX0FVRElPX0FBQ1Rvb2xOb25lIDB4MDAwMDAwMDAgLyoqPCBubyBBQUMgdG9vbHMgYWxsb3dlZCAoZW5jb2RlciBjb25maWcpIG9yIGFjdGl2ZSAoZGVjb2RlciBpbmZvIG91dHB1dCkgKi8KKyNkZWZpbmUgT01YX0FVRElPX0FBQ1Rvb2xNUyAgIDB4MDAwMDAwMDEgLyoqPCBNUzogTWlkL3NpZGUgam9pbnQgY29kaW5nIHRvb2wgYWxsb3dlZCBvciBhY3RpdmUgKi8KKyNkZWZpbmUgT01YX0FVRElPX0FBQ1Rvb2xJUyAgIDB4MDAwMDAwMDIgLyoqPCBJUzogSW50ZW5zaXR5IHN0ZXJlbyB0b29sIGFsbG93ZWQgb3IgYWN0aXZlICovCisjZGVmaW5lIE9NWF9BVURJT19BQUNUb29sVE5TICAweDAwMDAwMDA0IC8qKjwgVE5TOiBUZW1wb3JhbCBOb2lzZSBTaGFwaW5nIHRvb2wgYWxsb3dlZCBvciBhY3RpdmUgKi8KKyNkZWZpbmUgT01YX0FVRElPX0FBQ1Rvb2xQTlMgIDB4MDAwMDAwMDggLyoqPCBQTlM6IE1QRUctNCBQZXJjZXB0dWFsIE5vaXNlIHN1YnN0aXR1dGlvbiB0b29sIGFsbG93ZWQgb3IgYWN0aXZlICovCisjZGVmaW5lIE9NWF9BVURJT19BQUNUb29sTFRQICAweDAwMDAwMDEwIC8qKjwgTFRQOiBNUEVHLTQgTG9uZyBUZXJtIFByZWRpY3Rpb24gdG9vbCBhbGxvd2VkIG9yIGFjdGl2ZSAqLworI2RlZmluZSBPTVhfQVVESU9fQUFDVG9vbEFsbCAgMHg3RkZGRkZGRiAvKio8IGFsbCBBQUMgdG9vbHMgYWxsb3dlZCBvciBhY3RpdmUgKCovCisKKy8qKiBNUEVHLTQgQUFDIGVycm9yIHJlc2lsaWVuY2UgKEVSKSB0b29sIHVzYWdlIChmb3IgbkFBQ0VSdG9vbHMgaW4gT01YX0FVRElPX1BBUkFNX0FBQ1BST0ZJTEVUWVBFKS4KKyAqIFJlcXVpcmVkIGZvciBFUiBlbmNvZGVyIGNvbmZpZ3VyYXRpb24gYW5kIG9wdGlvbmFsIGFzIGRlY29kZXIgaW5mbyBvdXRwdXQgKi8KKyNkZWZpbmUgT01YX0FVRElPX0FBQ0VSTm9uZSAgMHgwMDAwMDAwMCAgLyoqPCBubyBBQUMgRVIgdG9vbHMgYWxsb3dlZC91c2VkICovCisjZGVmaW5lIE9NWF9BVURJT19BQUNFUlZDQjExIDB4MDAwMDAwMDEgIC8qKjwgVkNCMTE6IFZpcnR1YWwgQ29kZSBCb29rcyBmb3IgQUFDIHNlY3Rpb24gZGF0YSAqLworI2RlZmluZSBPTVhfQVVESU9fQUFDRVJSVkxDICAweDAwMDAwMDAyICAvKio8IFJWTEM6IFJldmVyc2libGUgVmFyaWFibGUgTGVuZ3RoIENvZGluZyAqLworI2RlZmluZSBPTVhfQVVESU9fQUFDRVJIQ1IgICAweDAwMDAwMDA0ICAvKio8IEhDUjogSHVmZm1hbiBDb2Rld29yZCBSZW9yZGVyaW5nICovCisjZGVmaW5lIE9NWF9BVURJT19BQUNFUkFsbCAgIDB4N0ZGRkZGRkYgIC8qKjwgYWxsIEFBQyBFUiB0b29scyBhbGxvd2VkL3VzZWQgKi8KKworCisvKiogQUFDIHBhcmFtcyAqLwordHlwZWRlZiBzdHJ1Y3QgT01YX0FVRElPX1BBUkFNX0FBQ1BST0ZJTEVUWVBFIHsKKyAgICBPTVhfVTMyIG5TaXplOyAgICAgICAgICAgICAgICAgLyoqPCBTaXplIG9mIHRoaXMgc3RydWN0dXJlLCBpbiBCeXRlcyAqLworICAgIE9NWF9WRVJTSU9OVFlQRSBuVmVyc2lvbjsgICAgICAvKio8IE9NWCBzcGVjaWZpY2F0aW9uIHZlcnNpb24gaW5mb3JtYXRpb24gKi8KKyAgICBPTVhfVTMyIG5Qb3J0SW5kZXg7ICAgICAgICAgICAgLyoqPCBQb3J0IHRoYXQgdGhpcyBzdHJ1Y3R1cmUgYXBwbGllcyB0byAqLworICAgIE9NWF9VMzIgbkNoYW5uZWxzOyAgICAgICAgICAgICAvKio8IE51bWJlciBvZiBjaGFubmVscyAqLworICAgIE9NWF9VMzIgblNhbXBsZVJhdGU7ICAgICAgICAgICAvKio8IFNhbXBsaW5nIHJhdGUgb2YgdGhlIHNvdXJjZSBkYXRhLiAgVXNlIDAgZm9yCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyaWFibGUgb3IgdW5rbm93biBzYW1wbGluZyByYXRlLiAqLworICAgIE9NWF9VMzIgbkJpdFJhdGU7ICAgICAgICAgICAgICAvKio8IEJpdCByYXRlIG9mIHRoZSBpbnB1dCBkYXRhLiAgVXNlIDAgZm9yIHZhcmlhYmxlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmF0ZSBvciB1bmtub3duIGJpdCByYXRlcyAqLworICAgIE9NWF9VMzIgbkF1ZGlvQmFuZFdpZHRoOyAgICAgICAvKio8IEF1ZGlvIGJhbmQgd2lkdGggKGluIEh6KSB0byB3aGljaCBhbiBlbmNvZGVyIHNob3VsZAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxpbWl0IHRoZSBhdWRpbyBzaWduYWwuIFVzZSAwIHRvIGxldCBlbmNvZGVyIGRlY2lkZSAqLworICAgIE9NWF9VMzIgbkZyYW1lTGVuZ3RoOyAgICAgICAgICAvKio8IEZyYW1lIGxlbmd0aCAoaW4gYXVkaW8gc2FtcGxlcyBwZXIgY2hhbm5lbCkgb2YgdGhlIGNvZGVjLgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENhbiBiZSAxMDI0IG9yIDk2MCAoQUFDLUxDKSwgMjA0OCAoSEUtQUFDKSwgNDgwIG9yIDUxMiAoQUFDLUxEKS4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVc2UgMCB0byBsZXQgZW5jb2RlciBkZWNpZGUgKi8KKyAgICBPTVhfVTMyIG5BQUN0b29sczsgICAgICAgICAgICAgLyoqPCBBQUMgdG9vbCB1c2FnZSAqLworICAgIE9NWF9VMzIgbkFBQ0VSdG9vbHM7ICAgICAgICAgICAvKio8IE1QRUctNCBBQUMgZXJyb3IgcmVzaWxpZW5jZSB0b29sIHVzYWdlICovCisgICAgT01YX0FVRElPX0FBQ1BST0ZJTEVUWVBFIGVBQUNQcm9maWxlOyAgIC8qKjwgQUFDIHByb2ZpbGUgZW51bWVyYXRpb24gKi8KKyAgICBPTVhfQVVESU9fQUFDU1RSRUFNRk9STUFUVFlQRSBlQUFDU3RyZWFtRm9ybWF0OyAvKio8IEFBQyBzdHJlYW0gZm9ybWF0IGVudW1lcmF0aW9uICovCisgICAgT01YX0FVRElPX0NIQU5ORUxNT0RFVFlQRSBlQ2hhbm5lbE1vZGU7ICAgLyoqPCBDaGFubmVsIG1vZGUgZW51bWVyYXRpb24gKi8KK30gT01YX0FVRElPX1BBUkFNX0FBQ1BST0ZJTEVUWVBFOworCisKKy8qKiBWT1JCSVMgcGFyYW1zICovCit0eXBlZGVmIHN0cnVjdCBPTVhfQVVESU9fUEFSQU1fVk9SQklTVFlQRSB7CisgICAgT01YX1UzMiBuU2l6ZTsgICAgICAgICAgICAvKio8IHNpemUgb2YgdGhlIHN0cnVjdHVyZSBpbiBieXRlcyAqLworICAgIE9NWF9WRVJTSU9OVFlQRSBuVmVyc2lvbjsgLyoqPCBPTVggc3BlY2lmaWNhdGlvbiB2ZXJzaW9uIGluZm9ybWF0aW9uICovCisgICAgT01YX1UzMiBuUG9ydEluZGV4OyAgICAgICAvKio8IHBvcnQgdGhhdCB0aGlzIHN0cnVjdHVyZSBhcHBsaWVzIHRvICovCisgICAgT01YX1UzMiBuQ2hhbm5lbHM7ICAgICAgICAvKio8IE51bWJlciBvZiBjaGFubmVscyAqLworICAgIE9NWF9VMzIgbkJpdFJhdGU7ICAgICAgICAgLyoqPCBCaXQgcmF0ZSBvZiB0aGUgZW5jb2RlZCBkYXRhIGRhdGEuICBVc2UgMCBmb3IgdmFyaWFibGUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmF0ZSBvciB1bmtub3duIGJpdCByYXRlcy4gRW5jb2RpbmcgaXMgc2V0IHRvIHRoZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiaXRyYXRlIGNsb3Nlc3QgdG8gc3BlY2lmaWVkICB2YWx1ZSAoaW4gYnBzKSAqLworICAgIE9NWF9VMzIgbk1pbkJpdFJhdGU7ICAgICAgLyoqPCBTZXRzIG1pbmltdW0gYml0cmF0ZSAoaW4gYnBzKS4gKi8KKyAgICBPTVhfVTMyIG5NYXhCaXRSYXRlOyAgICAgIC8qKjwgU2V0cyBtYXhpbXVtIGJpdHJhdGUgKGluIGJwcykuICovCisKKyAgICBPTVhfVTMyIG5TYW1wbGVSYXRlOyAgICAgIC8qKjwgU2FtcGxpbmcgcmF0ZSBvZiB0aGUgc291cmNlIGRhdGEuICBVc2UgMCBmb3IKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyaWFibGUgb3IgdW5rbm93biBzYW1wbGluZyByYXRlLiAqLworICAgIE9NWF9VMzIgbkF1ZGlvQmFuZFdpZHRoOyAgLyoqPCBBdWRpbyBiYW5kIHdpZHRoIChpbiBIeikgdG8gd2hpY2ggYW4gZW5jb2RlciBzaG91bGQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGltaXQgdGhlIGF1ZGlvIHNpZ25hbC4gVXNlIDAgdG8gbGV0IGVuY29kZXIgZGVjaWRlICovCisgICAgT01YX1MzMiBuUXVhbGl0eTsJCSAgLyoqPCBTZXRzIGVuY29kaW5nIHF1YWxpdHkgdG8gbiwgYmV0d2VlbiAtMSAobG93KSBhbmQgMTAgKGhpZ2gpLgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJbiB0aGUgZGVmYXVsdCBtb2RlIG9mIG9wZXJhdGlvbiwgdGVoIHF1YWxpdHkgbGV2ZWwgaXMgMy4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTm9ybWFsIHF1YWxpdHkgcmFuZ2UgaXMgMCAtIDEwLiAqLworICAgIE9NWF9CT09MIGJNYW5hZ2VkOwkJICAvKio8IFNldCAgYml0cmF0ZSAgbWFuYWdlbWVudCAgbW9kZS4gVGhpcyB0dXJucyBvZmYgdGhlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5vcm1hbCBWQlIgZW5jb2RpbmcsIGJ1dCBhbGxvd3MgaGFyZCBvciBzb2Z0IGJpdHJhdGUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3RyYWludHMgdG8gYmUgZW5mb3JjZWQgYnkgdGhlIGVuY29kZXIuIFRoaXMgbW9kZSBjYW4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYmUgc2xvd2VyLCBhbmQgbWF5IGFsc28gYmUgbG93ZXIgcXVhbGl0eS4gSXQgaXMKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJpbWFyaWx5IHVzZWZ1bCBmb3Igc3RyZWFtaW5nLiAqLworICAgIE9NWF9CT09MIGJEb3dubWl4OwkJICAvKio8IERvd25taXggaW5wdXQgZnJvbSBzdGVyZW8gdG8gbW9ubyAoaGFzIG5vIGVmZmVjdCBvbiAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbm9uLXN0ZXJlbyBzdHJlYW1zKS4gVXNlZnVsIGZvciBsb3dlci1iaXRyYXRlIGVuY29kaW5nLiAqLyAgICAgCit9IE9NWF9BVURJT19QQVJBTV9WT1JCSVNUWVBFOworCisKKy8qKiBXTUEgVmVyc2lvbiAqLwordHlwZWRlZiBlbnVtIE9NWF9BVURJT19XTUFGT1JNQVRUWVBFIHsKKyAgT01YX0FVRElPX1dNQUZvcm1hdFVudXNlZCA9IDAsIC8qKjwgZm9ybWF0IHVudXNlZCBvciB1bmtub3duICovCisgIE9NWF9BVURJT19XTUFGb3JtYXQ3LCAgICAgICAgICAvKio8IFdpbmRvd3MgTWVkaWEgQXVkaW8gZm9ybWF0IDcgKi8KKyAgT01YX0FVRElPX1dNQUZvcm1hdDgsICAgICAgICAgIC8qKjwgV2luZG93cyBNZWRpYSBBdWRpbyBmb3JtYXQgOCAqLworICBPTVhfQVVESU9fV01BRm9ybWF0OSwgICAgICAgICAgLyoqPCBXaW5kb3dzIE1lZGlhIEF1ZGlvIGZvcm1hdCA5ICovCisgIE9NWF9BVURJT19XTUFGb3JtYXRLaHJvbm9zRXh0ZW5zaW9ucyA9IDB4NkYwMDAwMDAsIC8qKjwgUmVzZXJ2ZWQgcmVnaW9uIGZvciBpbnRyb2R1Y2luZyBLaHJvbm9zIFN0YW5kYXJkIEV4dGVuc2lvbnMgKi8gCisgIE9NWF9BVURJT19XTUFGb3JtYXRWZW5kb3JTdGFydFVudXNlZCA9IDB4N0YwMDAwMDAsIC8qKjwgUmVzZXJ2ZWQgcmVnaW9uIGZvciBpbnRyb2R1Y2luZyBWZW5kb3IgRXh0ZW5zaW9ucyAqLworICBPTVhfQVVESU9fV01BRm9ybWF0TWF4ID0gMHg3RkZGRkZGRgorfSBPTVhfQVVESU9fV01BRk9STUFUVFlQRTsKKworCisvKiogV01BIFByb2ZpbGUgKi8KK3R5cGVkZWYgZW51bSBPTVhfQVVESU9fV01BUFJPRklMRVRZUEUgeworICBPTVhfQVVESU9fV01BUHJvZmlsZVVudXNlZCA9IDAsICAvKio8IHByb2ZpbGUgdW51c2VkIG9yIHVua25vd24gKi8KKyAgT01YX0FVRElPX1dNQVByb2ZpbGVMMSwgICAgICAgICAgLyoqPCBXaW5kb3dzIE1lZGlhIGF1ZGlvIHZlcnNpb24gOSBwcm9maWxlIEwxICovCisgIE9NWF9BVURJT19XTUFQcm9maWxlTDIsICAgICAgICAgIC8qKjwgV2luZG93cyBNZWRpYSBhdWRpbyB2ZXJzaW9uIDkgcHJvZmlsZSBMMiAqLworICBPTVhfQVVESU9fV01BUHJvZmlsZUwzLCAgICAgICAgICAvKio8IFdpbmRvd3MgTWVkaWEgYXVkaW8gdmVyc2lvbiA5IHByb2ZpbGUgTDMgKi8KKyAgT01YX0FVRElPX1dNQVByb2ZpbGVLaHJvbm9zRXh0ZW5zaW9ucyA9IDB4NkYwMDAwMDAsIC8qKjwgUmVzZXJ2ZWQgcmVnaW9uIGZvciBpbnRyb2R1Y2luZyBLaHJvbm9zIFN0YW5kYXJkIEV4dGVuc2lvbnMgKi8gCisgIE9NWF9BVURJT19XTUFQcm9maWxlVmVuZG9yU3RhcnRVbnVzZWQgPSAweDdGMDAwMDAwLCAvKio8IFJlc2VydmVkIHJlZ2lvbiBmb3IgaW50cm9kdWNpbmcgVmVuZG9yIEV4dGVuc2lvbnMgKi8KKyAgT01YX0FVRElPX1dNQVByb2ZpbGVNYXggPSAweDdGRkZGRkZGCit9IE9NWF9BVURJT19XTUFQUk9GSUxFVFlQRTsKKworCisvKiogV01BIHBhcmFtcyAqLwordHlwZWRlZiBzdHJ1Y3QgT01YX0FVRElPX1BBUkFNX1dNQVRZUEUgeworICAgIE9NWF9VMzIgblNpemU7ICAgICAgICAgICAgLyoqPCBzaXplIG9mIHRoZSBzdHJ1Y3R1cmUgaW4gYnl0ZXMgKi8KKyAgICBPTVhfVkVSU0lPTlRZUEUgblZlcnNpb247IC8qKjwgT01YIHNwZWNpZmljYXRpb24gdmVyc2lvbiBpbmZvcm1hdGlvbiAqLworICAgIE9NWF9VMzIgblBvcnRJbmRleDsgICAgICAgLyoqPCBwb3J0IHRoYXQgdGhpcyBzdHJ1Y3R1cmUgYXBwbGllcyB0byAqLworICAgIE9NWF9VMTYgbkNoYW5uZWxzOyAgICAgICAgLyoqPCBOdW1iZXIgb2YgY2hhbm5lbHMgKi8KKyAgICBPTVhfVTMyIG5CaXRSYXRlOyAgICAgICAgIC8qKjwgQml0IHJhdGUgb2YgdGhlIGlucHV0IGRhdGEuICBVc2UgMCBmb3IgdmFyaWFibGUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmF0ZSBvciB1bmtub3duIGJpdCByYXRlcyAqLworICAgIE9NWF9BVURJT19XTUFGT1JNQVRUWVBFIGVGb3JtYXQ7IC8qKjwgVmVyc2lvbiBvZiBXTUEgc3RyZWFtIC8gZGF0YSAqLworCU9NWF9BVURJT19XTUFQUk9GSUxFVFlQRSBlUHJvZmlsZTsgIC8qKjwgUHJvZmlsZSBvZiBXTUEgc3RyZWFtIC8gZGF0YSAqLworICAgIE9NWF9VMzIgblNhbXBsaW5nUmF0ZTsgICAgLyoqPCBTYW1wbGluZyByYXRlIG9mIHRoZSBzb3VyY2UgZGF0YSAqLworICAgIE9NWF9VMTYgbkJsb2NrQWxpZ247ICAgICAgLyoqPCBpcyB0aGUgYmxvY2sgYWxpZ25tZW50LCBvciBibG9jayBzaXplLCBpbiBieXRlcyBvZiB0aGUgYXVkaW8gY29kZWMgKi8KKyAgICBPTVhfVTE2IG5FbmNvZGVPcHRpb25zOyAgIC8qKjwgV01BIFR5cGUtc3BlY2lmaWMgZGF0YSAqLworICAgIE9NWF9VMzIgblN1cGVyQmxvY2tBbGlnbjsgLyoqPCBXTUEgVHlwZS1zcGVjaWZpYyBkYXRhICovCit9IE9NWF9BVURJT19QQVJBTV9XTUFUWVBFOworCisvKiogCisgKiBSZWFsQXVkaW8gZm9ybWF0CisgKi8KK3R5cGVkZWYgZW51bSBPTVhfQVVESU9fUkFGT1JNQVRUWVBFIHsKKyAgICBPTVhfQVVESU9fUkFGb3JtYXRVbnVzZWQgPSAwLCAvKio8IEZvcm1hdCB1bnVzZWQgb3IgdW5rbm93biAqLworICAgIE9NWF9BVURJT19SQTgsICAgICAgICAgICAgICAgIC8qKjwgUmVhbEF1ZGlvIDggY29kZWMgKi8KKyAgICBPTVhfQVVESU9fUkE5LCAgICAgICAgICAgICAgICAvKio8IFJlYWxBdWRpbyA5IGNvZGVjICovCisgICAgT01YX0FVRElPX1JBMTBfQUFDLCAgICAgICAgICAgLyoqPCBNUEVHLTQgQUFDIGNvZGVjIGZvciBiaXRyYXRlcyBvZiBtb3JlIHRoYW4gMTI4a2JwcyAqLworICAgIE9NWF9BVURJT19SQTEwX0NPREVDLCAgICAgICAgIC8qKjwgUmVhbEF1ZGlvIGNvZGVjIGZvciBiaXRyYXRlcyBsZXNzIHRoYW4gMTI4IGticHMgKi8KKyAgICBPTVhfQVVESU9fUkExMF9MT1NTTEVTUywgICAgICAvKio8IFJlYWxBdWRpbyBMb3NzbGVzcyAqLworICAgIE9NWF9BVURJT19SQTEwX01VTFRJQ0hBTk5FTCwgIC8qKjwgUmVhbEF1ZGlvIE11bHRpY2hhbm5lbCAqLworICAgIE9NWF9BVURJT19SQTEwX1ZPSUNFLCAgICAgICAgIC8qKjwgUmVhbEF1ZGlvIFZvaWNlIGZvciBiaXRyYXRlcyBiZWxvdyAxNSBrYnBzICovCisgICAgT01YX0FVRElPX1JBRm9ybWF0S2hyb25vc0V4dGVuc2lvbnMgPSAweDZGMDAwMDAwLCAvKio8IFJlc2VydmVkIHJlZ2lvbiBmb3IgaW50cm9kdWNpbmcgS2hyb25vcyBTdGFuZGFyZCBFeHRlbnNpb25zICovIAorICAgIE9NWF9BVURJT19SQUZvcm1hdFZlbmRvclN0YXJ0VW51c2VkID0gMHg3RjAwMDAwMCwgLyoqPCBSZXNlcnZlZCByZWdpb24gZm9yIGludHJvZHVjaW5nIFZlbmRvciBFeHRlbnNpb25zICovCisgICAgT01YX1ZJREVPX1JBRm9ybWF0TWF4ID0gMHg3RkZGRkZGRgorfSBPTVhfQVVESU9fUkFGT1JNQVRUWVBFOworCisvKiogUkEgKFJlYWwgQXVkaW8pIHBhcmFtcyAqLyAKK3R5cGVkZWYgc3RydWN0IE9NWF9BVURJT19QQVJBTV9SQVRZUEUgeyAKKyAgICBPTVhfVTMyIG5TaXplOyAgICAgICAgICAgICAgLyoqPCBTaXplIG9mIHRoaXMgc3RydWN0dXJlLCBpbiBCeXRlcyAqLyAKKyAgICBPTVhfVkVSU0lPTlRZUEUgblZlcnNpb247ICAgLyoqPCBPTVggc3BlY2lmaWNhdGlvbiB2ZXJzaW9uIGluZm9ybWF0aW9uICovIAorICAgIE9NWF9VMzIgblBvcnRJbmRleDsgICAgICAgICAvKio8IFBvcnQgdGhhdCB0aGlzIHN0cnVjdHVyZSBhcHBsaWVzIHRvICovIAorICAgIE9NWF9VMzIgbkNoYW5uZWxzOyAgICAgICAgICAvKio8IE51bWJlciBvZiBjaGFubmVscyAqLyAKKyAgICBPTVhfVTMyIG5TYW1wbGluZ1JhdGU7ICAgICAgLyoqPCBpcyB0aGUgc2FtcGxpbmcgcmF0ZSBvZiB0aGUgc291cmNlIGRhdGEgKi8gCisgICAgT01YX1UzMiBuQml0c1BlckZyYW1lOyAgICAgIC8qKjwgaXMgdGhlIHZhbHVlIGZvciBiaXRzIHBlciBmcmFtZSAgKi8gCisgICAgT01YX1UzMiBuU2FtcGxlUGVyRnJhbWU7ICAgIC8qKjwgaXMgdGhlIHZhbHVlIGZvciBzYW1wbGVzIHBlciBmcmFtZSAqLyAKKyAgICBPTVhfVTMyIG5Db3VwbGluZ1F1YW50Qml0czsgLyoqPCBpcyB0aGUgbnVtYmVyIG9mIGNvdXBsaW5nIHF1YW50aXphdGlvbiBiaXRzIGluIHRoZSBzdHJlYW0gKi8gCisgICAgT01YX1UzMiBuQ291cGxpbmdTdGFydFJlZ2lvbjsgICAvKio8IGlzIHRoZSBjb3VwbGluZyBzdGFydCByZWdpb24gaW4gdGhlIHN0cmVhbSAgKi8gCisgICAgT01YX1UzMiBuTnVtUmVnaW9uczsgICAgICAgIC8qKjwgaXMgdGhlIG51bWJlciBvZiByZWdpb25zIHZhbHVlICovIAorICAgIE9NWF9BVURJT19SQUZPUk1BVFRZUEUgZUZvcm1hdDsgLyoqPCBpcyB0aGUgUmVhbEF1ZGlvIGF1ZGlvIGZvcm1hdCAqLworfSBPTVhfQVVESU9fUEFSQU1fUkFUWVBFOyAKKworCisvKiogU0JDIEFsbG9jYXRpb24gTWV0aG9kIFR5cGUgKi8KK3R5cGVkZWYgZW51bSBPTVhfQVVESU9fU0JDQUxMT0NNRVRIT0RUWVBFIHsKKyAgT01YX0FVRElPX1NCQ0FsbG9jTWV0aG9kTG91ZG5lc3MsIC8qKjwgTG91ZG5lc3MgYWxsb2NhdGlvbiBtZXRob2QgKi8KKyAgT01YX0FVRElPX1NCQ0FsbG9jTWV0aG9kU05SLCAgICAgIC8qKjwgU05SIGFsbG9jYXRpb24gbWV0aG9kICovCisgIE9NWF9BVURJT19TQkNBbGxvY01ldGhvZEtocm9ub3NFeHRlbnNpb25zID0gMHg2RjAwMDAwMCwgLyoqPCBSZXNlcnZlZCByZWdpb24gZm9yIGludHJvZHVjaW5nIEtocm9ub3MgU3RhbmRhcmQgRXh0ZW5zaW9ucyAqLyAKKyAgT01YX0FVRElPX1NCQ0FsbG9jTWV0aG9kVmVuZG9yU3RhcnRVbnVzZWQgPSAweDdGMDAwMDAwLCAvKio8IFJlc2VydmVkIHJlZ2lvbiBmb3IgaW50cm9kdWNpbmcgVmVuZG9yIEV4dGVuc2lvbnMgKi8KKyAgT01YX0FVRElPX1NCQ0FsbG9jTWV0aG9kTWF4ID0gMHg3RkZGRkZGRgorfSBPTVhfQVVESU9fU0JDQUxMT0NNRVRIT0RUWVBFOworCisKKy8qKiBTQkMgcGFyYW1zICovCit0eXBlZGVmIHN0cnVjdCBPTVhfQVVESU9fUEFSQU1fU0JDVFlQRSB7CisgICAgT01YX1UzMiBuU2l6ZTsgICAgICAgICAgICAgLyoqPCBzaXplIG9mIHRoZSBzdHJ1Y3R1cmUgaW4gYnl0ZXMgKi8KKyAgICBPTVhfVkVSU0lPTlRZUEUgblZlcnNpb247ICAvKio8IE9NWCBzcGVjaWZpY2F0aW9uIHZlcnNpb24gaW5mb3JtYXRpb24gKi8KKyAgICBPTVhfVTMyIG5Qb3J0SW5kZXg7ICAgICAgICAvKio8IHBvcnQgdGhhdCB0aGlzIHN0cnVjdHVyZSBhcHBsaWVzIHRvICovCisgICAgT01YX1UzMiBuQ2hhbm5lbHM7ICAgICAgICAgLyoqPCBOdW1iZXIgb2YgY2hhbm5lbHMgKi8KKyAgICBPTVhfVTMyIG5CaXRSYXRlOyAgICAgICAgICAvKio8IEJpdCByYXRlIG9mIHRoZSBpbnB1dCBkYXRhLiAgVXNlIDAgZm9yIHZhcmlhYmxlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByYXRlIG9yIHVua25vd24gYml0IHJhdGVzICovCisgICAgT01YX1UzMiBuU2FtcGxlUmF0ZTsgICAgICAgLyoqPCBTYW1wbGluZyByYXRlIG9mIHRoZSBzb3VyY2UgZGF0YS4gIFVzZSAwIGZvcgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyaWFibGUgb3IgdW5rbm93biBzYW1wbGluZyByYXRlLiAqLworICAgIE9NWF9VMzIgbkJsb2NrczsgICAgICAgICAgIC8qKjwgTnVtYmVyIG9mIGJsb2NrcyAqLworICAgIE9NWF9VMzIgblN1YmJhbmRzOyAgICAgICAgIC8qKjwgTnVtYmVyIG9mIHN1YmJhbmRzICovCisgICAgT01YX1UzMiBuQml0UG9vbDsgICAgICAgICAgLyoqPCBCaXRwb29sIHZhbHVlICovCisgICAgT01YX0JPT0wgYkVuYWJsZUJpdHJhdGU7ICAgLyoqPCBVc2UgYml0cmF0ZSB2YWx1ZSBpbnN0ZWFkIG9mIGJpdHBvb2wgKi8KKyAgICBPTVhfQVVESU9fQ0hBTk5FTE1PREVUWVBFIGVDaGFubmVsTW9kZTsgLyoqPCBDaGFubmVsIG1vZGUgZW51bWVyYXRpb24gKi8KKyAgICBPTVhfQVVESU9fU0JDQUxMT0NNRVRIT0RUWVBFIGVTQkNBbGxvY1R5cGU7ICAgLyoqPCBTQkMgQWxsb2NhdGlvbiBtZXRob2QgdHlwZSAqLworfSBPTVhfQVVESU9fUEFSQU1fU0JDVFlQRTsKKworCisvKiogQURQQ00gc3RyZWFtIGZvcm1hdCBwYXJhbWV0ZXJzICovIAordHlwZWRlZiBzdHJ1Y3QgT01YX0FVRElPX1BBUkFNX0FEUENNVFlQRSB7IAorICAgIE9NWF9VMzIgblNpemU7ICAgICAgICAgICAgICAvKio8IHNpemUgb2YgdGhlIHN0cnVjdHVyZSBpbiBieXRlcyAqLyAKKyAgICBPTVhfVkVSU0lPTlRZUEUgblZlcnNpb247ICAgLyoqPCBPTVggc3BlY2lmaWNhdGlvbiB2ZXJzaW9uIGluZm9ybWF0aW9uICovIAorICAgIE9NWF9VMzIgblBvcnRJbmRleDsgICAgICAgICAvKio8IHBvcnQgdGhhdCB0aGlzIHN0cnVjdHVyZSBhcHBsaWVzIHRvICovIAorICAgIE9NWF9VMzIgbkNoYW5uZWxzOyAgICAgICAgICAvKio8IE51bWJlciBvZiBjaGFubmVscyBpbiB0aGUgZGF0YSBzdHJlYW0gKG5vdCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZWNlc3NhcmlseSB0aGUgc2FtZSBhcyB0aGUgbnVtYmVyIG9mIGNoYW5uZWxzIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRvIGJlIHJlbmRlcmVkLiAqLyAKKyAgICBPTVhfVTMyIG5CaXRzUGVyU2FtcGxlOyAgICAgLyoqPCBOdW1iZXIgb2YgYml0cyBpbiBlYWNoIHNhbXBsZSAqLyAKKyAgICBPTVhfVTMyIG5TYW1wbGVSYXRlOyAgICAgICAgLyoqPCBTYW1wbGluZyByYXRlIG9mIHRoZSBzb3VyY2UgZGF0YS4gIFVzZSAwIGZvciAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhcmlhYmxlIG9yIHVua25vd24gc2FtcGxpbmcgcmF0ZS4gKi8gCit9IE9NWF9BVURJT19QQVJBTV9BRFBDTVRZUEU7IAorCisKKy8qKiBHNzIzIHJhdGUgKi8KK3R5cGVkZWYgZW51bSBPTVhfQVVESU9fRzcyM1JBVEUgeworICAgIE9NWF9BVURJT19HNzIzTW9kZVVudXNlZCA9IDAsICAvKio8IEFNUk5CIE1vZGUgdW51c2VkIC8gdW5rbm93biAqLworICAgIE9NWF9BVURJT19HNzIzTW9kZUxvdywgICAgICAgICAvKio8IDUzMDAgYnBzICovCisgICAgT01YX0FVRElPX0c3MjNNb2RlSGlnaCwgICAgICAgIC8qKjwgNjMwMCBicHMgKi8KKyAgICBPTVhfQVVESU9fRzcyM01vZGVLaHJvbm9zRXh0ZW5zaW9ucyA9IDB4NkYwMDAwMDAsIC8qKjwgUmVzZXJ2ZWQgcmVnaW9uIGZvciBpbnRyb2R1Y2luZyBLaHJvbm9zIFN0YW5kYXJkIEV4dGVuc2lvbnMgKi8gCisgICAgT01YX0FVRElPX0c3MjNNb2RlVmVuZG9yU3RhcnRVbnVzZWQgPSAweDdGMDAwMDAwLCAvKio8IFJlc2VydmVkIHJlZ2lvbiBmb3IgaW50cm9kdWNpbmcgVmVuZG9yIEV4dGVuc2lvbnMgKi8KKyAgICBPTVhfQVVESU9fRzcyM01vZGVNYXggPSAweDdGRkZGRkZGCit9IE9NWF9BVURJT19HNzIzUkFURTsKKworCisvKiogRzcyMyAtIFNhbXBsZSByYXRlIG11c3QgYmUgOCBLSHogKi8KK3R5cGVkZWYgc3RydWN0IE9NWF9BVURJT19QQVJBTV9HNzIzVFlQRSB7IAorICAgIE9NWF9VMzIgblNpemU7ICAgICAgICAgICAgICAgIC8qKjwgc2l6ZSBvZiB0aGUgc3RydWN0dXJlIGluIGJ5dGVzICovIAorICAgIE9NWF9WRVJTSU9OVFlQRSBuVmVyc2lvbjsgICAgIC8qKjwgT01YIHNwZWNpZmljYXRpb24gdmVyc2lvbiBpbmZvcm1hdGlvbiAqLyAKKyAgICBPTVhfVTMyIG5Qb3J0SW5kZXg7ICAgICAgICAgICAvKio8IHBvcnQgdGhhdCB0aGlzIHN0cnVjdHVyZSBhcHBsaWVzIHRvICovIAorICAgIE9NWF9VMzIgbkNoYW5uZWxzOyAgICAgICAgICAgIC8qKjwgTnVtYmVyIG9mIGNoYW5uZWxzIGluIHRoZSBkYXRhIHN0cmVhbSAobm90IAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmVjZXNzYXJpbHkgdGhlIHNhbWUgYXMgdGhlIG51bWJlciBvZiBjaGFubmVscyAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRvIGJlIHJlbmRlcmVkLiAqLyAKKyAgICBPTVhfQk9PTCBiRFRYOyAgICAgICAgICAgICAgICAvKio8IEVuYWJsZSBEaXNjb250aW51b3VzIFRyYW5zbWlzc3Npb24gKi8gCisgICAgT01YX0FVRElPX0c3MjNSQVRFIGVCaXRSYXRlOyAgLyoqPCB0b2RvOiBTaG91bGQgdGhpcyBiZSBtb3ZlZCB0byBhIGNvbmZpZz8gKi8KKyAgICBPTVhfQk9PTCBiSGlQYXNzRmlsdGVyOyAgICAgICAvKio8IEVuYWJsZSBIaWdoIFBhc3MgRmlsdGVyICovIAorICAgIE9NWF9CT09MIGJQb3N0RmlsdGVyOyAgICAgICAgIC8qKjwgRW5hYmxlIFBvc3QgRmlsdGVyICovIAorfSBPTVhfQVVESU9fUEFSQU1fRzcyM1RZUEU7IAorCisKKy8qKiBJVFUgRzcyNiAoQURQQ00pIHJhdGUgKi8KK3R5cGVkZWYgZW51bSBPTVhfQVVESU9fRzcyNk1PREUgeworICAgIE9NWF9BVURJT19HNzI2TW9kZVVudXNlZCA9IDAsICAvKio8IEc3MjYgTW9kZSB1bnVzZWQgLyB1bmtub3duICovCisgICAgT01YX0FVRElPX0c3MjZNb2RlMTYsICAgICAgICAgIC8qKjwgMTYga2JwcyAqLworICAgIE9NWF9BVURJT19HNzI2TW9kZTI0LCAgICAgICAgICAvKio8IDI0IGticHMgKi8KKyAgICBPTVhfQVVESU9fRzcyNk1vZGUzMiwgICAgICAgICAgLyoqPCAzMiBrYnBzLCBtb3N0IGNvbW1vbiByYXRlLCBhbHNvIEc3MjEgKi8KKyAgICBPTVhfQVVESU9fRzcyNk1vZGU0MCwgICAgICAgICAgLyoqPCA0MCBrYnBzICovCisgICAgT01YX0FVRElPX0c3MjZNb2RlS2hyb25vc0V4dGVuc2lvbnMgPSAweDZGMDAwMDAwLCAvKio8IFJlc2VydmVkIHJlZ2lvbiBmb3IgaW50cm9kdWNpbmcgS2hyb25vcyBTdGFuZGFyZCBFeHRlbnNpb25zICovIAorICAgIE9NWF9BVURJT19HNzI2TW9kZVZlbmRvclN0YXJ0VW51c2VkID0gMHg3RjAwMDAwMCwgLyoqPCBSZXNlcnZlZCByZWdpb24gZm9yIGludHJvZHVjaW5nIFZlbmRvciBFeHRlbnNpb25zICovCisgICAgT01YX0FVRElPX0c3MjZNb2RlTWF4ID0gMHg3RkZGRkZGRgorfSBPTVhfQVVESU9fRzcyNk1PREU7CisKKworLyoqIEcuNzI2IHN0cmVhbSBmb3JtYXQgcGFyYW1ldGVycyAtIG11c3QgYmUgYXQgOEtIeiAqLyAKK3R5cGVkZWYgc3RydWN0IE9NWF9BVURJT19QQVJBTV9HNzI2VFlQRSB7IAorICAgIE9NWF9VMzIgblNpemU7ICAgICAgICAgICAgICAvKio8IHNpemUgb2YgdGhlIHN0cnVjdHVyZSBpbiBieXRlcyAqLyAKKyAgICBPTVhfVkVSU0lPTlRZUEUgblZlcnNpb247ICAgLyoqPCBPTVggc3BlY2lmaWNhdGlvbiB2ZXJzaW9uIGluZm9ybWF0aW9uICovIAorICAgIE9NWF9VMzIgblBvcnRJbmRleDsgICAgICAgICAvKio8IHBvcnQgdGhhdCB0aGlzIHN0cnVjdHVyZSBhcHBsaWVzIHRvICovIAorICAgIE9NWF9VMzIgbkNoYW5uZWxzOyAgICAgICAgICAvKio8IE51bWJlciBvZiBjaGFubmVscyBpbiB0aGUgZGF0YSBzdHJlYW0gKG5vdCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZWNlc3NhcmlseSB0aGUgc2FtZSBhcyB0aGUgbnVtYmVyIG9mIGNoYW5uZWxzIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRvIGJlIHJlbmRlcmVkLiAqLyAKKyAgICAgT01YX0FVRElPX0c3MjZNT0RFIGVHNzI2TW9kZTsKK30gT01YX0FVRElPX1BBUkFNX0c3MjZUWVBFOyAKKworCisvKiogRzcyOSBjb2RlciB0eXBlICovCit0eXBlZGVmIGVudW0gT01YX0FVRElPX0c3MjlUWVBFIHsKKyAgICBPTVhfQVVESU9fRzcyOSA9IDAsICAgICAgICAgICAvKio8IElUVSBHLjcyOSAgZW5jb2RlZCBkYXRhICovCisgICAgT01YX0FVRElPX0c3MjlBLCAgICAgICAgICAgICAgLyoqPCBJVFUgRy43MjkgYW5uZXggQSAgZW5jb2RlZCBkYXRhICovCisgICAgT01YX0FVRElPX0c3MjlCLCAgICAgICAgICAgICAgLyoqPCBJVFUgRy43Mjkgd2l0aCBhbm5leCBCIGVuY29kZWQgZGF0YSAqLworICAgIE9NWF9BVURJT19HNzI5QUIsICAgICAgICAgICAgIC8qKjwgSVRVIEcuNzI5IGFubmV4ZXMgQSBhbmQgQiBlbmNvZGVkIGRhdGEgKi8KKyAgICBPTVhfQVVESU9fRzcyOUtocm9ub3NFeHRlbnNpb25zID0gMHg2RjAwMDAwMCwgLyoqPCBSZXNlcnZlZCByZWdpb24gZm9yIGludHJvZHVjaW5nIEtocm9ub3MgU3RhbmRhcmQgRXh0ZW5zaW9ucyAqLyAKKyAgICBPTVhfQVVESU9fRzcyOVZlbmRvclN0YXJ0VW51c2VkID0gMHg3RjAwMDAwMCwgLyoqPCBSZXNlcnZlZCByZWdpb24gZm9yIGludHJvZHVjaW5nIFZlbmRvciBFeHRlbnNpb25zICovCisgICAgT01YX0FVRElPX0c3MjlNYXggPSAweDdGRkZGRkZGCit9IE9NWF9BVURJT19HNzI5VFlQRTsKKworCisvKiogRzcyOSBzdHJlYW0gZm9ybWF0IHBhcmFtZXRlcnMgLSBmaXhlZCA2S0h6IHNhbXBsZSByYXRlICovCit0eXBlZGVmIHN0cnVjdCBPTVhfQVVESU9fUEFSQU1fRzcyOVRZUEUgeworICAgIE9NWF9VMzIgblNpemU7ICAgICAgICAgICAgLyoqPCBzaXplIG9mIHRoZSBzdHJ1Y3R1cmUgaW4gYnl0ZXMgKi8KKyAgICBPTVhfVkVSU0lPTlRZUEUgblZlcnNpb247IC8qKjwgT01YIHNwZWNpZmljYXRpb24gdmVyc2lvbiBpbmZvcm1hdGlvbiAqLworICAgIE9NWF9VMzIgblBvcnRJbmRleDsgICAgICAgLyoqPCBwb3J0IHRoYXQgdGhpcyBzdHJ1Y3R1cmUgYXBwbGllcyB0byAqLworICAgIE9NWF9VMzIgbkNoYW5uZWxzOyAgICAgICAgLyoqPCBOdW1iZXIgb2YgY2hhbm5lbHMgaW4gdGhlIGRhdGEgc3RyZWFtIChub3QKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmVjZXNzYXJpbHkgdGhlIHNhbWUgYXMgdGhlIG51bWJlciBvZiBjaGFubmVscworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0byBiZSByZW5kZXJlZC4gKi8KKyAgICBPTVhfQk9PTCBiRFRYOyAgICAgICAgICAgIC8qKjwgRW5hYmxlIERpc2NvbnRpbnVvdXMgVHJhbnNtaXNzc2lvbiAqLworICAgIE9NWF9BVURJT19HNzI5VFlQRSBlQml0VHlwZTsKK30gT01YX0FVRElPX1BBUkFNX0c3MjlUWVBFOworCisKKy8qKiBBTVIgRnJhbWUgZm9ybWF0ICovIAordHlwZWRlZiBlbnVtIE9NWF9BVURJT19BTVJGUkFNRUZPUk1BVFRZUEUgeyAKKyAgICBPTVhfQVVESU9fQU1SRnJhbWVGb3JtYXRDb25mb3JtYW5jZSA9IDAsICAvKio8IEZyYW1lIEZvcm1hdCBpcyBBTVIgQ29uZm9ybWFuY2UgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoU3RhbmRhcmQpIEZvcm1hdCAqLyAKKyAgICBPTVhfQVVESU9fQU1SRnJhbWVGb3JtYXRJRjEsICAgICAgICAgICAgICAvKio8IEZyYW1lIEZvcm1hdCBpcyBBTVIgSW50ZXJmYWNlIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRm9ybWF0IDEgKi8gCisgICAgT01YX0FVRElPX0FNUkZyYW1lRm9ybWF0SUYyLCAgICAgICAgICAgICAgLyoqPCBGcmFtZSBGb3JtYXQgaXMgQU1SIEludGVyZmFjZSAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZvcm1hdCAyKi8gCisgICAgT01YX0FVRElPX0FNUkZyYW1lRm9ybWF0RlNGLCAgICAgICAgICAgICAgLyoqPCBGcmFtZSBGb3JtYXQgaXMgQU1SIEZpbGUgU3RvcmFnZSAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZvcm1hdCAqLyAKKyAgICBPTVhfQVVESU9fQU1SRnJhbWVGb3JtYXRSVFBQYXlsb2FkLCAgICAgICAvKio8IEZyYW1lIEZvcm1hdCBpcyBBTVIgUmVhbC1UaW1lIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVHJhbnNwb3J0IFByb3RvY29sIFBheWxvYWQgRm9ybWF0ICovIAorICAgIE9NWF9BVURJT19BTVJGcmFtZUZvcm1hdElUVSwgICAgICAgICAgICAgIC8qKjwgRnJhbWUgRm9ybWF0IGlzIElUVSBGb3JtYXQgKGFkZGVkIGF0IE1vdG9yb2xhIHJlcXVlc3QpICovIAorICAgIE9NWF9BVURJT19BTVJGcmFtZUZvcm1hdEtocm9ub3NFeHRlbnNpb25zID0gMHg2RjAwMDAwMCwgLyoqPCBSZXNlcnZlZCByZWdpb24gZm9yIGludHJvZHVjaW5nIEtocm9ub3MgU3RhbmRhcmQgRXh0ZW5zaW9ucyAqLyAKKyAgICBPTVhfQVVESU9fQU1SRnJhbWVGb3JtYXRWZW5kb3JTdGFydFVudXNlZCA9IDB4N0YwMDAwMDAsIC8qKjwgUmVzZXJ2ZWQgcmVnaW9uIGZvciBpbnRyb2R1Y2luZyBWZW5kb3IgRXh0ZW5zaW9ucyAqLworICAgIE9NWF9BVURJT19BTVJGcmFtZUZvcm1hdE1heCA9IDB4N0ZGRkZGRkYgCit9IE9NWF9BVURJT19BTVJGUkFNRUZPUk1BVFRZUEU7IAorCisKKy8qKiBBTVIgYmFuZCBtb2RlICovCit0eXBlZGVmIGVudW0gT01YX0FVRElPX0FNUkJBTkRNT0RFVFlQRSB7CisgICAgT01YX0FVRElPX0FNUkJhbmRNb2RlVW51c2VkID0gMCwgICAgICAgICAgLyoqPCBBTVJOQiBNb2RlIHVudXNlZCAvIHVua25vd24gKi8KKyAgICBPTVhfQVVESU9fQU1SQmFuZE1vZGVOQjAsICAgICAgICAgICAgICAgICAvKio8IEFNUk5CIE1vZGUgMCA9ICA0NzUwIGJwcyAqLworICAgIE9NWF9BVURJT19BTVJCYW5kTW9kZU5CMSwgICAgICAgICAgICAgICAgIC8qKjwgQU1STkIgTW9kZSAxID0gIDUxNTAgYnBzICovCisgICAgT01YX0FVRElPX0FNUkJhbmRNb2RlTkIyLCAgICAgICAgICAgICAgICAgLyoqPCBBTVJOQiBNb2RlIDIgPSAgNTkwMCBicHMgKi8gCisgICAgT01YX0FVRElPX0FNUkJhbmRNb2RlTkIzLCAgICAgICAgICAgICAgICAgLyoqPCBBTVJOQiBNb2RlIDMgPSAgNjcwMCBicHMgKi8KKyAgICBPTVhfQVVESU9fQU1SQmFuZE1vZGVOQjQsICAgICAgICAgICAgICAgICAvKio8IEFNUk5CIE1vZGUgNCA9ICA3NDAwIGJwcyAqLworICAgIE9NWF9BVURJT19BTVJCYW5kTW9kZU5CNSwgICAgICAgICAgICAgICAgIC8qKjwgQU1STkIgTW9kZSA1ID0gIDc5NTAgYnBzICovCisgICAgT01YX0FVRElPX0FNUkJhbmRNb2RlTkI2LCAgICAgICAgICAgICAgICAgLyoqPCBBTVJOQiBNb2RlIDYgPSAxMDIwMCBicHMgKi8KKyAgICBPTVhfQVVESU9fQU1SQmFuZE1vZGVOQjcsICAgICAgICAgICAgICAgICAvKio8IEFNUk5CIE1vZGUgNyA9IDEyMjAwIGJwcyAqLworICAgIE9NWF9BVURJT19BTVJCYW5kTW9kZVdCMCwgICAgICAgICAgICAgICAgIC8qKjwgQU1SV0IgTW9kZSAwID0gIDY2MDAgYnBzICovCisgICAgT01YX0FVRElPX0FNUkJhbmRNb2RlV0IxLCAgICAgICAgICAgICAgICAgLyoqPCBBTVJXQiBNb2RlIDEgPSAgODg1MCBicHMgKi8KKyAgICBPTVhfQVVESU9fQU1SQmFuZE1vZGVXQjIsICAgICAgICAgICAgICAgICAvKio8IEFNUldCIE1vZGUgMiA9IDEyNjUwIGJwcyAqLyAKKyAgICBPTVhfQVVESU9fQU1SQmFuZE1vZGVXQjMsICAgICAgICAgICAgICAgICAvKio8IEFNUldCIE1vZGUgMyA9IDE0MjUwIGJwcyAqLyAKKyAgICBPTVhfQVVESU9fQU1SQmFuZE1vZGVXQjQsICAgICAgICAgICAgICAgICAvKio8IEFNUldCIE1vZGUgNCA9IDE1ODUwIGJwcyAqLworICAgIE9NWF9BVURJT19BTVJCYW5kTW9kZVdCNSwgICAgICAgICAgICAgICAgIC8qKjwgQU1SV0IgTW9kZSA1ID0gMTgyNTAgYnBzICovCisgICAgT01YX0FVRElPX0FNUkJhbmRNb2RlV0I2LCAgICAgICAgICAgICAgICAgLyoqPCBBTVJXQiBNb2RlIDYgPSAxOTg1MCBicHMgKi8KKyAgICBPTVhfQVVESU9fQU1SQmFuZE1vZGVXQjcsICAgICAgICAgICAgICAgICAvKio8IEFNUldCIE1vZGUgNyA9IDIzMDUwIGJwcyAqLworICAgIE9NWF9BVURJT19BTVJCYW5kTW9kZVdCOCwgICAgICAgICAgICAgICAgIC8qKjwgQU1SV0IgTW9kZSA4ID0gMjM4NTAgYnBzICovICAgICAgCisgICAgT01YX0FVRElPX0FNUkJhbmRNb2RlS2hyb25vc0V4dGVuc2lvbnMgPSAweDZGMDAwMDAwLCAvKio8IFJlc2VydmVkIHJlZ2lvbiBmb3IgaW50cm9kdWNpbmcgS2hyb25vcyBTdGFuZGFyZCBFeHRlbnNpb25zICovIAorICAgIE9NWF9BVURJT19BTVJCYW5kTW9kZVZlbmRvclN0YXJ0VW51c2VkID0gMHg3RjAwMDAwMCwgLyoqPCBSZXNlcnZlZCByZWdpb24gZm9yIGludHJvZHVjaW5nIFZlbmRvciBFeHRlbnNpb25zICovCisgICAgT01YX0FVRElPX0FNUkJhbmRNb2RlTWF4ID0gMHg3RkZGRkZGRgorfSBPTVhfQVVESU9fQU1SQkFORE1PREVUWVBFOworICAgICAKKworLyoqIEFNUiBEaXNjb250aW51b3VzIFRyYW5zbWlzc2lvbiBtb2RlICovIAordHlwZWRlZiBlbnVtIE9NWF9BVURJT19BTVJEVFhNT0RFVFlQRSB7IAorICAgIE9NWF9BVURJT19BTVJEVFhNb2RlT2ZmID0gMCwgICAgICAgIC8qKjwgQU1SIERpc2NvbnRpbnVvdXMgVHJhbnNtaXNzaW9uIE1vZGUgaXMgZGlzYWJsZWQgKi8gCisgICAgT01YX0FVRElPX0FNUkRUWE1vZGVPblZBRDEsICAgICAgICAgLyoqPCBBTVIgRGlzY29udGludW91cyBUcmFuc21pc3Npb24gTW9kZSB1c2luZyAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZvaWNlIEFjdGl2aXR5IERldGVjdG9yIDEgKFZBRDEpIGlzIGVuYWJsZWQgKi8gCisgICAgT01YX0FVRElPX0FNUkRUWE1vZGVPblZBRDIsICAgICAgICAgLyoqPCBBTVIgRGlzY29udGludW91cyBUcmFuc21pc3Npb24gTW9kZSB1c2luZyAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZvaWNlIEFjdGl2aXR5IERldGVjdG9yIDIgKFZBRDIpIGlzIGVuYWJsZWQgKi8gICAgICAgCisgICAgT01YX0FVRElPX0FNUkRUWE1vZGVPbkF1dG8sICAgICAgICAgLyoqPCBUaGUgY29kZWMgd2lsbCBhdXRvbWF0aWNhbGx5IHNlbGVjdCBiZXR3ZWVuIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT2ZmLCBWQUQxIG9yIFZBRDIgbW9kZXMgKi8gCisKKyAgICBPTVhfQVVESU9fQU1SRFRYYXNFRlIsICAgICAgICAgICAgIC8qKjwgRFRYIGFzIEVGUiBpbnN0ZWFkIG9mIEFNUiBzdGFuZGFyZCAoM0dQUCAyNi4xMDEsIGZyYW1lIHR5cGUgPTgsOSwxMCkgKi8KKworICAgIE9NWF9BVURJT19BTVJEVFhNb2RlS2hyb25vc0V4dGVuc2lvbnMgPSAweDZGMDAwMDAwLCAvKio8IFJlc2VydmVkIHJlZ2lvbiBmb3IgaW50cm9kdWNpbmcgS2hyb25vcyBTdGFuZGFyZCBFeHRlbnNpb25zICovIAorICAgIE9NWF9BVURJT19BTVJEVFhNb2RlVmVuZG9yU3RhcnRVbnVzZWQgPSAweDdGMDAwMDAwLCAvKio8IFJlc2VydmVkIHJlZ2lvbiBmb3IgaW50cm9kdWNpbmcgVmVuZG9yIEV4dGVuc2lvbnMgKi8KKyAgICBPTVhfQVVESU9fQU1SRFRYTW9kZU1heCA9IDB4N0ZGRkZGRkYgCit9IE9NWF9BVURJT19BTVJEVFhNT0RFVFlQRTsgCisgCisKKy8qKiBBTVIgcGFyYW1zICovCit0eXBlZGVmIHN0cnVjdCBPTVhfQVVESU9fUEFSQU1fQU1SVFlQRSB7CisgICAgT01YX1UzMiBuU2l6ZTsgICAgICAgICAgICAgICAgICAgICAgICAgIC8qKjwgc2l6ZSBvZiB0aGUgc3RydWN0dXJlIGluIGJ5dGVzICovCisgICAgT01YX1ZFUlNJT05UWVBFIG5WZXJzaW9uOyAgICAgICAgICAgICAgIC8qKjwgT01YIHNwZWNpZmljYXRpb24gdmVyc2lvbiBpbmZvcm1hdGlvbiAqLworICAgIE9NWF9VMzIgblBvcnRJbmRleDsgICAgICAgICAgICAgICAgICAgICAvKio8IHBvcnQgdGhhdCB0aGlzIHN0cnVjdHVyZSBhcHBsaWVzIHRvICovCisgICAgT01YX1UzMiBuQ2hhbm5lbHM7ICAgICAgICAgICAgICAgICAgICAgIC8qKjwgTnVtYmVyIG9mIGNoYW5uZWxzICovCisgICAgT01YX1UzMiBuQml0UmF0ZTsgICAgICAgICAgICAgICAgICAgICAgIC8qKjwgQml0IHJhdGUgcmVhZCBvbmx5IGZpZWxkICovCisgICAgT01YX0FVRElPX0FNUkJBTkRNT0RFVFlQRSBlQU1SQmFuZE1vZGU7IC8qKjwgQU1SIEJhbmQgTW9kZSBlbnVtZXJhdGlvbiAqLyAKKyAgICBPTVhfQVVESU9fQU1SRFRYTU9ERVRZUEUgIGVBTVJEVFhNb2RlOyAgLyoqPCBBTVIgRFRYIE1vZGUgZW51bWVyYXRpb24gKi8KKyAgICBPTVhfQVVESU9fQU1SRlJBTUVGT1JNQVRUWVBFIGVBTVJGcmFtZUZvcm1hdDsgLyoqPCBBTVIgZnJhbWUgZm9ybWF0IGVudW1lcmF0aW9uICovCit9IE9NWF9BVURJT19QQVJBTV9BTVJUWVBFOworCisKKy8qKiBHU01fRlIgKEVUU0kgMDYuMTAsIDNHUFAgNDYuMDEwKSBzdHJlYW0gZm9ybWF0IHBhcmFtZXRlcnMgKi8KK3R5cGVkZWYgc3RydWN0IE9NWF9BVURJT19QQVJBTV9HU01GUlRZUEUgeworICAgIE9NWF9VMzIgblNpemU7ICAgICAgICAgICAgLyoqPCBzaXplIG9mIHRoZSBzdHJ1Y3R1cmUgaW4gYnl0ZXMgKi8KKyAgICBPTVhfVkVSU0lPTlRZUEUgblZlcnNpb247IC8qKjwgT01YIHNwZWNpZmljYXRpb24gdmVyc2lvbiBpbmZvcm1hdGlvbiAqLworICAgIE9NWF9VMzIgblBvcnRJbmRleDsgICAgICAgLyoqPCBwb3J0IHRoYXQgdGhpcyBzdHJ1Y3R1cmUgYXBwbGllcyB0byAqLworICAgIE9NWF9CT09MIGJEVFg7ICAgICAgICAgICAgLyoqPCBFbmFibGUgRGlzY29udGludW91cyBUcmFuc21pc3NzaW9uICovCisgICAgT01YX0JPT0wgYkhpUGFzc0ZpbHRlcjsgICAvKio8IEVuYWJsZSBIaWdoIFBhc3MgRmlsdGVyICovCit9IE9NWF9BVURJT19QQVJBTV9HU01GUlRZUEU7CisKKworLyoqIEdTTS1IUiAoRVRTSSAwNi4yMCwgM0dQUCA0Ni4wMjApIHN0cmVhbSBmb3JtYXQgcGFyYW1ldGVycyAqLwordHlwZWRlZiBzdHJ1Y3QgT01YX0FVRElPX1BBUkFNX0dTTUhSVFlQRSB7CisgICAgT01YX1UzMiBuU2l6ZTsgICAgICAgICAgICAvKio8IHNpemUgb2YgdGhlIHN0cnVjdHVyZSBpbiBieXRlcyAqLworICAgIE9NWF9WRVJTSU9OVFlQRSBuVmVyc2lvbjsgLyoqPCBPTVggc3BlY2lmaWNhdGlvbiB2ZXJzaW9uIGluZm9ybWF0aW9uICovCisgICAgT01YX1UzMiBuUG9ydEluZGV4OyAgICAgICAvKio8IHBvcnQgdGhhdCB0aGlzIHN0cnVjdHVyZSBhcHBsaWVzIHRvICovCisgICAgT01YX0JPT0wgYkRUWDsgICAgICAgICAgICAvKio8IEVuYWJsZSBEaXNjb250aW51b3VzIFRyYW5zbWlzc3Npb24gKi8KKyAgICBPTVhfQk9PTCBiSGlQYXNzRmlsdGVyOyAgIC8qKjwgRW5hYmxlIEhpZ2ggUGFzcyBGaWx0ZXIgKi8KK30gT01YX0FVRElPX1BBUkFNX0dTTUhSVFlQRTsKKworCisvKiogR1NNLUVGUiAoRVRTSSAwNi42MCwgM0dQUCA0Ni4wNjApIHN0cmVhbSBmb3JtYXQgcGFyYW1ldGVycyAqLwordHlwZWRlZiBzdHJ1Y3QgT01YX0FVRElPX1BBUkFNX0dTTUVGUlRZUEUgeworICAgIE9NWF9VMzIgblNpemU7ICAgICAgICAgICAgLyoqPCBzaXplIG9mIHRoZSBzdHJ1Y3R1cmUgaW4gYnl0ZXMgKi8KKyAgICBPTVhfVkVSU0lPTlRZUEUgblZlcnNpb247IC8qKjwgT01YIHNwZWNpZmljYXRpb24gdmVyc2lvbiBpbmZvcm1hdGlvbiAqLworICAgIE9NWF9VMzIgblBvcnRJbmRleDsgICAgICAgLyoqPCBwb3J0IHRoYXQgdGhpcyBzdHJ1Y3R1cmUgYXBwbGllcyB0byAqLworICAgIE9NWF9CT09MIGJEVFg7ICAgICAgICAgICAgLyoqPCBFbmFibGUgRGlzY29udGludW91cyBUcmFuc21pc3NzaW9uICovCisgICAgT01YX0JPT0wgYkhpUGFzc0ZpbHRlcjsgICAvKio8IEVuYWJsZSBIaWdoIFBhc3MgRmlsdGVyICovCit9IE9NWF9BVURJT19QQVJBTV9HU01FRlJUWVBFOworCisKKy8qKiBURE1BIEZSIChUSUEvRUlBLTEzNi00MjAsIFZTRUxQIDcuOTVrYnBzIGNvZGVyKSBzdHJlYW0gZm9ybWF0IHBhcmFtZXRlcnMgKi8KK3R5cGVkZWYgc3RydWN0IE9NWF9BVURJT19QQVJBTV9URE1BRlJUWVBFIHsKKyAgICBPTVhfVTMyIG5TaXplOyAgICAgICAgICAgICAgICAvKio8IHNpemUgb2YgdGhlIHN0cnVjdHVyZSBpbiBieXRlcyAqLworICAgIE9NWF9WRVJTSU9OVFlQRSBuVmVyc2lvbjsgICAgIC8qKjwgT01YIHNwZWNpZmljYXRpb24gdmVyc2lvbiBpbmZvcm1hdGlvbiAqLworICAgIE9NWF9VMzIgblBvcnRJbmRleDsgICAgICAgICAgIC8qKjwgcG9ydCB0aGF0IHRoaXMgc3RydWN0dXJlIGFwcGxpZXMgdG8gKi8KKyAgICBPTVhfVTMyIG5DaGFubmVsczsgICAgICAgICAgICAvKio8IE51bWJlciBvZiBjaGFubmVscyBpbiB0aGUgZGF0YSBzdHJlYW0gKG5vdAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmVjZXNzYXJpbHkgdGhlIHNhbWUgYXMgdGhlIG51bWJlciBvZiBjaGFubmVscworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdG8gYmUgcmVuZGVyZWQuICovCisgICAgT01YX0JPT0wgYkRUWDsgICAgICAgICAgICAgICAgLyoqPCBFbmFibGUgRGlzY29udGludW91cyBUcmFuc21pc3NzaW9uICovCisgICAgT01YX0JPT0wgYkhpUGFzc0ZpbHRlcjsgICAgICAgLyoqPCBFbmFibGUgSGlnaCBQYXNzIEZpbHRlciAqLworfSBPTVhfQVVESU9fUEFSQU1fVERNQUZSVFlQRTsKKworCisvKiogVERNQSBFRlIgKFRJQS9FSUEtMTM2LTQxMCwgQUNFTFAgNy40a2JwcyBjb2Rlcikgc3RyZWFtIGZvcm1hdCBwYXJhbWV0ZXJzICovCit0eXBlZGVmIHN0cnVjdCBPTVhfQVVESU9fUEFSQU1fVERNQUVGUlRZUEUgeworICAgIE9NWF9VMzIgblNpemU7ICAgICAgICAgICAgICAgIC8qKjwgc2l6ZSBvZiB0aGUgc3RydWN0dXJlIGluIGJ5dGVzICovCisgICAgT01YX1ZFUlNJT05UWVBFIG5WZXJzaW9uOyAgICAgLyoqPCBPTVggc3BlY2lmaWNhdGlvbiB2ZXJzaW9uIGluZm9ybWF0aW9uICovCisgICAgT01YX1UzMiBuUG9ydEluZGV4OyAgICAgICAgICAgLyoqPCBwb3J0IHRoYXQgdGhpcyBzdHJ1Y3R1cmUgYXBwbGllcyB0byAqLworICAgIE9NWF9VMzIgbkNoYW5uZWxzOyAgICAgICAgICAgIC8qKjwgTnVtYmVyIG9mIGNoYW5uZWxzIGluIHRoZSBkYXRhIHN0cmVhbSAobm90CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZWNlc3NhcmlseSB0aGUgc2FtZSBhcyB0aGUgbnVtYmVyIG9mIGNoYW5uZWxzCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0byBiZSByZW5kZXJlZC4gKi8KKyAgICBPTVhfQk9PTCBiRFRYOyAgICAgICAgICAgICAgICAvKio8IEVuYWJsZSBEaXNjb250aW51b3VzIFRyYW5zbWlzc3Npb24gKi8KKyAgICBPTVhfQk9PTCBiSGlQYXNzRmlsdGVyOyAgICAgICAvKio8IEVuYWJsZSBIaWdoIFBhc3MgRmlsdGVyICovCit9IE9NWF9BVURJT19QQVJBTV9URE1BRUZSVFlQRTsKKworCisvKiogUERDIEZSICggUkNSLTI3LCBWU0VMUCA2LjdrYnBzIGNvZGVyKSBzdHJlYW0gZm9ybWF0IHBhcmFtZXRlcnMgKi8KK3R5cGVkZWYgc3RydWN0IE9NWF9BVURJT19QQVJBTV9QRENGUlRZUEUgeworICAgIE9NWF9VMzIgblNpemU7ICAgICAgICAgICAgICAgIC8qKjwgc2l6ZSBvZiB0aGUgc3RydWN0dXJlIGluIGJ5dGVzICovCisgICAgT01YX1ZFUlNJT05UWVBFIG5WZXJzaW9uOyAgICAgLyoqPCBPTVggc3BlY2lmaWNhdGlvbiB2ZXJzaW9uIGluZm9ybWF0aW9uICovCisgICAgT01YX1UzMiBuUG9ydEluZGV4OyAgICAgICAgICAgLyoqPCBwb3J0IHRoYXQgdGhpcyBzdHJ1Y3R1cmUgYXBwbGllcyB0byAqLworICAgIE9NWF9VMzIgbkNoYW5uZWxzOyAgICAgICAgICAgIC8qKjwgTnVtYmVyIG9mIGNoYW5uZWxzIGluIHRoZSBkYXRhIHN0cmVhbSAobm90CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZWNlc3NhcmlseSB0aGUgc2FtZSBhcyB0aGUgbnVtYmVyIG9mIGNoYW5uZWxzCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0byBiZSByZW5kZXJlZC4gKi8KKyAgICBPTVhfQk9PTCBiRFRYOyAgICAgICAgICAgICAgICAvKio8IEVuYWJsZSBEaXNjb250aW51b3VzIFRyYW5zbWlzc3Npb24gKi8KKyAgICBPTVhfQk9PTCBiSGlQYXNzRmlsdGVyOyAgICAgICAvKio8IEVuYWJsZSBIaWdoIFBhc3MgRmlsdGVyICovCit9IE9NWF9BVURJT19QQVJBTV9QRENGUlRZUEU7CisKKworLyoqIFBEQyBFRlIgKCBSQ1ItMjcsIEFDRUxQIDYuN2ticHMgY29kZXIpIHN0cmVhbSBmb3JtYXQgcGFyYW1ldGVycyAqLwordHlwZWRlZiBzdHJ1Y3QgT01YX0FVRElPX1BBUkFNX1BEQ0VGUlRZUEUgeworICAgIE9NWF9VMzIgblNpemU7ICAgICAgICAgICAgICAgIC8qKjwgc2l6ZSBvZiB0aGUgc3RydWN0dXJlIGluIGJ5dGVzICovCisgICAgT01YX1ZFUlNJT05UWVBFIG5WZXJzaW9uOyAgICAgLyoqPCBPTVggc3BlY2lmaWNhdGlvbiB2ZXJzaW9uIGluZm9ybWF0aW9uICovCisgICAgT01YX1UzMiBuUG9ydEluZGV4OyAgICAgICAgICAgLyoqPCBwb3J0IHRoYXQgdGhpcyBzdHJ1Y3R1cmUgYXBwbGllcyB0byAqLworICAgIE9NWF9VMzIgbkNoYW5uZWxzOyAgICAgICAgICAgIC8qKjwgTnVtYmVyIG9mIGNoYW5uZWxzIGluIHRoZSBkYXRhIHN0cmVhbSAobm90CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZWNlc3NhcmlseSB0aGUgc2FtZSBhcyB0aGUgbnVtYmVyIG9mIGNoYW5uZWxzCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0byBiZSByZW5kZXJlZC4gKi8KKyAgICBPTVhfQk9PTCBiRFRYOyAgICAgICAgICAgICAgICAvKio8IEVuYWJsZSBEaXNjb250aW51b3VzIFRyYW5zbWlzc3Npb24gKi8KKyAgICBPTVhfQk9PTCBiSGlQYXNzRmlsdGVyOyAgICAgICAvKio8IEVuYWJsZSBIaWdoIFBhc3MgRmlsdGVyICovCit9IE9NWF9BVURJT19QQVJBTV9QRENFRlJUWVBFOworCisvKiogUERDIEhSICggUkNSLTI3LCBQU0ktQ0VMUCAzLjQ1a2JwcyBjb2Rlcikgc3RyZWFtIGZvcm1hdCBwYXJhbWV0ZXJzICovCit0eXBlZGVmIHN0cnVjdCBPTVhfQVVESU9fUEFSQU1fUERDSFJUWVBFIHsKKyAgICBPTVhfVTMyIG5TaXplOyAgICAgICAgICAgICAgICAvKio8IHNpemUgb2YgdGhlIHN0cnVjdHVyZSBpbiBieXRlcyAqLworICAgIE9NWF9WRVJTSU9OVFlQRSBuVmVyc2lvbjsgICAgIC8qKjwgT01YIHNwZWNpZmljYXRpb24gdmVyc2lvbiBpbmZvcm1hdGlvbiAqLworICAgIE9NWF9VMzIgblBvcnRJbmRleDsgICAgICAgICAgIC8qKjwgcG9ydCB0aGF0IHRoaXMgc3RydWN0dXJlIGFwcGxpZXMgdG8gKi8KKyAgICBPTVhfVTMyIG5DaGFubmVsczsgICAgICAgICAgICAvKio8IE51bWJlciBvZiBjaGFubmVscyBpbiB0aGUgZGF0YSBzdHJlYW0gKG5vdAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmVjZXNzYXJpbHkgdGhlIHNhbWUgYXMgdGhlIG51bWJlciBvZiBjaGFubmVscworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdG8gYmUgcmVuZGVyZWQuICovCisgICAgT01YX0JPT0wgYkRUWDsgICAgICAgICAgICAgICAgLyoqPCBFbmFibGUgRGlzY29udGludW91cyBUcmFuc21pc3NzaW9uICovCisgICAgT01YX0JPT0wgYkhpUGFzc0ZpbHRlcjsgICAgICAgLyoqPCBFbmFibGUgSGlnaCBQYXNzIEZpbHRlciAqLworfSBPTVhfQVVESU9fUEFSQU1fUERDSFJUWVBFOworCisKKy8qKiBDRE1BIFJhdGUgdHlwZXMgKi8KK3R5cGVkZWYgZW51bSBPTVhfQVVESU9fQ0RNQVJBVEVUWVBFIHsKKyAgICBPTVhfQVVESU9fQ0RNQVJhdGVCbGFuayA9IDAsICAgICAgICAgIC8qKjwgQ0RNQSBlbmNvZGVkIGZyYW1lIGlzIGJsYW5rICovCisgICAgT01YX0FVRElPX0NETUFSYXRlRnVsbCwgICAgICAgICAgICAgICAvKio8IENETUEgZW5jb2RlZCBmcmFtZSBpbiBmdWxsIHJhdGUgKi8KKyAgICBPTVhfQVVESU9fQ0RNQVJhdGVIYWxmLCAgICAgICAgICAgICAgIC8qKjwgQ0RNQSBlbmNvZGVkIGZyYW1lIGluIGhhbGYgcmF0ZSAqLworICAgIE9NWF9BVURJT19DRE1BUmF0ZVF1YXJ0ZXIsICAgICAgICAgICAgLyoqPCBDRE1BIGVuY29kZWQgZnJhbWUgaW4gcXVhcnRlciByYXRlICovCisgICAgT01YX0FVRElPX0NETUFSYXRlRWlnaHRoLCAgICAgICAgICAgICAvKio8IENETUEgZW5jb2RlZCBmcmFtZSBpbiBlaWdodGggcmF0ZSAoRFRYKSovCisgICAgT01YX0FVRElPX0NETUFSYXRlRXJhc3VyZSwgICAgICAgICAgICAvKio8IENETUEgZXJhc3VyZSBmcmFtZSAqLworICAgIE9NWF9BVURJT19DRE1BUmF0ZUtocm9ub3NFeHRlbnNpb25zID0gMHg2RjAwMDAwMCwgLyoqPCBSZXNlcnZlZCByZWdpb24gZm9yIGludHJvZHVjaW5nIEtocm9ub3MgU3RhbmRhcmQgRXh0ZW5zaW9ucyAqLyAKKyAgICBPTVhfQVVESU9fQ0RNQVJhdGVWZW5kb3JTdGFydFVudXNlZCA9IDB4N0YwMDAwMDAsIC8qKjwgUmVzZXJ2ZWQgcmVnaW9uIGZvciBpbnRyb2R1Y2luZyBWZW5kb3IgRXh0ZW5zaW9ucyAqLworICAgIE9NWF9BVURJT19DRE1BUmF0ZU1heCA9IDB4N0ZGRkZGRkYKK30gT01YX0FVRElPX0NETUFSQVRFVFlQRTsKKworCisvKiogUUNFTFA4IChUSUEvRUlBLTk2LCB1cCB0byA4a2JwcyBjb2Rlcikgc3RyZWFtIGZvcm1hdCBwYXJhbWV0ZXJzICovCit0eXBlZGVmIHN0cnVjdCBPTVhfQVVESU9fUEFSQU1fUUNFTFA4VFlQRSB7CisgICAgT01YX1UzMiBuU2l6ZTsgICAgICAgICAgICAgICAgLyoqPCBzaXplIG9mIHRoZSBzdHJ1Y3R1cmUgaW4gYnl0ZXMgKi8KKyAgICBPTVhfVkVSU0lPTlRZUEUgblZlcnNpb247ICAgICAvKio8IE9NWCBzcGVjaWZpY2F0aW9uIHZlcnNpb24gaW5mb3JtYXRpb24gKi8KKyAgICBPTVhfVTMyIG5Qb3J0SW5kZXg7ICAgICAgICAgICAvKio8IHBvcnQgdGhhdCB0aGlzIHN0cnVjdHVyZSBhcHBsaWVzIHRvICovCisgICAgT01YX1UzMiBuQ2hhbm5lbHM7ICAgICAgICAgICAgLyoqPCBOdW1iZXIgb2YgY2hhbm5lbHMgaW4gdGhlIGRhdGEgc3RyZWFtIChub3QKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5lY2Vzc2FyaWx5IHRoZSBzYW1lIGFzIHRoZSBudW1iZXIgb2YgY2hhbm5lbHMKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRvIGJlIHJlbmRlcmVkLiAqLworICAgIE9NWF9VMzIgbkJpdFJhdGU7ICAgICAgICAgICAgIC8qKjwgQml0IHJhdGUgb2YgdGhlIGlucHV0IGRhdGEuICBVc2UgMCBmb3IgdmFyaWFibGUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJhdGUgb3IgdW5rbm93biBiaXQgcmF0ZXMgKi8KKyAgICBPTVhfQVVESU9fQ0RNQVJBVEVUWVBFIGVDRE1BUmF0ZTsgLyoqPCBGcmFtZSByYXRlICovCisgICAgT01YX1UzMiBuTWluQml0UmF0ZTsgICAgICAgICAgLyoqPCBtaW5tYWwgcmF0ZSBmb3IgdGhlIGVuY29kZXIgPSAxLDIsMyw0LCBkZWZhdWx0ID0gMSAqLworICAgIE9NWF9VMzIgbk1heEJpdFJhdGU7ICAgICAgICAgIC8qKjwgbWF4aW1hbCByYXRlIGZvciB0aGUgZW5jb2RlciA9IDEsMiwzLDQsIGRlZmF1bHQgPSA0ICovCit9IE9NWF9BVURJT19QQVJBTV9RQ0VMUDhUWVBFOworCisKKy8qKiBRQ0VMUDEzICggQ0RNQSwgRUlBL1RJQS03MzMsIDEzLjNrYnBzIGNvZGVyKSBzdHJlYW0gZm9ybWF0IHBhcmFtZXRlcnMgKi8KK3R5cGVkZWYgc3RydWN0IE9NWF9BVURJT19QQVJBTV9RQ0VMUDEzVFlQRSB7CisgICAgT01YX1UzMiBuU2l6ZTsgICAgICAgICAgICAgICAgLyoqPCBzaXplIG9mIHRoZSBzdHJ1Y3R1cmUgaW4gYnl0ZXMgKi8KKyAgICBPTVhfVkVSU0lPTlRZUEUgblZlcnNpb247ICAgICAvKio8IE9NWCBzcGVjaWZpY2F0aW9uIHZlcnNpb24gaW5mb3JtYXRpb24gKi8KKyAgICBPTVhfVTMyIG5Qb3J0SW5kZXg7ICAgICAgICAgICAvKio8IHBvcnQgdGhhdCB0aGlzIHN0cnVjdHVyZSBhcHBsaWVzIHRvICovCisgICAgT01YX1UzMiBuQ2hhbm5lbHM7ICAgICAgICAgICAgLyoqPCBOdW1iZXIgb2YgY2hhbm5lbHMgaW4gdGhlIGRhdGEgc3RyZWFtIChub3QKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5lY2Vzc2FyaWx5IHRoZSBzYW1lIGFzIHRoZSBudW1iZXIgb2YgY2hhbm5lbHMKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRvIGJlIHJlbmRlcmVkLiAqLworICAgIE9NWF9BVURJT19DRE1BUkFURVRZUEUgZUNETUFSYXRlOyAvKio8IEZyYW1lIHJhdGUgKi8KKyAgICBPTVhfVTMyIG5NaW5CaXRSYXRlOyAgICAgICAgICAvKio8IG1pbm1hbCByYXRlIGZvciB0aGUgZW5jb2RlciA9IDEsMiwzLDQsIGRlZmF1bHQgPSAxICovCisgICAgT01YX1UzMiBuTWF4Qml0UmF0ZTsgICAgICAgICAgLyoqPCBtYXhpbWFsIHJhdGUgZm9yIHRoZSBlbmNvZGVyID0gMSwyLDMsNCwgZGVmYXVsdCA9IDQgKi8KK30gT01YX0FVRElPX1BBUkFNX1FDRUxQMTNUWVBFOworCisKKy8qKiBFVlJDICggQ0RNQSwgRUlBL1RJQS0xMjcsIFJDRUxQIHVwIHRvIDguNTVrYnBzIGNvZGVyKSBzdHJlYW0gZm9ybWF0IHBhcmFtZXRlcnMgKi8KK3R5cGVkZWYgc3RydWN0IE9NWF9BVURJT19QQVJBTV9FVlJDVFlQRSB7CisgICAgT01YX1UzMiBuU2l6ZTsgICAgICAgICAgICAgICAgLyoqPCBzaXplIG9mIHRoZSBzdHJ1Y3R1cmUgaW4gYnl0ZXMgKi8KKyAgICBPTVhfVkVSU0lPTlRZUEUgblZlcnNpb247ICAgICAvKio8IE9NWCBzcGVjaWZpY2F0aW9uIHZlcnNpb24gaW5mb3JtYXRpb24gKi8KKyAgICBPTVhfVTMyIG5Qb3J0SW5kZXg7ICAgICAgICAgICAvKio8IHBvcnQgdGhhdCB0aGlzIHN0cnVjdHVyZSBhcHBsaWVzIHRvICovCisgICAgT01YX1UzMiBuQ2hhbm5lbHM7ICAgICAgICAgICAgLyoqPCBOdW1iZXIgb2YgY2hhbm5lbHMgaW4gdGhlIGRhdGEgc3RyZWFtIChub3QKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5lY2Vzc2FyaWx5IHRoZSBzYW1lIGFzIHRoZSBudW1iZXIgb2YgY2hhbm5lbHMKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRvIGJlIHJlbmRlcmVkLiAqLworICAgIE9NWF9BVURJT19DRE1BUkFURVRZUEUgZUNETUFSYXRlOyAvKio8IGFjdHVhbCBGcmFtZSByYXRlICovCisgICAgT01YX0JPT0wgYlJBVEVfUkVEVUNvbjsgICAgICAgLyoqPCBSQVRFX1JFRFVDdGlvbiBpcyByZXF1ZXN0ZWQgZm9yIHRoaXMgZnJhbWUgKi8KKyAgICBPTVhfVTMyIG5NaW5CaXRSYXRlOyAgICAgICAgICAvKio8IG1pbm1hbCByYXRlIGZvciB0aGUgZW5jb2RlciA9IDEsMiwzLDQsIGRlZmF1bHQgPSAxICovCisgICAgT01YX1UzMiBuTWF4Qml0UmF0ZTsgICAgICAgICAgLyoqPCBtYXhpbWFsIHJhdGUgZm9yIHRoZSBlbmNvZGVyID0gMSwyLDMsNCwgZGVmYXVsdCA9IDQgKi8KKyAgICBPTVhfQk9PTCBiSGlQYXNzRmlsdGVyOyAgICAgICAvKio8IEVuYWJsZSBlbmNvZGVyJ3MgSGlnaCBQYXNzIEZpbHRlciAqLworICAgIE9NWF9CT09MIGJOb2lzZVN1cHByZXNzb3I7ICAgIC8qKjwgRW5hYmxlIGVuY29kZXIncyBub2lzZSBzdXBwcmVzc29yIHByZS1wcm9jZXNzaW5nICovCisgICAgT01YX0JPT0wgYlBvc3RGaWx0ZXI7ICAgICAgICAgLyoqPCBFbmFibGUgZGVjb2RlcidzIHBvc3QgRmlsdGVyICovCit9IE9NWF9BVURJT19QQVJBTV9FVlJDVFlQRTsKKworCisvKiogU01WICggdXAgdG8gOC41NWticHMgY29kZXIpIHN0cmVhbSBmb3JtYXQgcGFyYW1ldGVycyAqLwordHlwZWRlZiBzdHJ1Y3QgT01YX0FVRElPX1BBUkFNX1NNVlRZUEUgeworICAgIE9NWF9VMzIgblNpemU7ICAgICAgICAgICAgICAgIC8qKjwgc2l6ZSBvZiB0aGUgc3RydWN0dXJlIGluIGJ5dGVzICovCisgICAgT01YX1ZFUlNJT05UWVBFIG5WZXJzaW9uOyAgICAgLyoqPCBPTVggc3BlY2lmaWNhdGlvbiB2ZXJzaW9uIGluZm9ybWF0aW9uICovCisgICAgT01YX1UzMiBuUG9ydEluZGV4OyAgICAgICAgICAgLyoqPCBwb3J0IHRoYXQgdGhpcyBzdHJ1Y3R1cmUgYXBwbGllcyB0byAqLworICAgIE9NWF9VMzIgbkNoYW5uZWxzOyAgICAgICAgICAgIC8qKjwgTnVtYmVyIG9mIGNoYW5uZWxzIGluIHRoZSBkYXRhIHN0cmVhbSAobm90CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZWNlc3NhcmlseSB0aGUgc2FtZSBhcyB0aGUgbnVtYmVyIG9mIGNoYW5uZWxzCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0byBiZSByZW5kZXJlZC4gKi8KKyAgICBPTVhfQVVESU9fQ0RNQVJBVEVUWVBFIGVDRE1BUmF0ZTsgLyoqPCBGcmFtZSByYXRlICovCisgICAgT01YX0JPT0wgYlJBVEVfUkVEVUNvbjsgICAgICAgICAgIC8qKjwgUkFURV9SRURVQ3Rpb24gaXMgcmVxdWVzdGVkIGZvciB0aGlzIGZyYW1lICovCisgICAgT01YX1UzMiBuTWluQml0UmF0ZTsgICAgICAgICAgLyoqPCBtaW5tYWwgcmF0ZSBmb3IgdGhlIGVuY29kZXIgPSAxLDIsMyw0LCBkZWZhdWx0ID0gMSA/PyovCisgICAgT01YX1UzMiBuTWF4Qml0UmF0ZTsgICAgICAgICAgLyoqPCBtYXhpbWFsIHJhdGUgZm9yIHRoZSBlbmNvZGVyID0gMSwyLDMsNCwgZGVmYXVsdCA9IDQgPz8qLworICAgIE9NWF9CT09MIGJIaVBhc3NGaWx0ZXI7ICAgICAgIC8qKjwgRW5hYmxlIGVuY29kZXIncyBIaWdoIFBhc3MgRmlsdGVyID8/Ki8KKyAgICBPTVhfQk9PTCBiTm9pc2VTdXBwcmVzc29yOyAgICAvKio8IEVuYWJsZSBlbmNvZGVyJ3Mgbm9pc2Ugc3VwcHJlc3NvciBwcmUtcHJvY2Vzc2luZyAqLworICAgIE9NWF9CT09MIGJQb3N0RmlsdGVyOyAgICAgICAgIC8qKjwgRW5hYmxlIGRlY29kZXIncyBwb3N0IEZpbHRlciA/PyovCit9IE9NWF9BVURJT19QQVJBTV9TTVZUWVBFOworCisKKy8qKiBNSURJIEZvcm1hdCAKKyAqIEBpbmdyb3VwIG1pZGkKKyAqLwordHlwZWRlZiBlbnVtIE9NWF9BVURJT19NSURJRk9STUFUVFlQRQoreworICAgIE9NWF9BVURJT19NSURJRm9ybWF0VW5rbm93biA9IDAsIC8qKjwgTUlESSBGb3JtYXQgdW5rbm93biBvciBkb24ndCBjYXJlICovCisgICAgT01YX0FVRElPX01JRElGb3JtYXRTTUYwLCAgICAgICAgLyoqPCBTdGFuZGFyZCBNSURJIEZpbGUgVHlwZSAwICovCisgICAgT01YX0FVRElPX01JRElGb3JtYXRTTUYxLCAgICAgICAgLyoqPCBTdGFuZGFyZCBNSURJIEZpbGUgVHlwZSAxICovCisgICAgT01YX0FVRElPX01JRElGb3JtYXRTTUYyLCAgICAgICAgLyoqPCBTdGFuZGFyZCBNSURJIEZpbGUgVHlwZSAyICovCisgICAgT01YX0FVRElPX01JRElGb3JtYXRTUE1JREksICAgICAgLyoqPCBTUC1NSURJICovCisgICAgT01YX0FVRElPX01JRElGb3JtYXRYTUYwLCAgICAgICAgLyoqPCBlWHRlbnNpYmxlIE11c2ljIEZvcm1hdCB0eXBlIDAgKi8KKyAgICBPTVhfQVVESU9fTUlESUZvcm1hdFhNRjEsICAgICAgICAvKio8IGVYdGVuc2libGUgTXVzaWMgRm9ybWF0IHR5cGUgMSAqLworICAgIE9NWF9BVURJT19NSURJRm9ybWF0TW9iaWxlWE1GLCAgIC8qKjwgTW9iaWxlIFhNRiAoZVh0ZW5zaWJsZSBNdXNpYyBGb3JtYXQgdHlwZSAyKSAqLworICAgIE9NWF9BVURJT19NSURJRm9ybWF0S2hyb25vc0V4dGVuc2lvbnMgPSAweDZGMDAwMDAwLCAvKio8IFJlc2VydmVkIHJlZ2lvbiBmb3IgaW50cm9kdWNpbmcgS2hyb25vcyBTdGFuZGFyZCBFeHRlbnNpb25zICovIAorICAgIE9NWF9BVURJT19NSURJRm9ybWF0VmVuZG9yU3RhcnRVbnVzZWQgPSAweDdGMDAwMDAwLCAvKio8IFJlc2VydmVkIHJlZ2lvbiBmb3IgaW50cm9kdWNpbmcgVmVuZG9yIEV4dGVuc2lvbnMgKi8KKyAgICBPTVhfQVVESU9fTUlESUZvcm1hdE1heCA9IDB4N0ZGRkZGRkYKK30gT01YX0FVRElPX01JRElGT1JNQVRUWVBFOworCisKKy8qKiBNSURJIHBhcmFtcyAKKyAqIEBpbmdyb3VwIG1pZGkKKyAqLwordHlwZWRlZiBzdHJ1Y3QgT01YX0FVRElPX1BBUkFNX01JRElUWVBFIHsKKyAgICBPTVhfVTMyIG5TaXplOyAgICAgICAgICAgICAgICAgLyoqPCBzaXplIG9mIHRoZSBzdHJ1Y3R1cmUgaW4gYnl0ZXMgKi8KKyAgICBPTVhfVkVSU0lPTlRZUEUgblZlcnNpb247ICAgICAgLyoqPCBPTVggc3BlY2lmaWNhdGlvbiB2ZXJzaW9uIGluZm9ybWF0aW9uICovCisgICAgT01YX1UzMiBuUG9ydEluZGV4OyAgICAgICAgICAgIC8qKjwgcG9ydCB0aGF0IHRoaXMgc3RydWN0dXJlIGFwcGxpZXMgdG8gKi8KKyAgICBPTVhfVTMyIG5GaWxlU2l6ZTsgICAgICAgICAgICAgLyoqPCBzaXplIG9mIHRoZSBNSURJIGZpbGUgaW4gYnl0ZXMsIHdoZXJlIHRoZSBlbnRpcmUgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTUlESSBmaWxlIHBhc3NlZCBpbiwgb3RoZXJ3aXNlIGlmIDB4MCwgdGhlIE1JREkgZGF0YSAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpcyBtZXJnZWQgYW5kIHN0cmVhbWVkIChpbnN0ZWFkIG9mIHBhc3NlZCBhcyBhbiAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbnRpcmUgTUlESSBmaWxlKSAqLworICAgIE9NWF9CVTMyIHNNYXhQb2x5cGhvbnk7ICAgICAgICAvKio8IFNwZWNpZmllcyB0aGUgbWF4aW11bSBzaW11bHRhbmVvdXMgcG9seXBob25pYyAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2ljZXMuIEEgdmFsdWUgb2YgemVybyBpbmRpY2F0ZXMgdGhhdCB0aGUgZGVmYXVsdCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwb2x5cGhvbnkgb2YgdGhlIGRldmljZSBpcyB1c2VkICAqLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorICAgIE9NWF9CT09MIGJMb2FkRGVmYXVsdFNvdW5kOyAgICAvKio8IFdoZXRoZXIgdG8gbG9hZCBkZWZhdWx0IHNvdW5kIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJhbmsgYXQgaW5pdGlhbGl6YXRpb24gKi8KKyAgICBPTVhfQVVESU9fTUlESUZPUk1BVFRZUEUgZU1pZGlGb3JtYXQ7IC8qKjwgVmVyc2lvbiBvZiB0aGUgTUlESSBmaWxlICovICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCit9IE9NWF9BVURJT19QQVJBTV9NSURJVFlQRTsKKworCisvKiogVHlwZSBvZiB0aGUgTUlESSBzb3VuZCBiYW5rIAorICogQGluZ3JvdXAgbWlkaQorICovCit0eXBlZGVmIGVudW0gT01YX0FVRElPX01JRElTT1VOREJBTktUWVBFIHsKKyAgICBPTVhfQVVESU9fTUlESVNvdW5kQmFua1VudXNlZCA9IDAsICAgICAgICAgICAvKio8IHVudXNlZC91bmtub3duIHNvdW5kYmFuayB0eXBlICovCisgICAgT01YX0FVRElPX01JRElTb3VuZEJhbmtETFMxLCAgICAgICAgICAgICAgICAgLyoqPCBETFMgdmVyc2lvbiAxICovCisgICAgT01YX0FVRElPX01JRElTb3VuZEJhbmtETFMyLCAgICAgICAgICAgICAgICAgLyoqPCBETFMgdmVyc2lvbiAyICovCisgICAgT01YX0FVRElPX01JRElTb3VuZEJhbmtNb2JpbGVETFNCYXNlLCAgICAgICAgLyoqPCBNb2JpbGUgRExTLCB1c2luZyB0aGUgYmFzZSBmdW5jdGlvbmFsaXR5ICovCisgICAgT01YX0FVRElPX01JRElTb3VuZEJhbmtNb2JpbGVETFNQbHVzT3B0aW9ucywgLyoqPCBNb2JpbGUgRExTLCB1c2luZyB0aGUgc3BlY2lmaWNhdGlvbi1kZWZpbmVkIG9wdGlvbmFsIGZlYXR1cmUgc2V0ICovCisgICAgT01YX0FVRElPX01JRElTb3VuZEJhbmtLaHJvbm9zRXh0ZW5zaW9ucyA9IDB4NkYwMDAwMDAsIC8qKjwgUmVzZXJ2ZWQgcmVnaW9uIGZvciBpbnRyb2R1Y2luZyBLaHJvbm9zIFN0YW5kYXJkIEV4dGVuc2lvbnMgKi8gCisgICAgT01YX0FVRElPX01JRElTb3VuZEJhbmtWZW5kb3JTdGFydFVudXNlZCA9IDB4N0YwMDAwMDAsIC8qKjwgUmVzZXJ2ZWQgcmVnaW9uIGZvciBpbnRyb2R1Y2luZyBWZW5kb3IgRXh0ZW5zaW9ucyAqLworICAgIE9NWF9BVURJT19NSURJU291bmRCYW5rTWF4ID0gMHg3RkZGRkZGRgorfSBPTVhfQVVESU9fTUlESVNPVU5EQkFOS1RZUEU7CisKKworLyoqIEJhbmsgTGF5b3V0IGRlc2NyaWJlcyBob3cgYmFuayBNU0IgJiBMU0IgYXJlIHVzZWQgaW4gdGhlIERMUyBpbnN0cnVtZW50IGRlZmluaXRpb25zIHNvdW5kIGJhbmsgCisgKiBAaW5ncm91cCBtaWRpCisgKi8KK3R5cGVkZWYgZW51bSBPTVhfQVVESU9fTUlESVNPVU5EQkFOS0xBWU9VVFRZUEUgeworICAgT01YX0FVRElPX01JRElTb3VuZEJhbmtMYXlvdXRVbnVzZWQgPSAwLCAgIC8qKjwgdW51c2VkL3Vua25vd24gc291bmRiYW5rIHR5cGUgKi8KKyAgIE9NWF9BVURJT19NSURJU291bmRCYW5rTGF5b3V0R00sICAgICAgICAgICAvKio8IEdTIGxheW91dCAoYmFzZWQgb24gYmFuayBNU0IgMHgwMCkgKi8KKyAgIE9NWF9BVURJT19NSURJU291bmRCYW5rTGF5b3V0R00yLCAgICAgICAgICAvKio8IEdlbmVyYWwgTUlESSAyIGxheW91dCAodXNpbmcgTVNCIDB4NzgvMHg3OSwgTFNCIDB4MDApICovCisgICBPTVhfQVVESU9fTUlESVNvdW5kQmFua0xheW91dFVzZXIsICAgICAgICAgLyoqPCBEb2VzIG5vdCBjb25mb3JtIHRvIGFueSBiYW5rIG51bWJlcmluZyBzdGFuZGFyZHMgKi8KKyAgIE9NWF9BVURJT19NSURJU291bmRCYW5rTGF5b3V0S2hyb25vc0V4dGVuc2lvbnMgPSAweDZGMDAwMDAwLCAvKio8IFJlc2VydmVkIHJlZ2lvbiBmb3IgaW50cm9kdWNpbmcgS2hyb25vcyBTdGFuZGFyZCBFeHRlbnNpb25zICovIAorICAgT01YX0FVRElPX01JRElTb3VuZEJhbmtMYXlvdXRWZW5kb3JTdGFydFVudXNlZCA9IDB4N0YwMDAwMDAsIC8qKjwgUmVzZXJ2ZWQgcmVnaW9uIGZvciBpbnRyb2R1Y2luZyBWZW5kb3IgRXh0ZW5zaW9ucyAqLworICAgT01YX0FVRElPX01JRElTb3VuZEJhbmtMYXlvdXRNYXggPSAweDdGRkZGRkZGCit9IE9NWF9BVURJT19NSURJU09VTkRCQU5LTEFZT1VUVFlQRTsKKworCisvKiogTUlESSBwYXJhbXMgdG8gbG9hZC91bmxvYWQgdXNlciBzb3VuZGJhbmsgCisgKiBAaW5ncm91cCBtaWRpCisgKi8KK3R5cGVkZWYgc3RydWN0IE9NWF9BVURJT19QQVJBTV9NSURJTE9BRFVTRVJTT1VORFRZUEUgeworICAgIE9NWF9VMzIgblNpemU7ICAgICAgICAgICAgLyoqPCBzaXplIG9mIHRoZSBzdHJ1Y3R1cmUgaW4gYnl0ZXMgKi8KKyAgICBPTVhfVkVSU0lPTlRZUEUgblZlcnNpb247IC8qKjwgT01YIHNwZWNpZmljYXRpb24gdmVyc2lvbiBpbmZvcm1hdGlvbiAqLworICAgIE9NWF9VMzIgblBvcnRJbmRleDsgICAgICAgLyoqPCBwb3J0IHRoYXQgdGhpcyBzdHJ1Y3R1cmUgYXBwbGllcyB0byAqLworICAgIE9NWF9VMzIgbkRMU0luZGV4OyAgICAgICAgLyoqPCBETFMgZmlsZSBpbmRleCB0byBiZSBsb2FkZWQgKi8KKyAgICBPTVhfVTMyIG5ETFNTaXplOyAgICAgICAgIC8qKjwgU2l6ZSBpbiBieXRlcyAqLworICAgIE9NWF9QVFIgcERMU0RhdGE7ICAgICAgICAgLyoqPCBQb2ludGVyIHRvIERMUyBmaWxlIGRhdGEgKi8KKyAgICBPTVhfQVVESU9fTUlESVNPVU5EQkFOS1RZUEUgZU1pZGlTb3VuZEJhbms7ICAgLyoqPCBNaWRpIHNvdW5kIGJhbmsgdHlwZSBlbnVtZXJhdGlvbiAqLworICAgIE9NWF9BVURJT19NSURJU09VTkRCQU5LTEFZT1VUVFlQRSBlTWlkaVNvdW5kQmFua0xheW91dDsgLyoqPCBNaWRpIHNvdW5kIGJhbmsgbGF5b3V0IGVudW1lcmF0aW9uICovCit9IE9NWF9BVURJT19QQVJBTV9NSURJTE9BRFVTRVJTT1VORFRZUEU7CisKKworLyoqIFN0cnVjdHVyZSBmb3IgTGl2ZSBNSURJIGV2ZW50cyBhbmQgTUlQIG1lc3NhZ2VzLiAKKyAqIChNSVAgPSBNYXhpbXVtIEluc3RhbnRhbmVvdXMgUG9seXBob255OyBwYXJ0IG9mIHRoZSBTUC1NSURJIHN0YW5kYXJkLikgCisgKiBAaW5ncm91cCBtaWRpCisgKi8KK3R5cGVkZWYgc3RydWN0IE9NWF9BVURJT19DT05GSUdfTUlESUlNTUVESUFURUVWRU5UVFlQRSB7CisgICAgT01YX1UzMiBuU2l6ZTsgICAgICAgICAgICAvKio8IHNpemUgb2YgdGhlIHN0cnVjdHVyZSBpbiBieXRlcyAqLworICAgIE9NWF9WRVJTSU9OVFlQRSBuVmVyc2lvbjsgLyoqPCBPTVggc3BlY2lmaWNhdGlvbiB2ZXJzaW9uIGluZm9ybWF0aW9uICovCisgICAgT01YX1UzMiBuUG9ydEluZGV4OyAgICAgICAvKio8IFBvcnQgdGhhdCB0aGlzIHN0cnVjdHVyZSBhcHBsaWVzIHRvICovCisgICAgT01YX1UzMiBuTWlkaUV2ZW50U2l6ZTsgICAvKio8IFNpemUgb2YgaW1tZWRpYXRlIE1JREkgZXZlbnRzIG9yIE1JUCBtZXNzYWdlIGluIGJ5dGVzICAqLworICAgIE9NWF9VOCBuTWlkaUV2ZW50c1sxXTsgICAgLyoqPCBNSURJIGV2ZW50IGFycmF5IHRvIGJlIHJlbmRlcmVkIGltbWVkaWF0ZWx5LCBvciBhbgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhcnJheSBmb3IgdGhlIE1JUCBtZXNzYWdlIGJ1ZmZlciwgd2hlcmUgdGhlIHNpemUgaXMgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluZGljYXRlZCBieSBuTWlkaUV2ZW50U2l6ZSAqLworfSBPTVhfQVVESU9fQ09ORklHX01JRElJTU1FRElBVEVFVkVOVFRZUEU7CisKKworLyoqIE1JREkgc291bmQgYmFuay8gcHJvZ3JhbSBwYWlyIGluIGEgZ2l2ZW4gY2hhbm5lbCAKKyAqIEBpbmdyb3VwIG1pZGkKKyAqLwordHlwZWRlZiBzdHJ1Y3QgT01YX0FVRElPX0NPTkZJR19NSURJU09VTkRCQU5LUFJPR1JBTVRZUEUgeworICAgIE9NWF9VMzIgblNpemU7ICAgICAgICAgICAgICAvKio8IHNpemUgb2YgdGhlIHN0cnVjdHVyZSBpbiBieXRlcyAqLworICAgIE9NWF9WRVJTSU9OVFlQRSBuVmVyc2lvbjsgICAvKio8IE9NWCBzcGVjaWZpY2F0aW9uIHZlcnNpb24gaW5mb3JtYXRpb24gKi8KKyAgICBPTVhfVTMyIG5Qb3J0SW5kZXg7ICAgICAgICAgLyoqPCBQb3J0IHRoYXQgdGhpcyBzdHJ1Y3R1cmUgYXBwbGllcyB0byAqLworICAgIE9NWF9VMzIgbkNoYW5uZWw7ICAgICAgICAgICAvKio8IFZhbGlkIGNoYW5uZWwgdmFsdWVzIHJhbmdlIGZyb20gMSB0byAxNiAqLworICAgIE9NWF9VMTYgbklEUHJvZ3JhbTsgICAgICAgICAvKio8IFZhbGlkIHByb2dyYW0gSUQgcmFuZ2UgaXMgMSB0byAxMjggKi8KKyAgICBPTVhfVTE2IG5JRFNvdW5kQmFuazsgICAgICAgLyoqPCBTb3VuZCBiYW5rIElEICovCisgICAgT01YX1UzMiBuVXNlclNvdW5kQmFua0luZGV4Oy8qKjwgVXNlciBzb3VuZGJhbmsgaW5kZXgsIGVhc2llciB0byBhY2Nlc3Mgc291bmRiYW5rcyAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBieSBpbmRleCBpZiBtdWx0aXBsZSBiYW5rcyBhcmUgcHJlc2VudCAqLworfSBPTVhfQVVESU9fQ09ORklHX01JRElTT1VOREJBTktQUk9HUkFNVFlQRTsKKworCisvKiogTUlESSBjb250cm9sIAorICogQGluZ3JvdXAgbWlkaQorICovCit0eXBlZGVmIHN0cnVjdCBPTVhfQVVESU9fQ09ORklHX01JRElDT05UUk9MVFlQRSB7CisgICAgT01YX1UzMiBuU2l6ZTsgICAgICAgICAgICAgICAgLyoqPCBzaXplIG9mIHRoZSBzdHJ1Y3R1cmUgaW4gYnl0ZXMgKi8KKyAgICBPTVhfVkVSU0lPTlRZUEUgblZlcnNpb247ICAgICAvKio8IE9NWCBzcGVjaWZpY2F0aW9uIHZlcnNpb24gaW5mb3JtYXRpb24gKi8KKyAgICBPTVhfVTMyIG5Qb3J0SW5kZXg7ICAgICAgICAgICAvKio8IHBvcnQgdGhhdCB0aGlzIHN0cnVjdHVyZSBhcHBsaWVzIHRvICovCisgICAgT01YX0JTMzIgc1BpdGNoVHJhbnNwb3NpdGlvbjsgLyoqPCBQaXRjaCB0cmFuc3Bvc2l0aW9uIGluIHNlbWl0b25lcywgc3RvcmVkIGFzIFEyMi4xMCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvcm1hdCBiYXNlZCBvbiBKQVZBIE1NQVBJIChKU1ItMTM1KSByZXF1aXJlbWVudCAqLworICAgIE9NWF9CVTMyIHNQbGF5QmFja1JhdGU7ICAgICAgIC8qKjwgUmVsYXRpdmUgcGxheWJhY2sgcmF0ZSwgc3RvcmVkIGFzIFExNC4xNyBmaXhlZC1wb2ludAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbnVtYmVyIGJhc2VkIG9uIEpTUi0xMzUgcmVxdWlyZW1lbnQgKi8KKyAgICBPTVhfQlUzMiBzVGVtcG8gOyAgICAgICAgICAgICAvKio8IFRlbXBvIGluIGJlYXRzIHBlciBtaW51dGUgKEJQTSksIHN0b3JlZCBhcyBRMjIuMTAgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaXhlZC1wb2ludCBudW1iZXIgYmFzZWQgb24gSlNSLTEzNSByZXF1aXJlbWVudCAqLworICAgIE9NWF9VMzIgbk1heFBvbHlwaG9ueTsgICAgICAgIC8qKjwgU3BlY2lmaWVzIHRoZSBtYXhpbXVtIHNpbXVsdGFuZW91cyBwb2x5cGhvbmljIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pY2VzLiBBIHZhbHVlIG9mIHplcm8gaW5kaWNhdGVzIHRoYXQgdGhlIGRlZmF1bHQgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwb2x5cGhvbnkgb2YgdGhlIGRldmljZSBpcyB1c2VkICAqLworICAgIE9NWF9VMzIgbk51bVJlcGVhdDsgICAgICAgICAgIC8qKjwgTnVtYmVyIG9mIHRpbWVzIHRvIHJlcGVhdCBwbGF5YmFjayAqLworICAgIE9NWF9VMzIgblN0b3BUaW1lOyAgICAgICAgICAgIC8qKjwgVGltZSBpbiBtaWxsaXNlY29uZHMgdG8gaW5kaWNhdGUgd2hlbiBwbGF5YmFjayAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdpbGwgc3RvcCBhdXRvbWF0aWNhbGx5LiAgU2V0IHRvIHplcm8gaWYgbm90IHVzZWQgKi8KKyAgICBPTVhfVTE2IG5DaGFubmVsTXV0ZU1hc2s7ICAgICAvKio8IDE2IGJpdCBtYXNrIGZvciBjaGFubmVsIG11dGUgc3RhdHVzICovCisgICAgT01YX1UxNiBuQ2hhbm5lbFNvbG9NYXNrOyAgICAgLyoqPCAxNiBiaXQgbWFzayBmb3IgY2hhbm5lbCBzb2xvIHN0YXR1cyAqLworICAgIE9NWF9VMzIgblRyYWNrMDAzMU11dGVNYXNrOyAgIC8qKjwgMzIgYml0IG1hc2sgZm9yIHRyYWNrIG11dGUgc3RhdHVzLiBOb3RlOiBUaGlzIGlzIGZvciB0cmFja3MgMC0zMSAqLworICAgIE9NWF9VMzIgblRyYWNrMzI2M011dGVNYXNrOyAgIC8qKjwgMzIgYml0IG1hc2sgZm9yIHRyYWNrIG11dGUgc3RhdHVzLiBOb3RlOiBUaGlzIGlzIGZvciB0cmFja3MgMzItNjMgKi8KKyAgICBPTVhfVTMyIG5UcmFjazAwMzFTb2xvTWFzazsgICAvKio8IDMyIGJpdCBtYXNrIGZvciB0cmFjayBzb2xvIHN0YXR1cy4gTm90ZTogVGhpcyBpcyBmb3IgdHJhY2tzIDAtMzEgKi8KKyAgICBPTVhfVTMyIG5UcmFjazMyNjNTb2xvTWFzazsgICAvKio8IDMyIGJpdCBtYXNrIGZvciB0cmFjayBzb2xvIHN0YXR1cy4gTm90ZTogVGhpcyBpcyBmb3IgdHJhY2tzIDMyLTYzICovCisKK30gT01YX0FVRElPX0NPTkZJR19NSURJQ09OVFJPTFRZUEU7CisKKworLyoqIE1JREkgUGxheWJhY2sgU3RhdGVzIAorICogQGluZ3JvdXAgbWlkaQorICovCit0eXBlZGVmIGVudW0gT01YX0FVRElPX01JRElQTEFZQkFDS1NUQVRFVFlQRSB7CisgIE9NWF9BVURJT19NSURJUGxheUJhY2tTdGF0ZVVua25vd24gPSAwLCAgICAgIC8qKjwgVW5rbm93biBzdGF0ZSBvciBzdGF0ZSBkb2VzIG5vdCBtYXAgdG8gCisgIAkJCQkJCQkJCQkJCQlvdGhlciBkZWZpbmVkIHN0YXRlcyAqLworICBPTVhfQVVESU9fTUlESVBsYXlCYWNrU3RhdGVDbG9zZWRFbmdhZ2VkLCAgICAvKio8IE5vIE1JREkgcmVzb3VyY2UgaXMgY3VycmVudGx5IG9wZW4uIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRoZSBNSURJIGVuZ2luZSBpcyBjdXJyZW50bHkgcHJvY2Vzc2luZyAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNSURJIGV2ZW50cy4gKi8KKyAgT01YX0FVRElPX01JRElQbGF5QmFja1N0YXRlUGFyc2luZywgICAgICAgICAgLyoqPCBBIE1JREkgcmVzb3VyY2UgaXMgb3BlbiBhbmQgaXMgYmVpbmcgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJpbWVkLiBUaGUgTUlESSBlbmdpbmUgaXMgY3VycmVudGx5IAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByb2Nlc3NpbmcgTUlESSBldmVudHMuICovCisgIE9NWF9BVURJT19NSURJUGxheUJhY2tTdGF0ZU9wZW5FbmdhZ2VkLCAgICAgIC8qKjwgQSBNSURJIHJlc291cmNlIGlzIG9wZW4gYW5kIHByaW1lZCBidXQgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbm90IHBsYXlpbmcuIFRoZSBNSURJIGVuZ2luZSBpcyBjdXJyZW50bHkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcm9jZXNzaW5nIE1JREkgZXZlbnRzLiBUaGUgdHJhbnNpdGlvbiB0bworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMgc3RhdGUgaXMgb25seSBwb3NzaWJsZSBmcm9tIHRoZSAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPTVhfQVVESU9fTUlESVBsYXlCYWNrU3RhdGVQbGF5aW5nIHN0YXRlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdoZW4gdGhlICdwbGF5YmFjayBoZWFkJyByZWFjaGVzIHRoZSBlbmQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvZiBtZWRpYSBkYXRhIG9yIHRoZSBwbGF5YmFjayBzdG9wcyBkdWUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0byBzdG9wIHRpbWUgc2V0LiovCisgIE9NWF9BVURJT19NSURJUGxheUJhY2tTdGF0ZVBsYXlpbmcsICAgICAgICAgIC8qKjwgQSBNSURJIHJlc291cmNlIGlzIG9wZW4gYW5kIGN1cnJlbnRseQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBsYXlpbmcuIFRoZSBNSURJIGVuZ2luZSBpcyBjdXJyZW50bHkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcm9jZXNzaW5nIE1JREkgZXZlbnRzLiovCisgIE9NWF9BVURJT19NSURJUGxheUJhY2tTdGF0ZVBsYXlpbmdQYXJ0aWFsbHksIC8qKjwgQmVzdC1lZmZvcnQgcGxheWJhY2sgZHVlIHRvIFNQLU1JREkvRExTCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzb3VyY2UgY29uc3RyYWludHMgKi8KKyAgT01YX0FVRElPX01JRElQbGF5QmFja1N0YXRlUGxheWluZ1NpbGVudGx5LCAgLyoqPCBEdWUgdG8gc3lzdGVtIHJlc291cmNlIGNvbnN0cmFpbnRzIGFuZAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNQLU1JREkgY29udGVudCBjb25zdHJhaW50cywgdGhlcmUgaXMKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBubyBhdWRpYmxlIE1JREkgY29udGVudCBkdXJpbmcgcGxheWJhY2sKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjdXJyZW50bHkuIFRoZSBzaXR1YXRpb24gbWF5IGNoYW5nZSBpZgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc291cmNlcyBhcmUgZnJlZWQgbGF0ZXIuKi8KKyAgT01YX0FVRElPX01JRElQbGF5QmFja1N0YXRlS2hyb25vc0V4dGVuc2lvbnMgPSAweDZGMDAwMDAwLCAvKio8IFJlc2VydmVkIHJlZ2lvbiBmb3IgaW50cm9kdWNpbmcgS2hyb25vcyBTdGFuZGFyZCBFeHRlbnNpb25zICovIAorICBPTVhfQVVESU9fTUlESVBsYXlCYWNrU3RhdGVWZW5kb3JTdGFydFVudXNlZCA9IDB4N0YwMDAwMDAsIC8qKjwgUmVzZXJ2ZWQgcmVnaW9uIGZvciBpbnRyb2R1Y2luZyBWZW5kb3IgRXh0ZW5zaW9ucyAqLworICBPTVhfQVVESU9fTUlESVBsYXlCYWNrU3RhdGVNYXggPSAweDdGRkZGRkZGCit9IE9NWF9BVURJT19NSURJUExBWUJBQ0tTVEFURVRZUEU7CisKKworLyoqIE1JREkgc3RhdHVzIAorICogQGluZ3JvdXAgbWlkaQorICovCit0eXBlZGVmIHN0cnVjdCBPTVhfQVVESU9fQ09ORklHX01JRElTVEFUVVNUWVBFIHsKKyAgICBPTVhfVTMyIG5TaXplOyAgICAgICAgICAgICAgLyoqPCBzaXplIG9mIHRoZSBzdHJ1Y3R1cmUgaW4gYnl0ZXMgKi8KKyAgICBPTVhfVkVSU0lPTlRZUEUgblZlcnNpb247ICAgLyoqPCBPTVggc3BlY2lmaWNhdGlvbiB2ZXJzaW9uIGluZm9ybWF0aW9uICovCisgICAgT01YX1UzMiBuUG9ydEluZGV4OyAgICAgICAgIC8qKjwgcG9ydCB0aGF0IHRoaXMgc3RydWN0dXJlIGFwcGxpZXMgdG8gKi8KKyAgICBPTVhfVTE2IG5OdW1UcmFja3M7ICAgICAgICAgLyoqPCBOdW1iZXIgb2YgTUlESSB0cmFja3MgaW4gdGhlIGZpbGUsIHJlYWQgb25seSBmaWVsZC4gCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTk9URTogTWF5IG5vdCByZXR1cm4gYSBtZWFuaW5nZnVsIHZhbHVlIHVudGlsIHRoZSBlbnRpcmUgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmlsZSBpcyBwYXJzZWQgYW5kIGJ1ZmZlcmVkLiAgKi8KKyAgICBPTVhfVTMyIG5EdXJhdGlvbjsgICAgICAgICAgLyoqPCBUaGUgbGVuZ3RoIG9mIHRoZSBjdXJyZW50bHkgb3BlbiBNSURJIHJlc291cmNlIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluIG1pbGxpc2Vjb25kcy4gTk9URTogTWF5IG5vdCByZXR1cm4gYSBtZWFuaW5nZnVsIHZhbHVlIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVudGlsIHRoZSBlbnRpcmUgZmlsZSBpcyBwYXJzZWQgYW5kIGJ1ZmZlcmVkLiAgKi8gIAorICAgIE9NWF9VMzIgblBvc2l0aW9uOyAgICAgICAgICAvKio8IEN1cnJlbnQgUG9zaXRpb24gb2YgdGhlIE1JREkgcmVzb3VyY2UgYmVpbmcgcGxheWVkIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluIG1pbGxpc2Vjb25kcyAqLworICAgIE9NWF9CT09MIGJWaWJyYTsgICAgICAgICAgICAvKio8IERvZXMgVmlicmEgdHJhY2sgZXhpc3Q/IE5PVEU6IE1heSBub3QgcmV0dXJuIGEgbWVhbmluZ2Z1bCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZSB1bnRpbCB0aGUgZW50aXJlIGZpbGUgaXMgcGFyc2VkIGFuZCBidWZmZXJlZC4gKi8KKyAgICBPTVhfVTMyIG5OdW1NZXRhRXZlbnRzOyAgICAgLyoqPCBUb3RhbCBudW1iZXIgb2YgTUlESSBNZXRhIEV2ZW50cyBpbiB0aGUgY3VycmVudGx5IAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9wZW4gTUlESSByZXNvdXJjZS4gTk9URTogTWF5IG5vdCByZXR1cm4gYSBtZWFuaW5nZnVsIHZhbHVlIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVudGlsIHRoZSBlbnRpcmUgZmlsZSBpcyBwYXJzZWQgYW5kIGJ1ZmZlcmVkLiAgKi8KKyAgICBPTVhfVTMyIG5OdW1BY3RpdmVWb2ljZXM7ICAgLyoqPCBOdW1iZXIgb2YgYWN0aXZlIHZvaWNlcyBpbiB0aGUgY3VycmVudGx5IHBsYXlpbmcgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTUlESSByZXNvdXJjZS4gTk9URTogTWF5IG5vdCByZXR1cm4gYSBtZWFuaW5nZnVsIHZhbHVlIHVudGlsIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoZSBlbnRpcmUgZmlsZSBpcyBwYXJzZWQgYW5kIGJ1ZmZlcmVkLiAqLworICAgIE9NWF9BVURJT19NSURJUExBWUJBQ0tTVEFURVRZUEUgZU1JRElQbGF5QmFja1N0YXRlOyAgLyoqPCBNSURJIHBsYXliYWNrIHN0YXRlIGVudW1lcmF0aW9uLCByZWFkIG9ubHkgZmllbGQgKi8KK30gT01YX0FVRElPX0NPTkZJR19NSURJU1RBVFVTVFlQRTsKKworCisvKiogTUlESSBNZXRhIEV2ZW50IHN0cnVjdHVyZSBvbmUgcGVyIE1ldGEgRXZlbnQuCisgKiAgTUlESSBNZXRhIEV2ZW50cyBhcmUgbGlrZSBhdWRpbyBtZXRhZGF0YSwgZXhjZXB0IHRoYXQgdGhleSBhcmUgaW50ZXJzcGVyc2VkIAorICogIHdpdGggdGhlIE1JREkgY29udGVudCB0aHJvdWdob3V0IHRoZSBmaWxlIGFuZCBhcmUgbm90IGxvY2FsaXplZCBpbiB0aGUgaGVhZGVyLiAKKyAqICBBcyBzdWNoLCBpdCBpcyBuZWNlc3NhcnkgdG8gcmV0cmlldmUgaW5mb3JtYXRpb24gYWJvdXQgdGhlc2UgTWV0YSBFdmVudHMgZnJvbSAKKyAqICB0aGUgZW5naW5lLCBhcyBpdCBlbmNvdW50ZXJzIHRoZXNlIE1ldGEgRXZlbnRzIHdpdGhpbiB0aGUgTUlESSBjb250ZW50LiAKKyAqICBGb3IgZXhhbXBsZSwgU01GIGZpbGVzIGNhbiBoYXZlIHVwIHRvIDE0IHR5cGVzIG9mIE1JREkgTWV0YSBFdmVudHMgKGNvcHlyaWdodCwgCisgKiAgYXV0aG9yLCBkZWZhdWx0IHRlbXBvLCBldGMuKSBzY2F0dGVyZWQgdGhyb3VnaG91dCB0aGUgZmlsZS4gCisgKiAgQGluZ3JvdXAgbWlkaQorICovCit0eXBlZGVmIHN0cnVjdCBPTVhfQVVESU9fQ09ORklHX01JRElNRVRBRVZFTlRUWVBFeyAKKyAgICBPTVhfVTMyIG5TaXplOyAgICAgICAgICAgIC8qKjwgc2l6ZSBvZiB0aGUgc3RydWN0dXJlIGluIGJ5dGVzICovIAorICAgIE9NWF9WRVJTSU9OVFlQRSBuVmVyc2lvbjsgLyoqPCBPTVggc3BlY2lmaWNhdGlvbiB2ZXJzaW9uIGluZm9ybWF0aW9uICovIAorICAgIE9NWF9VMzIgblBvcnRJbmRleDsgICAgICAgLyoqPCBwb3J0IHRoYXQgdGhpcyBzdHJ1Y3R1cmUgYXBwbGllcyB0byAqLyAKKyAgICBPTVhfVTMyIG5JbmRleDsgICAgICAgICAgIC8qKjwgSW5kZXggb2YgTWV0YSBFdmVudCAqLyAKKyAgICBPTVhfVTggbk1ldGFFdmVudFR5cGU7ICAgIC8qKjwgTWV0YSBFdmVudCBUeXBlLCA3Yml0cyAoaS5lLiAwIC0gMTI3KSAqLyAKKyAgICBPTVhfVTMyIG5NZXRhRXZlbnRTaXplOyAgIC8qKjwgc2l6ZSBvZiB0aGUgTWV0YSBFdmVudCBpbiBieXRlcyAqLyAKKyAgICBPTVhfVTMyIG5UcmFjazsgICAgICAgICAgIC8qKjwgdHJhY2sgbnVtYmVyIGZvciB0aGUgbWV0YSBldmVudCAqLworICAgIE9NWF9VMzIgblBvc2l0aW9uOyAgICAgICAgLyoqPCBQb3NpdGlvbiBvZiB0aGUgbWV0YS1ldmVudCBpbiBtaWxsaXNlY29uZHMgKi8KK30gT01YX0FVRElPX0NPTkZJR19NSURJTUVUQUVWRU5UVFlQRTsgCisKKworLyoqIE1JREkgTWV0YSBFdmVudCBEYXRhIHN0cnVjdHVyZSAtIG9uZSBwZXIgTWV0YSBFdmVudC4gCisgKiBAaW5ncm91cCBtaWRpCisgKi8gCit0eXBlZGVmIHN0cnVjdCBPTVhfQVVESU9fQ09ORklHX01JRElNRVRBRVZFTlREQVRBVFlQRXsgCisgICAgT01YX1UzMiBuU2l6ZTsgICAgICAgICAgICAvKio8IHNpemUgb2YgdGhlIHN0cnVjdHVyZSBpbiBieXRlcyAqLyAKKyAgICBPTVhfVkVSU0lPTlRZUEUgblZlcnNpb247IC8qKjwgT01YIHNwZWNpZmljYXRpb24gdmVyc2lvbiBpbmZvcm1hdGlvbiAqLyAKKyAgICBPTVhfVTMyIG5Qb3J0SW5kZXg7ICAgICAgIC8qKjwgcG9ydCB0aGF0IHRoaXMgc3RydWN0dXJlIGFwcGxpZXMgdG8gKi8gCisgICAgT01YX1UzMiBuSW5kZXg7ICAgICAgICAgICAvKio8IEluZGV4IG9mIE1ldGEgRXZlbnQgKi8gCisgICAgT01YX1UzMiBuTWV0YUV2ZW50U2l6ZTsgICAvKio8IHNpemUgb2YgdGhlIE1ldGEgRXZlbnQgaW4gYnl0ZXMgKi8gCisgICAgT01YX1U4IG5EYXRhWzFdOyAgICAgICAgICAvKio8IGFycmF5IG9mIG9uZSBvciBtb3JlIGJ5dGVzIG9mIG1ldGEgZGF0YSAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXMgaW5kaWNhdGVkIGJ5IHRoZSBuTWV0YUV2ZW50U2l6ZSBmaWVsZCAqLyAKK30gT01YX0FVRElPX0NPTkZJR19fTUlESU1FVEFFVkVOVERBVEFUWVBFOyAKKworCisvKiogQXVkaW8gVm9sdW1lIGFkanVzdG1lbnQgZm9yIGEgcG9ydCAqLwordHlwZWRlZiBzdHJ1Y3QgT01YX0FVRElPX0NPTkZJR19WT0xVTUVUWVBFIHsKKyAgICBPTVhfVTMyIG5TaXplOyAgICAgICAgICAgICAgLyoqPCBzaXplIG9mIHRoZSBzdHJ1Y3R1cmUgaW4gYnl0ZXMgKi8KKyAgICBPTVhfVkVSU0lPTlRZUEUgblZlcnNpb247ICAgLyoqPCBPTVggc3BlY2lmaWNhdGlvbiB2ZXJzaW9uIGluZm9ybWF0aW9uICovCisgICAgT01YX1UzMiBuUG9ydEluZGV4OyAgICAgICAgIC8qKjwgUG9ydCBpbmRleCBpbmRpY2F0aW5nIHdoaWNoIHBvcnQgdG8gCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2V0LiAgU2VsZWN0IHRoZSBpbnB1dCBwb3J0IHRvIHNldCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBqdXN0IHRoYXQgcG9ydCdzIHZvbHVtZS4gIFNlbGVjdCB0aGUgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3V0cHV0IHBvcnQgdG8gYWRqdXN0IHRoZSBtYXN0ZXIgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9sdW1lLiAqLworICAgIE9NWF9CT09MIGJMaW5lYXI7ICAgICAgICAgICAvKio8IElzIHRoZSB2b2x1bWUgdG8gYmUgc2V0IGluIGxpbmVhciAoMC4xMDApIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9yIGxvZ2FyaXRobWljIHNjYWxlIChtQikgKi8KKyAgICBPTVhfQlMzMiBzVm9sdW1lOyAgICAgICAgICAgLyoqPCBWb2x1bWUgbGluZWFyIHNldHRpbmcgaW4gdGhlIDAuLjEwMCByYW5nZSwgT1IKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWb2x1bWUgbG9nYXJpdGhtaWMgc2V0dGluZyBmb3IgdGhpcyBwb3J0LiAgVGhlIHZhbHVlcworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvciB2b2x1bWUgYXJlIGluIG1CIChtaWxsaWJlbHMgPSAxLzEwMCBkQikgcmVsYXRpdmUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0byBhIGdhaW4gb2YgMSAoZS5nLiB0aGUgb3V0cHV0IGlzIHRoZSBzYW1lIGFzIHRoZSAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnB1dCBsZXZlbCkuICBWYWx1ZXMgYXJlIGluIG1CIGZyb20gbk1heCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAobWF4aW11bSB2b2x1bWUpIHRvIG5NaW4gbUIgKHR5cGljYWxseSBuZWdhdGl2ZSkuCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU2luY2UgdGhlIHZvbHVtZSBpcyAidm9sdGFnZSIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbmQgbm90IGEgInBvd2VyIiwgaXQgdGFrZXMgYSBzZXR0aW5nIG9mCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLTYwMCBtQiB0byBkZWNyZWFzZSB0aGUgdm9sdW1lIGJ5IDEvMi4gIElmCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYSBjb21wb25lbnQgY2Fubm90IGFjY3VyYXRlbHkgc2V0IHRoZSAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2x1bWUgdG8gdGhlIHJlcXVlc3RlZCB2YWx1ZSwgaXQgbXVzdAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNldCB0aGUgdm9sdW1lIHRvIHRoZSBjbG9zZXN0IHZhbHVlIEJFTE9XCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhlIHJlcXVlc3RlZCB2YWx1ZS4gIFdoZW4gZ2V0dGluZyB0aGUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2x1bWUgc2V0dGluZywgdGhlIGN1cnJlbnQgYWN0dWFsIHZvbHVtZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG11c3QgYmUgcmV0dXJuZWQuICovCit9IE9NWF9BVURJT19DT05GSUdfVk9MVU1FVFlQRTsKKworCisvKiogQXVkaW8gVm9sdW1lIGFkanVzdG1lbnQgZm9yIGEgY2hhbm5lbCAqLwordHlwZWRlZiBzdHJ1Y3QgT01YX0FVRElPX0NPTkZJR19DSEFOTkVMVk9MVU1FVFlQRSB7CisgICAgT01YX1UzMiBuU2l6ZTsgICAgICAgICAgICAgIC8qKjwgc2l6ZSBvZiB0aGUgc3RydWN0dXJlIGluIGJ5dGVzICovCisgICAgT01YX1ZFUlNJT05UWVBFIG5WZXJzaW9uOyAgIC8qKjwgT01YIHNwZWNpZmljYXRpb24gdmVyc2lvbiBpbmZvcm1hdGlvbiAqLworICAgIE9NWF9VMzIgblBvcnRJbmRleDsgICAgICAgICAvKio8IFBvcnQgaW5kZXggaW5kaWNhdGluZyB3aGljaCBwb3J0IHRvIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNldC4gIFNlbGVjdCB0aGUgaW5wdXQgcG9ydCB0byBzZXQgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAganVzdCB0aGF0IHBvcnQncyB2b2x1bWUuICBTZWxlY3QgdGhlIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG91dHB1dCBwb3J0IHRvIGFkanVzdCB0aGUgbWFzdGVyIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvbHVtZS4gKi8KKyAgICBPTVhfVTMyIG5DaGFubmVsOyAgICAgICAgICAgLyoqPCBjaGFubmVsIHRvIHNlbGVjdCBmcm9tIDAgdG8gTi0xLCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1c2luZyBPTVhfQUxMIHRvIGFwcGx5IHZvbHVtZSBzZXR0aW5ncworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRvIGFsbCBjaGFubmVscyAqLworICAgIE9NWF9CT09MIGJMaW5lYXI7ICAgICAgICAgICAvKio8IElzIHRoZSB2b2x1bWUgdG8gYmUgc2V0IGluIGxpbmVhciAoMC4xMDApIG9yIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxvZ2FyaXRobWljIHNjYWxlIChtQikgKi8KKyAgICBPTVhfQlMzMiBzVm9sdW1lOyAgICAgICAgICAgLyoqPCBWb2x1bWUgbGluZWFyIHNldHRpbmcgaW4gdGhlIDAuLjEwMCByYW5nZSwgT1IKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWb2x1bWUgbG9nYXJpdGhtaWMgc2V0dGluZyBmb3IgdGhpcyBwb3J0LiAgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhlIHZhbHVlcyBmb3Igdm9sdW1lIGFyZSBpbiBtQiAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAobWlsbGliZWxzID0gMS8xMDAgZEIpIHJlbGF0aXZlIHRvIGEgZ2FpbgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9mIDEgKGUuZy4gdGhlIG91dHB1dCBpcyB0aGUgc2FtZSBhcyB0aGUgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5wdXQgbGV2ZWwpLiAgVmFsdWVzIGFyZSBpbiBtQiBmcm9tIG5NYXggCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKG1heGltdW0gdm9sdW1lKSB0byBuTWluIG1CICh0eXBpY2FsbHkgbmVnYXRpdmUpLiAgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU2luY2UgdGhlIHZvbHVtZSBpcyAidm9sdGFnZSIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbmQgbm90IGEgInBvd2VyIiwgaXQgdGFrZXMgYSBzZXR0aW5nIG9mCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLTYwMCBtQiB0byBkZWNyZWFzZSB0aGUgdm9sdW1lIGJ5IDEvMi4gIElmCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYSBjb21wb25lbnQgY2Fubm90IGFjY3VyYXRlbHkgc2V0IHRoZSAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2x1bWUgdG8gdGhlIHJlcXVlc3RlZCB2YWx1ZSwgaXQgbXVzdAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNldCB0aGUgdm9sdW1lIHRvIHRoZSBjbG9zZXN0IHZhbHVlIEJFTE9XCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhlIHJlcXVlc3RlZCB2YWx1ZS4gIFdoZW4gZ2V0dGluZyB0aGUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2x1bWUgc2V0dGluZywgdGhlIGN1cnJlbnQgYWN0dWFsIHZvbHVtZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG11c3QgYmUgcmV0dXJuZWQuICovCisgICAgT01YX0JPT0wgYklzTUlESTsgICAgICAgICAgIC8qKjwgVFJVRSBpZiBuQ2hhbm5lbCByZWZlcnMgdG8gYSBNSURJIGNoYW5uZWwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRkFMU0Ugb3RoZXJ3aXNlICovCit9IE9NWF9BVURJT19DT05GSUdfQ0hBTk5FTFZPTFVNRVRZUEU7CisKKworLyoqIEF1ZGlvIGJhbGFuY2Ugc2V0dGluZyAqLwordHlwZWRlZiBzdHJ1Y3QgT01YX0FVRElPX0NPTkZJR19CQUxBTkNFVFlQRSB7CisgICAgT01YX1UzMiBuU2l6ZTsgICAgICAgICAgICAgIC8qKjwgc2l6ZSBvZiB0aGUgc3RydWN0dXJlIGluIGJ5dGVzICovCisgICAgT01YX1ZFUlNJT05UWVBFIG5WZXJzaW9uOyAgIC8qKjwgT01YIHNwZWNpZmljYXRpb24gdmVyc2lvbiBpbmZvcm1hdGlvbiAqLworICAgIE9NWF9VMzIgblBvcnRJbmRleDsgICAgICAgICAvKio8IFBvcnQgaW5kZXggaW5kaWNhdGluZyB3aGljaCBwb3J0IHRvIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNldC4gIFNlbGVjdCB0aGUgaW5wdXQgcG9ydCB0byBzZXQgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAganVzdCB0aGF0IHBvcnQncyBiYWxhbmNlLiAgU2VsZWN0IHRoZSAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvdXRwdXQgcG9ydCB0byBhZGp1c3QgdGhlIG1hc3RlciAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiYWxhbmNlLiAqLworICAgIE9NWF9TMzIgbkJhbGFuY2U7ICAgICAgICAgICAvKio8IGJhbGFuY2Ugc2V0dGluZyBmb3IgdGhpcyBwb3J0IAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgtMTAwIHRvIDEwMCwgd2hlcmUgLTEwMCBpbmRpY2F0ZXMKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbGwgbGVmdCwgYW5kIG5vIHJpZ2h0ICovCit9IE9NWF9BVURJT19DT05GSUdfQkFMQU5DRVRZUEU7CisKKworLyoqIEF1ZGlvIFBvcnQgbXV0ZSAqLwordHlwZWRlZiBzdHJ1Y3QgT01YX0FVRElPX0NPTkZJR19NVVRFVFlQRSB7CisgICAgT01YX1UzMiBuU2l6ZTsgICAgICAgICAgICAgIC8qKjwgc2l6ZSBvZiB0aGUgc3RydWN0dXJlIGluIGJ5dGVzICovCisgICAgT01YX1ZFUlNJT05UWVBFIG5WZXJzaW9uOyAgIC8qKjwgT01YIHNwZWNpZmljYXRpb24gdmVyc2lvbiBpbmZvcm1hdGlvbiAqLworICAgIE9NWF9VMzIgblBvcnRJbmRleDsgICAgICAgICAvKio8IFBvcnQgaW5kZXggaW5kaWNhdGluZyB3aGljaCBwb3J0IHRvIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNldC4gIFNlbGVjdCB0aGUgaW5wdXQgcG9ydCB0byBzZXQgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAganVzdCB0aGF0IHBvcnQncyBtdXRlLiAgU2VsZWN0IHRoZSAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvdXRwdXQgcG9ydCB0byBhZGp1c3QgdGhlIG1hc3RlciAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtdXRlLiAqLworICAgIE9NWF9CT09MIGJNdXRlOyAgICAgICAgICAgICAvKio8IE11dGUgc2V0dGluZyBmb3IgdGhpcyBwb3J0ICovCit9IE9NWF9BVURJT19DT05GSUdfTVVURVRZUEU7CisKKworLyoqIEF1ZGlvIENoYW5uZWwgbXV0ZSAqLwordHlwZWRlZiBzdHJ1Y3QgT01YX0FVRElPX0NPTkZJR19DSEFOTkVMTVVURVRZUEUgeworICAgIE9NWF9VMzIgblNpemU7ICAgICAgICAgICAgICAvKio8IHNpemUgb2YgdGhlIHN0cnVjdHVyZSBpbiBieXRlcyAqLworICAgIE9NWF9WRVJTSU9OVFlQRSBuVmVyc2lvbjsgICAvKio8IE9NWCBzcGVjaWZpY2F0aW9uIHZlcnNpb24gaW5mb3JtYXRpb24gKi8KKyAgICBPTVhfVTMyIG5Qb3J0SW5kZXg7ICAgICAgICAgLyoqPCBwb3J0IHRoYXQgdGhpcyBzdHJ1Y3R1cmUgYXBwbGllcyB0byAqLworICAgIE9NWF9VMzIgbkNoYW5uZWw7ICAgICAgICAgICAvKio8IGNoYW5uZWwgdG8gc2VsZWN0IGZyb20gMCB0byBOLTEsIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVzaW5nIE9NWF9BTEwgdG8gYXBwbHkgbXV0ZSBzZXR0aW5ncworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRvIGFsbCBjaGFubmVscyAqLworICAgIE9NWF9CT09MIGJNdXRlOyAgICAgICAgICAgICAvKio8IE11dGUgc2V0dGluZyBmb3IgdGhpcyBjaGFubmVsICovCisgICAgT01YX0JPT0wgYklzTUlESTsgICAgICAgICAgIC8qKjwgVFJVRSBpZiBuQ2hhbm5lbCByZWZlcnMgdG8gYSBNSURJIGNoYW5uZWwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRkFMU0Ugb3RoZXJ3aXNlICovIAorfSBPTVhfQVVESU9fQ09ORklHX0NIQU5ORUxNVVRFVFlQRTsKKworCisKKy8qKiBFbmFibGUgLyBEaXNhYmxlIGZvciBsb3VkbmVzcyBjb250cm9sLCB3aGljaCBib29zdHMgYmFzcyBhbmQgdG8gYSAKKyAqICBzbWFsbGVyIGV4dGVudCBoaWdoIGVuZCBmcmVxdWVuY2llcyB0byBjb21wZW5zYXRlIGZvciBoZWFyaW5nCisgKiAgYWJpbGl0eSBhdCB0aGUgZXh0cmVtZSBlbmRzIG9mIHRoZSBhdWRpbyBzcGVjdHJ1bQorICovIAordHlwZWRlZiBzdHJ1Y3QgT01YX0FVRElPX0NPTkZJR19MT1VETkVTU1RZUEUgeworICAgIE9NWF9VMzIgblNpemU7ICAgICAgICAgICAgIC8qKjwgc2l6ZSBvZiB0aGUgc3RydWN0dXJlIGluIGJ5dGVzICovCisgICAgT01YX1ZFUlNJT05UWVBFIG5WZXJzaW9uOyAgLyoqPCBPTVggc3BlY2lmaWNhdGlvbiB2ZXJzaW9uIGluZm9ybWF0aW9uICovCisgICAgT01YX1UzMiBuUG9ydEluZGV4OyAgICAgICAgLyoqPCBwb3J0IHRoYXQgdGhpcyBzdHJ1Y3R1cmUgYXBwbGllcyB0byAqLworICAgIE9NWF9CT09MIGJMb3VkbmVzczsgICAgICAgIC8qKjwgRW5hYmxlL2Rpc2FibGUgZm9yIGxvdWRuZXNzICovCit9IE9NWF9BVURJT19DT05GSUdfTE9VRE5FU1NUWVBFOworCisKKy8qKiBFbmFibGUgLyBEaXNhYmxlIGZvciBiYXNzLCB3aGljaCBjb250cm9scyBsb3cgZnJlcXVlbmNpZXMKKyAqLyAKK3R5cGVkZWYgc3RydWN0IE9NWF9BVURJT19DT05GSUdfQkFTU1RZUEUgeworICAgIE9NWF9VMzIgblNpemU7ICAgICAgICAgICAgIC8qKjwgc2l6ZSBvZiB0aGUgc3RydWN0dXJlIGluIGJ5dGVzICovCisgICAgT01YX1ZFUlNJT05UWVBFIG5WZXJzaW9uOyAgLyoqPCBPTVggc3BlY2lmaWNhdGlvbiB2ZXJzaW9uIGluZm9ybWF0aW9uICovCisgICAgT01YX1UzMiBuUG9ydEluZGV4OyAgICAgICAgLyoqPCBwb3J0IHRoYXQgdGhpcyBzdHJ1Y3R1cmUgYXBwbGllcyB0byAqLworICAgIE9NWF9CT09MIGJFbmFibGU7ICAgICAgICAgIC8qKjwgRW5hYmxlL2Rpc2FibGUgZm9yIGJhc3MgY29udHJvbCAqLworICAgIE9NWF9TMzIgbkJhc3M7ICAgICAgICAgICAgIC8qKjwgYmFzcyBzZXR0aW5nIGZvciB0aGUgcG9ydCwgYXMgYSAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVvdXMgdmFsdWUgZnJvbSAtMTAwIHRvIDEwMCAgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoMCBtZWFucyBubyBjaGFuZ2UgaW4gYmFzcyBsZXZlbCkqLworfSBPTVhfQVVESU9fQ09ORklHX0JBU1NUWVBFOworCisKKy8qKiBFbmFibGUgLyBEaXNhYmxlIGZvciB0cmVibGUsIHdoaWNoIGNvbnRyb2xzIGhpZ2ggZnJlcXVlbmNpZXMgdG9uZXMKKyAqLyAKK3R5cGVkZWYgc3RydWN0IE9NWF9BVURJT19DT05GSUdfVFJFQkxFVFlQRSB7CisgICAgT01YX1UzMiBuU2l6ZTsgICAgICAgICAgICAgLyoqPCBzaXplIG9mIHRoZSBzdHJ1Y3R1cmUgaW4gYnl0ZXMgKi8KKyAgICBPTVhfVkVSU0lPTlRZUEUgblZlcnNpb247ICAvKio8IE9NWCBzcGVjaWZpY2F0aW9uIHZlcnNpb24gaW5mb3JtYXRpb24gKi8KKyAgICBPTVhfVTMyIG5Qb3J0SW5kZXg7ICAgICAgICAvKio8IHBvcnQgdGhhdCB0aGlzIHN0cnVjdHVyZSBhcHBsaWVzIHRvICovCisgICAgT01YX0JPT0wgYkVuYWJsZTsgICAgICAgICAgLyoqPCBFbmFibGUvZGlzYWJsZSBmb3IgdHJlYmxlIGNvbnRyb2wgKi8KKyAgICBPTVhfUzMyICBuVHJlYmxlOyAgICAgICAgICAvKio8IHRyZWJsZSBzZXR0aW5nIGZvciB0aGUgcG9ydCwgYXMgYQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29udGludW91cyB2YWx1ZSBmcm9tIC0xMDAgdG8gMTAwICAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgwIG1lYW5zIG5vIGNoYW5nZSBpbiB0cmVibGUgbGV2ZWwpICovCit9IE9NWF9BVURJT19DT05GSUdfVFJFQkxFVFlQRTsKKworCisvKiogQW4gZXF1YWxpemVyIGlzIHR5cGljYWxseSB1c2VkIGZvciB0d28gcmVhc29uczogdG8gY29tcGVuc2F0ZSBmb3IgYW4gCisgKiAgc3ViLW9wdGltYWwgZnJlcXVlbmN5IHJlc3BvbnNlIG9mIGEgc3lzdGVtIHRvIG1ha2UgaXQgc291bmQgbW9yZSBuYXR1cmFsIAorICogIG9yIHRvIGNyZWF0ZSBpbnRlbnRpb25hbGx5IHNvbWUgdW5uYXR1cmFsIGNvbG9yaW5nIHRvIHRoZSBzb3VuZCB0byBjcmVhdGUKKyAqICBhbiBlZmZlY3QuCisgKiAgQGluZ3JvdXAgZWZmZWN0cworICovCit0eXBlZGVmIHN0cnVjdCBPTVhfQVVESU9fQ09ORklHX0VRVUFMSVpFUlRZUEUgeworICAgIE9NWF9VMzIgblNpemU7ICAgICAgICAgICAgIC8qKjwgc2l6ZSBvZiB0aGUgc3RydWN0dXJlIGluIGJ5dGVzICovCisgICAgT01YX1ZFUlNJT05UWVBFIG5WZXJzaW9uOyAgLyoqPCBPTVggc3BlY2lmaWNhdGlvbiB2ZXJzaW9uIGluZm9ybWF0aW9uICovCisgICAgT01YX1UzMiBuUG9ydEluZGV4OyAgICAgICAgLyoqPCBwb3J0IHRoYXQgdGhpcyBzdHJ1Y3R1cmUgYXBwbGllcyB0byAqLworICAgIE9NWF9CT09MIGJFbmFibGU7ICAgICAgICAgIC8qKjwgRW5hYmxlL2Rpc2FibGUgZm9yIGVxdWFsaXplciAqLworICAgIE9NWF9CVTMyIHNCYW5kSW5kZXg7ICAgICAgIC8qKjwgQmFuZCBudW1iZXIgdG8gYmUgc2V0LiAgVXBwZXIgTGltaXQgaXMgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOLTEsIHdoZXJlIE4gaXMgdGhlIG51bWJlciBvZiBiYW5kcywgbG93ZXIgbGltaXQgaXMgMCAqLworICAgIE9NWF9CVTMyIHNDZW50ZXJGcmVxOyAgICAgIC8qKjwgQ2VudGVyIGZyZXF1ZWNpZXMgaW4gSHouICBUaGlzIGlzIGEKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlYWQgb25seSBlbGVtZW50IGFuZCBpcyB1c2VkIHRvIGRldGVybWluZSAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoZSBsb3dlciwgY2VudGVyIGFuZCB1cHBlciBmcmVxdWVuY3kgb2YgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzIGJhbmQuICAqLworICAgIE9NWF9CUzMyIHNCYW5kTGV2ZWw7ICAgICAgIC8qKjwgYmFuZCBsZXZlbCBpbiBtaWxsaWJlbHMgKi8KK30gT01YX0FVRElPX0NPTkZJR19FUVVBTElaRVJUWVBFOworCisKKy8qKiBTdGVyZW8gd2lkZW5pbmcgbW9kZSB0eXBlIAorICogQGluZ3JvdXAgZWZmZWN0cworICovIAordHlwZWRlZiBlbnVtIE9NWF9BVURJT19TVEVSRU9XSURFTklOR1RZUEUgeworICAgIE9NWF9BVURJT19TdGVyZW9XaWRlbmluZ0hlYWRwaG9uZXMsICAgIC8qKjwgU3RlcmVvIHdpZGVuaW5nIGZvciBsb3Vkc3BlYWtlcnMgKi8KKyAgICBPTVhfQVVESU9fU3RlcmVvV2lkZW5pbmdMb3Vkc3BlYWtlcnMsICAvKio8IFN0ZXJlbyB3aWRlbmluZyBmb3IgY2xvc2VseSBzcGFjZWQgbG91ZHNwZWFrZXJzICovCisgICAgT01YX0FVRElPX1N0ZXJlb1dpZGVuaW5nS2hyb25vc0V4dGVuc2lvbnMgPSAweDZGMDAwMDAwLCAvKio8IFJlc2VydmVkIHJlZ2lvbiBmb3IgaW50cm9kdWNpbmcgS2hyb25vcyBTdGFuZGFyZCBFeHRlbnNpb25zICovIAorICAgIE9NWF9BVURJT19TdGVyZW9XaWRlbmluZ1ZlbmRvclN0YXJ0VW51c2VkID0gMHg3RjAwMDAwMCwgLyoqPCBSZXNlcnZlZCByZWdpb24gZm9yIGludHJvZHVjaW5nIFZlbmRvciBFeHRlbnNpb25zICovCisgICAgT01YX0FVRElPX1N0ZXJlb1dpZGVuaW5nTWF4ID0gMHg3RkZGRkZGRgorfSBPTVhfQVVESU9fU1RFUkVPV0lERU5JTkdUWVBFOworCisKKy8qKiBDb250cm9sIGZvciBzdGVyZW8gd2lkZW5pbmcsIHdoaWNoIGlzIGEgc3BlY2lhbCAyLWNoYW5uZWwKKyAqICBjYXNlIG9mIHRoZSBhdWRpbyB2aXJ0dWFsaXplciBlZmZlY3QuIEZvciBleGFtcGxlLCBmb3IgNS4xLWNoYW5uZWwgCisgKiAgb3V0cHV0LCBpdCB0cmFuc2xhdGVzIHRvIHZpcnR1YWwgc3Vycm91bmQgc291bmQuIAorICogQGluZ3JvdXAgZWZmZWN0cworICovIAordHlwZWRlZiBzdHJ1Y3QgT01YX0FVRElPX0NPTkZJR19TVEVSRU9XSURFTklOR1RZUEUgeworICAgIE9NWF9VMzIgblNpemU7ICAgICAgICAgICAgIC8qKjwgc2l6ZSBvZiB0aGUgc3RydWN0dXJlIGluIGJ5dGVzICovCisgICAgT01YX1ZFUlNJT05UWVBFIG5WZXJzaW9uOyAgLyoqPCBPTVggc3BlY2lmaWNhdGlvbiB2ZXJzaW9uIGluZm9ybWF0aW9uICovCisgICAgT01YX1UzMiBuUG9ydEluZGV4OyAgICAgICAgLyoqPCBwb3J0IHRoYXQgdGhpcyBzdHJ1Y3R1cmUgYXBwbGllcyB0byAqLworICAgIE9NWF9CT09MIGJFbmFibGU7ICAgICAgICAgIC8qKjwgRW5hYmxlL2Rpc2FibGUgZm9yIHN0ZXJlbyB3aWRlbmluZyBjb250cm9sICovCisgICAgT01YX0FVRElPX1NURVJFT1dJREVOSU5HVFlQRSBlV2lkZW5pbmdUeXBlOyAvKio8IFN0ZXJlbyB3aWRlbmluZyBhbGdvcml0aG0gdHlwZSAqLworICAgIE9NWF9VMzIgIG5TdGVyZW9XaWRlbmluZzsgIC8qKjwgc3RlcmVvIHdpZGVuaW5nIHNldHRpbmcgZm9yIHRoZSBwb3J0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXMgYSBjb250aW51b3VzIHZhbHVlIGZyb20gMCB0byAxMDAgICovCit9IE9NWF9BVURJT19DT05GSUdfU1RFUkVPV0lERU5JTkdUWVBFOworCisKKy8qKiBUaGUgY2hvcnVzIGVmZmVjdCAob3IgYGBjaG9yYWxpemVyJycpIGlzIGFueSBzaWduYWwgcHJvY2Vzc29yIHdoaWNoIG1ha2VzCisgKiAgb25lIHNvdW5kIHNvdXJjZSAoc3VjaCBhcyBhIHZvaWNlKSBzb3VuZCBsaWtlIG1hbnkgc3VjaCBzb3VyY2VzIHNpbmdpbmcgCisgKiAgKG9yIHBsYXlpbmcpIGluIHVuaXNvbi4gU2luY2UgcGVyZm9ybWFuY2UgaW4gdW5pc29uIGlzIG5ldmVyIGV4YWN0LCBjaG9ydXMgCisgKiAgZWZmZWN0cyBzaW11bGF0ZSB0aGlzIGJ5IG1ha2luZyBpbmRlcGVuZGVudGx5IG1vZGlmaWVkIGNvcGllcyBvZiB0aGUgaW5wdXQgCisgKiAgc2lnbmFsLiBNb2RpZmljYXRpb25zIG1heSBpbmNsdWRlICgxKSBkZWxheSwgKDIpIGZyZXF1ZW5jeSBzaGlmdCwgYW5kIAorICogICgzKSBhbXBsaXR1ZGUgbW9kdWxhdGlvbi4KKyAqIEBpbmdyb3VwIGVmZmVjdHMKKyAqLwordHlwZWRlZiBzdHJ1Y3QgT01YX0FVRElPX0NPTkZJR19DSE9SVVNUWVBFIHsKKyAgICBPTVhfVTMyIG5TaXplOyAgICAgICAgICAgICAvKio8IHNpemUgb2YgdGhlIHN0cnVjdHVyZSBpbiBieXRlcyAqLworICAgIE9NWF9WRVJTSU9OVFlQRSBuVmVyc2lvbjsgIC8qKjwgT01YIHNwZWNpZmljYXRpb24gdmVyc2lvbiBpbmZvcm1hdGlvbiAqLworICAgIE9NWF9VMzIgblBvcnRJbmRleDsgICAgICAgIC8qKjwgcG9ydCB0aGF0IHRoaXMgc3RydWN0dXJlIGFwcGxpZXMgdG8gKi8KKyAgICBPTVhfQk9PTCBiRW5hYmxlOyAgICAgICAgICAvKio8IEVuYWJsZS9kaXNhYmxlIGZvciBjaG9ydXMgKi8KKyAgICBPTVhfQlUzMiBzRGVsYXk7ICAgICAgICAgICAvKio8IGF2ZXJhZ2UgZGVsYXkgaW4gbWlsbGlzZWNvbmRzICovCisgICAgT01YX0JVMzIgc01vZHVsYXRpb25SYXRlOyAgLyoqPCByYXRlIG9mIG1vZHVsYXRpb24gaW4gbWlsbGloZXJ0eiAqLworICAgIE9NWF9VMzIgbk1vZHVsYXRpb25EZXB0aDsgIC8qKjwgZGVwdGggb2YgbW9kdWxhdGlvbiBhcyBhIHBlcmNlbnRhZ2Ugb2YgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZWxheSAoaS5lLiAwIHRvIDEwMCkgKi8KKyAgICBPTVhfQlUzMiBuRmVlZGJhY2s7ICAgICAgICAvKio8IEZlZWRiYWNrIGZyb20gY2hvcnVzIG91dHB1dCB0byBpbnB1dCBpbiBwZXJjZW50YWdlICovCit9IE9NWF9BVURJT19DT05GSUdfQ0hPUlVTVFlQRTsKKworCisvKiogUmV2ZXJiZXJhdGlvbiBpcyBwYXJ0IG9mIHRoZSByZWZsZWN0ZWQgc291bmQgdGhhdCBmb2xsb3dzIHRoZSBlYXJseSAKKyAqICByZWZsZWN0aW9ucy4gSW4gYSB0eXBpY2FsIHJvb20sIHRoaXMgY29uc2lzdHMgb2YgYSBkZW5zZSBzdWNjZXNzaW9uIG9mIAorICogIGVjaG9lcyB3aG9zZSBlbmVyZ3kgZGVjYXlzIGV4cG9uZW50aWFsbHkuIFRoZSByZXZlcmJlcmF0aW9uIGVmZmVjdCBzdHJ1Y3R1cmUgCisgKiAgYXMgZGVmaW5lZCBoZXJlIGluY2x1ZGVzIGJvdGggKGVhcmx5KSByZWZsZWN0aW9ucyBhcyB3ZWxsIGFzIChsYXRlKSByZXZlcmJlcmF0aW9ucy4gCisgKiBAaW5ncm91cCBlZmZlY3RzCisgKi8KK3R5cGVkZWYgc3RydWN0IE9NWF9BVURJT19DT05GSUdfUkVWRVJCRVJBVElPTlRZUEUgeworICAgIE9NWF9VMzIgblNpemU7ICAgICAgICAgICAgICAgIC8qKjwgc2l6ZSBvZiB0aGUgc3RydWN0dXJlIGluIGJ5dGVzICovCisgICAgT01YX1ZFUlNJT05UWVBFIG5WZXJzaW9uOyAgICAgLyoqPCBPTVggc3BlY2lmaWNhdGlvbiB2ZXJzaW9uIGluZm9ybWF0aW9uICovCisgICAgT01YX1UzMiBuUG9ydEluZGV4OyAgICAgICAgICAgLyoqPCBwb3J0IHRoYXQgdGhpcyBzdHJ1Y3R1cmUgYXBwbGllcyB0byAqLworICAgIE9NWF9CT09MIGJFbmFibGU7ICAgICAgICAgICAgIC8qKjwgRW5hYmxlL2Rpc2FibGUgZm9yIHJldmVyYmVyYXRpb24gY29udHJvbCAqLworICAgIE9NWF9CUzMyIHNSb29tTGV2ZWw7ICAgICAgICAgIC8qKjwgSW50ZW5zaXR5IGxldmVsIGZvciB0aGUgd2hvbGUgcm9vbSBlZmZlY3QgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoaS5lLiBib3RoIGVhcmx5IHJlZmxlY3Rpb25zIGFuZCBsYXRlIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV2ZXJiZXJhdGlvbikgaW4gbWlsbGliZWxzICovCisgICAgT01YX0JTMzIgc1Jvb21IaWdoRnJlcUxldmVsOyAgLyoqPCBBdHRlbnVhdGlvbiBhdCBoaWdoIGZyZXF1ZW5jaWVzCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWxhdGl2ZSB0byB0aGUgaW50ZW5zaXR5IGF0IGxvdworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnJlcXVlbmNpZXMgaW4gbWlsbGliZWxzICovCisgICAgT01YX0JTMzIgc1JlZmxlY3Rpb25zTGV2ZWw7ICAgLyoqPCBJbnRlbnNpdHkgbGV2ZWwgb2YgZWFybHkgcmVmbGVjdGlvbnMKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChyZWxhdGl2ZSB0byByb29tIHZhbHVlKSwgaW4gbWlsbGliZWxzICovCisgICAgT01YX0JVMzIgc1JlZmxlY3Rpb25zRGVsYXk7ICAgLyoqPCBEZWxheSB0aW1lIG9mIHRoZSBmaXJzdCByZWZsZWN0aW9uIHJlbGF0aXZlIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdG8gdGhlIGRpcmVjdCBwYXRoLCBpbiBtaWxsaXNlY29uZHMgKi8KKyAgICBPTVhfQlMzMiBzUmV2ZXJiTGV2ZWw7ICAgICAgICAvKio8IEludGVuc2l0eSBsZXZlbCBvZiBsYXRlIHJldmVyYmVyYXRpb24KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlbGF0aXZlIHRvIHJvb20gbGV2ZWwsIGluIG1pbGxpYmVscyAqLworICAgIE9NWF9CVTMyIHNSZXZlcmJEZWxheTsgICAgICAgIC8qKjwgVGltZSBkZWxheSBmcm9tIHRoZSBmaXJzdCBlYXJseSByZWZsZWN0aW9uIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdG8gdGhlIGJlZ2lubmluZyBvZiB0aGUgbGF0ZSByZXZlcmJlcmF0aW9uIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VjdGlvbiwgaW4gbWlsbGlzZWNvbmRzICovCisgICAgT01YX0JVMzIgc0RlY2F5VGltZTsgICAgICAgICAgLyoqPCBMYXRlIHJldmVyYmVyYXRpb24gZGVjYXkgdGltZSBhdCBsb3cKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZyZXF1ZW5jaWVzLCBpbiBtaWxsaXNlY29uZHMgKi8KKyAgICBPTVhfQlUzMiBuRGVjYXlIaWdoRnJlcVJhdGlvOyAvKio8IFJhdGlvIG9mIGhpZ2ggZnJlcXVlbmN5IGRlY2F5IHRpbWUgcmVsYXRpdmUgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0byBsb3cgZnJlcXVlbmN5IGRlY2F5IHRpbWUgaW4gcGVyY2VudCAgKi8KKyAgICBPTVhfVTMyIG5EZW5zaXR5OyAgICAgICAgICAgICAvKio8IE1vZGFsIGRlbnNpdHkgaW4gdGhlIGxhdGUgcmV2ZXJiZXJhdGlvbiBkZWNheSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluIHBlcmNlbnQgKGkuZS4gMCAtIDEwMCkgKi8KKyAgICBPTVhfVTMyIG5EaWZmdXNpb247ICAgICAgICAgICAvKio8IEVjaG8gZGVuc2l0eSBpbiB0aGUgbGF0ZSByZXZlcmJlcmF0aW9uIGRlY2F5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW4gcGVyY2VudCAoaS5lLiAwIC0gMTAwKSAqLworICAgIE9NWF9CVTMyIHNSZWZlcmVuY2VIaWdoRnJlcTsgIC8qKjwgUmVmZXJlbmNlIGhpZ2ggZnJlcXVlbmN5IGluIEhlcnR6LiBUaGlzIGlzIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhlIGZyZXF1ZW5jeSB1c2VkIGFzIHRoZSByZWZlcmVuY2UgZm9yIGFsbCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoZSBoaWdoLWZyZXF1ZW5jeSBzZXR0aW5ncyBhYm92ZSAqLworCit9IE9NWF9BVURJT19DT05GSUdfUkVWRVJCRVJBVElPTlRZUEU7CisKKworLyoqIFBvc3NpYmxlIHNldHRpbmdzIGZvciB0aGUgRWNobyBDYW5jZWxhdGlvbiBzdHJ1Y3R1cmUgdG8gdXNlIAorICogQGluZ3JvdXAgZWZmZWN0cworICovCit0eXBlZGVmIGVudW0gT01YX0FVRElPX0VDSE9DQU5UWVBFIHsKKyAgIE9NWF9BVURJT19FY2hvQ2FuT2ZmID0gMCwgICAgLyoqPCBFY2hvIENhbmNlbGxhdGlvbiBpcyBkaXNhYmxlZCAqLworICAgT01YX0FVRElPX0VjaG9DYW5Ob3JtYWwsICAgICAvKio8IEVjaG8gQ2FuY2VsbGF0aW9uIG5vcm1hbCBvcGVyYXRpb24gLSAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlY2hvIGZyb20gcGxhc3RpY3MgYW5kIGZhY2UgKi8KKyAgIE9NWF9BVURJT19FY2hvQ2FuSEZyZWUsICAgICAgLyoqPCBFY2hvIENhbmNlbGxhdGlvbiBvcHRpbWl6ZWQgZm9yIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEhhbmRzIEZyZWUgb3BlcmF0aW9uICovCisgICBPTVhfQVVESU9fRWNob0NhbkNhcktpdCwgICAgLyoqPCBFY2hvIENhbmNlbGxhdGlvbiBvcHRpbWl6ZWQgZm9yIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENhciBLaXQgKGxvbmdlciBlY2hvKSAqLworICAgT01YX0FVRElPX0VjaG9DYW5LaHJvbm9zRXh0ZW5zaW9ucyA9IDB4NkYwMDAwMDAsIC8qKjwgUmVzZXJ2ZWQgcmVnaW9uIGZvciBpbnRyb2R1Y2luZyBLaHJvbm9zIFN0YW5kYXJkIEV4dGVuc2lvbnMgKi8gCisgICBPTVhfQVVESU9fRWNob0NhblZlbmRvclN0YXJ0VW51c2VkID0gMHg3RjAwMDAwMCwgLyoqPCBSZXNlcnZlZCByZWdpb24gZm9yIGludHJvZHVjaW5nIFZlbmRvciBFeHRlbnNpb25zICovCisgICBPTVhfQVVESU9fRWNob0Nhbk1heCA9IDB4N0ZGRkZGRkYKK30gT01YX0FVRElPX0VDSE9DQU5UWVBFOworCisKKy8qKiBFbmFibGUgLyBEaXNhYmxlIGZvciBlY2hvIGNhbmNlbGF0aW9uLCB3aGljaCByZW1vdmVzIHVuZGVzaXJlZCBlY2hvJ3MKKyAqICBmcm9tIHRoZSBhdWRpbworICogQGluZ3JvdXAgZWZmZWN0cworICovIAordHlwZWRlZiBzdHJ1Y3QgT01YX0FVRElPX0NPTkZJR19FQ0hPQ0FOQ0VMQVRJT05UWVBFIHsKKyAgICBPTVhfVTMyIG5TaXplOyAgICAgICAgICAgICAvKio8IHNpemUgb2YgdGhlIHN0cnVjdHVyZSBpbiBieXRlcyAqLworICAgIE9NWF9WRVJTSU9OVFlQRSBuVmVyc2lvbjsgIC8qKjwgT01YIHNwZWNpZmljYXRpb24gdmVyc2lvbiBpbmZvcm1hdGlvbiAqLworICAgIE9NWF9VMzIgblBvcnRJbmRleDsgICAgICAgIC8qKjwgcG9ydCB0aGF0IHRoaXMgc3RydWN0dXJlIGFwcGxpZXMgdG8gKi8KKyAgICBPTVhfQVVESU9fRUNIT0NBTlRZUEUgZUVjaG9DYW5jZWxhdGlvbjsgLyoqPCBFY2hvIGNhbmNlbGF0aW9uIHNldHRpbmdzICovCit9IE9NWF9BVURJT19DT05GSUdfRUNIT0NBTkNFTEFUSU9OVFlQRTsKKworCisvKiogRW5hYmxlIC8gRGlzYWJsZSBmb3Igbm9pc2UgcmVkdWN0aW9uLCB3aGljaCB1bmRlc2lyZWQgbm9pc2UgZnJvbQorICogdGhlIGF1ZGlvCisgKiBAaW5ncm91cCBlZmZlY3RzCisgKi8gCit0eXBlZGVmIHN0cnVjdCBPTVhfQVVESU9fQ09ORklHX05PSVNFUkVEVUNUSU9OVFlQRSB7CisgICAgT01YX1UzMiBuU2l6ZTsgICAgICAgICAgICAgLyoqPCBzaXplIG9mIHRoZSBzdHJ1Y3R1cmUgaW4gYnl0ZXMgKi8KKyAgICBPTVhfVkVSU0lPTlRZUEUgblZlcnNpb247ICAvKio8IE9NWCBzcGVjaWZpY2F0aW9uIHZlcnNpb24gaW5mb3JtYXRpb24gKi8KKyAgICBPTVhfVTMyIG5Qb3J0SW5kZXg7ICAgICAgICAvKio8IHBvcnQgdGhhdCB0aGlzIHN0cnVjdHVyZSBhcHBsaWVzIHRvICovCisgICAgT01YX0JPT0wgYk5vaXNlUmVkdWN0aW9uOyAgLyoqPCBFbmFibGUvZGlzYWJsZSBmb3Igbm9pc2UgcmVkdWN0aW9uICovCit9IE9NWF9BVURJT19DT05GSUdfTk9JU0VSRURVQ1RJT05UWVBFOworCisvKiogQH0gKi8KKworI2lmZGVmIF9fY3BsdXNwbHVzCit9CisjZW5kaWYgLyogX19jcGx1c3BsdXMgKi8KKworI2VuZGlmCisvKiBGaWxlIEVPRiAqLworCmRpZmYgLS1naXQgYS9leHlub3M0L211bHRpbWVkaWEvb3Blbm1heC9zZWNfb214L2luY2x1ZGUva2hyb25vcy9PTVhfQ29tcG9uZW50LmggYi9leHlub3M0L211bHRpbWVkaWEvb3Blbm1heC9zZWNfb214L2luY2x1ZGUva2hyb25vcy9PTVhfQ29tcG9uZW50LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDU5NTY0MAotLS0gL2Rldi9udWxsCisrKyBiL2V4eW5vczQvbXVsdGltZWRpYS9vcGVubWF4L3NlY19vbXgvaW5jbHVkZS9raHJvbm9zL09NWF9Db21wb25lbnQuaApAQCAtMCwwICsxLDU3OSBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAwOCBUaGUgS2hyb25vcyBHcm91cCBJbmMuIAorICogCisgKiBQZXJtaXNzaW9uIGlzIGhlcmVieSBncmFudGVkLCBmcmVlIG9mIGNoYXJnZSwgdG8gYW55IHBlcnNvbiBvYnRhaW5pbmcKKyAqIGEgY29weSBvZiB0aGlzIHNvZnR3YXJlIGFuZCBhc3NvY2lhdGVkIGRvY3VtZW50YXRpb24gZmlsZXMgKHRoZQorICogIlNvZnR3YXJlIiksIHRvIGRlYWwgaW4gdGhlIFNvZnR3YXJlIHdpdGhvdXQgcmVzdHJpY3Rpb24sIGluY2x1ZGluZworICogd2l0aG91dCBsaW1pdGF0aW9uIHRoZSByaWdodHMgdG8gdXNlLCBjb3B5LCBtb2RpZnksIG1lcmdlLCBwdWJsaXNoLAorICogZGlzdHJpYnV0ZSwgc3VibGljZW5zZSwgYW5kL29yIHNlbGwgY29waWVzIG9mIHRoZSBTb2Z0d2FyZSwgYW5kIHRvCisgKiBwZXJtaXQgcGVyc29ucyB0byB3aG9tIHRoZSBTb2Z0d2FyZSBpcyBmdXJuaXNoZWQgdG8gZG8gc28sIHN1YmplY3QKKyAqIHRvIHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczogCisgKiBUaGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBzaGFsbCBiZSBpbmNsdWRlZAorICogaW4gYWxsIGNvcGllcyBvciBzdWJzdGFudGlhbCBwb3J0aW9ucyBvZiB0aGUgU29mdHdhcmUuIAorICogCisgKiBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiwgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgRVhQUkVTUworICogT1IgSU1QTElFRCwgSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRCBUTyBUSEUgV0FSUkFOVElFUyBPRgorICogTUVSQ0hBTlRBQklMSVRZLCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQgTk9OSU5GUklOR0VNRU5ULgorICogSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFVVEhPUlMgT1IgQ09QWVJJR0hUIEhPTERFUlMgQkUgTElBQkxFIEZPUiBBTlkKKyAqIENMQUlNLCBEQU1BR0VTIE9SIE9USEVSIExJQUJJTElUWSwgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsCisgKiBUT1JUIE9SIE9USEVSV0lTRSwgQVJJU0lORyBGUk9NLCBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRQorICogU09GVFdBUkUgT1IgVEhFIFVTRSBPUiBPVEhFUiBERUFMSU5HUyBJTiBUSEUgU09GVFdBUkUuIAorICoKKyAqLworCisvKiogT01YX0NvbXBvbmVudC5oIC0gT3Blbk1heCBJTCB2ZXJzaW9uIDEuMS4yCisgKiAgVGhlIE9NWF9Db21wb25lbnQgaGVhZGVyIGZpbGUgY29udGFpbnMgdGhlIGRlZmluaXRpb25zIHVzZWQgdG8gZGVmaW5lCisgKiAgdGhlIHB1YmxpYyBpbnRlcmZhY2Ugb2YgYSBjb21wb25lbnQuICBUaGlzIGhlYWRlciBmaWxlIGlzIGludGVuZGVkIHRvCisgKiAgYmUgdXNlZCBieSBib3RoIHRoZSBhcHBsaWNhdGlvbiBhbmQgdGhlIGNvbXBvbmVudC4KKyAqLworCisjaWZuZGVmIE9NWF9Db21wb25lbnRfaAorI2RlZmluZSBPTVhfQ29tcG9uZW50X2gKKworI2lmZGVmIF9fY3BsdXNwbHVzCitleHRlcm4gIkMiIHsKKyNlbmRpZiAvKiBfX2NwbHVzcGx1cyAqLworCisKKworLyogRWFjaCBPTVggaGVhZGVyIG11c3QgaW5jbHVkZSBhbGwgcmVxdWlyZWQgaGVhZGVyIGZpbGVzIHRvIGFsbG93IHRoZQorICogIGhlYWRlciB0byBjb21waWxlIHdpdGhvdXQgZXJyb3JzLiAgVGhlIGluY2x1ZGVzIGJlbG93IGFyZSByZXF1aXJlZAorICogIGZvciB0aGlzIGhlYWRlciBmaWxlIHRvIGNvbXBpbGUgc3VjY2Vzc2Z1bGx5IAorICovCisKKyNpbmNsdWRlIDxPTVhfQXVkaW8uaD4KKyNpbmNsdWRlIDxPTVhfVmlkZW8uaD4KKyNpbmNsdWRlIDxPTVhfSW1hZ2UuaD4KKyNpbmNsdWRlIDxPTVhfT3RoZXIuaD4KKworLyoqIEBpbmdyb3VwIGNvbXAgKi8KK3R5cGVkZWYgZW51bSBPTVhfUE9SVERPTUFJTlRZUEUgeyAKKyAgICBPTVhfUG9ydERvbWFpbkF1ZGlvLCAKKyAgICBPTVhfUG9ydERvbWFpblZpZGVvLCAKKyAgICBPTVhfUG9ydERvbWFpbkltYWdlLCAKKyAgICBPTVhfUG9ydERvbWFpbk90aGVyLAorICAgIE9NWF9Qb3J0RG9tYWluS2hyb25vc0V4dGVuc2lvbnMgPSAweDZGMDAwMDAwLCAvKio8IFJlc2VydmVkIHJlZ2lvbiBmb3IgaW50cm9kdWNpbmcgS2hyb25vcyBTdGFuZGFyZCBFeHRlbnNpb25zICovIAorICAgIE9NWF9Qb3J0RG9tYWluVmVuZG9yU3RhcnRVbnVzZWQgPSAweDdGMDAwMDAwLCAvKio8IFJlc2VydmVkIHJlZ2lvbiBmb3IgaW50cm9kdWNpbmcgVmVuZG9yIEV4dGVuc2lvbnMgKi8KKyAgICBPTVhfUG9ydERvbWFpbk1heCA9IDB4N2ZmZmZmZgorfSBPTVhfUE9SVERPTUFJTlRZUEU7CisKKy8qKiBAaW5ncm91cCBjb21wICovCit0eXBlZGVmIHN0cnVjdCBPTVhfUEFSQU1fUE9SVERFRklOSVRJT05UWVBFIHsKKyAgICBPTVhfVTMyIG5TaXplOyAgICAgICAgICAgICAgICAgLyoqPCBTaXplIG9mIHRoZSBzdHJ1Y3R1cmUgaW4gYnl0ZXMgKi8KKyAgICBPTVhfVkVSU0lPTlRZUEUgblZlcnNpb247ICAgICAgLyoqPCBPTVggc3BlY2lmaWNhdGlvbiB2ZXJzaW9uIGluZm9ybWF0aW9uICovCisgICAgT01YX1UzMiBuUG9ydEluZGV4OyAgICAgICAgICAgIC8qKjwgUG9ydCBudW1iZXIgdGhlIHN0cnVjdHVyZSBhcHBsaWVzIHRvICovCisgICAgT01YX0RJUlRZUEUgZURpcjsgICAgICAgICAgICAgIC8qKjwgRGlyZWN0aW9uIChpbnB1dCBvciBvdXRwdXQpIG9mIHRoaXMgcG9ydCAqLworICAgIE9NWF9VMzIgbkJ1ZmZlckNvdW50QWN0dWFsOyAgICAvKio8IFRoZSBhY3R1YWwgbnVtYmVyIG9mIGJ1ZmZlcnMgYWxsb2NhdGVkIG9uIHRoaXMgcG9ydCAqLworICAgIE9NWF9VMzIgbkJ1ZmZlckNvdW50TWluOyAgICAgICAvKio8IFRoZSBtaW5pbXVtIG51bWJlciBvZiBidWZmZXJzIHRoaXMgcG9ydCByZXF1aXJlcyAqLworICAgIE9NWF9VMzIgbkJ1ZmZlclNpemU7ICAgICAgICAgICAvKio8IFNpemUsIGluIGJ5dGVzLCBmb3IgYnVmZmVycyB0byBiZSB1c2VkIGZvciB0aGlzIGNoYW5uZWwgKi8KKyAgICBPTVhfQk9PTCBiRW5hYmxlZDsgICAgICAgICAgICAgLyoqPCBQb3J0cyBkZWZhdWx0IHRvIGVuYWJsZWQgYW5kIGFyZSBlbmFibGVkL2Rpc2FibGVkIGJ5CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT01YX0NvbW1hbmRQb3J0RW5hYmxlL09NWF9Db21tYW5kUG9ydERpc2FibGUuCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgV2hlbiBkaXNhYmxlZCBhIHBvcnQgaXMgdW5wb3B1bGF0ZWQuIEEgZGlzYWJsZWQgcG9ydAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlzIG5vdCBwb3B1bGF0ZWQgd2l0aCBidWZmZXJzIG9uIGEgdHJhbnNpdGlvbiB0byBJRExFLiAqLworICAgIE9NWF9CT09MIGJQb3B1bGF0ZWQ7ICAgICAgICAgICAvKio8IFBvcnQgaXMgcG9wdWxhdGVkIHdpdGggYWxsIG9mIGl0cyBidWZmZXJzIGFzIGluZGljYXRlZCBieQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5CdWZmZXJDb3VudEFjdHVhbC4gQSBkaXNhYmxlZCBwb3J0IGlzIGFsd2F5cyB1bnBvcHVsYXRlZC4gCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQW4gZW5hYmxlZCBwb3J0IGlzIHBvcHVsYXRlZCBvbiBhIHRyYW5zaXRpb24gdG8gT01YX1N0YXRlSWRsZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFuZCB1bnBvcHVsYXRlZCBvbiBhIHRyYW5zaXRpb24gdG8gbG9hZGVkLiAqLworICAgIE9NWF9QT1JURE9NQUlOVFlQRSBlRG9tYWluOyAgICAvKio8IERvbWFpbiBvZiB0aGUgcG9ydC4gRGV0ZXJtaW5lcyB0aGUgY29udGVudHMgb2YgbWV0YWRhdGEgYmVsb3cuICovCisgICAgdW5pb24geworICAgICAgICBPTVhfQVVESU9fUE9SVERFRklOSVRJT05UWVBFIGF1ZGlvOworICAgICAgICBPTVhfVklERU9fUE9SVERFRklOSVRJT05UWVBFIHZpZGVvOworICAgICAgICBPTVhfSU1BR0VfUE9SVERFRklOSVRJT05UWVBFIGltYWdlOworICAgICAgICBPTVhfT1RIRVJfUE9SVERFRklOSVRJT05UWVBFIG90aGVyOworICAgIH0gZm9ybWF0OworICAgIE9NWF9CT09MIGJCdWZmZXJzQ29udGlndW91czsKKyAgICBPTVhfVTMyIG5CdWZmZXJBbGlnbm1lbnQ7Cit9IE9NWF9QQVJBTV9QT1JUREVGSU5JVElPTlRZUEU7CisKKy8qKiBAaW5ncm91cCBjb21wICovCit0eXBlZGVmIHN0cnVjdCBPTVhfUEFSQU1fVTMyVFlQRSB7IAorICAgIE9NWF9VMzIgblNpemU7ICAgICAgICAgICAgICAgICAgICAvKio8IFNpemUgb2YgdGhpcyBzdHJ1Y3R1cmUsIGluIEJ5dGVzICovIAorICAgIE9NWF9WRVJTSU9OVFlQRSBuVmVyc2lvbjsgICAgICAgICAvKio8IE9NWCBzcGVjaWZpY2F0aW9uIHZlcnNpb24gaW5mb3JtYXRpb24gKi8gCisgICAgT01YX1UzMiBuUG9ydEluZGV4OyAgICAgICAgICAgICAgIC8qKjwgcG9ydCB0aGF0IHRoaXMgc3RydWN0dXJlIGFwcGxpZXMgdG8gKi8gCisgICAgT01YX1UzMiBuVTMyOyAgICAgICAgICAgICAgICAgICAgIC8qKjwgVTMyIHZhbHVlICovCit9IE9NWF9QQVJBTV9VMzJUWVBFOworCisvKiogQGluZ3JvdXAgcnBtICovCit0eXBlZGVmIGVudW0gT01YX1NVU1BFTlNJT05QT0xJQ1lUWVBFIHsKKyAgICBPTVhfU3VzcGVuc2lvbkRpc2FibGVkLCAvKio8IE5vIHN1c3BlbnNpb247IHYxLjAgYmVoYXZpb3IgKi8KKyAgICBPTVhfU3VzcGVuc2lvbkVuYWJsZWQsICAvKio8IFN1c3BlbnNpb24gYWxsb3dlZCAqLyAgIAorICAgIE9NWF9TdXNwZW5zaW9uUG9saWN5S2hyb25vc0V4dGVuc2lvbnMgPSAweDZGMDAwMDAwLCAvKio8IFJlc2VydmVkIHJlZ2lvbiBmb3IgaW50cm9kdWNpbmcgS2hyb25vcyBTdGFuZGFyZCBFeHRlbnNpb25zICovIAorICAgIE9NWF9TdXNwZW5zaW9uUG9saWN5U3RhcnRVbnVzZWQgPSAweDdGMDAwMDAwLCAvKio8IFJlc2VydmVkIHJlZ2lvbiBmb3IgaW50cm9kdWNpbmcgVmVuZG9yIEV4dGVuc2lvbnMgKi8KKyAgICBPTVhfU3VzcGVuc2lvblBvbGljeU1heCA9IDB4N2ZmZmZmZmYKK30gT01YX1NVU1BFTlNJT05QT0xJQ1lUWVBFOworCisvKiogQGluZ3JvdXAgcnBtICovCit0eXBlZGVmIHN0cnVjdCBPTVhfUEFSQU1fU1VTUEVOU0lPTlBPTElDWVRZUEUgeworICAgIE9NWF9VMzIgblNpemU7ICAgICAgICAgICAgICAgICAgCisgICAgT01YX1ZFUlNJT05UWVBFIG5WZXJzaW9uOyAgICAgICAgCisgICAgT01YX1NVU1BFTlNJT05QT0xJQ1lUWVBFIGVQb2xpY3k7Cit9IE9NWF9QQVJBTV9TVVNQRU5TSU9OUE9MSUNZVFlQRTsKKworLyoqIEBpbmdyb3VwIHJwbSAqLwordHlwZWRlZiBlbnVtIE9NWF9TVVNQRU5TSU9OVFlQRSB7CisgICAgT01YX05vdFN1c3BlbmRlZCwgLyoqPCBjb21wb25lbnQgaXMgbm90IHN1c3BlbmRlZCAqLworICAgIE9NWF9TdXNwZW5kZWQsICAgIC8qKjwgY29tcG9uZW50IGlzIHN1c3BlbmRlZCAqLworICAgIE9NWF9TdXNwZW5zaW9uS2hyb25vc0V4dGVuc2lvbnMgPSAweDZGMDAwMDAwLCAvKio8IFJlc2VydmVkIHJlZ2lvbiBmb3IgaW50cm9kdWNpbmcgS2hyb25vcyBTdGFuZGFyZCBFeHRlbnNpb25zICovIAorICAgIE9NWF9TdXNwZW5zaW9uVmVuZG9yU3RhcnRVbnVzZWQgPSAweDdGMDAwMDAwLCAvKio8IFJlc2VydmVkIHJlZ2lvbiBmb3IgaW50cm9kdWNpbmcgVmVuZG9yIEV4dGVuc2lvbnMgKi8KKyAgICBPTVhfU3VzcGVuZE1heCA9IDB4N0ZGRkZGRkYKK30gT01YX1NVU1BFTlNJT05UWVBFOworCisvKiogQGluZ3JvdXAgcnBtICovCit0eXBlZGVmIHN0cnVjdCBPTVhfUEFSQU1fU1VTUEVOU0lPTlRZUEUgeworICAgIE9NWF9VMzIgblNpemU7ICAgICAgICAgICAgICAgICAgCisgICAgT01YX1ZFUlNJT05UWVBFIG5WZXJzaW9uOyAgICAgICAKKyAgICBPTVhfU1VTUEVOU0lPTlRZUEUgZVR5cGU7ICAgICAgICAgICAgIAorfSBPTVhfUEFSQU1fU1VTUEVOU0lPTlRZUEUgOworCit0eXBlZGVmIHN0cnVjdCBPTVhfQ09ORklHX0JPT0xFQU5UWVBFIHsKKyAgICBPTVhfVTMyIG5TaXplOworICAgIE9NWF9WRVJTSU9OVFlQRSBuVmVyc2lvbjsKKyAgICBPTVhfQk9PTCBiRW5hYmxlZDsgICAgCit9IE9NWF9DT05GSUdfQk9PTEVBTlRZUEU7CisKKy8qIFBhcmFtZXRlciBzcGVjaWZ5aW5nIHRoZSBjb250ZW50IHVyaSB0byB1c2UuICovCisvKiogQGluZ3JvdXAgY3AgKi8KK3R5cGVkZWYgc3RydWN0IE9NWF9QQVJBTV9DT05URU5UVVJJVFlQRQoreworICAgIE9NWF9VMzIgblNpemU7ICAgICAgICAgICAgICAgICAgICAgIC8qKjwgc2l6ZSBvZiB0aGUgc3RydWN0dXJlIGluIGJ5dGVzLCBpbmNsdWRpbmcKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFjdHVhbCBVUkkgbmFtZSAqLworICAgIE9NWF9WRVJTSU9OVFlQRSBuVmVyc2lvbjsgICAgICAgICAgIC8qKjwgT01YIHNwZWNpZmljYXRpb24gdmVyc2lvbiBpbmZvcm1hdGlvbiAqLworICAgIE9NWF9VOCBjb250ZW50VVJJWzFdOyAgICAgICAgICAgICAgIC8qKjwgVGhlIFVSSSBuYW1lICovCit9IE9NWF9QQVJBTV9DT05URU5UVVJJVFlQRTsKKworLyogUGFyYW1ldGVyIHNwZWNpZnlpbmcgdGhlIHBpcGUgdG8gdXNlLiAqLworLyoqIEBpbmdyb3VwIGNwICovCit0eXBlZGVmIHN0cnVjdCBPTVhfUEFSQU1fQ09OVEVOVFBJUEVUWVBFCit7CisgICAgT01YX1UzMiBuU2l6ZTsgICAgICAgICAgICAgIC8qKjwgc2l6ZSBvZiB0aGUgc3RydWN0dXJlIGluIGJ5dGVzICovCisgICAgT01YX1ZFUlNJT05UWVBFIG5WZXJzaW9uOyAgIC8qKjwgT01YIHNwZWNpZmljYXRpb24gdmVyc2lvbiBpbmZvcm1hdGlvbiAqLworICAgIE9NWF9IQU5ETEVUWVBFIGhQaXBlOyAgICAgICAvKio8IFRoZSBwaXBlIGhhbmRsZSovCit9IE9NWF9QQVJBTV9DT05URU5UUElQRVRZUEU7CisKKy8qKiBAaW5ncm91cCBycG0gKi8KK3R5cGVkZWYgc3RydWN0IE9NWF9SRVNPVVJDRUNPTkNFQUxNRU5UVFlQRSB7CisgICAgT01YX1UzMiBuU2l6ZTsgICAgICAgICAgICAgLyoqPCBzaXplIG9mIHRoZSBzdHJ1Y3R1cmUgaW4gYnl0ZXMgKi8KKyAgICBPTVhfVkVSU0lPTlRZUEUgblZlcnNpb247ICAvKio8IE9NWCBzcGVjaWZpY2F0aW9uIHZlcnNpb24gaW5mb3JtYXRpb24gKi8KKyAgICBPTVhfQk9PTCBiUmVzb3VyY2VDb25jZWFsbWVudEZvcmJpZGRlbjsgLyoqPCBkaXNhbGxvdyB0aGUgdXNlIG9mIHJlc291cmNlIGNvbmNlYWxtZW50IAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtZXRob2RzIChsaWtlIGRlZ3JhZGluZyBhbGdvcml0aG0gcXVhbGl0eSB0byAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbG93ZXIgcmVzb3VyY2UgY29uc3VtcHRpb24gb3IgZnVuY3Rpb25hbCBieXBhc3MpIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvbiBhIGNvbXBvbmVudCBhcyBhIHJlc29sdXRpb24gdG8gcmVzb3VyY2UgY29uZmxpY3RzLiAqLworfSBPTVhfUkVTT1VSQ0VDT05DRUFMTUVOVFRZUEU7CisKKworLyoqIEBpbmdyb3VwIG1ldGFkYXRhICovCit0eXBlZGVmIGVudW0gT01YX01FVEFEQVRBQ0hBUlNFVFRZUEUgeworICAgIE9NWF9NZXRhZGF0YUNoYXJzZXRVbmtub3duID0gMCwKKyAgICBPTVhfTWV0YWRhdGFDaGFyc2V0QVNDSUksCisgICAgT01YX01ldGFkYXRhQ2hhcnNldEJpbmFyeSwKKyAgICBPTVhfTWV0YWRhdGFDaGFyc2V0Q29kZVBhZ2UxMjUyLAorICAgIE9NWF9NZXRhZGF0YUNoYXJzZXRVVEY4LAorICAgIE9NWF9NZXRhZGF0YUNoYXJzZXRKYXZhQ29uZm9ybWFudFVURjgsCisgICAgT01YX01ldGFkYXRhQ2hhcnNldFVURjcsCisgICAgT01YX01ldGFkYXRhQ2hhcnNldEltYXBVVEY3LAorICAgIE9NWF9NZXRhZGF0YUNoYXJzZXRVVEYxNkxFLCAKKyAgICBPTVhfTWV0YWRhdGFDaGFyc2V0VVRGMTZCRSwKKyAgICBPTVhfTWV0YWRhdGFDaGFyc2V0R0IxMjM0NSwKKyAgICBPTVhfTWV0YWRhdGFDaGFyc2V0SFpHQjIzMTIsCisgICAgT01YX01ldGFkYXRhQ2hhcnNldEdCMjMxMiwKKyAgICBPTVhfTWV0YWRhdGFDaGFyc2V0R0IxODAzMCwKKyAgICBPTVhfTWV0YWRhdGFDaGFyc2V0R0JLLAorICAgIE9NWF9NZXRhZGF0YUNoYXJzZXRCaWc1LAorICAgIE9NWF9NZXRhZGF0YUNoYXJzZXRJU084ODU5MSwKKyAgICBPTVhfTWV0YWRhdGFDaGFyc2V0SVNPODg1OTIsCisgICAgT01YX01ldGFkYXRhQ2hhcnNldElTTzg4NTkzLAorICAgIE9NWF9NZXRhZGF0YUNoYXJzZXRJU084ODU5NCwKKyAgICBPTVhfTWV0YWRhdGFDaGFyc2V0SVNPODg1OTUsCisgICAgT01YX01ldGFkYXRhQ2hhcnNldElTTzg4NTk2LAorICAgIE9NWF9NZXRhZGF0YUNoYXJzZXRJU084ODU5NywKKyAgICBPTVhfTWV0YWRhdGFDaGFyc2V0SVNPODg1OTgsCisgICAgT01YX01ldGFkYXRhQ2hhcnNldElTTzg4NTk5LAorICAgIE9NWF9NZXRhZGF0YUNoYXJzZXRJU084ODU5MTAsCisgICAgT01YX01ldGFkYXRhQ2hhcnNldElTTzg4NTkxMywKKyAgICBPTVhfTWV0YWRhdGFDaGFyc2V0SVNPODg1OTE0LAorICAgIE9NWF9NZXRhZGF0YUNoYXJzZXRJU084ODU5MTUsCisgICAgT01YX01ldGFkYXRhQ2hhcnNldFNoaWZ0SklTLAorICAgIE9NWF9NZXRhZGF0YUNoYXJzZXRJU08yMDIySlAsCisgICAgT01YX01ldGFkYXRhQ2hhcnNldElTTzIwMjJKUDEsCisgICAgT01YX01ldGFkYXRhQ2hhcnNldElTT0VVQ0pQLAorICAgIE9NWF9NZXRhZGF0YUNoYXJzZXRTTVM3Qml0LAorICAgIE9NWF9NZXRhZGF0YUNoYXJzZXRLaHJvbm9zRXh0ZW5zaW9ucyA9IDB4NkYwMDAwMDAsIC8qKjwgUmVzZXJ2ZWQgcmVnaW9uIGZvciBpbnRyb2R1Y2luZyBLaHJvbm9zIFN0YW5kYXJkIEV4dGVuc2lvbnMgKi8gCisgICAgT01YX01ldGFkYXRhQ2hhcnNldFZlbmRvclN0YXJ0VW51c2VkID0gMHg3RjAwMDAwMCwgLyoqPCBSZXNlcnZlZCByZWdpb24gZm9yIGludHJvZHVjaW5nIFZlbmRvciBFeHRlbnNpb25zICovCisgICAgT01YX01ldGFkYXRhQ2hhcnNldFR5cGVNYXg9IDB4N0ZGRkZGRkYKK30gT01YX01FVEFEQVRBQ0hBUlNFVFRZUEU7CisKKy8qKiBAaW5ncm91cCBtZXRhZGF0YSAqLwordHlwZWRlZiBlbnVtIE9NWF9NRVRBREFUQVNDT1BFVFlQRQoreworICAgIE9NWF9NZXRhZGF0YVNjb3BlQWxsTGV2ZWxzLAorICAgIE9NWF9NZXRhZGF0YVNjb3BlVG9wTGV2ZWwsCisgICAgT01YX01ldGFkYXRhU2NvcGVQb3J0TGV2ZWwsCisgICAgT01YX01ldGFkYXRhU2NvcGVOb2RlTGV2ZWwsCisgICAgT01YX01ldGFkYXRhU2NvcGVLaHJvbm9zRXh0ZW5zaW9ucyA9IDB4NkYwMDAwMDAsIC8qKjwgUmVzZXJ2ZWQgcmVnaW9uIGZvciBpbnRyb2R1Y2luZyBLaHJvbm9zIFN0YW5kYXJkIEV4dGVuc2lvbnMgKi8gCisgICAgT01YX01ldGFkYXRhU2NvcGVWZW5kb3JTdGFydFVudXNlZCA9IDB4N0YwMDAwMDAsIC8qKjwgUmVzZXJ2ZWQgcmVnaW9uIGZvciBpbnRyb2R1Y2luZyBWZW5kb3IgRXh0ZW5zaW9ucyAqLworICAgIE9NWF9NZXRhZGF0YVNjb3BlVHlwZU1heCA9IDB4N2ZmZmZmZmYKK30gT01YX01FVEFEQVRBU0NPUEVUWVBFOworCisvKiogQGluZ3JvdXAgbWV0YWRhdGEgKi8KK3R5cGVkZWYgZW51bSBPTVhfTUVUQURBVEFTRUFSQ0hNT0RFVFlQRQoreworICAgIE9NWF9NZXRhZGF0YVNlYXJjaFZhbHVlU2l6ZUJ5SW5kZXgsCisgICAgT01YX01ldGFkYXRhU2VhcmNoSXRlbUJ5SW5kZXgsCisgICAgT01YX01ldGFkYXRhU2VhcmNoTmV4dEl0ZW1CeUtleSwKKyAgICBPTVhfTWV0YWRhdGFTZWFyY2hLaHJvbm9zRXh0ZW5zaW9ucyA9IDB4NkYwMDAwMDAsIC8qKjwgUmVzZXJ2ZWQgcmVnaW9uIGZvciBpbnRyb2R1Y2luZyBLaHJvbm9zIFN0YW5kYXJkIEV4dGVuc2lvbnMgKi8gCisgICAgT01YX01ldGFkYXRhU2VhcmNoVmVuZG9yU3RhcnRVbnVzZWQgPSAweDdGMDAwMDAwLCAvKio8IFJlc2VydmVkIHJlZ2lvbiBmb3IgaW50cm9kdWNpbmcgVmVuZG9yIEV4dGVuc2lvbnMgKi8KKyAgICBPTVhfTWV0YWRhdGFTZWFyY2hUeXBlTWF4ID0gMHg3ZmZmZmZmZgorfSBPTVhfTUVUQURBVEFTRUFSQ0hNT0RFVFlQRTsKKy8qKiBAaW5ncm91cCBtZXRhZGF0YSAqLwordHlwZWRlZiBzdHJ1Y3QgT01YX0NPTkZJR19NRVRBREFUQUlURU1DT1VOVFRZUEUKK3sKKyAgICBPTVhfVTMyIG5TaXplOworICAgIE9NWF9WRVJTSU9OVFlQRSBuVmVyc2lvbjsKKyAgICBPTVhfTUVUQURBVEFTQ09QRVRZUEUgZVNjb3BlTW9kZTsKKyAgICBPTVhfVTMyIG5TY29wZVNwZWNpZmllcjsKKyAgICBPTVhfVTMyIG5NZXRhZGF0YUl0ZW1Db3VudDsKK30gT01YX0NPTkZJR19NRVRBREFUQUlURU1DT1VOVFRZUEU7CisKKy8qKiBAaW5ncm91cCBtZXRhZGF0YSAqLwordHlwZWRlZiBzdHJ1Y3QgT01YX0NPTkZJR19NRVRBREFUQUlURU1UWVBFCit7CisgICAgT01YX1UzMiBuU2l6ZTsKKyAgICBPTVhfVkVSU0lPTlRZUEUgblZlcnNpb247CisgICAgT01YX01FVEFEQVRBU0NPUEVUWVBFIGVTY29wZU1vZGU7CisgICAgT01YX1UzMiBuU2NvcGVTcGVjaWZpZXI7CisgICAgT01YX1UzMiBuTWV0YWRhdGFJdGVtSW5kZXg7ICAKKyAgICBPTVhfTUVUQURBVEFTRUFSQ0hNT0RFVFlQRSBlU2VhcmNoTW9kZTsKKyAgICBPTVhfTUVUQURBVEFDSEFSU0VUVFlQRSBlS2V5Q2hhcnNldDsKKyAgICBPTVhfVTggbktleVNpemVVc2VkOworICAgIE9NWF9VOCBuS2V5WzEyOF07CisgICAgT01YX01FVEFEQVRBQ0hBUlNFVFRZUEUgZVZhbHVlQ2hhcnNldDsKKyAgICBPTVhfU1RSSU5HIHNMYW5ndWFnZUNvdW50cnk7CisgICAgT01YX1UzMiBuVmFsdWVNYXhTaXplOworICAgIE9NWF9VMzIgblZhbHVlU2l6ZVVzZWQ7CisgICAgT01YX1U4IG5WYWx1ZVsxXTsKK30gT01YX0NPTkZJR19NRVRBREFUQUlURU1UWVBFOworCisvKiBAaW5ncm91cCBtZXRhZGF0YSAqLwordHlwZWRlZiBzdHJ1Y3QgT01YX0NPTkZJR19DT05UQUlORVJOT0RFQ09VTlRUWVBFCit7CisgICAgT01YX1UzMiBuU2l6ZTsKKyAgICBPTVhfVkVSU0lPTlRZUEUgblZlcnNpb247CisgICAgT01YX0JPT0wgYkFsbEtleXM7CisgICAgT01YX1UzMiBuUGFyZW50Tm9kZUlEOworICAgIE9NWF9VMzIgbk51bU5vZGVzOworfSBPTVhfQ09ORklHX0NPTlRBSU5FUk5PREVDT1VOVFRZUEU7CisKKy8qKiBAaW5ncm91cCBtZXRhZGF0YSAqLwordHlwZWRlZiBzdHJ1Y3QgT01YX0NPTkZJR19DT05UQUlORVJOT0RFSURUWVBFCit7CisgICAgT01YX1UzMiBuU2l6ZTsKKyAgICBPTVhfVkVSU0lPTlRZUEUgblZlcnNpb247CisgICAgT01YX0JPT0wgYkFsbEtleXM7CisgICAgT01YX1UzMiBuUGFyZW50Tm9kZUlEOworICAgIE9NWF9VMzIgbk5vZGVJbmRleDsgCisgICAgT01YX1UzMiBuTm9kZUlEOyAKKyAgICBPTVhfU1RSSU5HIGNOb2RlTmFtZTsKKyAgICBPTVhfQk9PTCBiSXNMZWFmVHlwZTsKK30gT01YX0NPTkZJR19DT05UQUlORVJOT0RFSURUWVBFOworCisvKiogQGluZ3JvdXAgbWV0YWRhdGEgKi8KK3R5cGVkZWYgc3RydWN0IE9NWF9QQVJBTV9NRVRBREFUQUZJTFRFUlRZUEUgCit7IAorICAgIE9NWF9VMzIgblNpemU7IAorICAgIE9NWF9WRVJTSU9OVFlQRSBuVmVyc2lvbjsgCisgICAgT01YX0JPT0wgYkFsbEtleXM7CS8qIGlmIHRydWUgdGhlbiB0aGlzIHN0cnVjdHVyZSByZWZlcnMgdG8gYWxsIGtleXMgYW5kIAorICAgICAgICAgICAgICAgICAgICAgICAgICogdGhlIHRocmVlIGtleSBmaWVsZHMgYmVsb3cgYXJlIGlnbm9yZWQgKi8KKyAgICBPTVhfTUVUQURBVEFDSEFSU0VUVFlQRSBlS2V5Q2hhcnNldDsKKyAgICBPTVhfVTMyIG5LZXlTaXplVXNlZDsgCisgICAgT01YX1U4ICAgbktleSBbMTI4XTsgCisgICAgT01YX1UzMiBuTGFuZ3VhZ2VDb3VudHJ5U2l6ZVVzZWQ7CisgICAgT01YX1U4IG5MYW5ndWFnZUNvdW50cnlbMTI4XTsKKyAgICBPTVhfQk9PTCBiRW5hYmxlZDsJLyogaWYgdHJ1ZSB0aGVuIGtleSBpcyBwYXJ0IG9mIGZpbHRlciAoZS5nLiAKKyAgICAgICAgICAgICAgICAgICAgICAgICAqIHJldGFpbmVkIGZvciBxdWVyeSBsYXRlcikuIElmIGZhbHNlIHRoZW4KKyAgICAgICAgICAgICAgICAgICAgICAgICAqIGtleSBpcyBub3QgcGFydCBvZiBmaWx0ZXIgKi8KK30gT01YX1BBUkFNX01FVEFEQVRBRklMVEVSVFlQRTsgCisKKy8qKiBUaGUgT01YX0hBTkRMRVRZUEUgc3RydWN0dXJlIGRlZmluZXMgdGhlIGNvbXBvbmVudCBoYW5kbGUuICBUaGUgY29tcG9uZW50IAorICogIGhhbmRsZSBpcyB1c2VkIHRvIGFjY2VzcyBhbGwgb2YgdGhlIGNvbXBvbmVudCdzIHB1YmxpYyBtZXRob2RzIGFuZCBhbHNvCisgKiAgY29udGFpbnMgcG9pbnRlcnMgdG8gdGhlIGNvbXBvbmVudCdzIHByaXZhdGUgZGF0YSBhcmVhLiAgVGhlIGNvbXBvbmVudAorICogIGhhbmRsZSBpcyBpbml0aWFsaXplZCBieSB0aGUgT01YIGNvcmUgKHdpdGggaGVscCBmcm9tIHRoZSBjb21wb25lbnQpCisgKiAgZHVyaW5nIHRoZSBwcm9jZXNzIG9mIGxvYWRpbmcgdGhlIGNvbXBvbmVudC4gIEFmdGVyIHRoZSBjb21wb25lbnQgaXMKKyAqICBzdWNjZXNzZnVsbHkgbG9hZGVkLCB0aGUgYXBwbGljYXRpb24gY2FuIHNhZmVseSBhY2Nlc3MgYW55IG9mIHRoZQorICogIGNvbXBvbmVudCdzIHB1YmxpYyBmdW5jdGlvbnMgKGFsdGhvdWdoIHNvbWUgbWF5IHJldHVybiBhbiBlcnJvciBiZWNhdXNlCisgKiAgdGhlIHN0YXRlIGlzIGluYXBwcm9wcmlhdGUgZm9yIHRoZSBhY2Nlc3MpLgorICogCisgKiAgQGluZ3JvdXAgY29tcAorICovCit0eXBlZGVmIHN0cnVjdCBPTVhfQ09NUE9ORU5UVFlQRQoreworICAgIC8qKiBUaGUgc2l6ZSBvZiB0aGlzIHN0cnVjdHVyZSwgaW4gYnl0ZXMuICBJdCBpcyB0aGUgcmVzcG9uc2liaWxpdHkKKyAgICAgICAgb2YgdGhlIGFsbG9jYXRvciBvZiB0aGlzIHN0cnVjdHVyZSB0byBmaWxsIGluIHRoaXMgdmFsdWUuICBTaW5jZQorICAgICAgICB0aGlzIHN0cnVjdHVyZSBpcyBhbGxvY2F0ZWQgYnkgdGhlIEdldEhhbmRsZSBmdW5jdGlvbiwgdGhpcworICAgICAgICBmdW5jdGlvbiB3aWxsIGZpbGwgaW4gdGhpcyB2YWx1ZS4gKi8KKyAgICBPTVhfVTMyIG5TaXplOworCisgICAgLyoqIG5WZXJzaW9uIGlzIHRoZSB2ZXJzaW9uIG9mIHRoZSBPTVggc3BlY2lmaWNhdGlvbiB0aGF0IHRoZSBzdHJ1Y3R1cmUgCisgICAgICAgIGlzIGJ1aWx0IGFnYWluc3QuICBJdCBpcyB0aGUgcmVzcG9uc2liaWxpdHkgb2YgdGhlIGNyZWF0b3Igb2YgdGhpcyAKKyAgICAgICAgc3RydWN0dXJlIHRvIGluaXRpYWxpemUgdGhpcyB2YWx1ZSBhbmQgZXZlcnkgdXNlciBvZiB0aGlzIHN0cnVjdHVyZSAKKyAgICAgICAgc2hvdWxkIHZlcmlmeSB0aGF0IGl0IGtub3dzIGhvdyB0byB1c2UgdGhlIGV4YWN0IHZlcnNpb24gb2YgCisgICAgICAgIHRoaXMgc3RydWN0dXJlIGZvdW5kIGhlcmVpbi4gKi8KKyAgICBPTVhfVkVSU0lPTlRZUEUgblZlcnNpb247CisKKyAgICAvKiogcENvbXBvbmVudFByaXZhdGUgaXMgYSBwb2ludGVyIHRvIHRoZSBjb21wb25lbnQgcHJpdmF0ZSBkYXRhIGFyZWEuICAKKyAgICAgICAgVGhpcyBtZW1iZXIgaXMgYWxsb2NhdGVkIGFuZCBpbml0aWFsaXplZCBieSB0aGUgY29tcG9uZW50IHdoZW4gdGhlIAorICAgICAgICBjb21wb25lbnQgaXMgZmlyc3QgbG9hZGVkLiAgVGhlIGFwcGxpY2F0aW9uIHNob3VsZCBub3QgYWNjZXNzIHRoaXMgCisgICAgICAgIGRhdGEgYXJlYS4gKi8KKyAgICBPTVhfUFRSIHBDb21wb25lbnRQcml2YXRlOworCisgICAgLyoqIHBBcHBsaWNhdGlvblByaXZhdGUgaXMgYSBwb2ludGVyIHRoYXQgaXMgYSBwYXJhbWV0ZXIgdG8gdGhlIAorICAgICAgICBPTVhfR2V0SGFuZGxlIG1ldGhvZCwgYW5kIGNvbnRhaW5zIGFuIGFwcGxpY2F0aW9uIHByaXZhdGUgdmFsdWUgCisgICAgICAgIHByb3ZpZGVkIGJ5IHRoZSBJTCBjbGllbnQuICBUaGlzIGFwcGxpY2F0aW9uIHByaXZhdGUgZGF0YSBpcyAKKyAgICAgICAgcmV0dXJuZWQgdG8gdGhlIElMIENsaWVudCBieSBPTVggaW4gYWxsIGNhbGxiYWNrcyAqLworICAgIE9NWF9QVFIgcEFwcGxpY2F0aW9uUHJpdmF0ZTsKKworICAgIC8qKiByZWZlciB0byBPTVhfR2V0Q29tcG9uZW50VmVyc2lvbiBpbiBPTVhfY29yZS5oIG9yIHRoZSBPTVggSUwgCisgICAgICAgIHNwZWNpZmljYXRpb24gZm9yIGRldGFpbHMgb24gdGhlIEdldENvbXBvbmVudFZlcnNpb24gbWV0aG9kLgorICAgICAqLworICAgIE9NWF9FUlJPUlRZUEUgKCpHZXRDb21wb25lbnRWZXJzaW9uKSgKKyAgICAgICAgICAgIE9NWF9JTiAgT01YX0hBTkRMRVRZUEUgaENvbXBvbmVudCwKKyAgICAgICAgICAgIE9NWF9PVVQgT01YX1NUUklORyBwQ29tcG9uZW50TmFtZSwKKyAgICAgICAgICAgIE9NWF9PVVQgT01YX1ZFUlNJT05UWVBFKiBwQ29tcG9uZW50VmVyc2lvbiwKKyAgICAgICAgICAgIE9NWF9PVVQgT01YX1ZFUlNJT05UWVBFKiBwU3BlY1ZlcnNpb24sCisgICAgICAgICAgICBPTVhfT1VUIE9NWF9VVUlEVFlQRSogcENvbXBvbmVudFVVSUQpOworCisgICAgLyoqIHJlZmVyIHRvIE9NWF9TZW5kQ29tbWFuZCBpbiBPTVhfY29yZS5oIG9yIHRoZSBPTVggSUwgCisgICAgICAgIHNwZWNpZmljYXRpb24gZm9yIGRldGFpbHMgb24gdGhlIFNlbmRDb21tYW5kIG1ldGhvZC4KKyAgICAgKi8KKyAgICBPTVhfRVJST1JUWVBFICgqU2VuZENvbW1hbmQpKAorICAgICAgICAgICAgT01YX0lOICBPTVhfSEFORExFVFlQRSBoQ29tcG9uZW50LAorICAgICAgICAgICAgT01YX0lOICBPTVhfQ09NTUFORFRZUEUgQ21kLAorICAgICAgICAgICAgT01YX0lOICBPTVhfVTMyIG5QYXJhbTEsCisgICAgICAgICAgICBPTVhfSU4gIE9NWF9QVFIgcENtZERhdGEpOworCisgICAgLyoqIHJlZmVyIHRvIE9NWF9HZXRQYXJhbWV0ZXIgaW4gT01YX2NvcmUuaCBvciB0aGUgT01YIElMIAorICAgICAgICBzcGVjaWZpY2F0aW9uIGZvciBkZXRhaWxzIG9uIHRoZSBHZXRQYXJhbWV0ZXIgbWV0aG9kLgorICAgICAqLworICAgIE9NWF9FUlJPUlRZUEUgKCpHZXRQYXJhbWV0ZXIpKAorICAgICAgICAgICAgT01YX0lOICBPTVhfSEFORExFVFlQRSBoQ29tcG9uZW50LCAKKyAgICAgICAgICAgIE9NWF9JTiAgT01YX0lOREVYVFlQRSBuUGFyYW1JbmRleCwgIAorICAgICAgICAgICAgT01YX0lOT1VUIE9NWF9QVFIgcENvbXBvbmVudFBhcmFtZXRlclN0cnVjdHVyZSk7CisKKworICAgIC8qKiByZWZlciB0byBPTVhfU2V0UGFyYW1ldGVyIGluIE9NWF9jb3JlLmggb3IgdGhlIE9NWCBJTCAKKyAgICAgICAgc3BlY2lmaWNhdGlvbiBmb3IgZGV0YWlscyBvbiB0aGUgU2V0UGFyYW1ldGVyIG1ldGhvZC4KKyAgICAgKi8KKyAgICBPTVhfRVJST1JUWVBFICgqU2V0UGFyYW1ldGVyKSgKKyAgICAgICAgICAgIE9NWF9JTiAgT01YX0hBTkRMRVRZUEUgaENvbXBvbmVudCwgCisgICAgICAgICAgICBPTVhfSU4gIE9NWF9JTkRFWFRZUEUgbkluZGV4LAorICAgICAgICAgICAgT01YX0lOICBPTVhfUFRSIHBDb21wb25lbnRQYXJhbWV0ZXJTdHJ1Y3R1cmUpOworCisKKyAgICAvKiogcmVmZXIgdG8gT01YX0dldENvbmZpZyBpbiBPTVhfY29yZS5oIG9yIHRoZSBPTVggSUwgCisgICAgICAgIHNwZWNpZmljYXRpb24gZm9yIGRldGFpbHMgb24gdGhlIEdldENvbmZpZyBtZXRob2QuCisgICAgICovCisgICAgT01YX0VSUk9SVFlQRSAoKkdldENvbmZpZykoCisgICAgICAgICAgICBPTVhfSU4gIE9NWF9IQU5ETEVUWVBFIGhDb21wb25lbnQsCisgICAgICAgICAgICBPTVhfSU4gIE9NWF9JTkRFWFRZUEUgbkluZGV4LCAKKyAgICAgICAgICAgIE9NWF9JTk9VVCBPTVhfUFRSIHBDb21wb25lbnRDb25maWdTdHJ1Y3R1cmUpOworCisKKyAgICAvKiogcmVmZXIgdG8gT01YX1NldENvbmZpZyBpbiBPTVhfY29yZS5oIG9yIHRoZSBPTVggSUwgCisgICAgICAgIHNwZWNpZmljYXRpb24gZm9yIGRldGFpbHMgb24gdGhlIFNldENvbmZpZyBtZXRob2QuCisgICAgICovCisgICAgT01YX0VSUk9SVFlQRSAoKlNldENvbmZpZykoCisgICAgICAgICAgICBPTVhfSU4gIE9NWF9IQU5ETEVUWVBFIGhDb21wb25lbnQsCisgICAgICAgICAgICBPTVhfSU4gIE9NWF9JTkRFWFRZUEUgbkluZGV4LCAKKyAgICAgICAgICAgIE9NWF9JTiAgT01YX1BUUiBwQ29tcG9uZW50Q29uZmlnU3RydWN0dXJlKTsKKworCisgICAgLyoqIHJlZmVyIHRvIE9NWF9HZXRFeHRlbnNpb25JbmRleCBpbiBPTVhfY29yZS5oIG9yIHRoZSBPTVggSUwgCisgICAgICAgIHNwZWNpZmljYXRpb24gZm9yIGRldGFpbHMgb24gdGhlIEdldEV4dGVuc2lvbkluZGV4IG1ldGhvZC4KKyAgICAgKi8KKyAgICBPTVhfRVJST1JUWVBFICgqR2V0RXh0ZW5zaW9uSW5kZXgpKAorICAgICAgICAgICAgT01YX0lOICBPTVhfSEFORExFVFlQRSBoQ29tcG9uZW50LAorICAgICAgICAgICAgT01YX0lOICBPTVhfU1RSSU5HIGNQYXJhbWV0ZXJOYW1lLAorICAgICAgICAgICAgT01YX09VVCBPTVhfSU5ERVhUWVBFKiBwSW5kZXhUeXBlKTsKKworCisgICAgLyoqIHJlZmVyIHRvIE9NWF9HZXRTdGF0ZSBpbiBPTVhfY29yZS5oIG9yIHRoZSBPTVggSUwgCisgICAgICAgIHNwZWNpZmljYXRpb24gZm9yIGRldGFpbHMgb24gdGhlIEdldFN0YXRlIG1ldGhvZC4KKyAgICAgKi8KKyAgICBPTVhfRVJST1JUWVBFICgqR2V0U3RhdGUpKAorICAgICAgICAgICAgT01YX0lOICBPTVhfSEFORExFVFlQRSBoQ29tcG9uZW50LAorICAgICAgICAgICAgT01YX09VVCBPTVhfU1RBVEVUWVBFKiBwU3RhdGUpOworCisgICAgCisgICAgLyoqIFRoZSBDb21wb25lbnRUdW5uZWxSZXF1ZXN0IG1ldGhvZCB3aWxsIGludGVyYWN0IHdpdGggYW5vdGhlciBPTVgKKyAgICAgICAgY29tcG9uZW50IHRvIGRldGVybWluZSBpZiB0dW5uZWxpbmcgaXMgcG9zc2libGUgYW5kIHRvIHNldHVwIHRoZQorICAgICAgICB0dW5uZWxpbmcuICBUaGUgcmV0dXJuIGNvZGVzIGZvciB0aGlzIG1ldGhvZCBjYW4gYmUgdXNlZCB0byAKKyAgICAgICAgZGV0ZXJtaW5lIGlmIHR1bm5lbGluZyBpcyBub3QgcG9zc2libGUsIG9yIGlmIHR1bm5lbGluZyBpcyBub3QKKyAgICAgICAgc3VwcG9ydGVkLiAgCisgICAgICAgIAorICAgICAgICBCYXNlIHByb2ZpbGUgY29tcG9uZW50cyAoaS5lLiBub24taW50ZXJvcCkgZG8gbm90IHN1cHBvcnQgdGhpcworICAgICAgICBtZXRob2QgYW5kIHNob3VsZCByZXR1cm4gT01YX0Vycm9yTm90SW1wbGVtZW50ZWQgCisKKyAgICAgICAgVGhlIGludGVyb3AgcHJvZmlsZSBjb21wb25lbnQgTVVTVCBzdXBwb3J0IHR1bm5lbGluZyB0byBhbm90aGVyIAorICAgICAgICBpbnRlcm9wIHByb2ZpbGUgY29tcG9uZW50IHdpdGggYSBjb21wYXRpYmxlIHBvcnQgcGFyYW1ldGVycy4gIAorICAgICAgICBBIGNvbXBvbmVudCBtYXkgYWxzbyBzdXBwb3J0IHByb3ByaWV0YXJ5IGNvbW11bmljYXRpb24uCisgICAgICAgIAorICAgICAgICBJZiBwcm9wcmlldGFyeSBjb21tdW5pY2F0aW9uIGlzIHN1cHBvcnRlZCB0aGUgbmVnb3RpYXRpb24gb2YgCisgICAgICAgIHByb3ByaWV0YXJ5IGNvbW11bmljYXRpb24gaXMgZG9uZSBvdXRzaWRlIG9mIE9NWCBpbiBhIHZlbmRvciAKKyAgICAgICAgc3BlY2lmaWMgd2F5LiBJdCBpcyBvbmx5IHJlcXVpcmVkIHRoYXQgdGhlIHByb3BlciByZXN1bHQgYmUgCisgICAgICAgIHJldHVybmVkIGFuZCB0aGUgZGV0YWlscyBvZiBob3cgdGhlIHNldHVwIGlzIGRvbmUgaXMgbGVmdCAKKyAgICAgICAgdG8gdGhlIGNvbXBvbmVudCBpbXBsZW1lbnRhdGlvbi4gIAorICAgIAorICAgICAgICBXaGVuIHRoaXMgbWV0aG9kIGlzIGludm9rZWQgd2hlbiBuUG9ydCBpbiBhbiBvdXRwdXQgcG9ydCwgdGhlCisgICAgICAgIGNvbXBvbmVudCB3aWxsOgorICAgICAgICAxLiAgUG9wdWxhdGUgdGhlIHBUdW5uZWxTZXR1cCBzdHJ1Y3R1cmUgd2l0aCB0aGUgb3V0cHV0IHBvcnQncyAKKyAgICAgICAgICAgIHJlcXVpcmVtZW50cyBhbmQgY29uc3RyYWludHMgZm9yIHRoZSB0dW5uZWwuCisKKyAgICAgICAgV2hlbiB0aGlzIG1ldGhvZCBpcyBpbnZva2VkIHdoZW4gblBvcnQgaW4gYW4gaW5wdXQgcG9ydCwgdGhlCisgICAgICAgIGNvbXBvbmVudCB3aWxsOgorICAgICAgICAxLiAgUXVlcnkgdGhlIG5lY2Vzc2FyeSBwYXJhbWV0ZXJzIGZyb20gdGhlIG91dHB1dCBwb3J0IHRvIAorICAgICAgICAgICAgZGV0ZXJtaW5lIGlmIHRoZSBwb3J0cyBhcmUgY29tcGF0aWJsZSBmb3IgdHVubmVsaW5nCisgICAgICAgIDIuICBJZiB0aGUgcG9ydHMgYXJlIGNvbXBhdGlibGUsIHRoZSBjb21wb25lbnQgc2hvdWxkIHN0b3JlCisgICAgICAgICAgICB0aGUgdHVubmVsIHN0ZXAgcHJvdmlkZWQgYnkgdGhlIG91dHB1dCBwb3J0CisgICAgICAgIDMuICBEZXRlcm1pbmUgd2hpY2ggcG9ydCAoZWl0aGVyIGlucHV0IG9yIG91dHB1dCkgaXMgdGhlIGJ1ZmZlcgorICAgICAgICAgICAgc3VwcGxpZXIsIGFuZCBjYWxsIE9NWF9TZXRQYXJhbWV0ZXIgb24gdGhlIG91dHB1dCBwb3J0IHRvCisgICAgICAgICAgICBpbmRpY2F0ZSB0aGlzIHNlbGVjdGlvbi4KKyAgICAgICAgCisgICAgICAgIFRoZSBjb21wb25lbnQgd2lsbCByZXR1cm4gZnJvbSB0aGlzIGNhbGwgd2l0aGluIDUgbXNlYy4KKyAgICAKKyAgICAgICAgQHBhcmFtIFtpbl0gaENvbXAKKyAgICAgICAgICAgIEhhbmRsZSBvZiB0aGUgY29tcG9uZW50IHRvIGJlIGFjY2Vzc2VkLiAgVGhpcyBpcyB0aGUgY29tcG9uZW50CisgICAgICAgICAgICBoYW5kbGUgcmV0dXJuZWQgYnkgdGhlIGNhbGwgdG8gdGhlIE9NWF9HZXRIYW5kbGUgbWV0aG9kLgorICAgICAgICBAcGFyYW0gW2luXSBuUG9ydAorICAgICAgICAgICAgblBvcnQgaXMgdXNlZCB0byBzZWxlY3QgdGhlIHBvcnQgb24gdGhlIGNvbXBvbmVudCB0byBiZSB1c2VkCisgICAgICAgICAgICBmb3IgdHVubmVsaW5nLgorICAgICAgICBAcGFyYW0gW2luXSBoVHVubmVsZWRDb21wCisgICAgICAgICAgICBIYW5kbGUgb2YgdGhlIGNvbXBvbmVudCB0byB0dW5uZWwgd2l0aC4gIFRoaXMgaXMgdGhlIGNvbXBvbmVudCAKKyAgICAgICAgICAgIGhhbmRsZSByZXR1cm5lZCBieSB0aGUgY2FsbCB0byB0aGUgT01YX0dldEhhbmRsZSBtZXRob2QuICBXaGVuCisgICAgICAgICAgICB0aGlzIHBhcmFtZXRlciBpcyAweDAgdGhlIGNvbXBvbmVudCBzaG91bGQgc2V0dXAgdGhlIHBvcnQgZm9yCisgICAgICAgICAgICBjb21tdW5pY2F0aW9uIHdpdGggdGhlIGFwcGxpY2F0aW9uIC8gSUwgQ2xpZW50LgorICAgICAgICBAcGFyYW0gW2luXSBuUG9ydE91dHB1dAorICAgICAgICAgICAgblBvcnRPdXRwdXQgaXMgdXNlZCBpbmRpY2F0ZSB0aGUgcG9ydCB0aGUgY29tcG9uZW50IHNob3VsZAorICAgICAgICAgICAgdHVubmVsIHdpdGguCisgICAgICAgIEBwYXJhbSBbaW5dIHBUdW5uZWxTZXR1cAorICAgICAgICAgICAgUG9pbnRlciB0byB0aGUgdHVubmVsIHNldHVwIHN0cnVjdHVyZS4gIFdoZW4gblBvcnQgaXMgYW4gb3V0cHV0IHBvcnQKKyAgICAgICAgICAgIHRoZSBjb21wb25lbnQgc2hvdWxkIHBvcHVsYXRlIHRoZSBmaWVsZHMgb2YgdGhpcyBzdHJ1Y3R1cmUuICBXaGVuCisgICAgICAgICAgICBXaGVuIG5Qb3J0IGlzIGFuIGlucHV0IHBvcnQgdGhlIGNvbXBvbmVudCBzaG91bGQgcmV2aWV3IHRoZSBzZXR1cAorICAgICAgICAgICAgcHJvdmlkZWQgYnkgdGhlIGNvbXBvbmVudCB3aXRoIHRoZSBvdXRwdXQgcG9ydC4KKyAgICAgICAgQHJldHVybiBPTVhfRVJST1JUWVBFCisgICAgICAgICAgICBJZiB0aGUgY29tbWFuZCBzdWNjZXNzZnVsbHkgZXhlY3V0ZXMsIHRoZSByZXR1cm4gY29kZSB3aWxsIGJlCisgICAgICAgICAgICBPTVhfRXJyb3JOb25lLiAgT3RoZXJ3aXNlIHRoZSBhcHByb3ByaWF0ZSBPTVggZXJyb3Igd2lsbCBiZSByZXR1cm5lZC4KKyAgICAgICAgQGluZ3JvdXAgdHVuCisgICAgKi8KKworICAgIE9NWF9FUlJPUlRZUEUgKCpDb21wb25lbnRUdW5uZWxSZXF1ZXN0KSgKKyAgICAgICAgT01YX0lOICBPTVhfSEFORExFVFlQRSBoQ29tcCwKKyAgICAgICAgT01YX0lOICBPTVhfVTMyIG5Qb3J0LAorICAgICAgICBPTVhfSU4gIE9NWF9IQU5ETEVUWVBFIGhUdW5uZWxlZENvbXAsCisgICAgICAgIE9NWF9JTiAgT01YX1UzMiBuVHVubmVsZWRQb3J0LAorICAgICAgICBPTVhfSU5PVVQgIE9NWF9UVU5ORUxTRVRVUFRZUEUqIHBUdW5uZWxTZXR1cCk7IAorCisgICAgLyoqIHJlZmVyIHRvIE9NWF9Vc2VCdWZmZXIgaW4gT01YX2NvcmUuaCBvciB0aGUgT01YIElMIAorICAgICAgICBzcGVjaWZpY2F0aW9uIGZvciBkZXRhaWxzIG9uIHRoZSBVc2VCdWZmZXIgbWV0aG9kLgorICAgICAgICBAaW5ncm91cCBidWYKKyAgICAgKi8KKyAgICBPTVhfRVJST1JUWVBFICgqVXNlQnVmZmVyKSgKKyAgICAgICAgICAgIE9NWF9JTiBPTVhfSEFORExFVFlQRSBoQ29tcG9uZW50LAorICAgICAgICAgICAgT01YX0lOT1VUIE9NWF9CVUZGRVJIRUFERVJUWVBFKiogcHBCdWZmZXJIZHIsCisgICAgICAgICAgICBPTVhfSU4gT01YX1UzMiBuUG9ydEluZGV4LAorICAgICAgICAgICAgT01YX0lOIE9NWF9QVFIgcEFwcFByaXZhdGUsCisgICAgICAgICAgICBPTVhfSU4gT01YX1UzMiBuU2l6ZUJ5dGVzLAorICAgICAgICAgICAgT01YX0lOIE9NWF9VOCogcEJ1ZmZlcik7CisKKyAgICAvKiogcmVmZXIgdG8gT01YX0FsbG9jYXRlQnVmZmVyIGluIE9NWF9jb3JlLmggb3IgdGhlIE9NWCBJTCAKKyAgICAgICAgc3BlY2lmaWNhdGlvbiBmb3IgZGV0YWlscyBvbiB0aGUgQWxsb2NhdGVCdWZmZXIgbWV0aG9kLgorICAgICAgICBAaW5ncm91cCBidWYKKyAgICAgKi8KKyAgICBPTVhfRVJST1JUWVBFICgqQWxsb2NhdGVCdWZmZXIpKAorICAgICAgICAgICAgT01YX0lOIE9NWF9IQU5ETEVUWVBFIGhDb21wb25lbnQsCisgICAgICAgICAgICBPTVhfSU5PVVQgT01YX0JVRkZFUkhFQURFUlRZUEUqKiBwcEJ1ZmZlciwKKyAgICAgICAgICAgIE9NWF9JTiBPTVhfVTMyIG5Qb3J0SW5kZXgsCisgICAgICAgICAgICBPTVhfSU4gT01YX1BUUiBwQXBwUHJpdmF0ZSwKKyAgICAgICAgICAgIE9NWF9JTiBPTVhfVTMyIG5TaXplQnl0ZXMpOworCisgICAgLyoqIHJlZmVyIHRvIE9NWF9GcmVlQnVmZmVyIGluIE9NWF9jb3JlLmggb3IgdGhlIE9NWCBJTCAKKyAgICAgICAgc3BlY2lmaWNhdGlvbiBmb3IgZGV0YWlscyBvbiB0aGUgRnJlZUJ1ZmZlciBtZXRob2QuCisgICAgICAgIEBpbmdyb3VwIGJ1ZgorICAgICAqLworICAgIE9NWF9FUlJPUlRZUEUgKCpGcmVlQnVmZmVyKSgKKyAgICAgICAgICAgIE9NWF9JTiAgT01YX0hBTkRMRVRZUEUgaENvbXBvbmVudCwKKyAgICAgICAgICAgIE9NWF9JTiAgT01YX1UzMiBuUG9ydEluZGV4LAorICAgICAgICAgICAgT01YX0lOICBPTVhfQlVGRkVSSEVBREVSVFlQRSogcEJ1ZmZlcik7CisKKyAgICAvKiogcmVmZXIgdG8gT01YX0VtcHR5VGhpc0J1ZmZlciBpbiBPTVhfY29yZS5oIG9yIHRoZSBPTVggSUwgCisgICAgICAgIHNwZWNpZmljYXRpb24gZm9yIGRldGFpbHMgb24gdGhlIEVtcHR5VGhpc0J1ZmZlciBtZXRob2QuCisgICAgICAgIEBpbmdyb3VwIGJ1ZgorICAgICAqLworICAgIE9NWF9FUlJPUlRZUEUgKCpFbXB0eVRoaXNCdWZmZXIpKAorICAgICAgICAgICAgT01YX0lOICBPTVhfSEFORExFVFlQRSBoQ29tcG9uZW50LAorICAgICAgICAgICAgT01YX0lOICBPTVhfQlVGRkVSSEVBREVSVFlQRSogcEJ1ZmZlcik7CisKKyAgICAvKiogcmVmZXIgdG8gT01YX0ZpbGxUaGlzQnVmZmVyIGluIE9NWF9jb3JlLmggb3IgdGhlIE9NWCBJTCAKKyAgICAgICAgc3BlY2lmaWNhdGlvbiBmb3IgZGV0YWlscyBvbiB0aGUgRmlsbFRoaXNCdWZmZXIgbWV0aG9kLgorICAgICAgICBAaW5ncm91cCBidWYKKyAgICAgKi8KKyAgICBPTVhfRVJST1JUWVBFICgqRmlsbFRoaXNCdWZmZXIpKAorICAgICAgICAgICAgT01YX0lOICBPTVhfSEFORExFVFlQRSBoQ29tcG9uZW50LAorICAgICAgICAgICAgT01YX0lOICBPTVhfQlVGRkVSSEVBREVSVFlQRSogcEJ1ZmZlcik7CisKKyAgICAvKiogVGhlIFNldENhbGxiYWNrcyBtZXRob2QgaXMgdXNlZCBieSB0aGUgY29yZSB0byBzcGVjaWZ5IHRoZSBjYWxsYmFjaworICAgICAgICBzdHJ1Y3R1cmUgZnJvbSB0aGUgYXBwbGljYXRpb24gdG8gdGhlIGNvbXBvbmVudC4gIFRoaXMgaXMgYSBibG9ja2luZworICAgICAgICBjYWxsLiAgVGhlIGNvbXBvbmVudCB3aWxsIHJldHVybiBmcm9tIHRoaXMgY2FsbCB3aXRoaW4gNSBtc2VjLgorICAgICAgICBAcGFyYW0gW2luXSBoQ29tcG9uZW50CisgICAgICAgICAgICBIYW5kbGUgb2YgdGhlIGNvbXBvbmVudCB0byBiZSBhY2Nlc3NlZC4gIFRoaXMgaXMgdGhlIGNvbXBvbmVudAorICAgICAgICAgICAgaGFuZGxlIHJldHVybmVkIGJ5IHRoZSBjYWxsIHRvIHRoZSBHZXRIYW5kbGUgZnVuY3Rpb24uCisgICAgICAgIEBwYXJhbSBbaW5dIHBDYWxsYmFja3MKKyAgICAgICAgICAgIHBvaW50ZXIgdG8gYW4gT01YX0NBTExCQUNLVFlQRSBzdHJ1Y3R1cmUgdXNlZCB0byBwcm92aWRlIHRoZSAKKyAgICAgICAgICAgIGNhbGxiYWNrIGluZm9ybWF0aW9uIHRvIHRoZSBjb21wb25lbnQKKyAgICAgICAgQHBhcmFtIFtpbl0gcEFwcERhdGEKKyAgICAgICAgICAgIHBvaW50ZXIgdG8gYW4gYXBwbGljYXRpb24gZGVmaW5lZCB2YWx1ZS4gIEl0IGlzIGFudGljaXBhdGVkIHRoYXQgCisgICAgICAgICAgICB0aGUgYXBwbGljYXRpb24gd2lsbCBwYXNzIGEgcG9pbnRlciB0byBhIGRhdGEgc3RydWN0dXJlIG9yIGEgInRoaXMKKyAgICAgICAgICAgIHBvaW50ZXIiIGluIHRoaXMgYXJlYSB0byBhbGxvdyB0aGUgY2FsbGJhY2sgKGluIHRoZSBhcHBsaWNhdGlvbikKKyAgICAgICAgICAgIHRvIGRldGVybWluZSB0aGUgY29udGV4dCBvZiB0aGUgY2FsbAorICAgICAgICBAcmV0dXJuIE9NWF9FUlJPUlRZUEUKKyAgICAgICAgICAgIElmIHRoZSBjb21tYW5kIHN1Y2Nlc3NmdWxseSBleGVjdXRlcywgdGhlIHJldHVybiBjb2RlIHdpbGwgYmUKKyAgICAgICAgICAgIE9NWF9FcnJvck5vbmUuICBPdGhlcndpc2UgdGhlIGFwcHJvcHJpYXRlIE9NWCBlcnJvciB3aWxsIGJlIHJldHVybmVkLgorICAgICAqLworICAgIE9NWF9FUlJPUlRZUEUgKCpTZXRDYWxsYmFja3MpKAorICAgICAgICAgICAgT01YX0lOICBPTVhfSEFORExFVFlQRSBoQ29tcG9uZW50LAorICAgICAgICAgICAgT01YX0lOICBPTVhfQ0FMTEJBQ0tUWVBFKiBwQ2FsbGJhY2tzLCAKKyAgICAgICAgICAgIE9NWF9JTiAgT01YX1BUUiBwQXBwRGF0YSk7CisKKyAgICAvKiogQ29tcG9uZW50RGVJbml0IG1ldGhvZCBpcyB1c2VkIHRvIGRlaW5pdGlhbGl6ZSB0aGUgY29tcG9uZW50CisgICAgICAgIHByb3ZpZGluZyBhIG1lYW5zIHRvIGZyZWUgYW55IHJlc291cmNlcyBhbGxvY2F0ZWQgYXQgY29tcG9uZW50CisgICAgICAgIGluaXRpYWxpemF0aW9uLiAgTk9URTogIEFmdGVyIHRoaXMgY2FsbCB0aGUgY29tcG9uZW50IGhhbmRsZSBpcworICAgICAgICBub3QgdmFsaWQgZm9yIGZ1cnRoZXIgdXNlLgorICAgICAgICBAcGFyYW0gW2luXSBoQ29tcG9uZW50CisgICAgICAgICAgICBIYW5kbGUgb2YgdGhlIGNvbXBvbmVudCB0byBiZSBhY2Nlc3NlZC4gIFRoaXMgaXMgdGhlIGNvbXBvbmVudAorICAgICAgICAgICAgaGFuZGxlIHJldHVybmVkIGJ5IHRoZSBjYWxsIHRvIHRoZSBHZXRIYW5kbGUgZnVuY3Rpb24uCisgICAgICAgIEByZXR1cm4gT01YX0VSUk9SVFlQRQorICAgICAgICAgICAgSWYgdGhlIGNvbW1hbmQgc3VjY2Vzc2Z1bGx5IGV4ZWN1dGVzLCB0aGUgcmV0dXJuIGNvZGUgd2lsbCBiZQorICAgICAgICAgICAgT01YX0Vycm9yTm9uZS4gIE90aGVyd2lzZSB0aGUgYXBwcm9wcmlhdGUgT01YIGVycm9yIHdpbGwgYmUgcmV0dXJuZWQuCisgICAgICovCisgICAgT01YX0VSUk9SVFlQRSAoKkNvbXBvbmVudERlSW5pdCkoCisgICAgICAgICAgICBPTVhfSU4gIE9NWF9IQU5ETEVUWVBFIGhDb21wb25lbnQpOworCisgICAgLyoqIEBpbmdyb3VwIGJ1ZiAqLworICAgIE9NWF9FUlJPUlRZUEUgKCpVc2VFR0xJbWFnZSkoCisgICAgICAgICAgICBPTVhfSU4gT01YX0hBTkRMRVRZUEUgaENvbXBvbmVudCwKKyAgICAgICAgICAgIE9NWF9JTk9VVCBPTVhfQlVGRkVSSEVBREVSVFlQRSoqIHBwQnVmZmVySGRyLAorICAgICAgICAgICAgT01YX0lOIE9NWF9VMzIgblBvcnRJbmRleCwKKyAgICAgICAgICAgIE9NWF9JTiBPTVhfUFRSIHBBcHBQcml2YXRlLAorICAgICAgICAgICAgT01YX0lOIHZvaWQqIGVnbEltYWdlKTsKKworICAgIE9NWF9FUlJPUlRZUEUgKCpDb21wb25lbnRSb2xlRW51bSkoCisgICAgICAgIE9NWF9JTiBPTVhfSEFORExFVFlQRSBoQ29tcG9uZW50LAorCQlPTVhfT1VUIE9NWF9VOCAqY1JvbGUsCisJCU9NWF9JTiBPTVhfVTMyIG5JbmRleCk7CisKK30gT01YX0NPTVBPTkVOVFRZUEU7CisKKyNpZmRlZiBfX2NwbHVzcGx1cworfQorI2VuZGlmIC8qIF9fY3BsdXNwbHVzICovCisKKyNlbmRpZgorLyogRmlsZSBFT0YgKi8KZGlmZiAtLWdpdCBhL2V4eW5vczQvbXVsdGltZWRpYS9vcGVubWF4L3NlY19vbXgvaW5jbHVkZS9raHJvbm9zL09NWF9Db250ZW50UGlwZS5oIGIvZXh5bm9zNC9tdWx0aW1lZGlhL29wZW5tYXgvc2VjX29teC9pbmNsdWRlL2tocm9ub3MvT01YX0NvbnRlbnRQaXBlLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNWY2MzEwYwotLS0gL2Rldi9udWxsCisrKyBiL2V4eW5vczQvbXVsdGltZWRpYS9vcGVubWF4L3NlY19vbXgvaW5jbHVkZS9raHJvbm9zL09NWF9Db250ZW50UGlwZS5oCkBAIC0wLDAgKzEsMTk1IEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDA4IFRoZSBLaHJvbm9zIEdyb3VwIEluYy4gCisgKiAKKyAqIFBlcm1pc3Npb24gaXMgaGVyZWJ5IGdyYW50ZWQsIGZyZWUgb2YgY2hhcmdlLCB0byBhbnkgcGVyc29uIG9idGFpbmluZworICogYSBjb3B5IG9mIHRoaXMgc29mdHdhcmUgYW5kIGFzc29jaWF0ZWQgZG9jdW1lbnRhdGlvbiBmaWxlcyAodGhlCisgKiAiU29mdHdhcmUiKSwgdG8gZGVhbCBpbiB0aGUgU29mdHdhcmUgd2l0aG91dCByZXN0cmljdGlvbiwgaW5jbHVkaW5nCisgKiB3aXRob3V0IGxpbWl0YXRpb24gdGhlIHJpZ2h0cyB0byB1c2UsIGNvcHksIG1vZGlmeSwgbWVyZ2UsIHB1Ymxpc2gsCisgKiBkaXN0cmlidXRlLCBzdWJsaWNlbnNlLCBhbmQvb3Igc2VsbCBjb3BpZXMgb2YgdGhlIFNvZnR3YXJlLCBhbmQgdG8KKyAqIHBlcm1pdCBwZXJzb25zIHRvIHdob20gdGhlIFNvZnR3YXJlIGlzIGZ1cm5pc2hlZCB0byBkbyBzbywgc3ViamVjdAorICogdG8gdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOiAKKyAqIFRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIHNoYWxsIGJlIGluY2x1ZGVkCisgKiBpbiBhbGwgY29waWVzIG9yIHN1YnN0YW50aWFsIHBvcnRpb25zIG9mIHRoZSBTb2Z0d2FyZS4gCisgKiAKKyAqIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBFWFBSRVNTCisgKiBPUiBJTVBMSUVELCBJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPIFRIRSBXQVJSQU5USUVTIE9GCisgKiBNRVJDSEFOVEFCSUxJVFksIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORCBOT05JTkZSSU5HRU1FTlQuCisgKiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SUyBPUiBDT1BZUklHSFQgSE9MREVSUyBCRSBMSUFCTEUgRk9SIEFOWQorICogQ0xBSU0sIERBTUFHRVMgT1IgT1RIRVIgTElBQklMSVRZLCBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwKKyAqIFRPUlQgT1IgT1RIRVJXSVNFLCBBUklTSU5HIEZST00sIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFCisgKiBTT0ZUV0FSRSBPUiBUSEUgVVNFIE9SIE9USEVSIERFQUxJTkdTIElOIFRIRSBTT0ZUV0FSRS4gCisgKgorICovCisKKy8qKiBPTVhfQ29udGVudFBpcGUuaCAtIE9wZW5NYXggSUwgdmVyc2lvbiAxLjEuMgorICogIFRoZSBPTVhfQ29udGVudFBpcGUgaGVhZGVyIGZpbGUgY29udGFpbnMgdGhlIGRlZmluaXRpb25zIHVzZWQgdG8gZGVmaW5lCisgKiAgdGhlIHB1YmxpYyBpbnRlcmZhY2UgZm9yIGNvbnRlbnQgcGlwbGVzLiAgVGhpcyBoZWFkZXIgZmlsZSBpcyBpbnRlbmRlZCB0bworICogIGJlIHVzZWQgYnkgdGhlIGNvbXBvbmVudC4KKyAqLworCisjaWZuZGVmIE9NWF9DT05URU5UUElQRV9ICisjZGVmaW5lIE9NWF9DT05URU5UUElQRV9ICisKKyNpZm5kZWYgS0RfRUFDQ0VTCisvKiBPcGVuS09ERSBlcnJvciBjb2Rlcy4gQ1BSZXN1bHQgdmFsdWVzIG1heSBiZSB6ZXJvIChpbmRpY2F0aW5nIHN1Y2Nlc3MKKyAgIG9yIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlcykgKi8KKyNkZWZpbmUgS0RfRUFDQ0VTICgxKQorI2RlZmluZSBLRF9FQUREUklOVVNFICgyKQorI2RlZmluZSBLRF9FQUdBSU4gKDUpCisjZGVmaW5lIEtEX0VCQURGICg3KQorI2RlZmluZSBLRF9FQlVTWSAoOCkKKyNkZWZpbmUgS0RfRUNPTk5SRUZVU0VEICg5KQorI2RlZmluZSBLRF9FQ09OTlJFU0VUICgxMCkKKyNkZWZpbmUgS0RfRURFQURMSyAoMTEpCisjZGVmaW5lIEtEX0VERVNUQUREUlJFUSAoMTIpCisjZGVmaW5lIEtEX0VSQU5HRSAoMzUpCisjZGVmaW5lIEtEX0VFWElTVCAoMTMpCisjZGVmaW5lIEtEX0VGQklHICgxNCkKKyNkZWZpbmUgS0RfRUhPU1RVTlJFQUNIICgxNSkKKyNkZWZpbmUgS0RfRUlOVkFMICgxNykKKyNkZWZpbmUgS0RfRUlPICgxOCkKKyNkZWZpbmUgS0RfRUlTQ09OTiAoMjApCisjZGVmaW5lIEtEX0VJU0RJUiAoMjEpCisjZGVmaW5lIEtEX0VNRklMRSAoMjIpCisjZGVmaW5lIEtEX0VOQU1FVE9PTE9ORyAoMjMpCisjZGVmaW5lIEtEX0VOT0VOVCAoMjQpCisjZGVmaW5lIEtEX0VOT01FTSAoMjUpCisjZGVmaW5lIEtEX0VOT1NQQyAoMjYpCisjZGVmaW5lIEtEX0VOT1NZUyAoMjcpCisjZGVmaW5lIEtEX0VOT1RDT05OICgyOCkKKyNkZWZpbmUgS0RfRVBFUk0gKDMzKQorI2RlZmluZSBLRF9FVElNRURPVVQgKDM2KQorI2RlZmluZSBLRF9FSUxTRVEgKDE5KQorI2VuZGlmCisKKy8qKiBNYXAgdHlwZXMgZnJvbSBPTVggc3RhbmRhcmQgdHlwZXMgb25seSBoZXJlIHNvIGludGVyZmFjZSBpcyBhcyBnZW5lcmljIGFzIHBvc3NpYmxlLiAqLwordHlwZWRlZiBPTVhfVTMyICAgIENQcmVzdWx0OwordHlwZWRlZiBjaGFyICogICAgIENQc3RyaW5nOyAgCit0eXBlZGVmIHZvaWQgKiAgICAgQ1BoYW5kbGU7Cit0eXBlZGVmIE9NWF9VMzIgICAgQ1B1aW50OwordHlwZWRlZiBPTVhfUzMyICAgIENQaW50OyAgCit0eXBlZGVmIGNoYXIgICAgICAgQ1BieXRlOyAgCit0eXBlZGVmIE9NWF9CT09MICAgQ1Bib29sOworCisvKiogZW51bWVyYXRpb24gb2Ygb3JpZ2luIHR5cGVzIHVzZWQgaW4gdGhlIENQX1BJUEVUWVBFJ3MgU2VlayBmdW5jdGlvbiAKKyAqIEBpbmdyb3VwIGNwCisgKi8KK3R5cGVkZWYgZW51bSBDUF9PUklHSU5UWVBFIHsKKyAgICBDUF9PcmlnaW5CZWdpbiwgICAgICAKKyAgICBDUF9PcmlnaW5DdXIsICAgICAgCisgICAgQ1BfT3JpZ2luRW5kLCAgICAgIAorICAgIENQX09yaWdpbktocm9ub3NFeHRlbnNpb25zID0gMHg2RjAwMDAwMCwgLyoqPCBSZXNlcnZlZCByZWdpb24gZm9yIGludHJvZHVjaW5nIEtocm9ub3MgU3RhbmRhcmQgRXh0ZW5zaW9ucyAqLyAKKyAgICBDUF9PcmlnaW5WZW5kb3JTdGFydFVudXNlZCA9IDB4N0YwMDAwMDAsIC8qKjwgUmVzZXJ2ZWQgcmVnaW9uIGZvciBpbnRyb2R1Y2luZyBWZW5kb3IgRXh0ZW5zaW9ucyAqLworICAgIENQX09yaWdpbk1heCA9IDBYN0ZGRkZGRkYKK30gQ1BfT1JJR0lOVFlQRTsKKworLyoqIGVudW1lcmF0aW9uIG9mIGNvbnRhY3QgYWNjZXNzIHR5cGVzIHVzZWQgaW4gdGhlIENQX1BJUEVUWVBFJ3MgT3BlbiBmdW5jdGlvbiAKKyAqIEBpbmdyb3VwIGNwCisgKi8KK3R5cGVkZWYgZW51bSBDUF9BQ0NFU1NUWVBFIHsKKyAgICBDUF9BY2Nlc3NSZWFkLCAgICAgIAorICAgIENQX0FjY2Vzc1dyaXRlLCAgCisgICAgQ1BfQWNjZXNzUmVhZFdyaXRlICwgIAorICAgIENQX0FjY2Vzc0tocm9ub3NFeHRlbnNpb25zID0gMHg2RjAwMDAwMCwgLyoqPCBSZXNlcnZlZCByZWdpb24gZm9yIGludHJvZHVjaW5nIEtocm9ub3MgU3RhbmRhcmQgRXh0ZW5zaW9ucyAqLyAKKyAgICBDUF9BY2Nlc3NWZW5kb3JTdGFydFVudXNlZCA9IDB4N0YwMDAwMDAsIC8qKjwgUmVzZXJ2ZWQgcmVnaW9uIGZvciBpbnRyb2R1Y2luZyBWZW5kb3IgRXh0ZW5zaW9ucyAqLworICAgIENQX0FjY2Vzc01heCA9IDBYN0ZGRkZGRkYKK30gQ1BfQUNDRVNTVFlQRTsKKworLyoqIGVudW1lcmF0aW9uIG9mIHJlc3VsdHMgcmV0dXJuZWQgYnkgdGhlIENQX1BJUEVUWVBFJ3MgQ2hlY2tBdmFpbGFibGVCeXRlcyBmdW5jdGlvbiAKKyAqIEBpbmdyb3VwIGNwCisgKi8KK3R5cGVkZWYgZW51bSBDUF9DSEVDS0JZVEVTUkVTVUxUVFlQRQoreworICAgIENQX0NoZWNrQnl0ZXNPaywgICAgICAgICAgICAgICAgICAgIC8qKjwgVGhlcmUgYXJlIGF0IGxlYXN0IHRoZSByZXF1ZXN0IG51bWJlciAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvZiBieXRlcyBhdmFpbGFibGUgKi8KKyAgICBDUF9DaGVja0J5dGVzTm90UmVhZHksICAgICAgICAgICAgICAvKio8IFRoZSBwaXBlIGlzIHN0aWxsIHJldHJpZXZpbmcgYnl0ZXMgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYW5kIHByZXNlbnRseSBsYWNrcyBzdWZmaWNpZW50IGJ5dGVzLiAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDbGllbnQgd2lsbCBiZSBjYWxsZWQgd2hlbiB0aGV5IGFyZSAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdWZmaWNpZW50IGJ5dGVzIGFyZSBhdmFpbGFibGUuICovCisgICAgQ1BfQ2hlY2tCeXRlc0luc3VmZmljaWVudEJ5dGVzICAsICAgICAvKio8IFRoZSBwaXBlIGhhcyByZXRyaWV2ZWQgYWxsIGJ5dGVzIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJ1dCB0aG9zZSBhdmFpbGFibGUgYXJlIGxlc3MgdGhhbiB0aG9zZSAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXF1ZXN0ZWQgKi8KKyAgICBDUF9DaGVja0J5dGVzQXRFbmRPZlN0cmVhbSwgICAgICAgICAvKio8IFRoZSBwaXBlIGhhcyByZWFjaGVkIHRoZSBlbmQgb2Ygc3RyZWFtCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYW5kIG5vIG1vcmUgYnl0ZXMgYXJlIGF2YWlsYWJsZS4gKi8KKyAgICBDUF9DaGVja0J5dGVzT3V0T2ZCdWZmZXJzLCAgICAgICAgICAvKio8IEFsbCByZWFkL3dyaXRlIGJ1ZmZlcnMgYXJlIGN1cnJlbnRseSBpbiB1c2UuICovCisgICAgQ1BfQ2hlY2tCeXRlc0tocm9ub3NFeHRlbnNpb25zID0gMHg2RjAwMDAwMCwgLyoqPCBSZXNlcnZlZCByZWdpb24gZm9yIGludHJvZHVjaW5nIEtocm9ub3MgU3RhbmRhcmQgRXh0ZW5zaW9ucyAqLyAKKyAgICBDUF9DaGVja0J5dGVzVmVuZG9yU3RhcnRVbnVzZWQgPSAweDdGMDAwMDAwLCAvKio8IFJlc2VydmVkIHJlZ2lvbiBmb3IgaW50cm9kdWNpbmcgVmVuZG9yIEV4dGVuc2lvbnMgKi8KKyAgICBDUF9DaGVja0J5dGVzTWF4ID0gMFg3RkZGRkZGRgorfSBDUF9DSEVDS0JZVEVTUkVTVUxUVFlQRTsKKworLyoqIGVudW1lcmF0aW9uIG9mIGNvbnRlbnQgcGlwZSBldmVudHMgc2VudCB0byB0aGUgY2xpZW50IGNhbGxiYWNrLiAKKyAqIEBpbmdyb3VwIGNwCisgKi8KK3R5cGVkZWYgZW51bSBDUF9FVkVOVFRZUEV7CisgICAgQ1BfQnl0ZXNBdmFpbGFibGUsICAgICAgCSAgICAvKiogYnl0ZXMgcmVxdWVzdGVkIGluIGEgQ2hlY2tBdmFpbGFibGVCeXRlcyBjYWxsIGFyZSBub3cgYXZhaWxhYmxlKi8KKyAgICBDUF9PdmVyZmxvdywgIAkJICAgICAgICAgICAvKiogZW51bWVyYXRpb24gb2YgY29udGVudCBwaXBlIGV2ZW50cyBzZW50IHRvIHRoZSBjbGllbnQgY2FsbGJhY2sqLworICAgIENQX1BpcGVEaXNjb25uZWN0ZWQgICwgIAkJICAgIC8qKiBlbnVtZXJhdGlvbiBvZiBjb250ZW50IHBpcGUgZXZlbnRzIHNlbnQgdG8gdGhlIGNsaWVudCBjYWxsYmFjayovCisgICAgQ1BfRXZlbnRLaHJvbm9zRXh0ZW5zaW9ucyA9IDB4NkYwMDAwMDAsIC8qKjwgUmVzZXJ2ZWQgcmVnaW9uIGZvciBpbnRyb2R1Y2luZyBLaHJvbm9zIFN0YW5kYXJkIEV4dGVuc2lvbnMgKi8gCisgICAgQ1BfRXZlbnRWZW5kb3JTdGFydFVudXNlZCA9IDB4N0YwMDAwMDAsIC8qKjwgUmVzZXJ2ZWQgcmVnaW9uIGZvciBpbnRyb2R1Y2luZyBWZW5kb3IgRXh0ZW5zaW9ucyAqLworICAgIENQX0V2ZW50TWF4ID0gMFg3RkZGRkZGRgorfSBDUF9FVkVOVFRZUEU7CisKKy8qKiBjb250ZW50IHBpcGUgZGVmaW5pdGlvbiAKKyAqIEBpbmdyb3VwIGNwCisgKi8KK3R5cGVkZWYgc3RydWN0IENQX1BJUEVUWVBFCit7CisgICAgLyoqIE9wZW4gYSBjb250ZW50IHN0cmVhbSBmb3IgcmVhZGluZyBvciB3cml0aW5nLiAqLyAKKyAgICBDUHJlc3VsdCAoKk9wZW4pKCBDUGhhbmRsZSogaENvbnRlbnQsIENQc3RyaW5nIHN6VVJJLCBDUF9BQ0NFU1NUWVBFIGVBY2Nlc3MgKTsKKworICAgIC8qKiBDbG9zZSBhIGNvbnRlbnQgc3RyZWFtLiAqLyAKKyAgICBDUHJlc3VsdCAoKkNsb3NlKSggQ1BoYW5kbGUgaENvbnRlbnQgKTsKKworICAgIC8qKiBDcmVhdGUgYSBjb250ZW50IHNvdXJjZSBhbmQgb3BlbiBpdCBmb3Igd3JpdGluZy4gKi8gCisgICAgQ1ByZXN1bHQgKCpDcmVhdGUpKCBDUGhhbmRsZSAqaENvbnRlbnQsIENQc3RyaW5nIHN6VVJJICk7CisKKyAgICAvKiogQ2hlY2sgdGhlIHRoYXQgc3BlY2lmaWVkIG51bWJlciBvZiBieXRlcyBhcmUgYXZhaWxhYmxlIGZvciByZWFkaW5nIG9yIHdyaXRpbmcgKGRlcGVuZGluZyBvbiBhY2Nlc3MgdHlwZSkuKi8KKyAgICBDUHJlc3VsdCAoKkNoZWNrQXZhaWxhYmxlQnl0ZXMpKCBDUGhhbmRsZSBoQ29udGVudCwgQ1B1aW50IG5CeXRlc1JlcXVlc3RlZCwgQ1BfQ0hFQ0tCWVRFU1JFU1VMVFRZUEUgKmVSZXN1bHQgKTsKKworICAgIC8qKiBTZWVrIHRvIGNlcnRhaW4gcG9zaXRpb24gaW4gdGhlIGNvbnRlbnQgcmVsYXRpdmUgdG8gdGhlIHNwZWNpZmllZCBvcmlnaW4uICovCisgICAgQ1ByZXN1bHQgKCpTZXRQb3NpdGlvbikoIENQaGFuZGxlICBoQ29udGVudCwgQ1BpbnQgbk9mZnNldCwgQ1BfT1JJR0lOVFlQRSBlT3JpZ2luKTsKKworICAgIC8qKiBSZXRyaWV2ZSB0aGUgY3VycmVudCBwb3NpdGlvbiByZWxhdGl2ZSB0byB0aGUgc3RhcnQgb2YgdGhlIGNvbnRlbnQuICovCisgICAgQ1ByZXN1bHQgKCpHZXRQb3NpdGlvbikoIENQaGFuZGxlIGhDb250ZW50LCBDUHVpbnQgKnBQb3NpdGlvbik7CisKKyAgICAvKiogUmV0cmlldmUgZGF0YSBvZiB0aGUgc3BlY2lmaWVkIHNpemUgZnJvbSB0aGUgY29udGVudCBzdHJlYW0gKGFkdmFuY2UgY29udGVudCBwb2ludGVyIGJ5IHNpemUgb2YgZGF0YSkuCisgICAgICAgTm90ZTogcGlwZSBjbGllbnQgcHJvdmlkZXMgcG9pbnRlci4gVGhpcyBmdW5jdGlvbiBpcyBhcHByb3ByaWF0ZSBmb3Igc21hbGwgaGlnaCBmcmVxdWVuY3kgcmVhZHMuICovCisgICAgQ1ByZXN1bHQgKCpSZWFkKSggQ1BoYW5kbGUgaENvbnRlbnQsIENQYnl0ZSAqcERhdGEsIENQdWludCBuU2l6ZSk7IAorCisgICAgLyoqIFJldHJpZXZlIGEgYnVmZmVyIGFsbG9jYXRlZCBieSB0aGUgcGlwZSB0aGF0IGNvbnRhaW5zIHRoZSByZXF1ZXN0ZWQgbnVtYmVyIG9mIGJ5dGVzLiAKKyAgICAgICBCdWZmZXIgY29udGFpbnMgdGhlIG5leHQgYmxvY2sgb2YgYnl0ZXMsIGFzIHNwZWNpZmllZCBieSBuU2l6ZSwgb2YgdGhlIGNvbnRlbnQuIG5TaXplIGFsc28KKyAgICAgICByZXR1cm5zIHRoZSBzaXplIG9mIHRoZSBibG9jayBhY3R1YWxseSByZWFkLiBDb250ZW50IHBvaW50ZXIgYWR2YW5jZXMgdGhlIGJ5IHRoZSByZXR1cm5lZCBzaXplLiAKKyAgICAgICBOb3RlOiBwaXBlIHByb3ZpZGVzIHBvaW50ZXIuIFRoaXMgZnVuY3Rpb24gaXMgYXBwcm9wcmlhdGUgZm9yIGxhcmdlIHJlYWRzLiBUaGUgY2xpZW50IG11c3QgY2FsbCAKKyAgICAgICBSZWxlYXNlUmVhZEJ1ZmZlciB3aGVuIGRvbmUgd2l0aCBidWZmZXIuIAorCisgICAgICAgSW4gc29tZSBjYXNlcyB0aGUgcmVxdWVzdGVkIGJsb2NrIG1heSBub3QgcmVzaWRlIGluIGNvbnRpZ3VvdXMgbWVtb3J5IHdpdGhpbiB0aGUKKyAgICAgICBwaXBlIGltcGxlbWVudGF0aW9uLiBGb3IgaW5zdGFuY2UgaWYgdGhlIHBpcGUgbGV2ZXJhZ2VzIGEgY2lyY3VsYXIgYnVmZmVyIHRoZW4gdGhlIHJlcXVlc3RlZCAKKyAgICAgICBibG9jayBtYXkgc3RyYWRkbGUgdGhlIGJvdW5kYXJ5IG9mIHRoZSBjaXJjdWxhciBidWZmZXIuIEJ5IGRlZmF1bHQgYSBwaXBlIGltcGxlbWVudGF0aW9uIAorICAgICAgIHBlcmZvcm1zIGEgY29weSBpbiB0aGlzIGNhc2UgdG8gcHJvdmlkZSB0aGUgYmxvY2sgdG8gdGhlIHBpcGUgY2xpZW50IGluIG9uZSBjb250aWd1b3VzIGJ1ZmZlci4KKyAgICAgICBJZiwgaG93ZXZlciwgdGhlIGNsaWVudCBzZXRzIGJGb3JiaWRDb3B5LCB0aGVuIHRoZSBwaXBlIHJldHVybnMgb25seSB0aG9zZSBieXRlcyBwcmVjZWRpbmcgdGhlIG1lbW9yeSAKKyAgICAgICBib3VuZGFyeS4gSGVyZSB0aGUgY2xpZW50IG1heSByZXRyaWV2ZSB0aGUgZGF0YSBpbiBzZWdtZW50cyBvdmVyIHN1Y2Nlc3NpdmUgY2FsbHMuICovCisgICAgQ1ByZXN1bHQgKCpSZWFkQnVmZmVyKSggQ1BoYW5kbGUgaENvbnRlbnQsIENQYnl0ZSAqKnBwQnVmZmVyLCBDUHVpbnQgKm5TaXplLCBDUGJvb2wgYkZvcmJpZENvcHkpOworCisgICAgLyoqIFJlbGVhc2UgYSBidWZmZXIgb2J0YWluZWQgYnkgUmVhZEJ1ZmZlciBiYWNrIHRvIHRoZSBwaXBlLiAqLworICAgIENQcmVzdWx0ICgqUmVsZWFzZVJlYWRCdWZmZXIpKENQaGFuZGxlIGhDb250ZW50LCBDUGJ5dGUgKnBCdWZmZXIpOworCisgICAgLyoqIFdyaXRlIGRhdGEgb2YgdGhlIHNwZWNpZmllZCBzaXplIHRvIHRoZSBjb250ZW50IChhZHZhbmNlIGNvbnRlbnQgcG9pbnRlciBieSBzaXplIG9mIGRhdGEpLgorICAgICAgIE5vdGU6IHBpcGUgY2xpZW50IHByb3ZpZGVzIHBvaW50ZXIuIFRoaXMgZnVuY3Rpb24gaXMgYXBwcm9wcmlhdGUgZm9yIHNtYWxsIGhpZ2ggZnJlcXVlbmN5IHdyaXRlcy4gKi8KKyAgICBDUHJlc3VsdCAoKldyaXRlKSggQ1BoYW5kbGUgaENvbnRlbnQsIENQYnl0ZSAqZGF0YSwgQ1B1aW50IG5TaXplKTsgCisKKyAgICAvKiogUmV0cmlldmUgYSBidWZmZXIgYWxsb2NhdGVkIGJ5IHRoZSBwaXBlIHVzZWQgdG8gd3JpdGUgZGF0YSB0byB0aGUgY29udGVudC4gCisgICAgICAgQ2xpZW50IHdpbGwgZmlsbCBidWZmZXIgd2l0aCBvdXRwdXQgZGF0YS4gTm90ZTogcGlwZSBwcm92aWRlcyBwb2ludGVyLiBUaGlzIGZ1bmN0aW9uIGlzIGFwcHJvcHJpYXRlCisgICAgICAgZm9yIGxhcmdlIHdyaXRlcy4gVGhlIGNsaWVudCBtdXN0IGNhbGwgV3JpdGVCdWZmZXIgd2hlbiBkb25lIGl0IGhhcyBmaWxsZWQgdGhlIGJ1ZmZlciB3aXRoIGRhdGEuKi8KKyAgICBDUHJlc3VsdCAoKkdldFdyaXRlQnVmZmVyKSggQ1BoYW5kbGUgaENvbnRlbnQsIENQYnl0ZSAqKnBwQnVmZmVyLCBDUHVpbnQgblNpemUpOworCisgICAgLyoqIERlbGl2ZXIgYSBidWZmZXIgb2J0YWluZWQgdmlhIEdldFdyaXRlQnVmZmVyIHRvIHRoZSBwaXBlLiBQaXBlIHdpbGwgd3JpdGUgdGhlIAorICAgICAgIHRoZSBjb250ZW50cyBvZiB0aGUgYnVmZmVyIHRvIGNvbnRlbnQgYW5kIGFkdmFuY2UgY29udGVudCBwb2ludGVyIGJ5IHRoZSBzaXplIG9mIHRoZSBidWZmZXIgKi8KKyAgICBDUHJlc3VsdCAoKldyaXRlQnVmZmVyKSggQ1BoYW5kbGUgaENvbnRlbnQsIENQYnl0ZSAqcEJ1ZmZlciwgQ1B1aW50IG5GaWxsZWRTaXplKTsKKworICAgIC8qKiBSZWdpc3RlciBhIHBlci1oYW5kbGUgY2xpZW50IGNhbGxiYWNrIHdpdGggdGhlIGNvbnRlbnQgcGlwZS4gKi8KKyAgICBDUHJlc3VsdCAoKlJlZ2lzdGVyQ2FsbGJhY2spKCBDUGhhbmRsZSBoQ29udGVudCwgQ1ByZXN1bHQgKCpDbGllbnRDYWxsYmFjaykoQ1BfRVZFTlRUWVBFIGVFdmVudCwgQ1B1aW50IGlQYXJhbSkpOworCit9IENQX1BJUEVUWVBFOworCisjZW5kaWYKKwpkaWZmIC0tZ2l0IGEvZXh5bm9zNC9tdWx0aW1lZGlhL29wZW5tYXgvc2VjX29teC9pbmNsdWRlL2tocm9ub3MvT01YX0NvcmUuaCBiL2V4eW5vczQvbXVsdGltZWRpYS9vcGVubWF4L3NlY19vbXgvaW5jbHVkZS9raHJvbm9zL09NWF9Db3JlLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTA3NmYyZgotLS0gL2Rldi9udWxsCisrKyBiL2V4eW5vczQvbXVsdGltZWRpYS9vcGVubWF4L3NlY19vbXgvaW5jbHVkZS9raHJvbm9zL09NWF9Db3JlLmgKQEAgLTAsMCArMSwxNDMxIEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDA4IFRoZSBLaHJvbm9zIEdyb3VwIEluYy4gCisgKiAKKyAqIFBlcm1pc3Npb24gaXMgaGVyZWJ5IGdyYW50ZWQsIGZyZWUgb2YgY2hhcmdlLCB0byBhbnkgcGVyc29uIG9idGFpbmluZworICogYSBjb3B5IG9mIHRoaXMgc29mdHdhcmUgYW5kIGFzc29jaWF0ZWQgZG9jdW1lbnRhdGlvbiBmaWxlcyAodGhlCisgKiAiU29mdHdhcmUiKSwgdG8gZGVhbCBpbiB0aGUgU29mdHdhcmUgd2l0aG91dCByZXN0cmljdGlvbiwgaW5jbHVkaW5nCisgKiB3aXRob3V0IGxpbWl0YXRpb24gdGhlIHJpZ2h0cyB0byB1c2UsIGNvcHksIG1vZGlmeSwgbWVyZ2UsIHB1Ymxpc2gsCisgKiBkaXN0cmlidXRlLCBzdWJsaWNlbnNlLCBhbmQvb3Igc2VsbCBjb3BpZXMgb2YgdGhlIFNvZnR3YXJlLCBhbmQgdG8KKyAqIHBlcm1pdCBwZXJzb25zIHRvIHdob20gdGhlIFNvZnR3YXJlIGlzIGZ1cm5pc2hlZCB0byBkbyBzbywgc3ViamVjdAorICogdG8gdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOiAKKyAqIFRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIHNoYWxsIGJlIGluY2x1ZGVkCisgKiBpbiBhbGwgY29waWVzIG9yIHN1YnN0YW50aWFsIHBvcnRpb25zIG9mIHRoZSBTb2Z0d2FyZS4gCisgKiAKKyAqIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBFWFBSRVNTCisgKiBPUiBJTVBMSUVELCBJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPIFRIRSBXQVJSQU5USUVTIE9GCisgKiBNRVJDSEFOVEFCSUxJVFksIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORCBOT05JTkZSSU5HRU1FTlQuCisgKiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SUyBPUiBDT1BZUklHSFQgSE9MREVSUyBCRSBMSUFCTEUgRk9SIEFOWQorICogQ0xBSU0sIERBTUFHRVMgT1IgT1RIRVIgTElBQklMSVRZLCBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwKKyAqIFRPUlQgT1IgT1RIRVJXSVNFLCBBUklTSU5HIEZST00sIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFCisgKiBTT0ZUV0FSRSBPUiBUSEUgVVNFIE9SIE9USEVSIERFQUxJTkdTIElOIFRIRSBTT0ZUV0FSRS4gCisgKgorICovCisKKy8qKiBPTVhfQ29yZS5oIC0gT3Blbk1heCBJTCB2ZXJzaW9uIDEuMS4yCisgKiAgVGhlIE9NWF9Db3JlIGhlYWRlciBmaWxlIGNvbnRhaW5zIHRoZSBkZWZpbml0aW9ucyB1c2VkIGJ5IGJvdGggdGhlCisgKiAgYXBwbGljYXRpb24gYW5kIHRoZSBjb21wb25lbnQgdG8gYWNjZXNzIGNvbW1vbiBpdGVtcy4KKyAqLworCisjaWZuZGVmIE9NWF9Db3JlX2gKKyNkZWZpbmUgT01YX0NvcmVfaAorCisjaWZkZWYgX19jcGx1c3BsdXMKK2V4dGVybiAiQyIgeworI2VuZGlmIC8qIF9fY3BsdXNwbHVzICovCisKKworLyogRWFjaCBPTVggaGVhZGVyIHNoYWxsIGluY2x1ZGUgYWxsIHJlcXVpcmVkIGhlYWRlciBmaWxlcyB0byBhbGxvdyB0aGUKKyAqICBoZWFkZXIgdG8gY29tcGlsZSB3aXRob3V0IGVycm9ycy4gIFRoZSBpbmNsdWRlcyBiZWxvdyBhcmUgcmVxdWlyZWQKKyAqICBmb3IgdGhpcyBoZWFkZXIgZmlsZSB0byBjb21waWxlIHN1Y2Nlc3NmdWxseSAKKyAqLworCisjaW5jbHVkZSA8T01YX0luZGV4Lmg+CisKKworLyoqIFRoZSBPTVhfQ09NTUFORFRZUEUgZW51bWVyYXRpb24gaXMgdXNlZCB0byBzcGVjaWZ5IHRoZSBhY3Rpb24gaW4gdGhlCisgKiAgT01YX1NlbmRDb21tYW5kIG1hY3JvLiAgCisgKiAgQGluZ3JvdXAgY29yZQorICovCit0eXBlZGVmIGVudW0gT01YX0NPTU1BTkRUWVBFCit7CisgICAgT01YX0NvbW1hbmRTdGF0ZVNldCwgICAgLyoqPCBDaGFuZ2UgdGhlIGNvbXBvbmVudCBzdGF0ZSAqLworICAgIE9NWF9Db21tYW5kRmx1c2gsICAgICAgIC8qKjwgRmx1c2ggdGhlIGRhdGEgcXVldWUocykgb2YgYSBjb21wb25lbnQgKi8KKyAgICBPTVhfQ29tbWFuZFBvcnREaXNhYmxlLCAvKio8IERpc2FibGUgYSBwb3J0IG9uIGEgY29tcG9uZW50LiAqLworICAgIE9NWF9Db21tYW5kUG9ydEVuYWJsZSwgIC8qKjwgRW5hYmxlIGEgcG9ydCBvbiBhIGNvbXBvbmVudC4gKi8KKyAgICBPTVhfQ29tbWFuZE1hcmtCdWZmZXIsICAvKio8IE1hcmsgYSBjb21wb25lbnQvYnVmZmVyIGZvciBvYnNlcnZhdGlvbiAqLworICAgIE9NWF9Db21tYW5kS2hyb25vc0V4dGVuc2lvbnMgPSAweDZGMDAwMDAwLCAvKio8IFJlc2VydmVkIHJlZ2lvbiBmb3IgaW50cm9kdWNpbmcgS2hyb25vcyBTdGFuZGFyZCBFeHRlbnNpb25zICovIAorICAgIE9NWF9Db21tYW5kVmVuZG9yU3RhcnRVbnVzZWQgPSAweDdGMDAwMDAwLCAvKio8IFJlc2VydmVkIHJlZ2lvbiBmb3IgaW50cm9kdWNpbmcgVmVuZG9yIEV4dGVuc2lvbnMgKi8KKyAgICBPTVhfQ29tbWFuZE1heCA9IDBYN0ZGRkZGRkYKK30gT01YX0NPTU1BTkRUWVBFOworCisKKworLyoqIFRoZSBPTVhfU1RBVEVUWVBFIGVudW1lcmF0aW9uIGlzIHVzZWQgdG8gaW5kaWNhdGUgb3IgY2hhbmdlIHRoZSBjb21wb25lbnQKKyAqICBzdGF0ZS4gIFRoaXMgZW51bWVyYXRpb24gcmVmbGVjdHMgdGhlIGN1cnJlbnQgc3RhdGUgb2YgdGhlIGNvbXBvbmVudCB3aGVuCisgKiAgdXNlZCB3aXRoIHRoZSBPTVhfR2V0U3RhdGUgbWFjcm8gb3IgYmVjb21lcyB0aGUgcGFyYW1ldGVyIGluIGEgc3RhdGUgY2hhbmdlCisgKiAgY29tbWFuZCB3aGVuIHVzZWQgd2l0aCB0aGUgT01YX1NlbmRDb21tYW5kIG1hY3JvLgorICoKKyAqICBUaGUgY29tcG9uZW50IHdpbGwgYmUgaW4gdGhlIExvYWRlZCBzdGF0ZSBhZnRlciB0aGUgY29tcG9uZW50IGlzIGluaXRpYWxseQorICogIGxvYWRlZCBpbnRvIG1lbW9yeS4gIEluIHRoZSBMb2FkZWQgc3RhdGUsIHRoZSBjb21wb25lbnQgaXMgbm90IGFsbG93ZWQgdG8KKyAqICBhbGxvY2F0ZSBvciBob2xkIHJlc291cmNlcyBvdGhlciB0aGFuIHRvIGJ1aWxkIGl0J3MgaW50ZXJuYWwgcGFyYW1ldGVyCisgKiAgYW5kIGNvbmZpZ3VyYXRpb24gdGFibGVzLiAgVGhlIGFwcGxpY2F0aW9uIHdpbGwgc2VuZCBvbmUgb3IgbW9yZQorICogIFNldFBhcmFtZXRlcnMvR2V0UGFyYW1ldGVycyBhbmQgU2V0Q29uZmlnL0dldENvbmZpZyBjb21tYW5kcyB0byB0aGUKKyAqICBjb21wb25lbnQgYW5kIHRoZSBjb21wb25lbnQgd2lsbCByZWNvcmQgZWFjaCBvZiB0aGVzZSBwYXJhbWV0ZXIgYW5kCisgKiAgY29uZmlndXJhdGlvbiBjaGFuZ2VzIGZvciB1c2UgbGF0ZXIuICBXaGVuIHRoZSBhcHBsaWNhdGlvbiBzZW5kcyB0aGUKKyAqICBJZGxlIGNvbW1hbmQsIHRoZSBjb21wb25lbnQgd2lsbCBhY3F1aXJlIHRoZSByZXNvdXJjZXMgbmVlZGVkIGZvciB0aGUKKyAqICBzcGVjaWZpZWQgY29uZmlndXJhdGlvbiBhbmQgd2lsbCB0cmFuc2l0aW9uIHRvIHRoZSBpZGxlIHN0YXRlIGlmIHRoZQorICogIGFsbG9jYXRpb24gaXMgc3VjY2Vzc2Z1bC4gIElmIHRoZSBjb21wb25lbnQgY2Fubm90IHN1Y2Nlc3NmdWxseQorICogIHRyYW5zaXRpb24gdG8gdGhlIGlkbGUgc3RhdGUgZm9yIGFueSByZWFzb24sIHRoZSBzdGF0ZSBvZiB0aGUgY29tcG9uZW50CisgKiAgc2hhbGwgYmUgZnVsbHkgcm9sbGVkIGJhY2sgdG8gdGhlIExvYWRlZCBzdGF0ZSAoZS5nLiBhbGwgYWxsb2NhdGVkIAorICogIHJlc291cmNlcyBzaGFsbCBiZSByZWxlYXNlZCkuICBXaGVuIHRoZSBjb21wb25lbnQgcmVjZWl2ZXMgdGhlIGNvbW1hbmQKKyAqICB0byBnbyB0byB0aGUgRXhlY3V0aW5nIHN0YXRlLCBpdCBzaGFsbCBiZWdpbiBwcm9jZXNzaW5nIGJ1ZmZlcnMgYnkKKyAqICBzZW5kaW5nIGFsbCBpbnB1dCBidWZmZXJzIGl0IGhvbGRzIHRvIHRoZSBhcHBsaWNhdGlvbi4gIFdoaWxlCisgKiAgdGhlIGNvbXBvbmVudCBpcyBpbiB0aGUgSWRsZSBzdGF0ZSwgdGhlIGFwcGxpY2F0aW9uIG1heSBhbHNvIHNlbmQgdGhlCisgKiAgUGF1c2UgY29tbWFuZC4gIElmIHRoZSBjb21wb25lbnQgcmVjZWl2ZXMgdGhlIHBhdXNlIGNvbW1hbmQgd2hpbGUgaW4gdGhlCisgKiAgSWRsZSBzdGF0ZSwgdGhlIGNvbXBvbmVudCBzaGFsbCBzZW5kIGFsbCBpbnB1dCBidWZmZXJzIGl0IGhvbGRzIHRvIHRoZSAKKyAqICBhcHBsaWNhdGlvbiwgYnV0IHNoYWxsIG5vdCBiZWdpbiBwcm9jZXNzaW5nIGJ1ZmZlcnMuICBUaGlzIHdpbGwgYWxsb3cgdGhlCisgKiAgYXBwbGljYXRpb24gdG8gcHJlZmlsbCBidWZmZXJzLgorICogCisgKiAgQGluZ3JvdXAgY29tcAorICovCisKK3R5cGVkZWYgZW51bSBPTVhfU1RBVEVUWVBFCit7CisgICAgT01YX1N0YXRlSW52YWxpZCwgICAgICAvKio8IGNvbXBvbmVudCBoYXMgZGV0ZWN0ZWQgdGhhdCBpdCdzIGludGVybmFsIGRhdGEgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cnVjdHVyZXMgYXJlIGNvcnJ1cHRlZCB0byB0aGUgcG9pbnQgdGhhdAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpdCBjYW5ub3QgZGV0ZXJtaW5lIGl0J3Mgc3RhdGUgcHJvcGVybHkgKi8KKyAgICBPTVhfU3RhdGVMb2FkZWQsICAgICAgLyoqPCBjb21wb25lbnQgaGFzIGJlZW4gbG9hZGVkIGJ1dCBoYXMgbm90IGNvbXBsZXRlZAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbml0aWFsaXphdGlvbi4gIFRoZSBPTVhfU2V0UGFyYW1ldGVyIG1hY3JvCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFuZCB0aGUgT01YX0dldFBhcmFtZXRlciBtYWNybyBhcmUgdGhlIG9ubHkgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhbGlkIG1hY3JvcyBhbGxvd2VkIHRvIGJlIHNlbnQgdG8gdGhlIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb21wb25lbnQgaW4gdGhpcyBzdGF0ZS4gKi8KKyAgICBPTVhfU3RhdGVJZGxlLCAgICAgICAgLyoqPCBjb21wb25lbnQgaW5pdGlhbGl6YXRpb24gaGFzIGJlZW4gY29tcGxldGVkCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN1Y2Nlc3NmdWxseSBhbmQgdGhlIGNvbXBvbmVudCBpcyByZWFkeSB0bworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0byBzdGFydC4gKi8KKyAgICBPTVhfU3RhdGVFeGVjdXRpbmcsICAgLyoqPCBjb21wb25lbnQgaGFzIGFjY2VwdGVkIHRoZSBzdGFydCBjb21tYW5kIGFuZAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpcyBwcm9jZXNzaW5nIGRhdGEgKGlmIGRhdGEgaXMgYXZhaWxhYmxlKSAqLworICAgIE9NWF9TdGF0ZVBhdXNlLCAgICAgICAvKio8IGNvbXBvbmVudCBoYXMgcmVjZWl2ZWQgcGF1c2UgY29tbWFuZCAqLworICAgIE9NWF9TdGF0ZVdhaXRGb3JSZXNvdXJjZXMsIC8qKjwgY29tcG9uZW50IGlzIHdhaXRpbmcgZm9yIHJlc291cmNlcywgZWl0aGVyIGFmdGVyIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcmVlbXB0aW9uIG9yIGJlZm9yZSBpdCBnZXRzIHRoZSByZXNvdXJjZXMgcmVxdWVzdGVkLgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTZWUgc3BlY2lmaWNhdGlvbiBmb3IgY29tcGxldGUgZGV0YWlscy4gKi8KKyAgICBPTVhfU3RhdGVLaHJvbm9zRXh0ZW5zaW9ucyA9IDB4NkYwMDAwMDAsIC8qKjwgUmVzZXJ2ZWQgcmVnaW9uIGZvciBpbnRyb2R1Y2luZyBLaHJvbm9zIFN0YW5kYXJkIEV4dGVuc2lvbnMgKi8gCisgICAgT01YX1N0YXRlVmVuZG9yU3RhcnRVbnVzZWQgPSAweDdGMDAwMDAwLCAvKio8IFJlc2VydmVkIHJlZ2lvbiBmb3IgaW50cm9kdWNpbmcgVmVuZG9yIEV4dGVuc2lvbnMgKi8KKyAgICBPTVhfU3RhdGVNYXggPSAwWDdGRkZGRkZGCit9IE9NWF9TVEFURVRZUEU7CisKKy8qKiBUaGUgT01YX0VSUk9SVFlQRSBlbnVtZXJhdGlvbiBkZWZpbmVzIHRoZSBzdGFuZGFyZCBPTVggRXJyb3JzLiAgVGhlc2UgCisgKiAgZXJyb3JzIHNob3VsZCBjb3ZlciBtb3N0IG9mIHRoZSBjb21tb24gZmFpbHVyZSBjYXNlcy4gIEhvd2V2ZXIsIAorICogIHZlbmRvcnMgYXJlIGZyZWUgdG8gYWRkIGFkZGl0aW9uYWwgZXJyb3IgbWVzc2FnZXMgb2YgdGhlaXIgb3duIGFzIAorICogIGxvbmcgYXMgdGhleSBmb2xsb3cgdGhlc2UgcnVsZXM6CisgKiAgMS4gIFZlbmRvciBlcnJvciBtZXNzYWdlcyBzaGFsbCBiZSBpbiB0aGUgcmFuZ2Ugb2YgMHg5MDAwMDAwMCB0bworICogICAgICAweDkwMDBGRkZGLgorICogIDIuICBWZW5kb3IgZXJyb3IgbWVzc2FnZXMgc2hhbGwgYmUgZGVmaW5lZCBpbiBhIGhlYWRlciBmaWxlIHByb3ZpZGVkCisgKiAgICAgIHdpdGggdGhlIGNvbXBvbmVudC4gIE5vIGVycm9yIG1lc3NhZ2VzIGFyZSBhbGxvd2VkIHRoYXQgYXJlCisgKiAgICAgIG5vdCBkZWZpbmVkLgorICovCit0eXBlZGVmIGVudW0gT01YX0VSUk9SVFlQRQoreworICBPTVhfRXJyb3JOb25lID0gMCwKKworICAvKiogVGhlcmUgd2VyZSBpbnN1ZmZpY2llbnQgcmVzb3VyY2VzIHRvIHBlcmZvcm0gdGhlIHJlcXVlc3RlZCBvcGVyYXRpb24gKi8KKyAgT01YX0Vycm9ySW5zdWZmaWNpZW50UmVzb3VyY2VzID0gKE9NWF9TMzIpIDB4ODAwMDEwMDAsCisKKyAgLyoqIFRoZXJlIHdhcyBhbiBlcnJvciwgYnV0IHRoZSBjYXVzZSBvZiB0aGUgZXJyb3IgY291bGQgbm90IGJlIGRldGVybWluZWQgKi8KKyAgT01YX0Vycm9yVW5kZWZpbmVkID0gKE9NWF9TMzIpIDB4ODAwMDEwMDEsCisKKyAgLyoqIFRoZSBjb21wb25lbnQgbmFtZSBzdHJpbmcgd2FzIG5vdCB2YWxpZCAqLworICBPTVhfRXJyb3JJbnZhbGlkQ29tcG9uZW50TmFtZSA9IChPTVhfUzMyKSAweDgwMDAxMDAyLAorCisgIC8qKiBObyBjb21wb25lbnQgd2l0aCB0aGUgc3BlY2lmaWVkIG5hbWUgc3RyaW5nIHdhcyBmb3VuZCAqLworICBPTVhfRXJyb3JDb21wb25lbnROb3RGb3VuZCA9IChPTVhfUzMyKSAweDgwMDAxMDAzLAorCisgIC8qKiBUaGUgY29tcG9uZW50IHNwZWNpZmllZCBkaWQgbm90IGhhdmUgYSAiT01YX0NvbXBvbmVudEluaXQiIG9yCisgICAgICAiT01YX0NvbXBvbmVudERlSW5pdCBlbnRyeSBwb2ludCAqLworICBPTVhfRXJyb3JJbnZhbGlkQ29tcG9uZW50ID0gKE9NWF9TMzIpIDB4ODAwMDEwMDQsCisKKyAgLyoqIE9uZSBvciBtb3JlIHBhcmFtZXRlcnMgd2VyZSBub3QgdmFsaWQgKi8KKyAgT01YX0Vycm9yQmFkUGFyYW1ldGVyID0gKE9NWF9TMzIpIDB4ODAwMDEwMDUsCisKKyAgLyoqIFRoZSByZXF1ZXN0ZWQgZnVuY3Rpb24gaXMgbm90IGltcGxlbWVudGVkICovCisgIE9NWF9FcnJvck5vdEltcGxlbWVudGVkID0gKE9NWF9TMzIpIDB4ODAwMDEwMDYsCisKKyAgLyoqIFRoZSBidWZmZXIgd2FzIGVtcHRpZWQgYmVmb3JlIHRoZSBuZXh0IGJ1ZmZlciB3YXMgcmVhZHkgKi8KKyAgT01YX0Vycm9yVW5kZXJmbG93ID0gKE9NWF9TMzIpIDB4ODAwMDEwMDcsCisKKyAgLyoqIFRoZSBidWZmZXIgd2FzIG5vdCBhdmFpbGFibGUgd2hlbiBpdCB3YXMgbmVlZGVkICovCisgIE9NWF9FcnJvck92ZXJmbG93ID0gKE9NWF9TMzIpIDB4ODAwMDEwMDgsCisKKyAgLyoqIFRoZSBoYXJkd2FyZSBmYWlsZWQgdG8gcmVzcG9uZCBhcyBleHBlY3RlZCAqLworICBPTVhfRXJyb3JIYXJkd2FyZSA9IChPTVhfUzMyKSAweDgwMDAxMDA5LAorCisgIC8qKiBUaGUgY29tcG9uZW50IGlzIGluIHRoZSBzdGF0ZSBPTVhfU3RhdGVJbnZhbGlkICovCisgIE9NWF9FcnJvckludmFsaWRTdGF0ZSA9IChPTVhfUzMyKSAweDgwMDAxMDBBLAorCisgIC8qKiBTdHJlYW0gaXMgZm91bmQgdG8gYmUgY29ycnVwdCAqLworICBPTVhfRXJyb3JTdHJlYW1Db3JydXB0ID0gKE9NWF9TMzIpIDB4ODAwMDEwMEIsCisKKyAgLyoqIFBvcnRzIGJlaW5nIGNvbm5lY3RlZCBhcmUgbm90IGNvbXBhdGlibGUgKi8KKyAgT01YX0Vycm9yUG9ydHNOb3RDb21wYXRpYmxlID0gKE9NWF9TMzIpIDB4ODAwMDEwMEMsCisKKyAgLyoqIFJlc291cmNlcyBhbGxvY2F0ZWQgdG8gYW4gaWRsZSBjb21wb25lbnQgaGF2ZSBiZWVuCisgICAgICBsb3N0IHJlc3VsdGluZyBpbiB0aGUgY29tcG9uZW50IHJldHVybmluZyB0byB0aGUgbG9hZGVkIHN0YXRlICovCisgIE9NWF9FcnJvclJlc291cmNlc0xvc3QgPSAoT01YX1MzMikgMHg4MDAwMTAwRCwKKworICAvKiogTm8gbW9yZSBpbmRpY2llcyBjYW4gYmUgZW51bWVyYXRlZCAqLworICBPTVhfRXJyb3JOb01vcmUgPSAoT01YX1MzMikgMHg4MDAwMTAwRSwKKworICAvKiogVGhlIGNvbXBvbmVudCBkZXRlY3RlZCBhIHZlcnNpb24gbWlzbWF0Y2ggKi8KKyAgT01YX0Vycm9yVmVyc2lvbk1pc21hdGNoID0gKE9NWF9TMzIpIDB4ODAwMDEwMEYsCisKKyAgLyoqIFRoZSBjb21wb25lbnQgaXMgbm90IHJlYWR5IHRvIHJldHVybiBkYXRhIGF0IHRoaXMgdGltZSAqLworICBPTVhfRXJyb3JOb3RSZWFkeSA9IChPTVhfUzMyKSAweDgwMDAxMDEwLAorCisgIC8qKiBUaGVyZSB3YXMgYSB0aW1lb3V0IHRoYXQgb2NjdXJyZWQgKi8KKyAgT01YX0Vycm9yVGltZW91dCA9IChPTVhfUzMyKSAweDgwMDAxMDExLAorCisgIC8qKiBUaGlzIGVycm9yIG9jY3VycyB3aGVuIHRyeWluZyB0byB0cmFuc2l0aW9uIGludG8gdGhlIHN0YXRlIHlvdSBhcmUgYWxyZWFkeSBpbiAqLworICBPTVhfRXJyb3JTYW1lU3RhdGUgPSAoT01YX1MzMikgMHg4MDAwMTAxMiwKKworICAvKiogUmVzb3VyY2VzIGFsbG9jYXRlZCB0byBhbiBleGVjdXRpbmcgb3IgcGF1c2VkIGNvbXBvbmVudCBoYXZlIGJlZW4gCisgICAgICBwcmVlbXB0ZWQsIGNhdXNpbmcgdGhlIGNvbXBvbmVudCB0byByZXR1cm4gdG8gdGhlIGlkbGUgc3RhdGUgKi8KKyAgT01YX0Vycm9yUmVzb3VyY2VzUHJlZW1wdGVkID0gKE9NWF9TMzIpIDB4ODAwMDEwMTMsIAorCisgIC8qKiBBIG5vbi1zdXBwbGllciBwb3J0IHNlbmRzIHRoaXMgZXJyb3IgdG8gdGhlIElMIGNsaWVudCAodmlhIHRoZSBFdmVudEhhbmRsZXIgY2FsbGJhY2spIAorICAgICAgZHVyaW5nIHRoZSBhbGxvY2F0aW9uIG9mIGJ1ZmZlcnMgKG9uIGEgdHJhbnNpdGlvbiBmcm9tIHRoZSBMT0FERUQgdG8gdGhlIElETEUgc3RhdGUgb3IKKyAgICAgIG9uIGEgcG9ydCByZXN0YXJ0KSB3aGVuIGl0IGRlZW1zIHRoYXQgaXQgaGFzIHdhaXRlZCBhbiB1bnVzdWFsbHkgbG9uZyB0aW1lIGZvciB0aGUgc3VwcGxpZXIgCisgICAgICB0byBzZW5kIGl0IGFuIGFsbG9jYXRlZCBidWZmZXIgdmlhIGEgVXNlQnVmZmVyIGNhbGwuICovCisgIE9NWF9FcnJvclBvcnRVbnJlc3BvbnNpdmVEdXJpbmdBbGxvY2F0aW9uID0gKE9NWF9TMzIpIDB4ODAwMDEwMTQsCisKKyAgLyoqIEEgbm9uLXN1cHBsaWVyIHBvcnQgc2VuZHMgdGhpcyBlcnJvciB0byB0aGUgSUwgY2xpZW50ICh2aWEgdGhlIEV2ZW50SGFuZGxlciBjYWxsYmFjaykgCisgICAgICBkdXJpbmcgdGhlIGRlYWxsb2NhdGlvbiBvZiBidWZmZXJzIChvbiBhIHRyYW5zaXRpb24gZnJvbSB0aGUgSURMRSB0byBMT0FERUQgc3RhdGUgb3IgCisgICAgICBvbiBhIHBvcnQgc3RvcCkgd2hlbiBpdCBkZWVtcyB0aGF0IGl0IGhhcyB3YWl0ZWQgYW4gdW51c3VhbGx5IGxvbmcgdGltZSBmb3IgdGhlIHN1cHBsaWVyIAorICAgICAgdG8gcmVxdWVzdCB0aGUgZGVhbGxvY2F0aW9uIG9mIGEgYnVmZmVyIGhlYWRlciB2aWEgYSBGcmVlQnVmZmVyIGNhbGwuICovCisgIE9NWF9FcnJvclBvcnRVbnJlc3BvbnNpdmVEdXJpbmdEZWFsbG9jYXRpb24gPSAoT01YX1MzMikgMHg4MDAwMTAxNSwKKworICAvKiogQSBzdXBwbGllciBwb3J0IHNlbmRzIHRoaXMgZXJyb3IgdG8gdGhlIElMIGNsaWVudCAodmlhIHRoZSBFdmVudEhhbmRsZXIgY2FsbGJhY2spIAorICAgICAgZHVyaW5nIHRoZSBzdG9wcGluZyBvZiBhIHBvcnQgKGVpdGhlciBvbiBhIHRyYW5zaXRpb24gZnJvbSB0aGUgSURMRSB0byBMT0FERUQgCisgICAgICBzdGF0ZSBvciBhIHBvcnQgc3RvcCkgd2hlbiBpdCBkZWVtcyB0aGF0IGl0IGhhcyB3YWl0ZWQgYW4gdW51c3VhbGx5IGxvbmcgdGltZSBmb3IgCisgICAgICB0aGUgbm9uLXN1cHBsaWVyIHRvIHJldHVybiBhIGJ1ZmZlciB2aWEgYW4gRW1wdHlUaGlzQnVmZmVyIG9yIEZpbGxUaGlzQnVmZmVyIGNhbGwuICovCisgIE9NWF9FcnJvclBvcnRVbnJlc3BvbnNpdmVEdXJpbmdTdG9wID0gKE9NWF9TMzIpIDB4ODAwMDEwMTYsCisKKyAgLyoqIEF0dGVtcHRpbmcgYSBzdGF0ZSB0cmFuc3Rpb24gdGhhdCBpcyBub3QgYWxsb3dlZCAqLworICBPTVhfRXJyb3JJbmNvcnJlY3RTdGF0ZVRyYW5zaXRpb24gPSAoT01YX1MzMikgMHg4MDAwMTAxNywKKworICAvKiBBdHRlbXB0aW5nIGEgY29tbWFuZCB0aGF0IGlzIG5vdCBhbGxvd2VkIGR1cmluZyB0aGUgcHJlc2VudCBzdGF0ZS4gKi8KKyAgT01YX0Vycm9ySW5jb3JyZWN0U3RhdGVPcGVyYXRpb24gPSAoT01YX1MzMikgMHg4MDAwMTAxOCwgCisKKyAgLyoqIFRoZSB2YWx1ZXMgZW5jYXBzdWxhdGVkIGluIHRoZSBwYXJhbWV0ZXIgb3IgY29uZmlnIHN0cnVjdHVyZSBhcmUgbm90IHN1cHBvcnRlZC4gKi8KKyAgT01YX0Vycm9yVW5zdXBwb3J0ZWRTZXR0aW5nID0gKE9NWF9TMzIpIDB4ODAwMDEwMTksCisKKyAgLyoqIFRoZSBwYXJhbWV0ZXIgb3IgY29uZmlnIGluZGljYXRlZCBieSB0aGUgZ2l2ZW4gaW5kZXggaXMgbm90IHN1cHBvcnRlZC4gKi8KKyAgT01YX0Vycm9yVW5zdXBwb3J0ZWRJbmRleCA9IChPTVhfUzMyKSAweDgwMDAxMDFBLAorCisgIC8qKiBUaGUgcG9ydCBpbmRleCBzdXBwbGllZCBpcyBpbmNvcnJlY3QuICovCisgIE9NWF9FcnJvckJhZFBvcnRJbmRleCA9IChPTVhfUzMyKSAweDgwMDAxMDFCLAorCisgIC8qKiBUaGUgcG9ydCBoYXMgbG9zdCBvbmUgb3IgbW9yZSBvZiBpdHMgYnVmZmVycyBhbmQgaXQgdGh1cyB1bnBvcHVsYXRlZC4gKi8KKyAgT01YX0Vycm9yUG9ydFVucG9wdWxhdGVkID0gKE9NWF9TMzIpIDB4ODAwMDEwMUMsCisKKyAgLyoqIENvbXBvbmVudCBzdXNwZW5kZWQgZHVlIHRvIHRlbXBvcmFyeSBsb3NzIG9mIHJlc291cmNlcyAqLworICBPTVhfRXJyb3JDb21wb25lbnRTdXNwZW5kZWQgPSAoT01YX1MzMikgMHg4MDAwMTAxRCwKKworICAvKiogQ29tcG9uZW50IHN1c3BlbmRlZCBkdWUgdG8gYW4gaW5hYmlsaXR5IHRvIGFjcXVpcmUgZHluYW1pYyByZXNvdXJjZXMgKi8KKyAgT01YX0Vycm9yRHluYW1pY1Jlc291cmNlc1VuYXZhaWxhYmxlID0gKE9NWF9TMzIpIDB4ODAwMDEwMUUsCisKKyAgLyoqIFdoZW4gdGhlIG1hY3JvYmxvY2sgZXJyb3IgcmVwb3J0aW5nIGlzIGVuYWJsZWQgdGhlIGNvbXBvbmVudCByZXR1cm5zIG5ldyBlcnJvciAKKyAgZm9yIGV2ZXJ5IGZyYW1lIHRoYXQgaGFzIGVycm9ycyAqLworICBPTVhfRXJyb3JNYkVycm9yc0luRnJhbWUgPSAoT01YX1MzMikgMHg4MDAwMTAxRiwKKworICAvKiogQSBjb21wb25lbnQgcmVwb3J0cyB0aGlzIGVycm9yIHdoZW4gaXQgY2Fubm90IHBhcnNlIG9yIGRldGVybWluZSB0aGUgZm9ybWF0IG9mIGFuIGlucHV0IHN0cmVhbS4gKi8KKyAgT01YX0Vycm9yRm9ybWF0Tm90RGV0ZWN0ZWQgPSAoT01YX1MzMikgMHg4MDAwMTAyMCwgCisKKyAgLyoqIFRoZSBjb250ZW50IG9wZW4gb3BlcmF0aW9uIGZhaWxlZC4gKi8KKyAgT01YX0Vycm9yQ29udGVudFBpcGVPcGVuRmFpbGVkID0gKE9NWF9TMzIpIDB4ODAwMDEwMjEsCisKKyAgLyoqIFRoZSBjb250ZW50IGNyZWF0aW9uIG9wZXJhdGlvbiBmYWlsZWQuICovCisgIE9NWF9FcnJvckNvbnRlbnRQaXBlQ3JlYXRpb25GYWlsZWQgPSAoT01YX1MzMikgMHg4MDAwMTAyMiwKKworICAvKiogU2VwYXJhdGUgdGFibGUgaW5mb3JtYXRpb24gaXMgYmVpbmcgdXNlZCAqLworICBPTVhfRXJyb3JTZXBlcmF0ZVRhYmxlc1VzZWQgPSAoT01YX1MzMikgMHg4MDAwMTAyMywKKworICAvKiogVHVubmVsaW5nIGlzIHVuc3VwcG9ydGVkIGJ5IHRoZSBjb21wb25lbnQqLworICBPTVhfRXJyb3JUdW5uZWxpbmdVbnN1cHBvcnRlZCA9IChPTVhfUzMyKSAweDgwMDAxMDI0LAorCisgIE9NWF9FcnJvcktocm9ub3NFeHRlbnNpb25zID0gKE9NWF9TMzIpMHg4RjAwMDAwMCwgLyoqPCBSZXNlcnZlZCByZWdpb24gZm9yIGludHJvZHVjaW5nIEtocm9ub3MgU3RhbmRhcmQgRXh0ZW5zaW9ucyAqLyAKKyAgT01YX0Vycm9yVmVuZG9yU3RhcnRVbnVzZWQgPSAoT01YX1MzMikweDkwMDAwMDAwLCAvKio8IFJlc2VydmVkIHJlZ2lvbiBmb3IgaW50cm9kdWNpbmcgVmVuZG9yIEV4dGVuc2lvbnMgKi8KKyAgT01YX0Vycm9yTWF4ID0gMHg3RkZGRkZGRgorfSBPTVhfRVJST1JUWVBFOworCisvKiogQGluZ3JvdXAgY29yZSAqLwordHlwZWRlZiBPTVhfRVJST1JUWVBFICgqIE9NWF9DT01QT05FTlRJTklUVFlQRSkoT01YX0lOICBPTVhfSEFORExFVFlQRSBoQ29tcG9uZW50KTsKKworLyoqIEBpbmdyb3VwIGNvcmUgKi8KK3R5cGVkZWYgc3RydWN0IE9NWF9DT01QT05FTlRSRUdJU1RFUlRZUEUKK3sKKyAgY29uc3QgY2hhciAgICAgICAgICAqIHBOYW1lOyAgICAgICAvKiBDb21wb25lbnQgbmFtZSwgMTI4IGJ5dGUgbGltaXQgKGluY2x1ZGluZyAnXDAnKSBhcHBsaWVzICovCisgIE9NWF9DT01QT05FTlRJTklUVFlQRSBwSW5pdGlhbGl6ZTsgLyogQ29tcG9uZW50IGluc3RhbmNlIGluaXRpYWxpemF0aW9uIGZ1bmN0aW9uICovCit9IE9NWF9DT01QT05FTlRSRUdJU1RFUlRZUEU7CisKKy8qKiBAaW5ncm91cCBjb3JlICovCitleHRlcm4gT01YX0NPTVBPTkVOVFJFR0lTVEVSVFlQRSBPTVhfQ29tcG9uZW50UmVnaXN0ZXJlZFtdOworCisvKiogQGluZ3JvdXAgcnBtICovCit0eXBlZGVmIHN0cnVjdCBPTVhfUFJJT1JJVFlNR01UVFlQRSB7CisgT01YX1UzMiBuU2l6ZTsgICAgICAgICAgICAgLyoqPCBzaXplIG9mIHRoZSBzdHJ1Y3R1cmUgaW4gYnl0ZXMgKi8KKyBPTVhfVkVSU0lPTlRZUEUgblZlcnNpb247ICAvKio8IE9NWCBzcGVjaWZpY2F0aW9uIHZlcnNpb24gaW5mb3JtYXRpb24gKi8KKyBPTVhfVTMyIG5Hcm91cFByaW9yaXR5OyAgICAgICAgICAgIC8qKjwgUHJpb3JpdHkgb2YgdGhlIGNvbXBvbmVudCBncm91cCAqLworIE9NWF9VMzIgbkdyb3VwSUQ7ICAgICAgICAgICAgICAgICAgLyoqPCBJRCBvZiB0aGUgY29tcG9uZW50IGdyb3VwICovCit9IE9NWF9QUklPUklUWU1HTVRUWVBFOworCisvKiBDb21wb25lbnQgbmFtZSBhbmQgUm9sZSBuYW1lcyBhcmUgbGltaXRlZCB0byAxMjggY2hhcmFjdGVycyBpbmNsdWRpbmcgdGhlIHRlcm1pbmF0aW5nICdcMCcuICovCisjZGVmaW5lIE9NWF9NQVhfU1RSSU5HTkFNRV9TSVpFIDEyOAorCisvKiogQGluZ3JvdXAgY29tcCAqLwordHlwZWRlZiBzdHJ1Y3QgT01YX1BBUkFNX0NPTVBPTkVOVFJPTEVUWVBFIHsKKyAgICBPTVhfVTMyIG5TaXplOyAgICAgICAgICAgICAgLyoqPCBzaXplIG9mIHRoZSBzdHJ1Y3R1cmUgaW4gYnl0ZXMgKi8KKyAgICBPTVhfVkVSU0lPTlRZUEUgblZlcnNpb247ICAgLyoqPCBPTVggc3BlY2lmaWNhdGlvbiB2ZXJzaW9uIGluZm9ybWF0aW9uICovCisgICAgT01YX1U4IGNSb2xlW09NWF9NQVhfU1RSSU5HTkFNRV9TSVpFXTsgIC8qKjwgbmFtZSBvZiBzdGFuZGFyZCBjb21wb25lbnQgd2hpY2ggZGVmaW5lcyBjb21wb25lbnQgcm9sZSAqLworfSBPTVhfUEFSQU1fQ09NUE9ORU5UUk9MRVRZUEU7CisKKy8qKiBFbmQgb2YgU3RyZWFtIEJ1ZmZlciBGbGFnOiAKKyAgKgorICAqIEEgY29tcG9uZW50IHNldHMgRU9TIHdoZW4gaXQgaGFzIG5vIG1vcmUgZGF0YSB0byBlbWl0IG9uIGEgcGFydGljdWxhciAKKyAgKiBvdXRwdXQgcG9ydC4gVGh1cyBhbiBvdXRwdXQgcG9ydCBzaGFsbCBzZXQgRU9TIG9uIHRoZSBsYXN0IGJ1ZmZlciBpdCAKKyAgKiBlbWl0cy4gQSBjb21wb25lbnQncyBkZXRlcm1pbmF0aW9uIG9mIHdoZW4gYW4gb3V0cHV0IHBvcnQgc2hvdWxkIAorICAqIGNlYXNlIHNlbmRpbmcgZGF0YSBpcyBpbXBsZW1lbmF0aW9uIHNwZWNpZmljLgorICAqIEBpbmdyb3VwIGJ1ZgorICAqLworCisjZGVmaW5lIE9NWF9CVUZGRVJGTEFHX0VPUyAweDAwMDAwMDAxIAorCisvKiogU3RhcnQgVGltZSBCdWZmZXIgRmxhZzogCisgKgorICogVGhlIHNvdXJjZSBvZiBhIHN0cmVhbSAoZS5nLiBhIGRlbXV4IGNvbXBvbmVudCkgc2V0cyB0aGUgU1RBUlRUSU1FCisgKiBmbGFnIG9uIHRoZSBidWZmZXIgdGhhdCBjb250YWlucyB0aGUgc3RhcnRpbmcgdGltZXN0YW1wIGZvciB0aGUKKyAqIHN0cmVhbS4gVGhlIHN0YXJ0aW5nIHRpbWVzdGFtcCBjb3JyZXNwb25kcyB0byB0aGUgZmlyc3QgZGF0YSB0aGF0CisgKiBzaG91bGQgYmUgZGlzcGxheWVkIGF0IHN0YXJ0dXAgb3IgYWZ0ZXIgYSBzZWVrLgorICogVGhlIGZpcnN0IHRpbWVzdGFtcCBvZiB0aGUgc3RyZWFtIGlzIG5vdCBuZWNlc3NhcmlseSB0aGUgc3RhcnQgdGltZS4KKyAqIEZvciBpbnN0YW5jZSwgaW4gdGhlIGNhc2Ugb2YgYSBzZWVrIHRvIGEgcGFydGljdWxhciB2aWRlbyBmcmFtZSwgCisgKiB0aGUgdGFyZ2V0IGZyYW1lIG1heSBiZSBhbiBpbnRlcmZyYW1lLiBUaHVzIHRoZSBmaXJzdCBidWZmZXIgb2YgCisgKiB0aGUgc3RyZWFtIHdpbGwgYmUgdGhlIGludHJhLWZyYW1lIHByZWNlZGluZyB0aGUgdGFyZ2V0IGZyYW1lIGFuZAorICogdGhlIHN0YXJ0dGltZSB3aWxsIG9jY3VyIHdpdGggdGhlIHRhcmdldCBmcmFtZSAod2l0aCBhbnkgb3RoZXIKKyAqIHJlcXVpcmVkIGZyYW1lcyByZXF1aXJlZCB0byByZWNvbnN0cnVjdCB0aGUgdGFyZ2V0IGludGVydmVuaW5nKS4KKyAqCisgKiBUaGUgU1RBUlRUSU1FIGZsYWcgaXMgZGlyZWN0bHkgYXNzb2NpYXRlZCB3aXRoIHRoZSBidWZmZXIncyAKKyAqIHRpbWVzdGFtcCAnIHRodXMgaXRzIGFzc29jaWF0aW9uIHRvIGJ1ZmZlciBkYXRhIGFuZCBpdHMgCisgKiBwcm9wYWdhdGlvbiBpcyBpZGVudGljYWwgdG8gdGhlIHRpbWVzdGFtcCdzLgorICoKKyAqIFdoZW4gYSBTeW5jIENvbXBvbmVudCBjbGllbnQgcmVjZWl2ZXMgYSBidWZmZXIgd2l0aCB0aGUgCisgKiBTVEFSVFRJTUUgZmxhZyBpdCBzaGFsbCBwZXJmb3JtIGEgU2V0Q29uZmlnIG9uIGl0cyBzeW5jIHBvcnQgCisgKiB1c2luZyBPTVhfQ29uZmlnVGltZUNsaWVudFN0YXJ0VGltZSBhbmQgcGFzc2luZyB0aGUgYnVmZmVyJ3MKKyAqIHRpbWVzdGFtcC4KKyAqIAorICogQGluZ3JvdXAgYnVmCisgKi8KKworI2RlZmluZSBPTVhfQlVGRkVSRkxBR19TVEFSVFRJTUUgMHgwMDAwMDAwMgorCisgCisKKy8qKiBEZWNvZGUgT25seSBCdWZmZXIgRmxhZzogCisgKgorICogVGhlIHNvdXJjZSBvZiBhIHN0cmVhbSAoZS5nLiBhIGRlbXV4IGNvbXBvbmVudCkgc2V0cyB0aGUgREVDT0RFT05MWQorICogZmxhZyBvbiBhbnkgYnVmZmVyIHRoYXQgc2hvdWxkIHNoYWxsIGJlIGRlY29kZWQgYnV0IHNob3VsZCBub3QgYmUKKyAqIGRpc3BsYXllZC4gVGhpcyBmbGFnIGlzIHVzZWQsIGZvciBpbnN0YW5jZSwgd2hlbiBhIHNvdXJjZSBzZWVrcyB0byAKKyAqIGEgdGFyZ2V0IGludGVyZnJhbWUgdGhhdCByZXF1aXJlcyB0aGUgZGVjb2RlIG9mIGZyYW1lcyBwcmVjZWRpbmcgdGhlIAorICogdGFyZ2V0IHRvIGZhY2lsaXRhdGUgdGhlIHRhcmdldCdzIHJlY29uc3RydWN0aW9uLiBJbiB0aGlzIGNhc2UgdGhlIAorICogc291cmNlIHdvdWxkIGVtaXQgdGhlIGZyYW1lcyBwcmVjZWRpbmcgdGhlIHRhcmdldCBkb3duc3RyZWFtIAorICogYnV0IG1hcmsgdGhlbSBhcyBkZWNvZGUgb25seS4KKyAqCisgKiBUaGUgREVDT0RFT05MWSBpcyBhc3NvY2lhdGVkIHdpdGggYnVmZmVyIGRhdGEgYW5kIHByb3BhZ2F0ZWQgaW4gYSAKKyAqIG1hbm5lciBpZGVudGljYWwgdG8gdGhlIGJ1ZmZlciB0aW1lc3RhbXAuCisgKgorICogQSBjb21wb25lbnQgdGhhdCByZW5kZXJzIGRhdGEgc2hvdWxkIGlnbm9yZSBhbGwgYnVmZmVycyB3aXRoIAorICogdGhlIERFQ09ERU9OTFkgZmxhZyBzZXQuCisgKiAKKyAqIEBpbmdyb3VwIGJ1ZgorICovCisKKyNkZWZpbmUgT01YX0JVRkZFUkZMQUdfREVDT0RFT05MWSAweDAwMDAwMDA0CisKKworLyogRGF0YSBDb3JydXB0IEZsYWc6IFRoaXMgZmxhZyBpcyBzZXQgd2hlbiB0aGUgSUwgY2xpZW50IGJlbGlldmVzIHRoZSBkYXRhIGluIHRoZSBhc3NvY2lhdGVkIGJ1ZmZlciBpcyBjb3JydXB0IAorICogQGluZ3JvdXAgYnVmCisgKi8KKworI2RlZmluZSBPTVhfQlVGRkVSRkxBR19EQVRBQ09SUlVQVCAweDAwMDAwMDA4CisKKy8qIEVuZCBvZiBGcmFtZTogVGhlIGJ1ZmZlciBjb250YWlucyBleGFjdGx5IG9uZSBlbmQgb2YgZnJhbWUgYW5kIG5vIGRhdGEKKyAqICBvY2N1cnMgYWZ0ZXIgdGhlIGVuZCBvZiBmcmFtZS4gVGhpcyBmbGFnIGlzIGFuIG9wdGlvbmFsIGhpbnQuIFRoZSBhYnNlbmNlCisgKiAgb2YgdGhpcyBmbGFnIGRvZXMgbm90IGltcGx5IHRoZSBhYnNlbmNlIG9mIGFuIGVuZCBvZiBmcmFtZSB3aXRoaW4gdGhlIGJ1ZmZlci4gCisgKiBAaW5ncm91cCBidWYKKyovCisjZGVmaW5lIE9NWF9CVUZGRVJGTEFHX0VORE9GRlJBTUUgMHgwMDAwMDAxMAorCisvKiBTeW5jIEZyYW1lIEZsYWc6IFRoaXMgZmxhZyBpcyBzZXQgd2hlbiB0aGUgYnVmZmVyIGNvbnRlbnQgY29udGFpbnMgYSBjb2RlZCBzeW5jIGZyYW1lICcgCisgKiAgYSBmcmFtZSB0aGF0IGhhcyBubyBkZXBlbmRlbmN5IG9uIGFueSBvdGhlciBmcmFtZSBpbmZvcm1hdGlvbiAKKyAqICBAaW5ncm91cCBidWYKKyAqLworI2RlZmluZSBPTVhfQlVGRkVSRkxBR19TWU5DRlJBTUUgMHgwMDAwMDAyMAorCisvKiBFeHRyYSBkYXRhIHByZXNlbnQgZmxhZzogdGhlcmUgaXMgZXh0cmEgZGF0YSBhcHBlbmRlZCB0byB0aGUgZGF0YSBzdHJlYW0KKyAqIHJlc2lkaW5nIGluIHRoZSBidWZmZXIgCisgKiBAaW5ncm91cCBidWYgIAorICovCisjZGVmaW5lIE9NWF9CVUZGRVJGTEFHX0VYVFJBREFUQSAweDAwMDAwMDQwCisKKy8qKiBDb2RlYyBDb25maWcgQnVmZmVyIEZsYWc6IAorKiBPTVhfQlVGRkVSRkxBR19DT0RFQ0NPTkZJRyBpcyBhbiBvcHRpb25hbCBmbGFnIHRoYXQgaXMgc2V0IGJ5IGFuCisqIG91dHB1dCBwb3J0IHdoZW4gYWxsIGJ5dGVzIGluIHRoZSBidWZmZXIgZm9ybSBwYXJ0IG9yIGFsbCBvZiBhIHNldCBvZgorKiBjb2RlYyBzcGVjaWZpYyBjb25maWd1cmF0aW9uIGRhdGEuICBFeGFtcGxlcyBpbmNsdWRlIFNQUy9QUFMgbmFsIHVuaXRzCisqIGZvciBPTVhfVklERU9fQ29kaW5nQVZDIG9yIEF1ZGlvU3BlY2lmaWNDb25maWcgZGF0YSBmb3IKKyogT01YX0FVRElPX0NvZGluZ0FBQy4gIEFueSBjb21wb25lbnQgdGhhdCBmb3IgYSBnaXZlbiBzdHJlYW0gc2V0cyAKKyogT01YX0JVRkZFUkZMQUdfQ09ERUNDT05GSUcgc2hhbGwgbm90IG1peCBjb2RlYyBjb25maWd1cmF0aW9uIGJ5dGVzCisqIHdpdGggZnJhbWUgZGF0YSBpbiB0aGUgc2FtZSBidWZmZXIsIGFuZCBzaGFsbCBzZW5kIGFsbCBidWZmZXJzCisqIGNvbnRhaW5pbmcgY29kZWMgY29uZmlndXJhdGlvbiBieXRlcyBiZWZvcmUgYW55IGJ1ZmZlcnMgY29udGFpbmluZworKiBmcmFtZSBkYXRhIHRoYXQgdGhvc2UgY29uZmlndXJhdGlvbnMgYnl0ZXMgZGVzY3JpYmUuCisqIElmIHRoZSBzdHJlYW0gZm9ybWF0IGZvciBhIHBhcnRpY3VsYXIgY29kZWMgaGFzIGEgZnJhbWUgc3BlY2lmaWMKKyogaGVhZGVyIGF0IHRoZSBzdGFydCBvZiBlYWNoIGZyYW1lLCBmb3IgZXhhbXBsZSBPTVhfQVVESU9fQ29kaW5nTVAzIG9yCisqIE9NWF9BVURJT19Db2RpbmdBQUMgaW4gQURUUyBtb2RlLCB0aGVuIHRoZXNlIHNoYWxsIGJlIHByZXNlbnRlZCBhcworKiBub3JtYWwgd2l0aG91dCBzZXR0aW5nIE9NWF9CVUZGRVJGTEFHX0NPREVDQ09ORklHLgorICogQGluZ3JvdXAgYnVmCisgKi8KKyNkZWZpbmUgT01YX0JVRkZFUkZMQUdfQ09ERUNDT05GSUcgMHgwMDAwMDA4MAorCisKKworLyoqIEBpbmdyb3VwIGJ1ZiAqLwordHlwZWRlZiBzdHJ1Y3QgT01YX0JVRkZFUkhFQURFUlRZUEUKK3sKKyAgICBPTVhfVTMyIG5TaXplOyAgICAgICAgICAgICAgLyoqPCBzaXplIG9mIHRoZSBzdHJ1Y3R1cmUgaW4gYnl0ZXMgKi8KKyAgICBPTVhfVkVSU0lPTlRZUEUgblZlcnNpb247ICAgLyoqPCBPTVggc3BlY2lmaWNhdGlvbiB2ZXJzaW9uIGluZm9ybWF0aW9uICovCisgICAgT01YX1U4KiBwQnVmZmVyOyAgICAgICAgICAgIC8qKjwgUG9pbnRlciB0byBhY3R1YWwgYmxvY2sgb2YgbWVtb3J5IAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoYXQgaXMgYWN0aW5nIGFzIHRoZSBidWZmZXIgKi8KKyAgICBPTVhfVTMyIG5BbGxvY0xlbjsgICAgICAgICAgLyoqPCBzaXplIG9mIHRoZSBidWZmZXIgYWxsb2NhdGVkLCBpbiBieXRlcyAqLworICAgIE9NWF9VMzIgbkZpbGxlZExlbjsgICAgICAgICAvKio8IG51bWJlciBvZiBieXRlcyBjdXJyZW50bHkgaW4gdGhlIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJ1ZmZlciAqLworICAgIE9NWF9VMzIgbk9mZnNldDsgICAgICAgICAgICAvKio8IHN0YXJ0IG9mZnNldCBvZiB2YWxpZCBkYXRhIGluIGJ5dGVzIGZyb20KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGUgc3RhcnQgb2YgdGhlIGJ1ZmZlciAqLworICAgIE9NWF9QVFIgcEFwcFByaXZhdGU7ICAgICAgICAvKio8IHBvaW50ZXIgdG8gYW55IGRhdGEgdGhlIGFwcGxpY2F0aW9uCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd2FudHMgdG8gYXNzb2NpYXRlIHdpdGggdGhpcyBidWZmZXIgKi8KKyAgICBPTVhfUFRSIHBQbGF0Zm9ybVByaXZhdGU7ICAgLyoqPCBwb2ludGVyIHRvIGFueSBkYXRhIHRoZSBwbGF0Zm9ybQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdhbnRzIHRvIGFzc29jaWF0ZSB3aXRoIHRoaXMgYnVmZmVyICovIAorICAgIE9NWF9QVFIgcElucHV0UG9ydFByaXZhdGU7ICAvKio8IHBvaW50ZXIgdG8gYW55IGRhdGEgdGhlIGlucHV0IHBvcnQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3YW50cyB0byBhc3NvY2lhdGUgd2l0aCB0aGlzIGJ1ZmZlciAqLworICAgIE9NWF9QVFIgcE91dHB1dFBvcnRQcml2YXRlOyAvKio8IHBvaW50ZXIgdG8gYW55IGRhdGEgdGhlIG91dHB1dCBwb3J0CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd2FudHMgdG8gYXNzb2NpYXRlIHdpdGggdGhpcyBidWZmZXIgKi8KKyAgICBPTVhfSEFORExFVFlQRSBoTWFya1RhcmdldENvbXBvbmVudDsgLyoqPCBUaGUgY29tcG9uZW50IHRoYXQgd2lsbCBnZW5lcmF0ZSBhIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1hcmsgZXZlbnQgdXBvbiBwcm9jZXNzaW5nIHRoaXMgYnVmZmVyLiAqLworICAgIE9NWF9QVFIgcE1hcmtEYXRhOyAgICAgICAgICAvKio8IEFwcGxpY2F0aW9uIHNwZWNpZmljIGRhdGEgYXNzb2NpYXRlZCB3aXRoIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoZSBtYXJrIHNlbnQgb24gYSBtYXJrIGV2ZW50IHRvIGRpc2FtYmlndWF0ZSAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzIG1hcmsgZnJvbSBvdGhlcnMuICovCisgICAgT01YX1UzMiBuVGlja0NvdW50OyAgICAgICAgIC8qKjwgT3B0aW9uYWwgZW50cnkgdGhhdCB0aGUgY29tcG9uZW50IGFuZAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFwcGxpY2F0aW9uIGNhbiB1cGRhdGUgd2l0aCBhIHRpY2sgY291bnQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3aGVuIHRoZXkgYWNjZXNzIHRoZSBjb21wb25lbnQuICBUaGlzCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWUgc2hvdWxkIGJlIGluIG1pY3Jvc2Vjb25kcy4gIFNpbmNlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcyBpcyBhIHZhbHVlIHJlbGF0aXZlIHRvIGFuIGFyYml0cmFyeQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXJ0aW5nIHBvaW50LCB0aGlzIHZhbHVlIGNhbm5vdCBiZSB1c2VkIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRvIGRldGVybWluZSBhYnNvbHV0ZSB0aW1lLiAgVGhpcyBpcyBhbgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9wdGlvbmFsIGVudHJ5IGFuZCBub3QgYWxsIGNvbXBvbmVudHMKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3aWxsIHVwZGF0ZSBpdC4qLworIE9NWF9USUNLUyBuVGltZVN0YW1wOyAgICAgICAgICAvKio8IFRpbWVzdGFtcCBjb3JyZXNwb25kaW5nIHRvIHRoZSBzYW1wbGUgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhcnRpbmcgYXQgdGhlIGZpcnN0IGxvZ2ljYWwgc2FtcGxlIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvdW5kYXJ5IGluIHRoZSBidWZmZXIuIFRpbWVzdGFtcHMgb2YgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3VjY2Vzc2l2ZSBzYW1wbGVzIHdpdGhpbiB0aGUgYnVmZmVyIG1heQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJlIGluZmVycmVkIGJ5IGFkZGluZyB0aGUgZHVyYXRpb24gb2YgdGhlIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9mIHRoZSBwcmVjZWRpbmcgYnVmZmVyIHRvIHRoZSB0aW1lc3RhbXAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvZiB0aGUgcHJlY2VkaW5nIGJ1ZmZlci4qLworICBPTVhfVTMyICAgICBuRmxhZ3M7ICAgICAgICAgICAvKio8IGJ1ZmZlciBzcGVjaWZpYyBmbGFncyAqLworICBPTVhfVTMyIG5PdXRwdXRQb3J0SW5kZXg7ICAgICAvKio8IFRoZSBpbmRleCBvZiB0aGUgb3V0cHV0IHBvcnQgKGlmIGFueSkgdXNpbmcgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcyBidWZmZXIgKi8KKyAgT01YX1UzMiBuSW5wdXRQb3J0SW5kZXg7ICAgICAgLyoqPCBUaGUgaW5kZXggb2YgdGhlIGlucHV0IHBvcnQgKGlmIGFueSkgdXNpbmcKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzIGJ1ZmZlciAqLworfSBPTVhfQlVGRkVSSEVBREVSVFlQRTsKKworLyoqIFRoZSBPTVhfRVhUUkFEQVRBVFlQRSBlbnVtZXJhdGlvbiBpcyB1c2VkIHRvIGRlZmluZSB0aGUgCisgKiBwb3NzaWJsZSBleHRyYSBkYXRhIHBheWxvYWQgdHlwZXMuCisgKiBOQjogdGhpcyBlbnVtIGlzIGJpbmFyeSBiYWNrd2FyZHMgY29tcGF0aWJsZSB3aXRoIHRoZSBwcmV2aW91cworICogT01YX0VYVFJBREFUQV9RVUFOVCBkZWZpbmUuICBUaGlzIHNob3VsZCBiZSByZXBsYWNlZCB3aXRoCisgKiBPTVhfRXh0cmFEYXRhUXVhbnRpemF0aW9uLgorICovCit0eXBlZGVmIGVudW0gT01YX0VYVFJBREFUQVRZUEUKK3sKKyAgIE9NWF9FeHRyYURhdGFOb25lID0gMCwgICAgICAgICAgICAgICAgICAgICAgIC8qKjwgSW5kaWNhdGVzIHRoYXQgbm8gbW9yZSBleHRyYSBkYXRhIHNlY3Rpb25zIGZvbGxvdyAqLyAgICAgICAgCisgICBPTVhfRXh0cmFEYXRhUXVhbnRpemF0aW9uLCAgICAgICAgICAgICAgICAgICAvKio8IFRoZSBkYXRhIHBheWxvYWQgY29udGFpbnMgcXVhbnRpemF0aW9uIGRhdGEgKi8KKyAgIE9NWF9FeHRyYURhdGFLaHJvbm9zRXh0ZW5zaW9ucyA9IDB4NkYwMDAwMDAsIC8qKjwgUmVzZXJ2ZWQgcmVnaW9uIGZvciBpbnRyb2R1Y2luZyBLaHJvbm9zIFN0YW5kYXJkIEV4dGVuc2lvbnMgKi8gCisgICBPTVhfRXh0cmFEYXRhVmVuZG9yU3RhcnRVbnVzZWQgPSAweDdGMDAwMDAwLCAvKio8IFJlc2VydmVkIHJlZ2lvbiBmb3IgaW50cm9kdWNpbmcgVmVuZG9yIEV4dGVuc2lvbnMgKi8KKyAgIE9NWF9FeHRyYURhdGFNYXggPSAweDdGRkZGRkZGCit9IE9NWF9FWFRSQURBVEFUWVBFOworCisKK3R5cGVkZWYgc3RydWN0IE9NWF9PVEhFUl9FWFRSQURBVEFUWVBFICB7CisgICAgT01YX1UzMiBuU2l6ZTsKKyAgICBPTVhfVkVSU0lPTlRZUEUgblZlcnNpb247ICAgICAgICAgICAgICAgCisgICAgT01YX1UzMiBuUG9ydEluZGV4OworICAgIE9NWF9FWFRSQURBVEFUWVBFIGVUeXBlOyAgICAgICAvKiBFeHRyYSBEYXRhIHR5cGUgKi8KKyAgICBPTVhfVTMyIG5EYXRhU2l6ZTsgICAvKiBTaXplIG9mIHRoZSBzdXBwb3J0aW5nIGRhdGEgdG8gZm9sbG93ICovCisgICAgT01YX1U4ICBkYXRhWzFdOyAgICAgLyogU3VwcG9ydGluZyBkYXRhIGhpbnQgICovCit9IE9NWF9PVEhFUl9FWFRSQURBVEFUWVBFOworCisvKiogQGluZ3JvdXAgY29tcCAqLwordHlwZWRlZiBzdHJ1Y3QgT01YX1BPUlRfUEFSQU1fVFlQRSB7CisgICAgT01YX1UzMiBuU2l6ZTsgICAgICAgICAgICAgIC8qKjwgc2l6ZSBvZiB0aGUgc3RydWN0dXJlIGluIGJ5dGVzICovCisgICAgT01YX1ZFUlNJT05UWVBFIG5WZXJzaW9uOyAgIC8qKjwgT01YIHNwZWNpZmljYXRpb24gdmVyc2lvbiBpbmZvcm1hdGlvbiAqLworICAgIE9NWF9VMzIgblBvcnRzOyAgICAgICAgICAgICAvKio8IFRoZSBudW1iZXIgb2YgcG9ydHMgZm9yIHRoaXMgY29tcG9uZW50ICovCisgICAgT01YX1UzMiBuU3RhcnRQb3J0TnVtYmVyOyAgIC8qKiBmaXJzdCBwb3J0IG51bWJlciBmb3IgdGhpcyB0eXBlIG9mIHBvcnQgKi8KK30gT01YX1BPUlRfUEFSQU1fVFlQRTsgCisKKy8qKiBAaW5ncm91cCBjb21wICovCit0eXBlZGVmIGVudW0gT01YX0VWRU5UVFlQRQoreworICAgIE9NWF9FdmVudENtZENvbXBsZXRlLCAgICAgICAgIC8qKjwgY29tcG9uZW50IGhhcyBzdWNlc3NmdWxseSBjb21wbGV0ZWQgYSBjb21tYW5kICovCisgICAgT01YX0V2ZW50RXJyb3IsICAgICAgICAgICAgICAgLyoqPCBjb21wb25lbnQgaGFzIGRldGVjdGVkIGFuIGVycm9yIGNvbmRpdGlvbiAqLworICAgIE9NWF9FdmVudE1hcmssICAgICAgICAgICAgICAgIC8qKjwgY29tcG9uZW50IGhhcyBkZXRlY3RlZCBhIGJ1ZmZlciBtYXJrICovCisgICAgT01YX0V2ZW50UG9ydFNldHRpbmdzQ2hhbmdlZCwgLyoqPCBjb21wb25lbnQgaXMgcmVwb3J0ZWQgYSBwb3J0IHNldHRpbmdzIGNoYW5nZSAqLworICAgIE9NWF9FdmVudEJ1ZmZlckZsYWcsICAgICAgICAgIC8qKjwgY29tcG9uZW50IGhhcyBkZXRlY3RlZCBhbiBFT1MgKi8gCisgICAgT01YX0V2ZW50UmVzb3VyY2VzQWNxdWlyZWQsICAgLyoqPCBjb21wb25lbnQgaGFzIGJlZW4gZ3JhbnRlZCByZXNvdXJjZXMgYW5kIGlzCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdXRvbWF0aWNhbGx5IHN0YXJ0aW5nIHRoZSBzdGF0ZSBjaGFuZ2UgZnJvbQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT01YX1N0YXRlV2FpdEZvclJlc291cmNlcyB0byBPTVhfU3RhdGVJZGxlLiAqLworICAgT01YX0V2ZW50Q29tcG9uZW50UmVzdW1lZCwgICAgIC8qKjwgQ29tcG9uZW50IHJlc3VtZWQgZHVlIHRvIHJlYWNxdWlzaXRpb24gb2YgcmVzb3VyY2VzICovCisgICBPTVhfRXZlbnREeW5hbWljUmVzb3VyY2VzQXZhaWxhYmxlLCAvKio8IENvbXBvbmVudCBoYXMgYWNxdWlyZWQgcHJldmlvdXNseSB1bmF2YWlsYWJsZSBkeW5hbWljIHJlc291cmNlcyAqLworICAgT01YX0V2ZW50UG9ydEZvcm1hdERldGVjdGVkLCAgICAgIC8qKjwgQ29tcG9uZW50IGhhcyBkZXRlY3RlZCBhIHN1cHBvcnRlZCBmb3JtYXQuICovCisgICBPTVhfRXZlbnRLaHJvbm9zRXh0ZW5zaW9ucyA9IDB4NkYwMDAwMDAsIC8qKjwgUmVzZXJ2ZWQgcmVnaW9uIGZvciBpbnRyb2R1Y2luZyBLaHJvbm9zIFN0YW5kYXJkIEV4dGVuc2lvbnMgKi8gCisgICBPTVhfRXZlbnRWZW5kb3JTdGFydFVudXNlZCA9IDB4N0YwMDAwMDAsIC8qKjwgUmVzZXJ2ZWQgcmVnaW9uIGZvciBpbnRyb2R1Y2luZyBWZW5kb3IgRXh0ZW5zaW9ucyAqLworICAgT01YX0V2ZW50TWF4ID0gMHg3RkZGRkZGRgorfSBPTVhfRVZFTlRUWVBFOworCit0eXBlZGVmIHN0cnVjdCBPTVhfQ0FMTEJBQ0tUWVBFCit7CisgICAgLyoqIFRoZSBFdmVudEhhbmRsZXIgbWV0aG9kIGlzIHVzZWQgdG8gbm90aWZ5IHRoZSBhcHBsaWNhdGlvbiB3aGVuIGFuCisgICAgICAgIGV2ZW50IG9mIGludGVyZXN0IG9jY3Vycy4gIEV2ZW50cyBhcmUgZGVmaW5lZCBpbiB0aGUgT01YX0VWRU5UVFlQRQorICAgICAgICBlbnVtZXJhdGlvbi4gIFBsZWFzZSBzZWUgdGhhdCBlbnVtZXJhdGlvbiBmb3IgZGV0YWlscyBvZiB3aGF0IHdpbGwKKyAgICAgICAgYmUgcmV0dXJuZWQgZm9yIGVhY2ggdHlwZSBvZiBldmVudC4gQ2FsbGJhY2tzIHNob3VsZCBub3QgcmV0dXJuCisgICAgICAgIGFuIGVycm9yIHRvIHRoZSBjb21wb25lbnQsIHNvIGlmIGFuIGVycm9yIG9jY3VycywgdGhlIGFwcGxpY2F0aW9uIAorICAgICAgICBzaGFsbCBoYW5kbGUgaXQgaW50ZXJuYWxseS4gIFRoaXMgaXMgYSBibG9ja2luZyBjYWxsLgorCisgICAgICAgIFRoZSBhcHBsaWNhdGlvbiBzaG91bGQgcmV0dXJuIGZyb20gdGhpcyBjYWxsIHdpdGhpbiA1IG1zZWMgdG8gYXZvaWQKKyAgICAgICAgYmxvY2tpbmcgdGhlIGNvbXBvbmVudCBmb3IgYW4gZXhjZXNzaXZlbHkgbG9uZyBwZXJpb2Qgb2YgdGltZS4KKworICAgICAgICBAcGFyYW0gaENvbXBvbmVudAorICAgICAgICAgICAgaGFuZGxlIG9mIHRoZSBjb21wb25lbnQgdG8gYWNjZXNzLiAgVGhpcyBpcyB0aGUgY29tcG9uZW50CisgICAgICAgICAgICBoYW5kbGUgcmV0dXJuZWQgYnkgdGhlIGNhbGwgdG8gdGhlIEdldEhhbmRsZSBmdW5jdGlvbi4KKyAgICAgICAgQHBhcmFtIHBBcHBEYXRhCisgICAgICAgICAgICBwb2ludGVyIHRvIGFuIGFwcGxpY2F0aW9uIGRlZmluZWQgdmFsdWUgdGhhdCB3YXMgcHJvdmlkZWQgaW4gdGhlIAorICAgICAgICAgICAgcEFwcERhdGEgcGFyYW1ldGVyIHRvIHRoZSBPTVhfR2V0SGFuZGxlIG1ldGhvZCBmb3IgdGhlIGNvbXBvbmVudC4KKyAgICAgICAgICAgIFRoaXMgYXBwbGljYXRpb24gZGVmaW5lZCB2YWx1ZSBpcyBwcm92aWRlZCBzbyB0aGF0IHRoZSBhcHBsaWNhdGlvbiAKKyAgICAgICAgICAgIGNhbiBoYXZlIGEgY29tcG9uZW50IHNwZWNpZmljIGNvbnRleHQgd2hlbiByZWNlaXZpbmcgdGhlIGNhbGxiYWNrLgorICAgICAgICBAcGFyYW0gZUV2ZW50CisgICAgICAgICAgICBFdmVudCB0aGF0IHRoZSBjb21wb25lbnQgd2FudHMgdG8gbm90aWZ5IHRoZSBhcHBsaWNhdGlvbiBhYm91dC4KKyAgICAgICAgQHBhcmFtIG5EYXRhMQorICAgICAgICAgICAgbkRhdGEgd2lsbCBiZSB0aGUgT01YX0VSUk9SVFlQRSBmb3IgYW4gZXJyb3IgZXZlbnQgYW5kIHdpbGwgYmUgCisgICAgICAgICAgICBhbiBPTVhfQ09NTUFORFRZUEUgZm9yIGEgY29tbWFuZCBjb21wbGV0ZSBldmVudCBhbmQgT01YX0lOREVYVFlQRSBmb3IgYSBPTVhfUG9ydFNldHRpbmdzQ2hhbmdlZCBldmVudC4KKyAgICAgICAgIEBwYXJhbSBuRGF0YTIKKyAgICAgICAgICAgIG5EYXRhMiB3aWxsIGhvbGQgZnVydGhlciBpbmZvcm1hdGlvbiByZWxhdGVkIHRvIHRoZSBldmVudC4gQ2FuIGJlIE9NWF9TVEFURVRZUEUgZm9yCisgICAgICAgICAgICBhIE9NWF9Db21tYW5kU3RhdGVTZXQgY29tbWFuZCBvciBwb3J0IGluZGV4IGZvciBhIE9NWF9Qb3J0U2V0dGluZ3NDaGFuZ2VkIGV2ZW50LgorICAgICAgICAgICAgRGVmYXVsdCB2YWx1ZSBpcyAwIGlmIG5vdCB1c2VkLiApCisgICAgICAgIEBwYXJhbSBwRXZlbnREYXRhCisgICAgICAgICAgICBQb2ludGVyIHRvIGFkZGl0aW9uYWwgZXZlbnQtc3BlY2lmaWMgZGF0YSAoc2VlIHNwZWMgZm9yIG1lYW5pbmcpLgorICAgICAgKi8KKworICAgT01YX0VSUk9SVFlQRSAoKkV2ZW50SGFuZGxlcikoCisgICAgICAgIE9NWF9JTiBPTVhfSEFORExFVFlQRSBoQ29tcG9uZW50LAorICAgICAgICBPTVhfSU4gT01YX1BUUiBwQXBwRGF0YSwKKyAgICAgICAgT01YX0lOIE9NWF9FVkVOVFRZUEUgZUV2ZW50LAorICAgICAgICBPTVhfSU4gT01YX1UzMiBuRGF0YTEsCisgICAgICAgIE9NWF9JTiBPTVhfVTMyIG5EYXRhMiwKKyAgICAgICAgT01YX0lOIE9NWF9QVFIgcEV2ZW50RGF0YSk7CisKKyAgICAvKiogVGhlIEVtcHR5QnVmZmVyRG9uZSBtZXRob2QgaXMgdXNlZCB0byByZXR1cm4gZW1wdGllZCBidWZmZXJzIGZyb20gYW4KKyAgICAgICAgaW5wdXQgcG9ydCBiYWNrIHRvIHRoZSBhcHBsaWNhdGlvbiBmb3IgcmV1c2UuICBUaGlzIGlzIGEgYmxvY2tpbmcgY2FsbCAKKyAgICAgICAgc28gdGhlIGFwcGxpY2F0aW9uIHNob3VsZCBub3QgYXR0ZW1wdCB0byByZWZpbGwgdGhlIGJ1ZmZlcnMgZHVyaW5nIHRoaXMKKyAgICAgICAgY2FsbCwgYnV0IHNob3VsZCBxdWV1ZSB0aGVtIGFuZCByZWZpbGwgdGhlbSBpbiBhbm90aGVyIHRocmVhZC4gIFRoZXJlCisgICAgICAgIGlzIG5vIGVycm9yIHJldHVybiwgc28gdGhlIGFwcGxpY2F0aW9uIHNoYWxsIGhhbmRsZSBhbnkgZXJyb3JzIGdlbmVyYXRlZAorICAgICAgICBpbnRlcm5hbGx5LiAgCisgICAgICAgIAorICAgICAgICBUaGUgYXBwbGljYXRpb24gc2hvdWxkIHJldHVybiBmcm9tIHRoaXMgY2FsbCB3aXRoaW4gNSBtc2VjLgorICAgICAgICAKKyAgICAgICAgQHBhcmFtIGhDb21wb25lbnQKKyAgICAgICAgICAgIGhhbmRsZSBvZiB0aGUgY29tcG9uZW50IHRvIGFjY2Vzcy4gIFRoaXMgaXMgdGhlIGNvbXBvbmVudAorICAgICAgICAgICAgaGFuZGxlIHJldHVybmVkIGJ5IHRoZSBjYWxsIHRvIHRoZSBHZXRIYW5kbGUgZnVuY3Rpb24uCisgICAgICAgIEBwYXJhbSBwQXBwRGF0YQorICAgICAgICAgICAgcG9pbnRlciB0byBhbiBhcHBsaWNhdGlvbiBkZWZpbmVkIHZhbHVlIHRoYXQgd2FzIHByb3ZpZGVkIGluIHRoZSAKKyAgICAgICAgICAgIHBBcHBEYXRhIHBhcmFtZXRlciB0byB0aGUgT01YX0dldEhhbmRsZSBtZXRob2QgZm9yIHRoZSBjb21wb25lbnQuCisgICAgICAgICAgICBUaGlzIGFwcGxpY2F0aW9uIGRlZmluZWQgdmFsdWUgaXMgcHJvdmlkZWQgc28gdGhhdCB0aGUgYXBwbGljYXRpb24gCisgICAgICAgICAgICBjYW4gaGF2ZSBhIGNvbXBvbmVudCBzcGVjaWZpYyBjb250ZXh0IHdoZW4gcmVjZWl2aW5nIHRoZSBjYWxsYmFjay4KKyAgICAgICAgQHBhcmFtIHBCdWZmZXIKKyAgICAgICAgICAgIHBvaW50ZXIgdG8gYW4gT01YX0JVRkZFUkhFQURFUlRZUEUgc3RydWN0dXJlIGFsbG9jYXRlZCB3aXRoIFVzZUJ1ZmZlcgorICAgICAgICAgICAgb3IgQWxsb2NhdGVCdWZmZXIgaW5kaWNhdGluZyB0aGUgYnVmZmVyIHRoYXQgd2FzIGVtcHRpZWQuCisgICAgICAgIEBpbmdyb3VwIGJ1ZgorICAgICAqLworICAgIE9NWF9FUlJPUlRZUEUgKCpFbXB0eUJ1ZmZlckRvbmUpKAorICAgICAgICBPTVhfSU4gT01YX0hBTkRMRVRZUEUgaENvbXBvbmVudCwKKyAgICAgICAgT01YX0lOIE9NWF9QVFIgcEFwcERhdGEsCisgICAgICAgIE9NWF9JTiBPTVhfQlVGRkVSSEVBREVSVFlQRSogcEJ1ZmZlcik7CisKKyAgICAvKiogVGhlIEZpbGxCdWZmZXJEb25lIG1ldGhvZCBpcyB1c2VkIHRvIHJldHVybiBmaWxsZWQgYnVmZmVycyBmcm9tIGFuCisgICAgICAgIG91dHB1dCBwb3J0IGJhY2sgdG8gdGhlIGFwcGxpY2F0aW9uIGZvciBlbXB0eWluZyBhbmQgdGhlbiByZXVzZS4gIAorICAgICAgICBUaGlzIGlzIGEgYmxvY2tpbmcgY2FsbCBzbyB0aGUgYXBwbGljYXRpb24gc2hvdWxkIG5vdCBhdHRlbXB0IHRvIAorICAgICAgICBlbXB0eSB0aGUgYnVmZmVycyBkdXJpbmcgdGhpcyBjYWxsLCBidXQgc2hvdWxkIHF1ZXVlIHRoZSBidWZmZXJzIAorICAgICAgICBhbmQgZW1wdHkgdGhlbSBpbiBhbm90aGVyIHRocmVhZC4gIFRoZXJlIGlzIG5vIGVycm9yIHJldHVybiwgc28gCisgICAgICAgIHRoZSBhcHBsaWNhdGlvbiBzaGFsbCBoYW5kbGUgYW55IGVycm9ycyBnZW5lcmF0ZWQgaW50ZXJuYWxseS4gIFRoZSAKKyAgICAgICAgYXBwbGljYXRpb24gc2hhbGwgYWxzbyB1cGRhdGUgdGhlIGJ1ZmZlciBoZWFkZXIgdG8gaW5kaWNhdGUgdGhlCisgICAgICAgIG51bWJlciBvZiBieXRlcyBwbGFjZWQgaW50byB0aGUgYnVmZmVyLiAgCisKKyAgICAgICAgVGhlIGFwcGxpY2F0aW9uIHNob3VsZCByZXR1cm4gZnJvbSB0aGlzIGNhbGwgd2l0aGluIDUgbXNlYy4KKyAgICAgICAgCisgICAgICAgIEBwYXJhbSBoQ29tcG9uZW50CisgICAgICAgICAgICBoYW5kbGUgb2YgdGhlIGNvbXBvbmVudCB0byBhY2Nlc3MuICBUaGlzIGlzIHRoZSBjb21wb25lbnQKKyAgICAgICAgICAgIGhhbmRsZSByZXR1cm5lZCBieSB0aGUgY2FsbCB0byB0aGUgR2V0SGFuZGxlIGZ1bmN0aW9uLgorICAgICAgICBAcGFyYW0gcEFwcERhdGEKKyAgICAgICAgICAgIHBvaW50ZXIgdG8gYW4gYXBwbGljYXRpb24gZGVmaW5lZCB2YWx1ZSB0aGF0IHdhcyBwcm92aWRlZCBpbiB0aGUgCisgICAgICAgICAgICBwQXBwRGF0YSBwYXJhbWV0ZXIgdG8gdGhlIE9NWF9HZXRIYW5kbGUgbWV0aG9kIGZvciB0aGUgY29tcG9uZW50LgorICAgICAgICAgICAgVGhpcyBhcHBsaWNhdGlvbiBkZWZpbmVkIHZhbHVlIGlzIHByb3ZpZGVkIHNvIHRoYXQgdGhlIGFwcGxpY2F0aW9uIAorICAgICAgICAgICAgY2FuIGhhdmUgYSBjb21wb25lbnQgc3BlY2lmaWMgY29udGV4dCB3aGVuIHJlY2VpdmluZyB0aGUgY2FsbGJhY2suCisgICAgICAgIEBwYXJhbSBwQnVmZmVyCisgICAgICAgICAgICBwb2ludGVyIHRvIGFuIE9NWF9CVUZGRVJIRUFERVJUWVBFIHN0cnVjdHVyZSBhbGxvY2F0ZWQgd2l0aCBVc2VCdWZmZXIKKyAgICAgICAgICAgIG9yIEFsbG9jYXRlQnVmZmVyIGluZGljYXRpbmcgdGhlIGJ1ZmZlciB0aGF0IHdhcyBmaWxsZWQuCisgICAgICAgIEBpbmdyb3VwIGJ1ZgorICAgICAqLworICAgIE9NWF9FUlJPUlRZUEUgKCpGaWxsQnVmZmVyRG9uZSkoCisgICAgICAgIE9NWF9PVVQgT01YX0hBTkRMRVRZUEUgaENvbXBvbmVudCwKKyAgICAgICAgT01YX09VVCBPTVhfUFRSIHBBcHBEYXRhLAorICAgICAgICBPTVhfT1VUIE9NWF9CVUZGRVJIRUFERVJUWVBFKiBwQnVmZmVyKTsKKworfSBPTVhfQ0FMTEJBQ0tUWVBFOworCisvKiogVGhlIE9NWF9CVUZGRVJTVVBQTElFUlRZUEUgZW51bWVyYXRpb24gaXMgdXNlZCB0byBkaWN0YXRlIHBvcnQgc3VwcGxpZXIKKyAgICBwcmVmZXJlbmNlIHdoZW4gdHVubmVsaW5nIGJldHdlZW4gdHdvIHBvcnRzLgorICAgIEBpbmdyb3VwIHR1biBidWYKKyovCit0eXBlZGVmIGVudW0gT01YX0JVRkZFUlNVUFBMSUVSVFlQRQoreworICAgIE9NWF9CdWZmZXJTdXBwbHlVbnNwZWNpZmllZCA9IDB4MCwgLyoqPCBwb3J0IHN1cHBseWluZyB0aGUgYnVmZmVycyBpcyB1bnNwZWNpZmllZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvciBkb24ndCBjYXJlICovCisgICAgT01YX0J1ZmZlclN1cHBseUlucHV0LCAgICAgICAgICAgICAvKio8IGlucHV0IHBvcnQgc3VwcGxpZXMgdGhlIGJ1ZmZlcnMgKi8KKyAgICBPTVhfQnVmZmVyU3VwcGx5T3V0cHV0LCAgICAgICAgICAgIC8qKjwgb3V0cHV0IHBvcnQgc3VwcGxpZXMgdGhlIGJ1ZmZlcnMgKi8KKyAgICBPTVhfQnVmZmVyU3VwcGx5S2hyb25vc0V4dGVuc2lvbnMgPSAweDZGMDAwMDAwLCAvKio8IFJlc2VydmVkIHJlZ2lvbiBmb3IgaW50cm9kdWNpbmcgS2hyb25vcyBTdGFuZGFyZCBFeHRlbnNpb25zICovIAorICAgIE9NWF9CdWZmZXJTdXBwbHlWZW5kb3JTdGFydFVudXNlZCA9IDB4N0YwMDAwMDAsIC8qKjwgUmVzZXJ2ZWQgcmVnaW9uIGZvciBpbnRyb2R1Y2luZyBWZW5kb3IgRXh0ZW5zaW9ucyAqLworICAgIE9NWF9CdWZmZXJTdXBwbHlNYXggPSAweDdGRkZGRkZGCit9IE9NWF9CVUZGRVJTVVBQTElFUlRZUEU7CisKKworLyoqIGJ1ZmZlciBzdXBwbGllciBwYXJhbWV0ZXIgCisgKiBAaW5ncm91cCB0dW4KKyAqLwordHlwZWRlZiBzdHJ1Y3QgT01YX1BBUkFNX0JVRkZFUlNVUFBMSUVSVFlQRSB7CisgICAgT01YX1UzMiBuU2l6ZTsgLyoqPCBzaXplIG9mIHRoZSBzdHJ1Y3R1cmUgaW4gYnl0ZXMgKi8KKyAgICBPTVhfVkVSU0lPTlRZUEUgblZlcnNpb247IC8qKjwgT01YIHNwZWNpZmljYXRpb24gdmVyc2lvbiBpbmZvcm1hdGlvbiAqLworICAgIE9NWF9VMzIgblBvcnRJbmRleDsgLyoqPCBwb3J0IHRoYXQgdGhpcyBzdHJ1Y3R1cmUgYXBwbGllcyB0byAqLworICAgIE9NWF9CVUZGRVJTVVBQTElFUlRZUEUgZUJ1ZmZlclN1cHBsaWVyOyAvKio8IGJ1ZmZlciBzdXBwbGllciAqLworfSBPTVhfUEFSQU1fQlVGRkVSU1VQUExJRVJUWVBFOworCisKKy8qKjwgaW5kaWNhdGVzIHRoYXQgYnVmZmVycyByZWNlaXZlZCBieSBhbiBpbnB1dCBwb3J0IG9mIGEgdHVubmVsIAorICAgICBtYXkgbm90IG1vZGlmeSB0aGUgZGF0YSBpbiB0aGUgYnVmZmVycyAKKyAgICAgQGluZ3JvdXAgdHVuCisgKi8KKyNkZWZpbmUgT01YX1BPUlRUVU5ORUxGTEFHX1JFQURPTkxZIDB4MDAwMDAwMDEgCisKKworLyoqIFRoZSBPTVhfVFVOTkVMU0VUVVBUWVBFIHN0cnVjdHVyZSBpcyB1c2VkIHRvIHBhc3MgZGF0YSBmcm9tIGFuIG91dHB1dAorICAgIHBvcnQgdG8gYW4gaW5wdXQgcG9ydCBhcyBwYXJ0IHRoZSB0d28gQ29tcG9uZW50VHVubmVsUmVxdWVzdCBjYWxscworICAgIHJlc3VsdGluZyBmcm9tIGEgT01YX1NldHVwVHVubmVsIGNhbGwgZnJvbSB0aGUgSUwgQ2xpZW50LiAKKyAgICBAaW5ncm91cCB0dW4KKyAqLyAgIAordHlwZWRlZiBzdHJ1Y3QgT01YX1RVTk5FTFNFVFVQVFlQRQoreworICAgIE9NWF9VMzIgblR1bm5lbEZsYWdzOyAgICAgICAgICAgICAvKio8IGJpdCBmbGFncyBmb3IgdHVubmVsaW5nICovCisgICAgT01YX0JVRkZFUlNVUFBMSUVSVFlQRSBlU3VwcGxpZXI7IC8qKjwgc3VwcGxpZXIgcHJlZmVyZW5jZSAqLworfSBPTVhfVFVOTkVMU0VUVVBUWVBFOyAKKworLyogT01YIENvbXBvbmVudCBoZWFkZXJzIGlzIGluY2x1ZGVkIHRvIGVuYWJsZSB0aGUgY29yZSB0byB1c2UKKyAgIG1hY3JvcyBmb3IgZnVuY3Rpb25zIGludG8gdGhlIGNvbXBvbmVudCBmb3IgT01YIHJlbGVhc2UgMS4wLiAgCisgICBEZXZlbG9wZXJzIHNob3VsZCBub3QgYWNjZXNzIGFueSBzdHJ1Y3R1cmVzIG9yIGRhdGEgZnJvbSB3aXRoaW4KKyAgIHRoZSBjb21wb25lbnQgaGVhZGVyIGRpcmVjdGx5ICovCisvKiBUTyBCRSBSRU1PVkVEIC0gI2luY2x1ZGUgPE9NWF9Db21wb25lbnQuaD4gKi8KKworLyoqIEdldENvbXBvbmVudFZlcnNpb24gd2lsbCByZXR1cm4gaW5mb3JtYXRpb24gYWJvdXQgdGhlIGNvbXBvbmVudC4gIAorICAgIFRoaXMgaXMgYSBibG9ja2luZyBjYWxsLiAgVGhpcyBtYWNybyB3aWxsIGdvIGRpcmVjdGx5IGZyb20gdGhlCisgICAgYXBwbGljYXRpb24gdG8gdGhlIGNvbXBvbmVudCAodmlhIGEgY29yZSBtYWNybykuICBUaGUKKyAgICBjb21wb25lbnQgd2lsbCByZXR1cm4gZnJvbSB0aGlzIGNhbGwgd2l0aGluIDUgbXNlYy4KKyAgICBAcGFyYW0gW2luXSBoQ29tcG9uZW50CisgICAgICAgIGhhbmRsZSBvZiBjb21wb25lbnQgdG8gZXhlY3V0ZSB0aGUgY29tbWFuZAorICAgIEBwYXJhbSBbb3V0XSBwQ29tcG9uZW50TmFtZQorICAgICAgICBwb2ludGVyIHRvIGFuIGVtcHR5IHN0cmluZyBvZiBsZW5ndGggMTI4IGJ5dGVzLiAgVGhlIGNvbXBvbmVudCAKKyAgICAgICAgd2lsbCB3cml0ZSBpdHMgbmFtZSBpbnRvIHRoaXMgc3RyaW5nLiAgVGhlIG5hbWUgd2lsbCBiZSAKKyAgICAgICAgdGVybWluYXRlZCBieSBhIHNpbmdsZSB6ZXJvIGJ5dGUuICBUaGUgbmFtZSBvZiBhIGNvbXBvbmVudCB3aWxsIAorICAgICAgICBiZSAxMjcgYnl0ZXMgb3IgbGVzcyB0byBsZWF2ZSByb29tIGZvciB0aGUgdHJhaWxpbmcgemVybyBieXRlLiAgCisgICAgICAgIEFuIGV4YW1wbGUgb2YgYSB2YWxpZCBjb21wb25lbnQgbmFtZSBpcyAiT01YLkFCQy5DaGFubmVsTWl4ZXJcMCIuCisgICAgQHBhcmFtIFtvdXRdIHBDb21wb25lbnRWZXJzaW9uCisgICAgICAgIHBvaW50ZXIgdG8gYW4gT01YIFZlcnNpb24gc3RydWN0dXJlIHRoYXQgdGhlIGNvbXBvbmVudCB3aWxsIGZpbGwgCisgICAgICAgIGluLiAgVGhlIGNvbXBvbmVudCB3aWxsIGZpbGwgaW4gYSB2YWx1ZSB0aGF0IGluZGljYXRlcyB0aGUgCisgICAgICAgIGNvbXBvbmVudCB2ZXJzaW9uLiAgTk9URTogdGhlIGNvbXBvbmVudCB2ZXJzaW9uIGlzIE5PVCB0aGUgc2FtZSAKKyAgICAgICAgYXMgdGhlIE9NWCBTcGVjaWZpY2F0aW9uIHZlcnNpb24gKGZvdW5kIGluIGFsbCBzdHJ1Y3R1cmVzKS4gIFRoZSAKKyAgICAgICAgY29tcG9uZW50IHZlcnNpb24gaXMgZGVmaW5lZCBieSB0aGUgdmVuZG9yIG9mIHRoZSBjb21wb25lbnQgYW5kIAorICAgICAgICBpdHMgdmFsdWUgaXMgZW50aXJlbHkgdXAgdG8gdGhlIGNvbXBvbmVudCB2ZW5kb3IuCisgICAgQHBhcmFtIFtvdXRdIHBTcGVjVmVyc2lvbgorICAgICAgICBwb2ludGVyIHRvIGFuIE9NWCBWZXJzaW9uIHN0cnVjdHVyZSB0aGF0IHRoZSBjb21wb25lbnQgd2lsbCBmaWxsIAorICAgICAgICBpbi4gIFRoZSBTcGVjVmVyc2lvbiBpcyB0aGUgdmVyc2lvbiBvZiB0aGUgc3BlY2lmaWNhdGlvbiB0aGF0IHRoZSAKKyAgICAgICAgY29tcG9uZW50IHdhcyBidWlsdCBhZ2FpbnN0LiAgUGxlYXNlIG5vdGUgdGhhdCB0aGlzIHZhbHVlIG1heSBvciAKKyAgICAgICAgbWF5IG5vdCBtYXRjaCB0aGUgc3RydWN0dXJlJ3MgdmVyc2lvbi4gIEZvciBleGFtcGxlLCBpZiB0aGUgCisgICAgICAgIGNvbXBvbmVudCB3YXMgYnVpbHQgYWdhaW5zdCB0aGUgMi4wIHNwZWNpZmljYXRpb24sIGJ1dCB0aGUgCisgICAgICAgIGFwcGxpY2F0aW9uICh3aGljaCBjcmVhdGVzIHRoZSBzdHJ1Y3R1cmUgaXMgYnVpbHQgYWdhaW5zdCB0aGUgCisgICAgICAgIDEuMCBzcGVjaWZpY2F0aW9uIHRoZSB2ZXJzaW9ucyB3b3VsZCBiZSBkaWZmZXJlbnQuCisgICAgQHBhcmFtIFtvdXRdIHBDb21wb25lbnRVVUlECisgICAgICAgIHBvaW50ZXIgdG8gdGhlIFVVSUQgb2YgdGhlIGNvbXBvbmVudCB3aGljaCB3aWxsIGJlIGZpbGxlZCBpbiBieSAKKyAgICAgICAgdGhlIGNvbXBvbmVudC4gIFRoZSBVVUlEIGlzIGEgdW5pcXVlIGlkZW50aWZpZXIgdGhhdCBpcyBzZXQgYXQgCisgICAgICAgIFJVTiB0aW1lIGZvciB0aGUgY29tcG9uZW50IGFuZCBpcyB1bmlxdWUgdG8gZWFjaCBpbnN0YW50aW9uIG9mIAorICAgICAgICB0aGUgY29tcG9uZW50LgorICAgIEByZXR1cm4gT01YX0VSUk9SVFlQRQorICAgICAgICBJZiB0aGUgY29tbWFuZCBzdWNjZXNzZnVsbHkgZXhlY3V0ZXMsIHRoZSByZXR1cm4gY29kZSB3aWxsIGJlCisgICAgICAgIE9NWF9FcnJvck5vbmUuICBPdGhlcndpc2UgdGhlIGFwcHJvcHJpYXRlIE9NWCBlcnJvciB3aWxsIGJlIHJldHVybmVkLgorICAgIEBpbmdyb3VwIGNvbXAKKyAqLworI2RlZmluZSBPTVhfR2V0Q29tcG9uZW50VmVyc2lvbiggICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBoQ29tcG9uZW50LCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBwQ29tcG9uZW50TmFtZSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBwQ29tcG9uZW50VmVyc2lvbiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBwU3BlY1ZlcnNpb24sICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBwQ29tcG9uZW50VVVJRCkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICgoT01YX0NPTVBPTkVOVFRZUEUqKWhDb21wb25lbnQpLT5HZXRDb21wb25lbnRWZXJzaW9uKCAgXAorICAgICAgICBoQ29tcG9uZW50LCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBwQ29tcG9uZW50TmFtZSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBwQ29tcG9uZW50VmVyc2lvbiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBwU3BlY1ZlcnNpb24sICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBwQ29tcG9uZW50VVVJRCkgICAgICAgICAgICAgICAgIC8qIE1hY3JvIEVuZCAqLworCisKKy8qKiBTZW5kIGEgY29tbWFuZCB0byB0aGUgY29tcG9uZW50LiAgVGhpcyBjYWxsIGlzIGEgbm9uLWJsb2NraW5nIGNhbGwuCisgICAgVGhlIGNvbXBvbmVudCBzaG91bGQgY2hlY2sgdGhlIHBhcmFtZXRlcnMgYW5kIHRoZW4gcXVldWUgdGhlIGNvbW1hbmQKKyAgICB0byB0aGUgY29tcG9uZW50IHRocmVhZCB0byBiZSBleGVjdXRlZC4gIFRoZSBjb21wb25lbnQgdGhyZWFkIHNoYWxsIAorICAgIHNlbmQgdGhlIEV2ZW50SGFuZGxlcigpIGNhbGxiYWNrIGF0IHRoZSBjb25jbHVzaW9uIG9mIHRoZSBjb21tYW5kLiAKKyAgICBUaGlzIG1hY3JvIHdpbGwgZ28gZGlyZWN0bHkgZnJvbSB0aGUgYXBwbGljYXRpb24gdG8gdGhlIGNvbXBvbmVudCAodmlhCisgICAgYSBjb3JlIG1hY3JvKS4gIFRoZSBjb21wb25lbnQgd2lsbCByZXR1cm4gZnJvbSB0aGlzIGNhbGwgd2l0aGluIDUgbXNlYy4KKyAgICAKKyAgICBXaGVuIHRoZSBjb21tYW5kIGlzICJPTVhfQ29tbWFuZFN0YXRlU2V0IiB0aGUgY29tcG9uZW50IHdpbGwgcXVldWUgYQorICAgIHN0YXRlIHRyYW5zaXRpb24gdG8gdGhlIG5ldyBzdGF0ZSBpZGVuZmllZCBpbiBuUGFyYW0uCisgICAgCisgICAgV2hlbiB0aGUgY29tbWFuZCBpcyAiT01YX0NvbW1hbmRGbHVzaCIsIHRvIGZsdXNoIGEgcG9ydCdzIGJ1ZmZlciBxdWV1ZXMsCisgICAgdGhlIGNvbW1hbmQgd2lsbCBmb3JjZSB0aGUgY29tcG9uZW50IHRvIHJldHVybiBhbGwgYnVmZmVycyBOT1QgQ1VSUkVOVExZIAorICAgIEJFSU5HIFBST0NFU1NFRCB0byB0aGUgYXBwbGljYXRpb24sIGluIHRoZSBvcmRlciBpbiB3aGljaCB0aGUgYnVmZmVycyAKKyAgICB3ZXJlIHJlY2VpdmVkLgorICAgIAorICAgIFdoZW4gdGhlIGNvbW1hbmQgaXMgIk9NWF9Db21tYW5kUG9ydERpc2FibGUiIG9yIAorICAgICJPTVhfQ29tbWFuZFBvcnRFbmFibGUiLCB0aGUgY29tcG9uZW50J3MgcG9ydCAoZ2l2ZW4gYnkgdGhlIHZhbHVlIG9mCisgICAgblBhcmFtKSB3aWxsIGJlIHN0b3BwZWQgb3IgcmVzdGFydGVkLiAKKyAgICAKKyAgICBXaGVuIHRoZSBjb21tYW5kICJPTVhfQ29tbWFuZE1hcmtCdWZmZXIiIGlzIHVzZWQgdG8gbWFyayBhIGJ1ZmZlciwgdGhlCisgICAgcENtZERhdGEgd2lsbCBwb2ludCB0byBhIE9NWF9NQVJLVFlQRSBzdHJ1Y3R1cmUgY29udGFpbmluZyB0aGUgY29tcG9uZW50CisgICAgaGFuZGxlIG9mIHRoZSBjb21wb25lbnQgdG8gZXhhbWluZSB0aGUgYnVmZmVyIGNoYWluIGZvciB0aGUgbWFyay4gIG5QYXJhbTEKKyAgICBjb250YWlucyB0aGUgaW5kZXggb2YgdGhlIHBvcnQgb24gd2hpY2ggdGhlIGJ1ZmZlciBtYXJrIGlzIGFwcGxpZWQuCisKKyAgICBTcGVjaWZpY2F0aW9uIHRleHQgZm9yIG1vcmUgZGV0YWlscy4gCisgICAgCisgICAgQHBhcmFtIFtpbl0gaENvbXBvbmVudAorICAgICAgICBoYW5kbGUgb2YgY29tcG9uZW50IHRvIGV4ZWN1dGUgdGhlIGNvbW1hbmQKKyAgICBAcGFyYW0gW2luXSBDbWQKKyAgICAgICAgQ29tbWFuZCBmb3IgdGhlIGNvbXBvbmVudCB0byBleGVjdXRlCisgICAgQHBhcmFtIFtpbl0gblBhcmFtCisgICAgICAgIFBhcmFtZXRlciBmb3IgdGhlIGNvbW1hbmQgdG8gYmUgZXhlY3V0ZWQuICBXaGVuIENtZCBoYXMgdGhlIHZhbHVlIAorICAgICAgICBPTVhfQ29tbWFuZFN0YXRlU2V0LCB2YWx1ZSBpcyBhIG1lbWJlciBvZiBPTVhfU1RBVEVUWVBFLiAgV2hlbiBDbWQgaGFzIAorICAgICAgICB0aGUgdmFsdWUgT01YX0NvbW1hbmRGbHVzaCwgdmFsdWUgb2YgblBhcmFtIGluZGljYXRlcyB3aGljaCBwb3J0KHMpIAorICAgICAgICB0byBmbHVzaC4gLTEgaXMgdXNlZCB0byBmbHVzaCBhbGwgcG9ydHMgYSBzaW5nbGUgcG9ydCBpbmRleCB3aWxsIAorICAgICAgICBvbmx5IGZsdXNoIHRoYXQgcG9ydC4gIFdoZW4gQ21kIGhhcyB0aGUgdmFsdWUgIk9NWF9Db21tYW5kUG9ydERpc2FibGUiCisgICAgICAgIG9yICJPTVhfQ29tbWFuZFBvcnRFbmFibGUiLCB0aGUgY29tcG9uZW50J3MgcG9ydCBpcyBnaXZlbiBieSAKKyAgICAgICAgdGhlIHZhbHVlIG9mIG5QYXJhbS4gIFdoZW4gQ21kIGhhcyB0aGUgdmFsdWUgIk9NWF9Db21tYW5kTWFya0J1ZmZlciIKKyAgICAgICAgdGhlIGNvbXBvbmVudHMgcG90IGlzIGdpdmVuIGJ5IHRoZSB2YWx1ZSBvZiBuUGFyYW0uCisgICAgQHBhcmFtIFtpbl0gcENtZERhdGEKKyAgICAgICAgUGFyYW1ldGVyIHBvaW50aW5nIHRvIHRoZSBPTVhfTUFSS1RZUEUgc3RydWN0dXJlIHdoZW4gQ21kIGhhcyB0aGUgdmFsdWUKKyAgICAgICAgIk9NWF9Db21tYW5kTWFya0J1ZmZlciIuICAgICAKKyAgICBAcmV0dXJuIE9NWF9FUlJPUlRZUEUKKyAgICAgICAgSWYgdGhlIGNvbW1hbmQgc3VjY2Vzc2Z1bGx5IGV4ZWN1dGVzLCB0aGUgcmV0dXJuIGNvZGUgd2lsbCBiZQorICAgICAgICBPTVhfRXJyb3JOb25lLiAgT3RoZXJ3aXNlIHRoZSBhcHByb3ByaWF0ZSBPTVggZXJyb3Igd2lsbCBiZSByZXR1cm5lZC4KKyAgICBAaW5ncm91cCBjb21wCisgKi8KKyNkZWZpbmUgT01YX1NlbmRDb21tYW5kKCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgIGhDb21wb25lbnQsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgIENtZCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgIG5QYXJhbSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgIHBDbWREYXRhKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgKChPTVhfQ09NUE9ORU5UVFlQRSopaENvbXBvbmVudCktPlNlbmRDb21tYW5kKCAgICAgICAgIFwKKyAgICAgICAgIGhDb21wb25lbnQsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgIENtZCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgIG5QYXJhbSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgIHBDbWREYXRhKSAgICAgICAgICAgICAgICAgICAgICAgICAgLyogTWFjcm8gRW5kICovCisKKworLyoqIFRoZSBPTVhfR2V0UGFyYW1ldGVyIG1hY3JvIHdpbGwgZ2V0IG9uZSBvZiB0aGUgY3VycmVudCBwYXJhbWV0ZXIgCisgICAgc2V0dGluZ3MgZnJvbSB0aGUgY29tcG9uZW50LiAgVGhpcyBtYWNybyBjYW5ub3Qgb25seSBiZSBpbnZva2VkIHdoZW4gCisgICAgdGhlIGNvbXBvbmVudCBpcyBpbiB0aGUgT01YX1N0YXRlSW52YWxpZCBzdGF0ZS4gIFRoZSBuUGFyYW1JbmRleAorICAgIHBhcmFtZXRlciBpcyB1c2VkIHRvIGluZGljYXRlIHdoaWNoIHN0cnVjdHVyZSBpcyBiZWluZyByZXF1ZXN0ZWQgZnJvbQorICAgIHRoZSBjb21wb25lbnQuICBUaGUgYXBwbGljYXRpb24gc2hhbGwgYWxsb2NhdGUgdGhlIGNvcnJlY3Qgc3RydWN0dXJlIAorICAgIGFuZCBzaGFsbCBmaWxsIGluIHRoZSBzdHJ1Y3R1cmUgc2l6ZSBhbmQgdmVyc2lvbiBpbmZvcm1hdGlvbiBiZWZvcmUgCisgICAgaW52b2tpbmcgdGhpcyBtYWNyby4gIFdoZW4gdGhlIHBhcmFtZXRlciBhcHBsaWVzIHRvIGEgcG9ydCwgdGhlCisgICAgY2FsbGVyIHNoYWxsIGZpbGwgaW4gdGhlIGFwcHJvcHJpYXRlIG5Qb3J0SW5kZXggdmFsdWUgaW5kaWNhdGluZyB0aGUKKyAgICBwb3J0IG9uIHdoaWNoIHRoZSBwYXJhbWV0ZXIgYXBwbGllcy4gSWYgdGhlIGNvbXBvbmVudCBoYXMgbm90IGhhZCAKKyAgICBhbnkgc2V0dGluZ3MgY2hhbmdlZCwgdGhlbiB0aGUgY29tcG9uZW50IHNob3VsZCByZXR1cm4gYSBzZXQgb2YgCisgICAgdmFsaWQgREVGQVVMVCAgcGFyYW1ldGVycyBmb3IgdGhlIGNvbXBvbmVudC4gIFRoaXMgaXMgYSBibG9ja2luZyAKKyAgICBjYWxsLiAgCisgICAgCisgICAgVGhlIGNvbXBvbmVudCBzaG91bGQgcmV0dXJuIGZyb20gdGhpcyBjYWxsIHdpdGhpbiAyMCBtc2VjLgorICAgIAorICAgIEBwYXJhbSBbaW5dIGhDb21wb25lbnQKKyAgICAgICAgSGFuZGxlIG9mIHRoZSBjb21wb25lbnQgdG8gYmUgYWNjZXNzZWQuICBUaGlzIGlzIHRoZSBjb21wb25lbnQKKyAgICAgICAgaGFuZGxlIHJldHVybmVkIGJ5IHRoZSBjYWxsIHRvIHRoZSBPTVhfR2V0SGFuZGxlIGZ1bmN0aW9uLgorICAgIEBwYXJhbSBbaW5dIG5QYXJhbUluZGV4CisgICAgICAgIEluZGV4IG9mIHRoZSBzdHJ1Y3R1cmUgdG8gYmUgZmlsbGVkLiAgVGhpcyB2YWx1ZSBpcyBmcm9tIHRoZQorICAgICAgICBPTVhfSU5ERVhUWVBFIGVudW1lcmF0aW9uLgorICAgIEBwYXJhbSBbaW4sb3V0XSBwQ29tcG9uZW50UGFyYW1ldGVyU3RydWN0dXJlCisgICAgICAgIFBvaW50ZXIgdG8gYXBwbGljYXRpb24gYWxsb2NhdGVkIHN0cnVjdHVyZSB0byBiZSBmaWxsZWQgYnkgdGhlIAorICAgICAgICBjb21wb25lbnQuCisgICAgQHJldHVybiBPTVhfRVJST1JUWVBFCisgICAgICAgIElmIHRoZSBjb21tYW5kIHN1Y2Nlc3NmdWxseSBleGVjdXRlcywgdGhlIHJldHVybiBjb2RlIHdpbGwgYmUKKyAgICAgICAgT01YX0Vycm9yTm9uZS4gIE90aGVyd2lzZSB0aGUgYXBwcm9wcmlhdGUgT01YIGVycm9yIHdpbGwgYmUgcmV0dXJuZWQuCisgICAgQGluZ3JvdXAgY29tcAorICovCisjZGVmaW5lIE9NWF9HZXRQYXJhbWV0ZXIoICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIGhDb21wb25lbnQsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIG5QYXJhbUluZGV4LCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIHBDb21wb25lbnRQYXJhbWV0ZXJTdHJ1Y3R1cmUpICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICgoT01YX0NPTVBPTkVOVFRZUEUqKWhDb21wb25lbnQpLT5HZXRQYXJhbWV0ZXIoICAgICAgICAgXAorICAgICAgICBoQ29tcG9uZW50LCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBuUGFyYW1JbmRleCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBwQ29tcG9uZW50UGFyYW1ldGVyU3RydWN0dXJlKSAgICAvKiBNYWNybyBFbmQgKi8KKworCisvKiogVGhlIE9NWF9TZXRQYXJhbWV0ZXIgbWFjcm8gd2lsbCBzZW5kIGFuIGluaXRpYWxpemF0aW9uIHBhcmFtZXRlcgorICAgIHN0cnVjdHVyZSB0byBhIGNvbXBvbmVudC4gIEVhY2ggc3RydWN0dXJlIHNoYWxsIGJlIHNlbnQgb25lIGF0IGEgdGltZSwKKyAgICBpbiBhIHNlcGFyYXRlIGludm9jYXRpb24gb2YgdGhlIG1hY3JvLiAgVGhpcyBtYWNybyBjYW4gb25seSBiZQorICAgIGludm9rZWQgd2hlbiB0aGUgY29tcG9uZW50IGlzIGluIHRoZSBPTVhfU3RhdGVMb2FkZWQgc3RhdGUsIG9yIHRoZQorICAgIHBvcnQgaXMgZGlzYWJsZWQgKHdoZW4gdGhlIHBhcmFtZXRlciBhcHBsaWVzIHRvIGEgcG9ydCkuIFRoZSAKKyAgICBuUGFyYW1JbmRleCBwYXJhbWV0ZXIgaXMgdXNlZCB0byBpbmRpY2F0ZSB3aGljaCBzdHJ1Y3R1cmUgaXMgYmVpbmcKKyAgICBwYXNzZWQgdG8gdGhlIGNvbXBvbmVudC4gIFRoZSBhcHBsaWNhdGlvbiBzaGFsbCBhbGxvY2F0ZSB0aGUgCisgICAgY29ycmVjdCBzdHJ1Y3R1cmUgYW5kIHNoYWxsIGZpbGwgaW4gdGhlIHN0cnVjdHVyZSBzaXplIGFuZCB2ZXJzaW9uIAorICAgIGluZm9ybWF0aW9uIChhcyB3ZWxsIGFzIHRoZSBhY3R1YWwgZGF0YSkgYmVmb3JlIGludm9raW5nIHRoaXMgbWFjcm8uCisgICAgVGhlIGFwcGxpY2F0aW9uIGlzIGZyZWUgdG8gZGlzcG9zZSBvZiB0aGlzIHN0cnVjdHVyZSBhZnRlciB0aGUgY2FsbAorICAgIGFzIHRoZSBjb21wb25lbnQgaXMgcmVxdWlyZWQgdG8gY29weSBhbnkgZGF0YSBpdCBzaGFsbCByZXRhaW4uICBUaGlzIAorICAgIGlzIGEgYmxvY2tpbmcgY2FsbC4gIAorICAgIAorICAgIFRoZSBjb21wb25lbnQgc2hvdWxkIHJldHVybiBmcm9tIHRoaXMgY2FsbCB3aXRoaW4gMjAgbXNlYy4KKyAgICAKKyAgICBAcGFyYW0gW2luXSBoQ29tcG9uZW50CisgICAgICAgIEhhbmRsZSBvZiB0aGUgY29tcG9uZW50IHRvIGJlIGFjY2Vzc2VkLiAgVGhpcyBpcyB0aGUgY29tcG9uZW50CisgICAgICAgIGhhbmRsZSByZXR1cm5lZCBieSB0aGUgY2FsbCB0byB0aGUgT01YX0dldEhhbmRsZSBmdW5jdGlvbi4KKyAgICBAcGFyYW0gW2luXSBuSW5kZXgKKyAgICAgICAgSW5kZXggb2YgdGhlIHN0cnVjdHVyZSB0byBiZSBzZW50LiAgVGhpcyB2YWx1ZSBpcyBmcm9tIHRoZQorICAgICAgICBPTVhfSU5ERVhUWVBFIGVudW1lcmF0aW9uLgorICAgIEBwYXJhbSBbaW5dIHBDb21wb25lbnRQYXJhbWV0ZXJTdHJ1Y3R1cmUKKyAgICAgICAgcG9pbnRlciB0byBhcHBsaWNhdGlvbiBhbGxvY2F0ZWQgc3RydWN0dXJlIHRvIGJlIHVzZWQgZm9yCisgICAgICAgIGluaXRpYWxpemF0aW9uIGJ5IHRoZSBjb21wb25lbnQuCisgICAgQHJldHVybiBPTVhfRVJST1JUWVBFCisgICAgICAgIElmIHRoZSBjb21tYW5kIHN1Y2Nlc3NmdWxseSBleGVjdXRlcywgdGhlIHJldHVybiBjb2RlIHdpbGwgYmUKKyAgICAgICAgT01YX0Vycm9yTm9uZS4gIE90aGVyd2lzZSB0aGUgYXBwcm9wcmlhdGUgT01YIGVycm9yIHdpbGwgYmUgcmV0dXJuZWQuCisgICAgQGluZ3JvdXAgY29tcAorICovCisjZGVmaW5lIE9NWF9TZXRQYXJhbWV0ZXIoICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIGhDb21wb25lbnQsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIG5QYXJhbUluZGV4LCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIHBDb21wb25lbnRQYXJhbWV0ZXJTdHJ1Y3R1cmUpICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICgoT01YX0NPTVBPTkVOVFRZUEUqKWhDb21wb25lbnQpLT5TZXRQYXJhbWV0ZXIoICAgICAgICAgXAorICAgICAgICBoQ29tcG9uZW50LCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBuUGFyYW1JbmRleCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBwQ29tcG9uZW50UGFyYW1ldGVyU3RydWN0dXJlKSAgICAvKiBNYWNybyBFbmQgKi8KKworCisvKiogVGhlIE9NWF9HZXRDb25maWcgbWFjcm8gd2lsbCBnZXQgb25lIG9mIHRoZSBjb25maWd1cmF0aW9uIHN0cnVjdHVyZXMgCisgICAgZnJvbSBhIGNvbXBvbmVudC4gIFRoaXMgbWFjcm8gY2FuIGJlIGludm9rZWQgYW55dGltZSBhZnRlciB0aGUgCisgICAgY29tcG9uZW50IGhhcyBiZWVuIGxvYWRlZC4gIFRoZSBuUGFyYW1JbmRleCBjYWxsIHBhcmFtZXRlciBpcyB1c2VkIHRvIAorICAgIGluZGljYXRlIHdoaWNoIHN0cnVjdHVyZSBpcyBiZWluZyByZXF1ZXN0ZWQgZnJvbSB0aGUgY29tcG9uZW50LiAgVGhlIAorICAgIGFwcGxpY2F0aW9uIHNoYWxsIGFsbG9jYXRlIHRoZSBjb3JyZWN0IHN0cnVjdHVyZSBhbmQgc2hhbGwgZmlsbCBpbiB0aGUgCisgICAgc3RydWN0dXJlIHNpemUgYW5kIHZlcnNpb24gaW5mb3JtYXRpb24gYmVmb3JlIGludm9raW5nIHRoaXMgbWFjcm8uICAKKyAgICBJZiB0aGUgY29tcG9uZW50IGhhcyBub3QgaGFkIHRoaXMgY29uZmlndXJhdGlvbiBwYXJhbWV0ZXIgc2VudCBiZWZvcmUsIAorICAgIHRoZW4gdGhlIGNvbXBvbmVudCBzaG91bGQgcmV0dXJuIGEgc2V0IG9mIHZhbGlkIERFRkFVTFQgdmFsdWVzIGZvciB0aGUgCisgICAgY29tcG9uZW50LiAgVGhpcyBpcyBhIGJsb2NraW5nIGNhbGwuICAKKyAgICAKKyAgICBUaGUgY29tcG9uZW50IHNob3VsZCByZXR1cm4gZnJvbSB0aGlzIGNhbGwgd2l0aGluIDUgbXNlYy4KKyAgICAKKyAgICBAcGFyYW0gW2luXSBoQ29tcG9uZW50CisgICAgICAgIEhhbmRsZSBvZiB0aGUgY29tcG9uZW50IHRvIGJlIGFjY2Vzc2VkLiAgVGhpcyBpcyB0aGUgY29tcG9uZW50CisgICAgICAgIGhhbmRsZSByZXR1cm5lZCBieSB0aGUgY2FsbCB0byB0aGUgT01YX0dldEhhbmRsZSBmdW5jdGlvbi4KKyAgICBAcGFyYW0gW2luXSBuSW5kZXgKKyAgICAgICAgSW5kZXggb2YgdGhlIHN0cnVjdHVyZSB0byBiZSBmaWxsZWQuICBUaGlzIHZhbHVlIGlzIGZyb20gdGhlCisgICAgICAgIE9NWF9JTkRFWFRZUEUgZW51bWVyYXRpb24uCisgICAgQHBhcmFtIFtpbixvdXRdIHBDb21wb25lbnRDb25maWdTdHJ1Y3R1cmUKKyAgICAgICAgcG9pbnRlciB0byBhcHBsaWNhdGlvbiBhbGxvY2F0ZWQgc3RydWN0dXJlIHRvIGJlIGZpbGxlZCBieSB0aGUgCisgICAgICAgIGNvbXBvbmVudC4KKyAgICBAcmV0dXJuIE9NWF9FUlJPUlRZUEUKKyAgICAgICAgSWYgdGhlIGNvbW1hbmQgc3VjY2Vzc2Z1bGx5IGV4ZWN1dGVzLCB0aGUgcmV0dXJuIGNvZGUgd2lsbCBiZQorICAgICAgICBPTVhfRXJyb3JOb25lLiAgT3RoZXJ3aXNlIHRoZSBhcHByb3ByaWF0ZSBPTVggZXJyb3Igd2lsbCBiZSByZXR1cm5lZC4KKyAgICBAaW5ncm91cCBjb21wCisqLyAgICAgICAgCisjZGVmaW5lIE9NWF9HZXRDb25maWcoICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIGhDb21wb25lbnQsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIG5Db25maWdJbmRleCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIHBDb21wb25lbnRDb25maWdTdHJ1Y3R1cmUpICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICgoT01YX0NPTVBPTkVOVFRZUEUqKWhDb21wb25lbnQpLT5HZXRDb25maWcoICAgICAgICAgICAgXAorICAgICAgICBoQ29tcG9uZW50LCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBuQ29uZmlnSW5kZXgsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBwQ29tcG9uZW50Q29uZmlnU3RydWN0dXJlKSAgICAgICAvKiBNYWNybyBFbmQgKi8KKworCisvKiogVGhlIE9NWF9TZXRDb25maWcgbWFjcm8gd2lsbCBzZW5kIG9uZSBvZiB0aGUgY29uZmlndXJhdGlvbiAKKyAgICBzdHJ1Y3R1cmVzIHRvIGEgY29tcG9uZW50LiAgRWFjaCBzdHJ1Y3R1cmUgc2hhbGwgYmUgc2VudCBvbmUgYXQgYSB0aW1lLAorICAgIGVhY2ggaW4gYSBzZXBhcmF0ZSBpbnZvY2F0aW9uIG9mIHRoZSBtYWNyby4gIFRoaXMgbWFjcm8gY2FuIGJlIGludm9rZWQgCisgICAgYW55dGltZSBhZnRlciB0aGUgY29tcG9uZW50IGhhcyBiZWVuIGxvYWRlZC4gIFRoZSBhcHBsaWNhdGlvbiBzaGFsbCAKKyAgICBhbGxvY2F0ZSB0aGUgY29ycmVjdCBzdHJ1Y3R1cmUgYW5kIHNoYWxsIGZpbGwgaW4gdGhlIHN0cnVjdHVyZSBzaXplIAorICAgIGFuZCB2ZXJzaW9uIGluZm9ybWF0aW9uIChhcyB3ZWxsIGFzIHRoZSBhY3R1YWwgZGF0YSkgYmVmb3JlIGludm9raW5nIAorICAgIHRoaXMgbWFjcm8uICBUaGUgYXBwbGljYXRpb24gaXMgZnJlZSB0byBkaXNwb3NlIG9mIHRoaXMgc3RydWN0dXJlIGFmdGVyIAorICAgIHRoZSBjYWxsIGFzIHRoZSBjb21wb25lbnQgaXMgcmVxdWlyZWQgdG8gY29weSBhbnkgZGF0YSBpdCBzaGFsbCByZXRhaW4uICAKKyAgICBUaGlzIGlzIGEgYmxvY2tpbmcgY2FsbC4gIAorICAgIAorICAgIFRoZSBjb21wb25lbnQgc2hvdWxkIHJldHVybiBmcm9tIHRoaXMgY2FsbCB3aXRoaW4gNSBtc2VjLgorICAgIAorICAgIEBwYXJhbSBbaW5dIGhDb21wb25lbnQKKyAgICAgICAgSGFuZGxlIG9mIHRoZSBjb21wb25lbnQgdG8gYmUgYWNjZXNzZWQuICBUaGlzIGlzIHRoZSBjb21wb25lbnQKKyAgICAgICAgaGFuZGxlIHJldHVybmVkIGJ5IHRoZSBjYWxsIHRvIHRoZSBPTVhfR2V0SGFuZGxlIGZ1bmN0aW9uLgorICAgIEBwYXJhbSBbaW5dIG5Db25maWdJbmRleAorICAgICAgICBJbmRleCBvZiB0aGUgc3RydWN0dXJlIHRvIGJlIHNlbnQuICBUaGlzIHZhbHVlIGlzIGZyb20gdGhlCisgICAgICAgIE9NWF9JTkRFWFRZUEUgZW51bWVyYXRpb24gYWJvdmUuCisgICAgQHBhcmFtIFtpbl0gcENvbXBvbmVudENvbmZpZ1N0cnVjdHVyZQorICAgICAgICBwb2ludGVyIHRvIGFwcGxpY2F0aW9uIGFsbG9jYXRlZCBzdHJ1Y3R1cmUgdG8gYmUgdXNlZCBmb3IKKyAgICAgICAgaW5pdGlhbGl6YXRpb24gYnkgdGhlIGNvbXBvbmVudC4KKyAgICBAcmV0dXJuIE9NWF9FUlJPUlRZUEUKKyAgICAgICAgSWYgdGhlIGNvbW1hbmQgc3VjY2Vzc2Z1bGx5IGV4ZWN1dGVzLCB0aGUgcmV0dXJuIGNvZGUgd2lsbCBiZQorICAgICAgICBPTVhfRXJyb3JOb25lLiAgT3RoZXJ3aXNlIHRoZSBhcHByb3ByaWF0ZSBPTVggZXJyb3Igd2lsbCBiZSByZXR1cm5lZC4KKyAgICBAaW5ncm91cCBjb21wCisgKi8KKyNkZWZpbmUgT01YX1NldENvbmZpZyggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgaENvbXBvbmVudCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgbkNvbmZpZ0luZGV4LCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgcENvbXBvbmVudENvbmZpZ1N0cnVjdHVyZSkgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgKChPTVhfQ09NUE9ORU5UVFlQRSopaENvbXBvbmVudCktPlNldENvbmZpZyggICAgICAgICAgICBcCisgICAgICAgIGhDb21wb25lbnQsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIG5Db25maWdJbmRleCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIHBDb21wb25lbnRDb25maWdTdHJ1Y3R1cmUpICAgICAgIC8qIE1hY3JvIEVuZCAqLworCisKKy8qKiBUaGUgT01YX0dldEV4dGVuc2lvbkluZGV4IG1hY3JvIHdpbGwgaW52b2tlIGEgY29tcG9uZW50IHRvIHRyYW5zbGF0ZSAKKyAgICBhIHZlbmRvciBzcGVjaWZpYyBjb25maWd1cmF0aW9uIG9yIHBhcmFtZXRlciBzdHJpbmcgaW50byBhbiBPTVggCisgICAgc3RydWN0dXJlIGluZGV4LiAgVGhlcmUgaXMgbm8gcmVxdWlyZW1lbnQgZm9yIHRoZSB2ZW5kb3IgdG8gc3VwcG9ydCAKKyAgICB0aGlzIGNvbW1hbmQgZm9yIHRoZSBpbmRleGVzIGFscmVhZHkgZm91bmQgaW4gdGhlIE9NWF9JTkRFWFRZUEUgCisgICAgZW51bWVyYXRpb24gKHRoaXMgaXMgZG9uZSB0byBzYXZlIHNwYWNlIGluIHNtYWxsIGNvbXBvbmVudHMpLiAgVGhlIAorICAgIGNvbXBvbmVudCBzaGFsbCBzdXBwb3J0IGFsbCB2ZW5kb3Igc3VwcGxpZWQgZXh0ZW5zaW9uIGluZGV4ZXMgbm90IGZvdW5kCisgICAgaW4gdGhlIG1hc3RlciBPTVhfSU5ERVhUWVBFIGVudW1lcmF0aW9uLiAgVGhpcyBpcyBhIGJsb2NraW5nIGNhbGwuICAKKyAgICAKKyAgICBUaGUgY29tcG9uZW50IHNob3VsZCByZXR1cm4gZnJvbSB0aGlzIGNhbGwgd2l0aGluIDUgbXNlYy4KKyAgICAKKyAgICBAcGFyYW0gW2luXSBoQ29tcG9uZW50CisgICAgICAgIEhhbmRsZSBvZiB0aGUgY29tcG9uZW50IHRvIGJlIGFjY2Vzc2VkLiAgVGhpcyBpcyB0aGUgY29tcG9uZW50CisgICAgICAgIGhhbmRsZSByZXR1cm5lZCBieSB0aGUgY2FsbCB0byB0aGUgR2V0SGFuZGxlIGZ1bmN0aW9uLgorICAgIEBwYXJhbSBbaW5dIGNQYXJhbWV0ZXJOYW1lCisgICAgICAgIE9NWF9TVFJJTkcgdGhhdCBzaGFsbCBiZSBsZXNzIHRoYW4gMTI4IGNoYXJhY3RlcnMgbG9uZyBpbmNsdWRpbmcKKyAgICAgICAgdGhlIHRyYWlsaW5nIG51bGwgYnl0ZS4gIFRoaXMgaXMgdGhlIHN0cmluZyB0aGF0IHdpbGwgZ2V0IAorICAgICAgICB0cmFuc2xhdGVkIGJ5IHRoZSBjb21wb25lbnQgaW50byBhIGNvbmZpZ3VyYXRpb24gaW5kZXguCisgICAgQHBhcmFtIFtvdXRdIHBJbmRleFR5cGUKKyAgICAgICAgYSBwb2ludGVyIHRvIGEgT01YX0lOREVYVFlQRSB0byByZWNlaXZlIHRoZSBpbmRleCB2YWx1ZS4KKyAgICBAcmV0dXJuIE9NWF9FUlJPUlRZUEUKKyAgICAgICAgSWYgdGhlIGNvbW1hbmQgc3VjY2Vzc2Z1bGx5IGV4ZWN1dGVzLCB0aGUgcmV0dXJuIGNvZGUgd2lsbCBiZQorICAgICAgICBPTVhfRXJyb3JOb25lLiAgT3RoZXJ3aXNlIHRoZSBhcHByb3ByaWF0ZSBPTVggZXJyb3Igd2lsbCBiZSByZXR1cm5lZC4KKyAgICBAaW5ncm91cCBjb21wCisgKi8KKyNkZWZpbmUgT01YX0dldEV4dGVuc2lvbkluZGV4KCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgaENvbXBvbmVudCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgY1BhcmFtZXRlck5hbWUsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgcEluZGV4VHlwZSkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAoKE9NWF9DT01QT05FTlRUWVBFKiloQ29tcG9uZW50KS0+R2V0RXh0ZW5zaW9uSW5kZXgoICAgIFwKKyAgICAgICAgaENvbXBvbmVudCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgY1BhcmFtZXRlck5hbWUsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgcEluZGV4VHlwZSkgICAgICAgICAgICAgICAgICAgICAvKiBNYWNybyBFbmQgKi8KKworCisvKiogVGhlIE9NWF9HZXRTdGF0ZSBtYWNybyB3aWxsIGludm9rZSB0aGUgY29tcG9uZW50IHRvIGdldCB0aGUgY3VycmVudCAKKyAgICBzdGF0ZSBvZiB0aGUgY29tcG9uZW50IGFuZCBwbGFjZSB0aGUgc3RhdGUgdmFsdWUgaW50byB0aGUgbG9jYXRpb24KKyAgICBwb2ludGVkIHRvIGJ5IHBTdGF0ZS4gIAorICAgIAorICAgIFRoZSBjb21wb25lbnQgc2hvdWxkIHJldHVybiBmcm9tIHRoaXMgY2FsbCB3aXRoaW4gNSBtc2VjLgorICAgIAorICAgIEBwYXJhbSBbaW5dIGhDb21wb25lbnQKKyAgICAgICAgSGFuZGxlIG9mIHRoZSBjb21wb25lbnQgdG8gYmUgYWNjZXNzZWQuICBUaGlzIGlzIHRoZSBjb21wb25lbnQKKyAgICAgICAgaGFuZGxlIHJldHVybmVkIGJ5IHRoZSBjYWxsIHRvIHRoZSBPTVhfR2V0SGFuZGxlIGZ1bmN0aW9uLgorICAgIEBwYXJhbSBbb3V0XSBwU3RhdGUKKyAgICAgICAgcG9pbnRlciB0byB0aGUgbG9jYXRpb24gdG8gcmVjZWl2ZSB0aGUgc3RhdGUuICBUaGUgdmFsdWUgcmV0dXJuZWQKKyAgICAgICAgaXMgb25lIG9mIHRoZSBPTVhfU1RBVEVUWVBFIG1lbWJlcnMgCisgICAgQHJldHVybiBPTVhfRVJST1JUWVBFCisgICAgICAgIElmIHRoZSBjb21tYW5kIHN1Y2Nlc3NmdWxseSBleGVjdXRlcywgdGhlIHJldHVybiBjb2RlIHdpbGwgYmUKKyAgICAgICAgT01YX0Vycm9yTm9uZS4gIE90aGVyd2lzZSB0aGUgYXBwcm9wcmlhdGUgT01YIGVycm9yIHdpbGwgYmUgcmV0dXJuZWQuCisgICAgQGluZ3JvdXAgY29tcAorICovCisjZGVmaW5lIE9NWF9HZXRTdGF0ZSggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIGhDb21wb25lbnQsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIHBTdGF0ZSkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgKChPTVhfQ09NUE9ORU5UVFlQRSopaENvbXBvbmVudCktPkdldFN0YXRlKCAgICAgICAgICAgICBcCisgICAgICAgIGhDb21wb25lbnQsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIHBTdGF0ZSkgICAgICAgICAgICAgICAgICAgICAgICAgLyogTWFjcm8gRW5kICovCisKKworLyoqIFRoZSBPTVhfVXNlQnVmZmVyIG1hY3JvIHdpbGwgcmVxdWVzdCB0aGF0IHRoZSBjb21wb25lbnQgdXNlCisgICAgYSBidWZmZXIgKGFuZCBhbGxvY2F0ZSBpdHMgb3duIGJ1ZmZlciBoZWFkZXIpIGFscmVhZHkgYWxsb2NhdGVkIAorICAgIGJ5IGFub3RoZXIgY29tcG9uZW50LCBvciBieSB0aGUgSUwgQ2xpZW50LiBUaGlzIGlzIGEgYmxvY2tpbmcgCisgICAgY2FsbC4KKyAgICAKKyAgICBUaGUgY29tcG9uZW50IHNob3VsZCByZXR1cm4gZnJvbSB0aGlzIGNhbGwgd2l0aGluIDIwIG1zZWMuCisgICAgCisgICAgQHBhcmFtIFtpbl0gaENvbXBvbmVudAorICAgICAgICBIYW5kbGUgb2YgdGhlIGNvbXBvbmVudCB0byBiZSBhY2Nlc3NlZC4gIFRoaXMgaXMgdGhlIGNvbXBvbmVudAorICAgICAgICBoYW5kbGUgcmV0dXJuZWQgYnkgdGhlIGNhbGwgdG8gdGhlIE9NWF9HZXRIYW5kbGUgZnVuY3Rpb24uCisgICAgQHBhcmFtIFtvdXRdIHBwQnVmZmVyCisgICAgICAgIHBvaW50ZXIgdG8gYW4gT01YX0JVRkZFUkhFQURFUlRZUEUgc3RydWN0dXJlIHVzZWQgdG8gcmVjZWl2ZSB0aGUgCisgICAgICAgIHBvaW50ZXIgdG8gdGhlIGJ1ZmZlciBoZWFkZXIKKyAgICBAcmV0dXJuIE9NWF9FUlJPUlRZUEUKKyAgICAgICAgSWYgdGhlIGNvbW1hbmQgc3VjY2Vzc2Z1bGx5IGV4ZWN1dGVzLCB0aGUgcmV0dXJuIGNvZGUgd2lsbCBiZQorICAgICAgICBPTVhfRXJyb3JOb25lLiAgT3RoZXJ3aXNlIHRoZSBhcHByb3ByaWF0ZSBPTVggZXJyb3Igd2lsbCBiZSByZXR1cm5lZC4KKyAgICBAaW5ncm91cCBjb21wIGJ1ZgorICovCisKKyNkZWZpbmUgT01YX1VzZUJ1ZmZlciggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgaENvbXBvbmVudCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgcHBCdWZmZXJIZHIsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgblBvcnRJbmRleCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgcEFwcFByaXZhdGUsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgblNpemVCeXRlcywgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgcEJ1ZmZlcikgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAoKE9NWF9DT01QT05FTlRUWVBFKiloQ29tcG9uZW50KS0+VXNlQnVmZmVyKCAgICAgICAgICAgIFwKKyAgICAgICAgICAgaENvbXBvbmVudCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgcHBCdWZmZXJIZHIsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgblBvcnRJbmRleCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgcEFwcFByaXZhdGUsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgblNpemVCeXRlcywgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgcEJ1ZmZlcikKKworCisvKiogVGhlIE9NWF9BbGxvY2F0ZUJ1ZmZlciBtYWNybyB3aWxsIHJlcXVlc3QgdGhhdCB0aGUgY29tcG9uZW50IGFsbG9jYXRlIAorICAgIGEgbmV3IGJ1ZmZlciBhbmQgYnVmZmVyIGhlYWRlci4gIFRoZSBjb21wb25lbnQgd2lsbCBhbGxvY2F0ZSB0aGUgCisgICAgYnVmZmVyIGFuZCB0aGUgYnVmZmVyIGhlYWRlciBhbmQgcmV0dXJuIGEgcG9pbnRlciB0byB0aGUgYnVmZmVyIAorICAgIGhlYWRlci4gIFRoaXMgaXMgYSBibG9ja2luZyBjYWxsLgorICAgIAorICAgIFRoZSBjb21wb25lbnQgc2hvdWxkIHJldHVybiBmcm9tIHRoaXMgY2FsbCB3aXRoaW4gNSBtc2VjLgorICAgIAorICAgIEBwYXJhbSBbaW5dIGhDb21wb25lbnQKKyAgICAgICAgSGFuZGxlIG9mIHRoZSBjb21wb25lbnQgdG8gYmUgYWNjZXNzZWQuICBUaGlzIGlzIHRoZSBjb21wb25lbnQKKyAgICAgICAgaGFuZGxlIHJldHVybmVkIGJ5IHRoZSBjYWxsIHRvIHRoZSBPTVhfR2V0SGFuZGxlIGZ1bmN0aW9uLgorICAgIEBwYXJhbSBbb3V0XSBwcEJ1ZmZlcgorICAgICAgICBwb2ludGVyIHRvIGFuIE9NWF9CVUZGRVJIRUFERVJUWVBFIHN0cnVjdHVyZSB1c2VkIHRvIHJlY2VpdmUgCisgICAgICAgIHRoZSBwb2ludGVyIHRvIHRoZSBidWZmZXIgaGVhZGVyCisgICAgQHBhcmFtIFtpbl0gblBvcnRJbmRleAorICAgICAgICBuUG9ydEluZGV4IGlzIHVzZWQgdG8gc2VsZWN0IHRoZSBwb3J0IG9uIHRoZSBjb21wb25lbnQgdGhlIGJ1ZmZlciB3aWxsCisgICAgICAgIGJlIHVzZWQgd2l0aC4gIFRoZSBwb3J0IGNhbiBiZSBmb3VuZCBieSB1c2luZyB0aGUgblBvcnRJbmRleAorICAgICAgICB2YWx1ZSBhcyBhbiBpbmRleCBpbnRvIHRoZSBQb3J0IERlZmluaXRpb24gYXJyYXkgb2YgdGhlIGNvbXBvbmVudC4KKyAgICBAcGFyYW0gW2luXSBwQXBwUHJpdmF0ZQorICAgICAgICBwQXBwUHJpdmF0ZSBpcyB1c2VkIHRvIGluaXRpYWxpemUgdGhlIHBBcHBQcml2YXRlIG1lbWJlciBvZiB0aGUgCisgICAgICAgIGJ1ZmZlciBoZWFkZXIgc3RydWN0dXJlLgorICAgIEBwYXJhbSBbaW5dIG5TaXplQnl0ZXMKKyAgICAgICAgc2l6ZSBvZiB0aGUgYnVmZmVyIHRvIGFsbG9jYXRlLiAgVXNlZCB3aGVuIGJBbGxvY2F0ZU5ldyBpcyB0cnVlLgorICAgIEByZXR1cm4gT01YX0VSUk9SVFlQRQorICAgICAgICBJZiB0aGUgY29tbWFuZCBzdWNjZXNzZnVsbHkgZXhlY3V0ZXMsIHRoZSByZXR1cm4gY29kZSB3aWxsIGJlCisgICAgICAgIE9NWF9FcnJvck5vbmUuICBPdGhlcndpc2UgdGhlIGFwcHJvcHJpYXRlIE9NWCBlcnJvciB3aWxsIGJlIHJldHVybmVkLgorICAgIEBpbmdyb3VwIGNvbXAgYnVmCisgKi8gICAgCisjZGVmaW5lIE9NWF9BbGxvY2F0ZUJ1ZmZlciggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIGhDb21wb25lbnQsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIHBwQnVmZmVyLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIG5Qb3J0SW5kZXgsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIHBBcHBQcml2YXRlLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIG5TaXplQnl0ZXMpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgKChPTVhfQ09NUE9ORU5UVFlQRSopaENvbXBvbmVudCktPkFsbG9jYXRlQnVmZmVyKCAgICAgICBcCisgICAgICAgIGhDb21wb25lbnQsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIHBwQnVmZmVyLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIG5Qb3J0SW5kZXgsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIHBBcHBQcml2YXRlLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIG5TaXplQnl0ZXMpICAgICAgICAgICAgICAgICAgICAgLyogTWFjcm8gRW5kICovCisKKworLyoqIFRoZSBPTVhfRnJlZUJ1ZmZlciBtYWNybyB3aWxsIHJlbGVhc2UgYSBidWZmZXIgaGVhZGVyIGZyb20gdGhlIGNvbXBvbmVudAorICAgIHdoaWNoIHdhcyBhbGxvY2F0ZWQgdXNpbmcgZWl0aGVyIE9NWF9BbGxvY2F0ZUJ1ZmZlciBvciBPTVhfVXNlQnVmZmVyLiBJZiAgCisgICAgdGhlIGNvbXBvbmVudCBhbGxvY2F0ZWQgdGhlIGJ1ZmZlciAoc2VlIHRoZSBPTVhfVXNlQnVmZmVyIG1hY3JvKSB0aGVuIAorICAgIHRoZSBjb21wb25lbnQgc2hhbGwgZnJlZSB0aGUgYnVmZmVyIGFuZCBidWZmZXIgaGVhZGVyLiBUaGlzIGlzIGEgCisgICAgYmxvY2tpbmcgY2FsbC4gCisgICAgCisgICAgVGhlIGNvbXBvbmVudCBzaG91bGQgcmV0dXJuIGZyb20gdGhpcyBjYWxsIHdpdGhpbiAyMCBtc2VjLgorICAgIAorICAgIEBwYXJhbSBbaW5dIGhDb21wb25lbnQKKyAgICAgICAgSGFuZGxlIG9mIHRoZSBjb21wb25lbnQgdG8gYmUgYWNjZXNzZWQuICBUaGlzIGlzIHRoZSBjb21wb25lbnQKKyAgICAgICAgaGFuZGxlIHJldHVybmVkIGJ5IHRoZSBjYWxsIHRvIHRoZSBPTVhfR2V0SGFuZGxlIGZ1bmN0aW9uLgorICAgIEBwYXJhbSBbaW5dIG5Qb3J0SW5kZXgKKyAgICAgICAgblBvcnRJbmRleCBpcyB1c2VkIHRvIHNlbGVjdCB0aGUgcG9ydCBvbiB0aGUgY29tcG9uZW50IHRoZSBidWZmZXIgd2lsbAorICAgICAgICBiZSB1c2VkIHdpdGguCisgICAgQHBhcmFtIFtpbl0gcEJ1ZmZlcgorICAgICAgICBwb2ludGVyIHRvIGFuIE9NWF9CVUZGRVJIRUFERVJUWVBFIHN0cnVjdHVyZSBhbGxvY2F0ZWQgd2l0aCBVc2VCdWZmZXIKKyAgICAgICAgb3IgQWxsb2NhdGVCdWZmZXIuCisgICAgQHJldHVybiBPTVhfRVJST1JUWVBFCisgICAgICAgIElmIHRoZSBjb21tYW5kIHN1Y2Nlc3NmdWxseSBleGVjdXRlcywgdGhlIHJldHVybiBjb2RlIHdpbGwgYmUKKyAgICAgICAgT01YX0Vycm9yTm9uZS4gIE90aGVyd2lzZSB0aGUgYXBwcm9wcmlhdGUgT01YIGVycm9yIHdpbGwgYmUgcmV0dXJuZWQuCisgICAgQGluZ3JvdXAgY29tcCBidWYKKyAqLworI2RlZmluZSBPTVhfRnJlZUJ1ZmZlciggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBoQ29tcG9uZW50LCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBuUG9ydEluZGV4LCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBwQnVmZmVyKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICgoT01YX0NPTVBPTkVOVFRZUEUqKWhDb21wb25lbnQpLT5GcmVlQnVmZmVyKCAgICAgICAgICAgXAorICAgICAgICBoQ29tcG9uZW50LCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBuUG9ydEluZGV4LCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBwQnVmZmVyKSAgICAgICAgICAgICAgICAgICAgICAgIC8qIE1hY3JvIEVuZCAqLworCisKKy8qKiBUaGUgT01YX0VtcHR5VGhpc0J1ZmZlciBtYWNybyB3aWxsIHNlbmQgYSBidWZmZXIgZnVsbCBvZiBkYXRhIHRvIGFuIAorICAgIGlucHV0IHBvcnQgb2YgYSBjb21wb25lbnQuICBUaGUgYnVmZmVyIHdpbGwgYmUgZW1wdGllZCBieSB0aGUgY29tcG9uZW50CisgICAgYW5kIHJldHVybmVkIHRvIHRoZSBhcHBsaWNhdGlvbiB2aWEgdGhlIEVtcHR5QnVmZmVyRG9uZSBjYWxsIGJhY2suCisgICAgVGhpcyBpcyBhIG5vbi1ibG9ja2luZyBjYWxsIGluIHRoYXQgdGhlIGNvbXBvbmVudCB3aWxsIHJlY29yZCB0aGUgYnVmZmVyCisgICAgYW5kIHJldHVybiBpbW1lZGlhdGVseSBhbmQgdGhlbiBlbXB0eSB0aGUgYnVmZmVyLCBsYXRlciwgYXQgdGhlIHByb3BlciAKKyAgICB0aW1lLiAgQXMgZXhwZWN0ZWQsIHRoaXMgbWFjcm8gbWF5IGJlIGludm9rZWQgb25seSB3aGlsZSB0aGUgY29tcG9uZW50IAorICAgIGlzIGluIHRoZSBPTVhfU3RhdGVFeGVjdXRpbmcuICBJZiBuUG9ydEluZGV4IGRvZXMgbm90IHNwZWNpZnkgYW4gaW5wdXQKKyAgICBwb3J0LCB0aGUgY29tcG9uZW50IHNoYWxsIHJldHVybiBhbiBlcnJvci4gIAorICAgIAorICAgIFRoZSBjb21wb25lbnQgc2hvdWxkIHJldHVybiBmcm9tIHRoaXMgY2FsbCB3aXRoaW4gNSBtc2VjLgorICAgIAorICAgIEBwYXJhbSBbaW5dIGhDb21wb25lbnQKKyAgICAgICAgSGFuZGxlIG9mIHRoZSBjb21wb25lbnQgdG8gYmUgYWNjZXNzZWQuICBUaGlzIGlzIHRoZSBjb21wb25lbnQKKyAgICAgICAgaGFuZGxlIHJldHVybmVkIGJ5IHRoZSBjYWxsIHRvIHRoZSBPTVhfR2V0SGFuZGxlIGZ1bmN0aW9uLgorICAgIEBwYXJhbSBbaW5dIHBCdWZmZXIKKyAgICAgICAgcG9pbnRlciB0byBhbiBPTVhfQlVGRkVSSEVBREVSVFlQRSBzdHJ1Y3R1cmUgYWxsb2NhdGVkIHdpdGggVXNlQnVmZmVyCisgICAgICAgIG9yIEFsbG9jYXRlQnVmZmVyLgorICAgIEByZXR1cm4gT01YX0VSUk9SVFlQRQorICAgICAgICBJZiB0aGUgY29tbWFuZCBzdWNjZXNzZnVsbHkgZXhlY3V0ZXMsIHRoZSByZXR1cm4gY29kZSB3aWxsIGJlCisgICAgICAgIE9NWF9FcnJvck5vbmUuICBPdGhlcndpc2UgdGhlIGFwcHJvcHJpYXRlIE9NWCBlcnJvciB3aWxsIGJlIHJldHVybmVkLgorICAgIEBpbmdyb3VwIGNvbXAgYnVmCisgKi8KKyNkZWZpbmUgT01YX0VtcHR5VGhpc0J1ZmZlciggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgaENvbXBvbmVudCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgcEJ1ZmZlcikgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAoKE9NWF9DT01QT05FTlRUWVBFKiloQ29tcG9uZW50KS0+RW1wdHlUaGlzQnVmZmVyKCAgICAgIFwKKyAgICAgICAgaENvbXBvbmVudCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgcEJ1ZmZlcikgICAgICAgICAgICAgICAgICAgICAgICAvKiBNYWNybyBFbmQgKi8KKworCisvKiogVGhlIE9NWF9GaWxsVGhpc0J1ZmZlciBtYWNybyB3aWxsIHNlbmQgYW4gZW1wdHkgYnVmZmVyIHRvIGFuIAorICAgIG91dHB1dCBwb3J0IG9mIGEgY29tcG9uZW50LiAgVGhlIGJ1ZmZlciB3aWxsIGJlIGZpbGxlZCBieSB0aGUgY29tcG9uZW50CisgICAgYW5kIHJldHVybmVkIHRvIHRoZSBhcHBsaWNhdGlvbiB2aWEgdGhlIEZpbGxCdWZmZXJEb25lIGNhbGwgYmFjay4KKyAgICBUaGlzIGlzIGEgbm9uLWJsb2NraW5nIGNhbGwgaW4gdGhhdCB0aGUgY29tcG9uZW50IHdpbGwgcmVjb3JkIHRoZSBidWZmZXIKKyAgICBhbmQgcmV0dXJuIGltbWVkaWF0ZWx5IGFuZCB0aGVuIGZpbGwgdGhlIGJ1ZmZlciwgbGF0ZXIsIGF0IHRoZSBwcm9wZXIgCisgICAgdGltZS4gIEFzIGV4cGVjdGVkLCB0aGlzIG1hY3JvIG1heSBiZSBpbnZva2VkIG9ubHkgd2hpbGUgdGhlIGNvbXBvbmVudCAKKyAgICBpcyBpbiB0aGUgT01YX0V4ZWN1dGluZ1N0YXRlLiAgSWYgblBvcnRJbmRleCBkb2VzIG5vdCBzcGVjaWZ5IGFuIG91dHB1dAorICAgIHBvcnQsIHRoZSBjb21wb25lbnQgc2hhbGwgcmV0dXJuIGFuIGVycm9yLiAgCisgICAgCisgICAgVGhlIGNvbXBvbmVudCBzaG91bGQgcmV0dXJuIGZyb20gdGhpcyBjYWxsIHdpdGhpbiA1IG1zZWMuCisgICAgCisgICAgQHBhcmFtIFtpbl0gaENvbXBvbmVudAorICAgICAgICBIYW5kbGUgb2YgdGhlIGNvbXBvbmVudCB0byBiZSBhY2Nlc3NlZC4gIFRoaXMgaXMgdGhlIGNvbXBvbmVudAorICAgICAgICBoYW5kbGUgcmV0dXJuZWQgYnkgdGhlIGNhbGwgdG8gdGhlIE9NWF9HZXRIYW5kbGUgZnVuY3Rpb24uCisgICAgQHBhcmFtIFtpbl0gcEJ1ZmZlcgorICAgICAgICBwb2ludGVyIHRvIGFuIE9NWF9CVUZGRVJIRUFERVJUWVBFIHN0cnVjdHVyZSBhbGxvY2F0ZWQgd2l0aCBVc2VCdWZmZXIKKyAgICAgICAgb3IgQWxsb2NhdGVCdWZmZXIuCisgICAgQHJldHVybiBPTVhfRVJST1JUWVBFCisgICAgICAgIElmIHRoZSBjb21tYW5kIHN1Y2Nlc3NmdWxseSBleGVjdXRlcywgdGhlIHJldHVybiBjb2RlIHdpbGwgYmUKKyAgICAgICAgT01YX0Vycm9yTm9uZS4gIE90aGVyd2lzZSB0aGUgYXBwcm9wcmlhdGUgT01YIGVycm9yIHdpbGwgYmUgcmV0dXJuZWQuCisgICAgQGluZ3JvdXAgY29tcCBidWYKKyAqLworI2RlZmluZSBPTVhfRmlsbFRoaXNCdWZmZXIoICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBoQ29tcG9uZW50LCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBwQnVmZmVyKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICgoT01YX0NPTVBPTkVOVFRZUEUqKWhDb21wb25lbnQpLT5GaWxsVGhpc0J1ZmZlciggICAgICAgXAorICAgICAgICBoQ29tcG9uZW50LCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBwQnVmZmVyKSAgICAgICAgICAgICAgICAgICAgICAgIC8qIE1hY3JvIEVuZCAqLworCisKKworLyoqIFRoZSBPTVhfVXNlRUdMSW1hZ2UgbWFjcm8gd2lsbCByZXF1ZXN0IHRoYXQgdGhlIGNvbXBvbmVudCB1c2UKKyAgICBhIEVHTEltYWdlIHByb3ZpZGVkIGJ5IEVHTCAoYW5kIGFsbG9jYXRlIGl0cyBvd24gYnVmZmVyIGhlYWRlcikKKyAgICBUaGlzIGlzIGEgYmxvY2tpbmcgY2FsbC4KKyAgICAKKyAgICBUaGUgY29tcG9uZW50IHNob3VsZCByZXR1cm4gZnJvbSB0aGlzIGNhbGwgd2l0aGluIDIwIG1zZWMuCisgICAgCisgICAgQHBhcmFtIFtpbl0gaENvbXBvbmVudAorICAgICAgICBIYW5kbGUgb2YgdGhlIGNvbXBvbmVudCB0byBiZSBhY2Nlc3NlZC4gIFRoaXMgaXMgdGhlIGNvbXBvbmVudAorICAgICAgICBoYW5kbGUgcmV0dXJuZWQgYnkgdGhlIGNhbGwgdG8gdGhlIE9NWF9HZXRIYW5kbGUgZnVuY3Rpb24uCisgICAgQHBhcmFtIFtvdXRdIHBwQnVmZmVyCisgICAgICAgIHBvaW50ZXIgdG8gYW4gT01YX0JVRkZFUkhFQURFUlRZUEUgc3RydWN0dXJlIHVzZWQgdG8gcmVjZWl2ZSB0aGUgCisgICAgICAgIHBvaW50ZXIgdG8gdGhlIGJ1ZmZlciBoZWFkZXIuICBOb3RlIHRoYXQgdGhlIG1lbW9yeSBsb2NhdGlvbiB1c2VkCisgICAgICAgIGZvciB0aGlzIGJ1ZmZlciBpcyBOT1QgdmlzaWJsZSB0byB0aGUgSUwgQ2xpZW50LgorICAgIEBwYXJhbSBbaW5dIG5Qb3J0SW5kZXgKKyAgICAgICAgblBvcnRJbmRleCBpcyB1c2VkIHRvIHNlbGVjdCB0aGUgcG9ydCBvbiB0aGUgY29tcG9uZW50IHRoZSBidWZmZXIgd2lsbAorICAgICAgICBiZSB1c2VkIHdpdGguICBUaGUgcG9ydCBjYW4gYmUgZm91bmQgYnkgdXNpbmcgdGhlIG5Qb3J0SW5kZXgKKyAgICAgICAgdmFsdWUgYXMgYW4gaW5kZXggaW50byB0aGUgUG9ydCBEZWZpbml0aW9uIGFycmF5IG9mIHRoZSBjb21wb25lbnQuCisgICAgQHBhcmFtIFtpbl0gcEFwcFByaXZhdGUKKyAgICAgICAgcEFwcFByaXZhdGUgaXMgdXNlZCB0byBpbml0aWFsaXplIHRoZSBwQXBwUHJpdmF0ZSBtZW1iZXIgb2YgdGhlIAorICAgICAgICBidWZmZXIgaGVhZGVyIHN0cnVjdHVyZS4KKyAgICBAcGFyYW0gW2luXSBlZ2xJbWFnZQorICAgICAgICBlZ2xJbWFnZSBjb250YWlucyB0aGUgaGFuZGxlIG9mIHRoZSBFR0xJbWFnZSB0byB1c2UgYXMgYSBidWZmZXIgb24gdGhlCisgICAgICAgIHNwZWNpZmllZCBwb3J0LiAgVGhlIGNvbXBvbmVudCBpcyBleHBlY3RlZCB0byB2YWxpZGF0ZSBwcm9wZXJ0aWVzIG9mIAorICAgICAgICB0aGUgRUdMSW1hZ2UgYWdhaW5zdCB0aGUgY29uZmlndXJhdGlvbiBvZiB0aGUgcG9ydCB0byBlbnN1cmUgdGhlIGNvbXBvbmVudAorICAgICAgICBjYW4gdXNlIHRoZSBFR0xJbWFnZSBhcyBhIGJ1ZmZlci4gICAgICAgICAgCisgICAgQHJldHVybiBPTVhfRVJST1JUWVBFCisgICAgICAgIElmIHRoZSBjb21tYW5kIHN1Y2Nlc3NmdWxseSBleGVjdXRlcywgdGhlIHJldHVybiBjb2RlIHdpbGwgYmUKKyAgICAgICAgT01YX0Vycm9yTm9uZS4gIE90aGVyd2lzZSB0aGUgYXBwcm9wcmlhdGUgT01YIGVycm9yIHdpbGwgYmUgcmV0dXJuZWQuCisgICAgQGluZ3JvdXAgY29tcCBidWYKKyAqLworI2RlZmluZSBPTVhfVXNlRUdMSW1hZ2UoICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICBoQ29tcG9uZW50LCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICBwcEJ1ZmZlckhkciwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICBuUG9ydEluZGV4LCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICBwQXBwUHJpdmF0ZSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICBlZ2xJbWFnZSkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICgoT01YX0NPTVBPTkVOVFRZUEUqKWhDb21wb25lbnQpLT5Vc2VFR0xJbWFnZSggICAgICAgICAgXAorICAgICAgICAgICBoQ29tcG9uZW50LCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICBwcEJ1ZmZlckhkciwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICBuUG9ydEluZGV4LCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICBwQXBwUHJpdmF0ZSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICBlZ2xJbWFnZSkKKworLyoqIFRoZSBPTVhfSW5pdCBtZXRob2QgaXMgdXNlZCB0byBpbml0aWFsaXplIHRoZSBPTVggY29yZS4gIEl0IHNoYWxsIGJlIHRoZQorICAgIGZpcnN0IGNhbGwgbWFkZSBpbnRvIE9NWCBhbmQgaXQgc2hvdWxkIG9ubHkgYmUgZXhlY3V0ZWQgb25lIHRpbWUgd2l0aG91dAorICAgIGFuIGludGVydmllbmluZyBPTVhfRGVpbml0IGNhbGwuICAKKyAgICAKKyAgICBUaGUgY29yZSBzaG91bGQgcmV0dXJuIGZyb20gdGhpcyBjYWxsIHdpdGhpbiAyMCBtc2VjLgorCisgICAgQHJldHVybiBPTVhfRVJST1JUWVBFCisgICAgICAgIElmIHRoZSBjb21tYW5kIHN1Y2Nlc3NmdWxseSBleGVjdXRlcywgdGhlIHJldHVybiBjb2RlIHdpbGwgYmUKKyAgICAgICAgT01YX0Vycm9yTm9uZS4gIE90aGVyd2lzZSB0aGUgYXBwcm9wcmlhdGUgT01YIGVycm9yIHdpbGwgYmUgcmV0dXJuZWQuCisgICAgQGluZ3JvdXAgY29yZQorICovCitPTVhfQVBJIE9NWF9FUlJPUlRZUEUgT01YX0FQSUVOVFJZIE9NWF9Jbml0KHZvaWQpOworCisKKy8qKiBUaGUgT01YX0RlaW5pdCBtZXRob2QgaXMgdXNlZCB0byBkZWluaXRpYWxpemUgdGhlIE9NWCBjb3JlLiAgSXQgc2hhbGwgYmUgCisgICAgdGhlIGxhc3QgY2FsbCBtYWRlIGludG8gT01YLiBJbiB0aGUgZXZlbnQgdGhhdCB0aGUgY29yZSBkZXRlcm1pbmVzIHRoYXQgCisgICAgdGhhcmUgYXJlIGNvbXBvbmVudHMgbG9hZGVkIHdoZW4gdGhpcyBjYWxsIGlzIG1hZGUsIHRoZSBjb3JlIG1heSByZXR1cm4gCisgICAgd2l0aCBhbiBlcnJvciByYXRoZXIgdGhhbiB0cnkgdG8gdW5sb2FkIHRoZSBjb21wb25lbnRzLgorICAgICAgICAKKyAgICBUaGUgY29yZSBzaG91bGQgcmV0dXJuIGZyb20gdGhpcyBjYWxsIHdpdGhpbiAyMCBtc2VjLgorICAgIAorICAgIEByZXR1cm4gT01YX0VSUk9SVFlQRQorICAgICAgICBJZiB0aGUgY29tbWFuZCBzdWNjZXNzZnVsbHkgZXhlY3V0ZXMsIHRoZSByZXR1cm4gY29kZSB3aWxsIGJlCisgICAgICAgIE9NWF9FcnJvck5vbmUuICBPdGhlcndpc2UgdGhlIGFwcHJvcHJpYXRlIE9NWCBlcnJvciB3aWxsIGJlIHJldHVybmVkLgorICAgIEBpbmdyb3VwIGNvcmUKKyAqLworT01YX0FQSSBPTVhfRVJST1JUWVBFIE9NWF9BUElFTlRSWSBPTVhfRGVpbml0KHZvaWQpOworCisKKy8qKiBUaGUgT01YX0NvbXBvbmVudE5hbWVFbnVtIG1ldGhvZCB3aWxsIGVudW1lcmF0ZSB0aHJvdWdoIGFsbCB0aGUgbmFtZXMgb2YKKyAgICByZWNvZ25pc2VkIHZhbGlkIGNvbXBvbmVudHMgaW4gdGhlIHN5c3RlbS4gVGhpcyBmdW5jdGlvbiBpcyBwcm92aWRlZAorICAgIGFzIGEgbWVhbnMgdG8gZGV0ZWN0IGFsbCB0aGUgY29tcG9uZW50cyBpbiB0aGUgc3lzdGVtIHJ1bi10aW1lLiBUaGVyZSBpcworICAgIG5vIHN0cmljdCBvcmRlcmluZyB0byB0aGUgZW51bWVyYXRpb24gb3JkZXIgb2YgY29tcG9uZW50IG5hbWVzLCBhbHRob3VnaAorICAgIGVhY2ggbmFtZSB3aWxsIG9ubHkgYmUgZW51bWVyYXRlZCBvbmNlLiAgSWYgdGhlIE9NWCBjb3JlIHN1cHBvcnRzIHJ1bi10aW1lCisgICAgaW5zdGFsbGF0aW9uIG9mIG5ldyBjb21wb25lbnRzLCBpdCBpcyBvbmx5IHJlcXVyaWVkIHRvIGRldGVjdCBuZXdseQorICAgIGluc3RhbGxlZCBjb21wb25lbnRzIHdoZW4gdGhlIGZpcnN0IGNhbGwgdG8gZW51bWVyYXRlIGNvbXBvbmVudCBuYW1lcworICAgIGlzIG1hZGUgKGkuZS4gd2hlbiBuSW5kZXggaXMgMHgwKS4KKyAgICAKKyAgICBUaGUgY29yZSBzaG91bGQgcmV0dXJuIGZyb20gdGhpcyBjYWxsIGluIDIwIG1zZWMuCisgICAgCisgICAgQHBhcmFtIFtvdXRdIGNDb21wb25lbnROYW1lCisgICAgICAgIHBvaW50ZXIgdG8gYSBudWxsIHRlcm1pbmF0ZWQgc3RyaW5nIHdpdGggdGhlIGNvbXBvbmVudCBuYW1lLiAgVGhlCisgICAgICAgIG5hbWVzIG9mIHRoZSBjb21wb25lbnRzIGFyZSBzdHJpbmdzIGxlc3MgdGhhbiAxMjcgYnl0ZXMgaW4gbGVuZ3RoCisgICAgICAgIHBsdXMgdGhlIHRyYWlsaW5nIG51bGwgZm9yIGEgbWF4aW11bSBzaXplIG9mIDEyOCBieXRlcy4gIEFuIGV4YW1wbGUgCisgICAgICAgIG9mIGEgdmFsaWQgY29tcG9uZW50IG5hbWUgaXMgIk9NWC5USS5BVURJTy5EU1AuTUlYRVJcMCIuICBOYW1lcyBhcmUgCisgICAgICAgIGFzc2lnbmVkIGJ5IHRoZSB2ZW5kb3IsIGJ1dCBzaGFsbCBzdGFydCB3aXRoICJPTVguIiBhbmQgdGhlbiBoYXZlIAorICAgICAgICB0aGUgVmVuZG9yIGRlc2lnbmF0aW9uIG5leHQuCisgICAgQHBhcmFtIFtpbl0gbk5hbWVMZW5ndGgKKyAgICAgICAgbnVtYmVyIG9mIGNoYXJhY3RlcnMgaW4gdGhlIGNDb21wb25lbnROYW1lIHN0cmluZy4gIFdpdGggYWxsIAorICAgICAgICBjb21wb25lbnQgbmFtZSBzdHJpbmdzIHJlc3RyaWN0ZWQgdG8gbGVzcyB0aGFuIDEyOCBjaGFyYWN0ZXJzIAorICAgICAgICAoaW5jbHVkaW5nIHRoZSB0cmFpbGluZyBudWxsKSBpdCBpcyByZWNvbWVuZGVkIHRoYXQgdGhlIGNhbGxlcgorICAgICAgICBwcm92aWRlIGEgaW5wdXQgc3RyaW5nIGZvciB0aGUgY0NvbXBvbmVudE5hbWUgb2YgMTI4IGNoYXJhY3RlcnMuCisgICAgQHBhcmFtIFtpbl0gbkluZGV4CisgICAgICAgIG51bWJlciBjb250YWluaW5nIHRoZSBlbnVtZXJhdGlvbiBpbmRleCBmb3IgdGhlIGNvbXBvbmVudC4gCisgICAgICAgIE11bHRpcGxlIGNhbGxzIHRvIE9NWF9Db21wb25lbnROYW1lRW51bSB3aXRoIGluY3JlYXNpbmcgdmFsdWVzCisgICAgICAgIG9mIG5JbmRleCB3aWxsIGVudW1lcmF0ZSB0aHJvdWdoIHRoZSBjb21wb25lbnQgbmFtZXMgaW4gdGhlCisgICAgICAgIHN5c3RlbSB1bnRpbCBPTVhfRXJyb3JOb01vcmUgaXMgcmV0dXJuZWQuICBUaGUgdmFsdWUgb2YgbkluZGV4CisgICAgICAgIGlzIDAgdG8gKE4tMSksIHdoZXJlIE4gaXMgdGhlIG51bWJlciBvZiB2YWxpZCBpbnN0YWxsZWQgY29tcG9uZW50cworICAgICAgICBpbiB0aGUgc3lzdGVtLgorICAgIEByZXR1cm4gT01YX0VSUk9SVFlQRQorICAgICAgICBJZiB0aGUgY29tbWFuZCBzdWNjZXNzZnVsbHkgZXhlY3V0ZXMsIHRoZSByZXR1cm4gY29kZSB3aWxsIGJlCisgICAgICAgIE9NWF9FcnJvck5vbmUuICBXaGVuIHRoZSB2YWx1ZSBvZiBuSW5kZXggZXhjZWVkcyB0aGUgbnVtYmVyIG9mIAorICAgICAgICBjb21wb25lbnRzIGluIHRoZSBzeXN0ZW0gbWludXMgMSwgT01YX0Vycm9yTm9Nb3JlIHdpbGwgYmUKKyAgICAgICAgcmV0dXJuZWQuIE90aGVyd2lzZSB0aGUgYXBwcm9wcmlhdGUgT01YIGVycm9yIHdpbGwgYmUgcmV0dXJuZWQuCisgICAgQGluZ3JvdXAgY29yZQorICovCitPTVhfQVBJIE9NWF9FUlJPUlRZUEUgT01YX0FQSUVOVFJZIE9NWF9Db21wb25lbnROYW1lRW51bSgKKyAgICBPTVhfT1VUIE9NWF9TVFJJTkcgY0NvbXBvbmVudE5hbWUsCisgICAgT01YX0lOICBPTVhfVTMyIG5OYW1lTGVuZ3RoLAorICAgIE9NWF9JTiAgT01YX1UzMiBuSW5kZXgpOworCisKKy8qKiBUaGUgT01YX0dldEhhbmRsZSBtZXRob2Qgd2lsbCBsb2NhdGUgdGhlIGNvbXBvbmVudCBzcGVjaWZpZWQgYnkgdGhlCisgICAgY29tcG9uZW50IG5hbWUgZ2l2ZW4sIGxvYWQgdGhhdCBjb21wb25lbnQgaW50byBtZW1vcnkgYW5kIHRoZW4gaW52b2tlCisgICAgdGhlIGNvbXBvbmVudCdzIG1ldGhvZHMgdG8gY3JlYXRlIGFuIGluc3RhbmNlIG9mIHRoZSBjb21wb25lbnQuICAKKyAgICAKKyAgICBUaGUgY29yZSBzaG91bGQgcmV0dXJuIGZyb20gdGhpcyBjYWxsIHdpdGhpbiAyMCBtc2VjLgorICAgIAorICAgIEBwYXJhbSBbb3V0XSBwSGFuZGxlCisgICAgICAgIHBvaW50ZXIgdG8gYW4gT01YX0hBTkRMRVRZUEUgcG9pbnRlciB0byBiZSBmaWxsZWQgaW4gYnkgdGhpcyBtZXRob2QuCisgICAgQHBhcmFtIFtpbl0gY0NvbXBvbmVudE5hbWUKKyAgICAgICAgcG9pbnRlciB0byBhIG51bGwgdGVybWluYXRlZCBzdHJpbmcgd2l0aCB0aGUgY29tcG9uZW50IG5hbWUuICBUaGUKKyAgICAgICAgbmFtZXMgb2YgdGhlIGNvbXBvbmVudHMgYXJlIHN0cmluZ3MgbGVzcyB0aGFuIDEyNyBieXRlcyBpbiBsZW5ndGgKKyAgICAgICAgcGx1cyB0aGUgdHJhaWxpbmcgbnVsbCBmb3IgYSBtYXhpbXVtIHNpemUgb2YgMTI4IGJ5dGVzLiAgQW4gZXhhbXBsZSAKKyAgICAgICAgb2YgYSB2YWxpZCBjb21wb25lbnQgbmFtZSBpcyAiT01YLlRJLkFVRElPLkRTUC5NSVhFUlwwIi4gIE5hbWVzIGFyZSAKKyAgICAgICAgYXNzaWduZWQgYnkgdGhlIHZlbmRvciwgYnV0IHNoYWxsIHN0YXJ0IHdpdGggIk9NWC4iIGFuZCB0aGVuIGhhdmUgCisgICAgICAgIHRoZSBWZW5kb3IgZGVzaWduYXRpb24gbmV4dC4KKyAgICBAcGFyYW0gW2luXSBwQXBwRGF0YQorICAgICAgICBwb2ludGVyIHRvIGFuIGFwcGxpY2F0aW9uIGRlZmluZWQgdmFsdWUgdGhhdCB3aWxsIGJlIHJldHVybmVkCisgICAgICAgIGR1cmluZyBjYWxsYmFja3Mgc28gdGhhdCB0aGUgYXBwbGljYXRpb24gY2FuIGlkZW50aWZ5IHRoZSBzb3VyY2UKKyAgICAgICAgb2YgdGhlIGNhbGxiYWNrLgorICAgIEBwYXJhbSBbaW5dIHBDYWxsQmFja3MKKyAgICAgICAgcG9pbnRlciB0byBhIE9NWF9DQUxMQkFDS1RZUEUgc3RydWN0dXJlIHRoYXQgd2lsbCBiZSBwYXNzZWQgdG8gdGhlCisgICAgICAgIGNvbXBvbmVudCB0byBpbml0aWFsaXplIGl0IHdpdGguICAKKyAgICBAcmV0dXJuIE9NWF9FUlJPUlRZUEUKKyAgICAgICAgSWYgdGhlIGNvbW1hbmQgc3VjY2Vzc2Z1bGx5IGV4ZWN1dGVzLCB0aGUgcmV0dXJuIGNvZGUgd2lsbCBiZQorICAgICAgICBPTVhfRXJyb3JOb25lLiAgT3RoZXJ3aXNlIHRoZSBhcHByb3ByaWF0ZSBPTVggZXJyb3Igd2lsbCBiZSByZXR1cm5lZC4KKyAgICBAaW5ncm91cCBjb3JlCisgKi8KK09NWF9BUEkgT01YX0VSUk9SVFlQRSBPTVhfQVBJRU5UUlkgT01YX0dldEhhbmRsZSgKKyAgICBPTVhfT1VUIE9NWF9IQU5ETEVUWVBFKiBwSGFuZGxlLCAKKyAgICBPTVhfSU4gIE9NWF9TVFJJTkcgY0NvbXBvbmVudE5hbWUsCisgICAgT01YX0lOICBPTVhfUFRSIHBBcHBEYXRhLAorICAgIE9NWF9JTiAgT01YX0NBTExCQUNLVFlQRSogcENhbGxCYWNrcyk7CisKKworLyoqIFRoZSBPTVhfRnJlZUhhbmRsZSBtZXRob2Qgd2lsbCBmcmVlIGEgaGFuZGxlIGFsbG9jYXRlZCBieSB0aGUgT01YX0dldEhhbmRsZSAKKyAgICBtZXRob2QuICBJZiB0aGUgY29tcG9uZW50IHJlZmVyZW5jZSBjb3VudCBnb2VzIHRvIHplcm8sIHRoZSBjb21wb25lbnQgd2lsbAorICAgIGJlIHVubG9hZGVkIGZyb20gbWVtb3J5LiAgCisgICAgCisgICAgVGhlIGNvcmUgc2hvdWxkIHJldHVybiBmcm9tIHRoaXMgY2FsbCB3aXRoaW4gMjAgbXNlYyB3aGVuIHRoZSBjb21wb25lbnQgaXMgCisgICAgaW4gdGhlIE9NWF9TdGF0ZUxvYWRlZCBzdGF0ZS4KKworICAgIEBwYXJhbSBbaW5dIGhDb21wb25lbnQKKyAgICAgICAgSGFuZGxlIG9mIHRoZSBjb21wb25lbnQgdG8gYmUgYWNjZXNzZWQuICBUaGlzIGlzIHRoZSBjb21wb25lbnQKKyAgICAgICAgaGFuZGxlIHJldHVybmVkIGJ5IHRoZSBjYWxsIHRvIHRoZSBHZXRIYW5kbGUgZnVuY3Rpb24uCisgICAgQHJldHVybiBPTVhfRVJST1JUWVBFCisgICAgICAgIElmIHRoZSBjb21tYW5kIHN1Y2Nlc3NmdWxseSBleGVjdXRlcywgdGhlIHJldHVybiBjb2RlIHdpbGwgYmUKKyAgICAgICAgT01YX0Vycm9yTm9uZS4gIE90aGVyd2lzZSB0aGUgYXBwcm9wcmlhdGUgT01YIGVycm9yIHdpbGwgYmUgcmV0dXJuZWQuCisgICAgQGluZ3JvdXAgY29yZQorICovCitPTVhfQVBJIE9NWF9FUlJPUlRZUEUgT01YX0FQSUVOVFJZIE9NWF9GcmVlSGFuZGxlKAorICAgIE9NWF9JTiAgT01YX0hBTkRMRVRZUEUgaENvbXBvbmVudCk7CisKKworCisvKiogVGhlIE9NWF9TZXR1cFR1bm5lbCBtZXRob2Qgd2lsbCBoYW5kbGUgdGhlIG5lY2Vzc2FyeSBjYWxscyB0byB0aGUgY29tcG9uZW50cworICAgIHRvIHNldHVwIHRoZSBzcGVjaWZpZWQgdHVubmVsIHRoZSB0d28gY29tcG9uZW50cy4gIE5PVEU6IFRoaXMgaXMKKyAgICBhbiBhY3R1YWwgbWV0aG9kIChub3QgYSAjZGVmaW5lIG1hY3JvKS4gIFRoaXMgbWV0aG9kIHdpbGwgbWFrZSBjYWxscyBpbnRvCisgICAgdGhlIGNvbXBvbmVudCBDb21wb25lbnRUdW5uZWxSZXF1ZXN0IG1ldGhvZCB0byBkbyB0aGUgYWN0dWFsIHR1bm5lbCAKKyAgICBjb25uZWN0aW9uLiAgCisKKyAgICBUaGUgQ29tcG9uZW50VHVubmVsUmVxdWVzdCBtZXRob2Qgb24gYm90aCBjb21wb25lbnRzIHdpbGwgYmUgY2FsbGVkLiAKKyAgICBUaGlzIG1ldGhvZCBzaGFsbCBub3QgYmUgY2FsbGVkIHVubGVzcyB0aGUgY29tcG9uZW50IGlzIGluIHRoZSAKKyAgICBPTVhfU3RhdGVMb2FkZWQgc3RhdGUgZXhjZXB0IHdoZW4gdGhlIHBvcnRzIHVzZWQgZm9yIHRoZSB0dW5uZWwgYXJlCisgICAgZGlzYWJsZWQuIEluIHRoaXMgY2FzZSwgdGhlIGNvbXBvbmVudCBtYXkgYmUgaW4gdGhlIE9NWF9TdGF0ZUV4ZWN1dGluZywKKyAgICBPTVhfU3RhdGVQYXVzZSwgb3IgT01YX1N0YXRlSWRsZSBzdGF0ZXMuIAorCisgICAgVGhlIGNvcmUgc2hvdWxkIHJldHVybiBmcm9tIHRoaXMgY2FsbCB3aXRoaW4gMjAgbXNlYy4KKyAgICAKKyAgICBAcGFyYW0gW2luXSBoT3V0cHV0CisgICAgICAgIEhhbmRsZSBvZiB0aGUgY29tcG9uZW50IHRvIGJlIGFjY2Vzc2VkLiAgQWxzbyB0aGlzIGlzIHRoZSBoYW5kbGUKKyAgICAgICAgb2YgdGhlIGNvbXBvbmVudCB3aG9zZSBwb3J0LCBzcGVjaWZpZWQgaW4gdGhlIG5Qb3J0T3V0cHV0IHBhcmFtZXRlcgorICAgICAgICB3aWxsIGJlIHVzZWQgdGhlIHNvdXJjZSBmb3IgdGhlIHR1bm5lbC4gVGhpcyBpcyB0aGUgY29tcG9uZW50IGhhbmRsZQorICAgICAgICByZXR1cm5lZCBieSB0aGUgY2FsbCB0byB0aGUgT01YX0dldEhhbmRsZSBmdW5jdGlvbi4gIFRoZXJlIGlzIGEgCisgICAgICAgIHJlcXVpcmVtZW50IHRoYXQgaE91dHB1dCBiZSB0aGUgc291cmNlIGZvciB0aGUgZGF0YSB3aGVuCisgICAgICAgIHR1bmVsbGluZyAoaS5lLiBuUG9ydE91dHB1dCBpcyBhbiBvdXRwdXQgcG9ydCkuICBJZiAweDAsIHRoZSBjb21wb25lbnQKKyAgICAgICAgc3BlY2lmaWVkIGluIGhJbnB1dCB3aWxsIGhhdmUgaXQncyBwb3J0IHNwZWNpZmllZCBpbiBuUG9ydElucHV0CisgICAgICAgIHNldHVwIGZvciBjb21tdW5pY2F0aW9uIHdpdGggdGhlIGFwcGxpY2F0aW9uIC8gSUwgY2xpZW50LgorICAgIEBwYXJhbSBbaW5dIG5Qb3J0T3V0cHV0CisgICAgICAgIG5Qb3J0T3V0cHV0IGlzIHVzZWQgdG8gc2VsZWN0IHRoZSBzb3VyY2UgcG9ydCBvbiBjb21wb25lbnQgdG8gYmUKKyAgICAgICAgdXNlZCBpbiB0aGUgdHVubmVsLiAKKyAgICBAcGFyYW0gW2luXSBoSW5wdXQKKyAgICAgICAgVGhpcyBpcyB0aGUgY29tcG9uZW50IHRvIHNldHVwIHRoZSB0dW5uZWwgd2l0aC4gVGhpcyBpcyB0aGUgaGFuZGxlCisgICAgICAgIG9mIHRoZSBjb21wb25lbnQgd2hvc2UgcG9ydCwgc3BlY2lmaWVkIGluIHRoZSBuUG9ydElucHV0IHBhcmFtZXRlcgorICAgICAgICB3aWxsIGJlIHVzZWQgdGhlIGRlc3RpbmF0aW9uIGZvciB0aGUgdHVubmVsLiBUaGlzIGlzIHRoZSBjb21wb25lbnQgaGFuZGxlCisgICAgICAgIHJldHVybmVkIGJ5IHRoZSBjYWxsIHRvIHRoZSBPTVhfR2V0SGFuZGxlIGZ1bmN0aW9uLiAgVGhlcmUgaXMgYSAKKyAgICAgICAgcmVxdWlyZW1lbnQgdGhhdCBoSW5wdXQgYmUgdGhlIGRlc3RpbmF0aW9uIGZvciB0aGUgZGF0YSB3aGVuCisgICAgICAgIHR1bmVsbGluZyAoaS5lLiBuUG9ydEludXQgaXMgYW4gaW5wdXQgcG9ydCkuICAgSWYgMHgwLCB0aGUgY29tcG9uZW50CisgICAgICAgIHNwZWNpZmllZCBpbiBoT3V0cHV0IHdpbGwgaGF2ZSBpdCdzIHBvcnQgc3BlY2lmaWVkIGluIG5Qb3J0UE91dHB1dAorICAgICAgICBzZXR1cCBmb3IgY29tbXVuaWNhdGlvbiB3aXRoIHRoZSBhcHBsaWNhdGlvbiAvIElMIGNsaWVudC4KKyAgICBAcGFyYW0gW2luXSBuUG9ydElucHV0CisgICAgICAgIG5Qb3J0SW5wdXQgaXMgdXNlZCB0byBzZWxlY3QgdGhlIGRlc3RpbmF0aW9uIHBvcnQgb24gY29tcG9uZW50IHRvIGJlCisgICAgICAgIHVzZWQgaW4gdGhlIHR1bm5lbC4KKyAgICBAcmV0dXJuIE9NWF9FUlJPUlRZUEUKKyAgICAgICAgSWYgdGhlIGNvbW1hbmQgc3VjY2Vzc2Z1bGx5IGV4ZWN1dGVzLCB0aGUgcmV0dXJuIGNvZGUgd2lsbCBiZQorICAgICAgICBPTVhfRXJyb3JOb25lLiAgT3RoZXJ3aXNlIHRoZSBhcHByb3ByaWF0ZSBPTVggZXJyb3Igd2lsbCBiZSByZXR1cm5lZC4KKyAgICAgICAgV2hlbiBPTVhfRXJyb3JOb3RJbXBsZW1lbnRlZCBpcyByZXR1cm5lZCwgb25lIG9yIGJvdGggY29tcG9uZW50cyBpcyAKKyAgICAgICAgYSBub24taW50ZXJvcCBjb21wb25lbnQgYW5kIGRvZXMgbm90IHN1cHBvcnQgdHVubmVsaW5nLgorICAgICAgICAKKyAgICAgICAgT24gZmFpbHVyZSwgdGhlIHBvcnRzIG9mIGJvdGggY29tcG9uZW50cyBhcmUgc2V0dXAgZm9yIGNvbW11bmljYXRpb24KKyAgICAgICAgd2l0aCB0aGUgYXBwbGljYXRpb24gLyBJTCBDbGllbnQuCisgICAgQGluZ3JvdXAgY29yZSB0dW4KKyAqLworT01YX0FQSSBPTVhfRVJST1JUWVBFIE9NWF9BUElFTlRSWSBPTVhfU2V0dXBUdW5uZWwoCisgICAgT01YX0lOICBPTVhfSEFORExFVFlQRSBoT3V0cHV0LAorICAgIE9NWF9JTiAgT01YX1UzMiBuUG9ydE91dHB1dCwKKyAgICBPTVhfSU4gIE9NWF9IQU5ETEVUWVBFIGhJbnB1dCwKKyAgICBPTVhfSU4gIE9NWF9VMzIgblBvcnRJbnB1dCk7CisgICAgCisvKiogQGluZ3JvdXAgY3AgKi8KK09NWF9BUEkgT01YX0VSUk9SVFlQRSAgIE9NWF9HZXRDb250ZW50UGlwZSgKKyAgICBPTVhfT1VUIE9NWF9IQU5ETEVUWVBFICpoUGlwZSwKKyAgICBPTVhfSU4gT01YX1NUUklORyBzelVSSSk7CisKKy8qKiBUaGUgT01YX0dldENvbXBvbmVudHNPZlJvbGUgbWV0aG9kIHdpbGwgcmV0dXJuIHRoZSBudW1iZXIgb2YgY29tcG9uZW50cyB0aGF0IHN1cHBvcnQgdGhlIGdpdmVuCisgICAgcm9sZSBhbmQgKGlmIHRoZSBjb21wTmFtZXMgZmllbGQgaXMgbm9uLU5VTEwpIHRoZSBuYW1lcyBvZiB0aG9zZSBjb21wb25lbnRzLiBUaGUgY2FsbCB3aWxsIGZhaWwgaWYgCisgICAgYW4gaW5zdWZmaWNpZW50bHkgc2l6ZWQgYXJyYXkgb2YgbmFtZXMgaXMgc3VwcGxpZWQuIFRvIGVuc3VyZSB0aGUgYXJyYXkgaXMgc3VmZmljaWVudGx5IHNpemVkIHRoZQorICAgIGNsaWVudCBzaG91bGQ6CisgICAgICAgICogZmlyc3QgY2FsbCB0aGlzIGZ1bmN0aW9uIHdpdGggdGhlIGNvbXBOYW1lcyBmaWVsZCBOVUxMIHRvIGRldGVybWluZSB0aGUgbnVtYmVyIG9mIGNvbXBvbmVudCBuYW1lcworICAgICAgICAqIHNlY29uZCBjYWxsIHRoaXMgZnVuY3Rpb24gd2l0aCB0aGUgY29tcE5hbWVzIGZpZWxkIHBvaW50aW5nIHRvIGFuIGFycmF5IG9mIG5hbWVzIGFsbG9jYXRlZCAKKyAgICAgICAgICBhY2NvcmRpbmcgdG8gdGhlIG51bWJlciByZXR1cm5lZCBieSB0aGUgZmlyc3QgY2FsbC4KKworICAgIFRoZSBjb3JlIHNob3VsZCByZXR1cm4gZnJvbSB0aGlzIGNhbGwgd2l0aGluIDUgbXNlYy4KKyAgICAKKyAgICBAcGFyYW0gW2luXSByb2xlCisgICAgICAgIFRoaXMgaXMgZ2VuZXJpYyBzdGFuZGFyZCBjb21wb25lbnQgbmFtZSBjb25zaXN0aW5nIG9ubHkgb2YgY29tcG9uZW50IGNsYXNzIAorICAgICAgICBuYW1lIGFuZCB0aGUgdHlwZSB3aXRoaW4gdGhhdCBjbGFzcyAoZS5nLiAnYXVkaW9fZGVjb2Rlci5hYWMnKS4KKyAgICBAcGFyYW0gW2lub3V0XSBwTnVtQ29tcHMKKyAgICAgICAgVGhpcyBpcyB1c2VkIGJvdGggYXMgaW5wdXQgYW5kIG91dHB1dC4gCisgCisgICAgICAgIElmIGNvbXBOYW1lcyBpcyBOVUxMLCB0aGUgaW5wdXQgaXMgaWdub3JlZCBhbmQgdGhlIG91dHB1dCBzcGVjaWZpZXMgaG93IG1hbnkgY29tcG9uZW50cyBzdXBwb3J0CisgICAgICAgIHRoZSBnaXZlbiByb2xlLgorICAgICAKKyAgICAgICAgSWYgY29tcE5hbWVzIGlzIG5vdCBOVUxMLCBvbiBpbnB1dCBpdCBib3VuZHMgdGhlIHNpemUgb2YgdGhlIGlucHV0IHN0cnVjdHVyZSBhbmQgCisgICAgICAgIG9uIG91dHB1dCwgaXQgc3BlY2lmaWVzIHRoZSBudW1iZXIgb2YgY29tcG9uZW50cyBzdHJpbmcgbmFtZXMgbGlzdGVkIHdpdGhpbiB0aGUgY29tcE5hbWVzIHBhcmFtZXRlci4KKyAgICBAcGFyYW0gW2lub3V0XSBjb21wTmFtZXMKKyAgICAgICAgSWYgTlVMTCB0aGlzIGZpZWxkIGlzIGlnbm9yZWQuIElmIG5vbi1OVUxMIHRoaXMgcG9pbnRzIHRvIGFuIGFycmF5IG9mIDEyOC1ieXRlIHN0cmluZ3Mgd2hpY2ggYWNjZXB0cyAKKyAgICAgICAgYSBsaXN0IG9mIHRoZSBuYW1lcyBvZiBhbGwgcGh5c2ljYWwgY29tcG9uZW50cyB0aGF0IGltcGxlbWVudCB0aGUgc3BlY2lmaWVkIHN0YW5kYXJkIGNvbXBvbmVudCBuYW1lLiAKKyAgICAgICAgRWFjaCBuYW1lIGlzIE5VTEwgdGVybWluYXRlZC4gbnVtQ29tcHMgaW5kaWNhdGVzIHRoZSBudW1iZXIgb2YgbmFtZXMuCisgICAgQGluZ3JvdXAgY29yZQorICovCitPTVhfQVBJIE9NWF9FUlJPUlRZUEUgT01YX0dldENvbXBvbmVudHNPZlJvbGUgKCAKKwlPTVhfSU4gICAgICBPTVhfU1RSSU5HIHJvbGUsCisgICAgT01YX0lOT1VUICAgT01YX1UzMiAqcE51bUNvbXBzLAorICAgIE9NWF9JTk9VVCAgIE9NWF9VOCAgKipjb21wTmFtZXMpOworCisvKiogVGhlIE9NWF9HZXRSb2xlc09mQ29tcG9uZW50IG1ldGhvZCB3aWxsIHJldHVybiB0aGUgbnVtYmVyIG9mIHJvbGVzIHN1cHBvcnRlZCBieSB0aGUgZ2l2ZW4KKyAgICBjb21wb25lbnQgYW5kIChpZiB0aGUgcm9sZXMgZmllbGQgaXMgbm9uLU5VTEwpIHRoZSBuYW1lcyBvZiB0aG9zZSByb2xlcy4gVGhlIGNhbGwgd2lsbCBmYWlsIGlmIAorICAgIGFuIGluc3VmZmljaWVudGx5IHNpemVkIGFycmF5IG9mIG5hbWVzIGlzIHN1cHBsaWVkLiBUbyBlbnN1cmUgdGhlIGFycmF5IGlzIHN1ZmZpY2llbnRseSBzaXplZCB0aGUKKyAgICBjbGllbnQgc2hvdWxkOgorICAgICAgICAqIGZpcnN0IGNhbGwgdGhpcyBmdW5jdGlvbiB3aXRoIHRoZSByb2xlcyBmaWVsZCBOVUxMIHRvIGRldGVybWluZSB0aGUgbnVtYmVyIG9mIHJvbGUgbmFtZXMKKyAgICAgICAgKiBzZWNvbmQgY2FsbCB0aGlzIGZ1bmN0aW9uIHdpdGggdGhlIHJvbGVzIGZpZWxkIHBvaW50aW5nIHRvIGFuIGFycmF5IG9mIG5hbWVzIGFsbG9jYXRlZCAKKyAgICAgICAgICBhY2NvcmRpbmcgdG8gdGhlIG51bWJlciByZXR1cm5lZCBieSB0aGUgZmlyc3QgY2FsbC4KKworICAgIFRoZSBjb3JlIHNob3VsZCByZXR1cm4gZnJvbSB0aGlzIGNhbGwgd2l0aGluIDUgbXNlYy4KKworICAgIEBwYXJhbSBbaW5dIGNvbXBOYW1lCisgICAgICAgIFRoaXMgaXMgdGhlIG5hbWUgb2YgdGhlIGNvbXBvbmVudCBiZWluZyBxdWVyaWVkIGFib3V0LgorICAgIEBwYXJhbSBbaW5vdXRdIHBOdW1Sb2xlcworICAgICAgICBUaGlzIGlzIHVzZWQgYm90aCBhcyBpbnB1dCBhbmQgb3V0cHV0LiAKKyAKKyAgICAgICAgSWYgcm9sZXMgaXMgTlVMTCwgdGhlIGlucHV0IGlzIGlnbm9yZWQgYW5kIHRoZSBvdXRwdXQgc3BlY2lmaWVzIGhvdyBtYW55IHJvbGVzIHRoZSBjb21wb25lbnQgc3VwcG9ydHMuCisgICAgIAorICAgICAgICBJZiBjb21wTmFtZXMgaXMgbm90IE5VTEwsIG9uIGlucHV0IGl0IGJvdW5kcyB0aGUgc2l6ZSBvZiB0aGUgaW5wdXQgc3RydWN0dXJlIGFuZCAKKyAgICAgICAgb24gb3V0cHV0LCBpdCBzcGVjaWZpZXMgdGhlIG51bWJlciBvZiByb2xlcyBzdHJpbmcgbmFtZXMgbGlzdGVkIHdpdGhpbiB0aGUgcm9sZXMgcGFyYW1ldGVyLgorICAgIEBwYXJhbSBbb3V0XSByb2xlcworICAgICAgICBJZiBOVUxMIHRoaXMgZmllbGQgaXMgaWdub3JlZC4gSWYgbm9uLU5VTEwgdGhpcyBwb2ludHMgdG8gYW4gYXJyYXkgb2YgMTI4LWJ5dGUgc3RyaW5ncyAKKyAgICAgICAgd2hpY2ggYWNjZXB0cyBhIGxpc3Qgb2YgdGhlIG5hbWVzIG9mIGFsbCBzdGFuZGFyZCBjb21wb25lbnRzIHJvbGVzIGltcGxlbWVudGVkIG9uIHRoZSAKKyAgICAgICAgc3BlY2lmaWVkIGNvbXBvbmVudCBuYW1lLiBudW1Db21wcyBpbmRpY2F0ZXMgdGhlIG51bWJlciBvZiBuYW1lcy4KKyAgICBAaW5ncm91cCBjb3JlCisgKi8KK09NWF9BUEkgT01YX0VSUk9SVFlQRSBPTVhfR2V0Um9sZXNPZkNvbXBvbmVudCAoIAorCU9NWF9JTiAgICAgIE9NWF9TVFJJTkcgY29tcE5hbWUsIAorICAgIE9NWF9JTk9VVCAgIE9NWF9VMzIgKnBOdW1Sb2xlcywKKyAgICBPTVhfT1VUICAgICBPTVhfVTggKipyb2xlcyk7CisKKyNpZmRlZiBfX2NwbHVzcGx1cworfQorI2VuZGlmIC8qIF9fY3BsdXNwbHVzICovCisKKyNlbmRpZgorLyogRmlsZSBFT0YgKi8KKwpkaWZmIC0tZ2l0IGEvZXh5bm9zNC9tdWx0aW1lZGlhL29wZW5tYXgvc2VjX29teC9pbmNsdWRlL2tocm9ub3MvT01YX0lWQ29tbW9uLmggYi9leHlub3M0L211bHRpbWVkaWEvb3Blbm1heC9zZWNfb214L2luY2x1ZGUva2hyb25vcy9PTVhfSVZDb21tb24uaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40YzQ5OTVjCi0tLSAvZGV2L251bGwKKysrIGIvZXh5bm9zNC9tdWx0aW1lZGlhL29wZW5tYXgvc2VjX29teC9pbmNsdWRlL2tocm9ub3MvT01YX0lWQ29tbW9uLmgKQEAgLTAsMCArMSw5MjAgQEAKKy8qKgorICogQ29weXJpZ2h0IChjKSAyMDA4IFRoZSBLaHJvbm9zIEdyb3VwIEluYy4gCisgKiAKKyAqIFBlcm1pc3Npb24gaXMgaGVyZWJ5IGdyYW50ZWQsIGZyZWUgb2YgY2hhcmdlLCB0byBhbnkgcGVyc29uIG9idGFpbmluZworICogYSBjb3B5IG9mIHRoaXMgc29mdHdhcmUgYW5kIGFzc29jaWF0ZWQgZG9jdW1lbnRhdGlvbiBmaWxlcyAodGhlCisgKiAiU29mdHdhcmUiKSwgdG8gZGVhbCBpbiB0aGUgU29mdHdhcmUgd2l0aG91dCByZXN0cmljdGlvbiwgaW5jbHVkaW5nCisgKiB3aXRob3V0IGxpbWl0YXRpb24gdGhlIHJpZ2h0cyB0byB1c2UsIGNvcHksIG1vZGlmeSwgbWVyZ2UsIHB1Ymxpc2gsCisgKiBkaXN0cmlidXRlLCBzdWJsaWNlbnNlLCBhbmQvb3Igc2VsbCBjb3BpZXMgb2YgdGhlIFNvZnR3YXJlLCBhbmQgdG8KKyAqIHBlcm1pdCBwZXJzb25zIHRvIHdob20gdGhlIFNvZnR3YXJlIGlzIGZ1cm5pc2hlZCB0byBkbyBzbywgc3ViamVjdAorICogdG8gdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOiAKKyAqIFRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIHNoYWxsIGJlIGluY2x1ZGVkCisgKiBpbiBhbGwgY29waWVzIG9yIHN1YnN0YW50aWFsIHBvcnRpb25zIG9mIHRoZSBTb2Z0d2FyZS4gCisgKiAKKyAqIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBFWFBSRVNTCisgKiBPUiBJTVBMSUVELCBJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPIFRIRSBXQVJSQU5USUVTIE9GCisgKiBNRVJDSEFOVEFCSUxJVFksIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORCBOT05JTkZSSU5HRU1FTlQuCisgKiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SUyBPUiBDT1BZUklHSFQgSE9MREVSUyBCRSBMSUFCTEUgRk9SIEFOWQorICogQ0xBSU0sIERBTUFHRVMgT1IgT1RIRVIgTElBQklMSVRZLCBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwKKyAqIFRPUlQgT1IgT1RIRVJXSVNFLCBBUklTSU5HIEZST00sIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFCisgKiBTT0ZUV0FSRSBPUiBUSEUgVVNFIE9SIE9USEVSIERFQUxJTkdTIElOIFRIRSBTT0ZUV0FSRS4gCisgKgorICovCisKKy8qKiAKKyAqIEBmaWxlIE9NWF9JVkNvbW1vbi5oIC0gT3Blbk1heCBJTCB2ZXJzaW9uIDEuMS4yCisgKiAgVGhlIHN0cnVjdHVyZXMgbmVlZGVkIGJ5IFZpZGVvIGFuZCBJbWFnZSBjb21wb25lbnRzIHRvIGV4Y2hhbmdlCisgKiAgcGFyYW1ldGVycyBhbmQgY29uZmlndXJhdGlvbiBkYXRhIHdpdGggdGhlIGNvbXBvbmVudHMuCisgKi8KKyNpZm5kZWYgT01YX0lWQ29tbW9uX2gKKyNkZWZpbmUgT01YX0lWQ29tbW9uX2gKKworI2lmZGVmIF9fY3BsdXNwbHVzCitleHRlcm4gIkMiIHsKKyNlbmRpZiAvKiBfX2NwbHVzcGx1cyAqLworCisvKioKKyAqIEVhY2ggT01YIGhlYWRlciBtdXN0IGluY2x1ZGUgYWxsIHJlcXVpcmVkIGhlYWRlciBmaWxlcyB0byBhbGxvdyB0aGUgaGVhZGVyCisgKiB0byBjb21waWxlIHdpdGhvdXQgZXJyb3JzLiAgVGhlIGluY2x1ZGVzIGJlbG93IGFyZSByZXF1aXJlZCBmb3IgdGhpcyBoZWFkZXIKKyAqIGZpbGUgdG8gY29tcGlsZSBzdWNjZXNzZnVsbHkgCisgKi8KKworI2luY2x1ZGUgPE9NWF9Db3JlLmg+CisKKy8qKiBAZGVmZ3JvdXAgaXYgT3Blbk1BWCBJTCBJbWFnaW5nIGFuZCBWaWRlbyBEb21haW4KKyAqIENvbW1vbiBzdHJ1Y3R1cmVzIGZvciBPcGVuTUFYIElMIEltYWdpbmcgYW5kIFZpZGVvIGRvbWFpbnMKKyAqIEB7CisgKi8KKworCisvKiogCisgKiBFbnVtZXJhdGlvbiBkZWZpbmluZyBwb3NzaWJsZSB1bmNvbXByZXNzZWQgaW1hZ2UvdmlkZW8gZm9ybWF0cy4gCisgKgorICogRU5VTVM6CisgKiAgVW51c2VkICAgICAgICAgICAgICAgICA6IFBsYWNlaG9sZGVyIHZhbHVlIHdoZW4gZm9ybWF0IGlzIE4vQQorICogIE1vbm9jaHJvbWUgICAgICAgICAgICAgOiBibGFjayBhbmQgd2hpdGUKKyAqICA4Yml0UkdCMzMyICAgICAgICAgICAgIDogUmVkIDc6NSwgR3JlZW4gNDoyLCBCbHVlIDE6MAorICogIDEyYml0UkdCNDQ0ICAgICAgICAgICAgOiBSZWQgMTE6OCwgR3JlZW4gNzo0LCBCbHVlIDM6MAorICogIDE2Yml0QVJHQjQ0NDQgICAgICAgICAgOiBBbHBoYSAxNToxMiwgUmVkIDExOjgsIEdyZWVuIDc6NCwgQmx1ZSAzOjAKKyAqICAxNmJpdEFSR0IxNTU1ICAgICAgICAgIDogQWxwaGEgMTUsIFJlZCAxNDoxMCwgR3JlZW4gOTo1LCBCbHVlIDQ6MAorICogIDE2Yml0UkdCNTY1ICAgICAgICAgICAgOiBSZWQgMTU6MTEsIEdyZWVuIDEwOjUsIEJsdWUgNDowCisgKiAgMTZiaXRCR1I1NjUgICAgICAgICAgICA6IEJsdWUgMTU6MTEsIEdyZWVuIDEwOjUsIFJlZCA0OjAKKyAqICAxOGJpdFJHQjY2NiAgICAgICAgICAgIDogUmVkIDE3OjEyLCBHcmVlbiAxMTo2LCBCbHVlIDU6MAorICogIDE4Yml0QVJHQjE2NjUgICAgICAgICAgOiBBbHBoYSAxNywgUmVkIDE2OjExLCBHcmVlbiAxMDo1LCBCbHVlIDQ6MAorICogIDE5Yml0QVJHQjE2NjYgICAgICAgICAgOiBBbHBoYSAxOCwgUmVkIDE3OjEyLCBHcmVlbiAxMTo2LCBCbHVlIDU6MAorICogIDI0Yml0UkdCODg4ICAgICAgICAgICAgOiBSZWQgMjQ6MTYsIEdyZWVuIDE1OjgsIEJsdWUgNzowCisgKiAgMjRiaXRCR1I4ODggICAgICAgICAgICA6IEJsdWUgMjQ6MTYsIEdyZWVuIDE1OjgsIFJlZCA3OjAKKyAqICAyNGJpdEFSR0IxODg3ICAgICAgICAgIDogQWxwaGEgMjMsIFJlZCAyMjoxNSwgR3JlZW4gMTQ6NywgQmx1ZSA2OjAKKyAqICAyNWJpdEFSR0IxODg4ICAgICAgICAgIDogQWxwaGEgMjQsIFJlZCAyMzoxNiwgR3JlZW4gMTU6OCwgQmx1ZSA3OjAKKyAqICAzMmJpdEJHUkE4ODg4ICAgICAgICAgIDogQmx1ZSAzMToyNCwgR3JlZW4gMjM6MTYsIFJlZCAxNTo4LCBBbHBoYSA3OjAKKyAqICAzMmJpdEFSR0I4ODg4ICAgICAgICAgIDogQWxwaGEgMzE6MjQsIFJlZCAyMzoxNiwgR3JlZW4gMTU6OCwgQmx1ZSA3OjAKKyAqICBZVVY0MTFQbGFuYXIgICAgICAgICAgIDogVSxZIGFyZSBzdWJzYW1wbGVkIGJ5IGEgZmFjdG9yIG9mIDQgaG9yaXpvbnRhbGx5CisgKiAgWVVWNDExUGFja2VkUGxhbmFyICAgICA6IHBhY2tlZCBwZXIgcGF5bG9hZCBpbiBwbGFuYXIgc2xpY2VzCisgKiAgWVVWNDIwUGxhbmFyICAgICAgICAgICA6IFRocmVlIGFycmF5cyBZLFUsVi4KKyAqICBZVVY0MjBQYWNrZWRQbGFuYXIgICAgIDogcGFja2VkIHBlciBwYXlsb2FkIGluIHBsYW5hciBzbGljZXMKKyAqICBZVVY0MjBTZW1pUGxhbmFyICAgICAgIDogVHdvIGFycmF5cywgb25lIGlzIGFsbCBZLCB0aGUgb3RoZXIgaXMgVSBhbmQgVgorICogIFlVVjQyMlBsYW5hciAgICAgICAgICAgOiBUaHJlZSBhcnJheXMgWSxVLFYuCisgKiAgWVVWNDIyUGFja2VkUGxhbmFyICAgICA6IHBhY2tlZCBwZXIgcGF5bG9hZCBpbiBwbGFuYXIgc2xpY2VzCisgKiAgWVVWNDIyU2VtaVBsYW5hciAgICAgICA6IFR3byBhcnJheXMsIG9uZSBpcyBhbGwgWSwgdGhlIG90aGVyIGlzIFUgYW5kIFYKKyAqICBZQ2JZQ3IgICAgICAgICAgICAgICAgIDogT3JnYW5pemVkIGFzIDE2Yml0IFlVWVYgKGkuZS4gWUNiWUNyKQorICogIFlDcllDYiAgICAgICAgICAgICAgICAgOiBPcmdhbml6ZWQgYXMgMTZiaXQgWVZZVSAoaS5lLiBZQ3JZQ2IpCisgKiAgQ2JZQ3JZICAgICAgICAgICAgICAgICA6IE9yZ2FuaXplZCBhcyAxNmJpdCBVWVZZIChpLmUuIENiWUNyWSkKKyAqICBDcllDYlkgICAgICAgICAgICAgICAgIDogT3JnYW5pemVkIGFzIDE2Yml0IFZZVVkgKGkuZS4gQ3JZQ2JZKQorICogIFlVVjQ0NEludGVybGVhdmVkICAgICAgOiBFYWNoIHBpeGVsIGNvbnRhaW5zIGVxdWFsIHBhcnRzIFlVVgorICogIFJhd0JheWVyOGJpdCAgICAgICAgICAgOiBTTUlBIGNhbWVyYSBvdXRwdXQgZm9ybWF0CisgKiAgUmF3QmF5ZXIxMGJpdCAgICAgICAgICA6IFNNSUEgY2FtZXJhIG91dHB1dCBmb3JtYXQKKyAqICBSYXdCYXllcjhiaXRjb21wcmVzc2VkIDogU01JQSBjYW1lcmEgb3V0cHV0IGZvcm1hdAorICovCit0eXBlZGVmIGVudW0gT01YX0NPTE9SX0ZPUk1BVFRZUEUgeworICAgIE9NWF9DT0xPUl9Gb3JtYXRVbnVzZWQsCisgICAgT01YX0NPTE9SX0Zvcm1hdE1vbm9jaHJvbWUsCisgICAgT01YX0NPTE9SX0Zvcm1hdDhiaXRSR0IzMzIsCisgICAgT01YX0NPTE9SX0Zvcm1hdDEyYml0UkdCNDQ0LAorICAgIE9NWF9DT0xPUl9Gb3JtYXQxNmJpdEFSR0I0NDQ0LAorICAgIE9NWF9DT0xPUl9Gb3JtYXQxNmJpdEFSR0IxNTU1LAorICAgIE9NWF9DT0xPUl9Gb3JtYXQxNmJpdFJHQjU2NSwKKyAgICBPTVhfQ09MT1JfRm9ybWF0MTZiaXRCR1I1NjUsCisgICAgT01YX0NPTE9SX0Zvcm1hdDE4Yml0UkdCNjY2LAorICAgIE9NWF9DT0xPUl9Gb3JtYXQxOGJpdEFSR0IxNjY1LAorICAgIE9NWF9DT0xPUl9Gb3JtYXQxOWJpdEFSR0IxNjY2LCAKKyAgICBPTVhfQ09MT1JfRm9ybWF0MjRiaXRSR0I4ODgsCisgICAgT01YX0NPTE9SX0Zvcm1hdDI0Yml0QkdSODg4LAorICAgIE9NWF9DT0xPUl9Gb3JtYXQyNGJpdEFSR0IxODg3LAorICAgIE9NWF9DT0xPUl9Gb3JtYXQyNWJpdEFSR0IxODg4LAorICAgIE9NWF9DT0xPUl9Gb3JtYXQzMmJpdEJHUkE4ODg4LAorICAgIE9NWF9DT0xPUl9Gb3JtYXQzMmJpdEFSR0I4ODg4LAorICAgIE9NWF9DT0xPUl9Gb3JtYXRZVVY0MTFQbGFuYXIsCisgICAgT01YX0NPTE9SX0Zvcm1hdFlVVjQxMVBhY2tlZFBsYW5hciwKKyAgICBPTVhfQ09MT1JfRm9ybWF0WVVWNDIwUGxhbmFyLAorICAgIE9NWF9DT0xPUl9Gb3JtYXRZVVY0MjBQYWNrZWRQbGFuYXIsCisgICAgT01YX0NPTE9SX0Zvcm1hdFlVVjQyMFNlbWlQbGFuYXIsCisgICAgT01YX0NPTE9SX0Zvcm1hdFlVVjQyMlBsYW5hciwKKyAgICBPTVhfQ09MT1JfRm9ybWF0WVVWNDIyUGFja2VkUGxhbmFyLAorICAgIE9NWF9DT0xPUl9Gb3JtYXRZVVY0MjJTZW1pUGxhbmFyLAorICAgIE9NWF9DT0xPUl9Gb3JtYXRZQ2JZQ3IsCisgICAgT01YX0NPTE9SX0Zvcm1hdFlDcllDYiwKKyAgICBPTVhfQ09MT1JfRm9ybWF0Q2JZQ3JZLAorICAgIE9NWF9DT0xPUl9Gb3JtYXRDcllDYlksCisgICAgT01YX0NPTE9SX0Zvcm1hdFlVVjQ0NEludGVybGVhdmVkLAorICAgIE9NWF9DT0xPUl9Gb3JtYXRSYXdCYXllcjhiaXQsCisgICAgT01YX0NPTE9SX0Zvcm1hdFJhd0JheWVyMTBiaXQsCisgICAgT01YX0NPTE9SX0Zvcm1hdFJhd0JheWVyOGJpdGNvbXByZXNzZWQsCisgICAgT01YX0NPTE9SX0Zvcm1hdEwyLCAKKyAgICBPTVhfQ09MT1JfRm9ybWF0TDQsIAorICAgIE9NWF9DT0xPUl9Gb3JtYXRMOCwgCisgICAgT01YX0NPTE9SX0Zvcm1hdEwxNiwgCisgICAgT01YX0NPTE9SX0Zvcm1hdEwyNCwgCisgICAgT01YX0NPTE9SX0Zvcm1hdEwzMiwKKyAgICBPTVhfQ09MT1JfRm9ybWF0WVVWNDIwUGFja2VkU2VtaVBsYW5hciwKKyAgICBPTVhfQ09MT1JfRm9ybWF0WVVWNDIyUGFja2VkU2VtaVBsYW5hciwKKyAgICBPTVhfQ09MT1JfRm9ybWF0MThCaXRCR1I2NjYsCisgICAgT01YX0NPTE9SX0Zvcm1hdDI0Qml0QVJHQjY2NjYsCisgICAgT01YX0NPTE9SX0Zvcm1hdDI0Qml0QUJHUjY2NjYsCisgICAgT01YX0NPTE9SX0Zvcm1hdEtocm9ub3NFeHRlbnNpb25zID0gMHg2RjAwMDAwMCwgLyoqPCBSZXNlcnZlZCByZWdpb24gZm9yIGludHJvZHVjaW5nIEtocm9ub3MgU3RhbmRhcmQgRXh0ZW5zaW9ucyAqLyAKKyAgICBPTVhfQ09MT1JfRm9ybWF0VmVuZG9yU3RhcnRVbnVzZWQgPSAweDdGMDAwMDAwLCAvKio8IFJlc2VydmVkIHJlZ2lvbiBmb3IgaW50cm9kdWNpbmcgVmVuZG9yIEV4dGVuc2lvbnMgKi8KKyAgICBPTVhfQ09MT1JfRm9ybWF0TWF4ID0gMHg3RkZGRkZGRgorfSBPTVhfQ09MT1JfRk9STUFUVFlQRTsKKworCisvKiogCisgKiBEZWZpbmVzIHRoZSBtYXRyaXggZm9yIGNvbnZlcnNpb24gZnJvbSBSR0IgdG8gWVVWIG9yIHZpY2UgdmVyc2EuCisgKiBpQ29sb3JNYXRyaXggc2hvdWxkIGJlIGluaXRpYWxpemVkIHdpdGggdGhlIGZpeGVkIHBvaW50IHZhbHVlcyAKKyAqIHVzZWQgaW4gY29udmVydGluZyBiZXR3ZWVuIGZvcm1hdHMuCisgKi8KK3R5cGVkZWYgc3RydWN0IE9NWF9DT05GSUdfQ09MT1JDT05WRVJTSU9OVFlQRSB7CisgICAgT01YX1UzMiBuU2l6ZTsgICAgICAgICAgICAgIC8qKjwgU2l6ZSBvZiB0aGUgc3RydWN0dXJlIGluIGJ5dGVzICovCisgICAgT01YX1ZFUlNJT05UWVBFIG5WZXJzaW9uOyAgIC8qKjwgT01YIHNwZWNpZmljYXRpb24gdmVyc2lvbiBpbmZvICovIAorICAgIE9NWF9VMzIgblBvcnRJbmRleDsgICAgICAgICAvKio8IFBvcnQgdGhhdCB0aGlzIHN0cnVjdCBhcHBsaWVzIHRvICovCisgICAgT01YX1MzMiB4Q29sb3JNYXRyaXhbM11bM107IC8qKjwgU3RvcmVkIGluIHNpZ25lZCBRMTYgZm9ybWF0ICovCisgICAgT01YX1MzMiB4Q29sb3JPZmZzZXRbNF07ICAgIC8qKjwgU3RvcmVkIGluIHNpZ25lZCBRMTYgZm9ybWF0ICovCit9T01YX0NPTkZJR19DT0xPUkNPTlZFUlNJT05UWVBFOworCisKKy8qKiAKKyAqIFN0cnVjdHVyZSBkZWZpbmluZyBwZXJjZW50IHRvIHNjYWxlIGVhY2ggZnJhbWUgZGltZW5zaW9uLiAgRm9yIGV4YW1wbGU6ICAKKyAqIFRvIG1ha2UgdGhlIHdpZHRoIDUwJSBsYXJnZXIsIHVzZSBmV2lkdGggPSAxLjUgYW5kIHRvIG1ha2UgdGhlIHdpZHRoCisgKiAxLzIgdGhlIG9yaWdpbmFsIHNpemUsIHVzZSBmV2lkdGggPSAwLjUKKyAqLwordHlwZWRlZiBzdHJ1Y3QgT01YX0NPTkZJR19TQ0FMRUZBQ1RPUlRZUEUgeworICAgIE9NWF9VMzIgblNpemU7ICAgICAgICAgICAgLyoqPCBTaXplIG9mIHRoZSBzdHJ1Y3R1cmUgaW4gYnl0ZXMgKi8KKyAgICBPTVhfVkVSU0lPTlRZUEUgblZlcnNpb247IC8qKjwgT01YIHNwZWNpZmljYXRpb24gdmVyc2lvbiBpbmZvICovIAorICAgIE9NWF9VMzIgblBvcnRJbmRleDsgICAgICAgLyoqPCBQb3J0IHRoYXQgdGhpcyBzdHJ1Y3QgYXBwbGllcyB0byAqLworICAgIE9NWF9TMzIgeFdpZHRoOyAgICAgICAgICAgLyoqPCBGaXhlZCBwb2ludCB2YWx1ZSBzdG9yZWQgYXMgUTE2ICovCisgICAgT01YX1MzMiB4SGVpZ2h0OyAgICAgICAgICAvKio8IEZpeGVkIHBvaW50IHZhbHVlIHN0b3JlZCBhcyBRMTYgKi8KK31PTVhfQ09ORklHX1NDQUxFRkFDVE9SVFlQRTsKKworCisvKiogCisgKiBFbnVtZXJhdGlvbiBvZiBwb3NzaWJsZSBpbWFnZSBmaWx0ZXIgdHlwZXMgCisgKi8KK3R5cGVkZWYgZW51bSBPTVhfSU1BR0VGSUxURVJUWVBFIHsKKyAgICBPTVhfSW1hZ2VGaWx0ZXJOb25lLAorICAgIE9NWF9JbWFnZUZpbHRlck5vaXNlLAorICAgIE9NWF9JbWFnZUZpbHRlckVtYm9zcywKKyAgICBPTVhfSW1hZ2VGaWx0ZXJOZWdhdGl2ZSwKKyAgICBPTVhfSW1hZ2VGaWx0ZXJTa2V0Y2gsCisgICAgT01YX0ltYWdlRmlsdGVyT2lsUGFpbnQsCisgICAgT01YX0ltYWdlRmlsdGVySGF0Y2gsCisgICAgT01YX0ltYWdlRmlsdGVyR3BlbiwKKyAgICBPTVhfSW1hZ2VGaWx0ZXJBbnRpYWxpYXMsIAorICAgIE9NWF9JbWFnZUZpbHRlckRlUmluZywgICAgICAgCisgICAgT01YX0ltYWdlRmlsdGVyU29sYXJpemUsCisgICAgT01YX0ltYWdlRmlsdGVyS2hyb25vc0V4dGVuc2lvbnMgPSAweDZGMDAwMDAwLCAvKio8IFJlc2VydmVkIHJlZ2lvbiBmb3IgaW50cm9kdWNpbmcgS2hyb25vcyBTdGFuZGFyZCBFeHRlbnNpb25zICovIAorICAgIE9NWF9JbWFnZUZpbHRlclZlbmRvclN0YXJ0VW51c2VkID0gMHg3RjAwMDAwMCwgLyoqPCBSZXNlcnZlZCByZWdpb24gZm9yIGludHJvZHVjaW5nIFZlbmRvciBFeHRlbnNpb25zICovCisgICAgT01YX0ltYWdlRmlsdGVyTWF4ID0gMHg3RkZGRkZGRgorfSBPTVhfSU1BR0VGSUxURVJUWVBFOworCisKKy8qKiAKKyAqIEltYWdlIGZpbHRlciBjb25maWd1cmF0aW9uIAorICoKKyAqIFNUUlVDVCBNRU1CRVJTOgorICogIG5TaXplICAgICAgICA6IFNpemUgb2YgdGhlIHN0cnVjdHVyZSBpbiBieXRlcyAgICAgICAKKyAqICBuVmVyc2lvbiAgICAgOiBPTVggc3BlY2lmaWNhdGlvbiB2ZXJzaW9uIGluZm9ybWF0aW9uCisgKiAgblBvcnRJbmRleCAgIDogUG9ydCB0aGF0IHRoaXMgc3RydWN0dXJlIGFwcGxpZXMgdG8gCisgKiAgZUltYWdlRmlsdGVyIDogSW1hZ2UgZmlsdGVyIHR5cGUgZW51bWVyYXRpb24gICAgICAKKyAqLwordHlwZWRlZiBzdHJ1Y3QgT01YX0NPTkZJR19JTUFHRUZJTFRFUlRZUEUgeworICAgIE9NWF9VMzIgblNpemU7CisgICAgT01YX1ZFUlNJT05UWVBFIG5WZXJzaW9uOworICAgIE9NWF9VMzIgblBvcnRJbmRleDsKKyAgICBPTVhfSU1BR0VGSUxURVJUWVBFIGVJbWFnZUZpbHRlcjsKK30gT01YX0NPTkZJR19JTUFHRUZJTFRFUlRZUEU7CisKKworLyoqIAorICogQ3VzdG9taXplZCBVIGFuZCBWIGZvciBjb2xvciBlbmhhbmNlbWVudCAKKyAqCisgKiBTVFJVQ1QgTUVNQkVSUzoKKyAqICBuU2l6ZSAgICAgICAgICAgICA6IFNpemUgb2YgdGhlIHN0cnVjdHVyZSBpbiBieXRlcworICogIG5WZXJzaW9uICAgICAgICAgIDogT01YIHNwZWNpZmljYXRpb24gdmVyc2lvbiBpbmZvcm1hdGlvbiAKKyAqICBuUG9ydEluZGV4ICAgICAgICA6IFBvcnQgdGhhdCB0aGlzIHN0cnVjdHVyZSBhcHBsaWVzIHRvCisgKiAgYkNvbG9yRW5oYW5jZW1lbnQgOiBFbmFibGUvZGlzYWJsZSBjb2xvciBlbmhhbmNlbWVudAorICogIG5DdXN0b21pemVkVSAgICAgIDogUHJhY3RpY2FsIHZhbHVlczogMTYtMjQwLCByYW5nZTogMC0yNTUsIHZhbHVlIHNldCBmb3IgCisgKiAgICAgICAgICAgICAgICAgICAgICBVIGNvbXBvbmVudAorICogIG5DdXN0b21pemVkViAgICAgIDogUHJhY3RpY2FsIHZhbHVlczogMTYtMjQwLCByYW5nZTogMC0yNTUsIHZhbHVlIHNldCBmb3IgCisgKiAgICAgICAgICAgICAgICAgICAgICBWIGNvbXBvbmVudAorICovCit0eXBlZGVmIHN0cnVjdCBPTVhfQ09ORklHX0NPTE9SRU5IQU5DRU1FTlRUWVBFIHsKKyAgICBPTVhfVTMyIG5TaXplOworICAgIE9NWF9WRVJTSU9OVFlQRSBuVmVyc2lvbjsgCisgICAgT01YX1UzMiBuUG9ydEluZGV4OworICAgIE9NWF9CT09MIGJDb2xvckVuaGFuY2VtZW50OworICAgIE9NWF9VOCBuQ3VzdG9taXplZFU7CisgICAgT01YX1U4IG5DdXN0b21pemVkVjsKK30gT01YX0NPTkZJR19DT0xPUkVOSEFOQ0VNRU5UVFlQRTsKKworCisvKiogCisgKiBEZWZpbmUgY29sb3Iga2V5IGFuZCBjb2xvciBrZXkgbWFzayAKKyAqCisgKiBTVFJVQ1QgTUVNQkVSUzoKKyAqICBuU2l6ZSAgICAgIDogU2l6ZSBvZiB0aGUgc3RydWN0dXJlIGluIGJ5dGVzCisgKiAgblZlcnNpb24gICA6IE9NWCBzcGVjaWZpY2F0aW9uIHZlcnNpb24gaW5mb3JtYXRpb24gCisgKiAgblBvcnRJbmRleCA6IFBvcnQgdGhhdCB0aGlzIHN0cnVjdHVyZSBhcHBsaWVzIHRvCisgKiAgbkFSR0JDb2xvciA6IDMyYml0IEFscGhhLCBSZWQsIEdyZWVuLCBCbHVlIENvbG9yCisgKiAgbkFSR0JNYXNrICA6IDMyYml0IE1hc2sgZm9yIEFscGhhLCBSZWQsIEdyZWVuLCBCbHVlIGNoYW5uZWxzCisgKi8KK3R5cGVkZWYgc3RydWN0IE9NWF9DT05GSUdfQ09MT1JLRVlUWVBFIHsKKyAgICBPTVhfVTMyIG5TaXplOworICAgIE9NWF9WRVJTSU9OVFlQRSBuVmVyc2lvbjsKKyAgICBPTVhfVTMyIG5Qb3J0SW5kZXg7CisgICAgT01YX1UzMiBuQVJHQkNvbG9yOworICAgIE9NWF9VMzIgbkFSR0JNYXNrOworfSBPTVhfQ09ORklHX0NPTE9SS0VZVFlQRTsKKworCisvKiogCisgKiBMaXN0IG9mIGNvbG9yIGJsZW5kIHR5cGVzIGZvciBwcmUvcG9zdCBwcm9jZXNzaW5nIAorICoKKyAqIEVOVU1TOgorICogIE5vbmUgICAgICAgICAgOiBObyBjb2xvciBibGVuZGluZyBwcmVzZW50CisgKiAgQWxwaGFDb25zdGFudCA6IEZ1bmN0aW9uIGlzIChhbHBoYV9jb25zdGFudCAqIHNyYykgKyAKKyAqICAgICAgICAgICAgICAgICAgKDEgLSBhbHBoYV9jb25zdGFudCkgKiBkc3QpCisgKiAgQWxwaGFQZXJQaXhlbCA6IEZ1bmN0aW9uIGlzIChhbHBoYSAqIHNyYykgKyAoMSAtIGFscGhhKSAqIGRzdCkKKyAqICBBbHRlcm5hdGUgICAgIDogRnVuY3Rpb24gaXMgYWx0ZXJuYXRpbmcgcGl4ZWxzIGZyb20gc3JjIGFuZCBkc3QKKyAqICBBbmQgICAgICAgICAgIDogRnVuY3Rpb24gaXMgKHNyYyAmIGRzdCkKKyAqICBPciAgICAgICAgICAgIDogRnVuY3Rpb24gaXMgKHNyYyB8IGRzdCkKKyAqICBJbnZlcnQgICAgICAgIDogRnVuY3Rpb24gaXMgfnNyYworICovCit0eXBlZGVmIGVudW0gT01YX0NPTE9SQkxFTkRUWVBFIHsKKyAgICBPTVhfQ29sb3JCbGVuZE5vbmUsCisgICAgT01YX0NvbG9yQmxlbmRBbHBoYUNvbnN0YW50LAorICAgIE9NWF9Db2xvckJsZW5kQWxwaGFQZXJQaXhlbCwKKyAgICBPTVhfQ29sb3JCbGVuZEFsdGVybmF0ZSwKKyAgICBPTVhfQ29sb3JCbGVuZEFuZCwKKyAgICBPTVhfQ29sb3JCbGVuZE9yLAorICAgIE9NWF9Db2xvckJsZW5kSW52ZXJ0LAorICAgIE9NWF9Db2xvckJsZW5kS2hyb25vc0V4dGVuc2lvbnMgPSAweDZGMDAwMDAwLCAvKio8IFJlc2VydmVkIHJlZ2lvbiBmb3IgaW50cm9kdWNpbmcgS2hyb25vcyBTdGFuZGFyZCBFeHRlbnNpb25zICovIAorICAgIE9NWF9Db2xvckJsZW5kVmVuZG9yU3RhcnRVbnVzZWQgPSAweDdGMDAwMDAwLCAvKio8IFJlc2VydmVkIHJlZ2lvbiBmb3IgaW50cm9kdWNpbmcgVmVuZG9yIEV4dGVuc2lvbnMgKi8KKyAgICBPTVhfQ29sb3JCbGVuZE1heCA9IDB4N0ZGRkZGRkYKK30gT01YX0NPTE9SQkxFTkRUWVBFOworCisKKy8qKiAKKyAqIENvbG9yIGJsZW5kIGNvbmZpZ3VyYXRpb24gCisgKgorICogU1RSVUNUIE1FTUJFUlM6CisgKiAgblNpemUgICAgICAgICAgICAgOiBTaXplIG9mIHRoZSBzdHJ1Y3R1cmUgaW4gYnl0ZXMgICAgICAgICAgICAgICAgICAgICAgICAKKyAqICBuVmVyc2lvbiAgICAgICAgICA6IE9NWCBzcGVjaWZpY2F0aW9uIHZlcnNpb24gaW5mb3JtYXRpb24gICAgICAgICAgICAgICAgCisgKiAgblBvcnRJbmRleCAgICAgICAgOiBQb3J0IHRoYXQgdGhpcyBzdHJ1Y3R1cmUgYXBwbGllcyB0byAgICAgICAgICAgICAgICAgICAKKyAqICBuUkdCQWxwaGFDb25zdGFudCA6IENvbnN0YW50IGdsb2JhbCBhbHBoYSB2YWx1ZXMgd2hlbiBnbG9iYWwgYWxwaGEgaXMgdXNlZAorICogIGVDb2xvckJsZW5kICAgICAgIDogQ29sb3IgYmxlbmQgdHlwZSBlbnVtZXJhdGlvbiAgICAgICAgICAgICAgICAgICAgICAgICAKKyAqLwordHlwZWRlZiBzdHJ1Y3QgT01YX0NPTkZJR19DT0xPUkJMRU5EVFlQRSB7CisgICAgT01YX1UzMiBuU2l6ZTsKKyAgICBPTVhfVkVSU0lPTlRZUEUgblZlcnNpb247CisgICAgT01YX1UzMiBuUG9ydEluZGV4OworICAgIE9NWF9VMzIgblJHQkFscGhhQ29uc3RhbnQ7CisgICAgT01YX0NPTE9SQkxFTkRUWVBFICBlQ29sb3JCbGVuZDsKK30gT01YX0NPTkZJR19DT0xPUkJMRU5EVFlQRTsKKworCisvKiogCisgKiBIb2xkIGZyYW1lIGRpbWVuc2lvbgorICoKKyAqIFNUUlVDVCBNRU1CRVJTOgorICogIG5TaXplICAgICAgOiBTaXplIG9mIHRoZSBzdHJ1Y3R1cmUgaW4gYnl0ZXMgICAgICAKKyAqICBuVmVyc2lvbiAgIDogT01YIHNwZWNpZmljYXRpb24gdmVyc2lvbiBpbmZvcm1hdGlvbgorICogIG5Qb3J0SW5kZXggOiBQb3J0IHRoYXQgdGhpcyBzdHJ1Y3R1cmUgYXBwbGllcyB0byAgICAgCisgKiAgbldpZHRoICAgICA6IEZyYW1lIHdpZHRoIGluIHBpeGVscyAgICAgICAgICAgICAgICAgCisgKiAgbkhlaWdodCAgICA6IEZyYW1lIGhlaWdodCBpbiBwaXhlbHMgICAgICAgICAgICAgICAgCisgKi8KK3R5cGVkZWYgc3RydWN0IE9NWF9GUkFNRVNJWkVUWVBFIHsKKyAgICBPTVhfVTMyIG5TaXplOworICAgIE9NWF9WRVJTSU9OVFlQRSBuVmVyc2lvbjsKKyAgICBPTVhfVTMyIG5Qb3J0SW5kZXg7CisgICAgT01YX1UzMiBuV2lkdGg7CisgICAgT01YX1UzMiBuSGVpZ2h0OworfSBPTVhfRlJBTUVTSVpFVFlQRTsKKworCisvKioKKyAqIFJvdGF0aW9uIGNvbmZpZ3VyYXRpb24gCisgKgorICogU1RSVUNUIE1FTUJFUlM6CisgKiAgblNpemUgICAgICA6IFNpemUgb2YgdGhlIHN0cnVjdHVyZSBpbiBieXRlcyAgICAgICAgICAgICAKKyAqICBuVmVyc2lvbiAgIDogT01YIHNwZWNpZmljYXRpb24gdmVyc2lvbiBpbmZvcm1hdGlvbgorICogIG5Qb3J0SW5kZXggOiBQb3J0IHRoYXQgdGhpcyBzdHJ1Y3R1cmUgYXBwbGllcyB0bworICogIG5Sb3RhdGlvbiAgOiArLy0gaW50ZWdlciByb3RhdGlvbiB2YWx1ZSAgICAgICAgICAgICAgIAorICovCit0eXBlZGVmIHN0cnVjdCBPTVhfQ09ORklHX1JPVEFUSU9OVFlQRSB7CisgICAgT01YX1UzMiBuU2l6ZTsKKyAgICBPTVhfVkVSU0lPTlRZUEUgblZlcnNpb247CisgICAgT01YX1UzMiBuUG9ydEluZGV4OworICAgIE9NWF9TMzIgblJvdGF0aW9uOyAKK30gT01YX0NPTkZJR19ST1RBVElPTlRZUEU7CisKKworLyoqIAorICogUG9zc2libGUgbWlycm9yaW5nIGRpcmVjdGlvbnMgZm9yIHByZS9wb3N0IHByb2Nlc3NpbmcgCisgKgorICogRU5VTVM6CisgKiAgTm9uZSAgICAgICA6IE5vIG1pcnJvcmluZyAgICAgICAgICAgICAgICAgICAgICAgICAKKyAqICBWZXJ0aWNhbCAgIDogVmVydGljYWwgbWlycm9yaW5nLCBmbGlwIG9uIFggYXhpcyAgIAorICogIEhvcml6b250YWwgOiBIb3Jpem9udGFsIG1pcnJvcmluZywgZmxpcCBvbiBZIGF4aXMgIAorICogIEJvdGggICAgICAgOiBCb3RoIHZlcnRpY2FsIGFuZCBob3Jpem9udGFsIG1pcnJvcmluZworICovCit0eXBlZGVmIGVudW0gT01YX01JUlJPUlRZUEUgeworICAgIE9NWF9NaXJyb3JOb25lID0gMCwKKyAgICBPTVhfTWlycm9yVmVydGljYWwsCisgICAgT01YX01pcnJvckhvcml6b250YWwsCisgICAgT01YX01pcnJvckJvdGgsIAorICAgIE9NWF9NaXJyb3JLaHJvbm9zRXh0ZW5zaW9ucyA9IDB4NkYwMDAwMDAsIC8qKjwgUmVzZXJ2ZWQgcmVnaW9uIGZvciBpbnRyb2R1Y2luZyBLaHJvbm9zIFN0YW5kYXJkIEV4dGVuc2lvbnMgKi8gCisgICAgT01YX01pcnJvclZlbmRvclN0YXJ0VW51c2VkID0gMHg3RjAwMDAwMCwgLyoqPCBSZXNlcnZlZCByZWdpb24gZm9yIGludHJvZHVjaW5nIFZlbmRvciBFeHRlbnNpb25zICovCisgICAgT01YX01pcnJvck1heCA9IDB4N0ZGRkZGRkYgICAKK30gT01YX01JUlJPUlRZUEU7CisKKworLyoqIAorICogTWlycm9yaW5nIGNvbmZpZ3VyYXRpb24gCisgKgorICogU1RSVUNUIE1FTUJFUlM6CisgKiAgblNpemUgICAgICA6IFNpemUgb2YgdGhlIHN0cnVjdHVyZSBpbiBieXRlcyAgICAgIAorICogIG5WZXJzaW9uICAgOiBPTVggc3BlY2lmaWNhdGlvbiB2ZXJzaW9uIGluZm9ybWF0aW9uCisgKiAgblBvcnRJbmRleCA6IFBvcnQgdGhhdCB0aGlzIHN0cnVjdHVyZSBhcHBsaWVzIHRvICAKKyAqICBlTWlycm9yICAgIDogTWlycm9yIHR5cGUgZW51bWVyYXRpb24gICAgICAgICAgICAgIAorICovCit0eXBlZGVmIHN0cnVjdCBPTVhfQ09ORklHX01JUlJPUlRZUEUgeworICAgIE9NWF9VMzIgblNpemU7CisgICAgT01YX1ZFUlNJT05UWVBFIG5WZXJzaW9uOyAKKyAgICBPTVhfVTMyIG5Qb3J0SW5kZXg7CisgICAgT01YX01JUlJPUlRZUEUgIGVNaXJyb3I7Cit9IE9NWF9DT05GSUdfTUlSUk9SVFlQRTsKKworCisvKiogCisgKiBQb3NpdGlvbiBpbmZvcm1hdGlvbiBvbmx5IAorICoKKyAqIFNUUlVDVCBNRU1CRVJTOgorICogIG5TaXplICAgICAgOiBTaXplIG9mIHRoZSBzdHJ1Y3R1cmUgaW4gYnl0ZXMgICAgICAgICAgICAgICAKKyAqICBuVmVyc2lvbiAgIDogT01YIHNwZWNpZmljYXRpb24gdmVyc2lvbiBpbmZvcm1hdGlvbgorICogIG5Qb3J0SW5kZXggOiBQb3J0IHRoYXQgdGhpcyBzdHJ1Y3R1cmUgYXBwbGllcyB0bworICogIG5YICAgICAgICAgOiBYIGNvb3JkaW5hdGUgZm9yIHRoZSBwb2ludCAgICAgICAgICAgICAgICAgICAgIAorICogIG5ZICAgICAgICAgOiBZIGNvb3JkaW5hdGUgZm9yIHRoZSBwb2ludCAKKyAqLyAgICAgICAgICAgICAgICAgICAgICAKK3R5cGVkZWYgc3RydWN0IE9NWF9DT05GSUdfUE9JTlRUWVBFIHsKKyAgICBPTVhfVTMyIG5TaXplOworICAgIE9NWF9WRVJTSU9OVFlQRSBuVmVyc2lvbjsKKyAgICBPTVhfVTMyIG5Qb3J0SW5kZXg7CisgICAgT01YX1MzMiBuWDsKKyAgICBPTVhfUzMyIG5ZOworfSBPTVhfQ09ORklHX1BPSU5UVFlQRTsKKworCisvKiogCisgKiBGcmFtZSBzaXplIHBsdXMgcG9zaXRpb24gCisgKgorICogU1RSVUNUIE1FTUJFUlM6CisgKiAgblNpemUgICAgICA6IFNpemUgb2YgdGhlIHN0cnVjdHVyZSBpbiBieXRlcyAgICAgICAgICAgICAgICAgICAgCisgKiAgblZlcnNpb24gICA6IE9NWCBzcGVjaWZpY2F0aW9uIHZlcnNpb24gaW5mb3JtYXRpb24gICAgICAKKyAqICBuUG9ydEluZGV4IDogUG9ydCB0aGF0IHRoaXMgc3RydWN0dXJlIGFwcGxpZXMgdG8gICAgCisgKiAgbkxlZnQgICAgICA6IFggQ29vcmRpbmF0ZSBvZiB0aGUgdG9wIGxlZnQgY29ybmVyIG9mIHRoZSByZWN0YW5nbGUKKyAqICBuVG9wICAgICAgIDogWSBDb29yZGluYXRlIG9mIHRoZSB0b3AgbGVmdCBjb3JuZXIgb2YgdGhlIHJlY3RhbmdsZQorICogIG5XaWR0aCAgICAgOiBXaWR0aCBvZiB0aGUgcmVjdGFuZ2xlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisgKiAgbkhlaWdodCAgICA6IEhlaWdodCBvZiB0aGUgcmVjdGFuZ2xlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKyAqLwordHlwZWRlZiBzdHJ1Y3QgT01YX0NPTkZJR19SRUNUVFlQRSB7CisgICAgT01YX1UzMiBuU2l6ZTsKKyAgICBPTVhfVkVSU0lPTlRZUEUgblZlcnNpb247ICAKKyAgICBPTVhfVTMyIG5Qb3J0SW5kZXg7IAorICAgIE9NWF9TMzIgbkxlZnQ7IAorICAgIE9NWF9TMzIgblRvcDsKKyAgICBPTVhfVTMyIG5XaWR0aDsKKyAgICBPTVhfVTMyIG5IZWlnaHQ7Cit9IE9NWF9DT05GSUdfUkVDVFRZUEU7CisKKworLyoqIAorICogRGVibG9ja2luZyBzdGF0ZTsgaXQgaXMgcmVxdWlyZWQgdG8gYmUgc2V0IHVwIGJlZm9yZSBzdGFydGluZyB0aGUgY29kZWMgCisgKgorICogU1RSVUNUIE1FTUJFUlM6CisgKiAgblNpemUgICAgICAgOiBTaXplIG9mIHRoZSBzdHJ1Y3R1cmUgaW4gYnl0ZXMgICAgICAKKyAqICBuVmVyc2lvbiAgICA6IE9NWCBzcGVjaWZpY2F0aW9uIHZlcnNpb24gaW5mb3JtYXRpb24gCisgKiAgblBvcnRJbmRleCAgOiBQb3J0IHRoYXQgdGhpcyBzdHJ1Y3R1cmUgYXBwbGllcyB0bworICogIGJEZWJsb2NraW5nIDogRW5hYmxlL2Rpc2FibGUgZGVibG9ja2luZyBtb2RlICAgIAorICovCit0eXBlZGVmIHN0cnVjdCBPTVhfUEFSQU1fREVCTE9DS0lOR1RZUEUgeworICAgIE9NWF9VMzIgblNpemU7CisgICAgT01YX1ZFUlNJT05UWVBFIG5WZXJzaW9uOworICAgIE9NWF9VMzIgblBvcnRJbmRleDsKKyAgICBPTVhfQk9PTCBiRGVibG9ja2luZzsKK30gT01YX1BBUkFNX0RFQkxPQ0tJTkdUWVBFOworCisKKy8qKiAKKyAqIFN0YWJpbGl6YXRpb24gc3RhdGUgCisgKgorICogU1RSVUNUIE1FTUJFUlM6CisgKiAgblNpemUgICAgICA6IFNpemUgb2YgdGhlIHN0cnVjdHVyZSBpbiBieXRlcyAgICAgICAgICAKKyAqICBuVmVyc2lvbiAgIDogT01YIHNwZWNpZmljYXRpb24gdmVyc2lvbiBpbmZvcm1hdGlvbiAgICAKKyAqICBuUG9ydEluZGV4IDogUG9ydCB0aGF0IHRoaXMgc3RydWN0dXJlIGFwcGxpZXMgdG8gICAKKyAqICBiU3RhYiAgICAgIDogRW5hYmxlL2Rpc2FibGUgZnJhbWUgc3RhYmlsaXphdGlvbiBzdGF0ZQorICovCit0eXBlZGVmIHN0cnVjdCBPTVhfQ09ORklHX0ZSQU1FU1RBQlRZUEUgeworICAgIE9NWF9VMzIgblNpemU7CisgICAgT01YX1ZFUlNJT05UWVBFIG5WZXJzaW9uOworICAgIE9NWF9VMzIgblBvcnRJbmRleDsKKyAgICBPTVhfQk9PTCBiU3RhYjsKK30gT01YX0NPTkZJR19GUkFNRVNUQUJUWVBFOworCisKKy8qKiAKKyAqIFdoaXRlIEJhbGFuY2UgY29udHJvbCB0eXBlIAorICoKKyAqIFNUUlVDVCBNRU1CRVJTOgorICogIFN1bkxpZ2h0IDogUmVmZXJlbmNlZCBpbiBKU1ItMjM0CisgKiAgRmxhc2ggICAgOiBPcHRpbWFsIGZvciBkZXZpY2UncyBpbnRlZ3JhdGVkIGZsYXNoCisgKi8KK3R5cGVkZWYgZW51bSBPTVhfV0hJVEVCQUxDT05UUk9MVFlQRSB7CisgICAgT01YX1doaXRlQmFsQ29udHJvbE9mZiA9IDAsCisgICAgT01YX1doaXRlQmFsQ29udHJvbEF1dG8sCisgICAgT01YX1doaXRlQmFsQ29udHJvbFN1bkxpZ2h0LAorICAgIE9NWF9XaGl0ZUJhbENvbnRyb2xDbG91ZHksCisgICAgT01YX1doaXRlQmFsQ29udHJvbFNoYWRlLAorICAgIE9NWF9XaGl0ZUJhbENvbnRyb2xUdW5nc3RlbiwKKyAgICBPTVhfV2hpdGVCYWxDb250cm9sRmx1b3Jlc2NlbnQsCisgICAgT01YX1doaXRlQmFsQ29udHJvbEluY2FuZGVzY2VudCwKKyAgICBPTVhfV2hpdGVCYWxDb250cm9sRmxhc2gsCisgICAgT01YX1doaXRlQmFsQ29udHJvbEhvcml6b24sCisgICAgT01YX1doaXRlQmFsQ29udHJvbEtocm9ub3NFeHRlbnNpb25zID0gMHg2RjAwMDAwMCwgLyoqPCBSZXNlcnZlZCByZWdpb24gZm9yIGludHJvZHVjaW5nIEtocm9ub3MgU3RhbmRhcmQgRXh0ZW5zaW9ucyAqLyAKKyAgICBPTVhfV2hpdGVCYWxDb250cm9sVmVuZG9yU3RhcnRVbnVzZWQgPSAweDdGMDAwMDAwLCAvKio8IFJlc2VydmVkIHJlZ2lvbiBmb3IgaW50cm9kdWNpbmcgVmVuZG9yIEV4dGVuc2lvbnMgKi8KKyAgICBPTVhfV2hpdGVCYWxDb250cm9sTWF4ID0gMHg3RkZGRkZGRgorfSBPTVhfV0hJVEVCQUxDT05UUk9MVFlQRTsKKworCisvKiogCisgKiBXaGl0ZSBCYWxhbmNlIGNvbnRyb2wgY29uZmlndXJhdGlvbiAKKyAqCisgKiBTVFJVQ1QgTUVNQkVSUzoKKyAqICBuU2l6ZSAgICAgICAgICAgIDogU2l6ZSBvZiB0aGUgc3RydWN0dXJlIGluIGJ5dGVzICAgICAgIAorICogIG5WZXJzaW9uICAgICAgICAgOiBPTVggc3BlY2lmaWNhdGlvbiB2ZXJzaW9uIGluZm9ybWF0aW9uCisgKiAgblBvcnRJbmRleCAgICAgICA6IFBvcnQgdGhhdCB0aGlzIHN0cnVjdHVyZSBhcHBsaWVzIHRvICAgICAgICAgICAgICAgICAKKyAqICBlV2hpdGVCYWxDb250cm9sIDogV2hpdGUgYmFsYW5jZSBlbnVtZXJhdGlvbiAgICAgICAgICAgIAorICovCit0eXBlZGVmIHN0cnVjdCBPTVhfQ09ORklHX1dISVRFQkFMQ09OVFJPTFRZUEUgeworICAgIE9NWF9VMzIgblNpemU7CisgICAgT01YX1ZFUlNJT05UWVBFIG5WZXJzaW9uOworICAgIE9NWF9VMzIgblBvcnRJbmRleDsKKyAgICBPTVhfV0hJVEVCQUxDT05UUk9MVFlQRSBlV2hpdGVCYWxDb250cm9sOworfSBPTVhfQ09ORklHX1dISVRFQkFMQ09OVFJPTFRZUEU7CisKKworLyoqIAorICogRXhwb3N1cmUgY29udHJvbCB0eXBlIAorICovCit0eXBlZGVmIGVudW0gT01YX0VYUE9TVVJFQ09OVFJPTFRZUEUgeworICAgIE9NWF9FeHBvc3VyZUNvbnRyb2xPZmYgPSAwLAorICAgIE9NWF9FeHBvc3VyZUNvbnRyb2xBdXRvLAorICAgIE9NWF9FeHBvc3VyZUNvbnRyb2xOaWdodCwKKyAgICBPTVhfRXhwb3N1cmVDb250cm9sQmFja0xpZ2h0LAorICAgIE9NWF9FeHBvc3VyZUNvbnRyb2xTcG90TGlnaHQsCisgICAgT01YX0V4cG9zdXJlQ29udHJvbFNwb3J0cywKKyAgICBPTVhfRXhwb3N1cmVDb250cm9sU25vdywKKyAgICBPTVhfRXhwb3N1cmVDb250cm9sQmVhY2gsCisgICAgT01YX0V4cG9zdXJlQ29udHJvbExhcmdlQXBlcnR1cmUsCisgICAgT01YX0V4cG9zdXJlQ29udHJvbFNtYWxsQXBwZXJ0dXJlLAorICAgIE9NWF9FeHBvc3VyZUNvbnRyb2xLaHJvbm9zRXh0ZW5zaW9ucyA9IDB4NkYwMDAwMDAsIC8qKjwgUmVzZXJ2ZWQgcmVnaW9uIGZvciBpbnRyb2R1Y2luZyBLaHJvbm9zIFN0YW5kYXJkIEV4dGVuc2lvbnMgKi8gCisgICAgT01YX0V4cG9zdXJlQ29udHJvbFZlbmRvclN0YXJ0VW51c2VkID0gMHg3RjAwMDAwMCwgLyoqPCBSZXNlcnZlZCByZWdpb24gZm9yIGludHJvZHVjaW5nIFZlbmRvciBFeHRlbnNpb25zICovCisgICAgT01YX0V4cG9zdXJlQ29udHJvbE1heCA9IDB4N0ZGRkZGRkYKK30gT01YX0VYUE9TVVJFQ09OVFJPTFRZUEU7CisKKworLyoqIAorICogV2hpdGUgQmFsYW5jZSBjb250cm9sIGNvbmZpZ3VyYXRpb24gCisgKgorICogU1RSVUNUIE1FTUJFUlM6CisgKiAgblNpemUgICAgICAgICAgICA6IFNpemUgb2YgdGhlIHN0cnVjdHVyZSBpbiBieXRlcyAgICAgIAorICogIG5WZXJzaW9uICAgICAgICAgOiBPTVggc3BlY2lmaWNhdGlvbiB2ZXJzaW9uIGluZm9ybWF0aW9uCisgKiAgblBvcnRJbmRleCAgICAgICA6IFBvcnQgdGhhdCB0aGlzIHN0cnVjdHVyZSBhcHBsaWVzIHRvICAgICAgICAgICAgICAgIAorICogIGVFeHBvc3VyZUNvbnRyb2wgOiBFeHBvc3VyZSBjb250cm9sIGVudW1lcmF0aW9uICAgICAgICAgCisgKi8KK3R5cGVkZWYgc3RydWN0IE9NWF9DT05GSUdfRVhQT1NVUkVDT05UUk9MVFlQRSB7CisgICAgT01YX1UzMiBuU2l6ZTsKKyAgICBPTVhfVkVSU0lPTlRZUEUgblZlcnNpb247CisgICAgT01YX1UzMiBuUG9ydEluZGV4OworICAgIE9NWF9FWFBPU1VSRUNPTlRST0xUWVBFIGVFeHBvc3VyZUNvbnRyb2w7Cit9IE9NWF9DT05GSUdfRVhQT1NVUkVDT05UUk9MVFlQRTsKKworCisvKiogCisgKiBEZWZpbmVzIHNlbnNvciBzdXBwb3J0ZWQgbW9kZS4gCisgKgorICogU1RSVUNUIE1FTUJFUlM6CisgKiAgblNpemUgICAgICA6IFNpemUgb2YgdGhlIHN0cnVjdHVyZSBpbiBieXRlcyAgICAgICAgICAgCisgKiAgblZlcnNpb24gICA6IE9NWCBzcGVjaWZpY2F0aW9uIHZlcnNpb24gaW5mb3JtYXRpb24KKyAqICBuUG9ydEluZGV4IDogUG9ydCB0aGF0IHRoaXMgc3RydWN0dXJlIGFwcGxpZXMgdG8gCisgKiAgbkZyYW1lUmF0ZSA6IFNpbmdsZSBzaG90IG1vZGUgaXMgaW5kaWNhdGVkIGJ5IGEgMCAgICAgCisgKiAgYk9uZVNob3QgICA6IEVuYWJsZSBmb3Igc2luZ2xlIHNob3QsIGRpc2FibGUgZm9yIHN0cmVhbWluZworICogIHNGcmFtZVNpemUgOiBGcmFtZXNpemUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKyAqLwordHlwZWRlZiBzdHJ1Y3QgT01YX1BBUkFNX1NFTlNPUk1PREVUWVBFIHsKKyAgICBPTVhfVTMyIG5TaXplOworICAgIE9NWF9WRVJTSU9OVFlQRSBuVmVyc2lvbjsKKyAgICBPTVhfVTMyIG5Qb3J0SW5kZXg7CisgICAgT01YX1UzMiBuRnJhbWVSYXRlOworICAgIE9NWF9CT09MIGJPbmVTaG90OworICAgIE9NWF9GUkFNRVNJWkVUWVBFIHNGcmFtZVNpemU7Cit9IE9NWF9QQVJBTV9TRU5TT1JNT0RFVFlQRTsKKworCisvKiogCisgKiBEZWZpbmVzIGNvbnRyYXN0IGxldmVsIAorICoKKyAqIFNUUlVDVCBNRU1CRVJTOgorICogIG5TaXplICAgICAgOiBTaXplIG9mIHRoZSBzdHJ1Y3R1cmUgaW4gYnl0ZXMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKyAqICBuVmVyc2lvbiAgIDogT01YIHNwZWNpZmljYXRpb24gdmVyc2lvbiBpbmZvcm1hdGlvbiAgICAgICAgICAgICAgICAKKyAqICBuUG9ydEluZGV4IDogUG9ydCB0aGF0IHRoaXMgc3RydWN0dXJlIGFwcGxpZXMgdG8gICAgICAgICAgICAgICAgIAorICogIG5Db250cmFzdCAgOiBWYWx1ZXMgYWxsb3dlZCBmb3IgY29udHJhc3QgLTEwMCB0byAxMDAsIHplcm8gbWVhbnMgbm8gY2hhbmdlCisgKi8KK3R5cGVkZWYgc3RydWN0IE9NWF9DT05GSUdfQ09OVFJBU1RUWVBFIHsKKyAgICBPTVhfVTMyIG5TaXplOworICAgIE9NWF9WRVJTSU9OVFlQRSBuVmVyc2lvbjsKKyAgICBPTVhfVTMyIG5Qb3J0SW5kZXg7CisgICAgT01YX1MzMiBuQ29udHJhc3Q7Cit9IE9NWF9DT05GSUdfQ09OVFJBU1RUWVBFOworCisKKy8qKiAKKyAqIERlZmluZXMgYnJpZ2h0bmVzcyBsZXZlbCAKKyAqCisgKiBTVFJVQ1QgTUVNQkVSUzoKKyAqICBuU2l6ZSAgICAgICA6IFNpemUgb2YgdGhlIHN0cnVjdHVyZSBpbiBieXRlcyAgICAgICAgICAKKyAqICBuVmVyc2lvbiAgICA6IE9NWCBzcGVjaWZpY2F0aW9uIHZlcnNpb24gaW5mb3JtYXRpb24gCisgKiAgblBvcnRJbmRleCAgOiBQb3J0IHRoYXQgdGhpcyBzdHJ1Y3R1cmUgYXBwbGllcyB0byAKKyAqICBuQnJpZ2h0bmVzcyA6IDAtMTAwJSAgICAgICAgCisgKi8KK3R5cGVkZWYgc3RydWN0IE9NWF9DT05GSUdfQlJJR0hUTkVTU1RZUEUgeworICAgIE9NWF9VMzIgblNpemU7CisgICAgT01YX1ZFUlNJT05UWVBFIG5WZXJzaW9uOworICAgIE9NWF9VMzIgblBvcnRJbmRleDsKKyAgICBPTVhfVTMyIG5CcmlnaHRuZXNzOworfSBPTVhfQ09ORklHX0JSSUdIVE5FU1NUWVBFOworCisKKy8qKiAKKyAqIERlZmluZXMgYmFja2xpZ2h0IGxldmVsIGNvbmZpZ3VyYXRpb24gZm9yIGEgdmlkZW8gc2luaywgZS5nLiBMQ0QgcGFuZWwgCisgKgorICogU1RSVUNUIE1FTUJFUlM6CisgKiAgblNpemUgICAgICA6IFNpemUgb2YgdGhlIHN0cnVjdHVyZSBpbiBieXRlcworICogIG5WZXJzaW9uICAgOiBPTVggc3BlY2lmaWNhdGlvbiB2ZXJzaW9uIGluZm9ybWF0aW9uIAorICogIG5Qb3J0SW5kZXggOiBQb3J0IHRoYXQgdGhpcyBzdHJ1Y3R1cmUgYXBwbGllcyB0bworICogIG5CYWNrbGlnaHQgOiBWYWx1ZXMgYWxsb3dlZCBmb3IgYmFja2xpZ2h0IDAtMTAwJQorICogIG5UaW1lb3V0ICAgOiBOdW1iZXIgb2YgbWlsbGlzZWNvbmRzIGJlZm9yZSBiYWNrbGlnaHQgYXV0b21hdGljYWxseSB0dXJucyAKKyAqICAgICAgICAgICAgICAgb2ZmLiAgQSB2YWx1ZSBvZiAweDAgZGlzYWJsZXMgYmFja2lnaHQgdGltZW91dCAKKyAqLwordHlwZWRlZiBzdHJ1Y3QgT01YX0NPTkZJR19CQUNLTElHSFRUWVBFIHsKKyAgICBPTVhfVTMyIG5TaXplOworICAgIE9NWF9WRVJTSU9OVFlQRSBuVmVyc2lvbjsKKyAgICBPTVhfVTMyIG5Qb3J0SW5kZXg7CisgICAgT01YX1UzMiBuQmFja2xpZ2h0OworICAgIE9NWF9VMzIgblRpbWVvdXQ7Cit9IE9NWF9DT05GSUdfQkFDS0xJR0hUVFlQRTsKKworCisvKiogCisgKiBEZWZpbmVzIHNldHRpbmcgZm9yIEdhbW1hIAorICoKKyAqIFNUUlVDVCBNRU1CRVJTOgorICogIG5TaXplICAgICAgOiBTaXplIG9mIHRoZSBzdHJ1Y3R1cmUgaW4gYnl0ZXMKKyAqICBuVmVyc2lvbiAgIDogT01YIHNwZWNpZmljYXRpb24gdmVyc2lvbiBpbmZvcm1hdGlvbiAKKyAqICBuUG9ydEluZGV4IDogUG9ydCB0aGF0IHRoaXMgc3RydWN0dXJlIGFwcGxpZXMgdG8KKyAqICBuR2FtbWEgICAgIDogVmFsdWVzIGFsbG93ZWQgZm9yIGdhbW1hIC0xMDAgdG8gMTAwLCB6ZXJvIG1lYW5zIG5vIGNoYW5nZQorICovCit0eXBlZGVmIHN0cnVjdCBPTVhfQ09ORklHX0dBTU1BVFlQRSB7CisgICAgT01YX1UzMiBuU2l6ZTsKKyAgICBPTVhfVkVSU0lPTlRZUEUgblZlcnNpb247CisgICAgT01YX1UzMiBuUG9ydEluZGV4OworICAgIE9NWF9TMzIgbkdhbW1hOworfSBPTVhfQ09ORklHX0dBTU1BVFlQRTsKKworCisvKiogCisgKiBEZWZpbmUgZm9yIHNldHRpbmcgc2F0dXJhdGlvbiAKKyAqIAorICogU1RSVUNUIE1FTUJFUlM6CisgKiAgblNpemUgICAgICAgOiBTaXplIG9mIHRoZSBzdHJ1Y3R1cmUgaW4gYnl0ZXMKKyAqICBuVmVyc2lvbiAgICA6IE9NWCBzcGVjaWZpY2F0aW9uIHZlcnNpb24gaW5mb3JtYXRpb24KKyAqICBuUG9ydEluZGV4ICA6IFBvcnQgdGhhdCB0aGlzIHN0cnVjdHVyZSBhcHBsaWVzIHRvCisgKiAgblNhdHVyYXRpb24gOiBWYWx1ZXMgYWxsb3dlZCBmb3Igc2F0dXJhdGlvbiAtMTAwIHRvIDEwMCwgemVybyBtZWFucyAKKyAqICAgICAgICAgICAgICAgIG5vIGNoYW5nZQorICovCit0eXBlZGVmIHN0cnVjdCBPTVhfQ09ORklHX1NBVFVSQVRJT05UWVBFIHsKKyAgICBPTVhfVTMyIG5TaXplOworICAgIE9NWF9WRVJTSU9OVFlQRSBuVmVyc2lvbjsKKyAgICBPTVhfVTMyIG5Qb3J0SW5kZXg7CisgICAgT01YX1MzMiBuU2F0dXJhdGlvbjsKK30gT01YX0NPTkZJR19TQVRVUkFUSU9OVFlQRTsKKworCisvKiogCisgKiBEZWZpbmUgZm9yIHNldHRpbmcgTGlnaHRuZXNzIAorICoKKyAqIFNUUlVDVCBNRU1CRVJTOgorICogIG5TaXplICAgICAgOiBTaXplIG9mIHRoZSBzdHJ1Y3R1cmUgaW4gYnl0ZXMKKyAqICBuVmVyc2lvbiAgIDogT01YIHNwZWNpZmljYXRpb24gdmVyc2lvbiBpbmZvcm1hdGlvbgorICogIG5Qb3J0SW5kZXggOiBQb3J0IHRoYXQgdGhpcyBzdHJ1Y3R1cmUgYXBwbGllcyB0bworICogIG5MaWdodG5lc3MgOiBWYWx1ZXMgYWxsb3dlZCBmb3IgbGlnaHRuZXNzIC0xMDAgdG8gMTAwLCB6ZXJvIG1lYW5zIG5vIAorICogICAgICAgICAgICAgICBjaGFuZ2UKKyAqLwordHlwZWRlZiBzdHJ1Y3QgT01YX0NPTkZJR19MSUdIVE5FU1NUWVBFIHsKKyAgICBPTVhfVTMyIG5TaXplOworICAgIE9NWF9WRVJTSU9OVFlQRSBuVmVyc2lvbjsKKyAgICBPTVhfVTMyIG5Qb3J0SW5kZXg7CisgICAgT01YX1MzMiBuTGlnaHRuZXNzOworfSBPTVhfQ09ORklHX0xJR0hUTkVTU1RZUEU7CisKKworLyoqIAorICogUGxhbmUgYmxlbmQgY29uZmlndXJhdGlvbiAKKyAqCisgKiBTVFJVQ1QgTUVNQkVSUzoKKyAqICBuU2l6ZSAgICAgIDogU2l6ZSBvZiB0aGUgc3RydWN0dXJlIGluIGJ5dGVzIAorICogIG5WZXJzaW9uICAgOiBPTVggc3BlY2lmaWNhdGlvbiB2ZXJzaW9uIGluZm9ybWF0aW9uCisgKiAgblBvcnRJbmRleCA6IEluZGV4IG9mIGlucHV0IHBvcnQgYXNzb2NpYXRlZCB3aXRoIHRoZSBwbGFuZS4KKyAqICBuRGVwdGggICAgIDogRGVwdGggb2YgdGhlIHBsYW5lIGluIHJlbGF0aW9uIHRvIHRoZSBzY3JlZW4uIEhpZ2hlciAKKyAqICAgICAgICAgICAgICAgbnVtYmVyZWQgZGVwdGhzIGFyZSAiYmVoaW5kIiBsb3dlciBudW1iZXIgZGVwdGhzLiAgCisgKiAgICAgICAgICAgICAgIFRoaXMgbnVtYmVyIGRlZmF1bHRzIHRvIHRoZSBQb3J0IEluZGV4IG51bWJlci4KKyAqICBuQWxwaGEgICAgIDogVHJhbnNwYXJlbmN5IGJsZW5kaW5nIGNvbXBvbmVudCBmb3IgdGhlIGVudGlyZSBwbGFuZS4gIAorICogICAgICAgICAgICAgICBTZWUgYmxlbmRpbmcgbW9kZXMgZm9yIG1vcmUgZGV0YWlsLgorICovCit0eXBlZGVmIHN0cnVjdCBPTVhfQ09ORklHX1BMQU5FQkxFTkRUWVBFIHsKKyAgICBPTVhfVTMyIG5TaXplOworICAgIE9NWF9WRVJTSU9OVFlQRSBuVmVyc2lvbjsKKyAgICBPTVhfVTMyIG5Qb3J0SW5kZXg7CisgICAgT01YX1UzMiBuRGVwdGg7CisgICAgT01YX1UzMiBuQWxwaGE7Cit9IE9NWF9DT05GSUdfUExBTkVCTEVORFRZUEU7CisKKworLyoqIAorICogRGVmaW5lIGludGVybGFjZSB0eXBlCisgKgorICogU1RSVUNUIE1FTUJFUlM6CisgKiAgblNpemUgICAgICAgICAgICAgICAgIDogU2l6ZSBvZiB0aGUgc3RydWN0dXJlIGluIGJ5dGVzIAorICogIG5WZXJzaW9uICAgICAgICAgICAgICA6IE9NWCBzcGVjaWZpY2F0aW9uIHZlcnNpb24gaW5mb3JtYXRpb24gCisgKiAgblBvcnRJbmRleCAgICAgICAgICAgIDogUG9ydCB0aGF0IHRoaXMgc3RydWN0dXJlIGFwcGxpZXMgdG8KKyAqICBiRW5hYmxlICAgICAgICAgICAgICAgOiBFbmFibGUgY29udHJvbCB2YXJpYWJsZSBmb3IgdGhpcyBmdW5jdGlvbmFsaXR5IAorICogICAgICAgICAgICAgICAgICAgICAgICAgIChzZWUgYmVsb3cpCisgKiAgbkludGVybGVhdmVQb3J0SW5kZXggIDogSW5kZXggb2YgaW5wdXQgb3Igb3V0cHV0IHBvcnQgYXNzb2NpYXRlZCB3aXRoICAKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICB0aGUgaW50ZXJsZWF2ZWQgcGxhbmUuIAorICogIHBQbGFuYXJQb3J0SW5kZXhlc1s0XSA6IEluZGV4IG9mIGlucHV0IG9yIG91dHB1dCBwbGFuYXIgcG9ydHMuCisgKi8KK3R5cGVkZWYgc3RydWN0IE9NWF9QQVJBTV9JTlRFUkxFQVZFVFlQRSB7CisgICAgT01YX1UzMiBuU2l6ZTsKKyAgICBPTVhfVkVSU0lPTlRZUEUgblZlcnNpb247CisgICAgT01YX1UzMiBuUG9ydEluZGV4OworICAgIE9NWF9CT09MIGJFbmFibGU7CisgICAgT01YX1UzMiBuSW50ZXJsZWF2ZVBvcnRJbmRleDsKK30gT01YX1BBUkFNX0lOVEVSTEVBVkVUWVBFOworCisKKy8qKiAKKyAqIERlZmluZXMgdGhlIHBpY3R1cmUgZWZmZWN0IHVzZWQgZm9yIGFuIGlucHV0IHBpY3R1cmUgCisgKi8KK3R5cGVkZWYgZW51bSBPTVhfVFJBTlNJVElPTkVGRkVDVFRZUEUgeworICAgIE9NWF9FZmZlY3ROb25lLAorICAgIE9NWF9FZmZlY3RGYWRlRnJvbUJsYWNrLAorICAgIE9NWF9FZmZlY3RGYWRlVG9CbGFjaywKKyAgICBPTVhfRWZmZWN0VW5zcGVjaWZpZWRUaHJvdWdoQ29uc3RhbnRDb2xvciwKKyAgICBPTVhfRWZmZWN0RGlzc29sdmUsCisgICAgT01YX0VmZmVjdFdpcGUsCisgICAgT01YX0VmZmVjdFVuc3BlY2lmaWVkTWl4T2ZUd29TY2VuZXMsCisgICAgT01YX0VmZmVjdEtocm9ub3NFeHRlbnNpb25zID0gMHg2RjAwMDAwMCwgLyoqPCBSZXNlcnZlZCByZWdpb24gZm9yIGludHJvZHVjaW5nIEtocm9ub3MgU3RhbmRhcmQgRXh0ZW5zaW9ucyAqLyAKKyAgICBPTVhfRWZmZWN0VmVuZG9yU3RhcnRVbnVzZWQgPSAweDdGMDAwMDAwLCAvKio8IFJlc2VydmVkIHJlZ2lvbiBmb3IgaW50cm9kdWNpbmcgVmVuZG9yIEV4dGVuc2lvbnMgKi8KKyAgICBPTVhfRWZmZWN0TWF4ID0gMHg3RkZGRkZGRgorfSBPTVhfVFJBTlNJVElPTkVGRkVDVFRZUEU7CisKKworLyoqIAorICogU3RydWN0dXJlIHVzZWQgdG8gY29uZmlndXJlIGN1cnJlbnQgdHJhbnNpdGlvbiBlZmZlY3QgCisgKgorICogU1RSVUNUIE1FTUJFUlM6CisgKiBuU2l6ZSAgICAgIDogU2l6ZSBvZiB0aGUgc3RydWN0dXJlIGluIGJ5dGVzCisgKiBuVmVyc2lvbiAgIDogT01YIHNwZWNpZmljYXRpb24gdmVyc2lvbiBpbmZvcm1hdGlvbiAKKyAqIG5Qb3J0SW5kZXggOiBQb3J0IHRoYXQgdGhpcyBzdHJ1Y3R1cmUgYXBwbGllcyB0bworICogZUVmZmVjdCAgICA6IEVmZmVjdCB0byBlbmFibGUKKyAqLwordHlwZWRlZiBzdHJ1Y3QgT01YX0NPTkZJR19UUkFOU0lUSU9ORUZGRUNUVFlQRSB7CisgICAgT01YX1UzMiBuU2l6ZTsKKyAgICBPTVhfVkVSU0lPTlRZUEUgblZlcnNpb247CisgICAgT01YX1UzMiBuUG9ydEluZGV4OworICAgIE9NWF9UUkFOU0lUSU9ORUZGRUNUVFlQRSBlRWZmZWN0OworfSBPTVhfQ09ORklHX1RSQU5TSVRJT05FRkZFQ1RUWVBFOworCisKKy8qKiAKKyAqIERlZmluZXMgcG9zc2libGUgZGF0YSB1bml0IHR5cGVzIGZvciBlbmNvZGVkIHZpZGVvIGRhdGEuIFRoZSBkYXRhIHVuaXQgCisgKiB0eXBlcyBhcmUgdXNlZCBib3RoIGZvciBlbmNvZGVkIHZpZGVvIGlucHV0IGZvciBwbGF5YmFjayBhcyB3ZWxsIGFzCisgKiBlbmNvZGVkIHZpZGVvIG91dHB1dCBmcm9tIHJlY29yZGluZy4gCisgKi8KK3R5cGVkZWYgZW51bSBPTVhfREFUQVVOSVRUWVBFIHsKKyAgICBPTVhfRGF0YVVuaXRDb2RlZFBpY3R1cmUsCisgICAgT01YX0RhdGFVbml0VmlkZW9TZWdtZW50LAorICAgIE9NWF9EYXRhVW5pdFNldmVyYWxTZWdtZW50cywKKyAgICBPTVhfRGF0YVVuaXRBcmJpdHJhcnlTdHJlYW1TZWN0aW9uLAorICAgIE9NWF9EYXRhVW5pdEtocm9ub3NFeHRlbnNpb25zID0gMHg2RjAwMDAwMCwgLyoqPCBSZXNlcnZlZCByZWdpb24gZm9yIGludHJvZHVjaW5nIEtocm9ub3MgU3RhbmRhcmQgRXh0ZW5zaW9ucyAqLyAKKyAgICBPTVhfRGF0YVVuaXRWZW5kb3JTdGFydFVudXNlZCA9IDB4N0YwMDAwMDAsIC8qKjwgUmVzZXJ2ZWQgcmVnaW9uIGZvciBpbnRyb2R1Y2luZyBWZW5kb3IgRXh0ZW5zaW9ucyAqLworICAgIE9NWF9EYXRhVW5pdE1heCA9IDB4N0ZGRkZGRkYKK30gT01YX0RBVEFVTklUVFlQRTsKKworCisvKiogCisgKiBEZWZpbmVzIHBvc3NpYmxlIGVuY2Fwc3VsYXRpb24gdHlwZXMgZm9yIGNvZGVkIHZpZGVvIGRhdGEgdW5pdC4gVGhlIAorICogZW5jYXBzdWxhdGlvbiBpbmZvcm1hdGlvbiBpcyB1c2VkIGJvdGggZm9yIGVuY29kZWQgdmlkZW8gaW5wdXQgZm9yIAorICogcGxheWJhY2sgYXMgd2VsbCBhcyBlbmNvZGVkIHZpZGVvIG91dHB1dCBmcm9tIHJlY29yZGluZy4gCisgKi8KK3R5cGVkZWYgZW51bSBPTVhfREFUQVVOSVRFTkNBUFNVTEFUSU9OVFlQRSB7CisgICAgT01YX0RhdGFFbmNhcHN1bGF0aW9uRWxlbWVudGFyeVN0cmVhbSwKKyAgICBPTVhfRGF0YUVuY2Fwc3VsYXRpb25HZW5lcmljUGF5bG9hZCwKKyAgICBPTVhfRGF0YUVuY2Fwc3VsYXRpb25SdHBQYXlsb2FkLAorICAgIE9NWF9EYXRhRW5jYXBzdWxhdGlvbktocm9ub3NFeHRlbnNpb25zID0gMHg2RjAwMDAwMCwgLyoqPCBSZXNlcnZlZCByZWdpb24gZm9yIGludHJvZHVjaW5nIEtocm9ub3MgU3RhbmRhcmQgRXh0ZW5zaW9ucyAqLyAKKyAgICBPTVhfRGF0YUVuY2Fwc3VsYXRpb25WZW5kb3JTdGFydFVudXNlZCA9IDB4N0YwMDAwMDAsIC8qKjwgUmVzZXJ2ZWQgcmVnaW9uIGZvciBpbnRyb2R1Y2luZyBWZW5kb3IgRXh0ZW5zaW9ucyAqLworICAgIE9NWF9EYXRhRW5jYXBzdWxhdGlvbk1heCA9IDB4N0ZGRkZGRkYKK30gT01YX0RBVEFVTklURU5DQVBTVUxBVElPTlRZUEU7CisKKworLyoqIAorICogU3RydWN0dXJlIHVzZWQgdG8gY29uZmlndXJlIHRoZSB0eXBlIG9mIGJlaW5nIGRlY29kZWQvZW5jb2RlZCAKKyAqLwordHlwZWRlZiBzdHJ1Y3QgT01YX1BBUkFNX0RBVEFVTklUVFlQRSB7CisgICAgT01YX1UzMiBuU2l6ZTsgICAgICAgICAgICAvKio8IFNpemUgb2YgdGhlIHN0cnVjdHVyZSBpbiBieXRlcyAqLworICAgIE9NWF9WRVJTSU9OVFlQRSBuVmVyc2lvbjsgLyoqPCBPTVggc3BlY2lmaWNhdGlvbiB2ZXJzaW9uIGluZm9ybWF0aW9uICovIAorICAgIE9NWF9VMzIgblBvcnRJbmRleDsgICAgICAgLyoqPCBQb3J0IHRoYXQgdGhpcyBzdHJ1Y3R1cmUgYXBwbGllcyB0byAqLworICAgIE9NWF9EQVRBVU5JVFRZUEUgZVVuaXRUeXBlOworICAgIE9NWF9EQVRBVU5JVEVOQ0FQU1VMQVRJT05UWVBFIGVFbmNhcHN1bGF0aW9uVHlwZTsKK30gT01YX1BBUkFNX0RBVEFVTklUVFlQRTsKKworCisvKioKKyAqIERlZmluZXMgZGl0aGVyIHR5cGVzIAorICovCit0eXBlZGVmIGVudW0gT01YX0RJVEhFUlRZUEUgeworICAgIE9NWF9EaXRoZXJOb25lLAorICAgIE9NWF9EaXRoZXJPcmRlcmVkLAorICAgIE9NWF9EaXRoZXJFcnJvckRpZmZ1c2lvbiwKKyAgICBPTVhfRGl0aGVyT3RoZXIsCisgICAgT01YX0RpdGhlcktocm9ub3NFeHRlbnNpb25zID0gMHg2RjAwMDAwMCwgLyoqPCBSZXNlcnZlZCByZWdpb24gZm9yIGludHJvZHVjaW5nIEtocm9ub3MgU3RhbmRhcmQgRXh0ZW5zaW9ucyAqLyAKKyAgICBPTVhfRGl0aGVyVmVuZG9yU3RhcnRVbnVzZWQgPSAweDdGMDAwMDAwLCAvKio8IFJlc2VydmVkIHJlZ2lvbiBmb3IgaW50cm9kdWNpbmcgVmVuZG9yIEV4dGVuc2lvbnMgKi8KKyAgICBPTVhfRGl0aGVyTWF4ID0gMHg3RkZGRkZGRgorfSBPTVhfRElUSEVSVFlQRTsKKworCisvKiogCisgKiBTdHJ1Y3R1cmUgdXNlZCB0byBjb25maWd1cmUgY3VycmVudCB0eXBlIG9mIGRpdGhlcmluZyAKKyAqLwordHlwZWRlZiBzdHJ1Y3QgT01YX0NPTkZJR19ESVRIRVJUWVBFIHsKKyAgICBPTVhfVTMyIG5TaXplOyAgICAgICAgICAgIC8qKjwgU2l6ZSBvZiB0aGUgc3RydWN0dXJlIGluIGJ5dGVzICovCisgICAgT01YX1ZFUlNJT05UWVBFIG5WZXJzaW9uOyAvKio8IE9NWCBzcGVjaWZpY2F0aW9uIHZlcnNpb24gaW5mb3JtYXRpb24gKi8gCisgICAgT01YX1UzMiBuUG9ydEluZGV4OyAgICAgICAvKio8IFBvcnQgdGhhdCB0aGlzIHN0cnVjdHVyZSBhcHBsaWVzIHRvICovCisgICAgT01YX0RJVEhFUlRZUEUgZURpdGhlcjsgICAvKio8IFR5cGUgb2YgZGl0aGVyaW5nIHRvIHVzZSAqLworfSBPTVhfQ09ORklHX0RJVEhFUlRZUEU7CisKK3R5cGVkZWYgc3RydWN0IE9NWF9DT05GSUdfQ0FQVFVSRU1PREVUWVBFIHsKKyAgICBPTVhfVTMyIG5TaXplOworICAgIE9NWF9WRVJTSU9OVFlQRSBuVmVyc2lvbjsKKyAgICBPTVhfVTMyIG5Qb3J0SW5kZXg7ICAgICAvKio8IFBvcnQgdGhhdCB0aGlzIHN0cnVjdHVyZSBhcHBsaWVzIHRvICovCisgICAgT01YX0JPT0wgYkNvbnRpbnVvdXM7ICAgLyoqPCBJZiB0cnVlIHRoZW4gaWdub3JlIGZyYW1lIHJhdGUgYW5kIGVtaXQgY2FwdHVyZSAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiAgIGRhdGEgYXMgZmFzdCBhcyBwb3NzaWJsZSAob3RoZXJ3aXNlIG9iZXkgcG9ydCdzIGZyYW1lIHJhdGUpLiAqLworICAgIE9NWF9CT09MIGJGcmFtZUxpbWl0ZWQ7IC8qKjwgSWYgdHJ1ZSB0aGVuIHRlcm1pbmF0ZSBjYXB0dXJlIGFmdGVyIHRoZSBwb3J0IGVtaXRzIHRoZSAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiAgIHNwZWNpZmllZCBudW1iZXIgb2YgZnJhbWVzIChvdGhlcndpc2UgdGhlIHBvcnQgZG9lcyBub3QgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogICB0ZXJtaW5hdGUgdGhlIGNhcHR1cmUgdW50aWwgaW5zdHJ1Y3RlZCB0byBkbyBzbyBieSB0aGUgY2xpZW50KS4gCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogICBFdmVuIGlmIHNldCwgdGhlIGNsaWVudCBtYXkgbWFudWFsbHkgdGVybWluYXRlIHRoZSBjYXB0dXJlIHByaW9yIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqICAgdG8gcmVhY2hpbmcgdGhlIGxpbWl0LiAqLworICAgIE9NWF9VMzIgbkZyYW1lTGltaXQ7ICAgICAgLyoqPCBMaW1pdCBvbiBudW1iZXIgb2YgZnJhbWVzIGVtaXR0ZWQgZHVyaW5nIGEgY2FwdHVyZSAob25seQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogICB2YWxpZCBpZiBiRnJhbWVMaW1pdGVkIGlzIHNldCkuICovCit9IE9NWF9DT05GSUdfQ0FQVFVSRU1PREVUWVBFOworCit0eXBlZGVmIGVudW0gT01YX01FVEVSSU5HVFlQRSB7CisgCisgICAgT01YX01ldGVyaW5nTW9kZUF2ZXJhZ2UsICAgICAvKio8IENlbnRlci13ZWlnaHRlZCBhdmVyYWdlIG1ldGVyaW5nLiAqLworICAgIE9NWF9NZXRlcmluZ01vZGVTcG90LCAgCSAgICAgIC8qKjwgU3BvdCAocGFydGlhbCkgbWV0ZXJpbmcuICovCisgICAgT01YX01ldGVyaW5nTW9kZU1hdHJpeCwgICAgICAvKio8IE1hdHJpeCBvciBldmFsdWF0aXZlIG1ldGVyaW5nLiAqLworIAorICAgIE9NWF9NZXRlcmluZ0tocm9ub3NFeHRlbnNpb25zID0gMHg2RjAwMDAwMCwgLyoqPCBSZXNlcnZlZCByZWdpb24gZm9yIGludHJvZHVjaW5nIEtocm9ub3MgU3RhbmRhcmQgRXh0ZW5zaW9ucyAqLyAKKyAgICBPTVhfTWV0ZXJpbmdWZW5kb3JTdGFydFVudXNlZCA9IDB4N0YwMDAwMDAsIC8qKjwgUmVzZXJ2ZWQgcmVnaW9uIGZvciBpbnRyb2R1Y2luZyBWZW5kb3IgRXh0ZW5zaW9ucyAqLworICAgIE9NWF9FVk1vZGVNYXggPSAweDdmZmZmZmZmCit9IE9NWF9NRVRFUklOR1RZUEU7CisgCit0eXBlZGVmIHN0cnVjdCBPTVhfQ09ORklHX0VYUE9TVVJFVkFMVUVUWVBFIHsKKyAgICBPTVhfVTMyIG5TaXplOworICAgIE9NWF9WRVJTSU9OVFlQRSBuVmVyc2lvbjsKKyAgICBPTVhfVTMyIG5Qb3J0SW5kZXg7CisgICAgT01YX01FVEVSSU5HVFlQRSBlTWV0ZXJpbmc7CisgICAgT01YX1MzMiB4RVZDb21wZW5zYXRpb247ICAgICAgLyoqPCBGaXhlZCBwb2ludCB2YWx1ZSBzdG9yZWQgYXMgUTE2ICovCisgICAgT01YX1UzMiBuQXBlcnR1cmVGTnVtYmVyOyAgICAgLyoqPCBlLmcuIG5BcGVydHVyZUZOdW1iZXIgPSAyIGltcGxpZXMgImYvMiIgLSBRMTYgZm9ybWF0ICovCisgICAgT01YX0JPT0wgYkF1dG9BcGVydHVyZTsJCS8qKjwgV2hldGhlciBhcGVydHVyZSBudW1iZXIgaXMgZGVmaW5lZCBhdXRvbWF0aWNhbGx5ICovCisgICAgT01YX1UzMiBuU2h1dHRlclNwZWVkTXNlYzsgICAgLyoqPCBTaHV0dGVyc3BlZWQgaW4gbWlsbGlzZWNvbmRzICovIAorICAgIE9NWF9CT09MIGJBdXRvU2h1dHRlclNwZWVkOwkvKio8IFdoZXRoZXIgc2h1dHRlciBzcGVlZCBpcyBkZWZpbmVkIGF1dG9tYXRpY2FsbHkgKi8gCisgICAgT01YX1UzMiBuU2Vuc2l0aXZpdHk7ICAgICAgICAgLyoqPCBlLmcuIG5TZW5zaXRpdml0eSA9IDEwMCBpbXBsaWVzICJJU08gMTAwIiAqLworICAgIE9NWF9CT09MIGJBdXRvU2Vuc2l0aXZpdHk7CS8qKjwgV2hldGhlciBzZW5zaXRpdml0eSBpcyBkZWZpbmVkIGF1dG9tYXRpY2FsbHkgKi8KK30gT01YX0NPTkZJR19FWFBPU1VSRVZBTFVFVFlQRTsKKworLyoqIAorICogRm9jdXMgcmVnaW9uIGNvbmZpZ3VyYXRpb24gCisgKgorICogU1RSVUNUIE1FTUJFUlM6CisgKiAgblNpemUgICAgICAgICAgIDogU2l6ZSBvZiB0aGUgc3RydWN0dXJlIGluIGJ5dGVzCisgKiAgblZlcnNpb24gICAgICAgIDogT01YIHNwZWNpZmljYXRpb24gdmVyc2lvbiBpbmZvcm1hdGlvbgorICogIG5Qb3J0SW5kZXggICAgICA6IFBvcnQgdGhhdCB0aGlzIHN0cnVjdHVyZSBhcHBsaWVzIHRvCisgKiAgYkNlbnRlciAgICAgICAgIDogVXNlIGNlbnRlciByZWdpb24gYXMgZm9jdXMgcmVnaW9uIG9mIGludGVyZXN0CisgKiAgYkxlZnQgICAgICAgICAgIDogVXNlIGxlZnQgcmVnaW9uIGFzIGZvY3VzIHJlZ2lvbiBvZiBpbnRlcmVzdAorICogIGJSaWdodCAgICAgICAgICA6IFVzZSByaWdodCByZWdpb24gYXMgZm9jdXMgcmVnaW9uIG9mIGludGVyZXN0CisgKiAgYlRvcCAgICAgICAgICAgIDogVXNlIHRvcCByZWdpb24gYXMgZm9jdXMgcmVnaW9uIG9mIGludGVyZXN0CisgKiAgYkJvdHRvbSAgICAgICAgIDogVXNlIGJvdHRvbSByZWdpb24gYXMgZm9jdXMgcmVnaW9uIG9mIGludGVyZXN0CisgKiAgYlRvcExlZnQgICAgICAgIDogVXNlIHRvcCBsZWZ0IHJlZ2lvbiBhcyBmb2N1cyByZWdpb24gb2YgaW50ZXJlc3QKKyAqICBiVG9wUmlnaHQgICAgICAgOiBVc2UgdG9wIHJpZ2h0IHJlZ2lvbiBhcyBmb2N1cyByZWdpb24gb2YgaW50ZXJlc3QKKyAqICBiQm90dG9tTGVmdCAgICAgOiBVc2UgYm90dG9tIGxlZnQgcmVnaW9uIGFzIGZvY3VzIHJlZ2lvbiBvZiBpbnRlcmVzdAorICogIGJCb3R0b21SaWdodCAgICA6IFVzZSBib3R0b20gcmlnaHQgcmVnaW9uIGFzIGZvY3VzIHJlZ2lvbiBvZiBpbnRlcmVzdAorICovCit0eXBlZGVmIHN0cnVjdCBPTVhfQ09ORklHX0ZPQ1VTUkVHSU9OVFlQRSB7CisgICAgT01YX1UzMiBuU2l6ZTsKKyAgICBPTVhfVkVSU0lPTlRZUEUgblZlcnNpb247CisgICAgT01YX1UzMiBuUG9ydEluZGV4OworICAgIE9NWF9CT09MIGJDZW50ZXI7CisgICAgT01YX0JPT0wgYkxlZnQ7CisgICAgT01YX0JPT0wgYlJpZ2h0OworICAgIE9NWF9CT09MIGJUb3A7CisgICAgT01YX0JPT0wgYkJvdHRvbTsKKyAgICBPTVhfQk9PTCBiVG9wTGVmdDsKKyAgICBPTVhfQk9PTCBiVG9wUmlnaHQ7CisgICAgT01YX0JPT0wgYkJvdHRvbUxlZnQ7CisgICAgT01YX0JPT0wgYkJvdHRvbVJpZ2h0OworfSBPTVhfQ09ORklHX0ZPQ1VTUkVHSU9OVFlQRTsKKworLyoqIAorICogRm9jdXMgU3RhdHVzIHR5cGUgCisgKi8KK3R5cGVkZWYgZW51bSBPTVhfRk9DVVNTVEFUVVNUWVBFIHsKKyAgICBPTVhfRm9jdXNTdGF0dXNPZmYgPSAwLAorICAgIE9NWF9Gb2N1c1N0YXR1c1JlcXVlc3QsCisgICAgT01YX0ZvY3VzU3RhdHVzUmVhY2hlZCwKKyAgICBPTVhfRm9jdXNTdGF0dXNVbmFibGVUb1JlYWNoLAorICAgIE9NWF9Gb2N1c1N0YXR1c0xvc3QsCisgICAgT01YX0ZvY3VzU3RhdHVzS2hyb25vc0V4dGVuc2lvbnMgPSAweDZGMDAwMDAwLCAvKio8IFJlc2VydmVkIHJlZ2lvbiBmb3IgaW50cm9kdWNpbmcgS2hyb25vcyBTdGFuZGFyZCBFeHRlbnNpb25zICovIAorICAgIE9NWF9Gb2N1c1N0YXR1c1ZlbmRvclN0YXJ0VW51c2VkID0gMHg3RjAwMDAwMCwgLyoqPCBSZXNlcnZlZCByZWdpb24gZm9yIGludHJvZHVjaW5nIFZlbmRvciBFeHRlbnNpb25zICovCisgICAgT01YX0ZvY3VzU3RhdHVzTWF4ID0gMHg3RkZGRkZGRgorfSBPTVhfRk9DVVNTVEFUVVNUWVBFOworCisvKiogCisgKiBGb2N1cyBzdGF0dXMgY29uZmlndXJhdGlvbiAKKyAqCisgKiBTVFJVQ1QgTUVNQkVSUzoKKyAqICBuU2l6ZSAgICAgICAgICAgICAgIDogU2l6ZSBvZiB0aGUgc3RydWN0dXJlIGluIGJ5dGVzCisgKiAgblZlcnNpb24gICAgICAgICAgICA6IE9NWCBzcGVjaWZpY2F0aW9uIHZlcnNpb24gaW5mb3JtYXRpb24KKyAqICBuUG9ydEluZGV4ICAgICAgICAgIDogUG9ydCB0aGF0IHRoaXMgc3RydWN0dXJlIGFwcGxpZXMgdG8KKyAqICBlRm9jdXNTdGF0dXMgICAgICAgIDogU3BlY2lmaWVzIHRoZSBmb2N1cyBzdGF0dXMKKyAqICBiQ2VudGVyU3RhdHVzICAgICAgIDogVXNlIGNlbnRlciByZWdpb24gYXMgZm9jdXMgcmVnaW9uIG9mIGludGVyZXN0CisgKiAgYkxlZnRTdGF0dXMgICAgICAgICA6IFVzZSBsZWZ0IHJlZ2lvbiBhcyBmb2N1cyByZWdpb24gb2YgaW50ZXJlc3QKKyAqICBiUmlnaHRTdGF0dXMgICAgICAgIDogVXNlIHJpZ2h0IHJlZ2lvbiBhcyBmb2N1cyByZWdpb24gb2YgaW50ZXJlc3QKKyAqICBiVG9wU3RhdHVzICAgICAgICAgIDogVXNlIHRvcCByZWdpb24gYXMgZm9jdXMgcmVnaW9uIG9mIGludGVyZXN0CisgKiAgYkJvdHRvbVN0YXR1cyAgICAgICA6IFVzZSBib3R0b20gcmVnaW9uIGFzIGZvY3VzIHJlZ2lvbiBvZiBpbnRlcmVzdAorICogIGJUb3BMZWZ0U3RhdHVzICAgICAgOiBVc2UgdG9wIGxlZnQgcmVnaW9uIGFzIGZvY3VzIHJlZ2lvbiBvZiBpbnRlcmVzdAorICogIGJUb3BSaWdodFN0YXR1cyAgICAgOiBVc2UgdG9wIHJpZ2h0IHJlZ2lvbiBhcyBmb2N1cyByZWdpb24gb2YgaW50ZXJlc3QKKyAqICBiQm90dG9tTGVmdFN0YXR1cyAgIDogVXNlIGJvdHRvbSBsZWZ0IHJlZ2lvbiBhcyBmb2N1cyByZWdpb24gb2YgaW50ZXJlc3QKKyAqICBiQm90dG9tUmlnaHRTdGF0dXMgIDogVXNlIGJvdHRvbSByaWdodCByZWdpb24gYXMgZm9jdXMgcmVnaW9uIG9mIGludGVyZXN0CisgKi8KK3R5cGVkZWYgc3RydWN0IE9NWF9QQVJBTV9GT0NVU1NUQVRVU1RZUEUgeworICAgIE9NWF9VMzIgblNpemU7CisgICAgT01YX1ZFUlNJT05UWVBFIG5WZXJzaW9uOworICAgIE9NWF9VMzIgblBvcnRJbmRleDsKKyAgICBPTVhfRk9DVVNTVEFUVVNUWVBFIGVGb2N1c1N0YXR1czsKKyAgICBPTVhfQk9PTCBiQ2VudGVyU3RhdHVzOworICAgIE9NWF9CT09MIGJMZWZ0U3RhdHVzOworICAgIE9NWF9CT09MIGJSaWdodFN0YXR1czsKKyAgICBPTVhfQk9PTCBiVG9wU3RhdHVzOworICAgIE9NWF9CT09MIGJCb3R0b21TdGF0dXM7CisgICAgT01YX0JPT0wgYlRvcExlZnRTdGF0dXM7CisgICAgT01YX0JPT0wgYlRvcFJpZ2h0U3RhdHVzOworICAgIE9NWF9CT09MIGJCb3R0b21MZWZ0U3RhdHVzOworICAgIE9NWF9CT09MIGJCb3R0b21SaWdodFN0YXR1czsKK30gT01YX1BBUkFNX0ZPQ1VTU1RBVFVTVFlQRTsKKworLyoqIEB9ICovCisKKyNpZmRlZiBfX2NwbHVzcGx1cworfQorI2VuZGlmIC8qIF9fY3BsdXNwbHVzICovCisKKyNlbmRpZgorLyogRmlsZSBFT0YgKi8KZGlmZiAtLWdpdCBhL2V4eW5vczQvbXVsdGltZWRpYS9vcGVubWF4L3NlY19vbXgvaW5jbHVkZS9raHJvbm9zL09NWF9JbWFnZS5oIGIvZXh5bm9zNC9tdWx0aW1lZGlhL29wZW5tYXgvc2VjX29teC9pbmNsdWRlL2tocm9ub3MvT01YX0ltYWdlLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTZkNDY2NgotLS0gL2Rldi9udWxsCisrKyBiL2V4eW5vczQvbXVsdGltZWRpYS9vcGVubWF4L3NlY19vbXgvaW5jbHVkZS9raHJvbm9zL09NWF9JbWFnZS5oCkBAIC0wLDAgKzEsMzI4IEBACisvKioKKyAqIENvcHlyaWdodCAoYykgMjAwOCBUaGUgS2hyb25vcyBHcm91cCBJbmMuIAorICogCisgKiBQZXJtaXNzaW9uIGlzIGhlcmVieSBncmFudGVkLCBmcmVlIG9mIGNoYXJnZSwgdG8gYW55IHBlcnNvbiBvYnRhaW5pbmcKKyAqIGEgY29weSBvZiB0aGlzIHNvZnR3YXJlIGFuZCBhc3NvY2lhdGVkIGRvY3VtZW50YXRpb24gZmlsZXMgKHRoZQorICogIlNvZnR3YXJlIiksIHRvIGRlYWwgaW4gdGhlIFNvZnR3YXJlIHdpdGhvdXQgcmVzdHJpY3Rpb24sIGluY2x1ZGluZworICogd2l0aG91dCBsaW1pdGF0aW9uIHRoZSByaWdodHMgdG8gdXNlLCBjb3B5LCBtb2RpZnksIG1lcmdlLCBwdWJsaXNoLAorICogZGlzdHJpYnV0ZSwgc3VibGljZW5zZSwgYW5kL29yIHNlbGwgY29waWVzIG9mIHRoZSBTb2Z0d2FyZSwgYW5kIHRvCisgKiBwZXJtaXQgcGVyc29ucyB0byB3aG9tIHRoZSBTb2Z0d2FyZSBpcyBmdXJuaXNoZWQgdG8gZG8gc28sIHN1YmplY3QKKyAqIHRvIHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczogCisgKiBUaGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBzaGFsbCBiZSBpbmNsdWRlZAorICogaW4gYWxsIGNvcGllcyBvciBzdWJzdGFudGlhbCBwb3J0aW9ucyBvZiB0aGUgU29mdHdhcmUuIAorICogCisgKiBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiwgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgRVhQUkVTUworICogT1IgSU1QTElFRCwgSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRCBUTyBUSEUgV0FSUkFOVElFUyBPRgorICogTUVSQ0hBTlRBQklMSVRZLCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQgTk9OSU5GUklOR0VNRU5ULgorICogSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFVVEhPUlMgT1IgQ09QWVJJR0hUIEhPTERFUlMgQkUgTElBQkxFIEZPUiBBTlkKKyAqIENMQUlNLCBEQU1BR0VTIE9SIE9USEVSIExJQUJJTElUWSwgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsCisgKiBUT1JUIE9SIE9USEVSV0lTRSwgQVJJU0lORyBGUk9NLCBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRQorICogU09GVFdBUkUgT1IgVEhFIFVTRSBPUiBPVEhFUiBERUFMSU5HUyBJTiBUSEUgU09GVFdBUkUuIAorICovCisKKy8qKiAKKyAqIEBmaWxlIE9NWF9JbWFnZS5oIC0gT3Blbk1heCBJTCB2ZXJzaW9uIDEuMS4yCisgKiBUaGUgc3RydWN0dXJlcyBuZWVkZWQgYnkgSW1hZ2UgY29tcG9uZW50cyB0byBleGNoYW5nZSBwYXJhbWV0ZXJzIGFuZCAKKyAqIGNvbmZpZ3VyYXRpb24gZGF0YSB3aXRoIHRoZSBjb21wb25lbnRzLgorICovCisjaWZuZGVmIE9NWF9JbWFnZV9oCisjZGVmaW5lIE9NWF9JbWFnZV9oCisKKyNpZmRlZiBfX2NwbHVzcGx1cworZXh0ZXJuICJDIiB7CisjZW5kaWYgLyogX19jcGx1c3BsdXMgKi8KKworCisvKioKKyAqIEVhY2ggT01YIGhlYWRlciBtdXN0IGluY2x1ZGUgYWxsIHJlcXVpcmVkIGhlYWRlciBmaWxlcyB0byBhbGxvdyB0aGUgCisgKiBoZWFkZXIgdG8gY29tcGlsZSB3aXRob3V0IGVycm9ycy4gIFRoZSBpbmNsdWRlcyBiZWxvdyBhcmUgcmVxdWlyZWQgIAorICogZm9yIHRoaXMgaGVhZGVyIGZpbGUgdG8gY29tcGlsZSBzdWNjZXNzZnVsbHkgCisgKi8KKworI2luY2x1ZGUgPE9NWF9JVkNvbW1vbi5oPgorCisvKiogQGRlZmdyb3VwIGltYWdpbmcgT3Blbk1BWCBJTCBJbWFnaW5nIERvbWFpbgorICogQGluZ3JvdXAgaXYKKyAqIFN0cnVjdHVyZXMgZm9yIE9wZW5NQVggSUwgSW1hZ2luZyBkb21haW4KKyAqIEB7CisgKi8KKworLyoqIAorICogRW51bWVyYXRpb24gdXNlZCB0byBkZWZpbmUgdGhlIHBvc3NpYmxlIGltYWdlIGNvbXByZXNzaW9uIGNvZGluZy4gCisgKi8KK3R5cGVkZWYgZW51bSBPTVhfSU1BR0VfQ09ESU5HVFlQRSB7CisgICAgT01YX0lNQUdFX0NvZGluZ1VudXNlZCwgICAgICAvKio8IFZhbHVlIHdoZW4gZm9ybWF0IGlzIE4vQSAqLworICAgIE9NWF9JTUFHRV9Db2RpbmdBdXRvRGV0ZWN0LCAgLyoqPCBBdXRvIGRldGVjdGlvbiBvZiBpbWFnZSBmb3JtYXQgKi8KKyAgICBPTVhfSU1BR0VfQ29kaW5nSlBFRywgICAgICAgIC8qKjwgSlBFRy9KRklGIGltYWdlIGZvcm1hdCAqLworICAgIE9NWF9JTUFHRV9Db2RpbmdKUEVHMkssICAgICAgLyoqPCBKUEVHIDIwMDAgaW1hZ2UgZm9ybWF0ICovCisgICAgT01YX0lNQUdFX0NvZGluZ0VYSUYsICAgICAgICAvKio8IEVYSUYgaW1hZ2UgZm9ybWF0ICovCisgICAgT01YX0lNQUdFX0NvZGluZ1RJRkYsICAgICAgICAvKio8IFRJRkYgaW1hZ2UgZm9ybWF0ICovCisgICAgT01YX0lNQUdFX0NvZGluZ0dJRiwgICAgICAgICAvKio8IEdyYXBoaWNzIGltYWdlIGZvcm1hdCAqLworICAgIE9NWF9JTUFHRV9Db2RpbmdQTkcsICAgICAgICAgLyoqPCBQTkcgaW1hZ2UgZm9ybWF0ICovCisgICAgT01YX0lNQUdFX0NvZGluZ0xaVywgICAgICAgICAvKio8IExaVyBpbWFnZSBmb3JtYXQgKi8KKyAgICBPTVhfSU1BR0VfQ29kaW5nQk1QLCAgICAgICAgIC8qKjwgV2luZG93cyBCaXRtYXAgZm9ybWF0ICovCisgICAgT01YX0lNQUdFX0NvZGluZ0tocm9ub3NFeHRlbnNpb25zID0gMHg2RjAwMDAwMCwgLyoqPCBSZXNlcnZlZCByZWdpb24gZm9yIGludHJvZHVjaW5nIEtocm9ub3MgU3RhbmRhcmQgRXh0ZW5zaW9ucyAqLyAKKyAgICBPTVhfSU1BR0VfQ29kaW5nVmVuZG9yU3RhcnRVbnVzZWQgPSAweDdGMDAwMDAwLCAvKio8IFJlc2VydmVkIHJlZ2lvbiBmb3IgaW50cm9kdWNpbmcgVmVuZG9yIEV4dGVuc2lvbnMgKi8KKyAgICBPTVhfSU1BR0VfQ29kaW5nTWF4ID0gMHg3RkZGRkZGRgorfSBPTVhfSU1BR0VfQ09ESU5HVFlQRTsKKworCisvKioKKyAqIERhdGEgc3RydWN0dXJlIHVzZWQgdG8gZGVmaW5lIGFuIGltYWdlIHBhdGguIFRoZSBudW1iZXIgb2YgaW1hZ2UgcGF0aHMgCisgKiBmb3IgaW5wdXQgYW5kIG91dHB1dCB3aWxsIHZhcnkgYnkgdHlwZSBvZiB0aGUgaW1hZ2UgY29tcG9uZW50LiAgCisgKiAKKyAqICBJbnB1dCAoYWthIFNvdXJjZSkgOiBaZXJvIElucHV0cywgb25lIE91dHB1dCwKKyAqICBTcGxpdHRlciAgICAgICAgICAgOiBPbmUgSW5wdXQsIDIgb3IgbW9yZSBPdXRwdXRzLAorICogIFByb2Nlc3NpbmcgRWxlbWVudCA6IE9uZSBJbnB1dCwgb25lIG91dHB1dCwKKyAqICBNaXhlciAgICAgICAgICAgICAgOiAyIG9yIG1vcmUgaW5wdXRzLCBvbmUgb3V0cHV0LAorICogIE91dHB1dCAoYWthIFNpbmspICA6IE9uZSBJbnB1dCwgemVybyBvdXRwdXRzLgorICogCisgKiBUaGUgUG9ydERlZmluaXRpb24gc3RydWN0dXJlIGlzIHVzZWQgdG8gZGVmaW5lIGFsbCBvZiB0aGUgcGFyYW1ldGVycyAKKyAqIG5lY2Vzc2FyeSBmb3IgdGhlIGNvbXBsaWFudCBjb21wb25lbnQgdG8gc2V0dXAgYW4gaW5wdXQgb3IgYW4gb3V0cHV0ICAKKyAqIGltYWdlIHBhdGguICBJZiBhZGRpdGlvbmFsIHZlbmRvciBzcGVjaWZpYyBkYXRhIGlzIHJlcXVpcmVkLCBpdCBzaG91bGQgIAorICogYmUgdHJhbnNtaXR0ZWQgdG8gdGhlIGNvbXBvbmVudCB1c2luZyB0aGUgQ3VzdG9tQ29tbWFuZCBmdW5jdGlvbi4gICAKKyAqIENvbXBsaWFudCBjb21wb25lbnRzIHdpbGwgcHJlcG9wdWxhdGUgdGhpcyBzdHJ1Y3R1cmUgd2l0aCBvcHRpbWFsICAKKyAqIHZhbHVlcyBkdXJpbmcgdGhlIE9NWF9HZXRQYXJhbWV0ZXIoKSBjb21tYW5kLgorICoKKyAqIFNUUlVDVCBNRU1CRVJTOgorICogIGNNSU1FVHlwZSAgICAgICAgICAgICA6IE1JTUUgdHlwZSBvZiBkYXRhIGZvciB0aGUgcG9ydAorICogIHBOYXRpdmVSZW5kZXIgICAgICAgICA6IFBsYXRmb3JtIHNwZWNpZmljIHJlZmVyZW5jZSBmb3IgYSBkaXNwbGF5IGlmIGEgCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgc3luYywgb3RoZXJ3aXNlIHRoaXMgZmllbGQgaXMgMAorICogIG5GcmFtZVdpZHRoICAgICAgICAgICA6IFdpZHRoIG9mIGZyYW1lIHRvIGJlIHVzZWQgb24gcG9ydCBpZiAKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICB1bmNvbXByZXNzZWQgZm9ybWF0IGlzIHVzZWQuICBVc2UgMCBmb3IgCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgdW5rbm93biwgZG9uJ3QgY2FyZSBvciB2YXJpYWJsZQorICogIG5GcmFtZUhlaWdodCAgICAgICAgICA6IEhlaWdodCBvZiBmcmFtZSB0byBiZSB1c2VkIG9uIHBvcnQgaWYgCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgdW5jb21wcmVzc2VkIGZvcm1hdCBpcyB1c2VkLiBVc2UgMCBmb3IgCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgdW5rbm93biwgZG9uJ3QgY2FyZSBvciB2YXJpYWJsZQorICogIG5TdHJpZGUgICAgICAgICAgICAgICA6IE51bWJlciBvZiBieXRlcyBwZXIgc3BhbiBvZiBhbiBpbWFnZSAoaS5lLiAKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICBpbmRpY2F0ZXMgdGhlIG51bWJlciBvZiBieXRlcyB0byBnZXQgZnJvbQorICogICAgICAgICAgICAgICAgICAgICAgICAgIHNwYW4gTiB0byBzcGFuIE4rMSwgd2hlcmUgbmVnYXRpdmUgc3RyaWRlIAorICogICAgICAgICAgICAgICAgICAgICAgICAgIGluZGljYXRlcyB0aGUgaW1hZ2UgaXMgYm90dG9tIHVwCisgKiAgblNsaWNlSGVpZ2h0ICAgICAgICAgIDogSGVpZ2h0IHVzZWQgd2hlbiBlbmNvZGluZyBpbiBzbGljZXMKKyAqICBiRmxhZ0Vycm9yQ29uY2VhbG1lbnQgOiBUdXJucyBvbiBlcnJvciBjb25jZWFsbWVudCBpZiBpdCBpcyBzdXBwb3J0ZWQgYnkgCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgdGhlIE9NWCBjb21wb25lbnQKKyAqICBlQ29tcHJlc3Npb25Gb3JtYXQgICAgOiBDb21wcmVzc2lvbiBmb3JtYXQgdXNlZCBpbiB0aGlzIGluc3RhbmNlIG9mICAKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICB0aGUgY29tcG9uZW50LiBXaGVuIE9NWF9JTUFHRV9Db2RpbmdVbnVzZWQgaXMgCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgc3BlY2lmaWVkLCBlQ29sb3JGb3JtYXQgaXMgdmFsaWQKKyAqICBlQ29sb3JGb3JtYXQgICAgICAgICAgOiBEZWNvbXByZXNzZWQgZm9ybWF0IHVzZWQgYnkgdGhpcyBjb21wb25lbnQKKyAqICBwTmF0aXZlV2luZG93ICAgICAgICAgOiBQbGF0Zm9ybSBzcGVjaWZpYyByZWZlcmVuY2UgZm9yIGEgd2luZG93IG9iamVjdCBpZiBhIAorICogICAgICAgICAgICAgICAgICAgICAgICAgIGRpc3BsYXkgc2luayAsIG90aGVyd2lzZSB0aGlzIGZpZWxkIGlzIDB4MC4gCisgKi8KK3R5cGVkZWYgc3RydWN0IE9NWF9JTUFHRV9QT1JUREVGSU5JVElPTlRZUEUgeworICAgIE9NWF9TVFJJTkcgY01JTUVUeXBlOworICAgIE9NWF9OQVRJVkVfREVWSUNFVFlQRSBwTmF0aXZlUmVuZGVyOworICAgIE9NWF9VMzIgbkZyYW1lV2lkdGg7IAorICAgIE9NWF9VMzIgbkZyYW1lSGVpZ2h0OworICAgIE9NWF9TMzIgblN0cmlkZTsgICAgIAorICAgIE9NWF9VMzIgblNsaWNlSGVpZ2h0OworICAgIE9NWF9CT09MIGJGbGFnRXJyb3JDb25jZWFsbWVudDsKKyAgICBPTVhfSU1BR0VfQ09ESU5HVFlQRSBlQ29tcHJlc3Npb25Gb3JtYXQ7CisgICAgT01YX0NPTE9SX0ZPUk1BVFRZUEUgZUNvbG9yRm9ybWF0OworICAgIE9NWF9OQVRJVkVfV0lORE9XVFlQRSBwTmF0aXZlV2luZG93OworfSBPTVhfSU1BR0VfUE9SVERFRklOSVRJT05UWVBFOworCisKKy8qKiAgCisgKiBQb3J0IGZvcm1hdCBwYXJhbWV0ZXIuICBUaGlzIHN0cnVjdHVyZSBpcyB1c2VkIHRvIGVudW1lcmF0ZSB0aGUgdmFyaW91cyAKKyAqIGRhdGEgaW5wdXQvb3V0cHV0IGZvcm1hdCBzdXBwb3J0ZWQgYnkgdGhlIHBvcnQuCisgKiAKKyAqIFNUUlVDVCBNRU1CRVJTOgorICogIG5TaXplICAgICAgICAgICAgICA6IFNpemUgb2YgdGhlIHN0cnVjdHVyZSBpbiBieXRlcworICogIG5WZXJzaW9uICAgICAgICAgICA6IE9NWCBzcGVjaWZpY2F0aW9uIHZlcnNpb24gaW5mb3JtYXRpb24KKyAqICBuUG9ydEluZGV4ICAgICAgICAgOiBJbmRpY2F0ZXMgd2hpY2ggcG9ydCB0byBzZXQKKyAqICBuSW5kZXggICAgICAgICAgICAgOiBJbmRpY2F0ZXMgdGhlIGVudW1lcmF0aW9uIGluZGV4IGZvciB0aGUgZm9ybWF0IGZyb20gCisgKiAgICAgICAgICAgICAgICAgICAgICAgMHgwIHRvIE4tMQorICogIGVDb21wcmVzc2lvbkZvcm1hdCA6IENvbXByZXNzaW9uIGZvcm1hdCB1c2VkIGluIHRoaXMgaW5zdGFuY2Ugb2YgdGhlIAorICogICAgICAgICAgICAgICAgICAgICAgIGNvbXBvbmVudC4gV2hlbiBPTVhfSU1BR0VfQ29kaW5nVW51c2VkIGlzIHNwZWNpZmllZCwgCisgKiAgICAgICAgICAgICAgICAgICAgICAgZUNvbG9yRm9ybWF0IGlzIHZhbGlkCisgKiAgZUNvbG9yRm9ybWF0ICAgICAgIDogRGVjb21wcmVzc2VkIGZvcm1hdCB1c2VkIGJ5IHRoaXMgY29tcG9uZW50CisgKi8KK3R5cGVkZWYgc3RydWN0IE9NWF9JTUFHRV9QQVJBTV9QT1JURk9STUFUVFlQRSB7CisgICAgT01YX1UzMiBuU2l6ZTsKKyAgICBPTVhfVkVSU0lPTlRZUEUgblZlcnNpb247CisgICAgT01YX1UzMiBuUG9ydEluZGV4OworICAgIE9NWF9VMzIgbkluZGV4OworICAgIE9NWF9JTUFHRV9DT0RJTkdUWVBFIGVDb21wcmVzc2lvbkZvcm1hdDsKKyAgICBPTVhfQ09MT1JfRk9STUFUVFlQRSBlQ29sb3JGb3JtYXQ7Cit9IE9NWF9JTUFHRV9QQVJBTV9QT1JURk9STUFUVFlQRTsKKworCisvKiogCisgKiBGbGFzaCBjb250cm9sIHR5cGUgCisgKgorICogRU5VTVMKKyAqICBUb3JjaCA6IEZsYXNoIGZvcmNlZCBjb25zdGFudGx5IG9uCisgKi8KK3R5cGVkZWYgZW51bSBPTVhfSU1BR0VfRkxBU0hDT05UUk9MVFlQRSB7CisgICAgT01YX0lNQUdFX0ZsYXNoQ29udHJvbE9uID0gMCwKKyAgICBPTVhfSU1BR0VfRmxhc2hDb250cm9sT2ZmLAorICAgIE9NWF9JTUFHRV9GbGFzaENvbnRyb2xBdXRvLAorICAgIE9NWF9JTUFHRV9GbGFzaENvbnRyb2xSZWRFeWVSZWR1Y3Rpb24sCisgICAgT01YX0lNQUdFX0ZsYXNoQ29udHJvbEZpbGxpbiwKKyAgICBPTVhfSU1BR0VfRmxhc2hDb250cm9sVG9yY2gsCisgICAgT01YX0lNQUdFX0ZsYXNoQ29udHJvbEtocm9ub3NFeHRlbnNpb25zID0gMHg2RjAwMDAwMCwgLyoqPCBSZXNlcnZlZCByZWdpb24gZm9yIGludHJvZHVjaW5nIEtocm9ub3MgU3RhbmRhcmQgRXh0ZW5zaW9ucyAqLyAKKyAgICBPTVhfSU1BR0VfRmxhc2hDb250cm9sVmVuZG9yU3RhcnRVbnVzZWQgPSAweDdGMDAwMDAwLCAvKio8IFJlc2VydmVkIHJlZ2lvbiBmb3IgaW50cm9kdWNpbmcgVmVuZG9yIEV4dGVuc2lvbnMgKi8KKyAgICBPTVhfSU1BR0VfRmxhc2hDb250cm9sTWF4ID0gMHg3RkZGRkZGRgorfSBPTVhfSU1BR0VfRkxBU0hDT05UUk9MVFlQRTsKKworCisvKiogCisgKiBGbGFzaCBjb250cm9sIGNvbmZpZ3VyYXRpb24gCisgKgorICogU1RSVUNUIE1FTUJFUlM6CisgKiAgblNpemUgICAgICAgICA6IFNpemUgb2YgdGhlIHN0cnVjdHVyZSBpbiBieXRlcworICogIG5WZXJzaW9uICAgICAgOiBPTVggc3BlY2lmaWNhdGlvbiB2ZXJzaW9uIGluZm9ybWF0aW9uCisgKiAgblBvcnRJbmRleCAgICA6IFBvcnQgdGhhdCB0aGlzIHN0cnVjdHVyZSBhcHBsaWVzIHRvCisgKiAgZUZsYXNoQ29udHJvbCA6IEZsYXNoIGNvbnRyb2wgdHlwZQorICovCit0eXBlZGVmIHN0cnVjdCBPTVhfSU1BR0VfUEFSQU1fRkxBU0hDT05UUk9MVFlQRSB7CisgICAgT01YX1UzMiBuU2l6ZTsKKyAgICBPTVhfVkVSU0lPTlRZUEUgblZlcnNpb247CisgICAgT01YX1UzMiBuUG9ydEluZGV4OworICAgIE9NWF9JTUFHRV9GTEFTSENPTlRST0xUWVBFIGVGbGFzaENvbnRyb2w7Cit9IE9NWF9JTUFHRV9QQVJBTV9GTEFTSENPTlRST0xUWVBFOworCisKKy8qKiAKKyAqIEZvY3VzIGNvbnRyb2wgdHlwZSAKKyAqLwordHlwZWRlZiBlbnVtIE9NWF9JTUFHRV9GT0NVU0NPTlRST0xUWVBFIHsKKyAgICBPTVhfSU1BR0VfRm9jdXNDb250cm9sT24gPSAwLAorICAgIE9NWF9JTUFHRV9Gb2N1c0NvbnRyb2xPZmYsCisgICAgT01YX0lNQUdFX0ZvY3VzQ29udHJvbEF1dG8sCisgICAgT01YX0lNQUdFX0ZvY3VzQ29udHJvbEF1dG9Mb2NrLAorICAgIE9NWF9JTUFHRV9Gb2N1c0NvbnRyb2xLaHJvbm9zRXh0ZW5zaW9ucyA9IDB4NkYwMDAwMDAsIC8qKjwgUmVzZXJ2ZWQgcmVnaW9uIGZvciBpbnRyb2R1Y2luZyBLaHJvbm9zIFN0YW5kYXJkIEV4dGVuc2lvbnMgKi8gCisgICAgT01YX0lNQUdFX0ZvY3VzQ29udHJvbFZlbmRvclN0YXJ0VW51c2VkID0gMHg3RjAwMDAwMCwgLyoqPCBSZXNlcnZlZCByZWdpb24gZm9yIGludHJvZHVjaW5nIFZlbmRvciBFeHRlbnNpb25zICovCisgICAgT01YX0lNQUdFX0ZvY3VzQ29udHJvbE1heCA9IDB4N0ZGRkZGRkYKK30gT01YX0lNQUdFX0ZPQ1VTQ09OVFJPTFRZUEU7CisKKyAKKy8qKiAKKyAqIEZvY3VzIGNvbnRyb2wgY29uZmlndXJhdGlvbiAKKyAqCisgKiBTVFJVQ1QgTUVNQkVSUzoKKyAqICBuU2l6ZSAgICAgICAgICAgOiBTaXplIG9mIHRoZSBzdHJ1Y3R1cmUgaW4gYnl0ZXMKKyAqICBuVmVyc2lvbiAgICAgICAgOiBPTVggc3BlY2lmaWNhdGlvbiB2ZXJzaW9uIGluZm9ybWF0aW9uCisgKiAgblBvcnRJbmRleCAgICAgIDogUG9ydCB0aGF0IHRoaXMgc3RydWN0dXJlIGFwcGxpZXMgdG8KKyAqICBlRm9jdXNDb250cm9sICAgOiBGb2N1cyBjb250cm9sCisgKiAgbkZvY3VzU3RlcHMgICAgIDogRm9jdXMgY2FuIHRha2Ugb24gdmFsdWVzIGZyb20gMCBtbSB0byBpbmZpbml0eS4gCisgKiAgICAgICAgICAgICAgICAgICAgSW50ZXJlc3QgaXMgb25seSBpbiBudW1iZXIgb2Ygc3RlcHMgb3ZlciB0aGlzIHJhbmdlLgorICogIG5Gb2N1c1N0ZXBJbmRleCA6IEN1cnJlbnQgZm9jdXMgc3RlcCBpbmRleAorICovCit0eXBlZGVmIHN0cnVjdCBPTVhfSU1BR0VfQ09ORklHX0ZPQ1VTQ09OVFJPTFRZUEUgeworICAgIE9NWF9VMzIgblNpemU7CisgICAgT01YX1ZFUlNJT05UWVBFIG5WZXJzaW9uOworICAgIE9NWF9VMzIgblBvcnRJbmRleDsKKyAgICBPTVhfSU1BR0VfRk9DVVNDT05UUk9MVFlQRSBlRm9jdXNDb250cm9sOworICAgIE9NWF9VMzIgbkZvY3VzU3RlcHM7CisgICAgT01YX1UzMiBuRm9jdXNTdGVwSW5kZXg7Cit9IE9NWF9JTUFHRV9DT05GSUdfRk9DVVNDT05UUk9MVFlQRTsKKworCisvKiogCisgKiBRIEZhY3RvciBmb3IgSlBFRyBjb21wcmVzc2lvbiwgd2hpY2ggY29udHJvbHMgdGhlIHRyYWRlb2ZmIGJldHdlZW4gaW1hZ2UKKyAqIHF1YWxpdHkgYW5kIHNpemUuICBRIEZhY3RvciBwcm92aWRlcyBhIG1vcmUgc2ltcGxlIG1lYW5zIG9mIGNvbnRyb2xsaW5nCisgKiBKUEVHIGNvbXByZXNzaW9uIHF1YWxpdHksIHdpdGhvdXQgZGlyZWN0bHkgcHJvZ3JhbW1pbmcgUXVhbnRpemF0aW9uCisgKiB0YWJsZXMgZm9yIGNocm9tYSBhbmQgbHVtYSAKKyAqCisgKiBTVFJVQ1QgTUVNQkVSUzoKKyAqICBuU2l6ZSAgICAgIDogU2l6ZSBvZiB0aGUgc3RydWN0dXJlIGluIGJ5dGVzICAgICAgICAgCisgKiAgblZlcnNpb24gICA6IE9NWCBzcGVjaWZpY2F0aW9uIHZlcnNpb24gaW5mb3JtYXRpb24gCisgKiAgblBvcnRJbmRleCA6IFBvcnQgdGhhdCB0aGlzIHN0cnVjdHVyZSBhcHBsaWVzIHRvIAorICogIG5RRmFjdG9yICAgOiBKUEVHIFEgZmFjdG9yIHZhbHVlIGluIHRoZSByYW5nZSBvZiAxLTEwMC4gQSBmYWN0b3Igb2YgMSAKKyAqICAgICAgICAgICAgICAgcHJvZHVjZXMgdGhlIHNtYWxsZXN0LCB3b3JzdCBxdWFsaXR5IGltYWdlcywgYW5kIGEgZmFjdG9yIAorICogICAgICAgICAgICAgICBvZiAxMDAgcHJvZHVjZXMgdGhlIGxhcmdlc3QsIGJlc3QgcXVhbGl0eSBpbWFnZXMuICBBIAorICogICAgICAgICAgICAgICB0eXBpY2FsIGRlZmF1bHQgaXMgNzUgZm9yIHNtYWxsIGdvb2QgcXVhbGl0eSBpbWFnZXMgICAgICAgICAgICAgICAKKyAqLwordHlwZWRlZiBzdHJ1Y3QgT01YX0lNQUdFX1BBUkFNX1FGQUNUT1JUWVBFIHsKKyAgICBPTVhfVTMyIG5TaXplOyAgICAgICAgICAgIAorICAgIE9NWF9WRVJTSU9OVFlQRSBuVmVyc2lvbjsgCisgICAgT01YX1UzMiBuUG9ydEluZGV4OyAgICAgICAKKyAgICBPTVhfVTMyIG5RRmFjdG9yOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKK30gT01YX0lNQUdFX1BBUkFNX1FGQUNUT1JUWVBFOworCisvKiogCisgKiBRdWFudGl6YXRpb24gdGFibGUgdHlwZSAKKyAqLworCit0eXBlZGVmIGVudW0gT01YX0lNQUdFX1FVQU5USVpBVElPTlRBQkxFVFlQRSB7CisgICAgT01YX0lNQUdFX1F1YW50aXphdGlvblRhYmxlTHVtYSA9IDAsCisgICAgT01YX0lNQUdFX1F1YW50aXphdGlvblRhYmxlQ2hyb21hLAorICAgIE9NWF9JTUFHRV9RdWFudGl6YXRpb25UYWJsZUNocm9tYUNiLAorICAgIE9NWF9JTUFHRV9RdWFudGl6YXRpb25UYWJsZUNocm9tYUNyLAorICAgIE9NWF9JTUFHRV9RdWFudGl6YXRpb25UYWJsZUtocm9ub3NFeHRlbnNpb25zID0gMHg2RjAwMDAwMCwgLyoqPCBSZXNlcnZlZCByZWdpb24gZm9yIGludHJvZHVjaW5nIEtocm9ub3MgU3RhbmRhcmQgRXh0ZW5zaW9ucyAqLyAKKyAgICBPTVhfSU1BR0VfUXVhbnRpemF0aW9uVGFibGVWZW5kb3JTdGFydFVudXNlZCA9IDB4N0YwMDAwMDAsIC8qKjwgUmVzZXJ2ZWQgcmVnaW9uIGZvciBpbnRyb2R1Y2luZyBWZW5kb3IgRXh0ZW5zaW9ucyAqLworICAgIE9NWF9JTUFHRV9RdWFudGl6YXRpb25UYWJsZU1heCA9IDB4N0ZGRkZGRkYKK30gT01YX0lNQUdFX1FVQU5USVpBVElPTlRBQkxFVFlQRTsKKworLyoqIAorICogSlBFRyBxdWFudGl6YXRpb24gdGFibGVzIGFyZSB1c2VkIHRvIGRldGVybWluZSBEQ1QgY29tcHJlc3Npb24gZm9yCisgKiBZVVYgZGF0YSwgYXMgYW4gYWx0ZXJuYXRpdmUgdG8gc3BlY2lmeWluZyBRIGZhY3RvciwgcHJvdmlkaW5nIGV4YWN0IAorICogY29udHJvbCBvZiBjb21wcmVzc2lvbiAKKyAqCisgKiBTVFJVQ1QgTUVNQkVSUzoKKyAqICBuU2l6ZSAgICAgICAgICAgICAgICAgICA6IFNpemUgb2YgdGhlIHN0cnVjdHVyZSBpbiBieXRlcworICogIG5WZXJzaW9uICAgICAgICAgICAgICAgIDogT01YIHNwZWNpZmljYXRpb24gdmVyc2lvbiBpbmZvcm1hdGlvbiAKKyAqICBuUG9ydEluZGV4ICAgICAgICAgICAgICA6IFBvcnQgdGhhdCB0aGlzIHN0cnVjdHVyZSBhcHBsaWVzIHRvCisgKiAgZVF1YW50aXphdGlvblRhYmxlICAgICAgOiBRdWFudGl6YXRpb24gdGFibGUgdHlwZQorICogIG5RdWFudGl6YXRpb25NYXRyaXhbNjRdIDogSlBFRyBxdWFudGl6YXRpb24gdGFibGUgb2YgY29lZmZpY2llbnRzIHN0b3JlZCAKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluIGluY3JlYXNpbmcgY29sdW1ucyB0aGVuIGJ5IHJvd3Mgb2YgZGF0YSAoaS5lLiAKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJvdyAxLCAuLi4gcm93IDgpLiBRdWFudGl6YXRpb24gdmFsdWVzIGFyZSBpbiAKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoZSByYW5nZSAwLTI1NSBhbmQgc3RvcmVkIGluIGxpbmVhciBvcmRlcgorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgKGkuZS4gdGhlIGNvbXBvbmVudCB3aWxsIHppZy16YWcgdGhlIAorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgcXVhbnRpemF0aW9uIHRhYmxlIGRhdGEgaWYgcmVxdWlyZWQgaW50ZXJuYWxseSkgCisgKi8KK3R5cGVkZWYgc3RydWN0IE9NWF9JTUFHRV9QQVJBTV9RVUFOVElaQVRJT05UQUJMRVRZUEUgeworICAgIE9NWF9VMzIgblNpemU7CisgICAgT01YX1ZFUlNJT05UWVBFIG5WZXJzaW9uOworICAgIE9NWF9VMzIgblBvcnRJbmRleDsKKyAgICBPTVhfSU1BR0VfUVVBTlRJWkFUSU9OVEFCTEVUWVBFIGVRdWFudGl6YXRpb25UYWJsZTsKKyAgICBPTVhfVTggblF1YW50aXphdGlvbk1hdHJpeFs2NF07Cit9IE9NWF9JTUFHRV9QQVJBTV9RVUFOVElaQVRJT05UQUJMRVRZUEU7CisKKworLyoqIAorICogSHVmZm1hbiB0YWJsZSB0eXBlLCB0aGUgc2FtZSBIdWZmbWFuIHRhYmxlIGlzIGFwcGxpZWQgZm9yIGNocm9tYSBhbmQgCisgKiBsdW1hIGNvbXBvbmVudCAKKyAqLwordHlwZWRlZiBlbnVtIE9NWF9JTUFHRV9IVUZGTUFOVEFCTEVUWVBFIHsKKyAgICBPTVhfSU1BR0VfSHVmZm1hblRhYmxlQUMgPSAwLAorICAgIE9NWF9JTUFHRV9IdWZmbWFuVGFibGVEQywKKyAgICBPTVhfSU1BR0VfSHVmZm1hblRhYmxlQUNMdW1hLAorICAgIE9NWF9JTUFHRV9IdWZmbWFuVGFibGVBQ0Nocm9tYSwKKyAgICBPTVhfSU1BR0VfSHVmZm1hblRhYmxlRENMdW1hLAorICAgIE9NWF9JTUFHRV9IdWZmbWFuVGFibGVEQ0Nocm9tYSwKKyAgICBPTVhfSU1BR0VfSHVmZm1hblRhYmxlS2hyb25vc0V4dGVuc2lvbnMgPSAweDZGMDAwMDAwLCAvKio8IFJlc2VydmVkIHJlZ2lvbiBmb3IgaW50cm9kdWNpbmcgS2hyb25vcyBTdGFuZGFyZCBFeHRlbnNpb25zICovIAorICAgIE9NWF9JTUFHRV9IdWZmbWFuVGFibGVWZW5kb3JTdGFydFVudXNlZCA9IDB4N0YwMDAwMDAsIC8qKjwgUmVzZXJ2ZWQgcmVnaW9uIGZvciBpbnRyb2R1Y2luZyBWZW5kb3IgRXh0ZW5zaW9ucyAqLworICAgIE9NWF9JTUFHRV9IdWZmbWFuVGFibGVNYXggPSAweDdGRkZGRkZGCit9IE9NWF9JTUFHRV9IVUZGTUFOVEFCTEVUWVBFOworCisvKiogCisgKiBKUEVHIEh1ZmZtYW4gdGFibGUgCisgKgorICogU1RSVUNUIE1FTUJFUlM6CisgKiAgblNpemUgICAgICAgICAgICAgICAgICAgICAgICAgICAgOiBTaXplIG9mIHRoZSBzdHJ1Y3R1cmUgaW4gYnl0ZXMKKyAqICBuVmVyc2lvbiAgICAgICAgICAgICAgICAgICAgICAgICA6IE9NWCBzcGVjaWZpY2F0aW9uIHZlcnNpb24gaW5mb3JtYXRpb24KKyAqICBuUG9ydEluZGV4ICAgICAgICAgICAgICAgICAgICAgICA6IFBvcnQgdGhhdCB0aGlzIHN0cnVjdHVyZSBhcHBsaWVzIHRvCisgKiAgZUh1ZmZtYW5UYWJsZSAgICAgICAgICAgICAgICAgICAgOiBIdWZmbWFuIHRhYmxlIHR5cGUKKyAqICBuTnVtYmVyT2ZIdWZmbWFuQ29kZU9mTGVuZ3RoWzE2XSA6IDAtMTYsIG51bWJlciBvZiBIdWZmbWFuIGNvZGVzIG9mIGVhY2ggCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwb3NzaWJsZSBsZW5ndGgKKyAqICBuSHVmZm1hblRhYmxlWzI1Nl0gICAgICAgICAgICAgICA6IDAtMjU1LCB0aGUgc2l6ZSB1c2VkIGZvciBBQyBhbmQgREMgCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBIdWZmbWFuVGFibGUgYXJlIDE2IGFuZCAxNjIgCisgKi8KK3R5cGVkZWYgc3RydWN0IE9NWF9JTUFHRV9QQVJBTV9IVUZGTUFOVFRBQkxFVFlQRSB7CisgICAgT01YX1UzMiBuU2l6ZTsKKyAgICBPTVhfVkVSU0lPTlRZUEUgblZlcnNpb247CisgICAgT01YX1UzMiBuUG9ydEluZGV4OworICAgIE9NWF9JTUFHRV9IVUZGTUFOVEFCTEVUWVBFIGVIdWZmbWFuVGFibGU7CisgICAgT01YX1U4IG5OdW1iZXJPZkh1ZmZtYW5Db2RlT2ZMZW5ndGhbMTZdOworICAgIE9NWF9VOCBuSHVmZm1hblRhYmxlWzI1Nl07Cit9T01YX0lNQUdFX1BBUkFNX0hVRkZNQU5UVEFCTEVUWVBFOworCisvKiogQH0gKi8KKyNpZmRlZiBfX2NwbHVzcGx1cworfQorI2VuZGlmIC8qIF9fY3BsdXNwbHVzICovCisKKyNlbmRpZgorLyogRmlsZSBFT0YgKi8KZGlmZiAtLWdpdCBhL2V4eW5vczQvbXVsdGltZWRpYS9vcGVubWF4L3NlY19vbXgvaW5jbHVkZS9raHJvbm9zL09NWF9JbmRleC5oIGIvZXh5bm9zNC9tdWx0aW1lZGlhL29wZW5tYXgvc2VjX29teC9pbmNsdWRlL2tocm9ub3MvT01YX0luZGV4LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDRkNGVhNwotLS0gL2Rldi9udWxsCisrKyBiL2V4eW5vczQvbXVsdGltZWRpYS9vcGVubWF4L3NlY19vbXgvaW5jbHVkZS9raHJvbm9zL09NWF9JbmRleC5oCkBAIC0wLDAgKzEsMjU4IEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDA4IFRoZSBLaHJvbm9zIEdyb3VwIEluYy4gCisgKiAKKyAqIFBlcm1pc3Npb24gaXMgaGVyZWJ5IGdyYW50ZWQsIGZyZWUgb2YgY2hhcmdlLCB0byBhbnkgcGVyc29uIG9idGFpbmluZworICogYSBjb3B5IG9mIHRoaXMgc29mdHdhcmUgYW5kIGFzc29jaWF0ZWQgZG9jdW1lbnRhdGlvbiBmaWxlcyAodGhlCisgKiAiU29mdHdhcmUiKSwgdG8gZGVhbCBpbiB0aGUgU29mdHdhcmUgd2l0aG91dCByZXN0cmljdGlvbiwgaW5jbHVkaW5nCisgKiB3aXRob3V0IGxpbWl0YXRpb24gdGhlIHJpZ2h0cyB0byB1c2UsIGNvcHksIG1vZGlmeSwgbWVyZ2UsIHB1Ymxpc2gsCisgKiBkaXN0cmlidXRlLCBzdWJsaWNlbnNlLCBhbmQvb3Igc2VsbCBjb3BpZXMgb2YgdGhlIFNvZnR3YXJlLCBhbmQgdG8KKyAqIHBlcm1pdCBwZXJzb25zIHRvIHdob20gdGhlIFNvZnR3YXJlIGlzIGZ1cm5pc2hlZCB0byBkbyBzbywgc3ViamVjdAorICogdG8gdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOiAKKyAqIFRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIHNoYWxsIGJlIGluY2x1ZGVkCisgKiBpbiBhbGwgY29waWVzIG9yIHN1YnN0YW50aWFsIHBvcnRpb25zIG9mIHRoZSBTb2Z0d2FyZS4gCisgKiAKKyAqIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBFWFBSRVNTCisgKiBPUiBJTVBMSUVELCBJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPIFRIRSBXQVJSQU5USUVTIE9GCisgKiBNRVJDSEFOVEFCSUxJVFksIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORCBOT05JTkZSSU5HRU1FTlQuCisgKiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SUyBPUiBDT1BZUklHSFQgSE9MREVSUyBCRSBMSUFCTEUgRk9SIEFOWQorICogQ0xBSU0sIERBTUFHRVMgT1IgT1RIRVIgTElBQklMSVRZLCBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwKKyAqIFRPUlQgT1IgT1RIRVJXSVNFLCBBUklTSU5HIEZST00sIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFCisgKiBTT0ZUV0FSRSBPUiBUSEUgVVNFIE9SIE9USEVSIERFQUxJTkdTIElOIFRIRSBTT0ZUV0FSRS4gCisgKgorICovCisKKy8qKiBAZmlsZSBPTVhfSW5kZXguaCAtIE9wZW5NYXggSUwgdmVyc2lvbiAxLjEuMgorICogIFRoZSBPTVhfSW5kZXggaGVhZGVyIGZpbGUgY29udGFpbnMgdGhlIGRlZmluaXRpb25zIGZvciBib3RoIGFwcGxpY2F0aW9ucworICogIGFuZCBjb21wb25lbnRzIC4KKyAqLworCisKKyNpZm5kZWYgT01YX0luZGV4X2gKKyNkZWZpbmUgT01YX0luZGV4X2gKKworI2lmZGVmIF9fY3BsdXNwbHVzCitleHRlcm4gIkMiIHsKKyNlbmRpZiAvKiBfX2NwbHVzcGx1cyAqLworCisKKy8qIEVhY2ggT01YIGhlYWRlciBtdXN0IGluY2x1ZGUgYWxsIHJlcXVpcmVkIGhlYWRlciBmaWxlcyB0byBhbGxvdyB0aGUKKyAqICBoZWFkZXIgdG8gY29tcGlsZSB3aXRob3V0IGVycm9ycy4gIFRoZSBpbmNsdWRlcyBiZWxvdyBhcmUgcmVxdWlyZWQKKyAqICBmb3IgdGhpcyBoZWFkZXIgZmlsZSB0byBjb21waWxlIHN1Y2Nlc3NmdWxseSAKKyAqLworI2luY2x1ZGUgPE9NWF9UeXBlcy5oPgorCisKKy8qKiBUaGUgT01YX0lOREVYVFlQRSBlbnVtZXJhdGlvbiBpcyB1c2VkIHRvIHNlbGVjdCBhIHN0cnVjdHVyZSB3aGVuIGVpdGhlcgorICogIGdldHRpbmcgb3Igc2V0dGluZyBwYXJhbWV0ZXJzIGFuZC9vciBjb25maWd1cmF0aW9uIGRhdGEuICBFYWNoIGVudHJ5IGluIAorICogIHRoaXMgZW51bWVyYXRpb24gbWFwcyB0byBhbiBPTVggc3BlY2lmaWVkIHN0cnVjdHVyZS4gIFdoZW4gdGhlIAorICogIE9NWF9HZXRQYXJhbWV0ZXIsIE9NWF9TZXRQYXJhbWV0ZXIsIE9NWF9HZXRDb25maWcgb3IgT01YX1NldENvbmZpZyBtZXRob2RzCisgKiAgYXJlIHVzZWQsIHRoZSBzZWNvbmQgcGFyYW1ldGVyIHdpbGwgYWx3YXlzIGJlIGFuIGVudHJ5IGZyb20gdGhpcyBlbnVtZXJhdGlvbgorICogIGFuZCB0aGUgdGhpcmQgZW50cnkgd2lsbCBiZSB0aGUgc3RydWN0dXJlIHNob3duIGluIHRoZSBjb21tZW50cyBmb3IgdGhlIGVudHJ5LgorICogIEZvciBleGFtcGxlLCBpZiB0aGUgYXBwbGljYXRpb24gaXMgaW5pdGlhbGl6aW5nIGEgY3JvcHBpbmcgZnVuY3Rpb24sIHRoZSAKKyAqICBPTVhfU2V0Q29uZmlnIGNvbW1hbmQgd291bGQgaGF2ZSBPTVhfSW5kZXhDb25maWdDb21tb25JbnB1dENyb3AgYXMgdGhlIHNlY29uZCBwYXJhbWV0ZXIgCisgKiAgYW5kIHdvdWxkIHNlbmQgYSBwb2ludGVyIHRvIGFuIGluaXRpYWxpemVkIE9NWF9SRUNUVFlQRSBzdHJ1Y3R1cmUgYXMgdGhlIAorICogIHRoaXJkIHBhcmFtZXRlci4KKyAqICAKKyAqICBUaGUgZW51bWVyYXRpb24gZW50cmllcyBuYW1lZCB3aXRoIHRoZSBPTVhfQ29uZmlnIHByZWZpeCBhcmUgc2VudCB1c2luZworICogIHRoZSBPTVhfU2V0Q29uZmlnIGNvbW1hbmQgYW5kIHRoZSBlbnVtZXJhdGlvbiBlbnRyaWVzIG5hbWVkIHdpdGggdGhlCisgKiAgT01YX1BBUkFNXyBwcmVmaXggYXJlIHNlbnQgdXNpbmcgdGhlIE9NWF9TZXRQYXJhbWV0ZXIgY29tbWFuZC4KKyAqLwordHlwZWRlZiBlbnVtIE9NWF9JTkRFWFRZUEUgeworCisgICAgT01YX0luZGV4Q29tcG9uZW50U3RhcnRVbnVzZWQgPSAweDAxMDAwMDAwLAorICAgIE9NWF9JbmRleFBhcmFtUHJpb3JpdHlNZ210LCAgICAgICAgICAgICAvKio8IHJlZmVyZW5jZTogT01YX1BSSU9SSVRZTUdNVFRZUEUgKi8KKyAgICBPTVhfSW5kZXhQYXJhbUF1ZGlvSW5pdCwgICAgICAgICAgICAgICAgLyoqPCByZWZlcmVuY2U6IE9NWF9QT1JUX1BBUkFNX1RZUEUgKi8KKyAgICBPTVhfSW5kZXhQYXJhbUltYWdlSW5pdCwgICAgICAgICAgICAgICAgLyoqPCByZWZlcmVuY2U6IE9NWF9QT1JUX1BBUkFNX1RZUEUgKi8KKyAgICBPTVhfSW5kZXhQYXJhbVZpZGVvSW5pdCwgICAgICAgICAgICAgICAgLyoqPCByZWZlcmVuY2U6IE9NWF9QT1JUX1BBUkFNX1RZUEUgKi8KKyAgICBPTVhfSW5kZXhQYXJhbU90aGVySW5pdCwgICAgICAgICAgICAgICAgLyoqPCByZWZlcmVuY2U6IE9NWF9QT1JUX1BBUkFNX1RZUEUgKi8KKyAgICBPTVhfSW5kZXhQYXJhbU51bUF2YWlsYWJsZVN0cmVhbXMsICAgICAgLyoqPCByZWZlcmVuY2U6IE9NWF9QQVJBTV9VMzJUWVBFICovCisgICAgT01YX0luZGV4UGFyYW1BY3RpdmVTdHJlYW0sICAgICAgICAgICAgIC8qKjwgcmVmZXJlbmNlOiBPTVhfUEFSQU1fVTMyVFlQRSAqLworICAgIE9NWF9JbmRleFBhcmFtU3VzcGVuc2lvblBvbGljeSwgICAgICAgICAvKio8IHJlZmVyZW5jZTogT01YX1BBUkFNX1NVU1BFTlNJT05QT0xJQ1lUWVBFICovCisgICAgT01YX0luZGV4UGFyYW1Db21wb25lbnRTdXNwZW5kZWQsICAgICAgIC8qKjwgcmVmZXJlbmNlOiBPTVhfUEFSQU1fU1VTUEVOU0lPTlRZUEUgKi8KKyAgICBPTVhfSW5kZXhDb25maWdDYXB0dXJpbmcsICAgICAgICAgICAgICAgLyoqPCByZWZlcmVuY2U6IE9NWF9DT05GSUdfQk9PTEVBTlRZUEUgKi8gCisgICAgT01YX0luZGV4Q29uZmlnQ2FwdHVyZU1vZGUsICAgICAgICAgICAgIC8qKjwgcmVmZXJlbmNlOiBPTVhfQ09ORklHX0NBUFRVUkVNT0RFVFlQRSAqLyAKKyAgICBPTVhfSW5kZXhBdXRvUGF1c2VBZnRlckNhcHR1cmUsICAgICAgICAgLyoqPCByZWZlcmVuY2U6IE9NWF9DT05GSUdfQk9PTEVBTlRZUEUgKi8gCisgICAgT01YX0luZGV4UGFyYW1Db250ZW50VVJJLCAgICAgICAgICAgICAgIC8qKjwgcmVmZXJlbmNlOiBPTVhfUEFSQU1fQ09OVEVOVFVSSVRZUEUgKi8KKyAgICBPTVhfSW5kZXhQYXJhbUN1c3RvbUNvbnRlbnRQaXBlLCAgICAgICAgLyoqPCByZWZlcmVuY2U6IE9NWF9QQVJBTV9DT05URU5UUElQRVRZUEUgKi8gCisgICAgT01YX0luZGV4UGFyYW1EaXNhYmxlUmVzb3VyY2VDb25jZWFsbWVudCwgLyoqPCByZWZlcmVuY2U6IE9NWF9SRVNPVVJDRUNPTkNFQUxNRU5UVFlQRSAqLworICAgIE9NWF9JbmRleENvbmZpZ01ldGFkYXRhSXRlbUNvdW50LCAgICAgICAvKio8IHJlZmVyZW5jZTogT01YX0NPTkZJR19NRVRBREFUQUlURU1DT1VOVFRZUEUgKi8KKyAgICBPTVhfSW5kZXhDb25maWdDb250YWluZXJOb2RlQ291bnQsICAgICAgLyoqPCByZWZlcmVuY2U6IE9NWF9DT05GSUdfQ09OVEFJTkVSTk9ERUNPVU5UVFlQRSAqLworICAgIE9NWF9JbmRleENvbmZpZ01ldGFkYXRhSXRlbSwgICAgICAgICAgICAvKio8IHJlZmVyZW5jZTogT01YX0NPTkZJR19NRVRBREFUQUlURU1UWVBFICovCisgICAgT01YX0luZGV4Q29uZmlnQ291bnRlck5vZGVJRCwgICAgICAgICAgIC8qKjwgcmVmZXJlbmNlOiBPTVhfQ09ORklHX0NPTlRBSU5FUk5PREVJRFRZUEUgKi8KKyAgICBPTVhfSW5kZXhQYXJhbU1ldGFkYXRhRmlsdGVyVHlwZSwgICAgICAgLyoqPCByZWZlcmVuY2U6IE9NWF9QQVJBTV9NRVRBREFUQUZJTFRFUlRZUEUgKi8KKyAgICBPTVhfSW5kZXhQYXJhbU1ldGFkYXRhS2V5RmlsdGVyLCAgICAgICAgLyoqPCByZWZlcmVuY2U6IE9NWF9QQVJBTV9NRVRBREFUQUZJTFRFUlRZUEUgKi8KKyAgICBPTVhfSW5kZXhDb25maWdQcmlvcml0eU1nbXQsICAgICAgICAgICAgLyoqPCByZWZlcmVuY2U6IE9NWF9QUklPUklUWU1HTVRUWVBFICovCisgICAgT01YX0luZGV4UGFyYW1TdGFuZGFyZENvbXBvbmVudFJvbGUsICAgIC8qKjwgcmVmZXJlbmNlOiBPTVhfUEFSQU1fQ09NUE9ORU5UUk9MRVRZUEUgKi8KKworICAgIE9NWF9JbmRleFBvcnRTdGFydFVudXNlZCA9IDB4MDIwMDAwMDAsCisgICAgT01YX0luZGV4UGFyYW1Qb3J0RGVmaW5pdGlvbiwgICAgICAgICAgIC8qKjwgcmVmZXJlbmNlOiBPTVhfUEFSQU1fUE9SVERFRklOSVRJT05UWVBFICovCisgICAgT01YX0luZGV4UGFyYW1Db21wQnVmZmVyU3VwcGxpZXIsICAgICAgIC8qKjwgcmVmZXJlbmNlOiBPTVhfUEFSQU1fQlVGRkVSU1VQUExJRVJUWVBFICovIAorICAgIE9NWF9JbmRleFJlc2VydmVkU3RhcnRVbnVzZWQgPSAweDAzMDAwMDAwLAorCisgICAgLyogQXVkaW8gcGFyYW1ldGVycyBhbmQgY29uZmlndXJhdGlvbnMgKi8KKyAgICBPTVhfSW5kZXhBdWRpb1N0YXJ0VW51c2VkID0gMHgwNDAwMDAwMCwKKyAgICBPTVhfSW5kZXhQYXJhbUF1ZGlvUG9ydEZvcm1hdCwgICAgICAgICAgLyoqPCByZWZlcmVuY2U6IE9NWF9BVURJT19QQVJBTV9QT1JURk9STUFUVFlQRSAqLworICAgIE9NWF9JbmRleFBhcmFtQXVkaW9QY20sICAgICAgICAgICAgICAgICAvKio8IHJlZmVyZW5jZTogT01YX0FVRElPX1BBUkFNX1BDTU1PREVUWVBFICovCisgICAgT01YX0luZGV4UGFyYW1BdWRpb0FhYywgICAgICAgICAgICAgICAgIC8qKjwgcmVmZXJlbmNlOiBPTVhfQVVESU9fUEFSQU1fQUFDUFJPRklMRVRZUEUgKi8KKyAgICBPTVhfSW5kZXhQYXJhbUF1ZGlvUmEsICAgICAgICAgICAgICAgICAgLyoqPCByZWZlcmVuY2U6IE9NWF9BVURJT19QQVJBTV9SQVRZUEUgKi8KKyAgICBPTVhfSW5kZXhQYXJhbUF1ZGlvTXAzLCAgICAgICAgICAgICAgICAgLyoqPCByZWZlcmVuY2U6IE9NWF9BVURJT19QQVJBTV9NUDNUWVBFICovCisgICAgT01YX0luZGV4UGFyYW1BdWRpb0FkcGNtLCAgICAgICAgICAgICAgIC8qKjwgcmVmZXJlbmNlOiBPTVhfQVVESU9fUEFSQU1fQURQQ01UWVBFICovCisgICAgT01YX0luZGV4UGFyYW1BdWRpb0c3MjMsICAgICAgICAgICAgICAgIC8qKjwgcmVmZXJlbmNlOiBPTVhfQVVESU9fUEFSQU1fRzcyM1RZUEUgKi8KKyAgICBPTVhfSW5kZXhQYXJhbUF1ZGlvRzcyOSwgICAgICAgICAgICAgICAgLyoqPCByZWZlcmVuY2U6IE9NWF9BVURJT19QQVJBTV9HNzI5VFlQRSAqLworICAgIE9NWF9JbmRleFBhcmFtQXVkaW9BbXIsICAgICAgICAgICAgICAgICAvKio8IHJlZmVyZW5jZTogT01YX0FVRElPX1BBUkFNX0FNUlRZUEUgKi8KKyAgICBPTVhfSW5kZXhQYXJhbUF1ZGlvV21hLCAgICAgICAgICAgICAgICAgLyoqPCByZWZlcmVuY2U6IE9NWF9BVURJT19QQVJBTV9XTUFUWVBFICovCisgICAgT01YX0luZGV4UGFyYW1BdWRpb1NiYywgICAgICAgICAgICAgICAgIC8qKjwgcmVmZXJlbmNlOiBPTVhfQVVESU9fUEFSQU1fU0JDVFlQRSAqLworICAgIE9NWF9JbmRleFBhcmFtQXVkaW9NaWRpLCAgICAgICAgICAgICAgICAvKio8IHJlZmVyZW5jZTogT01YX0FVRElPX1BBUkFNX01JRElUWVBFICovCisgICAgT01YX0luZGV4UGFyYW1BdWRpb0dzbV9GUiwgICAgICAgICAgICAgIC8qKjwgcmVmZXJlbmNlOiBPTVhfQVVESU9fUEFSQU1fR1NNRlJUWVBFICovCisgICAgT01YX0luZGV4UGFyYW1BdWRpb01pZGlMb2FkVXNlclNvdW5kLCAgIC8qKjwgcmVmZXJlbmNlOiBPTVhfQVVESU9fUEFSQU1fTUlESUxPQURVU0VSU09VTkRUWVBFICovCisgICAgT01YX0luZGV4UGFyYW1BdWRpb0c3MjYsICAgICAgICAgICAgICAgIC8qKjwgcmVmZXJlbmNlOiBPTVhfQVVESU9fUEFSQU1fRzcyNlRZUEUgKi8KKyAgICBPTVhfSW5kZXhQYXJhbUF1ZGlvR3NtX0VGUiwgICAgICAgICAgICAgLyoqPCByZWZlcmVuY2U6IE9NWF9BVURJT19QQVJBTV9HU01FRlJUWVBFICovCisgICAgT01YX0luZGV4UGFyYW1BdWRpb0dzbV9IUiwgICAgICAgICAgICAgIC8qKjwgcmVmZXJlbmNlOiBPTVhfQVVESU9fUEFSQU1fR1NNSFJUWVBFICovCisgICAgT01YX0luZGV4UGFyYW1BdWRpb1BkY19GUiwgICAgICAgICAgICAgIC8qKjwgcmVmZXJlbmNlOiBPTVhfQVVESU9fUEFSQU1fUERDRlJUWVBFICovCisgICAgT01YX0luZGV4UGFyYW1BdWRpb1BkY19FRlIsICAgICAgICAgICAgIC8qKjwgcmVmZXJlbmNlOiBPTVhfQVVESU9fUEFSQU1fUERDRUZSVFlQRSAqLworICAgIE9NWF9JbmRleFBhcmFtQXVkaW9QZGNfSFIsICAgICAgICAgICAgICAvKio8IHJlZmVyZW5jZTogT01YX0FVRElPX1BBUkFNX1BEQ0hSVFlQRSAqLworICAgIE9NWF9JbmRleFBhcmFtQXVkaW9UZG1hX0ZSLCAgICAgICAgICAgICAvKio8IHJlZmVyZW5jZTogT01YX0FVRElPX1BBUkFNX1RETUFGUlRZUEUgKi8KKyAgICBPTVhfSW5kZXhQYXJhbUF1ZGlvVGRtYV9FRlIsICAgICAgICAgICAgLyoqPCByZWZlcmVuY2U6IE9NWF9BVURJT19QQVJBTV9URE1BRUZSVFlQRSAqLworICAgIE9NWF9JbmRleFBhcmFtQXVkaW9RY2VscDgsICAgICAgICAgICAgICAvKio8IHJlZmVyZW5jZTogT01YX0FVRElPX1BBUkFNX1FDRUxQOFRZUEUgKi8KKyAgICBPTVhfSW5kZXhQYXJhbUF1ZGlvUWNlbHAxMywgICAgICAgICAgICAgLyoqPCByZWZlcmVuY2U6IE9NWF9BVURJT19QQVJBTV9RQ0VMUDEzVFlQRSAqLworICAgIE9NWF9JbmRleFBhcmFtQXVkaW9FdnJjLCAgICAgICAgICAgICAgICAvKio8IHJlZmVyZW5jZTogT01YX0FVRElPX1BBUkFNX0VWUkNUWVBFICovCisgICAgT01YX0luZGV4UGFyYW1BdWRpb1NtdiwgICAgICAgICAgICAgICAgIC8qKjwgcmVmZXJlbmNlOiBPTVhfQVVESU9fUEFSQU1fU01WVFlQRSAqLworICAgIE9NWF9JbmRleFBhcmFtQXVkaW9Wb3JiaXMsICAgICAgICAgICAgICAvKio8IHJlZmVyZW5jZTogT01YX0FVRElPX1BBUkFNX1ZPUkJJU1RZUEUgKi8KKworICAgIE9NWF9JbmRleENvbmZpZ0F1ZGlvTWlkaUltbWVkaWF0ZUV2ZW50LCAvKio8IHJlZmVyZW5jZTogT01YX0FVRElPX0NPTkZJR19NSURJSU1NRURJQVRFRVZFTlRUWVBFICovCisgICAgT01YX0luZGV4Q29uZmlnQXVkaW9NaWRpQ29udHJvbCwgICAgICAgIC8qKjwgcmVmZXJlbmNlOiBPTVhfQVVESU9fQ09ORklHX01JRElDT05UUk9MVFlQRSAqLworICAgIE9NWF9JbmRleENvbmZpZ0F1ZGlvTWlkaVNvdW5kQmFua1Byb2dyYW0sIC8qKjwgcmVmZXJlbmNlOiBPTVhfQVVESU9fQ09ORklHX01JRElTT1VOREJBTktQUk9HUkFNVFlQRSAqLworICAgIE9NWF9JbmRleENvbmZpZ0F1ZGlvTWlkaVN0YXR1cywgICAgICAgICAvKio8IHJlZmVyZW5jZTogT01YX0FVRElPX0NPTkZJR19NSURJU1RBVFVTVFlQRSAqLworICAgIE9NWF9JbmRleENvbmZpZ0F1ZGlvTWlkaU1ldGFFdmVudCwgICAgICAvKio8IHJlZmVyZW5jZTogT01YX0FVRElPX0NPTkZJR19NSURJTUVUQUVWRU5UVFlQRSAqLworICAgIE9NWF9JbmRleENvbmZpZ0F1ZGlvTWlkaU1ldGFFdmVudERhdGEsICAvKio8IHJlZmVyZW5jZTogT01YX0FVRElPX0NPTkZJR19NSURJTUVUQUVWRU5UREFUQVRZUEUgKi8KKyAgICBPTVhfSW5kZXhDb25maWdBdWRpb1ZvbHVtZSwgICAgICAgICAgICAgLyoqPCByZWZlcmVuY2U6IE9NWF9BVURJT19DT05GSUdfVk9MVU1FVFlQRSAqLworICAgIE9NWF9JbmRleENvbmZpZ0F1ZGlvQmFsYW5jZSwgICAgICAgICAgICAvKio8IHJlZmVyZW5jZTogT01YX0FVRElPX0NPTkZJR19CQUxBTkNFVFlQRSAqLworICAgIE9NWF9JbmRleENvbmZpZ0F1ZGlvQ2hhbm5lbE11dGUsICAgICAgICAvKio8IHJlZmVyZW5jZTogT01YX0FVRElPX0NPTkZJR19DSEFOTkVMTVVURVRZUEUgKi8KKyAgICBPTVhfSW5kZXhDb25maWdBdWRpb011dGUsICAgICAgICAgICAgICAgLyoqPCByZWZlcmVuY2U6IE9NWF9BVURJT19DT05GSUdfTVVURVRZUEUgKi8KKyAgICBPTVhfSW5kZXhDb25maWdBdWRpb0xvdWRuZXNzLCAgICAgICAgICAgLyoqPCByZWZlcmVuY2U6IE9NWF9BVURJT19DT05GSUdfTE9VRE5FU1NUWVBFICovCisgICAgT01YX0luZGV4Q29uZmlnQXVkaW9FY2hvQ2FuY2VsYXRpb24sICAgIC8qKjwgcmVmZXJlbmNlOiBPTVhfQVVESU9fQ09ORklHX0VDSE9DQU5DRUxBVElPTlRZUEUgKi8KKyAgICBPTVhfSW5kZXhDb25maWdBdWRpb05vaXNlUmVkdWN0aW9uLCAgICAgLyoqPCByZWZlcmVuY2U6IE9NWF9BVURJT19DT05GSUdfTk9JU0VSRURVQ1RJT05UWVBFICovCisgICAgT01YX0luZGV4Q29uZmlnQXVkaW9CYXNzLCAgICAgICAgICAgICAgIC8qKjwgcmVmZXJlbmNlOiBPTVhfQVVESU9fQ09ORklHX0JBU1NUWVBFICovCisgICAgT01YX0luZGV4Q29uZmlnQXVkaW9UcmVibGUsICAgICAgICAgICAgIC8qKjwgcmVmZXJlbmNlOiBPTVhfQVVESU9fQ09ORklHX1RSRUJMRVRZUEUgKi8KKyAgICBPTVhfSW5kZXhDb25maWdBdWRpb1N0ZXJlb1dpZGVuaW5nLCAgICAgLyoqPCByZWZlcmVuY2U6IE9NWF9BVURJT19DT05GSUdfU1RFUkVPV0lERU5JTkdUWVBFICovCisgICAgT01YX0luZGV4Q29uZmlnQXVkaW9DaG9ydXMsICAgICAgICAgICAgIC8qKjwgcmVmZXJlbmNlOiBPTVhfQVVESU9fQ09ORklHX0NIT1JVU1RZUEUgKi8KKyAgICBPTVhfSW5kZXhDb25maWdBdWRpb0VxdWFsaXplciwgICAgICAgICAgLyoqPCByZWZlcmVuY2U6IE9NWF9BVURJT19DT05GSUdfRVFVQUxJWkVSVFlQRSAqLworICAgIE9NWF9JbmRleENvbmZpZ0F1ZGlvUmV2ZXJiZXJhdGlvbiwgICAgICAvKio8IHJlZmVyZW5jZTogT01YX0FVRElPX0NPTkZJR19SRVZFUkJFUkFUSU9OVFlQRSAqLworICAgIE9NWF9JbmRleENvbmZpZ0F1ZGlvQ2hhbm5lbFZvbHVtZSwgICAgICAvKio8IHJlZmVyZW5jZTogT01YX0FVRElPX0NPTkZJR19DSEFOTkVMVk9MVU1FVFlQRSAqLworCisgICAgLyogSW1hZ2Ugc3BlY2lmaWMgcGFyYW1ldGVycyBhbmQgY29uZmlndXJhdGlvbnMgKi8KKyAgICBPTVhfSW5kZXhJbWFnZVN0YXJ0VW51c2VkID0gMHgwNTAwMDAwMCwKKyAgICBPTVhfSW5kZXhQYXJhbUltYWdlUG9ydEZvcm1hdCwgICAgICAgICAgLyoqPCByZWZlcmVuY2U6IE9NWF9JTUFHRV9QQVJBTV9QT1JURk9STUFUVFlQRSAqLworICAgIE9NWF9JbmRleFBhcmFtRmxhc2hDb250cm9sLCAgICAgICAgICAgICAvKio8IHJlZmVyZW5jZTogT01YX0lNQUdFX1BBUkFNX0ZMQVNIQ09OVFJPTFRZUEUgKi8KKyAgICBPTVhfSW5kZXhDb25maWdGb2N1c0NvbnRyb2wsICAgICAgICAgICAgLyoqPCByZWZlcmVuY2U6IE9NWF9JTUFHRV9DT05GSUdfRk9DVVNDT05UUk9MVFlQRSAqLworICAgIE9NWF9JbmRleFBhcmFtUUZhY3RvciwgICAgICAgICAgICAgICAgICAvKio8IHJlZmVyZW5jZTogT01YX0lNQUdFX1BBUkFNX1FGQUNUT1JUWVBFICovCisgICAgT01YX0luZGV4UGFyYW1RdWFudGl6YXRpb25UYWJsZSwgICAgICAgIC8qKjwgcmVmZXJlbmNlOiBPTVhfSU1BR0VfUEFSQU1fUVVBTlRJWkFUSU9OVEFCTEVUWVBFICovCisgICAgT01YX0luZGV4UGFyYW1IdWZmbWFuVGFibGUsICAgICAgICAgICAgIC8qKjwgcmVmZXJlbmNlOiBPTVhfSU1BR0VfUEFSQU1fSFVGRk1BTlRUQUJMRVRZUEUgKi8KKyAgICBPTVhfSW5kZXhDb25maWdGbGFzaENvbnRyb2wsICAgICAgICAgICAgLyoqPCByZWZlcmVuY2U6IE9NWF9JTUFHRV9QQVJBTV9GTEFTSENPTlRST0xUWVBFICovCisKKyAgICAvKiBWaWRlbyBzcGVjaWZpYyBwYXJhbWV0ZXJzIGFuZCBjb25maWd1cmF0aW9ucyAqLworICAgIE9NWF9JbmRleFZpZGVvU3RhcnRVbnVzZWQgPSAweDA2MDAwMDAwLAorICAgIE9NWF9JbmRleFBhcmFtVmlkZW9Qb3J0Rm9ybWF0LCAgICAgICAgICAvKio8IHJlZmVyZW5jZTogT01YX1ZJREVPX1BBUkFNX1BPUlRGT1JNQVRUWVBFICovCisgICAgT01YX0luZGV4UGFyYW1WaWRlb1F1YW50aXphdGlvbiwgICAgICAgIC8qKjwgcmVmZXJlbmNlOiBPTVhfVklERU9fUEFSQU1fUVVBTlRJWkFUSU9OVFlQRSAqLworICAgIE9NWF9JbmRleFBhcmFtVmlkZW9GYXN0VXBkYXRlLCAgICAgICAgICAvKio8IHJlZmVyZW5jZTogT01YX1ZJREVPX1BBUkFNX1ZJREVPRkFTVFVQREFURVRZUEUgKi8KKyAgICBPTVhfSW5kZXhQYXJhbVZpZGVvQml0cmF0ZSwgICAgICAgICAgICAgLyoqPCByZWZlcmVuY2U6IE9NWF9WSURFT19QQVJBTV9CSVRSQVRFVFlQRSAqLworICAgIE9NWF9JbmRleFBhcmFtVmlkZW9Nb3Rpb25WZWN0b3IsICAgICAgICAvKio8IHJlZmVyZW5jZTogT01YX1ZJREVPX1BBUkFNX01PVElPTlZFQ1RPUlRZUEUgKi8KKyAgICBPTVhfSW5kZXhQYXJhbVZpZGVvSW50cmFSZWZyZXNoLCAgICAgICAgLyoqPCByZWZlcmVuY2U6IE9NWF9WSURFT19QQVJBTV9JTlRSQVJFRlJFU0hUWVBFICovCisgICAgT01YX0luZGV4UGFyYW1WaWRlb0Vycm9yQ29ycmVjdGlvbiwgICAgIC8qKjwgcmVmZXJlbmNlOiBPTVhfVklERU9fUEFSQU1fRVJST1JDT1JSRUNUSU9OVFlQRSAqLworICAgIE9NWF9JbmRleFBhcmFtVmlkZW9WQlNNQywgICAgICAgICAgICAgICAvKio8IHJlZmVyZW5jZTogT01YX1ZJREVPX1BBUkFNX1ZCU01DVFlQRSAqLworICAgIE9NWF9JbmRleFBhcmFtVmlkZW9NcGVnMiwgICAgICAgICAgICAgICAvKio8IHJlZmVyZW5jZTogT01YX1ZJREVPX1BBUkFNX01QRUcyVFlQRSAqLworICAgIE9NWF9JbmRleFBhcmFtVmlkZW9NcGVnNCwgICAgICAgICAgICAgICAvKio8IHJlZmVyZW5jZTogT01YX1ZJREVPX1BBUkFNX01QRUc0VFlQRSAqLworICAgIE9NWF9JbmRleFBhcmFtVmlkZW9XbXYsICAgICAgICAgICAgICAgICAvKio8IHJlZmVyZW5jZTogT01YX1ZJREVPX1BBUkFNX1dNVlRZUEUgKi8KKyAgICBPTVhfSW5kZXhQYXJhbVZpZGVvUnYsICAgICAgICAgICAgICAgICAgLyoqPCByZWZlcmVuY2U6IE9NWF9WSURFT19QQVJBTV9SVlRZUEUgKi8KKyAgICBPTVhfSW5kZXhQYXJhbVZpZGVvQXZjLCAgICAgICAgICAgICAgICAgLyoqPCByZWZlcmVuY2U6IE9NWF9WSURFT19QQVJBTV9BVkNUWVBFICovCisgICAgT01YX0luZGV4UGFyYW1WaWRlb0gyNjMsICAgICAgICAgICAgICAgIC8qKjwgcmVmZXJlbmNlOiBPTVhfVklERU9fUEFSQU1fSDI2M1RZUEUgKi8KKyAgICBPTVhfSW5kZXhQYXJhbVZpZGVvUHJvZmlsZUxldmVsUXVlcnlTdXBwb3J0ZWQsIC8qKjwgcmVmZXJlbmNlOiBPTVhfVklERU9fUEFSQU1fUFJPRklMRUxFVkVMVFlQRSAqLworICAgIE9NWF9JbmRleFBhcmFtVmlkZW9Qcm9maWxlTGV2ZWxDdXJyZW50LCAvKio8IHJlZmVyZW5jZTogT01YX1ZJREVPX1BBUkFNX1BST0ZJTEVMRVZFTFRZUEUgKi8KKyAgICBPTVhfSW5kZXhDb25maWdWaWRlb0JpdHJhdGUsICAgICAgICAgICAgLyoqPCByZWZlcmVuY2U6IE9NWF9WSURFT19DT05GSUdfQklUUkFURVRZUEUgKi8KKyAgICBPTVhfSW5kZXhDb25maWdWaWRlb0ZyYW1lcmF0ZSwgICAgICAgICAgLyoqPCByZWZlcmVuY2U6IE9NWF9DT05GSUdfRlJBTUVSQVRFVFlQRSAqLworICAgIE9NWF9JbmRleENvbmZpZ1ZpZGVvSW50cmFWT1BSZWZyZXNoLCAgICAvKio8IHJlZmVyZW5jZTogT01YX0NPTkZJR19JTlRSQVJFRlJFU0hWT1BUWVBFICovCisgICAgT01YX0luZGV4Q29uZmlnVmlkZW9JbnRyYU1CUmVmcmVzaCwgICAgIC8qKjwgcmVmZXJlbmNlOiBPTVhfQ09ORklHX01BQ1JPQkxPQ0tFUlJPUk1BUFRZUEUgKi8KKyAgICBPTVhfSW5kZXhDb25maWdWaWRlb01CRXJyb3JSZXBvcnRpbmcsICAgLyoqPCByZWZlcmVuY2U6IE9NWF9DT05GSUdfTUJFUlJPUlJFUE9SVElOR1RZUEUgKi8KKyAgICBPTVhfSW5kZXhQYXJhbVZpZGVvTWFjcm9ibG9ja3NQZXJGcmFtZSwgLyoqPCByZWZlcmVuY2U6IE9NWF9QQVJBTV9NQUNST0JMT0NLU1RZUEUgKi8KKyAgICBPTVhfSW5kZXhDb25maWdWaWRlb01hY3JvQmxvY2tFcnJvck1hcCwgLyoqPCByZWZlcmVuY2U6IE9NWF9DT05GSUdfTUFDUk9CTE9DS0VSUk9STUFQVFlQRSAqLworICAgIE9NWF9JbmRleFBhcmFtVmlkZW9TbGljZUZNTywgICAgICAgICAgICAvKio8IHJlZmVyZW5jZTogT01YX1ZJREVPX1BBUkFNX0FWQ1NMSUNFRk1PICovCisgICAgT01YX0luZGV4Q29uZmlnVmlkZW9BVkNJbnRyYVBlcmlvZCwgICAgIC8qKjwgcmVmZXJlbmNlOiBPTVhfVklERU9fQ09ORklHX0FWQ0lOVFJBUEVSSU9EICovCisgICAgT01YX0luZGV4Q29uZmlnVmlkZW9OYWxTaXplLCAgICAgICAgICAgIC8qKjwgcmVmZXJlbmNlOiBPTVhfVklERU9fQ09ORklHX05BTFNJWkUgKi8KKworICAgIC8qIEltYWdlICYgVmlkZW8gY29tbW9uIENvbmZpZ3VyYXRpb25zICovCisgICAgT01YX0luZGV4Q29tbW9uU3RhcnRVbnVzZWQgPSAweDA3MDAwMDAwLAorICAgIE9NWF9JbmRleFBhcmFtQ29tbW9uRGVibG9ja2luZywgICAgICAgICAvKio8IHJlZmVyZW5jZTogT01YX1BBUkFNX0RFQkxPQ0tJTkdUWVBFICovCisgICAgT01YX0luZGV4UGFyYW1Db21tb25TZW5zb3JNb2RlLCAgICAgICAgIC8qKjwgcmVmZXJlbmNlOiBPTVhfUEFSQU1fU0VOU09STU9ERVRZUEUgKi8KKyAgICBPTVhfSW5kZXhQYXJhbUNvbW1vbkludGVybGVhdmUsICAgICAgICAgLyoqPCByZWZlcmVuY2U6IE9NWF9QQVJBTV9JTlRFUkxFQVZFVFlQRSAqLworICAgIE9NWF9JbmRleENvbmZpZ0NvbW1vbkNvbG9yRm9ybWF0Q29udmVyc2lvbiwgLyoqPCByZWZlcmVuY2U6IE9NWF9DT05GSUdfQ09MT1JDT05WRVJTSU9OVFlQRSAqLworICAgIE9NWF9JbmRleENvbmZpZ0NvbW1vblNjYWxlLCAgICAgICAgICAgICAvKio8IHJlZmVyZW5jZTogT01YX0NPTkZJR19TQ0FMRUZBQ1RPUlRZUEUgKi8KKyAgICBPTVhfSW5kZXhDb25maWdDb21tb25JbWFnZUZpbHRlciwgICAgICAgLyoqPCByZWZlcmVuY2U6IE9NWF9DT05GSUdfSU1BR0VGSUxURVJUWVBFICovCisgICAgT01YX0luZGV4Q29uZmlnQ29tbW9uQ29sb3JFbmhhbmNlbWVudCwgIC8qKjwgcmVmZXJlbmNlOiBPTVhfQ09ORklHX0NPTE9SRU5IQU5DRU1FTlRUWVBFICovCisgICAgT01YX0luZGV4Q29uZmlnQ29tbW9uQ29sb3JLZXksICAgICAgICAgIC8qKjwgcmVmZXJlbmNlOiBPTVhfQ09ORklHX0NPTE9SS0VZVFlQRSAqLworICAgIE9NWF9JbmRleENvbmZpZ0NvbW1vbkNvbG9yQmxlbmQsICAgICAgICAvKio8IHJlZmVyZW5jZTogT01YX0NPTkZJR19DT0xPUkJMRU5EVFlQRSAqLworICAgIE9NWF9JbmRleENvbmZpZ0NvbW1vbkZyYW1lU3RhYmlsaXNhdGlvbiwvKio8IHJlZmVyZW5jZTogT01YX0NPTkZJR19GUkFNRVNUQUJUWVBFICovCisgICAgT01YX0luZGV4Q29uZmlnQ29tbW9uUm90YXRlLCAgICAgICAgICAgIC8qKjwgcmVmZXJlbmNlOiBPTVhfQ09ORklHX1JPVEFUSU9OVFlQRSAqLworICAgIE9NWF9JbmRleENvbmZpZ0NvbW1vbk1pcnJvciwgICAgICAgICAgICAvKio8IHJlZmVyZW5jZTogT01YX0NPTkZJR19NSVJST1JUWVBFICovCisgICAgT01YX0luZGV4Q29uZmlnQ29tbW9uT3V0cHV0UG9zaXRpb24sICAgIC8qKjwgcmVmZXJlbmNlOiBPTVhfQ09ORklHX1BPSU5UVFlQRSAqLworICAgIE9NWF9JbmRleENvbmZpZ0NvbW1vbklucHV0Q3JvcCwgICAgICAgICAvKio8IHJlZmVyZW5jZTogT01YX0NPTkZJR19SRUNUVFlQRSAqLworICAgIE9NWF9JbmRleENvbmZpZ0NvbW1vbk91dHB1dENyb3AsICAgICAgICAvKio8IHJlZmVyZW5jZTogT01YX0NPTkZJR19SRUNUVFlQRSAqLworICAgIE9NWF9JbmRleENvbmZpZ0NvbW1vbkRpZ2l0YWxab29tLCAgICAgICAvKio8IHJlZmVyZW5jZTogT01YX0NPTkZJR19TQ0FMRUZBQ1RPUlRZUEUgKi8KKyAgICBPTVhfSW5kZXhDb25maWdDb21tb25PcHRpY2FsWm9vbSwgICAgICAgLyoqPCByZWZlcmVuY2U6IE9NWF9DT05GSUdfU0NBTEVGQUNUT1JUWVBFKi8KKyAgICBPTVhfSW5kZXhDb25maWdDb21tb25XaGl0ZUJhbGFuY2UsICAgICAgLyoqPCByZWZlcmVuY2U6IE9NWF9DT05GSUdfV0hJVEVCQUxDT05UUk9MVFlQRSAqLworICAgIE9NWF9JbmRleENvbmZpZ0NvbW1vbkV4cG9zdXJlLCAgICAgICAgICAvKio8IHJlZmVyZW5jZTogT01YX0NPTkZJR19FWFBPU1VSRUNPTlRST0xUWVBFICovCisgICAgT01YX0luZGV4Q29uZmlnQ29tbW9uQ29udHJhc3QsICAgICAgICAgIC8qKjwgcmVmZXJlbmNlOiBPTVhfQ09ORklHX0NPTlRSQVNUVFlQRSAqLworICAgIE9NWF9JbmRleENvbmZpZ0NvbW1vbkJyaWdodG5lc3MsICAgICAgICAvKio8IHJlZmVyZW5jZTogT01YX0NPTkZJR19CUklHSFRORVNTVFlQRSAqLworICAgIE9NWF9JbmRleENvbmZpZ0NvbW1vbkJhY2tsaWdodCwgICAgICAgICAvKio8IHJlZmVyZW5jZTogT01YX0NPTkZJR19CQUNLTElHSFRUWVBFICovCisgICAgT01YX0luZGV4Q29uZmlnQ29tbW9uR2FtbWEsICAgICAgICAgICAgIC8qKjwgcmVmZXJlbmNlOiBPTVhfQ09ORklHX0dBTU1BVFlQRSAqLworICAgIE9NWF9JbmRleENvbmZpZ0NvbW1vblNhdHVyYXRpb24sICAgICAgICAvKio8IHJlZmVyZW5jZTogT01YX0NPTkZJR19TQVRVUkFUSU9OVFlQRSAqLworICAgIE9NWF9JbmRleENvbmZpZ0NvbW1vbkxpZ2h0bmVzcywgICAgICAgICAvKio8IHJlZmVyZW5jZTogT01YX0NPTkZJR19MSUdIVE5FU1NUWVBFICovCisgICAgT01YX0luZGV4Q29uZmlnQ29tbW9uRXhjbHVzaW9uUmVjdCwgICAgIC8qKjwgcmVmZXJlbmNlOiBPTVhfQ09ORklHX1JFQ1RUWVBFICovCisgICAgT01YX0luZGV4Q29uZmlnQ29tbW9uRGl0aGVyaW5nLCAgICAgICAgIC8qKjwgcmVmZXJlbmNlOiBPTVhfQ09ORklHX0RJVEhFUlRZUEUgKi8KKyAgICBPTVhfSW5kZXhDb25maWdDb21tb25QbGFuZUJsZW5kLCAgICAgICAgLyoqPCByZWZlcmVuY2U6IE9NWF9DT05GSUdfUExBTkVCTEVORFRZUEUgKi8KKyAgICBPTVhfSW5kZXhDb25maWdDb21tb25FeHBvc3VyZVZhbHVlLCAgICAgLyoqPCByZWZlcmVuY2U6IE9NWF9DT05GSUdfRVhQT1NVUkVWQUxVRVRZUEUgKi8KKyAgICBPTVhfSW5kZXhDb25maWdDb21tb25PdXRwdXRTaXplLCAgICAgICAgLyoqPCByZWZlcmVuY2U6IE9NWF9GUkFNRVNJWkVUWVBFICovCisgICAgT01YX0luZGV4UGFyYW1Db21tb25FeHRyYVF1YW50RGF0YSwgICAgIC8qKjwgcmVmZXJlbmNlOiBPTVhfT1RIRVJfRVhUUkFEQVRBVFlQRSAqLworICAgIE9NWF9JbmRleENvbmZpZ0NvbW1vbkZvY3VzUmVnaW9uLCAgICAgICAvKio8IHJlZmVyZW5jZTogT01YX0NPTkZJR19GT0NVU1JFR0lPTlRZUEUgKi8KKyAgICBPTVhfSW5kZXhDb25maWdDb21tb25Gb2N1c1N0YXR1cywgICAgICAgLyoqPCByZWZlcmVuY2U6IE9NWF9QQVJBTV9GT0NVU1NUQVRVU1RZUEUgKi8KKyAgICBPTVhfSW5kZXhDb25maWdDb21tb25UcmFuc2l0aW9uRWZmZWN0LCAgLyoqPCByZWZlcmVuY2U6IE9NWF9DT05GSUdfVFJBTlNJVElPTkVGRkVDVFRZUEUgKi8KKworICAgIC8qIFJlc2VydmVkIENvbmZpZ3VyYXRpb24gcmFuZ2UgKi8KKyAgICBPTVhfSW5kZXhPdGhlclN0YXJ0VW51c2VkID0gMHgwODAwMDAwMCwKKyAgICBPTVhfSW5kZXhQYXJhbU90aGVyUG9ydEZvcm1hdCwgICAgICAgICAgLyoqPCByZWZlcmVuY2U6IE9NWF9PVEhFUl9QQVJBTV9QT1JURk9STUFUVFlQRSAqLworICAgIE9NWF9JbmRleENvbmZpZ090aGVyUG93ZXIsICAgICAgICAgICAgICAvKio8IHJlZmVyZW5jZTogT01YX09USEVSX0NPTkZJR19QT1dFUlRZUEUgKi8KKyAgICBPTVhfSW5kZXhDb25maWdPdGhlclN0YXRzLCAgICAgICAgICAgICAgLyoqPCByZWZlcmVuY2U6IE9NWF9PVEhFUl9DT05GSUdfU1RBVFNUWVBFICovCisKKworICAgIC8qIFJlc2VydmVkIFRpbWUgcmFuZ2UgKi8KKyAgICBPTVhfSW5kZXhUaW1lU3RhcnRVbnVzZWQgPSAweDA5MDAwMDAwLAorICAgIE9NWF9JbmRleENvbmZpZ1RpbWVTY2FsZSwgICAgICAgICAgICAgICAvKio8IHJlZmVyZW5jZTogT01YX1RJTUVfQ09ORklHX1NDQUxFVFlQRSAqLworICAgIE9NWF9JbmRleENvbmZpZ1RpbWVDbG9ja1N0YXRlLCAgICAgICAgICAvKio8IHJlZmVyZW5jZTogT01YX1RJTUVfQ09ORklHX0NMT0NLU1RBVEVUWVBFICovCisgICAgT01YX0luZGV4Q29uZmlnVGltZUFjdGl2ZVJlZkNsb2NrLCAgICAgIC8qKjwgcmVmZXJlbmNlOiBPTVhfVElNRV9DT05GSUdfQUNUSVZFUkVGQ0xPQ0tUWVBFICovCisgICAgT01YX0luZGV4Q29uZmlnVGltZUN1cnJlbnRNZWRpYVRpbWUsICAgIC8qKjwgcmVmZXJlbmNlOiBPTVhfVElNRV9DT05GSUdfVElNRVNUQU1QVFlQRSAocmVhZCBvbmx5KSAqLworICAgIE9NWF9JbmRleENvbmZpZ1RpbWVDdXJyZW50V2FsbFRpbWUsICAgICAvKio8IHJlZmVyZW5jZTogT01YX1RJTUVfQ09ORklHX1RJTUVTVEFNUFRZUEUgKHJlYWQgb25seSkgKi8KKyAgICBPTVhfSW5kZXhDb25maWdUaW1lQ3VycmVudEF1ZGlvUmVmZXJlbmNlLCAvKio8IHJlZmVyZW5jZTogT01YX1RJTUVfQ09ORklHX1RJTUVTVEFNUFRZUEUgKHdyaXRlIG9ubHkpICovCisgICAgT01YX0luZGV4Q29uZmlnVGltZUN1cnJlbnRWaWRlb1JlZmVyZW5jZSwgLyoqPCByZWZlcmVuY2U6IE9NWF9USU1FX0NPTkZJR19USU1FU1RBTVBUWVBFICh3cml0ZSBvbmx5KSAqLworICAgIE9NWF9JbmRleENvbmZpZ1RpbWVNZWRpYVRpbWVSZXF1ZXN0LCAgICAvKio8IHJlZmVyZW5jZTogT01YX1RJTUVfQ09ORklHX01FRElBVElNRVJFUVVFU1RUWVBFICh3cml0ZSBvbmx5KSAqLworICAgIE9NWF9JbmRleENvbmZpZ1RpbWVDbGllbnRTdGFydFRpbWUsICAgICAvKio8cmVmZXJlbmNlOiAgT01YX1RJTUVfQ09ORklHX1RJTUVTVEFNUFRZUEUgKHdyaXRlIG9ubHkpICovCisgICAgT01YX0luZGV4Q29uZmlnVGltZVBvc2l0aW9uLCAgICAgICAgICAgIC8qKjwgcmVmZXJlbmNlOiBPTVhfVElNRV9DT05GSUdfVElNRVNUQU1QVFlQRSAqLworICAgIE9NWF9JbmRleENvbmZpZ1RpbWVTZWVrTW9kZSwgICAgICAgICAgICAvKio8IHJlZmVyZW5jZTogT01YX1RJTUVfQ09ORklHX1NFRUtNT0RFVFlQRSAqLworCisKKyAgICBPTVhfSW5kZXhLaHJvbm9zRXh0ZW5zaW9ucyA9IDB4NkYwMDAwMDAsIC8qKjwgUmVzZXJ2ZWQgcmVnaW9uIGZvciBpbnRyb2R1Y2luZyBLaHJvbm9zIFN0YW5kYXJkIEV4dGVuc2lvbnMgKi8gCisgICAgLyogVmVuZG9yIHNwZWNpZmljIGFyZWEgKi8KKyAgICBPTVhfSW5kZXhWZW5kb3JTdGFydFVudXNlZCA9IDB4N0YwMDAwMDAsCisgICAgLyogVmVuZG9yIHNwZWNpZmljIHN0cnVjdHVyZXMgc2hvdWxkIGJlIGluIHRoZSByYW5nZSBvZiAweDdGMDAwMDAwIAorICAgICAgIHRvIDB4N0ZGRkZGRkUuICBUaGlzIHJhbmdlIGlzIG5vdCBicm9rZW4gb3V0IGJ5IHZlbmRvciwgc28KKyAgICAgICBwcml2YXRlIGluZGV4ZXMgYXJlIG5vdCBndWFyYW50ZWVkIHVuaXF1ZSBhbmQgdGhlcmVmb3JlIHNob3VsZAorICAgICAgIG9ubHkgYmUgc2VudCB0byB0aGUgYXBwcm9wcmlhdGUgY29tcG9uZW50LiAqLworCisgICAgT01YX0luZGV4TWF4ID0gMHg3RkZGRkZGRgorCit9IE9NWF9JTkRFWFRZUEU7CisKKyNpZmRlZiBfX2NwbHVzcGx1cworfQorI2VuZGlmIC8qIF9fY3BsdXNwbHVzICovCisKKyNlbmRpZgorLyogRmlsZSBFT0YgKi8KZGlmZiAtLWdpdCBhL2V4eW5vczQvbXVsdGltZWRpYS9vcGVubWF4L3NlY19vbXgvaW5jbHVkZS9raHJvbm9zL09NWF9PdGhlci5oIGIvZXh5bm9zNC9tdWx0aW1lZGlhL29wZW5tYXgvc2VjX29teC9pbmNsdWRlL2tocm9ub3MvT01YX090aGVyLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uY2FmN2YzOAotLS0gL2Rldi9udWxsCisrKyBiL2V4eW5vczQvbXVsdGltZWRpYS9vcGVubWF4L3NlY19vbXgvaW5jbHVkZS9raHJvbm9zL09NWF9PdGhlci5oCkBAIC0wLDAgKzEsMzM3IEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDA4IFRoZSBLaHJvbm9zIEdyb3VwIEluYy4gCisgKiAKKyAqIFBlcm1pc3Npb24gaXMgaGVyZWJ5IGdyYW50ZWQsIGZyZWUgb2YgY2hhcmdlLCB0byBhbnkgcGVyc29uIG9idGFpbmluZworICogYSBjb3B5IG9mIHRoaXMgc29mdHdhcmUgYW5kIGFzc29jaWF0ZWQgZG9jdW1lbnRhdGlvbiBmaWxlcyAodGhlCisgKiAiU29mdHdhcmUiKSwgdG8gZGVhbCBpbiB0aGUgU29mdHdhcmUgd2l0aG91dCByZXN0cmljdGlvbiwgaW5jbHVkaW5nCisgKiB3aXRob3V0IGxpbWl0YXRpb24gdGhlIHJpZ2h0cyB0byB1c2UsIGNvcHksIG1vZGlmeSwgbWVyZ2UsIHB1Ymxpc2gsCisgKiBkaXN0cmlidXRlLCBzdWJsaWNlbnNlLCBhbmQvb3Igc2VsbCBjb3BpZXMgb2YgdGhlIFNvZnR3YXJlLCBhbmQgdG8KKyAqIHBlcm1pdCBwZXJzb25zIHRvIHdob20gdGhlIFNvZnR3YXJlIGlzIGZ1cm5pc2hlZCB0byBkbyBzbywgc3ViamVjdAorICogdG8gdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOiAKKyAqIFRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIHNoYWxsIGJlIGluY2x1ZGVkCisgKiBpbiBhbGwgY29waWVzIG9yIHN1YnN0YW50aWFsIHBvcnRpb25zIG9mIHRoZSBTb2Z0d2FyZS4gCisgKiAKKyAqIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBFWFBSRVNTCisgKiBPUiBJTVBMSUVELCBJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPIFRIRSBXQVJSQU5USUVTIE9GCisgKiBNRVJDSEFOVEFCSUxJVFksIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORCBOT05JTkZSSU5HRU1FTlQuCisgKiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SUyBPUiBDT1BZUklHSFQgSE9MREVSUyBCRSBMSUFCTEUgRk9SIEFOWQorICogQ0xBSU0sIERBTUFHRVMgT1IgT1RIRVIgTElBQklMSVRZLCBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwKKyAqIFRPUlQgT1IgT1RIRVJXSVNFLCBBUklTSU5HIEZST00sIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFCisgKiBTT0ZUV0FSRSBPUiBUSEUgVVNFIE9SIE9USEVSIERFQUxJTkdTIElOIFRIRSBTT0ZUV0FSRS4gCisgKgorICovCisKKy8qKiBAZmlsZSBPTVhfT3RoZXIuaCAtIE9wZW5NYXggSUwgdmVyc2lvbiAxLjEuMgorICogIFRoZSBzdHJ1Y3R1cmVzIG5lZWRlZCBieSBPdGhlciBjb21wb25lbnRzIHRvIGV4Y2hhbmdlCisgKiAgcGFyYW1ldGVycyBhbmQgY29uZmlndXJhdGlvbiBkYXRhIHdpdGggdGhlIGNvbXBvbmVudHMuCisgKi8KKworI2lmbmRlZiBPTVhfT3RoZXJfaAorI2RlZmluZSBPTVhfT3RoZXJfaAorCisjaWZkZWYgX19jcGx1c3BsdXMKK2V4dGVybiAiQyIgeworI2VuZGlmIC8qIF9fY3BsdXNwbHVzICovCisKKworLyogRWFjaCBPTVggaGVhZGVyIG11c3QgaW5jbHVkZSBhbGwgcmVxdWlyZWQgaGVhZGVyIGZpbGVzIHRvIGFsbG93IHRoZQorICogIGhlYWRlciB0byBjb21waWxlIHdpdGhvdXQgZXJyb3JzLiAgVGhlIGluY2x1ZGVzIGJlbG93IGFyZSByZXF1aXJlZAorICogIGZvciB0aGlzIGhlYWRlciBmaWxlIHRvIGNvbXBpbGUgc3VjY2Vzc2Z1bGx5IAorICovCisKKyNpbmNsdWRlIDxPTVhfQ29yZS5oPgorCisKKy8qKiAKKyAqIEVudW1lcmF0aW9uIG9mIHBvc3NpYmxlIGRhdGEgdHlwZXMgd2hpY2ggbWF0Y2ggdG8gbXVsdGlwbGUgZG9tYWlucyBvciBubworICogZG9tYWluIGF0IGFsbC4gIEZvciB0eXBlcyB3aGljaCBhcmUgdmVuZG9yIHNwZWNpZmljLCBhIHZhbHVlIGFib3ZlCisgKiBPTVhfT1RIRVJfVkVORE9SVFNUQVJUIHNob3VsZCBiZSB1c2VkLgorICovCit0eXBlZGVmIGVudW0gT01YX09USEVSX0ZPUk1BVFRZUEUgeworICAgIE9NWF9PVEhFUl9Gb3JtYXRUaW1lID0gMCwgLyoqPCBUcmFuc21pc3Npb24gb2YgdmFyaW91cyB0aW1lc3RhbXBzLCBlbGFwc2VkIHRpbWUsIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aW1lIGRlbHRhcywgZXRjICovCisgICAgT01YX09USEVSX0Zvcm1hdFBvd2VyLCAgICAvKio8IFBlcmhhcHMgdXNlZCBmb3IgZW5hYmxpbmcvZGlzYWJsaW5nIHBvd2VyIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYW5hZ2VtZW50LCBzZXR0aW5nIGNsb2Nrcz8gKi8KKyAgICBPTVhfT1RIRVJfRm9ybWF0U3RhdHMsICAgIC8qKjwgQ291bGQgYmUgdGhpbmdzIHN1Y2ggYXMgZnJhbWUgcmF0ZSwgZnJhbWVzIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkcm9wcGVkLCBldGMgKi8KKyAgICBPTVhfT1RIRVJfRm9ybWF0QmluYXJ5LCAgIC8qKjwgQXJiaXRyYXJ5IGJpbmFyeSBkYXRhICovCisgICAgT01YX09USEVSX0Zvcm1hdFZlbmRvclJlc2VydmVkID0gMTAwMCwgLyoqPCBTdGFydGluZyB2YWx1ZSBmb3IgdmVuZG9yIHNwZWNpZmljIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9ybWF0cyAqLworCisgICAgT01YX09USEVSX0Zvcm1hdEtocm9ub3NFeHRlbnNpb25zID0gMHg2RjAwMDAwMCwgLyoqPCBSZXNlcnZlZCByZWdpb24gZm9yIGludHJvZHVjaW5nIEtocm9ub3MgU3RhbmRhcmQgRXh0ZW5zaW9ucyAqLyAKKyAgICBPTVhfT1RIRVJfRm9ybWF0VmVuZG9yU3RhcnRVbnVzZWQgPSAweDdGMDAwMDAwLCAvKio8IFJlc2VydmVkIHJlZ2lvbiBmb3IgaW50cm9kdWNpbmcgVmVuZG9yIEV4dGVuc2lvbnMgKi8KKyAgICBPTVhfT1RIRVJfRm9ybWF0TWF4ID0gMHg3RkZGRkZGRgorfSBPTVhfT1RIRVJfRk9STUFUVFlQRTsKKworLyoqIAorICogRW51bWVyYXRpb24gb2Ygc2VlayBtb2Rlcy4KKyAqLwordHlwZWRlZiBlbnVtIE9NWF9USU1FX1NFRUtNT0RFVFlQRSB7CisgICAgT01YX1RJTUVfU2Vla01vZGVGYXN0ID0gMCwgLyoqPCBQcmVmZXIgc2Vla2luZyB0byBhbiBhcHByb3hpbWF0aW9uCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogb2YgdGhlIHJlcXVlc3RlZCBzZWVrIHBvc2l0aW9uIG92ZXIgICAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiB0aGUgYWN0dWFsIHNlZWsgcG9zaXRpb24gaWYgaXQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiByZXN1bHRzIGluIGEgZmFzdGVyIHNlZWsuICovCisgICAgT01YX1RJTUVfU2Vla01vZGVBY2N1cmF0ZSwgLyoqPCBQcmVmZXIgc2Vla2luZyB0byB0aGUgYWN0dWFsIHNlZWsgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogcG9zaXRpb24gb3ZlciBhbiBhcHByb3hpbWF0aW9uCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogb2YgdGhlIHJlcXVlc3RlZCBzZWVrIHBvc2l0aW9uIGV2ZW4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiBpZiBpdCByZXN1bHRzIGluIGEgc2xvd2VyIHNlZWsuICovCisgICAgT01YX1RJTUVfU2Vla01vZGVLaHJvbm9zRXh0ZW5zaW9ucyA9IDB4NkYwMDAwMDAsIC8qKjwgUmVzZXJ2ZWQgcmVnaW9uIGZvciBpbnRyb2R1Y2luZyBLaHJvbm9zIFN0YW5kYXJkIEV4dGVuc2lvbnMgKi8gCisgICAgT01YX1RJTUVfU2Vla01vZGVWZW5kb3JTdGFydFVudXNlZCA9IDB4N0YwMDAwMDAsIC8qKjwgUmVzZXJ2ZWQgcmVnaW9uIGZvciBpbnRyb2R1Y2luZyBWZW5kb3IgRXh0ZW5zaW9ucyAqLworICAgIE9NWF9USU1FX1NlZWtNb2RlTWF4ID0gMHg3RkZGRkZGRgorfSBPTVhfVElNRV9TRUVLTU9ERVRZUEU7CisKKy8qIFN0cnVjdHVyZSByZXByZXNlbnRpbmcgdGhlIHNlZWttb2RlIG9mIHRoZSBjb21wb25lbnQgKi8KK3R5cGVkZWYgc3RydWN0IE9NWF9USU1FX0NPTkZJR19TRUVLTU9ERVRZUEUgeworICAgIE9NWF9VMzIgblNpemU7ICAgICAgICAgICAgICAgICAgLyoqPCBzaXplIG9mIHRoZSBzdHJ1Y3R1cmUgaW4gYnl0ZXMgKi8KKyAgICBPTVhfVkVSU0lPTlRZUEUgblZlcnNpb247ICAgICAgIC8qKjwgT01YIHNwZWNpZmljYXRpb24gdmVyc2lvbiBpbmZvcm1hdGlvbiAqLworICAgIE9NWF9USU1FX1NFRUtNT0RFVFlQRSBlVHlwZTsgICAgLyoqPCBUaGUgc2VlayBtb2RlICovCit9IE9NWF9USU1FX0NPTkZJR19TRUVLTU9ERVRZUEU7CisKKy8qKiBTdHJ1Y3R1cmUgcmVwcmVzZW50aW5nIGEgdGltZSBzdGFtcCB1c2VkIHdpdGggdGhlIGZvbGxvd2luZyBjb25maWdzIAorICogb24gdGhlIENsb2NrIENvbXBvbmVudCAoQ0MpOgorICogCisgKiBPTVhfSW5kZXhDb25maWdUaW1lQ3VycmVudFdhbGxUaW1lOiBxdWVyeSBvZiB0aGUgQ0OScyBjdXJyZW50IHdhbGwgIAorICogICAgIHRpbWUKKyAqIE9NWF9JbmRleENvbmZpZ1RpbWVDdXJyZW50TWVkaWFUaW1lOiBxdWVyeSBvZiB0aGUgQ0OScyBjdXJyZW50IG1lZGlhCisgKiAgICAgdGltZQorICogT01YX0luZGV4Q29uZmlnVGltZUN1cnJlbnRBdWRpb1JlZmVyZW5jZSBhbmQgIAorICogT01YX0luZGV4Q29uZmlnVGltZUN1cnJlbnRWaWRlb1JlZmVyZW5jZTogYXVkaW8vdmlkZW8gcmVmZXJlbmNlIAorICogICAgIGNsb2NrIHNlbmRpbmcgU0MgaXRzIHJlZmVyZW5jZSB0aW1lCisgKiBPTVhfSW5kZXhDb25maWdUaW1lQ2xpZW50U3RhcnRUaW1lOiBhIENsb2NrIENvbXBvbmVudCBjbGllbnQgc2VuZHMgCisgKiAgICAgdGhpcyBzdHJ1Y3R1cmUgdG8gdGhlIENsb2NrIENvbXBvbmVudCB2aWEgYSBTZXRDb25maWcgb24gaXRzIAorICogICAgIGNsaWVudCBwb3J0IHdoZW4gaXQgcmVjZWl2ZXMgYSBidWZmZXIgd2l0aAorICogICAgIE9NWF9CVUZGRVJGTEFHX1NUQVJUVElNRSBzZXQuIEl0IG11c3QgdXNlIHRoZSB0aW1lc3RhbXAKKyAqICAgICBzcGVjaWZpZWQgYnkgdGhhdCBidWZmZXIgZm9yIG5TdGFydFRpbWVzdGFtcC4gCisgKgorICogSXSScyBhbHNvIHVzZWQgd2l0aCB0aGUgZm9sbG93aW5nIGNvbmZpZyBvbiBjb21wb25lbnRzIGluIGdlbmVyYWw6CisgKgorICogT01YX0luZGV4Q29uZmlnVGltZVBvc2l0aW9uOiBJTCBjbGllbnQgcXVlcnlpbmcgY29tcG9uZW50IHBvc2l0aW9uIAorICogKEdldENvbmZpZykgb3IgY29tbWFuZGluZyBhIGNvbXBvbmVudCB0byBzZWVrIHRvIHRoZSBnaXZlbiBsb2NhdGlvbgorICogKFNldENvbmZpZykKKyAqLwkKK3R5cGVkZWYgc3RydWN0IE9NWF9USU1FX0NPTkZJR19USU1FU1RBTVBUWVBFIHsKKyAgICBPTVhfVTMyIG5TaXplOyAgICAgICAgICAgICAgIC8qKjwgc2l6ZSBvZiB0aGUgc3RydWN0dXJlIGluIGJ5dGVzICovCisgICAgT01YX1ZFUlNJT05UWVBFIG5WZXJzaW9uOyAgICAvKio8IE9NWCBzcGVjaWZpY2F0aW9uIHZlcnNpb24KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqICAgaW5mb3JtYXRpb24gKi8KKyAgICBPTVhfVTMyIG5Qb3J0SW5kZXg7ICAgICAvKio8IHBvcnQgdGhhdCB0aGlzIHN0cnVjdHVyZSBhcHBsaWVzIHRvICovCisgICAgT01YX1RJQ0tTIG5UaW1lc3RhbXA7ICAJICAgICAvKio8IHRpbWVzdGFtcCAuKi8gCit9IE9NWF9USU1FX0NPTkZJR19USU1FU1RBTVBUWVBFOyAgCisKKy8qKiBFbnVtZXJhdGlvbiBvZiBwb3NzaWJsZSByZWZlcmVuY2UgY2xvY2tzIHRvIHRoZSBtZWRpYSB0aW1lLiAqLwordHlwZWRlZiBlbnVtIE9NWF9USU1FX1VQREFURVRZUEUgeworICAgICAgT01YX1RJTUVfVXBkYXRlUmVxdWVzdEZ1bGZpbGxtZW50LCAgICAvKio8IFVwZGF0ZSBpcyB0aGUgZnVsZmlsbG1lbnQgb2YgYSBtZWRpYSB0aW1lIHJlcXVlc3QuICovCisgICAgICBPTVhfVElNRV9VcGRhdGVTY2FsZUNoYW5nZWQsCSAgICAgICAgLyoqPCBVcGRhdGUgd2FzIGdlbmVyYXRlZCBiZWNhdXNlIHRoZSBzY2FsZSBjaGFnbmVkLiAqLworICAgICAgT01YX1RJTUVfVXBkYXRlQ2xvY2tTdGF0ZUNoYW5nZWQsICAgICAvKio8IFVwZGF0ZSB3YXMgZ2VuZXJhdGVkIGJlY2F1c2UgdGhlIGNsb2NrIHN0YXRlIGNoYW5nZWQuICovCisgICAgICBPTVhfVElNRV9VcGRhdGVLaHJvbm9zRXh0ZW5zaW9ucyA9IDB4NkYwMDAwMDAsIC8qKjwgUmVzZXJ2ZWQgcmVnaW9uIGZvciBpbnRyb2R1Y2luZyBLaHJvbm9zIFN0YW5kYXJkIEV4dGVuc2lvbnMgKi8gCisgICAgICBPTVhfVElNRV9VcGRhdGVWZW5kb3JTdGFydFVudXNlZCA9IDB4N0YwMDAwMDAsIC8qKjwgUmVzZXJ2ZWQgcmVnaW9uIGZvciBpbnRyb2R1Y2luZyBWZW5kb3IgRXh0ZW5zaW9ucyAqLworICAgICAgT01YX1RJTUVfVXBkYXRlTWF4ID0gMHg3RkZGRkZGRgorfSBPTVhfVElNRV9VUERBVEVUWVBFOworCisvKiogRW51bWVyYXRpb24gb2YgcG9zc2libGUgcmVmZXJlbmNlIGNsb2NrcyB0byB0aGUgbWVkaWEgdGltZS4gKi8KK3R5cGVkZWYgZW51bSBPTVhfVElNRV9SRUZDTE9DS1RZUEUgeworICAgICAgT01YX1RJTUVfUmVmQ2xvY2tOb25lLCAgICAvKio8IFVzZSBubyByZWZlcmVuY2VzLiAqLworICAgICAgT01YX1RJTUVfUmVmQ2xvY2tBdWRpbywJLyoqPCBVc2UgcmVmZXJlbmNlcyBzZW50IHRocm91Z2ggT01YX0luZGV4Q29uZmlnVGltZUN1cnJlbnRBdWRpb1JlZmVyZW5jZSAqLworICAgICAgT01YX1RJTUVfUmVmQ2xvY2tWaWRlbywgICAvKio8IFVzZSByZWZlcmVuY2VzIHNlbnQgdGhyb3VnaCBPTVhfSW5kZXhDb25maWdUaW1lQ3VycmVudFZpZGVvUmVmZXJlbmNlICovCisgICAgICBPTVhfVElNRV9SZWZDbG9ja0tocm9ub3NFeHRlbnNpb25zID0gMHg2RjAwMDAwMCwgLyoqPCBSZXNlcnZlZCByZWdpb24gZm9yIGludHJvZHVjaW5nIEtocm9ub3MgU3RhbmRhcmQgRXh0ZW5zaW9ucyAqLyAKKyAgICAgIE9NWF9USU1FX1JlZkNsb2NrVmVuZG9yU3RhcnRVbnVzZWQgPSAweDdGMDAwMDAwLCAvKio8IFJlc2VydmVkIHJlZ2lvbiBmb3IgaW50cm9kdWNpbmcgVmVuZG9yIEV4dGVuc2lvbnMgKi8KKyAgICAgIE9NWF9USU1FX1JlZkNsb2NrTWF4ID0gMHg3RkZGRkZGRgorfSBPTVhfVElNRV9SRUZDTE9DS1RZUEU7CisKKy8qKiBFbnVtZXJhdGlvbiBvZiBjbG9jayBzdGF0ZXMuICovCit0eXBlZGVmIGVudW0gT01YX1RJTUVfQ0xPQ0tTVEFURSB7CisgICAgICBPTVhfVElNRV9DbG9ja1N0YXRlUnVubmluZywgICAgICAgICAgICAgLyoqPCBDbG9jayBydW5uaW5nLiAqLworICAgICAgT01YX1RJTUVfQ2xvY2tTdGF0ZVdhaXRpbmdGb3JTdGFydFRpbWUsIC8qKjwgQ2xvY2sgd2FpdGluZyB1bnRpbCB0aGUgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogICBwcmVzY3JpYmVkIGNsaWVudHMgZW1pdCB0aGVpcgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqICAgc3RhcnQgdGltZS4gKi8KKyAgICAgIE9NWF9USU1FX0Nsb2NrU3RhdGVTdG9wcGVkLCAgICAgICAgICAgICAvKio8IENsb2NrIHN0b3BwZWQuICovCisgICAgICBPTVhfVElNRV9DbG9ja1N0YXRlS2hyb25vc0V4dGVuc2lvbnMgPSAweDZGMDAwMDAwLCAvKio8IFJlc2VydmVkIHJlZ2lvbiBmb3IgaW50cm9kdWNpbmcgS2hyb25vcyBTdGFuZGFyZCBFeHRlbnNpb25zICovIAorICAgICAgT01YX1RJTUVfQ2xvY2tTdGF0ZVZlbmRvclN0YXJ0VW51c2VkID0gMHg3RjAwMDAwMCwgLyoqPCBSZXNlcnZlZCByZWdpb24gZm9yIGludHJvZHVjaW5nIFZlbmRvciBFeHRlbnNpb25zICovCisgICAgICBPTVhfVElNRV9DbG9ja1N0YXRlTWF4ID0gMHg3RkZGRkZGRgorfSBPTVhfVElNRV9DTE9DS1NUQVRFOworCisvKiogU3RydWN0dXJlIHJlcHJlc2VudGluZyBhIG1lZGlhIHRpbWUgcmVxdWVzdCB0byB0aGUgY2xvY2sgY29tcG9uZW50LgorICoKKyAqICBBIGNsaWVudCBjb21wb25lbnQgc2VuZHMgdGhpcyBzdHJ1Y3R1cmUgdG8gdGhlIENsb2NrIENvbXBvbmVudCB2aWEgYSBTZXRDb25maWcKKyAqICBvbiBpdHMgY2xpZW50IHBvcnQgdG8gc3BlY2lmeSBhIG1lZGlhIHRpbWVzdGFtcCB0aGUgQ2xvY2sgQ29tcG9uZW50CisgKiAgc2hvdWxkIGVtaXQuICBUaGUgQ2xvY2sgQ29tcG9uZW50IHNob3VsZCBmdWxmaWxsIHRoZSByZXF1ZXN0IGJ5IHNlbmRpbmcgYQorICogIE9NWF9USU1FX01FRElBVElNRVRZUEUgd2hlbiBpdHMgbWVkaWEgY2xvY2sgbWF0Y2hlcyB0aGUgcmVxdWVzdGVkIAorICogIHRpbWVzdGFtcC4KKyAqCisgKiAgVGhlIGNsaWVudCBtYXkgcmVxdWlyZSBhIG1lZGlhIHRpbWUgcmVxdWVzdCBiZSBmdWxmaWxsZWQgc2xpZ2h0bHkKKyAqICBlYXJsaWVyIHRoYW4gdGhlIG1lZGlhIHRpbWUgc3BlY2lmaWVkLiBJbiB0aGlzIGNhc2UgdGhlIGNsaWVudCBzcGVjaWZpZXMgCisgKiAgYW4gb2Zmc2V0IHdoaWNoIGlzIGVxdWFsIHRvIHRoZSBkaWZmZXJlbmNlIGJldHdlZW4gd2FsbCB0aW1lIGNvcnJlc3BvbmRpbmcgCisgKiAgdG8gdGhlIHJlcXVlc3RlZCBtZWRpYSB0aW1lIGFuZCB0aGUgd2FsbCB0aW1lIHdoZW4gaXQgd2lsbCBiZSAKKyAqICBmdWxmaWxsZWQuIAorICoKKyAqICBBIGNsaWVudCBjb21wb25lbnQgbWF5IHVzZXMgdGhlc2UgcmVxdWVzdHMgYW5kIHRoZSBPTVhfVElNRV9NRURJQVRJTUVUWVBFIHRvCisgKiAgdGltZSBldmVudHMgYWNjb3JkaW5nIHRvIHRpbWVzdGFtcHMuIElmIGEgY2xpZW50IG11c3QgcGVyZm9ybSBhbiBvcGVyYXRpb24gTyBhdAorICogIGEgdGltZSBUIChlLmcuIGRlbGl2ZXIgYSB2aWRlbyBmcmFtZSBhdCBpdHMgY29ycmVzcG9uZGluZyB0aW1lc3RhbXApLCBpdCBtYWtlcyBhIAorICogIG1lZGlhIHRpbWUgcmVxdWVzdCBhdCBUIChwZXJoYXBzIHNwZWNpZnlpbmcgYW4gb2Zmc2V0IHRvIGVuc3VyZSB0aGUgcmVxdWVzdCBmdWxmaWxsbWVudAorICogIGlzIGEgbGl0dGxlIGVhcmx5KS4gV2hlbiB0aGUgY2xvY2sgY29tcG9uZW50IHBhc3NlcyB0aGUgcmVzdWx0aW5nIE9NWF9USU1FX01FRElBVElNRVRZUEUKKyAqICBzdHJ1Y3R1cmUgYmFjayB0byB0aGUgY2xpZW50IGNvbXBvbmVudCwgdGhlIGNsaWVudCBtYXkgcGVyZm9ybSBvcGVyYXRpb24gTyAocGVyaGFwcyBoYXZpbmcKKyAqICB0byB3YWl0IGEgc2xpZ2h0IGFtb3VudCBtb3JlIHRpbWUgaXRzZWxmIGFzIHNwZWNpZmllZCBieSB0aGUgcmV0dXJuIHZhbHVlcykuCisgKi8KKwordHlwZWRlZiBzdHJ1Y3QgT01YX1RJTUVfQ09ORklHX01FRElBVElNRVJFUVVFU1RUWVBFIHsKKyAgICBPTVhfVTMyIG5TaXplOyAgICAgICAgICAgICAgLyoqPCBzaXplIG9mIHRoZSBzdHJ1Y3R1cmUgaW4gYnl0ZXMgKi8KKyAgICBPTVhfVkVSU0lPTlRZUEUgblZlcnNpb247ICAgLyoqPCBPTVggc3BlY2lmaWNhdGlvbiB2ZXJzaW9uIGluZm9ybWF0aW9uICovCisgICAgT01YX1UzMiBuUG9ydEluZGV4OyAgICAgICAgIC8qKjwgcG9ydCB0aGF0IHRoaXMgc3RydWN0dXJlIGFwcGxpZXMgdG8gKi8KKyAgICBPTVhfUFRSIHBDbGllbnRQcml2YXRlOyAgICAgLyoqPCBDbGllbnQgcHJpdmF0ZSBkYXRhIHRvIGRpc2FiaWd1YXRlIHRoaXMgbWVkaWEgdGltZSAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogICBmcm9tIG90aGVycyAoZS5nLiB0aGUgbnVtYmVyIG9mIHRoZSBmcmFtZSB0byBkZWxpdmVyKS4gCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqICAgRHVwbGljYXRlZCBpbiB0aGUgbWVkaWEgdGltZSBzdHJ1Y3R1cmUgdGhhdCBmdWxmaWxscyAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogICB0aGlzIHJlcXVlc3QuIEEgdmFsdWUgb2YgemVybyBpcyByZXNlcnZlZCBmb3IgdGltZSBzY2FsZSAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogICB1cGRhdGVzLiAqLworICAgIE9NWF9USUNLUyBuTWVkaWFUaW1lc3RhbXA7ICAvKio8IE1lZGlhIHRpbWVzdGFtcCByZXF1ZXN0ZWQuKi8gCisgICAgT01YX1RJQ0tTIG5PZmZzZXQ7ICAgICAgICAgIC8qKjwgQW1vdW50IG9mIHdhbGwgY2xvY2sgdGltZSBieSB3aGljaCB0aGlzCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqICAgcmVxdWVzdCBzaG91bGQgYmUgZnVsZmlsbGVkIGVhcmx5ICovCit9IE9NWF9USU1FX0NPTkZJR19NRURJQVRJTUVSRVFVRVNUVFlQRTsKKworLyoqPCBTdHJ1Y3R1cmUgc2VudCBmcm9tIHRoZSBjbG9jayBjb21wb25lbnQgY2xpZW50IGVpdGhlciB3aGVuIGZ1bGZpbGxpbmcgCisgKiAgIGEgbWVkaWEgdGltZSByZXF1ZXN0IG9yIHdoZW4gdGhlIHRpbWUgc2NhbGUgaGFzIGNoYW5nZWQuIAorICoKKyAqICAgSW4gdGhlIGZvcm1lciBjYXNlIHRoZSBDbG9jayBDb21wb25lbnQgZmlsbHMgdGhpcyBzdHJ1Y3R1cmUgYW5kIHRpbWVzIGl0cyBlbWlzc2lvbiAKKyAqICAgdG8gYSBjbGllbnQgY29tcG9uZW50ICh2aWEgdGhlIGNsaWVudCBwb3J0KSBhY2NvcmRpbmcgdG8gdGhlIGNvcnJlc3BvbmRpbmcgbWVkaWEgCisgKiAgIHRpbWUgcmVxdWVzdCBzZW50IGJ5IHRoZSBjbGllbnQuIFRoZSBDbG9jayBDb21wb25lbnQgc2hvdWxkIHRpbWUgdGhlIGVtaXNzaW9uIHRvIG9jY3VyCisgKiAgIHdoZW4gdGhlIHJlcXVlc3RlZCB0aW1lc3RhbXAgbWF0Y2hlcyB0aGUgQ2xvY2sgQ29tcG9uZW50J3MgbWVkaWEgdGltZSBidXQgYWxzbyB0aGUgCisgKiAgIHByZXNjcmliZWQgb2Zmc2V0IGVhcmx5LiAKKyAqCisgKiAgIFVwb24gc2NhbGUgY2hhbmdlcyB0aGUgY2xvY2sgY29tcG9uZW50IGNsZWFycyB0aGUgbkNsaWVudFByaXZhdGUgZGF0YSwgc2VuZHMgdGhlIGN1cnJlbnQKKyAqICAgbWVkaWEgdGltZSBhbmQgc2V0cyB0aGUgblNjYWxlIHRvIHRoZSBuZXcgc2NhbGUgdmlhIHRoZSBjbGllbnQgcG9ydC4gSXQgZW1pdHMgYSAKKyAqICAgT01YX1RJTUVfTUVESUFUSU1FVFlQRSB0byBhbGwgY2xpZW50cyBpbmRlcGVuZGVudCBvZiBhbnkgcmVxdWVzdHMuIFRoaXMgYWxsb3dzIGNsaWVudHMgdG8gCisgKiAgIGFsdGVyIHByb2Nlc3NpbmcgdG8gYWNjb21vZGF0ZSBzY2FsaW5nLiBGb3IgaW5zdGFuY2UgYSB2aWRlbyBjb21wb25lbnQgbWlnaHQgc2tpcCBpbnRlci1mcmFtZXMgCisgKiAgIGluIHRoZSBjYXNlIG9mIGV4dHJlbWUgZmFzdGZvcndhcmQuIExpa2V3aXNlIGFuIGF1ZGlvIGNvbXBvbmVudCBtaWdodCBhZGQgb3IgcmVtb3ZlIHNhbXBsZXMgCisgKiAgIGZyb20gYW4gYXVkaW8gZnJhbWUgdG8gc2NhbGUgYXVkaW8gZGF0YS4gCisgKgorICogICBJdCBpcyBleHBlY3RlZCB0aGF0IHNvbWUgY2xvY2sgY29tcG9uZW50cyBtYXkgbm90IGJlIGFibGUgdG8gZnVsZmlsbCByZXF1ZXN0cworICogICBhdCBleGFjdGx5IHRoZSBwcmVzY3JpYmVkIHRpbWUuIFRoaXMgaXMgYWNjZXB0YWJsZSBzbyBsb25nIGFzIHRoZSByZXF1ZXN0IGlzIAorICogICBmdWxmaWxsZWQgYXQgbGVhc3QgYXMgZWFybHkgYXMgZGVzY3JpYmVkIGFuZCBub3QgbGF0ZXIuIFRoaXMgc3RydWN0dXJlIHByb3ZpZGVzIAorICogICBmaWVsZHMgdGhlIGNsaWVudCBtYXkgdXNlIHRvIHdhaXQgZm9yIHRoZSByZW1haW5pbmcgdGltZS4KKyAqCisgKiAgIFRoZSBjbGllbnQgbWF5IHVzZSBlaXRoZXIgdGhlIG5PZmZzZXQgb3IgbldhbGxUaW1lQXRNZWRpYSBmaWVsZHMgdG8gZGV0ZXJtaW5lIHRoZSAKKyAqICAgd2FsbCB0aW1lIHVudGlsIHRoZSBuTWVkaWFUaW1lc3RhbXAgYWN0dWFsbHkgb2NjdXJzLiBJbiB0aGUgbGF0dGVyIGNhc2UgdGhlCisgKiAgIGNsaWVudCBjYW4gZ2V0IGEgbW9yZSBhY2N1cmF0ZSB2YWx1ZSBmb3Igb2Zmc2V0IGJ5IGdldHRpbmcgdGhlIGN1cnJlbnQgd2FsbAorICogICBmcm9tIHRoZSBjbG9jIGNvbXBvbmVudCBhbmQgc3VidHJhY3RpbmcgaXQgZnJvbSBuV2FsbFRpbWVBdE1lZGlhLiAKKyAqLworCit0eXBlZGVmIHN0cnVjdCBPTVhfVElNRV9NRURJQVRJTUVUWVBFIHsKKyAgICBPTVhfVTMyIG5TaXplOyAgICAgICAgICAgICAgICAgIC8qKjwgc2l6ZSBvZiB0aGUgc3RydWN0dXJlIGluIGJ5dGVzICovCisgICAgT01YX1ZFUlNJT05UWVBFIG5WZXJzaW9uOyAgICAgICAvKio8IE9NWCBzcGVjaWZpY2F0aW9uIHZlcnNpb24gaW5mb3JtYXRpb24gKi8KKyAgICBPTVhfVTMyIG5DbGllbnRQcml2YXRlOyAgICAgICAgIC8qKjwgQ2xpZW50IHByaXZhdGUgZGF0YSB0byBkaXNhYmlndWF0ZSB0aGlzIG1lZGlhIHRpbWUgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiAgIGZyb20gb3RoZXJzLiBDb3BpZWQgZnJvbSB0aGUgbWVkaWEgdGltZSByZXF1ZXN0LiAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqICAgQSB2YWx1ZSBvZiB6ZXJvIGlzIHJlc2VydmVkIGZvciB0aW1lIHNjYWxlIHVwZGF0ZXMuICovCisgICAgT01YX1RJTUVfVVBEQVRFVFlQRSBlVXBkYXRlVHlwZTsgLyoqPCBSZWFzb24gZm9yIHRoZSB1cGRhdGUgKi8KKyAgICBPTVhfVElDS1Mgbk1lZGlhVGltZXN0YW1wOyAgICAgIC8qKjwgTWVkaWEgdGltZSByZXF1ZXN0ZWQuIElmIG5vIG1lZGlhIHRpbWUgd2FzIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogICByZXF1ZXN0ZWQgdGhlbiB0aGlzIGlzIHRoZSBjdXJyZW50IG1lZGlhIHRpbWUuICovIAorICAgIE9NWF9USUNLUyBuT2Zmc2V0OyAgICAgICAgICAgICAgLyoqPCBBbW91bnQgb2Ygd2FsbCBjbG9jayB0aW1lIGJ5IHdoaWNoIHRoaXMKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqICAgcmVxdWVzdCB3YXMgYWN0dWFsbHkgZnVsZmlsbGVkIGVhcmx5ICovCisKKyAgICBPTVhfVElDS1MgbldhbGxUaW1lQXRNZWRpYVRpbWU7IC8qKjwgV2FsbCB0aW1lIGNvcnJlc3BvbmRpbmcgdG8gbk1lZGlhVGltZVN0YW1wLgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogICBBIGNsaWVudCBtYXkgY29tcGFyZSB0aGlzIHZhbHVlIHRvIGN1cnJlbnQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqICAgbWVkaWEgdGltZSBvYnRhaW5lZCBmcm9tIHRoZSBDbG9jayBDb21wb25lbnQgdG8gZGV0ZXJtaW5lCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiAgIHRoZSB3YWxsIHRpbWUgdW50aWwgdGhlIG1lZGlhIHRpbWVzdGFtcCBpcyByZWFsbHkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqICAgY3VycmVudC4gKi8KKyAgICBPTVhfUzMyIHhTY2FsZTsgICAgICAgICAgICAgICAgIC8qKjwgQ3VycmVudCBtZWRpYSB0aW1lIHNjYWxlIGluIFExNiBmb3JtYXQuICovCisgICAgT01YX1RJTUVfQ0xPQ0tTVEFURSBlU3RhdGU7ICAgICAvKiBTZWVraW5nIENoYW5nZS4gQWRkZWQgNy8xMi4qLworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyoqPCBTdGF0ZSBvZiB0aGUgbWVkaWEgdGltZS4gKi8KK30gT01YX1RJTUVfTUVESUFUSU1FVFlQRTsgIAorCisvKiogU3RydWN0dXJlIHJlcHJlc2VudGluZyB0aGUgY3VycmVudCBtZWRpYSB0aW1lIHNjYWxlIGZhY3Rvci4gQXBwbGljYWJsZSBvbmx5IHRvIGNsb2NrIAorICogIGNvbXBvbmVudCwgb3RoZXIgY29tcG9uZW50cyBzZWUgc2NhbGUgY2hhbmdlcyB2aWEgT01YX1RJTUVfTUVESUFUSU1FVFlQRSBidWZmZXJzIHNlbnQgdmlhCisgKiAgdGhlIGNsb2NrIGNvbXBvbmVudCBjbGllbnQgcG9ydHMuIFVwb24gcmVjaWV2aW5nIHRoaXMgY29uZmlnIHRoZSBjbG9jayBjb21wb25lbnQgY2hhbmdlcyAKKyAqICB0aGUgcmF0ZSBieSB3aGljaCB0aGUgbWVkaWEgdGltZSBpbmNyZWFzZXMgb3IgZGVjcmVhc2VzIGVmZmVjdGl2ZWx5IGltcGxlbWVudGluZyB0cmljayBtb2Rlcy4gCisgKi8gCit0eXBlZGVmIHN0cnVjdCBPTVhfVElNRV9DT05GSUdfU0NBTEVUWVBFIHsKKyAgICBPTVhfVTMyIG5TaXplOyAgICAgICAgICAgICAgICAgIC8qKjwgc2l6ZSBvZiB0aGUgc3RydWN0dXJlIGluIGJ5dGVzICovCisgICAgT01YX1ZFUlNJT05UWVBFIG5WZXJzaW9uOyAgICAgICAvKio8IE9NWCBzcGVjaWZpY2F0aW9uIHZlcnNpb24gaW5mb3JtYXRpb24gKi8KKyAgICBPTVhfUzMyIHhTY2FsZTsgICAgICAgICAgICAgICAgIC8qKjwgVGhpcyBpcyBhIHZhbHVlIGluIFExNiBmb3JtYXQgd2hpY2ggaXMgdXNlZCBmb3IKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqIHNjYWxpbmcgdGhlIG1lZGlhIHRpbWUgKi8KK30gT01YX1RJTUVfQ09ORklHX1NDQUxFVFlQRTsKKyAKKy8qKiBCaXRzIHVzZWQgdG8gaWRlbnRpZnkgYSBjbG9jayBwb3J0LiBVc2VkIGluIE9NWF9USU1FX0NPTkZJR19DTE9DS1NUQVRFVFlQRZJzIG5XYWl0TWFzayBmaWVsZCAqLworI2RlZmluZSBPTVhfQ0xPQ0tQT1JUMCAweDAwMDAwMDAxCisjZGVmaW5lIE9NWF9DTE9DS1BPUlQxIDB4MDAwMDAwMDIKKyNkZWZpbmUgT01YX0NMT0NLUE9SVDIgMHgwMDAwMDAwNAorI2RlZmluZSBPTVhfQ0xPQ0tQT1JUMyAweDAwMDAwMDA4CisjZGVmaW5lIE9NWF9DTE9DS1BPUlQ0IDB4MDAwMDAwMTAKKyNkZWZpbmUgT01YX0NMT0NLUE9SVDUgMHgwMDAwMDAyMAorI2RlZmluZSBPTVhfQ0xPQ0tQT1JUNiAweDAwMDAwMDQwCisjZGVmaW5lIE9NWF9DTE9DS1BPUlQ3IDB4MDAwMDAwODAKKworLyoqIFN0cnVjdHVyZSByZXByZXNlbnRpbmcgdGhlIGN1cnJlbnQgbW9kZSBvZiB0aGUgbWVkaWEgY2xvY2suIAorICogIElMIENsaWVudCB1c2VzIHRoaXMgY29uZmlnIHRvIGNoYW5nZSBvciBxdWVyeSB0aGUgbW9kZSBvZiB0aGUgCisgKiAgbWVkaWEgY2xvY2sgb2YgdGhlIGNsb2NrIGNvbXBvbmVudC4gQXBwbGljYWJsZSBvbmx5IHRvIGNsb2NrCisgKiAgY29tcG9uZW50LiAKKyAqICAKKyAqICBPbiBhIFNldENvbmZpZyBpZiBlU3RhdGUgaXMgT01YX1RJTUVfQ2xvY2tTdGF0ZVJ1bm5pbmcgbWVkaWEgdGltZQorICogIHN0YXJ0cyBpbW1lZGlhdGVseSBhdCB0aGUgcHJlc2NyaWJlZCBzdGFydCB0aW1lLiBJZgorICogIE9NWF9USU1FX0Nsb2NrU3RhdGVXYWl0aW5nRm9yU3RhcnRUaW1lIHRoZSBDbG9jayBDb21wb25lbnQgaWdub3JlcworICogIHRoZSBnaXZlbiBuU3RhcnRUaW1lIGFuZCB3YWl0cyBmb3IgYWxsIGNsaWVudHMgc3BlY2lmaWVkIGluIHRoZSAKKyAqICBuV2FpdE1hc2sgdG8gc2VuZCBzdGFydHRpbWVzICh2aWEgCisgKiAgT01YX0luZGV4Q29uZmlnVGltZUNsaWVudFN0YXJ0VGltZSkuIFRoZSBDbG9jayBDb21wb25lbnQgdGhlbiBzdGFydHMgCisgKiAgdGhlIG1lZGlhIGNsb2NrIHVzaW5nIHRoZSBlYXJsaWVzdCBzdGFydCB0aW1lIHN1cHBsaWVkLiAqLyAgICAKK3R5cGVkZWYgc3RydWN0IE9NWF9USU1FX0NPTkZJR19DTE9DS1NUQVRFVFlQRSB7CisgICAgT01YX1UzMiBuU2l6ZTsgICAgICAgICAgICAgIC8qKjwgc2l6ZSBvZiB0aGUgc3RydWN0dXJlIGluIGJ5dGVzICovCisgICAgT01YX1ZFUlNJT05UWVBFIG5WZXJzaW9uOyAgIC8qKjwgT01YIHNwZWNpZmljYXRpb24gdmVyc2lvbiAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogICBpbmZvcm1hdGlvbiAqLworICAgIE9NWF9USU1FX0NMT0NLU1RBVEUgZVN0YXRlOyAvKio8IFN0YXRlIG9mIHRoZSBtZWRpYSB0aW1lLiAqLworICAgIE9NWF9USUNLUyBuU3RhcnRUaW1lOyAgICAgICAvKio8IFN0YXJ0IHRpbWUgb2YgdGhlIG1lZGlhIHRpbWUuICovCisgICAgT01YX1RJQ0tTIG5PZmZzZXQ7ICAgICAgICAgIC8qKjwgVGltZSB0byBvZmZzZXQgdGhlIG1lZGlhIHRpbWUgYnkgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqIChlLmcuIHByZXJvbGwpLiBNZWRpYSB0aW1lIHdpbGwgYmUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogcmVwb3J0ZWQgdG8gYmUgbk9mZnNldCB0aWNrcyBlYXJsaWVyLiAgICAgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAgIE9NWF9VMzIgbldhaXRNYXNrOyAgICAgICAgICAvKio8IE1hc2sgb2YgT01YX0NMT0NLUE9SVCB2YWx1ZXMuICovCit9IE9NWF9USU1FX0NPTkZJR19DTE9DS1NUQVRFVFlQRTsKKworLyoqIFN0cnVjdHVyZSByZXByZXNlbnRpbmcgdGhlIHJlZmVyZW5jZSBjbG9jayBjdXJyZW50bHkgYmVpbmcgdXNlZCB0bworICogIGNvbXB1dGUgbWVkaWEgdGltZS4gSUwgY2xpZW50IHVzZXMgdGhpcyBjb25maWcgdG8gY2hhbmdlIG9yIHF1ZXJ5IHRoZSAKKyAqICBjbG9jayBjb21wb25lbnQncyBhY3RpdmUgcmVmZXJlbmNlIGNsb2NrICovCit0eXBlZGVmIHN0cnVjdCBPTVhfVElNRV9DT05GSUdfQUNUSVZFUkVGQ0xPQ0tUWVBFIHsKKyAgICBPTVhfVTMyIG5TaXplOyAgICAgICAgICAgICAgICAgIC8qKjwgc2l6ZSBvZiB0aGUgc3RydWN0dXJlIGluIGJ5dGVzICovCisgICAgT01YX1ZFUlNJT05UWVBFIG5WZXJzaW9uOyAgICAgICAvKio8IE9NWCBzcGVjaWZpY2F0aW9uIHZlcnNpb24gaW5mb3JtYXRpb24gKi8KKyAgICBPTVhfVElNRV9SRUZDTE9DS1RZUEUgZUNsb2NrOyAgIC8qKjwgUmVmZXJlbmNlIGNsb2NrIHVzZWQgdG8gY29tcHV0ZSBtZWRpYSB0aW1lICovICAgICAgICAgICAgICAgICAgICAgICAgCit9IE9NWF9USU1FX0NPTkZJR19BQ1RJVkVSRUZDTE9DS1RZUEU7CisKKy8qKiBEZXNjcmlwdG9yIGZvciBzZXR0aW5nIHNwZWNpZmljcyBvZiBwb3dlciB0eXBlLgorICogIE5vdGU6IHRoaXMgc3RydWN0dXJlIGlzIGxpc3RlZCBmb3IgYmFja3dhcmRzIGNvbXBhdGliaWxpdHkuICovCit0eXBlZGVmIHN0cnVjdCBPTVhfT1RIRVJfQ09ORklHX1BPV0VSVFlQRSB7CisgICAgT01YX1UzMiBuU2l6ZTsgICAgICAgICAgICAvKio8IHNpemUgb2YgdGhlIHN0cnVjdHVyZSBpbiBieXRlcyAqLworICAgIE9NWF9WRVJTSU9OVFlQRSBuVmVyc2lvbjsgLyoqPCBPTVggc3BlY2lmaWNhdGlvbiB2ZXJzaW9uIGluZm9ybWF0aW9uICovCisgICAgT01YX0JPT0wgYkVuYWJsZVBNOyAgICAgICAvKio8IEZsYWcgdG8gZW5hYmxlIFBvd2VyIE1hbmFnZW1lbnQgKi8KK30gT01YX09USEVSX0NPTkZJR19QT1dFUlRZUEU7CisKKworLyoqIERlc2NyaXB0b3IgZm9yIHNldHRpbmcgc3BlY2lmaWNzIG9mIHN0YXRzIHR5cGUuCisgKiAgTm90ZTogdGhpcyBzdHJ1Y3R1cmUgaXMgbGlzdGVkIGZvciBiYWNrd2FyZHMgY29tcGF0aWJpbGl0eS4gKi8KK3R5cGVkZWYgc3RydWN0IE9NWF9PVEhFUl9DT05GSUdfU1RBVFNUWVBFIHsKKyAgICBPTVhfVTMyIG5TaXplOyAgICAgICAgICAgIC8qKjwgc2l6ZSBvZiB0aGUgc3RydWN0dXJlIGluIGJ5dGVzICovCisgICAgT01YX1ZFUlNJT05UWVBFIG5WZXJzaW9uOyAvKio8IE9NWCBzcGVjaWZpY2F0aW9uIHZlcnNpb24gaW5mb3JtYXRpb24gKi8KKyAgICAvKiB3aGF0IGdvZXMgaGVyZSAqLworfSBPTVhfT1RIRVJfQ09ORklHX1NUQVRTVFlQRTsKKworCisvKioKKyAqIFRoZSBQb3J0RGVmaW5pdGlvbiBzdHJ1Y3R1cmUgaXMgdXNlZCB0byBkZWZpbmUgYWxsIG9mIHRoZSBwYXJhbWV0ZXJzIAorICogbmVjZXNzYXJ5IGZvciB0aGUgY29tcGxpYW50IGNvbXBvbmVudCB0byBzZXR1cCBhbiBpbnB1dCBvciBhbiBvdXRwdXQgb3RoZXIgCisgKiBwYXRoLgorICovCit0eXBlZGVmIHN0cnVjdCBPTVhfT1RIRVJfUE9SVERFRklOSVRJT05UWVBFIHsKKyAgICBPTVhfT1RIRVJfRk9STUFUVFlQRSBlRm9ybWF0OyAgLyoqPCBUeXBlIG9mIGRhdGEgZXhwZWN0ZWQgZm9yIHRoaXMgY2hhbm5lbCAqLworfSBPTVhfT1RIRVJfUE9SVERFRklOSVRJT05UWVBFOworCisvKiogIFBvcnQgZm9ybWF0IHBhcmFtZXRlci4gIFRoaXMgc3RydWN0dXJlIGlzIHVzZWQgdG8gZW51bWVyYXRlCisgICogIHRoZSB2YXJpb3VzIGRhdGEgaW5wdXQvb3V0cHV0IGZvcm1hdCBzdXBwb3J0ZWQgYnkgdGhlIHBvcnQuCisgICovCit0eXBlZGVmIHN0cnVjdCBPTVhfT1RIRVJfUEFSQU1fUE9SVEZPUk1BVFRZUEUgeworICAgIE9NWF9VMzIgblNpemU7IC8qKjwgc2l6ZSBvZiB0aGUgc3RydWN0dXJlIGluIGJ5dGVzICovCisgICAgT01YX1ZFUlNJT05UWVBFIG5WZXJzaW9uOyAvKio8IE9NWCBzcGVjaWZpY2F0aW9uIHZlcnNpb24gaW5mb3JtYXRpb24gKi8KKyAgICBPTVhfVTMyIG5Qb3J0SW5kZXg7IC8qKjwgSW5kaWNhdGVzIHdoaWNoIHBvcnQgdG8gc2V0ICovCisgICAgT01YX1UzMiBuSW5kZXg7IC8qKjwgSW5kaWNhdGVzIHRoZSBlbnVtZXJhdGlvbiBpbmRleCBmb3IgdGhlIGZvcm1hdCBmcm9tIDB4MCB0byBOLTEgKi8KKyAgICBPTVhfT1RIRVJfRk9STUFUVFlQRSBlRm9ybWF0OyAvKio8IFR5cGUgb2YgZGF0YSBleHBlY3RlZCBmb3IgdGhpcyBjaGFubmVsICovCit9IE9NWF9PVEhFUl9QQVJBTV9QT1JURk9STUFUVFlQRTsgCisKKyNpZmRlZiBfX2NwbHVzcGx1cworfQorI2VuZGlmIC8qIF9fY3BsdXNwbHVzICovCisKKyNlbmRpZgorLyogRmlsZSBFT0YgKi8KZGlmZiAtLWdpdCBhL2V4eW5vczQvbXVsdGltZWRpYS9vcGVubWF4L3NlY19vbXgvaW5jbHVkZS9raHJvbm9zL09NWF9UeXBlcy5oIGIvZXh5bm9zNC9tdWx0aW1lZGlhL29wZW5tYXgvc2VjX29teC9pbmNsdWRlL2tocm9ub3MvT01YX1R5cGVzLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzFiZTkxNgotLS0gL2Rldi9udWxsCisrKyBiL2V4eW5vczQvbXVsdGltZWRpYS9vcGVubWF4L3NlY19vbXgvaW5jbHVkZS9raHJvbm9zL09NWF9UeXBlcy5oCkBAIC0wLDAgKzEsMzQ3IEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDA4IFRoZSBLaHJvbm9zIEdyb3VwIEluYy4gCisgKiAKKyAqIFBlcm1pc3Npb24gaXMgaGVyZWJ5IGdyYW50ZWQsIGZyZWUgb2YgY2hhcmdlLCB0byBhbnkgcGVyc29uIG9idGFpbmluZworICogYSBjb3B5IG9mIHRoaXMgc29mdHdhcmUgYW5kIGFzc29jaWF0ZWQgZG9jdW1lbnRhdGlvbiBmaWxlcyAodGhlCisgKiAiU29mdHdhcmUiKSwgdG8gZGVhbCBpbiB0aGUgU29mdHdhcmUgd2l0aG91dCByZXN0cmljdGlvbiwgaW5jbHVkaW5nCisgKiB3aXRob3V0IGxpbWl0YXRpb24gdGhlIHJpZ2h0cyB0byB1c2UsIGNvcHksIG1vZGlmeSwgbWVyZ2UsIHB1Ymxpc2gsCisgKiBkaXN0cmlidXRlLCBzdWJsaWNlbnNlLCBhbmQvb3Igc2VsbCBjb3BpZXMgb2YgdGhlIFNvZnR3YXJlLCBhbmQgdG8KKyAqIHBlcm1pdCBwZXJzb25zIHRvIHdob20gdGhlIFNvZnR3YXJlIGlzIGZ1cm5pc2hlZCB0byBkbyBzbywgc3ViamVjdAorICogdG8gdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOiAKKyAqIFRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIHNoYWxsIGJlIGluY2x1ZGVkCisgKiBpbiBhbGwgY29waWVzIG9yIHN1YnN0YW50aWFsIHBvcnRpb25zIG9mIHRoZSBTb2Z0d2FyZS4gCisgKiAKKyAqIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBFWFBSRVNTCisgKiBPUiBJTVBMSUVELCBJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPIFRIRSBXQVJSQU5USUVTIE9GCisgKiBNRVJDSEFOVEFCSUxJVFksIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORCBOT05JTkZSSU5HRU1FTlQuCisgKiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SUyBPUiBDT1BZUklHSFQgSE9MREVSUyBCRSBMSUFCTEUgRk9SIEFOWQorICogQ0xBSU0sIERBTUFHRVMgT1IgT1RIRVIgTElBQklMSVRZLCBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwKKyAqIFRPUlQgT1IgT1RIRVJXSVNFLCBBUklTSU5HIEZST00sIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFCisgKiBTT0ZUV0FSRSBPUiBUSEUgVVNFIE9SIE9USEVSIERFQUxJTkdTIElOIFRIRSBTT0ZUV0FSRS4gCisgKgorICovCisKKy8qKiBPTVhfVHlwZXMuaCAtIE9wZW5NYXggSUwgdmVyc2lvbiAxLjEuMgorICogIFRoZSBPTVhfVHlwZXMgaGVhZGVyIGZpbGUgY29udGFpbnMgdGhlIHByaW1pdGl2ZSB0eXBlIGRlZmluaXRpb25zIHVzZWQgYnkgCisgKiAgdGhlIGNvcmUsIHRoZSBhcHBsaWNhdGlvbiBhbmQgdGhlIGNvbXBvbmVudC4gIFRoaXMgZmlsZSBtYXkgbmVlZCB0byBiZQorICogIG1vZGlmaWVkIHRvIGJlIHVzZWQgb24gc3lzdGVtcyB0aGF0IGRvIG5vdCBoYXZlICJjaGFyIiBzZXQgdG8gOCBiaXRzLCAKKyAqICAic2hvcnQiIHNldCB0byAxNiBiaXRzIGFuZCAibG9uZyIgc2V0IHRvIDMyIGJpdHMuCisgKi8KKworI2lmbmRlZiBPTVhfVHlwZXNfaAorI2RlZmluZSBPTVhfVHlwZXNfaAorCisjaWZkZWYgX19jcGx1c3BsdXMKK2V4dGVybiAiQyIgeworI2VuZGlmIC8qIF9fY3BsdXNwbHVzICovCisKKy8qKiBUaGUgT01YX0FQSSBhbmQgT01YX0FQSUVOVFJZIGFyZSBwbGF0Zm9ybSBzcGVjaWZpYyBkZWZpbml0aW9ucyB1c2VkCisgKiAgdG8gZGVjbGFyZSBPTVggZnVuY3Rpb24gcHJvdG90eXBlcy4gIFRoZXkgYXJlIG1vZGlmaWVkIHRvIG1lZXQgdGhlCisgKiAgcmVxdWlyZW1lbnRzIGZvciBhIHBhcnRpY3VsYXIgcGxhdGZvcm0gKi8KKyNpZmRlZiBfX1NZTUJJQU4zMl9fICAgCisjICAgaWZkZWYgX19PTVhfRVhQT1JUUworIyAgICAgICBkZWZpbmUgT01YX0FQSSBfX2RlY2xzcGVjKGRsbGV4cG9ydCkKKyMgICBlbHNlCisjICAgICAgIGlmZGVmIF9XSU4zMgorIyAgICAgICAgICAgZGVmaW5lIE9NWF9BUEkgX19kZWNsc3BlYyhkbGxleHBvcnQpIAorIyAgICAgICBlbHNlCisjICAgICAgICAgICBkZWZpbmUgT01YX0FQSSBfX2RlY2xzcGVjKGRsbGltcG9ydCkKKyMgICAgICAgZW5kaWYKKyMgICBlbmRpZgorI2Vsc2UKKyMgICBpZmRlZiBfV0lOMzIKKyMgICAgICBpZmRlZiBfX09NWF9FWFBPUlRTCisjICAgICAgICAgIGRlZmluZSBPTVhfQVBJIF9fZGVjbHNwZWMoZGxsZXhwb3J0KQorIyAgICAgIGVsc2UKKyMgICAgICAgICAgZGVmaW5lIE9NWF9BUEkgX19kZWNsc3BlYyhkbGxpbXBvcnQpCisjICAgICAgZW5kaWYKKyMgICBlbHNlCisjICAgICAgaWZkZWYgX19PTVhfRVhQT1JUUworIyAgICAgICAgICBkZWZpbmUgT01YX0FQSQorIyAgICAgIGVsc2UKKyMgICAgICAgICAgZGVmaW5lIE9NWF9BUEkgZXh0ZXJuCisjICAgICAgZW5kaWYKKyMgICBlbmRpZgorI2VuZGlmCisKKyNpZm5kZWYgT01YX0FQSUVOVFJZCisjZGVmaW5lIE9NWF9BUElFTlRSWSAKKyNlbmRpZiAKKworLyoqIE9NWF9JTiBpcyB1c2VkIHRvIGlkZW50aWZ5IGlucHV0cyB0byBhbiBPTVggZnVuY3Rpb24uICBUaGlzIGRlc2lnbmF0aW9uIAorICAgIHdpbGwgYWxzbyBiZSB1c2VkIGluIHRoZSBjYXNlIG9mIGEgcG9pbnRlciB0aGF0IHBvaW50cyB0byBhIHBhcmFtZXRlciAKKyAgICB0aGF0IGlzIHVzZWQgYXMgYW4gb3V0cHV0LiAqLworI2lmbmRlZiBPTVhfSU4KKyNkZWZpbmUgT01YX0lOCisjZW5kaWYKKworLyoqIE9NWF9PVVQgaXMgdXNlZCB0byBpZGVudGlmeSBvdXRwdXRzIGZyb20gYW4gT01YIGZ1bmN0aW9uLiAgVGhpcyAKKyAgICBkZXNpZ25hdGlvbiB3aWxsIGFsc28gYmUgdXNlZCBpbiB0aGUgY2FzZSBvZiBhIHBvaW50ZXIgdGhhdCBwb2ludHMgCisgICAgdG8gYSBwYXJhbWV0ZXIgdGhhdCBpcyB1c2VkIGFzIGFuIGlucHV0LiAqLworI2lmbmRlZiBPTVhfT1VUCisjZGVmaW5lIE9NWF9PVVQKKyNlbmRpZgorCisKKy8qKiBPTVhfSU5PVVQgaXMgdXNlZCB0byBpZGVudGlmeSBwYXJhbWV0ZXJzIHRoYXQgbWF5IGJlIGVpdGhlciBpbnB1dHMgb3IKKyAgICBvdXRwdXRzIGZyb20gYW4gT01YIGZ1bmN0aW9uIGF0IHRoZSBzYW1lIHRpbWUuICBUaGlzIGRlc2lnbmF0aW9uIHdpbGwgCisgICAgYWxzbyBiZSB1c2VkIGluIHRoZSBjYXNlIG9mIGEgcG9pbnRlciB0aGF0ICBwb2ludHMgdG8gYSBwYXJhbWV0ZXIgdGhhdCAKKyAgICBpcyB1c2VkIGJvdGggYXMgYW4gaW5wdXQgYW5kIGFuIG91dHB1dC4gKi8KKyNpZm5kZWYgT01YX0lOT1VUCisjZGVmaW5lIE9NWF9JTk9VVAorI2VuZGlmCisKKy8qKiBPTVhfQUxMIGlzIHVzZWQgdG8gYXMgYSB3aWxkY2FyZCB0byBzZWxlY3QgYWxsIGVudGl0aWVzIG9mIHRoZSBzYW1lIHR5cGUKKyAqICB3aGVuIHNwZWNpZnlpbmcgdGhlIGluZGV4LCBvciByZWZlcnJpbmcgdG8gYSBvYmplY3QgYnkgYW4gaW5kZXguICAoaS5lLgorICogIHVzZSBPTVhfQUxMIHRvIGluZGljYXRlIGFsbCBOIGNoYW5uZWxzKS4gV2hlbiB1c2VkIGFzIGEgcG9ydCBpbmRleAorICogIGZvciBhIGNvbmZpZyBvciBwYXJhbWV0ZXIgdGhpcyBPTVhfQUxMIGRlbm90ZXMgdGhhdCB0aGUgY29uZmlnIG9yCisgKiAgcGFyYW1ldGVyIGFwcGxpZXMgdG8gdGhlIGVudGlyZSBjb21wb25lbnQgbm90IGp1c3Qgb25lIHBvcnQuICovCisjZGVmaW5lIE9NWF9BTEwgMHhGRkZGRkZGRgorCisvKiogSW4gdGhlIGZvbGxvd2luZyB3ZSBkZWZpbmUgZ3JvdXBzIHRoYXQgaGVscCBidWlsZGluZyBkb3h5Z2VuIGRvY3VtZW50YXRpb24gKi8KKworLyoqIEBkZWZncm91cCBjb3JlIE9wZW5NQVggSUwgY29yZQorICogRnVuY3Rpb25zIGFuZCBzdHJ1Y3R1cmUgcmVsYXRlZCB0byB0aGUgT01YIElMIGNvcmUKKyAqLworIAorIC8qKiBAZGVmZ3JvdXAgY29tcCBPcGVuTUFYIElMIGNvbXBvbmVudAorICogRnVuY3Rpb25zIGFuZCBzdHJ1Y3R1cmUgcmVsYXRlZCB0byB0aGUgT01YIElMIGNvbXBvbmVudAorICovCisgCisvKiogQGRlZmdyb3VwIHJwbSBSZXNvdXJjZSBhbmQgUG9saWN5IE1hbmFnZW1lbnQgCisgKiBTdHJ1Y3R1cmVzIGZvciByZXNvdXJjZSBhbmQgcG9saWN5IG1hbmFnZW1lbnQgb2YgY29tcG9uZW50cworICovCisKKy8qKiBAZGVmZ3JvdXAgYnVmIEJ1ZmZlciBNYW5hZ2VtZW50CisgKiBCdWZmZXIgaGFuZGxpbmcgZnVuY3Rpb25zIGFuZCBzdHJ1Y3R1cmVzCisgKi8KKyAgCisvKiogQGRlZmdyb3VwIHR1biBUdW5uZWxpbmcKKyAqIEBpbmdyb3VwIGNvcmUgY29tcAorICogU3RydWN0dXJlcyBhbmQgZnVuY3Rpb25zIHRvIG1hbmFnZSB0dW5uZWxzIGFtb25nIGNvbXBvbmVudCBwb3J0cworICovCisgCisvKiogQGRlZmdyb3VwIGNwIENvbnRlbnQgUGlwZXMKKyAqICBAaW5ncm91cCBjb3JlCisgKi8KKyAKKyAvKiogQGRlZmdyb3VwIG1ldGFkYXRhIE1ldGFkYXRhIGhhbmRsaW5nCisgICogCisgICovIAorCisvKiogT01YX1U4IGlzIGFuIDggYml0IHVuc2lnbmVkIHF1YW50aXR5IHRoYXQgaXMgYnl0ZSBhbGlnbmVkICovCit0eXBlZGVmIHVuc2lnbmVkIGNoYXIgT01YX1U4OworCisvKiogT01YX1M4IGlzIGFuIDggYml0IHNpZ25lZCBxdWFudGl0eSB0aGF0IGlzIGJ5dGUgYWxpZ25lZCAqLwordHlwZWRlZiBzaWduZWQgY2hhciBPTVhfUzg7CisKKy8qKiBPTVhfVTE2IGlzIGEgMTYgYml0IHVuc2lnbmVkIHF1YW50aXR5IHRoYXQgaXMgMTYgYml0IHdvcmQgYWxpZ25lZCAqLwordHlwZWRlZiB1bnNpZ25lZCBzaG9ydCBPTVhfVTE2OworCisvKiogT01YX1MxNiBpcyBhIDE2IGJpdCBzaWduZWQgcXVhbnRpdHkgdGhhdCBpcyAxNiBiaXQgd29yZCBhbGlnbmVkICovCit0eXBlZGVmIHNpZ25lZCBzaG9ydCBPTVhfUzE2OworCisvKiogT01YX1UzMiBpcyBhIDMyIGJpdCB1bnNpZ25lZCBxdWFudGl0eSB0aGF0IGlzIDMyIGJpdCB3b3JkIGFsaWduZWQgKi8KK3R5cGVkZWYgdW5zaWduZWQgbG9uZyBPTVhfVTMyOworCisvKiogT01YX1MzMiBpcyBhIDMyIGJpdCBzaWduZWQgcXVhbnRpdHkgdGhhdCBpcyAzMiBiaXQgd29yZCBhbGlnbmVkICovCit0eXBlZGVmIHNpZ25lZCBsb25nIE9NWF9TMzI7CisKKworLyogVXNlcnMgd2l0aCBjb21waWxlcnMgdGhhdCBjYW5ub3QgYWNjZXB0IHRoZSAibG9uZyBsb25nIiBkZXNpZ25hdGlvbiBzaG91bGQKKyAgIGRlZmluZSB0aGUgT01YX1NLSVA2NEJJVCBtYWNyby4gIEl0IHNob3VsZCBiZSBub3RlZCB0aGF0IHRoaXMgbWF5IGNhdXNlIAorICAgc29tZSBjb21wb25lbnRzIHRvIGZhaWwgdG8gY29tcGlsZSBpZiB0aGUgY29tcG9uZW50IHdhcyB3cml0dGVuIHRvIHJlcXVpcmUKKyAgIDY0IGJpdCBpbnRlZ3JhbCB0eXBlcy4gIEhvd2V2ZXIsIHRoZXNlIGNvbXBvbmVudHMgd291bGQgTk9UIGNvbXBpbGUgYW55d2F5CisgICBzaW5jZSB0aGUgY29tcGlsZXIgZG9lcyBub3Qgc3VwcG9ydCB0aGUgd2F5IHRoZSBjb21wb25lbnQgd2FzIHdyaXR0ZW4uCisqLworI2lmbmRlZiBPTVhfU0tJUDY0QklUCisjaWZkZWYgX19TWU1CSUFOMzJfXworLyoqIE9NWF9VNjQgaXMgYSA2NCBiaXQgdW5zaWduZWQgcXVhbnRpdHkgdGhhdCBpcyA2NCBiaXQgd29yZCBhbGlnbmVkICovCit0eXBlZGVmIHVuc2lnbmVkIGxvbmcgbG9uZyBPTVhfVTY0OworCisvKiogT01YX1M2NCBpcyBhIDY0IGJpdCBzaWduZWQgcXVhbnRpdHkgdGhhdCBpcyA2NCBiaXQgd29yZCBhbGlnbmVkICovCit0eXBlZGVmIHNpZ25lZCBsb25nIGxvbmcgT01YX1M2NDsKKworI2VsaWYgZGVmaW5lZChXSU4zMikKKworLyoqIE9NWF9VNjQgaXMgYSA2NCBiaXQgdW5zaWduZWQgcXVhbnRpdHkgdGhhdCBpcyA2NCBiaXQgd29yZCBhbGlnbmVkICovICAgCit0eXBlZGVmIHVuc2lnbmVkIF9faW50NjQgIE9NWF9VNjQ7CisKKy8qKiBPTVhfUzY0IGlzIGEgNjQgYml0IHNpZ25lZCBxdWFudGl0eSB0aGF0IGlzIDY0IGJpdCB3b3JkIGFsaWduZWQgKi8KK3R5cGVkZWYgc2lnbmVkICAgX19pbnQ2NCAgT01YX1M2NDsKKworI2Vsc2UgLyogV0lOMzIgKi8KKworLyoqIE9NWF9VNjQgaXMgYSA2NCBiaXQgdW5zaWduZWQgcXVhbnRpdHkgdGhhdCBpcyA2NCBiaXQgd29yZCBhbGlnbmVkICovCit0eXBlZGVmIHVuc2lnbmVkIGxvbmcgbG9uZyBPTVhfVTY0OworCisvKiogT01YX1M2NCBpcyBhIDY0IGJpdCBzaWduZWQgcXVhbnRpdHkgdGhhdCBpcyA2NCBiaXQgd29yZCBhbGlnbmVkICovCit0eXBlZGVmIHNpZ25lZCBsb25nIGxvbmcgT01YX1M2NDsKKworI2VuZGlmIC8qIFdJTjMyICovCisjZW5kaWYKKworCisvKiogVGhlIE9NWF9CT09MIHR5cGUgaXMgaW50ZW5kZWQgdG8gYmUgdXNlZCB0byByZXByZXNlbnQgYSB0cnVlIG9yIGEgZmFsc2UgCisgICAgdmFsdWUgd2hlbiBwYXNzaW5nIHBhcmFtZXRlcnMgdG8gYW5kIGZyb20gdGhlIE9NWCBjb3JlIGFuZCBjb21wb25lbnRzLiAgVGhlCisgICAgT01YX0JPT0wgaXMgYSAzMiBiaXQgcXVhbnRpdHkgYW5kIGlzIGFsaWduZWQgb24gYSAzMiBiaXQgd29yZCBib3VuZGFyeS4KKyAqLwordHlwZWRlZiBlbnVtIE9NWF9CT09MIHsKKyAgICBPTVhfRkFMU0UgPSAwLAorICAgIE9NWF9UUlVFID0gIU9NWF9GQUxTRSwKKyAgICBPTVhfQk9PTF9NQVggPSAweDdGRkZGRkZGCit9IE9NWF9CT09MOyAKKyAKKy8qKiBUaGUgT01YX1BUUiB0eXBlIGlzIGludGVuZGVkIHRvIGJlIHVzZWQgdG8gcGFzcyBwb2ludGVycyBiZXR3ZWVuIHRoZSBPTVgKKyAgICBhcHBsaWNhdGlvbnMgYW5kIHRoZSBPTVggQ29yZSBhbmQgY29tcG9uZW50cy4gIFRoaXMgaXMgYSAzMiBiaXQgcG9pbnRlciBhbmQKKyAgICBpcyBhbGlnbmVkIG9uIGEgMzIgYml0IGJvdW5kYXJ5LgorICovCit0eXBlZGVmIHZvaWQqIE9NWF9QVFI7CisKKy8qKiBUaGUgT01YX1NUUklORyB0eXBlIGlzIGludGVuZGVkIHRvIGJlIHVzZWQgdG8gcGFzcyAiQyIgdHlwZSBzdHJpbmdzIGJldHdlZW4KKyAgICB0aGUgYXBwbGljYXRpb24gYW5kIHRoZSBjb3JlIGFuZCBjb21wb25lbnQuICBUaGUgT01YX1NUUklORyB0eXBlIGlzIGEgMzIgCisgICAgYml0IHBvaW50ZXIgdG8gYSB6ZXJvIHRlcm1pbmF0ZWQgc3RyaW5nLiAgVGhlICBwb2ludGVyIGlzIHdvcmQgYWxpZ25lZCBhbmQgCisgICAgdGhlIHN0cmluZyBpcyBieXRlIGFsaWduZWQuICAKKyAqLwordHlwZWRlZiBjaGFyKiBPTVhfU1RSSU5HOworCisvKiogVGhlIE9NWF9CWVRFIHR5cGUgaXMgaW50ZW5kZWQgdG8gYmUgdXNlZCB0byBwYXNzIGFycmF5cyBvZiBieXRlcyBzdWNoIGFzCisgICAgYnVmZmVycyBiZXR3ZWVuIHRoZSBhcHBsaWNhdGlvbiBhbmQgdGhlIGNvbXBvbmVudCBhbmQgY29yZS4gIFRoZSBPTVhfQllURSAKKyAgICB0eXBlIGlzIGEgMzIgYml0IHBvaW50ZXIgdG8gYSB6ZXJvIHRlcm1pbmF0ZWQgc3RyaW5nLiAgVGhlICBwb2ludGVyIGlzIHdvcmQKKyAgICBhbGlnbmVkIGFuZCB0aGUgc3RyaW5nIGlzIGJ5dGUgYWxpZ25lZC4KKyAqLwordHlwZWRlZiB1bnNpZ25lZCBjaGFyKiBPTVhfQllURTsKKworLyoqIE9NWF9VVUlEVFlQRSBpcyBhIHZlcnkgbG9uZyB1bmlxdWUgaWRlbnRpZmllciB0byB1bmlxdWVseSBpZGVudGlmeQorICAgIGF0IHJ1bnRpbWUuICBUaGlzIGlkZW50aWZpZXIgc2hvdWxkIGJlIGdlbmVyYXRlZCBieSBhIGNvbXBvbmVudCBpbiBhIHdheQorICAgIHRoYXQgZ3VhcmFudGVlcyB0aGF0IGV2ZXJ5IGluc3RhbmNlIG9mIHRoZSBpZGVudGlmaWVyIHJ1bm5pbmcgb24gdGhlIHN5c3RlbQorICAgIGlzIHVuaXF1ZS4gKi8KK3R5cGVkZWYgdW5zaWduZWQgY2hhciBPTVhfVVVJRFRZUEVbMTI4XTsKKworLyoqIFRoZSBPTVhfRElSVFlQRSBlbnVtZXJhdGlvbiBpcyB1c2VkIHRvIGluZGljYXRlIGlmIGEgcG9ydCBpcyBhbiBpbnB1dCBvcgorICAgIGFuIG91dHB1dCBwb3J0LiAgVGhpcyBlbnVtZXJhdGlvbiBpcyBjb21tb24gYWNyb3NzIGFsbCBjb21wb25lbnQgdHlwZXMuICAgIAorICovCit0eXBlZGVmIGVudW0gT01YX0RJUlRZUEUKK3sKKyAgICBPTVhfRGlySW5wdXQsICAgICAgICAgICAgICAvKio8IFBvcnQgaXMgYW4gaW5wdXQgcG9ydCAqLworICAgIE9NWF9EaXJPdXRwdXQsICAgICAgICAgICAgIC8qKjwgUG9ydCBpcyBhbiBvdXRwdXQgcG9ydCAqLworICAgIE9NWF9EaXJNYXggPSAweDdGRkZGRkZGCit9IE9NWF9ESVJUWVBFOworCisvKiogVGhlIE9NWF9FTkRJQU5UWVBFIGVudW1lcmF0aW9uIGlzIHVzZWQgdG8gaW5kaWNhdGUgdGhlIGJpdCBvcmRlcmluZyAKKyAgICBmb3IgbnVtZXJpY2FsIGRhdGEgKGkuZS4gYmlnIGVuZGlhbiwgb3IgbGl0dGxlIGVuZGlhbikuICAgIAorICovCit0eXBlZGVmIGVudW0gT01YX0VORElBTlRZUEUKK3sKKyAgICBPTVhfRW5kaWFuQmlnLCAvKio8IGJpZyBlbmRpYW4gKi8KKyAgICBPTVhfRW5kaWFuTGl0dGxlLCAvKio8IGxpdHRsZSBlbmRpYW4gKi8KKyAgICBPTVhfRW5kaWFuTWF4ID0gMHg3RkZGRkZGRgorfSBPTVhfRU5ESUFOVFlQRTsKKworCisvKiogVGhlIE9NWF9OVU1FUklDQUxEQVRBVFlQRSBlbnVtZXJhdGlvbiBpcyB1c2VkIHRvIGluZGljYXRlIGlmIGRhdGEgCisgICAgaXMgc2lnbmVkIG9yIHVuc2lnbmVkCisgKi8KK3R5cGVkZWYgZW51bSBPTVhfTlVNRVJJQ0FMREFUQVRZUEUKK3sKKyAgICBPTVhfTnVtZXJpY2FsRGF0YVNpZ25lZCwgLyoqPCBzaWduZWQgZGF0YSAqLworICAgIE9NWF9OdW1lcmljYWxEYXRhVW5zaWduZWQsIC8qKjwgdW5zaWduZWQgZGF0YSAqLworICAgIE9NWF9OdW1lcmNpYWxEYXRhTWF4ID0gMHg3RkZGRkZGRgorfSBPTVhfTlVNRVJJQ0FMREFUQVRZUEU7CisKKworLyoqIFVuc2lnbmVkIGJvdW5kZWQgdmFsdWUgdHlwZSAqLwordHlwZWRlZiBzdHJ1Y3QgT01YX0JVMzIgeworICAgIE9NWF9VMzIgblZhbHVlOyAvKio8IGFjdHVhbCB2YWx1ZSAqLworICAgIE9NWF9VMzIgbk1pbjsgICAvKio8IG1pbmltdW0gZm9yIHZhbHVlIChpLmUuIG5WYWx1ZSA+PSBuTWluKSAqLworICAgIE9NWF9VMzIgbk1heDsgICAvKio8IG1heGltdW0gZm9yIHZhbHVlIChpLmUuIG5WYWx1ZSA8PSBuTWF4KSAqLworfSBPTVhfQlUzMjsKKworCisvKiogU2lnbmVkIGJvdW5kZWQgdmFsdWUgdHlwZSAqLwordHlwZWRlZiBzdHJ1Y3QgT01YX0JTMzIgeworICAgIE9NWF9TMzIgblZhbHVlOyAvKio8IGFjdHVhbCB2YWx1ZSAqLworICAgIE9NWF9TMzIgbk1pbjsgICAvKio8IG1pbmltdW0gZm9yIHZhbHVlIChpLmUuIG5WYWx1ZSA+PSBuTWluKSAqLworICAgIE9NWF9TMzIgbk1heDsgICAvKio8IG1heGltdW0gZm9yIHZhbHVlIChpLmUuIG5WYWx1ZSA8PSBuTWF4KSAqLworfSBPTVhfQlMzMjsKKworCisvKiogU3RydWN0dXJlIHJlcHJlc2VudGluZyBzb21lIHRpbWUgb3IgZHVyYXRpb24gaW4gbWljcm9zZWNvbmRzLiBUaGlzIHN0cnVjdHVyZQorICAqICBtdXN0IGJlIGludGVycHJldGVkIGFzIGEgc2lnbmVkIDY0IGJpdCB2YWx1ZS4gVGhlIHF1YW50aXR5IGlzIHNpZ25lZCB0byBhY2NvbW1vZGF0ZSAKKyAgKiAgbmVnYXRpdmUgZGVsdGFzIGFuZCBwcmVyb2xsIHNjZW5hcmlvcy4gVGhlIHF1YW50aXR5IGlzIHJlcHJlc2VudGVkIGluIG1pY3Jvc2Vjb25kcyAKKyAgKiAgdG8gYWNjb21vZGF0ZSBoaWdoIHJlc29sdXRpb24gdGltZXN0YW1wcyAoZS5nLiBEVkQgcHJlc2VudGF0aW9uIHRpbWVzdGFtcHMgYmFzZWQKKyAgKiAgb24gYSA5MGtIeiBjbG9jaykgYW5kIHRvIGFsbG93IG1vcmUgYWNjdXJhdGUgYW5kIHN5bmNocm9uaXplZCBkZWxpdmVyeSAoZS5nLiAKKyAgKiAgaW5kaXZpZHVhbCBhdWRpbyBzYW1wbGVzIGRlbGl2ZXJlZCBhdCAxOTIga0h6KS4gVGhlIHF1YW50aXR5IGlzIDY0IGJpdCB0byAKKyAgKiAgYWNjb21tb2RhdGUgYSBsYXJnZSBkeW5hbWljIHJhbmdlIChzaWduZWQgMzIgYml0IHZhbHVlcyB3b3VsZCBhbGxvdyBvbmx5IGZvciBwbHVzCisgICogIG9yIG1pbnVzIDM1IG1pbnV0ZXMpLgorICAqCisgICogIEltcGxlbWVudGF0aW9ucyB3aXRoIGxpbWl0ZWQgcHJlY2lzaW9uIG1heSBjb252ZXJ0IHRoZSBzaWduZWQgNjQgYml0IHZhbHVlIHRvIAorICAqICBhIHNpZ25lZCAzMiBiaXQgdmFsdWUgaW50ZXJuYWxseSBidXQgcmlzayBsb3NzIG9mIHByZWNpc2lvbi4gIAorICAqLworI2lmbmRlZiBPTVhfU0tJUDY0QklUCit0eXBlZGVmIE9NWF9TNjQgT01YX1RJQ0tTOworI2Vsc2UKK3R5cGVkZWYgc3RydWN0IE9NWF9USUNLUworeworICAgIE9NWF9VMzIgbkxvd1BhcnQ7ICAgIC8qKiBsb3cgYml0cyBvZiB0aGUgc2lnbmVkIDY0IGJpdCB0aWNrIHZhbHVlICovCisgICAgT01YX1UzMiBuSGlnaFBhcnQ7ICAgLyoqIGhpZ2ggYml0cyBvZiB0aGUgc2lnbmVkIDY0IGJpdCB0aWNrIHZhbHVlICovCit9IE9NWF9USUNLUzsKKyNlbmRpZgorI2RlZmluZSBPTVhfVElDS1NfUEVSX1NFQ09ORCAxMDAwMDAwCisKKy8qKiBEZWZpbmUgdGhlIHB1YmxpYyBpbnRlcmZhY2UgZm9yIHRoZSBPTVggSGFuZGxlLiAgVGhlIGNvcmUgd2lsbCBub3QgdXNlCisgICAgdGhpcyB2YWx1ZSBpbnRlcm5hbGx5LCBidXQgdGhlIGFwcGxpY2F0aW9uIHNob3VsZCBvbmx5IHVzZSB0aGlzIHZhbHVlLgorICovCit0eXBlZGVmIHZvaWQqIE9NWF9IQU5ETEVUWVBFOworCit0eXBlZGVmIHN0cnVjdCBPTVhfTUFSS1RZUEUKK3sKKyAgICBPTVhfSEFORExFVFlQRSBoTWFya1RhcmdldENvbXBvbmVudDsgICAvKio8IFRoZSBjb21wb25lbnQgdGhhdCB3aWxsIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2VuZXJhdGUgYSBtYXJrIGV2ZW50IHVwb24gCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcm9jZXNzaW5nIHRoZSBtYXJrLiAqLworICAgIE9NWF9QVFIgcE1hcmtEYXRhOyAgIC8qKjwgQXBwbGljYXRpb24gc3BlY2lmaWMgZGF0YSBhc3NvY2lhdGVkIHdpdGggCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGUgbWFyayBzZW50IG9uIGEgbWFyayBldmVudCB0byBkaXNhbWJpZ3VhdGUgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzIG1hcmsgZnJvbSBvdGhlcnMuICovCit9IE9NWF9NQVJLVFlQRTsKKworCisvKiogT01YX05BVElWRV9ERVZJQ0VUWVBFIGlzIHVzZWQgdG8gbWFwIGEgT01YIHZpZGVvIHBvcnQgdG8gdGhlCisgKiAgcGxhdGZvcm0gJiBvcGVyYXRpbmcgc3BlY2lmaWMgb2JqZWN0IHVzZWQgdG8gcmVmZXJlbmNlIHRoZSBkaXNwbGF5IAorICogIG9yIGNhbiBiZSB1c2VkIGJ5IGEgYXVkaW8gcG9ydCBmb3IgbmF0aXZlIGF1ZGlvIHJlbmRlcmluZyAqLwordHlwZWRlZiB2b2lkKiBPTVhfTkFUSVZFX0RFVklDRVRZUEU7CisKKy8qKiBPTVhfTkFUSVZFX1dJTkRPV1RZUEUgaXMgdXNlZCB0byBtYXAgYSBPTVggdmlkZW8gcG9ydCB0byB0aGUKKyAqICBwbGF0Zm9ybSAmIG9wZXJhdGluZyBzcGVjaWZpYyBvYmplY3QgdXNlZCB0byByZWZlcmVuY2UgdGhlIHdpbmRvdyAqLwordHlwZWRlZiB2b2lkKiBPTVhfTkFUSVZFX1dJTkRPV1RZUEU7CisKKy8qKiBUaGUgT01YX1ZFUlNJT05UWVBFIHVuaW9uIGlzIHVzZWQgdG8gc3BlY2lmeSB0aGUgdmVyc2lvbiBmb3IKKyAgICBhIHN0cnVjdHVyZSBvciBjb21wb25lbnQuICBGb3IgYSBjb21wb25lbnQsIHRoZSB2ZXJzaW9uIGlzIGVudGlyZWx5CisgICAgc3BlY2lmaWVkIGJ5IHRoZSBjb21wb25lbnQgdmVuZG9yLiAgQ29tcG9uZW50cyBkb2luZyB0aGUgc2FtZSBmdW5jdGlvbgorICAgIGZyb20gZGlmZmVyZW50IHZlbmRvcnMgbWF5IG9yIG1heSBub3QgaGF2ZSB0aGUgc2FtZSB2ZXJzaW9uLiAgRm9yIAorICAgIHN0cnVjdHVyZXMsIHRoZSB2ZXJzaW9uIHNoYWxsIGJlIHNldCBieSB0aGUgZW50aXR5IHRoYXQgYWxsb2NhdGVzIHRoZQorICAgIHN0cnVjdHVyZS4gIEZvciBzdHJ1Y3R1cmVzIHNwZWNpZmllZCBpbiB0aGUgT01YIDEuMSBzcGVjaWZpY2F0aW9uLCB0aGUKKyAgICB2YWx1ZSBvZiB0aGUgdmVyc2lvbiBzaGFsbCBiZSBzZXQgdG8gMS4xLjAuMCBpbiBhbGwgY2FzZXMuICBBY2Nlc3MgdG8gdGhlCisgICAgT01YX1ZFUlNJT05UWVBFIGNhbiBiZSBieSBhIHNpbmdsZSAzMiBiaXQgYWNjZXNzIChlLmcuIGJ5IG5WZXJzaW9uKSBvcgorICAgIGJ5IGFjY2Vzc2luZyBvbmUgb2YgdGhlIHN0cnVjdHVyZSBlbGVtZW50cyB0bywgZm9yIGV4YW1wbGUsIGNoZWNrIG9ubHkKKyAgICB0aGUgTWFqb3IgcmV2aXNpb24uCisgKi8KK3R5cGVkZWYgdW5pb24gT01YX1ZFUlNJT05UWVBFCit7CisgICAgc3RydWN0CisgICAgeworICAgICAgICBPTVhfVTggblZlcnNpb25NYWpvcjsgICAvKio8IE1ham9yIHZlcnNpb24gYWNjZXNzb3IgZWxlbWVudCAqLworICAgICAgICBPTVhfVTggblZlcnNpb25NaW5vcjsgICAvKio8IE1pbm9yIHZlcnNpb24gYWNjZXNzb3IgZWxlbWVudCAqLworICAgICAgICBPTVhfVTggblJldmlzaW9uOyAgICAgICAvKio8IFJldmlzaW9uIHZlcnNpb24gYWNjZXNzb3IgZWxlbWVudCAqLworICAgICAgICBPTVhfVTggblN0ZXA7ICAgICAgICAgICAvKio8IFN0ZXAgdmVyc2lvbiBhY2Nlc3NvciBlbGVtZW50ICovCisgICAgfSBzOworICAgIE9NWF9VMzIgblZlcnNpb247ICAgICAgICAgICAvKio8IDMyIGJpdCB2YWx1ZSB0byBtYWtlIGFjY2Vzc2luZyB0aGUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZlcnNpb24gZWFzaWx5IGRvbmUgaW4gYSBzaW5nbGUgd29yZAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZSBjb3B5L2NvbXBhcmUgb3BlcmF0aW9uICovCit9IE9NWF9WRVJTSU9OVFlQRTsKKworI2lmZGVmIF9fY3BsdXNwbHVzCit9CisjZW5kaWYgLyogX19jcGx1c3BsdXMgKi8KKworI2VuZGlmCisvKiBGaWxlIEVPRiAqLwpkaWZmIC0tZ2l0IGEvZXh5bm9zNC9tdWx0aW1lZGlhL29wZW5tYXgvc2VjX29teC9pbmNsdWRlL2tocm9ub3MvT01YX1ZpZGVvLmggYi9leHlub3M0L211bHRpbWVkaWEvb3Blbm1heC9zZWNfb214L2luY2x1ZGUva2hyb25vcy9PTVhfVmlkZW8uaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xNjNlNDUwCi0tLSAvZGV2L251bGwKKysrIGIvZXh5bm9zNC9tdWx0aW1lZGlhL29wZW5tYXgvc2VjX29teC9pbmNsdWRlL2tocm9ub3MvT01YX1ZpZGVvLmgKQEAgLTAsMCArMSwxMDYwIEBACisvKioKKyAqIENvcHlyaWdodCAoYykgMjAwOCBUaGUgS2hyb25vcyBHcm91cCBJbmMuIAorICogCisgKiBQZXJtaXNzaW9uIGlzIGhlcmVieSBncmFudGVkLCBmcmVlIG9mIGNoYXJnZSwgdG8gYW55IHBlcnNvbiBvYnRhaW5pbmcKKyAqIGEgY29weSBvZiB0aGlzIHNvZnR3YXJlIGFuZCBhc3NvY2lhdGVkIGRvY3VtZW50YXRpb24gZmlsZXMgKHRoZQorICogIlNvZnR3YXJlIiksIHRvIGRlYWwgaW4gdGhlIFNvZnR3YXJlIHdpdGhvdXQgcmVzdHJpY3Rpb24sIGluY2x1ZGluZworICogd2l0aG91dCBsaW1pdGF0aW9uIHRoZSByaWdodHMgdG8gdXNlLCBjb3B5LCBtb2RpZnksIG1lcmdlLCBwdWJsaXNoLAorICogZGlzdHJpYnV0ZSwgc3VibGljZW5zZSwgYW5kL29yIHNlbGwgY29waWVzIG9mIHRoZSBTb2Z0d2FyZSwgYW5kIHRvCisgKiBwZXJtaXQgcGVyc29ucyB0byB3aG9tIHRoZSBTb2Z0d2FyZSBpcyBmdXJuaXNoZWQgdG8gZG8gc28sIHN1YmplY3QKKyAqIHRvIHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczogCisgKiBUaGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBzaGFsbCBiZSBpbmNsdWRlZAorICogaW4gYWxsIGNvcGllcyBvciBzdWJzdGFudGlhbCBwb3J0aW9ucyBvZiB0aGUgU29mdHdhcmUuIAorICogCisgKiBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiwgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgRVhQUkVTUworICogT1IgSU1QTElFRCwgSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRCBUTyBUSEUgV0FSUkFOVElFUyBPRgorICogTUVSQ0hBTlRBQklMSVRZLCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQgTk9OSU5GUklOR0VNRU5ULgorICogSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFVVEhPUlMgT1IgQ09QWVJJR0hUIEhPTERFUlMgQkUgTElBQkxFIEZPUiBBTlkKKyAqIENMQUlNLCBEQU1BR0VTIE9SIE9USEVSIExJQUJJTElUWSwgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsCisgKiBUT1JUIE9SIE9USEVSV0lTRSwgQVJJU0lORyBGUk9NLCBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRQorICogU09GVFdBUkUgT1IgVEhFIFVTRSBPUiBPVEhFUiBERUFMSU5HUyBJTiBUSEUgU09GVFdBUkUuIAorICoKKyAqLworCisvKiogCisgKiAgQGZpbGUgT01YX1ZpZGVvLmggLSBPcGVuTWF4IElMIHZlcnNpb24gMS4xLjIKKyAqICBUaGUgc3RydWN0dXJlcyBpcyBuZWVkZWQgYnkgVmlkZW8gY29tcG9uZW50cyB0byBleGNoYW5nZSBwYXJhbWV0ZXJzIAorICogIGFuZCBjb25maWd1cmF0aW9uIGRhdGEgd2l0aCBPTVggY29tcG9uZW50cy4KKyAqLworI2lmbmRlZiBPTVhfVmlkZW9faAorI2RlZmluZSBPTVhfVmlkZW9faAorCisvKiogQGRlZmdyb3VwIHZpZGVvIE9wZW5NQVggSUwgVmlkZW8gRG9tYWluCisgKiBAaW5ncm91cCBpdgorICogU3RydWN0dXJlcyBmb3IgT3Blbk1BWCBJTCBWaWRlbyBkb21haW4KKyAqIEB7CisgKi8KKworI2lmZGVmIF9fY3BsdXNwbHVzCitleHRlcm4gIkMiIHsKKyNlbmRpZiAvKiBfX2NwbHVzcGx1cyAqLworCisKKy8qKgorICogRWFjaCBPTVggaGVhZGVyIG11c3QgaW5jbHVkZSBhbGwgcmVxdWlyZWQgaGVhZGVyIGZpbGVzIHRvIGFsbG93IHRoZQorICogaGVhZGVyIHRvIGNvbXBpbGUgd2l0aG91dCBlcnJvcnMuICBUaGUgaW5jbHVkZXMgYmVsb3cgYXJlIHJlcXVpcmVkCisgKiBmb3IgdGhpcyBoZWFkZXIgZmlsZSB0byBjb21waWxlIHN1Y2Nlc3NmdWxseSAKKyAqLworCisjaW5jbHVkZSA8T01YX0lWQ29tbW9uLmg+CisKKworLyoqCisgKiBFbnVtZXJhdGlvbiB1c2VkIHRvIGRlZmluZSB0aGUgcG9zc2libGUgdmlkZW8gY29tcHJlc3Npb24gY29kaW5ncy4gIAorICogTk9URTogIFRoaXMgZXNzZW50aWFsbHkgcmVmZXJzIHRvIGZpbGUgZXh0ZW5zaW9ucy4gSWYgdGhlIGNvZGluZyBpcyAKKyAqICAgICAgICBiZWluZyB1c2VkIHRvIHNwZWNpZnkgdGhlIEVOQ09ERSB0eXBlLCB0aGVuIGFkZGl0aW9uYWwgd29yayAKKyAqICAgICAgICBtdXN0IGJlIGRvbmUgdG8gY29uZmlndXJlIHRoZSBleGFjdCBmbGF2b3Igb2YgdGhlIGNvbXByZXNzaW9uIAorICogICAgICAgIHRvIGJlIHVzZWQuICBGb3IgZGVjb2RlIGNhc2VzIHdoZXJlIHRoZSB1c2VyIGFwcGxpY2F0aW9uIGNhbiAKKyAqICAgICAgICBub3QgZGlmZmVyZW50aWF0ZSBiZXR3ZWVuIE1QRUctNCBhbmQgSC4yNjQgYml0IHN0cmVhbXMsIGl0IGlzIAorICogICAgICAgIHVwIHRvIHRoZSBjb2RlYyB0byBoYW5kbGUgdGhpcy4KKyAqLwordHlwZWRlZiBlbnVtIE9NWF9WSURFT19DT0RJTkdUWVBFIHsKKyAgICBPTVhfVklERU9fQ29kaW5nVW51c2VkLCAgICAgLyoqPCBWYWx1ZSB3aGVuIGNvZGluZyBpcyBOL0EgKi8KKyAgICBPTVhfVklERU9fQ29kaW5nQXV0b0RldGVjdCwgLyoqPCBBdXRvZGV0ZWN0aW9uIG9mIGNvZGluZyB0eXBlICovCisgICAgT01YX1ZJREVPX0NvZGluZ01QRUcyLCAgICAgIC8qKjwgQUtBOiBILjI2MiAqLworICAgIE9NWF9WSURFT19Db2RpbmdIMjYzLCAgICAgICAvKio8IEguMjYzICovCisgICAgT01YX1ZJREVPX0NvZGluZ01QRUc0LCAgICAgIC8qKjwgTVBFRy00ICovCisgICAgT01YX1ZJREVPX0NvZGluZ1dNViwgICAgICAgIC8qKjwgYWxsIHZlcnNpb25zIG9mIFdpbmRvd3MgTWVkaWEgVmlkZW8gKi8KKyAgICBPTVhfVklERU9fQ29kaW5nUlYsICAgICAgICAgLyoqPCBhbGwgdmVyc2lvbnMgb2YgUmVhbCBWaWRlbyAqLworICAgIE9NWF9WSURFT19Db2RpbmdBVkMsICAgICAgICAvKio8IEguMjY0L0FWQyAqLworICAgIE9NWF9WSURFT19Db2RpbmdNSlBFRywgICAgICAvKio8IE1vdGlvbiBKUEVHICovCisgICAgT01YX1ZJREVPX0NvZGluZ0tocm9ub3NFeHRlbnNpb25zID0gMHg2RjAwMDAwMCwgLyoqPCBSZXNlcnZlZCByZWdpb24gZm9yIGludHJvZHVjaW5nIEtocm9ub3MgU3RhbmRhcmQgRXh0ZW5zaW9ucyAqLyAKKyAgICBPTVhfVklERU9fQ29kaW5nVmVuZG9yU3RhcnRVbnVzZWQgPSAweDdGMDAwMDAwLCAvKio8IFJlc2VydmVkIHJlZ2lvbiBmb3IgaW50cm9kdWNpbmcgVmVuZG9yIEV4dGVuc2lvbnMgKi8KKyAgICBPTVhfVklERU9fQ29kaW5nTWF4ID0gMHg3RkZGRkZGRgorfSBPTVhfVklERU9fQ09ESU5HVFlQRTsKKworCisvKioKKyAqIERhdGEgc3RydWN0dXJlIHVzZWQgdG8gZGVmaW5lIGEgdmlkZW8gcGF0aC4gIFRoZSBudW1iZXIgb2YgVmlkZW8gcGF0aHMgZm9yIAorICogaW5wdXQgYW5kIG91dHB1dCB3aWxsIHZhcnkgYnkgdHlwZSBvZiB0aGUgVmlkZW8gY29tcG9uZW50LiAgCisgKiAKKyAqICAgIElucHV0IChha2EgU291cmNlKSA6IHplcm8gSW5wdXRzLCBvbmUgT3V0cHV0LAorICogICAgU3BsaXR0ZXIgICAgICAgICAgIDogb25lIElucHV0LCAyIG9yIG1vcmUgT3V0cHV0cywKKyAqICAgIFByb2Nlc3NpbmcgRWxlbWVudCA6IG9uZSBJbnB1dCwgb25lIG91dHB1dCwKKyAqICAgIE1peGVyICAgICAgICAgICAgICA6IDIgb3IgbW9yZSBpbnB1dHMsIG9uZSBvdXRwdXQsCisgKiAgICBPdXRwdXQgKGFrYSBTaW5rKSAgOiBvbmUgSW5wdXQsIHplcm8gb3V0cHV0cy4KKyAqIAorICogVGhlIFBvcnREZWZpbml0aW9uIHN0cnVjdHVyZSBpcyB1c2VkIHRvIGRlZmluZSBhbGwgb2YgdGhlIHBhcmFtZXRlcnMgCisgKiBuZWNlc3NhcnkgZm9yIHRoZSBjb21wbGlhbnQgY29tcG9uZW50IHRvIHNldHVwIGFuIGlucHV0IG9yIGFuIG91dHB1dCB2aWRlbyAKKyAqIHBhdGguICBJZiBhZGRpdGlvbmFsIHZlbmRvciBzcGVjaWZpYyBkYXRhIGlzIHJlcXVpcmVkLCBpdCBzaG91bGQgYmUgCisgKiB0cmFuc21pdHRlZCB0byB0aGUgY29tcG9uZW50IHVzaW5nIHRoZSBDdXN0b21Db21tYW5kIGZ1bmN0aW9uLiAgQ29tcGxpYW50IAorICogY29tcG9uZW50cyB3aWxsIHByZXBvcHVsYXRlIHRoaXMgc3RydWN0dXJlIHdpdGggb3B0aW1hbCB2YWx1ZXMgZHVyaW5nIHRoZSAKKyAqIEdldERlZmF1bHRJbml0UGFyYW1zIGNvbW1hbmQuCisgKgorICogU1RSVUNUIE1FTUJFUlM6CisgKiAgY01JTUVUeXBlICAgICAgICAgICAgIDogTUlNRSB0eXBlIG9mIGRhdGEgZm9yIHRoZSBwb3J0CisgKiAgcE5hdGl2ZVJlbmRlciAgICAgICAgIDogUGxhdGZvcm0gc3BlY2lmaWMgcmVmZXJlbmNlIGZvciBhIGRpc3BsYXkgaWYgYSAKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICBzeW5jLCBvdGhlcndpc2UgdGhpcyBmaWVsZCBpcyAwCisgKiAgbkZyYW1lV2lkdGggICAgICAgICAgIDogV2lkdGggb2YgZnJhbWUgdG8gYmUgdXNlZCBvbiBjaGFubmVsIGlmIAorICogICAgICAgICAgICAgICAgICAgICAgICAgIHVuY29tcHJlc3NlZCBmb3JtYXQgaXMgdXNlZC4gIFVzZSAwIGZvciB1bmtub3duLAorICogICAgICAgICAgICAgICAgICAgICAgICAgIGRvbid0IGNhcmUgb3IgdmFyaWFibGUKKyAqICBuRnJhbWVIZWlnaHQgICAgICAgICAgOiBIZWlnaHQgb2YgZnJhbWUgdG8gYmUgdXNlZCBvbiBjaGFubmVsIGlmIAorICogICAgICAgICAgICAgICAgICAgICAgICAgIHVuY29tcHJlc3NlZCBmb3JtYXQgaXMgdXNlZC4gVXNlIDAgZm9yIHVua25vd24sCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgZG9uJ3QgY2FyZSBvciB2YXJpYWJsZQorICogIG5TdHJpZGUgICAgICAgICAgICAgICA6IE51bWJlciBvZiBieXRlcyBwZXIgc3BhbiBvZiBhbiBpbWFnZSAKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAoaS5lLiBpbmRpY2F0ZXMgdGhlIG51bWJlciBvZiBieXRlcyB0byBnZXQKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICBmcm9tIHNwYW4gTiB0byBzcGFuIE4rMSwgd2hlcmUgbmVnYXRpdmUgc3RyaWRlCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgaW5kaWNhdGVzIHRoZSBpbWFnZSBpcyBib3R0b20gdXAKKyAqICBuU2xpY2VIZWlnaHQgICAgICAgICAgOiBIZWlnaHQgdXNlZCB3aGVuIGVuY29kaW5nIGluIHNsaWNlcworICogIG5CaXRyYXRlICAgICAgICAgICAgICA6IEJpdCByYXRlIG9mIGZyYW1lIHRvIGJlIHVzZWQgb24gY2hhbm5lbCBpZiAKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICBjb21wcmVzc2VkIGZvcm1hdCBpcyB1c2VkLiBVc2UgMCBmb3IgdW5rbm93biwgCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgZG9uJ3QgY2FyZSBvciB2YXJpYWJsZQorICogIHhGcmFtZXJhdGUgICAgICAgICAgICA6IEZyYW1lIHJhdGUgdG8gYmUgdXNlZCBvbiBjaGFubmVsIGlmIHVuY29tcHJlc3NlZCAKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICBmb3JtYXQgaXMgdXNlZC4gVXNlIDAgZm9yIHVua25vd24sIGRvbid0IGNhcmUgb3IgCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyaWFibGUuICBVbml0cyBhcmUgUTE2IGZyYW1lcyBwZXIgc2Vjb25kLgorICogIGJGbGFnRXJyb3JDb25jZWFsbWVudCA6IFR1cm5zIG9uIGVycm9yIGNvbmNlYWxtZW50IGlmIGl0IGlzIHN1cHBvcnRlZCBieSAKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICB0aGUgT01YIGNvbXBvbmVudAorICogIGVDb21wcmVzc2lvbkZvcm1hdCAgICA6IENvbXByZXNzaW9uIGZvcm1hdCB1c2VkIGluIHRoaXMgaW5zdGFuY2Ugb2YgdGhlIAorICogICAgICAgICAgICAgICAgICAgICAgICAgIGNvbXBvbmVudC4gV2hlbiBPTVhfVklERU9fQ29kaW5nVW51c2VkIGlzIAorICogICAgICAgICAgICAgICAgICAgICAgICAgIHNwZWNpZmllZCwgZUNvbG9yRm9ybWF0IGlzIHVzZWQKKyAqICBlQ29sb3JGb3JtYXQgOiBEZWNvbXByZXNzZWQgZm9ybWF0IHVzZWQgYnkgdGhpcyBjb21wb25lbnQKKyAqICBwTmF0aXZlV2luZG93IDogUGxhdGZvcm0gc3BlY2lmaWMgcmVmZXJlbmNlIGZvciBhIHdpbmRvdyBvYmplY3QgaWYgYSAKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICBkaXNwbGF5IHNpbmsgLCBvdGhlcndpc2UgdGhpcyBmaWVsZCBpcyAweDAuIAorICovCit0eXBlZGVmIHN0cnVjdCBPTVhfVklERU9fUE9SVERFRklOSVRJT05UWVBFIHsKKyAgICBPTVhfU1RSSU5HIGNNSU1FVHlwZTsKKyAgICBPTVhfTkFUSVZFX0RFVklDRVRZUEUgcE5hdGl2ZVJlbmRlcjsKKyAgICBPTVhfVTMyIG5GcmFtZVdpZHRoOworICAgIE9NWF9VMzIgbkZyYW1lSGVpZ2h0OworICAgIE9NWF9TMzIgblN0cmlkZTsKKyAgICBPTVhfVTMyIG5TbGljZUhlaWdodDsKKyAgICBPTVhfVTMyIG5CaXRyYXRlOworICAgIE9NWF9VMzIgeEZyYW1lcmF0ZTsKKyAgICBPTVhfQk9PTCBiRmxhZ0Vycm9yQ29uY2VhbG1lbnQ7CisgICAgT01YX1ZJREVPX0NPRElOR1RZUEUgZUNvbXByZXNzaW9uRm9ybWF0OworICAgIE9NWF9DT0xPUl9GT1JNQVRUWVBFIGVDb2xvckZvcm1hdDsKKyAgICBPTVhfTkFUSVZFX1dJTkRPV1RZUEUgcE5hdGl2ZVdpbmRvdzsKK30gT01YX1ZJREVPX1BPUlRERUZJTklUSU9OVFlQRTsKKworLyoqICAKKyAqIFBvcnQgZm9ybWF0IHBhcmFtZXRlci4gIFRoaXMgc3RydWN0dXJlIGlzIHVzZWQgdG8gZW51bWVyYXRlIHRoZSB2YXJpb3VzIAorICogZGF0YSBpbnB1dC9vdXRwdXQgZm9ybWF0IHN1cHBvcnRlZCBieSB0aGUgcG9ydC4KKyAqIAorICogU1RSVUNUIE1FTUJFUlM6CisgKiAgblNpemUgICAgICAgICAgICAgIDogU2l6ZSBvZiB0aGUgc3RydWN0dXJlIGluIGJ5dGVzCisgKiAgblZlcnNpb24gICAgICAgICAgIDogT01YIHNwZWNpZmljYXRpb24gdmVyc2lvbiBpbmZvcm1hdGlvbgorICogIG5Qb3J0SW5kZXggICAgICAgICA6IEluZGljYXRlcyB3aGljaCBwb3J0IHRvIHNldAorICogIG5JbmRleCAgICAgICAgICAgICA6IEluZGljYXRlcyB0aGUgZW51bWVyYXRpb24gaW5kZXggZm9yIHRoZSBmb3JtYXQgZnJvbSAKKyAqICAgICAgICAgICAgICAgICAgICAgICAweDAgdG8gTi0xCisgKiAgZUNvbXByZXNzaW9uRm9ybWF0IDogQ29tcHJlc3Npb24gZm9ybWF0IHVzZWQgaW4gdGhpcyBpbnN0YW5jZSBvZiB0aGUgCisgKiAgICAgICAgICAgICAgICAgICAgICAgY29tcG9uZW50LiBXaGVuIE9NWF9WSURFT19Db2RpbmdVbnVzZWQgaXMgc3BlY2lmaWVkLCAKKyAqICAgICAgICAgICAgICAgICAgICAgICBlQ29sb3JGb3JtYXQgaXMgdXNlZCAKKyAqICBlQ29sb3JGb3JtYXQgICAgICAgOiBEZWNvbXByZXNzZWQgZm9ybWF0IHVzZWQgYnkgdGhpcyBjb21wb25lbnQKKyAqICB4RnJhbWVSYXRlICAgICAgICAgOiBJbmRpY2F0ZXMgdGhlIHZpZGVvIGZyYW1lIHJhdGUgaW4gUTE2IGZvcm1hdAorICovCit0eXBlZGVmIHN0cnVjdCBPTVhfVklERU9fUEFSQU1fUE9SVEZPUk1BVFRZUEUgeworICAgIE9NWF9VMzIgblNpemU7CisgICAgT01YX1ZFUlNJT05UWVBFIG5WZXJzaW9uOworICAgIE9NWF9VMzIgblBvcnRJbmRleDsKKyAgICBPTVhfVTMyIG5JbmRleDsKKyAgICBPTVhfVklERU9fQ09ESU5HVFlQRSBlQ29tcHJlc3Npb25Gb3JtYXQ7IAorICAgIE9NWF9DT0xPUl9GT1JNQVRUWVBFIGVDb2xvckZvcm1hdDsKKyAgICBPTVhfVTMyIHhGcmFtZXJhdGU7Cit9IE9NWF9WSURFT19QQVJBTV9QT1JURk9STUFUVFlQRTsKKworCisvKioKKyAqIFRoaXMgaXMgYSBzdHJ1Y3R1cmUgZm9yIGNvbmZpZ3VyaW5nIHZpZGVvIGNvbXByZXNzaW9uIHF1YW50aXphdGlvbiAKKyAqIHBhcmFtZXRlciB2YWx1ZXMuICBDb2RlY3MgbWF5IHN1cHBvcnQgZGlmZmVyZW50IFFQIHZhbHVlcyBmb3IgZGlmZmVyZW50CisgKiBmcmFtZSB0eXBlcy4KKyAqCisgKiBTVFJVQ1QgTUVNQkVSUzoKKyAqICBuU2l6ZSAgICAgIDogU2l6ZSBvZiB0aGUgc3RydWN0dXJlIGluIGJ5dGVzCisgKiAgblZlcnNpb24gICA6IE9NWCBzcGVjaWZpY2F0aW9uIHZlcnNpb24gaW5mbworICogIG5Qb3J0SW5kZXggOiBQb3J0IHRoYXQgdGhpcyBzdHJ1Y3R1cmUgYXBwbGllcyB0bworICogIG5RcEkgICAgICAgOiBRUCB2YWx1ZSB0byB1c2UgZm9yIGluZGV4IGZyYW1lcworICogIG5RcFAgICAgICAgOiBRUCB2YWx1ZSB0byB1c2UgZm9yIFAgZnJhbWVzCisgKiAgblFwQiAgICAgICA6IFFQIHZhbHVlcyB0byB1c2UgZm9yIGJpZGlyZWN0aW9uYWwgZnJhbWVzIAorICovCit0eXBlZGVmIHN0cnVjdCBPTVhfVklERU9fUEFSQU1fUVVBTlRJWkFUSU9OVFlQRSB7CisgICAgT01YX1UzMiBuU2l6ZTsgICAgICAgICAgICAKKyAgICBPTVhfVkVSU0lPTlRZUEUgblZlcnNpb247CisgICAgT01YX1UzMiBuUG9ydEluZGV4OworICAgIE9NWF9VMzIgblFwSTsKKyAgICBPTVhfVTMyIG5RcFA7CisgICAgT01YX1UzMiBuUXBCOworfSBPTVhfVklERU9fUEFSQU1fUVVBTlRJWkFUSU9OVFlQRTsKKworCisvKiogCisgKiBTdHJ1Y3R1cmUgZm9yIGNvbmZpZ3VyYXRpb24gb2YgdmlkZW8gZmFzdCB1cGRhdGUgcGFyYW1ldGVycy4gCisgKiAgCisgKiBTVFJVQ1QgTUVNQkVSUzoKKyAqICBuU2l6ZSAgICAgIDogU2l6ZSBvZiB0aGUgc3RydWN0dXJlIGluIGJ5dGVzCisgKiAgblZlcnNpb24gICA6IE9NWCBzcGVjaWZpY2F0aW9uIHZlcnNpb24gaW5mbyAKKyAqICBuUG9ydEluZGV4IDogUG9ydCB0aGF0IHRoaXMgc3RydWN0dXJlIGFwcGxpZXMgdG8KKyAqICBiRW5hYmxlVkZVIDogRW5hYmxlL0Rpc2FibGUgdmlkZW8gZmFzdCB1cGRhdGUKKyAqICBuRmlyc3RHT0IgIDogU3BlY2lmaWVzIHRoZSBudW1iZXIgb2YgdGhlIGZpcnN0IG1hY3JvYmxvY2sgcm93CisgKiAgbkZpcnN0TUIgICA6IHNwZWNpZmllcyB0aGUgZmlyc3QgTUIgcmVsYXRpdmUgdG8gdGhlIHNwZWNpZmllZCBmaXJzdCBHT0IKKyAqICBuTnVtTUJzICAgIDogU3BlY2lmaWVzIHRoZSBudW1iZXIgb2YgTUJzIHRvIGJlIHJlZnJlc2hlZCBmcm9tIG5GaXJzdEdPQiAKKyAqICAgICAgICAgICAgICAgYW5kIG5GaXJzdE1CCisgKi8KK3R5cGVkZWYgc3RydWN0IE9NWF9WSURFT19QQVJBTV9WSURFT0ZBU1RVUERBVEVUWVBFIHsKKyAgICBPTVhfVTMyIG5TaXplOyAgICAgICAgICAgIAorICAgIE9NWF9WRVJTSU9OVFlQRSBuVmVyc2lvbjsgCisgICAgT01YX1UzMiBuUG9ydEluZGV4OyAgICAgICAKKyAgICBPTVhfQk9PTCBiRW5hYmxlVkZVOyAgICAgIAorICAgIE9NWF9VMzIgbkZpcnN0R09COyAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKyAgICBPTVhfVTMyIG5GaXJzdE1COyAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKyAgICBPTVhfVTMyIG5OdW1NQnM7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorfSBPTVhfVklERU9fUEFSQU1fVklERU9GQVNUVVBEQVRFVFlQRTsKKworCisvKiogCisgKiBFbnVtZXJhdGlvbiBvZiBwb3NzaWJsZSBiaXRyYXRlIGNvbnRyb2wgdHlwZXMgCisgKi8KK3R5cGVkZWYgZW51bSBPTVhfVklERU9fQ09OVFJPTFJBVEVUWVBFIHsKKyAgICBPTVhfVmlkZW9fQ29udHJvbFJhdGVEaXNhYmxlLAorICAgIE9NWF9WaWRlb19Db250cm9sUmF0ZVZhcmlhYmxlLAorICAgIE9NWF9WaWRlb19Db250cm9sUmF0ZUNvbnN0YW50LAorICAgIE9NWF9WaWRlb19Db250cm9sUmF0ZVZhcmlhYmxlU2tpcEZyYW1lcywKKyAgICBPTVhfVmlkZW9fQ29udHJvbFJhdGVDb25zdGFudFNraXBGcmFtZXMsCisgICAgT01YX1ZpZGVvX0NvbnRyb2xSYXRlS2hyb25vc0V4dGVuc2lvbnMgPSAweDZGMDAwMDAwLCAvKio8IFJlc2VydmVkIHJlZ2lvbiBmb3IgaW50cm9kdWNpbmcgS2hyb25vcyBTdGFuZGFyZCBFeHRlbnNpb25zICovIAorICAgIE9NWF9WaWRlb19Db250cm9sUmF0ZVZlbmRvclN0YXJ0VW51c2VkID0gMHg3RjAwMDAwMCwgLyoqPCBSZXNlcnZlZCByZWdpb24gZm9yIGludHJvZHVjaW5nIFZlbmRvciBFeHRlbnNpb25zICovCisgICAgT01YX1ZpZGVvX0NvbnRyb2xSYXRlTWF4ID0gMHg3RkZGRkZGRgorfSBPTVhfVklERU9fQ09OVFJPTFJBVEVUWVBFOworCisKKy8qKiAKKyAqIFN0cnVjdHVyZSBmb3IgY29uZmlndXJpbmcgYml0cmF0ZSBtb2RlIG9mIGEgY29kZWMuIAorICoKKyAqIFNUUlVDVCBNRU1CRVJTOgorICogIG5TaXplICAgICAgICAgIDogU2l6ZSBvZiB0aGUgc3RydWN0IGluIGJ5dGVzCisgKiAgblZlcnNpb24gICAgICAgOiBPTVggc3BlYyB2ZXJzaW9uIGluZm8KKyAqICBuUG9ydEluZGV4ICAgICA6IFBvcnQgdGhhdCB0aGlzIHN0cnVjdCBhcHBsaWVzIHRvCisgKiAgZUNvbnRyb2xSYXRlICAgOiBDb250cm9sIHJhdGUgdHlwZSBlbnVtCisgKiAgblRhcmdldEJpdHJhdGUgOiBUYXJnZXQgYml0cmF0ZSB0byBlbmNvZGUgd2l0aAorICovCit0eXBlZGVmIHN0cnVjdCBPTVhfVklERU9fUEFSQU1fQklUUkFURVRZUEUgeworICAgIE9NWF9VMzIgblNpemU7ICAgICAgICAgICAgICAgICAgICAgICAgICAKKyAgICBPTVhfVkVSU0lPTlRZUEUgblZlcnNpb247ICAgICAgICAgICAgICAgCisgICAgT01YX1UzMiBuUG9ydEluZGV4OyAgICAgICAgICAgICAgICAgICAgIAorICAgIE9NWF9WSURFT19DT05UUk9MUkFURVRZUEUgZUNvbnRyb2xSYXRlOyAKKyAgICBPTVhfVTMyIG5UYXJnZXRCaXRyYXRlOyAgICAgICAgICAgICAgICAgCit9IE9NWF9WSURFT19QQVJBTV9CSVRSQVRFVFlQRTsKKworCisvKiogCisgKiBFbnVtZXJhdGlvbiBvZiBwb3NzaWJsZSBtb3Rpb24gdmVjdG9yIChNVikgdHlwZXMgCisgKi8KK3R5cGVkZWYgZW51bSBPTVhfVklERU9fTU9USU9OVkVDVE9SVFlQRSB7CisgICAgT01YX1ZpZGVvX01vdGlvblZlY3RvclBpeGVsLAorICAgIE9NWF9WaWRlb19Nb3Rpb25WZWN0b3JIYWxmUGVsLAorICAgIE9NWF9WaWRlb19Nb3Rpb25WZWN0b3JRdWFydGVyUGVsLAorICAgIE9NWF9WaWRlb19Nb3Rpb25WZWN0b3JFaWdodGhQZWwsCisgICAgT01YX1ZpZGVvX01vdGlvblZlY3Rvcktocm9ub3NFeHRlbnNpb25zID0gMHg2RjAwMDAwMCwgLyoqPCBSZXNlcnZlZCByZWdpb24gZm9yIGludHJvZHVjaW5nIEtocm9ub3MgU3RhbmRhcmQgRXh0ZW5zaW9ucyAqLyAKKyAgICBPTVhfVmlkZW9fTW90aW9uVmVjdG9yVmVuZG9yU3RhcnRVbnVzZWQgPSAweDdGMDAwMDAwLCAvKio8IFJlc2VydmVkIHJlZ2lvbiBmb3IgaW50cm9kdWNpbmcgVmVuZG9yIEV4dGVuc2lvbnMgKi8KKyAgICBPTVhfVmlkZW9fTW90aW9uVmVjdG9yTWF4ID0gMHg3RkZGRkZGRgorfSBPTVhfVklERU9fTU9USU9OVkVDVE9SVFlQRTsKKworCisvKioKKyAqIFN0cnVjdHVyZSBmb3IgY29uZmlndXJpbmcgdGhlIG51bWJlciBvZiBtb3Rpb24gdmVjdG9ycyB1c2VkIGFzIHdlbGwKKyAqIGFzIHRoZWlyIGFjY3VyYWN5LgorICogCisgKiBTVFJVQ1QgTUVNQkVSUzoKKyAqICBuU2l6ZSAgICAgICAgICAgIDogU2l6ZSBvZiB0aGUgc3RydWN0IGluIGJ5dGVzCisgKiAgblZlcnNpb24gICAgICAgICA6IE9NWCBzcGVjIHZlcnNpb24gaW5mbworICogIG5Qb3J0SW5kZXggICAgICAgOiBwb3J0IHRoYXQgdGhpcyBzdHJ1Y3R1cmUgYXBwbGllcyB0bworICogIGVBY2N1cmFjeSAgICAgICAgOiBFbnVtZXJhdGVkIE1WIGFjY3VyYWN5CisgKiAgYlVucmVzdHJpY3RlZE1WcyA6IEFsbG93IHVucmVzdHJpY3RlZCBNVnMKKyAqICBiRm91ck1WICAgICAgICAgIDogQWxsb3cgdXNlIG9mIDQgTVZzCisgKiAgc1hTZWFyY2hSYW5nZSAgICA6IFNlYXJjaCByYW5nZSBpbiBob3Jpem9udGFsIGRpcmVjdGlvbiBmb3IgTVZzCisgKiAgc1lTZWFyY2hSYW5nZSAgICA6IFNlYXJjaCByYW5nZSBpbiB2ZXJ0aWNhbCBkaXJlY3Rpb24gZm9yIE1WcworICovCit0eXBlZGVmIHN0cnVjdCBPTVhfVklERU9fUEFSQU1fTU9USU9OVkVDVE9SVFlQRSB7CisgICAgT01YX1UzMiBuU2l6ZTsKKyAgICBPTVhfVkVSU0lPTlRZUEUgblZlcnNpb247CisgICAgT01YX1UzMiBuUG9ydEluZGV4OworICAgIE9NWF9WSURFT19NT1RJT05WRUNUT1JUWVBFIGVBY2N1cmFjeTsKKyAgICBPTVhfQk9PTCBiVW5yZXN0cmljdGVkTVZzOworICAgIE9NWF9CT09MIGJGb3VyTVY7CisgICAgT01YX1MzMiBzWFNlYXJjaFJhbmdlOworICAgIE9NWF9TMzIgc1lTZWFyY2hSYW5nZTsKK30gT01YX1ZJREVPX1BBUkFNX01PVElPTlZFQ1RPUlRZUEU7CisKKworLyoqIAorICogRW51bWVyYXRpb24gb2YgcG9zc2libGUgbWV0aG9kcyB0byB1c2UgZm9yIEludHJhIFJlZnJlc2ggCisgKi8KK3R5cGVkZWYgZW51bSBPTVhfVklERU9fSU5UUkFSRUZSRVNIVFlQRSB7CisgICAgT01YX1ZJREVPX0ludHJhUmVmcmVzaEN5Y2xpYywKKyAgICBPTVhfVklERU9fSW50cmFSZWZyZXNoQWRhcHRpdmUsCisgICAgT01YX1ZJREVPX0ludHJhUmVmcmVzaEJvdGgsCisgICAgT01YX1ZJREVPX0ludHJhUmVmcmVzaEtocm9ub3NFeHRlbnNpb25zID0gMHg2RjAwMDAwMCwgLyoqPCBSZXNlcnZlZCByZWdpb24gZm9yIGludHJvZHVjaW5nIEtocm9ub3MgU3RhbmRhcmQgRXh0ZW5zaW9ucyAqLyAKKyAgICBPTVhfVklERU9fSW50cmFSZWZyZXNoVmVuZG9yU3RhcnRVbnVzZWQgPSAweDdGMDAwMDAwLCAvKio8IFJlc2VydmVkIHJlZ2lvbiBmb3IgaW50cm9kdWNpbmcgVmVuZG9yIEV4dGVuc2lvbnMgKi8KKyAgICBPTVhfVklERU9fSW50cmFSZWZyZXNoTWF4ID0gMHg3RkZGRkZGRgorfSBPTVhfVklERU9fSU5UUkFSRUZSRVNIVFlQRTsKKworCisvKioKKyAqIFN0cnVjdHVyZSBmb3IgY29uZmlndXJpbmcgaW50cmEgcmVmcmVzaCBtb2RlIAorICogCisgKiBTVFJVQ1QgTUVNQkVSUzoKKyAqICBuU2l6ZSAgICAgICAgOiBTaXplIG9mIHRoZSBzdHJ1Y3R1cmUgaW4gYnl0ZXMKKyAqICBuVmVyc2lvbiAgICAgOiBPTVggc3BlY2lmaWNhdGlvbiB2ZXJzaW9uIGluZm9ybWF0aW9uCisgKiAgblBvcnRJbmRleCAgIDogUG9ydCB0aGF0IHRoaXMgc3RydWN0dXJlIGFwcGxpZXMgdG8KKyAqICBlUmVmcmVzaE1vZGUgOiBDeWNsaWMsIEFkYXB0aXZlLCBvciBCb3RoCisgKiAgbkFpck1CcyAgICAgIDogTnVtYmVyIG9mIGludHJhIG1hY3JvYmxvY2tzIHRvIHJlZnJlc2ggaW4gYSBmcmFtZSB3aGVuIAorICogICAgICAgICAgICAgICAgIEFJUiBpcyBlbmFibGVkCisgKiAgbkFpclJlZiAgICAgIDogTnVtYmVyIG9mIHRpbWVzIGEgbW90aW9uIG1hcmtlZCBtYWNyb2Jsb2NrIGhhcyB0byBiZSAgCisgKiAgICAgICAgICAgICAgICAgaW50cmEgY29kZWQKKyAqICBuQ2lyTUJzICAgICAgOiBOdW1iZXIgb2YgY29uc2VjdXRpdmUgbWFjcm9ibG9ja3MgdG8gYmUgY29kZWQgYXMgImludHJhIiAgCisgKiAgICAgICAgICAgICAgICAgd2hlbiBDSVIgaXMgZW5hYmxlZAorICovCit0eXBlZGVmIHN0cnVjdCBPTVhfVklERU9fUEFSQU1fSU5UUkFSRUZSRVNIVFlQRSB7CisgICAgT01YX1UzMiBuU2l6ZTsKKyAgICBPTVhfVkVSU0lPTlRZUEUgblZlcnNpb247CisgICAgT01YX1UzMiBuUG9ydEluZGV4OworICAgIE9NWF9WSURFT19JTlRSQVJFRlJFU0hUWVBFIGVSZWZyZXNoTW9kZTsKKyAgICBPTVhfVTMyIG5BaXJNQnM7CisgICAgT01YX1UzMiBuQWlyUmVmOworICAgIE9NWF9VMzIgbkNpck1CczsKK30gT01YX1ZJREVPX1BBUkFNX0lOVFJBUkVGUkVTSFRZUEU7CisKKworLyoqCisgKiBTdHJ1Y3R1cmUgZm9yIGVuYWJsaW5nIHZhcmlvdXMgZXJyb3IgY29ycmVjdGlvbiBtZXRob2RzIGZvciB2aWRlbyAKKyAqIGNvbXByZXNzaW9uLgorICoKKyAqIFNUUlVDVCBNRU1CRVJTOgorICogIG5TaXplICAgICAgICAgICAgICAgICAgIDogU2l6ZSBvZiB0aGUgc3RydWN0dXJlIGluIGJ5dGVzCisgKiAgblZlcnNpb24gICAgICAgICAgICAgICAgOiBPTVggc3BlY2lmaWNhdGlvbiB2ZXJzaW9uIGluZm9ybWF0aW9uIAorICogIG5Qb3J0SW5kZXggICAgICAgICAgICAgIDogUG9ydCB0aGF0IHRoaXMgc3RydWN0dXJlIGFwcGxpZXMgdG8gCisgKiAgYkVuYWJsZUhFQyAgICAgICAgICAgICAgOiBFbmFibGUvZGlzYWJsZSBoZWFkZXIgZXh0ZW5zaW9uIGNvZGVzIChIRUMpCisgKiAgYkVuYWJsZVJlc3luYyAgICAgICAgICAgOiBFbmFibGUvZGlzYWJsZSByZXN5bmNocm9uaXphdGlvbiBtYXJrZXJzCisgKiAgblJlc3luY2hNYXJrZXJTcGFjaW5nICAgOiBSZXN5bmNoIG1hcmtlcnMgaW50ZXJ2YWwgKGluIGJpdHMpIHRvIGJlIAorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgYXBwbGllZCBpbiB0aGUgc3RyZWFtIAorICogIGJFbmFibGVEYXRhUGFydGl0aW9uaW5nIDogRW5hYmxlL2Rpc2FibGUgZGF0YSBwYXJ0aXRpb25pbmcgCisgKiAgYkVuYWJsZVJWTEMgICAgICAgICAgICAgOiBFbmFibGUvZGlzYWJsZSByZXZlcnNpYmxlIHZhcmlhYmxlIGxlbmd0aCAKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvZGluZworICovCit0eXBlZGVmIHN0cnVjdCBPTVhfVklERU9fUEFSQU1fRVJST1JDT1JSRUNUSU9OVFlQRSB7CisgICAgT01YX1UzMiBuU2l6ZTsKKyAgICBPTVhfVkVSU0lPTlRZUEUgblZlcnNpb247CisgICAgT01YX1UzMiBuUG9ydEluZGV4OworICAgIE9NWF9CT09MIGJFbmFibGVIRUM7CisgICAgT01YX0JPT0wgYkVuYWJsZVJlc3luYzsKKyAgICBPTVhfVTMyICBuUmVzeW5jaE1hcmtlclNwYWNpbmc7CisgICAgT01YX0JPT0wgYkVuYWJsZURhdGFQYXJ0aXRpb25pbmc7CisgICAgT01YX0JPT0wgYkVuYWJsZVJWTEM7Cit9IE9NWF9WSURFT19QQVJBTV9FUlJPUkNPUlJFQ1RJT05UWVBFOworCisKKy8qKiAKKyAqIENvbmZpZ3VyYXRpb24gb2YgdmFyaWFibGUgYmxvY2stc2l6ZSBtb3Rpb24gY29tcGVuc2F0aW9uIChWQlNNQykgCisgKiAKKyAqIFNUUlVDVCBNRU1CRVJTOgorICogIG5TaXplICAgICAgOiBTaXplIG9mIHRoZSBzdHJ1Y3R1cmUgaW4gYnl0ZXMKKyAqICBuVmVyc2lvbiAgIDogT01YIHNwZWNpZmljYXRpb24gdmVyc2lvbiBpbmZvcm1hdGlvbiAKKyAqICBuUG9ydEluZGV4IDogUG9ydCB0aGF0IHRoaXMgc3RydWN0dXJlIGFwcGxpZXMgdG8KKyAqICBiMTZ4MTYgICAgIDogRW5hYmxlIGludGVyIGJsb2NrIHNlYXJjaCAxNngxNgorICogIGIxNng4ICAgICAgOiBFbmFibGUgaW50ZXIgYmxvY2sgc2VhcmNoIDE2eDgKKyAqICBiOHgxNiAgICAgIDogRW5hYmxlIGludGVyIGJsb2NrIHNlYXJjaCA4eDE2CisgKiAgYjh4OCAgICAgICA6IEVuYWJsZSBpbnRlciBibG9jayBzZWFyY2ggOHg4CisgKiAgYjh4NCAgICAgICA6IEVuYWJsZSBpbnRlciBibG9jayBzZWFyY2ggOHg0CisgKiAgYjR4OCAgICAgICA6IEVuYWJsZSBpbnRlciBibG9jayBzZWFyY2ggNHg4CisgKiAgYjR4NCAgICAgICA6IEVuYWJsZSBpbnRlciBibG9jayBzZWFyY2ggNHg0CisgKi8KK3R5cGVkZWYgc3RydWN0IE9NWF9WSURFT19QQVJBTV9WQlNNQ1RZUEUgeworICAgIE9NWF9VMzIgblNpemU7IAorICAgIE9NWF9WRVJTSU9OVFlQRSBuVmVyc2lvbjsgCisgICAgT01YX1UzMiBuUG9ydEluZGV4OyAgICAgICAKKyAgICBPTVhfQk9PTCBiMTZ4MTY7IAorICAgIE9NWF9CT09MIGIxNng4OyAKKyAgICBPTVhfQk9PTCBiOHgxNjsKKyAgICBPTVhfQk9PTCBiOHg4OworICAgIE9NWF9CT09MIGI4eDQ7CisgICAgT01YX0JPT0wgYjR4ODsKKyAgICBPTVhfQk9PTCBiNHg0OworfSBPTVhfVklERU9fUEFSQU1fVkJTTUNUWVBFOworCisKKy8qKiAKKyAqIEguMjYzIHByb2ZpbGUgdHlwZXMsIGVhY2ggcHJvZmlsZSBpbmRpY2F0ZXMgc3VwcG9ydCBmb3IgdmFyaW91cyAKKyAqIHBlcmZvcm1hbmNlIGJvdW5kcyBhbmQgZGlmZmVyZW50IGFubmV4ZXMuCisgKgorICogRU5VTVM6CisgKiAgQmFzZWxpbmUgICAgICAgICAgIDogQmFzZWxpbmUgUHJvZmlsZTogSC4yNjMgKFYxKSwgbm8gb3B0aW9uYWwgbW9kZXMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisgKiAgSDMyMCBDb2RpbmcgICAgICAgIDogSC4zMjAgQ29kaW5nIEVmZmljaWVuY3kgQmFja3dhcmQgQ29tcGF0aWJpbGl0eSAKKyAqICAgICAgICAgICAgICAgICAgICAgICBQcm9maWxlOiBILjI2MysgKFYyKSwgaW5jbHVkZXMgYW5uZXhlcyBJLCBKLCBMLjQKKyAqICAgICAgICAgICAgICAgICAgICAgICBhbmQgVAorICogIEJhY2t3YXJkQ29tcGF0aWJsZSA6IEJhY2t3YXJkIENvbXBhdGliaWxpdHkgUHJvZmlsZTogSC4yNjMgKFYxKSwgCisgKiAgICAgICAgICAgICAgICAgICAgICAgaW5jbHVkZXMgYW5uZXggRiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorICogIElTV1YyICAgICAgICAgICAgICA6IEludGVyYWN0aXZlIFN0cmVhbWluZyBXaXJlbGVzcyBQcm9maWxlOiBILjI2MysgCisgKiAgICAgICAgICAgICAgICAgICAgICAgKFYyKSwgaW5jbHVkZXMgYW5uZXhlcyBJLCBKLCBLIGFuZCBUICAgICAgICAgICAgICAgICAKKyAqICBJU1dWMyAgICAgICAgICAgICAgOiBJbnRlcmFjdGl2ZSBTdHJlYW1pbmcgV2lyZWxlc3MgUHJvZmlsZTogSC4yNjMrKyAgCisgKiAgICAgICAgICAgICAgICAgICAgICAgKFYzKSwgaW5jbHVkZXMgcHJvZmlsZSAzIGFuZCBhbm5leGVzIFYgYW5kIFcuNi4zLjggICAKKyAqICBIaWdoQ29tcHJlc3Npb24gICAgOiBDb252ZXJzYXRpb25hbCBIaWdoIENvbXByZXNzaW9uIFByb2ZpbGU6IEguMjYzKysgIAorICogICAgICAgICAgICAgICAgICAgICAgIChWMyksIGluY2x1ZGVzIHByb2ZpbGVzIDEgJiAyIGFuZCBhbm5leGVzIEQgYW5kIFUgICAKKyAqICBJbnRlcm5ldCAgICAgICAgICAgOiBDb252ZXJzYXRpb25hbCBJbnRlcm5ldCBQcm9maWxlOiBILjI2MysrIChWMyksICAKKyAqICAgICAgICAgICAgICAgICAgICAgICBpbmNsdWRlcyBwcm9maWxlIDUgYW5kIGFubmV4IEsgICAgICAgICAgICAgICAgICAgICAgIAorICogIEludGVybGFjZSAgICAgICAgICA6IENvbnZlcnNhdGlvbmFsIEludGVybGFjZSBQcm9maWxlOiBILjI2MysrIChWMyksICAKKyAqICAgICAgICAgICAgICAgICAgICAgICBpbmNsdWRlcyBwcm9maWxlIDUgYW5kIGFubmV4IFcuNi4zLjExICAgICAgICAgICAgICAgCisgKiAgSGlnaExhdGVuY3kgICAgICAgIDogSGlnaCBMYXRlbmN5IFByb2ZpbGU6IEguMjYzKysgKFYzKSwgaW5jbHVkZXMgIAorICogICAgICAgICAgICAgICAgICAgICAgIHByb2ZpbGUgNiBhbmQgYW5uZXhlcyBPLjEgYW5kIFAuNSAgICAgICAgICAgICAgICAgICAgICAgCisgKi8KK3R5cGVkZWYgZW51bSBPTVhfVklERU9fSDI2M1BST0ZJTEVUWVBFIHsKKyAgICBPTVhfVklERU9fSDI2M1Byb2ZpbGVCYXNlbGluZSAgICAgICAgICAgID0gMHgwMSwgICAgICAgIAorICAgIE9NWF9WSURFT19IMjYzUHJvZmlsZUgzMjBDb2RpbmcgICAgICAgICAgPSAweDAyLCAgICAgICAgICAKKyAgICBPTVhfVklERU9fSDI2M1Byb2ZpbGVCYWNrd2FyZENvbXBhdGlibGUgID0gMHgwNCwgIAorICAgIE9NWF9WSURFT19IMjYzUHJvZmlsZUlTV1YyICAgICAgICAgICAgICAgPSAweDA4LCAgICAgICAgICAgICAgIAorICAgIE9NWF9WSURFT19IMjYzUHJvZmlsZUlTV1YzICAgICAgICAgICAgICAgPSAweDEwLCAgICAgICAgICAgICAgIAorICAgIE9NWF9WSURFT19IMjYzUHJvZmlsZUhpZ2hDb21wcmVzc2lvbiAgICAgPSAweDIwLCAgICAgCisgICAgT01YX1ZJREVPX0gyNjNQcm9maWxlSW50ZXJuZXQgICAgICAgICAgICA9IDB4NDAsICAgICAgICAgICAgCisgICAgT01YX1ZJREVPX0gyNjNQcm9maWxlSW50ZXJsYWNlICAgICAgICAgICA9IDB4ODAsICAgICAgICAgICAKKyAgICBPTVhfVklERU9fSDI2M1Byb2ZpbGVIaWdoTGF0ZW5jeSAgICAgICAgID0gMHgxMDAsICAgICAgICAgCisgICAgT01YX1ZJREVPX0gyNjNQcm9maWxlS2hyb25vc0V4dGVuc2lvbnMgPSAweDZGMDAwMDAwLCAvKio8IFJlc2VydmVkIHJlZ2lvbiBmb3IgaW50cm9kdWNpbmcgS2hyb25vcyBTdGFuZGFyZCBFeHRlbnNpb25zICovIAorICAgIE9NWF9WSURFT19IMjYzUHJvZmlsZVZlbmRvclN0YXJ0VW51c2VkID0gMHg3RjAwMDAwMCwgLyoqPCBSZXNlcnZlZCByZWdpb24gZm9yIGludHJvZHVjaW5nIFZlbmRvciBFeHRlbnNpb25zICovCisgICAgT01YX1ZJREVPX0gyNjNQcm9maWxlTWF4ICAgICAgICAgICAgICAgICA9IDB4N0ZGRkZGRkYgIAorfSBPTVhfVklERU9fSDI2M1BST0ZJTEVUWVBFOworCisKKy8qKiAKKyAqIEguMjYzIGxldmVsIHR5cGVzLCBlYWNoIGxldmVsIGluZGljYXRlcyBzdXBwb3J0IGZvciB2YXJpb3VzIGZyYW1lIHNpemVzLCAKKyAqIGJpdCByYXRlcywgZGVjb2RlciBmcmFtZSByYXRlcy4KKyAqLwordHlwZWRlZiBlbnVtIE9NWF9WSURFT19IMjYzTEVWRUxUWVBFIHsKKyAgICBPTVhfVklERU9fSDI2M0xldmVsMTAgID0gMHgwMSwgIAorICAgIE9NWF9WSURFT19IMjYzTGV2ZWwyMCAgPSAweDAyLCAgICAgIAorICAgIE9NWF9WSURFT19IMjYzTGV2ZWwzMCAgPSAweDA0LCAgICAgIAorICAgIE9NWF9WSURFT19IMjYzTGV2ZWw0MCAgPSAweDA4LCAgICAgIAorICAgIE9NWF9WSURFT19IMjYzTGV2ZWw0NSAgPSAweDEwLCAgICAgIAorICAgIE9NWF9WSURFT19IMjYzTGV2ZWw1MCAgPSAweDIwLCAgICAgIAorICAgIE9NWF9WSURFT19IMjYzTGV2ZWw2MCAgPSAweDQwLCAgICAgIAorICAgIE9NWF9WSURFT19IMjYzTGV2ZWw3MCAgPSAweDgwLCAKKyAgICBPTVhfVklERU9fSDI2M0xldmVsS2hyb25vc0V4dGVuc2lvbnMgPSAweDZGMDAwMDAwLCAvKio8IFJlc2VydmVkIHJlZ2lvbiBmb3IgaW50cm9kdWNpbmcgS2hyb25vcyBTdGFuZGFyZCBFeHRlbnNpb25zICovIAorICAgIE9NWF9WSURFT19IMjYzTGV2ZWxWZW5kb3JTdGFydFVudXNlZCA9IDB4N0YwMDAwMDAsIC8qKjwgUmVzZXJ2ZWQgcmVnaW9uIGZvciBpbnRyb2R1Y2luZyBWZW5kb3IgRXh0ZW5zaW9ucyAqLworICAgIE9NWF9WSURFT19IMjYzTGV2ZWxNYXggPSAweDdGRkZGRkZGICAKK30gT01YX1ZJREVPX0gyNjNMRVZFTFRZUEU7CisKKworLyoqIAorICogU3BlY2lmaWVzIHRoZSBwaWN0dXJlIHR5cGUuIFRoZXNlIHZhbHVlcyBzaG91bGQgYmUgT1InZCB0byBzaWduYWwgYWxsIAorICogcGljdHVyZXMgdHlwZXMgd2hpY2ggYXJlIGFsbG93ZWQuCisgKgorICogRU5VTVM6CisgKiAgR2VuZXJpYyBQaWN0dXJlIFR5cGVzOiAgICAgICAgICBJLCBQIGFuZCBCCisgKiAgSC4yNjMgU3BlY2lmaWMgUGljdHVyZSBUeXBlczogICBTSSBhbmQgU1AKKyAqICBILjI2NCBTcGVjaWZpYyBQaWN0dXJlIFR5cGVzOiAgIEVJIGFuZCBFUAorICogIE1QRUctNCBTcGVjaWZpYyBQaWN0dXJlIFR5cGVzOiAgUworICovCit0eXBlZGVmIGVudW0gT01YX1ZJREVPX1BJQ1RVUkVUWVBFIHsKKyAgICBPTVhfVklERU9fUGljdHVyZVR5cGVJICAgPSAweDAxLAorICAgIE9NWF9WSURFT19QaWN0dXJlVHlwZVAgICA9IDB4MDIsCisgICAgT01YX1ZJREVPX1BpY3R1cmVUeXBlQiAgID0gMHgwNCwKKyAgICBPTVhfVklERU9fUGljdHVyZVR5cGVTSSAgPSAweDA4LAorICAgIE9NWF9WSURFT19QaWN0dXJlVHlwZVNQICA9IDB4MTAsCisgICAgT01YX1ZJREVPX1BpY3R1cmVUeXBlRUkgID0gMHgxMSwKKyAgICBPTVhfVklERU9fUGljdHVyZVR5cGVFUCAgPSAweDEyLAorICAgIE9NWF9WSURFT19QaWN0dXJlVHlwZVMgICA9IDB4MTQsCisgICAgT01YX1ZJREVPX1BpY3R1cmVUeXBlS2hyb25vc0V4dGVuc2lvbnMgPSAweDZGMDAwMDAwLCAvKio8IFJlc2VydmVkIHJlZ2lvbiBmb3IgaW50cm9kdWNpbmcgS2hyb25vcyBTdGFuZGFyZCBFeHRlbnNpb25zICovIAorICAgIE9NWF9WSURFT19QaWN0dXJlVHlwZVZlbmRvclN0YXJ0VW51c2VkID0gMHg3RjAwMDAwMCwgLyoqPCBSZXNlcnZlZCByZWdpb24gZm9yIGludHJvZHVjaW5nIFZlbmRvciBFeHRlbnNpb25zICovCisgICAgT01YX1ZJREVPX1BpY3R1cmVUeXBlTWF4ID0gMHg3RkZGRkZGRgorfSBPTVhfVklERU9fUElDVFVSRVRZUEU7CisKKworLyoqIAorICogSC4yNjMgUGFyYW1zIAorICoKKyAqIFNUUlVDVCBNRU1CRVJTOgorICogIG5TaXplICAgICAgICAgICAgICAgICAgICA6IFNpemUgb2YgdGhlIHN0cnVjdHVyZSBpbiBieXRlcworICogIG5WZXJzaW9uICAgICAgICAgICAgICAgICA6IE9NWCBzcGVjaWZpY2F0aW9uIHZlcnNpb24gaW5mb3JtYXRpb24gCisgKiAgblBvcnRJbmRleCAgICAgICAgICAgICAgIDogUG9ydCB0aGF0IHRoaXMgc3RydWN0dXJlIGFwcGxpZXMgdG8KKyAqICBuUEZyYW1lcyAgICAgICAgICAgICAgICAgOiBOdW1iZXIgb2YgUCBmcmFtZXMgYmV0d2VlbiBlYWNoIEkgZnJhbWUKKyAqICBuQkZyYW1lcyAgICAgICAgICAgICAgICAgOiBOdW1iZXIgb2YgQiBmcmFtZXMgYmV0d2VlbiBlYWNoIEkgZnJhbWUKKyAqICBlUHJvZmlsZSAgICAgICAgICAgICAgICAgOiBILjI2MyBwcm9maWxlKHMpIHRvIHVzZQorICogIGVMZXZlbCAgICAgICAgICAgICAgICAgICA6IEguMjYzIGxldmVsKHMpIHRvIHVzZQorICogIGJQTFVTUFRZUEVBbGxvd2VkICAgICAgICA6IEluZGljYXRpbmcgdGhhdCBpdCBpcyBhbGxvd2VkIHRvIHVzZSBQTFVTUFRZUEUgCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHNwZWNpZmllZCBpbiB0aGUgMTk5OCB2ZXJzaW9uIG9mIEguMjYzKSB0byAKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbmRpY2F0ZSBjdXN0b20gcGljdHVyZSBzaXplcyBvciBjbG9jayAKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmcmVxdWVuY2llcyAKKyAqICBuQWxsb3dlZFBpY3R1cmVUeXBlcyAgICAgOiBTcGVjaWZpZXMgdGhlIHBpY3R1cmUgdHlwZXMgYWxsb3dlZCBpbiB0aGUgCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYml0c3RyZWFtCisgKiAgYkZvcmNlUm91bmRpbmdUeXBlVG9aZXJvIDogdmFsdWUgb2YgdGhlIFJUWVBFIGJpdCAoYml0IDYgb2YgTVBQVFlQRSkgaXMgCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbm90IGNvbnN0cmFpbmVkLiBJdCBpcyByZWNvbW1lbmRlZCB0byBjaGFuZ2UgCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhlIHZhbHVlIG9mIHRoZSBSVFlQRSBiaXQgZm9yIGVhY2ggcmVmZXJlbmNlIAorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBpY3R1cmUgaW4gZXJyb3ItZnJlZSBjb21tdW5pY2F0aW9uCisgKiAgblBpY3R1cmVIZWFkZXJSZXBldGl0aW9uIDogU3BlY2lmaWVzIHRoZSBmcmVxdWVuY3kgb2YgcGljdHVyZSBoZWFkZXIgCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVwZXRpdGlvbgorICogIG5HT0JIZWFkZXJJbnRlcnZhbCAgICAgICA6IFNwZWNpZmllcyB0aGUgaW50ZXJ2YWwgb2Ygbm9uLWVtcHR5IEdPQiAgCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaGVhZGVycyBpbiB1bml0cyBvZiBHT0JzCisgKi8KK3R5cGVkZWYgc3RydWN0IE9NWF9WSURFT19QQVJBTV9IMjYzVFlQRSB7CisgICAgT01YX1UzMiBuU2l6ZTsKKyAgICBPTVhfVkVSU0lPTlRZUEUgblZlcnNpb247CisgICAgT01YX1UzMiBuUG9ydEluZGV4OworICAgIE9NWF9VMzIgblBGcmFtZXM7CisgICAgT01YX1UzMiBuQkZyYW1lczsKKyAgICBPTVhfVklERU9fSDI2M1BST0ZJTEVUWVBFIGVQcm9maWxlOworCU9NWF9WSURFT19IMjYzTEVWRUxUWVBFIGVMZXZlbDsKKyAgICBPTVhfQk9PTCBiUExVU1BUWVBFQWxsb3dlZDsKKyAgICBPTVhfVTMyIG5BbGxvd2VkUGljdHVyZVR5cGVzOworICAgIE9NWF9CT09MIGJGb3JjZVJvdW5kaW5nVHlwZVRvWmVybzsKKyAgICBPTVhfVTMyIG5QaWN0dXJlSGVhZGVyUmVwZXRpdGlvbjsKKyAgICBPTVhfVTMyIG5HT0JIZWFkZXJJbnRlcnZhbDsKK30gT01YX1ZJREVPX1BBUkFNX0gyNjNUWVBFOworCisKKy8qKiAKKyAqIE1QRUctMiBwcm9maWxlIHR5cGVzLCBlYWNoIHByb2ZpbGUgaW5kaWNhdGVzIHN1cHBvcnQgZm9yIHZhcmlvdXMgCisgKiBwZXJmb3JtYW5jZSBib3VuZHMgYW5kIGRpZmZlcmVudCBhbm5leGVzLgorICovCit0eXBlZGVmIGVudW0gT01YX1ZJREVPX01QRUcyUFJPRklMRVRZUEUgeworICAgIE9NWF9WSURFT19NUEVHMlByb2ZpbGVTaW1wbGUgPSAwLCAgLyoqPCBTaW1wbGUgUHJvZmlsZSAqLworICAgIE9NWF9WSURFT19NUEVHMlByb2ZpbGVNYWluLCAgICAgICAgLyoqPCBNYWluIFByb2ZpbGUgKi8KKyAgICBPTVhfVklERU9fTVBFRzJQcm9maWxlNDIyLCAgICAgICAgIC8qKjwgNDoyOjIgUHJvZmlsZSAqLworICAgIE9NWF9WSURFT19NUEVHMlByb2ZpbGVTTlIsICAgICAgICAgLyoqPCBTTlIgUHJvZmlsZSAqLworICAgIE9NWF9WSURFT19NUEVHMlByb2ZpbGVTcGF0aWFsLCAgICAgLyoqPCBTcGF0aWFsIFByb2ZpbGUgKi8KKyAgICBPTVhfVklERU9fTVBFRzJQcm9maWxlSGlnaCwgICAgICAgIC8qKjwgSGlnaCBQcm9maWxlICovCisgICAgT01YX1ZJREVPX01QRUcyUHJvZmlsZUtocm9ub3NFeHRlbnNpb25zID0gMHg2RjAwMDAwMCwgLyoqPCBSZXNlcnZlZCByZWdpb24gZm9yIGludHJvZHVjaW5nIEtocm9ub3MgU3RhbmRhcmQgRXh0ZW5zaW9ucyAqLyAKKyAgICBPTVhfVklERU9fTVBFRzJQcm9maWxlVmVuZG9yU3RhcnRVbnVzZWQgPSAweDdGMDAwMDAwLCAvKio8IFJlc2VydmVkIHJlZ2lvbiBmb3IgaW50cm9kdWNpbmcgVmVuZG9yIEV4dGVuc2lvbnMgKi8KKyAgICBPTVhfVklERU9fTVBFRzJQcm9maWxlTWF4ID0gMHg3RkZGRkZGRiAgCit9IE9NWF9WSURFT19NUEVHMlBST0ZJTEVUWVBFOworCisKKy8qKiAKKyAqIE1QRUctMiBsZXZlbCB0eXBlcywgZWFjaCBsZXZlbCBpbmRpY2F0ZXMgc3VwcG9ydCBmb3IgdmFyaW91cyBmcmFtZSAKKyAqIHNpemVzLCBiaXQgcmF0ZXMsIGRlY29kZXIgZnJhbWUgcmF0ZXMuICBObyBuZWVkIAorICovCit0eXBlZGVmIGVudW0gT01YX1ZJREVPX01QRUcyTEVWRUxUWVBFIHsKKyAgICBPTVhfVklERU9fTVBFRzJMZXZlbExMID0gMCwgIC8qKjwgTG93IExldmVsICovIAorICAgIE9NWF9WSURFT19NUEVHMkxldmVsTUwsICAgICAgLyoqPCBNYWluIExldmVsICovIAorICAgIE9NWF9WSURFT19NUEVHMkxldmVsSDE0LCAgICAgLyoqPCBIaWdoIDE0NDAgKi8gCisgICAgT01YX1ZJREVPX01QRUcyTGV2ZWxITCwgICAgICAvKio8IEhpZ2ggTGV2ZWwgKi8gICAKKyAgICBPTVhfVklERU9fTVBFRzJMZXZlbEtocm9ub3NFeHRlbnNpb25zID0gMHg2RjAwMDAwMCwgLyoqPCBSZXNlcnZlZCByZWdpb24gZm9yIGludHJvZHVjaW5nIEtocm9ub3MgU3RhbmRhcmQgRXh0ZW5zaW9ucyAqLyAKKyAgICBPTVhfVklERU9fTVBFRzJMZXZlbFZlbmRvclN0YXJ0VW51c2VkID0gMHg3RjAwMDAwMCwgLyoqPCBSZXNlcnZlZCByZWdpb24gZm9yIGludHJvZHVjaW5nIFZlbmRvciBFeHRlbnNpb25zICovCisgICAgT01YX1ZJREVPX01QRUcyTGV2ZWxNYXggPSAweDdGRkZGRkZGICAKK30gT01YX1ZJREVPX01QRUcyTEVWRUxUWVBFOworCisKKy8qKiAKKyAqIE1QRUctMiBwYXJhbXMgCisgKgorICogU1RSVUNUIE1FTUJFUlM6CisgKiAgblNpemUgICAgICA6IFNpemUgb2YgdGhlIHN0cnVjdHVyZSBpbiBieXRlcworICogIG5WZXJzaW9uICAgOiBPTVggc3BlY2lmaWNhdGlvbiB2ZXJzaW9uIGluZm9ybWF0aW9uCisgKiAgblBvcnRJbmRleCA6IFBvcnQgdGhhdCB0aGlzIHN0cnVjdHVyZSBhcHBsaWVzIHRvCisgKiAgblBGcmFtZXMgICA6IE51bWJlciBvZiBQIGZyYW1lcyBiZXR3ZWVuIGVhY2ggSSBmcmFtZQorICogIG5CRnJhbWVzICAgOiBOdW1iZXIgb2YgQiBmcmFtZXMgYmV0d2VlbiBlYWNoIEkgZnJhbWUKKyAqICBlUHJvZmlsZSAgIDogTVBFRy0yIHByb2ZpbGUocykgdG8gdXNlCisgKiAgZUxldmVsICAgICA6IE1QRUctMiBsZXZlbHMocykgdG8gdXNlCisgKi8KK3R5cGVkZWYgc3RydWN0IE9NWF9WSURFT19QQVJBTV9NUEVHMlRZUEUgeworICAgIE9NWF9VMzIgblNpemU7ICAgICAgICAgICAKKyAgICBPTVhfVkVSU0lPTlRZUEUgblZlcnNpb247CisgICAgT01YX1UzMiBuUG9ydEluZGV4OyAgICAgIAorICAgIE9NWF9VMzIgblBGcmFtZXM7ICAgICAgICAKKyAgICBPTVhfVTMyIG5CRnJhbWVzOyAgICAgICAgCisgICAgT01YX1ZJREVPX01QRUcyUFJPRklMRVRZUEUgZVByb2ZpbGU7CisJT01YX1ZJREVPX01QRUcyTEVWRUxUWVBFIGVMZXZlbDsgICAKK30gT01YX1ZJREVPX1BBUkFNX01QRUcyVFlQRTsKKworCisvKiogCisgKiBNUEVHLTQgcHJvZmlsZSB0eXBlcywgZWFjaCBwcm9maWxlIGluZGljYXRlcyBzdXBwb3J0IGZvciB2YXJpb3VzIAorICogcGVyZm9ybWFuY2UgYm91bmRzIGFuZCBkaWZmZXJlbnQgYW5uZXhlcy4KKyAqIAorICogRU5VTVM6CisgKiAgLSBTaW1wbGUgUHJvZmlsZSwgTGV2ZWxzIDEtMworICogIC0gU2ltcGxlIFNjYWxhYmxlIFByb2ZpbGUsIExldmVscyAxLTIKKyAqICAtIENvcmUgUHJvZmlsZSwgTGV2ZWxzIDEtMgorICogIC0gTWFpbiBQcm9maWxlLCBMZXZlbHMgMi00CisgKiAgLSBOLWJpdCBQcm9maWxlLCBMZXZlbCAyCisgKiAgLSBTY2FsYWJsZSBUZXh0dXJlIFByb2ZpbGUsIExldmVsIDEKKyAqICAtIFNpbXBsZSBGYWNlIEFuaW1hdGlvbiBQcm9maWxlLCBMZXZlbHMgMS0yCisgKiAgLSBTaW1wbGUgRmFjZSBhbmQgQm9keSBBbmltYXRpb24gKEZCQSkgUHJvZmlsZSwgTGV2ZWxzIDEtMgorICogIC0gQmFzaWMgQW5pbWF0ZWQgVGV4dHVyZSBQcm9maWxlLCBMZXZlbHMgMS0yCisgKiAgLSBIeWJyaWQgUHJvZmlsZSwgTGV2ZWxzIDEtMgorICogIC0gQWR2YW5jZWQgUmVhbCBUaW1lIFNpbXBsZSBQcm9maWxlcywgTGV2ZWxzIDEtNAorICogIC0gQ29yZSBTY2FsYWJsZSBQcm9maWxlLCBMZXZlbHMgMS0zCisgKiAgLSBBZHZhbmNlZCBDb2RpbmcgRWZmaWNpZW5jeSBQcm9maWxlLCBMZXZlbHMgMS00CisgKiAgLSBBZHZhbmNlZCBDb3JlIFByb2ZpbGUsIExldmVscyAxLTIKKyAqICAtIEFkdmFuY2VkIFNjYWxhYmxlIFRleHR1cmUsIExldmVscyAyLTMKKyAqLwordHlwZWRlZiBlbnVtIE9NWF9WSURFT19NUEVHNFBST0ZJTEVUWVBFIHsKKyAgICBPTVhfVklERU9fTVBFRzRQcm9maWxlU2ltcGxlICAgICAgICAgICA9IDB4MDEsICAgICAgICAKKyAgICBPTVhfVklERU9fTVBFRzRQcm9maWxlU2ltcGxlU2NhbGFibGUgICA9IDB4MDIsICAgIAorICAgIE9NWF9WSURFT19NUEVHNFByb2ZpbGVDb3JlICAgICAgICAgICAgID0gMHgwNCwgICAgICAgICAgICAgIAorICAgIE9NWF9WSURFT19NUEVHNFByb2ZpbGVNYWluICAgICAgICAgICAgID0gMHgwOCwgICAgICAgICAgICAgCisgICAgT01YX1ZJREVPX01QRUc0UHJvZmlsZU5iaXQgICAgICAgICAgICAgPSAweDEwLCAgICAgICAgICAgICAgCisgICAgT01YX1ZJREVPX01QRUc0UHJvZmlsZVNjYWxhYmxlVGV4dHVyZSAgPSAweDIwLCAgIAorICAgIE9NWF9WSURFT19NUEVHNFByb2ZpbGVTaW1wbGVGYWNlICAgICAgID0gMHg0MCwgICAgICAgIAorICAgIE9NWF9WSURFT19NUEVHNFByb2ZpbGVTaW1wbGVGQkEgICAgICAgID0gMHg4MCwgICAgICAgICAKKyAgICBPTVhfVklERU9fTVBFRzRQcm9maWxlQmFzaWNBbmltYXRlZCAgICA9IDB4MTAwLCAgICAgCisgICAgT01YX1ZJREVPX01QRUc0UHJvZmlsZUh5YnJpZCAgICAgICAgICAgPSAweDIwMCwgICAgICAgICAgICAKKyAgICBPTVhfVklERU9fTVBFRzRQcm9maWxlQWR2YW5jZWRSZWFsVGltZSA9IDB4NDAwLCAgCisgICAgT01YX1ZJREVPX01QRUc0UHJvZmlsZUNvcmVTY2FsYWJsZSAgICAgPSAweDgwMCwgICAgICAKKyAgICBPTVhfVklERU9fTVBFRzRQcm9maWxlQWR2YW5jZWRDb2RpbmcgICA9IDB4MTAwMCwgICAgCisgICAgT01YX1ZJREVPX01QRUc0UHJvZmlsZUFkdmFuY2VkQ29yZSAgICAgPSAweDIwMDAsICAgICAgCisgICAgT01YX1ZJREVPX01QRUc0UHJvZmlsZUFkdmFuY2VkU2NhbGFibGUgPSAweDQwMDAsCisgICAgT01YX1ZJREVPX01QRUc0UHJvZmlsZUFkdmFuY2VkU2ltcGxlICAgPSAweDgwMDAsCisgICAgT01YX1ZJREVPX01QRUc0UHJvZmlsZUtocm9ub3NFeHRlbnNpb25zID0gMHg2RjAwMDAwMCwgLyoqPCBSZXNlcnZlZCByZWdpb24gZm9yIGludHJvZHVjaW5nIEtocm9ub3MgU3RhbmRhcmQgRXh0ZW5zaW9ucyAqLyAKKyAgICBPTVhfVklERU9fTVBFRzRQcm9maWxlVmVuZG9yU3RhcnRVbnVzZWQgPSAweDdGMDAwMDAwLCAvKio8IFJlc2VydmVkIHJlZ2lvbiBmb3IgaW50cm9kdWNpbmcgVmVuZG9yIEV4dGVuc2lvbnMgKi8KKyAgICBPTVhfVklERU9fTVBFRzRQcm9maWxlTWF4ICAgICAgICAgICAgICA9IDB4N0ZGRkZGRkYgIAorfSBPTVhfVklERU9fTVBFRzRQUk9GSUxFVFlQRTsKKworCisvKiogCisgKiBNUEVHLTQgbGV2ZWwgdHlwZXMsIGVhY2ggbGV2ZWwgaW5kaWNhdGVzIHN1cHBvcnQgZm9yIHZhcmlvdXMgZnJhbWUgCisgKiBzaXplcywgYml0IHJhdGVzLCBkZWNvZGVyIGZyYW1lIHJhdGVzLiAgTm8gbmVlZCAKKyAqLwordHlwZWRlZiBlbnVtIE9NWF9WSURFT19NUEVHNExFVkVMVFlQRSB7CisgICAgT01YX1ZJREVPX01QRUc0TGV2ZWwwICA9IDB4MDEsICAgLyoqPCBMZXZlbCAwICovICAgCisgICAgT01YX1ZJREVPX01QRUc0TGV2ZWwwYiA9IDB4MDIsICAgLyoqPCBMZXZlbCAwYiAqLyAgIAorICAgIE9NWF9WSURFT19NUEVHNExldmVsMSAgPSAweDA0LCAgIC8qKjwgTGV2ZWwgMSAqLyAKKyAgICBPTVhfVklERU9fTVBFRzRMZXZlbDIgID0gMHgwOCwgICAvKio8IExldmVsIDIgKi8gCisgICAgT01YX1ZJREVPX01QRUc0TGV2ZWwzICA9IDB4MTAsICAgLyoqPCBMZXZlbCAzICovIAorICAgIE9NWF9WSURFT19NUEVHNExldmVsNCAgPSAweDIwLCAgIC8qKjwgTGV2ZWwgNCAqLyAgCisgICAgT01YX1ZJREVPX01QRUc0TGV2ZWw0YSA9IDB4NDAsICAgLyoqPCBMZXZlbCA0YSAqLyAgCisgICAgT01YX1ZJREVPX01QRUc0TGV2ZWw1ICA9IDB4ODAsICAgLyoqPCBMZXZlbCA1ICovICAKKyAgICBPTVhfVklERU9fTVBFRzRMZXZlbEtocm9ub3NFeHRlbnNpb25zID0gMHg2RjAwMDAwMCwgLyoqPCBSZXNlcnZlZCByZWdpb24gZm9yIGludHJvZHVjaW5nIEtocm9ub3MgU3RhbmRhcmQgRXh0ZW5zaW9ucyAqLyAKKyAgICBPTVhfVklERU9fTVBFRzRMZXZlbFZlbmRvclN0YXJ0VW51c2VkID0gMHg3RjAwMDAwMCwgLyoqPCBSZXNlcnZlZCByZWdpb24gZm9yIGludHJvZHVjaW5nIFZlbmRvciBFeHRlbnNpb25zICovCisgICAgT01YX1ZJREVPX01QRUc0TGV2ZWxNYXggPSAweDdGRkZGRkZGICAKK30gT01YX1ZJREVPX01QRUc0TEVWRUxUWVBFOworCisKKy8qKiAKKyAqIE1QRUctNCBjb25maWd1cmF0aW9uLiAgVGhpcyBzdHJ1Y3R1cmUgaGFuZGxlcyBjb25maWd1cmF0aW9uIG9wdGlvbnMKKyAqIHdoaWNoIGFyZSBzcGVjaWZpYyB0byBNUEVHNCBhbGdvcml0aG1zCisgKgorICogU1RSVUNUIE1FTUJFUlM6CisgKiAgblNpemUgICAgICAgICAgICAgICAgOiBTaXplIG9mIHRoZSBzdHJ1Y3R1cmUgaW4gYnl0ZXMKKyAqICBuVmVyc2lvbiAgICAgICAgICAgICA6IE9NWCBzcGVjaWZpY2F0aW9uIHZlcnNpb24gaW5mb3JtYXRpb24KKyAqICBuUG9ydEluZGV4ICAgICAgICAgICA6IFBvcnQgdGhhdCB0aGlzIHN0cnVjdHVyZSBhcHBsaWVzIHRvCisgKiAgblNsaWNlSGVhZGVyU3BhY2luZyAgOiBOdW1iZXIgb2YgbWFjcm9ibG9ja3MgYmV0d2VlbiBzbGljZSBoZWFkZXIgKEgyNjMrIAorICogICAgICAgICAgICAgICAgICAgICAgICAgQW5uZXggSykuIFB1dCB6ZXJvIGlmIG5vdCB1c2VkCisgKiAgYlNWSCAgICAgICAgICAgICAgICAgOiBFbmFibGUgU2hvcnQgVmlkZW8gSGVhZGVyIG1vZGUKKyAqICBiR292ICAgICAgICAgICAgICAgICA6IEZsYWcgdG8gZW5hYmxlIEdPVgorICogIG5QRnJhbWVzICAgICAgICAgICAgIDogTnVtYmVyIG9mIFAgZnJhbWVzIGJldHdlZW4gZWFjaCBJIGZyYW1lIChhbHNvIGNhbGxlZCAKKyAqICAgICAgICAgICAgICAgICAgICAgICAgIEdPViBwZXJpb2QpCisgKiAgbkJGcmFtZXMgICAgICAgICAgICAgOiBOdW1iZXIgb2YgQiBmcmFtZXMgYmV0d2VlbiBlYWNoIEkgZnJhbWUKKyAqICBuSURDVkxDVGhyZXNob2xkICAgICA6IFZhbHVlIG9mIGludHJhIERDIFZMQyB0aHJlc2hvbGQKKyAqICBiQUNQcmVkICAgICAgICAgICAgICA6IEZsYWcgdG8gdXNlIGFjIHByZWRpY3Rpb24KKyAqICBuTWF4UGFja2V0U2l6ZSAgICAgICA6IE1heGltdW0gc2l6ZSBvZiBwYWNrZXQgaW4gYnl0ZXMuCisgKiAgblRpbWVJbmNSZXMgICAgICAgICAgOiBVc2VkIHRvIHBhc3MgVk9QIHRpbWUgaW5jcmVtZW50IHJlc29sdXRpb24gZm9yIE1QRUc0LiAKKyAqICAgICAgICAgICAgICAgICAgICAgICAgIEludGVycHJldGVkIGFzIGRlc2NyaWJlZCBpbiBNUEVHNCBzdGFuZGFyZC4KKyAqICBlUHJvZmlsZSAgICAgICAgICAgICA6IE1QRUctNCBwcm9maWxlKHMpIHRvIHVzZS4KKyAqICBlTGV2ZWwgICAgICAgICAgICAgICA6IE1QRUctNCBsZXZlbChzKSB0byB1c2UuCisgKiAgbkFsbG93ZWRQaWN0dXJlVHlwZXMgOiBTcGVjaWZpZXMgdGhlIHBpY3R1cmUgdHlwZXMgYWxsb3dlZCBpbiB0aGUgYml0c3RyZWFtCisgKiAgbkhlYWRlckV4dGVuc2lvbiAgICAgOiBTcGVjaWZpZXMgdGhlIG51bWJlciBvZiBjb25zZWN1dGl2ZSB2aWRlbyBwYWNrZXQKKyAqICAgICAgICAgICAgICAgICAgICAgICAgIGhlYWRlcnMgd2l0aGluIGEgVk9QCisgKiAgYlJldmVyc2libGVWTEMgICAgICAgOiBTcGVjaWZpZXMgd2hldGhlciByZXZlcnNpYmxlIHZhcmlhYmxlIGxlbmd0aCBjb2RpbmcgCisgKiAgICAgICAgICAgICAgICAgICAgICAgICBpcyBpbiB1c2UKKyAqLwordHlwZWRlZiBzdHJ1Y3QgT01YX1ZJREVPX1BBUkFNX01QRUc0VFlQRSB7CisgICAgT01YX1UzMiBuU2l6ZTsKKyAgICBPTVhfVkVSU0lPTlRZUEUgblZlcnNpb247CisgICAgT01YX1UzMiBuUG9ydEluZGV4OworICAgIE9NWF9VMzIgblNsaWNlSGVhZGVyU3BhY2luZzsKKyAgICBPTVhfQk9PTCBiU1ZIOworICAgIE9NWF9CT09MIGJHb3Y7CisgICAgT01YX1UzMiBuUEZyYW1lczsKKyAgICBPTVhfVTMyIG5CRnJhbWVzOworICAgIE9NWF9VMzIgbklEQ1ZMQ1RocmVzaG9sZDsKKyAgICBPTVhfQk9PTCBiQUNQcmVkOworICAgIE9NWF9VMzIgbk1heFBhY2tldFNpemU7CisgICAgT01YX1UzMiBuVGltZUluY1JlczsKKyAgICBPTVhfVklERU9fTVBFRzRQUk9GSUxFVFlQRSBlUHJvZmlsZTsKKyAgICBPTVhfVklERU9fTVBFRzRMRVZFTFRZUEUgZUxldmVsOworICAgIE9NWF9VMzIgbkFsbG93ZWRQaWN0dXJlVHlwZXM7CisgICAgT01YX1UzMiBuSGVhZGVyRXh0ZW5zaW9uOworICAgIE9NWF9CT09MIGJSZXZlcnNpYmxlVkxDOworfSBPTVhfVklERU9fUEFSQU1fTVBFRzRUWVBFOworCisKKy8qKiAKKyAqIFdNViBWZXJzaW9ucyAKKyAqLwordHlwZWRlZiBlbnVtIE9NWF9WSURFT19XTVZGT1JNQVRUWVBFIHsKKyAgICBPTVhfVklERU9fV01WRm9ybWF0VW51c2VkID0gMHgwMSwgICAvKio8IEZvcm1hdCB1bnVzZWQgb3IgdW5rbm93biAqLworICAgIE9NWF9WSURFT19XTVZGb3JtYXQ3ICAgICAgPSAweDAyLCAgIC8qKjwgV2luZG93cyBNZWRpYSBWaWRlbyBmb3JtYXQgNyAqLworICAgIE9NWF9WSURFT19XTVZGb3JtYXQ4ICAgICAgPSAweDA0LCAgIC8qKjwgV2luZG93cyBNZWRpYSBWaWRlbyBmb3JtYXQgOCAqLworICAgIE9NWF9WSURFT19XTVZGb3JtYXQ5ICAgICAgPSAweDA4LCAgIC8qKjwgV2luZG93cyBNZWRpYSBWaWRlbyBmb3JtYXQgOSAqLworICAgIE9NWF9WSURFT19XTUZGb3JtYXRLaHJvbm9zRXh0ZW5zaW9ucyA9IDB4NkYwMDAwMDAsIC8qKjwgUmVzZXJ2ZWQgcmVnaW9uIGZvciBpbnRyb2R1Y2luZyBLaHJvbm9zIFN0YW5kYXJkIEV4dGVuc2lvbnMgKi8gCisgICAgT01YX1ZJREVPX1dNRkZvcm1hdFZlbmRvclN0YXJ0VW51c2VkID0gMHg3RjAwMDAwMCwgLyoqPCBSZXNlcnZlZCByZWdpb24gZm9yIGludHJvZHVjaW5nIFZlbmRvciBFeHRlbnNpb25zICovCisgICAgT01YX1ZJREVPX1dNVkZvcm1hdE1heCAgICA9IDB4N0ZGRkZGRkYKK30gT01YX1ZJREVPX1dNVkZPUk1BVFRZUEU7CisKKworLyoqIAorICogV01WIFBhcmFtcyAKKyAqCisgKiBTVFJVQ1QgTUVNQkVSUzoKKyAqICBuU2l6ZSAgICAgIDogU2l6ZSBvZiB0aGUgc3RydWN0dXJlIGluIGJ5dGVzCisgKiAgblZlcnNpb24gICA6IE9NWCBzcGVjaWZpY2F0aW9uIHZlcnNpb24gaW5mb3JtYXRpb24KKyAqICBuUG9ydEluZGV4IDogUG9ydCB0aGF0IHRoaXMgc3RydWN0dXJlIGFwcGxpZXMgdG8KKyAqICBlRm9ybWF0ICAgIDogVmVyc2lvbiBvZiBXTVYgc3RyZWFtIC8gZGF0YQorICovCit0eXBlZGVmIHN0cnVjdCBPTVhfVklERU9fUEFSQU1fV01WVFlQRSB7CisgICAgT01YX1UzMiBuU2l6ZTsgCisgICAgT01YX1ZFUlNJT05UWVBFIG5WZXJzaW9uOworICAgIE9NWF9VMzIgblBvcnRJbmRleDsKKyAgICBPTVhfVklERU9fV01WRk9STUFUVFlQRSBlRm9ybWF0OworfSBPTVhfVklERU9fUEFSQU1fV01WVFlQRTsKKworCisvKiogCisgKiBSZWFsIFZpZGVvIFZlcnNpb24gCisgKi8KK3R5cGVkZWYgZW51bSBPTVhfVklERU9fUlZGT1JNQVRUWVBFIHsKKyAgICBPTVhfVklERU9fUlZGb3JtYXRVbnVzZWQgPSAwLCAvKio8IEZvcm1hdCB1bnVzZWQgb3IgdW5rbm93biAqLworICAgIE9NWF9WSURFT19SVkZvcm1hdDgsICAgICAgICAgIC8qKjwgUmVhbCBWaWRlbyBmb3JtYXQgOCAqLworICAgIE9NWF9WSURFT19SVkZvcm1hdDksICAgICAgICAgIC8qKjwgUmVhbCBWaWRlbyBmb3JtYXQgOSAqLworICAgIE9NWF9WSURFT19SVkZvcm1hdEcyLCAgICAgICAgIC8qKjwgUmVhbCBWaWRlbyBGb3JtYXQgRzIgKi8KKyAgICBPTVhfVklERU9fUlZGb3JtYXRLaHJvbm9zRXh0ZW5zaW9ucyA9IDB4NkYwMDAwMDAsIC8qKjwgUmVzZXJ2ZWQgcmVnaW9uIGZvciBpbnRyb2R1Y2luZyBLaHJvbm9zIFN0YW5kYXJkIEV4dGVuc2lvbnMgKi8gCisgICAgT01YX1ZJREVPX1JWRm9ybWF0VmVuZG9yU3RhcnRVbnVzZWQgPSAweDdGMDAwMDAwLCAvKio8IFJlc2VydmVkIHJlZ2lvbiBmb3IgaW50cm9kdWNpbmcgVmVuZG9yIEV4dGVuc2lvbnMgKi8KKyAgICBPTVhfVklERU9fUlZGb3JtYXRNYXggPSAweDdGRkZGRkZGCit9IE9NWF9WSURFT19SVkZPUk1BVFRZUEU7CisKKworLyoqIAorICogUmVhbCBWaWRlbyBQYXJhbXMgCisgKgorICogU1RVQ1QgTUVNQkVSUzoKKyAqICBuU2l6ZSAgICAgICAgICAgICAgOiBTaXplIG9mIHRoZSBzdHJ1Y3R1cmUgaW4gYnl0ZXMKKyAqICBuVmVyc2lvbiAgICAgICAgICAgOiBPTVggc3BlY2lmaWNhdGlvbiB2ZXJzaW9uIGluZm9ybWF0aW9uIAorICogIG5Qb3J0SW5kZXggICAgICAgICA6IFBvcnQgdGhhdCB0aGlzIHN0cnVjdHVyZSBhcHBsaWVzIHRvCisgKiAgZUZvcm1hdCAgICAgICAgICAgIDogVmVyc2lvbiBvZiBSViBzdHJlYW0gLyBkYXRhCisgKiAgbkJpdHNQZXJQaXhlbCAgICAgIDogQml0cyBwZXIgcGl4ZWwgY29kZWQgaW4gdGhlIGZyYW1lCisgKiAgblBhZGRlZFdpZHRoICAgICAgIDogUGFkZGVkIHdpZHRoIGluIHBpeGVsIG9mIGEgdmlkZW8gZnJhbWUKKyAqICBuUGFkZGVkSGVpZ2h0ICAgICAgOiBQYWRkZWQgSGVpZ2h0IGluIHBpeGVscyBvZiBhIHZpZGVvIGZyYW1lCisgKiAgbkZyYW1lUmF0ZSAgICAgICAgIDogUmF0ZSBvZiB2aWRlbyBpbiBmcmFtZXMgcGVyIHNlY29uZAorICogIG5CaXRzdHJlYW1GbGFncyAgICA6IEZsYWdzIHdoaWNoIGludGVybmFsIGluZm9ybWF0aW9uIGFib3V0IHRoZSBiaXRzdHJlYW0KKyAqICBuQml0c3RyZWFtVmVyc2lvbiAgOiBCaXRzdHJlYW0gdmVyc2lvbgorICogIG5NYXhFbmNvZGVGcmFtZVNpemU6IE1heCBlbmNvZGVkIGZyYW1lIHNpemUKKyAqICBiRW5hYmxlUG9zdEZpbHRlciAgOiBUdXJuIG9uL29mZiBwb3N0IGZpbHRlcgorICogIGJFbmFibGVUZW1wb3JhbEludGVycG9sYXRpb24gOiBUdXJuIG9uL29mZiB0ZW1wb3JhbCBpbnRlcnBvbGF0aW9uCisgKiAgYkVuYWJsZUxhdGVuY3lNb2RlIDogV2hlbiBlbmFibGVkLCB0aGUgZGVjb2RlciBkb2VzIG5vdCBkaXNwbGF5IGEgZGVjb2RlZCAKKyAqICAgICAgICAgICAgICAgICAgICAgICBmcmFtZSB1bnRpbCBpdCBoYXMgZGV0ZWN0ZWQgdGhhdCBubyBlbmhhbmNlbWVudCBsYXllciAKKyAqICAJCQkJCSBmcmFtZXMgb3IgZGVwZW5kZW50IEIgZnJhbWVzIHdpbGwgYmUgY29taW5nLiBUaGlzIAorICogIAkJCQkJIGRldGVjdGlvbiB1c3VhbGx5IG9jY3VycyB3aGVuIGEgc3Vic2VxdWVudCBub24tQiAKKyAqICAJCQkJCSBmcmFtZSBpcyBlbmNvdW50ZXJlZCAKKyAqLwordHlwZWRlZiBzdHJ1Y3QgT01YX1ZJREVPX1BBUkFNX1JWVFlQRSB7CisgICAgT01YX1UzMiBuU2l6ZTsKKyAgICBPTVhfVkVSU0lPTlRZUEUgblZlcnNpb247CisgICAgT01YX1UzMiBuUG9ydEluZGV4OworICAgIE9NWF9WSURFT19SVkZPUk1BVFRZUEUgZUZvcm1hdDsKKyAgICBPTVhfVTE2IG5CaXRzUGVyUGl4ZWw7CisgICAgT01YX1UxNiBuUGFkZGVkV2lkdGg7CisgICAgT01YX1UxNiBuUGFkZGVkSGVpZ2h0OworICAgIE9NWF9VMzIgbkZyYW1lUmF0ZTsKKyAgICBPTVhfVTMyIG5CaXRzdHJlYW1GbGFnczsKKyAgICBPTVhfVTMyIG5CaXRzdHJlYW1WZXJzaW9uOworICAgIE9NWF9VMzIgbk1heEVuY29kZUZyYW1lU2l6ZTsKKyAgICBPTVhfQk9PTCBiRW5hYmxlUG9zdEZpbHRlcjsKKyAgICBPTVhfQk9PTCBiRW5hYmxlVGVtcG9yYWxJbnRlcnBvbGF0aW9uOworICAgIE9NWF9CT09MIGJFbmFibGVMYXRlbmN5TW9kZTsKK30gT01YX1ZJREVPX1BBUkFNX1JWVFlQRTsKKworCisvKiogCisgKiBBVkMgcHJvZmlsZSB0eXBlcywgZWFjaCBwcm9maWxlIGluZGljYXRlcyBzdXBwb3J0IGZvciB2YXJpb3VzIAorICogcGVyZm9ybWFuY2UgYm91bmRzIGFuZCBkaWZmZXJlbnQgYW5uZXhlcy4KKyAqLwordHlwZWRlZiBlbnVtIE9NWF9WSURFT19BVkNQUk9GSUxFVFlQRSB7CisgICAgT01YX1ZJREVPX0FWQ1Byb2ZpbGVCYXNlbGluZSA9IDB4MDEsICAgLyoqPCBCYXNlbGluZSBwcm9maWxlICovCisgICAgT01YX1ZJREVPX0FWQ1Byb2ZpbGVNYWluICAgICA9IDB4MDIsICAgLyoqPCBNYWluIHByb2ZpbGUgKi8KKyAgICBPTVhfVklERU9fQVZDUHJvZmlsZUV4dGVuZGVkID0gMHgwNCwgICAvKio8IEV4dGVuZGVkIHByb2ZpbGUgKi8KKyAgICBPTVhfVklERU9fQVZDUHJvZmlsZUhpZ2ggICAgID0gMHgwOCwgICAvKio8IEhpZ2ggcHJvZmlsZSAqLworICAgIE9NWF9WSURFT19BVkNQcm9maWxlSGlnaDEwICAgPSAweDEwLCAgIC8qKjwgSGlnaCAxMCBwcm9maWxlICovCisgICAgT01YX1ZJREVPX0FWQ1Byb2ZpbGVIaWdoNDIyICA9IDB4MjAsICAgLyoqPCBIaWdoIDQ6MjoyIHByb2ZpbGUgKi8KKyAgICBPTVhfVklERU9fQVZDUHJvZmlsZUhpZ2g0NDQgID0gMHg0MCwgICAvKio8IEhpZ2ggNDo0OjQgcHJvZmlsZSAqLworICAgIE9NWF9WSURFT19BVkNQcm9maWxlS2hyb25vc0V4dGVuc2lvbnMgPSAweDZGMDAwMDAwLCAvKio8IFJlc2VydmVkIHJlZ2lvbiBmb3IgaW50cm9kdWNpbmcgS2hyb25vcyBTdGFuZGFyZCBFeHRlbnNpb25zICovIAorICAgIE9NWF9WSURFT19BVkNQcm9maWxlVmVuZG9yU3RhcnRVbnVzZWQgPSAweDdGMDAwMDAwLCAvKio8IFJlc2VydmVkIHJlZ2lvbiBmb3IgaW50cm9kdWNpbmcgVmVuZG9yIEV4dGVuc2lvbnMgKi8KKyAgICBPTVhfVklERU9fQVZDUHJvZmlsZU1heCAgICAgID0gMHg3RkZGRkZGRiAgCit9IE9NWF9WSURFT19BVkNQUk9GSUxFVFlQRTsKKworCisvKiogCisgKiBBVkMgbGV2ZWwgdHlwZXMsIGVhY2ggbGV2ZWwgaW5kaWNhdGVzIHN1cHBvcnQgZm9yIHZhcmlvdXMgZnJhbWUgc2l6ZXMsIAorICogYml0IHJhdGVzLCBkZWNvZGVyIGZyYW1lIHJhdGVzLiAgTm8gbmVlZCAKKyAqLwordHlwZWRlZiBlbnVtIE9NWF9WSURFT19BVkNMRVZFTFRZUEUgeworICAgIE9NWF9WSURFT19BVkNMZXZlbDEgICA9IDB4MDEsICAgICAvKio8IExldmVsIDEgKi8KKyAgICBPTVhfVklERU9fQVZDTGV2ZWwxYiAgPSAweDAyLCAgICAgLyoqPCBMZXZlbCAxYiAqLworICAgIE9NWF9WSURFT19BVkNMZXZlbDExICA9IDB4MDQsICAgICAvKio8IExldmVsIDEuMSAqLworICAgIE9NWF9WSURFT19BVkNMZXZlbDEyICA9IDB4MDgsICAgICAvKio8IExldmVsIDEuMiAqLworICAgIE9NWF9WSURFT19BVkNMZXZlbDEzICA9IDB4MTAsICAgICAvKio8IExldmVsIDEuMyAqLworICAgIE9NWF9WSURFT19BVkNMZXZlbDIgICA9IDB4MjAsICAgICAvKio8IExldmVsIDIgKi8KKyAgICBPTVhfVklERU9fQVZDTGV2ZWwyMSAgPSAweDQwLCAgICAgLyoqPCBMZXZlbCAyLjEgKi8KKyAgICBPTVhfVklERU9fQVZDTGV2ZWwyMiAgPSAweDgwLCAgICAgLyoqPCBMZXZlbCAyLjIgKi8KKyAgICBPTVhfVklERU9fQVZDTGV2ZWwzICAgPSAweDEwMCwgICAgLyoqPCBMZXZlbCAzICovCisgICAgT01YX1ZJREVPX0FWQ0xldmVsMzEgID0gMHgyMDAsICAgIC8qKjwgTGV2ZWwgMy4xICovCisgICAgT01YX1ZJREVPX0FWQ0xldmVsMzIgID0gMHg0MDAsICAgIC8qKjwgTGV2ZWwgMy4yICovCisgICAgT01YX1ZJREVPX0FWQ0xldmVsNCAgID0gMHg4MDAsICAgIC8qKjwgTGV2ZWwgNCAqLworICAgIE9NWF9WSURFT19BVkNMZXZlbDQxICA9IDB4MTAwMCwgICAvKio8IExldmVsIDQuMSAqLworICAgIE9NWF9WSURFT19BVkNMZXZlbDQyICA9IDB4MjAwMCwgICAvKio8IExldmVsIDQuMiAqLworICAgIE9NWF9WSURFT19BVkNMZXZlbDUgICA9IDB4NDAwMCwgICAvKio8IExldmVsIDUgKi8KKyAgICBPTVhfVklERU9fQVZDTGV2ZWw1MSAgPSAweDgwMDAsICAgLyoqPCBMZXZlbCA1LjEgKi8KKyAgICBPTVhfVklERU9fQVZDTGV2ZWxLaHJvbm9zRXh0ZW5zaW9ucyA9IDB4NkYwMDAwMDAsIC8qKjwgUmVzZXJ2ZWQgcmVnaW9uIGZvciBpbnRyb2R1Y2luZyBLaHJvbm9zIFN0YW5kYXJkIEV4dGVuc2lvbnMgKi8gCisgICAgT01YX1ZJREVPX0FWQ0xldmVsVmVuZG9yU3RhcnRVbnVzZWQgPSAweDdGMDAwMDAwLCAvKio8IFJlc2VydmVkIHJlZ2lvbiBmb3IgaW50cm9kdWNpbmcgVmVuZG9yIEV4dGVuc2lvbnMgKi8KKyAgICBPTVhfVklERU9fQVZDTGV2ZWxNYXggPSAweDdGRkZGRkZGICAKK30gT01YX1ZJREVPX0FWQ0xFVkVMVFlQRTsKKworCisvKiogCisgKiBBVkMgbG9vcCBmaWx0ZXIgbW9kZXMgCisgKgorICogT01YX1ZJREVPX0FWQ0xvb3BGaWx0ZXJFbmFibGUgICAgICAgICAgICAgICA6IEVuYWJsZQorICogT01YX1ZJREVPX0FWQ0xvb3BGaWx0ZXJEaXNhYmxlICAgICAgICAgICAgICA6IERpc2FibGUKKyAqIE9NWF9WSURFT19BVkNMb29wRmlsdGVyRGlzYWJsZVNsaWNlQm91bmRhcnkgOiBEaXNhYmxlZCBvbiBzbGljZSBib3VuZGFyaWVzCisgKi8KK3R5cGVkZWYgZW51bSBPTVhfVklERU9fQVZDTE9PUEZJTFRFUlRZUEUgeworICAgIE9NWF9WSURFT19BVkNMb29wRmlsdGVyRW5hYmxlID0gMCwKKyAgICBPTVhfVklERU9fQVZDTG9vcEZpbHRlckRpc2FibGUsCisgICAgT01YX1ZJREVPX0FWQ0xvb3BGaWx0ZXJEaXNhYmxlU2xpY2VCb3VuZGFyeSwKKyAgICBPTVhfVklERU9fQVZDTG9vcEZpbHRlcktocm9ub3NFeHRlbnNpb25zID0gMHg2RjAwMDAwMCwgLyoqPCBSZXNlcnZlZCByZWdpb24gZm9yIGludHJvZHVjaW5nIEtocm9ub3MgU3RhbmRhcmQgRXh0ZW5zaW9ucyAqLyAKKyAgICBPTVhfVklERU9fQVZDTG9vcEZpbHRlclZlbmRvclN0YXJ0VW51c2VkID0gMHg3RjAwMDAwMCwgLyoqPCBSZXNlcnZlZCByZWdpb24gZm9yIGludHJvZHVjaW5nIFZlbmRvciBFeHRlbnNpb25zICovCisgICAgT01YX1ZJREVPX0FWQ0xvb3BGaWx0ZXJNYXggPSAweDdGRkZGRkZGCit9IE9NWF9WSURFT19BVkNMT09QRklMVEVSVFlQRTsKKworCisvKiogCisgKiBBVkMgcGFyYW1zIAorICoKKyAqIFNUUlVDVCBNRU1CRVJTOgorICogIG5TaXplICAgICAgICAgICAgICAgICAgICAgOiBTaXplIG9mIHRoZSBzdHJ1Y3R1cmUgaW4gYnl0ZXMKKyAqICBuVmVyc2lvbiAgICAgICAgICAgICAgICAgIDogT01YIHNwZWNpZmljYXRpb24gdmVyc2lvbiBpbmZvcm1hdGlvbgorICogIG5Qb3J0SW5kZXggICAgICAgICAgICAgICAgOiBQb3J0IHRoYXQgdGhpcyBzdHJ1Y3R1cmUgYXBwbGllcyB0bworICogIG5TbGljZUhlYWRlclNwYWNpbmcgICAgICAgOiBOdW1iZXIgb2YgbWFjcm9ibG9ja3MgYmV0d2VlbiBzbGljZSBoZWFkZXIsIHB1dCAgCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHplcm8gaWYgbm90IHVzZWQKKyAqICBuUEZyYW1lcyAgICAgICAgICAgICAgICAgIDogTnVtYmVyIG9mIFAgZnJhbWVzIGJldHdlZW4gZWFjaCBJIGZyYW1lCisgKiAgbkJGcmFtZXMgICAgICAgICAgICAgICAgICA6IE51bWJlciBvZiBCIGZyYW1lcyBiZXR3ZWVuIGVhY2ggSSBmcmFtZQorICogIGJVc2VIYWRhbWFyZCAgICAgICAgICAgICAgOiBFbmFibGUvZGlzYWJsZSBIYWRhbWFyZCB0cmFuc2Zvcm0KKyAqICBuUmVmRnJhbWVzICAgICAgICAgICAgICAgIDogTWF4IG51bWJlciBvZiByZWZlcmVuY2UgZnJhbWVzIHRvIHVzZSBmb3IgaW50ZXIKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbW90aW9uIHNlYXJjaCAoMS0xNikKKyAqICBuUmVmSWR4VHJhaWxpbmcgICAgICAgICAgIDogUGljIHBhcmFtIHNldCByZWYgZnJhbWUgaW5kZXggKGluZGV4IGludG8gcmVmCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZyYW1lIGJ1ZmZlciBvZiB0cmFpbGluZyBmcmFtZXMgbGlzdCksIEIgZnJhbWUKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3VwcG9ydAorICogIG5SZWZJZHhGb3J3YXJkICAgICAgICAgICAgOiBQaWMgcGFyYW0gc2V0IHJlZiBmcmFtZSBpbmRleCAoaW5kZXggaW50byByZWYKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnJhbWUgYnVmZmVyIG9mIGZvcndhcmQgZnJhbWVzIGxpc3QpLCBCIGZyYW1lCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN1cHBvcnQKKyAqICBiRW5hYmxlVUVQICAgICAgICAgICAgICAgIDogRW5hYmxlL2Rpc2FibGUgdW5lcXVhbCBlcnJvciBwcm90ZWN0aW9uLiBUaGlzIAorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpcyBvbmx5IHZhbGlkIG9mIGRhdGEgcGFydGl0aW9uaW5nIGlzIGVuYWJsZWQuCisgKiAgYkVuYWJsZUZNTyAgICAgICAgICAgICAgICA6IEVuYWJsZS9kaXNhYmxlIGZsZXhpYmxlIG1hY3JvYmxvY2sgb3JkZXJpbmcKKyAqICBiRW5hYmxlQVNPICAgICAgICAgICAgICAgIDogRW5hYmxlL2Rpc2FibGUgYXJiaXRyYXJ5IHNsaWNlIG9yZGVyaW5nCisgKiAgYkVuYWJsZVJTICAgICAgICAgICAgICAgICA6IEVuYWJsZS9kaXNhYmxlIHNlbmRpbmcgb2YgcmVkdW5kYW50IHNsaWNlcworICogIGVQcm9maWxlICAgICAgICAgICAgICAgICAgOiBBVkMgcHJvZmlsZShzKSB0byB1c2UKKyAqICBlTGV2ZWwgICAgICAgICAgICAgICAgICAgIDogQVZDIGxldmVsKHMpIHRvIHVzZQorICogIG5BbGxvd2VkUGljdHVyZVR5cGVzICAgICAgOiBTcGVjaWZpZXMgdGhlIHBpY3R1cmUgdHlwZXMgYWxsb3dlZCBpbiB0aGUgCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJpdHN0cmVhbQorICogIGJGcmFtZU1Cc09ubHkgICAgICAgICAgICAgOiBzcGVjaWZpZXMgdGhhdCBldmVyeSBjb2RlZCBwaWN0dXJlIG9mIHRoZSAKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29kZWQgdmlkZW8gc2VxdWVuY2UgaXMgYSBjb2RlZCBmcmFtZSAKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29udGFpbmluZyBvbmx5IGZyYW1lIG1hY3JvYmxvY2tzCisgKiAgYk1CQUZGICAgICAgICAgICAgICAgICAgICA6IEVuYWJsZS9kaXNhYmxlIHN3aXRjaGluZyBiZXR3ZWVuIGZyYW1lIGFuZCAKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmllbGQgbWFjcm9ibG9ja3Mgd2l0aGluIGEgcGljdHVyZQorICogIGJFbnRyb3B5Q29kaW5nQ0FCQUMgICAgICAgOiBFbnRyb3B5IGRlY29kaW5nIG1ldGhvZCB0byBiZSBhcHBsaWVkIGZvciB0aGUgCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN5bnRheCBlbGVtZW50cyBmb3Igd2hpY2ggdHdvIGRlc2NyaXB0b3JzIGFwcGVhciAKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW4gdGhlIHN5bnRheCB0YWJsZXMKKyAqICBiV2VpZ2h0ZWRQUHJlZGljdGlvbiAgICAgIDogRW5hYmxlL2Rpc2FibGUgd2VpZ2h0ZWQgcHJlZGljdGlvbiBzaGFsbCBub3QgCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJlIGFwcGxpZWQgdG8gUCBhbmQgU1Agc2xpY2VzCisgKiAgbldlaWdodGVkQmlwcmVkaWNpdG9uTW9kZSA6IERlZmF1bHQgd2VpZ2h0ZWQgcHJlZGljdGlvbiBpcyBhcHBsaWVkIHRvIEIgCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNsaWNlcyAKKyAqICBiY29uc3RJcHJlZCAgICAgICAgICAgICAgIDogRW5hYmxlL2Rpc2FibGUgaW50cmEgcHJlZGljdGlvbgorICogIGJEaXJlY3Q4eDhJbmZlcmVuY2UgICAgICAgOiBTcGVjaWZpZXMgdGhlIG1ldGhvZCB1c2VkIGluIHRoZSBkZXJpdmF0aW9uIAorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcm9jZXNzIGZvciBsdW1hIG1vdGlvbiB2ZWN0b3JzIGZvciBCX1NraXAsIAorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCX0RpcmVjdF8xNngxNiBhbmQgQl9EaXJlY3RfOHg4IGFzIHNwZWNpZmllZCAKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW4gc3ViY2xhdXNlIDguNC4xLjIgb2YgdGhlIEFWQyBzcGVjIAorICogIGJEaXJlY3RTcGF0aWFsVGVtcG9yYWwgICAgOiBGbGFnIGluZGljYXRpbmcgc3BhdGlhbCBvciB0ZW1wb3JhbCBkaXJlY3QKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbW9kZSB1c2VkIGluIEIgc2xpY2UgY29kaW5nIChyZWxhdGVkIHRvIAorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiRGlyZWN0OHg4SW5mZXJlbmNlKSAuIFNwYXRpYWwgZGlyZWN0IG1vZGUgaXMgCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1vcmUgY29tbW9uIGFuZCBzaG91bGQgYmUgdGhlIGRlZmF1bHQuCisgKiAgbkNhYmFjSW5pdElkeCAgICAgICAgICAgICA6IEluZGV4IHVzZWQgdG8gaW5pdCBDQUJBQyBjb250ZXh0cworICogIGVMb29wRmlsdGVyTW9kZSAgICAgICAgICAgOiBFbmFibGUvZGlzYWJsZSBsb29wIGZpbHRlcgorICovCit0eXBlZGVmIHN0cnVjdCBPTVhfVklERU9fUEFSQU1fQVZDVFlQRSB7CisgICAgT01YX1UzMiBuU2l6ZTsgICAgICAgICAgICAgICAgIAorICAgIE9NWF9WRVJTSU9OVFlQRSBuVmVyc2lvbjsgICAgICAKKyAgICBPTVhfVTMyIG5Qb3J0SW5kZXg7ICAgICAgICAgICAgCisgICAgT01YX1UzMiBuU2xpY2VIZWFkZXJTcGFjaW5nOyAgCisgICAgT01YX1UzMiBuUEZyYW1lczsgICAgIAorICAgIE9NWF9VMzIgbkJGcmFtZXM7ICAgICAKKyAgICBPTVhfQk9PTCBiVXNlSGFkYW1hcmQ7CisgICAgT01YX1UzMiBuUmVmRnJhbWVzOyAgCisJT01YX1UzMiBuUmVmSWR4MTBBY3RpdmVNaW51czE7CisJT01YX1UzMiBuUmVmSWR4MTFBY3RpdmVNaW51czE7CisgICAgT01YX0JPT0wgYkVuYWJsZVVFUDsgIAorICAgIE9NWF9CT09MIGJFbmFibGVGTU87ICAKKyAgICBPTVhfQk9PTCBiRW5hYmxlQVNPOyAgCisgICAgT01YX0JPT0wgYkVuYWJsZVJTOyAgIAorICAgIE9NWF9WSURFT19BVkNQUk9GSUxFVFlQRSBlUHJvZmlsZTsKKwlPTVhfVklERU9fQVZDTEVWRUxUWVBFIGVMZXZlbDsgCisgICAgT01YX1UzMiBuQWxsb3dlZFBpY3R1cmVUeXBlczsgIAorCU9NWF9CT09MIGJGcmFtZU1Cc09ubHk7ICAgICAgICAJCQkJCQkJCQkKKyAgICBPTVhfQk9PTCBiTUJBRkY7ICAgICAgICAgICAgICAgCisgICAgT01YX0JPT0wgYkVudHJvcHlDb2RpbmdDQUJBQzsgIAorICAgIE9NWF9CT09MIGJXZWlnaHRlZFBQcmVkaWN0aW9uOyAKKyAgICBPTVhfVTMyIG5XZWlnaHRlZEJpcHJlZGljaXRvbk1vZGU7IAorICAgIE9NWF9CT09MIGJjb25zdElwcmVkIDsKKyAgICBPTVhfQk9PTCBiRGlyZWN0OHg4SW5mZXJlbmNlOyAgCisJT01YX0JPT0wgYkRpcmVjdFNwYXRpYWxUZW1wb3JhbDsKKwlPTVhfVTMyIG5DYWJhY0luaXRJZGM7CisJT01YX1ZJREVPX0FWQ0xPT1BGSUxURVJUWVBFIGVMb29wRmlsdGVyTW9kZTsKK30gT01YX1ZJREVPX1BBUkFNX0FWQ1RZUEU7CisKK3R5cGVkZWYgc3RydWN0IE9NWF9WSURFT19QQVJBTV9QUk9GSUxFTEVWRUxUWVBFIHsKKyAgIE9NWF9VMzIgblNpemU7ICAgICAgICAgICAgICAgICAKKyAgIE9NWF9WRVJTSU9OVFlQRSBuVmVyc2lvbjsgICAgICAKKyAgIE9NWF9VMzIgblBvcnRJbmRleDsgICAgICAgICAgICAKKyAgIE9NWF9VMzIgZVByb2ZpbGU7ICAgICAgLyoqPCB0eXBlIGlzIE9NWF9WSURFT19BVkNQUk9GSUxFVFlQRSwgT01YX1ZJREVPX0gyNjNQUk9GSUxFVFlQRSwgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvciBPTVhfVklERU9fTVBFRzRQUk9GSUxFVFlQRSBkZXBlbmRpbmcgb24gY29udGV4dCAqLworICAgT01YX1UzMiBlTGV2ZWw7ICAgICAgICAvKio8IHR5cGUgaXMgT01YX1ZJREVPX0FWQ0xFVkVMVFlQRSwgT01YX1ZJREVPX0gyNjNMRVZFTFRZUEUsIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3IgT01YX1ZJREVPX01QRUc0UFJPRklMRVRZUEUgZGVwZW5kaW5nIG9uIGNvbnRleHQgKi8KKyAgIE9NWF9VMzIgblByb2ZpbGVJbmRleDsgLyoqPCBVc2VkIHRvIHF1ZXJ5IGZvciBpbmRpdmlkdWFsIHByb2ZpbGUgc3VwcG9ydCBpbmZvcm1hdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaGlzIHBhcmFtZXRlciBpcyB2YWxpZCBvbmx5IGZvciAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPTVhfSW5kZXhQYXJhbVZpZGVvUHJvZmlsZUxldmVsUXVlcnlTdXBwb3J0ZWQgaW5kZXgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRm9yIGFsbCBvdGhlciBpbmRpY2VzIHRoaXMgcGFyYW1ldGVyIGlzIHRvIGJlIGlnbm9yZWQuICovCit9IE9NWF9WSURFT19QQVJBTV9QUk9GSUxFTEVWRUxUWVBFOworCisvKiogCisgKiBTdHJ1Y3R1cmUgZm9yIGR5bmFtaWNhbGx5IGNvbmZpZ3VyaW5nIGJpdHJhdGUgbW9kZSBvZiBhIGNvZGVjLiAKKyAqCisgKiBTVFJVQ1QgTUVNQkVSUzoKKyAqICBuU2l6ZSAgICAgICAgICA6IFNpemUgb2YgdGhlIHN0cnVjdCBpbiBieXRlcworICogIG5WZXJzaW9uICAgICAgIDogT01YIHNwZWMgdmVyc2lvbiBpbmZvCisgKiAgblBvcnRJbmRleCAgICAgOiBQb3J0IHRoYXQgdGhpcyBzdHJ1Y3QgYXBwbGllcyB0bworICogIG5FbmNvZGVCaXRyYXRlIDogVGFyZ2V0IGF2ZXJhZ2UgYml0cmF0ZSB0byBiZSBnZW5lcmF0ZWQgaW4gYnBzCisgKi8KK3R5cGVkZWYgc3RydWN0IE9NWF9WSURFT19DT05GSUdfQklUUkFURVRZUEUgeworICAgIE9NWF9VMzIgblNpemU7ICAgICAgICAgICAgICAgICAgICAgICAgICAKKyAgICBPTVhfVkVSU0lPTlRZUEUgblZlcnNpb247ICAgICAgICAgICAgICAgCisgICAgT01YX1UzMiBuUG9ydEluZGV4OyAgICAgICAgICAgICAgICAgICAgIAorICAgIE9NWF9VMzIgbkVuY29kZUJpdHJhdGU7ICAgICAgICAgICAgICAgICAKK30gT01YX1ZJREVPX0NPTkZJR19CSVRSQVRFVFlQRTsKKworLyoqIAorICogRGVmaW5lcyBFbmNvZGVyIEZyYW1lIFJhdGUgc2V0dGluZworICoKKyAqIFNUUlVDVCBNRU1CRVJTOgorICogIG5TaXplICAgICAgICAgICAgOiBTaXplIG9mIHRoZSBzdHJ1Y3R1cmUgaW4gYnl0ZXMKKyAqICBuVmVyc2lvbiAgICAgICAgIDogT01YIHNwZWNpZmljYXRpb24gdmVyc2lvbiBpbmZvcm1hdGlvbiAKKyAqICBuUG9ydEluZGV4ICAgICAgIDogUG9ydCB0aGF0IHRoaXMgc3RydWN0dXJlIGFwcGxpZXMgdG8KKyAqICB4RW5jb2RlRnJhbWVyYXRlIDogRW5jb2RpbmcgZnJhbWVyYXRlIHJlcHJlc2VudGVkIGluIFExNiBmb3JtYXQKKyAqLwordHlwZWRlZiBzdHJ1Y3QgT01YX0NPTkZJR19GUkFNRVJBVEVUWVBFIHsKKyAgICBPTVhfVTMyIG5TaXplOworICAgIE9NWF9WRVJTSU9OVFlQRSBuVmVyc2lvbjsKKyAgICBPTVhfVTMyIG5Qb3J0SW5kZXg7CisgICAgT01YX1UzMiB4RW5jb2RlRnJhbWVyYXRlOyAvKiBRMTYgZm9ybWF0ICovCit9IE9NWF9DT05GSUdfRlJBTUVSQVRFVFlQRTsKKwordHlwZWRlZiBzdHJ1Y3QgT01YX0NPTkZJR19JTlRSQVJFRlJFU0hWT1BUWVBFIHsKKyAgICBPTVhfVTMyIG5TaXplOworICAgIE9NWF9WRVJTSU9OVFlQRSBuVmVyc2lvbjsKKyAgICBPTVhfVTMyIG5Qb3J0SW5kZXg7CisgICAgT01YX0JPT0wgSW50cmFSZWZyZXNoVk9QOworfSBPTVhfQ09ORklHX0lOVFJBUkVGUkVTSFZPUFRZUEU7CisKK3R5cGVkZWYgc3RydWN0IE9NWF9DT05GSUdfTUFDUk9CTE9DS0VSUk9STUFQVFlQRSB7CisgICAgT01YX1UzMiBuU2l6ZTsKKyAgICBPTVhfVkVSU0lPTlRZUEUgblZlcnNpb247CisgICAgT01YX1UzMiBuUG9ydEluZGV4OworICAgIE9NWF9VMzIgbkVyck1hcFNpemU7ICAgICAgICAgICAvKiBTaXplIG9mIHRoZSBFcnJvciBNYXAgaW4gYnl0ZXMgKi8KKyAgICBPTVhfVTggIEVyck1hcFsxXTsgICAgICAgICAgICAgLyogRXJyb3IgbWFwIGhpbnQgKi8KK30gT01YX0NPTkZJR19NQUNST0JMT0NLRVJST1JNQVBUWVBFOworCit0eXBlZGVmIHN0cnVjdCBPTVhfQ09ORklHX01CRVJST1JSRVBPUlRJTkdUWVBFIHsKKyAgICBPTVhfVTMyIG5TaXplOworICAgIE9NWF9WRVJTSU9OVFlQRSBuVmVyc2lvbjsKKyAgICBPTVhfVTMyIG5Qb3J0SW5kZXg7CisgICAgT01YX0JPT0wgYkVuYWJsZWQ7Cit9IE9NWF9DT05GSUdfTUJFUlJPUlJFUE9SVElOR1RZUEU7CisKK3R5cGVkZWYgc3RydWN0IE9NWF9QQVJBTV9NQUNST0JMT0NLU1RZUEUgeworICAgIE9NWF9VMzIgblNpemU7CisgICAgT01YX1ZFUlNJT05UWVBFIG5WZXJzaW9uOworICAgIE9NWF9VMzIgblBvcnRJbmRleDsKKyAgICBPTVhfVTMyIG5NYWNyb2Jsb2NrczsKK30gT01YX1BBUkFNX01BQ1JPQkxPQ0tTVFlQRTsKKworLyoqIAorICogQVZDIFNsaWNlIE1vZGUgbW9kZXMgCisgKgorICogT01YX1ZJREVPX1NMSUNFTU9ERV9BVkNEZWZhdWx0ICAgOiBOb3JtYWwgZnJhbWUgZW5jb2RpbmcsIG9uZSBzbGljZSBwZXIgZnJhbWUKKyAqIE9NWF9WSURFT19TTElDRU1PREVfQVZDTUJTbGljZSAgIDogTkFMIG1vZGUsIG51bWJlciBvZiBNQnMgcGVyIGZyYW1lCisgKiBPTVhfVklERU9fU0xJQ0VNT0RFX0FWQ0J5dGVTbGljZSA6IE5BTCBtb2RlLCBudW1iZXIgb2YgYnl0ZXMgcGVyIGZyYW1lCisgKi8KK3R5cGVkZWYgZW51bSBPTVhfVklERU9fQVZDU0xJQ0VNT0RFVFlQRSB7CisgICAgT01YX1ZJREVPX1NMSUNFTU9ERV9BVkNEZWZhdWx0ID0gMCwKKyAgICBPTVhfVklERU9fU0xJQ0VNT0RFX0FWQ01CU2xpY2UsCisgICAgT01YX1ZJREVPX1NMSUNFTU9ERV9BVkNCeXRlU2xpY2UsCisgICAgT01YX1ZJREVPX1NMSUNFTU9ERV9BVkNLaHJvbm9zRXh0ZW5zaW9ucyA9IDB4NkYwMDAwMDAsIC8qKjwgUmVzZXJ2ZWQgcmVnaW9uIGZvciBpbnRyb2R1Y2luZyBLaHJvbm9zIFN0YW5kYXJkIEV4dGVuc2lvbnMgKi8gCisgICAgT01YX1ZJREVPX1NMSUNFTU9ERV9BVkNWZW5kb3JTdGFydFVudXNlZCA9IDB4N0YwMDAwMDAsIC8qKjwgUmVzZXJ2ZWQgcmVnaW9uIGZvciBpbnRyb2R1Y2luZyBWZW5kb3IgRXh0ZW5zaW9ucyAqLworICAgIE9NWF9WSURFT19TTElDRU1PREVfQVZDTGV2ZWxNYXggPSAweDdGRkZGRkZGCit9IE9NWF9WSURFT19BVkNTTElDRU1PREVUWVBFOworCisvKiogCisgKiBBVkMgRk1PIFNsaWNlIE1vZGUgUGFyYW1zIAorICoKKyAqIFNUUlVDVCBNRU1CRVJTOgorICogIG5TaXplICAgICAgOiBTaXplIG9mIHRoZSBzdHJ1Y3R1cmUgaW4gYnl0ZXMKKyAqICBuVmVyc2lvbiAgIDogT01YIHNwZWNpZmljYXRpb24gdmVyc2lvbiBpbmZvcm1hdGlvbgorICogIG5Qb3J0SW5kZXggOiBQb3J0IHRoYXQgdGhpcyBzdHJ1Y3R1cmUgYXBwbGllcyB0bworICogIG5OdW1TbGljZUdyb3VwcyA6IFNwZWNpZmllcyB0aGUgbnVtYmVyIG9mIHNsaWNlIGdyb3VwcworICogIG5TbGljZUdyb3VwTWFwVHlwZSA6IFNwZWNpZmllcyB0aGUgdHlwZSBvZiBzbGljZSBncm91cHMKKyAqICBlU2xpY2VNb2RlIDogU3BlY2lmaWVzIHRoZSB0eXBlIG9mIHNsaWNlCisgKi8KK3R5cGVkZWYgc3RydWN0IE9NWF9WSURFT19QQVJBTV9BVkNTTElDRUZNTyB7CisgICAgT01YX1UzMiBuU2l6ZTsgCisgICAgT01YX1ZFUlNJT05UWVBFIG5WZXJzaW9uOworICAgIE9NWF9VMzIgblBvcnRJbmRleDsKKyAgICBPTVhfVTggbk51bVNsaWNlR3JvdXBzOworICAgIE9NWF9VOCBuU2xpY2VHcm91cE1hcFR5cGU7CisgICAgT01YX1ZJREVPX0FWQ1NMSUNFTU9ERVRZUEUgZVNsaWNlTW9kZTsKK30gT01YX1ZJREVPX1BBUkFNX0FWQ1NMSUNFRk1POworCisvKiogCisgKiBBVkMgSURSIFBlcmlvZCBDb25maWdzCisgKgorICogU1RSVUNUIE1FTUJFUlM6CisgKiAgblNpemUgICAgICA6IFNpemUgb2YgdGhlIHN0cnVjdHVyZSBpbiBieXRlcworICogIG5WZXJzaW9uICAgOiBPTVggc3BlY2lmaWNhdGlvbiB2ZXJzaW9uIGluZm9ybWF0aW9uCisgKiAgblBvcnRJbmRleCA6IFBvcnQgdGhhdCB0aGlzIHN0cnVjdHVyZSBhcHBsaWVzIHRvCisgKiAgbklEUlBlcmlvZCA6IFNwZWNpZmllcyBwZXJpb2RpY2l0eSBvZiBJRFIgZnJhbWVzCisgKiAgblBGcmFtZXMgOiBTcGVjaWZpZXMgaW50ZXJuYWwgb2YgY29kaW5nIEludHJhIGZyYW1lcworICovCit0eXBlZGVmIHN0cnVjdCBPTVhfVklERU9fQ09ORklHX0FWQ0lOVFJBUEVSSU9EIHsKKyAgICBPTVhfVTMyIG5TaXplOyAKKyAgICBPTVhfVkVSU0lPTlRZUEUgblZlcnNpb247CisgICAgT01YX1UzMiBuUG9ydEluZGV4OworICAgIE9NWF9VMzIgbklEUlBlcmlvZDsKKyAgICBPTVhfVTMyIG5QRnJhbWVzOworfSBPTVhfVklERU9fQ09ORklHX0FWQ0lOVFJBUEVSSU9EOworCisvKiogCisgKiBBVkMgTkFMIFNpemUgQ29uZmlncworICoKKyAqIFNUUlVDVCBNRU1CRVJTOgorICogIG5TaXplICAgICAgOiBTaXplIG9mIHRoZSBzdHJ1Y3R1cmUgaW4gYnl0ZXMKKyAqICBuVmVyc2lvbiAgIDogT01YIHNwZWNpZmljYXRpb24gdmVyc2lvbiBpbmZvcm1hdGlvbgorICogIG5Qb3J0SW5kZXggOiBQb3J0IHRoYXQgdGhpcyBzdHJ1Y3R1cmUgYXBwbGllcyB0bworICogIG5OYWx1Qnl0ZXMgOiBTcGVjaWZpZXMgdGhlIE5BTCB1bml0IHNpemUKKyAqLwordHlwZWRlZiBzdHJ1Y3QgT01YX1ZJREVPX0NPTkZJR19OQUxTSVpFIHsKKyAgICBPTVhfVTMyIG5TaXplOyAKKyAgICBPTVhfVkVSU0lPTlRZUEUgblZlcnNpb247CisgICAgT01YX1UzMiBuUG9ydEluZGV4OworICAgIE9NWF9VMzIgbk5hbHVCeXRlczsKK30gT01YX1ZJREVPX0NPTkZJR19OQUxTSVpFOworCisvKiogQH0gKi8KKworI2lmZGVmIF9fY3BsdXNwbHVzCit9CisjZW5kaWYgLyogX19jcGx1c3BsdXMgKi8KKworI2VuZGlmCisvKiBGaWxlIEVPRiAqLworCmRpZmYgLS1naXQgYS9leHlub3M0L211bHRpbWVkaWEvb3Blbm1heC9zZWNfb214L2luY2x1ZGUvc2VjL1NFQ19PTVhfRGVmLmggYi9leHlub3M0L211bHRpbWVkaWEvb3Blbm1heC9zZWNfb214L2luY2x1ZGUvc2VjL1NFQ19PTVhfRGVmLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMmI0ZGY2OQotLS0gL2Rldi9udWxsCisrKyBiL2V4eW5vczQvbXVsdGltZWRpYS9vcGVubWF4L3NlY19vbXgvaW5jbHVkZS9zZWMvU0VDX09NWF9EZWYuaApAQCAtMCwwICsxLDE4MiBAQAorLyoKKyAqCisgKiBDb3B5cmlnaHQgMjAxMCBTYW1zdW5nIEVsZWN0cm9uaWNzIFMuTFNJIENvLiBMVEQKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworLyoKKyAqIEBmaWxlICAgIFNFQ19PTVhfRGVmLmgKKyAqIEBicmllZiAgIFNFQ19PTVggc3BlY2lmaWMgZGVmaW5lCisgKiBAYXV0aG9yICBTZXVuZ0Jlb20gS2ltIChzYmNydXgua2ltQHNhbXN1bmcuY29tKQorICogQHZlcnNpb24gICAgMS4xLjAKKyAqIEBoaXN0b3J5CisgKiAgIDIwMTAuNy4xNSA6IENyZWF0ZQorICovCisKKyNpZm5kZWYgU0VDX09NWF9ERUYKKyNkZWZpbmUgU0VDX09NWF9ERUYKKworI2luY2x1ZGUgIk9NWF9UeXBlcy5oIgorI2luY2x1ZGUgIk9NWF9JVkNvbW1vbi5oIgorCisjZGVmaW5lIFZFUlNJT05NQUpPUl9OVU1CRVIgICAgICAgICAgICAgICAgMQorI2RlZmluZSBWRVJTSU9OTUlOT1JfTlVNQkVSICAgICAgICAgICAgICAgIDAKKyNkZWZpbmUgUkVWSVNJT05fTlVNQkVSICAgICAgICAgICAgICAgICAgICAwCisjZGVmaW5lIFNURVBfTlVNQkVSICAgICAgICAgICAgICAgICAgICAgICAgMAorCisKKyNkZWZpbmUgTUFYX09NWF9DT01QT05FTlRfTlVNICAgICAgICAgICAgICAyMAorI2RlZmluZSBNQVhfT01YX0NPTVBPTkVOVF9ST0xFX05VTSAgICAgICAgIDEwCisjZGVmaW5lIE1BWF9PTVhfQ09NUE9ORU5UX05BTUVfU0laRSAgICAgICAgT01YX01BWF9TVFJJTkdOQU1FX1NJWkUKKyNkZWZpbmUgTUFYX09NWF9DT01QT05FTlRfUk9MRV9TSVpFICAgICAgICBPTVhfTUFYX1NUUklOR05BTUVfU0laRQorI2RlZmluZSBNQVhfT01YX0NPTVBPTkVOVF9MSUJOQU1FX1NJWkUgICAgIE9NWF9NQVhfU1RSSU5HTkFNRV9TSVpFICogMgorI2RlZmluZSBNQVhfT01YX01JTUVUWVBFX1NJWkUgICAgICAgICAgICAgIE9NWF9NQVhfU1RSSU5HTkFNRV9TSVpFCisKKyNkZWZpbmUgTUFYX1RJTUVTVEFNUCAgICAgICAgMTcKKyNkZWZpbmUgTUFYX0ZMQUdTICAgICAgICAgICAgMTcKKworI2RlZmluZSBTRUNfT01YX0lOU1RBTExfUEFUSCAiL3N5c3RlbS9saWIvb214LyIKKwordHlwZWRlZiBlbnVtIF9TRUNfQ09ERUNfVFlQRQoreworICAgIFNXX0NPREVDLAorICAgIEhXX1ZJREVPX0RFQ19DT0RFQywKKyAgICBIV19WSURFT19FTkNfQ09ERUMsCisgICAgSFdfQVVESU9fREVDX0NPREVDLAorICAgIEhXX0FVRElPX0VOQ19DT0RFQworfSBTRUNfQ09ERUNfVFlQRTsKKwordHlwZWRlZiBzdHJ1Y3QgX1NFQ19PTVhfUFJJT1JJVFlNR01UVFlQRQoreworICAgIE9NWF9VMzIgbkdyb3VwUHJpb3JpdHk7IC8qIHRoZSB2YWx1ZSAwIHJlcHJlc2VudHMgdGhlIGhpZ2hlc3QgcHJpb3JpdHkgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBmb3IgYSBncm91cCBvZiBjb21wb25lbnRzICAgICAgICAgICAgICAgICAgICovCisgICAgT01YX1UzMiBuR3JvdXBJRDsKK30gU0VDX09NWF9QUklPUklUWU1HTVRUWVBFOworCit0eXBlZGVmIGVudW0gX1NFQ19PTVhfSU5ERVhUWVBFCit7CisjZGVmaW5lIFNFQ19JTkRFWF9QQVJBTV9FTkFCTEVfVEhVTUJOQUlMICJPTVguU0VDLmluZGV4LlRodW1ibmFpbE1vZGUiCisgICAgT01YX0luZGV4VmVuZG9yVGh1bWJuYWlsTW9kZSAgICAgICAgPSAweDdGMDAwMDAxLAorI2RlZmluZSBTRUNfSU5ERVhfQ09ORklHX1ZJREVPX0lOVFJBUEVSSU9EICJPTVguU0VDLmluZGV4LlZpZGVvSW50cmFQZXJpb2QiCisgICAgT01YX0luZGV4Q29uZmlnVmlkZW9JbnRyYVBlcmlvZCAgICAgPSAweDdGMDAwMDAyLAorCisgICAgLyogZm9yIEFuZHJvaWQgTmF0aXZlIFdpbmRvdyAqLworI2RlZmluZSBTRUNfSU5ERVhfUEFSQU1fRU5BQkxFX0FOQiAiT01YLmdvb2dsZS5hbmRyb2lkLmluZGV4LmVuYWJsZUFuZHJvaWROYXRpdmVCdWZmZXJzIgorICAgIE9NWF9JbmRleFBhcmFtRW5hYmxlQW5kcm9pZEJ1ZmZlcnMgICAgPSAweDdGMDAwMDExLAorI2RlZmluZSBTRUNfSU5ERVhfUEFSQU1fR0VUX0FOQiAiT01YLmdvb2dsZS5hbmRyb2lkLmluZGV4LmdldEFuZHJvaWROYXRpdmVCdWZmZXJVc2FnZSIKKyAgICBPTVhfSW5kZXhQYXJhbUdldEFuZHJvaWROYXRpdmVCdWZmZXIgID0gMHg3RjAwMDAxMiwKKyNkZWZpbmUgU0VDX0lOREVYX1BBUkFNX1VTRV9BTkIgIk9NWC5nb29nbGUuYW5kcm9pZC5pbmRleC51c2VBbmRyb2lkTmF0aXZlQnVmZmVyIgorICAgIE9NWF9JbmRleFBhcmFtVXNlQW5kcm9pZE5hdGl2ZUJ1ZmZlciAgPSAweDdGMDAwMDEzLAorICAgIC8qIGZvciBBbmRyb2lkIFN0b3JlIE1ldGFkYXRhIEluYnVmZmVyICovCisjZGVmaW5lIFNFQ19JTkRFWF9QQVJBTV9TVE9SRV9NRVRBREFUQV9CVUZGRVIgIk9NWC5nb29nbGUuYW5kcm9pZC5pbmRleC5zdG9yZU1ldGFEYXRhSW5CdWZmZXJzIgorICAgIE9NWF9JbmRleFBhcmFtU3RvcmVNZXRhRGF0YUJ1ZmZlciAgICAgPSAweDdGMDAwMDE0LAorCisgICAgLyogZm9yIEFuZHJvaWQgUFYgT3BlbkNvcmUqLworICAgIE9NWF9DT01QT05FTlRfQ0FQQUJJTElUWV9UWVBFX0lOREVYID0gMHhGRjdBMzQ3Cit9IFNFQ19PTVhfSU5ERVhUWVBFOworCit0eXBlZGVmIGVudW0gX1NFQ19PTVhfRVJST1JUWVBFCit7CisgICAgT01YX0Vycm9yTm9FT0YgPSAoT01YX1MzMikgMHg5MDAwMDAwMSwKKyAgICBPTVhfRXJyb3JJbnB1dERhdGFEZWNvZGVZZXQgPSAoT01YX1MzMikgMHg5MDAwMDAwMiwKKyAgICBPTVhfRXJyb3JJbnB1dERhdGFFbmNvZGVZZXQgPSAoT01YX1MzMikgMHg5MDAwMDAwMywKKyAgICBPTVhfRXJyb3JNRkNJbml0ID0gKE9NWF9TMzIpIDB4OTAwMDAwMDQKK30gU0VDX09NWF9FUlJPUlRZUEU7CisKK3R5cGVkZWYgZW51bSBfU0VDX09NWF9DT01NQU5EVFlQRQoreworICAgIFNFQ19PTVhfQ29tbWFuZENvbXBvbmVudERlSW5pdCA9IDB4N0YwMDAwMDEsCisgICAgU0VDX09NWF9Db21tYW5kRW1wdHlCdWZmZXIsCisgICAgU0VDX09NWF9Db21tYW5kRmlsbEJ1ZmZlcgorfSBTRUNfT01YX0NPTU1BTkRUWVBFOworCit0eXBlZGVmIGVudW0gX1NFQ19PTVhfVFJBTlNfU1RBVEVUWVBFIHsKKyAgICBTRUNfT01YX1RyYW5zU3RhdGVJbnZhbGlkLAorICAgIFNFQ19PTVhfVHJhbnNTdGF0ZUxvYWRlZFRvSWRsZSwKKyAgICBTRUNfT01YX1RyYW5zU3RhdGVJZGxlVG9FeGVjdXRpbmcsCisgICAgU0VDX09NWF9UcmFuc1N0YXRlRXhlY3V0aW5nVG9JZGxlLAorICAgIFNFQ19PTVhfVHJhbnNTdGF0ZUlkbGVUb0xvYWRlZCwKKyAgICBTRUNfT01YX1RyYW5zU3RhdGVNYXggPSAwWDdGRkZGRkZGCit9IFNFQ19PTVhfVFJBTlNfU1RBVEVUWVBFOworCit0eXBlZGVmIGVudW0gX1NFQ19PTVhfQ09MT1JfRk9STUFUVFlQRSB7CisgICAgT01YX1NFQ19DT0xPUl9Gb3JtYXROVjEyVFBoeXNpY2FsQWRkcmVzcyA9IDB4N0YwMDAwMDEsIC8qKjwgUmVzZXJ2ZWQgcmVnaW9uIGZvciBpbnRyb2R1Y2luZyBWZW5kb3IgRXh0ZW5zaW9ucyAqLworICAgIE9NWF9TRUNfQ09MT1JfRm9ybWF0TlYxMkxQaHlzaWNhbEFkZHJlc3MgPSAweDdGMDAwMDAyLAorICAgIE9NWF9TRUNfQ09MT1JfRm9ybWF0TlYxMkxWaXJ0dWFsQWRkcmVzcyA9IDB4N0YwMDAwMDMsCisgICAgT01YX1NFQ19DT0xPUl9Gb3JtYXROVjEyVGlsZWQgICAgICAgICAgICA9IDB4N0ZDMDAwMDIsICAvKiAweDdGQzAwMDAyICovCisjaWZkZWYgUzNEX1NVUFBPUlQKKyAgICBPTVhfU0VDX0NPTE9SX0Zvcm1hdE5WMTJUaWxlZF9TQlNfTFIgICAgID0gMHg3RkMwMDAwMywgIC8qIDB4N0ZDMDAwMDMgKi8KKyAgICBPTVhfU0VDX0NPTE9SX0Zvcm1hdE5WMTJUaWxlZF9TQlNfUkwgICAgID0gMHg3RkMwMDAwNCwgIC8qIDB4N0ZDMDAwMDQgKi8KKyAgICBPTVhfU0VDX0NPTE9SX0Zvcm1hdE5WMTJUaWxlZF9UQl9MUiAgICAgPSAweDdGQzAwMDA1LCAgLyogMHg3RkMwMDAwNSAqLworICAgIE9NWF9TRUNfQ09MT1JfRm9ybWF0TlYxMlRpbGVkX1RCX1JMICAgPSAweDdGQzAwMDA2LCAgLyogMHg3RkMwMDAwNiAqLworICAgIE9NWF9TRUNfQ09MT1JfRm9ybWF0WVVWNDIwU2VtaVBsYW5hcl9TQlNfTFIgICAgID0gMHg3RkMwMDAwNywgIC8qIDB4N0ZDMDAwMDcgKi8KKyAgICBPTVhfU0VDX0NPTE9SX0Zvcm1hdFlVVjQyMFNlbWlQbGFuYXJfU0JTX1JMICAgICA9IDB4N0ZDMDAwMDgsICAvKiAweDdGQzAwMDA4ICovCisgICAgT01YX1NFQ19DT0xPUl9Gb3JtYXRZVVY0MjBTZW1pUGxhbmFyX1RCX0xSICAgICA9IDB4N0ZDMDAwMDksICAvKiAweDdGQzAwMDA5ICovCisgICAgT01YX1NFQ19DT0xPUl9Gb3JtYXRZVVY0MjBTZW1pUGxhbmFyX1RCX1JMICAgPSAweDdGQzAwMDBBLCAgLyogMHg3RkMwMDAwQSAqLworICAgIE9NWF9TRUNfQ09MT1JfRm9ybWF0WVVWNDIwUGxhbmFyX1NCU19MUiAgICAgPSAweDdGQzAwMDBCLCAgLyogMHg3RkMwMDAwQiAqLworICAgIE9NWF9TRUNfQ09MT1JfRm9ybWF0WVVWNDIwUGxhbmFyX1NCU19STCAgICAgPSAweDdGQzAwMDBDLCAgLyogMHg3RkMwMDAwQyAqLworICAgIE9NWF9TRUNfQ09MT1JfRm9ybWF0WVVWNDIwUGxhbmFyX1RCX0xSICAgICA9IDB4N0ZDMDAwMEQsICAvKiAweDdGQzAwMDBEICovCisgICAgT01YX1NFQ19DT0xPUl9Gb3JtYXRZVVY0MjBQbGFuYXJfVEJfUkwgICA9IDB4N0ZDMDAwMEUsICAvKiAweDdGQzAwMDBFICovCisjZW5kaWYKKyAgICBPTVhfU0VDX0NPTE9SX0Zvcm1hdE5WMjFMUGh5c2ljYWxBZGRyZXNzID0gMHg3RjAwMDAxMCwKKyAgICBPTVhfU0VDX0NPTE9SX0Zvcm1hdE5WMjFMaW5lYXIgICAgICAgICAgID0gMHg3RjAwMDAxMSwKKworICAgIC8qIGZvciBBbmRyb2lkIE5hdGl2ZSBXaW5kb3cgKi8KKyAgICBPTVhfU0VDX0NPTE9SX0Zvcm1hdEFOQllVVjQyMFNlbWlQbGFuYXIgID0gMHgxMDAsCisgICAgLyogZm9yIEFuZHJvaWQgU3VyZmFjZU1lZGlhU291cmNlKi8KKyAgICBPTVhfQ09MT1JfRm9ybWF0QW5kcm9pZE9wYXF1ZSAgICAgICAgICAgID0gMHg3RjAwMDc4OQorfVNFQ19PTVhfQ09MT1JfRk9STUFUVFlQRTsKKwordHlwZWRlZiBlbnVtIF9TRUNfT01YX1NVUFBPUlRGT1JNQVRfVFlQRQoreworICAgIHN1cHBvcnRGb3JtYXRfMCA9IDB4MDAsCisgICAgc3VwcG9ydEZvcm1hdF8xLAorICAgIHN1cHBvcnRGb3JtYXRfMiwKKyAgICBzdXBwb3J0Rm9ybWF0XzMsCisgICAgc3VwcG9ydEZvcm1hdF80LAorICAgIHN1cHBvcnRGb3JtYXRfNSwKKyAgICBzdXBwb3J0Rm9ybWF0XzYsCisgICAgc3VwcG9ydEZvcm1hdF83LAorICAgIHN1cHBvcnRGb3JtYXRfOAorfSBTRUNfT01YX1NVUFBPUlRGT1JNQVRfVFlQRTsKKworLyogZm9yIEFuZHJvaWQgUFYgT3BlbkNvcmUqLwordHlwZWRlZiBzdHJ1Y3QgX09NWENvbXBvbmVudENhcGFiaWxpdHlGbGFnc1R5cGUKK3sKKyAgICAvKiBPTVggQ09NUE9ORU5UIENBUEFCSUxJVFkgUkVMQVRFRCBNRU1CRVJTICovCisgICAgT01YX0JPT0wgaUlzT01YQ29tcG9uZW50TXVsdGlUaHJlYWRlZDsKKyAgICBPTVhfQk9PTCBpT01YQ29tcG9uZW50U3VwcG9ydHNFeHRlcm5hbE91dHB1dEJ1ZmZlckFsbG9jOworICAgIE9NWF9CT09MIGlPTVhDb21wb25lbnRTdXBwb3J0c0V4dGVybmFsSW5wdXRCdWZmZXJBbGxvYzsKKyAgICBPTVhfQk9PTCBpT01YQ29tcG9uZW50U3VwcG9ydHNNb3ZhYmxlSW5wdXRCdWZmZXJzOworICAgIE9NWF9CT09MIGlPTVhDb21wb25lbnRTdXBwb3J0c1BhcnRpYWxGcmFtZXM7CisgICAgT01YX0JPT0wgaU9NWENvbXBvbmVudFVzZXNOQUxTdGFydENvZGVzOworICAgIE9NWF9CT09MIGlPTVhDb21wb25lbnRDYW5IYW5kbGVJbmNvbXBsZXRlRnJhbWVzOworICAgIE9NWF9CT09MIGlPTVhDb21wb25lbnRVc2VzRnVsbEFWQ0ZyYW1lczsKK30gT01YQ29tcG9uZW50Q2FwYWJpbGl0eUZsYWdzVHlwZTsKKwordHlwZWRlZiBzdHJ1Y3QgX1NFQ19PTVhfVklERU9fUFJPRklMRUxFVkVMCit7CisgICAgT01YX1MzMiAgcHJvZmlsZTsKKyAgICBPTVhfUzMyICBsZXZlbDsKK30gU0VDX09NWF9WSURFT19QUk9GSUxFTEVWRUw7CisKKyNkZWZpbmUgT01YX1ZJREVPX0NvZGluZ1ZQWCAgICAgMHgwOSAgICAvKio8IEdvb2dsZSBWUFgsIGZvcm1lcmx5IGtub3duIGFzIE9uMiBWUDggKi8KKworI2lmbmRlZiBfX09NWF9FWFBPUlRTCisjZGVmaW5lIF9fT01YX0VYUE9SVFMKKyNkZWZpbmUgU0VDX0VYUE9SVF9SRUYgX19hdHRyaWJ1dGVfXygodmlzaWJpbGl0eSgiZGVmYXVsdCIpKSkKKyNkZWZpbmUgU0VDX0lNUE9SVF9SRUYgX19hdHRyaWJ1dGVfXygodmlzaWJpbGl0eSgiZGVmYXVsdCIpKSkKKyNlbmRpZgorCisjZW5kaWYKZGlmZiAtLWdpdCBhL2V4eW5vczQvbXVsdGltZWRpYS9vcGVubWF4L3NlY19vbXgvaW5jbHVkZS9zZWMvU0VDX09NWF9NYWNyb3MuaCBiL2V4eW5vczQvbXVsdGltZWRpYS9vcGVubWF4L3NlY19vbXgvaW5jbHVkZS9zZWMvU0VDX09NWF9NYWNyb3MuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44NTNkMGFjCi0tLSAvZGV2L251bGwKKysrIGIvZXh5bm9zNC9tdWx0aW1lZGlhL29wZW5tYXgvc2VjX29teC9pbmNsdWRlL3NlYy9TRUNfT01YX01hY3Jvcy5oCkBAIC0wLDAgKzEsNjYgQEAKKy8qCisgKgorICogQ29weXJpZ2h0IDIwMTAgU2Ftc3VuZyBFbGVjdHJvbmljcyBTLkxTSSBDby4gTFRECisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKy8qCisgKiBAZmlsZSAgICBTRUNfT01YX01hY3Jvcy5oCisgKiBAYnJpZWYgICBNYWNyb3MKKyAqIEBhdXRob3IgIFNldW5nQmVvbSBLaW0gKHNiY3J1eC5raW1Ac2Ftc3VuZy5jb20pCisgKiBAdmVyc2lvbiAgICAxLjEuMAorICogQGhpc3RvcnkKKyAqICAgMjAxMC43LjE1IDogQ3JlYXRlCisgKi8KKworI2lmbmRlZiBTRUNfT01YX01BQ1JPUworI2RlZmluZSBTRUNfT01YX01BQ1JPUworCisjaW5jbHVkZSAiU0VDX09NWF9EZWYuaCIKKyNpbmNsdWRlICJTRUNfT1NBTF9NZW1vcnkuaCIKKworCisvKgorICogTUFDUk9TCisgKi8KKyNkZWZpbmUgQUxJR04oeCwgYSkgICAgICAgKCgoeCkgKyAoYSkgLSAxKSAmIH4oKGEpIC0gMSkpCisjZGVmaW5lIEFMSUdOX1RPXzE2Qih4KSAgICgoKCh4KSArICgxIDw8ICA0KSAtIDEpID4+ICA0KSA8PCAgNCkKKyNkZWZpbmUgQUxJR05fVE9fMzJCKHgpICAgKCgoKHgpICsgKDEgPDwgIDUpIC0gMSkgPj4gIDUpIDw8ICA1KQorI2RlZmluZSBBTElHTl9UT18xMjhCKHgpICAoKCgoeCkgKyAoMSA8PCAgNykgLSAxKSA+PiAgNykgPDwgIDcpCisjZGVmaW5lIEFMSUdOX1RPXzhLQih4KSAgICgoKCh4KSArICgxIDw8IDEzKSAtIDEpID4+IDEzKSA8PCAxMykKKworI2RlZmluZSBJTklUX1NFVF9TSVpFX1ZFUlNJT04oX3N0cnVjdF8sIF9zdHJ1Y3RUeXBlXykgICAgICAgICAgICAgICBcCisgICAgZG8geyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgU0VDX09TQUxfTWVtc2V0KChfc3RydWN0XyksIDAsIHNpemVvZihfc3RydWN0VHlwZV8pKTsgICAgICAgXAorICAgICAgICAoX3N0cnVjdF8pLT5uU2l6ZSA9IHNpemVvZihfc3RydWN0VHlwZV8pOyAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIChfc3RydWN0XyktPm5WZXJzaW9uLnMublZlcnNpb25NYWpvciA9IFZFUlNJT05NQUpPUl9OVU1CRVI7IFwKKyAgICAgICAgKF9zdHJ1Y3RfKS0+blZlcnNpb24ucy5uVmVyc2lvbk1pbm9yID0gVkVSU0lPTk1JTk9SX05VTUJFUjsgXAorICAgICAgICAoX3N0cnVjdF8pLT5uVmVyc2lvbi5zLm5SZXZpc2lvbiA9IFJFVklTSU9OX05VTUJFUjsgICAgICAgICBcCisgICAgICAgIChfc3RydWN0XyktPm5WZXJzaW9uLnMublN0ZXAgPSBTVEVQX05VTUJFUjsgICAgICAgICAgICAgICAgIFwKKyAgICB9IHdoaWxlICgwKQorCisvKgorICogUG9ydCBTcGVjaWZpYworICovCisjZGVmaW5lIFNFQ19UVU5ORUxfRVNUQUJMSVNIRUQgMHgwMDAxCisjZGVmaW5lIFNFQ19UVU5ORUxfSVNfU1VQUExJRVIgMHgwMDAyCisKKyNkZWZpbmUgQ0hFQ0tfUE9SVF9CRUlOR19GTFVTSEVEKHBvcnQpICAgICAgICAgICAgICAgICAocG9ydC0+YklzUG9ydEZsdXNoZWQgPT0gT01YX1RSVUUpCisjZGVmaW5lIENIRUNLX1BPUlRfQkVJTkdfRElTQUJMRUQocG9ydCkgICAgICAgICAgICAgICAgKHBvcnQtPmJJc1BvcnREaXNhYmxlZCA9PSBPTVhfVFJVRSkKKyNkZWZpbmUgQ0hFQ0tfUE9SVF9FTkFCTEVEKHBvcnQpICAgICAgICAgICAgICAgICAgICAgICAocG9ydC0+cG9ydERlZmluaXRpb24uYkVuYWJsZWQgPT0gT01YX1RSVUUpCisjZGVmaW5lIENIRUNLX1BPUlRfUE9QVUxBVEVEKHBvcnQpICAgICAgICAgICAgICAgICAgICAgKHBvcnQtPnBvcnREZWZpbml0aW9uLmJQb3B1bGF0ZWQgPT0gT01YX1RSVUUpCisjZGVmaW5lIENIRUNLX1BPUlRfVFVOTkVMRUQocG9ydCkgICAgICAgICAgICAgICAgICAgICAgKHBvcnQtPnR1bm5lbEZsYWdzICYgU0VDX1RVTk5FTF9FU1RBQkxJU0hFRCkKKyNkZWZpbmUgQ0hFQ0tfUE9SVF9CVUZGRVJfU1VQUExJRVIocG9ydCkgICAgICAgICAgICAgICAocG9ydC0+dHVubmVsRmxhZ3MgJiBTRUNfVFVOTkVMX0lTX1NVUFBMSUVSKQorCisjZW5kaWYKZGlmZiAtLWdpdCBhL2V4eW5vczQvbXVsdGltZWRpYS9vcGVubWF4L3NlY19vbXgvb3NhbC9BbmRyb2lkLm1rIGIvZXh5bm9zNC9tdWx0aW1lZGlhL29wZW5tYXgvc2VjX29teC9vc2FsL0FuZHJvaWQubWsKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNWRjYmVlZQotLS0gL2Rldi9udWxsCisrKyBiL2V4eW5vczQvbXVsdGltZWRpYS9vcGVubWF4L3NlY19vbXgvb3NhbC9BbmRyb2lkLm1rCkBAIC0wLDAgKzEsNDUgQEAKK0xPQ0FMX1BBVEggOj0gJChjYWxsIG15LWRpcikKK2luY2x1ZGUgJChDTEVBUl9WQVJTKQorCitMT0NBTF9NT0RVTEVfVEFHUyA6PSBvcHRpb25hbAorCitMT0NBTF9TUkNfRklMRVMgOj0gXAorCVNFQ19PU0FMX0FuZHJvaWQuY3BwIFwKKwlTRUNfT1NBTF9FdmVudC5jIFwKKwlTRUNfT1NBTF9RdWV1ZS5jIFwKKwlTRUNfT1NBTF9FVEMuYyBcCisJU0VDX09TQUxfTXV0ZXguYyBcCisJU0VDX09TQUxfVGhyZWFkLmMgXAorCVNFQ19PU0FMX01lbW9yeS5jIFwKKwlTRUNfT1NBTF9TZW1hcGhvcmUuYyBcCisJU0VDX09TQUxfTGlicmFyeS5jIFwKKwlTRUNfT1NBTF9Mb2cuYworCitMT0NBTF9QUkVMSU5LX01PRFVMRSA6PSBmYWxzZQorTE9DQUxfTU9EVUxFIDo9IGxpYnNlY29zYWwKKworTE9DQUxfQ0ZMQUdTIDo9CisKK2lmZXEgKCQoQk9BUkRfVVNFX1MzRF9TVVBQT1JUKSwgdHJ1ZSkKK0xPQ0FMX0NGTEFHUyArPSAtRFMzRF9TVVBQT1JUCitlbmRpZgorCitMT0NBTF9TVEFUSUNfTElCUkFSSUVTIDo9CitMT0NBTF9TSEFSRURfTElCUkFSSUVTIDo9IGxpYmN1dGlscyBsaWJ1dGlscyBcCisJbGlidWkgXAorCWxpYmhhcmR3YXJlIFwKKwlsaWJhbmRyb2lkX3J1bnRpbWUgXAorCWxpYnN1cmZhY2VmbGluZ2VyX2NsaWVudCBcCisJbGliYmluZGVyIFwKKwlsaWJtZWRpYQorCitMT0NBTF9DX0lOQ0xVREVTIDo9IFwKKyAgICAkKFNFQ19PTVhfSU5DKS9raHJvbm9zIFwKKwkkKFNFQ19PTVhfSU5DKS9zZWMgXAorCSQoU0VDX09NWF9UT1ApL29zYWwgXAorCSQoU0VDX09NWF9DT01QT05FTlQpL2NvbW1vbiBcCisJJChTRUNfT01YX0NPTVBPTkVOVCkvdmlkZW8vZGVjIFwKKwkkKEJPQVJEX0hBTF9QQVRIKS9pbmNsdWRlIFwKKwkkKEJPQVJEX0hBTF9QQVRIKS9saWJ1bXAvaW5jbHVkZQorCitpbmNsdWRlICQoQlVJTERfU1RBVElDX0xJQlJBUlkpCmRpZmYgLS1naXQgYS9leHlub3M0L211bHRpbWVkaWEvb3Blbm1heC9zZWNfb214L29zYWwvU0VDX09TQUxfQW5kcm9pZC5jcHAgYi9leHlub3M0L211bHRpbWVkaWEvb3Blbm1heC9zZWNfb214L29zYWwvU0VDX09TQUxfQW5kcm9pZC5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMmE1MWRlOQotLS0gL2Rldi9udWxsCisrKyBiL2V4eW5vczQvbXVsdGltZWRpYS9vcGVubWF4L3NlY19vbXgvb3NhbC9TRUNfT1NBTF9BbmRyb2lkLmNwcApAQCAtMCwwICsxLDU4MSBAQAorLyoKKyAqIENvcHlyaWdodCAyMDExIFNhbXN1bmcgRWxlY3Ryb25pY3MgUy5MU0kgQ28uIExURAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisvKgorICogQGZpbGUgICAgICAgIFNFQ19PU0FMX0FuZHJvaWQuY3BwCisgKiBAYnJpZWYKKyAqIEBhdXRob3IgICAgICBTZXVuZ2Jlb20gS2ltIChzYmNydXgua2ltQHNhbXN1bmcuY29tKQorICogQGF1dGhvciAgICAgIEh5ZXllb24gQ2h1bmcgKGh5ZW9uLmNodW5nQHNhbXN1bmcuY29tKQorICogQGF1dGhvciAgICAgIFl1bmppIEtpbSAoeXVuamkua2ltQHNhbXN1bmcuY29tKQorICogQGF1dGhvciAgICAgIEppbnN1bmcgWWFuZyAoanNnb29kLnlhbmdAc2Ftc3VuZy5jb20pCisgKiBAdmVyc2lvbiAgICAgMS4xLjAKKyAqIEBoaXN0b3J5CisgKiAgIDIwMTEuNy4xNSA6IENyZWF0ZQorICovCisKKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgPHN0ZGxpYi5oPgorCisjaW5jbHVkZSA8dWkvYW5kcm9pZF9uYXRpdmVfYnVmZmVyLmg+CisjaW5jbHVkZSA8dWkvR3JhcGhpY0J1ZmZlci5oPgorI2luY2x1ZGUgPHVpL0dyYXBoaWNCdWZmZXJNYXBwZXIuaD4KKyNpbmNsdWRlIDx1aS9SZWN0Lmg+CisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvSGFyZHdhcmVBUEkuaD4KKyNpbmNsdWRlIDxoYXJkd2FyZS9oYXJkd2FyZS5oPgorI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L01ldGFkYXRhQnVmZmVyVHlwZS5oPgorCisjaW5jbHVkZSAiZ3JhbGxvY19wcml2LmgiCisKKyNpbmNsdWRlICJTRUNfT1NBTF9TZW1hcGhvcmUuaCIKKyNpbmNsdWRlICJTRUNfT01YX0Jhc2Vwb3J0LmgiCisjaW5jbHVkZSAiU0VDX09NWF9CYXNlY29tcG9uZW50LmgiCisjaW5jbHVkZSAiU0VDX09NWF9NYWNyb3MuaCIKKyNpbmNsdWRlICJTRUNfT01YX1ZkZWMuaCIKKworI3VuZGVmICBTRUNfTE9HX1RBRworI2RlZmluZSBTRUNfTE9HX1RBRyAgICAiU0VDX09TQUxfQW5kcm9pZCIKKyNkZWZpbmUgU0VDX0xPR19PRkYKKyNpbmNsdWRlICJTRUNfT1NBTF9Mb2cuaCIKKwordXNpbmcgbmFtZXNwYWNlIGFuZHJvaWQ7CisKKyNpZmRlZiBfX2NwbHVzcGx1cworZXh0ZXJuICJDIiB7CisjZW5kaWYKKworT01YX0VSUk9SVFlQRSB1c2VBbmRyb2lkTmF0aXZlQnVmZmVyKAorICAgIFNFQ19PTVhfQkFTRVBPUlQgICAgICAqcFNFQ1BvcnQsCisgICAgT01YX0JVRkZFUkhFQURFUlRZUEUgKipwcEJ1ZmZlckhkciwKKyAgICBPTVhfVTMyICAgICAgICAgICAgICAgIG5Qb3J0SW5kZXgsCisgICAgT01YX1BUUiAgICAgICAgICAgICAgICBwQXBwUHJpdmF0ZSwKKyAgICBPTVhfVTMyICAgICAgICAgICAgICAgIG5TaXplQnl0ZXMsCisgICAgT01YX1U4ICAgICAgICAgICAgICAgICpwQnVmZmVyKQoreworICAgIE9NWF9FUlJPUlRZUEUgICAgICAgICByZXQgPSBPTVhfRXJyb3JOb25lOworICAgIE9NWF9CVUZGRVJIRUFERVJUWVBFICp0ZW1wX2J1ZmZlckhlYWRlciA9IE5VTEw7CisgICAgdW5zaWduZWQgaW50ICAgICAgICAgIGkgPSAwOworCisgICAgRnVuY3Rpb25JbigpOworCisgICAgaWYgKHBTRUNQb3J0ID09IE5VTEwpIHsKKyAgICAgICAgcmV0ID0gT01YX0Vycm9yQmFkUGFyYW1ldGVyOworICAgICAgICBnb3RvIEVYSVQ7CisgICAgfQorICAgIGlmIChwU0VDUG9ydC0+cG9ydFN0YXRlICE9IE9NWF9TdGF0ZUlkbGUpIHsKKyAgICAgICAgcmV0ID0gT01YX0Vycm9ySW5jb3JyZWN0U3RhdGVPcGVyYXRpb247CisgICAgICAgIGdvdG8gRVhJVDsKKyAgICB9CisgICAgaWYgKENIRUNLX1BPUlRfVFVOTkVMRUQocFNFQ1BvcnQpICYmIENIRUNLX1BPUlRfQlVGRkVSX1NVUFBMSUVSKHBTRUNQb3J0KSkgeworICAgICAgICByZXQgPSBPTVhfRXJyb3JCYWRQb3J0SW5kZXg7CisgICAgICAgIGdvdG8gRVhJVDsKKyAgICB9CisKKyAgICB0ZW1wX2J1ZmZlckhlYWRlciA9IChPTVhfQlVGRkVSSEVBREVSVFlQRSAqKVNFQ19PU0FMX01hbGxvYyhzaXplb2YoT01YX0JVRkZFUkhFQURFUlRZUEUpKTsKKyAgICBpZiAodGVtcF9idWZmZXJIZWFkZXIgPT0gTlVMTCkgeworICAgICAgICByZXQgPSBPTVhfRXJyb3JJbnN1ZmZpY2llbnRSZXNvdXJjZXM7CisgICAgICAgIGdvdG8gRVhJVDsKKyAgICB9CisgICAgU0VDX09TQUxfTWVtc2V0KHRlbXBfYnVmZmVySGVhZGVyLCAwLCBzaXplb2YoT01YX0JVRkZFUkhFQURFUlRZUEUpKTsKKworICAgIGZvciAoaSA9IDA7IGkgPCBwU0VDUG9ydC0+cG9ydERlZmluaXRpb24ubkJ1ZmZlckNvdW50QWN0dWFsOyBpKyspIHsKKyAgICAgICAgaWYgKHBTRUNQb3J0LT5idWZmZXJTdGF0ZUFsbG9jYXRlW2ldID09IEJVRkZFUl9TVEFURV9GUkVFKSB7CisgICAgICAgICAgICBwU0VDUG9ydC0+YnVmZmVySGVhZGVyW2ldID0gdGVtcF9idWZmZXJIZWFkZXI7CisgICAgICAgICAgICBwU0VDUG9ydC0+YnVmZmVyU3RhdGVBbGxvY2F0ZVtpXSA9IChCVUZGRVJfU1RBVEVfQVNTSUdORUQgfCBIRUFERVJfU1RBVEVfQUxMT0NBVEVEKTsKKyAgICAgICAgICAgIElOSVRfU0VUX1NJWkVfVkVSU0lPTih0ZW1wX2J1ZmZlckhlYWRlciwgT01YX0JVRkZFUkhFQURFUlRZUEUpOworICAgICAgICAgICAgdGVtcF9idWZmZXJIZWFkZXItPnBCdWZmZXIgICAgICAgID0gcEJ1ZmZlcjsKKyAgICAgICAgICAgIHRlbXBfYnVmZmVySGVhZGVyLT5uQWxsb2NMZW4gICAgICA9IG5TaXplQnl0ZXM7CisgICAgICAgICAgICB0ZW1wX2J1ZmZlckhlYWRlci0+cEFwcFByaXZhdGUgICAgPSBwQXBwUHJpdmF0ZTsKKyAgICAgICAgICAgIGlmIChuUG9ydEluZGV4ID09IElOUFVUX1BPUlRfSU5ERVgpCisgICAgICAgICAgICAgICAgdGVtcF9idWZmZXJIZWFkZXItPm5JbnB1dFBvcnRJbmRleCA9IElOUFVUX1BPUlRfSU5ERVg7CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgdGVtcF9idWZmZXJIZWFkZXItPm5PdXRwdXRQb3J0SW5kZXggPSBPVVRQVVRfUE9SVF9JTkRFWDsKKworICAgICAgICAgICAgcFNFQ1BvcnQtPmFzc2lnbmVkQnVmZmVyTnVtKys7CisgICAgICAgICAgICBpZiAocFNFQ1BvcnQtPmFzc2lnbmVkQnVmZmVyTnVtID09IHBTRUNQb3J0LT5wb3J0RGVmaW5pdGlvbi5uQnVmZmVyQ291bnRBY3R1YWwpIHsKKyAgICAgICAgICAgICAgICBwU0VDUG9ydC0+cG9ydERlZmluaXRpb24uYlBvcHVsYXRlZCA9IE9NWF9UUlVFOworICAgICAgICAgICAgICAgIC8qIFNFQ19PU0FMX011dGV4TG9jayhwU0VDQ29tcG9uZW50LT5jb21wTXV0ZXgpOyAqLworICAgICAgICAgICAgICAgIFNFQ19PU0FMX1NlbWFwaG9yZVBvc3QocFNFQ1BvcnQtPmxvYWRlZFJlc291cmNlKTsKKyAgICAgICAgICAgICAgICAvKiBTRUNfT1NBTF9NdXRleFVubG9jayhwU0VDQ29tcG9uZW50LT5jb21wTXV0ZXgpOyAqLworICAgICAgICAgICAgfQorICAgICAgICAgICAgKnBwQnVmZmVySGRyID0gdGVtcF9idWZmZXJIZWFkZXI7CisgICAgICAgICAgICBnb3RvIEVYSVQ7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBTRUNfT1NBTF9GcmVlKHRlbXBfYnVmZmVySGVhZGVyKTsKKyAgICByZXQgPSBPTVhfRXJyb3JJbnN1ZmZpY2llbnRSZXNvdXJjZXM7CisKK0VYSVQ6CisgICAgRnVuY3Rpb25PdXQoKTsKKworICAgIHJldHVybiByZXQ7Cit9CisKK09NWF9FUlJPUlRZUEUgU0VDX09TQUxfTG9ja0FOQkhhbmRsZSgKKyAgICBPTVhfSU4gT01YX1UzMiBoYW5kbGUsCisgICAgT01YX0lOIE9NWF9VMzIgd2lkdGgsCisgICAgT01YX0lOIE9NWF9VMzIgaGVpZ2h0LAorICAgIE9NWF9JTiBPTVhfQ09MT1JfRk9STUFUVFlQRSBmb3JtYXQsCisgICAgT01YX09VVCBPTVhfUFRSICp2YWRkcikKK3sKKyAgICBGdW5jdGlvbkluKCk7CisKKyAgICBPTVhfRVJST1JUWVBFIHJldCA9IE9NWF9FcnJvck5vbmU7CisgICAgR3JhcGhpY0J1ZmZlck1hcHBlciAmbWFwcGVyID0gR3JhcGhpY0J1ZmZlck1hcHBlcjo6Z2V0KCk7CisgICAgYnVmZmVyX2hhbmRsZV90IGJ1ZmZlckhhbmRsZSA9IChidWZmZXJfaGFuZGxlX3QpIGhhbmRsZTsKKyAgICBSZWN0IGJvdW5kcyh3aWR0aCwgaGVpZ2h0KTsKKworICAgIFNFQ19PU0FMX0xvZyhTRUNfTE9HX1RSQUNFLCAiJXM6IGhhbmRsZTogMHgleCIsIF9fZnVuY19fLCBoYW5kbGUpOworCisgICAgaW50IHVzYWdlID0gMDsKKworICAgIHN3aXRjaCAoZm9ybWF0KSB7CisgICAgY2FzZSBPTVhfQ09MT1JfRm9ybWF0WVVWNDIwUGxhbmFyOgorICAgIGNhc2UgT01YX0NPTE9SX0Zvcm1hdFlVVjQyMFNlbWlQbGFuYXI6CisjaWZkZWYgUzNEX1NVUFBPUlQKKyAgICBjYXNlIE9NWF9TRUNfQ09MT1JfRm9ybWF0TlYxMlRpbGVkX1NCU19MUjoKKyAgICBjYXNlIE9NWF9TRUNfQ09MT1JfRm9ybWF0TlYxMlRpbGVkX1NCU19STDoKKyAgICBjYXNlIE9NWF9TRUNfQ09MT1JfRm9ybWF0TlYxMlRpbGVkX1RCX0xSOgorICAgIGNhc2UgT01YX1NFQ19DT0xPUl9Gb3JtYXROVjEyVGlsZWRfVEJfUkw6CisgICAgY2FzZSBPTVhfU0VDX0NPTE9SX0Zvcm1hdFlVVjQyMFNlbWlQbGFuYXJfU0JTX0xSOgorICAgIGNhc2UgT01YX1NFQ19DT0xPUl9Gb3JtYXRZVVY0MjBTZW1pUGxhbmFyX1NCU19STDoKKyAgICBjYXNlIE9NWF9TRUNfQ09MT1JfRm9ybWF0WVVWNDIwU2VtaVBsYW5hcl9UQl9MUjoKKyAgICBjYXNlIE9NWF9TRUNfQ09MT1JfRm9ybWF0WVVWNDIwU2VtaVBsYW5hcl9UQl9STDoKKyAgICBjYXNlIE9NWF9TRUNfQ09MT1JfRm9ybWF0WVVWNDIwUGxhbmFyX1NCU19MUjoKKyAgICBjYXNlIE9NWF9TRUNfQ09MT1JfRm9ybWF0WVVWNDIwUGxhbmFyX1NCU19STDoKKyAgICBjYXNlIE9NWF9TRUNfQ09MT1JfRm9ybWF0WVVWNDIwUGxhbmFyX1RCX0xSOgorICAgIGNhc2UgT01YX1NFQ19DT0xPUl9Gb3JtYXRZVVY0MjBQbGFuYXJfVEJfUkw6CisjZW5kaWYKKyAgICBjYXNlIE9NWF9TRUNfQ09MT1JfRm9ybWF0QU5CWVVWNDIwU2VtaVBsYW5hcjoKKyAgICAgICAgdXNhZ2UgPSBHUkFMTE9DX1VTQUdFX1NXX1JFQURfT0ZURU4gfCBHUkFMTE9DX1VTQUdFX1NXX1dSSVRFX09GVEVOIHwgR1JBTExPQ19VU0FHRV9ZVVZfQUREUjsKKyAgICAgICAgYnJlYWs7CisgICAgZGVmYXVsdDoKKyAgICAgICAgdXNhZ2UgPSBHUkFMTE9DX1VTQUdFX1NXX1JFQURfT0ZURU4gfCBHUkFMTE9DX1VTQUdFX1NXX1dSSVRFX09GVEVOOworICAgICAgICBicmVhazsKKyAgICB9CisKKyAgICBpZiAobWFwcGVyLmxvY2soYnVmZmVySGFuZGxlLCB1c2FnZSwgYm91bmRzLCB2YWRkcikgIT0gMCkgeworICAgICAgICBTRUNfT1NBTF9Mb2coU0VDX0xPR19FUlJPUiwgIiVzOiBtYXBwZXIubG9jaygpIGZhaWwiLCBfX2Z1bmNfXyk7CisgICAgICAgIHJldCA9IE9NWF9FcnJvclVuZGVmaW5lZDsKKyAgICAgICAgZ290byBFWElUOworICAgIH0KKworICAgIFNFQ19PU0FMX0xvZyhTRUNfTE9HX1RSQUNFLCAiJXM6IGJ1ZmZlciBsb2NrZWQ6IDB4JXgiLCBfX2Z1bmNfXywgKnZhZGRyKTsKKworRVhJVDoKKyAgICBGdW5jdGlvbk91dCgpOworCisgICAgcmV0dXJuIHJldDsKK30KKworT01YX0VSUk9SVFlQRSBTRUNfT1NBTF9VbmxvY2tBTkJIYW5kbGUoT01YX0lOIE9NWF9VMzIgaGFuZGxlKQoreworICAgIEZ1bmN0aW9uSW4oKTsKKworICAgIE9NWF9FUlJPUlRZUEUgcmV0ID0gT01YX0Vycm9yTm9uZTsKKyAgICBHcmFwaGljQnVmZmVyTWFwcGVyICZtYXBwZXIgPSBHcmFwaGljQnVmZmVyTWFwcGVyOjpnZXQoKTsKKyAgICBidWZmZXJfaGFuZGxlX3QgYnVmZmVySGFuZGxlID0gKGJ1ZmZlcl9oYW5kbGVfdCkgaGFuZGxlOworCisgICAgU0VDX09TQUxfTG9nKFNFQ19MT0dfVFJBQ0UsICIlczogaGFuZGxlOiAweCV4IiwgX19mdW5jX18sIGhhbmRsZSk7CisKKyAgICBpZiAobWFwcGVyLnVubG9jayhidWZmZXJIYW5kbGUpICE9IDApIHsKKyAgICAgICAgU0VDX09TQUxfTG9nKFNFQ19MT0dfRVJST1IsICIlczogbWFwcGVyLnVubG9jaygpIGZhaWwiLCBfX2Z1bmNfXyk7CisgICAgICAgIHJldCA9IE9NWF9FcnJvclVuZGVmaW5lZDsKKyAgICAgICAgZ290byBFWElUOworICAgIH0KKworICAgIFNFQ19PU0FMX0xvZyhTRUNfTE9HX1RSQUNFLCAiJXM6IGJ1ZmZlciB1bmxvY2tlZDogMHgleCIsIF9fZnVuY19fLCBoYW5kbGUpOworCitFWElUOgorICAgIEZ1bmN0aW9uT3V0KCk7CisKKyAgICByZXR1cm4gcmV0OworfQorCitPTVhfRVJST1JUWVBFIFNFQ19PU0FMX0dldFBoeXNBTkJIYW5kbGUoCisgICAgT01YX0lOIE9NWF9VMzIgaGFuZGxlLAorICAgIE9NWF9PVVQgT01YX1BUUiAqcGFkZHIpCit7CisgICAgRnVuY3Rpb25JbigpOworCisgICAgT01YX0VSUk9SVFlQRSByZXQgPSBPTVhfRXJyb3JOb25lOworICAgIEdyYXBoaWNCdWZmZXJNYXBwZXIgJm1hcHBlciA9IEdyYXBoaWNCdWZmZXJNYXBwZXI6OmdldCgpOworICAgIGJ1ZmZlcl9oYW5kbGVfdCBidWZmZXJIYW5kbGUgPSAoYnVmZmVyX2hhbmRsZV90KSBoYW5kbGU7CisKKyAgICBTRUNfT1NBTF9Mb2coU0VDX0xPR19UUkFDRSwgIiVzOiBoYW5kbGU6IDB4JXgiLCBfX2Z1bmNfXywgaGFuZGxlKTsKKworICAgIGlmIChtYXBwZXIuZ2V0cGh5cyhidWZmZXJIYW5kbGUsIHBhZGRyKSAhPSAwKSB7CisgICAgICAgIFNFQ19PU0FMX0xvZyhTRUNfTE9HX0VSUk9SLCAiJXM6IG1hcHBlci5nZXRwaHlzKCkgZmFpbCIsIF9fZnVuY19fKTsKKyAgICAgICAgcmV0ID0gT01YX0Vycm9yVW5kZWZpbmVkOworICAgICAgICBnb3RvIEVYSVQ7CisgICAgfQorCitFWElUOgorICAgIEZ1bmN0aW9uT3V0KCk7CisKKyAgICByZXR1cm4gcmV0OworfQorCitPTVhfRVJST1JUWVBFIFNFQ19PU0FMX0xvY2tBTkIoCisgICAgT01YX0lOIE9NWF9QVFIgcEJ1ZmZlciwKKyAgICBPTVhfSU4gT01YX1UzMiB3aWR0aCwKKyAgICBPTVhfSU4gT01YX1UzMiBoZWlnaHQsCisgICAgT01YX0lOIE9NWF9DT0xPUl9GT1JNQVRUWVBFIGZvcm1hdCwKKyAgICBPTVhfT1VUIE9NWF9VMzIgKnBTdHJpZGUsCisgICAgT01YX09VVCBPTVhfUFRSICp2YWRkcikKK3sKKyAgICBGdW5jdGlvbkluKCk7CisKKyAgICBPTVhfRVJST1JUWVBFIHJldCA9IE9NWF9FcnJvck5vbmU7CisgICAgYW5kcm9pZF9uYXRpdmVfYnVmZmVyX3QgKnBBTkIgPSAoYW5kcm9pZF9uYXRpdmVfYnVmZmVyX3QgKikgcEJ1ZmZlcjsKKworICAgIHJldCA9IFNFQ19PU0FMX0xvY2tBTkJIYW5kbGUoKE9NWF9VMzIpcEFOQi0+aGFuZGxlLCB3aWR0aCwgaGVpZ2h0LCBmb3JtYXQsIHZhZGRyKTsKKyAgICAqcFN0cmlkZSA9IHBBTkItPnN0cmlkZTsKKworRVhJVDoKKyAgICBGdW5jdGlvbk91dCgpOworCisgICAgcmV0dXJuIHJldDsKK30KKworT01YX0VSUk9SVFlQRSBTRUNfT1NBTF9VbmxvY2tBTkIoT01YX0lOIE9NWF9QVFIgcEJ1ZmZlcikKK3sKKyAgICBGdW5jdGlvbkluKCk7CisKKyAgICBPTVhfRVJST1JUWVBFIHJldCA9IE9NWF9FcnJvck5vbmU7CisgICAgYW5kcm9pZF9uYXRpdmVfYnVmZmVyX3QgKnBBTkIgPSAoYW5kcm9pZF9uYXRpdmVfYnVmZmVyX3QgKikgcEJ1ZmZlcjsKKworICAgIHJldCA9IFNFQ19PU0FMX1VubG9ja0FOQkhhbmRsZSgoT01YX1UzMilwQU5CLT5oYW5kbGUpOworCitFWElUOgorICAgIEZ1bmN0aW9uT3V0KCk7CisKKyAgICByZXR1cm4gcmV0OworfQorCitPTVhfRVJST1JUWVBFIFNFQ19PU0FMX0dldFBoeXNBTkIoCisgICAgT01YX0lOIE9NWF9QVFIgcEJ1ZmZlciwKKyAgICBPTVhfT1VUIE9NWF9QVFIgKnBhZGRyKQoreworICAgIEZ1bmN0aW9uSW4oKTsKKworICAgIE9NWF9FUlJPUlRZUEUgcmV0ID0gT01YX0Vycm9yTm9uZTsKKyAgICBhbmRyb2lkX25hdGl2ZV9idWZmZXJfdCAqcEFOQiA9IChhbmRyb2lkX25hdGl2ZV9idWZmZXJfdCAqKSBwQnVmZmVyOworCisgICAgcmV0ID0gU0VDX09TQUxfR2V0UGh5c0FOQkhhbmRsZSgoT01YX1UzMilwQU5CLT5oYW5kbGUsIHBhZGRyKTsKKworRVhJVDoKKyAgICBGdW5jdGlvbk91dCgpOworCisgICAgcmV0dXJuIHJldDsKK30KKworT01YX0VSUk9SVFlQRSBTRUNfT1NBTF9HZXRBTkJQYXJhbWV0ZXIoCisgICAgT01YX0lOIE9NWF9IQU5ETEVUWVBFIGhDb21wb25lbnQsCisgICAgT01YX0lOIE9NWF9JTkRFWFRZUEUgIG5JbmRleCwKKyAgICBPTVhfSU5PVVQgT01YX1BUUiAgICAgQ29tcG9uZW50UGFyYW1ldGVyU3RydWN0dXJlKQoreworICAgIE9NWF9FUlJPUlRZUEUgICAgICAgICAgcmV0ID0gT01YX0Vycm9yTm9uZTsKKyAgICBPTVhfQ09NUE9ORU5UVFlQRSAgICAgKnBPTVhDb21wb25lbnQgPSBOVUxMOworICAgIFNFQ19PTVhfQkFTRUNPTVBPTkVOVCAqcFNFQ0NvbXBvbmVudCA9IE5VTEw7CisKKyAgICBGdW5jdGlvbkluKCk7CisKKyAgICBpZiAoaENvbXBvbmVudCA9PSBOVUxMKSB7CisgICAgICAgIHJldCA9IE9NWF9FcnJvckJhZFBhcmFtZXRlcjsKKyAgICAgICAgZ290byBFWElUOworICAgIH0KKworICAgIHBPTVhDb21wb25lbnQgPSAoT01YX0NPTVBPTkVOVFRZUEUgKiloQ29tcG9uZW50OworICAgIHJldCA9IFNFQ19PTVhfQ2hlY2tfU2l6ZVZlcnNpb24ocE9NWENvbXBvbmVudCwgc2l6ZW9mKE9NWF9DT01QT05FTlRUWVBFKSk7CisgICAgaWYgKHJldCAhPSBPTVhfRXJyb3JOb25lKSB7CisgICAgICAgIGdvdG8gRVhJVDsKKyAgICB9CisKKyAgICBpZiAocE9NWENvbXBvbmVudC0+cENvbXBvbmVudFByaXZhdGUgPT0gTlVMTCkgeworICAgICAgICByZXQgPSBPTVhfRXJyb3JCYWRQYXJhbWV0ZXI7CisgICAgICAgIGdvdG8gRVhJVDsKKyAgICB9CisKKyAgICBwU0VDQ29tcG9uZW50ID0gKFNFQ19PTVhfQkFTRUNPTVBPTkVOVCAqKXBPTVhDb21wb25lbnQtPnBDb21wb25lbnRQcml2YXRlOworICAgIGlmIChwU0VDQ29tcG9uZW50LT5jdXJyZW50U3RhdGUgPT0gT01YX1N0YXRlSW52YWxpZCApIHsKKyAgICAgICAgcmV0ID0gT01YX0Vycm9ySW52YWxpZFN0YXRlOworICAgICAgICBnb3RvIEVYSVQ7CisgICAgfQorCisgICAgaWYgKENvbXBvbmVudFBhcmFtZXRlclN0cnVjdHVyZSA9PSBOVUxMKSB7CisgICAgICAgIHJldCA9IE9NWF9FcnJvckJhZFBhcmFtZXRlcjsKKyAgICAgICAgZ290byBFWElUOworICAgIH0KKworICAgIHN3aXRjaCAobkluZGV4KSB7CisgICAgY2FzZSBPTVhfSW5kZXhQYXJhbUdldEFuZHJvaWROYXRpdmVCdWZmZXI6CisgICAgeworICAgICAgICBHZXRBbmRyb2lkTmF0aXZlQnVmZmVyVXNhZ2VQYXJhbXMgKnBBTkJQYXJhbXMgPSAoR2V0QW5kcm9pZE5hdGl2ZUJ1ZmZlclVzYWdlUGFyYW1zICopIENvbXBvbmVudFBhcmFtZXRlclN0cnVjdHVyZTsKKyAgICAgICAgT01YX1UzMiBwb3J0SW5kZXggPSBwQU5CUGFyYW1zLT5uUG9ydEluZGV4OworCisgICAgICAgIFNFQ19PU0FMX0xvZyhTRUNfTE9HX1RSQUNFLCAiJXM6IE9NWF9JbmRleFBhcmFtR2V0QW5kcm9pZE5hdGl2ZUJ1ZmZlciIsIF9fZnVuY19fKTsKKworICAgICAgICByZXQgPSBTRUNfT01YX0NoZWNrX1NpemVWZXJzaW9uKHBBTkJQYXJhbXMsIHNpemVvZihHZXRBbmRyb2lkTmF0aXZlQnVmZmVyVXNhZ2VQYXJhbXMpKTsKKyAgICAgICAgaWYgKHJldCAhPSBPTVhfRXJyb3JOb25lKSB7CisgICAgICAgICAgICBTRUNfT1NBTF9Mb2coU0VDX0xPR19FUlJPUiwgIiVzOiBTRUNfT01YX0NoZWNrX1NpemVWZXJzaW9uKEdldEFuZHJvaWROYXRpdmVCdWZmZXJVc2FnZVBhcmFtcykgaXMgZmFpbGVkIiwgX19mdW5jX18pOworICAgICAgICAgICAgZ290byBFWElUOworICAgICAgICB9CisKKyAgICAgICAgaWYgKHBvcnRJbmRleCA+PSBwU0VDQ29tcG9uZW50LT5wb3J0UGFyYW0ublBvcnRzKSB7CisgICAgICAgICAgICByZXQgPSBPTVhfRXJyb3JCYWRQb3J0SW5kZXg7CisgICAgICAgICAgICBnb3RvIEVYSVQ7CisgICAgICAgIH0KKworICAgICAgICAvKiBOT1RFOiBPTVhfSW5kZXhQYXJhbUdldEFuZHJvaWROYXRpdmVCdWZmZXIgcmV0dXJucyBvcmlnaW5hbCAnblVzYWdlJyB3aXRob3V0IGFueQorICAgICAgICAgKiBtb2RpZmljYXRpb25zIHNpbmNlIGN1cnJlbnRseSBub3QgZGVmaW5lZCB3aGF0IHRoZSAnblVzYWdlJyBpcyBmb3IuCisgICAgICAgICAqLworICAgICAgICBwQU5CUGFyYW1zLT5uVXNhZ2UgfD0gMDsKKyAgICB9CisgICAgICAgIGJyZWFrOworCisgICAgZGVmYXVsdDoKKyAgICB7CisgICAgICAgIFNFQ19PU0FMX0xvZyhTRUNfTE9HX0VSUk9SLCAiJXM6IFVuc3VwcG9ydGVkIGluZGV4ICglZCkiLCBfX2Z1bmNfXywgbkluZGV4KTsKKyAgICAgICAgcmV0ID0gT01YX0Vycm9yVW5zdXBwb3J0ZWRJbmRleDsKKyAgICAgICAgZ290byBFWElUOworICAgIH0KKyAgICAgICAgYnJlYWs7CisgICAgfQorCitFWElUOgorICAgIEZ1bmN0aW9uT3V0KCk7CisKKyAgICByZXR1cm4gcmV0OworfQorCitPTVhfRVJST1JUWVBFIFNFQ19PU0FMX1NldEFOQlBhcmFtZXRlcigKKyAgICBPTVhfSU4gT01YX0hBTkRMRVRZUEUgaENvbXBvbmVudCwKKyAgICBPTVhfSU4gT01YX0lOREVYVFlQRSAgbkluZGV4LAorICAgIE9NWF9JTiBPTVhfUFRSICAgICAgICBDb21wb25lbnRQYXJhbWV0ZXJTdHJ1Y3R1cmUpCit7CisgICAgT01YX0VSUk9SVFlQRSAgICAgICAgICByZXQgPSBPTVhfRXJyb3JOb25lOworICAgIE9NWF9DT01QT05FTlRUWVBFICAgICAqcE9NWENvbXBvbmVudCA9IE5VTEw7CisgICAgU0VDX09NWF9CQVNFQ09NUE9ORU5UICpwU0VDQ29tcG9uZW50ID0gTlVMTDsKKyAgICBTRUNfT01YX1ZJREVPREVDX0NPTVBPTkVOVCAqcFZpZGVvRGVjID0gTlVMTDsKKworICAgIEZ1bmN0aW9uSW4oKTsKKworICAgIGlmIChoQ29tcG9uZW50ID09IE5VTEwpIHsKKyAgICAgICAgcmV0ID0gT01YX0Vycm9yQmFkUGFyYW1ldGVyOworICAgICAgICBnb3RvIEVYSVQ7CisgICAgfQorCisgICAgcE9NWENvbXBvbmVudCA9IChPTVhfQ09NUE9ORU5UVFlQRSAqKWhDb21wb25lbnQ7CisgICAgcmV0ID0gU0VDX09NWF9DaGVja19TaXplVmVyc2lvbihwT01YQ29tcG9uZW50LCBzaXplb2YoT01YX0NPTVBPTkVOVFRZUEUpKTsKKyAgICBpZiAocmV0ICE9IE9NWF9FcnJvck5vbmUpIHsKKyAgICAgICAgZ290byBFWElUOworICAgIH0KKworICAgIGlmIChwT01YQ29tcG9uZW50LT5wQ29tcG9uZW50UHJpdmF0ZSA9PSBOVUxMKSB7CisgICAgICAgIHJldCA9IE9NWF9FcnJvckJhZFBhcmFtZXRlcjsKKyAgICAgICAgZ290byBFWElUOworICAgIH0KKworICAgIHBTRUNDb21wb25lbnQgPSAoU0VDX09NWF9CQVNFQ09NUE9ORU5UICopcE9NWENvbXBvbmVudC0+cENvbXBvbmVudFByaXZhdGU7CisgICAgaWYgKHBTRUNDb21wb25lbnQtPmN1cnJlbnRTdGF0ZSA9PSBPTVhfU3RhdGVJbnZhbGlkICkgeworICAgICAgICByZXQgPSBPTVhfRXJyb3JJbnZhbGlkU3RhdGU7CisgICAgICAgIGdvdG8gRVhJVDsKKyAgICB9CisKKyAgICBpZiAoQ29tcG9uZW50UGFyYW1ldGVyU3RydWN0dXJlID09IE5VTEwpIHsKKyAgICAgICAgcmV0ID0gT01YX0Vycm9yQmFkUGFyYW1ldGVyOworICAgICAgICBnb3RvIEVYSVQ7CisgICAgfQorCisgICAgcFZpZGVvRGVjID0gKFNFQ19PTVhfVklERU9ERUNfQ09NUE9ORU5UICopcFNFQ0NvbXBvbmVudC0+aENvbXBvbmVudEhhbmRsZTsKKworICAgIHN3aXRjaCAobkluZGV4KSB7CisgICAgY2FzZSBPTVhfSW5kZXhQYXJhbUVuYWJsZUFuZHJvaWRCdWZmZXJzOgorICAgIHsKKyAgICAgICAgRW5hYmxlQW5kcm9pZE5hdGl2ZUJ1ZmZlcnNQYXJhbXMgKnBBTkJQYXJhbXMgPSAoRW5hYmxlQW5kcm9pZE5hdGl2ZUJ1ZmZlcnNQYXJhbXMgKikgQ29tcG9uZW50UGFyYW1ldGVyU3RydWN0dXJlOworICAgICAgICBPTVhfVTMyIHBvcnRJbmRleCA9IHBBTkJQYXJhbXMtPm5Qb3J0SW5kZXg7CisgICAgICAgIFNFQ19PTVhfQkFTRVBPUlQgKnBTRUNQb3J0ID0gTlVMTDsKKworICAgICAgICBTRUNfT1NBTF9Mb2coU0VDX0xPR19UUkFDRSwgIiVzOiBPTVhfSW5kZXhQYXJhbUVuYWJsZUFuZHJvaWROYXRpdmVCdWZmZXJzIiwgX19mdW5jX18pOworCisgICAgICAgIHJldCA9IFNFQ19PTVhfQ2hlY2tfU2l6ZVZlcnNpb24ocEFOQlBhcmFtcywgc2l6ZW9mKEVuYWJsZUFuZHJvaWROYXRpdmVCdWZmZXJzUGFyYW1zKSk7CisgICAgICAgIGlmIChyZXQgIT0gT01YX0Vycm9yTm9uZSkgeworICAgICAgICAgICAgU0VDX09TQUxfTG9nKFNFQ19MT0dfRVJST1IsICIlczogU0VDX09NWF9DaGVja19TaXplVmVyc2lvbihFbmFibGVBbmRyb2lkTmF0aXZlQnVmZmVyc1BhcmFtcykgaXMgZmFpbGVkIiwgX19mdW5jX18pOworICAgICAgICAgICAgZ290byBFWElUOworICAgICAgICB9CisKKyAgICAgICAgaWYgKHBvcnRJbmRleCA+PSBwU0VDQ29tcG9uZW50LT5wb3J0UGFyYW0ublBvcnRzKSB7CisgICAgICAgICAgICByZXQgPSBPTVhfRXJyb3JCYWRQb3J0SW5kZXg7CisgICAgICAgICAgICBnb3RvIEVYSVQ7CisgICAgICAgIH0KKworICAgICAgICBwU0VDUG9ydCA9ICZwU0VDQ29tcG9uZW50LT5wU0VDUG9ydFtwb3J0SW5kZXhdOworICAgICAgICBpZiAoQ0hFQ0tfUE9SVF9UVU5ORUxFRChwU0VDUG9ydCkgJiYgQ0hFQ0tfUE9SVF9CVUZGRVJfU1VQUExJRVIocFNFQ1BvcnQpKSB7CisgICAgICAgICAgICByZXQgPSBPTVhfRXJyb3JCYWRQb3J0SW5kZXg7CisgICAgICAgICAgICBnb3RvIEVYSVQ7CisgICAgICAgIH0KKworICAgICAgICBwU0VDUG9ydC0+YklzQU5CRW5hYmxlZCA9IHBBTkJQYXJhbXMtPmVuYWJsZTsKKyAgICB9CisgICAgICAgIGJyZWFrOworCisgICAgY2FzZSBPTVhfSW5kZXhQYXJhbVVzZUFuZHJvaWROYXRpdmVCdWZmZXI6CisgICAgeworICAgICAgICBVc2VBbmRyb2lkTmF0aXZlQnVmZmVyUGFyYW1zICpwQU5CUGFyYW1zID0gKFVzZUFuZHJvaWROYXRpdmVCdWZmZXJQYXJhbXMgKikgQ29tcG9uZW50UGFyYW1ldGVyU3RydWN0dXJlOworICAgICAgICBPTVhfVTMyIHBvcnRJbmRleCA9IHBBTkJQYXJhbXMtPm5Qb3J0SW5kZXg7CisgICAgICAgIFNFQ19PTVhfQkFTRVBPUlQgKnBTRUNQb3J0ID0gTlVMTDsKKyAgICAgICAgYW5kcm9pZF9uYXRpdmVfYnVmZmVyX3QgKnBBTkI7CisgICAgICAgIE9NWF9VMzIgblNpemVCeXRlczsKKworICAgICAgICBTRUNfT1NBTF9Mb2coU0VDX0xPR19UUkFDRSwgIiVzOiBPTVhfSW5kZXhQYXJhbVVzZUFuZHJvaWROYXRpdmVCdWZmZXIsIHBvcnRJbmRleDogJWQiLCBfX2Z1bmNfXywgcG9ydEluZGV4KTsKKworICAgICAgICByZXQgPSBTRUNfT01YX0NoZWNrX1NpemVWZXJzaW9uKHBBTkJQYXJhbXMsIHNpemVvZihVc2VBbmRyb2lkTmF0aXZlQnVmZmVyUGFyYW1zKSk7CisgICAgICAgIGlmIChyZXQgIT0gT01YX0Vycm9yTm9uZSkgeworICAgICAgICAgICAgU0VDX09TQUxfTG9nKFNFQ19MT0dfRVJST1IsICIlczogU0VDX09NWF9DaGVja19TaXplVmVyc2lvbihVc2VBbmRyb2lkTmF0aXZlQnVmZmVyUGFyYW1zKSBpcyBmYWlsZWQiLCBfX2Z1bmNfXyk7CisgICAgICAgICAgICBnb3RvIEVYSVQ7CisgICAgICAgIH0KKworICAgICAgICBpZiAocG9ydEluZGV4ID49IHBTRUNDb21wb25lbnQtPnBvcnRQYXJhbS5uUG9ydHMpIHsKKyAgICAgICAgICAgIHJldCA9IE9NWF9FcnJvckJhZFBvcnRJbmRleDsKKyAgICAgICAgICAgIGdvdG8gRVhJVDsKKyAgICAgICAgfQorCisgICAgICAgIHBTRUNQb3J0ID0gJnBTRUNDb21wb25lbnQtPnBTRUNQb3J0W3BvcnRJbmRleF07CisgICAgICAgIGlmIChDSEVDS19QT1JUX1RVTk5FTEVEKHBTRUNQb3J0KSAmJiBDSEVDS19QT1JUX0JVRkZFUl9TVVBQTElFUihwU0VDUG9ydCkpIHsKKyAgICAgICAgICAgIHJldCA9IE9NWF9FcnJvckJhZFBvcnRJbmRleDsKKyAgICAgICAgICAgIGdvdG8gRVhJVDsKKyAgICAgICAgfQorCisgICAgICAgIGlmIChwU0VDUG9ydC0+cG9ydFN0YXRlICE9IE9NWF9TdGF0ZUlkbGUpIHsKKyAgICAgICAgICAgIFNFQ19PU0FMX0xvZyhTRUNfTE9HX0VSUk9SLCAiJXM6IFBvcnQgc3RhdGUgc2hvdWxkIGJlIElETEUiLCBfX2Z1bmNfXyk7CisgICAgICAgICAgICByZXQgPSBPTVhfRXJyb3JJbmNvcnJlY3RTdGF0ZU9wZXJhdGlvbjsKKyAgICAgICAgICAgIGdvdG8gRVhJVDsKKyAgICAgICAgfQorCisgICAgICAgIHBBTkIgPSBwQU5CUGFyYW1zLT5uYXRpdmVCdWZmZXIuZ2V0KCk7CisKKyAgICAgICAgLyogTUFMSSBhbGlnbm1lbnQgcmVzdHJpY3Rpb24gKi8KKyAgICAgICAgblNpemVCeXRlcyA9IEFMSUdOKHBBTkItPndpZHRoLCAxNikgKiBBTElHTihwQU5CLT5oZWlnaHQsIDE2KTsKKyAgICAgICAgblNpemVCeXRlcyArPSBBTElHTihwQU5CLT53aWR0aCAvIDIsIDE2KSAqIEFMSUdOKHBBTkItPmhlaWdodCAvIDIsIDE2KSAqIDI7CisKKyAgICAgICAgcmV0ID0gdXNlQW5kcm9pZE5hdGl2ZUJ1ZmZlcihwU0VDUG9ydCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwQU5CUGFyYW1zLT5idWZmZXJIZWFkZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcEFOQlBhcmFtcy0+blBvcnRJbmRleCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwQU5CUGFyYW1zLT5wQXBwUHJpdmF0ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuU2l6ZUJ5dGVzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChPTVhfVTggKikgcEFOQik7CisgICAgICAgIGlmIChyZXQgIT0gT01YX0Vycm9yTm9uZSkgeworICAgICAgICAgICAgU0VDX09TQUxfTG9nKFNFQ19MT0dfRVJST1IsICIlczogdXNlQW5kcm9pZE5hdGl2ZUJ1ZmZlciBpcyBmYWlsZWQiLCBfX2Z1bmNfXyk7CisgICAgICAgICAgICBnb3RvIEVYSVQ7CisgICAgICAgIH0KKyAgICB9CisgICAgICAgIGJyZWFrOworCisgICAgY2FzZSBPTVhfSW5kZXhQYXJhbVN0b3JlTWV0YURhdGFCdWZmZXI6CisgICAgeworICAgICAgICBTdG9yZU1ldGFEYXRhSW5CdWZmZXJzUGFyYW1zICpwQU5CUGFyYW1zID0gKFN0b3JlTWV0YURhdGFJbkJ1ZmZlcnNQYXJhbXMgKikgQ29tcG9uZW50UGFyYW1ldGVyU3RydWN0dXJlOworICAgICAgICBPTVhfVTMyIHBvcnRJbmRleCA9IHBBTkJQYXJhbXMtPm5Qb3J0SW5kZXg7CisgICAgICAgIFNFQ19PTVhfQkFTRVBPUlQgKnBTRUNQb3J0ID0gTlVMTDsKKworICAgICAgICBTRUNfT1NBTF9Mb2coU0VDX0xPR19UUkFDRSwgIiVzOiBPTVhfSW5kZXhQYXJhbVN0b3JlTWV0YURhdGFCdWZmZXIiLCBfX2Z1bmNfXyk7CisKKyAgICAgICAgcmV0ID0gU0VDX09NWF9DaGVja19TaXplVmVyc2lvbihwQU5CUGFyYW1zLCBzaXplb2YoU3RvcmVNZXRhRGF0YUluQnVmZmVyc1BhcmFtcykpOworICAgICAgICBpZiAocmV0ICE9IE9NWF9FcnJvck5vbmUpIHsKKyAgICAgICAgICAgIFNFQ19PU0FMX0xvZyhTRUNfTE9HX0VSUk9SLCAiJXM6IFNFQ19PTVhfQ2hlY2tfU2l6ZVZlcnNpb24oU3RvcmVNZXRhRGF0YUluQnVmZmVyc1BhcmFtcykgaXMgZmFpbGVkIiwgX19mdW5jX18pOworICAgICAgICAgICAgZ290byBFWElUOworICAgICAgICB9CisKKyAgICAgICAgaWYgKHBvcnRJbmRleCA+PSBwU0VDQ29tcG9uZW50LT5wb3J0UGFyYW0ublBvcnRzKSB7CisgICAgICAgICAgICByZXQgPSBPTVhfRXJyb3JCYWRQb3J0SW5kZXg7CisgICAgICAgICAgICBnb3RvIEVYSVQ7CisgICAgICAgIH0KKworICAgICAgICBwU0VDUG9ydCA9ICZwU0VDQ29tcG9uZW50LT5wU0VDUG9ydFtwb3J0SW5kZXhdOworICAgICAgICBpZiAoQ0hFQ0tfUE9SVF9UVU5ORUxFRChwU0VDUG9ydCkgJiYgQ0hFQ0tfUE9SVF9CVUZGRVJfU1VQUExJRVIocFNFQ1BvcnQpKSB7CisgICAgICAgICAgICByZXQgPSBPTVhfRXJyb3JCYWRQb3J0SW5kZXg7CisgICAgICAgICAgICBnb3RvIEVYSVQ7CisgICAgICAgIH0KKworICAgICAgICBwU0VDUG9ydC0+YlN0b3JlTWV0YURhdGEgPSBwQU5CUGFyYW1zLT5iU3RvcmVNZXRhRGF0YTsKKyAgICB9CisgICAgICAgIGJyZWFrOworCisgICAgZGVmYXVsdDoKKyAgICB7CisgICAgICAgIFNFQ19PU0FMX0xvZyhTRUNfTE9HX0VSUk9SLCAiJXM6IFVuc3VwcG9ydGVkIGluZGV4ICglZCkiLCBfX2Z1bmNfXywgbkluZGV4KTsKKyAgICAgICAgcmV0ID0gT01YX0Vycm9yVW5zdXBwb3J0ZWRJbmRleDsKKyAgICAgICAgZ290byBFWElUOworICAgIH0KKyAgICAgICAgYnJlYWs7CisgICAgfQorCitFWElUOgorICAgIEZ1bmN0aW9uT3V0KCk7CisKKyAgICByZXR1cm4gcmV0OworfQorCitPTVhfRVJST1JUWVBFIFNFQ19PU0FMX0dldEluZm9Gcm9tTWV0YURhdGEoT01YX0lOIFNFQ19PTVhfREFUQSAqcEJ1ZmZlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPTVhfT1VUIE9NWF9QVFIgKnBwQnVmKQoreworICAgIE9NWF9FUlJPUlRZUEUgICAgICByZXQgPSBPTVhfRXJyb3JOb25lOworICAgIE1ldGFkYXRhQnVmZmVyVHlwZSB0eXBlOworICAgIGJ1ZmZlcl9oYW5kbGVfdCAgICBwQnVmSGFuZGxlOworCisgICAgRnVuY3Rpb25JbigpOworCisvKgorICogbWV0YSBkYXRhIGNvbnRhaW5zIHRoZSBmb2xsb3dpbmcgZGF0YSBmb3JtYXQuCisgKiBwYXlsb2FkIGRlcGVuZHMgb24gdGhlIE1ldGFkYXRhQnVmZmVyVHlwZQorICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqIHwgTWV0YWRhdGFCdWZmZXJUeXBlICAgICAgICAgICAgICAgICAgICAgICAgIHwgICAgICAgICAgcGF5bG9hZCAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKKyAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKgorICogSWYgTWV0YWRhdGFCdWZmZXJUeXBlIGlzIGtNZXRhZGF0YUJ1ZmZlclR5cGVDYW1lcmFTb3VyY2UsIHRoZW4KKyAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKiB8IGtNZXRhZGF0YUJ1ZmZlclR5cGVDYW1lcmFTb3VyY2UgIHwgcGh5c2ljYWwgYWRkci4gb2YgWSB8cGh5c2ljYWwgYWRkci4gb2YgQ2JDciB8CisgKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICoKKyAqIElmIE1ldGFkYXRhQnVmZmVyVHlwZSBpcyBrTWV0YWRhdGFCdWZmZXJUeXBlR3JhbGxvY1NvdXJjZSwgdGhlbgorICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqIHwga01ldGFkYXRhQnVmZmVyVHlwZUdyYWxsb2NTb3VyY2UgICAgfCBidWZmZXJfaGFuZGxlX3QgfAorICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqLworCisgICAgLyogTWV0YWRhdGFCdWZmZXJUeXBlICovCisgICAgbWVtY3B5KCZ0eXBlLCAoTWV0YWRhdGFCdWZmZXJUeXBlICopKHBCdWZmZXItPmRhdGFCdWZmZXIpLCBzaXplb2YodHlwZSkpOworCisgICAgaWYgKHR5cGUgPT0ga01ldGFkYXRhQnVmZmVyVHlwZUNhbWVyYVNvdXJjZSkgeworICAgICAgICAvKiBwaHlzaWNhbCBhZGRyLiBvZiBZICovCisgICAgICAgIHBwQnVmWzBdID0gKE9NWF9QVFIpKHBCdWZmZXItPmRhdGFCdWZmZXIgKyBzaXplb2YodHlwZSkpOworICAgICAgICAvKiBwaHlzaWNhbCBhZGRyLiBvZiBDYkNyICovCisgICAgICAgIHBwQnVmWzFdID0gKE9NWF9QVFIpKHBCdWZmZXItPmRhdGFCdWZmZXIgKyBzaXplb2YodHlwZSkgKyBzaXplb2YocEJ1ZmZlci0+ZGF0YUJ1ZmZlcikpOworICAgIH0gZWxzZSBpZiAodHlwZSA9PSBrTWV0YWRhdGFCdWZmZXJUeXBlR3JhbGxvY1NvdXJjZSkgeworICAgICAgICAvKiBidWZmZXJfaGFuZGxlX3QgKi8KKyAgICAgICAgbWVtY3B5KCZwQnVmSGFuZGxlLCBwQnVmZmVyLT5kYXRhQnVmZmVyICsgc2l6ZW9mKHR5cGUpLCBzaXplb2YoYnVmZmVyX2hhbmRsZV90KSk7CisgICAgICAgIHBwQnVmWzBdID0gKE9NWF9QVFIpcEJ1ZkhhbmRsZTsKKyAgICB9CisKK0VYSVQ6CisgICAgRnVuY3Rpb25PdXQoKTsKKworICAgIHJldHVybiByZXQ7Cit9CisKKyNpZmRlZiBfX2NwbHVzcGx1cworfQorI2VuZGlmCmRpZmYgLS1naXQgYS9leHlub3M0L211bHRpbWVkaWEvb3Blbm1heC9zZWNfb214L29zYWwvU0VDX09TQUxfQW5kcm9pZC5oIGIvZXh5bm9zNC9tdWx0aW1lZGlhL29wZW5tYXgvc2VjX29teC9vc2FsL1NFQ19PU0FMX0FuZHJvaWQuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42NzAyOWY1Ci0tLSAvZGV2L251bGwKKysrIGIvZXh5bm9zNC9tdWx0aW1lZGlhL29wZW5tYXgvc2VjX29teC9vc2FsL1NFQ19PU0FMX0FuZHJvaWQuaApAQCAtMCwwICsxLDgxIEBACisvKgorICogQ29weXJpZ2h0IDIwMTEgU2Ftc3VuZyBFbGVjdHJvbmljcyBTLkxTSSBDby4gTFRECisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKy8qCisgKiBAZmlsZSAgICAgICAgU0VDX09TQUxfQW5kcm9pZC5oCisgKiBAYnJpZWYKKyAqIEBhdXRob3IgICAgICBTZXVuZ2Jlb20gS2ltIChzYmNydXgua2ltQHNhbXN1bmcuY29tKQorICogQGF1dGhvciAgICAgIEh5ZXllb24gQ2h1bmcgKGh5ZW9uLmNodW5nQHNhbXN1bmcuY29tKQorICogQGF1dGhvciAgICAgIFl1bmppIEtpbSAoeXVuamkua2ltQHNhbXN1bmcuY29tKQorICogQGF1dGhvciAgICAgIEppbnN1bmcgWWFuZyAoanNnb29kLnlhbmdAc2Ftc3VuZy5jb20pCisgKiBAdmVyc2lvbiAgICAgMS4xLjAKKyAqIEBoaXN0b3J5CisgKiAgIDIwMTEuNy4xNSA6IENyZWF0ZQorICovCisKKyNpZm5kZWYgU0VDX09TQUxfQU5EUk9JRAorI2RlZmluZSBTRUNfT1NBTF9BTkRST0lECisKKyNpbmNsdWRlICJPTVhfVHlwZXMuaCIKKyNpbmNsdWRlICJPTVhfQ29yZS5oIgorI2luY2x1ZGUgIk9NWF9JbmRleC5oIgorCisjaWZkZWYgX19jcGx1c3BsdXMKK2V4dGVybiAiQyIgeworI2VuZGlmCisKK09NWF9FUlJPUlRZUEUgU0VDX09TQUxfR2V0QU5CUGFyYW1ldGVyKE9NWF9JTiBPTVhfSEFORExFVFlQRSBoQ29tcG9uZW50LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT01YX0lOIE9NWF9JTkRFWFRZUEUgbkluZGV4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT01YX0lOT1VUIE9NWF9QVFIgQ29tcG9uZW50UGFyYW1ldGVyU3RydWN0dXJlKTsKKworT01YX0VSUk9SVFlQRSBTRUNfT1NBTF9TZXRBTkJQYXJhbWV0ZXIoT01YX0lOIE9NWF9IQU5ETEVUWVBFIGhDb21wb25lbnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPTVhfSU4gT01YX0lOREVYVFlQRSBuSW5kZXgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPTVhfSU4gT01YX1BUUiBDb21wb25lbnRQYXJhbWV0ZXJTdHJ1Y3R1cmUpOworCitPTVhfRVJST1JUWVBFIFNFQ19PU0FMX0xvY2tBTkIoT01YX0lOIE9NWF9QVFIgcEJ1ZmZlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPTVhfSU4gT01YX1UzMiB3aWR0aCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPTVhfSU4gT01YX1UzMiBoZWlnaHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT01YX0lOIE9NWF9DT0xPUl9GT1JNQVRUWVBFIGZvcm1hdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPTVhfT1VUIE9NWF9VMzIgKnBTdHJpZGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT01YX09VVCBPTVhfUFRSICp2YWRkcik7CisKK09NWF9FUlJPUlRZUEUgU0VDX09TQUxfR2V0UGh5c0FOQihPTVhfSU4gT01YX1BUUiBwQnVmZmVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9NWF9PVVQgT01YX1BUUiAqcGFkZHIpOworCitPTVhfRVJST1JUWVBFIFNFQ19PU0FMX1VubG9ja0FOQihPTVhfSU4gT01YX1BUUiBwQnVmZmVyKTsKKworT01YX0VSUk9SVFlQRSBTRUNfT1NBTF9Mb2NrQU5CSGFuZGxlKE9NWF9JTiBPTVhfVTMyIHBCdWZmZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT01YX0lOIE9NWF9VMzIgd2lkdGgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT01YX0lOIE9NWF9VMzIgaGVpZ2h0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9NWF9JTiBPTVhfQ09MT1JfRk9STUFUVFlQRSBmb3JtYXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT01YX09VVCBPTVhfUFRSICp2YWRkcik7CisKK09NWF9FUlJPUlRZUEUgU0VDX09TQUxfVW5sb2NrQU5CSGFuZGxlKE9NWF9JTiBPTVhfVTMyIHBCdWZmZXIpOworCitPTVhfRVJST1JUWVBFIFNFQ19PU0FMX0dldFBoeXNBTkJIYW5kbGUoT01YX0lOIE9NWF9VMzIgcEJ1ZmZlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPTVhfT1VUIE9NWF9QVFIgKnBhZGRyKTsKKworT01YX0VSUk9SVFlQRSBTRUNfT1NBTF9HZXRJbmZvRnJvbU1ldGFEYXRhKE9NWF9JTiBTRUNfT01YX0RBVEEgKnBCdWZmZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT01YX09VVCBPTVhfUFRSICpwT3V0QnVmZmVyKTsKKworT01YX0VSUk9SVFlQRSBTRUNfT1NBTF9DaGVja0FOQihPTVhfSU4gU0VDX09NWF9EQVRBICpwQnVmZmVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPTVhfT1VUIE9NWF9CT09MICpiSXNBTkJFbmFibGVkKTsKKworI2lmZGVmIF9fY3BsdXNwbHVzCit9CisjZW5kaWYKKworI2VuZGlmCmRpZmYgLS1naXQgYS9leHlub3M0L211bHRpbWVkaWEvb3Blbm1heC9zZWNfb214L29zYWwvU0VDX09TQUxfRVRDLmMgYi9leHlub3M0L211bHRpbWVkaWEvb3Blbm1heC9zZWNfb214L29zYWwvU0VDX09TQUxfRVRDLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjA4MjM2OAotLS0gL2Rldi9udWxsCisrKyBiL2V4eW5vczQvbXVsdGltZWRpYS9vcGVubWF4L3NlY19vbXgvb3NhbC9TRUNfT1NBTF9FVEMuYwpAQCAtMCwwICsxLDIzNyBAQAorLyoKKyAqCisgKiBDb3B5cmlnaHQgMjAxMCBTYW1zdW5nIEVsZWN0cm9uaWNzIFMuTFNJIENvLiBMVEQKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworLyoKKyAqIEBmaWxlICAgICAgICBTRUNfT1NBTF9FVEMuYworICogQGJyaWVmCisgKiBAYXV0aG9yICAgICAgU2V1bmdCZW9tIEtpbSAoc2JjcnV4LmtpbUBzYW1zdW5nLmNvbSkKKyAqIEB2ZXJzaW9uICAgICAxLjEuMAorICogQGhpc3RvcnkKKyAqICAgMjAxMC43LjE1IDogQ3JlYXRlCisgKi8KKworI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8c3RkbGliLmg+CisjaW5jbHVkZSA8c3RyaW5nLmg+CisjaW5jbHVkZSA8c3lzL3RpbWUuaD4KKworI2luY2x1ZGUgIlNFQ19PU0FMX01lbW9yeS5oIgorI2luY2x1ZGUgIlNFQ19PU0FMX0VUQy5oIgorI2luY2x1ZGUgIlNFQ19PU0FMX0xvZy5oIgorCitzdGF0aWMgc3RydWN0IHRpbWV2YWwgcGVyZlN0YXJ0W1BFUkZfSURfTUFYKzFdLCBwZXJmU3RvcFtQRVJGX0lEX01BWCsxXTsKK3N0YXRpYyB1bnNpZ25lZCBsb25nIHBlcmZUaW1lW1BFUkZfSURfTUFYKzFdLCB0b3RhbFBlcmZUaW1lW1BFUkZfSURfTUFYKzFdOworc3RhdGljIHVuc2lnbmVkIGludCBwZXJmRnJhbWVDb3VudFtQRVJGX0lEX01BWCsxXSwgcGVyZk92ZXIzMG1zW1BFUkZfSURfTUFYKzFdOworCisjaWZuZGVmIEhBVkVfR0VUTElORQorc3NpemVfdCBnZXRsaW5lKGNoYXIgKipwcExpbmUsIHNpemVfdCAqcExlbiwgRklMRSAqcFN0cmVhbSkKK3sKKyAgICBjaGFyICpwQ3VycmVudFBvaW50ZXIgPSBOVUxMOworICAgIHNpemVfdCBjb25zdCBjaHVuayA9IDUxMjsKKworICAgIHNpemVfdCBkZWZhdWx0QnVmZmVyU2l6ZSA9IGNodW5rICsgMTsKKyAgICBzaXplX3QgcmV0U2l6ZSA9IDA7CisKKyAgICBpZiAoKnBwTGluZSA9PSBOVUxMKSB7CisgICAgICAgICpwcExpbmUgPSAoY2hhciAqKW1hbGxvYyhkZWZhdWx0QnVmZmVyU2l6ZSk7CisgICAgICAgIGlmICgqcHBMaW5lID09IE5VTEwpIHsKKyAgICAgICAgICAgIHJldFNpemUgPSAtMTsKKyAgICAgICAgICAgIGdvdG8gRVhJVDsKKyAgICAgICAgfQorICAgICAgICAqcExlbiA9IGRlZmF1bHRCdWZmZXJTaXplOworICAgIH0KKyAgICBlbHNlIHsKKyAgICAgICAgaWYgKCpwTGVuIDwgZGVmYXVsdEJ1ZmZlclNpemUpIHsKKyAgICAgICAgICAgICpwcExpbmUgPSAoY2hhciAqKXJlYWxsb2MoKnBwTGluZSwgZGVmYXVsdEJ1ZmZlclNpemUpOworICAgICAgICAgICAgaWYgKCpwcExpbmUgPT0gTlVMTCkgeworICAgICAgICAgICAgICAgIHJldFNpemUgPSAtMTsKKyAgICAgICAgICAgICAgICBnb3RvIEVYSVQ7CisgICAgICAgICAgICB9CisgICAgICAgICAgICAqcExlbiA9IGRlZmF1bHRCdWZmZXJTaXplOworICAgICAgICB9CisgICAgfQorCisgICAgd2hpbGUgKDEpIHsKKyAgICAgICAgc2l6ZV90IGk7CisgICAgICAgIHNpemVfdCBqID0gMDsKKyAgICAgICAgc2l6ZV90IHJlYWRCeXRlID0gMDsKKworICAgICAgICBwQ3VycmVudFBvaW50ZXIgPSAqcHBMaW5lICsgcmVhZEJ5dGU7CisKKyAgICAgICAgaSA9IGZyZWFkKHBDdXJyZW50UG9pbnRlciwgMSwgY2h1bmssIHBTdHJlYW0pOworICAgICAgICBpZiAoaSA8IGNodW5rICYmIGZlcnJvcihwU3RyZWFtKSkgeworICAgICAgICAgICAgcmV0U2l6ZSA9IC0xOworICAgICAgICAgICAgZ290byBFWElUOworICAgICAgICB9CisgICAgICAgIHdoaWxlIChqIDwgaSkgeworICAgICAgICAgICAgKytqOworICAgICAgICAgICAgaWYgKCpwQ3VycmVudFBvaW50ZXIrKyA9PSAoY2hhciknXG4nKSB7CisgICAgICAgICAgICAgICAgKnBDdXJyZW50UG9pbnRlciA9ICdcMCc7CisgICAgICAgICAgICAgICAgaWYgKGogIT0gaSkgeworICAgICAgICAgICAgICAgICAgICBpZiAoZnNlZWsocFN0cmVhbSwgaiAtIGksIFNFRUtfQ1VSKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgcmV0U2l6ZSA9IC0xOworICAgICAgICAgICAgICAgICAgICAgICAgZ290byBFWElUOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgaWYgKGZlb2YocFN0cmVhbSkpCisgICAgICAgICAgICAgICAgICAgICAgICBjbGVhcmVycihwU3RyZWFtKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgcmVhZEJ5dGUgKz0gajsKKyAgICAgICAgICAgICAgICByZXRTaXplID0gcmVhZEJ5dGU7CisgICAgICAgICAgICAgICAgZ290byBFWElUOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgcmVhZEJ5dGUgKz0gajsKKyAgICAgICAgaWYgKGZlb2YocFN0cmVhbSkpIHsKKyAgICAgICAgICAgIGlmIChyZWFkQnl0ZSkgeworICAgICAgICAgICAgICAgIHJldFNpemUgPSByZWFkQnl0ZTsKKyAgICAgICAgICAgICAgICBnb3RvIEVYSVQ7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAoIWkpIHsKKyAgICAgICAgICAgICAgICByZXRTaXplID0gLTE7CisgICAgICAgICAgICAgICAgZ290byBFWElUOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgaSA9ICgocmVhZEJ5dGUgKyAoY2h1bmsgKiAyKSkgLyBjaHVuaykgKiBjaHVuazsKKyAgICAgICAgaWYgKGkgIT0gKnBMZW4pIHsKKyAgICAgICAgICAgICpwcExpbmUgPSAoY2hhciAqKXJlYWxsb2MoKnBwTGluZSwgaSk7CisgICAgICAgICAgICBpZiAoKnBwTGluZSA9PSBOVUxMKSB7CisgICAgICAgICAgICAgICAgcmV0U2l6ZSA9IC0xOworICAgICAgICAgICAgICAgIGdvdG8gRVhJVDsKKyAgICAgICAgfQorICAgICAgICAgICAgKnBMZW4gPSBpOworICAgICAgICB9CisgICAgfQorCitFWElUOgorICAgIHJldHVybiByZXRTaXplOworfQorI2VuZGlmIC8qIEhBVkVfR0VUTElORSAqLworCitPTVhfUFRSIFNFQ19PU0FMX1N0cmNweShPTVhfUFRSIGRlc3QsIE9NWF9QVFIgc3JjKQoreworICAgIHJldHVybiBzdHJjcHkoZGVzdCwgc3JjKTsKK30KKworT01YX1BUUiBTRUNfT1NBTF9TdHJuY3B5KE9NWF9QVFIgZGVzdCwgT01YX1BUUiBzcmMsIHNpemVfdCBudW0pCit7CisgICAgcmV0dXJuIHN0cm5jcHkoZGVzdCwgc3JjLCBudW0pOworfQorCitPTVhfUzMyIFNFQ19PU0FMX1N0cmNtcChPTVhfUFRSIHN0cjEsIE9NWF9QVFIgc3RyMikKK3sKKyAgICByZXR1cm4gc3RyY21wKHN0cjEsIHN0cjIpOworfQorCitPTVhfUzMyIFNFQ19PU0FMX1N0cm5jbXAoT01YX1BUUiBzdHIxLCBPTVhfUFRSIHN0cjIsIHNpemVfdCBudW0pCit7CisgICAgcmV0dXJuIHN0cm5jbXAoc3RyMSwgc3RyMiwgbnVtKTsKK30KKworT01YX1BUUiBTRUNfT1NBTF9TdHJjYXQoT01YX1BUUiBkZXN0LCBPTVhfUFRSIHNyYykKK3sKKyAgICByZXR1cm4gc3RyY2F0KGRlc3QsIHNyYyk7Cit9CisKK09NWF9QVFIgU0VDX09TQUxfU3RybmNhdChPTVhfUFRSIGRlc3QsIE9NWF9QVFIgc3JjLCBzaXplX3QgbnVtKQoreworICAgIHJldHVybiBzdHJuY2F0KGRlc3QsIHNyYywgbnVtKTsKK30KKworc2l6ZV90IFNFQ19PU0FMX1N0cmxlbihjb25zdCBjaGFyICpzdHIpCit7CisgICAgcmV0dXJuIHN0cmxlbihzdHIpOworfQorCitzdGF0aWMgT01YX1UzMiBNZWFzdXJlVGltZShzdHJ1Y3QgdGltZXZhbCAqc3RhcnQsIHN0cnVjdCB0aW1ldmFsICpzdG9wKQoreworICAgIHVuc2lnbmVkIGxvbmcgc2VjLCB1c2VjLCB0aW1lOworCisgICAgc2VjID0gc3RvcC0+dHZfc2VjIC0gc3RhcnQtPnR2X3NlYzsKKyAgICBpZiAoc3RvcC0+dHZfdXNlYyA+PSBzdGFydC0+dHZfdXNlYykgeworICAgICAgICB1c2VjID0gc3RvcC0+dHZfdXNlYyAtIHN0YXJ0LT50dl91c2VjOworICAgIH0gZWxzZSB7CisgICAgICAgIHVzZWMgPSBzdG9wLT50dl91c2VjICsgMTAwMDAwMCAtIHN0YXJ0LT50dl91c2VjOworICAgICAgICBzZWMtLTsKKyAgICB9CisKKyAgICB0aW1lID0gc2VjICogMTAwMDAwMCArICh1c2VjKTsKKworICAgIHJldHVybiB0aW1lOworfQorCit2b2lkIFNFQ19PU0FMX1BlcmZJbml0KFBFUkZfSURfVFlQRSBpZCkKK3sKKyAgICBtZW1zZXQoJnBlcmZTdGFydFtpZF0sIDAsIHNpemVvZihwZXJmU3RhcnRbaWRdKSk7CisgICAgbWVtc2V0KCZwZXJmU3RvcFtpZF0sIDAsIHNpemVvZihwZXJmU3RvcFtpZF0pKTsKKyAgICBwZXJmVGltZVtpZF0gPSAwOworICAgIHRvdGFsUGVyZlRpbWVbaWRdID0gMDsKKyAgICBwZXJmRnJhbWVDb3VudFtpZF0gPSAwOworICAgIHBlcmZPdmVyMzBtc1tpZF0gPSAwOworfQorCit2b2lkIFNFQ19PU0FMX1BlcmZTdGFydChQRVJGX0lEX1RZUEUgaWQpCit7CisgICAgZ2V0dGltZW9mZGF5KCZwZXJmU3RhcnRbaWRdLCBOVUxMKTsKK30KKwordm9pZCBTRUNfT1NBTF9QZXJmU3RvcChQRVJGX0lEX1RZUEUgaWQpCit7CisgICAgZ2V0dGltZW9mZGF5KCZwZXJmU3RvcFtpZF0sIE5VTEwpOworCisgICAgcGVyZlRpbWVbaWRdID0gTWVhc3VyZVRpbWUoJnBlcmZTdGFydFtpZF0sICZwZXJmU3RvcFtpZF0pOworICAgIHRvdGFsUGVyZlRpbWVbaWRdICs9IHBlcmZUaW1lW2lkXTsKKyAgICBwZXJmRnJhbWVDb3VudFtpZF0rKzsKKworICAgIGlmIChwZXJmVGltZVtpZF0gPiAzMDAwMCkKKyAgICAgICAgcGVyZk92ZXIzMG1zW2lkXSsrOworfQorCitPTVhfVTMyIFNFQ19PU0FMX1BlcmZGcmFtZShQRVJGX0lEX1RZUEUgaWQpCit7CisgICAgcmV0dXJuIHBlcmZUaW1lW2lkXTsKK30KKworT01YX1UzMiBTRUNfT1NBTF9QZXJmVG90YWwoUEVSRl9JRF9UWVBFIGlkKQoreworICAgIHJldHVybiB0b3RhbFBlcmZUaW1lW2lkXTsKK30KKworT01YX1UzMiBTRUNfT1NBTF9QZXJmRnJhbWVDb3VudChQRVJGX0lEX1RZUEUgaWQpCit7CisgICAgcmV0dXJuIHBlcmZGcmFtZUNvdW50W2lkXTsKK30KKworaW50IFNFQ19PU0FMX1BlcmZPdmVyMzBtcyhQRVJGX0lEX1RZUEUgaWQpCit7CisgICAgcmV0dXJuIHBlcmZPdmVyMzBtc1tpZF07Cit9CisKK3ZvaWQgU0VDX09TQUxfUGVyZlByaW50KE9NWF9TVFJJTkcgcHJlZml4LCBQRVJGX0lEX1RZUEUgaWQpCit7CisgICAgT01YX1UzMiBwZXJmVG90YWw7CisgICAgaW50IGZyYW1lQ291bnQ7CisKKyAgICBmcmFtZUNvdW50ID0gU0VDX09TQUxfUGVyZkZyYW1lQ291bnQoaWQpOworICAgIHBlcmZUb3RhbCA9IFNFQ19PU0FMX1BlcmZUb3RhbChpZCk7CisKKyAgICBTRUNfT1NBTF9Mb2coU0VDX0xPR19JTkZPLCAiJXMgRnJhbWUgQ291bnQ6ICVkIiwgcHJlZml4LCBmcmFtZUNvdW50KTsKKyAgICBTRUNfT1NBTF9Mb2coU0VDX0xPR19JTkZPLCAiJXMgQXZnIFRpbWU6ICUuMmYgbXMsIE92ZXIgMzBtczogJWQiLAorICAgICAgICAgICAgICAgIHByZWZpeCwgKGZsb2F0KXBlcmZUb3RhbCAvIChmbG9hdCkoZnJhbWVDb3VudCAqIDEwMDApLAorICAgICAgICAgICAgICAgIFNFQ19PU0FMX1BlcmZPdmVyMzBtcyhpZCkpOworfQpkaWZmIC0tZ2l0IGEvZXh5bm9zNC9tdWx0aW1lZGlhL29wZW5tYXgvc2VjX29teC9vc2FsL1NFQ19PU0FMX0VUQy5oIGIvZXh5bm9zNC9tdWx0aW1lZGlhL29wZW5tYXgvc2VjX29teC9vc2FsL1NFQ19PU0FMX0VUQy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjIyNzVhYmIKLS0tIC9kZXYvbnVsbAorKysgYi9leHlub3M0L211bHRpbWVkaWEvb3Blbm1heC9zZWNfb214L29zYWwvU0VDX09TQUxfRVRDLmgKQEAgLTAsMCArMSw2NiBAQAorLyoKKyAqCisgKiBDb3B5cmlnaHQgMjAxMCBTYW1zdW5nIEVsZWN0cm9uaWNzIFMuTFNJIENvLiBMVEQKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworLyoKKyAqIEBmaWxlICAgICAgICBTRUNfT1NBTF9FVEMuaAorICogQGJyaWVmCisgKiBAYXV0aG9yICAgICAgU2V1bmdCZW9tIEtpbSAoc2JjcnV4LmtpbUBzYW1zdW5nLmNvbSkKKyAqIEB2ZXJzaW9uICAgICAxLjEuMAorICogQGhpc3RvcnkKKyAqICAgMjAxMC43LjE1IDogQ3JlYXRlCisgKi8KKworI2lmbmRlZiBTRUNfT1NBTF9FVEMKKyNkZWZpbmUgU0VDX09TQUxfRVRDCisKKyNpbmNsdWRlICJPTVhfVHlwZXMuaCIKKworCisjaWZkZWYgX19jcGx1c3BsdXMKK2V4dGVybiAiQyIgeworI2VuZGlmCisKK09NWF9QVFIgU0VDX09TQUxfU3RyY3B5KE9NWF9QVFIgZGVzdCwgT01YX1BUUiBzcmMpOworT01YX1MzMiBTRUNfT1NBTF9TdHJuY21wKE9NWF9QVFIgc3RyMSwgT01YX1BUUiBzdHIyLCBzaXplX3QgbnVtKTsKK09NWF9TMzIgU0VDX09TQUxfU3RyY21wKE9NWF9QVFIgc3RyMSwgT01YX1BUUiBzdHIyKTsKK09NWF9QVFIgU0VDX09TQUxfU3RyY2F0KE9NWF9QVFIgZGVzdCwgT01YX1BUUiBzcmMpOworc2l6ZV90IFNFQ19PU0FMX1N0cmxlbihjb25zdCBjaGFyICpzdHIpOworc3NpemVfdCBnZXRsaW5lKGNoYXIgKipwcExpbmUsIHNpemVfdCAqbGVuLCBGSUxFICpzdHJlYW0pOworCisvKiBwZXJmICovCit0eXBlZGVmIGVudW0gX1BFUkZfSURfVFlQRSB7CisgICAgUEVSRl9JRF9DU0MgPSAwLAorICAgIFBFUkZfSURfREVDLAorICAgIFBFUkZfSURfRU5DLAorICAgIFBFUkZfSURfVVNFUiwKKyAgICBQRVJGX0lEX01BWCwKK30gUEVSRl9JRF9UWVBFOworCit2b2lkIFNFQ19PU0FMX1BlcmZJbml0KFBFUkZfSURfVFlQRSBpZCk7Cit2b2lkIFNFQ19PU0FMX1BlcmZTdGFydChQRVJGX0lEX1RZUEUgaWQpOwordm9pZCBTRUNfT1NBTF9QZXJmU3RvcChQRVJGX0lEX1RZUEUgaWQpOworT01YX1UzMiBTRUNfT1NBTF9QZXJmRnJhbWUoUEVSRl9JRF9UWVBFIGlkKTsKK09NWF9VMzIgU0VDX09TQUxfUGVyZlRvdGFsKFBFUkZfSURfVFlQRSBpZCk7CitPTVhfVTMyIFNFQ19PU0FMX1BlcmZGcmFtZUNvdW50KFBFUkZfSURfVFlQRSBpZCk7CitpbnQgU0VDX09TQUxfUGVyZk92ZXIzMG1zKFBFUkZfSURfVFlQRSBpZCk7Cit2b2lkIFNFQ19PU0FMX1BlcmZQcmludChPTVhfU1RSSU5HIHByZWZpeCwgUEVSRl9JRF9UWVBFIGlkKTsKKworI2lmZGVmIF9fY3BsdXNwbHVzCit9CisjZW5kaWYKKworI2VuZGlmCmRpZmYgLS1naXQgYS9leHlub3M0L211bHRpbWVkaWEvb3Blbm1heC9zZWNfb214L29zYWwvU0VDX09TQUxfRXZlbnQuYyBiL2V4eW5vczQvbXVsdGltZWRpYS9vcGVubWF4L3NlY19vbXgvb3NhbC9TRUNfT1NBTF9FdmVudC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjM4M2I2MmMKLS0tIC9kZXYvbnVsbAorKysgYi9leHlub3M0L211bHRpbWVkaWEvb3Blbm1heC9zZWNfb214L29zYWwvU0VDX09TQUxfRXZlbnQuYwpAQCAtMCwwICsxLDIxNyBAQAorLyoKKyAqCisgKiBDb3B5cmlnaHQgMjAxMCBTYW1zdW5nIEVsZWN0cm9uaWNzIFMuTFNJIENvLiBMVEQKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisqLworCisvKgorICogQGZpbGUgICAgICAgIFNFQ19PU0FMX0V2ZW50LmMKKyAqIEBicmllZgorICogQGF1dGhvciAgICAgIFNldW5nQmVvbSBLaW0gKHNiY3J1eC5raW1Ac2Ftc3VuZy5jb20pCisgKiBAdmVyc2lvbiAgICAgMS4xLjAKKyAqIEBoaXN0b3J5CisgKiAgIDIwMTAuNy4xNSA6IENyZWF0ZQorICovCisKKworI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8c3RkbGliLmg+CisjaW5jbHVkZSA8c3RyaW5nLmg+CisjaW5jbHVkZSA8cHRocmVhZC5oPgorI2luY2x1ZGUgPGVycm5vLmg+CisKKyNpbmNsdWRlICJTRUNfT1NBTF9NZW1vcnkuaCIKKyNpbmNsdWRlICJTRUNfT1NBTF9NdXRleC5oIgorI2luY2x1ZGUgIlNFQ19PU0FMX0V2ZW50LmgiCisKKyN1bmRlZiAgU0VDX0xPR19UQUcKKyNkZWZpbmUgU0VDX0xPR19UQUcgICAgIlNFQ19PU0FMX0VWRU5UIgorI2RlZmluZSBTRUNfTE9HX09GRgorI2luY2x1ZGUgIlNFQ19PU0FMX0xvZy5oIgorCisKK09NWF9FUlJPUlRZUEUgU0VDX09TQUxfU2lnbmFsQ3JlYXRlKE9NWF9IQU5ETEVUWVBFICpldmVudEhhbmRsZSkKK3sKKyAgICBTRUNfT1NBTF9USFJFQURFVkVOVCAqZXZlbnQ7CisgICAgT01YX0VSUk9SVFlQRSByZXQgPSBPTVhfRXJyb3JOb25lOworCisgICAgZXZlbnQgPSAoU0VDX09TQUxfVEhSRUFERVZFTlQgKilTRUNfT1NBTF9NYWxsb2Moc2l6ZW9mKFNFQ19PU0FMX1RIUkVBREVWRU5UKSk7CisgICAgaWYgKCFldmVudCkgeworICAgICAgICByZXQgPSBPTVhfRXJyb3JJbnN1ZmZpY2llbnRSZXNvdXJjZXM7CisgICAgICAgIGdvdG8gRVhJVDsKKyAgICB9CisKKyAgICBTRUNfT1NBTF9NZW1zZXQoZXZlbnQsIDAsIHNpemVvZihTRUNfT1NBTF9USFJFQURFVkVOVCkpOworICAgIGV2ZW50LT5zaWduYWwgPSBPTVhfRkFMU0U7CisKKyAgICByZXQgPSBTRUNfT1NBTF9NdXRleENyZWF0ZSgmZXZlbnQtPm11dGV4KTsKKyAgICBpZiAocmV0ICE9IE9NWF9FcnJvck5vbmUpIHsKKyAgICAgICAgU0VDX09TQUxfRnJlZShldmVudCk7CisgICAgICAgIGdvdG8gRVhJVDsKKyAgICB9CisKKyAgICBpZiAocHRocmVhZF9jb25kX2luaXQoJmV2ZW50LT5jb25kaXRpb24sIE5VTEwpKSB7CisgICAgICAgIFNFQ19PU0FMX011dGV4VGVybWluYXRlKGV2ZW50LT5tdXRleCk7CisgICAgICAgIFNFQ19PU0FMX0ZyZWUoZXZlbnQpOworICAgICAgICByZXQgPSBPTVhfRXJyb3JVbmRlZmluZWQ7CisgICAgICAgIGdvdG8gRVhJVDsKKyAgICB9CisKKyAgICAqZXZlbnRIYW5kbGUgPSAoT01YX0hBTkRMRVRZUEUpZXZlbnQ7CisgICAgcmV0ID0gT01YX0Vycm9yTm9uZTsKKworRVhJVDoKKyAgICByZXR1cm4gcmV0OworfQorCitPTVhfRVJST1JUWVBFIFNFQ19PU0FMX1NpZ25hbFRlcm1pbmF0ZShPTVhfSEFORExFVFlQRSBldmVudEhhbmRsZSkKK3sKKyAgICBTRUNfT1NBTF9USFJFQURFVkVOVCAqZXZlbnQgPSAoU0VDX09TQUxfVEhSRUFERVZFTlQgKilldmVudEhhbmRsZTsKKyAgICBPTVhfRVJST1JUWVBFIHJldCA9IE9NWF9FcnJvck5vbmU7CisKKyAgICBpZiAoIWV2ZW50KSB7CisgICAgICAgIHJldCA9IE9NWF9FcnJvckJhZFBhcmFtZXRlcjsKKyAgICAgICAgZ290byBFWElUOworICAgIH0KKworICAgIHJldCA9IFNFQ19PU0FMX011dGV4TG9jayhldmVudC0+bXV0ZXgpOworICAgIGlmIChyZXQgIT0gT01YX0Vycm9yTm9uZSkgeworICAgICAgICByZXQgPSBPTVhfRXJyb3JCYWRQYXJhbWV0ZXI7CisgICAgICAgIGdvdG8gRVhJVDsKKyAgICB9CisKKyAgICBpZiAocHRocmVhZF9jb25kX2Rlc3Ryb3koJmV2ZW50LT5jb25kaXRpb24pKSB7CisgICAgICAgIHJldCA9IE9NWF9FcnJvclVuZGVmaW5lZDsKKyAgICAgICAgZ290byBFWElUOworICAgIH0KKworICAgIHJldCA9IFNFQ19PU0FMX011dGV4VW5sb2NrKGV2ZW50LT5tdXRleCk7CisgICAgaWYgKHJldCAhPSBPTVhfRXJyb3JOb25lKSB7CisgICAgICAgIHJldCA9IE9NWF9FcnJvclVuZGVmaW5lZDsKKyAgICAgICAgZ290byBFWElUOworICAgIH0KKworICAgIHJldCA9IFNFQ19PU0FMX011dGV4VGVybWluYXRlKGV2ZW50LT5tdXRleCk7CisgICAgaWYgKHJldCAhPSBPTVhfRXJyb3JOb25lKSB7CisgICAgICAgIHJldCA9IE9NWF9FcnJvclVuZGVmaW5lZDsKKyAgICAgICAgZ290byBFWElUOworICAgIH0KKworICAgIFNFQ19PU0FMX0ZyZWUoZXZlbnQpOworCitFWElUOgorICAgIHJldHVybiByZXQ7Cit9CisKK09NWF9FUlJPUlRZUEUgU0VDX09TQUxfU2lnbmFsUmVzZXQoT01YX0hBTkRMRVRZUEUgZXZlbnRIYW5kbGUpCit7CisgICAgU0VDX09TQUxfVEhSRUFERVZFTlQgKmV2ZW50ID0gKFNFQ19PU0FMX1RIUkVBREVWRU5UICopZXZlbnRIYW5kbGU7CisgICAgT01YX0VSUk9SVFlQRSByZXQgPSBPTVhfRXJyb3JOb25lOworCisgICAgaWYgKCFldmVudCkgeworICAgICAgICByZXQgPSBPTVhfRXJyb3JCYWRQYXJhbWV0ZXI7CisgICAgICAgIGdvdG8gRVhJVDsKKyAgICB9CisKKyAgICByZXQgPSBTRUNfT1NBTF9NdXRleExvY2soZXZlbnQtPm11dGV4KTsKKyAgICBpZiAocmV0ICE9IE9NWF9FcnJvck5vbmUpIHsKKyAgICAgICAgcmV0ID0gT01YX0Vycm9yQmFkUGFyYW1ldGVyOworICAgICAgICBnb3RvIEVYSVQ7CisgICAgfQorCisgICAgZXZlbnQtPnNpZ25hbCA9IE9NWF9GQUxTRTsKKworICAgIFNFQ19PU0FMX011dGV4VW5sb2NrKGV2ZW50LT5tdXRleCk7CisKK0VYSVQ6CisgICAgcmV0dXJuIHJldDsKK30KKworT01YX0VSUk9SVFlQRSBTRUNfT1NBTF9TaWduYWxTZXQoT01YX0hBTkRMRVRZUEUgZXZlbnRIYW5kbGUpCit7CisgICAgU0VDX09TQUxfVEhSRUFERVZFTlQgKmV2ZW50ID0gKFNFQ19PU0FMX1RIUkVBREVWRU5UICopZXZlbnRIYW5kbGU7CisgICAgT01YX0VSUk9SVFlQRSByZXQgPSBPTVhfRXJyb3JOb25lOworCisgICAgaWYgKCFldmVudCkgeworICAgICAgICByZXQgPSBPTVhfRXJyb3JCYWRQYXJhbWV0ZXI7CisgICAgICAgIGdvdG8gRVhJVDsKKyAgICB9CisKKyAgICByZXQgPSBTRUNfT1NBTF9NdXRleExvY2soZXZlbnQtPm11dGV4KTsKKyAgICBpZiAocmV0ICE9IE9NWF9FcnJvck5vbmUpIHsKKyAgICAgICAgcmV0ID0gT01YX0Vycm9yQmFkUGFyYW1ldGVyOworICAgICAgICBnb3RvIEVYSVQ7CisgICAgfQorCisgICAgZXZlbnQtPnNpZ25hbCA9IE9NWF9UUlVFOworICAgIHB0aHJlYWRfY29uZF9zaWduYWwoJmV2ZW50LT5jb25kaXRpb24pOworCisgICAgU0VDX09TQUxfTXV0ZXhVbmxvY2soZXZlbnQtPm11dGV4KTsKKworRVhJVDoKKyAgICByZXR1cm4gcmV0OworfQorCitPTVhfRVJST1JUWVBFIFNFQ19PU0FMX1NpZ25hbFdhaXQoT01YX0hBTkRMRVRZUEUgZXZlbnRIYW5kbGUsIE9NWF9VMzIgbXMpCit7CisgICAgU0VDX09TQUxfVEhSRUFERVZFTlQgKmV2ZW50ID0gKFNFQ19PU0FMX1RIUkVBREVWRU5UICopZXZlbnRIYW5kbGU7CisgICAgT01YX0VSUk9SVFlQRSAgICAgICAgIHJldCA9IE9NWF9FcnJvck5vbmU7CisgICAgc3RydWN0IHRpbWVzcGVjICAgICAgIHRpbWVvdXQ7CisgICAgc3RydWN0IHRpbWV2YWwgICAgICAgIG5vdzsKKyAgICBpbnQgICAgICAgICAgICAgICAgICAgZnVuY3JldCA9IDA7CisgICAgT01YX1UzMiAgICAgICAgICAgICAgIHR2X3VzOworCisgICAgRnVuY3Rpb25JbigpOworCisgICAgaWYgKCFldmVudCkgeworICAgICAgICByZXQgPSBPTVhfRXJyb3JCYWRQYXJhbWV0ZXI7CisgICAgICAgIGdvdG8gRVhJVDsKKyAgICB9CisKKyAgICBnZXR0aW1lb2ZkYXkoJm5vdywgTlVMTCk7CisKKyAgICB0dl91cyA9IG5vdy50dl91c2VjICsgbXMgKiAxMDAwOworICAgIHRpbWVvdXQudHZfc2VjID0gbm93LnR2X3NlYyArIHR2X3VzIC8gMTAwMDAwMDsKKyAgICB0aW1lb3V0LnR2X25zZWMgPSAodHZfdXMgJSAxMDAwMDAwKSAqIDEwMDA7CisKKyAgICByZXQgPSBTRUNfT1NBTF9NdXRleExvY2soZXZlbnQtPm11dGV4KTsKKyAgICBpZiAocmV0ICE9IE9NWF9FcnJvck5vbmUpIHsKKyAgICAgICAgcmV0ID0gT01YX0Vycm9yQmFkUGFyYW1ldGVyOworICAgICAgICBnb3RvIEVYSVQ7CisgICAgfQorCisgICAgaWYgKG1zID09IDApIHsKKyAgICAgICAgaWYgKCFldmVudC0+c2lnbmFsKQorICAgICAgICAgICAgcmV0ID0gT01YX0Vycm9yVGltZW91dDsKKyAgICB9IGVsc2UgaWYgKG1zID09IERFRl9NQVhfV0FJVF9USU1FKSB7CisgICAgICAgIHdoaWxlICghZXZlbnQtPnNpZ25hbCkKKyAgICAgICAgICAgIHB0aHJlYWRfY29uZF93YWl0KCZldmVudC0+Y29uZGl0aW9uLCAocHRocmVhZF9tdXRleF90ICopKGV2ZW50LT5tdXRleCkpOworICAgICAgICByZXQgPSBPTVhfRXJyb3JOb25lOworICAgIH0gZWxzZSB7CisgICAgICAgIHdoaWxlICghZXZlbnQtPnNpZ25hbCkgeworICAgICAgICAgICAgZnVuY3JldCA9IHB0aHJlYWRfY29uZF90aW1lZHdhaXQoJmV2ZW50LT5jb25kaXRpb24sIChwdGhyZWFkX211dGV4X3QgKikoZXZlbnQtPm11dGV4KSwgJnRpbWVvdXQpOworICAgICAgICAgICAgaWYgKCghZXZlbnQtPnNpZ25hbCkgJiYgKGZ1bmNyZXQgPT0gRVRJTUVET1VUKSkgeworICAgICAgICAgICAgICAgIHJldCA9IE9NWF9FcnJvclRpbWVvdXQ7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICBTRUNfT1NBTF9NdXRleFVubG9jayhldmVudC0+bXV0ZXgpOworCitFWElUOgorICAgIEZ1bmN0aW9uT3V0KCk7CisKKyAgICByZXR1cm4gcmV0OworfQpkaWZmIC0tZ2l0IGEvZXh5bm9zNC9tdWx0aW1lZGlhL29wZW5tYXgvc2VjX29teC9vc2FsL1NFQ19PU0FMX0V2ZW50LmggYi9leHlub3M0L211bHRpbWVkaWEvb3Blbm1heC9zZWNfb214L29zYWwvU0VDX09TQUxfRXZlbnQuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44YWUyZWI1Ci0tLSAvZGV2L251bGwKKysrIGIvZXh5bm9zNC9tdWx0aW1lZGlhL29wZW5tYXgvc2VjX29teC9vc2FsL1NFQ19PU0FMX0V2ZW50LmgKQEAgLTAsMCArMSw2MSBAQAorLyoKKyAqCisgKiBDb3B5cmlnaHQgMjAxMCBTYW1zdW5nIEVsZWN0cm9uaWNzIFMuTFNJIENvLiBMVEQKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworLyoKKyAqIEBmaWxlICAgICAgICBTRUNfT1NBTF9FdmVudC5oCisgKiBAYnJpZWYKKyAqIEBhdXRob3IgICAgICBTZXVuZ0Jlb20gS2ltIChzYmNydXgua2ltQHNhbXN1bmcuY29tKQorICogQHZlcnNpb24gICAgIDEuMS4wCisgKiBAaGlzdG9yeQorICogICAyMDEwLjcuMTUgOiBDcmVhdGUKKyAqLworCisjaWZuZGVmIFNFQ19PU0FMX0VWRU5UCisjZGVmaW5lIFNFQ19PU0FMX0VWRU5UCisKKyNpbmNsdWRlIDxwdGhyZWFkLmg+CisjaW5jbHVkZSAiT01YX1R5cGVzLmgiCisjaW5jbHVkZSAiT01YX0NvcmUuaCIKKworCisjZGVmaW5lIERFRl9NQVhfV0FJVF9USU1FIDB4RkZGRkZGRkYKKwordHlwZWRlZiBzdHJ1Y3QgX1NFQ19PU0FMX1RIUkVBREVWRU5UCit7CisgICAgT01YX0JPT0wgICAgICAgc2lnbmFsOworICAgIE9NWF9IQU5ETEVUWVBFIG11dGV4OworICAgIHB0aHJlYWRfY29uZF90IGNvbmRpdGlvbjsKK30gU0VDX09TQUxfVEhSRUFERVZFTlQ7CisKKworI2lmZGVmIF9fY3BsdXNwbHVzCitleHRlcm4gIkMiIHsKKyNlbmRpZgorCisKK09NWF9FUlJPUlRZUEUgU0VDX09TQUxfU2lnbmFsQ3JlYXRlKE9NWF9IQU5ETEVUWVBFICpldmVudEhhbmRsZSk7CitPTVhfRVJST1JUWVBFIFNFQ19PU0FMX1NpZ25hbFRlcm1pbmF0ZShPTVhfSEFORExFVFlQRSBldmVudEhhbmRsZSk7CitPTVhfRVJST1JUWVBFIFNFQ19PU0FMX1NpZ25hbFJlc2V0KE9NWF9IQU5ETEVUWVBFIGV2ZW50SGFuZGxlKTsKK09NWF9FUlJPUlRZUEUgU0VDX09TQUxfU2lnbmFsU2V0KE9NWF9IQU5ETEVUWVBFIGV2ZW50SGFuZGxlKTsKK09NWF9FUlJPUlRZUEUgU0VDX09TQUxfU2lnbmFsV2FpdChPTVhfSEFORExFVFlQRSBldmVudEhhbmRsZSwgT01YX1UzMiBtcyk7CisKKworI2lmZGVmIF9fY3BsdXNwbHVzCit9CisjZW5kaWYKKworI2VuZGlmCmRpZmYgLS1naXQgYS9leHlub3M0L211bHRpbWVkaWEvb3Blbm1heC9zZWNfb214L29zYWwvU0VDX09TQUxfTGlicmFyeS5jIGIvZXh5bm9zNC9tdWx0aW1lZGlhL29wZW5tYXgvc2VjX29teC9vc2FsL1NFQ19PU0FMX0xpYnJhcnkuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mNDAwNzk0Ci0tLSAvZGV2L251bGwKKysrIGIvZXh5bm9zNC9tdWx0aW1lZGlhL29wZW5tYXgvc2VjX29teC9vc2FsL1NFQ19PU0FMX0xpYnJhcnkuYwpAQCAtMCwwICsxLDU0IEBACisvKgorICoKKyAqIENvcHlyaWdodCAyMDEwIFNhbXN1bmcgRWxlY3Ryb25pY3MgUy5MU0kgQ28uIExURAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisvKgorICogQGZpbGUgICAgICAgIFNFQ19PU0FMX0xpYnJhcnkuYworICogQGJyaWVmCisgKiBAYXV0aG9yICAgICAgU2V1bmdCZW9tIEtpbSAoc2JjcnV4LmtpbUBzYW1zdW5nLmNvbSkKKyAqIEB2ZXJzaW9uICAgICAxLjEuMAorICogQGhpc3RvcnkKKyAqICAgMjAxMC43LjE1IDogQ3JlYXRlCisgKi8KKworCisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlIDxzdGRsaWIuaD4KKyNpbmNsdWRlIDxzdHJpbmcuaD4KKyNpbmNsdWRlIDxkbGZjbi5oPgorCisjaW5jbHVkZSAiU0VDX09TQUxfTGlicmFyeS5oIgorCisKK3ZvaWQgKlNFQ19PU0FMX2Rsb3Blbihjb25zdCBjaGFyICpmaWxlbmFtZSwgaW50IGZsYWcpCit7CisgICAgcmV0dXJuIGRsb3BlbihmaWxlbmFtZSwgZmxhZyk7Cit9CisKK3ZvaWQgKlNFQ19PU0FMX2Rsc3ltKHZvaWQgKmhhbmRsZSwgY29uc3QgY2hhciAqc3ltYm9sKQoreworICAgIHJldHVybiBkbHN5bShoYW5kbGUsIHN5bWJvbCk7Cit9CisKK2ludCBTRUNfT1NBTF9kbGNsb3NlKHZvaWQgKmhhbmRsZSkKK3sKKyAgICByZXR1cm4gZGxjbG9zZShoYW5kbGUpOworfQorCitjb25zdCBjaGFyICpTRUNfT1NBTF9kbGVycm9yKHZvaWQpCit7CisgICAgcmV0dXJuIGRsZXJyb3IoKTsKK30KZGlmZiAtLWdpdCBhL2V4eW5vczQvbXVsdGltZWRpYS9vcGVubWF4L3NlY19vbXgvb3NhbC9TRUNfT1NBTF9MaWJyYXJ5LmggYi9leHlub3M0L211bHRpbWVkaWEvb3Blbm1heC9zZWNfb214L29zYWwvU0VDX09TQUxfTGlicmFyeS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjI3YWM0MmUKLS0tIC9kZXYvbnVsbAorKysgYi9leHlub3M0L211bHRpbWVkaWEvb3Blbm1heC9zZWNfb214L29zYWwvU0VDX09TQUxfTGlicmFyeS5oCkBAIC0wLDAgKzEsNDYgQEAKKy8qCisgKgorICogQ29weXJpZ2h0IDIwMTAgU2Ftc3VuZyBFbGVjdHJvbmljcyBTLkxTSSBDby4gTFRECisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKy8qCisgKiBAZmlsZSAgICAgICBTRUNfT1NBTF9MaWJyYXJ5LmgKKyAqIEBicmllZgorICogQGF1dGhvciAgICAgU2V1bmdCZW9tIEtpbSAoc2JjcnV4LmtpbUBzYW1zdW5nLmNvbSkKKyAqIEB2ZXJzaW9uICAgIDEuMS4wCisgKiBAaGlzdG9yeQorICogICAgMjAxMC43LjE1IDogQ3JlYXRlCisgKi8KKworI2lmbmRlZiBTRUNfT1NBTF9MSUJSQVJZCisjZGVmaW5lIFNFQ19PU0FMX0xJQlJBUlkKKworI2luY2x1ZGUgIk9NWF9UeXBlcy5oIgorCisKKyNpZmRlZiBfX2NwbHVzcGx1cworZXh0ZXJuICJDIiB7CisjZW5kaWYKKwordm9pZCAqU0VDX09TQUxfZGxvcGVuKGNvbnN0IGNoYXIgKmZpbGVuYW1lLCBpbnQgZmxhZyk7Cit2b2lkICpTRUNfT1NBTF9kbHN5bSh2b2lkICpoYW5kbGUsIGNvbnN0IGNoYXIgKnN5bWJvbCk7CitpbnQgICBTRUNfT1NBTF9kbGNsb3NlKHZvaWQgKmhhbmRsZSk7Citjb25zdCBjaGFyICpTRUNfT1NBTF9kbGVycm9yKHZvaWQpOworCisjaWZkZWYgX19jcGx1c3BsdXMKK30KKyNlbmRpZgorCisjZW5kaWYKZGlmZiAtLWdpdCBhL2V4eW5vczQvbXVsdGltZWRpYS9vcGVubWF4L3NlY19vbXgvb3NhbC9TRUNfT1NBTF9Mb2cuYyBiL2V4eW5vczQvbXVsdGltZWRpYS9vcGVubWF4L3NlY19vbXgvb3NhbC9TRUNfT1NBTF9Mb2cuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wYWE5NTZhCi0tLSAvZGV2L251bGwKKysrIGIvZXh5bm9zNC9tdWx0aW1lZGlhL29wZW5tYXgvc2VjX29teC9vc2FsL1NFQ19PU0FMX0xvZy5jCkBAIC0wLDAgKzEsNTYgQEAKKy8qCisgKgorICogQ29weXJpZ2h0IDIwMTAgU2Ftc3VuZyBFbGVjdHJvbmljcyBTLkxTSSBDby4gTFRECisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKy8qCisgKiBAZmlsZSAgICAgICAgU0VDX09TQUxfTG9nLmMKKyAqIEBicmllZgorICogQGF1dGhvciAgICAgIFl1bmppIEtpbSAoeXVuamkua2ltQHNhbXN1bmcuY29tKQorICogQHZlcnNpb24gICAgIDEuMS4wCisgKiBAaGlzdG9yeQorICogICAyMDEwLjcuMTUgOiBDcmVhdGUKKyAqLworCisjaW5jbHVkZSA8dXRpbHMvTG9nLmg+CisKKyNpbmNsdWRlICJTRUNfT1NBTF9Mb2cuaCIKKworCit2b2lkIF9TRUNfT1NBTF9Mb2coU0VDX0xPR19MRVZFTCBsb2dMZXZlbCwgY29uc3QgY2hhciAqdGFnLCBjb25zdCBjaGFyICptc2csIC4uLikKK3sKKyAgICB2YV9saXN0IGFyZ3B0cjsKKworICAgIHZhX3N0YXJ0KGFyZ3B0ciwgbXNnKTsKKworICAgIHN3aXRjaCAobG9nTGV2ZWwpIHsKKyAgICBjYXNlIFNFQ19MT0dfVFJBQ0U6CisgICAgICAgIF9fYW5kcm9pZF9sb2dfdnByaW50KEFORFJPSURfTE9HX0RFQlVHLCB0YWcsIG1zZywgYXJncHRyKTsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBTRUNfTE9HX0lORk86CisgICAgICAgIF9fYW5kcm9pZF9sb2dfdnByaW50KEFORFJPSURfTE9HX0lORk8sIHRhZywgbXNnLCBhcmdwdHIpOworICAgICAgICBicmVhazsKKyAgICBjYXNlIFNFQ19MT0dfV0FSTklORzoKKyAgICAgICAgX19hbmRyb2lkX2xvZ192cHJpbnQoQU5EUk9JRF9MT0dfV0FSTiwgdGFnLCBtc2csIGFyZ3B0cik7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgU0VDX0xPR19FUlJPUjoKKyAgICAgICAgX19hbmRyb2lkX2xvZ192cHJpbnQoQU5EUk9JRF9MT0dfRVJST1IsIHRhZywgbXNnLCBhcmdwdHIpOworICAgICAgICBicmVhazsKKyAgICBkZWZhdWx0OgorICAgICAgICBfX2FuZHJvaWRfbG9nX3ZwcmludChBTkRST0lEX0xPR19WRVJCT1NFLCB0YWcsIG1zZywgYXJncHRyKTsKKyAgICB9CisKKyAgICB2YV9lbmQoYXJncHRyKTsKK30KZGlmZiAtLWdpdCBhL2V4eW5vczQvbXVsdGltZWRpYS9vcGVubWF4L3NlY19vbXgvb3NhbC9TRUNfT1NBTF9Mb2cuaCBiL2V4eW5vczQvbXVsdGltZWRpYS9vcGVubWF4L3NlY19vbXgvb3NhbC9TRUNfT1NBTF9Mb2cuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kNGYyNjE3Ci0tLSAvZGV2L251bGwKKysrIGIvZXh5bm9zNC9tdWx0aW1lZGlhL29wZW5tYXgvc2VjX29teC9vc2FsL1NFQ19PU0FMX0xvZy5oCkBAIC0wLDAgKzEsNzkgQEAKKy8qCisgKgorICogQ29weXJpZ2h0IDIwMTAgU2Ftc3VuZyBFbGVjdHJvbmljcyBTLkxTSSBDby4gTFRECisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKy8qCisgKiBAZmlsZSAgICAgICAgU0VDX09TQUxfTG9nLmgKKyAqIEBicmllZgorICogQGF1dGhvciAgICAgIFl1bmppIEtpbSAoeXVuamkua2ltQHNhbXN1bmcuY29tKQorICogQHZlcnNpb24gICAgIDEuMS4wCisgKiBAaGlzdG9yeQorICogICAyMDEwLjcuMTUgOiBDcmVhdGUKKyAqICAgMjAxMC44LjI3IDogQWRkIHRyYWNlIGZ1bmN0aW9uCisgKi8KKworI2lmbmRlZiBTRUNfT1NBTF9MT0cKKyNkZWZpbmUgU0VDX09TQUxfTE9HCisKKyNpZmRlZiBfX2NwbHVzcGx1cworZXh0ZXJuICJDIiB7CisjZW5kaWYKKworI2lmbmRlZiBTRUNfTE9HX09GRgorI2RlZmluZSBTRUNfTE9HCisjZW5kaWYKKworI2lmbmRlZiBTRUNfTE9HX1RBRworI2RlZmluZSBTRUNfTE9HX1RBRyAgICAiU0VDX0xPRyIKKyNlbmRpZgorCisjaWZkZWYgU0VDX1RSQUNFX09OCisjZGVmaW5lIFNFQ19UUkFDRQorI2VuZGlmCisKK3R5cGVkZWYgZW51bSBfTE9HX0xFVkVMCit7CisgICAgU0VDX0xPR19UUkFDRSwKKyAgICBTRUNfTE9HX0lORk8sCisgICAgU0VDX0xPR19XQVJOSU5HLAorICAgIFNFQ19MT0dfRVJST1IKK30gU0VDX0xPR19MRVZFTDsKKworI2lmZGVmIFNFQ19MT0cKKyNkZWZpbmUgU0VDX09TQUxfTG9nKGEsIC4uLikgICAgKCh2b2lkKV9TRUNfT1NBTF9Mb2coYSwgU0VDX0xPR19UQUcsIF9fVkFfQVJHU19fKSkKKyNlbHNlCisjZGVmaW5lIFNFQ19PU0FMX0xvZyhhLCAuLi4pICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIGRvIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBpZiAoYSA9PSBTRUNfTE9HX0VSUk9SKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAoKHZvaWQpX1NFQ19PU0FMX0xvZyhhLCBTRUNfTE9HX1RBRywgX19WQV9BUkdTX18pKTsgXAorICAgIH0gd2hpbGUgKDApCisjZW5kaWYKKworI2lmZGVmIFNFQ19UUkFDRQorI2RlZmluZSBGdW5jdGlvbkluKCkgX1NFQ19PU0FMX0xvZyhTRUNfTE9HX1RSQUNFLCBTRUNfTE9HX1RBRywgIiVzIEluICwgTGluZTogJWQiLCBfX0ZVTkNUSU9OX18sIF9fTElORV9fKQorI2RlZmluZSBGdW5jdGlvbk91dCgpIF9TRUNfT1NBTF9Mb2coU0VDX0xPR19UUkFDRSwgU0VDX0xPR19UQUcsICIlcyBPdXQgLCBMaW5lOiAlZCIsIF9fRlVOQ1RJT05fXywgX19MSU5FX18pCisjZWxzZQorI2RlZmluZSBGdW5jdGlvbkluKCkgKCh2b2lkICopMCkKKyNkZWZpbmUgRnVuY3Rpb25PdXQoKSAoKHZvaWQgKikwKQorI2VuZGlmCisKK2V4dGVybiB2b2lkIF9TRUNfT1NBTF9Mb2coU0VDX0xPR19MRVZFTCBsb2dMZXZlbCwgY29uc3QgY2hhciAqdGFnLCBjb25zdCBjaGFyICptc2csIC4uLik7CisKKyNpZmRlZiBfX2NwbHVzcGx1cworfQorI2VuZGlmCisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvZXh5bm9zNC9tdWx0aW1lZGlhL29wZW5tYXgvc2VjX29teC9vc2FsL1NFQ19PU0FMX01lbW9yeS5jIGIvZXh5bm9zNC9tdWx0aW1lZGlhL29wZW5tYXgvc2VjX29teC9vc2FsL1NFQ19PU0FMX01lbW9yeS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmJmNTIyNGQKLS0tIC9kZXYvbnVsbAorKysgYi9leHlub3M0L211bHRpbWVkaWEvb3Blbm1heC9zZWNfb214L29zYWwvU0VDX09TQUxfTWVtb3J5LmMKQEAgLTAsMCArMSw3MSBAQAorLyoKKyAqCisgKiBDb3B5cmlnaHQgMjAxMCBTYW1zdW5nIEVsZWN0cm9uaWNzIFMuTFNJIENvLiBMVEQKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworLyoKKyAqIEBmaWxlICAgICAgICBTRUNfT1NBTF9NZW1vcnkuYworICogQGJyaWVmCisgKiBAYXV0aG9yICAgICAgU2V1bmdCZW9tIEtpbSAoc2JjcnV4LmtpbUBzYW1zdW5nLmNvbSkKKyAqIEB2ZXJzaW9uICAgICAxLjEuMAorICogQGhpc3RvcnkKKyAqICAgMjAxMC43LjE1IDogQ3JlYXRlCisgKi8KKworI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8c3RkbGliLmg+CisjaW5jbHVkZSA8c3RyaW5nLmg+CisKKyNpbmNsdWRlICJTRUNfT1NBTF9NZW1vcnkuaCIKKworI2RlZmluZSBTRUNfTE9HX09GRgorI2luY2x1ZGUgIlNFQ19PU0FMX0xvZy5oIgorCisKK3N0YXRpYyBpbnQgbWVtX2NudCA9IDA7CisKK09NWF9QVFIgU0VDX09TQUxfTWFsbG9jKE9NWF9VMzIgc2l6ZSkKK3sKKyAgICBtZW1fY250Kys7CisgICAgU0VDX09TQUxfTG9nKFNFQ19MT0dfVFJBQ0UsICJhbGxvYyBjb3VudDogJWQiLCBtZW1fY250KTsKKworICAgIHJldHVybiAoT01YX1BUUiltYWxsb2Moc2l6ZSk7Cit9CisKK3ZvaWQgU0VDX09TQUxfRnJlZShPTVhfUFRSIGFkZHIpCit7CisgICAgbWVtX2NudC0tOworICAgIFNFQ19PU0FMX0xvZyhTRUNfTE9HX1RSQUNFLCAiZnJlZSBjb3VudDogJWQiLCBtZW1fY250KTsKKworICAgIGlmIChhZGRyKQorICAgICAgICBmcmVlKGFkZHIpOworCisgICAgcmV0dXJuOworfQorCitPTVhfUFRSIFNFQ19PU0FMX01lbXNldChPTVhfUFRSIGRlc3QsIE9NWF9TMzIgYywgT01YX1MzMiBuKQoreworICAgIHJldHVybiBtZW1zZXQoZGVzdCwgYywgbik7Cit9CisKK09NWF9QVFIgU0VDX09TQUxfTWVtY3B5KE9NWF9QVFIgZGVzdCwgT01YX1BUUiBzcmMsIE9NWF9TMzIgbikKK3sKKyAgICByZXR1cm4gbWVtY3B5KGRlc3QsIHNyYywgbik7Cit9CisKK09NWF9QVFIgU0VDX09TQUxfTWVtbW92ZShPTVhfUFRSIGRlc3QsIE9NWF9QVFIgc3JjLCBPTVhfUzMyIG4pCit7CisgICAgcmV0dXJuIG1lbW1vdmUoZGVzdCwgc3JjLCBuKTsKK30KZGlmZiAtLWdpdCBhL2V4eW5vczQvbXVsdGltZWRpYS9vcGVubWF4L3NlY19vbXgvb3NhbC9TRUNfT1NBTF9NZW1vcnkuaCBiL2V4eW5vczQvbXVsdGltZWRpYS9vcGVubWF4L3NlY19vbXgvb3NhbC9TRUNfT1NBTF9NZW1vcnkuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mZWQ1Y2FjCi0tLSAvZGV2L251bGwKKysrIGIvZXh5bm9zNC9tdWx0aW1lZGlhL29wZW5tYXgvc2VjX29teC9vc2FsL1NFQ19PU0FMX01lbW9yeS5oCkBAIC0wLDAgKzEsNDggQEAKKy8qCisgKgorICogQ29weXJpZ2h0IDIwMTAgU2Ftc3VuZyBFbGVjdHJvbmljcyBTLkxTSSBDby4gTFRECisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKy8qCisgKiBAZmlsZSAgICAgICAgU0VDX09TQUxfTWVtb3J5LmgKKyAqIEBicmllZgorICogQGF1dGhvciAgICAgIFNldW5nQmVvbSBLaW0gKHNiY3J1eC5raW1Ac2Ftc3VuZy5jb20pCisgKiBAdmVyc2lvbiAgICAgMS4xLjAKKyAqIEBoaXN0b3J5CisgKiAgIDIwMTAuNy4xNSA6IENyZWF0ZQorICovCisKKyNpZm5kZWYgU0VDX09TQUxfTUVNT1JZCisjZGVmaW5lIFNFQ19PU0FMX01FTU9SWQorCisjaW5jbHVkZSAiT01YX1R5cGVzLmgiCisKKworI2lmZGVmIF9fY3BsdXNwbHVzCitleHRlcm4gIkMiIHsKKyNlbmRpZgorCitPTVhfUFRSIFNFQ19PU0FMX01hbGxvYyhPTVhfVTMyIHNpemUpOwordm9pZCAgICBTRUNfT1NBTF9GcmVlKE9NWF9QVFIgYWRkcik7CitPTVhfUFRSIFNFQ19PU0FMX01lbXNldChPTVhfUFRSIGRlc3QsIE9NWF9TMzIgYywgT01YX1MzMiBuKTsKK09NWF9QVFIgU0VDX09TQUxfTWVtY3B5KE9NWF9QVFIgZGVzdCwgT01YX1BUUiBzcmMsIE9NWF9TMzIgbik7CitPTVhfUFRSIFNFQ19PU0FMX01lbW1vdmUoT01YX1BUUiBkZXN0LCBPTVhfUFRSIHNyYywgT01YX1MzMiBuKTsKKworI2lmZGVmIF9fY3BsdXNwbHVzCit9CisjZW5kaWYKKworI2VuZGlmCisKZGlmZiAtLWdpdCBhL2V4eW5vczQvbXVsdGltZWRpYS9vcGVubWF4L3NlY19vbXgvb3NhbC9TRUNfT1NBTF9NdXRleC5jIGIvZXh5bm9zNC9tdWx0aW1lZGlhL29wZW5tYXgvc2VjX29teC9vc2FsL1NFQ19PU0FMX011dGV4LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjhmN2I3OQotLS0gL2Rldi9udWxsCisrKyBiL2V4eW5vczQvbXVsdGltZWRpYS9vcGVubWF4L3NlY19vbXgvb3NhbC9TRUNfT1NBTF9NdXRleC5jCkBAIC0wLDAgKzEsOTMgQEAKKy8qCisgKgorICogQ29weXJpZ2h0IDIwMTAgU2Ftc3VuZyBFbGVjdHJvbmljcyBTLkxTSSBDby4gTFRECisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKy8qCisgKiBAZmlsZSAgICAgICAgU0VDX09TQUxfTXV0ZXguYworICogQGJyaWVmCisgKiBAYXV0aG9yICAgICAgU2V1bmdCZW9tIEtpbSAoc2JjcnV4LmtpbUBzYW1zdW5nLmNvbSkKKyAqIEB2ZXJzaW9uICAgICAxLjEuMAorICogQGhpc3RvcnkKKyAqICAgMjAxMC43LjE1IDogQ3JlYXRlCisgKi8KKworI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8c3RkbGliLmg+CisjaW5jbHVkZSA8c3RyaW5nLmg+CisjaW5jbHVkZSA8cHRocmVhZC5oPgorCisjaW5jbHVkZSAiU0VDX09TQUxfTWVtb3J5LmgiCisjaW5jbHVkZSAiU0VDX09TQUxfTXV0ZXguaCIKKworCitPTVhfRVJST1JUWVBFIFNFQ19PU0FMX011dGV4Q3JlYXRlKE9NWF9IQU5ETEVUWVBFICptdXRleEhhbmRsZSkKK3sKKyAgICBwdGhyZWFkX211dGV4X3QgKm11dGV4OworCisgICAgbXV0ZXggPSAocHRocmVhZF9tdXRleF90ICopU0VDX09TQUxfTWFsbG9jKHNpemVvZihwdGhyZWFkX211dGV4X3QpKTsKKyAgICBpZiAoIW11dGV4KQorICAgICAgICByZXR1cm4gT01YX0Vycm9ySW5zdWZmaWNpZW50UmVzb3VyY2VzOworCisgICAgaWYgKHB0aHJlYWRfbXV0ZXhfaW5pdChtdXRleCwgTlVMTCkgIT0gMCkgeworICAgICAgICBTRUNfT1NBTF9GcmVlKG11dGV4KTsKKyAgICAgICAgcmV0dXJuIE9NWF9FcnJvclVuZGVmaW5lZDsKKyAgICB9CisKKyAgICAqbXV0ZXhIYW5kbGUgPSAoT01YX0hBTkRMRVRZUEUpbXV0ZXg7CisgICAgcmV0dXJuIE9NWF9FcnJvck5vbmU7Cit9CisKK09NWF9FUlJPUlRZUEUgU0VDX09TQUxfTXV0ZXhUZXJtaW5hdGUoT01YX0hBTkRMRVRZUEUgbXV0ZXhIYW5kbGUpCit7CisgICAgcHRocmVhZF9tdXRleF90ICptdXRleCA9IChwdGhyZWFkX211dGV4X3QgKiltdXRleEhhbmRsZTsKKworICAgIGlmIChtdXRleCA9PSBOVUxMKQorICAgICAgICByZXR1cm4gT01YX0Vycm9yQmFkUGFyYW1ldGVyOworCisgICAgaWYgKHB0aHJlYWRfbXV0ZXhfZGVzdHJveShtdXRleCkgIT0gMCkKKyAgICAgICAgcmV0dXJuIE9NWF9FcnJvclVuZGVmaW5lZDsKKworICAgIFNFQ19PU0FMX0ZyZWUobXV0ZXgpOworICAgIHJldHVybiBPTVhfRXJyb3JOb25lOworfQorCitPTVhfRVJST1JUWVBFIFNFQ19PU0FMX011dGV4TG9jayhPTVhfSEFORExFVFlQRSBtdXRleEhhbmRsZSkKK3sKKyAgICBwdGhyZWFkX211dGV4X3QgKm11dGV4ID0gKHB0aHJlYWRfbXV0ZXhfdCAqKW11dGV4SGFuZGxlOworICAgIGludCByZXN1bHQ7CisKKyAgICBpZiAobXV0ZXggPT0gTlVMTCkKKyAgICAgICAgcmV0dXJuIE9NWF9FcnJvckJhZFBhcmFtZXRlcjsKKworICAgIGlmIChwdGhyZWFkX211dGV4X2xvY2sobXV0ZXgpICE9IDApCisgICAgICAgIHJldHVybiBPTVhfRXJyb3JVbmRlZmluZWQ7CisKKyAgICByZXR1cm4gT01YX0Vycm9yTm9uZTsKK30KKworT01YX0VSUk9SVFlQRSBTRUNfT1NBTF9NdXRleFVubG9jayhPTVhfSEFORExFVFlQRSBtdXRleEhhbmRsZSkKK3sKKyAgICBwdGhyZWFkX211dGV4X3QgKm11dGV4ID0gKHB0aHJlYWRfbXV0ZXhfdCAqKW11dGV4SGFuZGxlOworICAgIGludCByZXN1bHQ7CisKKyAgICBpZiAobXV0ZXggPT0gTlVMTCkKKyAgICAgICAgcmV0dXJuIE9NWF9FcnJvckJhZFBhcmFtZXRlcjsKKworICAgIGlmIChwdGhyZWFkX211dGV4X3VubG9jayhtdXRleCkgIT0gMCkKKyAgICAgICAgcmV0dXJuIE9NWF9FcnJvclVuZGVmaW5lZDsKKworICAgIHJldHVybiBPTVhfRXJyb3JOb25lOworfQpkaWZmIC0tZ2l0IGEvZXh5bm9zNC9tdWx0aW1lZGlhL29wZW5tYXgvc2VjX29teC9vc2FsL1NFQ19PU0FMX011dGV4LmggYi9leHlub3M0L211bHRpbWVkaWEvb3Blbm1heC9zZWNfb214L29zYWwvU0VDX09TQUxfTXV0ZXguaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yZGQ2M2JjCi0tLSAvZGV2L251bGwKKysrIGIvZXh5bm9zNC9tdWx0aW1lZGlhL29wZW5tYXgvc2VjX29teC9vc2FsL1NFQ19PU0FMX011dGV4LmgKQEAgLTAsMCArMSw0NyBAQAorLyoKKyAqCisgKiBDb3B5cmlnaHQgMjAxMCBTYW1zdW5nIEVsZWN0cm9uaWNzIFMuTFNJIENvLiBMVEQKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworLyoKKyAqIEBmaWxlICAgICAgICBTRUNfT1NBTF9NdXRleC5oCisgKiBAYnJpZWYKKyAqIEBhdXRob3IgICAgICBTZXVuZ0Jlb20gS2ltIChzYmNydXgua2ltQHNhbXN1bmcuY29tKQorICogQHZlcnNpb24gICAgIDEuMS4wCisgKiBAaGlzdG9yeQorICogICAyMDEwLjcuMTUgOiBDcmVhdGUKKyovCisKKyNpZm5kZWYgU0VDX09TQUxfTVVURVgKKyNkZWZpbmUgU0VDX09TQUxfTVVURVgKKworI2luY2x1ZGUgIk9NWF9UeXBlcy5oIgorI2luY2x1ZGUgIk9NWF9Db3JlLmgiCisKKworI2lmZGVmIF9fY3BsdXNwbHVzCitleHRlcm4gIkMiIHsKKyNlbmRpZgorCitPTVhfRVJST1JUWVBFIFNFQ19PU0FMX011dGV4Q3JlYXRlKE9NWF9IQU5ETEVUWVBFICptdXRleEhhbmRsZSk7CitPTVhfRVJST1JUWVBFIFNFQ19PU0FMX011dGV4VGVybWluYXRlKE9NWF9IQU5ETEVUWVBFIG11dGV4SGFuZGxlKTsKK09NWF9FUlJPUlRZUEUgU0VDX09TQUxfTXV0ZXhMb2NrKE9NWF9IQU5ETEVUWVBFIG11dGV4SGFuZGxlKTsKK09NWF9FUlJPUlRZUEUgU0VDX09TQUxfTXV0ZXhVbmxvY2soT01YX0hBTkRMRVRZUEUgbXV0ZXhIYW5kbGUpOworCisjaWZkZWYgX19jcGx1c3BsdXMKK30KKyNlbmRpZgorCisjZW5kaWYKZGlmZiAtLWdpdCBhL2V4eW5vczQvbXVsdGltZWRpYS9vcGVubWF4L3NlY19vbXgvb3NhbC9TRUNfT1NBTF9RdWV1ZS5jIGIvZXh5bm9zNC9tdWx0aW1lZGlhL29wZW5tYXgvc2VjX29teC9vc2FsL1NFQ19PU0FMX1F1ZXVlLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNGVjZDhkYwotLS0gL2Rldi9udWxsCisrKyBiL2V4eW5vczQvbXVsdGltZWRpYS9vcGVubWF4L3NlY19vbXgvb3NhbC9TRUNfT1NBTF9RdWV1ZS5jCkBAIC0wLDAgKzEsMTc0IEBACisvKgorICoKKyAqIENvcHlyaWdodCAyMDEwIFNhbXN1bmcgRWxlY3Ryb25pY3MgUy5MU0kgQ28uIExURAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisvKgorICogQGZpbGUgICAgICAgIFNFQ19PU0FMX1F1ZXVlLmMKKyAqIEBicmllZgorICogQGF1dGhvciAgICAgIFNldW5nQmVvbSBLaW0gKHNiY3J1eC5raW1Ac2Ftc3VuZy5jb20pCisgKiBAdmVyc2lvbiAgICAgMS4xLjAKKyAqIEBoaXN0b3J5CisgKiAgIDIwMTAuNy4xNSA6IENyZWF0ZQorICovCisKKworI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8c3RkbGliLmg+CisjaW5jbHVkZSA8c3RyaW5nLmg+CisKKyNpbmNsdWRlICJTRUNfT1NBTF9NZW1vcnkuaCIKKyNpbmNsdWRlICJTRUNfT1NBTF9NdXRleC5oIgorI2luY2x1ZGUgIlNFQ19PU0FMX1F1ZXVlLmgiCisKKworT01YX0VSUk9SVFlQRSBTRUNfT1NBTF9RdWV1ZUNyZWF0ZShTRUNfUVVFVUUgKnF1ZXVlSGFuZGxlKQoreworICAgIGludCBpID0gMDsKKyAgICBTRUNfUUVsZW0gKm5ld3FlbGVtID0gTlVMTDsKKyAgICBTRUNfUUVsZW0gKmN1cnJlbnRxZWxlbSA9IE5VTEw7CisgICAgU0VDX1FVRVVFICpxdWV1ZSA9IChTRUNfUVVFVUUgKilxdWV1ZUhhbmRsZTsKKworICAgIE9NWF9FUlJPUlRZUEUgcmV0ID0gT01YX0Vycm9yTm9uZTsKKworICAgIGlmICghcXVldWUpCisgICAgICAgIHJldHVybiBPTVhfRXJyb3JCYWRQYXJhbWV0ZXI7CisKKyAgICByZXQgPSBTRUNfT1NBTF9NdXRleENyZWF0ZSgmcXVldWUtPnFNdXRleCk7CisgICAgaWYgKHJldCAhPSBPTVhfRXJyb3JOb25lKQorICAgICAgICByZXR1cm4gcmV0OworCisgICAgcXVldWUtPmZpcnN0ID0gKFNFQ19RRWxlbSAqKVNFQ19PU0FMX01hbGxvYyhzaXplb2YoU0VDX1FFbGVtKSk7CisgICAgaWYgKHF1ZXVlLT5maXJzdCA9PSBOVUxMKQorICAgICAgICByZXR1cm4gT01YX0Vycm9ySW5zdWZmaWNpZW50UmVzb3VyY2VzOworCisgICAgU0VDX09TQUxfTWVtc2V0KHF1ZXVlLT5maXJzdCwgMCwgc2l6ZW9mKFNFQ19RRWxlbSkpOworICAgIGN1cnJlbnRxZWxlbSA9IHF1ZXVlLT5sYXN0ID0gcXVldWUtPmZpcnN0OworICAgIHF1ZXVlLT5udW1FbGVtID0gMDsKKworICAgIGZvciAoaSA9IDA7IGkgPCAoTUFYX1FVRVVFX0VMRU1FTlRTIC0gMik7IGkrKykgeworICAgICAgICBuZXdxZWxlbSA9IChTRUNfUUVsZW0gKilTRUNfT1NBTF9NYWxsb2Moc2l6ZW9mKFNFQ19RRWxlbSkpOworICAgICAgICBpZiAobmV3cWVsZW0gPT0gTlVMTCkgeworICAgICAgICAgICAgd2hpbGUgKHF1ZXVlLT5maXJzdCAhPSBOVUxMKSB7CisgICAgICAgICAgICAgICAgY3VycmVudHFlbGVtID0gcXVldWUtPmZpcnN0LT5xTmV4dDsKKyAgICAgICAgICAgICAgICBTRUNfT1NBTF9GcmVlKChPTVhfUFRSKXF1ZXVlLT5maXJzdCk7CisgICAgICAgICAgICAgICAgcXVldWUtPmZpcnN0ID0gY3VycmVudHFlbGVtOworICAgICAgICAgICAgfQorICAgICAgICAgICAgcmV0dXJuIE9NWF9FcnJvckluc3VmZmljaWVudFJlc291cmNlczsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIFNFQ19PU0FMX01lbXNldChuZXdxZWxlbSwgMCwgc2l6ZW9mKFNFQ19RRWxlbSkpOworICAgICAgICAgICAgY3VycmVudHFlbGVtLT5xTmV4dCA9IG5ld3FlbGVtOworICAgICAgICAgICAgY3VycmVudHFlbGVtID0gbmV3cWVsZW07CisgICAgICAgIH0KKyAgICB9CisKKyAgICBjdXJyZW50cWVsZW0tPnFOZXh0ID0gcXVldWUtPmZpcnN0OworCisgICAgcmV0dXJuIE9NWF9FcnJvck5vbmU7Cit9CisKK09NWF9FUlJPUlRZUEUgU0VDX09TQUxfUXVldWVUZXJtaW5hdGUoU0VDX1FVRVVFICpxdWV1ZUhhbmRsZSkKK3sKKyAgICBpbnQgaSA9IDA7CisgICAgU0VDX1FFbGVtICpjdXJyZW50cWVsZW0gPSBOVUxMOworICAgIFNFQ19RVUVVRSAqcXVldWUgPSAoU0VDX1FVRVVFICopcXVldWVIYW5kbGU7CisgICAgT01YX0VSUk9SVFlQRSByZXQgPSBPTVhfRXJyb3JOb25lOworCisgICAgaWYgKCFxdWV1ZSkKKyAgICAgICAgcmV0dXJuIE9NWF9FcnJvckJhZFBhcmFtZXRlcjsKKworICAgIGZvciAoIGkgPSAwOyBpIDwgKE1BWF9RVUVVRV9FTEVNRU5UUyAtIDIpOyBpKyspIHsKKyAgICAgICAgY3VycmVudHFlbGVtID0gcXVldWUtPmZpcnN0LT5xTmV4dDsKKyAgICAgICAgU0VDX09TQUxfRnJlZShxdWV1ZS0+Zmlyc3QpOworICAgICAgICBxdWV1ZS0+Zmlyc3QgPSBjdXJyZW50cWVsZW07CisgICAgfQorCisgICAgaWYocXVldWUtPmZpcnN0KSB7CisgICAgICAgIFNFQ19PU0FMX0ZyZWUocXVldWUtPmZpcnN0KTsKKyAgICAgICAgcXVldWUtPmZpcnN0ID0gTlVMTDsKKyAgICB9CisKKyAgICByZXQgPSBTRUNfT1NBTF9NdXRleFRlcm1pbmF0ZShxdWV1ZS0+cU11dGV4KTsKKworICAgIHJldHVybiByZXQ7Cit9CisKK2ludCBTRUNfT1NBTF9RdWV1ZShTRUNfUVVFVUUgKnF1ZXVlSGFuZGxlLCB2b2lkICpkYXRhKQoreworICAgIFNFQ19RVUVVRSAqcXVldWUgPSAoU0VDX1FVRVVFICopcXVldWVIYW5kbGU7CisgICAgaWYgKHF1ZXVlID09IE5VTEwpCisgICAgICAgIHJldHVybiAtMTsKKworICAgIFNFQ19PU0FMX011dGV4TG9jayhxdWV1ZS0+cU11dGV4KTsKKworICAgIGlmICgocXVldWUtPmxhc3QtPmRhdGEgIT0gTlVMTCkgfHwgKHF1ZXVlLT5udW1FbGVtID49IE1BWF9RVUVVRV9FTEVNRU5UUykpIHsKKyAgICAgICAgU0VDX09TQUxfTXV0ZXhVbmxvY2socXVldWUtPnFNdXRleCk7CisgICAgICAgIHJldHVybiAtMTsKKyAgICB9CisgICAgcXVldWUtPmxhc3QtPmRhdGEgPSBkYXRhOworICAgIHF1ZXVlLT5sYXN0ID0gcXVldWUtPmxhc3QtPnFOZXh0OworICAgIHF1ZXVlLT5udW1FbGVtKys7CisKKyAgICBTRUNfT1NBTF9NdXRleFVubG9jayhxdWV1ZS0+cU11dGV4KTsKKyAgICByZXR1cm4gMDsKK30KKwordm9pZCAqU0VDX09TQUxfRGVxdWV1ZShTRUNfUVVFVUUgKnF1ZXVlSGFuZGxlKQoreworICAgIHZvaWQgKmRhdGEgPSBOVUxMOworICAgIFNFQ19RVUVVRSAqcXVldWUgPSAoU0VDX1FVRVVFICopcXVldWVIYW5kbGU7CisgICAgaWYgKHF1ZXVlID09IE5VTEwpCisgICAgICAgIHJldHVybiBOVUxMOworCisgICAgU0VDX09TQUxfTXV0ZXhMb2NrKHF1ZXVlLT5xTXV0ZXgpOworCisgICAgaWYgKChxdWV1ZS0+Zmlyc3QtPmRhdGEgPT0gTlVMTCkgfHwgKHF1ZXVlLT5udW1FbGVtIDw9IDApKSB7CisgICAgICAgIFNFQ19PU0FMX011dGV4VW5sb2NrKHF1ZXVlLT5xTXV0ZXgpOworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisgICAgZGF0YSA9IHF1ZXVlLT5maXJzdC0+ZGF0YTsKKyAgICBxdWV1ZS0+Zmlyc3QtPmRhdGEgPSBOVUxMOworICAgIHF1ZXVlLT5maXJzdCA9IHF1ZXVlLT5maXJzdC0+cU5leHQ7CisgICAgcXVldWUtPm51bUVsZW0tLTsKKworICAgIFNFQ19PU0FMX011dGV4VW5sb2NrKHF1ZXVlLT5xTXV0ZXgpOworICAgIHJldHVybiBkYXRhOworfQorCitpbnQgU0VDX09TQUxfR2V0RWxlbU51bShTRUNfUVVFVUUgKnF1ZXVlSGFuZGxlKQoreworICAgIGludCBFbGVtTnVtID0gMDsKKyAgICBTRUNfUVVFVUUgKnF1ZXVlID0gKFNFQ19RVUVVRSAqKXF1ZXVlSGFuZGxlOworICAgIGlmIChxdWV1ZSA9PSBOVUxMKQorICAgICAgICByZXR1cm4gLTE7CisKKyAgICBTRUNfT1NBTF9NdXRleExvY2socXVldWUtPnFNdXRleCk7CisgICAgRWxlbU51bSA9IHF1ZXVlLT5udW1FbGVtOworICAgIFNFQ19PU0FMX011dGV4VW5sb2NrKHF1ZXVlLT5xTXV0ZXgpOworICAgIHJldHVybiBFbGVtTnVtOworfQorCitpbnQgU0VDX09TQUxfU2V0RWxlbU51bShTRUNfUVVFVUUgKnF1ZXVlSGFuZGxlLCBpbnQgRWxlbU51bSkKK3sKKyAgICBTRUNfUVVFVUUgKnF1ZXVlID0gKFNFQ19RVUVVRSAqKXF1ZXVlSGFuZGxlOworICAgIGlmIChxdWV1ZSA9PSBOVUxMKQorICAgICAgICByZXR1cm4gLTE7CisKKyAgICBTRUNfT1NBTF9NdXRleExvY2socXVldWUtPnFNdXRleCk7CisgICAgcXVldWUtPm51bUVsZW0gPSBFbGVtTnVtOyAKKyAgICBTRUNfT1NBTF9NdXRleFVubG9jayhxdWV1ZS0+cU11dGV4KTsKKyAgICByZXR1cm4gRWxlbU51bTsKK30KKwpkaWZmIC0tZ2l0IGEvZXh5bm9zNC9tdWx0aW1lZGlhL29wZW5tYXgvc2VjX29teC9vc2FsL1NFQ19PU0FMX1F1ZXVlLmggYi9leHlub3M0L211bHRpbWVkaWEvb3Blbm1heC9zZWNfb214L29zYWwvU0VDX09TQUxfUXVldWUuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kMWRlZTExCi0tLSAvZGV2L251bGwKKysrIGIvZXh5bm9zNC9tdWx0aW1lZGlhL29wZW5tYXgvc2VjX29teC9vc2FsL1NFQ19PU0FMX1F1ZXVlLmgKQEAgLTAsMCArMSw2NiBAQAorLyoKKyAqCisgKiBDb3B5cmlnaHQgMjAxMCBTYW1zdW5nIEVsZWN0cm9uaWNzIFMuTFNJIENvLiBMVEQKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworLyoKKyAqIEBmaWxlICAgIFNFQ19PU0FMX1F1ZXVlLmgKKyAqIEBicmllZgorICogQGF1dGhvciAgICBTZXVuZ0Jlb20gS2ltIChzYmNydXgua2ltQHNhbXN1bmcuY29tKQorICogQHZlcnNpb24gICAgMS4xLjAKKyAqIEBoaXN0b3J5CisgKiAgIDIwMTAuNy4xNSA6IENyZWF0ZQorICovCisKKyNpZm5kZWYgU0VDX09TQUxfUVVFVUUKKyNkZWZpbmUgU0VDX09TQUxfUVVFVUUKKworI2luY2x1ZGUgIk9NWF9UeXBlcy5oIgorI2luY2x1ZGUgIk9NWF9Db3JlLmgiCisKKworI2RlZmluZSBNQVhfUVVFVUVfRUxFTUVOVFMgICAgMTAKKwordHlwZWRlZiBzdHJ1Y3QgX1NFQ19RRWxlbQoreworICAgIHZvaWQgICAgICAgICAgICAgKmRhdGE7CisgICAgc3RydWN0IF9TRUNfUUVsZW0gKnFOZXh0OworfSBTRUNfUUVsZW07CisKK3R5cGVkZWYgc3RydWN0IF9TRUNfUVVFVUUKK3sKKyAgICBTRUNfUUVsZW0gICAgICpmaXJzdDsKKyAgICBTRUNfUUVsZW0gICAgICpsYXN0OworICAgIGludCAgICAgICAgICAgIG51bUVsZW07CisgICAgT01YX0hBTkRMRVRZUEUgcU11dGV4OworfSBTRUNfUVVFVUU7CisKKworI2lmZGVmIF9fY3BsdXNwbHVzCitleHRlcm4gIkMiIHsKKyNlbmRpZgorCitPTVhfRVJST1JUWVBFIFNFQ19PU0FMX1F1ZXVlQ3JlYXRlKFNFQ19RVUVVRSAqcXVldWVIYW5kbGUpOworT01YX0VSUk9SVFlQRSBTRUNfT1NBTF9RdWV1ZVRlcm1pbmF0ZShTRUNfUVVFVUUgKnF1ZXVlSGFuZGxlKTsKK2ludCAgICAgICAgICAgU0VDX09TQUxfUXVldWUoU0VDX1FVRVVFICpxdWV1ZUhhbmRsZSwgdm9pZCAqZGF0YSk7Cit2b2lkICAgICAgICAgKlNFQ19PU0FMX0RlcXVldWUoU0VDX1FVRVVFICpxdWV1ZUhhbmRsZSk7CitpbnQgICAgICAgICAgIFNFQ19PU0FMX0dldEVsZW1OdW0oU0VDX1FVRVVFICpxdWV1ZUhhbmRsZSk7CitpbnQgICAgICAgICAgIFNFQ19PU0FMX1NldEVsZW1OdW0oU0VDX1FVRVVFICpxdWV1ZUhhbmRsZSwgaW50IEVsZW1OdW0pOworCisjaWZkZWYgX19jcGx1c3BsdXMKK30KKyNlbmRpZgorCisjZW5kaWYKZGlmZiAtLWdpdCBhL2V4eW5vczQvbXVsdGltZWRpYS9vcGVubWF4L3NlY19vbXgvb3NhbC9TRUNfT1NBTF9TZW1hcGhvcmUuYyBiL2V4eW5vczQvbXVsdGltZWRpYS9vcGVubWF4L3NlY19vbXgvb3NhbC9TRUNfT1NBTF9TZW1hcGhvcmUuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iZTliOWNiCi0tLSAvZGV2L251bGwKKysrIGIvZXh5bm9zNC9tdWx0aW1lZGlhL29wZW5tYXgvc2VjX29teC9vc2FsL1NFQ19PU0FMX1NlbWFwaG9yZS5jCkBAIC0wLDAgKzEsMTM0IEBACisvKgorICoKKyAqIENvcHlyaWdodCAyMDEwIFNhbXN1bmcgRWxlY3Ryb25pY3MgUy5MU0kgQ28uIExURAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisvKgorICogQGZpbGUgICAgICAgIFNFQ19PU0FMX1NlbWFwaG9yZS5jCisgKiBAYnJpZWYKKyAqIEBhdXRob3IgICAgICBTZXVuZ0Jlb20gS2ltIChzYmNydXgua2ltQHNhbXN1bmcuY29tKQorICogQHZlcnNpb24gICAgIDEuMS4wCisgKiBAaGlzdG9yeQorICogICAyMDEwLjcuMTUgOiBDcmVhdGUKKyAqLworCisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlIDxzdGRsaWIuaD4KKyNpbmNsdWRlIDxzdHJpbmcuaD4KKyNpbmNsdWRlIDxwdGhyZWFkLmg+CisjaW5jbHVkZSA8c2VtYXBob3JlLmg+CisKKyNpbmNsdWRlICJTRUNfT1NBTF9NZW1vcnkuaCIKKyNpbmNsdWRlICJTRUNfT1NBTF9TZW1hcGhvcmUuaCIKKworI3VuZGVmIFNFQ19MT0dfVEFHCisjZGVmaW5lIFNFQ19MT0dfVEFHICAgICJTRUNfTE9HX1NFTUEiCisjZGVmaW5lIFNFQ19MT0dfT0ZGCisjaW5jbHVkZSAiU0VDX09TQUxfTG9nLmgiCisKKworT01YX0VSUk9SVFlQRSBTRUNfT1NBTF9TZW1hcGhvcmVDcmVhdGUoT01YX0hBTkRMRVRZUEUgKnNlbWFwaG9yZUhhbmRsZSkKK3sKKyAgICBzZW1fdCAqc2VtYTsKKworICAgIHNlbWEgPSAoc2VtX3QgKilTRUNfT1NBTF9NYWxsb2Moc2l6ZW9mKHNlbV90KSk7CisgICAgaWYgKCFzZW1hKQorICAgICAgICByZXR1cm4gT01YX0Vycm9ySW5zdWZmaWNpZW50UmVzb3VyY2VzOworCisgICAgaWYgKHNlbV9pbml0KHNlbWEsIDAsIDApICE9IDApIHsKKyAgICAgICAgU0VDX09TQUxfRnJlZShzZW1hKTsKKyAgICAgICAgcmV0dXJuIE9NWF9FcnJvclVuZGVmaW5lZDsKKyAgICB9CisKKyAgICAqc2VtYXBob3JlSGFuZGxlID0gKE9NWF9IQU5ETEVUWVBFKXNlbWE7CisgICAgcmV0dXJuIE9NWF9FcnJvck5vbmU7Cit9CisKK09NWF9FUlJPUlRZUEUgU0VDX09TQUxfU2VtYXBob3JlVGVybWluYXRlKE9NWF9IQU5ETEVUWVBFIHNlbWFwaG9yZUhhbmRsZSkKK3sKKyAgICBzZW1fdCAqc2VtYSA9IChzZW1fdCAqKXNlbWFwaG9yZUhhbmRsZTsKKworICAgIGlmIChzZW1hID09IE5VTEwpCisgICAgICAgIHJldHVybiBPTVhfRXJyb3JCYWRQYXJhbWV0ZXI7CisKKyAgICBpZiAoc2VtX2Rlc3Ryb3koc2VtYSkgIT0gMCkKKyAgICAgICAgcmV0dXJuIE9NWF9FcnJvclVuZGVmaW5lZDsKKworICAgIFNFQ19PU0FMX0ZyZWUoc2VtYSk7CisgICAgcmV0dXJuIE9NWF9FcnJvck5vbmU7Cit9CisKK09NWF9FUlJPUlRZUEUgU0VDX09TQUxfU2VtYXBob3JlV2FpdChPTVhfSEFORExFVFlQRSBzZW1hcGhvcmVIYW5kbGUpCit7CisgICAgc2VtX3QgKnNlbWEgPSAoc2VtX3QgKilzZW1hcGhvcmVIYW5kbGU7CisKKyAgICBGdW5jdGlvbkluKCk7CisKKyAgICBpZiAoc2VtYSA9PSBOVUxMKQorICAgICAgICByZXR1cm4gT01YX0Vycm9yQmFkUGFyYW1ldGVyOworCisgICAgaWYgKHNlbV93YWl0KHNlbWEpICE9IDApCisgICAgICAgIHJldHVybiBPTVhfRXJyb3JVbmRlZmluZWQ7CisKKyAgICBGdW5jdGlvbk91dCgpOworCisgICAgcmV0dXJuIE9NWF9FcnJvck5vbmU7Cit9CisKK09NWF9FUlJPUlRZUEUgU0VDX09TQUxfU2VtYXBob3JlUG9zdChPTVhfSEFORExFVFlQRSBzZW1hcGhvcmVIYW5kbGUpCit7CisgICAgc2VtX3QgKnNlbWEgPSAoc2VtX3QgKilzZW1hcGhvcmVIYW5kbGU7CisKKyAgICBGdW5jdGlvbkluKCk7CisKKyAgICBpZiAoc2VtYSA9PSBOVUxMKQorICAgICAgICByZXR1cm4gT01YX0Vycm9yQmFkUGFyYW1ldGVyOworCisgICAgaWYgKHNlbV9wb3N0KHNlbWEpICE9IDApCisgICAgICAgIHJldHVybiBPTVhfRXJyb3JVbmRlZmluZWQ7CisKKyAgICBGdW5jdGlvbk91dCgpOworCisgICAgcmV0dXJuIE9NWF9FcnJvck5vbmU7Cit9CisKK09NWF9FUlJPUlRZUEUgU0VDX09TQUxfU2V0X1NlbWFwaG9yZUNvdW50KE9NWF9IQU5ETEVUWVBFIHNlbWFwaG9yZUhhbmRsZSwgT01YX1MzMiB2YWwpCit7CisgICAgc2VtX3QgKnNlbWEgPSAoc2VtX3QgKilzZW1hcGhvcmVIYW5kbGU7CisKKyAgICBpZiAoc2VtYSA9PSBOVUxMKQorICAgICAgICByZXR1cm4gT01YX0Vycm9yQmFkUGFyYW1ldGVyOworCisgICAgaWYgKHNlbV9pbml0KHNlbWEsIDAsIHZhbCkgIT0gMCkKKyAgICAgICAgcmV0dXJuIE9NWF9FcnJvclVuZGVmaW5lZDsKKworICAgIHJldHVybiBPTVhfRXJyb3JOb25lOworfQorCitPTVhfRVJST1JUWVBFIFNFQ19PU0FMX0dldF9TZW1hcGhvcmVDb3VudChPTVhfSEFORExFVFlQRSBzZW1hcGhvcmVIYW5kbGUsIE9NWF9TMzIgKnZhbCkKK3sKKyAgICBzZW1fdCAqc2VtYSA9IChzZW1fdCAqKXNlbWFwaG9yZUhhbmRsZTsKKyAgICBpbnQgc2VtYVZhbCA9IDA7CisKKyAgICBpZiAoc2VtYSA9PSBOVUxMKQorICAgICAgICByZXR1cm4gT01YX0Vycm9yQmFkUGFyYW1ldGVyOworCisgICAgaWYgKHNlbV9nZXR2YWx1ZShzZW1hLCAmc2VtYVZhbCkgIT0gMCkKKyAgICAgICAgcmV0dXJuIE9NWF9FcnJvclVuZGVmaW5lZDsKKworICAgICp2YWwgPSAoT01YX1MzMilzZW1hVmFsOworCisgICAgcmV0dXJuIE9NWF9FcnJvck5vbmU7Cit9CmRpZmYgLS1naXQgYS9leHlub3M0L211bHRpbWVkaWEvb3Blbm1heC9zZWNfb214L29zYWwvU0VDX09TQUxfU2VtYXBob3JlLmggYi9leHlub3M0L211bHRpbWVkaWEvb3Blbm1heC9zZWNfb214L29zYWwvU0VDX09TQUxfU2VtYXBob3JlLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDMxY2JhNAotLS0gL2Rldi9udWxsCisrKyBiL2V4eW5vczQvbXVsdGltZWRpYS9vcGVubWF4L3NlY19vbXgvb3NhbC9TRUNfT1NBTF9TZW1hcGhvcmUuaApAQCAtMCwwICsxLDQ5IEBACisvKgorICoKKyAqIENvcHlyaWdodCAyMDEwIFNhbXN1bmcgRWxlY3Ryb25pY3MgUy5MU0kgQ28uIExURAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisvKgorICogQGZpbGUgICAgICAgIFNFQ19PU0FMX1NlbWFwaG9yZS5oCisgKiBAYnJpZWYKKyAqIEBhdXRob3IgICAgICBTZXVuZ0Jlb20gS2ltIChzYmNydXgua2ltQHNhbXN1bmcuY29tKQorICogQHZlcnNpb24gICAgIDEuMS4wCisgKiBAaGlzdG9yeQorICogICAyMDEwLjcuMTUgOiBDcmVhdGUKKyAqLworCisjaWZuZGVmIFNFQ19PU0FMX1NFTUFQSE9SRQorI2RlZmluZSBTRUNfT1NBTF9TRU1BUEhPUkUKKworI2luY2x1ZGUgIk9NWF9UeXBlcy5oIgorI2luY2x1ZGUgIk9NWF9Db3JlLmgiCisKKworI2lmZGVmIF9fY3BsdXNwbHVzCitleHRlcm4gIkMiIHsKKyNlbmRpZgorCitPTVhfRVJST1JUWVBFIFNFQ19PU0FMX1NlbWFwaG9yZUNyZWF0ZShPTVhfSEFORExFVFlQRSAqc2VtYXBob3JlSGFuZGxlKTsKK09NWF9FUlJPUlRZUEUgU0VDX09TQUxfU2VtYXBob3JlVGVybWluYXRlKE9NWF9IQU5ETEVUWVBFIHNlbWFwaG9yZUhhbmRsZSk7CitPTVhfRVJST1JUWVBFIFNFQ19PU0FMX1NlbWFwaG9yZVdhaXQoT01YX0hBTkRMRVRZUEUgc2VtYXBob3JlSGFuZGxlKTsKK09NWF9FUlJPUlRZUEUgU0VDX09TQUxfU2VtYXBob3JlUG9zdChPTVhfSEFORExFVFlQRSBzZW1hcGhvcmVIYW5kbGUpOworT01YX0VSUk9SVFlQRSBTRUNfT1NBTF9TZXRfU2VtYXBob3JlQ291bnQoT01YX0hBTkRMRVRZUEUgc2VtYXBob3JlSGFuZGxlLCBPTVhfUzMyIHZhbCk7CitPTVhfRVJST1JUWVBFIFNFQ19PU0FMX0dldF9TZW1hcGhvcmVDb3VudChPTVhfSEFORExFVFlQRSBzZW1hcGhvcmVIYW5kbGUsIE9NWF9TMzIgKnZhbCk7CisKKyNpZmRlZiBfX2NwbHVzcGx1cworfQorI2VuZGlmCisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvZXh5bm9zNC9tdWx0aW1lZGlhL29wZW5tYXgvc2VjX29teC9vc2FsL1NFQ19PU0FMX1RocmVhZC5jIGIvZXh5bm9zNC9tdWx0aW1lZGlhL29wZW5tYXgvc2VjX29teC9vc2FsL1NFQ19PU0FMX1RocmVhZC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjczMGI0YTkKLS0tIC9kZXYvbnVsbAorKysgYi9leHlub3M0L211bHRpbWVkaWEvb3Blbm1heC9zZWNfb214L29zYWwvU0VDX09TQUxfVGhyZWFkLmMKQEAgLTAsMCArMSwxNTggQEAKKy8qCisgKgorICogQ29weXJpZ2h0IDIwMTAgU2Ftc3VuZyBFbGVjdHJvbmljcyBTLkxTSSBDby4gTFRECisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKy8qCisgKiBAZmlsZSAgICAgICAgU0VDX09TQUxfVGhyZWFkLmMKKyAqIEBicmllZgorICogQGF1dGhvciAgICAgIFNldW5nQmVvbSBLaW0gKHNiY3J1eC5raW1Ac2Ftc3VuZy5jb20pCisgKiBAdmVyc2lvbiAgICAgMS4xLjAKKyAqIEBoaXN0b3J5CisgKiAgIDIwMTAuNy4xNSA6IENyZWF0ZQorICovCisKKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgPHN0ZGxpYi5oPgorI2luY2x1ZGUgPHN0cmluZy5oPgorI2luY2x1ZGUgPHB0aHJlYWQuaD4KKyNpbmNsdWRlIDxzZW1hcGhvcmUuaD4KKyNpbmNsdWRlIDxlcnJuby5oPgorI2luY2x1ZGUgPHRpbWUuaD4KKyNpbmNsdWRlIDx1bmlzdGQuaD4KKworI2luY2x1ZGUgIlNFQ19PU0FMX01lbW9yeS5oIgorI2luY2x1ZGUgIlNFQ19PU0FMX1RocmVhZC5oIgorCisjdW5kZWYgU0VDX0xPR19UQUcKKyNkZWZpbmUgU0VDX0xPR19UQUcgICAgIlNFQ19MT0dfVEhSRUFEIgorI2RlZmluZSBTRUNfTE9HX09GRgorI2luY2x1ZGUgIlNFQ19PU0FMX0xvZy5oIgorCisKK3R5cGVkZWYgc3RydWN0IF9TRUNfVEhSRUFEX0hBTkRMRV9UWVBFCit7CisgICAgcHRocmVhZF90ICAgICAgICAgIHB0aHJlYWQ7CisgICAgcHRocmVhZF9hdHRyX3QgICAgIGF0dHI7CisgICAgc3RydWN0IHNjaGVkX3BhcmFtIHNjaGVkcGFyYW07CisgICAgaW50ICAgICAgICAgICAgICAgIHN0YWNrX3NpemU7Cit9IFNFQ19USFJFQURfSEFORExFX1RZUEU7CisKKworT01YX0VSUk9SVFlQRSBTRUNfT1NBTF9UaHJlYWRDcmVhdGUoT01YX0hBTkRMRVRZUEUgKnRocmVhZEhhbmRsZSwgT01YX1BUUiBmdW5jdGlvbl9uYW1lLCBPTVhfUFRSIGFyZ3VtZW50KQoreworICAgIEZ1bmN0aW9uSW4oKTsKKworICAgIGludCByZXN1bHQgPSAwOworICAgIGludCBkZXRhY2hfcmV0ID0gMDsKKyAgICBTRUNfVEhSRUFEX0hBTkRMRV9UWVBFICp0aHJlYWQ7CisgICAgT01YX0VSUk9SVFlQRSByZXQgPSBPTVhfRXJyb3JOb25lOworCisgICAgdGhyZWFkID0gU0VDX09TQUxfTWFsbG9jKHNpemVvZihTRUNfVEhSRUFEX0hBTkRMRV9UWVBFKSk7CisgICAgU0VDX09TQUxfTWVtc2V0KHRocmVhZCwgMCwgc2l6ZW9mKFNFQ19USFJFQURfSEFORExFX1RZUEUpKTsKKworICAgIHB0aHJlYWRfYXR0cl9pbml0KCZ0aHJlYWQtPmF0dHIpOworICAgIGlmICh0aHJlYWQtPnN0YWNrX3NpemUgIT0gMCkKKyAgICAgICAgcHRocmVhZF9hdHRyX3NldHN0YWNrc2l6ZSgmdGhyZWFkLT5hdHRyLCB0aHJlYWQtPnN0YWNrX3NpemUpOworCisgICAgLyogc2V0IHByaW9yaXR5ICovCisgICAgaWYgKHRocmVhZC0+c2NoZWRwYXJhbS5zY2hlZF9wcmlvcml0eSAhPSAwKQorICAgICAgICBwdGhyZWFkX2F0dHJfc2V0c2NoZWRwYXJhbSgmdGhyZWFkLT5hdHRyLCAmdGhyZWFkLT5zY2hlZHBhcmFtKTsKKworICAgIGRldGFjaF9yZXQgPSBwdGhyZWFkX2F0dHJfc2V0ZGV0YWNoc3RhdGUoJnRocmVhZC0+YXR0ciwgUFRIUkVBRF9DUkVBVEVfSk9JTkFCTEUpOworICAgIGlmIChkZXRhY2hfcmV0ICE9IDApIHsKKyAgICAgICAgU0VDX09TQUxfRnJlZSh0aHJlYWQpOworICAgICAgICAqdGhyZWFkSGFuZGxlID0gTlVMTDsKKyAgICAgICAgcmV0ID0gT01YX0Vycm9yVW5kZWZpbmVkOworICAgICAgICBnb3RvIEVYSVQ7CisgICAgfQorCisgICAgcmVzdWx0ID0gcHRocmVhZF9jcmVhdGUoJnRocmVhZC0+cHRocmVhZCwgJnRocmVhZC0+YXR0ciwgZnVuY3Rpb25fbmFtZSwgKHZvaWQgKilhcmd1bWVudCk7CisgICAgLyogcHRocmVhZF9zZXRzY2hlZHBhcmFtKHRocmVhZC0+cHRocmVhZCwgU0NIRURfUlIsICZ0aHJlYWQtPnNjaGVkcGFyYW0pOyAqLworCisgICAgc3dpdGNoIChyZXN1bHQpIHsKKyAgICBjYXNlIDA6CisgICAgICAgICp0aHJlYWRIYW5kbGUgPSAoT01YX0hBTkRMRVRZUEUpdGhyZWFkOworICAgICAgICByZXQgPSBPTVhfRXJyb3JOb25lOworICAgICAgICBicmVhazsKKyAgICBjYXNlIEVBR0FJTjoKKyAgICAgICAgU0VDX09TQUxfRnJlZSh0aHJlYWQpOworICAgICAgICAqdGhyZWFkSGFuZGxlID0gTlVMTDsKKyAgICAgICAgcmV0ID0gT01YX0Vycm9ySW5zdWZmaWNpZW50UmVzb3VyY2VzOworICAgICAgICBicmVhazsKKyAgICBkZWZhdWx0OgorICAgICAgICBTRUNfT1NBTF9GcmVlKHRocmVhZCk7CisgICAgICAgICp0aHJlYWRIYW5kbGUgPSBOVUxMOworICAgICAgICByZXQgPSBPTVhfRXJyb3JVbmRlZmluZWQ7CisgICAgICAgIGJyZWFrOworICAgIH0KKworRVhJVDoKKyAgICBGdW5jdGlvbk91dCgpOworCisgICAgcmV0dXJuIHJldDsKK30KKworT01YX0VSUk9SVFlQRSBTRUNfT1NBTF9UaHJlYWRUZXJtaW5hdGUoT01YX0hBTkRMRVRZUEUgdGhyZWFkSGFuZGxlKQoreworICAgIEZ1bmN0aW9uSW4oKTsKKworICAgIE9NWF9FUlJPUlRZUEUgcmV0ID0gT01YX0Vycm9yTm9uZTsKKyAgICBTRUNfVEhSRUFEX0hBTkRMRV9UWVBFICp0aHJlYWQgPSAoU0VDX1RIUkVBRF9IQU5ETEVfVFlQRSAqKXRocmVhZEhhbmRsZTsKKworICAgIGlmICghdGhyZWFkKSB7CisgICAgICAgIHJldCA9IE9NWF9FcnJvckJhZFBhcmFtZXRlcjsKKyAgICAgICAgZ290byBFWElUOworICAgIH0KKyAgICBpZiAocHRocmVhZF9qb2luKHRocmVhZC0+cHRocmVhZCwgTlVMTCkgIT0gMCkgeworICAgICAgICByZXQgPSBPTVhfRXJyb3JVbmRlZmluZWQ7CisgICAgICAgIGdvdG8gRVhJVDsKKyAgICB9CisKKyAgICBTRUNfT1NBTF9GcmVlKHRocmVhZCk7CisgICAgcmV0ID0gT01YX0Vycm9yTm9uZTsKKworRVhJVDoKKyAgICBGdW5jdGlvbk91dCgpOworCisgICAgcmV0dXJuIHJldDsKK30KKworT01YX0VSUk9SVFlQRSBTRUNfT1NBTF9UaHJlYWRDYW5jZWwoT01YX0hBTkRMRVRZUEUgdGhyZWFkSGFuZGxlKQoreworICAgIFNFQ19USFJFQURfSEFORExFX1RZUEUgKnRocmVhZCA9IChTRUNfVEhSRUFEX0hBTkRMRV9UWVBFICopdGhyZWFkSGFuZGxlOworCisgICAgaWYgKCF0aHJlYWQpCisgICAgICAgIHJldHVybiBPTVhfRXJyb3JCYWRQYXJhbWV0ZXI7CisKKyAgICAvKiB0aHJlYWRfY2FuY2VsKHRocmVhZC0+cHRocmVhZCk7ICovCisgICAgcHRocmVhZF9leGl0KCZ0aHJlYWQtPnB0aHJlYWQpOworICAgIHB0aHJlYWRfam9pbih0aHJlYWQtPnB0aHJlYWQsIE5VTEwpOworCisgICAgU0VDX09TQUxfRnJlZSh0aHJlYWQpOworICAgIHJldHVybiBPTVhfRXJyb3JOb25lOworfQorCit2b2lkIFNFQ19PU0FMX1RocmVhZEV4aXQodm9pZCAqdmFsdWVfcHRyKQoreworICAgIHB0aHJlYWRfZXhpdCh2YWx1ZV9wdHIpOworICAgIHJldHVybjsKK30KKwordm9pZCBTRUNfT1NBTF9TbGVlcE1pbGxpc2VjKE9NWF9VMzIgbXMpCit7CisgICAgdXNsZWVwKG1zICogMTAwMCk7CisgICAgcmV0dXJuOworfQpkaWZmIC0tZ2l0IGEvZXh5bm9zNC9tdWx0aW1lZGlhL29wZW5tYXgvc2VjX29teC9vc2FsL1NFQ19PU0FMX1RocmVhZC5oIGIvZXh5bm9zNC9tdWx0aW1lZGlhL29wZW5tYXgvc2VjX29teC9vc2FsL1NFQ19PU0FMX1RocmVhZC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmNlMTI2MmQKLS0tIC9kZXYvbnVsbAorKysgYi9leHlub3M0L211bHRpbWVkaWEvb3Blbm1heC9zZWNfb214L29zYWwvU0VDX09TQUxfVGhyZWFkLmgKQEAgLTAsMCArMSw0OCBAQAorLyoKKyAqCisgKiBDb3B5cmlnaHQgMjAxMCBTYW1zdW5nIEVsZWN0cm9uaWNzIFMuTFNJIENvLiBMVEQKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworLyoKKyAqIEBmaWxlICAgICAgICBTRUNfT1NBTF9UaHJlYWQuaAorICogQGJyaWVmCisgKiBAYXV0aG9yICAgICAgU2V1bmdCZW9tIEtpbSAoc2JjcnV4LmtpbUBzYW1zdW5nLmNvbSkKKyAqIEB2ZXJzaW9uICAgICAxLjEuMAorICogQGhpc3RvcnkKKyAqICAgMjAxMC43LjE1IDogQ3JlYXRlCisgKi8KKworI2lmbmRlZiBTRUNfT1NBTF9USFJFQUQKKyNkZWZpbmUgU0VDX09TQUxfVEhSRUFECisKKyNpbmNsdWRlICJPTVhfVHlwZXMuaCIKKyNpbmNsdWRlICJPTVhfQ29yZS5oIgorCisKKyNpZmRlZiBfX2NwbHVzcGx1cworZXh0ZXJuICJDIiB7CisjZW5kaWYKKworT01YX0VSUk9SVFlQRSBTRUNfT1NBTF9UaHJlYWRDcmVhdGUoT01YX0hBTkRMRVRZUEUgKnRocmVhZEhhbmRsZSwgT01YX1BUUiBmdW5jdGlvbl9uYW1lLCBPTVhfUFRSIGFyZ3VtZW50KTsKK09NWF9FUlJPUlRZUEUgU0VDX09TQUxfVGhyZWFkVGVybWluYXRlKE9NWF9IQU5ETEVUWVBFIHRocmVhZEhhbmRsZSk7CitPTVhfRVJST1JUWVBFIFNFQ19PU0FMX1RocmVhZENhbmNlbChPTVhfSEFORExFVFlQRSB0aHJlYWRIYW5kbGUpOwordm9pZCAgICAgICAgICBTRUNfT1NBTF9UaHJlYWRFeGl0KHZvaWQgKnZhbHVlX3B0cik7Cit2b2lkICAgICAgICAgIFNFQ19PU0FMX1NsZWVwTWlsbGlzZWMoT01YX1UzMiBtcyk7CisKKyNpZmRlZiBfX2NwbHVzcGx1cworfQorI2VuZGlmCisKKyNlbmRpZgo=